Ability_Effect_List.txt
Key:
R = Reflectable
S = Stealable
M = Not Silencable
O = Offensive
I = Ignore Reaction
! = R-Ab:Return Magic
@ = R-Ab:Absorb MP
Byte #1| Byte #2| Byte #3| Byte #4
RIO----- ---!--MS ------@- --------
Protect: 10000001 01100001 00010000 00000000
Dispel: 00000001 01100001 00010000 00000000
Holy: 00100001 11110001 00010010 00000000
Judge: 00100000 11100001 00010000 00000000
U.Blow: 00100000 10110010 00010110 00000000
Fire: 10100001 11110101 00011010 00000000
Greas.B.: 01100000 01110010 00010100 00000000
00 [Not Seen]
01 - None
02 [Not Seen]
03 - 100%H, Gadget, Inflict Protect
04 - 100%H, EqpSword, Inflict Disable
05 - 100%H, Gadget, Inflict Shell
06 - SType, Gadget, Inflict Blind
07 - 100%H, Gadget, 100% Heal
08 - SType, Gadget, Inflict Sleep
09 - 100%H, Gadget, Inflict Haste
0A - 100%H, Gadget, Dispel
0B - SType, Gadget, Inflict Poison
0C [Not Seen]
0D - SType, Gadget, Non-Undead: Inflict Doom
0E - 100%H, KOed Unit, Revive to Full HP
0F - 100%H, KOed Unit, Revive to 25% HP
10 [Not Seen]
11 - 100%H, Self, Draw Weapon
12 - 100%H, Self, [Eff1 Damage / 4] Damage
13 - 100%H, Self, Max HP Damage
14 - 100%H, Self, Caster's HP Damage
15 - 100%H, Self, Eff1Dep: [Eff1 Damage / 4] Damage
16 - 100%H, Self, Inflict Speed DOWN
17 - 100%H, Self, 100% Damage
18 - 100%H, Self, Eff1Dep: Heal Eff1 Damage
19 [Not Seen]
1A - 100%H, Self, Lose 30 Gil
1B - 100%H, Default, Eff1Dep: Delay Unit
1C - AType, Default, Delay Unit
1D - 100%H, Default, Inflict Quicken
1E - 100%H, Default, Inflict WAtk UP/WDef UP/MPow UP/MRes UP
1F - SType, Default, Doom Archer Effect*
20 - AType, Default, Matra Magic Effect*
21 - AType, Default, [(Target's HP + 1) * 0.9] Damage
22 - AType, Default, Steal 2 JP
23 - AType, Default, 100% Damage to MP, capped to Target's MP
24 - 100%H, Default, Heal 80 MP
25 - 100%H, Default, Inflict Astra
26 - 100%H, Default, Esuna
27 - SType, Default, Eff1Dep: Inflict Frog
28 - SType, Default, Inflict Frog
29 - 100%H, Default, Remove Frog
2A - 100%H, Cover Effect
2B - ---, Enemy, Aim: Wallet Effect*
2C - 100%H, Default, Inflict Advice
2D - 100%H, Default, Inflict Shell
2E - SType, Default, Elementalshift Effect*
2F - SType, Default, Eff1Dep: Inflict Stop
30 - SType, Default, Inflict Stop
31 - AType, Default, Inflict Speed DOWN
32 - AType, Default, 400% Damage
33 - 100%H, Default, (Target's Kills * 10) Damage
34 [Not Seen]
35 - 100%H, Default, 100% Damage
36 - 100%H, Default, 999 Damage
37 - 100%H, Default, Limit Glove Effect
38 - AType, Default, 30 Damage
39 - AType, Default, [(Target's HP + 1) / 2] Damage
3A - AType, Default, [Target's HP / 4] Damage
3B - AType, Default, Mutilate Effect*
3C - AType, Default, Goblin Punch Effect*
3D - AType, Default, Rand{2..12} Damage
3E - AType, NonUndead, (Caster's Max HP - Caster's HP) Damage
3F - AType, Default, 100% Damage
40 - AType, Default, 100% Damage, capped to Target's Max HP
41 - AType, Default, 50% Damage, 2.0x Hit Rate
42 - AType, Default, 200% Damage, 0.5x Hit Rate
43 - AType, Default, Throw Effect*
44 - SType, Default, Eff1Dep: Inflict Disable
45 - SType, Default, Inflict Disable
46 - 100%H, Default, Remove Disable
47 [Not Seen]
48 - SType, Default, Eff1Dep: Inflict Immobilize
49 - SType, Default, Inflict Immobilize
4A - 100%H, Default, Remove Immobilize
4B - 100%H, Default, Eff1Dep: Knockback
4C - SType, Default, Eff1Dep: Inflict Berserk
4D - SType, Default, Inflict Berserk
4E - 100%H, Default, Inflict Protect
4F - SType, Default, Hastebreak Effect*
50 - ---, Default, Aim: Vitals Effect*
51 - ---, Default, Acid Effect
52 - 100%H, Default, Inflict Reflect
53 - 100%H, Enemy, Detect Hidden Items
54 [Not Seen]
55 - SType, Default, Eff1Dep: Inflict Blind
56 - 100%H, Default, Eye2Eye: Inflict Blind
57 - SType, Default, Inflict Blind
58 - 100%H, Default, Remove Blind
59 - 100%H, Default, Heal to full HP
5A - 100%H, Default, Heal (Caster's HP) Damage
5B - 100%H, Default, 100% Heal
5C [Not Seen]
5D - SType, Default, Eff1Dep: Inflict Confusion
5E - 100%H, Default, Eye2Eye: Inflict Confusion
5F - SType, Default, Inflict Confusion
60 - SType, Default, Bad Breath Effect*
61 - SType, Default, Inflict Sleep
62 - SType, Default, Inflict Petrify
63 - 100%H, Default, Remove Petrify
64 - SType, Default, Inflict WDef DOWN/MRes DOWN
65 - AType, Default, Break Armor Effect
66 [Not Seen]
67 - SType, Default, Eff1Dep: Inflict Slow
68 - SType, Default, Inflict Slow
69 - 100%H, Default, Inflict Haste
6A - 100%H, Default, Dispel
6B - 100%H, Default, Soundwave Effect
6C - 100%H, Default, Inflict Expert Guard
6D [Not Seen]
6E - SType, Default, Eff1Dep: Inflict Silence
6F - SType, Default, Inflict Silence
70 - 100%H, Default, Remove Silence
71 - 100%H, Default, Hibernate Effect
72 - AType, Enemy, Steal JP
73 - AType, Enemy, Steal Gil Effect
74 - AType, Enemy, Steal EXP
75 - AType, Enemy, Steal Accessory
76 - AType, Enemy, Steal Armor
77 - AType, Enemy, Steal Helm
78 - AType, Enemy, Steal Shield
79 - AType, Enemy, Steal Weapon
7A - AType, Enemy, Steal Ability, 0.25x Hit Rate
7B - 100%H, Default, Inflict Conceal
7C - SType, Default, Eff1Dep: Inflict Poison
7D - SType, Default, Inflict Poison
7E - 100%H, Default, Remove Poison
7F - SType, Default, Inflict Zombie
80 - 100%H, Default, Remove Zombie
81 - ---, Default, Break Weapon Effect
82 - SType, Default, Inflict WAtk DOWN
83 - 100%H, Default, Inflict Boost
84 - SType, Default, Inflict Addle
85 - 100%H, Default, Inflict WDef UP
86 - AType, Default, Hurl Effect*
87 - 100%H, Default, Inflict Defense
88 - 100%H, Default, Eff1Dep: Inflict MPow DOWN
89 - SType, Default, Inflict MPow DOWN
8A - 100%H, Default, Inflict MRes UP
8B - 100%H, Default, Cureall Effect*
8C - SType, Enemy, Eff1Dep: Inflict Charm
8D [Not Seen]
8E - SType, Enemy, Inflict Charm
8F - 100%H, Default, Change Laws
90 - 100%H, NonUndead, SameLvDigit: 100% Damage
91 - 100%H, Undead, SameLvDigit: 100% Heal
92 - 100%H, LvlDivBy3, Inflict WDef DOWN
93 - 100%H, LvlDivBy3, Inflict MRes DOWN
94 - 100%H, NonUndead, LvlDivBy5: Inflict KO
95 - 100%H, Undead, LvlDivBy5: Heal to full HP
96 - 100%H, SmeLvlDay, 100% Damage
97 - 100%H, Enemy, 100% Damage to MP
98 - 100%H, Enemy, Eff1Dep: 100% Damage
99 - 100%H, Enemy, 100% Damage
9A - AType, Enemy, 100% Damage
9B - SType, Enemy, Inflict Berserk
9C - ---, Enemy, Drop Weapon
9D - ---, Parley Effect*
9E [Not Seen]
9F - AType, NotSelf, (Caster's HP) Damage
A0 - AType, NotSelf, 100% Damage
A1 - SType, NotSelf, Inflict Sleep
A2 - 100%H, NonUndead, Heal to full MP
A3 - 100%H, NonUndead, Esuna
A4 - AType, NonUndead, 100% Damage
A5 - 100%H, NonUndead, Inflict Regen
A6 - 100%H, NonUndead, Inflict Auto-Life
A7 - 100%H, NonUndead, Heal to full HP
A8 - 100%H, NonUndead, 100% Heal
A9 - SType, NonUndead, Eff2Dep: Inflict Confuse
AA - SType, NonUndead, Inflict Doom
AB - SType, NonUndead, Eff1Dep: Inflict Doom
AC - 100%H, NonUndead, Inflict KO
AD - SType, NonUndead, Inflict KO
AE [Not Seen]
AF - AType, NonAnimal, 100% Damage
B0 - ---, NonAnimal, Break Weapon Effect
B1 - AType, NonDragon, 100% Damage
B2 - 100%H, Undead, (Target's Max HP) Damage
B3 [Not Seen]
B4 - AType, Undead, 100% Damage
B5 - 100%H, Undead, Heal to full HP
B6 - 100%H, Undead, 100% Heal
B7 - SType, Undead, Remove Unit, 0.5x Hit Rate
B8 [Not Seen]
B9 - AType, Animal, 100% Damage
BA - AType, Animal, 200% Damage
BB - ---, Animal, Parley Effect*
BC - SType, Animal, Inflict Addle
BD - ---, Animal, Capture Effect*
BE - AType, Dragon, 200% Damage
BF - ---, Dragon, Parley Effect*
C0 - AType, Enemy, Mug Effect
C1 - ---, Control Effect
C2 - ---, Friend Effect*
C3 - 100%H, NonUndead, Inflict Regen
C4 - 100%H, Undead, Heal (Caster's Max HP - Caster's HP) Damage
C5 - AType, Default, 200% Damage
C6 - AType, Default, 50% Damage
C7 - AType, Default, 300% Damage
C8 - 100%H, Default, Morph Effect
C9 - SType, Enemy, Inflict Sleep
CA - 100%H, Default, 50% Damage
CB - 100%H, Judge, Stop Judge
CC - SType, Default, Inflict Disable/Immobilize
CD - 100%H, Default, Give JP
CE - 100%H, Default, Remove Yellow Card
CF - 100%H, Default, Add Yellow Card
D0 - 100%H, Default, Eff1Dep: Steal 2 JP
Default_Clan_Notes.txt
0854CD54 = Base Clan Data.
0854D1B4 = Amount in clan. (Halfword)
0854D1B8 = Pointer to clan data. (Word)
0852CDE0 - 0x30 bytes long.
00. Sprite & Name Index
01. Job Index (Race taken from this)
02. Unknown
03. Level
04. Unknown * 4
05. Equip #1
07. Equip #2
09. Equip #3
0B. Equip #4
0D. Equip #5
0F. Unknown * 20
ROM_Notes.txt
Default gil: [0x0800986C]
Days per Month: [0x08036102] + 1
Ability_Index.txt
0x0851BA84 + (Race * 4)
NNNN DDDD AAAA TT AP
0B01 C100 0100 01 0A Cure 100 AP Action
0D01 C300 0200 01 14 Cura
0C01 C200 0300 01 1E Curaga
DA00 9000 0400 01 14 Ensuna
F101 A701 0500 01 14 Life
C900 7F00 0600 01 1E Full-Life
F001 A601 0700 01 14 Auto-Life
2401 DA00 0800 01 0A Shell
AD01 6301 0900 01 0A Protect
B400 6A00 0400 03 1E Turbo MP 300 AP
2D02 EC01 0800 05 0A White Combo 100 AP Combo
NNNN = Name Index
DDDD = Description Index(?)
AAAA = Ability Identifier(?)
TT = Type:
00: Breaks Ability
01: "Action"
02: "Reaction"
03: "Support"
05: "Combo"
Else: "Action"
AP = AP
Notes.txt just a bit vague...
0200F881 = Overworld Law Limiter
In a HEX Editor, change the two bytes at 0x02DB04 to 00 21
and change the two bytes at 0x02DB36 to 00 21
and change the two bytes at 0x02DB5C to 00 21
and change the two bytes at 0x02DB74 to ## 20, where ## is the number of laws you want the player to be able to set. Must be at least 1.
//The part below isn't needed, but makes the game show the correct amount of laws in the pre-battle part of the game.
and change the two bytes at 0x02FB80 to 00 28
and change the two bytes at 0x02FBBE to 00 1C
Enemy Modifer?
02002FC4 1st Enemy
020030CC 2nd
020031D4
020032DC
020033E4
NegativeSpeedEqZero.asm probably just ignore this one.
.thumb
.org 0x06F0DC
push {r4-r6,r14}
mov r6,r0
ldrb r0,[r6,#0x2]
cmp r0,#0x0
bne 0x06F0E8
b 0x06F1E2
mov r5,#0x0
ldsb r5,[r6,r5]
lsl r5,r5,#0x13
mov r0,#0xA0
lsl r0,r0,#0xF
add r5,r5,r0
asr r5,r5,#0x10
mov r4,#0x1
ldsb r4,[r6,r4]
lsl r4,r4,#0x3
add r4,#0x4
ldrh r0,[r6,#0x4]
mov r1,#0xA
bl 0x0CA7A4
lsl r3,r0,#0x10
lsr r3,r3,#0x10
mov r0,r5
mov r1,r4
mov r2,#0x3
bl 0x06F568
mov r5,#0x0
ldsb r5,[r6,r5]
lsl r5,r5,#0x13
mov r0,#0xA0
lsl r0,r0,#0xF
add r5,r5,r0
asr r5,r5,#0x10
mov r4,#0x1
ldsb r4,[r6,r4]
lsl r4,r4,#0x13
mov r0,#0x80
lsl r0,r0,#0xD
add r4,r4,r0
asr r4,r4,#0x10
ldrh r0,[r6,#0x4]
mov r1,#0xB
bl 0x0CA7A4
lsl r3,r0,#0x10
lsr r3,r3,#0x10
mov r0,r5
mov r1,r4
mov r2,#0x3
bl 0x06F568
mov r5,#0x0
ldsb r5,[r6,r5]
lsl r5,r5,#0x13
mov r0,#0xA0
lsl r0,r0,#0xF
add r5,r5,r0
asr r5,r5,#0x10
mov r4,#0x1
ldsb r4,[r6,r4]
lsl r4,r4,#0x13
mov r0,#0xE0
lsl r0,r0,#0xD
add r4,r4,r0
asr r4,r4,#0x10
ldrh r0,[r6,#0x4]
mov r1,#0xC
bl 0x0CA7A4
lsl r3,r0,#0x10
lsr r3,r3,#0x10
mov r0,r5
mov r1,r4
mov r2,#0x3
bl 0x06F568
mov r5,#0x0
ldsb r5,[r6,r5]
lsl r5,r5,#0x13
mov r0,#0xA0
lsl r0,r0,#0xF
add r5,r5,r0
asr r5,r5,#0x10
mov r4,#0x1
ldsb r4,[r6,r4]
lsl r4,r4,#0x13
mov r0,#0xA0
lsl r0,r0,#0xE
add r4,r4,r0
asr r4,r4,#0x10
ldrh r0,[r6,#0x4]
mov r1,#0xD
bl 0x0CA7A4
lsl r3,r0,#0x10
lsr r3,r3,#0x10
mov r0,r5
mov r1,r4
mov r2,#0x3
bl 0x06F568
mov r5,#0x0
ldsb r5,[r6,r5]
lsl r5,r5,#0x13
mov r0,#0xA0
lsl r0,r0,#0xF
add r5,r5,r0
asr r5,r5,#0x10
mov r4,#0x1
ldsb r4,[r6,r4]
lsl r4,r4,#0x13
mov r0,#0xD0
lsl r0,r0,#0xE
add r4,r4,r0
asr r4,r4,#0x10
ldrh r0,[r6,#0x4]
mov r1,#0xE
bl 0x0CA7A4
mov r3,#0x7F
and r3,r0
cmp r3,r0
beq 0x06F1D8
mov r3,#0x0
mov r0,r5
mov r1,r4
mov r2,#0x3
bl 0x06F568
pop {r4-r6}
pop {r0}
bx r0
FFTAbil.hsl just something I made for hex editing.
/*****************************************************************************
* FFTAbil.hsl - Structure definitions for Abilities in FFTA.
*
* Copyright (c) 2011 Darthatron
*
*****************************************************************************
* Revision History:
* 1/01/11 - Created
*/
#include "standard-types.hsl"
#pragma displayname("FFTA Structures") ;
#pragma fileextensions(".gba") ;
#pragma byteorder(little_endian)
struct ABILITIES
{
WORD hNameID;
BYTE bElement;
BYTE bAP;
BYTE bMP;
BYTE bUnknown1;
BYTE bRange;
WORD hUnknown2;
BYTE bHAura;
BYTE bVAura;
BYTE bPower;
BYTE bEffect1;
BYTE bEffect2;
BYTE bEffect3;
BYTE bEffect4;
DWORD wAttributes;
BYTE bUnknown5;
BYTE bUnknown6;
BYTE bUnknown7;
BYTE bUnknown8;
BYTE bUnknown9;
BYTE bUnknown10;
BYTE bUnknown11;
BYTE bUnknown12;
} ;
struct JOBS
{
WORD hNameID;
WORD hBuffer;
BYTE bRace;
BYTE bChecksum;
BYTE bUnknown0;
WORD hSpriteIndex;
WORD hUnknown1;
BYTE bSpritePal;
BYTE bUnknown2;
BYTE bPortraitPal;
BYTE bPortraitIndex;
BYTE bUnknown3;
BYTE bAAbility;
BYTE bUnknown4;
DWORD wElements;
BYTE bStatus;
BYTE bHPBase;
BYTE bMPBase;
BYTE bSpeedBase;
BYTE bMelee1;
BYTE bMelee2;
BYTE bMelee3;
BYTE bMagic1;
BYTE bMagic2;
BYTE bMagic3;
BYTE bHPGrowth;
BYTE bMPGrowth;
BYTE bSpeedGrowth;
BYTE bAttackGrowth;
BYTE bDefenseGrowth;
BYTE bPowerGrowth;
BYTE bResistGrowth;
BYTE bUnknown5;
BYTE bMove;
BYTE bJump;
BYTE bEvade;
WORD hUnknown6;
BYTE bEquipIndex;
WORD hUnknown7;
BYTE bJobIndex;
WORD hUnknown8;
BYTE bUnknown9;
} ;
struct ALLJOBS
{
struct JOBS entries[116];
}
I assume (and hope) there will be questions.
This is how Rand works
ROM:08002804 ; =============== S U B R O U T I N E =======================================
ROM:08002804
ROM:08002804 ; r0 = random val between 0 and 32767
ROM:08002804
ROM:08002804 Rand ; CODE XREF: sub_8000460+16p
ROM:08002804 ; sub_809D3A8:loc_809D3FAp ...
ROM:08002804 LDR R2, =Rand_Seed
ROM:08002806 LDR R1, [R2]
ROM:08002808 LDR R0, =0x41C64E6D
ROM:0800280A MULS R0, R1
ROM:0800280C LDR R1, =0x3039
ROM:0800280E ADDS R0, R0, R1
ROM:08002810 STR R0, [R2]
ROM:08002812 LSLS R0, R0, #1
ROM:08002814 LSRS R0, R0, #0x11
ROM:08002816 BX LR
ROM:08002816 ; End of function Rand
ROM:08002816
ROM:08002816 ; ---------------------------------------------------------------------------
ROM:08002818 off_8002818 DCD Rand_Seed ; DATA XREF: Randr
ROM:0800281C dword_800281C DCD 0x41C64E6D ; DATA XREF: Rand+4r
ROM:08002820 dword_8002820 DCD 0x3039 ; DATA XREF: Rand+8r
And this is how Rand2 works:
ROM:08002838 ; =============== S U B R O U T I N E =======================================
ROM:08002838
ROM:08002838 ; r0 = random value between (-r0 and r0) / 2
ROM:08002838
ROM:08002838 Rand2 ; CODE XREF: CreateCharacter+246p
ROM:08002838 ; CreateCharacter+28Ep ...
ROM:08002838 PUSH {R4-R6,LR}
ROM:0800283A MOV R6, R9
ROM:0800283C MOV R5, R8
ROM:0800283E PUSH {R5,R6}
ROM:08002840 MOV R9, R0
ROM:08002842 LDR R4, =Rand_Seed
ROM:08002844 LDR R0, [R4]
ROM:08002846 LDR R2, =0x41C64E6D
ROM:08002848 MOVS R1, R0
ROM:0800284A MULS R1, R2
ROM:0800284C LDR R0, =0x3039
ROM:0800284E ADDS R1, R1, R0
ROM:08002850 LSRS R0, R1, #0x10
ROM:08002852 LDR R3, =0x7FFF
ROM:08002854 ANDS R0, R3 ; r0 = random value between 0 and 0x7FFF.
ROM:08002856 MULS R1, R2
ROM:08002858 LDR R5, =0x3039
ROM:0800285A ADDS R1, R1, R5
ROM:0800285C LSRS R6, R1, #0x10
ROM:0800285E ANDS R6, R3 ; r6 = random value between 0 and 0x7FFF.
ROM:08002860 MULS R1, R2
ROM:08002862 ADDS R1, R1, R5
ROM:08002864 LSRS R5, R1, #0x10
ROM:08002866 ANDS R5, R3 ; r5 = random value between 0 and 0x7FFF.
ROM:08002868 MOV R8, R5 ; r8 = r5
ROM:0800286A MOVS R5, R1
ROM:0800286C MULS R5, R2
ROM:0800286E LDR R1, =0x3039
ROM:08002870 ADDS R5, R5, R1
ROM:08002872 STR R5, [R4] ; Re-seed the random seed.
ROM:08002874 LSRS R5, R5, #0x10
ROM:08002876 ANDS R5, R3
ROM:08002878 MOVS R1, #1
ROM:0800287A ADD R9, R1 ; max = max + 1
ROM:0800287C MOV R1, R9
ROM:0800287E BL Mod_r0_by_r1 ; r0 = random % max
ROM:08002882 MOVS R4, R0 ; r4 = r0
ROM:08002884 MOVS R0, R6
ROM:08002886 MOV R1, R9
ROM:08002888 BL Mod_r0_by_r1 ; r0 = random % max
ROM:0800288C ADDS R4, R4, R0 ; r4 = r4 + r0
ROM:0800288E MOV R0, R8
ROM:08002890 MOV R1, R9
ROM:08002892 BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:08002896 SUBS R4, R4, R0
ROM:08002898 MOVS R0, R5
ROM:0800289A MOV R1, R9
ROM:0800289C BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080028A0 SUBS R4, R4, R0
ROM:080028A2 LSRS R0, R4, #0x1F
ROM:080028A4 ADDS R4, R4, R0
ROM:080028A6 LSLS R4, R4, #0xF
ROM:080028A8 ASRS R4, R4, #0x10
ROM:080028AA MOVS R0, R4
ROM:080028AC POP {R3,R4}
ROM:080028AE MOV R8, R3
ROM:080028B0 MOV R9, R4
ROM:080028B2 POP {R4-R6}
ROM:080028B4 POP {R1}
ROM:080028B6 BX R1
ROM:080028B6 ; End of function Rand2
ROM:080028B6
ROM:080028B6 ; ---------------------------------------------------------------------------
ROM:080028B8 off_80028B8 DCD Rand_Seed ; DATA XREF: Rand2+Ar
ROM:080028BC dword_80028BC DCD 0x41C64E6D ; DATA XREF: Rand2+Er
ROM:080028C0 dword_80028C0 DCD 0x3039 ; DATA XREF: Rand2+14r
ROM:080028C0 ; Rand2+20r ...
ROM:080028C4 dword_80028C4 DCD 0x7FFF ; DATA XREF: Rand2+1Ar
This does all the EXP shiz, and checks level up.
ROM:080A7138 ; =============== S U B R O U T I N E =======================================
ROM:080A7138
ROM:080A7138
ROM:080A7138 CheckLevelUp_Maybe
ROM:080A7138 PUSH {R4-R7,LR}
ROM:080A713A MOV R7, R8
ROM:080A713C PUSH {R7}
ROM:080A713E MOVS R5, R0
ROM:080A7140 MOV R8, R1
ROM:080A7142 MOVS R0, #0x8C ; 'î'
ROM:080A7144 BL sub_8022840
ROM:080A7148 MOVS R6, R0
ROM:080A714A LDR R4, =ClearRAM
ROM:080A714C LDR R2, [R4]
ROM:080A714E MOVS R1, #0x8C ; 'î'
ROM:080A7150 BL Call_r2
ROM:080A7154 MOVS R0, #0x68 ; 'h'
ROM:080A7156 BL sub_8022840
ROM:080A715A MOVS R7, R0
ROM:080A715C LDR R2, [R4]
ROM:080A715E MOVS R1, #0x68 ; 'h'
ROM:080A7160 BL Call_r2
ROM:080A7164 MOVS R0, R6
ROM:080A7166 MOVS R1, R5
ROM:080A7168 MOVS R2, R7
ROM:080A716A BL sub_80A7040
ROM:080A716E MOV R0, R8
ROM:080A7170 CMP R0, #0
ROM:080A7172 BEQ loc_80A717E
ROM:080A7174 MOVS R0, R6
ROM:080A7176 MOV R1, R8
ROM:080A7178 MOVS R2, R7
ROM:080A717A BL sub_80A7040
ROM:080A717E
ROM:080A717E loc_80A717E ; CODE XREF: CheckLevelUp_Maybe+3Aj
ROM:080A717E MOVS R5, #0
ROM:080A7180 LDR R0, [R7]
ROM:080A7182 MOVS R1, #0x41 ; 'A'
ROM:080A7184 ADDS R1, R1, R6
ROM:080A7186 MOV R8, R1
ROM:080A7188 CMP R0, #0
ROM:080A718A BEQ loc_80A71E8
ROM:080A718C ADDS R4, R7, #0
ROM:080A718E
ROM:080A718E AddEXP ; CODE XREF: CheckLevelUp_Maybe+AEj
ROM:080A718E LDR R0, [R4]
ROM:080A7190 LDR R0, [R0] ; pRAMCharacter
ROM:080A7192 MOVS R1, #LoadRAMChar::bEXP ; index
ROM:080A7194 BL LoadRAMCharacter
ROM:080A7198 LDRH R1, [R4,#4]
ROM:080A719A ADDS R1, R1, R0
ROM:080A719C LSLS R1, R1, #0x10
ROM:080A719E LSRS R2, R1, #0x10
ROM:080A71A0 ASRS R1, R1, #0x10
ROM:080A71A2 CMP R1, #99
ROM:080A71A4 BGT loc_80A71B4
ROM:080A71A6 LDR R0, [R4]
ROM:080A71A8 LDR R0, [R0]
ROM:080A71AA STRB R2, [R0,#charEXP]
ROM:080A71AC B loc_80A71DA
ROM:080A71AC ; ---------------------------------------------------------------------------
ROM:080A71AE DCB 0
ROM:080A71AF DCB 0
ROM:080A71B0 off_80A71B0 DCD ClearRAM ; DATA XREF: CheckLevelUp_Maybe+12r
ROM:080A71B4 ; ---------------------------------------------------------------------------
ROM:080A71B4
ROM:080A71B4 loc_80A71B4 ; CODE XREF: CheckLevelUp_Maybe+6Cj
ROM:080A71B4 LDR R0, [R4]
ROM:080A71B6 LDR R1, [R0]
ROM:080A71B8 MOVS R0, #0
ROM:080A71BA STRB R0, [R1,#charEXP]
ROM:080A71BC LDR R0, [R4]
ROM:080A71BE LDR R0, [R0] ; pRAMCharacter
ROM:080A71C0 BL LevelUp
ROM:080A71C4 LSLS R0, R0, #0x18
ROM:080A71C6 CMP R0, #0
ROM:080A71C8 BEQ loc_80A71DA
ROM:080A71CA LDRH R0, [R6,#0x34]
ROM:080A71CC ADDS R1, R0, #1
ROM:080A71CE STRH R1, [R6,#0x34]
ROM:080A71D0 LSLS R0, R0, #0x10
ROM:080A71D2 LSRS R0, R0, #0xE
ROM:080A71D4 ADDS R0, R6, R0
ROM:080A71D6 LDR R1, [R4]
ROM:080A71D8 STR R1, [R0]
ROM:080A71DA
ROM:080A71DA loc_80A71DA ; CODE XREF: CheckLevelUp_Maybe+74j
ROM:080A71DA ; CheckLevelUp_Maybe+90j
ROM:080A71DA ADDS R4, #8
ROM:080A71DC ADDS R5, #1
ROM:080A71DE CMP R5, #0xC
ROM:080A71E0 BGT loc_80A71E8
ROM:080A71E2 LDR R0, [R4]
ROM:080A71E4 CMP R0, #0
ROM:080A71E6 BNE AddEXP
ROM:080A71E8
ROM:080A71E8 loc_80A71E8 ; CODE XREF: CheckLevelUp_Maybe+52j
ROM:080A71E8 ; CheckLevelUp_Maybe+A8j
ROM:080A71E8 MOV R0, R8
ROM:080A71EA STRB R5, [R0]
ROM:080A71EC STR R7, [R6,#0x3C]
ROM:080A71EE LDRH R0, [R6,#0x34]
ROM:080A71F0 CMP R0, #0
ROM:080A71F2 BNE loc_80A720C
ROM:080A71F4 MOV R1, R8
ROM:080A71F6 LDRB R0, [R1]
ROM:080A71F8 CMP R0, #0
ROM:080A71FA BNE loc_80A720C
ROM:080A71FC MOVS R0, R7
ROM:080A71FE BL sub_8022854
ROM:080A7202 MOVS R0, R6
ROM:080A7204 BL sub_8022854
ROM:080A7208 MOVS R0, #0
ROM:080A720A B loc_80A720E
ROM:080A720C ; ---------------------------------------------------------------------------
ROM:080A720C
ROM:080A720C loc_80A720C ; CODE XREF: CheckLevelUp_Maybe+BAj
ROM:080A720C ; CheckLevelUp_Maybe+C2j
ROM:080A720C ADDS R0, R6, #0
ROM:080A720E
ROM:080A720E loc_80A720E ; CODE XREF: CheckLevelUp_Maybe+D2j
ROM:080A720E POP {R3}
ROM:080A7210 MOV R8, R3
ROM:080A7212 POP {R4-R7}
ROM:080A7214 POP {R1}
ROM:080A7216 BX R1
ROM:080A7216 ; End of function CheckLevelUp_Maybe
And this is the level up routine.
ROM:080C9B8C ; =============== S U B R O U T I N E =======================================
ROM:080C9B8C
ROM:080C9B8C
ROM:080C9B8C ; int __cdecl LevelUp(int *pRAMCharacter)
ROM:080C9B8C LevelUp ; CODE XREF: CheckLevelUp_Maybe+88p
ROM:080C9B8C ; CreateCharacter+216p ...
ROM:080C9B8C Character = R5
ROM:080C9B8C PUSH {R4-R6,LR}
ROM:080C9B8E MOVS Character, R0
ROM:080C9B90 LDRB R0, [Character,#charLevel]
ROM:080C9B92 ADDS R0, #1
ROM:080C9B94 MOVS R1, #0
ROM:080C9B96 STRB R0, [Character,#charLevel]
ROM:080C9B98 STRB R1, [Character,#charEXP]
ROM:080C9B9A MOVS R0, Character
ROM:080C9B9C BL sub_80C8298
ROM:080C9BA0 LSLS R0, R0, #0x18
ROM:080C9BA2 CMP R0, #0
ROM:080C9BA4 BEQ Continue
ROM:080C9BA6 B Error
ROM:080C9BA8 ; ---------------------------------------------------------------------------
ROM:080C9BA8
ROM:080C9BA8 Continue ; CODE XREF: LevelUp+18j
ROM:080C9BA8 LDRB R0, [Character,#charLevel]
ROM:080C9BAA CMP R0, #50
ROM:080C9BAC BLS Calc_HP
ROM:080C9BAE MOVS R0, #50
ROM:080C9BB0 STRB R0, [Character,#charLevel]
ROM:080C9BB2 MOVS R0, #99
ROM:080C9BB4 STRB R0, [Character,#charEXP]
ROM:080C9BB6 MOVS R0, #0
ROM:080C9BB8 B End_Now ; Already at max level.
ROM:080C9BBA ; ---------------------------------------------------------------------------
ROM:080C9BBA
ROM:080C9BBA Calc_HP ; CODE XREF: LevelUp+20j
ROM:080C9BBA LDRH R0, [Character,#charHP]
ROM:080C9BBC CMP R0, #0
ROM:080C9BBE BEQ Calc_MP
ROM:080C9BC0 MOVS R0, Character
ROM:080C9BC2 MOVS R1, #HP_Growth
ROM:080C9BC4 BL LoadJobData
ROM:080C9BC8 MOVS R4, R0
ROM:080C9BCA MOVS R1, #10
ROM:080C9BCC BL Div_r0_by_r1 ; r0 = r0 / r1
ROM:080C9BD0 LDRH R1, [Character,#charHP]
ROM:080C9BD2 ADDS R1, R1, R0
ROM:080C9BD4 STRH R1, [Character,#charHP]
ROM:080C9BD6 MOVS R0, R4
ROM:080C9BD8 MOVS R1, #10
ROM:080C9BDA BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9BDE MOVS R4, R0
ROM:080C9BE0 CMP R4, #0
ROM:080C9BE2 BEQ Limit_HP
ROM:080C9BE4 BL Rand ; r0 = random val between 0 and 32767
ROM:080C9BE8 LSLS R0, R0, #0x10
ROM:080C9BEA ASRS R0, R0, #0x10
ROM:080C9BEC MOVS R1, #10
ROM:080C9BEE BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9BF2 LSLS R0, R0, #0x10
ROM:080C9BF4 ASRS R0, R0, #0x10
ROM:080C9BF6 CMP R0, R4
ROM:080C9BF8 BGE Limit_HP
ROM:080C9BFA LDRH R0, [Character,#charHP]
ROM:080C9BFC ADDS R0, #1
ROM:080C9BFE STRH R0, [Character,#charHP]
ROM:080C9C00
ROM:080C9C00 Limit_HP ; CODE XREF: LevelUp+56j
ROM:080C9C00 ; LevelUp+6Cj
ROM:080C9C00 LDRH R0, [Character,#charHP]
ROM:080C9C02 LDR R1, =999
ROM:080C9C04 CMP R0, R1
ROM:080C9C06 BLS Calc_MP
ROM:080C9C08 STRH R1, [Character,#charHP]
ROM:080C9C0A
ROM:080C9C0A Calc_MP ; CODE XREF: LevelUp+32j
ROM:080C9C0A ; LevelUp+7Aj
ROM:080C9C0A LDRH R0, [Character,#charMP]
ROM:080C9C0C CMP R0, #0
ROM:080C9C0E BEQ Calc_Speed
ROM:080C9C10 MOVS R0, Character
ROM:080C9C12 MOVS R1, #MP_Growth
ROM:080C9C14 BL LoadJobData
ROM:080C9C18 MOVS R4, R0
ROM:080C9C1A MOVS R1, #10
ROM:080C9C1C BL Div_r0_by_r1 ; r0 = r0 / r1
ROM:080C9C20 LDRH R1, [Character,#charMP]
ROM:080C9C22 ADDS R1, R1, R0
ROM:080C9C24 STRH R1, [Character,#charMP]
ROM:080C9C26 MOVS R0, R4
ROM:080C9C28 MOVS R1, #10
ROM:080C9C2A BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9C2E MOVS R4, R0
ROM:080C9C30 CMP R4, #0
ROM:080C9C32 BEQ Limit_MP
ROM:080C9C34 BL Rand ; r0 = random val between 0 and 32767
ROM:080C9C38 LSLS R0, R0, #0x10
ROM:080C9C3A ASRS R0, R0, #0x10
ROM:080C9C3C MOVS R1, #10
ROM:080C9C3E BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9C42 LSLS R0, R0, #0x10
ROM:080C9C44 ASRS R0, R0, #0x10
ROM:080C9C46 CMP R0, R4
ROM:080C9C48 BGE Limit_MP
ROM:080C9C4A LDRH R0, [Character,#charMP]
ROM:080C9C4C ADDS R0, #1
ROM:080C9C4E STRH R0, [Character,#charMP]
ROM:080C9C50
ROM:080C9C50 Limit_MP ; CODE XREF: LevelUp+A6j
ROM:080C9C50 ; LevelUp+BCj
ROM:080C9C50 LDRH R0, [Character,#charMP]
ROM:080C9C52 LDR R1, =999
ROM:080C9C54 CMP R0, R1
ROM:080C9C56 BLS Calc_Speed
ROM:080C9C58 STRH R1, [Character,#charMP]
ROM:080C9C5A
ROM:080C9C5A Calc_Speed ; CODE XREF: LevelUp+82j
ROM:080C9C5A ; LevelUp+CAj
ROM:080C9C5A MOVS R0, Character
ROM:080C9C5C ADDS R0, #charSpeed
ROM:080C9C5E MOVS R2, #0
ROM:080C9C60 LDRSH R1, [R0,R2]
ROM:080C9C62 MOVS R6, R0
ROM:080C9C64 CMP R1, #0
ROM:080C9C66 BEQ Calc_Atk
ROM:080C9C68 MOVS R0, Character
ROM:080C9C6A MOVS R1, #Speed_Growth
ROM:080C9C6C BL LoadJobData
ROM:080C9C70 MOVS R4, R0
ROM:080C9C72 MOVS R1, #10
ROM:080C9C74 BL Div_r0_by_r1 ; r0 = r0 / r1
ROM:080C9C78 LDRH R1, [R6]
ROM:080C9C7A ADDS R1, R1, R0
ROM:080C9C7C STRH R1, [R6]
ROM:080C9C7E MOVS R0, R4
ROM:080C9C80 MOVS R1, #10
ROM:080C9C82 BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9C86 MOVS R4, R0
ROM:080C9C88 CMP R4, #0
ROM:080C9C8A BEQ Limit_Speed
ROM:080C9C8C BL Rand ; r0 = random val between 0 and 32767
ROM:080C9C90 LSLS R0, R0, #0x10
ROM:080C9C92 ASRS R0, R0, #0x10
ROM:080C9C94 MOVS R1, #10
ROM:080C9C96 BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9C9A LSLS R0, R0, #0x10
ROM:080C9C9C ASRS R0, R0, #0x10
ROM:080C9C9E CMP R0, R4
ROM:080C9CA0 BGE Limit_Speed
ROM:080C9CA2 LDRH R0, [R6]
ROM:080C9CA4 ADDS R0, #1
ROM:080C9CA6 STRH R0, [R6]
ROM:080C9CA8
ROM:080C9CA8 Limit_Speed ; CODE XREF: LevelUp+FEj
ROM:080C9CA8 ; LevelUp+114j
ROM:080C9CA8 MOVS R1, #0
ROM:080C9CAA LDRSH R0, [R6,R1]
ROM:080C9CAC LDR R1, =999
ROM:080C9CAE CMP R0, R1
ROM:080C9CB0 BLE Calc_Atk
ROM:080C9CB2 STRH R1, [R6]
ROM:080C9CB4
ROM:080C9CB4 Calc_Atk ; CODE XREF: LevelUp+DAj
ROM:080C9CB4 ; LevelUp+124j
ROM:080C9CB4 LDRH R0, [Character,#charAtk]
ROM:080C9CB6 CMP R0, #0
ROM:080C9CB8 BEQ Calc_Def
ROM:080C9CBA MOVS R0, Character
ROM:080C9CBC MOVS R1, #Atk_Growth
ROM:080C9CBE BL LoadJobData
ROM:080C9CC2 MOVS R4, R0
ROM:080C9CC4 MOVS R1, #10
ROM:080C9CC6 BL Div_r0_by_r1 ; r0 = r0 / r1
ROM:080C9CCA LDRH R1, [Character,#charAtk]
ROM:080C9CCC ADDS R1, R1, R0
ROM:080C9CCE STRH R1, [Character,#charAtk]
ROM:080C9CD0 MOVS R0, R4
ROM:080C9CD2 MOVS R1, #10
ROM:080C9CD4 BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9CD8 MOVS R4, R0
ROM:080C9CDA CMP R4, #0
ROM:080C9CDC BEQ Limit_Atk
ROM:080C9CDE BL Rand ; r0 = random val between 0 and 32767
ROM:080C9CE2 LSLS R0, R0, #0x10
ROM:080C9CE4 ASRS R0, R0, #0x10
ROM:080C9CE6 MOVS R1, #10
ROM:080C9CE8 BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9CEC LSLS R0, R0, #0x10
ROM:080C9CEE ASRS R0, R0, #0x10
ROM:080C9CF0 CMP R0, R4
ROM:080C9CF2 BGE Limit_Atk
ROM:080C9CF4 LDRH R0, [Character,#charAtk]
ROM:080C9CF6 ADDS R0, #1
ROM:080C9CF8 STRH R0, [Character,#charAtk]
ROM:080C9CFA
ROM:080C9CFA Limit_Atk ; CODE XREF: LevelUp+150j
ROM:080C9CFA ; LevelUp+166j
ROM:080C9CFA LDRH R0, [Character,#charAtk]
ROM:080C9CFC LDR R1, =999
ROM:080C9CFE CMP R0, R1
ROM:080C9D00 BLS Calc_Def
ROM:080C9D02 STRH R1, [Character,#charAtk]
ROM:080C9D04
ROM:080C9D04 Calc_Def ; CODE XREF: LevelUp+12Cj
ROM:080C9D04 ; LevelUp+174j
ROM:080C9D04 LDRH R0, [Character,#charDef]
ROM:080C9D06 CMP R0, #0
ROM:080C9D08 BEQ Calc_Pow
ROM:080C9D0A MOVS R0, Character
ROM:080C9D0C MOVS R1, #Def_Growth
ROM:080C9D0E BL LoadJobData
ROM:080C9D12 MOVS R4, R0
ROM:080C9D14 MOVS R1, #10
ROM:080C9D16 BL Div_r0_by_r1 ; r0 = r0 / r1
ROM:080C9D1A LDRH R1, [Character,#charDef]
ROM:080C9D1C ADDS R1, R1, R0
ROM:080C9D1E STRH R1, [Character,#charDef]
ROM:080C9D20 MOVS R0, R4
ROM:080C9D22 MOVS R1, #10
ROM:080C9D24 BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9D28 MOVS R4, R0
ROM:080C9D2A CMP R4, #0
ROM:080C9D2C BEQ Limit_Def
ROM:080C9D2E BL Rand ; r0 = random val between 0 and 32767
ROM:080C9D32 LSLS R0, R0, #0x10
ROM:080C9D34 ASRS R0, R0, #0x10
ROM:080C9D36 MOVS R1, #10
ROM:080C9D38 BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9D3C LSLS R0, R0, #0x10
ROM:080C9D3E ASRS R0, R0, #0x10
ROM:080C9D40 CMP R0, R4
ROM:080C9D42 BGE Limit_Def
ROM:080C9D44 LDRH R0, [Character,#charDef]
ROM:080C9D46 ADDS R0, #1
ROM:080C9D48 STRH R0, [Character,#charDef]
ROM:080C9D4A
ROM:080C9D4A Limit_Def ; CODE XREF: LevelUp+1A0j
ROM:080C9D4A ; LevelUp+1B6j
ROM:080C9D4A LDRH R0, [Character,#charDef]
ROM:080C9D4C LDR R1, =999
ROM:080C9D4E CMP R0, R1
ROM:080C9D50 BLS Calc_Pow
ROM:080C9D52 STRH R1, [Character,#charDef]
ROM:080C9D54
ROM:080C9D54 Calc_Pow ; CODE XREF: LevelUp+17Cj
ROM:080C9D54 ; LevelUp+1C4j
ROM:080C9D54 LDRH R0, [Character,#charPow]
ROM:080C9D56 CMP R0, #0
ROM:080C9D58 BEQ Calc_Res
ROM:080C9D5A MOVS R0, Character
ROM:080C9D5C MOVS R1, #Pow_Growth
ROM:080C9D5E BL LoadJobData
ROM:080C9D62 MOVS R4, R0
ROM:080C9D64 MOVS R1, #10
ROM:080C9D66 BL Div_r0_by_r1 ; r0 = r0 / r1
ROM:080C9D6A LDRH R1, [Character,#charPow]
ROM:080C9D6C ADDS R1, R1, R0
ROM:080C9D6E STRH R1, [Character,#charPow]
ROM:080C9D70 MOVS R0, R4
ROM:080C9D72 MOVS R1, #10
ROM:080C9D74 BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9D78 MOVS R4, R0
ROM:080C9D7A CMP R4, #0
ROM:080C9D7C BEQ Limit_Pow
ROM:080C9D7E BL Rand ; r0 = random val between 0 and 32767
ROM:080C9D82 LSLS R0, R0, #0x10
ROM:080C9D84 ASRS R0, R0, #0x10
ROM:080C9D86 MOVS R1, #10
ROM:080C9D88 BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9D8C LSLS R0, R0, #0x10
ROM:080C9D8E ASRS R0, R0, #0x10
ROM:080C9D90 CMP R0, R4
ROM:080C9D92 BGE Limit_Pow
ROM:080C9D94 LDRH R0, [Character,#charPow]
ROM:080C9D96 ADDS R0, #1
ROM:080C9D98 STRH R0, [Character,#charPow]
ROM:080C9D9A
ROM:080C9D9A Limit_Pow ; CODE XREF: LevelUp+1F0j
ROM:080C9D9A ; LevelUp+206j
ROM:080C9D9A LDRH R0, [Character,#charPow]
ROM:080C9D9C LDR R1, =999
ROM:080C9D9E CMP R0, R1
ROM:080C9DA0 BLS Calc_Res
ROM:080C9DA2 STRH R1, [Character,#charPow]
ROM:080C9DA4
ROM:080C9DA4 Calc_Res ; CODE XREF: LevelUp+1CCj
ROM:080C9DA4 ; LevelUp+214j
ROM:080C9DA4 LDRH R0, [Character,#charRes]
ROM:080C9DA6 CMP R0, #0
ROM:080C9DA8 BEQ Error
ROM:080C9DAA MOVS R0, Character
ROM:080C9DAC MOVS R1, #Res_Growth
ROM:080C9DAE BL LoadJobData
ROM:080C9DB2 MOVS R4, R0
ROM:080C9DB4 MOVS R1, #10
ROM:080C9DB6 BL Div_r0_by_r1 ; r0 = r0 / r1
ROM:080C9DBA LDRH R1, [Character,#charRes]
ROM:080C9DBC ADDS R1, R1, R0
ROM:080C9DBE STRH R1, [Character,#charRes]
ROM:080C9DC0 MOVS R0, R4
ROM:080C9DC2 MOVS R1, #10
ROM:080C9DC4 BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9DC8 MOVS R4, R0
ROM:080C9DCA CMP R4, #0
ROM:080C9DCC BEQ Limit_Res
ROM:080C9DCE BL Rand ; r0 = random val between 0 and 32767
ROM:080C9DD2 LSLS R0, R0, #0x10
ROM:080C9DD4 ASRS R0, R0, #0x10
ROM:080C9DD6 MOVS R1, #10
ROM:080C9DD8 BL Mod_r0_by_r1 ; r0 = r0 % r1
ROM:080C9DDC LSLS R0, R0, #0x10
ROM:080C9DDE ASRS R0, R0, #0x10
ROM:080C9DE0 CMP R0, R4
ROM:080C9DE2 BGE Limit_Res
ROM:080C9DE4 LDRH R0, [Character,#charRes]
ROM:080C9DE6 ADDS R0, #1
ROM:080C9DE8 STRH R0, [Character,#charRes]
ROM:080C9DEA
ROM:080C9DEA Limit_Res ; CODE XREF: LevelUp+240j
ROM:080C9DEA ; LevelUp+256j
ROM:080C9DEA LDRH R0, [Character,#charRes]
ROM:080C9DEC LDR R1, =999
ROM:080C9DEE CMP R0, R1
ROM:080C9DF0 BLS Error
ROM:080C9DF2 STRH R1, [Character,#charRes]
ROM:080C9DF4
ROM:080C9DF4 Error ; CODE XREF: LevelUp+1Aj
ROM:080C9DF4 ; LevelUp+21Cj ...
ROM:080C9DF4 MOVS R0, #1
ROM:080C9DF6
ROM:080C9DF6 End_Now ; CODE XREF: LevelUp+2Cj
ROM:080C9DF6 POP {R4-R6}
ROM:080C9DF8 POP {R1}
ROM:080C9DFA BX R1
ROM:080C9DFA ; End of function LevelUp
ROM:080C9DFA
ROM:080C9DFA ; ---------------------------------------------------------------------------
ROM:080C9DFC dword_80C9DFC DCD 999 ; DATA XREF: LevelUp+76r
ROM:080C9DFC ; LevelUp+C6r ...
This shall do for now.