I just played 3 long games and I was able to undo two fully and got an assert on the third one after more than 1000 actions... so I commit what I have:

- Modified undo to stop at "next phase" action
- Added "muligan" and "force library shuffling" to the list of logged action
- Fixed random logging
- Fixed double logging of actions
- Merged all the "next game" functions into a single one
- Created a PlayerType type instead of using int
- Moved the player loading code into the GameObserver and out of GameStateDuel to avoid having player references in both and simplify the initialization and termination. Tweeked a bit the humanplayer class to be able to do that.
- Added a "load" menu available in testsuite mode, I use that to load problematique game. To use it, just copy-paste a game from the traces into Res/test/game/timetwister.txt. Game in traces starts by "rvalues:..." and ends by "[end]"
- Added some untested and commented out code in GuiCombat to use the mouse/touch to setup the damage on the blockers
- Broke the network game ... hoh well, I'll repair it when everything else works !!
- various code cleanup and compilation fixes on Linux
This commit is contained in:
Xawotihs
2011-10-26 22:14:12 +00:00
parent 45f09972ad
commit c3dc51aed1
34 changed files with 410 additions and 297 deletions
+29 -90
View File
@@ -67,7 +67,6 @@ int GameStateDuel::selectedAIDeckId = 0;
GameStateDuel::GameStateDuel(GameApp* parent) :
GameState(parent, "duel")
{
mPlayers.clear();
premadeDeck = false;
game = NULL;
deckmenu = NULL;
@@ -120,6 +119,8 @@ void GameStateDuel::Start()
renderer->EnableVSync(true);
OpponentsDeckid = 0;
game = NEW GameObserver();
#ifdef TESTSUITE
SAFE_DELETE(testSuite);
testSuite = NEW TestSuite("test/_tests.txt");
@@ -184,64 +185,6 @@ void GameStateDuel::Start()
}
deckmenu->Add(MENUITEM_CANCEL, "Main Menu", "Return to Main Menu");
}
mPlayers.clear();
}
void GameStateDuel::loadPlayer(int playerId, int decknb, bool isAI, bool isNetwork)
{
if (decknb)
{
if (!isAI)
{ //Human Player
if(playerId == 0)
{
char deckFile[255];
if (premadeDeck)
sprintf(deckFile, "player/premade/deck%i.txt", decknb);
else
sprintf(deckFile, "%s/deck%i.txt", options.profileFile().c_str(), decknb);
char deckFileSmall[255];
sprintf(deckFileSmall, "player_deck%i", decknb);
mPlayers.push_back(NEW HumanPlayer(game, deckFile, deckFileSmall));
#ifdef NETWORK_SUPPORT
if(isNetwork)
{
ProxyPlayer* mProxy;
mProxy = NEW ProxyPlayer(mPlayers[playerId], mParent->mpNetwork);
}
}
else
{ //Remote player
mPlayers.push_back(NEW RemotePlayer(mParent->mpNetwork));
#endif //NETWORK_SUPPORT
}
}
else
{ //AI Player, chooses deck
AIPlayerFactory playerCreator;
Player * opponent = NULL;
if (playerId == 1) opponent = mPlayers[0];
mPlayers.push_back(playerCreator.createAIPlayer(game, MTGCollection(), opponent, decknb));
}
}
else
{ //Random deck
AIPlayerFactory playerCreator;
Player * opponent = NULL;
if (playerId == 1) opponent = mPlayers[0];
#ifdef AI_CHANGE_TESTING
if (mParent->players[0] == PLAYER_TYPE_CPU_TEST)
mPlayers.push_back(playerCreator.createAIPlayerTest(game, MTGCollection(), opponent, playerId == 0 ? "ai/bakaA/" : "ai/bakaB/"));
else
#endif
{
mPlayers.push_back(playerCreator.createAIPlayer(game, MTGCollection(), opponent));
}
if (mParent->players[playerId] == PLAYER_TYPE_CPU_TEST)
((AIPlayer *) mPlayers[playerId])->setFastTimerMode();
}
}
void GameStateDuel::initRand(unsigned int seed)
@@ -258,12 +201,10 @@ void GameStateDuel::loadTestSuitePlayers()
initRand(testSuite->seed);
SAFE_DELETE(game);
game = new GameObserver();
mPlayers.clear();
for (int i = 0; i < 2; i++)
{
mPlayers.push_back(new TestSuiteAI(game, testSuite, i));
game->loadTestSuitePlayer(i, testSuite);
}
game->setPlayers(mPlayers);
mParent->gameType = testSuite->gameType;
game->startGame(mParent->gameType, mParent->rules);
@@ -279,22 +220,9 @@ void GameStateDuel::End()
#endif
JRenderer::GetInstance()->EnableVSync(false);
if (!premadeDeck && mPlayers.size() > 1 && mPlayers[0] && mPlayers[1])
{ // save the stats for the game
mPlayers[0]->End();
}
else if (mPlayers.size() && mPlayers.size() == 1 && mPlayers[0] )
// clean up player object
SAFE_DELETE( mPlayers[0] );
SAFE_DELETE(game);
premadeDeck = false;
if(mPlayers.size())
for (size_t i = 0; i < mPlayers.size(); i++)
{
mPlayers[i] = NULL;
}
mPlayers.clear();
SAFE_DELETE(credits);
SAFE_DELETE(menu);
@@ -325,7 +253,7 @@ void GameStateDuel::ConstructOpponentMenu()
DeckManager * deckManager = DeckManager::GetInstance();
vector<DeckMetaData*> opponentDeckList;
int nbUnlockedDecks = options[Options::CHEATMODEAIDECK].number ? 1000 : options[Options::AIDECKS_UNLOCKED].number;
opponentDeckList = fillDeckMenu(opponentMenu, "ai/baka", "ai_baka", mPlayers[0], nbUnlockedDecks);
opponentDeckList = fillDeckMenu(opponentMenu, "ai/baka", "ai_baka", game->getPlayer(0), nbUnlockedDecks);
deckManager->updateMetaDataList(&opponentDeckList, true);
opponentMenu->Add(MENUITEM_CANCEL, "Cancel", _("Choose a different player deck").c_str());
opponentDeckList.clear();
@@ -393,7 +321,7 @@ void GameStateDuel::Update(float dt)
}
else
{
loadPlayer(0);
game->loadPlayer(0, mParent->players[0]);
setGamePhase(DUEL_STATE_CHOOSE_DECK2);
}
}
@@ -416,7 +344,7 @@ void GameStateDuel::Update(float dt)
}
else
{
loadPlayer(1);
game->loadPlayer(1, mParent->players[1]);
setGamePhase(DUEL_STATE_PLAY);
}
}
@@ -439,9 +367,8 @@ void GameStateDuel::Update(float dt)
}
break;
case DUEL_STATE_PLAY:
if (!game)
if (!game->isStarted())
{
game = new GameObserver(mPlayers);
game->startGame(mParent->gameType, mParent->rules);
//start of in game music code
@@ -523,6 +450,9 @@ void GameStateDuel::Update(float dt)
//END almosthumane - mulligan
menu->Add(MENUITEM_MAIN_MENU, "Back to main menu");
menu->Add(MENUITEM_UNDO, "Undo");
#ifdef TESTSUITE
menu->Add(MENUITEM_LOAD, "Load");
#endif
menu->Add(MENUITEM_CANCEL, "Cancel");
}
setGamePhase(DUEL_STATE_MENU);
@@ -763,7 +693,7 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
switch (controlId)
{
case MENUITEM_RANDOM_AI:
loadPlayer(1);
game->loadPlayer(1, mParent->players[1]);
opponentMenu->Close();
setGamePhase(DUEL_STATE_CHOOSE_DECK2_TO_PLAY);
break;
@@ -803,7 +733,7 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
}
else if (controlId != MENUITEM_EVIL_TWIN && aiDeckSize > 0) // evil twin
deckNumber = deckManager->getAIDeckOrderList()->at(controlId - 1)->getDeckId();
loadPlayer(1, deckNumber, 1);
game->loadPlayer(1, mParent->players[1], deckNumber, premadeDeck);
OpponentsDeckid = deckNumber;
opponentMenu->Close();
setGamePhase(DUEL_STATE_CHOOSE_DECK2_TO_PLAY);
@@ -817,7 +747,7 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
{
vector<DeckMetaData *> * playerDeckList = deckManager->getPlayerDeckOrderList();
deckNumber = playerDeckList->at(WRand() % (playerDeckList->size()))->getDeckId();
loadPlayer(0, deckNumber);
game->loadPlayer(0, mParent->players[0], deckNumber, premadeDeck);
deckmenu->Close();
setGamePhase(DUEL_STATE_CHOOSE_DECK2_TO_PLAY);
break;
@@ -860,11 +790,7 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
vector<DeckMetaData *> * playerDeck = deckManager->getPlayerDeckOrderList();
if (!premadeDeck && controlId > 0)
deckNumber = playerDeck->at(controlId - 1)->getDeckId();
loadPlayer(0, deckNumber, false
#ifdef NETWORK_SUPPORT
,(mParent->players[1] == PLAYER_TYPE_REMOTE)
#endif //NETWORK_SUPPORT
);
game->loadPlayer(0, mParent->players[0], deckNumber, premadeDeck);
deckmenu->Close();
#ifdef NETWORK_SUPPORT
if(mParent->players[1] == PLAYER_TYPE_REMOTE)
@@ -880,7 +806,7 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
}
else
{
loadPlayer(1, controlId);
game->loadPlayer(1, mParent->players[1], controlId, premadeDeck);
deckmenu->Close();
setGamePhase(DUEL_STATE_CHOOSE_DECK2_TO_PLAY);
}
@@ -901,7 +827,7 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
break;
case MENUITEM_MULLIGAN:
//almosthumane - mulligan
game->currentPlayer->takeMulligan();
game->Mulligan();
menu->Close();
setGamePhase(DUEL_STATE_CANCEL);
@@ -913,6 +839,19 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
setGamePhase(DUEL_STATE_CANCEL);
break;
}
#ifdef TESTSUITE
case MENUITEM_LOAD:
{
std::string theGame;
if (JFileSystem::GetInstance()->readIntoString("test/game/timetwister.txt", theGame))
{
game->load(theGame);
}
menu->Close();
setGamePhase(DUEL_STATE_CANCEL);
break;
}
#endif
}
}
}