Deprecated: Function get_magic_quotes_gpc() is deprecated in /home2/jludwig/public_html/finalfantasy/hacking/textpattern/lib/constants.php on line 29
Final Fantasy GBA Hacking Notes: Spells and Monster Abilities
JeffLudwig.com
GOG.com

Spells and Monster Abilities

The Spell/Monster Ability List, by ID

Before I can decode spell data for you, it’s important to note the order of spells as referenced in FF1-DoS. In the table below, a hex value will be succeeded by four spells/abilities. The first spell has that ID, the second spell has that ID + 0×01, the third spell has that ID + 0×02, and the third has the ID + 0×03. White magic has an ID # between 0×01 and 0×20. Black magic has an ID # between 0×21 and 0×40. Monster specialty attacks are listed after the spells (0×41+). Without further ado, here’s the spell list!

White Magic

0×01 Cure Dia Protect Blink
0×05 Blindna Silence Nulshock Invis
0×09 Cura Diara Nulblaze Heal
0×0d Poisona Fear Nulfrost Vox
0×11 Curaga Life Diaga Healara
0×15 Stona Exit Protera Invisira
0×19 Curaja Diaja Nuldeath Healaga
0×1d Full-Life Holy Nulall Dispel

Black Magic

0×21 Fire Sleep Focus Thunder
0×25 Blizzard Dark Temper Slow
0×29 Fira Hold Thundara Focara
0×2d Sleepra Haste Confuse Blizzara
0×31 Firaga Scourge Teleport Slowra
0×35 Thundaga Death Quake Stun
0×39 Blizzaga Break Saber Blind
0×3d Flare Stop Warp Kill

Monster Specialty attacks

0×41 Icestorm (Winter wolf) Flame (Fire Lizard) Stone Gaze Paralysis Gaze
0×45 Flash Flame (Hellhound) Earthquake Death Gaze
0×49 Gaze of Pain Death Gaze Icestorm (White Dragon) Flame (Red Dragon)
0×4d Inferno Flame (Hydra/Chimera) Stone Gas Mind Blast
0×51 Poison Gas (Green Dragon) Thunder (Blue Dragon) Deadly Gas (Iron Golem) Snort (Nightmare)
0×55 Nuke (Death Machine) Ink (Kraken) Poison Darts (Manticore) Dazzle (Vampire)
0×59 Tsunami Cyclone Thunder (Scarmiglone) Scorch
0×5d Stone “Ray” Excalipoor Wind Slash Wave Cannon
0×61 Tidal Wave Wormhole (Atomos) Comet Sneeze (Typhon)
0×65 Acid Rain

Spell Tables

First of all, let me say that it has been a year or more since I’ve looked at some of this data, and so my descriptions may be as clear as mud. Hopefully these notes will be of use and point modders in the right direction. Obviously, intimate prior knowledge of Final Fantasy- Dawn of Souls is expected to understand these notes. And, there’s definitely room for hackers to add to the knowledge base.

Well, let’s take a look at the heart of Final Fantasy 1 spells and abilities. The defining table is found at 0×1a19900×1a1d8f. Monster attacks are defined right after the spells at 0×1a1d900×1a1fdf. Every spell or ability is given a 16 byte entry.

For illustration’s sake, let’s take a look at the definitions of a few spells:

  Where used Target Power Attack bits Type Graphics % Sp. Lvl. MP Cost Price
Cure 03 10 10 00 00 00 07 01 01 01 03 00 32 00 00 00
Flare 02 01 64 00 00 00 01 3d 6b 08 32 00 40 9c 00 00
Ice 3 02 01 46 00 20 00 01 39 18 07 28 00 30 75 00 00

What do each of these headings/byte pairings mean?

Where used— Whether this spell used in battle, while traveling, or anytime

01- While traveling 02- In battle 01 OR 02- Anytime

Target— How the spell is targeted in game. It will be one of these five values:

01- All enemies 02- One enemy 04- Caster 08- All allies 10- One ally

Type— The spell’s general classification. This determines how any other data in this table is applied.

01- Damage 02- Damage by family (undead) 03- Inflict negative status 04- Speed down 05- Morale down (Fear spell)

06- Unused 07- HP up (Cure, Heal) 08- Cure negative status 09- Defense up 0a- Bolster resistance vs. elements/special attacks

0b- Attack and Hit% pp (Saber) 0c- Hit % doubled (Fast) 0d- Attack power up 0e- Evade % down 0f- HP maximum

10- Evade % up 11- Remove all resistances 12- Inflict negative status (300 HP or less- 100% effective)

Power— Generally affects the damage for damage spells, and healing power for healing spells. This value is applied once for every “stairstep” (in stock FF1-DOS, this is every 10 Int points). So, a Black Mage with 33 Intellect would have this value applied to the power of the spell three times.

For damage spells, the power of the spell is augmented by this value every “stairstep”. For healing spells, the power of the spell is augmented by the base power of the spell every “stairstep”. For infliction spell, the chance to inflict the condition is augmented by the % value every “stairstep”.

However, for condition inflicting/curing spells, this becomes a bit mask for which conditions are being referenced. For instance, take the Rally spell from my mod 0×38:

Confuse Mute Sleep Stun Blind Poison Stone Kill
0 0 1 1 1 0 0 0

Graphics— Spell graphics are by default 0×01 to 0×40, in spell order. Then, monster attacks are coded 0×41 to 0×65. Lastly, item graphics are coded 0×66 to 0×6d.

%— This is a multiplier that affects the healing power of healing spells, and the chance to inflict status effects on enemies. This does not seem to have any bearing on the damage dealt by pure damage spells.

The Dia spell type

This affects every spell of type 0×02. By default, the Dia spell family affects only the Undead family. This is driven by these four bytes:

0×07b7e220 08: mov r0, #0×08(Monster family bit to check, while casting Dia in battle)

0×07b7e440 08: and r0, r1 (Compare family bits of monster currently being hit)

In the Bestiary, this check is made again, in determining whether a monster is vulnerable to Dia:

0×04133620 08: mov r0, #0×08(Monster family bit to check, reporting in Bestiary)

0×04133840 18: and r0, r3 (Compare monster with check to see if we report weakness)

Changing spell order

If you are changing the order of spells, you will be subjecting yourself to quite a bit of pointer hacking. For a more in-depth look at these pointers, jump to Spell Re-ordering.

ludmeister

Date published: 2011-11-17

Leave a comment ->

  1. How is it that you were able to change every “stair step” to 2 Int instead of 10?

    — Ethereal Embrace · Nov 27, 12:38 PM · #

  2. Ethereal:

    That’s a good question… unfortunately I did not document that finding in my digital notes. As Final Fantasy 1 was my first project which I hacked with only a hex editor, a debugging emulator, and ingenuity, I wasn’t exactly a pro at documenting what others might want to know…

    That said, I may still have the notebook which I scrawled various Hex addresses on as I traced code execution. If I can find that and do a bit of research, I may be able to find this. Give me a bit of time.

    ludmeister · Nov 29, 07:16 AM · #

  3. Ethereal:

    I've fired up my GBA Debugger and I believe I’ve found the byte in question. Keep in mind that this will only work for attack magic:

    0×07b814: 0a —> 02

    This has the effect of changing the Intellect divisor from 10 to 2. I don’t believe I ever found the divisor for cure magic, let alone for status infliction.

    ludmeister · Nov 30, 10:24 PM · #

  4. Okay, thanks. I recently found out something that’s a bit troubling. I think it might just be because of my own file of DoS, but when I changed the base power of spells, my damage was unchanged. But when I calculated the damage for Fire, it seemed to have taken into account the (unchanged) base.

    It might be one of those things that will only change when I make a new file or remove the spell and buy it again, honestly, but I’m not sure. I’ll have to check.

    — Ethereal Embrace · Dec 14, 05:12 PM · #

  5. Okay, so I’m here to report something I found alarming. I gave Piscodemons the AI record to that of a Ghast (the one that involves the Fire, Thunder, and Blizzard spells), and when I use mute to them, it has no effect: the piscodemons continue to cast Fire.

    Is it bugged somehow? Or does this actually directly involve that Piscodemons normally don’t have an AI function.

    — Ethereal Embrace · Jan 20, 06:26 PM · #

  6. Did you begin working with a stock version of Dawn of Souls, or did you begin working with the Mod of Balance?

    This makes a huge difference, in that I added a number of AI options, in addition to modifying existing ones. There wasn’t enough space to do what I wanted to do where the initial AI table was placed… so I moved the table :-)

    In Mod of Balance, the AI table begins at 0xee1800, and runs through 0xee1e3f. This may help in your endeavors…

    As for directly answering your last question... I'm really not sure. I've not done a whole lot of playing with the Silence spell... could it be that Piscodemons are immune to Silence?

    ludmeister · Jan 20, 09:39 PM · #

  7. Okay, so I finally decided to post another thing that I found unsettling.

    I was changing some your hack’s spells , I noticed something. This is involves the animation bit.

    When I change a spell to look and act a certain way, it will do it.

    However, when a monster does that same spell, it will undoubtedly act the way it was changed, but it will look like the same animation that was previously used.

    I’m not sure how to change this.

    — Ethereal Embrace · Mar 19, 08:00 PM · #

  8. Ethereal,

    Yes that is true, and it is something that I had to deal with as I created my mod. For example, I placed the Temper spell where the Haste spell used to be, and when Clay Golems cast Temper, the game showed the Haste graphic.

    The gross thing is that my notes for where this information is driven is no longer available as I was scribbling it down on scratch paper as I went along, rather than working with an open .txt document.

    You’ll need a copy of the Visual Boy Advance debugger for hackers to determine what’s going on. IIRC, the game assumes that for monsters using spells, it uses the spell’s ID as the graphic, and not the dedicated graphics bit, as detailed above.

    Who said changing around the spell system was easy?

    ludmeister · Mar 21, 06:51 AM · #

  9. I’d like to note that the ‘%’ value refers to the base power for attack spells. It may do the same for curative spells, but the spell table is out of date for Mod of Balance 3.3 and this page is a bit confusing on the matter.

    Also of interest is that because status spells don’t use the power value for stairstepping, every status spell uses the same stairstep value.

    Finally, the attack bits use the same table for values of the elements that armor and weapons do. You probably know all this already, but I think this info should be around somewhere for everyone to see it.

    — Solar · Jul 30, 06:45 PM · #

  10. Hey, I would like to request how to adjust or remove this feature that you added in v2.0:
    “Damage spells inflict much more randomized damage. Damage is between 1/2 to 3/2 of spell’s base power…”

    I’ve been trying to balancing out the different spellcasters’ powers and this is legitimately making the process borderline impossible.

    Also, if it’s not too much trouble, I would really like to know how to add this feature from v3.0 to a v2.2 mod.

    “The new algorithm is x = (Spell Power + (2 * Int) – Monster’s Resistance). x is increased by 50 if target is vulnerable to spell, and decreased by 100 if it is protected versus it. The same roll of 0 to 200 applies, with the same rule of success. Note, that it is possible to still be affected by a spell that you are protected against!”

    Thanks in advance!

    — Arc · Nov 8, 04:08 PM · #