Files
wagic/projects/mtg/include/GameStateDuel.h

288 lines
8.9 KiB
C++

#ifndef _GAME_STATE_DUEL_H_
#define _GAME_STATE_DUEL_H_
#include "GameState.h"
#include "SimpleMenu.h"
#include "SimplePopup.h"
#include "DeckMenu.h"
#include "MTGDeck.h"
#include "GameObserver.h"
#ifdef AI_CHANGE_TESTING
#include "Threading.h"
#endif //AI_CHANGE_TESTING
#define CHOOSE_OPPONENT 7
#define NMB_PLAYERS 2 // Number of players in the game. Currently that's always 2.
#ifdef TESTSUITE
class TestSuite;
#endif
class Credits;
#ifdef NETWORK_SUPPORT
class JNetwork;
#endif
/////// Tournament Mod ///////////
#define PLAYER_TOURNAMENT "tournament.dat"
#define AI_TOURNAMENT "/ai/baka/tournament.dat"
#define AI_RESULTS_FILE "/ai/baka/ai_test.csv"
class TDeck{
public:
TDeck(int deck,PlayerType deckType,int victories = 0,int lastWin = 0, int wonMatches=0, int playedMatches=0, int wonGames=0, int playedGames=0);
TDeck();
~TDeck();
int getDeckNumber(){return mDeckNumber;}
void setDeckNumber(int deck){mDeckNumber=deck;}
void setDeckType(PlayerType ptype){mDeckType=ptype;}
PlayerType getDeckType(){return mDeckType;}
bool isAI(){return mDeckType==PLAYER_TYPE_CPU;}
void reset();
void increaseDeckNumber();
void winGame(){mVictories++;mLastWin++;mGamesPlayed++;mWonGames++;}
void winMatch(){mWonMatches++;mMatchesPlayed++;}
void setMatchesWon(int w){mWonMatches=w;}
int getMatchesWon(){return mWonMatches;}
void looseGame(){mLastWin = 0;mGamesPlayed++;}
void looseMatch(){mMatchesPlayed++;}
void drawMatch(){mMatchesPlayed++;}
int getLastWin(){return mLastWin;}
int getVictories(){return mVictories;}
void newMatch(){mVictories=0;mLastWin=0;}
void deleteStats(){mVictories=0;mLastWin=0;mWonMatches=0;mMatchesPlayed=0;mWonGames=0;mGamesPlayed=0;mRanking=0;}
void resetTournament(){mWonMatches=0;}
void setVictories(int v){mVictories=v;}
void setLastWin(int lastWin){mLastWin=lastWin;}
int getGamesPlayed(){return mGamesPlayed;}
void setGamesPlayed(int games){mGamesPlayed=games;}
int getGamesWon(){return mWonGames;}
void setGamesWon(int games){mWonGames=games;}
int getMatchesPlayed(){return mMatchesPlayed;}
void setMatchesPlayed(int matches){mMatchesPlayed=matches;}
void setRanking(int ranking){mRanking=ranking;}
int getRanking(){return mRanking;}
std::string getDeckName();
private:
int mDeckNumber;
PlayerType mDeckType;
int mVictories;
int mLastWin;
int mWonMatches;
int mMatchesPlayed;
int mWonGames;
int mGamesPlayed;
int mRanking;
int mDifficulty;
};
class Tournament{
public:
Tournament();
~Tournament();
void addDeck(int player,int deck,PlayerType deckType);
void addDeck(int player,TDeck newDeck);
int getDeckNumber(int player){return Deck[player].getDeckNumber();}
PlayerType getDeckType(int player){return Deck[player].getDeckType();}
unsigned int getAvailableDecks(){return nmbDecks;}
void setAvailableDecks(unsigned int a){nmbDecks=a;}
void setGamesToPlay(int games){mNbGames=games;}
int getGamesToPlay(){return mNbGames;}
void setMatchType(int gamestoplay,int matchMode,bool swapPlayer=false){mNbGames=gamestoplay;mMatchMode=matchMode;mCompetition=swapPlayer;}
void setMatchMode(int m){mMatchMode=m;}
int getMatchMode(){return mMatchMode;}
int getTournamentMode(){return mTournamentMode;}
bool isGauntlet();
bool isEndlessDemo();
bool isTournament(){return mTournamentMode>0;}
void setTournamentMode(int b){mTournamentMode=b;}
bool getFastTimerMode(){return mFastTimerMode;}
void setFastTimerMode(bool timerMode){mFastTimerMode=timerMode;}
void updateScoreTable(Player * _p0, Player * _p1, int gt = GAME_TYPE_CLASSIC, bool gameEnd=false);
void renderScoreTable();
bool gameFinished(bool,bool);
bool isMatchFinished(){return endOfMatch;}
bool isNextDeckFound(){return nextDeckFound;}
void swapPlayer();
void revertSwapPlayer();
void Start(); //may change the gamephase
void End();
void saveMatchResults();
bool updateTournament();
void save(bool isAI);
bool load(bool isAI, bool loadComplete);
void setOpLevel(int o){mOpLevel=o;}
int getOpLevel(){return mOpLevel;}
void initTournament();
void resetTournamentSelection(); //resets the choosen oppent decks
std::string exportTournamentDescription();
unsigned int getNumberofTournamentDecks(){return TournamentsDecks.size();}
void enableTournamantMode(int tournamentMode, int player = 0);
bool wasScoreDisplayed(){return scoreDisplayed;}
void setScoreDisplayed(bool s){scoreDisplayed=s;}
bool didHumanWin();
int gamesPlayedbyHuman();
int gamesWonbyHuman();
int matchesPlayedbyHuman();
int matchesWonbyHuman();
void calculateRanking();
void initTournamentResults();
void setRankedDeck(int rank,TDeck deck){if (rank<11&&rank>0)sortedTournamentDecks[rank-1]=deck;}
bool checkTournamentFile(bool isAI);
void leaveOutAIvsAIMatches();
void updateScoreforTournament();
int getHardRandomDeck();
int getRandomDeck(bool noEasyDecks);
int remainingDecksToNextStage();
private:
bool mCompetition;
bool mPlayerSwaped;
int mSpeed;
int mNbGames;
int mMatchMode;
int mGamesPlayed;
unsigned int TournamentsDecksID[NMB_PLAYERS];
int gauntletLastDeckNumber[NMB_PLAYERS];
TDeck Deck[NMB_PLAYERS];
std::vector<TDeck> TournamentsDecks;
int mOpLevel;
unsigned int nmbDecks; // number of decks in the last constructed deckmenu
bool mFastTimerMode;
int mTournamentMode;
bool endOfMatch;
bool nextDeckFound;
bool looserDecks; //double KO
// variables for scoretable
bool scoreDisplayed;
JQuadPtr p0Quad;
JQuadPtr p1Quad;
int mgameType;
TDeck sortedTournamentDecks[10];
int mVictories0;
int mVictories1;
bool p0IsAI;
bool p1IsAI;
bool scoreFinal;
bool tournamentFinal;
int scoreMatchesToPlay;
int scoreMatchesPlayed;
};
/////// End Tournament Mod ///////////
class GameStateDuel: public GameState, public JGuiListener
{
private:
#ifdef TESTSUITE
TestSuite * testSuite;
#endif
Credits * credits;
int mGamePhase;
GameObserver * game;
DeckMenu * deckmenu;
DeckMenu * opponentMenu;
SimpleMenu * menu;
SimplePopup * popupScreen; // used for informational screens, modal
static int selectedPlayerDeckId;
static int selectedAIDeckId;
/////// Tournament Mod ///////////
//std::ofstream ai_file;
SimpleMenu * cnogmenu; // to choose the number of games to play in the match
void setAISpeed();
Tournament* tournament;
bool tournamentSelection;
/////// End Tournament Mod ///////////
bool premadeDeck;
int OpponentsDeckid;
string musictrack;
bool MusicExist(string FileName);
void ConstructOpponentMenu(); //loads the opponentMenu if it doesn't exist
void initScroller();
void setGamePhase(int newGamePhase);
public:
GameStateDuel(GameApp* parent);
virtual ~GameStateDuel();
#ifdef TESTSUITE
void loadTestSuitePlayers();
void setupTestSuite();
#endif
#ifdef AI_CHANGE_TESTING
int startTime;
int totalTestGames;
int testPlayer2Victories;
int totalAIDecks;
static boost::mutex mMutex;
vector<boost::thread> mWorkerThread;
static void ThreadProc(void* inParam);
void handleResults(GameObserver* aGame){
mMutex.lock();
if (aGame->didWin(aGame->players[1]))
{
testPlayer2Victories++;
totalTestGames++;
}
else if( aGame->didWin(aGame->players[0]))
{
totalTestGames++;
}
mMutex.unlock();
};
#endif
virtual void ButtonPressed(int ControllerId, int ControlId);
virtual void Start();
virtual void End();
virtual void Update(float dt);
virtual void Render();
void initRand(unsigned seed = 0);
void OnScroll(int inXVelocity, int inYVelocity);
enum ENUM_DUEL_STATE_MENU_ITEM
{
MENUITEM_CANCEL = kCancelMenuID,
MENUITEM_NEW_DECK = -10,
MENUITEM_RANDOM_PLAYER = kRandomPlayerMenuID,
MENUITEM_RANDOM_AI = kRandomAIPlayerMenuID,
MENUITEM_MAIN_MENU = -13,
MENUITEM_EVIL_TWIN = kEvilTwinMenuID,
MENUITEM_MULLIGAN = -15,
MENUITEM_UNDO = -16,
#ifdef TESTSUITE
MENUITEM_LOAD = -17,
#endif
#ifdef NETWORK_SUPPORT
MENUITEM_REMOTE_CLIENT = -18,
MENUITEM_REMOTE_SERVER = -19,
#endif
/////// Tournament Mod ///////////
MENUITEM_SHOW_SCORE = -20,
MENUITEM_SPEED_FAST = -21,
MENUITEM_SPEED_NORMAL = -22,
MENUITEM_GAUNTLET = -23,
MENUITEM_KO_TOURNAMENT = -24,
MENUITEM_RR_TOURNAMENT = -25,
MENUITEM_START_TOURNAMENT = -26,
MENUITEM_ENDLESSDEMO = -27,
MENUITEM_RANDOM_AI_HARD = -28,
MENUITEM_DOUBLEKO_TOURNAMENT = -29,
MENUITEM_FILL_NEXT_STAGE_HARD = -30,
MENUITEM_FILL_NEXT_STAGE = -31,
/////// End Tournament Mod ///////////
MENUITEM_MORE_INFO = kInfoMenuID
};
};
#endif