召還とリザレクション(蘇生)を作った


2017年 12月9日
 
 
 今回もそれなりに大変だった。

 隊列の処理が意外とややこしい。

 それと召還のユニットデータとステータスデータをどうするか、というのもある。
 
 
 では召還から。
 
 まず召還したユニットのユニット No.を控えておく変数を作る。

 dim smnfn,6

 召還されるのは隊列最大の 6を超えないはずなので配列は 6でよい(召還されたものが召還を使うのでもなければ最大は 4)

 戦闘ステータス bsは、死んだユニットの場所を使うので変更無し。
 
 
 ではソースを

 
 
 まず当然ながら隊列がいっぱいの場合は召還しない。

 ユニットデータは一般のデータ udの空きをそのまま使う。

 そうしないと戦闘プログラムで運用できない。

 その部隊の戦闘が終わったら smnfnに控えておいたユニットのデータを消す。

 ソースの隊列にセットの部分で、召還者の位置を元に隊列を詰めて召還する場所を確定する。

 意外とややこしいのが分かると思う。
 
 
 ではテスト

 光の召還、ウィル・オ・ウィスプ


 
 
 召還者の前に召還される。

 下の緑の表示でデバッグ確認用の smnfnを書いてる。

 召還されたユニットNO.は 113だが、これはマップ全部でユニットが 112作成されてるから。
 
 
 部隊が埋まるまで(といっても最大 2体という事だが)召還される。


 
 
 闇の召還、デモンズゲート(悪魔召還)


 
 
 3種の内ランダムで召還される。


 
 
 
 と、いう訳で次はリザレクション(蘇生)

 これの隊列処理が大変だった。

 蘇生位置の隊列の変更と、召還されたものの場合は潰さないといけない、どれを詰めてどれを潰すか?

 共通の法則は無いか、紙数枚に書いて丸一日思考錯誤していたが、自分にはどうにも法則は分からなかった。

 結局蘇生される者の元の隊列の位置を格納しておいて参照し、その場所と現在の隊列のユニット数を元に「ベタ処理」する事にした。

 dim sfn,7 ; 初期隊列un格納

 dim rfn,4 ; 蘇生候補と蘇生処理時の隊列
 
 
 ではソースを

 
 
 隊列の処理だけでこれだけのソースになると言う事から、いかに意外とややこしいか分かってもらえるだろう。

 だからたぶん素質のあるプログラマーなら共通法則を導き出して簡素化するんだろうと思うが、自分はペーペーなのでそんなのサッパリ分からない。
 
 
 まず元の隊列を格納してある変数 sfnを元に死者がいるかどうか調べ、2名死んでる場合はどちらかランダムで選ぶ。

 次に同 sfnを参照して元のユニットが隊列の何番目だったかを確認する。

 あ、そうそう smfというのは、そのユニットが召還かどうか調べる関数(自作命令)です。

 隊列の変更はまず現在の隊列が何人いるかで処理を変える。

 3人全部埋まってる場合に、召還ユニットがあれば潰す事になる。

 分岐した処理それぞれで、復帰する隊列事に「ベタ処理」を敢行する。

 特別なのは 2列目の処理で、2列目に 1や 3が入っていると、詰め方が特殊になる。

 処理前に rfnに隊列を格納してから処理し、その後に現在の隊列 fn1、fn2に格納しなおす。

 こうする事で処理ソースを一つにしている。
 
 
 少し図を描こうかと思ったけど、どうにもめんどくさいので止めた。

 という訳で説明はこれくらいにして後はソースで理解してもらうとして(無茶だけど)テストする。
 
 
 召還とリザをセットする。


 
 
 先頭がやられた


 
 
 1個詰めて、召還者の前に召還をセット


 
 
 その後から召還を潰してリザ


 
 
 先頭が2名やられている状態で召還


 
 
 そしてリザ、この場合 1列目が蘇生された模様。


 
 
と、いうような感じです。
 
 
 
 これにて魔法は今の所コンプリートになりました。

 たぶんバグてんこもりだと思うけど、追々潰していこう。
 
 
 次はどうするかな?

 戻ってユニットの特殊能力を整備するかな。

 ではまた。
 
 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です