diff --git a/projects/mtg/bin/Res/graphics/eviltwin_unlocked.png b/projects/mtg/bin/Res/graphics/eviltwin_unlocked.png new file mode 100644 index 000000000..bdefab9d2 Binary files /dev/null and b/projects/mtg/bin/Res/graphics/eviltwin_unlocked.png differ diff --git a/projects/mtg/include/AIMomirPlayer.h b/projects/mtg/include/AIMomirPlayer.h index 67acd1815..904cac2ef 100644 --- a/projects/mtg/include/AIMomirPlayer.h +++ b/projects/mtg/include/AIMomirPlayer.h @@ -6,7 +6,7 @@ class AIMomirPlayer:public AIPlayerBaka{ public: - AIMomirPlayer(MTGPlayerCards * _deck, char * file, char * avatarFile); + AIMomirPlayer(MTGPlayerCards * _deck, char * file, char * fileSmall, char * avatarFile); int getEfficiency(AIAction * action); int momir(); int computeActions(); diff --git a/projects/mtg/include/AIPlayer.h b/projects/mtg/include/AIPlayer.h index 3c548f849..b3760f13a 100644 --- a/projects/mtg/include/AIPlayer.h +++ b/projects/mtg/include/AIPlayer.h @@ -65,7 +65,7 @@ class AIPlayer: public Player{ virtual int displayStack(){return 0;}; AIStats * stats; ManaCost * getPotentialMana(); - AIPlayer(MTGPlayerCards * _deck, string deckFile); + AIPlayer(MTGPlayerCards * _deck, string deckFile, string deckFileSmall); virtual ~AIPlayer(); virtual MTGCardInstance * chooseCard(TargetChooser * tc, MTGCardInstance * source, int random = 0); virtual int chooseTarget(TargetChooser * tc = NULL); @@ -85,7 +85,7 @@ class AIPlayerBaka: public AIPlayer{ float timer; MTGCardInstance * FindCardToPlay(ManaCost * potentialMana, const char * type); public: - AIPlayerBaka(MTGPlayerCards * _deck, char * deckFile, char * avatarFile); + AIPlayerBaka(MTGPlayerCards * _deck, char * deckFile, char * deckfileSmall, char * avatarFile); virtual int Act(float dt); void initTimer(); virtual int computeActions(); @@ -93,7 +93,7 @@ class AIPlayerBaka: public AIPlayer{ class AIPlayerFactory{ public: - AIPlayer * createAIPlayer(MTGAllCards * collection, MTGPlayerCards * oponents_deck, int deckid = 0); + AIPlayer * createAIPlayer(MTGAllCards * collection, Player * opponent, int deckid = 0); }; diff --git a/projects/mtg/include/Credits.h b/projects/mtg/include/Credits.h index 503b3a6ea..7a002cf14 100644 --- a/projects/mtg/include/Credits.h +++ b/projects/mtg/include/Credits.h @@ -24,6 +24,7 @@ class Credits{ private: int isDifficultyUnlocked(); int isMomirUnlocked(); + int isEvilTwinUnlocked(); public: int value; Player * p1, *p2; diff --git a/projects/mtg/include/GameOptions.h b/projects/mtg/include/GameOptions.h index df309bc2b..7bbd1a942 100644 --- a/projects/mtg/include/GameOptions.h +++ b/projects/mtg/include/GameOptions.h @@ -8,8 +8,12 @@ using std::string; #define OPTIONS_MUSICVOLUME "musicVolume" #define OPTIONS_SFXVOLUME "sfxVolume" + #define OPTIONS_DIFFICULTY_MODE_UNLOCKED "prx_handler" //huhu #define OPTIONS_MOMIR_MODE_UNLOCKED "prx_rimom" //haha +#define OPTIONS_EVILTWIN_MODE_UNLOCKED "prx_eviltwin" +#define OPTIONS_RANDOMDECK_MODE_UNLOCKED "prx_rnddeck" + #define OPTIONS_DIFFICULTY "difficulty" #define OPTIONS_CACHESIZE "cacheSize" #define OPTIONS_PLASMAEFFECT "plasmaEffect" diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index c40abbab6..f9ec8022e 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -25,7 +25,7 @@ class Player: public Damageable{ MTGPlayerCards * game; int testLife(); int afterDamage(); - Player(MTGPlayerCards * _deck, string deckFile); + Player(MTGPlayerCards * _deck, string deckFile, string deckFileSmall); virtual ~Player(); void unTapPhase(); MTGInPlay * inPlay(); @@ -37,11 +37,12 @@ class Player: public Damageable{ int getId(); JQuad * getIcon(); string deckFile; + string deckFileSmall; }; class HumanPlayer: public Player{ public: - HumanPlayer(MTGPlayerCards * _deck, char * _deckFile); + HumanPlayer(MTGPlayerCards * _deck, char * _deckFile, string _deckFileSmall); }; diff --git a/projects/mtg/src/AIMomirPlayer.cpp b/projects/mtg/src/AIMomirPlayer.cpp index 00a132c9a..e6ad918c8 100644 --- a/projects/mtg/src/AIMomirPlayer.cpp +++ b/projects/mtg/src/AIMomirPlayer.cpp @@ -9,7 +9,7 @@ MTGAbility * AIMomirPlayer::momirAbility = NULL; -AIMomirPlayer::AIMomirPlayer(MTGPlayerCards * _deck, char * file, char * avatarFile): AIPlayerBaka(_deck,file, avatarFile){ +AIMomirPlayer::AIMomirPlayer(MTGPlayerCards * _deck, char * file, char * fileSmall, char * avatarFile): AIPlayerBaka(_deck,file, fileSmall, avatarFile){ momirAbility = NULL; agressivity = 100; } diff --git a/projects/mtg/src/AIPlayer.cpp b/projects/mtg/src/AIPlayer.cpp index 682b24b54..81a50632f 100644 --- a/projects/mtg/src/AIPlayer.cpp +++ b/projects/mtg/src/AIPlayer.cpp @@ -26,7 +26,7 @@ int AIAction::Act(){ return 0; } -AIPlayer::AIPlayer(MTGPlayerCards * _deck, string file): Player(_deck, file){ +AIPlayer::AIPlayer(MTGPlayerCards * _deck, string file, string fileSmall): Player(_deck, file, fileSmall){ potentialMana = NEW ManaCost(); nextCardToPlay = NULL; stats = NULL; @@ -519,113 +519,54 @@ int AIPlayer::combatDamages(){ } -/* -int AIPlayer::combatDamages(){ - int result = 0; - GameObserver * gameObs = GameObserver::GetInstance(); - int currentGamePhase = gameObs->getCurrentGamePhase(); - - if (currentGamePhase == Constants::MTG_PHASE_COMBATBLOCKERS) return orderBlockers(); - - if (currentGamePhase != Constants::MTG_PHASE_COMBATDAMAGE) return 0; - DamageResolverLayer * drl = gameObs->mLayers->combatLayer(); -#if defined (WIN32) || defined (LINUX) - OutputDebugString("AI Combat Phase START\n"); -#endif - if (drl->currentChoosingPlayer == this){ -#if defined (WIN32) || defined (LINUX) - OutputDebugString("This player chooses\n"); -#endif - for (int i = 0; i < drl->mCount; i++){ -#if defined (WIN32) || defined (LINUX) - OutputDebugString("AI Combat Phase\n"); -#endif - DamagerDamaged * current = (DamagerDamaged *) drl->mObjects[i]; - if (current->damageSelecter == this){ - result = 1; - DamagerDamaged * canardEmissaire = NULL; - for (int j = 0; j < drl->mCount; j++){ - DamagerDamaged * opponent = (DamagerDamaged *) drl->mObjects[j]; - if (drl->isOpponent(current, opponent)){ - if (!canardEmissaire) canardEmissaire = opponent; - int over = opponent->hasLethalDamage(); - while(!over){ - if(!current->dealOneDamage(opponent)){ - over = 1; - }else{ - over = opponent->hasLethalDamage(); - } -#if defined (WIN32) || defined (LINUX) - char buf[4096]; - sprintf(buf, "==========\n%s deals %i damages to %s\n=============\n", current->card->getName(), 1, opponent->card->getName()); - OutputDebugString(buf); -#endif - } - } - } - if (canardEmissaire && !current->card->has(Constants::TRAMPLE)){ - while(current->dealOneDamage(canardEmissaire)){ -#if defined (WIN32) || defined (LINUX) - OutputDebugString("==========\nDealing damage to Canard Emissaire\n================\n"); -#endif - - } - } - } - } - - if (result){ - drl->nextPlayer(); - } - } - return result; - -} -*/ AIStats * AIPlayer::getStats(){ if (!stats){ char statFile[512]; - sprintf(statFile, RESPATH"/ai/baka/stats/%s.stats", opponent()->deckFile.c_str()); + sprintf(statFile, RESPATH"/ai/baka/stats/%s.stats", opponent()->deckFileSmall.c_str()); stats = NEW AIStats(this, statFile); } return stats; } -AIPlayer * AIPlayerFactory::createAIPlayer(MTGAllCards * collection, MTGPlayerCards * oponents_deck, int deckid){ - if (!deckid){ - int nbdecks = 0; - int found = 1; - while (found){ - found = 0; - char buffer[512]; - sprintf(buffer, RESPATH"/ai/baka/deck%i.txt",nbdecks+1); - std::ifstream file(buffer); - if(file){ - found = 1; - file.close(); - nbdecks++; - } - } - if (!nbdecks) return NULL; - deckid = 1 + rand() % (nbdecks); - } +AIPlayer * AIPlayerFactory::createAIPlayer(MTGAllCards * collection, Player * opponent, int deckid){ char deckFile[512]; - sprintf(deckFile, RESPATH"/ai/baka/deck%i.txt",deckid); char avatarFile[512]; - sprintf(avatarFile, "ai/baka/avatars/avatar%i.jpg",deckid); - char deckFileSmall[512]; - sprintf(deckFileSmall, "ai_baka_deck%i",deckid); -#if defined (WIN32) || defined (LINUX) - char debuf[4096]; - sprintf(debuf,"Deck File: %s", deckFile); - OutputDebugString(debuf); -#endif + + if (deckid == -1){ //Evil twin + sprintf(deckFile, opponent->deckFile.c_str()); + OutputDebugString(opponent->deckFile.c_str()); + sprintf(avatarFile, "player/avatar.jpg"); + sprintf(deckFileSmall, "ai_baka_eviltwin"); + }else{ + if (!deckid){ + int nbdecks = 0; + int found = 1; + while (found){ + found = 0; + char buffer[512]; + sprintf(buffer, RESPATH"/ai/baka/deck%i.txt",nbdecks+1); + std::ifstream file(buffer); + if(file){ + found = 1; + file.close(); + nbdecks++; + } + } + if (!nbdecks) return NULL; + deckid = 1 + rand() % (nbdecks); + } + sprintf(deckFile, RESPATH"/ai/baka/deck%i.txt",deckid); + sprintf(avatarFile, "ai/baka/avatars/avatar%i.jpg",deckid); + sprintf(deckFileSmall, "ai_baka_deck%i",deckid); + } + + MTGDeck * tempDeck = NEW MTGDeck(deckFile, NULL, collection); MTGPlayerCards * deck = NEW MTGPlayerCards(collection,tempDeck); delete tempDeck; - AIPlayerBaka * baka = NEW AIPlayerBaka(deck,deckFileSmall, avatarFile); + AIPlayerBaka * baka = NEW AIPlayerBaka(deck,deckFile, deckFileSmall, avatarFile); return baka; } @@ -665,7 +606,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * potentialMana, const c return nextCardToPlay; } -AIPlayerBaka::AIPlayerBaka(MTGPlayerCards * _deck, char * file, char * avatarFile): AIPlayer(_deck,file){ +AIPlayerBaka::AIPlayerBaka(MTGPlayerCards * _deck, char * file, char * fileSmall, char * avatarFile): AIPlayer(_deck,file, fileSmall){ if (fileExists(avatarFile)){ mAvatarTex = JRenderer::GetInstance()->LoadTexture(avatarFile, TEX_TYPE_USE_VRAM); }else{ diff --git a/projects/mtg/src/Credits.cpp b/projects/mtg/src/Credits.cpp index 3889178b2..244f07726 100644 --- a/projects/mtg/src/Credits.cpp +++ b/projects/mtg/src/Credits.cpp @@ -78,14 +78,16 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app){ unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96); GameOptions::GetInstance()->values[OPTIONS_DIFFICULTY_MODE_UNLOCKED] = GameOption(1); GameOptions::GetInstance()->save(); - }else{ - unlocked = isMomirUnlocked(); - if (unlocked){ + }else if(unlocked = isMomirUnlocked()) { unlockedTex = JRenderer::GetInstance()->LoadTexture("graphics/momir_unlocked.png", TEX_TYPE_USE_VRAM); unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96); GameOptions::GetInstance()->values[OPTIONS_MOMIR_MODE_UNLOCKED] = GameOption(1); GameOptions::GetInstance()->save(); - } + }else if(unlocked = isEvilTwinUnlocked()) { + unlockedTex = JRenderer::GetInstance()->LoadTexture("graphics/eviltwin_unlocked.png", TEX_TYPE_USE_VRAM); + unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96); + GameOptions::GetInstance()->values[OPTIONS_EVILTWIN_MODE_UNLOCKED] = GameOption(1); + GameOptions::GetInstance()->save(); } if (unlocked){ JSample * sample = SampleCache::GetInstance()->getSample("sound/sfx/bonus.wav"); @@ -195,3 +197,9 @@ int Credits::isMomirUnlocked(){ if (p1->game->inPlay->countByType("land") == 8) return 1; return 0; } + +int Credits::isEvilTwinUnlocked(){ + if (GameOptions::GetInstance()->values[OPTIONS_EVILTWIN_MODE_UNLOCKED].getIntValue()) return 0; + if (p1->game->inPlay->nb_cards && (p1->game->inPlay->nb_cards == p2->game->inPlay->nb_cards)) return 1; + return 0; +} diff --git a/projects/mtg/src/GameStateDuel.cpp b/projects/mtg/src/GameStateDuel.cpp index 3ec17f5d2..1f6944199 100644 --- a/projects/mtg/src/GameStateDuel.cpp +++ b/projects/mtg/src/GameStateDuel.cpp @@ -119,9 +119,9 @@ void GameStateDuel::loadPlayerMomir(int playerId, int isAI){ MTGDeck * tempDeck = NEW MTGDeck(deckFile, NULL, mParent->collection); deck[playerId] = NEW MTGPlayerCards(mParent->collection,tempDeck); if (!isAI){ //Human Player - mPlayers[playerId] = NEW HumanPlayer(deck[playerId],deckFileSmall); + mPlayers[playerId] = NEW HumanPlayer(deck[playerId],deckFile, deckFileSmall); }else{ - mPlayers[playerId] = NEW AIMomirPlayer(deck[playerId],deckFile,empty); + mPlayers[playerId] = NEW AIMomirPlayer(deck[playerId],deckFile,deckFileSmall, empty); } delete tempDeck; } @@ -138,15 +138,19 @@ void GameStateDuel::loadPlayer(int playerId, int decknb, int isAI){ MTGDeck * tempDeck = NEW MTGDeck(deckFile, NULL, mParent->collection); deck[playerId] = NEW MTGPlayerCards(mParent->collection,tempDeck); delete tempDeck; - mPlayers[playerId] = NEW HumanPlayer(deck[playerId],deckFileSmall); + mPlayers[playerId] = NEW HumanPlayer(deck[playerId],deckFile, deckFileSmall); }else{ //AI Player, chose deck AIPlayerFactory playerCreator; - mPlayers[playerId] = playerCreator.createAIPlayer(mParent->collection,NULL,decknb); + Player * opponent = NULL; + if (playerId == 1) opponent = mPlayers[0]; + mPlayers[playerId] = playerCreator.createAIPlayer(mParent->collection,opponent,decknb); deck[playerId] = mPlayers[playerId]->game; } - }else{ + }else{ //Random AI deck AIPlayerFactory playerCreator; - mPlayers[playerId] = playerCreator.createAIPlayer(mParent->collection,NULL); + Player * opponent = NULL; + if (playerId == 1) opponent = mPlayers[0]; + mPlayers[playerId] = playerCreator.createAIPlayer(mParent->collection,opponent); deck[playerId] = mPlayers[playerId]->game; } } @@ -262,6 +266,9 @@ void GameStateDuel::Update(float dt) if (!opponentMenu){ opponentMenu = NEW SimpleMenu(DUEL_MENU_CHOOSE_OPPONENT, this, opponentMenuFont, 35, 25, "Choose Opponent"); opponentMenu->Add(0,"Random"); + if (GameOptions::GetInstance()->values[OPTIONS_EVILTWIN_MODE_UNLOCKED].getIntValue()){ + opponentMenu->Add(-1,"Evil Twin", "Can you play against yourself?"); + } nbAIDecks = 0; int found = 1; while (found){ @@ -425,13 +432,13 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId) switch(controlId){ case 0: loadPlayer(1); - opponentMenu->Close(); - mGamePhase = DUEL_STATE_CHOOSE_DECK2_TO_PLAY; + opponentMenu->Close(); + mGamePhase = DUEL_STATE_CHOOSE_DECK2_TO_PLAY; break; default: loadPlayer(1,controlId,1); - opponentMenu->Close(); - mGamePhase = DUEL_STATE_CHOOSE_DECK2_TO_PLAY; + opponentMenu->Close(); + mGamePhase = DUEL_STATE_CHOOSE_DECK2_TO_PLAY; break; } diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 5e867db2b..091370130 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -4,8 +4,9 @@ #include "../include/DeckStats.h" -Player::Player(MTGPlayerCards * _deck, string file): Damageable(20){ +Player::Player(MTGPlayerCards * _deck, string file, string fileSmall): Damageable(20){ deckFile = file; + deckFileSmall = fileSmall; game = _deck; game->setOwner(this); manaPool = NEW ManaCost(); @@ -55,7 +56,7 @@ Player * Player::opponent(){ return NULL; } -HumanPlayer::HumanPlayer(MTGPlayerCards * _deck, char * file):Player(_deck, file){ +HumanPlayer::HumanPlayer(MTGPlayerCards * _deck, char * file, string fileSmall):Player(_deck, file, fileSmall){ mAvatarTex = JRenderer::GetInstance()->LoadTexture("player/avatar.jpg", TEX_TYPE_USE_VRAM); if (mAvatarTex) mAvatar = NEW JQuad(mAvatarTex, 0, 0, 35, 50); diff --git a/projects/mtg/src/TestSuiteAI.cpp b/projects/mtg/src/TestSuiteAI.cpp index 5fcca70a5..d812a4b30 100644 --- a/projects/mtg/src/TestSuiteAI.cpp +++ b/projects/mtg/src/TestSuiteAI.cpp @@ -8,7 +8,7 @@ #include using std::string; -TestSuiteAI::TestSuiteAI(TestSuite * _suite, int playerId):AIPlayer(_suite->buildDeck(playerId),"testsuite"){ +TestSuiteAI::TestSuiteAI(TestSuite * _suite, int playerId):AIPlayer(_suite->buildDeck(playerId),"testsuite", "testsuite"){ suite = _suite; timer= 0; mAvatarTex = JRenderer::GetInstance()->LoadTexture("ai/baka/avatar.jpg", TEX_TYPE_USE_VRAM);