bcdice/BCDice

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

Summary

Maintainability
C
7 hrs
Test Coverage
A
100%
# frozen_string_literal: true

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

      # ゲームシステム名
      NAME = '碧空のストレイヴ'

      # ゲームシステム名の読みがな
      SORT_KEY = 'へきくうのすとれいふ'

      # ダイスボットの使い方
      HELP_MESSAGE = <<~MESSAGETEXT
        ・モラトリアムフェイズ用判定:MPm
        ・命中判定:nSTm*p

        「n」でダイス数を指定。
        「m」で目標値を指定。省略は出来ません。
        「p」で攻撃力を指定。「*」は「x」でも可。

        【書式例】
        ・MP6 → 目標値6のモラトリアムフェイズ用判定。
        ・5ST6*10 → 5d10で目標値6、攻撃力10の命中判定。

        【各種表】
        ・所属表:AFF  VN版:AFV
        ・アイデンティティ表:IDT  VN版:IDV

        ※アイデンティティ表はエラッタ適用済です。
      MESSAGETEXT

      register_prefix(
        'MP', '\d+ST',
        'AFF', 'IDT', 'AFV', 'IDV'
      )

      def initialize(command)
        super(command)
        @sort_add_dice = true # ダイスのソート有
      end

      def eval_game_system_specific_command(command)
        output =
          case command.upcase

          # MPコマンド:モラトリアムフェイズ用判定
          when /MP(\d+)$/i
            diceCount = 2
            target = Regexp.last_match(1).to_i
            checkRoll(diceCount, target, nil)

          # STコマンド:命中判定
          when /(\d+)ST(\d+)(x|\*)(\d+)$/i
            diceCount = Regexp.last_match(1).to_i
            target = Regexp.last_match(2).to_i
            damage = (Regexp.last_match(4) || 0).to_i
            checkRoll(diceCount, target, damage)

          # 各種表
          when 'AFF'
            get_affiliation_table
          when 'IDT'
            get_identity_table
          when 'AFV'
            get_affiliation_table2
          when 'IDV'
            get_identity_table2

          end

        return output
      end

      def checkRoll(diceCount, target, damage)
        target = 1 if target < 1
        target = 10 if target > 10

        diceArray = @randomizer.roll_barabara(diceCount, 10).sort
        diceText = diceArray.join(",")

        successCount = diceArray.find_all { |i| (i <= target) }.size

        isDamage = !damage.nil?

        if isDamage
          totalDamage = successCount * damage
          result = "(#{diceCount}D10\<\=#{target}) > #{diceText} > Hits:#{successCount}*#{damage} > #{totalDamage}ダメージ"
        else
          result = "(#{diceCount}D10\<\=#{target}) > #{diceText}"
          if successCount > 0
            result += " > 【成功】"
          else
            result += " > 【失敗】"
          end
        end

        return result
      end

      def get_affiliation_table
        name = '所属表:基本'
        table = [
          [1, 'アリウス管理委員会:あなたはアリウス管理委員会に所属している。'],
          [2, 'オーヴァーブルー:あなたはオーヴァーブルーに所属している。'],
          [3, 'ウォルゲイト:あなたはウォルゲイトに所属している。'],
          [4, '暁部隊:あなたはかつて、反逆者・暁弥琴と同じ部隊に所属していた。'],
          [5, '天文部:あなたは天文部に所属している。'],
          [6, '吹奏楽部:あなたは吹奏楽部に所属している。'],
          [7, '剣道部:あなたは剣道部に所属している。'],
          [8, 'ボクシング部:あなたはボクシング部に所属している。'],
          [9, '陸上部:あなたは陸上部に所属している。'],
          [10, '茶道部:あなたは茶道部に所属している。'],
          [11, 'パソコン部:あなたはパソコン部に所属している。'],
          [12, '新聞部:あなたは新聞部に所属している。'],
          [13, '弓道部:あなたは弓道部に所属している。'],
          [14, '美術部:あなたは美術部に所属している。'],
          [15, 'ミリタリー研究会:あなたはミリタリー研究会に所属している。'],
          [16, '歴史研究会:あなたは歴史研究会に所属している。'],
          [17, 'ロボット研究会:あなたはロボット研究会に所属している。'],
          [18, '図書委員会:あなたは図書委員会に所属している。'],
          [19, '任意:あなたの任意の所属を設定せよ。'],
          [20, '任意:あなたの任意の所属を設定せよ。']
        ]
        return get_strave_1d100_table_result(name, table)
      end

      def get_identity_table
        name = 'アイデンティティ表:基本'
        table = [
          [1, '戦い:戦いこそが、あなたをあなたたらしめている。'],
          [2, '守護:あなたには守るべきものがある。'],
          [3, '復讐:あなたは復讐を誓っている。何かに、あるいは誰かに。'],
          [4, '名声:その身に浴びる脚光を、何よりも誉としている。'],
          [5, '恋愛:あなたはその身を焦がす恋に生きている。'],
          [6, '家族:あなたにとって、家族はかけがえの無いものだ。'],
          [7, '友人:あなたは友のために戦っている。'],
          [8, '部隊:共に戦う部隊の仲間が、あなたに力をくれる。'],
          [9, 'ストレイヴ:あなたは自身のストレイヴを誇りに思っている。'],
          [10, 'スフィアブレイク:あなたはスフィアブレイクを熱烈に目指している。'],
          [11, 'お金:あなたはお金を求めている。報酬こそが自分の価値だ。'],
          [12, '夢:あなたには夢がある。自分を突き動かす夢が。'],
          [13, '忠誠:あなたは忠誠を誓っている。何かに、あるいは誰かに。'],
          [14, '共生:あなたは、ヴァイエルと人類との共生を望んでいる。'],
          [15, '居場所:自身の居場所こそが、あなたに力をくれる。'],
          [16, '強制:あなたは不本意ながら今の立場にいる。'],
          [17, '碧空:見上げた青空が、あなたを変えた。'],
          [18, '任意:あなたの任意のアイデンティティを設定せよ。'],
          [19, '任意:あなたの任意のアイデンティティを設定せよ。'],
          [20, '任意:あなたの任意のアイデンティティを設定せよ。']
        ]
        return get_strave_1d100_table_result(name, table)
      end

      def get_affiliation_table2
        name = '所属表:ヴァリアンスネイヴァー'
        table = [
          [1, 'シュヴァレ・トワール:あなたはシュヴァレ・トワールに所属している。'],
          [2, 'ディープシンカー:あなたはディープシンカーに所属している。'],
          [3, 'ヴェルクシュタット:あなたはヴェルクシュタットに所属している。'],
          [4, 'アウスヴァル:あなたはアウスヴァルに所属している。'],
          [5, '美術科:あなたは美術科に所属している。'],
          [6, '哲学科:あなたは哲学科に所属している。'],
          [7, '数学科:あなたは数学科に所属している。'],
          [8, '地理学科:あなたは地理学科に所属している。'],
          [9, '工学科:あなたは工学科に所属している。'],
          [10, '体育学科:あなたは体育学科に所属している。'],
          [11, '農学科:あなたは農学科に所属している。'],
          [12, '歴史学科:あなたは歴史学科に所属している。'],
          [13, '医学科:あなたは医学科に所属している。'],
          [14, '情報学科:あなたは情報学科に所属している。'],
          [15, '音楽科:あなたは音楽科に所属している。'],
          [16, '心理学科:あなたは心理学科に所属している。'],
          [17, '文学科:あなたは文学科に所属している。'],
          [18, '任意:あなたの任意の所属を設定すること。'],
          [19, '任意:あなたの任意の所属を設定すること。'],
          [20, '任意:あなたの任意の所属を設定すること。']
        ]
        return get_strave_1d100_table_result(name, table)
      end

      def get_identity_table2
        name = 'アイデンティティ表:ヴァリアンスネイヴァー'
        table = [
          [1, '戦い:戦いへの衝動が、あなたをあなたたらしめている。'],
          [2, '守護:守るべきものの存在が、あなたをあなたたらしめている。'],
          [3, '復讐:復讐の誓いこそが、あなたをあなたたらしめている。'],
          [4, '名声:与えられた名誉こそが、あなたをあなたたらしめている。'],
          [5, '恋愛:愛する者への想いが、あなたをあなたたらしめている。'],
          [6, '家族:かけがえのない家族が、あなたをあなたたらしめている。'],
          [7, '友人:友の存在が、あなたをあなたたらしめている。'],
          [8, '部隊:部隊の戦友こそが、あなたをあなたたらしめている。'],
          [9, 'ストレイヴ:ストレイヴの存在が、あなたの心を保っている。'],
          [10, '宇宙:やがて来る旅立ちの日まで、あなたはあなたであろうとしている。'],
          [11, 'お金:与えられる報酬のため、あなたはあなたであろうとしている。'],
          [12, '夢:あなたには、己の心に誓った夢がある。'],
          [13, '忠誠:その心でもって、誓った忠義がある。'],
          [14, '共生:あなたは、ヴァイエルと人類との共生を望んでいる。'],
          [15, '居場所:自身の居場所への思いが、あなたをあなたたらしめている。'],
          [16, 'ヴァイエル:あなたと同じでありながら、あなたと異なる存在。彼らへの思いが、あなたをあなたたらしめている。'],
          [17, 'エコール:自身の生きる場所への思いが、あなたをあなたたらしめている。'],
          [18, '任意:あなたの任意のアイデンティティを設定せよ。'],
          [19, '任意:あなたの任意のアイデンティティを設定せよ。'],
          [20, '任意:あなたの任意のアイデンティティを設定せよ。']
        ]
        return get_strave_1d100_table_result(name, table)
      end

      def get_strave_1d100_table_result(name, table)
        dice = @randomizer.roll_once(100)
        dice2 = ((dice.to_i - 1) / 5).floor + 1
        result = get_table_by_number(dice2, table)
        return get_strave_table_result(name, dice, result)
      end

      def get_strave_table_result(name, dice, result)
        return "#{name}(#{dice}) > #{result}"
      end
    end
  end
end