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

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Topics - Nyzer

1
The Lion War / Quick Fix for the Balthier Softlock
July 18, 2023, 04:20:01 pm
A while ago, I prepared a quick fix for anyone dealing with the Balthier softlock that comes from having 4 or fewer characters in Ramza's name, but I wasn't able to upload it here.

I don't have a save file that can test this myself, but it should work fine. But just to be safe, make sure to apply the patch to a different copy of your TLW/TLWotL ISO - the save file will still work with this other copy afterwards. Do not apply the patch to a vanilla ISO - it's just a quick fix patch, not a new version of TLW.
2
The Lion War / Skip Chapter One
September 25, 2022, 02:44:43 pm
For ArmoredKori's work in progress - Unexplored, based off The Lion War - he was discussing the idea of skipping Chapter 1 entirely, because his additions all take place after Chapter 2 starts. My response was not to do that, but to let it be a player choice.

Then I came up with events that set that up for him, as well as anyone else who would like to use such a feature.

Both events need to be imported into a copy of TLW's TEST.EVT using EVSP, then imported to the ISO via CDMage.
3
News / The Lion War of the Lions has released!
September 18, 2022, 11:37:21 pm
At long last, the WotL translation is available in the PSX version of FFT! It's part of The Lion War, and comes with all the fun extras that can be found in that mod, such as single-player Rendezvous battles, the Sound Novels, and a New Game Plus feature!

You can find it here.
4
On the ninth of September, Kokojo released the first chapter of the Call of Power remake, which adds new and never-before-seen features such as a world map! Kokojo's been hard at work using all the latest upgrades to the tools to show off a lot of what can be done with modding nowadays, so if you're interested in seeing just how far FFT modding can go, and checking out a totally unique story in the FFT engine, head on over!

You can also go check out the new 2.03 update to The Lion War for something a lot closer to the vanilla experience. The Lion War brings as much WotL content to the PSX version as possible, with some liberties taken to enhance that content where possible (such as replacing Luso, a blatant Ramza clone, with Ashley Riot, or replacing the bland loot system from the WotL Rendezvous with the more robust Treasure Wheel, or replacing the option to continue on the world map after beating Altima with an entire New Game Plus set of bonuses and options). 2.03 comes with a bunch of bug fixes as well as our third unique new Rendezvous battle, Be a Beta, which sends you to Bethla Sluice to beat up our beta testers.
5
One of the questions I saw often from those seeking to use TLW as a base mod for their work was: "What if I want to change the items? What would I do about the Treasure Wheel after doing a Rendezvous?"

For a fair while, our answer has been to shrug and suggest that either the Treasure Wheel should be dummied out in your patch, or to roll up your sleeves and dive into the event commands, painstakingly adjusting every set of loot.

However, early on in the Treasure Wheel's production, Elric commented that Kokojo would love the concept for his mod, Call of Power, in which guests would silently join the party after fights. These guests had a treasure chest for a sprite, and their purpose was to be stripped of their gear before they were auto-dismissed.
Once the Wheel was made public (or was shared with him; I forget which), Kokojo himself expressed the same sentiment.

However, not even Kokojo was finding any real success in taking the Treasure Wheel event and customizing it to work as he wanted, just because of how stuffed the event was, and difficult it was to edit it.

He and I ended up discussing the issue for a while, until one day I suggested keeping the treasure box guests so that he could set up a similar event to use their gear to populate some loot tables. A bit later, I realized that if that was an option, so was using the gear of the units in the ENTD. There are 16 units, after all, which means that if we divide them into half common and half rare loot, we can have up to 8 different options for each type of equipment. That's certainly smaller than some of my loot tables currently are in TLW, but it's still a fairly respectable amount. More than adequate for the Wheel's needs. So, I got to work, and built this new variant: the Loot Wheel.


=====

So how can you set up the Loot Wheel's loot? There are two sets of things to edit: ENTD and some of the early event commands. You should also make sure to import the included EVTCHR so that the treasure chests show up properly - many of the new treasure chest palettes are blank in the Treasure Wheel version.

=====

You'll want 16 units in the ENTD, with the first 12 set to both Always Present and Randomly Present*.  They should all be set to the same special Unit (such as 02 Ramza) to make sure they have the same spritesheet. They should have IDs of x90-x9F.

*(Using both will cause the unit to spawn automatically Erased, and trigger the "Zalera bug" that prevents units with Always: Float from having the Float animation. After all, we don't want the chests to have a Float animation.)

At the start of the event, it builds loot tables from the units' Right Hand Weapon, Left Hand Shield, Head, Body, and Accessory slots. The first eight units are used to generate common loot. The last eight are used to generate rare loot. The first eight units' War Trophies are also used to generate Consumable loot, with their Bonus Money set to the number of those consumables you'll get. These item types don't always have to match the loot category - for example, you can put katanas in the war trophies slots and they'll be awarded just fine. However, the Loot Wheel will still call them Consumables. Additionally, the game has different bytes for Right Hand Weapon and Right Hand Shield, or Left Hand Weapon and Left Hand Shield, so it's best not to mess around with the equipment slots too much.

If an equipment slot is left empty, the loot wheel will ignore it when figuring out its loot tables. If that equipment slot is empty for the entire set of common loot, every chest of that type will be converted to Consumables. If that equipment slot is empty for the entire set of rare loot, any rare upgrades for that category will award the common loot, but also with some bonus JP. If a common unit's War Trophy slot is empty, it'll be set to Item FD - normally Phoenix Downs. If Bonus Money is set to 0, it'll get a random value between 1 and 9.

You can also adjust any of the first 12 units' Faith in order to force them to spawn as a specific chest.

Common loot:
- 2 will be a Weapon Chest.
- 3, Shield.
- 4, Helmet.
- 5, Armor.
- 6, Accessory.
- 7, Consumable.

Rare loot:
- 8 will be a Rare Weapon.
- 9, Rare Shield.
- 10, Rare Helmet.
- 11, Rare Armor.
- 12, Rare Accessory.
- 13, since Consumables won't upgrade to Rare, will be a Mystery chest, which holds one random piece of common loot, and awards bonus JP.

Loot+:
- 18 will be a Weapon+ chest, which holds a common weapon and awards bonus JP.
- 19 will be Shield+.
- 20, Helmet+.
- 21, Armor+.
- 22, Accessory+.
- 23, Consumable+.

Units that don't have hard-set Faith can never reach these values, and any unit with Faith higher than 32 (which is still below the lowest possible minimum random Faith range) will have their loot category randomized.

Speaking of randomized, you can actually just leave units' equipment set to Random if you like. As long as you aren't planning to get Unique equipment from this event, you can handle normal and rare rewards by setting the first eight units to be around the Party Level, and the last eight to be something like Party Level +10. Setting the units to different Jobs (but keeping their Units as the same special units) will allow them to spawn with different gear; for example, you can use Archers, Knights, and Wizards to get a good mix of different randomized equipment.

=====

As for the event commands: In the event itself, there are a few lines near the top that determine how many chests you can open and how rare chests are handled. You can set the odds of rare chests spawning at the start, the odds of common chests granting you a free upgrade when you open them, whether or not multiple common chests can become rares at the start or just one at most, whether or not the player can pay gil to upgrade individual chests, and how much gil that would cost. And this is all in addition to being able to hard-set chest types via their Faith in the ENTD.

=====
The last thing to mention is that, since these lists are indeed generated by the ENTD, you will need to set up multiple ENTDs for multiple different sets of rewards. Normally, in TLW, there's only one Treasure Wheel event. Going with the Loot Wheel, unless you want every Rendezvous to use Random loot, you'll need to set up a new event for every single different set of loot, and alter the Rendezvous events' final PostEvent(x81,x????) command to point at the correct one.

The good news is that this is relatively simple to set up. You can copy and paste the ENTDs, and just have to adjust units' equipment, War Trophies, Bonus Money, and/or Faith accordingly. You can also copy and paste the event scripts, just adjusting those first few lines accordingly. Same thing with the ATTACK.OUT and conditional stuff. It's a bit more work than it would be to just adjust the ENTDs if we'd set it up this way from the start, but it is still very doable.
6
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.
7
War of the Lions Hacking / WotL Outfitter Bug
October 06, 2020, 02:24:43 pm
This bug was discovered courtesy of Zeke on the Discord, and I figured I'd just document the path to fixing it here.

Apparently, it is possible to encounter a bug in which the Outfitter tells you "I'm afraid you can't hold any more of that item. Might I interest you in something else?" despite having plenty of space.

Zeke took video clips showing his depleted inventory and the bug in action.

https://i.gyazo.com/9907a479bd4bdcaea7545475e8eccf4e.mp4

https://i.gyazo.com/f21ab6e61d3476d67db8a010c5bedbaa.mp4

Zeke used the slowdown fix patch, but it was still bugged in his vanilla ISO, and apparently this is a very rare issue even in vanilla:

https://gamefaqs.gamespot.com/boards/638808-final-fantasy-tactics-the-war-of-the-lions/62492805

https://gamefaqs.gamespot.com/boards/937312-final-fantasy-tactics-the-war-of-the-lions/48101886

https://gamefaqs.gamespot.com/boards/937312-final-fantasy-tactics-the-war-of-the-lions/4219876

Dakitty on Discord also mentioned that they'd had the same issue once, but had suspected it was the result of using the US slowdown fix on a PAL ISO. They'd had to scrap their entire save file in order to restart on a US ISO.

Zeke, however, WAS using a US ISO.

We ended up suggesting to him to go get the Lion Editor and see if any inventory slots were borked up in the save file. He didn't find anything. But I kept trying different Google searches and finally found something that shed some light on the issue, even if the trigger for the cause was unrelated:

https://code.google.com/archive/p/lioneditor/issues/4

I suggested that given this, there might be a bug with the Nothing slot in Zeke's game - but he might not see it now that the Lion Editor automatically compensates for this bug after having previously caused it itself. I told him to save the file and try again.

And it worked!

So if anyone in the future ever comes across this rare and apparently purely vanilla bug, try a quick fix with the Lion Editor to see if your problem is that you have too much of Nothing.
8
The Lion War / Rendezvous Ideas Thread
September 19, 2020, 11:53:47 pm
There are nine Rendezvous slots remaining right now, and Elric is definitely considering doing something up for them. We were talking about it here on the Discord when I figured, hey, why not put out a topic in case anyone has any good ideas that they want to mention?

Here's what we have so far.

  • Chocobo Race: Unlocks at the start of Ch. 2. Map 103, Windmill Shed.
  • Treasure Hunt: Unlocks at the start of Ch. 2. Map 78, Zigolis Swamp.
  • Teioh: After the Zaland/Mustadio battle. Map 80, Araguay Woods.
  • Lost Heirloom: After saving Besrodio. Map 40, Slums in Goug.
  • The Fete: At the start of Ch. 3. Map 13, Inside of Lionel Castle.
  • Desert Minefield: After Orbonne Monastery. Map 76, Zeklaus Desert.
  • Littering: After Yardow's Rafa/Malak battle. Map 27, Goland Coal City.
  • Shades of the Past: At the start of Ch. 4. Map 91, Thieves' Fort.
  • The Knights Templar: After the Bethla Sluice battle. Map 3, Hall of St. Murond Temple.
  • All-Star Melee: After the Murond battles. Map 22, Magic City Gariland.
  • The Guarded Temple: After the Murond battles. Map 70, Nelveska Temple.
  • Nightmares: After the Murond battles. Map 17, Underground City of Limberry Castle.
  • Brave Story: After the Murond battles. Map 61, Underground Book Storage Fifth Floor.
  • Ill Wind: After the Murond battles. Map 49, Fort Zeakden.

Currently, the treasure wheel works by saving the Current Map Number to another variable during the rendezvous event, and then checking that during the treasure wheel to determine which loot set the player should get. As a result, any new Rendezvous battles should not use maps already in use.

It'd be a bit preferable to get a one-battle Rendezvous to go with the After Sluice unlock (as the Knights Templar is a battle sequence) and to get a sequence to go with the Chapter 4 unlock, as the treasure wheel currently increases the odds of rare items & number of chests to open if the player did a battle sequence rather than just one battle.

The ideal might be to add one battle to every unlock point that only has one battle as is. There are five pre-Chapter 4 Rendezvous like this, and the two previously mentioned post-Ch.4 Rendezvous. That still leaves two more Rendezvous free, which can maybe be added into those two Chapter 4 points.

So if anyone's ever had any ideas for some possibly interesting one-off battles in FFT, now's the time to mention them! If Elric likes an idea well enough, you might see it featured in the next release of The Lion War!
9
The Lion War / The Treasure Wheel
September 06, 2020, 09:27:36 pm
Here's a couple videos showing what the Treasure Wheel will look like in the next version of TLW, after the Rendezvous missions are included as single player content, in case anyone's interested. (It is still in debug mode, though, which is why you can choose from a list of loot sets. That won't be an option in game.)

There's a lot about the WotL treasure wheel that left me unimpressed. In fact, why does it even exist? There's no apparent reason to have it, since each chest is just a totally random piece of loot - this would go much faster for the players if it just gave them a reward list with randomly generated War Trophies. On top of that, the mechanics for determining loot seem to be poorly understood by players, since the system is so hazy about how to get anything. And then the loot pools are so large, it's nearly impossible to actually get anything that you're seeking.

So I completely reworked the concept.

1: Loot is separated into four subsets: Weapons, Armor, Accessories, and Consumables. This allows players to be able to target a specific kind of loot. 
I wasn't going to include the last category, since if there were nothing but Chemist items it would be fairly dull - however, some talk on Discord about the difficulty of getting late-game katanas to be able to actually run Draw Out convinced me to add them to the pool as well, with Consumable chests being able to reward multiple katanas (unlike Weapon chests rewarding just one).
Later on, once we had TLW 2.0 in beta and could watch multiple people streaming it, I realized real quick that no one was ever going for Consumables even with katanas thrown into the pool, so I removed every Item except Elixirs, allowing the player to get Ninja Balls as a weaker reward, Elixirs as a pretty decent reward, and katanas as a fairly great reward. I also retooled the progression so that whenever the player does an older Rendezvous, the common Consumables are always randomly 1-10 Elixirs. This actually makes the Elixir skill worth learning for probably the first time, since Rendezvous are now a viable way to accumulate Elixirs. It also helps make sure that older Rendezvous will always have something worth looting.

2: Rare items are rewarded based on a dual check system. Specially colored chests can be generated, and they are guaranteed to carry a rare item. But even if you don't get a special chest, you still have a secondary chance of just getting a rare from a common chest. Until Chapter 4, you have a 50% chance of getting a single Silver Chest and a 25% rare chance from any common chest. Those rares will reward the player with loot that hasn't been unlocked at a shop yet.
After Chapter 4, the Treasure Wheel background changes from silver to gold, and Silver Chests no longer appear. Instead, you have a 5% chance of getting a single Gold Chest, and a 5% rare chance from any common chest. At first, this seems like a downgrade - but once the wheel has turned gold, you can pay gil to slowly increase the odds and continually reroll the Gold chance until the current chest is gilded, and you can do this with every single chest in the wheel if you so desire. Gold Chests will exclusively reward loot that can never be bought at a shop.
Also, after some playtesting, I retooled the Rare system to scale up to the start of Chapter 4, no matter which Rendezvous the player does, based on which Rendezvous they've unlocked. In that way, Rare items are always all but guaranteed to give loot you can't (yet) buy at a shop. It does stop scaling after the start of Chapter 4, to encourage the player to not just keep spamming the easiest Rendezvous battles for easy Excaliburs, but even then, the Rare loot is still stuff that isn't buyable.

3: While the player will be able to open three chests by default, battle sequences such as Knights Templar or Brave Story, or particularly hard battles like Guarded Temple, will increase the number of chests that can be opened, as well as increase the odds of getting a Gold Chest at the start.

4: The player can Cash In unopened chests. This was inspired by a suggestion from a beta tester. If the player is doing an older Rendezvous, doesn't get any rare chests, doesn't need Elixirs, and isn't in a position to pay to reroll chests until they become rare, they can instead opt to cash in their remaining chests for gil. The amount of gil increases as new sets of Rendezvous are unlocked. They also get more gil depending on the number of chests remaining. Furthermore, after beating the game at least once, a second Cash In option is unlocked - one that rewards JP to every unbenched unit's current job.


With all this, I intend to justify the existence of the Treasure Wheel instead of just tossing the player some randomly generated loot, as well as giving the player the ability to work around the RNG to a large degree, though without going so far as to basically make rare loot purchasable.

Below are two videos of the rough alpha version of the Treasure Wheel, to give you an idea of how Silver and Gold wheels work.


10
I've attached a .rar archive of all the fixed Deep Dungeon .GNS files. Open your ISO in CDMage, go to the MAP section, and import these files over the existing .GNS files. After that, all your Deep Dungeon maps will start fully lit, and stay that way. Unless you ChangeMap to them with event commands, anyway.

Also, Pride set up an XML to do this via OrgASM down below, which ought to be quicker and easier than importing each individual GNS file in CDMage.
11
War of the Lions Hacking / Valhalla Editor
April 12, 2020, 03:35:25 pm
So the only reason I heard about this editor is that it was mentioned on Reddit. There seems to be next to no discussion about it on Reddit, GameFAQs, or here, so as far as I know it was just spawned out of the ether by a ghost.

It seems to allow modders a whole lot more functionality, and while I've not experimented with it at all myself, I figured I should at least put a link up to it so that people can find it more easily. A PSP ASM tool is so rare and unique it's worth it, I think.

You can find it here. I've also uploaded it to this topic just in case that link ever goes down, since who knows what's going on with the author there.

If anyone has any more to add about this, feel free to mention it in this topic. I know @BleuVII has mentioned using it before, at least, and like I said - there is just no existing discussion about this tool that I can find so far.

Note: You also need to download the Python deps file and merge it into the Valhalla folder in order to get it to run. That link is dead. Try taking this python folder and inserting it into the Valhalla folder, merging it with the existing python folder. See if that does it.
12
Originally this topic talked about using Ganesha to edit the lighting of the maps. However, the maps have a hard cap on the max amount of light allowed per state, with the highest light levels only being allowed on states inaccessible to the ATTACK.OUT editor. This post has now been altered to show how to make them work with full light, which is done via hex editing instead.

If you just want to download the files directly without editing them yourself, you can find them here.


All credit goes to Xifanie, of course! She's the one who showed me what to edit in the first place.

To get this to work, you've got to do some hex editing. To the best of my understanding, the Deep Dungeon maps use multiple different states to determine the lighting, and the fully lit map is set as the fifth state. Which you can't access with the ATTACK.OUT editor since only the DD maps work this way. So, instead, we just hex edit the .GNS files for each of the maps to set all four previous states to have the same texture lighting settings as the fifth.

Open up your ISO in CDMage. Open the MAP section. Scroll down to the .GNS files for each of the maps (you can tell which of them is which by looking at the numbers on FFH's Maps page). Export them. Open them up in a hex editor. I'm using HxD, personally, and I don't have a whole lot of experience with other hex editors so I'm not sure how they might look, but hopefully enough of the process is similar to be able to follow along. For the sake of this example I'm going to be cracking open MAP106.GNS.


It's currently set to show the rows 16 bytes wide, but it'll be a lot easier to see the parts we need if they're set to 20.


Now you can see the five separate states labeled in order here under column 02. They start at 00, not 01, as is common with hexadecimal work, so they go from 00 to 04. And 04 is where the useful data is. Looks like the only difference is with the bytes under column 08, so let's take the one from state 04 and copy it to 00-03.


That's that. Save it, reimport it with CDMage, and test it out in game.

Edit: It turns out that if a specific byte is set to a different value than in the other states, it'll spawn a glitched second level that crashes your game depending on the tile. And Map 112 has this problem. You'll also need to edit that byte so it matches the value that the other states have.



Success.
13
Tutorials and Learning / Ability Effect Chart
November 09, 2016, 09:34:23 pm
I put this together for my own purposes a ways back when I was planning out all the Jot5 abilities that would be featured in future chapters. There's an Effect Video Compilation that shows how every Effect in the game works, but it's tedious to go through all of them wondering "will this one show properly for AoE or not?"

I don't know if this'll end up being useful for anyone, but I figured no point in letting the chart go to waste, so I'll be putting it below for anyone interested.

Quote from: R999 on March 18, 2010, 03:48:11 am

10 effects per video. Multi-target effects will be shown on 2+ targets.

Use Cmd+F or Ctrl+F  to search

Goals:

To be able to observe:

  • if the effects works on multiple targets, if so how does it look like (whether it is the repeated effect, broken into separate parts, or something else)

  • where the effect is centered on (whether it is the cursor location, average of enemy locations, first target location, self, or center of map)

  • determine if the effect has different phases (for example Cure4 has two phases (first phase is centered on caster, second phase occurs on each target)

  • the sound effects

  • the speed/pace of spell

  • whether the effect can display aftermath status (damage taken, stat change, etc) on single or multiple targets



=========================================================================================
Effects Set 1

1 001   Cure       
2 002   Cure 2       
3 003   Cure 3       
4 004   Cure 4       
5 005   Raise       
6 006   Raise 2       
7 007   Reraise       
8 008   Regen/Regenerator       
9 009   Protect       
10 00A   Protect 2

=========================================================================================
Effects Set 2

1 00B   Shell       
2 00C   Shell 2       
3 00D   Wall       
4 00E   Esuna   
5 00F   Holy       
6 010   Fire       
7 011   Fire 2       
8 012   Fire 3       
9 013   Fire 4

=========================================================================================
Effects Set 3

1 014   Bolt       
2 015   Bolt 2       
3 016   Bolt 3       
4 017   Bolt 4       
5 018   Ice       
6 019   Ice 2       
7 01A   Ice 3       
8 01B   Ice 4       
9 01C   Poison       
10 01D   Frog

=========================================================================================
Effects Set 4

1 01E   Death       
2 01F   Flare       
3 020   Haste       
4 021   Haste 2       
5 022   Slow       
6 023   Slow 2       
7 024   Stop       
X 025           
X 026           
8 027   Don't Move       
9 028   Float       
10 029   Reflect

=========================================================================================
Effects Set 5

1 02B   Summon Demon       
2 02C   Quick/Critical Quick       
3 02D   Demi       
4 02E   Demi 2       
5 02F   Meteor       
X 030           
6 031   Blind       
7 032   Aspel       
8 033   Drain       
9 034   Faith/Face Up       
10 035   Innocent

=========================================================================================
Effects Set 6

1 036   Zombie       
2 037   Silence       
3 038   Berserk/Brave Up       
4 039   Chicken       
5 03A   Confuse       
6 03B   Despair       
7 03C   Don't Act       
8 03D   Sleep       
9 03E   Break       
10 03F   Moogle

=========================================================================================
Effects Set 7

1 041   Shiva       
2 042   Ramuh       
3 043   Ifrit       
4 044   Titan       
5 045   Golem (freezes game at end of effect if not using golem formula)       
6 046   Carbuncle       
7 047   Bahamut       
8 048   Odin       
9 049   Leviathan       
10 04A   Salamander   

=========================================================================================
Effects Set 8

1 04C   Silf       
2 04D   Fairy       
3 04E   Lich
4 04F   Cyclops       
5 050   Zodiac       
6 051   Angel Song       
7 052   Life Song       
8 053   Cheer Song       
9 054   Battle Song       
10 055   Magic Song   

=========================================================================================
Effects Set 9

1 056   Nameless Song       
2 057   Last Song       
3 058   Witch Hunt       
4 059   Wiznaibus       
5 05A   Slow Dance       
6 05B   Polka Polka       
7 05C   Disillusion       
8 05D   Nameless Dance       
9 05E   Last Dance       
10 05F   Spin Fist

=========================================================================================
Effects Set 10

1 060   Repeating Fist       
2 061   Wave Fist       
3 062   Earth Slash       
4 063   Secret Fist       
5 101   064   Stigma Magic       
6 102   065   Chakra       
7 103   066   Revive       
8 104   067   Gil Taking/Gilgame Heart       
9 105   068   Steal Heart       
10 106   069   Steal Helmet

=========================================================================================
Effects Set 11

1 107   06A   Steal Armor       
2 108   06B   Steal Shield       
3 109   06C   Steal Weapon       
4 110   06D   Steal Accessory       
5 111   06E   Steal Experience       
6 112   06F   Invitation       
7 113   070   Persuade       
8 114   071   Praise       
9 115   072   Threaten       
10 116   073   Preach   

=========================================================================================
Effects Set 12

1 117   074   Solution       
2 118   075   Death Sentence       
3 119   076   Negotiate       
4 120   077   Insult       
5 121   078   Mimic Daravon       
6 122   079   Pitfall       
7 123   07A   Water ball       
8 124   07B   Hell Ivy       
9 125   07C   Carve Model       
10 126   07D   Local Quake

=========================================================================================
Effects Set 13

1 127   07E   Kamaitachi       
2 128   07F   Demon Fire       
3 129   080   Quicksand       
4 130   081   Sand Storm       
5 131   082   Blizzard       
6 132   083   Gusty Wind       
7 133   084   Lava Ball       
8 134   085   Asura       
9 135   086   Koutetsu       
10 136   087   Bizen Boat

=========================================================================================
Effects Set 14

1 137   088   Murasame       
2 138   089   Heaven's Cloud       
3 139   08A   Kiyomori       
4 140   08B   Muramasa       
5 141   08C   Kikuichimoji       
6 142   08D   Masamune       
7 143   08E   Chirijiraden       
X 144   08F           
8 155   09A   Dash/Wing Attack       
X 156   09B           
9 157   09C   Heal       
10 158   09D   Yell

=========================================================================================
Effects Set 15

1 159   09E   Cheer Up       
2 160   09F   Scream       
3 161   0A0   Ultima (lvl1)       
4 162   0A1   Wish       
X 163   0A2           
5 164   0A3   Stasis Sword       
6 165   0A4   Split Punch       
7 166   0A5   Crush Punch       
8 167   0A6   Lightning Stab       
9 168   0A7   Holy Explosion       
10 169   0A8   Shellbust Stab   

=========================================================================================
Effects Set 16

1 170   0A9   Blastar Punch       
2 171   0AA   Hellcry Punch       
3 172   0AB   Icewolf Bite       
4 173   0AC   Dark Sword       
5 174   0AD   Night Sword       
6 175   0AE   Dark Holy       
7 176   0AF   Deathspell 2       
8 177   0B0   Galaxy Stop       
9 178   0B1   Heaven Thunder       
10 179   0B2   Asura

=========================================================================================
Effects Set 17

1 180   0B3   Diamond Sword       
2 181   0B4   Hydragon Pit       
3 182   0B5   Space Storage       
4 183   0B6   Sky Demon       
5 184   0B7   Heaven Thunder Back       
6 185   0B8   Asura Back       
7 186   0B9   Diamond Sword Back       
8 187   0BA   Hydragon Pit Back       
9 188   0BB   Space Storage Back       
10 189   0BC   Sky Demon Back   

=========================================================================================
Effects Set 18

1 190   0BD   Sunken State       
2 191   0BE   Shadow Stitch       
3 192   0BF   Stop Bracelet       
4 193   0C0   Summon Angel       
5 194   0C1   Shock (byblos)       
6 195   0C2   Difference       
7 196   0C3   Seal       
8 197   0C4   Chicken Race       
9 198   0C5   Hold Tight       
10 199   0C6   Darkness

=========================================================================================
Effects Set 19

1 200   0C7   Lose Voice       
2 201   0C8   Loss       
3 202   0C9   Spell       
4 203   0CA   Nightmare       
5 204   0CB   Death Cold       
6 205   0CC   Magic Ruin       
7 206   0CD   Speed Ruin       
8 207   0CE   Power Ruin       
X 208   0CF           
9 209   0D0   Mind Ruin       
X 210   0D1           
10 211   0D2   Blood Suck

=========================================================================================
Effects Set 20

1 212   0D3   Allure       
2 213   0D4   Bio       
3 214   0D5   Bio       
4 215   0D6   Bio       
5 216   0D7   Bio 2       
6 217   0D8   Bio 2       
7 218   0D9   Bio 2       
8 219   0DA   Bio 2       
9 220   0DB   Bio 3       
10 221   0DC   Bio 3   

=========================================================================================
Effects Set 21

1 222   0DD   Bio 3       
2 223   0DE   Magic Barrier       
X 224   0DF           
3 226   0E1   Very Quick Bloody Strike (don't exist?)    
4 227   0E2   Very Quick Strike (damage output or status output will display twice)       
X 228   0E3           
5 229   0E4   Melt       
6 230   0E5   Tornado       
7 231   0E6   Quake       
8 232   0E7   Teleport 3: Send       
9 233   0E8   Teleport 3: Arrive       
10 234   0E9   Toad 2   



=========================================================================================
Effects Set 22

1 235   0EA   Gravi 2       
2 236   0EB   Flare 2       
3 237   0EC   Blind 2       
4 238   0ED   Small Bomb (blue)       
5 239   0EE   Small Bomb (black)       
6 240   0EF   Confuse 2       
7 241   0F0   Sleep 2       
8 242   0F1   Ultima (lvl2)       
9 243   0F2   All-Ultima       
10 244   0F3   Mute   

=========================================================================================
Effects Set 23

1 245   0F4   Despair 2       
2 246   0F5   Return 2       
3 247   0F6   Shock (M. Sword)       
4 248   0F7   Braver       
5 249   0F8   Blade Beam       
6 250   0F9   Cross Slash       
X 251   0FA           
7 256   0FF   Climhazzard       
8 257   100   Meteorain       
9 258   101   Finish Touch       
10 259   102   Cherry Blossom

=========================================================================================
Effects Set 24

1 260   103   Omnislash       
2 261   104   Potion/Auto-Potion/Distribute       
3 262   105   Antidote       
4 263   106   Eye Drop       
5 264   107   Hi-Potion/HP Restore       
6 265   108   Remedy       
7 266   109   Echo Grass       
8 267   10A   X-Potion       
9 268   10B   Soft       
10 269   10C   Phoenix Down   

=========================================================================================
Effects Set 25

1 270   10D   Ether/Absorb Used MP       
2 271   10E   Holy Water       
3 272   10F   Maiden Kiss       
4 273   110   Hi-Ether/MP Restore       
5 274   111   Elixir/Dragon Spirit       
X 275   112           
6 289   120   Blind       
7 290   121   Spell Absorb       
8 291   122   Life Drain       
9 292   123   Pray Faith       
10 293   124   Doubt Faith   

=========================================================================================
Effects Set 26

1 294   125   Zombie       
2 295   126   Silence Song       
3 296   127   Blind Rage       
X 297   128                   
4 307   132   White Talk skill       
5 308   133   Ice Bracelet       
6 309   134   Fire Bracelet       
7 310   135   Thunder Bracelet       
8 311   136   Dragon Tame       
9 312   137   Dragon Care       
10 313   138   Dragon Power Up   

=========================================================================================
Effects Set 27

1 314   139   Dragon Level Up       
2 315   13A   Holy Bracelet       
X 316   13B           
3 317   13C   Choco Attack       
4 318   13D   Choco Ball       
5 319   13E   Choco Meteor       
6 320   13F   Choco Esuna       
7 321   140   Choco Cure        
8 322   141   Tackle       
9 323   142   Goblin Punch       
10 324   143   Turn Punch

=========================================================================================
Effects Set 28

1 325   144   Eye Gouge       
2 326   145   Mutilate       
3 327   146   Bite       
4 328   147   Small Bomb (red)       
5 329   148   Self Destruct       
6 330   149   Flame Attack       
7 331   14A   Spark       
8 332   14B   Cat Scratch       
9 333   14C   Cat Kick       
10 334   14D   Blaster   

=========================================================================================
Effects Set 29

1 335   14E   Poison Nail       
2 336   14F   Blood Suck (Vampire)       
3 337   150   Tentacle       
4 338   151   Black Ink       
5 339   152   Odd Soundwave       
6 340   153   Mind Blast       
7 341   154   Level Blast       
8 342   155   Knife Hand/Damage Split       
9 343   156   Thunder Soul       
10 344   157   Aqua Soul

=========================================================================================
Effects Set 30

1 345   158   Ice Soul       
2 346   159   Wind Soul       
3 347   15A   Throw Spirit       
4 348   15B   Zombie Touch       
5 349   15C   Sleep Touch       
6 350   15D   Drain Touch       
7 351   15E   Grease Touch       
8 352   15F   Wing Attack       
9 353   160   Look of Devil       
10 354   161   Look of Fright   

=========================================================================================
Effects Set 31

1 355   162   Circle       
2 356   163   Death Sentence       
3 357   164   Scratch Up       
4 358   165   Beak
5 359   166   Shiny Love       
6 360   167   Feather Bomb       
7 361   168   Beaking       
8 362   169   Straight Dash       
9 363   16A   Nose Bracelet       
10 364   16B   Oink   

=========================================================================================
Effects Set 32

1 365   16C   Pooh-       
2 366   16D   Please Eat       
3 367   16E   Leaf Dance       
4 368   16F   Protect Spirit       
5 369   170   Calm Spirit       
6 370   171   Life Spirit       
7 371   172   Magic Spirit       
8 372   173   Shake Off       
9 373   174   Wave Around       
10 374   175   Mimic Titan   

=========================================================================================
Effects Set 33

1 375   176   Gather Power/Caution       
2 376   177   Blow Fire       
3 377   178   Tentacle       
4 378   179   Lick       
5 379   17A   Goo       
6 380   17B   Bad Bracelet       
7 381   17C   Moldball Virus       
8 382   17D   Stab Up       
9 383   17E   Sudden Cry       
10 384   17F   Hurricane   

=========================================================================================
Effects Set 34

1 385   180   Ulmaguest       
2 386   181   Giga Flare       
3 387   182   Dash       
4 388   183   Tail Swing       
5 389   184   Ice Bracelet       
6 390   185   Fire Bracelet       
7 391   186   Thunder Bracelet       
8 392   187   Triple Attack    (freezes game without special flags?)   
9 393   188   Triple Bracelet       
10 394   189   Triple Thunder   

=========================================================================================
Effects Set 35

1 395   18A   Triple Flame       
2 396   18B   Dark Whisper       
3 397   18C   Foxbird       
4 398   18D   Confusion Song       
5 399   18E   Energy       
6 400   18F   Parasite       
7 401   190   Dispel Magic       
8 402   191   Snake Carrier       
9 403   192   Poison Frog       
10 404   193   Midgar Swarm

=========================================================================================
Effects Set 36

1 405   194   Paralyze       
2 406   195   Sleep       
3 407   196   Petrify       
4 408   197   Lifebreak       
5 409   198   Nanoflare       
6 410   199   Grand Cross       
7 411   19A   Destroy       
8 412   19B   Compress       
9 413   19C   Dispose       
10 414   19D   Crush   

=========================================================================================
Story Related Effects
Story Effects Set 37

1 451   1C2   Dejeon: Send (orbonne, battle vs Rofel)    (only visible on level 1 panels)
2 452   1C3   Scorpio's Revive spell (Rafa revives Malak)    (target shows no reaction ie not in pain)   
3 453   1C4   Altima's Ultimate Transformation       
4 454   1C5   End of the World (Altima's Death)        (freezes on certain maps? special flags?)
5 455   1C6   Banish (Murond's entrance)        (turns screen to white at the end, and statys white)
6 456   1C7   Fire (unknown)        (freezes at the end)
7 457   1C8   Flood (Bethla Sluice)    (freezes on certain maps?)   
8 458   1C9   Fire Explosion (Fort Zeakden)       
9 459   1CA   Strong Fire Explosion (Fort Zeakden)    (camera flies up at the end, stays for a while)   
10 460   1CB   Mini Explosion (Fort Zeakden)



The effects are a shade of green if they work with AoE, and blue if they do not. "Multi" means multiple target (so AoE), "Rep." is for Repeating, as in whether the ability's full effect will repeat for every unit affected by it.
14
So I was poking around the Onion Knights and reading here about them, trying to think about some ways to make them more viable for use in the game.

I know the idea of giving them a standard skillset means that the skillset is inherently tied to whatever they've learned in Squire as opposed to their own skillset's abilities. I mean, it works, but it's messed up that way. And if you're changing Squire's skillset, or OK's requirements, there's no guarantee you'll have every ability going into OK.

But something I haven't seen pointed out on here is that, if you change their skillset's Action Menu command to Monster, then Onion Knights always have 3 guaranteed abilities - four, if you put four abilities in the set and walk next to a Beastmaster.

Just thought I'd throw that out there for anyone that might be interested. 3 abilities at least makes the OK halfway decent, right? Depends on how powerful your chosen abilities are...

Something to note is that this setup not only prevents other classes from using the OK's action skills, but it doesn't prevent them from using any support or movement skills you learn in the OK (if you equip Accumulate JP or use that small amount of starter JP, since that's the only way to get any).
15
Spriting / Male Mystic Knight (probably final)
July 05, 2015, 04:10:32 pm
So Twin came up with a portrait back in April for this little spriting project of mine, and at the time I didn't immediately want to use it since I wanted to try to learn from the example first.

And then, uh, I never actually did that. And then I also forgot to include it here.

Despite using the portrait as my avatar for friggin' ever by now.

So I'm putting it in today, before I forget again! I did slightly edit his portrait, but only by, like, ten pixels.

This MK comes with a second green palette to match my avatar, because why not.


Took some suggestions from Twinees and added two more colors into the sprite to give it its full 16 per palette. Mostly focused on filling in more of the shirt with the new dark purple color - there are more sleeves instead of shadows.
Also fixed up a lot of the arm/cloak frames now that I'm using more color and less shadow in them.
Twinees was also able to provide me a much better turban design for the portrait, which I'm now using.

In fact, I sent several messages to Twinees over the last few days, giving me some vital feedback as I worked on the sprite. Twinees is boss.

I don't yet have any more than a single palette in for this version. It's late-o-clock here and I'll get to that another day. Feel free to suggest color schemes if you're interested though! (i.e. brown cloak, grey clothing, red trim)



Note that I am still editing the sprite as feedback comes in. Until I have a new version ready, I won't be changing the files on this post.

I noticed we didn't have one of these in the Sprites section, so I made one using Beowulf as a base.

Preview with all five palettes, and compared to Mystic Knight sprites from other games:
    

And now I've got one I put together from the Knight sprite instead:

16
I'm playing around with adding Ladd as a guest up until the waterfall battle, where he then chooses to stay with Ramza rather than betray the team with Gaffgarion. He's just got one line at the moment, but it's the last one, and doesn't close.

This is what it looks like unedited: Ramza says Ovelia won't be another Tietra, then talking ends.

WaitForInstruction(x04,x00)
Wait(00016)
DisplayMessage(x10,x92,x000E,x02,x00,x00,+00000,+00008,+00000,x03)
WaitForInstruction(x01,x00)
CloseDialog(x02,xFFFF,x00,x00)
WaitForInstruction(x01,x00)
{6A}(r021E0001FA)
{6A}(r0B460000FA)
{1C}(r02)
Focus(x0C,x00,x0C,x00,x00)

Edited. Ladd, with the ID of Orran (he's getting a custom job/sprite for this, and I figured it would be best to make his Unit ID match his job)

WaitForInstruction(x04,x00)
Wait(00016)
DisplayMessage(x10,x92,x000E,x02,x00,x00,+00000,+00008,+00000,x03)
WaitForInstruction(x01,x00)
CloseDialog(x02,xFFFF,x00,x00)
WaitForInstruction(x01,x00)
Wait(00030)
Focus(x15,x00,x15,x00,x00)
Camera(+18539,-09805,-01847,+00302,+03584,+00000,+04096,+00032)
WaitForInstruction(x04,x00)
Wait(00016)
DisplayMessage(x10,x92,x0029,x15,x00,x00,+00000,+00008,+00000,x03)
WaitForInstruction(x01,x00)
CloseDialog(x01,xFFFF,x00,x00)
WaitForInstruction(x01,x00)
Wait(00010)

{6A}(r021E0001FA)
{6A}(r0B460000FA)
{1C}(r02)

As well, Message 29 is unused in the TEST.EVT.

//Message x28
{font:08}Gaffgarion{br}
{font:00}Damn it...{end}

//Message x29
{font:08}Ladd{br}
{font:00}Gaffgarion, you bastard!{br}
{br}
You think I'll betray them?{br}
No way!{br}
{br}
{Ramza}! I'm with you!{end}


Anyone know what I'm missing when it comes to making a text box close?
17
Help! / Making new Weapon Strike based skills
October 30, 2011, 11:22:18 pm
I've been trying to make some weapon strike skills work... mostly simple stuff for a revamped Archer, things that will allow the archer to fire a poison shot, a sleep shot, a mana restoration shot (mostly because I found that one amusing), and a death shot.

Anyway, I managed to get them all functioning wonderfully, but when I use the skills with a melee weapon, they won't show the damage done or effects inflicted. The spells use the FFFF animation, formula 2D for the damage ones; ether formula for the mana shot, and they're basically copies of the Rend skills.

I know the effects of the Rend skills appear even when you do them with a melee weapon, so I'm wondering if there's anything I could possibly be missing as I work on this.
18
Help! / Weapon modification
October 27, 2011, 05:59:46 pm
I haven't made any major, sweeping changes yet, but I was planning on doing such things as changing all Flails into Axes, changing Axes to the 2D formula (which gives them the same effect as the Sword formula), changing the Books into Bags, changing some Knives into Ninja Blades...

Anyway, I've been testing this weapon swapping on Dragoons, and when I tried changing a polearm into a bag, it seems to work okay - except when attacking, the final outstretched animation changes it into a bow.

Is there something I don't know about weapon editing that's coming back to bite me on the ass? >_>

The attributes of the Spear match the attributes of the Croakadile Bag for palette, graphic, item type, second table, range, formula, weapon power,
Striking, Lunging, 2 Hands, and Throwable.

(I'll be playing with more editing after posting this, seeing if it glitches for other weapon types too.)

Edit:

Hmm. Changing the options in Patcher failed even harder for the Flail -> Axe, Ninja Blade -> Knife (graphic), and Book -> Bag... this time instead of one animation being wonky and the others successful, none of them changed in the slightest. :/
19
First, I hope this is the right board for this :P

Secondly, can I just make a request, for anyone coming in hoping to modify the text of the PSP version, to have the 457 TacText file either included in the most recent Patcher Suite, or to have it or its Patcher Suite up separately?

It took me several days and required me to open my own topic before I was able to find out what the problem was (the TacText files currently on that tab seem to be totally incompatible with War of the Lions) and to find a copy of the download.

The download address for a 457 bundle right now is here: ffhacktics.com/smf/index.php?action=dlattach;topic=7837.0;attach=8927
20
Solution:
Quote from: pesmerga001 on October 03, 2011, 12:09:06 am
You are using fftactext 457 right? Thats the ONLY one i have gotten to work for the psp...
Also, have a clean ISO, I had the same stinking problem a while back.
I tried it with a clean iso, no prob, then i tried it again 5 min after patching it with tactext, then it failed so...my guess its a one time deal.

(Linked:) ffhacktics.com/smf/index.php?action=dlattach;topic=7837.0;attach=8927


Quote from: RandMuadDib on October 02, 2011, 04:13:29 pm
Delete all of the japanese characters you find, save your file as an fftext or whatever, CLOSE FFTACTEXT, and then reopen it, load the file, then try patching. If that doesn't work, try shortening some descriptions oe other entries in the .lzw file that tactext is complaining about.


I've been trying to edit an ISO that I pulled myself from my physical copy of Final Fantasy Tactics: War of the Lions.

I can't edit the text in any way, shape, or form using TacText Editor. If I take my copy of an unchanged ISO, open it with TacText, change nothing, save that as Unchanged.fftext, open that, then try to patch the ISO it came from ... "DTE for BOOT.BIN 5 Failed. ISO was NOT changed!"

I'm currently copying the ISO over to my computer again, just to double-check that.

Edit: I've also gotten the "DTE for Open.LZW failed" message a couple times, too, while trying to patch the actual modified text.


Fixed, thanks to following the tips from these two. I haven't needed to delete Japanese characters yet though :)