bcdice/BCDice

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

Summary

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

require 'bcdice/game_system/GardenOrder'

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

      # ゲームシステム名
      NAME = 'スクリームハイスクール'

      # ゲームシステム名の読みがな
      SORT_KEY = 'すくりいむはいすくうる'

      # ダイスボットの使い方
      HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
        ・基本判定
         SHx/y@z x:成功率、y:連続攻撃回数(省略可)、z:クリティカル値(省略可)
         (連続攻撃では1回の判定のみが実施されます)
         例)SH55 SH(40-20) SH100/2 SH70@10 SH155/3@44
        ・感情判定
         EMx@z x:成功率、z:クリティカル値(省略可)
         例)EM50 EM50@15
        ・性格傾向判定
         TRx@z x:成功率、z:クリティカル値(省略可)
         例)TR60 TR60@15
        ・恐怖判定
         FEx@z x:成功率、z:クリティカル値(省略可)
         例)FE70 FE70@15
        ・負傷表
         DCxxy
         xx:属性(切断:SL,銃弾:BL,衝撃:IM,灼熱:BR,冷却:RF,電撃:EL)
         y:ダメージ
         例)DCSL7 DCEL22
      INFO_MESSAGE_TEXT

      register_prefix(
        '(SH|SHS)',
        '(EM|TR|FE)',
        'DC(SL|BL|IM|BR|RF|EL).+'
      )

      def eval_game_system_specific_command(command)
        case command
        when /(EM|TR|FE)(-?\d+)(@(\d+))?/i
          command_type = Regexp.last_match(1).upcase
          success_rate = Regexp.last_match(2).to_i
          critical_border_text = Regexp.last_match(4)
          critical_border = get_critical_border(critical_border_text, success_rate)

          return check_roll_sh(success_rate, critical_border, command_type)
        when %r{(SH|SHS)(-?\d+)(/(\d+))?(@(\d+))?}i
          success_rate = Regexp.last_match(2).to_i
          repeat_count = (Regexp.last_match(4) || 1).to_i
          critical_border_text = Regexp.last_match(6)
          critical_border = get_critical_border(critical_border_text, success_rate)

          return check_roll_repeat_attack(success_rate, repeat_count, critical_border)
        when /^DC(SL|BL|IM|BR|RF|EL)(\d+)/i
          type = Regexp.last_match(1)
          damage_value = Regexp.last_match(2).to_i
          return look_up_damage_chart(type, damage_value)
        end

        return nil
      end

      def check_roll_sh(success_rate, critical_border, command_type)
        success_rate = 0 if success_rate < 0
        fumble_border = (success_rate < 100 ? 96 : 99)

        dice_value = @randomizer.roll_once(100)
        result = get_check_result(dice_value, success_rate, critical_border, fumble_border)
        title, supplementary = get_supplementary(command_type, result.text)
        unless supplementary.empty?
          supplementary = "(#{supplementary})"
        end

        result.text = "#{title}判定 D100<=#{success_rate}@#{critical_border} > #{dice_value} > #{result.text}#{supplementary}"
        return result
      end

      def get_supplementary(command_type, result)
        title = ''
        supplementary = ''
        case command_type
        when 'EM'
          title = '感情'
          case result
          when 'クリティカル'
            supplementary = '次に行う判定の成功率に+50%'
          when  '成功'
            supplementary = '次に行う判定の成功率に+30%'
          when  '失敗'
            supplementary = '次に行う判定の成功率に-20%、呪縛+1点'
          when  'ファンブル'
            supplementary = '次に行う判定の成功率に-50%、呪縛+1D5点'
          end
        when 'TR'
          title = '性格傾向'
          case result
          when  '失敗'
            supplementary = '反対側の性格傾向で再判定する。あるいは、もしこれがその再判定の結果であればプレイヤーが性格傾向を選択する'
          when  'ファンブル'
            supplementary = '反対側の性格傾向に従い、呪縛+1D5点する。あるいは、もしこれが失敗後の再判定の結果だった場合、PCは混乱し行動を放棄するか逃げ出す。呪縛+2点'
          else
            supplementary = '判定した性格傾向に従う'
          end
        when 'FE'
          title = '恐怖'
          case result
          when  '成功'
            supplementary = 'ショックを受け流した。恐怖判定効果表の成功側の値分、呪縛が上昇する'
          when  '失敗'
            supplementary = 'ショックを受けた。恐怖判定効果表の失敗側の値分、呪縛が上昇する'
          when  'ファンブル'
            supplementary = '深いショックを受けた。恐怖判定効果表の失敗側の値分に加え、さらに1D5点分、呪縛が上昇する'
          else
            supplementary = '何もショックを受けなかった'
          end
        end
        return title, supplementary
      end
    end
  end
end