bcdice/BCDice

View on GitHub
lib/bcdice/game_system/TokumeiTenkousei.rb

Summary

Maintainability
A
2 hrs
Test Coverage
A
100%
# frozen_string_literal: true

module BCDice
  module GameSystem
    class TokumeiTenkousei < Base
      # ゲームシステムの識別子
      ID = 'TokumeiTenkousei'

      # ゲームシステム名
      NAME = '特命転攻生'

      # ゲームシステム名の読みがな
      SORT_KEY = 'とくめいてんこうせい'

      # ダイスボットの使い方
      HELP_MESSAGE = <<~HELP
        ・判定 (xD6+y>=n)
         ゾロ目での自動振り足し
         1の出目に応じてEPPの獲得量を表示
         目標値 "?" には未対応
      HELP

      def initialize(command)
        super(command)

        @sort_add_dice = true
      end

      register_prefix('\d+D6')

      def eval_game_system_specific_command(command)
        parser = Command::Parser.new(/\d+D6/, round_type: round_type)
        cmd = parser.parse(command)
        unless cmd
          return nil
        end

        times = cmd.command.to_i

        dice_list = @randomizer.roll_barabara(times, 6).sort
        @dice_list = [dice_list]
        while same_all_dice?(dice_list)
          dice_list = @randomizer.roll_barabara(times, 6).sort
          @dice_list.push(dice_list)
        end

        dice_list_flatten = @dice_list.flatten
        dice_total = dice_list_flatten.sum()
        count_one = dice_list_flatten.count(1)

        total = dice_total + cmd.modify_number

        result =
          if cmd.cmp_op
            total.send(cmd.cmp_op, cmd.target_number) ? Result.success("成功") : Result.failure("失敗")
          end

        sequence = [
          "(#{cmd})",
          interim_expr(cmd, dice_total),
          total.to_s,
          result.text,
          epp(count_one)
        ].compact

        result.text = sequence.join(" > ")
        return result
      end

      # 出目が全て同じか
      def same_all_dice?(dice_list)
        dice_list.size > 1 && dice_list.uniq.size == 1
      end

      def interim_expr(cmd, dice_total)
        if @dice_list.flatten.size == 1 && cmd.modify_number == 0
          return nil
        end

        dice_list = @dice_list.map { |ds| "[#{ds.join(',')}]" }.join("")
        modifier = Format.modifier(cmd.modify_number)

        return [dice_total.to_s, dice_list, modifier].join("")
      end

      # エキストラパワーポイント獲得
      #
      # @param count_one [Integer]
      # @return [String, nil]
      def epp(count_one)
        if count_one > 0
          "#{count_one * 5}EPP獲得"
        end
      end
    end
  end
end