# frozen_string_literal: true

require "bcdice/dice_table/table"

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

      # ゲームシステム名
      NAME = 'リューチューバーとちいさな奇跡'

      # ゲームシステム名の読みがな
      SORT_KEY = 'りゆうちゆうはあとちいさなきせき'

      HELP_MESSAGE = <<~MESSAGETEXT
        ◆判定
        　・判定　nB6<=1
        　　※　n:サイコロの数　例）12B6<=1　サイコロの数12個の場合
        　・判定ルールを表示する　RTB
        ◆職業　（カッコ内は使えそうな技能）
        　・職業表　JT
        　・学生表　JST
        　・技術・専門職表　JTPT
        　・事務・サービス職表　JOST
        　・エンタメ職表　JET
        ◆趣味　（カッコ内は使えそうな技能）
        　・趣味表　HT
        　・多人数でできる趣味表　HGT
        　・一人でできるインドア趣味表A　HIAT
        　・一人でできるインドア趣味表B　HIBT
        　・一人でできるアウトドア趣味表A　HOAT
        　・一人でできるアウトドア趣味表B　HOBT
        ◆奇跡の演目を表示する
        　・幸運の風が吹いている MPW
        　・困った時はお互い様 MPT
        　・悪い予感は的中する MPF
        　・ついていい嘘もある MPL
        　・私には星が見えている MPS
        　・心は竜と共にあり MPD
        　・人は石垣、人は城 MPH
      MESSAGETEXT

      def eval_game_system_specific_command(command) # ダイスロールコマンド
        if (ret = roll_tables(command, TABLES))
          return ret
        end

        if (text = TEXTS[command])
          return text.chomp
        end

        return nil
      end

      TEXTS = {
        'RTB' => <<~TEXT,
          判定ルール表示
          ①枠主が判定内容を宣言、判定参加者が行動宣言
          ②サイコロは竜の巫女なら6個、技能レベルか指定魅力の値個、奇跡の演目を1つ以上クリアで+6個、スパの消費数個
          ③振ったサイコロの「1の目」の数が目標値以上なら華麗に成功、目標値未満ならちょっと残念な結果
        TEXT
        'MPW' => <<~TEXT,
          幸運の風が吹いている
          奇跡　以降ゲーム終了まで、サイコロ+1
          ①健気に頑張る姿を見せる。
          ②報われることはなく、さらに最悪の展開に。
          ③それでも健気なところを見せる。
        TEXT
        'MPT' => <<~TEXT,
          困った時はお互い様
          奇跡　そのプレイヤーの判定サイコロを1回振り直しできる
          ①けちな様子を見せる。
          ②困っている人に施しをする姿を見られる。
          ③窮地に陥る。
        TEXT
        'MPF' => <<~TEXT,
          悪い予感は的中する
          奇跡　1判定だけ、サイコロ+3
          ①犠牲者が悪い噂を耳にする。
          ②犠牲者が悪い冗談を言う。
          ③犠牲者が悪い予感に心さざめき、誰かに悪い予感を話す。
        TEXT
        'MPL' => <<~TEXT,
          ついていい嘘もある
          奇跡　ついた（ささやかな）嘘が本当になる　枠主判断でいつか発動する。
          ①嘘を言う。
          ②嘘によって窮地に立つ。
          ③嘘を嘘にしないためにあがく。
        TEXT
        'MPS' => <<~TEXT,
          私には星が見えている
          奇跡　指定したキャラクターの次の行動がわかる
          ①少し先のことを言い当てる。
          ②気味が悪いと噂になる。
          ③言い当てる力を人間観察に用いる。
        TEXT
        'MPD' => <<~TEXT,
          心は竜と共にあり
          奇跡　起こりうる不幸を阻止する
          ①心清いひとに助けられる。
          ②自分の性根悪さを悲しむ。
          ③自分なりのやり方で心清い行いをする。
        TEXT
        'MPH' => <<~TEXT,
          人は石垣、人は城
          奇跡　感化された周りの人が手伝うようになる
          ①人々の不幸を見て、親切にしてしまう。
          ②けなげに頑張る姿を見られる。
          ③見ていた人々が集まってくる。
        TEXT
      }.freeze

      TABLES = {
        "JT" => DiceTable::Table.new(
          "職業表",
          "1D6",
          [
            '学生表へ',
            '技術・専門職表へ',
            '技術・専門職表へ',
            '事務・サービス職表へ',
            '事務・サービス職表へ',
            'エンタメ職表へ'
          ]
        ),
        "JST" => DiceTable::Table.new(
          "学生表",
          "1D6",
          [
            '中学生　（ゲーム　運動する）',
            '高校生（文系）　（仲良くする　文章を書く）',
            '高校生（理系）　（仲良くする　科学の知識）',
            '専門学校生　（ものづくり　設計する）',
            '大学生（文系）　（社会の仕組み　外国語）',
            '大学生（理系）　（すごい技術　科学の知識）'
          ]
        ),
        "JTPT" => DiceTable::Table.new(
          "技術・専門職表",
          "2D6",
          [
            '勝負師・山師　（洞察力　精神力）',
            '漁師/猟師　（自然の知識　料理する）',
            '建築家、大工　（設計する　運転する）',
            '料理人　（料理する　ものづくり）',
            '職人　（ものづくり　丁寧）',
            '農家　（自然の知識　育てる）',
            '医療・福祉関係（医師、薬剤師、介護職）　（治す　科学の知識）',
            '美容、スタイリスト　（見た目を整える　仲良くする）',
            'プログラマー　（プログラム　設計する）',
            '士業（税理士、弁護士、行政書士等）　（社会の仕組み　事務仕事）',
            '研究者　（教える　すごい技術）'
          ]
        ),
        "JOST" => DiceTable::Table.new(
          "事務・サービス職表",
          "2D6",
          [
            '宗教関係（巫女、僧侶など）　（お祈りする　地元知識）',
            '観光、旅行　（外国語　地元知識）',
            '教師、保育士　（教える　育てる）',
            '運転手、配達員　（運転する　地元知識）',
            '自宅警備員　（ゲーム　想像力）',
            'サラリーマン　（事務仕事　仲良くする）',
            '店員　（丁寧　商品知識）',
            '公務員　（事務仕事　地元知識）',
            '警察、自衛隊、消防士　（社会の仕組み　戦う）',
            '投資家、金融業、不動産　（プレゼンする　事務仕事）',
            '経営者　（社会の仕組み　仲良くする）'
          ]
        ),
        "JET" => DiceTable::Table.new(
          "エンタメ職表",
          "2D6",
          [
            'ゲーム制作　（プログラム　ものづくり）',
            '写真家　（自然の知識　絵を描く）',
            'デザイナー　（設計する 見た目を整える）',
            'ライター　（文章を書く　想像力）',
            'イラストレーター　（絵を描く　見た目を整える）',
            '専業配信者　（プレゼンする　カリスマ）',
            '声優　（声を出す　演技する）',
            'ミュージシャン　（声を出す　音楽）',
            'アイドル・芸能人　（演技する　カリスマ）',
            'プロゲーマー　（ゲーム　戦う）',
            'プロスポーツ選手　（運動する　精神力）'
          ]
        ),
        "HT" => DiceTable::Table.new(
          "趣味表",
          "1D6",
          [
            '多人数でできる趣味表へ',
            '多人数でできる趣味表へ',
            '一人でできるインドア趣味表Aへ',
            '一人でできるインドア趣味表Bへ',
            '一人でできるアウトドア趣味表Aへ',
            '一人でできるアウトドア趣味表Bへ'
          ]
        ),
        "HGT" => DiceTable::Table.new(
          "多人数でできる趣味表",
          "1D6",
          [
            '家族サービス　（仲良くする　育てる）',
            '野球・フットサル　（仲良くする　運動する）',
            'ボードゲーム／ＴＲＰＧ／囲碁／将棋　（ゲーム　想像する）',
            'ボランティア　（忍耐力　カリスマ）',
            'サバイバルゲーム　（戦う　隠れる）',
            'バンド　（音楽　見た目を整える）'
          ]
        ),
        "HIAT" => DiceTable::Table.new(
          "一人でできるインドア趣味表A",
          "1D6",
          [
            '工芸　（ものづくり　想像力）',
            '編み物　（丁寧　見た目を整える）',
            '陶芸　（ものづくり　想像力）',
            'プラモ　（ものづくり　見た目を整える）',
            '同人　（絵を描く　文章を書く）',
            '読書　（外国語　社会の仕組み）'
          ]
        ),
        "HIBT" => DiceTable::Table.new(
          "一人でできるインドア趣味表B",
          "1D6",
          [
            '仕事　（事務仕事　忍耐力）',
            '資格集め　（社会の仕組み　商品知識）',
            'お絵かき　（絵を描く　想像力）',
            '料理　（料理する　設計する）',
            '筋トレ　（運動する　忍耐力）',
            'コンピューターゲーム　（ゲーム　プログラム）'
          ]
        ),
        "HOAT" => DiceTable::Table.new(
          "一人でできるアウトドア趣味表A",
          "1D6",
          [
            'スポーツ観戦　（忍耐力　お祈りする）',
            '水泳　（運動する　泳ぐ）',
            '旅行／鉄道　（移動する　外国語）',
            '写真　（自然の知識　想像力）',
            'ジグソーパズル　（ゲーム　忍耐力）',
            'マラソン　（運動する　忍耐力）'
          ]
        ),
        "HOBT" => DiceTable::Table.new(
          "一人でできるアウトドア趣味表B",
          "1D6",
          [
            'スキー・スノーボード　（運動する　自然の知識）',
            '自転車　（移動する　運動する）',
            '盆栽・生花　（丁寧　育てる）',
            'キャンプ　（自然の知識　精神力）',
            '映画鑑賞　（演技する　想像力）',
            '恋愛　（仲良くする　見た目を整える）'
          ]
        )
      }.freeze

      register_prefix(TEXTS.keys + TABLES.keys)
    end
  end
end
