• Welcome to Final Fantasy Hacktics. Please login or sign up.
May 11, 2021, 04:03:54 am


Don't be hasty to start your own mod; all our FFT modding projects are greatly understaffed. Find out how you can help in the Recruitment section.

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 - DarthFutuza

Editing Brave Story Bio Entries
Version: 1.0.02
Updated: 03/02/2020

Tools You'll Need:
  • FFTactext
  • ATTACK.OUT Editor Special Awesome 2.0
  • CDMage
These tools can all be found here.

Preface: This tutorial assumes you've already got a little event editing experience (prerequisite) and that your mod is being built on the vanilla psx game with no other expected conflicts.  The tutorial assumes that you want to leave the vanilla game as intact as possible.  It assumes your art assets are already ready to go (such as your portraits).

1) Plan out which brave story slot to use.  Refer to the wiki's variable list and find a slot that is unused.  As an example, we'll be using id: $3C (Flag1020) at address 0x03FC.  It isn't currently in use and is right next to Daravon making it nice and easy to find, since it is only offset by 1.  Keep in mind that each entry is 16 bits (and uses one of those bits as a null separator), this will come in use later on.

2) Plan out your bio entry text.  Open up FFTactext and navigate to character bios4.  But first an explanation, bios1-4 refers to which chapter the bios gets updated.  Technically this can be done in a different chapter as long as you use the right variables (eg: You can update someone in chapter 1 even though you stored their data in bios4), that said its poorly organized and I wouldn't recommend you do that unless you're really squeezing the game for every last bit and have absolutely no memory left anywhere else.  No one can help you if you do that.  For the purposes of this tutorial, we'll be using one from bios4, because it has the most empty space and gives us room to play around.  Okay let's jump down to entry #193.  Why 193?  It is offset from the entry for Daravon by 16 and thus easier to find for a tutorial, remember in step 1 I said it'd come in use later?  This is it.  So we'd take a look at the previous entry (Daravon is at 209), and subtract (16*our offset) from that position.  In this situation, we're only offset by 1, so that comes out to 209-(16*1) == 193.  Easy right? 

Another note.  If you want to have multiple brave entry edits throughout the course of your mod/story, you need to reserve room for that to happen and its probably going to make it easiest on you if each separate entry is right next to the other.  This way, when it comes time to edit the variables in the game, you just have to increase the value of that brave story entry by 1 to change the entry to the next version of it.  An example: Say that you want to update Meliadoul's entry after fighting her dad and she confirms the truth that he's turned into a monster.  You would then just have to add one more entry within that reserved 16 spaces (again actually 15, since we can't use position 0 as it serves as a null separator) after the current ones.  There may be a good reason for not having brave story entries right next to each other, such as in the case of adding conditional brave story entries which depend on a player's choice as to which one appears, but in most cases you'll want to just make it easy on yourself and do them right next to each other.

One more thing Jackie! So you're probably thinking, "Cool, I can have 15 stages in a character's brave story".  Not exactly...there's an issue with how the base game set things up.  See the picture below:
We're going with Mel's brave entry again as an example.  Her entry starts at 209 (again technically 208, but that's the null separator I'm talking about).  You can see it explains how she doesn't like Ramza at first cause she thought he killed her brother, blah blah blah.  The next entry (210), is basically the same thing, but is updated for what happens in the story - Mel see's a giant demon mosquito and decides Ramza isn't completely crazy.  Just like what I explained earlier. So if you wanted to have another update for her after facing her father, you'd stick the new update to her brave story right there at 211.  But what if you're sad that Ramza doesn't get anybody to love him and you notice that Mel's of marriageable age and now comfortable around Ramza without wearing perfume?  Ah okay, well after making a bunch of extra events and telling the great love ballad of RamzaXMeliadoul, you've managed to update her brave story entry 9 more times.  Huh.  We're about to run into problem, slot 220 is already occupied, by...wait what?  Meliadoul defects due to circumstances?  Alas, the game has elected to sink your ship for being way too long.  Basically the next 4 entries are reserved for what happens when a unit leaves, such as if you dismiss them, make them go to church too much, or let them turn into a crystal, etc.  Thus you can only update brave story profile entries 11 times.  It'll still let you use those extra slots technically...but that's usually going to break the game or result in nonsensical entries.  And seriously your shipping story is too long.  Brevity is the soul of wit.  Speaking of which...

3) Edit your bio entry text.  We're ready to finally add in a character bio.  For your brand new character let's take a look at Meliadoul's entry as an example:
{0xEC14}         Meliadoul Tingel (Age:{0xE4}){Newline}
          Temple Knight of the Murond Glabados Church.{Newline}
          Daughter of Temple Knight, Vormav.{Newline}
 Her brother, {SP}Izlude, is {SP}thought to {SP}have been {SP}killed by{Newline}
Vormav. To avenge for the death of Izlude, she is after{Newline}
you though.

So that first code bit is the wldface.bin entry (Meliadoul's entry is #14 and you can check it by opening up the wldface.bin file using FFTEVGRP).  So if we're making a new character, just pick an unused slot such as #8 or #9, etc.) and replace it with {0xEC$$} where the $$ is the portrait number in the wldface.bin entry, then you can upload the appropriate portrait later to overwrite that slot. {0xE4} is a stand in for a variable representing that character's age.  You might notice there's a bunch of blank space, this helps separate the text from the image.  The first two lines also have separator space between the image and the text (its 10 spaces), so you should probably copy that pattern (if you want it to look like everyone else's Brave Story entry and not have stupidly different formatting).  You can fit about 55 characters on a normal line, but make sure to only do at most 45 on the first two lines (since otherwise it'll run into the profile image).  I don't know what {SP} is yet, but I'll update this once I do.  I have a theory its just a space, (so you can use double spacing) but I'm not sure since it seems sort of arbitrary.

Anyway go ahead and make an entry.  Also, if you want the unit to have bravestory person entries that reflect when they're fired/killed/etc, be sure to add entries for the last 4 slots.

4) Add the name to the Bio Entry.  Alright, in TacText switch to "Person".  We now need to add the name of the person that shows up in the menu of names under person in the game.  So remember how we're just ahead of Daravon, find him in the list and go up 16.  That should put you on 961 (Daravon's on 977) for the first text entry, go ahead and copy and paste the name of your new character into the 16 fields.  Be sure to leave the null separators between your character and Daravon's, and any previous entries.  961-975 in this example should all have been modified.  I'm not sure if you actually need all 15 of those fields, but the base game does this for all of its characters, so we probably should too.

5) Save as a .ftttext and then go ahead and patch your iso.  Remember to always keep a backup of your original iso/work before you apply changes just in case something goes wrong..

6) Setup the event..  Open up EasyVent Editor Super Perfect 2.0 and load up one of the game's default events that would appropriate to stick your character in.  As an example, instead of using just a new character, I'm going to both edit Mel's brave entry and add a new one for the new character.  So, I'll be picking #448 (Hall of St. Murond Temple Vormav and Meliadoul talk) as my event to edit.  Make whatever changes to the event you need to (see other tutorials for help with that), and then at the end before the dialogue part starts, and just before the last EventEnd() cmd happens, I'll add the following.
//increase Mel's bravestory entry by 1

//set our bravestory entry for our new character to 1
This will first, increase Mel's bravestory one more time, so that she can stop having daddy issues in her bravestory bio.  Then it will first set the variable for our new character to 0 (we do this just in case it wasn't already 0, because it hasn't ever been initialized there's no guarantee it isn't some random number) using the ZERO cmd, then we add 1 to it, to set it to 1.  This will activate our brave story entry for the new character.  (Just a reminder, we used x03FC because that was what slot picked in step 1 for our new character, and Mel's is 03ED).

7) Apply the patch.  Alright that's pretty much it, you made it through.  Go ahead and compile and save your event, then apply it like you would any other event and patch your iso with the new event.  Then go ahead and load up the game and test it to see if it works.  Good luck!

Let me know if I've gotten anything wrong, or need to make any corrections and I'll be happy to update the tutorial.  Hope it helps someone.
Bugs and Suggestions / HTTPS?
November 20, 2019, 11:47:00 pm
So the FFHacktics site certificate evidently expired back in 2017, was just curious if you guys knew about Let's Encrypt?  They'll let you get free SSL/TLS certs so you can enable https or whatever, and its fairly easy to use (Github pages uses it for example).  Seems sorta important to me since there's an actual sign in option (on the forums for example) that isn't being being encrypted, which would allow someone to steal credentials, etc. in transit.  I dunno what the setup on the forums backend software is are exactly (looks like an ancient version of SMF), but I can't imagine it would be too difficult to get https enabled on the site.

Oh geez this reads like an ad doesn't it?  Lol.  Well anyway, just wanted to throw that out there, cause like its 2019 and https is a thing that doesn't really cost money anymore.
Help! / Battle Event Editing
March 18, 2019, 12:23:24 pm
Hello helpful forum goers,

I'm trying to figure out how to add new mid-battle events (sorry if I'm using the wrong term, might be why I can't find instructions on what I want to do).  I get the impression this has something to do with modifying the attack.out, but I'm not really sure where to start.  What I want to do is this: Take a battle without a mid-battle event, say Eldibis/Deep Dungeon, and add a condition with something like if(Ramza's HP < 25%) startDialogueEvent();  And then Ramza would yell something at Eldibis or whatever and then go back to fighting.

Do I need to overwrite one of the pre-existing event slots (say 491 since its unused), or can I just use the existing battle event (115 I think?) and add what I need to it using EasyVent?  Where does editing the Attack.out come in, etc?
Help! / Which portraits in EVTFACE are unused?
March 12, 2019, 01:16:34 am
I looked and couldn't find an answer, hopefully you guys can help me out.  I've been working on making some changes with EasyVent to some scenes, but realized that the DisplayMessage() function can only pull the portraits from EVTFACE.BIN (via Portrait Row etc.) which means if I'm adding a new character, I have to replace someone.  So my question is, which of the portraits are unused by the vanilla game, if any?  I noticed there are a lot of (probably) unnecessary Balbanes repeats.  Can I use Shishi to replace one of these without affecting the vanilla game and use that one for my custom character in events?  Or is there maybe another more practical way to tell the game to use the UnitFace portraits instead with a DisplayMessage() function?  (On PSX version btw).