From 57675025108b7ad3989737f18ebfeec8e5e44889 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Thu, 9 Aug 2012 01:48:04 +0200 Subject: [PATCH] added item select state --- Debug/src/battle/states/subdir.mk | 3 + Release/src/battle/states/subdir.mk | 3 + src/battle/BattleState.cpp | 12 +++ src/battle/BattleState.h | 3 + src/battle/Resources.h | 5 +- src/battle/states/SelectAttackType.cpp | 4 +- src/battle/states/SelectItem.cpp | 109 +++++++++++++++++++++++++ src/battle/states/SelectItem.h | 53 ++++++++++++ src/main.cpp | 3 + 9 files changed, 192 insertions(+), 3 deletions(-) create mode 100644 src/battle/states/SelectItem.cpp create mode 100644 src/battle/states/SelectItem.h diff --git a/Debug/src/battle/states/subdir.mk b/Debug/src/battle/states/subdir.mk index bb15270..6697dcb 100644 --- a/Debug/src/battle/states/subdir.mk +++ b/Debug/src/battle/states/subdir.mk @@ -5,16 +5,19 @@ # Add inputs and outputs from these tool invocations to the build variables CPP_SRCS += \ ../src/battle/states/SelectAttackType.cpp \ +../src/battle/states/SelectItem.cpp \ ../src/battle/states/SelectMoveAction.cpp \ ../src/battle/states/SelectSpell.cpp OBJS += \ ./src/battle/states/SelectAttackType.o \ +./src/battle/states/SelectItem.o \ ./src/battle/states/SelectMoveAction.o \ ./src/battle/states/SelectSpell.o CPP_DEPS += \ ./src/battle/states/SelectAttackType.d \ +./src/battle/states/SelectItem.d \ ./src/battle/states/SelectMoveAction.d \ ./src/battle/states/SelectSpell.d diff --git a/Release/src/battle/states/subdir.mk b/Release/src/battle/states/subdir.mk index a1256fc..5fdaab0 100644 --- a/Release/src/battle/states/subdir.mk +++ b/Release/src/battle/states/subdir.mk @@ -5,16 +5,19 @@ # Add inputs and outputs from these tool invocations to the build variables CPP_SRCS += \ ../src/battle/states/SelectAttackType.cpp \ +../src/battle/states/SelectItem.cpp \ ../src/battle/states/SelectMoveAction.cpp \ ../src/battle/states/SelectSpell.cpp OBJS += \ ./src/battle/states/SelectAttackType.o \ +./src/battle/states/SelectItem.o \ ./src/battle/states/SelectMoveAction.o \ ./src/battle/states/SelectSpell.o CPP_DEPS += \ ./src/battle/states/SelectAttackType.d \ +./src/battle/states/SelectItem.d \ ./src/battle/states/SelectMoveAction.d \ ./src/battle/states/SelectSpell.d diff --git a/src/battle/BattleState.cpp b/src/battle/BattleState.cpp index d7b5a07..6db79f8 100644 --- a/src/battle/BattleState.cpp +++ b/src/battle/BattleState.cpp @@ -74,6 +74,18 @@ void BattleState::EnterState(Application &ctrl, SDL_Surface *screen) { spellMenus.back().Add("Spark : 3", 0); heroTags.push_back(HeroTag(&heroes[i], &attackChoices[i], res, HeroTag::Alignment((i + 1) % 2))); } + itemMenu = res->itemMenuPrototype; + itemMenu.Add("Antidote : 9", 0); + itemMenu.Add("Magic jar : 4", 0); + itemMenu.Add("Miracle : 4", 0); + itemMenu.Add("Hi-Potion : 6", 0); + itemMenu.Add("Hi-Magic : 7", 0); + itemMenu.Add("Regain : 4", 0); + itemMenu.Add("Power potion: 4", 0, false); + itemMenu.Add("Life potion : 1", 0, false); + itemMenu.Add("Escape : 2", 0, false); + itemMenu.Add("Power gourd : 3", 0); + itemMenu.Add("Mystery pin : 2", 0); } void BattleState::ExitState(Application &ctrl, SDL_Surface *screen) { diff --git a/src/battle/BattleState.h b/src/battle/BattleState.h index f6890f3..65e8727 100644 --- a/src/battle/BattleState.h +++ b/src/battle/BattleState.h @@ -80,6 +80,8 @@ public: bool AttackSelectionDone() const { return activeHero >= (int) heroes.size(); } graphics::Menu &GetSpellMenu() { return spellMenus[activeHero]; } const graphics::Menu &GetSpellMenu() const { return spellMenus[activeHero]; } + graphics::Menu &GetItemMenu() { return itemMenu; } + const graphics::Menu &GetItemMenu() const { return itemMenu; } public: geometry::Vector CalculateScreenOffset(SDL_Surface *screen) const { @@ -107,6 +109,7 @@ private: std::vector monsters; std::vector heroes; std::vector > spellMenus; + graphics::Menu itemMenu; std::vector heroTags; std::vector attackChoices; int activeHero; diff --git a/src/battle/Resources.h b/src/battle/Resources.h index 3876072..0c64667 100644 --- a/src/battle/Resources.h +++ b/src/battle/Resources.h @@ -44,6 +44,9 @@ struct Resources { const char *spellMenuHeadline; graphics::Menu spellMenuPrototype; + const char *itemMenuHeadline; + graphics::Menu itemMenuPrototype; + Resources() : moveIcons(0) @@ -65,8 +68,8 @@ struct Resources { , disabledFont(0) , menuCursor(0) - , spellMenuHeadline("") + , itemMenuHeadline("") { } }; diff --git a/src/battle/states/SelectAttackType.cpp b/src/battle/states/SelectAttackType.cpp index 7dd06f6..c5e0bba 100644 --- a/src/battle/states/SelectAttackType.cpp +++ b/src/battle/states/SelectAttackType.cpp @@ -7,6 +7,7 @@ #include "SelectAttackType.h" +#include "SelectItem.h" #include "SelectMoveAction.h" #include "SelectSpell.h" #include "../AttackChoice.h" @@ -82,8 +83,7 @@ void SelectAttackType::HandleInput(const Input &input) { battle->NextHero(); break; case AttackChoice::ITEM: - // TODO: switch to item select - battle->NextHero(); + ctrl->PushState(new SelectItem(battle, this)); break; default: throw std::logic_error("selected invalid attack type"); diff --git a/src/battle/states/SelectItem.cpp b/src/battle/states/SelectItem.cpp new file mode 100644 index 0000000..0bdd4b1 --- /dev/null +++ b/src/battle/states/SelectItem.cpp @@ -0,0 +1,109 @@ +/* + * SelectItem.cpp + * + * Created on: Aug 9, 2012 + * Author: holy + */ + +#include "SelectItem.h" + +#include "SelectAttackType.h" +#include "../BattleState.h" +#include "../../app/Application.h" +#include "../../app/Input.h" +#include "../../geometry/Point.h" +#include "../../geometry/operators.h" +#include "../../graphics/Frame.h" + +using app::Application; +using app::Input; +using geometry::Point; +using geometry::Vector; +using graphics::Frame; + +namespace battle { + +void SelectItem::EnterState(Application &c, SDL_Surface *screen) { + ctrl = &c; +} + +void SelectItem::ExitState(Application &c, SDL_Surface *screen) { + ctrl = 0; +} + +void SelectItem::ResumeState(Application &ctrl, SDL_Surface *screen) { + +} + +void SelectItem::PauseState(Application &ctrl, SDL_Surface *screen) { + +} + + +void SelectItem::Resize(int width, int height) { + +} + + +void SelectItem::HandleInput(const Input &input) { + if (input.JustPressed(Input::ACTION_A)) { + // TODO: switch to target select + if (battle->GetItemMenu().SelectedIsEnabled()) { + battle->NextHero(); + ctrl->PopState(); + } + } + if (input.JustPressed(Input::ACTION_B)) { + ctrl->PopState(); // return control to parent + } + if (input.JustPressed(Input::PAD_UP)) { + battle->GetItemMenu().PreviousRow(); + } + if (input.JustPressed(Input::PAD_RIGHT)) { + battle->GetItemMenu().NextItem(); + } + if (input.JustPressed(Input::PAD_DOWN)) { + battle->GetItemMenu().NextRow(); + } + if (input.JustPressed(Input::PAD_LEFT)) { + battle->GetItemMenu().PreviousItem(); + } +} + +void SelectItem::UpdateWorld(float deltaT) { + +} + +void SelectItem::Render(SDL_Surface *screen) { + parent->Render(screen); + Vector offset(battle->CalculateScreenOffset(screen)); + RenderFrame(screen, offset); + RenderHeadline(screen, offset); + RenderMenu(screen, offset); +} + +void SelectItem::RenderFrame(SDL_Surface *screen, const Vector &offset) { + const Frame *frame(battle->Res().selectFrame); + Point position(frame->BorderWidth(), frame->BorderHeight()); + int width(battle->BackgroundWidth() - 2 * frame->BorderWidth()); + int height(battle->Res().normalFont->CharHeight() * 13); + frame->Draw(screen, position + offset, width, height); +} + +void SelectItem::RenderHeadline(SDL_Surface *screen, const Vector &offset) { + const Resources &res(battle->Res()); + Point position( + 2 * res.selectFrame->BorderWidth() + res.normalFont->CharWidth(), + 2 * res.selectFrame->BorderHeight()); + res.normalFont->DrawString(res.itemMenuHeadline, screen, position + offset); +} + +void SelectItem::RenderMenu(SDL_Surface *screen, const Vector &offset) { + const Resources &res(battle->Res()); + Point position( + 2 * res.selectFrame->BorderWidth() + res.normalFont->CharWidth(), + 2 * res.selectFrame->BorderHeight() + 2 * res.normalFont->CharHeight()); + battle->GetItemMenu().Draw(screen, position + offset); +} + +} diff --git a/src/battle/states/SelectItem.h b/src/battle/states/SelectItem.h new file mode 100644 index 0000000..be089f8 --- /dev/null +++ b/src/battle/states/SelectItem.h @@ -0,0 +1,53 @@ +/* + * SelectItem.h + * + * Created on: Aug 9, 2012 + * Author: holy + */ + +#ifndef BATTLE_SELECTITEM_H_ +#define BATTLE_SELECTITEM_H_ + +#include "../../app/State.h" + +#include "../../geometry/Vector.h" + +namespace battle { + +class BattleState; +class SelectAttackType; + +class SelectItem +: public app::State { + +public: + SelectItem(BattleState *battle, SelectAttackType *parent) + : ctrl(0), battle(battle), parent(parent) { } + +public: + virtual void EnterState(app::Application &ctrl, SDL_Surface *screen); + virtual void ExitState(app::Application &ctrl, SDL_Surface *screen); + virtual void ResumeState(app::Application &ctrl, SDL_Surface *screen); + virtual void PauseState(app::Application &ctrl, SDL_Surface *screen); + + virtual void Resize(int width, int height); + + virtual void HandleInput(const app::Input &); + virtual void UpdateWorld(float deltaT); + virtual void Render(SDL_Surface *); + +private: + void RenderFrame(SDL_Surface *, const geometry::Vector &offset); + void RenderHeadline(SDL_Surface *, const geometry::Vector &offset); + void RenderMenu(SDL_Surface *, const geometry::Vector &offset); + +private: + app::Application *ctrl; + BattleState *battle; + SelectAttackType *parent; + +}; + +} + +#endif /* BATTLE_SELECTITEM_H_ */ diff --git a/src/main.cpp b/src/main.cpp index 9a68807..4335eca 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -189,6 +189,9 @@ int main(int argc, char **argv) { battleRes.spellMenuHeadline = "Please choose a spell."; battleRes.spellMenuPrototype = Menu(&normalFont, &disabledFont, &handCursorSprite, 12, 6, 8, 2, 32); + battleRes.itemMenuHeadline = "Please choose an item."; + battleRes.itemMenuPrototype = Menu(&normalFont, &disabledFont, &handCursorSprite, 15, 6, 8, 1, 32); + BattleState *battleState(new BattleState(bg, monstersLayout, heroesLayout, &battleRes)); battleState->AddMonster(monster); battleState->AddMonster(monster); -- 2.39.2