イベント詳細

これで一通り。


ここからは本当に詳しく見ていきます。ある程度元作品のイベントを見る事で理解を深めていないと意味不明だと思いますから、気を付けてください。

始める前に

フリーマップモード消滅
0xC66B4 > 00 00 00 00
0xC1E74 > 70 B5 05 48

このバイナリ書き換えで、ワールドマップに魔物が湧く要素を排除します。加えて「WMイベント無しで次の章へ」の命令を全マップで正常化させる事もできます。塔と遺跡を含めた、ワールドマップの移動に関する要素は残ります。
 メリットが大きいので、魔物湧き要素が要らない場合はこの場で消しておきましょう。

前回の補足

前回では、簡潔にするために最低限以外は触れずに置きました。しかし本気で作るとなるとそのままではいけません

改造する章を増やす

だいたい前回の要領でやれば、次の章を改造することはできますが、ひとつ注意があります。

{
#include "Ch0.event"
}
{
#include "Ch1.event"
}

このように、{}は章ごとに囲ってください。

ユニットデータの補足

前回はスルーしましたが、ユニットは出現時に移動しながら出現させる事が出来ます。
 前回のように出現元だけ指定した場合、地面から湧いて出るような感じで出現しましたね。暗転中の出現なら無問題ですが、見えている状態でイベント中だと変に見える時も多々あります。

移動先の設定はこうです。

UNITS01:
UNIT $01 $02 $00 Level(1,0,0) [14,9] 0 0 1 label01 [$01,$6C] NoAI
WORD 0 0 0 0 0

label01:
REDA [x,y] 0 0 0 0

前回”0 0 0 0“だったところが”0 0 1 label01"になっているのがお分かりでしょうか。ここが移動先の指定です。”label01″でデータ先を指定し、その左を1。そして移動用データを”REDA”で作っています。

移動しながらの出現は、演出的な意味だけではなく実利的な効果もあります。移動させないで普通に出すと、もし出現地点に既にユニットが乗っていた場合、出てこれません(いわゆる増援塞ぎ)。しかし移動させると、防ぐ事が出来なくなります。なので、絶対に出てくる増援が作れます
 塞がれたくない重要なユニットを出す場合は、移動させながら出現させましょう。

なお、移動しながらの増援はまれにフリーズの原因になります。
マップが広い・出現元地形が平地以外・出現元座標が上端もしくは左端に近い
これらの条件がある程度そろうとフリーズします。正確な条件は不明。なお、移動しないで出現する増援はフリーズしない模様です。原因不明の増援バグに見舞われたときは、移動しないで出現させましょう。 
 
 
アイテムドロップ


ユニットデータ設定にはもうひとつ重要な項目があります。
 今の”0 0 1 label01“とした部分がありますね。この一番左のゼロを”2″にする事で、アイテムを落とす敵を作ることができます(移動する設定が無くてもアイテムを落とせます)。これは覚えておきましょう。なお左から二番目は不明値です。
 
 
ユニットの上限


マップに存在できるユニットの数には限界があります。これを超えた数をマップ上に呼び出そうとしても、現れません。ハーケンが出現しないバグで知られていますね。
 ユニット上限は所属軍別に決まっており、自軍は62。敵軍は50。友軍は20。となっています。なお、マップ上に存在できる数とは別に、セーブできる上限が存在しており自軍は51、敵軍は50、友軍は10です。実質の上限はセーブ上限だと思ってください。ついでに補足しますが、自軍はユニットIDが0x45以内じゃないと一部データが異常値になります。

進撃準備イベント

序章では気にしないでしょうが、序章以外ではそのうち進撃準備を使いたくなるでしょう。進撃準備は、章開始イベントの最後あたりに以下の命令を仕込めば可能です。

FADI $10 //[XX]の速さで暗転
CLEA 0; CLEE 0; CLEN 0 //ユニット全消去
LOAD1 1 UNITS00; ENUN //敵・友軍をロード
CALL $085B9DBC //進撃準備呼び出し
ENDA //終了

何故ユニットを消すのかというと、開始イベント演出用のユニットを消す為です。その後に改めてちゃんとした敵を呼び出します。
 
 
・・・あれ、味方ユニットは?
 お気づきの通り、自軍ユニットは別個で呼び出します。設定ファイル内をよく探してみてください

Units: //////////自軍ユニット初期配置
UNIT $1 $1 0 Level(1,0,0) [X,Y] 0 0 0 0 NoItems NoAI
UNIT $1 $1 0 Level(1,0,0) [X,Y] 0 0 0 0 NoItems NoAI
UNIT $1 $1 0 Level(1,0,0) [X,Y] 0 0 0 0 NoItems NoAI
WORD 0 0 0 0 0

UNITS00: ////////敵軍ユニット初期配置
UNIT $2A $01 $00 Level(10,2,0) [2,2] 0 0 0 0 [$14,$6C] [3,3,0,$20]
WORD 0 0 0 0 0

こんな感じで設定します。自軍の出撃位置・人数の指定にも同じく<UNIT>を使います。自軍初期配置用データは、座標以外のデータは零で構いませんし、自軍の出撃人数を増やしたい場合は、これを増やせばよいです。

章開始時の暗転

章が開始するときは、章名表示、章開始イベント、という風に流れます。この時、章によっては自動的に暗転解除する章としない章があります。しない章ではわざわざ解除する必要がありますが、暗い内にマップを変えたり、暗い内にユニットを出したり出来ます。それがしたい場合は自動暗転解除を防ぎましょう。
 これの設定は「マップ設定」の方で行います。PFEは烈火の設定を流用しているので間違えていますが「Status – Objective Text」の部分でそれを設定できます。

1だと自動暗転解除します。101だとしません。

ちなみにマップ設定についての補足はこちらにまとめてみました。PFEに書かれていない項目もあるので、一度見ておいて下さい。

条件イベント設定

イベント命令は実際のイベントがとても参考になります。オリジナルのイベントを大いに参考にして下さい。何か独自イベントを作りたいと思ったら、本来のイベントの挙動をチェックして下さい。それが一番です。

ターン条件


規定のターンになったら増援を出すのが一番よく見る使い方です。

TurnBasedEvents: //////////ターン条件
TURN 0 TBE01 [1,0] X //[X]0=自フェイズ前,4=緑フェイズ前,8=敵フェイズ前
TURN 0 TBE02 [1,5] 8
TURN 0 TBE03 [7,0] 0
END_MAIN

[1,0]は左が”~ターンから発動”で右が”~ターンまで発動”です。つまり[1,5]なら1~5ターンまで実行されます。なお右が零の場合は、1ターンだけ発動という意味になります。

Xはその通り、フェイズです。例えば敵フェイズに設定して増援を出すと、封印の剣のような奇襲する増援になります。自フェイズにすると、余裕をもって迎え撃てる増援が作れます。
 ちなみに、1ターン目自軍フェイズに発生する設定にすると、進撃準備が終わった後に即発生するイベントです。

一番簡単なターン条件イベントは、生存クリアでしょう。規定ターンになったら章終了イベントを起こすだけです。

TurnBasedEvents: //////////ターン条件
TURN $3 EndingScene [16,0] 0 //[X]0=自フェイズ前,4=緑フェイズ前,8=敵フェイズ前
END_MAIN

とはいえ、よく使うのは増援イベントでしょうね。結構複雑ですが作ってみましょう。

TurnBasedEvents: //////////ターン条件
TURN 0 TBE01 [1,0] 8 //[X]0=自フェイズ前,4=緑フェイズ前,8=敵フェイズ前
END_MAIN

TBE01:
WORD $20540; POIN UNITS1t; CALL $08A603AC //通常増援
NoFade; ENDA //イベント終了命令

UNITS1t:
UNIT $80 $01 $00 Level(5,2,1) [0,0] 0 0 0 0 [$14,$6C] [0,0,0,0]
WORD 0 0 0 0 0

こんな感じです。2段構えの入れ子式になっているので複雑です。

それともう一つ重要な補足です。章開始イベントと章終了イベントは末尾が”ENDA”でしたが、それ以外のイベントでは終了命令が違います。要注意です。

2段構えの入れ子式は名札の数が増えるのが悩みの種です。私は、Turn Based Event省略形のTBE01で出す増援には、UNITS1t(1t = 1ターン)的に名札をつけています。

フェイズ条件

高度なイベントなので最初は気にしないでください。PFEで色々なターン条件イベントを見ると分かりますが、1~255ターンに発動するイベントがチラホラあると思います。変ですよね、でもフラグIDに注目です。1~255のターン条件は確実にフラグIDが設定されています。
 こんな設定をする理由は一つです。“何かのイベントを起こした次のフェイズで起こしたいイベント”が指定されるのです。

  1. 章開始イベントでフラグAをオン
  2. 1~255のフラグAターン条件増援、フラグオンなので不発
  3. (例えば範囲条件。自軍進入でイベント発生。)他の条件イベントによりフラグAをオフに戻す
  4. 1~255のフラグA増援、フラグオフなのでフェイズ開始時に発生

「章開始イベント・ターン条件・範囲条件」と計3つのイベントが関わります。とても複雑なイベントです。知識として知っていて損は無いですが、現実的にはこんなものは使いません。

同じような事がしたい場合、普通は以下のようなイベントを作ります。
例)$Bフラグがオンになった次の自軍フェイズ時に増援

TurnBasedEvents: //////////ターン条件
TURN $A TBE02 [1,255] 0 //[X]0=自フェイズ前,4=緑フェイズ前,8=敵フェイズ前
END_MAIN

TBE02:
CHECK_EVENTID $B //[B]フラグ条件
BNE $0 0xC 0 //オンの場合LABEL $XXまでジャンプ
CALL $08A6030C //条件フラグをオフのままにして終了
LABEL $0 //ジャンプ先XX
WORD $20540; POIN UNITS2t; CALL $08A603AC //通常増援
NoFade; ENDA //イベント終了命令

UNITS2t:
UNIT $80 $01 $00 Level(5,2,1) [0,0] 0 0 0 0 [$14,$6C] [0,0,0,0]
WORD 0 0 0 0 0

これなら章開始イベントでの仕込みが不要になります。ちなみに従来の回りくどい手法の方が、数フレームほどゲーム動作速度が速いという利点があります(笑)
 とは言えやはり高度なイベントですので、最初は気にしなくても良いでしょう。

会話条件


会話条件は、分かりやすいです。「話す」を出すための設定です。

CharacterBasedEvents:	//////////会話条件
CharacterEventBothWays($ZZZ,CBE01,$XX,$YY)
END_MAIN

[XX]と[YY]の会話を設定します。[ZZZ]フラグを使用します。<CBE01>で指定されたイベントを起こします。

一番単純な会話イベントの作り方も紹介しましょう。

CharacterBasedEvents:	//////////会話条件
CharacterEventBothWays($ZZ,CBE01,$XX,$YY)
END_MAIN

CBE01:
Text($XXX)
NoFade; ENDA //イベント終了命令
一方向会話
CharacterBasedEvents:	//////////会話条件
CharacterEvent($ZZ,CBE01,$XX,$YY)
END_MAIN

このように指定すると、XXからしか話しかけれない条件を設定出来ます。

こっちじゃないとダメな場面は少ないですが、寝返りイベントなんかつくる時にはこっちの方で作るといいかもしれませんね?

CharacterBasedEvents:	//////////会話条件
CharacterEvent($ZZ,CBE01,$XX,$YY)
END_MAIN

CBE01:
MUSS 48 //BGM一時変化
STAL 33; Text($YYY) //YYY会話指定
MURE 2; CUSA $XX //[ZZ]を自軍に変更
NoFade; ENDA //イベント終了命令

 
ちなみに敵から会話を発生されることも可能だったりします。ですがAI改造に関わる話なので今回は割愛。

フラグ条件会話

使用フラグが立っていたら会話出来ないのは当たり前じゃない? ではなく「特定のフラグが立っていたら会話が可能」という特殊な指定です。

CharacterBasedEvents:	//////////会話条件
CharacterEvent($ZZ,CBE01,$XX,$YY,$AA)
END_MAIN

さっきとほぼ同じですが、最後の[$AA]で条件フラグを設定できます。これで、指定のフラグが立った場合に会話できるようになります。一定の順序で会話を発生させるという使い方が基本です。

オブジェクト指定


自作マップを作ったら、そのマップに対して様々な情報を付加しなくてはいけません。宝箱なら中身、村なら会話内容、などです。オブジェクト指定は複数あるので列挙します。
ちなみに座標は一番左上が(X,Y)=(0,0)です。

民家

情報をくれる民家です。アイテムをくれない方の訪問によく使われます。

LocationBasedEvents: //////////オブジェクト指定
House(0,LBE01,X,Y)
END_MAIN

LBE01:
HouseEvent($YYY,$XX) //(会話,背景CG)

[X,Y]で民家の座標を指定し、<LBE01>で会話内容とその時の背景CGを指定します。

制圧(城門・玉座)
LocationBasedEvents: //////////オブジェクト指定
Seize(3,EndingScene,X,Y)
END_MAIN

制圧はマップチップ不問です。オブジェクト指定で設定すれば、如何なる地形でも制圧コマンドを出すことが出来ます。

上の指定では、制圧すると章終了イベントを発生させています。ですが、「制圧」は普通のイベントを発生させる事もできます。滅多に使う事は無いでしょうが、使い道を考えるのも面白いかもしれません。

LocationBasedEvents: //////////オブジェクト指定
Seize($Z,LBE01,X,Y)
END_MAIN
LocationBasedEvents: //////////オブジェクト指定
Door(X,Y)
END_MAIN

何が起こるかはだいたい分かると思います。正確には、開けるとその座標と同じ座標に存在するマップ変化を起こす、である事を覚えておいて下さい。

扉も実際のマップチップとオブジェクト指定の両方が揃わない限り効果が出ません。部屋に扉が2カ所ある場合でも、1カ所が空いたらもう片方の扉も自動的に消せるという利点があります。
そのお陰で扉に見えて扉として使えない問題が発生したりします。

ちなみに、あまり使わないでしょうが扉にもフラグやイベントが設定出来ます。もし扉を他のイベントへと派生のキーにしたい場合に使いましょう。リグバルド要塞とかでは扉の開放が増援のキーになってたりします。

LocationBasedEvents: //////////オブジェクト指定
DOOR $ZZ LBE01 [X,Y] 0x12
END_MAIN
宝箱

お金か、アイテムを入れることが出来ます。これも開けるとマップ変化を起こします。

LocationBasedEvents: //////////オブジェクト指定
Chest($ZZ,X,Y)
END_MAIN

次はお金入り宝箱の指定です。

LocationBasedEvents: //////////オブジェクト指定
ChestMoney(ZZZZ,X,Y)
END_MAIN

よっぽど無いでしょうが宝箱だろうとフラグはつけられます。宝箱はマップ変化を起こして空宝箱になると二度は開けれないので、フラグの意味はほぼありませんが。

LocationBasedEvents: //////////オブジェクト指定
CHES $AAA $ZZ [X,Y] 0x12
END_MAIN

“$AAA”がフラグです。これはフラグ付きアイテム宝箱の指定です。もちろんお金バージョンも出来ますが・・・いらないよね?

訪問したらアイテムがもらえるけど、急がないと蛮族に潰されるあれです。これも発動したらマップ変化を起こします。

LocationBasedEvents: //////////オブジェクト指定
Village($ZZ,LBE01,X,Y,$AA)
END_MAIN

[X,Y]は座標、[$ZZ]は訪問した時にオンになるフラグ、[$AA]は村が破壊された時にオンになるフラグです。破壊される予定が無い場合、[$ZZ]と[$AA]は零で構いません。

ついでに訪問のイベントも紹介します。

LBE01:
VillageEventItem($YYY,$XX,$ZZ) //(会話,背景CG,貰えるアイテム)

お金ならこうです。

LBE01:
VillageEventMoney($YYY,$XX,ZZZZZ) //(会話,背景CG,貰える金額)
1マスだけの訪問村

1マスだけの閉じる訪問村を作りたい時はこうです

LocationBasedEvents: //////////オブジェクト指定
VILL $ZZ LBE01 [X,Y]
END_MAIN

なお、この村は蛮族に襲われません。訪問後にマップ変化を起こすので、閉じ村になると入れなくなります。なのでフラグ設定は零でも特に問題ありません。

おなじみの店です。ちなみに店はどんな地形でも設置できます。何故って・・・まあ秘密店の都合でしょうね。

LocationBasedEvents: //////////オブジェクト指定
Armory(ShopList,X,Y) //武器屋
Vendor(ShopList,X,Y) //道具屋
SecretShop(ShopList,X,Y) //秘密店
END_MAIN

ShopList:
SHLI $1 $2 $3 $4
ALIGN 4

もう分かるでしょうが、<ShopList>が販売アイテムの内容です。ちなみに秘密店に入るにはカードが必要ですよ。

常時・範囲条件

テクニカルな使われ方が目立ちます。

常時条件

ご存じの通り、全章にフラグ0x65がオンになるとゲームオーバーイベントを発動させる常時条件が設定されています。

MiscBasedEvents:    //////////////範囲・常時条件
AFEV 0 $085B9EE8 $65 //ゲームオーバー
END_MAIN

特定のフラグがオンになった時に連鎖的にイベントを発生させるものです。本来はフラグしか設定出来ないもの(戦闘会話・敵撃破など)にイベントを付随させてくれる、という認識でいいと思います。敵全滅でクリア、ボス撃破でクリア、が一般的な使い方です。

設定すべきは、「反応する条件」「発生させるイベント」です。ボス撃破イベントを作る場合、ボス撃破フラグは一般的に$2なので、こうなります。

MiscBasedEvents: //////////範囲・常時条件
AFEV 0 $085B9EE8 $65 //ゲームオーバー
AFEV $3 EndingScene $2
END_MAIN

一番右が反応させるイベントフラグID(条件)。その左が発生させるイベント。さらに左がその常時条件自体のイベントIDフラグです。

範囲条件

ユニットが指定範囲で行動を終了したら発動するイベントです。指定には、ユニットID指定・所属指定があります。
 単純に踏んだ瞬間に発動するイベントはかなり少ないです。ほとんどが組み合わせのフェイズ条件として使われています。単体で使われる主な使用法というと、自軍が進入したら敵が突撃してくるとか、到達でクリアになる範囲条件イベントなどがあります。

MiscBasedEvents: //////////範囲・常時条件
AFEV 0 $085B9EE8 $65 //ゲームオーバー
AREA $ZZ MBE01 [X1,Y1] [X2,Y2]
END_MAIN

作れる範囲は、四角の範囲です。[X1,Y1]で四角の左上座標を指定、[X2,Y2]で四角の右下の座標を指定します。

矩形といいます。ちなみに複数作って組み合わせれば、四角以外の範囲も作ることが可能です。

自軍が範囲に入ったら敵が突撃してくる条件イベントはこんな感じです。

MiscBasedEvents: //////////範囲・常時条件
AREA $Z MBE01 [X1,Y1] [X2,Y2]
END_MAIN

MBE01:
SVAL 2 0; CALL $08A602F0 //自軍進入で
WORD $10540; BYTE $0 $0 $0 $0; CHAI $XX; NoFade; ENDA //[XX]が突撃AIに

もしくは、フェイズ条件の一部として自軍進入で増援というイベントです。実際に増援を出すのはターン条件の方ですので、範囲条件側の仕事はフラグを立てるだけです。

MiscBasedEvents: //////////範囲・常時条件
AREA $B MBE01 [X1,Y1] [X2,Y2]
END_MAIN

MBE01:
SVAL 2 0; CALL $08A602F0 //自軍進入で
NoFade; ENDA //イベント終了

ちなみに防衛マップもこれで作るけれど、防衛マップ作るならAI改造も必要

その他のマップ設定

マップに設定出来るものはイベントだけではありません。補足的なものになりますが、見ていきましょう。

トラップデータ設定

トラップデータとは何かと言うと、シューターの設置等です。・・・等というのは、他にも設置できるものはあるのですが、あまり一般的じゃないみたいで資料が無かったので。とりあえずシューターの設置に関してのみ記述します。調べれば毒ガスとか設置できるかもしれません。

それは置いといて、シューターの設置はこうです。

TrapData:
BLST [X,Y] 0x35 //ロングアーチ
BLST [X,Y] 0x36 //アイアンアーチ
BLST [X,Y] 0x37 //キラーアーチ
ENDTRAP
ALIGN 4

だいたい分かりますね?座標を設定すればOKです。

NPC離脱地点設定

離脱地点を設定したい?ずいぶん通ですね。離脱地点って何?という人は気にしなくていいです。

以下の記述をどこでもいいので、最後辺りにでも加えて下さい。”$XX”はマップIDです。お間違えなきよう。
まずは敵軍用の離脱地点です。

EscapePointPointerTable($XX, EPPTE)

EPPTE:
EscapePoint(X, Y, 5)
EscapePointEnd

次は緑軍用の離脱ポイント指定です。

NPCEscapePointPointerTable($XX, EPPTN)

EPPTN:
EscapePoint(X, Y, 5)
EscapePoint(X, Y, 5)
EscapePointEnd

もちろん、複数箇所設定できます。

ワールドマップイベント

割愛します。というのもProjects_FE_GBAがまだ対応していないからです。対応していないのに手を出すのは素人ではありませんから、ここの解説も不要です。つまり書かなくても問題無い!!

また今度に別枠で解説するかもしれません。しないかもしれません。


ということで、ようやく一通りの解説が終わりました。あとはこちらのページにイベント命令について詳細に書いてあります。他にも、特殊すぎて載せなかった条件イベントも載せていたりしますので、今後はそれらを見ながら独自のイベントを組み立てていく事になるでしょう。色々と作ってください。
 それでは、がんばりましょう。

コメントを残す

メールアドレスが公開されることはありません。