仮想空間とフィニッシュ演出
グラフィック担当からえらい提案が出てきて血反吐を吐いています。
「遊戯王マスターデュエルみたいにフィニッシュブローの演出やりたい!」
↑こーいうの
設計時にそんな可能性微塵も考えてなかったよ! (イレイズの構想当時はマスターデュエルなかったしな)
そしてコレ内部動作を想像すると分かると思うんですが、以外と面倒な話です。
なぜなら「フィニッシュブロー演出は攻撃開始時から始まっている」んですから。攻撃開始時点で、事前にその攻撃で勝つことを把握していなければいけない。
シンプルにダメージ処理だけのゲームならHP量とカードのダメージ量を比較するとか色々手はありますが……イレイズはそんなに単純なゲームではなくカード処理としてデリゲート呼び出したり、更にはそのデリゲートが追加されたり書き換わったり削除されたりするシステムなんですよね。勝利条件も複数ありますし。
デリゲートの中身を見て判断するってのも現実的じゃないです。機械語読むんか?(アセンブラですらヒイヒイ言って読んでるのに機械語を読む、それもアルゴリズムに読ませるなんて正気じゃないね)
最初からこのような演出を想定して設計するなら演出用のシステムとゲームシステムをデータごと完全に2層に分けて、ゲームシステム側でカードの実行結果も含めて把握してから画面演出を構成していくという非リアルタイム型の進行でシステムをデザインしてたんですけどね。(多分マスターデュエルはそういう設計じゃないかな。あれは触った感じ結構優秀なプログラマの仕事に見えたので、長期的に運用するタイトルで何をやらなきゃいけなくなるのかも読めないこともあり、相当丁寧に設計をしてるはず)
うーん、この提案は完全に想定の外を突かれてツライ。
とはいえ、勝利確定時のプレイヤーの手応えを増やしたいという意図は妥当で演出自体の価値は確かにあるから多少の工数は見ても実現したいところです。
……はい、そこでタイトルですよ。結論。
現況をディープコピーした仮想空間を作って、そこでカードを実際に使用し、勝敗判定をします。
厳密に言うと現実側で演算やってから、過去状態を保存したディープコピーで上書きして全てなかった事にするという形ですね。(デリゲートは仮想空間の存在を想定してないから現実側にしかアクセスできない)
この考え方で抜けはない……はず……。
リファクタリング的には本当は演出と処理を非同期的にするべくもう一層作って噛ませる形に組み直した方がいいんですけど、影響範囲が大きすぎるのと実利が薄そうなので今回は見送ります。
ちなみに、この話以外にも演出回りの修正を進めています。
カードパック獲得演出が豪華になったり……
手札やスタックのターゲット表示が常時になったり