From aaadf2147f5d8cf9d5e824e4670d019868872a2b Mon Sep 17 00:00:00 2001 From: slaw-22 <> Date: Sun, 26 Apr 2026 16:31:26 +0000 Subject: [PATCH] Decomp GetMonsterIdToSpawn and GetMonsterLevelToSpawn --- asm/include/overlay_29_022E37DC.inc | 134 +-- asm/include/overlay_29_022E7EC4.inc | 59 + asm/overlay_29_022E37DC.s | 1563 --------------------------- asm/overlay_29_022E7EC4.s | 1454 +++++++++++++++++++++++++ include/dungeon_mode.h | 7 +- include/spawn.h | 9 + main.lsf | 2 + src/spawn.c | 42 + 8 files changed, 1608 insertions(+), 1662 deletions(-) create mode 100644 asm/include/overlay_29_022E7EC4.inc create mode 100644 asm/overlay_29_022E7EC4.s create mode 100644 include/spawn.h create mode 100644 src/spawn.c diff --git a/asm/include/overlay_29_022E37DC.inc b/asm/include/overlay_29_022E37DC.inc index 9ed28279..10739752 100644 --- a/asm/include/overlay_29_022E37DC.inc +++ b/asm/include/overlay_29_022E37DC.inc @@ -6,15 +6,10 @@ .public ChangeMonsterAnimation .public CheckActiveChallengeRequest .public CheckSpawnThreshold -.public CloseTextBox2 -.public CreateTextBox .public DIRECTIONS_XY -.public DisplayAnimatedNumbers -.public DrawTextInWindow -.public DUNGEON_FRAMES_PASSED .public DUNGEON_PTR +.public DisplayAnimatedNumbers .public DungeonFloorToGroupFloor -.public DungeonGetSpriteIndex .public DungeonGetTotalSpriteFileSize .public DungeonGoesUp .public DungeonRandInt @@ -24,9 +19,7 @@ .public FloorNumberIsEven .public GetEffectAnimationField0x19 .public GetFloorType -.public GetIdleAnimationId .public GetItemCategoryVeneer -.public GetKecleonIdToSpawnByFloor .public GetLeader .public GetMonsterGenderVeneer .public GetMonsterIdFromSpawnEntry @@ -34,13 +27,10 @@ .public GetNbFloorsPlusOne .public GetNbPrecedingFloors .public GetNbRecruited -.public GetPlayerGender .public GetSecondFormIfValid .public GetSpriteFileSize .public GetSpriteSize -.public GetTopScreenOption .public HandleSir0Translation -.public InitPreprocessorArgs .public IsBossFight .public IsCurrentFixedRoomBossFight .public IsCurrentMissionType @@ -50,88 +40,16 @@ .public IsFullFloorFixedRoom .public IsInSpawnList .public IsItemForSpecialSpawnInBag -.public IsTeamStatsOnTopScreen .public LoadFileFromRom .public LoadFixedRoom .public LogMessageByIdWithPopup .public MemAlloc .public MemFree -.public MemZero .public MonsterIsType .public NeedsItemToSpawn -.public ov10_022BDC68 -.public ov10_022BDE50 -.public ov10_022BEC08 -.public ov10_022BEC94 -.public ov10_022BEFD8 -.public ov10_022BF274 -.public ov10_022BF2B4 -.public ov10_022BF45C -.public ov10_022BF9CC -.public ov10_022BFB6C -.public ov10_022C1DE0 -.public ov10_022C1E50 -.public ov10_022C1E80 -.public ov10_022C21D8 -.public ov10_022C2278 -.public ov10_022C22A0 -.public ov29_022DC684 -.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_022DE5D8 -.public ov29_022DE5F0 -.public ov29_022E2CA0 -.public ov29_022EA370 -.public ov29_022EACE4 -.public ov29_022ED0F4 -.public ov29_0230027C -.public ov29_0230D618 -.public ov29_02339138 -.public ov29_02339148 -.public ov29_02339D7C -.public ov29_0233A0E8 -.public ov29_0233A1BC -.public ov29_02349378 -.public ov29_0234B1A4 -.public ov29_0234B4E0 -.public ov29_0234C70C -.public ov29_0234F25C -.public ov29_0234F278 -.public ov29_0234F290 -.public ov29_0234F2B8 -.public ov29_0235118C -.public ov29_02351194 -.public ov29_0235119C -.public ov29_023511A4 -.public ov29_023511B0 -.public ov29_023511DC -.public ov29_0235122C -.public ov29_0235124C -.public ov29_02351464 -.public ov29_02351584 -.public ov29_02351594 -.public ov29_023515B0 -.public ov29_023515CC -.public ov29_023515E8 -.public ov29_023515F4 -.public ov29_0235352C -.public ov29_0235354C -.public ov29_02353558 .public PlayEffectAnimationEntity .public PlaySeByIdIfNotSilence .public RandIntSafe -.public SetMinimapDataE447 -.public SetMinimapDataE448 -.public SetMonsterId -.public ShouldDisplayEntityWrapper -.public StartFadeDungeonWrapper .public STATUS_ICON_ARRAY_BIDE .public STATUS_ICON_ARRAY_BLINDED .public STATUS_ICON_ARRAY_BURN @@ -147,18 +65,44 @@ .public STATUS_ICON_ARRAY_REFLECT .public STATUS_ICON_ARRAY_SLEEP .public STATUS_ICON_ARRAY_SURE_SHOT -.public StringFromId -.public sub_0200B330 -.public sub_0200B3D4 +.public SetMonsterId +.public ShouldDisplayEntityWrapper +.public SubstitutePlaceholderStringTags +.public UnloadFile +.public ov10_022BDC68 +.public ov10_022BDE50 +.public ov10_022BEC08 +.public ov10_022BEC94 +.public ov10_022BEFD8 +.public ov10_022BF274 +.public ov10_022BF2B4 +.public ov10_022BF45C +.public ov10_022BF9CC +.public ov10_022BFB6C +.public ov29_022DE5D8 +.public ov29_022DE5F0 +.public ov29_022E2CA0 +.public ov29_022EA370 +.public ov29_022EACE4 +.public ov29_022ED0F4 +.public ov29_0230D618 +.public ov29_02339148 +.public ov29_02349378 +.public ov29_0234B1A4 +.public ov29_0235118C +.public ov29_02351194 +.public ov29_0235119C +.public ov29_023511A4 +.public ov29_023511B0 +.public ov29_023511DC +.public ov29_0235122C +.public ov29_0235124C +.public ov29_02351464 +.public ov29_02351584 +.public ov29_02351594 +.public ov29_023515B0 +.public ov29_023515CC +.public ov29_0235354C .public sub_0201C000 .public sub_0201CF90 .public sub_0201D034 -.public sub_02048384 -.public sub_020483B8 -.public sub_020483D8 -.public sub_02048400 -.public SubstitutePlaceholderStringTags -.public TOP_SCREEN_STATUS_PTR -.public UnloadFile -.public UpdateMinimap -.public UpdateWindow diff --git a/asm/include/overlay_29_022E7EC4.inc b/asm/include/overlay_29_022E7EC4.inc new file mode 100644 index 00000000..8334d9e6 --- /dev/null +++ b/asm/include/overlay_29_022E7EC4.inc @@ -0,0 +1,59 @@ +#pragma once +.public CloseTextBox2 +.public CreateTextBox +.public DUNGEON_FRAMES_PASSED +.public DUNGEON_PTR +.public DrawTextInWindow +.public DungeonGetSpriteIndex +.public GetIdleAnimationId +.public GetPlayerGender +.public GetTopScreenOption +.public InitPreprocessorArgs +.public IsTeamStatsOnTopScreen +.public MemAlloc +.public MemFree +.public MemZero +.public SetMinimapDataE447 +.public SetMinimapDataE448 +.public StartFadeDungeonWrapper +.public StringFromId +.public TOP_SCREEN_STATUS_PTR +.public UpdateMinimap +.public UpdateWindow +.public ov10_022C1DE0 +.public ov10_022C1E50 +.public ov10_022C1E80 +.public ov10_022C21D8 +.public ov10_022C2278 +.public ov10_022C22A0 +.public ov29_022DC684 +.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_0230027C +.public ov29_02339138 +.public ov29_02339D7C +.public ov29_0233A0E8 +.public ov29_0233A1BC +.public ov29_0234B4E0 +.public ov29_0234C70C +.public ov29_0234F25C +.public ov29_0234F278 +.public ov29_0234F290 +.public ov29_0234F2B8 +.public ov29_023515E8 +.public ov29_023515F4 +.public ov29_0235352C +.public ov29_02353558 +.public sub_0200B330 +.public sub_0200B3D4 +.public sub_02048384 +.public sub_020483B8 +.public sub_020483D8 +.public sub_02048400 diff --git a/asm/overlay_29_022E37DC.s b/asm/overlay_29_022E37DC.s index ab56240c..0bf55b0c 100644 --- a/asm/overlay_29_022E37DC.s +++ b/asm/overlay_29_022E37DC.s @@ -5686,1566 +5686,3 @@ _022E7D94: .align 2, 0 _022E7D9C: .word DUNGEON_PTR arm_func_end IsOnMonsterSpawnList - - arm_func_start GetMonsterIdToSpawn -GetMonsterIdToSpawn: ; 0x022E7DA0 -#ifdef JAPAN -#define GET_MONSTER_ID_TO_SPAWN_OFFSET -0x50 -#else -#define GET_MONSTER_ID_TO_SPAWN_OFFSET 0 -#endif - stmdb sp!, {r4, lr} - mov r4, r0 - ldr r0, _022E7E50 ; =0x00002710 - bl DungeonRandInt - ldr r1, _022E7E54 ; =DUNGEON_PTR - mov ip, #0 - ldr r1, [r1] - add r2, r1, #0x3000 -#ifdef JAPAN - ldr lr, [r2, #0xd7c] -#else - ldr lr, [r2, #0xe20] -#endif - add r3, r1, r4, lsl #1 - b _022E7E00 -_022E7DCC: - add r2, r3, ip, lsl #3 - add r2, r2, #0x3900 - ldrsh r2, [r2, #0x76 + GET_MONSTER_ID_TO_SPAWN_OFFSET] - cmp r2, #0 - beq _022E7DFC - cmp r2, r0 - blt _022E7DFC - add r0, r1, #0x174 + GET_MONSTER_ID_TO_SPAWN_OFFSET - add r0, r0, #0x3800 - add r0, r0, ip, lsl #3 - bl GetMonsterIdFromSpawnEntry - ldmia sp!, {r4, pc} -_022E7DFC: - add ip, ip, #1 -_022E7E00: - cmp ip, lr - blt _022E7DCC - mov r3, #0 - add r2, r1, r4, lsl #1 - b _022E7E40 -_022E7E14: - add r0, r2, r3, lsl #3 - add r0, r0, #0x3900 - ldrsh r0, [r0, #0x76 + GET_MONSTER_ID_TO_SPAWN_OFFSET] - cmp r0, #0 - beq _022E7E3C - add r0, r1, #0x174 + GET_MONSTER_ID_TO_SPAWN_OFFSET - add r0, r0, #0x3800 - add r0, r0, r3, lsl #3 - bl GetMonsterIdFromSpawnEntry - ldmia sp!, {r4, pc} -_022E7E3C: - add r3, r3, #1 -_022E7E40: - cmp r3, lr - blt _022E7E14 - bl GetKecleonIdToSpawnByFloor - ldmia sp!, {r4, pc} - .align 2, 0 -_022E7E50: .word 0x00002710 -_022E7E54: .word DUNGEON_PTR - arm_func_end GetMonsterIdToSpawn - - arm_func_start GetMonsterLevelToSpawn -GetMonsterLevelToSpawn: ; 0x022E7E58 - stmdb sp!, {r4, r5, r6, lr} - mov r5, r0 - mov r4, #0 - ldr r6, _022E7EC0 ; =DUNGEON_PTR - b _022E7EA4 -_022E7E6C: -#ifdef JAPAN - add r0, r1, #0x124 -#else - add r0, r1, #0x174 -#endif - add r0, r0, #0x3800 - add r0, r0, r4, lsl #3 - bl GetMonsterIdFromSpawnEntry - cmp r5, r0 - bne _022E7EA0 - ldr r0, _022E7EC0 ; =DUNGEON_PTR - ldr r0, [r0] -#ifdef JAPAN - add r0, r0, #0x124 -#else - add r0, r0, #0x174 -#endif - add r0, r0, #0x3800 - add r0, r0, r4, lsl #3 - bl GetMonsterLevelFromSpawnEntry - ldmia sp!, {r4, r5, r6, pc} -_022E7EA0: - add r4, r4, #1 -_022E7EA4: - ldr r1, [r6] - add r0, r1, #0x3000 -#ifdef JAPAN - ldr r0, [r0, #0xd7c] -#else - ldr r0, [r0, #0xe20] -#endif - cmp r4, r0 - blt _022E7E6C - mov r0, #1 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_022E7EC0: .word DUNGEON_PTR - arm_func_end GetMonsterLevelToSpawn - - 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 ov29_022E8CA8 -_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 ov29_022E8500 -ov29_022E8500: ; 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 ov29_022E8E94 - add sp, sp, #0x14 - ldmia sp!, {pc} - .align 2, 0 -_022E8548: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8500 - - 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 ov29_022E8588 -ov29_022E8588: ; 0x022E8588 - stmdb sp!, {r3, lr} - ldr r0, _022E85A4 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C2278 - bl ov29_022E8F28 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E85A4: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8588 - - 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 - - arm_func_start ov29_022E869C -ov29_022E869C: ; 0x022E869C - mov r0, #1 - bx lr - arm_func_end ov29_022E869C - - arm_func_start ov29_022E86A4 -ov29_022E86A4: ; 0x022E86A4 - bx lr - arm_func_end ov29_022E86A4 - - arm_func_start ov29_022E86A8 -ov29_022E86A8: ; 0x022E86A8 - stmdb sp!, {r3, lr} - ldr r0, _022E86C4 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C2278 - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E86C4: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E86A8 - - arm_func_start AssignTopScreenHandlers -AssignTopScreenHandlers: ; 0x022E86C8 - str r1, [r0] - ldr r1, [sp] - stmib r0, {r2, r3} - str r1, [r0, #0xc] - mov r1, #1 - strb r1, [r0, #0x10] - bx lr - arm_func_end AssignTopScreenHandlers - - arm_func_start ov29_022E86E4 -ov29_022E86E4: ; 0x022E86E4 - stmdb sp!, {r3, lr} - ldr r0, _022E8704 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldr r0, [r0, #0x18] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - blx r0 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E8704: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E86E4 - - arm_func_start ov29_022E8708 -ov29_022E8708: ; 0x022E8708 - stmdb sp!, {r3, lr} - bl GetTopScreenOption - cmp r0, #3 - bne _022E8724 - mov r0, #3 - bl ov29_022E8CA8 - ldmia sp!, {r3, pc} -_022E8724: - cmp r0, #2 - bne _022E8738 - mov r0, #0 - bl ov29_022E8CA8 - ldmia sp!, {r3, pc} -_022E8738: - cmp r0, #0 - bne _022E874C - mov r0, #2 - bl ov29_022E8CA8 - ldmia sp!, {r3, pc} -_022E874C: - cmp r0, #4 - bne _022E8760 - mov r0, #4 - bl ov29_022E8CA8 - ldmia sp!, {r3, pc} -_022E8760: - bl ov29_022E81F8 - ldmia sp!, {r3, pc} - arm_func_end ov29_022E8708 - - arm_func_start ov29_022E8768 -ov29_022E8768: ; 0x022E8768 - ldr ip, _022E8774 ; =ov29_022E8CA8 - mov r0, #5 - bx ip - .align 2, 0 -_022E8774: .word ov29_022E8CA8 - arm_func_end ov29_022E8768 - - arm_func_start ov29_022E8778 -ov29_022E8778: ; 0x022E8778 - stmdb sp!, {r3, lr} - ldr r0, _022E87B0 ; =TOP_SCREEN_STATUS_PTR - mov r3, #3 - ldr r2, [r0] - sub r1, r3, #4 - str r3, [r2, #0xc] - ldr r0, [r0] - strh r1, [r0, #0x10] - bl ov29_022E8104 - ldr r0, _022E87B0 ; =TOP_SCREEN_STATUS_PTR - ldr r1, [r0] - ldrsh r0, [r1, #0x10] - strh r0, [r1, #8] - ldmia sp!, {r3, pc} - .align 2, 0 -_022E87B0: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8778 - - arm_func_start ov29_022E87B4 -ov29_022E87B4: ; 0x022E87B4 - ldr r1, _022E87D8 ; =TOP_SCREEN_STATUS_PTR - ldr r2, [r1] - ldrsh r1, [r2, #8] - cmp r1, r0 - ldreq r0, [r2, #4] - cmpeq r0, #5 - moveq r0, #1 - movne r0, #0 - bx lr - .align 2, 0 -_022E87D8: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E87B4 - - arm_func_start ov29_022E87DC -ov29_022E87DC: ; 0x022E87DC - stmdb sp!, {r3, lr} - bl GetTopScreenOption - ldr r1, _022E87F8 ; =ov29_023515E8 - mov r0, r0, lsl #1 - ldrsh r0, [r1, r0] - bl ov29_022E87B4 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E87F8: .word ov29_023515E8 - arm_func_end ov29_022E87DC - - arm_func_start ov29_022E87FC -ov29_022E87FC: ; 0x022E87FC - ldr r1, _022E880C ; =TOP_SCREEN_STATUS_PTR - ldr r1, [r1] - strb r0, [r1, #0x2b] - bx lr - .align 2, 0 -_022E880C: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E87FC - - arm_func_start ov29_022E8810 -ov29_022E8810: ; 0x022E8810 - ldr r0, _022E8830 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldr r0, [r0, #4] - cmp r0, #1 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - bx lr - .align 2, 0 -_022E8830: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8810 - - arm_func_start ov29_022E8834 -ov29_022E8834: ; 0x022E8834 - ldr r1, _022E8844 ; =TOP_SCREEN_STATUS_PTR - ldr r1, [r1] - strb r0, [r1, #0x2c] - bx lr - .align 2, 0 -_022E8844: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8834 - - arm_func_start ov29_022E8848 -ov29_022E8848: ; 0x022E8848 - ldr r0, _022E8868 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldr r0, [r0, #4] - cmp r0, #3 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - bx lr - .align 2, 0 -_022E8868: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8848 - - arm_func_start HandleTopScreenFades -HandleTopScreenFades: ; 0x022E886C - stmdb sp!, {r3, r4, r5, lr} - ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR - ldr r5, [r0] - cmp r5, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r1, [r5, #4] - cmp r1, #6 - addls pc, pc, r1, lsl #2 - ldmia sp!, {r3, r4, r5, pc} -_022E8890: ; jump table - ldmia sp!, {r3, r4, r5, pc} ; case 0 - b _022E88AC ; case 1 - b _022E88C0 ; case 2 - b _022E8A80 ; case 3 - b _022E8AC8 ; case 4 - b _022E8B00 ; case 5 - b _022E8B5C ; case 6 -_022E88AC: - ldrb r0, [r5, #0x2b] - cmp r0, #0 - moveq r0, #2 - streq r0, [r5, #4] - ldmia sp!, {r3, r4, r5, pc} -_022E88C0: - ldrb r0, [r5, #2] - cmp r0, #0 - beq _022E88EC - mov r0, #1 - bl ov29_0234C70C - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, pc} - ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR - mov r1, #5 - ldr r0, [r0] - str r1, [r0, #4] -_022E88EC: - bl FreeTopScreen - ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR - ldr r4, [r0] - ldrsh r0, [r4, #0x10] - cmp r0, #5 - addls pc, pc, r0, lsl #2 - b _022E89DC -_022E8908: ; jump table - b _022E8920 ; case 0 - b _022E8940 ; case 1 - b _022E8960 ; case 2 - b _022E8980 ; case 3 - b _022E89A0 ; case 4 - b _022E89C0 ; case 5 -_022E8920: - ldr ip, _022E8BA4 ; =ov29_022E84B0 - ldr r1, _022E8BA8 ; =ov29_022E840C - ldr r3, _022E8BAC ; =ov29_022E847C - add r0, r4, #0x14 - mov r2, #0 - str ip, [sp] - bl AssignTopScreenHandlers - b _022E89DC -_022E8940: - ldr ip, _022E8BB0 ; =FreeTeamStatsWrapper - ldr r1, _022E8BB4 ; =InitializeTeamStats - ldr r2, _022E8BB8 ; =UpdateTeamStatsWrapper - ldr r3, _022E8BBC ; =ov29_022E81C8 - add r0, r4, #0x14 - str ip, [sp] - bl AssignTopScreenHandlers - b _022E89DC -_022E8960: - ldr ip, _022E8BC0 ; =ov29_022E8588 - ldr r1, _022E8BC4 ; =ov29_022E8500 - ldr r3, _022E8BC8 ; =ov29_022E854C - add r0, r4, #0x14 - mov r2, #0 - str ip, [sp] - bl AssignTopScreenHandlers - b _022E89DC -_022E8980: - ldr ip, _022E8BCC ; =ov29_022E80D0 - ldr r1, _022E8BD0 ; =ov29_022E7F94 - ldr r2, _022E8BD4 ; =ov29_022E8018 - ldr r3, _022E8BD8 ; =ov29_022E8054 - add r0, r4, #0x14 - str ip, [sp] - bl AssignTopScreenHandlers - b _022E89DC -_022E89A0: - ldr ip, _022E8BDC ; =ov29_022E8630 - ldr r1, _022E8BE0 ; =ov29_022E85A8 - ldr r3, _022E8BE4 ; =ov29_022E85F4 - add r0, r4, #0x14 - mov r2, #0 - str ip, [sp] - bl AssignTopScreenHandlers - b _022E89DC -_022E89C0: - ldr ip, _022E8BE8 ; =ov29_022E86A8 - ldr r1, _022E8BEC ; =ov29_022E8650 - ldr r2, _022E8BF0 ; =ov29_022E869C - ldr r3, _022E8BF4 ; =ov29_022E86A4 - add r0, r4, #0x14 - str ip, [sp] - bl AssignTopScreenHandlers -_022E89DC: - ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR - ldrsh r1, [r4, #0x10] - ldr r0, [r0] - strh r1, [r0, #8] - ldr r0, [r4, #0x14] - cmp r0, #0 - beq _022E8A20 - ldr r0, _022E8BF8 ; =ov29_0235352C - ldr r0, [r0] - ldr r0, [r0, #0x30] - bl sub_0200B3D4 - ldr r0, _022E8BF8 ; =ov29_0235352C - ldr r0, [r0] - ldr r0, [r0, #0x30] - bl sub_0200B330 - ldr r0, [r4, #0x14] - blx r0 -_022E8A20: - mov r1, #0 - ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR - str r1, [r5, #0xc] - ldr r2, [r0] - ldrb r1, [r2, #0x2c] - cmp r1, #0 - movne r0, #3 - strne r0, [r2, #4] - ldmneia sp!, {r3, r4, r5, pc} - mov r1, #5 - str r1, [r2, #4] - ldr r0, [r0] - ldrb r0, [r0, #2] - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #1 - mov r2, r0 - mov r1, #0x4000 - bl StartFadeDungeonWrapper - ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR - mov r1, #4 - ldr r0, [r0] - str r1, [r0, #4] - ldmia sp!, {r3, r4, r5, pc} -_022E8A80: - ldrb r1, [r5, #0x2c] - cmp r1, #0 - ldmneia sp!, {r3, r4, r5, pc} - mov r1, #5 - str r1, [r5, #4] - ldr r0, [r0] - ldrb r0, [r0, #2] - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #1 - mov r2, r0 - mov r1, #0x4000 - bl StartFadeDungeonWrapper - ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR - mov r1, #4 - ldr r0, [r0] - str r1, [r0, #4] - ldmia sp!, {r3, r4, r5, pc} -_022E8AC8: - bl ov29_022E86E4 - ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldrb r0, [r0, #2] - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #1 - bl ov29_0234C70C - cmp r0, #0 - ldreq r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR - moveq r1, #5 - ldreq r0, [r0] - streq r1, [r0, #4] - ldmia sp!, {r3, r4, r5, pc} -_022E8B00: - bl ov29_022E86E4 - ldr r0, [r5, #0xc] - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR - ldr r2, [r0] - ldrb r1, [r2, #1] - strb r1, [r2, #2] - ldr r1, [r0] - ldrb r0, [r1, #2] - cmp r0, #0 - moveq r0, #6 - streq r0, [r1, #4] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #2 - mov r1, #0x4000 - mov r2, #1 - bl StartFadeDungeonWrapper - ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR - mov r1, #6 - ldr r0, [r0] - str r1, [r0, #4] - ldmia sp!, {r3, r4, r5, pc} -_022E8B5C: - ldrb r0, [r5, #2] - cmp r0, #0 - beq _022E8B78 - mov r0, #1 - bl ov29_0234C70C - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, pc} -_022E8B78: - bl FreeTopScreen - ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR - ldr r1, [r0] - ldrb r0, [r1, #0x2b] - cmp r0, #0 - movne r0, #1 - strne r0, [r1, #4] - moveq r0, #2 - streq r0, [r1, #4] - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_022E8BA0: .word TOP_SCREEN_STATUS_PTR -_022E8BA4: .word ov29_022E84B0 -_022E8BA8: .word ov29_022E840C -_022E8BAC: .word ov29_022E847C -_022E8BB0: .word FreeTeamStatsWrapper -_022E8BB4: .word InitializeTeamStats -_022E8BB8: .word UpdateTeamStatsWrapper -_022E8BBC: .word ov29_022E81C8 -_022E8BC0: .word ov29_022E8588 -_022E8BC4: .word ov29_022E8500 -_022E8BC8: .word ov29_022E854C -_022E8BCC: .word ov29_022E80D0 -_022E8BD0: .word ov29_022E7F94 -_022E8BD4: .word ov29_022E8018 -_022E8BD8: .word ov29_022E8054 -_022E8BDC: .word ov29_022E8630 -_022E8BE0: .word ov29_022E85A8 -_022E8BE4: .word ov29_022E85F4 -_022E8BE8: .word ov29_022E86A8 -_022E8BEC: .word ov29_022E8650 -_022E8BF0: .word ov29_022E869C -_022E8BF4: .word ov29_022E86A4 -_022E8BF8: .word ov29_0235352C - arm_func_end HandleTopScreenFades - - arm_func_start ov29_022E8BFC -ov29_022E8BFC: ; 0x022E8BFC - ldr r1, _022E8C0C ; =TOP_SCREEN_STATUS_PTR - ldr r1, [r1] - strb r0, [r1, #1] - bx lr - .align 2, 0 -_022E8C0C: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8BFC - - arm_func_start ov29_022E8C10 -ov29_022E8C10: ; 0x022E8C10 - stmdb sp!, {r3, lr} - ldr r0, _022E8C48 ; =TOP_SCREEN_STATUS_PTR - ldr r2, [r0] - cmp r2, #0 - ldmeqia sp!, {r3, pc} - ldrb r0, [r2, #0x2a] - cmp r0, #0 - ldmneia sp!, {r3, pc} - ldr r1, [r2, #0x1c] - cmp r1, #0 - ldmeqia sp!, {r3, pc} - add r0, r2, #0x14 - blx r1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E8C48: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8C10 - - arm_func_start FreeTopScreen -FreeTopScreen: ; 0x022E8C4C - stmdb sp!, {r3, r4, r5, lr} - ldr r0, _022E8CA4 ; =TOP_SCREEN_STATUS_PTR - ldr r4, [r0] - ldr r0, [r4, #0x20] - cmp r0, #0 - beq _022E8C98 - mov r0, #0 - str r0, [r4, #0x1c] - ldr r0, [r4, #0x20] - blx r0 - movs r5, r0 - beq _022E8C9C - mov r1, #0 - mov r2, r1 - mov r3, r1 - add r0, r4, #0x14 - str r1, [sp] - bl AssignTopScreenHandlers - b _022E8C9C -_022E8C98: - mov r5, #1 -_022E8C9C: - mov r0, r5 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_022E8CA4: .word TOP_SCREEN_STATUS_PTR - arm_func_end FreeTopScreen - - arm_func_start ov29_022E8CA8 -ov29_022E8CA8: ; 0x022E8CA8 - ldr r1, _022E8CE4 ; =TOP_SCREEN_STATUS_PTR - ldr r3, [r1] - ldrsh r2, [r3, #8] - cmp r2, r0 - ldrne r2, [r3, #0xc] - cmpne r2, #1 - bxeq lr - mov r2, #1 - str r2, [r3, #0xc] - ldr r3, [r1] - mov r2, #0 - strh r0, [r3, #0x10] - ldr r0, [r1] - strb r2, [r0, #0x28] - bx lr - .align 2, 0 -_022E8CE4: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8CA8 - - arm_func_start ov29_022E8CE8 -ov29_022E8CE8: ; 0x022E8CE8 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x54 - mov sb, #0 - ldr fp, _022E8E54 ; =0x000003E7 - mov r8, sb -_022E8CFC: - ldr r0, _022E8E58 ; =DUNGEON_PTR - ldr r1, [r0] - add r0, r1, r8, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r0, [r0, #0xa84] -#else - ldr r0, [r0, #0xb28] -#endif - cmp r0, #0 - moveq r0, #0 - beq _022E8D30 - ldr r0, [r0] - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff -_022E8D30: - cmp r0, #0 - beq _022E8DE4 - add r0, r1, r8, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r6, [r0, #0xa84] -#else - ldr r6, [r0, #0xb28] -#endif - ldr r0, _022E8E5C ; =TOP_SCREEN_STATUS_PTR - ldr r7, [r6, #0xb4] - ldr r0, [r0] - add r5, r0, #0xb8 - mov r0, #0x5c - smulbb r4, sb, r0 -#ifdef JAPAN - ldrb r0, [r7, #0x161] -#else - ldrb r0, [r7, #0x165] -#endif - cmp r0, #0 - bne _022E8DE4 - add r0, sp, #0x14 - mov r1, r7 - mov r2, #0 - bl ov29_0230027C - ldrsh r1, [r7, #0x12] - ldrsh r0, [r7, #0x16] - add sl, r1, r0 - cmp sl, fp - mov r0, r6 - movgt sl, fp - bl GetIdleAnimationId - ldrb r3, [r7, #0xa] - mov r1, sl, lsl #0x10 - mov r1, r1, asr #0x10 - str r3, [sp] - ldrsh r3, [r7, #0x10] - add r2, sp, #0x14 - str r3, [sp, #4] - str r1, [sp, #8] - ldrsh r1, [r6, #0xa8] - str r1, [sp, #0xc] - str r0, [sp, #0x10] - ldr r1, [r7, #0xb0] - ldrsh r3, [r7, #4] - mov r1, r1, lsl #0x10 - add r0, r5, r4 - mov r1, r1, asr #0x10 - bl ov10_022C1DE0 - add r0, sb, #1 - mov r0, r0, lsl #0x10 - mov sb, r0, asr #0x10 -_022E8DE4: - add r0, r8, #1 - mov r0, r0, lsl #0x10 - mov r8, r0, asr #0x10 - cmp r8, #4 - blt _022E8CFC - mov r0, #0x5c - smulbb r4, sb, r0 - mov r3, #0 - ldr r1, _022E8E5C ; =TOP_SCREEN_STATUS_PTR - b _022E8E24 -_022E8E0C: - ldr r2, [r1] - add r0, sb, #1 - add r2, r4, r2 - mov r0, r0, lsl #0x10 - strb r3, [r2, #0xb8] - mov sb, r0, asr #0x10 -_022E8E24: - cmp sb, #4 - blt _022E8E0C - ldr r0, _022E8E5C ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0xb8 - bl ov29_022DC684 - ldr r0, _022E8E5C ; =TOP_SCREEN_STATUS_PTR - mov r1, #1 - ldr r0, [r0] - strb r1, [r0, #0x228] - add sp, sp, #0x54 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022E8E54: .word 0x000003E7 -_022E8E58: .word DUNGEON_PTR -_022E8E5C: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8CE8 - - arm_func_start ov29_022E8E60 -ov29_022E8E60: ; 0x022E8E60 - stmdb sp!, {r4, lr} - mov r4, r0 - ldr r0, _022E8E90 ; =0x00003FCB - bl StringFromId - mov r1, #0 - mov r3, r0 - mov r0, r4 - mov r2, r1 - bl DrawTextInWindow - mov r0, r4 - bl UpdateWindow - ldmia sp!, {r4, pc} - .align 2, 0 -#if defined(EUROPE) -_022E8E90: .word 0x00003FCD -#elif defined(JAPAN) -_022E8E90: .word 0x000049CE -#else -_022E8E90: .word 0x00003FCB -#endif - arm_func_end ov29_022E8E60 - - arm_func_start ov29_022E8E94 -ov29_022E8E94: ; 0x022E8E94 - stmdb sp!, {r3, lr} - sub sp, sp, #0x10 - ldr r0, _022E8F1C ; =ov29_02353558 - ldr r0, [r0] - cmp r0, #0 - movne r0, #0 - bne _022E8F14 - mov r0, #0x54 - mov r1, #8 - bl MemAlloc - ldr r2, _022E8F1C ; =ov29_02353558 - mov r1, #0x54 - str r0, [r2] - bl MemZero - ldr r0, _022E8F20 ; =ov29_023515F4 - add ip, sp, #0 - ldmia r0, {r0, r1, r2, r3} - stmia ip, {r0, r1, r2, r3} - ldr r1, _022E8F24 ; =ov29_022E8E60 - mov r0, ip - bl CreateTextBox - ldr r1, _022E8F1C ; =ov29_02353558 - ldr r2, [r1] - strb r0, [r2] - ldr r0, [r1] - add r0, r0, #4 - bl InitPreprocessorArgs - ldr r0, _022E8F1C ; =ov29_02353558 - mov r2, #0x10000 - ldr r1, [r0] - mov r0, #1 - str r2, [r1, #0x50] -_022E8F14: - add sp, sp, #0x10 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E8F1C: .word ov29_02353558 -_022E8F20: .word ov29_023515F4 -_022E8F24: .word ov29_022E8E60 - arm_func_end ov29_022E8E94 - - arm_func_start ov29_022E8F28 -ov29_022E8F28: ; 0x022E8F28 - stmdb sp!, {r3, lr} - ldr r0, _022E8F74 ; =ov29_02353558 - ldr r0, [r0] - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, pc} - ldrsb r0, [r0] - bl CloseTextBox2 - ldr r0, _022E8F74 ; =ov29_02353558 - mvn r2, #1 - ldr r1, [r0] - strb r2, [r1] - ldr r0, [r0] - bl MemFree - ldr r0, _022E8F74 ; =ov29_02353558 - mov r1, #0 - str r1, [r0] - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E8F74: .word ov29_02353558 - arm_func_end ov29_022E8F28 - - arm_func_start ov29_022E8F78 -ov29_022E8F78: ; 0x022E8F78 - stmdb sp!, {r4, lr} - ldrb r1, [r0] - cmp r1, #0 - ldmeqia sp!, {r4, pc} - mov r1, #0 - strb r1, [r0] - ldr r1, _022E8FC4 ; =ov29_02353558 - ldr r0, _022E8FC8 ; =0x00003FCB - ldr r1, [r1] - ldrsb r4, [r1] - bl StringFromId - mov r1, #0 - mov r3, r0 - mov r0, r4 - mov r2, r1 - bl DrawTextInWindow - mov r0, r4 - bl UpdateWindow - ldmia sp!, {r4, pc} - .align 2, 0 -_022E8FC4: .word ov29_02353558 -#if defined(EUROPE) -_022E8FC8: .word 0x00003FCD -#elif defined(JAPAN) -_022E8FC8: .word 0x000049CE -#else -_022E8FC8: .word 0x00003FCB -#endif - arm_func_end ov29_022E8F78 - - arm_func_start ov29_022E8FCC -ov29_022E8FCC: ; 0x022E8FCC - stmdb sp!, {r3, lr} - ldr r0, _022E8FF4 ; =DUNGEON_PTR - ldr r1, [r0] - add r0, r1, #0x700 - ldrsb r0, [r0, #0x98] - ldrb r1, [r1, #0x748] - bl ov29_0234F25C - bl ov29_0234F278 - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E8FF4: .word DUNGEON_PTR - arm_func_end ov29_022E8FCC - - arm_func_start ov29_022E8FF8 -ov29_022E8FF8: ; 0x022E8FF8 - stmdb sp!, {r3, lr} - bl ov29_0234F2B8 - mov r0, #1 - ldmia sp!, {r3, pc} - arm_func_end ov29_022E8FF8 - - arm_func_start ov29_022E9008 -ov29_022E9008: ; 0x022E9008 - ldr ip, _022E9010 ; =ov29_0234F290 - bx ip - .align 2, 0 -_022E9010: .word ov29_0234F290 - arm_func_end ov29_022E9008 - - arm_func_start ov29_022E9014 -ov29_022E9014: ; 0x022E9014 - ldrb r0, [r0] - cmp r0, #0 - bx lr - arm_func_end ov29_022E9014 diff --git a/asm/overlay_29_022E7EC4.s b/asm/overlay_29_022E7EC4.s new file mode 100644 index 00000000..5dc89826 --- /dev/null +++ b/asm/overlay_29_022E7EC4.s @@ -0,0 +1,1454 @@ + .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 ov29_022E8CA8 +_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 ov29_022E8500 +ov29_022E8500: ; 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 ov29_022E8E94 + add sp, sp, #0x14 + ldmia sp!, {pc} + .align 2, 0 +_022E8548: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E8500 + + 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 ov29_022E8588 +ov29_022E8588: ; 0x022E8588 + stmdb sp!, {r3, lr} + ldr r0, _022E85A4 ; =TOP_SCREEN_STATUS_PTR + ldr r0, [r0] + add r0, r0, #0x80 + bl ov10_022C2278 + bl ov29_022E8F28 + ldmia sp!, {r3, pc} + .align 2, 0 +_022E85A4: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E8588 + + 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 + + arm_func_start ov29_022E869C +ov29_022E869C: ; 0x022E869C + mov r0, #1 + bx lr + arm_func_end ov29_022E869C + + arm_func_start ov29_022E86A4 +ov29_022E86A4: ; 0x022E86A4 + bx lr + arm_func_end ov29_022E86A4 + + arm_func_start ov29_022E86A8 +ov29_022E86A8: ; 0x022E86A8 + stmdb sp!, {r3, lr} + ldr r0, _022E86C4 ; =TOP_SCREEN_STATUS_PTR + ldr r0, [r0] + add r0, r0, #0x80 + bl ov10_022C2278 + mov r0, #1 + ldmia sp!, {r3, pc} + .align 2, 0 +_022E86C4: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E86A8 + + arm_func_start AssignTopScreenHandlers +AssignTopScreenHandlers: ; 0x022E86C8 + str r1, [r0] + ldr r1, [sp] + stmib r0, {r2, r3} + str r1, [r0, #0xc] + mov r1, #1 + strb r1, [r0, #0x10] + bx lr + arm_func_end AssignTopScreenHandlers + + arm_func_start ov29_022E86E4 +ov29_022E86E4: ; 0x022E86E4 + stmdb sp!, {r3, lr} + ldr r0, _022E8704 ; =TOP_SCREEN_STATUS_PTR + ldr r0, [r0] + ldr r0, [r0, #0x18] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + blx r0 + ldmia sp!, {r3, pc} + .align 2, 0 +_022E8704: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E86E4 + + arm_func_start ov29_022E8708 +ov29_022E8708: ; 0x022E8708 + stmdb sp!, {r3, lr} + bl GetTopScreenOption + cmp r0, #3 + bne _022E8724 + mov r0, #3 + bl ov29_022E8CA8 + ldmia sp!, {r3, pc} +_022E8724: + cmp r0, #2 + bne _022E8738 + mov r0, #0 + bl ov29_022E8CA8 + ldmia sp!, {r3, pc} +_022E8738: + cmp r0, #0 + bne _022E874C + mov r0, #2 + bl ov29_022E8CA8 + ldmia sp!, {r3, pc} +_022E874C: + cmp r0, #4 + bne _022E8760 + mov r0, #4 + bl ov29_022E8CA8 + ldmia sp!, {r3, pc} +_022E8760: + bl ov29_022E81F8 + ldmia sp!, {r3, pc} + arm_func_end ov29_022E8708 + + arm_func_start ov29_022E8768 +ov29_022E8768: ; 0x022E8768 + ldr ip, _022E8774 ; =ov29_022E8CA8 + mov r0, #5 + bx ip + .align 2, 0 +_022E8774: .word ov29_022E8CA8 + arm_func_end ov29_022E8768 + + arm_func_start ov29_022E8778 +ov29_022E8778: ; 0x022E8778 + stmdb sp!, {r3, lr} + ldr r0, _022E87B0 ; =TOP_SCREEN_STATUS_PTR + mov r3, #3 + ldr r2, [r0] + sub r1, r3, #4 + str r3, [r2, #0xc] + ldr r0, [r0] + strh r1, [r0, #0x10] + bl ov29_022E8104 + ldr r0, _022E87B0 ; =TOP_SCREEN_STATUS_PTR + ldr r1, [r0] + ldrsh r0, [r1, #0x10] + strh r0, [r1, #8] + ldmia sp!, {r3, pc} + .align 2, 0 +_022E87B0: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E8778 + + arm_func_start ov29_022E87B4 +ov29_022E87B4: ; 0x022E87B4 + ldr r1, _022E87D8 ; =TOP_SCREEN_STATUS_PTR + ldr r2, [r1] + ldrsh r1, [r2, #8] + cmp r1, r0 + ldreq r0, [r2, #4] + cmpeq r0, #5 + moveq r0, #1 + movne r0, #0 + bx lr + .align 2, 0 +_022E87D8: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E87B4 + + arm_func_start ov29_022E87DC +ov29_022E87DC: ; 0x022E87DC + stmdb sp!, {r3, lr} + bl GetTopScreenOption + ldr r1, _022E87F8 ; =ov29_023515E8 + mov r0, r0, lsl #1 + ldrsh r0, [r1, r0] + bl ov29_022E87B4 + ldmia sp!, {r3, pc} + .align 2, 0 +_022E87F8: .word ov29_023515E8 + arm_func_end ov29_022E87DC + + arm_func_start ov29_022E87FC +ov29_022E87FC: ; 0x022E87FC + ldr r1, _022E880C ; =TOP_SCREEN_STATUS_PTR + ldr r1, [r1] + strb r0, [r1, #0x2b] + bx lr + .align 2, 0 +_022E880C: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E87FC + + arm_func_start ov29_022E8810 +ov29_022E8810: ; 0x022E8810 + ldr r0, _022E8830 ; =TOP_SCREEN_STATUS_PTR + ldr r0, [r0] + ldr r0, [r0, #4] + cmp r0, #1 + moveq r0, #1 + movne r0, #0 + and r0, r0, #0xff + bx lr + .align 2, 0 +_022E8830: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E8810 + + arm_func_start ov29_022E8834 +ov29_022E8834: ; 0x022E8834 + ldr r1, _022E8844 ; =TOP_SCREEN_STATUS_PTR + ldr r1, [r1] + strb r0, [r1, #0x2c] + bx lr + .align 2, 0 +_022E8844: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E8834 + + arm_func_start ov29_022E8848 +ov29_022E8848: ; 0x022E8848 + ldr r0, _022E8868 ; =TOP_SCREEN_STATUS_PTR + ldr r0, [r0] + ldr r0, [r0, #4] + cmp r0, #3 + moveq r0, #1 + movne r0, #0 + and r0, r0, #0xff + bx lr + .align 2, 0 +_022E8868: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E8848 + + arm_func_start HandleTopScreenFades +HandleTopScreenFades: ; 0x022E886C + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR + ldr r5, [r0] + cmp r5, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r1, [r5, #4] + cmp r1, #6 + addls pc, pc, r1, lsl #2 + ldmia sp!, {r3, r4, r5, pc} +_022E8890: ; jump table + ldmia sp!, {r3, r4, r5, pc} ; case 0 + b _022E88AC ; case 1 + b _022E88C0 ; case 2 + b _022E8A80 ; case 3 + b _022E8AC8 ; case 4 + b _022E8B00 ; case 5 + b _022E8B5C ; case 6 +_022E88AC: + ldrb r0, [r5, #0x2b] + cmp r0, #0 + moveq r0, #2 + streq r0, [r5, #4] + ldmia sp!, {r3, r4, r5, pc} +_022E88C0: + ldrb r0, [r5, #2] + cmp r0, #0 + beq _022E88EC + mov r0, #1 + bl ov29_0234C70C + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR + mov r1, #5 + ldr r0, [r0] + str r1, [r0, #4] +_022E88EC: + bl FreeTopScreen + ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR + ldr r4, [r0] + ldrsh r0, [r4, #0x10] + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _022E89DC +_022E8908: ; jump table + b _022E8920 ; case 0 + b _022E8940 ; case 1 + b _022E8960 ; case 2 + b _022E8980 ; case 3 + b _022E89A0 ; case 4 + b _022E89C0 ; case 5 +_022E8920: + ldr ip, _022E8BA4 ; =ov29_022E84B0 + ldr r1, _022E8BA8 ; =ov29_022E840C + ldr r3, _022E8BAC ; =ov29_022E847C + add r0, r4, #0x14 + mov r2, #0 + str ip, [sp] + bl AssignTopScreenHandlers + b _022E89DC +_022E8940: + ldr ip, _022E8BB0 ; =FreeTeamStatsWrapper + ldr r1, _022E8BB4 ; =InitializeTeamStats + ldr r2, _022E8BB8 ; =UpdateTeamStatsWrapper + ldr r3, _022E8BBC ; =ov29_022E81C8 + add r0, r4, #0x14 + str ip, [sp] + bl AssignTopScreenHandlers + b _022E89DC +_022E8960: + ldr ip, _022E8BC0 ; =ov29_022E8588 + ldr r1, _022E8BC4 ; =ov29_022E8500 + ldr r3, _022E8BC8 ; =ov29_022E854C + add r0, r4, #0x14 + mov r2, #0 + str ip, [sp] + bl AssignTopScreenHandlers + b _022E89DC +_022E8980: + ldr ip, _022E8BCC ; =ov29_022E80D0 + ldr r1, _022E8BD0 ; =ov29_022E7F94 + ldr r2, _022E8BD4 ; =ov29_022E8018 + ldr r3, _022E8BD8 ; =ov29_022E8054 + add r0, r4, #0x14 + str ip, [sp] + bl AssignTopScreenHandlers + b _022E89DC +_022E89A0: + ldr ip, _022E8BDC ; =ov29_022E8630 + ldr r1, _022E8BE0 ; =ov29_022E85A8 + ldr r3, _022E8BE4 ; =ov29_022E85F4 + add r0, r4, #0x14 + mov r2, #0 + str ip, [sp] + bl AssignTopScreenHandlers + b _022E89DC +_022E89C0: + ldr ip, _022E8BE8 ; =ov29_022E86A8 + ldr r1, _022E8BEC ; =ov29_022E8650 + ldr r2, _022E8BF0 ; =ov29_022E869C + ldr r3, _022E8BF4 ; =ov29_022E86A4 + add r0, r4, #0x14 + str ip, [sp] + bl AssignTopScreenHandlers +_022E89DC: + ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR + ldrsh r1, [r4, #0x10] + ldr r0, [r0] + strh r1, [r0, #8] + ldr r0, [r4, #0x14] + cmp r0, #0 + beq _022E8A20 + ldr r0, _022E8BF8 ; =ov29_0235352C + ldr r0, [r0] + ldr r0, [r0, #0x30] + bl sub_0200B3D4 + ldr r0, _022E8BF8 ; =ov29_0235352C + ldr r0, [r0] + ldr r0, [r0, #0x30] + bl sub_0200B330 + ldr r0, [r4, #0x14] + blx r0 +_022E8A20: + mov r1, #0 + ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR + str r1, [r5, #0xc] + ldr r2, [r0] + ldrb r1, [r2, #0x2c] + cmp r1, #0 + movne r0, #3 + strne r0, [r2, #4] + ldmneia sp!, {r3, r4, r5, pc} + mov r1, #5 + str r1, [r2, #4] + ldr r0, [r0] + ldrb r0, [r0, #2] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #1 + mov r2, r0 + mov r1, #0x4000 + bl StartFadeDungeonWrapper + ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR + mov r1, #4 + ldr r0, [r0] + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, pc} +_022E8A80: + ldrb r1, [r5, #0x2c] + cmp r1, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r1, #5 + str r1, [r5, #4] + ldr r0, [r0] + ldrb r0, [r0, #2] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #1 + mov r2, r0 + mov r1, #0x4000 + bl StartFadeDungeonWrapper + ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR + mov r1, #4 + ldr r0, [r0] + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, pc} +_022E8AC8: + bl ov29_022E86E4 + ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR + ldr r0, [r0] + ldrb r0, [r0, #2] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #1 + bl ov29_0234C70C + cmp r0, #0 + ldreq r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR + moveq r1, #5 + ldreq r0, [r0] + streq r1, [r0, #4] + ldmia sp!, {r3, r4, r5, pc} +_022E8B00: + bl ov29_022E86E4 + ldr r0, [r5, #0xc] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR + ldr r2, [r0] + ldrb r1, [r2, #1] + strb r1, [r2, #2] + ldr r1, [r0] + ldrb r0, [r1, #2] + cmp r0, #0 + moveq r0, #6 + streq r0, [r1, #4] + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #2 + mov r1, #0x4000 + mov r2, #1 + bl StartFadeDungeonWrapper + ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR + mov r1, #6 + ldr r0, [r0] + str r1, [r0, #4] + ldmia sp!, {r3, r4, r5, pc} +_022E8B5C: + ldrb r0, [r5, #2] + cmp r0, #0 + beq _022E8B78 + mov r0, #1 + bl ov29_0234C70C + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, pc} +_022E8B78: + bl FreeTopScreen + ldr r0, _022E8BA0 ; =TOP_SCREEN_STATUS_PTR + ldr r1, [r0] + ldrb r0, [r1, #0x2b] + cmp r0, #0 + movne r0, #1 + strne r0, [r1, #4] + moveq r0, #2 + streq r0, [r1, #4] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_022E8BA0: .word TOP_SCREEN_STATUS_PTR +_022E8BA4: .word ov29_022E84B0 +_022E8BA8: .word ov29_022E840C +_022E8BAC: .word ov29_022E847C +_022E8BB0: .word FreeTeamStatsWrapper +_022E8BB4: .word InitializeTeamStats +_022E8BB8: .word UpdateTeamStatsWrapper +_022E8BBC: .word ov29_022E81C8 +_022E8BC0: .word ov29_022E8588 +_022E8BC4: .word ov29_022E8500 +_022E8BC8: .word ov29_022E854C +_022E8BCC: .word ov29_022E80D0 +_022E8BD0: .word ov29_022E7F94 +_022E8BD4: .word ov29_022E8018 +_022E8BD8: .word ov29_022E8054 +_022E8BDC: .word ov29_022E8630 +_022E8BE0: .word ov29_022E85A8 +_022E8BE4: .word ov29_022E85F4 +_022E8BE8: .word ov29_022E86A8 +_022E8BEC: .word ov29_022E8650 +_022E8BF0: .word ov29_022E869C +_022E8BF4: .word ov29_022E86A4 +_022E8BF8: .word ov29_0235352C + arm_func_end HandleTopScreenFades + + arm_func_start ov29_022E8BFC +ov29_022E8BFC: ; 0x022E8BFC + ldr r1, _022E8C0C ; =TOP_SCREEN_STATUS_PTR + ldr r1, [r1] + strb r0, [r1, #1] + bx lr + .align 2, 0 +_022E8C0C: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E8BFC + + arm_func_start ov29_022E8C10 +ov29_022E8C10: ; 0x022E8C10 + stmdb sp!, {r3, lr} + ldr r0, _022E8C48 ; =TOP_SCREEN_STATUS_PTR + ldr r2, [r0] + cmp r2, #0 + ldmeqia sp!, {r3, pc} + ldrb r0, [r2, #0x2a] + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r1, [r2, #0x1c] + cmp r1, #0 + ldmeqia sp!, {r3, pc} + add r0, r2, #0x14 + blx r1 + ldmia sp!, {r3, pc} + .align 2, 0 +_022E8C48: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E8C10 + + arm_func_start FreeTopScreen +FreeTopScreen: ; 0x022E8C4C + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _022E8CA4 ; =TOP_SCREEN_STATUS_PTR + ldr r4, [r0] + ldr r0, [r4, #0x20] + cmp r0, #0 + beq _022E8C98 + mov r0, #0 + str r0, [r4, #0x1c] + ldr r0, [r4, #0x20] + blx r0 + movs r5, r0 + beq _022E8C9C + mov r1, #0 + mov r2, r1 + mov r3, r1 + add r0, r4, #0x14 + str r1, [sp] + bl AssignTopScreenHandlers + b _022E8C9C +_022E8C98: + mov r5, #1 +_022E8C9C: + mov r0, r5 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_022E8CA4: .word TOP_SCREEN_STATUS_PTR + arm_func_end FreeTopScreen + + arm_func_start ov29_022E8CA8 +ov29_022E8CA8: ; 0x022E8CA8 + ldr r1, _022E8CE4 ; =TOP_SCREEN_STATUS_PTR + ldr r3, [r1] + ldrsh r2, [r3, #8] + cmp r2, r0 + ldrne r2, [r3, #0xc] + cmpne r2, #1 + bxeq lr + mov r2, #1 + str r2, [r3, #0xc] + ldr r3, [r1] + mov r2, #0 + strh r0, [r3, #0x10] + ldr r0, [r1] + strb r2, [r0, #0x28] + bx lr + .align 2, 0 +_022E8CE4: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E8CA8 + + arm_func_start ov29_022E8CE8 +ov29_022E8CE8: ; 0x022E8CE8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x54 + mov sb, #0 + ldr fp, _022E8E54 ; =0x000003E7 + mov r8, sb +_022E8CFC: + ldr r0, _022E8E58 ; =DUNGEON_PTR + ldr r1, [r0] + add r0, r1, r8, lsl #2 + add r0, r0, #0x12000 +#ifdef JAPAN + ldr r0, [r0, #0xa84] +#else + ldr r0, [r0, #0xb28] +#endif + cmp r0, #0 + moveq r0, #0 + beq _022E8D30 + ldr r0, [r0] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + and r0, r0, #0xff +_022E8D30: + cmp r0, #0 + beq _022E8DE4 + add r0, r1, r8, lsl #2 + add r0, r0, #0x12000 +#ifdef JAPAN + ldr r6, [r0, #0xa84] +#else + ldr r6, [r0, #0xb28] +#endif + ldr r0, _022E8E5C ; =TOP_SCREEN_STATUS_PTR + ldr r7, [r6, #0xb4] + ldr r0, [r0] + add r5, r0, #0xb8 + mov r0, #0x5c + smulbb r4, sb, r0 +#ifdef JAPAN + ldrb r0, [r7, #0x161] +#else + ldrb r0, [r7, #0x165] +#endif + cmp r0, #0 + bne _022E8DE4 + add r0, sp, #0x14 + mov r1, r7 + mov r2, #0 + bl ov29_0230027C + ldrsh r1, [r7, #0x12] + ldrsh r0, [r7, #0x16] + add sl, r1, r0 + cmp sl, fp + mov r0, r6 + movgt sl, fp + bl GetIdleAnimationId + ldrb r3, [r7, #0xa] + mov r1, sl, lsl #0x10 + mov r1, r1, asr #0x10 + str r3, [sp] + ldrsh r3, [r7, #0x10] + add r2, sp, #0x14 + str r3, [sp, #4] + str r1, [sp, #8] + ldrsh r1, [r6, #0xa8] + str r1, [sp, #0xc] + str r0, [sp, #0x10] + ldr r1, [r7, #0xb0] + ldrsh r3, [r7, #4] + mov r1, r1, lsl #0x10 + add r0, r5, r4 + mov r1, r1, asr #0x10 + bl ov10_022C1DE0 + add r0, sb, #1 + mov r0, r0, lsl #0x10 + mov sb, r0, asr #0x10 +_022E8DE4: + add r0, r8, #1 + mov r0, r0, lsl #0x10 + mov r8, r0, asr #0x10 + cmp r8, #4 + blt _022E8CFC + mov r0, #0x5c + smulbb r4, sb, r0 + mov r3, #0 + ldr r1, _022E8E5C ; =TOP_SCREEN_STATUS_PTR + b _022E8E24 +_022E8E0C: + ldr r2, [r1] + add r0, sb, #1 + add r2, r4, r2 + mov r0, r0, lsl #0x10 + strb r3, [r2, #0xb8] + mov sb, r0, asr #0x10 +_022E8E24: + cmp sb, #4 + blt _022E8E0C + ldr r0, _022E8E5C ; =TOP_SCREEN_STATUS_PTR + ldr r0, [r0] + add r0, r0, #0xb8 + bl ov29_022DC684 + ldr r0, _022E8E5C ; =TOP_SCREEN_STATUS_PTR + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0x228] + add sp, sp, #0x54 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_022E8E54: .word 0x000003E7 +_022E8E58: .word DUNGEON_PTR +_022E8E5C: .word TOP_SCREEN_STATUS_PTR + arm_func_end ov29_022E8CE8 + + arm_func_start ov29_022E8E60 +ov29_022E8E60: ; 0x022E8E60 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, _022E8E90 ; =0x00003FCB + bl StringFromId + mov r1, #0 + mov r3, r0 + mov r0, r4 + mov r2, r1 + bl DrawTextInWindow + mov r0, r4 + bl UpdateWindow + ldmia sp!, {r4, pc} + .align 2, 0 +#if defined(EUROPE) +_022E8E90: .word 0x00003FCD +#elif defined(JAPAN) +_022E8E90: .word 0x000049CE +#else +_022E8E90: .word 0x00003FCB +#endif + arm_func_end ov29_022E8E60 + + arm_func_start ov29_022E8E94 +ov29_022E8E94: ; 0x022E8E94 + stmdb sp!, {r3, lr} + sub sp, sp, #0x10 + ldr r0, _022E8F1C ; =ov29_02353558 + ldr r0, [r0] + cmp r0, #0 + movne r0, #0 + bne _022E8F14 + mov r0, #0x54 + mov r1, #8 + bl MemAlloc + ldr r2, _022E8F1C ; =ov29_02353558 + mov r1, #0x54 + str r0, [r2] + bl MemZero + ldr r0, _022E8F20 ; =ov29_023515F4 + add ip, sp, #0 + ldmia r0, {r0, r1, r2, r3} + stmia ip, {r0, r1, r2, r3} + ldr r1, _022E8F24 ; =ov29_022E8E60 + mov r0, ip + bl CreateTextBox + ldr r1, _022E8F1C ; =ov29_02353558 + ldr r2, [r1] + strb r0, [r2] + ldr r0, [r1] + add r0, r0, #4 + bl InitPreprocessorArgs + ldr r0, _022E8F1C ; =ov29_02353558 + mov r2, #0x10000 + ldr r1, [r0] + mov r0, #1 + str r2, [r1, #0x50] +_022E8F14: + add sp, sp, #0x10 + ldmia sp!, {r3, pc} + .align 2, 0 +_022E8F1C: .word ov29_02353558 +_022E8F20: .word ov29_023515F4 +_022E8F24: .word ov29_022E8E60 + arm_func_end ov29_022E8E94 + + arm_func_start ov29_022E8F28 +ov29_022E8F28: ; 0x022E8F28 + stmdb sp!, {r3, lr} + ldr r0, _022E8F74 ; =ov29_02353558 + ldr r0, [r0] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldrsb r0, [r0] + bl CloseTextBox2 + ldr r0, _022E8F74 ; =ov29_02353558 + mvn r2, #1 + ldr r1, [r0] + strb r2, [r1] + ldr r0, [r0] + bl MemFree + ldr r0, _022E8F74 ; =ov29_02353558 + mov r1, #0 + str r1, [r0] + mov r0, #1 + ldmia sp!, {r3, pc} + .align 2, 0 +_022E8F74: .word ov29_02353558 + arm_func_end ov29_022E8F28 + + arm_func_start ov29_022E8F78 +ov29_022E8F78: ; 0x022E8F78 + stmdb sp!, {r4, lr} + ldrb r1, [r0] + cmp r1, #0 + ldmeqia sp!, {r4, pc} + mov r1, #0 + strb r1, [r0] + ldr r1, _022E8FC4 ; =ov29_02353558 + ldr r0, _022E8FC8 ; =0x00003FCB + ldr r1, [r1] + ldrsb r4, [r1] + bl StringFromId + mov r1, #0 + mov r3, r0 + mov r0, r4 + mov r2, r1 + bl DrawTextInWindow + mov r0, r4 + bl UpdateWindow + ldmia sp!, {r4, pc} + .align 2, 0 +_022E8FC4: .word ov29_02353558 +#if defined(EUROPE) +_022E8FC8: .word 0x00003FCD +#elif defined(JAPAN) +_022E8FC8: .word 0x000049CE +#else +_022E8FC8: .word 0x00003FCB +#endif + arm_func_end ov29_022E8F78 + + arm_func_start ov29_022E8FCC +ov29_022E8FCC: ; 0x022E8FCC + stmdb sp!, {r3, lr} + ldr r0, _022E8FF4 ; =DUNGEON_PTR + ldr r1, [r0] + add r0, r1, #0x700 + ldrsb r0, [r0, #0x98] + ldrb r1, [r1, #0x748] + bl ov29_0234F25C + bl ov29_0234F278 + mov r0, #1 + ldmia sp!, {r3, pc} + .align 2, 0 +_022E8FF4: .word DUNGEON_PTR + arm_func_end ov29_022E8FCC + + arm_func_start ov29_022E8FF8 +ov29_022E8FF8: ; 0x022E8FF8 + stmdb sp!, {r3, lr} + bl ov29_0234F2B8 + mov r0, #1 + ldmia sp!, {r3, pc} + arm_func_end ov29_022E8FF8 + + arm_func_start ov29_022E9008 +ov29_022E9008: ; 0x022E9008 + ldr ip, _022E9010 ; =ov29_0234F290 + bx ip + .align 2, 0 +_022E9010: .word ov29_0234F290 + arm_func_end ov29_022E9008 + + arm_func_start ov29_022E9014 +ov29_022E9014: ; 0x022E9014 + ldrb r0, [r0] + cmp r0, #0 + bx lr + arm_func_end ov29_022E9014 diff --git a/include/dungeon_mode.h b/include/dungeon_mode.h index 4e686d30..963aa0f7 100644 --- a/include/dungeon_mode.h +++ b/include/dungeon_mode.h @@ -835,10 +835,9 @@ struct mission_destination_info { // Contains data about a monster that spawns in a dungeon struct monster_spawn_entry { u16 level_mult_512; // 0x0: Spawn level << 9 - // 0x2: Incremental spawn weight of this entry for normal spawns - u16 incremental_spawn_weight; - // 0x4: Incremental spawn weight of this entry for monster house spawns - u16 incremental_spawn_weight_monster_house; + // 0x2: Incremental spawn weights for this entry. + // [0] = normal spawn weight, [1] = monster house spawn weight + u16 incremental_spawn_weight[2]; // 0x6: Monster id. Depending on where this struct is used, it can have values above 600 // to list secondary gender entries. enum monster_id id; diff --git a/include/spawn.h b/include/spawn.h new file mode 100644 index 00000000..64c11a13 --- /dev/null +++ b/include/spawn.h @@ -0,0 +1,9 @@ +#ifndef PMDSKY_SPAWN_H +#define PMDSKY_SPAWN_H + +// Weight type index is 0 for normal spawns and 1 for monster house spawns. +// Returns a monster ID. +s32 GetMonsterIdToSpawn(s32 weight_type_idx); +s32 GetMonsterLevelToSpawn(s32 monster_id); + +#endif //PMDSKY_SPAWN_H diff --git a/main.lsf b/main.lsf index a6b86ae7..786f4475 100644 --- a/main.lsf +++ b/main.lsf @@ -453,6 +453,8 @@ Overlay OVY_29 Object asm/overlay_29_022E335C.o Object src/dg_effect.o Object asm/overlay_29_022E37DC.o + Object src/spawn.o + Object asm/overlay_29_022E7EC4.o Object src/position_util.o Object asm/overlay_29_rodata_02351628.o Object src/dungeon_range.o diff --git a/src/spawn.c b/src/spawn.c new file mode 100644 index 00000000..a0ba8ba2 --- /dev/null +++ b/src/spawn.c @@ -0,0 +1,42 @@ +#include "dg_random.h" +#include "dungeon.h" +#include "overlay_29_022F73B4.h" +#include "spawn.h" + +extern s32 GetMonsterIdFromSpawnEntry(struct monster_spawn_entry *); +extern s32 GetMonsterLevelFromSpawnEntry(struct monster_spawn_entry *); + +s32 GetMonsterIdToSpawn(s32 weight_type_idx) +{ + s32 rand = DungeonRandInt(10000); + s32 i; + + for (i = 0; i < DUNGEON_PTR[0]->monster_spawn_entries_length; i++) { + s16 threshold = DUNGEON_PTR[0]->spawn_entries[i].incremental_spawn_weight[weight_type_idx]; + if (threshold != 0 && threshold >= rand) { + return GetMonsterIdFromSpawnEntry( + (struct monster_spawn_entry *) &DUNGEON_PTR[0]->spawn_entries[i]); + } + } + + for (i = 0; i < DUNGEON_PTR[0]->monster_spawn_entries_length; i++) { + s16 threshold = DUNGEON_PTR[0]->spawn_entries[i].incremental_spawn_weight[weight_type_idx]; + if (threshold != 0) { + return GetMonsterIdFromSpawnEntry( + (struct monster_spawn_entry *) &DUNGEON_PTR[0]->spawn_entries[i]); + } + } + + return GetKecleonIdToSpawnByFloor(); +} + +s32 GetMonsterLevelToSpawn(s32 monster_id) { + for(s32 i = 0; i < DUNGEON_PTR[0]->monster_spawn_entries_length; i++) { + s32 entry_mon_id = GetMonsterIdFromSpawnEntry(&DUNGEON_PTR[0]->spawn_entries[i]); + if(monster_id == entry_mon_id) { + return GetMonsterLevelFromSpawnEntry(&DUNGEON_PTR[0]->spawn_entries[i]); + } + } + + return 1; +}