bcdice/BCDice

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

Summary

Maintainability
A
1 hr
Test Coverage
A
96%
# frozen_string_literal: true

module BCDice
  module GameSystem
    class RecordOfLodossWar < Base
      ID = 'RecordOfLodossWar'
      NAME = 'ロードス島戦記RPG'
      SORT_KEY = 'ろおとすとうせんきRPG'

      HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
        ●判定
         LW<=(目標値)で判定。
         達成値が目標値の1/10(端数切り上げ)以下であれば大成功。1~10であれば自動成功。
         91~100であれば自動失敗となります。

        ●回避判定
         LWD<=(目標値)で回避判定。この時出目が51以上で自動失敗となります。

         判定と回避判定は、どちらもコマンドだけの場合、出目の表示と自動成功と自動失敗の判定のみを行います。
      INFO_MESSAGE_TEXT

      register_prefix('LW')

      def eval_game_system_specific_command(command)
        parser = Command::Parser.new("LWD", "LW", round_type: round_type)
                                .restrict_cmp_op_to(nil, :<=)
        cmd = parser.parse(command)

        if cmd.nil? || ![nil, :<=].include?(cmd.cmp_op)
          return nil
        end

        auto_failure = cmd.command == "LWD" ? 51 : 91
        critical = (cmd.target_number.to_f / 10).ceil

        dice_value = @randomizer.roll_once(100)

        result =
          if dice_value >= auto_failure
            "自動失敗(#{auto_failure})"
          elsif dice_value <= critical
            "大成功(#{critical})"
          elsif dice_value <= 10
            "自動成功"
          elsif cmd.cmp_op
            dice_value <= cmd.target_number ? "成功" : "失敗"
          end

        sequence = [
          "(1D100#{cmd.cmp_op}#{cmd.target_number})",
          dice_value.to_s,
          result
        ].compact

        return sequence.join(" > ")
      end
    end
  end
end