• Welcome to Final Fantasy Hacktics. Please login or sign up.
 

Event Command Walkthrough by Nyzer

Started by Nyzer, January 16, 2022, 12:15:25 pm

Nyzer

January 16, 2022, 12:15:25 pm Last Edit: January 16, 2022, 01:04:05 pm by Nyzer
For now, this eventing tutorial is going to be fairly simple, focused only on the event commands themselves rather than the other necessary steps like setting up the ENTD, ATTACK.OUT, and conditional settings. So, we're going to be making the Agrias Motherfucking Oaks version of the Orbonne Prayer scene at the very start of the game, which already has all of this set up and ready to go for our purposes.

It's important to note that this tutorial is being done up with the expectation that you're using The Lion War as the base for your edits, and that the emulator you're using for this is psxfin v1.13. Also, if you ever have any confusion about the specific functionality of an event command, refer to the Event Instructions page on the wiki.

It would be relatively easy for me to simply edit the existing commands of the event to accomplish what I want here, but since this is a tutorial, we're going to start from scratch. Later on, I'll be tossing some of the vanilla commands in more freely, though.

Anyway, here's what you should see once you first open EVSP.



There are some basic commands we need to establish before this can actually be imported and seen in-game.

Offset(x00002000) will tell the game that this is the first event.

LoadConditionals(x0000) will (if using The Lion War) tell the game which Conditionals to use for this event.

Camera(+00840,-00220,+00504,+00302,+03584,+00000,+04096,+00000)will tell the game where we want the camera to be at the very start of the event. The final video itself uses different initial camera commands, but for this tutorial, this is what we'll use.

Reveal(030) will let us fade in from the black screen. You need a Reveal command near the start of every event or else you won't be able to see anything.

Wait(00030) will prevent any of the next commands from happening until after 30 frames have passed. We're using this to prevent anything from happening until after the Reveal command is finished.

Pause() is a command that basically exists only for the purpose of doing event work. This will keep the event paused until you hit X or O. We're using it to keep the event from ending once the other commands are finished.

EventEnd() is, well, the command that marks the end of the event commands. Note that you should never have more than one of these in an event, or else the compiler will end the commands after the first one and consider all the rest to be message text.

So, take these commands and put them in EVSP.

Offset(x00002000)
LoadConditionals(x0000)
Camera(+00840,-00220,+00504,+00302,+03584,+00000,+04096,+00000)
Reveal(030)
Wait(00030)
Pause()
EventEnd()



Click Compile Event, and choose the correct .EVT file to compile to. Then go into CDMage and import the .EVT. Then go into psxfin, open the game, and choose New Game. Get to the first event and you should end up with this:


If you were to press O or X at this point, it would end the Pause, and then end the event. Since there's no further directions in this event, it would go into a "battle" in which the units just kinda stand in a corner and don't do anything because there are no enemies.


We'll go put some more stuff in the event in a moment, but for now, while we've got psxfin open, let's make sure the savestate path is set to our EVSP folder. This will allow us to use savestate editing, which is many times faster than importing the .EVT every single time we make a change.



Back to EVSP.

We're going to add another Pause() command, this time immediately after the Offset command. This Pause will be where we make our savestates.



Once again, hit Compile Event, then go to CDMage and import the .EVT. Go back to psxfin and choose File > Reset. Now, when you start a New Game and get to the event, you'll see a black screen and hear the normal background music. That's good - that's exactly what we want. Use Quick Save 1, 2, and 3 (F6, F7, and F8 by default in psxfin's controls).

Go back to EVSP. Click the checkbox for Compile to SaveState. A small popup menu will appear, asking you to choose which savestate to save to. Choose "quicksave_TLW2_942.21_1.psv", and click Compile to Chosen SaveState.



Go to the Offset command and comment it out by putting "//" at the start. This is because EVSP has a minor bug that will cause it to throw the cursor back to the start of the event sometimes after compiling to a savestate.

Now, let's add some more commands.

After the Camera instruction, add
UnitAnim(x00,x00,x0002,x00). This will target all units currently alive and on the field, and make them use the standing animation, rather than the walking-in-place we saw before.

However, Ovelia is supposed to be kneeling in prayer at the start of this scene, not standing upright. And her prayer doesn't use a standard animation. So what we need to do is to load in a special set of animation frames known as an "EVTCHR". Add in the following instructions:

LoadEVTCHR(x01,x00,x00)
WaitForInstruction(x34,x00)
SaveEVTCHR(x01)

Now the EVTCHR is ready to be used. Ovelia's Unit ID is x0C, and the frame we need for her can be called with Anim x0259, so add the following command:

UnitAnim(x0C,x00,x0259,x00)
Your EVSP should look like this:



Click Compile Event. Note that this time it doesn't ask you which .EVT to compile the event to.
Go to psxfin and choose Quick Load 1 (F1 by default).


Now, time to add some text to the event. Text is put into an event script below the EventEnd() command, with the end of each individual message marked by either {close} or {end}. For the sake of readability, the lines "Message x01", "Message x02" and so on are included as comments (lines beginning with "//" that the compiler automatically ignores).

Beneath the EventEnd() command, add these lines.

//INSTRUCTION SECTION END -  TEXT START
//Message x01
Ignore this message for now.{br}
We're not including Ovelia's prayer yet.{end}

//Message x02
{font:08}Female Knight{font:00}{br}
Don't worry about that, Ovelia.{br}
Let's get going.{end}

//Message x03
{font:08}Ovelia{font:00}{br}
Just a moment, Agrias...{end}

//Message x04
{font:08}Agrias{font:00}{br}
That's {font:08}Dame{font:00} Agrias, Princess.{br}
{br}
I appreciate your religious{br}
devotion, but I'm the knight{br}
in charge of your safety.{br}
And we need to get to{br}
Dorter before nightfall.{end}

//Message x05
{font:08}Priest{font:00}{br}
Princess Ovelia, please.{br}
{br}
You... you don't want to{br}
give Agrias any trouble,{br}
do you? It's n{D11D}not wise.{end}

We also need to actually have the units say these lines in-game. So, after the Wait(00030), add these lines:

//Agrias talks to Ovelia.
DisplayMessage(x10,x12,x0002,x34,x00,x00,+00000,+00000,+00000,x03)
//The game waits for this message to finish.
WaitForInstruction(x01,x00)
//Ovelia says just a minute.
DisplayMessage(x10,x11,x0003,x0C,x00,x00,+00000,+00000,+00008,x02)
//The game waits for this message to finish.
WaitForInstruction(x01,x00)
//Agrias insists.
DisplayMessage(x10,x12,x0004,x34,x00,x00,+00000,+00000,+00000,x03)
//The game waits for this message to finish.
WaitForInstruction(x01,x00)
//Simon warns Ovelia that it's not wise to ignore Agrias.
DisplayMessage(x10,x12,x0005,x13,x00,x00,+00000,+00000,-00008,x02)
//The game waits for this message to finish.
WaitForInstruction(x01,x00)

It's now too long for me to screenshot, but the text in your EVSP should now look like this:

//Offset(x00002000)

Pause()

LoadConditionals(x0000)
Camera(+00840,-00220,+00504,+00302,+03584,+00000,+04096,+00000)

UnitAnim(x00,x00,x0002,x00)
LoadEVTCHR(x01,x00,x00)
WaitForInstruction(x34,x00)
SaveEVTCHR(x01)
UnitAnim(x0C,x00,x0259,x00)

Reveal(030)
Wait(00030)

//Agrias talks to Ovelia.
DisplayMessage(x10,x12,x0002,x34,x00,x00,+00000,+00000,+00000,x03)
//The game waits for this message to finish.
WaitForInstruction(x01,x00)
//Ovelia says just a minute.
DisplayMessage(x10,x11,x0003,x0C,x00,x00,+00000,+00000,+00008,x02)
//The game waits for this message to finish.
WaitForInstruction(x01,x00)
//Agrias insists.
DisplayMessage(x10,x12,x0004,x34,x00,x00,+00000,+00000,+00000,x03)
//The game waits for this message to finish.
WaitForInstruction(x01,x00)
//Simon warns Ovelia that it's not wise to ignore Agrias.
DisplayMessage(x10,x12,x0005,x13,x00,x00,+00000,+00000,-00008,x02)
//The game waits for this message to finish.
WaitForInstruction(x01,x00)


Pause()
EventEnd()


//INSTRUCTION SECTION END -  TEXT START
//Message x01
Ignore this message for now.{br}
We're not including Ovelia's prayer yet.{end}
//Message x02
{font:08}Female Knight{font:00}{br}
Don't worry about that, Ovelia.{br}
Let's get going.{end}
//Message x03
{font:08}Ovelia{font:00}{br}
Just a moment, Agrias...{end}
//Message x04
{font:08}Agrias{font:00}{br}
That's {font:08}Dame{font:00} Agrias, Princess.{br}
{br}
I appreciate your religious{br}
devotion, but I'm the knight{br}
in charge of your safety.{br}
And we need to get to{br}
Dorter before nightfall.{end}
//Message x05
{font:08}Priest{font:00}{br}
Princess Ovelia, please.{br}
{br}
You... you don't want to{br}
give Agrias any trouble,{br}
do you? It's n{D11D}not wise.{end}


Hit Compile Event, go back to psxfin and load the savestate.


So that was just their dialogue added in. If you know the opening of FFT, though, you'll probably have noticed that the characters aren't very animated during this little chat. We'll add in some commands to make that happen. You can delete the earlier set of message commands and replace them with this.


//Agrias says it's time to go.
DisplayMessage(x10,x12,x0002,x34,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

//A brief pause, then Ovelia looks up.
Wait(00030)
UnitAnim(x0C,x00,x025A,x00)
Wait(00030)

//Ovelia tells Agrias "just a minute", then looks down again.
DisplayMessage(x10,x11,x0003,x0C,x00,x00,+00000,+00000,+00008,x02)
WaitForInstruction(x01,x00)
Wait(00050)
UnitAnim(x0C,x00,x0259,x00)
Wait(00050)

//Agrias walks up behind Ovelia's shoulder and reminds her who's in charge.
WalkTo(x34,x00,007,003,x00,x00,+008,x01)
WalkToAnim(x34,x00,x0002)
WaitWalk(x34,x00)
RotateUnit(x34,x00,x0A,x00,x00,x00)
WaitRotateAll()
DisplayMessage(x10,x12,x0004,x34,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

//Simon timidly steps forward and warns Ovelia not to ignore Agrias.
WalkTo(x13,x00,006,005,x00,x00,+006,x01)
WalkToAnim(x13,x00,x0002)
WaitWalk(x13,x00)
DisplayMessage(x10,x12,x0005,x13,x00,x00,+00000,+00000,-00008,x02)
WaitForInstruction(x01,x00)

So now your EVSP should look like this:

//Offset(x00002000)

Pause()

LoadConditionals(x0000)
Camera(+00840,-00220,+00504,+00302,+03584,+00000,+04096,+00000)

UnitAnim(x00,x00,x0002,x00)
LoadEVTCHR(x01,x00,x00)
WaitForInstruction(x34,x00)
SaveEVTCHR(x01)
UnitAnim(x0C,x00,x0259,x00)

Reveal(030)
Wait(00030)

//Agrias says it's time to go.
DisplayMessage(x10,x12,x0002,x34,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

//A brief pause, then Ovelia looks up.
Wait(00030)
UnitAnim(x0C,x00,x025A,x00)
Wait(00030)

//Ovelia tells Agrias "just a minute", then looks down again.
DisplayMessage(x10,x11,x0003,x0C,x00,x00,+00000,+00000,+00008,x02)
WaitForInstruction(x01,x00)
Wait(00050)
UnitAnim(x0C,x00,x0259,x00)
Wait(00050)

//Agrias walks up behind Ovelia's shoulder and reminds her who's in charge.
WalkTo(x34,x00,007,003,x00,x00,+008,x01)
WalkToAnim(x34,x00,x0002)
WaitWalk(x34,x00)
RotateUnit(x34,x00,x0A,x00,x00,x00)
WaitRotateAll()
DisplayMessage(x10,x12,x0004,x34,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

//Simon timidly steps forward and warns Ovelia not to ignore Agrias.
WalkTo(x13,x00,006,005,x00,x00,+006,x01)
WalkToAnim(x13,x00,x0002)
WaitWalk(x13,x00)
DisplayMessage(x10,x12,x0005,x13,x00,x00,+00000,+00000,-00008,x02)
WaitForInstruction(x01,x00)


Pause()
EventEnd()


//INSTRUCTION SECTION END -  TEXT START
//Message x01
Ignore this message for now.{br}
We're not including Ovelia's prayer yet.{end}
//Message x02
{font:08}Female Knight{font:00}{br}
Don't worry about that, Ovelia.{br}
Let's get going.{end}
//Message x03
{font:08}Ovelia{font:00}{br}
Just a moment, Agrias...{end}
//Message x04
{font:08}Agrias{font:00}{br}
That's {font:08}Dame{font:00} Agrias, Princess.{br}
{br}
I appreciate your religious{br}
devotion, but I'm the knight{br}
in charge of your safety.{br}
And we need to get to{br}
Dorter before nightfall.{end}
//Message x05
{font:08}Priest{font:00}{br}
Princess Ovelia, please.{br}
{br}
You... you don't want to{br}
give Agrias any trouble,{br}
do you? It's n{D11D}not wise.{end}

Compile the event.


Now we need to get the rest of the units for this scene added in. The ENTD in the Patcher only has Agrias, Simon, and Ovelia present by default. Normally, this scene also requires Ramza, Gafgarion, Rad, and the wounded female Knight. But for the sake of this Agrias Motherfucking Oaks video, we'll also add in Lezales, the enemy male Knight.

None of these units are placed where they should be in the ENTD, but the WarpUnit command can put them where they're needed.

Units can only be added one at a time. However, if we put the AddUnit commands within an AddUnitStart/AddUnitEnd block, and set them not to be drawn immediately, the game will quietly add them in, one by one, while other commands happen. They'll remain invisible until the Draw command is used on them, but their spritesheets and battle stats ARE fully loaded in. This is often very useful, since AddUnit takes some time, but Draw is instantaneous. You might notice some events avoid Adding units in early, though, due to issues like the sprite limit.

Put these commands after the Camera instruction:

WarpUnit(x02,x00,002,003,x00,x03)
WarpUnit(x17,x00,003,004,x00,x03)
WarpUnit(x83,x00,002,005,x00,x03)
WarpUnit(x84,x00,001,004,x00,x03)
WarpUnit(x81,x00,001,004,x00,x03)

AddUnitStart()
AddUnit(x02,x00,x01)
AddUnit(x17,x00,x01)
AddUnit(x83,x00,x01)
AddUnit(x84,x00,x01)
AddUnit(x81,x00,x01)
AddUnitEnd()

And add this command before the Pause:

WaitAddUnitEnd()
If, for any reason, all the units haven't finished being added in yet, that WaitAddUnitEnd will make the event wait until they are.

Now, let's add in the sound of the door being thrown open, the camera turning to face the door, and making Ramza, Gafgarion, and Rad appear.

SoundEffect(x0048)
Camera(+00616,-00220,+00504,+00302,+04432,+00000,+04096,+00064)
Draw(x02,x00)
Draw(x17,x00)
Draw(x83,x00)
//Wait for the camera to finish turning before continuing with the event.
WaitForInstruction(x04,x00)

//Offset(x00002000)

Pause()



LoadConditionals(x0000)
Camera(+00840,-00220,+00504,+00302,+03584,+00000,+04096,+00000)

WarpUnit(x02,x00,002,003,x00,x03)
WarpUnit(x17,x00,003,004,x00,x03)
WarpUnit(x83,x00,002,005,x00,x03)
WarpUnit(x84,x00,001,004,x00,x03)
WarpUnit(x81,x00,001,004,x00,x03)

AddUnitStart()
AddUnit(x02,x00,x01)
AddUnit(x17,x00,x01)
AddUnit(x83,x00,x01)
AddUnit(x84,x00,x01)
AddUnit(x81,x00,x01)
AddUnitEnd()

UnitAnim(x00,x00,x0002,x00)
LoadEVTCHR(x01,x00,x00)
WaitForInstruction(x34,x00)
SaveEVTCHR(x01)
UnitAnim(x0C,x00,x0259,x00)

Reveal(030)
Wait(00030)

//Agrias says it's time to go.
DisplayMessage(x10,x12,x0002,x34,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

//A brief pause, then Ovelia looks up.
Wait(00030)
UnitAnim(x0C,x00,x025A,x00)
Wait(00030)

//Ovelia tells Agrias "just a minute", then looks down again.
DisplayMessage(x10,x11,x0003,x0C,x00,x00,+00000,+00000,+00008,x02)
WaitForInstruction(x01,x00)
Wait(00050)
UnitAnim(x0C,x00,x0259,x00)
Wait(00050)

//Agrias walks up behind Ovelia's shoulder and reminds her who's in charge.
WalkTo(x34,x00,007,003,x00,x00,+008,x01)
WalkToAnim(x34,x00,x0002)
WaitWalk(x34,x00)
RotateUnit(x34,x00,x0A,x00,x00,x00)
WaitRotateAll()
DisplayMessage(x10,x12,x0004,x34,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

//Simon timidly steps forward and warns Ovelia not to ignore Agrias.
WalkTo(x13,x00,006,005,x00,x00,+006,x01)
WalkToAnim(x13,x00,x0002)
WaitWalk(x13,x00)
DisplayMessage(x10,x12,x0005,x13,x00,x00,+00000,+00000,-00008,x02)
WaitForInstruction(x01,x00)

WaitAddUnitEnd()

SoundEffect(x0048)
Draw(x02,x00)
Draw(x17,x00)
Draw(x83,x00)
Camera(+00616,-00220,+00504,+00302,+04432,+00000,+04096,+00064)
//Wait for the camera to finish turning before continuing with the event.
WaitForInstruction(x04,x00)

Pause()
EventEnd()


//INSTRUCTION SECTION END -  TEXT START
//Message x01
Ignore this message for now.{br}
We're not including Ovelia's prayer yet.{end}
//Message x02
{font:08}Female Knight{font:00}{br}
Don't worry about that, Ovelia.{br}
Let's get going.{end}
//Message x03
{font:08}Ovelia{font:00}{br}
Just a moment, Agrias...{end}
//Message x04
{font:08}Agrias{font:00}{br}
That's {font:08}Dame{font:00} Agrias, Princess.{br}
{br}
I appreciate your religious{br}
devotion, but I'm the knight{br}
in charge of your safety.{br}
And we need to get to{br}
Dorter before nightfall.{end}
//Message x05
{font:08}Priest{font:00}{br}
Princess Ovelia, please.{br}
{br}
You... you don't want to{br}
give Agrias any trouble,{br}
do you? It's n{D11D}not wise.{end}


So there's a few issues to notice. One is that you can very clearly see the three just pop onto the screen. The second is that these three units are still doing the marching animation, because they weren't Added in until after the UnitAnim that made all units stand still. The third is that Ovelia ends up facing directly away from the screen rather than staying in her prayer animation (because EVTCHRs hate camera rotation).

So, we'll make use of SpriteMove here. SpriteMoves are different from WalkTos in that they don't automatically change to a walking or running animation, only move the unit's sprite, not the unit itself, and they aren't affected by the map's terrain. So using WalkTo to move up a hill will let the unit automatically climb the hill to get to the correct X/Y, whereas SpriteMove will just slide the sprite to wherever those coordinates are relative to the unit's current position. Similarly, WalkTo won't let a unit walk through a wall, but SpriteMove will - and that's what we want here, for these units to have walked in through a wall.

We'll start by SpriteMoving all three of them into the doorway once the WaitAddUnitEnd is over. Each tile moved is worth a value of 28. Gafgarion (unit ID x17) needs to move 3 tiles west. Ramza (unit ID x02) needs to move 2 tiles west and 1 tile north. Rad (unit ID x83) needs to move 2 tiles west and 1 tile north.

SpriteMove(x17,x00,-00084,+00000,-00000,x00,x01,+00000)
SpriteMove(x02,x00,-00056,+00000,+00028,x00,x01,+00000)
SpriteMove(x83,x00,-00056,-00000,-00028,x00,x01,+00000)

After that, we need to get them to move in place. This is a bit trickier, because we also have to make them stop the marching animation once they do, but unlike WalkTo, there is no command to automatically set them to a specific animation once they stop moving. We can use WaitSpriteMove to make the rest of the event wait until after they finish moving, but there will be three of them moving at once, and at different times to make it seem like they didn't all phase through each other to enter the door at the same time.

So we'll also use Blocks. Most commands work in Blocks, and Blocks allow the commands within to run independently of the rest of the event. Since Gafgarion is the first one to talk after the three of them enter the room, we'll have Ramza and Rad's movement in Blocks, while Gafgarion's movement is the one the rest of the event waits on.

We'll also have Simon turn around to face the three shortly after he hears the sound. There's a built-in Delay feature in RotateUnit, so we'll just use it to save us a Wait command and avoid the need to put it in a Block as a result.

And finally, Ovelia will be given more EVTCHR animations (in a Block) to switch her to a front-facing prayer animation as the camera goes around to the other side of her.

So, after the second Camera command:

//Ovelia stays in a prayer animation.
BlockStart()
Wait(00020)
UnitAnim(x0C,x00,x025D,x00)
Wait(00014)
UnitAnim(x0C,x00,x025E,x00)
BlockEnd()

//Simon turns around after a moment.
RotateUnit(x13,x00,x04,x00,x00,x34)

//Ramza walks in.
BlockStart()
Wait(00030)
SpriteMove(x02,x00,+00000,+00000,+00000,x00,x01,+00080)
WaitSpriteMove(x02,x00)
UnitAnim(x02,x00,x0002,x00)
BlockEnd()

//Rad walks in.
BlockStart()
Wait(00050)
SpriteMove(x83,x00,+00000,+00000,+00000,x00,x01,+00080)
WaitSpriteMove(x83,x00)
UnitAnim(x83,x00,x0002,x00)
BlockEnd()

//Gafgarion walks in. We'll actually have him walk a bit further in than his real unit position, so he can step back a moment later.
SpriteMove(x17,x00,+00028,+00000,+00000,x00,x01,+00100)
WaitSpriteMove(x17,x00)
UnitAnim(x17,x00,x0002,x00)

//Wait for the camera to finish turning before continuing with the event.
WaitForInstruction(x04,x00)

Now, let's add in some dialogue.

//Message x06
{font:08}Black Knight{font:00}{br}
Okay, seriously, this is{br}
getting ridiculous.{br}
We've been waiting in the{br}
rain for an hour, now.{br}
{br}
Who's supposed to be in{br}
charge here, exactly?{br}
{br}
Because I've got half a{br}
mind to just take our pay{br}
and head out instead.{end}

//Message x07
{font:08}Agrias{font:00}{br}
I'm the one in charge. Care{br}
to repeat that, Gafgarion?{end}

//Message x08
{font:08}Gafgarion{font:00}{br}
(Oh, God, it's Agrias{br}
Motherfucking Oaks...!){br}
*cough* Erm, t{D11D}-that is,{br}
I just wished to express my{br}
concern over this delay.{br}
We were... we were worried{br}
something might be amiss.{end}

//Message x09
{font:08}Agrias{font:00}{br}
Yeah, I'm sure you were.{br}
{br}
I'm no more pleased with this{br}
delay than you, but don't you{br}
forget where you stand.{br}
You're a gang of sellswords,{br}
not royal knights. You're lucky{br}
to have this job at all.{br}
Run your mouth again, and{br}
I'll rip your tongue right{br}
out of it. Are we clear?{end}

//Message x0A
{font:08}Ovelia{font:00}{br}
Please, there's no{br}
need to fight.{br}
I'm finished.{br}
Sorry for the delay.{end}

//Message x0B
{font:08}Priest{font:00}{br}
Go with God.{end}

//Message x0C
{font:08}Ovelia{font:00}{br}
You, too, Simon.{end}

And now that we've added in some dialogue, we need to add in the commands for that dialogue as well.

//Gafgarion protests the wait. Since he's SpriteMoved a bit out of place, we'll move the DisplayMessage a bit to match.
DisplayMessage(x10,x11,x0006,x17,x00,x00,+00028,+00005,+00000,x02)
WaitForInstruction(x01,x00)

//Agrias slowly turns around.
RotateUnit(x34,x00,x04,x00,x34,x00)
WaitRotateAll()
Wait(00020)

//Gafgarion sees the look in her eyes, and steps back a tile.
BlockStart()
UnitAnim(x17,x00,x0003,x00)
SpriteMove(x17,x00,+00000,+00000,+00000,x00,x01,+00080)
WaitSpriteMove(x17,x00)
UnitAnim(x17,x00,x0002,x00)
BlockEnd()

//Agrias walks close to him, and lets him know who's in charge.
WalkTo(x34,x00,005,003,x00,x00,+008,x00)
WalkToAnim(x34,x00,x0002)
WaitWalk(x34,x00)
DisplayMessage(x10,x12,x0007,x34,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)

//Gafgarion bows his head respectfully and backpedals. This is also an EVTCHR animation, but it's on the same sheet as Ovelia's, so it's just a matter of using a UnitAnim command, there's no need to load another one.
UnitAnim(x17,x00,x025F,x00)
DisplayMessage(x10,x11,x0008,x17,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)

//Agrias puts him firmly in his place.
DisplayMessage(x10,x12,x0009,x34,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)

//Ovelia finishes her prayer and interrupts before blood is split. Note that other characters react to her talking after the DisplayMessage but before the WaitForInstruction.
UnitAnim(x0C,x00,x0265,x00)
Wait(00003)
UnitAnim(x0C,x00,x0002,x00)
Wait(00015)
DisplayMessage(x10,x11,x000A,x0C,x00,x00,+00000,+00000,+00000,x03)
Wait(00020)
UnitAnim(x17,x00,x0260,x00)
RotateUnit(x34,x00,x0A,x00,x34,x20)
RotateUnit(x13,x00,x0E,x00,x34,x50)
WaitForInstruction(x01,x00)
WaitRotateAll()

//Gafgarion looks like he's standing still right now, but it's often a good idea to manually set a unit to UnitAnim x0002 if they had just used a different animation. Otherwise fun stuff can happen after commands like a camera or sprite movement.
UnitAnim(x17,x00,x0002,x00)


//The camera rotates a bit as it does in vanilla.
Camera(+00616,-00220,+00616,+00302,+04608,+00000,+04096,+00060)
WaitForInstruction(x04,x00)

//Ovelia turns around and walks over to Simon.
RotateUnit(x0C,x00,x04,x02,x00,x00)
WaitRotateAll()
WalkTo(x0C,x00,006,004,x00,x00,+004,x00)
WalkToAnim(x0C,x00,x0002)
RotateUnit(x13,x00,x00,x00,x34,xFC)
WaitWalk(x0C,x00)
RotateUnit(x0C,x00,x08,x01,x00,x10)
Wait(00030)

//Here's a different way to do DisplayMessage. When you want multiple messages to close at the same time, you can change the message type from x1X to x9X. They then won't close until you use a ChangeDialog command.
DisplayMessage(x10,x91,x000B,x13,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)
DisplayMessage(x10,x92,x000C,x0C,x00,x00,+00000,+00000,+00001,x03)
WaitForInstruction(x01,x00)
ChangeDialog(x01,xFFFF,x00,x00)
ChangeDialog(x02,xFFFF,x00,x00)


And here's how the instructions should look now:
//Offset(x00002000)

Pause()



LoadConditionals(x0000)
Camera(+00840,-00220,+00504,+00302,+03584,+00000,+04096,+00000)

WarpUnit(x02,x00,002,003,x00,x03)
WarpUnit(x17,x00,003,004,x00,x03)
WarpUnit(x83,x00,002,005,x00,x03)
WarpUnit(x84,x00,001,004,x00,x03)
WarpUnit(x81,x00,001,004,x00,x03)

AddUnitStart()
AddUnit(x02,x00,x01)
AddUnit(x17,x00,x01)
AddUnit(x83,x00,x01)
AddUnit(x84,x00,x01)
AddUnit(x81,x00,x01)
AddUnitEnd()

UnitAnim(x00,x00,x0002,x00)
LoadEVTCHR(x01,x00,x00)
WaitForInstruction(x34,x00)
SaveEVTCHR(x01)
UnitAnim(x0C,x00,x0259,x00)

Reveal(030)
Wait(00030)

//Agrias says it's time to go.
DisplayMessage(x10,x12,x0002,x34,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

//A brief pause, then Ovelia looks up.
Wait(00030)
UnitAnim(x0C,x00,x025A,x00)
Wait(00030)

//Ovelia tells Agrias "just a minute", then looks down again.
DisplayMessage(x10,x11,x0003,x0C,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)
Wait(00050)
UnitAnim(x0C,x00,x0259,x00)
Wait(00050)

//Agrias walks up behind Ovelia's shoulder and reminds her who's in charge.
WalkTo(x34,x00,007,003,x00,x00,+008,x01)
WalkToAnim(x34,x00,x0002)
WaitWalk(x34,x00)
RotateUnit(x34,x00,x0A,x00,x00,x00)
WaitRotateAll()
DisplayMessage(x10,x12,x0004,x34,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

//Simon timidly steps forward and warns Ovelia not to ignore Agrias.
WalkTo(x13,x00,006,005,x00,x00,+006,x01)
WalkToAnim(x13,x00,x0002)
WaitWalk(x13,x00)
DisplayMessage(x10,x12,x0005,x13,x00,x00,+00000,+00000,-00000,x02)
WaitForInstruction(x01,x00)

WaitAddUnitEnd()

SpriteMove(x17,x00,-00084,+00000,-00000,x00,x01,+00000)
SpriteMove(x02,x00,-00056,+00000,+00028,x00,x01,+00000)
SpriteMove(x83,x00,-00056,-00000,-00028,x00,x01,+00000)

SoundEffect(x0048)
Draw(x02,x00)
Draw(x17,x00)
Draw(x83,x00)
Camera(+00616,-00220,+00504,+00302,+04432,+00000,+04096,+00064)

//Ovelia stays in a prayer animation.
BlockStart()
Wait(00020)
UnitAnim(x0C,x00,x025D,x00)
Wait(00014)
UnitAnim(x0C,x00,x025E,x00)
BlockEnd()

//Simon turns around after a moment.
RotateUnit(x13,x00,x04,x00,x34,xB0)

//Ramza walks in.
BlockStart()
Wait(00030)
SpriteMove(x02,x00,+00000,+00000,+00000,x00,x01,+00080)
WaitSpriteMove(x02,x00)
UnitAnim(x02,x00,x0002,x00)
BlockEnd()

//Rad walks in.
BlockStart()
Wait(00050)
SpriteMove(x83,x00,+00000,+00000,+00000,x00,x01,+00080)
WaitSpriteMove(x83,x00)
UnitAnim(x83,x00,x0002,x00)
BlockEnd()

//Gafgarion walks in. We'll actually have him walk a bit further in than his real unit position, so he can step back a moment later.
SpriteMove(x17,x00,+00028,+00000,+00000,x00,x01,+00130)
WaitSpriteMove(x17,x00)
UnitAnim(x17,x00,x0002,x00)

//Wait for the camera to finish turning before continuing with the event.
WaitForInstruction(x04,x00)

//Gafgarion protests the wait. Since he's SpriteMoved a bit out of place, we'll move the DisplayMessage a bit to match.
DisplayMessage(x10,x11,x0006,x17,x00,x00,+00028,+00005,+00000,x02)
WaitForInstruction(x01,x00)

//Agrias slowly turns around.
RotateUnit(x34,x00,x04,x00,x34,x00)
WaitRotateAll()
Wait(00020)

//Gafgarion sees the look in her eyes, and steps back a tile.
BlockStart()
UnitAnim(x17,x00,x0003,x00)
SpriteMove(x17,x00,+00000,+00000,+00000,x00,x01,+00080)
WaitSpriteMove(x17,x00)
UnitAnim(x17,x00,x0002,x00)
BlockEnd()

//Agrias walks close to him, and lets him know who's in charge.
WalkTo(x34,x00,005,003,x00,x00,+008,x00)
WalkToAnim(x34,x00,x0002)
WaitWalk(x34,x00)
DisplayMessage(x10,x12,x0007,x34,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)

//Gafgarion bows his head respectfully and backpedals. This is also an EVTCHR animation, but it's on the same sheet as Ovelia's, so it's just a matter of using a UnitAnim command, there's no need to load another one.
UnitAnim(x17,x00,x025F,x00)
DisplayMessage(x10,x11,x0008,x17,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)

//Agrias puts him firmly in his place.
DisplayMessage(x10,x12,x0009,x34,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)

//Ovelia finishes her prayer and interrupts before blood is split. Note that other characters react to her talking after the DisplayMessage but before the WaitForInstruction.
UnitAnim(x0C,x00,x0265,x00)
Wait(00003)
UnitAnim(x0C,x00,x0002,x00)
Wait(00015)
DisplayMessage(x10,x11,x000A,x0C,x00,x00,+00000,+00000,+00000,x03)
Wait(00020)
UnitAnim(x17,x00,x0260,x00)
RotateUnit(x34,x00,x0A,x00,x34,x20)
RotateUnit(x13,x00,x0E,x00,x34,x50)
WaitForInstruction(x01,x00)
WaitRotateAll()

//Gafgarion looks like he's standing still right now, but it's often a good idea to manually set a unit to UnitAnim x0002 if they had just used a different animation. Otherwise fun stuff can happen after commands like a camera or sprite movement.
UnitAnim(x17,x00,x0002,x00)


//The camera rotates a bit as it does in vanilla.
Camera(+00616,-00220,+00616,+00302,+04608,+00000,+04096,+00060)
WaitForInstruction(x04,x00)

//Ovelia turns around and walks over to Simon.
RotateUnit(x0C,x00,x04,x02,x00,x00)
WaitRotateAll()
WalkTo(x0C,x00,006,004,x00,x00,+004,x00)
WalkToAnim(x0C,x00,x0002)
RotateUnit(x13,x00,x00,x00,x34,xFC)
WaitWalk(x0C,x00)
RotateUnit(x0C,x00,x08,x01,x00,x10)
Wait(00030)

//Here's a different way to do DisplayMessage. When you want multiple messages to close at the same time, you can change the message type from x1X to x9X. They then won't close until you use a ChangeDialog command.
DisplayMessage(x10,x91,x000B,x13,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)
DisplayMessage(x10,x92,x000C,x0C,x00,x00,+00000,+00000,+00001,x03)
WaitForInstruction(x01,x00)
ChangeDialog(x01,xFFFF,x00,x00)
ChangeDialog(x02,xFFFF,x00,x00)

Pause()
EventEnd()


//INSTRUCTION SECTION END -  TEXT START
//Message x01
Ignore this message for now.{br}
We're not including Ovelia's prayer yet.{end}

//Message x02
{font:08}Female Knight{font:00}{br}
Don't worry about that, Ovelia.{br}
Let's get going.{end}

//Message x03
{font:08}Ovelia{font:00}{br}
Just a moment, Agrias...{end}

//Message x04
{font:08}Agrias{font:00}{br}
That's {font:08}Dame{font:00} Agrias, Princess.{br}
{br}
I appreciate your religious{br}
devotion, but I'm the knight{br}
in charge of your safety.{br}
And we need to get to{br}
Dorter before nightfall.{end}

//Message x05
{font:08}Priest{font:00}{br}
Princess Ovelia, please.{br}
{br}
You... you don't want to{br}
give Agrias any trouble,{br}
do you? It's n{D11D}not wise.{end}

//Message x06
{font:08}Black Knight{font:00}{br}
Okay, seriously, this is{br}
getting ridiculous.{br}
We've been waiting in the{br}
rain for an hour, now.{br}
{br}
Who's supposed to be in{br}
charge here, exactly?{br}
{br}
Because I've got half a{br}
mind to just take our pay{br}
and head out instead.{end}

//Message x07
{font:08}Agrias{font:00}{br}
I'm the one in charge. Care{br}
to repeat that, Gafgarion?{end}

//Message x08
{font:08}Gafgarion{font:00}{br}
(Oh, God, it's Agrias{br}
Motherfucking Oaks...!){br}
*cough* Erm, t{D11D}-that is,{br}
I just wished to express my{br}
concern over this delay.{br}
We were... we were worried{br}
something might be amiss.{end}

//Message x09
{font:08}Agrias{font:00}{br}
Yeah, I'm sure you were.{br}
{br}
I'm no more pleased with this{br}
delay than you, but don't you{br}
forget where you stand.{br}
You're a gang of sellswords,{br}
not royal knights. You're lucky{br}
to have this job at all.{br}
Run your mouth again, and{br}
I'll rip your tongue right{br}
out of it. Are we clear?{end}

//Message x0A
{font:08}Ovelia{font:00}{br}
Please, there's no{br}
need to fight.{br}
I'm finished.{br}
Sorry for the delay.{end}

//Message x0B
{font:08}Priest{font:00}{br}
Go with God.{end}

//Message x0C
{font:08}Ovelia{font:00}{br}
You, too, Simon.{end}


Now we add the part where the female knight comes in, wounded, and Simon runs over to tend to her.

At this point, it might be a good idea to set your Save State 1 to the point when Ovelia and Simon's farewell Messages are up on screen, to avoid replaying the entire rest of the event with every new savestate edit. You can simply Load State 2 and Save State 1 later when you want to go back to applying your edits to the start of the event.

//Thumps are heard at the door.
Wait(00040)
SoundEffect(x0048)
Wait(00010)
SoundEffect(x0048)

//Open the door with UseFieldObject.
UseFieldObject(x01,x00)

//When a unit comes in from off screen, color them in shadows for the transition.
ColorUnit(x84,x00,x01,+000,+000,+000,000)

//Move her sprite back a bit and set her limping animation.
SpriteMove(x84,x00,-00030,+00000,+00000,x00,x01,+00000)
UnitAnim(x84,x00,x026A,x00)

//Draw her, slowly return her color to normal, and have her limp inside. We'll use multiple SpriteMoves for this so she moves irregularly, as you'd expect someone as badly wounded as her to do.
BlockStart()
Wait(00020)
Draw(x84,x00)
ColorUnit(x84,x00,x08,+000,+000,+000,004)
SpriteMove(x84,x00,+00000,+00000,+00000,x02,x0E,+00046)
WaitSpriteMove(x84,x00)
SpriteMove(x84,x00,+00024,+00000,+00000,x02,x0E,+00062)
WaitSpriteMove(x84,x00)
SpriteMove(x84,x00,+00032,+00000,+00000,x01,x0C,+00026)
WaitSpriteMove(x84,x00)
UnitAnim(x84,x00,x0021,x00)
Wait(00006)
SoundEffect(x0028)
UnitAnim(x84,x00,x0024,x00)
BlockEnd()

//The camera pans over to her. Everyone else moves out of her way as she stumbles inside.
Camera(+00440,-00204,+00600,+00302,+04608,+00000,+04096,+00064)
UnitAnim(x17,x00,x0002,x00)
RotateUnit(x17,x00,x00,x01,x00,x00)
SpriteMove(x17,x00,-00014,+00000,+00034,x00,x01,+00040)
Wait(00010)
FadeSound(x00,030)
FaceUnit(x84,x00,x0C,x00,x00,x00,x00)
RotateUnit(x13,x00,x04,x01,x01,x00)
UnitAnim(x83,x00,x0002,x00)
RotateUnit(x83,x00,x00,x01,x00,x00)
SpriteMove(x83,x00,-00014,+00000,+00022,x00,x01,+00032)
Wait(00010)
UnitAnimRotate(x02,x00,x06,x0002,x00)
UnitAnim(x02,x00,x0002,x00)
SpriteMove(x02,x00,+00000,+00000,-00016,x00,x01,+00040)
RotateUnit(x34,x00,x04,x00,x01,x00)
Wait(00035)
UnitAnim(x13,x00,x0003,x00)
SpriteMove(x13,x00,-00092,-00001,-00021,x02,x0C,+00100)
Wait(00040)
RotateUnit(x02,x00,x08,x00,x01,x00)
WaitSpriteMove(x13,x00)
UnitAnim(x13,x00,x0267,x00)
SoundEffect(x0041)
Wait(00030)
SwitchTrack(x01,+096,000)
Wait(00030)



With that done, let's add some more dialogue.

//Message x0D
{font:08}Knight{font:00}{br}
Dame Agrias...!{br}
The enemy...!{end}

//Message x0E
{font:08}The Enemy{font:00}{br}
For Duke Goltana!!{end}

//Message x0F
{font:08}Gafgarion{font:00}{br}
Where the hell did{br}
they come from?{br}
Over an hour of nothing{br}
but as soon as we walk in,{br}
something happens?{br}
Well, whatever.{br}
Shall we go earn{br}
our pay, boys?{end}

//Message x10
{font:08}{Ramza}{font:00}{br}
Sure. That is how being a{br}
mercenary works, isn't it?{end}

//Message x11
{font:08}Gafgarion{font:00}{br}
You're goddamn right.{br}
This is the way! Geronimo!!{end}

//Message x12
{font:08}Ovelia{font:00}{br}
Oh, God...{br}
Be safe, all of you...!{end}

And then all the commands for the rest of the event. By now, I hope you're passably familiar with enough of the commands to generally follow along with what I'm doing here. I won't bore you with the finer points of constantly reloading save states with minor tweaks until everything SpriteMoves and animates with the correct timing, but it can take a while to properly set up something the part where Agrias's attack knocks the enemy over the railing.

//The knight warns Agrias that "the enemy" has appeared.
DisplayMessage(x10,x11,x000D,x84,x00,x00,-00011,+00014,+00032,x12)
WaitForInstruction(x01,x00)

//The Enemy walks in the chapel after her. We'll set him up much like we did with her - he'll be spritemoved some space back, and covered in shadows.
SpriteMove(x81,x00,-00026,-00000,-00010,x00,x01,+00000)
ColorUnit(x81,x00,x01,+000,+000,+000,000)

Draw(x81,x00)
SpriteMove(x81,x00,+00000,+00000,-00016,x00,x01,+00022)
ColorUnit(x81,x00,x08,+000,+000,+000,004)
WaitSpriteMove(x81,x00)
UnitAnim(x81,x00,x0002,x00)

//Ramza, Rad, and Gafgarion will turn to face him. This time we'll use FaceUnit so we can mostly just copy and paste the commands each time, but with different Unit IDs and delays.
FaceUnit(x81,x00,x02,x00,x00,x00,x00)
FaceUnit(x81,x00,x17,x00,x00,x00,x20)
FaceUnit(x81,x00,x83,x00,x00,x00,x40)

//The Enemy screams "For Goltana!"
DisplayMessage(x10,x12,x000E,x81,x00,x00,-00000,+00010,+00005,x12)
WaitForInstruction(x01,x00)

//Use the TempWeapon command to give both Agrias and The Enemy swords. This is because they aren't given fixed weapons in this event's ENTD, so they could be holding axes or daggers or whatever.
TempWeapon(x34,x00,x16)
TempWeapon(x81,x00,x14)


//The Enemy rushes at Agrias. This will mostly just be a WalkTo, but we'll throw in a simultaneous SpriteMove, because otherwise Simon and the Knight would be in the way. We could just make him walk one tile further down, but since he's rushing an enemy, it would make more sense for him to run in a straight line at her than to walk one panel down, make a right angle turn, and resume walking.
WalkTo(x81,x00,004,004,x00,x00,+024,x00)
SpriteMove(x81,x00,+00000,+00000,-00028,x00,x01,+00012)

//Agrias sees him coming for her and crouches defensively.
Wait(00010)
UnitAnim(x34,x00,x0022,x00)

//Ovelia, Ramza, Rad, and Gafgarion turn to face Agrias now.
FaceUnit(x34,x00,x0C,x00,x00,x01,x30)
FaceUnit(x34,x00,x02,x00,x00,x01,x00)
FaceUnit(x34,x00,x17,x00,x00,x01,x10)
FaceUnit(x34,x00,x83,x00,x00,x01,x20)

//The enemy knight tries to attack her.
WaitWalk(x81,x00)
UnitAnim(x81,x00,x0041,x00)

//Agrias jumps to the right.
UnitAnim(x34,x00,x0069,x00)
SpriteMove(x34,x00,-00008,-00006,+00014,x00,x01,+00008)
WaitSpriteMove(x34,x00)
SpriteMove(x34,x00,-00016,+00000,+00028,x00,x01,+00008)
WaitSpriteMove(x34,x00)
Wait(00005)
UnitAnim(x34,x00,x0002,x00)
RotateUnit(x34,x00,x00,x00,x01,x00)
SpriteMove(x34,x00,-00020,+00000,+00028,x00,x01,+00004)
WaitRotateAll()

//Remove the enemy knight's shadow or else it looks weird when he goes over the railing.
UnitShadow(x81,x00,x01)

//Also, yeah, throw that motherfucker over the railing.
UnitAnim(x81,x00,x0002,x00)
Wait(00001)
UnitAnim(x34,x00,x0041,x00)
SpriteMove(x34,x00,-00020,+00000,+00014,x00,x01,+00012)
Wait(00016)
SoundEffect(x0072)
UnitAnimRotate(x81,x00,x00,x0019,x00)
SpriteMove(x81,x00,+00004,-00020,-00060,x00,x01,+00010)
Wait(00010)
SpriteMove(x81,x00,+00006,-00012,-00076,x00,x01,+00006)
Wait(00006)

//Start a block, because Agrias is going to be running even before he lands.
BlockStart()
SpriteMove(x81,x00,+00008,+00065,-00085,x00,x01,+00010)
Wait(00003)
UnitAnim(x81,x00,x0034,x00)
Wait(00007)
SoundEffect(x0015)
BlockEnd()

//Agrias puts her sword away and turns to the door.
UnitAnim(x34,x00,x0002,x00)
RotateUnit(x34,x00,x04,x00,x00,x10)
WaitRotateUnit(x34,x00)

//The other four turn towards the door, but with a delay, so it comes across as if they're just watching Agrias go. This time, we'll use FaceTile.
FaceTile(x02,x00,000,004,x00,x00,x00,x40)
FaceTile(x0C,x00,000,004,x00,x00,x00,x20)
FaceTile(x17,x00,000,004,x00,x00,x00,x40)
FaceTile(x83,x00,000,004,x00,x00,x00,x50)

//Agrias runs out the door. As she runs, pan the camera a little more.
Camera(+00240,-00204,+00600,+00302,+04608,+00000,+04096,+00064)
WalkTo(x34,x00,001,003,x00,x00,+020,x00)
SpriteMove(x34,x00,-00030,+00000,+00008,x00,x03,+00016)
WaitSpriteMove(x34,x00)
SpriteMove(x34,x00,-00040,+00000,+00014,x00,x01,+00016)
Wait(00016)
ColorUnit(x34,x00,x01,+000,+000,+000,002)
WaitSpriteMove(x34,x00)
WaitWalk(x34,x00)
Erase(x34,x00)

Wait(00040)
WaitForInstruction(x04,x00)

//Gafgarion wonders where the hell these guys even came from. Ramza and Rad rotate to face him as he talks.
DisplayMessage(x10,x91,x000F,x17,x00,x00,+00012,-00010,+00000,x12)
RotateUnit(x02,x00,x08,x00,x00,x30)
RotateUnit(x83,x00,x0E,x00,x00,x40)
WaitForInstruction(x01,x00)

//Ramza confirms he's ready to go earn his pay. Gafgarion faces him as he talks.
DisplayMessage(x10,x92,x0010,x02,x00,x00,-00000,+00000,+00000,x12)
RotateUnit(x17,x00,x00,x00,x00,x30)
WaitForInstruction(x01,x00)

//Gafgarion yells Geronimo and charges out. Because this is a continuation of a DisplayMessage we set to manually close, this requires ChangeDialog rather than a new DisplayMessage.
ChangeDialog(x01,x0011,x00,x00)
RotateUnit(x17,x00,x04,x00,x00,x90)
WaitForInstruction(x01,x00)

//Now close both messages with the closing ChangeDialog.
ChangeDialog(x01,xFFFF,x00,x00)
ChangeDialog(x02,xFFFF,x00,x00)

WaitForInstruction(x01,x00)
WaitRotateAll()

//Set Gaf to the run animation and make him leave.
BlockStart()
UnitAnim(x17,x00,x0004,x00)
SpriteMove(x17,x00,-00098,+00000,-00000,x00,x01,+00040)
Wait(00030)
ColorUnit(x17,x00,x01,+000,+000,+000,002)
WaitSpriteMove(x17,x00)
Erase(x17,x00)
BlockEnd()

//Set Ramza to the run animation and make him leave.
BlockStart()
RotateUnit(x02,x00,x04,x00,x00,x20)
WaitRotateUnit(x02,x00)
UnitAnim(x02,x00,x0004,x00)
SpriteMove(x02,x00,-00056,+00000,+00010,x00,x01,+00030)
Wait(00020)
ColorUnit(x02,x00,x01,+000,+000,+000,002)
WaitSpriteMove(x02,x00)
Erase(x02,x00)
BlockEnd()

//Set Rad to the run animation and make him leave.
RotateUnit(x83,x00,x04,x00,x00,x50)
WaitRotateUnit(x83,x00)
UnitAnim(x83,x00,x0004,x00)
SpriteMove(x83,x00,-00040,-00000,-00035,x00,x01,+00028)
WaitSpriteMove(x83,x00)
SpriteMove(x83,x00,-00056,-00000,-00035,x00,x01,+00008)
ColorUnit(x83,x00,x01,+000,+000,+000,003)
WaitSpriteMove(x83,x00)
Erase(x83,x00)
Wait(00040)

//Ovelia goes "Oh, God..."
DisplayMessage(x10,x11,x0012,x0C,x00,x00,+00000,+00000,-00000,x00)
WaitForInstruction(x01,x00)

//Zoom the camera out. We'll add the CameraSpeedCurve command to make it have a smoother zoom.
CameraSpeedCurve(xAA)
Camera(+00680,-00204,+00600,+00430,+04656,+00000,+02656,+00133)

//Fade the screen.
ColorScreen(x02,000,000,000,200,200,200,+00140)
Wait(00140)

//Use PostEvent to set the event to play the Orbonne battle immediately after this event.
PostEvent(x81,x0002)

Continued below.
  • Modding version: PSX & WotL
  • Discord username: Nyzer

Nyzer

And with that, the parts we're editing for this tutorial are complete. In the Orbonne Motherfucking Monastery video, I ended up doing more - adding in many of the commands from the vanilla version of the event to make the intro start similarly to how it does in vanilla. But for the purposes of this tutorial, and the fact that I spent much of the day working on the tutorial, I won't be bothering to include that here. If you want, you can take your example event, compare it to my final product for the video, and see what was changed!

Note that in a final event product, you should remove the comment lines from the Offset command, as well as remove any Pause commands.

Anyway, here's the final version of the script for the walkthrough:

//Offset(x00002000)

Pause()



LoadConditionals(x0000)
Camera(+00840,-00220,+00504,+00302,+03584,+00000,+04096,+00000)

WarpUnit(x02,x00,002,003,x00,x03)
WarpUnit(x17,x00,003,004,x00,x03)
WarpUnit(x83,x00,002,005,x00,x03)
WarpUnit(x84,x00,001,004,x00,x03)
WarpUnit(x81,x00,001,004,x00,x03)

AddUnitStart()
AddUnit(x02,x00,x01)
AddUnit(x17,x00,x01)
AddUnit(x83,x00,x01)
AddUnit(x84,x00,x01)
AddUnit(x81,x00,x01)
AddUnitEnd()

UnitAnim(x00,x00,x0002,x00)
LoadEVTCHR(x01,x00,x00)
WaitForInstruction(x34,x00)
SaveEVTCHR(x01)
UnitAnim(x0C,x00,x0259,x00)

Reveal(030)
Wait(00030)

//Agrias says it's time to go.
DisplayMessage(x10,x12,x0002,x34,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

//A brief pause, then Ovelia looks up.
Wait(00030)
UnitAnim(x0C,x00,x025A,x00)
Wait(00030)

//Ovelia tells Agrias "just a minute", then looks down again.
DisplayMessage(x10,x11,x0003,x0C,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)
Wait(00050)
UnitAnim(x0C,x00,x0259,x00)
Wait(00050)

//Agrias walks up behind Ovelia's shoulder and reminds her who's in charge.
WalkTo(x34,x00,007,003,x00,x00,+008,x01)
WalkToAnim(x34,x00,x0002)
WaitWalk(x34,x00)
RotateUnit(x34,x00,x0A,x00,x00,x00)
WaitRotateAll()
DisplayMessage(x10,x12,x0004,x34,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

//Simon timidly steps forward and warns Ovelia not to ignore Agrias.
WalkTo(x13,x00,006,005,x00,x00,+006,x01)
WalkToAnim(x13,x00,x0002)
WaitWalk(x13,x00)
DisplayMessage(x10,x12,x0005,x13,x00,x00,+00000,+00000,-00000,x02)
WaitForInstruction(x01,x00)

WaitAddUnitEnd()

SpriteMove(x17,x00,-00084,+00000,-00000,x00,x01,+00000)
SpriteMove(x02,x00,-00056,+00000,+00028,x00,x01,+00000)
SpriteMove(x83,x00,-00056,-00000,-00028,x00,x01,+00000)

SoundEffect(x0048)
Draw(x02,x00)
Draw(x17,x00)
Draw(x83,x00)
Camera(+00616,-00220,+00504,+00302,+04432,+00000,+04096,+00064)

//Ovelia stays in a prayer animation.
BlockStart()
Wait(00020)
UnitAnim(x0C,x00,x025D,x00)
Wait(00014)
UnitAnim(x0C,x00,x025E,x00)
BlockEnd()

//Simon turns around after a moment.
RotateUnit(x13,x00,x04,x00,x34,xB0)

//Ramza walks in.
BlockStart()
Wait(00030)
SpriteMove(x02,x00,+00000,+00000,+00000,x00,x01,+00080)
WaitSpriteMove(x02,x00)
UnitAnim(x02,x00,x0002,x00)
BlockEnd()

//Rad walks in.
BlockStart()
Wait(00050)
SpriteMove(x83,x00,+00000,+00000,+00000,x00,x01,+00080)
WaitSpriteMove(x83,x00)
UnitAnim(x83,x00,x0002,x00)
BlockEnd()

//Gafgarion walks in. We'll actually have him walk a bit further in than his real unit position, so he can step back a moment later.
SpriteMove(x17,x00,+00028,+00000,+00000,x00,x01,+00130)
WaitSpriteMove(x17,x00)
UnitAnim(x17,x00,x0002,x00)

//Wait for the camera to finish turning before continuing with the event.
WaitForInstruction(x04,x00)

//Gafgarion protests the wait. Since he's SpriteMoved a bit out of place, we'll move the DisplayMessage a bit to match.
DisplayMessage(x10,x11,x0006,x17,x00,x00,+00028,+00005,+00000,x02)
WaitForInstruction(x01,x00)

//Agrias slowly turns around.
RotateUnit(x34,x00,x04,x00,x34,x00)
WaitRotateAll()
Wait(00020)

//Gafgarion sees the look in her eyes, and steps back a tile.
BlockStart()
UnitAnim(x17,x00,x0003,x00)
SpriteMove(x17,x00,+00000,+00000,+00000,x00,x01,+00080)
WaitSpriteMove(x17,x00)
UnitAnim(x17,x00,x0002,x00)
BlockEnd()

//Agrias walks close to him, and lets him know who's in charge.
WalkTo(x34,x00,005,003,x00,x00,+008,x00)
WalkToAnim(x34,x00,x0002)
WaitWalk(x34,x00)
DisplayMessage(x10,x12,x0007,x34,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)

//Gafgarion bows his head respectfully and backpedals. This is also an EVTCHR animation, but it's on the same sheet as Ovelia's, so it's just a matter of using a UnitAnim command, there's no need to load another one.
UnitAnim(x17,x00,x025F,x00)
DisplayMessage(x10,x11,x0008,x17,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)

//Agrias puts him firmly in his place.
DisplayMessage(x10,x12,x0009,x34,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)

//Ovelia finishes her prayer and interrupts before blood is split. Note that other characters react to her talking after the DisplayMessage but before the WaitForInstruction.
UnitAnim(x0C,x00,x0265,x00)
Wait(00003)
UnitAnim(x0C,x00,x0002,x00)
Wait(00015)
DisplayMessage(x10,x11,x000A,x0C,x00,x00,+00000,+00000,+00000,x03)
Wait(00020)
UnitAnim(x17,x00,x0260,x00)
RotateUnit(x34,x00,x0A,x00,x34,x20)
RotateUnit(x13,x00,x0E,x00,x34,x50)
WaitForInstruction(x01,x00)
WaitRotateAll()

//Gafgarion looks like he's standing still right now, but it's often a good idea to manually set a unit to UnitAnim x0002 if they had just used a different animation. Otherwise fun stuff can happen after commands like a camera or sprite movement.
UnitAnim(x17,x00,x0002,x00)


//The camera rotates a bit as it does in vanilla.
Camera(+00616,-00220,+00616,+00302,+04608,+00000,+04096,+00060)
WaitForInstruction(x04,x00)

//Ovelia turns around and walks over to Simon.
RotateUnit(x0C,x00,x04,x02,x00,x00)
WaitRotateAll()
WalkTo(x0C,x00,006,004,x00,x00,+004,x00)
WalkToAnim(x0C,x00,x0002)
RotateUnit(x13,x00,x00,x00,x34,xFC)
WaitWalk(x0C,x00)
RotateUnit(x0C,x00,x08,x01,x00,x10)
Wait(00030)

//Here's a different way to do DisplayMessage. When you want multiple messages to close at the same time, you can change the message type from x1X to x9X. They then won't close until you use a ChangeDialog command.
DisplayMessage(x10,x91,x000B,x13,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)
DisplayMessage(x10,x92,x000C,x0C,x00,x00,+00000,+00000,+00001,x03)
WaitForInstruction(x01,x00)
ChangeDialog(x01,xFFFF,x00,x00)
ChangeDialog(x02,xFFFF,x00,x00)
WaitForInstruction(x01,x00)

//Thumps are heard at the door.
Wait(00040)
SoundEffect(x0048)
Wait(00010)
SoundEffect(x0048)

//Open the door with UseFieldObject.
UseFieldObject(x01,x00)

//When a unit comes in from off screen, color them in shadows for the transition.
ColorUnit(x84,x00,x01,+000,+000,+000,000)

//Move her sprite back a bit and set her limping animation.
SpriteMove(x84,x00,-00030,+00000,+00000,x00,x01,+00000)
UnitAnim(x84,x00,x026A,x00)

//Draw her, slowly return her color to normal, and have her limp inside. We'll use multiple SpriteMoves for this so she moves irregularly, as you'd expect someone as badly wounded as her to do.
BlockStart()
Wait(00020)
Draw(x84,x00)
ColorUnit(x84,x00,x08,+000,+000,+000,004)
SpriteMove(x84,x00,+00000,+00000,+00000,x02,x0E,+00046)
WaitSpriteMove(x84,x00)
SpriteMove(x84,x00,+00024,+00000,+00000,x02,x0E,+00062)
WaitSpriteMove(x84,x00)
SpriteMove(x84,x00,+00032,+00000,+00000,x01,x0C,+00026)
WaitSpriteMove(x84,x00)
UnitAnim(x84,x00,x0021,x00)
Wait(00006)
SoundEffect(x0028)
UnitAnim(x84,x00,x0024,x00)
BlockEnd()

//The camera pans over to her. Everyone else moves out of her way as she stumbles inside.
Camera(+00440,-00204,+00600,+00302,+04608,+00000,+04096,+00064)
UnitAnim(x17,x00,x0002,x00)
RotateUnit(x17,x00,x00,x01,x00,x00)
SpriteMove(x17,x00,-00014,+00000,+00034,x00,x01,+00040)
Wait(00010)
FadeSound(x00,030)
FaceUnit(x84,x00,x0C,x00,x00,x00,x00)
RotateUnit(x13,x00,x04,x01,x01,x00)
UnitAnim(x83,x00,x0002,x00)
RotateUnit(x83,x00,x00,x01,x00,x00)
SpriteMove(x83,x00,-00014,+00000,+00022,x00,x01,+00032)
Wait(00010)
UnitAnimRotate(x02,x00,x06,x0002,x00)
UnitAnim(x02,x00,x0002,x00)
SpriteMove(x02,x00,+00000,+00000,-00016,x00,x01,+00040)
RotateUnit(x34,x00,x04,x00,x01,x00)
Wait(00035)
UnitAnim(x13,x00,x0003,x00)
SpriteMove(x13,x00,-00092,-00001,-00021,x02,x0C,+00100)
Wait(00040)
RotateUnit(x02,x00,x08,x00,x01,x00)
WaitSpriteMove(x13,x00)
UnitAnim(x13,x00,x0267,x00)
SoundEffect(x0041)
Wait(00030)
SwitchTrack(x01,+096,000)
Wait(00030)

//The knight warns Agrias that "the enemy" has appeared.
DisplayMessage(x10,x11,x000D,x84,x00,x00,-00011,+00014,+00032,x12)
WaitForInstruction(x01,x00)

//The Enemy walks in the chapel after her. We'll set him up much like we did with her - he'll be spritemoved some space back, and covered in shadows.
SpriteMove(x81,x00,-00026,-00000,-00010,x00,x01,+00000)
ColorUnit(x81,x00,x01,+000,+000,+000,000)

Draw(x81,x00)
SpriteMove(x81,x00,+00000,+00000,-00016,x00,x01,+00022)
ColorUnit(x81,x00,x08,+000,+000,+000,004)
WaitSpriteMove(x81,x00)
UnitAnim(x81,x00,x0002,x00)

//Ramza, Rad, and Gafgarion will turn to face him. This time we'll use FaceUnit so we can mostly just copy and paste the commands each time, but with different Unit IDs and delays.
FaceUnit(x81,x00,x02,x00,x00,x00,x00)
FaceUnit(x81,x00,x17,x00,x00,x00,x20)
FaceUnit(x81,x00,x83,x00,x00,x00,x40)

//The Enemy screams "For Goltana!"
DisplayMessage(x10,x12,x000E,x81,x00,x00,-00000,+00010,+00005,x12)
WaitForInstruction(x01,x00)

//Use the TempWeapon command to give both Agrias and The Enemy swords.
TempWeapon(x34,x00,x16)
TempWeapon(x81,x00,x14)


//The Enemy rushes at Agrias. This will mostly just be a WalkTo, but we'll throw in a simultaneous SpriteMove.
WalkTo(x81,x00,004,004,x00,x00,+024,x00)
SpriteMove(x81,x00,+00000,+00000,-00028,x00,x01,+00012)

//Agrias sees him coming for her and crouches defensively.
Wait(00010)
UnitAnim(x34,x00,x0022,x00)

//Ovelia, Ramza, Rad, and Gafgarion turn to face Agrias now.
FaceUnit(x34,x00,x0C,x00,x00,x01,x30)
FaceUnit(x34,x00,x02,x00,x00,x01,x00)
FaceUnit(x34,x00,x17,x00,x00,x01,x10)
FaceUnit(x34,x00,x83,x00,x00,x01,x20)

//The enemy knight tries to attack her.
WaitWalk(x81,x00)
UnitAnim(x81,x00,x0041,x00)

//Agrias jumps to the right.
UnitAnim(x34,x00,x0069,x00)
SpriteMove(x34,x00,-00008,-00006,+00014,x00,x01,+00008)
WaitSpriteMove(x34,x00)
SpriteMove(x34,x00,-00016,+00000,+00028,x00,x01,+00008)
WaitSpriteMove(x34,x00)
Wait(00005)
UnitAnim(x34,x00,x0002,x00)
RotateUnit(x34,x00,x00,x00,x01,x00)
SpriteMove(x34,x00,-00020,+00000,+00028,x00,x01,+00004)
WaitRotateAll()

//Remove the enemy knight's shadow or else it looks weird when he goes over the railing.
UnitShadow(x81,x00,x01)

//Also, yeah, throw that motherfucker over the railing.
UnitAnim(x81,x00,x0002,x00)
Wait(00001)
UnitAnim(x34,x00,x0041,x00)
SpriteMove(x34,x00,-00020,+00000,+00014,x00,x01,+00012)
Wait(00016)
SoundEffect(x0072)
UnitAnimRotate(x81,x00,x00,x0019,x00)
SpriteMove(x81,x00,+00004,-00020,-00060,x00,x01,+00010)
Wait(00010)
SpriteMove(x81,x00,+00006,-00012,-00076,x00,x01,+00006)
Wait(00006)

//Start a block, because Agrias is going to be running even before he lands.
BlockStart()
SpriteMove(x81,x00,+00008,+00065,-00085,x00,x01,+00010)
Wait(00003)
UnitAnim(x81,x00,x0034,x00)
Wait(00007)
SoundEffect(x0015)
BlockEnd()

//Agrias puts her sword away and turns to the door.
UnitAnim(x34,x00,x0002,x00)
RotateUnit(x34,x00,x04,x00,x00,x10)
WaitRotateUnit(x34,x00)

//The other four turn towards the door, but with a delay, so it comes across as if they're just watching Agrias go. This time, we'll use FaceTile.
FaceTile(x02,x00,000,004,x00,x00,x00,x40)
FaceTile(x0C,x00,000,004,x00,x00,x00,x20)
FaceTile(x17,x00,000,004,x00,x00,x00,x40)
FaceTile(x83,x00,000,004,x00,x00,x00,x50)

//Agrias runs out the door. As she runs, pan the camera a little more.
Camera(+00240,-00204,+00600,+00302,+04608,+00000,+04096,+00064)
WalkTo(x34,x00,001,003,x00,x00,+020,x00)
SpriteMove(x34,x00,-00030,+00000,+00008,x00,x03,+00016)
WaitSpriteMove(x34,x00)
SpriteMove(x34,x00,-00040,+00000,+00014,x00,x01,+00016)
Wait(00016)
ColorUnit(x34,x00,x01,+000,+000,+000,002)
WaitSpriteMove(x34,x00)
WaitWalk(x34,x00)
Erase(x34,x00)

Wait(00040)
WaitForInstruction(x04,x00)

//Gafgarion wonders where the hell these guys even came from. Ramza and Rad rotate to face him as he talks.
DisplayMessage(x10,x91,x000F,x17,x00,x00,+00012,-00010,+00000,x12)
RotateUnit(x02,x00,x08,x00,x00,x30)
RotateUnit(x83,x00,x0E,x00,x00,x40)
WaitForInstruction(x01,x00)

//Ramza confirms he's ready to go earn his pay. Gafgarion faces him as he talks.
DisplayMessage(x10,x92,x0010,x02,x00,x00,-00000,+00000,+00000,x12)
RotateUnit(x17,x00,x00,x00,x00,x30)
WaitForInstruction(x01,x00)

//Gafgarion yells Geronimo and charges out. Because this is a continuation of a DisplayMessage we set to manually close, this requires ChangeDialog rather than a new DisplayMessage.
ChangeDialog(x01,x0011,x00,x00)
RotateUnit(x17,x00,x04,x00,x00,x90)
WaitForInstruction(x01,x00)

//Now close both messages with the closing ChangeDialog.
ChangeDialog(x01,xFFFF,x00,x00)
ChangeDialog(x02,xFFFF,x00,x00)

WaitForInstruction(x01,x00)
WaitRotateAll()

//Set Gaf to the run animation and make him leave.
BlockStart()
UnitAnim(x17,x00,x0004,x00)
SpriteMove(x17,x00,-00098,+00000,-00000,x00,x01,+00040)
Wait(00030)
ColorUnit(x17,x00,x01,+000,+000,+000,002)
WaitSpriteMove(x17,x00)
Erase(x17,x00)
BlockEnd()

//Set Ramza to the run animation and make him leave.
BlockStart()
RotateUnit(x02,x00,x04,x00,x00,x20)
WaitRotateUnit(x02,x00)
UnitAnim(x02,x00,x0004,x00)
SpriteMove(x02,x00,-00056,+00000,+00010,x00,x01,+00030)
Wait(00020)
ColorUnit(x02,x00,x01,+000,+000,+000,002)
WaitSpriteMove(x02,x00)
Erase(x02,x00)
BlockEnd()

//Set Rad to the run animation and make him leave.
RotateUnit(x83,x00,x04,x00,x00,x50)
WaitRotateUnit(x83,x00)
UnitAnim(x83,x00,x0004,x00)
SpriteMove(x83,x00,-00040,-00000,-00035,x00,x01,+00028)
WaitSpriteMove(x83,x00)
SpriteMove(x83,x00,-00056,-00000,-00035,x00,x01,+00008)
ColorUnit(x83,x00,x01,+000,+000,+000,003)
WaitSpriteMove(x83,x00)
Erase(x83,x00)
Wait(00040)

//Ovelia goes "Oh, God..."
DisplayMessage(x10,x11,x0012,x0C,x00,x00,+00000,+00000,-00000,x00)
WaitForInstruction(x01,x00)

//Zoom the camera out. We'll add the CameraSpeedCurve command to make it have a smoother zoom.
CameraSpeedCurve(xAA)
Camera(+00680,-00204,+00600,+00430,+04656,+00000,+02656,+00133)

//Fade the screen.
ColorScreen(x02,000,000,000,200,200,200,+00140)
Wait(00140)

//Use PostEvent to set the event to play the Orbonne battle immediately after this event.
PostEvent(x81,x0002)

Pause()
EventEnd()


//INSTRUCTION SECTION END -  TEXT START
//Message x01
Ignore this message for now.{br}
We're not including Ovelia's prayer yet.{end}

//Message x02
{font:08}Female Knight{font:00}{br}
Don't worry about that, Ovelia.{br}
Let's get going.{end}

//Message x03
{font:08}Ovelia{font:00}{br}
Just a moment, Agrias...{end}

//Message x04
{font:08}Agrias{font:00}{br}
That's {font:08}Dame{font:00} Agrias, Princess.{br}
{br}
I appreciate your religious{br}
devotion, but I'm the knight{br}
in charge of your safety.{br}
And we need to get to{br}
Dorter before nightfall.{end}

//Message x05
{font:08}Priest{font:00}{br}
Princess Ovelia, please.{br}
{br}
You... you don't want to{br}
give Agrias any trouble,{br}
do you? It's n{D11D}not wise.{end}

//Message x06
{font:08}Black Knight{font:00}{br}
Okay, seriously, this is{br}
getting ridiculous.{br}
We've been waiting in the{br}
rain for an hour, now.{br}
{br}
Who's supposed to be in{br}
charge here, exactly?{br}
{br}
Because I've got half a{br}
mind to just take our pay{br}
and head out instead.{end}

//Message x07
{font:08}Agrias{font:00}{br}
I'm the one in charge. Care{br}
to repeat that, Gafgarion?{end}

//Message x08
{font:08}Gafgarion{font:00}{br}
(Oh, God, it's Agrias{br}
Motherfucking Oaks...!){br}
*cough* Erm, t{D11D}-that is,{br}
I just wished to express my{br}
concern over this delay.{br}
We were... we were worried{br}
something might be amiss.{end}

//Message x09
{font:08}Agrias{font:00}{br}
Yeah, I'm sure you were.{br}
{br}
I'm no more pleased with this{br}
delay than you, but don't you{br}
forget where you stand.{br}
You're a gang of sellswords,{br}
not royal knights. You're lucky{br}
to have this job at all.{br}
Run your mouth again, and{br}
I'll rip your tongue right{br}
out of it. Are we clear?{end}

//Message x0A
{font:08}Ovelia{font:00}{br}
Please, there's no{br}
need to fight.{br}
I'm finished.{br}
Sorry for the delay.{end}

//Message x0B
{font:08}Priest{font:00}{br}
Go with God.{end}

//Message x0C
{font:08}Ovelia{font:00}{br}
You, too, Simon.{end}

//Message x0D
{font:08}Knight{font:00}{br}
Dame Agrias...!{br}
The enemy...!{end}

//Message x0E
{font:08}The Enemy{font:00}{br}
For Duke Goltana!!{end}

//Message x0F
{font:08}Gafgarion{font:00}{br}
Where the hell did{br}
they come from?{br}
Over an hour of nothing{br}
but as soon as we walk in,{br}
something happens?{br}
Well, whatever.{br}
Shall we go earn{br}
our pay, boys?{end}

//Message x10
{font:08}{Ramza}{font:00}{br}
Sure. That is how being a{br}
mercenary works, isn't it?{end}

//Message x11
{font:08}Gafgarion{font:00}{br}
You're goddamn right.{br}
This is the way! Geronimo!!{end}

//Message x12
{font:08}Ovelia{font:00}{br}
Oh, God...{br}
Be safe, all of you...!{end}

  • Modding version: PSX & WotL
  • Discord username: Nyzer

Nyzer

And you can see the completely finished version of the video and the script here, if you'd like.

Offset(x00002000)

Pause()



LoadConditionals(x0000)
Camera(+00840,-00220,+00504,+00302,+03584,+00000,+04096,+00000)

WarpUnit(x02,x00,002,003,x00,x03)
WarpUnit(x17,x00,003,004,x00,x03)
WarpUnit(x83,x00,002,005,x00,x03)
WarpUnit(x84,x00,001,004,x00,x03)
WarpUnit(x81,x00,001,004,x00,x03)

AddUnitStart()
AddUnit(x02,x00,x01)
AddUnit(x17,x00,x01)
AddUnit(x83,x00,x01)
AddUnit(x84,x00,x01)
AddUnit(x81,x00,x01)
AddUnitEnd()

UnitAnim(x00,x00,x0002,x00)
LoadEVTCHR(x01,x00,x00)
WaitForInstruction(x34,x00)
SaveEVTCHR(x01)
UnitAnim(x0C,x00,x0259,x00)

Reveal(030)
Wait(00030)

//Agrias says it's time to go.
DisplayMessage(x10,x12,x0002,x34,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

//A brief pause, then Ovelia looks up.
Wait(00030)
UnitAnim(x0C,x00,x025A,x00)
Wait(00030)

//Ovelia tells Agrias "just a minute", then looks down again.
DisplayMessage(x10,x11,x0003,x0C,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)
Wait(00050)
UnitAnim(x0C,x00,x0259,x00)
Wait(00050)

//Agrias walks up behind Ovelia's shoulder and reminds her who's in charge.
WalkTo(x34,x00,007,003,x00,x00,+008,x01)
WalkToAnim(x34,x00,x0002)
WaitWalk(x34,x00)
RotateUnit(x34,x00,x0A,x00,x00,x00)
WaitRotateAll()
DisplayMessage(x10,x12,x0004,x34,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

//Simon timidly steps forward and warns Ovelia not to ignore Agrias.
WalkTo(x13,x00,006,005,x00,x00,+006,x01)
WalkToAnim(x13,x00,x0002)
WaitWalk(x13,x00)
DisplayMessage(x10,x12,x0005,x13,x00,x00,+00000,+00000,-00000,x02)
WaitForInstruction(x01,x00)

WaitAddUnitEnd()

SpriteMove(x17,x00,-00084,+00000,-00000,x00,x01,+00000)
SpriteMove(x02,x00,-00056,+00000,+00028,x00,x01,+00000)
SpriteMove(x83,x00,-00056,-00000,-00028,x00,x01,+00000)

SoundEffect(x0048)
Draw(x02,x00)
Draw(x17,x00)
Draw(x83,x00)
Camera(+00616,-00220,+00504,+00302,+04432,+00000,+04096,+00064)

//Ovelia stays in a prayer animation.
BlockStart()
Wait(00020)
UnitAnim(x0C,x00,x025D,x00)
Wait(00014)
UnitAnim(x0C,x00,x025E,x00)
BlockEnd()

//Simon turns around after a moment.
RotateUnit(x13,x00,x04,x00,x34,xB0)

//Ramza walks in.
BlockStart()
Wait(00030)
SpriteMove(x02,x00,+00000,+00000,+00000,x00,x01,+00080)
WaitSpriteMove(x02,x00)
UnitAnim(x02,x00,x0002,x00)
BlockEnd()

//Rad walks in.
BlockStart()
Wait(00050)
SpriteMove(x83,x00,+00000,+00000,+00000,x00,x01,+00080)
WaitSpriteMove(x83,x00)
UnitAnim(x83,x00,x0002,x00)
BlockEnd()

//Gafgarion walks in. We'll actually have him walk a bit further in than his real unit position, so he can step back a moment later.
SpriteMove(x17,x00,+00028,+00000,+00000,x00,x01,+00130)
WaitSpriteMove(x17,x00)
UnitAnim(x17,x00,x0002,x00)

//Wait for the camera to finish turning before continuing with the event.
WaitForInstruction(x04,x00)

//Gafgarion protests the wait. Since he's SpriteMoved a bit out of place, we'll move the DisplayMessage a bit to match.
DisplayMessage(x10,x11,x0006,x17,x00,x00,+00028,+00005,+00000,x02)
WaitForInstruction(x01,x00)

//Agrias slowly turns around.
RotateUnit(x34,x00,x04,x00,x34,x00)
WaitRotateAll()
Wait(00020)

//Gafgarion sees the look in her eyes, and steps back a tile.
BlockStart()
UnitAnim(x17,x00,x0003,x00)
SpriteMove(x17,x00,+00000,+00000,+00000,x00,x01,+00080)
WaitSpriteMove(x17,x00)
UnitAnim(x17,x00,x0002,x00)
BlockEnd()

//Agrias walks close to him, and lets him know who's in charge.
WalkTo(x34,x00,005,003,x00,x00,+008,x00)
WalkToAnim(x34,x00,x0002)
WaitWalk(x34,x00)
DisplayMessage(x10,x12,x0007,x34,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)

//Gafgarion bows his head respectfully and backpedals. This is also an EVTCHR animation, but it's on the same sheet as Ovelia's, so it's just a matter of using a UnitAnim command, there's no need to load another one.
UnitAnim(x17,x00,x025F,x00)
DisplayMessage(x10,x11,x0008,x17,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)

//Agrias puts him firmly in his place.
DisplayMessage(x10,x12,x0009,x34,x00,x00,+00000,+00000,+00000,x02)
WaitForInstruction(x01,x00)

//Ovelia finishes her prayer and interrupts before blood is split. Note that other characters react to her talking after the DisplayMessage but before the WaitForInstruction.
UnitAnim(x0C,x00,x0265,x00)
Wait(00003)
UnitAnim(x0C,x00,x0002,x00)
Wait(00015)
DisplayMessage(x10,x11,x000A,x0C,x00,x00,+00000,+00000,+00000,x03)
Wait(00020)
UnitAnim(x17,x00,x0260,x00)
RotateUnit(x34,x00,x0A,x00,x34,x20)
RotateUnit(x13,x00,x0E,x00,x34,x50)
WaitForInstruction(x01,x00)
WaitRotateAll()

//Gafgarion looks like he's standing still right now, but it's often a good idea to manually set a unit to UnitAnim x0002 if they had just used a different animation. Otherwise fun stuff can happen after commands like a camera or sprite movement.
UnitAnim(x17,x00,x0002,x00)


//The camera rotates a bit as it does in vanilla.
Camera(+00616,-00220,+00616,+00302,+04608,+00000,+04096,+00060)
WaitForInstruction(x04,x00)

//Ovelia turns around and walks over to Simon.
RotateUnit(x0C,x00,x04,x02,x00,x00)
WaitRotateAll()
WalkTo(x0C,x00,006,004,x00,x00,+004,x00)
WalkToAnim(x0C,x00,x0002)
RotateUnit(x13,x00,x00,x00,x34,xFC)
WaitWalk(x0C,x00)
RotateUnit(x0C,x00,x08,x01,x00,x10)
Wait(00030)

//Here's a different way to do DisplayMessage. When you want multiple messages to close at the same time, you can change the message type from x1X to x9X. They then won't close until you use a ChangeDialog command.
DisplayMessage(x10,x91,x000B,x13,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)
DisplayMessage(x10,x92,x000C,x0C,x00,x00,+00000,+00000,+00001,x03)
WaitForInstruction(x01,x00)
ChangeDialog(x01,xFFFF,x00,x00)
ChangeDialog(x02,xFFFF,x00,x00)
WaitForInstruction(x01,x00)

//Thumps are heard at the door.
Wait(00040)
SoundEffect(x0048)
Wait(00010)
SoundEffect(x0048)

//Open the door with UseFieldObject.
UseFieldObject(x01,x00)

//When a unit comes in from off screen, color them in shadows for the transition.
ColorUnit(x84,x00,x01,+000,+000,+000,000)

//Move her sprite back a bit and set her limping animation.
SpriteMove(x84,x00,-00030,+00000,+00000,x00,x01,+00000)
UnitAnim(x84,x00,x026A,x00)

//Draw her, slowly return her color to normal, and have her limp inside. We'll use multiple SpriteMoves for this so she moves irregularly, as you'd expect someone as badly wounded as her to do.
BlockStart()
Wait(00020)
Draw(x84,x00)
ColorUnit(x84,x00,x08,+000,+000,+000,004)
SpriteMove(x84,x00,+00000,+00000,+00000,x02,x0E,+00046)
WaitSpriteMove(x84,x00)
SpriteMove(x84,x00,+00024,+00000,+00000,x02,x0E,+00062)
WaitSpriteMove(x84,x00)
SpriteMove(x84,x00,+00032,+00000,+00000,x01,x0C,+00026)
WaitSpriteMove(x84,x00)
UnitAnim(x84,x00,x0021,x00)
Wait(00006)
SoundEffect(x0028)
UnitAnim(x84,x00,x0024,x00)
BlockEnd()

//The camera pans over to her. Everyone else moves out of her way as she stumbles inside.
Camera(+00440,-00204,+00600,+00302,+04608,+00000,+04096,+00064)
UnitAnim(x17,x00,x0002,x00)
RotateUnit(x17,x00,x00,x01,x00,x00)
SpriteMove(x17,x00,-00014,+00000,+00034,x00,x01,+00040)
Wait(00010)
FadeSound(x00,030)
FaceUnit(x84,x00,x0C,x00,x00,x00,x00)
RotateUnit(x13,x00,x04,x01,x01,x00)
UnitAnim(x83,x00,x0002,x00)
RotateUnit(x83,x00,x00,x01,x00,x00)
SpriteMove(x83,x00,-00014,+00000,+00022,x00,x01,+00032)
Wait(00010)
UnitAnimRotate(x02,x00,x06,x0002,x00)
UnitAnim(x02,x00,x0002,x00)
SpriteMove(x02,x00,+00000,+00000,-00016,x00,x01,+00040)
RotateUnit(x34,x00,x04,x00,x01,x00)
Wait(00035)
UnitAnim(x13,x00,x0003,x00)
SpriteMove(x13,x00,-00092,-00001,-00021,x02,x0C,+00100)
Wait(00040)
RotateUnit(x02,x00,x08,x00,x01,x00)
WaitSpriteMove(x13,x00)
UnitAnim(x13,x00,x0267,x00)
SoundEffect(x0041)
Wait(00030)
SwitchTrack(x01,+096,000)
Wait(00030)

//The knight warns Agrias that "the enemy" has appeared.
DisplayMessage(x10,x11,x000D,x84,x00,x00,-00011,+00014,+00032,x12)
WaitForInstruction(x01,x00)

//The Enemy walks in the chapel after her. We'll set him up much like we did with her - he'll be spritemoved some space back, and covered in shadows.
SpriteMove(x81,x00,-00026,-00000,-00010,x00,x01,+00000)
ColorUnit(x81,x00,x01,+000,+000,+000,000)

Draw(x81,x00)
SpriteMove(x81,x00,+00000,+00000,-00016,x00,x01,+00022)
ColorUnit(x81,x00,x08,+000,+000,+000,004)
WaitSpriteMove(x81,x00)
UnitAnim(x81,x00,x0002,x00)

//Ramza, Rad, and Gafgarion will turn to face him. This time we'll use FaceUnit so we can mostly just copy and paste the commands each time, but with different Unit IDs and delays.
FaceUnit(x81,x00,x02,x00,x00,x00,x00)
FaceUnit(x81,x00,x17,x00,x00,x00,x20)
FaceUnit(x81,x00,x83,x00,x00,x00,x40)

//The Enemy screams "For Goltana!"
DisplayMessage(x10,x12,x000E,x81,x00,x00,-00000,+00010,+00005,x12)
WaitForInstruction(x01,x00)

//Use the TempWeapon command to give both Agrias and The Enemy swords.
TempWeapon(x34,x00,x16)
TempWeapon(x81,x00,x14)


//The Enemy rushes at Agrias. This will mostly just be a WalkTo, but we'll throw in a simultaneous SpriteMove.
WalkTo(x81,x00,004,004,x00,x00,+024,x00)
SpriteMove(x81,x00,+00000,+00000,-00028,x00,x01,+00012)

//Agrias sees him coming for her and crouches defensively.
Wait(00010)
UnitAnim(x34,x00,x0022,x00)

//Ovelia, Ramza, Rad, and Gafgarion turn to face Agrias now.
FaceUnit(x34,x00,x0C,x00,x00,x01,x30)
FaceUnit(x34,x00,x02,x00,x00,x01,x00)
FaceUnit(x34,x00,x17,x00,x00,x01,x10)
FaceUnit(x34,x00,x83,x00,x00,x01,x20)

//The enemy knight tries to attack her.
WaitWalk(x81,x00)
UnitAnim(x81,x00,x0041,x00)

//Agrias jumps to the right.
UnitAnim(x34,x00,x0069,x00)
SpriteMove(x34,x00,-00008,-00006,+00014,x00,x01,+00008)
WaitSpriteMove(x34,x00)
SpriteMove(x34,x00,-00016,+00000,+00028,x00,x01,+00008)
WaitSpriteMove(x34,x00)
Wait(00005)
UnitAnim(x34,x00,x0002,x00)
RotateUnit(x34,x00,x00,x00,x01,x00)
SpriteMove(x34,x00,-00020,+00000,+00028,x00,x01,+00004)
WaitRotateAll()

//Remove the enemy knight's shadow or else it looks weird when he goes over the railing.
UnitShadow(x81,x00,x01)

//Also, yeah, throw that motherfucker over the railing.
UnitAnim(x81,x00,x0002,x00)
Wait(00001)
UnitAnim(x34,x00,x0041,x00)
SpriteMove(x34,x00,-00020,+00000,+00014,x00,x01,+00012)
Wait(00016)
SoundEffect(x0072)
UnitAnimRotate(x81,x00,x00,x0019,x00)
SpriteMove(x81,x00,+00004,-00020,-00060,x00,x01,+00010)
Wait(00010)
SpriteMove(x81,x00,+00006,-00012,-00076,x00,x01,+00006)
Wait(00006)

//Start a block, because Agrias is going to be running even before he lands.
BlockStart()
SpriteMove(x81,x00,+00008,+00065,-00085,x00,x01,+00010)
Wait(00003)
UnitAnim(x81,x00,x0034,x00)
Wait(00007)
SoundEffect(x0015)
BlockEnd()

//Agrias puts her sword away and turns to the door.
UnitAnim(x34,x00,x0002,x00)
RotateUnit(x34,x00,x04,x00,x00,x10)
WaitRotateUnit(x34,x00)

//The other four turn towards the door, but with a delay, so it comes across as if they're just watching Agrias go. This time, we'll use FaceTile.
FaceTile(x02,x00,000,004,x00,x00,x00,x40)
FaceTile(x0C,x00,000,004,x00,x00,x00,x20)
FaceTile(x17,x00,000,004,x00,x00,x00,x40)
FaceTile(x83,x00,000,004,x00,x00,x00,x50)

//Agrias runs out the door. As she runs, pan the camera a little more.
Camera(+00240,-00204,+00600,+00302,+04608,+00000,+04096,+00064)
WalkTo(x34,x00,001,003,x00,x00,+020,x00)
SpriteMove(x34,x00,-00030,+00000,+00008,x00,x03,+00016)
WaitSpriteMove(x34,x00)
SpriteMove(x34,x00,-00040,+00000,+00014,x00,x01,+00016)
Wait(00016)
ColorUnit(x34,x00,x01,+000,+000,+000,002)
WaitSpriteMove(x34,x00)
WaitWalk(x34,x00)
Erase(x34,x00)

Wait(00040)
WaitForInstruction(x04,x00)

//Gafgarion wonders where the hell these guys even came from. Ramza and Rad rotate to face him as he talks.
DisplayMessage(x10,x91,x000F,x17,x00,x00,+00012,-00010,+00000,x12)
RotateUnit(x02,x00,x08,x00,x00,x30)
RotateUnit(x83,x00,x0E,x00,x00,x40)
WaitForInstruction(x01,x00)

//Ramza confirms he's ready to go earn his pay. Gafgarion faces him as he talks.
DisplayMessage(x10,x92,x0010,x02,x00,x00,-00000,+00000,+00000,x12)
RotateUnit(x17,x00,x00,x00,x00,x30)
WaitForInstruction(x01,x00)

//Gafgarion yells Geronimo and charges out. Because this is a continuation of a DisplayMessage we set to manually close, this requires ChangeDialog rather than a new DisplayMessage.
ChangeDialog(x01,x0011,x00,x00)
RotateUnit(x17,x00,x04,x00,x00,x90)
WaitForInstruction(x01,x00)

//Now close both messages with the closing ChangeDialog.
ChangeDialog(x01,xFFFF,x00,x00)
ChangeDialog(x02,xFFFF,x00,x00)

WaitForInstruction(x01,x00)
WaitRotateAll()

//Set Gaf to the run animation and make him leave.
BlockStart()
UnitAnim(x17,x00,x0004,x00)
SpriteMove(x17,x00,-00098,+00000,-00000,x00,x01,+00040)
Wait(00030)
ColorUnit(x17,x00,x01,+000,+000,+000,002)
WaitSpriteMove(x17,x00)
Erase(x17,x00)
BlockEnd()

//Set Ramza to the run animation and make him leave.
BlockStart()
RotateUnit(x02,x00,x04,x00,x00,x20)
WaitRotateUnit(x02,x00)
UnitAnim(x02,x00,x0004,x00)
SpriteMove(x02,x00,-00056,+00000,+00010,x00,x01,+00030)
Wait(00020)
ColorUnit(x02,x00,x01,+000,+000,+000,002)
WaitSpriteMove(x02,x00)
Erase(x02,x00)
BlockEnd()

//Set Rad to the run animation and make him leave.
RotateUnit(x83,x00,x04,x00,x00,x50)
WaitRotateUnit(x83,x00)
UnitAnim(x83,x00,x0004,x00)
SpriteMove(x83,x00,-00040,-00000,-00035,x00,x01,+00028)
WaitSpriteMove(x83,x00)
SpriteMove(x83,x00,-00056,-00000,-00035,x00,x01,+00008)
ColorUnit(x83,x00,x01,+000,+000,+000,003)
WaitSpriteMove(x83,x00)
Erase(x83,x00)
Wait(00040)

//Ovelia goes "Oh, God..."
DisplayMessage(x10,x11,x0012,x0C,x00,x00,+00000,+00000,-00000,x00)
WaitForInstruction(x01,x00)

//Zoom the camera out. We'll add the CameraSpeedCurve command to make it have a smoother zoom.
CameraSpeedCurve(xAA)
Camera(+00680,-00204,+00600,+00430,+04656,+00000,+02656,+00133)

//Fade the screen.
ColorScreen(x02,000,000,000,200,200,200,+00140)
Wait(00140)

//Use PostEvent to set the event to play the Orbonne battle immediately after this event.
PostEvent(x81,x0002)

Pause()
EventEnd()


//INSTRUCTION SECTION END -  TEXT START
//Message x01
Ignore this message for now.{br}
We�re not including Ovelia�s prayer yet.{end}

//Message x02
{font:08}Female Knight{font:00}{br}
Don't worry about that, Ovelia.{br}
Let's get going.{end}

//Message x03
{font:08}Ovelia{font:00}{br}
Just a moment, Agrias...{end}

//Message x04
{font:08}Agrias{font:00}{br}
That's {font:08}Dame{font:00} Agrias, Princess.{br}
{br}
I appreciate your religious{br}
devotion, but I'm the knight{br}
in charge of your safety.{br}
And we need to get to{br}
Dorter before nightfall.{end}

//Message x05
{font:08}Priest{font:00}{br}
Princess Ovelia, please.{br}
{br}
You... you don't want to{br}
give Agrias any trouble,{br}
do you? It's n{D11D}not wise.{end}

//Message x06
{font:08}Black Knight{font:00}{br}
Okay, seriously, this is{br}
getting ridiculous.{br}
We've been waiting in the{br}
rain for an hour, now.{br}
{br}
Who's supposed to be in{br}
charge here, exactly?{br}
{br}
Because I've got half a{br}
mind to just take our pay{br}
and head out instead.{end}

//Message x07
{font:08}Agrias{font:00}{br}
I'm the one in charge. Care{br}
to repeat that, Gafgarion?{end}

//Message x08
{font:08}Gafgarion{font:00}{br}
(Oh, God, it's Agrias{br}
Motherfucking Oaks...!){br}
*cough* Erm, t{D11D}-that is,{br}
I just wished to express my{br}
concern over this delay.{br}
We were... we were worried{br}
something might be amiss.{end}

//Message x09
{font:08}Agrias{font:00}{br}
Yeah, I'm sure you were.{br}
{br}
I'm no more pleased with this{br}
delay than you, but don't you{br}
forget where you stand.{br}
You're a gang of sellswords,{br}
not royal knights. You're lucky{br}
to have this job at all.{br}
Run your mouth again, and{br}
I'll rip your tongue right{br}
out of it. Are we clear?{end}

//Message x0A
{font:08}Ovelia{font:00}{br}
Please, there's no{br}
need to fight.{br}
I'm finished.{br}
Sorry for the delay.{end}

//Message x0B
{font:08}Priest{font:00}{br}
Go with God.{end}

//Message x0C
{font:08}Ovelia{font:00}{br}
You, too, Simon.{end}

//Message x0D
{font:08}Knight{font:00}{br}
Dame Agrias...!{br}
The enemy...!{end}

//Message x0E
{font:08}The Enemy{font:00}{br}
For Duke Goltana!!{end}

//Message x0F
{font:08}Gafgarion{font:00}{br}
Where the hell did{br}
they come from?{br}
Over an hour of nothing{br}
but as soon as we walk in,{br}
something happens?{br}
Well, whatever.{br}
Shall we go earn{br}
our pay, boys?{end}

//Message x10
{font:08}{Ramza}{font:00}{br}
Sure. That is how being a{br}
mercenary works, isn't it?{end}

//Message x11
{font:08}Gafgarion{font:00}{br}
You're goddamn right.{br}
To battle! Geronimo!!{end}

//Message x12
{font:08}Ovelia{font:00}{br}
Oh, God...{br}
Be safe, all of you...!{end}

  • Modding version: PSX & WotL
  • Discord username: Nyzer