From 52fce24bf842a2c75667294bb03ca1f22e71ad41 Mon Sep 17 00:00:00 2001 From: "wagic.the.homebrew@gmail.com" Date: Sun, 28 Nov 2010 04:15:58 +0000 Subject: [PATCH] Erwan - Added AI Decks unlock system. Please update your graphics folder, and crossing fingers that Ilya B. is still around as I don't have the correct fonts. --- projects/mtg/bin/Res/graphics/ai_unlocked.png | Bin 0 -> 31715 bytes projects/mtg/bin/Res/graphics/new.png | Bin 0 -> 2763 bytes projects/mtg/include/Credits.h | 3 +- projects/mtg/include/DeckStats.h | 2 + projects/mtg/include/GameOptions.h | 3 +- projects/mtg/include/GameState.h | 5 +- projects/mtg/src/AIPlayer.cpp | 3 +- projects/mtg/src/Credits.cpp | 43 ++++++++++++++-- projects/mtg/src/DeckMenu.cpp | 1 - projects/mtg/src/DeckMenuItem.cpp | 14 ++++++ projects/mtg/src/GameOptions.cpp | 4 ++ projects/mtg/src/GameState.cpp | 8 +-- projects/mtg/src/GameStateDuel.cpp | 2 +- projects/mtg/src/Tasks.cpp | 16 +++--- projects/mtg/src/utils.cpp | 46 +++++++++--------- 15 files changed, 103 insertions(+), 47 deletions(-) create mode 100644 projects/mtg/bin/Res/graphics/ai_unlocked.png create mode 100644 projects/mtg/bin/Res/graphics/new.png diff --git a/projects/mtg/bin/Res/graphics/ai_unlocked.png b/projects/mtg/bin/Res/graphics/ai_unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..ff36d39a7c981f066e02174280c12d6c54a53242 GIT binary patch literal 31715 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 R_S*me002ovPDHLkV1im4EVBRr literal 0 HcmV?d00001 diff --git a/projects/mtg/include/Credits.h b/projects/mtg/include/Credits.h index 2da684670..99d228c2e 100644 --- a/projects/mtg/include/Credits.h +++ b/projects/mtg/include/Credits.h @@ -25,10 +25,11 @@ public: class Credits{ private: time_t gameLength; - int isDifficultyUnlocked(); + int isDifficultyUnlocked(DeckStats * stats); int isMomirUnlocked(); int isEvilTwinUnlocked(); int isRandomDeckUnlocked(); + int IsMoreAIDecksUnlocked(DeckStats * stats); public: int value; Player * p1, *p2; diff --git a/projects/mtg/include/DeckStats.h b/projects/mtg/include/DeckStats.h index 6096d808e..98fa82ea1 100644 --- a/projects/mtg/include/DeckStats.h +++ b/projects/mtg/include/DeckStats.h @@ -38,6 +38,8 @@ public: int percentVictories(string opponentsDeckFile); int percentVictories(); DeckStat * getDeckStat(string opponentsFile); + + //returns the total number of games played with this deck int nbGames(); }; diff --git a/projects/mtg/include/GameOptions.h b/projects/mtg/include/GameOptions.h index 815e7384d..1e1061ac8 100644 --- a/projects/mtg/include/GameOptions.h +++ b/projects/mtg/include/GameOptions.h @@ -52,6 +52,7 @@ public: GUI_STYLE, INTERRUPT_SECONDS, KEY_BINDINGS, + AIDECKS_UNLOCKED, //My interrupts INTERRUPTMYSPELLS, INTERRUPTMYABILITIES, @@ -75,7 +76,7 @@ public: MOMIR_MODE_UNLOCKED, EVILTWIN_MODE_UNLOCKED, RANDOMDECK_MODE_UNLOCKED, - AWARD_COLLECTOR, + AWARD_COLLECTOR, LAST_NAMED, //Any option after this does not look up in optionNames. SET_UNLOCKS = LAST_NAMED + 1, //For sets. }; diff --git a/projects/mtg/include/GameState.h b/projects/mtg/include/GameState.h index d8348661c..a58f13f72 100644 --- a/projects/mtg/include/GameState.h +++ b/projects/mtg/include/GameState.h @@ -69,10 +69,11 @@ class GameState static vector fillDeckMenu(SimpleMenu * _menu, const string& path, const string& smallDeckPrefix = "", Player * statsPlayer = NULL); // generate the Deck Meta Data and build the menu items of the menu given - static vector fillDeckMenu(DeckMenu * _menu, const string& path, const string& smallDeckPrefix = "", Player * statsPlayer = NULL); + // Will display up to maxDecks if maxDecks is non 0,all decks in path otherwise + static vector fillDeckMenu(DeckMenu * _menu, const string& path, const string& smallDeckPrefix = "", Player * statsPlayer = NULL, int maxDecks = 0); // build a vector of decks with the information passsed in. - static vector getValidDeckMetaData(const string& path, const string& smallDeckPrefix = "", Player * statsPlayer = NULL); + static vector getValidDeckMetaData(const string& path, const string& smallDeckPrefix = "", Player * statsPlayer = NULL, int maxDecks = 0); // build menu items based on the vector static void renderDeckMenu(SimpleMenu * _menu, const vector& deckMetaDataList); diff --git a/projects/mtg/src/AIPlayer.cpp b/projects/mtg/src/AIPlayer.cpp index 6e2d4e8fd..041ab3193 100644 --- a/projects/mtg/src/AIPlayer.cpp +++ b/projects/mtg/src/AIPlayer.cpp @@ -978,9 +978,10 @@ AIPlayer * AIPlayerFactory::createAIPlayer(MTGAllCards * collection, Player * op { if (!deckid) { + //random deck int nbdecks = 0; int found = 1; - while (found) + while (found && nbdecks < options[Options::AIDECKS_UNLOCKED].number) { found = 0; char buffer[512]; diff --git a/projects/mtg/src/Credits.cpp b/projects/mtg/src/Credits.cpp index 8fe9baf0c..fdd6d94ad 100644 --- a/projects/mtg/src/Credits.cpp +++ b/projects/mtg/src/Credits.cpp @@ -119,7 +119,9 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app) if (unlocked == -1) { - unlocked = isDifficultyUnlocked(); + DeckStats * stats = DeckStats::GetInstance(); + stats->load(p1); + unlocked = isDifficultyUnlocked(stats); if (unlocked) { unlockedTex = resources.RetrieveTexture("unlocked.png"); @@ -160,6 +162,12 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app) if (si) unlockedString = si->getName(); //Show the set's pretty name for unlocks. } + else if ((unlocked = IsMoreAIDecksUnlocked(stats))) + { + options[Options::AIDECKS_UNLOCKED].number += 10; + unlockedTex = resources.RetrieveTexture("ai_unlocked.png"); + unlockedQuad = resources.RetrieveQuad("ai_unlocked.png", 2, 2, 396, 96); + } if (unlocked && options[Options::SFXVOLUME].number > 0) { @@ -292,15 +300,14 @@ void Credits::Render() } -int Credits::isDifficultyUnlocked() +int Credits::isDifficultyUnlocked(DeckStats * stats) { if (options[Options::DIFFICULTY_MODE_UNLOCKED].number) return 0; int nbAIDecks = 0; int found = 1; int wins = 0; - DeckStats * stats = DeckStats::GetInstance(); - stats->load(p1); + while (found) { found = 0; @@ -424,3 +431,31 @@ int Credits::unlockRandomSet(bool force) options.save(); return setId + 1; //We add 1 here to show success/failure. Be sure to subtract later. } + + +int Credits::IsMoreAIDecksUnlocked(DeckStats * stats) { + int currentlyUnlocked = options[Options::AIDECKS_UNLOCKED].number; + + // Random rule: having played at least twice as much games as + // the number of currently unlocked decks in order to go through. + if (stats->nbGames() < currentlyUnlocked * 2) return 0; + + int nbdecks = 0; + int found = 1; + while (found) + { + found = 0; + char buffer[512]; + sprintf(buffer, JGE_GET_RES("ai/baka/deck%i.txt").c_str(), nbdecks + 1); + std::ifstream file(buffer); + if (file) + { + found = 1; + file.close(); + nbdecks++; + if (nbdecks > currentlyUnlocked) + return 1; + } + } + return 0; +} \ No newline at end of file diff --git a/projects/mtg/src/DeckMenu.cpp b/projects/mtg/src/DeckMenu.cpp index 77bc26c9b..5371a2122 100644 --- a/projects/mtg/src/DeckMenu.cpp +++ b/projects/mtg/src/DeckMenu.cpp @@ -336,5 +336,4 @@ DeckMenu::~DeckMenu() { resources.Release(pspIconsTexture); SAFE_DELETE(mScroller); - mScroller = NULL; } diff --git a/projects/mtg/src/DeckMenuItem.cpp b/projects/mtg/src/DeckMenuItem.cpp index 94d7389ae..ae1f6067a 100644 --- a/projects/mtg/src/DeckMenuItem.cpp +++ b/projects/mtg/src/DeckMenuItem.cpp @@ -3,6 +3,7 @@ #include "DeckMenuItem.h" #include "Translate.h" #include "WResourceManager.h" +#include #define ITEM_PX_WIDTH 190.f const int kHorizontalScrollSpeed = 10; // lower numbers mean faster scrolling @@ -62,6 +63,19 @@ void DeckMenuItem::RenderWithOffset(float yOffset) mScrollTimer = 0; else if (mHasFocus && mScrollEnabled) mScrollTimer++; + + //Render a "new" icon for decks that have never been played yet + if (meta && !meta->getGamesPlayed()) + { + JTexture * tex = resources.RetrieveTexture("new.png"); + if (tex) + { + JQuad * quad = resources.RetrieveQuad("new.png", 2, 2, tex->mWidth - 4, tex->mHeight - 4); //avoids weird rectangle aroudn the texture because of bilinear filtering + quad->SetHotSpot(quad->mWidth/2, quad->mHeight/2); + float x = mX + min(ITEM_PX_WIDTH - quad->mWidth, mFont->GetStringWidth(menuItemString.c_str()))/2 + quad->mWidth/2; + if (quad) JRenderer::GetInstance()->RenderQuad(quad, x , mY + yOffset + quad->mHeight/2, 0.5); + } + } } void DeckMenuItem::Render() diff --git a/projects/mtg/src/GameOptions.cpp b/projects/mtg/src/GameOptions.cpp index 52f245035..920f3d61a 100644 --- a/projects/mtg/src/GameOptions.cpp +++ b/projects/mtg/src/GameOptions.cpp @@ -39,6 +39,7 @@ const string Options::optionNames[] = { "keybindings_psp", #endif #endif + "aidecks", "interruptMySpells", "interruptMyAbilities", //General interrupts @@ -342,6 +343,9 @@ int GameOptions::load() if (!(*this)[Options::MAX_GRADE].number) (*this)[Options::MAX_GRADE].number = Constants::GRADE_BORDERLINE; + if (!(*this)[Options::AIDECKS_UNLOCKED].number) + (*this)[Options::AIDECKS_UNLOCKED].number = 10; + return 1; } int GameOptions::save() diff --git a/projects/mtg/src/GameState.cpp b/projects/mtg/src/GameState.cpp index 01d717d21..d53843610 100644 --- a/projects/mtg/src/GameState.cpp +++ b/projects/mtg/src/GameState.cpp @@ -26,25 +26,25 @@ vector GameState::fillDeckMenu(SimpleMenu * _menu, const string& } vector GameState::fillDeckMenu(DeckMenu * _menu, const string& path, const string& smallDeckPrefix, - Player * statsPlayer) + Player * statsPlayer, int maxDecks) { bool translate = _menu->mAutoTranslate; _menu->mAutoTranslate = false; - vector deckMetaDataVector = getValidDeckMetaData(path, smallDeckPrefix, statsPlayer); + vector deckMetaDataVector = getValidDeckMetaData(path, smallDeckPrefix, statsPlayer, maxDecks); renderDeckMenu(_menu, deckMetaDataVector); _menu->mAutoTranslate = translate; return deckMetaDataVector; } -vector GameState::getValidDeckMetaData(const string& path, const string& smallDeckPrefix, Player * statsPlayer) +vector GameState::getValidDeckMetaData(const string& path, const string& smallDeckPrefix, Player * statsPlayer, int maxDecks) { vector retList; DeckMetaDataList * metas = DeckMetaDataList::decksMetaData; int found = 1; int nbDecks = 1; - while (found) + while (found && (!maxDecks || nbDecks <= maxDecks)) { found = 0; std::ostringstream filename; diff --git a/projects/mtg/src/GameStateDuel.cpp b/projects/mtg/src/GameStateDuel.cpp index 83a727893..42c1c3dad 100644 --- a/projects/mtg/src/GameStateDuel.cpp +++ b/projects/mtg/src/GameStateDuel.cpp @@ -283,7 +283,7 @@ void GameStateDuel::ensureOpponentMenu() if (options[Options::EVILTWIN_MODE_UNLOCKED].number) opponentMenu->Add(MENUITEM_EVIL_TWIN, "Evil Twin", _( "Can you play against yourself?").c_str()); DeckManager * deckManager = DeckManager::GetInstance(); - vector opponentDeckList = fillDeckMenu(opponentMenu, JGE_GET_RES("ai/baka"), "ai_baka", mPlayers[0]); + vector opponentDeckList = fillDeckMenu(opponentMenu, JGE_GET_RES("ai/baka"), "ai_baka", mPlayers[0], options[Options::AIDECKS_UNLOCKED].number); deckManager->updateMetaDataList(&opponentDeckList, true); opponentMenu->Add(MENUITEM_CANCEL, "Cancel", _("Choose a different player deck").c_str()); opponentDeckList.clear(); diff --git a/projects/mtg/src/Tasks.cpp b/projects/mtg/src/Tasks.cpp index 44111a48b..366b9d00b 100644 --- a/projects/mtg/src/Tasks.cpp +++ b/projects/mtg/src/Tasks.cpp @@ -189,9 +189,13 @@ void Task::passOneDay() void Task::loadAIDeckNames() { + //check if cache is up to date + if (AIDeckNames.size() == (unsigned int)(options[Options::AIDECKS_UNLOCKED].number)) return; + + AIDeckNames.clear(); int found = 1; int nbDecks = 0; - while (found) + while (found && nbDecks < options[Options::AIDECKS_UNLOCKED].number) { found = 0; char buffer[512]; @@ -211,19 +215,13 @@ void Task::loadAIDeckNames() int Task::getAIDeckCount() { - if (AIDeckNames.size() == 0) - { - loadAIDeckNames(); - } + loadAIDeckNames(); return AIDeckNames.size(); } string Task::getAIDeckName(int id) { - if (AIDeckNames.size() == 0) - { - loadAIDeckNames(); - } + loadAIDeckNames(); return ((unsigned int) id <= AIDeckNames.size()) ? AIDeckNames.at(id - 1) : ""; } diff --git a/projects/mtg/src/utils.cpp b/projects/mtg/src/utils.cpp index f20376752..9ff09f6ad 100644 --- a/projects/mtg/src/utils.cpp +++ b/projects/mtg/src/utils.cpp @@ -265,39 +265,39 @@ std::string wordWrap(std::string sentence, int width) // Given a delimited string of abilities, add the ones to the list that are "Basic" MTG abilities void PopulateAbilityIndexVector( list& abilities, const string& abilityStringList, char delimiter ) { - vector abilitiesList = split( abilityStringList, delimiter); - for ( vector::iterator iter = abilitiesList.begin(); iter != abilitiesList.end(); ++iter) - { - int abilityIndex = Constants::GetBasicAbilityIndex( *iter ); - - if (abilityIndex != -1) - abilities.push_back( abilityIndex ); + vector abilitiesList = split( abilityStringList, delimiter); + for ( vector::iterator iter = abilitiesList.begin(); iter != abilitiesList.end(); ++iter) + { + int abilityIndex = Constants::GetBasicAbilityIndex( *iter ); + + if (abilityIndex != -1) + abilities.push_back( abilityIndex ); } } void PopulateColorIndexVector( list& colors, const string& colorStringList, char delimiter ) { - vector abilitiesList = split( colorStringList, delimiter); - for ( vector::iterator iter = abilitiesList.begin(); iter != abilitiesList.end(); ++iter) - { - for (int colorIndex = Constants::MTG_COLOR_ARTIFACT; colorIndex < Constants::MTG_NB_COLORS; ++colorIndex) - { - // if the text is not a basic ability but contains a valid color add it to the color vector - if ( (Constants::GetBasicAbilityIndex( *iter ) != -1) && ((*iter).find( Constants::MTGColorStrings[ colorIndex ] ) != string::npos) ) - colors.push_back(colorIndex); - } + vector abilitiesList = split( colorStringList, delimiter); + for ( vector::iterator iter = abilitiesList.begin(); iter != abilitiesList.end(); ++iter) + { + for (int colorIndex = Constants::MTG_COLOR_ARTIFACT; colorIndex < Constants::MTG_NB_COLORS; ++colorIndex) + { + // if the text is not a basic ability but contains a valid color add it to the color vector + if ( (Constants::GetBasicAbilityIndex( *iter ) != -1) && ((*iter).find( Constants::MTGColorStrings[ colorIndex ] ) != string::npos) ) + colors.push_back(colorIndex); + } } } void PopulateSubtypesIndexVector( list& types, const string& subTypesStringList, char delimiter) { - vector subTypesList = split( subTypesStringList, delimiter); - for (vector::iterator it = subTypesList.begin(); it != subTypesList.end(); ++it) - { - string subtype = *it; - size_t id = Subtypes::subtypesList->find( subtype ); - if ( id != string::npos ) - types.push_back(id); + vector subTypesList = split( subTypesStringList, delimiter); + for (vector::iterator it = subTypesList.begin(); it != subTypesList.end(); ++it) + { + string subtype = *it; + size_t id = Subtypes::subtypesList->find( subtype ); + if ( id != string::npos ) + types.push_back(id); } }