Paramètres | Info |
---|---|
Console: | SNES |
Jeu Original: | Final Fantasy III |
Type: | Bug Fix |
Genre: | Role Playing |
Modifications: | Other |
Créateur: | SilentEnigma |
Date de création: | 02/20/2020 |
Dernière modification: | 09/09/2020 |
Paramètres | Info |
---|---|
Nom de fichier: | StuckInAPose_v2.8.zip |
Descargas: | 5 |
Conditions requises: | Header (SNES) |
Version: | 2.8 |
Notation: |
Don’t think this is gonna be a 100% Gold Remake, it’ll have its differences. Extra battles (some’ll be optionals, tough but rewarding), Hoenn Pokemon (in every area, and hard to find) New areas, Remapped some dungeons (so your old guides wont work) , Extra recurring characters (some’ll hate you, some’ll help you)
Note that the hack is incomplete but feel free to enjoy the hack as-is.
Title: Stuck in a Pose fix Author: SilentEnigma Version: 2.8 Release Date: 2020-02-20 Applies to: FF3us 1.0, FF3us 1.1 Tested on: FF3us 1.0 Contents: readme.txt = this file StuckInAPose-Full.ips = the full-featured patch (headered) StuckInAPose-Full_NH.ips = the full-featured patch (headerless) StuckInAPose-FullN.ips = the Full version anti-patch (headered) StuckInAPose-FullN_NH.ips = the Full version anti-patch (headerless) StuckInAPose-Mini.ips = the minimalist patch (headered) StuckInAPose-Mini_NH.ips = the minimalist patch (headerless) StuckInAPose-MiniN.ips = the Mini version anti-patch (headered) StuckInAPose-MiniN_NH.ips = the Mini version anti-patch (headerless) ROM Addresses: C0/49EF - C0/49F1 Free space used: Full version: 115 bytes, C0/D6A0 - C0/D712 Minimal version: 105 bytes, C0/D6A0 - C0/D708 RAM used (Full version only): unused field RAM, direct page $C6 - $C7 NOTE: This version of "Stuck in a Pose fix" IS NOT COMPATIBLE with the author's "Sliding Dash fix" version 1.0! Instead, use "Sliding Dash fix" version 1.1 or higher with this patch. Urgency: Medium/Low. This bug pops up all over the place: when pausing on a staircase, after unequipping party members on the airship, at the end of several scenes when control is given back to the player, etc. However, these are all fairly minor visual flaws. ________________________________________________________________________________ TABLE OF CONTENTS 0. Description 1. Relevant Offsets & Disassembly a. Common b. Full version only c. Minimal version only 2. Revision History 3. Credits ________________________________________________________________________________ 0. DESCRIPTION From Novalia Spirit's "100+ Bugs" Thread: After any event-dictated movement occurs, the hero sprite may appear to be stuck in its last pose or its walking pose. The easiest way to see this is to go up and down some stairs. Most of the time, if you stop walking, the hero sprite should appear in a walking pose. Other examples of this are when you jump on a turtle, when trying to go up a conveyor belt to no avail, and after a scene where your party was split temporarily. ... One better example of this bug is when you're within the airship and talk to the guy who can unequip your characters. While you do so, the hero sprite should look South and be in a walking pose, yet, even if the said guy isn't South of the hero sprite, you can still talk to him since the game still considers you're facing him. The patch comes in two versions: Full-featured ("Full") - Optimized & consistent transition timing for "stuck" sprites. - Uses the most free space, as well as 2 bytes of unused field RAM Minimalist ("Mini") - Inferior & inconsistent transition timing for "stuck" sprites. - Uses less free space than the full version; no added RAM usage ________________________________________________________________________________ 1. RELEVANT OFFSETS & DISASSEMBLY ---------------------------------------- a) COMMON Sprite I.D. table for walking animations Original: C0/580D: 04 05 04 03 ; Unknown C0/5811: 6E 6F 6E 6F ; Unknown C0/5815: 01 02 01 00 ; Unknown C0/5819: 2E 2F 2E 2F ; Unknown C0/581D: 04 05 04 03 ; Character sprite moving north C0/5821: 47 48 47 46 ; Character sprite moving east C0/5825: 01 02 01 00 ; Character sprite moving south C0/5829: 07 08 07 06 ; Character sprite moving west Sprite I.D. table for standing facing north, east, south, west Original: C0/582D: 04 47 01 07 Code snippet executed repeatedly when the player has control but is not pressing any directional buttons Original: C0/49EF: AC 03 08 LDY $0803 C0/49F2: 7B TDC C0/49F3: 99 7E 08 STA $087E,Y C0/49F6: 9C 86 08 STZ $0886 C0/49F9: 20 A5 C8 JSR $C8A5 C0/49FC: 20 F4 46 JSR $46F4 C0/49FF: 20 83 4B JSR $4B83 C0/4A02: 60 RTS Modified: C0/49EF: 20 A0 D6 JSR $D6A0 ; Jump to new subroutine $D6A0 Sprite IDs: 00 stepping south right foot 01 standing south 02 stepping south left foot 03 stepping north right foot 04 standing north 05 stepping north left foot 06 stepping west left foot 07 standing west 08 stepping west right foot 09 crouching 0A ready stance west 0B flinching west 0C alt battle standing west 0D alt battle stepping west 0E arms up west 0F arms up tip toes west 10 casting mouth closed west 11 casting mouth open west 12 battle collapsed(?) 13 eyes closed south 14 winking south 15 eyes closed west 16 arms up south 17 arms up north 18 indignant south 19 hand raised south 1A hand on head south 1B hand raised north 1C hand on head north 1D laughing head up south 1E laughing head down south 1F surprised south 20 bowed head south 21 bowed head north 22 bowed head west 23 turned head south 24 cheeky finger in south 25 cheeky finger up south 26 shy (Terra only?) south 27 tent 28 field collapsed 29 corrupt 2A corrupt 2B corrupt 2C corrupt 2D corrupt 2E riding west 2F riding wind-blown west ---------------------------------------- b) FULL VERSION ONLY Original: C0/7F98: 86 C6 STX $C6 ; Unused RAM byte Modified: C0/7F98: EA NOP C0/7F99: EA NOP New Subroutine C0/D6A0: C0/D6A0: AC 03 08 LDY $0803 ; Original C0/49EF. C0/D6A3: B9 77 08 LDA $0877,Y ; Load current sprite I.D. C0/D6A6: AA TAX ; Temporarily store sprite I.D. in X C0/D6A7: 29 BF AND #$BF ; Strip mirror bit C0/D6A9: C9 0F CMP #$0F ; "arms up tip toes west [0x0F]"? C0/D6AB: F0 58 BEQ $D705 ; Branch if "arms up tip toes west [0x0F]" C0/D6AD: C9 17 CMP #$17 ; "arms up north [0x17]"? C0/D6AF: F0 54 BEQ $D705 ; Branch if "arms up north [0x17]" C0/D6B1: C9 03 CMP #$03 ; "walking north 1st [0x03]"? C0/D6B3: 90 26 BCC $D6DB ; Branch if less (if walking south) C0/D6B5: C9 06 CMP #$06 ; "walking west 1st [0x06]"? C0/D6B7: 90 1F BCC $D6D8 ; Branch if less (if walking north) C0/D6B9: C9 09 CMP #$09 ; "crouching [0x09]"? C0/D6BB: F0 20 BEQ $D6DD ; Branch if "crouching [0x09]" C0/D6BD: 90 46 BCC $D705 ; Branch if less (if walking east/west) C0/D6BF: C9 22 CMP #22 ; "bowing head west" [0x22]"? C0/D6C1: F0 08 BEQ $D6CB ; Branch if "bowing head west [0x22]" C0/D6C3: C9 2E CMP #2E ; "riding west" [0x2E]"? C0/D6C5: B0 4B BCS $D712 ; Skip everything if GT. or Eq. C0/D6C7: C9 13 CMP #$13 ; "eyes closed south [0x13]"? C0/D6C9: B0 1D BCS $D6E8 ; Branch if GT. or Eq. (several poses) C0/D6CB: 8A TXA ; Recall current sprite I.D. C0/D6CC: 89 40 BIT #$40 ; Test mirror bit C0/D6CE: F0 04 BEQ $D6D4 ; Branch if mirror bit not set C0/D6D0: A9 01 LDA #01 ; Load direction I.D. for facing east C0/D6D2: 80 16 BRA $D6EA C0/D6D4: A9 03 LDA #03 ; Load direction I.D. for facing west C0/D6D6: 80 12 BRA $D6EA C0/D6D8: 7B TDC ; Load direction I.D. for facing north C0/D6D9: 80 0F BRA $D6EA C0/D6DB: C6 C7 DEC $C7 ; unused RAM byte (transition delay) C0/D6DD: AD 64 1F LDA $1F64 ; Load most of the current map I.D. C0/D6E0: C9 DD CMP #$DD ; Zozo main? C0/D6E2: F0 2E BEQ $D712 ; If so, skip everything C0/D6E4: C9 F2 CMP #F2 ; Vector main? C0/D6E6: F0 2A BEQ $D712 ; If so, skip everything C0/D6E8: A9 02 LDA #02 ; Load direction I.D. for facing south C0/D6EA: 99 7F 08 STA $087F,Y ; Store direction I.D. C0/D6ED: 8A TXA ; Recall current sprite I.D. C0/D6EE: C5 C6 CMP $C6 ; unused RAM byte (most recent sprite) C0/D6F0: F0 04 BEQ $D6F6 ; Branch if same as current sprite C0/D6F2: A9 10 LDA #$10 ; Load base transition delay C0/D6F4: 85 C7 STA $C7 ; unused RAM byte (transition delay) C0/D6F6: 8A TXA ; Recall current sprite I.D. C0/D6F7: C6 C7 DEC $C7 ; unused RAM byte (transition delay) C0/D6F9: 10 12 BPL $D70D ; If not done, skip everything C0/D6FB: 29 BF AND #$BF ; Strip mirror bit C0/D6FD: C9 28 CMP #$28 ; Is character "collapsed [0x28]"? C0/D6FF: D0 04 BNE $D705 ; Branch if not C0/D701: A9 09 LDA #$09 ; Load I.D. for "crouching" C0/D703: 80 0A BRA $D70F C0/D705: B9 7F 08 LDA $087F,Y ; Load current direction value (8-bit) C0/D708: AA TAX ; Transfer A to X C0/D709: BF 2D 58 C0 LDA $C0582D,X ; I.D. for standing in current direction C0/D70D: 85 C6 STA $C6 ; unused RAM byte (most recent sprite) C0/D70F: 99 77 08 STA $0877,Y ; Store sprite I.D. C0/D712: 60 RTS ; Return from subroutine -------------------------------- c) MINIMAL VERSION ONLY New Subroutine C0/D6A0: C0/D6A0: AC 03 08 LDY $0803 ; Original C0/49EF. C0/D6A3: B9 77 08 LDA $0877,Y ; Load current sprite I.D. C0/D6A6: AA TAX ; Temporarily store sprite I.D. in X C0/D6A7: 29 BF AND #$BF ; Strip mirror bit C0/D6A9: C9 0F CMP #$0F ; "arms up tip toes west [0x0F]"? C0/D6AB: F0 50 BEQ $D6FD ; Branch if "arms up tip toes west [0x0F]" C0/D6AD: C9 17 CMP #$17 ; "arms up north [0x17]"? C0/D6AF: F0 4C BEQ $D6FD ; Branch if "arms up north [0x17]" C0/D6B1: C9 03 CMP #$03 ; "walking north 1st [0x03]"? C0/D6B3: 90 31 BCC $D6E6 ; Branch if less (if walking south) C0/D6B5: C9 06 CMP #$06 ; "walking west 1st [0x06]"? C0/D6B7: 90 1F BCC $D6D8 ; Branch if less (if walking north) C0/D6B9: C9 09 CMP #$09 ; "crouching [0x09]"? C0/D6BB: F0 1E BEQ $D6DB ; Branch if "crouching [0x09]" C0/D6BD: 90 3E BCC $D6FD ; Branch if less (if walking east/west) C0/D6BF: C9 22 CMP #22 ; "bowing head west" [0x22]"? C0/D6C1: F0 08 BEQ $D6CB ; Branch if "bowing head west [0x22]" C0/D6C3: C9 2E CMP #2E ; "riding west" [0x2E]"? C0/D6C5: B0 41 BCS $D708 ; Skip everything if GT. or Eq. C0/D6C7: C9 12 CMP #$12 ; "eyes closed south [0x13]"? C0/D6C9: B0 1B BCS $D6E6 ; Branch if GT. or Eq. (several poses) C0/D6CB: 8A TXA ; Recall current sprite I.D. C0/D6CC: 89 40 BIT #$40 ; Test mirror bit C0/D6CE: F0 04 BEQ $D6D4 ; Branch if mirror bit not set C0/D6D0: A9 01 LDA #01 ; Load direction I.D. for facing east C0/D6D2: 80 14 BRA $D6E8 C0/D6D4: A9 03 LDA #03 ; Load direction I.D. for facing west C0/D6D6: 80 10 BRA $D6E8 C0/D6D8: 7B TDC ; Load direction I.D. for facing north C0/D6D9: 80 0D BRA $D6E8 C0/D6DB: AD 64 1F LDA $1F68 ; Load most of the current map I.D. C0/D6DE: C9 DD CMP #$DD ; Zozo main? C0/D6E0: F0 26 BEQ $D708 ; If so, skip everything C0/D6E2: C9 F2 CMP #F2 ; Vector main? C0/D6E4: F0 22 BEQ $D708 ; If so, skip everything C0/D6E6: A9 02 LDA #02 ; Load direction I.D. for facing south C0/D6E8: 99 7F 08 STA $087F,Y ; Store direction I.D. C0/D6EB: A9 04 LDA #$4 ; Load base duration C0/D6ED: CD 1E 02 CMP $021E ; timer semi-second byte C0/D6F0: 30 16 BMI $D708 ; If not done, skip everything C0/D6F2: 8A TXA ; Transfer X to A C0/D6F3: 29 BF AND #$BF ; Strip mirror bit C0/D6F5: C9 28 CMP #$28 ; Is character "collapsed [0x28]"? C0/D6F7: D0 04 BNE $D6FD ; Branch if not C0/D6F9: A9 09 LDA #$09 ; Load I.D. for "crouching" C0/D6FB: 80 08 BRA $D705 C0/D6FD: B9 7F 08 LDA $087F,Y ; Load current direction value (8-bit) C0/D700: AA TAX ; Transfer A to X C0/D701: BF 2D 58 C0 LDA $C0582D,X ; I.D. for standing in current direction C0/D705: 99 77 08 STA $0877,Y ; Store sprite I.D. C0/D708: 60 RTS ; Return from subroutine ________________________________________________________________________________ 3. REVISION HISTORY February 20, 2016 - Version 1.0 completed. February 18, 2017 - Version 2.0 completed. > Fixes a bug during the Fall of Doma scene, caused by patch v1.0. (Other parts of the game may have also been affected.) > Uses 21 fewer bytes of free space. February 19, 2017 - Version 2.1 completed. > Smooths out a minor sprite blip after Setzer gives the airship tutorial > Uses 10 more bytes of free space than v2.0. June 03, 2019 - Version 2.2 completed. > When player resumes control of a character that is in the collapsed position, the character will be shown briefly in the crouch position before its standing sprite is shown. Player can interrupt this animation at any time by moving the character. > Full version uses 33 more bytes of free space than v2.1. December 23, 2019 - Version 2.3 completed. > Character remains crouching after making jumps in Zozo. > Feature is bypassed on the Narshe snow maze. > Uses 27 more bytes of free space than v2.2. December 28, 2019 - Version 2.4 completed. > Proper Narshe snow maze support added. > Improved orientation detection (affects several scenes). > Improved transition timing from "walking south" pose. > Uses 8 more bytes of free space than v2.3. Who needs 'em! December 31, 2019 - Version 2.5 completed. > Character remains crouching after taking cover in Vector. > Fixed orientation detection for "bowing head left" pose. > Uses 8 more bytes of free space than v2.4. January 16, 2020 - Version 2.6 completed. > Fixed sprite ID errors affecting "bowing head left". > Documented all sprite IDs. January 19, 2020 - Version 2.7 completed. > Fixed transition out of jump animation in Daryl's Tomb. > Uses 8 more bytes of free space than v2.6. February 20, 2020 - Version 2.8 completed. > Fixed behavior when riding Magitek armor. > Added headerless ROM support. > Uses 4 more bytes of free space than v2.7. ________________________________________________________________________________ 4. CREDITS Imzogelmo, for his disassembly of bank C0 and his patch allocation list. Novalia Spirit, for compiling the "100+ Bugs" list. Master ZED, for some indirect inspiration (See the author's "Sliding Dash" fix). Leet Sketcher, for finding a solution to the bug in version 1.0 Assassin, for suggesting space optimization for the new code in version 2.0. Thanks to C.V. Reynolds & Squiffy for finding the bug in version 1.0. ________________________________________________________________________________ Copyright (C) 2020 David R. Thompson (SilentEnigma). The author allows the free use of the attributed work referenced by this document exclusively for non-commercial purposes, stipulated by the following provisions: 1. This readme document shall accompany the attributed work wherever it is redistributed. 2. The author shall be credited wherever the attributed work referenced by this document is reused, redistributed, or modified.