]> git.localhorst.tv Git - l2e.git/commitdiff
added most of the capsule main menu's features
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 4 Dec 2012 21:48:07 +0000 (22:48 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 4 Dec 2012 21:48:07 +0000 (22:48 +0100)
src/menu/CapsuleMenu.cpp
src/menu/CapsuleMenu.h
src/menu/Resources.cpp
src/menu/Resources.h
test-data/test.l2s

index c85091ba52102e43a899d4da4eb2ceee33d34fdd..7837ea5976e3e6143256cfdd9c6488c8f4ed4928 100644 (file)
@@ -6,6 +6,7 @@
 #include "../app/Input.h"
 #include "../common/GameConfig.h"
 #include "../common/GameState.h"
+#include "../common/Spell.h"
 #include "../common/Stats.h"
 #include "../graphics/Font.h"
 #include "../graphics/Frame.h"
@@ -52,6 +53,13 @@ void CapsuleMenu::OnResize(int width, int height) {
 
 
 void CapsuleMenu::HandleEvents(const Input &input) {
+       if (input.JustPressed(Input::PAD_LEFT)) {
+               menu.PreviousItem();
+       }
+       if (input.JustPressed(Input::PAD_RIGHT)) {
+               menu.NextItem();
+       }
+
        if (input.JustPressed(Input::ACTION_B)) {
                Ctrl().PopState();
        }
@@ -62,15 +70,152 @@ void CapsuleMenu::UpdateWorld(float deltaT) {
 }
 
 void CapsuleMenu::Render(SDL_Surface *screen) {
-       Vector<int> offset((screen->w - Width()) / 2, (screen->h - Height()) / 2);
+       const Font &font(*parent->Res().statusFont);
+       const Vector<int> offset((screen->w - Width()) / 2, (screen->h - Height()) / 2);
+       const Vector<int> capsuleOffset(
+                       6 * font.CharWidth(),
+                       12 * font.CharHeight());
+       const Vector<int> infoOffset(
+                       12 * font.CharWidth(),
+                       2 * font.CharHeight() - font.CharHeight() / 8);
+       // TODO: wheel offset: top left, center, or center bottom?
+       const Vector<int> wheelOffset;
+       const Vector<int> statsOffset(
+                       12 * font.CharWidth(),
+                       15 * font.CharHeight() - font.CharHeight() / 8);
+       const Vector<int> menuOffset(
+                               font.CharWidth(),
+                               24 * font.CharHeight() - font.CharHeight() / 8);
 
        RenderBackground(screen);
+       RenderCapsule(screen, offset + capsuleOffset);
+       RenderInfo(screen, offset + infoOffset);
+       RenderWheel(screen, offset + wheelOffset);
+       RenderStats(screen, offset + statsOffset);
+       RenderMenu(screen, offset + menuOffset);
 }
 
 void CapsuleMenu::RenderBackground(SDL_Surface *screen) const {
        parent->Res().capsulebg->Render(screen, Vector<int>(), Vector<int>(screen->w, screen->h));
 }
 
+void CapsuleMenu::RenderCapsule(SDL_Surface *screen, const Vector<int> &offset) const {
+       GetCapsule().BattleSprite()->DrawCenterBottom(screen, offset);
+}
+
+void CapsuleMenu::RenderInfo(SDL_Surface *screen, const Vector<int> &offset) const {
+       const Capsule &capsule(GetCapsule());
+       const Font &font(*parent->Res().statusFont);
+       const Vector<int> delimiterOffset(5 * font.CharWidth(), 0);
+       const Vector<int> valueOffset(6 * font.CharWidth(), 0);
+       const Vector<int> lineBreak(0, font.CharHeight() + font.CharHeight() / 2);
+       Vector<int> lineHead(offset);
+
+       font.DrawString(parent->Res().capsuleNameLabel, screen, lineHead, 5);
+       font.DrawChar(':', screen, lineHead + delimiterOffset);
+       font.DrawString(capsule.Name(), screen, lineHead + valueOffset);
+
+       lineHead += lineBreak;
+       font.DrawString(parent->Res().capsuleClassLabel, screen, lineHead, 5);
+       font.DrawChar(':', screen, lineHead + delimiterOffset);
+       font.DrawString(capsule.ClassName(), screen, lineHead + valueOffset);
+
+       lineHead += lineBreak;
+       font.DrawString(parent->Res().capsuleAlignmentLabel, screen, lineHead, 5);
+       font.DrawChar(':', screen, lineHead + delimiterOffset);
+       font.DrawString(capsule.Alignment(), screen, lineHead + valueOffset);
+
+       lineHead += lineBreak;
+       font.DrawString(parent->Res().capsuleTribeLabel, screen, lineHead, 5);
+       font.DrawChar(':', screen, lineHead + delimiterOffset);
+       font.DrawString(capsule.Tribe(), screen, lineHead + valueOffset);
+
+       lineHead += lineBreak;
+       font.DrawString(parent->Res().capsuleAttack1Label, screen, lineHead, 5);
+       font.DrawChar(':', screen, lineHead + delimiterOffset);
+       if (capsule.Attack1()) {
+               font.DrawString(capsule.Attack1()->Name(), screen, lineHead + valueOffset);
+       } else {
+               font.DrawString(parent->Res().capsuleNoAttackText, screen, lineHead + valueOffset);
+       }
+
+       lineHead += lineBreak;
+       font.DrawString(parent->Res().capsuleAttack1Label, screen, lineHead, 5);
+       font.DrawChar(':', screen, lineHead + delimiterOffset);
+       if (capsule.Attack2()) {
+               font.DrawString(capsule.Attack2()->Name(), screen, lineHead + valueOffset);
+       } else {
+               font.DrawString(parent->Res().capsuleNoAttackText, screen, lineHead + valueOffset);
+       }
+
+       lineHead += lineBreak;
+       font.DrawString(parent->Res().capsuleAttack1Label, screen, lineHead, 5);
+       font.DrawChar(':', screen, lineHead + delimiterOffset);
+       if (capsule.Attack3()) {
+               font.DrawString(capsule.Attack3()->Name(), screen, lineHead + valueOffset);
+       } else {
+               font.DrawString(parent->Res().capsuleNoAttackText, screen, lineHead + valueOffset);
+       }
+}
+
+void CapsuleMenu::RenderWheel(SDL_Surface *screen, const Vector<int> &offset) const {
+       // later
+}
+
+void CapsuleMenu::RenderStats(SDL_Surface *screen, const Vector<int> &offset) const {
+       const Capsule &capsule(GetCapsule());
+       Stats stats(capsule.GetStats());
+       const Font &font(*parent->Res().statusFont);
+       const Vector<int> lineBreak(0, font.CharHeight());
+       Vector<int> lineHead(offset);
+
+       RenderStatsLine(screen, lineHead, parent->Res().hpLabel, capsule.MaxHealth());
+       lineHead += lineBreak;
+       RenderStatsLine(screen, lineHead, parent->Res().atpLabel, stats.Attack());
+       lineHead += lineBreak;
+       RenderStatsLine(screen, lineHead, parent->Res().dfpLabel, stats.Defense());
+       lineHead += lineBreak;
+       RenderStatsLine(screen, lineHead, parent->Res().strLabel, stats.Strength());
+       lineHead += lineBreak;
+       RenderStatsLine(screen, lineHead, parent->Res().aglLabel, stats.Agility());
+       lineHead += lineBreak;
+       RenderStatsLine(screen, lineHead, parent->Res().intLabel, stats.Intelligence());
+       lineHead += lineBreak;
+       RenderStatsLine(screen, lineHead, parent->Res().gutLabel, stats.Gut());
+       lineHead += lineBreak;
+       RenderStatsLine(screen, lineHead, parent->Res().mgrLabel, stats.MagicResistance());
+
+       lineHead = offset + Vector<int>(18 * font.CharWidth(), 0);
+       font.DrawStringRight(parent->Res().levelLabel, screen, lineHead);
+       lineHead += lineBreak;
+       font.DrawNumberRight(capsule.Level(), screen, lineHead);
+       lineHead += 2 * lineBreak;
+       font.DrawStringRight(parent->Res().experienceLabel, screen, lineHead);
+       lineHead += lineBreak;
+       font.DrawNumberRight(capsule.Experience(), screen, lineHead);
+       lineHead += 2 * lineBreak;
+       font.DrawStringRight(parent->Res().nextLevelLabel, screen, lineHead);
+       lineHead += lineBreak;
+       font.DrawNumberRight(capsule.NextLevel(), screen, lineHead);
+}
+
+void CapsuleMenu::RenderStatsLine(SDL_Surface *screen, const geometry::Vector<int> &offset, const char *name, int value) const {
+       const Font &font(*parent->Res().statusFont);
+       const Vector<int> numberOffset(4 * font.CharWidth(), 0);
+
+       font.DrawString(name, screen, offset, 4);
+       font.DrawNumber(value, screen, offset + numberOffset, 3);
+}
+
+void CapsuleMenu::RenderMenu(SDL_Surface *screen, const Vector<int> &offset) const {
+       const Font &font(*parent->Res().normalFont);
+       const Frame &frame(*parent->Res().statusFrame);
+       const Vector<int> menuOffset(3 * font.CharWidth(), font.CharHeight());
+
+       frame.Draw(screen, offset, 30 * font.CharWidth(), 3 * font.CharHeight());
+       menu.Draw(screen, offset + menuOffset);
+}
+
 int CapsuleMenu::Width() const {
        return parent->Width();
 }
index ad20b251b1b2d1d3b31559b68f5a6dfc350ce27a..ce57bd280534bfbc9ff7720b71ca1f3c46a3d020 100644 (file)
@@ -35,6 +35,12 @@ private:
        const common::Capsule &GetCapsule() const;
 
        void RenderBackground(SDL_Surface *screen) const;
+       void RenderCapsule(SDL_Surface *screen, const geometry::Vector<int> &offset) const;
+       void RenderInfo(SDL_Surface *screen, const geometry::Vector<int> &offset) const;
+       void RenderWheel(SDL_Surface *screen, const geometry::Vector<int> &offset) const;
+       void RenderStats(SDL_Surface *screen, const geometry::Vector<int> &offset) const;
+       void RenderStatsLine(SDL_Surface *screen, const geometry::Vector<int> &offset, const char *name, int value) const;
+       void RenderMenu(SDL_Surface *screen, const geometry::Vector<int> &offset) const;
 
 private:
        PartyMenu *parent;
index 9b725d04149fffb86160fbf43628b71070f2a1fb..f625e67421119dc816f5b4cd28164b2911033dcf 100644 (file)
@@ -56,7 +56,9 @@ Resources::Resources()
 , gutLabel(0)
 , mgrLabel(0)
 
+, hpLabel(0)
 , ipLabel(0)
+, levelLabel(0)
 , experienceLabel(0)
 , nextLevelLabel(0)
 
@@ -111,6 +113,7 @@ Resources::Resources()
 , capsuleAttack1Label(0)
 , capsuleAttack2Label(0)
 , capsuleAttack3Label(0)
+, capsuleNoAttackText(0)
 
 { }
 
@@ -159,7 +162,9 @@ void Resources::CreateTypeDescription() {
        td.AddField("gutLabel", FieldDescription(((char *)&r.gutLabel) - ((char *)&r), Interpreter::STRING_ID).SetReferenced());
        td.AddField("mgrLabel", FieldDescription(((char *)&r.mgrLabel) - ((char *)&r), Interpreter::STRING_ID).SetReferenced());
 
+       td.AddField("hpLabel", FieldDescription(((char *)&r.hpLabel) - ((char *)&r), Interpreter::STRING_ID).SetReferenced());
        td.AddField("ipLabel", FieldDescription(((char *)&r.ipLabel) - ((char *)&r), Interpreter::STRING_ID).SetReferenced());
+       td.AddField("levelLabel", FieldDescription(((char *)&r.levelLabel) - ((char *)&r), Interpreter::STRING_ID).SetReferenced());
        td.AddField("experienceLabel", FieldDescription(((char *)&r.experienceLabel) - ((char *)&r), Interpreter::STRING_ID).SetReferenced());
        td.AddField("nextLevelLabel", FieldDescription(((char *)&r.nextLevelLabel) - ((char *)&r), Interpreter::STRING_ID).SetReferenced());
 
@@ -213,6 +218,7 @@ void Resources::CreateTypeDescription() {
        td.AddField("capsuleAttack1Label", FieldDescription(((char *)&r.capsuleAttack1Label) - ((char *)&r), Interpreter::STRING_ID).SetReferenced());
        td.AddField("capsuleAttack2Label", FieldDescription(((char *)&r.capsuleAttack2Label) - ((char *)&r), Interpreter::STRING_ID).SetReferenced());
        td.AddField("capsuleAttack3Label", FieldDescription(((char *)&r.capsuleAttack3Label) - ((char *)&r), Interpreter::STRING_ID).SetReferenced());
+       td.AddField("capsuleNoAttackText", FieldDescription(((char *)&r.capsuleNoAttackText) - ((char *)&r), Interpreter::STRING_ID).SetReferenced());
 }
 
 void Resources::Construct(void *data) {
index 47e46256f668fbcf2f8db6425c66c9908c059747..5b581e6bd9dc97ba3c9db8104892b4b52e90f031 100644 (file)
@@ -46,7 +46,9 @@ struct Resources {
        const char *gutLabel;
        const char *mgrLabel;
 
+       const char *hpLabel;
        const char *ipLabel;
+       const char *levelLabel;
        const char *experienceLabel;
        const char *nextLevelLabel;
 
@@ -101,6 +103,7 @@ struct Resources {
        const char *capsuleAttack1Label;
        const char *capsuleAttack2Label;
        const char *capsuleAttack3Label;
+       const char *capsuleNoAttackText;
 
        Resources();
 
index 0d76b42a7f20159d0d27b67f5d8393fdb5735284..2ea517ac9e514e95e14550a07a4f18930a51e72c 100644 (file)
@@ -729,7 +729,9 @@ export MenuResources menuResources {
        intLabel: "INT",
        gutLabel: "GUT",
        mgrLabel: "MGR",
+       hpLabel: "HP",
        ipLabel: "IP",
+       levelLabel: "LEVEL",
        experienceLabel: "NOW EXP",
        nextLevelLabel: "NEXT LEVEL",
        statusMenu: MenuProperties {
@@ -845,7 +847,12 @@ export MenuResources menuResources {
        },
        capsuleMenu: MenuProperties {
                cols: 3,
-               rows: 1
+               rows: 1,
+               charsPerEntry: 7,
+               cursor: menuCursor,
+               selectedCursor: menuActiveCursor,
+               font: menuFont,
+               thirdColumnHack: 2
        },
        capsuleFeedLabel: "FEED",
        capsuleChangeLabel: "CHANGE",
@@ -855,5 +862,6 @@ export MenuResources menuResources {
        capsuleTribeLabel: "TRIBE",
        capsuleAttack1Label: "SP.1",
        capsuleAttack2Label: "SP.2",
-       capsuleAttack3Label: "SP.3"
+       capsuleAttack3Label: "SP.3",
+       capsuleNoAttackText: "Nothing"
 }