diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index c7eb67c8f..623b50dd4 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -2167,6 +2167,7 @@ AALifeSet(int _id, MTGCardInstance * _source, Targetable * _target, WParsedInt * class AADamager:public ActivatedAbilityTP{ public: WParsedInt * damage; + AADamager(int _id, MTGCardInstance * _source, Targetable * _target, WParsedInt * damage, ManaCost * _cost=NULL, int doTap = 0, int who = TargetChooser::UNSET):ActivatedAbilityTP(_id,_source,_target,_cost,doTap,who),damage(damage){ aType = MTGAbility::DAMAGER; } @@ -2180,11 +2181,9 @@ AADamager(int _id, MTGCardInstance * _source, Targetable * _target, WParsedInt * } return 0; } - const char * getMenuText(){ return "Damage"; } - AADamager * clone() const{ AADamager * a = NEW AADamager(*this); a->damage = NEW WParsedInt(*(a->damage)); @@ -2197,6 +2196,36 @@ AADamager(int _id, MTGCardInstance * _source, Targetable * _target, WParsedInt * } +}; +//prevent next damage +class AADamagePrevent:public ActivatedAbilityTP{ +public: +int preventing; +AADamagePrevent(int _id, MTGCardInstance * _source, Targetable * _target,int preventing, ManaCost * _cost=NULL, int doTap = 0, int who = TargetChooser::UNSET):ActivatedAbilityTP(_id,_source,_target,_cost,doTap,who),preventing(preventing){ +} + + int resolve(){ + Damageable * _target = (Damageable *) getTarget(); + if(_target){ + _target->preventable += preventing; + } + return 0; + } + + const char * getMenuText(){ + return "Prevent Damage"; + } + + AADamagePrevent * clone() const{ + AADamagePrevent * a = NEW AADamagePrevent(*this); + a->isClone = 1; + return a; + } + + ~AADamagePrevent(){ + } + + }; //poison removel class AARemovePoison:public ActivatedAbilityTP{ diff --git a/projects/mtg/include/Damage.h b/projects/mtg/include/Damage.h index 4f0826655..b03acdb43 100644 --- a/projects/mtg/include/Damage.h +++ b/projects/mtg/include/Damage.h @@ -23,12 +23,14 @@ class Damageable:public Targetable { int life; int poisonCount; int damageCount; + int preventable; int type_as_damageable; Damageable(int _life){life=_life;}; int getLife(){return life;}; virtual int dealDamage(int damage){life-=damage;return life;}; virtual int afterDamage(){return 0;} virtual int poisoned(){return 0;} + virtual int prevented(){return 0;} virtual JQuad * getIcon(){return NULL;}; }; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index e30974879..f14e32095 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -94,7 +94,6 @@ class MTGCardInstance: public CardPrimitive, public MTGCard, public Damageable { int nbOpponents(); int stepPower(CombatStep step); int afterDamage(); - int has(int ability); int cleanup(); diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index 419767390..8e04a8c7a 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -26,6 +26,7 @@ class Player: public Damageable{ int afterDamage(); int poisoned(); int damaged(); + int prevented(); Player(MTGPlayerCards * deck, string deckFile, string deckFileSmall); virtual ~Player(); void unTapPhase(); diff --git a/projects/mtg/include/Rules.h b/projects/mtg/include/Rules.h index e2185475f..006efd6c0 100644 --- a/projects/mtg/include/Rules.h +++ b/projects/mtg/include/Rules.h @@ -27,6 +27,7 @@ class RulesPlayerData{ int life; int poisonCount; int damageCount; + int preventable; string avatar; ManaCost * manapool; RulesPlayerZone zones[5]; diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 6dea7d762..e558c4215 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -101,11 +101,11 @@ void CardGui::Render() } } - +//draws the numbers power/toughness if (card->isCreature()){ mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); char buffer[200]; - sprintf(buffer, "%i/%i",card->power,card->life); + sprintf(buffer, "%i/%i",card->power,card->life); renderer->FillRect(actX - (12*actZ) , actY + 6* actZ, 25*actZ, 12*actZ, ARGB(((static_cast(actA))/2),0,0,0)); mFont->SetColor(ARGB(static_cast(actA),255,255,255)); mFont->SetScale(actZ); diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index aed2670f2..e59ae8544 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -43,13 +43,28 @@ int Damage::resolve(){ } damage = ev->damage->damage; target = ev->damage->target; - if (!damage) return 0; +//prevent next damage----------------------------- + if((target)->preventable >= 1) { + int preventing =(target)->preventable; + for(int k = preventing; k > 0;k--){ +//the following keeps preventable from ADDING toughness/life if damage was less then preventable amount. + for (int i = 0; i < damage; i++){ + damage -= 1; + (target)->preventable -= 1; + } + } + } +//set prevent next damage back to 0 if it is equal to less then 0 + if((target)->preventable < 0){ + (target)->preventable = 0; + } +//------------------------------------------------- if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE){ MTGCardInstance * _target = (MTGCardInstance *)target; if ((_target)->protectedAgainst(source)) damage = 0; - + if (!damage){ state = RESOLVED_NOK; delete (e); @@ -65,7 +80,7 @@ int Damage::resolve(){ for (int i = 0; i < damage; i++){ _target->counters->addCounter(-1, -1); } - }else{//infect damage--------------------------------------- + }else{//infect damage--------------------------------------------- while(target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE && source->has(Constants::INFECT)){ MTGCardInstance * _target = (MTGCardInstance *)target; for (int i = 0; i < damage; i++){ @@ -76,38 +91,36 @@ int Damage::resolve(){ for (int i = 0; i < damage; i++){ _target->poisonCount += 1;//this will be changed to poison counters. }return a; - }//infect end-------------------------------------------------- - //poison AND damage + }//-------------------------------------------------- + //poison AND damage---------------------------------- while(target->type_as_damageable == DAMAGEABLE_PLAYER && source->has(Constants::POISONDAMAGE)){ MTGCardInstance * _target = (MTGCardInstance *)target; for (int i = 0; i < damage; i++){ - //this will be changed to poison counters. a = target->dealDamage(1); target->damageCount += 1; } _target->poisonCount += 1; return a; } - while(target->type_as_damageable == DAMAGEABLE_PLAYER && source->has(Constants::POISONTWODAMAGE)){ + while(target->type_as_damageable == DAMAGEABLE_PLAYER && source->has(Constants::POISONTWODAMAGE)){ MTGCardInstance * _target = (MTGCardInstance *)target; for (int i = 0; i < damage; i++){ - //this will be changed to poison counters. a = target->dealDamage(1); target->damageCount += 1; } _target->poisonCount += 2; return a; } - while(target->type_as_damageable == DAMAGEABLE_PLAYER && source->has(Constants::POISONTHREEDAMAGE)){ + while(target->type_as_damageable == DAMAGEABLE_PLAYER && source->has(Constants::POISONTHREEDAMAGE)){ MTGCardInstance * _target = (MTGCardInstance *)target; for (int i = 0; i < damage; i++){ - //this will be changed to poison counters. a = target->dealDamage(1); target->damageCount += 1; } _target->poisonCount += 3; return a; - } + }//---------------------------------------------------------- + //return the left over amount after effects have been applied to them. a = target->dealDamage(damage); target->damageCount += 1; } diff --git a/projects/mtg/src/DamagerDamaged.cpp b/projects/mtg/src/DamagerDamaged.cpp index 7cd0e2428..d92a021d8 100644 --- a/projects/mtg/src/DamagerDamaged.cpp +++ b/projects/mtg/src/DamagerDamaged.cpp @@ -75,6 +75,7 @@ void DamagerDamaged::Render(CombatStep mode) }*/ sprintf(buf, "%i", sumDamages()); mFont->DrawString(buf, actX - 14 * actZ + 5, actY - 14 * actZ); + /* }else{ mFont->SetColor(ARGB(255,0,0,255)); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 51622df9f..eac3bd6c3 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -98,6 +98,7 @@ void GameObserver::nextGamePhase(){ cleanupPhase(); currentPlayer->canPutLandsIntoPlay = 1; currentPlayer->damageCount = 0; + currentPlayer->preventable = 0; mLayers->actionLayer()->cleanGarbage(); //clean abilities history for this turn; mLayers->stackLayer()->garbageCollect(); //clean stack history for this turn; mLayers->actionLayer()->Update(0); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index c4b340e90..a933c8158 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -811,6 +811,24 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG a->oneShot = 1; return a; } + //prevent next damage + found = s.find("prevent:"); + if (found != string::npos){ + size_t start = s.find(":",found); + size_t end = s.find(" ",start); + int preventing; + if (end != string::npos){ + preventing = atoi(s.substr(start+1,end-start-1).c_str()); + }else{ + preventing = atoi(s.substr(start+1).c_str()); + } + + Targetable * t = NULL; + if (spell) t = spell->getNextPlayerTarget(); + MTGAbility * a = NEW AADamagePrevent (id, card, t,preventing,NULL,0,who); + a->oneShot = 1; + return a; + } //set life total found = s.find("lifeset"); if (found != string::npos){ @@ -999,6 +1017,8 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG MTGAbility * a = NEW ABloodThirst(id,card,target,amount); return a;} + + //ManaRedux found = s.find("colorless:"); if (found != string::npos){ diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 2aa3f2249..f8fad1188 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -34,6 +34,7 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to defenser = NULL; banding = NULL; life = toughness; + preventable = 0; } void MTGCardInstance::copy(MTGCardInstance * card){ @@ -97,6 +98,7 @@ void MTGCardInstance::initMTGCI(){ tapped = 0; untapping = 0; summoningSickness = 1; + preventable = 0; target = NULL; type_as_damageable = DAMAGEABLE_MTGCARDINSTANCE; banding = NULL; @@ -269,6 +271,7 @@ int MTGCardInstance::cleanup(){ SAFE_DELETE(previous); } regenerateTokens = 0; + preventable = 0; return 1; } diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 866ca99a5..7467cc33d 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -13,7 +13,8 @@ Player::Player(MTGPlayerCards * deck, string file, string fileSmall) : Damageabl manaPool = NEW ManaPool(this); canPutLandsIntoPlay = 1; poisonCount = 0; - damageCount = 0; + damageCount = 0; + preventable = 0; mAvatar = NULL; mAvatarTex = NULL; type_as_damageable = DAMAGEABLE_PLAYER; @@ -91,6 +92,9 @@ int Player::poisoned(){ int Player::damaged(){ return damageCount; } +int Player::prevented(){ + return preventable; +} //Cleanup phase at the end of a turn void Player::cleanupPhase(){ game->inPlay->cleanupPhase(); diff --git a/projects/mtg/src/Rules.cpp b/projects/mtg/src/Rules.cpp index d4036a602..fb1c7439d 100644 --- a/projects/mtg/src/Rules.cpp +++ b/projects/mtg/src/Rules.cpp @@ -40,7 +40,8 @@ MTGCardInstance * Rules::getCardByMTGId(int mtgid){ RulesPlayerData::RulesPlayerData(){ life = 20; poisonCount = 0; - damageCount = 0; + damageCount = 0; + preventable = 0; manapool = NEW ManaCost(); avatar = ""; } @@ -82,8 +83,11 @@ void RulesState::parsePlayerState(int playerId, string s){ }else if(areaS.compare("poisonCount") == 0){ playerData[playerId].poisonCount = atoi((s.substr(limiter+1)).c_str()); return; - }else if(areaS.compare("damageCount") == 0){ + }else if(areaS.compare("damageCount") == 0){ playerData[playerId].damageCount = atoi((s.substr(limiter+1)).c_str()); + return; + }else if(areaS.compare("preventable") == 0){ + playerData[playerId].preventable = atoi((s.substr(limiter+1)).c_str()); return; }else if(areaS.compare("avatar") == 0){ playerData[playerId].avatar = s.substr(limiter+1); @@ -283,6 +287,7 @@ void Rules::initGame(){ p->life = initState.playerData[i].life; p->poisonCount = initState.playerData[i].poisonCount; p->damageCount = initState.playerData[i].damageCount; + p->preventable = initState.playerData[i].preventable; p->getManaPool()->copy(initState.playerData[i].manapool); if (initState.playerData[i].avatar.size()) { p->loadAvatar(initState.playerData[i].avatar); @@ -330,6 +335,7 @@ void RulesPlayerData::cleanup(){ life=20; poisonCount=0; damageCount=0; + preventable=0; } void RulesState::cleanup(){