-- Experimental minimal terminal rogue-like game in Ada programming language. I used to write a lot of Ada programs some time ago, then went in full C and assembly mode, and came -- back to Ada, but realized that I keep my folders messy... Since it's bothersome to find my old Ada projects and share them here, I decided that the most easy thing to do is to write -- a new program in Ada, a tiny game. Work in progress, it's messy and ugly for now... with ada.text_io, ada.strings.unbounded; use ada.text_io, ada.strings.unbounded; --~ TODO: Do not use this command below, it's for real-time game... --~ TODO: gnatmake xabina.adb && stty raw -echo && ./xabina && reset function xabina return integer is type entity_id is (ENTITY_NONE, ENTITY_MENU, ENTITY_TILE, ENTITY_ITEM, ENTITY_PLANT, ENTITY_ANIMAL, ENTITY_GOBLIN, ENTITY_PLAYER); type tile_id is (TILE_NONE, TILE_VOID, TILE_WALL, TILE_FLOOR, TILE_HOLE, TILE_STAIRS_DOWN, TILE_STAIRS_UP, TILE_DOOR); type item_id is (ITEM_NONE, ITEM_AMMUNITION, ITEM_WEAPON, ITEM_ARMOUR, ITEM_SCROLL, ITEM_POTION, ITEM_CONSUMABLE, ITEM_NOTE); type plant_id is (PLANT_NONE, PLANT_GRASS, PLANT_REED, PLANT_BUSH, PLANT_APPLE_TREE, PLANT_LEMON_TREE, PLANT_OAK_TREE, PLANT_PINE_TREE); type animal_id is (ANIMAL_NONE, ANIMAL_RAT, ANIMAL_BAT, ANIMAL_SPIDER, ANIMAL_LIZARD, ANIMAL_SNAIL, ANIMAL_WORM, ANIMAL_MOLE); type goblin_id is (GOBLIN_NONE, GOBLIN_WORKER, GOBLIN_WARRIOR, GOBLIN_BOAR_RIDER, GOBLIN_SHAMAN, GOBLIN_CHIEF, GOBLIN_KING, GOBLIN_OGRE); type tile_list_id is (STONE_WALL, WOODEN_WALL, STONE_FLOOR, WOODEN_FLOOR); type entity (this : entity_id) is record id : entity_id := ENTITY_NONE; name : unbounded_string := null_unbounded_string; code : character := ' '; collide : boolean := false; case this is when ENTITY_TILE => tile : tile_id := TILE_NONE; when ENTITY_ITEM => item : item_id := ITEM_NONE; weight : natural := 0; value : natural := 0; when ENTITY_PLANT => plant : plant_id := PLANT_NONE; generate_item : item_id := ITEM_NONE; generate_rate : natural := 0; when others => null; --~ TODO: Other entity types... end case; end record; type tile_list is array (tile_list_id) of entity (ENTITY_TILE); data_tile : constant tile_list := ( (this => ENTITY_TILE, id => ENTITY_TILE, name => to_unbounded_string ("Stone Wall"), code => '$', tile => TILE_WALL, collide => true), (this => ENTITY_TILE, id => ENTITY_TILE, name => to_unbounded_string ("Wooden Wall"), code => '#', tile => TILE_WALL, collide => true), (this => ENTITY_TILE, id => ENTITY_TILE, name => to_unbounded_string ("Stone Floor"), code => '.', tile => TILE_FLOOR, collide => false), (this => ENTITY_TILE, id => ENTITY_TILE, name => to_unbounded_string ("Wooden Floor"), code => '=', tile => TILE_FLOOR, collide => false) ); begin for this in tile_list_id loop put_line ("> " & to_string (data_tile (this).name)); end loop; return 0; end xabina;