diff --git a/xungeons.c b/xungeons.c index b6c7353..6a07883 100644 --- a/xungeons.c +++ b/xungeons.c @@ -31,12 +31,21 @@ enum { fighting, blocking, shooting, spellcasting, evoking, trading, healing, lo enum { warrior, mage, thief, priest, archer, alchemist, warlock, merchant, classes }; +static char * point_name [points] = { "HP = ", "MP = ", "SP = ", "XP = " }; + +static char * attribute_name [attributes] = { "Strength : ", "Dexterity : ", "Agility : ", "Intelligence : " }; + +static char * skill_name [skills] = { "Fighting", "Blocking", "Shooting", "Spellcasting", "Evoking", "Trading", "Healing", "Lockpicking" }; + +static char * class_name [classes] = { "Warrior", "Mage", "Thief", "Priest", "Archer", "Alchemist", "Warlock", "Merchant" }; + static struct { char clip, style, colour, symbol; } const tiles [] = { - { 1, normal, white, ' ' }, - { 0, bold, grey, '.' }, - { 1, bold, grey, '#' } + { 1, normal, white, ' ' }, + { 0, bold, grey, '.' }, + { 1, bold, grey, '#' }, + { 1, reverse, blue, '-' }, }; static struct { @@ -87,6 +96,7 @@ static struct termios new_terminal; static int signal; static int screen_width; static int screen_height; +static int screen_side; static char * screen; static int level_width; static int level_height; @@ -135,6 +145,8 @@ static void initialize_screen (void) { screen = calloc ((unsigned long int) (12 * screen_width * screen_height + 4), sizeof (* screen)); strcpy (screen, "\033[H"); + + screen_side = 32; } static void deinitialize_screen (void) { @@ -180,8 +192,8 @@ static void synchronize_screen (void) { default: break; } - player.x = clamp (player.x, 0, (char) level_width); - player.y = clamp (player.y, 0, (char) level_height); + player.x = clamp (player.x, 0, (char) level_width - 1); + player.y = clamp (player.y, 0, (char) level_height - 1); } static void generate_level (void) { @@ -203,12 +215,10 @@ static void generate_level (void) { } } for (i = 0; i < height; ++i) { - level [(i + y) * level_width + x] = 2; - level [(i + y) * level_width + x + width - 1] = 2; + level [(i + y) * level_width + x] = level [(i + y) * level_width + x + width - 1] = 2; } for (j = 0; j < width; ++j) { - level [y * level_width + j + x] = 2; - level [(y + height - 1) * level_width + j + x] = 2; + level [y * level_width + j + x] = level [(y + height - 1) * level_width + j + x] = 2; } } @@ -220,6 +230,14 @@ static void generate_level (void) { } } } + + for (i = 0; i < level_height; ++i) { + level [i * level_width] = level [i * level_width + level_width - 1] = 3; + } + + for (j = 0; j < level_width; ++j) { + level [j] = level [(level_height - 1) * level_width + j] = 3; + } } static void generate_party (void) { @@ -251,7 +269,7 @@ static void generate_party (void) { } int main (void) { - int i, x, y; + int i, j, x, y; srand (time (0)); @@ -267,16 +285,38 @@ int main (void) { } } - for (y = 0; (y < screen_height) && (y + player.y < level_height - 1); ++y) { - for (x = 0; (x < screen_width) && (x + player.x < level_width - 1); ++x) { - i = (int) level [(y + player.y) * level_width + (x + player.x)]; - screen_put (tiles [i].style, tiles [i].colour, tiles [i].symbol, x, y); + for (y = maximum (0, player.y - screen_height / 2); (y < player.y + screen_height / 2) && (y < level_height); ++y) { + for (x = maximum (0, player.x - screen_width / 2); (x < player.x + screen_width / 2) && (x < level_width); ++x) { + i = (int) level [y * level_width + x]; + screen_put (tiles [i].style, tiles [i].colour, tiles [i].symbol, screen_width / 2 + x - player.x, screen_height / 2 + y - player.y); } } screen_put (bold, cyan, '@', screen_width / 2, screen_height / 2); - screen_print (bold, grey, "Warrior", screen_width - 24, 0, 24); + //~player.weapon [i] = random (0, 3); + //~player.armour [i] = random (0, 3); + //~for (j = 0; j < points; ++j) { + //~player.point [i] [j] = random (12, 24); + //~} + //~for (j = 0; j < attributes; ++j) { + //~player.attribute [i] [j] = random (1, 4); + //~} + //~player.skill [i] = rand () % skills; + //~player.class [i] = rand () % classes; + for (i = 0; i < members; ++i) { + screen_print (bold, blue, class_name [(int) player.class [i]], screen_width - screen_side, i * (2 + 1 + attributes + 1) + 0, screen_side); + screen_print (bold, white, skill_name [(int) player.skill [i]], screen_width - screen_side, i * (2 + 1 + attributes + 1) + 1, screen_side); + //~for (j = 0; j < points; ++j) { + //~int length = strlen (point_name [player.point [i]]); + //~screen_print (bold, white, point_name [j], screen_width - screen_side, i * (2 + 1 + attributes + 1) + 2 + j, screen_side); + //~screen_print (bold, white, player.point [i], screen_width - screen_side, i * (2 + 1 + attributes) + 2 + j, screen_side); + //~} + //~for (j = 0; j < attributes; ++j) { + //~screen_print (bold, white, attribute_name [j], screen_width - 24, i * (2 + 1 + attributes + 1) + 2 + 1 + j, screen_side); + //~} + screen_print (bold, white, "--------------------------------", screen_width - screen_side, i * (2 + 1 + attributes + 1) + 2 + 1 + attributes, screen_side); + } synchronize_screen (); }