diff --git a/xabina.adb b/xabina.adb index fb07056..f1f92de 100644 --- a/xabina.adb +++ b/xabina.adb @@ -89,7 +89,8 @@ function xabina return integer is collide : boolean := false; end record; - type map_constant_list is array (map_list) of map_constant_type; + type map_constant_list is array (map_list) of map_constant_type; + type map_variable_list is array (map_height, map_width) of map_list; map_constant_data : constant map_constant_list := ( (ENTITY_MAP, to_unbounded_string ("Stone Wall"), '#', COLOUR_GREY, EFFECT_BOLD, true), @@ -102,6 +103,19 @@ function xabina return integer is (ENTITY_MAP, to_unbounded_string ("Swamp (deep)"), '~', COLOUR_GREEN, EFFECT_BOLD, true) ); + map_variable_data : map_variable_list; + + procedure generate_map is + begin + for y in map_height + loop + for x in map_width + loop + map_variable_data (y, x) := WOODEN_FLOOR; + end loop; + end loop; + end generate_map; + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- Item ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ @@ -519,7 +533,7 @@ function xabina return integer is procedure render_screen_delete is begin put (ESCAPE & "[2J"); end render_screen_delete; procedure render_screen_offset is begin put (ESCAPE & "[H"); end render_screen_offset; procedure render_cursor_hide is begin put (ESCAPE & "[?25l"); end render_cursor_hide; - procedure render_cursor_show is begin put (ESCAPE & "[?25l"); end render_cursor_show; + procedure render_cursor_show is begin put (ESCAPE & "[?25h"); end render_cursor_show; procedure render_realignment is begin put (CARRIAGE_RETURN & LINE_FEED); end render_realignment; procedure render_character (symbol : character := ' '; @@ -557,6 +571,28 @@ function xabina return integer is screen_effect (y, x) := effect; end insert_character; + procedure insert_map is + symbol : character := ' '; + colour : character := COLOUR_WHITE; + effect : character := EFFECT_NORMAL; + begin + for y in screen_height + loop + for x in screen_width + loop + symbol := map_constant_data (map_variable_data (map_height (y), map_width (x))).symbol; + colour := map_constant_data (map_variable_data (map_height (y), map_width (x))).colour; + effect := map_constant_data (map_variable_data (map_height (y), map_width (x))).effect; + insert_character (symbol, colour, effect, y, x); + end loop; + end loop; + end insert_map; + + procedure insert_player is + begin + insert_character ('@', COLOUR_CYAN, EFFECT_BOLD, screen_height (player.y), screen_width (player.x)); + end insert_player; + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- Main ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ @@ -573,17 +609,13 @@ begin render_screen_offset; render_cursor_hide; + generate_map; + loop exit when active = false; signal := CANCEL; - for y in screen_height - loop - for x in screen_width - loop - insert_character ('.', COLOUR_GREY, EFFECT_BOLD, y, x); - end loop; - end loop; - insert_character ('@', COLOUR_CYAN, EFFECT_BOLD, screen_height (player.y), screen_width (player.x)); + insert_map; + insert_player; render_screen; get_immediate (signal); action_list (character'pos (signal)).all;