Monday, July 31, 2017

Cutscene dilemma

During the launch celebration race on the RandomizerMania channel, the most common bit of feedback I received was a request to remove the cutscenes.  This feature is not one that I'm a big fan of, but it is common practice for randomizers that are intended for races.  In general, The Lunarian Shuffle has a policy of leaving the original game as close to unchanged as possible.

To put things in perspective, FFIV has about 85 minutes of cutscenes, out of an average total play time of 5-7 hours with glitches, or 6-8 hours without.  For a racing setting, if 1 hour of the plot events were cut, this would be a 15-20% reduction in the amount of time players would have to be able to set aside in order to race it.  As a speed runner myself, I can definitely say that this would be a big difference in terms of being able to schedule time to run the game or not, which is consistent with The Lunarian Shuffle's vision as the randomizer that is the best suited for strategy and competition.

Another consideration is that, given the way I randomize the final dungeon optional boss item awards, any changes to the game's event script will require me to move several pointers in the randomizer that change those items.  Maintaining two versions of the base ROM, one with and one without cuts to the plot, could therefore be a huge pain in the long run.

I will experiment with removing the many dramatic pauses in the game, to see if changing that but leaving the scenes otherwise untouched will make the game still feel the same while supporting speed runs better, or if instead it winds up being the worst of both worlds instead of the best.

Saturday, July 29, 2017

Character tracker overlay

The Lunarian Shuffle now has a character tracking overlay!

Available in the same folder as The Lunarian Shuffle itself, simply click a small character at the top, then the slot where the character has appeared, and this simple webpage will track who is who for broadcasters' viewers to see - or to help your own failing memory.

Credit for this tool goes to HungryTenor.

Thursday, July 27, 2017

Finishing touches

Provided that the changes I made yesterday play well today, I will be releasing The Lunarian Shuffle this weekend!

Today featured some nice cosmetics; FuSoYa is now the face of the GUI, and he changes poses as you progress making your modified ROM.  I have also copied the contents of the build log text box into a log.txt file in the working directory of the program.

I've also been writing up my advertising blurb for Discords and what not.

Wednesday, July 26, 2017

Fixing FF2US's faulty documentation

While watching casual streams of a retro video game, one thing I often do is I inform the player of things that they are supposed to know from having read the instruction manual - which, 9 times out of 10, they don't possess.  Video games of the past expected players to do some reading before playing, and some, especially RPGs before thorough tooltips became standard, expected players to refer to provided charts when making shopping decisions.

Recently, I did this while watching someone play Final Fantasy IV, and I noticed something interesting:
The Dark Knight is listed as being able to equip a whole lot of things that he actually can't.  Frankly, a lot of it is clearly bogus (Bow and Arrows were listed for the Dark Knight but not the Paladin, for example), but of interest to me is the late game armor.  The Dark Knight is listed as being allowed to equip all the non-paladin-specific heavy armors and shields.

The Lunarian Shuffle has a policy of deferring to the original's choices for balance and design whenever it is reasonable to do so.  This is why getting the Adamant Armor always involves turning in a Pink Tail from the final dungeon, for example.  In this case, it's not clear what that means, though - the game's ROM disagrees with Squaresoft's own claims.  So I think I am justified to pick whichever version I feel is best.

I'll go ahead and try out allowing heavy armors to be equipped on Dark Knight Cecil.  Perhaps this will make using him occasionally correct, whereas at present he's best as either a Valvalis attacker or a dead body.  Hopefully this will make sense to the players.

Tuesday, July 25, 2017

Final Fantasy IV 5 Job Fiesta - minor update

The Final Fantasy IV 5 Job Fiesta, my simpler, semi-joke project, has been updated to 1.02.  The game itself is unchanged; all I did was implement a MD5 check to avoid crashes if someone accidentally used a version 1.0 ROM.

For more information and a download link, check my longer post here.

MD5 check on input ROM, Golbez fight improvements

In a move that I should have done a long time ago, the randomizer now looks at the MD5 of the input ROM, as a checksum.  This should prevent the program from crashing when someone inputs a version 1.0 ROM, either due to their own carelessness, or that of the source of the ROM they obtained.  I will also implement this into an update to the 5 Job Fiesta.

Using our newfound actor vs. job check technology, we've made the Golbez + Shadow fight where Rydia's replacement rejoins much more consistent with the original.  Previously, the fight was checking for Adult Rydia's job for some aspects of the fight, but her actor for others, which made the game crash when those were not one and the same.  Now it always checks for actor, which means the fight can do things like summon the Mist Dragon and have the returning character start hidden and then show partway though the fight.  I'll need to check all the corner cases to be sure Adult Rydia's job doesn't get used at all now.

Monday, July 24, 2017

Special Commands: Done and dusted!

Thanks to work by HungryTenor, with some minor extensions by myself, The Lunarian Shuffle has fixed all the characters' special commands.  This means that Twin will now work as expected (and won't be selectable when the other twin is absent), Cover will work for Paladin Cecil for all his appearances, and Edward will Auto-Hide in all of his appearances.

Also, the Cover command had been coupled to the "main character" of the game for determining the speed scale of combat.  For example, the speed run would frequently reduce Paladin Cecil's agility in various ways to make running away from fights easier.  These things are now decoupled; whoever has taken the place of Dark Knight or Paladin Cecil will now be correctly identified as the "main character," regardless of who else is in the party.

This means we get to get rid of the goofy solo casted Flare and Comet nonsense on Palom and Porom, too.

Sunday, July 23, 2017

Hidden features

My randomizer places items into chests in a very simple way: for each chest, it rolls a random item.  The chest then asks that item, "Are you okay with being placed inside a chest like me?"  When the chest finds an item that says yes, that chest is filled and the randomizer moves on.

This created a bit of bias when placing "unique" items: the first chests to be filled were more likely to be the one to hold a unique item, if that unique item got placed at all.  So, I have solved this issue by randomizing the order in which the chests are randomized.  The Rat Tail will still be more likely to show up in the first chests that could contain it than in others, but the player has no way of knowing which chests were "first."

In another hidden feature, FuSoYa's spell list from levels 2-18 now demands that White magic be learned on even levels, whereas Black magic must be learned on odd levels.  This is to avoid an issue where the player could identify the approximate starting level of FuSoYa based on how hard it was for the randomizer to find a spell list that avoided collisions.  The spell table is much more sparse at higher levels, and it usually takes no more than a few hundred attempts to randomly achieve apartheid there.

HungryTenor has again graced the project with a continuity fix; the Twins should now look like their replacement characters when they turn to stone.  They won't be in a "hold the wall still!" pose, but it should still make more sense than the characters turning into Palom and Porom during that scene.

Saturday, July 22, 2017

Special commands: Still rearing their ugly heads

Another playtest, another set of glitches to fix.

Cover was not working correctly in today's test run.  DK Cecil's first appearance, replacing Yang, did not have an Item menu option, and DK Cecil 2 was the cover actor.  Turns out this one was completely my fault; I miskeyed Rosa (who was PCecil) and Yang in the Cover rewiring code.  This has been fixed.

More troubling is Auto-Hide.  Edward himself is auto-hiding correctly; no problems there.  However, whoever took Edward's place is losing the ability to take turns when he/she hits critical HP.  While this isn't the most game breaking issue, it's not at all intended.  I've notified PinkPuff, since any ROM made with FF4kster that used that program's function to change the Auto-Hide actor would also be affected.  We'll see if he finds something; otherwise, I'll have to hunt it down myself.

I'm still thinking this project is within a week of completion, though!  Stay tuned.

Thursday, July 20, 2017

Nearing completion, maybe?

Given how many major bugs I've had to fix over the past couple weeks, it feels good when a day goes by where my edits to the project involve balance more so than making things not-broken.  Today's updates included things like making FuSoYa learn his magic earlier, changing level ranges and "goodness" levels of items that turn out to be better or worse than I thought they would be before testing, and adding a "credits" entry to the information panel.

[EDIT] Perhaps I spoke too soon.  A thing I thought was a minor issue yesterday turns out to be a major pain.

In that video, I gave FuSoYa the grind fight experience, and wound up missing 3 Black spells.  I had assumed it was an error coming from the sheer number of spells I learned in that fight - perhaps the game could only store 64 learned spells between the active and shadow party members.  But no, it's worse.

PinkPuff helped me track down that the cause was a collision between the levels of learned White magic and learned Black magic.  Apparently, the game only allows a single type of spell to be learned at a given level; if you learn both Cure1 and Ice-1 at level 3, Ice-1 doesn't make it into your spell list.

This will be a major pain to fix because of the way I coded the spell list randomizer.  It goes through each element of the list, randomizes it, then moves on, without keeping any records of any sort.  I'll need a completely different procedure to identify and then resolve any collisions between two different spell lists.

Wednesday, July 19, 2017

Unnecessary Epicness

I had to move the Golbez + Shadow fight out of the formation number it had been in, because that fight had special properties that did things to Adult Rydia by "job", whereas some of the battle's special scripted actions behaved on Adult Rydia's "actor."  This wasn't a problem when Rydia was not in the party, not an adult, or was in her correct slot.  But otherwise, she became effectively dead and unhealable for the whole fight.

My first solution to the problem had an unintended side effect:
Apparently, the game picks the background for a fight based on fight number.  Unused fight 441 uses Zeromus's background, so that was no good.  Fight 421 worked fine.

In other news, Palom and Porom will now have Comet and Flare in their normal spell lists from the get-go, rather than using the completely borked Twin command.  I'd rather they learn the spells naturally, but the game gets very confused by the fact that those spells are past the usual White and Black magic spell positions.  Anyway, Flare costs 25 and Comet costs 40 MP.  They'll wreck in some early game boss fights, but will be outclassed by proper late game spells once those are obtained.

A fellow who goes by HungryTenor has given me solutions for adding text to the title screen, for making the summon orbs usable even when the game doesn't think Rydia's in the party, and for customizing which characters's images show up to bless the party during the Zeromus cutscene.  I'll be implementing these changes today, and I'll also need to add a Credits page somewhere in the program for my tester(s) and contributor(s), now that I have those.

Tuesday, July 18, 2017

Balance changes

After some playthroughs between myself and Couch_23, I've decided to make the following balance changes to the randomizer's logic:

The level 2 spell items will not appear until just before the Tower of Zot.  I was previously allowing them as early as Mysidia, figuring that was when the level 2 spells were available, anyway.  But it turns out they are generally much more useful than magic, and after looking it up, it appears they normally only started appearing as rare drops in the Tower of Babil.

The optional bosses in the Lunar Subterrane are now only going to yield weapons or armor.  There were several consumable items that were both good enough and allowed at high enough level that they were allowed to be the reward of those fights, which in a race setting would almost assuredly push all  those fights out of the range of worthwhile risk/reward ratios.

The Gold and Silver Apple price tags are going up.  If they show up in a shop, they enable you to dump money for stats for defeating Zeromus with less EXP grinding, and the ratio turned out to be about twice as good as I think was appropriate.

Monday, July 17, 2017

Fights against allies: Working better now!

I managed to hunt down the way the game specifies which character to use when fighting against a party member in a plot fight.  I have implemented this to make those fights look consistent with which character should logically be there, given the randomized seed.  The results are sometimes pretty funny.

The above clip is from Couch_23's testing yesterday.  He was using the item duplication glitch, which resulted in some... very different gameplay experiences from what I've been doing so far.

In other news, after giving it some thought, I think I will flag the Mt. Hobbs "kick fight" as one where the game continues even if you lose.  Thematically, it works because your party runs to his aid after the first fight. Game mechanically, it works because if you fail to set your Yang replacement up for success by opening up a back row slot, your penalty is a dead character at the start of the MomBomb fight.

Sunday, July 16, 2017

Heal Potions vs a rainbow of status curers

I'm starting to feel less confident in a decision I made early on while designing the Lunarian Shuffle.

One of the design points of this randomizer is that, although it is for the most part a randomization of the "easy type" of FFIV that the USA received as "Final Fantasy II", I am restoring the "hard type" consumable items - stuff like ZeusRage can attack enemies, and Bacchus Wine can buff your party members.  This gives more options for more randomness overall, and it incentivizes a player who is missing something very important (say, a black mage for the Kainazzo fight) to scour treasure chests and shops in optional towns to find a replacement for what they need.

However, I'm also attempting to avoid adding my own balance choices whenever possible.  For example, I think the 2000GP price tag on the Power staff is far too low, but the original game really does sell them at that price, so I'm leaving that untouched.  The same principle led me to leave the Heal potion untouched - the "easy type" version sold Heal potions at a super cheap 100GP, rather than the "hard type" list of 10 different status curing items, most of which only cure a single condition, with price tags ranging from 40 to 5000GP.

I'm beginning to think, though, that perhaps I should be basing my balance decisions on the "hard type" version of the game, since it.  If so, the "Heal" potions will need to have their price tags jacked the heck up, and there will also be a lot more garbage in the treasure chests.  (How often will you be happy finding an eyedrop?)  If you have an opinion on this, let me know!


Here's one of the many problems I created in yesterday's build.  Various NPCs were either missing (usually Kain), or extras were inexplicably present (... again, usually Kain).  I was also greatly disappointed that my plan to make a Rydia who is replacing Rosa become an adult the instant she pulled away from the kiss with Cecil didn't work out.  Instead, she'll age when she is pulled away from the death trap.

I think I've hunted down the causes of all the problems that happened yesterday and I've implemented fixes, but I have no guarantees that those worked until I test Rydia aging in each of her possible aging points.

In other words: I need testers!

Saturday, July 15, 2017

Paladin Cecil initial equipment change

My overall philosophy for this randomizer is that I want it to test the player's knowledge of the game, not their knowledge of this program's quirks.  One problem that's been flying in the face of that goal has been Paladin Cecil's initial equipment.

The original version of the game gives you the Legend Sword as Cecil's initial equipment.  This has problems; it's way the heck too strong for you to be allowed to have it at level 1, plus it's marked as a "plot item," meaning it can't be trashed, sold, or stored in the Fat Chocobo.  If Cecil leaves and rejoins, and his initial equipment features the Legend Sword each time, you could get multiple into your inventory, which would then be weird when you upgraded one to the Excalibur.

Previously, my solution was to award the Legend Sword at the time you're supposed to get it according to the plot, but replace Paladin Cecil's initial equipment with the Silver Dagger, which is much weaker but has the same zombie-busting power.  But with play tests, I was finding that giving the player a Silver Knife was warping the game much more than I intended - so long as it stayed on Cecil it wasn't so bad, but your early game success was often defined by whether you realized you could strip the dagger from Cecil and hand it off to Edge or Edward or Kain, who normally have some problems getting equipment for the early game.

I was thinking about replacing the dagger with a bow and arrows, which Paladin Cecil is allowed to use, but that has the problem that it activates the Long Range glitch even for casual players who would have no idea that was a thing.

Earlier today I realized an alternative solution: Paladin Cecil will now start with the Silver Staff rather than the Silver Dagger.  The staff has 12 attack, which is more than the Shadow Sword but less than the Darkness Sword.  It also busts zombies (though not spirits).  And although it can be transferred to other characters, giving +3 Will to a white mage is far less of a game changer than giving Kain +17 attack and zombie/spirit busting power.

Today's Hard Mode test will include this change.

Lessons from Friday's test run

Yesterday I completed a test run of the Lunarian Shuffle.  I had started that run 2 days before, and since then many bugs had been fixed, so I was tempted to skip completing it.  I'm glad I kept going, though, because I learned a few things!

First of all, I got to see what happens when you hit the jackpot:
More importantly, I noticed that Cid, who had taken over my Paladin Cecil, was actually allowed to use the Crystal against Zeromus!  I did not expect this at all, since every other combat item in the game flags its usability by job rather than by actor.  I should have figured that Squaresoft would "special case" something like this, considering how much of this game was made that way.

In any case, this means that I can remove the "Zeromus automatically transforms" hack that I had been applying to the fight.  I just hope it's clear to the player that, even if they have a Paladin Cecil in their party, the "main character" is the one that should be using the Crystal.

Also, Porom and Yang's replacements were not being displayed properly in the epilogue; they remained as their original characters, resulting in a wedding with 2 sets of clones.

Final Fantasy IV 5 Job Fiesta

Before I started working on the Lunarian Shuffle, I completed a much simpler project called the Final Fantasy IV 5 Job Fiesta.  It's a semi-serious spoof on the Final Fantasy V 4 Job Fiesta, which is a cool charity-related challenge run for Final Fantasy V which does not require a ROM hack, since that game actually supports the concept.

The 5 Job Fiesta will add 5 characters to your party over the course of the early game, and those characters will stick with you for the entirety of the game.  It uses much more simplistic methods than The Lunarian Shuffle, which resulted in fewer bugs in some ways (PCecil could Cover without extra hacks) but more in others (many scripted fights that refer to specific Actor numbers had to be edited.)

It also features a Hard Mode as well as "EDWARD RISK!" as a play on the 4 Job Fiesta's "BERSERKER RISK!" mode.

For anyone looking for a simple but fun FFIV challenge, try it out here:

Friday, July 14, 2017

Rat and Pink Tails

In FFIV, if you obtain the Pink Tail before the Rat Tail, the Adamant Grotto guy will ignore your Pink Tails until after you've hunted down and turned in the Rat Tail.  This was extremely unlikely in the original version of the game, but in a randomizer it starts seeming fairly likely.

I want to include the possibility of obtaining the Rat Tail and Pink Tail in chests and completing those side quests as in the normal game.  However, considering that the Rat Tail might literally not even exist in a given seed, I have to fix this bug that Square left in.

I think the answer is to make the person standing to the right ask for the Pink Tail, while the one in the center asks for the Rat Tail, and each mentions which tail they want and that their partner wants.

Hard Mode

Here are my current plans for this randomizer's Hard Mode:
  • Fewer options in shops.
    • The Lunarian Shuffle normally gives each shop as many different items as it originally had.
    • Hard Mode will make shops instead stock a random number of items, from 1 to the number of items it would normally have.
  • More GP chests.
    • Normally, 15% of all (non-trapped) chests have GP in them instead of an item.
    • Hard Mode will increase that to 40%.
  • Extra "Bad" characters.
    • Most characters cause problems when more than one copy of that character is in the party.
    • It turns out that Dark Knight Cecil, Edward, and Cid, all usually the worst characters, are not problems in that regard!
      • Well, Edward's Auto-Hide will only work for his first appearance, but that's not so big a problem.
    • Hard Mode will add one extra Cid, Dark Knight Cecil, and Edward to the pool of characters you may obtain.
  • No early spell learning.
    • The Lunarian Shuffle usually randomizes the level a given spell is learned between -5 and +5 levels from the base version.
    • Hard Mode will change this to +0 to +5 levels, removing the chance that a spell will be learned earlier than usual, and making spells on average appear 2.5 levels later.

Current bugs

Here's a list and explanation of bugs I know are currently afflicting The Lunarian Shuffle.  Most of them pertain to characters' special commands, which the game implemented in a very "hack-y" fashion.
  • Paladin Cecil's Cover command is not working.  At all.
    • The issue here is that Cover explicitly refers to Paladin Cecil's "actor" in at least one place. An actor is an instance of a character joining the party.
    • If a character leaves and rejoins, it has two different actors, but the game's code only supports one actor for the Cover command.
    • However, even the one actor I'm trying to give the Cover command functionality to (the final appearance of Paladin Cecil) isn't working, either.
    • Someone posted a fix that might make Cover search by "job" instead of by actor, but it didn't work for PinkPuff and I've not tried it myself yet.
  • Twin is a glitchy mess.
    • Twin attempts to make Palom and Porom's "actors" each start to do a Twin attack.  These actors are the ones that join when you meet the Elder in Mysidia.
    • For example, if Palom has taken the place of Tellah, and Rydia and Paladin Cecil took the place of Palom and Porom, then using Palom's Twin command will make Rydia and Paladin Cecil attempt to twincast something.
      • So, if either of your "twins" doesn't have MP, the command is useless while they are in the party.
    • However, if those two actors are not currently in your party, Twin adds the Twin command to the middle character.  Twice.
      • So, if you have Palom or Porom in your party, and the "twins" are not in your party, then whoever is in your middle party slot can doublecast Flare and/or Comet whenever the Twin command is activated, provided they have the MP for it.
    • Possible solutions:
      • Try to make the game search by "job" like the supposed fix for Cecil.  But also make the ability fail if it doesn't find one of the two actors.  This will require tracing the assembly commands, editing what's there, and also fitting in some extra code on top of that.
      • Remove the Twin command altogether in favor of adding Flare and Comet to the twins' spell lists, replacing two other spells. 
  • Auto-Hide only works for one actor.
    • Edward is supposed to flee in terror when his HP falls low in a non-boss fight.
    • I have chosen to make this work for the "first" appearance of Edward.  After that, Edward will have gained enough courage not to auto-hide anymore.
  • Rydia's summon orbs can only be used when the game thinks Rydia is in the party - which for this ROM hack is often very different from the times she actually is.
    • I'll need to either look for actual Rydia or to make the item always usable.
    • Also, the spell learning message shows the person in Rydia's actor slot instead of Rydia's name... this is lower priority, but I'd like to fix that too.