øAslickproductions.org/forum/index.php?PHPSESSID=5f0fck550j2m4m2fpbtkj2vkm1&topic=1883.msg23541e:/My Web Sites/Slick Productions - FFIV Message Board/slickproductions.org/forum/index7eb8.htmlslickproductions.org/forum/index.php?PHPSESSID=5f0fck550j2m4m2fpbtkj2vkm1&topic=1883.465e:/My Web Sites/Slick Productions - FFIV Message Board/slickproductions.org/forum/index7eb8.html.zxØ"g^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈà\g£KOKtext/htmlISO-8859-1gzip0|Ö£KÿÿÿÿÿÿÿÿTue, 10 Mar 2020 05:33:33 GMT0ó°° ®0®P®€§²ð®Ö"g^ÿÿÿÿÿÿÿÿpš£K Grimoire LD's Notes, Patches, and Hacks (Dark Knight/Paladin Swap In Battle!)

Author Topic: Grimoire LD's Notes, Patches, and Hacks (Dark Knight/Paladin Swap In Battle!)  (Read 78682 times)

chillyfeez

  • FF4 Hacker
  • *
  • Posts: 1,285
  • Gender: Male
  • Go ahead, ask me about Angel Feathers!
    • View Profile
Re: Grimoire LD's Notes, Patches, and Hacks (A Working Job System!)
« Reply #465 on: April 28, 2015, 06:07:28 AM »
Quote
I've heard that windows and menus are the worst parts about hacking... anything.
What, like you heard of some guy one time who drove himself crazy trying to expand command and spell names? I'm not familiar with that story...

But, seriously, there's actually a fair amount of space after the character's name and handedness. Finding a way to use it would require custom assembly, but shouldn't be too hard.
The biggest deal would probably be telling the game how to know the job level. I think I thought that was being stored by that second byte. I know I could examine your code to figure this out, but how does it know which spell to add when a job levels up? That'd likely be the key.

Grimoire LD

  • FF4 Hacker
  • *
  • Posts: 1,684
    • View Profile
Re: Grimoire LD's Notes, Patches, and Hacks (A Working Job System!)
« Reply #466 on: April 28, 2015, 09:33:43 AM »
Quote
I've heard that windows and menus are the worst parts about hacking... anything.
What, like you heard of some guy one time who drove himself crazy trying to expand command and spell names? I'm not familiar with that story...

But, seriously, there's actually a fair amount of space after the character's name and handedness. Finding a way to use it would require custom assembly, but shouldn't be too hard.
The biggest deal would probably be telling the game how to know the job level. I think I thought that was being stored by that second byte. I know I could examine your code to figure this out, but how does it know which spell to add when a job levels up? That'd likely be the key.

Heh, no, no. Not just your experience, but even the famed Justin3009 mentioned that the most laborious part of hacking is the menus and screens. Thankfully with FFIV we already have a pretty good map of the menus compiled by... I want to say DragonsBrethren. As for moving things around on the Status screen... A quick breakpoint actually uncovered pretty much everything I'm going to need and I will post that data shortly for others who want to move certain aspects of the screen around. As I said I think I'm just going to replace superfluous aspects of the screen, there's no need for HP/MP to be displayed for example when they're Right there in the normal screen. I can replace those with custom strings.

The game has no default way of knowing Job Level as there technically *isn't* one, unlike Exp, it does not reach an amount and loop back to read another value, instead it works like this...

Say Rydia has 02 Job Points as a Caller. She fights one more battle the game, after each battle, will do this...

(Look at Caller Rydia's Magic to Learn - a section of 16 Bytes)

03 - Ice, 10 - Pure, 18 - Cure,  and so on and so forth. Since the code will find a match the Job Tracker with this "Check if Job Tracker is this". And it goes from there.

How to display this would be done in a similar set up, check to see what value is above Current Job Points/Tracker (so if Rydia has 5 battles fought it will display something like... "Job Points 5"
          "Next Skill 10"

At max it would have to read something different.  So like...

"Job Points 200"
"Next Skill None" or something like that.

Here is the code regarding (most) of the Status Screen anyhow...


Status Screen Building Code
Code: [Select]
$01/A91E 20 07 90 JSR $9007  [$01:9007] A:0000 X:0002 Y:0300 P:envMxdIZc - Jump to Subroutine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~````
$01/9007 48 PHA A:0000 X:0002 Y:0300 P:envMxdIZc - Push A.
$01/9008 29 0F AND #$0F A:0000 X:0002 Y:0300 P:envMxdIZc - Get rid of bits...
$01/900A 0A ASL A A:0000 X:0002 Y:0300 P:envMxdIZc - x2 A.
$01/900B 20 B4 87 JSR $87B4  [$01:87B4] A:0000 X:0002 Y:0300 P:envMxdIZc - Jump to Subroutine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$01/87B4 85 43 STA $43    [$00:0143] A:0000 X:0002 Y:0300 P:envMxdIZc - Store A in 0143.
$01/87B6 A6 43 LDX $43    [$00:0143] A:0000 X:0002 Y:0300 P:envMxdIZc - Load X from 0143.
$01/87B8 60 RTS A:0000 X:0000 Y:0300 P:envMxdIZc - Return
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$01/900E C2 20 REP #$20 A:0000 X:0000 Y:0300 P:envMxdIZc  - Set A to 16 Bit.
$01/9010 BF 25 C6 0F LDA $0FC625,x[$0F:C625] A:0000 X:0000 Y:0300 P:envmxdIZc - Load A from Pointer Area (in this case 1000)
$01/9014 AA TAX A:1000 X:0000 Y:0300 P:envmxdIzc - Transfer A to X.
$01/9015 E2 20 SEP #$20 A:1000 X:1000 Y:0300 P:envmxdIzc - Set A to 8 Bit.
$01/9017 68 PLA A:1000 X:1000 Y:0300 P:envMxdIzc - Pull A.
$01/9018 60 RTS A:1000 X:1000 Y:0300 P:envMxdIZc - Return
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$01/A921 86 60 STX $60    [$00:0160] A:1000 X:1000 Y:0300 P:envMxdIZc - Store 1000 in 0160.
$01/A923 B2 60 LDA ($60)  [$7E:1000] A:1000 X:1000 Y:0300 P:envMxdIZc - Load A from 0160. (in this case Name is being Loaded)
$01/A925 29 3F AND #$3F A:1091 X:1000 Y:0300 P:eNvMxdIzc - Get rid of Bits
$01/A927 D0 01 BNE $01    [$A92A] A:1011 X:1000 Y:0300 P:envMxdIzc. Branch if not 00. (... since this Is the Status Screen I don't think you'd ever have to worry about that one?)
-------------------------------
$01/A929 60 RTS A:1011 X:1000 Y:0300 P:envMxdIzc
------------------------------------
$01/A92A 20 AF 94 JSR $94AF  [$01:94AF] A:1011 X:1000 Y:0300 P:envMxdIzc - Jump to Subroutine (Sets up Status Screen Window)
$01/A92D 20 CC 94 JSR $94CC  [$01:94CC] A:0000 X:1000 Y:0000 P:envMxdIzc - Continual Setup
$01/A930         20 6C 8D JSR $8D6C  [$01:8D6C] A:FFFF X:A100 Y:A300 P:eNvMxdIzc - More setup.
$01/A933         20 38 8D JSR $8D38  [$01:8D38] A:AAAA X:0220 Y:0000 P:eNvMxdIzc - More setup.
$01/A936        20 3D 8D JSR $8D3D  [$01:8D3D] A:2000 X:0000 Y:1000 P:envMxdIZc - Even more.
(Skipping the rest of that...)
$01/A93F A9 0C LDA #$0C A:4301 X:0200 Y:1000 P:envMxdIzc - Load 0C into A.
$01/A941 85 C2 STA $C2    [$00:01C2] A:430C X:0200 Y:1000 P:envMxdIzc - Store A in 1C2.
$01/A943 A9 04 LDA #$04 A:430C X:0200 Y:1000 P:envMxdIzc - Load 04 into A.
$01/A945 85 B1 STA $B1    [$00:01B1] A:4304 X:0200 Y:1000 P:envMxdIzc - Store A in B1
$01/A947 85 A5 STA $A5    [$00:01A5] A:4304 X:0200 Y:1000 P:envMxdIzc - And A5.
$01/A949 20 88 84 JSR $8488  [$01:8488] A:4304 X:0200 Y:1000 P:envMxdIzc - Jump to Subroutine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$01/848A A2 00 C6 LDX #$C600 A:4304 X:0200 Y:1000 P:envMxdIzc - Load C600 into X (some kind of graphics display, I imagine.)
$01/848D 86 29 STX $29    [$00:0129] A:4304 X:C600 Y:1000 P:eNvMxdIzc - Store X in 0129.
$01/848F A2 00 78 LDX #$7800 A:4304 X:C600 Y:1000 P:eNvMxdIzc - Load 7800 into X.
$01/8492 86 35 STX $35    [$00:0135] A:4304 X:7800 Y:1000 P:envMxdIzc - Store X in 0135.
$01/8494 A9 02 LDA #$02 A:4304 X:7800 Y:1000 P:envMxdIzc - Load 02 into A.
$01/8496 85 C3 STA $C3    [$00:01C3] A:4302 X:7800 Y:1000 P:envMxdIzc - Store A in 01C3.
$01/8498 A9 20 LDA #$20 A:4302 X:7800 Y:1000 P:envMxdIzc - Load 20 into A.
$01/849A 85 34 STA $34    [$00:0134] A:4320 X:7800 Y:1000 P:envMxdIzc - Store A in 0134.
$01/849C FA PLX A:4320 X:7800 Y:1000 P:envMxdIzc - Pull X
$01/849D 68 PLA A:4320 X:0200 Y:1000 P:envMxdIzc - Pull A
$01/849E 60 RTS A:4304 X:0200 Y:1000 P:envMxdIzc - Return
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
$01/A94C A0 70 02 LDY #$0270 A:4304 X:0200 Y:1000 P:envMxdIzc - Load 0270 into Y/
$01/A94F A9 05 LDA #$05 A:4304 X:0200 Y:0270 P:envMxdIzc - Load 05 into A
$01/A951 18 CLC A:4305 X:0200 Y:0270 P:envMxdIzc - Clear Carry Flag
$01/A952 20 79 87 JSR $8779  [$01:8779] A:4305 X:0200 Y:0270 P:envMxdIzc - Jump to Subroutine (??)
$01/A955 A0 2A D8 LDY #$D82A A:C805 X:0200 Y:C8BA P:envMxdIzc - Load D82A into Y.
$01/A958 A2 1B DA LDX #$DA1B A:C805 X:0200 Y:D82A P:eNvMxdIzc - Load DA1B into X.
$01/A95B 20 D0 84 JSR $84D0  [$01:84D0] A:C805 X:DA1B Y:D82A P:eNvMxdIzc - Jump to Portrait Clearing Routine.
$01/A95E 20 33 94 JSR $9433  [$01:9433] A:0100 X:858C Y:0000 P:eNvMxdIzC - Jump to Subroutine.
$01/A961 A9 30 LDA #$30 A:0001 X:858C Y:0000 P:eNvMxdIzc - Load 30 into A.
$01/A963 85 C1 STA $C1    [$00:01C1] A:0030 X:858C Y:0000 P:envMxdIzc - Store A in C1.
$01/A965 A5 E8 LDA $E8    [$00:01E8] A:0030 X:858C Y:0000 P:envMxdIzc - Load A from 1E8
$01/A967 A0 98 08 LDY #$0898 A:0000 X:858C Y:0000 P:envMxdIZc - Load 0898 into Y.
$01/A96A 20 70 8E JSR $8E70  [$01:8E70] A:0000 X:858C Y:0898 P:envMxdIzc - Jump to Subroutine
(The rest will be skipped until we reach pertinent data...)


Code: [Select]
[b]$01/A98B B2 60 LDA ($60)  [$7E:1000] A:FFC7 X:0200 Y:DAB5 P:eNvMxdIzC - Load A from 0160 (1000)
$01/A98D 29 3F AND #$3F A:FF91 X:0200 Y:DAB5 P:eNvMxdIzC - Get rid of Bits.
$01/A98F A0 84 00 LDY #$0084 A:FF11 X:0200 Y:DAB5 P:envMxdIzC - Load 0084 into Y (Placement code)[/b]
(Sectioned Part is only important part here)


$01/A992 20 AB 83 JSR $83AB  [$01:83AB] A:FF11 X:0200 Y:0084 P:envMxdIz - Jump to Subroutine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~```
$01/83AB 29 3F AND #$3F A:FF11 X:0200 Y:0084 P:envMxdIzC - Clear Bots.
$01/83AD D0 01 BNE $01    [$83B0] A:FF11 X:0200 Y:0084 P:envMxdIzC - Is not 00, branch.
(Return)
$01/83B0 3A DEC A A:FF11 X:0200 Y:0084 P:envMxdIzC - -1 A.
$01/83B1 20 B4 87 JSR $87B4  [$01:87B4] A:FF10 X:0200 Y:0084 P:envMxdIzC - Jump to Subroutine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$01/87B4 85 43 STA $43    [$00:0143] A:FF10 X:0200 Y:0084 P:envMxdIzC - Store A in 0143.
$01/87B6 A6 43 LDX $43    [$00:0143] A:FF10 X:0200 Y:0084 P:envMxdIzC - Load X from 143
$01/87B8 60 RTS A:FF10 X:0010 Y:0084 P:envMxdIzC - Return
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
$01/83B4 BF 57 84 01 LDA $018457,x[$01:8467] A:FF10 X:0010 Y:0084 P:envMxdIzC - Load A from Character's Name.
$01/83B8 0A ASL A A:FF02 X:0010 Y:0084 P:envMxdIzC - x2 A.
$01/83B9 85 45 STA $45    [$00:0145] A:FF04 X:0010 Y:0084 P:envMxdIzc - Store A in 0145.
$01/83BB 0A ASL A A:FF04 X:0010 Y:0084 P:envMxdIzc - x2 A.
$01/83BC 65 45 ADC $45    [$00:0145] A:FF08 X:0010 Y:0084 P:envMxdIzc - Add the original x2 onto the x4'd A.
$01/83BE 20 B4 87 JSR $87B4  [$01:87B4] A:FF0C X:0010 Y:0084 P:envMxdIzc - Jump to Subroutine (Above)
$01/83C1 C2 20 REP #$20 A:FF0C X:000C Y:0084 P:envMxdIzc - Set X to 8 Bit.
$01/83C3 98 TYA A:FF0C X:000C Y:0084 P:envmxdIzc - Transfer Y to A.
$01/83C4 18 CLC A:0084 X:000C Y:0084 P:envmxdIzc - Clear Carry Flag
$01/83C5 65 29 ADC $29    [$00:0129] A:0084 X:000C Y:0084 P:envmxdIzc - Add A from 0129.
$01/83C7 A8 TAY A:B684 X:000C Y:0084 P:eNvmxdIzc - Transfer A to Y.
$01/83C8 E2 20 SEP #$20 A:B684 X:000C Y:B684 P:eNvmxdIzc - Set A to 16 Bit.
$01/83CA A9 06 LDA #$06 A:B684 X:000C Y:B684 P:eNvMxdIzc - Load 06 into A.
$01/83CC 85 45 STA $45    [$00:0145] A:B606 X:000C Y:B684 P:envMxdIzc - Store A in 0145.
$01/83CE BD 00 15 LDA $1500,x[$7E:150C] A:B606 X:000C Y:B684 P:envMxdIzc - Load A from 1500 (Oh? So this bit of RAM is used, thank goodness I erred on the side of caution with it. I do not know what it does though.)
$01/83D1 E8 INX A:B653 X:000C Y:B684 P:envMxdIzc - +1 to X
$01/83D2 20 34 8E JSR $8E34  [$01:8E34] A:B653 X:000D Y:B684 P:envMxdIzc  - jump to Subroutine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$01/8E35 C9 42 CMP #$42 A:B653 X:000D Y:B684 P:envMxdIzc - Is it 42?
$01/8E37 B0 15 BCS $15    [$8E4E] A:B653 X:000D Y:B684 P:envMxdIzC - If above 42 branch.
------------------------------------

------------------------------------
$01/8E4E EB XBA A:B653 X:000D Y:B684 P:envMxdIzC -  Exchange B and A eight bit accumulators. (I'll need to remember that one)
$01/8E4F A9 FF LDA #$FF A:53B6 X:000D Y:B684 P:eNvMxdIzC  - Load FF into A.
$01/8E51 FA PLX A:53FF X:000D Y:B684 P:eNvMxdIzC - Pull X
$01/8E52 60 RTS A:53FF X:000D Y:B684 P:envMxdIzC - Return
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``
$01/83D5 99 00 00 STA $0000,y[$7E:B684] A:53FF X:000D Y:B684 P:envMxdIzC - Store A into 7DB684.
$01/83D8 EB XBA A:53FF X:000D Y:B684 P:envMxdIzC - Exchange X and A.
$01/83D9 99 40 00 STA $0040,y[$7E:B6C4] A:FF53 X:000D Y:B684 P:envMxdIzC - Store A in 7EB6C4.
$01/83DC C8 INY A:FF53 X:000D Y:B684 P:envMxdIzC - +1 2
$01/83DD C8 INY A:FF53 X:000D Y:B685 P:eNvMxdIzC
$01/83DE C6 45 DEC $45    [$00:0145] A:FF53 X:000D Y:B686 P:eNvMxdIzC - -1 to 0145. -
$01/83E0 D0 EC BNE $EC    [$83CE] A:FF53 X:000D Y:B686 P:envMxdIzC - Loop back
(We'll be leaving this section for a while...)
...........

Most of the Actual Placing of the stats for the Status Screen. (Only one above is Name and due to the way they set it up that is difficult to change)
Code: [Select]
$01/A99D A0 02 00 LDY #$0002 A:FF01 X:1000 Y:0088 P:envMxdIzc - Load 0002 into Y. (Character Level)
$01/A9A0 B1 60 LDA ($60),y[$7E:1002] A:FF01 X:1000 Y:0002 P:envMxdIzc - Load Character's Level into A.
$01/A9A2 A0 5C 01 LDY #$015C A:FF0A X:1000 Y:0002 P:envMxdIzc - Load Location to place into Y.
$01/A9A5 20 69 83 JSR $8369  [$01:8369] A:FF0A X:1000 Y:015C P:envMxdIzc - Load Location Routine.

$01/A9A8 A0 14 00 LDY #$0014 A:8180 X:1000 Y:B75C P:eNvMxdIzc - Load 0014 into Y (Modified Character Strength)
$01/A9AB B1 60 LDA ($60),y[$7E:1014] A:8180 X:1000 Y:0014 P:envMxdIzc - Load Character's Strength into A
$01/A9AD A0 12 04 LDY #$0412 A:8107 X:1000 Y:0014 P:envMxdIzc - Load Location to place into Y.
$01/A9B0 20 69 83 JSR $8369  [$01:8369] A:8107 X:1000 Y:0412 P:envMxdIzc - Load Location Routine.

$01/A9B3 A0 15 00 LDY #$0015 A:FF87 X:1000 Y:BA12 P:eNvMxdIzc - Load Modified Agility into Y.
$01/A9B6 B1 60 LDA ($60),y[$7E:1015] A:FF87 X:1000 Y:0015 P:envMxdIzc - "  "
$01/A9B8 A0 92 04 LDY #$0492 A:FF09 X:1000 Y:0015 P:envMxdIzc
$01/A9BB 20 69 83 JSR $8369  [$01:8369] A:FF09 X:1000 Y:0492 P:envMxdIzc

$01/A9BE A0 16 00 LDY #$0016 A:FF89 X:1000 Y:BA92 P:eNvMxdIzc - Load Modified Vitality into Y.
$01/A9C1 B1 60 LDA ($60),y[$7E:1016] A:FF89 X:1000 Y:0016 P:envMxdIzc "   "
$01/A9C3 A0 12 05 LDY #$0512 A:FF05 X:1000 Y:0016 P:envMxdIzc
$01/A9C6 20 69 83 JSR $8369  [$01:8369] A:FF05 X:1000 Y:0512 P:envMxdIzc

$01/A9C9 A0 17 00 LDY #$0017 A:FF85 X:1000 Y:BB12 P:eNvMxdIzc - Load Modified Wisdom into Y
$01/A9CC B1 60 LDA ($60),y[$7E:1017] A:FF85 X:1000 Y:0017 P:envMxdIzc "    "
$01/A9CE A0 92 05 LDY #$0592 A:FF0F X:1000 Y:0017 P:envMxdIzc
$01/A9D1 20 69 83 JSR $8369  [$01:8369] A:FF0F X:1000 Y:0592 P:envMxdIzc

$01/A9D4 A0 18 00 LDY #$0018 A:8185 X:1000 Y:BB92 P:eNvMxdIzc - Load Modified Will into Y.
$01/A9D7 B1 60 LDA ($60),y[$7E:1018] A:8185 X:1000 Y:0018 P:envMxdIzc - "        "
$01/A9D9 A0 12 06 LDY #$0612 A:8109 X:1000 Y:0018 P:envMxdIzc
$01/A9DC 20 69 83 JSR $8369  [$01:8369] A:8109 X:1000 Y:0612 P:envMxdIzc


$01/A9DF A0 1B 00 LDY #$001B A:FF89 X:1000 Y:BC12 P:eNvMxdIzc - Load Attack Mutliplier into Y
$01/A9E2 B1 60 LDA ($60),y[$7E:101B] A:FF89 X:1000 Y:001B P:envMxdIzc - "   "
$01/A9E4 A0 AA 03 LDY #$03AA A:FF01 X:1000 Y:001B P:envMxdIzc
$01/A9E7 20 69 83 JSR $8369  [$01:8369] A:FF01 X:1000 Y:03AA P:envMxdIzc

$01/A9EA A0 28 00 LDY #$0028 A:FF81 X:1000 Y:B9AA P:eNvMxdIzc - Load Physical Defense Multiplier into Y.
$01/A9ED B1 60 LDA ($60),y[$7E:1028] A:FF81 X:1000 Y:0028 P:envMxdIzc - "   "
$01/A9EF A0 AA 04 LDY #$04AA A:FF01 X:1000 Y:0028 P:envMxdIzc
$01/A9F2 20 69 83 JSR $8369  [$01:8369] A:FF01 X:1000 Y:04AA P:envMxdIzc

$01/A9F5 A0 22 00 LDY #$0022 A:FF81 X:1000 Y:BAAA P:eNvMxdIzc - Load Magical Defense Multiplier into Y
$01/A9F8 B1 60 LDA ($60),y[$7E:1022] A:FF81 X:1000 Y:0022 P:envMxdIzc - "   "
$01/A9FA A0 AA 05 LDY #$05AA A:FF00 X:1000 Y:0022 P:envMxdIZc
$01/A9FD 20 69 83 JSR $8369  [$01:8369] A:FF00 X:1000 Y:05AA P:envMxdIzc

$01/AA00 A0 1C 00 LDY #$001C A:FF80 X:1000 Y:BBAA P:eNvMxdIzc - Load Physical Accuracy into Y.
$01/AA03 B1 60 LDA ($60),y[$7E:101C] A:FF80 X:1000 Y:001C P:envMxdIzc - "   "
$01/AA05 A0 34 04 LDY #$0434 A:FF34 X:1000 Y:001C P:envMxdIzc
$01/AA08 20 69 83 JSR $8369  [$01:8369] A:FF34 X:1000 Y:0434 P:envMxdIzc

$01/AA0B A0 29 00 LDY #$0029 A:8582 X:1000 Y:BA34 P:eNvMxdIzc - Load Physical Evasion into Y.
$01/AA0E B1 60 LDA ($60),y[$7E:1029] A:8582 X:1000 Y:0029 P:envMxdIzc "   "
$01/AA10 A0 34 05 LDY #$0534 A:851E X:1000 Y:0029 P:envMxdIzc
$01/AA13 20 69 83 JSR $8369  [$01:8369] A:851E X:1000 Y:0534 P:envMxdIzc

$01/AA16 A0 23 00 LDY #$0023 A:8380 X:1000 Y:BB34 P:eNvMxdIzc - Load Magical Evasion into Y.
$01/AA19 B1 60 LDA ($60),y[$7E:1023] A:8380 X:1000 Y:0023 P:envMxdIzc"       "
$01/AA1B A0 34 06 LDY #$0634 A:8303 X:1000 Y:0023 P:envMxdIzc
$01/AA1E 20 69 83 JSR $8369  [$01:8369] A:8303 X:1000 Y:0634 P:envMxdIzc

$01/AA21 A0 37 00 LDY #$0037 A:FF83 X:1000 Y:BC34 P:eNvMxdIzc - Load Placement Location into Y.
$01/AA24 B1 60 LDA ($60),y[$7E:1037] A:FF83 X:1000 Y:0037 P:envMxdIzc - Load Exp Byte 1 into A.
$01/AA26 85 45 STA $45    [$00:0145] A:FFE9 X:1000 Y:0037 P:eNvMxdIzc - Store A in 0145.
$01/AA28 C8 INY A:FFE9 X:1000 Y:0037 P:eNvMxdIzc - +1 to Y.
$01/AA29 B1 60 LDA ($60),y[$7E:1038] A:FFE9 X:1000 Y:0038 P:envMxdIzc - Load Exp Byte 2 into A
$01/AA2B 85 46 STA $46    [$00:0146] A:FF0B X:1000 Y:0038 P:envMxdIzc - Store A in 0146.
$01/AA2D C8 INY A:FF0B X:1000 Y:0038 P:envMxdIzc - +1 to Y.
$01/AA2E B1 60 LDA ($60),y[$7E:1039] A:FF0B X:1000 Y:0039 P:envMxdIzc - Load Exp Byte 3 into A.
$01/AA30 A6 45 LDX $45    [$00:0145] A:FF00 X:1000 Y:0039 P:envMxdIZc - Load X from 40145.
$01/AA32 A0 26 02 LDY #$0226 A:FF00 X:0BE9 Y:0039 P:envMxdIzc - Load Placement Location (2?) into Y.
$01/AA35 20 A8 8F JSR $8FA8  [$01:8FA8] A:FF00 X:0BE9 Y:0226 P:envMxdIzc - Jump to Placement Subroutine.

01/AA38 C2 20 REP #$20 A:02FF X:0007 Y:0226 P:envMxdIzC - Set A to 16 Bits.
$01/AA3A A0 07 00 LDY #$0007 A:02FF X:0007 Y:0226 P:envmxdIzC  - Load HP into Y.
$01/AA3D B1 60 LDA ($60),y[$7E:1007] A:02FF X:0007 Y:0007 P:envmxdIzC "    "
$01/AA3F A0 88 02 LDY #$0288 A:105C X:0007 Y:0007 P:envmxdIzC
$01/AA42 20 83 83 JSR $8383  [$01:8383] A:105C X:0007 Y:0288 P:envmxdIzC - Different subroutine.

$01/AA45 A0 09 00 LDY #$0009 A:B888 X:0007 Y:B888 P:envmxdIzC - Load Max HP into Y.
$01/AA48 B1 60 LDA ($60),y[$7E:1009] A:B888 X:0007 Y:0009 P:envmxdIzC "    "
$01/AA4A A0 92 02 LDY #$0292 A:1076 X:0007 Y:0009 P:envmxdIzC
$01/AA4D 20 83 83 JSR $8383  [$01:8383] A:1076 X:0007 Y:0292 P:envmxdIzC

$01/AA50 A0 0B 00 LDY #$000B A:B884 X:0007 Y:B892 P:envmxdIzC - Load MP into Y.
$01/AA53 B1 60 LDA ($60),y[$7E:100B] A:B884 X:0007 Y:000B P:envmxdIzC "   "
$01/AA55 A0 08 03 LDY #$0308 A:03AB X:0007 Y:000B P:envmxdIzC
$01/AA58 20 83 83 JSR $8383  [$01:8383] A:03AB X:0007 Y:0308 P:envmxdIzC

$01/AA5B A0 0D 00 LDY #$000D A:B989 X:0007 Y:B908 P:envmxdIzC - Load Max MP into Y.
$01/AA5E B1 60 LDA ($60),y[$7E:100D] A:B989 X:0007 Y:000D P:envmxdIzC "  "
$01/AA60 A0 12 03 LDY #$0312 A:03E7 X:0007 Y:000D P:envmxdIzC
$01/AA63 20 83 83 JSR $8383  [$01:8383] A:03E7 X:0007 Y:0312 P:envmxdIzC

$01/AA66 E2 20 SEP #$20 A:B989 X:0007 Y:B912 P:envmxdIzC - Set A to 8 Bits.
$01/AA68 7B TDC A:B989 X:0007 Y:B912 P:envMxdIzC - Clear A (First half of byte?)
$01/AA69 EB XBA A:0100 X:0007 Y:B912 P:envMxdIzC - Swap X and A.
$01/AA6A A0 1D 00 LDY #$001D A:0001 X:0007 Y:B912 P:envMxdIzC - Load Physical Attack into Y.
$01/AA6D B1 60 LDA ($60),y[$7E:101D] A:0001 X:0007 Y:001D P:envMxdIzC - "   "
$01/AA6F A0 B2 03 LDY #$03B2 A:0003 X:0007 Y:001D P:envMxdIzC
$01/AA72 20 7F 83 JSR $837F  [$01:837F] A:0003 X:0007 Y:03B2 P:envMxdIzC - (Different Subroutine)

$01/AA75 A0 2A 00 LDY #$002A A:B983 X:0007 Y:B9B2 P:envMxdIzC - Load Defense into Y.
$01/AA78 B1 60 LDA ($60),y[$7E:102A] A:B983 X:0007 Y:002A P:envMxdIzC - "   "
$01/AA7A A0 B2 04 LDY #$04B2 A:B903 X:0007 Y:002A P:envMxdIzC
$01/AA7D 20 7F 83 JSR $837F  [$01:837F] A:B903 X:0007 Y:04B2 P:envMxdIzC

$01/AA80 A0 24 00 LDY #$0024 A:BA83 X:0007 Y:BAB2 P:envMxdIzC - Load Magical Defense into Y
$01/AA83 B1 60 LDA ($60),y[$7E:1024] A:BA83 X:0007 Y:0024 P:envMxdIzC - "    "
$01/AA85 A0 B2 05 LDY #$05B2 A:BA00 X:0007 Y:0024 P:envMxdIZC
$01/AA88 20 7F 83 JSR $837F  [$01:837F] A:BA00 X:0007 Y:05B2 P:envMxdIzC

$01/AA8B B2 60 LDA ($60)  [$7E:1000] A:BB80 X:0007 Y:BBB2 P:envMxdIZC - Load Character's Handedness into A.
$01/AA8D 29 C0 AND #$C0 A:BB91 X:0007 Y:BBB2 P:eNvMxdIzC - (Get rid of unapplicable bits)
$01/AA8F 4A LSR A A:BB80 X:0007 Y:BBB2 P:eNvMxdIzC - /2 A.
$01/AA90 4A LSR A A:BB40 X:0007 Y:BBB2 P:envMxdIzc - /2 A
$01/AA91 4A LSR A A:BB20 X:0007 Y:BBB2 P:envMxdIzc - /2 A
$01/AA92 85 45 STA $45    [$00:0145] A:BB10 X:0007 Y:BBB2 P:envMxdIzc - Store A in 45.
$01/AA94 64 46 STZ $46    [$00:0146] A:BB10 X:0007 Y:BBB2 P:envMxdIzc - Store Zero in 46.
$01/AA96 C2 20 REP #$20 A:BB10 X:0007 Y:BBB2 P:envMxdIzc - Set A to 16 Bits.
$01/AA98 A9 34 DE LDA #$DE34 A:BB10 X:0007 Y:BBB2 P:envmxdIzc - Load DE34 into A.
$01/AA9B 18 CLC A:DE34 X:0007 Y:BBB2 P:eNvmxdIzc - Clear Carry Flag.
$01/AA9C 65 45 ADC $45    [$00:0145] A:DE34 X:0007 Y:BBB2 P:eNvmxdIzc - Add the value from 45 onto A.
$01/AA9E A8 TAY A:DE44 X:0007 Y:BBB2 P:eNvmxdIzc - Transfer A to Y.
$01/AA9F E2 20 SEP #$20 A:DE44 X:0007 Y:DE44 P:eNvmxdIzc - Set A back to 8 bits.
$01/AAA1 A2 86 01 LDX #$0186 A:DE44 X:0007 Y:DE44 P:eNvMxdIzc -  - Load 0186 into X.
$01/AAA4 20 CD 82 JSR $82CD  [$01:82CD] A:DE44 X:0186 Y:DE44 P:envMxdIzc - Jump to Subroutine

$01/AAA7 A0 01 00 LDY #$0001 A:FF00 X:0186 Y:DE4A P:envMxdIzC - Load Character Class into Y.
$01/AAAA B1 60 LDA ($60),y[$7E:1001] A:FF00 X:0186 Y:0001 P:envMxdIzC - "   "
$01/AAAC A0 06 01 LDY #$0106 A:FF0B X:0186 Y:0001 P:envMxdIzC
$01/AAAF 20 C8 8F JSR $8FC8  [$01:8FC8] A:FF0B X:0186 Y:0106 P:envMxdIzC - Unique Subroutine
(Note to Self: Remember to change this to look at Second Job Byte)

$01/AAB5 A0 02 00 LDY #$0002 A:FFC7 X:0054 Y:B714 P:eNvMxdIzC - Load Character's Level into Y
$01/AAB8 B1 60 LDA ($60),y[$7E:1002] A:FFC7 X:0054 Y:0002 P:envMxdIzC - "  "
$01/AABA C9 63 CMP #$63 A:FF0A X:0054 Y:0002 P:envMxdIzC - Is it 99?
$01/AABC D0 03 BNE $03    [$AAC1] A:FF0A X:0054 Y:0002 P:eNvMxdIzc - If not, branch.
--------------------------
01/AABE 4C 48 AB JMP $AB48  [$01:AB48] A:FF00 X:0054 Y:DAC4 P:envMxdIzC - Jump out of Routine.
------------------------
$01/AAC1 A0 B6 DA LDY #$DAB6 A:FF0A X:0054 Y:0002 P:eNvMxdIzc - Load Location Code.
$01/AAC4 20 01 83 JSR $8301  [$01:8301] A:FF0A X:0054 Y:DAB6 P:eNvMxdIzc - Jump to Subroutine.

$01/AAC7 A0 3D 00 LDY #$003D A:FF00 X:0054 Y:DAC4 P:envMxdIzC - Load Exp to Level Up Byte 1 into Y.
$01/AACA B1 60 LDA ($60),y[$7E:103D] A:FF00 X:0054 Y:003D P:envMxdIzC - " " (Same as the above Exp one basically)
$01/AACC 85 45 STA $45    [$00:0145] A:FF4B X:0054 Y:003D P:envMxdIzC
$01/AACE C8 INY A:FF4B X:0054 Y:003D P:envMxdIzC
$01/AACF B1 60 LDA ($60),y[$7E:103E] A:FF4B X:0054 Y:003E P:envMxdIzC
$01/AAD1 85 46 STA $46    [$00:0146] A:FF0B X:0054 Y:003E P:envMxdIzC
$01/AAD3 C8 INY A:FF0B X:0054 Y:003E P:envMxdIzC
$01/AAD4 B1 60 LDA ($60),y[$7E:103F] A:FF0B X:0054 Y:003F P:envMxdIzC
$01/AAD6 85 47 STA $47    [$00:0147] A:FF00 X:0054 Y:003F P:envMxdIZC
$01/AAD8 B2 60 LDA ($60)  [$7E:1000] A:FF00 X:0054 Y:003F P:envMxdIZC
$01/AADA 29 3F AND #$3F A:FF91 X:0054 Y:003F P:eNvMxdIzC
$01/AADC 3A DEC A A:FF11 X:0054 Y:003F P:envMxdIzC
$01/AADD 0A ASL A A:FF10 X:0054 Y:003F P:envMxdIzC
$01/AADE 20 B4 87 JSR $87B4  [$01:87B4] A:FF20 X:0054 Y:003F P:envMxdIzc


$01/AAE1 C2 20 REP #$20 A:FF20 X:0020 Y:003F P:envMxdIzc  - Change A to 16 Bit.
$01/AAE3 BF 00 B5 0F LDA $0FB500,x[$0F:B520] A:FF20 X:0020 Y:003F P:envmxdIzc - Load A from 0FB500 (something to do with Level 70?)
$01/AAE7 85 48 STA $48    [$00:0148] A:B790 X:0020 Y:003F P:eNvmxdIzc - Store A in 0148.
$01/AAE9 E2 20 SEP #$20 A:B790 X:0020 Y:003F P:eNvmxdIzc - Change A to 8 Bit.
$01/AAEB A0 02 00 LDY #$0002 A:B790 X:0020 Y:003F P:eNvMxdIzc - Load Level into Y.
$01/AAEE B1 60 LDA ($60),y[$7E:1002] A:B790 X:0020 Y:0002 P:envMxdIzc - "   "
$01/AAF0 C9 45 CMP #$45 A:B70A X:0020 Y:0002 P:envMxdIzc - Is it 69 or above?
$01/AAF2 90 02 BCC $02    [$AAF6] A:B70A X:0020 Y:0002 P:eNvMxdIzc - If not, branch.
------------------------------
$01/AAF4 A9 45 LDA #$45 A:B709 X:0020 Y:0002 P:envMxdIzc - Load 69 into A (?)
---------------------------------
$01/AAF6 3A DEC A A:B70A X:0020 Y:0002 P:eNvMxdIzc - -1 to A,
$01/AAF7 85 43 STA $43    [$00:0143] A:B709 X:0020 Y:0002 P:envMxdIzc - Store A in 0143.
(This just seriously goes off on its own indecipherable tangent for a while, so I'll pick back up when this makes sense again...)


And it doesn't. Alright, that seems to be all I can decipher, but I found all of the major points here.

This should give me the means to change the screen as I will... what I think I'm actually going to do is change the HP value to read "Job (Current Job Points)/(Until Next Job Level) so to go back to Rydia again... It would read "Job 5/10" Then when she reaches 10 it would read 10/18 and so on and so forth. This seems the easiest way to deal with it at least in my opinion. I'll figure out what to do with the MP Maybe try to turn that into a pseudo "Job Lvl." that reads the amount out of how may spells it has skipped (+1 to X, load X in here, etc.)

It may be trickier than I think though. It is worth a shot though. Some visual representation Somewhere is needed, you are right.

 :edit: Just a quick update that I have the Job Name showing properly in the Status Screen with a very simple jump and code.

Code: [Select]
$01/AAA7 22 C1 FE 00 JSL $00FEC1[$00:FEC1] A:FF00 X:0186 Y:DE4A P:envMxdIzC - Jump to Custom Routine
$00/FEC1 A0 2F 00 LDY #$002F A:FF00 X:0186 Y:DE4A P:envMxdIzC - Load Job Byte 1 into Y.
$00/FEC4 B1 60 LDA ($60),y[$7E:1032] A:FF00 X:0186 Y:002F P:envMxdIzC - Load Job Byte 1
$00/FEC6 D0 05 BNE $05    [$FECD] A:FF10 X:0186 Y:002F P:envMxdIzC - If not 00, branch.
----------------------------------------------------
$00/FEC8 A0 01 00 LDY #$0001 A:FF00 X:0186 Y:0032 P:envMxdIZC - Load Class into Y.
$00/FECB B1 60 LDA ($60),y[$7E:1001] A:FF00 X:0186 Y:0001 P:envMxdIzC - Load Class.
$00/FECD 6B RTL A:FF10 X:0186 Y:002F P:envMxdIzC - Return from Long.
------------------------------------------
$00/FECE A0 2F 00 LDY #$002F A:FF9C X:0186 Y:0032 P:eNvMxdIzC - Load Job Byte 1 into Y.
$00/FED1 B1 60 LDA ($60),y[$7E:106F] A:FF9C X:0186 Y:002F P:envMxdIzC - Load Job Byte 1.
$00/FED3 6B RTL A:FF0E X:0186 Y:002F P:envMxdIzC - Return

 :edit: 2

Alright, that went smoothly enough, I managed to load the current Job Points into Status, now comes the hard part... thankfully I've already laid the groundwork in this routine for the "Check how many Job Points until the Next Level"

Displaying Current Job Points...

Code: [Select]
$00/FED4 8A TXA A:02FF X:0007 Y:0226 P:envmxdIzC - Transfer X to A (to get rid of bits.)
$00/FED5 E2 20 SEP #$20 A:0007 X:0007 Y:0226 P:envmxdIzC - Set A to 8 Bits.
$00/FED7 A0 32 00 LDY #$0032 A:0007 X:0007 Y:0226 P:envMxdIzC - Load Job Location into Y.
$00/FEDA B1 60 LDA ($60),y[$7E:1072] A:0007 X:0007 Y:0032 P:envMxdIzC - Load Job into A.
$00/FEDC D0 11 BNE $11    [$FEEF] A:009C X:0007 Y:0032 P:eNvMxdIzC - Branch if not 00.
------------------------------------
$00/FEDE A0 01 00 LDY #$0001 A:0000 X:0007 Y:0032 P:envMxdIZC - Load Class Location into Y.
$00/FEE1 B1 60 LDA ($60),y[$7E:1081] A:0000 X:0007 Y:0001 P:envMxdIzC - Load Class into Y.
$00/FEE3 29 0F AND #$0F A:0000 X:0007 Y:0001 P:envMxdIZC - Get rid of bits.
$00/FEE5 20 A0 FF JSR $FFA0  [$00:FFA0] A:0000 X:0007 Y:0001 P:envMxdIZ - Jump to Character Setting Subroutine
$00/FEE8 C2 20 REP #$20 A:0000 X:0000 Y:0001 P:envMxdIZc - Set A to 16 Bits.
$00/FEEA 80 06 BRA $06    [$FEF2] A:0000 X:0000 Y:0001 P:envmxdIZc - Branch.
-----------------------------------
$00/FEEF E9 8E SBC #$8E A:009C X:0007 Y:0032 P:eNvMxdIzC - Subtract 8E to reach the proper Job Point Tracker.
$00/FEF1 18 CLC A:000E X:0007 Y:0032 P:envMxdIzC - Clear Carry Flag.
$00/FEF2 AA TAX A:000E X:0007 Y:0032 P:envMxdIzc - Transfer A to X.
$00/FEF3 BD A0 14 LDA $14A0,x[$7E:14AE] A:000E X:000E Y:0032 P:envMxdIzc - Load Job Tracker Location into A.
$00/FEF6 8D FE 14 STA $14FE  [$7E:14FE] A:0003 X:000E Y:0032 P:envMxdIzc - Store A in 14FE (to be retrieved later)
$00/FEF9 C2 20 REP #$20 A:0003 X:000E Y:0032 P:envMxdIzc - Set A to 16-Bit.
$00/FEFB 6B RTL A:0003 X:000E Y:0032 P:envmxdIzc - Return

One more update and that will be the "till next job level" portion, then I will have a beautiful picture of my work to show!


 :edit: 3 And it is finally here! It took a bit of delicate handiwork, but I got it to display the amount needed until the next Job Level.

Displaying Job Points Needed to Reach Next Level

Code: [Select]
$0B/FEB0 29 FF 00 AND #$00FF A:B883 X:0000 Y:B888 P:envmxdIzc - Get rid of any bits in the second byte.
$0B/FEB3 E2 20 SEP #$20 A:0083 X:0000 Y:B888 P:envmxdIzc - Set A to 8-Bits.
$0B/FEB5 A0 32 00 LDY #$0032 A:0083 X:0000 Y:B888 P:envMxdIzc - Load Job Location into Y.
$0B/FEB8 B1 60 LDA ($60),y[$7E:10B2] A:0083 X:0000 Y:0032 P:envMxdIzc - Load Job into A.
$0B/FEBA C2 20 REP #$20 A:0000 X:0000 Y:0032 P:envMxdIZc - Set A to 16-Bits.
$0B/FEBC F0 08 BEQ $08    [$FEC6] A:0000 X:0000 Y:0032 P:envmxdIZc - Branch if 00.
-----------------------------------------------
$0B/FEBE E9 8D 00 SBC #$008D A:009C X:000E Y:0032 P:eNvmxdIzc - Subtract 8D (8E) from A.
$0B/FEC1 29 FF 00 AND #$00FF A:000E X:000E Y:0032 P:envmxdIzC - Get rid of Bits.
$0B/FEC4 80 14 BRA $14    [$FEDA] A:000E X:000E Y:0032 P:envmxdIzC - Branch.
------------------------------------------------
$0B/FEC6 A0 01 00 LDY #$0001 A:0000 X:0000 Y:0032 P:envmxdIZc - Load Class Location into Y.
$0B/FEC9 B1 60 LDA ($60),y[$7E:1081] A:0000 X:0000 Y:0001 P:envmxdIzc - Load Class into Y.
$0B/FECB 29 0F 00 AND #$000F A:0C00 X:0000 Y:0001 P:envmxdIzc - Get rid of Bits.
$0B/FECE E2 20 SEP #$20 A:0000 X:0000 Y:0001 P:envmxdIZc - Set A to 8-Bits.
$0B/FED0 C9 0B CMP #$0B A:0000 X:0000 Y:0001 P:envMxdIZc - Is it Adult Rydia? (Had to recreate this routine since we were outside of the bank that originally contained it)
$0B/FED2 D0 02 BNE $02    [$FED6] A:0000 X:0000 Y:0001 P:eNvMxdIzc - If not, branch.
----------------------------------------
(Sets a 02 in A)
-------------------------------------
$0B/FED6 C9 0C CMP #$0C A:0000 X:0000 Y:0001 P:eNvMxdIzc - It it Edge or FuSoYa?
$0B/FED8 90 01 BCC $01    [$FEDB] A:0000 X:0000 Y:0001 P:eNvMxdIzc - If not, branch.
-------------------------
$0B/FEDA 3A DEC A A:000E X:000E Y:0032 P:envmxdIzC (For jobs this helps reach the Actual Spell Learning Table.
-----------------------
$0B/FEDB AA TAX A:0000 X:0000 Y:0001 P:eNvMxdIzc - Transfer A to X.
$0B/FEDC C2 20 REP #$20 A:0000 X:0000 Y:0001 P:envMxdIZc - Set A to 16-Bits.
$0B/FEDE A8 TAY A:0000 X:0000 Y:0001 P:envmxdIZc - Transfer A to Y.
$0B/FEDF A9 00 00 LDA #$0000 A:0000 X:0000 Y:0000 P:envmxdIZc - Load 0000 into A
~~~~~~~~~~~~(Looping Point)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$0B/FEE2 C0 00 00 CPY #$0000 A:0000 X:0000 Y:0000 P:envmxdIZc - Is Y 0000? (Has it reached the proper Spell Learning Point)
$0B/FEE5 F0 06 BEQ $06    [$FEED] A:0000 X:0000 Y:0000 P:envmxdIZC - If so, branch.
---------------------------------------------
$0B/FEE7 69 0F 00 ADC #$000F A:0000 X:000D Y:000D P:envmxdIzC - Add 0F (10) into A.
$0B/FEEA 88 DEY A:0010 X:000D Y:000D P:envmxdIzc  - 1 from Y.
$0B/FEEB 80 F5 BRA $F5    [$FEE2] A:0010 X:000D Y:000C P:envmxdIzc - Loop back.
-----------------------------------------------
$0B/FEED AA TAX A:0000 X:0000 Y:0000 P:envmxdIZC - Transfer A to X.
$0B/FEEE E2 20 SEP #$20 A:0000 X:0000 Y:0000 P:envmxdIZC - Set A to 8 Bits.
$0B/FEF0 A0 08 00 LDY #$0008 A:0000 X:0000 Y:0000 P:envMxdIZC - Load 0008 into Y (checking all eight spells)
~~~~~~~~~~~~~~~~~~~~(Looping Point)~~~~~~~~~~~~~~~~~~~~~~~~``
$0B/FEF3 BF 40 C6 0F LDA $0FC640,x[$0F:C640] A:0000 X:0000 Y:0008 P:envMxdIzC - Load Spell Learning Point.
$0B/FEF7 CD FE 14 CMP $14FE  [$7E:14FE] A:000A X:0000 Y:0008 P:envMxdIzC - Compare it with the Job Tracker stored by the previous Routine.
$0B/FEFA B0 0B BCS $0B    [$FF07] A:000A X:0000 Y:0008 P:envMxdIzC - Branch if more.
------------------------------------------
$0B/FEFC E8 INX A:0001 X:00D0 Y:0008 P:eNvMxdIzc - +2 X
$0B/FEFD E8 INX A:0001 X:00D1 Y:0008 P:envMxdIzc
$0B/FEFE 88 DEY A:0001 X:00D2 Y:0008 P:envMxdIzc -1 Y
$0B/FEFF C0 00 00 CPY #$0000 A:0001 X:00D2 Y:0007 P:envMxdIzc - Is Y 00?
$0B/FF02 D0 EF BNE $EF    [$FEF3] A:0001 X:00D2 Y:0007 P:envMxdIzC - If not, loop back.
-----------------------------------------------------------
(Load 0000 into A) This is used if the job is Mastered.
----------------------------------------------
$0B/FF07 C2 20 REP #$20 A:000A X:0000 Y:0008 P:envMxdIzC  - Set A to 16 Bits
$0B/FF09 6B RTL A:000A X:0000 Y:0008 P:envmxdIzC - Return

And it is done! As I promised here is a picture, probably the most underwhelming thing ever seen, but it took a Lot of work to display it all correctly.






« Last Edit: April 28, 2015, 05:58:27 PM by Grimoire LD »

chillyfeez

  • FF4 Hacker
  • *
  • Posts: 1,285
  • Gender: Male
  • Go ahead, ask me about Angel Feathers!
    • View Profile
Re: Grimoire LD's Notes, Patches, and Hacks (A Working Job System!)
« Reply #467 on: April 28, 2015, 06:33:11 PM »
That's awesome!
It feels much more authentic when the game is actually tracking progression for the player.
Nice work!

JCE3000GT

  • Master of FF4
  • *
  • Posts: 1,429
  • Gender: Male
  • Vladof
    • View Profile
    • BlitzKrieg Innovations
Re: Grimoire LD's Notes, Patches, and Hacks (A Working Job System!)
« Reply #468 on: April 28, 2015, 08:27:59 PM »
Omg how much HP does he have?!  In all seriousness great work! 

Grimoire LD

  • FF4 Hacker
  • *
  • Posts: 1,684
    • View Profile
Re: Grimoire LD's Notes, Patches, and Hacks (A Working Job System!)
« Reply #469 on: April 30, 2015, 09:04:20 PM »
Thanks fellows! With the Job System raring to go I'm now in the progress of creating the routine for the 72 new spells (note, this does not mean 72 new routines, or else I would be at that step forever...) to make sure each character will be receiving a robust spell book where each character will feel and play unique. (I'm hoping). With Rydia, what I'm likely going to do is have several of her summons learned through her Jobs, things like Chocobo, the three Elemental Summons, and Titan for instance. If I can ever grasp what Chillyfeez did with changing Summon Monsters, I would even plan on changing Imp, Bomb, Roc, and Mage summons for something else to mix it up.  Ideally I would also like to turn Asura into different summons, but that would involve finding out what causes her summon formation to cycle through her masks in the first place, which sounds like a lot of work.

As for now I'm looking at another lesser explored portion, that which decides what graphics or palettes to attach to characters when falling under status.

What I've learned...

7EF015-18 looks to be what the game looks at (for the first slot) to determine what state that character is in and from there I can distinguish all else...

In any case this is some great fodder for new additions for FF4kster!

Status Graphical Effects on Characters



Code: [Select]
$02/DE9A B9 15 F0 LDA $F015,y[$7E:F015] A:0001 X:0000 Y:0000 P:envMxdIzC - Load Status Byte 1 into A.
$02/DE9D 85 0E STA $0E    [$00:000E] A:0001 X:0000 Y:0000 P:envMxdIzC - Store it in 0E (rinse and repeat thrice more)
$02/DE9F B9 16 F0 LDA $F016,y[$7E:F016] A:0001 X:0000 Y:0000 P:envMxdIzC
$02/DEA2 85 0F STA $0F    [$00:000F] A:0000 X:0000 Y:0000 P:envMxdIZC
$02/DEA4 B9 17 F0 LDA $F017,y[$7E:F017] A:0000 X:0000 Y:0000 P:envMxdIZC
$02/DEA7 85 10 STA $10    [$00:0010] A:0000 X:0000 Y:0000 P:envMxdIZC
$02/DEA9 B9 18 F0 LDA $F018,y[$7E:F018] A:0000 X:0000 Y:0000 P:envMxdIZC
$02/DEAC 85 11 STA $11    [$00:0011] A:0000 X:0000 Y:0000 P:envMxdIZC
$02/DEAE A5 0E LDA $0E    [$00:000E] A:0000 X:0000 Y:0000 P:envMxdIZC - Load Status Byte 1 from 0E.
$02/DEB0 29 80 AND #$80 A:0001 X:0000 Y:0000 P:envMxdIzC - Is it KO'ed?
$02/DEB2 F0 0A BEQ $0A    [$DEBE] A:0000 X:0000 Y:0000 P:envMxdIZC - If not, branch.
------------------------------------------------------------------------------------------------------
$02/DEB4 E6 64 INC $64    [$00:0064] A:0080 X:0000 Y:0000 P:eNvMxdIzC - Add +1 to 64.
$02/DEB6 A9 09 LDA #$09 A:0080 X:0000 Y:0000 P:envMxdIzC - Load Swoon into A
$02/DEB8 9D D0 EF STA $EFD0,x[$7E:EFD0] A:0009 X:0000 Y:0000 P:envMxdIzC - Store A in Pose Byte.
$02/DEBB 4C DB DF JMP $DFDB  [$02:DFDB] A:0009 X:0000 Y:0000 P:envMxdIzC - Ignore all other Status Graphics.
-----------------------------------------------------------------------------------------------------------
$02/DEBE A5 0E LDA $0E    [$00:000E] A:0000 X:0000 Y:0000 P:envMxdIZC - Load Status Byte 1.
$02/DEC0 29 40 AND #$40 A:0001 X:0000 Y:0000 P:envMxdIzC - Is it Stone?
$02/DEC2 F0 0E BEQ $0E    [$DED2] A:0000 X:0000 Y:0000 P:envMxdIZC - If not, branch.
---------------------------------------------------------------------------------------
$02/DEC6 A9 03 LDA #$03 A:0040 X:0000 Y:0000 P:envMxdIzc - Load something into A. (It colors the body, gray, but different values have different shades of coloration)
$02/DEC8 9D CC EF STA $EFCC,x[$7E:EFCC] A:0003 X:0000 Y:0000 P:envMxdIzc - Store A in Stone-Color Area?
$02/DECB 1A INC A A:0003 X:0000 Y:0000 P:envMxdIzc - +1 to A.
$02/DECC 9D D0 EF STA $EFD0,x[$7E:EFD0] A:0004 X:0000 Y:0000 P:envMxdIzc - Store Pose of Crouching into Pose Byte.
$02/DECF 4C DB DF JMP $DFDB  [$02:DFDB] A:0004 X:0000 Y:0000 P:envMxdIzc - Ignore all other status graphics.
-----------------------------------------------------------------------------------
$02/DED2 A5 0F LDA $0F    [$00:000F] A:0000 X:0000 Y:0000 P:envMxdIZC - Load Status Byte 2
$02/DED4 29 03 AND #$03 A:0000 X:0000 Y:0000 P:envMxdIZC - Keep 1/3 and 2/3 Petrified.
$02/DED6 9D CC EF STA $EFCC,x[$7E:EFCC] A:0000 X:0000 Y:0000 P:envMxdIZC - Store A in 7EEFCC
$02/DED9 A5 0E LDA $0E    [$00:000E] A:0000 X:0000 Y:0000 P:envMxdIZC - Load Status Byte 1 into A
$02/DEDB 29 01 AND #$01 A:0001 X:0000 Y:0000 P:envMxdIzC - Is it Poison?
$02/DEDD F0 08 BEQ $08    [$DEE7] A:0001 X:0000 Y:0000 P:envMxdIzC - If not, branch.
---------------------------------------------------------------------------------------------
$02/DEDF 20 D9 DA JSR $DAD9  [$02:DAD9] A:0001 X:0000 Y:0000 P:envMxdIzC - Jump to Subroutine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$02/DAD9 DA PHX A:0001 X:0000 Y:0000 P:envMxdIzC - Push X onto Stack
$02/DADA A5 47 LDA $47    [$00:0047] A:0001 X:0000 Y:0000 P:envMxdIzC - Load A from 47.
$02/DADC 18 CLC A:0000 X:0000 Y:0000 P:envMxdIZC - Clear Carry.
$02/DADD 69 09 ADC #$09 A:0000 X:0000 Y:0000 P:envMxdIZc - Add 09 into A.
$02/DADF C2 20 REP #$20 A:0009 X:0000 Y:0000 P:envMxdIzc - Set A to 16 Bits
$02/DAE1 0A ASL A A:0009 X:0000 Y:0000 P:envmxdIzc
$02/DAE2 0A ASL A A:0012 X:0000 Y:0000 P:envmxdIzc
$02/DAE3 0A ASL A A:0024 X:0000 Y:0000 P:envmxdIzc
$02/DAE4 0A ASL A A:0048 X:0000 Y:0000 P:envmxdIzc
$02/DAE5 0A ASL A A:0090 X:0000 Y:0000 P:envmxdIzc A x20
$02/DAE6 AA TAX A:0120 X:0000 Y:0000 P:envmxdIzc - Transfer A to X.
$02/DAE7 A9 7D F6 LDA #$F67D A:0120 X:0120 Y:0000 P:envmxdIzc - Load Changed Skin Palette into A..
$02/DAEA 9D 56 ED STA $ED56,x[$7E:EE76] A:F67D X:0120 Y:0000 P:eNvmxdIzc - Store A in ?Palette Area?
$02/DAED A9 30 7D LDA #$7D30 A:F67D X:0120 Y:0000 P:eNvmxdIzc - Load 2nd Changed Skin Palette into A.
$02/DAF0 9D 58 ED STA $ED58,x[$7E:EE78] A:7D30 X:0120 Y:0000 P:envmxdIzc - Store A in ?Palette Area?
$02/DAF3 7B TDC A:7D30 X:0120 Y:0000 P:envmxdIzc - Set A to 00 (normally)
$02/DAF7 E2 20 SEP #$20 A:0000 X:0120 Y:0000 P:envmxdIZc - Set A to 8 Bits.
$02/DAF9 FA PLX A:0000 X:0120 Y:0000 P:envMxdIZc - Pull X
$02/DAFA 60 RTS A:0000 X:0000 Y:0000 P:envMxdIZc - Return
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$02/DEE2 A9 04 LDA #$04 A:0000 X:0000 Y:0000 P:envMxdIZc - Load !Pose! into A. (Finally! Poison should not be enough to kneel!)
$02/DEE4 9D D0 EF STA $EFD0,x[$7E:EFD0] A:0004 X:0000 Y:0000 P:envMxdIzc - Store A in (what must be the poses area)
-----------------------------------------------------------------------------------------------------------
$02/DEE7 A5 10 LDA $10    [$00:0010] A:0001 X:0000 Y:0000 P:envMxdIzc - Load Status Byte 3 into A.
$02/DEE9 29 01 AND #$01 A:0000 X:0000 Y:0000 P:envMxdIZc - Is it Count?
$02/DEEB F0 12 BEQ $12    [$DEFF] A:0000 X:0000 Y:0000 P:envMxdIZc - If not, branch.
----------------------------------------------------------------------------------------------------------
$02/DEED 5A PHY A:0001 X:0000 Y:0000 P:envMxdIzc - Push Y onto Stack.
$02/DEEE A5 47 LDA $47    [$00:0047] A:0001 X:0000 Y:0000 P:envMxdIzc - Load A from 47.
$02/DEF0 A8 TAY A:0000 X:0000 Y:0000 P:envMxdIZc - Transfer A to Y.
$02/DEF1 B9 AF F0 LDA $F0AF,y[$7E:F0AF] A:0000 X:0000 Y:0000 P:envMxdIZc - Load F0AF into A.
$02/DEF4 D0 08 BNE $08    [$DEFE] A:0000 X:0000 Y:0000 P:envMxdIZc - If not 00, branch.
-----------------------------------------------------------------------------------------
$02/DEF6 7A PLY A:0000 X:0000 Y:0000 P:envMxdIZc - Pull Y from Stack.
$02/DEF7 22 AE EA 01 JSL $01EAAE[$01:EAAE] A:0000 X:0000 Y:0000 P:envMxdIZc - Jump Long to Subroutine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$01/EAAE DA PHX A:0000 X:0000 Y:0000 P:envMxdIZc - Push X onto Stack
$01/EAAF A5 47 LDA $47    [$00:0047] A:0000 X:0000 Y:0000 P:envMxdIZc - Load A from 47.
$01/EAB1 AA TAX A:0000 X:0000 Y:0000 P:envMxdIZc - Transfer A to X.
$01/EAB2 BF 17 FD 0D LDA $0DFD17,x[$0D:FD17] A:0000 X:0000 Y:0000 P:envMxdIZc - Load A from 0DFD17.
$01/EAB6 AA TAX A:0000 X:0000 Y:0000 P:envMxdIZc - Transfer A to X.
$01/EAB7 BD 16 2A LDA $2A16,x[$7E:2A16] A:0000 X:0000 Y:0000 P:envMxdIZc - Load A from 7E2A16.
$01/EABA AA TAX A:0000 X:0000 Y:0000 P:envMxdIZc - Transfer A to X.
$01/EABB 86 1C STX $1C    [$00:001C] A:0000 X:0000 Y:0000 P:envMxdIZc - Store X in 1C.
$01/EABD A2 0A 00 LDX #$000A A:0000 X:0000 Y:0000 P:envMxdIZc - Load 000A into X.
$01/EAC0 86 1E STX $1E    [$00:001E] A:0000 X:000A Y:0000 P:envMxdIzc - Store X in 1E.
$01/EAC2 20 7D EA JSR $EA7D  [$01:EA7D] A:0000 X:000A Y:0000 P:envMxdIzc - Jump to Subroutine (Cleaning)
$01/EAC5 A5 22 LDA $22    [$00:0022] A:0000 X:000A Y:0000 P:envMxdIzc - Load A from 22.
$01/EAC7 18 CLC A:0000 X:000A Y:0000 P:envMxdIZc - Clear Carry.
$01/EAC8 69 70 ADC #$70 A:0000 X:000A Y:0000 P:envMxdIZc - Add 70 onto a. (Base graphic number of the 1st Doom Digit)
$01/EACA 8D 7A F0 STA $F07A  [$7E:F07A] A:0070 X:000A Y:0000 P:envMxdIzc - Store A in F07A.
$01/EACD A5 20 LDA $20    [$00:0020] A:0070 X:000A Y:0000 P:envMxdIzc - Load A from 20.
$01/EACF 18 CLC A:0000 X:000A Y:0000 P:envMxdIZc - Clear Carry.
$01/EAD0 69 70 ADC #$70 A:0000 X:000A Y:0000 P:envMxdIZc - Add 70 onto A. (Basic graphic number of the 2nd Doom Digit.
$01/EAD2 8D 79 F0 STA $F079  [$7E:F079] A:0070 X:000A Y:0000 P:envMxdIzc - Store A in F079.
$01/EAD5 FA PLX A:0070 X:000A Y:0000 P:envMxdIzc - Pull X from Stack.
$01/EAD6 A9 04 LDA #$04 A:0070 X:0000 Y:0000 P:envMxdIZc - Load Crouching into A.
$01/EAD8 9D D0 EF STA $EFD0,x[$7E:EFD0] A:0004 X:0000 Y:0000 P:envMxdIzc - Store A in Pose Byte.
$01/EADB A9 09 LDA #$09 A:0004 X:0000 Y:0000 P:envMxdIzc - Load Count Numbers above head into A.
$01/EADD 8D 78 F0 STA $F078  [$7E:F078] A:0009 X:0000 Y:0000 P:envMxdIzc - Store A in Status Special Graphic Display.
$01/EAE0 6B RTL A:0009 X:0000 Y:0000 P:envMxdIzc - Return from Long.
$02/DEFB 4C CD DF JMP $DFCD  [$02:DFCD] A:0009 X:0000 Y:0000 P:envMxdIzc - Ignore all other Status Graphics.
------------------------------------------------------------------------------------------------------------
$02/DEFF A5 10 LDA $10    [$00:0010] A:0000 X:0000 Y:0000 P:envMxdIZc - Load Status Byte 3 into A.
$02/DF01 29 80 AND #$80 A:0000 X:0000 Y:0000 P:envMxdIZc  - Is it Magnetized?
$02/DF03 F0 0B BEQ $0B    [$DF10] A:0000 X:0000 Y:0000 P:envMxdIZc - If not, branch.
---------------------------------------------------------------------------------------------------------
$02/DF05 A9 04 LDA #$04 A:0080 X:0000 Y:0000 P:eNvMxdIzc - Load Crouching into A.
$02/DF07 9D D0 EF STA $EFD0,x[$7E:EFD0] A:0004 X:0000 Y:0000 P:envMxdIzc - Store A in Pose Byte.
$02/DF0A 8D 78 F0 STA $F078  [$7E:F078] A:0004 X:0000 Y:0000 P:envMxdIzc - Store A in Special Status Graphic Byte.
$02/DF0D 4C CD DF JMP $DFCD  [$02:DFCD] A:0004 X:0000 Y:0000 P:envMxdIzc - Ignore all other Status Graphics.
---------------------------------------------------------------------------------------------------------
$02/DF10 A5 0E LDA $0E    [$00:000E] A:0000 X:0000 Y:0000 P:envMxdIZc - Load Status Byte 1 into A.
$02/DF12 29 04 AND #$04 A:0001 X:0000 Y:0000 P:envMxdIzc - Is it Mute?
$02/DF14 F0 0D BEQ $0D    [$DF23] A:0000 X:0000 Y:0000 P:env - If not, branch.
---------------------------------------------------------------------------------------------------------
$02/DF16 A9 04 LDA #$04 A:0004 X:0000 Y:0000 P:envMxdIzc - Load Crouching into A.
$02/DF18 9D D0 EF STA $EFD0,x[$7E:EFD0] A:0004 X:0000 Y:0000 P:envMxdIzc - Store A in Pose Byte. 
$02/DF1B A9 01 LDA #$01 A:0004 X:0000 Y:0000 P:envMxdIzc - Load 01 into A.
$02/DF1D 8D 78 F0 STA $F078  [$7E:F078] A:0001 X:0000 Y:0000 P:envMxdIzc - Store A in Special Status Graphic.
$02/DF20 4C CD DF JMP $DFCD  [$02:DFCD] A:0001 X:0000 Y:0000 P:envMxdIzc - Ignore all other Status Graphics.
-------------------------------------------------------------------------------------------------------------
$02/DF23 A5 0E LDA $0E    [$00:000E] A:0000 X:0000 Y:0000 P:envMxdIZc - Load Status Byte 1 into A.
$02/DF25 29 02 AND #$02 A:0001 X:0000 Y:0000 P:envMxdIzc - Is it Blind?
$02/DF27 F0 0D BEQ $0D    [$DF36] A:0000 X:0000 Y:0000 P:envMxdIZc - If not, branch.
-----------------------------------------------------------------------------------------------------------
$02/DF29 A9 04 LDA #$04 A:0002 X:0000 Y:0000 P:envMxdIzc - Load Crouching into A.
$02/DF2B 9D D0 EF STA $EFD0,x[$7E:EFD0] A:0004 X:0000 Y:0000 P:envMxdIzc - Store A in Pose Byte.
$02/DF2E A9 02 LDA #$02 A:0004 X:0000 Y:0000 P:envMxdIzc - Load Blind Eyes into A
$02/DF30 8D 78 F0 STA $F078  [$7E:F078] A:0002 X:0000 Y:0000 P:envMxdIzc - Store A in Special Status Graphic.
$02/DF33 4C CD DF JMP $DFCD  [$02:DFCD] A:0002 X:0000 Y:0000 P:envMxdIzc - Ignore all other Status Graphic.
------------------------------------------------------------------------------------------------------------
$02/DF36 A5 0F LDA $0F    [$00:000F] A:0000 X:0000 Y:0000 P:envMxdIZc - Load Status Byte 2 into A.
$02/DF38 29 80 AND #$80 A:0000 X:0000 Y:0000 P:envMxdIZc - Is it Curse?
$02/DF3A F0 0C BEQ $0C    [$DF48] A:0000 X:0000 Y:0000 P:envMxdIZc - If not, branch.
-----------------------------------------------------------------------------------------------------------
$02/DF3C A9 04 LDA #$04 A:0080 X:0000 Y:0000 P:eNvMxdIzC - Load Crouching into A.
$02/DF3E 9D D0 EF STA $EFD0,x[$7E:EFD0] A:0004 X:0000 Y:0000 P:envMxdIzC - Store A in Pose Byte.
$02/DF41 0A ASL A A:0004 X:0000 Y:0000 P:envMxdIzC - x2 A (Skull)
$02/DF42 8D 78 F0 STA $F078  [$7E:F078] A:0008 X:0000 Y:0000 P:envMxdIzc - Store A in Special Status Graphic.
$02/DF45 4C CD DF JMP $DFCD  [$02:DFCD] A:0008 X:0000 Y:0000 P:envMxdIzc - Ignore all other Status Graphic.
----------------------------------------------------------------------------------------------------------
$02/DF49 A5 47 LDA $47    [$00:0047] A:0000 X:0000 Y:0000 P:envMxdIZc - Load A from 0047.
$02/DF4B A8 TAY A:0000 X:0000 Y:0000 P:envMxdIZc - Transfer A to Y.
$02/DF4C B9 AF F0 LDA $F0AF,y[$7E:F0AF] A:0000 X:0000 Y:0000 P:envMxdIZc - Load A from 7EF0AF.
$02/DF4F F0 04 BEQ $04    [$DF55] A:0000 X:0000 Y:0000 P:envMxdIZc - Branch if 00.
----------------------------------------------------

------------------------------------------------------
$02/DF55 7A PLY A:0000 X:0000 Y:0000 P:envMxdIZc - Pull Y from Stack
$02/DF56 A5 0F LDA $0F    [$00:000F] A:0000 X:0000 Y:0000 P:envMxdIZc - Load Status Byte 2 into A.
$02/DF58 29 20 AND #$20 A:0000 X:0000 Y:0000 P:envMxdIZc - Is it Paralyze?
$02/DF5A F0 0D BEQ $0D    [$DF69] A:0000 X:0000 Y:0000 P:envMxdIZc - If not, branch.
----------------------------------------------------
$02/DF5C E6 64 INC $64    [$00:0064] A:0020 X:0000 Y:0000 P:envMxdIzc - +1 to 64.
$02/DF5E A9 04 LDA #$04 A:0020 X:0000 Y:0000 P:envMxdIzc - Load Crouching/Paralysis Waves into A.
$02/DF60 9D D0 EF STA $EFD0,x[$7E:EFD0] A:0004 X:0000 Y:0000 P:envMxdIzc - Store A in Pose Byte.
$02/DF63 8D 78 F0 STA $F078  [$7E:F078] A:0004 X:0000 Y:0000 P:envMxdIzc - Store A in Special Status Graphic
$02/DF66 4C CD DF JMP $DFCD  [$02:DFCD] A:0004 X:0000 Y:0000 P:envMxdIzc - Ignore other Status Graphics.
-----------------------------------------------
$02/DF69 A5 0F LDA $0F    [$00:000F] A:0000 X:0000 Y:0000 P:envMxdIZc - Load Status Byte 2 into A.
$02/DF6B 29 10 AND #$10 A:0000 X:0000 Y:0000 P:envMxdIZc - Is it Sleep?
$02/DF6D F0 0E BEQ $0E    [$DF7D] A:0000 X:0000 Y:0000 P:envMxdIZc - Branch if not.
-----------------------------------
$02/DF6F E6 64 INC $64    [$00:0064] A:0010 X:0000 Y:0000 P:envMxdIzc - +1 to 64.
$02/DF71 A9 04 LDA #$04 A:0010 X:0000 Y:0000 P:envMxdIzc - Load Crouching into A.
$02/DF73 9D D0 EF STA $EFD0,x[$7E:EFD0] A:0004 X:0000 Y:0000 P:envMxdIzc - Store A in Pose Byte.
$02/DF76 1A INC A A:0004 X:0000 Y:0000 P:envMxdIzc - +1 to A (Sleep Bubble)
$02/DF77 8D 78 F0 STA $F078  [$7E:F078] A:0005 X:0000 Y:0000 P:envMxdIzc - Store A in Special Graphic Data.
$02/DF7A 4C CD DF JMP $DFCD  [$02:DFCD] A:0005 X:0000 Y:0000 P:envMxdIzc - Ignore Other Status (except now they're wasting bytes, since they can Branch to them since they're now in range)
------------------------------------
$02/DF7D A5 0F LDA $0F    [$00:000F] A:0000 X:0000 Y:0000 P:envMxdIZc- Load Status Byte 2.
$02/DF7F 29 08 AND #$08 A:0000 X:0000 Y:0000 P:envMxdIZc - Is it Charm?
$02/DF81 F0 0A BEQ $0A    [$DF8D] A:0000 X:0000 Y:0000 P:envMxdIZc - If not, branch.
--------------------------------
$02/DF83 E6 64 INC $64    [$00:0064] A:0008 X:0000 Y:0000 P:envMxdIzc - +1 to 64.
$02/DF85 A9 07 LDA #$07 A:0008 X:0000 Y:0000 P:envMxdIzc - Load Confusion Circles into A.
$02/DF87 8D 78 F0 STA $F078  [$7E:F078] A:0007 X:0000 Y:0000 P:envMxdIzc - Store A in Special Status Graphic.
$02/DF8A 4C CD DF JMP $DFCD  [$02:DFCD] A:0007 X:0000 Y:0000 P:envMxdIzc - Ignore Other Status (Copy and paste fellows, copy and paste...)
-----------------------------------
$02/DF8D A5 0F LDA $0F    [$00:000F] A:0000 X:0000 Y:0000 P:envMxdIZc - Load Status Byte 2.
$02/DF8F 29 40 AND #$40 A:0000 X:0000 Y:0000 P:envMxdIZc - Is it Float?
$02/DF91 F0 2B BEQ $2B    [$DFBE] A:0000 X:0000 Y:0000 P:envMxdIZc - Branch if not.
--------------------------------------------
02/DF93 AD 2D 35 LDA $352D  [$7E:352D] A:0040 X:0000 Y:0000 P:envMxdIzc - Load A from 7E352D into A.
$02/DF96 D0 26 BNE $26    [$DFBE] A:0000 X:0000 Y:0000 P:envMxdIZc -  - If not 00, branch.
$02/DF98 A5 64 LDA $64    [$00:0064] A:0000 X:0000 Y:0000 P:envMxdIZc - Load A from 64.
$02/DF9A D0 22 BNE $22    [$DFBE] A:0000 X:0000 Y:0000 P:envMxdIZc - If not 00, branch.
$02/DF9C DA PHX A:0000 X:0000 Y:0000 P:envMxdIZc - Push X onto Stack.
$02/DF9D A9 04 LDA #$04 A:0000 X:0000 Y:0000 P:envMxdIZc - Load 04 into A. (Velocity of the bouncing with Float)
$02/DF9F 85 1E STA $1E    [$00:001E] A:0004 X:0000 Y:0000 P:envMxdIzc - Store A in 1E.
$02/DFA1 A5 47 LDA $47    [$00:0047] A:0004 X:0000 Y:0000 P:envMxdIzc - Load A from 47.
$02/DFA3 0A ASL A A:0000 X:0000 Y:0000 P:envMxdIZc - x2 A
$02/DFA4 0A ASL A A:0000 X:0000 Y:0000 P:envMxdIZc - x2 A
$02/DFA5 18 CLC A:0000 X:0000 Y:0000 P:envMxdIZc - Clear Carry.
$02/DFA6 6D 13 18 ADC $1813  [$7E:1813] A:0000 X:0000 Y:0000 P:envMxdIZc - Add... something from some out of battle area?
$02/DFA9 0A ASL A A:0062 X:0000 Y:0000 P:envMxdIzc - x6 A.
$02/DFAA 0A ASL A A:00C4 X:0000 Y:0000 P:eNvMxdIzc
$02/DFAB 0A ASL A A:0088 X:0000 Y:0000 P:eNvMxdIzC
$02/DFAC 20 15 E0 JSR $E015  [$02:E015] A:0010 X:0000 Y:0000 P:envMxdIzC - Jump to Subroutine (???)
$02/DFAF FA PLX A:0000 X:0010 Y:0000 P:envMxdIZc - Pull X from Stack.
$02/DFB0 18 CLC A:0000 X:0000 Y:0000 P:envMxdIZc - Clear Carry Flag.
$02/DFB1 69 F8 ADC #$F8 A:0000 X:0000 Y:0000 P:envMxdIZc - Add F8 (How elevated the character floating is from their starting point).
$02/DFB3 9D C8 EF STA $EFC8,x[$7E:EFC8] A:00F8 X:0000 Y:0000 P:eNvMxdIzc - Store A in Character Position?
$02/DFB6 A9 06 LDA #$06 A:00F8 X:0000 Y:0000 P:eNvMxdIzc - Load Floating Shadow into A.
$02/DFB8 8D 78 F0 STA $F078  [$7E:F078] A:0006 X:0000 Y:0000 P:envMxdIzc - Store A in Special Status Graphic.
$02/DFBB 4C CD DF JMP $DFCD  [$02:DFCD] A:0006 X:0000 Y:0000 P:envMxdIzc - Ignore other Status.
---------------------------------------------
$02/DFBE A5 11 LDA $11    [$00:0011] A:0000 X:0000 Y:0000 P:envMxdIZc - Load Status Byte 4 into A.
$02/DFC0 29 01 AND #$01 A:0000 X:0000 Y:0000 P:envMxdIZc - Is it Critical?
$02/DFC2 F0 09 BEQ $09    [$DFCD] A:0000 X:0000 Y:0000 P:envMxdIZc - If not, branch.
-------------------------------------------
$02/DFC4 A9 04 LDA #$04 A:0001 X:0000 Y:0000 P:envMxdIzc - Load Crouching into A.
$02/DFC6 9D D0 EF STA $EFD0,x[$7E:EFD0] A:0004 X:0000 Y:0000 P:envMxdIzc - Store A in Pose Byte.
$02/DFC9 3A DEC A A:0004 X:0000 Y:0000 P:envMxdIzc - -1 from A (Critical Sweat)
$02/DFCA 8D 78 F0 STA $F078  [$7E:F078] A:0003 X:0000 Y:0000 P:envMxdIzc - Store A in Special Status Graphic
-------------------------------------------
$02/DFCD A5 0F LDA $0F    [$00:000F] A:0000 X:0000 Y:0000 P:envMxdIZc - Load Status Byte 2 into A.
$02/DFCF 29 08 AND #$08 A:0000 X:0000 Y:0000 P:envMxdIZc - Is it Charm? (Hmm? But that's above?)
$02/DFD1 F0 05 BEQ $05    [$DFD8] A:0000 X:0000 Y:0000 P:envMxdIZc - Branch if not.
------------------------------------------
02/DFD3 20 D7 DB JSR $DBD7  [$02:DBD7] A:0008 X:0000 Y:0000 P:envMxdIzc - Jump to Subroutine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~````
$02/DBD7 DA PHX A:0008 X:0000 Y:0000 P:envMxdIzc - Push X onto Stack.
$02/DBD8 A5 47 LDA $47    [$00:0047] A:0008 X:0000 Y:0000 P:envMxdIzc - Load A from 47.
$02/DBDA AA TAX A:0000 X:0000 Y:0000 P:envMxdIZc - Transfer A to X.
$02/DBDB BD BC F2 LDA $F2BC,x[$7E:F2BC] A:0000 X:0000 Y:0000 P:envMxdIZc - Load A from 7EF2BC
$02/DBDE D0 05 BNE $05    [$DBE5] A:0000 X:0000 Y:0000 P:envMxdIZc - Branch if not 00.
$02/DBE0 BD AF F0 LDA $F0AF,x[$7E:F0AF] A:0000 X:0000 Y:0000 P:envMxdIZc - Load A from F0AF
$02/DBE3 F0 02 BEQ $02    [$DBE7] A:0000 X:0000 Y:0000 P:envMxdIZc - Branch if 00.
-------------------

---------------------
$02/DBE7 FA PLX A:0000 X:0000 Y:0000 P:envMxdIZc - Pull X.
$02/DBE8 BD CE EF LDA $EFCE,x[$7E:EFCE] A:0000 X:0000 Y:0000 P:envMxdIZc - Load A from 7EEFCE.
$02/DBEB 29 0F AND #$0F A:0001 X:0000 Y:0000 P:envMxdIzc - Get rid of Bits.
$02/DBED 9D CE EF STA $EFCE,x[$7E:EFCE] A:0001 X:0000 Y:0000 P:envMxdIzc - Store A in 7EEFCE.
$02/DBF0 BD C5 EF LDA $EFC5,x[$7E:EFC5] A:0001 X:0000 Y:0000 P:envMxdIzc - Load A from 7EEFC5.
$02/DBF3 C9 B0 CMP #$B0 A:00B0 X:0000 Y:0000 P:eNvMxdIzc - It is B0? (When set to other values will be closer or further away when they move to join the enemy)
$02/DBF5 F0 4F BEQ $4F    [$DC46] A:00B0 X:0000 Y:0000 P:envMxdIZC - Branch if so.
---------------------

------------------------
$02/DC46 BD CE EF LDA $EFCE,x[$7E:EFCE] A:00B0 X:0000 Y:0000 P:envMxdIZC - Load A from 7EEFCE
$02/DC49 09 01 ORA #$01 A:0001 X:0000 Y:0000 P:envMxdIzC - Get rid of Bits. (When set to 02 Character will face enemies)
$02/DC4B 9D CE EF STA $EFCE,x[$7E:EFCE] A:0001 X:0000 Y:0000 P:envMxdIzC - Store A in 7EEFCE
$02/DC4E 60 RTS A:0001 X:0000 Y:0000 P:envMxdIzC - Return
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$02/DFD6 80 03 BRA $03    [$DFDB] A:0001 X:0000 Y:0000 P:envMxdIzC - Branch to 3 bytes away.
------------------------------------------
$02/DFD8 20 4F DC JSR $DC4F  [$02:DC4F] A:0000 X:0000 Y:0000 P:envMxdIZc - Jump to Subroutine (???)

$01/EADB   A9 09   LDA #$09   A:0004   X:0000   Y:0000   P:envMxdIzc - Load Count Numbers above head into A.
$01/EADD   8D 78 F0   STA $F078  [$7E:F078]   A:0009   X:0000   Y:0000   P:envMxdIzc - Store A in Status Special Graphic Display.

Ah? New list to compile then...

00 - Nothing
01 - Mute
02 - Blind
03 - Critical
04 - Paralysis
05 - Sleeping
06 - Floating (I think, shadow shows on the floor)
07 - Confusion
08 - Curse
09 - Count

And that's it... hmm, a little disappointing, but at least that's there now.


Alright, now there's a bit from a basic hackers standpoint here that could easily be utilized if they wanted to change some things, most importantly for someone delving into new statuses (myself) would be some graphical representation. While I can't use any of the Special Status Graphics, I can manipulate the way Poison's works to create status ailments which changes the characters palette (could even throw in an exception to add Berserk to it all.

But here is the easily manipulable info...


KO'd
$02/DEB6   A9 09   LDA #$09   A:0080   X:0000   Y:0000   P:envMxdIzC - Load Swoon into A
$02/DEB8   9D D0 EF   STA $EFD0,x[$7E:EFD0]   A:0009   X:0000   Y:0000   P:envMxdIzC - Store A in Pose Byte.


Poison
$02/DAE7   A9 7D F6   LDA #$F67D   A:0120   X:0120   Y:0000   P:envmxdIzc - Load Changed Skin Palette into A..
$02/DAEA   9D 56 ED   STA $ED56,x[$7E:EE76]   A:F67D   X:0120   Y:0000   P:eNvmxdIzc - Store A in ?Palette Area?
$02/DAED   A9 30 7D   LDA #$7D30   A:F67D   X:0120   Y:0000   P:eNvmxdIzc - Load 2nd Changed Skin Palette into A.
$02/DAF0   9D 58 ED   STA $ED58,x[$7E:EE78]   A:7D30   X:0120   Y:0000   P:envmxdIzc - Store A in ?Palette Area?
$02/DEE2   A9 04   LDA #$04   A:0000   X:0000   Y:0000   P:envMxdIZc - Load !Pose! into A. (Finally! Poison should not be enough to kneel!)
$02/DEE4   9D D0 EF   STA $EFD0,x[$7E:EFD0]   A:0004   X:0000   Y:0000   P:envMxdIzc - Store A in (what must be the poses area)

Count
$01/EAD6   A9 04   LDA #$04   A:0070   X:0000   Y:0000   P:envMxdIZc - Load Crouching into A.
$01/EAD8   9D D0 EF   STA $EFD0,x[$7E:EFD0]   A:0004   X:0000   Y:0000   P:envMxdIzc - Store A in Pose Byte.

Magnetized
$02/DF05   A9 04   LDA #$04   A:0080   X:0000   Y:0000   P:eNvMxdIzc - Load Crouching into A.
$02/DF07   9D D0 EF   STA $EFD0,x[$7E:EFD0]   A:0004   X:0000   Y:0000   P:envMxdIzc - Store A in Pose Byte.

Mute
$02/DF16   A9 04   LDA #$04   A:0004   X:0000   Y:0000   P:envMxdIzc - Load Crouching into A.
$02/DF18   9D D0 EF   STA $EFD0,x[$7E:EFD0]   A:0004   X:0000   Y:0000   P:envMxdIzc - Store A in Pose Byte. 
« Last Edit: April 30, 2015, 11:34:46 PM by Grimoire LD »

chillyfeez

  • FF4 Hacker
  • *
  • Posts: 1,285
  • Gender: Male
  • Go ahead, ask me about Angel Feathers!
    • View Profile
Re: Grimoire LD's Notes, Patches, and Hacks (A Working Job System!)
« Reply #470 on: April 30, 2015, 09:43:48 PM »
Quote
If I can ever grasp what Chillyfeez did with changing Summon Monsters, I would even plan on changing Imp, Bomb, Roc, and Mage summons for something else to mix it up.  Ideally I would also like to turn Asura into different summons, but that would involve finding out what causes her summon formation to cycle through her masks in the first place, which sounds like a lot of work.

Lemme know if I can help you understand it. It's mind-bendingly complicated at first, but once you get a grasp of it it's not so bad.

Regarding Asura's changing, it's essentially the same principle used by sylph, Odin, bahamut, any summoned monster that changes its image during the summon. She has three different sprite arrangements, and the AV routine controls the rotation between them.

Grimoire LD

  • FF4 Hacker
  • *
  • Posts: 1,684
    • View Profile
Re: Grimoire LD's Notes, Patches, and Hacks (A Working Job System!)
« Reply #471 on: May 01, 2015, 11:44:37 AM »
Quote
If I can ever grasp what Chillyfeez did with changing Summon Monsters, I would even plan on changing Imp, Bomb, Roc, and Mage summons for something else to mix it up.  Ideally I would also like to turn Asura into different summons, but that would involve finding out what causes her summon formation to cycle through her masks in the first place, which sounds like a lot of work.

Lemme know if I can help you understand it. It's mind-bendingly complicated at first, but once you get a grasp of it it's not so bad.

Regarding Asura's changing, it's essentially the same principle used by sylph, Odin, bahamut, any summoned monster that changes its image during the summon. She has three different sprite arrangements, and the AV routine controls the rotation between them.

If I could have six new summons (2 for replacing Asura, 4 for the original monster summons) I would be quite happy! I'm just surprised the matter is so complicated. Her AV routine you say? Well I can test something out on that...

No, her face continues to shift even if its not her proper Effect, I thought if maybe I switched the effect to one that didn't alter sprite like any of the four monsters it would not change the mask. I was wrong. How peculiar... but you must know something about this, since Summons seem tied to their hex byte, I've had no luck locating its location though.

In any event I would love to ask for you help on this eventually, but I should probably wait until it becomes pertinent. So far there's more important things to iron out...

Well I've made good on my newest information, I now have the means to create unique glows, (I use the term "glow loosely, it's more a changing of a character's outer palette which gives it  a glow-like effect) through the status graphic info above, meaning that statuses like Protect/Shell/Ruse/Elemental Shield/Lock/Sharp/Dull/Temper/and Saber can all have their own unique glows! Here's a sample...

Now I should note the one side effect of this is that the character will no longer continually shine when their turn arrives. But seeing their Command Skillset and their name light up should be enough of an idea of whose turn it is.





What's neat about this is that with a handy tool I found by another person who was having trouble understanding the 2 byte colors...


https://gbatemp.net/threads/4-digit-hex-colours.339549/

You can set whatever outer palette (or inner palette) that you like!

Now if I can somehow apply this to enemies and I'll be golden...




chillyfeez

  • FF4 Hacker
  • *
  • Posts: 1,285
  • Gender: Male
  • Go ahead, ask me about Angel Feathers!
    • View Profile
Re: Grimoire LD's Notes, Patches, and Hacks (A Working Job System!)
« Reply #472 on: May 01, 2015, 12:27:26 PM »
Actually, you're right about Asura.

I think in my testing, I looked into other summons that change their sporting, and when I observed a few that all change in the same way, I assumed the pattern extended to all summons. Silly me, thinking that anything in this game actually made sense, right?

So... I guess I'll have to look into that one at some point.

Grimoire LD

  • FF4 Hacker
  • *
  • Posts: 1,684
    • View Profile
Re: Grimoire LD's Notes, Patches, and Hacks (A Working Job System!)
« Reply #473 on: May 14, 2015, 06:33:31 AM »
I better start doing some house cleaning for this thread... it's been far too long since I added many of my notes to the front of the topic and I haven't posted any of my Cecil Swap Hack yet because I wasn't sure if it was 100% working. At this point it appears to do so, so I will start with posting that...

I should note however this is Not one of my cleanest codes, there's a lot of redundant or older coding in here because it's so long and complex (for me) I was worried about messing up the branching points.

Cecil Swap Hack - Game Start Code

This section of the code is accessed when you start a new game.

Code: [Select]
$00/E65F 5C A0 E3 0D JMP $0DE3A0[$0D:E3A0] A:0600 X:0020 Y:0000 P:envMxdIzC - Jump to Custom Code
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``
$0D/E3A0 DA PHX A:0600 X:0020 Y:0000 P:envMxdIzC - Push X onto Stack
$0D/E3A1 A0 00 00 LDY #$0000 A:0600 X:0020 Y:0000 P:envMxdIzC - Load 0000 into Y.
$0D/E3A4 C2 20 REP #$20 A:0600 X:0020 Y:0000 P:envMxdIZC - Set A to 16 Bit.
$0D/E3A6 A9 00 00 LDA #$0000 A:0600 X:0020 Y:0000 P:envmxdIZC - Load 0000 into A.
$0D/E3A9 E2 20 SEP #$20 A:0000 X:0020 Y:0000 P:envmxdIZC - Set A to 8 Bit.
$0D/E3AB A2 00 00 LDX #$0000 A:0000 X:0020 Y:0000 P:envMxdIZC - Load 0000 into X. (These could all be condensed to setting A to 16 Bit, and transferring A to X and Y.)
~~~~~~~~~~~~~~~~~~~~~~~Looping Point~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$0D/E3AE BF 00 A9 0F LDA $0FA900,x[$0F:A900] A:0000 X:0000 Y:0000 P:envMxdIZC - Load Character 1's ROM Data into A.
$0D/E3B2 99 A0 14 STA $14A0,y[$00:14A0] A:0081 X:0000 Y:0000 P:eNvMxdIzC - Store A in Unused SRam.
$0D/E3B5 E8 INX A:0081 X:0000 Y:0000 P:eNvMxdIzC - +1 X
$0D/E3B6 C8 INY A:0081 X:0001 Y:0000 P:envMxdIzC - +1 Y
$0D/E3B7 C0 14 00 CPY #$0014 A:0081 X:0001 Y:0001 P:envMxdIzC - Is Y 14? (Has it transferred Actor, ID, Level, Status, HP, MP, and basic stats to Unused SRam?
$0D/E3BA D0 F2 BNE $F2    [$E3AE] A:0081 X:0001 Y:0001 P:eNvMxdIzc - If not, loop.
------------------------------------------------
$0D/E3BC A0 00 00 LDY #$0000 A:0003 X:0014 Y:0014 P:envMxdIZC - Load 0000 into Y.
~~~~~~~~~~~~~~~~~~~~~~~~~(Looping Point)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$0D/E3BF BF 00 A9 0F LDA $0FA900,x[$0F:A914] A:0003 X:0014 Y:0000 P:envMxdIZC - Load A from Character 1's ROM Data.
$0D/E3C3 99 CD 14 STA $14CD,y[$00:14CD] A:0002 X:0014 Y:0000 P:envMxdIzC  - Store A in (Critical Hil Chance/Damage/Unused Byte)
$0D/E3C6 E8 INX A:0002 X:0014 Y:0000 P:envMxdIzC - +1 X
$0D/E3C7 C8 INY A:0002 X:0015 Y:0000 P:envMxdIzC - +1 Y
$0D/E3C8 C0 03 00 CPY #$0003 A:0002 X:0015 Y:0001 P:envMxdIzC - Does Y = 0003?
$0D/E3CB D0 F2 BNE $F2    [$E3BF] A:0002 X:0015 Y:0001 P:eNvMxdIzc - If not, loop.
--------------------------------------------------
$0D/E3CD A0 00 00 LDY #$0000 A:000A X:0017 Y:0003 P:envMxdIZC - Load 0000 into Y.
~~~~~~~~~~~~~~~~~~~~~~~(Looping Point)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$0D/E3D0 BF 00 A9 0F LDA $0FA900,x[$0F:A917] A:000A X:0017 Y:0000 P:envMxdIZC - Load Character 1's Rom Data into A.
$0D/E3D4 99 D7 14 STA $14D7,y[$00:14D7] A:00B8 X:0017 Y:0000 P:eNvMxdIzC - Store A in Experience Sections.
$0D/E3D7 E8 INX A:00B8 X:0017 Y:0000 P:eNvMxdIzC - +1 X
$0D/E3D8 C8 INY A:00B8 X:0018 Y:0000 P:envMxdIzC - +1 Y
$0D/E3D9 C0 09 00 CPY #$0009 A:00B8 X:0018 Y:0001 P:envMxdIzC - Has it entered all data in Exp, Speed Modifier, Unknown, Exp to Level Up?
$0D/E3DC D0 F2 BNE $F2    [$E3D0] A:00B8 X:0018 Y:0001 P:eNvMxdIzc - If not, loop.
-----------------------------------------------
$0D/E3DE A0 00 00 LDY #$0000 A:0000 X:0020 Y:0009 P:envMxdIZC - Load 0000 into Y.
$0D/E3E1 A2 00 00 LDX #$0000 A:0000 X:0020 Y:0000 P:envMxdIZC - Load 0000 into X.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~(Looping Point)~~~~~~~~~~~~~~~~~~~~~
$0D/E3E4 BF 62 AB 0F LDA $0FAB62,x[$0F:AB62] A:0000 X:0000 Y:0000 P:envMxdIZC - Load A from Character 1's ROM Equipment.
$0D/E3E8 99 D0 14 STA $14D0,y[$00:14D0] A:0070 X:0000 Y:0000 P:envMxdIzC - Store A in (Helmet, Armor, Gauntlet, Right Hand/Quantity, Left Hand/Quantity)
$0D/E3EB E8 INX A:0070 X:0000 Y:0000 P:envMxdIzC - +1 X
$0D/E3EC C8 INY A:0070 X:0001 Y:0000 P:envMxdIzC - +1 Y.
$0D/E3ED C0 07 00 CPY #$0007 A:0070 X:0001 Y:0001 P:envMxdIzC - Has it stored all of those?
$0D/E3F0 D0 F2 BNE $F2    [$E3E4] A:0070 X:0001 Y:0001 P:eNvMxdIzc - If not, loop.
----------------------------------
$0D/E3F2 A2 00 00 LDX #$0000 A:0001 X:0007 Y:0007 P:envMxdIZC - Load 0000 into X.
$0D/E3F5 A0 00 00 LDY #$0000 A:0001 X:0000 Y:0007 P:envMxdIZC - Load 0000 into Y.
~~~~~~~~~~~~~~~~~~~~~~~~(Looping Point)~~~~~~~~~~~~~~~~~~~~~~~~~
$0D/E3F8 BF 00 E5 0D LDA $0DE500,x[$0D:E500] A:0001 X:0000 Y:0000 P:envMxdIZC - Load Custom Predetermined Character Statistic into A.
$0D/E3FC 99 B4 14 STA $14B4,y[$00:14B4] A:0012 X:0000 Y:0000 P:envMxdIzC - Store A in Modified Stats, Attack Dealings, Defense Dealing, Status Dealing, Etc)
$0D/E3FF E8 INX A:0012 X:0000 Y:0000 P:envMxdIzC - +1 X
$0D/E400 C8 INY A:0012 X:0001 Y:0000 P:envMxdIzC - +1 Y
$0D/E401 C0 16 00 CPY #$0016 A:0012 X:0001 Y:0001 P:envMxdIzC - Has it done this for all 16 bytes?
$0D/E404 D0 F2 BNE $F2    [$E3F8] A:0012 X:0001 Y:0001 P:eNvMxdIzc - If not, loop.
--------------------------------------------------
$0D/E406 FA PLX A:0018 X:0016 Y:0016 P:envMxdIZC - Pull X from Stack
$0D/E407 A0 00 00 LDY #$0000 A:0018 X:0020 Y:0016 P:envMxdIzC - Load 0000 into Y
$0D/E40A A9 00 LDA #$00 A:0018 X:0020 Y:0000 P:envMxdIZC - Load 00 into A.
$0D/E40C 5C 6E E6 00 JMP $00E66E[$00:E66E] A:0000 X:0020 Y:0000 P:envMxdIZC - Return to normal routines.

That's the first part... a simple process of storing the data as well as the pre-determined statistics which needed drawn from a source to make sure they matched with the actual stats upon return.

Cecil Swap Hack - Morph Command

This next part assumes that the Crash command was turned into the Morph Command. Here is the data on that...

Code: [Select]
$03/FF00 AD 9F 12 LDA $129F  [$7E:129F] A:0003 X:002A Y:0000 P:envMxdizc - Load Event Flag 248-255 into A.
$03/FF03 D0 09 BNE $09    [$FF0E] A:0080 X:002A Y:0000 P:eNvMxdizc - If not 00, branch.
------------------------------------------
$03/FF05 A9 07 LDA #$07 A:0000 X:002A Y:0000 P:envMxdiZc - Load Unused Message 07 into A. 
$03/FF07 8D CA 34 STA $34CA  [$7E:34CA] A:0007 X:002A Y:0000 P:envMxdizc - Store A in Message Section
$03/FF0A 4C A6 85 JMP $85A6  [$03:85A6] A:0007 X:002A Y:0000 P:envMxdizc - Jump to Message Routine (And out of custom routine.
--------------------------------------------
$03/FF0E A6 A6 LDX $A6    [$00:00A6] A:0080 X:002A Y:0000 P:eNvMxdizc - Load Character Slot into A.
$03/FF10 A9 15 LDA #$15 A:0080 X:0180 Y:0000 P:envMxdizc - Load 15 into A.
$03/FF12 8D 40 1C STA $1C40  [$7E:1C40] A:0015 X:0180 Y:0000 P:envMxdizc - Store A in Unused RAM (This is important, the game looks at this value once before changing it back to 00 to prevent a constant Morphing)
$03/FF15 BD 01 20 LDA $2001,x[$7E:2181] A:0015 X:0180 Y:0000 P:envMxdizc - Load Character Class into A.
$03/FF18 29 0F AND #$0F A:0009 X:0180 Y:0000 P:envMxdizc - Get rid of other bits.
$03/FF1A F0 0A BEQ $0A    [$FF26] A:0009 X:0180 Y:0000 P:envMxdizc - If Dark Knight, branch.
-----------------------------------
$03/FF1C A9 7F LDA #$7F A:0009 X:0180 Y:0000 P:envMxd - Load Disrupt Graphic into A.
$03/FF1E 8D C4 33 STA $33C4  [$7E:33C4] A:007F X:0180 Y:0000 P:envMxdizc - Store A in AV Effect.
$03/FF21 8D 8F 12 STA $128F  [$7E:128F] A:007F X:0180 Y:0000 P:envMxdizc - Store A in Event Flag 120-127. (This is how the game itself tells whether it is the Paladin or Dark Knight to display in conjunction with my Custom Event Flag Check Routine)
$03/FF24 80 08 BRA $08    [$FF2E] A:007F X:0180 Y:0000 P:envMxdizc - Branch Always.
--------------------------------
$03/FF26 A9 09 LDA #$09 A:0000 X:0180 Y:0000 P:envMxdiZc - Load Berserk Graphic into A.
$03/FF28 8D C4 33 STA $33C4  [$7E:33C4] A:0009 X:0180 Y:0000 P:envMxdizc - Store A in AV Effect.
$03/FF2B 8D 8F 12 STA $128F  [$7E:128F] A:0009 X:0180 Y:0000 P:envMxdizc - Store A in Event Flag 120-127. (How the game tells itself whether it is the Paladin or Dark Knight to display in conjunction with my Custom Event Flag Check Routine)
--------------------------------------------
$03/FF2E 60 RTS A:007F X:0180 Y:0000 P:envMxdizc - Return

The Actual Morph

This is spliced into the Status Check code and is checked after every action for every character. It also contains a jump to the 03 bank to get a couple of 03 bank capable JSR's.

Code: [Select]
$02/BFA4 5C 10 E4 0D JMP $0DE410[$0D:E410] A:0000 X:0000 Y:0000 P:envMxdiZc - Jump to Custom Code
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$0D/E410 86 FF STX $FF    [$00:00FF] A:0000 X:0000 Y:0000 P:envMxdiZc - Store Slot Identifier in FF (Crucial!!)
$0D/E412 BD 03 20 LDA $2003,x[$7E:2003] A:0000 X:0000 Y:0000 P:envMxdiZc - Load Character's Status Byte 1.
$0D/E415 29 08 AND #$08 A:0000 X:0000 Y:0000 P:envMxdiZc - Is it Pig?
$0D/E417 F0 04 BEQ $04    [$E41D] A:0000 X:0000 Y:0000 P:envMxdiZc - If not, branch.
-----------------------------------------------------------------------------------------
$0D/E419 5C AB BF 02 JMP $02BFAB[$02:BFAB] A:0000 X:0180 Y:000A P:envMxdizC - Jump to Pig Status Check and Application.
----------------------------------------------------------------------------------------------
$0D/E41D BD 51 20 LDA $2051,x[$7E:2051] A:0000 X:0000 Y:0000 P:envMxdiZc - Load Character's Action.
$0D/E420 C9 15 CMP #$15 A:001B X:0000 Y:0000 P:envMxdizc - Is it Morph?
$0D/E422 F0 04 BEQ $04    [$E428] A:001B X:0000 Y:0000 P:envMxdizC - If so, branch.
-------------------------------------------------------------------------------------------------------
$0D/E424 5C B6 BF 02 JMP $02BFB6[$02:BFB6] A:001B X:0000 Y:0000 P:envMxdizC - Jump back to normal Status Routine.
-------------------------------------------------------------------------------------------------
$0D/E428 AD 40 1C LDA $1C40  [$7E:1C40] A:0015 X:0180 Y:0003 P:envMxdiZC - Load A from Unused RAM.
$0D/E42B C9 15 CMP #$15 A:0015 X:0180 Y:0003 P:envMxdizC - Is it 15?
$0D/E42D D0 F5 BNE $F5    [$E424] A:0015 X:0180 Y:0003 P:envMxdiZC - If not, 15. Branch to the Jump to the Normal Status Routine (This is used to make sure that Cecil is not constantly morphing as this value is 00'd out at the end of this routine.)
$0D/E42F BD 01 20 LDA $2001,x[$7E:2181] A:0015 X:0180 Y:0003 P:envMxdiZC - Load A from Character's Class.
$0D/E432 29 0F AND #$0F A:0009 X:0180 Y:0003 P:envMxdizC - Get rid of Bits.
$0D/E434 D0 04 BNE $04    [$E43A] A:0009 X:0180 Y:0003 P:envMxdizC - Branch if not Dark Knight Cecil.
---------------------------------------------------------------------------------------------------------
$0D/E436 A9 09 LDA #$09 A:0000 X:0180 Y:0003 P:envMxdiZC - Load Paladin into A.
$0D/E438 80 02 BRA $02    [$E43C] A:0009 X:0180 Y:0003 P:envMxdizC - Branch.
--------------------------------------------------------------------------------------------------------------
$0D/E43A A9 00 LDA #$00 A:0009 X:0180 Y:0003 P:envMxdizC - Load Dark Knight into A.
$0D/E43C 9D 01 20 STA $2001,x[$7E:2181] A:0000 X:0180 Y:0003 P:envMxdiZC - Store A in Class (Paladin Cecil is now Dark Knight Cecil.)
$0D/E43F 99 35 F2 STA $F235,y[$7E:F238] A:0000 X:0180 Y:0003 P:envMxdiZC - Store A in Sprite.
$0D/E442 99 A3 F0 STA $F0A3,y[$7E:F0A6] A:0000 X:0180 Y:0003 P:envMxdiZC - Store A in Palette.
$0D/E445 BD 01 20 LDA $2001,x[$7E:2181] A:0000 X:0180 Y:0003 P:envMxdiZC - Load Character's Class into A.
$0D/E448 DA PHX A:0000 X:0180 Y:0003 P:envMxdiZC - Push X onto Stack.
$0D/E449 F0 22 BEQ $22    [$E46D] A:0000 X:0180 Y:0003 P:envMxdiZC - Branch if Dark Knight Cecil.
----------------------------------------------------------------------------------------------------------------------------
$0D/E44B 22 70 FF 03 JSL $03FF70[$03:FF70] A:0009 X:0180 Y:0003 P:envMxdizC - (See Below)
-----------------------------------------------------------------(Looping Point)-----------------------------------------
$0D/E44F BD 03 33 LDA $3303,x[$7E:3357] A:0054 X:0054 Y:0000 P:envMxdizC - Load Character's Commands.
 $0D/E452 C9 15 CMP #$15 A:0000 X:0054 Y:0000 P:envMxdiZC - Is it Morph?
$0D/E454 F0 06 BEQ $06    [$E45C] A:0000 X:0054 Y:0000 P:eNvMxdizc - If so, branch.
------------------------------------------------------------------------------------
$0D/E456 E8 INX A:0000 X:0054 Y:0000 P:eNvMxdizc +4 to X (To reach next command)
$0D/E457 E8 INX A:0000 X:0055 Y:0000 P:envMxdizc
$0D/E458 E8 INX A:0000 X:0056 Y:0000 P:envMxdizc
$0D/E459 E8 INX A:0000 X:0057 Y:0000 P:envMxdizc
$0D/E45A 80 F3 BRA $F3    [$E44F] A:0000 X:0058 Y:0000 P:envMxdizc - Loop back.
------------------------------------------------------------------------------------------
$0D/E45C A9 0D LDA #$0D A:0015 X:0060 Y:0000 P:envMxdiZC - Load Focus into A.
$0D/E45E 9D FF 32 STA $32FF,x[$7E:335F] A:000D X:0060 Y:0000 P:envMxdizC - Store A in Command Slot.
$0D/E461 A9 50 LDA #$50 A:000D X:0060 Y:0000 P:envMxdizC - Load Targeting into A.
$0D/E463 9D FE 32 STA $32FE,x[$7E:335E] A:0050 X:0060 Y:0000 P:envMxdizC - Store Targeting in Focus Targeting.
$0D/E466 A9 0E LDA #$0E A:0050 X:0060 Y:0000 P:envMxdizC - Load Kick into A.
$0D/E468 9D FB 32 STA $32FB,x[$7E:335B] A:000E X:0060 Y:0000 P:envMxdizC - Store A in Command Slot. (Kick and Recall have the same targeting so no need to switch those)
-------------------------------------------------------------------------------------------------------------------------------
$0D/E46D 22 70 FF 03 JSL $03FF70[$03:FF70] A:0000 X:0180 Y:0003 P:envMxdiZC - Jump to Custom Subroutine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$03/FF70 C2 20 REP #$20 A:0000 X:0180 Y:0003 P:envMxdiZC - Set A to 16 Bit.
$03/FF72 A5 FF LDA $FF    [$00:00FF] A:0000 X:0180 Y:0003 P:envmxdiZC - Load A from Stored FF (Slot Identifier)
$03/FF74 4A LSR A A:0180 X:0180 Y:0003 P:envmxdizC Chop the Slot down to its most basic form.
$03/FF75 4A LSR A A:00C0 X:0180 Y:0003 P:envmxdizc
$03/FF76 4A LSR A A:0060 X:0180 Y:0003 P:envmxdizc
$03/FF77 4A LSR A A:0030 X:0180 Y:0003 P:envmxdizc
$03/FF78 4A LSR A A:0018 X:0180 Y:0003 P:envmxdizc
$03/FF79 4A LSR A A:000C X:0180 Y:0003 P:envmxdizc
$03/FF7A 4A LSR A A:0006 X:0180 Y:0003 P:envmxdizc
$03/FF7B A8 TAY A:0003 X:0180 Y:0003 P:envmxdizc - Transfer A to Y.
$03/FF7C E2 20 SEP #$20 A:0003 X:0180 Y:0003 P:envmxdizc - Set A back to 8 Bit.
$03/FF7E A9 00 LDA #$00 A:0003 X:0180 Y:0003 P:envMxdizc - Load 00 into A.
----------------------------------(Looping Point)-----------------------------------------------
$03/FF80 C0 00 00 CPY #$0000 A:0000 X:0180 Y:0003 P:envMxdiZc - Is Y 00?
$03/FF83 F0 05 BEQ $05    [$FF8A] A:0000 X:0180 Y:0003 P:envMxdizC - Branch if so.
-------------------------------------------------------------
$03/FF85 69 1B ADC #$1B A:0000 X:0180 Y:0003 P:envMxdizC - Add 1B to A.
$03/FF87 88 DEY A:001C X:0180 Y:0003 P:envMxdizc - -1 to Y.
$03/FF88 80 F6 BRA $F6    [$FF80] A:001C X:0180 Y:0002 P:envMxdizc - Loop back.
---------------------------------------------------------
$03/FF8A AA TAX A:0054 X:0180 Y:0000 P:envMxdiZC - Transfer A to X.
$03/FF8B 6B RTL A:0054 X:0054 Y:0000 P:envMxdizC - Return from Subroutine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(What this is doing is setting X to reach Commands based on Slot Index. It's a possibility now that I actually look at it that it may have been able to do this just by transferring Y to A, but I didn't understand that for some reason.)
-------------------------------(Looping Point)-------------------------------------------------------------
$0D/E471 BD 03 33 LDA $3303,x[$7E:3357] A:0054 X:0054 Y:0000 P:envMxdizC - Load Slot Command into A.
$0D/E474 C9 15 CMP #$15 A:0000 X:0054 Y:0000 P:envMxdiZC - Is it Morph?
$0D/E476 F0 06 BEQ $06    [$E47E] A:0000 X:0054 Y:0000 P:eNvMxdizc - If so, branch.
------------------------------------------------------------------------------------------
$0D/E478 E8 INX A:0000 X:0054 Y:0000 P:eNvMxdizc - +4 X (to reach next command)
$0D/E479 E8 INX A:0000 X:0055 Y:0000 P:envMxdizc
$0D/E47A E8 INX A:0000 X:0056 Y:0000 P:envMxdizc
$0D/E47B E8 INX A:0000 X:0057 Y:0000 P:envMxdizc
$0D/E47C 80 F3 BRA $F3    [$E471] A:0000 X:0058 Y:0000 P:envMxdizc - Loop back.
------------------------------------------------------------------------------------------
$0D/E47E A9 05 LDA #$05 A:0015 X:0060 Y:0000 P:envMxdiZC - Load Dark Wave into A.
$0D/E480 9D FF 32 STA $32FF,x[$7E:335F] A:0005 X:0060 Y:0000 P:envMxdizC - Store A in Slot.
$0D/E483 A9 60 LDA #$60 A:0005 X:0060 Y:0000 P:envMxdizC - Load Targeting into A.
$0D/E485 9D FE 32 STA $32FE,x[$7E:335E] A:0060 X:0060 Y:0000 P:envMxdizC - Store A in Dark Wave Command Slot Targeting.
$0D/E488 9D FA 32 STA $32FA,x[$7E:335A] A:0060 X:0060 Y:0000 P:envMxdizC - Store A in Recall Command Slot Targeting.
$0D/E48B A9 07 LDA #$07 A:0060 X:0060 Y:0000 P:envMxdizC - Load Recall into A.
$0D/E48D 9D FB 32 STA $32FB,x[$7E:335B] A:0007 X:0060 Y:0000 P:envMxdizC - Store A in Recall Command Slot
$0D/E490 22 E3 FE 03 JSL $03FEE3[$03:FEE3] A:0007 X:0060 Y:0000 P:envMxdizC - Jump to Custom Subroutine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$03/FEE3 A5 CD LDA $CD    [$00:00CD] A:0007 X:0060 Y:0000 P:envMxdizC
$03/FEE5 85 00 STA $00    [$00:0000] A:0003 X:0060 Y:0000 P:envMxdizC
$03/FEE7 A9 09 LDA #$09 A:0003 X:0060 Y:0000 P:envMxdizC
$03/FEE9 20 85 80 JSR $8085  [$03:8085] A:0009 X:0060 Y:0000 P:envMxdizC - (All Important parts of refreshing the Command List)
$03/FEEC 6B RTL A:0005 X:7504 Y:000A P:envMxdiZC - Return
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$0D/E494 5A PHY A:0005 X:7504 Y:000A P:envMxdiZC - Push Y onto Stack.
$0D/E495 A0 00 00 LDY #$0000 A:0005 X:7504 Y:000A P:envMxdiZC - Load 0000 into Y.
$0D/E498 EA NOP A:0005 X:7504 Y:0000 P:envMxdiZC - (Old code remnant).
$0D/E499 EA NOP A:0005 X:7504 Y:0000 P:envMxdiZC
--------------------------------(Looping Point)-----------------------------------------------
$0D/E49A B9 80 26 LDA $2680,y[$7E:2680] A:0005 X:7504 Y:0000 P:envMxdiZC - Load Mirror of Character into A.
$0D/E49D 99 00 1C STA $1C00,y[$7E:1C00] A:008A X:7504 Y:0000 P:eNvMxdizC - Store A in Unused RAM.
$0D/E4A0 E8 INX A:008A X:7504 Y:0000 P:eNvMxdizC - +1 X
$0D/E4A1 C8 INY A:008A X:7505 Y:0000 P:envMxdizC - +1 Y
$0D/E4A2 C0 40 00 CPY #$0040 A:008A X:7505 Y:0001 P:envMxdizC - Do this for the entire character's main data.
$0D/E4A5 D0 F3 BNE $F3    [$E49A] A:008A X:7505 Y:0001 P:eNvMxdizc - Loop if not done so.
---------------------------------------------------------------------------------
$0D/E4AA A6 FF LDX $FF    [$00:00FF] A:0000 X:7544 Y:0000 P:envMxdiZC - Load X from FF (Slot)
---------------------------------------------------------------(Looping Point)------------------------------------------------
$0D/E4AC B9 A0 14 LDA $14A0,y[$7E:14A0] A:0000 X:0180 Y:0000 P:envMxdizC - Load Unused SRam into A.
$0D/E4AF 9D 00 20 STA $2000,x[$7E:2180] A:0081 X:0180 Y:0000 P:eNvMxdizC - Store A in Character's Slot.
$0D/E4B2 E8 INX A:0081 X:0180 Y:0000 P:eNvMxdizC - +1 X
$0D/E4B3 C8 INY A:0081 X:0181 Y:0000 P:envMxdizC - +1 Y
$0D/E4B4 C0 40 00 CPY #$0040 A:0081 X:0181 Y:0001 P:envMxdizC - Do this for the entire character's main data.
$0D/E4B7 D0 F3 BNE $F3    [$E4AC] A:0081 X:0181 Y:0001 P:eNvMxdizc - Loop if not done so.
---------------------------------------------------------------------------------
$0D/E4B9 A0 00 00 LDY #$0000 A:0000 X:01C0 Y:0040 P:envMxdiZC - Load 0000 into Y.
$0D/E4BC EA NOP A:0000 X:01C0 Y:0000 P:envMxdiZC - Remnants.
$0D/E4BD EA NOP A:0000 X:01C0 Y:0000 P:envMxdiZC
---------------------------------------------(Looping Point)--------------------------------------------------------
$0D/E4BE B9 00 1C LDA $1C00,y[$7E:1C00] A:0000 X:01C0 Y:0000 P:envMxdiZC - Load A from Unused RAM.
$0D/E4C1 99 A0 14 STA $14A0,y[$7E:14A0] A:008A X:01C0 Y:0000 P:eNvMxdizC - Store A in Unused SRAM.
$0D/E4C4 E8 INX A:008A X:01C0 Y:0000 P:eNvMxdizC - +1 X
$0D/E4C5 C8 INY A:008A X:01C1 Y:0000 P:envMxdizC - +1 Y
$0D/E4C6 C0 40 00 CPY #$0040 A:008A X:01C1 Y:0001 P:envMxdizC - Do this for the entire character's main data.
$0D/E4C9 D0 F3 BNE $F3    [$E4BE] A:008A X:01C1 Y:0001 P:eNvMxdizc - Loop if not done so.
-----------------------------------------------------------------
$0D/E4CD BD 33 20 LDA $2033,x[$7E:21B3] A:0000 X:0180 Y:0040 P:envMxdizC - Load New Character's Right Hand Item into A.
$0D/E4D0 48 PHA A:0018 X:0180 Y:0040 P:envMxdizC - Push A,
$0D/E4D1 BD 35 20 LDA $2035,x[$7E:21B5] A:0018 X:0180 Y:0040 P:envMxdizC - Load New Character's Left Hand Item into A.
$0D/E4D4 48 PHA A:0063 X:0180 Y:0040 P:envMxdizC - Push A.
$0D/E4D5 8A TXA A:0063 X:0180 Y:0040 P:envMxdizC - Transfer X to A. (Remnant basically)
$0D/E4D6 22 90 FF 03 JSL $03FF90[$03:FF90] A:0080 X:0180 Y:0040 P:eNvMxdizC - Jump to Subroutine.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
$03/FF90 C2 20 REP #$20 A:0080 X:0180 Y:0040 P:eNvMxdizC - Set A to 16 Bit.
$03/FF92 A5 FF LDA $FF    [$00:00FF] A:0080 X:0180 Y:0040 P:eNvmxdizC - Load Slot into A.
$03/FF94 4A LSR A A:0180 X:0180 Y:0040 P:envmxdizC - /by many to reach base Slot.
$03/FF95 4A LSR A A:00C0 X:0180 Y:0040 P:envmxdizc
$03/FF96 4A LSR A A:0060 X:0180 Y:0040 P:envmxdizc
$03/FF97 4A LSR A A:0030 X:0180 Y:0040 P:envmxdizc
$03/FF98 4A LSR A A:0018 X:0180 Y:0040 P:envmxdizc
$03/FF99 4A LSR A A:000C X:0180 Y:0040 P:envmxdizc
$03/FF9A 4A LSR A A:0006 X:0180 Y:0040 P:envmxdizc
$03/FF9B A8 TAY A:0003 X:0180 Y:0040 P:envmxdizc - Transfer A to Y.
$03/FF9C E2 20 SEP #$20 A:0003 X:0180 Y:0003 P:envmxdizc - Set A back to 8 Bit.
$03/FF9E A9 00 LDA #$00 A:0003 X:0180 Y:0003 P:envMxdizc - Load 00 into A.
-------------------------------------(Looping Point)-----------------------------------------------
$03/FFA0 C0 00 00 CPY #$0000 A:0000 X:0180 Y:0003 P:envMxdiZc - Is Y 0000?
$03/FFA3 F0 05 BEQ $05    [$FFAA] A:0000 X:0180 Y:0003 P:envMxdizC - If so, branch.
----------------------------------------------------------------------------
$03/FFA5 69 07 ADC #$07 A:0000 X:0180 Y:0003 P:envMxdizC - Add 07 onto A (reaches next slot's equipment specifications)
$03/FFA7 88 DEY A:0008 X:0180 Y:0003 P:envMxdizc - -1 to Y.
$03/FFA8 80 F6 BRA $F6    [$FFA0] A:0008 X:0180 Y:0002 P:envMxdizc Loop back.
--------------------------------------------------------------------------
$03/FFAA AA TAX A:0018 X:0180 Y:0000 P:envMxdiZC - Transfer A to X.
$03/FFAB 6B RTL A:0018 X:0018 Y:0000 P:envMxdizC - Return.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~```
$0D/E4DA AA TAX A:0018 X:0018 Y:0000 P:envMxdizC - Transfer A to X (Remnant)
$0D/E4DB 68 PLA A:0018 X:0018 Y:0000 P:envMxdizC - Pull Item 1 from Stack
$0D/E4DC 9D DF 32 STA $32DF,x[$7E:32F7] A:0063 X:0018 Y:0000 P:envMxdizC - Store A in Right Hand.
$0D/E4DF 68 PLA A:0063 X:0018 Y:0000 P:envMxdizC - Pull Item 2 from Stack.
$0D/E4E0 9D DB 32 STA $32DB,x[$7E:32F3] A:0018 X:0018 Y:0000 P:envMxdizC - Store A in Left Hand.
$0D/E4E3 A6 FF LDX $FF    [$00:00FF] A:0018 X:0018 Y:0000 P:envMxdizC - Load Slot into X.
$0D/E4E5 A9 00 LDA #$00 A:0018 X:0180 Y:0000 P:envMxdizC - Load 00 into A.
$0D/E4E7 8D 40 1C STA $1C40  [$7E:1C40] A:0000 X:0180 Y:0000 P:envMxdiZC - Store A in Morph Designator.
$0D/E4EA 7A PLY A:0000 X:0180 Y:0000 P:envMxdiZC - Pull Y.
$0D/E4EB FA PLX A:0000 X:0180 Y:000A P:envMxdizC - Pull X.
$0D/E4EC 5C BD BF 02 JMP $02BFBD[$02:BFBD] A:0000 X:0180 Y:000A P:envMxdizC - Jump back to Status Check Routines.

And there it is! The code laid bare, it was immensely complicated and I still won't be surprised if I missed some crucial component to basic usability, but only time will tell. As this hack was quite enormous, there's a bit of remnant code from older plans which didn't pan out but also because this code is so large (especially eating up the vast majority of the unused SRAM) I can't see myself ever implementing it into any of my own hacks which tries to use space more guardedly.

Here are a couple of pictures. Though it's not a very flashy setup.

















« Last Edit: May 15, 2015, 09:26:12 AM by Grimoire LD »

Bahamut ZERO

  • Cagnazzo
  • *
  • Posts: 347
  • Gender: Male
  • If ye're takin a beatin, hop in de back row!
    • View Profile
Stumbled across something awesome related to Morph while playing around with actor add/removal that I felt I should share.  Bear in mind I'm using Chillyfeez's Shadow Mod, so this may not be as useful for those who aren't using it, but regardless I'm posting this in case it will work without it when it's released.

Basically, i accidently managed to swap the data for the Duplicate Dark Knight with the Actor 1 Dark Knight through eventing, and here's how I managed it!   


1: Morph into Dark Knight Cecil during a fight.
2.Trigger an a event with the following commands in it:

Add Dark Knight Cecil to the Party
Remove Paladin Cecil from the Party

Add Paladin Cecil to the Party
Remove Dark Knight Cecil


This will not work if you're in Paladin Form. You MUST be in Dark Knight form for this to work. When Paladin Cecil is re-added to the party, he will be in a different spot in the party than before the event actions took place (the spot the added Dark Knight would be). Now your Dark Knight form will be the one you started the game with, which means he'll have all the gear/experience he had when he left if you happen to also use the Shadow Mod, or he'll have his initial lv/gear if you don't use Shadow Mod.

Like I said it's not a very useful trick to do without Shadow Mod, but it's like a dream come true if you do.





I update my graphics thread on almost a daily basis, so keep an eye out for new stuff!

Grimoire LD

  • FF4 Hacker
  • *
  • Posts: 1,684
    • View Profile
Stumbled across something awesome related to Morph while playing around with actor add/removal that I felt I should share.  Bear in mind I'm using Chillyfeez's Shadow Mod, so this may not be as useful for those who aren't using it, but regardless I'm posting this in case it will work without it when it's released.

Basically, i accidently managed to swap the data for the Duplicate Dark Knight with the Actor 1 Dark Knight through eventing, and here's how I managed it!   


1: Morph into Dark Knight Cecil during a fight.
2.Trigger an a event with the following commands in it:

Add Dark Knight Cecil to the Party
Remove Paladin Cecil from the Party

Add Paladin Cecil to the Party
Remove Dark Knight Cecil


This will not work if you're in Paladin Form. You MUST be in Dark Knight form for this to work. When Paladin Cecil is re-added to the party, he will be in a different spot in the party than before the event actions took place (the spot the added Dark Knight would be). Now your Dark Knight form will be the one you started the game with, which means he'll have all the gear/experience he had when he left if you happen to also use the Shadow Mod, or he'll have his initial lv/gear if you don't use Shadow Mod.

Like I said it's not a very useful trick to do without Shadow Mod, but it's like a dream come true if you do.

Hah, I find it strange that this would happen... I can't think of any reason this code would be called in that manner. Maybe I'm missing something obvious.

Bahamut ZERO

  • Cagnazzo
  • *
  • Posts: 347
  • Gender: Male
  • If ye're takin a beatin, hop in de back row!
    • View Profile
I'm not sure, but the results of this are phenominal - Morph still functions perfectly when swapping between Paladin and the Actor 1 Dark Knight in every sense, as well as fix the character OW sprite changing problem I was having, which I'm fairly certain was from Shadow Mod, or the game trying to point to Actor 1 DK Cecil's sprite instead of the duplicate. 

The something you may have missed allows me to force it to do what you thought was impossible, by perhaps the greatest one-time glitch I've ever seen, so I'm perfectly content with this. :D


I like the results of this so much it reinforces an idea I've been shooting back and forth with my friend that basically will be a side dungeon directly after the fight with the Dark Knight at Mt Ordeals involving both Cecils, and an autobattle with a Paladin where it forces Cecil to use Morph (which willl be the first time a player will get to see it in action). Little scene explaining that good and evil comes in many flavors, cause the DK data swap glitch, and the player never knows there was a duplicate involved at all!


I update my graphics thread on almost a daily basis, so keep an eye out for new stuff!

Grimoire LD

  • FF4 Hacker
  • *
  • Posts: 1,684
    • View Profile
I'm not sure, but the results of this are phenominal - Morph still functions perfectly when swapping between Paladin and the Actor 1 Dark Knight in every sense, as well as fix the character OW sprite changing problem I was having, which I'm fairly certain was from Shadow Mod, or the game trying to point to Actor 1 DK Cecil's sprite instead of the duplicate. 

The something you may have missed allows me to force it to do what you thought was impossible, by perhaps the greatest one-time glitch I've ever seen, so I'm perfectly content with this. :D


I like the results of this so much it reinforces an idea I've been shooting back and forth with my friend that basically will be a side dungeon directly after the fight with the Dark Knight at Mt Ordeals involving both Cecils, and an autobattle with a Paladin where it forces Cecil to use Morph (which willl be the first time a player will get to see it in action). Little scene explaining that good and evil comes in many flavors, cause the DK data swap glitch, and the player never knows there was a duplicate involved at all!

Wow! That's a really neat way to go about it! An incredibly good use of what is technically unintended behavior.

Bahamut ZERO

  • Cagnazzo
  • *
  • Posts: 347
  • Gender: Male
  • If ye're takin a beatin, hop in de back row!
    • View Profile
Quote
Wow! That's a really neat way to go about it! An incredibly good use of what is technically unintended behavior.

Why thank you!

Though it appears I need to do some tests with this concerning Shadow Mod. I'm currently setting up a backup of my project so I can see that effects of other actors being added/removed before and after the DK Actor/Dup swap to make sure they are saving/loading correctly. I'm going set some NPCs in Baron to perform the data swap so I can see how/if it effects Shadow Mod from the start.


Last night while I was testplaying my project, Kain rejoined during the Zot events at his initial level. At the time I chalked it up to the fact that he was KO'ed during the Rydia/Titan event, thus leaving him KO'd in the shadow and not receiving experience. But then when I got to the scene where Adult Rydia joins in to save the day, she is added as a muted, poisoned, midget/toad/pig with Golbez's name. This may be caused by the fact I was toying around with equipment indexes  to allow the Dark Knight to use a couple more weapons/armors than he originally could.

To counter this I figured "Well, I'll just have her rejoin as a child until I figure out what's going on.", and she rejoined at her initial level/gear. So I have a sneaking suspicion that the Actor/Dup swap I did caused Shadow Mod to implode (although Yang appeared to rejoin with his experience instact directly after doing this). Perhaps doing so trips up how Shadow save/loads actors, causing it to steadily cease functioning due to the way I forced the DK Duplicate into the actor data during the swap (that's my theory, anyway).



UPDATE - After some tests I found out some interesting thing:

1) The DK Actor/Dup seems to mess with the Shadow Mod a bit, Resetting Kain0, Rydia, and Yang's Shadows. But afterwards they all save and load correctly, so if I perhaps have this swap happen as early as possible (like have part of my Paladin side dungeon idea occur when Cecil goes to sleep instead of Cecil and Rosa talking) I should be able to workaround this completely. :D  Adult Rydia also loads correctly after Child Rydia's shadow resets, which is a major relief!

2) I noticed tht when you Morph to Dark Knight mode for the very first time (pre-swap) The Hades Shield reads as "Hades    :0" in the in-battle equipment menu, and if removed, disappears completely. This ONLY happens the very first time for morph, and I see no reason why anyone would want to switch shields that very first battle (being it's his best one under normal circumstances), so it's no big deal.

3) It seems the DK actor/dup swap won't trigger if the party is only Kain and Cecil.  A party of four seems to be the ideal set up for this to occur (for the testing I used Palom, Porom and Tellah as they where my party members when I first did this)


All in all, I'm confident that all should work amazingly well together once I rig it up to do so!

6/1 UPDATE: I've got everything set up so the swap happens during the opening areas. I need to do a few adjustments, but it works like a charm!

Also, I noticed something very neat the other night while testing out a sprite I've been working on - whenever you morph, whatever status effects or buffs Cecil has BEFORE morphing are stored alongside the rest of the stuff when he's put into SRAM. Meaning one could power up one of his forms with haste, shell, safe, float, blink, and wall, use Morph, and save that buffed up form for a different fight altogether. It's awesome!
« Last Edit: June 01, 2015, 12:57:59 PM by Bahamut ZERO »
I update my graphics thread on almost a daily basis, so keep an eye out for new stuff!

Grimoire LD

  • FF4 Hacker
  • *
  • Posts: 1,684
    • View Profile
Bit of a belated update, but I just realized I never posted my fixed Event Instruction Skip Hack. The old one had several issues dealing with rollovers that the newer one has fixed and is the one used in Unprecedented Crisis and will be the version of the hack I'll put on Romhacking.net

As noted before this hack fills in the empty Event Instruction labeled as "Load some type of graphic?" - It allows a complete event skip to the next event if the entire party is dead when the instruction is reached and will check chosen flags to see how many event instructions should be skipped as based upon a dummy movement byte.