Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
    def fatetell_action(self, ft):
        act = self.atkact
        if ft.succeeded:
            act.__class__ = classmix(InevitableAttack, act.__class__)
        else:
            mark(act, 'freaking_power')

        return True
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
    def fatetell_action(self, ft):
        act = self.atkact
        if ft.succeeded:
            act.__class__ = classmix(InevitableAttack, act.__class__)
        else:
            act.yugifptag = True

        return True
Ejemplo n.º 8
0
    def fatetell_action(self, ft):
        act = self.atkact
        if ft.succeeded:
            act.__class__ = classmix(InevitableAttack, act.__class__)
        else:
            act.yugifptag = True

        return True
Ejemplo n.º 9
0
    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
Ejemplo n.º 10
0
    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
Ejemplo n.º 11
0
    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
Ejemplo n.º 12
0
    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
Ejemplo n.º 13
0
    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
Ejemplo n.º 14
0
    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
Ejemplo n.º 15
0
    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
Ejemplo n.º 16
0
    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
Ejemplo n.º 17
0
    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
Ejemplo n.º 18
0
 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
Ejemplo n.º 19
0
 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
Ejemplo n.º 20
0
    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)
Ejemplo n.º 21
0
    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)
Ejemplo n.º 22
0
    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
Ejemplo n.º 23
0
 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
Ejemplo n.º 24
0
 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
Ejemplo n.º 25
0
    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
Ejemplo n.º 26
0
    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
Ejemplo n.º 27
0
    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