2024-04-25 00:27:13 -04:00
-- Copyright (c) 2024 - Ognjen 'xolatile' Milan Robovic
--
-- GNU General Public Licence (version 3 or later)
2024-03-22 00:37:54 -04:00
pragma ada_2012 ;
2024-02-15 21:03:09 -05:00
2024-05-11 03:38:33 -04:00
--~with core, ui, effect, attribute, skill, resource, faction, might, magic, equipment, unit, construction, chad, deity, world, ai;
2024-05-15 06:38:53 -04:00
with core , ui , effect , attribute , skill , resource , faction , deity , material , magic , equipment , unit , construction , chad , world ;
2024-02-15 21:03:09 -05:00
2024-05-12 20:45:26 -04:00
with ada.strings.unbounded ;
use ada.strings.unbounded ;
2024-05-23 07:30:44 -04:00
use type core . point ;
use type core . signal_code ;
use type core . cursor_code ;
2024-05-13 09:20:16 -04:00
2024-02-15 21:03:09 -05:00
procedure main is
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2024-05-01 15:19:12 -04:00
side_panel : integer := 0 ;
2024-04-27 03:49:02 -04:00
preview_width : integer := 0 ;
preview_height : integer := 0 ;
2024-05-01 15:19:12 -04:00
text_box_height : integer := 0 ;
2024-02-18 09:02:33 -05:00
2024-05-19 13:29:28 -04:00
player : chad . value := (
2024-05-16 12:35:36 -04:00
index => chad . ada ,
2024-05-16 14:52:41 -04:00
state => core . idle ,
2024-05-19 13:29:28 -04:00
x => 0 ,
y => 0 ,
2024-05-16 12:35:36 -04:00
health => ( 30 , 40 ) ,
mana => ( 20 , 30 ) ,
stamina => ( 10 , 20 ) ,
2024-05-23 03:34:45 -04:00
attributes => attribute . default ,
2024-05-23 04:44:43 -04:00
skills => skill . default ,
2024-05-23 02:58:30 -04:00
resources => ( ( 101 , 240 ) , ( 103 , 240 ) , ( 107 , 240 ) , ( 109 , 240 ) , ( 113 , 240 ) , ( 127 , 240 ) ) ,
2024-05-17 18:35:31 -04:00
equipments => ( equipment . chest => equipment . elven_armour ,
2024-05-23 02:58:30 -04:00
equipment . head => equipment . elven_helmet ,
2024-05-17 18:35:31 -04:00
equipment . hands => equipment . leather_gauntlets ,
equipment . feet => equipment . leather_greaves ,
equipment . main_hand => equipment . jade_sword ,
others => equipment . none ) ,
item_count => 0 ,
items => ( others => equipment . none )
2024-05-11 00:28:50 -04:00
) ;
2024-02-22 06:51:01 -05:00
2024-03-16 08:08:50 -04:00
------------------------------------------------------------------------------------------
2024-05-04 07:22:16 -04:00
type view is (
2024-05-03 06:10:13 -04:00
map_preview_panel , status_preview_panel , text_box_panel
) ;
2024-05-23 07:30:44 -04:00
view_icon : array ( view ) of core . sprite := ( others => ( others => 0 ) ) ;
2024-05-08 16:45:08 -04:00
view_list : array ( view ) of boolean := ( others => true ) ;
2024-05-23 07:30:44 -04:00
view_text : array ( view ) of core . long_string := (
2024-05-03 06:10:13 -04:00
"Toggle map preview panel. " ,
"Toggle status preview panel. " ,
"Toggle text box panel. "
) ;
2024-05-08 16:45:08 -04:00
procedure swap_map_preview_panel is begin view_list ( map_preview_panel ) := not view_list ( map_preview_panel ) ; end swap_map_preview_panel ;
procedure swap_status_preview_panel is begin view_list ( status_preview_panel ) := not view_list ( status_preview_panel ) ; end swap_status_preview_panel ;
procedure swap_text_box_panel is begin view_list ( text_box_panel ) := not view_list ( text_box_panel ) ; end swap_text_box_panel ;
2024-05-03 06:10:13 -04:00
2024-05-04 07:22:16 -04:00
view_show : array ( view ) of access procedure := (
swap_map_preview_panel ' access ,
swap_status_preview_panel ' access ,
swap_text_box_panel ' access
2024-05-03 06:10:13 -04:00
) ;
2024-05-23 07:30:44 -04:00
game_title : core . sprite ;
game_preview : array ( world . biome ) of core . sprite ;
2024-05-09 09:11:26 -04:00
2024-05-10 23:44:09 -04:00
switch : natural := 0 ;
2024-05-11 00:28:50 -04:00
choose : world . biome := world . grass ;
2024-05-03 06:10:13 -04:00
------------------------------------------------------------------------------------------
2024-05-08 16:45:08 -04:00
procedure check_move_camera_up is
2024-05-06 13:59:08 -04:00
begin
2024-05-23 07:30:44 -04:00
core . decrement ( world . map . chads ( 1 ) . y ) ;
world . map . chads ( 1 ) . y := core . clip ( world . map . chads ( 1 ) . y , 0 , world . map . height - 1 ) ;
2024-05-19 13:29:28 -04:00
if world . map . clips ( world . map . chads ( 1 ) . x , world . map . chads ( 1 ) . y ) then
2024-05-23 07:30:44 -04:00
core . increment ( world . map . chads ( 1 ) . y ) ;
2024-05-06 13:59:08 -04:00
end if ;
2024-05-08 16:45:08 -04:00
end check_move_camera_up ;
2024-05-06 13:59:08 -04:00
2024-05-08 16:45:08 -04:00
procedure check_move_camera_down is
2024-05-06 13:59:08 -04:00
begin
2024-05-23 07:30:44 -04:00
core . increment ( world . map . chads ( 1 ) . y ) ;
world . map . chads ( 1 ) . y := core . clip ( world . map . chads ( 1 ) . y , 0 , world . map . height - 1 ) ;
2024-05-19 13:29:28 -04:00
if world . map . clips ( world . map . chads ( 1 ) . x , world . map . chads ( 1 ) . y ) then
2024-05-23 07:30:44 -04:00
core . decrement ( world . map . chads ( 1 ) . y ) ;
2024-05-06 13:59:08 -04:00
end if ;
2024-05-08 16:45:08 -04:00
end check_move_camera_down ;
2024-05-06 13:59:08 -04:00
2024-05-08 16:45:08 -04:00
procedure check_move_camera_left is
2024-05-06 13:59:08 -04:00
begin
2024-05-23 07:30:44 -04:00
core . decrement ( world . map . chads ( 1 ) . x ) ;
world . map . chads ( 1 ) . x := core . clip ( world . map . chads ( 1 ) . x , 0 , world . map . width - 1 ) ;
2024-05-19 13:29:28 -04:00
if world . map . clips ( world . map . chads ( 1 ) . x , world . map . chads ( 1 ) . y ) then
2024-05-23 07:30:44 -04:00
core . increment ( world . map . chads ( 1 ) . x ) ;
2024-05-06 13:59:08 -04:00
end if ;
2024-05-08 16:45:08 -04:00
end check_move_camera_left ;
2024-05-06 13:59:08 -04:00
2024-05-08 16:45:08 -04:00
procedure check_move_camera_right is
2024-05-06 13:59:08 -04:00
begin
2024-05-23 07:30:44 -04:00
core . increment ( world . map . chads ( 1 ) . x ) ;
world . map . chads ( 1 ) . x := core . clip ( world . map . chads ( 1 ) . x , 0 , world . map . width - 1 ) ;
2024-05-19 13:29:28 -04:00
if world . map . clips ( world . map . chads ( 1 ) . x , world . map . chads ( 1 ) . y ) then
2024-05-23 07:30:44 -04:00
core . decrement ( world . map . chads ( 1 ) . x ) ;
2024-05-06 13:59:08 -04:00
end if ;
2024-05-08 16:45:08 -04:00
end check_move_camera_right ;
2024-05-06 13:59:08 -04:00
2024-05-04 07:22:16 -04:00
procedure ui_main_style is
begin
2024-05-10 22:09:30 -04:00
ui . active := ui . style ' val ( ( ui . style ' pos ( ui . active ) + 1 ) mod ui . style_count ) ;
2024-05-04 07:22:16 -04:00
end ui_main_style ;
2024-03-16 08:08:50 -04:00
2024-05-23 07:30:44 -04:00
procedure zoom_in is begin core . zoom := 2 ; end zoom_in ;
procedure zoom_out is begin core . zoom := 1 ; end zoom_out ;
signal_list : constant array ( core . signal_code ) of access procedure := (
core . signal_up => check_move_camera_up ' access ,
core . signal_down => check_move_camera_down ' access ,
core . signal_left => check_move_camera_left ' access ,
core . signal_right => check_move_camera_right ' access ,
core . signal_v => ui_main_style ' access ,
core . signal_kp_add => zoom_in ' access ,
core . signal_kp_subtract => zoom_out ' access ,
core . signal_f1 => world . resource_cheat_1 ' access ,
core . signal_f2 => world . resource_cheat_2 ' access ,
core . signal_f3 => world . resource_cheat_3 ' access ,
core . signal_f4 => world . resource_cheat_4 ' access ,
core . signal_f5 => world . resource_cheat_5 ' access ,
core . signal_f6 => world . resource_cheat_6 ' access ,
core . signal_f7 => world . reveal_map ' access ,
core . signal_f => core . toggle_fullscreen ' access ,
others => core . idle_skip ' access
2024-03-16 06:52:32 -04:00
) ;
2024-03-16 06:14:28 -04:00
2024-05-08 16:17:47 -04:00
------------------------------------------------------------------------------------------
2024-05-09 11:03:39 -04:00
procedure main_menu is
begin
2024-05-23 07:30:44 -04:00
core . draw ( game_preview ( world . ash ) , core . center_x ( game_preview ( world . ash ) . width * 2 ) , core . center_y ( game_preview ( world . ash ) . height * 2 ) , factor => 2 ) ;
core . draw ( game_title , core . center_x ( game_title . width * 2 ) , core . center_y ( game_title . height * 2 ) , factor => 2 ) ;
2024-05-09 11:03:39 -04:00
--
2024-05-10 22:09:30 -04:00
ui . write ( "Main Menu" , 0 , 0 ) ;
2024-05-09 11:28:40 -04:00
--
2024-05-09 12:52:23 -04:00
ui . draw_check_box ( 0 , 32 , view_list ( map_preview_panel ) , "map_preview_panel" ) ;
ui . draw_check_box ( 0 , 64 , view_list ( status_preview_panel ) , "status_preview_panel" ) ;
ui . draw_check_box ( 0 , 96 , view_list ( text_box_panel ) , "text_box_panel" ) ;
2024-05-09 11:03:39 -04:00
end main_menu ;
2024-05-13 09:20:16 -04:00
view_source_code : natural := 25 ;
source_code : array ( 0 . . 35 ) of unbounded_string := (
2024-05-23 07:30:44 -04:00
to_unbounded_string ( core . folder & "/source/ai.adb" ) ,
to_unbounded_string ( core . folder & "/source/ai.ads" ) ,
to_unbounded_string ( core . folder & "/source/attribute.adb" ) ,
to_unbounded_string ( core . folder & "/source/attribute.ads" ) ,
to_unbounded_string ( core . folder & "/source/chad.adb" ) ,
to_unbounded_string ( core . folder & "/source/chad.ads" ) ,
to_unbounded_string ( core . folder & "/source/construction.adb" ) ,
to_unbounded_string ( core . folder & "/source/construction.ads" ) ,
to_unbounded_string ( core . folder & "/source/core.adb" ) ,
to_unbounded_string ( core . folder & "/source/core.ads" ) ,
to_unbounded_string ( core . folder & "/source/deity.adb" ) ,
to_unbounded_string ( core . folder & "/source/deity.ads" ) ,
to_unbounded_string ( core . folder & "/source/effect.adb" ) ,
to_unbounded_string ( core . folder & "/source/effect.ads" ) ,
to_unbounded_string ( core . folder & "/source/equipment.adb" ) ,
to_unbounded_string ( core . folder & "/source/equipment.ads" ) ,
to_unbounded_string ( core . folder & "/source/faction.adb" ) ,
to_unbounded_string ( core . folder & "/source/faction.ads" ) ,
to_unbounded_string ( core . folder & "/source/magic.adb" ) ,
to_unbounded_string ( core . folder & "/source/magic.ads" ) ,
to_unbounded_string ( core . folder & "/source/main.adb" ) ,
to_unbounded_string ( core . folder & "/source/material.adb" ) ,
to_unbounded_string ( core . folder & "/source/material.ads" ) ,
to_unbounded_string ( core . folder & "/source/might.adb" ) ,
to_unbounded_string ( core . folder & "/source/might.ads" ) ,
to_unbounded_string ( core . folder & "/source/ray.ads" ) ,
to_unbounded_string ( core . folder & "/source/resource.adb" ) ,
to_unbounded_string ( core . folder & "/source/resource.ads" ) ,
to_unbounded_string ( core . folder & "/source/skill.adb" ) ,
to_unbounded_string ( core . folder & "/source/skill.ads" ) ,
to_unbounded_string ( core . folder & "/source/ui.adb" ) ,
to_unbounded_string ( core . folder & "/source/ui.ads" ) ,
to_unbounded_string ( core . folder & "/source/unit.adb" ) ,
to_unbounded_string ( core . folder & "/source/unit.ads" ) ,
to_unbounded_string ( core . folder & "/source/world.adb" ) ,
to_unbounded_string ( core . folder & "/source/world.ads" )
2024-05-13 09:20:16 -04:00
) ;
2024-05-12 20:45:26 -04:00
2024-02-24 14:51:53 -05:00
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2024-02-15 21:03:09 -05:00
2024-02-24 14:51:53 -05:00
begin
2024-02-22 06:16:09 -05:00
2024-05-23 07:30:44 -04:00
core . dash ;
core . echo ( core . comment , "Copyright (C) 2024 -- Ognjen 'xolatile' Milan Robovic" ) ;
core . echo ( core . comment , "Version -- 1.0.0" ) ;
core . echo ( core . comment , "License -- GNU/GPLv3+" ) ;
core . echo ( core . comment , "Xhads is free software, you can redistribute it and modify it under the terms of the GNU General Public License by Free Software Foundation." ) ;
core . dash ;
2024-03-11 08:42:25 -04:00
2024-05-23 07:30:44 -04:00
core . initialize ;
2024-03-17 15:15:18 -04:00
2024-05-10 22:09:30 -04:00
ui . active := ui . main ;
2024-02-15 21:03:09 -05:00
ui . configure ;
2024-03-11 14:37:26 -04:00
2024-05-23 07:30:44 -04:00
--~core.play (core.import_song (core.c_string (core.folder & "/song/main_menu.ogg")).index);
2024-03-11 14:37:26 -04:00
2024-03-17 17:52:59 -04:00
attribute . configure ;
skill . configure ;
resource . configure ;
2024-04-26 16:28:01 -04:00
--~might.configure;
2024-05-13 15:43:06 -04:00
magic . configure ;
2024-05-12 20:15:36 -04:00
material . configure ;
2024-05-11 03:38:33 -04:00
equipment . configure ;
2024-04-25 03:46:07 -04:00
unit . configure ;
2024-05-15 06:38:53 -04:00
deity . configure ;
2024-04-25 03:46:07 -04:00
construction . configure ;
2024-04-25 00:27:13 -04:00
chad . configure ;
2024-04-25 03:46:07 -04:00
world . configure ;
2024-05-08 15:43:44 -04:00
--~ai.configure;
2024-03-17 17:52:59 -04:00
2024-05-19 15:06:20 -04:00
world . make ( world . swamp , 240 , 180 , 8 ) ;
2024-05-19 13:29:28 -04:00
world . add_chad ( player ) ;
2024-05-17 18:35:31 -04:00
2024-05-23 07:30:44 -04:00
core . dash ;
core . echo ( core . success , "Successfully initialized game data, entering main gameplay loop." ) ;
core . dash ;
2024-03-11 08:42:25 -04:00
2024-05-04 07:22:16 -04:00
for index in view loop
2024-05-23 07:30:44 -04:00
view_icon ( index ) := core . import_sprite ( core . folder & "/icon/engine/" & core . lowercase ( view ' image ( index ) ) & ".png" , 1 , 1 ) ;
2024-05-03 06:10:13 -04:00
end loop ;
2024-05-23 07:30:44 -04:00
game_title := core . import_sprite ( core . folder & "/ui/game_title.png" , 1 , 1 ) ;
2024-05-03 07:55:17 -04:00
2024-05-10 22:09:30 -04:00
for index in world . biome loop
2024-05-23 07:30:44 -04:00
game_preview ( index ) := core . import_sprite ( core . folder & "/ui/preview/" & core . lowercase ( world . biome ' image ( index ) ) & "land.png" , 1 , 1 ) ;
2024-05-10 22:09:30 -04:00
end loop ;
2024-05-09 09:11:26 -04:00
2024-03-16 08:08:50 -04:00
------------------------------------------------------------------------------------------
2024-05-08 16:17:47 -04:00
introduction_loop : loop
2024-05-23 07:30:44 -04:00
core . synchronize ;
2024-02-15 21:03:09 -05:00
--
2024-05-23 07:30:44 -04:00
exit when core . signal_mode = core . signal_space or core . cursor_mode = core . cursor_right ;
2024-03-16 08:08:50 -04:00
--
2024-05-23 07:30:44 -04:00
case core . signal_mode is
when core . signal_none => null ;
when core . signal_space => null ;
when others => switch := ( switch + 1 ) mod world . biome_count ;
choose := world . biome ' val ( switch ) ;
2024-05-10 23:44:09 -04:00
end case ;
--
2024-05-23 07:30:44 -04:00
core . draw ( game_preview ( choose ) , core . center_x ( game_preview ( choose ) . width * 2 ) , core . center_y ( game_preview ( choose ) . height * 2 ) , factor => 2 ) ;
core . draw ( game_title , core . center_x ( game_title . width * 2 ) , core . center_y ( game_title . height * 2 ) , factor => 2 ) ;
2024-05-10 23:44:09 -04:00
--
2024-05-23 07:30:44 -04:00
ui . write ( "[-- Press Spacebar or RMB to continue]" , 0 , core . center_y ( 24 ) , ( 102 , 102 , 102 , 255 ) ) ;
2024-05-08 16:17:47 -04:00
end loop introduction_loop ;
2024-05-23 07:30:44 -04:00
core . cursor_mode := core . cursor_none ;
2024-05-11 03:20:04 -04:00
2024-05-09 11:03:39 -04:00
main_menu_loop : loop
2024-05-23 07:30:44 -04:00
core . synchronize ;
2024-05-09 11:03:39 -04:00
--
2024-05-23 07:30:44 -04:00
exit when core . signal_mode = core . signal_space or core . cursor_mode = core . cursor_right ;
2024-05-13 04:03:27 -04:00
--
2024-05-23 07:30:44 -04:00
declare source_code_data : core . string_box_data ;
2024-05-13 09:20:16 -04:00
begin
2024-05-23 07:30:44 -04:00
core . import_text ( source_code_data , to_string ( source_code ( view_source_code ) ) ) ;
2024-05-19 15:06:20 -04:00
--
2024-05-23 07:30:44 -04:00
if core . cursor_mode = core . cursor_left then
2024-05-19 15:06:20 -04:00
view_source_code := ( view_source_code + 1 ) mod 36 ;
2024-05-23 07:30:44 -04:00
core . cursor_mode := core . cursor_none ;
core . wheel := 0.0 ;
2024-05-19 15:06:20 -04:00
end if ;
--
2024-05-23 07:30:44 -04:00
ui . write_ada_code ( source_code_data , 0 , integer ( core . wheel ) * 30 ) ;
2024-05-13 09:20:16 -04:00
end ;
2024-05-09 11:03:39 -04:00
end loop main_menu_loop ;
2024-05-23 07:30:44 -04:00
core . cursor_mode := core . cursor_none ;
2024-05-11 03:20:04 -04:00
2024-05-11 00:28:50 -04:00
ui . active := ui . style ' val ( faction . enumeration ' pos ( chad . trait ( player . index ) . kind ) + 1 ) ;
2024-05-08 16:17:47 -04:00
gameplay_loop : loop
2024-05-23 07:30:44 -04:00
core . synchronize ;
2024-03-24 09:14:54 -04:00
--
2024-05-23 07:30:44 -04:00
exit when core . engine_active = false ;
2024-05-01 14:41:55 -04:00
--
2024-05-11 03:03:28 -04:00
if not view_list ( status_preview_panel ) then
side_panel := 0 ;
else
2024-05-16 14:52:41 -04:00
side_panel := 376 + 2 * 32 ;
2024-05-11 03:03:28 -04:00
end if ;
--
2024-05-23 07:30:44 -04:00
preview_width := core . window_width - side_panel ;
preview_height := core . window_height - text_box_height ;
2024-05-11 03:03:28 -04:00
text_box_height := 32 ;
--
world . draw ;
--
if view_list ( map_preview_panel ) then
ui . draw_menu ( 0 , 0 , preview_width , preview_height ) ;
end if ;
--
if view_list ( status_preview_panel ) then
2024-05-16 12:35:36 -04:00
ui . draw_tiny_menu ( preview_width , 0 , side_panel , preview_height ) ;
2024-05-19 13:29:28 -04:00
chad . draw_data ( world . map . chads ( 1 ) , preview_width + 32 , 32 ) ;
2024-05-11 03:03:28 -04:00
--~ui.draw_state_box (preview_width + 32, 32);
end if ;
--
if view_list ( text_box_panel ) then
2024-05-23 07:30:44 -04:00
ui . draw_help_box ( 0 , core . window_height - text_box_height , core . window_width - core . icon * ( view ' pos ( view ' last ) + 1 ) , text_box_height ) ;
2024-05-11 03:03:28 -04:00
end if ;
--
for index in view loop
ui . draw_icon ( view_icon ( index ) , view_text ( index ) ,
2024-05-23 07:30:44 -04:00
core . window_width - core . icon * ( view ' pos ( view ' last ) + 1 ) + core . icon * view ' pos ( index ) ,
core . window_height - text_box_height ,
2024-05-11 03:03:28 -04:00
view_show ( index ) ) ;
end loop ;
--
2024-05-23 07:30:44 -04:00
resource . draw_points ( world . map . chads ( 1 ) . resources , ( preview_width - 5 * core . icon * resource . count ) / 2 , ( if view_list ( map_preview_panel ) then core . icon else 0 ) ) ;
2024-05-11 03:03:28 -04:00
--
2024-05-23 07:30:44 -04:00
signal_list ( core . signal_mode ) . all ;
2024-05-11 03:03:28 -04:00
--
2024-05-16 14:52:41 -04:00
--~magic.menu (0, 0, true);
2024-05-11 03:03:28 -04:00
--~might.menu (0, 0, true);
--
2024-05-16 14:52:41 -04:00
--~chad.draw_alice;
--
2024-05-16 10:13:08 -04:00
--~deity.draw (deity.AEZORA, 300, 300);
--~deity.draw (deity.ULDRAE, 500, 300);
2024-05-11 03:03:28 -04:00
--
2024-05-23 07:30:44 -04:00
ui . write ( core . framerate ' image , core . window_width - 5 * core . icon + 3 , core . window_height - 27 ) ;
2024-05-11 05:13:45 -04:00
--
2024-05-23 07:30:44 -04:00
core . camera . x := world . map . chads ( 1 ) . x ;
core . camera . y := world . map . chads ( 1 ) . y ;
2024-05-19 13:29:28 -04:00
--
2024-05-11 03:03:28 -04:00
ui . synchronize ;
2024-05-08 16:17:47 -04:00
end loop gameplay_loop ;
2024-02-15 21:03:09 -05:00
2024-05-23 08:03:38 -04:00
world . save ( "heyo" ) ;
2024-05-23 08:29:21 -04:00
core . save ( "test.a" , null , 0 ) ;
2024-05-23 03:34:45 -04:00
--~world.mapshot (folder & "/mapshot.png");
2024-05-09 14:52:19 -04:00
2024-03-16 08:08:50 -04:00
------------------------------------------------------------------------------------------
2024-02-16 09:59:19 -05:00
2024-05-23 07:30:44 -04:00
core . deinitialize ;
2024-03-17 15:15:18 -04:00
2024-05-23 07:30:44 -04:00
core . dash ;
2024-03-21 19:03:15 -04:00
2024-02-15 21:03:09 -05:00
end main ;