# frozen_string_literal: true

require 'bcdice/game_system/SajinsenkiAGuS'

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

      # ゲームシステム名
      NAME = '砂塵戦機アーガス2ndEdition'

      # ゲームシステム名の読みがな
      SORT_KEY = 'さしんせんきああかす2'

      # ダイスボットの使い方
      HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
        ・一般判定Lv（チャンス出目0→判定0） nAG+x
        　　　nは習得レベル、Lv0の場合nの省略可能。xは判定値修正（数式による修正可）、省略した場合はレベル修正0
        　　　例）AG:習得レベル0の一般技能、1AG+1:習得レベル1・判定値修正+1の技能、AG+2-1：習得レベル0・判定値修正2-1の技能、(1-1)AG：習得レベル1・レベル修正-1の技能

        ・適正距離での命中判定（チャンス出目0→判定0、HR算出）OM+y@z
        　　　yは命中補正値（数式可）、zはクリティカル値。クリティカル値省略時は0
        　　　HRの算出時には、HRが大きくなる場合に出目0を10に読み替えます。
        　　　例）OM+18-6@2:命中補正値+18-6でクリティカル値2、適正距離の判定

        ・非適正距離での命中判定（チャンス出目0→判定0、HR算出）NM+y@z
        　　　yは命中補正値（数式可）、zはクリティカル値。クリティカル値省略時は0
        　　　HRの算出時には、HRが大きくなる場合に出目0を10に読み替えます。
        　　　例）NM+4-3:命中補正値+4-3で非適正距離の判定


        ・『西風旅徨』で導入されたファンブル・ルールを用いた判定
        　判定時にダイスがすべて8以上ならファンブル(自動失敗)です。
        　それぞれのコマンドにWを付けると『西風旅徨』モードになります。
        　　　・一般判定                nAGW+x
        　　　・適正距離での命中判定    OMW+y@z
        　　　・非適正距離での命中判定  NMW+y@z



        ・クリティカル表　　 CR
        ・鹵獲結果表　　　　 CAP
        ・幕間クエスト表　　 INT
        ・サルベージ表　　　 SAL
        ・赤字ペナルティー表 DEF
        ・特殊戦況表　　　　 SPE

        ※通常の1D10などの10面ダイスにおいて出目10の読み替えはしません。コマンドのみです。
        　ページ参照は、何もない場合は「ルールブック」、wは「西風旅徨」を示します。

      INFO_MESSAGE_TEXT

      def initialize(command)
        super(command)
        @enabled_d9 = true
      end

      def eval_game_system_specific_command(command)
        super(command) ||
          roll_ippan_west(command) ||
          roll_hit_check_west(command) ||
          roll_tables(command, SECOND_ED_TABLES)
      end

      def roll_ippan_west(command)
        m = /AGW/.match(command)
        return nil unless m

        result = roll_ippan(command.sub(/(AG)W/) { ::Regexp.last_match(1) })
        return change_fumble(result)
      end

      def roll_hit_check_west(command)
        m = /[ON]MW/.match(command)
        return nil unless m

        result = roll_hit_check(command.sub(/([ON]M)W/) { ::Regexp.last_match(1) })
        return change_fumble(result)
      end

      def change_fumble(result)
        return nil if result.nil?

        fumble_counts = result.rands.count { |val| val >= 8 }
        if fumble_counts >= 2
          result.text = result.text.sub(/(成功|失敗).*$/, 'ファンブル')
          result.failure = true
          result.success = false
          result.fumble = true
        end
        return result
      end

      SECOND_ED_TABLES = {
        "CAP" => DiceTable::Table.new(
          "鹵獲結果表",
          "2D10",
          [
            '0:敵A:GuS を完全な状態で鹵獲︕ ※総合価格÷ 2 で売却可。',
            '1:敵A:GuS を完全な状態で鹵獲︕ ※総合価格÷ 2 で売却可。',
            '2:敵A:GuS を完全な状態で鹵獲︕ ※総合価格÷ 2 で売却可。',
            '3:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
            '4:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
            '5:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
            '6:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
            '7:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
            '8:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
            '9:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
            '10:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
            '11:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
            '12:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
            '13:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
            '14:残念、完全にスクラップだ……。※部品代として［バランス値×300］cdtを獲得。',
            '15:残念、完全にスクラップだ……。※部品代として［バランス値×300］cdtを獲得。',
            '16:残念、完全にスクラップだ……。※部品代として［バランス値×300］cdtを獲得。',
            '17:残念、完全にスクラップだ……。※部品代として［バランス値×300］cdtを獲得。',
            '18:残念、完全にスクラップだ……。※部品代として［バランス値×300］cdtを獲得。',
          ]
        ),
        "INT" => DiceTable::RangeTable.new(
          "幕間クエスト表",
          "1D100",
          [
            [1, '慰労 PC/クルー1名が、労ってくれる。 最大HP+4'],
            [2..3, '感謝 PC/クルー1名が、感謝の気持ちを伝える。 最大HP+4'],
            [4..5, '安堵 PC/ クルー1名が、安堵の気持ちを伝える。 最大HP+4'],
            [6..7, '治療 戦闘中の怪我や急な病気で医療班のお世話になることに。 最大HP+4'],
            [8..9, '日常 PC/クルー1名と、他愛のない日常の会話をする。 最大HP+4'],
            [10..11, '遊興 PC/クルー1名と遊びに興じ、楽しい時を過ごす。 XP+1'],
            [12..13, '勤労 PC/クルー1名と協力し、船内の仕事を行う。 XP+1'],
            [14..15, '評価 PC/クルー1名が、仕事の出来を評価してくれる。 XP+1'],
            [16..17, '調達 PC/クルー1名とともに生活品の買い出しを行うことに。 XP+1'],
            [18..19, '社交 取引や補給などの仕事を通し、船外での社会経験を得る。 XP+1'],
            [20..21, '注意 PC/クルー1名が、君の危険な戦闘行動について指摘する。 SP+1'],
            [22..23, '反省 PC/クルー1名と、作戦行動の反省会を行う。 SP+1'],
            [24..25, '鍛錬 PC/クルー1名に、模擬戦に付き合ってもらう。 SP+1'],
            [26..27, '感心 PC/クルー1名の仕事や戦闘行動に対し、感銘を受ける。 SP+1'],
            [28..29, '改良 整備班と協力し、A:GuSのプログラムの改良に努める。 SP+1'],
            [30..31, '割引 兵装が割引されているのを発見し、格安で購入できる。 基本兵装1つを半額で購入可。'],
            [32..33, '発見 クルー1名が、兵装を入手した。 基本兵装1つを半額で購入可。'],
            [34..35, '発明 クルー1名が、兵装を開発した。 基本兵装1つを半額で購入可。'],
            [36..37, '大発見 クルー1名が、強力な兵装を入手した！ 上級兵装1つを購入可。（p37参照）'],
            [38..39, '大発明 クルー1名が、新たな兵装を開発した！ 上級兵装1つを購入可。（p37参照）'],
            [40..41, '昔話 PC/クルー1名に、自分の過去について語ってしまう。 最大LP+1'],
            [42..43, '願望 PC/クルー1名に、自分の夢や未来について語ってしまう。 最大LP+1'],
            [44..45, '家族 PC/クルー1名に、自分の家族について語ってしまう。 最大LP+1'],
            [46..47, '望郷 PC/クルー1名に、自分の故郷について語ってしまう。 最大LP+1'],
            [48..49, '知人 PC/クルー1名に、自分の知人を重ね合わせてしまう。 最大LP+1'],
            [50..51, '個人収入 チームとは関係ない個人的な商売や取引で利益を得る。 4,000cdtを獲得。'],
            [52..53, '臨時収入 思いがけない臨時の収入が入る。 4,000cdt を獲得。'],
            [54..55, '取引 クルー1 名と取引を行い、予算を獲得することに成功する。 4,000cdtを獲得。'],
            [56..57, '裏取引 クルー1 名と秘密の取引を行い、見返りとして予算を獲得。 6,000cdtを獲得。'],
            [58..59, '賞与 オーナーが特別に報酬を用意してくれた！ 6,000cdtを獲得。'],
            [60..61, '改造 整備班とともに機体の改造に明け暮れる。 任意の改造Lv+1。（上限：2Lv）'],
            [62..63, '鹵獲 鹵獲品の中から機体の改造に使えるものを発見。 任意の改造Lv+1。（上限：2Lv）'],
            [64..65, '強化 案機体を強化するための画期的なアイディアを思いつく。 任意の改造Lv+1。（上限：2Lv）'],
            [66..67, '懇願 整備班に頼みこみ、機体の改造をしてもらう。 任意の改造Lv+1。（上限：3Lv）'],
            [68..69, '掘出物 掘出物を発見、整備班が早速機体に取り付けてくれた。 任意の改造Lv+1。（上限：3Lv）'],
            [70..71, '募集 クルーの募集を行ったところ、何名か候補が現れた。 クルー1名を割安（20,000cdt）で雇用可。'],
            [72..73, '勧誘 有能な人材を発見した。ぜひ雇い入れたいものだが。 クルー1名を割安（20,000cdt）で雇用可。'],
            [74..75, '推薦 依頼人からの推薦で、クルーを1名紹介される。 クルー1名を割安（20,000cdt）で雇用可。'],
            [76..77, '志願 クルーとして雇って欲しい、という人物が現れる。クルー1名を割安（15,000cdt）で雇用可。'],
            [78..79, '成長 見習いクルーが大分成長してきた。もう1人前と見てもいい。クルー1名を割安（15,000cdt）で雇用可。'],
            [80..81, '交渉 依頼人との交渉がうまくいき、少し報酬を割増ししてもらえる。 チーム予算を8,000cdt獲得。'],
            [82..83, '節約 経費が思ったよりも節約できた。経理やオーナーの機嫌が良い。 チーム予算を8,000cdt獲得。'],
            [84..85, '賞金 今回の敵は賞金がかかっていたようで臨時収入が入った。 チーム予算を8,000cdt獲得。'],
            [86..87, '名声 チームの名声が高まっており、クルーの自尊心が刺激される。 チーム予算を12,000cdt獲得。'],
            [88..89, '一致団結 オーナーからの労いがあり、クルー一同の結束力が高まる。 チーム予算を12,000cdt獲得。'],
            [90..91, '点検 PC/クルー1名とシップに異状がないか点検作業を行う。 拠点AP+10。'],
            [92..93, '補修 整備班とともにくたびれたシップの改装作業を行う。 拠点AP+10。'],
            [94..95, '全面改修 艦内の問題箇所を全面的に改修する。 拠点AP+10。'],
            [96..97, '自由 行動自由気ままに好きなことをして過ごす。 00～49の任意の効果を適用可。（p69参照）'],
            [98..99, '歓迎 街の住民にたいへんな歓迎を受ける。 50～95の任意の効果を適用可。（p69参照）'],
            [100, '慰労 PC/クルー1名が、労ってくれる。 最大HP+4'],
          ]
        ),
        "SAL" => DiceTable::RangeTable.new(
          "サルベージ表",
          "1D100",
          [
            [1..2, '大失敗…。大変な損失を出してしまった…。 -5,000cdt'],
            [3..5, '失敗…。かなりの損失を出してしまった…。 -3,000cdt'],
            [6..9, '失敗…。損失を出してしまった…。 -1,000cdt'],
            [10, '大成功！大きな収益を上げることができた！ +5,000cdt'],
            [11..19, '空振り……何の成果も得られなかった…。 0cdt'],
            [20, '掘り出し物を発見！2Lv改造済の【基本携行兵装】一つを獲得！ 一般兵装（→p34）'],
            [21..22, 'ジャンク品を発見。船の装甲強化くらいには使えそうだ。 拠点AP+［5］'],
            [23..25, 'ジャンク品を発見。少し赤字だがまあやむを得まい。 +1,000cdt'],
            [26..29, 'ジャンク品を発見。手間賃くらいにはなった。 +2,000cdt'],
            [30, '掘り出し物を発見！2Lv改造済の【基本外装兵装】一つを獲得！ 一般兵装（→p35）'],
            [31..32, '成功！少しだが利益を出すことができた！ +3,000cdt'],
            [33..35, '成功！まずまずの利益を出すことができた！ +5,000cdt'],
            [36..39, '大成功！大きな利益を出すことができた！ +7,000cdt'],
            [40..41, '良質のバッテリーを獲得。 EP+［4］'],
            [42..43, '良質の装甲版を獲得。 AP+［4］'],
            [44, '大失敗…。大きな損失を出してしまった…。 -5,000cdt'],
            [45, 'ブレードを獲得。 →p34'],
            [46, 'ランスを獲得。 →p34'],
            [47, 'アンカーブレードを獲得。 →p34'],
            [48, 'パイルバンカーを獲得。 →p34'],
            [49, 'ハンドガンを獲得。 →p35'],
            [50, 'ヘビーハンドガンを獲得。 →p35'],
            [51, 'ライフルを獲得。 →p35'],
            [52, 'アンカーショットを獲得。 →p35'],
            [53, 'マシンガンSを獲得。 →p35'],
            [54, 'マシンガンLを獲得。 →p35'],
            [55, 'ミサイルポッドSを獲得。 →p35'],
            [56, 'ミサイルポッドLを獲得。 →p35'],
            [57, 'バズーカを獲得。 →p35'],
            [58, 'カノンを獲得。 →p35'],
            [59, 'ライトシールドを獲得。 →p35'],
            [60, 'ミドルシールドを獲得。 →p35'],
            [61, 'ヘビーシールドを獲得。 →p35'],
            [62, 'レーダーユニットを獲得。 →p35'],
            [63, 'ECMユニットを獲得。 →p35'],
            [64, 'サブブースターを獲得。 →p36'],
            [65, 'ディフェンスサポートを獲得。 →p36'],
            [66, 'コンバットサポートを獲得。 →p36'],
            [67, '大失敗…。大きな損失を出してしまった…。 -5,000cdt'],
            [68, 'ショットサポートを獲得。 →p36'],
            [69, 'パワーローダーを獲得。 →p36'],
            [70, 'サブバッテリーを獲得。 →p36'],
            [71, 'サブバッテリー+を獲得。 →p36'],
            [72, 'ファランクスを獲得。 →p36'],
            [73, 'リアクティブアーマーを獲得。 →p36'],
            [74, '強化装甲版を獲得。 →p36'],
            [75, 'ヘビーマシンガンSを獲得。 →p35'],
            [76, 'ヘビーマシンガンLを獲得。 →p35'],
            [77, '掘り出し物を発見！25,000cdt以下の【上級外装兵装】一つを獲得！ 上級兵装 (→p37）'],
            [78..79, '失敗…。かなりの損失を出してしまった…。 -3,000cdt'],
            [80, '医療用品を獲得！ 調息値+［1］（全PC）'],
            [81, '大型ソーラーパネルを獲得！ 整備値+［1］（全PC）'],
            [82, '艦内用の環境設備を獲得！ サポート使用回数+［1］'],
            [83, 'リニアガンを獲得。 →p37'],
            [84, 'リニアマシンガンを獲得。 →p37'],
            [85, 'ジャマ―ユニットを獲得。 →p37'],
            [86, 'センサー+を獲得。 →p37'],
            [87, 'パワーローダー++を獲得。 →p37'],
            [88, 'サブバッテリー++を獲得。 →p37'],
            [89, 'フレームカバーを獲得。 →p37'],
            [90, '空振り……何の成果も得られなかった…。 0cdt'],
            [91..92, '良質なA:GuSのパーツを獲得！機体の改造や予備パーツとして使えそうだ！ 改造Lv+［1］（上限：3Lv）'],
            [93..95, 'A:GuSのパーツを獲得！機体の改造や予備パーツとして使えそうだ。 改造Lv+［1］（上限：1Lv）'],
            [96..98, '多少傷ついているが、A:GuS1機を獲得！→10,000cdtで売却可能→10,000cdt支払えば補修して取得が可能。 （→p30～33）（→w23）'],
            [99, 'A:GuS1機をほぼ完全な状態で獲得！ （→p30～33）（→w23）'],
            [100, '掘り出し物を発見！25,000cdt以下の【上級携行兵装】一つを獲得！ 上級兵装 (→p37）'],
          ]
        ),
        "DEF" => DiceTable::RangeTable.new(
          "赤字ペナルティー表",
          "1D10",
          [
            [1, '解雇 クルー1名を失う。10,000cdtを得る。'],
            [2..3, '劣化 任意のチーム能力一つは-1Lv。10,000cdtを得る。'],
            [4..5, '借金 次回の維持費が+20,000cdt。10,000cdtを得る。'],
            [6..7, '酷使 各PCは最大HP-4。10,000cdtを得る。'],
            [8..9, '売却 各PCはオプション以外の兵装を一つずつ廃棄。10,000cdtを得る。'],
            [10, '解雇 クルー1名を失う。10,000cdtを得る。'],
          ]
        ),
        # DiceTable::Tableが現状1D9に未対応
        "SPE" => DiceTable::Table.new(
          "特殊戦況表",
          "1D10",
          [
            '混戦 以下のエリアのユニットをシャッフルする。♠：A⇔C ♣：B⇔D ♦：A⇔D ♥：B⇔C',
            '乱戦 R中、すべての攻撃は［距離：○］になる。',
            '逸失 敵拠点エリアのユニットを［♠♣：A ♦♥：B］に移動。味方拠点エリアのユニットを［♠♣：D ♦♥：C］に移動。',
            '突風 艦船、オブジェクト以外の全ユニットを「風向き」方向に移動。',
            '流砂 以下のエリアのユニットは脱出のため、MPとEPを［3］点失う。［♠：A ♣：B ♦：C ♥：D］',
            '混乱 母船内でトラブル発生。R中、【整備】は行えない。［♠♥：味方側 ♣♦：敵側］',
            '岩盤 以下のエリアのユニットは岩盤に乗り上げ、《クリティカル》が1回発生。［♠：A ♣：B ♦：C ♥：D］',
            '混乱 R中、イニシア値を逆順で処理する。 ※【エイミング】等の高低も逆として処理する。',
            '飛礫 飛礫によって、すべてのユニットはAPを［1D10］（以下のエリアでは［2D10］）点失う。［♠：A ♣：B ♦：C ♥：D］',
            '雨 雨は砂を土へと変えてしまう。R中、全ユニット移動/突撃不可。',
          ]
        ),
      }.freeze
      register_prefix_from_super_class()
      register_prefix('-?\d*AGW', 'OMW', 'NMW', SECOND_ED_TABLES.keys)
    end
  end
end
