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

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

連続ターゲット補正インクル公開と技術解説

本題

先日、SRCのインクルード、その名も
「連続ターゲット補正インクル」
をリリースしました。

今日は、インクルードの説明と、あとSRCの技術解説はあまり見かけないので、インクルードがどのようにして作られているのかを少しばかり解説したいと思います。

どんなインクル?

スーパーロボット大戦基準の「連続ターゲット補正」を再現するインクルードです。
インクルードをシナリオに適用するだけで、連続ターゲット補正が実装されます。

連続ターゲット補正とは

ユニットが攻撃を受ける(回避も含む)度に、次のターンまでの間、一定ずつ回避率が低下していきます。

技術解説

連続ターゲット補正のイメージ

  1. 設定は簡単に変更できるようにする
  2. 攻撃を受けた時に補正が上昇する
  3. 戦闘時、補正値に応じて敵の攻撃の命中率が上がる
  4. 被弾した場合、補正値がリセットされる(オプション)
  5. フェイズ開始時に補正値がリセットされる

前準備、設定の簡素化


次の2つの項目について、ユーザがインクルードの知識を持っていなくても簡単に変更できるようにします。

  • 攻撃一回ごとの補正値の上昇幅
  • 被弾時に補正値をリセットするかどうか

実装

インクルードファイル冒頭にプロローグイベントを設け、グローバル変数として設定を記述します。

*プロローグ:
## 設定ここから ############################
Set 連続ターゲット補正加算値 15
Set 連続ターゲット補正被弾リセット off
## 設定ここまで ############################
Global 連続ターゲット補正加算値
Global 連続ターゲット補正被弾リセット
Exit

ユーザが変更可能な箇所は、コメントで強調してわかりやすくします。
そうする事で、インクルードの利用の幅が広がり、インクルード自体もより使いやすくなります。

攻撃後イベントで補正値を加算


連続して攻撃された際にどんどん回避しづらくなっていくことを再現するために、攻撃後イベントで補正値を加算します。

実装

//攻撃しているなら、相手側の連続ターゲット補正を加算する
*攻撃後 全 全:
If Call(連タ攻撃チェック,対象ユニット使用武器) Then
    Call 連続ターゲット補正加算 相手ユニットID
EndIf

If Call(連タ攻撃チェック,相手ユニット使用武器) Then
    Call 連続ターゲット補正加算 対象ユニットID
EndIf
Exit

攻撃後イベントが常時イベントラベル(イベントラベルの頭に *(アスタリスク)が付いている)になっていることに注目して下さい。
SRCは、同時に複数のイベントラベルが実行可能なとき、一番最初に書かれているイベントのみを実行して、以降のイベントを無視します。
(例えば、「攻撃後 全 全」というイベントの後の行に「攻撃後 味方 敵」というイベントがあっても、実行されるのは「攻撃後 全 全」だけです)

常時イベントラベルであれば、そのイベントは、実行可能なとき、必ず実行されます。インクルードは常に実行されるものなので、特に理由がない限りは常時イベントラベルで記述します。

連続ターゲット補正は反撃時にも上昇するので、それぞれのユニットが攻撃(反撃)をしているかチェックします。

連タ攻撃チェック:
Local res = 0
Switch Args(1)
Case "回避" "防御" ""
Case Else
    Set res 1
EndSw
Return res

ユニット使用武器が回避・防御・空文字列の時(=攻撃をしていない)に 0、攻撃をしている時に 1を返すサブルーチンです。

補正値の加算は次のようになっています。

//連続ターゲット補正を加算する
連続ターゲット補正加算:
Incr 連続ターゲット補正値[Args(1)] 連続ターゲット補正加算値
Return

補正値を保存する変数は、ユニットIDをキーにした連想配列*1です。多少ややこしく見えるかもしれませんが、要するに、ユニットごとに補正値の変数を保存しています。

*1:数値以外をキーに持つ配列。ここでは文字列