Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

加算ダイスで目標値に?をした時に、一部のシステムで例外になる問題を修正 #244

Merged
merged 1 commit into from
Jul 18, 2020

Conversation

ysakasin
Copy link
Member

@ysakasin ysakasin commented Jul 18, 2020

各システムで独自に成否判定を実装するBCDice#check_nDx系のメソッドで、
多くのシステムで目標値に?が来ることを想定していない書き方がされており、
目標値?とすると例外が発生してしまっていた。

これを、目標値?の時には空白文字列を返すように修正した。
空白文字列が返されると他のcheck系メソッドにフォールバックされ、最終的に
BCDice#check_nDxから "失敗" が返される。

目標値を?にできるのはほとんどのマニュアルに書かれておらず、認知度も低いが、
TunnelsAndTrollsやNightmareHunterDeepで積極的に利用される可能性が高いため、
引き続きサポートする必要があった。

Fix #243

修正方法

1.以下の文字列をgrepして対象システムの洗い出し

  • def check_1D100
  • def check_1D20
  • def check_2D6
  • def check_nD10
  • def check_nD6

2.それらのメソッド内で ? の検証をしていないメソッドの行頭に以下の一文を追加

return '' if target == '?'

3.ダイスの数に応じて、下記のようなテストを追加

input:
3D6>=? 目標値?でバグらない
output:
Arianrhod : (3D6>=?) > 9[3,3,3] > 9 > 失敗
rand:3/6,3/6,3/6

各システムで独自に成否判定を実装するBCDice#check_nDx系のメソッドで、
多くのシステムで目標値に?が来ることを想定していない書き方がされており、
目標値?とすると例外が発生してしまっていた。

これを、目標値?の時には空白文字列を返すように修正した。
空白文字列が返されると他のcheck系メソッドにフォールバックされ、最終的に
BCDice#check_nDxから "失敗" が返される。

目標値を?にできるのはほとんどのマニュアルに書かれておらず、認知度も低いが、
TunnelsAndTrollsやNightmareHunterDeepで積極的に利用される可能性が高いため、
引き続きサポートする必要があった。

Fix #243
@ysakasin ysakasin added the bug バグってる! label Jul 18, 2020
@ysakasin ysakasin requested a review from ochaochaocha3 July 18, 2020 09:08
Copy link
Member

@ochaochaocha3 ochaochaocha3 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

網羅的な確認&修正おつかれさまです。テストで正常動作を確認できているため、問題ないと思います。

@ochaochaocha3
Copy link
Member

ochaochaocha3 commented Jul 18, 2020

毎回 ? のチェックを書くのが面倒なのと、多くの場合は 2D6>= など比較演算子も固定なので、v3でこれを書きやすくするDSL的なクラスメソッドを用意するのも一案かもしれません。

イメージ:

class KariDice < DiceBot
  test_for '2d6', :>= do |total, dice_total, values, target|
    if dice_total <= 2
      'ファンブル'
    elsif dice_total >= 12
      'クリティカル'
    end
  end

  test_for '1d100', :<=, allow_question_mark: true do |total, dice_total, values, target|
    # "?" も想定した処理
  end
end

@ysakasin ysakasin merged commit 083bc6c into master Jul 18, 2020
@ysakasin ysakasin deleted the fix_question_mark_target branch July 18, 2020 13:12
@ysakasin
Copy link
Member Author

@ochaochaocha3
レビューありがとうございます。Ver3でどう根本対策するかは要議論ですね。

ysakasin added a commit that referenced this pull request Aug 30, 2020
加算ダイスで目標値に?をした時に、一部のシステムで例外になる問題を修正
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug バグってる!
Projects
None yet
Development

Successfully merging this pull request may close these issues.

一部のシステムで目標値に?を使うと落ちる
2 participants