Added MNGuyen's improved and alphabatized deck handling(noticeable speed increase btween menus) and almosthumane's automated pass phase option.
This commit is contained in:
@@ -78,7 +78,7 @@ void CardDisplay::Update(float dt){
|
||||
}
|
||||
|
||||
bool CardDisplay::CheckUserInput(JButton key){
|
||||
if (JGE_BTN_SEC == key)
|
||||
if (JGE_BTN_SEC == key || JGE_BTN_PRI == key)
|
||||
{
|
||||
if (listener){
|
||||
listener->ButtonPressed(mId, 0);
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
#include "../include/DeckManager.h"
|
||||
#include <JRenderer.h>
|
||||
|
||||
DeckManager::DeckManager()
|
||||
{
|
||||
}
|
||||
|
||||
DeckManager::~DeckManager()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
vector<int> * DeckManager::getPlayerDeckOrderList()
|
||||
{
|
||||
return &playerDeckOrderList;
|
||||
}
|
||||
|
||||
vector<int> * DeckManager::getAIDeckOrderList()
|
||||
{
|
||||
return &aiDeckOrderList;
|
||||
}
|
||||
|
||||
|
||||
DeckManager * DeckManager::mInstance = NULL;
|
||||
|
||||
|
||||
DeckManager* DeckManager::GetInstance()
|
||||
{
|
||||
if ( mInstance == NULL )
|
||||
mInstance = new DeckManager();
|
||||
return mInstance;
|
||||
}
|
||||
|
||||
void DeckManager::EndInstance()
|
||||
{
|
||||
|
||||
SAFE_DELETE(mInstance);
|
||||
}
|
||||
@@ -8,16 +8,29 @@
|
||||
|
||||
DeckMetaDataList * DeckMetaDataList::decksMetaData = NEW DeckMetaDataList();
|
||||
|
||||
DeckMetaData::DeckMetaData(){
|
||||
|
||||
}
|
||||
|
||||
DeckMetaData::DeckMetaData(string filename){
|
||||
load(filename);
|
||||
}
|
||||
|
||||
void DeckMetaData::load(string filename){
|
||||
MTGDeck * mtgd = NEW MTGDeck(filename.c_str(),NULL,1);
|
||||
name = mtgd->meta_name;
|
||||
desc = mtgd->meta_desc;
|
||||
name = DeckMetaData::trim( mtgd->meta_name );
|
||||
desc = DeckMetaData::trim( mtgd->meta_desc );
|
||||
deckid = atoi( (filename.substr( filename.find("deck") + 4, filename.find(".txt") )).c_str() );
|
||||
delete(mtgd);
|
||||
}
|
||||
|
||||
|
||||
// Must define less than relative to DeckMetaData objects.
|
||||
bool DeckMetaData::operator<(DeckMetaData b)
|
||||
{
|
||||
return strcmp(name.c_str(), b.name.c_str()) < 0;
|
||||
}
|
||||
|
||||
DeckMetaDataList::~DeckMetaDataList(){
|
||||
for(map<string,DeckMetaData *>::iterator it = values.begin(); it != values.end(); ++it){
|
||||
SAFE_DELETE(it->second);
|
||||
@@ -43,3 +56,46 @@ DeckMetaData * DeckMetaDataList::get(string filename){
|
||||
|
||||
return values[filename]; //this creates a NULL entry if the file does not exist
|
||||
}
|
||||
|
||||
|
||||
|
||||
string& DeckMetaData::trim(string &str)
|
||||
{
|
||||
int i,j,start,end;
|
||||
|
||||
//ltrim
|
||||
for (i=0; (str[i]!=0 && str[i]<=32); )
|
||||
i++;
|
||||
start=i;
|
||||
|
||||
//rtrim
|
||||
for(i=0,j=0; str[i]!=0; i++)
|
||||
j = ((str[i]<=32)? j+1 : 0);
|
||||
end=i-j;
|
||||
str = str.substr(start,end-start);
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
string& DeckMetaData::ltrim(string &str)
|
||||
{
|
||||
int i,start;
|
||||
|
||||
for (i=0; (str[i]!=0 && str[i]<=32); )
|
||||
i++;
|
||||
start=i;
|
||||
|
||||
str = str.substr(start,str.length()-start);
|
||||
return str;
|
||||
}
|
||||
string& DeckMetaData::rtrim(string &str)
|
||||
{
|
||||
int i,j,end;
|
||||
|
||||
for(i=0,j=0; str[i]!=0; i++)
|
||||
j = ((str[i]<=32)? j+1 : 0);
|
||||
end=i-j;
|
||||
|
||||
str = str.substr(0,end);
|
||||
return str;
|
||||
}
|
||||
|
||||
@@ -301,6 +301,32 @@ void GameObserver::Update(float dt){
|
||||
}
|
||||
stateEffects();
|
||||
oldGamePhase = currentGamePhase;
|
||||
|
||||
//Auto skip Phases
|
||||
int skipLevel = options[Options::ASPHASES].number;
|
||||
int nrCreatures = currentPlayer->game->inPlay->countByType("Creature");
|
||||
|
||||
if (skipLevel == Constants::ASKIP_SAFE || skipLevel == Constants::ASKIP_FULL) {
|
||||
if ((opponent()->isAI() && !(isInterrupting)) &&
|
||||
(
|
||||
currentGamePhase == Constants::MTG_PHASE_UNTAP
|
||||
|| currentGamePhase == Constants::MTG_PHASE_DRAW
|
||||
|| currentGamePhase == Constants::MTG_PHASE_COMBATBEGIN
|
||||
|| ((currentGamePhase == Constants::MTG_PHASE_COMBATATTACKERS) && (nrCreatures == 0))
|
||||
|| currentGamePhase == Constants::MTG_PHASE_COMBATEND
|
||||
|| currentGamePhase == Constants::MTG_PHASE_ENDOFTURN
|
||||
|| ((currentGamePhase == Constants::MTG_PHASE_CLEANUP) && (currentPlayer->game->hand->nb_cards < 8))
|
||||
))
|
||||
userRequestNextGamePhase();
|
||||
}
|
||||
if (skipLevel == Constants::ASKIP_FULL) {
|
||||
if ((opponent()->isAI() && !(isInterrupting)) &&
|
||||
(currentGamePhase == Constants::MTG_PHASE_UPKEEP
|
||||
|| currentGamePhase == Constants::MTG_PHASE_COMBATDAMAGE
|
||||
))
|
||||
userRequestNextGamePhase();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//applies damage to creatures after updates
|
||||
|
||||
@@ -30,6 +30,7 @@ const string Options::optionNames[] = {
|
||||
"reverse_triggers",
|
||||
"disable_cards",
|
||||
"maxGrade",
|
||||
"ASPhases",
|
||||
"economic_difficulty",
|
||||
"transitions",
|
||||
"bgStyle",
|
||||
@@ -378,6 +379,11 @@ GameOption * GameOptions::get(int optionID) {
|
||||
goEnum = NEW GameOptionEnum();
|
||||
goEnum->def = OptionMaxGrade::getInstance();
|
||||
go = goEnum;
|
||||
break;
|
||||
case Options::ASPHASES:
|
||||
goEnum = NEW GameOptionEnum();
|
||||
goEnum->def = OptionASkipPhase::getInstance();
|
||||
go = goEnum;
|
||||
break;
|
||||
case Options::KEY_BINDINGS:
|
||||
go = NEW GameOptionKeyBindings();
|
||||
@@ -763,6 +769,12 @@ OptionMaxGrade::OptionMaxGrade(){
|
||||
mDef.values.push_back(EnumDefinition::assoc(Constants::GRADE_DANGEROUS, "-4: Dangerous (risk of crash)"));
|
||||
|
||||
};
|
||||
OptionASkipPhase OptionASkipPhase::mDef;
|
||||
OptionASkipPhase::OptionASkipPhase(){
|
||||
mDef.values.push_back(EnumDefinition::assoc(Constants::ASKIP_NONE, "Off"));
|
||||
mDef.values.push_back(EnumDefinition::assoc(Constants::ASKIP_SAFE, "Safe"));
|
||||
mDef.values.push_back(EnumDefinition::assoc(Constants::ASKIP_FULL, "Full"));
|
||||
};
|
||||
OptionClosedHand OptionClosedHand::mDef;
|
||||
OptionClosedHand::OptionClosedHand(){
|
||||
mDef.values.push_back(EnumDefinition::assoc(INVISIBLE, "invisible"));
|
||||
|
||||
@@ -51,3 +51,65 @@ int GameState::fillDeckMenu(SimpleMenu * _menu, string path, string smallDeckPre
|
||||
}
|
||||
return nbDecks;
|
||||
}
|
||||
|
||||
int GameState::fillDeckMenu(vector<int> * deckIdList, SimpleMenu * _menu, string path, string smallDeckPrefix, Player * statsPlayer){
|
||||
DeckMetaDataList * metas = DeckMetaDataList::decksMetaData;
|
||||
int found = 1;
|
||||
int nbDecks = 0;
|
||||
_menu->autoTranslate = false;
|
||||
map<string,DeckMetaData> menu;
|
||||
list<string> deckNameVector;
|
||||
while (found){
|
||||
found = 0;
|
||||
char buffer[512];
|
||||
char smallDeckName[512];
|
||||
char deckDesc[512];
|
||||
sprintf(buffer, "%s/deck%i.txt",path.c_str(),nbDecks+1);
|
||||
if(DeckMetaData * meta = metas->get(buffer)){
|
||||
found = 1;
|
||||
nbDecks++;
|
||||
sprintf(smallDeckName, "%s_deck%i",smallDeckPrefix.c_str(),nbDecks);
|
||||
|
||||
if (statsPlayer){
|
||||
DeckStats * stats = DeckStats::GetInstance();
|
||||
stats->load(statsPlayer);
|
||||
int percentVictories = stats->percentVictories(string(smallDeckName));
|
||||
string difficulty;
|
||||
if (percentVictories < 34){
|
||||
difficulty = "(hard)";
|
||||
}else if (percentVictories < 67){
|
||||
difficulty = "";
|
||||
}else{
|
||||
difficulty = "(easy)";
|
||||
}
|
||||
sprintf(deckDesc, "%s %s",meta->name.c_str(), _(difficulty).c_str());
|
||||
}else{
|
||||
sprintf(deckDesc, "%s",meta->name.c_str());
|
||||
}
|
||||
deckDesc[16] = 0;
|
||||
//translate decks desc
|
||||
Translator * t = Translator::GetInstance();
|
||||
map<string,string>::iterator it = t->deckValues.find(meta->name);
|
||||
if (it != t->deckValues.end())
|
||||
_menu->Add(nbDecks,deckDesc, it->second);
|
||||
else
|
||||
{
|
||||
menu[deckDesc] = *meta;
|
||||
deckNameVector.push_back( deckDesc );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
deckNameVector.sort();
|
||||
int deckNumber = 1;
|
||||
for (list<string>::iterator i = deckNameVector.begin(); i != deckNameVector.end(); i++)
|
||||
{
|
||||
string deckName = *i;
|
||||
DeckMetaData meta = menu[ deckName ];
|
||||
string deckDescription = meta.desc;
|
||||
deckIdList->push_back( meta.deckid );
|
||||
_menu->Add( deckNumber++ ,deckName.c_str(), deckDescription.c_str());
|
||||
}
|
||||
return nbDecks;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include <JGE.h>
|
||||
#include "../include/config.h"
|
||||
#include "../include/DeckManager.h"
|
||||
#include "../include/GameStateDeckViewer.h"
|
||||
#include "../include/Translate.h"
|
||||
#include "../include/ManaCostHybrid.h"
|
||||
@@ -1087,7 +1088,6 @@ void GameStateDeckViewer::updateStats() {
|
||||
}
|
||||
|
||||
// Lets look for mana producing abilities
|
||||
int found;
|
||||
|
||||
vector<string> abilityStrings;
|
||||
string thisstring = current->data->magicText;
|
||||
@@ -1430,6 +1430,9 @@ int GameStateDeckViewer::loadDeck(int deckid){
|
||||
|
||||
void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
|
||||
{
|
||||
int deckIdNumber = controlId;
|
||||
DeckManager *deckManager = DeckManager::GetInstance();
|
||||
vector<int> * deckList;
|
||||
switch(controllerId){
|
||||
case 10: //Deck menu
|
||||
if (controlId == -1){
|
||||
@@ -1458,7 +1461,16 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
|
||||
mStage = STAGE_WELCOME;
|
||||
break;
|
||||
}
|
||||
loadDeck(controlId);
|
||||
loadDeck(deckIdNumber);
|
||||
mStage = STAGE_WAITING;
|
||||
deckNum = controlId;
|
||||
deckList = deckManager->getPlayerDeckOrderList();
|
||||
//if (deckList->size() > 0 && controlId < deckList->size()) removed this hopefully with no side effects due to not being able to compile for psp because of sighed and unsigned int comparison.
|
||||
// deckIdNumber = deckList->at(controlId);
|
||||
/*else*/
|
||||
|
||||
deckIdNumber = controlId;
|
||||
loadDeck(deckIdNumber);
|
||||
mStage = STAGE_WAITING;
|
||||
deckNum = controlId;
|
||||
break;
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
#include "../include/AIMomirPlayer.h"
|
||||
#include "../include/PlayerData.h"
|
||||
#include "../include/DeckStats.h"
|
||||
#include "../include/DeckManager.h"
|
||||
|
||||
#include "../include/DeckMetaData.h"
|
||||
#include "../include/MTGRules.h"
|
||||
#include "../include/Credits.h"
|
||||
#include "../include/Translate.h"
|
||||
@@ -89,7 +92,8 @@ void GameStateDuel::Start()
|
||||
if (mParent->players[i] == PLAYER_TYPE_HUMAN){
|
||||
decksneeded = 1;
|
||||
deckmenu = NEW SimpleMenu(DUEL_MENU_CHOOSE_DECK, this, Constants::MENU_FONT, 35, 25, "Choose a Deck");
|
||||
int nbDecks = fillDeckMenu(deckmenu,options.profileFile());
|
||||
DeckManager *deckManager = DeckManager::GetInstance();
|
||||
int nbDecks = fillDeckMenu( deckManager->getPlayerDeckOrderList(), deckmenu, options.profileFile());
|
||||
if (nbDecks) decksneeded = 0;
|
||||
break;
|
||||
}
|
||||
@@ -219,7 +223,9 @@ void GameStateDuel::ensureOpponentMenu(){
|
||||
opponentMenu->Add(0,"Random");
|
||||
if (options[Options::EVILTWIN_MODE_UNLOCKED].number)
|
||||
opponentMenu->Add(-1,"Evil Twin", "Can you play against yourself?");
|
||||
fillDeckMenu(opponentMenu,RESPATH"/ai/baka", "ai_baka", mPlayers[0]);
|
||||
DeckManager * deckManager = DeckManager::GetInstance();
|
||||
fillDeckMenu( deckManager->getAIDeckOrderList(), opponentMenu, RESPATH"/ai/baka", "ai_baka", mPlayers[0]);
|
||||
opponentMenu->Add(-2,"Cancel", "Back to Main Menu");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -477,6 +483,8 @@ void GameStateDuel::Render()
|
||||
}
|
||||
|
||||
void GameStateDuel::ButtonPressed(int controllerId, int controlId) {
|
||||
int deckNumber = controlId;
|
||||
DeckManager * deckManager = DeckManager::GetInstance();
|
||||
switch (controllerId){
|
||||
case DUEL_MENU_CHOOSE_OPPONENT:
|
||||
{
|
||||
@@ -487,8 +495,20 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId) {
|
||||
mGamePhase = DUEL_STATE_CHOOSE_DECK2_TO_PLAY;
|
||||
break;
|
||||
default:
|
||||
loadPlayer(1,controlId,1);
|
||||
OpponentsDeckid=controlId;
|
||||
// cancel option. return to main menu
|
||||
|
||||
if (controlId == -2)
|
||||
{
|
||||
opponentMenu->Close();
|
||||
mParent->SetNextState( DUEL_STATE_BACK_TO_MAIN_MENU );
|
||||
mGamePhase = DUEL_MENU_GAME_MENU;
|
||||
break;
|
||||
}
|
||||
else if ( controlId != -1 && deckManager->getAIDeckOrderList()->size() > 0) // evil twin
|
||||
deckNumber = deckManager->getAIDeckOrderList()->at( controlId - 1 );
|
||||
|
||||
loadPlayer(1,deckNumber,1);
|
||||
OpponentsDeckid=deckNumber;
|
||||
opponentMenu->Close();
|
||||
mGamePhase = DUEL_STATE_CHOOSE_DECK2_TO_PLAY;
|
||||
break;
|
||||
@@ -502,7 +522,10 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId) {
|
||||
return;
|
||||
}
|
||||
if (mGamePhase == DUEL_STATE_CHOOSE_DECK1){
|
||||
loadPlayer(0,controlId);
|
||||
vector<int> * playerDeck = deckManager->getPlayerDeckOrderList();
|
||||
if ( !premadeDeck && controlId > 0 )
|
||||
deckNumber = playerDeck->at( controlId - 1 );
|
||||
loadPlayer(0,deckNumber);
|
||||
deckmenu->Close();
|
||||
mGamePhase = DUEL_STATE_CHOOSE_DECK1_TO_2;
|
||||
}else{
|
||||
|
||||
@@ -76,6 +76,8 @@ void GameStateOptions::Start()
|
||||
optionsList->Add(cLang);
|
||||
WDecoEnum * oGra = NEW WDecoEnum(NEW OptionInteger(Options::MAX_GRADE,"Minimum Card Grade",Constants::GRADE_DANGEROUS,1,Constants::GRADE_BORDERLINE,"",Constants::GRADE_SUPPORTED));
|
||||
optionsList->Add(oGra);
|
||||
WDecoEnum * oASPhases = NEW WDecoEnum(NEW OptionInteger(Options::ASPHASES,"Phase Skip Automation",Constants::ASKIP_FULL,1,Constants::ASKIP_NONE,"",Constants::ASKIP_NONE));
|
||||
optionsList->Add(oASPhases);
|
||||
optionsTabs->Add(optionsList);
|
||||
|
||||
optionsList = NEW WGuiKeyBinder("Key Bindings", this);
|
||||
|
||||
Reference in New Issue
Block a user