• Topic Archived
You're browsing the GameFAQs Message Boards as a guest. Sign Up for free (or Log In if you already have an account) to be able to post messages, change how messages are displayed, and view media in posts.
  1. Boards
  2. Final Fantasy
  3. The spells that don't work

User Info: romraptor

romraptor
5 months ago#1
I've fixed HEL2, LOCK and LOK2.
As far as I understand SABR, TMPR and XFER don't work AT ALL?
I'm thinking of removing them from shops all together not to confuse new players.
Anything else that needs to be removed in that case?
Spell names need to stay because enemies might use them or do they just have their own attacks?

User Info: Diamond_Dragon

Diamond_Dragon
5 months ago#2
You should check out Astral Esper's Final Fantasy Restored hack. It fixes all the bugs, including getting Saber and Temper to work. I don't have a link to it handy at the moment, but it shouldn't be hard to find.
Don't confuse this with her FF Restored & Rebalanced hack which goes much much further in attempts to balance and expand the game. That's a great hack that's still in the works, but not the quick fix you're looking for I assume.

Enemies use a variety of spells and special attacks. For example, a Mage can use the spell RUB, and Frost Wolves can use the special attack Frost. Some enemies like the Eye can use both spells and special attacks.

User Info: romraptor

romraptor
5 months ago#3
Thanks, I had a look at the patch! I've already managed to implement most of the hacks found on this page that fix clear bugs and where the solution is exactly what was originally intended. Not only would a large patch like FF Restored likely mess up my project, it would also change quite a few things I personally don't deem necessary. Anyone have patches that only affect SABR, TMPR or XFER? Or is it simply not possible to do "anything at all" to those spells without changing a lot of other things in the game?

User Info: BareknuckleRoo

BareknuckleRoo
5 months ago#4
I mean, they'd all be technically fixable, but not necessarily easily fixable like swapping the value of a byte or something. It's the way to due with what's stored in RAM in battle and what's not that causes some of the bugs.

SLP2 is also buggy in the hands of a player. Not generally worth it even though it's technically non-elemental. Would be much more useful if Sleep lasted longer. Enemies always cure themselves immediately due to a calculation bug if I remember correctly. SLEP is still useful, primarily because you can potentially delay multiple enemies with one level 1 spell.

AMUT is... questionable normally. It cures Silence rather than gives resistance, but there's only 4 enemies in the game with MUTE spells, and 3 of them are non-threatening under normal circumstances. It's not so much bugged as it is badly designed since MUTE is almost never used against your party.

• Eye has MUTE late in its spell cycle, and can be killed well before it gets to use it. If you can't do enough damage for some reason, it has low MDef and no status resistance, thus is extremely susceptible to MUTE, STUN, CONF, etc.

• Phantom has MUTE late in its spell cycle, normally dies in one round at this stage as it's undead and susceptible to HARM, FIRE, physical attacks, etc. Its nasty spells all come much earlier in its spell cycle anyways, so if you see MUTE come out you've already seen its scariest attacks. It does have XFER though, which does work when used by enemies, but XFER also opens you up to its Time elemental instant kill spells, so really you want to take it out before it gets to XFER, let alone MUTE.

• GrNaga has an absolutely pathetic attack stat of 7, nothing noteworthy as far as defensive stats, attacks with level 1 damage spells, and basically serves as free EXP if you meet one. You can always run from these, too. A weird oddity of an enemy.

• WzVamp is the only enemy in the game with MUTE whose MUTE spell may actually pose a threat under normal circumstances. You can always run from them, you'll have a Ribbon or two by the time you meet them, and unless you're surprise attacked you'll have one turn at blow them away with spells before they can hit you with MUTE.

User Info: ____bob____

____bob____
5 months ago#5
By the time you get to Wiz Vamp you have spell items to deal with them anyway.
R.I.P Ronnie James Dio

User Info: FreshFeeling

FreshFeeling
5 months ago#6
Added dumbness of AMUT that is maybe obvious but not yet mentioned: you can't use it if you're already affected by MUTE.

But it's kind of a meme on this board so actually it's great. Yay.
The feral chocobo calls with a boisterous "wark," not the domestic breed's mild "kweh."
https://twitter.com/RetroFreshTV

User Info: AstralEsper

AstralEsper
5 months ago#7
TMPR, SABR, and XFER aren't broken, exactly; the problem is that the routine that saves stats doesn't save Attack for player characters, Elemental Resistance for enemies, or Hit% for either. EDIT: I forgot that they aren't loaded, either. Supplemented with routines to fix the loading below.

The INT patch in the bugfix thread addresses this. Notably, you can configure the patch so that it is very conservative - basically, making INT just boost the chance that a spell will not be resisted. I'm not sure if there's a reason you wouldn't want to implement this, but you could just fix the routines that save attack, hit%, and elemental resistance, while leaving INT entirely unused, if you wanted to:

Make TMPR use the correct effect (it is bugged to use SABR's effect, which also boosts Hit% - but it's kind of beside the point unless you save that value)
30264: 0b

; Initialize enemies for battle (patch starts mid-routine at 32f93- basically, add 0x10 ahead of the in-bank addresses in the asm below)
af83: 4c ca af JMP $afca
af86: a2 14 LDX #$14 ;;; Get pointer for permanent data for enemy in A
af88: 20 09 ae JSR $ae09 ; XA = X*A
af8b: 18 CLC
af8c: 69 20 ADC #$20 ; XA += #$8520
af8e: 85 9c STA $9c ; and store in p[$9c] and in-RAM[0]
af90: a0 00 LDY #$00
af92: 91 9a STA ($9a),Y
af94: 8a TXA
af95: 69 85 ADC #$85
af97: 85 9d STA $9d
af99: c8 INY
af9a: 91 9a STA ($9a),Y
af9c: a2 13 LDX #$13 ; Set up in-RAM table in p[$9a] from p[$9c] using the table below
af9e: bd d6 af LDA $afd6,X ; (Yes, $afd6 not $afd8)
afa1: a8 TAY
afa2: b1 9c LDA ($9c),Y
afa4: 48 PHA
afa5: 8a TXA
afa6: a8 TAY
afa7: 68 PLA
afa8: 91 9a STA ($9a),Y
afaa: ca DEX
afab: e0 01 CPX #$01
afad: d0 ef BNE +$ef [$af9e]
afaf: a0 05 LDY #$05 ; Finish it by storing 1 in hit multiplier,
afb1: a9 01 LDA #$01
afb3: 91 9a STA ($9a),Y
afb5: c8 INY
afb6: a9 00 LDA #$00 ; ... 0 in statuses,
afb8: 91 9a STA ($9a),Y
afba: c8 INY
afbb: 91 9a STA ($9a),Y ; ... 0 in AI magic index,
afbd: c8 INY
afbe: 91 9a STA ($9a),Y ; ... 0 in AI special attack index,
afc0: ae d2 6b LDX $6bd2
afc3: bd b7 6b LDA $6bb7,X ; ... and enemy index in the enemy index
afc6: a0 11 LDY #$11
afc8: 91 9a STA ($9a),Y
afca: ee d2 6b INC $6bd2
afcd: ce d1 6b DEC $6bd1
afd0: f0 03 BEQ +$03 [$afd5]
afd2: 4c 71 af JMP $af71
afd5: 4c 8a 97 JMP $978a ; Some sort of graphics thing

; Table for setting up enemy in-RAM struct. Starts at index 2, actually
afd8: 04 05 .DB $04, $05 ; MaxHP -> HP
afda: 09 .DB $09; Absorb
afdb: 00 .DB $00; garbage (hit multiplier, overwritten later)
afdc: 00 .DB $00; garbage (status, overwritten later)
afdd: 00 .DB $00;garbage (AI magic index, overwritten later)
afde: 00 .DB $00; garbage (AI special index, overwritten later)
afdf: 06 .DB $06; "courage"
afe0: 08 .DB $08; Evade%
afe1: 0c .DB $0c; Damage
afe2: 07 .DB $07; AI (BUG?)
afe3: 00 01 .DB $00, $01 ; Exp
afe5: 02 03 .DB $02, $03 ; Gold
afe7: 00 .DB $00; garbage (enemy index, overwritten later)
afe8: 0b .DB $0b; Hit%
afe9: 13 .DB $13; Elemental resistance

afea: ea NOP
...
b00b: ea NOP

Change the jump addresses for these routines as follows:
335a9: 4c 49 b7 JMP $b749 ; Save data for enemy magic target

3b5c3: 4c 8f b7 JMP $b78f ; Save data for player magic target

; Load data for magic targeting player (start at 33612)
b602: ad a7 6d LDA $6da7
b605: 20 b8 be JSR $beb8 ; Play sound
b608: ad 8a 6c LDA $6c8a
b60b: 48 PHA
b60c: 29 03 AND #$03
b60e: 20 fc a0 JSR $a0fc
b611: 68 PLA
b612: 20 eb b5 JSR $b5eb ; Set pointers for warrior A: p[$92]=permanent, p[$90]=in-battle
b615: a0 00 LDY #$00
b617: 8c 76 68 STY $6876 ; target elemental weakness
b61a: 8c 7e 68 STY $687e ; target "courage"
b61d: 8c 86 68 STY $6886 ; target creature type

b620: c8 INY ; Y = $01
b621: b1 92 LDA ($92),Y
b623: 8d 6d 68 STA $686d ; target status ailments

b626: a0 05 LDY #$05
b628: b1 90 LDA ($90),Y
b62a: 8d 84 68 STA $6884 ; target Hit%

b62d: c8 INY ; Y = $06
b62e: b1 90 LDA ($90),Y
b630: 8d 72 68 STA $6872 ; target magic defense

b633: c8 INY ; Y = $07
b634: b1 90 LDA ($90),Y
b636: 8d 85 68 STA $6885 ; target evade

b639: c8 INY ; Y = $08
b63a: b1 90 LDA ($90),Y
b63c: 8d 7f 68 STA $687f ; target absorb

b63f: c8 INY ; Y = $09
b640: b1 90 LDA ($90),Y
b642: 8d 82 68 STA $6882 ; target damage

b645: c8 INY ; Y = $0a
b646: b1 90 LDA ($90),Y
b648: 8d 77 68 STA $6877 ; target elemental resistance
b64b: b1 92 LDA ($92),Y
b64d: 8d 7a 68 STA $687a ; target HP low byte

b650: c8 INY ; Y = $0b
b651: b1 90 LDA ($90),Y
b653: 8d 7d 68 STA $687d ; target hit multiplier
b656: b1 92 LDA ($92),Y
b658: 8d 7b 68 STA $687b ; target HP high byte

b65b: c8 INY ; Y = $0c
b65c: b1 92 LDA ($92),Y
b65e: 8d 80 68 STA $6880 ; target Max HP low byte

b661: c8 INY ; Y = $0d
b662: b1 92 LDA ($92),Y
b664: 8d 81 68 STA $6881 ; target Max HP high byte

b667: 60 RTS
bb68: ea NOP
...
bb73: ea NOP

User Info: AstralEsper

AstralEsper
5 months ago#8
; GFX and load caster data for player (start at 33694)
b684: ae 8f 6c LDX $6c8f
b687: d0 05 BNE +$05 [$b68e]
b689: a9 00 LDA #$00
b68b: 20 b8 be JSR $beb8 ; if magic, play 'cast' sound
b68e: ad 89 6c LDA $6c89
b691: 29 7f AND #$7f
b693: ae 8f 6c LDX $6c8f
b696: 20 2d a3 JSR $a32d ; load palette and do GFX?
b699: ad 89 6c LDA $6c89
b69c: 20 eb b5 JSR $b5eb ; Set pointers for warrior A: p[$92]=permanent, p[$90]=in-battle
b69f: a9 00 LDA #$00
b6a1: ae 8f 6c LDX $6c8f
b6a4: d0 04 BNE +$04 [$b6aa]
b6a6: a0 12 LDY #$12
b6a8: b1 92 LDA ($92),Y
b6aa: 8d 73 68 STA $6873 ; caster Int
b6ad: 60 RTS
b6ae: ea NOP
...
b6c7: ea NOP

; Load data for magic targeting enemy (start at 336d8)
b6c8: ad 8a 6c LDA $6c8a
b6cb: 20 be b4 JSR $b4be ; Set pointers for slot A: p[$92]=permanent, p[$90]=in-battle

b6ce: a0 02 LDY #$02
b6d0: b1 90 LDA ($90),Y
b6d2: 8d 7a 68 STA $687a ; target HP low byte

b6d5: c8 INY ; Y = $03
b6d6: b1 90 LDA ($90),Y
b6d8: 8d 7b 68 STA $687b ; target HP high byte

b6db: c8 INY ; Y = $04
b6dc: b1 90 LDA ($90),Y
b6de: 8d 7f 68 STA $687f ; target absorb
b6e1: b1 92 LDA ($92),Y
b6e3: 8d 80 68 STA $6880 ; target Max HP low byte

b6e6: c8 INY ; Y = $05
b6e7: b1 90 LDA ($90),Y
b6e9: 8d 7d 68 STA $687d ; target hit multiplier
b6ec: b1 92 LDA ($92),Y
b6ee: 8d 81 68 STA $6881 ; target Max HP high byte

b6f1: c8 INY ; Y = $06
b6f2: b1 90 LDA ($90),Y
b6f4: 8d 6d 68 STA $686d ; target status ailments

b6f7: a0 09 LDY #$09
b6f9: b1 90 LDA ($90),Y
b6fb: 8d 7e 68 STA $687e ; target "courage"

b6fe: c8 INY ; Y = $0a
b6ff: b1 90 LDA ($90),Y
b701: 8d 85 68 STA $6885 ; target evade

b704: c8 INY ; Y = $0b
b705: b1 90 LDA ($90),Y
b707: 8d 82 68 STA $6882 ; target damage

b70a: a0 10 LDY #$10
b70c: b1 92 LDA ($92),Y
b70e: 8d 86 68 STA $6886 ; target creature type

b711: c8 INY ; Y = $11
b712: b1 92 LDA ($92),Y
b714: 8d 72 68 STA $6872 ; target magic defense

b717: c8 INY ; Y = $12
b718: b1 90 LDA ($90),Y
b71a: 8d 84 68 STA $6884 ; target Hit%
b71d: b1 92 LDA ($92),Y
b71f: 8d 76 68 STA $6876 ; target elemental weakness

b722: c8 INY ; Y = $13
b723: b1 90 LDA ($90),Y
b725: 8d 77 68 STA $6877 ; target elemental resistance

b728: a9 02 LDA #$02
b72a: 20 b8 be JSR $beb8 ; Play sound
b72d: 4c fa bb JMP $bbfa ; do attack sound & sparkles
b730: a9 00 LDA #$00
b732: 8d 73 68 STA $6873 ; caster INT (0 for enemies)
b735: 60 RTS
b736: ea NOP
...
b748: ea NOP

; Save data for enemy magic target (start at 3b759)
b749: ad 8a 6c LDA $6c8a
b74c: 20 be b4 JSR $b4be ; Set pointers for slot A: p[$92]=permanent, p[$90]=in-battle

b74f: ad 7a 68 LDA $687a ; Save target HP low byte
b752: a0 02 LDY #$02
b754: 91 90 STA ($90),Y

b756: ad 7b 68 LDA $687b ; Save target HP high byte
b759: c8 INY ; Y = $03
b75a: 91 90 STA ($90),Y

b75c: ad 7f 68 LDA $687f ; Save target absorb
b75f: c8 INY ; Y = $04
b760: 91 90 STA ($90),Y

b762: ad 7d 68 LDA $687d ; Save target hit multiplier
b765: c8 INY ; Y = $05
b766: 91 90 STA ($90),Y

b768: ad 6d 68 LDA $686d ; Save target status ailments
b76b: c8 INY ; Y = $06
b76c: 91 90 STA ($90),Y

b76e: ad 7e 68 LDA $687e ; Save target "courage"
b771: a0 09 LDY #$09
b773: 91 90 STA ($90),Y

b775: ad 85 68 LDA $6885 ; Save target evade
b778: c8 INY ; Y = $0a
b779: 91 90 STA ($90),Y

b77b: ad 82 68 LDA $6882 ; Save target damage
b77e: c8 INY ; Y = $0b
b77f: 91 90 STA ($90),Y

b781: ad 84 68 LDA $6884 ; Save target Hit%
b784: a0 12 LDY #$12
b786: 91 90 STA ($90),Y

b788: ad 77 68 LDA $6877 ; Save target elemental resistance
b78b: c8 INY ; Y = $13
b78c: 91 90 STA ($90),Y

b78e: 60 RTS

; Save data for player magic target (start at address 3379f)
b78f: ad 8a 6c LDA $6c8a
b792: 20 eb b5 JSR $b5eb ; Set pointers for warrior A: p[$92]=permanent, p[$90]=in-battle

b795: a0 01 LDY #$01
b797: ad 6d 68 LDA $686d ; Save target status ailments
b79a: 91 92 STA ($92),Y

b79c: a0 05 LDY #$05
b79e: ad 84 68 LDA $6884 ; Save target Hit%
b7a1: 91 90 STA ($90),Y

b7a3: a0 07 LDY #$07
b7a5: ad 85 68 LDA $6885 ; Save target evade
b7a8: 91 90 STA ($90),Y

b7aa: c8 INY ; Y = $08
b7ab: ad 7f 68 LDA $687f ; Save target absorb
b7ae: 91 90 STA ($90),Y

b7b0: c8 INY ; Y = $09
b7b1: ad 82 68 LDA $6882 ; Save target damage
b7b4: 91 90 STA ($90),Y

b7b6: c8 INY ; Y = $0a
b7b7: ad 77 68 LDA $6877 ; Save target elemental resistance
b7ba: 91 90 STA ($90),Y
b7bc: ad 7a 68 LDA $687a ; Save target HP low byte
b7bf: 91 92 STA ($92),Y

b7c1: c8 INY ; Y = $0b
b7c2: ad 7d 68 LDA $687d ; Save target hit multiplier
b7c5: 91 90 STA ($90),Y
b7c7: ad 7b 68 LDA $687b ; Save target HP high byte
b7ca: 91 92 STA ($92),Y

b7cc: 60 RTS

As you might have noticed, these alterations will change the code to load INT - but unless you incorporate the other parts of the INT Patch that alter the spell routines, it won't actually do anything.

User Info: romraptor

romraptor
5 months ago#9
Thanks! So for example I would go to 16af83 and type 4c ca af, then go to 16af86 and type a2 14 etc?

User Info: AstralEsper

AstralEsper
5 months ago#10
Sorry, it looks like I didn't explain it very clearly. When I said "basically, add 0x10 ahead of the in-bank addresses in the asm below", I meant that the game data is slightly out-of-sync with each individual bank's data. Most banks have their addresses ordered internally from $8000 to $bfff, while their absolute addresses in the game data are different. For example, Bank 0c starts at 0x30010 (corresponding with $8000), and goes to 0x3400f (corresponding with $bfff). As you might note, the absolute addresses are slightly out-of-sync and are one tens' place ahead of the relative addresses within each bank. That's what I meant.

If none of that makes sense to you, don't worry about it. Just focus on the absolute address I identified for each section, and start entering the replacement code at that address, and continue until you've entered all the data in that section. Then start at the address identified at the beginning of the next section and do the same thing.

So to start, after doing the TMPR portion (a single byte for which I've already provided the absolute address), you go to the next section, which is listed as starting at absolute address 0x32f93. Start there with 4c ca af, then go to the next line, and keep entering bytes sequentially until you get to the next section headlined in normal font ("Change the jump addresses for these routines as follows:").
  1. Boards
  2. Final Fantasy
  3. The spells that don't work
  • Topic Archived

GameFAQs Q&A