bcdice/BCDice

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

Summary

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

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

      # ゲームシステム名
      NAME = 'インセイン'

      # ゲームシステム名の読みがな
      SORT_KEY = 'いんせいん'

      # ダイスボットの使い方
      HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
        ・判定(スペシャル/ファンブル/成功/失敗を判定)
        ・各種表
        シーン表 ST
         本当は怖い現代日本シーン表 HJST/狂騒の二〇年代シーン表 MTST
         暗黒のヴィクトリアシーン表 DVST
        形容表 DT/本体表 BT/部位表 PT
        感情表      FT
        職業表      JT
        バッドエンド表  BET
        ランダム分野表  RCT
        ランダム特技表  RTTn(n:分野番号、省略可能)
          1暴力(TVT)、2情動(TET)、3知覚(TPT)
          4技術(TST)、5知識(TKT)、6怪異(TMT)
        ホラースケープ表
          会話(CHT)    /街中(VHT)  /不意訪問(IHT)
          廃墟遭遇(RHT)/野外遭遇(MHT)/情報潜在(LHT)
        遭遇表 都市(ECT)/山林(EMT)/海辺(EAT)/反応表 RET
        残業ホラースケープ表(OHT)  /残業電話表(OPT)/残業シーン表(OWT)
        社名決定表1(CNT1)/社名決定表2(CNT2)/社名決定表3(CNT3)
        暫定整理番号作成表(IRN)
        ・D66ダイスあり
      INFO_MESSAGE_TEXT

      def initialize(command)
        super(command)

        @sort_add_dice = true
        @sort_barabara_dice = true
        @d66_sort_type = D66SortType::ASC
      end

      # ゲーム別成功度判定(2D6)
      def result_2d6(total, dice_total, _dice_list, cmp_op, target)
        return nil unless cmp_op == :>=

        if dice_total <= 2
          Result.fumble(translate("Insane.fumble"))
        elsif dice_total >= 12
          Result.critical(translate("Insane.special"))
        elsif target == "?"
          Result.nothing
        elsif total >= target
          Result.success(translate("success"))
        else
          Result.failure(translate("failure"))
        end
      end

      def eval_game_system_specific_command(command)
        case command
        when 'BET'
          type = translate("Insane.BET.name")
          output, total_n = get_badend_table
        when 'IRN'
          type = translate("Insane.IRN.name")
          output, total_n = get_interim_reference_number
        else
          return self.class::RTT.roll_command(@randomizer, command) || roll_tables(command, self.class::TABLES)
        end

        return "#{type}(#{total_n}) > #{output}"
      end

      private

      # バッドエンド表
      def get_badend_table
        table = [
          translate("Insane.BET.items.2"),
          lambda { return translate("Insane.BET.items.3", skill: self.class::RTT.roll_skill(@randomizer)) },
          translate("Insane.BET.items.4"),
          translate("Insane.BET.items.5"),
          translate("Insane.BET.items.6"),
          translate("Insane.BET.items.7"),
          translate("Insane.BET.items.8"),
          translate("Insane.BET.items.9"),
          translate("Insane.BET.items.10"),
          lambda { return translate("Insane.BET.items.11", skill: self.class::RTT.roll_skill(@randomizer)) },
          translate("Insane.BET.items.12"),
        ]
        return get_table_by_2d6(table)
      end

      # 暫定整理番号作成表
      def get_interim_reference_number
        table = [
          [11, '1'],
          [12, '2'],
          [13, '3'],
          [14, '4'],
          [15, '5'],
          [16, '6'],
          [22, 'G'],
          [23, 'I'],
          [24, 'J'],
          [25, 'K'],
          [26, 'O'],
          [33, 'P'],
          [34, 'Q'],
          [35, 'S'],
          [36, 'T'],
          [44, 'U'],
          [45, 'V'],
          [46, 'X'],
          [55, 'Y'],
          [56, 'Z'],
          [66, '-'],
        ]

        number = @randomizer.roll_once(6)
        total_n = number.to_s
        counts = 3
        if number <= 4
          counts = number + 5
        elsif number == 5
          counts = 4
        end

        output = ''
        counts.times do
          character, number = get_table_by_d66_swap(table)
          output += character
          total_n += ",#{number}"
        end
        return output, total_n
      end

      class << self
        private

        def translate_tables(locale)
          {
            "ST" => DiceTable::Table.from_i18n("Insane.table.ST", locale),
            "HJST" => DiceTable::Table.from_i18n("Insane.table.HJST", locale),
            "MTST" => DiceTable::Table.from_i18n("Insane.table.MTST", locale),
            "DVST" => DiceTable::Table.from_i18n("Insane.table.DVST", locale),
            "DT" => DiceTable::D66Table.from_i18n("Insane.table.DT", locale),
            "BT" => DiceTable::D66Table.from_i18n("Insane.table.BT", locale),
            "PT" => DiceTable::D66Table.from_i18n("Insane.table.PT", locale),
            "FT" => DiceTable::Table.from_i18n("Insane.table.FT", locale),
            "JT" => DiceTable::D66Table.from_i18n("Insane.table.JT", locale),
            "CHT" => DiceTable::Table.from_i18n("Insane.table.CHT", locale),
            "VHT" => DiceTable::Table.from_i18n("Insane.table.VHT", locale),
            "IHT" => DiceTable::Table.from_i18n("Insane.table.IHT", locale),
            "RHT" => DiceTable::Table.from_i18n("Insane.table.RHT", locale),
            "MHT" => DiceTable::Table.from_i18n("Insane.table.MHT", locale),
            "LHT" => DiceTable::Table.from_i18n("Insane.table.LHT", locale),
            "ECT" => DiceTable::Table.from_i18n("Insane.table.ECT", locale),
            "EMT" => DiceTable::Table.from_i18n("Insane.table.EMT", locale),
            "EAT" => DiceTable::Table.from_i18n("Insane.table.EAT", locale),
            "OHT" => DiceTable::Table.from_i18n("Insane.table.OHT", locale),
            "OPT" => DiceTable::Table.from_i18n("Insane.table.OPT", locale),
            "OWT" => DiceTable::Table.from_i18n("Insane.table.OWT", locale),
            "CNT1" => DiceTable::Table.from_i18n("Insane.table.CNT1", locale),
            "CNT2" => DiceTable::Table.from_i18n("Insane.table.CNT2", locale),
            "CNT3" => DiceTable::Table.from_i18n("Insane.table.CNT3", locale),
            "RET" => DiceTable::Table.from_i18n("Insane.table.RET", locale),
          }
        end

        def translate_rtt(locale)
          DiceTable::SaiFicSkillTable.from_i18n("Insane.RTT", locale, rttn: ["TVT", "TET", "TPT", "TST", "TKT", "TMT"])
        end
      end

      TABLES = translate_tables(:ja_jp)
      RTT = translate_rtt(:ja_jp)

      register_prefix("BET", "IRN", RTT.prefixes, TABLES.keys)
    end
  end
end