Final Fantasy Cheat

By Shamus Posted Friday Jul 30, 2021

Filed under: Column 108 comments

Like I said on Monday, I spent the weekend dicking around with Final Fantasy X and Cheat Engine. I learned a few fun things, a few annoying things, and a few curious things. So let’s talk about it…

For those who don’t know, Cheat Engine allows you to rummage around in the memory of a running program and change values at will. If you can find the memory location where the game stores (say) your hitpoints, then you can edit that value to be whatever you like, at any time.

HOWEVER!

You’re just changing single numbers in memory, which may or may not be helpful. It all depends on how the game was coded. If I just change my character level but I don’t change my hitpoints, strength, weapon damage, or other related values, then maybe I’ll be exactly as strong as I was before. Or perhaps I change my hitpoints from 300 to 1,000,000. Then someone hits me with a healing spell, which adds 50 hitpoints to my total, and in doing so the game ends up executing some code that pulls my hitpoints back down to where they belong. Maybe a boss fight is balanced so that the bad guy always has $MY_HITPOINTS × 2.25, so by giving myself a million hitpoints I’ve actually made myself weaker in a relative sense. So then maybe I change the HP of the boss to zero, and then the game does a calculation like $SOME_VALUE  / $BOSS_HITPOINTS, which causes a divide by zero error and crashes the game.

Some changes will have no effect. Some changes will have an effect but it may be undone at any moment. Other changes my have a huge effect but may also have unpredictable negative side-effects. And some changes might crash the game, corrupt your save, or cause inexplicable glitches. It all depends. Some games take these instantaneous modifications in stride and some malfunction.

Final Fantasy X

The hard-shell foe on the left is for heavy-hitter Auron. The blue thing in the middle in an elemental for Lulu our Black Mage. The floating bat-thing on the right is for Wakka, who throws beach balls at flying creatures. Using the wrong character means you do little / no damage, and a bit of dialog to help the player to understand the intended match-ups.
The hard-shell foe on the left is for heavy-hitter Auron. The blue thing in the middle in an elemental for Lulu our Black Mage. The floating bat-thing on the right is for Wakka, who throws beach balls at flying creatures. Using the wrong character means you do little / no damage, and a bit of dialog to help the player to understand the intended match-ups.

Anyway. I played Final Fantasy X while using Cheat Engine. I gave myself rare gear, crafted impossible items, changed the contents of the sphere grid, and otherwise did a bunch of crazy stuff just to see what would happen. I will say that FFX is surprisingly resilient and took my tomfoolery in stride.

There are several moments in the game where you’re supposed to fail at something in battle so that another character can explain how the mechanics work. This is particularly true in the early game. For example, some creatures have hard armored shells. You’re supposed to take a swing at them with main character Tidus, do some pathetic damage, and then one of your companions will explain that you’re supposed to use the character Auron to deal with these creatures. If you cheat Tidus up to end-game power levels, then you’ll get this:

*Tidus smacks the monster for 99,999 damage. The monster only has 325 HP, so this is massive overkill. It falls over dead.)

Tidus:

(Makes a disappointed / confused sound, as if his attack did nothing.)

Lulu:

Let Sir Auron handle those creatures.

Tidus:

Oh okay. Got it!

(There’s an awkward pause where our heroes stare at the empty battlefield for a few seconds and then the victory music plays and the battle ends.)

I’ve run into several variations of this problem at different times. When you first arrive at Sanubia Sands, there’s a scripted battle where you’re supposed to be outmatched by a large bird and then Auron and Lulu show up to bail you out. This bit also gets a little weird if you can solo the bird before they show up.

Despite all this, the game never got stuck. It never crashed. I never got softlocked in a battle that wouldn’t end. The worst that would happen was that the dialog would be inappropriate, or there would be an awkward pause.

When you meet the character Kimarhi, he’s supposed to attack Tidus for a short one-on-one bttle. Then once he’s given Tidus a bit of a thrashing, the rest of the group jumps in and tells him to back off. After this, he becomes a member of the party.

But if you’ve leveled Tidus up to the point where he can one-shot Kimarhi, then the game doesn’t know what to do. There’s an awkward silence like someone forgot their lines. Then the battle just ends, but Kimarhi doesn’t join your party. At first I thought this meant that I was going to miss out on Kimarhi this game. But then after a short boat ride we arrived at the next island and he simply appeared in the party roster without comment.

Frugal Storage

Here I've cheated to give myself 100 of an item, even though the stack limit is 99. This works, but if I pick up any more, the game will clamp the value back down to 99.
Here I've cheated to give myself 100 of an item, even though the stack limit is 99. This works, but if I pick up any more, the game will clamp the value back down to 99.

You can tell this is a console port by the odd way everything is packed into memory. In your inventory, item stacks are limited to 99, so you can never have more than 99 of any item. This is because the item stacks are stored as a single byte value. I suppose this means that the game could technically allow stack sizes of 255, but I guess someone decided a value of 99 would feel more natural. (Also, limiting stacks to two digits lets you make the numbers larger, which makes it easier to read on your blurry low-res late-90s CRT screen.)

If I was programming an inventory system, I’d probably store items and stack sizes together. Like, two bytes would store the ID of the item, and then a third byte would store how many of them I owned.Actually, I’d be lazy and decadently spend four bytes on each variable. It’s 2021. Worrying about the memory footprint of the player’s inventory these days is like trying to lose weight by trimming your fingernails. But in FFX these things are stored in two separate blocks. I’m reasonably sure your inventory is designed to take up a fixed amount of space in memory, regardless of how much or how little you might be carrying.

So you have a block of item IDs, all packed together. Each ID is two bytes. Then after the list is a gap, which pads out your inventory to a fixed size.

I don’t know how many different items are in the game, but for the sake of argument let’s say there are 200.To be clear, we’re talking about your inventory of consumables here. Potions, remedies, megalixirs, grenades, power spheres, etc. Your inventory of weapons and armor is stored elsewhere, and uses a completely different system. And let’s also say that the player currently has 15 different items. So we would end up with 15 item IDs, then 185 items worth of blank space.

After the item IDs is a list of the stack sizes for each of those items.

This probably seems like a weird way to store stuff. Certainly a human writing on paper would store item names and item counts together. If you were taking inventory you’d write “10 Apples, 2 Pears, 1 Bananas, 9 Kiwi”. You wouldn’t write “Apple Pear Banana Kiwi” on one piece of paper and then “10, 2, 1, 9” on another. But as strange as this seems, this sort of thing is pretty common in programming.

So why pad out the list? This is handy for severely memory-constrained environments. Having fixed sizes for everything is really helpful. Yes, maybe it seems a little wasteful to reserve space for 200 items if we only need 15. But the important feature here is that no matter what happens, we’ll never wind up with more than 200. We don’t need to worry about some strange bug creating space for 10,000 items and trying to save it to the user’s memory card.

Hey, have you ever noticed how big Skyrim save files are? I don’t know why I brought that up. It just popped into my mind just now.

There are several blocks to your save data. One is your inventory, as discussed above. Another block keeps the counts for how many monsters you’ve captured of each type for the monster arena. Another block is your blitzball team, and another is your character stats. And so on. Yes, you could design it so that a block isn’t created until it’s needed. It could leave out the blitzball stuff until you play your first game and it could leave out the monster capture stuff until you capture your first monster. But then the save file would be variable size. By making sure the save file is always maximum size, you also ensure that there will never be some strange circumstances that takes it above some hard limit. “Oh, we didn’t realize if you do these sidequests in this order and hoard all these items and then collect these rare items that the save file will get bigger and take an extra block on the memory card.”

Encounter Outcomes

These three foes appear in front of me, but I have to get past all three of them regardless of which way I go. So they effectively surround me.
These three foes appear in front of me, but I have to get past all three of them regardless of which way I go. So they effectively surround me.

During my diatribe on Blitzball, some people theorized that the outcomes of certain interactions were pre-rolled, and that the AI was able to peek at these outcomes. At the time this sounded kind of implausible, but after cheating my way through a Blitzball game I have to say it makes a lot of sense.

See, Blitzball is a mostly turn-based game. Let’s say you’ve got the ball, and you get pulled into an encounter with 3 defenders. While the defenders are all spread out in front of you visually, for gameplay purposes they form 3 concentric rings around you. You must somehow get past all three people, regardless of what you plan to do or which way you go. Even if you want to pass to someone behind you, the game will act like these three guys are stacked up in a conga line between you and your goal.

Let’s say the three defenders are named Abe, Betty, and Carl. You will need to deal with them in this specific order. You can push past Abe, and then throw the ball. Betty will have a chance to grab it. If she doesn’t, then Carl will have a chance. Or you can push past Abe, then push past Betty, and then throw it and Carl will try to grab it.

So you have a choice: How much do you want to rely on your ability to overpower people, and how much do you want to rely on your throwing arm? If you’re controlling a real bruiser of a character then maybe you’ll push past everyone and just swim away with the ball. If you’re controlling a good passer then maybe you’ll skip the fisticuffs and try to throw the ball past them.

If you choose to throw, then it’s your Passing ability vs. the Blocking ability of everyone else. Like, you have a pass of 20, then the ball leaves your hand with 20 “hitpoints”. Abe has a block of 10, so he knocks 10HP off the ball. Betty has a block of 8, so she knocks another 8 off the ball. Then Carl has a block of 5. The ball runs out of HP and therefore Carl grabs it.

These values are all randomized a bit for each encounter. So someone with a block of 10 might roll a value between 8 and 12.

So if you’ve got a pass value of 20 and the three defenders have a combined block value of 26, then it’s technically possible to throw past them if you roll well and they all roll poorly. The odds are strongly against you, but it can happen.

The thing is, the AI will sometimes make long-odds moves like this and have it work out. It will roll high, you’ll roll poorly, and the ball gets through.To be clear, you can’t really see these dice rolls. You just have to intuit what’s going on by watching the action play out. That alone wouldn’t be particularly suspicious. Ask any X-Com player and they’ll tell you: Lots of unlikely things can happen over a large number of encounters. It’s not suspicious that the dice favor the AI once in a while. What is suspicious is that the AI seems to know when a long bet will pay off. I don’t observe the AI taking crazy gambles most of the time. It usually plays very conservatively. But when it does go for an unlikely play, it pays off.

The accusation isn’t that it cheats when rolling the dice, it’s that the dice get pre-rolled and the AI is able to choose an action based on what the dice rolls WILL be.

What I Observed

Note: I didn’t record this match and I don’t remember the exact details, so I’m going to make up all the numbers and pick names at random.

So my guy Datto gets near the enemy goal, and defender Bickson stops him. I’m close enough to shoot. However, my Shoot skill is 8. Bickson has a Block skill of 5. The goalie has a block skill of 5. If I shoot from here, then Bickson will get a hand on the ball as it goes by, reducing it to 3. Then the goalie will be able to stop it.

This is what it looks like when you're digging around in memory. This is actually the inventory section. Those 63s represent the item stacks of 99. (63 is 99 in hex.)
This is what it looks like when you're digging around in memory. This is actually the inventory section. Those 63s represent the item stacks of 99. (63 is 99 in hex.)

So I jump over to Cheat Engine and rummage around in memory for Datto’s Shoot skill. This search requires a bit of detective work. Datto has several numbers that describe his properties. It’s probably safe to assume that all of his data is stored together. So I’m looking for this particular collection of numbers, all next to each other.  I have to make some assumptions about how the programmer might have arranged these variables, and how many bytes of space each variable might get. And it helps if you can read hexadecimal numbers, which I sort of can.

Anyway, after many searches, I find the blitzball players in memory, and then find Datto among them.It would be SO nice if the name was stored along with the data, but alas no. You have to recognize people by their numbers. So then I reach in and change Datto’s 8 to a 90.

I jump back to FFX. Success! Datto’s shot ability is now a godlike 90.

From here, you’d expect that taking the shot would result in Bickson touching the ball and knocking 5HP off. Then the goalie will knock another 5HP off. Then the ball will land in the goal with 80HP to spare.

Instead, I take the shot. It leaves my hand with 90HP, and then Bickson touches it and the ball’s HP drops all the way to 3. The goalie catches it easily. That’s exactly what I would have expected if I’d thrown the ball with my original Shoot skill of 8.

However, sometime later Datto gets the ball again, and I once again wind up in front of the opposing goal with some defenders in my face. Datto’s Shoot score is still 90, so I don’t need to do any editing this time. I can just take the shot.

And this time it works. All the defenders touch the ball as it glides by, but their tiny block skill is no match for Datto’s superhuman Shoot of 90.

What this tells me is that when an encounter is created – when the defenders pull your player into their pocket dimension and the menu appears – the game looks at the options in front of you and rolls the dice for each choice ahead of time. Once the encounter has begun, you’re choosing which of the three predetermined outcomes you want, because the dice have already been rolled for each of them.

Imagine you’re playing D&D. There’s a monster in front of you. You can swing your sword, or you can cast a spell. The GM rolls the dice for each option and then he asks you, “Do you want this sword-stroke where you’ll roll a natural 20, or do you want this spell attempt where you roll a 3?”

That’s what the game seems to be doing. However, it’s only telling the AI what the outcomes will be. The human player has to choose blind.

I want to be clear that my little experiment doesn’t PROVE that the game pre-rolls encounter outcomes. You could devise other explanations for the odd behavior I observed. But on the whole I find this explanation the most plausible because…

AI is Hard

I'm in an encounter with 3 defenders. I'm near the goal, which means it might be a good time to shoot. But not with so many defenders in the way. A human can figure out the least-risky plan, but would take a pretty robust AI to do the same.
I'm in an encounter with 3 defenders. I'm near the goal, which means it might be a good time to shoot. But not with so many defenders in the way. A human can figure out the least-risky plan, but would take a pretty robust AI to do the same.

As a programmer, this makes some sense to me. If I’m trying to write an AI, it’s not that hard to write something that can judge between 3 known outcomes. But it’s a huge pain in the ass to write an AI that can properly balance risk vs. reward when dealing with possibility space that looks like this:

PUSH PAST DEFENDERS:

  1. Likely outcome of a small setback.
  2. Slightly unlikely outcome of an extremely serious setback.
  3. Very unlikely outcome of an incredible advantage.

PASS THE BALL:

  1. 90% chance of small setback.
  2. 10% chance of a large advantage.

Stuff like this is conceptually simple for humans to wrap their heads around, but it’s really hard to write code that can handle this sort of decision-making. Heck, just quantifying ideas like “Very unlikely” and “small setback” is really hard, much less coming up with code to choose between them. And that’s before you take into account the fact that the AI needs to make decisions on a sliding scale. It should be fairly conservative if it’s ahead or if the game just started, but it ought to be willing to take big chances if it finds itself losing in the late-game.

Having the outcomes of decisions pre-rolled would make it easier to code the AI. It doesn’t help you make the AI smarter, but it does reduce the risk of the AI doing something that is obviously stupid.

Now, if this was a AAA sports game then this AI shortcut would be completely outrageous. But in an optional minigame for a JRPG? Yeah, I can totally see someone cutting this corner. Particularly since I doubt anyone on the development team has expertise in this field. For the most part, the “AI” in a JRPG is incredibly simple stuff like:

  1. Cycle through attacks A, B, C
  2. When the boss health first drops below 50%, unleash attack D
  3. When health is below 25%, switch to rotating through attacks E, F, G.

Or whatever. The system is usually so simple that players can reverse-engineer the logic just by playing the game and observing the AI behavior. That’s fine. In the context of a turn-based game the predictability of the clockwork AI is a feature, not a flaw.  A boss fight is supposed to be more of a puzzle than a chess match.

So then someone decides to put a sports game into the latest Final Fantasy, and you figure it’ll be easy because it’s built around on turn-based encounters. Conceptually, that sounds a lot like the normal encounter AI the team is used to making.  And then months later someone sits down to write this code and they realize, “Oh hang on. This decision-making is super fucking difficult and I’m not sure where to start. Shit! We budgeted three weeks for this, and I don’t think that’s enough time for me to do the reading required to write the spec for this. And then I’d have to devise unit tests to judge if the AI is doing the right thing, and I don’t know how you detect it doing the wrong thing short of writing another entire AI.”

I have no proof this is what happened. I’m just saying as a programmer with very limited AI experience, I find this scenario to be extremely plausible. AI is hard, and it’s the sort of difficulty you don’t anticipate at first because the problem in question is often conceptually trivial for a human being to solve with the meat computer between their ears. It only becomes difficult when you have to express it in code. I can say “Make a cautious decision” to another human being. But then I realize I need to explain to the computer what I mean by “cautious” and I realize that word contains a tremendous amount of complexity.

Overdrives

Each character has  an “overdrive” gauge. It fills gradually as you fight and defeat monsters. When it’s full, you’re able to unleash a powerful super-attack. Each character has their own signature overdrive.

The thing is, you never see the number that drives this gauge. I can look at the bottom of the screen and see that I’ve got exactly 2,384 hitpoints, but when I look at the overdrive meter all I can tell is that it’s “about halfway full, maybe a little less than that”. So I was curious how the programmer handled this. The problem is that it’s really hard to find something if you don’t have exact values to look for.

  • You could store this value in a single byte as a simple percentage value. So the number would be 0 when empty and 100 when full.
  • You could store this value in a single byte, but use all of the possible values. This would mean that empty is 0 and full is 255.
  • You could store this value in 2 bytes. 0 is empty, full is 65,535.
  • If you’re crazy, you could store this in a signed 2 byte value, so empty is -32768 and full is +32767. I don’t know why you’d do this, but you could. There might even be a good reason to do this, depending on the PlayStation 2 hardware and development tools.
  • You could use a 4-byte floating point value, in which case empty is 0 and full is anyone’s guess. I feel like this is a bit unlikely given how frugal the rest of the code is with regards to memory usage.

I hunted for a long time for this overdrive gauge. I searched using all sorts of assumptions regarding byte size and scale, but I never found anything that worked. I did find a pair of identical values that went up as the gauge filled, but the game would overwrite any changes I made to them, correcting them back to their proper value. So the data was coming from somewhere else, and the data I found was just a placeholder or temporary value.For example, if you’re doing to draw the pixels for the gauge itself, you might derive some number of pixels to use for the bar width. This number would have no effect on gameplay, and it would be get re-calculated whenever the bar is drawn. So changing it would be pointless.

But while I was digging around for that I stumbled on an interesting bit of trivia.

The character Tidus has a number of overdrives. He starts with “Spiral Cut”, where he does a front-flip and slams his sword down on a single target. At some later point (it’s not clear to the player what causes this) he will unlock “Slice and Dice”, where he runs around the battlefield and hits foes at random. Then eventually you’ll somehow unlock “Energy Rain”, where Tidus will leap up into the air and shoot(?) lasers(?) out of his sword onto foes below. And finally, if you stick around for the long-haul, ultra-completionist 120 hour marathon playthough, you might reach the point where Tidus unlocks “Blitz Ace” where he slashes a single foe nine times with his sword, then plants his sword in the ground and uses it to launch himself into the air, then someone tosses him a blitzball and he Bicycle Kicks it into the monster’s head and no I’m not kidding all of that really happens.

So guides like this one will tell you that to unlock these overdrives, you need to use them. Using Spiral Cut 10 times will unlock Slice & Dice, using Slice & Dice 30 times will unlock Energy Rain, and using Energy Rain 80 times will unlock Blitz Ace if it doesn’t drain your will to live.

This doesn’t seem to be the case. Indeed, it can’t be the case. The game does not keep track of which overdrives you use. Those numbers aren’t stored anywhere. Instead, there is a single counter that goes up whenever you perform an overdrive. This is good news! If you believe the guides, then you need to perform 10+30+80 overdrives to unlock Blitz Ace. But no. You just need to perform 80 total overdrives. This means you don’t need to do as many, and it also means you get to use whatever overdrive suits you. You can use the awesome six-hit Slice & Dice, and you’re not obligated to use the underwhelming one-hit Energy Rain. (Number of hits becomes important in the late-late-late game when you run up against the damage cap. Yes, the game has a damage cap.)

Maybe this detail was changed for the Steam release of the game, and that’s why the online guides are wrong. I don’t know.

Wrapping Up

On the right is Maester Mika. On the left is our secondary villain, Seymour's haircut.
On the right is Maester Mika. On the left is our secondary villain, Seymour's haircut.

So that’s what I learned from cheating at Final Fantasy X. I hope you found some of that interesting. Sadly, I couldn’t find any cheats to do anything about Seymour’s hair.

 

Footnotes:

[1] Actually, I’d be lazy and decadently spend four bytes on each variable. It’s 2021. Worrying about the memory footprint of the player’s inventory these days is like trying to lose weight by trimming your fingernails.

[2] To be clear, we’re talking about your inventory of consumables here. Potions, remedies, megalixirs, grenades, power spheres, etc. Your inventory of weapons and armor is stored elsewhere, and uses a completely different system.

[3] To be clear, you can’t really see these dice rolls. You just have to intuit what’s going on by watching the action play out.

[4] It would be SO nice if the name was stored along with the data, but alas no. You have to recognize people by their numbers.

[5] For example, if you’re doing to draw the pixels for the gauge itself, you might derive some number of pixels to use for the bar width. This number would have no effect on gameplay, and it would be get re-calculated whenever the bar is drawn. So changing it would be pointless.



From The Archives:
 

108 thoughts on “Final Fantasy Cheat

  1. BlueHorus says:

    I’m pretty sure Seymour’s outfit counts as a minor villain, too. Does that necklace dangle past his navel? that seems like it would be…awkward.

    Also, Typolice:

    These three foes appear in front of me, but I have to get passed all three of them regardless of which way I go. So they effectively surround me.

    Should be ‘past’.

    …Tidus unlocks “Blitz Ace” where he slashes a single foe nine times with his sword, then plants his sword in the ground and uses it to launch himself into the air, then someone tosses him a blitzball and he Bicycle Kicks it into the monster’s head

    Ah, JRPGS. They do some things terribly, but others very, very well…

    1. Patrick the Runway savant says:

      His outfit, and the accompanying necklace, accomplished their intended goal(s):

      Upon initial inspection and appearance everyone knows this person is the douchebag. The gold standard that all other douchebags are judged against. The metaphorical Fred Durst of Spira, minus the obnoxious red yankees hat.

      If you think about it, designing clothes specifically intended to convey ones level of douchbaggery is not only particularly difficult (without using Ed Hardy or a Nickleback tshirt), but the level of expertise this artist showed to accomplish their goal was quite impressive.

  2. Parkhorse says:

    “It would be SO nice if the name was stored along with the data, but alas no. You have to recognize people by their numbers.

    “You get used to it, I don’t even see the code. All I see is blond, brunette, redhead…”

    1. Philadelphus says:

      “Potion, monster, blitzball player…”

  3. kikito says:

    I just can’t get over how ridiculous and cumbersome the clothes look.

    1. Chad+Miller says:

      Every Final Fantasy set with a tech level higher than “steampunk” really does just have really stupid clothes.

      I just recently replayed XII and was reminded of Elza, the pirate from Final Fantasy XII that really looks more like a pirate-themed stripper. Her shirt is open to show her brasseire (not even something like a bikini top that may provide the “she’s doing stuff in the water” excuse) and she wears a thong on the outside of her booty shorts: https://www.reddit.com/r/FinalFantasy/comments/1jqziu/i_think_the_thong_goes_beneath_the_shortselza_in/

      1. Chris says:

        “hey these westerners have this thing they call a whale tail, could you add that to your next design?”
        “what is that?”
        “It is when you pull up a thong all the way.”
        “Uhm that sounds weird, but I can do that”

    2. Hal says:

      In a genre known for ridiculous outfits, I feel like FFX outfits were particularly egregious.

      Of course, I haven’t played any of the subsequent games, so it could get worse. And I hear FFX-2 used an outfit based system, so who knows what madness was unleashed there.

      1. The+Wind+King says:

        The outifts in FFX-II, at least for the NPCs are a unique form of madness.

        Truly unique.

        Thigh high socks, a one piece bathing suit, and a chin high collar with a zipper, but no pants / trousers, level unique.

      2. Thomas says:

        When someone says they’re ‘Wearing a belt as a skirt’ they normally mean it’s a very short skirt.

        In FFX it’s literally a bunch of belts woven into a skirt

        1. Fizban says:

          Not gonna lie, I’ve always found Lulu’s dress (and Hennet’s pants*) kinda rad.

          *From the 3rd ed PHB, one leg is baggy white cloth, and the other is just a million belts.

          1. Stu says:

            Though not practical in a tropical climate such as Besaid. As Shamus mentioned in the FFX analysis, she’s probably so grouchy because she’s constantly on the verge of heatstroke.

      3. ngthagg says:

        One of the many things I didn’t like about FFX was the prevalence of baggy clothing among the characters who play an underwater sport. I don’t know what the world building meetings were like at Square, but I’m guessing there wasn’t much “what would make sense?” and a lot of “I can top that!”

        1. Chad+Miller says:

          I distinctly remember being annoyed at one of my own players, thinking “How do you design an outfit that both shows that much skin and also looks like it would be uncomfortable underwater?”

        2. Taellosse says:

          I am pretty sure that asking “what would make sense?” in any worldbuilding, design, or story meetings on a Final Fantasy game is a firing offense.

  4. Gargamel Le Noir says:

    It’s for the best. The engine of the game is robust, but touch one tentacle on Seymour’s head and you’ll get a crash and a corrupt install. It’s the core on which the game is built.

  5. Joshua says:

    The AI tactics made me think of Civ V, which has notoriously bad AI when it comes to battle tactics due to the many, many variables that can come into play. This is why you see enemy units approach your base in bad formations, charging through bad terrain, and having their melee units bash themselves against city walls while not waiting for their siege engines to arrive.

    Even though war can be a major component of the game, it’s obviously just too complex for the AI to handle. It’s no surprise that the devs for FF X would “cheat” for a little side game like this.

    Edit: It also made me think of the computer (Android) version of Settlers of Catan. The computer seems to have an uncanny ability to place the Robber in tiles that will shortly come up being rolled.

    1. GoStu says:

      If anything I think you’re understating how incompetent the Civ5 AI is.

      When it’s fighting you, it makes its “am I winning” estimate based purely on military score; I.E. “how many units do I have, how many does the player have?”. A player can have the absolute perfect defensive position, fortify something tough and have long-range units help grind attackers into paste, and the AI will absolutely positively never give up even if it’s burning all its production on war and not harming the player one bit.

      1. Joshua says:

        Right, but I didn’t want to spend 20 paragraphs detailing the bonkers AI* when the point was that even for such a large component of this other game, the AI is nowhere near up to snuff to handle the game as presented, so it’s understandable that what’s a small aspect of a different tactical game is barely going to get any AI coding.

        *A couple of my favorite bonkers traits:
        1. Along with your description of the enemy AI not realizing it’s beat, even when it does realize it’s in a bad place and offers to negotiate peace, if you refuse the AI will go back to happily wasting its units against your defenses. As opposed to, you know, retreating all of its units back out of your territory and hoping that you’ll change your mind, or even something like a chevauchee where it would go around pillaging your improvements to push you into peace.

        2. In all of the games, the AI never seems to care whether you’re actually participating in a war when it comes to alliances. Someone asks for your help against X: you notice that X is across the map, so you say yes. Meanwhile, you just go back about your business letting our “ally” do all of the work and in ten turns or so, you can negotiate for favorable terms from X (up to and including a city) in return , even though your forces came nowhere near theirs.

        1. Liessa says:

          If you think the Civ 5 AI is bad, you should try Civ 6 (at least for the early builds; it may have got better since then, but I don’t know because it was so bad I gave up playing). Never mind combat, which at least has the excuse of being complex with lots of variables; they couldn’t even get the basics of diplomacy right. Among the highlights:

          – AI leaders lurching schizophrenically between “I love you” and “I hate you” depending on whether I satisfied their ‘agenda’ on any particular turn. E.g. one AI praises my ‘powerful navy’ because I have 1 more ship than them. Then next turn, they build another ship and suddenly it’s “YOUR NAVY IS WEAK AND PATHETIC! DIE!!!”
          – AIs hating me because they have an agenda that’s irrelevant / impossible to fulfil at a particular time. Example: one leader likes people who kill barbarians. So I kill all the barbarians, and they love me. But now there are no barbarians left to kill, so a couple of turns later they’re back to hating me again.
          – One AI took an inexplicable dislike to me despite the fact that we were on different continents and had never interacted, and ended up declaring war. They proceeded to do absolutely nothing for the next 20 turns or so, while stubbornly rejecting all my efforts to make peace. Eventually I offered them a token amount of about 5 gold in exchange for peace, whereupon they immediately signed an alliance and became my best friends forevermore.

          1. RFS-81 says:

            “YOUR NAVY IS WEAK AND PATHETIC! DIE!!!”

            Especially funny if you’re landlocked. Right, I’m such a wimp, leaving all 0 km of my coastline undefended!

        2. Alecw says:

          You gents should treat yourself to Stellaris. Highly competent military and diplomatic AI, and a much richer economy system than any Civ to date.

          1. TMCSherpa says:

            Yeah but every time there’s an author patch a core tenant of the game changes.
            Sectors, tiles, planets, propulsion, population, population again, AI, war, trade, diplomacy, planets again, population again again…

            The only thing recognizable from when Stellaris launched is the title.

    2. Chad+Miller says:

      This sort of thing is, I think, why Slay the Spire and the subgenre of “card games” it’s spawned are built the way they are.

      See, the deckbuilder genre of game started as a tabletop PvP thing. This means that players tend to start on equal footing or close to it and have similar tools available to each other.

      Slay the Spire (and every game that’s iterated on the formula) tend to have a deck for the player that works like a traditional deckbuilder, and opponents that have static strategies. And I’d bet anything that this is so that they don’t have to code an AI to play their card game. So the player has to guess what cards they might draw, have contingency plans if they don’t see a certain card fast enough or if they draw too many of the same card at one time, etc, while the AI just has stuff like “attack for 12 damage, add 25 block, attack for 14 damage, attack for 16 damage, buff itself” etc. They even made it part of the game by making the standard so that the player can see the AI’s next move.

      1. The+Puzzler says:

        It’s not just to avoid AI coding. It’s satisfying for the player to be able to execute a plan. If an enemy in Slay the Spire drew a bunch of random cards, got a really good potential combo by sheer luck, and played it intelligently, what am I supposed to do prepare for that?

        1. Chad+Miller says:

          I mean, even Slay the Spire as it exists has things like drawing all your blocks when the enemy doesn’t plan to attack. People playing card games sign up for a certain degree of randomness, but I don’t think it’s a coincidence that the place they took away most of the randomness was also the part that would have been the most difficult to design and balance.

      2. RFS-81 says:

        I like games that turn AI behaviors into explicit game mechanics, instead of pretending that they’re playing the game like you would. On high difficulties, you need to understand the AI behavior like that anyway.

        AIs that can actually play the game are really cool, but it seems like commercial developers don’t consider the investment worth it. The official digital version of Race for the Galaxy has the best AI for a card game that I know of, but it came from an earlier open-source implementation of the game by a guy who wanted to play with neural networks.

        Pandora: First Contact is a 4X game that eventually incorporated a fan-made AI mod into the official release. It’s very strong, but also completely incoherent when it comes to diplomacy. Turns out that in a typical 4X game, diplomacy is designed around AIs role-playing instead of playing to win. (So basically, they’ve been AI-as-game-mechanic the whole time, just not explicitly.)

  6. TLN says:

    I guess having the AI know the “dice rolls” ahead of time is just a way for them to fake the AI being any good. Once you engage more with Blitzball later (which iirc is required for some unique items), it becomes just ridiculously easy almost immediately because turns out when you have some good players it becomes very obvious that the AI has no idea what it’s doing, and will often not even swim the right way. I guess they wanted to show in the tournament that “wow Besaid really is the underdog team everyone else is so good”, but they didn’t feel like figuring out how to make the AI good at actually playing the game so they just boosted the stats of everyone and let the AI cheat, but once you get players with equally good stats the AI ends up being just completely outmatched. Hell, even in the initial tournament Tidus alone is likely to outclass every other team except whoever he best ones are, provided you have the Jecht Shot already.

    1. galacticplumber says:

      Al Bhed team incidentally, and no it’s not even a contest. They are, far and away, the most optimized team the AI has native access to. In fact one of the first things I do upon getting the airship is abuse the fact I have access to where that team lives to save scum the AI randomly letting a player go before snatching them up…. Repeat until you have the entire team. No I don’t care if you’re going to field tidus as one of your shooters. Ensuring none of those players can ever be used against you is worth a few hundred worthless gil extra per game to keep one of them benched.

      1. Syal says:

        Which is hilarious considering the entire subplot of the Al Bhed team trying to get Besaid to throw their game.

        1. Karma+The+Alligator says:

          But then you can see that the Al Bhed playing against the Aurochs aren’t the regular players. I think only the captain is there, but all the other players are just randos and the normal team is the ones who kidnapped Yuna.

          1. galacticplumber says:

            I mean…. Randos on average have higher stats than early aurochs. And for standout players psyches captain is much bigger than Wakka.

      2. Rho says:

        I don’t recall all the details, but every Blitzball player can be leveled and some random dudes get insane stats from it. However, you’d never know who without a guide or ridiculous grinding. The Al Bhed aren’t necessarily better, they’re just annoying you play against.

        1. galacticplumber says:

          Considering I do know the entire stat curve of every player? No, in point of fact, the Al Bhed are best. Why? Throughout the widest number of levels on the entire curve their stats are the highest of any player, with the best easily attained skills, and the most debilitating status effects. Brotha the only non-Tidus player that can directly compete with them is also an Al-Bhed, and thus strengthens the argument.

          If you want to make the argument that the Besaid team having the highest stats at level 99, an absurd level far and away higher than any player will ever see, you’re welcome to. Problem though? You’ll have gotten every conceivable reward you could possibly want from blitzball by then, it’s not worth using a trash-fire team through eighty percent of the level curve, and even if it were you can reset the league back to level one universally at any time if you still wanna grind rewards.

          1. Gautsu says:

            I hit 99 before I got Wakka’s reel to show up as a reward

            1. galacticplumber says:

              HOW?! You do know it’s a tourney reward, and you can just play a league game to reset what tourneys offer right? Same is true for every other reward unique to blitz.

      3. Patrick the Imaginary sports GM says:

        What I noticed when using Al Bhed vs Non Al Bhed players on my roster was how often IMPORTANT stats got increased during LVL up. For example, Brother consistently showed improvements in passing and speed upon LVL up, making him the center for any team. Other players would occasionally have their catch or block stats increased. Players obviously meant to be defensemen would randomly have their shot stats increased, which amounts to nothing and a wasted LVL up.

        Al Bhed players consistently had only the stats that mattered increased. Quickly making them overpowered against everyone else. So yea……recruit those guys…

        1. tmtvl says:

          Contrast vs Keepa, the Aurochs’ goalie, who at max level has 99 shoot.

          1. galacticplumber says:

            And to get him there you have to spend the time babying a character whose only worthwhile stat is goalie. He’s also one of the worst goalies. Also XP is based on ball possession, and goalies naturally take the longest to level because they only ever touch the ball for seconds at a time.

            Compare this to literally every other position that can just hold the ball in their own court running away from the enemy team and occasionally passing just before an encounter can start with a points lead to run out the clock.

            Do it with Keepa anyway? That means you have to either get a lead while essentially playing one member short, or keep him on the bench until half time to play charity in a won game.

            1. Patrick the Incredibly bored says:

              This is one of the more interesting parts of the blitzball design, actually. There is a kinda/sorta built in balancing system built in because as your team improves, and shoots more, the opposing goalie enjoys frequent opportunities to make saves. The Aurochs goalie (whoever that is) can go games at a time never touching the ball. SO eventually he falls WAAAYY behind everyone else. And, as you say, Keepa sucks to begin with…so…

              A couple times I wound up using Wedge, who is one of the best power forwards in the game, as a goalie because his Catch stat got increased to the point where he was the best goalie in the game. And the best shooter not named Tidus.

              I always kept Keepa around on the bench for 60 to 70 games and then let him go when teams started swapping goalies via free agents. Eventually someone would inexplicably sign Keepa. This was the case when I beat the Guado (I think) 27-0. I could take shots from midfield immediately after stealing the ball after faceoff.

              Good times…..

              1. galacticplumber says:

                That is some next level shit. Finally someone found an unironically good use for Keepa that doesn’t involve waiting longer than the heat death of the universe. Legitimately the hero we need.

  7. Joshua says:

    FYI, I do believe that a lot of damage calculations in many Final Fantasy games do take your level into account. So, even if you left other values unchanged apart from level, you’ll still see increased damage.

  8. RamblePak64 says:

    I’m curious, did you check to see if the stats for that particular Blitzball encounter are also stored internally somewhere, so that it still displays what you wrote but it’s referencing a sort of “this encounter” function where it has localized the values? I’m just spitting out something but it effectively sounds like the number, while displayed correctly, didn’t “take” for that encounter but then did once the encounter was complete.

    In regards to memory management, I can’t find an official, reliable source on it, though I did find this twenty year-old gem commenting that the game was on just one DVD (good to know that, in some ways, the Internet hasn’t changed and that it has always been terrible). While the games on the original PlayStation were three or four discs total, the PS2 started to see games moving to a single disc because DVD had that much more data space available. However, it still presents its own problems, and is also a pittance compared to memory space today.

    I recall an interview where Sakaguchi stored all of the game’s music onto the PlayStation’s RAM and then was still rearranging data on the disc to the last minute in order to minimize load times as much as possible. I believe it was FF7 and from this video interview, though I don’t have the time to double-check. You can find a lot of neat info out there on both the Final Fantasy series and Pokemon franchise in regards to the difficulties of console game memory management, and in Sony’s GDC PS5 tech reveal last year they even went into how Blu-Ray discs contain duplicate data all across the disc since the laser reads so slowly, and therefore needs to be able to grab the quickest reference to common items, which in turn inflates the size of modern games.

    To go back to FFX in particular, I can imagine their memory management is in part due to habit, but also due to needing to figure out how to make this game look better with more impressive, higher resolution pre-rendered video and textures and models while all fitting on a single DVD. I don’t know if you recall, but there were a lot of unhappy folks when they discovered Lost Odyssey, Sakaguchi’s “New Final Fantasy” after he left Squaresoft and founded MistWalker, was going to ship on two DVDs. For an entire generation all games shipped on a single DVD, and the idea of having to get up and swap discs felt like “a thing of the past”. So, it makes sense to me that they’d still be very frugal with memory despite technically having more space available, because, in some ways, they actually had less.

    1. Chad+Miller says:

      I don’t know if this is confirmed or fan speculation, but I’ve heard that part of the reason FFVIII locks you out of most of the map on the last disk is because they couldn’t fit all the necessary information for all previous locations on the disk, so they just decided you had to get your sidequesting in before that.

      1. Maryam says:

        Story-wise it makes some sense for FFVIII to lock you out of locations, because the world is in a super weird limbo state and everyone in the cities would be… frozen? gone? I’m not sure, they never really explained.

        But then, they did something similar for FFIX’s last disc (you could still go in major locations, but minor ones were blocked) with only a handwavey explanation as to why. That only makes sense if they had to free up storage space for the new final area and FMVs.

      2. Esoterus says:

        I’m not sure about VIII, but I know that FF VII had the game’s full data on every disc, and only the FMV data changed. I had a damaged disc (2 or 3?), but was able to play through the full game by hot-swapping the damaged disc out after getting past the “please insert disc X” screen.
        It led to some absurd scenarios, like people panicking about Weapon attacking, except then it plays the Gold Saucer ferris wheel FMV instead. But the game was otherwise 100% normal.

        All my VIII and IX discs worked fine so I never had to do that with them, but wouldn’t be surprised if they worked the same.

        1. Syal says:

          VII adds things to the world on Disc 3, but VIII locks you out of all the towns on Disc 4. You can backtrack to wander the map but can’t go to any landmarks. End of Disc 3 is very much a point of no return. Similar with IX. Don’t remember all the places you can’t revisit but I know you can’t revisit the one that sells you the -aga spells.

        2. bobbert says:

          I guess that explains why there are so many disk, if there is so much overhead.

    2. evilmrhenry says:

      With regards to FFX memory management, I don’t think DVD sizes matter. What does matter is PS2 memory card space (Standard size of 8MB; FFX uses a 64KB blob). In general, PS2 games are designed to use X KB of save space with that being a hard limit; this is even written on the back of the case. The only games I’m aware of that could use arbitrary amounts of data used the optional hard drive to store that data. (FFXI, for example.)

      The requirement for a hard limit on the space save data takes up means that having X inventory slots, with a hard max item limit and a hard max quantity on each slot is an obvious design consequence. Everything saved needs a maximum size it can take up, without exception.

    3. evilmrhenry says:

      Also, I can confirm the game is on one DVD. (Source: I looked at my copy of FFX on PS2.)

  9. Ninety-Three says:

    By making sure the save file is always maximum size, you also ensure that there will never be some strange circumstances that takes it above some hard limit.

    Additionally, fixed size makes it really easy to find things. If you need to check how many potions the player has in a dynamic inventory list, you need to iterate through the entire list until you find the potion entry. If the inventory is instead a fixed list of every item in the game, you jump straight to checking the 17th entry in the list because you know potions are item number 17. Technically this is faster but the main advantage is that it’s easier to implement, you’ll never fail to load a save file because something was in an unexpected place.

    1. Addie says:

      It’s the old-school C way of saving and restoring memory. All of the data which need to be included in a save file are all statically allocated together in one contiguous block. To save, write all of the bytes of memory from the first to the last in that block to disk. To restore, copy them back to the same location. Done. All the things which stay the same (the text descriptions for the items) are loaded into memory somewhere else. It simply does not make sense to implement some modern object-orientated saving facility that dumps out the whole game state in JSON or something; it’s an old game for a memory-constrained system, and anything more complicated would be slower and take up more space.

  10. Abnaxis says:

    I vaguely remember not ever using Slice and Dice (it frustrates me that he just randomly runs around and smacks stuff) but still unlocking Tidus’s other overdrives. That was however-many-years-ago I was playing FFX on PS2 (please don’t tell me the time it will make me feel old) so I might be remembering wrong…

    1. Karma The Alligator says:

      No, you’re right, it’s always been number of overdrive uses that unlocked the next, not uses of a specific overdrive, even on the PS2. Whatever guide Shamus consulted wasn’t accurate.

  11. Daimbert says:

    What this tells me is that when an encounter is created – when the defenders pull your player into their pocket dimension and the menu appears – the game looks at the options in front of you and rolls the dice for each choice ahead of time. Once the encounter has begun, you’re choosing which of the three predetermined outcomes you want, because the dice have already been rolled for each of them.

    Unless you eliminated this, it sounds more likely that what the game does is pull all the relevant base values into the “encounter” when it creates it and then does the rolls when the choice is made. Since there wouldn’t be any modifiers after that point and the rolls would be unopposed, it wouldn’t make sense to take up memory or processing time to find and load the values after the encounter. So your move here would be to change something that the encounter had already read and then noticed that it didn’t change. To properly test the hypothesis, you’d need to re-run the encounter over and over again to see if it ever changes (ie if you eventually score because you rolled well and they rolled poorly).

    As for the AI here, the big issue is determining when such a risky move is worth it, as it’s really hard for an AI to determine if it’s necessary or not. I haven’t followed that specific issue at all, but it would be interesting to see when it does it, and if it does it at more dramatic vs less dramatic times, or if it’s just as likely to do that on the first play of the game as the last, say. That it seems to always succeed suggests that it has some insight into whether or not it will work. but then as you noted there could be other explanations, such as the game “cheating” to give the AI a hugely beneficial move that will work out in what it might consider to be a desperate case (in short, the game determines that the need is great enough to just let the AI win, and it tells the AI to do that move because it will let it win).

  12. Zaxares says:

    I’m a bit reminded of the truly bizarre decisions the AI would make in Dice Poker in Witcher 1. (For those who haven’t heard of it, Dice Poker is basically Poker, but played with dice instead of cards. The winning “hands” are roughly analogous to the Poker hands, except that Five of a Kind is the ultimate winning hand.) Anyway, ostensibly having your dice rolls be a function purely of luck should mean that Dice Poker games are much less about skill and much more about blind luck, but in reality you’ll win most of your matches because the AI will make some truly dumbass decisions like getting Four of a Kind (which is exceedingly hard to beat) and promptly re-rolling half of its hand, ruining its advantage. I have no idea what kind of rules or decision-making process the AI is following behind the scenes, but I can only surmise that it’s something like “IF MyHand != “Five of a Kind”, THEN reroll()”

    1. Daimbert says:

      Huh. It seems that even simple online poker-type games solved that a while ago, with the simple check of “If !FiveofaKind then reroll ones that don’t match”, which would only re-roll the one die, if that was possible.

    2. bobbert says:

      So… it’s yahtzee?

      1. Zaxares says:

        I’ve actually never played yahtzee so I had to look up the rules, but yeah, turns out it’s actually very similar to yahtzee, except that there’s no upper section and you can only reroll your discarded dice once per round.

  13. Echo Tango says:

    Re: finding the overdrive numbers

    Does the cheat engine not have a way to search for values, given the limited you’ve got as a player? I used a couple back in high school, that would let you pick from options like “the number is higher than before”[1], and it would keep track of memory values that met the criteria you’d been specifying. After a half dozen questions like that (and maybe 10 minutes of gameplay) you’d usually have your memory-value found. :)

    [1] You could also just look for exact values. So, enter the amount of gold you have, let’s say $312. If that had more than one match, you’d buy an apple or whatever’s cheap, then search again for your $307.

    1. Abnaxis says:

      The game doesn’t give “exact numbers” feedback on overdrive gauge, just a picture with a bar that fills.

      My guess would be that the overdrive numbers are next to wherever HP and MP are stored for characters–I’d probably just start messing with numbers in that neighborhood and see what I get. I assume Shamus already tried that though.

      1. tmtvl says:

        The idea is “overdrive is ???, so we ask for all values. Character gets hit, overdrive bar goes up, we ask for all values higher than last round. Character doesn’t get hit, overdrive bar stays the same, we ask for all equal values. We use our overdrive, it goes back down, we ask for all values that went down.”

        Although that would fail if the overdrive bar was implemented as something that ticks down instead, but who knows.

        1. Abnaxis says:

          Right, but the footnote of ETs post had asked if you could search for an exact value. You can, but you have to know what to search for.

          Actually, I’m pretty sure (?) you actually can scan for increase/decreases with CE, though I’ve never personally tried. You can and do search within previous results when you’re using the tool.

          Even if you can’t look specifically for increments, you could scan for zeros after using overdrive, charge overdrive (this is pretty easy when you’re giving characters stuff like very high damage since the charge can scale off damage done*), filter out every non-zero value, use overdrive, scan for zero, and repeat until you’ve narrowed everything down.

          The idea is, you don’t know what the data type or the max value is, but you know when it’s zero and zero is zero no matter the data type (though you still have to worry about how many bytes it is) Scanning for zeros sucks but with persistence I think you could get it.

          *Thinking in it more, I’m willing to bet “max” overdrive depends on character level. Overdrive charges from stuff like taking damage or dealing damage, etc–stuff where the actual numbers driving the charge greatly increase from initial game to late game. I’m willing to bet you get X number of overcharge points per damage dealt/whatever, but the max of the gage goes up with character level to account for that.

          1. Shamus says:

            Since people are so curious about this, my process was thus:

            1 Make overdrive go up. Search for values that went up.
            2 Do some dicking around without charging gauge. Search for values that are the same.
            3 Make it go up. Search for values that went up.
            4 Repeat 2 & 3 several times.
            5 Burn the OD. Then search for “zero”

            That last step always hit a dead end. No matches.

            Some theories:
            * Maybe the act of USING the OD is enough to charge it back up a little. Like, STARTING the OD takes it to zero, but then Tidus his the monster and that charges the gauge a little. Maybe I should have searched for values that went down, not values that were strictly zero.
            * Maybe the OD gauge doesn’t go to zero. Maybe it runs from -128 to 127 or something else weird.
            * Maybe it resets to 1 for some reason? You never know.

            1. Abnaxis says:

              I wonder…

              Since summons all have overdrive gouges, maybe you could use that somehow? Like summon something, unsummon it, summon something else to see if you can narrow down a value?

              How are characters’ stats stored anyway? In my experience, most stuff like HP, MP, AP, Strength, Magic, fire resistance, etc, etc are all in a neighborhood with one another. My first instinct in this situation would be to find that stat block and watch that neighborhood for changes when the OD gage charges, preferably for more than one character at a time if the block is small enough

            2. bobbert says:

              How is -128 stored again?

              0000 0000?
              1111 1111?
              some thing else?

              1. MrPyro says:

                Depends on how they’re representing negative numbers, but if they’re using the standard of two’s complement, it would be 1000 0000

                https://en.wikipedia.org/wiki/Two%27s_complement

            3. galacticplumber says:

              Something to account for is that there are various overdrive modes you can unlock by repeatedly doing various things. Some overdrives can charge from attacks, or when an enemy dies, or when the character takes damage, or when someone else on the team takes damage. Point is? Based on what overdrive mode the character is set to there are clear, defined rules about what actions/circumstances increase gauge.

          2. Echo Tango says:

            The footnote was only explaining the capabilities of the cheat software, and right after explaining the more capable ability of searching for unknown values. The opening sentence was asking if the cheat engine had less manual ways of finding data-values, so assuming that you want to search for exact values doesn’t make sense. (Especially since the bar in question is only visual without numeric values to show the player.)

    2. Dreadjaws says:

      Yeah, but like Shamus explained, this thing is very situational and there are different kinds of values. You have to do the search for each one, and that takes a lot of time.

  14. Soldierhawk says:

    The Seymour’s Haircut jokes honestly never get old. I laugh like an absolute dork every time I get to one.

    It makes me so happy to see you talking about X again. It’s truly one of my favorite games of all time.

  15. The Rocketeer says:

    It’s fairly well-known (or at least widely believed) that the AI in the Nintendo Wars games knows the results of its RNG before committing to actions. This is very easy to observe with any of the CO Powers that affect “luck,” i.e. powers that affect the randomness of damage results. These powers are often very bad for players, as some of them are a statistical wash or even lower the average damage of your turn by expanding the bottom limit of your damage more than the top end. But when the AI uses one of these powers, you can often see them roll through with attacks that deal massive damage thanks to good rolls… and nothing else. Though they still move their units into position, they don’t then follow through with attacks that give bad rolls (the player can witness any CO do this from time to time.). Often players will see CO’s like Flak and Jugger use their CO power and follow it up with few or no attacks, as they rolled badly on all their possible encounters.

    The Nintendo Wars fandom is sometimes known to make light sport of the developer’s name, Intelligent Systems.

    1. Dreadjaws says:

      Fire Emblem does this too, and you can easily spot it by abusing the in-battle save system.

      Let’s say you have two troops (an archer and a mage) and the enemy has two too (a knight and a mage). If you save the game, then stand with your mage in front of the enemy’s knight and choose an attack, you can see the amount of damage it can make and the chance for that attack to succeed. If you attack then reload the save and do the exact same actions, the result will be the same. The attack will succeed or fail like it did last time and the damage will be the same. So save scumming to get the advantage doesn’t seem possible… at first.

      See, if instead you go and attack the enemy’s mage with your archer and then go and attack the knight with your mage, now the result of that battle might be different. I don’t know exactly when the RNG dice are rolled, but it would seem there are external factors that either affect the outcome of the rolls or cause new rolls to be made.

      And yes, you can also spot the AI abusing the system in its favor too.

      1. Chad+Miller says:

        The thing about save/reloading doesn’t really prove anything about when results are rolled. Console RNG in general is pretty weird. The thing where an arbitrary action causes different random numbers to come out is actually somewhat common in console-only games and gets more so the further back you go. Tool-Assisted Speedruns (and very occasionally, non-TA speedruns) often exploit this; if it’s known what advances the RNG, that often opens the door to intentionally trying to get the RNG to spit out whatever is most useful to the run.

      2. Max says:

        I’m just gonna comment on the Fire Emblem thing because I actually learned to abuse RNG in the GBA Fire Emblem games, not sure how well it applies to the newer games. First of all, the numbers are not truly random, they are pseudorandom, a predetermined sequence that to an observer looks pretty random. A seed value is used to determine where in the sequence to begin, and then it just goes through the sequence in order unless a new seed value is given.

        This is why when you save and reload and take the same action you get the same result, the game is stuck on the same point in the psuedorandom sequence. And if you take a different action you advance the sequence and get a different result from the other action. The RNG abuse I learned was to advance the pseudorandom sequence without taking battle actions.

        When you are choosing a location for a unit to move, but before confirming the move, an arrow appears showing the path it would take. For some destinations there are multiple possible paths, and it randomly chooses which to show. So you can advance the psuedorandom sequence by repeatedly generating these random paths on the map.

        Most games would hide the fact that the random numbers are actually pseudorandom by picking a new seed at some point or possible having a different seed every single time a random number is generated, but Fire Emblem seemingly never does this. So every time you reload you will always be at the same point in the sequence.

        I hope I explained that well.

        1. The Rocketeer says:

          Speaking of pseudorandomness and Final Fantasy, there’s a fairly well-known exploit for Final Fantasy XII that uses the known sequence of the RNG values to guarantee certain outcomes, most notably chest spawns and contents. They call this the “Cure List,” as it works by having a character repeatedly cast the Cure spell and checking the pseudorandomized HP restoration to identify the player’s current spot in the result table while advancing that table one increment each time. So, if you want something extremely rare like the Henne Mines Zodiac Spear or the Seitengrat, you can look up what points in the PRNG results will give you the chest and the item, cast Cure until you arrive at the correct value, et voila! No spending all weekend praying for a 0.1% result you reroll by zoning three areas away and re-fighting swarms of monsters on your way back.

          1. galacticplumber says:

            If memory serves you also need a save from the games tutorial level to properly use this method. Pretty simple to get, but I don’t think it will work if just case cure with stats that wouldn’t necessarily produce the table’s results.

    2. John says:

      I have long suspected that Nell is overrated. On behalf of my confirmation bias, I thank you.

      1. The Rocketeer says:

        Well, I’m not sure what you mean by “overrated,” but you could say that an NPC Nell will be able to make somewhat different use of her innate CO luck bonus and amply better use of her CO/SCO Powers. For instance, a Nell AI will know when sending a Mech to attack a full-health AA from a road will result in one-shotting it or at least reducing it to <3 HP, when it would normally be sort of suicidal due to counterfire, especially against a Max or a Kanbei or something. An AI Nell will be able to make smarter use of her troops, as opposed to a player, for whom Nell’s luck bonuses amount to an invisible average increase in base attack power that diminishes with unit health and enemy defense, since Luck is actually sort of complicated in Advance Wars.

        For a player, Nell’s bonus and powers amount to giving you better average results over a standard CO with no specific drawbacks, although they can result in dumb player decisions if you start sending infantry and mechs against AA’s and tanks with the expectation of huge bonus damage. Because an Advance Wars player should, in theory, not want to spend a lot of their time biting their nails hoping an unseen die roll makes the difference between a success and a setback, players aren’t really incentivized to intentionally put themselves into that situation more often knowing that the dice are somewhat more likely to deliver success— especially if they start psyching themselves into moves that can only pay off not just with a lucky shot but with shots so lucky only Nell can achieve them.

        The question is whether a statistically above-average jack-of-all-trades CO with no definite downside is preferable to a CO with stronger concrete benefits, even at the expense of some definite drawback. Most players will prefer some particular CO talent that they enjoy abusing or which plays well against a known challenge, and even newbie-friendly all-rounder Andy’s ability to self-repair makes him uniquely useful in certain campaign maps or against certain CO’s that can deal field damage like Hawke or Drake.

        For what it’s worth, I should admit that I’m garbage-tier at all things turn-based tactics. I just happen to have some knowledge of Advance Wars thanks to the excellent and thorough Let’s Plays of Advance Wars and Advance Wars 2 by Paul.Power, which I strongly recommend to anyone and everyone. AW2 was LP’d first, so consider starting with that one if you want to read them, even though that puts the games themselves backwards.

        1. Philadelphus says:

          Links are broken, but if they’re the ones on the Let’s Play Archive I know the ones you mean. (Need to get around to finishing reading the second one, I got up to the final battle and haven’t quite gotten around to finishing it…)

        2. John says:

          Ah. What I was getting at was that (1) it takes a hell of a lot of work to unlock Nell (at least in Advance Wars 1) and (2) she’s just not that interesting. The effects of her stats and CO power are thoroughly non-obvious in ordinary play. Given the choice, I’d rather play as Andy. They’re both generalists, but at least I can tell that Andy’s CO power is doing something. I could never be certain when I was playing as Nell.

          That said, it’s been a long, long time since I last played as Nell and I may be misremembering things slightly. I didn’t bother to unlock her in my recent playthrough of Advance Wars 1 and other games have distracted me from starting on Advance Wars 2.

          1. Mark says:

            I think Nell is most effective in multiplayer in the worst way possible. This is because humans will plan on certain matchups often many turns in advance. Nell’s ability and especially her CO powers can punch holes in strategies you otherwise had no business beating.

          2. GloatingSwine says:

            Nell is generally considered a good CO if you understand how Luck works in Advance Wars. Luck basically just gives you free damage. On average she will do 1 extra damage all of the time (normal COs will do 1 damage half of the time due to luck), and when you use her CO power any attacks you make will do 3 more damage than they would normally.

            And Luck damage is added after the normal attack vs defence calculation (but is modified by terrain defence), whereas the normal damage increasers like Max’ extra damage to direct units is added before it. So Nell with Lucky Star up can get infantry to do a reasonably reliable 3 damage to any target, even a Neotank.

            Advance Wars has a pretty active multiplayer community due to being replicated in a play by web format, so the relative power of the COs is pretty well discussed.

    3. Mark says:

      I just came down here to comment about Advance Wars and luck with Flak/Nell/Jugger; it’s the first thing I thought of.

  16. EOW says:

    The way to unlock tidus’ overdrives has always been “use 80 of any” as long as i remember, so maybe the guide you checked was just plain wrong.
    Anyway, this was a weird, but very interesting article, i love knowing about these “behind the back” coding stuff.

  17. Ninety-Three says:

    The supposed cheating in Blitzball reminds me of the interesting AI in Worms 2. On max difficulty It was a game where the AI would take blatant advantage of being a computer to take unnatural shots where it throws a grenade halfway across the map, bounces it off four different pieces of terrain and lands it perfectly on your head. On the lower difficulties, rather than give the AI different behaviour they simply added a hardcoded chance of randomly nudging their aim a little to the left. When the bots attempted a normal shot in an open field it looked like an ordinary human miss, but they still had the code for those godlike quadruple ricochets so sometimes they would attempt one, get their aim nudged and blow themselves up attempting a shot that didn’t make any sense at all.

    1. bobbert says:

      Man, worms was so much fun. There used to be a lot of artillery games. I wonder why there aren’t any more.

  18. Syal says:

    Inventory talk reminds me of Final Fantasy 3, where you could raise a character to level 99 and glitch up the best equipment in the game by organizing your inventory in a specific way and then getting 100 of something, potions being easiest.

  19. Dreadjaws says:

    Man, I remember years ago always trying to find crazy ways to break a game using Cheat Engine. I ended up with some games making it impossible to progress, but it was all in the name of fun, so it was no biggie.

    It’s interesting to see how certain games handle things. For instance, in certain games, giving you enough experience to reach max level would instantly give you all the stats, but other games actually had you level up over and over until you reached the level, which meant you’d listen to the “Level-Up!” fanfare each time. Giving you a lot of health in a game might simply make your normal health bar not deplete until you actually had enough damage, while in some other game the health bar would grow until it shot out of the monitor’s bounds.

    You can also use some hex-editing tools to change text inside some games, which is always fun. Gotta be very careful with that, though, and not go out of the bounds of the established text or you could make the whole thing unplayable. Always have backups.

  20. Patrick the Incredibly bored says:

    I very recently played through FFX for the…I dunno….20th time? Something like that? Anyway….I committed myself to finishing the entire sphere grid for every player and unlocking every ultimate weapon. This requires more patience than anything, since….you know, I have a few thousand fucking hours invested playing this affront to theoretical fashion and geometrical hair design. Anyway….

    Cheating really isn’t needed once sphere progression reaches critical points. Basically, once a character completes his 5th or 6th “area” on the grid he/she is an unstoppable juggernaut, capable of taking down sin almost singlehandedly. I leveled up Yuna to the point where she was doing max damage (99,999) with her butterfly wand. This is kind of a break from previous versions that always left endgame stats just short of being to high, thus making the climax “to easy”. When I finally decided to get around to defeating Sin I didn’t have to use anyone but Yuna and her “weapon”. Which looks more like something children would use to blow bubbles than a device to defeat a mountain-sized chuck of ultimate evil wrapped around the universe’s most powerful dickhead sorcerer.

    Anyway…. maybe think less about how to cleverly defeat the Luca Goers and find a cheat code for your busted ass kidneys, Ikea boy.

  21. tmtvl says:

    Doesn’t CE have some kind of pointer tracking functionality? I seem to vaguely recall reading a book about reverse engineering video games with it.

  22. Thomas says:

    I don’t think I ever noticed the game cheating at Blitzball – though this makes sense, as once you are able to practice (I did so against the Ronso team, because they were hilariously slow allowing you to swim rings around them) and level up a bit the AI can’t chase or corner very well in the field. After you dump half the Aurochs and fill your roster with an assortment of surprisingly athletic shopkeeps, of course. So I was either completely outclassed (eg Luca Goers first match) or I dominated them to the point where long odds chances didn’t make much of a difference.

    Speaking of damage caps – I wish I knew about them before I started running into the Dark Aeons of the international release. I’d powerleveled Auron who only gets one or two hits with his Overdrives (I think? Been a while), and the Dark Aeons are seriously post-game bosses who block off old areas you might try to revisit after getting the airship.

    1. Syal says:

      Auron gets one. One hit with his overdrives. He’s Kimahri bad.

      1. galacticplumber says:

        Actually in later editions his last overdrive hits twice in an AoE. Sure he’s not tidus or wakka levels of physical damage for single target, but he’s actually better than most for serious fights like Penance.

        1. Syal says:

          Ooh, neat. Still competing with the non-limit doublecast Ultima from Lulu or Yuna, but at least he’s strictly better than Kimahri.

          1. galacticplumber says:

            Doublecasting ultima costs way more turn slow than using an overdrive. In any serious fight where enemies don’t just drop in two hits that’s dramatically worse than popping tornado.

    2. Patrick the Stats whore says:

      It cheated all the time. mostly on the “random” modifier to any roll. The game would be far to basic and boring if each interaction were compared directly. My SHT vs your CTH or your PAS vs my BLK. So they injected the “variable” to each roll that would/could affect an otherwise obvious outcome. But I’m almost certain it had a % basis and not a straight numerical one. As in each stat could go +/- (say) 10% rather than a d4, or something like that. There was an obvious rubber band to this as well. The more you were beating a team the more often your stat would lose %10 and the opponents would increase by 10%. Which made it not really random at all.

      And I still think the Luca Goers didn’t get their proper comeupance. Beating them was nice and all but there was never a scene in which they acknowledged it, apologized, got booed by their fans or in any way paid for their arrogance. I never felt fully satisfied that they got what they deserved. I need to sign Jimmy Hopkins and CJ.

      1. galacticplumber says:

        Does it help that due to how the relative stat curves on level up work the Goers actually start some of the best early on, but just continually get worse relative to everyone else as time goes on? Like…. They start somewhat threatening early on then drop off a cliff to be the least threatening team bad? It also doesn’t take long for this to set in noticeably.

        1. Patrick the Stats whore says:

          Im not quite sure how the stats work on LVL up. For example Keepa the Aurochs starting goalie only gets one stat buffed per level up, and that could be any stat. Ideally it would be his Catch but to often its some useless stat like HP or speed. For other characters (like Brother or Tidus) they have several stats increased every ding, sometimes by significant point increases, too. More than just a single point.

          So I would guess that all of this is set in the background for each character. Not only setting what their max LVL is for each stat but HOW MANY stats are increased on LVL up, how many total skill points are allowed and so forth. So if the Luca goers are limited to, say, 1-2 points on only one stat per LVL up they would quickly get overtaken by a character that gets 8-9 points for 3 stats. Which is as it should be since, you know, the Luca Goers are shit-eating dickheads with sweaty man boobs.

          1. galacticplumber says:

            Every character DOES in fact have specific stat totals for every level. When knowledge of how level trends work is brought up by a knowledgeable person it is describing what the character or group is like relative to an average of others at the same level.

            The Luca Goers are amazing relative to most early, then rapidly turn to shit.

            The Aurochs start as the shittiest team conceivable, and stay that way for the vast majority of the curve before becoming the highest stat team at levels that should never be reasonably seen.

            More or less all Al-Bhed win at everything relevant to the game forever, topped only in strange and terrifying outliers.

            Kilika beasts start out average before becoming the second most threatening team during reasonable late game levels.

            Ronso, and Guado have excruciatingly severe overspecialization of stats such that you should almost never lose to either. Ronso just actually won’t catch a fast player swimming away from them, and Guado can’t tackle or get tackled.

  23. Mr. Wolf says:

    Actually, I’d be lazy and decadently spend four bytes on each variable. It’s 2021. Worrying about the memory footprint of the player’s inventory these days is like trying to lose weight by trimming your fingernails.

    Until you remember you’re a giant and have six fingers on each of four hundred hands and you’re seven kilograms too heavy to board the space shuttle.

    True story.

  24. bobbert says:

    I guess this makes me an old-fart.

    Multi-byte words have always felt unnatural to me.

  25. King Marth says:

    Reminds me of the magic of discovering how Missingno worked in the original Pokémon games; it’s a glitched encounter with a Pokémon number of around 200, so when the game goes to set the bit in your pokédex to show you’ve “seen” that species, it goes past the 151 fixed entries and into the memory of your item storage. Your sixth item gets the 128-bit set, and the item cap of 99 isn’t enforced, though you get a couple of odd sprites in place of numbers to indicate how many items you have until you’ve used enough to go back under 99. Never tried it with something you could buy, so I’m not sure what happens if you get another item while above cap.

    The best part is that the glitch didn’t need any external hardware, just a list of instructions; the starting capture tutorial had OLD MAN in a battle which was accomplished by overwriting the player’s name to display normally in the battle UI. To restore your name afterwards, it was stored in an unused section of memory: the encounter tables for your current location, a town with no tiles to roll for encounters. Once you walk into a new location with encounters, the current encounter table is updated from storage with the new location and you’ll never notice… Unless you Fly directly to Cinnabar, another town with no encounter table but with a coastal area counted as part of town but capable of rolling encounters (which would naturally use the last known tables from the water area you crossed to get there, right?). Different values of player name thus influence exactly what kind of glitched Missingno encounter you get.

  26. Radkatsu says:

    I wrote a fairly lengthy post on Cheat Engine and the whole DOOM Eternal debacle last year. Basically it was to do with putting Denuvo anti-cheat into single player games and why they might do that. In short… because they want to kill single player cheat programs like CE since they want to sell you exp boosters and the like. Can’t have competition from something like CE, after all!

  27. Hal says:

    Tangentially related to cheating in Final Fantasy games:

    I play the original FF1 regularly; one of my favorite games of all time. One experiment I asked myself once was, “How low of a level can you class switch?” There are people who accomplish such things by figuring out tricks for besting the bosses at super-low levels . . . yeah, I didn’t really want to go through with that. Instead, I thought I’d use cheats (Gameshark-esque) to put the Canoe in my inventory, allowing me to break sequence and get the Airship sooner, thus accessing class changes.

    Except, as I learned, adding the Canoe to your inventory doesn’t actually give you access to it. It’s availability is still enabled by quest completion within the game. It’s presence in your inventory is just text so you know it’s there, nothing more.

    Gotta say, that was kind of a disappointing discovery.

  28. MelTorefas says:

    Man this was a fun article. I loved missing with my Gameshark Advanced back in the PSX days, it let you do searches and directly view/modify blocks of memory kinda like how Cheat Engine does now. I still remember spending hours mapping out all the character statistic blocks in Vandal Hearts, or mapping out every possible job (including unused ones) in Final Fantasy Tactics. Or, more recently, using Cheat Engine to give my character better starting stats in Baldur’s Gate 3.

    Memory usage in games, especially old games, is a lot of fun. Like how they can do the single-ROM Link to the Past + Super Metroid combo randomizer where you literally move back and forth between games, because those two ROMs happen to not use any of the same memory addresses or something.

    It reminds me of a thing from the Commodore 64 days (yeah I’m that old >.>). When playing the 2nd Edition DnD game Pool of Radiance, when you went to load a character you could put in a disk where you had a saved character from one of the C64 Ultima games and load them, and it would actually “work”. You’d get ridiculous stats like -35 armor class (-AC being better in 2nd Ed) or non-existent items like a “1 Sword +1”, and your character might end up being uncontrollable in battle. I guess the games were built similarly enough that the data was technically readable/processable by the other game (though I don’t recall it working in reverse, from PoR to Ultima).

  29. Trevel says:

    re: memory management and inventory

    It’s not just that it makes the file take up a fixed size on the disk, it also means that it can copy the save directly into memory and potions are always at exactly the same place memorywise, compared to where the game memory starts, which it can potentially ensure is in exactly the same place (On the console, at least, the port has less control over memory)

    So if I’m looking up # of potions it’s at &1544 or some such, always forever, which is much faster computationally than scanning a list of items to see if it has potions in it. Tidus’ health is always at the same place, et cetera. Yay, pointer math. This isn’t as important today as it was 20 years ago, and it might not have been that important 20 years ago, but saving a few cycles of computation is an optimization step that is more important than saving a few bytes of memory, probably.

    In Skyrim, OTOH, every save file is basically a mod that restores the game to how you saved it, so save files start out small and get much larger as you make more modifications to the world. There’s too many potential items to just list them all out, so you have to do the extra math to handle it all. (Plus, you have to implement loading mod files *anyway*, so might as well use the same logic.)

    If we want to talk about strange save files, though, back in Ultima 3 (which came out in 1983), if you had 1750 hit points it would store it as HEX 0x5017, which is a bizarre choice to me on multiple levels (Why backwards? Why is it storing decimal values as hex? Did it do ALL it’s math like that?) Inventory items were, of course, stored like FFX, the # of items of each thing in order in a list, and it definitely mattered back when you could be working with 64k of memory and a 5 MHz processor speed. (which makes the store-decimal-values-as-hex even more bizarre to me, at some point they decided that having save files/memory human-readable was more important than efficiency of math.)

  30. DwarfWarden says:

    I know this is an old post but damn if I haven’t been keeping up when I really shoulda been.

    I’ve recently been on a Steam FF binge myself and I’ve been learning how to edit memory values (which is how I managed to bypass the awful drop rates of Rydia’s summons in FF4) and I remember when playing FFX I used a cheat table I found on Fearless Revolution to circumvent having to fight the same bosses dozens of times over and over just to max out the sphere grid.

    I remember figuring out a lot of things the game rolls and doesn’t roll ahead of time. For example, I made the mistake of using a multiplier on my ‘XP’ of my Blitzball players during that championship match to where everyone’s levels were in the 30s. Little did I know the game doesn’t generate stats of players until you face them in Blitzball, so when I had to fight the Ronso team they were all in the 40s. Guess I deserved that one.

Thanks for joining the discussion. Be nice, don't post angry, and enjoy yourself. This is supposed to be fun. Your email address will not be published. Required fields are marked*

You can enclose spoilers in <strike> tags like so:
<strike>Darth Vader is Luke's father!</strike>

You can make things italics like this:
Can you imagine having Darth Vader as your <i>father</i>?

You can make things bold like this:
I'm <b>very</b> glad Darth Vader isn't my father.

You can make links like this:
I'm reading about <a href="http://en.wikipedia.org/wiki/Darth_Vader">Darth Vader</a> on Wikipedia!

You can quote someone like this:
Darth Vader said <blockquote>Luke, I am your father.</blockquote>

Leave a Reply to Mark Cancel reply

Your email address will not be published.