Coverage for thb/meta/characters/meirin.py : 97%
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 import actions, characters
7from thb.cards.classes import AttackCard, GrazeCard
8from thb.meta.common import ui_meta
11# -- code --
14@ui_meta(characters.meirin.RiverBehind)
15class RiverBehind:
16 # Skill
17 name = '背水'
18 description = (
19 '|B觉醒技|r,准备阶段开始时,若你体力值为全场最低或之一且不大于2时,你减1点体力上限并获得技能|R太极|r。\n'
20 '|B|R>> |b太极|r:你可将|G弹幕|r当|G擦弹|r,|G擦弹|r当|G弹幕|r使用或打出。'
21 )
24@ui_meta(characters.meirin.Taichi)
25class Taichi:
26 # Skill
27 name = '太极'
28 description = '你可将|G弹幕|r当|G擦弹|r,|G擦弹|r当|G弹幕|r使用或打出。'
30 def clickable(self):
31 g = self.game
32 try:
33 act = g.action_stack[-1]
34 if isinstance(act, actions.ActionStage):
35 return True
37 if act.cond([self.build_handcard(AttackCard)]):
38 return True
40 if act.cond([self.build_handcard(GrazeCard)]):
41 return True
43 except Exception:
44 pass
46 return False
48 def is_complete(self, skill):
49 cl = skill.associated_cards
50 from thb.cards.classes import AttackCard, GrazeCard
51 if len(cl) != 1 or not (cl[0].is_card(AttackCard) or cl[0].is_card(GrazeCard)):
52 return (False, '请选择一张【弹幕】或者【擦弹】!')
53 return (True, '动之则分,静之则合。无过不及,随曲就伸')
55 def is_action_valid(self, sk, tl):
56 rst, reason = self.is_complete(sk)
57 if not rst:
58 return (rst, reason)
59 else:
60 return sk.treat_as().ui_meta.is_action_valid(sk, tl)
62 def effect_string(self, act):
63 # for LaunchCard.ui_meta.effect_string
64 source = act.source
65 return (
66 '动之则分,静之则合。无过不及,随曲就伸……|G【%s】|r凭|G太极|r之势,轻松应对。'
67 ) % (
68 source.ui_meta.name,
69 )
71 def sound_effect(self, act):
72 return 'thb-cv-meirin_taichi'
75@ui_meta(characters.meirin.LoongPunch)
76class LoongPunch:
77 # Skill
78 name = '龙拳'
79 description = '每当你使用的|G弹幕|r被其他角色使用的|G擦弹|r抵消时,或其他角色使用的|G弹幕|r被你使用的|G擦弹|r抵消时,你可以弃置其1张手牌。'
82@ui_meta(characters.meirin.LoongPunchHandler)
83class LoongPunchHandler:
84 # choose_option
85 choose_option_buttons = (('发动', True), ('不发动', False))
86 choose_option_prompt = '你要发动【龙拳】吗?'
89@ui_meta(characters.meirin.LoongPunchAction)
90class LoongPunchAction:
91 def effect_string_before(self, act):
92 if act.type == 'attack':
93 return '|G【%s】|r闪过了|G弹幕|r,却没有闪过|G【%s】|r的拳劲,一张手牌被|G【%s】|r震飞!' % (
94 act.target.ui_meta.name,
95 act.source.ui_meta.name,
96 act.source.ui_meta.name,
97 )
98 if act.type == 'graze': 98 ↛ exitline 98 didn't return from function 'effect_string_before', because the condition on line 98 was never false
99 return '|G【%s】|r擦过弹幕,随即以拳劲沿着弹幕轨迹回震,|G【%s】|r措手不及,一张手牌掉在了地上。' % (
100 act.source.ui_meta.name,
101 act.target.ui_meta.name,
102 )
104 def sound_effect(self, act):
105 return 'thb-cv-meirin_loongpunch'
108@ui_meta(characters.meirin.RiverBehindAwake)
109class RiverBehindAwake:
110 def effect_string_before(self, act):
111 return '|G【%s】|r发现自己处境危险,于是强行催动内力护住身体,顺便参悟了太极拳。' % (
112 act.target.ui_meta.name,
113 )
115 def sound_effect(self, act):
116 return 'thb-cv-meirin_rb'
119@ui_meta(characters.meirin.Meirin)
120class Meirin:
121 # Character
122 name = '红美铃'
123 title = '我只打盹我不翘班'
124 illustrator = '霏茶'
125 cv = '小羽'
127 port_image = 'thb-portrait-meirin'
128 figure_image = 'thb-figure-meirin'
129 miss_sound_effect = ('thb-cv-meirin_miss1', 'thb-cv-meirin_miss2')