bcdice 3.12.0 → 3.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -0
- data/lib/bcdice/arithmetic/parser.rb +4 -2
- data/lib/bcdice/base.rb +1 -1
- data/lib/bcdice/command/parser.rb +4 -2
- data/lib/bcdice/common_command/add_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/barabara_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/calc/parser.rb +4 -2
- data/lib/bcdice/common_command/reroll_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/tally_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/upper_dice/parser.rb +4 -2
- data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
- data/lib/bcdice/game_system/Alsetto.rb +2 -2
- data/lib/bcdice/game_system/AniMalus.rb +221 -0
- data/lib/bcdice/game_system/ArknightsFan.rb +182 -0
- data/lib/bcdice/game_system/Avandner.rb +1 -1
- data/lib/bcdice/game_system/BBN.rb +1 -1
- data/lib/bcdice/game_system/BadLife.rb +3 -3
- data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
- data/lib/bcdice/game_system/Chill3.rb +6 -6
- data/lib/bcdice/game_system/DarkSouls.rb +1 -1
- data/lib/bcdice/game_system/Elric.rb +1 -1
- data/lib/bcdice/game_system/FullFace.rb +92 -0
- data/lib/bcdice/game_system/InfiniteFantasia.rb +4 -1
- data/lib/bcdice/game_system/Irisbane.rb +1 -1
- data/lib/bcdice/game_system/KillDeathBusiness.rb +1 -1
- data/lib/bcdice/game_system/KyokoShinshoku.rb +158 -0
- data/lib/bcdice/game_system/Liminal.rb +136 -0
- data/lib/bcdice/game_system/MetalHead.rb +1 -1
- data/lib/bcdice/game_system/MetalHeadExtream.rb +1 -1
- data/lib/bcdice/game_system/NRR.rb +122 -0
- data/lib/bcdice/game_system/NSSQ.rb +1 -1
- data/lib/bcdice/game_system/NightWizard.rb +1 -1
- data/lib/bcdice/game_system/NightWizard3rd.rb +15 -2
- data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
- data/lib/bcdice/game_system/PastFutureParadox.rb +1238 -0
- data/lib/bcdice/game_system/Postman.rb +3 -3
- data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
- data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +1 -1
- data/lib/bcdice/game_system/Ryutama.rb +4 -4
- data/lib/bcdice/game_system/Siren.rb +97 -0
- data/lib/bcdice/game_system/Skynauts.rb +1 -1
- data/lib/bcdice/game_system/Strave.rb +1 -1
- data/lib/bcdice/game_system/TherapieSein.rb +1 -1
- data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
- data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +12 -6
- data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +12 -6
- data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
- data/lib/bcdice/game_system/sword_world/rating_parser.rb +4 -2
- data/lib/bcdice/game_system.rb +8 -0
- data/lib/bcdice/loader.rb +1 -1
- data/lib/bcdice/version.rb +1 -1
- metadata +27 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c364b7cf3805345490d3e93d448a79b6575817d21bb9706ef3a792f8be0fb748
         | 
| 4 | 
            +
              data.tar.gz: 6cc52cf4ba2c97c4a053f3b0e4e412e7982751ae0744f4554d6b9d4480948257
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: e8acaab5a72d4e8aac101337796249a8acd615a37c0ade50a01679ed9aaf281cb7450c40912f1bef8e292a18d0ee5951ac4fee618061111b4644418c28643b6e
         | 
| 7 | 
            +
              data.tar.gz: a6d7c34f493d0b546c380f000adfeb5d40e4d17df95632bf178fb98e4c6c42ed944f501a17e4055f088d27cf564ea9273f76fd65a7e5c0c1ed61de95d730764e
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,5 +1,32 @@ | |
| 1 1 | 
             
            # Change Log
         | 
| 2 2 |  | 
| 3 | 
            +
            ## 3.13.0 2024/02/08
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ### 対応ゲームシステムの追加
         | 
| 6 | 
            +
            - 終末アイドル育成TRPGセイレーン (Siren): 蜂紫さんありがとうっ! ([#663](https://github.com/bcdice/BCDice/pull/663))
         | 
| 7 | 
            +
            - リミナル (Liminal): Facelessさんありがとうっ! ([#664](https://github.com/bcdice/BCDice/pull/664))
         | 
| 8 | 
            +
            - アークナイツTRPG by Dapto (ArknightsFan): Ayase00さんありがとうっ! ([#666](https://github.com/bcdice/BCDice/pull/666))
         | 
| 9 | 
            +
            - フルフェイス (FullFace): Facelessさんありがとうっ! ([#668](https://github.com/bcdice/BCDice/pull/668))
         | 
| 10 | 
            +
            - アニマラス (AniMalus): Facelessさんありがとうっ! ([#669](https://github.com/bcdice/BCDice/pull/669))
         | 
| 11 | 
            +
            - パストフューチャーパラドックス (PastFutureParadox): hikoyamamayoさんありがとうっ! ([#673](https://github.com/bcdice/BCDice/pull/673))
         | 
| 12 | 
            +
            - 虚構侵蝕TRPG (KyokoShinshoku) ([#674](https://github.com/bcdice/BCDice/pull/674))
         | 
| 13 | 
            +
            - nRR (NRR) ([#675](https://github.com/bcdice/BCDice/pull/675))
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            ### 変更
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            - RuneQuest:Roleplaying in Glorantha: システム名を英語から日本語に変更。フレッド緑野さんありがとうっ! ([#662](https://github.com/bcdice/BCDice/pull/662))
         | 
| 18 | 
            +
            - Vampire: The Masquerade 5th Edition: ダイスプールよりHungerダイスよりが大きい時に全てのダイスがHungerダイスになるよう変更。フレッド緑野さんありがとうっ! ([#670](https://github.com/bcdice/BCDice/pull/670))
         | 
| 19 | 
            +
            - Werewolf: The Apocalypse 5th Edition:  ダイスプールよりRageダイスよりが大きい時に全てのダイスがRageダイスになるよう変更。フレッド緑野さんありがとうっ! ([#671](https://github.com/bcdice/BCDice/pull/671))
         | 
| 20 | 
            +
            - Chill 3rd Edition: 成否の表記をルールに合わせて変更。Facelessさんありがとうっ! ([#672](https://github.com/bcdice/BCDice/pull/672))
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            ### 誤植修正
         | 
| 23 | 
            +
            - ナイトウィザード The 3rd Edition: ヘルプメッセージの誤りを修正。opparcoさんありがとうっ! ([#667](https://github.com/bcdice/BCDice/pull/667))
         | 
| 24 | 
            +
            - 無限のファンタジア: 成功レベルの判定方法を記載。 ([#676](https://github.com/bcdice/BCDice/pull/676))
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            ### 開発
         | 
| 27 | 
            +
            - Ruby 3.3をサポートバージョンに追加 ([#665](https://github.com/bcdice/BCDice/pull/665))
         | 
| 28 | 
            +
            - Ruby 2.6をサポートバージョンから除外 ([#665](https://github.com/bcdice/BCDice/pull/665))
         | 
| 29 | 
            +
             | 
| 3 30 | 
             
            ## 3.12.0 2023/12/04
         | 
| 4 31 |  | 
| 5 32 | 
             
            ### 対応ゲームシステムの追加
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            #
         | 
| 2 2 | 
             
            # DO NOT MODIFY!!!!
         | 
| 3 | 
            -
            # This file is automatically generated by Racc 1. | 
| 4 | 
            -
            # from Racc grammar file "".
         | 
| 3 | 
            +
            # This file is automatically generated by Racc 1.7.3
         | 
| 4 | 
            +
            # from Racc grammar file "parser.y".
         | 
| 5 5 | 
             
            #
         | 
| 6 6 |  | 
| 7 7 | 
             
            require 'racc/parser.rb'
         | 
| @@ -130,6 +130,7 @@ Racc_arg = [ | |
| 130 130 | 
             
              racc_shift_n,
         | 
| 131 131 | 
             
              racc_reduce_n,
         | 
| 132 132 | 
             
              racc_use_result_var ]
         | 
| 133 | 
            +
            Ractor.make_shareable(Racc_arg) if defined?(Ractor)
         | 
| 133 134 |  | 
| 134 135 | 
             
            Racc_token_to_s_table = [
         | 
| 135 136 | 
             
              "$end",
         | 
| @@ -151,6 +152,7 @@ Racc_token_to_s_table = [ | |
| 151 152 | 
             
              "unary",
         | 
| 152 153 | 
             
              "round_type",
         | 
| 153 154 | 
             
              "term" ]
         | 
| 155 | 
            +
            Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)
         | 
| 154 156 |  | 
| 155 157 | 
             
            Racc_debug_parser = false
         | 
| 156 158 |  | 
    
        data/lib/bcdice/base.rb
    CHANGED
    
    | @@ -58,7 +58,7 @@ module BCDice | |
| 58 58 | 
             
                    @prefixes.freeze
         | 
| 59 59 | 
             
                    pattarns = CommonCommand::COMMANDS.map { |c| c::PREFIX_PATTERN.source } + @prefixes
         | 
| 60 60 |  | 
| 61 | 
            -
                    @command_pattern = /^S?(#{pattarns.join( | 
| 61 | 
            +
                    @command_pattern = /^S?(#{pattarns.join('|')})/i.freeze
         | 
| 62 62 | 
             
                  end
         | 
| 63 63 |  | 
| 64 64 | 
             
                  # @param command [String]
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            #
         | 
| 2 2 | 
             
            # DO NOT MODIFY!!!!
         | 
| 3 | 
            -
            # This file is automatically generated by Racc 1. | 
| 4 | 
            -
            # from Racc grammar file "".
         | 
| 3 | 
            +
            # This file is automatically generated by Racc 1.7.3
         | 
| 4 | 
            +
            # from Racc grammar file "parser.y".
         | 
| 5 5 | 
             
            #
         | 
| 6 6 |  | 
| 7 7 | 
             
            require 'racc/parser.rb'
         | 
| @@ -312,6 +312,7 @@ Racc_arg = [ | |
| 312 312 | 
             
              racc_shift_n,
         | 
| 313 313 | 
             
              racc_reduce_n,
         | 
| 314 314 | 
             
              racc_use_result_var ]
         | 
| 315 | 
            +
            Ractor.make_shareable(Racc_arg) if defined?(Ractor)
         | 
| 315 316 |  | 
| 316 317 | 
             
            Racc_token_to_s_table = [
         | 
| 317 318 | 
             
              "$end",
         | 
| @@ -344,6 +345,7 @@ Racc_token_to_s_table = [ | |
| 344 345 | 
             
              "mul",
         | 
| 345 346 | 
             
              "add",
         | 
| 346 347 | 
             
              "round_type" ]
         | 
| 348 | 
            +
            Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)
         | 
| 347 349 |  | 
| 348 350 | 
             
            Racc_debug_parser = false
         | 
| 349 351 |  | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            #
         | 
| 2 2 | 
             
            # DO NOT MODIFY!!!!
         | 
| 3 | 
            -
            # This file is automatically generated by Racc 1. | 
| 4 | 
            -
            # from Racc grammar file "".
         | 
| 3 | 
            +
            # This file is automatically generated by Racc 1.7.3
         | 
| 4 | 
            +
            # from Racc grammar file "parser.y".
         | 
| 5 5 | 
             
            #
         | 
| 6 6 |  | 
| 7 7 | 
             
            require 'racc/parser.rb'
         | 
| @@ -200,6 +200,7 @@ Racc_arg = [ | |
| 200 200 | 
             
              racc_shift_n,
         | 
| 201 201 | 
             
              racc_reduce_n,
         | 
| 202 202 | 
             
              racc_use_result_var ]
         | 
| 203 | 
            +
            Ractor.make_shareable(Racc_arg) if defined?(Ractor)
         | 
| 203 204 |  | 
| 204 205 | 
             
            Racc_token_to_s_table = [
         | 
| 205 206 | 
             
              "$end",
         | 
| @@ -242,6 +243,7 @@ Racc_token_to_s_table = [ | |
| 242 243 | 
             
              "filter_type",
         | 
| 243 244 | 
             
              "filter_type_with_shorthand",
         | 
| 244 245 | 
             
              "filter_shorthand" ]
         | 
| 246 | 
            +
            Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)
         | 
| 245 247 |  | 
| 246 248 | 
             
            Racc_debug_parser = false
         | 
| 247 249 |  | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            #
         | 
| 2 2 | 
             
            # DO NOT MODIFY!!!!
         | 
| 3 | 
            -
            # This file is automatically generated by Racc 1. | 
| 4 | 
            -
            # from Racc grammar file "".
         | 
| 3 | 
            +
            # This file is automatically generated by Racc 1.7.3
         | 
| 4 | 
            +
            # from Racc grammar file "parser.y".
         | 
| 5 5 | 
             
            #
         | 
| 6 6 |  | 
| 7 7 | 
             
            require 'racc/parser.rb'
         | 
| @@ -154,6 +154,7 @@ Racc_arg = [ | |
| 154 154 | 
             
              racc_shift_n,
         | 
| 155 155 | 
             
              racc_reduce_n,
         | 
| 156 156 | 
             
              racc_use_result_var ]
         | 
| 157 | 
            +
            Ractor.make_shareable(Racc_arg) if defined?(Ractor)
         | 
| 157 158 |  | 
| 158 159 | 
             
            Racc_token_to_s_table = [
         | 
| 159 160 | 
             
              "$end",
         | 
| @@ -190,6 +191,7 @@ Racc_token_to_s_table = [ | |
| 190 191 | 
             
              "mul",
         | 
| 191 192 | 
             
              "unary",
         | 
| 192 193 | 
             
              "round_type" ]
         | 
| 194 | 
            +
            Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)
         | 
| 193 195 |  | 
| 194 196 | 
             
            Racc_debug_parser = false
         | 
| 195 197 |  | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            #
         | 
| 2 2 | 
             
            # DO NOT MODIFY!!!!
         | 
| 3 | 
            -
            # This file is automatically generated by Racc 1. | 
| 4 | 
            -
            # from Racc grammar file "".
         | 
| 3 | 
            +
            # This file is automatically generated by Racc 1.7.3
         | 
| 4 | 
            +
            # from Racc grammar file "parser.y".
         | 
| 5 5 | 
             
            #
         | 
| 6 6 |  | 
| 7 7 | 
             
            require 'racc/parser.rb'
         | 
| @@ -138,6 +138,7 @@ Racc_arg = [ | |
| 138 138 | 
             
              racc_shift_n,
         | 
| 139 139 | 
             
              racc_reduce_n,
         | 
| 140 140 | 
             
              racc_use_result_var ]
         | 
| 141 | 
            +
            Ractor.make_shareable(Racc_arg) if defined?(Ractor)
         | 
| 141 142 |  | 
| 142 143 | 
             
            Racc_token_to_s_table = [
         | 
| 143 144 | 
             
              "$end",
         | 
| @@ -162,6 +163,7 @@ Racc_token_to_s_table = [ | |
| 162 163 | 
             
              "unary",
         | 
| 163 164 | 
             
              "round_type",
         | 
| 164 165 | 
             
              "term" ]
         | 
| 166 | 
            +
            Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)
         | 
| 165 167 |  | 
| 166 168 | 
             
            Racc_debug_parser = false
         | 
| 167 169 |  | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            #
         | 
| 2 2 | 
             
            # DO NOT MODIFY!!!!
         | 
| 3 | 
            -
            # This file is automatically generated by Racc 1. | 
| 4 | 
            -
            # from Racc grammar file "".
         | 
| 3 | 
            +
            # This file is automatically generated by Racc 1.7.3
         | 
| 4 | 
            +
            # from Racc grammar file "parser.y".
         | 
| 5 5 | 
             
            #
         | 
| 6 6 |  | 
| 7 7 | 
             
            require 'racc/parser.rb'
         | 
| @@ -175,6 +175,7 @@ Racc_arg = [ | |
| 175 175 | 
             
              racc_shift_n,
         | 
| 176 176 | 
             
              racc_reduce_n,
         | 
| 177 177 | 
             
              racc_use_result_var ]
         | 
| 178 | 
            +
            Ractor.make_shareable(Racc_arg) if defined?(Ractor)
         | 
| 178 179 |  | 
| 179 180 | 
             
            Racc_token_to_s_table = [
         | 
| 180 181 | 
             
              "$end",
         | 
| @@ -212,6 +213,7 @@ Racc_token_to_s_table = [ | |
| 212 213 | 
             
              "mul",
         | 
| 213 214 | 
             
              "unary",
         | 
| 214 215 | 
             
              "round_type" ]
         | 
| 216 | 
            +
            Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)
         | 
| 215 217 |  | 
| 216 218 | 
             
            Racc_debug_parser = false
         | 
| 217 219 |  | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            #
         | 
| 2 2 | 
             
            # DO NOT MODIFY!!!!
         | 
| 3 | 
            -
            # This file is automatically generated by Racc 1. | 
| 4 | 
            -
            # from Racc grammar file "".
         | 
| 3 | 
            +
            # This file is automatically generated by Racc 1.7.3
         | 
| 4 | 
            +
            # from Racc grammar file "parser.y".
         | 
| 5 5 | 
             
            #
         | 
| 6 6 |  | 
| 7 7 | 
             
            require 'racc/parser.rb'
         | 
| @@ -144,6 +144,7 @@ Racc_arg = [ | |
| 144 144 | 
             
              racc_shift_n,
         | 
| 145 145 | 
             
              racc_reduce_n,
         | 
| 146 146 | 
             
              racc_use_result_var ]
         | 
| 147 | 
            +
            Ractor.make_shareable(Racc_arg) if defined?(Ractor)
         | 
| 147 148 |  | 
| 148 149 | 
             
            Racc_token_to_s_table = [
         | 
| 149 150 | 
             
              "$end",
         | 
| @@ -173,6 +174,7 @@ Racc_token_to_s_table = [ | |
| 173 174 | 
             
              "mul",
         | 
| 174 175 | 
             
              "unary",
         | 
| 175 176 | 
             
              "round_type" ]
         | 
| 177 | 
            +
            Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)
         | 
| 176 178 |  | 
| 177 179 | 
             
            Racc_debug_parser = false
         | 
| 178 180 |  | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            #
         | 
| 2 2 | 
             
            # DO NOT MODIFY!!!!
         | 
| 3 | 
            -
            # This file is automatically generated by Racc 1. | 
| 4 | 
            -
            # from Racc grammar file "".
         | 
| 3 | 
            +
            # This file is automatically generated by Racc 1.7.3
         | 
| 4 | 
            +
            # from Racc grammar file "parser.y".
         | 
| 5 5 | 
             
            #
         | 
| 6 6 |  | 
| 7 7 | 
             
            require 'racc/parser.rb'
         | 
| @@ -181,6 +181,7 @@ Racc_arg = [ | |
| 181 181 | 
             
              racc_shift_n,
         | 
| 182 182 | 
             
              racc_reduce_n,
         | 
| 183 183 | 
             
              racc_use_result_var ]
         | 
| 184 | 
            +
            Ractor.make_shareable(Racc_arg) if defined?(Ractor)
         | 
| 184 185 |  | 
| 185 186 | 
             
            Racc_token_to_s_table = [
         | 
| 186 187 | 
             
              "$end",
         | 
| @@ -220,6 +221,7 @@ Racc_token_to_s_table = [ | |
| 220 221 | 
             
              "term",
         | 
| 221 222 | 
             
              "unary",
         | 
| 222 223 | 
             
              "round_type" ]
         | 
| 224 | 
            +
            Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)
         | 
| 223 225 |  | 
| 224 226 | 
             
            Racc_debug_parser = false
         | 
| 225 227 |  | 
| @@ -102,7 +102,7 @@ module BCDice | |
| 102 102 | 
             
                      totalDamage = totalSuccessCount * damage + totalCriticalCount * criticalTrigger
         | 
| 103 103 |  | 
| 104 104 | 
             
                      result += "(#{diceCount}D10\<\=#{target}) > #{text} > Hits:#{totalSuccessCount}*#{damage}"
         | 
| 105 | 
            -
                      result += " + Trigger:#{totalCriticalCount}*#{criticalTrigger}" if | 
| 105 | 
            +
                      result += " + Trigger:#{totalCriticalCount}*#{criticalTrigger}" if criticalTrigger > 0
         | 
| 106 106 | 
             
                      result += " > #{totalDamage}ダメージ"
         | 
| 107 107 | 
             
                    else
         | 
| 108 108 | 
             
                      result += "(#{diceCount}D10\<\=#{target}) > #{text} > 成功数:#{totalSuccessCount}"
         | 
| @@ -50,7 +50,7 @@ module BCDice | |
| 50 50 | 
             
                    if command =~ /(\d+)AL(C|G)?(\d+)?((x|\*)(\d+))?$/i
         | 
| 51 51 | 
             
                      rapid = Regexp.last_match(1).to_i
         | 
| 52 52 | 
             
                      isCritical = Regexp.last_match(2).nil?
         | 
| 53 | 
            -
                      if | 
| 53 | 
            +
                      if isCritical
         | 
| 54 54 | 
             
                        criticalNumber = 1
         | 
| 55 55 | 
             
                      else
         | 
| 56 56 | 
             
                        if Regexp.last_match(2) == "G"
         | 
| @@ -98,7 +98,7 @@ module BCDice | |
| 98 98 | 
             
                      text += "+" unless text.empty?
         | 
| 99 99 | 
             
                      text += "#{successCount}[#{diceText}]"
         | 
| 100 100 |  | 
| 101 | 
            -
                      break unless | 
| 101 | 
            +
                      break unless isCritical
         | 
| 102 102 |  | 
| 103 103 | 
             
                      rollCount = criticalCount
         | 
| 104 104 | 
             
                    end
         | 
| @@ -0,0 +1,221 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module BCDice
         | 
| 4 | 
            +
              module GameSystem
         | 
| 5 | 
            +
                class AniMalus < Base
         | 
| 6 | 
            +
                  # ゲームシステムの識別子
         | 
| 7 | 
            +
                  ID = 'AniMalus'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  # ゲームシステム名
         | 
| 10 | 
            +
                  NAME = 'アニマラス'
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  # ゲームシステム名の読みがな
         | 
| 13 | 
            +
                  SORT_KEY = 'あにまらす'
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  # ダイスボットの使い方
         | 
| 16 | 
            +
                  HELP_MESSAGE = <<~INFO_MESSAGETEXT
         | 
| 17 | 
            +
                    ■ステータスのダイス判定 nAM<=t,x        n:能力値 t:成功値 x:必要成功数
         | 
| 18 | 
            +
                    例)3AM<=2,1: ダイスを3個振って、成功値2,必要成功数1で判定。その結果(成功数,成功・失敗)を表示
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    ■探索技能のダイス判定 AI<=t,x        t:探索技能レベル x:必要成功数
         | 
| 21 | 
            +
                    例)AI<=3,1: ダイスを3個振って、探索技能レベル3,必要成功数1で判定。その結果(成功数,成功・失敗)を表示
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    ■攻撃判定 AA<=t        t:戦闘技能レベル
         | 
| 24 | 
            +
                    例)AA<=3: ダイスを3個振って、戦闘技能レベル3で判定。その結果(成功・失敗,ダメージ,クリティカル,ファンブル)を表示
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    ■防御判定 AG=t        t:攻撃技能レベル
         | 
| 27 | 
            +
                    例)AG=2: ダイスを3個振って、攻撃技能レベル2で判定。その結果(成功・失敗,ダメージ,クリティカル,ファンブル)を表示
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                    ■回避判定 AD=t        t:攻撃技能レベル
         | 
| 30 | 
            +
                    例)AD=3: ダイスを1個振って、攻撃技能レベル3で判定。その結果(成功・失敗)を表示
         | 
| 31 | 
            +
                  INFO_MESSAGETEXT
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  register_prefix('\d*A[MIAGD]')
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  def initialize(command)
         | 
| 36 | 
            +
                    super(command)
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    @sort_barabara_dice = true # バラバラロール(Bコマンド)でソート有
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  def eval_game_system_specific_command(command)
         | 
| 42 | 
            +
                    resolute_action(command) ||
         | 
| 43 | 
            +
                      resolute_investigation(command) ||
         | 
| 44 | 
            +
                      resolute_attacking(command) ||
         | 
| 45 | 
            +
                      resolute_guarding(command) ||
         | 
| 46 | 
            +
                      resolute_dodging(command)
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  private
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                  # ステータスの判定
         | 
| 52 | 
            +
                  # @param [String] command
         | 
| 53 | 
            +
                  # @return [Result]
         | 
| 54 | 
            +
                  def resolute_action(command)
         | 
| 55 | 
            +
                    m = /^(\d+)AM<=(\d+),(\d)$/.match(command)
         | 
| 56 | 
            +
                    return nil unless m
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    num_dice = m[1].to_i
         | 
| 59 | 
            +
                    num_target = m[2].to_i
         | 
| 60 | 
            +
                    num_success = m[3].to_i
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                    dice = @randomizer.roll_barabara(num_dice, 6).sort
         | 
| 63 | 
            +
                    dice_text = dice.join(",")
         | 
| 64 | 
            +
                    success_num = dice.count { |val| val <= num_target }
         | 
| 65 | 
            +
                    output = "(#{num_dice}AM<=#{num_target},#{num_success}) > #{dice_text} > 成功数#{success_num}"
         | 
| 66 | 
            +
                    if success_num >= num_success
         | 
| 67 | 
            +
                      output += " > 成功"
         | 
| 68 | 
            +
                      return Result.success(output)
         | 
| 69 | 
            +
                    else
         | 
| 70 | 
            +
                      output += " > 失敗"
         | 
| 71 | 
            +
                      return Result.failure(output)
         | 
| 72 | 
            +
                    end
         | 
| 73 | 
            +
                  end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                  # 探索技能の判定
         | 
| 76 | 
            +
                  # @param [String] command
         | 
| 77 | 
            +
                  # @return [Result]
         | 
| 78 | 
            +
                  def resolute_investigation(command)
         | 
| 79 | 
            +
                    m = /^AI<=(\d+),(\d)$/.match(command)
         | 
| 80 | 
            +
                    return nil unless m
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                    num_target = m[1].to_i
         | 
| 83 | 
            +
                    num_success = m[2].to_i
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                    dice = @randomizer.roll_barabara(3, 6).sort
         | 
| 86 | 
            +
                    dice_text = dice.join(",")
         | 
| 87 | 
            +
                    success_num = dice.count { |val| val <= num_target }
         | 
| 88 | 
            +
                    output = "(AI<=#{num_target},#{num_success}) > #{dice_text} > 成功数#{success_num}"
         | 
| 89 | 
            +
                    if success_num >= num_success
         | 
| 90 | 
            +
                      output += " > 成功"
         | 
| 91 | 
            +
                      return Result.success(output)
         | 
| 92 | 
            +
                    else
         | 
| 93 | 
            +
                      output += " > 失敗"
         | 
| 94 | 
            +
                      return Result.failure(output)
         | 
| 95 | 
            +
                    end
         | 
| 96 | 
            +
                  end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                  # 攻撃技能の判定
         | 
| 99 | 
            +
                  # @param [String] command
         | 
| 100 | 
            +
                  # @return [Result]
         | 
| 101 | 
            +
                  def resolute_attacking(command)
         | 
| 102 | 
            +
                    m = /^AA<=(\d+)$/.match(command)
         | 
| 103 | 
            +
                    return nil unless m
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                    num_target = m[1].to_i
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                    dice = @randomizer.roll_barabara(3, 6).sort
         | 
| 108 | 
            +
                    dice_text = dice.join(",")
         | 
| 109 | 
            +
                    success_num = dice.count { |val| val <= num_target }
         | 
| 110 | 
            +
                    is_critical = dice[0] == 1 && dice[1] == 2 && dice[2] == 3
         | 
| 111 | 
            +
                    is_fumble = dice[0] == 4 && dice[1] == 5 && dice[2] == 6
         | 
| 112 | 
            +
                    damage1 = dice.max
         | 
| 113 | 
            +
                    damage2 = dice.max
         | 
| 114 | 
            +
                    if dice[0] == dice[1] && dice[1] == dice[2] && dice[2] <= num_target
         | 
| 115 | 
            +
                      damage2 += 6
         | 
| 116 | 
            +
                      damage1 = damage2
         | 
| 117 | 
            +
                    elsif dice[0] == dice[1] && dice[1] <= num_target
         | 
| 118 | 
            +
                      damage2 += 3
         | 
| 119 | 
            +
                    elsif dice[1] == dice[2] && dice[2] <= num_target
         | 
| 120 | 
            +
                      damage2 += 3
         | 
| 121 | 
            +
                    end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                    return Result.new.tap do |result|
         | 
| 124 | 
            +
                      result.critical = is_critical
         | 
| 125 | 
            +
                      result.fumble = is_fumble
         | 
| 126 | 
            +
                      result.condition = (success_num > 0)
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                      sequence = [
         | 
| 129 | 
            +
                        "(AA<=#{num_target})",
         | 
| 130 | 
            +
                        dice_text,
         | 
| 131 | 
            +
                        "成功数#{success_num}",
         | 
| 132 | 
            +
                        if result.success?
         | 
| 133 | 
            +
                          "成功"
         | 
| 134 | 
            +
                        else
         | 
| 135 | 
            +
                          "失敗"
         | 
| 136 | 
            +
                        end
         | 
| 137 | 
            +
                      ].compact
         | 
| 138 | 
            +
                      if result.success?
         | 
| 139 | 
            +
                        if damage1 == damage2
         | 
| 140 | 
            +
                          sequence.push("ダメージ(#{damage1})")
         | 
| 141 | 
            +
                        else
         | 
| 142 | 
            +
                          sequence.push("ダメージ(#{damage1}か#{damage2})")
         | 
| 143 | 
            +
                        end
         | 
| 144 | 
            +
                      end
         | 
| 145 | 
            +
                      sequence.push("クリティカル") if result.critical?
         | 
| 146 | 
            +
                      sequence.push("ファンブル") if result.fumble?
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                      result.text = sequence.join(" > ")
         | 
| 149 | 
            +
                    end
         | 
| 150 | 
            +
                  end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                  # 防御技能の判定
         | 
| 153 | 
            +
                  # @param [String] command
         | 
| 154 | 
            +
                  # @return [Result]
         | 
| 155 | 
            +
                  def resolute_guarding(command)
         | 
| 156 | 
            +
                    m = /^AG=(\d+)$/.match(command)
         | 
| 157 | 
            +
                    return nil unless m
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                    num_target = m[1].to_i
         | 
| 160 | 
            +
             | 
| 161 | 
            +
                    dice = @randomizer.roll_barabara(3, 6).sort
         | 
| 162 | 
            +
                    dice_text = dice.join(",")
         | 
| 163 | 
            +
                    success_num = dice.count(num_target)
         | 
| 164 | 
            +
                    is_critical = dice[0] == 1 && dice[1] == 2 && dice[2] == 3
         | 
| 165 | 
            +
                    is_fumble = dice[0] == 4 && dice[1] == 5 && dice[2] == 6
         | 
| 166 | 
            +
             | 
| 167 | 
            +
                    return Result.new.tap do |result|
         | 
| 168 | 
            +
                      result.critical = is_critical
         | 
| 169 | 
            +
                      result.fumble = is_fumble
         | 
| 170 | 
            +
                      result.condition = (success_num > 0)
         | 
| 171 | 
            +
             | 
| 172 | 
            +
                      sequence = [
         | 
| 173 | 
            +
                        "(AG=#{num_target})",
         | 
| 174 | 
            +
                        dice_text,
         | 
| 175 | 
            +
                        "成功数#{success_num}",
         | 
| 176 | 
            +
                        if result.success?
         | 
| 177 | 
            +
                          "成功 > ダメージ軽減(#{success_num * 2})"
         | 
| 178 | 
            +
                        else
         | 
| 179 | 
            +
                          "失敗"
         | 
| 180 | 
            +
                        end
         | 
| 181 | 
            +
                      ].compact
         | 
| 182 | 
            +
                      sequence.push("クリティカル") if result.critical?
         | 
| 183 | 
            +
                      sequence.push("ファンブル") if result.fumble?
         | 
| 184 | 
            +
             | 
| 185 | 
            +
                      result.text = sequence.join(" > ")
         | 
| 186 | 
            +
                    end
         | 
| 187 | 
            +
                  end
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                  # 回避技能の判定
         | 
| 190 | 
            +
                  # @param [String] command
         | 
| 191 | 
            +
                  # @return [Result]
         | 
| 192 | 
            +
                  def resolute_dodging(command)
         | 
| 193 | 
            +
                    m = /^AD=(\d+)$/.match(command)
         | 
| 194 | 
            +
                    return nil unless m
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                    num_target = m[1].to_i
         | 
| 197 | 
            +
             | 
| 198 | 
            +
                    dice = @randomizer.roll_barabara(1, 6)
         | 
| 199 | 
            +
                    dice_text = dice.join(",")
         | 
| 200 | 
            +
                    success_num = dice.count(num_target)
         | 
| 201 | 
            +
             | 
| 202 | 
            +
                    return Result.new.tap do |result|
         | 
| 203 | 
            +
                      result.condition = (success_num > 0)
         | 
| 204 | 
            +
             | 
| 205 | 
            +
                      sequence = [
         | 
| 206 | 
            +
                        "(AD=#{num_target})",
         | 
| 207 | 
            +
                        dice_text,
         | 
| 208 | 
            +
                        "成功数#{success_num}",
         | 
| 209 | 
            +
                        if result.success?
         | 
| 210 | 
            +
                          "成功(ダメージ無効)"
         | 
| 211 | 
            +
                        else
         | 
| 212 | 
            +
                          "失敗"
         | 
| 213 | 
            +
                        end
         | 
| 214 | 
            +
                      ].compact
         | 
| 215 | 
            +
             | 
| 216 | 
            +
                      result.text = sequence.join(" > ")
         | 
| 217 | 
            +
                    end
         | 
| 218 | 
            +
                  end
         | 
| 219 | 
            +
                end
         | 
| 220 | 
            +
              end
         | 
| 221 | 
            +
            end
         |