# frozen_string_literal: true

require 'bcdice/command/parser'

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

      # ゲームシステム名
      NAME = "あやびと"

      # ゲームシステム名の読みがな
      SORT_KEY = "あやひと"

      HELP_MESSAGE = <<~TEXT
        ・判定コマンド(xAB±y@c$d>=z)
          x：サイコロの数(10以上の場合9個振り、それ以降を成功数2として加算する)
          ±y：成功数への補正(省略可)
          c：クリティカル値(@ごと省略可。省略時は6)
          d：出目を2として数える数の最小値($ごと省略可。省略時は6)
          z：目標値(妨害値など。>=ごと省略可)
          (例) 4AB
               11AB>=5
               5AB+1
               6AB@5>=3

        ・各種表
          感情表 ET
          帝都東京シーン表 TST / 場面演出シーン表 BST
          交流表 CET
          ファンブル表 FT
          封印期間表 LT

          帝都東京エリア選択 TET
          　浅草シーン表 AST
          　上野シーン表 UST
          　日本橋シーン表 NST
          　銀座シーン表 GST
          　霞ヶ関シーン表 KST
          　新宿シーン表 SST
      TEXT

      def initialize(command)
        super(command)
        @sort_barabara_dice = true
        @round_type = RoundType::CEIL
      end

      def eval_game_system_specific_command(command)
        return check_action(command) || roll_tables(command, TABLES)
      end

      def check_action(command)
        parser = Command::Parser.new("AB", round_type: RoundType::CEIL).has_prefix_number.enable_critical.enable_dollar.restrict_cmp_op_to(nil, :>=)
        parsed = parser.parse(command)
        return nil if parsed.nil?

        if parsed.prefix_number < 10
          dice_cnt = parsed.prefix_number
          over_modify = 0
        else
          dice_cnt = 9
          over_modify = parsed.prefix_number - 9
        end
        modify = parsed.modify_number
        critical_target = parsed.critical || 6
        addition_target = parsed.dollar || 6
        target = parsed.target_number

        dice_arr = @randomizer.roll_barabara(dice_cnt, 6).sort
        dice_str = dice_arr.join(",")
        has_critical = dice_arr.any? { |x| x >= critical_target }
        success_cnt = dice_arr.count { |x| x >= 4 } + dice_arr.count { |x| x >= addition_target } + over_modify * 2
        has_fumble = success_cnt == 0 && dice_arr.include?(1)
        if has_fumble
          success_cnt = 0
        else
          success_cnt += modify
        end
        result = target.nil? ? success_cnt >= 1 : success_cnt >= target

        Result.new.tap do |r|
          r.text = "(#{dice_cnt}B6>=4)#{over_modify > 0 ? "+#{over_modify * 2}" : ''} ＞ [#{dice_str}]#{over_modify > 0 ? "+#{over_modify * 2}" : ''} ＞ 成功数#{success_cnt} ＞ #{result ? '成功' : '失敗'}#{has_critical ? '(クリティカル)' : ''}#{has_fumble ? '(ファンブル)' : ''}"
          r.critical = has_critical
          r.fumble = has_fumble
          r.success = result
          r.failure = !result
        end
      end

      TABLES = {
        'ET' => DiceTable::D66Table.new(
          '感情表',
          D66SortType::NO_SORT,
          {
            11 => '信頼/不信感',
            12 => '好奇心/無関心',
            13 => '優越感/劣等感',
            14 => '好意/敵意',
            15 => '安心感/不安感',
            16 => '愛情/偏愛',
            21 => '同情/憐憫',
            22 => '親近感/疎外感',
            23 => '連帯感/隔意',
            24 => '尽力/面倒',
            25 => '貸し/借り',
            26 => '庇護欲/食傷',
            31 => '期待/反発',
            32 => '熱狂/心酔',
            33 => '幸福感/不快感',
            34 => '尊敬/軽蔑',
            35 => '憧憬/嫉妬',
            36 => '忠誠/服従',
            41 => '友情/侮蔑',
            42 => '競争心/警戒',
            43 => '感謝/後悔',
            44 => '感服/恐怖',
            45 => '興味/屈辱',
            46 => '誠意/憎悪',
            51 => '羨望/嫌悪',
            52 => '共感/懸念',
            53 => '傾倒/厭気',
            54 => '赦し/怒り',
            55 => '有為/苦手',
            56 => '恩義/不満',
            61 => '予感/困惑',
            62 => '懐旧/忘却',
            63 => '慕情/執着',
            64 => '夢中/退屈',
            65 => '贖罪/罪悪感',
            66 => '慈愛/殺意',
          }
        ),
        'TST' => DiceTable::D66LeftRangeTable.new(
          '帝都東京シーン表',
          D66SortType::NO_SORT,
          [
            [1..1, Array.new(6, "子～巳までの任意の十二支を選択する。")],
            [2..3, [
              "［子］帝国大学の赤門、学生たちが今日も勉学に励んでいる。",
              "［丑］吉原の歓楽街。昼間は静かだが、夜は活気を見せてくれる。",
              "［寅］上野公園。桜に新緑、紅葉など、季節の顔を見せてくれる。",
              "［卯］浅草六区は今日も賑やか。浅草寺や仲見世には、多くの人々が行き交う。",
              "［辰］凌雲閣。浅草十二階として親しまれる塔に昇り、周囲を一望する。",
              "［巳］丸の内の東京駅。構内の喧騒とは裏腹に、霞ヶ関は静かに時が流れる。",
            ]],
            [4..5, [
              "［午］銀座をぶらぶらと歩く。百貨店が立ち並ぶこの街では、何でも買うことができるらしい。",
              "［未］日比谷の帝国劇場。演目は、話題のトップスタアによる華やかなる歌劇のようだ。",
              "［申］皇居のほとり。水面にうかぶ蓮の葉が、しずかに揺れている。",
              "［酉］明治神宮の境内。神聖なる雰囲気を味わうことができる。",
              "［戌］新たな東京の名所である新宿。今では東西を二分する街である。",
              "［亥］日本帝国軍駐屯地。妖怪人間共同実働部隊の本部も敷地内にある。",
            ]],
            [6..6, Array.new(6, "午～亥まで任意の十二支を選択する。")],
          ]
        ),
        'BST' => DiceTable::D66LeftRangeTable.new(
          '場面演出シーン表',
          D66SortType::NO_SORT,
          [
            [1..1, Array.new(6, "子～巳までの任意の十二支を選択する。")],
            [2..3, [
              "［子］人々が寝静まる帝都の夜。月に雲がかかるとともに、魔の香りが漂っている。",
              "［丑］草木も眠る静けさの中、犬の遠吠えだけが聞こえてくる。",
              "［寅］一陣の風が吹き抜ける。風に乗った匂いが、妙に鼻をくすぐってきた。",
              "［卯］霧や朝もやに包まれる。向こうに見える姿は誰だろうか……",
              "［辰］帝都に朝日が射す。人々は起き出し、日々の営みを始める。",
              "［巳］清廉な雰囲気の風景。鳥や虫の声、風にそよぐ木々の音が聞こえてくる。",
            ]],
            [4..5, [
              "［午］時計の針がある時間を指し示す。刻を告げるチャイムや鐘が響き渡る。",
              "［未］昼間の大通り。自動車や路面電車が走り、行き交う人々の雑踏が至るところで見られる。",
              "［申］夕刻、どこからともなく、定かではない声や物音が漏れてくる。",
              "［酉］瓦斯灯（がすとう）が通りを鮮やかに照らす。夜が街のもうひとつの顔を出し始める。",
              "［戌］星空の下、月明かりが微かに夜道を照らしている。",
              "［亥］光ひとつない暗闇の中。何者かの気配が蠢いている……",
            ]],
            [6..6, Array.new(6, "午～亥まで任意の十二支を選択する。")],
          ]
        ),
        'CET' => DiceTable::D66LeftRangeTable.new(
          '交流表',
          D66SortType::NO_SORT,
          [
            [1..1, Array.new(6, "感情～性格までの任意のテーマを選択する。")],
            [2..3, [
              "［感情］相手に抱いている感情、伝えるべきか伝えないべきか。",
              "［人間］相手に人間という存在をどう思うか、聞いてみるとしよう。",
              "［友達］相手に友人や仲間について語ろう。話すことで分かる想いもあるだろう。",
              "［告白］相手に話していいか分からないが、自分の秘めたる想いを語ろう。",
              "［思い出］相手に、過去の思い出を話してみよう。相手から昔話をきけるかもしれない。",
              "［性格］相手に自身の性格を語ろう。表向きのみ話すか、奥底まで話してしまうかは、事と次第による。",
            ]],
            [4..5, [
              "［関係性］相手とは、いつからこうした関係だったのか。相手と関係性について話そう。",
              "［妖怪］相手に妖怪という存在をどう思うか、聞いてみるとしよう。",
              "［あやびと］相手に、自分があやびとである意味や意義を語ってみよう。",
              "［想い］相手が今、何かしら想う人や物事について聞いてみよう。",
              "［夢］相手に自分の夢を語ろう。未来の夢、かつて捨てた夢かもしれない。",
              "［半生］相手に自身の半生を語ろう。半生こそが、今の自分となるきっかけなのだから……",
            ]],
            [6..6, Array.new(6, "関係性～半生までの任意のテーマを選択する。")],
          ]
        ),
        'FT' => DiceTable::Table.new(
          'ファンブル表',
          '1D6',
          [
            'PCの【耐久値】を-5する(最低1)。',
            'PCの【活力値】を-5する(最低1)',
            'PCは戦闘ないしフェイズが終了するまで《アビリティ》を使用できない。',
            'PCは戦闘ないしフェイズが終了するまで[絆]を使用できない。',
            'セッション終了時まで、登場するエネミーすべての【耐久値】を+3する',
            'セッション終了時まで、登場するエネミーすべてのダメージを+2する。',
          ]
        ),
        'LT' => DiceTable::Table.new(
          '封印期間表',
          '1D6',
          [
            # '1日',
            '1週間',
            '1ヶ月',
            '1年',
            '10年',
            '50年',
            '100年',
            # '500年',
          ]
        ),
        'TET' => DiceTable::Table.new(
          '帝都東京エリア選択',
          '1D6',
          [
            '浅草。庶民の盛り場として賑わう商店街と下町。',
            '上野。あらゆる路線の中心である帝都の玄関口。',
            '日本橋。江戸時代から変わらぬ商業の中心地。',
            '銀座。赤煉瓦が立ち並ぶ、帝都一モダンな繁華街。',
            '霞ヶ関。国会議事堂や裁判所がある官庁街。',
            '新宿。関東大震災以降、急速に発展した新しい街。',
          ]
        ),
        'AST' => DiceTable::D66LeftRangeTable.new(
          '浅草シーン表',
          D66SortType::NO_SORT,
          [
            [1..1, Array.new(6, "子～巳までの任意の十二支を選択する。")],
            [2..3, [
              "［子］浅草寺。浅草の顔ともいえる寺。7世紀に建造された都内でも最古の寺。",
              "［丑］武神一刀流道場。浅草でも有名な剣術道場。柔術や薙刀など、剣以外の実践的な技も教えている。",
              "［寅］待乳の渡し。隅田川を橋で渡る代わりに、乗せて渡ってくれる小舟。",
              "［卯］帝都観光案内館。帝都東京内観光の案内所。ガイドつきのバス観光も行っている。",
              "［辰］神谷バー。老舗の飲食店であり、電気ブランを提供していることで有名。",
              "［巳］雷門。浅草寺の南側に建てられた門で、風神と雷神の像が安置されている。",
            ]],
            [4..5, [
              "［午］仲見世。雷門から浅草寺本堂に続く仁王門まで立ち並ぶ商店街。",
              "［未］仰天堂。やたらと大盛りの食事を提供してくれる人気店。",
              "［申］混沌興行。妖怪たちが演じることで有名な見世物小屋。いつも混み合っている。",
              "［酉］浅草六区。浅草の中心街であり、店舗や演芸場、活動写真館が並んでいる。",
              "［戌］凌雲閣。浅草十二階とも呼ばれる塔。関東大震災でも崩れることなく、そびえ立っている。",
              "［亥］花屋敷。日本最初の遊園地であり、園内には動物園も完備している。",
            ]],
            [6..6, Array.new(6, "午～亥まで任意の十二支を選択する。")],
          ]
        ),
        'UST' => DiceTable::D66LeftRangeTable.new(
          '上野シーン表',
          D66SortType::NO_SORT,
          [
            [1..1, Array.new(6, "子～巳までの任意の十二支を選択する。")],
            [2..3, [
              "［子］上野恩賜公園。桜の名所でもある巨大な公園。敷地内では、四季折々の自然を楽しむことができる。",
              "［丑］東京帝室博物館。宮内省所管の博物館であり、珍しい品々が展示されている。",
              "［寅］上野駅。帝都と地方の路線を繋ぐ駅。地方から上京してくる人々を多く見かける。",
              "［卯］精養軒。本格的な洋食が楽しめる老舗のレストラン。人間、妖怪に限らず上流階級が通っている。",
              "［辰］御徒町。高架下と周辺に所狭しと民家や長屋、様々な店がひしめきあう下町の歓楽街。",
              "［巳］一鉄工場。偏屈で頑固だが有能な老人が経営する工場。自作のラジオが置かれている。",
            ]],
            [4..5, [
              "［午］帝国大学。象徴の赤門が有名な、日本の最高学府。校内には、妖怪研究室がある。",
              "［未］鳳明館。明治創業の旅館。文士が執筆する際に、よく利用している。",
              "［申］黄龍門学園。帝国大学敷地の横にある私立学園。妖怪や半妖も多く通っている。",
              "［酉］不忍池。弁天堂と大黒天堂を構える池で、河童が隠れ住んでいる。",
              "［戌］きさらぎ長屋。行く宛のない者や、行き場をなくした者が集まる長屋。",
              "［亥］上野恩賜公園動物園。ホッキョクグマ舎やサル山をはじめ、珍しい動物が飼われている。",
            ]],
            [6..6, Array.new(6, "午～亥まで任意の十二支を選択する。")],
          ]
        ),
        'NST' => DiceTable::D66LeftRangeTable.new(
          '日本橋シーン表',
          D66SortType::NO_SORT,
          [
            [1..1, Array.new(6, "子～巳までの任意の十二支を選択する。")],
            [2..3, [
              "［子］日本銀行本店。西洋建築の先駆けといえる建築物。帝都事変では大きな被害が出た。",
              "［丑］三越。日本橋に居を構える有数の大型百貨店。この店で揃わぬ物はないとされている。",
              "［寅］日本橋。五つ街道の起点であり、東海道五十三次の出発点としてよく知られる橋。",
              "［卯］メイゾン妖の巣。妖怪や半妖の文学者たちが集うカフェー。",
              "［辰］大正座。明治座の兄弟とよばれる演芸場。歌舞伎や芝居などが上演されている。",
              "［巳］多々良堂。江戸時代より続く退魔具の専門店。多くのあやびとが訪れる。",
            ]],
            [4..5, [
              "［午］妖艶大世界。上海にある上海大世界を真似て、妖怪や半妖が集まってできた新興の花街。",
              "［未］二丁巴里。丸ノ内の一丁倫敦に対して創られた大規模な問屋街。",
              "［申］皇居外苑。桔梗門の前は大広場があり、皇居を訪れる者が集まっている。",
              "［酉］東京駅。皇居に対面する形で作られた煉瓦造りの壮麗な駅。",
              "［戌］丸ノ内ビルヂング。大正12年に竣工した東洋一ともいわれる巨大なビルヂング。",
              "［亥］将門塚。平将門公の御首が祀られる塚。大手町にひっそりと存在している。",
            ]],
            [6..6, Array.new(6, "午～亥まで任意の十二支を選択する。")],
          ]
        ),
        'GST' => DiceTable::D66LeftRangeTable.new(
          '銀座シーン表',
          D66SortType::NO_SORT,
          [
            [1..1, Array.new(6, "子～巳までの任意の十二支を選択する。")],
            [2..3, [
              "［子］ダンスホウル・ガアデン。モダンボーイやモダンガール御用達の帝都東京有数のダンスホウル。",
              "［丑］服部時計店。銀座のシンボルとなっている時計塔と、併設された店舗。",
              "［寅］松屋。大正14年に開店した百貨店。地上7階までの吹き抜けステンドグラスで知られる。",
              "［卯］歌舞伎座。歌舞伎の殿堂。古式ゆかしい意匠を取り入れた最新建築の劇場。",
              "［辰］倫敦橋。文士や芸術家が好んで訪れる2階建ての洋式建築のカフェー。",
              "［巳］資生堂パーラー。ソーダ水やアイスクリンを提供したことで有名な喫茶店。",
            ]],
            [4..5, [
              "［午］カフェープランタン。日本初のカフェーといわれる老舗。富裕層やインテリ層が多く訪れる。",
              "［未］新橋絢爛花街。関東大震災をきっかけに再建された花街。政府高官なども利用している。",
              "［申］鹿鳴館。明治時代を代表する西洋建築。華族や資産家が利用できる施設となっている。",
              "［酉］帝国ホテル。フランク・ロイド・ライトが設計した最新鋭の技術が詰め込まれたホテル。",
              "［戌］妖務省本部。妖務省と妖怪人間共同実働部隊の本部が置かれている。",
              "［亥］帝国劇場。明治時代を代表する日本最大の大劇場で\"帝劇\"の愛称で知られている。",
            ]],
            [6..6, Array.new(6, "午～亥まで任意の十二支を選択する。")],
          ]
        ),
        'KST' => DiceTable::D66LeftRangeTable.new(
          '霞ヶ関シーン表',
          D66SortType::NO_SORT,
          [
            [1..1, Array.new(6, "子～巳までの任意の十二支を選択する。")],
            [2..3, [
              "［子］桜田門。内堀にある門のひとつで皇居に通じている。",
              "［丑］警視庁庁舎。警視庁の総合本部。庁舎内に妖鬼対策本部がある。",
              "［寅］日比谷公園。市民の憩いの場所であり、図書館や音楽堂をそなえる大規模な公園。",
              "［卯］大審院庁舎。司法裁判所の中における最上級審の裁判所。",
              "［辰］私立聖ロザリオ女学園。愛宕山の森に囲まれた都内随一のお嬢様学校。",
              "［巳］片倉組。武家屋敷を改装した本邸であり、帝都屈指のヤクザの根城となっている。",
            ]],
            [4..5, [
              "［午］妖人史料編纂局。妖怪の史料の収集と編纂を目的として設置された官立組織。",
              "［未］鰐淵金融。利子こそ高いが、誰にでも門戸を開いている貸金業者。",
              "［申］料亭山王園。政治家や官僚御用達の料亭。十二真鬼も出入りしている。",
              "［酉］日枝神社。山王祭で知られる神社。数多くの刀剣が納められている。",
              "［戌］国会議事堂。現在建設中の国会議事堂。大正25年に竣工予定で、現在は木造の仮議事堂がある。",
              "［亥］帝国図書館。国立図書館で、国内で出版されたあらゆる書籍が収蔵されている。",
            ]],
            [6..6, Array.new(6, "午～亥まで任意の十二支を選択する。")],
          ]
        ),
        'SST' => DiceTable::D66LeftRangeTable.new(
          '新宿シーン表',
          D66SortType::NO_SORT,
          [
            [1..1, Array.new(6, "子～巳までの任意の十二支を選択する。")],
            [2..3, [
              "［子］武蔵野館。座席数1,200を誇る国内有数の活動大写真館。",
              "［丑］二幸。食料品専門百貨店。あやびとたちに友好的で、伝奇事件が解決すると飲食が提供される。",
              "［寅］高野フルーツパーラー。マスクメロンが有名な果物専門店と、併設された果物が楽しめる飲食店。",
              "［卯］紀伊國屋書店。大正16年に創業した、文士たちが集うサロンのような大型書店。",
              "［辰］新宿御苑。宮内省が管理する皇室のための庭園。封印具の保管庫である浄玻璃ノ宮がある。",
              "［巳］明治神宮。明治天皇と昭憲皇太后を祭神とした神社。境内は厳かな雰囲気に満ちている。",
            ]],
            [4..5, [
              "［午］新宿駅。多摩や小田原からの玄関口となる駅。1日あたりの乗降客数は日本一。",
              "［未］酩酊横丁。長屋が連なる路地に、200軒以上もの居酒屋やバーがひしめいている。",
              "［申］歌楽騒戯通り。関東大震災後に作られた真新しい建物がひしめく歓楽街。",
              "［酉］淀橋浄水場。コレラ流行後に、水道を近代化させるために作られた浄水場。",
              "［戌］新宿大通り。急速な発展を遂げた新宿のメイン通り。",
              "［亥］ほたる屋。妖狐と妖狸が経営している衣料品専門の百貨店。",
            ]],
            [6..6, Array.new(6, "午～亥まで任意の十二支を選択する。")],
          ]
        ),
      }.freeze

      register_prefix('\d*AB', TABLES.keys)
    end
  end
end
