def handle(self, evt_type, act): if evt_type == 'action_shootdown' and isinstance(act, LaunchCard): if act.bypass_check: return act c = act.card if not c.is_card(AttackCard): return act src, tgt = act.source, act.target if not src.tags['scarlet_mist'] == 'nerf': return act dist = LaunchCard.calc_raw_distance(src, DummyCard()) if dist[tgt] > 1: raise ScarletMistAttackLimit elif evt_type == 'post_calcdistance': src, c, dist = act if not c.is_card(AttackCard): return act if src.tags['scarlet_mist'] != 'buff': return act for k in dist: dist[k] = 0 elif evt_type == 'action_after' and isinstance(act, Damage): src = act.source if not (src and src.tags['scarlet_mist'] == 'buff'): return act if src.life >= src.maxlife: return act g = Game.getgame() pact = g.action_stack[-1] if not isinstance(pact, Attack): return act if not pact.associated_card: return act g.process_action(Heal(src, src, act.amount)) elif evt_type == 'action_apply' and isinstance(act, PrepareStage): tgt = act.target if not tgt.has_skill(ScarletMist): return act if not tgt.tags['scarlet_mist']: return act g = Game.getgame() g.process_action(ScarletMistEndAction(None, None)) return act
def target(g, p, tl): l = g.players.rotate_to(p) del l[0] dists = LaunchCard.calc_raw_distance(p, AttackCard()) return ([t for t in l if not t.dead and dists[t] <= 1], True)