From 988ba6d1b4e18a4ae5d30a892224f76cee2355cc Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Tue, 18 Dec 2012 21:29:13 +0100 Subject: [PATCH] implemented capsule/class selection --- src/common/Capsule.cpp | 14 +++++++++ src/common/Capsule.h | 2 ++ src/common/GameState.h | 4 ++- src/main.cpp | 5 +++- src/map/MapState.cpp | 2 +- src/menu/CapsuleChangeMenu.cpp | 50 ++++++++++++++++++++++++++++++++- src/menu/CapsuleChangeMenu.h | 6 ++++ src/menu/CapsuleMenu.cpp | 6 ++-- test-data/capsules.l2s | 42 +++++++++++++++++++-------- test-data/flash.png | Bin 1595 -> 12177 bytes 10 files changed, 113 insertions(+), 18 deletions(-) diff --git a/src/common/Capsule.cpp b/src/common/Capsule.cpp index 302af8f..0085147 100644 --- a/src/common/Capsule.cpp +++ b/src/common/Capsule.cpp @@ -85,6 +85,20 @@ void Capsule::UpgradeClass() { ++curClass; } +void Capsule::NextClass() { + ++curClass; + if (curClass >= maxClass) { + curClass = 0; + } +} + +void Capsule::PreviousClass() { + --curClass; + if (curClass < 0) { + curClass = maxClass - 1; + } +} + Sprite *Capsule::BattleSprite() { return GetClass().battleSprite; diff --git a/src/common/Capsule.h b/src/common/Capsule.h index c70d07f..f168506 100644 --- a/src/common/Capsule.h +++ b/src/common/Capsule.h @@ -40,6 +40,8 @@ public: const graphics::Sprite *AlignmentSprite() const { return alignmentSprite; } void UpgradeClass(); + void NextClass(); + void PreviousClass(); Uint16 MaxHealth() const; diff --git a/src/common/GameState.h b/src/common/GameState.h index 4080630..55ae6df 100644 --- a/src/common/GameState.h +++ b/src/common/GameState.h @@ -19,8 +19,10 @@ struct GameState { int partySize; Capsule capsules[7]; + int capsule; int NumCapsules() const { return 7; } - Capsule *capsule; + Capsule &GetCapsule() { return capsules[capsule]; } + const Capsule &GetCapsule() const { return capsules[capsule]; } Inventory inventory; diff --git a/src/main.cpp b/src/main.cpp index ca54210..96bfad7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -198,7 +198,10 @@ int main(int argc, char **argv) { gameState.capsules[1] = *caster.GetCapsule("flash"); gameState.capsules[1].UpgradeClass(); - gameState.capsule = &gameState.capsules[1]; + gameState.capsules[1].UpgradeClass(); + gameState.capsules[1].UpgradeClass(); + gameState.capsules[1].UpgradeClass(); + gameState.capsule = 1; GameConfig gameConfig; gameConfig.state = &gameState; diff --git a/src/map/MapState.cpp b/src/map/MapState.cpp index 35c0c5c..b223f4f 100644 --- a/src/map/MapState.cpp +++ b/src/map/MapState.cpp @@ -297,7 +297,7 @@ bool MapState::CheckMonster() { } } if (game->state->capsule) { - battleState->SetCapsule(game->state->capsule); + battleState->SetCapsule(&game->state->GetCapsule()); } for (battle::Monster **monster((*e)->MonstersBegin()); monster != (*e)->MonstersEnd(); ++monster) { battleState->AddMonster(**monster); diff --git a/src/menu/CapsuleChangeMenu.cpp b/src/menu/CapsuleChangeMenu.cpp index cac2056..912f81a 100644 --- a/src/menu/CapsuleChangeMenu.cpp +++ b/src/menu/CapsuleChangeMenu.cpp @@ -54,8 +54,52 @@ void CapsuleChangeMenu::HandleEvents(const Input &input) { if (input.JustPressed(Input::ACTION_B)) { Ctrl().PopState(); } + + if (input.JustPressed(Input::PAD_UP)) { + NextClass(); + } + if (input.JustPressed(Input::PAD_RIGHT)) { + NextCapsule(); + } + if (input.JustPressed(Input::PAD_DOWN)) { + PreviousClass(); + } + if (input.JustPressed(Input::PAD_LEFT)) { + PreviousCapsule(); + } } +void CapsuleChangeMenu::NextCapsule() { + int &index = parent->Game().state->capsule; + ++index; + index %= parent->Game().state->NumCapsules(); + // skip unexplored + while (parent->Game().state->GetCapsule().MaxClass() <= 0) { + ++index; + index %= parent->Game().state->NumCapsules(); + } +} + +void CapsuleChangeMenu::PreviousCapsule() { + int &index = parent->Game().state->capsule; + --index; + if (index < 0) index += parent->Game().state->NumCapsules(); + // skip unexplored + while (GetCapsule().MaxClass() <= 0) { + --index; + if (index < 0) index += parent->Game().state->NumCapsules(); + } +} + +void CapsuleChangeMenu::NextClass() { + GetCapsule().NextClass(); +} + +void CapsuleChangeMenu::PreviousClass() { + GetCapsule().PreviousClass(); +} + + void CapsuleChangeMenu::UpdateWorld(float deltaT) { } @@ -116,7 +160,7 @@ void CapsuleChangeMenu::RenderClasses(SDL_Surface *screen, const Vector &of parent->Res().capsuleSelectLadder->Draw( screen, cursor, j < parent->Game().state->capsules[i].MaxClass(), j); - if (&parent->Game().state->capsules[i] == parent->Game().state->capsule + if (i == parent->Game().state->capsule && parent->Game().state->capsules[i].CurrentClass() == j) { parent->Res().capsuleSelectCursor->Draw(screen, cursor); } @@ -149,6 +193,10 @@ int CapsuleChangeMenu::Height() const { return parent->Height(); } +Capsule &CapsuleChangeMenu::GetCapsule() { + return parent->GetCapsule(); +} + const Capsule &CapsuleChangeMenu::GetCapsule() const { return parent->GetCapsule(); } diff --git a/src/menu/CapsuleChangeMenu.h b/src/menu/CapsuleChangeMenu.h index 0f8888f..a48a6b2 100644 --- a/src/menu/CapsuleChangeMenu.h +++ b/src/menu/CapsuleChangeMenu.h @@ -27,6 +27,11 @@ public: int Width() const; int Height() const; + void NextCapsule(); + void PreviousCapsule(); + void NextClass(); + void PreviousClass(); + private: virtual void OnEnterState(SDL_Surface *screen); virtual void OnExitState(SDL_Surface *screen); @@ -35,6 +40,7 @@ private: virtual void OnResize(int width, int height); + common::Capsule &GetCapsule(); const common::Capsule &GetCapsule() const; private: diff --git a/src/menu/CapsuleMenu.cpp b/src/menu/CapsuleMenu.cpp index 5a800a3..564b3bf 100644 --- a/src/menu/CapsuleMenu.cpp +++ b/src/menu/CapsuleMenu.cpp @@ -180,7 +180,7 @@ void CapsuleMenu::RenderInfo(SDL_Surface *screen, const Vector &offset) con void CapsuleMenu::RenderWheel(SDL_Surface *screen, const Vector &offset) const { Res().capsuleAlignmentWheel->DrawCenter(screen, offset); - Res().capsuleAlignmentCursor->DrawCenter(screen, offset + Game().state->capsule->AlignmentOffset()); + Res().capsuleAlignmentCursor->DrawCenter(screen, offset + Game().state->GetCapsule().AlignmentOffset()); } void CapsuleMenu::RenderStats(SDL_Surface *screen, const Vector &offset) const { @@ -264,11 +264,11 @@ int CapsuleMenu::Height() const { } Capsule &CapsuleMenu::GetCapsule() { - return *Game().state->capsule; + return Game().state->GetCapsule(); } const Capsule &CapsuleMenu::GetCapsule() const { - return *Game().state->capsule; + return Game().state->GetCapsule(); } } diff --git a/test-data/capsules.l2s b/test-data/capsules.l2s index 866e76f..a626958 100644 --- a/test-data/capsules.l2s +++ b/test-data/capsules.l2s @@ -1,7 +1,27 @@ -Sprite flashSprite { +Sprite flashSprite1 { image: :"flash.png", size: <96, 96> } +Sprite flashSprite2 { + image: :"flash.png", + size: <96, 96>, + offset: <96, 0> +} +Sprite flashSprite3 { + image: :"flash.png", + size: <96, 96>, + offset: <192, 0> +} +Sprite flashSprite4 { + image: :"flash.png", + size: <96, 96>, + offset: <288, 0> +} +Sprite flashSpriteM { + image: :"flash.png", + size: <96, 96>, + offset: <384, 0> +} export Capsule flash { name: "Flash", @@ -26,7 +46,7 @@ export Capsule flash { { name: "1 TODO", tribe: "Shaggy", - battleSprite: flashSprite, + battleSprite: flashSprite1, meleeAnimation: SimpleAnimation { sprite: Sprite { image: :"melee-maxim.png", @@ -36,7 +56,7 @@ export Capsule flash { framecount: 4 }, attackAnimation: ComplexAnimation { - sprite: flashSprite, + sprite: flashSprite1, frametime: fourFramesTime, repeat: false, frames: @@ -51,7 +71,7 @@ export Capsule flash { { name: "2 TODO", tribe: "Sprite", - battleSprite: flashSprite, + battleSprite: flashSprite2, meleeAnimation: SimpleAnimation { sprite: Sprite { image: :"melee-maxim.png", @@ -61,7 +81,7 @@ export Capsule flash { framecount: 4 }, attackAnimation: ComplexAnimation { - sprite: flashSprite, + sprite: flashSprite2, frametime: fourFramesTime, repeat: false, frames: @@ -86,7 +106,7 @@ export Capsule flash { { name: "3 TODO", tribe: "Cupid", - battleSprite: flashSprite, + battleSprite: flashSprite3, meleeAnimation: SimpleAnimation { sprite: Sprite { image: :"melee-maxim.png", @@ -96,7 +116,7 @@ export Capsule flash { framecount: 4 }, attackAnimation: ComplexAnimation { - sprite: flashSprite, + sprite: flashSprite3, frametime: fourFramesTime, repeat: false, frames: @@ -121,7 +141,7 @@ export Capsule flash { { name: "4", tribe: "Twinkle", - battleSprite: flashSprite, + battleSprite: flashSprite4, meleeAnimation: SimpleAnimation { sprite: Sprite { image: :"melee-maxim.png", @@ -131,7 +151,7 @@ export Capsule flash { framecount: 4 }, attackAnimation: ComplexAnimation { - sprite: flashSprite, + sprite: flashSprite4, frametime: fourFramesTime, repeat: false, frames: @@ -156,7 +176,7 @@ export Capsule flash { { name: "M TODO", tribe: "Twinkle", - battleSprite: flashSprite, + battleSprite: flashSpriteM, meleeAnimation: SimpleAnimation { sprite: Sprite { image: :"melee-maxim.png", @@ -166,7 +186,7 @@ export Capsule flash { framecount: 4 }, attackAnimation: ComplexAnimation { - sprite: flashSprite, + sprite: flashSpriteM, frametime: fourFramesTime, repeat: false, frames: diff --git a/test-data/flash.png b/test-data/flash.png index 85fd123eb0b6dc04365fbeb63d569be2f3869385..4aa2c4e0d64e9a1984a94b974a5a36d246e396f8 100644 GIT binary patch literal 12177 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 -- 2.39.2