def handle(self, evt_type, act): if evt_type == 'action_before': if isinstance(act, Attack): if not act.source.has_skill(Mijincihangzhan): return act act.__class__ = classmix(MijincihangzhanAttack, act.__class__) act.graze_count = 0 elif isinstance(act, BaseDuel): if not isinstance(act, MijincihangzhanDuelMixin): act.__class__ = classmix(MijincihangzhanDuelMixin, act.__class__) elif evt_type == 'action_apply' and isinstance(act, ActionStage): p = act.target p.tags['vitality'] += bool( p.has_skill(Nitoryuu) and self.weapons(p) >= 2) elif evt_type == 'card_migration': act, cards, _from, to, _ = arg = act for cl in (_from, to): if cl.type != 'equips': continue p = cl.owner if not p.has_skill(Nitoryuu): continue n = self.weapons(p) dn = len(cards) if not any( getattr(c, 'equipment_category', None) == 'weapon' for c in cards): continue if cl is _from and (dn + n) >= 2 and n <= 1: adjust = -1 elif cl is to and (n - dn) <= 1 and n >= 2: adjust = 1 else: adjust = 0 p.tags['vitality'] += adjust return arg elif evt_type == 'attack_aftergraze': act, rst = arg = act if rst: return arg if not isinstance(act, MijincihangzhanAttack): return arg g = Game.getgame() return act, not g.process_action(LaunchGraze(act.target)) return act
def mixin_character(player, char_cls): from utils import classmix pcls = player.__class__ if hasattr(pcls, 'mixins'): old = player.char_cls player.char_cls = char_cls player.__class__ = classmix(player.base_cls, char_cls) return old else: player.base_cls = pcls player.char_cls = char_cls player.__class__ = classmix(pcls, char_cls) return None
def fatetell_action(self, ft): act = self.atkact if ft.succeeded: act.__class__ = classmix(InevitableAttack, act.__class__) else: mark(act, 'freaking_power') return True
def handle(self, evt_type, act): if evt_type == 'action_before': if isinstance(act, Attack): if not act.source.has_skill(Mijincihangzhan): return act act.__class__ = classmix(MijincihangzhanAttack, act.__class__) elif isinstance(act, BaseDuel): if not isinstance(act, MijincihangzhanDuelMixin): act.__class__ = classmix(MijincihangzhanDuelMixin, act.__class__) elif isinstance(act, WearEquipmentAction): if not act.source.has_skill(Nitoryuu): return act act.__class__ = YoumuWearEquipmentAction elif isinstance(act, ActionStage): a = act.target if not a.has_skill(Xianshiwangzhi): return act a.tags['attack_num'] += 1 return act
def handle(self, evt_type, act): if evt_type == 'action_before': if isinstance(act, Attack): if not act.source.has_skill(Mijincihangzhan): return act act.__class__ = classmix(MijincihangzhanAttack, act.__class__) act.graze_count = 0 elif isinstance(act, BaseDuel): if not isinstance(act, MijincihangzhanDuelMixin): act.__class__ = classmix(MijincihangzhanDuelMixin, act.__class__) elif evt_type == 'action_apply' and isinstance(act, ActionStage): p = act.target p.tags['vitality'] += bool(p.has_skill(Nitoryuu) and self.weapons(p) >= 2) elif evt_type == 'card_migration': act, cards, _from, to, _ = arg = act for cl in (_from, to): if cl.type != 'equips': continue p = cl.owner if not p.has_skill(Nitoryuu): continue n = self.weapons(p) dn = len(cards) if cl is _from and (dn + n) >= 2 and n <= 1: adjust = -1 elif cl is to and (n - dn) <= 1 and n >= 2: adjust = 1 else: adjust = 0 p.tags['vitality'] += adjust return arg elif evt_type == 'attack_aftergraze': act, rst = arg = act if rst: return arg if not isinstance(act, MijincihangzhanAttack): return arg g = Game.getgame() return act, not g.process_action(LaunchGraze(act.target)) return act
def handle(self, evt_type, act): if evt_type == 'action_before' and isinstance(act, spellcard.DemonParadeEffect): target = act.target if not act.cancelled and target.has_skill(MaidenCostumeSkill): act.__class__ = classmix(MaidenCostumeEffect, act.__class__) return act return act
def fatetell_action(self, ft): act = self.atkact if ft.succeeded: act.__class__ = classmix(InevitableAttack, act.__class__) else: act.yugifptag = True return True
def handle(self, evt_type, act): if evt_type == 'action_before': if isinstance(act, Attack): if not act.source.has_skill(Mijincihangzhan): return act act.__class__ = classmix(MijincihangzhanAttack, act.__class__) act.graze_count = 0 elif isinstance(act, BaseDuel): if not isinstance(act, MijincihangzhanDuelMixin): act.__class__ = classmix(MijincihangzhanDuelMixin, act.__class__) elif isinstance(act, WearEquipmentAction): if not act.source.has_skill(Nitoryuu): return act act.__class__ = YoumuWearEquipmentAction elif evt_type == 'action_apply' and isinstance(act, ActionStage): p = act.target p.tags['attack_num'] += p.tags.get('nitoryuu_tag', False) elif evt_type == 'card_migration': def weapons(cards): return [c for c in cards if c.equipment_category == 'weapon'] act, cards, _from, to, _ = arg = act for cl in (_from, to): if cl.type != 'equips': continue p = cl.owner if p.has_skill(Nitoryuu): active = len(weapons(p.equips)) >= 2 oactive = p.tags.get('nitoryuu_tag', False) p.tags['attack_num'] += active - oactive p.tags['nitoryuu_tag'] = active return arg elif evt_type == 'attack_aftergraze': act, rst = arg = act if rst: return arg if not isinstance(act, MijincihangzhanAttack): return arg g = Game.getgame() return act, not g.process_action(LaunchGraze(act.target)) return act
def handle(self, evt_type, act): if evt_type == 'action_before' and isinstance( act, spellcard.DemonParadeEffect): target = act.target if not act.cancelled and target.has_skill(MaidenCostumeSkill): act.__class__ = classmix(MaidenCostumeEffect, act.__class__) return act return act
def handle(self, evt_type, act): if evt_type == 'action_before' and isinstance(act, basic.BaseAttack): if isinstance(act, ScarletRhapsodySwordAttack): return act src = act.source if not src: return act if not src.has_skill(ScarletRhapsodySwordSkill): return act act.__class__ = classmix(ScarletRhapsodySwordAttack, act.__class__) return act
def handle(self, evt_type, act): if evt_type == 'action_before' and isinstance(act, basic.BaseAttack): if isinstance(act, LaevateinAttack): return act src = act.source if not src: return act if not src.has_skill(LaevateinSkill): return act act.__class__ = classmix(LaevateinAttack, act.__class__) return act
def handle(self, evt_type, act): if evt_type == 'action_before' and isinstance(act, basic.Attack): src = act.source if not src.has_skill(HouraiJewelSkill): return act if isinstance(act, HouraiJewelAttack): return act if user_input([src], ChooseOptionInputlet(self, (False, True))): act.__class__ = classmix(HouraiJewelAttack, act.__class__) return act
def apply_action(self): act = self.atkact src = act.source ft = Fatetell(src, lambda c: c.suit in (Card.HEART, Card.DIAMOND)) g = Game.getgame() if g.process_action(ft): act.__class__ = classmix(InevitableAttack, act.__class__) else: act.yugifptag = True return True
def apply_action(self): act = self.action tgt = act.target skills = [s for s in tgt.skills if issubclass(s, ShieldSkill)] for s in skills: tgt.disable_skill(s, 'roukanken') act.__class__ = classmix(RoukankenMixin, act.__class__) act.roukanken_disabled_skills = skills return Game.getgame().process_action(act)
def handle(self, evt_type, act): if evt_type == "action_before" and isinstance(act, basic.BaseAttack): if isinstance(act, LaevateinAttack): return act src = act.source if not src: return act if not src.has_skill(LaevateinSkill): return act act.__class__ = classmix(LaevateinAttack, act.__class__) return act
def handle(self, evt_type, act): from .basic import BaseUseGraze if evt_type == 'action_before' and isinstance(act, BaseUseGraze): target = act.target if not target.has_skill(OpticalCloakSkill): return act if not user_choose_option(self, target): return act g = Game.getgame() oc = OpticalCloak(target, target) if g.process_action(oc): act.__class__ = classmix(DummyAction, act.__class__) act.result = True ocs = OpticalCloakSkill(target) ocs.associated_cards = [oc.fatetell_card] act.card = ocs # UseCard attribute return act return act
def handle(self, evt_type, act): if evt_type == 'action_before' and isinstance(act, (UseGraze, LaunchGraze)): tgt = act.target if tgt.has_skill(Jiongyanjian): act.__class__ = classmix(JiongyanjianMixin, act.__class__) act.card_cls = JiongyanjianLegalCard elif evt_type == 'action_after' and isinstance(act, Attack): src, tgt = act.source, act.target if not act.succeeded and tgt.has_skill(Jiongyanjian): for c in tgt.equips: if 'weapon' in c.category: g = Game.getgame() g.process_action(JiongyanjianDamageAction(tgt, src, 1)) break return act
def handle(self, evt_type, act): if evt_type == 'action_before' and isinstance(act, Attack): c = getattr(act, 'associated_card', None) if not c: return act src = act.source if not src.has_skill(MagicCannon): return act if c.color == Card.RED: act.damage += 1 act.__class__ = classmix(MagicCannonAttack, act.__class__) elif evt_type == 'action_before' and isinstance(act, TryRevive): g = Game.getgame() dmg = act.dmgact assert isinstance(dmg, BaseDamage) src = dmg.source tgt = dmg.target if src != tgt and src and src.has_skill(PerfectKill): g.process_action(PerfectKillAction(src, dmg.target, act)) return act