]> git.localhorst.tv Git - l2e.git/blobdiff - src/battle/states/VictoryState.cpp
put victory strings in battle resources
[l2e.git] / src / battle / states / VictoryState.cpp
index 3516bdeaf5150802642f5022864fe120e3712134..59d4495f68c5d4c0c4ef7349b229016235dc83f2 100644 (file)
@@ -3,21 +3,33 @@
 #include "../Battle.h"
 #include "../BattleState.h"
 #include "../Hero.h"
+#include "../Resources.h"
 #include "../../app/Application.h"
 #include "../../app/Input.h"
-#include "../../common/Hero.h"
+#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"
 
+#include <iomanip>
 #include <sstream>
 
 using app::Application;
 using app::Input;
+using common::GameState;
+using common::Upgrade;
 using graphics::Font;
 using graphics::Frame;
 using math::Vector;
+using std::left;
+using std::right;
+using std::setfill;
+using std::setw;
 using std::string;
+using std::stringstream;
 using std::vector;
 
 namespace battle {
@@ -28,25 +40,107 @@ void VictoryState::OnEnterState(SDL_Surface *screen) {
 }
 
 void VictoryState::LoadResults() {
+       const Resources &res = parent->Res();
        lines.clear();
 
-       std::stringstream s;
-       s << "Gets " << battle->ExpReward() << " EXP";
+       stringstream s;
+       s << res.victoryGetsText << ' '
+                       << battle->ExpReward() << ' '
+                       << res.victoryExpText << '.';
        lines.push_back(s.str());
 
        s.str("");
-       s << "Gets " << battle->GoldReward() << " gold";
+       s << res.victoryGetsText << ' '
+                       << battle->GoldReward() << ' '
+                       << res.victoryGoldText << '.';
        lines.push_back(s.str());
 
-       for (std::vector<Hero>::const_iterator
-                       i(battle->HeroesBegin()), end(battle->HeroesEnd());
+       lines.push_back("");
+
+       GameState &state = *parent->Game().state;
+       vector<Upgrade> upgrade;
+       battle->ApplyRewards(state, upgrade);
+       for (vector<Upgrade>::const_iterator
+                       i(upgrade.begin()), end(upgrade.end());
                        i != end; ++i) {
-               if (i->Health() <= 0) continue;
-               const common::Hero &hero = i->Master();
-               s.str("");
-               s << hero.Name() << " next level " << hero.NextLevel();
-               lines.push_back(s.str());
+               LoadResult(*i, lines);
+       }
+
+       s.str("");
+       s << state.money << ' ' << res.victoryGoldText;
+       string goldStr = s.str();
+
+       lines.push_back("");
+       s.str("");
+       s << right << setw(28) << setfill(' ') << goldStr;
+       lines.push_back(s.str());
+}
+
+void VictoryState::LoadResult(
+               const Upgrade &u,
+               vector<string> &lines) {
+       const Resources &res = parent->Res();
+       stringstream s;
+       switch (u.GetType()) {
+               case Upgrade::LEVEL_UP:
+                       s << left << setw(6) << setfill(' ') << u.Name()
+                                       << res.victoryLevelUpText << '.';
+                       break;
+               case Upgrade::MAX_HEALTH:
+                       s << res.victoryMHPText << ' '
+                                       << res.victoryUpgradeText << ' '
+                                       << u.Amount() << '.';
+                       break;
+               case Upgrade::MAX_MAGIC:
+                       s << res.victoryMMPText << ' '
+                                       << res.victoryUpgradeText << ' '
+                                       << u.Amount() << '.';
+                       break;
+               case Upgrade::ATTACK:
+                       s << res.victoryATPText << ' '
+                                       << res.victoryUpgradeText << ' '
+                                       << u.Amount() << '.';
+                       break;
+               case Upgrade::DEFENSE:
+                       s << res.victoryDFPText << ' '
+                                       << res.victoryUpgradeText << ' '
+                                       << u.Amount() << '.';
+                       break;
+               case Upgrade::STRENGTH:
+                       s << res.victorySTRText << ' '
+                                       << res.victoryUpgradeText << ' '
+                                       << u.Amount() << '.';
+                       break;
+               case Upgrade::AGILITY:
+                       s << res.victoryAGLText << ' '
+                                       << res.victoryUpgradeText << ' '
+                                       << u.Amount() << '.';
+                       break;
+               case Upgrade::INTELLIGENCE:
+                       s << res.victoryINTText << ' '
+                                       << res.victoryUpgradeText << ' '
+                                       << u.Amount() << '.';
+                       break;
+               case Upgrade::GUT:
+                       s << res.victoryGUTText << ' '
+                                       << res.victoryUpgradeText << ' '
+                                       << u.Amount() << '.';
+                       break;
+               case Upgrade::MAGIC_RESISTANCE:
+                       s << res.victoryMGRText << ' '
+                                       << res.victoryUpgradeText << ' '
+                                       << u.Amount() << '.';
+                       break;
+               case Upgrade::LEVEL_NEXT:
+                       s << setw(7) << setfill(' ')
+                                       << left << u.Name() << ' '
+                                       << res.victoryNextLevelText
+                                       << ' ' << u.Amount();
+                       break;
+               default:
+                       s << "unknown upgrade type " << u.GetType();
        }
+       lines.push_back(s.str());
 }
 
 void VictoryState::OnExitState(SDL_Surface *screen) {
@@ -54,7 +148,7 @@ void VictoryState::OnExitState(SDL_Surface *screen) {
 }
 
 void VictoryState::OnResumeState(SDL_Surface *screen) {
-       timer = GraphicsTimers().StartCountdown(1500);
+
 }
 
 void VictoryState::OnPauseState(SDL_Surface *screen) {
@@ -77,7 +171,36 @@ void VictoryState::OnResize(int width, int height) {
 
 
 void VictoryState::HandleEvents(const Input &input) {
-       if (timer.Finished()) {
+       if (input.JustPressed(Input::ACTION_A)) {
+               ++cursor;
+               timer = GraphicsTimers().StartInterval(150);
+       } else if (input.IsDown(Input::ACTION_A)
+                       && timer.JustHit()) {
+               if (timer.Iteration() > 3) {
+                       ++cursor;
+                       stalling = false;
+               } else {
+                       stalling = true;
+               }
+       } else if (input.JustPressed(Input::SHOULDER_LEFT)) {
+               ++cursor;
+               timer = GraphicsTimers().StartInterval(150);
+       } else if (input.IsDown(Input::SHOULDER_LEFT)
+                       && timer.JustHit()) {
+               if (timer.Iteration() > 3) {
+                       ++cursor;
+                       stalling = false;
+               } else {
+                       stalling = true;
+               }
+       }
+       if (timer.JustHit()
+                       && !input.IsDown(Input::ACTION_A)
+                       && !input.IsDown(Input::SHOULDER_LEFT)) {
+               timer.Clear();
+               stalling = false;
+       }
+       if (cursor >= int(lines.size())) {
                Ctrl().PopState(); // pop self
        }
 }
@@ -89,6 +212,7 @@ void VictoryState::UpdateWorld(Uint32 deltaT) {
 
 void VictoryState::Render(SDL_Surface *screen) {
        parent->RenderBackground(screen);
+       parent->RenderHeroes(screen);
        RenderFrame(screen);
        RenderLines(screen);
 }
@@ -101,12 +225,30 @@ void VictoryState::RenderFrame(SDL_Surface *screen) {
 void VictoryState::RenderLines(SDL_Surface *screen) {
        // naive implementation
        const Font &font = *parent->Res().normalFont;
+       const Vector<int> lineBreak = Vector<int>(
+                       0, font.CharHeight() * 5 / 4);
+       const int start = cursor > 7 ? cursor - 8 : 0;
        Vector<int> position = textPosition;
-       for (vector<string>::const_iterator
-                       i(lines.begin()), end(lines.end());
-                       i != end; ++i) {
-               font.DrawString(i->c_str(), screen, position);
-               position.Y() += font.CharHeight();
+
+       int end = cursor + 1;
+
+       if (start > 0) {
+               if (timer.Running() && !stalling) {
+                       --end;
+                       position += lineBreak;
+                       const int correction = timer.IterationElapsed();
+                       if (correction > 0) {
+               //              ++start;
+                               position.Y() -= lineBreak.Y() * correction / timer.TargetTime();
+                       }
+               }
+       }
+
+       if (end > int(lines.size())) end = lines.size();
+
+       for (int i = start; i < end; ++i) {
+               font.DrawString(lines[i].c_str(), screen, position);
+               position += lineBreak;
        }
 }