あなたの里々ゴーストはリバーシができる
前書き
こんにちは、真鴨子規です。
フタツギノヒトカタ、幼白鬼、エーデルシュタイン・バンケットではお世話になっております。
最近は伺かデベロッパーより物書き系Vtuberとしての活動が多くなっています。マジかよ。まあメインは変わらず小説ですとも。
伺か・伺的 [第2会場] Advent Calendar 2024に投稿する記事となります。
よもや私自身が投稿する側になるとは。この『空の真鴨』の目をもってしても見通せなかったぜ。
なお、前日投稿は瑞樹ユラさんの記事『里々でアイテムの収集率を出してみよう』、改変して使えるコレクター系イベントで有用なスクリプトサンプルでした。シンプルでありながら独自性を出しやすいアイテム収集要素、これを機に実装してみるのも一興でしょう。
さて、本稿にて今回お話ししたかった内容はタイトル通りです。
私がかつて作成しそのままになっていたリバーシ機能、仮称『がへし』なるものを紹介、というか自ら実装してみようという試みです。
幼白鬼で試験的に実装していたのがなんと2017年。未完のうえ、私にとってもブラックボックスとなってしまったコイツですが、まあソロゴーストに載せるくらいならなんとかなるんじゃないかと思い、実践した次第です。
やったこと/デモンストレーション
1.ゴースト素体の作成 -ベース-
まず簡単に里々ゴーストを作成しました。
ゴースト作成入門-里々編-を参考に、ただ立たせただけのゴーストです。
2.ゴースト素体の作成 -シェル-
今回シェルは自前の創作物、幼白鬼の追加シェル『見上鬼』を使いました。これをmasterシェルとして配置します。関連トークや表情もそのまま流用できますし超お得。
3.必要素材の投入 -ゴースト側-
まず、\ghost\masterの下に、幼白鬼の同フォルダから輸入してきた『reversi』ってヤツを置きます。
『reversi』フォルダ内には2種類のファイルが入っております。
ゴーストにトークさせる辞書(dic_talk.txt)
リバーシを稼働させるプログラム(dic_talk.txt以外)
いったん「へー」と思っておいてください。
ただ、基本的に『リバーシを稼働させるプログラム』は触らない方がよろしいかと。
4.必要素材の投入 -シェル編-
\shell\masterの下に、幼白鬼の同フォルダから輸入してきた『reversi』ってヤツを置きます。同じ名前なので混乱しそうですが、ghostとshellで中身は別物なのでご注意ください。
さらに、同じフォルダから次のファイルを輸入してください。
surfaces_rev.txt
5.必要素材の投入 -微調整-
今回の試行にあたり、以下の調整を行いました。なにぶんまっさらな状態から作っているので、こんな対応も必要なわけです。
幼白鬼用のreplace_after.txtを輸入
つつかれイベントの前準備
辞書フォルダの追加($辞書フォルダ .,reversi)
リバーシ要求コマンド(>リバーシ要求)
アルファチャンネルを透過として利用(seriko.use_self_alpha,1)
6.リバーシで遊ぶ
いえ、手順は飛んでいません。
ここまでの作業だけで、いま生まれたばかりのこの女の子は、立派にユーザさんとリバーシで遊べるようになったのです。やったね。
やっていただくこと
『あなたの里々ゴースト』にリバーシをさせるにあたって必要な作業をご紹介します。前述した各素材の投入に加え、まあこれはどうしたって必要だよねってレベルの作業になります。
1.呼び出し準備
メニューなどから、『リバーシ要求』イベントを呼び出せるようにしてください。
前述のデモンストレーションのとおり、最低限『>リバーシ要求』とするだけで大丈夫です。
2.トークの準備
\ghost\master\reversi\dic_talk.txtに、リバーシ中の随所でゴーストに喋らせるトークを書き込んでいきます。『ゴーストにトークさせる辞書』として、先ほどご紹介したファイルですね。
里々ゴーストを作る皆様におかれましては、まさに『いつもの作業』かと存じます。
また、以下は引用元から比較的分かりやすく抜粋した記載例です。
*リバーシをしよう
:(5)リバーシ、する?
*リバーシルール
:(0)えっと……。
(6)自分の、駒。と、自分の駒、で、(ユーザ名)の駒を、はさむ。
自分の駒を、いっぱい、増やす。
駒の多い方が、いい。
……(3)合ってる? (ユーザ名)。
*リバーシキャンセル
:(0)そう?
(5)じゃあ、また今度ね。
##################
######さくら側台詞######
##############
*さくらとリバーシを始めよう
:始めるよ。
(6)えっと……。
*さくらはここへ置きます
:(0)じゃあ……ここ。
*さくらはここへ置きます
:(0)ここにするね。
*さくらから開始
:(0)私からだよ。
*さくらから開始
:(5)私が、クロ。
(ユーザ名)は、シロ。
*ユーザから開始
:(0)(ユーザ名)からだよ。
*ユーザから開始
:(5)(ユーザ名)が黒だね。
*ユーザに交代
:(5)次、どうぞ、(ユーザ名)。
*ユーザに交代
:(0)(ユーザ名)の番だよ。
*さくらに交代
:(0)私の番だよ。
#XXXが駒を置いた
#A0:配置した位置(11~88)
#A1:反転した駒の数
#:置いたのは(A0)だね。
#めくれたのは数は(A1)個。
*さくらが駒を置いた
#台詞なしパターン
*さくらが駒を置いた
>さくらが角に置いた (A0)==11 || (A0)==18 || (A0)==81 || (A0)==88
>さくらが角に置いた
*さくらが角に置いた
:(5)ここはもう、ひっくり返せないよ。
*さくらが駒を置いた
>さくらが駒を置いた (ターン)<16
>さくらが少し駒をめくった (A1) < 3
>さくらが駒をめくった (A1) < 6
>さくらがたくさん駒をめくった (A1) < 12
>さくらがすごくたくさん駒をめくった
*さくらが少し駒をめくった
:(3)あれ、(A1)個しかめくれなかった。
*さくらが駒をめくった
:(15)ふふ。(A1)個、私の色になった。
*さくらがたくさん駒をめくった
:(15)(A1)個もめくれた。
うれしい……。
*さくらがすごくたくさん駒をめくった
:(9)えっと、えっと……。
(15)すごくいっぱい、ひっくり返ったね。
(16)なんだか、気持ちいい……。
#XXXが駒を置いた
#A0:配置した位置(11~88)
#A1:反転した駒の数
#:置いたのは(A0)だね。
#めくれたのは数は(A1)個。
*ユーザが駒を置いた
>ユーザが駒を置いた (ターン) < 21
>ユーザが少し駒をめくった (A1) < 3
>ユーザが駒をめくった (A1) < 6
>ユーザがたくさん駒をめくった (A1) < 12
>ユーザがすごくたくさん駒をめくった
*ユーザが駒を置いた
>ユーザがすごくたくさん駒をめくった (A1) >= 12
>ユーザがたくさん駒をめくった (A1) >= 6
*ユーザが少し駒をめくった
:(0)それだけでいいの?
(5)ふふ……。
*ユーザが駒をめくった
:(5)(A1)個めくれたね。
*ユーザがたくさん駒をめくった
:(5)(A1)個も取られちゃったね。
*ユーザがすごくたくさん駒をめくった
:(9)わ、すごいたくさん、ひっくり返ったね。
(15)(ユーザ名)、すごい……。
(16)私もたくさん、くるんって、したいな。
*ユーザが駒を置いた
>角に置かれた (A0)==11 || (A0)==18 || (A0)==81 || (A0)==88
>ユーザが駒を置いた
*角に置かれた
:(3)あ、角っこ、取られちゃった……。
*ユーザの勝ち
:(6)負けちゃった……。
*ユーザの勝ち
:(5)(ユーザ名)の勝ち。
*ユーザの勝ち
>ユーザの完全勝利 (勝負差)==64
>ユーザの完勝 (勝負差)>=54
>ユーザの圧勝 (勝負差)>=40
>ユーザの大勝 (勝負差)>=26
>ユーザの激戦勝 (勝負差)>=12
>ユーザの接戦勝
*ユーザの完勝
:(2)わ、……ほとんど、(ユーザ名)の色になっちゃったね。
(5)数えなくても、どっちが勝ったか、分かるよ。
*ユーザの圧勝
>ユーザの完勝
*ユーザの大勝
:(5)うん、(勝負差)個の差で、(ユーザ名)の勝ちだね。
(16)すごい……。やっぱり、(ユーザ名)は強いね。
(15)私も、もっとがんばって、うまくなるね。
*ユーザの激戦勝
:(1)(勝負差)個……思ったより、差があったね。
同じくらいだと、思ったのに……。
(15)うん、……次は、もっとがんばる。
*ユーザの接戦勝
:(1)んぅ……。
もうちょっと、だったのに……。
……(5)ふふ。次は、私が勝つよ。
*ユーザの完全勝利
:(1)わあ……。ぜんぶ、(ユーザ名)の色。
(15)(ユーザ名)は、本当に、上手だね。
*さくらの勝ち
:(2)私の、勝ち?
*さくらの勝ち
>さくらの完全勝利 (勝負差)==64
>さくらの完勝 (勝負差)>=54
>さくらの圧勝 (勝負差)>=40
>さくらの大勝 (勝負差)>=26
>さくらの激戦勝 (勝負差)>=12
>さくらの接戦勝
*さくらの完勝
:(3)あ、えっと、その……。
(ユーザ名)、……ごめん、ね?
*さくらの圧勝
>さくらの大勝
*さくらの大勝
:(1)(勝負差)個、差……?
けっこう、差がついた、ね……。
(15)ふふ。ちょっと、気持ちよかった。
*さくらの激戦勝
:(5)えっと、(勝負差)個の差で、私の勝ち、だね。
(1)あ、運が、良かったの。きっと。
ちょっとの差、だから……。
*さくらの接戦勝
:(9)は、ふー……。
なんとか、勝てた……。
*さくらの完全勝利
:(0)(ユーザ名)の、なくなっちゃったね。
*さくら置く場所がない
:(3)置ける場所、ない……。
*ユーザ置く場所がない
:(2)(ユーザ名)、置く場所がないね。
*誰も置けない
:(2)あれ? どっちも、もう置けないんだね。
*続けますか
:(5)もう一回、やる?
*もう一局
:(15)うん。もう一回、しよ。
*リバーシ途中終了
:(0)止めるの?
(6)じゃあ、片付けるね。
*リバーシ終了
:(5)じゃあ、終わりだね。
*引き分け
:(5)引き分けだね。
3.変数『思考レベル』の設定
『思考レベル』という変数に、予め1か2か3の数字を代入してください。
宣言場所はどこでもよいです。宣言前にリバーシを実行しようとすると、自動的に1が代入されます。
この『思考レベル』が、キャラクターの持つ『リバーシの強さ』になります。1が最弱、3が最強ですね。リバーシ初心者のキャラであれば1、リバーシ強者のキャラであれば3を設定しておくとよいでしょう。
ただ、最強といっても中級者かそれ未満の強さだと思います。私の知識と技術力で組み込める強さの限界です。熟練者からしたら大した強さではないため、あまり期待しすぎないようお願いします。
後書き
さあこれで皆様もリバーシ実装済みデベです。その誇りを胸に、明日から頑張っていきましょう。
あなたのゴーストにこのリバーシを実装させたとき、あなたは思うことでしょう。『なぜこんなものを里々で?』と。
ああいう込み入った処理を効率的に実装する方法は、まあ他に色々とあるでしょう。
当時の私は単純に、自分にできる範囲で、実現できる結果を求めていただけでした。それはリバーシのみならず、私の活動すべての根幹にあるものです。いや、それしかないとも言えます。
けれど人の成長とは、自分の限界を少しずつ超えていくという意味に他なりません。ですので人は、現在の自分が『できないこと』にこそ手を伸ばすべきなのです。
どうか私の存在が、誰かの反面教師になれますように。