raa0121 / GoBCDice

GoBCDice is BCDice reimplemented by Go.
BSD 3-Clause "New" or "Revised" License
9 stars 2 forks source link

加算ロールの成功判定を実装する #12

Closed ochaochaocha3 closed 5 years ago

ochaochaocha3 commented 5 years ago

https://github.com/bcdice/BCDice/blob/v2.03.01/docs/README.txt

加算ロールの結果に条件式で目標値を指定して、ゲーム固有の成功度判定を自動表示することができます。現在は"<="と">="のみ対応。判定のためにはゲーム設定を行う必要があります。成功度を必要としない成功か失敗のみの判定は、ゲーム設定無しでも出来ます。

基本的には比較演算子の実装なので、バラバラロールと同様に以下の演算子を実装すればよい。

抽象構文木の例

評価の対象とする型、結果の型

単純な成功判定ならば以下でよさそう。とりあえず今は論理型を返すのみにしたい。

object.Integer 演算子 object.Integer -> object.Boolean

TODO:クリティカルやファンブルはどうするか?(必要なゲームシステムのダイスボットを実装するときに考えたい)

結果のメッセージの例

ochaochaocha3 commented 5 years ago

コマンド実行まで実装できたが、-2d6<-7 のような入力の中置表記において、(-2d6)<(-7) のように単項マイナスが必ず括弧で囲まれる問題があるため、修正が必要。以下の部分において無条件に前置式を括弧で囲んでいることが問題点だと思われる。

https://github.com/raa0121/GoBCDice/blob/e8ad485576308290cdfd16e653114aa45161c917/pkg/core/notation/notation.go#L98-L113

ochaochaocha3 commented 5 years ago

ただ、上記の部分のParenthesizeを除いてしまうと、2*(-3) のようなパターンで 2*-3 と括弧が除かれてしまう問題がある。比較式は右辺のルートノードが単項マイナスでも括弧で囲わないという点で多項式に含まれる演算子とは異なるため、単に比較式を特別扱いすれば簡潔な書き方で解決できる気がする。