From 8027ed4bdf68697fa32d28998b1b411105fc0280 Mon Sep 17 00:00:00 2001 From: Vittorio Alfieri Date: Wed, 26 Apr 2023 13:05:07 +0200 Subject: [PATCH] Added Background partner ability for CLB commanders, fixed some tab with spaces --- projects/mtg/include/MTGDefinitions.h | 5 +- projects/mtg/include/Rules.h | 2 +- projects/mtg/include/Subtypes.h | 3 +- projects/mtg/src/MTGDeck.cpp | 12 ++--- projects/mtg/src/MTGDefinitions.cpp | 3 +- projects/mtg/src/Rules.cpp | 72 +++++++++++++-------------- 6 files changed, 50 insertions(+), 47 deletions(-) diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index d325e2e48..8076d1c65 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -17,7 +17,7 @@ typedef enum GAME_TYPE_RANDOM2, GAME_TYPE_RANDOM3, GAME_TYPE_RANDOM5, - GAME_TYPE_RANDOMCOMMANDER, + GAME_TYPE_RANDOMCOMMANDER, GAME_TYPE_HORDE, GAME_TYPE_SET_LIMITED, GAME_TYPE_STORY, @@ -339,7 +339,8 @@ class Constants COUNTERSHROUD = 211, NONIGHT = 212, NODAMAGEREMOVED = 213, - NB_BASIC_ABILITIES = 214, + BACKGROUNDPARTNER = 214, + NB_BASIC_ABILITIES = 215, RARITY_S = 'S', //Special Rarity RARITY_M = 'M', //Mythics diff --git a/projects/mtg/include/Rules.h b/projects/mtg/include/Rules.h index e769177a2..68d95eeb9 100644 --- a/projects/mtg/include/Rules.h +++ b/projects/mtg/include/Rules.h @@ -44,7 +44,7 @@ protected: Player * loadPlayerRandom(GameObserver* observer, int isAI, int mode); Player * loadPlayerRandomThree(GameObserver* observer, int isAI); Player * loadPlayerRandomFive(GameObserver* observer, int isAI); - Player * loadPlayerRandomCommander(GameObserver* observer, int isAI); + Player * loadPlayerRandomCommander(GameObserver* observer, int isAI); Player * loadPlayerHorde(GameObserver* observer, int isAI); Player * loadRandomSetLimited(GameObserver* observer, int isAI); Player * initPlayer(GameObserver *observer, int playerId); diff --git a/projects/mtg/include/Subtypes.h b/projects/mtg/include/Subtypes.h index e77d3e54b..ff091e198 100644 --- a/projects/mtg/include/Subtypes.h +++ b/projects/mtg/include/Subtypes.h @@ -33,7 +33,8 @@ public: TYPE_DUNGEON = 18, TYPE_EMBLEM = 19, TYPE_CONSPIRACY = 20, - LAST_TYPE = TYPE_CONSPIRACY, + TYPE_BACKGROUND = 21, + LAST_TYPE = TYPE_BACKGROUND, }; protected: diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index af1dce120..1af10acd4 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -995,10 +995,10 @@ MTGDeck::MTGDeck(const string& config_file, MTGAllCards * _allcards, int meta_on MTGCard * newcard = database->getCardById(atoi(s.c_str())); if(!CommandZone.size() && newcard->data->hasType("Legendary") && (newcard->data->hasType("Creature") || newcard->data->basicAbilities[Constants::CANBECOMMANDER])) // If no commander has been added you can add one. CommandZone.push_back(s); - else if(CommandZone.size() == 1 && newcard->data->hasType("Legendary") && (newcard->data->hasType("Creature") || newcard->data->basicAbilities[Constants::CANBECOMMANDER])){ // If a commander has been added you can add a new one just if both have partner ability. - if(newcard && newcard->data->basicAbilities[Constants::PARTNER]){ + else if(CommandZone.size() == 1 && newcard->data->hasType("Legendary") && (newcard->data->hasType("Creature") || newcard->data->basicAbilities[Constants::CANBECOMMANDER])){ // If a commander has been added you can add a new one just if both have partner ability of if one can choose a Background. + if(newcard && (newcard->data->basicAbilities[Constants::PARTNER] || newcard->data->basicAbilities[Constants::BACKGROUNDPARTNER])){ MTGCard * oldcard = database->getCardById(atoi((CommandZone.at(0)).c_str())); - if(oldcard && oldcard->data->basicAbilities[Constants::PARTNER] && (oldcard->data->name != newcard->data->name) && ((oldcard->data->partner == "" && newcard->data->partner == "") || (oldcard->data->partner == newcard->data->name && newcard->data->partner == oldcard->data->name))) + if((oldcard && oldcard->data->hasType(Subtypes::TYPE_BACKGROUND) && (oldcard->data->name != newcard->data->name)) || (oldcard && oldcard->data->basicAbilities[Constants::PARTNER] && (oldcard->data->name != newcard->data->name) && ((oldcard->data->partner == "" && newcard->data->partner == "") || (oldcard->data->partner == newcard->data->name && newcard->data->partner == oldcard->data->name)))) CommandZone.push_back(s); } } @@ -1012,10 +1012,10 @@ MTGDeck::MTGDeck(const string& config_file, MTGAllCards * _allcards, int meta_on str_id << newcard->getId(); if(!CommandZone.size() && newcard->data->hasType("Legendary") && (newcard->data->hasType("Creature") || newcard->data->basicAbilities[Constants::CANBECOMMANDER])) // If no commander has been added you can add one. CommandZone.push_back(str_id.str()); - else if(CommandZone.size() == 1 && newcard->data->hasType("Legendary") && (newcard->data->hasType("Creature") || newcard->data->basicAbilities[Constants::CANBECOMMANDER])){ // If a commander has been added you can add a new one just if both have partner ability. - if(newcard->data->basicAbilities[Constants::PARTNER]){ + else if(CommandZone.size() == 1 && newcard->data->hasType("Legendary") && (newcard->data->hasType("Creature") || newcard->data->basicAbilities[Constants::CANBECOMMANDER])){ // If a commander has been added you can add a new one just if both have partner ability of if one can choose a Background. + if(newcard && (newcard->data->basicAbilities[Constants::PARTNER] || newcard->data->basicAbilities[Constants::BACKGROUNDPARTNER])){ MTGCard * oldcard = database->getCardById(atoi((CommandZone.at(0)).c_str())); - if(oldcard && oldcard->data->basicAbilities[Constants::PARTNER] && (oldcard->data->name != newcard->data->name) && ((oldcard->data->partner == "" && newcard->data->partner == "") || (oldcard->data->partner == newcard->data->name && newcard->data->partner == oldcard->data->name))) + if((oldcard && oldcard->data->hasType(Subtypes::TYPE_BACKGROUND) && (oldcard->data->name != newcard->data->name)) || (oldcard && oldcard->data->basicAbilities[Constants::PARTNER] && (oldcard->data->name != newcard->data->name) && ((oldcard->data->partner == "" && newcard->data->partner == "") || (oldcard->data->partner == newcard->data->name && newcard->data->partner == oldcard->data->name)))) CommandZone.push_back(str_id.str()); } } diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index b6d834730..00937a272 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -244,7 +244,8 @@ const char* Constants::MTGBasicAbilities[] = { "expshroud", //Player can't get experience counters (e.g. "Solemnity"). "countershroud", //Card can't get any kind of counter (e.g. "Solemnity"). "nonight", //It can't become night (e.g. "Angel of Eternal Dawn"). - "nodamageremoved" //Damage is not removed from card (e.g. "Patient Zero"). + "nodamageremoved", //Damage is not removed from card (e.g. "Patient Zero"). + "backgoundpartner" //Can choose a backgorund partner as commander (e.g. "Faceless One"). }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/Rules.cpp b/projects/mtg/src/Rules.cpp index 84796c0c7..744193951 100644 --- a/projects/mtg/src/Rules.cpp +++ b/projects/mtg/src/Rules.cpp @@ -168,7 +168,7 @@ void Rules::addExtraRules(GameObserver* g) difficultyRating = 0; else if(g->mRules->gamemode == GAME_TYPE_RANDOM1 || g->mRules->gamemode == GAME_TYPE_RANDOM2) difficultyRating = 0; - else if(g->mRules->gamemode == GAME_TYPE_RANDOM3 || g->mRules->gamemode == GAME_TYPE_RANDOM5 || g->mRules->gamemode == GAME_TYPE_RANDOMCOMMANDER) + else if(g->mRules->gamemode == GAME_TYPE_RANDOM3 || g->mRules->gamemode == GAME_TYPE_RANDOM5 || g->mRules->gamemode == GAME_TYPE_RANDOMCOMMANDER) difficultyRating = 0; else if(g->mRules->gamemode == GAME_TYPE_HORDE || g->mRules->gamemode == GAME_TYPE_SET_LIMITED) difficultyRating = 0; @@ -420,47 +420,47 @@ Player * Rules::loadPlayerRandomCommander(GameObserver* observer, int isAI) { MTGDeck * cmdTempDeck = NEW MTGDeck(MTGCollection()); MTGDeck * tempDeck = NEW MTGDeck(MTGCollection()); - tempDeck->meta_commander = true; + tempDeck->meta_commander = true; - string lands[] = { "", "forest", "island", "mountain", "swamp", "plains", "basic", "basic" }; + string lands[] = { "", "forest", "island", "mountain", "swamp", "plains", "basic", "basic" }; - cmdTempDeck->addRandomCards(1, 0, 0, -1, "legendary"); - DeckDataWrapper * myCommandZone = NEW DeckDataWrapper(cmdTempDeck); - MTGCard * commander = myCommandZone->getCard(0, true); + cmdTempDeck->addRandomCards(1, 0, 0, -1, "legendary"); + DeckDataWrapper * myCommandZone = NEW DeckDataWrapper(cmdTempDeck); + MTGCard * commander = myCommandZone->getCard(0, true); - while(!commander->data->isCreature()) - { - cmdTempDeck->addRandomCards(1, 0, 0, -1, "legendary"); - myCommandZone = NEW DeckDataWrapper(cmdTempDeck); - commander = myCommandZone->getCard(0, true); - } + while(!commander->data->isCreature()) + { + cmdTempDeck->addRandomCards(1, 0, 0, -1, "legendary"); + myCommandZone = NEW DeckDataWrapper(cmdTempDeck); + commander = myCommandZone->getCard(0, true); + } - stringstream cid; + stringstream cid; cid << commander->getMTGId(); vector newCMD; - newCMD.push_back(cid.str()); - tempDeck->replaceCMD(newCMD); - - std::vector< int > colors; + newCMD.push_back(cid.str()); + tempDeck->replaceCMD(newCMD); + + std::vector< int > colors; - for (int i = 0; i < Constants::NB_Colors; i++) - { - if (commander->data->getManaCost()->hasColor(i)) - colors.push_back(i); - } + for (int i = 0; i < Constants::NB_Colors; i++) + { + if (commander->data->getManaCost()->hasColor(i)) + colors.push_back(i); + } - if(colors.data()[0] != 0) { colors.insert(colors.begin(),0); } - - if(colors.size() > 1) - { - for (unsigned int i = 1; i < colors.size(); i++) - { - tempDeck->addRandomCards(40/(colors.size()-1), 0, 0, 'L', lands[colors.data()[i]].c_str()); - } - } - else { tempDeck->addRandomCards(40, 0, 0, -1, "basic"); } - - tempDeck->addRandomCards(59, 0, 0, -1, "", colors.data(), colors.size()); + if(colors.data()[0] != 0) { colors.insert(colors.begin(),0); } + + if(colors.size() > 1) + { + for (unsigned int i = 1; i < colors.size(); i++) + { + tempDeck->addRandomCards(40/(colors.size()-1), 0, 0, 'L', lands[colors.data()[i]].c_str()); + } + } + else { tempDeck->addRandomCards(40, 0, 0, -1, "basic"); } + + tempDeck->addRandomCards(59, 0, 0, -1, "", colors.data(), colors.size()); string deckFile = "random"; string deckFileSmall = "random"; @@ -565,7 +565,7 @@ Player * Rules::initPlayer(GameObserver *g, int playerId) return loadPlayerRandomThree(g, isAI); case GAME_TYPE_RANDOM5: return loadPlayerRandomFive(g, isAI); - case GAME_TYPE_RANDOMCOMMANDER: + case GAME_TYPE_RANDOMCOMMANDER: return loadPlayerRandomCommander(g, isAI); case GAME_TYPE_HORDE: return loadPlayerHorde(g, isAI); @@ -888,7 +888,7 @@ GameType Rules::strToGameMode(string s) if (s.compare("random2") == 0) return GAME_TYPE_RANDOM2; if (s.compare("random3") == 0) return GAME_TYPE_RANDOM3; if (s.compare("random5") == 0) return GAME_TYPE_RANDOM5; - if (s.compare("random_commander") == 0) return GAME_TYPE_RANDOMCOMMANDER; + if (s.compare("random_commander") == 0) return GAME_TYPE_RANDOMCOMMANDER; if (s.compare("horde") == 0) return GAME_TYPE_HORDE; if (s.compare("set_limited") == 0) return GAME_TYPE_SET_LIMITED; if (s.compare("story") == 0) return GAME_TYPE_STORY;