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

View File

@@ -1,4 +1,4 @@
OBJS = objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIStats.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardPrimitive.o objs/CardSelector.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DeckDataWrapper.o objs/DeckMetaData.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateAwards.o objs/GameStateDeckViewer.o objs/GameStateDuel.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GameStateStory.o objs/GameStateTransitions.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/Logger.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGPack.o objs/MTGRules.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/Pos.o objs/PriceList.o objs/ReplacementEffects.o objs/Rules.o objs/SimpleMenu.o objs/SimpleMenuItem.o objs/SimplePad.o objs/StoryFlow.o objs/StyleManager.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/ThisDescriptor.o objs/Token.o objs/Translate.o objs/TranslateKeys.o objs/Trash.o objs/utils.o objs/WEvent.o objs/WResourceManager.o objs/WCachedResource.o objs/WDataSrc.o objs/WGui.o objs/WFilter.o objs/Tasks.o objs/WFont.o
OBJS = objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIStats.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardPrimitive.o objs/CardSelector.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DeckDataWrapper.o objs/DeckMetaData.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateAwards.o objs/GameStateDeckViewer.o objs/GameStateDuel.o objs/DeckManager.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GameStateStory.o objs/GameStateTransitions.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/Logger.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGPack.o objs/MTGRules.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/Pos.o objs/PriceList.o objs/ReplacementEffects.o objs/Rules.o objs/SimpleMenu.o objs/SimpleMenuItem.o objs/SimplePad.o objs/StoryFlow.o objs/StyleManager.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/ThisDescriptor.o objs/Token.o objs/Translate.o objs/TranslateKeys.o objs/Trash.o objs/utils.o objs/WEvent.o objs/WResourceManager.o objs/WCachedResource.o objs/WDataSrc.o objs/WGui.o objs/WFilter.o objs/Tasks.o objs/WFont.o
DEPS = $(patsubst objs/%.o, deps/%.d, $(OBJS))
RESULT = $(shell psp-config --psp-prefix 2> Makefile.cache)

View File

@@ -0,0 +1,27 @@
#include <string>
#include <vector>
using namespace std;
class DeckManager
{
protected:
static DeckManager * mInstance;
public:
vector<int> playerDeckOrderList;
vector<int> aiDeckOrderList;
vector<int> * getPlayerDeckOrderList();
vector<int> * getAIDeckOrderList();
static DeckManager * GetInstance();
static void EndInstance();
DeckManager();
~DeckManager();
};

View File

@@ -2,16 +2,25 @@
#define _DECKMETADATA_H_
#include <string>
#include <vector>
#include <map>
using namespace std;
class DeckMetaData {
public:
DeckMetaData();
DeckMetaData(string filename);
void load(string filename);
bool operator<(DeckMetaData b);
string desc;
string name;
int deckid;
string& trim(string &str);
string& ltrim(string &str);
string& rtrim(string &str);
};
class DeckMetaDataList {
@@ -20,6 +29,8 @@ public:
DeckMetaData * get(string filename);
~DeckMetaDataList();
static DeckMetaDataList * decksMetaData;
private:
map<string,DeckMetaData *>values;
};

View File

@@ -46,6 +46,7 @@ public:
REVERSETRIGGERS,
DISABLECARDS,
MAX_GRADE,
ASPHASES,
ECON_DIFFICULTY,
TRANSITIONS,
GUI_STYLE,
@@ -182,7 +183,13 @@ private:
OptionMaxGrade();
static OptionMaxGrade mDef;
};
class OptionASkipPhase: public EnumDefinition {
public:
static EnumDefinition * getInstance() {return &mDef;};
private:
OptionASkipPhase();
static OptionASkipPhase mDef;
};
class OptionEconDifficulty: public EnumDefinition {
public:
static EnumDefinition * getInstance() {return &mDef;};

View File

@@ -7,6 +7,8 @@ class JGE;
#include <JSoundSystem.h>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
enum ENUM_GAME_STATE
@@ -53,7 +55,13 @@ class GameState
virtual void Update(float dt) = 0;
virtual void Render() = 0;
static int fillDeckMenu(SimpleMenu * _menu, string path, string smallDeckPrefix = "", Player * statsPlayer = NULL);
};
static int fillDeckMenu( vector<int> * deckIdList, SimpleMenu * _menu, string path, string smallDeckPrefix = "", Player * statsPlayer = NULL);
string& trim(string &str);
string& ltrim(string &str);
string& rtrim(string &str);
};
#endif

View File

@@ -175,6 +175,10 @@ class Constants
GRADE_CRAPPY = 3,
GRADE_UNSUPPORTED = 4,
GRADE_DANGEROUS = 5,
ASKIP_NONE=0,
ASKIP_SAFE=1,
ASKIP_FULL=2,
};
static char MTGColorChars[];

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);

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);
}

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;
}

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

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"));

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;
}

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;

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{

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);