added support for "prevent next [number] damage" to player/creature.
This commit is contained in:
@@ -2167,6 +2167,7 @@ AALifeSet(int _id, MTGCardInstance * _source, Targetable * _target, WParsedInt *
|
|||||||
class AADamager:public ActivatedAbilityTP{
|
class AADamager:public ActivatedAbilityTP{
|
||||||
public:
|
public:
|
||||||
WParsedInt * damage;
|
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){
|
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;
|
aType = MTGAbility::DAMAGER;
|
||||||
}
|
}
|
||||||
@@ -2180,11 +2181,9 @@ AADamager(int _id, MTGCardInstance * _source, Targetable * _target, WParsedInt *
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * getMenuText(){
|
const char * getMenuText(){
|
||||||
return "Damage";
|
return "Damage";
|
||||||
}
|
}
|
||||||
|
|
||||||
AADamager * clone() const{
|
AADamager * clone() const{
|
||||||
AADamager * a = NEW AADamager(*this);
|
AADamager * a = NEW AADamager(*this);
|
||||||
a->damage = NEW WParsedInt(*(a->damage));
|
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
|
//poison removel
|
||||||
class AARemovePoison:public ActivatedAbilityTP{
|
class AARemovePoison:public ActivatedAbilityTP{
|
||||||
|
|||||||
@@ -23,12 +23,14 @@ class Damageable:public Targetable {
|
|||||||
int life;
|
int life;
|
||||||
int poisonCount;
|
int poisonCount;
|
||||||
int damageCount;
|
int damageCount;
|
||||||
|
int preventable;
|
||||||
int type_as_damageable;
|
int type_as_damageable;
|
||||||
Damageable(int _life){life=_life;};
|
Damageable(int _life){life=_life;};
|
||||||
int getLife(){return life;};
|
int getLife(){return life;};
|
||||||
virtual int dealDamage(int damage){life-=damage;return life;};
|
virtual int dealDamage(int damage){life-=damage;return life;};
|
||||||
virtual int afterDamage(){return 0;}
|
virtual int afterDamage(){return 0;}
|
||||||
virtual int poisoned(){return 0;}
|
virtual int poisoned(){return 0;}
|
||||||
|
virtual int prevented(){return 0;}
|
||||||
virtual JQuad * getIcon(){return NULL;};
|
virtual JQuad * getIcon(){return NULL;};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -94,7 +94,6 @@ class MTGCardInstance: public CardPrimitive, public MTGCard, public Damageable {
|
|||||||
int nbOpponents();
|
int nbOpponents();
|
||||||
int stepPower(CombatStep step);
|
int stepPower(CombatStep step);
|
||||||
int afterDamage();
|
int afterDamage();
|
||||||
|
|
||||||
int has(int ability);
|
int has(int ability);
|
||||||
int cleanup();
|
int cleanup();
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ class Player: public Damageable{
|
|||||||
int afterDamage();
|
int afterDamage();
|
||||||
int poisoned();
|
int poisoned();
|
||||||
int damaged();
|
int damaged();
|
||||||
|
int prevented();
|
||||||
Player(MTGPlayerCards * deck, string deckFile, string deckFileSmall);
|
Player(MTGPlayerCards * deck, string deckFile, string deckFileSmall);
|
||||||
virtual ~Player();
|
virtual ~Player();
|
||||||
void unTapPhase();
|
void unTapPhase();
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ class RulesPlayerData{
|
|||||||
int life;
|
int life;
|
||||||
int poisonCount;
|
int poisonCount;
|
||||||
int damageCount;
|
int damageCount;
|
||||||
|
int preventable;
|
||||||
string avatar;
|
string avatar;
|
||||||
ManaCost * manapool;
|
ManaCost * manapool;
|
||||||
RulesPlayerZone zones[5];
|
RulesPlayerZone zones[5];
|
||||||
|
|||||||
@@ -101,11 +101,11 @@ void CardGui::Render()
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
//draws the numbers power/toughness
|
||||||
if (card->isCreature()){
|
if (card->isCreature()){
|
||||||
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
|
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
|
||||||
char buffer[200];
|
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<unsigned char>(actA))/2),0,0,0));
|
renderer->FillRect(actX - (12*actZ) , actY + 6* actZ, 25*actZ, 12*actZ, ARGB(((static_cast<unsigned char>(actA))/2),0,0,0));
|
||||||
mFont->SetColor(ARGB(static_cast<unsigned char>(actA),255,255,255));
|
mFont->SetColor(ARGB(static_cast<unsigned char>(actA),255,255,255));
|
||||||
mFont->SetScale(actZ);
|
mFont->SetScale(actZ);
|
||||||
|
|||||||
+24
-11
@@ -43,13 +43,28 @@ int Damage::resolve(){
|
|||||||
}
|
}
|
||||||
damage = ev->damage->damage;
|
damage = ev->damage->damage;
|
||||||
target = ev->damage->target;
|
target = ev->damage->target;
|
||||||
|
|
||||||
if (!damage) return 0;
|
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){
|
if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE){
|
||||||
MTGCardInstance * _target = (MTGCardInstance *)target;
|
MTGCardInstance * _target = (MTGCardInstance *)target;
|
||||||
if ((_target)->protectedAgainst(source)) damage = 0;
|
if ((_target)->protectedAgainst(source)) damage = 0;
|
||||||
|
|
||||||
if (!damage){
|
if (!damage){
|
||||||
state = RESOLVED_NOK;
|
state = RESOLVED_NOK;
|
||||||
delete (e);
|
delete (e);
|
||||||
@@ -65,7 +80,7 @@ int Damage::resolve(){
|
|||||||
for (int i = 0; i < damage; i++){
|
for (int i = 0; i < damage; i++){
|
||||||
_target->counters->addCounter(-1, -1);
|
_target->counters->addCounter(-1, -1);
|
||||||
}
|
}
|
||||||
}else{//infect damage---------------------------------------
|
}else{//infect damage---------------------------------------------
|
||||||
while(target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE && source->has(Constants::INFECT)){
|
while(target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE && source->has(Constants::INFECT)){
|
||||||
MTGCardInstance * _target = (MTGCardInstance *)target;
|
MTGCardInstance * _target = (MTGCardInstance *)target;
|
||||||
for (int i = 0; i < damage; i++){
|
for (int i = 0; i < damage; i++){
|
||||||
@@ -76,38 +91,36 @@ int Damage::resolve(){
|
|||||||
for (int i = 0; i < damage; i++){
|
for (int i = 0; i < damage; i++){
|
||||||
_target->poisonCount += 1;//this will be changed to poison counters.
|
_target->poisonCount += 1;//this will be changed to poison counters.
|
||||||
}return a;
|
}return a;
|
||||||
}//infect end--------------------------------------------------
|
}//--------------------------------------------------
|
||||||
//poison AND damage
|
//poison AND damage----------------------------------
|
||||||
while(target->type_as_damageable == DAMAGEABLE_PLAYER && source->has(Constants::POISONDAMAGE)){
|
while(target->type_as_damageable == DAMAGEABLE_PLAYER && source->has(Constants::POISONDAMAGE)){
|
||||||
MTGCardInstance * _target = (MTGCardInstance *)target;
|
MTGCardInstance * _target = (MTGCardInstance *)target;
|
||||||
for (int i = 0; i < damage; i++){
|
for (int i = 0; i < damage; i++){
|
||||||
//this will be changed to poison counters.
|
|
||||||
a = target->dealDamage(1);
|
a = target->dealDamage(1);
|
||||||
target->damageCount += 1;
|
target->damageCount += 1;
|
||||||
}
|
}
|
||||||
_target->poisonCount += 1;
|
_target->poisonCount += 1;
|
||||||
return a;
|
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;
|
MTGCardInstance * _target = (MTGCardInstance *)target;
|
||||||
for (int i = 0; i < damage; i++){
|
for (int i = 0; i < damage; i++){
|
||||||
//this will be changed to poison counters.
|
|
||||||
a = target->dealDamage(1);
|
a = target->dealDamage(1);
|
||||||
target->damageCount += 1;
|
target->damageCount += 1;
|
||||||
}
|
}
|
||||||
_target->poisonCount += 2;
|
_target->poisonCount += 2;
|
||||||
return a;
|
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;
|
MTGCardInstance * _target = (MTGCardInstance *)target;
|
||||||
for (int i = 0; i < damage; i++){
|
for (int i = 0; i < damage; i++){
|
||||||
//this will be changed to poison counters.
|
|
||||||
a = target->dealDamage(1);
|
a = target->dealDamage(1);
|
||||||
target->damageCount += 1;
|
target->damageCount += 1;
|
||||||
}
|
}
|
||||||
_target->poisonCount += 3;
|
_target->poisonCount += 3;
|
||||||
return a;
|
return a;
|
||||||
}
|
}//----------------------------------------------------------
|
||||||
|
//return the left over amount after effects have been applied to them.
|
||||||
a = target->dealDamage(damage);
|
a = target->dealDamage(damage);
|
||||||
target->damageCount += 1;
|
target->damageCount += 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ void DamagerDamaged::Render(CombatStep mode)
|
|||||||
}*/
|
}*/
|
||||||
sprintf(buf, "%i", sumDamages());
|
sprintf(buf, "%i", sumDamages());
|
||||||
mFont->DrawString(buf, actX - 14 * actZ + 5, actY - 14 * actZ);
|
mFont->DrawString(buf, actX - 14 * actZ + 5, actY - 14 * actZ);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
}else{
|
}else{
|
||||||
mFont->SetColor(ARGB(255,0,0,255));
|
mFont->SetColor(ARGB(255,0,0,255));
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ void GameObserver::nextGamePhase(){
|
|||||||
cleanupPhase();
|
cleanupPhase();
|
||||||
currentPlayer->canPutLandsIntoPlay = 1;
|
currentPlayer->canPutLandsIntoPlay = 1;
|
||||||
currentPlayer->damageCount = 0;
|
currentPlayer->damageCount = 0;
|
||||||
|
currentPlayer->preventable = 0;
|
||||||
mLayers->actionLayer()->cleanGarbage(); //clean abilities history for this turn;
|
mLayers->actionLayer()->cleanGarbage(); //clean abilities history for this turn;
|
||||||
mLayers->stackLayer()->garbageCollect(); //clean stack history for this turn;
|
mLayers->stackLayer()->garbageCollect(); //clean stack history for this turn;
|
||||||
mLayers->actionLayer()->Update(0);
|
mLayers->actionLayer()->Update(0);
|
||||||
|
|||||||
@@ -811,6 +811,24 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
|||||||
a->oneShot = 1;
|
a->oneShot = 1;
|
||||||
return a;
|
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
|
//set life total
|
||||||
found = s.find("lifeset");
|
found = s.find("lifeset");
|
||||||
if (found != string::npos){
|
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);
|
MTGAbility * a = NEW ABloodThirst(id,card,target,amount);
|
||||||
return a;}
|
return a;}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//ManaRedux
|
//ManaRedux
|
||||||
found = s.find("colorless:");
|
found = s.find("colorless:");
|
||||||
if (found != string::npos){
|
if (found != string::npos){
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to
|
|||||||
defenser = NULL;
|
defenser = NULL;
|
||||||
banding = NULL;
|
banding = NULL;
|
||||||
life = toughness;
|
life = toughness;
|
||||||
|
preventable = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MTGCardInstance::copy(MTGCardInstance * card){
|
void MTGCardInstance::copy(MTGCardInstance * card){
|
||||||
@@ -97,6 +98,7 @@ void MTGCardInstance::initMTGCI(){
|
|||||||
tapped = 0;
|
tapped = 0;
|
||||||
untapping = 0;
|
untapping = 0;
|
||||||
summoningSickness = 1;
|
summoningSickness = 1;
|
||||||
|
preventable = 0;
|
||||||
target = NULL;
|
target = NULL;
|
||||||
type_as_damageable = DAMAGEABLE_MTGCARDINSTANCE;
|
type_as_damageable = DAMAGEABLE_MTGCARDINSTANCE;
|
||||||
banding = NULL;
|
banding = NULL;
|
||||||
@@ -269,6 +271,7 @@ int MTGCardInstance::cleanup(){
|
|||||||
SAFE_DELETE(previous);
|
SAFE_DELETE(previous);
|
||||||
}
|
}
|
||||||
regenerateTokens = 0;
|
regenerateTokens = 0;
|
||||||
|
preventable = 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,8 @@ Player::Player(MTGPlayerCards * deck, string file, string fileSmall) : Damageabl
|
|||||||
manaPool = NEW ManaPool(this);
|
manaPool = NEW ManaPool(this);
|
||||||
canPutLandsIntoPlay = 1;
|
canPutLandsIntoPlay = 1;
|
||||||
poisonCount = 0;
|
poisonCount = 0;
|
||||||
damageCount = 0;
|
damageCount = 0;
|
||||||
|
preventable = 0;
|
||||||
mAvatar = NULL;
|
mAvatar = NULL;
|
||||||
mAvatarTex = NULL;
|
mAvatarTex = NULL;
|
||||||
type_as_damageable = DAMAGEABLE_PLAYER;
|
type_as_damageable = DAMAGEABLE_PLAYER;
|
||||||
@@ -91,6 +92,9 @@ int Player::poisoned(){
|
|||||||
int Player::damaged(){
|
int Player::damaged(){
|
||||||
return damageCount;
|
return damageCount;
|
||||||
}
|
}
|
||||||
|
int Player::prevented(){
|
||||||
|
return preventable;
|
||||||
|
}
|
||||||
//Cleanup phase at the end of a turn
|
//Cleanup phase at the end of a turn
|
||||||
void Player::cleanupPhase(){
|
void Player::cleanupPhase(){
|
||||||
game->inPlay->cleanupPhase();
|
game->inPlay->cleanupPhase();
|
||||||
|
|||||||
@@ -40,7 +40,8 @@ MTGCardInstance * Rules::getCardByMTGId(int mtgid){
|
|||||||
RulesPlayerData::RulesPlayerData(){
|
RulesPlayerData::RulesPlayerData(){
|
||||||
life = 20;
|
life = 20;
|
||||||
poisonCount = 0;
|
poisonCount = 0;
|
||||||
damageCount = 0;
|
damageCount = 0;
|
||||||
|
preventable = 0;
|
||||||
manapool = NEW ManaCost();
|
manapool = NEW ManaCost();
|
||||||
avatar = "";
|
avatar = "";
|
||||||
}
|
}
|
||||||
@@ -82,8 +83,11 @@ void RulesState::parsePlayerState(int playerId, string s){
|
|||||||
}else if(areaS.compare("poisonCount") == 0){
|
}else if(areaS.compare("poisonCount") == 0){
|
||||||
playerData[playerId].poisonCount = atoi((s.substr(limiter+1)).c_str());
|
playerData[playerId].poisonCount = atoi((s.substr(limiter+1)).c_str());
|
||||||
return;
|
return;
|
||||||
}else if(areaS.compare("damageCount") == 0){
|
}else if(areaS.compare("damageCount") == 0){
|
||||||
playerData[playerId].damageCount = atoi((s.substr(limiter+1)).c_str());
|
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;
|
return;
|
||||||
}else if(areaS.compare("avatar") == 0){
|
}else if(areaS.compare("avatar") == 0){
|
||||||
playerData[playerId].avatar = s.substr(limiter+1);
|
playerData[playerId].avatar = s.substr(limiter+1);
|
||||||
@@ -283,6 +287,7 @@ void Rules::initGame(){
|
|||||||
p->life = initState.playerData[i].life;
|
p->life = initState.playerData[i].life;
|
||||||
p->poisonCount = initState.playerData[i].poisonCount;
|
p->poisonCount = initState.playerData[i].poisonCount;
|
||||||
p->damageCount = initState.playerData[i].damageCount;
|
p->damageCount = initState.playerData[i].damageCount;
|
||||||
|
p->preventable = initState.playerData[i].preventable;
|
||||||
p->getManaPool()->copy(initState.playerData[i].manapool);
|
p->getManaPool()->copy(initState.playerData[i].manapool);
|
||||||
if (initState.playerData[i].avatar.size()) {
|
if (initState.playerData[i].avatar.size()) {
|
||||||
p->loadAvatar(initState.playerData[i].avatar);
|
p->loadAvatar(initState.playerData[i].avatar);
|
||||||
@@ -330,6 +335,7 @@ void RulesPlayerData::cleanup(){
|
|||||||
life=20;
|
life=20;
|
||||||
poisonCount=0;
|
poisonCount=0;
|
||||||
damageCount=0;
|
damageCount=0;
|
||||||
|
preventable=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RulesState::cleanup(){
|
void RulesState::cleanup(){
|
||||||
|
|||||||
Reference in New Issue
Block a user