オーバーワールドでの戦闘攻撃?

不要です。敵にはそれが必要ありません。前の投稿で説明した「前タイルチェック」が、敵にとっての攻撃判定の役割を果たします。これは「このイベント」と自己変数を使って、あなたのヒット判定セクションと同じ方法で構築されているため、配置した敵のコピーそれぞれが独自の判定を持ち、複製する余計な部分は nothing です。

以下に、この判定を含む基本的な攻撃ロジックを示します。ページ上でどの位置にあるか確認してください。敵がいつ攻撃するかを決定する条件が明確になるまで、この攻撃は「プレイヤーが敵の前方のタイルにいて、かつクールダウンが完了している」場合に発動します。SV: Atk Cooldown(攻撃クールダウン)、SV: Front X(前方X座標)、SV: Front Y(前方Y座標)、SV: Front Dir(前方方向)、SV: Target X(ターゲットX座標)、SV: Target Y(ターゲットY座標)は新しい自己変数で、他の変数と同じように設定しています。括弧内の部分は既存の内容で、変更はありません:

(設定ブランチ、以下のMoveset行以外は変更なし)
(攻撃ロジック、変更なし)
◆If: SV: Atk Cooldown > 0
  ◆Control Variables: #0XXX SV: Atk Cooldown -= 1
◆End
◆If: SV: Atk Cooldown = 0
  ◆Control Variables: #0XXX SV: Front X = Map X of This Event
  ◆Control Variables: #0XXX SV: Front Y = Map Y of This Event
  ◆Control Variables: #0XXX SV: Front Dir = Direction of This Event
  ◆If: SV: Front Dir = 2
    ◆Control Variables: #0XXX SV: Front Y += 1
  ◆End
  ◆If: SV: Front Dir = 4
    ◆Control Variables: #0XXX SV: Front X -= 1
  ◆End
  ◆If: SV: Front Dir = 6
    ◆Control Variables: #0XXX SV: Front X += 1
  ◆End
  ◆If: SV: Front Dir = 8
    ◆Control Variables: #0XXX SV: Front Y -= 1
  ◆End
  ◆Control Variables: #0XXX SV: Target X = Map X of Player
  ◆Control Variables: #0XXX SV: Target Y = Map Y of Player
  ◆If: SV: Front X = SV: Target X
    ◆If: SV: Front Y = SV: Target Y
      (プレイヤーが攻撃された際に表示したい効果音やフラッシュ)
      ◆Control Variables: #0232 SV: Damage = SV: This Event ATK
      ◆Control Variables: #0232 SV: Damage *= 100
      ◆Control Variables: #0233 SV: Def Calc = Player DEF
      ◆Control Variables: #0233 SV: Def Calc += 100
      ◆Control Variables: #0232 SV: Damage /= SV: Def Calc
      ◆Control Variables: #0XXX Player HP -= SV: Damage
      ◆Control Variables: #0XXX SV: Atk Cooldown = 60
    ◆End
  ◆End
◆End
(ヒット判定セクション、変更なし)
(Hit 0 チェック、変更なし)

60 は約1秒間のクールダウン時間を表します。各コピーは独自のクールダウンをカウントするため、マップ上のすべての敵が個別にタイミングを維持します。

コピーがどの移動パターンを使用するかは、ステータスと同様に設定ブランチから決定できます。各 ENEMY FORM ブランチに1行追加します:

◆If: ENEMY FORM = 3
  ◆Control Variables: #0189 SV: This event HP = 100
  ◆Control Variables: #0XXX SV: This Event ATK = 20
  ◆Control Variables: #0XXX SV: This Event DEF = 20
  ◆Control Variables: #0XXX SV: Moveset = 3
◆End

速度上昇と突進(ram)は、基本的な攻撃の直下、If: SV: Moveset = 3 の内部に配置します。

S弾のような移動する攻撃の場合、数フレームごとに SV: Front X と Y をさらに1タイル先に押し出し、毎回プレイヤーをチェックすることで、イベント自体をスキップすることも可能です。イベントで実現できない唯一のことは、弾が飛んでいる様子を目視確認することです。イベントはプレイ中に新しいイベントを作成できないため、視覚的な爆発エフェクトを出すには、敵ごとに当たり判定イベントを配置する必要があります。

敵が攻撃するタイミングをどう決定するか、そして敵の攻撃でプレイヤーがノックバックされるべきかどうかは、どのように考えますか?

敵はプレイヤーが1タイル以内に入ったときに攻撃してほしいのですが、その前に5フレーム程度の短い待機時間を入れて、プレイヤーが近づきすぎた場合に逃げられるようにしたいです。もしこれが理解できるならですが。

前方タイルのチェックについてのおっしゃる意味はわかります。私が言っているのは、攻撃の衝突エフェクトがプレイヤーから出て敵に接触し、ダメージを与えるという視覚効果のことです。敵にもそのような視覚効果を持たせることはできますか?

これは巻き上げタイマー(windup timer)と動作し、ActionTimerと同じ形状をしています。敵の隣にある4つのタイルのいずれかにいて、敵のクールダウンが完了すると、敵はあなたの方を向いて静止し、5フレームのカウントダウンを開始します。カウントが0になると攻撃が発生し、あなたがまだ隣にいない限りダメージは入りません。マップのX座標とY座標は、ステップ開始と同時に新しいタイルに切り替わるため、カウントが終了する前に1歩離れれば回避できます。

視覚効果についてはその通りです。また、敵ごとに個別に用意する必要はありません。攻撃の演出は画面に数フレームしか表示されないため、すべてのコピーが1つのイベントを共有し、順番にそれを使用できます。スイッチを使用して「使用中」フラグを立て、2体の敵が同時に攻撃した場合、2体目はスライド演出は行いませんが、ダメージは正常に与えます。

共有イベントのセットアップは、各バトルマップで1回行います:

  1. 「Enemy Swing」という名前の新しいイベントを作成し、マップ上の目立たない場所に配置します。
  2. 画像は空白のままにします。ルートで設定します。
  3. オプション:「通行人ON」。優先度:「キャラクターより上」に設定し、プレイヤーの上に描画されるようにします。
  4. 「Enemy Swing Busy」という新しいスイッチを作成し、バトル開始時にOFFになっていることを確認します。これで、マップ移動によって攻撃が中断されることを防ぎます。

これは前の投稿の基本攻撃ブロックを置き換えるもので、同じ場所に配置します。SV: WindupとSV: Distanceは新しい自己変数(self variables)であり、Swing X、Swing Y、Swing Dirはそこでのみ使用されるため通常の変数でも構いません。前回使用したFrontやTargetの自己変数は、この処理では必要ありません。括弧内は既存の内容で、変更はありません:

(your setup branch, unchanged)
(your attack logic, unchanged)
◆If: SV: Atk Cooldown > 0
  ◆Control Variables: #0XXX SV: Atk Cooldown -= 1
◆End
◆If: SV: Windup > 0
  ◆Control Variables: #0XXX SV: Windup -= 1
  ◆If: SV: Windup = 0
    ◆Control Variables: #0XXX Swing X = Map X of This Event
    ◆Control Variables: #0XXX Swing Y = Map Y of This Event
    ◆Control Variables: #0XXX Swing Dir = Direction of This Event
    ◆If: Enemy Swing Busy is OFF
      ◆Control Switches: #0XXX Enemy Swing Busy = ON
      ◆If: Swing Dir = 2
        ◆Set Event Location: Enemy Swing, ({Swing X},{Swing Y}), Down
      ◆End
      ◆If: Swing Dir = 4
        ◆Set Event Location: Enemy Swing, ({Swing X},{Swing Y}), Left
      ◆End
      ◆If: Swing Dir = 6
        ◆Set Event Location: Enemy Swing, ({Swing X},{Swing Y}), Right
      ◆End
      ◆If: Swing Dir = 8
        ◆Set Event Location: Enemy Swing, ({Swing X},{Swing Y}), Up
      ◆End
      ◆Set Movement Route: Enemy Swing (Skip)
        : Image: (your enemy swing graphic)
        : Speed: 6
        : Transparent OFF
        : 1 Step Forward
        : Wait: 6 frames
        : Transparent ON
        : Switch OFF: #0XXX Enemy Swing Busy
    ◆End
    ◆Control Variables: #0XXX SV: Distance = Math.abs($gamePlayer.x - this.character(0).x) + Math.abs($gamePlayer.y - this.character(0).y)
    ◆If: SV: Distance = 1
      (whatever sound or flash you want when the player gets hit)
      ◆Control Variables: #0232 SV: Damage = SV: This Event ATK
      ◆Control Variables: #0232 SV: Damage *= 100
      ◆Control Variables: #0233 SV: Def Calc = Player DEF
      ◆Control Variables: #0233 SV: Def Calc += 100
      ◆Control Variables: #0232 SV: Damage /= SV: Def Calc
      ◆Control Variables: #0XXX Player HP -= SV: Damage
    ◆End
    ◆Control Variables: #0XXX SV: Atk Cooldown = 60
  ◆End
: Else
  ◆If: SV: Atk Cooldown = 0
    ◆Control Variables: #0XXX SV: Distance = Math.abs($gamePlayer.x - this.character(0).x) + Math.abs($gamePlayer.y - this.character(0).y)
    ◆If: SV: Distance = 1
      ◆Script: this.character(0).turnTowardPlayer();
      ◆Set Movement Route: This Event
        : Wait: 5 frames
      ◆Control Variables: #0XXX SV: Windup = 5
    ◆End
  ◆End
◆End
(your hit section, unchanged)
(your HP 0 check, unchanged)

回転処理は、ルート内の「プレイヤーの方を向く」ではなくScript行として実装しています。強制ルートは、敵が現在のステップを完了するまで待機するためです。これはノックバック時の遅延と同じ原理です。敵があなたに近づいた直後だと、まだステップの途中である可能性があり、ルートのバージョンだと歩いていた方向のまま攻撃してしまうことがあります。

5フレームは約12分の1秒です。もし回避するには速すぎる場合は、SV: Windup = 5 とその下の Wait の値を一緒に増やしてください。

注意点として、バトルマップが複数ある場合です。敵のコマンドはイベントIDで「Enemy Swing」を検索するため、敵をコピーしたどのマップでも、「Enemy Swing」は同じIDである必要があります。IDはイベントウィンドウの上部に表示されます。

了解しました。そこまでは理解できました。

このすべてが行われる戦闘マップは1つだけで、プレイヤーが入ったり出たりする時以外は転送が発生しません。

画面に敵の「スイング」が同時に1体しか存在できないというアイデアには少し懸念があります。マップの性質上、プレイヤーは一度に複数の敵に囲まれることが多いです。これについて何か対策は可能でしょうか?プラグインなどで対応できるでしょうか?

視覚的な要素がないと説明が少し分かりにくくなっているようであれば、Discordを共有して、これまでの動作を画面共有で直接お見せすることもできます。

はい、プラグインは不要です。戦闘マップが1つだけしかない場合、4つの「Enemy Swing」イベントを配置し、それぞれが空いているものを取りに行くように設定できます。敵はあなたに接している4つのタイルのいずれかからしかスイングしないため、4つあれば四方を囲まれた場合でもカバーできます。もし5つ目が他の4つがすべて使用中のときに重なっても、スライドは行われませんが、ダメージは与えます。

この「空きスロットの選択」処理は1つの共通イベントにまとめます。こうすることで敵のページが短くなり、すべてのコピーがそれを共有できます。

  1. 「Enemy Swing」を「Enemy Swing 1」にリネームし、それを3回コピー&ペーストしてそれぞれ「Enemy Swing 2」「3」「4」と命名します。
  2. 「Enemy Swing Busy」スイッチを「Enemy Swing 1 Busy」にリネームし、「Enemy Swing 2 Busy」「3 Busy」「4 Busy」も作成します。戦闘開始時にこれら4つはすべてOFFになっている必要があります。
  3. データベース > 共通イベントで、トリガー「なし」の「ENEMY SWING」という新しい共通イベントを作成し、以下の内容を入力します:
◆If: Enemy Swing 1 Busy is OFF
  ◆Control Switches: #0XXX Enemy Swing 1 Busy = ON
  ◆If: Swing Dir = 2
    ◆Set Event Location: Enemy Swing 1, ({Swing X},{Swing Y}), Down
  ◆End
  ◆If: Swing Dir = 4
    ◆Set Event Location: Enemy Swing 1, ({Swing X},{Swing Y}), Left
  ◆End
  ◆If: Swing Dir = 6
    ◆Set Event Location: Enemy Swing 1, ({Swing X},{Swing Y}), Right
  ◆End
  ◆If: Swing Dir = 8
    ◆Set Event Location: Enemy Swing 1, ({Swing X},{Swing Y}), Up
  ◆End
  ◆Set Movement Route: Enemy Swing 1 (Skip)
    : Image: (your enemy swing graphic)
    : Speed: 6
    : Transparent OFF
    : 1 Step Forward
    : Wait: 6 frames
    : Transparent ON
    : Switch OFF: #0XXX Enemy Swing 1 Busy
  ◆Exit Event Processing
◆End
◆If: Enemy Swing 2 Busy is OFF
  ◆Control Switches: #0XXX Enemy Swing 2 Busy = ON
  ◆If: Swing Dir = 2
    ◆Set Event Location: Enemy Swing 2, ({Swing X},{Swing Y}), Down
  ◆End
  ◆If: Swing Dir = 4
    ◆Set Event Location: Enemy Swing 2, ({Swing X},{Swing Y}), Left
  ◆End
  ◆If: Swing Dir = 6
    ◆Set Event Location: Enemy Swing 2, ({Swing X},{Swing Y}), Right
  ◆End
  ◆If: Swing Dir = 8
    ◆Set Event Location: Enemy Swing 2, ({Swing X},{Swing Y}), Up
  ◆End
  ◆Set Movement Route: Enemy Swing 2 (Skip)
    : Image: (your enemy swing graphic)
    : Speed: 6
    : Transparent OFF
    : 1 Step Forward
    : Wait: 6 frames
    : Transparent ON
    : Switch OFF: #0XXX Enemy Swing 2 Busy
  ◆Exit Event Processing
◆End
◆If: Enemy Swing 3 Busy is OFF
  ◆Control Switches: #0XXX Enemy Swing 3 Busy = ON
  ◆If: Swing Dir = 2
    ◆Set Event Location: Enemy Swing 3, ({Swing X},{Swing Y}), Down
  ◆End
  ◆If: Swing Dir = 4
    ◆Set Event Location: Enemy Swing 3, ({Swing X},{Swing Y}), Left
  ◆End
  ◆If: Swing Dir = 6
    ◆Set Event Location: Enemy Swing 3, ({Swing X},{Swing Y}), Right
  ◆End
  ◆If: Swing Dir = 8
    ◆Set Event Location: Enemy Swing 3, ({Swing X},{Swing Y}), Up
  ◆End
  ◆Set Movement Route: Enemy Swing 3 (Skip)
    : Image: (your enemy swing graphic)
    : Speed: 6
    : Transparent OFF
    : 1 Step Forward
    : Wait: 6 frames
    : Transparent ON
    : Switch OFF: #0XXX Enemy Swing 3 Busy
  ◆Exit Event Processing
◆End
◆If: Enemy Swing 4 Busy is OFF
  ◆Control Switches: #0XXX Enemy Swing 4 Busy = ON
  ◆If: Swing Dir = 2
    ◆Set Event Location: Enemy Swing 4, ({Swing X},{Swing Y}), Down
  ◆End
  ◆If: Swing Dir = 4
    ◆Set Event Location: Enemy Swing 4, ({Swing X},{Swing Y}), Left
  ◆End
  ◆If: Swing Dir = 6
    ◆Set Event Location: Enemy Swing 4, ({Swing X},{Swing Y}), Right
  ◆End
  ◆If: Swing Dir = 8
    ◆Set Event Location: Enemy Swing 4, ({Swing X},{Swing Y}), Up
  ◆End
  ◆Set Movement Route: Enemy Swing 4 (Skip)
    : Image: (your enemy swing graphic)
    : Speed: 6
    : Transparent OFF
    : 1 Step Forward
    : Wait: 6 frames
    : Transparent ON
    : Switch OFF: #0XXX Enemy Swing 4 Busy
  ◆Exit Event Processing
◆End

「Exit Event Processing」は共通イベントのみを終了し、それを呼び出した敵自体は終了しないため、これ以降のスロット(イベント)が同時に発動するのを防ぎます。

敵イベント側では、「If: Enemy Swing Busy is OFF」ブロックをスイング処理から外し、その代わりに「Common Event」の行を挿入します。変更後のスイング処理は以下の通りです。かっこ内は変更なしの部分です:

◆If: SV: Windup > 0
  ◆Control Variables: #0XXX SV: Windup -= 1
  ◆If: SV: Windup = 0
    ◆Control Variables: #0XXX Swing X = Map X of This Event
    ◆Control Variables: #0XXX Swing Y = Map Y of This Event
    ◆Control Variables: #0XXX Swing Dir = Direction of This Event
    ◆Common Event: ENEMY SWING
    ◆Control Variables: #0XXX SV: Distance = Math.abs($gamePlayer.x - this.character(0).x) + Math.abs($gamePlayer.y - this.character(0).y)
    ◆If: SV: Distance = 1
      (your hit on the player, unchanged)
    ◆End
    ◆Control Variables: #0XXX SV: Atk Cooldown = 60
  ◆End
: Else
  (your windup start, unchanged)
◆End

プラグイン側では、Galv’s Event Spawner MZを使用すると、プレイ中にイベントをマップ上にコピーできるため、上限の制限がなくなります。ただし、すでに持っている設定で動作する4つのスロット方式をまず試してみることをお勧めします。

そのプラグイン、この用途に合っていれば実際に導入しようかな。開発期間中ずっと4つに依存したくないんだ。先にどんな新しい動きや戦闘スタイルが採用されるか分からないし、後で敵にスイングを追加するために修正するより、早めにスイングの制限を外したいから。今すぐダウンロード方法を確認しに行くよ。そのプラグインについて詳しく知っている?使い方についてアドバイスしてもらえる?

十分に機能するはずです。これは、プレイ中に、テンプレート用に確保したマップからイベントを現在のマップにコピーし、完了するとコピー自体を削除する仕組みです。そのため、攻撃のたびに独立した「Enemy Swing」イベントが生成され、移動し、削除されます。同時に存在するイベント数に制限はありません。

設定方法:

  1. テンプレート専用の新しいマップを作成します。例えば「SPAWN」という名前にします。プレイヤーはこのマップに入らず、コピー元のイベントのみを保持します。
  2. プラグインマネージャーで、Galv’s Spawn Map Id をそのマップの ID に設定します。この設定を行うまで、ゲーム起動時にエラーが発生します。
  3. SPAWN マップ上で、最初のイベントとして「Enemy Swing」という名前のイベントを作成し、ID を 1 にします。
  4. 画像: 攻撃のグラフィック。オプション: Through ON(透過 ON)、Direction Fix OFF(方向固定 OFF)。優先度: キャラクターより上。トリガー: 並列処理。そして以下のコマンド:
◆移動ルートの設定: このイベント(スキップ、待機)
  : 速度: 6
  : 1 ステップ前進
  : 待機: 6 フレーム
◆スクリプト: Galv.SPAWN.unspawn(this);

スクリプト行はコピーを削除する処理なので、最後に配置する必要があります。

敵はすでに「ENEMY SWING」を呼び出しているため、敵自体は変更されません。共通イベント内のすべての内容を削除し、その代わりに以下の3行を1つのスクリプトコマンドボックスに記述してください:

◆スクリプト: const e = this.character(0);
         Galv.SPAWN.event(1, 'xy', [e.x, e.y], 'all', false);
         $gameMap.event($gameMap._lastSpawnEventId).setDirection(e.direction());

共通イベント内では、this.character(0) を呼び出した敵を示します。そのため、コピーは敵がいるタイル上に生成され、同じ方向を向きます。1 ステップ前進は、敵が攻撃する方向へ移動します。1 は SPAWN マップ上のテンプレートのイベント ID です。‘all’ は、敵がすでに立っているタイル上にもコピーを生成することを許可します。false は、コピーを一時的なものとし、マップに保存されないようにします。

4つの「Enemy Swing」イベント、4つの「Busy」スイッチ、そして戦闘開始時にそれらを OFF にする行はすべて削除できます。また、敵に含まれる「Swing X」、「Swing Y」、「Swing Dir」の行も使用されなくなったため、これらもいつでも削除できます。

了解しました。すべて設定完了のようです!

もしや何か間違えてしまったらどうしようという不安があるので、これまでのすべての変更を含んだ完全なコードブロックを教えていただいても差し支えないでしょうか?

ここに、このスレッドの全内容を反映した敵ページ全体を、上から下まで載せます。括弧で囲まれた部分は、私が確認していないもの、またはあなたが動作確認した際に変更されていないものですので、そのままにしておいてください。(あなたの数値)と記載されている箇所は、すでに持っている数値をそのまま維持してください。

◆条件分岐:自己スイッチ(あなたの設定スイッチ)が OFF の場合
  (あなたの表示設定、変更なし)
  ◆条件分岐:敵のフォーム = 1
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆条件分岐:敵のフォーム = 2
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆条件分岐:敵のフォーム = 3
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆条件分岐:敵のフォーム = 4
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆条件分岐:敵のフォーム = 5
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆条件分岐:敵のフォーム = 6
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆条件分岐:敵のフォーム = 7
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆条件分岐:敵のフォーム = 8
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆条件分岐:敵のフォーム = 9
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆条件分岐:敵のフォーム = 10
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆条件分岐:敵のフォーム = 11
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆条件分岐:敵のフォーム = 12
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆条件分岐:敵のフォーム = 13
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆条件分岐:敵のフォーム = 14
    ◆変数操作:#0189 変数:このイベントの HP = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの ATK = (あなたの数値)
    ◆変数操作:#0XXX 変数:このイベントの DEF = (あなたの数値)
  ◆条件分岐終了
  ◆自己スイッチ操作:(あなたの設定スイッチ)= ON
◆条件分岐終了
(あなたの攻撃ロジック、変更なし)
◆条件分岐:変数:攻撃クールダウン > 0
  ◆変数操作:#0XXX 変数:攻撃クールダウン -= 1
◆条件分岐終了
◆条件分岐:変数:ウィンドアップ > 0
  ◆変数操作:#0XXX 変数:ウィンドアップ -= 1
  ◆条件分岐:変数:ウィンドアップ = 0
    ◆コモンイベント:敵スイング
    ◆変数操作:#0XXX 変数:距離 = Math.abs($gamePlayer.x - this.character(0).x) + Math.abs($gamePlayer.y - this.character(0).y)
    ◆条件分岐:変数:距離 = 1
      (プレイヤーが hit されたときの音やエフェクト、お好きなものを)
      ◆変数操作:#0232 変数:ダメージ = 変数:このイベントの ATK
      ◆変数操作:#0232 変数:ダメージ *= 100
      ◆変数操作:#0233 変数:防御計算 = プレイヤーの DEF
      ◆変数操作:#0233 変数:防御計算 += 100
      ◆変数操作:#0232 変数:ダメージ /= 変数:防御計算
      ◆変数操作:#0XXX プレイヤーの HP -= 変数:ダメージ
    ◆条件分岐終了
    ◆変数操作:#0XXX 変数:攻撃クールダウン = 60
  ◆条件分岐終了
: それ以外
  ◆条件分岐:変数:攻撃クールダウン = 0
    ◆変数操作:#0XXX 変数:距離 = Math.abs($gamePlayer.x - this.character(0).x) + Math.abs($gamePlayer.y - this.character(0).y)
    ◆条件分岐:変数:距離 = 1
      ◆スクリプト:this.character(0).turnTowardPlayer();
      ◆移動ルート設定:このイベント
        : 待機:5 フレーム
      ◆変数操作:#0XXX 変数:ウィンドアップ = 5
    ◆条件分岐終了
  ◆条件分岐終了
◆条件分岐終了
◆条件分岐:攻撃中 が ON の場合
  ◆条件分岐:自己スイッチ B が OFF の場合
    ◆変数操作:#0192 変数:攻撃当たり X = 攻撃判定のマップ X
    ◆変数操作:#0193 変数:攻撃当たり Y = 攻撃判定のマップ Y
    ◆条件分岐:攻撃タイプ = 2
      ◆変数操作:#0192 変数:攻撃当たり X = プレイヤーのマップ X
      ◆変数操作:#0193 変数:攻撃当たり Y = プレイヤーのマップ Y
      ◆変数操作:#0221 当たり方向 = プレイヤーの方向
      ◆条件分岐:当たり方向 = 2
        ◆変数操作:#0193 変数:攻撃当たり Y += 1
      ◆条件分岐終了
      ◆条件分岐:当たり方向 = 4
        ◆変数操作:#0192 変数:攻撃当たり X -= 1
      ◆条件分岐終了
      ◆条件分岐:当たり方向 = 6
        ◆変数操作:#0192 変数:攻撃当たり X += 1
      ◆条件分岐終了
      ◆条件分岐:当たり方向 = 8
        ◆変数操作:#0193 変数:攻撃当たり Y -= 1
      ◆条件分岐終了
    ◆条件分岐終了
    ◆変数操作:#0194 変数:自分の X = このイベントのマップ X
    ◆変数操作:#0195 変数:自分の Y = このイベントのマップ Y
    ◆変数操作:#0232 変数:ダメージ = プレイヤーの ATK
    ◆変数操作:#0232 変数:ダメージ *= 移動パワー
    ◆変数操作:#0233 変数:防御計算 = 変数:このイベントの DEF
    ◆変数操作:#0233 変数:防御計算 += 100
    ◆変数操作:#0232 変数:ダメージ /= 変数:防御計算
    ◆条件分岐:攻撃タイプ = 4
      ◆変数操作:#0189 変数:このイベントの HP -= 変数:ダメージ
      ◆SE 再生:Blow1 (90, 150, 0)
      ◆移動ルート設定:このイベント
        : ブレンドモード:加算
        : 待機:30 フレーム
        : ブレンドモード:通常
      ◆自己スイッチ操作:B = ON
    ◆条件分岐終了
    ◆条件分岐:変数:攻撃当たり X = 変数:自分の X
      ◆条件分岐:変数:攻撃当たり Y = 変数:自分の Y
        ◆条件分岐:攻撃タイプ = 0
          ◆コモンイベント:ダメージ SFX
          ◆コモンイベント:画面振動 SMALL
          ◆変数操作:#0189 変数:このイベントの HP -= 変数:ダメージ
          ◆変数操作:#0194 変数:自分の X = Math.round(this.character(0)._realX)
          ◆変数操作:#0195 変数:自分の Y = Math.round(this.character(0)._realY)
          ◆イベント位置設定:このイベント、({変数:自分の X},{変数:自分の Y})
          ◆移動ルート設定:このイベント (スキップ、待機)
            : 速度:6
            : プレイヤーの方を向く
            : 後退 1 ステップ
            : 後退 1 ステップ
            : 速度:4
        ◆条件分岐終了
        ◆条件分岐:攻撃タイプ = 1
          ◆変数操作:#0194 変数:自分の X = Math.round(this.character(0)._realX)
          ◆変数操作:#0195 変数:自分の Y = Math.round(this.character(0)._realY)
          ◆イベント位置設定:このイベント、({変数:自分の X},{変数:自分の Y})
          ◆移動ルート設定:このイベント (スキップ、待機)
            : ブレンドモード:通常
            : 速度:5
            : プレイヤーの方を向く
            : SE:Blow5 (80, 100, 0)
            : 後退 1 ステップ
            : 速度:4
            : 待機:5 フレーム
            : ブレンドモード:通常
        ◆条件分岐終了
        ◆条件分岐:攻撃タイプ = 2
          ◆変数操作:#0189 変数:このイベントの HP -= 変数:ダメージ
          ◆変数操作:#0194 変数:自分の X = Math.round(this.character(0)._realX)
          ◆変数操作:#0195 変数:自分の Y = Math.round(this.character(0)._realY)
          ◆イベント位置設定:このイベント、({変数:自分の X},{変数:自分の Y})
          ◆移動ルート設定:このイベント (スキップ、待機)
            (あなたのノックバックルートの設定、変更なし)
        ◆条件分岐終了
        ◆条件分岐:攻撃タイプ = 3
          ◆コモンイベント:ダメージ SFX
          ◆変数操作:#0189 変数:このイベントの HP -= 変数:ダメージ
          ◆移動ルート設定:このイベント (待機)
            : ブレンドモード:加算
            : 待機:30 フレーム
            : ブレンドモード:通常
        ◆条件分岐終了
        ◆条件分岐:攻撃タイプ = 5
          ◆コモンイベント:ダメージ SFX
          ◆変数操作:#0189 変数:このイベントの HP -= 変数:ダメージ
          ◆移動ルート設定:このイベント
            : ブレンドモード:加算
            : 待機:30 フレーム
            : ブレンドモード:通常
        ◆条件分岐終了
        ◆条件分岐:攻撃タイプ ≠ 1
          ◆条件分岐:攻撃タイプ ≠ 3
            ◆自己スイッチ操作:B = ON
          ◆条件分岐終了
        ◆条件分岐終了
      ◆条件分岐終了
    ◆条件分岐終了
  ◆条件分岐終了
: それ以外
  ◆自己スイッチ操作:B = OFF
◆条件分岐終了
(あなたの HP 0 チェック、変更なし)

参考として、ENEMY SWING コモンイベントと、SPAWN マップ上の Enemy Swing テンプレートを示します:

ENEMY SWING (コモンイベント、トリガー:なし)
◆スクリプト:const e = this.character(0);
         Galv.SPAWN.event(1, 'xy', [e.x, e.y], 'all', false);
         $gameMap.event($gameMap._lastSpawnEventId).setDirection(e.direction());

Enemy Swing (SPAWN マップ、イベント 1、並列、すり抜け ON、方向固定 OFF、キャラクターより上)
◆移動ルート設定:このイベント (スキップ、待機)
  : 速度:6
  : 前進 1 ステップ
  : 待機:6 フレーム
◆スクリプト:Galv.SPAWN.unspawn(this);

攻撃のヒット速度を上げた際に、タイプ 3 のフラッシュ時間を短縮していた場合は、30 の代わりにあなたの数値をそのまま使用してください。

フリーズハンティング(freeze hunt)由来の Loop Test や Hit Test の行がまだページに残っている場合は、それらを取り除いてください。同様に、Swing X、Swing Y、Swing Dir の行も、まだ残っている場合は取り除いてください。

前述の 変数:ムーブセット の行は、これには含まれていません。なぜなら、現在それを読み取る処理がないためです。敵が基本攻撃以上の攻撃を持つようになると、この行は再び登場します。

了解しました。実装を進めます。

私の理解が正しいか確認するために、もう一度詳細を振り返らせてください。

この調整されたイベントにより、敵はプレイヤーに付与するフォームの「基本」、「スペシャルA」、「スペシャルS」のアクションを使用できるようになるのでしょうか?例えば、敵がプレイヤー側にいるときに「スピードフォーム」を付与する場合、敵がプレイヤー側にいないときでも、スピードアクション(速度上昇とラッシュ)を使用できるということですか?

まだです。現状のページでは、すべての敵に基本攻撃(前振り、スイング、プレイヤーへのダメージ)が設定されており、これは敵が与えるフォームに関わらず共通しています。そのため、すべての敵がこれを共有しています。Speedフォームのブーストとラムはまだ含まれていません。

これらは基本攻撃の下に追加され、フォームごとに1ブロックずつ割り当てられます。SV: Movesetがどのブロックを敵が実行するかを決定します。これは各ENEMY FORMのセットアップブランチで1行として戻り、敵が与えるフォームに設定されます。例えば、Speedフォームを与える敵はSV: Moveset = 3となります。フォームを与えない敵は0となり、基本攻撃のみを使用します。ページは最終的にこのような形状になります:

(変更なしの基本攻撃)
◆もし: SV: Moveset = 3
  (Speedフォームのブースト)
  (Speedフォームのラム)
◆終了
◆もし: SV: Moveset = (次のフォーム)
  (そのフォームのAとSの動き)
◆終了
(変更なしのヒットセクション)

各動きは、基本スイングと同様に敵側から記述されます。プレイヤー版はATTACKINGおよびAttack衝突で動作するためです。

Speed版を書く前に、敵はいつ歩行してスイングする代わりにAまたはSの動きを使用すべきでしょうか?私が行うとしたら、プレイヤーが数タイル以内にいて、ブーストのクールダウンが完了している場合にブーストを行い、プレイヤーが同じ行または列に4タイル以内で整列している場合にラムを行います。また、ラムはプレイヤーをノックバックさせるべきでしょうか、それともダメージのみを与えるべきでしょうか?プレイヤーを押し戻す場合、RECOILと同様のAutorunが必要になります。

なるほど、だんだん分かってきました。

敵の特殊技の発動判定は以下のようにランダムで行うべきだと考えます:

  • HPが半分以下の場合
  • 特殊技のクールダウンが完了している場合
  • ランダムな数値を振り、通常攻撃か特殊技1、特殊技2のいずれかを選択する場合
  • 特殊技1(ステータス強化)よりも特殊技2(攻撃)を選択する確率を2倍にする

また、以前議論された画面全体を巻き込む攻撃は、プレイヤーにとって扱いにくいものになるため、敵は使用できないようにするべきです。通常攻撃には汎用攻撃を採用しましょう。

先に進む前に、プレイヤーの技を徹底的にテストします。敵側の修正でバグが見つかる事態を避けたいからです。問題が見つかり次第、報告します。

ちょっと質問なんですけど、ステータスをパーセントで上げるにはどうすればいいですか?例えば、攻撃力の値が75の場合、50%増やすにはどうすればいいでしょうか?75を半分にすることはできませんし、将来的にステータスが変更される可能性も考えると、「37を引く」ようにハードコードしたくありません。

パーセント計算は、まず掛け算をして最後に割り算を行うという、ダメージ計算式と同じトリックを使います:

◆制御変数: #0XXX プレイヤー攻撃力 *= 150
◆制御変数: #0XXX プレイヤー攻撃力 /= 100

150は、すでに持っている100に追加する50を足したものです。つまり、25%アップは125、50%ダウンは50になります。制御変数は切り捨てられるため、75は112になります。

もし効果が消えるバフの場合、上げる前に元の値を保存し、戻す際に割り算で戻すのではなく、コピーして戻すことをお勧めします。切り捨ての影響で、112を元の値に戻すと75ではなく74になってしまいます:

◆制御変数: #0XXX プレイヤー攻撃力(基本) = プレイヤー攻撃力
◆制御変数: #0XXX プレイヤー攻撃力 *= 150
◆制御変数: #0XXX プレイヤー攻撃力 /= 100

効果が消えた時:

◆制御変数: #0XXX プレイヤー攻撃力 = プレイヤー攻撃力(基本)

敵のバフも、SV(制御変数)と基本値用の自己変数を使って同じように動作します。

スペシャルアタックのアイデアは良さそうですし、これらはすべて「制御変数」を「ランダム」に設定した場合にも機能します。テスト中に決めるべきことの一つは、基本攻撃と比較して、スペシャルアタックがどのくらいの頻度で発動するかです。例えば、3回に1回か4回に1回といった具合です。

前にお伝えした通り、動きを念入りにテストしており、見つけた問題はすべてここに書き出しました。一つ一つ指摘するよりも、こちらの方が早いと思ったからです。お時間かけて大丈夫ですよ、lol。

1-フォーム7のS攻撃は、Z攻撃や盾を出すと途中からカットオフできます。その後、プレイヤーがフリーズし、矢印キーを押すまで解除されません。このS攻撃は、プレイヤーの前方に攻撃判定を放出し、数秒間その場に留まった後に消滅します。同時に、プレイヤーはその場で素早くジャンプします(これは矢印キーを押すと進行します)。

1.5-同様の問題として、フォーム2のS攻撃も、Z攻撃や盾を出すと途中からカットオフできます。この場合、攻撃判定が消えるまで数秒間プレイヤーがその場にフリーズするはずですが、他のアクションを行うとすぐに動けてしまいます。

2-時々、敵がフォーム4のS攻撃でノックバックされる際、スムーズに後退するのではなく、一瞬だけその場で停止します(最初のタイルの後だと思われます)。このS攻撃は、Through Onを有効にしてマップ全体に攻撃判定を放出し、経路上の敵を一緒に後退させます。

3-フォーム3のラッシュによるノックバックの直中、一瞬だけ遅延が発生することがありました。これは一貫性がありません。他の敵が「タイルを塞いでいる」などのタイルに関する問題が原因かもしれませんか?

4-フォーム1と2のS攻撃は、攻撃判定が出現する前にダメージを与えます。これらは攻撃タイプ5です。両方のS攻撃は、短いチャージ(フォーム1はジャンプ、フォーム2は後退)の後、プレイヤーの前方に少しだけ攻撃判定を放出します。

5-フォーム6のS攻撃は、敵に当たるとすぐに消えてしまいました。覚えていれば、優先度を他のキャラクターより高く設定したため、今では敵に全く当たらず、ただ避けるだけになっています。このS攻撃は攻撃判定を生成し、一定時間ランダムにマップ上を移動させます。

6-フォーム8のS攻撃は、敵ごとに1回しかダメージを与えず、その後、敵が再びその上を歩いても、再度配置されるまでダメージを受けません。このS攻撃は、敵が踏むためのトラップとして攻撃判定をその場に配置します。

7-フォーム6の固有の基本攻撃は、敵に1回しか当たりません。毎回判定させるために、スイングの間に攻撃をオフにする必要がありますか?このフォームの基本攻撃は、Zキーを押すごとに1発ではなく、3発の弾を放出します。

8-フォーム8の基本攻撃(画面全体攻撃)を、AutorunハンドラーからParallel Process攻撃ハンドラーに戻しました。Autorunハンドラーに置くと、処理が完了するまで全ての敵とプレイヤーがフリーズしていたためです。しかし、これにより「プレイヤーがZを2回押すと、矢印キーを押すまで攻撃が固まる」という問題が再発しました。何か良い落とし所はありますか?

9-盾を使い、敵が真前に立っている場合、敵が盾の中に埋もれてしまうことがあります。

10-プレイヤーは、基本攻撃が完全に動き終え、再び透明になるまで待たなければならず、Zキーを連打することはできません。フォーム4、6、8を除く全てのフォームで、プレイヤーがZキーを連打できるようにしたいです。

11-時々、敵がプレイヤーの横へ飛び去ることがあります。これは、移動中の攻撃判定の側面に敵がぶつかることが原因だと思われます。

1 と 1.5. 並列イベントは Z と X を読み続けていますが、そのハンドラー内で S アタックが実行されているため、それらが衝突して同時に開始されるのを防げません。シールド、S トリガー、そして Form 4、6、8 の基本処理を、両方のスイッチのチェックでラップすることをお勧めします。これにより、他の処理が実行されている間にこれらが開始されるのを防げます:

◆If: MOVEMENT ATTACK is OFF
  ◆If: ATTACKING is OFF
    (シールドは変更なし)
  ◆End
◆End

他の処理についても同様に、2つのチェックをそれぞれ囲むようにします。これには、S アタックの最終行で MOVEMENT ATTACK を OFF にする必要があるため、待機中の処理がすべて完了するまで Form 2 のフリーズが保持されます。通常のパUNCH には、10番で独自のバージョンを用意し、連打可能にします。

2 と 3. これらが同一のものではないかと疑問に思っています。敵のページは上から下へ実行されるため、攻撃ロジック内で敵が Wait 処理の途中にある状態でヒットが発生すると、下部にあるヒットチェックはその処理が完了するまで実行されず、ノックバックが遅れて発生します。これが一貫性がない理由で、各敵が何をしているかによって結果が変わるためです。攻撃ロジックのページ上部に、Wait コマンドや「このイベント」の移動ルートの設定(「待機」にチェックあり)はありますか?その部分のスクリーンショットをいただければ助かります。それがページの中でまだ見ていない唯一の箇所です。

ブロックのアイデアについてですが、ノックバックのルートには「移動できない場合はスキップ」がオンになっているため、他の敵が邪魔をすると、待たずに途中で停止します。2番については、敵側の Form 4 の分岐に、パUNCH と同様にスナップライン2つと「イベントの場所設定」がルートの上部にあるか確認してください。それらがなければ、ステップの途中でヒットすると、そのステップが完了するまで待機し、スナップが導入される前のパUNCH と同じポーズになります。

  1. ATTACKING が ON になり、チャージアップ前に衝突判定が配置されると、ホップや後退のアニメーション中はライブ(有効)ですが不可視になるため、そのタイルにいる敵は爆発が表示される前にヒットを受けてしまいます。両者を爆発ルートの直下に移動し、衝突判定がチャージアップ中に追従するようにします:
◆Control Variables: #0197 ATTACK TYPE = 5
(移動パワーの行は変更なし)
(チャージアップは変更なし)
◆Control Variables: AtkX = プレイヤーのマップ X
◆Control Variables: AtkY = プレイヤーのマップ Y
◆Control Variables: AtkDir = プレイヤーの方向
(4つの AtkDir 分岐は変更なし)
◆Control Switches: #0181 ATTACKING = ON
◆Set Movement Route: 攻撃衝突判定 (スキップ, 待機)
  (爆発ルートは変更なし)
◆Control Switches: #0181 ATTACKING = OFF
◆Control Switches: #0182 MOVEMENT ATTACK = OFF

チャージアップが RecoilGo の ON である場合、並列イベントはそれ自体では待機しないため、ホップや後退にかかる時間の分だけ Wait を直後に追加します。すでにこの順序になっている場合は、Form 1 の S ブロックのスクリーンショットをいただければ助かります。

  1. 彷徨っているイベントには「すり抜け」がまだオンになっていますか?「すり抜け」がオフのイベントは、優先度に関係なく他のすべてのイベントにブロックされます。優先度はプレイヤーとの衝突の有無だけを変更します。そのため「ランダム移動」はブロックされていない方向を選び続け、それを避けているように見えます。また、それは実際の「攻撃衝突判定」が彷徨っているのか、スポナーからのコピーですか?敵は実際のものしかチェックしないため、コピーであれば何もヒットしません。

  2. 敵は ATTACKING が OFF のときのみ再武装し、トラップはダウンしている間ずっとそれを ON に保持するため、各敵は1回しかヒットを受けません。私が提案するのは、ヒットに番号を振ることです。「ヒットカウント」変数は攻撃が再度ヒットしようとするたびに増え、各敵は SV: Last Hit に最後にヒットされた番号を記憶します。ATTACKING が OFF になると、以前のようにすべての処理が再武装するため、すでに動作している攻撃は変更されません。

トラップについては、新しいブロックを上部に配置し、敵がトラップのタイルから外れたら再武装するようにします。これにより、再びタイルに乗るとヒットします。トラップには独自の ATTACK TYPE 番号が必要なので、他の攻撃と共用している場合は新しい番号を与え、その攻撃の分岐をコピーしてください。

以下は「ヒットカウント」を組み込んだ全体のヒットセクションで、11番のノックバック変更も含まれています。SV: Last Hit は新しい自己変数、Hit Count は通常の変数、Self Switch B は使用されなくなったため、そのラベルは再び利用可能です。括弧内は変更なし:

◆If: ATTACKING is ON
  ◆If: ATTACK TYPE = (トラップのタイプ)
    ◆Control Variables: #0192 SV: AtkCol X = 攻撃衝突判定のマップ X
    ◆Control Variables: #0193 SV: AtkCol Y = 攻撃衝突判定のマップ Y
    ◆Control Variables: #0194 SV: My X = このイベントのマップ X
    ◆Control Variables: #0195 SV: My Y = このイベントのマップ Y
    ◆If: SV: AtkCol X ≠ SV: My X
      ◆Control Variables: #0XXX SV: Last Hit = -1
    ◆End
    ◆If: SV: AtkCol Y ≠ SV: My Y
      ◆Control Variables: #0XXX SV: Last Hit = -1
    ◆End
  ◆End
  ◆If: SV: Last Hit ≠ Hit Count
    ◆Control Variables: #0192 SV: AtkCol X = 攻撃衝突判定のマップ X
    ◆Control Variables: #0193 SV: AtkCol Y = 攻撃衝突判定のマップ Y
    (ATTACK TYPE = 2 の位置ブロックは変更なし)
    ◆Control Variables: #0194 SV: My X = このイベントのマップ X
    ◆Control Variables: #0195 SV: My Y = このイベントのマップ Y
    (5つのダメージ行は変更なし)
    ◆If: ATTACK TYPE = 4
      ◆Control Variables: #0189 SV: This event HP -= SV: Damage
      ◆Play SE: Blow1 (90, 150, 0)
      ◆Set Movement Route: このイベント
        : Blend Mode: Additive
        : Wait: 30 frames
        : Blend Mode: Normal
      ◆Control Variables: #0XXX SV: Last Hit = Hit Count
    ◆End
    ◆If: SV: AtkCol X = SV: My X
      ◆If: SV: AtkCol Y = SV: My Y
        ◆If: ATTACK TYPE = 0
          ◆Common Event: DAMAGE SFX
          ◆Common Event: SCREENSHAKE SMALL
          ◆Control Variables: #0189 SV: This event HP -= SV: Damage
          ◆Control Variables: #0194 SV: My X = Math.round(this.character(0)._realX)
          ◆Control Variables: #0195 SV: My Y = Math.round(this.character(0)._realY)
          ◆Set Event Location: このイベント, ({SV: My X},{SV: My Y})
          ◆Script: this.character(0).setDirection(10 - $gameMap.event(XX).direction());
          ◆Set Movement Route: このイベント (スキップ, 待機)
            : Speed: 6
            : 1 Step Backward
            : 1 Step Backward
            : Speed: 4
        ◆End
        ◆If: ATTACK TYPE = 1
          ◆Control Variables: #0194 SV: My X = Math.round(this.character(0)._realX)
          ◆Control Variables: #0195 SV: My Y = Math.round(this.character(0)._realY)
          ◆Set Event Location: このイベント, ({SV: My X},{SV: My Y})
          ◆Script: this.character(0).setDirection(10 - $gameMap.event(XX).direction());
          ◆Set Movement Route: このイベント (スキップ, 待機)
            : Blend Mode: Normal
            : Speed: 5
            : SE: Blow5 (80, 100, 0)
            : 1 Step Backward
            : Speed: 4
            : Wait: 5 frames
            : Blend Mode: Normal
        ◆End
        (ATTACK TYPE = 2 の分岐は変更なし)
        (ATTACK TYPE = 3 の分岐は変更なし)
        (ATTACK TYPE = 5 の分岐は変更なし)
        (トラップの分岐は変更なし)
        ◆If: ATTACK TYPE ≠ 1
          ◆If: ATTACK TYPE ≠ 3
            ◆Control Variables: #0XXX SV: Last Hit = Hit Count
          ◆End
        ◆End
      ◆End
    ◆End
  ◆End
: Else
  ◆Control Variables: #0XXX SV: Last Hit = -1
◆End
  1. いいえ、「ヒットカウント」を導入すれば、トリプル爆発には爆発の間に1行追加するだけです:
(爆発1は変更なし)
◆Control Variables: #0XXX Hit Count += 1
(爆発2は変更なし)
◆Control Variables: #0XXX Hit Count += 1
(爆発3は変更なし)

その間に ATTACKING をオフにすると敵が再武装しますが、衝突判定の追従ロジックがそのフレームでそれを取得します。

  1. Form 8 の基本処理は、1番と同じ2つのチェックの中に配置するため、実行中に2回押ししても無視されます。それでも固まる場合は、内部に「待機」にチェックがついたプレイヤーの移動ルート設定があるか疑問に思っています。TurnInPlace は、並列イベントからのプレイヤーのルートを、矢印が押されている間だけ動かすことができますが、これは押したときにクリアされることと一致します。そのルートが一時的なポーズのためだけに存在する場合は、プレーンな Wait コマンドで同じ役割を果たすことができ、プレイヤーに影響を与えません。

  2. 敵が固まったとき、背後に壁や他の敵などの障害物がありますか?「跳ね返り」には「移動できない場合はスキップ」がオンになっているため、スペースがないとシールドのタイル上に留まり、シールドが毎パス再チェックするため、その場で跳ね返り続けます。背後にスペースがない場合にどうなってほしいですか?ダメージを受ける、横にスライドする、それともシールドが下がるまでその場に固定される?

  3. パUNCH のルートには「待機」がオンになっているため、並列イベントはスイングが完了するまでそこで待機し、次の入力を認識しません。「待機」を外し、ATTACKING OFF をアクションタイマーと同じ形状のタイマーに渡すことで、解放されます。各入力ごとにヒットカウントも増やすため、すべてのスイングがヒットします。これは他のタイマーと一緒に並列イベントの上部に配置します:

◆If: Punch Timer > 0
  ◆Control Variables: #0XXX Punch Timer -= 1
  ◆If: Punch Timer = 0
    ◆Control Switches: #0181 ATTACKING = OFF
  ◆End
◆End

そしてパUNCH は、現在配置されているフォームチェックの中に入れます:

◆If: MOVEMENT ATTACK is OFF
  ◆If: Script: Input.isTriggered("ok") && (!$gameSwitches.value(181) || $gameVariables.value(XXX) > 0)
    ◆Control Switches: #0181 ATTACKING = ON
    ◆Control Variables: #0197 ATTACK TYPE = 0
    (移動パワーの行は変更なし)
    ◆Control Variables: #0XXX Hit Count += 1
    ◆Play SE: Blow1
    ◆Control Variables: AtkX = プレイヤーのマップ X
    ◆Control Variables: AtkY = プレイヤーのマップ Y
    ◆Control Variables: AtkDir = プレイヤーの方向
    ◆If: AtkDir = 2
      ◆Set Event Location: 攻撃衝突判定, ({AtkX},{AtkY}), Down
    ◆End
    ◆If: AtkDir = 4
      ◆Set Event Location: 攻撃衝突判定, ({AtkX},{AtkY}), Left
    ◆End
    ◆If: AtkDir = 6
      ◆Set Event Location: 攻撃衝突判定, ({AtkX},{AtkY}), Right
    ◆End
    ◆If: AtkDir = 8
      ◆Set Event Location: 攻撃衝突判定, ({AtkX},{AtkY}), Up
    ◆End
    ◆Set Movement Route: 攻撃衝突判定 (スキップ)
      (パUNCH ルートは変更なし)
    ◆Control Variables: #0XXX Punch Timer = 15
  ◆End
◆End

Script は Z が押されたことを読み取り、何も実行中ではないか、実行中なのはパUNCH のみです。其中的 XXX は Punch Timer の変数 ID です。15 はパUNCH ルートにかかる時間の推測値です。ルートより少し長くする必要があります。そうしないと、Transparent ON が ATTACKING が OFF になる前に実行されず、衝突判定がパUNCH 後に可視のままになる可能性があります。もし現在、パUNCH の後に別ルートで Transparent ON が設定されている場合は、このルートの最後に移動してください。

  1. 跳ね返り内の「プレイヤーに向ける」が原因だと思います。敵があなたより上または下が左右よりも遠い場合、上下のどちらかを選択するため、左右のスイングの場合、衝突判定の横に歩いた敵が上下に押しやられることがあります。6番のヒットセクションでは、パUNCH とシールドの分岐で、Script ラインに置き換え、敵をヒットした方向に合わせて反転させ、ステップバックが衝突判定の移動方向に沿って行われるようにしています。10 から方向を引くと反対方向になり、XX は攻撃衝突判定のイベント ID です。

1/1.5-. フォーム1、2、3、7を、Sキー押下時にオン、移動攻撃ハンドラーが自身をオフにする際にオフになる「PREVENTER」という独自のスイッチに配置しました。今は正常に動作しています!

2/3-. 敵の攻撃ロジックはまだ敵に実装していません。まずは攻撃のテストを完了したかったからです(それが今回の目的です)。
フォーム4のS攻撃は非常に長射程ですが、爆発の前に一瞬のポーズを入れることで、他の攻撃のダメージイベントが終了するのを待てるようにできます。それが役に立つかもしれません。問題は、フォーム4のS攻撃が、直前に攻撃された敵以外にも当たっていたことです。
敵におけるフォーム4のブランチは攻撃タイプ5に対応しています。そこには(このキャラクターのXとYを四捨五入して設定)という行と(イベントの位置を私のXとYに設定)という行があります。

4-. 見てわかるように、チャージアップの前に衝突判定がプレイヤーの前に配置されているのではなく、ベーシックと同様に前方へ吹き飛ばされています。

5-. 攻撃衝突判定の「透過」をオンにすると、マップのアクセス可能な領域内に留まるのと同等の確率で画面外に出ていかないでしょうか? これは元の攻撃衝突判定であり、敵用のものはまだ機能していません。すべての攻撃が完璧に動作することを確認してから敵に適用したかったからです。

6および7-. まず明確にしておきたい重要な点は、トラップに新しい攻撃タイプが必要かどうかです。現在それは既に定義されている攻撃タイプ3ですが、もしこれを複製して攻撃タイプ6を作成すべきであれば、それで問題ありません。

8-そのようなケースが1つありました。プレイヤーは1フレーム待機しただけです。なぜそれが存在するのかは不明ですが、通常の「待機」に置き換えたところ、意図した通りに機能するようになりました!

9-確かにそれが問題ですね。では、現状のままでもよいかもしれません。これにより、隅に追い込まれないよう促すことになります。

10-. 動作しませんでした。何が間違っていたのかわからないため、すべてのコードを載せます。

11-. ここで何を言っているのかわかりません。申し訳ありません。あなたは、ポイント6が解決されれば、これも自然に解決されると言っていますか?

PREVENTERの作業は素晴らしいですね。8番も解決してよかったですね。9番についてもその通りです。

2番と3番について。敵に攻撃ロジックがまだ実装されていないため、私が考えていた方法は除外されます。したがって、これらの分岐がどのブランチに属するかを確認したいです。タイプ5のブランチは私のコピー以降変更されているようなので、そのブランチ全体のスナップショットをいただければ助かります。ラム(ram)については、タイプ2のブランチ内のノックバック経路を確認したいです。なぜなら、それが私がこれまで見たことがない部分だからです。ただし、フォーム4のブラスト前の一時停止はまだ追加しないでください。

4番。これも私の推測を除外します。フォーム1のSブロックのスナップショットを、Sを押下からMOVEMENT ATTACK OFFまで取得できれば、早期ダメージの発生箇所を確認できます。

5番。はい、「Through(貫通)」は壁も無視します。マップの端から出ることはできませんが、その内部のものは何でも通過します。私が提案するのは、ウォーキング中だけ「Through」をオフにすることです。そうすれば壁で停止します。そうすることで敵のタイルに移動できなくなるため、敵は自分の隣接タイルでそれをチェックすることになります。これには独自のATTACK TYPEが必要なので、7を使用しました。ウォーキングブロックでは、ATTACK TYPE = 0が7になり、経路は最初にThrough OFF、最後にThrough ONに設定します:

◆変数操作: #0197 ATTACK TYPE = 7
(残りのブロックは変更なし、経路まで)
◆移動経路設定: 攻撃衝突 (待機)
  : 貫通 OFF
  (あなたのウォーキング経路、変更なし)
  : 貫通 ON

その後、敵のイベント内で、「If: SV: Last Hit ≠ Hit Count」の条件分岐内、ATTACK TYPE = 4のブロックの隣に以下を追加します:

◆条件分岐: ATTACK TYPE = 7
  ◆変数操作: #0XXX SV: Distance = Math.abs($gameMap.event(XX).x - this.character(0).x) + Math.abs($gameMap.event(XX).y - this.character(0).y)
  ◆条件分岐: SV: Distance ≤ 1
    ◆コモンイベント: DAMAGE SFX
    ◆変数操作: #0189 SV: このイベントHP -= SV: Damage
    ◆移動経路設定: このイベント
      : ブレンドモード: 加算
      : 待機: 30フレーム
      : ブレンドモード: 通常
    ◆変数操作: #0XXX SV: Last Hit = Hit Count
  ◆条件分岐終了
◆条件分岐終了

SV: Distanceは敵の基本攻撃と同じ自己変数であり、XXは「Attack collision」のイベントID(イベントウィンドウの上部にある番号)です。これにより、ウォーキングごとに各敵に対して1回ヒットします。

6番と7番。はい、トラップに独自のタイプ6を与えるべきです。あなたのタイプ3のブランチをコピーし、コピーの条件を6に変更し、トラップのATTACK TYPEを6に設定し、ヒットセクションの上部にある再アームブロックに6を設定します。これにより、他のタイプ3の攻撃はそのまま維持されます。7番については、私の前の投稿で記述したブラスト間のHit Count += 1のことです。

10番。経路にはまだ「Wait(待機)」にチェックが入っています。2番目のスナップショットでは、Attack collisionの後に(Wait)と表示されています。これにより、平行イベントはスイングが完了するまで一時停止され、次の押下を認識できず、Punch Timerはスイングがすでに終了した後にのみ設定されます。その経路の「Wait for Completion(完了まで待機)」のチェックを外し、その中にいる間に「Skip If Cannot Move(動けない場合はスキップ)」にチェックを入れてください。そうすれば、Zを押した瞬間にPunch Timer = 15が実行され、意図した通りに動作します。

その作業中に2つの簡単な確認をお願いします。スクリプト行の末尾がスナップショットで切り捨てられているので、$gameVariables.value(241) > 0) で終わっていることを確認してください。241はあなたのPunch Timerです。また、各敵が追加のスイングを受けるのは、私の前の投稿のヒットセクションのHit Count版が実装されている場合だけです。これにより、ATTACKINGがONの状態で新しいスイングがヒットするようになります。

ShieldXとShieldYの行はこのブロックでは何もしていないので、あってもなくても構いません。

11番。いいえ、別物ですが、修正はすでに私の前の投稿のヒットセクションコードに含まれています。敵がパンチを受けると、ノックバックによって敵はあなたを向きます。その後、後退します。敵があなたに対して斜めの位置にある場合、上、下、左、右のいずれかしか向くことができないため、上または下を向き、後退すると、あなたがパンチした方向ではなく、上または下に押し出されてしまいます。タイプ0とタイプ1のブランチにあるScript行は、その回転を置き換えます。これは敵を「Attack collision」とは逆の方向に向けるため、後退すると、あなたがパンチしたのと同じ方向に押し出されます。その行のXXは、Attack collisionのイベントIDです。

2/3-Here is the Attack Type 5 Branch, referenced by Form 4’s S Attack, (there are more steps)

and the Attack Type 2 Branch, referenced by Form 3’s S Attack.

The other branch is below (there are also more steps)

4-Here is Form 1’s S Attack,

and here is Form 2’s S Attack.

5-This is the time to reference your first response in regards to 6 and 7 right? I’ll make a duplicate of the enemy and start adding it now.

6/7-I duplicated Attack Type 3, made it 6, and placed it right below Attack Type 4, directly above the (If ATKCol X and Y = My X and Y) lines.

10-This is indeed mashable now! You say that in order for the damage calculations to function, then this is the moment to add the Hit Count code from 6 and 7?

11-Do you think you could repost that script line, and where exactly I need to put it? And should 2 and 5 also get it the line, since they knock back too, until a wall or another enemy is bumped into?

I’m sorry this is moving slowly, I’m trying not to get overwhelmed or make mistakes since this was another really big chunk of questions.

2 と 3 について。ブロックに関するあなたの推測が正しくて、私が前回間違えていました。Skip をオンにすると、動けない「後退」もスキップされるのに 1 フレーム要し、そのブランチにはそれが大量に含まれています。そのため、背後に別の敵がいる敵は、相手が動いて空くまでステップを消費してその場で立ち尽くし、その後残りのステップを処理します。RAM では、何かが起こる前の一時停止として現れます。Form 4 では、爆発がまだ到達していないタイルに押し込まれた敵が、爆発に当たって動くまで待機します。

壁や他の敵で停止させたいとのことなので、長いステップのリストを、1 ステップずつ実行し、移動しなかった時点で停止するループに置き換えることをお勧めします。これは以下の Type 2 と Type 5 のブランチにあります。SV: KB X と SV: KB Y は新しい自己変数です。1 つ知っておくべき違いは、敵がステップの行数分だけ停止するのではなく、実際に何かぶつかるまで飛び続ける点です。

4 について。衝突判定の Map X と Y は、ステップ開始と同時に次のタイルにジャンプするため、真前にいる敵は爆発の最初のフレームで当たりますが、その時点では衝突判定はまだ主にあなたの下にあります。以下のヒットセクションの上部にある 2 つの AtkCol 行は、実際に描画されている位置から値を読み取り、四捨五入しているため、敵のタイルの半分を超えて入った時点でヒットとみなされます。これは Attack 衝突を使用するすべての攻撃に適用されるため、パンチや他の攻撃も視覚効果とより整合性が取れるようになります。

Form 1 と Form 2 の両方で、ATTACKING = ON を「Set Movement Route: Attack collision」の直下に移動させることをお勧めします。現在、これはチャージ中に ON になっており、Form 2 では衝突判定が、後退したタイルの上に生で非表示状態で存在しています。

5 について。はい、ヒットセクションが先に入り、Type 7 ブロックはその内部に存在します。以下の完全版にもすでに含まれています。敵のコピーをまず作成するのは良いアイデアです。

6 と 7 について。ほぼ正解ですが、移動させる必要があります。Type 4 はマップ上のすべての敵に同時にヒットするため、位置チェックの外側にあります。トラップは自分のタイル上のものだけをヒットさせるべきなので、そのブランチは Type 3 の隣にある If: SV: AtkCol Y = SV: My Y の内部に入れる必要があります。現在の場所では、マップ上のすべての敵を繰り返しヒットしてしまいます。以下の完全版では正しい位置にあります。

10 について。素晴らしい!はい、これがそのタイミングです。以下の完全なヒットセクションには、この投稿の他のコードすべてが含まれています。あなたの Type 2 と Type 5 のブランチはそれぞれ Control Self Switch: B = ON で終わっていますが、これらの行は不要になります。なぜなら、下部の ≠ 1 および ≠ 3 チェックで、これらにヒットフラグが設定されるようになったからです。
11. 以下の行です:

this.character(0).setDirection(10 - $gameMap.event(63).direction());

これは、ブランチ内の Set Event Location: This Event の直後に Script コマンドとして配置し、Turn toward Player はそのブランチのルートから外します。63 を使用しているのは、Form 2 のルートが Attack 衝突にこの番号を使用しているためです。もしそれが別のイベントであれば交換してください。5 も衝突によって押し出されるため、これが必要になります。2 は不要です。RAM は真前のタイルだけをヒットするため、Turn toward Player はすでに正しい方向を向いています。以下の完全版では、Type 0、1、5 に含まれています。

以下はすべての内容を含む完全なヒットセクションです。これを使って古いものを一度に置き換えてください。SV: Last Hit、SV: KB X、SV: KB Y は新しい自己変数であり、Self Switch B はもう使用されていません。括弧内は変更のない既存の内容です:

◆If: ATTACKING is ON
  ◆If: ATTACK TYPE = 6
    ◆Control Variables: #0192 SV: AtkCol X = Map X of Attack collision
    ◆Control Variables: #0193 SV: AtkCol Y = Map Y of Attack collision
    ◆Control Variables: #0194 SV: My X = Map X of This Event
    ◆Control Variables: #0195 SV: My Y = Map Y of This Event
    ◆If: SV: AtkCol X ≠ SV: My X
      ◆Control Variables: #0XXX SV: Last Hit = -1
    ◆End
    ◆If: SV: AtkCol Y ≠ SV: My Y
      ◆Control Variables: #0XXX SV: Last Hit = -1
    ◆End
  ◆End
  ◆If: SV: Last Hit ≠ Hit Count
    ◆Control Variables: #0192 SV: AtkCol X = Math.round($gameMap.event(63)._realX)
    ◆Control Variables: #0193 SV: AtkCol Y = Math.round($gameMap.event(63)._realY)
    ◆If: ATTACK TYPE = 2
      ◆Control Variables: #0192 SV: AtkCol X = Map X of Player
      ◆Control Variables: #0193 SV: AtkCol Y = Map Y of Player
      ◆Control Variables: #0221 Hit Dir = Direction of Player
      ◆If: Hit Dir = 2
        ◆Control Variables: #0193 SV: AtkCol Y += 1
      ◆End
      ◆If: Hit Dir = 4
        ◆Control Variables: #0192 SV: AtkCol X -= 1
      ◆End
      ◆If: Hit Dir = 6
        ◆Control Variables: #0192 SV: AtkCol X += 1
      ◆End
      ◆If: Hit Dir = 8
        ◆Control Variables: #0193 SV: AtkCol Y -= 1
      ◆End
    ◆End
    ◆Control Variables: #0194 SV: My X = Map X of This Event
    ◆Control Variables: #0195 SV: My Y = Map Y of This Event
    ◆Control Variables: #0232 SV: Damage = Player ATK
    ◆Control Variables: #0232 SV: Damage *= Move Power
    ◆Control Variables: #0233 SV: Def Calc = SV: This Event DEF
    ◆Control Variables: #0233 SV: Def Calc += 100
    ◆Control Variables: #0232 SV: Damage /= SV: Def Calc
    ◆If: ATTACK TYPE = 4
      ◆Control Variables: #0189 SV: This event HP -= SV: Damage
      ◆Play SE: Blow1 (90, 150, 0)
      ◆Set Movement Route: This Event
        : Blend Mode: Additive
        : Wait: 30 frames
        : Blend Mode: Normal
      ◆Control Variables: #0XXX SV: Last Hit = Hit Count
    ◆End
    ◆If: ATTACK TYPE = 7
      ◆Control Variables: #0XXX SV: Distance = Math.abs($gameMap.event(63).x - this.character(0).x) + Math.abs($gameMap.event(63).y - this.character(0).y)
      ◆If: SV: Distance ≤ 1
        ◆Common Event: DAMAGE SFX
        ◆Control Variables: #0189 SV: This event HP -= SV: Damage
        ◆Set Movement Route: This Event
          : Blend Mode: Additive
          : Wait: 30 frames
          : Blend Mode: Normal
        ◆Control Variables: #0XXX SV: Last Hit = Hit Count
      ◆End
    ◆End
    ◆If: SV: AtkCol X = SV: My X
      ◆If: SV: AtkCol Y = SV: My Y
        ◆If: ATTACK TYPE = 0
          ◆Common Event: DAMAGE SFX
          ◆Common Event: SCREENSHAKE SMALL
          ◆Control Variables: #0189 SV: This event HP -= SV: Damage
          ◆Control Variables: #0194 SV: My X = Math.round(this.character(0)._realX)
          ◆Control Variables: #0195 SV: My Y = Math.round(this.character(0)._realY)
          ◆Set Event Location: This Event, ({SV: My X},{SV: My Y})
          ◆Script: this.character(0).setDirection(10 - $gameMap.event(63).direction());
          ◆Set Movement Route: This Event (Skip, Wait)
            : Speed: 6
            : 1 Step Backward
            : 1 Step Backward
            : Speed: 4
        ◆End
        ◆If: ATTACK TYPE = 1
          ◆Control Variables: #0194 SV: My X = Math.round(this.character(0)._realX)
          ◆Control Variables: #0195 SV: My Y = Math.round(this.character(0)._realY)
          ◆Set Event Location: This Event, ({SV: My X},{SV: My Y})
          ◆Script: this.character(0).setDirection(10 - $gameMap.event(63).direction());
          ◆Set Movement Route: This Event (Skip, Wait)
            : Blend Mode: Normal
            : Speed: 5
            : SE: Blow5 (80, 100, 0)
            : 1 Step Backward
            : Speed: 4
            : Wait: 5 frames
            : Blend Mode: Normal
        ◆End
        ◆If: ATTACK TYPE = 2
          ◆Control Variables: #0189 SV: This event HP -= SV: Damage
          ◆Control Variables: #0194 SV: My X = Math.round(this.character(0)._realX)
          ◆Control Variables: #0195 SV: My Y = Math.round(this.character(0)._realY)
          ◆Set Event Location: This Event, ({SV: My X},{SV: My Y})
          ◆Set Movement Route: This Event (Skip, Wait)
            : Blend Mode: Additive
            : Speed: 5
            : Turn toward Player
            : SE: Maris Haven SFX/Fighting/BSFX BLASTAWAY
          ◆Loop
            ◆Control Variables: #0194 SV: My X = Map X of This Event
            ◆Control Variables: #0195 SV: My Y = Map Y of This Event
            ◆Set Movement Route: This Event (Skip, Wait)
              : 1 Step Backward
            ◆Control Variables: #0XXX SV: KB X = Map X of This Event
            ◆Control Variables: #0XXX SV: KB Y = Map Y of This Event
            ◆If: SV: KB X = SV: My X
              ◆If: SV: KB Y = SV: My Y
                ◆Break Loop
              ◆End
            ◆End
          ◆Repeat Above
          ◆Set Movement Route: This Event (Skip, Wait)
            : Blend Mode: Normal
            : Speed: 4
            : Wait: 5 frames
        ◆End
        (your ATTACK TYPE = 3 branch, unchanged)
        ◆If: ATTACK TYPE = 5
          ◆Control Variables: #0189 SV: This event HP -= SV: Damage
          ◆Control Variables: #0194 SV: My X = Math.round(this.character(0)._realX)
          ◆Control Variables: #0195 SV: My Y = Math.round(this.character(0)._realY)
          ◆Set Event Location: This Event, ({SV: My X},{SV: My Y})
          ◆Script: this.character(0).setDirection(10 - $gameMap.event(63).direction());
          ◆Set Movement Route: This Event (Skip, Wait)
            : Blend Mode: Additive
            : Speed: 5
            : SE: Maris Haven SFX/Fighting/BSFX BLASTAWAY
          ◆Loop
            ◆Control Variables: #0194 SV: My X = Map X of This Event
            ◆Control Variables: #0195 SV: My Y = Map Y of This Event
            ◆Set Movement Route: This Event (Skip, Wait)
              : 1 Step Backward
            ◆Control Variables: #0XXX SV: KB X = Map X of This Event
            ◆Control Variables: #0XXX SV: KB Y = Map Y of This Event
            ◆If: SV: KB X = SV: My X
              ◆If: SV: KB Y = SV: My Y
                ◆Break Loop
              ◆End
            ◆End
          ◆Repeat Above
          ◆Set Movement Route: This Event (Skip, Wait)
            : Blend Mode: Normal
            : Speed: 4
            : Wait: 5 frames
        ◆End
        (your ATTACK TYPE = 6 branch, the copy of type 3, moved here)
        ◆If: ATTACK TYPE ≠ 1
          ◆If: ATTACK TYPE ≠ 3
            ◆Control Variables: #0242 Hit Count... 

申し訳ありませんが、そのブロックの最後の行が切り捨てられてしまいました。以下はガードから始まるヒットセクションの終わりです:

        ◆If: ATTACK TYPE ≠ 1
          ◆If: ATTACK TYPE ≠ 3
            ◆Control Variables: #0XXX SV: Last Hit = Hit Count
          ◆End
        ◆End
      ◆End
    ◆End
  ◆End
: Else
  ◆Control Variables: #0XXX SV: Last Hit = -1
◆End