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

個数カウントダイスを追加する #509

Merged
merged 1 commit into from
Nov 14, 2021
Merged

Conversation

ochaochaocha3
Copy link
Member

@ochaochaocha3 ochaochaocha3 commented Oct 17, 2021

Discordのbcdice-helpサーバで出た質問を基にして、バラバラダイスの出目の個数を数える汎用コマンドを追加してみました。ご意見をいただきながら、使いやすい形にしていきたいと思います。

背景

  • きっかけとなったDiscordのbcdice-helpサーバで出た質問では、CoCのシナリオ内の処理で需要があるとのことでした。
  • Discordや私のツイートの返信で教えていただいたところ、出目の個数のカウントは複数のシステムにある汎用的なルールと考えられました。具体的には、銀剣のステラナイツ、光砕のリヴァルチャー、魔法学園RPGハーベストにあるとのことです。
  • 現在のBCDiceでは、アルケミア・ストラグルが固有コマンド xUL で対応しています。ただし、面数が6に固定されており、他の面数で振りたい場合は、手作業で数えるか各システムに固有コマンドを追加する必要がありました。

目的

多くのシステムでバラバラダイスの出目の個数を数えられるようにするため、そのように動作する汎用コマンドを追加します。他の汎用コマンドと同様に、振るダイスの個数と面数を指定できるようにします。

仕様

#509 (comment) に合わせた仕様です。

名称

  • コマンド名:個数カウントダイス
  • クラス名:BCDice::CommonCommand::TallyDice

(「tally」は英語で「集計する」という意味。Rubyではこのコマンドと同様の集計操作が Enumerable#tally というメソッドになっています。)

書式

このコマンドには2種類の書式があります。選んだ書式によって、出現しなかった目について「×0」を表示するかどうかが変わります。

「×0」を表示しない場合

xTYy

(由来:英単語「tally」の略)

「×0」を表示する場合

xTZy

(由来:「Tally with Zero」の略)

動作の概要

y 面ダイスを x 個ダイスロールし、各出目の個数を表示します。選んだ書式によって、出現しなかった目について「×0」を表示するかどうかが変わります。

  • xTYy:出現しなかった目の表示が省略されます。
  • xTZy:出現しなかった目が「×0」と表示されます。

表示が極端に長くなることを防ぐため、現在はダイスの面数を20以下に制限しています。今後の利用状況や要望に応じて、拡張される可能性があります。

実行例

[DiceBot]> 10TY6
(10TY6) > 4,6,1,1,5,3,1,4,5,6 > [1]×3, [3]×1, [4]×2, [5]×2, [6]×2

[DiceBot]> 10TZ6
(10TZ6) > 4,6,1,1,5,3,1,4,5,6 > [1]×3, [2]×0, [3]×1, [4]×2, [5]×2, [6]×2

動作の詳細

  • ダイスの個数が0以下、または面数が0以下の場合は、無効なダイスとして無視します。
  • ダイスの面数が21以上の場合は以下のようにエラーメッセージを表示します。
    [DiceBot]> 10TY21
    (10TY21) > 面数は1以上、20以下としてください
    
  • 結果表示において、出目がソートされるかはゲームシステムに依存します。バラバラダイスがソートされるゲームシステムでは、出目がソートされます。

(参考)旧仕様

名称

  • コマンド名:個数カウントダイス
  • クラス名:BCDice::CommonCommand::BarabaraCountDice

クラス名の由来は、バラバラダイス+カウントです。

書式

xBCy

BC はクラス名 BarabaraCount の略です。

動作の概要

y 面ダイスを x 個ダイスロールし、各出目の個数を表示します。

実行例

[DiceBot]> 10BC6
(10BC6) > 4,6,1,1,5,3,1,4,5,6 > [1]×3, [3]×1, [4]×2, [5]×2, [6]×2

論点

@codecov
Copy link

codecov bot commented Oct 17, 2021

Codecov Report

Merging #509 (544dcc6) into master (a6ab6a9) will increase coverage by 0.08%.
The diff coverage is 100.00%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master     #509      +/-   ##
==========================================
+ Coverage   95.43%   95.51%   +0.08%     
==========================================
  Files         310      318       +8     
  Lines       18236    18655     +419     
==========================================
+ Hits        17403    17818     +415     
- Misses        833      837       +4     
Impacted Files Coverage Δ
lib/bcdice/common_command.rb 100.00% <100.00%> (ø)
lib/bcdice/common_command/tally_dice.rb 100.00% <100.00%> (ø)
lib/bcdice/common_command/tally_dice/node.rb 100.00% <100.00%> (ø)
lib/bcdice/game_system.rb 100.00% <0.00%> (ø)
lib/bcdice/game_system/Karukami.rb 97.56% <0.00%> (ø)
lib/bcdice/game_system/FateCoreSystem.rb 98.14% <0.00%> (ø)
lib/bcdice/game_system/AssaultEngine.rb 97.95% <0.00%> (ø)
lib/bcdice/game_system/Aoharubaan.rb 100.00% <0.00%> (ø)
lib/bcdice/common_command/tally_dice/parser.rb 88.29% <0.00%> (ø)
lib/bcdice/game_system/TalesFromTheLoop.rb 100.00% <0.00%> (ø)
... and 4 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update a6ab6a9...544dcc6. Read the comment docs.

@ochaochaocha3
Copy link
Member Author

ochaochaocha3 commented Oct 17, 2021

以下は私が作成時や返信を読んだときに考えたことです。

  • コマンドの書式について:BC ではなく単に C とすることも考えましたが、計算の c や、除算の切り上げの C と混同しやすいように感じられたので、バラバラダイスの B を加えました。
  • 振った結果の表示について:
    • ソートを行うか:ソートした方が見やすいように感じました。
    • 表示形式について:
      • 表示形式は最低限分かる程度に整えただけなので、私も分かりにくいように感じます。挙げられた例のほかに、角括弧で出目を囲む [1] 2個, [2] 3個, ... や、RubyのHashの表示のような 1 => 2個, 2 => 3個, ... が思いつきました。
      • 1つも出なかった目については、現在のように0個のものを省くのが妥当と考えました。もし0個を表示すると、振る個数 面数が多い場合に「0個」が連続して、出た目の個数を探しにくくなるように感じられました。オプションとするのはひとつの手ですが、今のところ簡潔に指定する方法が浮かんでいません。
      • 「個」の表示の言語依存については、真面目に取り組むならばi18nの仕組みでメッセージを変化させる必要があるところです(Rails、ActiveSupportの複数形対応のような形?)。

@ViVi-shark
Copy link
Contributor

[imo] コマンド名について、 BC だとエンジンそのものの名称( BCDice )が連想されて奇妙な感触があります。

  • が、一般的な大多数のユーザーはエンジンを意識していないはずなので、軽微な問題なのかもしれません。
  • これって(自然言語においては)どういう名前の操作なのでしょうね……クエリ言語だと group by + count でやるイメージがありますが、ズバリの呼び方が思いつきません……。

[LGtM] 名前については上のとおりですが、書式は妥当そうに思います。(ただし後述のオプションが必要になった場合はその点は新規に考慮が必要)


[imo] ソートは、(わたしが思いつくかぎりのこのコマンドのユースケースでは)集計側があればそれで足りるので、ソートされてなくても問題ないように思います。

  • されて困るものでもない、ともいえそうですが……。
  • ソートされていないことによって、集計側に目線がいきやすいというのは利点のようにも思います。
  • というか sort_barabara_dice? 依存にしておくのが丸そうです。( xBy の延長にある機能だと思うので)
    • フィルタつきロール( [KD][HL]sort_barabara_dice? を無視して常にソートするのは、その挙動が本質的にソートを前提としているからだと考えます。今回のは集計であって、集計はソートと不可分ではないはずなので、常にソートするのは不自然だと考えます。

[imho] 表示形式は、現状ママだとつらい感じがします。

  • 現状よりは、「角括弧で出目を囲む」パターンのような方向性のほうがよい気がします。
    • 出目と個数のコントラストが強いので。
    • もしかするとより強調されるべきなのは個数のほうなのかもしれません?( 出目1: [3]
  • 「×」( u+00D7, Unicode 1.1 )の記号を使うと、日常における個数を計上するシーンと親和するかもしれません。
  • 好みなのは ⚀⚁… をつかうパターンです(出目と個数それぞれの数値がいちばん混同しづらい)。この手の記号は6面ダイスくらいしかないはずなので、「背景」にある「他の面数で振りたい場合」とは親和しませんが……。

1つも出なかった目は、明示的に0個と表記されてほしいです。

  • 現時点で具体的に想定されているユースケース(『アルケミア・ストラグル』『銀剣のステラナイツ』『光砕のリヴァルチャー』『ハーベスト』)は、すべて6面ダイスをもちいてこの処理を利用するルールのはずであり、その範囲では(0個のものをふくめて)すべての出目を表示しても、読み取りづらいほど長くなるとは思いません。
    • ルールデザインの観点からも、集計処理をさせるような場合に面数があまりに大きくなるようなルールが積極的につくられるとは考えづらいものがあります。
      • 5bc10 くらいならありえそうな感覚はあり、このくらいだと0個を省いてもよさそうですが……。
      • なので、オプションというアイディアは、ほどよい落とし所ではあるかもしれません。
        • コマンド前後になにか足すのはたぶん読み書きしづらいので、中央の BC 部分を変化させるのがよいのかも?(これは xDyxBy の使い分けで馴染みのある考え方です)
  • 集計結果を音読・記録・キャラクターの各項目に反映などする際、「1が3個、3が1個、4が2個、5が2個、6が2個」などのような考え方・言い回しは、あまりしないと思います。「3,0,1,2,2,2」と考える・読み上げるほうが自然だと思います。ので、0個の目が省略されると、このパターンのときに思考にラグが入ります。

[nits] コメントにある「振る個数が多い場合」は、「振る個数が少ない場合」または「面数が大きい場合」の誤りではないでしょうか?


言語依存の件は、これ https://github.com/bcdice/BCDice/blob/master/lib/bcdice/common_command/barabara_dice/node.rb#L34 がローカライゼーション対応されていないなら看過してもいいんじゃないでしょうか……。

@ochaochaocha3
Copy link
Member Author

ソートは、(わたしが思いつくかぎりのこのコマンドのユースケースでは)集計側があればそれで足りるので、ソートされてなくても問題ないように思います。

  • というか sort_barabara_dice? 依存にしておくのが丸そうです。( xBy の延長にある機能だと思うので)

確かに sort_barabara_dice? がありましたね。これを反映するように変えてみます。

表示形式は、現状ママだとつらい感じがします。

  • 現状よりは、「角括弧で出目を囲む」パターンのような方向性のほうがよい気がします。
  • 「×」( u+00D7, Unicode 1.1 )の記号を使うと、日常における個数を計上するシーンと親和するかもしれません。

合わせると、[1]×2個, [2]×3個, ... のような形にもできますね(これならば面数が多くても大丈夫です)。

1つも出なかった目は、明示的に0個と表記されてほしいです。

  • ルールデザインの観点からも、集計処理をさせるような場合に面数があまりに大きくなるようなルールが積極的につくられるとは考えづらいものがあります。

想定されているシステムがすべて6面しか使わないとすると、確かに0個を明記しても問題なさそうです。

コメントにある「振る個数が多い場合」は、「振る個数が少ない場合」または「面数が大きい場合」の誤りではないでしょうか?

そのとおりでした。「面数が多い場合」に修正しました。

言語依存の件は、これ https://github.com/bcdice/BCDice/blob/master/lib/bcdice/common_command/barabara_dice/node.rb#L34 がローカライゼーション対応されていないなら看過してもいいんじゃないでしょうか……。

確かにそうですね。まだ最初ですし、とりあえず日本語の「個」の表記に固定します。

@GenKuzumochi
Copy link
Contributor

  • BCでLGTMです。BarabaraにCountオプションが付いた感じで。
  • ソートについては、5BA6 > 1,2,2,3,3 5BD6 > 3,3,2,2,1 のように、Bコマンド自体にソート指示のオプションを追加することを提案したいです。それを組み合わせて5BCA65BAC6でソート+カウント。
  • [1]×2個, [2]×3個, ... LGTMです。少なくとも日本人ならわかりやすくて誤読しにくくて良さそうです。
  • i18nは要望ありきで良い気がします。クライアント側でtimesに置き換えてもらうという手も。

0個の目が省略されると、このパターンのときに思考にラグが入ります。

これはなるほどと思いました。少なくとも6面までのときは全部表示で良いかと思います。
6面(または10面)を超えるときは0個は省略するというのもありかもしれません。
(10BC100を振るミニゲーム等を想定すると0個が90回表示されてしまうため)

@ViVi-shark
Copy link
Contributor

Bコマンド自体にソート指示のオプションを追加

なるほど。これは興味深いアイディアですね

@ochaochaocha3
Copy link
Member Author

少なくとも最初の出力形式よりは分かりやすいと思いましたので、角括弧版の出力に変えてみました。

「0個」表示を面数が一定数以下かどうかで切り替えるというのは、うまく調整できれば有力そうです。私が心配していたのも、くずもちさんが上で挙げられていたような面数が極端に多い場合でした。

面数の閾値と見やすさとの関係については、面数を変えて比較すると違いが分かりやすいので、4面、6面、8面、10面、12面、20面に対して、「0個」も表示する処理に変えて試してみました。端末の1行は100文字です。いかがでしょうか?
barabara_count_zeros

@ochaochaocha3
Copy link
Member Author

ochaochaocha3 commented Oct 20, 2021

個数カウントの C やソート指定を xBn のオプションとするのは、統一感がありそうだとは感じましたが、話が大きくなりますので、個人的には別issueの方が良いのではないかと思います。酒田さんの判断を仰ぎたいです。

@ysakasin
Copy link
Member

出力フォーマットについてですが、改行の利用を検討してみたいです。

ダイスごとに改行する方式や、

(省略)>
1 => 1個
2 => 0個
3 => 1個
4 => 0個
5 => 1個
6 => 0個

10面ごとなど、きりの良いところで改行するなどどうでしょう。

(省略)>
1 => 1個, 2 => 0個, 3 => 1個, 4 => 1個, 5 => 1個, 6 => 1個, 7 => 1個, 8 => 1個, 9 => 1個, 10 => 1個,
11 => 1個, 12 => 0個, 13 => 1個, 14 => 1個, 15 => 1個, 16 => 1個, 17 => 1個, 18 => 1個, 19 => 1個, 20 => 1個

@ysakasin
Copy link
Member

個数カウントの C やソート指定を xBn のオプションとするのは、統一感がありそうだとは感じましたが、話が大きくなりますので、個人的には別issueの方が良いのではないかと思います。酒田さんの判断を仰ぎたいです。

じっくり考えてみます。話題を追いきれてないので時間がかかるかもしれません。

このPRについては、いったん出力形式の決定に注力してもらえると嬉しいです。

@ochaochaocha3
Copy link
Member Author

ochaochaocha3 commented Oct 30, 2021

Discordのチャンネルにくずもちさんが貼られていたココフォリアでの表示の画像から、

[1]×1, [2]×1, [3]×0, [4]×0, [5]×2, [6]×1

のような、

  • 角括弧 [ ] で出目を囲む。
  • 出目と個数の間に × を入れる。
  • 個数の後に「個」をつけない。

という書式が見やすいとのことでした。一旦これに変えてみます。

kuzumochi-ccfolia

@ochaochaocha3
Copy link
Member Author

「0個」の表示と出力書式の変更を行いました。次の画像は、この状態でココフォリア上に表示したイメージです。

ccfolia-bc

「×0」を表示すると、やはり面数が多い場合に表示が長くなっていますので、続いて何面まで「×0」を表示するかの閾値を決めたいと思います。

@ysakasin
Copy link
Member

閾値を設定すると、同じコマンドでも表示内容が異なり、混乱の原因となってしまうと思います。
0個の非表示をするなら、オプションを設けるのが良さそうな気がします。

@ochaochaocha3
Copy link
Member Author

確かに、出力が場合によって変わることと、閾値をどこに置くかが主観的になりがちなことが混乱の原因となりそうな気はします。

個人的には、「×0」の表示はデフォルト非表示の方が安全ではないかと思います。Typoしてうっかり多い面数で振ってしまったときなどに画面が埋まり得ることを考慮すると、むしろオプションを付けたときのみ表示するのが良いのではないでしょうか? 例えば、次の表のように Z(←zeroの略)付きのときのみ「×0」を表示する、というのはいかがでしょうか?

コマンド 「×0」 出力例
xBCy 非表示 (5BC6) > 5,6,2,5,1 > [1]×1, [2]×1, [5]×2, [6]×1
xBCZy 表示 (5BCZ6) > 5,6,2,5,1 > [1]×1, [2]×1, [3]×0, [4]×0, [5]×2, [6]×1

@ViVi-shark
Copy link
Contributor

  • 現時点でこの機能を積極的につかうシステム(名前が挙がっているようなもの)の場合、0個も表示されるほうをデフォルトとするほうが自然に思います。
    • sort_barabara_dice? のように設定値で切り替えられるようにする?
    • ゲームシステムごとの専用コマンドを設けてラップというか delegation ( forwarding )する、みたいな方針をとるのもアリかもしれません。
  • アルファベット3文字コマンドは、標準的な(非プログラマー的な)ユーザーにとって負荷がおおきい気がします。 rep みたいに一単語の先頭を切り出しているケースはまだしも、これは頭文字をとった省略形ですし。

Typoしてうっかり多い面数で振ってしまったときなどに画面が埋まり得る

これが問題だとするなら(まぁまぁ問題だとはおもいます)、それは、「デフォルトをいずれの側に倒すかどうか」とは別の観点から対処すべきようにも感じます。(けっきょく BCZ 側で typo したら起きるわけで)
面数の上限を低め(10とか)に設定してしまうとか?

@ochaochaocha3
Copy link
Member Author

いずれの案でも実装はできると思いますが、結局どうするのが良いのでしょうか? 方針が定まらないので、手を動かせない状態が続いています。

@ViVi-shark
Copy link
Contributor

とりあえずわたしが積極的に主張したいのは、

  • 「0個の表示あり」と「0個の表示なし」は、「表示あり」側がデフォルトであってほしい

という一点です。

根拠は、過去に述べたように、「現時点で具体的に想定できるユースケースにおいては、そのほうが便宜にすぐれると思うから」です。

(ただし、反例として、『アルケミア・ストラグル』( AlchemiaStruggle )の xUL コマンドは、0個を省略する挙動になっているようです)

そのうえで、もし「表示なし」側をデフォルトにするなら、「表示あり」側が3文字コマンドであってほしくはないです。

@ViVi-shark
Copy link
Contributor

面数側を typo したときにメッセージが巨大になる件について、「 xBCy の y を省略したときは y = 6 とみなす」( xD コマンドと類似のふるまい)のはいかがでしょうか?

そもそも面数を入力しなければ typo することもなく、この機能を利用するであろうルールの多くが6面であろうことを考慮すると、現実的にかなりの効果が見込める気がしています。

@ysakasin
Copy link
Member

おそらく決めが必要なので、以下にしましょう。

  • コマンドの形式
    • xTYy: x0の表示なし
    • xTZy: x0の表記あり
  • ダイスの面数は20を上限とする
    • 汎用的に使える物理ダイスはせいぜい20面ダイスが上限
    • これは一時的な措置で、今後の利用状況や要望に応じて拡張する
    • TYTZかで上限が変わる可能性も今後検討

TY, TZ は英単語 tally からとっています。Rubyではこのコマンドと同様の集計操作が Enumerable#tally というメソッドになっています。 TZTally with Zero の略です。

汎用コマンドなので、一文字コマンドにするか悩みましたが、x0の表記あるなしの対応づけのバランスが取れないので二文字コマンドにします。

@ysakasin
Copy link
Member

補足:どちらのコマンドも面数およびダイス数の省略は不可とします。

@ochaochaocha3 ochaochaocha3 marked this pull request as ready for review November 13, 2021 23:30
@ochaochaocha3
Copy link
Member Author

#509 (comment) に仕様を合わせ、実装しました。レビューお願いします。

@ochaochaocha3
Copy link
Member Author

Saipageで振ってみた結果です。
2021-11-14_bcdice_tally

@ysakasin ysakasin changed the title [WIP] 個数カウントダイスを追加する 個数カウントダイスを追加する Nov 14, 2021
Copy link
Member

@ysakasin ysakasin left a comment

Choose a reason for hiding this comment

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

いいと思います!

@ysakasin ysakasin merged commit 1da1854 into master Nov 14, 2021
@ysakasin ysakasin deleted the barabara_count branch November 14, 2021 06:42
@ochaochaocha3
Copy link
Member Author

マージありがとうございます!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants