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

正直に言うと、Recoilgoの処理が何を意図しているのか、どうしても理解できません。完全なシーケンスを見せていただくか、もう少し簡単に説明していただけますか?

3についてですが、丸で囲まれた部分を、示していただいた内容と完全に置き換えるという意味でしょうか?

問題ありません。こちらがより簡単なバージョンです。

「Autorun(自動実行)」は処理が完了するまでプレイヤーの操作を凍結します。一方、「Parallel(並列)」ではプレイヤーは動き続けられます。TurnInPlace プラグインは、Parallel から来るプレイヤーの移動ルートのみを解除します。そのため、プレイヤーを動かす小さな部分(1歩後退)はそれ自体が Autorun として独立させ、他の処理は現在の平行イベントのままにしておきます。

Autorun の設定(1回のみ):

  1. データベース > 共通イベント、RECOIL という名前の新しいものを作成
  2. トリガー: 自動実行
  3. スイッチ: RecoilGo という名前の新しいスイッチを作成
  4. これらのコマンドを挿入:
◆移動ルート設定: プレイヤー (スキップ, 待機)
  : 速度: 6
  : 合成モード: 画面
  : 1 歩後退
  : 合成モード: 通常
  : 速度: 4
◆スイッチの操作: #0XXX RecoilGo = OFF

これで、後退動作を必要とする攻撃は、独自のプレイヤー移動ルートを実行する代わりに、RecoilGo を ON にするだけです。

1. Sブラスター これは、Sキーチェック内のすべての処理に置き換えます:

◆スイッチの操作: #0181 ATTACKING = ON
◆変数の操作: #0197 ATTACK TYPE = 5
◆変数の操作: AtkX = プレイヤーのマップX座標
◆変数の操作: AtkY = プレイヤーのマップY座標
◆変数の操作: AtkDir = プレイヤーの方向
◆条件分岐: AtkDir = 2 の場合
  ◆イベントの位置設定: アタック衝突位置, ({AtkX},{AtkY}), 下
◆条件分岐終了
◆条件分岐: AtkDir = 4 の場合
  ◆イベントの位置設定: アタック衝突位置, ({AtkX},{AtkY}), 左
◆条件分岐終了
◆条件分岐: AtkDir = 6 の場合
  ◆イベントの位置設定: アタック衝突位置, ({AtkX},{AtkY}), 右
◆条件分岐終了
◆条件分岐: AtkDir = 8 の場合
  ◆イベントの位置設定: アタック衝突位置, ({AtkX},{AtkY}), 上
◆条件分岐終了
◆スイッチの操作: #0XXX RecoilGo = ON
◆共通イベント: SCREENSHAKE MEDIUM
◆移動ルート設定: アタック衝突位置 (スキップ, 待機)
  : 透明 OFF
  : SE: Maris Haven SFX/Fighting/BSFX SMACK (100, 100, 0)
  : 画像: MH VitalAttacks1(3)
  : 速度: 5
  : 1 歩前進
  : 1 歩前進
  : 1 歩前進
  : (現在の「1 歩前進」の行数と同じ数を維持)
  : 透明 ON
◆スイッチの操作: #0181 ATTACKING = OFF
◆スイッチの操作: #0182 MOVEMENT ATTACK = OFF

「(スキップ, 待機)」とは、そのルートで「移動できない場合はスキップ」と「完了を待機」の両方にチェックを入れることを意味します。

その後、敵イベントで、If: ATTACK TYPE = 0 のパンチ分岐の隣、If: SV: AtkCol Y = SV: My Y の内部に以下を追加します:

◆条件分岐: ATTACK TYPE = 5 の場合
  ◆共通イベント: DAMAGE SFX
  ◆変数の操作: #0189 SV: このイベントのHP -= 25
  ◆移動ルート設定: このイベント
    : 合成モード: 加算
    : 待機: 30 フレーム
    : 合成モード: 通常
◆条件分岐終了

2. ランダム版 これは、Autorun ではなく、他の攻撃と同じ平行イベント内に記述します:

◆スイッチの操作: #0181 ATTACKING = ON
◆変数の操作: #0197 ATTACK TYPE = 0
◆SE再生: Maris Haven SFX/Fighting/BSFX SHRILL (100, 100, 0)
◆スイッチの操作: #0XXX RecoilGo = ON
◆イベントの位置設定: アタック衝突位置, ({BPlayer X},{BPlayer Y})
◆共通イベント: SCREENSHAKE MEDIUM
◆移動ルート設定: アタック衝突位置 (待機)
  : 画像: MH VitalAttacks1(7)
  : 透明 OFF
  : 速度: 5
  : ランダム移動
  : ランダム移動
  : ランダム移動
  : ランダム移動
  : ランダム移動
  : ランダム移動
  : ランダム移動
  : SE: Maris Haven SFX/Fighting/BSFX DING (90, 100, 0)
  : 透明 ON
◆イベントの位置設定: アタック衝突位置, ({BPlayer X},{BPlayer Y})
◆スイッチの操作: #0181 ATTACKING = OFF
◆スイッチの操作: #0182 MOVEMENT ATTACK = OFF

これらは RECOIL を共有するため、速度6と画面フラッシュも適用されます。異なる動作にしたい場合は、同じ要領で2つ目の Autorun を作成し、独自のスイッチを用意してください。

3. はい、その下の If: ActionCooldown > 0 ブロックも同様です。If: ActionCooldown = 0 のブロック全体(丸で囲まれた部分とその下の End)を削除し、If: ActionCooldown > 0 をこちらに置き換えてください。イベントの上部は以下のようになります:

◆条件分岐: ActionTimer > 0 の場合
  ◆変数の操作: #0207 ActionTimer -= 1
  ◆条件分岐: ActionTimer = 0 の場合
    ◆移動ルート設定: プレイヤー
      : 速度: 4
    ◆SE再生: Maris Haven SFX/Fighting/BSFX LOW HITS (100, 100, 0)
    ◆変数の操作: #0206 ActionCooldown = 300
  ◆条件分岐終了
◆条件分岐終了
◆条件分岐: ActionCooldown > 0 の場合
  ◆変数の操作: #0206 ActionCooldown -= 1
  ◆条件分岐: ActionCooldown = 0 の場合
    ◆SE再生: Maris Haven SFX/Fighting/BSFX STUTTER (100, 100, 0)
  ◆条件分岐終了
◆条件分岐終了
◆条件分岐: スクリプト: Input.isTriggered("action3")

1-完璧に動作します!

2-これも完璧に動作します!

3-これも完璧に動作します!

正直、あなたがこれほどまでに優秀だなんて信じられません。私一人では到底これらをすべて解決できるわけがありません。

バトルシステムが事実上完成するまでに、ダメージを与える攻撃をあと3つ作るだけです。それら(そしてスピードブーストのような「ステータス強化技」すべて)はステータスやダメージ計算と非常に密接に関連しているため、次はそのシステムに移る必要があります。共同開発者とこれらのシステムに取り組んでおり、すでに構築された基盤に組み込める良い土台ができていると考えています。なので、自分で動作するように仕上げてみようと思います。もし問題にぶつかったら(あっても不思議ではありません)、確実に助けを求めてきます。

いずれにせよ、これまでに提供していただいた多大な助けに心から感謝します。このシステムは、あなたの親切な支援がなければ決して実現しませんでした。クレジットに「Baz」として名前を入れてもらってよろしいですか? また、ゲームが完全にリリースされた際には、無料でゲームキーを贈呈させていただきます!

3つとも動作してよかったです!

面白いことに、これは昔 Naima's Melody Pre-Alpha Demo by JUMP Game Studio で行ったこととかなり似ています。あれは並列イベントで構築された状態マシンで、押された入力に応じて次の状態が決定されていました。あなたのものは独自の作りですが、スイッチとATTACK TYPEが同じような役割を果たしている点は骨格が非常に似ています。

Bazとしてクレジットしていただけると嬉しいですし、リリースされたらキーを確実に購入するつもりです。ステータスやダメージ計算の調整、頑張ってください!

ああ、自分一人ですべてできると考えるのは甘かったな、 lol。

私とコードパートナーの二人には、必要なパーツはすべて揃っていると思います。もしお手間をかけさせるようであれば恐縮ですが、それらをどう組み合わせるかを実際に理解するうえで、ぜひお手伝いいただければ幸いです。特に、それらのパーツのほとんどをコードパートナーが書いたため、私はそれほど詳しくないからです。今、コードパートナーはできるだけ詳細にそれらをメモしています。

各要素がどこに配置されているかを確認することが、私にとって最も役立ちます。ステータスは、アクターや敵のデータベース内にあるのか、それとも変数なのか、プラグインの中にあるのでしょうか? また、彼が口頭で説明するような形式の数式、例えば「攻撃力×2-防御力」のようなもの、そして異なるステータスを使用する攻撃がそれぞれどのステータスを参照するのかも知りたいです。敵イベントは戦闘前に変数から自身のステータスを設定しているようなので、HPと同様に防御力が自己変数に格納されているのではないかと考えています。

敵側にはすでにそのための場所が用意されています。各ヒットブランチには独自の HP -= 25 という行があるため、数式が1つの変数に収まる場合、それらの各行はその変数を参照するだけで済みます:

◆制御変数: #0189 SV: このイベントのHP -= ダメージ

あなたの言ったことは彼に伝えます。ただ、現状では、より簡単な方法がない限り、統計データを可変変数にする計画を立てています。なぜなら、それらをイベントと連携させる方法が分かっているからです。まだすべてが決まっているわけではありませんが、これまでにシステムについてまとめたことはすべて公開します。それでもなお手伝ってくださること、本当に感謝しています。

変数を使っても問題ありません。あなたのシステムはすでにそれらで動いているので、おそらく私もそうするでしょう。

データベースが作業を節約できる可能性があるのはプレイヤーだけです。プレイヤーがレベルアップしたり、装備を整えたりした場合、アクターのステータスにはすでにそれらが含まれており、必要に応じてそれを変数にコピーすることもできます。「変数の制御」で「ゲームデータ」→「アクター」を選択し、ステータスを選んでください:

◆変数の制御: #0XXX プレイヤーの攻撃力 = [あなたのアクター] の攻撃力

この行はダメージ計算が行われる直前に配置できるので、数値は常に最新の状態になります。敵については同じことができません。データベース上の敵は通常の戦闘画面内でのみ存在するため、マップ上の敵は、HPと同様にステータスを自己変数に保持する必要があります。

ここまで、私たちが作成できる限りの情報をまとめました。

情報が大量にあるため、不明な点があれば遠慮なく詳細を質問してください。

さて、これらの構成要素は、以下の要因に基づいて、数式ごとに異なるダメージを与えることに寄与します。

ステータス、プレイヤーの形態、親和性、攻撃タイプ、敵の形態(1〜14)

ステータス
ここに関連するのは攻撃力、HP、防御力です。今後導入されるバトルシステムでは、これら3つが唯一存在することになるでしょう。
現在のアイデアでは、ステータスは敵イベントの自動設定内部(イベントの冒頭で外観を設定し、その後自己スイッチでロックする部分)に保持および設定されます。こうすることで、敵は「どの敵と戦っているか」を示す変数を参照するだけで済みます。

形態
これには、ゲームの性質に関する少しの説明が必要です。最も簡単に言えば、「敵」の一部はバトル外でプレイヤーのチームに加入でき、バトル中に特別な戦闘形態を使用できるようになります。
現在、プレイヤーのパーティーにいるユニットに応じて、8つの形態が存在します。各形態が直接的にステータスボーナスを与える予定はありません。これについては、次に説明する親和性で処理されます。

このシステムの目的は、単に「Aボタン連打」ではない多様性を戦闘に提供することですが、バランスは今後の大きな優先事項です。特に、初期に入手しやすい単純な形態に対して、ギミック性の高い形態が劣らないように調整する必要があります。

親和性
特定の恩恵は、プレイヤーの形態を提供する特定のユニットから得られます。これらはより個別化されており、各親和性は各ユニットごとに独立しています。現在、単純なステータス修正(HPが50%以上なら防御力バフ、50%未満なら防御力デバフなど)から、エンティティの配置(デコイとして機能し、壊れるまで敵の注意を引くブロックを配置する)まで、幅広い効果があります。これは専門的な要素であり、非常に慎重なバランス調整が必要であるため(明確に弱いものや強すぎるものを避けるため)、最後に実装する予定です。

攻撃
攻撃タイプは5つあります:小ノックバック 0、ノックバックありダメージなし 1、大ノックバック 2、ノックバックなし 3、独立ダメージ 4 です。これらは必ずしもダメージに直接影響するわけではなく、まずは距離を重視します。

敵の形態
各敵には、プリセットされたHP、攻撃力、防御力の値があり、敵ごとに異なります。当然ながら、これが敵が受けるダメージと与えるダメージを決定します。

数式(私のコード担当者が作成しました。私はこの部分が苦手です)

基本:攻撃力 / ((防御力+100)/100)

スペシャル2: (攻撃力 x 1.3) / ((防御力 + 100)/100)

スペシャル1: (攻撃力 x 1.1) / ((防御力 +100)/100) ただし、一般的ではなく、2つの特殊攻撃に使用されます

数式で変更すべき点は順序だけです。制御変数は整数値でしか機能しないため、防御力が100未満の場合、(防御力 + 100) / 100 の計算結果は常に1となり、敵は防御力が全くないかのようにダメージを受けます。1.3や1.1のような小数値も直接入力できません。最初に掛け算を行い、最後に割り算を行うことで、小数点のない彼の数式と同じ結果が得られます:

Basic:     攻撃力 x 100 / (防御力 + 100)
Special1:  攻撃力 x 110 / (防御力 + 100)
Special2:  攻撃力 x 130 / (防御力 + 100)

つまり、3つの攻撃間で変更されるのはその1つの数値だけです。各攻撃の「ATTACK TYPE」行の直下に「Move Power(移動力)」という変数を追加することをお勧めします。Special1とSpecial2の攻撃がどれなのか分からないため、すべてに100を設定していますが、Special1の攻撃2つには110に、Special2の攻撃には130に変更してください。シールドはダメージを与えないため、この変数は不要です:

Punch
◆制御変数: #0197 攻撃タイプ = 0
◆制御変数: #0XXX 移動力 = 100

Ram (MOVING ATTACK HANDLER内)
◆制御変数: #0197 攻撃タイプ = 2
◆制御変数: #0XXX 移動力 = 100

タイプ3攻撃
◆制御変数: #0197 攻撃タイプ = 3
◆制御変数: #0XXX 移動力 = 100

すべての敵の攻撃
◆制御変数: #0197 攻撃タイプ = 4
◆制御変数: #0XXX 移動力 = 100

S blast
◆制御変数: #0197 攻撃タイプ = 5
◆制御変数: #0XXX 移動力 = 100

ランダム1つ
◆制御変数: #0197 攻撃タイプ = 0
◆制御変数: #0XXX 移動力 = 100

プレイヤーのステータスには最初の戦闘の前に値を設定する必要があるため、これらはオープニングイベントのように最初に1回だけ実行される場所に配置します。数値はプレースホルダーです:

◆制御変数: #0XXX プレイヤーATK = 20
◆制御変数: #0XXX プレイヤーDEF = 20
◆制御変数: #0XXX プレイヤーHP = 100

敵のステータスは、設定ブランチの最後、自己スイッチをオンにする行の直前に配置します。ENEMY FORM は敵がどれであるかを示す変数であり、これらの数値もプレースホルダーです:

◆条件分岐: ENEMY FORM = 1
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了
◆条件分岐: ENEMY FORM = 2
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了
◆条件分岐: ENEMY FORM = 3
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了
◆条件分岐: ENEMY FORM = 4
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了
◆条件分岐: ENEMY FORM = 5
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了
◆条件分岐: ENEMY FORM = 6
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了
◆条件分岐: ENEMY FORM = 7
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了
◆条件分岐: ENEMY FORM = 8
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了
◆条件分岐: ENEMY FORM = 9
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了
◆条件分岐: ENEMY FORM = 10
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了
◆条件分岐: ENEMY FORM = 11
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了
◆条件分岐: ENEMY FORM = 12
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了
◆条件分岐: ENEMY FORM = 13
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了
◆条件分岐: ENEMY FORM = 14
  ◆制御変数: #0189 SV: このイベントHP = 100
  ◆制御変数: #0XXX SV: 敵ATK = 20
  ◆制御変数: #0XXX SV: 敵DEF = 20
◆終了

以下は、全体ヒットセクションです。「If: ATTACKING is ON」からその「End」まで、SV: My X および SV: My Y の行の直後にダメージ計算が含まれています。SV: Damage と SV: Def Calc は2つの新しい自己変数で、他の変数と同じように設定されています。スクリーンショットから各ブランチを再構築しましたが、タイプ3のフリーズはピン留めしていたため省略しました:

◆条件分岐: ATTACKING is ON
  ◆条件分岐: 自己スイッチBがOFFの場合
    ◆制御変数: #0192 SV: AtkCol X = 攻撃衝突のマップX座標
    ◆制御変数: #0193 SV: AtkCol Y = 攻撃衝突のマップY座標
    ◆条件分岐: 攻撃タイプ = 2
      ◆制御変数: #0192 SV: AtkCol X = プレイヤーのマップX座標
      ◆制御変数: #0193 SV: AtkCol Y = プレイヤーのマップY座標
      ◆制御変数: #0221 Hit Dir = プレイヤーの方向
      ◆条件分岐: Hit Dir = 2
        ◆制御変数: #0193 SV: AtkCol Y += 1
      ◆終了
      ◆条件分岐: Hit Dir = 4
        ◆制御変数: #0192 SV: AtkCol X -= 1
      ◆終了
      ◆条件分岐: Hit Dir = 6
        ◆制御変数: #0192 SV: AtkCol X += 1
      ◆終了
      ◆条件分岐: Hit Dir = 8
        ◆制御変数: #0193 SV: AtkCol Y -= 1
      ◆終了
    ◆終了
    ◆制御変数: #0194 SV: My X = このイベントのマップX座標
    ◆制御変数: #0195 SV: My Y = このイベントのマップY座標
    ◆制御変数: #0XXX SV: Damage = プレイヤーATK
    ◆制御変数: #0XXX SV: Damage *= 移動力
    ◆制御変数: #0XXX SV: Def Calc = SV: 敵DEF
    ◆制御変数: #0XXX SV: Def Calc += 100
    ◆制御変数: #0XXX SV: Damage /= SV: Def Calc
    ◆条件分岐: 攻撃タイプ = 4
      ◆制御変数: #0189 SV: このイベントHP -= SV: Damage
      ◆SE再生: Blow1 (90, 150, 0)
      ◆移動ルートの設定: このイベント
        : ブレンドモード: 加算
        : 待機: 30フレーム
        : ブレンドモード: 通常
      ◆自己スイッチ制御: B = ON
    ◆終了
    ◆条件分岐: SV: AtkCol X = SV: My X
      ◆条件分岐: SV: AtkCol Y = SV: My Y
        ◆条件分岐: 攻撃タイプ = 0
          ◆共通イベント: DAMAGE SFX
          ◆共通イベント: SCREENSHAKE SMALL
          ◆制御変数: #0189 SV: このイベントHP -= SV: Damage
          ◆制御変数: #0194 SV: My X = Math.round(this.character(0)._realX)
          ◆制御変数: #0195 SV: My Y = Math.round(this.character(0)._realY)
          ◆イベント位置設定: このイベント, ({SV: My X},{SV: My Y})
          ◆移動ルートの設定: このイベント (スキップ, 待機)
            : 速度: 6
            : プレイヤーの方を向く
            : 1歩後退
            : 1歩後退
            : 速度: 4
        ◆終了
        ◆条件分岐: 攻撃タイプ = 1
          ◆制御変数: #0194 SV: My X = Math.round(this.character(0)._realX)
          ◆制御変数: #0195 SV: My Y = Math.round(this.character(0)._realY)
          ◆イベント位置設定: このイベント, ({SV: My X},{SV: My Y})
          ◆移動ルートの設定: このイベント (スキップ, 待機)
            : ブレンドモード: 通常
            : 速度: 5
            : プレイヤーの方を向く
            : SE: Blow5 (80, 100, 0)
            : 1歩後退
            : 速度: 4
            : 待機: 5フレーム
            : ブレンドモード: 通常
        ◆終了
        ◆条件分岐: 攻撃タイプ = 2
          ◆制御変数: #0189 SV: このイベントHP -= SV: Damage
          ◆制御変数: #0194 SV: My X = Math.round(this.character(0)._realX)
          ◆制御変数: #0195 SV: My Y = Math.round(this.character(0)._realY)
          ◆イベント位置設定: このイベント, ({SV: My X},{SV: My Y})
          ◆移動ルートの設定: このイベント (スキップ, 待機)
            : ブレンドモード: 通常
            (ramのノックバックルートの残りの部分、スクリーンショットはブレンドモードの後に切り捨てられています)
        ◆終了
        ◆条件分岐: 攻撃タイプ = 3
          ◆共通イベント: DAMAGE SFX
          ◆制御変数: #0189 SV: このイベントHP -= SV: Damage
          ◆移動ルートの設定: このイベント (待機)
            : ブレンドモード: 加算
            : 待機: 30フレーム
            : ブレンドモード: 通常
        ◆終了
        ◆条件分岐: 攻撃タイプ = 5
          ◆共通イベント: DAMAGE SFX
          ◆制御変数: #0189 SV: このイベントHP -= SV: Damage
          ◆移動ルートの設定: このイベント
            : ブレンドモード: 加算
            : 待機: 30フレーム
            : ブレンドモード: 通常
        ◆終了
        ◆条件分岐: 攻撃タイプ ≠ 1
          ◆条件分岐: 攻撃タイプ ≠ 3
            ◆自己スイッチ制御: B = ON
          ◆終了
        ◆終了
      ◆終了
    ◆終了
  ◆終了
: それ以外
  ◆自己スイッチ制御: B = OFF
◆終了

タイプ3のフラッシュを高速なヒットに合わせて短くした場合は、30の代わりにその数値を維持してください。フリーズがなくなったため、自己スイッチDはオンにならず、Else ブランチにあった D リリースは不要になりました。

逆方向のダメージは、辺を入れ替えた同じ形状です。敵の攻撃ロジックにおいて、これは現在プレイヤーからHPを引く行に置き換わります:

◆制御変数: #0XXX SV: Damage = SV: 敵ATK
◆制御変数: #0XXX SV: Damage *= 100
◆制御変数: #0XXX SV: Def Calc = プレイヤーDEF
◆制御変数: #0XXX SV: Def Calc += 100
◆制御変数: #0XXX SV: Damage /= SV: Def Calc
◆制御変数: #0XXX プレイヤーHP -= SV: Damage

フォームにはここでの追加設定は不要です。フォームはステータスを変更しないためです。フォームは単にプレイヤーが持つ攻撃ブロックを決定するだけであり、各ブロックはすでに独自の移動力を設定しています。親和性(Affinity)に到達した際、防御力の入れ替えのようなステータス関連のものは、この計算が読み取られる前にプレイヤーのDEFを調整できると思うため、数式自体を変更する必要はありません。

タイプ3のフリーズは解消されましたね。

私はほぼすべての実装を終えています。つまり、ここでご提示いただいた6つの制御変数処理のすべてに、「このイベント HP-25」を置き換える必要があるということでしょうか?

◆制御変数: #0XXX SV: ダメージ = SV: 敵攻撃力
◆制御変数: *#0XXX SV: ダメージ = 100
◆制御変数: #0XXX SV: 防御計算 = プレイヤー防御力
◆制御変数: #0XXX SV: 防御計算 += 100
◆制御変数: #0XXX SV: ダメージ /= SV: 防御計算
◆制御変数: #0XXX プレイヤーHP -= SV: ダメージ

それらで変更されるのは HP の行だけです。SV: Damage を算出する 5 行は、ヒットセクションの上部、SV: My X と SV: My Y の直後に一度だけ記述します。そうすれば、それ以下のすべての分岐で同じ数値を参照できます。

◆制御変数: #0194 SV: My X = このイベントのマップ X 座標
◆制御変数: #0195 SV: My Y = このイベントのマップ Y 座標
◆制御変数: #0XXX SV: Damage = プレイヤー ATK
◆制御変数: #0XXX SV: Damage *= 移動パワー
◆制御変数: #0XXX SV: Def Calc = SV: Enemy DEF
◆制御変数: #0XXX SV: Def Calc += 100
◆制御変数: #0XXX SV: Damage /= SV: Def Calc
◆条件分岐: ATTACK TYPE = 4

その後、タイプ 0、2、3、4、5 の各分岐では、以下の行を

◆制御変数: #0189 SV: このイベント HP -= 25

以下のように変更します。

◆制御変数: #0189 SV: このイベント HP -= SV: Damage

シールドの分岐には該当行がないため、そのまま変更しません。

あなたが引用した 6 行は、逆方向、つまり敵がプレイヤーに攻撃する場合のためのものです。これらはヒットセクションには記述しません。代わりに、敵の攻撃ロジック内、現在プレイヤーから HP を減らす処理が行われている箇所に記述します。私はまだその部分を見ていないため、スクリーンショットを投稿していただければ、具体的にどこに記述すべきかをお示しできます。

ああ、そうだね。

正直に言うと、プレイヤーがダメージを受けるための処理はまだ実装していません。というのも、その段階ではステータスの調整に集中したかったからです。敵が実際にプレイヤーを攻撃できる状態にはまだなっていません。ただ、この話題について話すには丁度いいタイミングだと思うので、今、共同開発者と議論しています。

その議論の間、敵のヒット(被ダメージ)セクションに何が組み込まれているのかを明確にしておきたいです。

◆制御変数: *#0194 SV: 自分のX座標 = このイベントのマップX座標*
◆制御変数: *#0195 SV: 自分のY座標 = このイベントのマップY座標*
◆制御変数: *#0XXX SV: ダメージ = プレイヤー攻撃力*
◆制御変数: *#0XXX SV: ダメージ *= 移動力*
◆制御変数: *#0XXX SV: 防御計算 = SV: 敵防御力*
◆制御変数: *#0XXX SV: 防御計算 += 100*
◆制御変数: *#0XXX SV: ダメージ /= SV: 防御計算*

^ これらはすべて、攻撃タイプのチェックの前に実行されます…

  ◆制御変数: *#0189 SV: このイベントのHP -= SV: ダメージ*

^ そしてこれが「イベントHP-25」のプレースホルダーに置き換わります…

そして、これで敵へのダメージ処理が正常に機能するはずです?

はい、それで合っています。ダメージ計算は位置を使用しないため、If: ATTACK TYPE = 2 のブロックより上に上がる必要はなく、そのブロックはそのままで構いません。ただし、HPを減らす最初の分岐である If: ATTACK TYPE = 4 より前に配置する必要があります。

ダメージ計算には、私の以前の投稿で述べた3つの要素も関係しています。すべての攻撃ブロックには Move Power の行が必要であり、戦闘前に Player ATK に値を設定し、14ある ENEMY FORM のステータス分岐をセットアップ部分に含める必要があります。攻撃が命中してもダメージが0になる場合は、まず Move Power と Player ATK を確認してください。どちらかが0であれば、結果も0になります。

これで合っていますか?

(残りの-25sもすべて-SVダメージです)

もう一つ確認しておいた方がいいのは名前です。あなたは「SV: このイベントのDEF」と呼んでいますが、私が書いたのは「SV: 敵のDEF」です。あなたの14の「敵のフォーム」設定が同じ変数に書き込む限り、これは問題ありません。それぞれの「DEF」行は、あなた自身の数字を使って以下のように読みます:

◆制御変数:#0XXX SV: このイベントのDEF = 20

設定が別の変数に書き込む場合、Def Calcは0を読み取り、すべての敵は防御がないかのようにダメージを受けます。

テストしてみると、すごくうまく動いているようです!

Ok, i’ve been discussing it with my codev. How complicated would it be to give enemies access to the same attacks the player has, depending on the enemy that’s in battle?

Like, say, the player is fighting an enemy that gives access to Form 3. (Basic attack, the speed boost+S Ram form) The enemy can use the Form 3 moves on the player. Is this realistic?

実際にまだ構築していないのは、敵の攻撃ロジックの方です。各移動は敵の視点から記述されています。

プレイヤー版はそのまま再利用できません。なぜなら、プレイヤー版は「攻撃中(ATTACKING)」と「攻撃の衝突」に基づいて動作するからです。「攻撃中」はすべての敵が監視する一つのスイッチです。そのため、ある敵がこれをONにすると、他のすべての敵がヒットをチェックし、プレイヤーを追跡する攻撃の衝突が停止してしまいます。しかし、敵側の方が実は単純です。衝突対象はプレイヤーただ一人なので、ヒットボックスイベントを使う代わりに、各敵は単にプレイヤーが自分の前方のタイルにいるかどうかをチェックすればよいのです。

このチェックは、敵の移動すべてで共有される部分です。以下に、あなたの命名規則を用いてダメージ計算式を含めたものがあります:

◆制御変数: #0XXX SV: 前方X = このイベントのマップX座標
◆制御変数: #0XXX SV: 前方Y = このイベントのマップY座標
◆制御変数: #0XXX SV: 前方方向 = このイベントの方向
◆条件分岐: SV: 前方方向 = 2
  ◆制御変数: #0XXX SV: 前方Y += 1
◆分岐終了
◆条件分岐: SV: 前方方向 = 4
  ◆制御変数: #0XXX SV: 前方X -= 1
◆分岐終了
◆条件分岐: SV: 前方方向 = 6
  ◆制御変数: #0XXX SV: 前方X += 1
◆分岐終了
◆条件分岐: SV: 前方方向 = 8
  ◆制御変数: #0XXX SV: 前方Y -= 1
◆分岐終了
◆制御変数: #0XXX SV: 目標X = プレイヤーのマップX座標
◆制御変数: #0XXX SV: 目標Y = プレイヤーのマップY座標
◆条件分岐: SV: 前方X = SV: 目標X
  ◆条件分岐: SV: 前方Y = SV: 目標Y
    ◆制御変数: #0232 SV: ダメージ = SV: このイベントの攻撃力
    ◆制御変数: #0232 SV: ダメージ *= 100
    ◆制御変数: #0233 SV: 防御計算 = プレイヤーの防御力
    ◆制御変数: #0233 SV: 防御計算 += 100
    ◆制御変数: #0232 SV: ダメージ /= SV: 防御計算
    ◆制御変数: #0XXX プレイヤーHP -= SV: ダメージ
  ◆分岐終了
◆分岐終了

フォーム3の残りの部分はこれを基に構築されます。基本的な攻撃は、このチェック単体です。スピードブーストは、タイマーでカウントダウンする「このイベント」のスピードルートであり、あなたのアクションタイマーと同じ形状ですが、自己変数を使用します。ラッシュ(突進)の場合、敵は「スキップ」と「待機」を使用してステップを実行し、その後同じチェックを行います。停止した瞬間にプレイヤーが前方のタイルにいれば、ぶつかったことになります。どの移動を使うかは、ENEMY FORMのセットアップブランチで設定するもう一つの自己変数(例:SV: Moveset = 3)によって決定し、攻撃ロジックはその変数に基づいて分岐します。

唯一の注意点として、プレイヤーへのノックバックがあります。敵は並列イベントであり、「その場で回転(TurnInPlace)」は並列イベントから来るプレイヤーのルートを壊してしまうため、プレイヤーを押し戻すには、RECOILのような独自の自動実行イベントが必要です。

移動パターンを記述する前に、敵がいつ攻撃するかを決定する条件は何ですか?あなたのループは既に使用可能な攻撃をチェックしているので、その部分が移動を選択し、まだ実行するものが何も無い状態になっているのか気になります。また、敵のヒットはプレイヤーをノックバックさせるべきですか、それともダメージを与えるだけでよいですか?

私の質問ですが、この方向で進める場合、元の敵の無数の手動定義された複製を作ることなく、すべての敵インスタンスに独自の攻撃当たり判定を持たせるにはどうすればよいのでしょうか?それは可能なのでしょうか?