# Coverage for thb/meta/modes/thbrole.py : 71%

## 63 statements 45 run 18 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

3# -- stdlib --

4# -- third party --

5# -- own --

6 from thb import thbrole

7 from thb.actions import ttags

8 from thb.cards.classes import AttackCard

9 from thb.meta.common import ui_meta

10

11

12# -- code --

13@ui_meta(thbrole.THBattleRole)

14 class THBattleRole:

15 name = '8人身份场'

16 logo = 'thb-modelogo-8id'

17 description = (

18 '|R游戏人数|r：8人。\n'

19 '\n'

20 '|R身份分配|r：1|!RBOSS|r、2|!O道中|r、1|!G黑幕|r、4|!B城管|r。\n'

21 '\n'

22 '|!RBOSS|r：|!RBOSS|r的体力上限+1。游戏开局时展示身份，并获得BOSS技。胜利条件为击坠所有|!B城管|r以及|!G黑幕|r。\n'

23 '\n'

24 '|!O道中|r：胜利条件为击坠所有|!B城管|r以及|!G黑幕|r。当|!O道中|r被|!RBOSS|r击坠后，|!RBOSS|r需弃置所有手牌和装备牌。\n'

25 '\n'

26 '|!B城管|r：胜利条件为击坠|!RBOSS|r。当|!B城管|r被击坠后，击坠者摸3张牌。\n'

27 '\n'

28 '|!G黑幕|r：胜利条件为在|!B城管|r全部被击坠的状况下击坠|!RBOSS|r。\n'

29 '|B|R>> |r|R双黑幕模式|r下胜利条件条件是除了|!RBOSS|r的其他人全部被击坠的情况下击坠|!RBOSS|r。当|!RBOSS|r被击坠时，若场上只有一名未被击坠的角色且其身份为|!G黑幕|r，则该|!G黑幕|r胜利，另一|!G黑幕|r失败；反之，两位|!G黑幕|r失败，而|!B城管|r阵营胜利。\n'

30 '\n'

31 '玩家的身份会在被击坠后公开。|!RBOSS|r的身份会在开局的时候公开。\n'

32 '\n'

33 '|RBOSS技：|r'

34 '|!RBOSS|r身份的玩家在开场会获得BOSS技。'

35 '\n'

36 '某些角色在在设定上有专属的BOSS技，开局时会额外获得。\n'

37 '没有专属BOSS技的角色会在如下几个通用BOSS技中选择一个获得：\n'

38 '\n'

39 '|G同仇|r：当你需要使用或打出一张|G弹幕|r时，其他玩家可以代替你使用或打出一张|G弹幕|r。\n'

40 '\n'

41 '|G协力|r：当你需要使用或打出一张|G擦弹|r时，其他玩家可以代替你使用或打出一张|G擦弹|r。\n'

42 '\n'

43 '|G牺牲|r：当你于濒死状态下，被一名角色使用|G麻薯|r而回复体力至1后，其可以失去一点体力，令你额外回复一点体力。\n'

44 '\n'

45 '|G应援|r：|B锁定技|r，每有一名道中存活，你的手牌上限增加一。\n'

46 ).strip()

47

48 params_disp = {

49 'double_curtain': {

50 'desc': '双黑幕模式',

51 'options': [

52 ('双黑幕', True),

53 ('正常', False),

54 ],

55 },

56 }

57

58 roles_disp = {

59 thbrole.THBRoleRole.HIDDEN: '？',

60 thbrole.THBRoleRole.BOSS: 'BOSS',

61 thbrole.THBRoleRole.ACCOMPLICE: '道中',

62 thbrole.THBRoleRole.ATTACKER: '城管',

63 thbrole.THBRoleRole.CURTAIN: '黑幕',

64 }

65

66

67@ui_meta(thbrole.AssistedAttack)

68 class AssistedAttack:

69 # Skill

70 name = '同仇'

71 description = '当你需要使用或打出一张|G弹幕|r时，其他玩家可以代替你使用或打出一张|G弹幕|r。'

72

73 def clickable(self):

74 if not self.my_turn():

75 return False

76

77 if ttags(self.me)['assisted_attack_disable']:

78 return False

79

80 return True

81

82 def is_action_valid(self, sk, tl):

83 cl = sk.associated_cards

84 if len(cl):

85 return (False, '请不要选择牌！')

86

87 return AttackCard().ui_meta.is_action_valid(sk, tl)

88

89 def effect_string(self, act):

90 # for LaunchCard.ui_meta.effect_string

91 return (

92 '|G【%s】|r发动了|G同仇|r，目标是|G【%s】|r。'

93 ) % (

94 act.source.ui_meta.name,

95 act.target.ui_meta.name,

96 )

97

98

99@ui_meta(thbrole.AssistedUseAction)

100 class AssistedUseAction:

101 def choose_option_prompt(self, act):

102 return '你要帮BOSS出【%s】吗？' % (

103 act.their_afc_action.card_cls.ui_meta.name

104 )

105

106 choose_option_buttons = (('帮BOSS', True), ('不关我事', False))

107

108

109@ui_meta(thbrole.AssistedAttackAction)

110 class AssistedAttackAction:

111 def choose_card_text(self, act, cards):

112 if act.cond(cards):

113 return (True, '帮BOSS对%s出弹幕' % act.target.ui_meta.name)

114 else:

115 return (False, '同仇：请选择一张弹幕（对%s出）' % act.target.ui_meta.name)

116

117

118@ui_meta(thbrole.AssistedAttackHandler)

119 class AssistedAttackHandler:

120 choose_option_prompt = '你要发动【同仇】吗？'

121 choose_option_buttons = (('发动', True), ('不发动', False))

122

123

124@ui_meta(thbrole.AssistedGraze)

125 class AssistedGraze:

126 # Skill

127 name = '协力'

128 description = '当你需要使用或打出一张|G擦弹|r时，其他玩家可以代替你使用或打出一张|G擦弹|r。'

129

130

131@ui_meta(thbrole.AssistedGrazeHandler)

132 class AssistedGrazeHandler:

133 choose_option_prompt = '你要发动【协力】吗？'

134 choose_option_buttons = (('发动', True), ('不发动', False))

135

136

137@ui_meta(thbrole.AssistedHealAction)

138 class AssistedHealAction:

139 def effect_string_before(self, act):

140 return '|G【%s】|r发动了|G牺牲|r。' % (

141 act.source.ui_meta.name,

142 )

143

144

145@ui_meta(thbrole.AssistedHealHandler)

146 class AssistedHealHandler:

147 choose_option_prompt = '你要发动【牺牲】吗？'

148 choose_option_buttons = (('发动', True), ('不发动', False))

149

150

151@ui_meta(thbrole.AssistedHeal)

152 class AssistedHeal:

153 # Skill

154 name = '牺牲'

155 description = '当你于濒死状态下，被一名角色使用|G麻薯|r而回复体力至1后，其可以失去一点体力，令你额外回复一点体力。'

156

157

158@ui_meta(thbrole.ExtraCardSlot)

159 class ExtraCardSlot:

160 # Skill

161 name = '应援'

162 description = '锁定技，每有一名道中存活，你的手牌上限增加一。'

163

164

165@ui_meta(thbrole.ChooseBossSkillAction)

166 class ChooseBossSkillAction:

167 choose_option_prompt = '请选择BOSS技：'

168

169 def choose_option_buttons(self, act):

170 l = act.boss_skills

171 return [(i.ui_meta.name, i.__name__) for i in l]

172

173 def effect_string(self, act):

174 return '|G【%s】|r选择了|G%s|r作为BOSS技。' % (

175 act.target.ui_meta.name,

176 act.skill_chosen.ui_meta.name,

177 )