Coverage for thb/characters/koakuma.py : 39%
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 -*-
2from __future__ import annotations
4# -- stdlib --
5# -- third party --
6# -- own --
7from thb.actions import DrawCards, UserAction, ttags
8from thb.cards.base import Skill
9from thb.cards.classes import t_Self
10from thb.characters.base import Character, register_character_to
13# -- code --
14class FindAction(UserAction):
15 def apply_action(self):
16 g = self.game
17 sk = self.associated_card
18 assert isinstance(sk, Find)
19 cards = sk.associated_cards
20 n = len(cards)
21 # card will be dropped at LaunchCard
22 # g.process_action(DropCards(tgt, tgt, cards))
23 tgt = self.target
24 g.process_action(DrawCards(tgt, n))
25 ttags(tgt)['find'] = True
26 return True
28 def is_valid(self):
29 try:
30 p = self.target
31 if ttags(p)['find']:
32 return False
34 g = self.game
35 sk = self.associated_card
36 assert isinstance(sk, Find)
37 cards = sk.associated_cards
38 if not 0 < len(cards) <= len([i for i in g.players if not i.dead]):
39 return False
41 return True
43 except AttributeError: # well, some cards are skill?
44 return False
47class Find(Skill):
48 associated_action = FindAction
49 skill_category = ['character', 'active']
50 target = t_Self()
51 usage = 'drop'
53 def check(self):
54 cl = self.associated_cards
55 return cl and all(
56 c.resides_in is not None and
57 c.resides_in.type in (
58 'cards', 'showncards', 'equips'
59 ) for c in self.associated_cards
60 )
63@register_character_to('common')
64class Koakuma(Character):
65 skills = [Find]
66 maxlife = 4