SRC遊んだり書いたり。時々プログラミング

SRCの感想とか技術解説とか、そんな感じのアレ!

連続ターゲット補正インクルの技術解説 その2

一昨日の記事に引き続き、拙作インクルードの技術解説続きです。
インクルードを書いてみたい方の参考になれば幸い。

バトルコンフィグデータで補正値を命中率に反映


命中率に連続ターゲット補正を反映するため、バトルコンフィグデータにデータを追加します。

最終命中率
最終値 + Call(連続ターゲット補正, 防御側ユニットID)

'最終値'にはSRC側で計算済みの命中率が入っています。これに補正値を加算して、実際の命中率とします。
呼び出しているサブルーチンはインクルードのeveファイルで次のように定義しています。

//戦闘計算に連続ターゲット補正を適用する
連続ターゲット補正:
Return 連続ターゲット補正値[Args(1)]

そのユニットの補正値を返しています。*1

バトルコンフィグデータとは

SRCの戦闘時の各種計算式を、任意に設定する事ができるファイルです。
シナリオの Data\System\battle.txt に定義します。記述の仕方はSRCの ヘルプファイル - バトルコンフィグデータ をご覧ください。

HPが減少していたら補正値をリセットする


被弾時に連続ターゲット補正がリセットされるようにします。
これはオプションなので、設定で機能をオン・オフできるようにします。

被弾を確認するには、まず攻撃前のHPを変数に覚えさせます。

//被弾リセットのオプションが有効なら
//被弾時、連続ターゲット補正をリセットする
*攻撃 全 全:
If 連続ターゲット補正被弾リセット = on Then
	//攻撃前のHPを保存
	Set 対象攻撃前HP HP(対象ユニットID)
	Set 相手攻撃前HP HP(相手ユニットID)
EndIf
Exit

次に、攻撃後のHPを攻撃前のHPと比べます。

*攻撃後 全 全:
If 連続ターゲット補正被弾リセット = on Then
	//HPが減っているなら連続ターゲット補正をリセット
	If 対象攻撃前HP != HP(対象ユニットID) Then
		Call 連続ターゲット補正リセット 対象ユニットID
	EndIf
	
	If 相手攻撃前HP != HP(相手ユニットID) Then
		Call 連続ターゲット補正リセット 相手ユニットID
	EndIf
EndIf
Exit

戦闘前と戦闘後でHPが異なっているなら、攻撃が命中したと判定します。

連続ターゲット補正のリセットは、変数を削除しているだけです。

//連続ターゲット補正値をリセットする
連続ターゲット補正リセット:
UnSet 連続ターゲット補正値[Args(1)]
Return

単独の処理をわざわざサブルーチンにしているのは、実装方法に変更があった時に、変更箇所が一箇所で済むようにするためです。

ターンイベントで補正値をリセットする


いよいよ最後です。連続ターゲット補正は毎ターン毎にリセットされるので、ターンイベントで、その陣営のユニット全員分の補正値をリセットします。
これも、上記のリセット用のサブルーチンを呼び出すだけです。

*ターン 全 全:
Call 連続ターゲット補正解除
Exit

//現フェイズの全ユニットの連続ターゲット補正を解除する
連続ターゲット補正解除:
ForEach フェイズ
    Call 連続ターゲット補正リセット 対象ユニットID
Next
Return

*2
ForEach文には陣営を指定できるので、

ForEach フェイズ
    //処理
Next

と書く事で、現在のフェイズの陣営のユニット全員に同じ処理を実施する事ができます。

システム変数

上記の「フェイズ」はシステム変数です。システム変数には、SRC自体が自動的に変数を代入しています。
「フェイズ」には、その処理時点での手番の陣営名が入っています。

システム変数については、SRCのヘルプ - 変数 を御覧ください。

*1:補正値の変数を直接バトルコンフィグデータに記述してもOKなので、少し冗長な実装になっちゃいました。

*2:これも少し冗長な実装になっています。ターンイベント内に直接ForEach以下を記述した方がよりスマートです。