esnya / bcdice-js

[DEPRECATED] BCDice for JavaScript (Browser/Node.js)
MIT License
12 stars 3 forks source link

クトゥルフ神話TRPGの技能判定で大小比較できない #5

Closed ysakasin closed 6 years ago

ysakasin commented 6 years ago

クトゥルフ神話TRPGにおいて技能判定でよく用いる cc<=80 のような大小比較ができない。

どどんとふやBCDice-APIではできているため、bcdice-js固有の問題だと思われる。ねこ卓でも同様の問題が発生している。

問題が起きるサンプルコード

const BCDice = require('bcdice-js').BCDice;

const bcdice = new BCDice();

bcdice.setGameByTitle('Cthulhu');
bcdice.setMessage('cc<=80');
console.log('cc<=80', bcdice.dice_command());

出力

cc<=80 [ ': (1D100) > 67', false ]

期待するダイス結果の例

(1D100<=80) > 71 > 成功

BCDice-APIの場合

https://bcdice.herokuapp.com/v1/diceroll?system=Cthulhu&command=cc%3C=80

参考情報

Cthulhu.rb における ccコマンドは、 1d100のエイリアスおよび追加機能になっている。この判定は Cthulhu#getCheckResultで行なっており、大小比較があるかの判断もこのメソッド内で行なっている。

大小比較の存在判断は正規表現を用いて行われているが、bcdice-js経由だと、これらの判定をすり抜けてしまっているように見える。 https://github.com/torgtaitai/BCDice/blob/e52a91ffe5ad7db35c651a18e0ffe8025be266f7/src/diceBot/Cthulhu.rb#L100

ysakasin commented 6 years ago

~if の中に __last_match_n が生成されていて、 else で参照できなくなっている~

elsif 中に __last_match_n が生成されていない

    if (/CC(B)?(\d+)<=(\d+)/i =~ command)
__last__match__1 = $1
__last__match__2 = $2
__last__match__3 = $3
__last__match__4 = $4
__last__match__5 = $5
__last__match__6 = $6
__last__match__7 = $7
__last__match__8 = $8
__last__match__9 = $9
__last__match__10 = $10
__last__match__11 = $11
__last__match__12 = $12
__last__match__13 = $13
__last__match__14 = $14
__last__match__15 = $15
__last__match__16 = $16
__last__match__17 = $17
__last__match__18 = $18
__last__match__19 = $19
__last__match__20 = $20

      # /\(\d+\)/の()はpattern-killerにカイシャクされるらしい
      broken_num = __last__match__2.to_i
      diff = __last__match__3.to_i
    elsif (/CC(B)?<=(\d+)/i =~ command)
      diff = __last__match__2.to_i
    end