- Added "Evil twin" Mode to unlock
This commit is contained in:
wagic.the.homebrew@gmail.com
2009-07-05 10:08:13 +00:00
parent d8ac4a49b1
commit 11af671496
12 changed files with 81 additions and 118 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

+1 -1
View File
@@ -6,7 +6,7 @@
class AIMomirPlayer:public AIPlayerBaka{ class AIMomirPlayer:public AIPlayerBaka{
public: public:
AIMomirPlayer(MTGPlayerCards * _deck, char * file, char * avatarFile); AIMomirPlayer(MTGPlayerCards * _deck, char * file, char * fileSmall, char * avatarFile);
int getEfficiency(AIAction * action); int getEfficiency(AIAction * action);
int momir(); int momir();
int computeActions(); int computeActions();
+3 -3
View File
@@ -65,7 +65,7 @@ class AIPlayer: public Player{
virtual int displayStack(){return 0;}; virtual int displayStack(){return 0;};
AIStats * stats; AIStats * stats;
ManaCost * getPotentialMana(); ManaCost * getPotentialMana();
AIPlayer(MTGPlayerCards * _deck, string deckFile); AIPlayer(MTGPlayerCards * _deck, string deckFile, string deckFileSmall);
virtual ~AIPlayer(); virtual ~AIPlayer();
virtual MTGCardInstance * chooseCard(TargetChooser * tc, MTGCardInstance * source, int random = 0); virtual MTGCardInstance * chooseCard(TargetChooser * tc, MTGCardInstance * source, int random = 0);
virtual int chooseTarget(TargetChooser * tc = NULL); virtual int chooseTarget(TargetChooser * tc = NULL);
@@ -85,7 +85,7 @@ class AIPlayerBaka: public AIPlayer{
float timer; float timer;
MTGCardInstance * FindCardToPlay(ManaCost * potentialMana, const char * type); MTGCardInstance * FindCardToPlay(ManaCost * potentialMana, const char * type);
public: public:
AIPlayerBaka(MTGPlayerCards * _deck, char * deckFile, char * avatarFile); AIPlayerBaka(MTGPlayerCards * _deck, char * deckFile, char * deckfileSmall, char * avatarFile);
virtual int Act(float dt); virtual int Act(float dt);
void initTimer(); void initTimer();
virtual int computeActions(); virtual int computeActions();
@@ -93,7 +93,7 @@ class AIPlayerBaka: public AIPlayer{
class AIPlayerFactory{ class AIPlayerFactory{
public: public:
AIPlayer * createAIPlayer(MTGAllCards * collection, MTGPlayerCards * oponents_deck, int deckid = 0); AIPlayer * createAIPlayer(MTGAllCards * collection, Player * opponent, int deckid = 0);
}; };
+1
View File
@@ -24,6 +24,7 @@ class Credits{
private: private:
int isDifficultyUnlocked(); int isDifficultyUnlocked();
int isMomirUnlocked(); int isMomirUnlocked();
int isEvilTwinUnlocked();
public: public:
int value; int value;
Player * p1, *p2; Player * p1, *p2;
+4
View File
@@ -8,8 +8,12 @@ using std::string;
#define OPTIONS_MUSICVOLUME "musicVolume" #define OPTIONS_MUSICVOLUME "musicVolume"
#define OPTIONS_SFXVOLUME "sfxVolume" #define OPTIONS_SFXVOLUME "sfxVolume"
#define OPTIONS_DIFFICULTY_MODE_UNLOCKED "prx_handler" //huhu #define OPTIONS_DIFFICULTY_MODE_UNLOCKED "prx_handler" //huhu
#define OPTIONS_MOMIR_MODE_UNLOCKED "prx_rimom" //haha #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_DIFFICULTY "difficulty"
#define OPTIONS_CACHESIZE "cacheSize" #define OPTIONS_CACHESIZE "cacheSize"
#define OPTIONS_PLASMAEFFECT "plasmaEffect" #define OPTIONS_PLASMAEFFECT "plasmaEffect"
+3 -2
View File
@@ -25,7 +25,7 @@ class Player: public Damageable{
MTGPlayerCards * game; MTGPlayerCards * game;
int testLife(); int testLife();
int afterDamage(); int afterDamage();
Player(MTGPlayerCards * _deck, string deckFile); Player(MTGPlayerCards * _deck, string deckFile, string deckFileSmall);
virtual ~Player(); virtual ~Player();
void unTapPhase(); void unTapPhase();
MTGInPlay * inPlay(); MTGInPlay * inPlay();
@@ -37,11 +37,12 @@ class Player: public Damageable{
int getId(); int getId();
JQuad * getIcon(); JQuad * getIcon();
string deckFile; string deckFile;
string deckFileSmall;
}; };
class HumanPlayer: public Player{ class HumanPlayer: public Player{
public: public:
HumanPlayer(MTGPlayerCards * _deck, char * _deckFile); HumanPlayer(MTGPlayerCards * _deck, char * _deckFile, string _deckFileSmall);
}; };
+1 -1
View File
@@ -9,7 +9,7 @@
MTGAbility * AIMomirPlayer::momirAbility = NULL; 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; momirAbility = NULL;
agressivity = 100; agressivity = 100;
} }
+35 -94
View File
@@ -26,7 +26,7 @@ int AIAction::Act(){
return 0; 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(); potentialMana = NEW ManaCost();
nextCardToPlay = NULL; nextCardToPlay = NULL;
stats = 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(){ AIStats * AIPlayer::getStats(){
if (!stats){ if (!stats){
char statFile[512]; 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); stats = NEW AIStats(this, statFile);
} }
return stats; return stats;
} }
AIPlayer * AIPlayerFactory::createAIPlayer(MTGAllCards * collection, MTGPlayerCards * oponents_deck, int deckid){ AIPlayer * AIPlayerFactory::createAIPlayer(MTGAllCards * collection, Player * opponent, 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);
}
char deckFile[512]; char deckFile[512];
sprintf(deckFile, RESPATH"/ai/baka/deck%i.txt",deckid);
char avatarFile[512]; char avatarFile[512];
sprintf(avatarFile, "ai/baka/avatars/avatar%i.jpg",deckid);
char deckFileSmall[512]; char deckFileSmall[512];
sprintf(deckFileSmall, "ai_baka_deck%i",deckid);
#if defined (WIN32) || defined (LINUX) if (deckid == -1){ //Evil twin
char debuf[4096]; sprintf(deckFile, opponent->deckFile.c_str());
sprintf(debuf,"Deck File: %s", deckFile); OutputDebugString(opponent->deckFile.c_str());
OutputDebugString(debuf); sprintf(avatarFile, "player/avatar.jpg");
#endif 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); MTGDeck * tempDeck = NEW MTGDeck(deckFile, NULL, collection);
MTGPlayerCards * deck = NEW MTGPlayerCards(collection,tempDeck); MTGPlayerCards * deck = NEW MTGPlayerCards(collection,tempDeck);
delete tempDeck; delete tempDeck;
AIPlayerBaka * baka = NEW AIPlayerBaka(deck,deckFileSmall, avatarFile); AIPlayerBaka * baka = NEW AIPlayerBaka(deck,deckFile, deckFileSmall, avatarFile);
return baka; return baka;
} }
@@ -665,7 +606,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * potentialMana, const c
return nextCardToPlay; 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)){ if (fileExists(avatarFile)){
mAvatarTex = JRenderer::GetInstance()->LoadTexture(avatarFile, TEX_TYPE_USE_VRAM); mAvatarTex = JRenderer::GetInstance()->LoadTexture(avatarFile, TEX_TYPE_USE_VRAM);
}else{ }else{
+12 -4
View File
@@ -78,14 +78,16 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app){
unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96); unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96);
GameOptions::GetInstance()->values[OPTIONS_DIFFICULTY_MODE_UNLOCKED] = GameOption(1); GameOptions::GetInstance()->values[OPTIONS_DIFFICULTY_MODE_UNLOCKED] = GameOption(1);
GameOptions::GetInstance()->save(); GameOptions::GetInstance()->save();
}else{ }else if(unlocked = isMomirUnlocked()) {
unlocked = isMomirUnlocked();
if (unlocked){
unlockedTex = JRenderer::GetInstance()->LoadTexture("graphics/momir_unlocked.png", TEX_TYPE_USE_VRAM); unlockedTex = JRenderer::GetInstance()->LoadTexture("graphics/momir_unlocked.png", TEX_TYPE_USE_VRAM);
unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96); unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96);
GameOptions::GetInstance()->values[OPTIONS_MOMIR_MODE_UNLOCKED] = GameOption(1); GameOptions::GetInstance()->values[OPTIONS_MOMIR_MODE_UNLOCKED] = GameOption(1);
GameOptions::GetInstance()->save(); 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){ if (unlocked){
JSample * sample = SampleCache::GetInstance()->getSample("sound/sfx/bonus.wav"); 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; if (p1->game->inPlay->countByType("land") == 8) return 1;
return 0; 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;
}
+17 -10
View File
@@ -119,9 +119,9 @@ void GameStateDuel::loadPlayerMomir(int playerId, int isAI){
MTGDeck * tempDeck = NEW MTGDeck(deckFile, NULL, mParent->collection); MTGDeck * tempDeck = NEW MTGDeck(deckFile, NULL, mParent->collection);
deck[playerId] = NEW MTGPlayerCards(mParent->collection,tempDeck); deck[playerId] = NEW MTGPlayerCards(mParent->collection,tempDeck);
if (!isAI){ //Human Player if (!isAI){ //Human Player
mPlayers[playerId] = NEW HumanPlayer(deck[playerId],deckFileSmall); mPlayers[playerId] = NEW HumanPlayer(deck[playerId],deckFile, deckFileSmall);
}else{ }else{
mPlayers[playerId] = NEW AIMomirPlayer(deck[playerId],deckFile,empty); mPlayers[playerId] = NEW AIMomirPlayer(deck[playerId],deckFile,deckFileSmall, empty);
} }
delete tempDeck; delete tempDeck;
} }
@@ -138,15 +138,19 @@ void GameStateDuel::loadPlayer(int playerId, int decknb, int isAI){
MTGDeck * tempDeck = NEW MTGDeck(deckFile, NULL, mParent->collection); MTGDeck * tempDeck = NEW MTGDeck(deckFile, NULL, mParent->collection);
deck[playerId] = NEW MTGPlayerCards(mParent->collection,tempDeck); deck[playerId] = NEW MTGPlayerCards(mParent->collection,tempDeck);
delete tempDeck; delete tempDeck;
mPlayers[playerId] = NEW HumanPlayer(deck[playerId],deckFileSmall); mPlayers[playerId] = NEW HumanPlayer(deck[playerId],deckFile, deckFileSmall);
}else{ //AI Player, chose deck }else{ //AI Player, chose deck
AIPlayerFactory playerCreator; 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; deck[playerId] = mPlayers[playerId]->game;
} }
}else{ }else{ //Random AI deck
AIPlayerFactory playerCreator; 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; deck[playerId] = mPlayers[playerId]->game;
} }
} }
@@ -262,6 +266,9 @@ void GameStateDuel::Update(float dt)
if (!opponentMenu){ if (!opponentMenu){
opponentMenu = NEW SimpleMenu(DUEL_MENU_CHOOSE_OPPONENT, this, opponentMenuFont, 35, 25, "Choose Opponent"); opponentMenu = NEW SimpleMenu(DUEL_MENU_CHOOSE_OPPONENT, this, opponentMenuFont, 35, 25, "Choose Opponent");
opponentMenu->Add(0,"Random"); 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; nbAIDecks = 0;
int found = 1; int found = 1;
while (found){ while (found){
@@ -425,13 +432,13 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
switch(controlId){ switch(controlId){
case 0: case 0:
loadPlayer(1); loadPlayer(1);
opponentMenu->Close(); opponentMenu->Close();
mGamePhase = DUEL_STATE_CHOOSE_DECK2_TO_PLAY; mGamePhase = DUEL_STATE_CHOOSE_DECK2_TO_PLAY;
break; break;
default: default:
loadPlayer(1,controlId,1); loadPlayer(1,controlId,1);
opponentMenu->Close(); opponentMenu->Close();
mGamePhase = DUEL_STATE_CHOOSE_DECK2_TO_PLAY; mGamePhase = DUEL_STATE_CHOOSE_DECK2_TO_PLAY;
break; break;
} }
+3 -2
View File
@@ -4,8 +4,9 @@
#include "../include/DeckStats.h" #include "../include/DeckStats.h"
Player::Player(MTGPlayerCards * _deck, string file): Damageable(20){ Player::Player(MTGPlayerCards * _deck, string file, string fileSmall): Damageable(20){
deckFile = file; deckFile = file;
deckFileSmall = fileSmall;
game = _deck; game = _deck;
game->setOwner(this); game->setOwner(this);
manaPool = NEW ManaCost(); manaPool = NEW ManaCost();
@@ -55,7 +56,7 @@ Player * Player::opponent(){
return NULL; 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); mAvatarTex = JRenderer::GetInstance()->LoadTexture("player/avatar.jpg", TEX_TYPE_USE_VRAM);
if (mAvatarTex) if (mAvatarTex)
mAvatar = NEW JQuad(mAvatarTex, 0, 0, 35, 50); mAvatar = NEW JQuad(mAvatarTex, 0, 0, 35, 50);
+1 -1
View File
@@ -8,7 +8,7 @@
#include <string> #include <string>
using std::string; 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; suite = _suite;
timer= 0; timer= 0;
mAvatarTex = JRenderer::GetInstance()->LoadTexture("ai/baka/avatar.jpg", TEX_TYPE_USE_VRAM); mAvatarTex = JRenderer::GetInstance()->LoadTexture("ai/baka/avatar.jpg", TEX_TYPE_USE_VRAM);