From ef522be8ef03e1242182158a89eb2fa220d93be5 Mon Sep 17 00:00:00 2001 From: Andrew Pamment Date: Tue, 22 Apr 2025 11:38:20 +1000 Subject: [PATCH] Improvements --- ADG5.cpp | 3 ++- Actor.cpp | 7 ++++++- Ai.cpp | 12 ++++++------ Attacker.cpp | 6 +++--- Confuser.cpp | 4 ++-- Destructible.cpp | 4 ++-- Engine.cpp | 10 +++++----- Engine.h | 2 ++ Fireball.cpp | 6 +++--- Gui.cpp | 20 ++++++++++++++++++-- Gui.h | 15 +++++++++++++++ Lightningbolt.cpp | 4 ++-- Map.cpp | 24 ++++++++++++++---------- Pickable.cpp | 2 +- menu_background1.png | Bin 10785 -> 14541 bytes terminal10x16_gs_ro.png | Bin 0 -> 5699 bytes 16 files changed, 81 insertions(+), 38 deletions(-) create mode 100644 terminal10x16_gs_ro.png diff --git a/ADG5.cpp b/ADG5.cpp index c1a55f2..3b4e8b2 100644 --- a/ADG5.cpp +++ b/ADG5.cpp @@ -14,7 +14,8 @@ int main(int argc, char **argv) { auto console = tcod::Console(80, 50); auto params = TCOD_ContextParams{}; - + auto tileset = tcod::load_tilesheet("terminal10x16_gs_ro.png", { 16, 16 }, tcod::CHARMAP_CP437); + params.tileset = tileset.get(); params.console = console.get(); params.window_title = "Andrew's Dungeon Game 5"; params.sdl_window_flags = SDL_WINDOW_RESIZABLE; diff --git a/Actor.cpp b/Actor.cpp index 8c5a67d..3e5b2cb 100644 --- a/Actor.cpp +++ b/Actor.cpp @@ -16,7 +16,12 @@ Actor::Actor(int x, int y, std::string_view ch, std::string name, const TCOD_Col } void Actor::render(TCOD_Console& cons) const { - tcod::print(cons, { x, y }, ch, col, std::nullopt); + int offset_x = engine->player->x - Engine::VIEW_WIDTH / 2; + int offset_y = engine->player->y - Engine::VIEW_HEIGHT / 2; + if (offset_x > x || Engine::VIEW_WIDTH + offset_x < x || offset_y > y || Engine::VIEW_HEIGHT + offset_y < y) { + return; + } + tcod::print(cons, { x - offset_x, y - offset_y}, ch, col, std::nullopt); } void Actor::update() { diff --git a/Ai.cpp b/Ai.cpp index 7d2459a..ff8943a 100644 --- a/Ai.cpp +++ b/Ai.cpp @@ -27,7 +27,7 @@ void PlayerAi::update(Actor* owner) { if (owner->destructible->xp >= levelUpXp) { xpLevel++; owner->destructible->xp -= levelUpXp; - engine->gui->message(TCOD_ColorRGB(255, 255, 100), "Your battle skills grow stronger! You reached level %d", xpLevel); + engine->gui->message(engine->gui->lightYellow, "Your battle skills grow stronger! You reached level %d", xpLevel); engine->gui->menu.clear(); engine->gui->menu.addItem(Menu::CONSTITUTION, "Constitution (+20HP)"); engine->gui->menu.addItem(Menu::STRENGTH, "Strength (+1 attack)"); @@ -120,18 +120,18 @@ void PlayerAi::handleActionKey(Actor* owner, int sdlkey, int mod) { if (actor->pickable && actor->x == owner->x && actor->y == owner->y) { if (actor->pickable->pick(actor, owner)) { found = true; - engine->gui->message(TCOD_ColorRGB(200,200,200), "You pick up the %s.", + engine->gui->message(engine->gui->lightGrey, "You pick up the %s.", actor->name.c_str()); break; } else if (!found) { found = true; - engine->gui->message(TCOD_ColorRGB(255,0,0), "Your inventory is full."); + engine->gui->message(engine->gui->red, "Your inventory is full."); } } } if (!found) { - engine->gui->message(TCOD_ColorRGB(200,200,200), "There's nothing here that you can pick up."); + engine->gui->message(engine->gui->lightGrey, "There's nothing here that you can pick up."); } if (engine->gameStatus != Engine::QUIT) engine->gameStatus = Engine::NEW_TURN; @@ -163,7 +163,7 @@ void PlayerAi::handleActionKey(Actor* owner, int sdlkey, int mod) { engine->nextLevel(); } else { - engine->gui->message(TCOD_ColorRGB(200, 200, 200), "There are no stairs here."); + engine->gui->message(engine->gui->lightGrey, "There are no stairs here."); } } break; @@ -189,7 +189,7 @@ bool PlayerAi::moveOrAttack(Actor* owner, int targetx, int targety) { || actor->pickable; if (corpseOrItem && actor->x == targetx && actor->y == targety) { - engine->gui->message(TCOD_ColorRGB(200,200,200), "There's a %s here.", actor->name.c_str()); + engine->gui->message(engine->gui->lightGrey, "There's a %s here.", actor->name.c_str()); } } owner->x = targetx; diff --git a/Attacker.cpp b/Attacker.cpp index 0973597..045718a 100644 --- a/Attacker.cpp +++ b/Attacker.cpp @@ -10,16 +10,16 @@ Attacker::Attacker(float power) : power(power) { void Attacker::attack(Actor* owner, Actor* target) { if (target->destructible && !target->destructible->isDead()) { if (power - target->destructible->defense > 0) { - engine->gui->message(TCOD_ColorRGB(150, 150, 150), "%s attacks %s for %g hit points.\n", owner->name.c_str(), target->name.c_str(), + engine->gui->message(engine->gui->lightGrey, "%s attacks %s for %g hit points.\n", owner->name.c_str(), target->name.c_str(), power - target->destructible->defense); } else { - engine->gui->message(TCOD_ColorRGB(150, 150, 150), "%s attacks %s but it has no effect!\n", owner->name.c_str(), target->name.c_str()); + engine->gui->message(engine->gui->lightGrey, "%s attacks %s but it has no effect!\n", owner->name.c_str(), target->name.c_str()); } target->destructible->takeDamage(target, power); } else { - engine->gui->message(TCOD_ColorRGB(150, 150, 150), "%s attacks %s in vain.\n", owner->name.c_str(), target->name.c_str()); + engine->gui->message(engine->gui->lightGrey, "%s attacks %s in vain.\n", owner->name.c_str(), target->name.c_str()); } } diff --git a/Confuser.cpp b/Confuser.cpp index e6b13c7..5fa5ce0 100644 --- a/Confuser.cpp +++ b/Confuser.cpp @@ -10,7 +10,7 @@ Confuser::Confuser(int nbTurns, float range) : nbTurns(nbTurns), range(range) { } bool Confuser::use(Actor* owner, Actor* wearer) { - engine->gui->message(TCOD_ColorRGB(0, 255, 255), "Left-click an enemy to confuse it,\nor right-click to cancel."); + engine->gui->message(engine->gui->lightBlue, "Left-click an enemy to confuse it,\nor right-click to cancel."); int x, y; if (!engine->pickATile(&x, &y, range)) { return false; @@ -22,7 +22,7 @@ bool Confuser::use(Actor* owner, Actor* wearer) { // confuse the monster for turns Ai* confusedAi = new ConfusedMonsterAi(nbTurns, actor->ai); actor->ai = confusedAi; - engine->gui->message(TCOD_ColorRGB(100, 255, 100), "The eyes of the %s look vacant,\nas he starts to stumble around!", + engine->gui->message(engine->gui->lightGreen, "The eyes of the %s look vacant,\nas he starts to stumble around!", actor->name.c_str()); return Pickable::use(owner, wearer); } diff --git a/Destructible.cpp b/Destructible.cpp index 23067f1..7bd6fce 100644 --- a/Destructible.cpp +++ b/Destructible.cpp @@ -60,7 +60,7 @@ void MonsterDestructible::save(TCODZip& zip) { void MonsterDestructible::die(Actor* owner) { // transform it into a nasty corpse! it doesn't block, can't be // attacked and doesn't move - engine->gui->message(TCOD_ColorRGB(150, 150, 150), "%s is dead. You gain %d xp", + engine->gui->message(engine->gui->lightGrey, "%s is dead. You gain %d xp", owner->name.c_str(), xp); engine->player->destructible->xp += xp; @@ -68,7 +68,7 @@ void MonsterDestructible::die(Actor* owner) { } void PlayerDestructible::die(Actor* owner) { - engine->gui->message(TCOD_ColorRGB(150, 0, 0), "You died!\n"); + engine->gui->message(engine->gui->red, "You died!\n"); Destructible::die(owner); engine->gameStatus = Engine::DEFEAT; } diff --git a/Engine.cpp b/Engine.cpp index e003d0f..2c83580 100644 --- a/Engine.cpp +++ b/Engine.cpp @@ -27,7 +27,7 @@ Engine::Engine(int screenWidth, int screenHeight, tcod::Context *context, tcod:: } void Engine::init() { - player = new Actor(40, 25, "@", "player", TCOD_ColorRGB(255, 255, 255)); + player = new Actor(40, 25, "@", "player", engine->gui->white); player->destructible = new PlayerDestructible(30, 2, "player corpse"); player->attacker = new Attacker(5); player->ai = new PlayerAi(); @@ -37,7 +37,7 @@ void Engine::init() { stairs->blocks = false; stairs->fovOnly = false; actors.push(stairs); - map = new Map(80, 43); + map = new Map(200, 100); map->init(true); gui->message(TCOD_ColorRGB(150,0,0), "Welcome stranger!\nPrepare to perish in the Tombs of Andrew's Dunegon."); @@ -46,9 +46,9 @@ void Engine::init() { void Engine::nextLevel() { level++; - gui->message(TCOD_ColorRGB(255, 100, 255), "You take a moment to rest, and recover your strength."); + gui->message(engine->gui->lightPurple, "You take a moment to rest, and recover your strength."); player->destructible->heal(player->destructible->maxHp / 2); - gui->message(TCOD_ColorRGB(255, 100, 100), "After a rare moment of peace, you descend\ndeeper into the heart of the dungeon..."); + gui->message(engine->gui->lightRed, "After a rare moment of peace, you descend\ndeeper into the heart of the dungeon..."); delete map; // delete all actors but player and stairs for (Actor** it = actors.begin(); it != actors.end(); it++) { @@ -58,7 +58,7 @@ void Engine::nextLevel() { } } // create a new map - map = new Map(80, 43); + map = new Map(200, 100); map->init(true); gameStatus = STARTUP; } diff --git a/Engine.h b/Engine.h index 883e6ec..b98ff91 100644 --- a/Engine.h +++ b/Engine.h @@ -7,6 +7,8 @@ class Gui; class Engine { public: + const static int VIEW_WIDTH = 80; + const static int VIEW_HEIGHT = 43; enum GameStatus { STARTUP, IDLE, diff --git a/Fireball.cpp b/Fireball.cpp index dbe0753..5d50896 100644 --- a/Fireball.cpp +++ b/Fireball.cpp @@ -10,18 +10,18 @@ Fireball::Fireball(float range, float damage) } bool Fireball::use(Actor* owner, Actor* wearer) { - engine->gui->message(TCOD_ColorRGB(0, 255, 255), "Left-click a target tile for the fireball,\nor right-click to cancel."); + engine->gui->message(engine->gui->lightBlue, "Left-click a target tile for the fireball,\nor right-click to cancel."); int x, y; if (!engine->pickATile(&x, &y)) { return false; } - engine->gui->message(TCOD_ColorRGB(255, 255, 100), "The fireball explodes, burning everything within %g tiles!", range); + engine->gui->message(engine->gui->lightYellow, "The fireball explodes, burning everything within %g tiles!", range); for (Actor** iterator = engine->actors.begin(); iterator != engine->actors.end(); iterator++) { Actor* actor = *iterator; if (actor->destructible && !actor->destructible->isDead() && actor->getDistance(x, y) <= range) { - engine->gui->message(TCOD_ColorRGB(255, 255, 100), "The %s gets burned for %g hit points.", + engine->gui->message(engine->gui->lightYellow, "The %s gets burned for %g hit points.", actor->name.c_str(), damage); actor->destructible->takeDamage(actor, damage); } diff --git a/Gui.cpp b/Gui.cpp index a28caf5..8e0b8e8 100644 --- a/Gui.cpp +++ b/Gui.cpp @@ -15,6 +15,20 @@ static const int MSG_HEIGHT = PANEL_HEIGHT - 1; Gui::Gui(tcod::Context *ctx, tcod::Console *root) { con = ctx->new_console(engine->screenWidth, PANEL_HEIGHT); this->root = root; + darkGrey = TCOD_ColorRGB(100,100,100); + lightGrey = TCOD_ColorRGB(200,200,200); + white = TCOD_ColorRGB(255,255,255); + red = TCOD_ColorRGB(100, 50, 50); + green = TCOD_ColorRGB(50, 100, 50); + blue = TCOD_ColorRGB(50, 50, 100); + yellow = TCOD_ColorRGB(100, 100, 50); + black = TCOD_ColorRGB(0, 0, 0); + lightBlue = TCOD_ColorRGB(100, 100, 255); + lightGreen = TCOD_ColorRGB(100, 255, 100); + lightRed = TCOD_ColorRGB(255, 100, 100); + lightYellow = TCOD_ColorRGB(255, 255, 100); + lightPurple = TCOD_ColorRGB(255, 100, 255); + purple = TCOD_ColorRGB(100, 50, 100); } void Gui::clear() { @@ -186,8 +200,10 @@ Menu::MenuItemCode Menu::pick(tcod::Context *ctx, tcod::Console *con, DisplayMod else { static TCODImage img("menu_background1.png"); img.blit2x(*con, 0, 0); - menux = 10; - menuy = con->get_height() / 3; + TCOD_ColorRGB fg(200, 180, 50); + TCOD_ColorRGB bg(0, 0, 0); + menux = 7; + menuy = 30; } int currentItem = 0; diff --git a/Gui.h b/Gui.h index ef110c7..1cb7dce 100644 --- a/Gui.h +++ b/Gui.h @@ -5,6 +5,7 @@ class Menu { public: + enum MenuItemCode { NONE, NEW_GAME, @@ -32,6 +33,20 @@ protected: class Gui : public Persistent { public: + TCOD_ColorRGB darkGrey; + TCOD_ColorRGB lightGrey; + TCOD_ColorRGB white; + TCOD_ColorRGB red; + TCOD_ColorRGB green; + TCOD_ColorRGB blue; + TCOD_ColorRGB yellow; + TCOD_ColorRGB black; + TCOD_ColorRGB lightBlue; + TCOD_ColorRGB lightGreen; + TCOD_ColorRGB lightRed; + TCOD_ColorRGB lightYellow; + TCOD_ColorRGB lightPurple; + TCOD_ColorRGB purple; Gui(tcod::Context *ctx, tcod::Console *root); ~Gui(); void render(); diff --git a/Lightningbolt.cpp b/Lightningbolt.cpp index c1f6c0e..f4dc2b3 100644 --- a/Lightningbolt.cpp +++ b/Lightningbolt.cpp @@ -11,11 +11,11 @@ LightningBolt::LightningBolt(float range, float damage) bool LightningBolt::use(Actor* owner, Actor* wearer) { Actor* closestMonster = engine->getClosestMonster(wearer->x, wearer->y, range); if (!closestMonster) { - engine->gui->message(TCOD_ColorRGB(200,200,200), "No enemy is close enough to strike."); + engine->gui->message(engine->gui->white, "No enemy is close enough to strike."); return false; } // hit closest monster for hit points - engine->gui->message(TCOD_ColorRGB(100, 255, 100), + engine->gui->message(engine->gui->lightBlue, "A lighting bolt strikes the %s with a crack of thunder!\n" "The damage is %g hit points.", closestMonster->name.c_str(), damage); diff --git a/Map.cpp b/Map.cpp index c491dd5..a0a505d 100644 --- a/Map.cpp +++ b/Map.cpp @@ -9,6 +9,7 @@ #include "Lightningbolt.h" #include "Fireball.h" #include "Confuser.h" +#include "Gui.h" static const int ROOM_MAX_SIZE = 12; static const int ROOM_MIN_SIZE = 6; @@ -114,13 +115,16 @@ void Map::render(TCOD_Console& cons) const { static const TCOD_ColorRGB lightGround(200, 180, 50); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { + int offset_x = engine->player->x - Engine::VIEW_WIDTH / 2; + int offset_y = engine->player->y - Engine::VIEW_HEIGHT / 2; + if (offset_x > x || Engine::VIEW_WIDTH + offset_x < x || offset_y > y || Engine::VIEW_HEIGHT + offset_y < y) { + continue; + } if (isInFov(x, y)) { - tcod::print(cons, { x, y }, " ", std::nullopt, isWall(x, y) ? lightWall : lightGround); + tcod::print(cons, { x - offset_x, y - offset_y }, " ", std::nullopt, isWall(x, y) ? lightWall : lightGround); } else if (isExplored(x, y)) { - tcod::print(cons, { x, y }, " ", std::nullopt, isWall(x, y) ? darkWall : darkGround); - - + tcod::print(cons, { x- offset_x, y - offset_y }, " ", std::nullopt, isWall(x, y) ? darkWall : darkGround); } } } @@ -185,7 +189,7 @@ void Map::addMonster(int x, int y) { if (rng->getInt(0, 100) < 80) { // create an orc Actor* orc = new Actor(x, y, "o", "orc", - TCOD_ColorRGB(0, 100, 0)); + engine->gui->green); orc->destructible = new MonsterDestructible(10, 0, "dead orc", 5); orc->attacker = new Attacker(3); orc->ai = new MonsterAi(); @@ -194,7 +198,7 @@ void Map::addMonster(int x, int y) { else { // create a troll Actor* troll = new Actor(x, y, "T", "troll", - TCOD_ColorRGB(0, 255, 0)); + engine->gui->lightGreen); troll->destructible = new MonsterDestructible(16, 1, "troll carcass", 10); troll->attacker = new Attacker(4); troll->ai = new MonsterAi(); @@ -208,7 +212,7 @@ void Map::addItem(int x, int y) { if (dice < 70) { // create a health potion Actor* healthPotion = new Actor(x, y, "!", "health potion", - TCOD_ColorRGB(128, 0, 128)); + engine->gui->purple); healthPotion->blocks = false; healthPotion->pickable = new Healer(4); engine->actors.push(healthPotion); @@ -216,7 +220,7 @@ void Map::addItem(int x, int y) { else if (dice < 70 + 10) { // create a scroll of lightning bolt Actor* scrollOfLightningBolt = new Actor(x, y, "#", "scroll of lightning bolt", - TCOD_ColorRGB(255, 100, 100)); + engine->gui->lightRed); scrollOfLightningBolt->blocks = false; scrollOfLightningBolt->pickable = new LightningBolt(5, 20); engine->actors.push(scrollOfLightningBolt); @@ -225,7 +229,7 @@ void Map::addItem(int x, int y) { else if (dice < 70 + 10 + 10) { // create a scroll of fireball Actor* scrollOfFireball = new Actor(x, y, "#", "scroll of fireball", - TCOD_ColorRGB(255, 100, 100)); + engine->gui->lightRed); scrollOfFireball->blocks = false; scrollOfFireball->pickable = new Fireball(3, 12); engine->actors.push(scrollOfFireball); @@ -233,7 +237,7 @@ void Map::addItem(int x, int y) { else { // create a scroll of confusion Actor* scrollOfConfusion = new Actor(x, y, "#", "scroll of confusion", - TCOD_ColorRGB(255, 100, 100)); + engine->gui->lightRed); scrollOfConfusion->blocks = false; scrollOfConfusion->pickable = new Confuser(10, 8); engine->actors.push(scrollOfConfusion); diff --git a/Pickable.cpp b/Pickable.cpp index c258dc7..39577cb 100644 --- a/Pickable.cpp +++ b/Pickable.cpp @@ -32,7 +32,7 @@ void Pickable::drop(Actor* owner, Actor* wearer) { engine->actors.push(owner); owner->x = wearer->x; owner->y = wearer->y; - engine->gui->message(TCOD_ColorRGB(200,200,200), "%s drops a %s.", + engine->gui->message(engine->gui->lightGrey, "%s drops a %s.", wearer->name.c_str(), owner->name.c_str()); } } diff --git a/menu_background1.png b/menu_background1.png index 3690898eceff719653984dc7bba68c32a88a0bd1..960c6b529528e1afaf9ae4f334adc2cfb724d7e3 100644 GIT binary patch literal 14541 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%0DO8z{F@!3bXY;Wm=8=F+TaM91HWai|3=$FOnw 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 diff --git a/terminal10x16_gs_ro.png b/terminal10x16_gs_ro.png new file mode 100644 index 0000000000000000000000000000000000000000..e40aa9912a783bb00231c0fbf638aef0f14499f8 GIT binary patch literal 5699 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