Hide keyboard shortcuts

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

6from thb import thbrole 

7from thb.actions import ttags 

8from thb.cards.classes import AttackCard 

9from thb.meta.common import ui_meta 

10 

11 

12# -- code -- 

13@ui_meta(thbrole.THBattleRole) 

14class 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。\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) 

68class 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) 

100class 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) 

110class AssistedAttackAction: 

111 def choose_card_text(self, g, 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.AssistedAttackCard) 

119class AssistedAttackCard: 

120 def effect_string(self, act): 

121 s = act.card 

122 c = s.associated_cards[0] 

123 return '|G【%s】|r响应了|G同仇|r,使用了|G%s|r。' % ( 

124 c.resides_in.owner.ui_meta.name, 

125 self.card_desc(c), 

126 ) 

127 

128 

129@ui_meta(thbrole.AssistedAttackHandler) 

130class AssistedAttackHandler: 

131 choose_option_prompt = '你要发动【同仇】吗?' 

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

133 

134 

135@ui_meta(thbrole.AssistedGraze) 

136class AssistedGraze: 

137 # Skill 

138 name = '协力' 

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

140 

141 

142@ui_meta(thbrole.AssistedGrazeHandler) 

143class AssistedGrazeHandler: 

144 choose_option_prompt = '你要发动【协力】吗?' 

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

146 

147 

148@ui_meta(thbrole.AssistedHealAction) 

149class AssistedHealAction: 

150 def effect_string_before(act): 

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

152 act.source.ui_meta.name, 

153 ) 

154 

155 

156@ui_meta(thbrole.AssistedHealHandler) 

157class AssistedHealHandler: 

158 choose_option_prompt = '你要发动【牺牲】吗?' 

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

160 

161 

162@ui_meta(thbrole.AssistedHeal) 

163class AssistedHeal: 

164 # Skill 

165 name = '牺牲' 

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

167 

168 

169@ui_meta(thbrole.ExtraCardSlot) 

170class ExtraCardSlot: 

171 # Skill 

172 name = '应援' 

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

174 

175 

176@ui_meta(thbrole.ChooseBossSkillAction) 

177class ChooseBossSkillAction: 

178 choose_option_prompt = '请选择BOSS技:' 

179 

180 def choose_option_buttons(self, act): 

181 l = act.boss_skills 

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

183 

184 def effect_string(act): 

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

186 act.target.ui_meta.name, 

187 act.skill_chosen.ui_meta.name, 

188 )