Coverage for thb/characters/yukari.py : 93%
Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# -*- coding: utf-8 -*-
3# -- stdlib --
4# -- third party --
5# -- own --
6from thb.actions import GenericAction, PlayerTurn, UserAction, migrate_cards, random_choose_card
7from thb.cards.base import CardList, Skill, t_One
8from thb.characters.base import Character, register_character_to
9from thb.inputlets import ChoosePeerCardInputlet
10from thb.mode import THBEventHandler
13# -- code --
14class SpiritingAwayAction(UserAction):
15 def apply_action(self):
16 tgt = self.target
17 src = self.source
18 g = self.game
20 catnames = ('cards', 'showncards', 'equips', 'fatetell')
21 cats = [getattr(tgt, i) for i in catnames]
22 card = g.user_input([src], ChoosePeerCardInputlet(self, tgt, catnames))
23 card = card or random_choose_card(g, cats)
24 if not card: 24 ↛ 25line 24 didn't jump to line 25, because the condition on line 24 was never true
25 return False
27 self.card = card
28 src.reveal(card)
30 src.tags['spirit_away_tag'] += 1
32 cl = getattr(tgt, 'yukari_dimension', None)
33 if cl is None: 33 ↛ 38line 33 didn't jump to line 38, because the condition on line 33 was never false
34 cl = CardList(tgt, 'yukari_dimension')
35 tgt.yukari_dimension = cl
36 tgt.showncardlists.append(cl)
38 migrate_cards([card], cl)
40 return True
42 def is_valid(self):
43 tgt = self.target
44 catnames = ['cards', 'showncards', 'equips', 'fatetell']
45 if not any(getattr(tgt, i) for i in catnames): 45 ↛ exit, 45 ↛ 462 missed branches: 1) line 45 didn't finish the generator expression on line 45, 2) line 45 didn't jump to line 46, because the condition on line 45 was never true
46 return False
48 return self.source.tags['spirit_away_tag'] < 2
51class SpiritingAwayReturningAction(GenericAction):
52 def apply_action(self):
53 g = self.game
54 for p in g.players:
55 cl = getattr(p, 'yukari_dimension', None)
56 cl and migrate_cards(cl, p.cards, unwrap=True)
58 return True
61class SpiritingAway(Skill):
62 associated_action = SpiritingAwayAction
63 skill_category = ['character', 'active']
64 target = t_One()
66 def check(self):
67 return not self.associated_cards
70class SpiritingAwayHandler(THBEventHandler):
71 interested = ['action_after', 'action_apply']
73 def handle(self, evt_type, arg):
74 if evt_type == 'action_apply' and isinstance(arg, PlayerTurn):
75 tgt = arg.target
76 if tgt.has_skill(SpiritingAway):
77 tgt.tags['spirit_away_tag'] = 0
79 elif evt_type == 'action_after' and isinstance(arg, PlayerTurn):
80 tgt = arg.target
81 if not tgt.has_skill(SpiritingAway):
82 return arg
84 g = self.game
85 g.process_action(SpiritingAwayReturningAction(tgt, tgt))
87 return arg
90@register_character_to('common')
91class Yukari(Character):
92 skills = [SpiritingAway]
93 eventhandlers = [SpiritingAwayHandler]
94 maxlife = 4