CWでこういうことをやっているよの紹介と、自分の備忘録やふり返りを兼ねて、たまにはシステムに関する部分だけの記事を書いてみようかなと思います。
今回はダイスロール演出をどう作っているかの話をします。画面上での動作のようすは進捗記事で貼っている動画のとおりなので、そちらをご参照ください。
▼やりたいことを考える
要件決めです。実現したいことをざっくり考えます。
- ダイス結果:00-99の値をランダムで設定し、画面に表示する
- 一の位、十の位の順で一つずつ表示する
- 成功率は可変として、↑で出た値と比較する
どんな処理にするか、というより、最低限こう動いてほしい、を決める段階です。最終的に違う形になることもあるかもしれません。ただしこの部分が最初からふにゃふにゃだと実装も総崩れになるので、画面の簡略図を描くなどして、なるべくはっきりイメージします。
▼必要なステップとフラグを用意する
使う時点で作るでも大丈夫です。
- 判定値ステップ:0-9までの値を取る
- 一の位
- 十の位
- ダイス目セル表示フラグ:
- 基本表示、数字のないダイス
- 一の位
- 0-9でそれぞれ1つずつ
- 判定中に出す「?」記号
- 十の位
- 0-9でそれぞれ1つずつ
- 判定中に出す「?」記号
- 判定成否フラグ:true/false
作成前は0-9の数値をスロットのようにぐるぐる回してシャッフル感を出そうと思っていたのですが、フラグのON/OFFと再描画をくりかえすのも微妙そうだったので「?」を出すに留めました。このあたりはエフェクトブースターでそれらしく作れるのかなあとは思いつつ、今回はセルでやると決めていたので…(エフェブの勉強をするのが手間で…)
▼処理の流れを想定する
こういう順で動かせばいいんじゃないかな~という大枠を考えます。今回のものはいくつか順不同な部分もあるのですが、実装した形では以下のとおり。
- ダイスの「??」表示を画面に反映する(表示処理)
- ランダムな値を判定値ステップに入れる(内側処理)
- 成功率と判定値ステップを比較して判定を行う(内側処理)
- 判定成否フラグを切り替えておく
- 判定値ステップを参照し、ダイスの一の位のセルを立てる(表示処理)
- 判定値ステップを参照し、ダイスの十の位のセルを立てる(表示処理)
- 判定成否フラグをもとにエリア側で結果テキストを分岐させる(表示処理)
- ダイス目を空白に戻す(表示処理)
これを考えたあたりで「ダイス周りの表示処理は1パッケージにまとめてしまいたいな」ということで、表示段階に合わせて処理を選択するためのステップを作ったりしたのですが、特に活きていないな…と今思っています。こういうこともある。
実際にはかなり行き当たりばったりで、作りながら考えることも多いです。思いつきで作業が追加発生したりも。今回で言うとクリティカル・ファンブル要素があとになって付け足した部分でした。
▼作る
処理内容は大枠で考えた通りなので黙々とやります。シナリオの中身だと「判定_ダイスロール」パッケージ、「判定_ダイスセル反映」、エリアの探索メニューあたりがこれにあたります。
記事ではかいつまんでいくつか。
- ランダムな値を判定値ステップに入れる
ステップ代入コンテントを使います。ソース変数には「System」というフォルダがしれっと存在していて、その中の「??Random」を指定すると、ターゲット変数側のステップの中身をランダムに選択してくれます。

ランダム分岐コンテントより直感的に同確率ずつのランダム選択ができる便利機能です。
今回は0-9の値をすべて使うのでそのままですが、より少ない択でも使えます。三択であれば(0,1,2をそれぞれの択に振り分け、)ランダム代入後にステップ上下分岐で確認を入れて、Step – 3以上の値が入っていたらツリーの頭にループさせて振り直し、という形にすればOK。

ステップ代入コンテント、この用途に限らずものすごく便利なので、ややこしい処理を作るときの心強い味方です。
- 成功率と判定値ステップを比較して判定を行う
判定値ステップは前述の方法で値が固定されますが、成功率側は探索対象や使用する能力によって値が変わっていきます。それと判定値ステップをひとつひとつ比較する用意をするのは非常に面倒。そもそもステップ比較分岐コンテントは設定内容が多くて、地味に面倒な作業で…

画像だと比較するステップが一対一なのでまだいいものの、これを一の位、十の位でそれぞれ比較するとなると、指定する箇所が乗算で増えていきます。指定する箇所が増えると当然ミスの可能性も上がります。
なので、それを避けるために「判定用の成功率ステップ」を別途作ります。判定値ステップと同じ構成のステップです。成功率を事前にこのステップに代入しておくことによって、比較処理がこれと判定値ステップの間だけで済むようになります。

すっきり。
ステップ代入コンテントが便利なのはこういうところで、値の持ち方さえ揃えれば、いろいろなステップを仲介して処理をまとめることができます。
- 判定成否フラグをもとにエリア側で結果テキストを分岐させる
判定処理は何度も使うので、もちろんパッケージに詰めています。画面表示まわりを除けば結果は最終的に「成功」「失敗」の二択となるはず。
エリアの探索箇所に応じてテキストを出し分けたいので、エリア側から呼び出したダイス判定パッケージの中で「成功」「失敗」をフラグに残して、続くエリア側の処理でそのフラグを参照して結果テキストを分岐させる、という形にしています。
パッケージとエリアの処理をステップやフラグで仲介する、受け渡す、という手段を使うようになると、パッケージにまとめられる範囲が広がって便利です。
再三になりますが、共通する処理はなるべくパッケージに詰めて、二度作らなくて済むようにしています。特に「セル表示のフラグを一括OFFにする」系の初期化処理は最初に想定したものの倍程度に使い道が出てきがち。一ヶ所にまとめておくと、「急遽セルをひとつ増やしたい!」といった状況が起こったときに反映漏れが起こらなくて楽です。
▼テストする
動けばいいのですが、だいたい想定通りに動きません。pyのエディタ(本体?)ならたしか処理を一手一手確認する機能があったはずですが、私は1.50付属のビルダを使っているのでそうもいきません。途中にテキストコンテンツを挟みながら、どの処理が動いているのか・飛ばしてしまっているのか、どの時点でどの値が入っているのか――といった部分を細々確認しています。
動いたらとても嬉しい。お疲れさまでした。
▼できあがり
以上、ダイスロール処理を作るまで、でした。
読み物としておもしろいかどうかはともかく、自分の作ったもののふり返りになるので(今回は本来不要なステップがひとつ見つかったので)、機会があればまた書いてみようかなと思います。
どなたかの役に立ったら嬉しいです。読んでくださってありがとうございました。