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:
omegablast2002@yahoo.com
2010-09-08 11:44:11 +00:00
parent 1f01b10010
commit 79ea200d97
15 changed files with 301 additions and 13 deletions
+1 -1
View File
@@ -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);
+38
View File
@@ -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);
}
+58 -2
View File
@@ -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;
}
+26
View File
@@ -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
+12
View File
@@ -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"));
+62
View File
@@ -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;
}
+14 -2
View File
@@ -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;
+28 -5
View File
@@ -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{
+2
View File
@@ -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);