Giter Club home page Giter Club logo

bcdice-js's Introduction

BCDice

Action Status Gem Version YARD codecov Discord

様々なTRPGシステムの判定に対応したオンセツール用ダイスコマンドエンジン

Documents

バグ報告や機能要望

BCDiceの問題を発見したり、機能の要望がある時に起こすアクションの一例は以下のようなものがあります。

  1. Discordの BCDice Offcial Chat にある各種チャンネルへ投稿する (迷ったらここ!)
  2. Twitterで @ysakasin にメンションを送る
  3. 問い合わせフォームから問い合わせる
  4. GitHubの issue や Pull Request を作成する (GitとGitHubがわかる人向け)

Quick Start

require "bcdice"
require "bcdice/game_system" # 全ゲームシステムをロードする

cthulhu7th = BCDice.game_system_class("Cthulhu7th")
result = cthulhu7th.eval("CC<=25") #=> #<BCDice::Result>
result.text      #=> "(1D100<=25) ボーナス・ペナルティダイス[0] > 1 > 1 > クリティカル"
result.success?  #=> true
result.critical? #=> true
require "bcdice"
require "bcdice/user_defined_dice_table"

text = <<~TEXT
  飲み物表
  1D6
  1:水
  2:緑茶
  3:麦茶
  4:コーラ
  5:オレンジジュース
  6:選ばれし者の知的飲料
TEXT
result = BCDice::UserDefinedDiceTable.eval(text) #=> #<BCDice::Result>
result.text #=> "飲み物表(6) > 選ばれし者の知的飲料"

LICENSE

BSD 3-Clause License

bcdice-js's People

Contributors

blhsrwznrghfzpr avatar ccfolier avatar dependabot[bot] avatar esnya avatar github-actions[bot] avatar h-mikisato avatar ochaochaocha3 avatar tk11235 avatar ysakasin avatar zeteticl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

bcdice-js's Issues

PlotTest S2d6

# AssertionError: expected 'DiceBot : (2D6) > 3[1,2] > 3###secret dice###' to equal 'DiceBot : (2D6) > 3[1,2] > 3###secret dice###\nDiceBot : (2D6) > 3[1,2] > 3###secret dice###'
# + expected - actual

+DiceBot : (2D6) > 3[1,2] > 3###secret dice###
 DiceBot : (2D6) > 3[1,2] > 3###secret dice###

加算ダイスに極端に大きな数が含まれると

問題の概要

加算ダイスに以下のように極端に大きな数が含まれると、桁数が合わない小さな値が出力される。

1D6*1504642339053716000000
(1D6*1) > 2[2]*1 > 2

原因

JavaScriptで浮動小数点数と整数が区別されないというRubyとの差を吸収するために様々なところに #to_i を付加するパッチを当てているが、Opalの Number#to_i の挙動が指数表記されるような値に対して正確でない。

+ return calc(lhs, rhs, game_system.round_type).to_i

+ @literal = literal.to_i

Number#to_iparseInt() を用いている。parseInt() は入力を文字列化してから数値に変換するが、入力が指数表記されるような大きな値である場合、以下の注釈で指摘されているように正確に変換できない。

数値によっては e の文字を文字列表現の中で使用しますので (例えば 6.022e23 は 6.022 × 10^23 を表します)、parseInt を使用して数値を切り捨てると、とても大きな数字やとても小さな数字を使用する際に予期しない結果を生み出すことがあります。parseInt を Math.floor() の代用として使うべきではありません。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt#description

1.504642339053716e+21 は文字列に変換すると "1.504642339053716e+21" となるが、 parseInt() は指数記法を解釈できないため、小数点までを認識し 1 に変換される。

どのように扱うか

Rubyは整数からシームレスに多倍長整数に移行するが、JavaScriptおよびOpalではサポートされていないため、Rubyと全く同じ挙動にすることは事実上不可能である。よって、bcdice-jsでは指数表記されたまま扱うようにするのが最善だと思われる。

解決方法

以下の2パターンを提案する

1. Opalに対してPRを送る

  • Opalの Number#to_i で指数記法が捨てられないようにPRを出す

リリースがいつされるかわからないので、いつ頃改善できるか不明

2. bcdice-jsで工夫することで解決する

すぐ直せるが Number#truncate の処理が煩雑

決定したいこと

  • このように巨大な数の扱いをどうするか
    • 無視する
    • 指数表記で扱う <- おそらく妥当
    • 頑張って多倍長整数をサポートする
  • Opalに対してこのフィードバックを行うのか
    • PRを出す場合、作業は私で進めようと思います

報告発生源

ココフォリアのDicsordサーバーにて報告された (該当メッセージ)

夜遅くに失礼します。不具合なのかどうかわかりませんが、これまでできていたE+までの計算ができなくなっています。もしアプデか何かによる仕様でしたら申し訳ありません。ご確認宜しくお願いします。
10d1038581232830342440000527268773697775500000150464233905371600000012056635259482012200d62d421d41d6661d3966 (10D1038581232830342440000527268773697775500000112056635259482012200D62D421D41D6661D3966) > 68[6,6,4,8,8,9,4,6,8,9]38581232830342440000527268773697775500000112056635259482012*737[5,3,1,5,1,6,1,3,2,4,6,1,5,5,6,1,5,1,5,1,4,5,5,5,3,5,2,1,3,2,5,1,4,5,1,1,6,5,1,6,2,5,6,6,4,4,5,5,5,1,3,5,3,2,5,3,6,1,1,6,3,4,4,2,1,6,5,6,3,2,3,2,6,4,3,4,5,1,6,6,5,5,5,6,6,6,2,5,4,5,1,5,6,3,5,3,5,3,3,6,5,4,1,5,1,2,1,6,1,2,3,6,6,3,4,6,6,1,5,3,4,6,3,5,5,6,6,4,1,3,4,6,6,5,5,5,1,5,6,4,4,2,5,4,6,6,2,1,2,2,5,2,5,2,6,1,3,1,3,3,3,6,5,5,6,3,5,2,4,3,2,2,2,3,3,4,3,3,1,5,1,3,2,5,2,2,2,4,3,3,1,2,3,6,3,5,2,6,1,5]*6[4,2]22[2]*636[636]*12[12]*66 > 792
現状出目が極端に大きいダイスを振るとこのようになってしまいます。

参考資料

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.