From f472c48a8a4439193613d5d5023d206c2a09cd67 Mon Sep 17 00:00:00 2001 From: "techdragon.nguyen@gmail.com" Date: Tue, 2 Nov 2010 02:20:44 +0000 Subject: [PATCH] fixed avatar image issue when selecting ai decks outside of the default 100 ai decks. installed a horizontal text scroller for the deck selection screens in normal play TODO:-> Need to make it smoother transition. It currently just replaces the text with the new text. --- projects/mtg/include/DeckMetaData.h | 1 + projects/mtg/include/GameStateDuel.h | 5 ++- projects/mtg/include/TextScroller.h | 4 +- projects/mtg/src/DeckMetaData.cpp | 16 +++++++- projects/mtg/src/GameStateDuel.cpp | 43 ++++++++++++++++++---- projects/mtg/src/TextScroller.cpp | 55 +++++++++++++++++++++------- 6 files changed, 99 insertions(+), 25 deletions(-) diff --git a/projects/mtg/include/DeckMetaData.h b/projects/mtg/include/DeckMetaData.h index 1d5aab675..2c2b58551 100644 --- a/projects/mtg/include/DeckMetaData.h +++ b/projects/mtg/include/DeckMetaData.h @@ -39,6 +39,7 @@ public: string getDescription(); string getName(); string getAvatarFilename(); + int getAvatarId(int deckId); string getStatsSummary(); int getDeckId(); diff --git a/projects/mtg/include/GameStateDuel.h b/projects/mtg/include/GameStateDuel.h index b4f3edb1e..256b64fad 100644 --- a/projects/mtg/include/GameStateDuel.h +++ b/projects/mtg/include/GameStateDuel.h @@ -7,6 +7,7 @@ #include "DeckMenu.h" #include "MTGDeck.h" #include "GameObserver.h" +#include "TextScroller.h" #define CHOOSE_OPPONENT 7 @@ -32,6 +33,7 @@ class GameStateDuel: public GameState, public JGuiListener DeckMenu * deckmenu; DeckMenu * opponentMenu; SimpleMenu * menu; + TextScroller * scroller; bool premadeDeck; int OpponentsDeckid; string musictrack; @@ -40,7 +42,8 @@ class GameStateDuel: public GameState, public JGuiListener bool MusicExist(string FileName); void loadPlayer(int playerId, int decknb = 0, int isAI = 0); void ensureOpponentMenu(); //loads the opponentMenu if it doesn't exist - + void initScroller(); + public: GameStateDuel(GameApp* parent); virtual ~GameStateDuel(); diff --git a/projects/mtg/include/TextScroller.h b/projects/mtg/include/TextScroller.h index 2dc706868..d5a7e2ae4 100644 --- a/projects/mtg/include/TextScroller.h +++ b/projects/mtg/include/TextScroller.h @@ -21,11 +21,13 @@ protected: vector strings; unsigned int currentId; int mRandom; + int scrollDirection; + public: void Add(string text); void Reset(); void setRandom(int mode = 1); - TextScroller(int fontId, float x, float y, float width, float speed = 30); + TextScroller(int fontId, float x, float y, float width, float speed = 30, int scrollerType = 0); void Render(); void Update(float dt); virtual ostream& toString(ostream& out) const; diff --git a/projects/mtg/src/DeckMetaData.cpp b/projects/mtg/src/DeckMetaData.cpp index e3c88c501..5d61ce22e 100644 --- a/projects/mtg/src/DeckMetaData.cpp +++ b/projects/mtg/src/DeckMetaData.cpp @@ -34,7 +34,9 @@ void DeckMetaData::loadStatsForPlayer( Player * statsPlayer, string deckStatsFil _victories = opponentDeckStats->victories; _nbGamesPlayed = opponentDeckStats->nbgames; ostringstream oss; - oss << "avatar" << deckStatsFileName.substr( deckStatsFileName.find("deck") + 4, deckStatsFileName.find_last_of(".") -1 ) << ".jpg"; + int oppDeckId = atoi ( deckStatsFileName.substr( deckStatsFileName.find("deck") + 4, deckStatsFileName.find_last_of(".") ).c_str() ); + int avatarId = getAvatarId( oppDeckId ); + oss << "avatar" << avatarId << ".jpg"; _avatarFilename = oss.str(); if (_percentVictories < 34) { @@ -52,7 +54,7 @@ void DeckMetaData::loadStatsForPlayer( Player * statsPlayer, string deckStatsFil else { ostringstream oss; - oss << "avatar" << this->getDeckId() << ".jpg"; + oss << "avatar" << getAvatarId( _deckid ) << ".jpg"; _avatarFilename = oss.str(); } } @@ -66,6 +68,16 @@ void DeckMetaData::loadStatsForPlayer( Player * statsPlayer, string deckStatsFil } stats = NULL; } + +// since we only have 100 stock avatar images, we need to recylce the images for deck numbers > 99 +int DeckMetaData::getAvatarId( int deckId ) +{ + int avatarId = deckId % 100; + if ( deckId >= 100 && avatarId == 0) + return 100; + + return avatarId; +} void DeckMetaData::load(string filename){ MTGDeck * mtgd = NEW MTGDeck(filename.c_str(),NULL,1); diff --git a/projects/mtg/src/GameStateDuel.cpp b/projects/mtg/src/GameStateDuel.cpp index debf35c72..f8eba12e3 100644 --- a/projects/mtg/src/GameStateDuel.cpp +++ b/projects/mtg/src/GameStateDuel.cpp @@ -15,6 +15,7 @@ #include "Credits.h" #include "Translate.h" #include "Rules.h" +#include "TextScroller.h" #ifdef TESTSUITE #include "TestSuiteAI.h" @@ -64,10 +65,14 @@ GameStateDuel::GameStateDuel(GameApp* parent): GameState(parent) { credits = NULL; rules = NULL; + + initScroller(); } GameStateDuel::~GameStateDuel() { End(); + SAFE_DELETE(scroller); + } void GameStateDuel::Start() @@ -249,6 +254,21 @@ void GameStateDuel::ensureOpponentMenu(){ } } +void GameStateDuel::initScroller() +{ + scroller = NEW TextScroller(Fonts::MAIN_FONT, 40 , 230, 400, 100, 1); + // add all the items from the Tasks db. + TaskList *taskList = NEW TaskList(); + scroller->Reset(); + for (vector::iterator it = taskList->tasks.begin(); it!=taskList->tasks.end(); it++) + { + ostringstream taskDescription; + taskDescription << (*it)->getDesc() <Add( taskDescription.str() ); + } + SAFE_DELETE(taskList); +} + void GameStateDuel::Update(float dt) { switch (mGamePhase) @@ -301,15 +321,15 @@ void GameStateDuel::Update(float dt) break; case DUEL_STATE_CHOOSE_DECK2: if (mParent->players[1] == PLAYER_TYPE_HUMAN) - deckmenu->Update(dt); + deckmenu->Update(dt); else{ - if (mParent->players[0] == PLAYER_TYPE_HUMAN){ - ensureOpponentMenu(); - opponentMenu->Update(dt); - }else{ - loadPlayer(1); - mGamePhase = DUEL_STATE_PLAY; - } + if (mParent->players[0] == PLAYER_TYPE_HUMAN){ + ensureOpponentMenu(); + opponentMenu->Update(dt); + }else{ + loadPlayer(1); + mGamePhase = DUEL_STATE_PLAY; + } } break; case DUEL_STATE_CHOOSE_DECK2_TO_PLAY: @@ -413,6 +433,7 @@ void GameStateDuel::Update(float dt) PlayerData * playerdata = NEW PlayerData(mParent->collection); playerdata->taskList->passOneDay(); playerdata->taskList->save(); + initScroller(); SAFE_DELETE(playerdata); SAFE_DELETE(menu); } @@ -424,6 +445,9 @@ void GameStateDuel::Update(float dt) if (JGE_BTN_OK == mEngine->ReadButton()) mParent->SetNextState(GAME_STATE_MENU); } +// Update the scroller + + scroller->Update(dt); } @@ -435,6 +459,7 @@ void GameStateDuel::Render() if (game) game->Render(); + switch (mGamePhase) { case DUEL_STATE_END: @@ -485,6 +510,8 @@ void GameStateDuel::Render() opponentMenu->Render(); else if (deckmenu) deckmenu->Render(); + + scroller->Render(); } break; case DUEL_STATE_ERROR_NO_DECK: diff --git a/projects/mtg/src/TextScroller.cpp b/projects/mtg/src/TextScroller.cpp index fb692be70..289df2600 100644 --- a/projects/mtg/src/TextScroller.cpp +++ b/projects/mtg/src/TextScroller.cpp @@ -5,7 +5,13 @@ #include "utils.h" #include "WFont.h" -TextScroller::TextScroller(int fontId, float x, float y, float width, float speed):JGuiObject(0),fontId(fontId){ +enum { + HORIZONTAL_SCROLLER = 0, + VERTICAL_SCROLLER = 1 +}; + + +TextScroller::TextScroller(int fontId, float x, float y, float width, float speed, int scrollerType ): JGuiObject(0), fontId(fontId){ mWidth = width; mSpeed = speed; mX = x; @@ -14,6 +20,7 @@ TextScroller::TextScroller(int fontId, float x, float y, float width, float spee timer = 0; currentId = 0; mRandom = 0; + scrollDirection = scrollerType; } void TextScroller::setRandom(int mode){ @@ -36,24 +43,46 @@ void TextScroller::Reset(){ void TextScroller::Update(float dt){ if(!strings.size()) return; - start+=mSpeed*dt; - WFont * mFont = resources.GetWFont(fontId); - if (start > mFont->GetStringWidth(mText.c_str())){ - start = -mWidth; - if (mRandom){ - currentId = (rand() % strings.size()); - }else{ - currentId++; - if (currentId > strings.size()-1)currentId = 0; + if ( scrollDirection == HORIZONTAL_SCROLLER ) + { + start+=mSpeed*dt; + WFont * mFont = resources.GetWFont(fontId); + if (start > mFont->GetStringWidth(mText.c_str())){ + start = -mWidth; + if (mRandom){ + currentId = (rand() % strings.size()); + }else{ + currentId++; + if (currentId > strings.size()-1)currentId = 0; + } + mText = strings[currentId]; } - mText = strings[currentId]; } - + else + { + // we want to display 3 at a time + ostringstream scrollerText; + if ( timer == 0 ) + { + for ( int idx = 0; idx < 2; idx ++ ) + { + scrollerText << strings[currentId + idx]; + } + currentId++; + if ( currentId >= (strings.size()-1) ) + currentId = 0; + mText = scrollerText.str(); + } + timer = ++timer % ((int) mSpeed); + } } void TextScroller::Render(){ WFont * mFont = resources.GetWFont(fontId); - mFont->DrawString(mText.c_str(),mX,mY,JGETEXT_LEFT,start,mWidth); + if ( scrollDirection == HORIZONTAL_SCROLLER ) + mFont->DrawString(mText.c_str(),mX,mY,JGETEXT_LEFT,start,mWidth); + else + mFont->DrawString(mText.c_str(), mX, mY ); } ostream& TextScroller::toString(ostream& out) const