-
Notifications
You must be signed in to change notification settings - Fork 0
/
neoclassical-patch-notes.org
5493 lines (5064 loc) · 346 KB
/
neoclassical-patch-notes.org
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Reference: https://datacrystal.romhacking.net/wiki/Final_Fantasy_III:ROM_map
Reference: https://github.com/everything8215/ff3/
** Formulas
*** Rare Monsters Impossible to Find
Problem: Due to a heavily skewed random number generator, rare encounters are nearly impossible to
find, even with multiple playthroughs, e.g. Red/Yellow/Green Dragons.
Solution: Change the probability tables of rare encounters.
#+BEGIN_SRC
; Offset $7bd88
- ; battle probabilities
- ; 0: 12/256
- ; 1: 12/256
- ; 2: 12/256
- ; 3: 12/256
- ; 4: 6/256
- ; 5: 6/256
- ; 6: 3/256
- ; 7: 1/256
- 3D/BD78: 00 00 00 00 00 00 00 00 00 00 00 00 01 01 01 01
- 3D/BD88: 01 01 01 01 01 01 01 01 02 02 02 02 02 02 02 02
- 3D/BD98: 02 02 02 02 03 03 03 03 03 03 03 03 03 03 03 03
- 3D/BDA8: 04 04 04 04 04 04 05 05 05 05 05 05 06 06 06 07
+ ; battle probabilities
+ ; 0: 10/256
+ ; 1: 10/256
+ ; 2: 10/256
+ ; 3: 10/256
+ ; 4: 8/256
+ ; 5: 8/256
+ ; 6: 4/256
+ ; 7: 4/256
+ 3D/BD78: 00 00 00 00 00 00 00 00 00 00 01 01 01 01 01 01
+ 3D/BD88: 01 01 01 01 02 02 02 02 02 02 02 02 02 02 03 03
+ 3D/BD98: 03 03 03 03 03 03 03 03 04 04 04 04 04 04 04 04
+ 3D/BDA8: 05 05 05 05 05 05 05 05 06 06 06 06 07 07 07 07
#+END_SRC
*** Fix Skill Enhancement Rate
Problem: Most classes take until near the very end of the game to reach Skill 99, meaning that one
can only truly specialize in a single class. This is problematic, because many classes are not
introduced until very late into the game.
Solution 1: Improve the base-rate for skill enhancement.
- +12 -> +16 skill for things a class is great at
- +8 -> +12 skill for things a class is good at
- +4 -> +8 skill for things a class is fair at
- +0 -> +4 skill for things a class is poor at
Doesn't work, only 2 bits are allowed per job experience multiplier. No room to add a blanket +4.
#+BEGIN_SRC
35/BDBC: 20 88 9B JSR $9B88 ; add character offset
35/BDBF: B1 5B LDA ($5B),Y ; job experience multipliers (4 * 2 bits)
35/BDC1: 85 22 STA $22
35/BDC3: A9 00 LDA #$00
35/BDC5: 85 23 STA $23 ; get next 2 bits
35/BDC7: 06 22 ASL $22
35/BDC9: 26 23 ROL $23
35/BDCB: 06 22 ASL $22
35/BDCD: 26 23 ROL $23
#+END_SRC
Solution 2: Lower the job experience needed for a job level to 60 (5x12).
#+BEGIN_SRC
35/BE0D: A5 1E LDA $1E
35/BE0F: E9 64 SBC #$64
3C
35/BE11: A5 1F LDA $1F
35/BE13: E9 00 SBC #$00
35/BE15: 90 22 BCC $BE39 ; branch if < 100
#+END_SRC
*** Fix Enhance Element Bug
#+BEGIN_SRC
; there seems to be a bug with the element boosts in byte 6 that causes all
; three flags to get cleared at 31/AF16, so they never do anything. if it
; were working, it would cause boosted spells to do 20% more hits (31/B0AD)
; and have a 4x damage multiplier (31/B8BA).
...
31/AF13: 20 98 BE JSR $BE98 ; add character offset
31/AF16: B1 59 LDA ($59),Y ; get battle row
31/AF18: 29 01 AND #$01 ; *** bug? should be #$E1 to get elements ***
31/AF1A: 05 32 ORA $32 ; weapon type
#+END_SRC
4x damage as well as 20% more hits seems a bit over the top.
Offset: $062f28
In addition, there's more bugs in the element check.
#+BEGIN_SRC
31/B0AF: B1 6E LDA ($6E),Y ; equipment element boost
31/B0B1: 29 E0 AND #$E0
31/B0B3: 20 46 FD JSR $FD46 ; lsr3
31/B0B6: 2D 00 74 AND $7400 ; check if spell's element is boosted
#+END_SRC
Snippet has offset = $630bf
For equipment, we have:
0x6: Stat bonuses/elemental boosts (bitfield)
Combine the bits to combine bonuses.
00 Nothing
01 Bolt Up
02 Ice Up
04 Fire Up
---
08 +5 Spirit
10 +5 Intellect
20 +5 Vitality
40 +5 Agility
80 +5 Strength
For spells, their elements are as follows:
0x0: Spell Element
00 Nothing
01 Recovery
02 Dark
04 Thunder
08 Ice
10 Fire
20 Air
40 Earth
80 Holy
This means that the weapon element boost needs to be shifted left 2 bits to align with spells.
The code snippet should likely be:
offset = $630bf
#+BEGIN_SRC
31/B0AF: B1 6E LDA ($6E),Y ; equipment element boost
- 31/B0B1: 29 E0 AND #$E0
+ 31/B0B1: 29 0E AND #$0E
- 31/B0B3: 20 46 FD JSR $FD46 ; lsr3
+ 31/B0B3: 0A 0A EA ASL ASL NOP ; left2
31/B0B6: 2D 00 74 AND $7400 ; check if spell's element is boosted
31/B0B9: F0 18 BEQ $B0D3
31/B0BB: A5 30 LDA $30
31/B0BD: 85 18 STA $18
- 31/B0BF: A9 05 LDA #$05 ; no. of hits +20% (add 1/5)
+ 31/B0BF: A9 03 LDA #$03 ; no. of hits +33% (add 1/3)
31/B0C1: 85 1A STA $1A
31/B0C3: A9 00 LDA #$00
31/B0C5: 85 19 STA $19
31/B0C7: 85 1B STA $1B
31/B0C9: 20 92 FC JSR $FC92 ; divide (16-bit)
#+END_SRC
Even if the element boost branch is fixed, it only adds 20% of hits, meaning you get nothing until
you have a magic multiplier of at least 5! Change this to be 33% so it's actually perceivable.
*** Fix Loss of Haste/Safe Effects When Open Inventory
The bug is caused by a call to updateEquipment logic when the inventory menu is closed.
#+BEGIN_SRC
; close menu
35/B1AE: C6 52 DEC $52
35/B1B0: 20 B0 8E JSR $8EB0 ; close menu window
35/B1B3: A9 00 LDA #$00
35/B1B5: 85 10 STA $10
35/B1B7: A5 08 LDA $08
35/B1B9: 29 FE AND #$FE
35/B1BB: 85 08 STA $08
35/B1BD: 20 C5 F8 JSR $F8C5 ; wait for vblank (no color update)
35/B1C0: A9 00 LDA #$00
35/B1C2: 85 18 STA $18
35/B1C4: 20 DF 8A JSR $8ADF ; hide cursor
35/B1C7: A9 01 LDA #$01
35/B1C9: 85 18 STA $18
35/B1CB: 20 DF 8A JSR $8ADF ; hide cursor
35/B1CE: E6 52 INC $52
35/B1D0: 20 26 80 JSR $8026 ; update character equipment
^ (bug if no equipment changed)
35/B1D3: A9 00 LDA #$00
35/B1D5: 4C FD 99 JMP $99FD ; command cancelled
#+END_SRC
This can be fixed by moving this instruction to the end of the sequence for swapping/changing items
instead. However, to make it work, all memory locations have to be shifted.
Offset: $6b1a3
#+BEGIN_SRC
- 35/B193: C6 52 DEC $52
+ 35/B193: EA EA NOP NOP
<-- Update character equipment should go here.
+ 35/B195: 20 26 80 JSR $8026 ; update character equipment
- 35/B195: 4C B0 B1 JMP $B1B0
+ 35/B198: 4C B1 B1 JMP $B1B1
; B button
35/B19B: A5 67 LDA $67
35/B19D: F0 12 BEQ $B1B1 ; branch if no item selected
35/B19F: C6 67 DEC $67 ; deselect item
35/B1A1: A9 F0 LDA #$F0 ; hide cursor 1
35/B1A3: 85 1C STA $1C
35/B1A5: 85 1D STA $1D
35/B1A7: A9 01 LDA #$01
35/B1A9: 85 1A STA $1A
35/B1AB: 20 2E 89 JSR $892E ; set cursor sprite position
35/B1AE: 4C AA AE JMP $AEAA
; close menu
35/B1B1: C6 52 DEC $52
35/B1B3: 20 B0 8E JSR $8EB0 ; close menu window
35/B1B6: A9 00 LDA #$00
35/B1B8: 85 10 STA $10
35/B1BA: A5 08 LDA $08
35/B1BC: 29 FE AND #$FE
35/B1BE: 85 08 STA $08
35/B1C0: 20 C5 F8 JSR $F8C5 ; wait for vblank (no color update)
35/B1C3: A9 00 LDA #$00
35/B1C5: 85 18 STA $18
35/B1C7: 20 DF 8A JSR $8ADF ; hide cursor
35/B1CA: A9 01 LDA #$01
35/B1CC: 85 18 STA $18
35/B1CF: 20 DF 8A JSR $8ADF ; hide cursor
35/B1D1: E6 52 INC $52
- 35/B1D3: 20 26 80 JSR $8026 ; update character equipment
35/B1D6: A9 00 LDA #$00
35/B1D8: 4C FD 99 JMP $99FD ; command cancelled
#+END_SRC
Test 1: 2x haste party member, attack to confirm, use item (potion), confirm haste still
works. Success!
Test 2: 2x haste party member, attack to confirm, use item (equipped weapon), confirm haste
still works. Success!
Test 3: 2x haste party member with 2 weapons, attack to confirm, remove 1 weapon, attack
again, confirm haste is lost. Success!
Fixed! Now buffs will ONLY be lost when changing equipment, or using an ability that modifies battle
attributes, such as "defend"
*** Increase Significance of Strength and Job Choice
Goal: Increase the perceived difference between classes that use the same equipment.
Observation: Strength only adds Str/4 to the attack power. Consider the following:
- Knight using Defender (120 dmg) and Strength 60 (+15 dmg), Agility 60, Level 60
- Red Mage using Defender (120 dmg) and Strength 30 (+7 dmg), Agility 60, Level 60
The total number of hits is the same: 1 + (60/16) + (60/16) = 7
The Knight damages 15-7=8 more per hit.
The total damage difference is 945 vs. 889, a difference of ~6%.
A Knight gives up spellcasting and many other things in order to specialize in attack, and having
only a 6% advantage is insignificant.
Solution:
1. Change bow attack formula:
- Change strength contribution from Str/4 to Str/1.
- Fix bug causing bow damage to be halved.
2. Change bare fist (monk, karateka) attack formula:
- Change strength contribution from Str/4 to Str/2.
3. Keep bare first (other) damage unchanged:
- Keep strength contribution at Str/4.
4. Increase strength contribution from weapons.
- Change right hand strength contribution from Str/4 to Str/2.
- Leave left hand strength contribution as Str/4.
In ROM, functions used to divide by various numbers:
#+BEGIN_SRC
; [ lsr ]
3F/FD43: 4A LSR ; div64
3F/FD44: 4A LSR ; div32
3F/FD45: 4A LSR ; div16
3F/FD46: 4A LSR ; div8
3F/FD47: 4A LSR ; div4
3F/FD48: 4A LSR ; div2
3F/FD49: 60 RTS ; div1
#+END_SRC
The NES uses 6502 Assembly: https://en.wikibooks.org/wiki/6502_Assembly
There will be a place where strength is divided by 4 (by calling $FD47), and instead, we want to
divide by nothing (by calling $FD49).
This may be the case here: https://github.com/everything8215/ff3/blob/1acef8117120ff891003de249b1a74bc8d94d674/ff3j.asm#L9938C25-L9938C25
#+BEGIN_SRC
31/AC7C: AD 28 74 LDA $7428 ; strength
31/AC7F: 20 47 FD JSR $FD47 ; lsr2
#+END_SRC
Location 1: $062c8c (bare fist, monk/karateka)
- Change to JSR $FD48 => strength/2
- 77 bytes
Location 2: $062cd9 (bow and arrow)
- 25 bytes
- 157 damage vs. 110 with Yoichi Bow (50) and Yoichi Arrow (70) and str=62
- diff of 47 is ~3/4 * 62
- Yes, 1/4 + 3/4 = 1/1!
- Change to JSR $FD49 => strength/1
Location 3: $062cf2 (bare fists, other)
- 41 bytes
- Unchanged => strength/4
Location 4: $062d1b (right weapon)
- 36 bytes
- Change to JSR $FD48 => strength/2
Location 5: $062d3f (left weapon)
- Change to JSR $FD47 => strength/4
Bow Damage is bugged, only 1/2 of bow damage is added.
- Example: str=62, Yoichi Bow (50) and Yoichi Arrow (110) has only 110 damage
with strength changed from strength/4 to strength/1, damage is 157
- The cause is a LSR instruction that halves the damage of the bow:
https://github.com/everything8215/ff3/blob/1acef8117120ff891003de249b1a74bc8d94d674/ff3j.asm#L9971
- Change: $062cc8 from LSR ($4a) to NOP ($ea) (left hand)
- Change: $062cd6 from LSR ($4a) to NOP ($ea) (right hand)
*** Rebalance Weapons
**** End Game Weapons
Due to increased contribution of strength, weapon damage needs to be reduced to compensate.
- For example, a Fighter at the end game (~L50), has about 60 strength.
- Changing the formula from Str/4 to Str/2 gives the Fighter 15 extra damage.
- Reducing late-game weapon damage by ~15 would compensate for this.
- This leaves left-hand weapons slightly weaker than before, which is desirable due to the game
being inbalanced in favor of two weapons and against shields.
Late Game Weapons (Reduce Damage by 15):
- FullMoon 160 -> 145
- Masamune 160 -> 145
- Ragnarok 180 -> 165
- Excalibur 160 -> 145
Weapons: 8 bytes
- $0: Weapon element
- $1: Hit%
- $2: Attack
- $3: Status on successful hit
- $4: Magic cast when used / 2-handed
- $5: Special properties
- $6: Stat bonuses / elemental boosts
- $8: Class availability index
Weapon Changes
- $61610 00 5A A0 00 7F 00 00 2B FULL MOON
91
- $615C8 02 5A A0 00 7F 00 60 0F MASAMUNE
91
- $615D0 02 64 B4 00 7F 00 E0 2B RAGNAROK
A0
- $615C0 00 50 A0 00 7F 00 80 0E EXCALIBUR
91
Weapons to make end-game viable:
- Holy Spear 100 -> 120
- GreatAxe (80%, 75) -> (70%, 125)
- Triton (80%, 85) -> (60%, 145)
- HellClaw 60 -> 90
- AirKnife 60 -> 90
Weapon Changes
- $614F8 A0 50 64 00 7F 00 00 07 HOLY LANCE
78
- $614D0 04 50 4B 00 7F 00 00 0A GREAT AXE
46 7D
- $615A0 20 50 55 00 7F 00 00 0A TRITON HAMMER
3C 91
- $61438 02 64 3C 02 7F 00 00 38 HELL CLAWS
5A
- $61528 20 64 3C 00 2D 00 00 09 AIR KNIFE
5A
**** Bows and Arrows
Problem: Bows in general suffer a few problems.
- There is no end-game bow.
- Due to limited ammow, one runs out of the 1 type of end-game arrow, Yoichi.
Solution: Move bow+arrow damage mostly to bow, thus, older arrow types like fire and ice remain
viable in the end-game with a better bow.
Yoichi Bow + Yoichi Arrow: 120 damage -> 140 damage
- YoichiBow 50 -> 110
- YoichiArrow 70 -> 30
- RuneBow 25 -> 50
- BoltArrow 30 -> 15
- FireArrow 30 -> 15
- IceArrow 30 -> 15
- KillerBow 15 -> 30
- IronArrow 17 -> 15
- GreatBow 8 -> 20
- MedusaArrow 20 -> 10
- HolyArrow 13 -> 10
- Bow 5 -> 10
- WoodenArrow 6 -> 3
Weapon Changes:
- $61680 00 64 32 00 FF 00 00 15 YOICHI BOW
6E
- $616C0 00 64 46 00 7F 80 00 15 YOICHI ARROW
1E
- $61678 00 5A 19 00 FF 00 00 15 RUNE BOW
32
- $616A0 04 55 1E 00 7F 80 00 15 LIGHT ARROW
0F
- $616A8 10 5A 1E 00 7F 80 00 15 FIRE ARROW
0F
- $616B0 08 5A 1E 00 7F 80 00 15 ICE ARROW
0F
- $61670 00 55 0F 00 FF 00 00 15 KILLER BOW
1E
- $61698 00 55 11 00 7F 80 00 14 IRON ARROW
0F
- $61668 00 55 08 00 FF 00 00 14 GREAT BOW
14
- $616B8 40 64 14 40 7F 80 00 15 MEDUSA ARROW
0A
- $61690 80 55 0D 00 7F 80 00 14 HOLY ARROW
0A
- $61660 00 5A 05 00 FF 00 00 14 BOW
0A
- $61688 00 5A 06 00 7F 00 00 14 WOODEN ARROW
03
**** Scholar Books
Problem: Scholar lacks end-game weapons.
Solution: Increase book damage, add utility spells.
- Change damage from 65 to 95 (equal to defender)
- Blizzard book casts Safe (1A)
- Illumina book casts Erase (17)
- Inferno book casts Haste (13)
- $615F0 10 46 41 00 7F 00 00 35 INFERNO BOOK
50 5F 13
- $61600 04 50 41 00 7F 00 00 35 ILLUMINA BOOK
5F 17
- $61620 08 50 41 00 7F 00 00 35 BLIZZARD BOOK
5F 1A
**** Staves
Problem: Monks lack weapon options, and with changes in the strength formulas, their current weapons
are even worse comparatively.
Solution: Make staves act as reasonable weapon options for monks.
Low hit% (65%), moderate damage
Increase early game staves to have damage matching Tonfa (20)
- $61488 00 32 08 00 31 00 00 05 FIRE STAFF
14 (8 => 20)
- $61490 00 32 08 00 32 00 00 05 LIGHT STAFF
14 (8 => 20)
- $61498 00 32 08 00 2A 00 00 05 ICE STAFF
14 (8 => 20)
Make mid-game staves have competitive with earlier encountered dragon claw (42), only lower hit%
- $614A0 40 46 10 03 1C 00 80 05 GOLEM STAFF
41 2A (16 => 42)
- $614A8 00 50 14 00 1D 00 00 05 RUNE STAFF
41 4B (20 => 75)
- $614B0 00 5A 1E 00 34 00 1F 06 ELDEST STAFF
41 5F (30 => 95)
**** Rods
Problem: While rods have some utility, especially now that the elemental bug is fixed, it leaves
black mages with zero options for actually attacking physically. Give them a unique flavor.
Solution: Make staves act as light damage weapons, but more accurate than staves.
Low hit% (75%), low damage
$61460 10 46 0C 00 7F 00 04 03 FIRE ROD
4B 23 (12 => 35 damage)
$61468 08 46 0C 00 7F 00 02 03 ICE ROD
4B 23 (12 => 35 damage)
$61470 04 3C 0C 00 7F 00 01 03 LIGHT ROD
4B 23 (12 => 35 damage)
$61478 FC 50 14 07 7F 00 00 04 ULTIMATE ROD
4B 4B (20 => 75 damage)
**** Bells
Problem: Monks lack weapon options, geomancers hurt themselves all the time and have no way to
restore health.
Solution: Make bells have lower damage than dedicated combatant weapons, but generally act as
life-draining weapons.
$61628 00 50 19 00 7F 00 00 13 GIYAMAN BELL
01 23 (25 => 35)
$61630 00 50 1E 99 7F 00 00 13 EARTHEN BELL
01 28 (30 => 40)
00 (remove paralysis)
$61638 00 64 28 00 7F 00 00 13 RUNE BELL
01 50 (40 => 80)
**** Spears
Problem: Spears first appear late in the game, well after the King Sword (damage 50) appears, and
Thunder Spear only has 35 damage. The Dragoon ends up being just a worse version of the knight.
Solution: Allow the initial spears to at least have some parity with competing weapons for other
classes.
- $614E0 24 50 23 00 25 00 00 07 THUNDER SPEAR
2D (35 -> 45)
- $614E8 20 50 32 00 2D 00 00 07 WIND SPEAR
37 (50 -> 55)
- $614F0 21 50 46 00 7F 00 00 07 BLOOD LANCE
50 (70 -> 80)
- $614F8 A0 50 64 00 7F 00 00 07 HOLY LANCE
**** Axes
= Highish Damage, 70% Hit Rate
- $614C8 04 3C 2D 00 7F 00 00 0A BATTLE AXE
46 32
- $614D8 04 46 32 00 7F 00 00 0A M.STAR
3C
- $61578 00 50 3C 00 7F 00 00 0A TOMAHAWK
46 69 (60 => 105 (defender + 10))
*** Increase Significance of Intelligence/Spirit and Party Composition
Problem:
- Magic becomes extremely weak in the late game.
- Classes are quite similar to each other, choices matter less.
Solution:
- Change Int/Spi contribution to spell damage from Int/2 to Int or Spi/2 to Spi.
- Balancing around spell damage would make spells too similar, e.g. Fire1 would lose only a little
damage, but Fire3 would lose a lot. Making the spells too similar.
- Instead of balancing around spell damage, rebalance around spell hit. Make higher level spells
less reliable, but better at punching through magic defense.
- Change spell properties as follows:
- Level1 spells remain at 100% accuracy, but lose a small amount of damage.
- Level3 spells keep their high damage, but lose accuracy. At level 40 or so, it should break even.
Level40 ~ 40 intellect. int - int/2 = +20 damage. Fire3 150 damage (increased by ~15%).
Need 15% miss to compensate for increased damage.
Spell hit is 100% + (Intellect/2).
Thus, (SpellHit%) + (40/2) = 85%.
SpellHit% = 65%
- NewSpellHit = 1 - 100*(IntBalance/2)/SpellDamage - IntBalance/2
After level 40, the spell will grow more powerful than before in terms of average damage.
It will also be more damager per hit, which helps it punch through magic defence.
Solution 1: Spell Hit Percent Adjustments
| Level | Int Balance | SpellDamage | NewHit% | Hex |
|-------+-------------+-------------+---------+-----|
| 8 | 48 | 200 | 64 | 40 |
| 7 | 42 | 160 | 66 | 42 |
| 6 | 36 | 150 | 70 | 46 |
| 5 | 30 | 110 | 71 | 47 |
| 4 | 24 | 85 | 74 | 4A |
| 3 | 18 | 55 | 75 | 4B |
| 2 | 12 | 35 | 77 | 4D |
| 1 | 6 | 25 | 85 | 55 |
#+TBLFM: $4 = round(100 - (100*$2/2.0/$3) - ($2/2));%2d::$5=$4;%2X
PROBLEM: Due to the damage cap of 255, this breaks L8 spells like Flare.
Solution 2: Spell Damage Adjustments
Take away half of the new damage gained (magic was underpowered before).
| Level | Int Balance | SpellDamage | NewDamage | Hex |
|-------+-------------+-------------+-----------+-----|
| 8 | 48 | 200 | 188 | BC |
| 7 | 42 | 160 | 150 | 96 |
| 6 | 36 | 150 | 141 | 8D |
| 5 | 30 | 110 | 103 | 67 |
| 4 | 24 | 85 | 79 | 4F |
| 3 | 18 | 55 | 51 | 33 |
| 2 | 12 | 35 | 32 | 20 |
| 1 | 6 | 25 | 24 | 18 |
#+TBLFM: $4 = round($3 - $2/4.0);%2d::$5=$4;%2X
**** Changes: Increase Int/Spi Spell Damage contribution from Int/2 to Int
Offset: $631d3
#+BEGIN_SRC
31/B1C3: C8 INY
31/B1C4: B1 6E LDA ($6E),Y ; (intelligence or spirit) / 2
- 31/B1C6: 4A LSR
+ 31/B1C6: EA NOP
31/B1C7: 18 CLC
31/B1C8: 6D 02 74 ADC $7402 ; add spell power
31/B1CB: 85 25 STA $25
#+END_SRC
**** Changes: Rebalance Spells
Offset $02: Spell Power
Level 8: -12 damage
$618D0 Flare 00 64 C8 00 00 0F 00 3D
BC
$618E0 Meteo 00 64 B4 00 00 4F 03 3D
A8
$618F8 Holy 80 64 A0 00 00 37 00 3E
94
Level 7: -10 damage
$61908 Quake 40 64 85 00 00 4E 02 2E
7B
$61918 Drain 01 64 A0 00 03 2E 04 2E
96
Level 6: -9 damage
$61940 Fire3 10 64 96 00 00 0D 00 2E
8D
$61948 Bio 00 64 82 00 00 0D 00 2E
79
$61958 Aero2 28 64 73 00 00 15 00 30
6A
Level 5: -7 damage
$61978 Bolt3 04 64 6E 00 00 0C 00 2E
67
Level 4: -6 damage
$619B8 Ice 3 08 64 55 00 00 0B 00 2F
4F
Level 3: -4 damage
$619E8 Fire2 10 64 37 00 00 0A 00 2F
33
$619F0 Ice2 08 64 37 00 00 0A 00 2F
33
$619F8 Bolt2 04 64 37 00 00 0A 00 2F
33
Level 2: -3 damage
$61A20 Bolt 04 64 23 00 00 09 00 2F
20
$61A38 Aero 28 64 2D 00 00 11 00 31
2A
Level 1: -1 damage
$61A58 Fire 10 64 19 00 00 08 00 2F
18
$61A60 Ice 08 64 19 00 00 08 00 2F
18
Fix summon spells. Summoned creature has 2x caster skill, int, and spi, and has skill as level.
#+BEGIN_SRC
35/A029: B1 5B LDA ($5B),Y ; job level, intelligect, spirit
35/A02B: 0A ASL ; multiply by 2
35/A02C: 95 18 STA $18,X
35/A02E: C8 INY
35/A02F: CA DEX
35/A030: 10 F7 BPL $A029
#+END_SRC
Multiplier ends up being (original): 2*skill/32 + 2*skill/16 [skill used as level] + 2*int/16 + 1.
Thus, the whole expected int at spell acquisition should be subtracted to balance it.
Take away 3/4 the new damage gained (magic was underpowered before).
Level 1: -9 damage
$61BA8 Chocobo Dash 00 64 00 00 19 C8 00 00
$61BB0 Chocobo Kick? 00 64 00 00 1A 28 00 00
$61BB8 Chocobo Kick 00 64 10 00 1B 2C 00 00
07
Level 2: -18 damage
$61BC0 Shiva Mesmerize 00 50 00 51 1C 48 00 00
$61BC8 Shiva Icy Stare 00 64 35 00 1E 2B 00 00
23
$61BD0 Shiva Diamond Dust 08 64 20 00 1D 4A 00 00
0E
Level 3: -24 damage
$61BD8 Ramuh Mind Blast 00 46 00 99 1F 4B 00 00
$61BE0 Ramuh Thunderstorm 04 64 30 00 20 2A 00 00
2D // weaker than lvl2? Act like it was 45
$61BE8 Ramuh Judgement Bolt 04 64 60 00 21 4C 00 00
48
Level 4: -36 damage (18 for healing)
$61BF0 Ifrit Healing Light 01 64 5A 00 22 D4 00 00
48
$61BF8 Ifrit Hellfire 10 64 55 00 23 2A 00 00
31
$61C00 Ifrit High Summon 10 64 80 00 24 4D 00 00
5C
Level 5: -45 damage
$61C08 Titan Clobber 00 64 64 00 25 2D 00 00
37
$61C10 Tital Stomp 00 64 6A 00 26 2E 00 00
3D
$61C18 Titan High Summon 40 64 A0 00 27 4E 00 00
73
Level 6: -54 damage
$61C20 Odin Prot. Light 00 64 00 00 28 D5 00 00
$61C28 Odin Slash 00 64 75 00 29 35 00 00
3F
$61C30 Odin Atom 00 64 C3 00 2A 4C 00 00
8D
Level 7: -63 damage
$61C38 Leviathan DemonEye 40 05 00 40 2B 4E 00 00
$61C40 Leviathan Cyclon 20 64 85 00 2C 4E 00 00
46
$61C48 Leviathan Tsunami 04 64 CA 00 2D 4E 00 00
8B
Level 8: -72 damage
$61C50 Bahamut Aura 00 64 00 00 2E D7 00 00
$61C58 Bahamut Rend 00 64 90 00 2F 37 00 00
$61C60 Bahamut MegaFlare 00 64 FF 00 30 47 00 00
B7
Success! Remains powerful for a high skill conjurer, and moderately powerful even for a novice sage.
**** Rebalance Monsters
With intellect/spirit having 2x their normal impact, monsters will become more powerful and very
deadly. Normally monster data store their int/spi as 4 bits, with the total value being these 4 bits
multiplied by 6 (bits << 2) + (bits << 4).
The doubling of the impact of intellect on spell damage would superficially cause one to consider
halving the intellect of most monsters, lowering their intellect would also lower their number of
hits as well as their magic accuracy (important for status-effect spells).
Thus, enemy intellect should be reduced, but not quite by half. Change the code so that the bits
stored are interpretted as intellect/5 rather than intellect/6.
#+BEGIN_SRC
; Offset: $6259d
31/A58D: B1 5D LDA ($5D),Y ; strength = attack power / 2 ???
31/A58F: 4A LSR
31/A590: A0 29 LDY #$29
31/A592: 91 5D STA ($5D),Y
31/A594: 88 DEY
31/A595: A9 05 LDA #$05
31/A597: 91 5D STA ($5D),Y
31/A599: A0 07 LDY #$07
31/A59B: B1 24 LDA ($24),Y
31/A59D: 48 PHA
31/A59E: 29 0F AND #$0F ; intellect
- 31/A5A0: 0A ASL
- 31/A5A1: 85 18 STA $18
+ 31/A5A0: 85 18 STA $18
+ 31/A5A2: 0A ASL
31/A5A3: 0A ASL
31/A5A4: 18 CLC
+ 31/A5A5: 65 18 ADC $18
+ 31/A5A5: 85 18 STA $18
31/A5A7: A0 10 LDY #$10
31/A5A9: 91 5D STA ($5D),Y
31/A5AB: 68 PLA
31/A5AC: 29 F0 AND #$F0 ; spirit
31/A5AE: 20 47 FD JSR $FD47 ; lsr2
31/A5B1: 85 18 STA $18
31/A5B3: 4A LSR
31/A5B4: 18 CLC
31/A5B5: 65 18 ADC $18
31/A5B7: C8 INY
31/A5B8: 91 5D STA ($5D),Y
#+END_SRC
Some monster spells for monsters with high intellect become significantly stronger after this
change. For example, the Cloud of Darkness has a spell "Flarewave" which has a damage of 80. Cloud
of Darkness has 90 intellect, resulting in a change of total damage from (80 + 90/2) to (80 + 90),
an improvement of 45 damage per hit, or 36%.
These bosses, who already have extreme difficulty, should be rebalanced accordingly.
| Spell | Offset | Damage | Orig. Int | Reduction |
|------------+--------+--------+-----------+-----------|
| Earthquake | $61ab8 | 80 | 24 | 10 |
| MegaFlare | $61ae0 | 80 | 66 | 27.5 |
| Flarewave | $61b20 | 80 | 90 | 37.5 |
#+TBLFM: $5=($4*5/6)/2
- $61ab8 40 64 50 00 00 4e 02 00 Earthquake
46
- $61ae0 00 64 50 00 17 4e 09 00 MegaFlare
35
- $61b20 00 64 50 00 00 4f 0b 00 Flarewave
2B
Result: Success!
**** Give Black Mage Boss-Capable Spells
Problem: Black Mages (not Magus) have no effective spells to use against bosses. Their damage
becomes very minimal, because they lack access to Flare and Meteo.
Solution: Permit Drain to work against bosses, giving them better survivability and a key damage source.
#+BEGIN_SRC
; "ドレイン" / "Drain"
; Offset: $632c5
31/B2B5: 20 E7 B8 JSR $B8E7 ; apply m.evade
31/B2B8: F0 0A BEQ $B2C4 ; branch if no hit
31/B2BA: 20 25 BC JSR $BC25 ; get target flags
31/B2BD: 10 08 BPL $B2C7
31/B2BF: AD D8 7E LDA $7ED8
31/B2C2: 10 03 BPL $B2C7 ; branch if not a boss battle
- 31/B2C4: 4C 26 B9 JMP $B926 ; attack ineffective
+ 31/B2C4: EA EA EA NOP NOP NOP ; attack not ineffective
31/B2C7: 20 B5 A2 JSR $A2B5 ; get attacker flags
31/B2CA: 29 87 AND #$87
31/B2CC: 85 28 STA $28
#+END_SRC
**** Fix Erase Spell (Working as Intended)
No clue what erase does, is it broken?
#+BEGIN_SRC
; [ attack effect $0B: erase ]
; "イレース" / "Erase"
; i think this is bugged
31/B49B: 20 E7 B8 JSR $B8E7 ; apply m.evade
31/B49E: F0 18 BEQ $B4B8 ; return if no hit
31/B4A0: 20 25 BC JSR $BC25 ; get target flags
31/B4A3: 10 0B BPL $B4B0 ; branch if target is a character
31/B4A5: AD D8 7E LDA $7ED8
31/B4A8: 10 06 BPL $B4B0 ; branch if not a boss battle
31/B4AA: 20 26 B9 JSR $B926 ; attack ineffective
31/B4AD: 4C B8 B4 JMP $B4B8
31/B4B0: A0 20 LDY #$20
31/B4B2: B1 70 LDA ($70),Y ; load elemental resistances
31/B4B4: 29 03 AND #$03 ; erase all but physical and recovery
31/B4B6: 91 70 STA ($70),Y
#+END_SRC
Erase is not bugged, it erases all elemental resistances outside physical attacks and healing magic.
However, erase will not work on bosses. Perhaps change the code to permit it to work on bosses at a
lower rate, e.g. hit%/4.
#+BEGIN_SRC
; [ attack effect $0B: erase ]
; "イレース" / "Erase"
; Offset: $634ab
31/B49B: 20 E7 B8 JSR $B8E7 ; apply m.evade :: Reduces hits in $7C using m.evade
31/B49E: F0 18 BEQ $B4B8 ; return if no hit
31/B4A0: 20 25 BC JSR $BC25 ; get target flags
31/B4A3: 10 0B BPL $B4B0 ; branch if target is a character
31/B4A5: AD D8 7E LDA $7ED8
31/B4A8: 10 06 BPL $B4B0 ; branch if not a boss battle
- 31/B4AA: 20 26 B9 JSR $B926 ; attack ineffective
+ : 46 7C LSR ($7C) ; hits /= 2
+ : 46 7C LSR ($7C) ; hits /= 2
+ : F0 08 BEQ $B4B8
- 31/B4AD: 4C B8 B4 JMP $B4B8
31/B4B0: A0 20 LDY #$20
31/B4B2: B1 70 LDA ($70),Y ; remove absorbed elements ???
31/B4B4: 29 03 AND #$03
31/B4B6: 91 70 STA ($70),Y
31/B4B8: 60 RTS
#+END_SRC
Success! (partial)
For normal magic damage, there is a method that computes the m.multiplier, which has a special
case. If the least significant 2 bits of monster elemental resistances are #$02, then the multiplier
is set to 1 (divide damage by 2). Unclear what this special case is for... delete it.
#+BEGIN_SRC
; Offset: $6389f
; [ apply elemental modifiers ]
31/B88F: A9 00 LDA #$00 ; clear damage multiplier
31/B891: 85 27 STA $27
31/B893: A0 24 LDY #$24
31/B895: B1 70 LDA ($70),Y ; resistant status
31/B897: 29 01 AND #$01
31/B899: F0 16 BEQ $B8B1 ; branch if no absorb
; absorb
31/B89B: A0 20 LDY #$20
31/B89D: B1 70 LDA ($70),Y ; absorbed elements
31/B89F: 2D 00 74 AND $7400
31/B8A2: F0 0D BEQ $B8B1 ; branch if doesn't absorb spell element
31/B8A4: A9 04 LDA #$04 ; 4x damage multiplier
31/B8A6: 85 27 STA $27
31/B8A8: 68 PLA ; pop return address
31/B8A9: 68 PLA
31/B8AA: A9 02 LDA #$02 ; show "absorbed" message
31/B8AC: 85 54 STA $54
31/B8AE: 4C 3F B2 JMP $B23F ; healing effect
; no absorb
31/B8B1: A0 12 LDY #$12
31/B8B3: B1 70 LDA ($70),Y ; weak elements
31/B8B5: 2D 00 74 AND $7400
31/B8B8: D0 0E BNE $B8C8 ; branch if weak against spell element
31/B8BA: A0 33 LDY #$33
31/B8BC: B1 6E LDA ($6E),Y ; boosted elements
31/B8BE: 29 E0 AND #$E0
31/B8C0: 20 3F FD JSR $FD3F ; asl3 *** bug, should be $FD46 (lsr3) ***
31/B8C3: 2D 00 74 AND $7400
31/B8C6: F0 05 BEQ $B8CD ; this will always branch
31/B8C8: A9 04 LDA #$04 ; 4x damage multiplier
31/B8CA: 85 27 STA $27
31/B8CC: 60 RTS
31/B8CD: A0 20 LDY #$20
31/B8CF: B1 70 LDA ($70),Y ; strong elements
31/B8D1: 2D 00 74 AND $7400
31/B8D4: D0 0C BNE $B8E2 ; branch if strong against spell element
31/B8D6: A0 20 LDY #$20
31/B8D8: B1 70 LDA ($70),Y
; Offset: $638ea
- 31/B8DA: C9 02 CMP #$02 ; Why does this special case exist with some monsters?
+ 31/B8DA: EA EA NOP NOP
- 31/B8DC: F0 04 BEQ $B8E2
- 31/B8DC: EA EA NOP NOP
31/B8DE: A9 02 LDA #$02 ; 2x damage multiplier
31/B8E0: D0 02 BNE $B8E4
31/B8E2: A9 01 LDA #$01 ; 1x damage multiplier
31/B8E4: 85 27 STA $27
31/B8E6: 60 RTS
#+END_SRC
To reflect this difference in function, erase should not use the same palette as wall/barrier.
Spell index = 20? nope
05D1E0-05D2FF: magic graphics properties (96 * 3 bytes)
3-bytes matches use of weapons:
- 0x0: Animation
- 0x1: Sprite
- 0x2: Palette
- D3: Magenta and Cyan
Try: 0-5 - Covers flare, life2
Try: 6-11 - Covers cure4, but not life2 or aero2
Try: 12-17
Try: 18-23: Yes, covers erase.
Try: 18-20: Does not cover cure3. Does not cover erase.
Try: 23: Success! Change palette from B1 => F5. Looks great! Blueish/Pinkish
**** Make Wall Spell Actually Useful
First let's give it a better color than dirty grey...
Try: 7-12: Covers all Level 7 Black and White
Try: 10-12: Covers all Level 7 White
Try: 12: Covers Wall
- D4: Yellow/Cyan
- C7: Light Grey
- EC: Yellow with white highlight
- FF: Light Grey with blue shade
- FE: Orange with green highlight
- FD: Orange with cyan highlight
- E7: Pink with blue highlight
- CC: Light snow blue with white highlight
- BB: Green with white highlight
- DD: Dark cyan with grey highlight
- EE: Yellow with red highlight
- AA: Purple with light purple highlight
- 99: Dark grey with light cyan highlight
- 88: Dark green with white highlight and black shade
- 77: Deep blue with light blue highlight -- A keeper!
- Libra is bright white, what does it use? Slot 31 - BA
- BA: Grey with white highlight. Looks good, neutral, very different from erase.
Order apppears to be:
- Flare Death Meteo WWind Life 2 Holy ???
- Quake Brak2 Drain Cure4 Heal Wall ???
- Fire3 Bio Warp Aero2 Soft Haste ???
- Bolt3 Kill Erase Cure3 Life1 Safe ???
- Break Ice 3 Shade Libra Confu Mute ???
Now, back to business.
Reflect is used during the normal magic effect (only usage):
#+BEGIN_SRC
; [ attack effect $00: normal magic damage ]
31/B17C: A0 26 LDY #$26 ; Note, the reflect counter offset #$26 is in Y.
31/B17E: B1 70 LDA ($70),Y ; Note, the reflect counter is in A.
31/B180: F0 03 BEQ $B185 ; branch if target doesn't have reflect
31/B182: 20 FA B9 JSR $B9FA ; do reflect effect <-- Can save bytes using Y and A.
31/B185: 20 8F B8 JSR $B88F ; apply elemental modifiers
31/B188: 20 E7 B8 JSR $B8E7 ; apply m.evade
31/B18B: F0 24 BEQ $B1B1 ; branch if no hit
#+END_SRC
There seems to be a counter that gets cleared.
It is possible to give Wall multiple charges and decrement the counter instead...
#+BEGIN_SRC
; [ do reflect effect ]
; Offset: $63a0a
31/B9FA: 20 B5 A2 JSR $A2B5 ; get attacker flags
31/B9FD: 30 05 BMI $BA04 ; branch if a monster
31/B9FF: B1 70 LDA ($70),Y
31/BA01: 30 05 BMI $BA08 ; branch if target is a monster
31/BA03: 60 RTS ; no reflect if attacking same side
31/BA04: B1 70 LDA ($70),Y