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