diff --git a/projects/mtg/bin/Res/sets/10E/_cards.dat b/projects/mtg/bin/Res/sets/10E/_cards.dat index 9953b9597..5efb35974 100644 --- a/projects/mtg/bin/Res/sets/10E/_cards.dat +++ b/projects/mtg/bin/Res/sets/10E/_cards.dat @@ -213,6 +213,19 @@ type=Sorcery mana={X}{R} [/card] [card] +text=Bloodrock Cyclops attacks each turn if able. +abilities=mustattack +id=130384 +name=Bloodrock Cyclops +rarity=C +color=Red +type=Creature +mana={2}{R} +power=3 +subtype=Cyclops +toughness=3 +[/card] +[card] text=Swampwalk (This creature is unblockable as long as defending player controls a Swamp.) abilities=swampwalk id=129491 diff --git a/projects/mtg/bin/Res/sets/10E/todo.dat b/projects/mtg/bin/Res/sets/10E/todo.dat index fc1b8a48d..48ac5d9f9 100644 --- a/projects/mtg/bin/Res/sets/10E/todo.dat +++ b/projects/mtg/bin/Res/sets/10E/todo.dat @@ -195,18 +195,7 @@ power=6 subtype=Giant toughness=6 [/card] -[card] -text=Bloodrock Cyclops attacks each turn if able. -id=130384 -name=Bloodrock Cyclops -rarity=C -color=Red -type=Creature -mana={2}{R} -power=3 -subtype=Cyclops -toughness=3 -[/card] + [card] text=When Bogardan Firefiend is put into a graveyard from play, it deals 2 damage to target creature. id=130534 diff --git a/projects/mtg/bin/Res/sets/ALA/_cards.dat b/projects/mtg/bin/Res/sets/ALA/_cards.dat index b8501ddd0..057450a0f 100644 --- a/projects/mtg/bin/Res/sets/ALA/_cards.dat +++ b/projects/mtg/bin/Res/sets/ALA/_cards.dat @@ -796,6 +796,19 @@ subtype=Bird Skeleton toughness=2 [/card] [card] +text=Steelclad Serpent can't attack unless you control another artifact. +abilities=cantattack +auto=aslongas(artifact|myinplay) other -cantattack +id=175009 +name=Steelclad Serpent +rarity=C +type=Artifact Creature +mana={5}{U} +power=4 +subtype=Serpent +toughness=5 +[/card] +[card] text=Vigilance {T}: Add {G} to your mana pool. abilities=vigilance auto={T}:Add{G} diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 3d83c4fa2..e07e6c482 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -1,6 +1,7 @@ ######################## #Generic engine features ######################## +generic/attacks_each_turn.txt generic/first_strike.txt generic/first_strike2.txt generic/first_strike3.txt @@ -92,6 +93,8 @@ shock.txt spark_elemental.txt spirit_link.txt stasis.txt +steelclad_serpent1.txt +steelclad_serpent2.txt sword_to_plowshares.txt terror.txt tranquil_domain.txt diff --git a/projects/mtg/bin/Res/test/generic/attacks_each_turn.txt b/projects/mtg/bin/Res/test/generic/attacks_each_turn.txt new file mode 100644 index 000000000..c483f6bb1 --- /dev/null +++ b/projects/mtg/bin/Res/test/generic/attacks_each_turn.txt @@ -0,0 +1,24 @@ +#Bloodrock Cyclops attacks each turn if able. +[INIT] +FIRSTMAIN +[PLAYER1] +inplay:bloodrock cyclops +[PLAYER2] +[DO] +next +#combat begin +next +#attackers +next +#blockers +next +#damage +next +#combat end +[ASSERT] +COMBATEND +[PLAYER1] +inplay:bloodrock cyclops +[PLAYER2] +life:17 +[END] \ No newline at end of file diff --git a/projects/mtg/bin/Res/test/steelclad_serpent1.txt b/projects/mtg/bin/Res/test/steelclad_serpent1.txt new file mode 100644 index 000000000..9669bb9a4 --- /dev/null +++ b/projects/mtg/bin/Res/test/steelclad_serpent1.txt @@ -0,0 +1,17 @@ +#Steelclad serpent can't attack unless you control another artifact +[INIT] +COMBATATTACKERS +[PLAYER1] +inplay:Steelclad Serpent +[PLAYER2] +[DO] +Steelclad Serpent +next +next +next +[ASSERT] +COMBATEND +[PLAYER1] +inplay:Steelclad Serpent +[PLAYER2] +[END] \ No newline at end of file diff --git a/projects/mtg/bin/Res/test/steelclad_serpent2.txt b/projects/mtg/bin/Res/test/steelclad_serpent2.txt new file mode 100644 index 000000000..63d5bf76b --- /dev/null +++ b/projects/mtg/bin/Res/test/steelclad_serpent2.txt @@ -0,0 +1,18 @@ +#Steelclad serpent can't attack unless you control another artifact +[INIT] +COMBATATTACKERS +[PLAYER1] +inplay:Steelclad Serpent,black vise +[PLAYER2] +[DO] +Steelclad Serpent +next +next +next +[ASSERT] +COMBATEND +[PLAYER1] +inplay:Steelclad Serpent,black vise +[PLAYER2] +life:16 +[END] \ No newline at end of file diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 030e93082..74508a4c5 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -921,10 +921,11 @@ class ALord:public ListMaintainerAbility{ TargetChooser * tc; int power, toughness; int ability; + int modifier; ManaCost * regenCost; int includeSelf; map regenerations; - ALord(int _id, MTGCardInstance * card, TargetChooser * _tc, int _includeSelf, int _power = 0 , int _toughness = 0, int _ability = -1, ManaCost * _regenCost = NULL):ListMaintainerAbility(_id,card){ + ALord(int _id, MTGCardInstance * card, TargetChooser * _tc, int _includeSelf, int _power = 0 , int _toughness = 0, int _ability = -1, ManaCost * _regenCost = NULL, int _modifier = 1):ListMaintainerAbility(_id,card){ tc = _tc; tc->source = NULL; includeSelf = _includeSelf; @@ -932,6 +933,8 @@ class ALord:public ListMaintainerAbility{ toughness = _toughness; ability = _ability; regenCost = _regenCost; + modifier = _modifier; + if (!modifier) modifier = -1; } int canBeInList(MTGCardInstance * card){ @@ -942,7 +945,7 @@ class ALord:public ListMaintainerAbility{ int added(MTGCardInstance * card){ card->power += power; card->addToToughness(toughness); - if (ability != -1) card->basicAbilities[ability] +=1; + if (ability != -1) card->basicAbilities[ability] +=modifier; if (regenCost){ ManaCost * _regenCost = NEW ManaCost(regenCost); AStandardRegenerate * regen = NEW AStandardRegenerate(0, card, card, _regenCost); @@ -955,7 +958,7 @@ class ALord:public ListMaintainerAbility{ int removed(MTGCardInstance * card){ card->power -= power; card->addToToughness(-toughness); - if (ability != -1 && card->basicAbilities[ability]) card->basicAbilities[ability] -=1; + if (ability != -1 && ((card->basicAbilities[ability]>0 && (modifier >0)) || (card->basicAbilities[ability]<=0 && (modifier <0)) )) card->basicAbilities[ability] -=modifier; if (regenCost){ if(regenerations.find(card) != regenerations.end()){ if (game->isInPlay(card)) game->removeObserver(regenerations[card]); @@ -2720,13 +2723,16 @@ class AKirdApe:public ListMaintainerAbility{ int power; int toughness; int ability; + int modifier; int includeSelf; - AKirdApe(int _id, MTGCardInstance * _source, TargetChooser * _tc, int _includeSelf,int _power = 0, int _toughness = 0, int _ability=-1):ListMaintainerAbility(_id, _source){ + AKirdApe(int _id, MTGCardInstance * _source, TargetChooser * _tc, int _includeSelf,int _power = 0, int _toughness = 0, int _ability=-1, int _abilityModifier = 1):ListMaintainerAbility(_id, _source){ power = _power; toughness = _toughness; tc = _tc; includeSelf = _includeSelf; ability=_ability; + modifier = _abilityModifier; + if (!modifier) modifier = -1; } int canBeInList(MTGCardInstance * card){ @@ -2738,7 +2744,7 @@ class AKirdApe:public ListMaintainerAbility{ if (cards.size()== 1){ source->power+=power; source->addToToughness(toughness); - if (ability != -1) source->basicAbilities[ability] +=1; + if (ability != -1) source->basicAbilities[ability] +=modifier; return 1; } return 0; @@ -2749,7 +2755,7 @@ class AKirdApe:public ListMaintainerAbility{ if (cards.size()== 0){ source->power-=power; source->addToToughness(-toughness); - if ((ability != -1) && source->basicAbilities[ability] >0 ) source->basicAbilities[ability] -=1; + if ((ability != -1) && source->basicAbilities[ability] >0 ) source->basicAbilities[ability] -=modifier; return 1; } return 0; diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index f2a7644b2..ea6f0a5d8 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -25,6 +25,7 @@ class MTGAttackRule:public MTGAbility{ int testDestroy(); MTGAttackRule(int _id); const char * getMenuText(){return "Attacker";} + void Update(float dt); }; diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 44a43f4c5..0b3510336 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -598,9 +598,9 @@ int AbilityFactory::magicText(int id, Spell * spell, MTGCardInstance * card){ } if (lordType == PARSER_LORD){ - game->addObserver(NEW ALord(id,card,lordTargets,lordIncludeSelf,0,0,j)); + game->addObserver(NEW ALord(id,card,lordTargets,lordIncludeSelf,0,0,j,0,modifier)); }else if (lordType == PARSER_ASLONGAS){ - game->addObserver(NEW AKirdApe(id,card,lordTargets,lordIncludeSelf,0,0,j)); + game->addObserver(NEW AKirdApe(id,card,lordTargets,lordIncludeSelf,0,0,j,modifier)); }else{ if (tc){ game->addObserver(NEW ABasicAbilityModifierUntilEOT(id, card, j, cost,tc, modifier)); diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 5c7513409..0507137f5 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -272,9 +272,11 @@ Player * MTGCardInstance::controller(){ } int MTGCardInstance::canAttack(){ - if (!hasSummoningSickness() && !tapped && isACreature() && basicAbilities[Constants::DEFENSER] !=1) - return 1; - return 0; + if (tapped) return 0; + if (hasSummoningSickness()) return 0; + if (basicAbilities[Constants::DEFENSER] || basicAbilities[Constants::CANTATTACK]) return 0; + if (!isACreature()) return 0; + return 1; } diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index f276cab93..54d7f40cb 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -88,6 +88,18 @@ int MTGAttackRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana){ return 0; } +void MTGAttackRule::Update(float dt){ + if (currentPhase != newPhase && currentPhase == Constants::MTG_PHASE_COMBATATTACKERS){ + Player * p = game->currentPlayer; + MTGGameZone * z = p->game->inPlay; + for (int i= 0; i < z->nb_cards; i++){ + MTGCardInstance * card = z->cards[i]; + if (!card->isAttacker() && card->has(Constants::MUSTATTACK)) reactToClick(card); + } + } + MTGAbility::Update(dt); +} + int MTGAttackRule::reactToClick(MTGCardInstance * card){ if (!isReactingToClick(card)) return 0; card->attacker = 1;