def bushido(value): if isinstance(value, int): txt="Bushido %d"%value else: txt = "Bushido X" def effects(controller, source): yield NoTarget() value = int(value) until_end_of_turn(source.augment_power_toughness(value, value)) yield ability = TriggeredAbility([Trigger(BlockerDeclaredEvent(), sender_match), Trigger(AttackerBlockedEvent(), sender_match)], effects, txt=txt, keyword='bushido') ability.bushido_value = value return ability
def fading(value): txt = "Fading %d" % value def enterBattlefieldWith(self): self.add_counters('fade', value) def fading_1(source): yield CiP(source, enterBattlefieldWith, txt=txt) fading_CiP = CiPAbility(fading_1, txt=txt, keyword='fading') def condition(source, player): return player == source.controller def fading_2(controller, source, player): target = yield NoTarget() if source.num_counters("fade") > 0: source.remove_counters("fade") else: controller.sacrifice(source) yield fading_Triggered = TriggeredAbility(PhaseTrigger(UpkeepStepEvent(), condition=condition), effects=fading_2) return fading_CiP, fading_Triggered
def persist(): def condition(source, card): return source_match(source, card) and card.num_counters("-1-1") == 0 def enterWithCounters(self): self.add_counters(PowerToughnessCounter(-1, -1)) def persist_effect(controller, source, card, newcard): yield NoTarget() if condition(source, card): expire = CiP( newcard, enterWithCounters, txt='%s - enter the battlefield with a -1/-1 counter' % newcard) # Now move to the battlefield newcard.move_to("battlefield") expire() yield return TriggeredAbility(EnterFromTrigger(from_zone="battlefield", to_zone="graveyard", condition=condition), effects=persist_effect, keyword="persist")
def graft(value): txt = "Graft %d" % value def enterBattlefieldWith(self): self.add_counters(PowerToughnessCounter(1, 1), number=value) def graft_1(source): yield CiP(source, enterBattlefieldWith, txt=txt) graft_CiP = CiPAbility(graft_1, txt=txt, keyword='graft') def condition(source, card): return isCreature( card) and not source == card and source.num_counters("+1+1") > 0 def graft_2(controller, source, card): yield NoTarget() if source.num_counters("+1+1") > 0: if controller.you_may("move a +1/+1 counter from %s to %s" % (source, card)): source.remove_counters(PowerToughnessCounter(1, 1)) card.add_counters(PowerToughnessCounter(1, 1)) yield graft_Triggered = TriggeredAbility(EnterTrigger("battlefield", condition, player="any"), effects=graft_2, txt=txt) return graft_CiP, graft_Triggered
def cascade(): def condition(source, spell): return source == spell def cascade_effects(source, controller, spell): target = yield NoTarget() cmc = source.converted_mana_cost exiled = [] for card in controller.library: exile = card.move_to("exile") exiled.append(exile) if not exile.types == Land and exile.converted_mana_cost < cmc: break yield if exiled: controller.reveal_cards(exiled) exile = exiled[-1] if controller.you_may("cast %s without paying its mana cost?" % exile): exiled.remove(exile) exile.play_without_mana_cost(controller) # move exiled cards back to bottom of library in random order shuffle(exiled) for card in exiled: card.move_to("library", position='bottom') yield yield return TriggeredAbility(SpellPlayedTrigger(condition), effects=cascade_effects, zone="stack", keyword="cascade")
def modular(n): txt = "Modular %d" % n def enterBattlefieldWith(self): self.add_counters(PowerToughnessCounter(1, 1), number=n) def effects(source): yield CiP(source, enterBattlefieldWith, txt=txt) cip = CiPAbility(effects, txt=txt, keyword="modular") def effects(controller, source): target = yield Target(isArtifactCreature, msg="Target Artifact Creature for %s" % source) if controller.you_may("move all +1/+1 counters from %s to target" % source.name): target.add_counters(PowerToughnessCounter(1, 1), number=source.num_counters("+1+1")) yield triggered = TriggeredAbility(EnterFromTrigger("graveyard", "battlefield", source_match, player="any"), effects=effects, txt='') return (cip, triggered)
def bushido(value): if isinstance(value, int): txt = "Bushido %d" % value else: txt = "Bushido X" def effects(controller, source): yield NoTarget() value = int(value) until_end_of_turn(source.augment_power_toughness(value, value)) yield ability = TriggeredAbility([ Trigger(BlockerDeclaredEvent(), sender_match), Trigger(AttackerBlockedEvent(), sender_match) ], effects, txt=txt, keyword='bushido') ability.bushido_value = value return ability
def exalted(): def condition(source, sender, attackers): return sender.active_player == source.controller and len( attackers) == 1 def effects(controller, source, attackers): yield NoTarget() until_end_of_turn(attackers[0].augment_power_toughness(1, 1)) yield return TriggeredAbility(Trigger(DeclareAttackersEvent(), condition), effects, zone="battlefield", keyword='exalted')
def recover(cost): def condition(source, card): return isCreature(card) def effects(controller, source): target = yield NoTarget() if controller.you_may_pay(source, cost): source.move_to("hand") else: source.move_to("exile") yield return TriggeredAbility(EnterFromTrigger("graveyard", "battlefield", condition, player="you"), effects=effects, zone="graveyard", txt="Recover %s"%cost, keyword="recover")
def soulshift(n): def effects(controller, source): target = yield Target(isCard.with_condition( lambda c: c.subtypes == Spirit and c.converted_mana_cost <= n), zone="graveyard", player="you") # Code for effect if controller.you_may("return target to your hand"): target.move_to("hand") yield return TriggeredAbility(EnterFromTrigger("graveyard", "battlefield", source_match, player="you"), effects=effects, txt="Soulshift %s" % n)
def wrap(ability): effects = ability() def condition(source, player): return source.controller == player return TriggeredAbility(PhaseTrigger(UpkeepStepEvent(), condition=condition), effects=effects, txt="Kinship - %s"%txt)
def make_triggered(ability): triggers, effects = ability() return TriggeredAbility(triggers, effects, zone=zone, txt=txt)