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)
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
 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())
示例#5
0
 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)
示例#6
0
    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)])
示例#7
0
 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)