Coverage for thb/meta/modes/thbrole.py : 71%
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 thbrole
7from thb.actions import ttags
8from thb.cards.classes import AttackCard
9from thb.meta.common import ui_meta
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。当|!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()
48 params_disp = {
49 'double_curtain': {
50 'desc': '双黑幕模式',
51 'options': [
52 ('双黑幕', True),
53 ('正常', False),
54 ],
55 },
56 }
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 }
67@ui_meta(thbrole.AssistedAttack)
68class AssistedAttack:
69 # Skill
70 name = '同仇'
71 description = '当你需要使用或打出一张|G弹幕|r时,其他玩家可以代替你使用或打出一张|G弹幕|r。'
73 def clickable(self):
74 if not self.my_turn():
75 return False
77 if ttags(self.me)['assisted_attack_disable']:
78 return False
80 return True
82 def is_action_valid(self, sk, tl):
83 cl = sk.associated_cards
84 if len(cl):
85 return (False, '请不要选择牌!')
87 return AttackCard().ui_meta.is_action_valid(sk, tl)
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 )
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 )
106 choose_option_buttons = (('帮BOSS', True), ('不关我事', False))
109@ui_meta(thbrole.AssistedAttackAction)
110class 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)
118@ui_meta(thbrole.AssistedAttackHandler)
119class AssistedAttackHandler:
120 choose_option_prompt = '你要发动【同仇】吗?'
121 choose_option_buttons = (('发动', True), ('不发动', False))
124@ui_meta(thbrole.AssistedGraze)
125class AssistedGraze:
126 # Skill
127 name = '协力'
128 description = '当你需要使用或打出一张|G擦弹|r时,其他玩家可以代替你使用或打出一张|G擦弹|r。'
131@ui_meta(thbrole.AssistedGrazeHandler)
132class AssistedGrazeHandler:
133 choose_option_prompt = '你要发动【协力】吗?'
134 choose_option_buttons = (('发动', True), ('不发动', False))
137@ui_meta(thbrole.AssistedHealAction)
138class AssistedHealAction:
139 def effect_string_before(self, act):
140 return '|G【%s】|r发动了|G牺牲|r。' % (
141 act.source.ui_meta.name,
142 )
145@ui_meta(thbrole.AssistedHealHandler)
146class AssistedHealHandler:
147 choose_option_prompt = '你要发动【牺牲】吗?'
148 choose_option_buttons = (('发动', True), ('不发动', False))
151@ui_meta(thbrole.AssistedHeal)
152class AssistedHeal:
153 # Skill
154 name = '牺牲'
155 description = '当你于濒死状态下,被一名角色使用|G麻薯|r而回复体力至1后,其可以失去一点体力,令你额外回复一点体力。'
158@ui_meta(thbrole.ExtraCardSlot)
159class ExtraCardSlot:
160 # Skill
161 name = '应援'
162 description = '锁定技,每有一名道中存活,你的手牌上限增加一。'
165@ui_meta(thbrole.ChooseBossSkillAction)
166class ChooseBossSkillAction:
167 choose_option_prompt = '请选择BOSS技:'
169 def choose_option_buttons(self, act):
170 l = act.boss_skills
171 return [(i.ui_meta.name, i.__name__) for i in l]
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 )