/
DoesUnitHaveWRank.s
108 lines (94 loc) · 1.52 KB
/
DoesUnitHaveWRank.s
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
.thumb
.align
@formerly in CanUnitWieldWeapon, this adds compatibility for things that happen before WRank check (i.e. weapon locks) and needs lumina/shadowgift to happen after
.equ SkillTester,ItemTable+4
.equ ShadowgiftID, SkillTester+4
.equ LuminaID, ShadowgiftID+4
.equ ShadowgiftStaffOption, LuminaID+4
.equ LuminaStaffOption, ShadowgiftStaffOption+4
DoesUnitHaveWRank:
push {r4-r7,r14}
mov r4,r0 @character pointer
mov r5,r1 @item halfword
mov r6,r2 @rank
@get item's wrank requirement
mov r0,r5
mov r1,#0xFF
and r0,r1
mov r1,#0x24
mul r0,r1
ldr r1,ItemTable
add r0,r1
ldrb r0,[r0,#0x1C]
cmp r0,r6
ble RetTrue @if (item wrank <= user wrank)
mov r6,r0
mov r0,#0xFF
and r0,r5
mov r1,#0x24
mul r0,r1
ldr r1,ItemTable
add r1,r0
ldrb r2,[r1,#7]
@shadowgift
cmp r2,#7 @if dark rank
bne noShadowgift
mov r0,r4
ldr r1,ShadowgiftID
ldr r3,SkillTester
mov lr,r3
.short 0xF800
cmp r0,#0
beq noShadowgift
mov r0,r4
add r0,#0x28
ldrb r2,[r0,#6]
cmp r2,r6
bhs RetTrue
ldrb r2,[r0,#5]
cmp r2,r6
bhs RetTrue
ldr r1,ShadowgiftStaffOption
cmp r1,#0
beq noShadowgift
ldrb r2,[r0,#4]
cmp r2,r6
bhs RetTrue
noShadowgift:
@lumina
cmp r2,#6 @if light rank
bne noLumina
mov r0,r4
ldr r1,LuminaID
ldr r3,SkillTester
mov lr,r3
.short 0xF800
cmp r0,#0
beq noLumina
mov r0,r4
add r0,#0x28
ldrb r2,[r0,#7]
cmp r2,r6
bhs RetTrue
ldrb r2,[r0,#5]
cmp r2,r6
bhs RetTrue
ldr r1,LuminaStaffOption
cmp r1,#0
beq noLumina
ldrb r2,[r0,#4]
cmp r2,r6
bhs RetTrue
noLumina:
RetFalse:
mov r0,#0
b GoBack
RetTrue:
mov r0,#1
GoBack:
pop {r4-r7}
pop {r1}
bx r1
.ltorg
.align
ItemTable: