# Coverage for thb/meta/characters/keine.py : 60%

## 79 statements 47 run 32 missing 0 excluded 0 partial

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 -*-

2 from __future__ import annotations

3

4# -- stdlib --

5 import random

6

7# -- third party --

8# -- own --

9 from thb import characters

10 from thb.actions import ttags

11 from thb.meta.common import ui_meta

12

13

14# -- code --

15@ui_meta(characters.keine.Teach)

16 class Teach:

17 # Skill

18 name = '授业'

19 description = (

20 '出牌阶段限一次，你可以重铸一张牌，然后将一张牌交给一名其它角色，其选择一项：'

21 '|B|R>> |r使用一张牌，|B|R>> |r重铸一张牌。'

22 )

23

24 def clickable(self):

25 return self.my_turn() and not ttags(self.me)['teach_used']

26

27 def is_action_valid(self, sk, tl):

28 cards = sk.associated_cards

29

30 if not cards or len(cards) != 1:

31 return False, '请选择一张牌（重铸）'

32

33 if not tl or len(tl) != 1:

34 return False, '请选择一个目标'

35

36 return True, '发动「授业」'

37

38 def effect_string(self, act):

39 return '“是这样的|G【%s】|r”，|G【%s】|r说道，“两个1相加是不等于⑨的。即使是两个⑥也不行。不不，天才来算也不行。”' % (

40 act.target.ui_meta.name,

41 act.source.ui_meta.name,

42 )

43

44 def sound_effect(self, act):

45 return random.choice([

46 'thb-cv-keine_teach1',

47 'thb-cv-keine_teach2',

48 ])

49

50

51@ui_meta(characters.keine.TeachAction)

52 class TeachAction:

53 # choose_card

54 def choose_card_text(self, act, cards):

55 if act.cond(cards):

56 return (True, '给出这张牌')

57 else:

58 return (False, '请选择你要给出的牌')

59

60 def target(self, pl):

61 if not pl:

62 return (False, '请选择1名玩家')

63

64 return (True, '传道授业！')

65

66

67@ui_meta(characters.keine.TeachTargetEffect)

68 class TeachTargetEffect:

69 # choose_option

70 choose_option_buttons = (('重铸一张牌', 'reforge'), ('使用卡牌', 'action'))

71 choose_option_prompt = '授业：请选择你的行动'

72

73

74@ui_meta(characters.keine.TeachTargetReforgeAction)

75 class TeachTargetReforgeAction:

76 # choose_card

77 def choose_card_text(self, act, cards):

78 if act.cond(cards):

79 return (True, '重铸这张牌')

80 else:

81 return (False, '请选择一张牌重铸')

82

83 def target(self, pl):

84 if not pl:

85 return (False, '请选择1名玩家')

86

87 return (True, '传道授业！')

88

89

90@ui_meta(characters.keine.KeineGuard)

91 class KeineGuard:

92 # Skill

93 name = '守护'

94 description = (

95 '|B限定技|r，出牌阶段开始时，你可以失去一点体力上限，令一名其它已受伤角色回复一点体力。之后，若其体力仍然是全场最低的，则你与其获得技能|R决意|r。\n'

96 '|B|R>> |b决意|r：当你受到伤害时，若同样拥有|R决意|r的另一名角色的体力值比你高，则伤害改为由该角色承受。同样拥有|R决意|r的另一名角色于你的回合内摸牌/回复体力时，你摸相同数量的牌/回复相同的体力。'

97 )

98

99

100@ui_meta(characters.keine.KeineGuardAction)

101 class KeineGuardAction:

102 def effect_string_before(self, act):

103 return '“我绝对不会让你们碰到|G【%s】|r 一根手指的！”|G【%s】|r冲着所有人喊道。' % (

104 act.target.ui_meta.name,

105 act.source.ui_meta.name,

106 )

107

108 def sound_effect_before(self, act):

109 return random.choice([

110 'thb-cv-keine_guard_awake',

111 ])

112

113

114@ui_meta(characters.keine.KeineGuardHandler)

115 class KeineGuardHandler:

116

117 def target(self, pl):

118 if not pl:

119 return (False, u'守护：请选择1名其他角色（或不发动）')

120

121 p = pl[0]

122 if p.life >= p.maxlife:

123 return False, u'目标角色没有受伤'

124

125 return True, u'我的CP由我来守护！'

126

127

128@ui_meta(characters.keine.Devoted)

129 class Devoted:

130 # Skill

131 name = u'决意'

132 description = (

133 '当你受到伤害时，若同样拥有|R决意|r的另一名角色的体力值比你高，则伤害改为由该角色承受。同样拥有|R决意|r的另一名角色于你的回合内摸牌/回复体力时，你摸相同数量的牌/回复相同的体力。'

134 )

135

136

137@ui_meta(characters.keine.DevotedHeal)

138 class DevotedHeal:

139 def effect_string(self, act):

140 return '|G【%s】|r分享了回复效果（|G决意|r），|G【%s】|r回复了%s点体力。' % (

141 act.source.ui_meta.name,

142 act.target.ui_meta.name,

143 act.amount,

144 )

145

146

147@ui_meta(characters.keine.DevotedDrawCards)

148 class DevotedDrawCards:

149 def effect_string(self, act):

150 return '|G【%s】|r分享了摸牌效果（|G决意|r），|G【%s】|r摸了%s张牌。' % (

151 act.source.ui_meta.name,

152 act.target.ui_meta.name,

153 act.amount,

154 )

155

156

157@ui_meta(characters.keine.DevotedAction)

158 class DevotedAction:

159 def effect_string(self, act):

160 return '|G【%s】|r的伤害由|G【%s】|r承受了（|G决意|r）。' % (

161 act.source.ui_meta.name,

162 act.target.ui_meta.name,

163 )

164

165

166@ui_meta(characters.keine.Keine)

167 class Keine:

168 # Character

169 name = '上白泽慧音'

170 title = '人间之里的守护者'

171 illustrator = '和茶'

172 cv = '银子'

173

174 port_image = 'thb-portrait-keine'

175 figure_image = 'thb-figure-keine'

176 miss_sound_effect = 'thb-cv-keine_miss'

177

178 notes = '|RKOF不平衡角色|r'