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

2from __future__ import annotations 

3 

4# -- stdlib -- 

5import random 

6 

7# -- third party -- 

8# -- own -- 

9from thb import actions, characters 

10from thb.actions import PlayerTurn, ttags 

11from thb.cards.classes import AttackCard, GrazeCard 

12from thb.meta.common import ui_meta 

13 

14 

15# -- code -- 

16@ui_meta(characters.nitori.Dismantle) 

17class Dismantle: 

18 # Skill 

19 name = '拆解' 

20 description = '出牌阶段限一次,你可以|B重铸|r一名其他角色装备区里的一张装备牌,然后该角色摸一张牌。' 

21 

22 def clickable(self): 

23 if ttags(self.me)['dismantle']: 

24 return False 

25 

26 return self.my_turn() 

27 

28 def is_action_valid(self, sk, tl): 

29 if sk.associated_cards: 

30 return (False, '请不要选择牌!') 

31 

32 if not len(tl): 

33 return (False, '请选择一名玩家') 

34 

35 return (True, '拆解!') 

36 

37 def sound_effect(self, act): 

38 return random.choice([ 

39 'thb-cv-nitori_dismantle', 

40 'thb-cv-nitori_dismantle_other', 

41 ]) 

42 

43 

44@ui_meta(characters.nitori.Craftsman) 

45class Craftsman: 

46 name = '匠心' 

47 description = '你可以将你的全部手牌(至少1张)当做任意的一张基本牌使用或打出。出牌阶段内使用时,一回合限一次。' 

48 

49 params_ui = 'UICraftsmanCardSelection' 

50 

51 def clickable(self, g): 

52 try: 

53 me = g.me 

54 if not me.cards and not me.showncards: 

55 return False 

56 

57 current = PlayerTurn.get_current(g).target 

58 if ttags(me)['craftsman'] and current is me: 

59 return False 

60 

61 return True 

62 

63 except (IndexError, AttributeError): 

64 return False 

65 

66 def is_complete(self, skill): 

67 me = self.me 

68 assert skill.is_card(characters.nitori.Craftsman) 

69 if set(skill.associated_cards) != set(me.cards) | set(me.showncards): 

70 return (False, '请选择所有的手牌(包括明牌)!') 

71 

72 return (True, '我TMD有老婆了!') 

73 

74 def is_action_valid(self, sk, tl): 

75 assert sk.is_card(characters.nitori.Craftsman) 

76 rst, reason = self.is_complete(sk) 

77 if not rst: 

78 return (rst, reason) 

79 else: 

80 return sk.treat_as.ui_meta.is_action_valid([sk], tl) 

81 

82 def effect_string(self, act): 

83 # for LaunchCard.effect_string 

84 source = act.source 

85 s = '|G【%s】|r发动了|G匠心|r。' % ( 

86 source.ui_meta.name, 

87 ) 

88 return s 

89 

90 def sound_effect(self, act): 

91 if isinstance(act, actions.LaunchCard): 

92 if act.card.is_card(AttackCard): 

93 l = ['1', '2'] 

94 else: 

95 l = ['_graze'] 

96 

97 elif isinstance(act, actions.AskForCard): 

98 atk = act.cond([self.build_handcard(AttackCard, act.target)]) 

99 graze = act.cond([self.build_handcard(GrazeCard, act.target)]) 

100 if atk and not graze: 

101 l = ['1', '2'] 

102 else: 

103 l = ['_graze'] 

104 else: 

105 l = [] 

106 

107 return l and 'thb-cv-nitori_craftsman%s' % random.choice(l) 

108 

109 

110@ui_meta(characters.nitori.Nitori) 

111class Nitori: 

112 # Character 

113 name = '河城荷取' 

114 title = '水中的工程师' 

115 illustrator = '和茶' 

116 cv = '简翎' 

117 

118 port_image = 'thb-portrait-nitori' 

119 figure_image = 'thb-figure-nitori' 

120 miss_sound_effect = '' 

121 

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