#include "AttackChoice.h"
#include "PartyLayout.h"
#include "TargetSelection.h"
+#include "../common/GameState.h"
#include "../common/Stats.h"
+#include "../common/Upgrade.h"
#include <cassert>
#include <stdexcept>
+using common::GameState;
using common::Stats;
+using common::Upgrade;
+using std::vector;
namespace battle {
return true;
}
+
+void Battle::ApplyRewards(
+ GameState &state,
+ vector<Upgrade> &info) {
+ for (vector<Hero>::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;
+}
+
}
class TargetSelection;
}
namespace common {
+ struct GameState;
class Stats;
+ class Upgrade;
}
#include "Capsule.h"
int ExpReward() const { return expReward; }
int GoldReward() const { return goldReward; }
+ void ApplyRewards(
+ common::GameState &,
+ std::vector<common::Upgrade> &);
private:
const PartyLayout *heroesLayout;
#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"
using app::Application;
using app::Input;
+using common::GameState;
+using common::Upgrade;
using graphics::Font;
using graphics::Frame;
using math::Vector;
lines.push_back("");
- vector<common::Hero::UpgradeInfo> upgrade;
- for (std::vector<Hero>::iterator
- i(battle->HeroesBegin()), end(battle->HeroesEnd());
+ GameState &state = *parent->Game().state;
+ vector<Upgrade> upgrade;
+ battle->ApplyRewards(state, upgrade);
+ for (std::vector<Upgrade>::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<common::Hero::UpgradeInfo> &upgrade,
+void VictoryState::LoadResult(
+ const Upgrade &u,
vector<string> &lines) {
std::stringstream s;
- for (vector<common::Hero::UpgradeInfo>::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) {
class Battle;
class BattleState;
}
+namespace common {
+ class Upgrade;
+}
#include "../../app/State.h"
#include "../../common/Hero.h"
private:
void LoadResults();
- void LoadResults(
- const char *,
- const std::vector<common::Hero::UpgradeInfo> &,
+ void LoadResult(
+ const common::Upgrade &,
std::vector<std::string> &);
void RenderFrame(SDL_Surface *screen);
void RenderLines(SDL_Surface *screen);
#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"
}
}
-void Capsule::AddExperience(int exp, vector<Hero::UpgradeInfo> &info) {
+void Capsule::AddExperience(int exp, vector<Upgrade> &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;
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()));
}
namespace common {
class Item;
+ class Upgrade;
}
namespace graphics {
class Animation;
class Sprite;
}
-#include "Hero.h"
#include "../common/Stats.h"
#include "../math/Vector.h"
int Experience() const { return experience; }
int NextLevel() const;
- void AddExperience(int, std::vector<Hero::UpgradeInfo> &);
+ void AddExperience(int, std::vector<Upgrade> &);
graphics::Sprite *BattleSprite();
const graphics::Sprite *BattleSprite() const;
#include "Item.h"
#include "Spell.h"
+#include "Upgrade.h"
#include "../graphics/Animation.h"
#include "../graphics/Sprite.h"
#include "../loader/Interpreter.h"
}
}
-void Hero::AddExperience(int exp, vector<UpgradeInfo> &info) {
+void Hero::AddExperience(int exp, vector<Upgrade> &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;
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()));
}
namespace common {
class Item;
class Spell;
+ class Upgrade;
}
namespace graphics {
class Animation;
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<UpgradeInfo> &);
+ void AddExperience(int, std::vector<Upgrade> &);
bool CanEquip(const Item &) const;
bool CanInvoke(const Spell &) const;
--- /dev/null
+#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