1 #include "SelectItem.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/Item.h"
9 #include "../../graphics/Frame.h"
10 #include "../../math/Vector.h"
12 using app::Application;
16 using graphics::Frame;
20 void SelectItem::OnEnterState(SDL_Surface *screen) {
21 OnResize(screen->w, screen->h);
24 void SelectItem::OnExitState(SDL_Surface *screen) {
28 void SelectItem::OnResumeState(SDL_Surface *screen) {
29 if (battle->ActiveHero().GetAttackChoice().Selection().HasSelected()) {
30 battle->ActiveHero().GetAttackChoice().SetType(AttackChoice::ITEM);
31 battle->ActiveHero().GetAttackChoice().SetItem(battle->ItemMenu().Selected());
36 void SelectItem::OnPauseState(SDL_Surface *screen) {
41 void SelectItem::OnResize(int width, int height) {
42 const Vector<int> offset = battle->ScreenOffset();
44 const Resources &res = battle->Res();
45 const Frame &frame = *res.selectFrame;
47 framePosition = offset + frame.BorderSize();
48 frameSize = Vector<int>(
49 battle->Width() - 2 * frame.BorderWidth(),
50 res.normalFont->CharHeight() * 13);
52 headlinePosition = offset + Vector<int>(
53 2 * frame.BorderWidth() + res.normalFont->CharWidth(),
54 2 * frame.BorderHeight());
56 menuPosition = offset + Vector<int>(
57 2 * frame.BorderWidth() + res.normalFont->CharWidth(),
58 2 * frame.BorderHeight() + 2 * res.normalFont->CharHeight());
62 void SelectItem::HandleEvents(const Input &input) {
63 if (input.JustPressed(Input::ACTION_A)) {
64 if (battle->ItemMenu().SelectedIsEnabled()) {
65 AttackChoice &ac(battle->ActiveHero().GetAttackChoice());
66 const Item *item(battle->ItemMenu().Selected());
67 ac.Selection().Reset();
68 if (item->GetTargetingMode().TargetsAlly()) {
69 ac.Selection().SelectHeroes();
71 ac.Selection().SelectMonsters();
73 if (item->GetTargetingMode().TargetsAll()) {
74 ac.SetType(AttackChoice::ITEM);
79 if (item->GetTargetingMode().TargetsSingle()) {
80 ac.Selection().SetSingle();
82 ac.Selection().SetMultiple();
84 Ctrl().PushState(new SelectTarget(battle, parent, &ac.Selection(), battle->Res().itemTargetCursor));
88 if (input.JustPressed(Input::ACTION_B)) {
89 Ctrl().PopState(); // return control to parent
91 if (input.JustPressed(Input::PAD_UP)) {
92 battle->ItemMenu().PreviousRow();
94 if (input.JustPressed(Input::PAD_RIGHT)) {
95 battle->ItemMenu().NextItem();
97 if (input.JustPressed(Input::PAD_DOWN)) {
98 battle->ItemMenu().NextRow();
100 if (input.JustPressed(Input::PAD_LEFT)) {
101 battle->ItemMenu().PreviousItem();
105 void SelectItem::UpdateWorld(Uint32 deltaT) {
109 void SelectItem::Render(SDL_Surface *screen) {
110 parent->Render(screen);
112 RenderHeadline(screen);
116 void SelectItem::RenderFrame(SDL_Surface *screen) {
117 const Frame &frame = *battle->Res().selectFrame;
118 frame.Draw(screen, framePosition, frameSize.X(), frameSize.Y());
121 void SelectItem::RenderHeadline(SDL_Surface *screen) {
122 const Resources &res = battle->Res();
123 res.normalFont->DrawString(res.itemMenuHeadline, screen, headlinePosition);
126 void SelectItem::RenderMenu(SDL_Surface *screen) {
127 battle->ItemMenu().Draw(screen, menuPosition);