def step_forward(board: Board, player_type: PlayerType): if board.distance.removable() == 0 or \ board.players[player_type].aura.receivable() == 0: raise BasicActionException('前進できません!') if board.distance() <= board.expert_distance: raise DistanceException('前進できません!') Area.move_flowers(board.distance, board.players[player_type].aura, 1)
def execute(self, board, player_type): board.attacks.append(copy(self)) print(self) if not self.uncounterable: # 対応 board.players[player_type.opponent()].counter(board) # TODO: 対応後の諸々の判定(間合や決死などの条件の再確認) # TODO: 不可避の処理 attack = board.attacks.pop() if attack.canceled: # 攻撃が打ち消された(【攻撃後】効果も無し) return if attack.aura_damage is None or \ board.opponent_player().aura() < attack.aura_damage: # オーラダメージが - か、オーラが足りなければ強制的にライフで受ける select_aura = False elif attack.life_damage is None: select_aura = True else: # ダメージの受け方を尋ねる while True: print('ダメージ {}/{} をどちらで受けますか?'.format(attack.aura_damage, attack.life_damage)) damage_select = yield '[{}]: オーラ, [{}]: ライフ'\ .format(SELECT_AURA, SELECT_LIFE) if damage_select == SELECT_AURA: select_aura = True break elif damage_select == SELECT_LIFE: select_aura = False break else: print('入力が不正です!') if select_aura: # オーラダメージを選択 # TODO: 「無音壁」展開中かどうか確認し、 # 展開中ならダメージの受け方を尋ねる damage = min(board.players[player_type.opponent()].aura(), attack.aura_damage) Area.move_flowers(board.players[player_type.opponent()].aura, board.dust, damage) else: # ライフダメージを選択 damage = min(board.opponent_player().life(), attack.life_damage) Area.move_flowers(board.opponent_player().life, board.opponent_player().flare, damage)
def reconstruction(self, no_damage=False): """ 山札の再構成を行う Args: no_damage (bool, optional): ダメージを受けない場合に ``True``. デフォルトは ``False`` """ # TODO: 設置・虚魚の処理 self.stock.push_bottom(self.downed.stack) self.downed.clear() self.stock.push_bottom(self.discarded.stack) self.discarded.clear() self.stock.shuffle() if not no_damage: Area.move_flowers(self.life, self.flare, 1)
def draw_single(self, board): """ 山札からカードを1枚ドローする 山札が無ければ焦燥ダメージを受ける """ if len(self.stock) == 0: # 焦燥ダメージ if self.aura == 0: print('焦燥ダメージをライフで受けます') select_aura = False else: # ダメージの受け方を尋ねる receive = yield '焦燥ダメージをどちらで受けますか?\n'\ '[0]: オーラ, [1]: ライフ' select_aura = True if receive == '0' else False if select_aura: Area.move_flowers(self.aura, board.dust, 1) else: Area.move_flowers(self.life, self.flare, 1) else: self.hand.push_bottom(self.stock.pop())
def hohou2(board, _): receive = yield '[0]: 間合→ダスト, [1]: ダスト→間合' if receive == '0': Area.move_flowers(board.distance, board.dust, 1) else: Area.move_flowers(board.dust, board.distance, 1)
def __init__(self): """ 全カードを生成しリストに登録 """ self.card_list = dict() # ウツロのかけら self.card_list[Goddess.UTSURO_HAJIMARI] = [[[], []]] self.card_list[Goddess.UTSURO_HAJIMARI][0][0].append( [AttackCard(Goddess.UTSURO_HAJIMARI, '投射', Attack([5, 6, 7, 8, 9], 3, 1), image_filename='na_00_hajimari_a_n_1.png')]) self.card_list[Goddess.UTSURO_HAJIMARI][0][0].append( [AttackCard(Goddess.UTSURO_HAJIMARI, '脇斬り', Attack([2, 3], 2, 2), image_filename='na_00_hajimari_a_n_2.png')]) self.card_list[Goddess.UTSURO_HAJIMARI][0][0].append( [AttackCard(Goddess.UTSURO_HAJIMARI, '牽制', Attack([1, 2, 3], 2, 1), image_filename='na_00_hajimari_a_n_3.png')]) self.card_list[Goddess.UTSURO_HAJIMARI][0][0].append( [AttackCard(Goddess.UTSURO_HAJIMARI, '背中刺し', Attack([1], 3, 2), image_filename='na_00_hajimari_a_n_4.png')]) self.card_list[Goddess.UTSURO_HAJIMARI][0][0].append( [AttackCard(Goddess.UTSURO_HAJIMARI, '二刀一閃', Attack([2, 3], 4, 2), image_filename='na_00_hajimari_a_n_5.png', sub_type=CardSubType.FULL_POWER)]) def hohou1(board, player_type): board.players[player_type].vigor += 1 @generator def hohou2(board, _): receive = yield '[0]: 間合→ダスト, [1]: ダスト→間合' if receive == '0': Area.move_flowers(board.distance, board.dust, 1) else: Area.move_flowers(board.dust, board.distance, 1) self.card_list[Goddess.UTSURO_HAJIMARI][0][0].append( [ActionCard(Goddess.UTSURO_HAJIMARI, '歩法', effects=[ Effect(effect_type=EffectType.ACTION, content=hohou1, summary='集中力を1得る'), Effect(effect_type=EffectType.ACTION, content=hohou2, summary='間合←→ダスト(1)', ) ], image_filename='na_00_hajimari_a_n_6.png')]) self.card_list[Goddess.UTSURO_HAJIMARI][0][0].append( [ActionCard(Goddess.UTSURO_HAJIMARI, '潜り', effects=[ Effect(effect_type=EffectType.ACTION, content=lambda b, p: Area.move_flowers(b.distance, b.dust, 1), summary='間合→ダスト(1)') ], sub_type=CardSubType.COUNTER, image_filename='na_00_hajimari_a_n_7.png')] ) self.card_list[Goddess.UTSURO_HAJIMARI][0][1].append( [AttackCard(Goddess.UTSURO_HAJIMARI, '数多ノ刃', Attack([1, 2], 4, 3), trump=True, cost=5, image_filename='na_00_hajimari_a_s_1.png')]) self.card_list[Goddess.UTSURO_HAJIMARI][0][1].append( [ActionCard(Goddess.UTSURO_HAJIMARI, '闇凪ノ声', effects=[ Effect(effect_type=EffectType.ACTION, content=lambda b, p: b.players[p].draw(2, b), summary='カードを2枚引く') ], trump=True, cost=4, image_filename='na_00_hajimari_a_s_2.png')]) def ku_no_gaitou(board, _): attack = board.attacks.pop() attack.aura_damage = max(0, attack.aura_damage - 2) board.attacks.append(attack) self.card_list[Goddess.UTSURO_HAJIMARI][0][1].append( [ActionCard(Goddess.UTSURO_HAJIMARI, '苦ノ外套', effects=[ Effect(effect_type=EffectType.ACTION, content=ku_no_gaitou, summary='対応した攻撃は -2/+0 となる'), Effect(effect_type=EffectType.ACTION, content=lambda b, p: Area.move_flowers( b.players[p.opponent()].aura, b.dust, 2), summary='相オーラ→ダスト(2)') ], sub_type=CardSubType.COUNTER, trump=True, cost=3, image_filename='na_00_hajimari_a_s_3.png')]) # ホノカのかけら self.card_list[Goddess.HONOKA_HAJIMARI] = [[[], []]] self.card_list[Goddess.HONOKA_HAJIMARI][0][0].append( [AttackCard(Goddess.HONOKA_HAJIMARI, '花弁刃', Attack([4, 5], None, 1), image_filename='na_00_hajimari_b_n_1.png')]) self.card_list[Goddess.HONOKA_HAJIMARI][0][0].append( [AttackCard(Goddess.HONOKA_HAJIMARI, '桜刀', Attack([3, 4], 3, 1), image_filename='na_00_hajimari_b_n_2.png')]) self.card_list[Goddess.HONOKA_HAJIMARI][0][0].append( [AttackCard(Goddess.HONOKA_HAJIMARI, '瞬霊式', Attack([5], 3, 2, uncounterable=True), image_filename='na_00_hajimari_b_n_3.png')]) def kaeshigiri(board, player_type, counter): if counter: Area.move_flowers(board.dust, board.players[player_type].aura, 1) self.card_list[Goddess.HONOKA_HAJIMARI][0][0].append( [AttackCard(Goddess.HONOKA_HAJIMARI, '返し斬り', Attack([3, 4], 2, 1), effects=[ Effect(effect_type=EffectType.AFTER_ATTACK, content=kaeshigiri, summary='【攻撃後】このカードを対応で' '使用したならば、ダスト→自オーラ(1)') ], image_filename='na_00_hajimari_b_n_4.png', sub_type=CardSubType.COUNTER)]) self.card_list[Goddess.HONOKA_HAJIMARI][0][0].append( [ActionCard(Goddess.HONOKA_HAJIMARI, '歩法', effects=[ Effect(effect_type=EffectType.ACTION, content=hohou1, summary='集中力を1得る'), Effect(effect_type=EffectType.ACTION, content=hohou2, summary='間合←→ダスト(1)', ) ], image_filename='na_00_hajimari_b_n_5.png')]) self.card_list[Goddess.HONOKA_HAJIMARI][0][0].append( [ActionCard(Goddess.HONOKA_HAJIMARI, '瞬霊式', effects=[ Effect(effect_type=EffectType.ACTION, content=lambda b, p: Area.move_flowers(b.players[p.opponent()].aura, b.players[p].aura, 1), summary='相オーラ→自オーラ(1)') ], sub_type=CardSubType.COUNTER, image_filename='na_00_hajimari_b_n_6.png')]) self.card_list[Goddess.HONOKA_HAJIMARI][0][0].append( [ActionCard(Goddess.HONOKA_HAJIMARI, '光輝収束', effects=[ Effect(effect_type=EffectType.ACTION, content=lambda b, p: Area.move_flowers(b.dust, b.players[p].aura, 2), summary='ダスト→自オーラ(2)'), Effect(effect_type=EffectType.ACTION, content=lambda b, p: Area.move_flowers(b.dust, b.players[p].flare, 1), summary='ダスト→自フレア(1)') ], sub_type=CardSubType.FULL_POWER, image_filename='na_00_hajimari_b_n_7.png')]) self.card_list[Goddess.HONOKA_HAJIMARI][0][1].append( [AttackCard(Goddess.HONOKA_HAJIMARI, '光満ちる一刀', Attack([3, 4], 4, 3), trump=True, cost=5, image_filename='na_00_hajimari_b_s_1.png')]) self.card_list[Goddess.HONOKA_HAJIMARI][0][1].append( [ActionCard(Goddess.HONOKA_HAJIMARI, '花吹雪の景色', effects=[ Effect(effect_type=EffectType.ACTION, content=lambda b, p: Area.move_flowers( b[p.opponent()].aura, b.distance, 2), summary='相オーラ→間合(2)') ], trump=True, cost=4, image_filename='na_00_hajimari_b_s_2.png')]) def seirei_tachi_no_kaze(board, _): attack = board.attacks.pop() if not attack.is_trump: attack.canceled = True board.attacks.append(attack) self.card_list[Goddess.HONOKA_HAJIMARI][0][1].append( [ActionCard(Goddess.HONOKA_HAJIMARI, '精霊たちの風', effects=[ Effect(effect_type=EffectType.ACTION, content=seirei_tachi_no_kaze, summary='対応した切札でない攻撃を打ち消す'), Effect(effect_type=EffectType.ACTION, content=lambda b, p: b.players[p].draw(1, b), summary='カードを1枚引く') ], sub_type=CardSubType.COUNTER, trump=True, cost=3, image_filename='na_00_hajimari_b_s_3.png')]) # ユリナ self.card_list[Goddess.YURINA] = [[[], []], [[], []]] # 斬 self.card_list[Goddess.YURINA][0][0].append( [AttackCard(1, '斬', Attack([3, 4], 3, 1), image_filename='na_01_yurina_o_n_1.png')]) # 足捌き self.card_list[Goddess.YURINA][0][0].append([ ActionCard(1, '足捌き', effects=[ Effect(effect_type=EffectType.ACTION, condition=lambda b, p: b.distance() >= 4, content=lambda b, p: b.move_flower(b.distance, b.dust, 2), summary='間合いが4以上なら 間合→ダスト(2)'), Effect(effect_type=EffectType.ACTION, condition=lambda b, p: b.distance() <= 1, content=lambda b, p: Area.move_flowers(b.dust, b.distance, 2), summary='間合いが1以下なら ダスト→間合(2)'), ], image_filename='na_01_yurina_o_n_5_s2.png')]) # 月影落 self.card_list[Goddess.YURINA][0][1].append( [AttackCard(1, '月影落', Attack([3, 4], 4, 4), trump=True, cost=7)])
def kaeshigiri(board, player_type, counter): if counter: Area.move_flowers(board.dust, board.players[player_type].aura, 1)
def withdraw(board: Board): if board.dust.removable() == 0 or board.distance.receivable() == 0: raise FlowerLackException('離脱できません!') if board.distance() > board.expert_distance: raise DistanceException('離脱できません!') Area.move_flowers(board.dust, board.distance, 1)
def charge(board: Board, player_type: PlayerType): if board.players[player_type].aura.removable() == 0: raise BasicActionException('宿せません!') Area.move_flowers(board.players[player_type].aura, board.players[player_type].flare, 1)
def protect(board: Board, player_type: PlayerType): if board.dust.removable() == 0 or \ board.players[player_type].aura.receivable() == 0: raise BasicActionException('纏えません!') Area.move_flowers(board.dust, board.players[player_type].aura, 1)
def step_backward(board: Board, player_type: PlayerType): if board.players[player_type].aura.removable() == 0 or \ board.distance.receivable() == 0: raise BasicActionException('後退できません!') Area.move_flowers(board.players[player_type].aura, board.distance, 1)