added option to save deck in editor as an AI deck.

No option to delete or edit the AI deck once it has been created.
The deck gets saved as the canonical form of the deck to match other AI deck formats.
This commit is contained in:
techdragon.nguyen@gmail.com
2010-10-22 08:28:52 +00:00
parent 3e601a950c
commit 34335ba2aa
4 changed files with 95 additions and 18 deletions

View File

@@ -58,6 +58,7 @@ enum DECK_VIEWER_MENU_ITEMS
MENU_ITEM_SWITCH_DECKS_NO_SAVE = 2,
MENU_ITEM_MAIN_MENU = 3,
MENU_ITEM_EDITOR_CANCEL = 4,
MENU_ITEM_SAVE_AS_AI_DECK = 5,
MENU_ITEM_YES = 20,
MENU_ITEM_NO = 21,
MENU_ITEM_FILTER_BY = 22
@@ -156,9 +157,11 @@ private:
MTGCard * cardIndex[7];
int hudAlpha;
string newDeckname;
bool isAIDeckSave;
StatsWrapper stw;
bool mSwitching;
void saveDeck(); //Saves the deck and additional necessary information
void saveAsAIDeck(string deckName); // saves deck as an AI Deck
int getCurrentPos();
public:

View File

@@ -150,6 +150,7 @@ class MTGDeck{
int add(MTGCard * card);
int remove(MTGCard * card);
int save();
int save(string destFileName, bool useExpandedDescriptions, string deckName, string deckDesc);
MTGCard * getCardById(int id);
};

View File

@@ -5,10 +5,11 @@
#include <math.h>
#include <iostream>
#include <sstream>
#include <JGE.h>
#include "../include/config.h"
#include "../include/DeckManager.h"
#include "../include/DebugRoutines.h"
#include "../include/GameStateDuel.h"
#include "../include/GameStateDeckViewer.h"
#include "../include/Translate.h"
@@ -177,6 +178,7 @@ void GameStateDeckViewer::Start()
menu->Add( MENU_ITEM_SWITCH_DECKS_NO_SAVE, "Switch decks without saving");
menu->Add( MENU_ITEM_SAVE_RENAME, "Save & Rename");
menu->Add( MENU_ITEM_SAVE_RETURN_MAIN_MENU, "Save & Back to Main Menu");
menu->Add( MENU_ITEM_SAVE_AS_AI_DECK, "Save as AI deck", "WARNING: \nMake sure you are ready to save. All changes are final.");
menu->Add( MENU_ITEM_MAIN_MENU, "Back to Main Menu");
menu->Add( MENU_ITEM_EDITOR_CANCEL, "Cancel");
@@ -260,6 +262,31 @@ void GameStateDeckViewer::saveDeck(){
pricelist->save();
}
/**
save the deck in a readable format to allow people to edit the file offline
*/
void GameStateDeckViewer::saveAsAIDeck( string deckName )
{
DeckManager * deckManager = DeckManager::GetInstance();
vector<DeckMetaData *> aiDecks = GameState::getValidDeckMetaData( RESPATH"/ai/baka", "ai_baka", NULL);
int nbAiDecks = aiDecks.size() + 1;
aiDecks.clear();
string defaultAiDeckName = "deck";
std::ostringstream oss;
oss << "deck" << nbAiDecks;
defaultAiDeckName = oss.str();
oss.str("");
oss << endl << "Can you beat your own creations?" << endl << "User created AI Deck # " << nbAiDecks;
string deckDesc = oss.str();
string filepath = RESPATH;
filepath.append("/ai/baka/").append( defaultAiDeckName ).append( ".txt" );
DebugTrace("saving AI deck " << filepath << endl );
myDeck->parent->save( filepath, true, deckName, deckDesc );
oss.clear();
delete deckManager;
}
void GameStateDeckViewer::Update(float dt)
{
@@ -271,8 +298,13 @@ void GameStateDeckViewer::Update(float dt)
if(newDeckname != ""){
newDeckname = options.keypadFinish();
if(newDeckname != ""){
if(myDeck && myDeck->parent){
if(newDeckname != ""){
if (isAIDeckSave)
{
saveAsAIDeck( newDeckname );
isAIDeckSave = false;
}
else if(myDeck && myDeck->parent){
myDeck->parent->meta_name = newDeckname;
saveDeck();
}
@@ -1432,7 +1464,6 @@ int GameStateDeckViewer::loadDeck(int deckid){
found = 0;
char buffer[512];
char smallDeckName[512];
//char deckDesc[512];
sprintf(buffer, "%s/deck%i.txt",RESPATH"/ai/baka",nbDecks+1);
if(fileExists(buffer)){
MTGDeck * mtgd = NEW MTGDeck(buffer,NULL,1);
@@ -1467,6 +1498,7 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
{
int deckIdNumber = controlId;
int deckListSize = 0;
string defaultAiName;
DeckManager *deckManager = DeckManager::GetInstance();
vector<DeckMetaData *> * deckList;
switch(controllerId){
@@ -1521,12 +1553,28 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
saveDeck();
mParent->DoTransition(TRANSITION_FADE,GAME_STATE_MENU);
break;
case MENU_ITEM_SAVE_RENAME:
if(myDeck && myDeck->parent){
options.keypadStart(myDeck->parent->meta_name,&newDeckname);
options.keypadTitle("Rename deck");
}
break;
case MENU_ITEM_SAVE_AS_AI_DECK:
// find the next unused ai deck number
// warn user that once saved, no edits can be made
// save entire collection to ai as spelled out card with count
// bring user to main deck editor menu.
isAIDeckSave = true;
defaultAiName = myDeck && myDeck->parent ? myDeck->parent->meta_name : "Custom AI Deck";
options.keypadStart( defaultAiName, &newDeckname);
options.keypadTitle("Name Custom AI Deck");
updateDecks();
mStage = STAGE_WELCOME;
mSwitching = true;
break;
case MENU_ITEM_SWITCH_DECKS_NO_SAVE:
updateDecks();
mStage = STAGE_WELCOME;

View File

@@ -729,20 +729,24 @@ int MTGDeck::remove(MTGCard * card){
return (remove(card->getId()));
}
int MTGDeck::save(){
string tmp = filename;
int MTGDeck::save() {
return save( filename, false, meta_name, meta_desc );
}
int MTGDeck::save(string destFileName, bool useExpandedDescriptions, string deckTitle, string deckDesc){
string tmp = destFileName;
tmp.append(".tmp"); //not thread safe
std::ofstream file(tmp.c_str());
char writer[512];
if (file){
DebugTrace("Saving Deck");
if (meta_name.size()){
file << "#NAME:" << meta_name << '\n';
if (deckTitle.size()){
file << "#NAME:" << deckTitle << '\n';
}
if (meta_desc.size()){
if (deckDesc.size()){
size_t found = 0;
string desc= meta_desc;
string desc= deckDesc;
found = desc.find_first_of("\n");
while(found != string::npos){
file << "#DESC:" << desc.substr(0,found+1);
@@ -751,18 +755,39 @@ int MTGDeck::save(){
}
file << "#DESC:" << desc << "\n";
}
map<int,int>::iterator it;
for (it = cards.begin(); it!=cards.end(); it++){
sprintf(writer,"%i\n", it->first);
for (int j = 0; j<it->second; j++){
file<<writer;
if ( useExpandedDescriptions )
{
map<int,int>::iterator it;
for (it = cards.begin(); it!=cards.end(); it++)
{
int nbCards = it->second;
MTGCard *card = this->getCardById( it->first );
if ( card == NULL )
{
continue;
}
MTGSetInfo *setInfo = setlist.getInfo( card->setId );
string setName = setInfo->getName();
string cardName = card->data->getName();
file<< cardName << "\t " << "(" << setName << ") *" << nbCards << endl;
}
}
else
{
map<int,int>::iterator it;
for (it = cards.begin(); it!=cards.end(); it++){
sprintf(writer,"%i\n", it->first);
for (int j = 0; j<it->second; j++){
file<<writer;
}
}
}
file.close();
std::remove(filename.c_str());
rename(tmp.c_str(),filename.c_str());
std::remove(destFileName.c_str());
rename(tmp.c_str(),destFileName.c_str());
}
DeckMetaDataList::decksMetaData->invalidate(filename);
DeckMetaDataList::decksMetaData->invalidate(destFileName);
return 1;
}