Coverage for thb/meta/characters/nitori.py : 58%
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 --
5import random
7# -- third party --
8# -- own --
9from thb import actions, characters
10from thb.actions import PlayerTurn, ttags
11from thb.cards.classes import AttackCard, GrazeCard
12from thb.meta.common import ui_meta
15# -- code --
16@ui_meta(characters.nitori.Dismantle)
17class Dismantle:
18 # Skill
19 name = '拆解'
20 description = '出牌阶段限一次,你可以|B重铸|r一名其他角色装备区里的一张装备牌,然后该角色摸一张牌。'
22 def clickable(self):
23 if ttags(self.me)['dismantle']:
24 return False
26 return self.my_turn()
28 def is_action_valid(self, sk, tl):
29 if sk.associated_cards:
30 return (False, '请不要选择牌!')
32 if not len(tl):
33 return (False, '请选择一名玩家')
35 return (True, '拆解!')
37 def sound_effect(self, act):
38 return random.choice([
39 'thb-cv-nitori_dismantle',
40 'thb-cv-nitori_dismantle_other',
41 ])
44@ui_meta(characters.nitori.Craftsman)
45class Craftsman:
46 name = '匠心'
47 description = '你可以将你的全部手牌(至少1张)当做任意的一张基本牌使用或打出。出牌阶段内使用时,一回合限一次。'
49 params_ui = 'UICraftsmanCardSelection'
51 def clickable(self, g):
52 try:
53 me = g.me
54 if not me.cards and not me.showncards:
55 return False
57 current = PlayerTurn.get_current(g).target
58 if ttags(me)['craftsman'] and current is me:
59 return False
61 return True
63 except (IndexError, AttributeError):
64 return False
66 def is_complete(self, skill):
67 me = self.me
68 assert skill.is_card(characters.nitori.Craftsman)
69 if set(skill.associated_cards) != set(me.cards) | set(me.showncards):
70 return (False, '请选择所有的手牌(包括明牌)!')
72 return (True, '我TMD有老婆了!')
74 def is_action_valid(self, sk, tl):
75 assert sk.is_card(characters.nitori.Craftsman)
76 rst, reason = self.is_complete(sk)
77 if not rst:
78 return (rst, reason)
79 else:
80 return sk.treat_as.ui_meta.is_action_valid([sk], tl)
82 def effect_string(self, act):
83 # for LaunchCard.effect_string
84 source = act.source
85 s = '|G【%s】|r发动了|G匠心|r。' % (
86 source.ui_meta.name,
87 )
88 return s
90 def sound_effect(self, act):
91 if isinstance(act, actions.LaunchCard):
92 if act.card.is_card(AttackCard):
93 l = ['1', '2']
94 else:
95 l = ['_graze']
97 elif isinstance(act, actions.AskForCard):
98 atk = act.cond([self.build_handcard(AttackCard, act.target)])
99 graze = act.cond([self.build_handcard(GrazeCard, act.target)])
100 if atk and not graze:
101 l = ['1', '2']
102 else:
103 l = ['_graze']
104 else:
105 l = []
107 return l and 'thb-cv-nitori_craftsman%s' % random.choice(l)
110@ui_meta(characters.nitori.Nitori)
111class Nitori:
112 # Character
113 name = '河城荷取'
114 title = '水中的工程师'
115 illustrator = '和茶'
116 cv = '简翎'
118 port_image = 'thb-portrait-nitori'
119 figure_image = 'thb-figure-nitori'
120 miss_sound_effect = ''
122 notes = '|RKOF不平衡角色|r'