From 6c1497bbd5f4e549fcbbeefe2d7ff79637dcd97e Mon Sep 17 00:00:00 2001 From: "techdragon.nguyen@gmail.com" Date: Mon, 1 Nov 2010 08:22:55 +0000 Subject: [PATCH] Revamped Deck Selection Screen using abrasax's design as a template. TODO: change literals to use constants, refactor the rendering code for the menu to have be leaner. add text scroller to list all the tasks. * 1st implementation will list all the tasks.dat * 2nd round will try to get the scroller to only display relevant tasks to ai Special thanks to wololo and MootPoint for helping me hammer this out. To abrasax, for the initial design of the layout. --- .../mtg/bin/Res/graphics/DeckMenuBackdrop.png | Bin 0 -> 75133 bytes projects/mtg/include/DeckMenu.h | 53 +++++ projects/mtg/include/DeckMenuItem.h | 50 +++++ projects/mtg/include/DeckMetaData.h | 5 + projects/mtg/include/GameState.h | 9 +- projects/mtg/include/GameStateDeckViewer.h | 1 + projects/mtg/include/GameStateDuel.h | 5 +- projects/mtg/src/DeckMenu.cpp | 208 ++++++++++++++++++ projects/mtg/src/DeckMenuItem.cpp | 109 +++++++++ projects/mtg/src/DeckMetaData.cpp | 42 +++- projects/mtg/src/GameApp.cpp | 1 + projects/mtg/src/GameState.cpp | 32 +++ projects/mtg/src/GameStateDuel.cpp | 9 +- 13 files changed, 507 insertions(+), 17 deletions(-) create mode 100644 projects/mtg/bin/Res/graphics/DeckMenuBackdrop.png create mode 100644 projects/mtg/include/DeckMenu.h create mode 100644 projects/mtg/include/DeckMenuItem.h create mode 100644 projects/mtg/src/DeckMenu.cpp create mode 100644 projects/mtg/src/DeckMenuItem.cpp diff --git a/projects/mtg/bin/Res/graphics/DeckMenuBackdrop.png b/projects/mtg/bin/Res/graphics/DeckMenuBackdrop.png new file mode 100644 index 0000000000000000000000000000000000000000..8d8ddb8b05df2fb34ea696f4550afaeed57d9bc6 GIT binary patch literal 75133 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 AI{*Lx literal 0 HcmV?d00001 diff --git a/projects/mtg/include/DeckMenu.h b/projects/mtg/include/DeckMenu.h new file mode 100644 index 000000000..8e053284d --- /dev/null +++ b/projects/mtg/include/DeckMenu.h @@ -0,0 +1,53 @@ +/* + A class for very simple menus structure +*/ +#ifndef _DeckMenu_H_ +#define _DeckMenu_H_ + +#include +#include +#include "WFont.h" +#include "hge/hgeparticle.h" +#include "DeckMetaData.h" + + +class DeckMenu:public JGuiController{ + private: + int mHeight, mWidth, mX, mY; + int titleX, titleY, titleWidth; + int descX, descY, descHeight, descWidth; + int statsX, statsY, statsHeight, statsWidth; + + int fontId; + std::string title; + int displaytitle; + int maxItems, startId; + float selectionT, selectionY; + float timeOpen; + static unsigned int refCount; + + JQuad *background; + JTexture *backgroundTexture; + static WFont* titleFont; + static hgeParticleSystem* stars; + // This works only because of no multithreading + static PIXEL_TYPE jewelGraphics[9]; + + inline void MogrifyJewel(); + + public: + + bool autoTranslate; + DeckMenu(int id, JGuiListener* listener, int fontId, const char * _title = ""); + void Render(); + void Update(float dt); + void Add(int id, const char * Text, string desc = "", bool forceFocus = false, DeckMetaData *deckMetaData = NULL); + void Close(); + + float selectionTargetY; + bool closed; + static void destroy(); +}; + + +#endif diff --git a/projects/mtg/include/DeckMenuItem.h b/projects/mtg/include/DeckMenuItem.h new file mode 100644 index 000000000..3c91685b4 --- /dev/null +++ b/projects/mtg/include/DeckMenuItem.h @@ -0,0 +1,50 @@ +#ifndef _DECKMENU_ITEM_H +#define _DECKMENU_ITEM_H + +#include +#include +#include +#include "DeckMenu.h" + +using std::string; + +#define SCALE_SELECTED 1.2f +#define SCALE_NORMAL 1.0f + + +class DeckMenuItem: public JGuiObject +{ + private: + bool mHasFocus; + DeckMenu* parent; + int fontId; + string mText; + float mScale; + float mTargetScale; + + public: + string imageFilename; + string desc; + DeckMetaData *meta; + + DeckMenuItem(DeckMenu* _parent, int id, int fontId, string text, int x, int y, bool hasFocus = false, bool autoTranslate = false, DeckMetaData *meta = NULL); + ~DeckMenuItem(); + int mX; + int mY; + + void Relocate(int x, int y); + int GetWidth(); + bool hasFocus(); + + void RenderWithOffset(float yOffset); + virtual void Render(); + virtual void Update(float dt); + + virtual void Entering(); + virtual bool Leaving(JButton key); + virtual bool ButtonPressed(); + virtual ostream& toString(ostream& out) const; + virtual bool getTopLeft(int& top, int& left) {top = mY; left = mX; return true;}; +}; + +#endif diff --git a/projects/mtg/include/DeckMetaData.h b/projects/mtg/include/DeckMetaData.h index 6101d0243..1d5aab675 100644 --- a/projects/mtg/include/DeckMetaData.h +++ b/projects/mtg/include/DeckMetaData.h @@ -22,6 +22,7 @@ private: string _desc; string _name; int _deckid; + string _avatarFilename; // statistical information @@ -37,11 +38,15 @@ public: string getFilename(); string getDescription(); string getName(); + string getAvatarFilename(); + string getStatsSummary(); + int getDeckId(); int getGamesPlayed(); int getVictories(); int getVictoryPercentage(); int getDifficulty(); + string getDifficultyString(); }; diff --git a/projects/mtg/include/GameState.h b/projects/mtg/include/GameState.h index e312b4eaa..2eaaad569 100644 --- a/projects/mtg/include/GameState.h +++ b/projects/mtg/include/GameState.h @@ -10,6 +10,7 @@ class JGE; #include #include #include "DeckMetaData.h" +#include "DeckMenu.h" using namespace std; @@ -66,13 +67,19 @@ class GameState // generate the Deck Meta Data and build the menu items of the menu given static vector fillDeckMenu(SimpleMenu * _menu, string path, string smallDeckPrefix = "", Player * statsPlayer = NULL); + + // generate the Deck Meta Data and build the menu items of the menu given + static vector fillDeckMenu(DeckMenu * _menu, string path, string smallDeckPrefix = "", Player * statsPlayer = NULL); // build a vector of decks with the information passsed in. static vector getValidDeckMetaData(string path, string smallDeckPrefix = "", Player * statsPlayer = NULL); // build menu items based on the vector static void renderDeckMenu(SimpleMenu * _menu, vector deckMetaDataList); - + + // build menu items based on the vector + static void renderDeckMenu(DeckMenu * _menu, vector deckMetaDataList); + }; bool sortByName( DeckMetaData * d1, DeckMetaData * d2 ); diff --git a/projects/mtg/include/GameStateDeckViewer.h b/projects/mtg/include/GameStateDeckViewer.h index 23b723384..d03763d5d 100644 --- a/projects/mtg/include/GameStateDeckViewer.h +++ b/projects/mtg/include/GameStateDeckViewer.h @@ -8,6 +8,7 @@ #include "GameState.h" #include "SimpleMenu.h" +#include "DeckMenu.h" #include "WResourceManager.h" #include "CardGui.h" #include "GameOptions.h" diff --git a/projects/mtg/include/GameStateDuel.h b/projects/mtg/include/GameStateDuel.h index 4954fd514..b4f3edb1e 100644 --- a/projects/mtg/include/GameStateDuel.h +++ b/projects/mtg/include/GameStateDuel.h @@ -4,6 +4,7 @@ #include "GameState.h" #include "SimpleMenu.h" +#include "DeckMenu.h" #include "MTGDeck.h" #include "GameObserver.h" @@ -28,8 +29,8 @@ class GameStateDuel: public GameState, public JGuiListener Player * mPlayers[2]; MTGPlayerCards * deck[2]; GameObserver * game; - SimpleMenu * deckmenu; - SimpleMenu * opponentMenu; + DeckMenu * deckmenu; + DeckMenu * opponentMenu; SimpleMenu * menu; bool premadeDeck; int OpponentsDeckid; diff --git a/projects/mtg/src/DeckMenu.cpp b/projects/mtg/src/DeckMenu.cpp new file mode 100644 index 000000000..41e7cc797 --- /dev/null +++ b/projects/mtg/src/DeckMenu.cpp @@ -0,0 +1,208 @@ +#include "PrecompiledHeader.h" + +#include "DeckMenu.h" +#include "DeckMenuItem.h" +#include "DeckMetaData.h" +#include "JTypes.h" +#include "GameApp.h" +#include "Translate.h" + +namespace +{ + const unsigned int kPoleWidth = 7; + const unsigned int kVerticalMargin = 16; + const unsigned int kHorizontalMargin = 30; + const signed int kLineHeight = 20; +} + +WFont* DeckMenu::titleFont = NULL; +hgeParticleSystem* DeckMenu::stars = NULL; +unsigned int DeckMenu::refCount = 0; +// Here comes the magic of jewel graphics +PIXEL_TYPE DeckMenu::jewelGraphics[9] = {0x3FFFFFFF,0x63645AEA,0x610D0D98, + 0x63645AEA,0xFF635AD5,0xFF110F67, + 0x610D0D98,0xFF110F67,0xFD030330}; + +// +// For the additional info window, maximum characters per line is roughly 30 characters across. +// TODO: figure a way to get incoming text to wrap. +// +// used fixed locations where the menu, title and descriptive text are located. +// * menu at (125, 60 ) +// * descriptive information 125 + +DeckMenu::DeckMenu(int id, JGuiListener* listener, int fontId, const char * _title) +: JGuiController(id, listener), +fontId(fontId) { + + background = NULL; + autoTranslate = true; + maxItems = 7; + mHeight = 2 * kVerticalMargin + ( maxItems * kLineHeight ); + mWidth = 0; + mX = 125; + mY = 60; + + // where to place the title of the menu + titleX = mX; + titleY = mY - 30; + title = _(_title); + + // where stats information goes + statsX = 280; + statsY = 8 + kVerticalMargin; + statsHeight = 50; + statsWidth = SCREEN_WIDTH / 2 - 40; // 40 is the width of the right border + + // where to place the descripiton information + descX = 229; + descY = 70; + + startId = 0; + selectionT = 0; + timeOpen = 0; + closed = false; + ++refCount; + selectionTargetY = selectionY = kVerticalMargin; + + if (NULL == stars) + stars = NEW hgeParticleSystem(resources.RetrievePSI("stars.psi", resources.GetQuad("stars"))); + + stars->FireAt(mX, mY); +} + +// TODO: Make this configurable, perhaps by user as part of the theme options. +JQuad* getBackground() +{ + resources.RetrieveTexture("DeckMenuBackdrop.png", RETRIEVE_MANAGE ); + return resources.RetrieveQuad("DeckMenuBackdrop.png", 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, "DualPaneBG" ); + +} + + +void DeckMenu::Render() { + JRenderer * renderer = JRenderer::GetInstance(); + + WFont * titleFont = resources.GetWFont(Fonts::SMALLFACE_FONT); + WFont * mFont = resources.GetWFont(fontId); + + // figure out where to place the stars initially + if (0 == mWidth) { + float sY = mY + kVerticalMargin; + for (int i = startId; i < startId + mCount; ++i) { + DeckMenuItem *menuItem = static_cast (mObjects[i]); + int width = menuItem->GetWidth(); + if (mWidth < width) mWidth = width; + } + if ((!title.empty()) && (mWidth < titleFont->GetStringWidth(title.c_str()))) + mWidth = titleFont->GetStringWidth(title.c_str()); + mWidth += 2*kHorizontalMargin; + for (int i = startId; i < startId + mCount; ++i) { + float y = mY + kVerticalMargin + i * kLineHeight; + DeckMenuItem * currentMenuItem = static_cast(mObjects[i]); + currentMenuItem->Relocate( mX, y); + + if (currentMenuItem->hasFocus()) sY = y; + } + stars->Fire(); + selectionTargetY = selectionY = sY; + timeOpen = 0; + } + + + renderer->RenderQuad(getBackground(), 0, 0 ); + + float height = mHeight; + if (timeOpen < 1) height *= timeOpen > 0 ? timeOpen : -timeOpen; + + renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE); + stars->Render(); + renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); + + mFont->SetScale(1.0f); + + for (int i = startId; i < startId + maxItems ; i++){ + if (i > mCount-1) break; + if ( static_cast(mObjects[i])->mY - kLineHeight * startId < mY + height - kLineHeight + 7) { + DeckMenuItem *currentMenuItem = static_cast(mObjects[i]); + if ( currentMenuItem->hasFocus()){ + // display the avatar image + if ( currentMenuItem->imageFilename.size() > 0 ) + { + JQuad * quad = resources.RetrieveTempQuad( currentMenuItem->imageFilename, TEXTURE_SUB_AVATAR ); + if (quad) { + renderer->RenderQuad(quad, 232, 10, 0, 0.9f, 0.9f); + } + } + // fill in the description part of the screen + string text = currentMenuItem->desc; + WFont *mainFont = resources.GetWFont(Fonts::MAIN_FONT); + mainFont->DrawString(text.c_str(), descX, descY); + mFont->SetColor(ARGB(255,255,255,0)); + + // fill in the statistical portion + if ( currentMenuItem->meta ) + { + ostringstream oss; + oss << "Deck: " << currentMenuItem->meta->getName() << endl; + oss << currentMenuItem->meta->getStatsSummary(); + + mainFont->DrawString( oss.str(), statsX, statsY - kVerticalMargin ); + } + + // fill in the bottom section of the screen. + // TODO: add text scroller of Tasks. + } + else { + mFont->SetColor(ARGB(150,255,255,255)); + } + currentMenuItem->RenderWithOffset(-kLineHeight*startId); + } + if (!title.empty()) + titleFont->DrawString(title.c_str(), titleX, titleY, JGETEXT_CENTER); + + } +} + +void DeckMenu::Update(float dt){ + JGuiController::Update(dt); + if (mCurr > startId + maxItems-1) + startId = mCurr - maxItems +1; + else if (mCurr < startId) + startId = mCurr; + stars->Update(dt); + selectionT += 3*dt; + selectionY += (selectionTargetY - selectionY) * 8 * dt; + stars->MoveTo( 40 + ((mWidth-2*kHorizontalMargin)*(1+cos(selectionT))/2), selectionY + 5 * cos(selectionT*2.35) + kLineHeight / 2 - kLineHeight * startId); + if (timeOpen < 0) { + timeOpen += dt * 10; + if (timeOpen >= 0) { timeOpen = 0; closed = true; stars->FireAt(mX, mY); } + } else { + closed = false; + timeOpen += dt * 10; + } +} + +void DeckMenu::Add(int id, const char * text,string desc, bool forceFocus, DeckMetaData * deckMetaData) { + DeckMenuItem * menuItem = NEW DeckMenuItem(this, id, fontId, text, 0, mY + kVerticalMargin + mCount*kLineHeight, (mCount == 0), autoTranslate, deckMetaData); + menuItem->desc = deckMetaData ? deckMetaData->getDescription() : desc; + + JGuiController::Add(menuItem); + if (mCount <= maxItems) mHeight += kLineHeight; + if (forceFocus){ + mObjects[mCurr]->Leaving(JGE_BTN_DOWN); + mCurr = mCount-1; + menuItem->Entering(); + } +} + +void DeckMenu::Close() +{ + timeOpen = -1.0; + stars->Stop(true); +} + + +void DeckMenu::destroy(){ + SAFE_DELETE(DeckMenu::stars); +} diff --git a/projects/mtg/src/DeckMenuItem.cpp b/projects/mtg/src/DeckMenuItem.cpp new file mode 100644 index 000000000..420d5ef35 --- /dev/null +++ b/projects/mtg/src/DeckMenuItem.cpp @@ -0,0 +1,109 @@ +#include "PrecompiledHeader.h" + +#include "DeckMenuItem.h" +#include "Translate.h" +#include "WResourceManager.h" + +DeckMenuItem::DeckMenuItem(DeckMenu* _parent, int id, int fontId, string text, int x, int y, bool hasFocus, bool autoTranslate, DeckMetaData *deckMetaData): JGuiObject(id), parent(_parent), fontId(fontId), mX(x), mY(y) +{ + if (autoTranslate) + mText = _(text); + else + mText = text; + mHasFocus = hasFocus; + + mScale = 1.0f; + mTargetScale = 1.0f; + + if (hasFocus) + Entering(); + + meta = deckMetaData; + if ( meta && meta->getAvatarFilename().size() > 0 ) + this->imageFilename = meta->getAvatarFilename(); + else + this->imageFilename = "avatar.jpg"; + +} + + +void DeckMenuItem::RenderWithOffset(float yOffset) +{ + WFont * mFont = resources.GetWFont(fontId); + mFont->DrawString(mText.c_str(), mX, mY + yOffset, JGETEXT_CENTER); +} + +void DeckMenuItem::Render() +{ + RenderWithOffset(0); +} + +void DeckMenuItem::Update(float dt) +{ + if (mScale < mTargetScale) + { + mScale += 8.0f*dt; + if (mScale > mTargetScale) + mScale = mTargetScale; + } + else if (mScale > mTargetScale) + { + mScale -= 8.0f*dt; + if (mScale < mTargetScale) + mScale = mTargetScale; + } +} + + +void DeckMenuItem::Entering() +{ + mHasFocus = true; + parent->selectionTargetY = mY; +} + + +bool DeckMenuItem::Leaving(JButton key) +{ + mHasFocus = false; + return true; +} + + +bool DeckMenuItem::ButtonPressed() +{ + return true; +} + +void DeckMenuItem::Relocate(int x, int y) +{ + mX = x; + mY = y; +} + +int DeckMenuItem::GetWidth() +{ + WFont * mFont = resources.GetWFont(fontId); + mFont->SetScale(1.0); + return mFont->GetStringWidth(mText.c_str()); +} + +bool DeckMenuItem::hasFocus() +{ + return mHasFocus; +} + +ostream& DeckMenuItem::toString(ostream& out) const +{ + return out << "DeckMenuItem ::: mHasFocus : " << mHasFocus + << " ; parent : " << parent + << " ; mText : " << mText + << " ; mScale : " << mScale + << " ; mTargetScale : " << mTargetScale + << " ; mX,mY : " << mX << "," << mY; +} + + +DeckMenuItem::~DeckMenuItem() +{ + meta = NULL; +} \ No newline at end of file diff --git a/projects/mtg/src/DeckMetaData.cpp b/projects/mtg/src/DeckMetaData.cpp index 538c76153..e3c88c501 100644 --- a/projects/mtg/src/DeckMetaData.cpp +++ b/projects/mtg/src/DeckMetaData.cpp @@ -33,6 +33,9 @@ void DeckMetaData::loadStatsForPlayer( Player * statsPlayer, string deckStatsFil _percentVictories = stats->percentVictories(deckStatsFileName); _victories = opponentDeckStats->victories; _nbGamesPlayed = opponentDeckStats->nbgames; + ostringstream oss; + oss << "avatar" << deckStatsFileName.substr( deckStatsFileName.find("deck") + 4, deckStatsFileName.find_last_of(".") -1 ) << ".jpg"; + _avatarFilename = oss.str(); if (_percentVictories < 34) { _difficulty = HARD; @@ -46,6 +49,12 @@ void DeckMetaData::loadStatsForPlayer( Player * statsPlayer, string deckStatsFil _difficulty = EASY; } } + else + { + ostringstream oss; + oss << "avatar" << this->getDeckId() << ".jpg"; + _avatarFilename = oss.str(); + } } else { @@ -114,6 +123,10 @@ int DeckMetaData::getDeckId() return _deckid; } +string DeckMetaData::getAvatarFilename() +{ + return _avatarFilename; +} int DeckMetaData::getGamesPlayed() { @@ -136,10 +149,9 @@ int DeckMetaData::getDifficulty() return _difficulty; } -string DeckMetaData::getDescription() +string DeckMetaData::getDifficultyString() { - char deckDesc[512]; - string difficultyString = ""; + string difficultyString = "Normal"; switch( _difficulty ) { case HARD: @@ -149,12 +161,22 @@ string DeckMetaData::getDescription() difficultyString = "Easy"; break; } - if ( _nbGamesPlayed > 0 && difficultyString != "") - sprintf(deckDesc, "Deck: %s\nDifficulty: %s\nVictory %%: %i\nGames Played: %i\n\n%s", _name.c_str(), difficultyString.c_str(), _percentVictories, _nbGamesPlayed, _desc.c_str() ); - else if ( _nbGamesPlayed > 0 ) - sprintf(deckDesc, "Deck: %s\nVictory %%: %i\nGames Played: %i\n\n%s", _name.c_str(), _percentVictories, _nbGamesPlayed, _desc.c_str() ); - else - sprintf(deckDesc, "Deck: %s\n\n%s", _name.c_str(), _desc.c_str() ); - return deckDesc; + return difficultyString; +} + +string DeckMetaData::getDescription() +{ + return _desc; +} + +string DeckMetaData::getStatsSummary() +{ + ostringstream statsSummary; + statsSummary << "Difficulty: " << getDifficultyString() << endl + << "Victory %: " << getVictoryPercentage() << endl + << "Games Played: " << getGamesPlayed() << endl; + + return statsSummary.str(); + } diff --git a/projects/mtg/src/GameApp.cpp b/projects/mtg/src/GameApp.cpp index f50c82ac9..12b53b1ec 100644 --- a/projects/mtg/src/GameApp.cpp +++ b/projects/mtg/src/GameApp.cpp @@ -242,6 +242,7 @@ void GameApp::Destroy() Translator::EndInstance(); WCFilterFactory::Destroy(); SimpleMenu::destroy(); + DeckMenu::destroy(); options.theGame = NULL; LOG("==Destroying GameApp Successful=="); diff --git a/projects/mtg/src/GameState.cpp b/projects/mtg/src/GameState.cpp index 56cb1467a..c1848886e 100644 --- a/projects/mtg/src/GameState.cpp +++ b/projects/mtg/src/GameState.cpp @@ -23,6 +23,16 @@ vector GameState::fillDeckMenu( SimpleMenu * _menu, string path, return deckMetaDataVector; } +vector GameState::fillDeckMenu( DeckMenu * _menu, string path, string smallDeckPrefix, Player * statsPlayer){ + bool translate = _menu->autoTranslate; + _menu->autoTranslate = false; + vector deckMetaDataVector = getValidDeckMetaData( path, smallDeckPrefix, statsPlayer ); + renderDeckMenu( _menu, deckMetaDataVector); + _menu->autoTranslate = translate; + + return deckMetaDataVector; +} + vector GameState::getValidDeckMetaData( string path, string smallDeckPrefix, Player * statsPlayer) { @@ -91,6 +101,28 @@ void GameState::renderDeckMenu ( SimpleMenu * _menu, vector deck } +// build a menu with the given deck list and return a vector of the deck ids created. +void GameState::renderDeckMenu ( DeckMenu * _menu, vector deckMetaDataList ) +{ + int deckNumber = 1; + Translator * t = Translator::GetInstance(); + map::iterator it; + for (vector::iterator i = deckMetaDataList.begin(); i != deckMetaDataList.end(); i++) + { + DeckMetaData * deckMetaData = *i; + string deckName = deckMetaData -> getName(); + string deckDescription = deckMetaData -> getDescription(); + int deckId = deckMetaData -> getDeckId(); + //translate decks desc + it = t->deckValues.find(deckName); + if (it != t->deckValues.end()) + _menu->Add(deckNumber++, deckName.c_str(), it->second, false, deckMetaData); + else + _menu->Add( deckNumber++ ,deckName.c_str(), deckDescription.c_str(), false, deckMetaData); + } +} + + // deck sorting routines bool sortByName( DeckMetaData * d1, DeckMetaData * d2 ) { diff --git a/projects/mtg/src/GameStateDuel.cpp b/projects/mtg/src/GameStateDuel.cpp index 280d3691d..debf35c72 100644 --- a/projects/mtg/src/GameStateDuel.cpp +++ b/projects/mtg/src/GameStateDuel.cpp @@ -1,5 +1,6 @@ #include "PrecompiledHeader.h" +#include "DeckMenu.h" #include "GameStateDuel.h" #include "GameOptions.h" #include "utils.h" @@ -87,11 +88,11 @@ void GameStateDuel::Start() menu = NULL; int decksneeded = 0; - for (int i = 0; i<2; i ++){ if (mParent->players[i] == PLAYER_TYPE_HUMAN){ decksneeded = 1; - deckmenu = NEW SimpleMenu(DUEL_MENU_CHOOSE_DECK, this, Fonts::MENU_FONT, 35, 25, "Choose a Deck"); + + deckmenu = NEW DeckMenu(DUEL_MENU_CHOOSE_DECK, this, Fonts::MENU_FONT, "Choose a Deck"); DeckManager *deckManager = DeckManager::GetInstance(); vector playerDeckList = getValidDeckMetaData( options.profileFile() ); @@ -196,7 +197,6 @@ void GameStateDuel::loadTestSuitePlayers(){ void GameStateDuel::End() { DebugTrace("Ending GameStateDuel"); - SAFE_DELETE(deckmenu); JRenderer::GetInstance()->EnableVSync(false); if (mPlayers[0] && mPlayers[1]) mPlayers[0]->End(); @@ -215,6 +215,7 @@ void GameStateDuel::End() SAFE_DELETE(menu); SAFE_DELETE(opponentMenu); + SAFE_DELETE(deckmenu); #ifdef TESTSUITE SAFE_DELETE(testSuite); #endif @@ -236,7 +237,7 @@ bool GameStateDuel::MusicExist(string FileName){ void GameStateDuel::ensureOpponentMenu(){ if (!opponentMenu){ - opponentMenu = NEW SimpleMenu(DUEL_MENU_CHOOSE_OPPONENT, this, Fonts::MENU_FONT, 35, 25, "Choose Opponent"); + opponentMenu = NEW DeckMenu(DUEL_MENU_CHOOSE_OPPONENT, this, Fonts::MENU_FONT, "Choose Your Opponent"); opponentMenu->Add( MENUITEM_RANDOM_AI, "Random"); if (options[Options::EVILTWIN_MODE_UNLOCKED].number) opponentMenu->Add( MENUITEM_EVIL_TWIN, "Evil Twin", _("Can you play against yourself?").c_str());