2023-10-09 14:49:12 -04:00
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Copyright (c) 2023 - Ognjen 'xolatile' Milan Robovic
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either
-- version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
-- implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2023-10-08 15:11:04 -04:00
-- 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
2023-10-09 14:49:12 -04:00
-- 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...
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2023-10-08 15:11:04 -04:00
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
2023-10-09 14:49:12 -04:00
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- System
2023-10-09 14:56:48 -04:00
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2023-10-08 15:11:04 -04:00
2023-10-09 15:26:24 -04:00
type integer_subrange is
record
minimum : integer := 0 ;
maximum : integer := 0 ;
end record ;
type natural_subrange is
2023-10-09 14:49:12 -04:00
record
minimum : natural := 0 ;
maximum : natural := 0 ;
end record ;
type colour_id is (
COLOUR_GREY , COLOUR_RED , COLOUR_GREEN , COLOUR_YELLOW , COLOUR_BLUE , COLOUR_PINK , COLOUR_CYAN , COLOUR_WHITE
) ;
type effect_id is (
EFFECT_NORMAL , EFFECT_BOLD , EFFECT_ITALIC , EFFECT_UNDERLINE , EFFECT_BLINK , EFFECT_REVERSE
) ;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Entity
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2023-10-09 14:56:48 -04:00
type entity_id is (
ENTITY_NONE , ENTITY_MENU , ENTITY_MAP , ENTITY_ITEM , ENTITY_PLANT , ENTITY_ANIMAL , ENTITY_GOBLIN , ENTITY_PLAYER
) ;
2023-10-09 14:49:12 -04:00
type entity_constant_type is tagged
record
entity : entity_id := ENTITY_NONE ; -- Entity identifier.
name : unbounded_string := null_unbounded_string ; -- Entity general name.
code : character := ' ' ; -- Entity ASCII character representation.
colour : colour_id := COLOUR_WHITE ; -- Entity VT100 escape sequence colour.
effect : effect_id := EFFECT_NORMAL ; -- Entity VT100 escape sequence effect.
end record ;
type entity_variable_type is tagged
record
x : integer := 0 ; -- Global X coordinate.
y : integer := 0 ; -- Global Y coordinate.
end record ;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Map:
-- -- Map data is only constant, not variable, since X and Y coordinates are determined by player, camera or global position.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2023-10-09 14:56:48 -04:00
type map_id is (
MAP_NONE , MAP_VOID , MAP_WALL , MAP_FLOOR , MAP_HOLE , MAP_STAIRS_DOWN , MAP_STAIRS_UP , MAP_DOOR
) ;
2023-10-09 14:49:12 -04:00
type map_list_id is (
STONE_WALL , WOODEN_WALL , STONE_FLOOR , WOODEN_FLOOR
) ;
type map_constant_type is new entity_constant_type with
2023-10-08 15:11:04 -04:00
record
2023-10-09 14:49:12 -04:00
map : map_id := MAP_NONE ;
trigger : natural := 0 ;
2023-10-08 15:11:04 -04:00
end record ;
2023-10-09 15:26:24 -04:00
type map_constant_list is array ( map_list_id ) of map_constant_type ;
2023-10-08 15:11:04 -04:00
2023-10-09 15:26:24 -04:00
map_data : constant map_constant_list := (
( ENTITY_MAP , to_unbounded_string ( "Stone Wall" ) , '#' , COLOUR_GREY , EFFECT_BOLD , MAP_WALL , 0 ) ,
( ENTITY_MAP , to_unbounded_string ( "Wooden Wall" ) , '#' , COLOUR_YELLOW , EFFECT_NORMAL , MAP_WALL , 0 ) ,
( ENTITY_MAP , to_unbounded_string ( "Stone Floor" ) , '.' , COLOUR_GREY , EFFECT_BOLD , MAP_FLOOR , 0 ) ,
( ENTITY_MAP , to_unbounded_string ( "Wooden Floor" ) , '.' , COLOUR_YELLOW , EFFECT_NORMAL , MAP_FLOOR , 0 )
2023-10-08 15:11:04 -04:00
) ;
2023-10-09 14:49:12 -04:00
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2023-10-09 14:56:48 -04:00
-- Item
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
type item_id is (
ITEM_NONE , ITEM_AMMUNITION , ITEM_WEAPON , ITEM_ARMOUR , ITEM_SCROLL , ITEM_POTION , ITEM_CONSUMABLE , ITEM_NOTE
) ;
2023-10-09 15:26:24 -04:00
type item_list_id is (
IRON_SWORD , IRON_GREATSWORD , IRON_AXE , IRON_BATTLEAXE , IRON_SPEAR , IRON_SHIELD , IRON_MACE , IRON_HAMMER
) ;
type item_constant_type is new entity_constant_type with
record
item : item_id := ITEM_NONE ;
amount_limit : natural := 0 ;
weight : natural := 0 ;
value : natural := 0 ;
attack_range : integer_subrange := ( 0 , 0 ) ;
defense_range : integer_subrange := ( 0 , 0 ) ;
distance_range : integer_subrange := ( 0 , 0 ) ;
health_shift : natural_subrange := ( 0 , 0 ) ;
mana_shift : natural_subrange := ( 0 , 0 ) ;
stamina_shift : natural_subrange := ( 0 , 0 ) ;
-- description : unbounded_string := null_unbounded_string;
end record ;
type item_variable_type is new entity_variable_type with
record
amount : natural := 0 ;
condition : natural := 0 ;
end record ;
type item_constant_list is array ( item_list_id ) of item_constant_type ;
item_data : constant item_constant_list := ( -- Please...
( ENTITY_ITEM , to_unbounded_string ( "Iron Sword" ) , '!' , COLOUR_RED , EFFECT_NORMAL , ITEM_WEAPON , 0 , 31 , 30 , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) ) ,
( ENTITY_ITEM , to_unbounded_string ( "Iron Greatsword" ) , '!' , COLOUR_RED , EFFECT_NORMAL , ITEM_WEAPON , 0 , 32 , 31 , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) ) ,
( ENTITY_ITEM , to_unbounded_string ( "Iron Axe" ) , '!' , COLOUR_RED , EFFECT_NORMAL , ITEM_WEAPON , 0 , 33 , 32 , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) ) ,
( ENTITY_ITEM , to_unbounded_string ( "Iron Battleaxe" ) , '!' , COLOUR_RED , EFFECT_NORMAL , ITEM_WEAPON , 0 , 34 , 33 , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) ) ,
( ENTITY_ITEM , to_unbounded_string ( "Iron Spear" ) , '!' , COLOUR_RED , EFFECT_NORMAL , ITEM_WEAPON , 0 , 35 , 34 , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) ) ,
( ENTITY_ITEM , to_unbounded_string ( "Iron Shield" ) , '!' , COLOUR_RED , EFFECT_NORMAL , ITEM_WEAPON , 0 , 36 , 35 , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) ) ,
( ENTITY_ITEM , to_unbounded_string ( "Iron Mace" ) , '!' , COLOUR_RED , EFFECT_NORMAL , ITEM_WEAPON , 0 , 37 , 36 , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) ) ,
( ENTITY_ITEM , to_unbounded_string ( "Iron Hammer" ) , '!' , COLOUR_RED , EFFECT_NORMAL , ITEM_WEAPON , 0 , 38 , 37 , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 ) )
) ;
2023-10-09 14:56:48 -04:00
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Plant
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
type plant_id is (
PLANT_NONE , PLANT_GRASS , PLANT_REED , PLANT_BUSH , PLANT_APPLE_TREE , PLANT_LEMON_TREE , PLANT_OAK_TREE , PLANT_PINE_TREE
) ;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Animal
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
type animal_id is (
ANIMAL_NONE , ANIMAL_RAT , ANIMAL_BAT , ANIMAL_SPIDER , ANIMAL_LIZARD , ANIMAL_SNAIL , ANIMAL_WORM , ANIMAL_MOLE
) ;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2023-10-09 14:49:12 -04:00
-- Goblin
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2023-10-09 14:56:48 -04:00
type goblin_id is (
GOBLIN_NONE , GOBLIN_WORKER , GOBLIN_WARRIOR , GOBLIN_BOAR_RIDER , GOBLIN_SHAMAN , GOBLIN_CHIEF , GOBLIN_KING , GOBLIN_OGRE
) ;
2023-10-09 14:49:12 -04:00
type goblin_constant_type is new entity_constant_type with
record
2023-10-09 15:26:24 -04:00
goblin : goblin_id := GOBLIN_NONE ; -- Index of 'goblin_data'.
health_limit : natural := 0 ;
armour_limit : natural := 0 ;
mana_limit : natural := 0 ;
stamina_limit : natural := 0 ;
attack_range : natural_subrange := ( 0 , 0 ) ;
2023-10-09 14:49:12 -04:00
end record ;
type goblin_variable_type is new entity_variable_type with
record
2023-10-09 15:26:24 -04:00
health : natural := 0 ;
armour : natural := 0 ;
mana : natural := 0 ;
stamina : natural := 0 ;
weapon : item_id := ITEM_NONE ;
2023-10-09 14:49:12 -04:00
end record ;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Gameplay
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2023-10-08 15:11:04 -04:00
begin
2023-10-09 15:26:24 -04:00
for this in item_list_id
2023-10-08 15:11:04 -04:00
loop
2023-10-09 15:26:24 -04:00
put_line ( "> " & to_string ( item_data ( this ) . name ) ) ;
2023-10-08 15:11:04 -04:00
end loop ;
return 0 ;
end xabina ;