From 25d5994bdf834ee8b69f8dda53ee1dba36cc4fed Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Wed, 19 Aug 2026 17:43:26 -0700 Subject: [PATCH] Decomp ten dungeon utilities; drop a provisional GetLeaderMonster extern GetLeaderMonster, SetDungeonRngPreseed, GetDungeonRngPreseed, SetDungeonRngPreseed23Bit, FindClosestUnoccupiedTileWithin2, FindFarthestUnoccupiedTileWithin2, FindUnoccupiedTileWithin3, FixedRoomActionParamToDirection, ov29_022E9FC0 and ov29_022E9FD0. The three preseed accessors read and write prng_state::preseed at offset 8, using the struct dg_random.h already defines. SetDungeonRngPreseed23Bit sets bit 0 and masks the top byte, which is where its name comes from. GetLeaderMonster merged into dg_uty.h alongside GetLeader, so the provisional `extern struct monster *GetLeaderMonster();` that src/overlay_29_022F0EDC.c carried is removed -- that file already includes dg_uty.h, which now declares it properly with a (void) parameter list. The three FindNearbyUnoccupiedTile wrappers pass a displacement table and a count (0x19 within 2, 0x31 within 3). That helper and its tables are undeclared in the tree, so their prototypes are written from these call sites and are provisional. Authored by Claude (Opus 5) under human direction. All ten verified at score 0. Confirmed by a matching build: build/pmdsky.us/pmdsky.us.nds: OK. None carries a region conditional, so US alone is sufficient. Co-Authored-By: Claude Opus 5 --- asm/include/overlay_29_022E9628.inc | 8 + asm/include/overlay_29_022E9A44.inc | 14 + ...9_022E9618.inc => overlay_29_022E9FE0.inc} | 31 +- asm/include/overlay_29_022EA980.inc | 2 + asm/include/overlay_29_02341E6C.inc | 48 +- asm/include/overlay_29_02343980.inc | 37 + asm/overlay_29_022E9618.s | 1564 ----------------- asm/overlay_29_022E9628.s | 290 +++ asm/overlay_29_022E9A44.s | 414 +++++ asm/overlay_29_022E9FE0.s | 753 ++++++++ asm/overlay_29_022EA980.s | 28 + asm/overlay_29_02341E6C.s | 657 ------- asm/overlay_29_02343980.s | 652 +++++++ include/dg_uty.h | 3 + include/overlay_29_022E99F0.h | 10 + include/overlay_29_022E9FC0.h | 9 + include/overlay_29_022EA968.h | 8 + include/overlay_29_022EA9CC.h | 9 + include/overlay_29_0234396C.h | 8 + main.lsf | 11 +- src/dg_uty.c | 5 + src/overlay_29_022E99F0.c | 25 + src/overlay_29_022E9FC0.c | 21 + src/overlay_29_022EA968.c | 9 + src/overlay_29_022EA9CC.c | 14 + src/overlay_29_022F0EDC.c | 1 - src/overlay_29_0234396C.c | 10 + 27 files changed, 2357 insertions(+), 2284 deletions(-) create mode 100644 asm/include/overlay_29_022E9628.inc create mode 100644 asm/include/overlay_29_022E9A44.inc rename asm/include/{overlay_29_022E9618.inc => overlay_29_022E9FE0.inc} (63%) create mode 100644 asm/include/overlay_29_022EA980.inc create mode 100644 asm/include/overlay_29_02343980.inc delete mode 100644 asm/overlay_29_022E9618.s create mode 100644 asm/overlay_29_022E9628.s create mode 100644 asm/overlay_29_022E9A44.s create mode 100644 asm/overlay_29_022E9FE0.s create mode 100644 asm/overlay_29_022EA980.s create mode 100644 asm/overlay_29_02343980.s create mode 100644 include/overlay_29_022E99F0.h create mode 100644 include/overlay_29_022E9FC0.h create mode 100644 include/overlay_29_022EA968.h create mode 100644 include/overlay_29_022EA9CC.h create mode 100644 include/overlay_29_0234396C.h create mode 100644 src/overlay_29_022E99F0.c create mode 100644 src/overlay_29_022E9FC0.c create mode 100644 src/overlay_29_022EA968.c create mode 100644 src/overlay_29_022EA9CC.c create mode 100644 src/overlay_29_0234396C.c diff --git a/asm/include/overlay_29_022E9628.inc b/asm/include/overlay_29_022E9628.inc new file mode 100644 index 00000000..5d275cc9 --- /dev/null +++ b/asm/include/overlay_29_022E9628.inc @@ -0,0 +1,8 @@ +#pragma once +.public DUNGEON_PTR +.public DungeonRandInt +.public GetLeader +.public GetTile +.public MemAlloc +.public MemFree +.public abs diff --git a/asm/include/overlay_29_022E9A44.inc b/asm/include/overlay_29_022E9A44.inc new file mode 100644 index 00000000..0650588b --- /dev/null +++ b/asm/include/overlay_29_022E9A44.inc @@ -0,0 +1,14 @@ +#pragma once +.public CheckVariousStatuses2__02301244 +.public DIRECTIONS_XY +.public DUNGEON_FRAMES_PASSED +.public DUNGEON_PTR +.public EntityIsValid__022E95F4 +.public GetTreatmentBetweenMonsters +.public ov29_02351628 +.public ov29_02351658 +.public ov29_0235179C +.public ov29_023517A0 +.public ov29_023517A2 +.public ov29_02353560 +.public ov29_0237C888 diff --git a/asm/include/overlay_29_022E9618.inc b/asm/include/overlay_29_022E9FE0.inc similarity index 63% rename from asm/include/overlay_29_022E9618.inc rename to asm/include/overlay_29_022E9FE0.inc index a0e7e8a9..56fb91ea 100644 --- a/asm/include/overlay_29_022E9618.inc +++ b/asm/include/overlay_29_022E9FE0.inc @@ -1,32 +1,22 @@ #pragma once -.public _s32_div_f -.public abs .public ChangeSimpleObjTexture -.public CheckVariousStatuses2__02301244 -.public DIRECTIONS_XY -.public DISPLACEMENTS_WITHIN_2_LARGEST_FIRST -.public DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST -.public DISPLACEMENTS_WITHIN_3 -.public DisplayMonstersAndItems -.public DisplayUi .public DUNGEON_BUTTON_INPUT .public DUNGEON_FRAMES_PASSED -.public DUNGEON_PRNG_STATE .public DUNGEON_PTR -.public DungeonRandInt -.public EntityIsValid__022E95F4 +.public DisplayMonstersAndItems +.public DisplayUi .public FlashLeaderIcon .public GetAlertBoxLoadingStatus .public GetBottomScreenOption -.public GetLeader .public GetTile .public GetTopScreenOption -.public GetTreatmentBetweenMonsters .public HandleTopScreenFades .public InitWeirdMinimapMatrix -.public MemAlloc -.public MemFree .public OBJ_GRAPHICS_CONTROLS_PTR +.public RenderWeather3D +.public UpdateCamera +.public UpdateMinimap +.public _s32_div_f .public ov29_022DD8B4 .public ov29_022DDEF8 .public ov29_022DE11C @@ -41,15 +31,6 @@ .public ov29_0233A248 .public ov29_0234B1A4 .public ov29_0234B854 -.public ov29_02351628 -.public ov29_02351658 -.public ov29_0235179C -.public ov29_023517A0 -.public ov29_023517A2 .public ov29_02353540 .public ov29_02353560 -.public ov29_0237C888 -.public RenderWeather3D .public sub_02051E20 -.public UpdateCamera -.public UpdateMinimap diff --git a/asm/include/overlay_29_022EA980.inc b/asm/include/overlay_29_022EA980.inc new file mode 100644 index 00000000..ce4e5dd0 --- /dev/null +++ b/asm/include/overlay_29_022EA980.inc @@ -0,0 +1,2 @@ +#pragma once +.public DUNGEON_PRNG_STATE diff --git a/asm/include/overlay_29_02341E6C.inc b/asm/include/overlay_29_02341E6C.inc index 8d40ba9d..7860d6db 100644 --- a/asm/include/overlay_29_02341E6C.inc +++ b/asm/include/overlay_29_02341E6C.inc @@ -1,21 +1,18 @@ #pragma once -.public _s32_div_f -.public DetermineAllTilesWalkableNeighbors .public DUNGEON_PTR .public DungeonRand16Bit .public DungeonRandInt .public DungeonRandRange .public DungeonRngSetPrimary .public DungeonRngSetSecondary -.public FIXED_ROOM_DATA_PTR .public FIXED_ROOM_ENTITY_SPAWN_TABLE .public FIXED_ROOM_MONSTER_SPAWN_STATS_TABLE .public FLOOR_GENERATION_STATUS +.public FixedRoomActionParamToDirection .public GenerateAndSpawnItem .public GetExplorerMazeMonster .public GetFloorType .public GetMatchingMonsterId -.public GetMonsterIdFromSpawnEntry .public GetMonsterLevelToSpawn .public GetOutlawLeaderLevel .public GetOutlawLevel @@ -24,53 +21,32 @@ .public GetResolvedPerformanceProgressFlag .public GetSpecialTargetItem .public GetTileSafe -.public HandleSir0Translation .public HIDDEN_STAIRS_SPAWN_BLOCKED .public HIDDEN_STAIRS_SPAWN_CHANCE_MULTIPLIER -.public InitializeTile .public InitOtherMonsterData -.public IsCurrentMissionType +.public InitializeTile .public IsDestinationFloor .public IsFullFloorFixedRoom .public IsGoldenChamber .public IsSecretRoom .public IsTreasureBox .public KECLEON_SHOP_BOOST_CHANCE_MULTIPLIER -.public LoadFileFromRom -.public LogMessageByIdWithPopupCheckUser .public MemAlloc -.public MemFree -.public MemZero .public MultiplyByFixedPoint -.public ov10_022C4B34 -.public ov10_022C6C75 -.public ov10_022C6C77 -.public ov10_022C6C78 -.public ov10_022C6C79 -.public ov29_022E7BD0 -.public ov29_022EA370 -.public ov29_023365E8 -.public ov29_02336694 -.public ov29_023442B8 -.public ov29_02348BE8 -.public ov29_023502F0 -.public ov29_023502F4 -.public ov29_02353050 -.public ov29_02353110 -.public ov29_023534F0 -.public ov29_0237CFC0 -.public PlayKeyDoorUnlockEffect -.public PointsToZero -.public SetMonsterLevelAndId +.public SHOP_ITEM_CHANCES .public SetShouldBoostHiddenStairsSpawnChance .public SetShouldBoostKecleonShopSpawnChance -.public SHOP_ITEM_CHANCES .public ShouldBoostHiddenStairsSpawnChance .public ShouldBoostKecleonShopSpawnChance .public SpawnEnemyTrapAtPos .public SpawnMonster .public TREASURE_BOX_1_ITEM_IDS -.public UnloadFile -.public UpdateMinimap -.public UpdateTrapsVisibility -.public ZInit8 +.public _s32_div_f +.public ov10_022C4B34 +.public ov29_023365E8 +.public ov29_023442B8 +.public ov29_023502F0 +.public ov29_023502F4 +.public ov29_02353050 +.public ov29_023534F0 +.public ov29_0237CFC0 diff --git a/asm/include/overlay_29_02343980.inc b/asm/include/overlay_29_02343980.inc new file mode 100644 index 00000000..8b865122 --- /dev/null +++ b/asm/include/overlay_29_02343980.inc @@ -0,0 +1,37 @@ +#pragma once +.public DUNGEON_PTR +.public DetermineAllTilesWalkableNeighbors +.public FIXED_ROOM_DATA_PTR +.public FIXED_ROOM_ENTITY_SPAWN_TABLE +.public FIXED_ROOM_MONSTER_SPAWN_STATS_TABLE +.public GetMatchingMonsterId +.public GetMonsterIdFromSpawnEntry +.public GetOutlawLeaderLevel +.public GetOutlawLevel +.public GetOutlawMinionLevel +.public GetTileSafe +.public HandleSir0Translation +.public IsCurrentMissionType +.public IsFullFloorFixedRoom +.public LoadFileFromRom +.public LogMessageByIdWithPopupCheckUser +.public MemAlloc +.public MemFree +.public MemZero +.public PlaceFixedRoomTile +.public PlayKeyDoorUnlockEffect +.public PointsToZero +.public SetMonsterLevelAndId +.public UnloadFile +.public UpdateMinimap +.public UpdateTrapsVisibility +.public ZInit8 +.public ov10_022C6C75 +.public ov10_022C6C77 +.public ov10_022C6C78 +.public ov10_022C6C79 +.public ov29_022EA370 +.public ov29_02336694 +.public ov29_02342BEC +.public ov29_02348BE8 +.public ov29_02353110 diff --git a/asm/overlay_29_022E9618.s b/asm/overlay_29_022E9618.s deleted file mode 100644 index a52f8aec..00000000 --- a/asm/overlay_29_022E9618.s +++ /dev/null @@ -1,1564 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022E9618.inc" - - .text - - arm_func_start GetLeaderMonster -GetLeaderMonster: ; 0x022E9618 - stmdb sp!, {r3, lr} - bl GetLeader - ldr r0, [r0, #0xb4] - ldmia sp!, {r3, pc} - arm_func_end GetLeaderMonster - - arm_func_start GetRandomTile -GetRandomTile: ; 0x022E9628 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0xe20 - mov sl, r0 - str r1, [sp] - bl GetLeader - mov r4, #0 - str r0, [sp, #0x14] - mov r8, r4 - b _022E9830 -_022E964C: - mov r0, #0x38 - bl DungeonRandInt - mov sb, r0 - mov r0, #0x20 - bl DungeonRandInt - ldr r1, [sp, #0x14] - str r0, [sp, #0x10] - ldrh r2, [r1, #4] - ldrh r1, [r1, #6] - mov r5, #0 - strh r2, [sp, #0x1c] - ldrsh r0, [sp, #0x1c] - strh r1, [sp, #0x1e] - ldrsh fp, [sp, #0x1e] - str r0, [sp, #8] - b _022E97F4 -_022E968C: - cmp r4, #0x700 - ldr r7, [sp, #0x10] - bge _022E97FC - ldr r0, [sp, #8] - mov r6, #0 - sub r0, r0, sb - str r0, [sp, #4] - and r0, sb, #0xff - str r0, [sp, #0x18] - b _022E97DC -_022E96B4: - mov r0, #0 - str r0, [sp, #0xc] - mov r0, sb - mov r1, r7 - bl GetTile - cmp r4, #0x700 - bge _022E97E4 - ldr r1, [sp] - cmp r1, #0 - beq _022E96E8 - ldrh r1, [r0] - tst r1, #0x800 - bne _022E97D8 -_022E96E8: - cmp r8, #0 - bne _022E974C - ldrh r1, [r0] - and r1, r1, #3 - cmp r1, #1 - bne _022E97A8 - ldrb r1, [r0, #7] - cmp r1, #0xff - beq _022E97A8 - ldr r1, [r0, #0x10] - cmp r1, #0 - ldreq r0, [r0, #0xc] - cmpeq r0, #0 - bne _022E97A8 - ldr r0, [sp, #4] - bl abs - cmp r0, #6 - bge _022E9740 - sub r0, fp, r7 - bl abs - cmp r0, #6 - blt _022E97A8 -_022E9740: - mov r0, #1 - str r0, [sp, #0xc] - b _022E97A8 -_022E974C: - ldrh r1, [r0] - cmp r8, #1 - and r1, r1, #3 - bne _022E978C - cmp r1, #1 - bne _022E97A8 - ldrb r1, [r0, #7] - cmp r1, #0xff - beq _022E97A8 - ldr r1, [r0, #0x10] - cmp r1, #0 - ldreq r0, [r0, #0xc] - cmpeq r0, #0 - moveq r0, #1 - streq r0, [sp, #0xc] - b _022E97A8 -_022E978C: - cmp r1, #1 - ldreq r1, [r0, #0x10] - cmpeq r1, #0 - ldreq r0, [r0, #0xc] - cmpeq r0, #0 - moveq r0, #1 - streq r0, [sp, #0xc] -_022E97A8: - ldr r0, [sp, #0xc] - cmp r0, #0 - beq _022E97CC - ldr r1, [sp, #0x18] - add r0, sp, #0x20 - strb r1, [r0, r4, lsl #1] - add r0, r0, r4, lsl #1 - strb r7, [r0, #1] - add r4, r4, #1 -_022E97CC: - add r7, r7, #1 - cmp r7, #0x20 - movge r7, #0 -_022E97D8: - add r6, r6, #1 -_022E97DC: - cmp r6, #0x20 - blt _022E96B4 -_022E97E4: - add sb, sb, #1 - cmp sb, #0x38 - movge sb, #0 - add r5, r5, #1 -_022E97F4: - cmp r5, #0x38 - blt _022E968C -_022E97FC: - cmp r4, #0 - beq _022E982C - mov r0, r4 - bl DungeonRandInt - add r2, sp, #0x20 - ldrb r2, [r2, r0, lsl #1] - add r1, sp, #0x21 - strh r2, [sl] - ldrb r1, [r1, r0, lsl #1] - mov r0, #1 - strh r1, [sl, #2] - b _022E983C -_022E982C: - add r8, r8, #1 -_022E9830: - cmp r8, #3 - blt _022E964C - mov r0, #0 -_022E983C: - add sp, sp, #0xe20 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - arm_func_end GetRandomTile - - arm_func_start FindNearbyUnoccupiedTile -FindNearbyUnoccupiedTile: ; 0x022E9844 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0xc - mov r8, r3 - mov sl, r0 - mov r0, #0 - str r0, [sp, #4] - str r1, [sp] - add r3, r8, #1 - mov r1, r0 - mov r0, r3, lsl #1 - mov sb, r2 - ldr r7, [sp, #0x30] - bl MemAlloc - mov r4, r0 - mov r1, #0 - b _022E9890 -_022E9884: - mov r0, r1, lsl #1 - strh r1, [r4, r0] - add r1, r1, #1 -_022E9890: - cmp r1, r8 - blt _022E9884 - cmp r7, #0 - beq _022E9918 - mov r0, #4 - bl DungeonRandInt - add r0, r0, #1 - mov r0, r0, lsl #0x10 - str r0, [sp, #8] - sub fp, r8, #1 - mov r6, #0 - b _022E990C -_022E98C0: - mov r5, #0 - b _022E98F8 -_022E98C8: - mov r0, r8 - bl DungeonRandInt - mov r0, r0, lsl #0x10 - mov r3, r5, lsl #1 - mov r1, r0, asr #0xf - ldrsh r2, [r4, r3] - ldrsh r0, [r4, r1] - add r5, r5, #1 - mov r5, r5, lsl #0x10 - strh r0, [r4, r3] - strh r2, [r4, r1] - mov r5, r5, asr #0x10 -_022E98F8: - cmp r5, fp - blt _022E98C8 - add r0, r6, #1 - mov r0, r0, lsl #0x10 - mov r6, r0, asr #0x10 -_022E990C: - ldr r0, [sp, #8] - cmp r6, r0, asr #16 - blt _022E98C0 -_022E9918: - mov r6, #0 - b _022E99D0 -_022E9920: - mov r0, r6, lsl #1 - ldrsh r0, [r4, r0] - mov r0, r0, lsl #2 - ldrsh r5, [sb, r0] - cmp r5, #0x63 - beq _022E99D8 - add r1, sb, r0 - ldr r0, [sp] - ldrsh r1, [r1, #2] - ldrsh r3, [r0] - ldrsh r2, [r0, #2] - add fp, r3, r5 - add r5, r2, r1 - mov r0, fp - mov r1, r5 - bl GetTile - ldrh r1, [r0] - tst r1, #0x800 - bne _022E99CC - cmp r7, #0 - beq _022E99A0 - ldrb r2, [r0, #7] - cmp r2, #0xff - beq _022E99CC - ldr r2, _022E99EC ; =DUNGEON_PTR - ldr r2, [r2] - add r2, r2, #0xcc00 -#ifdef JAPAN - ldrsh r3, [r2, #0x40] - cmp r3, fp - ldreqsh r2, [r2, #0x42] -#else - ldrsh r3, [r2, #0xe4] - cmp r3, fp - ldreqsh r2, [r2, #0xe6] -#endif - cmpeq r2, r5 - beq _022E99CC -_022E99A0: - and r1, r1, #3 - cmp r1, #1 - ldreq r1, [r0, #0x10] - cmpeq r1, #0 - ldreq r0, [r0, #0xc] - cmpeq r0, #0 - streqh fp, [sl] - streqh r5, [sl, #2] - moveq r0, #1 - streq r0, [sp, #4] - beq _022E99D8 -_022E99CC: - add r6, r6, #1 -_022E99D0: - cmp r6, r8 - blt _022E9920 -_022E99D8: - mov r0, r4 - bl MemFree - ldr r0, [sp, #4] - add sp, sp, #0xc - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022E99EC: .word DUNGEON_PTR - arm_func_end FindNearbyUnoccupiedTile - - arm_func_start FindClosestUnoccupiedTileWithin2 -FindClosestUnoccupiedTileWithin2: ; 0x022E99F0 - stmdb sp!, {r3, lr} - str r2, [sp] - ldr r2, _022E9A08 ; =DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST - mov r3, #0x19 - bl FindNearbyUnoccupiedTile - ldmia sp!, {r3, pc} - .align 2, 0 -_022E9A08: .word DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST - arm_func_end FindClosestUnoccupiedTileWithin2 - - arm_func_start FindFarthestUnoccupiedTileWithin2 -FindFarthestUnoccupiedTileWithin2: ; 0x022E9A0C - stmdb sp!, {r3, lr} - str r2, [sp] - ldr r2, _022E9A24 ; =DISPLACEMENTS_WITHIN_2_LARGEST_FIRST - mov r3, #0x19 - bl FindNearbyUnoccupiedTile - ldmia sp!, {r3, pc} - .align 2, 0 -_022E9A24: .word DISPLACEMENTS_WITHIN_2_LARGEST_FIRST - arm_func_end FindFarthestUnoccupiedTileWithin2 - - arm_func_start FindUnoccupiedTileWithin3 -FindUnoccupiedTileWithin3: ; 0x022E9A28 - stmdb sp!, {r3, lr} - str r2, [sp] - ldr r2, _022E9A40 ; =DISPLACEMENTS_WITHIN_3 - mov r3, #0x31 - bl FindNearbyUnoccupiedTile - ldmia sp!, {r3, pc} - .align 2, 0 -_022E9A40: .word DISPLACEMENTS_WITHIN_3 - arm_func_end FindUnoccupiedTileWithin3 - - arm_func_start TickStatusTurnCounter -TickStatusTurnCounter: ; 0x022E9A44 - ldrb r1, [r0] - cmp r1, #0x7f - moveq r0, r1 - bxeq lr - cmp r1, #0 - moveq r0, r1 - subne r1, r1, #1 - strneb r1, [r0] - andne r0, r1, #0xff - bx lr - arm_func_end TickStatusTurnCounter - - arm_func_start ov29_022E9A6C -ov29_022E9A6C: ; 0x022E9A6C - ldrh r2, [r0] - ldr r1, _022E9A98 ; =0x00007530 - cmp r2, r1 - moveq r0, r2 - bxeq lr - cmp r2, #0 - moveq r0, r2 - subne r1, r2, #1 - strneh r1, [r0] - ldrneh r0, [r0] - bx lr - .align 2, 0 -_022E9A98: .word 0x00007530 - arm_func_end ov29_022E9A6C - - arm_func_start ov29_022E9A9C -ov29_022E9A9C: ; 0x022E9A9C -#ifdef JAPAN -#define OV29_022E9A9C_OFFSET -0xA4 -#else -#define OV29_022E9A9C_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x18 - mov sb, r1 - ldr r8, [sb, #0xb4] - mov sl, r0 - mov r0, sb - mov r1, #1 - ldrb r4, [r8, #0x4c] - bl CheckVariousStatuses2__02301244 - cmp r0, #0 - beq _022E9B00 - ldr r0, _022E9CA0 ; =DIRECTIONS_XY - mov r2, r4, lsl #2 - ldrsh r1, [r0, r2] - ldrsh r3, [sb, #4] - ldr r0, _022E9CA4 ; =DIRECTIONS_XY + 2 - add r1, r1, r1, lsl #1 - add r1, r3, r1 - strh r1, [sl] - ldrsh r0, [r0, r2] - ldrsh r1, [sb, #6] - add r0, r0, r0, lsl #1 - add r0, r1, r0 - strh r0, [sl, #2] - b _022E9C98 -_022E9B00: - ldrsh r2, [r8, #0x5a] - mvn r0, #0 - cmp r2, r0 - ldreqsh r1, [r8, #0x5c] - cmpeq r1, r0 - bne _022E9C8C - ldr r0, _022E9CA8 ; =DUNGEON_PTR - ldrb r6, [r8, #0x4c] - ldr r1, [r0] - ldr r4, _022E9CAC ; =ov29_0235179C - add r0, r1, #0x3000 - ldrb r0, [r0, #0xe38 + OV29_022E9A9C_OFFSET] - ldr r3, _022E9CB0 ; =ov29_023517A0 - mov r5, r6, lsl #3 - cmp r0, #0 - ldrsh r0, [r3, r5] - ldr r2, _022E9CB4 ; =ov29_023517A2 - ldr r4, [r4, r6, lsl #3] - str r0, [sp, #0x14] - ldrsh r0, [r2, r5] - str r0, [sp, #0x10] - ldrsh r0, [sb, #4] - str r0, [sp, #0xc] - ldrsh r0, [sb, #6] - str r0, [sp, #8] - beq _022E9B80 - add r0, r1, #0x378 + OV29_022E9A9C_OFFSET - add r0, r0, #0x12800 - str r0, [sp, #4] - mov r0, #0x14 - str r0, [sp] - b _022E9C44 -_022E9B80: - ldrb r0, [r8, #6] - cmp r0, #0 - bne _022E9BA4 - add r0, r1, #0x338 + OV29_022E9A9C_OFFSET - add r0, r0, #0x12800 - str r0, [sp, #4] - mov r0, #0x10 - str r0, [sp] - b _022E9C44 -_022E9BA4: - add r0, r1, #0x328 + OV29_022E9A9C_OFFSET - add r0, r0, #0x12800 - str r0, [sp, #4] - mov r0, #4 - str r0, [sp] - b _022E9C44 -_022E9BBC: - ldr r1, [sp, #0x14] - ldr r0, [sp, #0xc] - ldrsh r2, [r4, #2] - mla fp, r3, r1, r0 - ldr r1, [sp, #0x10] - ldr r0, [sp, #8] - mov r6, #0 - mla r5, r2, r1, r0 - b _022E9C34 -_022E9BE0: - ldr r0, [sp, #4] - ldr r7, [r0, r6, lsl #2] - mov r0, r7 - bl EntityIsValid__022E95F4 - cmp r0, #0 - beq _022E9C30 - ldrsh r0, [r7, #4] - cmp r0, fp - ldreqsh r0, [r7, #6] - cmpeq r0, r5 - bne _022E9C30 - mov r2, #0 - mov r1, r7 - mov r0, sb - mov r3, r2 - bl GetTreatmentBetweenMonsters - cmp r0, #1 - streqh fp, [sl] - streqh r5, [sl, #2] - beq _022E9C98 -_022E9C30: - add r6, r6, #1 -_022E9C34: - ldr r0, [sp] - cmp r6, r0 - blt _022E9BE0 - add r4, r4, #4 -_022E9C44: - ldrsh r3, [r4] - cmp r3, #0x63 - bne _022E9BBC - ldrb r1, [r8, #0x4c] - ldr r0, _022E9CA0 ; =DIRECTIONS_XY - ldrsh r2, [sb, #4] - mov r1, r1, lsl #2 - ldrsh r1, [r0, r1] - ldr r0, _022E9CA4 ; =DIRECTIONS_XY + 2 - add r1, r2, r1, lsl #1 - strh r1, [sl] - ldrb r1, [r8, #0x4c] - ldrsh r2, [sb, #6] - mov r1, r1, lsl #2 - ldrsh r0, [r0, r1] - add r0, r2, r0, lsl #1 - strh r0, [sl, #2] - b _022E9C98 -_022E9C8C: - strh r2, [sl] - ldrsh r0, [r8, #0x5c] - strh r0, [sl, #2] -_022E9C98: - add sp, sp, #0x18 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022E9CA0: .word DIRECTIONS_XY -_022E9CA4: .word DIRECTIONS_XY + 2 -_022E9CA8: .word DUNGEON_PTR -_022E9CAC: .word ov29_0235179C -_022E9CB0: .word ov29_023517A0 -_022E9CB4: .word ov29_023517A2 - arm_func_end ov29_022E9A9C - - arm_func_start ov29_022E9CB8 -ov29_022E9CB8: ; 0x022E9CB8 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - ldr r1, _022E9F04 ; =DUNGEON_FRAMES_PASSED - ldr r0, _022E9F08 ; =0xFFFF000F - ldrh r2, [r1, #0x1a] - mov lr, #0 - and r2, r2, r0 - strh r2, [r1, #0x1a] - ldrh r2, [r1, #0x14] - bic r2, r2, #0x100 - strh r2, [r1, #0x14] - ldrh r2, [r1, #0x14] - bic r2, r2, #0x200 - strh r2, [r1, #0x14] - ldrh r2, [r1, #0x14] - bic r2, r2, #0xc00 - strh r2, [r1, #0x14] - ldrh r2, [r1, #0x14] - bic r2, r2, #0x1000 - strh r2, [r1, #0x14] - ldrh r2, [r1, #0x14] - bic r2, r2, #0x2000 - strh r2, [r1, #0x14] - ldrh r2, [r1, #0x14] - orr r2, r2, #0x2000 - strh r2, [r1, #0x14] - ldrh r2, [r1, #0x14] - bic r2, r2, #0xc000 - strh r2, [r1, #0x14] - ldrh r2, [r1, #0x16] - and r2, r2, r0, asr #7 - strh r2, [r1, #0x16] - ldrh r2, [r1, #0x16] - bic r2, r2, #0x3e00 - strh r2, [r1, #0x16] - ldrh r2, [r1, #0x16] - bic r2, r2, #0xc000 - strh r2, [r1, #0x16] - ldrh r2, [r1, #0x16] - orr r2, r2, #0x4000 - strh r2, [r1, #0x16] - ldrh r2, [r1, #0x18] - and r0, r2, r0, asr #6 - strh r0, [r1, #0x18] - ldrh r0, [r1, #0x18] - bic r0, r0, #0xc00 - strh r0, [r1, #0x18] - ldrh r0, [r1, #0x18] - bic r0, r0, #0xf000 - strh r0, [r1, #0x18] - ldrh r0, [r1, #0x1a] - bic r0, r0, #1 - strh r0, [r1, #0x1a] - ldrh r0, [r1, #0x1a] - bic r0, r0, #2 - strh r0, [r1, #0x1a] - ldrh r0, [r1, #0x1a] - bic r0, r0, #4 - strh r0, [r1, #0x1a] -_022E9DA0: - mov r0, #0x48 - mul r5, lr, r0 - ldr r3, _022E9F0C ; =ov29_0237C888 - mov r8, #0x400 - ldr r2, _022E9F10 ; =ov29_02351628 - mov r1, #0x18 - mla r6, lr, r1, r2 - ldr r0, _022E9F14 ; =ov29_02351658 - add r4, r3, r5 - add r5, r0, r5 - mov ip, #0 - rsb r8, r8, #0 - mov r7, #0xc -_022E9DD4: - mul r3, ip, r7 - ldrh r2, [r4, r3] - add r1, r5, r3 - ldr r0, [r5, r3] - bic r2, r2, #0x100 - strh r2, [r4, r3] - ldrh r2, [r4, r3] - ldr sl, [r1, #4] - ldr sb, [r1, #8] - bic r1, r2, #0x200 - strh r1, [r4, r3] - ldrh r1, [r4, r3] - mov r0, r0, lsl #0x1e - add r2, r4, r3 - bic r1, r1, #0xc00 - strh r1, [r4, r3] - ldrh r1, [r4, r3] - mov sl, sl, lsl #0x1e - and sb, sb, r8, lsr #22 - bic r1, r1, #0x1000 - strh r1, [r4, r3] - ldrh r1, [r4, r3] - bic r1, r1, #0x2000 - strh r1, [r4, r3] - ldrh r1, [r4, r3] - orr r1, r1, #0x2000 - strh r1, [r4, r3] - ldrh r1, [r4, r3] - bic r1, r1, #0xc000 - strh r1, [r4, r3] - ldrh r1, [r4, r3] - orr r0, r1, r0, lsr #16 - strh r0, [r4, r3] - ldrh r0, [r2, #2] - bic r0, r0, #0x3e00 - strh r0, [r2, #2] - ldrh r0, [r2, #2] - bic r0, r0, #0xc000 - strh r0, [r2, #2] - ldrh r0, [r2, #2] - orr r0, r0, sl, lsr #16 - strh r0, [r2, #2] - ldrh r0, [r2, #4] - and r0, r0, r8 - strh r0, [r2, #4] - ldrh r0, [r2, #4] - orr r0, r0, sb - strh r0, [r2, #4] - ldrh r0, [r2, #4] - bic r0, r0, #0xc00 - strh r0, [r2, #4] - ldrh r0, [r2, #4] - orr r0, r0, #0xc00 - strh r0, [r2, #4] - ldrh r3, [r2, #4] - mov r1, ip, lsl #2 - add r0, r6, ip, lsl #2 - bic r3, r3, #0xf000 - strh r3, [r2, #4] - ldrh r3, [r2, #6] - add ip, ip, #1 - ldrh r1, [r6, r1] - bic r3, r3, #1 - strh r3, [r2, #6] - ldrh r3, [r2, #6] - ldrh r0, [r0, #2] - cmp ip, #6 - bic r3, r3, #2 - strh r3, [r2, #6] - strh r1, [r2, #8] - strh r0, [r2, #0xa] - blt _022E9DD4 - add lr, lr, #1 - cmp lr, #2 - blt _022E9DA0 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_022E9F04: .word DUNGEON_FRAMES_PASSED -_022E9F08: .word 0xFFFF000F -_022E9F0C: .word ov29_0237C888 -_022E9F10: .word ov29_02351628 -_022E9F14: .word ov29_02351658 - arm_func_end ov29_022E9CB8 - - arm_func_start ov29_022E9F18 -ov29_022E9F18: ; 0x022E9F18 - stmdb sp!, {r3, lr} - ldr r0, _022E9F70 ; =0x000003E7 - ldr r1, _022E9F74 ; =DUNGEON_FRAMES_PASSED - mov r2, #0 - str r0, [r1, #4] - ldr r0, _022E9F78 ; =ov29_02353560 - str r2, [r1, #0x10] - strb r2, [r0, #2] - strh r2, [r1, #0x1c] - bl ov29_022E9CB8 - ldr r2, _022E9F7C ; =DUNGEON_PTR - mov r3, #1 - ldr r0, [r2] - ldr r1, _022E9F74 ; =DUNGEON_FRAMES_PASSED - add r0, r0, #0x1a000 -#ifdef JAPAN - strb r3, [r0, #0x1a8] -#else - strb r3, [r0, #0x24c] -#endif - ldr r0, [r2] - mov r2, #0 - add r0, r0, #0x1a000 -#ifdef JAPAN - strb r3, [r0, #0x1a9] -#else - strb r3, [r0, #0x24d] -#endif - str r2, [r1, #0xc] - ldmia sp!, {r3, pc} - .align 2, 0 -_022E9F70: .word 0x000003E7 -_022E9F74: .word DUNGEON_FRAMES_PASSED -_022E9F78: .word ov29_02353560 -_022E9F7C: .word DUNGEON_PTR - arm_func_end ov29_022E9F18 - - arm_func_start ov29_022E9F80 -ov29_022E9F80: ; 0x022E9F80 - ldr r2, _022E9F98 ; =ov29_02353560 - mov r3, #0 - strb r0, [r2] - str r1, [r2, #8] - str r3, [r2, #0xc] - bx lr - .align 2, 0 -_022E9F98: .word ov29_02353560 - arm_func_end ov29_022E9F80 - - arm_func_start ov29_022E9F9C -ov29_022E9F9C: ; 0x022E9F9C - ldr r0, _022E9FBC ; =ov29_02353560 - ldrb r1, [r0, #1] - cmp r1, #0 - ldrneb r2, [r0, #5] - movne r1, #0 - strneb r2, [r0, #6] - strneb r1, [r0, #1] - bx lr - .align 2, 0 -_022E9FBC: .word ov29_02353560 - arm_func_end ov29_022E9F9C - - arm_func_start ov29_022E9FC0 -ov29_022E9FC0: ; 0x022E9FC0 - ldr r0, _022E9FCC ; =ov29_02353560 - ldrb r0, [r0, #3] - bx lr - .align 2, 0 -_022E9FCC: .word ov29_02353560 - arm_func_end ov29_022E9FC0 - - arm_func_start ov29_022E9FD0 -ov29_022E9FD0: ; 0x022E9FD0 - ldr r1, _022E9FDC ; =ov29_02353560 - strb r0, [r1, #3] - bx lr - .align 2, 0 -_022E9FDC: .word ov29_02353560 - arm_func_end ov29_022E9FD0 - - arm_func_start AdvanceFrame -AdvanceFrame: ; 0x022E9FE0 - stmdb sp!, {r3, lr} - ldr r1, _022EA004 ; =ov29_02353560 - ldrb r1, [r1, #3] - cmp r1, #0 - beq _022E9FFC - bl ov29_022EA2A4 - ldmia sp!, {r3, pc} -_022E9FFC: - bl ov29_022EA324 - ldmia sp!, {r3, pc} - .align 2, 0 -_022EA004: .word ov29_02353560 - arm_func_end AdvanceFrame - - arm_func_start ov29_022EA008 -ov29_022EA008: ; 0x022EA008 -#ifdef JAPAN -#define OV29_022EA008_OFFSET -0xA4 -#else -#define OV29_022EA008_OFFSET 0 -#endif - stmdb sp!, {r3, lr} - ldr r0, _022EA290 ; =DUNGEON_PTR - ldr r0, [r0] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - ldr r0, _022EA294 ; =ov29_02353560 - ldrb r0, [r0, #3] - cmp r0, #0 - beq _022EA27C - bl ov29_0234B854 - bl HandleTopScreenFades - ldr r0, _022EA290 ; =DUNGEON_PTR - ldr r0, [r0] - cmp r0, #0 - beq _022EA0F8 - mov r0, #1 - bl UpdateCamera - ldr r1, _022EA290 ; =DUNGEON_PTR - ldr r0, _022EA298 ; =0x0001A224 - ldr ip, [r1] - add r1, r0, #2 - add r2, ip, #0x1a000 - ldrsh r3, [ip, r1] - ldr r1, [r2, #0x230 + OV29_022EA008_OFFSET] - ldrsh r0, [ip, r0] - sub r1, r3, r1 - mov r1, r1, lsl #0x10 - mov r1, r1, asr #0x10 - mov r2, #1 - mov r3, #0 - bl sub_02051E20 - ldr r1, _022EA290 ; =DUNGEON_PTR - ldr r0, [r1] - add ip, r0, #0x1a000 - ldrb r0, [ip, #0x251 + OV29_022EA008_OFFSET] - cmp r0, #0 - beq _022EA0DC - mov r0, #2 - strb r0, [ip, #0x23c + OV29_022EA008_OFFSET] - ldr r0, _022EA298 ; =0x0001A224 - ldr ip, [r1] - add r1, r0, #2 - add r2, ip, #0x1a000 - ldrsh r3, [ip, r1] - ldr r1, [r2, #0x230 + OV29_022EA008_OFFSET] - mov r2, #0 - sub r1, r3, r1 - mov r1, r1, lsl #0x10 - ldrsh r0, [ip, r0] - mov r3, r2 - mov r1, r1, asr #0x10 - bl sub_02051E20 - b _022EA0F8 -_022EA0DC: - mov r0, #0 - mov lr, #3 - mov r1, r0 - mov r2, r0 - mov r3, r0 - strb lr, [ip, #0x23c + OV29_022EA008_OFFSET] - bl sub_02051E20 -_022EA0F8: - bl ov29_0230473C - bl DisplayMonstersAndItems - bl ov29_022E335C - ldr r0, _022EA290 ; =DUNGEON_PTR - ldr r1, [r0] - ldrsh r0, [r1, #0x1c] - cmp r0, #0x64 - addlt r0, r0, #1 - strlth r0, [r1, #0x1c] - ldr r0, _022EA29C ; =DUNGEON_FRAMES_PASSED - ldr r0, [r0, #4] - cmp r0, #0 - cmpne r0, #3 - cmpne r0, #0xc - bne _022EA140 - mov r0, #0 - bl FlashLeaderIcon - b _022EA154 -_022EA140: - bl GetTopScreenOption - cmp r0, #3 - bne _022EA154 - mov r0, #1 - bl FlashLeaderIcon -_022EA154: - bl AnimateWaterShadows - bl ov29_022EA80C - bl DisplayUi - ldr r1, _022EA294 ; =ov29_02353560 - ldrb r0, [r1] - cmp r0, #0 - beq _022EA1D0 - ldr r0, _022EA290 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x1a000 - ldrb r2, [r0, #0x24a + OV29_022EA008_OFFSET] - cmp r2, #0 - beq _022EA1B8 - bl ov29_022DE11C - cmp r0, #0 - beq _022EA1D0 - ldr r0, _022EA290 ; =DUNGEON_PTR - mov r2, #0 - ldr r0, [r0] - ldr r1, _022EA294 ; =ov29_02353560 - add r0, r0, #0x1a000 - strb r2, [r0, #0x24a + OV29_022EA008_OFFSET] - ldr r0, [r1, #8] - str r0, [r1, #0xc] - b _022EA1D0 -_022EA1B8: - ldr r2, [r1, #0xc] - sub r2, r2, #1 - str r2, [r1, #0xc] - cmp r2, #0 - movle r1, #1 - strleb r1, [r0, #0x24a + OV29_022EA008_OFFSET] -_022EA1D0: - ldr r0, _022EA290 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x1a000 - ldrb r0, [r0, #0x24a + OV29_022EA008_OFFSET] - cmp r0, #0 - beq _022EA214 - bl GetAlertBoxLoadingStatus - cmp r0, #3 - beq _022EA214 - ldr r1, _022EA290 ; =DUNGEON_PTR - ldr r0, _022EA294 ; =ov29_02353560 - ldr r1, [r1] - ldrb r3, [r0, #2] - add r2, r1, #0x1e0 - mov r0, #0xa0 - mov r1, #0x20 - bl ov29_022DE134 -_022EA214: - ldr r1, _022EA290 ; =DUNGEON_PTR - ldr r0, _022EA2A0 ; =0x0001A21C - ldr r2, [r1] - add r1, r0, #2 - ldrsh r0, [r2, r0] - ldrsh r1, [r2, r1] - bl GetTile - cmp r0, #0 - beq _022EA260 - ldr r2, _022EA290 ; =DUNGEON_PTR - ldrb r1, [r0, #7] - ldr r2, [r2] - cmp r2, #0 - addne r0, r2, #0xc4 + OV29_022EA008_OFFSET - addne r0, r0, #0x4000 - add r2, r2, #0x21c + OV29_022EA008_OFFSET - moveq r0, #0 - add r2, r2, #0x1a000 - bl ov29_022ED800 -_022EA260: - bl RenderWeather3D - bl ov29_022E8C10 - ldr r0, _022EA290 ; =DUNGEON_PTR - ldr r0, [r0] -#ifdef JAPAN - add r0, r0, #0x2180 - add r0, r0, #0x18000 -#else - add r0, r0, #0x224 - add r0, r0, #0x1a000 -#endif - bl ov29_022DD8B4 -_022EA27C: - ldr r0, _022EA29C ; =DUNGEON_FRAMES_PASSED - ldr r1, [r0] - add r1, r1, #1 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_022EA290: .word DUNGEON_PTR -_022EA294: .word ov29_02353560 -_022EA298: .word 0x0001A224 + OV29_022EA008_OFFSET -_022EA29C: .word DUNGEON_FRAMES_PASSED -_022EA2A0: .word 0x0001A21C + OV29_022EA008_OFFSET - arm_func_end ov29_022EA008 - - arm_func_start ov29_022EA2A4 -ov29_022EA2A4: ; 0x022EA2A4 - stmdb sp!, {r3, lr} - ldr r0, _022EA318 ; =DUNGEON_PTR - ldr r0, [r0] - cmp r0, #0 - bne _022EA2C0 - bl ov29_022DDEF8 - ldmia sp!, {r3, pc} -_022EA2C0: - ldr r0, _022EA31C ; =ov29_02353560 - ldrb r0, [r0, #6] - cmp r0, #0 - ldrne r0, _022EA320 ; =DUNGEON_FRAMES_PASSED - ldrne r1, [r0, #0x10] - addne r1, r1, #1 - strne r1, [r0, #0x10] - bl ov29_022DDEF8 - ldr r0, _022EA318 ; =DUNGEON_PTR - mov r1, #0 - ldr r0, [r0] - add r0, r0, #0x1a000 -#ifdef JAPAN - strb r1, [r0, #0x1a4] -#else - strb r1, [r0, #0x248] -#endif - bl InitWeirdMinimapMatrix - ldr r0, _022EA31C ; =ov29_02353560 - ldrb r0, [r0, #6] - cmp r0, #0 - ldrne r0, _022EA320 ; =DUNGEON_FRAMES_PASSED - ldrne r1, [r0, #0x10] - subne r1, r1, #1 - strne r1, [r0, #0x10] - ldmia sp!, {r3, pc} - .align 2, 0 -_022EA318: .word DUNGEON_PTR -_022EA31C: .word ov29_02353560 -_022EA320: .word DUNGEON_FRAMES_PASSED - arm_func_end ov29_022EA2A4 - - arm_func_start ov29_022EA324 -ov29_022EA324: ; 0x022EA324 - stmdb sp!, {r3, lr} - ldr r0, _022EA368 ; =ov29_02353560 - ldrb r0, [r0, #6] - cmp r0, #0 - ldrne r0, _022EA36C ; =DUNGEON_FRAMES_PASSED - ldrne r1, [r0, #0x10] - addne r1, r1, #1 - strne r1, [r0, #0x10] - bl ov29_022DDEF8 - ldr r0, _022EA368 ; =ov29_02353560 - ldrb r0, [r0, #6] - cmp r0, #0 - ldrne r0, _022EA36C ; =DUNGEON_FRAMES_PASSED - ldrne r1, [r0, #0x10] - subne r1, r1, #1 - strne r1, [r0, #0x10] - ldmia sp!, {r3, pc} - .align 2, 0 -_022EA368: .word ov29_02353560 -_022EA36C: .word DUNGEON_FRAMES_PASSED - arm_func_end ov29_022EA324 - - arm_func_start ov29_022EA370 -ov29_022EA370: ; 0x022EA370 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - ldr r4, _022EA3B0 ; =ov29_02353560 - b _022EA3A4 -_022EA384: - ldrb r0, [r4, #3] - cmp r0, #0 - mov r0, r5 - beq _022EA39C - bl ov29_022EA2A4 - b _022EA3A0 -_022EA39C: - bl ov29_022EA324 -_022EA3A0: - sub r6, r6, #1 -_022EA3A4: - cmp r6, #0 - bne _022EA384 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_022EA3B0: .word ov29_02353560 - arm_func_end ov29_022EA370 - - arm_func_start ov29_022EA3B4 -ov29_022EA3B4: ; 0x022EA3B4 - stmdb sp!, {r4, r5, r6, lr} - ldr r4, _022EA3F0 ; =DUNGEON_BUTTON_INPUT - ldr r5, _022EA3F4 ; =ov29_02353560 - mov r6, r0 -_022EA3C4: - ldrb r0, [r5, #3] - cmp r0, #0 - mov r0, r6 - beq _022EA3DC - bl ov29_022EA2A4 - b _022EA3E0 -_022EA3DC: - bl ov29_022EA324 -_022EA3E0: - ldrh r0, [r4] - tst r0, #0xf0 - bne _022EA3C4 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_022EA3F0: .word DUNGEON_BUTTON_INPUT -_022EA3F4: .word ov29_02353560 - arm_func_end ov29_022EA3B4 - - arm_func_start ov29_022EA3F8 -ov29_022EA3F8: ; 0x022EA3F8 - ldr ip, _022EA404 ; =ov29_022DE638 - mov r0, #0x100 - bx ip - .align 2, 0 -_022EA404: .word ov29_022DE638 - arm_func_end ov29_022EA3F8 - - arm_func_start ov29_022EA408 -ov29_022EA408: ; 0x022EA408 - ldr r0, _022EA414 ; =DUNGEON_FRAMES_PASSED - ldr r0, [r0, #4] - bx lr - .align 2, 0 -_022EA414: .word DUNGEON_FRAMES_PASSED - arm_func_end ov29_022EA408 - - arm_func_start ov29_022EA418 -ov29_022EA418: ; 0x022EA418 - ldr r1, _022EA424 ; =ov29_02353560 - strb r0, [r1, #4] - bx lr - .align 2, 0 -_022EA424: .word ov29_02353560 - arm_func_end ov29_022EA418 - - arm_func_start UnkMapRelatedFunc -UnkMapRelatedFunc: ; 0x022EA428 - stmdb sp!, {r4, lr} - ldr r1, _022EA620 ; =DUNGEON_FRAMES_PASSED - mov r4, r0 - ldr r0, [r1, #4] - cmp r4, r0 - ldmeqia sp!, {r4, pc} - cmp r4, #0xd - bgt _022EA48C - cmp r4, #0 - addge pc, pc, r4, lsl #2 - b _022EA614 -_022EA454: ; jump table - b _022EA4B4 ; case 0 - b _022EA498 ; case 1 - b _022EA540 ; case 2 - b _022EA4E0 ; case 3 - b _022EA540 ; case 4 - b _022EA570 ; case 5 - b _022EA508 ; case 6 - b _022EA524 ; case 7 - b _022EA5C4 ; case 8 - b _022EA5E0 ; case 9 - b _022EA614 ; case 10 - b _022EA5FC ; case 11 - b _022EA614 ; case 12 - b _022EA594 ; case 13 -_022EA48C: - ldr r0, _022EA624 ; =0x000003E7 - cmp r4, r0 - b _022EA614 -_022EA498: - ldr r0, _022EA628 ; =ov29_02353560 - ldrb r0, [r0, #3] - cmp r0, #0 - beq _022EA614 - mov r0, #0 - bl ov29_0234B1A4 - b _022EA614 -_022EA4B4: - ldr r0, _022EA628 ; =ov29_02353560 - ldrb r1, [r0, #3] - cmp r1, #0 - beq _022EA614 - ldrb r0, [r0, #4] - cmp r0, #0 - bne _022EA614 - bl UpdateMinimap - mov r0, #0 - bl ov29_02339FF4 - b _022EA614 -_022EA4E0: - ldr r0, _022EA628 ; =ov29_02353560 - ldrb r1, [r0, #3] - cmp r1, #0 - beq _022EA614 - ldrb r0, [r0, #4] - cmp r0, #0 - bne _022EA614 - mov r0, #1 - bl ov29_02339FF4 - b _022EA614 -_022EA508: - ldr r0, _022EA628 ; =ov29_02353560 - ldrb r0, [r0, #3] - cmp r0, #0 - beq _022EA614 - mov r0, #0 - bl ov29_0234B1A4 - b _022EA614 -_022EA524: - ldr r0, _022EA628 ; =ov29_02353560 - ldrb r0, [r0, #3] - cmp r0, #0 - beq _022EA614 - mov r0, #0 - bl ov29_0234B1A4 - b _022EA614 -_022EA540: - ldr r0, _022EA628 ; =ov29_02353560 - ldrb r0, [r0, #3] - cmp r0, #0 - beq _022EA614 - mov r0, #0 - bl ov29_0234B1A4 - bl GetBottomScreenOption - cmp r0, #0 - beq _022EA614 - mov r0, #0 - bl ov29_0233A248 - b _022EA614 -_022EA570: - ldr r0, _022EA628 ; =ov29_02353560 - ldrb r0, [r0, #3] - cmp r0, #0 - beq _022EA614 - mov r0, #0 - bl ov29_0234B1A4 - mov r0, #0 - bl ov29_0233A248 - b _022EA614 -_022EA594: - ldr r0, _022EA628 ; =ov29_02353560 - ldrb r1, [r0, #3] - cmp r1, #0 - beq _022EA5BC - ldrb r0, [r0, #4] - cmp r0, #0 - bne _022EA5BC - bl UpdateMinimap - mov r0, #1 - bl ov29_02339FF4 -_022EA5BC: - mov r4, #0 - b _022EA614 -_022EA5C4: - ldr r0, _022EA628 ; =ov29_02353560 - ldrb r0, [r0, #3] - cmp r0, #0 - beq _022EA614 - mov r0, #0 - bl ov29_0234B1A4 - b _022EA614 -_022EA5E0: - ldr r0, _022EA628 ; =ov29_02353560 - ldrb r0, [r0, #3] - cmp r0, #0 - beq _022EA614 - mov r0, #0 - bl ov29_0234B1A4 - b _022EA614 -_022EA5FC: - ldr r0, _022EA628 ; =ov29_02353560 - ldrb r0, [r0, #3] - cmp r0, #0 - beq _022EA614 - mov r0, #0 - bl ov29_0234B1A4 -_022EA614: - ldr r0, _022EA620 ; =DUNGEON_FRAMES_PASSED - str r4, [r0, #4] - ldmia sp!, {r4, pc} - .align 2, 0 -_022EA620: .word DUNGEON_FRAMES_PASSED -_022EA624: .word 0x000003E7 -_022EA628: .word ov29_02353560 - arm_func_end UnkMapRelatedFunc - - arm_func_start ov29_022EA62C -ov29_022EA62C: ; 0x022EA62C - ldr r1, _022EA644 ; =DUNGEON_FRAMES_PASSED - mov r2, #0xa - ldr ip, _022EA648 ; =ov29_0234B1A4 - mov r0, #0 - str r2, [r1, #4] - bx ip - .align 2, 0 -_022EA644: .word DUNGEON_FRAMES_PASSED -_022EA648: .word ov29_0234B1A4 - arm_func_end ov29_022EA62C - - arm_func_start AnimateWaterShadows -AnimateWaterShadows: ; 0x022EA64C - stmdb sp!, {r4, lr} - sub sp, sp, #8 - ldr r0, _022EA708 ; =DUNGEON_FRAMES_PASSED - mov r2, #0 - ldr r1, [r0, #8] - adds r1, r1, #1 - str r1, [r0, #8] - movmi r1, #0 - strmi r1, [r0, #8] - ldr r0, _022EA708 ; =DUNGEON_FRAMES_PASSED - ldr r1, [r0, #8] - cmp r1, #0xc - movge r1, #0 - strge r1, [r0, #8] - ldr r0, _022EA708 ; =DUNGEON_FRAMES_PASSED - mov r1, #0xb - ldr r3, [r0, #8] - mov r0, r3, asr #1 - add r0, r3, r0, lsr #30 - mov r0, r0, asr #2 - add ip, r0, r0, lsl #1 - str r2, [sp] - str r1, [sp, #4] - ldr r0, _022EA70C ; =ov29_02353540 - ldr r1, _022EA710 ; =OBJ_GRAPHICS_CONTROLS_PTR - ldr r2, [r0] - ldr r0, [r1] - add r1, r2, ip, lsl #8 - mov r2, #0x1e8 - mov r3, #0x100 - mov r4, ip, lsl #8 - bl ChangeSimpleObjTexture - mov r0, #0 - str r0, [sp] - mov r1, #0xb - str r1, [sp, #4] - ldr r0, _022EA70C ; =ov29_02353540 - ldr r1, _022EA710 ; =OBJ_GRAPHICS_CONTROLS_PTR - ldr ip, [r0] - add r3, r4, #0x100 - ldr r0, [r1] - add r1, ip, r3 - ldr r2, _022EA714 ; =0x000001EA - mov r3, #0x200 - bl ChangeSimpleObjTexture - add sp, sp, #8 - ldmia sp!, {r4, pc} - .align 2, 0 -_022EA708: .word DUNGEON_FRAMES_PASSED -_022EA70C: .word ov29_02353540 -_022EA710: .word OBJ_GRAPHICS_CONTROLS_PTR -_022EA714: .word 0x000001EA - arm_func_end AnimateWaterShadows - - arm_func_start DisplayAnimatedNumbers -DisplayAnimatedNumbers: ; 0x022EA718 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - movs sl, r0 - mov sb, r1 - mov r8, r2 - mov r7, r3 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldr r0, _022EA7FC ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x1a000 -#ifdef JAPAN - ldrb r0, [r0, #0x19a] -#else - ldrb r0, [r0, #0x23e] -#endif - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r6, #0 - mov fp, #0x29 - ldr r5, _022EA800 ; =DUNGEON_FRAMES_PASSED - ldr r4, _022EA804 ; =ov29_02353560 - b _022EA78C -_022EA75C: - ldrsh r0, [r5, #0x1c] - cmp r0, #0 - beq _022EA794 - ldrb r0, [r4, #3] - cmp r0, #0 - beq _022EA780 - mov r0, fp - bl ov29_022EA2A4 - b _022EA788 -_022EA780: - mov r0, #0x29 - bl ov29_022EA324 -_022EA788: - add r6, r6, #1 -_022EA78C: - cmp r6, #0x14 - blt _022EA75C -_022EA794: - ldr r1, _022EA800 ; =DUNGEON_FRAMES_PASSED - mov r0, #0x3c - str sl, [r1, #0x20] - strb r8, [r1, #0x24] - strh r0, [r1, #0x1c] - str sb, [r1, #0x28] - ldrh r2, [sb, #0x26] - mov r0, #0 - cmp r7, #0 - str r2, [r1, #0x2c] - str r0, [r1, #0x30] - str r0, [r1, #0x34] - bge _022EA7F4 - ldr r0, _022EA808 ; =0xFFFFFC19 - cmp sl, r0 - movlt r0, #6 - strlth r0, [r1, #0x1e] - ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - cmp sl, #0 - movge r0, #0xa - strgeh r0, [r1, #0x1e] - movlt r0, #3 - strlth r0, [r1, #0x1e] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_022EA7F4: - strh r7, [r1, #0x1e] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022EA7FC: .word DUNGEON_PTR -_022EA800: .word DUNGEON_FRAMES_PASSED -_022EA804: .word ov29_02353560 -_022EA808: .word 0xFFFFFC19 - arm_func_end DisplayAnimatedNumbers - - arm_func_start ov29_022EA80C -ov29_022EA80C: ; 0x022EA80C - stmdb sp!, {r4, r5, lr} - sub sp, sp, #0xc - ldr r0, _022EA95C ; =DUNGEON_FRAMES_PASSED - ldrsh r1, [r0, #0x1c] - cmp r1, #0 - beq _022EA954 - ldr r0, [r0, #0x28] - cmp r0, #0 - moveq r0, #0 - beq _022EA848 - ldr r0, [r0] - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff -_022EA848: - cmp r0, #0 - ldreq r0, _022EA95C ; =DUNGEON_FRAMES_PASSED - moveq r1, #0 - streqh r1, [r0, #0x1c] - beq _022EA954 - ldr r3, _022EA95C ; =DUNGEON_FRAMES_PASSED - ldr r5, [r3, #0x28] - ldr r1, [r3, #0x2c] - ldrh r0, [r5, #0x26] - cmp r1, r0 - movne r0, #0 - strneh r0, [r3, #0x1c] - bne _022EA954 - ldrsh r2, [r3, #0x1c] - ldr r1, _022EA960 ; =DUNGEON_PTR - ldr r0, _022EA964 ; =0x0001A224 - sub r2, r2, #1 - strh r2, [r3, #0x1c] - ldr r4, [r3, #0x34] - add r2, r0, #2 - sub lr, r4, #0x2e - str lr, [r3, #0x34] - ldr r4, [r5, #0xb4] - ldr ip, [r1] - add r1, r4, #0x100 -#ifdef JAPAN - ldrsh r5, [r1, #0x7e] - ldrsh r4, [r1, #0x80] -#else - ldrsh r5, [r1, #0x82] - ldrsh r4, [r1, #0x84] -#endif - ldr r1, [r3, #0x30] - ldrsh r0, [ip, r0] - add r5, r5, r1, asr #8 - ldrsh r1, [ip, r2] - add r4, r4, lr, asr #8 - sub r2, r4, #0x18 - sub r4, r5, r0 - mvn r0, #0x1f - cmp r4, r0 - sub r5, r2, r1 - addge r0, r0, #0x18 - cmpge r5, r0 - blt _022EA954 - cmp r4, #0xff - cmplt r5, #0xc0 - bge _022EA954 - ldrsh r1, [r3, #0x1c] - mov r0, #0xff - cmp r1, #0x1f - bge _022EA910 - rsb r0, r1, r1, lsl #8 - mov r1, #0x1f - bl _s32_div_f -_022EA910: - ldr ip, _022EA95C ; =DUNGEON_FRAMES_PASSED - mov r1, r4, lsl #0x10 - ldrh r4, [ip, #0x1e] - mov r2, r5, lsl #0x10 - mov r3, r0, lsl #0x10 - str r4, [sp] - ldr r4, [ip, #0x20] - mov r0, r1, asr #0x10 - mov r1, r4, lsl #0x10 - mov r1, r1, asr #0x10 - str r1, [sp, #4] - ldrb r4, [ip, #0x24] - mov r1, r2, asr #0x10 - mov r3, r3, asr #0x10 - mov r2, #0xff - str r4, [sp, #8] - bl ov29_02335F40 -_022EA954: - add sp, sp, #0xc - ldmia sp!, {r4, r5, pc} - .align 2, 0 -_022EA95C: .word DUNGEON_FRAMES_PASSED -_022EA960: .word DUNGEON_PTR -#ifdef JAPAN -_022EA964: .word 0x0001A180 -#else -_022EA964: .word 0x0001A224 -#endif - arm_func_end ov29_022EA80C - - arm_func_start SetDungeonRngPreseed23Bit -SetDungeonRngPreseed23Bit: ; 0x022EA968 - orr r1, r0, #1 - ldr r0, _022EA97C ; =DUNGEON_PRNG_STATE - bic r1, r1, #0xff000000 - str r1, [r0, #8] - bx lr - .align 2, 0 -_022EA97C: .word DUNGEON_PRNG_STATE - arm_func_end SetDungeonRngPreseed23Bit - - arm_func_start GenerateDungeonRngSeed -GenerateDungeonRngSeed: ; 0x022EA980 - ldr r2, _022EA9C4 ; =DUNGEON_PRNG_STATE - mov r1, #0x10000 - ldr r3, [r2, #8] - ldr r0, _022EA9C8 ; =0x5D588B65 - rsb r1, r1, #0 - mul ip, r3, r0 - add ip, ip, #1 - mul r0, ip, r0 - add r3, r0, #1 - mov r0, ip, lsr #0x10 - mov r0, r0, lsl #0x10 - and r1, r3, r1 - orr r0, r1, r0, lsr #16 - bic r0, r0, #0xff000000 - str r3, [r2, #8] - orr r0, r0, #1 - bx lr - .align 2, 0 -_022EA9C4: .word DUNGEON_PRNG_STATE -_022EA9C8: .word 0x5D588B65 - arm_func_end GenerateDungeonRngSeed - - arm_func_start GetDungeonRngPreseed -GetDungeonRngPreseed: ; 0x022EA9CC - ldr r0, _022EA9D8 ; =DUNGEON_PRNG_STATE - ldr r0, [r0, #8] - bx lr - .align 2, 0 -_022EA9D8: .word DUNGEON_PRNG_STATE - arm_func_end GetDungeonRngPreseed - - arm_func_start SetDungeonRngPreseed -SetDungeonRngPreseed: ; 0x022EA9DC - ldr r1, _022EA9E8 ; =DUNGEON_PRNG_STATE - str r0, [r1, #8] - bx lr - .align 2, 0 -_022EA9E8: .word DUNGEON_PRNG_STATE - arm_func_end SetDungeonRngPreseed diff --git a/asm/overlay_29_022E9628.s b/asm/overlay_29_022E9628.s new file mode 100644 index 00000000..25a19ac5 --- /dev/null +++ b/asm/overlay_29_022E9628.s @@ -0,0 +1,290 @@ + .include "asm/macros.inc" + .include "overlay_29_022E9628.inc" + + .text + + arm_func_start GetRandomTile +GetRandomTile: ; 0x022E9628 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xe20 + mov sl, r0 + str r1, [sp] + bl GetLeader + mov r4, #0 + str r0, [sp, #0x14] + mov r8, r4 + b _022E9830 +_022E964C: + mov r0, #0x38 + bl DungeonRandInt + mov sb, r0 + mov r0, #0x20 + bl DungeonRandInt + ldr r1, [sp, #0x14] + str r0, [sp, #0x10] + ldrh r2, [r1, #4] + ldrh r1, [r1, #6] + mov r5, #0 + strh r2, [sp, #0x1c] + ldrsh r0, [sp, #0x1c] + strh r1, [sp, #0x1e] + ldrsh fp, [sp, #0x1e] + str r0, [sp, #8] + b _022E97F4 +_022E968C: + cmp r4, #0x700 + ldr r7, [sp, #0x10] + bge _022E97FC + ldr r0, [sp, #8] + mov r6, #0 + sub r0, r0, sb + str r0, [sp, #4] + and r0, sb, #0xff + str r0, [sp, #0x18] + b _022E97DC +_022E96B4: + mov r0, #0 + str r0, [sp, #0xc] + mov r0, sb + mov r1, r7 + bl GetTile + cmp r4, #0x700 + bge _022E97E4 + ldr r1, [sp] + cmp r1, #0 + beq _022E96E8 + ldrh r1, [r0] + tst r1, #0x800 + bne _022E97D8 +_022E96E8: + cmp r8, #0 + bne _022E974C + ldrh r1, [r0] + and r1, r1, #3 + cmp r1, #1 + bne _022E97A8 + ldrb r1, [r0, #7] + cmp r1, #0xff + beq _022E97A8 + ldr r1, [r0, #0x10] + cmp r1, #0 + ldreq r0, [r0, #0xc] + cmpeq r0, #0 + bne _022E97A8 + ldr r0, [sp, #4] + bl abs + cmp r0, #6 + bge _022E9740 + sub r0, fp, r7 + bl abs + cmp r0, #6 + blt _022E97A8 +_022E9740: + mov r0, #1 + str r0, [sp, #0xc] + b _022E97A8 +_022E974C: + ldrh r1, [r0] + cmp r8, #1 + and r1, r1, #3 + bne _022E978C + cmp r1, #1 + bne _022E97A8 + ldrb r1, [r0, #7] + cmp r1, #0xff + beq _022E97A8 + ldr r1, [r0, #0x10] + cmp r1, #0 + ldreq r0, [r0, #0xc] + cmpeq r0, #0 + moveq r0, #1 + streq r0, [sp, #0xc] + b _022E97A8 +_022E978C: + cmp r1, #1 + ldreq r1, [r0, #0x10] + cmpeq r1, #0 + ldreq r0, [r0, #0xc] + cmpeq r0, #0 + moveq r0, #1 + streq r0, [sp, #0xc] +_022E97A8: + ldr r0, [sp, #0xc] + cmp r0, #0 + beq _022E97CC + ldr r1, [sp, #0x18] + add r0, sp, #0x20 + strb r1, [r0, r4, lsl #1] + add r0, r0, r4, lsl #1 + strb r7, [r0, #1] + add r4, r4, #1 +_022E97CC: + add r7, r7, #1 + cmp r7, #0x20 + movge r7, #0 +_022E97D8: + add r6, r6, #1 +_022E97DC: + cmp r6, #0x20 + blt _022E96B4 +_022E97E4: + add sb, sb, #1 + cmp sb, #0x38 + movge sb, #0 + add r5, r5, #1 +_022E97F4: + cmp r5, #0x38 + blt _022E968C +_022E97FC: + cmp r4, #0 + beq _022E982C + mov r0, r4 + bl DungeonRandInt + add r2, sp, #0x20 + ldrb r2, [r2, r0, lsl #1] + add r1, sp, #0x21 + strh r2, [sl] + ldrb r1, [r1, r0, lsl #1] + mov r0, #1 + strh r1, [sl, #2] + b _022E983C +_022E982C: + add r8, r8, #1 +_022E9830: + cmp r8, #3 + blt _022E964C + mov r0, #0 +_022E983C: + add sp, sp, #0xe20 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end GetRandomTile + + arm_func_start FindNearbyUnoccupiedTile +FindNearbyUnoccupiedTile: ; 0x022E9844 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + mov r8, r3 + mov sl, r0 + mov r0, #0 + str r0, [sp, #4] + str r1, [sp] + add r3, r8, #1 + mov r1, r0 + mov r0, r3, lsl #1 + mov sb, r2 + ldr r7, [sp, #0x30] + bl MemAlloc + mov r4, r0 + mov r1, #0 + b _022E9890 +_022E9884: + mov r0, r1, lsl #1 + strh r1, [r4, r0] + add r1, r1, #1 +_022E9890: + cmp r1, r8 + blt _022E9884 + cmp r7, #0 + beq _022E9918 + mov r0, #4 + bl DungeonRandInt + add r0, r0, #1 + mov r0, r0, lsl #0x10 + str r0, [sp, #8] + sub fp, r8, #1 + mov r6, #0 + b _022E990C +_022E98C0: + mov r5, #0 + b _022E98F8 +_022E98C8: + mov r0, r8 + bl DungeonRandInt + mov r0, r0, lsl #0x10 + mov r3, r5, lsl #1 + mov r1, r0, asr #0xf + ldrsh r2, [r4, r3] + ldrsh r0, [r4, r1] + add r5, r5, #1 + mov r5, r5, lsl #0x10 + strh r0, [r4, r3] + strh r2, [r4, r1] + mov r5, r5, asr #0x10 +_022E98F8: + cmp r5, fp + blt _022E98C8 + add r0, r6, #1 + mov r0, r0, lsl #0x10 + mov r6, r0, asr #0x10 +_022E990C: + ldr r0, [sp, #8] + cmp r6, r0, asr #16 + blt _022E98C0 +_022E9918: + mov r6, #0 + b _022E99D0 +_022E9920: + mov r0, r6, lsl #1 + ldrsh r0, [r4, r0] + mov r0, r0, lsl #2 + ldrsh r5, [sb, r0] + cmp r5, #0x63 + beq _022E99D8 + add r1, sb, r0 + ldr r0, [sp] + ldrsh r1, [r1, #2] + ldrsh r3, [r0] + ldrsh r2, [r0, #2] + add fp, r3, r5 + add r5, r2, r1 + mov r0, fp + mov r1, r5 + bl GetTile + ldrh r1, [r0] + tst r1, #0x800 + bne _022E99CC + cmp r7, #0 + beq _022E99A0 + ldrb r2, [r0, #7] + cmp r2, #0xff + beq _022E99CC + ldr r2, _022E99EC ; =DUNGEON_PTR + ldr r2, [r2] + add r2, r2, #0xcc00 +#ifdef JAPAN + ldrsh r3, [r2, #0x40] + cmp r3, fp + ldreqsh r2, [r2, #0x42] +#else + ldrsh r3, [r2, #0xe4] + cmp r3, fp + ldreqsh r2, [r2, #0xe6] +#endif + cmpeq r2, r5 + beq _022E99CC +_022E99A0: + and r1, r1, #3 + cmp r1, #1 + ldreq r1, [r0, #0x10] + cmpeq r1, #0 + ldreq r0, [r0, #0xc] + cmpeq r0, #0 + streqh fp, [sl] + streqh r5, [sl, #2] + moveq r0, #1 + streq r0, [sp, #4] + beq _022E99D8 +_022E99CC: + add r6, r6, #1 +_022E99D0: + cmp r6, r8 + blt _022E9920 +_022E99D8: + mov r0, r4 + bl MemFree + ldr r0, [sp, #4] + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_022E99EC: .word DUNGEON_PTR + arm_func_end FindNearbyUnoccupiedTile diff --git a/asm/overlay_29_022E9A44.s b/asm/overlay_29_022E9A44.s new file mode 100644 index 00000000..c8266759 --- /dev/null +++ b/asm/overlay_29_022E9A44.s @@ -0,0 +1,414 @@ + .include "asm/macros.inc" + .include "overlay_29_022E9A44.inc" + + .text + + arm_func_start TickStatusTurnCounter +TickStatusTurnCounter: ; 0x022E9A44 + ldrb r1, [r0] + cmp r1, #0x7f + moveq r0, r1 + bxeq lr + cmp r1, #0 + moveq r0, r1 + subne r1, r1, #1 + strneb r1, [r0] + andne r0, r1, #0xff + bx lr + arm_func_end TickStatusTurnCounter + + arm_func_start ov29_022E9A6C +ov29_022E9A6C: ; 0x022E9A6C + ldrh r2, [r0] + ldr r1, _022E9A98 ; =0x00007530 + cmp r2, r1 + moveq r0, r2 + bxeq lr + cmp r2, #0 + moveq r0, r2 + subne r1, r2, #1 + strneh r1, [r0] + ldrneh r0, [r0] + bx lr + .align 2, 0 +_022E9A98: .word 0x00007530 + arm_func_end ov29_022E9A6C + + arm_func_start ov29_022E9A9C +ov29_022E9A9C: ; 0x022E9A9C +#ifdef JAPAN +#define OV29_022E9A9C_OFFSET -0xA4 +#else +#define OV29_022E9A9C_OFFSET 0 +#endif + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + mov sb, r1 + ldr r8, [sb, #0xb4] + mov sl, r0 + mov r0, sb + mov r1, #1 + ldrb r4, [r8, #0x4c] + bl CheckVariousStatuses2__02301244 + cmp r0, #0 + beq _022E9B00 + ldr r0, _022E9CA0 ; =DIRECTIONS_XY + mov r2, r4, lsl #2 + ldrsh r1, [r0, r2] + ldrsh r3, [sb, #4] + ldr r0, _022E9CA4 ; =DIRECTIONS_XY + 2 + add r1, r1, r1, lsl #1 + add r1, r3, r1 + strh r1, [sl] + ldrsh r0, [r0, r2] + ldrsh r1, [sb, #6] + add r0, r0, r0, lsl #1 + add r0, r1, r0 + strh r0, [sl, #2] + b _022E9C98 +_022E9B00: + ldrsh r2, [r8, #0x5a] + mvn r0, #0 + cmp r2, r0 + ldreqsh r1, [r8, #0x5c] + cmpeq r1, r0 + bne _022E9C8C + ldr r0, _022E9CA8 ; =DUNGEON_PTR + ldrb r6, [r8, #0x4c] + ldr r1, [r0] + ldr r4, _022E9CAC ; =ov29_0235179C + add r0, r1, #0x3000 + ldrb r0, [r0, #0xe38 + OV29_022E9A9C_OFFSET] + ldr r3, _022E9CB0 ; =ov29_023517A0 + mov r5, r6, lsl #3 + cmp r0, #0 + ldrsh r0, [r3, r5] + ldr r2, _022E9CB4 ; =ov29_023517A2 + ldr r4, [r4, r6, lsl #3] + str r0, [sp, #0x14] + ldrsh r0, [r2, r5] + str r0, [sp, #0x10] + ldrsh r0, [sb, #4] + str r0, [sp, #0xc] + ldrsh r0, [sb, #6] + str r0, [sp, #8] + beq _022E9B80 + add r0, r1, #0x378 + OV29_022E9A9C_OFFSET + add r0, r0, #0x12800 + str r0, [sp, #4] + mov r0, #0x14 + str r0, [sp] + b _022E9C44 +_022E9B80: + ldrb r0, [r8, #6] + cmp r0, #0 + bne _022E9BA4 + add r0, r1, #0x338 + OV29_022E9A9C_OFFSET + add r0, r0, #0x12800 + str r0, [sp, #4] + mov r0, #0x10 + str r0, [sp] + b _022E9C44 +_022E9BA4: + add r0, r1, #0x328 + OV29_022E9A9C_OFFSET + add r0, r0, #0x12800 + str r0, [sp, #4] + mov r0, #4 + str r0, [sp] + b _022E9C44 +_022E9BBC: + ldr r1, [sp, #0x14] + ldr r0, [sp, #0xc] + ldrsh r2, [r4, #2] + mla fp, r3, r1, r0 + ldr r1, [sp, #0x10] + ldr r0, [sp, #8] + mov r6, #0 + mla r5, r2, r1, r0 + b _022E9C34 +_022E9BE0: + ldr r0, [sp, #4] + ldr r7, [r0, r6, lsl #2] + mov r0, r7 + bl EntityIsValid__022E95F4 + cmp r0, #0 + beq _022E9C30 + ldrsh r0, [r7, #4] + cmp r0, fp + ldreqsh r0, [r7, #6] + cmpeq r0, r5 + bne _022E9C30 + mov r2, #0 + mov r1, r7 + mov r0, sb + mov r3, r2 + bl GetTreatmentBetweenMonsters + cmp r0, #1 + streqh fp, [sl] + streqh r5, [sl, #2] + beq _022E9C98 +_022E9C30: + add r6, r6, #1 +_022E9C34: + ldr r0, [sp] + cmp r6, r0 + blt _022E9BE0 + add r4, r4, #4 +_022E9C44: + ldrsh r3, [r4] + cmp r3, #0x63 + bne _022E9BBC + ldrb r1, [r8, #0x4c] + ldr r0, _022E9CA0 ; =DIRECTIONS_XY + ldrsh r2, [sb, #4] + mov r1, r1, lsl #2 + ldrsh r1, [r0, r1] + ldr r0, _022E9CA4 ; =DIRECTIONS_XY + 2 + add r1, r2, r1, lsl #1 + strh r1, [sl] + ldrb r1, [r8, #0x4c] + ldrsh r2, [sb, #6] + mov r1, r1, lsl #2 + ldrsh r0, [r0, r1] + add r0, r2, r0, lsl #1 + strh r0, [sl, #2] + b _022E9C98 +_022E9C8C: + strh r2, [sl] + ldrsh r0, [r8, #0x5c] + strh r0, [sl, #2] +_022E9C98: + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_022E9CA0: .word DIRECTIONS_XY +_022E9CA4: .word DIRECTIONS_XY + 2 +_022E9CA8: .word DUNGEON_PTR +_022E9CAC: .word ov29_0235179C +_022E9CB0: .word ov29_023517A0 +_022E9CB4: .word ov29_023517A2 + arm_func_end ov29_022E9A9C + + arm_func_start ov29_022E9CB8 +ov29_022E9CB8: ; 0x022E9CB8 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldr r1, _022E9F04 ; =DUNGEON_FRAMES_PASSED + ldr r0, _022E9F08 ; =0xFFFF000F + ldrh r2, [r1, #0x1a] + mov lr, #0 + and r2, r2, r0 + strh r2, [r1, #0x1a] + ldrh r2, [r1, #0x14] + bic r2, r2, #0x100 + strh r2, [r1, #0x14] + ldrh r2, [r1, #0x14] + bic r2, r2, #0x200 + strh r2, [r1, #0x14] + ldrh r2, [r1, #0x14] + bic r2, r2, #0xc00 + strh r2, [r1, #0x14] + ldrh r2, [r1, #0x14] + bic r2, r2, #0x1000 + strh r2, [r1, #0x14] + ldrh r2, [r1, #0x14] + bic r2, r2, #0x2000 + strh r2, [r1, #0x14] + ldrh r2, [r1, #0x14] + orr r2, r2, #0x2000 + strh r2, [r1, #0x14] + ldrh r2, [r1, #0x14] + bic r2, r2, #0xc000 + strh r2, [r1, #0x14] + ldrh r2, [r1, #0x16] + and r2, r2, r0, asr #7 + strh r2, [r1, #0x16] + ldrh r2, [r1, #0x16] + bic r2, r2, #0x3e00 + strh r2, [r1, #0x16] + ldrh r2, [r1, #0x16] + bic r2, r2, #0xc000 + strh r2, [r1, #0x16] + ldrh r2, [r1, #0x16] + orr r2, r2, #0x4000 + strh r2, [r1, #0x16] + ldrh r2, [r1, #0x18] + and r0, r2, r0, asr #6 + strh r0, [r1, #0x18] + ldrh r0, [r1, #0x18] + bic r0, r0, #0xc00 + strh r0, [r1, #0x18] + ldrh r0, [r1, #0x18] + bic r0, r0, #0xf000 + strh r0, [r1, #0x18] + ldrh r0, [r1, #0x1a] + bic r0, r0, #1 + strh r0, [r1, #0x1a] + ldrh r0, [r1, #0x1a] + bic r0, r0, #2 + strh r0, [r1, #0x1a] + ldrh r0, [r1, #0x1a] + bic r0, r0, #4 + strh r0, [r1, #0x1a] +_022E9DA0: + mov r0, #0x48 + mul r5, lr, r0 + ldr r3, _022E9F0C ; =ov29_0237C888 + mov r8, #0x400 + ldr r2, _022E9F10 ; =ov29_02351628 + mov r1, #0x18 + mla r6, lr, r1, r2 + ldr r0, _022E9F14 ; =ov29_02351658 + add r4, r3, r5 + add r5, r0, r5 + mov ip, #0 + rsb r8, r8, #0 + mov r7, #0xc +_022E9DD4: + mul r3, ip, r7 + ldrh r2, [r4, r3] + add r1, r5, r3 + ldr r0, [r5, r3] + bic r2, r2, #0x100 + strh r2, [r4, r3] + ldrh r2, [r4, r3] + ldr sl, [r1, #4] + ldr sb, [r1, #8] + bic r1, r2, #0x200 + strh r1, [r4, r3] + ldrh r1, [r4, r3] + mov r0, r0, lsl #0x1e + add r2, r4, r3 + bic r1, r1, #0xc00 + strh r1, [r4, r3] + ldrh r1, [r4, r3] + mov sl, sl, lsl #0x1e + and sb, sb, r8, lsr #22 + bic r1, r1, #0x1000 + strh r1, [r4, r3] + ldrh r1, [r4, r3] + bic r1, r1, #0x2000 + strh r1, [r4, r3] + ldrh r1, [r4, r3] + orr r1, r1, #0x2000 + strh r1, [r4, r3] + ldrh r1, [r4, r3] + bic r1, r1, #0xc000 + strh r1, [r4, r3] + ldrh r1, [r4, r3] + orr r0, r1, r0, lsr #16 + strh r0, [r4, r3] + ldrh r0, [r2, #2] + bic r0, r0, #0x3e00 + strh r0, [r2, #2] + ldrh r0, [r2, #2] + bic r0, r0, #0xc000 + strh r0, [r2, #2] + ldrh r0, [r2, #2] + orr r0, r0, sl, lsr #16 + strh r0, [r2, #2] + ldrh r0, [r2, #4] + and r0, r0, r8 + strh r0, [r2, #4] + ldrh r0, [r2, #4] + orr r0, r0, sb + strh r0, [r2, #4] + ldrh r0, [r2, #4] + bic r0, r0, #0xc00 + strh r0, [r2, #4] + ldrh r0, [r2, #4] + orr r0, r0, #0xc00 + strh r0, [r2, #4] + ldrh r3, [r2, #4] + mov r1, ip, lsl #2 + add r0, r6, ip, lsl #2 + bic r3, r3, #0xf000 + strh r3, [r2, #4] + ldrh r3, [r2, #6] + add ip, ip, #1 + ldrh r1, [r6, r1] + bic r3, r3, #1 + strh r3, [r2, #6] + ldrh r3, [r2, #6] + ldrh r0, [r0, #2] + cmp ip, #6 + bic r3, r3, #2 + strh r3, [r2, #6] + strh r1, [r2, #8] + strh r0, [r2, #0xa] + blt _022E9DD4 + add lr, lr, #1 + cmp lr, #2 + blt _022E9DA0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_022E9F04: .word DUNGEON_FRAMES_PASSED +_022E9F08: .word 0xFFFF000F +_022E9F0C: .word ov29_0237C888 +_022E9F10: .word ov29_02351628 +_022E9F14: .word ov29_02351658 + arm_func_end ov29_022E9CB8 + + arm_func_start ov29_022E9F18 +ov29_022E9F18: ; 0x022E9F18 + stmdb sp!, {r3, lr} + ldr r0, _022E9F70 ; =0x000003E7 + ldr r1, _022E9F74 ; =DUNGEON_FRAMES_PASSED + mov r2, #0 + str r0, [r1, #4] + ldr r0, _022E9F78 ; =ov29_02353560 + str r2, [r1, #0x10] + strb r2, [r0, #2] + strh r2, [r1, #0x1c] + bl ov29_022E9CB8 + ldr r2, _022E9F7C ; =DUNGEON_PTR + mov r3, #1 + ldr r0, [r2] + ldr r1, _022E9F74 ; =DUNGEON_FRAMES_PASSED + add r0, r0, #0x1a000 +#ifdef JAPAN + strb r3, [r0, #0x1a8] +#else + strb r3, [r0, #0x24c] +#endif + ldr r0, [r2] + mov r2, #0 + add r0, r0, #0x1a000 +#ifdef JAPAN + strb r3, [r0, #0x1a9] +#else + strb r3, [r0, #0x24d] +#endif + str r2, [r1, #0xc] + ldmia sp!, {r3, pc} + .align 2, 0 +_022E9F70: .word 0x000003E7 +_022E9F74: .word DUNGEON_FRAMES_PASSED +_022E9F78: .word ov29_02353560 +_022E9F7C: .word DUNGEON_PTR + arm_func_end ov29_022E9F18 + + arm_func_start ov29_022E9F80 +ov29_022E9F80: ; 0x022E9F80 + ldr r2, _022E9F98 ; =ov29_02353560 + mov r3, #0 + strb r0, [r2] + str r1, [r2, #8] + str r3, [r2, #0xc] + bx lr + .align 2, 0 +_022E9F98: .word ov29_02353560 + arm_func_end ov29_022E9F80 + + arm_func_start ov29_022E9F9C +ov29_022E9F9C: ; 0x022E9F9C + ldr r0, _022E9FBC ; =ov29_02353560 + ldrb r1, [r0, #1] + cmp r1, #0 + ldrneb r2, [r0, #5] + movne r1, #0 + strneb r2, [r0, #6] + strneb r1, [r0, #1] + bx lr + .align 2, 0 +_022E9FBC: .word ov29_02353560 + arm_func_end ov29_022E9F9C diff --git a/asm/overlay_29_022E9FE0.s b/asm/overlay_29_022E9FE0.s new file mode 100644 index 00000000..3745e9f3 --- /dev/null +++ b/asm/overlay_29_022E9FE0.s @@ -0,0 +1,753 @@ + .include "asm/macros.inc" + .include "overlay_29_022E9FE0.inc" + + .text + + arm_func_start AdvanceFrame +AdvanceFrame: ; 0x022E9FE0 + stmdb sp!, {r3, lr} + ldr r1, _022EA004 ; =ov29_02353560 + ldrb r1, [r1, #3] + cmp r1, #0 + beq _022E9FFC + bl ov29_022EA2A4 + ldmia sp!, {r3, pc} +_022E9FFC: + bl ov29_022EA324 + ldmia sp!, {r3, pc} + .align 2, 0 +_022EA004: .word ov29_02353560 + arm_func_end AdvanceFrame + + arm_func_start ov29_022EA008 +ov29_022EA008: ; 0x022EA008 +#ifdef JAPAN +#define OV29_022EA008_OFFSET -0xA4 +#else +#define OV29_022EA008_OFFSET 0 +#endif + stmdb sp!, {r3, lr} + ldr r0, _022EA290 ; =DUNGEON_PTR + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, _022EA294 ; =ov29_02353560 + ldrb r0, [r0, #3] + cmp r0, #0 + beq _022EA27C + bl ov29_0234B854 + bl HandleTopScreenFades + ldr r0, _022EA290 ; =DUNGEON_PTR + ldr r0, [r0] + cmp r0, #0 + beq _022EA0F8 + mov r0, #1 + bl UpdateCamera + ldr r1, _022EA290 ; =DUNGEON_PTR + ldr r0, _022EA298 ; =0x0001A224 + ldr ip, [r1] + add r1, r0, #2 + add r2, ip, #0x1a000 + ldrsh r3, [ip, r1] + ldr r1, [r2, #0x230 + OV29_022EA008_OFFSET] + ldrsh r0, [ip, r0] + sub r1, r3, r1 + mov r1, r1, lsl #0x10 + mov r1, r1, asr #0x10 + mov r2, #1 + mov r3, #0 + bl sub_02051E20 + ldr r1, _022EA290 ; =DUNGEON_PTR + ldr r0, [r1] + add ip, r0, #0x1a000 + ldrb r0, [ip, #0x251 + OV29_022EA008_OFFSET] + cmp r0, #0 + beq _022EA0DC + mov r0, #2 + strb r0, [ip, #0x23c + OV29_022EA008_OFFSET] + ldr r0, _022EA298 ; =0x0001A224 + ldr ip, [r1] + add r1, r0, #2 + add r2, ip, #0x1a000 + ldrsh r3, [ip, r1] + ldr r1, [r2, #0x230 + OV29_022EA008_OFFSET] + mov r2, #0 + sub r1, r3, r1 + mov r1, r1, lsl #0x10 + ldrsh r0, [ip, r0] + mov r3, r2 + mov r1, r1, asr #0x10 + bl sub_02051E20 + b _022EA0F8 +_022EA0DC: + mov r0, #0 + mov lr, #3 + mov r1, r0 + mov r2, r0 + mov r3, r0 + strb lr, [ip, #0x23c + OV29_022EA008_OFFSET] + bl sub_02051E20 +_022EA0F8: + bl ov29_0230473C + bl DisplayMonstersAndItems + bl ov29_022E335C + ldr r0, _022EA290 ; =DUNGEON_PTR + ldr r1, [r0] + ldrsh r0, [r1, #0x1c] + cmp r0, #0x64 + addlt r0, r0, #1 + strlth r0, [r1, #0x1c] + ldr r0, _022EA29C ; =DUNGEON_FRAMES_PASSED + ldr r0, [r0, #4] + cmp r0, #0 + cmpne r0, #3 + cmpne r0, #0xc + bne _022EA140 + mov r0, #0 + bl FlashLeaderIcon + b _022EA154 +_022EA140: + bl GetTopScreenOption + cmp r0, #3 + bne _022EA154 + mov r0, #1 + bl FlashLeaderIcon +_022EA154: + bl AnimateWaterShadows + bl ov29_022EA80C + bl DisplayUi + ldr r1, _022EA294 ; =ov29_02353560 + ldrb r0, [r1] + cmp r0, #0 + beq _022EA1D0 + ldr r0, _022EA290 ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, #0x1a000 + ldrb r2, [r0, #0x24a + OV29_022EA008_OFFSET] + cmp r2, #0 + beq _022EA1B8 + bl ov29_022DE11C + cmp r0, #0 + beq _022EA1D0 + ldr r0, _022EA290 ; =DUNGEON_PTR + mov r2, #0 + ldr r0, [r0] + ldr r1, _022EA294 ; =ov29_02353560 + add r0, r0, #0x1a000 + strb r2, [r0, #0x24a + OV29_022EA008_OFFSET] + ldr r0, [r1, #8] + str r0, [r1, #0xc] + b _022EA1D0 +_022EA1B8: + ldr r2, [r1, #0xc] + sub r2, r2, #1 + str r2, [r1, #0xc] + cmp r2, #0 + movle r1, #1 + strleb r1, [r0, #0x24a + OV29_022EA008_OFFSET] +_022EA1D0: + ldr r0, _022EA290 ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, #0x1a000 + ldrb r0, [r0, #0x24a + OV29_022EA008_OFFSET] + cmp r0, #0 + beq _022EA214 + bl GetAlertBoxLoadingStatus + cmp r0, #3 + beq _022EA214 + ldr r1, _022EA290 ; =DUNGEON_PTR + ldr r0, _022EA294 ; =ov29_02353560 + ldr r1, [r1] + ldrb r3, [r0, #2] + add r2, r1, #0x1e0 + mov r0, #0xa0 + mov r1, #0x20 + bl ov29_022DE134 +_022EA214: + ldr r1, _022EA290 ; =DUNGEON_PTR + ldr r0, _022EA2A0 ; =0x0001A21C + ldr r2, [r1] + add r1, r0, #2 + ldrsh r0, [r2, r0] + ldrsh r1, [r2, r1] + bl GetTile + cmp r0, #0 + beq _022EA260 + ldr r2, _022EA290 ; =DUNGEON_PTR + ldrb r1, [r0, #7] + ldr r2, [r2] + cmp r2, #0 + addne r0, r2, #0xc4 + OV29_022EA008_OFFSET + addne r0, r0, #0x4000 + add r2, r2, #0x21c + OV29_022EA008_OFFSET + moveq r0, #0 + add r2, r2, #0x1a000 + bl ov29_022ED800 +_022EA260: + bl RenderWeather3D + bl ov29_022E8C10 + ldr r0, _022EA290 ; =DUNGEON_PTR + ldr r0, [r0] +#ifdef JAPAN + add r0, r0, #0x2180 + add r0, r0, #0x18000 +#else + add r0, r0, #0x224 + add r0, r0, #0x1a000 +#endif + bl ov29_022DD8B4 +_022EA27C: + ldr r0, _022EA29C ; =DUNGEON_FRAMES_PASSED + ldr r1, [r0] + add r1, r1, #1 + str r1, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_022EA290: .word DUNGEON_PTR +_022EA294: .word ov29_02353560 +_022EA298: .word 0x0001A224 + OV29_022EA008_OFFSET +_022EA29C: .word DUNGEON_FRAMES_PASSED +_022EA2A0: .word 0x0001A21C + OV29_022EA008_OFFSET + arm_func_end ov29_022EA008 + + arm_func_start ov29_022EA2A4 +ov29_022EA2A4: ; 0x022EA2A4 + stmdb sp!, {r3, lr} + ldr r0, _022EA318 ; =DUNGEON_PTR + ldr r0, [r0] + cmp r0, #0 + bne _022EA2C0 + bl ov29_022DDEF8 + ldmia sp!, {r3, pc} +_022EA2C0: + ldr r0, _022EA31C ; =ov29_02353560 + ldrb r0, [r0, #6] + cmp r0, #0 + ldrne r0, _022EA320 ; =DUNGEON_FRAMES_PASSED + ldrne r1, [r0, #0x10] + addne r1, r1, #1 + strne r1, [r0, #0x10] + bl ov29_022DDEF8 + ldr r0, _022EA318 ; =DUNGEON_PTR + mov r1, #0 + ldr r0, [r0] + add r0, r0, #0x1a000 +#ifdef JAPAN + strb r1, [r0, #0x1a4] +#else + strb r1, [r0, #0x248] +#endif + bl InitWeirdMinimapMatrix + ldr r0, _022EA31C ; =ov29_02353560 + ldrb r0, [r0, #6] + cmp r0, #0 + ldrne r0, _022EA320 ; =DUNGEON_FRAMES_PASSED + ldrne r1, [r0, #0x10] + subne r1, r1, #1 + strne r1, [r0, #0x10] + ldmia sp!, {r3, pc} + .align 2, 0 +_022EA318: .word DUNGEON_PTR +_022EA31C: .word ov29_02353560 +_022EA320: .word DUNGEON_FRAMES_PASSED + arm_func_end ov29_022EA2A4 + + arm_func_start ov29_022EA324 +ov29_022EA324: ; 0x022EA324 + stmdb sp!, {r3, lr} + ldr r0, _022EA368 ; =ov29_02353560 + ldrb r0, [r0, #6] + cmp r0, #0 + ldrne r0, _022EA36C ; =DUNGEON_FRAMES_PASSED + ldrne r1, [r0, #0x10] + addne r1, r1, #1 + strne r1, [r0, #0x10] + bl ov29_022DDEF8 + ldr r0, _022EA368 ; =ov29_02353560 + ldrb r0, [r0, #6] + cmp r0, #0 + ldrne r0, _022EA36C ; =DUNGEON_FRAMES_PASSED + ldrne r1, [r0, #0x10] + subne r1, r1, #1 + strne r1, [r0, #0x10] + ldmia sp!, {r3, pc} + .align 2, 0 +_022EA368: .word ov29_02353560 +_022EA36C: .word DUNGEON_FRAMES_PASSED + arm_func_end ov29_022EA324 + + arm_func_start ov29_022EA370 +ov29_022EA370: ; 0x022EA370 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + ldr r4, _022EA3B0 ; =ov29_02353560 + b _022EA3A4 +_022EA384: + ldrb r0, [r4, #3] + cmp r0, #0 + mov r0, r5 + beq _022EA39C + bl ov29_022EA2A4 + b _022EA3A0 +_022EA39C: + bl ov29_022EA324 +_022EA3A0: + sub r6, r6, #1 +_022EA3A4: + cmp r6, #0 + bne _022EA384 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_022EA3B0: .word ov29_02353560 + arm_func_end ov29_022EA370 + + arm_func_start ov29_022EA3B4 +ov29_022EA3B4: ; 0x022EA3B4 + stmdb sp!, {r4, r5, r6, lr} + ldr r4, _022EA3F0 ; =DUNGEON_BUTTON_INPUT + ldr r5, _022EA3F4 ; =ov29_02353560 + mov r6, r0 +_022EA3C4: + ldrb r0, [r5, #3] + cmp r0, #0 + mov r0, r6 + beq _022EA3DC + bl ov29_022EA2A4 + b _022EA3E0 +_022EA3DC: + bl ov29_022EA324 +_022EA3E0: + ldrh r0, [r4] + tst r0, #0xf0 + bne _022EA3C4 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_022EA3F0: .word DUNGEON_BUTTON_INPUT +_022EA3F4: .word ov29_02353560 + arm_func_end ov29_022EA3B4 + + arm_func_start ov29_022EA3F8 +ov29_022EA3F8: ; 0x022EA3F8 + ldr ip, _022EA404 ; =ov29_022DE638 + mov r0, #0x100 + bx ip + .align 2, 0 +_022EA404: .word ov29_022DE638 + arm_func_end ov29_022EA3F8 + + arm_func_start ov29_022EA408 +ov29_022EA408: ; 0x022EA408 + ldr r0, _022EA414 ; =DUNGEON_FRAMES_PASSED + ldr r0, [r0, #4] + bx lr + .align 2, 0 +_022EA414: .word DUNGEON_FRAMES_PASSED + arm_func_end ov29_022EA408 + + arm_func_start ov29_022EA418 +ov29_022EA418: ; 0x022EA418 + ldr r1, _022EA424 ; =ov29_02353560 + strb r0, [r1, #4] + bx lr + .align 2, 0 +_022EA424: .word ov29_02353560 + arm_func_end ov29_022EA418 + + arm_func_start UnkMapRelatedFunc +UnkMapRelatedFunc: ; 0x022EA428 + stmdb sp!, {r4, lr} + ldr r1, _022EA620 ; =DUNGEON_FRAMES_PASSED + mov r4, r0 + ldr r0, [r1, #4] + cmp r4, r0 + ldmeqia sp!, {r4, pc} + cmp r4, #0xd + bgt _022EA48C + cmp r4, #0 + addge pc, pc, r4, lsl #2 + b _022EA614 +_022EA454: ; jump table + b _022EA4B4 ; case 0 + b _022EA498 ; case 1 + b _022EA540 ; case 2 + b _022EA4E0 ; case 3 + b _022EA540 ; case 4 + b _022EA570 ; case 5 + b _022EA508 ; case 6 + b _022EA524 ; case 7 + b _022EA5C4 ; case 8 + b _022EA5E0 ; case 9 + b _022EA614 ; case 10 + b _022EA5FC ; case 11 + b _022EA614 ; case 12 + b _022EA594 ; case 13 +_022EA48C: + ldr r0, _022EA624 ; =0x000003E7 + cmp r4, r0 + b _022EA614 +_022EA498: + ldr r0, _022EA628 ; =ov29_02353560 + ldrb r0, [r0, #3] + cmp r0, #0 + beq _022EA614 + mov r0, #0 + bl ov29_0234B1A4 + b _022EA614 +_022EA4B4: + ldr r0, _022EA628 ; =ov29_02353560 + ldrb r1, [r0, #3] + cmp r1, #0 + beq _022EA614 + ldrb r0, [r0, #4] + cmp r0, #0 + bne _022EA614 + bl UpdateMinimap + mov r0, #0 + bl ov29_02339FF4 + b _022EA614 +_022EA4E0: + ldr r0, _022EA628 ; =ov29_02353560 + ldrb r1, [r0, #3] + cmp r1, #0 + beq _022EA614 + ldrb r0, [r0, #4] + cmp r0, #0 + bne _022EA614 + mov r0, #1 + bl ov29_02339FF4 + b _022EA614 +_022EA508: + ldr r0, _022EA628 ; =ov29_02353560 + ldrb r0, [r0, #3] + cmp r0, #0 + beq _022EA614 + mov r0, #0 + bl ov29_0234B1A4 + b _022EA614 +_022EA524: + ldr r0, _022EA628 ; =ov29_02353560 + ldrb r0, [r0, #3] + cmp r0, #0 + beq _022EA614 + mov r0, #0 + bl ov29_0234B1A4 + b _022EA614 +_022EA540: + ldr r0, _022EA628 ; =ov29_02353560 + ldrb r0, [r0, #3] + cmp r0, #0 + beq _022EA614 + mov r0, #0 + bl ov29_0234B1A4 + bl GetBottomScreenOption + cmp r0, #0 + beq _022EA614 + mov r0, #0 + bl ov29_0233A248 + b _022EA614 +_022EA570: + ldr r0, _022EA628 ; =ov29_02353560 + ldrb r0, [r0, #3] + cmp r0, #0 + beq _022EA614 + mov r0, #0 + bl ov29_0234B1A4 + mov r0, #0 + bl ov29_0233A248 + b _022EA614 +_022EA594: + ldr r0, _022EA628 ; =ov29_02353560 + ldrb r1, [r0, #3] + cmp r1, #0 + beq _022EA5BC + ldrb r0, [r0, #4] + cmp r0, #0 + bne _022EA5BC + bl UpdateMinimap + mov r0, #1 + bl ov29_02339FF4 +_022EA5BC: + mov r4, #0 + b _022EA614 +_022EA5C4: + ldr r0, _022EA628 ; =ov29_02353560 + ldrb r0, [r0, #3] + cmp r0, #0 + beq _022EA614 + mov r0, #0 + bl ov29_0234B1A4 + b _022EA614 +_022EA5E0: + ldr r0, _022EA628 ; =ov29_02353560 + ldrb r0, [r0, #3] + cmp r0, #0 + beq _022EA614 + mov r0, #0 + bl ov29_0234B1A4 + b _022EA614 +_022EA5FC: + ldr r0, _022EA628 ; =ov29_02353560 + ldrb r0, [r0, #3] + cmp r0, #0 + beq _022EA614 + mov r0, #0 + bl ov29_0234B1A4 +_022EA614: + ldr r0, _022EA620 ; =DUNGEON_FRAMES_PASSED + str r4, [r0, #4] + ldmia sp!, {r4, pc} + .align 2, 0 +_022EA620: .word DUNGEON_FRAMES_PASSED +_022EA624: .word 0x000003E7 +_022EA628: .word ov29_02353560 + arm_func_end UnkMapRelatedFunc + + arm_func_start ov29_022EA62C +ov29_022EA62C: ; 0x022EA62C + ldr r1, _022EA644 ; =DUNGEON_FRAMES_PASSED + mov r2, #0xa + ldr ip, _022EA648 ; =ov29_0234B1A4 + mov r0, #0 + str r2, [r1, #4] + bx ip + .align 2, 0 +_022EA644: .word DUNGEON_FRAMES_PASSED +_022EA648: .word ov29_0234B1A4 + arm_func_end ov29_022EA62C + + arm_func_start AnimateWaterShadows +AnimateWaterShadows: ; 0x022EA64C + stmdb sp!, {r4, lr} + sub sp, sp, #8 + ldr r0, _022EA708 ; =DUNGEON_FRAMES_PASSED + mov r2, #0 + ldr r1, [r0, #8] + adds r1, r1, #1 + str r1, [r0, #8] + movmi r1, #0 + strmi r1, [r0, #8] + ldr r0, _022EA708 ; =DUNGEON_FRAMES_PASSED + ldr r1, [r0, #8] + cmp r1, #0xc + movge r1, #0 + strge r1, [r0, #8] + ldr r0, _022EA708 ; =DUNGEON_FRAMES_PASSED + mov r1, #0xb + ldr r3, [r0, #8] + mov r0, r3, asr #1 + add r0, r3, r0, lsr #30 + mov r0, r0, asr #2 + add ip, r0, r0, lsl #1 + str r2, [sp] + str r1, [sp, #4] + ldr r0, _022EA70C ; =ov29_02353540 + ldr r1, _022EA710 ; =OBJ_GRAPHICS_CONTROLS_PTR + ldr r2, [r0] + ldr r0, [r1] + add r1, r2, ip, lsl #8 + mov r2, #0x1e8 + mov r3, #0x100 + mov r4, ip, lsl #8 + bl ChangeSimpleObjTexture + mov r0, #0 + str r0, [sp] + mov r1, #0xb + str r1, [sp, #4] + ldr r0, _022EA70C ; =ov29_02353540 + ldr r1, _022EA710 ; =OBJ_GRAPHICS_CONTROLS_PTR + ldr ip, [r0] + add r3, r4, #0x100 + ldr r0, [r1] + add r1, ip, r3 + ldr r2, _022EA714 ; =0x000001EA + mov r3, #0x200 + bl ChangeSimpleObjTexture + add sp, sp, #8 + ldmia sp!, {r4, pc} + .align 2, 0 +_022EA708: .word DUNGEON_FRAMES_PASSED +_022EA70C: .word ov29_02353540 +_022EA710: .word OBJ_GRAPHICS_CONTROLS_PTR +_022EA714: .word 0x000001EA + arm_func_end AnimateWaterShadows + + arm_func_start DisplayAnimatedNumbers +DisplayAnimatedNumbers: ; 0x022EA718 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs sl, r0 + mov sb, r1 + mov r8, r2 + mov r7, r3 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _022EA7FC ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, #0x1a000 +#ifdef JAPAN + ldrb r0, [r0, #0x19a] +#else + ldrb r0, [r0, #0x23e] +#endif + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r6, #0 + mov fp, #0x29 + ldr r5, _022EA800 ; =DUNGEON_FRAMES_PASSED + ldr r4, _022EA804 ; =ov29_02353560 + b _022EA78C +_022EA75C: + ldrsh r0, [r5, #0x1c] + cmp r0, #0 + beq _022EA794 + ldrb r0, [r4, #3] + cmp r0, #0 + beq _022EA780 + mov r0, fp + bl ov29_022EA2A4 + b _022EA788 +_022EA780: + mov r0, #0x29 + bl ov29_022EA324 +_022EA788: + add r6, r6, #1 +_022EA78C: + cmp r6, #0x14 + blt _022EA75C +_022EA794: + ldr r1, _022EA800 ; =DUNGEON_FRAMES_PASSED + mov r0, #0x3c + str sl, [r1, #0x20] + strb r8, [r1, #0x24] + strh r0, [r1, #0x1c] + str sb, [r1, #0x28] + ldrh r2, [sb, #0x26] + mov r0, #0 + cmp r7, #0 + str r2, [r1, #0x2c] + str r0, [r1, #0x30] + str r0, [r1, #0x34] + bge _022EA7F4 + ldr r0, _022EA808 ; =0xFFFFFC19 + cmp sl, r0 + movlt r0, #6 + strlth r0, [r1, #0x1e] + ldmltia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp sl, #0 + movge r0, #0xa + strgeh r0, [r1, #0x1e] + movlt r0, #3 + strlth r0, [r1, #0x1e] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_022EA7F4: + strh r7, [r1, #0x1e] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_022EA7FC: .word DUNGEON_PTR +_022EA800: .word DUNGEON_FRAMES_PASSED +_022EA804: .word ov29_02353560 +_022EA808: .word 0xFFFFFC19 + arm_func_end DisplayAnimatedNumbers + + arm_func_start ov29_022EA80C +ov29_022EA80C: ; 0x022EA80C + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0xc + ldr r0, _022EA95C ; =DUNGEON_FRAMES_PASSED + ldrsh r1, [r0, #0x1c] + cmp r1, #0 + beq _022EA954 + ldr r0, [r0, #0x28] + cmp r0, #0 + moveq r0, #0 + beq _022EA848 + ldr r0, [r0] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + and r0, r0, #0xff +_022EA848: + cmp r0, #0 + ldreq r0, _022EA95C ; =DUNGEON_FRAMES_PASSED + moveq r1, #0 + streqh r1, [r0, #0x1c] + beq _022EA954 + ldr r3, _022EA95C ; =DUNGEON_FRAMES_PASSED + ldr r5, [r3, #0x28] + ldr r1, [r3, #0x2c] + ldrh r0, [r5, #0x26] + cmp r1, r0 + movne r0, #0 + strneh r0, [r3, #0x1c] + bne _022EA954 + ldrsh r2, [r3, #0x1c] + ldr r1, _022EA960 ; =DUNGEON_PTR + ldr r0, _022EA964 ; =0x0001A224 + sub r2, r2, #1 + strh r2, [r3, #0x1c] + ldr r4, [r3, #0x34] + add r2, r0, #2 + sub lr, r4, #0x2e + str lr, [r3, #0x34] + ldr r4, [r5, #0xb4] + ldr ip, [r1] + add r1, r4, #0x100 +#ifdef JAPAN + ldrsh r5, [r1, #0x7e] + ldrsh r4, [r1, #0x80] +#else + ldrsh r5, [r1, #0x82] + ldrsh r4, [r1, #0x84] +#endif + ldr r1, [r3, #0x30] + ldrsh r0, [ip, r0] + add r5, r5, r1, asr #8 + ldrsh r1, [ip, r2] + add r4, r4, lr, asr #8 + sub r2, r4, #0x18 + sub r4, r5, r0 + mvn r0, #0x1f + cmp r4, r0 + sub r5, r2, r1 + addge r0, r0, #0x18 + cmpge r5, r0 + blt _022EA954 + cmp r4, #0xff + cmplt r5, #0xc0 + bge _022EA954 + ldrsh r1, [r3, #0x1c] + mov r0, #0xff + cmp r1, #0x1f + bge _022EA910 + rsb r0, r1, r1, lsl #8 + mov r1, #0x1f + bl _s32_div_f +_022EA910: + ldr ip, _022EA95C ; =DUNGEON_FRAMES_PASSED + mov r1, r4, lsl #0x10 + ldrh r4, [ip, #0x1e] + mov r2, r5, lsl #0x10 + mov r3, r0, lsl #0x10 + str r4, [sp] + ldr r4, [ip, #0x20] + mov r0, r1, asr #0x10 + mov r1, r4, lsl #0x10 + mov r1, r1, asr #0x10 + str r1, [sp, #4] + ldrb r4, [ip, #0x24] + mov r1, r2, asr #0x10 + mov r3, r3, asr #0x10 + mov r2, #0xff + str r4, [sp, #8] + bl ov29_02335F40 +_022EA954: + add sp, sp, #0xc + ldmia sp!, {r4, r5, pc} + .align 2, 0 +_022EA95C: .word DUNGEON_FRAMES_PASSED +_022EA960: .word DUNGEON_PTR +#ifdef JAPAN +_022EA964: .word 0x0001A180 +#else +_022EA964: .word 0x0001A224 +#endif + arm_func_end ov29_022EA80C diff --git a/asm/overlay_29_022EA980.s b/asm/overlay_29_022EA980.s new file mode 100644 index 00000000..7edcd3b2 --- /dev/null +++ b/asm/overlay_29_022EA980.s @@ -0,0 +1,28 @@ + .include "asm/macros.inc" + .include "overlay_29_022EA980.inc" + + .text + + arm_func_start GenerateDungeonRngSeed +GenerateDungeonRngSeed: ; 0x022EA980 + ldr r2, _022EA9C4 ; =DUNGEON_PRNG_STATE + mov r1, #0x10000 + ldr r3, [r2, #8] + ldr r0, _022EA9C8 ; =0x5D588B65 + rsb r1, r1, #0 + mul ip, r3, r0 + add ip, ip, #1 + mul r0, ip, r0 + add r3, r0, #1 + mov r0, ip, lsr #0x10 + mov r0, r0, lsl #0x10 + and r1, r3, r1 + orr r0, r1, r0, lsr #16 + bic r0, r0, #0xff000000 + str r3, [r2, #8] + orr r0, r0, #1 + bx lr + .align 2, 0 +_022EA9C4: .word DUNGEON_PRNG_STATE +_022EA9C8: .word 0x5D588B65 + arm_func_end GenerateDungeonRngSeed diff --git a/asm/overlay_29_02341E6C.s b/asm/overlay_29_02341E6C.s index d023728c..dc92cea0 100644 --- a/asm/overlay_29_02341E6C.s +++ b/asm/overlay_29_02341E6C.s @@ -1986,660 +1986,3 @@ _02343960: .word 0x00000229 _02343964: .word FIXED_ROOM_MONSTER_SPAWN_STATS_TABLE _02343968: .word 0x0002C9E6 + PLACE_FIXED_ROOM_TILE_OFFSET arm_func_end PlaceFixedRoomTile - - arm_func_start FixedRoomActionParamToDirection -FixedRoomActionParamToDirection: ; 0x0234396C - cmp r0, #0 - moveq r0, #0xff - subne r0, r0, #1 - andne r0, r0, #0xff - bx lr - arm_func_end FixedRoomActionParamToDirection - - arm_func_start ov29_02343980 -ov29_02343980: ; 0x02343980 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, #0 - mov r4, r7 - mov r5, r7 -_02343990: - mov r6, r5 -_02343994: - mov r0, r6 - mov r1, r7 - bl GetTileSafe - ldrb r1, [r0, #6] - cmp r1, #0x10 - blo _023439BC - mov r2, r6 - mov r3, r7 - str r4, [sp] - bl PlaceFixedRoomTile -_023439BC: - add r6, r6, #1 - cmp r6, #0x38 - blt _02343994 - add r7, r7, #1 - cmp r7, #0x20 - blt _02343990 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ov29_02343980 - - arm_func_start TryOpenKeyDoor -TryOpenKeyDoor: ; 0x023439D8 -#ifdef JAPAN -#define OV29_023439D8_OFFSET -0xA4 -#else -#define OV29_023439D8_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x10 - ldr r4, _02343CD0 ; =DUNGEON_PTR - mov sb, r1 - ldr r4, [r4] - mov sl, r0 - add r1, r4, #0x4000 - ldrb r1, [r1, #0xc5 + OV29_023439D8_OFFSET] - str r2, [sp, #4] - cmp r1, #0 - bne _02343CC0 - bl IsFullFloorFixedRoom - ldrsh r1, [sl, #4] - cmp r0, #0 - str r0, [sp, #8] - strh r1, [sp, #0xc] - ldrsh r0, [sl, #6] - sub r0, r0, #1 - strh r0, [sp, #0xe] - ldrb fp, [sl, #0x25] - bne _02343C24 - ldrsh r0, [sl, #6] - sub r8, r0, #0x15 - b _02343B68 -_02343A38: - ldrsh r0, [sl, #4] - sub r4, r0, #0x14 - b _02343B54 -_02343A44: - ldr r0, _02343CD0 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0xc000 - ldr r1, [r0, #0xd24 + OV29_023439D8_OFFSET] - ldr r2, [r0, #0xd28 + OV29_023439D8_OFFSET] - subs r5, r4, r1 - sub r6, r8, r2 - bmi _02343B50 - cmp r6, #0 - blt _02343B50 - cmp r5, #8 - cmplt r6, #8 - bge _02343B50 - add r1, r1, #1 - cmp r4, r1 - addge r1, r2, #1 - cmpge r8, r1 - blt _02343B50 - ldr r1, [r0, #0xd2c + OV29_023439D8_OFFSET] - sub r1, r1, #1 - cmp r4, r1 - ldrlt r0, [r0, #0xd30 + OV29_023439D8_OFFSET] - sublt r0, r0, #1 - cmplt r8, r0 - bge _02343B50 - mov r0, r4 - mov r1, r8 - bl GetTileSafe - mov r7, r0 - ldrh r0, [r7] - tst r0, #0x100 - beq _02343B0C - mov r0, #0xa0 - mul r1, r5, r0 - mov r0, #0x14 - ldr r2, _02343CD0 ; =DUNGEON_PTR - mul r0, r6, r0 - ldr r2, [r2] - add r2, r2, r1 - add r2, r0, r2 -#ifdef JAPAN - add r2, r2, #0xcc00 - ldrh r2, [r2, #0xbc] -#else - add r2, r2, #0xcd00 - ldrh r2, [r2, #0x60] -#endif - strh r2, [r7] - ldr r2, _02343CD0 ; =DUNGEON_PTR - ldr r2, [r2] - add r1, r2, r1 - add r0, r0, r1 -#ifdef JAPAN - add r0, r0, #0xcc00 - ldrh r0, [r0, #0xbe] -#else - add r0, r0, #0xcd00 - ldrh r0, [r0, #0x62] -#endif - strh r0, [r7, #2] -_02343B0C: - mov r0, #1 - str r0, [sp] - ldr r1, _02343CD0 ; =DUNGEON_PTR - mov r0, r7 - ldr r1, [r1] - mov r2, r4 - add r1, r1, r5, lsl #4 - add r1, r1, r6, lsl #1 -#ifdef JAPAN - add r1, r1, #0xd100 - ldrh r1, [r1, #0xbc] -#else - add r1, r1, #0xd200 - ldrh r1, [r1, #0x60] -#endif - mov r3, r8 - bl PlaceFixedRoomTile - ldrh r0, [r7, #2] - cmp fp, #0xff - orr r0, r0, #3 - strh r0, [r7, #2] - strneb fp, [r7, #7] -_02343B50: - add r4, r4, #1 -_02343B54: - ldrsh r0, [sl, #4] - add r0, r0, #0x14 - cmp r4, r0 - ble _02343A44 - add r8, r8, #1 -_02343B68: - ldrsh r1, [sl, #6] - add r0, r1, #0x13 - cmp r8, r0 - ble _02343A38 - sub r4, r1, #0x15 - b _02343C14 -_02343B80: - ldrsh r0, [sl, #4] - ldr r6, _02343CD0 ; =DUNGEON_PTR - sub r5, r0, #0x14 - b _02343C00 -_02343B90: - ldr r0, [r6] - add r0, r0, #0xc000 - ldr r7, [r0, #0xd24 + OV29_023439D8_OFFSET] - ldr r2, [r0, #0xd28 + OV29_023439D8_OFFSET] - subs r3, r5, r7 - sub r1, r4, r2 - bmi _02343BFC - cmp r1, #0 - blt _02343BFC - cmp r3, #8 - cmplt r1, #8 - bge _02343BFC - add r1, r7, #1 - cmp r5, r1 - addge r1, r2, #1 - cmpge r4, r1 - blt _02343BFC - ldr r1, [r0, #0xd2c + OV29_023439D8_OFFSET] - sub r1, r1, #1 - cmp r5, r1 - ldrlt r0, [r0, #0xd30 + OV29_023439D8_OFFSET] - sublt r0, r0, #1 - cmplt r4, r0 - bge _02343BFC - mov r0, r5 - mov r1, r4 - bl ov29_02336694 -_02343BFC: - add r5, r5, #1 -_02343C00: - ldrsh r0, [sl, #4] - add r0, r0, #0x14 - cmp r5, r0 - ble _02343B90 - add r4, r4, #1 -_02343C14: - ldrsh r0, [sl, #6] - add r0, r0, #0x13 - cmp r4, r0 - ble _02343B80 -_02343C24: - ldr r0, _02343CD0 ; =DUNGEON_PTR - mov r2, #1 - ldr r0, [r0] - ldr r1, _02343CD4 ; =0xFFFFCFEF - add r0, r0, #0x4000 - strb r2, [r0, #0xc5 + OV29_023439D8_OFFSET] - ldr r0, [sp, #8] - ldrh r2, [sb] - cmp r0, #0 - and r0, r2, r1 - strh r0, [sb] - beq _02343C6C - ldrh r0, [sb] - bic r0, r0, #3 - strh r0, [sb] - ldrh r0, [sb] - orr r0, r0, #1 - strh r0, [sb] -_02343C6C: - ldrsh r1, [sl, #6] - ldrsh r0, [sl, #4] - sub r1, r1, #1 - bl ov29_02336694 - bl DetermineAllTilesWalkableNeighbors - bl UpdateTrapsVisibility - mov r0, #0xc - bl IsCurrentMissionType - cmp r0, #0 - moveq r1, #1 - movne r1, #0 - add r0, sp, #0xc - and r1, r1, #0xff - bl PlayKeyDoorUnlockEffect - ldr r1, [sp, #4] - mov r0, sl - bl LogMessageByIdWithPopupCheckUser - mov r0, #0x14 - mov r1, #0x3c - bl ov29_022EA370 - b _02343CC8 -_02343CC0: - mov r1, r3 - bl LogMessageByIdWithPopupCheckUser -_02343CC8: - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02343CD0: .word DUNGEON_PTR -_02343CD4: .word 0xFFFFCFEF - arm_func_end TryOpenKeyDoor - - arm_func_start ApplyKeyEffect -ApplyKeyEffect: ; 0x02343CD8 - stmdb sp!, {r4, lr} - mov r4, r0 - ldrsh r1, [r4, #6] - ldrsh r0, [r4, #4] - sub r1, r1, #1 - bl GetTileSafe - mov r1, r0 - ldrh r0, [r1] - tst r0, #0x1000 - bne _02343D10 - ldr r1, _02343D28 ; =0x00000B94 - mov r0, r4 - bl LogMessageByIdWithPopupCheckUser - ldmia sp!, {r4, pc} -_02343D10: - ldr r2, _02343D2C ; =0x00000B93 - mov r0, r4 - add r3, r2, #1 - bl TryOpenKeyDoor - bl UpdateMinimap - ldmia sp!, {r4, pc} - .align 2, 0 -#ifdef JAPAN -_02343D28: .word 0x000008A6 -_02343D2C: .word 0x000008A5 -#else -_02343D28: .word 0x00000B94 -_02343D2C: .word 0x00000B93 -#endif - arm_func_end ApplyKeyEffect - - arm_func_start ov29_02343D30 -ov29_02343D30: ; 0x02343D30 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldrsh r1, [r5, #6] - ldrsh r0, [r5, #4] - sub r1, r1, #1 - bl GetTileSafe - mov r4, r0 - ldrh r0, [r4] - tst r0, #0x2000 - bne _02343D68 - ldr r1, _02343D88 ; =0x00000B95 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - ldmia sp!, {r3, r4, r5, pc} -_02343D68: - bl ov29_02348BE8 - ldr r2, _02343D8C ; =0x00000B93 - mov r0, r5 - mov r1, r4 - add r3, r2, #2 - bl TryOpenKeyDoor - bl UpdateMinimap - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_02343D88: .word 0x000008A7 -_02343D8C: .word 0x000008A5 -#else -_02343D88: .word 0x00000B95 -_02343D8C: .word 0x00000B93 -#endif - arm_func_end ov29_02343D30 - - arm_func_start LoadFixedRoomData -LoadFixedRoomData: ; 0x02343D90 - stmdb sp!, {r3, lr} - ldr r0, _02343DBC ; =FIXED_ROOM_DATA_PTR - ldr r1, _02343DC0 ; =ov29_02353110 - ldr r0, [r0] - mov r2, #0 - bl LoadFileFromRom - ldr r0, _02343DBC ; =FIXED_ROOM_DATA_PTR - ldr r0, [r0] - ldr r1, [r0], #8 - bl HandleSir0Translation - ldmia sp!, {r3, pc} - .align 2, 0 -_02343DBC: .word FIXED_ROOM_DATA_PTR -_02343DC0: .word ov29_02353110 - arm_func_end LoadFixedRoomData - - arm_func_start ov29_02343DC4 -ov29_02343DC4: ; 0x02343DC4 - ldr r0, _02343DD4 ; =FIXED_ROOM_DATA_PTR - ldr r0, [r0] - ldr r0, [r0, #8] - bx lr - .align 2, 0 -_02343DD4: .word FIXED_ROOM_DATA_PTR - arm_func_end ov29_02343DC4 - - arm_func_start ov29_02343DD8 -ov29_02343DD8: ; 0x02343DD8 - stmdb sp!, {r3, lr} - ldr r0, _02343E1C ; =FIXED_ROOM_DATA_PTR - ldr r0, [r0] - bl PointsToZero - cmp r0, #0 - ldmneia sp!, {r3, pc} - ldr r0, _02343E1C ; =FIXED_ROOM_DATA_PTR - ldr r0, [r0] - bl UnloadFile - ldr r0, _02343E1C ; =FIXED_ROOM_DATA_PTR - ldr r0, [r0] - bl ZInit8 - ldr r0, _02343E1C ; =FIXED_ROOM_DATA_PTR - mov r1, #0 - ldr r0, [r0] - str r1, [r0, #8] - ldmia sp!, {r3, pc} - .align 2, 0 -_02343E1C: .word FIXED_ROOM_DATA_PTR - arm_func_end ov29_02343DD8 - - arm_func_start LoadFixedRoom -LoadFixedRoom: ; 0x02343E20 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x14 - movs r4, r2 - mov sl, r0 - str r1, [sp] - str r3, [sp, #4] - moveq r0, #0 - beq _0234402C - bl LoadFixedRoomData - ldr r0, _02344034 ; =FIXED_ROOM_DATA_PTR - ldr r0, [r0] - ldr r0, [r0, #8] - ldr r0, [r0, r4, lsl #2] - ldrh r4, [r0] - ldrh r5, [r0, #2] - bl ov29_02342BEC - mul fp, r4, r5 - mov sb, #0 - str r0, [sp, #8] - mov r4, r0 - mov r5, sb - b _02344014 -_02343E78: - ldrh r2, [r4] - ldr r1, _02344038 ; =0x00000FFF - ldr r0, [sp] - and r2, r2, r1 - cmp sb, r0 - bge _0234401C - cmp r2, #0x10 - blt _0234400C - sub r0, r1, #0xe00 - cmp r2, r0 - bgt _0234400C - ldr r1, _0234403C ; =FIXED_ROOM_ENTITY_SPAWN_TABLE - sub r2, r2, #0x10 - mov r0, #0xc - smlabb r0, r2, r0, r1 - ldr r6, [r0, #4] - ldrsh r0, [r6] - cmp r0, #0 - ldrne r1, _02344040 ; =0x00000229 - cmpne r0, r1 - ldrne r1, _02344044 ; =0x00000483 - cmpne r0, r1 - beq _0234400C - bl GetMatchingMonsterId - movs r8, r0 - beq _0234400C - mov r7, #0 - b _02343EFC -_02343EE8: - add r0, sl, r7, lsl #3 - bl GetMonsterIdFromSpawnEntry - cmp r8, r0 - beq _02343F04 - add r7, r7, #1 -_02343EFC: - cmp r7, sb - blt _02343EE8 -_02343F04: - cmp r7, sb - bne _0234400C - ldrb r0, [r6, #3] - cmp r0, #1 - bne _02343F40 - ldr r0, _02344048 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x348 - add r0, r0, #0x400 - bl GetOutlawLevel - mov r1, r0 - add r0, sp, #0xc - mov r2, r8 - bl SetMonsterLevelAndId - b _02343FE8 -_02343F40: - cmp r0, #4 - bne _02343F70 - ldr r0, _02344048 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x348 - add r0, r0, #0x400 - bl GetOutlawLeaderLevel - mov r1, r0 - add r0, sp, #0xc - mov r2, r8 - bl SetMonsterLevelAndId - b _02343FE8 -_02343F70: - cmp r0, #5 - bne _02343FA0 - ldr r0, _02344048 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x348 - add r0, r0, #0x400 - bl GetOutlawMinionLevel - mov r1, r0 - add r0, sp, #0xc - mov r2, r8 - bl SetMonsterLevelAndId - b _02343FE8 -_02343FA0: - ldrb r3, [r6, #2] - cmp r3, #0 - ldrnesh r1, [r6] - ldrne r0, _0234404C ; =0x00000485 - cmpne r1, r0 - bne _02343FCC - ldr r1, [sp, #4] - add r0, sp, #0xc - mov r2, r8 - bl SetMonsterLevelAndId - b _02343FE8 -_02343FCC: - mov r0, #0xc - mul r2, r3, r0 - ldr r1, _02344050 ; =FIXED_ROOM_MONSTER_SPAWN_STATS_TABLE - add r0, sp, #0xc - ldrsh r1, [r1, r2] - mov r2, r8 - bl SetMonsterLevelAndId -_02343FE8: - mov r0, sb, lsl #3 - add r3, sp, #0xc - add sb, sb, #1 - add r2, sl, r0 - mov r1, #4 -_02343FFC: - ldrh r0, [r3], #2 - subs r1, r1, #1 - strh r0, [r2], #2 - bne _02343FFC -_0234400C: - add r5, r5, #1 - add r4, r4, #2 -_02344014: - cmp r5, fp - blt _02343E78 -_0234401C: - ldr r0, [sp, #8] - bl MemFree - bl ov29_02343DD8 - mov r0, sb -_0234402C: - add sp, sp, #0x14 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02344034: .word FIXED_ROOM_DATA_PTR -_02344038: .word 0x00000FFF -_0234403C: .word FIXED_ROOM_ENTITY_SPAWN_TABLE -_02344040: .word 0x00000229 -_02344044: .word 0x00000483 -_02344048: .word DUNGEON_PTR -_0234404C: .word 0x00000485 -_02344050: .word FIXED_ROOM_MONSTER_SPAWN_STATS_TABLE - arm_func_end LoadFixedRoom - - arm_func_start OpenFixedBin -OpenFixedBin: ; 0x02344054 - stmdb sp!, {r3, lr} - mov r0, #0xc - mov r1, #0 - bl MemAlloc - ldr r2, _02344084 ; =FIXED_ROOM_DATA_PTR - mov r1, #0xc - str r0, [r2] - bl MemZero - ldr r0, _02344084 ; =FIXED_ROOM_DATA_PTR - ldr r0, [r0] - bl ZInit8 - ldmia sp!, {r3, pc} - .align 2, 0 -_02344084: .word FIXED_ROOM_DATA_PTR - arm_func_end OpenFixedBin - - arm_func_start CloseFixedBin -CloseFixedBin: ; 0x02344088 - stmdb sp!, {r3, lr} - ldr r0, _023440A8 ; =FIXED_ROOM_DATA_PTR - ldr r0, [r0] - bl MemFree - ldr r0, _023440A8 ; =FIXED_ROOM_DATA_PTR - mov r1, #0 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_023440A8: .word FIXED_ROOM_DATA_PTR - arm_func_end CloseFixedBin - - arm_func_start AreOrbsAllowed -AreOrbsAllowed: ; 0x023440AC - cmp r0, #0 - beq _023440BC - cmp r0, #0xa5 - blo _023440C4 -_023440BC: - mov r0, #1 - bx lr -_023440C4: - mov r1, #0xc - mul r1, r0, r1 - ldr r0, _023440D8 ; =ov10_022C6C77 - ldrb r0, [r0, r1] - bx lr - .align 2, 0 -_023440D8: .word ov10_022C6C77 - arm_func_end AreOrbsAllowed - - arm_func_start AreTileJumpsAllowed -AreTileJumpsAllowed: ; 0x023440DC - cmp r0, #0 - beq _023440EC - cmp r0, #0xa5 - blo _023440F4 -_023440EC: - mov r0, #1 - bx lr -_023440F4: - mov r1, #0xc - mul r1, r0, r1 - ldr r0, _02344108 ; =ov10_022C6C78 - ldrb r0, [r0, r1] - bx lr - .align 2, 0 -_02344108: .word ov10_022C6C78 - arm_func_end AreTileJumpsAllowed - - arm_func_start AreTrawlOrbsAllowed -AreTrawlOrbsAllowed: ; 0x0234410C - cmp r0, #0 - beq _0234411C - cmp r0, #0xa5 - blo _02344124 -_0234411C: - mov r0, #1 - bx lr -_02344124: - mov r1, #0xc - mul r1, r0, r1 - ldr r0, _02344138 ; =ov10_022C6C79 - ldrb r0, [r0, r1] - bx lr - .align 2, 0 -_02344138: .word ov10_022C6C79 - arm_func_end AreTrawlOrbsAllowed - - arm_func_start AreOrbsAllowedVeneer -AreOrbsAllowedVeneer: ; 0x0234413C - ldr ip, _02344144 ; =AreOrbsAllowed - bx ip - .align 2, 0 -_02344144: .word AreOrbsAllowed - arm_func_end AreOrbsAllowedVeneer - - arm_func_start AreLateGameTrapsEnabled -AreLateGameTrapsEnabled: ; 0x02344148 - mov r1, #0xc - mul r1, r0, r1 - ldr r0, _0234415C ; =ov10_022C6C75 - ldrb r0, [r0, r1] - bx lr - .align 2, 0 -_0234415C: .word ov10_022C6C75 - arm_func_end AreLateGameTrapsEnabled diff --git a/asm/overlay_29_02343980.s b/asm/overlay_29_02343980.s new file mode 100644 index 00000000..af310feb --- /dev/null +++ b/asm/overlay_29_02343980.s @@ -0,0 +1,652 @@ + .include "asm/macros.inc" + .include "overlay_29_02343980.inc" + + .text + + arm_func_start ov29_02343980 +ov29_02343980: ; 0x02343980 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, #0 + mov r4, r7 + mov r5, r7 +_02343990: + mov r6, r5 +_02343994: + mov r0, r6 + mov r1, r7 + bl GetTileSafe + ldrb r1, [r0, #6] + cmp r1, #0x10 + blo _023439BC + mov r2, r6 + mov r3, r7 + str r4, [sp] + bl PlaceFixedRoomTile +_023439BC: + add r6, r6, #1 + cmp r6, #0x38 + blt _02343994 + add r7, r7, #1 + cmp r7, #0x20 + blt _02343990 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov29_02343980 + + arm_func_start TryOpenKeyDoor +TryOpenKeyDoor: ; 0x023439D8 +#ifdef JAPAN +#define OV29_023439D8_OFFSET -0xA4 +#else +#define OV29_023439D8_OFFSET 0 +#endif + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x10 + ldr r4, _02343CD0 ; =DUNGEON_PTR + mov sb, r1 + ldr r4, [r4] + mov sl, r0 + add r1, r4, #0x4000 + ldrb r1, [r1, #0xc5 + OV29_023439D8_OFFSET] + str r2, [sp, #4] + cmp r1, #0 + bne _02343CC0 + bl IsFullFloorFixedRoom + ldrsh r1, [sl, #4] + cmp r0, #0 + str r0, [sp, #8] + strh r1, [sp, #0xc] + ldrsh r0, [sl, #6] + sub r0, r0, #1 + strh r0, [sp, #0xe] + ldrb fp, [sl, #0x25] + bne _02343C24 + ldrsh r0, [sl, #6] + sub r8, r0, #0x15 + b _02343B68 +_02343A38: + ldrsh r0, [sl, #4] + sub r4, r0, #0x14 + b _02343B54 +_02343A44: + ldr r0, _02343CD0 ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, #0xc000 + ldr r1, [r0, #0xd24 + OV29_023439D8_OFFSET] + ldr r2, [r0, #0xd28 + OV29_023439D8_OFFSET] + subs r5, r4, r1 + sub r6, r8, r2 + bmi _02343B50 + cmp r6, #0 + blt _02343B50 + cmp r5, #8 + cmplt r6, #8 + bge _02343B50 + add r1, r1, #1 + cmp r4, r1 + addge r1, r2, #1 + cmpge r8, r1 + blt _02343B50 + ldr r1, [r0, #0xd2c + OV29_023439D8_OFFSET] + sub r1, r1, #1 + cmp r4, r1 + ldrlt r0, [r0, #0xd30 + OV29_023439D8_OFFSET] + sublt r0, r0, #1 + cmplt r8, r0 + bge _02343B50 + mov r0, r4 + mov r1, r8 + bl GetTileSafe + mov r7, r0 + ldrh r0, [r7] + tst r0, #0x100 + beq _02343B0C + mov r0, #0xa0 + mul r1, r5, r0 + mov r0, #0x14 + ldr r2, _02343CD0 ; =DUNGEON_PTR + mul r0, r6, r0 + ldr r2, [r2] + add r2, r2, r1 + add r2, r0, r2 +#ifdef JAPAN + add r2, r2, #0xcc00 + ldrh r2, [r2, #0xbc] +#else + add r2, r2, #0xcd00 + ldrh r2, [r2, #0x60] +#endif + strh r2, [r7] + ldr r2, _02343CD0 ; =DUNGEON_PTR + ldr r2, [r2] + add r1, r2, r1 + add r0, r0, r1 +#ifdef JAPAN + add r0, r0, #0xcc00 + ldrh r0, [r0, #0xbe] +#else + add r0, r0, #0xcd00 + ldrh r0, [r0, #0x62] +#endif + strh r0, [r7, #2] +_02343B0C: + mov r0, #1 + str r0, [sp] + ldr r1, _02343CD0 ; =DUNGEON_PTR + mov r0, r7 + ldr r1, [r1] + mov r2, r4 + add r1, r1, r5, lsl #4 + add r1, r1, r6, lsl #1 +#ifdef JAPAN + add r1, r1, #0xd100 + ldrh r1, [r1, #0xbc] +#else + add r1, r1, #0xd200 + ldrh r1, [r1, #0x60] +#endif + mov r3, r8 + bl PlaceFixedRoomTile + ldrh r0, [r7, #2] + cmp fp, #0xff + orr r0, r0, #3 + strh r0, [r7, #2] + strneb fp, [r7, #7] +_02343B50: + add r4, r4, #1 +_02343B54: + ldrsh r0, [sl, #4] + add r0, r0, #0x14 + cmp r4, r0 + ble _02343A44 + add r8, r8, #1 +_02343B68: + ldrsh r1, [sl, #6] + add r0, r1, #0x13 + cmp r8, r0 + ble _02343A38 + sub r4, r1, #0x15 + b _02343C14 +_02343B80: + ldrsh r0, [sl, #4] + ldr r6, _02343CD0 ; =DUNGEON_PTR + sub r5, r0, #0x14 + b _02343C00 +_02343B90: + ldr r0, [r6] + add r0, r0, #0xc000 + ldr r7, [r0, #0xd24 + OV29_023439D8_OFFSET] + ldr r2, [r0, #0xd28 + OV29_023439D8_OFFSET] + subs r3, r5, r7 + sub r1, r4, r2 + bmi _02343BFC + cmp r1, #0 + blt _02343BFC + cmp r3, #8 + cmplt r1, #8 + bge _02343BFC + add r1, r7, #1 + cmp r5, r1 + addge r1, r2, #1 + cmpge r4, r1 + blt _02343BFC + ldr r1, [r0, #0xd2c + OV29_023439D8_OFFSET] + sub r1, r1, #1 + cmp r5, r1 + ldrlt r0, [r0, #0xd30 + OV29_023439D8_OFFSET] + sublt r0, r0, #1 + cmplt r4, r0 + bge _02343BFC + mov r0, r5 + mov r1, r4 + bl ov29_02336694 +_02343BFC: + add r5, r5, #1 +_02343C00: + ldrsh r0, [sl, #4] + add r0, r0, #0x14 + cmp r5, r0 + ble _02343B90 + add r4, r4, #1 +_02343C14: + ldrsh r0, [sl, #6] + add r0, r0, #0x13 + cmp r4, r0 + ble _02343B80 +_02343C24: + ldr r0, _02343CD0 ; =DUNGEON_PTR + mov r2, #1 + ldr r0, [r0] + ldr r1, _02343CD4 ; =0xFFFFCFEF + add r0, r0, #0x4000 + strb r2, [r0, #0xc5 + OV29_023439D8_OFFSET] + ldr r0, [sp, #8] + ldrh r2, [sb] + cmp r0, #0 + and r0, r2, r1 + strh r0, [sb] + beq _02343C6C + ldrh r0, [sb] + bic r0, r0, #3 + strh r0, [sb] + ldrh r0, [sb] + orr r0, r0, #1 + strh r0, [sb] +_02343C6C: + ldrsh r1, [sl, #6] + ldrsh r0, [sl, #4] + sub r1, r1, #1 + bl ov29_02336694 + bl DetermineAllTilesWalkableNeighbors + bl UpdateTrapsVisibility + mov r0, #0xc + bl IsCurrentMissionType + cmp r0, #0 + moveq r1, #1 + movne r1, #0 + add r0, sp, #0xc + and r1, r1, #0xff + bl PlayKeyDoorUnlockEffect + ldr r1, [sp, #4] + mov r0, sl + bl LogMessageByIdWithPopupCheckUser + mov r0, #0x14 + mov r1, #0x3c + bl ov29_022EA370 + b _02343CC8 +_02343CC0: + mov r1, r3 + bl LogMessageByIdWithPopupCheckUser +_02343CC8: + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_02343CD0: .word DUNGEON_PTR +_02343CD4: .word 0xFFFFCFEF + arm_func_end TryOpenKeyDoor + + arm_func_start ApplyKeyEffect +ApplyKeyEffect: ; 0x02343CD8 + stmdb sp!, {r4, lr} + mov r4, r0 + ldrsh r1, [r4, #6] + ldrsh r0, [r4, #4] + sub r1, r1, #1 + bl GetTileSafe + mov r1, r0 + ldrh r0, [r1] + tst r0, #0x1000 + bne _02343D10 + ldr r1, _02343D28 ; =0x00000B94 + mov r0, r4 + bl LogMessageByIdWithPopupCheckUser + ldmia sp!, {r4, pc} +_02343D10: + ldr r2, _02343D2C ; =0x00000B93 + mov r0, r4 + add r3, r2, #1 + bl TryOpenKeyDoor + bl UpdateMinimap + ldmia sp!, {r4, pc} + .align 2, 0 +#ifdef JAPAN +_02343D28: .word 0x000008A6 +_02343D2C: .word 0x000008A5 +#else +_02343D28: .word 0x00000B94 +_02343D2C: .word 0x00000B93 +#endif + arm_func_end ApplyKeyEffect + + arm_func_start ov29_02343D30 +ov29_02343D30: ; 0x02343D30 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldrsh r1, [r5, #6] + ldrsh r0, [r5, #4] + sub r1, r1, #1 + bl GetTileSafe + mov r4, r0 + ldrh r0, [r4] + tst r0, #0x2000 + bne _02343D68 + ldr r1, _02343D88 ; =0x00000B95 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + ldmia sp!, {r3, r4, r5, pc} +_02343D68: + bl ov29_02348BE8 + ldr r2, _02343D8C ; =0x00000B93 + mov r0, r5 + mov r1, r4 + add r3, r2, #2 + bl TryOpenKeyDoor + bl UpdateMinimap + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +#ifdef JAPAN +_02343D88: .word 0x000008A7 +_02343D8C: .word 0x000008A5 +#else +_02343D88: .word 0x00000B95 +_02343D8C: .word 0x00000B93 +#endif + arm_func_end ov29_02343D30 + + arm_func_start LoadFixedRoomData +LoadFixedRoomData: ; 0x02343D90 + stmdb sp!, {r3, lr} + ldr r0, _02343DBC ; =FIXED_ROOM_DATA_PTR + ldr r1, _02343DC0 ; =ov29_02353110 + ldr r0, [r0] + mov r2, #0 + bl LoadFileFromRom + ldr r0, _02343DBC ; =FIXED_ROOM_DATA_PTR + ldr r0, [r0] + ldr r1, [r0], #8 + bl HandleSir0Translation + ldmia sp!, {r3, pc} + .align 2, 0 +_02343DBC: .word FIXED_ROOM_DATA_PTR +_02343DC0: .word ov29_02353110 + arm_func_end LoadFixedRoomData + + arm_func_start ov29_02343DC4 +ov29_02343DC4: ; 0x02343DC4 + ldr r0, _02343DD4 ; =FIXED_ROOM_DATA_PTR + ldr r0, [r0] + ldr r0, [r0, #8] + bx lr + .align 2, 0 +_02343DD4: .word FIXED_ROOM_DATA_PTR + arm_func_end ov29_02343DC4 + + arm_func_start ov29_02343DD8 +ov29_02343DD8: ; 0x02343DD8 + stmdb sp!, {r3, lr} + ldr r0, _02343E1C ; =FIXED_ROOM_DATA_PTR + ldr r0, [r0] + bl PointsToZero + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02343E1C ; =FIXED_ROOM_DATA_PTR + ldr r0, [r0] + bl UnloadFile + ldr r0, _02343E1C ; =FIXED_ROOM_DATA_PTR + ldr r0, [r0] + bl ZInit8 + ldr r0, _02343E1C ; =FIXED_ROOM_DATA_PTR + mov r1, #0 + ldr r0, [r0] + str r1, [r0, #8] + ldmia sp!, {r3, pc} + .align 2, 0 +_02343E1C: .word FIXED_ROOM_DATA_PTR + arm_func_end ov29_02343DD8 + + arm_func_start LoadFixedRoom +LoadFixedRoom: ; 0x02343E20 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + movs r4, r2 + mov sl, r0 + str r1, [sp] + str r3, [sp, #4] + moveq r0, #0 + beq _0234402C + bl LoadFixedRoomData + ldr r0, _02344034 ; =FIXED_ROOM_DATA_PTR + ldr r0, [r0] + ldr r0, [r0, #8] + ldr r0, [r0, r4, lsl #2] + ldrh r4, [r0] + ldrh r5, [r0, #2] + bl ov29_02342BEC + mul fp, r4, r5 + mov sb, #0 + str r0, [sp, #8] + mov r4, r0 + mov r5, sb + b _02344014 +_02343E78: + ldrh r2, [r4] + ldr r1, _02344038 ; =0x00000FFF + ldr r0, [sp] + and r2, r2, r1 + cmp sb, r0 + bge _0234401C + cmp r2, #0x10 + blt _0234400C + sub r0, r1, #0xe00 + cmp r2, r0 + bgt _0234400C + ldr r1, _0234403C ; =FIXED_ROOM_ENTITY_SPAWN_TABLE + sub r2, r2, #0x10 + mov r0, #0xc + smlabb r0, r2, r0, r1 + ldr r6, [r0, #4] + ldrsh r0, [r6] + cmp r0, #0 + ldrne r1, _02344040 ; =0x00000229 + cmpne r0, r1 + ldrne r1, _02344044 ; =0x00000483 + cmpne r0, r1 + beq _0234400C + bl GetMatchingMonsterId + movs r8, r0 + beq _0234400C + mov r7, #0 + b _02343EFC +_02343EE8: + add r0, sl, r7, lsl #3 + bl GetMonsterIdFromSpawnEntry + cmp r8, r0 + beq _02343F04 + add r7, r7, #1 +_02343EFC: + cmp r7, sb + blt _02343EE8 +_02343F04: + cmp r7, sb + bne _0234400C + ldrb r0, [r6, #3] + cmp r0, #1 + bne _02343F40 + ldr r0, _02344048 ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, #0x348 + add r0, r0, #0x400 + bl GetOutlawLevel + mov r1, r0 + add r0, sp, #0xc + mov r2, r8 + bl SetMonsterLevelAndId + b _02343FE8 +_02343F40: + cmp r0, #4 + bne _02343F70 + ldr r0, _02344048 ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, #0x348 + add r0, r0, #0x400 + bl GetOutlawLeaderLevel + mov r1, r0 + add r0, sp, #0xc + mov r2, r8 + bl SetMonsterLevelAndId + b _02343FE8 +_02343F70: + cmp r0, #5 + bne _02343FA0 + ldr r0, _02344048 ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, #0x348 + add r0, r0, #0x400 + bl GetOutlawMinionLevel + mov r1, r0 + add r0, sp, #0xc + mov r2, r8 + bl SetMonsterLevelAndId + b _02343FE8 +_02343FA0: + ldrb r3, [r6, #2] + cmp r3, #0 + ldrnesh r1, [r6] + ldrne r0, _0234404C ; =0x00000485 + cmpne r1, r0 + bne _02343FCC + ldr r1, [sp, #4] + add r0, sp, #0xc + mov r2, r8 + bl SetMonsterLevelAndId + b _02343FE8 +_02343FCC: + mov r0, #0xc + mul r2, r3, r0 + ldr r1, _02344050 ; =FIXED_ROOM_MONSTER_SPAWN_STATS_TABLE + add r0, sp, #0xc + ldrsh r1, [r1, r2] + mov r2, r8 + bl SetMonsterLevelAndId +_02343FE8: + mov r0, sb, lsl #3 + add r3, sp, #0xc + add sb, sb, #1 + add r2, sl, r0 + mov r1, #4 +_02343FFC: + ldrh r0, [r3], #2 + subs r1, r1, #1 + strh r0, [r2], #2 + bne _02343FFC +_0234400C: + add r5, r5, #1 + add r4, r4, #2 +_02344014: + cmp r5, fp + blt _02343E78 +_0234401C: + ldr r0, [sp, #8] + bl MemFree + bl ov29_02343DD8 + mov r0, sb +_0234402C: + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_02344034: .word FIXED_ROOM_DATA_PTR +_02344038: .word 0x00000FFF +_0234403C: .word FIXED_ROOM_ENTITY_SPAWN_TABLE +_02344040: .word 0x00000229 +_02344044: .word 0x00000483 +_02344048: .word DUNGEON_PTR +_0234404C: .word 0x00000485 +_02344050: .word FIXED_ROOM_MONSTER_SPAWN_STATS_TABLE + arm_func_end LoadFixedRoom + + arm_func_start OpenFixedBin +OpenFixedBin: ; 0x02344054 + stmdb sp!, {r3, lr} + mov r0, #0xc + mov r1, #0 + bl MemAlloc + ldr r2, _02344084 ; =FIXED_ROOM_DATA_PTR + mov r1, #0xc + str r0, [r2] + bl MemZero + ldr r0, _02344084 ; =FIXED_ROOM_DATA_PTR + ldr r0, [r0] + bl ZInit8 + ldmia sp!, {r3, pc} + .align 2, 0 +_02344084: .word FIXED_ROOM_DATA_PTR + arm_func_end OpenFixedBin + + arm_func_start CloseFixedBin +CloseFixedBin: ; 0x02344088 + stmdb sp!, {r3, lr} + ldr r0, _023440A8 ; =FIXED_ROOM_DATA_PTR + ldr r0, [r0] + bl MemFree + ldr r0, _023440A8 ; =FIXED_ROOM_DATA_PTR + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_023440A8: .word FIXED_ROOM_DATA_PTR + arm_func_end CloseFixedBin + + arm_func_start AreOrbsAllowed +AreOrbsAllowed: ; 0x023440AC + cmp r0, #0 + beq _023440BC + cmp r0, #0xa5 + blo _023440C4 +_023440BC: + mov r0, #1 + bx lr +_023440C4: + mov r1, #0xc + mul r1, r0, r1 + ldr r0, _023440D8 ; =ov10_022C6C77 + ldrb r0, [r0, r1] + bx lr + .align 2, 0 +_023440D8: .word ov10_022C6C77 + arm_func_end AreOrbsAllowed + + arm_func_start AreTileJumpsAllowed +AreTileJumpsAllowed: ; 0x023440DC + cmp r0, #0 + beq _023440EC + cmp r0, #0xa5 + blo _023440F4 +_023440EC: + mov r0, #1 + bx lr +_023440F4: + mov r1, #0xc + mul r1, r0, r1 + ldr r0, _02344108 ; =ov10_022C6C78 + ldrb r0, [r0, r1] + bx lr + .align 2, 0 +_02344108: .word ov10_022C6C78 + arm_func_end AreTileJumpsAllowed + + arm_func_start AreTrawlOrbsAllowed +AreTrawlOrbsAllowed: ; 0x0234410C + cmp r0, #0 + beq _0234411C + cmp r0, #0xa5 + blo _02344124 +_0234411C: + mov r0, #1 + bx lr +_02344124: + mov r1, #0xc + mul r1, r0, r1 + ldr r0, _02344138 ; =ov10_022C6C79 + ldrb r0, [r0, r1] + bx lr + .align 2, 0 +_02344138: .word ov10_022C6C79 + arm_func_end AreTrawlOrbsAllowed + + arm_func_start AreOrbsAllowedVeneer +AreOrbsAllowedVeneer: ; 0x0234413C + ldr ip, _02344144 ; =AreOrbsAllowed + bx ip + .align 2, 0 +_02344144: .word AreOrbsAllowed + arm_func_end AreOrbsAllowedVeneer + + arm_func_start AreLateGameTrapsEnabled +AreLateGameTrapsEnabled: ; 0x02344148 + mov r1, #0xc + mul r1, r0, r1 + ldr r0, _0234415C ; =ov10_022C6C75 + ldrb r0, [r0, r1] + bx lr + .align 2, 0 +_0234415C: .word ov10_022C6C75 + arm_func_end AreLateGameTrapsEnabled diff --git a/include/dg_uty.h b/include/dg_uty.h index 26586b41..f0b4b295 100644 --- a/include/dg_uty.h +++ b/include/dg_uty.h @@ -1,11 +1,14 @@ #ifndef PMDSKY_OVERLAY_29_022E95F4_H #define PMDSKY_OVERLAY_29_022E95F4_H +#include "util.h" + #include "dungeon_mode.h" // Gets the pointer to the entity that is currently leading the team, or null if none of the first 4 entities is a valid monster with its is_team_leader flag set. It also sets LEADER_PTR to the result before returning it. struct entity* GetLeader(); // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__022E95F4(struct entity *entity); +struct monster* GetLeaderMonster(void); #endif //PMDSKY_OVERLAY_29_022E95F4_H diff --git a/include/overlay_29_022E99F0.h b/include/overlay_29_022E99F0.h new file mode 100644 index 00000000..2589a19a --- /dev/null +++ b/include/overlay_29_022E99F0.h @@ -0,0 +1,10 @@ +#ifndef PMDSKY_OVERLAY_29_022E99F0_H +#define PMDSKY_OVERLAY_29_022E99F0_H + +#include "util.h" + +struct position* FindClosestUnoccupiedTileWithin2(struct position* out, struct position* origin, bool8 a); +struct position* FindFarthestUnoccupiedTileWithin2(struct position* out, struct position* origin, bool8 a); +struct position* FindUnoccupiedTileWithin3(struct position* out, struct position* origin, bool8 a); + +#endif diff --git a/include/overlay_29_022E9FC0.h b/include/overlay_29_022E9FC0.h new file mode 100644 index 00000000..086ccc14 --- /dev/null +++ b/include/overlay_29_022E9FC0.h @@ -0,0 +1,9 @@ +#ifndef PMDSKY_OVERLAY_29_022E9FC0_H +#define PMDSKY_OVERLAY_29_022E9FC0_H + +#include "util.h" + +u8 ov29_022E9FC0(void); +void ov29_022E9FD0(u8 value); + +#endif diff --git a/include/overlay_29_022EA968.h b/include/overlay_29_022EA968.h new file mode 100644 index 00000000..446a1634 --- /dev/null +++ b/include/overlay_29_022EA968.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_OVERLAY_29_022EA968_H +#define PMDSKY_OVERLAY_29_022EA968_H + +#include "util.h" + +void SetDungeonRngPreseed23Bit(u32 preseed); + +#endif diff --git a/include/overlay_29_022EA9CC.h b/include/overlay_29_022EA9CC.h new file mode 100644 index 00000000..ba80661e --- /dev/null +++ b/include/overlay_29_022EA9CC.h @@ -0,0 +1,9 @@ +#ifndef PMDSKY_OVERLAY_29_022EA9CC_H +#define PMDSKY_OVERLAY_29_022EA9CC_H + +#include "util.h" + +u32 GetDungeonRngPreseed(void); +void SetDungeonRngPreseed(u32 preseed); + +#endif diff --git a/include/overlay_29_0234396C.h b/include/overlay_29_0234396C.h new file mode 100644 index 00000000..8642411d --- /dev/null +++ b/include/overlay_29_0234396C.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_OVERLAY_29_0234396C_H +#define PMDSKY_OVERLAY_29_0234396C_H + +#include "util.h" + +u8 FixedRoomActionParamToDirection(u8 action_param); + +#endif diff --git a/main.lsf b/main.lsf index 272acb0b..63b20e9f 100644 --- a/main.lsf +++ b/main.lsf @@ -803,7 +803,14 @@ Overlay OVY_29 Object src/dungeon_range_2.o Object asm/overlay_29_022E9488.o Object src/dg_uty.o - Object asm/overlay_29_022E9618.o + Object asm/overlay_29_022E9628.o + Object src/overlay_29_022E99F0.o + Object asm/overlay_29_022E9A44.o + Object src/overlay_29_022E9FC0.o + Object asm/overlay_29_022E9FE0.o + Object src/overlay_29_022EA968.o + Object asm/overlay_29_022EA980.o + Object src/overlay_29_022EA9CC.o Object src/dg_random.o Object asm/overlay_29_022EAB50.o Object src/overlay_29_022EAC34.o @@ -1221,6 +1228,8 @@ Overlay OVY_29 Object asm/overlay_29_02340CE4.o Object src/dungeon_generation.o Object asm/overlay_29_02341E6C.o + Object src/overlay_29_0234396C.o + Object asm/overlay_29_02343980.o Object src/fixed_room_data.o Object asm/overlay_29_02344178.o Object src/overlay_29_02344AF8.o diff --git a/src/dg_uty.c b/src/dg_uty.c index dd689045..45a480b2 100644 --- a/src/dg_uty.c +++ b/src/dg_uty.c @@ -33,3 +33,8 @@ bool8 EntityIsValid__022E95F4(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +struct monster* GetLeaderMonster(void) +{ + return GetEntInfo(GetLeader()); +} diff --git a/src/overlay_29_022E99F0.c b/src/overlay_29_022E99F0.c new file mode 100644 index 00000000..56fdcd42 --- /dev/null +++ b/src/overlay_29_022E99F0.c @@ -0,0 +1,25 @@ +#include "overlay_29_022E99F0.h" +#include "dungeon_mode.h" + +extern struct position *FindNearbyUnoccupiedTile(struct position *out, struct position *origin, const s32 *displacements, s32 count, bool8 a); + +extern const s32 DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST[]; + +extern const s32 DISPLACEMENTS_WITHIN_2_LARGEST_FIRST[]; + +extern const s32 DISPLACEMENTS_WITHIN_3[]; + +struct position* FindClosestUnoccupiedTileWithin2(struct position* out, struct position* origin, bool8 a) +{ + return FindNearbyUnoccupiedTile(out, origin, DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST, 0x19, a); +} + +struct position* FindFarthestUnoccupiedTileWithin2(struct position* out, struct position* origin, bool8 a) +{ + return FindNearbyUnoccupiedTile(out, origin, DISPLACEMENTS_WITHIN_2_LARGEST_FIRST, 0x19, a); +} + +struct position* FindUnoccupiedTileWithin3(struct position* out, struct position* origin, bool8 a) +{ + return FindNearbyUnoccupiedTile(out, origin, DISPLACEMENTS_WITHIN_3, 0x31, a); +} diff --git a/src/overlay_29_022E9FC0.c b/src/overlay_29_022E9FC0.c new file mode 100644 index 00000000..4538368b --- /dev/null +++ b/src/overlay_29_022E9FC0.c @@ -0,0 +1,21 @@ +#include "overlay_29_022E9FC0.h" + +struct unk_02353560 { + u8 field_0x0; + u8 field_0x1; + u8 field_0x2; + u8 field_0x3; + u8 field_0x4; +}; + +extern struct unk_02353560 ov29_02353560; + +u8 ov29_022E9FC0(void) +{ + return ov29_02353560.field_0x3; +} + +void ov29_022E9FD0(u8 value) +{ + ov29_02353560.field_0x3 = value; +} diff --git a/src/overlay_29_022EA968.c b/src/overlay_29_022EA968.c new file mode 100644 index 00000000..abaa0210 --- /dev/null +++ b/src/overlay_29_022EA968.c @@ -0,0 +1,9 @@ +#include "overlay_29_022EA968.h" +#include "dg_random.h" + +extern prng_state DUNGEON_PRNG_STATE; + +void SetDungeonRngPreseed23Bit(u32 preseed) +{ + DUNGEON_PRNG_STATE.preseed = (preseed | 1) & 0xFFFFFF; +} diff --git a/src/overlay_29_022EA9CC.c b/src/overlay_29_022EA9CC.c new file mode 100644 index 00000000..c43c2e97 --- /dev/null +++ b/src/overlay_29_022EA9CC.c @@ -0,0 +1,14 @@ +#include "overlay_29_022EA9CC.h" +#include "dg_random.h" + +extern prng_state DUNGEON_PRNG_STATE; + +u32 GetDungeonRngPreseed(void) +{ + return DUNGEON_PRNG_STATE.preseed; +} + +void SetDungeonRngPreseed(u32 preseed) +{ + DUNGEON_PRNG_STATE.preseed = preseed; +} diff --git a/src/overlay_29_022F0EDC.c b/src/overlay_29_022F0EDC.c index 224e7db1..4891a2a2 100644 --- a/src/overlay_29_022F0EDC.c +++ b/src/overlay_29_022F0EDC.c @@ -54,7 +54,6 @@ extern s32 ChangeMonsterAnimation(); extern s32 CheckTouchscreenArea(); extern s32 GetEntityTouchscreenArea(); extern s32 GetIdleAnimationId(); -extern struct monster *GetLeaderMonster(); extern struct entity *GetMonsterInFront(); extern void GetPressedButtons(u32 param_1, u16 *pressed); extern s32 GetTeamMemberIndex(); diff --git a/src/overlay_29_0234396C.c b/src/overlay_29_0234396C.c new file mode 100644 index 00000000..cc8ea353 --- /dev/null +++ b/src/overlay_29_0234396C.c @@ -0,0 +1,10 @@ +#include "overlay_29_0234396C.h" + +u8 FixedRoomActionParamToDirection(u8 action_param) +{ + if (action_param == 0) { + return 0xFF; + } + + return action_param - 1; +}