Decompile 48 more callees; clear four asm files entirely

Every function of four whole asm files now matches, so all four objects leave
main.lsf and the .s/.inc files go:

  asm/overlay_29_023055B0.s    4 functions
  asm/overlay_29_02314810.s    9 functions
  asm/overlay_29_022E7EC4.s   25 functions
  asm/main_0202AB94.s         10 functions

struct unk_0202AAA8 gains four members carved out of existing byte padding: a
u32 at 0x0, the third menu kind's flag word plus its initial selected index at
0xFC/0x100, a u8 * at 0x160, and a signed s32 at 0x1A8. Offsets and sizeof are
unchanged (0x1C8), proven by compiling one offsetof assertion per member with
mwccarm and reading the folded constant back; the check carries a negative
control that correctly fails, so "all as expected" is an outcome it could have
missed. Nothing in the tree read any of the four offsets.

struct struct_2 moves from include/overlay_31_02382820.h to include/window.h so
a src/main_* file can reach it. CreateSimpleMenuInternal copies it whole (0x98
bytes), so its size is load-bearing. It is a pure move; the name is pre-existing
and unchanged. window.h rather than main_0202AAA8.h because the latter drags
main_0202AB40.h's prototypes into overlay_31_02382820.c, where they collide with
that file's own declarations.

Four data symbols declared `extern s32` from a call site whose parameter was
void * are given their real types: _0209C85C and ov11_02322CC8 are
WindowTemplate (each measures exactly 0x10 to the next symbol, and
WindowTemplate is 16 bytes), _0209C86C and ov11_02322CF0 are
struct unk_0202A5CC[] (8-byte records, matching the element counts the call
sites pass). Each had exactly one user. The (s32) cast at
overlay_11_02307334.c's call site goes with them -- field_0x1c is already a
struct struct_2.

Region arms, all message ids: overlay_29_0230558C.c gains a JPN_MSG_OFFSET block
for five ids; move_orb_effects.c reuses its existing one and adds MESSAGE_ED0 /
MESSAGE_ED1 for the two that shift by -0x2BE rather than the file's flat -0x2C0;
overlay_29_02315118.c gains five named defines because it has no offset constant
of its own. Every other region delta in these four files is a header-driven
field displacement and needs nothing.

Nine call-site-derived declarations across six files are replaced by an include
of the owning header. Four declared void where the function returns bool8; two
declared an s8 return where it is s32; three took an s8 parameter where it is
s32. One was the fifth extern on a single physical line, which a line-oriented
grep does not see.

Authored by Claude (Opus 5) under human direction. Confirmed by matching builds
in all three regions: build/pmdsky.us/pmdsky.us.nds: OK,
build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
cecilarmitais
2026-09-14 03:48:53 -07:00
parent 0f3cbcbcd2
commit 6f3ad6941c
31 changed files with 1395 additions and 2564 deletions

View File

@@ -1,36 +0,0 @@
#pragma once
.public CalcMenuHeightDiv8__02031AA4
.public GetPageItemYOffset
.public GetSelectedMenuItemIdx
.public GetTotalNumMenuItems
.public GetWindowContents
.public GetWindowRectangle
.public InitWindowInput
.public IsEmptyString
.public IsMenuOptionActive
.public MemAlloc
.public NewWindowScreenCheck
.public PlayWindowInputSound
.public PreprocessStringFromId
.public SIMPLE_MENU_DEFAULT_WINDOW_PARAMS
.public sub_020263C8
.public sub_020265A8
.public sub_02027B1C
.public sub_0202810C
.public sub_0202812C
.public sub_0202830C
.public sub_02028948
.public sub_0202A03C
.public sub_02031A5C
.public sub_02031C74
.public sub_02031C84
.public sub_02031C98
.public sub_02032070
.public sub_02032160
.public sub_020323F8
.public sub_0203250C
.public sub_02032684
.public sub_02032984
.public sub_02033758
.public UpdateSimpleMenu
.public UpdateWindow

View File

@@ -1,49 +0,0 @@
#pragma once
.public DUNGEON_FRAMES_PASSED
.public DUNGEON_PTR
.public DungeonChangeTopScreenType
.public DungeonGetSpriteIndex
.public FreeDungeonControlsMenu
.public FreeTopScreen
.public GetIdleAnimationId
.public GetPlayerGender
.public GetTopScreenOption
.public InitDungeonControlsMenu
.public IsTeamStatsOnTopScreen
.public MemAlloc
.public MemFree
.public MemZero
.public ov10_022C1E50
.public ov10_022C1E80
.public ov10_022C21D8
.public ov10_022C2278
.public ov10_022C22A0
.public ov29_022DC694
.public ov29_022DC6D0
.public ov29_022DC6DC
.public ov29_022DC6E8
.public ov29_022DC728
.public ov29_022DC738
.public ov29_022DC76C
.public ov29_022DC778
.public ov29_022DC77C
.public ov29_022E8708
.public ov29_022E8CE8
.public ov29_022E8F78
.public ov29_022E8FCC
.public ov29_022E8FF8
.public ov29_022E9008
.public ov29_022E9014
.public ov29_02339138
.public ov29_02339D7C
.public ov29_0233A0E8
.public ov29_0233A1BC
.public ov29_0234B4E0
.public SetMinimapDataE447
.public SetMinimapDataE448
.public sub_02048384
.public sub_020483B8
.public sub_020483D8
.public sub_02048400
.public TOP_SCREEN_STATUS_PTR
.public UpdateMinimap

View File

@@ -1,52 +0,0 @@
#pragma once
.public AbilityIsActiveVeneer
.public CalcSpeedStageWrapper
.public ChangeMonsterAnimation
.public CheckVariousStatuses2__02301244
.public DUNGEON_PTR
.public EndBlinkerClassStatus
.public EndBurnClassStatus
.public EndCringeClassStatus
.public EndCurseClassStatus
.public EndFrozenClassStatus
.public EndLeechSeedClassStatus
.public EndMiracleEyeStatus
.public EndMuzzledStatus
.public EndSleepClassStatus
.public EndSureShotClassStatus
.public EntityIsValid__0230558C
.public EntityIsValid__02305C04
.public GetDirectionTowardsPosition
.public GetIdleAnimationId
.public GetLeader
.public GetTileAtEntity
.public GetTrapInfo
.public HasHeldItem
.public IqSkillIsEnabled
.public IsFloorOver
.public IsMonsterDrowsy
.public IsMonsterMuzzled
.public IsMonsterVisuallyImpaired
.public IsTeamMemberOnFirstTurnInFixedRoom
.public LogMessageByIdWithPopupCheckUser
.public LogMessageByIdWithPopupCheckUserTarget
.public MonsterHasAttackInterferingStatus
.public MonsterHasImmobilizingStatus
.public MonsterHasLeechSeedStatus
.public MonsterHasMiracleEyeStatus
.public MonsterHasNegativeStatus
.public MonsterHasNonvolatileNonsleepStatus
.public MonsterHasSkillInterferingStatus
.public MonsterHasWhifferStatus
.public ov29_022E2CA0
.public ov29_022E3A58
.public ov29_022E543C
.public ov29_022EA370
.public ov29_02337D68
.public ov29_02353318
.public SubstitutePlaceholderStringTags
.public TryNonLeaderItemPickUp
.public TryTriggerMonsterHouse
.public TryTriggerTrap
.public UpdateStatusIconFlags
.public UpdateTrapsVisibility

View File

@@ -1,31 +0,0 @@
#pragma once
.public AbilityIsActiveVeneer
.public BoostSpeed
.public CalcSpeedStage
.public CalcSpeedStageWrapper
.public CalcStatusDuration
.public CONFUSED_TURN_RANGE
.public DungeonRandInt
.public DungeonRandOutcome__022EAB20
.public EntityIsValid__023118B4
.public EntityIsValid__02315118
.public ExclusiveItemEffectIsActive__023147EC
.public GetExclusiveItemWithEffectFromBag
.public IsProtectedFromNegativeStatus
.public ItemIsActive__0231513C
.public LogMessageByIdWithPopupCheckUserTarget
.public LowerSpeed
.public ov10_022C4618
.public ov29_022E41CC
.public ov29_022E543C
.public ov29_022E60E4
.public ov29_02353318
.public PlaySpeedDownEffect
.public PlaySpeedUpEffect
.public PrepareItemForPrinting__02345728
.public SafeguardIsActive
.public SetPreprocessorArgsIdVal
.public SPEED_BOOST_TURN_RANGE
.public SPEED_LOWER_TURN_RANGE
.public SubstitutePlaceholderStringTags
.public UpdateStatusIconFlags

View File

@@ -1,687 +0,0 @@
.include "asm/macros.inc"
.include "main_0202AB94.inc"
.text
arm_func_start sub_0202AB94
sub_0202AB94: ; 0x0202AB94
stmdb sp!, {r4, lr}
mov r4, r1
bl GetWindowContents
mov r1, r4
add r0, r0, #4
bl sub_02032684
ldmia sp!, {r4, pc}
arm_func_end sub_0202AB94
arm_func_start GetSimpleMenuResult__0202AEA4
GetSimpleMenuResult__0202AEA4: ; 0x0202ABB0
stmdb sp!, {r4, lr}
bl GetWindowContents
ldrb r1, [r0, #0x1a0]
ldr r4, [r0, #0x198]
cmp r1, #0
beq _0202ABF4
ldrb r1, [r0, #0x1a1]
add r0, r0, #4
cmp r1, #0
beq _0202ABE0
bl GetTotalNumMenuItems
b _0202ABE4
_0202ABE0:
bl GetSelectedMenuItemIdx
_0202ABE4:
add r0, r0, r0, lsl #6
add r0, r4, r0, lsl #2
ldr r0, [r0, #0x100]
ldmia sp!, {r4, pc}
_0202ABF4:
mov r0, #0
ldmia sp!, {r4, pc}
arm_func_end GetSimpleMenuResult__0202AEA4
arm_func_start UpdateParentMenu
UpdateParentMenu: ; 0x0202ABFC
stmdb sp!, {r4, r5, r6, lr}
sub sp, sp, #0x30
mov r6, r0
ldr r4, [r6, #0xc]
ldr r0, [r4, #0x19c]
cmp r0, #7
addls pc, pc, r0, lsl #2
b _0202AF6C
_0202AC1C: ; jump table
b _0202AC3C ; case 0
b _0202AC5C ; case 1
b _0202AC78 ; case 2
b _0202ACDC ; case 3
b _0202AD3C ; case 4
b _0202AEE8 ; case 5
b _0202AEF8 ; case 6
b _0202AF40 ; case 7
_0202AC3C:
ldrsb r0, [r6, #0x10]
bl sub_0202810C
cmp r0, #0
beq _0202AF6C
ldr r1, [r4, #0x1a8]
mov r0, #2
str r1, [r4, #0x1ac]
str r0, [r4, #0x19c]
_0202AC5C:
ldr r0, [r4, #0x19c]
cmp r0, #1
ldreq r1, [r4, #0x1a8]
moveq r0, #2
streq r1, [r4, #0x1ac]
streq r0, [r4, #0x19c]
beq _0202AF6C
_0202AC78:
ldr r0, [r4, #0x1a8]
cmp r0, #0
ble _0202ACD4
ldr r0, [r4, #0x1ac]
mov r1, #0x4000000
cmp r0, #0
subgt r0, r0, #1
strgt r0, [r4, #0x1ac]
ldr r0, [r4, #0x1ac]
cmp r0, #0
add r0, r4, #4
ble _0202ACD0
bl sub_02031C74
mov r1, #0
strb r1, [r4, #0x1a0]
strb r1, [r4, #0x1a1]
str r1, [r4, #0x1a4]
sub r1, r1, #1
mov r0, r6
str r1, [r6, #0xb8]
bl sub_0202AF78
b _0202AF6C
_0202ACD0:
bl sub_02031C84
_0202ACD4:
mov r0, #3
str r0, [r4, #0x19c]
_0202ACDC:
mov r0, r6
bl sub_0202AF78
ldr r0, [r4, #0xfc]
tst r0, #0x800000
beq _0202AD18
mov r0, #9
str r0, [r4, #0x19c]
mov r1, #1
mov r0, #0
strb r1, [r4, #0x1a0]
strb r0, [r4, #0x1a1]
str r0, [r4, #0x1a4]
sub r0, r0, #4
str r0, [r6, #0xb8]
b _0202AF6C
_0202AD18:
mov r1, #4
mov r0, #0
str r1, [r4, #0x19c]
strb r0, [r4, #0x1a0]
strb r0, [r4, #0x1a1]
str r0, [r4, #0x1a4]
sub r0, r0, #1
str r0, [r6, #0xb8]
b _0202AF6C
_0202AD3C:
add r1, sp, #8
add r2, sp, #0xc
add r0, r4, #4
mov r3, #1
bl sub_02031C98
ldr r1, [sp, #8]
mov r5, r0
cmp r1, #0
bne _0202ADAC
ldr r0, [r4, #0xfc]
tst r0, #1
beq _0202ADAC
mov r3, #0
ldr r2, _0202AF74 ; =0x00000408
add r1, sp, #0xc
str r3, [sp]
mov ip, #1
add r0, r4, #4
str ip, [sp, #4]
bl sub_02032160
movs r1, r0
bmi _0202ADAC
add r0, r4, #4
bl sub_02032684
ldr r0, [sp, #8]
mov r5, #1
orr r0, r0, #1
str r0, [sp, #8]
_0202ADAC:
ldr r0, [sp, #8]
cmp r0, #0
bne _0202ADCC
add r1, sp, #8
add r2, sp, #0xc
add r0, r4, #4
bl sub_02033758
orr r5, r5, r0
_0202ADCC:
add r0, r4, #4
bl GetSelectedMenuItemIdx
mov r2, r0
ldr r1, [sp, #8]
add r0, r4, #4
mov r3, #0
bl sub_020323F8
orrs r0, r5, r0
beq _0202ADF8
mov r0, r6
bl sub_0202AF78
_0202ADF8:
ldr r1, [sp, #8]
tst r1, #1
beq _0202AE68
add r0, r4, #4
bl IsMenuOptionActive
cmp r0, #0
beq _0202AE58
ldr r0, [r4, #0xfc]
tst r0, #0x80000000
bne _0202AE2C
add r0, r4, #4
mov r1, #0
bl PlayWindowInputSound
_0202AE2C:
mov r1, #1
mov r0, #0
strb r1, [r4, #0x1a0]
strb r0, [r4, #0x1a1]
ldr r1, [sp, #8]
sub r0, r0, #4
str r1, [r4, #0x1a4]
str r0, [r6, #0xb8]
mov r0, #5
str r0, [r4, #0x19c]
b _0202AED8
_0202AE58:
add r0, r4, #4
mov r1, #2
bl PlayWindowInputSound
b _0202AED8
_0202AE68:
tst r1, #2
add r0, r4, #4
beq _0202AEA4
mov r1, #1
bl PlayWindowInputSound
mov r0, #1
strb r0, [r4, #0x1a0]
strb r0, [r4, #0x1a1]
ldr r1, [sp, #8]
sub r0, r0, #6
str r1, [r4, #0x1a4]
str r0, [r6, #0xb8]
mov r0, #5
str r0, [r4, #0x19c]
b _0202AED8
_0202AEA4:
bl sub_0203250C
cmp r0, #0
beq _0202AED8
mov r1, #1
mov r0, #0
strb r1, [r4, #0x1a0]
strb r0, [r4, #0x1a1]
ldr r1, [sp, #8]
sub r0, r0, #4
str r1, [r4, #0x1a4]
str r0, [r6, #0xb8]
mov r0, #5
str r0, [r4, #0x19c]
_0202AED8:
ldrsb r0, [r6, #0x10]
add r1, r4, #4
bl sub_02028948
b _0202AF6C
_0202AEE8:
add r0, r4, #4
bl sub_02032070
cmp r0, #0
bne _0202AF6C
_0202AEF8:
ldrb r0, [r4, #0x1a1]
cmp r0, #0
bne _0202AF24
ldr r0, [r4, #0xfc]
tst r0, #0x400000
beq _0202AF38
mov r0, r6
bl sub_0202AF78
mov r0, #9
str r0, [r4, #0x19c]
b _0202AF6C
_0202AF24:
ldrb r0, [r4, #0x1b0]
cmp r0, #0
movne r0, #9
strne r0, [r4, #0x19c]
bne _0202AF6C
_0202AF38:
mov r0, #7
str r0, [r4, #0x19c]
_0202AF40:
ldrsb r0, [r6, #0x10]
bl sub_0202812C
cmp r0, #0
beq _0202AF6C
ldrb r0, [r4, #0x1a1]
cmp r0, #0
mvnne r0, #4
mvneq r0, #3
str r0, [r6, #0xb8]
mov r0, #8
str r0, [r4, #0x19c]
_0202AF6C:
add sp, sp, #0x30
ldmia sp!, {r4, r5, r6, pc}
.align 2, 0
_0202AF74: .word 0x00000408
arm_func_end UpdateParentMenu
arm_func_start sub_0202AF78
sub_0202AF78: ; 0x0202AF78
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr}
mov sl, r0
ldr r5, [sl, #0xc]
mov r7, #0
ldr r0, [r5, #0xfc]
ldr r6, [r5, #0x198]
tst r0, #0x200
ldrne r8, [r5, #0x160]
ldrsb r0, [sl, #0x10]
moveq r8, #0
bl sub_02027B1C
mov fp, #1
mov r4, r7
b _0202B008
_0202AFB0:
mov r1, r4
cmp r8, #0
beq _0202AFCC
ldrb r0, [r8]
add r8, r8, #1
tst r0, #2
movne r1, fp
_0202AFCC:
cmp r1, #0
movne sb, #0x42
moveq sb, #0x44
mov r1, r7
add r0, r5, #4
bl GetPageItemYOffset
and r1, sb, #0xff
str r1, [sp]
mov r2, r0
ldrsb r0, [sl, #0x10]
mov r1, #0xd
mov r3, r6
bl sub_020263C8
add r7, r7, #1
add r6, r6, #0x104
_0202B008:
mov r0, r6
bl IsEmptyString
cmp r0, #0
beq _0202AFB0
ldrsb r1, [sl, #0x10]
add r0, r5, #4
bl sub_0202A03C
ldrsb r0, [sl, #0x10]
bl UpdateWindow
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
arm_func_end sub_0202AF78
arm_func_start sub_0202B030
sub_0202B030: ; 0x0202B030
stmdb sp!, {r3, r4, r5, lr}
mov r5, r0
bl GetWindowContents
mov r4, r0
add r0, r4, #4
bl IsMenuOptionActive
cmp r0, #0
beq _0202B094
ldr r0, [r4, #0xfc]
tst r0, #0x80000000
bne _0202B068
add r0, r4, #4
mov r1, #0
bl PlayWindowInputSound
_0202B068:
mov r2, #1
mov r1, #0
strb r2, [r4, #0x1a0]
strb r1, [r4, #0x1a1]
mov r0, r5
sub r1, r1, #4
str r2, [r4, #0x1a4]
bl sub_0202830C
mov r0, #6
str r0, [r4, #0x19c]
ldmia sp!, {r3, r4, r5, pc}
_0202B094:
add r0, r4, #4
mov r1, #2
bl PlayWindowInputSound
ldmia sp!, {r3, r4, r5, pc}
arm_func_end sub_0202B030
arm_func_start sub_0202B0A4
sub_0202B0A4: ; 0x0202B0A4
stmdb sp!, {r3, r4, r5, lr}
mov r5, r1
bl GetWindowContents
mov r4, r0
cmp r5, #0
add r0, r4, #4
mov r1, #0xb000000
beq _0202B0D8
bl sub_02031C74
add r0, r4, #4
mov r1, #0x10
bl sub_02031C84
ldmia sp!, {r3, r4, r5, pc}
_0202B0D8:
bl sub_02031C84
add r0, r4, #4
mov r1, #0x10
bl sub_02031C74
ldmia sp!, {r3, r4, r5, pc}
arm_func_end sub_0202B0A4
arm_func_start CreateSimpleMenuFromStringIds
CreateSimpleMenuFromStringIds: ; 0x0202B0EC
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr}
mov r7, r3
mov sb, r1
mov r8, r2
mov sl, r0
mov r1, r7
mov r2, #0
b _0202B114
_0202B10C:
add r1, r1, #8
add r2, r2, #1
_0202B114:
ldrh r0, [r1]
cmp r0, #0
bne _0202B10C
add r0, r2, #1
add r0, r0, r0, lsl #6
mov r0, r0, lsl #2
mov r1, #8
bl MemAlloc
mov r5, r0
mov r6, r5
mov r4, #0
mov fp, #0x100
b _0202B16C
_0202B148:
ldr r3, _0202B1A8 ; =0x0000C402
mov r0, r6
mov r1, fp
str r4, [sp]
bl PreprocessStringFromId
ldr r0, [r7, #4]
add r7, r7, #8
str r0, [r6, #0x100]
add r6, r6, #0x104
_0202B16C:
ldrh r2, [r7]
cmp r2, #0
bne _0202B148
mov r0, #0
strb r0, [r6]
ldr r0, [r7, #4]
ldr r4, [sp, #0x28]
str r0, [r6, #0x100]
mov r0, sl
mov r1, sb
mov r2, r8
mov r3, r5
str r4, [sp]
bl CreateSimpleMenuInternal
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
.align 2, 0
_0202B1A8: .word 0x0000C402
arm_func_end CreateSimpleMenuFromStringIds
arm_func_start CreateSimpleMenu
CreateSimpleMenu: ; 0x0202B1AC
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr}
sub sp, sp, #4
mov r6, r3
mov sb, r0
mov r8, r1
mov r7, r2
mov r4, r6
mov r5, #0
b _0202B1D8
_0202B1D0:
add r4, r4, #0x104
add r5, r5, #1
_0202B1D8:
mov r0, r4
bl IsEmptyString
cmp r0, #0
beq _0202B1D0
add r0, r5, #1
add r0, r0, r0, lsl #6
mov r0, r0, lsl #2
mov r1, #8
bl MemAlloc
mov r4, r0
mov r5, r4
b _0202B234
_0202B208:
mov sl, r6
mov ip, r5
add r6, r6, #0x104
add r5, r5, #0x104
mov lr, #0x10
_0202B21C:
ldmia sl!, {r0, r1, r2, r3}
stmia ip!, {r0, r1, r2, r3}
subs lr, lr, #1
bne _0202B21C
ldr r0, [sl]
str r0, [ip]
_0202B234:
mov r0, r6
bl IsEmptyString
cmp r0, #0
beq _0202B208
mov ip, #0x10
_0202B248:
ldmia r6!, {r0, r1, r2, r3}
stmia r5!, {r0, r1, r2, r3}
subs ip, ip, #1
bne _0202B248
ldr r0, [r6]
ldr r6, [sp, #0x28]
str r0, [r5]
mov r0, sb
mov r1, r8
mov r2, r7
mov r3, r4
str r6, [sp]
bl CreateSimpleMenuInternal
add sp, sp, #4
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc}
arm_func_end CreateSimpleMenu
arm_func_start CreateSimpleMenuInternal
CreateSimpleMenuInternal: ; 0x0202B284
stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
sub sp, sp, #0x2c
mov r6, r0
mov sl, r1
mov r0, #0x1b4
mov r1, #8
mov sb, r2
mov r8, r3
bl MemAlloc
tst sl, #0x20
ldrne r7, [sb]
mov fp, #0
moveq r7, #0
cmp r6, #0
str fp, [sp, #8]
mov r4, r0
addne ip, sp, #0x1c
ldmneia r6, {r0, r1, r2, r3}
stmneia ip, {r0, r1, r2, r3}
ldrne r0, _0202B488 ; =UpdateSimpleMenu
mov r5, r8
orr sl, sl, #0x8000
strne r0, [sp, #0x1c]
bne _0202B2F8
ldr r0, _0202B48C ; =SIMPLE_MENU_DEFAULT_WINDOW_PARAMS
add r6, sp, #0x1c
ldmia r0, {r0, r1, r2, r3}
stmia r6, {r0, r1, r2, r3}
orr sl, sl, #0x300000
_0202B2F8:
ldrb r0, [sp, #0x22]
str r4, [sp, #0x28]
cmp r0, #0
bne _0202B348
mov r6, #0
b _0202B324
_0202B310:
mov r0, r5
bl sub_020265A8
cmp r0, r6
movgt r6, r0
add r5, r5, #0x104
_0202B324:
mov r0, r5
bl IsEmptyString
cmp r0, #0
beq _0202B310
mov r0, sl
mov r1, sb
add r2, r6, #0x10
bl sub_02031A5C
strb r0, [sp, #0x22]
_0202B348:
mov r5, r8
b _0202B36C
_0202B350:
ldr r0, [r5, #0x100]
add r5, r5, #0x104
cmp r0, r7
ldr r0, [sp, #8]
ldreq fp, [sp, #8]
add r0, r0, #1
str r0, [sp, #8]
_0202B36C:
mov r0, r5
bl IsEmptyString
cmp r0, #0
beq _0202B350
ldr r0, [sp, #0x50]
add r2, sp, #8
cmp r0, #0
ldrle r0, [sp, #8]
add r3, sp, #0x50
strle r0, [sp, #0x50]
ldrb r0, [sp, #0x23]
cmp r0, #0
mov r0, sl
bne _0202B3B4
mov r1, sb
bl CalcMenuHeightDiv8__02031AA4
strb r0, [sp, #0x23]
b _0202B3BC
_0202B3B4:
mov r1, sb
bl CalcMenuHeightDiv8__02031AA4
_0202B3BC:
tst sl, #0x200000
ldrneb r1, [sp, #0x20]
ldrneb r0, [sp, #0x22]
subne r0, r1, r0
strneb r0, [sp, #0x20]
tst sl, #0x100000
ldrneb r1, [sp, #0x21]
ldrneb r0, [sp, #0x23]
subne r0, r1, r0
strneb r0, [sp, #0x21]
ldr r0, _0202B488 ; =UpdateSimpleMenu
cmp sb, #0
str r0, [r4]
str sl, [r4, #0xfc]
beq _0202B418
add r6, r4, #0x100
mov r5, #9
_0202B400:
ldmia sb!, {r0, r1, r2, r3}
stmia r6!, {r0, r1, r2, r3}
subs r5, r5, #1
bne _0202B400
ldmia sb, {r0, r1}
stmia r6, {r0, r1}
_0202B418:
str fp, [r4, #0x100]
str r8, [r4, #0x198]
mov r2, #0
str r2, [r4, #0x19c]
strb r2, [r4, #0x1a0]
strb r2, [r4, #0x1a1]
str r2, [r4, #0x1a4]
str r2, [r4, #0x1ac]
str r2, [r4, #0x1b0]
add r0, sp, #0x1c
mov r1, #3
strb r2, [sp, #0x24]
bl NewWindowScreenCheck
add r1, sp, #0xc
mov r6, r0
bl GetWindowRectangle
ldr r0, [sp, #8]
add r3, sp, #0xc
str r0, [sp]
ldr r5, [sp, #0x50]
mov r1, sl
add r0, r4, #4
add r2, r4, #0x100
str r5, [sp, #4]
bl InitWindowInput
mov r0, r6
add sp, sp, #0x2c
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc}
.align 2, 0
_0202B488: .word UpdateSimpleMenu
_0202B48C: .word SIMPLE_MENU_DEFAULT_WINDOW_PARAMS
arm_func_end CreateSimpleMenuInternal
arm_func_start ResumeSimpleMenu
ResumeSimpleMenu: ; 0x0202B490
stmdb sp!, {r3, lr}
bl GetWindowContents
mov r1, #1
str r1, [r0, #0x19c]
mov r1, #0
strb r1, [r0, #0x1a0]
strb r1, [r0, #0x1a1]
ldr r1, [r0, #0xfc]
bic r1, r1, #0x800000
str r1, [r0, #0xfc]
add r0, r0, #4
bl sub_02032984
ldmia sp!, {r3, pc}
arm_func_end ResumeSimpleMenu

View File

@@ -1,657 +0,0 @@
.include "asm/macros.inc"
.include "overlay_29_022E7EC4.inc"
.text
arm_func_start AllocTopScreenStatus
AllocTopScreenStatus: ; 0x022E7EC4
stmdb sp!, {r3, lr}
mov r0, #0x230
mov r1, #0
bl MemAlloc
ldr r2, _022E7F40 ; =TOP_SCREEN_STATUS_PTR
mov r1, #0x230
str r0, [r2]
bl MemZero
ldr r0, _022E7F40 ; =TOP_SCREEN_STATUS_PTR
mov r2, #0
ldr r1, [r0]
strb r2, [r1]
ldr r1, [r0]
strb r2, [r1, #0x29]
ldr r1, [r0]
strb r2, [r1, #0x2c]
ldr r1, [r0]
strb r2, [r1, #0x2b]
ldr r1, [r0]
str r2, [r1, #4]
ldr r0, [r0]
strb r2, [r0, #0x228]
bl ov29_022E8708
ldr r0, _022E7F40 ; =TOP_SCREEN_STATUS_PTR
mov r3, #2
ldr r2, [r0]
mov r1, #0
str r3, [r2, #4]
ldr r0, [r0]
strb r1, [r0, #0x229]
ldmia sp!, {r3, pc}
.align 2, 0
_022E7F40: .word TOP_SCREEN_STATUS_PTR
arm_func_end AllocTopScreenStatus
arm_func_start FreeTopScreenStatus
FreeTopScreenStatus: ; 0x022E7F44
stmdb sp!, {r3, lr}
ldr r0, _022E7F78 ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
cmp r0, #0
ldmeqia sp!, {r3, pc}
bl FreeTopScreen
ldr r0, _022E7F78 ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
bl MemFree
ldr r0, _022E7F78 ; =TOP_SCREEN_STATUS_PTR
mov r1, #0
str r1, [r0]
ldmia sp!, {r3, pc}
.align 2, 0
_022E7F78: .word TOP_SCREEN_STATUS_PTR
arm_func_end FreeTopScreenStatus
arm_func_start ov29_022E7F7C
ov29_022E7F7C: ; 0x022E7F7C
ldr r0, _022E7F90 ; =TOP_SCREEN_STATUS_PTR
mov r1, #0
ldr r0, [r0]
strb r1, [r0]
bx lr
.align 2, 0
_022E7F90: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E7F7C
arm_func_start ov29_022E7F94
ov29_022E7F94: ; 0x022E7F94
stmdb sp!, {r3, lr}
ldr r0, _022E8014 ; =TOP_SCREEN_STATUS_PTR
mov r3, #0
ldr r2, [r0]
mov r1, #1
strb r3, [r2, #0x228]
ldr r0, [r0]
strb r1, [r0]
bl ov29_02339138
mov r0, #1
mov r1, r0
bl ov29_02339D7C
bl UpdateMinimap
mov r0, #0
bl SetMinimapDataE447
ldr r1, _022E8014 ; =TOP_SCREEN_STATUS_PTR
mov r0, #1
ldr r1, [r1]
strb r0, [r1]
bl SetMinimapDataE448
bl ov29_022E8104
bl GetPlayerGender
cmp r0, #2
ldr r0, _022E8014 ; =TOP_SCREEN_STATUS_PTR
moveq r1, #1
ldr r0, [r0]
movne r1, #0
and r1, r1, #0xff
add r0, r0, #0xb8
bl ov29_022DC738
mov r0, #1
ldmia sp!, {r3, pc}
.align 2, 0
_022E8014: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E7F94
arm_func_start ov29_022E8018
ov29_022E8018: ; 0x022E8018
stmdb sp!, {r3, lr}
ldr r0, _022E8050 ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
ldrb r0, [r0, #0x228]
cmp r0, #0
beq _022E8048
bl ov29_022DC76C
bl ov29_022DC778
ldr r0, _022E8050 ; =TOP_SCREEN_STATUS_PTR
mov r1, #0
ldr r0, [r0]
strb r1, [r0, #0x228]
_022E8048:
mov r0, #1
ldmia sp!, {r3, pc}
.align 2, 0
_022E8050: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E8018
arm_func_start ov29_022E8054
ov29_022E8054: ; 0x022E8054
stmdb sp!, {r3, lr}
ldrb r1, [r0, #0x10]
cmp r1, #0
ldmeqia sp!, {r3, pc}
mov r1, #0
strb r1, [r0, #0x10]
bl GetTopScreenOption
cmp r0, #3
ldrne r0, _022E80CC ; =TOP_SCREEN_STATUS_PTR
movne r1, #0
ldrne r0, [r0]
strneb r1, [r0]
ldmneia sp!, {r3, pc}
ldr r0, _022E80CC ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
ldrb r0, [r0]
cmp r0, #0
ldmneia sp!, {r3, pc}
bl ov29_02339138
mov r0, #0
mov r1, #1
bl ov29_0233A0E8
mov r0, #1
mov r1, #0
bl ov29_02339D7C
ldr r0, _022E80CC ; =TOP_SCREEN_STATUS_PTR
mov r1, #1
ldr r0, [r0]
strb r1, [r0]
ldmia sp!, {r3, pc}
.align 2, 0
_022E80CC: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E8054
arm_func_start ov29_022E80D0
ov29_022E80D0: ; 0x022E80D0
stmdb sp!, {r3, lr}
bl ov29_022DC77C
ldr r1, _022E8100 ; =TOP_SCREEN_STATUS_PTR
mov r0, #0
ldr r1, [r1]
strb r0, [r1]
bl SetMinimapDataE448
mov r0, #1
bl ov29_0233A1BC
bl ov29_02339138
mov r0, #1
ldmia sp!, {r3, pc}
.align 2, 0
_022E8100: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E80D0
arm_func_start ov29_022E8104
ov29_022E8104: ; 0x022E8104
stmdb sp!, {r3, lr}
ldr r0, _022E812C ; =TOP_SCREEN_STATUS_PTR
mov r2, #0
ldr r1, [r0]
strb r2, [r1, #0x228]
ldr r0, [r0]
add r0, r0, #0xb8
bl ov10_022C1E50
bl ov29_022E8CE8
ldmia sp!, {r3, pc}
.align 2, 0
_022E812C: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E8104
arm_func_start InitializeTeamStats
InitializeTeamStats: ; 0x022E8130
stmdb sp!, {r3, lr}
ldr r0, _022E818C ; =TOP_SCREEN_STATUS_PTR
mov r2, #0
ldr r1, [r0]
strb r2, [r1, #0x228]
ldr r0, [r0]
strb r2, [r0, #0x229]
bl ov29_022E8104
ldr r0, _022E818C ; =TOP_SCREEN_STATUS_PTR
mov r1, #1
ldr r0, [r0]
strb r1, [r0, #0x24]
bl GetPlayerGender
cmp r0, #2
ldr r0, _022E818C ; =TOP_SCREEN_STATUS_PTR
moveq r1, #1
ldr r0, [r0]
movne r1, #0
and r1, r1, #0xff
add r0, r0, #0xb8
bl ov29_022DC694
mov r0, #1
ldmia sp!, {r3, pc}
.align 2, 0
_022E818C: .word TOP_SCREEN_STATUS_PTR
arm_func_end InitializeTeamStats
arm_func_start UpdateTeamStatsWrapper
UpdateTeamStatsWrapper: ; 0x022E8190
stmdb sp!, {r3, lr}
ldr r0, _022E81C4 ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
ldrb r0, [r0, #0x228]
cmp r0, #0
beq _022E81BC
bl ov29_022DC6D0
ldr r0, _022E81C4 ; =TOP_SCREEN_STATUS_PTR
mov r1, #0
ldr r0, [r0]
strb r1, [r0, #0x228]
_022E81BC:
mov r0, #1
ldmia sp!, {r3, pc}
.align 2, 0
_022E81C4: .word TOP_SCREEN_STATUS_PTR
arm_func_end UpdateTeamStatsWrapper
arm_func_start ov29_022E81C8
ov29_022E81C8: ; 0x022E81C8
stmdb sp!, {r4, lr}
mov r4, r0
bl ov29_022DC6DC
ldrb r0, [r4, #0x10]
cmp r0, #0
movne r0, #0
strneb r0, [r4, #0x10]
ldmia sp!, {r4, pc}
arm_func_end ov29_022E81C8
arm_func_start FreeTeamStatsWrapper
FreeTeamStatsWrapper: ; 0x022E81E8
stmdb sp!, {r3, lr}
bl ov29_022DC728
mov r0, #1
ldmia sp!, {r3, pc}
arm_func_end FreeTeamStatsWrapper
arm_func_start ov29_022E81F8
ov29_022E81F8: ; 0x022E81F8
stmdb sp!, {r3, lr}
bl IsTeamStatsOnTopScreen
cmp r0, #0
bne _022E8210
bl ov29_022E8104
ldmia sp!, {r3, pc}
_022E8210:
bl GetTopScreenOption
cmp r0, #1
bne _022E8238
ldr r0, _022E8240 ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
ldrsh r0, [r0, #8]
cmp r0, #1
beq _022E8238
mov r0, #1
bl DungeonChangeTopScreenType
_022E8238:
bl ov29_022E8CE8
ldmia sp!, {r3, pc}
.align 2, 0
_022E8240: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E81F8
arm_func_start ov29_022E8244
ov29_022E8244: ; 0x022E8244
stmdb sp!, {r3, lr}
bl GetTopScreenOption
cmp r0, #4
ldreq r0, _022E826C ; =TOP_SCREEN_STATUS_PTR
ldreq r0, [r0]
ldreqsh r0, [r0, #8]
cmpeq r0, #4
ldmneia sp!, {r3, pc}
bl ov29_022E9008
ldmia sp!, {r3, pc}
.align 2, 0
_022E826C: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E8244
arm_func_start DisplayTeamStatsSprite
DisplayTeamStatsSprite: ; 0x022E8270
#ifdef JAPAN
#define OV29_022E8270_OFFSET -0xA4
#else
#define OV29_022E8270_OFFSET 0
#endif
stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
sub sp, sp, #0x1c
ldr r3, _022E83FC ; =TOP_SCREEN_STATUS_PTR
mov sl, r0
ldr r3, [r3]
mov sb, r1
mov fp, r2
cmp r3, #0
beq _022E83F4
ldr r8, [sl, #0xb4]
bl GetIdleAnimationId
ldr r1, _022E8400 ; =DUNGEON_PTR
mov r4, r0
ldr r1, [r1]
mov r5, #0
add r1, r1, #0x1a000
ldr r0, [r1, #0x22c + OV29_022E8270_OFFSET]
mov r6, r5
cmp r0, sl
ldrsh r0, [sl, #0xa8]
mov r7, r5
str r0, [sp, #0x18]
moveq r0, r5
ldrneb r0, [r1, #0x245 + OV29_022E8270_OFFSET]
cmp r0, #0
bne _022E82E4
ldrb r0, [r8, #0xd8]
cmp r0, #2
bne _022E82F0
_022E82E4:
ldr r0, _022E8404 ; =0x00000229
bl DungeonGetSpriteIndex
str r0, [sp, #0x18]
_022E82F0:
ldrb r0, [r8, #0xc4]
cmp r0, #1
cmpne r0, #6
beq _022E8364
ldr r0, _022E8400 ; =DUNGEON_PTR
ldr r0, [r0]
ldrb r0, [r0, #0x78b]
cmp r0, #0
beq _022E832C
bl ov29_0234B4E0
cmp r0, #0
addeq r0, r5, #2
moveq r0, r0, lsl #0x10
moveq r5, r0, asr #0x10
beq _022E8354
_022E832C:
ldrb r0, [sl, #0xaf]
cmp r0, #0
cmpne r0, #7
bne _022E8354
ldr r0, [sl, #0xb4]
#ifdef JAPAN
ldr r0, [r0, #0x10c]
#else
ldr r0, [r0, #0x110]
#endif
cmp r0, #1
addgt r0, r5, #1
movgt r0, r0, lsl #0x10
movgt r5, r0, asr #0x10
_022E8354:
add r0, r5, #1
mov r0, r0, lsl #0x10
mov r5, r0, asr #0x10
b _022E8368
_022E8364:
mov r5, #0
_022E8368:
#ifdef JAPAN
ldrb r0, [r8, #0x10a]
#else
ldrb r0, [r8, #0x10b]
#endif
cmp r0, #2
beq _022E83A4
ldrb r1, [r8, #0xc4]
cmp r1, #6
ldrneb r0, [r8, #0xbf]
cmpne r0, #4
cmpne r1, #2
bne _022E83A4
ldr r0, _022E8408 ; =DUNGEON_FRAMES_PASSED
ldr r0, [r0]
and r0, r0, #2
add r0, r6, r0
mov r0, r0, lsl #0x10
mov r6, r0, asr #0x10
_022E83A4:
ldrb r0, [r8, #0xef]
cmp r0, #1
ldreq r0, _022E8400 ; =DUNGEON_PTR
ldreq r0, [r0]
addeq r0, r0, #0x1a000
ldreqb r0, [r0, #0x244 + OV29_022E8270_OFFSET]
cmpeq r0, #0
moveq r7, #1
cmp r4, #0xff
beq _022E83F4
mov r0, #1
stmia sp, {r0, sb, fp}
str r5, [sp, #0xc]
str r6, [sp, #0x10]
str r7, [sp, #0x14]
ldrsh r1, [r8, #4]
ldr r3, [r8, #0xb0]
ldr r0, [sp, #0x18]
mov r2, r4
bl ov29_022DC6E8
_022E83F4:
add sp, sp, #0x1c
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc}
.align 2, 0
_022E83FC: .word TOP_SCREEN_STATUS_PTR
_022E8400: .word DUNGEON_PTR
_022E8404: .word 0x00000229
_022E8408: .word DUNGEON_FRAMES_PASSED
arm_func_end DisplayTeamStatsSprite
arm_func_start ov29_022E840C
ov29_022E840C: ; 0x022E840C
stmdb sp!, {lr}
sub sp, sp, #0x14
ldr r0, _022E8478 ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
ldrb r0, [r0, #0x29]
cmp r0, #0
movne r0, #0
bne _022E8470
add r0, sp, #0
bl ov10_022C22A0
ldr r0, _022E8478 ; =TOP_SCREEN_STATUS_PTR
add r1, sp, #0
ldr r0, [r0]
mov r2, #0
add r0, r0, #0x80
mov r3, #1
bl ov10_022C1E80
bl sub_02048400
cmp r0, #0
beq _022E8460
bl sub_02048384
_022E8460:
ldr r1, _022E8478 ; =TOP_SCREEN_STATUS_PTR
mov r0, #1
ldr r1, [r1]
strb r0, [r1, #0x29]
_022E8470:
add sp, sp, #0x14
ldmia sp!, {pc}
.align 2, 0
_022E8478: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E840C
arm_func_start ov29_022E847C
ov29_022E847C: ; 0x022E847C
stmdb sp!, {r3, lr}
ldrb r1, [r0, #0x10]
cmp r1, #0
ldmeqia sp!, {r3, pc}
mov r1, #0
strb r1, [r0, #0x10]
bl sub_020483B8
ldr r0, _022E84AC ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
add r0, r0, #0x80
bl ov10_022C21D8
ldmia sp!, {r3, pc}
.align 2, 0
_022E84AC: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E847C
arm_func_start ov29_022E84B0
ov29_022E84B0: ; 0x022E84B0
stmdb sp!, {r3, lr}
ldr r0, _022E84FC ; =TOP_SCREEN_STATUS_PTR
ldr r1, [r0]
ldrb r0, [r1, #0x29]
cmp r0, #0
moveq r0, #0
ldmeqia sp!, {r3, pc}
add r0, r1, #0x80
bl ov10_022C2278
bl sub_02048400
cmp r0, #0
beq _022E84E4
bl sub_020483D8
_022E84E4:
ldr r0, _022E84FC ; =TOP_SCREEN_STATUS_PTR
mov r2, #0
ldr r1, [r0]
mov r0, #1
strb r2, [r1, #0x29]
ldmia sp!, {r3, pc}
.align 2, 0
_022E84FC: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E84B0
arm_func_start InitDungeonControlsMenuWithBg
InitDungeonControlsMenuWithBg: ; 0x022E8500
stmdb sp!, {lr}
sub sp, sp, #0x14
add r0, sp, #0
bl ov10_022C22A0
ldr r0, _022E8548 ; =TOP_SCREEN_STATUS_PTR
add r1, sp, #0
ldr r0, [r0]
mov r2, #0
add r0, r0, #0x80
mov r3, #1
bl ov10_022C1E80
ldr r0, _022E8548 ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
add r0, r0, #0x80
bl ov10_022C21D8
bl InitDungeonControlsMenu
add sp, sp, #0x14
ldmia sp!, {pc}
.align 2, 0
_022E8548: .word TOP_SCREEN_STATUS_PTR
arm_func_end InitDungeonControlsMenuWithBg
arm_func_start ov29_022E854C
ov29_022E854C: ; 0x022E854C
stmdb sp!, {r4, lr}
mov r4, r0
ldrb r0, [r4, #0x10]
cmp r0, #0
ldmeqia sp!, {r4, pc}
add r0, r4, #0x10
bl ov29_022E8F78
ldr r0, _022E8584 ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
add r0, r0, #0x80
bl ov10_022C21D8
mov r0, #0
strb r0, [r4, #0x10]
ldmia sp!, {r4, pc}
.align 2, 0
_022E8584: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E854C
arm_func_start FreeDungeonControlsMenuWithBg
FreeDungeonControlsMenuWithBg: ; 0x022E8588
stmdb sp!, {r3, lr}
ldr r0, _022E85A4 ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
add r0, r0, #0x80
bl ov10_022C2278
bl FreeDungeonControlsMenu
ldmia sp!, {r3, pc}
.align 2, 0
_022E85A4: .word TOP_SCREEN_STATUS_PTR
arm_func_end FreeDungeonControlsMenuWithBg
arm_func_start ov29_022E85A8
ov29_022E85A8: ; 0x022E85A8
stmdb sp!, {lr}
sub sp, sp, #0x14
add r0, sp, #0
bl ov10_022C22A0
ldr r0, _022E85F0 ; =TOP_SCREEN_STATUS_PTR
add r1, sp, #0
ldr r0, [r0]
mov r2, #0
add r0, r0, #0x80
mov r3, #1
bl ov10_022C1E80
ldr r0, _022E85F0 ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
add r0, r0, #0x80
bl ov10_022C21D8
bl ov29_022E8FCC
add sp, sp, #0x14
ldmia sp!, {pc}
.align 2, 0
_022E85F0: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E85A8
arm_func_start ov29_022E85F4
ov29_022E85F4: ; 0x022E85F4
stmdb sp!, {r4, lr}
mov r4, r0
ldrb r0, [r4, #0x10]
cmp r0, #0
ldmeqia sp!, {r4, pc}
add r0, r4, #0x10
bl ov29_022E9014
ldr r0, _022E862C ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
add r0, r0, #0x80
bl ov10_022C21D8
mov r0, #0
strb r0, [r4, #0x10]
ldmia sp!, {r4, pc}
.align 2, 0
_022E862C: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E85F4
arm_func_start ov29_022E8630
ov29_022E8630: ; 0x022E8630
stmdb sp!, {r3, lr}
ldr r0, _022E864C ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
add r0, r0, #0x80
bl ov10_022C2278
bl ov29_022E8FF8
ldmia sp!, {r3, pc}
.align 2, 0
_022E864C: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E8630
arm_func_start ov29_022E8650
ov29_022E8650: ; 0x022E8650
stmdb sp!, {lr}
sub sp, sp, #0x14
add r0, sp, #0
bl ov10_022C22A0
ldr r0, _022E8698 ; =TOP_SCREEN_STATUS_PTR
add r1, sp, #0
ldr r0, [r0]
mov r2, #0
add r0, r0, #0x80
mov r3, #1
bl ov10_022C1E80
ldr r0, _022E8698 ; =TOP_SCREEN_STATUS_PTR
ldr r0, [r0]
add r0, r0, #0x80
bl ov10_022C21D8
mov r0, #1
add sp, sp, #0x14
ldmia sp!, {pc}
.align 2, 0
_022E8698: .word TOP_SCREEN_STATUS_PTR
arm_func_end ov29_022E8650

View File

@@ -1,491 +0,0 @@
.include "asm/macros.inc"
.include "overlay_29_023055B0.inc"
.text
arm_func_start ov29_023055B0
ov29_023055B0: ; 0x023055B0
#ifdef JAPAN
#define OV29_023055B0_OFFSET -4
#else
#define OV29_023055B0_OFFSET 0
#endif
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr}
mov r6, #0
mov r5, #1
ldr r4, _02305690 ; =DUNGEON_PTR
b _02305684
_023055C4:
ldr r0, [r4]
add r0, r0, r6, lsl #2
add r0, r0, #0x12000
#ifdef JAPAN
ldr r7, [r0, #0xad4]
#else
ldr r7, [r0, #0xb78]
#endif
mov r0, r7
bl EntityIsValid__0230558C
cmp r0, #0
beq _02305680
ldr r8, [r7, #0xb4]
ldrb r0, [r8, #7]
cmp r0, #0
bne _02305680
mov r0, r8
bl IsTeamMemberOnFirstTurnInFixedRoom
cmp r0, #0
ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
add r0, r8, #0x100
ldrsh r1, [r0, #0x7e + OV29_023055B0_OFFSET]
cmp r1, #0
ldreqsh r0, [r0, #0x80 + OV29_023055B0_OFFSET]
cmpeq r0, #0
beq _02305680
ldrsh r0, [r7, #4]
cmp r1, r0
addeq r0, r8, #0x100
ldreqsh r1, [r0, #0x80 + OV29_023055B0_OFFSET]
ldreqsh r0, [r7, #6]
cmpeq r1, r0
beq _02305680
mov r0, r7
mov r1, r5
bl CheckVariousStatuses2__02301244
cmp r0, #0
bne _02305680
add r1, r8, #0x7e + OV29_023055B0_OFFSET
add r0, r7, #4
add r1, r1, #0x100
bl GetDirectionTowardsPosition
mov sb, r0
and r1, sb, #7
mov r0, r7
strb r1, [r8, #0x4c]
bl GetIdleAnimationId
mov r1, r0
mov r0, r7
mov r2, sb
bl ChangeMonsterAnimation
_02305680:
add r6, r6, #1
_02305684:
cmp r6, #0x14
blt _023055C4
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
.align 2, 0
_02305690: .word DUNGEON_PTR
arm_func_end ov29_023055B0
arm_func_start CheckNonLeaderTile
CheckNonLeaderTile: ; 0x02305694
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr}
mov sb, r0
ldr r8, [sb, #0xb4]
bl EntityIsValid__0230558C
cmp r0, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
mov r0, sb
bl GetTileAtEntity
mov r4, r0
mov r0, sb
mov r1, #0xd
bl IqSkillIsEnabled
cmp r0, #0
ldrneb r0, [r8, #0xef]
cmpne r0, #3
beq _02305708
mov r0, sb
mov r1, #0x6f
bl AbilityIsActiveVeneer
cmp r0, #0
movne r0, #0
bne _023056F8
mov r0, sb
mov r1, #0x10
bl HasHeldItem
_023056F8:
cmp r0, #0
bne _02305708
add r0, sb, #4
bl ov29_02337D68
_02305708:
ldr r4, [r4, #0x10]
cmp r4, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
ldr r0, [r4]
cmp r0, #6
addls pc, pc, r0, lsl #2
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
_02305724: ; jump table
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 0
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 1
b _02305740 ; case 2
b _02305808 ; case 3
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 4
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 5
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 6
_02305740:
mov r0, r4
bl GetTrapInfo
ldrb r1, [r8, #6]
mov r6, #0
mov r5, r0
mov r7, r6
cmp r1, #0
bne _02305790
mov r0, sb
mov r1, #0x13
bl IqSkillIsEnabled
cmp r0, #0
beq _02305790
ldrb r0, [r4, #0x20]
cmp r0, #0
bne _02305790
mov r0, #1
strb r0, [r4, #0x20]
bl UpdateTrapsVisibility
mov r7, #1
_02305790:
ldrb r0, [r5, #1]
cmp r0, #0
bne _023057B8
ldrb r0, [r4, #0x20]
cmp r0, #0
beq _023057E0
ldrb r0, [r8, #6]
cmp r0, #0
moveq r6, #1
b _023057E0
_023057B8:
cmp r0, #1
bne _023057D0
ldrb r0, [r8, #6]
cmp r0, #0
movne r6, #1
b _023057E0
_023057D0:
cmp r0, #2
ldreqb r0, [r8, #6]
cmpeq r0, #0
moveq r6, #1
_023057E0:
cmp r6, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
cmp r7, #0
ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
mov r0, sb
add r1, sb, #4
mov r2, #0
mov r3, #1
bl TryTriggerTrap
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
_02305808:
mov r0, sb
bl TryNonLeaderItemPickUp
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
arm_func_end CheckNonLeaderTile
arm_func_start ov29_02305814
ov29_02305814: ; 0x02305814
stmdb sp!, {r3, r4, r5, lr}
mov r5, r0
mov r4, r1
bl EntityIsValid__0230558C
cmp r0, #0
ldmeqia sp!, {r3, r4, r5, pc}
ldr r0, [r5, #0xb4]
ldrb r0, [r0, #6]
cmp r0, #0
ldmneia sp!, {r3, r4, r5, pc}
bl IsFloorOver
cmp r0, #0
ldreq r0, _023058BC ; =DUNGEON_PTR
ldreq r0, [r0]
ldreqb r0, [r0, #0x793]
cmpeq r0, #0
ldmneia sp!, {r3, r4, r5, pc}
mov r0, r5
bl GetTileAtEntity
ldrh r0, [r0]
tst r0, #0x40
ldmeqia sp!, {r3, r4, r5, pc}
bl GetLeader
ldr r1, _023058C0 ; =0x00000C82
bl LogMessageByIdWithPopupCheckUser
ldr r1, _023058BC ; =DUNGEON_PTR
mov r0, r5
ldr r2, [r1]
mov r3, #1
mov r1, r4
strb r3, [r2, #0x794]
bl TryTriggerMonsterHouse
mov r0, #0
bl ov29_022E3A58
add r0, r5, #4
bl ov29_022E2CA0
cmp r0, #0
ldmeqia sp!, {r3, r4, r5, pc}
mov r0, #0x78
mov r1, #0x39
bl ov29_022EA370
ldmia sp!, {r3, r4, r5, pc}
.align 2, 0
_023058BC: .word DUNGEON_PTR
#ifdef JAPAN
_023058C0: .word 0x000009C2
#else
_023058C0: .word 0x00000C82
#endif
arm_func_end ov29_02305814
arm_func_start EndNegativeStatusCondition
EndNegativeStatusCondition: ; 0x023058C4
#ifdef JAPAN
#define END_NEGATIVE_STATUS_CONDITION_OFFSET -4
#else
#define END_NEGATIVE_STATUS_CONDITION_OFFSET 0
#endif
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr}
mov r4, #0
mov sb, r1
mov sl, r0
mov r0, sb
mov r8, r2
mov r7, r3
mov r5, r4
bl EntityIsValid__02305C04
cmp r0, #0
moveq r0, r4
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
mov r0, sb
mov r1, r4
ldr r6, [sb, #0xb4]
bl MonsterHasNegativeStatus
cmp r0, #0
beq _02305AD8
mov r0, sb
mov r4, #1
bl IsMonsterDrowsy
cmp r0, #0
beq _0230593C
mov r2, r5
mov fp, r4
mov r0, sl
mov r1, sb
mov r3, r2
str fp, [sp]
bl EndSleepClassStatus
_0230593C:
mov r0, sb
bl EntityIsValid__02305C04
cmp r0, #0
moveq r0, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
mov r0, sb
bl MonsterHasNonvolatileNonsleepStatus
cmp r0, #0
beq _0230596C
mov r0, sl
mov r1, sb
bl EndBurnClassStatus
_0230596C:
ldrb r0, [sp, #0x28]
cmp r0, #0
mov r0, sb
beq _0230599C
bl MonsterHasImmobilizingStatus
cmp r0, #0
beq _023059C0
mov r0, sl
mov r1, sb
mov r2, #1
bl EndFrozenClassStatus
b _023059C0
_0230599C:
bl MonsterHasImmobilizingStatus
cmp r0, #0
ldrneb r0, [r6, #0xc4]
cmpne r0, #3
beq _023059C0
mov r0, sl
mov r1, sb
mov r2, #1
bl EndFrozenClassStatus
_023059C0:
mov r0, sb
bl MonsterHasAttackInterferingStatus
cmp r0, #0
beq _023059DC
mov r0, sl
mov r1, sb
bl EndCringeClassStatus
_023059DC:
mov r0, sb
bl MonsterHasSkillInterferingStatus
cmp r0, #0
beq _02305A00
mov r0, sl
mov r1, sb
mov r2, #0
mov r3, #1
bl EndCurseClassStatus
_02305A00:
mov r0, sb
bl MonsterHasLeechSeedStatus
cmp r0, #0
beq _02305A1C
mov r0, sl
mov r1, sb
bl EndLeechSeedClassStatus
_02305A1C:
mov r0, sb
bl MonsterHasWhifferStatus
cmp r0, #0
beq _02305A38
mov r0, sl
mov r1, sb
bl EndSureShotClassStatus
_02305A38:
mov r0, sb
mov r1, #0
bl IsMonsterVisuallyImpaired
cmp r0, #0
beq _02305A58
mov r0, sl
mov r1, sb
bl EndBlinkerClassStatus
_02305A58:
mov r0, sb
bl IsMonsterMuzzled
cmp r0, #0
beq _02305A74
mov r0, sl
mov r1, sb
bl EndMuzzledStatus
_02305A74:
mov r0, sb
bl MonsterHasMiracleEyeStatus
cmp r0, #0
beq _02305A90
mov r0, sl
mov r1, sb
bl EndMiracleEyeStatus
_02305A90:
#ifdef JAPAN
ldrb r0, [r6, #0x105]
#else
ldrb r0, [r6, #0x106]
#endif
cmp r0, #0
beq _02305AB4
ldr r2, _02305BF0 ; =0x00000C83
mov r3, #0
mov r0, sl
mov r1, sb
#ifdef JAPAN
strb r3, [r6, #0x105]
#else
strb r3, [r6, #0x106]
#endif
bl LogMessageByIdWithPopupCheckUserTarget
_02305AB4:
ldrb r0, [r6, #0xfe]
cmp r0, #0
beq _02305AD8
ldr r2, _02305BF4 ; =0x00000C84
mov r3, #0
mov r0, sl
mov r1, sb
strb r3, [r6, #0xfe]
bl LogMessageByIdWithPopupCheckUserTarget
_02305AD8:
mov r0, sb
bl CalcSpeedStageWrapper
mov r2, #0
mov fp, r0
mov r1, r2
_02305AEC:
add r0, r6, r2
add r2, r2, #1
strb r1, [r0, #0x119 + END_NEGATIVE_STATUS_CONDITION_OFFSET]
cmp r2, #5
blt _02305AEC
mov r0, sb
bl CalcSpeedStageWrapper
cmp fp, r0
beq _02305B40
mov r0, #0
mov r1, sb
mov r2, r0
mov r4, #1
bl SubstitutePlaceholderStringTags
ldr r1, [r6, #0x110 + END_NEGATIVE_STATUS_CONDITION_OFFSET]
ldr r0, _02305BF8 ; =ov29_02353318
mov r1, r1, lsl #1
ldrh r2, [r0, r1]
mov r0, sl
mov r1, sb
bl LogMessageByIdWithPopupCheckUserTarget
_02305B40:
mov fp, #0
mov r1, #1
add r2, r6, #0x124 + END_NEGATIVE_STATUS_CONDITION_OFFSET
mov r0, fp
mov ip, r1
_02305B54:
ldrb r6, [r2, fp, lsl #3]
add r3, r2, fp, lsl #3
tst r6, #1
movne r6, r1
moveq r6, r0
tst r6, #0xff
beq _02305B88
ldrh r6, [r3, #2]
tst r6, #1
bicne r6, r6, #1
movne r4, ip
movne r5, ip
strneh r6, [r3, #2]
_02305B88:
add fp, fp, #1
cmp fp, #4
blt _02305B54
cmp r4, #0
beq _02305BC8
cmp r8, #0
beq _02305BAC
mov r0, sb
bl ov29_022E543C
_02305BAC:
cmp r5, #0
beq _02305BE0
ldr r2, _02305BFC ; =0x00000C85
mov r0, sl
mov r1, sb
bl LogMessageByIdWithPopupCheckUserTarget
b _02305BE0
_02305BC8:
cmp r7, #0
bne _02305BE0
ldr r2, _02305C00 ; =0x00000C86
mov r0, sl
mov r1, sb
bl LogMessageByIdWithPopupCheckUserTarget
_02305BE0:
mov r0, sb
bl UpdateStatusIconFlags
mov r0, r4
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
.align 2, 0
#ifdef JAPAN
#define END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET -0x2C0
#else
#define END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET 0
#endif
_02305BF0: .word 0x00000C83 + END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET
_02305BF4: .word 0x00000C84 + END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET
_02305BF8: .word ov29_02353318
_02305BFC: .word 0x00000C85 + END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET
_02305C00: .word 0x00000C86 + END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET
arm_func_end EndNegativeStatusCondition

View File

@@ -1,524 +0,0 @@
.include "asm/macros.inc"
.include "overlay_29_02314810.inc"
.text
arm_func_start TrySealMove
TrySealMove: ; 0x02314ABC
stmdb sp!, {r4, r5, r6, r7, r8, sb, lr}
sub sp, sp, #0x14
mov r5, #0
movs r7, r1
mov r8, r0
mov r6, r2
moveq r0, r5
beq _02314C18
mov r2, #1
bl SafeguardIsActive
cmp r0, #0
movne r0, r5
bne _02314C18
mov r0, r8
mov r1, r7
mov r2, #1
bl IsProtectedFromNegativeStatus
cmp r0, #0
movne r0, r5
bne _02314C18
ldr r0, [r7, #0xb4]
mov r4, r5
#ifdef JAPAN
add ip, r0, #0x120
#else
add ip, r0, #0x124
#endif
mov lr, r4
mov r2, r5
mov r3, #1
add r0, sp, #4
_02314B28:
ldrb r1, [ip, lr, lsl #3]
add sb, ip, lr, lsl #3
tst r1, #1
movne r1, r3
moveq r1, r2
tst r1, #0xff
beq _02314B54
ldrh r1, [sb, #2]
tst r1, #1
streq sb, [r0, r4, lsl #2]
addeq r4, r4, #1
_02314B54:
add lr, lr, #1
cmp lr, #4
blt _02314B28
cmp r6, #0
beq _02314B74
cmp r4, #0
moveq r0, #0
beq _02314C18
_02314B74:
cmp r4, #0
beq _02314BE8
ldr r3, _02314C20 ; =0x00000DBE
mov r5, #8
mov r0, r8
mov r1, r7
mov r2, #1
str r5, [sp]
bl ExclusiveItemEffectIsActiveWithLogging
cmp r0, #0
movne r0, #0
bne _02314C18
cmp r6, #0
movne r0, #1
bne _02314C18
mov r0, r4
bl DungeonRandInt
add r1, sp, #4
ldr r2, [r1, r0, lsl #2]
mov r0, #0
ldrh r1, [r2, #2]
orr r1, r1, #1
strh r1, [r2, #2]
ldrh r1, [r2, #4]
bl SetPreprocessorArgsIdVal
mov r0, r8
mov r1, r7
mov r5, #1
bl TryActivateQuickFeet
_02314BE8:
cmp r5, #0
beq _02314C04
ldr r2, _02314C24 ; =0x00000DE3
mov r0, r8
mov r1, r7
bl LogMessageByIdWithPopupCheckUserTarget
b _02314C14
_02314C04:
ldr r2, _02314C28 ; =0x00000DE4
mov r0, r8
mov r1, r7
bl LogMessageByIdWithPopupCheckUserTarget
_02314C14:
mov r0, #1
_02314C18:
add sp, sp, #0x14
ldmia sp!, {r4, r5, r6, r7, r8, sb, pc}
.align 2, 0
#ifdef JAPAN
_02314C20: .word 0x00000AFE
_02314C24: .word 0x00000B23
_02314C28: .word 0x00000B24
#else
_02314C20: .word 0x00000DBE
_02314C24: .word 0x00000DE3
_02314C28: .word 0x00000DE4
#endif
arm_func_end TrySealMove
arm_func_start BoostOrLowerSpeed
BoostOrLowerSpeed: ; 0x02314C2C
stmdb sp!, {r3, r4, r5, lr}
mov r4, r1
mov r5, r0
mov r0, r4
bl EntityIsValid__023118B4
cmp r0, #0
moveq r0, #0
ldmeqia sp!, {r3, r4, r5, pc}
mov r0, #0x32
bl DungeonRandOutcome__022EAB20
cmp r0, #0
mov r2, #1
mov r0, r5
beq _02314C74
mov r1, r4
mov r3, r2
bl LowerSpeed
b _02314C84
_02314C74:
mov r1, r4
mov r3, #0
str r2, [sp]
bl BoostSpeed
_02314C84:
mov r0, #1
ldmia sp!, {r3, r4, r5, pc}
arm_func_end BoostOrLowerSpeed
arm_func_start ResetHitChanceStat
ResetHitChanceStat: ; 0x02314C8C
stmdb sp!, {r4, r5, r6, r7, r8, lr}
mov r5, r1
mov r6, r0
mov r0, r5
mov r8, r2
mov r4, r3
mov r7, #0
bl EntityIsValid__023118B4
cmp r0, #0
ldmeqia sp!, {r4, r5, r6, r7, r8, pc}
ldr r0, [r5, #0xb4]
add r1, r0, r8, lsl #1
ldrsh r0, [r1, #0x2c]
cmp r0, #0xa
movne r0, #0xa
movne r7, #1
strneh r0, [r1, #0x2c]
cmp r7, #0
beq _02314CE4
mov r0, r5
bl ov29_022E543C
b _02314CF4
_02314CE4:
cmp r4, #0
beq _02314CF4
mov r0, r5
bl ov29_022E543C
_02314CF4:
mov r0, #0
mov r1, r5
mov r2, r0
bl SubstitutePlaceholderStringTags
cmp r7, #0
beq _02314D20
mov r0, r6
mov r1, r5
#ifdef JAPAN
mov r2, #0xaa0
#else
mov r2, #0xd60
#endif
bl LogMessageByIdWithPopupCheckUserTarget
b _02314D30
_02314D20:
ldr r2, _02314D3C ; =0x00000D61
mov r0, r6
mov r1, r5
bl LogMessageByIdWithPopupCheckUserTarget
_02314D30:
mov r0, r5
bl UpdateStatusIconFlags
ldmia sp!, {r4, r5, r6, r7, r8, pc}
.align 2, 0
#ifdef JAPAN
_02314D3C: .word 0x00000AA1
#else
_02314D3C: .word 0x00000D61
#endif
arm_func_end ResetHitChanceStat
arm_func_start ExclusiveItemEffectIsActiveWithLogging
ExclusiveItemEffectIsActiveWithLogging: ; 0x02314D40
stmdb sp!, {r3, r4, r5, r6, r7, lr}
sub sp, sp, #8
mov r6, r1
ldrb r1, [sp, #0x20]
mov r7, r0
mov r0, r6
mov r5, r2
mov r4, r3
bl ExclusiveItemEffectIsActive__023147EC
cmp r0, #0
beq _02314DB8
cmp r5, #0
beq _02314DB0
mov r0, #0
mov r1, r6
mov r2, r0
bl SubstitutePlaceholderStringTags
ldrb r1, [sp, #0x20]
add r2, sp, #0
mov r0, r6
bl GetExclusiveItemWithEffectFromBag
add r1, sp, #0
mov r0, #1
bl PrepareItemForPrinting__02345728
mov r0, r7
mov r1, r6
mov r2, r4
bl LogMessageByIdWithPopupCheckUserTarget
_02314DB0:
mov r0, #1
b _02314DBC
_02314DB8:
mov r0, #0
_02314DBC:
add sp, sp, #8
ldmia sp!, {r3, r4, r5, r6, r7, pc}
arm_func_end ExclusiveItemEffectIsActiveWithLogging
arm_func_start LogMessageWithTargetAndExclusiveItemName
LogMessageWithTargetAndExclusiveItemName: ; 0x02314DC4
stmdb sp!, {r3, r4, r5, r6, r7, lr}
sub sp, sp, #8
mov r7, r0
mov r0, #0
mov r5, r2
mov r2, r0
mov r6, r1
mov r4, r3
bl SubstitutePlaceholderStringTags
add r2, sp, #0
mov r0, r6
mov r1, r4
bl GetExclusiveItemWithEffectFromBag
add r1, sp, #0
mov r0, #1
bl PrepareItemForPrinting__02345728
mov r0, r7
mov r1, r6
mov r2, r5
bl LogMessageByIdWithPopupCheckUserTarget
add sp, sp, #8
ldmia sp!, {r3, r4, r5, r6, r7, pc}
arm_func_end LogMessageWithTargetAndExclusiveItemName
arm_func_start TryActivateQuickFeet
TryActivateQuickFeet: ; 0x02314E1C
stmdb sp!, {r3, r4, r5, lr}
mov r4, r1
mov r5, r0
mov r0, r4
mov r1, #0x6d
bl AbilityIsActiveVeneer
cmp r0, #0
moveq r0, #0
ldmeqia sp!, {r3, r4, r5, pc}
mov r3, #0
mov r0, r5
mov r1, r4
mov r2, #1
str r3, [sp]
bl BoostSpeed
mov r0, #1
ldmia sp!, {r3, r4, r5, pc}
arm_func_end TryActivateQuickFeet
arm_func_start TryInflictTerrifiedStatus
TryInflictTerrifiedStatus: ; 0x02314E60
stmdb sp!, {r3, r4, r5, lr}
ldr r2, _02314EB0 ; =ov10_022C4618
mov r4, r1
ldr ip, [r4, #0xb4]
mov r3, #1
mov r5, r0
ldrsh r1, [r2]
#ifdef JAPAN
strb r3, [ip, #0x103]
mov r0, r4
strb r1, [ip, #0x104]
#else
strb r3, [ip, #0x104]
mov r0, r4
strb r1, [ip, #0x105]
#endif
bl ov29_022E60E4
mov r0, #0
mov r1, r4
mov r2, r0
bl SubstitutePlaceholderStringTags
ldr r2, _02314EB4 ; =0x00000DE5
mov r0, r5
mov r1, r4
bl LogMessageByIdWithPopupCheckUserTarget
ldmia sp!, {r3, r4, r5, pc}
.align 2, 0
_02314EB0: .word ov10_022C4618
#ifdef JAPAN
_02314EB4: .word 0x00000B25
#else
_02314EB4: .word 0x00000DE5
#endif
arm_func_end TryInflictTerrifiedStatus
arm_func_start TryInflictGrudgeStatus
TryInflictGrudgeStatus: ; 0x02314EB8
stmdb sp!, {r4, r5, r6, r7, r8, lr}
mov r7, r1
ldr r5, [r7, #0xb4]
mov r8, r0
mov r4, #0
mov r6, r2
mov r2, r4
mov r0, #1
bl SubstitutePlaceholderStringTags
ldrb r0, [r5, #0xfd]
cmp r0, #0
beq _02314F04
cmp r6, #0
beq _02314F2C
ldr r2, _02314F34 ; =0x00000ED1
mov r0, r8
mov r1, r7
bl LogMessageByIdWithPopupCheckUserTarget
b _02314F2C
_02314F04:
mov r4, #1
mov r0, r7
strb r4, [r5, #0xfd]
bl UpdateStatusIconFlags
cmp r6, #0
beq _02314F2C
#ifdef JAPAN
ldr r2, _0231640C ; =0x00000C12
mov r0, r8
mov r1, r7
#else
mov r0, r8
mov r1, r7
mov r2, #0xed0
#endif
bl LogMessageByIdWithPopupCheckUserTarget
_02314F2C:
mov r0, r4
ldmia sp!, {r4, r5, r6, r7, r8, pc}
.align 2, 0
#ifdef JAPAN
_02314F34: .word 0x00000C13
_0231640C: .word 0x00000C12
#else
_02314F34: .word 0x00000ED1
#endif
arm_func_end TryInflictGrudgeStatus
arm_func_start TryInflictConfusedStatus
TryInflictConfusedStatus: ; 0x02314F38
stmdb sp!, {r3, r4, r5, r6, r7, lr}
mov r6, r1
mov r7, r0
mov r0, r6
mov r5, r2
mov r4, r3
bl EntityIsValid__02315118
cmp r0, #0
moveq r0, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, pc}
mov r0, r7
mov r1, r6
mov r2, r5
bl SafeguardIsActive
cmp r0, #0
movne r0, #0
ldmneia sp!, {r3, r4, r5, r6, r7, pc}
mov r0, r7
mov r1, r6
mov r2, r5
bl IsProtectedFromNegativeStatus
cmp r0, #0
mov r0, #0
ldmneia sp!, {r3, r4, r5, r6, r7, pc}
mov r1, r6
mov r2, r0
bl SubstitutePlaceholderStringTags
mov r0, r6
mov r1, #0x19
bl ItemIsActive__0231513C
cmp r0, #0
beq _02314FD8
cmp r5, #0
beq _02314FD0
ldr r2, _02315100 ; =0x00000DAF
mov r0, r7
mov r1, r6
bl LogMessageByIdWithPopupCheckUserTarget
_02314FD0:
mov r0, #0
ldmia sp!, {r3, r4, r5, r6, r7, pc}
_02314FD8:
mov ip, #2
ldr r3, _02315104 ; =0x00000DBA
mov r0, r7
mov r1, r6
mov r2, r5
str ip, [sp]
bl ExclusiveItemEffectIsActiveWithLogging
cmp r0, #0
movne r0, #0
ldmneia sp!, {r3, r4, r5, r6, r7, pc}
cmp r7, r6
beq _02315048
cmp r7, #0
moveq r0, #0
beq _02315028
ldr r0, [r7]
cmp r0, #1
moveq r0, #1
movne r0, #0
and r0, r0, #0xff
_02315028:
cmp r0, #0
beq _02315048
mov r0, r7
mov r1, #0x53
bl AbilityIsActiveVeneer
cmp r0, #0
movne r0, #0
bne _02315054
_02315048:
mov r0, r6
mov r1, #0x40
bl AbilityIsActiveVeneer
_02315054:
cmp r0, #0
beq _0231507C
cmp r5, #0
beq _02315074
ldr r2, _02315108 ; =0x00000DA7
mov r0, r7
mov r1, r6
bl LogMessageByIdWithPopupCheckUserTarget
_02315074:
mov r0, #0
ldmia sp!, {r3, r4, r5, r6, r7, pc}
_0231507C:
cmp r4, #0
movne r0, #1
ldmneia sp!, {r3, r4, r5, r6, r7, pc}
mov r0, r6
bl ov29_022E41CC
ldr r4, [r6, #0xb4]
ldrb r0, [r4, #0xd0]
cmp r0, #2
beq _023150E0
ldr r1, _0231510C ; =CONFUSED_TURN_RANGE
mov r3, #2
mov r0, r6
mov r2, #1
strb r3, [r4, #0xd0]
bl CalcStatusDuration
add r3, r0, #1
ldr r2, _02315110 ; =0x00000CFE
mov r0, r7
mov r1, r6
strb r3, [r4, #0xd1]
bl LogMessageByIdWithPopupCheckUserTarget
mov r0, r7
mov r1, r6
bl TryActivateQuickFeet
b _023150F0
_023150E0:
ldr r2, _02315114 ; =0x00000CFF
mov r0, r7
mov r1, r6
bl LogMessageByIdWithPopupCheckUserTarget
_023150F0:
mov r0, r6
bl UpdateStatusIconFlags
mov r0, #1
ldmia sp!, {r3, r4, r5, r6, r7, pc}
.align 2, 0
#ifdef JAPAN
#define TRY_INFLICT_CONFUSED_STATUS_OFFSET -0x2C0
#else
#define TRY_INFLICT_CONFUSED_STATUS_OFFSET 0
#endif
_02315100: .word 0x00000DAF + TRY_INFLICT_CONFUSED_STATUS_OFFSET
_02315104: .word 0x00000DBA + TRY_INFLICT_CONFUSED_STATUS_OFFSET
_02315108: .word 0x00000DA7 + TRY_INFLICT_CONFUSED_STATUS_OFFSET
_0231510C: .word CONFUSED_TURN_RANGE
_02315110: .word 0x00000CFE + TRY_INFLICT_CONFUSED_STATUS_OFFSET
_02315114: .word 0x00000CFF + TRY_INFLICT_CONFUSED_STATUS_OFFSET
arm_func_end TryInflictConfusedStatus

View File

@@ -5,7 +5,8 @@
#include "main_02028080.h"
struct unk_0202AAA8 {
u8 field_0x0[8];
u32 field_0x0;
u8 field_0x4[4];
u8 field_0x8;
u8 field_0x9[0x17];
u16 field_0x20;
@@ -13,16 +14,19 @@ struct unk_0202AAA8 {
s32 field_0xA0;
u8 field_0xA4[0x54];
u32 field_0xF8;
u8 field_0xFC[8];
u32 field_0xFC;
s32 field_0x100;
u32 field_0x104;
u8 field_0x108[0x90];
u8 field_0x108[0x58];
u8 *field_0x160;
u8 field_0x164[0x34];
void *field_0x198;
s32 field_0x19C;
u8 field_0x1A0;
u8 field_0x1A1;
u8 field_0x1A2[2];
s32 field_0x1A4;
u8 field_0x1A8[4];
s32 field_0x1A8;
s32 field_0x1AC;
s32 field_0x1B0;
u8 field_0x1B4[8];

View File

@@ -2,9 +2,15 @@
#define PMDSKY_MAIN_0202AB40_H
#include "util.h"
#include "window.h"
u32 IsParentMenuActive(s32 window_id);
bool8 CheckParentMenuField0x1A0(s32 window_id);
s32 GetWindowIdSelectedItemOnPage(s32 window_id);
void sub_0202AB94(s32 window_id, s32 a);
s32 GetSimpleMenuResult__0202AEA4(s32 window_id);
void UpdateParentMenu(struct Window *w);
void sub_0202AF78(struct Window *w);
void sub_0202B030(s32 window_id);
#endif

View File

@@ -2,7 +2,14 @@
#define PMDSKY_MAIN_0202B4C4_H
#include "util.h"
#include "window.h"
#include "main_0202A66C.h"
void sub_0202B0A4(s32 window_id, s32 a);
s32 CreateSimpleMenuFromStringIds(WindowTemplate *params, u32 flags, struct struct_2 *cfg, struct unk_0202A5CC *items, s32 n);
s32 CreateSimpleMenu(WindowTemplate *params, u32 flags, struct struct_2 *cfg, struct unk_0202A75C *items, s32 n);
s32 CreateSimpleMenuInternal(WindowTemplate *params, u32 flags, struct struct_2 *cfg, struct unk_0202A75C *items, s32 n);
void ResumeSimpleMenu(s32 window_id);
void CloseSimpleMenu(s32 window_id);
u32 IsSimpleMenuActive(s32 window_id);
bool8 CheckSimpleMenuField0x1A0(s32 window_id);

View File

@@ -39,5 +39,13 @@ bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusiv
void BoostSpeed(struct entity *user, struct entity *target, s32 n_stages, s32 turns, bool8 log_failure);
void BoostSpeedOneStage(struct entity *user, struct entity *target, s32 turns, bool8 log_failure);
void LowerSpeed(struct entity *user, struct entity *target, s32 n_stages, bool8 log_failure);
bool8 TrySealMove(struct entity *user, struct entity *target, bool8 check_only);
bool8 BoostOrLowerSpeed(struct entity *user, struct entity *target);
void ResetHitChanceStat(struct entity *user, struct entity *target, s32 stat_idx, s32 play_effect_anyway);
bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id);
void LogMessageWithTargetAndExclusiveItemName(struct entity *user, struct entity *target, s32 message_id, enum exclusive_item_effect_id effect_id);
bool8 TryActivateQuickFeet(struct entity *user, struct entity *target);
void TryInflictTerrifiedStatus(struct entity *user, struct entity *target);
bool8 TryInflictGrudgeStatus(struct entity *user, struct entity *target, bool8 log_message);
#endif //PMDSKY_MOVE_ORB_EFFECTS_H

View File

@@ -1,10 +1,60 @@
#ifndef PMDSKY_OVERLAY_29_022E869C_H
#define PMDSKY_OVERLAY_29_022E869C_H
#include "dungeon.h"
#include "dungeon_mode.h"
#include "item.h"
#include "move.h"
struct unk_02353554 {
u8 field_0x0;
u8 field_0x1[3];
s32 field_0x4;
s16 field_0x8;
u8 field_0xa[0x1a];
u8 field_0x24;
u8 field_0x25[4];
u8 field_0x29;
u8 field_0x2a;
u8 field_0x2b;
u8 field_0x2c;
u8 field_0x2d[0x53];
u8 field_0x80[0x38];
u8 field_0xb8[0x170];
u8 field_0x228;
u8 field_0x229;
u8 field_0x22a[6];
};
struct unk_022E8054 {
u8 field_0x0[0x10];
u8 field_0x10;
};
void FreeTopScreenStatus(void);
void ov29_022E7F7C(void);
bool8 ov29_022E7F94(void);
bool8 ov29_022E8018(void);
void ov29_022E8054(struct unk_022E8054 *a);
bool8 ov29_022E80D0(void);
void ov29_022E8104(void);
bool8 InitializeTeamStats(void);
bool8 UpdateTeamStatsWrapper(void);
void ov29_022E81C8(struct unk_022E8054 *a);
bool8 FreeTeamStatsWrapper(void);
void ov29_022E81F8(void);
void ov29_022E8244(void);
void DisplayTeamStatsSprite(struct entity *entity, s16 a, s16 b);
bool8 ov29_022E840C(void);
void ov29_022E847C(struct unk_022E8054 *a);
bool8 ov29_022E84B0(void);
bool8 InitDungeonControlsMenuWithBg(void);
void ov29_022E854C(struct unk_022E8054 *a);
bool8 FreeDungeonControlsMenuWithBg(void);
bool8 ov29_022E85A8(void);
void ov29_022E85F4(struct unk_022E8054 *a);
bool8 ov29_022E8630(void);
bool8 ov29_022E8650(void);
bool8 ov29_022E869C(void);
#endif

View File

@@ -5,5 +5,9 @@
// Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity).
bool8 EntityIsValid__0230558C(struct entity *entity);
void ov29_023055B0(s32 a);
void CheckNonLeaderTile(struct entity *entity);
void ov29_02305814(struct entity *entity, bool8 a);
s32 EndNegativeStatusCondition(struct entity *user, struct entity *target, bool8 a, bool8 b, bool8 c);
#endif //PMDSKY_OVERLAY_29_0230558C_H

View File

@@ -3,6 +3,7 @@
#include "dungeon_mode.h"
bool8 TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 log_failure, bool8 check_only);
// Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity).
bool8 EntityIsValid__02315118(struct entity *entity);
// Checks if a monster is holding a certain item that isn't disabled by Klutz.

View File

@@ -34,13 +34,6 @@ void EntryOverlay31(void);
void DrawDungeonMenuStatusWindow(s32 window_id);
void DungeonMenuSwitch(s32 window_id);
struct struct_2 {
u32 b; // 0x0
u8 PAD1[92];
u8* c; // 0x60
u8 PAD2[50];
};
struct struct_3 {
s8 e[4]; // 0x0
u32 f; // 0x4

View File

@@ -6,5 +6,6 @@
s32 GetMonsterIdToSpawn(s32 weight_type_idx);
s32 GetMonsterLevelToSpawn(s32 monster_id);
s32 IsOnMonsterSpawnList(s32 monster_id);
void AllocTopScreenStatus(void);
#endif //PMDSKY_SPAWN_2_H

View File

@@ -4,6 +4,13 @@
#include "enums.h"
#include "util.h"
struct struct_2 {
u32 b; // 0x0
u8 PAD1[92];
u8* c; // 0x60
u8 PAD2[50];
};
// Represents the state of a portrait to be displayed inside a window
typedef struct {
enum monster_id monster_id; // 0x0: The species id, or the set index inside kaomado.kao

View File

@@ -164,7 +164,6 @@ Static main
Object asm/main_0202A690.o
Object src/main_0202AAA8.o
Object src/main_0202AB40.o
Object asm/main_0202AB94.o
Object src/main_0202B4C4.o
Object src/main_0202B558.o
Object asm/main_0202B5C8.o
@@ -824,7 +823,6 @@ Overlay OVY_29
Object src/random_trap.o
Object src/spawn_1.o
Object src/spawn_2.o
Object asm/overlay_29_022E7EC4.o
Object src/overlay_29_022E869C.o
Object asm/overlay_29_022E86A4.o
Object src/position_util.o
@@ -957,7 +955,6 @@ Overlay OVY_29
Object src/overlay_29_023047B8.o
Object asm/overlay_29_023047DC.o
Object src/overlay_29_0230558C.o
Object asm/overlay_29_023055B0.o
Object src/overlay_29_02305C04.o
Object asm/overlay_29_02305C3C.o
Object src/overlay_29_023061A8.o
@@ -996,7 +993,6 @@ Overlay OVY_29
Object src/overlay_29_02311BF8.o
Object asm/overlay_29_02311C28.o
Object src/move_orb_effects.o
Object asm/overlay_29_02314810.o
Object src/overlay_29_02315118.o
Object asm/overlay_29_0231516C.o
Object src/dungeon_statuses.o

View File

@@ -1,6 +1,28 @@
#include "main_0202AB40.h"
#include "main_0202A66C.h"
#include "main_0202AAA8.h"
#include "main_02027AF0.h"
#include "main_020282F4.h"
#include "main_0203258C.h"
#include "main_020327CC.h"
#include "main_02032558.h"
#include "window.h"
extern void sub_02032684(struct unk_02032558 *p, s32 a);
extern void sub_02031C74(struct unk_02032558 *p, u32 mask);
extern void sub_02031C84(struct unk_02032558 *p, u32 mask);
extern s32 sub_02031C98(struct unk_02032558 *p, u32 *buttons, s32 *state, s32 a);
extern s32 sub_02032160(struct unk_02032558 *p, s32 *state, s32 a, s32 b, s32 c, s32 d);
extern s32 sub_02033758(struct unk_02032558 *p, u32 *buttons, s32 *state);
extern s32 sub_020323F8(struct unk_02032558 *p, u32 buttons, s32 idx, s32 a);
extern bool8 IsMenuOptionActive(struct unk_02032558 *p);
extern s32 sub_02032070(struct unk_02032558 *p);
extern s32 sub_0203250C(struct unk_02032558 *p, u32 buttons);
extern void PlayWindowInputSound(struct unk_02032558 *p, s32 sound);
extern void sub_02028948(s32 window_id, struct unk_02032558 *p);
extern void sub_020263C8(s32 window_id, s32 a, s32 y, u8 *str, u8 colour);
extern s32 sub_020265A8(u8 *str);
extern void sub_0202A03C(struct unk_02032558 *p, s32 window_id);
u32 IsParentMenuActive(s32 window_id)
{
@@ -21,3 +43,215 @@ s32 GetWindowIdSelectedItemOnPage(s32 window_id)
{
return GetSelectedItemOnPage(GetWindowContents(window_id) + 4);
}
void sub_0202AB94(s32 window_id, s32 a)
{
sub_02032684(GetWindowContents(window_id) + 4, a);
}
s32 GetSimpleMenuResult__0202AEA4(s32 window_id)
{
struct unk_0202AAA8 *menu = GetWindowContents(window_id);
struct unk_0202A75C *items = menu->field_0x198;
s32 idx;
if (menu->field_0x1A0 != 0) {
if (menu->field_0x1A1 != 0) {
idx = GetTotalNumMenuItems((void *)menu + 4);
} else {
idx = GetSelectedMenuItemIdx((void *)menu + 4);
}
return items[idx].field_0x100;
}
return 0;
}
void UpdateParentMenu(struct Window *w)
{
struct unk_0202AAA8 *menu;
u32 buttons;
s32 state[9];
s32 changed;
s32 r;
menu = (struct unk_0202AAA8 *)w->template.unk0C;
switch (menu->field_0x19C) {
case 0:
if (!sub_0202810C(w->id)) {
break;
}
menu->field_0x1AC = menu->field_0x1A8;
menu->field_0x19C = 2;
case 1:
if (menu->field_0x19C == 1) {
menu->field_0x1AC = menu->field_0x1A8;
menu->field_0x19C = 2;
break;
}
case 2:
if (menu->field_0x1A8 > 0) {
if (menu->field_0x1AC > 0) {
menu->field_0x1AC--;
}
if (menu->field_0x1AC > 0) {
sub_02031C74((void *)menu + 4, 0x4000000);
menu->field_0x1A0 = 0;
menu->field_0x1A1 = 0;
menu->field_0x1A4 = 0;
w->unkB8 = -1;
sub_0202AF78(w);
break;
}
sub_02031C84((void *)menu + 4, 0x4000000);
}
menu->field_0x19C = 3;
case 3:
sub_0202AF78(w);
if (menu->field_0xFC & 0x800000) {
menu->field_0x19C = 9;
menu->field_0x1A0 = 1;
menu->field_0x1A1 = 0;
menu->field_0x1A4 = 0;
w->unkB8 = -4;
break;
}
menu->field_0x19C = 4;
menu->field_0x1A0 = 0;
menu->field_0x1A1 = 0;
menu->field_0x1A4 = 0;
w->unkB8 = -1;
break;
case 4:
changed = sub_02031C98((void *)menu + 4, &buttons, state, 1);
if (buttons == 0 && (menu->field_0xFC & 1)) {
r = sub_02032160((void *)menu + 4, state, 0x408, 0, 0, 1);
if (r >= 0) {
sub_02032684((void *)menu + 4, r);
changed = 1;
buttons |= 1;
}
}
if (buttons == 0) {
changed |= sub_02033758((void *)menu + 4, &buttons, state);
}
if ((changed | sub_020323F8((void *)menu + 4, buttons,
GetSelectedMenuItemIdx((void *)menu + 4),
0)) != 0) {
sub_0202AF78(w);
}
if (buttons & 1) {
if (IsMenuOptionActive((void *)menu + 4)) {
if (!(menu->field_0xFC & 0x80000000)) {
PlayWindowInputSound((void *)menu + 4, 0);
}
menu->field_0x1A0 = 1;
menu->field_0x1A1 = 0;
menu->field_0x1A4 = buttons;
w->unkB8 = -4;
menu->field_0x19C = 5;
} else {
PlayWindowInputSound((void *)menu + 4, 2);
}
} else if (buttons & 2) {
PlayWindowInputSound((void *)menu + 4, 1);
menu->field_0x1A0 = 1;
menu->field_0x1A1 = 1;
menu->field_0x1A4 = buttons;
w->unkB8 = -5;
menu->field_0x19C = 5;
} else if (sub_0203250C((void *)menu + 4, buttons)) {
menu->field_0x1A0 = 1;
menu->field_0x1A1 = 0;
menu->field_0x1A4 = buttons;
w->unkB8 = -4;
menu->field_0x19C = 5;
}
sub_02028948(w->id, (void *)menu + 4);
break;
case 5:
if (sub_02032070((void *)menu + 4)) {
break;
}
case 6:
if (menu->field_0x1A1 == 0) {
if (menu->field_0xFC & 0x400000) {
sub_0202AF78(w);
menu->field_0x19C = 9;
break;
}
} else if (*(u8 *)&menu->field_0x1B0 != 0) {
menu->field_0x19C = 9;
break;
}
menu->field_0x19C = 7;
case 7:
if (!sub_0202812C(w->id)) {
break;
}
if (menu->field_0x1A1 != 0) {
w->unkB8 = -5;
} else {
w->unkB8 = -4;
}
menu->field_0x19C = 8;
break;
}
}
void sub_0202AF78(struct Window *w)
{
struct unk_0202AAA8 *menu;
struct unk_0202A75C *item;
s32 i;
u8 *p;
s32 highlight;
s32 colour;
menu = (struct unk_0202AAA8 *)w->template.unk0C;
item = menu->field_0x198;
if (menu->field_0xFC & 0x200) {
p = menu->field_0x160;
} else {
p = NULL;
}
i = 0;
sub_02027B1C(w->id);
while (!IsEmptyString(item->field_0x0)) {
highlight = 0;
if (p != NULL) {
if (*p & 2) {
highlight = 1;
}
p++;
}
if (highlight) {
colour = 0x42;
} else {
colour = 0x44;
}
sub_020263C8(w->id, 13, GetPageItemYOffset((void *)menu + 4, i),
item->field_0x0, colour);
i++;
item++;
}
sub_0202A03C((void *)menu + 4, w->id);
UpdateWindow(w->id);
}
void sub_0202B030(s32 window_id)
{
struct unk_0202AAA8 *menu = GetWindowContents(window_id);
if (IsMenuOptionActive((void *)menu + 4)) {
if (!(menu->field_0xFC & 0x80000000)) {
PlayWindowInputSound((void *)menu + 4, 0);
}
menu->field_0x1A0 = 1;
menu->field_0x1A1 = 0;
menu->field_0x1A4 = 1;
sub_0202830C(window_id, -4);
menu->field_0x19C = 6;
} else {
PlayWindowInputSound((void *)menu + 4, 2);
}
}

View File

@@ -1,13 +1,197 @@
#include "main_0202B4C4.h"
#include "main_02032558.h"
extern s32 GetCurrentPage(struct unk_02032558 *p);
extern void *GetWindowContents(s32 window_id);
extern s32 GetSelectedItemOnPage(struct unk_02032558 *p);
#include "main_0202A66C.h"
#include "main_0202AAA8.h"
#include "main_02001188.h"
#include "main_02027648.h"
#include "main_02028284.h"
#include "main_020282F4.h"
#include "main_02032558.h"
#include "window.h"
extern s32 GetCurrentPage(struct unk_02032558 *p);
extern void *GetWindowContents(s32 window_id);
extern s32 GetSelectedItemOnPage(struct unk_02032558 *p);
extern WindowTemplate SIMPLE_MENU_DEFAULT_WINDOW_PARAMS;
extern void UpdateSimpleMenu(struct Window *w);
extern void sub_02031C74(struct unk_02032558 *p, u32 mask);
extern void sub_02031C84(struct unk_02032558 *p, u32 mask);
extern bool8 IsMenuOptionActive(struct unk_02032558 *p);
extern void PlayWindowInputSound(struct unk_02032558 *p, s32 sound);
extern void sub_02032984(struct unk_02032558 *p);
extern s32 sub_020265A8(u8 *str);
extern u8 sub_02031A5C(u32 flags, struct struct_2 *cfg, s32 width);
extern u8 CalcMenuHeightDiv8__02031AA4(u32 flags, struct struct_2 *cfg, s32 *count, s32 *n);
extern void InitWindowInput(struct unk_02032558 *p, u32 flags, struct struct_2 *cfg,
struct unk_02028284 *rect, s32 count, s32 n);
extern s32 PreprocessStringFromId(u8 *output, s32 output_size, s32 string_id,
s32 flags, void *args);
void sub_0202B0A4(s32 window_id, s32 a)
{
struct unk_0202AAA8 *menu = GetWindowContents(window_id);
if (a != 0) {
sub_02031C74((void *)menu + 4, 0xB000000);
sub_02031C84((void *)menu + 4, 0x10);
} else {
sub_02031C84((void *)menu + 4, 0xB000000);
sub_02031C74((void *)menu + 4, 0x10);
}
}
s32 CreateSimpleMenuFromStringIds(WindowTemplate *params, u32 flags,
struct struct_2 *cfg,
struct unk_0202A5CC *items, s32 n)
{
struct unk_0202A5CC *p;
struct unk_0202A75C *buf;
struct unk_0202A75C *q;
s32 count;
p = items;
count = 0;
while (p->field_0x0 != 0) {
p++;
count++;
}
buf = MemAlloc((count + 1) * sizeof(struct unk_0202A75C), 8);
q = buf;
while (items->field_0x0 != 0) {
PreprocessStringFromId(q->field_0x0, 0x100, items->field_0x0, 0xC402,
NULL);
q->field_0x100 = items->field_0x4;
items++;
q++;
}
q->field_0x0[0] = 0;
q->field_0x100 = items->field_0x4;
return CreateSimpleMenuInternal(params, flags, cfg, buf, n);
}
s32 CreateSimpleMenu(WindowTemplate *params, u32 flags, struct struct_2 *cfg,
struct unk_0202A75C *items, s32 n)
{
struct unk_0202A75C *p;
struct unk_0202A75C *buf;
struct unk_0202A75C *q;
s32 count;
p = items;
count = 0;
while (!IsEmptyString(p->field_0x0)) {
p++;
count++;
}
buf = MemAlloc((count + 1) * sizeof(struct unk_0202A75C), 8);
q = buf;
while (!IsEmptyString(items->field_0x0)) {
*q++ = *items++;
}
*q = *items;
return CreateSimpleMenuInternal(params, flags, cfg, buf, n);
}
s32 CreateSimpleMenuInternal(WindowTemplate *params, u32 flags,
struct struct_2 *cfg, struct unk_0202A75C *items,
s32 n)
{
WindowTemplate tmpl;
struct unk_02028284 rect;
s32 count;
struct unk_0202AAA8 *menu;
struct unk_0202A75C *p;
s32 target;
s32 sel;
s32 width;
s32 item_width;
s32 window_id;
menu = MemAlloc(0x1B4, 8);
if (flags & 0x20) {
target = cfg->b;
} else {
target = 0;
}
sel = 0;
count = 0;
p = items;
flags |= 0x8000;
if (params == NULL) {
tmpl = SIMPLE_MENU_DEFAULT_WINDOW_PARAMS;
flags |= 0x300000;
} else {
tmpl = *params;
tmpl.unk00 = (u32)UpdateSimpleMenu;
}
tmpl.unk0C = (u32)menu;
if (tmpl.width == 0) {
width = 0;
while (!IsEmptyString(p->field_0x0)) {
item_width = sub_020265A8(p->field_0x0);
if (item_width > width) {
width = item_width;
}
p++;
}
tmpl.width = sub_02031A5C(flags, cfg, width + 0x10);
}
p = items;
while (!IsEmptyString(p->field_0x0)) {
if (p->field_0x100 == target) {
sel = count;
}
p++;
count++;
}
if (n <= 0) {
n = count;
}
if (tmpl.height == 0) {
tmpl.height = CalcMenuHeightDiv8__02031AA4(flags, cfg, &count, &n);
} else {
CalcMenuHeightDiv8__02031AA4(flags, cfg, &count, &n);
}
if (flags & 0x200000) {
tmpl.x -= tmpl.width;
}
if (flags & 0x100000) {
tmpl.y -= tmpl.height;
}
menu->field_0x0 = (u32)UpdateSimpleMenu;
menu->field_0xFC = flags;
if (cfg != NULL) {
*(struct struct_2 *)&menu->field_0x100 = *cfg;
}
menu->field_0x100 = sel;
menu->field_0x198 = items;
menu->field_0x19C = 0;
menu->field_0x1A0 = 0;
menu->field_0x1A1 = 0;
menu->field_0x1A4 = 0;
menu->field_0x1AC = 0;
menu->field_0x1B0 = 0;
tmpl.bg_id = 0;
window_id = NewWindowScreenCheck((s32)&tmpl, 3);
GetWindowRectangle(window_id, &rect);
InitWindowInput((void *)menu + 4, flags,
(struct struct_2 *)&menu->field_0x100, &rect, count, n);
return window_id;
}
void ResumeSimpleMenu(s32 window_id)
{
struct unk_0202AAA8 *menu = GetWindowContents(window_id);
menu->field_0x19C = 1;
menu->field_0x1A0 = 0;
menu->field_0x1A1 = 0;
menu->field_0xFC &= ~0x800000;
sub_02032984((void *)menu + 4);
}
void CloseSimpleMenu(s32 window_id)
{

View File

@@ -69,10 +69,8 @@ struct unk_020AFE74 {
extern struct unk_020AFE74 *MISSION_REWARD_STRUCT_MAIN_PTR;
extern void MaybeGetColoredFormattedItemName(void*, struct item*, void*);
extern s8 CreateSimpleMenuFromStringIds(void*, s32, s32, void*, s32);
extern void GetNameWithGender(char *dst, s16 monster_id, char color_id);
extern void GetNameRaw(unsigned char *, s32);
extern s32 GetSimpleMenuResult__0202AEA4(s8);
extern void InitPreprocessorArgs(struct preprocessor_args* args);
extern bool8 IsMonsterIllegalForMissions(enum monster_id);
extern void sub_02046BE8(s32 a, s32 b, struct preprocessor_args *c);
@@ -108,8 +106,8 @@ extern void ov11_02310BDC(void);
extern const u8 _0209C844[2];
extern const u16 _0209C846[4];
extern s32 _0209C850;
extern s32 _0209C85C;
extern s32 _0209C86C;
extern WindowTemplate _0209C85C;
extern struct unk_0202A5CC _0209C86C[];
extern s32 _0209C884;
#ifdef JAPAN
@@ -336,7 +334,7 @@ s32 sub_0203D538(void)
break;
case 16:
if (sub_02046C78() != 0) {
MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0 = CreateSimpleMenuFromStringIds(&_0209C85C, 0x300011, 0, &_0209C86C, 2);
MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0 = CreateSimpleMenuFromStringIds(&_0209C85C, 0x300011, 0, _0209C86C, 2);
MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x11;
}
break;

View File

@@ -14,6 +14,7 @@
#include "overlay_29_022E3F20.h"
#include "overlay_29_0234B340.h"
#include "dungeon_logic_2.h"
#include "dg_random.h"
extern u8* AllocateTemp1024ByteBufferFromPool(void);
extern void CopyStringFromId(u8* buf, u32 string_id);
@@ -37,23 +38,30 @@ extern void PlaySpeedDownEffect(struct entity *entity);
extern fx32_8 MultiplyByFixedPoint(fx32_8 x, fx32_8 mult_fp);
extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 log_message);
extern void TryActivateSteadfast(struct entity *attacker, struct entity *defender);
extern void TryActivateQuickFeet(struct entity *attacker ,struct entity *defender);
extern s32 CalcStatusDuration(struct entity *entity, const s16 *turn_range, bool8 iq_skill_effects);
extern struct preprocessor_args* GetMessageLogPreprocessorArgs(void);
extern void SetPreprocessorArgsStringToName(struct preprocessor_args* preprocessor_args, s32 pos, struct monster* monster, u32 param_4, u8 name_type);
extern int CalcSpeedStageWrapper(struct entity* entity);
extern int CalcSpeedStage(struct entity *entity, s32 counter_weight);
extern void SetPreprocessorArgsIdVal(s32 pos, u32 val);
extern void ov29_022E543C(struct entity *entity);
extern void ov29_022E60E4(struct entity *entity);
extern const s16 CRINGE_TURN_RANGE[];
extern const s16 PARALYSIS_TURN_RANGE[];
extern const s16 SPEED_LOWER_TURN_RANGE[];
extern const s16 SPEED_BOOST_TURN_RANGE[];
extern const u16 ov29_02353318[];
extern const s16 ov10_022C4618;
#ifdef JAPAN
#define JPN_MSG_OFFSET -0x2C0
#define MESSAGE_ED0 0xC12
#define MESSAGE_ED1 0xC13
#else
#define JPN_MSG_OFFSET 0
#define MESSAGE_ED0 0xED0
#define MESSAGE_ED1 0xED1
#endif // JAPAN
void LowerOffensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 n_stages, bool8 check_is_protected_from_stat_drops, bool8 log_message_if_protected_from_stat_drops)
@@ -793,4 +801,169 @@ void LowerSpeed(struct entity *user, struct entity *target, s32 n_stages, bool8
UpdateStatusIconFlags(target);
}
bool8 TrySealMove(struct entity *user, struct entity *target, bool8 check_only)
{
struct monster *entityInfo;
struct move *sealableMoves[MAX_MON_MOVES];
s32 nSealable;
s32 i;
bool8 sealed = FALSE;
if (target == NULL)
return FALSE;
if (SafeguardIsActive(user, target, TRUE))
return FALSE;
if (IsProtectedFromNegativeStatus(user, target, TRUE))
return FALSE;
entityInfo = GetEntInfo(target);
nSealable = 0;
for (i = 0; i < MAX_MON_MOVES; i++) {
struct move *move = &entityInfo->moves.moves[i];
if (MoveExists(move)) {
if (!(move->flags2 & MOVE_FLAG_SEALED)) {
sealableMoves[nSealable] = move;
nSealable++;
}
}
}
if (check_only && nSealable == 0)
return FALSE;
if (nSealable != 0) {
struct move *move;
if (ExclusiveItemEffectIsActiveWithLogging(user, target, TRUE, 0xdbe + JPN_MSG_OFFSET, EXCLUSIVE_EFF_NO_MOVE_DISABLING))
return FALSE;
if (check_only)
return TRUE;
move = sealableMoves[DungeonRandInt(nSealable)];
move->flags2 |= MOVE_FLAG_SEALED;
SetPreprocessorArgsIdVal(0, move->id);
sealed = TRUE;
TryActivateQuickFeet(user, target);
}
if (sealed)
LogMessageByIdWithPopupCheckUserTarget(user, target, 0xde3 + JPN_MSG_OFFSET);
else
LogMessageByIdWithPopupCheckUserTarget(user, target, 0xde4 + JPN_MSG_OFFSET);
return TRUE;
}
bool8 BoostOrLowerSpeed(struct entity *user, struct entity *target)
{
if (!EntityIsValid__023118B4(target))
return FALSE;
if (DungeonRandOutcome__022EAB20(50))
LowerSpeed(user, target, 1, TRUE);
else
BoostSpeed(user, target, 1, 0, TRUE);
return TRUE;
}
void ResetHitChanceStat(struct entity *user, struct entity *target, s32 stat_idx, s32 play_effect_anyway)
{
struct monster *entityInfo;
bool8 changed = FALSE;
if (!EntityIsValid__023118B4(target))
return;
entityInfo = GetEntInfo(target);
if (entityInfo->stat_modifiers.hit_chance_stages[stat_idx] != 10) {
entityInfo->stat_modifiers.hit_chance_stages[stat_idx] = 10;
changed = TRUE;
}
if (changed)
ov29_022E543C(target);
else if (play_effect_anyway)
ov29_022E543C(target);
SubstitutePlaceholderStringTags(0, target, 0);
if (changed)
LogMessageByIdWithPopupCheckUserTarget(user, target, 0xd60 + JPN_MSG_OFFSET);
else
LogMessageByIdWithPopupCheckUserTarget(user, target, 0xd61 + JPN_MSG_OFFSET);
UpdateStatusIconFlags(target);
}
bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id)
{
struct item item;
if (ExclusiveItemEffectIsActive__023147EC(target, effect_id)) {
if (should_log) {
SubstitutePlaceholderStringTags(0, target, 0);
GetExclusiveItemWithEffectFromBag(target, effect_id, &item);
PrepareItemForPrinting__02345728(1, &item);
LogMessageByIdWithPopupCheckUserTarget(user, target, message_id);
}
return TRUE;
}
return FALSE;
}
void LogMessageWithTargetAndExclusiveItemName(struct entity *user, struct entity *target, s32 message_id, enum exclusive_item_effect_id effect_id)
{
struct item item;
SubstitutePlaceholderStringTags(0, target, 0);
GetExclusiveItemWithEffectFromBag(target, effect_id, &item);
PrepareItemForPrinting__02345728(1, &item);
LogMessageByIdWithPopupCheckUserTarget(user, target, message_id);
}
bool8 TryActivateQuickFeet(struct entity *user, struct entity *target)
{
if (!AbilityIsActiveVeneer(target, ABILITY_QUICK_FEET))
return FALSE;
BoostSpeed(user, target, 1, 0, FALSE);
return TRUE;
}
void TryInflictTerrifiedStatus(struct entity *user, struct entity *target)
{
struct monster *entityInfo = GetEntInfo(target);
entityInfo->terrified = 1;
entityInfo->terrified_turns = ov10_022C4618;
ov29_022E60E4(target);
SubstitutePlaceholderStringTags(0, target, 0);
LogMessageByIdWithPopupCheckUserTarget(user, target, 0xde5 + JPN_MSG_OFFSET);
}
bool8 TryInflictGrudgeStatus(struct entity *user, struct entity *target, bool8 log_message)
{
bool8 inflicted = FALSE;
struct monster *entityInfo = GetEntInfo(target);
SubstitutePlaceholderStringTags(1, target, 0);
if (entityInfo->grudge) {
if (log_message)
LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_ED1);
}
else {
entityInfo->grudge = TRUE;
inflicted = TRUE;
UpdateStatusIconFlags(target);
if (log_message)
LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_ED0);
}
return inflicted;
}
// If Red's file boundaries are anything to go by, this file should end just before TryInflictConfusedStatus.

View File

@@ -100,7 +100,6 @@ extern void CreateMonsterSummaryFromTeamMember(struct monster_summary *monster_s
extern s32 GetKeyboardStatus();
extern int PreprocessString(char* output, int output_size, const char* format, u16 flags, struct preprocessor_args* args);
extern void ShowKeyboard(s32 mode, u8 *, s32, u8 *);
extern void sub_0202B030(s8);
extern s32 sub_02037468();
extern void sub_0203909C(u8 *name);
extern s32 sub_02039218();
@@ -190,17 +189,16 @@ extern s32 ov11_02322C88;
extern s32 ov11_02322C98;
extern s32 ov11_02322CA8;
extern s32 ov11_02322CB8;
extern s32 ov11_02322CC8;
extern WindowTemplate ov11_02322CC8;
extern struct unk_0202A5CC ov11_02322CD8[];
extern s32 ov11_02322CF0;
extern struct unk_0202A5CC ov11_02322CF0[];
extern struct unk_0202A5CC ov11_02322D10[];
extern struct unk_0202A5CC ov11_02322D60[];
extern struct unk_0202A5CC ov11_02322D88[];
extern u8 ov11_02322DB0[];
extern void CloseScrollBox(s8); extern void CloseTextBox2(s8);extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateSimpleMenuFromStringIds(void *, s32, s32, void *, s32); extern s8 CreateTextBox(void *, void *);
extern void CloseScrollBox(s8); extern void CloseTextBox2(s8);extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateTextBox(void *, void *);
extern void GetPressedButtons(u32, u16 *);
extern s32 GetSimpleMenuResult__0202AEA4(s8);
extern void InitPreprocessorArgs(struct preprocessor_args *);
extern s32 IsScrollBoxActive(s8); extern void ShowDialogueBox(s8); extern void ShowStringIdInDialogueBox(s8, s32, s32, void *); extern void ov11_022DC504(void);
extern u8 *strcpy(u8 *dest, const u8 *src);
@@ -659,7 +657,8 @@ s32 ov11_02307334(void)
}
case 31: {
ov11_02324D8C->field_0x1c.b = 1;
ov11_02324D8C->field_0xc = CreateSimpleMenuFromStringIds(&ov11_02322CC8, 0x33, (s32)&ov11_02324D8C->field_0x1c, &ov11_02322CF0, 3);
ov11_02324D8C->field_0xc = CreateSimpleMenuFromStringIds(&ov11_02322CC8, 0x33, &ov11_02324D8C->field_0x1c,
ov11_02322CF0, 3);
ov11_02324D8C->field_0x0 = 0x20;
break;
}

View File

@@ -1,4 +1,328 @@
#include "overlay_29_022E869C.h"
#include "main_02001188.h"
#include "main_020483B8.h"
#include "options.h"
#include "overlay_29_022DC684.h"
#include "overlay_29_022F7364.h"
#include "overlay_29_0233A218.h"
extern struct unk_02353554 *TOP_SCREEN_STATUS_PTR;
extern struct dungeon *DUNGEON_PTR[];
extern u32 DUNGEON_FRAMES_PASSED;
extern void ov10_022C1E50(void *a);
extern void ov10_022C1E80(void *a, struct unk_022DC694 *b, s32 c, s32 d);
extern void ov10_022C21D8(void *a);
extern void ov10_022C2278(void *a);
extern void ov10_022C22A0(struct unk_022DC694 *p);
extern void ov29_022E8CE8(void);
extern void ov29_022E8F78(u8 *a);
extern bool8 ov29_022E8FCC(void);
extern bool8 ov29_022E8FF8(void);
extern void ov29_022E9008(void);
extern void ov29_022E9014(u8 *a);
extern void ov29_02339138(void);
extern void ov29_02339D7C(s32 a, s32 b);
extern void ov29_0233A0E8(s32 a, s32 b);
extern void ov29_0233A1BC(s32 a);
extern u8 ov29_0234B4E0(void);
extern s32 GetIdleAnimationId(struct entity *entity);
extern int GetPlayerGender(void);
extern void FreeTopScreen(void);
extern void DungeonChangeTopScreenType(s16 type);
extern bool8 InitDungeonControlsMenu(void);
extern bool8 FreeDungeonControlsMenu(void);
extern void sub_02048384(void);
extern void UpdateMinimap(void);
void FreeTopScreenStatus(void)
{
if (TOP_SCREEN_STATUS_PTR == NULL) {
return;
}
FreeTopScreen();
MemFree(TOP_SCREEN_STATUS_PTR);
TOP_SCREEN_STATUS_PTR = NULL;
}
void ov29_022E7F7C(void)
{
TOP_SCREEN_STATUS_PTR->field_0x0 = 0;
}
bool8 ov29_022E7F94(void)
{
bool8 female;
TOP_SCREEN_STATUS_PTR->field_0x228 = 0;
TOP_SCREEN_STATUS_PTR->field_0x0 = 1;
ov29_02339138();
ov29_02339D7C(1, 1);
UpdateMinimap();
SetMinimapDataE447(0);
TOP_SCREEN_STATUS_PTR->field_0x0 = 1;
SetMinimapDataE448(1);
ov29_022E8104();
female = GetPlayerGender() == 2;
ov29_022DC738((s32) TOP_SCREEN_STATUS_PTR->field_0xb8, female);
return TRUE;
}
bool8 ov29_022E8018(void)
{
if (TOP_SCREEN_STATUS_PTR->field_0x228 != 0) {
ov29_022DC76C();
ov29_022DC778();
TOP_SCREEN_STATUS_PTR->field_0x228 = 0;
}
return TRUE;
}
void ov29_022E8054(struct unk_022E8054 *a)
{
if (a->field_0x10 == 0) {
return;
}
a->field_0x10 = 0;
if (GetTopScreenOption() != 3) {
TOP_SCREEN_STATUS_PTR->field_0x0 = 0;
return;
}
if (TOP_SCREEN_STATUS_PTR->field_0x0 != 0) {
return;
}
ov29_02339138();
ov29_0233A0E8(0, 1);
ov29_02339D7C(1, 0);
TOP_SCREEN_STATUS_PTR->field_0x0 = 1;
}
bool8 ov29_022E80D0(void)
{
ov29_022DC77C();
TOP_SCREEN_STATUS_PTR->field_0x0 = 0;
SetMinimapDataE448(0);
ov29_0233A1BC(1);
ov29_02339138();
return TRUE;
}
void ov29_022E8104(void)
{
TOP_SCREEN_STATUS_PTR->field_0x228 = 0;
ov10_022C1E50(TOP_SCREEN_STATUS_PTR->field_0xb8);
ov29_022E8CE8();
}
bool8 InitializeTeamStats(void)
{
bool8 female;
TOP_SCREEN_STATUS_PTR->field_0x228 = 0;
TOP_SCREEN_STATUS_PTR->field_0x229 = 0;
ov29_022E8104();
TOP_SCREEN_STATUS_PTR->field_0x24 = 1;
female = GetPlayerGender() == 2;
ov29_022DC694((s32) TOP_SCREEN_STATUS_PTR->field_0xb8, female);
return TRUE;
}
bool8 UpdateTeamStatsWrapper(void)
{
if (TOP_SCREEN_STATUS_PTR->field_0x228 != 0) {
ov29_022DC6D0();
TOP_SCREEN_STATUS_PTR->field_0x228 = 0;
}
return TRUE;
}
void ov29_022E81C8(struct unk_022E8054 *a)
{
ov29_022DC6DC();
if (a->field_0x10 != 0) {
a->field_0x10 = 0;
}
}
bool8 FreeTeamStatsWrapper(void)
{
ov29_022DC728();
return TRUE;
}
void ov29_022E81F8(void)
{
if (!IsTeamStatsOnTopScreen()) {
ov29_022E8104();
return;
}
if (GetTopScreenOption() == 1 && TOP_SCREEN_STATUS_PTR->field_0x8 != 1) {
DungeonChangeTopScreenType(1);
}
ov29_022E8CE8();
}
void ov29_022E8244(void)
{
if (GetTopScreenOption() == 4 && TOP_SCREEN_STATUS_PTR->field_0x8 == 4) {
ov29_022E9008();
}
}
void DisplayTeamStatsSprite(struct entity *entity, s16 a, s16 b)
{
s32 sprite;
s32 anim;
s16 c;
s16 d;
u8 e;
struct monster *monster;
if (TOP_SCREEN_STATUS_PTR == NULL) {
return;
}
monster = entity->info;
anim = GetIdleAnimationId(entity);
c = 0;
d = 0;
e = 0;
sprite = (s16) entity->sprite_index;
if ((DUNGEON_PTR[0]->display_data.camera_target == entity
? 0 : DUNGEON_PTR[0]->display_data.hallucinating)
|| monster->curse_class_status.curse == 2) {
sprite = DungeonGetSpriteIndex(0x229);
}
if (monster->frozen_class_status.freeze != 1 && monster->frozen_class_status.freeze != 6) {
if (DUNGEON_PTR[0]->leader_running && ov29_0234B4E0() == 0) {
c += 2;
}
else if (entity->animation_group_id_mirror == 0 || entity->animation_group_id_mirror == 7) {
if (((struct monster *) entity->info)->speed_stage > 1) {
c += 1;
}
}
c += 1;
}
else {
c = 0;
}
if (monster->two_turn_move_invincible != 2
&& (monster->frozen_class_status.freeze == 6 || monster->burn_class_status.burn == 4
|| monster->frozen_class_status.freeze == 2)) {
d += DUNGEON_FRAMES_PASSED & 2;
}
if (monster->invisible_class_status.status == 1
&& DUNGEON_PTR[0]->display_data.can_see_traps == 0) {
e = 1;
}
if (anim == 0xff) {
return;
}
ov29_022DC6E8(sprite, monster->apparent_id, anim, monster->unique_id, 1, a, b, c, d, e);
}
bool8 ov29_022E840C(void)
{
struct unk_022DC694 s;
if (TOP_SCREEN_STATUS_PTR->field_0x29 != 0) {
return FALSE;
}
ov10_022C22A0(&s);
ov10_022C1E80(TOP_SCREEN_STATUS_PTR->field_0x80, &s, 0, 1);
if (sub_02048400()) {
sub_02048384();
}
TOP_SCREEN_STATUS_PTR->field_0x29 = 1;
return TRUE;
}
void ov29_022E847C(struct unk_022E8054 *a)
{
if (a->field_0x10 == 0) {
return;
}
a->field_0x10 = 0;
sub_020483B8();
ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80);
}
bool8 ov29_022E84B0(void)
{
if (TOP_SCREEN_STATUS_PTR->field_0x29 == 0) {
return FALSE;
}
ov10_022C2278(TOP_SCREEN_STATUS_PTR->field_0x80);
if (sub_02048400()) {
sub_020483D8();
}
TOP_SCREEN_STATUS_PTR->field_0x29 = 0;
return TRUE;
}
bool8 InitDungeonControlsMenuWithBg(void)
{
struct unk_022DC694 s;
ov10_022C22A0(&s);
ov10_022C1E80(TOP_SCREEN_STATUS_PTR->field_0x80, &s, 0, 1);
ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80);
return InitDungeonControlsMenu();
}
void ov29_022E854C(struct unk_022E8054 *a)
{
if (a->field_0x10 == 0) {
return;
}
ov29_022E8F78(&a->field_0x10);
ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80);
a->field_0x10 = 0;
}
bool8 FreeDungeonControlsMenuWithBg(void)
{
ov10_022C2278(TOP_SCREEN_STATUS_PTR->field_0x80);
return FreeDungeonControlsMenu();
}
bool8 ov29_022E85A8(void)
{
struct unk_022DC694 s;
ov10_022C22A0(&s);
ov10_022C1E80(TOP_SCREEN_STATUS_PTR->field_0x80, &s, 0, 1);
ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80);
return ov29_022E8FCC();
}
void ov29_022E85F4(struct unk_022E8054 *a)
{
if (a->field_0x10 == 0) {
return;
}
ov29_022E9014(&a->field_0x10);
ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80);
a->field_0x10 = 0;
}
bool8 ov29_022E8630(void)
{
ov10_022C2278(TOP_SCREEN_STATUS_PTR->field_0x80);
return ov29_022E8FF8();
}
bool8 ov29_022E8650(void)
{
struct unk_022DC694 s;
ov10_022C22A0(&s);
ov10_022C1E80(TOP_SCREEN_STATUS_PTR->field_0x80, &s, 0, 1);
ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80);
return TRUE;
}
bool8 ov29_022E869C(void)
{

View File

@@ -1,5 +1,53 @@
#include "overlay_29_0230558C.h"
#include "dg_uty.h"
#include "dungeon_capabilities.h"
#include "dungeon_items.h"
#include "dungeon_logic.h"
#include "dungeon_logic_7.h"
#include "dungeon_pokemon_attributes.h"
#include "dungeon_pokemon_attributes_1.h"
#include "dungeon_util_1.h"
#include "dungeon_util_2.h"
#include "dungeon_util_static.h"
#include "overlay_29_022E3F20.h"
#include "overlay_29_022EC7E8.h"
#include "overlay_29_022FFF28.h"
#include "overlay_29_02305C04.h"
#include "overlay_29_023061A8.h"
#include "overlay_29_02306728.h"
#include "overlay_29_0230F810.h"
#include "overlay_29_02336F4C.h"
#include "overlay_29_0234B104.h"
#include "overlay_29_0234B340.h"
#include "position_util.h"
#ifdef JAPAN
#define JPN_MSG_OFFSET -0x2C0
#else
#define JPN_MSG_OFFSET 0
#endif
extern struct dungeon *DUNGEON_PTR[];
extern const u16 ov29_02353318[];
extern s32 GetIdleAnimationId(struct entity *entity);
extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction);
extern void ov29_02337D68(struct position *pos);
extern struct trap *GetTrapInfo(struct entity *entity);
extern void TryTriggerTrap(struct entity *entity, struct position *pos, s32 a, s32 b);
extern void TryTriggerMonsterHouse(struct entity *entity, bool8 a);
extern void ov29_022E3A58(bool8 a);
extern bool8 ov29_022E2CA0(struct position *pos);
extern void ov29_022EA370(s32 a, s32 b);
extern void EndSleepClassStatus(struct entity *user, struct entity *target, bool8 a, bool8 b, bool8 c);
extern void EndFrozenClassStatus(struct entity *user, struct entity *target, bool8 log);
extern void EndCringeClassStatus(struct entity *user, struct entity *target);
extern void EndLeechSeedClassStatus(struct entity *user, struct entity *target);
extern void EndSureShotClassStatus(struct entity *user, struct entity *target);
extern void EndBlinkerClassStatus(struct entity *user, struct entity *target);
extern void EndMuzzledStatus(struct entity *user, struct entity *target);
extern void EndMiracleEyeStatus(struct entity *user, struct entity *target);
extern void ov29_022E543C(struct entity *entity);
bool8 EntityIsValid__0230558C(struct entity *entity)
{
@@ -8,3 +56,223 @@ bool8 EntityIsValid__0230558C(struct entity *entity)
return GetEntityType(entity) != ENTITY_NOTHING;
}
void ov29_023055B0(s32 a)
{
s32 i;
for (i = 0; i < DUNGEON_MAX_POKEMON; i++) {
struct entity *entity = DUNGEON_PTR[0]->active_monster_ptrs[i];
if (EntityIsValid__0230558C(entity)) {
struct monster *monster = GetEntInfo(entity);
if (!monster->is_team_leader) {
if (IsTeamMemberOnFirstTurnInFixedRoom(monster))
return;
if (monster->target_pos.x != 0 || monster->target_pos.y != 0) {
if (monster->target_pos.x != entity->pos.x ||
monster->target_pos.y != entity->pos.y) {
if (!CheckVariousStatuses2__02301244(entity, TRUE)) {
s32 direction =
GetDirectionTowardsPosition(&entity->pos, &monster->target_pos);
monster->action.direction = direction & DIRECTION_MASK;
ChangeMonsterAnimation(entity, GetIdleAnimationId(entity), direction);
}
}
}
}
}
}
}
void CheckNonLeaderTile(struct entity *entity)
{
struct monster *monster = GetEntInfo(entity);
struct tile *tile;
struct entity *object;
if (!EntityIsValid__0230558C(entity))
return;
tile = GetTileAtEntity(entity);
if (IqSkillIsEnabled(entity, IQ_ABSOLUTE_MOVER) &&
monster->invisible_class_status.status != STATUS_INVISIBLE_MOBILE) {
bool8 item_active;
if (AbilityIsActiveVeneer(entity, ABILITY_KLUTZ))
item_active = FALSE;
else
item_active = HasHeldItem(entity, ITEM_MOBILE_SCARF);
if (!item_active)
ov29_02337D68(&entity->pos);
}
object = tile->object;
if (object == NULL)
return;
switch (object->type) {
case ENTITY_NOTHING:
case ENTITY_MONSTER:
break;
case ENTITY_TRAP: {
struct trap *trap = GetTrapInfo(object);
bool8 trigger = FALSE;
bool8 revealed = FALSE;
if (!monster->is_not_team_member && IqSkillIsEnabled(entity, IQ_TRAP_SEER) &&
!object->is_visible) {
object->is_visible = TRUE;
UpdateTrapsVisibility();
revealed = TRUE;
}
if (trap->team == 0) {
if (object->is_visible && !monster->is_not_team_member)
trigger = TRUE;
}
else if (trap->team == 1) {
if (monster->is_not_team_member)
trigger = TRUE;
}
else if (trap->team == 2) {
if (!monster->is_not_team_member)
trigger = TRUE;
}
if (trigger && !revealed)
TryTriggerTrap(entity, &entity->pos, FALSE, TRUE);
break;
}
case ENTITY_ITEM:
TryNonLeaderItemPickUp(entity);
break;
case ENTITY_HIDDEN_STAIRS:
case ENTITY_TEMPORARY:
break;
}
}
void ov29_02305814(struct entity *entity, bool8 a)
{
if (!EntityIsValid__0230558C(entity))
return;
if (GetEntInfo(entity)->is_not_team_member)
return;
if (IsFloorOver() || DUNGEON_PTR[0]->monster_house_triggered)
return;
if (!(GetTileAtEntity(entity)->terrain_flags & TERRAIN_TYPE_IN_MONSTER_HOUSE))
return;
LogMessageByIdWithPopupCheckUser(GetLeader(), 0xC82 + JPN_MSG_OFFSET);
DUNGEON_PTR[0]->monster_house_triggered_event = TRUE;
TryTriggerMonsterHouse(entity, a);
ov29_022E3A58(FALSE);
if (ov29_022E2CA0(&entity->pos))
ov29_022EA370(0x78, 0x39);
}
s32 EndNegativeStatusCondition(struct entity *user, struct entity *target, bool8 a, bool8 b,
bool8 c)
{
struct monster *monster;
s32 result = FALSE;
s32 speed_stage;
s32 log_sealed = FALSE;
s32 i;
if (!EntityIsValid__02305C04(target))
return result;
monster = GetEntInfo(target);
if (MonsterHasNegativeStatus(target, FALSE)) {
result = TRUE;
if (IsMonsterDrowsy(target))
EndSleepClassStatus(user, target, FALSE, FALSE, TRUE);
if (!EntityIsValid__02305C04(target))
return FALSE;
if (MonsterHasNonvolatileNonsleepStatus(target))
EndBurnClassStatus(user, target);
if (c) {
if (MonsterHasImmobilizingStatus(target))
EndFrozenClassStatus(user, target, TRUE);
}
else if (MonsterHasImmobilizingStatus(target) &&
monster->frozen_class_status.freeze != STATUS_FROZEN_WRAP) {
EndFrozenClassStatus(user, target, TRUE);
}
if (MonsterHasAttackInterferingStatus(target))
EndCringeClassStatus(user, target);
if (MonsterHasSkillInterferingStatus(target))
EndCurseClassStatus(user, target, 0, TRUE);
if (MonsterHasLeechSeedStatus(target))
EndLeechSeedClassStatus(user, target);
if (MonsterHasWhifferStatus(target))
EndSureShotClassStatus(user, target);
if (IsMonsterVisuallyImpaired(target, FALSE))
EndBlinkerClassStatus(user, target);
if (IsMonsterMuzzled(target))
EndMuzzledStatus(user, target);
if (MonsterHasMiracleEyeStatus(target))
EndMiracleEyeStatus(user, target);
if (monster->perish_song_turns != 0) {
monster->perish_song_turns = 0;
LogMessageByIdWithPopupCheckUserTarget(user, target, 0xC83 + JPN_MSG_OFFSET);
}
if (monster->exposed) {
monster->exposed = FALSE;
LogMessageByIdWithPopupCheckUserTarget(user, target, 0xC84 + JPN_MSG_OFFSET);
}
}
speed_stage = CalcSpeedStageWrapper(target);
for (i = 0; i < NUM_SPEED_COUNTERS; i++)
monster->speed_down_counters[i] = 0;
if (speed_stage != CalcSpeedStageWrapper(target)) {
result = TRUE;
SubstitutePlaceholderStringTags(0, target, 0);
LogMessageByIdWithPopupCheckUserTarget(user, target,
ov29_02353318[monster->speed_stage]);
}
for (i = 0; i < MAX_MON_MOVES; i++) {
struct move *move = &monster->moves.moves[i];
if (MoveExists(move)) {
if (move->flags2 & MOVE_FLAG_SEALED) {
result = TRUE;
log_sealed = TRUE;
move->flags2 &= ~MOVE_FLAG_SEALED;
}
}
}
if (result) {
if (a)
ov29_022E543C(target);
if (log_sealed)
LogMessageByIdWithPopupCheckUserTarget(user, target, 0xC85 + JPN_MSG_OFFSET);
}
else if (!b) {
LogMessageByIdWithPopupCheckUserTarget(user, target, 0xC86 + JPN_MSG_OFFSET);
}
UpdateStatusIconFlags(target);
return result;
}

View File

@@ -2,6 +2,86 @@
#include "dungeon_items.h"
#include "dungeon_pokemon_attributes.h"
#include "dungeon_util_static.h"
#include "dungeon_logic_2.h"
#include "dungeon_util_2.h"
#include "move_orb_effects.h"
#include "overlay_29_022E3F20.h"
#include "overlay_29_022E41CC.h"
#include "overlay_29_0234B340.h"
extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 log_message);
extern s32 CalcStatusDuration(struct entity *entity, const s16 *turn_range, bool8 iq_skill_effects);
extern const s16 CONFUSED_TURN_RANGE[];
#ifdef JAPAN
#define MESSAGE_CFE 0xA3E
#define MESSAGE_CFF 0xA3F
#define MESSAGE_DA7 0xAE7
#define MESSAGE_DAF 0xAEF
#define MESSAGE_DBA 0xAFA
#else
#define MESSAGE_CFE 0xCFE
#define MESSAGE_CFF 0xCFF
#define MESSAGE_DA7 0xDA7
#define MESSAGE_DAF 0xDAF
#define MESSAGE_DBA 0xDBA
#endif
bool8 TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 log_failure, bool8 check_only)
{
struct monster *entityInfo;
bool8 ownTempo;
if (!EntityIsValid__02315118(target))
return FALSE;
if (SafeguardIsActive(user, target, log_failure))
return FALSE;
if (IsProtectedFromNegativeStatus(user, target, log_failure))
return FALSE;
SubstitutePlaceholderStringTags(0, target, 0);
if (ItemIsActive__0231513C(target, ITEM_PERSIM_BAND)) {
if (log_failure)
LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_DAF);
return FALSE;
}
if (ExclusiveItemEffectIsActiveWithLogging(user, target, log_failure, MESSAGE_DBA, EXCLUSIVE_EFF_NO_CONFUSION))
return FALSE;
if (user != target && (user == NULL ? FALSE : (bool8)(GetEntityType(user) == ENTITY_MONSTER)) && AbilityIsActiveVeneer(user, ABILITY_MOLD_BREAKER))
ownTempo = FALSE;
else
ownTempo = AbilityIsActiveVeneer(target, ABILITY_OWN_TEMPO);
if (ownTempo) {
if (log_failure)
LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_DA7);
return FALSE;
}
if (check_only)
return TRUE;
ov29_022E41CC(target);
entityInfo = GetEntInfo(target);
if (entityInfo->cringe_class_status.cringe != STATUS_CRINGE_CONFUSED) {
entityInfo->cringe_class_status.cringe = STATUS_CRINGE_CONFUSED;
entityInfo->cringe_class_status.cringe_turns = CalcStatusDuration(target, CONFUSED_TURN_RANGE, TRUE) + 1;
LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_CFE);
TryActivateQuickFeet(user, target);
}
else {
LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_CFF);
}
UpdateStatusIconFlags(target);
return TRUE;
}
bool8 EntityIsValid__02315118(struct entity *entity)
{

View File

@@ -1,4 +1,5 @@
#include "overlay_29_0231CBC8.h"
#include "overlay_29_02315118.h"
#include "dungeon_util_static.h"
#include "dungeon_capabilities_1.h"
#include "dungeon_pokemon_attributes_1.h"
@@ -43,7 +44,6 @@ extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s3
extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b);
extern void BoostIQ(struct entity *entity, s16 iq, bool8 a);
extern void UpdateShopkeeperModeAfterAttack(struct entity *attacker, struct entity *defender);
extern void TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 a, bool8 b);
extern void TryInflictInvisibleStatus(struct entity *user, struct entity *target);
extern void TryInflictPetrifiedStatus(struct entity *user, struct entity *target);
extern void TryInflictSleeplessStatus(struct entity *user, struct entity *target);

View File

@@ -1,6 +1,6 @@
#include "overlay_29_023293E4.h"
#include "overlay_29_02315118.h"
extern void TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 displayMessage, bool8 onlyCheck);
bool8 DoMoveConfuse(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id)
{

View File

@@ -1,8 +1,8 @@
#include "overlay_29_0232DD78.h"
#include "move_orb_effects.h"
extern s32 DealDamage(struct entity *attacker, struct entity *defender, struct move *move, s32 damageMultiplier, enum item_id item_id);
extern void BoostOrLowerSpeed(struct entity *user, struct entity *target);
bool8 DoMoveTrickRoom(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id)
{

View File

@@ -1,9 +1,15 @@
#include "dg_random.h"
#include "dungeon.h"
#include "main_02001188.h"
#include "main_0200330C.h"
#include "overlay_29_022E869C.h"
#include "overlay_29_022F73B4.h"
#include "spawn_2.h"
extern struct dungeon *DUNGEON_PTR[];
extern struct unk_02353554 *TOP_SCREEN_STATUS_PTR;
extern void ov29_022E8708(void);
extern s32 GetMonsterIdFromSpawnEntry(struct monster_spawn_entry *);
extern s32 GetMonsterLevelFromSpawnEntry(struct monster_spawn_entry *);
@@ -58,3 +64,18 @@ s32 GetMonsterLevelToSpawn(s32 monster_id) {
return 1;
}
void AllocTopScreenStatus(void)
{
TOP_SCREEN_STATUS_PTR = MemAlloc(0x230, 0);
MemZero((u8 *) TOP_SCREEN_STATUS_PTR, 0x230);
TOP_SCREEN_STATUS_PTR->field_0x0 = 0;
TOP_SCREEN_STATUS_PTR->field_0x29 = 0;
TOP_SCREEN_STATUS_PTR->field_0x2c = 0;
TOP_SCREEN_STATUS_PTR->field_0x2b = 0;
TOP_SCREEN_STATUS_PTR->field_0x4 = 0;
TOP_SCREEN_STATUS_PTR->field_0x228 = 0;
ov29_022E8708();
TOP_SCREEN_STATUS_PTR->field_0x4 = 2;
TOP_SCREEN_STATUS_PTR->field_0x229 = 0;
}