Users browsing this thread: 1 Guest(s)
FFVI - Lore Complete

#1
Posts: 9
Threads: 1
Thanks Received: 0
Thanks Given: 0
Joined: Sep 2017
Reputation: 0
Status
None
A quick introduction of myself and dev background are further down, as this is my first post, but I'll detail my project first to maintain the common format of threads in this section. Since this actually covers both the mod and the tool I'm using, this post is a bit lengthy; if I should put the tool details in a different subforum/thread, just say the word.

This is actually a two-part project: The FF6 mod itself, and then the internal tools I've developed that I'll eventually make public (probaby via GitHub) once they're further along and have a bit more polish. Beyond the mod itself, I'd very much like to give back to such a generous and knowledgeable community.

- - -

The Mod:
The goal of the project is to add a considerable amount of additional information to the game in the form of expanded dialogues, books, and examinable items. There's a fair bit of FF6 lore that isn't available in the game, but still comes from official sources, if you're willing to do the research (which has actually taken up about half of my time spent on this project). Developer interviews, official guides, etc. Finding the information isn't terribly difficult (quite a few wikis include the information), but I don't trust everything I read to be "canon," so I've also been doing a lot of cross referencing for accuracy, to ensure I'm mostly only including official information, and not just "fanfic."

Another goal is to include additional character events and interactions that developers mentioned they had wanted to include, but didn't due to lack of space, time, or some other reason. I may also flesh out some of the characters a bit more, though I'd be doing so in ways that couldn't really be considered part of the official storyline.

Eg: Mog was criminally glossed over, and probably has more reason to upset than most of the other characters. He effectively loses his entire village; for all we know, he could be the last of his kind. One of those lost probably being his girlfriend (I can elaborate, but see: Molulu Charm and dev interviews). What does he have to say about this? "Oh, hey, you're not dead. Ok, let's go. Also, I know a guy."

Finally, I'd like to do a little rebalancing to make the game a little more interesting. Beyond the usual bug fixes that are often included in patches (eg: The Evade issue), some of the stats in the game just don't have that much use in comparison to other things you could be boosting via espers (I'm looking at you, Stamina). I was also always a bit annoyed by every character being able to learn any spell; really killed some of uniqueness of some of the characters, and made others incredibly undesirable near endgame. BNW's solution to this problem was fantastic, though I don't imagine I'll be going quite as far in my revamps; I'd like most of my revamps to be mostly invisible, outside of the additional content.

I've used the Ted Woolsey Uncensored Edition as a base, as it already includes a lot of critical fixes, and a good translation foundation.

Once ready for release, I'll be providing three versions of the mod:
  • Complete: All features
  • Expanded: Minus the rebalance (all original mechanics and items are vanilla, changes are mostly just cosmetic in nature). Additional events still included.
  • Canon Only: Just the examinable books/objects detailing information about the setting, timeline, and character backgrounds. Nothing that can't be confirmed as coming from an official source.

- - -

Features

Main Features (All Versions):
  • Every book (the books open on tables and bookcases) will be readable, and most will provide additional information about the setting and its timeline.
  • Certain objects in the game will also be able to be examined. Dead end? Well, at least there's probably something there to be "looked" at. It's not all just decoration.
  • Some character dialogue will be expanded or slightly altered to make some details about in-game events a little more clear, or tips to point players in the direction of some easily-missed cutscenes. Eg: I only FINALLY got to see the cutscene between Setzer and Cid on the Blackjack... that window is extremely narrow.
Expanded Features (Non Canon, Optional):
  • Add additional in-game events that devs originally wanted to include, but didn't. Eg: Shadow revealing his identity to Strago in a pub, Gogo and Umaro appearing to some extent in the WoB.
  • More fleshing out of some of the characters that never really got much attention (while trying to stay as close as possible to official data... some extrapolation will be necessary, though).
  • Minor map additions to fill in some missing details. Eg: Where does Castle Figaro house its chocobos in the middle of the desert? What's inside the burned house in Kohlingen?
Rebalance Features (Optional):
  • All stats should be useful in some capacity. Eg: I've already done a quick hack to add 1/4 Stamina to Defense, and reflect that change in all menus.
  • Nerf some of the more OP items that made the game too easy. Eg: Economizer/Celestriad. 
  • I agree with BNW's idea that tents/sleeping bags are too useful. But I don't want to remove them entirely, so I'll just be removing them from store listings.
  • Enforce Esper restrictions, and redo spell lists so characters only learn spells that make sense to their character, while allowing them to remain useful.
  • Alter character abilities that are less useful. Eg: Allow Runic to be replaced with Magitek (Shock would also make sense, but there are already a ton of mods doing that), speed up Bushido.
  • Rebalance spells/abilities that players would normally pass over to be more useful. Eg: Merton/Crusader, Tornado, Spiraler.

- - -

The Tools -- (Warning: Includes minor code samples/examples, feel free to skip if this isn't your thing)
I found manual hex editing and assembly patches became a bit too much of a pain to maintain, as they aren't easy to read without excessive commenting, hard to come back to after a break in development, and creating ROM backups all the time was too much of a chore.

My solution was to create a core "SNES Editing" library in C# to apply the same changes you would via a hex editor or xkas assembly patch. You instantiate a "HexPatcher" object, and then build up your edits in the same way you might a StringBuilder (I used this approach a few years ago to create SQL queries for use with a micro-ORM, Dapper, and it worked really well). While I would normally prefer a more data-oriented approach, creating "patches" directly in C# provides a lot of IDE support (IntelliSense is a crutch I can't leave behind), and rather than memorize a bunch of 65816 opcodes+operands, I can do things via method calls that are quite a bit more readable and self documenting. Not to mention the usefulness of using named constants for common offsets and byte values. Everything ends up reading a bit more like plain English.

Doing things this way, devs could create their own patching programs to produce ROM hacks of a more dynamic nature, with parameters. Example: See the Link to the Past randomizer. It was actually where I got the idea to do all my edits in C#. The idea isn't so much to create a full-fledged tool, so much as to provide a base so making your own is a lot easier and straight-forward.

The core library itself could probably be used for other ROM hacks, not just FF6. Hence why it's its own library. HexPatcher can be used for any basic hex editing, then there's Asm65816Patcher inheriting from it that covers all SNES-specific opcodes, but "renamed" to be a little more obvious as to what some opcodes do. Eg: LDA addr becomes GetAddressValue(ushort address).

Then I have a main "FF6Hack" project utilizing and expanding the library for FF6 specific hacks, as well as containing numerous classes housing named constants/enums for commonly used offsets and byte values. 

Event hacks have their own difficulties, so I made an EventPatcher, also inheriting from HexPatcher, that handles inserting new events. Since free space for new events is a thing, it also include utilities for moving blocks of bytes to new offsets, inserting the appropriate jumps, and returning a MovedBytesReport that details how many bytes were made available and the offset where its safe to insert your new events. With a few extra utility functions for my own hacks, adding a "readable book" to the game is as simple as making some free space, then calling CreateReadableBook(Book bookDetails).

So to sum up: You load your ROM file into a byte array, instantiate a patcher object, build up your edits similar to how you'd build up a StringBuilder, and then when you're ready to apply your edits, you just call patcher.Apply(byte[] byteArrayForYourROM). Finally, write the byte array to file with something like File.WriteAllBytes("patchedRom.smc", byteArrayForYourROM).

In my case, I have a clean version of the original ROM in my project resources, load it into a new byte array, have the program apply all my "patches," and then write to a new file. This avoids having to make frequent backups of the ROM, as I'm always applying my edits to a clean version.

For my own use, I'm basically just using C# patches in the same manner someone else might a batch file + .asm files. To each their own. Do things the way you're most comfortable with. This is just my preference.

I still have a long way to go with this library. I'm still hardcoding a lot of offsets, and have trouble with some of the math involved in translating the different banks to the appropriate offset areas, so I just hardcode quite a few values, and also have the HexPatcher "map" banks to relevant offset bytes (like translating bank CC to 0C). Not really maintainable solutions, so will have to be fixed eventually.

I was about to post a code block of an example use of the patcher, but I think I'll do that with another post in this thread, as this post is already pretty lengthy.

- - -

Other Tools I'm Using
There are still quite a few gaps in my knowledge (some already mentioned). For instance, how to edit maps directly from the C# patcher. Or edit dialogue/item data directly from the C# patcher. How to expand/move banks to create more free space, beyond those minor bits used for event edits. These are things I plan to have the library handle eventually, but for the time being, I'm relying on some of the staple utilities to get the ball rolling:
  • FF3usME: For editing dialogue, renaming things, altering item/esper/character data.
  • FF6LE-CE: For actually placing event flags/tiles in maps.
Until I get those mentioned features implemented in my own code, these utilities allow me to test planned hacks to make sure they don't bork anything, and being able to export/import data is IMMENSELY helpful. Thank you so much, to the dev(s) who worked on them. I am infinitely humbled by your dedication, and hope I can eventually assist the community in a similar capacity for those who prefer a code-first approach (you've already got data-first and user-friendly utilities covered in a way I couldn't hope to catch up with).

- - -

My Background:
Not just to talk about myself, I include this in the event anyone would like to assist in the areas I'm having some trouble on, and wants to know the experience level of the person they'd be dealing with.

I only started getting my feet wet with ROM hacking a little over a week ago. I started getting interested about halfway through my playthrough of Brave New World (fantastic mod, nearing the end of it). Thanks to this site in particular and its wealth of information, I've managed to learn quite a lot more about hex editing, assembly, and event hacking in a relatively short time. It probably also helps that I make my income as a game dev contractor/consultant, setting my own hours for the most part, and my current contract has hit a lull while we wait for our first Steam release to be approved. So, yeah, a lot of 12-18 hour days working primarily on this FF6 hack. I think it's fair to say I've been bitten by the bug; it's the most fun I've had in a long time! Even once the lull breaks, though, I'll still have a lot of time to dedicate to the project, as I'm a shameless shut-in who ops to live in games and personal coding projects.

Most of my dev background is in mid-level languages (C# and Java), but I've also worked JS, PHP, Python, and a little C++. C# is my preferred language, but I've always used whatever tool is most appropriate for the task. Roles at previous companies have also seen me doing a surprising amount of penetration and exploit testing (mostly man-in-the-middle style attacks and light hex editing).

I always wanted to get closer to metal, but I learn mostly by working on things having an actual purpose (if it's not going to see potential use by other people, I lose interest very quickly). So, this has been a great opportunity to finally pick up some Assembly, and learn more about machine language beyond simple string/number replacement in a hex editor.

- - -

Places I Could Use Help:
As stubborn as I am about wanting to do/learn everything myself, and hate asking for help, some assistance in these areas could really accelerate things:
  • After going through every single map, I counted 12 instances of "books open on tables" (fewer than I expected). These were originally the only books I was going to make interactable. That's not really enough to cover the three pages of notes I made for additional information I want to add, though, so I decided to also include bookcases. That... was a different story. I counted around 44, which is WAY more than I have content for. I could just make SOME bookcases interactable, but I prefer consistency, so if anyone has ideas for what else I could have in books, beyond the already mentioned setting history and additional character details, I'd love to get more suggestions.
  • I saw that FF6LE-CE/Zone Doctor was also implemented in C#. I'd love to get permission to lift some of the code. Given the greenlight, even better if I can get some pointers on which classes and methods I should look at if I wanted to, say, place event tiles/flags directly into maps. Ideally, I'd eventually like to be able to do that with a method call like patcher.PlaceEventTile(mapId, x, y, eventId). If I could do that, I could truly implement single-line solutions for each book placement. That'd be keen! I said keen. Bringing it back.
  • Anyone forward me to some info on how to replace dummied monster sprites with custom ones? I didn't find anything in the existing utilities (maybe just didn't look hard enough), and I'd love to put the Nutkin/Nut Eater enemy into the South Figaro area. Sabin is apparently afraid of "Nut Eaters," and I'd LOVE to make reference to that beyond just simple text.
  • In vein with the previous question, any idea of an offset I could branch to in order to make a single character automatically "run" from a battle? Even if it just set their animation to running, without actually running? My first instinct was to look at the Phantom Train battle, but I'm not seeing anything obvious.

- - -

Big thanks to anyone who actually managed to get through that wall of text and put up with my numerous parenthetical statements and run-on sentences. More thanks to anyone who offers suggestions or corrections. To those that can lend development assistance in the form of information, I'll pay you in favors (favors are the best currency).

And if any of this is in the wrong section, or should be split/moved into another thread, again, just say the word! As mentioned, this is my first post here, and possibly a bit presumptuous to do it in the Den, but I've been lurking for ages (previously just to find mods, recently for hacking info), have immense respect for the community, and don't want to step on any toes.

As I said I would, here's a quick example of an example "patch" using the SNES Editing and FF6Hack libraries. This is the one that adds 1/4 of a character's Stamina to their Defense, and reflects that information in the Stats and Equip menus.

Code:
public static class StaminaDefenseHack
{
    private const ushort InBattleDefense = 0x3BB8;
    private const ushort InBattleStamina = 0x3B40;
    private const ushort StatScreenDefense = 0x11BA;
    private const ushort StatScreenStamina = 0x11BA;
    private const ushort EquipBeforeStamina = 0x3002;
    private const ushort EquipBeforeDefense = 0x301A;


    public static void ApplyAll(Asm65816Patcher asm65816Patcher)
    {
        ChangeBattleDefenseAlgorithm(asm65816Patcher);
        ChangeMenuDefenseAlgorithms(asm65816Patcher);
    }


    public static void ChangeMenuDefenseAlgorithms(Asm65816Patcher asm65816Patcher)
    {
        // Replace loaded Defense in Stats screen with new algorithm.
        asm65816Patcher.ChangeOffset(0xC36019);
        asm65816Patcher
            .JumpToSubroutine(0xF1E0);

        // Replace loaded "before" Defense in Equip screen with new algorithm.
        asm65816Patcher.ChangeOffset(0xC39192);
        asm65816Patcher
            .JumpToSubroutine(0xF1EB);

        // Replace loaded "after" Defense in Equip screen with new algorithm.
        asm65816Patcher.ChangeOffset(0xC392D1);
        asm65816Patcher
            .JumpToSubroutine(0xF1E0);

        // Algorithm that changes how Defense is calculated in Stats and "after" Equip screen.
        asm65816Patcher.ChangeOffset(0xC3F1E0);
        asm65816Patcher
            .GetAddressValue(StatScreenDefense)
            .DivideBy2()
            .DivideBy2()
            .AddNumberFromAddress(StatScreenStamina)
            .TerminateSubroutine();

        // Algorithm that changes how Defense is calculated in "before" Equip screen.
        asm65816Patcher.ChangeOffset(0xC3F1EB);
        asm65816Patcher
            .GetAddressValue(EquipBeforeStamina)
            .DivideBy2()
            .DivideBy2()
            .AddNumberFromAddress(EquipBeforeDefense)
            .TerminateSubroutine();
    }


    public static void ChangeBattleDefenseAlgorithm(Asm65816Patcher asm65816Patcher)
    {
        // Replace loaded Defense in battle with new algorithm.
        asm65816Patcher.ChangeOffset(0xC20CD1);
        asm65816Patcher
            .JumpToDistantSubroutine(0xC26515);

        // Algorithm that changes how defense is calculated in battle.
        asm65816Patcher.ChangeOffset(0xC26515);
        asm65816Patcher
            .GetAddressValueWithYIndex(InBattleStamina)
            .DivideBy2()
            .DivideBy2()
            .AddNumberFromAddressAtIndexY(InBattleDefense)
            .TerminateDistantSubroutine();
    }
}

All methods in the patching libraries are documented, so when using in an IDE like Visual Studio, you can also see information about what an operation is actually doing, total bytes used by the opcode, and things jump distance restrictions.
Quote  
[-] The following 6 users say Thank You to justonecog for this post:
  • madsiur (09-08-2017), Rjenyawd (09-11-2017), Robo Jesus (12-24-2017), Setzer (07-04-2020), SSJ Rick (09-08-2017), Turbotastic (09-09-2017)

#2
Posts: 2,768
Threads: 88
Thanks Received: 24
Thanks Given: 87
Joined: Jun 2009
Reputation: 25
Status
None
hello and welcome, this is actually very impressive, you managed to do a lot of work and in such a short time too

personally I would have LOVED to have added a bunch of lore to the game and fill in plenty of gaps as well

really awesome stuff


"Sometimes ninjas do wrong to each other, and in dat way the force of tha earf' comes around da moon - and at that presence, da dirt, it overshadows the grass, so you're like, I can't cut dis grass, there's no sun comin' through. So in order to enable each other the two fruits have to look each other in da eye and understand we can only be right, as da ripe is wrong, you know what I mean?"

-HNIC
Quote  
[-] The following 1 user says Thank You to SSJ Rick for this post:
  • justonecog (09-08-2017)

#3
Posts: 175
Threads: 11
Thanks Received: 10
Thanks Given: 8
Joined: May 2013
Reputation: 13
Status
Well-Fed
This all looks awesome! I love the idea of adding as much lore into the game proper as you can.

As for filling out bookshelves, I think it would be HILARIOUS if you had a running gag of, like. Dueling historians? Books and journals by specific historians writing about the in-game lore, but -- as happens with real world historians -- some of them have 'pet theories' that stem from, uh, very particular interpretations of historical fact. And by 'very particular' I mean 'demonstrably wrong', but that doesn't stop them from writing about it. Although I don't know how much additional space you're planning to use for book dialogs, and this might require rather a lot.


Current Project: FF6: Tensei | Discord ID: TristanGrayse
  Find
Quote  
[-] The following 2 users say Thank You to GrayShadows for this post:
  • justonecog (09-08-2017), Robo Jesus (12-24-2017)

#4
Posts: 9
Threads: 1
Thanks Received: 0
Thanks Given: 0
Joined: Sep 2017
Reputation: 0
Status
None
@Poco:
Thanks! All the credit goes to Madsiur, in particular his video tutorial on moving events. That one in particular was what cemented jumps for me, and it all finally "clicked." At that point, the only lingering doubts were, "Man, how can I simplify this process so I don't have to constantly look up assembly and hex opcodes? And idiot-proof against myself so I don't accidentally fat-finger a value?" That pushed me to make the C# patching library. Now I can rely on IntelliSense for most things. Also, not having to constantly make ROM backups cuts down a LOT on time when debugging, frees up more time for research and learning more advanced concepts.

@GrayShadows:
Holy crap, that's an excellent idea! My favorite NPC's in the vanilla game were actually the two historians in Albrook talking about Atma/Ultima, so that's right up my alley, and would present a lot of material to fill out more books! Totally doing it. Thanks for the suggestion! I was already planning to have a book, "Faithful Account of the War of the Magi" be recoverable key item from the Ancient Castle (the timeline states the last copy was lost in Doma 980 years ago), and then giving a reward for turning it in to a historian. If that historian was having an argument with another, and that book would settle the debate... that would make even more sense. It's too perfect.

As for space, it's not a huge issue. I'm using an expanded ROM, so moving events to make space is relatively straight forward, and each "read book" event only takes up 12 bytes (check they face up, check for button press, display the dialog, return). After moving just two blocks of the early Narshe events, and making sure nothing borked, I already had space for 17 book events. Then for having enough space for their dialogs, the FF3Edit Town Dialog hack took care of that, freeing up something like 80k bytes. With book dialogs averaging around 500 bytes a pop, that's more than enough room to handle all the books I plan, leaving a lot of room left over for extras.

The real issue I had was not having enough bytes available for map data to place those events and more NPC's. Thankfully, once I found FF6LE-CE's map expansion functionality, and which banks to use without conflicting with my own hacks, that solved that issue.

So NOW the biggest problem is just creating the content, and making sure it doesn't conflict with canon material (at least, not too much... as long as there are no direct contradictions). Which I think is a fun problem to have Smile

Edit:
And now that I think of it, if I add author names and titles to each book, that actually provides possible incentive for players to backtrack and re-read the books in order to check the authors, and verify the accurate info. You are brilliant! Thanks again!
Quote  
[-] The following 1 user says Thank You to justonecog for this post:
  • Robo Jesus (12-24-2017)

#5
Posts: 175
Threads: 11
Thanks Received: 10
Thanks Given: 8
Joined: May 2013
Reputation: 13
Status
Well-Fed
I am very glad to have been of service. Laugh I was mostly concerned about the actual dialog blocks, but I didn't realise the Dialog Hack adds THAT MUCH space. That's good to know, considering how much extra dialogue is likely to go into my hack if I ever get it finished.

It may also be fun to have one of the historians just being, like. Wildly and hilariously wrong. "The War of the Magi was orchestrated by LIZARD PEOPLE who live ON THE REVERSE SIDE OF THE WORLD. They controlled Mage Knights by watching them through flat pieces of glass called 'screens' and moving them around by pushing buttons on small, hand-held devices."

"Sure, Tom. And I bet you think the world is a 'globe,' too, right?"

"FLAT MAPS ARE A LIE!"


Current Project: FF6: Tensei | Discord ID: TristanGrayse
  Find
Quote  
[-] The following 2 users say Thank You to GrayShadows for this post:
  • Rjenyawd (09-11-2017), Robo Jesus (12-24-2017)

#6
Posts: 3,966
Threads: 279
Thanks Received: 234
Thanks Given: 56
Joined: Oct 2011
Reputation: 65
Status
Tissue-aware
This is a pretty cool project! It's a good idea to split it in three parts too. The patcher is also interesting. If you can mimic all opcodes why not use this if it makes things more readable for you... Are you planning to release the library?
  Find
Quote  

#7
Posts: 9
Threads: 1
Thanks Received: 0
Thanks Given: 0
Joined: Sep 2017
Reputation: 0
Status
None
Definitely plan to release publicly via GitHub. The SNES hacking stuff in particular I might throw into nuget for easier importing (but not the FF6 specific stuff -- legal and such).

I've still yet to get all the 65816 opcodes in; I've only been adding them as need arises. I'll probably take a night next week to just get them all in.
After that, refactor to clean things up, sanity checks, and probably add an "alternate syntax" extension method class that can be optionally imported, so people can invoke opcodes in the syntax they're most comfortable with (eg: they could use the JumpToDistantSubroutine(address), or JSL(address)). Then I'll release that portion.

The FF6 specific stuff (like the Event patching library) will probably come much later, as those things are far more complicated, and I'm regularly refactoring/rewriting things to simplify worklow. I want these libraries to be as intuitive as possible for devs to use.
Quote  
[-] The following 3 users say Thank You to justonecog for this post:
  • Rjenyawd (09-11-2017), Robo Jesus (12-24-2017), SSJ Rick (09-11-2017)

#8
Posts: 45
Threads: 0
Thanks Received: 0
Thanks Given: 24
Joined: Feb 2015
Reputation: 0
Status
None
One issue I worry about with what you are doing here is the fact that some skills are actually made worse due to how the canon game coded some things (poison and sap/seizure I believe being the two worse ones with regards to that), with a higher stamina resulting in worse results when they hit (instead of the opposite like you would expect). So you may have to do some tweaking with things like that in order to remove that issue. You may also want to consider looking around for other free-to-use improvement hacks like the full Elemental Display hack and whathaveyou as well, especially considering you're using an expanded rom for things and have the space to use those sort of things.

Still, I do look forward to this project here and what you do with it.
  Find
Quote  

#9
Posts: 9
Threads: 1
Thanks Received: 0
Thanks Given: 0
Joined: Sep 2017
Reputation: 0
Status
None
Assuming you're referring to the example patch, Robo Jesus, and a good point. I'm using the Ted Woolsey Uncensored Edition patch as a base, which I believe includes a fix for the poison/regen issue (but not sure if it also handled sap... will have to check), so hopefully that has it covered.

Also, apologies to everyone for being absent so long. I'm currently working on getting my first game on Steam. So I've had to put this project on hold until I get that out on Steam (which will probably be another couple months at least). I DO fully intend to come back to this, though. It'll happen, but I have to make a living in the meantime Tongue
Quote  
[-] The following 1 user says Thank You to justonecog for this post:
  • Robo Jesus (01-03-2018)

#10
Posts: 9
Threads: 1
Thanks Received: 0
Thanks Given: 0
Joined: Sep 2017
Reputation: 0
Status
None
Just an update. This isn't dead, I swear! Even if I haven't touched it since earlier this year.

Currently neck-deep in code on a contract project I've been stuck in since February, but the itch to get back to work on this is strong. It could be as late as November before I can give this my full attention again (gotta' make a living), but surprisingly, reviewing the code, everything still makes sense. So I should be able to jump right back in when the time comes.

I realized today that I do already have a git repo initialized for the project with a giant commit, so I just need to set up a remote, and push, to make the utilities public. I doubt anyone's itching to get their hands on it, but if so, just say the word, and I'll go ahead and do the legwork then post a link. If nothing else, people could get a peek at the included docs I made for myself to get an idea of what lore I plan to include.

Happy hacking!

Actually, just for fun... some notes I made to myself during the research phase, ripped from the repo.

Most of what's mentioned is canon, lifted from various dev interviews and official books published about Final Fantasy. I wish I had cited sources for each bullet point... you'll simply have to trust me when I say I didn't just make this stuff up.

Apologies, a lot of formatting lost from copy/paste.

--------

Canon Characters Details (to generate more ideas):
- Locke was originally planned to have Runic (probalby won't do anything with
this).
- Locke hates mushrooms.
- Locke travelled the world with his father, a treasure hunter.
After his father's death, Locke was treated like a thief by everyone but
Rachel. Rachel's father didn't approve of him. He ventured into a dangerous
cave in search of great treasure to prove he was more than a thief.
Rachel injured while he was gone.
- Edgar lost his mother as an infant, and thus has strong attachment to women.
- Edgar's first crush was an older woman, one of his father's cousins.
She was very firm telling him he must grow up to be a good man, so Edgar
studied the art of chivalry with passion. She was killed in a political
rivalry, Edgar's feelings forever unrequited. Her spiritedness and lively
wit made a mark on him, creating his vision of the ideal woman.
- Sabin, Gau, and Cyan act as surrogate family. Sabin/Gau lost their fathers,
Cyan lost his son.
- Sabin recognizes an aspect of himself in Gau, and both share a connection
to nature and what is natural. Terra senses that when calling him a
"docile bear."
- Sabin was originally going to be able to die at the Tzen house in the WoR.
Edgar would trigger a cutscene, looking for Sabin in the middle of the night
through the rubble... "I'm coming to save you!"
Could have Sabin's heroism mentioned to Edgar, have Edgar say he would have
saved him.
- Figaro's sacred colors are yellow (the sun) and blue (water). Edgar wears
a blue ribbon against his yellow hair to symbolize this.
- Sabin is afraid of squirrels (one bit him as a kid while giving it a nut).
- Sabin was initially smaller and weaker than his brother.
- Vargas was Duncan's son, and thus meant to be his heir.
- Sabin made no contact with Edgar in the ten years they were apart.
- Edgar's hobby is rearranging furniture in his bedroom as a way to de-stress.
- Edgar sleeps with lion paw slippers.
- If Edgar had not taken the throne, he would have become an airship mechanic.
Probably explains the Tools ability.
- Only Relm knows Edgar's middle name (Roni).
Cyan and Gau know Sabin's middle name (Rene)
- When Sabin was 5, the brothers saw a tantalizing wedding cake at their
father and stepmother’s wedding. Edgar said to Sabin, “let’s get married so
we can cut the cake!” and Sabin replied, “Yeah!!”
- Using magic requires a great deal of mental energy, and the mental strain of
it caused Celes to become unhinged, prone to sudden outbursts of tears and
fits of hysteria... this state of mind strengthened her desire to find
someone she could rely on: Enter Locke, who speaks to and treats her kindly.
By the time she is supposed to betray everyone, Celes realizes she has
fallen in love with Locke, and the conflict tears her up inside.
- Setzer got his scars from accidents on the airship and gambling incidents.
- Setzer is very particular about fashion, and doesn’t like to wear the same
styles as everyone else. The bandana is Locke’s signature piece of apparel,
plus it looks really good on him. Once Setzer joins the party and sees this,
he loses his love for his bandana.
- Strago and Cid are the same age (71).
- Strago originally had a wife named Lara, age 65 and a Geomancer. They
constantly bickered. Scene never included by devs:
Strago: “Looks like I’ll be the one dying first… in heaven or hell,
I’ll be waiting for you!”
Lara: “Hey, you can’t leave yet, what about all this debt?!
I’m going first!”
- Gogo was originally going to impersonate the other main characters
throughout the game.
- Gestahl became Emperor at age 52, displaying uncanny charisma.
- A coup d'etat occurred in Gestahlian Empire when Gestahl was 13. Gestahl's
father heavily involved.
- During his time as Emperor, Gestahl researched ancient tales of magic and
sorcery, looking for truth behind the tales.
Explains some of his motivations.
- Mog is only 12 years old.
- Molulu is (was) Mog's girlfriend, and gave him the Moogle Charm.
So if she died in the WoR...
- Ramuh appears to Mog in dreams, and taught him to speak human.
- Mog states his blood type is "Black-Footed Duck Type."
- Umaro is only 4, and has a strong sense of honor. He feels like he owes a
debt to Mog, because Mog shared food with him when he collapsed from
exhaustion.
- Umaro hates caterpillars.
- Gau dislikes being on ships (hence why he probably didn't go to Thamasa).
- The Siegried imposter, Ziegfried, was likely Gogo.
- Cid is a member of the Marquez bloodline, a line of patriotic scientists
of the northern state that became Vector.
- Cid cultivated exotic flowers in a greenhouse, his favorite being roses.
As Celes grew, she would help him in the greenhouse, where Cid named his
favorite flower after her and eventually gave it to her to adorn her
quarters.
- The room with two soldiers in the Imperial Castle likely belonged to Celes.
- Terra was originally supposed to struggle and yell "No! Get away from me!",
while having the slave crown placed, revealing that she was not a willing
participant in the procedure.
- Terra loves animals, and "fluffing" moogles. Fluffing? Uh...
- Terra was effectively raised in entirety in the Magitek Factory.
- Wrexsoul, in the Japanese version, is an amalgam of souls that lost their
minds during the War of the Magi.
- Kefka was raised in an orphanage (unknown town).
- Kefka met Celes around age 8, and became interested in her due to her also
being an orphan. Used political influence to get her promoted to General.
- Kefka's mind snapped the same day Celes was promoted.
- After descending into madness, Gestahl demoted Kefka to Court Mage. This
is still a high rank, but lower than General.
- Kefka loves mirrors and playing with dolls.
- Shadow loves hard-boiled eggs.
- General Leo has an appreciation of music.

------------------------------------------------

World History:
- The symbol on the Imperial banner is likely the "mouth" of Magitek Armor.
- The Empire was formed 685 years ago, declaring independence from the world
as a military state, intent on creating a global police force.
- The First Gestahlian campaign took place 18 years ago, resulting in
conquering the southern continent. Establishment of the Magitek Research
Facility happened the same year, as well as Terra's birth (and kidnap).
Celes was also born the same year.
- The Second Gestahlian campaign took place 8 years ago, with the release of
Magitek Armor into combat. At this point, the western continent was
conquered, and Figaro formed an alliance with the Empire. Upon allying,
there was a small riot in South Figaro. Edgar/Sabin's father died a year
later (probably related).
- The game takes place during the Third Gestahlian Campaign:
The Gestahlian empire aspires to conquer the northern continent, clashing
with the Returners in the Sabre Mountains.
- Samurai started training at Doma 600 years ago.
- Skirmishes began between Doma and the Empire 3 years ago. The Third
Gestahlian Campaign began a year later. Doma sympathizes with the Returners.
- Industrial Revolutions and Artistic Revivals started 208 years ago.
- Figaro Castle constructed 202 years ago.
- The Narshe mines are a coal mine, from which Figaro and Narshe draw from.
20 years ago, Narshe refused to trade coal with the invading Gestahlian
Empire, using armed resistance. A pact for mutual peace was agreed upon,
however.
- Figaro's first castle submersion failed 72 years ago, during which a
temporary palace was build at South Figaro.
- Gestahl was born the same year to a military family (bad omen?)
- Figaro castle's third submersion was a success 4 years later (68 years ago)
- The Imperial Palace at Vector was completed 38 years ago.
- There are five ranks of Imperial soldier:
Green - Cadets.
Brown - Soldiers, commanders, corporals, sergeants.
Black - Field commanders.
Orange - Kefka's personal soldiers.
Imperial Elite - Gestahl's personal guardss, templars, officers, captains,
and generals.
- Don's are hounds bred with Magitek power.
- Tunnel Armor was likely made to find Figaro Castle.
- The Returners name refers to their desire to return things to the way they
were before the Empire's conquests.
- The Magi were Mage Knights, who learned how to wield magic. After the War
of the Magi, they were persecuted by non-magic-wielding humans, and fled to
Crescent Island to found Thamasa.
- Phoenix and Ragnarok died in the War of the Magi.
- In the original concept art, the Warring Triad are referred to as
Sophia (Goddess), Zuvan (Demon), and Sephiroth (Fiend). Note, singular of
Sephiroth is Sephirah. The also correspond to the main elements:
Lightning (Goddess), Fire (Demon), and Ice (Fiend). Crusader is very likely
a reference to the Triad, or is them
- The "damages friend and foe alike" from the PlayStation bonus section can
refer to the Warring Triad battling each other and mortals getting caught
among their fighting during the War of the Magi, and for this reason it
damages both parties.
- Zozo was founded by the lower-class citizens of Jidoor to the south, and
criminals in Zozo sometimes drift back to the city looking for work and
targets to steal from.
- Albrook was one of the first cities conquered by the Empire.

--------

Ideas:
- In Moogle cave, give them all names after the moogles in the early game battle.
Also allow them to be spoken to if Mog's in the party?
- Consider adding "signs" to the dialogue for Owzer's paintings, that describe
historical events.
- Have Strago mention that Relm is just as bad as his late wife, Lara.
Perhaps even use the same dialogue.
- Try to work in scene between Shadow and Strago. Extra dream sequence?
Strago: I have one request... Show me your face. Even if you are him, I have
no intention of wasting time trying to talk you into staying. I just
want to know... for Relm's sake...
Shadow: (back to player, takes off mask, presumably)
Strago: Thank you... Shadow. ...Come, let's have a drink.
- See if there's a way to link both Shadow and Relm's flashbacks in WoR.
- Have a bit of Amano's artwork in the game somewhere, as one of Relm's
paintings. Perhaps WoR only, at the Owzer's house?
- Control ability is apparently associated with True Names. Make a reference
to this in Relm's room. Or replace "Fake Mustache" with "Tome of Names,"
with True Names mentioned in the description.
- Consider adding a flower sprite near the raft in Cid's hut, and call it
Celes. Perhaps make it collectable, and have it activate the Magitek
ability for Celes. Perhaps only make it available if Cid is saved.
- Consider replacing Kefka's laugh in his final form with that of N64 Bowser.
- Try altering Kefka's sprite to have white paint/skin (DONE).
- Kefka was more childish in Japanese version. Try to emphasize this in his
dialogue.
- Rename the Ancient Castle queen to princess.
- Mention the Bomb Forest's location (west of river in Veldt).
- Consider adding Kappa the Imp somewhere in the WoR, and have him refer to
falling off a mountain during the world's destruction (from the cutscene).
- Make Wrexsoul defeatable with Raiden.
- Have the wounded soldier ask the players to "ensure the letters reach Lola,"
to encourage them to read the letters in Maranda (easily missed, otherwise).
- Have Duncan actually mention his goddamn son. Easily missed detail.
- Play up Edgar's attraction to Relm, as apparently he was more pervy in the
Japanese version.
- Figure out where Castle Figaro keeps its damn Chocobos. Map edit?
- Add a maid to Vector, to imply they're the one hit on by Edgar.
- Consider adding treasure to the hidden Chocobo stables (may not be doable).
- Have one of the characters mention that Setzer is still at the airship,
after the Gestahl banquet. Easily missed cutscene, otherwise.
- Consider putting the Warring Triad somewhere in the Esper World.
- After the end of the world, several people apparently washed up on Solitary
Island, but didn't make it. Add gravestones?
- When picking up the bandana on Solitary Island, have Celes initially think
it's Setzer's (see Setzer character details... he had a similar bandana).
- Perhaps have sand worms on Triangle Island, to elude to them evolving into
Hoovers in the WoR.
- The old man outside the Inn in Kohlingen, WoR, will unequip party members if
spoken to. After getting the Falcon, he shows up there. Add some dialog to
imply they're the same person.
- Mention that Kefka's tower is in the same place Vector used to be.
- Shadow will leave in the WoB if taken to the Opera house. Add some dialogue
that reveals Shadow hates opera (canon).
- Consider adding a + shaped tree formation around Duncan's house in the Wob,
to make it easier to find in the WoR.
- Releasing the Espers from the factory ultimately results in them not being
able to make more Magitek armor (canon). Maybe imply this somewhere after
the event. Perhaps at South Figaro in the WoR?
- Consider making Umaro controllable if Mog is in the party, or have him
auto-act in specific ways if given dried meat, green cherry, or tonic.

Completely forgot that I had already done some sprite edits for this hack.

I was always a little confused by Kefka not having the white facepaint/makeup in his sprite.
Setzer's coat always looked more brown than black to me in his world sprite, as well. So I tried to make it look a little more like his concept art.

[Image: kefka.png]

[Image: setzer.png]
Quote  



Forum Jump:

Users browsing this thread: 1 Guest(s)


Theme by Madsiur2017Custom Graphics by JamesWhite