From 34335ba2aab6bbaa8f2b64211f9d02a530fe59b8 Mon Sep 17 00:00:00 2001 From: "techdragon.nguyen@gmail.com" Date: Fri, 22 Oct 2010 08:28:52 +0000 Subject: [PATCH] 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. --- projects/mtg/include/GameStateDeckViewer.h | 3 ++ projects/mtg/include/MTGDeck.h | 1 + projects/mtg/src/GameStateDeckViewer.cpp | 56 ++++++++++++++++++++-- projects/mtg/src/MTGDeck.cpp | 53 ++++++++++++++------ 4 files changed, 95 insertions(+), 18 deletions(-) diff --git a/projects/mtg/include/GameStateDeckViewer.h b/projects/mtg/include/GameStateDeckViewer.h index a0b0e2454..2c8ecb610 100644 --- a/projects/mtg/include/GameStateDeckViewer.h +++ b/projects/mtg/include/GameStateDeckViewer.h @@ -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: diff --git a/projects/mtg/include/MTGDeck.h b/projects/mtg/include/MTGDeck.h index 79d9363e2..359e8a673 100644 --- a/projects/mtg/include/MTGDeck.h +++ b/projects/mtg/include/MTGDeck.h @@ -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); }; diff --git a/projects/mtg/src/GameStateDeckViewer.cpp b/projects/mtg/src/GameStateDeckViewer.cpp index 32537db75..36b024d83 100644 --- a/projects/mtg/src/GameStateDeckViewer.cpp +++ b/projects/mtg/src/GameStateDeckViewer.cpp @@ -5,10 +5,11 @@ #include #include - +#include #include #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 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 * 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; diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index 16fc07124..746fa38e3 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -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::iterator it; - for (it = cards.begin(); it!=cards.end(); it++){ - sprintf(writer,"%i\n", it->first); - for (int j = 0; jsecond; j++){ - file<::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::iterator it; + for (it = cards.begin(); it!=cards.end(); it++){ + sprintf(writer,"%i\n", it->first); + for (int j = 0; jsecond; j++){ + file<invalidate(filename); + DeckMetaDataList::decksMetaData->invalidate(destFileName); return 1; }