]> git.localhorst.tv Git - l2e.git/commitdiff
added hero selection state + status stub
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 22 Oct 2012 20:19:56 +0000 (22:19 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 22 Oct 2012 20:19:56 +0000 (22:19 +0200)
16 files changed:
Debug/src/menu/subdir.mk
Release/src/menu/subdir.mk
src/common/GameState.cpp
src/common/GameState.h
src/main.cpp
src/menu/HeroStatus.h
src/menu/PartyMenu.cpp
src/menu/PartyMenu.h
src/menu/Resources.cpp
src/menu/Resources.h
src/menu/SelectHero.cpp [new file with mode: 0644]
src/menu/SelectHero.h [new file with mode: 0644]
src/menu/StatusMenu.cpp [new file with mode: 0644]
src/menu/StatusMenu.h [new file with mode: 0644]
src/menu/fwd.h
test-data/hero-cursor.png [new file with mode: 0644]

index 15d3746dcb97e906e82809c3706a04437dc8dcb5..a8154570b191dd36a0a4b6784612c29879aece77 100644 (file)
@@ -6,17 +6,23 @@
 CPP_SRCS += \
 ../src/menu/HeroStatus.cpp \
 ../src/menu/PartyMenu.cpp \
-../src/menu/Resources.cpp 
+../src/menu/Resources.cpp \
+../src/menu/SelectHero.cpp \
+../src/menu/StatusMenu.cpp 
 
 OBJS += \
 ./src/menu/HeroStatus.o \
 ./src/menu/PartyMenu.o \
-./src/menu/Resources.o 
+./src/menu/Resources.o \
+./src/menu/SelectHero.o \
+./src/menu/StatusMenu.o 
 
 CPP_DEPS += \
 ./src/menu/HeroStatus.d \
 ./src/menu/PartyMenu.d \
-./src/menu/Resources.d 
+./src/menu/Resources.d \
+./src/menu/SelectHero.d \
+./src/menu/StatusMenu.d 
 
 
 # Each subdirectory must supply rules for building sources it contributes
index a0ea3ff4e981cc439394fc41bc13514125e22ba4..a17f1562512ec425aaab5eb96c103e151fde6695 100644 (file)
@@ -6,17 +6,23 @@
 CPP_SRCS += \
 ../src/menu/HeroStatus.cpp \
 ../src/menu/PartyMenu.cpp \
-../src/menu/Resources.cpp 
+../src/menu/Resources.cpp \
+../src/menu/SelectHero.cpp \
+../src/menu/StatusMenu.cpp 
 
 OBJS += \
 ./src/menu/HeroStatus.o \
 ./src/menu/PartyMenu.o \
-./src/menu/Resources.o 
+./src/menu/Resources.o \
+./src/menu/SelectHero.o \
+./src/menu/StatusMenu.o 
 
 CPP_DEPS += \
 ./src/menu/HeroStatus.d \
 ./src/menu/PartyMenu.d \
-./src/menu/Resources.d 
+./src/menu/Resources.d \
+./src/menu/SelectHero.d \
+./src/menu/StatusMenu.d 
 
 
 # Each subdirectory must supply rules for building sources it contributes
index 91e8d4ab143a74dfb2747e66f0f7c4673c3a7502..ee7b1b2b51fda40a979b8ead46526a0aadd0ae7c 100644 (file)
@@ -10,7 +10,8 @@
 namespace common {
 
 GameState::GameState()
-: money(0)
+: partySize(1)
+, money(0)
 , time(0) {
        party[0] = heroes;
        party[1] = 0;
index 0ef442b200cf008ef7de28dbff702f9a8cc580e0..078da1a3738cba03eeae82eadbe2c8d0711eca54 100644 (file)
@@ -21,6 +21,7 @@ struct GameState {
 
        Hero heroes[7];
        Hero *party[4];
+       int partySize;
 
        Inventory inventory;
 
index 8fcb09e7335df8f796e4cb343de0c87a8b0be33e..7cb7bd24de3fee8911b05443fa5df7ce36c0a1d1 100644 (file)
@@ -191,6 +191,7 @@ int main(int argc, char **argv) {
                gameState.party[1] = &gameState.heroes[1];
                gameState.party[2] = &gameState.heroes[2];
                gameState.party[3] = &gameState.heroes[3];
+               gameState.partySize = 4;
 
                GameConfig gameConfig;
                gameConfig.state = &gameState;
@@ -318,6 +319,10 @@ int main(int argc, char **argv) {
                menuResources.mainMenuTimeText = "TIME";
                menuResources.mainMenuGoldText = "GOLD";
 
+               graphics::Sprite heroCursor(IMG_Load("test-data/hero-cursor.png"), 64, 16);
+               menuResources.heroCursor = &heroCursor;
+               menuResources.heroCursorBlinkTime = 532;
+
                InitScreen screen(width, height);
 
                app::State *state(0);
index 1b88da2229565a11ae3517906860e3547acf872a..12fe62f05cde32c0ee68e0cbf2c97cd3746f650f 100644 (file)
@@ -30,6 +30,7 @@ public:
        int Width() const;
        int Height() const;
        geometry::Vector<int> Size() const { return geometry::Vector<int>(Width(), Height()); }
+       const geometry::Vector<int> &Position() const { return position; }
 
        void Render(SDL_Surface *screen, const geometry::Vector<int> &offset) const;
 
index 5a68ca4fa5c3eac66b39055f18d28e861b29f2e6..85d19d2064456b74e44e63ce988253672b952ead 100644 (file)
@@ -8,6 +8,8 @@
 #include "PartyMenu.h"
 
 #include "Resources.h"
+#include "SelectHero.h"
+#include "StatusMenu.h"
 #include "../app/Application.h"
 #include "../app/Input.h"
 #include "../common/GameConfig.h"
@@ -86,6 +88,30 @@ void PartyMenu::HandleEvents(const Input &input) {
        } else if (input.JustPressed(Input::PAD_LEFT)) {
                mainMenu.PreviousItem();
        }
+
+       if (input.JustPressed(Input::ACTION_A)) {
+               switch (mainMenu.Selected()) {
+                       case MENU_ITEM_ITEM:
+                               break;
+                       case MENU_ITEM_SPELL:
+                               break;
+                       case MENU_ITEM_CAPSULE:
+                               break;
+                       case MENU_ITEM_EQUIP:
+                               break;
+                       case MENU_ITEM_STATUS:
+                               Ctrl().PushState(new SelectHero(this, OnStatusSelect));
+                               break;
+                       case MENU_ITEM_CHANGE:
+                               break;
+                       case MENU_ITEM_CONFIG:
+                               break;
+                       case MENU_ITEM_SCENARIO:
+                               break;
+                       default:
+                               break;
+               }
+       }
 }
 
 void PartyMenu::UpdateWorld(float deltaT) {
@@ -93,12 +119,20 @@ void PartyMenu::UpdateWorld(float deltaT) {
 }
 
 void PartyMenu::Render(SDL_Surface *screen) {
-       Res().menubg->Render(screen, Vector<int>(), Vector<int>(screen->w, screen->h));
-       RenderHeros(screen, Vector<int>(Res().normalFont->CharWidth(), 2 * Res().normalFont->CharHeight()));
+       RenderBackground(screen);
+       RenderHeros(screen, StatusOffset());
        RenderMenu(screen, Vector<int>(8 * Res().normalFont->CharWidth(), 13 * Res().normalFont->CharHeight() + Res().normalFont->CharHeight() / 8));
        RenderInfo(screen, Vector<int>(14 * Res().normalFont->CharWidth(), 21 * Res().normalFont->CharHeight() + Res().normalFont->CharHeight() / 8));
 }
 
+Vector<int> PartyMenu::StatusOffset() const {
+       return Vector<int>(Res().normalFont->CharWidth(), 2 * Res().normalFont->CharHeight());
+}
+
+void PartyMenu::RenderBackground(SDL_Surface *screen) const {
+       Res().menubg->Render(screen, Vector<int>(), Vector<int>(screen->w, screen->h));
+}
+
 void PartyMenu::RenderHeros(SDL_Surface *screen, const Vector<int> &offset) const {
        for (int i(0); i < 4; ++i) {
                status[i].Render(screen, offset);
@@ -146,4 +180,8 @@ const Resources &PartyMenu::Res() const {
        return *game->menuResources;
 }
 
+void PartyMenu::OnStatusSelect(PartyMenu *self, int index) {
+       self->Ctrl().ChangeState(new StatusMenu(self));
+}
+
 }
index 5baaf69ac9635c8219e389fb380ed8a160830e77..a55b2c13f81fadeaf8071e832b4edffb5c950fdf 100644 (file)
@@ -30,9 +30,22 @@ public:
        virtual void Render(SDL_Surface *);
 
 public:
+       common::GameConfig &Game() { return *game; }
+       const common::GameConfig &Game() const { return *game; }
        Resources &Res();
        const Resources &Res() const;
 
+public:
+       void RenderBackground(SDL_Surface *screen) const;
+       void RenderHeros(SDL_Surface *screen, const geometry::Vector<int> &offset) const;
+       void RenderMenu(SDL_Surface *screen, const geometry::Vector<int> &offset) const;
+       void RenderInfo(SDL_Surface *screen, const geometry::Vector<int> &offset) const;
+
+       geometry::Vector<int> StatusOffset() const;
+       const HeroStatus &GetHeroStatus(int index) const { return status[index]; }
+
+       static void OnStatusSelect(PartyMenu *, int);
+
 private:
        virtual void OnEnterState(SDL_Surface *screen);
        virtual void OnExitState(SDL_Surface *screen);
@@ -41,9 +54,17 @@ private:
 
        virtual void OnResize(int width, int height);
 
-       void RenderHeros(SDL_Surface *screen, const geometry::Vector<int> &offset) const;
-       void RenderMenu(SDL_Surface *screen, const geometry::Vector<int> &offset) const;
-       void RenderInfo(SDL_Surface *screen, const geometry::Vector<int> &offset) const;
+private:
+       enum MenuItem {
+               MENU_ITEM_ITEM,
+               MENU_ITEM_SPELL,
+               MENU_ITEM_CAPSULE,
+               MENU_ITEM_EQUIP,
+               MENU_ITEM_STATUS,
+               MENU_ITEM_CHANGE,
+               MENU_ITEM_CONFIG,
+               MENU_ITEM_SCENARIO,
+       };
 
 private:
        HeroStatus status[4];
index 98787f6572cfcbc764b3244675d9c28c9e949bc0..79342b249333f40db462da452dc799071160812e 100644 (file)
 namespace menu {
 
 Resources::Resources()
-: menubg(0) {
+: menubg(0)
+, normalFont(0)
+, statusFont(0)
+
+, statusLabels(0)
+, statusFrame(0)
+
+, mainMenuProperties(0)
+, mainMenuItemText(0)
+, mainMenuSpellText(0)
+, mainMenuCapsuleText(0)
+, mainMenuEquipmentText(0)
+, mainMenuStatusText(0)
+, mainMenuChangeText(0)
+, mainMenuConfigText(0)
+, mainMenuScenarioText(0)
+
+, mainMenuTimeText(0)
+, mainMenuGoldText(0)
+
+, heroCursor(0)
+, heroCursorBlinkTime(0) {
 
 }
 
index 6472d3c61beff972e61022cff59e15713a0f0625..e5241c33d8f3ac95353a80f7951040a5334ee404 100644 (file)
@@ -35,6 +35,9 @@ struct Resources {
        const char *mainMenuTimeText;
        const char *mainMenuGoldText;
 
+       graphics::Sprite *heroCursor;
+       int heroCursorBlinkTime;
+
        Resources();
 
 };
diff --git a/src/menu/SelectHero.cpp b/src/menu/SelectHero.cpp
new file mode 100644 (file)
index 0000000..723414f
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * SelectHero.cpp
+ *
+ *  Created on: Oct 22, 2012
+ *      Author: holy
+ */
+
+#include "SelectHero.h"
+
+#include "HeroStatus.h"
+#include "PartyMenu.h"
+#include "Resources.h"
+#include "../app/Application.h"
+#include "../app/Input.h"
+#include "../common/GameConfig.h"
+#include "../common/GameState.h"
+#include "../common/Hero.h"
+#include "../geometry/Vector.h"
+#include "../graphics/Sprite.h"
+
+using app::Input;
+using geometry::Vector;
+
+namespace menu {
+
+SelectHero::SelectHero(PartyMenu *parent, Callback cb, int cursor)
+: parent(parent)
+, callback(cb)
+, cursor(cursor) {
+
+}
+
+
+void SelectHero::OnEnterState(SDL_Surface *) {
+       cursorBlink = GraphicsTimers().StartInterval(Res().heroCursorBlinkTime);
+}
+
+void SelectHero::OnExitState(SDL_Surface *) {
+
+}
+
+void SelectHero::OnResumeState(SDL_Surface *) {
+
+}
+
+void SelectHero::OnPauseState(SDL_Surface *) {
+
+}
+
+
+void SelectHero::OnResize(int width, int height) {
+
+}
+
+
+void SelectHero::HandleEvents(const Input &input) {
+       if (input.JustPressed(Input::ACTION_A)) {
+               callback(parent, cursor);
+       }
+       if (input.JustPressed(Input::ACTION_B)) {
+               Ctrl().PopState();
+       }
+
+       if (input.JustPressed(Input::PAD_UP)) {
+               SelectUp();
+       } else if (input.JustPressed(Input::PAD_RIGHT)) {
+               SelectRight();
+       } else if (input.JustPressed(Input::PAD_DOWN)) {
+               SelectDown();
+       } else if (input.JustPressed(Input::PAD_LEFT)) {
+               SelectLeft();
+       }
+}
+
+void SelectHero::SelectUp() {
+       cursor = (cursor + 2) % parent->Game().state->partySize;
+       cursorBlink.Restart();
+}
+
+void SelectHero::SelectRight() {
+       cursor = (cursor + 1) % parent->Game().state->partySize;
+       cursorBlink.Restart();
+}
+
+void SelectHero::SelectDown() {
+       cursor = (cursor + 2) % parent->Game().state->partySize;
+       cursorBlink.Restart();
+}
+
+void SelectHero::SelectLeft() {
+       cursor = (cursor + 3) % parent->Game().state->partySize;
+       cursorBlink.Restart();
+}
+
+
+common::GameConfig &SelectHero::Game() {
+       return parent->Game();
+}
+
+const common::GameConfig &SelectHero::Game() const {
+       return parent->Game();
+}
+
+Resources &SelectHero::Res() {
+       return parent->Res();
+}
+
+const Resources &SelectHero::Res() const {
+       return parent->Res();
+}
+
+
+void SelectHero::UpdateWorld(float deltaT) {
+
+}
+
+
+void SelectHero::Render(SDL_Surface *screen) {
+       parent->Render(screen);
+       if (cursorBlink.Iteration() % 2 == 0) {
+               RenderCursor(screen);
+       }
+}
+
+void SelectHero::RenderCursor(SDL_Surface *screen) const {
+       const HeroStatus &status(parent->GetHeroStatus(cursor));
+       Vector<int> position(
+                       0, Game().state->party[cursor]->BattleSprite()->Height());
+       position += status.Position() + parent->StatusOffset();
+       Res().heroCursor->Draw(screen, position);
+}
+
+}
diff --git a/src/menu/SelectHero.h b/src/menu/SelectHero.h
new file mode 100644 (file)
index 0000000..8228387
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * SelectHero.h
+ *
+ *  Created on: Oct 22, 2012
+ *      Author: holy
+ */
+
+#ifndef MENU_SELECTHERO_H_
+#define MENU_SELECTHERO_H_
+
+#include "fwd.h"
+#include "../app/State.h"
+#include "../app/Timer.h"
+#include "../common/fwd.h"
+
+#include <SDL.h>
+
+namespace menu {
+
+class SelectHero
+: public app::State {
+
+public:
+       typedef void (*Callback)(PartyMenu *, int selection);
+
+public:
+       explicit SelectHero(PartyMenu *parent, Callback, int initialHero = 0);
+
+public:
+       virtual void HandleEvents(const app::Input &);
+       virtual void UpdateWorld(float deltaT);
+       virtual void Render(SDL_Surface *);
+
+private:
+       virtual void OnEnterState(SDL_Surface *screen);
+       virtual void OnExitState(SDL_Surface *screen);
+       virtual void OnResumeState(SDL_Surface *screen);
+       virtual void OnPauseState(SDL_Surface *screen);
+
+       virtual void OnResize(int width, int height);
+
+private:
+       common::GameConfig &Game();
+       const common::GameConfig &Game() const;
+       Resources &Res();
+       const Resources &Res() const;
+
+       void SelectUp();
+       void SelectRight();
+       void SelectDown();
+       void SelectLeft();
+
+       void RenderCursor(SDL_Surface *screen) const;
+
+private:
+       PartyMenu *parent;
+       Callback callback;
+       app::Timer<Uint32> cursorBlink;
+       int cursor;
+
+};
+
+}
+
+#endif /* MENU_SELECTHERO_H_ */
diff --git a/src/menu/StatusMenu.cpp b/src/menu/StatusMenu.cpp
new file mode 100644 (file)
index 0000000..efc807f
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * StatusMenu.cpp
+ *
+ *  Created on: Oct 22, 2012
+ *      Author: holy
+ */
+
+#include "StatusMenu.h"
+
+#include "PartyMenu.h"
+#include "../app/Application.h"
+#include "../app/Input.h"
+
+using app::Input;
+
+namespace menu {
+
+StatusMenu::StatusMenu(PartyMenu *parent)
+: parent(parent) {
+
+}
+
+
+void StatusMenu::OnEnterState(SDL_Surface *) {
+
+}
+
+void StatusMenu::OnExitState(SDL_Surface *) {
+
+}
+
+void StatusMenu::OnResumeState(SDL_Surface *) {
+
+}
+
+void StatusMenu::OnPauseState(SDL_Surface *) {
+
+}
+
+
+void StatusMenu::OnResize(int width, int height) {
+
+}
+
+
+void StatusMenu::HandleEvents(const Input &input) {
+       if (input.JustPressed(Input::ACTION_B)) {
+               Ctrl().PopState();
+       }
+}
+
+void StatusMenu::UpdateWorld(float deltaT) {
+
+}
+
+void StatusMenu::Render(SDL_Surface *screen) {
+       parent->RenderBackground(screen);
+}
+
+}
diff --git a/src/menu/StatusMenu.h b/src/menu/StatusMenu.h
new file mode 100644 (file)
index 0000000..465c7c4
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * StatusMenu.h
+ *
+ *  Created on: Oct 22, 2012
+ *      Author: holy
+ */
+
+#ifndef MENU_STATUSMENU_H_
+#define MENU_STATUSMENU_H_
+
+#include "fwd.h"
+#include "../app/State.h"
+
+namespace menu {
+
+class StatusMenu
+: public app::State {
+
+public:
+       explicit StatusMenu(PartyMenu *parent);
+
+public:
+       virtual void HandleEvents(const app::Input &);
+       virtual void UpdateWorld(float deltaT);
+       virtual void Render(SDL_Surface *);
+
+private:
+       virtual void OnEnterState(SDL_Surface *screen);
+       virtual void OnExitState(SDL_Surface *screen);
+       virtual void OnResumeState(SDL_Surface *screen);
+       virtual void OnPauseState(SDL_Surface *screen);
+
+       virtual void OnResize(int width, int height);
+
+private:
+       PartyMenu *parent;
+
+};
+
+}
+
+#endif /* MENU_STATUSMENU_H_ */
index 888552541ef72055b9296f783b45c0aa343cdf36..ae7932cbbc942df03807fb42dd682ff561cbfe50 100644 (file)
@@ -13,6 +13,8 @@ namespace menu {
 class HeroStatus;
 class PartyMenu;
 struct Resources;
+class SelectHero;
+class StatusMenu;
 
 }
 
diff --git a/test-data/hero-cursor.png b/test-data/hero-cursor.png
new file mode 100644 (file)
index 0000000..0496815
Binary files /dev/null and b/test-data/hero-cursor.png differ