Merge pull request #153 from SethBarberee/august_2023

August 2023
This commit is contained in:
AnonymousRandomPerson 2023-08-30 23:59:25 -04:00 committed by GitHub
commit 34e14bacef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
93 changed files with 5644 additions and 7340 deletions

View File

@ -1,185 +0,0 @@
#include "asm/constants/gba_constants.inc"
#include "asm/macros.inc"
.syntax unified
.text
thumb_func_start sub_801DB54
sub_801DB54:
push {r4,lr}
ldr r4, _0801DBD0
ldr r0, [r4]
adds r0, 0x9C
movs r2, 0
movs r1, 0x1
strb r1, [r0]
ldr r0, [r4]
adds r0, 0x9D
strb r2, [r0]
ldr r0, [r4]
adds r0, 0x9E
movs r1, 0x8
strb r1, [r0]
ldr r0, [r4]
adds r0, 0x9F
strb r2, [r0]
bl ResetUnusedInputStruct
ldr r0, [r4]
adds r0, 0x3C
movs r1, 0x1
movs r2, 0x1
bl sub_800641C
ldr r0, [r4]
movs r1, 0x1A
ldrsh r0, [r0, r1]
movs r1, 0xC
bl sub_80095E4
adds r0, 0x2
lsls r0, 16
ldr r2, [r4]
ldr r3, [r2, 0x34]
lsls r1, r3, 1
adds r1, r3
lsls r1, 3
adds r1, r2, r1
adds r1, 0x4A
asrs r3, r0, 16
lsrs r0, 16
strh r0, [r1]
ldr r1, [r2, 0x34]
lsls r0, r1, 1
adds r0, r1
lsls r0, 3
adds r2, r0
adds r3, 0x2
adds r2, 0x4C
strh r3, [r2]
bl ResetUnusedInputStruct
ldr r0, [r4]
adds r0, 0x3C
movs r1, 0x1
movs r2, 0x1
bl sub_800641C
pop {r4}
pop {r0}
bx r0
.align 2, 0
_0801DBD0: .4byte gUnknown_203B258
thumb_func_end sub_801DB54
thumb_func_start sub_801DBD4
sub_801DBD4:
push {r4-r7,lr}
mov r7, r8
push {r7}
sub sp, 0x8
ldr r5, _0801DCB4
ldr r0, [r5]
ldr r0, [r0, 0x34]
bl sub_8008C54
ldr r0, [r5]
ldr r0, [r0, 0x34]
bl sub_80073B8
ldr r2, _0801DCB8
ldr r0, [r5]
ldr r3, [r0, 0x34]
movs r0, 0
str r0, [sp]
movs r0, 0xA
movs r1, 0
bl xxx_call_draw_string
ldr r1, [r5]
adds r0, r1, 0
adds r0, 0x9E
ldrb r4, [r0]
lsls r4, 3
subs r4, 0x2
movs r0, 0x1E
ldrsh r2, [r1, r0]
adds r2, 0x1
movs r0, 0x7
str r0, [sp]
ldr r0, [r1, 0x34]
str r0, [sp, 0x4]
adds r0, r4, 0
movs r1, 0
movs r3, 0x2
bl sub_8012BC4
movs r6, 0
ldr r0, [r5]
movs r1, 0x1A
ldrsh r0, [r0, r1]
cmp r6, r0
bge _0801DC9C
adds r7, r5, 0
mov r8, r6
_0801DC34:
ldr r0, [r7]
ldrh r2, [r0, 0x1E]
ldrh r1, [r0, 0x1C]
adds r3, r2, 0
muls r3, r1
adds r1, r3, 0
adds r1, r6
lsls r1, 16
asrs r1, 16
lsls r5, r1, 1
adds r5, r1
lsls r5, 2
ldr r1, _0801DCBC
adds r5, r1
movs r2, 0x4
ldrsh r1, [r5, r2]
lsls r4, r1, 3
subs r4, r1
lsls r4, 2
ldr r1, _0801DCC0
adds r4, r1
adds r1, r6, 0
bl sub_8013800
adds r1, r0, 0
ldr r2, [r4]
ldr r0, [r7]
ldr r3, [r0, 0x34]
mov r0, r8
str r0, [sp]
movs r0, 0x8
bl xxx_call_draw_string
ldr r0, [r7]
adds r1, r6, 0
bl sub_8013800
adds r1, r0, 0
ldr r2, [r5, 0x8]
ldr r0, [r7]
ldr r3, [r0, 0x34]
mov r0, r8
str r0, [sp]
movs r0, 0x3E
bl xxx_call_draw_string
adds r6, 0x1
ldr r0, [r7]
movs r1, 0x1A
ldrsh r0, [r0, r1]
cmp r6, r0
blt _0801DC34
_0801DC9C:
ldr r0, _0801DCB4
ldr r0, [r0]
ldr r0, [r0, 0x34]
bl sub_80073E0
add sp, 0x8
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0801DCB4: .4byte gUnknown_203B258
_0801DCB8: .4byte gUnknown_80DBFA0
_0801DCBC: .4byte gUnknown_811BAF4
_0801DCC0: .4byte gUnknown_81188F0
thumb_func_end sub_801DBD4
.align 2,0

View File

@ -1,292 +0,0 @@
#include "asm/constants/gba_constants.inc"
#include "asm/macros.inc"
.syntax unified
.text
thumb_func_start sub_8021410
sub_8021410:
push {r4,lr}
ldr r4, _08021490
ldr r0, [r4]
adds r0, 0xDC
movs r2, 0
movs r1, 0x1
strb r1, [r0]
ldr r0, [r4]
adds r0, 0xDD
strb r2, [r0]
ldr r0, [r4]
adds r0, 0xDE
movs r1, 0xC
strb r1, [r0]
ldr r0, [r4]
adds r0, 0xDF
strb r2, [r0]
bl ResetUnusedInputStruct
ldr r0, [r4]
adds r0, 0x7C
movs r1, 0x1
movs r2, 0x1
bl sub_800641C
ldr r0, [r4]
adds r0, 0x5A
movs r1, 0
ldrsh r0, [r0, r1]
movs r1, 0xC
bl sub_80095E4
adds r0, 0x2
lsls r0, 16
ldr r2, [r4]
ldr r3, [r2, 0x74]
lsls r1, r3, 1
adds r1, r3
lsls r1, 3
adds r1, r2, r1
adds r1, 0x8A
asrs r3, r0, 16
lsrs r0, 16
strh r0, [r1]
ldr r1, [r2, 0x74]
lsls r0, r1, 1
adds r0, r1
lsls r0, 3
adds r2, r0
adds r3, 0x2
adds r2, 0x8C
strh r3, [r2]
bl ResetUnusedInputStruct
ldr r0, [r4]
adds r0, 0x7C
movs r1, 0x1
movs r2, 0x1
bl sub_800641C
pop {r4}
pop {r0}
bx r0
.align 2, 0
_08021490: .4byte gUnknown_203B280
thumb_func_end sub_8021410
thumb_func_start sub_8021494
sub_8021494:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0xA8
ldr r4, _08021568
ldr r0, [r4]
ldr r0, [r0, 0x74]
bl sub_8008C54
ldr r0, [r4]
ldr r0, [r0, 0x74]
bl sub_80073B8
ldr r2, _0802156C
ldr r0, [r4]
ldr r3, [r0, 0x74]
movs r0, 0
str r0, [sp]
movs r0, 0xA
movs r1, 0
bl xxx_call_draw_string
ldr r3, [r4]
adds r0, r3, 0
adds r0, 0xDE
ldrb r0, [r0]
lsls r0, 3
adds r0, 0x4
adds r1, r3, 0
adds r1, 0x5E
movs r5, 0
ldrsh r2, [r1, r5]
adds r2, 0x1
movs r1, 0x7
str r1, [sp]
ldr r1, [r3, 0x74]
str r1, [sp, 0x4]
movs r1, 0
movs r3, 0x1
bl sub_8012BC4
movs r0, 0
mov r9, r0
ldr r0, [r4]
adds r0, 0x5A
movs r1, 0
ldrsh r0, [r0, r1]
cmp r9, r0
blt _080214FC
b _08021646
_080214FC:
mov r8, r4
add r2, sp, 0x58
mov r10, r2
_08021502:
mov r3, r8
ldr r2, [r3]
adds r0, r2, 0
adds r0, 0x5E
movs r5, 0
ldrsh r1, [r0, r5]
subs r0, 0x2
movs r3, 0
ldrsh r0, [r0, r3]
muls r0, r1
add r0, r9
adds r0, r2, r0
ldrb r5, [r0]
adds r7, r5, 0
ldr r6, [r2, 0x3C]
cmp r6, 0x2
bne _0802159C
add r0, sp, 0x8
adds r1, r5, 0
movs r2, 0x1
bl sub_8092578
adds r0, r5, 0
bl GetFriendAreaPrice
ldr r1, _08021570
ldr r1, [r1]
movs r5, 0x98
lsls r5, 2
adds r1, r5
ldr r1, [r1]
cmp r0, r1
bgt _08021574
mov r1, r8
ldr r0, [r1]
adds r0, 0x40
mov r1, r9
bl sub_8013800
adds r1, r0, 0
mov r2, r8
ldr r0, [r2]
ldr r3, [r0, 0x74]
movs r0, 0
str r0, [sp]
movs r0, 0x8
add r2, sp, 0x8
bl xxx_call_draw_string
b _08021632
.align 2, 0
_08021568: .4byte gUnknown_203B280
_0802156C: .4byte gUnknown_80DC494
_08021570: .4byte gTeamInventoryRef
_08021574:
mov r0, r10
ldr r1, _08021598
add r2, sp, 0x8
bl sprintfStatic
mov r3, r8
ldr r0, [r3]
adds r0, 0x40
mov r1, r9
bl sub_8013800
adds r1, r0, 0
mov r5, r8
ldr r0, [r5]
ldr r3, [r0, 0x74]
movs r0, 0
str r0, [sp]
b _080215FE
.align 2, 0
_08021598: .4byte gUnknown_80DC4A4
_0802159C:
cmp r6, 0
bne _0802160C
ldr r0, _080215D4
ldr r0, [r0]
adds r0, r5
ldrb r0, [r0]
cmp r0, 0x1
bne _080215D8
adds r0, r2, 0
adds r0, 0x40
mov r1, r9
bl sub_8013800
adds r4, r0, 0
adds r0, r5, 0
bl GetFriendAreaName
adds r2, r0, 0
mov r1, r8
ldr r0, [r1]
ldr r3, [r0, 0x74]
str r6, [sp]
movs r0, 0x8
adds r1, r4, 0
bl xxx_call_draw_string
b _08021632
.align 2, 0
_080215D4: .4byte gFriendAreas
_080215D8:
adds r0, r5, 0
bl GetFriendAreaName
adds r2, r0, 0
mov r0, r10
ldr r1, _08021608
bl sprintfStatic
mov r2, r8
ldr r0, [r2]
adds r0, 0x40
mov r1, r9
bl sub_8013800
adds r1, r0, 0
mov r3, r8
ldr r0, [r3]
ldr r3, [r0, 0x74]
str r6, [sp]
_080215FE:
movs r0, 0x8
mov r2, r10
bl xxx_call_draw_string
b _08021632
.align 2, 0
_08021608: .4byte gUnknown_80DC4AC
_0802160C:
adds r0, r2, 0
adds r0, 0x40
mov r1, r9
bl sub_8013800
adds r4, r0, 0
adds r0, r7, 0
bl GetFriendAreaName
adds r2, r0, 0
mov r5, r8
ldr r0, [r5]
ldr r3, [r0, 0x74]
movs r0, 0
str r0, [sp]
movs r0, 0x8
adds r1, r4, 0
bl xxx_call_draw_string
_08021632:
movs r0, 0x1
add r9, r0
mov r1, r8
ldr r0, [r1]
adds r0, 0x5A
movs r2, 0
ldrsh r0, [r0, r2]
cmp r9, r0
bge _08021646
b _08021502
_08021646:
ldr r0, _08021660
ldr r0, [r0]
ldr r0, [r0, 0x74]
bl sub_80073E0
add sp, 0xA8
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_08021660: .4byte gUnknown_203B280
thumb_func_end sub_8021494
.align 2,0

File diff suppressed because it is too large Load Diff

View File

@ -1665,7 +1665,7 @@ _080438AC:
adds r2, r4, 0
bl sub_8083AB0
_08043926:
bl sub_80688CC
bl CloseAllSpriteFiles
bl sub_8049820
ldr r0, _08043994
ldr r0, [r0]

File diff suppressed because it is too large Load Diff

2696
asm/code_805D8C8_1.s Normal file

File diff suppressed because it is too large Load Diff

View File

@ -641,40 +641,4 @@ _0809D6D2:
bx r1
thumb_func_end sub_809D684
thumb_func_start sub_809D6D8
sub_809D6D8:
lsls r1, 16
asrs r1, 14
adds r0, 0x14
adds r0, r1
str r2, [r0]
bx lr
thumb_func_end sub_809D6D8
thumb_func_start sub_809D6E4
sub_809D6E4:
push {r4,lr}
lsls r2, 16
asrs r2, 16
lsls r4, r2, 2
adds r3, r0, 0
adds r3, 0x14
adds r3, r4
ldr r3, [r3]
str r3, [r1]
strh r2, [r1, 0x4]
ldrh r2, [r0, 0x10]
strh r2, [r1, 0x6]
ldrb r0, [r0, 0x12]
strb r0, [r1, 0x8]
adds r0, r3, 0
cmp r0, 0
beq _0809D708
movs r0, 0x1
_0809D708:
pop {r4}
pop {r1}
bx r1
thumb_func_end sub_809D6E4
.align 2,0

View File

@ -597,113 +597,4 @@ _0809080E:
bx r1
thumb_func_end sub_809034C
thumb_func_start sub_8090820
sub_8090820:
push {r4-r7,lr}
lsls r0, 16
lsrs r6, r0, 16
movs r4, 0
ldr r0, _08090868
ldr r0, [r0]
mov r12, r0
movs r7, 0x1
_08090830:
movs r0, 0x58
muls r0, r4
mov r2, r12
adds r1, r2, r0
ldrh r2, [r1]
adds r0, r7, 0
ands r0, r2
cmp r0, 0
beq _08090874
lsrs r0, r2, 1
ands r0, r7
cmp r0, 0
beq _08090874
movs r3, 0
movs r5, 0x1
adds r2, r1, 0
adds r2, 0x2C
_08090852:
ldrb r1, [r2]
adds r0, r5, 0
ands r0, r1
cmp r0, 0
beq _0809086C
ldrh r0, [r2, 0x2]
cmp r0, r6
bne _0809086C
movs r0, 0x1
b _08090880
.align 2, 0
_08090868: .4byte gRecruitedPokemonRef
_0809086C:
adds r2, 0x8
adds r3, 0x1
cmp r3, 0x3
ble _08090852
_08090874:
adds r4, 0x1
movs r0, 0xCE
lsls r0, 1
cmp r4, r0
ble _08090830
movs r0, 0
_08090880:
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end sub_8090820
thumb_func_start sub_8090888
sub_8090888:
push {r4-r7,lr}
adds r4, r0, 0
adds r5, r1, 0
movs r6, 0
b _0809089C
_08090892:
ldrb r0, [r4]
cmp r0, 0xA
bne _0809089A
adds r6, 0x1
_0809089A:
adds r4, 0x1
_0809089C:
ldrb r0, [r4]
cmp r0, 0
bne _08090892
ldrb r7, [r5]
b _080908AE
_080908A6:
movs r0, 0xA
strb r0, [r4]
adds r4, 0x1
adds r6, 0x1
_080908AE:
adds r0, r6, 0
movs r1, 0x3
bl __modsi3
cmp r0, 0
bne _080908A6
adds r1, r7, 0
lsls r0, r1, 24
cmp r0, 0
beq _080908CE
_080908C2:
strb r1, [r4]
adds r4, 0x1
adds r5, 0x1
ldrb r1, [r5]
cmp r1, 0
bne _080908C2
_080908CE:
movs r0, 0
strb r0, [r4]
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end sub_8090888
.align 2,0
.align 2,0

View File

@ -1,35 +0,0 @@
#include "asm/constants/gba_constants.inc"
#include "asm/macros.inc"
.syntax unified
.text
thumb_func_start sub_80840A4
sub_80840A4:
ldr r3, _080840C8
ldr r0, [r3]
ldr r2, _080840CC
adds r1, r0, 0
muls r1, r2
adds r1, 0x1
lsrs r0, r1, 16
muls r1, r2
adds r1, 0x1
str r1, [r3]
ldr r2, _080840D0
ands r1, r2
orrs r0, r1
ldr r1, _080840D4
ands r0, r1
movs r1, 0x1
orrs r0, r1
bx lr
.align 2, 0
_080840C8: .4byte gUnknown_203B458
_080840CC: .4byte 0x5d588b65
_080840D0: .4byte 0xffff0000
_080840D4: .4byte 0x00ffffff
thumb_func_end sub_80840A4
.align 2,0

View File

@ -1,301 +0,0 @@
#include "asm/constants/gba_constants.inc"
#include "asm/macros.inc"
.syntax unified
.text
@ Menu that gets created when you talk to friend
thumb_func_start CreateFriendActionMenu
CreateFriendActionMenu:
push {r4-r7,lr}
ldr r3, _080274E4
ldr r4, _080274E8
ldr r0, [r4]
movs r1, 0x8
ldrsh r2, [r0, r1]
movs r1, 0x58
muls r2, r1
ldr r1, [r3]
adds r5, r1, r2
movs r2, 0xB6
lsls r2, 1
adds r0, r2
movs r1, 0
movs r2, 0x14
bl MemoryFill16
ldrh r0, [r5]
lsrs r0, 1
movs r6, 0x1
ands r0, r6
cmp r0, 0
beq _080274F4
ldr r2, [r4]
movs r3, 0x8E
lsls r3, 1
adds r1, r2, r3
ldr r0, _080274EC
str r0, [r1]
movs r0, 0x90
lsls r0, 1
adds r1, r2, r0
movs r0, 0x7
str r0, [r1]
adds r0, r5, 0
bl sub_8027D9C
lsls r0, 24
cmp r0, 0
bne _080274B6
ldr r0, [r4]
movs r1, 0xB6
lsls r1, 1
adds r0, r1
strh r6, [r0]
_080274B6:
movs r7, 0x1
movs r0, 0x8
bl sub_80023E4
lsls r0, 24
cmp r0, 0
beq _08027552
ldrb r0, [r5, 0x2]
cmp r0, 0
bne _08027552
ldr r3, [r4]
movs r2, 0x8
movs r4, 0x92
lsls r4, 1
adds r1, r3, r4
ldr r0, _080274F0
str r0, [r1]
movs r1, 0x94
lsls r1, 1
adds r0, r3, r1
str r2, [r0]
b _08027550
.align 2, 0
_080274E4: .4byte gRecruitedPokemonRef
_080274E8: .4byte gUnknown_203B2BC
_080274EC: .4byte gFriendActionStandby
_080274F0: .4byte gFriendActionMakeLeader
_080274F4:
ldr r2, [r4]
movs r3, 0x8E
lsls r3, 1
adds r1, r2, r3
ldr r0, _08027658
str r0, [r1]
movs r0, 0x90
lsls r0, 1
adds r1, r2, r0
movs r0, 0x6
str r0, [r1]
movs r1, 0x8
ldrsh r0, [r2, r1]
bl sub_808D750
lsls r0, 24
cmp r0, 0
bne _08027522
ldr r0, [r4]
movs r2, 0xB6
lsls r2, 1
adds r0, r2
strh r6, [r0]
_08027522:
movs r7, 0x1
ldr r2, [r4]
movs r3, 0x92
lsls r3, 1
adds r1, r2, r3
ldr r0, _0802765C
str r0, [r1]
movs r0, 0x94
lsls r0, 1
adds r1, r2, r0
movs r0, 0x9
str r0, [r1]
adds r0, r5, 0
bl sub_8027DCC
lsls r0, 24
cmp r0, 0
bne _08027550
ldr r0, [r4]
movs r1, 0xB7
lsls r1, 1
adds r0, r1
strh r7, [r0]
_08027550:
movs r7, 0x2
_08027552:
ldr r4, _08027660
ldr r2, [r4]
lsls r3, r7, 3
movs r6, 0x8E
lsls r6, 1
adds r0, r2, r6
adds r0, r3
ldr r1, _08027664
str r1, [r0]
movs r5, 0x90
lsls r5, 1
adds r2, r5
adds r2, r3
movs r0, 0xA
str r0, [r2]
bl GetNumberOfFilledInventorySlots
cmp r0, 0
bne _08027588
ldr r0, [r4]
lsls r1, r7, 1
movs r2, 0xB6
lsls r2, 1
adds r0, r2
adds r0, r1
movs r1, 0x1
strh r1, [r0]
_08027588:
adds r7, 0x1
ldr r2, [r4]
lsls r3, r7, 3
adds r0, r2, r6
adds r0, r3
ldr r1, _08027668
str r1, [r0]
adds r2, r5
adds r2, r3
movs r0, 0xB
str r0, [r2]
bl GetNumberOfFilledInventorySlots
cmp r0, 0x13
bgt _080275AE
ldr r0, [r4]
ldrb r0, [r0, 0x14]
cmp r0, 0
bne _080275BE
_080275AE:
ldr r0, [r4]
lsls r1, r7, 1
movs r3, 0xB6
lsls r3, 1
adds r0, r3
adds r0, r1
movs r1, 0x1
strh r1, [r0]
_080275BE:
adds r7, 0x1
ldr r4, _08027660
ldr r5, [r4]
lsls r1, r7, 3
movs r0, 0x8E
lsls r0, 1
adds r3, r5, r0
adds r2, r3, r1
ldr r0, _0802766C
str r0, [r2]
movs r2, 0x90
lsls r2, 1
adds r6, r5, r2
adds r1, r6, r1
movs r0, 0x4
str r0, [r1]
adds r7, 0x1
lsls r1, r7, 3
adds r2, r3, r1
ldr r0, _08027670
str r0, [r2]
adds r1, r6, r1
movs r0, 0xC
str r0, [r1]
adds r7, 0x1
lsls r1, r7, 3
adds r2, r3, r1
ldr r0, _08027674
str r0, [r2]
adds r1, r6, r1
movs r0, 0x5
str r0, [r1]
adds r7, 0x1
lsls r1, r7, 3
adds r3, r1
movs r0, 0
str r0, [r3]
adds r1, r6, r1
movs r0, 0x1
str r0, [r1]
movs r3, 0
mov r12, r4
cmp r3, r7
bge _08027636
adds r4, r6, 0
movs r0, 0xB6
lsls r0, 1
adds r2, r5, r0
_0802761E:
ldrh r0, [r2]
cmp r0, 0
bne _0802762C
ldr r1, [r4]
ldr r0, [r5, 0x70]
cmp r1, r0
beq _080276A0
_0802762C:
adds r4, 0x8
adds r2, 0x2
adds r3, 0x1
cmp r3, r7
blt _0802761E
_08027636:
movs r3, 0
cmp r3, r7
bge _080276A0
mov r2, r12
ldr r1, [r2]
movs r4, 0xB6
lsls r4, 1
adds r0, r1, r4
ldrh r0, [r0]
cmp r0, 0
bne _08027678
movs r2, 0x90
lsls r2, 1
adds r0, r1, r2
ldr r0, [r0]
str r0, [r1, 0x70]
b _080276A0
.align 2, 0
_08027658: .4byte gFriendActionJoinTeam
_0802765C: .4byte gFriendActionSayFarewell
_08027660: .4byte gUnknown_203B2BC
_08027664: .4byte gFriendActionGive
_08027668: .4byte gFriendActionTake
_0802766C: .4byte gFriendActionSummary
_08027670: .4byte gFriendActionMoves
_08027674: .4byte gFriendActionCheckIQ
_08027678:
adds r3, 0x1
cmp r3, r7
bge _080276A0
mov r4, r12
ldr r2, [r4]
lsls r0, r3, 1
movs r4, 0xB6
lsls r4, 1
adds r1, r2, r4
adds r1, r0
ldrh r0, [r1]
cmp r0, 0
bne _08027678
lsls r0, r3, 3
movs r3, 0x90
lsls r3, 1
adds r1, r2, r3
adds r1, r0
ldr r0, [r1]
str r0, [r2, 0x70]
_080276A0:
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end CreateFriendActionMenu
.align 2,0

View File

@ -8642,76 +8642,4 @@ _080A24F4:
bx r1
thumb_func_end sub_80A2460
thumb_func_start sub_80A2500
sub_80A2500:
push {r4,lr}
adds r4, r0, 0
movs r2, 0
ldrsh r0, [r1, r2]
cmp r0, 0x1
bne _080A2524
lsls r4, 16
asrs r4, 16
movs r2, 0x2
ldrsh r0, [r1, r2]
bl sub_80A8BBC
adds r1, r0, 0
lsls r1, 16
asrs r1, 16
adds r0, r4, 0
bl sub_809AB4C
_080A2524:
pop {r4}
pop {r0}
bx r0
thumb_func_end sub_80A2500
thumb_func_start sub_80A252C
sub_80A252C:
push {r4,lr}
adds r4, r0, 0
movs r2, 0
ldrsh r0, [r1, r2]
cmp r0, 0x1
bne _080A2550
lsls r4, 16
asrs r4, 16
movs r2, 0x2
ldrsh r0, [r1, r2]
bl sub_80A8BBC
adds r1, r0, 0
lsls r1, 16
asrs r1, 16
adds r0, r4, 0
bl sub_809ABB4
_080A2550:
pop {r4}
pop {r0}
bx r0
thumb_func_end sub_80A252C
thumb_func_start sub_80A2558
sub_80A2558:
push {r4,lr}
adds r4, r0, 0
movs r2, 0
ldrsh r0, [r1, r2]
cmp r0, 0x1
bne _080A257C
lsls r4, 16
asrs r4, 16
movs r2, 0x2
ldrsh r0, [r1, r2]
bl sub_80A8BBC
adds r1, r0, 0
lsls r1, 16
asrs r1, 16
adds r0, r4, 0
bl sub_809AC18
_080A257C:
pop {r4}
pop {r0}
bx r0
thumb_func_end sub_80A2558
.align 2,0
.align 2,0

View File

@ -5,448 +5,6 @@
.text
thumb_func_start sub_808F468
sub_808F468:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0x20
mov r8, r0
adds r4, r1, 0
lsls r2, 24
lsrs r2, 24
str r2, [sp, 0x14]
movs r0, 0
strh r0, [r4, 0x4]
movs r0, 0x1
str r0, [sp, 0x18]
add r7, sp, 0xC
_0808F488:
ldr r1, [sp, 0x18]
lsls r0, r1, 16
asrs r0, 16
cmp r0, 0x41
bne _0808F49C
movs r0, 0x41
adds r1, r7, 0
bl GetPokemonEvolveConditions
b _0808F4A2
_0808F49C:
adds r1, r7, 0
bl GetPokemonEvolveConditions
_0808F4A2:
ldrh r0, [r7, 0x2]
cmp r0, 0
beq _0808F4B6
mov r2, r8
movs r3, 0x8
ldrsh r1, [r2, r3]
movs r2, 0
ldrsh r0, [r7, r2]
cmp r1, r0
beq _0808F4C2
_0808F4B6:
ldr r3, [sp, 0x18]
adds r3, 0x1
str r3, [sp, 0x18]
ldr r0, _0808F4D4
cmp r3, r0
ble _0808F488
_0808F4C2:
movs r0, 0xD4
lsls r0, 1
ldr r1, [sp, 0x18]
cmp r1, r0
bne _0808F4D8
movs r0, 0x4
strh r0, [r4, 0x4]
b _0808F6EC
.align 2, 0
_0808F4D4: .4byte 0x000001a7
_0808F4D8:
movs r2, 0x1
str r2, [sp, 0x18]
movs r3, 0x8
mov r10, r3
_0808F4E0:
movs r0, 0
mov r9, r0
ldr r1, [sp, 0x18]
lsls r0, r1, 16
asrs r0, 16
str r0, [sp, 0x1C]
adds r1, r7, 0
bl GetPokemonEvolveConditions
ldrh r0, [r7, 0x2]
cmp r0, 0
bne _0808F4FA
b _0808F6DE
_0808F4FA:
mov r2, r8
movs r3, 0x8
ldrsh r1, [r2, r3]
movs r2, 0
ldrsh r0, [r7, r2]
cmp r1, r0
beq _0808F50A
b _0808F6DE
_0808F50A:
ldr r0, [sp, 0x1C]
bl GetFriendArea
lsls r0, 24
lsrs r5, r0, 24
mov r3, r8
movs r1, 0x8
ldrsh r0, [r3, r1]
bl GetFriendArea
lsls r0, 24
lsrs r6, r0, 24
adds r0, r5, 0
mov r1, sp
movs r2, 0
movs r3, 0
bl sub_8092638
mov r0, sp
ldrb r0, [r0, 0x4]
cmp r0, 0
bne _0808F544
ldrh r0, [r4, 0x4]
movs r1, 0x20
orrs r0, r1
strh r0, [r4, 0x4]
movs r2, 0x1
mov r9, r2
b _0808F566
_0808F544:
mov r0, sp
movs r3, 0x2
ldrsh r1, [r0, r3]
cmp r5, r6
bne _0808F550
subs r1, 0x1
_0808F550:
mov r0, sp
movs r2, 0
ldrsh r0, [r0, r2]
cmp r0, r1
bgt _0808F566
ldrh r0, [r4, 0x4]
movs r1, 0x40
orrs r0, r1
strh r0, [r4, 0x4]
movs r3, 0x1
mov r9, r3
_0808F566:
ldrh r0, [r7, 0x2]
cmp r0, 0x1
bne _0808F588
ldrh r2, [r4, 0x4]
ands r0, r2
cmp r0, 0
beq _0808F576
b _0808F6DE
_0808F576:
mov r0, r8
ldrb r1, [r0, 0x3]
movs r3, 0x4
ldrsh r0, [r7, r3]
cmp r1, r0
bge _0808F5E6
movs r0, 0x2
orrs r0, r2
b _0808F5C8
_0808F588:
cmp r0, 0x2
bne _0808F5A8
mov r2, r8
movs r3, 0x14
ldrsh r1, [r2, r3]
movs r2, 0x4
ldrsh r0, [r7, r2]
cmp r1, r0
bge _0808F5E6
ldrh r0, [r4, 0x4]
movs r1, 0x10
orrs r0, r1
strh r0, [r4, 0x4]
movs r3, 0x1
mov r9, r3
b _0808F5E6
_0808F5A8:
cmp r0, 0x3
bne _0808F5E6
ldr r0, [sp, 0x14]
cmp r0, 0
beq _0808F5D0
ldrb r0, [r4]
movs r2, 0x4
ldrsh r1, [r7, r2]
cmp r0, r1
beq _0808F5E6
ldrb r0, [r4, 0x1]
cmp r0, r1
beq _0808F5E6
ldrh r0, [r4, 0x4]
mov r3, r10
orrs r0, r3
_0808F5C8:
strh r0, [r4, 0x4]
movs r0, 0x1
mov r9, r0
b _0808F5E6
_0808F5D0:
ldrb r0, [r7, 0x4]
bl FindItemInInventory
cmp r0, 0
bge _0808F5E6
ldrh r0, [r4, 0x4]
mov r1, r10
orrs r0, r1
strh r0, [r4, 0x4]
movs r2, 0x1
mov r9, r2
_0808F5E6:
ldrh r0, [r7, 0x6]
cmp r0, 0x4
bne _0808F604
ldr r3, [sp, 0x14]
cmp r3, 0
beq _0808F600
ldrb r0, [r4]
cmp r0, 0x76
beq _0808F6CA
ldrb r0, [r4, 0x1]
cmp r0, 0x76
beq _0808F6CA
b _0808F666
_0808F600:
movs r0, 0x76
b _0808F672
_0808F604:
cmp r0, 0x5
bne _0808F614
mov r3, r8
ldrb r0, [r3, 0x18]
ldrb r1, [r3, 0x1A]
cmp r0, r1
bhi _0808F6CA
b _0808F6DE
_0808F614:
cmp r0, 0x6
bne _0808F624
mov r2, r8
ldrb r0, [r2, 0x18]
ldrb r3, [r2, 0x1A]
cmp r0, r3
bcc _0808F6CA
b _0808F6DE
_0808F624:
cmp r0, 0x7
bne _0808F634
mov r1, r8
ldrb r0, [r1, 0x18]
ldrb r2, [r1, 0x1A]
cmp r0, r2
beq _0808F6CA
b _0808F6DE
_0808F634:
cmp r0, 0x8
bne _0808F650
ldr r3, [sp, 0x14]
cmp r3, 0
beq _0808F64C
ldrb r0, [r4]
cmp r0, 0x30
beq _0808F6CA
ldrb r0, [r4, 0x1]
cmp r0, 0x30
beq _0808F6CA
b _0808F666
_0808F64C:
movs r0, 0x30
b _0808F672
_0808F650:
cmp r0, 0x9
bne _0808F684
ldr r3, [sp, 0x14]
cmp r3, 0
beq _0808F670
ldrb r0, [r4]
cmp r0, 0x31
beq _0808F6CA
ldrb r0, [r4, 0x1]
cmp r0, 0x31
beq _0808F6CA
_0808F666:
ldrh r0, [r4, 0x4]
mov r1, r10
orrs r0, r1
strh r0, [r4, 0x4]
b _0808F6DE
_0808F670:
movs r0, 0x31
_0808F672:
bl FindItemInInventory
cmp r0, 0
bge _0808F6CA
ldrh r0, [r4, 0x4]
mov r2, r10
orrs r0, r2
strh r0, [r4, 0x4]
b _0808F6DE
_0808F684:
cmp r0, 0xB
bne _0808F694
ldrb r1, [r4, 0x2]
movs r0, 0x1
ands r0, r1
cmp r0, 0
beq _0808F6CA
b _0808F6DE
_0808F694:
cmp r0, 0xC
bne _0808F6A4
ldrb r1, [r4, 0x2]
movs r0, 0x1
ands r0, r1
cmp r0, 0
bne _0808F6CA
b _0808F6DE
_0808F6A4:
cmp r0, 0xA
bne _0808F6CA
ldr r3, [sp, 0x14]
cmp r3, 0
beq _0808F6BC
ldrb r0, [r4]
cmp r0, 0x2F
beq _0808F6CA
ldrb r0, [r4, 0x1]
cmp r0, 0x2F
beq _0808F6CA
b _0808F6DE
_0808F6BC:
movs r0, 0x2F
bl FindItemInInventory
cmp r0, 0
bge _0808F6CA
movs r0, 0x1
mov r9, r0
_0808F6CA:
mov r1, r9
cmp r1, 0
bne _0808F6DE
ldrh r0, [r4, 0x4]
movs r1, 0x1
orrs r0, r1
strh r0, [r4, 0x4]
mov r2, sp
ldrh r2, [r2, 0x1C]
strh r2, [r4, 0x6]
_0808F6DE:
ldr r3, [sp, 0x18]
adds r3, 0x1
str r3, [sp, 0x18]
ldr r0, _0808F6FC
cmp r3, r0
bgt _0808F6EC
b _0808F4E0
_0808F6EC:
add sp, 0x20
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0808F6FC: .4byte 0x000001a7
thumb_func_end sub_808F468
thumb_func_start sub_808F700
sub_808F700:
push {r4,lr}
sub sp, 0x8
mov r4, sp
mov r1, sp
movs r2, 0
bl sub_808F468
ldrh r1, [r4, 0x4]
movs r0, 0x1
ands r0, r1
cmp r0, 0
beq _0808F71C
movs r0, 0x1
b _0808F72A
_0808F71C:
movs r0, 0x4
ands r0, r1
cmp r0, 0
bne _0808F728
movs r0, 0
b _0808F72A
_0808F728:
movs r0, 0x2
_0808F72A:
add sp, 0x8
pop {r4}
pop {r1}
bx r1
thumb_func_end sub_808F700
thumb_func_start sub_808F734
sub_808F734:
push {r4-r7,lr}
sub sp, 0x58
adds r5, r0, 0
lsls r4, r1, 16
asrs r4, 16
movs r6, 0
mov r0, sp
adds r1, r5, 0
movs r2, 0x58
bl memcpy
adds r0, r5, 0
adds r1, r4, 0
bl sub_808F798
adds r7, r0, 0
movs r0, 0x9E
lsls r0, 1
cmp r4, r0
bne _0808F782
mov r0, sp
strb r6, [r0, 0x2]
add r0, sp, 0x28
strb r6, [r0]
add r4, sp, 0x4C
ldr r5, _0808F794
adds r0, r5, 0
bl GetMonSpecies
adds r1, r0, 0
adds r0, r4, 0
movs r2, 0xA
bl BoundedCopyStringtoBuffer
mov r0, sp
adds r1, r5, 0
bl sub_808F798
adds r6, r0, 0
_0808F782:
cmp r6, 0
beq _0808F78A
bl sub_8097848
_0808F78A:
adds r0, r7, 0
add sp, 0x58
pop {r4-r7}
pop {r1}
bx r1
.align 2, 0
_0808F794: .4byte 0x0000013d
thumb_func_end sub_808F734
thumb_func_start sub_808F798
sub_808F798:
push {r4-r6,lr}

View File

@ -2,7 +2,7 @@
.global gDungeonMusic
gDungeonMusic: @ 80F5668
.incbin "baserom.gba", 0xF5668, 0x98
.2byte 0x72, 0x7d, 0x0e, 0x78, 0x0f, 0x71, 0x6f, 0x14, 0x66, 0x19, 0x68, 0x73, 0x6c, 0x16, 0x7d, 0x7d, 0x7d, 0x7d, 0x0d, 0x15, 0x0f, 0x7e, 0x21, 0x27, 0x7b, 0x7c, 0x17, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x1a, 0x6e, 0x6e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x1a, 0x7f, 0x23, 0x23, 0x23, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d
.global gUnknown_80F5700
gUnknown_80F5700: @ 80F5700
@ -41,6 +41,82 @@ gUnknown_80F57D4: @ 80F57D4
gUnknown_80F58F4: @ 80F58F4
.incbin "baserom.gba", 0xF58F4, 0x84
.global gUnknown_80F5978
gUnknown_80F5978: @ 80F5978
.incbin "baserom.gba", 0xF5978, 0x4C
.global gSecretPowerTable
gSecretPowerTable: @ 80F5978
.byte 0x03
.byte 0x00
.byte 0x06
.byte 0x07
.byte 0x07
.byte 0x06
.byte 0x06
.byte 0x07
.byte 0x08
.byte 0x06
.byte 0x00
.byte 0x05
.byte 0x08
.byte 0x08
.byte 0x00
.byte 0x08
.byte 0x08
.byte 0x07
.byte 0x07
.byte 0x07
.byte 0x00
.byte 0x05
.byte 0x06
.byte 0x08
.byte 0x06
.byte 0x00
.byte 0x00
.byte 0x08
.byte 0x06
.byte 0x01
.byte 0x07
.byte 0x07
.byte 0x01
.byte 0x01
.byte 0x06
.byte 0x08
.byte 0x08
.byte 0x07
.byte 0x06
.byte 0x06
.byte 0x06
.byte 0x00
.byte 0x06
.byte 0x06
.byte 0x05
.byte 0x08
.byte 0x06
.byte 0x06
.byte 0x06
.byte 0x03
.byte 0x00
.byte 0x00
.byte 0x05
.byte 0x02
.byte 0x07
.byte 0x06
.byte 0x00
.byte 0x08
.byte 0x08
.byte 0x06
.byte 0x00
.byte 0x07
.byte 0x00
.byte 0x00
.byte 0x06
.byte 0x01
.byte 0x06
.byte 0x06
.byte 0x08
.byte 0x08
.byte 0x06
.byte 0x08
.byte 0x08
.byte 0x03
.byte 0x03
.byte 0x06

View File

@ -2,5 +2,6 @@
.global gUnknown_8115EB8
gUnknown_8115EB8: @ 8115EB8
.incbin "baserom.gba", 0x115EB8, 0xA4
.string "pksdir0"
.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

View File

@ -1,25 +1,24 @@
struct unkStruct_802C39C
{
/* 0x0 */ u32 unk0[2];
/* 0x8 */ struct DungeonLocation *dungeon;
/* 0x8 */ struct WonderMailSub *unk8;
/* 0xC */ u8 *playerName;
/* 0x10 */ s16 clientSpecies;
/* 0x12 */ s16 targetSpecies;
/* 0x14 */ u8 targetItem;
/* 0x15 */ u8 fill15[0x2E - 0x15];
u8 unk2E;
u8 fill2F[0x34 - 0x2F];
u8 unk34;
/* 0x2E */ u8 rewardType;
u8 *unk30;
/* 0x34 */ u8 rewardItem;
u8 fill35[0x38 - 0x35];
/* 0x38 */ u8 unk38[0x40 - 0x38];
u8 unk40;
u8 unk41;
u8 unk42;
u8 mailTitleType;
u8 mailDescriptionType;
u8 mailMissionType;
u8 unk43;
u8 unk44;
u8 unk45;
u8 fill46[0x48 - 0x46];
u8 mailStatus; // mail status (suspend / take job / done)
/* 0x48 */ u32 y;
/* 0x4C */ u8 *unk4C;
/* 0x50 */ u8 *unk50[2];
u8 *unk50;
/* 0x54 */ struct WonderMail *mail;
};

View File

@ -2,7 +2,7 @@
#define GUARD_CODE_8077274_1_H
void MuzzleTarget(struct Entity *pokemon, struct Entity *target);
void sub_8078E18(struct Entity * pokemon, struct Entity * target);
void TransformStatusTarget(struct Entity * pokemon, struct Entity * target);
void MobileStatusTarget(struct Entity * pokemon, struct Entity * target);
void ExposeStatusTarget(struct Entity * pokemon, struct Entity * target, s16 param_3);
void IdentityItemHolders(struct Entity *pokemon, struct Entity *target);

View File

@ -3,13 +3,18 @@
#include "item.h"
struct WonderMailSub
{
/* 0x4 */ struct DungeonLocation dungeon;
u32 seed;
};
// size: 0x30
struct unkStruct_203B480
{
/* 0x0 */ u8 mailType;
/* 0x1 */ u8 missionType;
/* 0x4 */ struct DungeonLocation dungeon;
/* 0x8 */ u32 unk8;
struct WonderMailSub unk4;
/* 0xC */ s16 clientSpecies;
/* 0xE */ s16 targetSpecies;
union unk10_temp
@ -67,4 +72,4 @@ s32 GetFirstIndexofMailType(u8 mailType);
void sub_8095824(struct unkStruct_8094924 * a, struct unkStruct_203B480 *b);
void sub_8095774(struct unkStruct_8094924 * a, struct unkStruct_203B480 *b);
#endif
#endif

View File

@ -5,7 +5,7 @@ struct subStruct_203B490
{
// size: 0xC
struct DungeonLocation dungeon;
u32 unk4;
u32 seed;
u32 unk8;
};

View File

@ -0,0 +1,13 @@
#ifndef GUARD_CONSTANTS_EVOLUTION_STATUS_H
#define GUARD_CONSTANTS_EVOLUTION_STATUS_H
#define EVOLUTION_GOOD 1
#define EVOLUTION_LACK_LEVEL 1 << 1
#define EVOLUTION_NO_MORE 1 << 2
#define EVOLUTION_LACK_ITEM 1 << 3
#define EVOLUTION_LACK_IQ 1 << 4
#define EVOLUTION_LACK_FRIEND_AREA 1 << 5
#define EVOLUTION_LACK_ROOM 1 << 6
#endif // GUARD_CONSTANTS_EVOLUTION_STATUS_H

View File

@ -37,6 +37,24 @@ enum WonderMailTypes {
WONDER_MAIL_TYPE_OKD = 7,
};
// Used in CreateRescueTitle and CreateRescueDescription
enum MailStatuses {
MAIL_STATUS_SUSPENDED,
MAIL_STATUS_TAKE_JOB,
MAIL_STATUS_DONE
};
// Used in CreateRescueTitle and CreateRescueDescription
enum MissionTypes {
MISSION_TYPE_FRIEND_RESCUE,
MISSION_TYPE_FIND_ITEM,
MISSION_TYPE_DELIVER_ITEM,
MISSION_TYPE_RESCUE_CLIENT,
MISSION_TYPE_RESCUE_TARGET,
MISSION_TYPE_ESCORT_CLIENT,
MISSION_TYPE_SPECIAL_MISSION
};
enum WonderMailMissionTypes
{
WONDER_MAIL_MISSION_TYPE_RESCUE_CLIENT = 0,
@ -47,9 +65,12 @@ enum WonderMailMissionTypes
WONDER_MAIL_MISSION_TYPE_UNK6 = 6,
};
#define MAIL_STATUS_SUSPENDED 0
#define NUM_POKEMON_NEWS 56 // 50 normal + 6 special issues
#define PASSWORD_BUFFER_SIZE 54
#define MAX_ITEM_REWARDS 3
#endif //GUARD_CONSTANTS_WONDER_MAIL_H

View File

@ -272,7 +272,7 @@ struct Entity
// gets assigned the current counter value as its spawn index.
/* 0x26 */ u16 spawnGenID;
/* 0x28*/ struct EntitySpriteInfo spriteInfo;
struct OpenedFile *unk64;
struct OpenedFile *sprite;
s16 unk68;
u8 unk6A;
u8 unk6B;

View File

@ -120,7 +120,8 @@ struct Dungeon
u8 unk678;
u8 unk679;
u8 unk67A;
u8 unk67B[0x68A - 0x67B];
u8 unk67B[0x688 - 0x67B];
s16 unk688;
/* 0x68A */ u8 unk68A;
u8 fill68B[0x699 - 0x68B];
u8 unk699;
@ -128,12 +129,15 @@ struct Dungeon
/* 0x69C */ struct EntityInfo unk69C[4];
u8 fillEBC[0x363C - 0xEBC];
/* 0x363C */ u8 expYieldRankings[NUM_MONSTERS];
u8 fill37E3[0x37F4 - 0x37D9];
u8 fill37D9[0x37F0 - 0x37D9];
/* 0x37F0 */ u32 unk37F0;
/* 0x37F4 */ s32 unk37F4;
/* 0x37F8 */ bool8 plusIsActive[2]; // Index 0: Enemy , Index 1: Team
/* 0x37FA */ bool8 minusIsActive[2]; // Index 0: Enemy , Index 1: Team
/* 0x37FC */ bool8 decoyActive;
u8 fill37FD[0x3904 - 0x37FD];
u8 fill37FD[0x3800 - 0x37FD];
s16 unk3800;
u8 fill3802[0x3904 - 0x3802];
/* 0x3904 */ s16 unk3904;
u8 fill3906[0x3A08 - 0x3906];
/* 0x3A08 */ u8 unk3A08;
@ -201,7 +205,7 @@ struct Dungeon
/* 0x17B3C */ u32 unk17B3C;
u8 fill17B40[0x17B44 - 0x17B40];
/* 0x17B44 */ struct OpenedFile *sprites[MONSTER_MAX + 1];
u8 fill181E4[0x181E8 - 0x181E4];
/* 0x181E4 */ struct OpenedFile *paletFile;
/* 0x181E8 */ struct Position cameraPos;
/* 0x181EC */ struct Position cameraPosMirror;
/* 0x181F0 */ struct Position cameraPixelPos;

View File

@ -1,6 +1,9 @@
#ifndef GUARD_DUNGEON_RANDOM_H
#define GUARD_DUNGEON_RANDOM_H
void sub_808408C(u32 param_1);
u32 sub_80840A4(void);
void InitDungeonRNG(u32 value);
s32 DungeonRand16Bit(void);
s32 DungeonRandInt(s32 cap);
s32 DungeonRandRange(s32 low, s32 high);

View File

@ -23,15 +23,17 @@ void LoadFriendAreas(void);
bool8 *GetBoughtFriendAreas(void);
void InitializeFriendAreas(void);
u8 sub_80923D4(s32 target);
void sub_809249C(u8 friendArea, bool8 clear);
bool8 HasAllFriendAreas(void);
bool8 GetFriendAreaStatus(u8 index);
void UnlockFriendArea(u8 index);
u8 *GetFriendAreaDescription(u8 index);
u8 GetFriendAreaUnlockCondition(u8 index);
s32 GetFriendAreaPrice(u8 index);
void sub_8092578(u8 *buffer, u8 index, bool8 printPrice);
const char *GetFriendAreaName(u8 index);
void sub_809249C(u8 friendArea, u8 clear);
void sub_8092638(u8 friendArea, struct unkStruct_8092638 *param_2, u8 param_3, u8 param_4);
void sub_8092638(u8 friendArea, struct unkStruct_8092638 *param_2, bool8 checkLeader, bool8 checkDungeon);
u32 SaveFriendAreas(u8 *r0, u32 r1);
u32 ReadSavedFriendAreas(u8 *r0, s32 r1);

View File

@ -17,7 +17,7 @@ struct unkStruct_203B2BC
u32 moveIndex; // some sort of move index
u16 moveID;
struct Move moves[8];
u16 moveIDs[4]; // some list of move IDs
u16 moveIDs[MAX_MON_MOVES]; // some list of move IDs
u32 menuAction1;
u32 menuAction2;
u32 menuAction3;
@ -33,7 +33,29 @@ struct unkStruct_203B2BC
enum FriendAreaActionMenuStates {
FRIEND_AREA_ACTION_MENU_INIT,
FRIEND_AREA_ACTION_MENU_MAIN,
FRIEND_AREA_ACTION_MENU_MAIN_2,
FRIEND_AREA_ACTION_MENU_SUMMARY = 4,
FRIEND_AREA_ACTION_MENU_CHECK_IQ = 5,
FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_PROMPT = 8,
FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_CONFIRM,
FRIEND_AREA_ACTION_MENU_EXIT = 0x11,
};
enum FriendAreaActionMenuActions {
FRIEND_AREA_ACTION_MENU_ACTION_NONE = 1,
FRIEND_AREA_ACTION_MENU_ACTION_YES,
FRIEND_AREA_ACTION_MENU_ACTION_NO,
FRIEND_AREA_ACTION_MENU_ACTION_INFO = 4,
FRIEND_AREA_ACTION_MENU_ACTION_SUMMARY = 4,
FRIEND_AREA_ACTION_MENU_ACTION_CHECK_IQ,
FRIEND_AREA_ACTION_MENU_ACTION_JOIN_TEAM,
FRIEND_AREA_ACTION_MENU_ACTION_STANDBY,
FRIEND_AREA_ACTION_MENU_ACTION_MAKE_LEADER,
FRIEND_AREA_ACTION_MENU_ACTION_SAY_FAREWELL,
FRIEND_AREA_ACTION_MENU_ACTION_GIVE,
FRIEND_AREA_ACTION_MENU_ACTION_TAKE,
FRIEND_AREA_ACTION_MENU_ACTION_MOVES,
};
#endif

View File

@ -18,7 +18,7 @@ struct GroundScript_ExecutePP_1_sub
/* 0xE */ u8 unkE;
/* 0xF */ u8 fillF;
/* 0x10 */ u32 unk10;
/* 0x14 */ u32 unk14;
/* 0x14 */ u8 *unk14;
/* 0x18 */ u8 fill18[0x22 - 0x18];
/* 0x22 */ u16 unk22;
/* 0x24 */ u16 unk24;
@ -32,6 +32,7 @@ struct GroundScript_ExecutePP_1_sub2
Callback callbacks[10]; // IDK the size..
};
// size: 0x110
struct GroundScript_ExecutePP_1
{
struct GroundScript_ExecutePP_1_sub2 *unk0;
@ -40,7 +41,7 @@ struct GroundScript_ExecutePP_1
u32 unkC;
u16 unk10;
u8 unk12;
u8 fill18[0x24 - 0x13];
u8 *unk14[4];
struct GroundScript_ExecutePP_1_sub unk24;
struct GroundScript_ExecutePP_1_sub unk84;
u16 unkE4;

36
include/luminous_cave.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef GUARD_LUMINOUS_CAVE_H
#define GUARD_LUMINOUS_CAVE_H
#include "menu.h"
#include "text.h"
struct unkStruct_203B2B0
{
// size: 0x174
bool8 evolutionComplete;
struct EvolveStatus evolveStatus;
struct PokemonStruct *pokeStruct;
/* 0x10 */ bool8 pokeRenamed;
/* 0x14 */ u32 evoItem1_InvIndex; // inventory index of item
/* 0x18 */ u32 evoItem2_InvIndex; // inventory index of item
struct Item chosenItem;
u32 state;
u32 fallbackState;
u32 menuAction1;
u32 menuAction2;
u32 menuAction3;
struct MenuItem unk34[8];
u16 unk74[0x8];
struct MenuStruct unk84;
u8 fillD4[0x104 - 0xD4];
struct OpenedFile *unk104;
u8 *unk108;
u16 unk10C;
u16 unk10E;
u8 unk110;
u8 unk111;
u8 unk112;
struct UnkTextStruct2 unk114[4];
};
#endif // GUARD_LUMINOUS_CAVE_H

View File

@ -20,26 +20,29 @@ struct Offense
// size: 0x4
struct unkPokeSubStruct_C
{
u8 unk0;
u8 level;
u8 fill1[3];
};
enum PokemonUnk0Flags {
FLAG_ON_TEAM = 2,
};
// size: 0x58
struct PokemonStruct
{
u16 unk0; // recruited??
/* 0x2 */ bool8 isTeamLeader;
/* 0x3 */ u8 unkHasNextStage; // set to a random value?
/* 0x3 */ u8 level;
/* 0x4 */ struct DungeonLocation dungeonLocation;
/* 0x8 */ s16 speciesNum; // species #
struct unkPokeSubStruct_C unkC[2];
/* 0x14 */ s16 IQ;
/* 0x16 */ u16 pokeHP;
/* 0x18 */ struct Offense offense;
u32 unk1C;
/* 0x1C */ u32 currExp;
/* 0x20 */ u32 IQSkills;
u8 unk24;
u8 fill25[3];
/* 0x24 */ u8 tacticIndex;
/* 0x28 */ struct BulkItem heldItem;
/* 0x2C */ struct Move moves[MAX_MON_MOVES];
/* 0x4C */ u8 name[POKEMON_NAME_LENGTH];
@ -56,7 +59,7 @@ struct unkStruct_808E6F4
struct EvolveStage
{
/* 0x0 */ s16 speciesNum;
/* 0x2 */ u8 unkHasNextStage;
/* 0x2 */ u8 level;
};
// size: 0x24
@ -70,24 +73,23 @@ struct unkStruct_8094184
struct PokemonStruct2
{
u16 unk0; // corresponds to unk0 in PokemonStruct
/* 0x2 */ bool8 isTeamLeader; // unk2
/* 0x3 */ u8 unkHasNextStage; // unk3
/* 0x4 */ struct DungeonLocation dungeonLocation; // unk4
/* 0x8 */ u16 IQ; // IQ (other offset)
/* 0x2 */ bool8 isTeamLeader;
/* 0x3 */ u8 level;
/* 0x4 */ struct DungeonLocation dungeonLocation;
/* 0x8 */ u16 IQ;
s16 unkA;
u16 unkC;
/* 0xE */ s16 speciesNum; // speciesNum (other offset)
/* 0xE */ s16 speciesNum;
u16 unk10; // pokeHP
u16 unk12; // pokeHP
/* 0x14 */ struct Offense offense; // offense (other offset)
u32 unk18; // unk1C
/* 0x18 */ u32 currExp;
/* 0x1C */ struct unkStruct_8094184 moves;
/* 0x40 */ struct Item itemSlot; // heldItem
u32 unk44; // some struct
u32 unk48; // some struct (same type as 44)
/* 0x4C */ u32 IQSkills; // unk20
u8 unk50; // unk24
u8 fill51[3];
/* 0x50 */ u8 tacticIndex;
struct unkStruct_808E6F4 unk54;
/* 0x58 */ u8 name[POKEMON_NAME_LENGTH]; // name (other offset)
};
@ -104,13 +106,13 @@ struct unkStruct_203B45C
struct PreEvolution
{
/* 0x0 */ s16 evolveFrom;
/* 0x2 */ s16 evolveType;
/* 0x2 */ u16 evolveType;
};
// size: 0x4
struct EvolutionRequirements
{
/* 0x0 */ u16 mainRequirement;
/* 0x0 */ s16 mainRequirement;
/* 0x2 */ u16 additionalRequirement;
};

View File

@ -1,10 +1,30 @@
#ifndef GUARD_POKEMON_3_H
#define GUARD_POKEMON_3_H
struct EvolveStatus
{
u8 evoItem1;
u8 evoItem2;
u8 unk6;
u16 evolutionConditionStatus;
s16 targetEvolveSpecies;
};
bool8 HasRecruitedMon(s16 species);
s16 GetBaseSpecies(s16 index);
s16 GetBaseSpeciesNoUnown(s16 index);
bool8 TacticsTargetLeader(u8 tactic);
bool8 HasIQForSkill(s32 pokeIQ, u8 IQSkillIndex);
s32 GetNumAvailableIQSkills(u8 *iqSkillBuffer, s32 pokeIQ);
void CopyTacticsNameToBuffer(char *buffer, u8 tactic);
u8 *GetIQSkillName(u8 skill);
u8 *GetIQSkillDescription(u8 skill);
u8 *GetTacticsDescription(u8 tactic);
void ToggleIQSkill(u8 *param_1, u32 skillIndex);
void SetIQSkill(u8 *param_1, u32 skillIndex);
bool8 IsIQSkillSet(u8 *IQSkillFlags, u32 IQSkill);
void SetDefaultIQSkills(u8 *param_1, bool8 enableSelfCurer);
void sub_808F468(struct PokemonStruct *param_1, struct EvolveStatus *evolveStatus, u8 param_3);
u32 sub_808F734(struct PokemonStruct *pokemon, s16 _species);
#endif

View File

@ -66,5 +66,14 @@ enum WigglytuffStates
WIGGLYTUFF_CHECK_LEGENDARY = 0x1C,
};
bool8 sub_80211AC(u32 mode, u32 param_2);
bool8 sub_8021774(u8 friendArea, bool8 param_2, s32 param_3);
u32 sub_8021274(bool8 param_1);
u8 sub_802132C(void);
void sub_8021354(bool8 param_1);
void sub_80213A0(void);
void sub_8021494(void);
u32 sub_80217EC(void);
void sub_8021830(void);
#endif // GUARD_WIGGLYTUFF_SHOP_H

View File

@ -25,14 +25,13 @@ struct unkStruct_802F204
};
// size: 0x14
struct WonderMail
{
/* 0x0 */ u8 mailType; // mail type
/* 0x1 */ u8 missionType; // mission type
u8 unk2;
u8 unk3;
/* 0x4 */ struct DungeonLocation dungeon;
u32 unk8;
/* 0x4 */ struct WonderMailSub unk4;
/* 0xC */ s16 clientSpecies; // client pokemon
/* 0xE */ s16 targetSpecies; // target
/* 0x10 */ u8 targetItem; // item to find/deliver

View File

@ -99,7 +99,6 @@ SECTIONS {
src/code_801B3C0.o(.text);
src/code_801C620.o(.text);
src/code_801D760.o(.text);
asm/code_801D760.o(.text);
src/options_menu.o(.text);
src/hints_menu.o(.text);
src/gulpin_shop.o(.text);
@ -107,9 +106,6 @@ SECTIONS {
asm/code_801EE10.o(.text);
src/code_801EE10_mid.o(.text);
src/gulpin_shop_1.o(.text);
src/code_8021774_pre.o(.text);
asm/code_801EE10_mid.o(.text);
src/code_8021774.o(.text);
src/wigglytuff_shop.o(.text);
src/code_8023144_pre.o(.text);
asm/code_8023144.o(.text);
@ -120,8 +116,6 @@ SECTIONS {
src/friend_list_menu.o(.text);
src/party_list_menu.o(.text);
src/friend_area_action_menu.o(.text);
asm/friend_area_action_menu.o(.text);
src/friend_area_action_menu_1.o(.text);
src/wonder_mail.o(.text);
src/thank_you_wonder_mail.o(.text);
src/wonder_mail_2.o(.text);
@ -203,6 +197,8 @@ SECTIONS {
src/status_actions.o(.text);
src/move_checks.o(.text);
asm/code_805D8C8.o(.text);
src/code_805D8C8.o(.text);
asm/code_805D8C8_1.o(.text);
src/targeting.o(.text);
src/code_8069E0C.o(.text);
asm/code_8069E0C.o(.text);
@ -245,7 +241,6 @@ SECTIONS {
src/dungeon_leader.o(.text);
asm/code_8083654.o(.text);
src/dungeon_music.o(.text);
asm/dungeon_music.o(.text);
src/dungeon_random.o(.text);
src/code_808417C.o(.text);
asm/code_808417C.o(.text);
@ -397,7 +392,6 @@ SECTIONS {
src/friend_list_menu.o(.rodata);
src/party_list_menu.o(.rodata);
src/friend_area_action_menu.o(.rodata);
src/friend_area_action_menu_1.o(.rodata);
src/wonder_mail.o(.rodata);
src/thank_you_wonder_mail.o(.rodata);
src/wonder_mail_2.o(.rodata);

View File

@ -11,8 +11,7 @@
#include "config.h"
#include "game_options.h"
#include "sprite.h"
extern bool8 sub_80023E4(u8);
#include "event_flag.h"
extern struct GameOptions *gGameOptionsRef;

View File

@ -153,9 +153,9 @@ extern void sub_801CC38(void);
extern void sub_80140B4(struct UnkTextStruct2 *);
extern u32 sub_8097DF0(char *, struct subStruct_203B240 **);
extern void sub_8013F84(void);
extern char * GetIQSkillDescription(u8 r0);
extern s32 GetNumAvailableIQSkills(u8 *param_1, s32 pokeIQ);
extern char * GetIQSkillName(u8 r0);
extern void PlayMenuSoundEffect(u32);
extern void sub_8013C68(u32 *);
extern void xxx_format_and_draw(u32, u32, const u8 *, u32, u32);
extern u32 sub_80095E4(s16, u32);
extern void sub_801C440(void);
extern void sub_801C4C8(void);
@ -170,7 +170,6 @@ void sub_801C6E4(void);
void sub_801C848(void);
u32 sub_801C308(u8);
void ToggleIQSkill(u8 *param_1, u32 skillIndex);
s32 sub_801C390(void);
void sub_801C3F8(void);
@ -1266,4 +1265,4 @@ void sub_801D220(void)
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B250->unkB8, 1, 1);
}
}

View File

@ -17,6 +17,8 @@
#include "menu_input.h"
#include "code_8021774.h"
#include "code_80118A4.h"
#include "wigglytuff_shop.h"
#include "event_flag.h"
struct unkStruct_203B258
{
@ -32,6 +34,32 @@ extern struct unkStruct_203B258 *gUnknown_203B258;
extern struct UnkTextStruct2 gUnknown_80DBF88;
extern struct UnkTextStruct2 gUnknown_80DBF70;
struct unkStruct_811BAF4
{
s16 unk0;
s16 unk2;
s16 unk4;
s16 unk6;
u8 *text;
};
extern struct unkStruct_811BAF4 gUnknown_811BAF4[10];
struct unkStruct_81188F0
{
u8 *text1;
u8 *text2;
u8 *text3;
u8 *text4;
u32 unk1;
u32 unk2;
u32 unk3;
};
extern struct unkStruct_81188F0 gUnknown_81188F0[10];
extern u8 gUnknown_80DBFA0[]; // Field
extern void sub_801DB54();
extern void sub_801DBD4();
@ -103,7 +131,6 @@ struct unk_203B250 *gUnknown_203B250;
extern bool8 HasNoAcceptedJobs(void);
extern bool8 sub_8024108(u32);
extern bool8 sub_8096E2C(void);
extern bool8 sub_80023E4(u32);
extern u32 sub_801DCC4(void);
extern u32 sub_8027074(void);
extern void sub_80227B8(struct PokemonStruct *);
@ -151,7 +178,7 @@ void sub_801D3A8(void)
sub_801BEEC(gUnknown_203B250->index);
break;
case 10:
sub_8021774(gUnknown_203B250->currFriendAreaLocation, 1, 2);
sub_8021774(gUnknown_203B250->currFriendAreaLocation, TRUE, 2);
break;
case 11:
InitializeJobListMenu(0);
@ -575,3 +602,99 @@ void sub_801DB0C(void)
gUnknown_203B258 = NULL;
}
}
NAKED
void sub_801DB54(void)
{
asm_unified(
"\tpush {r4,lr}\n"
"\tldr r4, _0801DBD0\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0x9C\n"
"\tmovs r2, 0\n"
"\tmovs r1, 0x1\n"
"\tstrb r1, [r0]\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0x9D\n"
"\tstrb r2, [r0]\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0x9E\n"
"\tmovs r1, 0x8\n"
"\tstrb r1, [r0]\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0x9F\n"
"\tstrb r2, [r0]\n"
"\tbl ResetUnusedInputStruct\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0x3C\n"
"\tmovs r1, 0x1\n"
"\tmovs r2, 0x1\n"
"\tbl sub_800641C\n"
"\tldr r0, [r4]\n"
"\tmovs r1, 0x1A\n"
"\tldrsh r0, [r0, r1]\n"
"\tmovs r1, 0xC\n"
"\tbl sub_80095E4\n"
"\tadds r0, 0x2\n"
"\tlsls r0, 16\n"
"\tldr r2, [r4]\n"
"\tldr r3, [r2, 0x34]\n"
"\tlsls r1, r3, 1\n"
"\tadds r1, r3\n"
"\tlsls r1, 3\n"
"\tadds r1, r2, r1\n"
"\tadds r1, 0x4A\n"
"\tasrs r3, r0, 16\n"
"\tlsrs r0, 16\n"
"\tstrh r0, [r1]\n"
"\tldr r1, [r2, 0x34]\n"
"\tlsls r0, r1, 1\n"
"\tadds r0, r1\n"
"\tlsls r0, 3\n"
"\tadds r2, r0\n"
"\tadds r3, 0x2\n"
"\tadds r2, 0x4C\n"
"\tstrh r3, [r2]\n"
"\tbl ResetUnusedInputStruct\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0x3C\n"
"\tmovs r1, 0x1\n"
"\tmovs r2, 0x1\n"
"\tbl sub_800641C\n"
"\tpop {r4}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_0801DBD0: .4byte gUnknown_203B258");
}
void sub_801DBD4(void)
{
struct unkStruct_811BAF4 *temp;
struct unkStruct_81188F0 *temp2;
s32 y;
#ifndef NONMATCHING
register s32 x asm("r4");
#else
s32 x;
#endif
s16 index;
int counter;
sub_8008C54(gUnknown_203B258->unk34);
sub_80073B8(gUnknown_203B258->unk34);
xxx_call_draw_string(10,0,gUnknown_80DBFA0,gUnknown_203B258->unk34,0); // Field
x = gUnknown_203B258->unk9C[2] * 8 - 2;
sub_8012BC4(x,0,gUnknown_203B258->input.unk1E + 1,2,7,gUnknown_203B258->unk34);
for(counter = 0; counter < gUnknown_203B258->input.unk1A; counter++)
{
index = gUnknown_203B258->input.unk1E * gUnknown_203B258->input.unk1C + counter;
temp = &gUnknown_811BAF4[index];
temp2 = &gUnknown_81188F0[temp->unk4];
y = sub_8013800(&gUnknown_203B258->input, counter);
xxx_call_draw_string(8,y,temp2->text1,gUnknown_203B258->unk34,0);
y = sub_8013800(&gUnknown_203B258->input,counter);
xxx_call_draw_string(0x3e,y,temp->text,gUnknown_203B258->unk34,0);
}
sub_80073E0(gUnknown_203B258->unk34);
}

View File

@ -9,6 +9,7 @@
#include "text_util.h"
#include "menu_input.h"
#include "code_80118A4.h"
#include "event_flag.h"
struct unkStruct_203B2AC
{
@ -49,7 +50,6 @@ extern struct unkStruct_3001B60 *gUnknown_3001B60;
extern struct UnkTextStruct2 gUnknown_80DC9B0;
extern struct UnkTextStruct2 gUnknown_80DC9C8;
extern bool8 sub_80023E4(u32);
extern void sub_808FF20(u32 *, struct PokemonStruct *, bool8);
extern void CreatePokemonInfoTabScreen(u32, s16, u32 *, u32 *, u32);
extern void sub_802452C(void);

View File

@ -1,445 +0,0 @@
#include "constants/friend_area.h"
#include "global.h"
#include "input.h"
#include "memory.h"
#include "text1.h"
#include "text2.h"
#include "pokemon.h"
#include "exclusive_pokemon.h"
#include "friend_area.h"
#include "code_800D090.h"
#include "menu_input.h"
#include "code_8021774.h"
#include "code_80118A4.h"
struct unkStruct_203B28C
{
struct MenuInputStructSub unk0;
u8 friendArea;
u8 unkD;
s16 unkE[0x10];
u32 unk30[0x10];
s32 unk70;
s32 unk74;
struct UnkTextStruct2 *unk78;
struct UnkTextStruct2 unk7C[4];
u8 unkDC[4];
};
extern struct unkStruct_203B28C *gUnknown_203B28C;
struct unkStruct_203B280
{
u8 unk0[NUM_FRIEND_AREAS];
u32 unk3C;
struct MenuInputStruct unk40;
s32 unk74;
struct UnkTextStruct2 *unk78;
struct UnkTextStruct2 unk7C[4];
u8 unkDC[4];
};
extern struct unkStruct_203B280 *gUnknown_203B280;
extern struct UnkTextStruct2 gUnknown_80DC4BC;
extern struct UnkTextStruct2 gUnknown_80DC4D8;
s16 GetBaseSpeciesNoUnown(s16 index);
s32 sub_8021B58(s16 param_1);
extern u8 gUnknown_80DC518[];
extern u8 gUnknown_80DC4F0[];
extern u8 *gUnknown_80D49BC[];
extern u8 gUnknown_80DC524[];
extern void sub_8008C54(u32);
extern void sub_8092578(u8 *buffer, u8 index, u8 r2);
extern void sub_8021878(void);
extern void sub_8021894(void);
extern void sub_8021A60(void);
void sub_8021820(void);
u8 sub_80023E4(u32);
s32 sub_8021664(void)
{
s32 index;
s32 counter;
counter = 0;
switch(gUnknown_203B280->unk3C)
{
case 0:
for(index = BOUNTIFUL_SEA; index < NUM_FRIEND_AREAS; index++)
{
gUnknown_203B280->unk0[counter] = index;
counter++;
}
break;
case 1:
for(index = BOUNTIFUL_SEA; index < NUM_FRIEND_AREAS; index++)
{
if(gFriendAreas[index])
{
gUnknown_203B280->unk0[counter] = index;
counter++;
}
}
break;
case 2:
for(index = BOUNTIFUL_SEA; index < NUM_FRIEND_AREAS; index++)
{
if (gFriendAreas[index] == 0) {
switch(GetFriendAreaUnlockCondition(index))
{
case UNLOCK_SHOP_STORY:
gUnknown_203B280->unk0[counter] = index;
counter++;
break;
case UNLOCK_SHOP_POST_GAME:
if(sub_80023E4(6) != 0) {
gUnknown_203B280->unk0[counter] = index;
counter++;
}
break;
}
}
}
break;
}
return counter;
}
u8 sub_8021700(u32 mode)
{
s32 index;
switch(mode)
{
case 0:
return FALSE;
case 1:
for(index = BOUNTIFUL_SEA; index < NUM_FRIEND_AREAS; index++)
{
if (gFriendAreas[index] != 0) {
return FALSE;
}
}
break;
case 2:
for(index = BOUNTIFUL_SEA; index < NUM_FRIEND_AREAS; index++)
{
if (gFriendAreas[index] == 0) {
switch(GetFriendAreaUnlockCondition(index))
{
case UNLOCK_SHOP_STORY:
return FALSE;
case UNLOCK_SHOP_POST_GAME:
if(sub_80023E4(6) != 0) {
return FALSE;
}
break;
}
}
}
break;
}
return TRUE;
}
bool8 sub_8021774(u8 friendArea, u8 param_2, s32 param_3)
{
gUnknown_203B28C = MemoryAlloc(sizeof(struct unkStruct_203B28C), 8);
gUnknown_203B28C->friendArea = friendArea;
gUnknown_203B28C->unkD = param_2;
sub_801317C(&gUnknown_203B28C->unk0);
sub_8021A60();
gUnknown_203B28C->unk74 = param_3;
gUnknown_203B28C->unk78 = &gUnknown_203B28C->unk7C[param_3];
sub_8006518(gUnknown_203B28C->unk7C);
gUnknown_203B28C->unk7C[gUnknown_203B28C->unk74] = gUnknown_80DC4D8;
sub_8021820();
return TRUE;
}
u32 sub_80217EC(void)
{
switch(sub_8012A64(&gUnknown_203B28C->unk0, gUnknown_203B28C->unk74))
{
case 2:
PlayMenuSoundEffect(1);
return 2;
case 1:
PlayMenuSoundEffect(0);
return 3;
default:
return 0;
}
}
void sub_8021820(void)
{
sub_8021878();
sub_8021894();
}
void sub_8021830(void)
{
if(gUnknown_203B28C)
{
gUnknown_203B28C->unk7C[gUnknown_203B28C->unk74] = gUnknown_80DC4BC;
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B28C->unk7C, 1, 1);
MemoryFree(gUnknown_203B28C);
gUnknown_203B28C = NULL;
}
}
void sub_8021878(void)
{
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B28C->unk7C, 1, 1);
}
void sub_8021894(void)
{
u8 *string;
s32 iVar1;
u32 y;
u32 x;
s32 index;
u8 buffer1 [256];
u8 buffer2 [100];
sub_80073B8(gUnknown_203B28C->unk74);
sub_8092578(buffer1,gUnknown_203B28C->friendArea,0);
xxx_call_draw_string(0x14,0,buffer1,gUnknown_203B28C->unk74,0);
string = GetFriendAreaDescription(gUnknown_203B28C->friendArea);
xxx_call_draw_string(10,0x14,string,gUnknown_203B28C->unk74,0);
if (gUnknown_203B28C->unkD != 0) {
xxx_call_draw_string(0x20,0x3c,gUnknown_80DC4F0,gUnknown_203B28C->unk74,0);
}
else {
xxx_call_draw_string(0x20,0x3c,gUnknown_80DC518,gUnknown_203B28C->unk74,0); // Inhabitants
}
sub_800792C(gUnknown_203B28C->unk74,4,0x40,0x14,4);
if (gUnknown_203B28C->unkD != 0) {
sub_800792C(gUnknown_203B28C->unk74,0xb8,0x40,0x14,4);
}
else {
sub_800792C(gUnknown_203B28C->unk74,0x5e,0x40,0x6e,4);
}
sub_800792C(gUnknown_203B28C->unk74,4,0x82,200,4);
sub_8007A78(gUnknown_203B28C->unk74,3,0x40,0x43,4);
sub_8007A78(gUnknown_203B28C->unk74,0xcc,0x40,0x43,4);
for(index = 0; index < gUnknown_203B28C->unk70; index++)
{
iVar1 = index % 3;
x = iVar1 * 0x3f + 7;
iVar1 = index / 3;
y = iVar1 * 0xc + 0x47;
sub_808D930(buffer2, gUnknown_203B28C->unkE[index]);
switch(gUnknown_203B28C->unk30[index])
{
case 0:
xxx_call_draw_string(x,y,*gUnknown_80D49BC,gUnknown_203B28C->unk74,0); // ???
break;
case 1:
xxx_call_draw_string(x,y,buffer2,gUnknown_203B28C->unk74,0); // %s
break;
case 2:
sprintfStatic(buffer1,gUnknown_80DC524,buffer2); // {CYAN} %s {END_COLOR}
xxx_call_draw_string(x,y,buffer1,gUnknown_203B28C->unk74,0);
break;
}
}
sub_80073E0(gUnknown_203B28C->unk74);
}
// https://decomp.me/scratch/P2BiC
// 99.40% matching (Seth)
#ifndef NONMATCHING
NAKED
void sub_8021A60(void)
{
asm_unified(
"\tpush {r4-r7,lr}\n"
"\tldr r2, _08021B4C\n"
"\tldr r1, [r2]\n"
"\tmovs r0, 0\n"
"\tstr r0, [r1, 0x70]\n"
"\tmovs r6, 0\n"
"\tadds r4, r2, 0\n"
"\tmovs r3, 0\n"
"_08021A70:\n"
"\tldr r1, [r4]\n"
"\tlsls r2, r6, 1\n"
"\tadds r0, r1, 0\n"
"\tadds r0, 0xE\n"
"\tadds r0, r2\n"
"\tstrh r3, [r0]\n"
"\tlsls r0, r6, 2\n"
"\tadds r1, 0x30\n"
"\tadds r1, r0\n"
"\tstr r3, [r1]\n"
"\tadds r6, 0x1\n"
"\tcmp r6, 0xF\n"
"\tble _08021A70\n"
"\tmovs r6, 0\n"
"\tldr r7, _08021B4C\n"
"_08021A8E:\n"
"\tlsls r0, r6, 16\n"
"\tasrs r5, r0, 16\n"
"\tldr r4, [r7]\n"
"\tadds r0, r5, 0\n"
"\tbl GetFriendArea\n"
"\tldrb r1, [r4, 0xC]\n"
"\tlsls r0, 24\n"
"\tlsrs r0, 24\n"
"\tcmp r1, r0\n"
"\tbne _08021AC4\n"
"\tadds r0, r5, 0\n"
"\tbl GetBaseSpeciesNoUnown\n"
"\tlsls r0, 16\n"
"\tasrs r0, 16\n"
"\tcmp r5, r0\n"
"\tbne _08021AC4\n"
"\tldr r3, [r7]\n"
"\tldr r1, [r3, 0x70]\n"
"\tlsls r2, r1, 1\n"
"\tadds r0, r3, 0\n"
"\tadds r0, 0xE\n"
"\tadds r0, r2\n"
"\tstrh r5, [r0]\n"
"\tadds r1, 0x1\n"
"\tstr r1, [r3, 0x70]\n"
"_08021AC4:\n"
"\tadds r6, 0x1\n"
"\tldr r0, _08021B50\n"
"\tcmp r6, r0\n"
"\tble _08021A8E\n"
"\tmovs r6, 0\n"
"_08021ACE:\n"
"\tlsls r0, r6, 16\n"
"\tasrs r4, r0, 16\n"
"\tadds r0, r4, 0\n"
"\tbl sub_8098134\n"
"\tlsls r0, 24\n"
"\tcmp r0, 0\n"
"\tbeq _08021AFC\n"
"\tadds r0, r4, 0\n"
"\tbl sub_8021B58\n"
"\tadds r2, r0, 0\n"
"\tmovs r0, 0x1\n"
"\tnegs r0, r0\n"
"\tcmp r2, r0\n"
"\tbeq _08021AFC\n"
"\tldr r0, _08021B4C\n"
"\tldr r1, [r0]\n"
"\tlsls r0, r2, 2\n"
"\tadds r1, 0x30\n"
"\tadds r1, r0\n"
"\tmovs r0, 0x1\n"
"\tstr r0, [r1]\n"
"_08021AFC:\n"
"\tadds r6, 0x1\n"
"\tldr r0, _08021B50\n"
"\tcmp r6, r0\n"
"\tble _08021ACE\n"
"\tmovs r6, 0\n"
"\tldr r4, _08021B54\n"
"_08021B08:\n"
"\tmovs r0, 0x58\n"
"\tadds r1, r6, 0\n"
"\tmuls r1, r0\n"
"\tldr r0, [r4]\n"
"\tadds r2, r0, r1\n"
"\tldrb r1, [r2]\n"
"\tmovs r0, 0x1\n"
"\tands r0, r1\n"
"\tcmp r0, 0\n"
"\tbeq _08021B3C\n"
"\tmovs r1, 0x8\n"
"\tldrsh r0, [r2, r1]\n"
"\tbl sub_8021B58\n"
"\tadds r2, r0, 0\n"
"\tmovs r0, 0x1\n"
"\tnegs r0, r0\n"
"\tcmp r2, r0\n"
"\tbeq _08021B3C\n"
"\tldr r0, _08021B4C\n"
"\tldr r1, [r0]\n"
"\tlsls r0, r2, 2\n"
"\tadds r1, 0x30\n"
"\tadds r1, r0\n"
"\tmovs r0, 0x2\n"
"\tstr r0, [r1]\n"
"_08021B3C:\n"
"\tadds r6, 0x1\n"
"\tmovs r0, 0xCE\n"
"\tlsls r0, 1\n"
"\tcmp r6, r0\n"
"\tble _08021B08\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_08021B4C: .4byte gUnknown_203B28C\n"
"_08021B50: .4byte 0x000001a7\n"
"_08021B54: .4byte gRecruitedPokemonRef");
}
#else
void sub_8021A60(void)
{
s32 sVar4;
s32 iVar6;
s32 index;
struct PokemonStruct *pokeStruct;
gUnknown_203B28C->unk70 = 0;
for(index = 0; index < 0x10; index++)
{
gUnknown_203B28C->unkE[index] = 0;
gUnknown_203B28C->unk30[index] = 0;
}
for(index = 0; index < 0x1A8; index++)
{
if ((gUnknown_203B28C->friendArea == GetFriendArea((s16)index)) &&
((s16)index == GetBaseSpeciesNoUnown(index))) {
iVar6 = gUnknown_203B28C->unk70;
gUnknown_203B28C->unkE[iVar6] = index;
gUnknown_203B28C->unk70 = iVar6 + 1;
}
}
for(index = 0; index < 0x1A8; index++)
{
if ((sub_8098134(index) != '\0') && (sVar4 = sub_8021B58(index), sVar4 != -1)) {
gUnknown_203B28C->unk30[sVar4] = 1;
}
}
for(index = 0; index < 0x19d; index++)
{
pokeStruct = &gRecruitedPokemonRef->pokemon[index];
if (((*(u8 *)&pokeStruct->unk0 & 1) != 0) &&
(sVar4 = sub_8021B58(pokeStruct->speciesNum), sVar4 != -1)) {
gUnknown_203B28C->unk30[sVar4] = 2;
}
}
return;
}
#endif
s32 sub_8021B58(s16 species)
{
s32 baseSpecies;
int index;
baseSpecies = GetBaseSpeciesNoUnown(species);
for(index = 0; index < gUnknown_203B28C->unk70; index++)
{
if (baseSpecies == gUnknown_203B28C->unkE[index]) return index;
}
return -1;
}

View File

@ -1,136 +0,0 @@
#include "global.h"
#include "code_80118A4.h"
#include "code_801EE10_mid.h"
#include "code_8021774_pre.h"
#include "constants/friend_area.h"
#include "constants/input.h"
#include "friend_area.h"
#include "input.h"
#include "memory.h"
#include "text1.h"
#include "text2.h"
#include "item.h"
#include "team_inventory.h"
#include "menu_input.h"
// size: 0xE0
struct unkStruct_203B280
{
u8 unk0[NUM_FRIEND_AREAS];
u32 unk3C;
struct MenuInputStruct unk40;
s32 unk74;
struct UnkTextStruct2 *unk78;
struct UnkTextStruct2 unk7C[4];
u8 unkDC[4];
};
extern struct unkStruct_203B280 *gUnknown_203B280;
extern u32 gUnknown_203B284;
extern u16 gUnknown_203B288;
extern u16 gUnknown_203B28A;
extern struct UnkTextStruct2 gUnknown_80DC47C;
extern struct UnkTextStruct2 gUnknown_80DC464;
u8 sub_8021700(u32 mode);
s32 sub_8021664(void);
extern void sub_8021410(void);
bool8 sub_80211AC(u32 param_1, u32 param_2)
{
if(sub_8021700(param_1))
{
return FALSE;
}
else {
gUnknown_203B280 = MemoryAlloc(sizeof(struct unkStruct_203B280), 8);
gUnknown_203B280->unk3C = param_1;
gUnknown_203B280->unk74 = param_2;
gUnknown_203B280->unk78 = &gUnknown_203B280->unk7C[gUnknown_203B280->unk74];
sub_8006518(gUnknown_203B280->unk7C);
gUnknown_203B280->unk7C[gUnknown_203B280->unk74] = gUnknown_80DC47C;
gUnknown_203B280->unk78->unk14 = gUnknown_203B280->unkDC;
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B280->unk7C, 1, 1);
sub_8013818(&gUnknown_203B280->unk40, sub_8021664(), 10, param_2);
if(gUnknown_203B284 == gUnknown_203B280->unk3C)
{
gUnknown_203B280->unk40.menuIndex = gUnknown_203B288;
gUnknown_203B280->unk40.unk1E = gUnknown_203B28A;
sub_8013984(&gUnknown_203B280->unk40);
}
sub_8021410();
sub_8021494();
return TRUE;
}
}
u32 sub_8021274(bool8 param_1)
{
if (param_1 == 0) {
sub_8013660(&gUnknown_203B280->unk40);
return 0;
}
switch(GetKeyPress(&gUnknown_203B280->unk40))
{
case INPUT_B_BUTTON:
PlayMenuSoundEffect(1);
return 2;
case INPUT_A_BUTTON:
if ((gUnknown_203B280->unk3C == 2) && (GetFriendAreaPrice(sub_802132C()) > gTeamInventoryRef->teamMoney))
{
PlayMenuSoundEffect(2);
}
else
{
PlayMenuSoundEffect(0);
}
return 3;
case INPUT_START_BUTTON:
PlayMenuSoundEffect(4);
return 4;
default:
if (sub_80138B8(&gUnknown_203B280->unk40, 1) != 0) {
sub_8021410();
sub_8021494();
return 1;
}
else {
return 0;
}
}
}
u8 sub_802132C(void)
{
return gUnknown_203B280->unk0[gUnknown_203B280->unk40.unk1E * gUnknown_203B280->unk40.unk1C + gUnknown_203B280->unk40.menuIndex];
}
void sub_8021354(bool8 param_1)
{
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B280->unk7C,0,0);
gUnknown_203B280->unk40.unk22 = sub_8021664();
sub_8013984(&gUnknown_203B280->unk40);
sub_8021410();
sub_8021494();
if (param_1) {
AddMenuCursorSprite(&gUnknown_203B280->unk40);
}
}
void sub_80213A0(void)
{
if(gUnknown_203B280)
{
gUnknown_203B284 = gUnknown_203B280->unk3C;
gUnknown_203B288 = gUnknown_203B280->unk40.menuIndex;
gUnknown_203B28A = gUnknown_203B280->unk40.unk1E;
gUnknown_203B280->unk7C[gUnknown_203B280->unk74] = gUnknown_80DC464;
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B280->unk7C, 1, 1);
MemoryFree(gUnknown_203B280);
gUnknown_203B280 = NULL;
}
}

View File

@ -17,6 +17,7 @@
#include "code_80130A8.h"
#include "code_801B3C0.h"
#include "code_80118A4.h"
#include "exclusive_pokemon.h"
struct unkStruct_3001B5C
{
@ -47,7 +48,6 @@ extern struct UnkTextStruct2 gUnknown_80DC904;
void sub_8023758(void);
void sub_80237E0(void);
extern bool8 sub_8098134(s32);
extern void sub_8023730(void);
extern u8 sub_8023704(u8);
extern void sub_8023420(void);
@ -68,7 +68,7 @@ extern void sub_801B048(void);
void GetGummiItemStatBoost(struct PokemonStruct* pokemon, u8 id, bool8 checkBoostFlags, struct Gummi* gummi);
extern void sub_8099690(u32);
s32 GetNumAvailableIQSkills(u8 *iqSkillBuffer, s32 pokeIQ);
extern void sub_801A928(void);
void sub_8022D2C(void) {
s32 index;
@ -460,7 +460,7 @@ void sub_8023420(void)
extern u8 gUnknown_80DC934[];
bool8 HasRecruitedMon(s16 species_);
extern void sub_8008C54(u32);
extern u8 gUnknown_80DC93C[];
void sub_80234BC(void)
@ -485,7 +485,7 @@ void sub_80234BC(void)
{
y = sub_8013800(&gUnknown_3001B5C->input,index);
species = gUnknown_3001B5C->unkC[(gUnknown_3001B5C->input.unk1E * gUnknown_3001B5C->input.unk1C + index)];
sub_8092638(GetFriendArea(species),&auStack_2c,0,0);
sub_8092638(GetFriendArea(species),&auStack_2c,FALSE,FALSE);
color = COLOR_WHITE_2;
if (auStack_2c.hasFriendArea) {
color = HasRecruitedMon(species) ? COLOR_CYAN : COLOR_GREEN;

View File

@ -1,15 +1,472 @@
#include "global.h"
#include "constants/colors.h"
#include "constants/wonder_mail.h"
#include "pokemon.h"
#include "pokemon_3.h"
#include "event_flag.h"
#include "exclusive_pokemon.h"
#include "code_8094F88.h"
#include "code_802C39C.h"
#include "text_util.h"
#include "text2.h"
#include "code_800D090.h"
#include "menu_input.h"
#include "wonder_mail.h"
struct unkStruct_80E9920
{
s16 unkA;
s16 unkB;
u8 *text;
};
struct unkStruct_80E9F8C
{
s16 unkA;
s16 unkB;
u8 *text1;
u8 *text2;
};
extern s16 gUnknown_80E80E0[];
extern s16 gUnknown_80E8126[];
extern u8 gUnknown_80E888C[];
extern u8 *gUnknown_80E8BCC[];
extern u8 gMankeyMissionDescription[];
extern u8 gSmeargleMissionDescription[];
extern u8 gMedichamMissionDescription[];
extern u8 gUnknown_202DE58[];
extern u8 gUnknown_80E8968[];
extern u8 gUnknown_80E89B0[];
extern u8 gAvailablePokemonNames[];
extern u8 gDifficultyText[];
extern u8 gPlaceText[];
extern u8 gUnknown_80E8AD0[];
extern u8 gUnknown_80E8AE0[];
extern u8 gUnknown_80E8AEC[];
extern u8 gUnknown_80E8B10[];
extern u8 gUnknown_80E8AFC[];
extern u8 gUnknown_80E8B20[];
extern u8 gUnknown_80E8B40[];
extern u8 gUnknown_80E8B2C[];
extern u8 *gUnknown_80EB220[];
extern u8 gRewardText[];
extern u8 *gMissionRewardText[];
extern u8 gUnknown_80E8B7C[];
extern u8 *gUnknown_80EB2F0[];
extern u8 gUnknown_80E89FC[];
extern u8 gUnknown_80E8A40[];
extern u8 gUnknown_80E8A7C[];
extern u8 *gUnknown_80E8DE4[];
extern u8 *gUnknown_80E8FB0[];
extern u8 *gUnknown_80E91D4[];
extern u8 *gUnknown_80E9820[10];
extern u8 *gUnknown_80EAEB8[];
extern u8 gSpecialMissionText[];
extern u8 *gUnknown_80EB198[];
extern u8 *gUnknown_80EB3F8[];
extern u8 *gUnknown_80EB72C[22];
extern u8 gUnknown_80E8AC8[];
extern u8 gUnknown_80E8884[];
extern u8 gMankeyMission[];
extern u8 gSmeargleMission[];
extern u8 gMedichamMission[];
extern u8 gUnknown_80E8830[];
extern u8 gUnknown_80E8848[];
extern u8 gUnknown_80E885C[];
extern u8 gUnknown_80E8AC8[];
extern u8 *gUnknown_80E910C[];
extern u8 *gUnknown_80E8C98[];
extern u8 gUnknown_80E886C[];
extern u8 *gUnknown_80EAE5C[];
extern struct unkStruct_80E9F8C gUnknown_80E9F8C[10];
extern struct unkStruct_80E9920 gUnknown_80E9920[10];
extern u8 *gUnknown_80E8B94[];
extern struct PokemonStruct *GetPlayerPokemonStruct(void);
extern struct PokemonStruct *sub_808D378(void);
extern bool8 sub_803C0DC(s16);
extern bool8 sub_8098134(s16);
extern s16 GetBaseSpecies(s16);
extern bool8 sub_80023E4(u32);
s32 sub_8016028(void);
extern void PrintDungeonLocationtoBuffer(u8 *, void *);
extern void PrintYellowDungeonNametoBuffer(u8 *, void *);
extern u8 sub_803C1D0(struct WonderMailSub *, u8);
extern u8 *sub_803C1F0(u8);
void sub_803D414(u8 *, struct WonderMail *);
void sub_803B6B0(s32 x, s32 y, u8 index, u32 param_4)
{
xxx_call_draw_string(x,y,gUnknown_80E8B94[index],param_4,0);
}
void CreateRescueTitle(struct unkStruct_802C39C *param_1)
{
char buf_1 [200];
char buf_2 [20];
char buf_3 [100];
u8 *monName;
u8 uVar1;
sub_803B6B0(10,param_1->y,param_1->unk43,param_1->unk0[0]);
switch(param_1->mailTitleType) {
case 3:
xxx_call_draw_string(0x15,param_1->y,param_1->unk4C,param_1->unk0[0],0);
break;
case 0:
xxx_call_draw_string(0x15,param_1->y,gMankeyMission,param_1->unk0[0],0);
break;
case 1:
xxx_call_draw_string(0x15,param_1->y,gSmeargleMission,param_1->unk0[0],0);
break;
case 2:
xxx_call_draw_string(0x15,param_1->y,gMedichamMission,param_1->unk0[0],0);
break;
case 7:
PrintYellowDungeonNametoBuffer(buf_1, param_1->unk8);
xxx_call_draw_string(0x15,param_1->y,buf_1,param_1->unk0[0],0);
break;
case 12:
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80E8830,gUnknown_202DE58);
xxx_call_draw_string(0x15,param_1->y,buf_1,param_1->unk0[0],0);
break;
case 11:
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80E8848,gUnknown_202DE58);
xxx_call_draw_string(0x15,param_1->y,buf_1,param_1->unk0[0],0);
break;
case 4:
xxx_call_draw_string(0x15,param_1->y,gUnknown_80E885C,param_1->unk0[0],0);
break;
case 5:
xxx_call_draw_string(0x15,param_1->y,gUnknown_80E9F8C[param_1->unk0[1]].text1,param_1->unk0[0],0);
break;
case 6:
xxx_call_draw_string(0x15,param_1->y,gUnknown_80E886C,param_1->unk0[0],0);
break;
case 10: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80EAE5C[(bVar2 & 3)],gAvailablePokemonNames);
xxx_call_draw_string(0x15,param_1->y,buf_1,param_1->unk0[0],0);
break;
}
case 9: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E910C[(bVar2 % 0xA)],gAvailablePokemonNames);
xxx_call_draw_string(0x15,param_1->y,buf_1,param_1->unk0[0],0);
break;
}
default: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E8C98[(bVar2 % 0xf)],gAvailablePokemonNames);
xxx_call_draw_string(0x15,param_1->y,buf_1,param_1->unk0[0],0);
break;
}
}
if (param_1->mailTitleType == 7) {
if (param_1->playerName == NULL) {
xxx_call_draw_string(0xb2 - sub_8016028(),param_1->y,GetMonSpecies(param_1->clientSpecies),param_1->unk0[0],0);
}
else {
sub_80922B4(buf_2,param_1->playerName,POKEMON_NAME_LENGTH);
xxx_call_draw_string(0xb2 - sub_8016028(),param_1->y,buf_2,param_1->unk0[0],0);
}
}
else {
if (param_1->mailMissionType == MISSION_TYPE_FIND_ITEM) {
PrintDungeonLocationtoBuffer(buf_3, param_1->unk8);
sprintfStatic(buf_1,gUnknown_80E8884,buf_3); // Near %s
}
else {
PrintDungeonLocationtoBuffer(buf_1, param_1->unk8);
}
xxx_call_draw_string(0x1d,param_1->y + 0xc,buf_1,param_1->unk0[0],0);
}
if (param_1->mailTitleType == 7) {
uVar1 = sub_803C1D0(param_1->unk8,0);
}
else {
uVar1 = sub_803C1D0(param_1->unk8,param_1->mail->missionType);
}
xxx_call_draw_string(0xb4,param_1->y,sub_803C1F0(uVar1),param_1->unk0[0],0);
}
void CreateRescueDescription(struct unkStruct_802C39C *param_1)
{
u8 uVar3;
int x;
int counter;
u32 color;
s32 y;
char buf_1 [300];
char buf_2 [40];
char buf_3 [20];
char buf_4 [20];
char buf_5 [100];
u8 local_34 [24];
u8 *monName;
y = 0;
xxx_call_draw_string(10,y,gUnknown_80E888C,param_1->unk0[0],0);
xxx_call_draw_string(0x6c,y,gUnknown_80E8BCC[param_1->mailStatus],param_1->unk0[0],0);
y += 0x10;
switch(param_1->mailDescriptionType) {
case 3:
xxx_call_draw_string(10,y,param_1->unk50,param_1->unk0[0],0);
break;
case 0:
xxx_call_draw_string(10,y,gMankeyMissionDescription,param_1->unk0[0],0);
break;
case 1:
xxx_call_draw_string(10,y,gSmeargleMissionDescription,param_1->unk0[0],0);
break;
case 2:
xxx_call_draw_string(10,y,gMedichamMissionDescription,param_1->unk0[0],0);
break;
case 4:
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80E8968,gUnknown_202DE58);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
break;
case 5:
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80E89B0,gUnknown_202DE58);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
break;
case 6:
xxx_call_draw_string(10,y,gUnknown_80E9920[param_1->unk0[1]].text,param_1->unk0[0],0);
break;
case 7:
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E9F8C[param_1->unk0[1]].text2,gAvailablePokemonNames,gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
break;
case 9:
xxx_call_draw_string(10,y,gUnknown_80E89FC,param_1->unk0[0],0); // This is a rescue through communication. Get a friend to help you!
break;
case 10:
xxx_call_draw_string(10,y,gUnknown_80E8A40,param_1->unk0[0],0); // This is a rescue through communication. Rescue a friend!
break;
case 11:
xxx_call_draw_string(10,y,gUnknown_80E8A7C,param_1->unk0[0],0); // This is a rescue through communication. Send your thanks to a friend!
break;
case 15:
case 16: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
u8 bVar3 = param_1->unk8->seed + param_1->unk8->dungeon.floor;
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80EB3F8[(bVar2 % 0x16)],gUnknown_202DE58);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y += 0xC;
sprintfStatic(buf_1,gUnknown_80EB72C[(bVar3 % 0x16)],gUnknown_202DE58);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y -= 0xC;
break;
}
case 14: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
u8 bVar3 = param_1->unk8->seed + param_1->unk8->dungeon.floor;
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80EAEB8[(bVar2 % 0x14)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y += 0xC;
sprintfStatic(buf_1,(gUnknown_80EB198)[(bVar3 & 3)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y -= 0xC;
break;
}
case 8: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
u8 bVar3 = param_1->unk8->seed + param_1->unk8->dungeon.floor;
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80EB220[(bVar2 % 6)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y += 0xC;
sprintfStatic(buf_1,gUnknown_80EB2F0[(bVar3 % 0x6)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y -= 0xC;
break;
}
case 13: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
u8 bVar3 = param_1->unk8->seed + param_1->unk8->dungeon.floor;
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E91D4[(bVar2 % 0x2d)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y += 0xC;
sprintfStatic(buf_1,gUnknown_80E9820[(bVar3 % 10)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y -= 0xC;
break;
}
default: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
u8 bVar3 = param_1->unk8->seed + param_1->unk8->dungeon.floor;
monName = GetMonSpecies(param_1->clientSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E8DE4[(bVar2 % 0xd)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y += 0xC;
sprintfStatic(buf_1,gUnknown_80E8FB0[(bVar3 % 0xd)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y -= 0xC;
break;
}
}
y += 0x1C;
xxx_call_draw_string(10,y,gUnknown_80E8AC8,param_1->unk0[0],0);
if (param_1->playerName == NULL) {
xxx_call_draw_string(0x44,y,GetMonSpecies(param_1->clientSpecies),param_1->unk0[0],0);
}
else {
sub_80922B4(buf_3,param_1->playerName,POKEMON_NAME_LENGTH);
sub_808D930(buf_4,param_1->clientSpecies);
sprintfStatic(buf_2,gUnknown_80E8AD0,buf_3,buf_4);
xxx_call_draw_string(0x44,y,buf_2,param_1->unk0[0],0);
}
y += 0xC;
xxx_call_draw_string(10,y,gUnknown_80E8AE0,param_1->unk0[0],0);
switch(param_1->mailMissionType) {
case MISSION_TYPE_FRIEND_RESCUE:
xxx_call_draw_string(0x44,y,gUnknown_80E8AEC,param_1->unk0[0],0); // Friend Rescue
break;
case MISSION_TYPE_DELIVER_ITEM:
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80E8AFC,gUnknown_202DE58); // Deliver #C4%s#R.
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case MISSION_TYPE_FIND_ITEM:
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80E8B10,gUnknown_202DE58); // Find #C4%s#R.
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case MISSION_TYPE_RESCUE_CLIENT:
xxx_call_draw_string(0x44,y,gUnknown_80E8B20,param_1->unk0[0],0); // Help me.
break;
case MISSION_TYPE_ESCORT_CLIENT:
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E8B2C,gAvailablePokemonNames); // Escort to #C6%s#R.
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case MISSION_TYPE_RESCUE_TARGET:
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E8B40,gAvailablePokemonNames);
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case MISSION_TYPE_SPECIAL_MISSION:
default:
xxx_call_draw_string(0x44,y,gSpecialMissionText,param_1->unk0[0],0);
break;
}
y += 0xC;
xxx_call_draw_string(10,y,gPlaceText,param_1->unk0[0],0);
// NOTE: check with TRUE is needed to match
if (param_1->mailMissionType == MISSION_TYPE_FIND_ITEM) {
PrintDungeonLocationtoBuffer(buf_5,param_1->unk8);
sprintfStatic(buf_1,gUnknown_80E8884,buf_5); // Near %s
}
else {
PrintDungeonLocationtoBuffer(buf_1,param_1->unk8);
}
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
if (param_1->mailMissionType == MISSION_TYPE_FRIEND_RESCUE) {
uVar3 = sub_803C1D0(param_1->unk8, 0);
}
else {
uVar3 = sub_803C1D0(param_1->unk8,param_1->mail->missionType);
}
y += 0xC;
xxx_call_draw_string(10,y,gDifficultyText,param_1->unk0[0],0);
xxx_call_draw_string(0x44,y,sub_803C1F0(uVar3),param_1->unk0[0],0);
y += 0xC;
xxx_call_draw_string(10,y,gRewardText,param_1->unk0[0],0);
switch(param_1->rewardType) {
case 0:
sprintfStatic(buf_1,gMissionRewardText[param_1->rewardType],param_1->unk30);
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case 1:
sprintfStatic(buf_1,gMissionRewardText[param_1->rewardType],param_1->unk30);
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case 2: // Item
case 3: // Item + ?
sub_8090DC4(gUnknown_202DE58,param_1->rewardItem,0);
sprintfStatic(buf_1,gMissionRewardText[param_1->rewardType],gUnknown_202DE58);
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case 4: // Friend Area
xxx_call_draw_string(0x44,y,gMissionRewardText[param_1->rewardType],param_1->unk0[0],0);
break;
default:
xxx_call_draw_string(0x44,y,gMissionRewardText[param_1->rewardType],param_1->unk0[0],0);
break;
}
// Draw the Password
y += 0xC;
if (((2 < (u8)(param_1->mailDescriptionType - 9)) && (param_1->mailDescriptionType != 3)) && (param_1->mail->mailType == 5))
{
xxx_call_draw_string(10,y,gUnknown_80E8B7C,param_1->unk0[0],0); // Wonder Mail:
sub_803D414(local_34,param_1->mail);
for(counter = 0; counter < 24; counter++)
{
if (counter == 12) {
y += 12;
}
color = COLOR_WHITE_2;
if (((3 < counter) && (color = COLOR_YELLOW, 7 < counter)) && ((color = COLOR_WHITE_2)))
{
if(counter > 15)
{
if(counter < 20)
{
color = COLOR_YELLOW;
}
}
}
x = counter % 12;
sub_8012C60(x * 10 + 0x54,y,local_34[counter],color,param_1->unk0[0]);
}
}
}
bool8 sub_803C0DC(s16 species)
{
s32 baseSpecies;
s32 index;
baseSpecies = GetBaseSpecies(species);
index = 0;
if (gUnknown_80E80E0[index] != MONSTER_NONE)
{
while(gUnknown_80E80E0[index] != MONSTER_NONE) {
if (gUnknown_80E80E0[index] == baseSpecies) {
return FALSE;
}
index++;
}
}
return TRUE;
}
bool8 sub_803C110(s16 index)
{

View File

@ -22,7 +22,7 @@
typedef bool8 (*MoveCallback)(struct Entity *pokemon, struct Entity *target, struct Move *move, s32 param_4);
struct NaturePowerMove
{
s16 moveID;
u16 moveID;
u16 unk2;
MoveCallback move;
};
@ -502,18 +502,18 @@ bool8 sub_8057C88(struct Entity *pokemon, struct Entity *target, struct Move * m
return flag;
}
s32 sub_8057CD0(struct Entity * pokemon, struct Entity * target, struct Move * move, u32 param_4)
bool32 sub_8057CD0(struct Entity * pokemon, struct Entity * target, struct Move * move, u32 param_4)
{
u32 uVar1;
s32 iVar2;
u32 weather;
s32 flag;
uVar1 = GetApparentWeather(pokemon);
iVar2 = sub_80556BC(pokemon,target,gUnknown_80F51E4[uVar1],move,
gUnknown_80F51EC[uVar1],param_4);
if (iVar2 != 0) {
iVar2 = 1;
weather = GetApparentWeather(pokemon);
flag = sub_80556BC(pokemon,target,gUnknown_80F51E4[weather],move,
gUnknown_80F51EC[weather],param_4);
if (flag) {
flag = TRUE;
}
return iVar2;
return flag;
}
bool8 WhirlpoolMoveAction(struct Entity * pokemon, struct Entity * target, struct Move * move, u32 param_4)

View File

@ -13,6 +13,7 @@
#include "friend_area.h"
#include "item.h"
#include "pokemon.h"
#include "pokemon_3.h"
#include "position_util.h"
#include "exclusive_pokemon.h"
@ -330,7 +331,6 @@ extern void IncreaseEntityPixelPos(struct Entity *, u32, u32);
extern void sub_8042B0C(struct Entity *);
extern void DisplayDungeonDialogue(u32 *);
extern void sub_803E708(u32, u32);
extern u8 HasRecruitedMon(u32);
extern u8 sub_806FD18(struct Entity *);
extern void sub_80861D4(struct Entity *, u32, s32 direction);
extern void sub_806FDF4(struct Entity *, struct Entity *, struct Entity **);
@ -390,7 +390,6 @@ extern u8 JirachiFriendAreaSearch(void);
extern u8 sub_80860A8(u32);
extern void sub_8049ED4();
extern void sub_8092578(u8 *buffer, u8 index, u8 r2);
extern void sub_8052D44(s16 *, struct Entity *, struct Entity *);
extern void SetMessageArgument(u8 *, struct Entity *, u32);
extern struct Entity *GetLeader();
@ -3736,7 +3735,7 @@ void JirachiWish(void)
PlaySoundEffect(0xd4);
LeaderEntity = GetLeader();
SetMessageArgument(gAvailablePokemonNames,LeaderEntity,0);
sub_8092578(gUnknown_202DE58,friendArea,0);
sub_8092578(gUnknown_202DE58,friendArea,FALSE);
// Obtained the friend area!
DisplayDungeonDialogue(&gUnknown_8105B68);
}

View File

@ -51,7 +51,7 @@ extern s16 gUnknown_80F4E00;
extern u8 *gUnknown_80FD128[];
extern u8 *gUnknown_80FAD2C[];
extern u32 gUnknown_80F4F64;
extern u8 gUnknown_80F5978[];
extern u8 gSecretPowerTable[];
extern s16 gUnknown_80F4E74;
extern s16 gUnknown_80F4E06;
extern s16 gUnknown_80F4E94[];
@ -1271,7 +1271,7 @@ bool8 SecretPowerMoveAction(struct Entity * pokemon, struct Entity * target, str
if ( sub_8055640(pokemon, target, move, 0x100, param_4) != 0) {
flag = TRUE;
if (sub_805727C(pokemon,target,gUnknown_80F4E06) != 0) {
switch(gUnknown_80F5978[gDungeon->tileset]) {
switch(gSecretPowerTable[gDungeon->tileset]) {
case 0:
PoisonedStatusTarget(pokemon,target,FALSE);
break;

139
src/code_805D8C8.c Normal file
View File

@ -0,0 +1,139 @@
#include "global.h"
#include "file_system.h"
#include "dungeon_global_data.h"
#include "dungeon_util.h"
extern struct FileArchive gMonsterFileArchive;
extern u8 gUnknown_8106EA0[]; // ax%03d
extern int sprintf(char *, const char *, ...);
void sub_8068838(s16, bool32);
void sub_80688B0(void);
void sub_8068884(void);
void sub_8068768(void)
{
struct Entity *entity;
int index;
for(index = 0; index < DUNGEON_MAX_POKEMON; index++)
{
entity = gDungeon->allPokemon[index];
if ((entity != NULL) && EntityExists(entity)) {
sub_8068838(entity->info->apparentID, FALSE);
}
}
}
void sub_80687AC(void)
{
gDungeon->unk37F0 = 0x400;
gDungeon->unk37F4 = 0xA;
}
struct OpenedFile *sub_80687D0(s16 _id)
{
s32 id = _id;
return gDungeon->sprites[id];
}
// 85.94 matching (Seth)
// https://decomp.me/scratch/CI98Y
//
#ifdef NONMATCING
void sub_80687EC(s32 _id)
{
u8 name [12];
s16 id = _id;
if (gDungeon->sprites[id] == NULL) {
sprintf(name,gUnknown_8106EA0);
gDungeon->sprites[id] = OpenFileAndGetFileDataPtr(name,&gMonsterFileArchive);
}
}
#else
NAKED
void sub_80687EC(s32 _id)
{
asm_unified(
"\tpush {r4,r5,lr}\n"
"\tsub sp, 0xC\n"
"\tlsls r0, 16\n"
"\tasrs r2, r0, 16\n"
"\tldr r5, _08068828\n"
"\tldr r0, [r5]\n"
"\tlsls r4, r2, 2\n"
"\tldr r1, _0806882C\n"
"\tadds r0, r1\n"
"\tadds r0, r4\n"
"\tldr r0, [r0]\n"
"\tcmp r0, 0\n"
"\tbne _08068820\n"
"\tldr r1, _08068830\n"
"\tmov r0, sp\n"
"\tbl sprintf\n"
"\tldr r1, _08068834\n"
"\tmov r0, sp\n"
"\tbl OpenFileAndGetFileDataPtr\n"
"\tldr r1, [r5]\n"
"\tldr r2, _0806882C\n"
"\tadds r1, r2\n"
"\tadds r1, r4\n"
"\tstr r0, [r1]\n"
"_08068820:\n"
"\tadd sp, 0xC\n"
"\tpop {r4,r5}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_08068828: .4byte gDungeon\n"
"_0806882C: .4byte 0x00017b44\n"
"_08068830: .4byte gUnknown_8106EA0\n"
"_08068834: .4byte gMonsterFileArchive");
}
#endif
void sub_8068838(s16 id, bool32 _param_2)
{
s32 id_s32 = id;
bool8 param_2 = _param_2;
if ((param_2 == 0) &&
((id_s32 == MONSTER_DEOXYS_NORMAL) || (id_s32 == MONSTER_DEOXYS_ATTACK) || (id_s32 == MONSTER_DEOXYS_DEFENSE) || (id_s32 == MONSTER_DEOXYS_SPEED))) {
sub_80688B0();
}
else {
sub_80687EC(id_s32);
if ((u16)(id_s32 - MONSTER_CASTFORM) < 4) {
sub_8068884();
}
}
}
void sub_8068884(void)
{
sub_80687EC(MONSTER_CASTFORM);
sub_80687EC(MONSTER_CASTFORM_SNOWY);
sub_80687EC(MONSTER_CASTFORM_SUNNY);
sub_80687EC(MONSTER_CASTFORM_RAINY);
}
void sub_80688B0(void)
{
sub_80687EC(gDungeon->unk3800);
}
void CloseAllSpriteFiles(void)
{
s32 index;
for(index = 0; index < 0x1A8; index++)
{
if (gDungeon->sprites[index] != NULL) {
CloseFile(gDungeon->sprites[index]);
gDungeon->sprites[index] = NULL;
}
}
}

View File

@ -15,6 +15,7 @@ extern void sub_806CCB4(struct Entity *, u8);
extern void sub_803E46C(u32);
extern bool8 sub_808DA44(s32 a1_, u32 a2_);
extern u32 sub_806CF98(struct Entity *);
extern struct OpenedFile *sub_80687D0(s16);
void sub_806CDD4(struct Entity *, u8, u32);
extern const u8 gUnknown_8106EEF[];
@ -71,7 +72,7 @@ void sub_806CCB4(struct Entity *entity, u8 param_2)
sVar1 = entity->unk68;
if (info->waitingStatus != STATUS_DECOY && !flag)
sub_80053AC(&entity->spriteInfo, entity->unk64, entity->unk6A, entity->direction, sVar1, Rand32Bit() & 3, FALSE);
sub_80053AC(&entity->spriteInfo, entity->sprite, entity->unk6A, entity->direction, sVar1, Rand32Bit() & 3, FALSE);
else
sub_80053AC(&entity->spriteInfo, sub_80687D0(MONSTER_DECOY), entity->unk6A, entity->direction, sVar1, Rand32Bit() & 3, FALSE);

View File

@ -174,6 +174,7 @@ extern void EntityUpdateStatusSprites(struct Entity *);
extern void sub_8042A74(struct Entity *r0);
extern void sub_807EC28(bool8);
extern s32 sub_8069F54(struct Entity *param_1, s16 param_2);
extern struct OpenedFile *sub_80687D0(s16);
extern void sub_806A898(struct Entity *, u32, u32);
extern void HealTargetHP(struct Entity *pokemon, struct Entity *r1, s16, s16, u32);
extern void sub_806CE68(struct Entity *, s32);
@ -236,7 +237,7 @@ void MuzzleTarget(struct Entity *pokemon, struct Entity *target)
}
}
void sub_8078E18(struct Entity * pokemon, struct Entity * target)
void TransformStatusTarget(struct Entity * pokemon, struct Entity * target)
{
s16 species;
s32 iVar5;
@ -279,7 +280,7 @@ void sub_8078E18(struct Entity * pokemon, struct Entity * target)
sub_80522F4(pokemon, target, *gUnknown_80FBEE4);
else {
entityInfo->apparentID = apparentID;
target->unk64 = iVar9;
target->sprite = iVar9;
entityInfo->transformStatus = STATUS_TRANSFORMED;
entityInfo->transformStatusTurns = CalculateStatusTurns(target, gUnknown_80F4EFC, TRUE) + 1;
sub_806CF98(target);
@ -480,7 +481,7 @@ void RestorePPTarget(struct Entity * pokemon,struct Entity * target, s32 param_3
{
movePtr = &entityInfo->moves[index];
movePtr1 = movePtr;
if ((movePtr->moveFlags & MOVE_FLAG_EXISTS) != 0) {
if ((movePtr->moveFlags & MOVE_FLAG_EXISTS)) {
PP = movePtr->PP;
basePP = GetMoveBasePP(movePtr1);
if (PP < basePP) {
@ -1124,7 +1125,7 @@ void sub_8079F20(struct Entity * pokemon, struct Entity * target, u8 param_3, u8
if ((move->moveFlags & MOVE_FLAG_EXISTS) && (move->moveFlags2 & MOVE_FLAG_EXISTS)) {
bVar8 = TRUE;
moveUnsealed = TRUE;
move->moveFlags2 &= 0xfe;
move->moveFlags2 &= ~(MOVE_FLAG_EXISTS);
}
}
@ -1158,8 +1159,8 @@ void sub_807A0CC(struct Entity * pokemon, struct Entity * target)
for(index = 0; index < MAX_MON_MOVES; index++)
{
move = &entityInfo->moves[index];
if ((move->moveFlags & MOVE_FLAG_EXISTS) != 0) {
move->moveFlags2 = move->moveFlags2 & 0xfe;
if ((move->moveFlags & MOVE_FLAG_EXISTS)) {
move->moveFlags2 &= ~(MOVE_FLAG_EXISTS);
}
}
EntityUpdateStatusSprites(target);
@ -1506,7 +1507,7 @@ void SendTransformEndMessage(struct Entity * pokemon, struct Entity *target)
break;
case STATUS_TRANSFORMED:
entityInfo->apparentID = sub_8069F54(target, entityInfo->id);
target->unk64 = sub_80687D0(entityInfo->apparentID);
target->sprite = sub_80687D0(entityInfo->apparentID);
uVar3 = sub_806CEBC(target);
sub_806CCB4(target,uVar3);
SendMessage(target,*gUnknown_80FAB6C);

View File

@ -7,13 +7,12 @@
#include "dungeon_music.h"
#include "dungeon_pokemon_attributes.h"
#include "pokemon.h"
#include "pokemon_3.h"
#include "dungeon_util_1.h"
#include "dungeon_util.h"
#include "exclusive_pokemon.h"
extern void SetDefaultIQSkills(u8 *param_1, u8 param_2);
extern u8 sub_8044B28(void);
extern u8 HasRecruitedMon(u32);
extern u8 gUnknown_202E038[];
extern void sub_8085374();
extern void sub_80855E4(void *);

View File

@ -66,7 +66,7 @@ void sub_8095118(void)
struct unkStruct_203B480 *unused;
MemoryFill8((u8*)gUnknown_203B480,0, 0x20 * sizeof(struct unkStruct_203B480));
MemoryFill8((u8*)gUnknown_203B484,0, 0x5c);
MemoryFill8((u8*)gUnknown_203B484,0, sizeof(struct unkStruct_203B484));
for(index = 0; index < 0x20; index++){
// NOTE: we use a temp variable here to force the match
@ -124,12 +124,6 @@ bool8 sub_80951BC(struct unkStruct_203B480 *mail)
}
}
struct unkStruct_809542C
{
struct DungeonLocation unk0;
u32 unk4;
};
bool8 sub_80951FC(struct unkStruct_203B480 *param_1)
{
bool8 bVar1 = gUnknown_203B480[1].mailType != 0;
@ -281,9 +275,9 @@ s32 sub_8095400(u32 param_1)
return -1;
}
void sub_809542C(struct unkStruct_809542C *param_1)
void sub_809542C(struct WonderMailSub *param_1)
{
u32 uVar4;
u32 seed;
#ifndef NONMATCHING
register struct unkStruct_203B480 *preload asm("r2");
@ -295,31 +289,31 @@ void sub_809542C(struct unkStruct_809542C *param_1)
gUnknown_203B480->mailType = 1;
preload = gUnknown_203B480;
uVar4 = param_1->unk4;
preload->dungeon = param_1->unk0;
preload->unk8 = uVar4;
seed = param_1->seed;
preload->unk4.dungeon = param_1->dungeon;
preload->unk4.seed = seed;
sub_8094D28(Rand32Bit());
gUnknown_203B480->unk10.unk10 = sub_8094E4C();
gUnknown_203B480->clientSpecies = GetPlayerPokemonStruct()->speciesNum;
PrintPokeNameToBuffer(buffer, GetPlayerPokemonStruct());
CopyStringtoBuffer(gUnknown_203B480->playerName, buffer);
gUnknown_203B480->unk24 = sub_8011C34();
gUnknown_203B480->rescuesAllowed = GetRescuesAllowed(gUnknown_203B480->dungeon.id);
gUnknown_203B480->rescuesAllowed = GetRescuesAllowed(gUnknown_203B480->unk4.dungeon.id);
}
void sub_8095494(struct unkStruct_809542C *param_1, u8 index)
void sub_8095494(struct WonderMailSub *param_1, u8 index)
{
u32 uVar1;
struct DungeonLocation temp;
u32 seed;
struct DungeonLocation dungeon;
struct unkStruct_203B480 *mail;
mail = gUnknown_203B480;
mail += index;
temp = mail->dungeon;
uVar1 = mail->unk8;
param_1->unk0 = temp;
param_1->unk4 = uVar1;
dungeon = mail->unk4.dungeon;
seed = mail->unk4.seed;
param_1->dungeon = dungeon;
param_1->seed = seed;
}
u32 sub_80954B4(void)
@ -346,7 +340,7 @@ u32 sub_80954CC(u8 *a, u32 b)
memset(temp, 0, sizeof(struct PokemonStruct));
RestoreIntegerBits(&backup, &temp->unk0, 2);
RestoreIntegerBits(&backup, &temp->isTeamLeader, 1);
RestoreIntegerBits(&backup, &temp->unkHasNextStage, 7);
RestoreIntegerBits(&backup, &temp->level, 7);
RestoreDungeonLocation(&backup, &temp->dungeonLocation);
RestoreIntegerBits(&backup, &temp->speciesNum, 9);
xxx_restore_poke_sub_c_808F410(&backup, &temp->unkC[0]);
@ -357,9 +351,9 @@ u32 sub_80954CC(u8 *a, u32 b)
RestoreIntegerBits(&backup, &temp->offense.att[1], 8);
RestoreIntegerBits(&backup, &temp->offense.def[0], 8);
RestoreIntegerBits(&backup, &temp->offense.def[1], 8);
RestoreIntegerBits(&backup, &temp->unk1C, 0x18);
RestoreIntegerBits(&backup, &temp->currExp, 0x18);
RestoreIntegerBits(&backup, &temp->IQSkills, 0x18);
RestoreIntegerBits(&backup, &temp->unk24, 4);
RestoreIntegerBits(&backup, &temp->tacticIndex, 4);
RestoreHeldItem(&backup, &temp->heldItem);
RestorePokemonMoves(&backup, temp->moves);
RestoreIntegerBits(&backup, temp->name, 0x50);
@ -388,7 +382,7 @@ u32 sub_8095624(u8 *a, u32 b)
temp = &gUnknown_203B484->unk4;
SaveIntegerBits(&backup, &temp->unk0, 2);
SaveIntegerBits(&backup, &temp->isTeamLeader, 1);
SaveIntegerBits(&backup, &temp->unkHasNextStage, 7);
SaveIntegerBits(&backup, &temp->level, 7);
SaveDungeonLocation(&backup, &temp->dungeonLocation);
SaveIntegerBits(&backup, &temp->speciesNum, 9);
xxx_save_poke_sub_c_808F41C(&backup, &temp->unkC[0]);
@ -399,9 +393,9 @@ u32 sub_8095624(u8 *a, u32 b)
SaveIntegerBits(&backup, &temp->offense.att[1], 8);
SaveIntegerBits(&backup, &temp->offense.def[0], 8);
SaveIntegerBits(&backup, &temp->offense.def[1], 8);
SaveIntegerBits(&backup, &temp->unk1C, 0x18);
SaveIntegerBits(&backup, &temp->currExp, 0x18);
SaveIntegerBits(&backup, &temp->IQSkills, 0x18);
SaveIntegerBits(&backup, &temp->unk24, 4);
SaveIntegerBits(&backup, &temp->tacticIndex, 4);
SaveHeldItem(&backup, &temp->heldItem);
SavePokemonMoves(&backup, temp->moves);
SaveIntegerBits(&backup, temp->name, 0x50);
@ -420,8 +414,8 @@ void sub_8095774(struct unkStruct_8094924 * a, struct unkStruct_203B480 *b)
u8 temp;
RestoreIntegerBits(a, &b->mailType, 4);
RestoreDungeonLocation(a, &b->dungeon);
RestoreIntegerBits(a, &b->unk8, 0x18);
RestoreDungeonLocation(a, &b->unk4.dungeon);
RestoreIntegerBits(a, &b->unk4.seed, 0x18);
RestoreIntegerBits(a, &b->clientSpecies, 0x9);
RestoreIntegerBits(a, &b->unk10.unk10, 0x20);
RestoreIntegerBits(a, &b->playerName, 0x50);
@ -445,8 +439,8 @@ void sub_8095824(struct unkStruct_8094924 * a, struct unkStruct_203B480 *b)
zero = 0;
SaveIntegerBits(a, &b->mailType, 4);
SaveDungeonLocation(a, &b->dungeon);
SaveIntegerBits(a, &b->unk8, 0x18);
SaveDungeonLocation(a, &b->unk4.dungeon);
SaveIntegerBits(a, &b->unk4.seed, 0x18);
SaveIntegerBits(a, &b->clientSpecies, 0x9);
SaveIntegerBits(a, &b->unk10.unk10, 0x20);
SaveIntegerBits(a, &b->playerName, 0x50);

View File

@ -8,10 +8,10 @@
#include "dungeon.h"
#include "code_80958E8.h"
#include "pokemon.h"
#include "pokemon_3.h"
#include "code_8094F88.h"
extern bool8 sub_809017C(struct DungeonLocation *);
extern s16 GetBaseSpecies(s16);
extern u8 sub_803C1D0(struct DungeonLocation *, u8);
extern bool8 sub_803C0DC(s16);
extern void ResetMailboxSlot(u8);
@ -58,7 +58,7 @@ void InitializeMailJobsNews(void)
{
gUnknown_203B490->unk230[index].dungeon.id = 99;
gUnknown_203B490->unk230[index].dungeon.floor = 1;
gUnknown_203B490->unk230[index].unk4 = 0;
gUnknown_203B490->unk230[index].seed = 0;
gUnknown_203B490->unk230[index].unk8 = 0;
}
}
@ -85,17 +85,17 @@ bool8 ValidateWonderMail(struct WonderMail *data)
return FALSE;
else
{
if(data->missionType == WONDER_MAIL_MISSION_TYPE_DELIVER_ITEM && GetMaxItemsAllowed(data->dungeon.id) == 0)
if(data->missionType == WONDER_MAIL_MISSION_TYPE_DELIVER_ITEM && GetMaxItemsAllowed(data->unk4.dungeon.id) == 0)
return FALSE;
if(data->unk2 > 9)
return FALSE;
if(sub_809095C(data->dungeon.id))
if(sub_809095C(data->unk4.dungeon.id))
return FALSE;
if(data->dungeon.floor >= GetDungeonFloorCount(data->dungeon.id))
if(data->unk4.dungeon.floor >= GetDungeonFloorCount(data->unk4.dungeon.id))
return FALSE;
if(sub_809017C(&data->dungeon))
if(sub_809017C(&data->unk4.dungeon))
return FALSE;
if(data->clientSpecies == MONSTER_NONE)
@ -127,7 +127,7 @@ bool8 ValidateWonderMail(struct WonderMail *data)
return FALSE;
// Item finding
if(data->missionType == WONDER_MAIL_MISSION_TYPE_FIND_ITEM && xxx_bit_lut_lookup_8091E50(data->dungeon.id, data->targetItem) == 0)
if(data->missionType == WONDER_MAIL_MISSION_TYPE_FIND_ITEM && xxx_bit_lut_lookup_8091E50(data->unk4.dungeon.id, data->targetItem) == 0)
return FALSE;
if(data->rewardType == BLANK_4 || data->rewardType == END_REWARDS || data->rewardType > END_REWARDS)
@ -144,7 +144,7 @@ bool8 ValidateWonderMail(struct WonderMail *data)
{
if(GetFriendAreaUnlockCondition(data->friendAreaReward) != UNLOCK_WONDER_MAIL)
return FALSE;
if(sub_803C1D0(&data->dungeon, data->missionType) == 0)
if(sub_803C1D0(&data->unk4.dungeon, data->missionType) == 0)
return FALSE;
}
return TRUE;

View File

@ -7,6 +7,7 @@
#include "code_80958E8.h"
#include "team_inventory.h"
#include "random.h"
#include "pokemon.h"
struct unkStruct_8096AF8
{
@ -41,8 +42,8 @@ void SortPelipperJobs(void)
{
if(gUnknown_203B490->pelipperBoardJobs[index2].mailType != MAIL_TYPE_NONE)
{
if((gUnknown_203B490->pelipperBoardJobs[index1].dungeon.id > gUnknown_203B490->pelipperBoardJobs[index2].dungeon.id) ||
((gUnknown_203B490->pelipperBoardJobs[index1].dungeon.id == gUnknown_203B490->pelipperBoardJobs[index2].dungeon.id) && (gUnknown_203B490->pelipperBoardJobs[index1].dungeon.floor > gUnknown_203B490->pelipperBoardJobs[index2].dungeon.floor)))
if((gUnknown_203B490->pelipperBoardJobs[index1].unk4.dungeon.id > gUnknown_203B490->pelipperBoardJobs[index2].unk4.dungeon.id) ||
((gUnknown_203B490->pelipperBoardJobs[index1].unk4.dungeon.id == gUnknown_203B490->pelipperBoardJobs[index2].unk4.dungeon.id) && (gUnknown_203B490->pelipperBoardJobs[index1].unk4.dungeon.floor > gUnknown_203B490->pelipperBoardJobs[index2].unk4.dungeon.floor)))
{
mail = gUnknown_203B490->pelipperBoardJobs[index1];
gUnknown_203B490->pelipperBoardJobs[index1] = gUnknown_203B490->pelipperBoardJobs[index2];
@ -71,9 +72,9 @@ void GeneratePelipperJobs(void)
mail->mailType = MAIL_TYPE_UNK2;
mail->missionType = WONDER_MAIL_MISSION_TYPE_UNK6;
mail->unk2 = 1;
mail->dungeon.id = DUNGEON_UPROAR_FOREST;
mail->dungeon.floor = 10;
mail->unk8 = Rand32Bit() & 0xffffff;
mail->unk4.dungeon.id = DUNGEON_UPROAR_FOREST;
mail->unk4.dungeon.floor = 10;
mail->unk4.seed = Rand32Bit() & 0xffffff;
mail->clientSpecies = MONSTER_WYNAUT;
mail->targetSpecies = MONSTER_MANKEY;
mail->targetItem = 0;
@ -89,9 +90,9 @@ void GeneratePelipperJobs(void)
mail->mailType = MAIL_TYPE_UNK3;
mail->missionType = WONDER_MAIL_MISSION_TYPE_UNK6;
mail->unk2 = 2;
mail->dungeon.id = DUNGEON_HOWLING_FOREST;
mail->dungeon.floor = 15;
mail->unk8 = Rand32Bit() & 0xffffff;
mail->unk4.dungeon.id = DUNGEON_HOWLING_FOREST;
mail->unk4.dungeon.floor = 15;
mail->unk4.seed = Rand32Bit() & 0xffffff;
mail->clientSpecies = MONSTER_SMEARGLE;
mail->targetSpecies = MONSTER_SMEARGLE;
mail->targetItem = 0;
@ -106,9 +107,9 @@ void GeneratePelipperJobs(void)
mail->mailType = MAIL_TYPE_UNK4;
mail->missionType = WONDER_MAIL_MISSION_TYPE_UNK6;
mail->unk2 = 3;
mail->dungeon.id = DUNGEON_WISH_CAVE;
mail->dungeon.floor = 20;
mail->unk8 = Rand32Bit() & 0xffffff;
mail->unk4.dungeon.id = DUNGEON_WISH_CAVE;
mail->unk4.dungeon.floor = 20;
mail->unk4.seed = Rand32Bit() & 0xffffff;
mail->clientSpecies = MONSTER_MEDICHAM;
mail->targetSpecies = MONSTER_MEDICHAM;
mail->targetItem = 0;
@ -135,9 +136,9 @@ bool8 IsMailinJobSlot(struct WonderMail *mail)
if(jobSlot->mailType != MAIL_TYPE_NONE)
if(mail->missionType == jobSlot->missionType)
if(mail->unk2 == jobSlot->unk2)
if(mail->dungeon.id == jobSlot->dungeon.id)
if(mail->dungeon.floor == jobSlot->dungeon.floor)
if(mail->unk8 == jobSlot->unk8)
if(mail->unk4.dungeon.id == jobSlot->unk4.dungeon.id)
if(mail->unk4.dungeon.floor == jobSlot->unk4.dungeon.floor)
if(mail->unk4.seed == jobSlot->unk4.seed)
if(mail->clientSpecies == jobSlot->clientSpecies)
if(mail->targetSpecies == jobSlot->targetSpecies)
if(mail->targetItem == jobSlot->targetItem)
@ -156,8 +157,8 @@ bool8 sub_809693C(struct WonderMail *mail)
bool8 escortMission;
s32 index;
dungeonIndex = mail->dungeon.id;
floor = mail->dungeon.floor;
dungeonIndex = mail->unk4.dungeon.id;
floor = mail->unk4.dungeon.floor;
escortMission = FALSE;
if (!IsValidWonderMail(mail)) {
return FALSE;
@ -203,7 +204,7 @@ s32 CountJobsinDungeon(u8 dungeon)
for(index = 0; index < MAX_ACCEPTED_JOBS; index++)
{
mail = GetJobSlotInfo(index);
if ((mail->dungeon.id == dungeon) &&
if ((mail->unk4.dungeon.id == dungeon) &&
(((mail->mailType == MAIL_TYPE_TAKEN_JOB || (mail->mailType == MAIL_TYPE_UNK8)) || (mail->mailType == MAIL_TYPE_UNK9)))) {
count++;
}
@ -221,7 +222,7 @@ bool8 sub_8096A08(u8 dungeon, u8 *param_2)
for(index = 0; index < MAX_ACCEPTED_JOBS; index++)
{
mail = GetJobSlotInfo(index);
if(mail->dungeon.id == dungeon)
if(mail->unk4.dungeon.id == dungeon)
if(mail->mailType == MAIL_TYPE_TAKEN_JOB)
if(mail->missionType == WONDER_MAIL_MISSION_TYPE_ESCORT_CLIENT)
{
@ -280,7 +281,7 @@ void sub_8096AF8(struct unkStruct_8096AF8 *param_1, u8 slotIndex,u8 dungeon)
param_1->unk0 = FALSE;
param_1->clientSpecies = jobSlot->clientSpecies;
param_1->targetSpecies = MONSTER_NONE;
if (jobSlot->dungeon.id == dungeon) {
if (jobSlot->unk4.dungeon.id == dungeon) {
switch(jobSlot->missionType) {
case WONDER_MAIL_MISSION_TYPE_FIND_ITEM:
if (jobSlot->mailType == MAIL_TYPE_TAKEN_JOB) {
@ -321,7 +322,7 @@ s16 sub_8096B98(u8 dungeon)
mail = GetJobSlotInfo(index);
if(mail->mailType == MAIL_TYPE_TAKEN_JOB)
if(mail->missionType == WONDER_MAIL_MISSION_TYPE_ESCORT_CLIENT)
if(mail->dungeon.id == dungeon)
if(mail->unk4.dungeon.id == dungeon)
return mail->targetSpecies;
}
return 0;
@ -367,7 +368,7 @@ bool8 sub_8096C08(u8 *jobIndex)
void ResetJobSlot(u8 index)
{
gUnknown_203B490->jobSlots[index].mailType = MAIL_TYPE_NONE;
gUnknown_203B490->jobSlots[index].dungeon.id = 99;
gUnknown_203B490->jobSlots[index].dungeon.floor = 0;
gUnknown_203B490->jobSlots[index].unk4.dungeon.id = 99;
gUnknown_203B490->jobSlots[index].unk4.dungeon.floor = 0;
gUnknown_203B490->jobSlots[index].rewardType = MONEY1;
}

View File

@ -72,8 +72,8 @@ bool8 GenerateMailJobDungeonInfo(struct WonderMail *mail)
}
if (flag) {
mail->dungeon.id = dungeon;
mail->dungeon.floor = floor;
mail->unk4.dungeon.id = dungeon;
mail->unk4.dungeon.floor = floor;
return TRUE;
}
floor++;
@ -96,11 +96,11 @@ bool8 sub_8095E38(struct WonderMail *mail, u8 dungeon, u32 floor, u8 param_4)
{
if (mail->mailType != MAIL_TYPE_NONE) {
if ((mail->missionType == WONDER_MAIL_MISSION_TYPE_ESCORT_CLIENT) && (param_4 == 1)) {
if (mail->dungeon.id == dungeon) {
if (mail->unk4.dungeon.id == dungeon) {
return TRUE;
}
}
else if ((mail->dungeon.id == dungeon) && (mail->dungeon.floor == floor)) {
else if ((mail->unk4.dungeon.id == dungeon) && (mail->unk4.dungeon.floor == floor)) {
return TRUE;
}
}

View File

@ -49,9 +49,9 @@ bool8 sub_8096F50(struct WonderMail *mail)
for(index = 0; index < 0x10; index++)
{
temp = &gUnknown_203B490->unk230[index];
if(temp->dungeon.id == mail->dungeon.id)
if(temp->dungeon.floor == mail->dungeon.floor)
if(temp->unk4 == mail->unk8)
if(temp->dungeon.id == mail->unk4.dungeon.id)
if(temp->dungeon.floor == mail->unk4.dungeon.floor)
if(temp->seed == mail->unk4.seed)
if(temp->unk8 == temp2)
return TRUE;
}
@ -96,7 +96,7 @@ u32 RestoreMailInfo(u8 *r0, u32 size)
for(index = 0; index < 0x10; index++)
{
RestoreIntegerBits(&backup, &gUnknown_203B490->unk230[index].unk8, 0x20);
RestoreIntegerBits(&backup, &gUnknown_203B490->unk230[index].unk4, 0x18);
RestoreIntegerBits(&backup, &gUnknown_203B490->unk230[index].seed, 0x18);
RestoreDungeonLocation(&backup, &gUnknown_203B490->unk230[index].dungeon);
}
nullsub_102(&backup);
@ -140,7 +140,7 @@ u32 SaveMailInfo(u8 *r0, u32 size)
for(index = 0; index < 0x10; index++)
{
SaveIntegerBits(&backup, &gUnknown_203B490->unk230[index].unk8, 0x20);
SaveIntegerBits(&backup, &gUnknown_203B490->unk230[index].unk4, 0x18);
SaveIntegerBits(&backup, &gUnknown_203B490->unk230[index].seed, 0x18);
SaveDungeonLocation(&backup, &gUnknown_203B490->unk230[index].dungeon);
}
nullsub_102(&backup);
@ -158,8 +158,8 @@ void RestoreWonderMail(struct unkStruct_8094924 *a, struct WonderMail *b)
RestoreIntegerBits(a, &b->rewardType, 4);
RestoreIntegerBits(a, &b->itemReward, 8);
RestoreIntegerBits(a, &b->friendAreaReward, 6);
RestoreIntegerBits(a, &b->unk8, 0x18);
RestoreDungeonLocation(a, &b->dungeon);
RestoreIntegerBits(a, &b->unk4.seed, 0x18);
RestoreDungeonLocation(a, &b->unk4.dungeon);
}
void SaveWonderMail(struct unkStruct_8094924 *a, struct WonderMail *b)
@ -173,8 +173,8 @@ void SaveWonderMail(struct unkStruct_8094924 *a, struct WonderMail *b)
SaveIntegerBits(a, &b->rewardType, 4);
SaveIntegerBits(a, &b->itemReward, 8);
SaveIntegerBits(a, &b->friendAreaReward, 6);
SaveIntegerBits(a, &b->unk8, 0x18);
SaveDungeonLocation(a, &b->dungeon);
SaveIntegerBits(a, &b->unk4.seed, 0x18);
SaveDungeonLocation(a, &b->unk4.dungeon);
}
void sub_80972F4(void)

View File

@ -1,7 +1,7 @@
#include "global.h"
#include "code_80A26CC.h"
#include "event_flag.h"
extern bool8 sub_80023E4(u32);
extern u8 sub_80973F4(s16);
extern u8 sub_8097384(s16);
s16 sub_80A26B8(s16);
@ -15,6 +15,36 @@ extern const u8 *gUnknown_8117000[];
extern void sub_809AC18(s32, s32);
extern void sub_809ABB4(s32, s32);
extern void sub_809AB4C(s32, s32);
s16 sub_80A8BBC(s16);
void sub_80A2500(s32 param_1, s16 *param_2)
{
s16 temp;
if (*param_2 == 1) {
temp = param_1;
sub_809AB4C(temp, sub_80A8BBC(param_2[1]));
}
}
void sub_80A252C(s32 param_1, s16 *param_2)
{
s16 temp;
if (*param_2 == 1) {
temp = param_1;
sub_809ABB4(temp, sub_80A8BBC(param_2[1]));
}
}
void sub_80A2558(s32 param_1, s16 *param_2)
{
s16 temp;
if (*param_2 == 1) {
temp = param_1;
sub_809AC18(temp, sub_80A8BBC(param_2[1]));
}
}
void sub_80A2584(s16 r0, s16 r1)
{
@ -32,29 +62,29 @@ void sub_80A2598(s16 r0, s16 r1)
u32 sub_80A25AC(u16 param_1)
{
if (sub_8098F88() != 0) {
return param_1;
}
else
{
if (param_1 == 0x32) {
return 0x32;
}
else if (!sub_80023E4(0xc)) {
return 999;
}
else if (sub_80023E4(0xd)) {
return 0x13;
}
else if (param_1 != 1) {
if (sub_8098F88() != 0) {
return param_1;
}
else
{
sub_8001658(0,0x28);
return 1;
if (param_1 == 0x32) {
return 0x32;
}
else if (!sub_80023E4(0xc)) {
return 999;
}
else if (sub_80023E4(0xd)) {
return 0x13;
}
else if (param_1 != 1) {
return param_1;
}
else
{
sub_8001658(0,0x28);
return 1;
}
}
}
}
struct unkStruct_80A2608 *sub_80A2608(s16 index)
@ -98,19 +128,19 @@ s32 sub_80A2668(u32 r0)
u32 sub_80A2688(u8 r0)
{
u32 uVar1;
uVar1 = r0 - 0x4B;
u32 uVar1;
// u8 cast is needed for only this compare
if ((u8)uVar1 < 0x17)
return uVar1;
else if(r0 == 0x2F)
return 0x17;
else if (r0 == 0x30)
return 0x18;
else
return -1;
uVar1 = r0 - 0x4B;
// u8 cast is needed for only this compare
if ((u8)uVar1 < 0x17)
return uVar1;
else if(r0 == 0x2F)
return 0x17;
else if (r0 == 0x30)
return 0x18;
else
return -1;
}
s16 sub_80A26B8(s16 r0)

View File

@ -187,4 +187,4 @@ void sub_803A3BC(void)
sp_0x80 = r9;
WriteSavetoPak(&sp_0x80, 1);
}
}

View File

@ -146,7 +146,7 @@ void sub_803AD88(void)
sUnknown_203B3F8->unk70 = 3;
sUnknown_203B3F8->unk68 = 1;
sUnknown_203B3F8->unk6C = 100;
sUnknown_203B3F8->unk64 = sUnknown_203B3F8->pokemon->unkHasNextStage;
sUnknown_203B3F8->unk64 = sUnknown_203B3F8->pokemon->level;
sUnknown_203B3F8->unk74 = 3;
sUnknown_203B3F8->unk78 = &sUnknown_203B3F8->unkE0[3];
sUnknown_203B3F8->unk7C = 44;
@ -256,7 +256,7 @@ void sub_803AFE8(void)
default:
break;
case 3:
sUnknown_203B3F8->pokemon->unkHasNextStage = sUnknown_203B3F8->unk60;
sUnknown_203B3F8->pokemon->level = sUnknown_203B3F8->unk60;
// Fallthrough is needed to match
case 2:
sub_803ACD0(2);
@ -276,4 +276,4 @@ void sub_803B034(void)
sub_803ACD0(2);
break;
}
}
}

View File

@ -12,6 +12,66 @@ extern u8 *gUnknown_8108084[];
s32 sub_8091E94(s32 a1, s32 a2, s32 a3); // items.c
bool8 sub_8090820(u16 moveID)
{
struct PokemonStruct *pokeStruct;
struct Move *move;
s32 moveIndex;
s32 index;
s32 one;
for(index = 0; index < 0x19d; index++)
{
pokeStruct = &gRecruitedPokemonRef->pokemon[index];
one = 1;
if (pokeStruct->unk0 & 1)
{
if(pokeStruct->unk0 >> 1 & one){
for(moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++)
{
move = &pokeStruct->moves[moveIndex];
if ((move->moveFlags & MOVE_FLAG_EXISTS) && (move->id == moveID)) {
return TRUE;
}
}
}
}
}
return FALSE;
}
void sub_8090888(u8 *param_1, u8 *param_2)
{
s32 iVar3;
iVar3 = 0;
if(*param_1 != 0)
{
do {
if (*param_1 == 0xA) {
iVar3++;
}
param_1++;
} while (*param_1 != 0);
}
while (iVar3 % 3) {
*param_1 = 0xA;
param_1++;
iVar3++;
}
while (*param_2 != 0) {
*param_1 = *param_2;
param_1++;
param_2++;
}
*param_1 = 0;
}
u32 sub_80908D8(struct DungeonLocation *dungeon)
{
if ((dungeon->id < DUNGEON_OUT_ON_RESCUE) && (dungeon->floor < gDungeonFloorCount[dungeon->id])) {

View File

@ -6,6 +6,7 @@
#include "dungeon_ai_targeting.h"
#include "dungeon_leader.h"
#include "dungeon_visibility.h"
#include "pokemon.h"
#include "pokemon_3.h"
bool8 TargetLeader(struct Entity *pokemon)

View File

@ -17,8 +17,6 @@ struct unkStruct_202EE10
extern struct unkStruct_202EE10 gUnknown_202EE10;
EWRAM_DATA_2 u32 gUnknown_203B458 = {0};
extern u8 *gUnknown_80FE6F4[];
extern u8 gUnknown_810AC60; // 0xC
extern u8 gUnknown_810AC62; // 0xC
@ -355,9 +353,3 @@ void UpdateDungeonMusic(void)
}
}
}
void sub_808408C(u32 param_1)
{
gUnknown_203B458 = (1 | param_1) & 0xffffff;
}

View File

@ -2,6 +2,30 @@
#include "dungeon_random.h"
EWRAM_DATA_2 u32 gDungeonRngState = {0};
EWRAM_DATA_2 u32 gUnknown_203B458 = {0};
void sub_808408C(u32 param_1)
{
gUnknown_203B458 = (1 | param_1) & 0xffffff;
}
u32 sub_80840A4(void)
{
u32 r0;
u32 r1;
r1 = gUnknown_203B458 * 0x5d588b65;
r1++;
r0 = r1 >> 16;
r1 *= 0x5d588b65;
r1++;
gUnknown_203B458 = r1;
r1 &= 0xffff0000;
r0 |= r1;
r0 &= 0x0ffffff;
r0 |= 1;
return r0;
}
void InitDungeonRNG(u32 value)
{

View File

@ -11,6 +11,8 @@
#include "friend_area.h"
#include "team_inventory.h"
#include "code_8097670.h"
#include "pokemon.h"
#include "pokemon_3.h"
extern u8 gUnknown_2000A88[0x400];
@ -51,7 +53,6 @@ extern u32 sub_8001658(u32, s32);
extern void sub_80018D8(u32, u32, u32);
extern void sub_809733C(u32, u32);
extern void sub_80973A8(u32, u32);
extern u8 HasRecruitedMon(u32);
extern void sub_800199C(u32, s32, u32, s32);
extern s32 sub_8001784(u32, s32, u16);

View File

@ -464,7 +464,7 @@ NAKED void sub_8092404(u8 r0, u16 *r1, bool8 r2, bool8 r3)
}
#endif
void sub_809249C(u8 friendArea, u8 clear)
void sub_809249C(u8 friendArea, bool8 clear)
{
s32 index;
bool32 dungeonCheck;
@ -515,11 +515,11 @@ void sub_8092558(u8 *buffer, u8 index)
sprintfStatic(buffer, &gUnknown_81098A4, gFriendAreaNames[index]);
}
void sub_8092578(u8 *buffer, u8 index, u8 r2)
void sub_8092578(u8 *buffer, u8 index, bool8 printPrice)
{
// I think this is when we buy the friend area from wigglytuff
u8 priceBuffer[0x14];
if(r2)
if(printPrice)
{
sub_8090FEC(gFriendAreaSettings[index].price, priceBuffer, 1);
sprintfStatic(buffer, &gUnknown_81098AC, gFriendAreaNames[index], 96, priceBuffer);
@ -558,7 +558,7 @@ bool8 HasAllFriendAreas(void)
return TRUE;
}
void sub_8092638(u8 friendArea, struct unkStruct_8092638 *param_2, u8 param_3, u8 param_4)
void sub_8092638(u8 friendArea, struct unkStruct_8092638 *param_2, bool8 checkLeader, bool8 checkDungeon)
{
struct PokemonStruct *pokeStruct;
s32 counter;
@ -574,7 +574,7 @@ void sub_8092638(u8 friendArea, struct unkStruct_8092638 *param_2, u8 param_3, u
param_2->unk8 = iVar4;
param_2->hasFriendArea = gFriendAreas[counter];
if (param_2->hasFriendArea != 0) {
if (param_2->hasFriendArea) {
param_2->unk2 = 0;
param_2->numPokemon = gFriendAreaSettings[counter].num_pokemon;
@ -582,8 +582,8 @@ void sub_8092638(u8 friendArea, struct unkStruct_8092638 *param_2, u8 param_3, u
{
pokeStruct = &gRecruitedPokemonRef->pokemon[iVar4];
if (((((u8)pokeStruct->unk0 & 1) != 0) &&
((param_3 == 0 || (!pokeStruct->isTeamLeader)))) &&
((param_4 == 0 || ((pokeStruct->dungeonLocation).id != DUNGEON_JOIN_LOCATION_PARTNER)))) {
((checkLeader == 0 || (!pokeStruct->isTeamLeader)))) &&
((checkDungeon == 0 || ((pokeStruct->dungeonLocation).id != DUNGEON_JOIN_LOCATION_PARTNER)))) {
param_2->unk2++;
}
}

View File

@ -1,4 +1,5 @@
#include "global.h"
#include "constants/dungeon.h"
#include "memory.h"
#include "text1.h"
#include "text2.h"
@ -12,19 +13,23 @@
#include "code_80130A8.h"
#include "code_801EE10_1.h"
#include "code_801B3C0.h"
#include "event_flag.h"
#include "moves.h"
extern struct unkStruct_203B2BC *gUnknown_203B2BC;
extern void sub_8027D40(u32, struct BulkItem *);
extern u8 *gUnknown_80D4920[];
extern u8 *gUnknown_80D4928[];
extern u8 *gUnknown_80D4970[];
extern void sub_8024458(s16, u32);
extern void sub_801BEEC(s16);
extern void GetLinkedSequence(u32, struct Move *, u16*);
extern void sub_801F808(u16*);
extern void sub_8027794();
extern void sub_801F1B0(u32, u32);
extern void unk_CopyMoves4To8(struct Move *, struct Move *);
extern void sub_801EE10(u32, s16, struct Move *, u32, u32, u32);
void sub_8027D40(u32, struct BulkItem *heldItem);
void sub_8027794(void);
extern void SetFriendAreaActionMenuState(u32);
extern void sub_802719C();
extern void sub_8027274();
@ -42,6 +47,34 @@ extern void sub_8027CA0();
extern void sub_8027D00();
extern void CreateFriendActionMenu();
extern void sub_80276A8();
bool8 sub_8027D9C(struct PokemonStruct *pokeStruct);
extern u8 sub_8027DCC(struct PokemonStruct *);
extern u32 sub_801EF38(u8 r0);
extern void sub_801F214();
extern void SetFriendAreaActionMenuState(u32);
extern void PlaySound(u32);
extern void nullsub_104();
extern void sub_8099690(u32);
extern void sub_808D31C(struct PokemonStruct *);
extern struct PokemonStruct *sub_808D3F8(void);
extern struct PokemonStruct *sub_808D3BC(void);
extern u32 sub_801F890(void);
extern void sub_801F8D0(void);
extern u8 gUnknown_202DE58[];
extern u32 sub_801F194(void);
extern u32 sub_801BF48(void);
extern void sub_801BF98(void);
extern u32 sub_80244E4(void);
extern void sub_802453C(void);
extern bool8 sub_808D750(s16 index_);
extern struct PokemonStruct *GetPlayerPokemonStruct(void);
extern void sub_808ED00(void);
u32 sub_8027E18(struct PokemonStruct *);
u8 sub_8027E4C(struct PokemonStruct *r0);
void sub_8027EB8(void);
const struct UnkTextStruct2 gUnknown_80DD6EC =
{
@ -116,6 +149,18 @@ ALIGNED(4) const u8 gUnknown_80DD8A0[] = _(
ALIGNED(4) const u8 gUnknown_80DD8D0[] = _(
"{CENTER_ALIGN}The {COLOR_1 GREEN}{ARG_MOVE_ITEM_0}{END_COLOR_TEXT_1} was\n{CENTER_ALIGN}sent to storage.");
ALIGNED(4) const u8 gFriendActionStandby[] = "Stand By";
ALIGNED(4) const u8 gFriendActionMakeLeader[] = "Make Leader";
ALIGNED(4) const u8 gFriendActionJoinTeam[] = "Join Team";
ALIGNED(4) const u8 gFriendActionSayFarewell[] = "Say Farewell";
ALIGNED(4) const u8 gFriendActionGive[] = "Give";
ALIGNED(4) const u8 gFriendActionTake[] = "Take";
ALIGNED(4) const u8 gFriendActionSummary[] = "Summary";
ALIGNED(4) const u8 gFriendActionMoves[] = "Moves";
ALIGNED(4) const u8 gFriendActionCheckIQ[] = "Check IQ";
ALIGNED(4) const u8 gUnknown_80DD958[] = _("Item: {COLOR_1 GREEN}{ARG_MOVE_ITEM_0}{END_COLOR_TEXT_1} ");
static const u8 filler[] = "pksdir0";
u32 sub_8027074(void)
{
@ -132,25 +177,25 @@ u32 sub_80270A4(void)
{
switch(gUnknown_203B2BC->state) {
case FRIEND_AREA_ACTION_MENU_INIT:
SetFriendAreaActionMenuState(1);
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN);
break;
case 1:
case 2:
case FRIEND_AREA_ACTION_MENU_MAIN:
case FRIEND_AREA_ACTION_MENU_MAIN_2:
sub_80277FC();
break;
case 3:
sub_80278B4();
break;
case 4:
case FRIEND_AREA_ACTION_MENU_SUMMARY:
sub_8027A40();
break;
case 5:
case FRIEND_AREA_ACTION_MENU_CHECK_IQ:
sub_8027A5C();
break;
case 8:
case FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_PROMPT:
sub_8027A78();
break;
case 9:
case FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_CONFIRM:
sub_8027AE4();
break;
case 10:
@ -232,10 +277,10 @@ void sub_8027274(void)
case FRIEND_AREA_ACTION_MENU_INIT:
case FRIEND_AREA_ACTION_MENU_EXIT:
break;
case 1:
case FRIEND_AREA_ACTION_MENU_MAIN:
sub_8023868(1,0,0,7);
break;
case 2:
case FRIEND_AREA_ACTION_MENU_MAIN_2:
sub_8023B7C(1);
break;
case 3:
@ -243,10 +288,10 @@ void sub_8027274(void)
sub_8023DA4();
sub_8012D60(&gUnknown_203B2BC->unk7C,gUnknown_203B2BC->menuItems,0,gUnknown_203B2BC->unk16C,gUnknown_203B2BC->menuAction1,2);
break;
case 4:
case FRIEND_AREA_ACTION_MENU_SUMMARY:
sub_8024458(gUnknown_203B2BC->targetPoke,2);
break;
case 5:
case FRIEND_AREA_ACTION_MENU_CHECK_IQ:
sub_801BEEC(gUnknown_203B2BC->targetPoke);
break;
case 10:
@ -270,11 +315,11 @@ void sub_8027274(void)
case 0xf:
sub_801F1B0(1,0);
break;
case 8:
case FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_PROMPT:
sub_8027794();
sub_8014248(gFriendAreaActionSayFarewellPrompt,0,3,gUnknown_203B2BC->menuItems,0,4,0,0,0x101);
break;
case 9:
case FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_CONFIRM:
sub_8027794();
sub_8014248(gFriendAreaActionSayFarewellConfirm,0,3,gUnknown_203B2BC->menuItems,0,4,0,0,0x101);
break;
@ -283,16 +328,593 @@ void sub_8027274(void)
sub_801F808(gUnknown_203B2BC->moveIDs);
break;
case 6:
gUnknown_203B2BC->fallbackState = 2;
gUnknown_203B2BC->fallbackState = FRIEND_AREA_ACTION_MENU_MAIN_2;
// The {COLOR_1 GREEN}{ARG_MOVE_ITEM_0}{END_COLOR_TEXT_1} was
// returned to the Toolbox
sub_80141B4(gUnknown_80DD8A0,0,0,0x101);
break;
case 7:
gUnknown_203B2BC->fallbackState = 2;
gUnknown_203B2BC->fallbackState = FRIEND_AREA_ACTION_MENU_MAIN_2;
// The {COLOR_1 GREEN}{ARG_MOVE_ITEM_0}{END_COLOR_TEXT_1} was
// returned to storage
sub_80141B4(gUnknown_80DD8D0,0,0,0x101);
break;
}
}
void CreateFriendActionMenu(void)
{
int index;
s32 loopMax;
struct PokemonStruct *pokeStruct;
loopMax = 0;
pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
MemoryFill16(gUnknown_203B2BC->unk16C,0,sizeof(gUnknown_203B2BC->unk16C));
if((pokeStruct->unk0 >> 1) % 2)
{
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionStandby;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_STANDBY;
if(!sub_8027D9C(pokeStruct))
{
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
if(sub_80023E4(8) && !pokeStruct->isTeamLeader)
{
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionMakeLeader;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_MAKE_LEADER;
loopMax += 1;
}
}
else
{
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionJoinTeam;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_JOIN_TEAM;
if(!sub_808D750(gUnknown_203B2BC->targetPoke))
{
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionSayFarewell;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_SAY_FAREWELL;
if(!sub_8027DCC(pokeStruct))
{
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
}
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionGive;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_GIVE;
if(GetNumberOfFilledInventorySlots() == 0)
{
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionTake;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_TAKE;
if(GetNumberOfFilledInventorySlots() >= INVENTORY_SIZE || gUnknown_203B2BC->item2.id == ITEM_NOTHING)
{
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionSummary;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_SUMMARY;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionMoves;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_MOVES;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionCheckIQ;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_CHECK_IQ;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = 0;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_NONE;
for(index = 0; index < loopMax; index++)
{
if(gUnknown_203B2BC->unk16C[index] == 0)
{
if(gUnknown_203B2BC->menuItems[index].menuAction == gUnknown_203B2BC->menuAction1)
return;
}
}
for(index = 0; index < loopMax; index++)
{
if(gUnknown_203B2BC->unk16C[index] == 0)
{
gUnknown_203B2BC->menuAction1 = gUnknown_203B2BC->menuItems[index].menuAction;
break;
}
}
}
void sub_80276A8(void)
{
int index;
s32 loopMax;
loopMax = 0;
MemoryFill16(gUnknown_203B2BC->unk16C,0,sizeof(gUnknown_203B2BC->unk16C));
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionGive;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_GIVE;
if (GetNumberOfFilledInventorySlots() == 0) {
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = *gUnknown_80D4970;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_INFO;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = 0;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_NONE;
for(index = 0; index < loopMax; index++)
{
if(gUnknown_203B2BC->unk16C[index] == 0)
{
if(gUnknown_203B2BC->menuItems[index].menuAction == gUnknown_203B2BC->menuAction2)
return;
}
}
for(index = 0; index < loopMax; index++)
{
if(gUnknown_203B2BC->unk16C[index] == 0)
{
gUnknown_203B2BC->menuAction2 = gUnknown_203B2BC->menuItems[index].menuAction;
break;
}
}
}
void sub_8027794(void)
{
s32 loopMax = 0;
MemoryFill16(gUnknown_203B2BC->unk16C,0,sizeof(gUnknown_203B2BC->unk16C));
gUnknown_203B2BC->menuItems[loopMax].text = *gUnknown_80D4920;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_YES;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = *gUnknown_80D4928;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_NO;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = NULL;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_NONE;
}
void sub_80277FC(void)
{
struct PokemonStruct *pokeStruct;
switch(sub_8023A94(TRUE)) {
case 0:
case 1:
break;
case 3:
gUnknown_203B2BC->targetPoke = sub_8023B44();
pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
gUnknown_203B2BC->pokeStruct = pokeStruct;
gUnknown_203B2BC->isTeamLeader = pokeStruct->isTeamLeader;
PeekPokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(3);
break;
case 4:
gUnknown_203B2BC->targetPoke = sub_8023B44();
pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
gUnknown_203B2BC->pokeStruct = pokeStruct;
gUnknown_203B2BC->isTeamLeader = pokeStruct->isTeamLeader;
PeekPokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(4);
break;
case 2:
sub_8023C60();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_EXIT);
break;
}
}
void sub_80278B4(void)
{
struct PokemonStruct *playerStruct;
struct PokemonStruct *pokeStruct1;
struct PokemonStruct *pokeStruct2;
u32 menuAction;
menuAction = 0;
sub_8023A94(FALSE);
if ((sub_8012FD8(&gUnknown_203B2BC->unk7C) == 0) && (sub_8013114(&gUnknown_203B2BC->unk7C,&menuAction), menuAction != FRIEND_AREA_ACTION_MENU_ACTION_NONE)) {
gUnknown_203B2BC->menuAction1 = menuAction;
}
switch(menuAction) {
case FRIEND_AREA_ACTION_MENU_ACTION_JOIN_TEAM:
if (sub_808D750(gUnknown_203B2BC->targetPoke)) {
#ifdef NONMATCHING
pokeStruct1 = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
#else
register size_t offset asm("r1") = offsetof(struct unkStruct_203B45C, pokemon[gUnknown_203B2BC->targetPoke]);
struct PokemonStruct* p = gRecruitedPokemonRef->pokemon;
size_t addr = offset + (size_t)p;
pokeStruct1 = (struct PokemonStruct*)addr;
#endif
pokeStruct1->unk0 |= FLAG_ON_TEAM;
nullsub_104();
}
sub_808ED00();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_STANDBY:
gUnknown_203B2BC->pokeStruct->unk0 &= ~(FLAG_ON_TEAM);
nullsub_104();
sub_808ED00();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_MAKE_LEADER:
pokeStruct2 = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
playerStruct = GetPlayerPokemonStruct();
if (!pokeStruct2->isTeamLeader) {
playerStruct->isTeamLeader = FALSE;
pokeStruct2->isTeamLeader = TRUE;
nullsub_104();
}
sub_808ED00();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_SAY_FAREWELL:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_PROMPT);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_MOVES:
SetFriendAreaActionMenuState(0xe);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_GIVE:
SetFriendAreaActionMenuState(10);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_TAKE:
PlaySound(0x14d);
if (gUnknown_203B2BC->item2.id != ITEM_NOTHING) {
AddHeldItemToInventory(&gUnknown_203B2BC->item2);
}
FillInventoryGaps();
gUnknown_203B2BC->item2.id = ITEM_NOTHING;
gUnknown_203B2BC->item2.quantity = 0;
GivePokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->item2);
nullsub_104();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_SUMMARY:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_SUMMARY);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_CHECK_IQ:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_CHECK_IQ);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_NONE:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
}
}
void sub_8027A40(void)
{
switch(sub_80244E4())
{
case 2:
case 3:
sub_802453C();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case 0:
case 1:
break;
}
}
void sub_8027A5C(void)
{
switch(sub_801BF48())
{
case 2:
case 3:
sub_801BF98();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case 0:
case 1:
break;
}
}
static inline bool8 sub_8027A78_sub(void) {
if (gUnknown_203B2BC->pokeStruct->dungeonLocation.id == DUNGEON_HOWLING_FOREST_2 || gUnknown_203B2BC->pokeStruct->dungeonLocation.id == DUNGEON_POKEMON_SQUARE)
return TRUE;
else
return FALSE;
}
void sub_8027A78(void)
{
s32 menuAction;
if(sub_80144A4(&menuAction) == 0)
{
switch(menuAction)
{
case FRIEND_AREA_ACTION_MENU_ACTION_NONE:
case FRIEND_AREA_ACTION_MENU_ACTION_NO:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_YES:
if (sub_8027A78_sub())
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_CONFIRM);
else
{
sub_8027EB8();
sub_808D31C(gUnknown_203B2BC->pokeStruct);
}
break;
}
}
}
void sub_8027AE4(void)
{
s32 menuAction;
if (sub_80144A4(&menuAction) == 0) {
switch(menuAction)
{
case FRIEND_AREA_ACTION_MENU_ACTION_NONE:
case FRIEND_AREA_ACTION_MENU_ACTION_NO:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_YES:
sub_8027EB8();
sub_808D31C(gUnknown_203B2BC->pokeStruct);
break;
}
}
}
void sub_8027B28(void)
{
switch(sub_801A6E8(TRUE))
{
case 3:
gUnknown_203B2BC->id = sub_801A8AC();
gUnknown_203B2BC->itemToGive.id = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].id;
gUnknown_203B2BC->itemToGive.quantity = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].quantity;
SetFriendAreaActionMenuState(0xc);
break;
case 4:
gUnknown_203B2BC->id = sub_801A8AC();
gUnknown_203B2BC->itemToGive.id = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].id;
gUnknown_203B2BC->itemToGive.quantity = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].quantity;
sub_8099690(0);
SetFriendAreaActionMenuState(0xd);
break;
case 2:
sub_801A928();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case 0:
case 1:
break;
}
}
void sub_8027BD8(void)
{
s32 menuAction;
menuAction = 0;
sub_801A6E8(FALSE);
if ((sub_8012FD8(&gUnknown_203B2BC->unk7C) == 0) && (sub_8013114(&gUnknown_203B2BC->unk7C,&menuAction), menuAction != FRIEND_AREA_ACTION_MENU_ACTION_NONE)) {
gUnknown_203B2BC->menuAction2 = menuAction;
}
switch(menuAction)
{
case FRIEND_AREA_ACTION_MENU_ACTION_GIVE:
PlaySound(0x14d);
ShiftItemsDownFrom(gUnknown_203B2BC->id);
FillInventoryGaps();
if (gUnknown_203B2BC->item2.id != ITEM_NOTHING) {
AddHeldItemToInventory(&gUnknown_203B2BC->item2);
}
GivePokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->itemToGive);
sub_801A928();
nullsub_104();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_INFO:
sub_8099690(0);
SetFriendAreaActionMenuState(0xd);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_NONE:
SetFriendAreaActionMenuState(0xb);
break;
}
}
void sub_8027C84()
{
switch(sub_801B410())
{
case 2:
case 3:
sub_801B450();
SetFriendAreaActionMenuState(0xB);
case 0:
case 1:
break;
}
}
void sub_8027CA0(void)
{
switch(sub_801EF38(1))
{
case 3:
case 4:
gUnknown_203B2BC->moveIndex = sub_801F194();
gUnknown_203B2BC->moveID = gUnknown_203B2BC->moves[gUnknown_203B2BC->moveIndex].id;
SetFriendAreaActionMenuState(0x10);
break;
case 2:
sub_801F214();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case 0:
case 1:
break;
}
}
void sub_8027D00(void)
{
switch(sub_801F890())
{
case 2:
case 3:
sub_801F8D0();
SetFriendAreaActionMenuState(0xF);
break;
case 0:
case 1:
break;
}
}
void FriendAreaActionMenu_GotoFallbackState(void)
{
s32 temp;
if(sub_80144A4(&temp) == 0)
{
SetFriendAreaActionMenuState(gUnknown_203B2BC->fallbackState);
}
}
void sub_8027D40(u32 r0, struct BulkItem *heldItem)
{
struct Item slot;
struct unkStruct_8090F58 a3;
sub_8008C54(r0);
sub_80073B8(r0);
HeldItemToSlot(&slot, heldItem);
a3.unk0 = 0;
a3.unk4 = 0;
a3.unk8 = 1;
slot.flags = ITEM_FLAG_EXISTS;
sub_8090E14(gUnknown_202DE58, &slot, &a3);
xxx_format_and_draw(4, 3, gUnknown_80DD958, r0, 0);
sub_80073E0(r0);
}
bool8 sub_8027D9C(struct PokemonStruct *pokeStruct)
{
u32 var1;
if(!pokeStruct->isTeamLeader)
{
var1 = 0;
if(pokeStruct->dungeonLocation.id == DUNGEON_JOIN_LOCATION_PARTNER)
var1 = 1;
if(var1 != 0)
{
if(!sub_80023E4(8))
return FALSE;
}
}
else
return FALSE;
return TRUE;
}
bool8 sub_8027DCC(struct PokemonStruct *pokeStruct)
{
u32 var1;
if(sub_808D3BC() != pokeStruct)
if(sub_808D3F8() != pokeStruct)
if(!pokeStruct->isTeamLeader)
{
var1 = 0;
if(pokeStruct->dungeonLocation.id == DUNGEON_JOIN_LOCATION_PARTNER)
var1 = 1;
if(var1 != 0)
{
if(sub_80023E4(8))
goto check;
}
else
{
check:
if(sub_8027E18(pokeStruct) != 3)
return TRUE;
}
}
return FALSE;
}
u32 sub_8027E18(struct PokemonStruct *pokeStruct)
{
if(pokeStruct->heldItem.id == ITEM_NOTHING)
return 0;
else if(GetNumberOfFilledInventorySlots() < INVENTORY_SIZE)
return 1;
else if(sub_8027E4C(pokeStruct))
return 2;
else
return 3;
}
bool8 sub_8027E4C(struct PokemonStruct *pokeStruct)
{
if(!IsNotMoneyOrUsedTMItem(pokeStruct->heldItem.id))
return FALSE;
else
{
if(IsThrowableItem(pokeStruct->heldItem.id))
{
if(gTeamInventoryRef->teamStorage[pokeStruct->heldItem.id] + pokeStruct->heldItem.quantity > 0x3e7)
return FALSE;
}
else if(gTeamInventoryRef->teamStorage[pokeStruct->heldItem.id] > 0x3e6)
{
return FALSE;
}
}
return TRUE;
}
void sub_8027EB8(void)
{
switch(sub_8027E18(gUnknown_203B2BC->pokeStruct))
{
case 1:
PlaySound(0x14d);
AddHeldItemToInventory(&gUnknown_203B2BC->item2);
FillInventoryGaps();
gUnknown_203B2BC->item2.id = ITEM_NOTHING;
gUnknown_203B2BC->item2.quantity = 0;
GivePokemonItem(gUnknown_203B2BC->targetPoke, &gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(6);
break;
case 2:
PlaySound(0x14d);
if(IsThrowableItem(gUnknown_203B2BC->item2.id))
gTeamInventoryRef->teamStorage[gUnknown_203B2BC->item2.id] += gUnknown_203B2BC->item2.quantity;
else
gTeamInventoryRef->teamStorage[gUnknown_203B2BC->item2.id] += 1;
gUnknown_203B2BC->item2.id = ITEM_NOTHING;
gUnknown_203B2BC->item2.quantity = 0;
GivePokemonItem(gUnknown_203B2BC->targetPoke, &gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(7);
break;
case 0:
default:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
}
}

View File

@ -1,551 +0,0 @@
#include "global.h"
#include "constants/dungeon.h"
#include "memory.h"
#include "text2.h"
#include "item.h"
#include "team_inventory.h"
#include "pokemon.h"
#include "friend_area_action_menu.h"
#include "menu_input.h"
#include "kecleon_bros.h"
#include "code_80130A8.h"
#include "code_801EE10_1.h"
#include "code_801B3C0.h"
#include "code_80118A4.h"
extern struct unkStruct_203B2BC *gUnknown_203B2BC;
extern struct TeamInventory *gTeamInventoryRef;
extern u32 sub_801EF38(u8 r0);
extern void sub_801F214();
extern void SetFriendAreaActionMenuState(u32);
extern void nullsub_104();
extern void sub_8099690(u32);
extern void sub_8027EB8();
extern void sub_808D31C(struct PokemonStruct *);
extern bool8 sub_80023E4(u32);
extern struct PokemonStruct *sub_808D3F8(void);
extern struct PokemonStruct *sub_808D3BC(void);
extern u32 sub_801F890(void);
extern void sub_801F8D0(void);
extern u8 gUnknown_202DE58[];
extern u32 sub_801F194(void);
u32 sub_8027E18(struct PokemonStruct *);
u8 sub_8027E4C(struct PokemonStruct *r0);
extern u32 sub_801BF48(void);
extern void sub_801BF98(void);
extern u32 sub_80244E4(void);
extern void sub_802453C(void);
extern bool8 sub_808D750(s16 index_);
extern struct PokemonStruct *GetPlayerPokemonStruct(void);
extern void sub_808ED00();
ALIGNED(4) const u8 gFriendActionStandby[] = "Stand By";
ALIGNED(4) const u8 gFriendActionMakeLeader[] = "Make Leader";
ALIGNED(4) const u8 gFriendActionJoinTeam[] = "Join Team";
ALIGNED(4) const u8 gFriendActionSayFarewell[] = "Say Farewell";
ALIGNED(4) const u8 gFriendActionGive[] = "Give";
ALIGNED(4) const u8 gFriendActionTake[] = "Take";
ALIGNED(4) const u8 gFriendActionSummary[] = "Summary";
ALIGNED(4) const u8 gFriendActionMoves[] = "Moves";
ALIGNED(4) const u8 gFriendActionCheckIQ[] = "Check IQ";
ALIGNED(4) const u8 gUnknown_80DD958[] = _("Item: {COLOR_1 GREEN}{ARG_MOVE_ITEM_0}{END_COLOR_TEXT_1} ");
static const u8 filler[] = "pksdir0";
extern u8 *gUnknown_80D4920[];
extern u8 *gUnknown_80D4928[];
extern u8 *gUnknown_80D4970[];
void sub_80276A8(void)
{
int index;
s32 loopMax;
loopMax = 0;
MemoryFill16(gUnknown_203B2BC->unk16C,0,sizeof(gUnknown_203B2BC->unk16C));
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionGive;
gUnknown_203B2BC->menuItems[loopMax].menuAction = 10;
if (GetNumberOfFilledInventorySlots() == 0) {
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = *gUnknown_80D4970;
gUnknown_203B2BC->menuItems[loopMax].menuAction = 4;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = 0;
gUnknown_203B2BC->menuItems[loopMax].menuAction = 1;
for(index = 0; index < loopMax; index++)
{
if(gUnknown_203B2BC->unk16C[index] == 0)
{
if(gUnknown_203B2BC->menuItems[index].menuAction == gUnknown_203B2BC->menuAction2)
return;
}
}
for(index = 0; index < loopMax; index++)
{
if(gUnknown_203B2BC->unk16C[index] == 0)
{
gUnknown_203B2BC->menuAction2 = gUnknown_203B2BC->menuItems[index].menuAction;
break;
}
}
}
void sub_8027794(void)
{
s32 loopMax = 0;
MemoryFill16(gUnknown_203B2BC->unk16C,0,sizeof(gUnknown_203B2BC->unk16C));
gUnknown_203B2BC->menuItems[loopMax].text = *gUnknown_80D4920;
gUnknown_203B2BC->menuItems[loopMax].menuAction = 0x2;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = *gUnknown_80D4928;
gUnknown_203B2BC->menuItems[loopMax].menuAction = 3;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = NULL;
gUnknown_203B2BC->menuItems[loopMax].menuAction = 1;
}
void sub_80277FC(void)
{
struct PokemonStruct *pokeStruct;
switch(sub_8023A94(TRUE)) {
case 0:
case 1:
break;
case 3:
gUnknown_203B2BC->targetPoke = sub_8023B44();
pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
gUnknown_203B2BC->pokeStruct = pokeStruct;
gUnknown_203B2BC->isTeamLeader = pokeStruct->isTeamLeader;
PeekPokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(3);
break;
case 4:
gUnknown_203B2BC->targetPoke = sub_8023B44();
pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
gUnknown_203B2BC->pokeStruct = pokeStruct;
gUnknown_203B2BC->isTeamLeader = pokeStruct->isTeamLeader;
PeekPokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(4);
break;
case 2:
sub_8023C60();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_EXIT);
break;
}
}
void sub_80278B4(void)
{
struct PokemonStruct *playerStruct;
struct PokemonStruct *pokeStruct1;
struct PokemonStruct *pokeStruct2;
u32 menuAction;
menuAction = 0;
sub_8023A94(FALSE);
if ((sub_8012FD8(&gUnknown_203B2BC->unk7C) == 0) && (sub_8013114(&gUnknown_203B2BC->unk7C,&menuAction), menuAction != 1)) {
gUnknown_203B2BC->menuAction1 = menuAction;
}
switch(menuAction) {
case 6:
if (sub_808D750(gUnknown_203B2BC->targetPoke)) {
#ifdef NONMATCHING
pokeStruct1 = &gRecruiedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
#else
register size_t offset asm("r1") = offsetof(struct unkStruct_203B45C, pokemon[gUnknown_203B2BC->targetPoke]);
struct PokemonStruct* p = gRecruitedPokemonRef->pokemon;
size_t addr = offset + (size_t)p;
pokeStruct1 = (struct PokemonStruct*)addr;
#endif
pokeStruct1->unk0 |= 2;
nullsub_104();
}
sub_808ED00();
SetFriendAreaActionMenuState(2);
break;
case 7:
gUnknown_203B2BC->pokeStruct->unk0 &= 0xfffd;
nullsub_104();
sub_808ED00();
SetFriendAreaActionMenuState(2);
break;
case 8:
pokeStruct2 = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
playerStruct = GetPlayerPokemonStruct();
if (!pokeStruct2->isTeamLeader) {
playerStruct->isTeamLeader = FALSE;
pokeStruct2->isTeamLeader = TRUE;
nullsub_104();
}
sub_808ED00();
SetFriendAreaActionMenuState(2);
break;
case 9:
SetFriendAreaActionMenuState(8);
break;
case 0xc:
SetFriendAreaActionMenuState(0xe);
break;
case 10:
SetFriendAreaActionMenuState(10);
break;
case 0xb:
PlaySound(0x14d);
if (gUnknown_203B2BC->item2.id != ITEM_NOTHING) {
AddHeldItemToInventory(&gUnknown_203B2BC->item2);
}
FillInventoryGaps();
gUnknown_203B2BC->item2.id = ITEM_NOTHING;
gUnknown_203B2BC->item2.quantity = 0;
GivePokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->item2);
nullsub_104();
SetFriendAreaActionMenuState(2);
break;
case 4:
SetFriendAreaActionMenuState(4);
break;
case 5:
SetFriendAreaActionMenuState(5);
break;
case 1:
SetFriendAreaActionMenuState(2);
break;
}
}
void sub_8027A40(void)
{
switch(sub_80244E4())
{
case 2:
case 3:
sub_802453C();
SetFriendAreaActionMenuState(2);
break;
case 0:
case 1:
break;
}
}
void sub_8027A5C(void)
{
switch(sub_801BF48())
{
case 2:
case 3:
sub_801BF98();
SetFriendAreaActionMenuState(2);
break;
case 0:
case 1:
break;
}
}
static inline bool8 sub_8027A78_sub(void) {
if (gUnknown_203B2BC->pokeStruct->dungeonLocation.id == DUNGEON_HOWLING_FOREST_2 || gUnknown_203B2BC->pokeStruct->dungeonLocation.id == DUNGEON_POKEMON_SQUARE)
return TRUE;
else
return FALSE;
}
void sub_8027A78(void)
{
s32 menuAction;
if(sub_80144A4(&menuAction) == 0)
{
switch(menuAction)
{
case 1:
case 3:
SetFriendAreaActionMenuState(2);
break;
case 2:
if (sub_8027A78_sub())
SetFriendAreaActionMenuState(9);
else
{
sub_8027EB8();
sub_808D31C(gUnknown_203B2BC->pokeStruct);
}
break;
}
}
}
void sub_8027AE4(void)
{
s32 menuAction;
if (sub_80144A4(&menuAction) == 0) {
switch(menuAction)
{
case 1:
case 3:
SetFriendAreaActionMenuState(2);
break;
case 2:
sub_8027EB8();
sub_808D31C(gUnknown_203B2BC->pokeStruct);
break;
}
}
}
void sub_8027B28(void)
{
switch(sub_801A6E8(TRUE))
{
case 3:
gUnknown_203B2BC->id = sub_801A8AC();
gUnknown_203B2BC->itemToGive.id = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].id;
gUnknown_203B2BC->itemToGive.quantity = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].quantity;
SetFriendAreaActionMenuState(0xc);
break;
case 4:
gUnknown_203B2BC->id = sub_801A8AC();
gUnknown_203B2BC->itemToGive.id = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].id;
gUnknown_203B2BC->itemToGive.quantity = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].quantity;
sub_8099690(0);
SetFriendAreaActionMenuState(0xd);
break;
case 2:
sub_801A928();
SetFriendAreaActionMenuState(2);
break;
case 0:
case 1:
break;
}
}
void sub_8027BD8(void)
{
s32 menuAction;
menuAction = 0;
sub_801A6E8(FALSE);
if ((sub_8012FD8(&gUnknown_203B2BC->unk7C) == 0) && (sub_8013114(&gUnknown_203B2BC->unk7C,&menuAction), menuAction != 1)) {
gUnknown_203B2BC->menuAction2 = menuAction;
}
switch(menuAction)
{
case 10:
PlaySound(0x14d);
ShiftItemsDownFrom(gUnknown_203B2BC->id);
FillInventoryGaps();
if (gUnknown_203B2BC->item2.id != ITEM_NOTHING) {
AddHeldItemToInventory(&gUnknown_203B2BC->item2);
}
GivePokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->itemToGive);
sub_801A928();
nullsub_104();
SetFriendAreaActionMenuState(2);
break;
case 4:
sub_8099690(0);
SetFriendAreaActionMenuState(0xd);
break;
case 1:
SetFriendAreaActionMenuState(0xb);
break;
}
}
void sub_8027C84()
{
switch(sub_801B410())
{
case 2:
case 3:
sub_801B450();
SetFriendAreaActionMenuState(0xB);
case 0:
case 1:
break;
}
}
void sub_8027CA0(void)
{
switch(sub_801EF38(1))
{
case 3:
case 4:
gUnknown_203B2BC->moveIndex = sub_801F194();
gUnknown_203B2BC->moveID = gUnknown_203B2BC->moves[gUnknown_203B2BC->moveIndex].id;
SetFriendAreaActionMenuState(0x10);
break;
case 2:
sub_801F214();
SetFriendAreaActionMenuState(0x2);
break;
case 0:
case 1:
break;
}
}
void sub_8027D00(void)
{
switch(sub_801F890())
{
case 2:
case 3:
sub_801F8D0();
SetFriendAreaActionMenuState(0xF);
break;
case 0:
case 1:
break;
}
}
void FriendAreaActionMenu_GotoFallbackState(void)
{
s32 temp;
if(sub_80144A4(&temp) == 0)
{
SetFriendAreaActionMenuState(gUnknown_203B2BC->fallbackState);
}
}
void sub_8027D40(u32 r0, struct BulkItem *heldItem)
{
struct Item slot;
struct unkStruct_8090F58 a3;
sub_8008C54(r0);
sub_80073B8(r0);
HeldItemToSlot(&slot, heldItem);
a3.unk0 = 0;
a3.unk4 = 0;
a3.unk8 = 1;
slot.flags = ITEM_FLAG_EXISTS;
sub_8090E14(gUnknown_202DE58, &slot, &a3);
xxx_format_and_draw(4, 3, gUnknown_80DD958, r0, 0);
sub_80073E0(r0);
}
bool8 sub_8027D9C(struct PokemonStruct *pokeStruct)
{
u32 var1;
if(!pokeStruct->isTeamLeader)
{
var1 = 0;
if(pokeStruct->dungeonLocation.id == DUNGEON_JOIN_LOCATION_PARTNER)
var1 = 1;
if(var1 != 0)
{
if(!sub_80023E4(8))
return FALSE;
}
}
else
return FALSE;
return TRUE;
}
bool8 sub_8027DCC(struct PokemonStruct *pokeStruct)
{
u32 var1;
if(sub_808D3BC() != pokeStruct)
if(sub_808D3F8() != pokeStruct)
if(!pokeStruct->isTeamLeader)
{
var1 = 0;
if(pokeStruct->dungeonLocation.id == DUNGEON_JOIN_LOCATION_PARTNER)
var1 = 1;
if(var1 != 0)
{
if(sub_80023E4(8))
goto check;
}
else
{
check:
if(sub_8027E18(pokeStruct) != 3)
return TRUE;
}
}
return FALSE;
}
u32 sub_8027E18(struct PokemonStruct *pokeStruct)
{
if(pokeStruct->heldItem.id == ITEM_NOTHING)
return 0;
else if(GetNumberOfFilledInventorySlots() < INVENTORY_SIZE)
return 1;
else if(sub_8027E4C(pokeStruct))
return 2;
else
return 3;
}
bool8 sub_8027E4C(struct PokemonStruct *pokeStruct)
{
if(!IsNotMoneyOrUsedTMItem(pokeStruct->heldItem.id))
return FALSE;
else
{
if(IsThrowableItem(pokeStruct->heldItem.id))
{
if(gTeamInventoryRef->teamStorage[pokeStruct->heldItem.id] + pokeStruct->heldItem.quantity > 0x3e7)
return FALSE;
}
else if(gTeamInventoryRef->teamStorage[pokeStruct->heldItem.id] > 0x3e6)
{
return FALSE;
}
}
return TRUE;
}
void sub_8027EB8(void)
{
switch(sub_8027E18(gUnknown_203B2BC->pokeStruct))
{
case 1:
PlaySound(0x14d);
AddHeldItemToInventory(&gUnknown_203B2BC->item2);
FillInventoryGaps();
gUnknown_203B2BC->item2.id = ITEM_NOTHING;
gUnknown_203B2BC->item2.quantity = 0;
GivePokemonItem(gUnknown_203B2BC->targetPoke, &gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(6);
break;
case 2:
PlaySound(0x14d);
if(IsThrowableItem(gUnknown_203B2BC->item2.id))
gTeamInventoryRef->teamStorage[gUnknown_203B2BC->item2.id] += gUnknown_203B2BC->item2.quantity;
else
gTeamInventoryRef->teamStorage[gUnknown_203B2BC->item2.id] += 1;
gUnknown_203B2BC->item2.id = ITEM_NOTHING;
gUnknown_203B2BC->item2.quantity = 0;
GivePokemonItem(gUnknown_203B2BC->targetPoke, &gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(7);
break;
case 0:
default:
SetFriendAreaActionMenuState(2);
break;
}
}

View File

@ -14,6 +14,7 @@
#include "code_8012A18_1.h"
#include "code_801B3C0.h"
#include "code_80118A4.h"
#include "event_flag.h"
// there might be more overlap with unkStruct_203B2BC
// I was working on the moves and put the data that seemed to correspond to that
@ -137,7 +138,9 @@ extern void sub_801F808(u16 *);
extern void sub_8099690(u32);
extern void sub_801F8D0(void);
extern u32 sub_801F890(void);
extern bool8 sub_80023E4(u32);
extern void sub_80160D8(void);
extern u32 sub_8016080(void);
extern s32 sub_80144A4(s32 *);
void sub_8025434(s32);
void sub_802544C(void);
@ -533,7 +536,7 @@ void sub_8025A84(void)
sub_8025434(0xA);
break;
case 9:
gUnknown_203B2B4->pokeStruct->unk0 &= 0xfffd;
gUnknown_203B2B4->pokeStruct->unk0 &= ~(FLAG_ON_TEAM);
nullsub_104();
sub_808ED00();
sub_8023C60();

View File

@ -1165,7 +1165,7 @@ void sub_8032828(void)
else
gUnknown_203B33C->unk53C.itemRewards[0] = ITEM_NOTHING;
gUnknown_203B33C->unk53C.quantity = 1;
gUnknown_203B33C->unk53C.teamRankPtsReward = GetDungeonTeamRankPts(&mail->dungeon, 0);
gUnknown_203B33C->unk53C.teamRankPtsReward = GetDungeonTeamRankPts(&mail->unk4.dungeon, 0);
gUnknown_203B33C->unk53C.itemRewards[1] = 0;
gUnknown_203B33C->unk53C.itemRewards[2] = 0;
gUnknown_203B33C->unk53C.friendAreaReward = 0;

View File

@ -19,7 +19,7 @@ extern void sub_80A5EBC(void);
extern void sub_80A2D00(void *);
extern void sub_80015C0(u32, u32);
extern void sub_80A5EDC(u32);
extern void sub_809D754(void *, struct DebugLocation *);
extern void sub_809D754(struct GroundScript_ExecutePP_1 *, struct DebugLocation *);
extern void sub_80A2D68(void *);
extern void nullsub_121(void);
extern void sub_80A2D88(void *);

View File

@ -16,13 +16,11 @@ extern u8 gUnknown_811656C[];
extern struct DebugLocation gUnknown_81165C8;
extern u8 sub_809D770(struct GroundScript_ExecutePP_1 *param_1, struct DebugLocation *);
extern void sub_809D520(void *);
extern void sub_809D568(void *);
extern u8 sub_80AC378(void);
extern u8 sub_80AD290(void);
extern u8 sub_80A8B74(void);
extern void sub_809D6E4(struct GroundScript_ExecutePP_1 *, struct GroundScript_ExecutePP_3 *, s32 index);
extern u8 sub_809A750(void);
extern u8 *sub_80A2460(struct GroundScript_ExecutePP_1 *param_1, u32);
void FatalError(u32 *, const char *, ...) __attribute__((noreturn));
@ -36,6 +34,23 @@ struct FunctionScript
extern struct FunctionScript gFunctionScriptTable[];
void sub_809D6D8(struct GroundScript_ExecutePP_1 *param_1, s16 index, u8 *param_3)
{
param_1->unk14[index] = param_3;
}
bool8 sub_809D6E4(struct GroundScript_ExecutePP_1 *param_1, struct GroundScript_ExecutePP_3 *script, s16 _index)
{
u8 *scriptPtr;
s32 index = _index;
scriptPtr = param_1->unk14[index];
script->scriptPointer = scriptPtr;
script->scriptType = index;
script->unk6 = param_1->unk10;
script->unk8 = param_1->unk12;
return scriptPtr != NULL;
}
void sub_809D710(struct GroundScript_ExecutePP_1 *param_1, struct GroundScript_ExecutePP_3 *script, s16 index)
{
@ -54,109 +69,110 @@ void sub_809D710(struct GroundScript_ExecutePP_1 *param_1, struct GroundScript_E
bool8 sub_809D754(struct GroundScript_ExecutePP_1 *param_1, struct DebugLocation *unused)
{
sub_809D568(&param_1->unk24);
sub_809D568(&param_1->unk84);
return TRUE;
sub_809D568(&param_1->unk24);
sub_809D568(&param_1->unk84);
return TRUE;
}
bool8 sub_809D770(struct GroundScript_ExecutePP_1 *param_1, struct DebugLocation *unused)
{
sub_809D568(&param_1->unk24);
sub_809D568(&param_1->unk84);
param_1->unk24.unk2 = 4;
return TRUE;
sub_809D568(&param_1->unk24);
sub_809D568(&param_1->unk84);
param_1->unk24.unk2 = 4;
return TRUE;
}
bool8 GroundScript_ExecutePP(struct GroundScript_ExecutePP_1 *param_1, s32 *param_2, struct GroundScript_ExecutePP_3 *param_3, struct DebugLocation *unused)
{
if ((param_3 == NULL) || (param_3->scriptPointer == NULL)) {
return FALSE;
}
switch(param_3->scriptType) {
case 2:
case 3:
if (param_1->unk24.scriptType == 1) {
memcpy(&param_1->unk84, &param_1->unk24, sizeof(struct GroundScript_ExecutePP_1_sub));
if ((param_3 == NULL) || (param_3->scriptPointer == NULL)) {
return FALSE;
}
switch(param_3->scriptType) {
case 2:
case 3:
if (param_1->unk24.scriptType == 1) {
param_1->unk84 = param_1->unk24;
break;
}
if (param_1->unk24.scriptType == 5) {
sub_809D568(&param_1->unk84);
}
break;
}
if (param_1->unk24.scriptType == 5) {
case 5:
if (param_1->unk24.scriptType != 2) {
// "execute script type error B"
FatalError(&gUnknown_8116538, gUnknown_8116544);
}
if (param_1->unk84.scriptType != -1) {
// "execute script type error C"
FatalError(&gUnknown_8116560, gUnknown_811656C);
}
param_1->unk84 = param_1->unk24;
break;
case 0:
if (param_1->unk24.scriptType != 1) goto _0809D84A;
param_1->unk84 = param_1->unk24;
break;
case 1:
_0809D84A:
sub_809D568(&param_1->unk84);
}
break;
case 5:
if (param_1->unk24.scriptType != 2) {
// "execute script type error B"
FatalError(&gUnknown_8116538, gUnknown_8116544);
}
if (param_1->unk84.scriptType != -1) {
// "execute script type error C"
FatalError(&gUnknown_8116560, gUnknown_811656C);
}
memcpy(&param_1->unk84, &param_1->unk24, sizeof(struct GroundScript_ExecutePP_1_sub));
break;
case 0:
if (param_1->unk24.scriptType != 1) goto _0809D84A;
memcpy(&param_1->unk84, &param_1->unk24, sizeof(struct GroundScript_ExecutePP_1_sub));
break;
case 1:
_0809D84A:
sub_809D568(&param_1->unk84);
break;
default:
// "execute script type error %d"
FatalError(&gUnknown_8116588, gUnknown_8116594, param_3->scriptType);
}
sub_809D568(&param_1->unk24);
if (param_2 != NULL) {
param_1->unkC = param_2[0];
}
else {
sub_809D520(&param_1->unkC);
}
param_1->unk24.scriptType = param_3->scriptType;
param_1->unk24.unk2 = 3;
param_1->unk24.unkC = param_3->unk6;
param_1->unk24.unkE = param_3->unk8;
param_1->unk24.scriptPointer1 = param_3->scriptPointer;
param_1->unk24.scriptPointer2 = param_3->scriptPointer;
param_1->unk24.unk10 = 0;
param_1->unk24.unk14 = 0;
break;
default:
// "execute script type error %d"
FatalError(&gUnknown_8116588, gUnknown_8116594, param_3->scriptType);
}
sub_809D568(&param_1->unk24);
if (param_2 != NULL) {
param_1->unkC = param_2[0];
}
else {
sub_809D520(&param_1->unkC);
}
param_1->unk24.scriptType = param_3->scriptType;
param_1->unk24.unk2 = 3;
param_1->unk24.unkC = param_3->unk6;
param_1->unk24.unkE = param_3->unk8;
param_1->unk24.scriptPointer1 = param_3->scriptPointer;
param_1->unk24.scriptPointer2 = param_3->scriptPointer;
param_1->unk24.unk10 = 0;
param_1->unk24.unk14 = NULL;
if (param_1->unk0->callbacks[5] != 0) {
param_1->unk0->callbacks[5](param_1->unk4, &param_1->unk24.unk26);
}
return TRUE;
if (param_1->unk0->callbacks[5] != 0) {
param_1->unk0->callbacks[5](param_1->unk4, &param_1->unk24.unk26);
}
return TRUE;
}
bool8 sub_809D8C0(struct GroundScript_ExecutePP_1 *param_1, s32 *param_2, s16 index, struct DebugLocation *debug)
{
struct GroundScript_ExecutePP_3 auStack28;
sub_809D6E4(param_1,&auStack28,index);
return GroundScript_ExecutePP(param_1, param_2, &auStack28, debug);
struct GroundScript_ExecutePP_3 auStack28;
sub_809D6E4(param_1,&auStack28,index);
return GroundScript_ExecutePP(param_1, param_2, &auStack28, debug);
}
u8 sub_809D8EC(struct GroundScript_ExecutePP_1 *param_1, s16 param_2)
{
s32 param_2_s32;
s32 param_2_s32;
param_2_s32 = param_2;
if ((param_2 == 0) && (sub_809A750() == 0)) {
param_1->unk24.scriptPointer1 = sub_80A2460(param_1, 0);
return 0;
}
else {
param_1->unk24.unk22 = param_2_s32;
param_1->unk24.unk2 = 2;
gUnknown_2039A36 = 1;
return 1;
}
param_2_s32 = param_2;
if ((param_2 == 0) && (sub_809A750() == 0)) {
param_1->unk24.scriptPointer1 = sub_80A2460(param_1, 0);
return 0;
}
else {
param_1->unk24.unk22 = param_2_s32;
param_1->unk24.unk2 = 2;
gUnknown_2039A36 = 1;
return 1;
}
}
u8 GroundScript_Cancel(struct GroundScript_ExecutePP_1 *r0)
bool8 GroundScript_Cancel(struct GroundScript_ExecutePP_1 *r0)
{
// NOTE: Will always return TRUE
return sub_809D770(r0, &gUnknown_81165C8);
}

View File

@ -14,6 +14,7 @@
#include "code_800D090.h"
#include "code_8094F88.h"
#include "menu_input.h"
#include "event_flag.h"
extern const struct FileArchive gTitleMenuFileArchive;
@ -44,7 +45,6 @@ void sub_80397B4(void);
extern void sub_80920D8(u8 *);
extern struct PokemonStruct *GetPlayerPokemonStruct(void);
extern bool8 sub_80023E4(u32);
extern u8 *sub_8098FB4();
extern u8 *GetDungeonLocationInfo(void);
extern u32 GetNumAdventures(void);

View File

@ -1,9 +1,12 @@
#include "global.h"
#include "constants/bg_music.h"
#include "constants/colors.h"
#include "constants/evolution_status.h"
#include "input.h"
#include "item.h"
#include "memory.h"
#include "pokemon.h"
#include "pokemon_3.h"
#include "random.h"
#include "text1.h"
#include "text2.h"
@ -15,40 +18,7 @@
#include "code_8012A18_1.h"
#include "code_801B3C0.h"
#include "code_80118A4.h"
struct unkStruct_203B2B0
{
// size: 0x174
bool8 evolutionComplete;
u8 fill1[0x3];
u8 evoItem1_itemIndex;
u8 evoItem2_ItemIndex;
u8 unk6;
u16 evolutionConditionStatus;
/* 0xA */ s16 targetSpecies; // species # of the evolved pokemon (what we are evolving to)
struct PokemonStruct *pokeStruct;
/* 0x10 */ bool8 pokeRenamed;
/* 0x14 */ u32 evoItem1_InvIndex; // inventory index of item
/* 0x18 */ u32 evoItem2_InvIndex; // inventory index of item
struct Item chosenItem;
u32 state;
u32 fallbackState;
u32 menuAction1;
u32 menuAction2;
u32 menuAction3;
struct MenuItem unk34[8];
u16 unk74[0x8];
struct MenuStruct unk84;
u8 fillD4[0x104 - 0xD4];
struct OpenedFile *unk104;
u8 *unk108;
u16 unk10C;
u16 unk10E;
u8 unk110;
u8 unk111;
u8 unk112;
struct UnkTextStruct2 unk114[4];
};
#include "luminous_cave.h"
EWRAM_DATA_2 struct unkStruct_203B2B0 *gUnknown_203B2B0 = {0};
extern struct UnkTextStruct2 gUnknown_80DCA00;
@ -195,10 +165,10 @@ extern void nullsub_104();
void sub_8024DBC(void);
void sub_8024E30(void);
void sub_801AEE4(u32, u32);
void sub_808F734(struct PokemonStruct *, s16);
u32 sub_801602C(u32 r0, u8 *name);
extern s32 sub_80144A4(s32 *);
extern s32 sub_801A8AC(void);
extern void sub_8099690(u32);
extern void sub_808F468(struct PokemonStruct *, u8 *, u32);
bool8 LuminousCave_HasOnly1Member(void);
enum
@ -226,17 +196,6 @@ enum
LUMINOUS_CAVE_CANT_EVOLVE_YET = 0x1D,
};
enum evolutionStatus
{
EVOLUTION_GOOD = 1,
EVOLUTION_LACK_LEVEL = 1 << 1,
EVOLUTION_NO_MORE = 1 << 2,
EVOLUTION_LACK_ITEM = 1 << 3,
EVOLUTION_LACK_IQ = 1 << 4,
EVOLUTION_LACK_FRIEND_AREA = 1 << 5,
EVOLUTION_LACK_ROOM = 1 << 6,
};
u32 sub_802465C(void)
{
struct OpenedFile *faceFile;
@ -436,19 +395,19 @@ void UpdateLuminousCaveDialogue(void)
case LUMINOUS_CAVE_LET_US_BEGIN:
sub_8025254();
if((gUnknown_203B2B0->evolutionConditionStatus & EVOLUTION_GOOD))
if((gUnknown_203B2B0->evolveStatus.evolutionConditionStatus & EVOLUTION_GOOD))
gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_CHANGED_APPEARANCE;
else if(gUnknown_203B2B0->evolutionConditionStatus == EVOLUTION_NO_MORE)
else if(gUnknown_203B2B0->evolveStatus.evolutionConditionStatus == EVOLUTION_NO_MORE)
gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_CANT_EVOLVE_ANYMORE;
else if(gUnknown_203B2B0->evolutionConditionStatus == EVOLUTION_LACK_LEVEL)
else if(gUnknown_203B2B0->evolveStatus.evolutionConditionStatus == EVOLUTION_LACK_LEVEL)
gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_LEVEL;
else if(gUnknown_203B2B0->evolutionConditionStatus == EVOLUTION_LACK_IQ)
else if(gUnknown_203B2B0->evolveStatus.evolutionConditionStatus == EVOLUTION_LACK_IQ)
gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_IQ;
else if(gUnknown_203B2B0->evolutionConditionStatus == EVOLUTION_LACK_FRIEND_AREA)
else if(gUnknown_203B2B0->evolveStatus.evolutionConditionStatus == EVOLUTION_LACK_FRIEND_AREA)
gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_FRIEND_AREA;
else if(gUnknown_203B2B0->evolutionConditionStatus == EVOLUTION_LACK_ROOM)
else if(gUnknown_203B2B0->evolveStatus.evolutionConditionStatus == EVOLUTION_LACK_ROOM)
gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_ROOM;
else if(gUnknown_203B2B0->evolutionConditionStatus == EVOLUTION_LACK_ITEM)
else if(gUnknown_203B2B0->evolveStatus.evolutionConditionStatus == EVOLUTION_LACK_ITEM)
gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_ITEM;
else
gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_CANT_EVOLVE_YET;
@ -464,11 +423,11 @@ void UpdateLuminousCaveDialogue(void)
case LUMINOUS_CAVE_EVOLVED:
monName = GetMonSpecies(gUnknown_203B2B0->pokeStruct->speciesNum);
strcpy(gAvailablePokemonNames,monName);
monName = GetMonSpecies(gUnknown_203B2B0->targetSpecies);
monName = GetMonSpecies(gUnknown_203B2B0->evolveStatus.targetEvolveSpecies);
strcpy(gAvailablePokemonNames + 0x50,monName);
gUnknown_203B2B0->evolutionComplete = TRUE;
sub_80977D0();
sub_808F734(gUnknown_203B2B0->pokeStruct,gUnknown_203B2B0->targetSpecies);
sub_808F734(gUnknown_203B2B0->pokeStruct,gUnknown_203B2B0->evolveStatus.targetEvolveSpecies);
nullsub_104();
gUnknown_203B2B0->pokeStruct = GetPlayerPokemonStruct();
if (gUnknown_203B2B0->evoItem1_InvIndex != INVENTORY_SIZE) {
@ -874,20 +833,20 @@ void LuminousCave_AdvancetoFallbackState(void)
void sub_8025254(void)
{
if(gUnknown_203B2B0->evoItem1_InvIndex == INVENTORY_SIZE)
gUnknown_203B2B0->evoItem1_itemIndex = 0;
gUnknown_203B2B0->evolveStatus.evoItem1 = 0;
else
{
gUnknown_203B2B0->evoItem1_itemIndex = gTeamInventoryRef->teamItems[gUnknown_203B2B0->evoItem1_InvIndex].id;
gUnknown_203B2B0->evolveStatus.evoItem1 = gTeamInventoryRef->teamItems[gUnknown_203B2B0->evoItem1_InvIndex].id;
}
if(gUnknown_203B2B0->evoItem2_InvIndex == INVENTORY_SIZE)
gUnknown_203B2B0->evoItem2_ItemIndex = 0;
gUnknown_203B2B0->evolveStatus.evoItem2 = 0;
else
{
gUnknown_203B2B0->evoItem2_ItemIndex = gTeamInventoryRef->teamItems[gUnknown_203B2B0->evoItem2_InvIndex].id;
gUnknown_203B2B0->evolveStatus.evoItem2 = gTeamInventoryRef->teamItems[gUnknown_203B2B0->evoItem2_InvIndex].id;
}
gUnknown_203B2B0->unk6 = RandInt(0xFF);
sub_808F468(gUnknown_203B2B0->pokeStruct, &gUnknown_203B2B0->evoItem1_itemIndex, 1);
gUnknown_203B2B0->evolveStatus.unk6 = RandInt(0xFF);
sub_808F468(gUnknown_203B2B0->pokeStruct, &gUnknown_203B2B0->evolveStatus, 1);
}
bool8 LuminousCave_HasOnly1Member(void)

View File

@ -231,7 +231,7 @@ void sub_802E1AC(void)
case MAIL_INFO:
sub_803B35C(GetMailboxSlotInfo(gUnknown_203B304->mailboxIndex), &gUnknown_203B304->unkC);
gUnknown_203B304->unkC.unk0[0] = 3;
gUnknown_203B304->unkC.unk44 = 0;
gUnknown_203B304->unkC.mailStatus = MAIL_STATUS_SUSPENDED;
sub_802DE84(&gUnknown_203B304->unkC);
break;
case JOB_LIST_MENU:
@ -404,7 +404,7 @@ void sub_802E578(void)
mail = GetMailboxSlotInfo(gUnknown_203B304->mailboxIndex);
if(mail->mailType == 1)
{
gUnknown_203B304->mailIndex = mail->dungeon.floor;
gUnknown_203B304->mailIndex = mail->unk4.dungeon.floor;
gUnknown_203B304->fallbackState = MAIL_MENU_1;
SetMailboxState(DISPLAY_SEL_PKMN_NEWS);
}
@ -466,7 +466,7 @@ void HandleMailActionMenu(void)
case 6:
PlaySound(0x133);
mail = GetMailboxSlotInfo(gUnknown_203B304->mailboxIndex);
ReceivePKMNNews(mail->dungeon.floor);
ReceivePKMNNews(mail->unk4.dungeon.floor);
ResetMailboxSlot(gUnknown_203B304->mailboxIndex);
sub_8096078();
if(HasNoMailinMailbox())
@ -482,7 +482,7 @@ void HandleMailActionMenu(void)
case 7:
PlayMenuSoundEffect(0);
mail = GetMailboxSlotInfo(gUnknown_203B304->mailboxIndex);
gUnknown_203B304->mailIndex = mail->dungeon.floor;
gUnknown_203B304->mailIndex = mail->unk4.dungeon.floor;
gUnknown_203B304->fallbackState = MAIL_MENU_1;
SetMailboxState(DISPLAY_SEL_PKMN_NEWS);
break;

View File

@ -62,7 +62,7 @@ void ResetMailbox(void)
void ResetMailboxSlot(u8 index)
{
gUnknown_203B490->mailboxSlots[index].mailType = MAIL_TYPE_NONE;
gUnknown_203B490->mailboxSlots[index].dungeon.id = 99;
gUnknown_203B490->mailboxSlots[index].dungeon.floor = 0;
gUnknown_203B490->mailboxSlots[index].unk4.dungeon.id = 99;
gUnknown_203B490->mailboxSlots[index].unk4.dungeon.floor = 0;
gUnknown_203B490->mailboxSlots[index].rewardType = MONEY1;
}

View File

@ -13,7 +13,16 @@
extern bool8 sub_8044B28(void);
extern void sub_80429C8(struct Entity *r0);
extern u16 gNaturePowerMoveTable[];
typedef bool8 (*MoveCallback)(struct Entity *pokemon, struct Entity *target, struct Move *move, s32 param_4);
struct NaturePowerMove
{
u16 moveID;
u16 unk2;
MoveCallback move;
};
extern struct NaturePowerMove gNaturePowerMoveTable[76];
bool8 sub_805755C(struct Entity* pokemon,u16 param_2);
u32 sub_8057144(struct Entity * pokemon)
@ -104,7 +113,7 @@ bool8 sub_80571F0(struct Entity * pokemon, struct Move *move)
if (0x4a < tileset) {
tileset = 0x4a;
}
if (gNaturePowerMoveTable[tileset << 2] == MOVE_EARTHQUAKE) return FALSE;
if (gNaturePowerMoveTable[tileset].moveID == MOVE_EARTHQUAKE) return FALSE;
}
}
return TRUE;

View File

@ -34,9 +34,8 @@ struct unkStruct_203B35C
struct PokemonStruct unk2BC;
struct unkStruct_203B480 unk314;
struct PokemonStruct unk344;
s32 unk39C;
u8 fill3A0[0x450 - 0x3A0];
s32 unk450;
u8 unk39C[0xB4];
u8 unk450[0xB4];
};
EWRAM_DATA_2 struct unkStruct_203B35C *gUnknown_203B35C = {0};
@ -470,8 +469,8 @@ void sub_8036FDC(s32 param_1)
sub_800641C(0,1,1);
ResetSprites(FALSE);
if (gUnknown_203B35C == NULL) {
gUnknown_203B35C = MemoryAlloc(0x504,8);
MemoryFill8((u8 *)gUnknown_203B35C,0,0x504);
gUnknown_203B35C = MemoryAlloc(sizeof(struct unkStruct_203B35C),8);
MemoryFill8((u8 *)gUnknown_203B35C,0,sizeof(struct unkStruct_203B35C));
}
gUnknown_203B35C->unk0 = param_1;

View File

@ -15,6 +15,7 @@
#include "code_80130A8.h"
#include "code_801B3C0.h"
#include "code_80118A4.h"
#include "event_flag.h"
struct unkStruct_203B2B8
{
@ -165,7 +166,6 @@ ALIGNED(4) static const u8 fill0[] = "pksdir0";
extern u32 sub_8026F04(struct PokemonStruct *);
extern void sub_8026074(s32);
bool8 CanTakePokemonHeldItem(struct PokemonStruct *r0);
extern bool8 sub_80023E4(u8);
extern struct PokemonStruct *sub_808D3F8(void);
extern struct PokemonStruct *sub_808D3BC(void);
extern void sub_801F214(void);
@ -638,14 +638,14 @@ void sub_80268CC(void)
pokeStruct = (struct PokemonStruct*)addr;
#endif
pokeStruct->unk0 |= 2;
pokeStruct->unk0 |= FLAG_ON_TEAM;
nullsub_104();
}
sub_808ED00();
sub_8026074(5);
break;
case 7:
gUnknown_203B2B8->pokeStruct->unk0 &= 0xfffd;
gUnknown_203B2B8->pokeStruct->unk0 &= ~(FLAG_ON_TEAM);
nullsub_104();
sub_808ED00();
sub_8026074(6);

View File

@ -220,7 +220,7 @@ void sub_802EA58(void)
case PELIPPER_JOB_INFO:
sub_803B35C(GetPelipperBoardSlotInfo(gPelipperBoard->jobIndex), &gPelipperBoard->unkC);
gPelipperBoard->unkC.unk0[0] = 3;
gPelipperBoard->unkC.unk44 = 0;
gPelipperBoard->unkC.mailStatus = MAIL_STATUS_SUSPENDED;
sub_802DE84(&gPelipperBoard->unkC);
break;
case PELIPPER_JOB_LIST_MENU:
@ -467,4 +467,4 @@ void CreatePelipperAcceptedStatusBox(u32 r0)
xxx_call_draw_string(0x16, 0xD, gPelipperStatusSlash, r0, 0); // "/"
sub_8012BC4(0x23, 0xD, MAX_ACCEPTED_JOBS, 2, 7, r0);
sub_80073E0(r0);
}
}

View File

@ -47,63 +47,65 @@ void InitializeRecruitedPokemon(void)
}
}
// void sub_808CE74(s32 _species, u8 a2, u8* a3)
// {
// struct PokemonStruct pokemon;
// u8 name_buffer[20];
// u8 friend_area;
// s32 i;
// register s16 species asm("r7") = (s16)_species;
// s32 cond = a2 << 24;
// pokemon.unk0 = 3;
// if (cond) {
// pokemon.unk2 = 1;
// pokemon.unk4.unk4 = 64;
// }
// else {
// pokemon.unk2 = 1;
// pokemon.unk4.unk4 = 65;
// }
// pokemon.unkHasNextStage = 1;
// pokemon.pokeHP = GetBaseHP(species);
// pokemon.offense.att[0] = GetBaseOffensiveStat(species, 0);
// pokemon.offense.att[1] = GetBaseOffensiveStat(species, 1);
// pokemon.offense.def[0] = GetBaseDefensiveStat(species, 0);
// pokemon.offense.def[1] = GetBaseDefensiveStat(species, 1);
// pokemon.IQ = 1;
// pokemon.unkC[0].unk0 = 0;
// pokemon.unkC[1].unk0 = 0;
// SetDefaultIQSkills((u8*)&pokemon.IQSkills, 0);
// pokemon.speciesNum = species;
// pokemon.heldItem.id = 0;
// pokemon.heldItem.quantity = 0;
// pokemon.unk1C = 0;
// pokemon.unk24 = 0;
// pokemon.unk4.unk5 = 0;
// sub_808E490(pokemon.moves, species);
// // mostly incorrect below this:
// if (!a3) {
// CopyMonsterNametoBuffer(name_buffer, species);
// BoundedCopyStringtoBuffer(pokemon.name, name_buffer, 10);
// }
// else {
// s32 j;
// for (j = 0; j < 10; j++) {
// pokemon.name[j] = a3[j];
// }
// }
// friend_area = gMonsterParameters[species].friend_area;
// for (i = 0; i < 413; i++) {
// if (!((u8)gRecruitedPokemonRef->pokemon[i].unk0 & 1)) {
// u8 species_friend_area = sub_80923D4(i);
// if (species_friend_area == friend_area) {
// gRecruitedPokemonRef->pokemon[i] = pokemon;
// gFriendAreas[species_friend_area] = 1;
// sub_80980B4(species);
// break;
// }
// }
// }
// }
// https://decomp.me/scratch/wQbZB
// void sub_808CE74(s16 _species, bool8 _isLeader, u8* name)
// {
// struct PokemonStruct pokemon;
// struct PokemonStruct *temp;
// u8 name_buffer[20];
// u32 friendArea;
// s32 i;
// s32 species = _species;
// bool32 isLeader = _isLeader << 24;
//
// pokemon.unk0 = 3;
// if (isLeader) {
// pokemon.isTeamLeader = TRUE;
// pokemon.dungeonLocation.id = DUNGEON_JOIN_LOCATION_LEADER;
// }
// else {
// pokemon.isTeamLeader = FALSE;
// pokemon.dungeonLocation.id = DUNGEON_JOIN_LOCATION_PARTNER;
// }
// pokemon.level = 1;
// pokemon.pokeHP = GetBaseHP(species);
// pokemon.offense.att[0] = GetBaseOffensiveStat(species, 0);
// pokemon.offense.att[1] = GetBaseOffensiveStat(species, 1);
// pokemon.offense.def[0] = GetBaseDefensiveStat(species, 0);
// pokemon.offense.def[1] = GetBaseDefensiveStat(species, 1);
// pokemon.IQ = 1;
// pokemon.unkC[0].level = 0;
// pokemon.unkC[1].level = 0;
// SetDefaultIQSkills((u8*)&pokemon.IQSkills, FALSE);
// pokemon.speciesNum = species;
// pokemon.heldItem.id = ITEM_NOTHING;
// pokemon.heldItem.quantity = 0;
// pokemon.currExp = 0;
// pokemon.tacticIndex = 0; // TACTIC_LETS_GO_TOGETHER
// pokemon.dungeonLocation.floor = 0;
// sub_808E490(pokemon.moves, species);
//
// if (name == NULL) {
// CopyMonsterNametoBuffer(name_buffer, species);
// BoundedCopyStringtoBuffer(pokemon.name, name_buffer, POKEMON_NAME_LENGTH);
// }
// else {
// s32 j;
// for (j = 0; j < POKEMON_NAME_LENGTH; j++) {
// pokemon.name[j] = name[j];
// }
// }
// friendArea = gMonsterParameters[species].friendArea;
// for (i = 0; i < NUM_MONSTERS; i++) {
// temp = &gRecruitedPokemonRef->pokemon[i];
// if (!((u8)gRecruitedPokemonRef->pokemon[i].unk0 & 1)) {
// u8 speciesFriendArea = sub_80923D4(i);
// if (speciesFriendArea == friendArea) {
// gRecruitedPokemonRef->pokemon[i] = pokemon;
// gFriendAreas[speciesFriendArea] = TRUE;
// sub_80980B4(species);
// break;
// }
// }
// }
// }

View File

@ -1,15 +1,20 @@
#include "global.h"
#include "pokemon_3.h"
#include "pokemon.h"
#include "pokemon_3.h"
#include "random.h"
#include "constants/evolve_type.h"
#include "constants/evolution_status.h"
#include "constants/iq_skill.h"
#include "constants/tactic.h"
#include "sprite.h"
#include "text_util.h"
#include "friend_area.h"
#include "luminous_cave.h"
extern u8 *gIQSkillNames[];
extern u32 gIQSkillDescriptions[];
extern u32 gTacticsDescriptions[];
extern u8 *gIQSkillDescriptions[];
extern u8 *gTacticsDescriptions[];
extern u8 *gTactics[];
extern bool8 gTacticsTargetLeader[];
@ -53,7 +58,10 @@ extern void sub_808F448(struct unkStruct_8094924*, struct unkStruct_808E6F4*);
extern void sub_80941FC(struct unkStruct_8094924*, void*);
extern void sub_809447C(struct unkStruct_8094924*, void*);
extern void sub_808F428(struct unkStruct_8094924*, struct unkStruct_808E6F4*);
s16 GetPokemonEvolveConditions(s16 index, struct unkEvolve *r1);
u32 sub_808F798(struct PokemonStruct *, s16);
void sub_8097848(void);
bool8 sub_808E668(s16 species, s16* a2, s16* a3)
{
@ -96,14 +104,14 @@ void sub_808E6F4(struct unkStruct_808E6F4* a1)
a1->unk2 = 2;
}
bool8 HasRecruitedMon(s16 species_) {
s32 species = species_;
bool8 HasRecruitedMon(s16 species) {
s32 species_s32 = species;
s32 i = 0;
struct PokemonStruct *pokemon = gRecruitedPokemonRef->pokemon;
for (i = 0; i < NUM_MONSTERS; i++) {
if (((u8)pokemon->unk0 & 1)) {
if(pokemon->speciesNum == species)
if(pokemon->speciesNum == species_s32)
return TRUE;
}
pokemon++;
@ -111,7 +119,7 @@ bool8 HasRecruitedMon(s16 species_) {
return FALSE;
}
s32 GetBaseSpecies(s16 index) {
s16 GetBaseSpecies(s16 index) {
if (index == MONSTER_CASTFORM_SNOWY)
return MONSTER_CASTFORM;
if (index == MONSTER_CASTFORM_SUNNY)
@ -453,24 +461,24 @@ void sub_808E9EC(struct PokemonStruct *r0, struct unkStruct_808E9EC *r1)
}
#endif
u8 *GetIQSkillName(u8 r0)
u8 *GetIQSkillName(u8 skill)
{
return gIQSkillNames[r0];
return gIQSkillNames[skill];
}
void CopyTacticsNameToBuffer(char *r0, u8 r1)
void CopyTacticsNameToBuffer(char *buffer, u8 tactic)
{
strncpy(r0, gTactics[r1], 0x14);
strncpy(buffer, gTactics[tactic], 0x14);
}
u32 GetIQSkillDescription(u8 r0)
u8 *GetIQSkillDescription(u8 skill)
{
return gIQSkillDescriptions[r0];
return gIQSkillDescriptions[skill];
}
u32 GetTacticsDescription(u8 r0)
u8 *GetTacticsDescription(u8 tactic)
{
return gTacticsDescriptions[r0];
return gTacticsDescriptions[tactic];
}
bool8 TacticsTargetLeader(u8 tactic)
@ -674,7 +682,7 @@ s32 SaveRecruitedPokemon(u8 *a1, s32 a2)
pokemon = &gRecruitedPokemonRef->pokemon[i];
if (pokemon->unk0 & 1) {
if (pokemon->unk0 & 2) {
if (pokemon->unk0 & FLAG_ON_TEAM) {
buffer[count++] = i;
}
if (pokemon->isTeamLeader) {
@ -682,7 +690,7 @@ s32 SaveRecruitedPokemon(u8 *a1, s32 a2)
}
}
else {
pokemon->unkHasNextStage = 0;
pokemon->level = 0;
}
SavePokemonStruct(&backup, pokemon);
}
@ -722,7 +730,7 @@ s32 RestoreRecruitedPokemon(u8 *a1, s32 a2)
RestoreIntegerBits(&backup, &data_u8, 1);
RestorePokemonStruct(&backup, &gRecruitedPokemonRef->team[i]);
if (data_u8 & 1) {
gRecruitedPokemonRef->team[i].unk0 = 3;
gRecruitedPokemonRef->team[i].unk0 = 3; // FLAG_ON_TEAM (2) + ??? (1)
}
else {
gRecruitedPokemonRef->team[i].unk0 = 0;
@ -732,12 +740,12 @@ s32 RestoreRecruitedPokemon(u8 *a1, s32 a2)
for (i = 0; i < 6; i++) {
RestoreIntegerBits(&backup, &data_s16, 16);
if ((u16)data_s16 < NUM_MONSTERS) {
gRecruitedPokemonRef->pokemon[data_s16].unk0 |= 2;
gRecruitedPokemonRef->pokemon[data_s16].unk0 |= FLAG_ON_TEAM;
}
}
RestoreIntegerBits(&backup, &data_s16, 16);
if ((u16)data_s16 < NUM_MONSTERS) {
gRecruitedPokemonRef->pokemon[data_s16].isTeamLeader = 1;
gRecruitedPokemonRef->pokemon[data_s16].isTeamLeader = TRUE;
}
nullsub_102(&backup);
return backup.unk8;
@ -745,7 +753,7 @@ s32 RestoreRecruitedPokemon(u8 *a1, s32 a2)
void SavePokemonStruct(struct unkStruct_8094924* a1, struct PokemonStruct* pokemon)
{
SaveIntegerBits(a1, &pokemon->unkHasNextStage, 7);
SaveIntegerBits(a1, &pokemon->level, 7);
SaveIntegerBits(a1, &pokemon->speciesNum, 9);
SaveDungeonLocation(a1, &pokemon->dungeonLocation);
xxx_save_poke_sub_c_808F41C(a1, &pokemon->unkC[0]);
@ -756,9 +764,9 @@ void SavePokemonStruct(struct unkStruct_8094924* a1, struct PokemonStruct* pokem
SaveIntegerBits(a1, &pokemon->offense.att[1], 8);
SaveIntegerBits(a1, &pokemon->offense.def[0], 8);
SaveIntegerBits(a1, &pokemon->offense.def[1], 8);
SaveIntegerBits(a1, &pokemon->unk1C, 24);
SaveIntegerBits(a1, &pokemon->currExp, 24);
SaveIntegerBits(a1, &pokemon->IQSkills, 24);
SaveIntegerBits(a1, &pokemon->unk24, 4);
SaveIntegerBits(a1, &pokemon->tacticIndex, 4);
SaveHeldItem(a1, &pokemon->heldItem);
SavePokemonMoves(a1, pokemon->moves);
SaveIntegerBits(a1, pokemon->name, 80);
@ -769,8 +777,8 @@ void RestorePokemonStruct(struct unkStruct_8094924* a1, struct PokemonStruct* po
memset(pokemon, 0, sizeof(struct PokemonStruct));
pokemon->unk0 = 0;
pokemon->isTeamLeader = 0;
RestoreIntegerBits(a1, &pokemon->unkHasNextStage, 7);
if (pokemon->unkHasNextStage) {
RestoreIntegerBits(a1, &pokemon->level, 7);
if (pokemon->level) {
pokemon->unk0 |= 1;
}
RestoreIntegerBits(a1, &pokemon->speciesNum, 9);
@ -783,9 +791,9 @@ void RestorePokemonStruct(struct unkStruct_8094924* a1, struct PokemonStruct* po
RestoreIntegerBits(a1, &pokemon->offense.att[1], 8);
RestoreIntegerBits(a1, &pokemon->offense.def[0], 8);
RestoreIntegerBits(a1, &pokemon->offense.def[1], 8);
RestoreIntegerBits(a1, &pokemon->unk1C, 24);
RestoreIntegerBits(a1, &pokemon->currExp, 24);
RestoreIntegerBits(a1, &pokemon->IQSkills, 24);
RestoreIntegerBits(a1, &pokemon->unk24, 4);
RestoreIntegerBits(a1, &pokemon->tacticIndex, 4);
RestoreHeldItem(a1, &pokemon->heldItem);
RestorePokemonMoves(a1, pokemon->moves);
RestoreIntegerBits(a1, pokemon->name, 80);
@ -807,7 +815,7 @@ s32 SavePokemonStruct2(u8* a1, s32 size)
SaveIntegerBits(&backup, &pokemon2->unk0, 2);
SaveIntegerBits(&backup, pokemon2->isTeamLeader ? &data_u8_neg1 : &data_u8_zero, 1);
SaveIntegerBits(&backup, &pokemon2->unkHasNextStage, 7);
SaveIntegerBits(&backup, &pokemon2->level, 7);
SaveDungeonLocation(&backup, &pokemon2->dungeonLocation);
SaveIntegerBits(&backup, &pokemon2->IQ, 10);
@ -820,13 +828,13 @@ s32 SavePokemonStruct2(u8* a1, s32 size)
SaveIntegerBits(&backup, &pokemon2->offense.att[1], 8);
SaveIntegerBits(&backup, &pokemon2->offense.def[0], 8);
SaveIntegerBits(&backup, &pokemon2->offense.def[1], 8);
SaveIntegerBits(&backup, &pokemon2->unk18, 24);
SaveIntegerBits(&backup, &pokemon2->currExp, 24);
sub_8094184(&backup, &pokemon2->moves);
SaveItemSlot(&backup, &pokemon2->itemSlot);
sub_809449C(&backup, &pokemon2->unk44);
sub_809449C(&backup, &pokemon2->unk48);
SaveIntegerBits(&backup, &pokemon2->IQSkills, 24);
SaveIntegerBits(&backup, &pokemon2->unk50, 4);
SaveIntegerBits(&backup, &pokemon2->tacticIndex, 4);
sub_808F448(&backup, &pokemon2->unk54);
SaveIntegerBits(&backup, &pokemon2->name, 80);
}
@ -855,7 +863,7 @@ s32 RestorePokemonStruct2(u8* a1, s32 size)
else {
pokemon2->isTeamLeader = FALSE;
}
RestoreIntegerBits(&backup, &pokemon2->unkHasNextStage, 7);
RestoreIntegerBits(&backup, &pokemon2->level, 7);
RestoreDungeonLocation(&backup, &pokemon2->dungeonLocation);
RestoreIntegerBits(&backup, &pokemon2->IQ, 10);
@ -868,13 +876,13 @@ s32 RestorePokemonStruct2(u8* a1, s32 size)
RestoreIntegerBits(&backup, &pokemon2->offense.att[1], 8);
RestoreIntegerBits(&backup, &pokemon2->offense.def[0], 8);
RestoreIntegerBits(&backup, &pokemon2->offense.def[1], 8);
RestoreIntegerBits(&backup, &pokemon2->unk18, 24);
RestoreIntegerBits(&backup, &pokemon2->currExp, 24);
sub_80941FC(&backup, &pokemon2->moves);
RestoreItemSlot(&backup, &pokemon2->itemSlot);
sub_809447C(&backup, &pokemon2->unk44);
sub_809447C(&backup, &pokemon2->unk48);
RestoreIntegerBits(&backup, &pokemon2->IQSkills, 24);
RestoreIntegerBits(&backup, &pokemon2->unk50, 4);
RestoreIntegerBits(&backup, &pokemon2->tacticIndex, 4);
sub_808F428(&backup, &pokemon2->unk54);
RestoreIntegerBits(&backup, &pokemon2->name, 80);
}
@ -884,12 +892,12 @@ s32 RestorePokemonStruct2(u8* a1, s32 size)
void xxx_restore_poke_sub_c_808F410(struct unkStruct_8094924* a1, struct unkPokeSubStruct_C* unkC)
{
RestoreIntegerBits(a1, &unkC->unk0, 7);
RestoreIntegerBits(a1, &unkC->level, 7);
}
void xxx_save_poke_sub_c_808F41C(struct unkStruct_8094924* a1, struct unkPokeSubStruct_C* unkC)
{
SaveIntegerBits(a1, &unkC->unk0, 7);
SaveIntegerBits(a1, &unkC->level, 7);
}
void sub_808F428(struct unkStruct_8094924* a1, struct unkStruct_808E6F4* a2)
@ -903,3 +911,210 @@ void sub_808F448(struct unkStruct_8094924* a1, struct unkStruct_808E6F4* a2)
SaveIntegerBits(a1, &a2->unk0, 10);
SaveIntegerBits(a1, &a2->unk2, 5);
}
void sub_808F468(struct PokemonStruct *param_1, struct EvolveStatus *evolveStatus, u8 param_3)
{
bool8 evolFlag;
u8 friendArea;
u8 uVar2;
s32 numPokemon;
struct unkStruct_8092638 local_40; // sp 0x0
struct unkEvolve evolveConditions; // r7
s32 index, index2;
#ifndef NONMATCHING
register s32 defaultReason asm("sl");
#else
s32 defaultReason;
#endif
evolveStatus->evolutionConditionStatus = 0;
for(index = MONSTER_BULBASAUR; index <= MONSTER_MAX; index++)
{
if ((s16)index == MONSTER_ALAKAZAM) {
GetPokemonEvolveConditions(MONSTER_ALAKAZAM, &evolveConditions);
}
else {
GetPokemonEvolveConditions(index, &evolveConditions);
}
if(((evolveConditions.preEvolution.evolveType != EVOLVE_TYPE_NONE) && (param_1->speciesNum == evolveConditions.preEvolution.evolveFrom)))
break;
};
if (index == MONSTER_MAX + 1) {
evolveStatus->evolutionConditionStatus = EVOLUTION_NO_MORE;
}
else {
for(index = MONSTER_BULBASAUR, defaultReason = EVOLUTION_LACK_ITEM; index <= MONSTER_MAX; index++)
{
evolFlag = FALSE;
index2 = (s16)index;
GetPokemonEvolveConditions(index2, &evolveConditions);
if ((evolveConditions.preEvolution.evolveType == EVOLVE_TYPE_NONE) || (param_1->speciesNum != evolveConditions.preEvolution.evolveFrom)) continue;
friendArea = ((u8 (*)(s32))GetFriendArea)(index2); // UB
uVar2 = GetFriendArea(param_1->speciesNum);
sub_8092638(friendArea,&local_40,FALSE,FALSE);
if (!local_40.hasFriendArea) {
evolveStatus->evolutionConditionStatus |= EVOLUTION_LACK_FRIEND_AREA;
evolFlag = TRUE;
}
else {
numPokemon = local_40.unk2;
if (friendArea == uVar2) {
numPokemon--;
}
if (local_40.numPokemon <= numPokemon) {
evolveStatus->evolutionConditionStatus |= EVOLUTION_LACK_ROOM;
evolFlag = TRUE;
}
}
if (evolveConditions.preEvolution.evolveType == EVOLVE_TYPE_LEVEL) {
if ((evolveStatus->evolutionConditionStatus & EVOLUTION_GOOD)) continue;
if (param_1->level < evolveConditions.evolutionRequirements.mainRequirement) {
evolveStatus->evolutionConditionStatus |= EVOLUTION_LACK_LEVEL;
evolFlag = TRUE;
}
}
else if (evolveConditions.preEvolution.evolveType == EVOLVE_TYPE_IQ) {
if (param_1->IQ < evolveConditions.evolutionRequirements.mainRequirement) {
evolveStatus->evolutionConditionStatus |= EVOLUTION_LACK_IQ;
evolFlag = TRUE;
}
}
else if (evolveConditions.preEvolution.evolveType == EVOLVE_TYPE_ITEM) {
if (param_3 != 0) {
if ((evolveStatus->evoItem1 != evolveConditions.evolutionRequirements.mainRequirement) &&
(evolveStatus->evoItem2 != evolveConditions.evolutionRequirements.mainRequirement)) {
evolveStatus->evolutionConditionStatus |= defaultReason;
evolFlag = TRUE;
}
}
else
{
if (FindItemInInventory(evolveConditions.evolutionRequirements.mainRequirement) < 0) {
evolveStatus->evolutionConditionStatus |= defaultReason;
evolFlag = TRUE;
}
}
}
if (evolveConditions.evolutionRequirements.additionalRequirement == 4) {
if (param_3 != 0) {
if ((evolveStatus->evoItem1 != ITEM_LINK_CABLE) && (evolveStatus->evoItem2 != ITEM_LINK_CABLE))
{
evolveStatus->evolutionConditionStatus |= defaultReason;
continue;
}
}
else
{
if (-1 < FindItemInInventory(ITEM_LINK_CABLE)) goto _0808F6CA;
evolveStatus->evolutionConditionStatus |= defaultReason;
continue;
}
}
else if (evolveConditions.evolutionRequirements.additionalRequirement == 5) {
if ((param_1->offense).att[0] > (param_1->offense).def[0]) goto _0808F6CA;
else continue;
}
else if (evolveConditions.evolutionRequirements.additionalRequirement == 6) {
if ((param_1->offense).att[0] < (param_1->offense).def[0]) goto _0808F6CA;
else continue;
}
else if (evolveConditions.evolutionRequirements.additionalRequirement == 7) {
if ((param_1->offense).att[0] == (param_1->offense).def[0]) goto _0808F6CA;
else continue;
}
else if (evolveConditions.evolutionRequirements.additionalRequirement == 8)
{
if (param_3 != 0) {
if ((evolveStatus->evoItem1 != ITEM_SUN_RIBBON) && (evolveStatus->evoItem2 != ITEM_SUN_RIBBON))
{
evolveStatus->evolutionConditionStatus |= defaultReason;
continue;
}
else goto _0808F6CA;
}
else {
if (-1 < FindItemInInventory(ITEM_SUN_RIBBON)) goto _0808F6CA;
evolveStatus->evolutionConditionStatus |= defaultReason;
continue;
}
}
else if (evolveConditions.evolutionRequirements.additionalRequirement == 9) {
if (param_3 != 0) {
if ((evolveStatus->evoItem1 != ITEM_LUNAR_RIBBON) && (evolveStatus->evoItem2 != ITEM_LUNAR_RIBBON))
{
evolveStatus->evolutionConditionStatus |= defaultReason;
continue;
}
else goto _0808F6CA;
}
else
{
if (-1 < FindItemInInventory(ITEM_LUNAR_RIBBON)) goto _0808F6CA;
evolveStatus->evolutionConditionStatus |= defaultReason;
continue;
}
}
else if (evolveConditions.evolutionRequirements.additionalRequirement == 0xb) {
if ((evolveStatus->unk6 & 1) == 0) goto _0808F6CA;
else continue;
}
else if (evolveConditions.evolutionRequirements.additionalRequirement == 0xc) {
if ((evolveStatus->unk6 & 1)) goto _0808F6CA;
else continue;
}
else if (evolveConditions.evolutionRequirements.additionalRequirement == 10) {
if (param_3 != 0) {
if ((evolveStatus->evoItem1 == ITEM_BEAUTY_SCARF) || (evolveStatus->evoItem2 == ITEM_BEAUTY_SCARF)) goto _0808F6CA;
else continue;
}
else
{
if ( FindItemInInventory(ITEM_BEAUTY_SCARF) < 0) evolFlag = TRUE;
}
}
_0808F6CA:
if (!evolFlag) {
evolveStatus->evolutionConditionStatus |= EVOLUTION_GOOD;
evolveStatus->targetEvolveSpecies = index2;
}
}
}
}
u8 sub_808F700(struct PokemonStruct *pokemon)
{
struct EvolveStatus evolveStatus;
sub_808F468(pokemon, &evolveStatus, 0);
if ((evolveStatus.evolutionConditionStatus & EVOLUTION_GOOD)) {
return 1;
}
else if ((evolveStatus.evolutionConditionStatus & EVOLUTION_NO_MORE)) {
return 2;
}
else {
return 0;
}
}
u32 sub_808F734(struct PokemonStruct *pokemon, s16 _species)
{
u32 uVar1;
int iVar3;
struct PokemonStruct pokeStruct;
s32 species = _species;
iVar3 = 0;
pokeStruct = *pokemon;
uVar1 = sub_808F798(pokemon, species);
if (species == MONSTER_NINJASK) {
pokeStruct.isTeamLeader = FALSE;
pokeStruct.heldItem.id = ITEM_NOTHING;
BoundedCopyStringtoBuffer(pokeStruct.name, GetMonSpecies(MONSTER_SHEDINJA),POKEMON_NAME_LENGTH);
iVar3 = sub_808F798(&pokeStruct,MONSTER_SHEDINJA);
}
if (iVar3 != 0) {
sub_8097848();
}
return uVar1;
}

View File

@ -1,5 +1,6 @@
#include "global.h"
#include "pokemon.h"
#include "pokemon_3.h"
#include "file_system.h"
#include "item.h"
#include "moves.h"
@ -29,7 +30,6 @@ extern u16 gLevelCurrentPokeId;
extern struct LevelData gLevelCurrentData[];
extern s16 GetBaseSpecies(s16);
extern int sprintf(char *, const char *, ...);
extern u32 ReturnIntFromChar(u8 r0);
extern void CopyAndResetMoves(void*, void*);
@ -524,7 +524,7 @@ void xxx_pokemonstruct_to_pokemon2_808DE50(struct PokemonStruct2 * a1, struct Po
u32 somestruct2_80943A0;
a1->unk0 = pokemon->unk0;
a1->unkHasNextStage = pokemon->unkHasNextStage;
a1->level = pokemon->level;
a1->IQ = pokemon->IQ;
a1->IQSkills = pokemon->IQSkills;
sub_808E6F4(&a1->unk54);
@ -532,7 +532,7 @@ void xxx_pokemonstruct_to_pokemon2_808DE50(struct PokemonStruct2 * a1, struct Po
a1->isTeamLeader = pokemon->isTeamLeader;
a1->unkA = a3;
a1->speciesNum = pokemon->speciesNum;
a1->unk50 = pokemon->unk24;
a1->tacticIndex = pokemon->tacticIndex;
a1->unk12 = pokemon->pokeHP;
a1->unk10 = pokemon->pokeHP;
@ -541,7 +541,7 @@ void xxx_pokemonstruct_to_pokemon2_808DE50(struct PokemonStruct2 * a1, struct Po
a1->offense.def[i] = pokemon->offense.def[i];
}
a1->unk18 = pokemon->unk1C;
a1->currExp = pokemon->currExp;
CopyAndResetMoves(&a1->moves, &pokemon->moves);
for (i = 0; i < POKEMON_NAME_LENGTH; i++) {
@ -578,13 +578,13 @@ void xxx_pokemon2_to_pokemonstruct_808DF44(struct PokemonStruct* pokemon, struct
s32 i;
pokemon->unk0 = a2->unk0;
pokemon->unkHasNextStage = a2->unkHasNextStage;
pokemon->level = a2->level;
pokemon->IQ = a2->IQ;
pokemon->IQSkills = a2->IQSkills;
pokemon->dungeonLocation = a2->dungeonLocation;
pokemon->isTeamLeader = a2->isTeamLeader;
pokemon->speciesNum = a2->speciesNum;
pokemon->unk24 = a2->unk50;
pokemon->tacticIndex = a2->tacticIndex;
pokemon->pokeHP = a2->unk12;
for (i = 0; i < 2; i++) {
@ -592,7 +592,7 @@ void xxx_pokemon2_to_pokemonstruct_808DF44(struct PokemonStruct* pokemon, struct
pokemon->offense.def[i] = a2->offense.def[i];
}
pokemon->unk1C = a2->unk18;
pokemon->currExp = a2->currExp;
CopyBareMoveData(pokemon->moves, &a2->moves);
for (i = 0; i < POKEMON_NAME_LENGTH; i++) {
@ -771,7 +771,7 @@ s32 sub_808E218(struct unkStruct_808E218_arg* a1, struct PokemonStruct* pokemon)
ptr = DecompressMoveID(ptr, &result);
value = *ptr++;
if (value > evolve_sequence[i].unkHasNextStage) {
if (value > evolve_sequence[i].level) {
break;
}
@ -815,14 +815,14 @@ s32 GetEvolutionSequence(struct PokemonStruct* pokemon, struct EvolveStage* a2)
s32 i;
a2[0].specesNum = pokemon->speciesNum;
a2[0].unkHasNextStage = pokemon->unkHasNextStage;
a2[0].level = pokemon->level;
count = 1;
species = pokemon->speciesNum;
i = 0;
for (; i < 2; i++) {
if (!pokemon->unkC[i].unk0) {
if (!pokemon->unkC[i].level) {
break;
}
species = GetPokemonEvolveFrom(species);
@ -830,7 +830,7 @@ s32 GetEvolutionSequence(struct PokemonStruct* pokemon, struct EvolveStage* a2)
break;
}
a2[1 + i].speciesNum = species;
a2[1 + i].unkHasNextStage = pokemon->unkC[i].unk0;
a2[1 + i].level = pokemon->unkC[i].level;
// wrong increment order:
count++;
}
@ -843,7 +843,7 @@ s32 GetEvolutionSequence(struct PokemonStruct* pokemon, struct EvolveStage* a2)
struct unkPokeSubStruct_C* has_next_stage;
a2[0].speciesNum = pokemon->speciesNum;
a2[0].unkHasNextStage = pokemon->unkHasNextStage;
a2[0].level = pokemon->level;
count = 1;
species = pokemon->speciesNum;
@ -852,7 +852,7 @@ s32 GetEvolutionSequence(struct PokemonStruct* pokemon, struct EvolveStage* a2)
stage = &a2[1];
for (; i < 2; i++) {
if (!has_next_stage->unk0) {
if (!has_next_stage->level) {
break;
}
species = GetPokemonEvolveFrom(species);
@ -860,7 +860,7 @@ s32 GetEvolutionSequence(struct PokemonStruct* pokemon, struct EvolveStage* a2)
break;
}
stage->speciesNum = species;
stage->unkHasNextStage = has_next_stage->unk0;
stage->level = has_next_stage->level;
stage++;
count++;
has_next_stage++;

View File

@ -605,7 +605,7 @@ void DisplayMissionObjectives(void)
mail = GetMailatIndex(local_94);
sub_803B6B0(10,16,3,gUnknown_203B330->unk10);
// %dF
sprintfStatic(buffer,gUnknown_80E1F3C,mail->dungeon.floor);
sprintfStatic(buffer,gUnknown_80E1F3C,mail->unk4.dungeon.floor);
xxx_call_draw_string(0x15,16,buffer,gUnknown_203B330->unk10,0);
// Rescue #C6%s#R
sprintfStatic(buffer,gUnknown_80E1F40,GetMonSpecies(mail->clientSpecies));
@ -624,11 +624,11 @@ void DisplayMissionObjectives(void)
for(jobSlotIdx = 0; jobSlotIdx < MAX_ACCEPTED_JOBS; jobSlotIdx++)
{
jobInfo = GetJobSlotInfo(jobSlotIdx);
if ((((jobInfo->dungeon.id == gUnknown_203B330->dungeonIndex) && (jobInfo->mailType != 0)
if ((((jobInfo->unk4.dungeon.id == gUnknown_203B330->dungeonIndex) && (jobInfo->mailType != 0)
) && (jobInfo->mailType != MAIL_TYPE_SUSPENDED_JOB)) && (jobInfo->mailType != MAIL_TYPE_UNK7)) {
sub_803B6B0(10,yCoord,3,gUnknown_203B330->unk10);
if (jobInfo->missionType != WONDER_MAIL_MISSION_TYPE_FIND_ITEM) {
sprintfStatic(buffer1,gUnknown_80E1F3C,jobInfo->dungeon.floor);
sprintfStatic(buffer1,gUnknown_80E1F3C,jobInfo->unk4.dungeon.floor);
xxx_call_draw_string(21,yCoord,buffer1,gUnknown_203B330->unk10,0);
}
switch(jobInfo->missionType)

View File

@ -635,7 +635,7 @@ u32 ConvertMenutoRescuePasswordState(u32 unused)
u32 sub_8039068(u32 mailMode, u8 *passwordBuffer, struct unkStruct_203B480 *param_3)
{
if ( (!sub_803D204(passwordBuffer, param_3)) || (WONDER_MAIL_TYPE_OKD < param_3->mailType) ||
(param_3->dungeon.floor >= GetDungeonFloorCount(param_3->dungeon.id)) ||
(param_3->unk4.dungeon.floor >= GetDungeonFloorCount(param_3->unk4.dungeon.id)) ||
(param_3->clientSpecies == MONSTER_NONE) || (MONSTER_MAX < param_3->clientSpecies) ||
(IsInvalidItemReward(param_3->item.id))) {
return PASSWORD_ENTRY_INCORRECT_PASSWORD;

View File

@ -2,11 +2,11 @@
#include "rescue_team_info.h"
#include "code_8092334.h"
#include "text_util.h"
#include "event_flag.h"
EWRAM_DATA_2 struct RescueTeamData *gRescueTeamInfoRef = {0};
EWRAM_DATA struct RescueTeamData gRescueTeamInfo = {0};
extern bool8 sub_80023E4(u32);
extern void BoundedCopyStringtoBuffer(u8 *buffer, u8 *string, s32 size);
extern const u8 *gRescueTeamRanks[];

View File

@ -158,7 +158,7 @@ typedef bool8 (*MoveCallback)(struct Entity *pokemon, struct Entity *target, str
struct NaturePowerMove
{
s16 moveID;
u16 moveID;
u16 unk2;
MoveCallback move;
};
@ -218,7 +218,7 @@ bool8 TransformMoveAction(struct Entity * pokemon, struct Entity * target, struc
}
else {
move->PP = 0;
sub_8078E18(pokemon,target);
TransformStatusTarget(pokemon,target);
return TRUE;
}
}

View File

@ -1396,7 +1396,7 @@ void UpdateThankYouMailText(void)
else
gUnknown_203B2C4->unk53C.itemRewards[0] = ITEM_NOTHING; // unk558
gUnknown_203B2C4->unk53C.quantity = 1; // unk55B
gUnknown_203B2C4->unk53C.teamRankPtsReward = GetDungeonTeamRankPts(&mail->dungeon, 0); // unk560
gUnknown_203B2C4->unk53C.teamRankPtsReward = GetDungeonTeamRankPts(&mail->unk4.dungeon, 0); // unk560
gUnknown_203B2C4->unk53C.itemRewards[1] = 0; // unk559
gUnknown_203B2C4->unk53C.itemRewards[2] = 0; // unk55A
gUnknown_203B2C4->unk53C.friendAreaReward = 0; // unk55C

View File

@ -1,6 +1,12 @@
#include "global.h"
#include "constants/friend_area.h"
#include "pokemon.h"
#include "constants/input.h"
#include "file_system.h"
#include "menu.h"
#include "pokemon.h"
#include "pokemon_3.h"
#include "input.h"
#include "team_inventory.h"
#include "text1.h"
#include "text2.h"
@ -10,17 +16,45 @@
#include "wigglytuff_shop.h"
#include "felicity_bank.h"
#include "code_80130A8.h"
#include "code_8021774_pre.h"
#include "code_801EE10_mid.h"
#include "code_8021774.h"
#include "code_80118A4.h"
#include "code_800D090.h"
#include "event_flag.h"
#include "exclusive_pokemon.h"
extern struct UnkTextStruct2 gUnknown_80DC534;
extern struct UnkTextStruct2 gUnknown_80DC564;
extern struct UnkTextStruct2 gUnknown_80DC54C;
extern struct UnkTextStruct2 gUnknown_80DC534;
struct unkStruct_203B280
{
/* 0x0 */ u8 friendAreas[NUM_FRIEND_AREAS];
/* 0x3C */ u32 mode;
struct MenuInputStruct unk40;
s32 unk74;
struct UnkTextStruct2 *unk78;
struct UnkTextStruct2 unk7C[4];
u8 unkDC[4];
};
EWRAM_DATA_2 struct unkStruct_203B280 *gUnknown_203B280 = {0};
EWRAM_DATA_2 u32 gUnknown_203B284 = {0};
EWRAM_DATA_2 u16 gUnknown_203B288 = {0};
EWRAM_DATA_2 u16 gUnknown_203B28A = {0};
struct unkStruct_203B28C
{
struct MenuInputStructSub unk0;
/* 0xC */ u8 friendArea;
bool8 unkD;
s16 unkE[0x10];
u32 unk30[0x10];
/* 0x70 */ s32 numPokemoninFriendArea;
s32 unk74;
struct UnkTextStruct2 *unk78;
struct UnkTextStruct2 unk7C[4];
u8 unkDC[4];
};
EWRAM_DATA_2 struct unkStruct_203B28C *gUnknown_203B28C = {0};
EWRAM_DATA_2 struct WigglytuffShop *gWigglytuffShop = {0};
extern u8 *gFriendAreas;
extern u8 gUnknown_202E628[];
extern u32 gUnknown_202DE30[2];
@ -35,13 +69,31 @@ extern const u8 *gUnknown_80D4928[];
extern const u8 *gUnknown_80D4934[];
extern const u8 *gUnknown_80D4970[];
extern const u8 *gUnknown_80D4978[];
extern struct UnkTextStruct2 gUnknown_80DC464;
extern struct UnkTextStruct2 gUnknown_80DC47C;
extern struct UnkTextStruct2 gUnknown_80DC4BC;
extern struct UnkTextStruct2 gUnknown_80DC4D8;
extern struct UnkTextStruct2 gUnknown_80DC534;
extern struct UnkTextStruct2 gUnknown_80DC54C;
extern struct UnkTextStruct2 gUnknown_80DC564;
extern u8 *gUnknown_80D49BC[];
extern u8 gUnknown_80DC4A4[];
extern u8 gUnknown_80DC494[];
extern u8 gUnknown_80DC4AC[];
extern u8 gUnknown_80DC4F0[];
extern u8 gUnknown_80DC518[];
extern u8 gUnknown_80DC524[];
u8 sub_8021700(u32);
void sub_8092578(u8 *buffer, u8 index, u8 r2);
extern void DrawTeamMoneyBox(u32);
extern void sub_803AA34();
extern u8 sub_803ABC8(void);
extern u8 sub_802132C(void);
extern void sub_8022380(void);
bool8 sub_8023144(s32 param_1, s32 index, struct UnkTextStruct2_sub *sub, u32 param_4);
void sub_8023354(u8 param_1);
extern bool8 sub_80023E4(u32);
extern void CreateWigglytuffConfirmFriendAreaMenu(void);
extern u8 sub_8099B94(void);
extern void sub_8099AFC(u32, u32, u32);
@ -65,6 +117,471 @@ void SetWigglytuffState(s32);
void sub_8021D5C(void);
void UpdateWigglytuffDialogue(void);
extern void sub_8008C54(u32);
void sub_8021878(void);
void sub_8021894(void);
void sub_8021820(void);
void sub_8021A60(void);
s32 sub_8021664(void);
void sub_8021410(void);
s32 sub_8021B58(s16 species);
extern void PlayMenuSoundEffect(u32);
bool8 sub_80211AC(u32 mode, u32 param_2)
{
if(sub_8021700(mode))
{
return FALSE;
}
else {
gUnknown_203B280 = MemoryAlloc(sizeof(struct unkStruct_203B280), 8);
gUnknown_203B280->mode = mode;
gUnknown_203B280->unk74 = param_2;
gUnknown_203B280->unk78 = &gUnknown_203B280->unk7C[gUnknown_203B280->unk74];
sub_8006518(gUnknown_203B280->unk7C);
gUnknown_203B280->unk7C[gUnknown_203B280->unk74] = gUnknown_80DC47C;
gUnknown_203B280->unk78->unk14 = gUnknown_203B280->unkDC;
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B280->unk7C, 1, 1);
sub_8013818(&gUnknown_203B280->unk40, sub_8021664(), 10, param_2);
if(gUnknown_203B284 == gUnknown_203B280->mode)
{
gUnknown_203B280->unk40.menuIndex = gUnknown_203B288;
gUnknown_203B280->unk40.unk1E = gUnknown_203B28A;
sub_8013984(&gUnknown_203B280->unk40);
}
sub_8021410();
sub_8021494();
return TRUE;
}
}
u32 sub_8021274(bool8 param_1)
{
if (!param_1) {
sub_8013660(&gUnknown_203B280->unk40);
return 0;
}
switch(GetKeyPress(&gUnknown_203B280->unk40))
{
case INPUT_B_BUTTON:
PlayMenuSoundEffect(1);
return 2;
case INPUT_A_BUTTON:
if ((gUnknown_203B280->mode == 2) && (GetFriendAreaPrice(sub_802132C()) > gTeamInventoryRef->teamMoney))
{
PlayMenuSoundEffect(2);
}
else
{
PlayMenuSoundEffect(0);
}
return 3;
case INPUT_START_BUTTON:
PlayMenuSoundEffect(4);
return 4;
default:
if (sub_80138B8(&gUnknown_203B280->unk40, 1) != 0) {
sub_8021410();
sub_8021494();
return 1;
}
else {
return 0;
}
}
}
u8 sub_802132C(void)
{
return gUnknown_203B280->friendAreas[gUnknown_203B280->unk40.unk1E * gUnknown_203B280->unk40.unk1C + gUnknown_203B280->unk40.menuIndex];
}
void sub_8021354(bool8 param_1)
{
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B280->unk7C,0,0);
gUnknown_203B280->unk40.unk22 = sub_8021664();
sub_8013984(&gUnknown_203B280->unk40);
sub_8021410();
sub_8021494();
if (param_1) {
AddMenuCursorSprite(&gUnknown_203B280->unk40);
}
}
void sub_80213A0(void)
{
if(gUnknown_203B280)
{
gUnknown_203B284 = gUnknown_203B280->mode;
gUnknown_203B288 = gUnknown_203B280->unk40.menuIndex;
gUnknown_203B28A = gUnknown_203B280->unk40.unk1E;
gUnknown_203B280->unk7C[gUnknown_203B280->unk74] = gUnknown_80DC464;
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B280->unk7C, 1, 1);
MemoryFree(gUnknown_203B280);
gUnknown_203B280 = NULL;
}
}
NAKED
void sub_8021410(void)
{
asm_unified(
"\tpush {r4,lr}\n"
"\tldr r4, _08021490\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0xDC\n"
"\tmovs r2, 0\n"
"\tmovs r1, 0x1\n"
"\tstrb r1, [r0]\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0xDD\n"
"\tstrb r2, [r0]\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0xDE\n"
"\tmovs r1, 0xC\n"
"\tstrb r1, [r0]\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0xDF\n"
"\tstrb r2, [r0]\n"
"\tbl ResetUnusedInputStruct\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0x7C\n"
"\tmovs r1, 0x1\n"
"\tmovs r2, 0x1\n"
"\tbl sub_800641C\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0x5A\n"
"\tmovs r1, 0\n"
"\tldrsh r0, [r0, r1]\n"
"\tmovs r1, 0xC\n"
"\tbl sub_80095E4\n"
"\tadds r0, 0x2\n"
"\tlsls r0, 16\n"
"\tldr r2, [r4]\n"
"\tldr r3, [r2, 0x74]\n"
"\tlsls r1, r3, 1\n"
"\tadds r1, r3\n"
"\tlsls r1, 3\n"
"\tadds r1, r2, r1\n"
"\tadds r1, 0x8A\n"
"\tasrs r3, r0, 16\n"
"\tlsrs r0, 16\n"
"\tstrh r0, [r1]\n"
"\tldr r1, [r2, 0x74]\n"
"\tlsls r0, r1, 1\n"
"\tadds r0, r1\n"
"\tlsls r0, 3\n"
"\tadds r2, r0\n"
"\tadds r3, 0x2\n"
"\tadds r2, 0x8C\n"
"\tstrh r3, [r2]\n"
"\tbl ResetUnusedInputStruct\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0x7C\n"
"\tmovs r1, 0x1\n"
"\tmovs r2, 0x1\n"
"\tbl sub_800641C\n"
"\tpop {r4}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_08021490: .4byte gUnknown_203B280");
}
void sub_8021494(void)
{
u8 friendAreaIndex;
s32 index;
u8 buffer1 [80];
u8 buffer2 [80];
sub_8008C54(gUnknown_203B280->unk74);
sub_80073B8(gUnknown_203B280->unk74);
xxx_call_draw_string(10,0,gUnknown_80DC494,gUnknown_203B280->unk74,0); // Friend Areas
sub_8012BC4(gUnknown_203B280->unkDC[2] * 8 + 4,0,(gUnknown_203B280->unk40).unk1E + 1,1,7,gUnknown_203B280->unk74);
for(index = 0; index < (gUnknown_203B280->unk40).unk1A; index++)
{
friendAreaIndex = gUnknown_203B280->friendAreas[(gUnknown_203B280->unk40).unk1E * (gUnknown_203B280->unk40).unk1C + index];
if (gUnknown_203B280->mode == 2) {
sub_8092578(buffer1,friendAreaIndex,TRUE);
if (GetFriendAreaPrice(friendAreaIndex) <= gTeamInventoryRef->teamMoney) {
xxx_call_draw_string(8,sub_8013800(&gUnknown_203B280->unk40,index),buffer1,gUnknown_203B280->unk74,0);
}
else {
sprintfStatic(buffer2,gUnknown_80DC4A4,buffer1); // {RED} %s {END}
xxx_call_draw_string(8,sub_8013800(&gUnknown_203B280->unk40,index),buffer2,gUnknown_203B280->unk74,0);
}
}
else if (gUnknown_203B280->mode == 0) {
if (gFriendAreas[friendAreaIndex] == 1) {
xxx_call_draw_string(8,sub_8013800(&gUnknown_203B280->unk40,index),GetFriendAreaName(friendAreaIndex),gUnknown_203B280->unk74,0);
}
else
{
sprintfStatic(buffer2,gUnknown_80DC4AC,GetFriendAreaName(friendAreaIndex)); // {GREEN} %s {END}
xxx_call_draw_string(8,sub_8013800(&gUnknown_203B280->unk40,index),buffer2,gUnknown_203B280->unk74,0);
}
}
else {
xxx_call_draw_string(8,sub_8013800(&gUnknown_203B280->unk40,index),GetFriendAreaName(friendAreaIndex),gUnknown_203B280->unk74,0);
}
}
sub_80073E0(gUnknown_203B280->unk74);
}
s32 sub_8021664(void)
{
s32 index;
s32 counter;
counter = 0;
switch(gUnknown_203B280->mode)
{
case 0:
for(index = BOUNTIFUL_SEA; index < NUM_FRIEND_AREAS; index++)
{
gUnknown_203B280->friendAreas[counter] = index;
counter++;
}
break;
case 1:
for(index = BOUNTIFUL_SEA; index < NUM_FRIEND_AREAS; index++)
{
if(gFriendAreas[index])
{
gUnknown_203B280->friendAreas[counter] = index;
counter++;
}
}
break;
case 2:
for(index = BOUNTIFUL_SEA; index < NUM_FRIEND_AREAS; index++)
{
if (gFriendAreas[index] == 0) {
switch(GetFriendAreaUnlockCondition(index))
{
case UNLOCK_SHOP_STORY:
gUnknown_203B280->friendAreas[counter] = index;
counter++;
break;
case UNLOCK_SHOP_POST_GAME:
if(sub_80023E4(6) != 0) {
gUnknown_203B280->friendAreas[counter] = index;
counter++;
}
break;
}
}
}
break;
}
return counter;
}
u8 sub_8021700(u32 mode)
{
s32 index;
switch(mode)
{
case 0:
return FALSE;
case 1:
for(index = BOUNTIFUL_SEA; index < NUM_FRIEND_AREAS; index++)
{
if (gFriendAreas[index] != 0) {
return FALSE;
}
}
break;
case 2:
for(index = BOUNTIFUL_SEA; index < NUM_FRIEND_AREAS; index++)
{
if (gFriendAreas[index] == 0) {
switch(GetFriendAreaUnlockCondition(index))
{
case UNLOCK_SHOP_STORY:
return FALSE;
case UNLOCK_SHOP_POST_GAME:
if(sub_80023E4(6) != 0) {
return FALSE;
}
break;
}
}
}
break;
}
return TRUE;
}
bool8 sub_8021774(u8 friendArea, bool8 param_2, s32 param_3)
{
gUnknown_203B28C = MemoryAlloc(sizeof(struct unkStruct_203B28C), 8);
gUnknown_203B28C->friendArea = friendArea;
gUnknown_203B28C->unkD = param_2;
sub_801317C(&gUnknown_203B28C->unk0);
sub_8021A60();
gUnknown_203B28C->unk74 = param_3;
gUnknown_203B28C->unk78 = &gUnknown_203B28C->unk7C[param_3];
sub_8006518(gUnknown_203B28C->unk7C);
gUnknown_203B28C->unk7C[gUnknown_203B28C->unk74] = gUnknown_80DC4D8;
sub_8021820();
return TRUE;
}
u32 sub_80217EC(void)
{
switch(sub_8012A64(&gUnknown_203B28C->unk0, gUnknown_203B28C->unk74))
{
case 2:
PlayMenuSoundEffect(1);
return 2;
case 1:
PlayMenuSoundEffect(0);
return 3;
default:
return 0;
}
}
void sub_8021820(void)
{
sub_8021878();
sub_8021894();
}
void sub_8021830(void)
{
if(gUnknown_203B28C)
{
gUnknown_203B28C->unk7C[gUnknown_203B28C->unk74] = gUnknown_80DC4BC;
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B28C->unk7C, 1, 1);
MemoryFree(gUnknown_203B28C);
gUnknown_203B28C = NULL;
}
}
void sub_8021878(void)
{
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B28C->unk7C, 1, 1);
}
void sub_8021894(void)
{
u8 *string;
u32 y;
u32 x;
s32 index;
u8 buffer1 [256];
u8 buffer2 [100];
sub_80073B8(gUnknown_203B28C->unk74);
sub_8092578(buffer1,gUnknown_203B28C->friendArea,FALSE);
xxx_call_draw_string(0x14,0,buffer1,gUnknown_203B28C->unk74,0);
string = GetFriendAreaDescription(gUnknown_203B28C->friendArea);
xxx_call_draw_string(10,0x14,string,gUnknown_203B28C->unk74,0);
if (gUnknown_203B28C->unkD != 0) {
xxx_call_draw_string(0x20,0x3c,gUnknown_80DC4F0,gUnknown_203B28C->unk74,0);
}
else {
xxx_call_draw_string(0x20,0x3c,gUnknown_80DC518,gUnknown_203B28C->unk74,0); // Inhabitants
}
sub_800792C(gUnknown_203B28C->unk74,4,0x40,0x14,4);
if (gUnknown_203B28C->unkD != 0) {
sub_800792C(gUnknown_203B28C->unk74,0xb8,0x40,0x14,4);
}
else {
sub_800792C(gUnknown_203B28C->unk74,0x5e,0x40,0x6e,4);
}
sub_800792C(gUnknown_203B28C->unk74,4,0x82,200,4);
sub_8007A78(gUnknown_203B28C->unk74,3,0x40,0x43,4);
sub_8007A78(gUnknown_203B28C->unk74,0xcc,0x40,0x43,4);
for(index = 0; index < gUnknown_203B28C->numPokemoninFriendArea; index++)
{
x = (index % 3) * 63 + 7;
y = (index / 3) * 12 + 0x47;
sub_808D930(buffer2, gUnknown_203B28C->unkE[index]);
switch(gUnknown_203B28C->unk30[index])
{
case 0: // Not recruited/seen
xxx_call_draw_string(x,y,*gUnknown_80D49BC,gUnknown_203B28C->unk74,0); // ???
break;
case 1: // Seen but not recruited
xxx_call_draw_string(x,y,buffer2,gUnknown_203B28C->unk74,0); // %s
break;
case 2:
sprintfStatic(buffer1,gUnknown_80DC524,buffer2); // {CYAN} %s {END_COLOR}
xxx_call_draw_string(x,y,buffer1,gUnknown_203B28C->unk74,0);
break;
}
}
sub_80073E0(gUnknown_203B28C->unk74);
}
void sub_8021A60(void)
{
s32 sVar4;
s32 iVar6;
s32 index;
struct PokemonStruct *pokeStruct;
gUnknown_203B28C->numPokemoninFriendArea = 0;
for(index = 0; index < 0x10; index++)
{
gUnknown_203B28C->unkE[index] = 0;
gUnknown_203B28C->unk30[index] = 0;
}
for(index = 0; index < 0x1A8; index++)
{
s32 index2 = (s16)index;
if ((gUnknown_203B28C->friendArea == GetFriendArea(index2)) &&
(index2 == GetBaseSpeciesNoUnown(index2))) {
iVar6 = gUnknown_203B28C->numPokemoninFriendArea;
gUnknown_203B28C->unkE[iVar6] = index2;
gUnknown_203B28C->numPokemoninFriendArea = iVar6 + 1;
}
}
for(index = 0; index < 0x1A8; index++)
{
if ((sub_8098134(index)) && (sVar4 = sub_8021B58(index), sVar4 != -1)) {
gUnknown_203B28C->unk30[sVar4] = 1;
}
}
for(index = 0; index < NUM_MONSTERS; index++)
{
pokeStruct = &gRecruitedPokemonRef->pokemon[index];
if (((*(u8 *)&pokeStruct->unk0 & 1) != 0) &&
(sVar4 = sub_8021B58(pokeStruct->speciesNum), sVar4 != -1)) {
gUnknown_203B28C->unk30[sVar4] = 2;
}
}
}
s32 sub_8021B58(s16 species)
{
s32 baseSpecies;
int index;
baseSpecies = GetBaseSpeciesNoUnown(species);
for(index = 0; index < gUnknown_203B28C->numPokemoninFriendArea; index++)
{
if (baseSpecies == gUnknown_203B28C->unkE[index]) return index;
}
return -1;
}
bool8 CreateWigglytuffShop(bool32 isAsleep)
{
char *string;
@ -248,16 +765,16 @@ void UpdateWigglytuffDialogue(void)
break;
case BUY_FRIEND_AREA:
CreateWigglytuffConfirmFriendAreaMenu();
sub_8092578(gUnknown_202E628,gWigglytuffShop->chosenFriendArea,0);
sub_8092578(gUnknown_202E628,gWigglytuffShop->chosenFriendArea,FALSE);
gUnknown_202DE30[0] = gWigglytuffShop->friendAreaPrice;
sub_8014248(gWigglytuffDialogue[gWigglytuffShop->isAsleep][5],0,5,gWigglytuffShop->unk1C,0,4,0,gWigglytuffShop->unkCC,0xc);
break;
case FRIEND_AREA_INFO:
sub_8021774(gWigglytuffShop->chosenFriendArea,0,2);
sub_8021774(gWigglytuffShop->chosenFriendArea,FALSE,2);
break;
case CONFIRM_BUY_FRIEND_AREA:
gWigglytuffShop->fallbackState = WIGGLYTUFF_UNKD;
sub_8092578(gUnknown_202E628,gWigglytuffShop->chosenFriendArea,0);
sub_8092578(gUnknown_202E628,gWigglytuffShop->chosenFriendArea,FALSE);
sub_80141B4(gWigglytuffDialogue[gWigglytuffShop->isAsleep][6],0,gWigglytuffShop->unkCC,0x10d);
break;
case WIGGLYTUFF_UNKD:
@ -295,7 +812,7 @@ void UpdateWigglytuffDialogue(void)
sub_8023354(1);
break;
case DISPLAY_POKEMON_FRIEND_AREA_INFO:
sub_8092638(gWigglytuffShop->chosenFriendArea,&uStack_14,0,0);
sub_8092638(gWigglytuffShop->chosenFriendArea,&uStack_14,FALSE,FALSE);
if (uStack_14.hasFriendArea) {
gWigglytuffShop->fallbackState = WIGGLYTUFF_CHECK_HAS_FRIEND_AREA;
}
@ -324,7 +841,7 @@ void UpdateWigglytuffDialogue(void)
}
string = GetMonSpecies(gWigglytuffShop->chosenSpecies);
strcpy(gAvailablePokemonNames,string);
sub_8092578(gUnknown_202E628,gWigglytuffShop->chosenFriendArea,0);
sub_8092578(gUnknown_202E628,gWigglytuffShop->chosenFriendArea,FALSE);
sub_80141B4(gWigglytuffDialogue[gWigglytuffShop->isAsleep][14],0,gWigglytuffShop->unkCC,0x10d);
break;
case WIGGLYTUFF_CHECK_HAS_FRIEND_AREA:

View File

@ -1162,7 +1162,7 @@ void sub_8028FDC(void)
{
case 8:
mail = GetMailatIndex(gUnknown_203B2C0->mailIndex);
if(!sub_80A2824(mail->dungeon.id))
if(!sub_80A2824(mail->unk4.dungeon.id))
{
SetFriendRescueCounterState(CANT_GO_TO_DUNGEON);
}

View File

@ -12,6 +12,7 @@
#include "code_8094F88.h"
#include "menu_input.h"
#include "code_80130A8.h"
#include "event_flag.h"
struct unkStruct_203B2C8
{
@ -52,7 +53,6 @@ extern void sub_802B624(void);
extern void sub_802F204(struct unkStruct_802F204 *, u32);
extern void sub_803C37C(struct DungeonLocation *, u32, u8 *);
extern u32 GetDungeonTeamRankPts(struct DungeonLocation *, u32);
extern bool8 sub_80023E4(u32);
ALIGNED(4) const char gRescueTeamNamePlaceholder[] = "????";
@ -175,8 +175,8 @@ void sub_802B3E0(void)
gUnknown_203B2C8->unk114.moneyReward = 0;
sub_8097790();
mail = GetMailatIndex(gUnknown_203B2C8->unk1);
sub_803C37C(&mail->dungeon, 0, gUnknown_203B2C8->unk114.itemRewards);
gUnknown_203B2C8->unk114.teamRankPtsReward = GetDungeonTeamRankPts(&mail->dungeon, 0);
sub_803C37C(&mail->unk4.dungeon, 0, gUnknown_203B2C8->unk114.itemRewards);
gUnknown_203B2C8->unk114.teamRankPtsReward = GetDungeonTeamRankPts(&mail->unk4.dungeon, 0);
gUnknown_203B2C8->unk114.itemRewards[1] = ITEM_NOTHING;
gUnknown_203B2C8->unk114.itemRewards[2] = ITEM_NOTHING;
gUnknown_203B2C8->unk114.quantity = 10;

View File

@ -80,7 +80,7 @@ void CreateMailMenu(void)
y = sub_8013800(&gUnknown_203B2D8->input, index);
sub_803B6B0(10,y,6,gUnknown_203B2D8->unk38);
PrintPokeNameToBuffer(gAvailablePokemonNames, GetPlayerPokemonStruct());
sprintfStatic(buffer, GetPokemonMailHeadline(mail->dungeon.floor), gAvailablePokemonNames);
sprintfStatic(buffer, GetPokemonMailHeadline(mail->unk4.dungeon.floor), gAvailablePokemonNames);
xxx_call_draw_string(0x15,y,buffer,gUnknown_203B2D8->unk38,0);
}
else {

View File

@ -189,7 +189,7 @@ void sub_802CAA4(void) {
{
case 5:
gUnknown_203B2F0->unk10C[loopMax].text = gUnknown_80DFD70; // Take Job
if(sub_809693C(mail) || !sub_80A2824(mail->dungeon.id))
if(sub_809693C(mail) || !sub_80A2824(mail->unk4.dungeon.id))
{
gUnknown_203B2F0->unk10C[loopMax].menuAction = -1;
}
@ -679,7 +679,7 @@ void sub_802D2A8(void)
MemoryCopy8(sub_8096DD8(),gUnknown_203B2F8->mail->unk14,0x28);
MemoryCopy8(sub_8096DE8(),gUnknown_203B2F8->mail->unk18,0x78);
}
switch(gUnknown_203B2F8->mail->wonderMail.dungeon.id)
switch(gUnknown_203B2F8->mail->wonderMail.unk4.dungeon.id)
{
// NOTE: subtract 1 from each of the case as the input??
case DUNGEON_ODDITY_CAVE: // 0x2B
@ -730,8 +730,8 @@ void sub_802D2A8(void)
case 0x10:
sub_803B35C(&gUnknown_203B2F8->mail->wonderMail,&gUnknown_203B2F8->unk14);
gUnknown_203B2F8->unk14.unk0[0] = 3;
gUnknown_203B2F8->unk14.unk44 = 0;
gUnknown_203B2F8->unk14.unk50[0] = gUnknown_203B2F8->mail->unk18;
gUnknown_203B2F8->unk14.mailStatus = MAIL_STATUS_SUSPENDED;
gUnknown_203B2F8->unk14.unk50 = gUnknown_203B2F8->mail->unk18;
sub_802DE84(&gUnknown_203B2F8->unk14);
break;
}
@ -928,7 +928,7 @@ void sub_802D940(void)
{
// Delete
case 2:
if ((gUnknown_203B2F8->unk9) && (((mail = &gUnknown_203B490->jobSlots[gUnknown_203B2F8->jobSlotIndex]), mail->mailType > MAIL_TYPE_SUSPENDED_JOB) && (gUnknown_203B2F8->dungeonID == mail->dungeon.id)))
if ((gUnknown_203B2F8->unk9) && (((mail = &gUnknown_203B490->jobSlots[gUnknown_203B2F8->jobSlotIndex]), mail->mailType > MAIL_TYPE_SUSPENDED_JOB) && (gUnknown_203B2F8->dungeonID == mail->unk4.dungeon.id)))
{
sub_802D1A0(7);
}
@ -1008,7 +1008,7 @@ bool8 sub_802DAA8(void)
return TRUE;
}
else {
if ( (mail->mailType != WONDER_MAIL_TYPE_THANK_YOU) && (gUnknown_203B2F8->dungeonID == mail->dungeon.id)) return FALSE;
if ( (mail->mailType != WONDER_MAIL_TYPE_THANK_YOU) && (gUnknown_203B2F8->dungeonID == mail->unk4.dungeon.id)) return FALSE;
return TRUE;
}
}
@ -1028,7 +1028,7 @@ _0802DAE8:
{
mailType = mail->mailType;
if (((mailType == 0) || (mailType == WONDER_MAIL_TYPE_THANK_YOU)) ||
((WONDER_MAIL_TYPE_THANK_YOU < mailType && (gUnknown_203B2F8->dungeonID != mail->dungeon.id)))) goto _0802DAE8;
((WONDER_MAIL_TYPE_THANK_YOU < mailType && (gUnknown_203B2F8->dungeonID != mail->unk4.dungeon.id)))) goto _0802DAE8;
}
return FALSE;
}

View File

@ -125,7 +125,6 @@ extern void ProceedToNextRewardSceneState(void);
extern void sub_802F300(void);
extern s32 sub_808D544(u32);
extern u32 sub_801B60C(u32, u8, u8);
extern void sub_8092578(u8 *buffer, u8 index, u8 r2);
void HandleMissionReward(void);
const u8 *sub_80974A0(s16 index);
@ -348,8 +347,8 @@ void sub_802F088(void)
temp = sub_803B344(gUnknown_203B30C->unk4);
sub_803B35C(&temp->mail, &gUnknown_203B30C->unk8);
gUnknown_203B30C->unk8.unk0[0] = 3;
gUnknown_203B30C->unk8.unk44 = 0;
gUnknown_203B30C->unk8.unk50[0] = temp->unk18;
gUnknown_203B30C->unk8.mailStatus = MAIL_STATUS_SUSPENDED;
gUnknown_203B30C->unk8.unk50 = temp->unk18;
sub_802DE84(&gUnknown_203B30C->unk8);
}
}
@ -555,7 +554,7 @@ void HandleMissionReward(void)
SetRewardSceneState(PREP_ITEM_REWARD);
}
else {
sub_8092578(gUnknown_202E628,gUnknown_203B310->unk10->friendAreaReward,0);
sub_8092578(gUnknown_202E628,gUnknown_203B310->unk10->friendAreaReward,FALSE);
if (gUnknown_203B310->displayClientDialogueSprite) {
sub_80141B4(gUnknown_80E04B4,0,&gUnknown_203B310->faceFile,0x10d);
gUnknown_203B310->nextState = UNLOCK_FRIEND_AREA;

View File

@ -265,17 +265,17 @@ void sub_803092C(void)
mail = GetMailatIndex(gUnknown_203B320->unk0[(gUnknown_203B320->input.unk1E * gUnknown_203B320->input.unk1C) + index]);
local.unk0[0] = gUnknown_203B320->unk58;
local.y = sub_8013800(&gUnknown_203B320->input,index);
local.unk40 = 7;
local.unk42 = 0;
local.unk44 = 0;
local.mailTitleType = 7;
local.mailMissionType = MISSION_TYPE_FRIEND_RESCUE;
local.mailStatus = MAIL_STATUS_SUSPENDED;
local.dungeon = &mail->dungeon;
local.unk8 = &mail->unk4;
local.playerName = mail->playerName;
local.clientSpecies = mail->clientSpecies;
local.targetSpecies = mail->clientSpecies;
local.targetItem = ITEM_NOTHING;
local.unk2E = 5;
local.rewardType = 5;
switch(mail->mailType)
{

View File

@ -117,33 +117,33 @@ void sub_8030E48(void)
mail = &gUnknown_203B480[gUnknown_203B324->mailIndex];
sub_80073B8(gUnknown_203B324->unk10);
stack.unk0[0] = gUnknown_203B324->unk10;
stack.unk40 = 7;
stack.unk42 = 0;
stack.unk44 = 0;
stack.dungeon = &mail->dungeon;
stack.mailTitleType = 7;
stack.mailMissionType = MISSION_TYPE_FRIEND_RESCUE;
stack.mailStatus = MAIL_STATUS_SUSPENDED;
stack.unk8 = &mail->unk4;
stack.playerName = mail->playerName;
stack.clientSpecies = mail->clientSpecies;
stack.targetSpecies = mail->clientSpecies;
stack.targetItem = ITEM_NOTHING;
if (mail->item.id == ITEM_NOTHING) {
stack.unk2E = 5;
stack.rewardType = 5;
}
else {
stack.unk2E = 2;
stack.unk34 = mail->item.id;
stack.rewardType = 2;
stack.rewardItem = mail->item.id;
}
switch(mail->mailType)
{
case 2:
case WONDER_MAIL_TYPE_AOK:
stack.unk41 = 10;
stack.mailDescriptionType = 10;
break;
case 5:
stack.unk41 = 11;
stack.mailDescriptionType = 11;
break;
case WONDER_MAIL_TYPE_NONE:
default:
stack.unk41 = 9;
stack.mailDescriptionType = 9;
break;
}
CreateRescueDescription(&stack);

View File

@ -14,11 +14,7 @@ struct unkStruct_203B2FC
// size: 0xA8
/* 0x0 */ u32 state;
/* 0x4 */ u32 fallbackState;
u32 unk8;
s16 unkC;
s16 unkE;
u8 unk10;
u8 fill11[0x30 - 0x11];
struct unkStruct_802F204 unk8;
u8 jobSlotIndex;
struct WonderMail *jobInfo;
struct OpenedFile *faceFile;
@ -38,7 +34,7 @@ struct unkStruct_203B300
{
// size: 0x7C
struct MenuInputStructSub unk0;
struct unkStruct_802C39C *unkC;
struct unkStruct_802C39C *mail;
u32 unk10;
struct UnkTextStruct2 *unk14;
struct UnkTextStruct2 unk18[4];
@ -109,13 +105,13 @@ extern void sub_802DC28(u32);
extern void sub_802F2C0(void);
extern void sub_802DC28(u32);
extern u32 sub_802F298(void);
extern void sub_802F204(u32 *, u32);
extern void sub_802F204(struct unkStruct_802F204*, u32);
extern void sub_802DC40(void);
extern void sub_802DC9C(void);
struct WonderMail *GetJobSlotInfo(u8);
extern void sub_8096AF8(u8 *, u32, u32);
extern void sub_8096EEC(void);
extern void sub_803C21C(struct WonderMail *, u32 *);
extern void sub_803C21C(struct WonderMail *, struct unkStruct_802F204*);
extern u32 sub_802C598(s32);
extern void sub_802C688(void);
extern void sub_8096C80(void);
@ -306,12 +302,12 @@ void sub_802DE60(void)
}
}
u32 sub_802DE84(struct unkStruct_802C39C *r0)
u32 sub_802DE84(struct unkStruct_802C39C *mail)
{
gUnknown_203B300 = MemoryAlloc(sizeof(struct unkStruct_203B300), 8);
gUnknown_203B300->unkC = r0;
gUnknown_203B300->mail = mail;
sub_801317C(&gUnknown_203B300->unk0);
gUnknown_203B300->unk10 = gUnknown_203B300->unkC->unk0[0];
gUnknown_203B300->unk10 = gUnknown_203B300->mail->unk0[0];
gUnknown_203B300->unk14 = &gUnknown_203B300->unk18[gUnknown_203B300->unk10];
sub_8006518(gUnknown_203B300->unk18);
gUnknown_203B300->unk18[gUnknown_203B300->unk10] = gUnknown_80E0264;
@ -361,6 +357,6 @@ void sub_802DF6C(void)
void sub_802DF88(void)
{
sub_80073B8(gUnknown_203B300->unk10);
CreateRescueDescription(gUnknown_203B300->unkC);
CreateRescueDescription(gUnknown_203B300->mail);
sub_80073E0(gUnknown_203B300->unk10);
}

View File

@ -228,21 +228,6 @@ gUnknown_203B278: /* 203B278 */
.include "src/gulpin_shop_1.o"
gUnknown_203B280: /* 203B280 */
.space 0x4
gUnknown_203B284: /* 203B284 */
.space 0x4
gUnknown_203B288: /* 203B288 */
.space 0x2
gUnknown_203B28A: /* 203B28A */
.space 0x2
gUnknown_203B28C: /* 203B28C */
.space 0x4
.include "src/wigglytuff_shop.o"
gUnknown_203B294: /* 203B294 */