1 #include "SelectIkari.h"
3 #include "SelectAttackType.h"
4 #include "SelectTarget.h"
5 #include "../BattleState.h"
6 #include "../../app/Application.h"
7 #include "../../app/Input.h"
8 #include "../../common/Ikari.h"
9 #include "../../common/Item.h"
10 #include "../../graphics/Frame.h"
11 #include "../../math/Vector.h"
13 using app::Application;
17 using graphics::Frame;
21 void SelectIkari::OnEnterState(SDL_Surface *screen) {
22 OnResize(screen->w, screen->h);
25 void SelectIkari::OnExitState(SDL_Surface *screen) {
29 void SelectIkari::OnResumeState(SDL_Surface *screen) {
30 if (battle->ActiveHero().GetAttackChoice().Selection().HasSelected()) {
31 battle->ActiveHero().GetAttackChoice().SetType(AttackChoice::IKARI);
32 battle->ActiveHero().GetAttackChoice().SetItem(battle->ActiveHero().IkariMenu().Selected());
37 void SelectIkari::OnPauseState(SDL_Surface *screen) {
42 void SelectIkari::OnResize(int width, int height) {
43 const Vector<int> offset = battle->ScreenOffset();
45 const Resources &res = battle->Res();
46 const Frame &frame = *res.selectFrame;
48 framePosition = offset + frame.BorderSize();
49 frameSize = Vector<int>(
50 battle->Width() - 2 * frame.BorderWidth(),
51 res.normalFont->CharHeight() * 13);
53 headlinePosition = offset + Vector<int>(
54 2 * frame.BorderWidth() + res.normalFont->CharWidth(),
55 2 * frame.BorderHeight());
57 menuPosition = offset + Vector<int>(
58 2 * frame.BorderWidth() + res.normalFont->CharWidth(),
59 2 * frame.BorderHeight() + 2 * res.normalFont->CharHeight());
63 void SelectIkari::HandleEvents(const Input &input) {
64 if (input.JustPressed(Input::ACTION_A)) {
65 if (battle->ActiveHero().IkariMenu().SelectedIsEnabled() && battle->ActiveHero().IkariMenu().Selected()->HasIkari()) {
66 AttackChoice &ac(battle->ActiveHero().GetAttackChoice());
67 const Ikari *ikari(battle->ActiveHero().IkariMenu().Selected()->GetIkari());
68 ac.Selection().Reset();
69 if (ikari->GetTargetingMode().TargetsAlly()) {
70 ac.Selection().SelectHeroes();
72 ac.Selection().SelectMonsters();
74 if (ikari->GetTargetingMode().TargetsAll()) {
75 ac.SetType(AttackChoice::IKARI);
76 ac.SetItem(battle->ActiveHero().IkariMenu().Selected());
80 if (ikari->GetTargetingMode().TargetsSingle()) {
81 ac.Selection().SetSingle();
83 ac.Selection().SetMultiple();
85 Ctrl().PushState(new SelectTarget(battle, parent, &ac.Selection(), ikari->IsMagical() ? battle->Res().magicTargetCursor : battle->Res().weaponTargetCursor));
89 if (input.JustPressed(Input::ACTION_B)) {
90 Ctrl().PopState(); // return control to parent
92 if (input.JustPressed(Input::PAD_UP)) {
93 battle->ActiveHero().IkariMenu().PreviousRow();
95 if (input.JustPressed(Input::PAD_RIGHT)) {
96 battle->ActiveHero().IkariMenu().NextItem();
98 if (input.JustPressed(Input::PAD_DOWN)) {
99 battle->ActiveHero().IkariMenu().NextRow();
101 if (input.JustPressed(Input::PAD_LEFT)) {
102 battle->ActiveHero().IkariMenu().PreviousItem();
106 void SelectIkari::UpdateWorld(Uint32 deltaT) {
110 void SelectIkari::Render(SDL_Surface *screen) {
111 parent->Render(screen);
113 RenderHeadline(screen);
117 void SelectIkari::RenderFrame(SDL_Surface *screen) {
118 const Frame &frame = *battle->Res().selectFrame;
119 frame.Draw(screen, framePosition, frameSize.X(), frameSize.Y());
122 void SelectIkari::RenderHeadline(SDL_Surface *screen) {
123 const Resources &res = battle->Res();
124 res.normalFont->DrawString(res.ikariMenuHeadline, screen, headlinePosition);
127 void SelectIkari::RenderMenu(SDL_Surface *screen) {
128 battle->ActiveHero().IkariMenu().Draw(screen, menuPosition);