bcdice / BCDice

The most popular TRPG dice command engine in Japan
https://bcdice.org
BSD 3-Clause "New" or "Revised" License
140 stars 184 forks source link

一部のシステムで「2d>=」のように目標値無しにすると落ちる #273

Closed blhsrwznrghfzpr closed 4 years ago

blhsrwznrghfzpr commented 4 years ago

現象

特定システムで 2d>= のように目標値無しのコマンドで例外が発生する。

============================
input:
2d6>= 目標値無し
output:
Insane : (2D6>=) > 7[3,4] > 7 > 失敗
rand:3/6,4/6
============================
上記テストケースの結果
``` [Failures] Game type: Insane Index: 61 Exception: comparison of Integer with String failed Backtrace: C:/Users/blhsr/workspace/BCDice/lib/bcdice/game_system/Insane.rb:72:in `>=' C:/Users/blhsr/workspace/BCDice/lib/bcdice/game_system/Insane.rb:72:in `check_2D6' C:/Users/blhsr/workspace/BCDice/lib/bcdice/base.rb:306:in `check_result' C:/Users/blhsr/workspace/BCDice/lib/bcdice/common_command/add_dice.rb:49:in `eval' C:/Users/blhsr/workspace/BCDice/lib/bcdice/common_command.rb:16:in `block in eval' C:/Users/blhsr/workspace/BCDice/lib/bcdice/common_command.rb:14:in `each' C:/Users/blhsr/workspace/BCDice/lib/bcdice/common_command.rb:14:in `eval' C:/Users/blhsr/workspace/BCDice/lib/bcdice/base.rb:140:in `eval' C:/Users/blhsr/workspace/BCDice/test/DiceBotTest.rb:124:in `block in executeCommand' C:/Users/blhsr/workspace/BCDice/test/DiceBotTest.rb:123:in `each' C:/Users/blhsr/workspace/BCDice/test/DiceBotTest.rb:123:in `executeCommand' C:/Users/blhsr/workspace/BCDice/test/DiceBotTest.rb:90:in `block in doTests' C:/Users/blhsr/workspace/BCDice/test/DiceBotTest.rb:88:in `each' C:/Users/blhsr/workspace/BCDice/test/DiceBotTest.rb:88:in `doTests' C:/Users/blhsr/workspace/BCDice/test/DiceBotTest.rb:29:in `execute' C:/Users/blhsr/workspace/BCDice/test/testDiceBots.rb:2:in `' C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/rake_test_loader.rb:17:in `require' C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/rake_test_loader.rb:17:in `block in
' C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/rake_test_loader.rb:5:in `select' C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/rake_test_loader.rb:5:in `
' Input: 2d6>= 目標値無し Expected: Insane : (2D6>=) > 7[3,4] > 7 > 失敗 Rands: 3/6, 4/6 SimpleCov failed with exit 1rake aborted! Command failed with status (1) ```
ココフォリアでの表示
![image](https://user-images.githubusercontent.com/7685946/92320875-fae39680-f05f-11ea-8544-366f27672649.png)
ユドナリウムでの表示
![image](https://user-images.githubusercontent.com/7685946/92320915-3f6f3200-f060-11ea-8583-0bff7371f608.png)

原因

インセインなどの特定システムだけ発生するので、 check_nDx 系メソッドを 実装しているシステムだけ発生するんだと思います。 インセインでは total >= target の箇所で例外が発生しています。 https://github.com/bcdice/BCDice/blob/e0215e041e2f7734bf8c2914c1499f038b83d3f0/lib/bcdice/game_system/Insane.rb#L62-L77 関連issue) https://github.com/bcdice/BCDice/issues/243

目標値を"?"と比較している箇所で、機械的に""(空文字)とも比較するようにすれば スタックトレースを抑制することができると思います。 もしくは不完全なコマンドを check_nDx 系メソッドに流さないようにするか

ysakasin commented 4 years ago

対処方針

加算ダイスのパーサーを修正して、中途半端な状態は受け付けないようにする

ysakasin commented 4 years ago

なぜか知らんけど現状のv3だと動いちゃう

[DiceBot]> use Insane
[Insane]> 1D6>=
Insane : (1D6>=) > 6 > 失敗
blhsrwznrghfzpr commented 4 years ago

なぜか知らんけど現状のv3だと動いちゃう

インセインは check_2d6 が実装されているので、2d6>= じゃないと落ちないです

ysakasin commented 4 years ago

うっかりしてました……