From b35a1d0c85e9c0849659affe1e78be41229f214b Mon Sep 17 00:00:00 2001 From: xolatile Date: Wed, 11 Oct 2023 12:39:17 -0400 Subject: [PATCH] General reimplementation and simplification... --- xabina.adb | 201 +++++++++++++++++-------------------------------------------- 1 file changed, 56 insertions(+), 145 deletions(-) diff --git a/xabina.adb b/xabina.adb index 3792573..4433e8c 100644 --- a/xabina.adb +++ b/xabina.adb @@ -23,60 +23,6 @@ function xabina return integer is -- System ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - SIGNAL_A : constant character := 'a'; - SIGNAL_B : constant character := 'b'; - SIGNAL_C : constant character := 'c'; - SIGNAL_D : constant character := 'd'; - SIGNAL_E : constant character := 'e'; - SIGNAL_F : constant character := 'f'; - SIGNAL_G : constant character := 'g'; - SIGNAL_H : constant character := 'h'; - SIGNAL_I : constant character := 'i'; - SIGNAL_J : constant character := 'j'; - SIGNAL_K : constant character := 'k'; - SIGNAL_L : constant character := 'l'; - SIGNAL_M : constant character := 'm'; - SIGNAL_N : constant character := 'n'; - SIGNAL_O : constant character := 'o'; - SIGNAL_P : constant character := 'p'; - SIGNAL_Q : constant character := 'q'; - SIGNAL_R : constant character := 'r'; - SIGNAL_S : constant character := 's'; - SIGNAL_T : constant character := 't'; - SIGNAL_U : constant character := 'u'; - SIGNAL_V : constant character := 'v'; - SIGNAL_W : constant character := 'w'; - SIGNAL_X : constant character := 'x'; - SIGNAL_Y : constant character := 'y'; - SIGNAL_Z : constant character := 'z'; - - SIGNAL_0 : constant character := '0'; - SIGNAL_1 : constant character := '1'; - SIGNAL_2 : constant character := '2'; - SIGNAL_3 : constant character := '3'; - SIGNAL_4 : constant character := '4'; - SIGNAL_5 : constant character := '5'; - SIGNAL_6 : constant character := '6'; - SIGNAL_7 : constant character := '7'; - SIGNAL_8 : constant character := '8'; - SIGNAL_9 : constant character := '9'; - - SIGNAL_DOT : constant character := '.'; - SIGNAL_COMMA : constant character := ','; - SIGNAL_SEMICOLON : constant character := ';'; - SIGNAL_SLASH : constant character := '/'; - SIGNAL_BACKSLASH : constant character := '\'; - SIGNAL_QUOTE : constant character := '''; - SIGNAL_BACKQUOTE : constant character := '`'; - SIGNAL_SPACE : constant character := ' '; - - SIGNAL_BACKSPACE : constant character := character'val ( 8); - SIGNAL_TABULATOR : constant character := character'val ( 9); - SIGNAL_LINE_FEED : constant character := character'val (13); - SIGNAL_IDLE : constant character := character'val (24); - - type signal_list is mod 128; - COLOUR_GREY : constant character := '0'; COLOUR_RED : constant character := '1'; COLOUR_GREEN : constant character := '2'; @@ -98,11 +44,9 @@ function xabina return integer is LINE_FEED : constant character := character'val (13); ESCAPE : constant character := character'val (27); - function format_symbol ( - symbol : character := ' '; - colour : character := COLOUR_WHITE; - effect : character := EFFECT_NORMAL - ) return string is + function format_symbol (symbol : character := ' '; + colour : character := COLOUR_WHITE; + effect : character := EFFECT_NORMAL) return string is format : string (1 .. 12) := escape & "[E;3CmS" & escape & "[0m"; begin format (8) := symbol; @@ -144,6 +88,9 @@ function xabina return integer is -- -- Map data is only constant, not variable, since X and Y coordinates are determined by player, camera or global position. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + type map_width is mod 120; + type map_height is mod 40; + type map_list is ( STONE_WALL, WOODEN_WALL, STONE_FLOOR, WOODEN_FLOOR, WATER_SHALLOW, WATER_DEEP, SWAMP_SHALLOW, SWAMP_DEEP ); @@ -521,56 +468,72 @@ function xabina return integer is -- Player ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + type player_data is + record + x : map_width := 0; + y : map_height := 0; + health : natural := 0; + armour : natural := 0; + mana : natural := 0; + stamina : natural := 0; + end record; + + player : player_data; + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- Gameplay ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- Terminal --- -- Currently constant, gonna use either my xurses library or C bindings. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + procedure action_idle; type procedure_pointer is access procedure; - - type action_data is array (signal_list) of procedure_pointer; + type ascii_range is mod 2 ** 8; + type action_data is array (ascii_range) of procedure_pointer; active : boolean := true; - signal : character := SIGNAL_IDLE; - width : natural := 120; - height : natural := 40; - buffer : unbounded_string := null_unbounded_string; - - procedure action_idle is - begin - null; - end action_idle; - - procedure action_exit is - begin - active := false; - end action_exit; + signal : character := ' '; action_list : action_data := (others => action_idle'access); - procedure bind ( - key : character := SIGNAL_IDLE; - act : procedure_pointer := action_idle'access - ) is + procedure bind (symbol : character := CANCEL; + action : procedure_pointer := action_idle'access) is begin - action_list (character'pos (key)) := act; + action_list (character'pos (symbol)) := action; end bind; - procedure unbind ( - key : character := SIGNAL_IDLE - ) is + procedure unbind (symbol : character := CANCEL) is begin - action_list (character'pos (key)) := action_idle'access; + action_list (character'pos (symbol)) := action_idle'access; end unbind; - procedure action_draw is + procedure action_idle is begin null; end action_idle; + procedure action_exit is begin active := false; end action_exit; + procedure action_move_up is begin player.y := player.y - 1; end action_move_up; + procedure action_move_down is begin player.y := player.y + 1; end action_move_down; + procedure action_move_left is begin player.x := player.x - 1; end action_move_left; + procedure action_move_right is begin player.x := player.x + 1; end action_move_right; + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +-- Render +-- -- Currently constant, gonna use either my xurses library or C bindings. +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + + --~buffer_constant_data : string (1 .. 3 + 12 * 120 * 40 + 2 * 40); + --~buffer_constant_data : string (1 .. 3 + 12 * map_width * map_height + 2 * map_height); + --~buffer_variable_data : string (1 .. 3 + 12 * map_width * map_height + 2 * map_height); + + procedure render is begin - buffer := buffer & format_symbol ('@', COLOUR_RED, EFFECT_BOLD); - end action_draw; + put (ESCAPE & "[H"); + for y in map_height + loop + for x in map_width + loop + put (format_symbol ('~', COLOUR_RED, EFFECT_BOLD)); + end loop; + put (CARRIAGE_RETURN & LINE_FEED); + end loop; + end render; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- Main @@ -578,68 +541,16 @@ function xabina return integer is begin - bind (SIGNAL_Q, action_exit'access); - bind (SIGNAL_E, action_draw'access); + bind ('q', action_exit'access); loop exit when active = false; - buffer := to_unbounded_string (escape & "[H"); signal := CANCEL; - for y in 1 .. height - loop - for x in 1 .. width - loop - buffer := buffer & format_symbol ('X', COLOUR_GREY, EFFECT_BOLD); - end loop; - buffer := buffer & carriage_return & line_feed; - end loop; - put (to_string (buffer)); -- still reachable + render; get_immediate (signal); action_list (character'pos (signal)).all; end loop; - --~for this in magic_list - --~loop - --~put_line (format_symbol (magic_constant_data (this).symbol, magic_constant_data (this).colour, magic_constant_data (this).effect) - --~& " " - --~& to_string (magic_constant_data (this).name)); - --~end loop; - - --~for this in item_list - --~loop - --~put_line (format_symbol (item_constant_data (this).symbol, item_constant_data (this).colour, item_constant_data (this).effect) - --~& " " - --~& to_string (item_constant_data (this).name)); - --~end loop; - - --~for this in ammunition_list - --~loop - --~put_line (format_symbol (ammunition_constant_data (this).symbol, ammunition_constant_data (this).colour, ammunition_constant_data (this).effect) - --~& " " - --~& to_string (ammunition_constant_data (this).name)); - --~end loop; - - --~for this in weapon_list - --~loop - --~put_line (format_symbol (weapon_constant_data (this).symbol, weapon_constant_data (this).colour, weapon_constant_data (this).effect) - --~& " " - --~& to_string (weapon_constant_data (this).name)); - --~end loop; - - --~for this in armour_list - --~loop - --~put_line (format_symbol (armour_constant_data (this).symbol, armour_constant_data (this).colour, armour_constant_data (this).effect) - --~& " " - --~& to_string (armour_constant_data (this).name)); - --~end loop; - - --~for this in plant_list - --~loop - --~put_line (format_symbol (plant_constant_data (this).symbol, plant_constant_data (this).colour, plant_constant_data (this).effect) - --~& " " - --~& to_string (plant_constant_data (this).name)); - --~end loop; - return 0; end xabina;