From 3d69f521b593457304b282e5f23e36ab165288b6 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Sun, 10 Feb 2013 12:07:08 +0100 Subject: [PATCH] moved upgrade process to battle class --- src/battle/Battle.cpp | 20 +++++ src/battle/Battle.h | 5 ++ src/battle/states/VictoryState.cpp | 113 +++++++++++++---------------- src/battle/states/VictoryState.h | 8 +- src/common/Capsule.cpp | 17 +++-- src/common/Capsule.h | 4 +- src/common/Hero.cpp | 11 ++- src/common/Hero.h | 9 +-- src/common/Upgrade.h | 41 +++++++++++ 9 files changed, 145 insertions(+), 83 deletions(-) create mode 100644 src/common/Upgrade.h diff --git a/src/battle/Battle.cpp b/src/battle/Battle.cpp index 7bfa940..cc481e3 100644 --- a/src/battle/Battle.cpp +++ b/src/battle/Battle.cpp @@ -3,12 +3,17 @@ #include "AttackChoice.h" #include "PartyLayout.h" #include "TargetSelection.h" +#include "../common/GameState.h" #include "../common/Stats.h" +#include "../common/Upgrade.h" #include #include +using common::GameState; using common::Stats; +using common::Upgrade; +using std::vector; namespace battle { @@ -382,4 +387,19 @@ bool Battle::Defeat() const { return true; } + +void Battle::ApplyRewards( + GameState &state, + vector &info) { + for (vector::iterator i(HeroesBegin()), end(HeroesEnd()); + i != end; ++i) { + if (i->Health() <= 0) continue; + i->Master().AddExperience(expReward, info); + } + if (capsule.Health() > 0) { + capsule.Master().AddExperience(expReward, info); + } + state.money += goldReward; +} + } diff --git a/src/battle/Battle.h b/src/battle/Battle.h index 314288c..d794ebb 100644 --- a/src/battle/Battle.h +++ b/src/battle/Battle.h @@ -8,7 +8,9 @@ namespace battle { class TargetSelection; } namespace common { + struct GameState; class Stats; + class Upgrade; } #include "Capsule.h" @@ -111,6 +113,9 @@ public: int ExpReward() const { return expReward; } int GoldReward() const { return goldReward; } + void ApplyRewards( + common::GameState &, + std::vector &); private: const PartyLayout *heroesLayout; diff --git a/src/battle/states/VictoryState.cpp b/src/battle/states/VictoryState.cpp index 409f084..64318e0 100644 --- a/src/battle/states/VictoryState.cpp +++ b/src/battle/states/VictoryState.cpp @@ -8,6 +8,7 @@ #include "../../common/Capsule.h" #include "../../common/GameConfig.h" #include "../../common/GameState.h" +#include "../../common/Upgrade.h" #include "../../math/Vector.h" #include "../../graphics/Font.h" #include "../../graphics/Frame.h" @@ -16,6 +17,8 @@ using app::Application; using app::Input; +using common::GameState; +using common::Upgrade; using graphics::Font; using graphics::Frame; using math::Vector; @@ -42,81 +45,63 @@ void VictoryState::LoadResults() { lines.push_back(""); - vector upgrade; - for (std::vector::iterator - i(battle->HeroesBegin()), end(battle->HeroesEnd()); + GameState &state = *parent->Game().state; + vector upgrade; + battle->ApplyRewards(state, upgrade); + for (std::vector::const_iterator + i(upgrade.begin()), end(upgrade.end()); i != end; ++i) { - if (i->Health() <= 0) continue; - upgrade.clear(); - common::Hero &hero = i->Master(); - hero.AddExperience(battle->ExpReward(), upgrade); - LoadResults(hero.Name(), upgrade, lines); - s.str(""); - s << hero.Name() << " next level " << hero.NextLevel(); - lines.push_back(s.str()); - } - - if (battle->HasCapsule()) { - const Capsule &capsule = battle->GetCapsule(); - if (capsule.Health() > 0) { - s.str(""); - s << capsule.Name() << " next level " << capsule.Master().NextLevel(); - lines.push_back(s.str()); - } + LoadResult(*i, lines); } lines.push_back(""); s.str(""); - s << parent->Game().state->money << " gold"; + s << state.money << " gold"; lines.push_back(s.str()); } -void VictoryState::LoadResults( - const char *who, - const vector &upgrade, +void VictoryState::LoadResult( + const Upgrade &u, vector &lines) { std::stringstream s; - for (vector::const_iterator - i(upgrade.begin()), end(upgrade.end()); - i != end; ++i) { - s.str(""); - switch (i->type) { - case common::Hero::UPGRADE_LVL: - s << who << " levels up."; - break; - case common::Hero::UPGRADE_MHP: - s << "Max. HP increases by " << i->amount; - break; - case common::Hero::UPGRADE_MMP: - s << "Max. MP increases by " << i->amount; - break; - case common::Hero::UPGRADE_ATK: - s << "ATK increases by " << i->amount; - break; - case common::Hero::UPGRADE_DFP: - s << "DFP increases by " << i->amount; - break; - case common::Hero::UPGRADE_STR: - s << "STR increases by " << i->amount; - break; - case common::Hero::UPGRADE_AGL: - s << "AGL increases by " << i->amount; - break; - case common::Hero::UPGRADE_INT: - s << "INT increases by " << i->amount; - break; - case common::Hero::UPGRADE_GUT: - s << "GUT increases by " << i->amount; - break; - case common::Hero::UPGRADE_MGR: - s << "MGR increases by " << i->amount; - break; - default: - s << "There's an error in common::Hero::" - "AddExperience()"; - } - lines.push_back(s.str()); + switch (u.GetType()) { + case Upgrade::LEVEL_UP: + s << u.Name() << " levels up."; + break; + case Upgrade::MAX_HEALTH: + s << "Max. HP increases by " << u.Amount(); + break; + case Upgrade::MAX_MAGIC: + s << "Max. MP increases by " << u.Amount(); + break; + case Upgrade::ATTACK: + s << "ATK increases by " << u.Amount(); + break; + case Upgrade::DEFENSE: + s << "DFP increases by " << u.Amount(); + break; + case Upgrade::STRENGTH: + s << "STR increases by " << u.Amount(); + break; + case Upgrade::AGILITY: + s << "AGL increases by " << u.Amount(); + break; + case Upgrade::INTELLIGENCE: + s << "INT increases by " << u.Amount(); + break; + case Upgrade::GUT: + s << "GUT increases by " << u.Amount(); + break; + case Upgrade::MAGIC_RSISTANCE: + s << "MGR increases by " << u.Amount(); + break; + case Upgrade::LEVEL_NEXT: + s << u.Name() << " next level " << u.Amount(); + break; + default: + s << "unknown upgrade type " << u.GetType(); } + lines.push_back(s.str()); } void VictoryState::OnExitState(SDL_Surface *screen) { diff --git a/src/battle/states/VictoryState.h b/src/battle/states/VictoryState.h index 41a541e..6c3befe 100644 --- a/src/battle/states/VictoryState.h +++ b/src/battle/states/VictoryState.h @@ -5,6 +5,9 @@ namespace battle { class Battle; class BattleState; } +namespace common { + class Upgrade; +} #include "../../app/State.h" #include "../../common/Hero.h" @@ -42,9 +45,8 @@ private: private: void LoadResults(); - void LoadResults( - const char *, - const std::vector &, + void LoadResult( + const common::Upgrade &, std::vector &); void RenderFrame(SDL_Surface *screen); void RenderLines(SDL_Surface *screen); diff --git a/src/common/Capsule.cpp b/src/common/Capsule.cpp index 083931c..de2ea56 100644 --- a/src/common/Capsule.cpp +++ b/src/common/Capsule.cpp @@ -1,8 +1,9 @@ #include "Capsule.h" -#include "../common/Item.h" -#include "../common/Spell.h" -#include "../common/Stats.h" +#include "Item.h" +#include "Spell.h" +#include "Stats.h" +#include "Upgrade.h" #include "../graphics/Animation.h" #include "../graphics/Sprite.h" #include "../loader/Interpreter.h" @@ -82,9 +83,11 @@ int Capsule::NextLevel() const { } } -void Capsule::AddExperience(int exp, vector &info) { +void Capsule::AddExperience(int exp, vector &info) { if (level > numLevels) { // don't award any experience if at highest level + info.push_back(Upgrade( + name, Upgrade::LEVEL_NEXT, NextLevel())); return; } int remain = exp; @@ -94,15 +97,19 @@ void Capsule::AddExperience(int exp, vector &info) { remain -= added; ++level; - info.push_back(Hero::UpgradeInfo(Hero::UPGRADE_LVL, level)); + info.push_back(Upgrade(name, Upgrade::LEVEL_UP, level)); // TODO: upgrade attributes and push info if (level > numLevels) { + info.push_back(Upgrade( + name, Upgrade::LEVEL_NEXT, NextLevel())); return; } } experience += remain; + info.push_back(Upgrade( + name, Upgrade::LEVEL_NEXT, NextLevel())); } diff --git a/src/common/Capsule.h b/src/common/Capsule.h index a1afc1b..1e2a631 100644 --- a/src/common/Capsule.h +++ b/src/common/Capsule.h @@ -3,13 +3,13 @@ namespace common { class Item; + class Upgrade; } namespace graphics { class Animation; class Sprite; } -#include "Hero.h" #include "../common/Stats.h" #include "../math/Vector.h" @@ -67,7 +67,7 @@ public: int Experience() const { return experience; } int NextLevel() const; - void AddExperience(int, std::vector &); + void AddExperience(int, std::vector &); graphics::Sprite *BattleSprite(); const graphics::Sprite *BattleSprite() const; diff --git a/src/common/Hero.cpp b/src/common/Hero.cpp index 4e7b5b9..beeab83 100644 --- a/src/common/Hero.cpp +++ b/src/common/Hero.cpp @@ -2,6 +2,7 @@ #include "Item.h" #include "Spell.h" +#include "Upgrade.h" #include "../graphics/Animation.h" #include "../graphics/Sprite.h" #include "../loader/Interpreter.h" @@ -70,9 +71,11 @@ int Hero::NextLevel() const { } } -void Hero::AddExperience(int exp, vector &info) { +void Hero::AddExperience(int exp, vector &info) { if (level > numLevels) { // don't award any experience if at highest level + info.push_back(Upgrade( + name, Upgrade::LEVEL_NEXT, NextLevel())); return; } int remain = exp; @@ -82,15 +85,19 @@ void Hero::AddExperience(int exp, vector &info) { remain -= added; ++level; - info.push_back(UpgradeInfo(UPGRADE_LVL, level)); + info.push_back(Upgrade(name, Upgrade::LEVEL_UP, level)); // TODO: upgrade attributes and push info if (level > numLevels) { + info.push_back(Upgrade( + name, Upgrade::LEVEL_NEXT, NextLevel())); return; } } experience += remain; + info.push_back(Upgrade( + name, Upgrade::LEVEL_NEXT, NextLevel())); } diff --git a/src/common/Hero.h b/src/common/Hero.h index 2016396..1b4c8d1 100644 --- a/src/common/Hero.h +++ b/src/common/Hero.h @@ -4,6 +4,7 @@ namespace common { class Item; class Spell; + class Upgrade; } namespace graphics { class Animation; @@ -73,13 +74,7 @@ public: int Experience() const { return experience; } int NextLevel() const; - struct UpgradeInfo { - UpgradeType type; - int amount; - UpgradeInfo(UpgradeType t, int a = 0) - : type(t), amount(a) { } - }; - void AddExperience(int, std::vector &); + void AddExperience(int, std::vector &); bool CanEquip(const Item &) const; bool CanInvoke(const Spell &) const; diff --git a/src/common/Upgrade.h b/src/common/Upgrade.h new file mode 100644 index 0000000..0a5c079 --- /dev/null +++ b/src/common/Upgrade.h @@ -0,0 +1,41 @@ +#ifndef COMMON_UPGRADE_H_ +#define COMMON_UPGRADE_H_ + +namespace common { + +class Upgrade { + +public: + enum Type { + LEVEL_UP, + MAX_HEALTH, + MAX_MAGIC, + ATTACK, + DEFENSE, + STRENGTH, + AGILITY, + INTELLIGENCE, + GUT, + MAGIC_RSISTANCE, + LEVEL_NEXT, + }; + +public: + Upgrade(const char *name, Type type, int amount) + : name(name), type(type), amount(amount) { } + +public: + const char *Name() const { return name; } + Type GetType() const { return type; } + int Amount() const { return amount; } + +private: + const char *name; + Type type; + int amount; + +}; + +} + +#endif -- 2.39.2