From c1a61413d6dea1d4539bd21782d76e97907ee15b Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sat, 22 Aug 2026 12:54:23 -0700 Subject: [PATCH 01/34] Decomp ov11_022ED69C; correct BmaHeader field signedness Decompiles ov11_022ED69C (410 instructions) out of asm/overlay_11_022ECD24.s. The function was first in that file, so the remainder splits to asm/overlay_11_022EDD14.s and main.lsf gains src/overlay_11_022ED69C.o ahead of it. include/ground_bg.h: - MapRender 0x1C -> 0x54, adding unk1C/unk24/unk2C (two pointers each) and a 0x20 filler. This consumes GroundBg::fillerForNow2[112] exactly: 0x210 + 2*0x54 == 0x2B8, so no offset after it moves, and ground_bg.c only ever uses mapRender[0]. - GroundBg::unk1FC: four unreferenced u8 -> one s32. - BmaHeader::numLayers/hasDataLayer/hasCollision: u16 -> s16. Retail reads these with ldrsh; the u16 declaration emitted ldrh and produced three wrong bytes in OVY_11.sbin. This function is their only reader in the tree -- every other use is a strh, identical either way -- so no other object changes. - RGB_Array, the UnkStruct_2324CBC family, the three palette helpers, ov11_02320C18 and ov11_02320BF4/BE8 move here from src/ground_bg.c, which now includes them rather than redeclaring them. asm/overlay_11_022ECD24_data.s has its .include repointed at the .inc that survived the split; extract_function.py deletes the old one without knowing about sibling objects in the same address range. ov11_022EE9B0 and ov11_022EE8CC are still asm and are declared provisionally in include/overlay_11_022ED69C.h from their call sites. Authored by Claude (Opus 5) under human direction. Confirmed by a matching build: build/pmdsky.us/pmdsky.us.nds: OK. Co-Authored-By: Claude Opus 5 --- ...1_022ECD24.inc => overlay_11_022EDD14.inc} | 13 +- asm/overlay_11_022ECD24_data.s | 2 +- ...ay_11_022ECD24.s => overlay_11_022EDD14.s} | 459 +----------------- include/ground_bg.h | 67 ++- include/overlay_11_022ED69C.h | 11 + main.lsf | 3 +- src/ground_bg.c | 51 +- src/overlay_11_022ED69C.c | 245 ++++++++++ 8 files changed, 323 insertions(+), 528 deletions(-) rename asm/include/{overlay_11_022ECD24.inc => overlay_11_022EDD14.inc} (79%) rename asm/{overlay_11_022ECD24.s => overlay_11_022EDD14.s} (50%) create mode 100644 include/overlay_11_022ED69C.h create mode 100644 src/overlay_11_022ED69C.c diff --git a/asm/include/overlay_11_022ECD24.inc b/asm/include/overlay_11_022EDD14.inc similarity index 79% rename from asm/include/overlay_11_022ECD24.inc rename to asm/include/overlay_11_022EDD14.inc index f8edb387..7d35adf5 100644 --- a/asm/include/overlay_11_022ECD24.inc +++ b/asm/include/overlay_11_022EDD14.inc @@ -2,28 +2,23 @@ .public BmaLayerNrlDecompressor .public CopyColorToPaletteDataRgba .public DecompressAtNormalVeneer -.public FillPaletteDataRgba .public GetAtSize -.public GroundBg_CloseOpenedFiles .public GroundBg_Init .public LoadBackgroundAttributes .public LoadFileFromRom .public MarkPaletteDataAsNeedingUpdate .public MemAlloc -.public Memcpy16 .public MemFree +.public Memcpy16 +.public PointsToZero +.public UnloadFile .public ov11_022EC08C .public ov11_022EE620 -.public ov11_022EE8CC -.public ov11_022EE9B0 -.public ov11_02320BE8 .public ov11_02320BF0 -.public ov11_02320BF4 .public ov11_02320C18 .public ov11_02320C28 .public ov11_02320C80 .public ov11_02324CBC -.public PointsToZero .public sprintf .public sub_02015328 .public sub_02016300 @@ -31,5 +26,3 @@ .public sub_020163E4 .public sub_0201641C .public sub_02016468 -.public UnloadFile -.public ZInit8 diff --git a/asm/overlay_11_022ECD24_data.s b/asm/overlay_11_022ECD24_data.s index f07023ec..9b8377b3 100644 --- a/asm/overlay_11_022ECD24_data.s +++ b/asm/overlay_11_022ECD24_data.s @@ -1,5 +1,5 @@ .include "asm/macros.inc" - .include "overlay_11_022ECD24.inc" + .include "overlay_11_022EDD14.inc" .include "overlay_11.inc" .public ov11_022F1800 diff --git a/asm/overlay_11_022ECD24.s b/asm/overlay_11_022EDD14.s similarity index 50% rename from asm/overlay_11_022ECD24.s rename to asm/overlay_11_022EDD14.s index 361e65c3..2c7cd4ff 100644 --- a/asm/overlay_11_022ECD24.s +++ b/asm/overlay_11_022EDD14.s @@ -1,464 +1,7 @@ .include "asm/macros.inc" - .include "overlay_11_022ECD24.inc" + .include "overlay_11_022EDD14.inc" .text - -.public LoadMapType10 -.public LoadMapType11 - - arm_func_start ov11_022ED69C -ov11_022ED69C: ; 0x022ED69C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x88 - mov sb, r1 - add r1, sb, #0x100 - ldrsh r2, [r1, #0xbe] - mvn r1, #0 - mov sl, r0 - cmp r2, r1 - bne _022ED6CC - bl ov11_022EC08C - mov r0, #0 - b _022EDCFC -_022ED6CC: - bl GroundBg_CloseOpenedFiles - ldr r0, [sb, #0x174] - add r1, sl, #0x100 - str r0, [sp, #8] - mov r0, #3 - strh r0, [sl] - mov r0, #0 - strb r0, [sl, #0x1c0] - add r0, sb, #0x100 - ldrsh r2, [r0, #0xbe] - add r0, sp, #0x18 - strh r2, [r1, #0xbe] - ldr r2, [sb, #0x1c4] - str r2, [sl, #0x1c4] - ldrsh r1, [r1, #0xbe] - bl LoadBackgroundAttributes - add r2, sb, #0x100 - ldrsh r3, [r2, #0xea] - add r1, sb, #0xea - add r2, sl, #0x100 - strh r3, [r2, #0xea] - add r1, r1, #0x100 - add r0, sl, #0xea - ldrsh r1, [r1, #2] - add r6, r0, #0x100 - mov r5, #0 - strh r1, [r6, #2] - add r2, sl, #0x1c8 - add r1, sb, #0x1c8 - mov r0, r5 - mov r8, #0xc -_022ED748: - mul fp, r5, r8 - ldrsh r4, [r1, fp] - mov r7, r0 - add r3, r2, fp - strh r4, [r2, fp] - add r4, r1, fp -_022ED760: - add fp, r4, r7, lsl #1 - ldrsh ip, [fp, #2] - add fp, r3, r7, lsl #1 - add r7, r7, #1 - strh ip, [fp, #2] - cmp r7, #4 - blt _022ED760 - ldrsh r4, [r4, #0xa] - add r5, r5, #1 - cmp r5, #2 - strh r4, [r3, #0xa] - blt _022ED748 - ldrb r2, [sb, #0x1e0] - add r0, sb, #0x1e0 - add r1, sl, #0x1e0 - strb r2, [sl, #0x1e0] - ldrb r3, [r0, #1] - add r2, sl, #0x200 - str r2, [sp, #0x10] - strb r3, [r1, #1] - ldrb r5, [r0, #2] - ldr r2, [sp, #8] - ldr r4, _022EDD04 ; =ov11_02324CBC - strb r5, [r1, #2] - add fp, r2, #4 - ldrb r2, [r0, #3] - mov r3, #0x28 - mov r8, #0 - strb r2, [r1, #3] - ldrsh r2, [r0, #4] - strh r2, [r1, #4] - ldrsh r2, [r0, #6] - strh r2, [r1, #6] - ldrsh r0, [r0, #8] - strh r0, [r1, #8] - ldr r0, [sp, #0x10] - ldr r2, [r4] - ldrsh r0, [r0, #0xc2] - ldrb r1, [sl, #0x2bc] - add r5, r2, #0x98 - mov r0, r0, lsl #0x14 - smulbb r4, r1, r3 - mov r7, r0, lsr #0x10 - b _022ED854 -_022ED810: - add r0, r7, #1 - mov r0, r0, lsl #0x10 - mov r1, r7 - mov r7, r0, lsr #0x10 - ldr r2, _022EDD08 ; =ov11_02320BF4 - add r0, r5, r4 - bl CopyColorToPaletteDataRgba - add r0, r5, r4 - mov r1, r7 - mov r2, fp - mov r3, #0xf - bl FillPaletteDataRgba - add r0, r7, #0xf - mov r0, r0, lsl #0x10 - mov r7, r0, lsr #0x10 - add fp, fp, #0x3c - add r8, r8, #1 -_022ED854: - ldrsh r0, [r6] - cmp r8, r0 - bge _022ED870 - ldr r0, [sp, #0x10] - ldrsh r0, [r0, #0xc4] - cmp r8, r0 - blt _022ED810 -_022ED870: - add r0, sl, #0x200 - str r0, [sp, #0x14] - b _022ED8C8 -_022ED87C: - add r0, r7, #1 - mov r0, r0, lsl #0x10 - mov r1, r7 - mov r7, r0, lsr #0x10 - ldr r2, _022EDD08 ; =ov11_02320BF4 - add r0, r5, r4 - bl CopyColorToPaletteDataRgba - mov fp, #1 -_022ED89C: - add r0, r7, #1 - mov r0, r0, lsl #0x10 - mov r1, r7 - mov r7, r0, lsr #0x10 - ldr r2, _022EDD0C ; =ov11_02320BE8 - add r0, r5, r4 - bl CopyColorToPaletteDataRgba - add fp, fp, #1 - cmp fp, #0x10 - blt _022ED89C - add r8, r8, #1 -_022ED8C8: - ldr r0, [sp, #0x14] - ldrsh r0, [r0, #0xc4] - cmp r8, r0 - blt _022ED87C - add r0, r5, r4 - bl MarkPaletteDataAsNeedingUpdate - ldrsh r2, [r6, #2] - add r0, sl, #4 - mov r1, #0 - cmp r2, #0 - beq _022ED99C - ldrsh r5, [r6] - ldr r2, [sp, #8] - mov r3, #1 - add r4, r2, #4 - rsb r2, r5, r5, lsl #4 - add r2, r4, r2, lsl #2 - str r2, [sl, #0x1f4] - strb r3, [sl, #0x1fb] - strb r1, [sl, #0x1bc] - ldrb r4, [sb, #0x1f8] - add r3, r2, r5, lsl #2 - mov r8, r1 - strb r4, [sl, #0x1f8] - ldrb r4, [sb, #0x1fa] - mov r7, r1 - strb r4, [sl, #0x1f9] - ldrb r4, [sb, #0x1fa] - strb r4, [sl, #0x1fa] - ldrb r4, [sb, #0x1ee] - strb r4, [sl, #0x1ee] - add r4, sl, #0x200 - b _022ED980 -_022ED94C: - ldrsh r5, [r2, #2] - add r1, r1, #1 - cmp r5, #0 - strgt r3, [r0, #4] - ldrgtsh r5, [r2, #2] - add r2, r2, #4 - strle r8, [r0, #4] - strh r7, [r0] - rsbgt r5, r5, r5, lsl #4 - strh r7, [r0, #2] - str r7, [r0, #8] - addgt r3, r3, r5, lsl #2 - add r0, r0, #0xc -_022ED980: - ldrsh r5, [r6] - cmp r1, r5 - bge _022ED9B4 - ldrsh r5, [r4, #0xc4] - cmp r1, r5 - blt _022ED94C - b _022ED9B4 -_022ED99C: - str r1, [sl, #0x1f4] - strb r1, [sl, #0x1f8] - strb r1, [sl, #0x1f9] - strb r1, [sl, #0x1fa] - strb r1, [sl, #0x1fb] - strb r1, [sl, #0x1bc] -_022ED9B4: - mov r2, #0 - b _022ED9D4 -_022ED9BC: - strh r2, [r0] - strh r2, [r0, #2] - str r2, [r0, #8] - str r2, [r0, #4] - add r1, r1, #1 - add r0, r0, #0xc -_022ED9D4: - cmp r1, #0x10 - blt _022ED9BC - mov r8, #0 - add r6, sl, #0xc4 - mov r5, r8 - mov r4, r8 - mov fp, #0x2c -_022ED9F0: - mul r0, r8, fp - add r7, r6, r0 - strb r5, [r6, r0] - strb r5, [r7, #1] - strh r5, [r7, #4] - strh r5, [r7, #2] - add r0, r7, #8 - bl ZInit8 - str r4, [r7, #0x10] - str r4, [r7, #0x18] - str r4, [r7, #0x14] - str r4, [r7, #0x20] - str r4, [r7, #0x1c] - add r8, r8, #1 - str r4, [r7, #0x24] - str r4, [r7, #0x28] - cmp r8, #4 - blt _022ED9F0 - add r0, sl, #0x200 - ldrsh r3, [r0, #0xbe] - b _022EDB58 -_022EDA44: - mov r0, #0xc - mul r2, r4, r0 - add r0, sl, #0x200 - ldrb r7, [sl, #0x2bc] - ldr r6, _022EDD10 ; =ov11_02320C18 - cmp r4, #0 - add r6, r6, r7, lsl #3 - moveq r8, #0 - movne r8, #2 - cmp r4, #0 - moveq fp, #0 - add r5, sl, #0x1c8 - ldrsh r1, [r0, #0xc6] - ldrsh r0, [r5, r2] - ldr r7, [r6, r3, lsl #2] - add r6, r5, r2 - add r0, r1, r0 - add r5, r7, r0, lsl #5 - add r0, sl, #0xc4 - movne fp, #4 - mov r7, #0 - add lr, sb, #0xc4 - str r0, [sp, #0xc] -_022EDAA0: - mov r0, #0x2c - mul r1, r8, r0 - ldr r0, [sp, #0xc] - add r2, lr, r1 - add r1, r0, r1 - mov ip, #0xa - add r0, sp, #0x18 - mla r0, fp, ip, r0 - ldrsb r0, [r0, #0x1e] - cmp r0, #0 - beq _022EDB3C - ldr r0, [r2, #8] - ldr ip, [r2, #0xc] - add r2, r6, r7, lsl #1 - str r0, [r1, #8] - str ip, [r1, #0xc] - mov r0, #1 - strb r0, [r1] - strb r0, [r1, #1] - ldr ip, [r1, #8] - str ip, [r1, #0x10] - add r0, ip, #4 - ldrsh ip, [ip, #2] - str r0, [r1, #0x18] - add ip, r0, ip, lsl #2 - str r0, [r1, #0x14] - str ip, [r1, #0x20] - str ip, [r1, #0x1c] - mov r0, #0 - strh r0, [r1, #2] - ldr r0, [r1, #0x18] - ldr r0, [r0] - strh r0, [r1, #4] - str r5, [r1, #0x24] - ldrsh r0, [r2, #2] - mov r0, r0, lsl #5 - str r0, [r1, #0x28] - ldrsh r0, [r2, #2] - add r5, r5, r0, lsl #5 -_022EDB3C: - add r7, r7, #1 - cmp r7, #2 - add fp, fp, #1 - add r8, r8, #1 - blt _022EDAA0 - add r4, r4, #1 - add r3, r3, #1 -_022EDB58: - add r0, sl, #0x200 - ldrsh r1, [r0, #0xc0] - cmp r4, r1 - blt _022EDA44 - ldrsh r5, [r0, #0xbe] - mov r4, #0 - b _022EDBF0 -_022EDB74: - mov r0, #0xc - mul r0, r4, r0 - add r1, sb, #0x1c8 - ldrsh r2, [r1, r0] - add r3, r1, r0 - mov r1, #0 -_022EDB8C: - add r0, r3, r1, lsl #1 - ldrsh r0, [r0, #2] - add r1, r1, #1 - cmp r1, #4 - add r2, r2, r0 - blt _022EDB8C - cmp r2, #0 - ble _022EDBD0 - ldrb r0, [sl, #0x2bc] - ldr r3, _022EDD10 ; =ov11_02320C18 - ldrb r1, [sb, #0x2bc] - add r0, r3, r0, lsl #3 - ldr r0, [r0, r5, lsl #2] - add r1, r3, r1, lsl #3 - ldr r1, [r1, r5, lsl #2] - mov r2, r2, lsl #5 - bl Memcpy16 -_022EDBD0: - add r2, sb, r4, lsl #2 - ldr r0, [r2, #0x2dc] - add r1, sl, r4, lsl #2 - str r0, [r1, #0x2dc] - ldr r0, [r2, #0x2e4] - add r4, r4, #1 - str r0, [r1, #0x2e4] - add r5, r5, #1 -_022EDBF0: - add r0, sl, #0x200 - ldrsh r0, [r0, #0xc0] - cmp r4, r0 - blt _022EDB74 - ldr r0, [sb, #0x1fc] - add r4, sb, #0x210 - str r0, [sl, #0x1fc] - add r5, sl, #0x210 - mov r6, #0 - b _022EDCB8 -_022EDC18: - mov sb, r4 - mov r8, r5 - mov r7, #5 -_022EDC24: - ldmia sb!, {r0, r1, r2, r3} - stmia r8!, {r0, r1, r2, r3} - subs r7, r7, #1 - bne _022EDC24 - ldr r1, [sb] - mov r0, #0 - str r1, [r8] - ldrsh r7, [r5, #2] - add r1, sl, #0x200 - b _022EDC64 -_022EDC4C: - add r2, sl, r7, lsl #2 - ldr r3, [r2, #0x2ec] - add r2, r5, r0, lsl #2 - str r3, [r2, #0x2c] - add r0, r0, #1 - add r7, r7, #1 -_022EDC64: - ldrsh r2, [r5, #4] - cmp r0, r2 - bge _022EDC7C - ldrsh r2, [r1, #0xc0] - cmp r7, r2 - blt _022EDC4C -_022EDC7C: - mov r2, #0 - b _022EDC98 -_022EDC84: - add r1, r5, r0, lsl #2 - str r2, [r1, #0x1c] - str r2, [r1, #0x24] - str r2, [r1, #0x2c] - add r0, r0, #1 -_022EDC98: - cmp r0, #2 - blt _022EDC84 - mov r0, r5 - add r1, sl, #0x200 - bl ov11_022EE9B0 - add r6, r6, #1 - add r5, r5, #0x54 - add r4, r4, #0x54 -_022EDCB8: - ldr r0, [sl, #0x1fc] - cmp r6, r0 - blt _022EDC18 - mov r4, #0 - b _022EDCF0 -_022EDCCC: - str r4, [sp] - mov r0, r5 - mov r1, sl - mov r2, r4 - mov r3, r4 - str r4, [sp, #4] - bl ov11_022EE8CC - add r6, r6, #1 - add r5, r5, #0x54 -_022EDCF0: - cmp r6, #2 - blt _022EDCCC - mov r0, #1 -_022EDCFC: - add sp, sp, #0x88 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022EDD04: .word ov11_02324CBC -_022EDD08: .word ov11_02320BF4 -_022EDD0C: .word ov11_02320BE8 -_022EDD10: .word ov11_02320C18 - arm_func_end ov11_022ED69C arm_func_start ov11_022EDD14 ov11_022EDD14: ; 0x022EDD14 diff --git a/include/ground_bg.h b/include/ground_bg.h index c1c8bd1a..4e66f953 100644 --- a/include/ground_bg.h +++ b/include/ground_bg.h @@ -68,11 +68,11 @@ typedef struct UnkGroundBg_C4 s16 unk4; struct iovec bpaFile; const struct BpaHeader *unk10; - const void *unk14; - const void *unk18; - const void *unk1C; - void *unk20; - void *unk24; + const s32 *unk14; + const s32 *unk18; + u16 *unk1C; + u16 *unk20; + u16 *unk24; u32 unk28; } UnkGroundBg_C4; @@ -145,6 +145,10 @@ typedef struct MapRender s32 heightChunks; PixelPos mapSizePixels; void (*tilemapRenderFunc)(struct MapRender *); + u16 *unk1C[2]; + u16 *unk24[2]; + u16 *unk2C[2]; + u8 fillerForNow[0x20]; } MapRender; #define MAX_BPA_SLOTS 4 @@ -173,9 +177,9 @@ typedef struct BmaHeader u8 mapWidthChunks; u8 mapHeightChunks; - u16 numLayers; // Number of layers in this map. Must match BPC layer size. Allowed values are only 1 or 2. - u16 hasDataLayer; // Seems to be a boolean flag (0 or 1). If >0, the Unknown Data Layer exists. - u16 hasCollision; // Number of Collision layers. 0, 1 or 2. + s16 numLayers; + s16 hasDataLayer; + s16 hasCollision; } BmaHeader; typedef struct BplHeader @@ -225,13 +229,9 @@ typedef struct GroundBg u8 unk1F9; u8 unk1FA; u8 unk1FB; - u8 unk1FC; - u8 unk1FD; - u8 unk1FE; - u8 unk1FF; + s32 unk1FC; PixelPos cameraPixelPosition[NUM_LAYERS]; // 0x200 MapRender mapRender[NUM_LAYERS]; // 0x210 - u8 fillerForNow2[112]; s16 unk2B8; u8 unk2BA; UnkGroundBg_2BC unk2BC; // 2bc @@ -241,6 +241,47 @@ typedef struct GroundBg u16 *unk2EC[2]; } GroundBg; +#define RGB_R 0 +#define RGB_G 1 +#define RGB_B 2 +#define RGB_UNK 3 +#define RGB_FIELDS_COUNT 4 + +typedef struct RGB_Array +{ + u8 c[RGB_FIELDS_COUNT]; +} RGB_Array; + +struct UnkStruct_2324CBC_Sub98 +{ + u8 fill0[7]; + u8 unk8; + u8 fill9[0x18 - 0x9]; + RGB_Array *unk18; + u8 fill1C[0x28-0x1c]; +}; + +struct UnkStruct_2324CBC_Sub0 +{ + u8 fill0[0x1C]; +}; + +struct UnkStruct_2324CBC +{ + struct UnkStruct_2324CBC_Sub0 unk0[2][2]; + u8 fill70[0x28]; + struct UnkStruct_2324CBC_Sub98 unk98[2]; +}; + +extern struct UnkStruct_2324CBC *ov11_02324CBC; +extern u16 *ov11_02320C18[][2]; +extern const RGB_Array ov11_02320BF4; +extern const RGB_Array ov11_02320BE8; + +extern void CopyColorToPaletteDataRgba(struct UnkStruct_2324CBC_Sub98 *, s32 id, const RGB_Array *src); +extern void MarkPaletteDataAsNeedingUpdate(struct UnkStruct_2324CBC_Sub98 *); +extern void FillPaletteDataRgba(struct UnkStruct_2324CBC_Sub98 *, s32 id, const RGB_Array *src, s32); + void LoadBackgroundAttributes(struct bg_list_entry* entry, int bgId); void GroundBg_Init(GroundBg *groundBg, const UnkGroundBg_2BC *a1); void GroundBg_FreeAll(GroundBg *groundBg); diff --git a/include/overlay_11_022ED69C.h b/include/overlay_11_022ED69C.h new file mode 100644 index 00000000..1b7aecd1 --- /dev/null +++ b/include/overlay_11_022ED69C.h @@ -0,0 +1,11 @@ +#ifndef PMDSKY_OVERLAY_11_022ED69C_H +#define PMDSKY_OVERLAY_11_022ED69C_H + +#include "ground_bg.h" + +extern void ov11_022EE9B0(MapRender *mapRender, PixelPos *cameraPixelPosition); +extern void ov11_022EE8CC(MapRender *mapRender, GroundBg *groundBg, s32 a2, s32 a3, s32 a4, s32 a5); + +bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src); + +#endif diff --git a/main.lsf b/main.lsf index 470c7ba8..4860934d 100644 --- a/main.lsf +++ b/main.lsf @@ -647,7 +647,8 @@ Overlay OVY_11 Object asm/overlay_11_022EA024.o Object src/ground_bg.o Object asm/overlay_11_022ECD24_data.o - Object asm/overlay_11_022ECD24.o + Object src/overlay_11_022ED69C.o + Object asm/overlay_11_022EDD14.o Object src/ground_bg_1.o Object asm/overlay_11_022EE5E4.o Object src/overlay_11_022FAB44.o diff --git a/src/ground_bg.c b/src/ground_bg.c index ecb76d27..1b2d3841 100644 --- a/src/ground_bg.c +++ b/src/ground_bg.c @@ -4,50 +4,12 @@ #include "main_02001188.h" #include "main_02008BD4.h" -// TODO: Move these to headers -#define RGB_R 0 -#define RGB_G 1 -#define RGB_B 2 -#define RGB_UNK 3 -#define RGB_FIELDS_COUNT 4 - #define VRAM 0x6000000 -typedef struct RGB_Array -{ - u8 c[RGB_FIELDS_COUNT]; -} RGB_Array; - -struct UnkStruct_2324CBC_Sub98 -{ - u8 fill0[7]; - u8 unk8; - u8 fill9[0x18 - 0x9]; - RGB_Array *unk18; - u8 fill1C[0x28-0x1c]; -}; - -struct UnkStruct_2324CBC_Sub0 -{ - u8 fill0[0x1C]; -}; - -struct UnkStruct_2324CBC -{ - struct UnkStruct_2324CBC_Sub0 unk0[2][2]; - u8 fill70[0x28]; - struct UnkStruct_2324CBC_Sub98 unk98[2]; -}; - -extern struct UnkStruct_2324CBC *ov11_02324CBC; - extern void FileClose(struct file_stream* file); extern void* MemAlloc(u32 len, u32 flags); -extern void CopyColorToPaletteDataRgba(struct UnkStruct_2324CBC_Sub98 *, s32 id, const RGB_Array *src); -extern void MarkPaletteDataAsNeedingUpdate(struct UnkStruct_2324CBC_Sub98 *); extern s32 sprintf(u8* str, const u8* format, ...); extern void LoadFileFromRom(struct iovec* iov, const char* filepath, u32 flags); -extern void FillPaletteDataRgba(struct UnkStruct_2324CBC_Sub98 *, s32 id, const RGB_Array *src, s32); #define FREE_AND_SET_NULL(ptr) \ { \ @@ -63,7 +25,6 @@ extern const char ov11_02320C58[]; extern const char ov11_02320C94[]; extern const char ov11_02320C6C[]; extern const char ov11_02320C80[]; -extern void *ov11_02320C18[][2]; // Vram ptrs // Todo: make these static const RGB_Array ov11_02320BF4 = {0, 0, 0, 0}; @@ -472,8 +433,8 @@ void ov11_022EC27C(GroundBg *groundBg, s32 bgId) u16 *tilemapR7, *tilemapR3, *tilemapR12; LayerSpecs *layerSpecs = &groundBg->layerSpecs[i]; // r9 s32 r3 = groundBg->unk2BC.unk0; - u16 *dstR11 = ov11_02320C18[r3][sp20] + groundBg->unk2BC.unkA * 32; // r11 fp - u16 *dstSP10 = ov11_02320C18[r3][sp20] + layerSpecs->numTiles * 32; // sp 10 + u16 *dstR11 = ov11_02320C18[r3][sp20] + groundBg->unk2BC.unkA * 16; + u16 *dstSP10 = ov11_02320C18[r3][sp20] + layerSpecs->numTiles * 16; const u8 *src = srcStart; // r6 u16 leftoverVal2 = 0; // r7 u16 leftoverBuf = 0; // sp #0x14 @@ -716,7 +677,7 @@ void ov11_022EC27C(GroundBg *groundBg, s32 bgId) for (r5 = 0; r5 < groundBg->unk2BC.unk4; r5++, r7++) { LayerSpecs *layerSpecs = &groundBg->layerSpecs[r5]; s32 vramId = (groundBg->unk2BC.unkA + layerSpecs->numTiles); - void *vramPtr = ov11_02320C18[groundBg->unk2BC.unk0][r7] + (vramId * 32); + void *vramPtr = ov11_02320C18[groundBg->unk2BC.unk0][r7] + (vramId * 16); s32 r8 = (r5 == 0) ? 0 : 2; s32 r9 = (r5 == 0) ? 0 : 4; layerSpecs = &groundBg->layerSpecs[r5]; @@ -726,8 +687,8 @@ void ov11_022EC27C(GroundBg *groundBg, s32 bgId) UnkGroundBg_C4 *subC4 = &groundBg->unkC4[r8]; if (entry.others_bpa[r9].name[0] != '\0' && groundBg->unk2BC.unk0 == 0) { - const struct BpaHeader *bpaHeader; - const void *r1, *r0; + struct BpaHeader *bpaHeader; + void *r1, *r0; sprintf(textBuf, ov11_02320C94, entry.others_bpa[r9].name); LoadFileFromRom(&subC4->bpaFile, textBuf, flags); @@ -740,7 +701,7 @@ void ov11_022EC27C(GroundBg *groundBg, s32 bgId) subC4->unk14 = subC4->unk18 = r1; subC4->unk1C = subC4->unk20 = r0; subC4->unk2 = 0; - subC4->unk4 = *((u32 *)subC4->unk18); // hm... + subC4->unk4 = *subC4->unk18; subC4->unk24 = vramPtr; subC4->unk28 = layerSpecs->bpaSlotNumTiles[r6] * 32; diff --git a/src/overlay_11_022ED69C.c b/src/overlay_11_022ED69C.c new file mode 100644 index 00000000..a434b237 --- /dev/null +++ b/src/overlay_11_022ED69C.c @@ -0,0 +1,245 @@ +#include "overlay_11_022ED69C.h" +#include "main_0200330C.h" + +bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) +{ + LayerSpecs *ds; + LayerSpecs *ss; + s32 i; + s32 j; + s32 k; + struct bg_list_entry entry; + UnkGroundBg_4 *sub4Ptr; + s32 n; + u16 *vram; + s32 si; + s32 sj; + s32 bgIdx; + struct UnkStruct_2324CBC_Sub98 *unkSubPtr; + const void *bplData; + const RGB_Array *palData; + const AnimationSpecification *spec; + MapRender *srcRender; + MapRender *dstRender; + BplHeader *bplHeader; + BplHeader *srcBpl; + BmaHeader *dstBma; + BmaHeader *srcBma; + u16 palId; + + if (src->unk1BE == -1) { + ov11_022EC08C(dst); + return FALSE; + } + + GroundBg_CloseOpenedFiles(dst); + bplData = src->bplFile.iov_base; + dst->newUnk0 = 3; + dst->unk1C0 = 0; + dst->unk1BE = src->unk1BE; + dst->unk1C4 = src->unk1C4; + LoadBackgroundAttributes(&entry, dst->unk1BE); + + bplHeader = &dst->bplHeader; + srcBpl = &src->bplHeader; + bplHeader->numPalettes = srcBpl->numPalettes; + bplHeader->hasPalAnimations = srcBpl->hasPalAnimations; + + for (i = 0; i < NUM_LAYERS; i++) { + ds = &dst->layerSpecs[i]; + ss = &src->layerSpecs[i]; + + ds->numTiles = ss->numTiles; + + for (j = 0; j < MAX_BPA_SLOTS; j++) { + ds->bpaSlotNumTiles[j] = ss->bpaSlotNumTiles[j]; + } + + ds->numChunks = ss->numChunks; + } + + dstBma = &dst->bmaHeader; + srcBma = &src->bmaHeader; + dstBma->mapWidthTiles = srcBma->mapWidthTiles; + dstBma->mapHeightTiles = srcBma->mapHeightTiles; + dstBma->mapWidthChunks = srcBma->mapWidthChunks; + dstBma->mapHeightChunks = srcBma->mapHeightChunks; + dstBma->numLayers = srcBma->numLayers; + dstBma->hasDataLayer = srcBma->hasDataLayer; + dstBma->hasCollision = srcBma->hasCollision; + + unkSubPtr = &ov11_02324CBC->unk98[dst->unk2BC.unk0]; + palId = dst->unk2BC.unk6 * 16; + palData = bplData + 4; + for (i = 0; i < bplHeader->numPalettes && i < dst->unk2BC.unk8; i++) { + CopyColorToPaletteDataRgba(unkSubPtr, palId++, &ov11_02320BF4); + FillPaletteDataRgba(unkSubPtr, palId, palData, 15); + palId += 15; + palData += 15; + } + + for (; i < dst->unk2BC.unk8; i++) { + CopyColorToPaletteDataRgba(unkSubPtr, palId++, &ov11_02320BF4); + + for (j = 1; j < 16; j++) { + CopyColorToPaletteDataRgba(unkSubPtr, palId++, &ov11_02320BE8); + } + } + + MarkPaletteDataAsNeedingUpdate(unkSubPtr); + + sub4Ptr = dst->unk4; + n = 0; + + if (bplHeader->hasPalAnimations) { + s32 numPals = bplHeader->numPalettes * 15; + const void *afterSpecs; + + spec = bplData + 4 + numPals * 4; + afterSpecs = spec + bplHeader->numPalettes; + palData = afterSpecs; + dst->animationSpecifications = spec; + dst->unk1FB = 1; + dst->unk1BC = 0; + dst->unk1F8 = src->unk1F8; + dst->unk1F9 = src->unk1FA; + dst->unk1FA = src->unk1FA; + dst->unk1EE = src->unk1EE; + + for (; n < bplHeader->numPalettes && n < dst->unk2BC.unk8; + n++, sub4Ptr++, spec++) { + if (spec->numFrames > 0) { + sub4Ptr->unk4 = palData; + palData += spec->numFrames * 15; + } else { + sub4Ptr->unk4 = NULL; + } + + sub4Ptr->unk0 = 0; + sub4Ptr->unk2 = 0; + sub4Ptr->unk8 = NULL; + } + } else { + dst->animationSpecifications = NULL; + dst->unk1F8 = 0; + dst->unk1F9 = 0; + dst->unk1FA = 0; + dst->unk1FB = 0; + dst->unk1BC = 0; + } + + for (; n < UNK_4_ARR_COUNT; n++, sub4Ptr++) { + sub4Ptr->unk0 = 0; + sub4Ptr->unk2 = 0; + sub4Ptr->unk8 = NULL; + sub4Ptr->unk4 = NULL; + } + + for (i = 0; i < UNK_C4_ARR_COUNT; i++) { + UnkGroundBg_C4 *subC4 = &dst->unkC4[i]; + + subC4->unk0 = 0; + subC4->unk1 = 0; + subC4->unk4 = 0; + subC4->unk2 = 0; + ZInit8(&subC4->bpaFile); + subC4->unk10 = NULL; + subC4->unk18 = NULL; + subC4->unk14 = NULL; + subC4->unk20 = NULL; + subC4->unk24 = subC4->unk1C = NULL; + subC4->unk28 = 0; + } + + k = dst->unk2BC.unk2; + + for (i = 0; i < dst->unk2BC.numLayers; i++, k++) { + s32 c4Idx = (i == 0) ? 0 : 2; + s32 bpaIdx = (i == 0) ? 0 : 4; + LayerSpecs *sp = &dst->layerSpecs[i]; + u16 *layerVram = ov11_02320C18[dst->unk2BC.unk0][k]; + + s32 tiles = dst->unk2BC.unkA; + + tiles += sp->numTiles; + vram = layerVram + tiles * 16; + + for (j = 0; j < 2; j++, bpaIdx++, c4Idx++) { + UnkGroundBg_C4 *srcC4 = &src->unkC4[c4Idx]; + UnkGroundBg_C4 *dstC4 = &dst->unkC4[c4Idx]; + + const char *bpaName = entry.others_bpa[bpaIdx].name; + + if (bpaName[0] != 0) { + struct BpaHeader *hdr; + s32 *frames; + void *end; + s32 numFrames; + + dstC4->bpaFile = srcC4->bpaFile; + dstC4->unk0 = 1; + dstC4->unk1 = 1; + hdr = dstC4->bpaFile.iov_base; + dstC4->unk10 = hdr; + frames = &hdr->durationPerFrame[0]; + numFrames = hdr->numFrames; + dstC4->unk14 = dstC4->unk18 = frames; + end = frames + numFrames; + dstC4->unk1C = dstC4->unk20 = end; + dstC4->unk2 = 0; + dstC4->unk4 = *dstC4->unk18; + dstC4->unk24 = vram; + dstC4->unk28 = sp->bpaSlotNumTiles[j] * 32; + vram += sp->bpaSlotNumTiles[j] * 16; + } + + } + + } + + k = dst->unk2BC.unk2; + + for (si = 0; si < dst->unk2BC.numLayers; si++, k++) { + LayerSpecs *sp = &src->layerSpecs[si]; + s32 total = sp->numTiles; + + for (sj = 0; sj < MAX_BPA_SLOTS; sj++) { + total += sp->bpaSlotNumTiles[sj]; + } + + if (total > 0) { + Memcpy16(ov11_02320C18[dst->unk2BC.unk0][k], + ov11_02320C18[src->unk2BC.unk0][k], total * 32); + } + + dst->unk2DC[si] = src->unk2DC[si]; + dst->unk2E4[si] = src->unk2E4[si]; + } + + dst->unk1FC = src->unk1FC; + srcRender = src->mapRender; + dstRender = dst->mapRender; + for (i = 0; i < dst->unk1FC; i++, dstRender++, srcRender++) { + *dstRender = *srcRender; + bgIdx = dstRender->unk2; + + for (j = 0; j < dstRender->numBgs && bgIdx < dst->unk2BC.numLayers; + j++, bgIdx++) { + dstRender->unk2C[j] = dst->unk2EC[bgIdx]; + } + + for (; j < 2; j++) { + dstRender->unk1C[j] = NULL; + dstRender->unk24[j] = NULL; + dstRender->unk2C[j] = NULL; + } + + ov11_022EE9B0(dstRender, dst->cameraPixelPosition); + } + + for (; i < 2; i++, dstRender++) { + ov11_022EE8CC(dstRender, dst, 0, 0, 0, 0); + } + + return TRUE; +} From eb0db73b1ff16a8a5289c7443cf0cf1ff594040e Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 23 Aug 2026 01:16:26 -0700 Subject: [PATCH 02/34] Decomp ApplyDamage; fix a message-id parameter type and three field types ApplyDamage (overlay 29, 0x02308FE0). asm/overlay_29_02308FE0.s and its .inc are removed and the object drops out of main.lsf; the function merges into src/overlay_29_02308FBC.c alongside EntityIsValid__02308FBC. Types added: struct unk_02308FE0 (the damage-data argument, in the function's header), struct unk_023528A4 and struct unk_022C593C (element types for TYPE_DAMAGE_NEGATING_EXCLUSIVE_ITEM_EFFECTS and ov10_022C593C, local to the .c). Field types corrected, each required by the match: struct monster::bide_damage_tally u32 -> s32 (clamped with strgt) struct monster::field_0x168 / field_0x169 -> s16 field_0x168 (read ldrsh) struct dungeon_generation_info::music_table_idx u16 -> s16 (read ldrsh) TalkToSecretBazaarNpcStandard, ov29_022F0618, TalkToSecretBazaarNpcWithYesNoMenu and the TalkToSecretBazaarNpc extern take a message id in their first parameter, not a struct entity *. Every caller loads a small constant into r0 - 0xC6B from ApplyDamage, 0xF32/0xF4A/0xF4B/0xF4C in asm/overlay_29_02344178.s. The three tree functions are one-line forwarders, so their parameter types were unconstrained; ApplyDamage is the first C caller. Two things a reviewer should weigh. DUNGEON_PTR is declared scalar here (extern struct dungeon *DUNGEON_PTR;) rather than the *DUNGEON_PTR[] idiom the other files use - the array form lets MWCC CSE the load and costs three instructions. And one read is qualified volatile (*(volatile u8 *)&dmon->curse_class_status.curse) to reproduce a reload retail performs with no intervening call; it is standard C and the ROM matches, but it is a stand-in rather than recovered source, and a struct curse_class_status * local gets to within one instruction without it. Only the US branch is decompiled; the original block carries 50 preprocessor directives including two wholesale #ifdef EUROPE duplications. Authored by Claude (Opus 5) under human direction. Confirmed by a matching build: build/pmdsky.us/pmdsky.us.nds: OK (main.sha1 passes, so the ARM9 binary matches and not only the packaged ROM). Co-Authored-By: Claude Opus 5 --- asm/include/overlay_29_02308FE0.inc | 121 - asm/overlay_29_02308FE0.s | 3516 --------------------------- include/dungeon.h | 2 +- include/dungeon_mode.h | 2 +- include/overlay_29_022F0590.h | 6 +- include/overlay_29_02308FBC.h | 17 + main.lsf | 1 - src/overlay_29_022F0590.c | 8 +- src/overlay_29_02308FBC.c | 869 +++++++ 9 files changed, 895 insertions(+), 3647 deletions(-) delete mode 100644 asm/include/overlay_29_02308FE0.inc delete mode 100644 asm/overlay_29_02308FE0.s diff --git a/asm/include/overlay_29_02308FE0.inc b/asm/include/overlay_29_02308FE0.inc deleted file mode 100644 index 4747ed71..00000000 --- a/asm/include/overlay_29_02308FE0.inc +++ /dev/null @@ -1,121 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public abs -.public ActivateMotorDrive -.public AddExpSpecial -.public AdvanceFrame -.public AftermathCheck -.public BAG_ITEMS_PTR_MIRROR -.public CanEnemyEvolve -.public CanSeeTarget -.public ChangeDungeonMusic -.public ChangeMonsterAnimation -.public ChangeMonsterAnimationToIdle -.public DAMAGE_STRING_IDS -.public DEFEAT_STRING_IDS -.public DefenderAbilityIsActive__0230A940 -.public DisplayAnimatedNumbers -.public DUNGEON_PTR -.public DungeonRandOutcome__022EAB20 -.public EndCurseClassStatus -.public EndInvisibleClassStatus -.public EndLeechSeedStatusForAllTargets -.public EntityIsValid__02308FBC -.public ExclusiveItemEffectIsActive__0230A9B8 -.public ExclusiveItemEffectIsActiveWithLogging -.public FillRecruitInfo -.public FreeOtherWrappedMonsters -.public GetActiveTeamMember -.public GetDamageTurnOption -.public GetDirectionTowardsPosition -.public GetExp -.public GetIdleAnimationId -.public GetTileAtEntity -.public HandleFaint -.public IqSkillIsEnabled -.public IsBlinded -.public IsCurrentMissionType -.public IsExperienceLocked -.public IsMonsterIdInNormalRangeVeneer -.public IsMonsterLoneOutlaw -.public IsSecretBazaarNpcBehavior -.public IsSpecialStoryAlly -.public ItemIsActive__0230A9DC -.public ItemZInit -.public JoinedAtRangeCheck2Veneer -.public LogMessageByIdWithPopup -.public LogMessageByIdWithPopupCheckUser -.public LogMessageByIdWithPopupCheckUserTarget -.public MoveMonsterToPos -.public MusicTableIdxToMusicId -.public ov10_022BDC68 -.public ov10_022BF964 -.public ov10_022C45C4 -.public ov10_022C45FC -.public ov10_022C4834 -.public ov10_022C593C -.public ov29_022E5478 -.public ov29_022E550C -.public ov29_022E66D8 -.public ov29_022E81F8 -.public ov29_022EA370 -.public ov29_022EAF20 -.public ov29_022ECD84 -.public ov29_022EFB20 -.public ov29_022EFB84 -.public ov29_022F0534 -.public ov29_022F05E4 -.public ov29_022F0780 -.public ov29_022F9AF4 -.public ov29_022FB98C -.public ov29_022FBD24 -.public ov29_02303E0C -.public ov29_02304830 -.public ov29_02307C48 -.public ov29_02307DC0 -.public ov29_0230D628 -.public ov29_0230D688 -.public ov29_0230D7D4 -.public ov29_0233847C -.public ov29_02344B9C -.public ov29_0234969C -.public ov29_0234B1A4 -.public ov29_02353218 -.public ov29_02353220 -.public ov29_02353224 -.public ov29_02353228 -.public ov29_0235322C -.public ov29_02353230 -.public ov29_02353234 -.public ov29_023535D4 -.public ov29_0237CA6C -.public PlayEffectAnimationEntity -.public PlayMissSfx__022E611C -.public PlayMissSfx__022E6150 -.public RecruitCheck -.public RemoveHolderForItemInBag -.public RestorePpAllMovesSetFlags -.public RestoreRandomMovePP -.public SET_DAMAGE_STATUS_DAMAGE -.public SetMessageLogPreprocessorArgsNumberVal -.public SetMonsterFlag2 -.public SetPokemonBattled -.public SetUnkMusicFlag -.public ShouldDisplayEntityWrapper -.public SpawnDroppedItemWrapper -.public SubInitMonster -.public SubstitutePlaceholderStringTags -.public TalkToSecretBazaarNpcStandard -.public TerminateEffectWrapper -.public TryEndPetrifiedOrSleepStatus -.public TryIncreaseHp -.public TryRecruit -.public TrySpawnEnemyItemDrop -.public TYPE_DAMAGE_NEGATING_EXCLUSIVE_ITEM_EFFECTS -.public UnfreezeAnim -.public UpdateAiTargetPos -.public UpdateEntityPixelPos -.public UpdateShopkeeperModeAfterAttack -.public UpdateStatusIconFlags -.public UpdateTrapsVisibility -.public WaitUntilAlertBoxPauseIsOver diff --git a/asm/overlay_29_02308FE0.s b/asm/overlay_29_02308FE0.s deleted file mode 100644 index 00787f8d..00000000 --- a/asm/overlay_29_02308FE0.s +++ /dev/null @@ -1,3516 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02308FE0.inc" - - .text - - arm_func_start ApplyDamage -ApplyDamage: ; 0x02308FE0 -#ifdef JAPAN -#define APPLY_DAMAGE_OFFSET -4 -#define APPLY_DAMAGE_OFFSET_2 -0xA4 -#else -#define APPLY_DAMAGE_OFFSET 0 -#define APPLY_DAMAGE_OFFSET_2 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x64 -#ifdef EUROPE - ldr r8, [sp, #0x8c] - mov r4, #0 - mov r5, r2 - mov sb, r1 - strb r4, [r5, #0x10] - ldr r1, [sb] - mov sl, r0 - str r3, [sp, #0x10] - mov fp, r4 - str r4, [sp, #0x14] - cmp r1, #1 - bne _02309A58 - ldr r0, [sb, #0xb4] - ldrb r0, [r0, #0xbc] - bl IsSecretBazaarNpcBehavior - cmp r0, #0 - beq _02309A68 -_02309A58: - mov r0, #1 - strb r0, [r5, #0x10] - mov r0, #0 - b _0230A918 -_02309A68: - ldr r7, [sb, #0xb4] - ldrb r0, [r7, #6] - cmp r0, #0 - beq _02309A88 - ldrb r0, [r7, #8] - cmp r0, #0 - moveq r0, #1 - streq r0, [sp, #0x14] -_02309A88: - mov r0, sl - mov r1, sb - bl TryEndPetrifiedOrSleepStatus - mov r0, sl - mov r1, sb - bl UpdateShopkeeperModeAfterAttack - ldr r0, [sl] - cmp r0, #1 - ldreq r0, [sl, #0xb4] - ldreqb r0, [r0, #0xec] - cmpeq r0, #3 - ldreqb r0, [r5, #0xf] - cmpeq r0, #0 - ldreq r0, _02309F98 ; =SET_DAMAGE_STATUS_DAMAGE - ldreqsh r0, [r0] - streq r0, [r5] - ldr r0, [sl] - cmp r0, #1 - bne _02309B60 - mov r0, sl - mov r1, sb - mov r2, #0x73 - mov r3, #1 - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - ldrne r0, [r5, #4] - cmpne r0, #4 - cmpne r0, #0xe - cmpne r0, #0 - cmpne r0, #0x17 - beq _02309BD0 - mov r1, sb - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _02309F9C ; =0x00000C46 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, sl - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02309B50 - mov r0, sb - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02309B50 - mov r0, sl - mov r1, sb - bl PlayMissSfx__022E611C -_02309B50: - mov r0, #1 - strb r0, [r5, #0x10] - mov r0, #0 - b _0230A918 -_02309B60: - cmp r0, #6 - bne _02309BD0 - mov r0, sb - mov r1, #0x73 - bl AbilityIsActiveVeneer - cmp r0, #0 - ldrne r0, [r5, #4] - cmpne r0, #4 - cmpne r0, #0xe - cmpne r0, #0x17 - beq _02309BD0 - mov r1, sb - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r1, _02309F9C ; =0x00000C46 - mov r0, sb - bl LogMessageByIdWithPopupCheckUser - mov r0, sb - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02309BC0 - mov r0, sb - bl PlayMissSfx__022E6150 -_02309BC0: - mov r0, #1 - strb r0, [r5, #0x10] - mov r0, #0 - b _0230A918 -_02309BD0: - ldr r0, _02309FA0 ; =0x0000024D - cmp r8, r0 - beq _02309C50 - ldr r0, [sl] - cmp r0, #1 - bne _02309C50 - mov r0, sl - mov r1, sb - mov r2, #0xd - mov r3, #1 - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02309C50 - ldr r1, [r5] - ldr r0, _02309FA4 ; =0x0000270F - cmp r1, r0 - bne _02309C50 - mov r1, sb - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - mov r0, sl - mov r1, sb - mov r2, #0xc40 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, sl - mov r1, sb - bl PlayMissSfx__022E611C - mov r0, #1 - strb r0, [r5, #0x10] - mov r0, #0 - b _0230A918 -_02309C50: - ldrb r0, [r7, #0xc4] - cmp r0, #1 - bne _02309CA0 - cmp r8, #0x250 - beq _02309C90 - mov r1, sb - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _02309FA8 ; =0x00000C41 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, sl - mov r1, sb - bl PlayMissSfx__022E611C -_02309C90: - mov r0, #1 - strb r0, [r5, #0x10] - mov r0, #0 - b _0230A918 -_02309CA0: - ldrb r0, [r7, #0xbd] - cmp r0, #1 - cmpne r0, #5 - cmpne r0, #3 - bne _02309CC8 - ldrb r0, [r7, #0xbe] - cmp r0, #0x7f - bne _02309CC8 - mov r0, sb - bl ov29_02307C48 -_02309CC8: - ldr r0, [sl] - cmp r0, #1 - bne _02309E04 - mov r0, sl - mov r1, sb - mov r2, #0x23 - mov r3, #1 - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02309D24 - ldrb r0, [r5, #0xc] - cmp r0, #5 - bne _02309D24 - mov r3, #0 - str r3, [sp] - ldr r2, [r5] - mov r0, sl - mov r1, sb - bl TryIncreaseHp - mov r0, #1 - strb r0, [r5, #0x10] - mov r0, #0 - b _0230A918 -_02309D24: - mov r0, sl - mov r1, sb - mov r2, #0x24 - mov r3, #1 - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02309D74 - ldrb r0, [r5, #0xc] - cmp r0, #3 - bne _02309D74 - mov r3, #0 - str r3, [sp] - ldr r2, [r5] - mov r0, sl - mov r1, sb - bl TryIncreaseHp - mov r0, #1 - strb r0, [r5, #0x10] - mov r0, #0 - b _0230A918 -_02309D74: - mov r0, sl - mov r1, sb - mov r2, #0x55 - mov r3, #1 - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02309DC4 - ldrb r0, [r5, #0xc] - cmp r0, #3 - bne _02309DC4 - mov r3, #0 - str r3, [sp] - ldr r2, [r5] - mov r0, sl - mov r1, sb - bl TryIncreaseHp - mov r0, #1 - strb r0, [r5, #0x10] - mov r0, #0 - b _0230A918 -_02309DC4: - mov r0, sl - mov r1, sb - mov r2, #0x66 - mov r3, #1 - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02309E04 - ldrb r0, [r5, #0xc] - cmp r0, #5 - bne _02309E04 - mov r0, sb - bl ActivateMotorDrive - mov r0, #1 - strb r0, [r5, #0x10] - mov r0, #0 - b _0230A918 -_02309E04: - ldr r6, _02309FAC ; =TYPE_DAMAGE_NEGATING_EXCLUSIVE_ITEM_EFFECTS - b _02309E78 -_02309E0C: - ldrb r0, [r5, #0xc] - cmp r1, r0 - bne _02309E74 - ldr r1, [r6, #4] - mov r0, sl - and r2, r1, #0xff - str r2, [sp] - mov r2, #0 - mov r1, sb - mov r3, r2 - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - beq _02309E74 - ldr r0, [r6, #4] - cmp r0, #0x71 - mov r0, #1 - strleb r0, [r5, #0x10] - ble _02309E6C - str r0, [sp] - ldr r2, [r5] - mov r0, sl - mov r1, sb - mov r3, #0 - bl TryIncreaseHp -_02309E6C: - mov r0, #0 - b _02309E88 -_02309E74: - add r6, r6, #8 -_02309E78: - ldrb r1, [r6] - cmp r1, #0x12 - bne _02309E0C - mov r0, #1 -_02309E88: - cmp r0, #0 - bne _02309F04 - ldrb r0, [r5, #0x10] - cmp r0, #0 - beq _02309EF4 - ldr r0, [sl] - cmp r0, #1 - bne _02309ED8 - mov r0, sl - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02309EF4 - mov r0, sb - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02309EF4 - mov r0, sl - mov r1, sb - bl ov29_022FB98C - b _02309EF4 -_02309ED8: - mov r0, sb - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02309EF4 - mov r0, sl - mov r1, sb - bl ov29_022FB98C -_02309EF4: - mov r0, #1 - strb r0, [r5, #0x10] - mov r0, #0 - b _0230A918 -_02309F04: - ldr r0, [r5] - cmp r0, #0 - ble _02309F4C - mov r0, sb - mov r1, #0x51 - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _02309F4C - ldr r0, _02309FB0 ; =ov10_022C45C4 - ldrsh r0, [r0] - bl DungeonRandOutcome__022EAB20 - cmp r0, #0 - beq _02309F4C - mov r0, sb - mov r1, sb - mov r2, #1 - mov r3, #0 - bl RestoreRandomMovePP -_02309F4C: - ldrb r0, [r7, #0x15c] - cmp r0, #0 - bne _02309FCC_EU - ldrb r0, [r5, #0xe] - cmp r0, #0 - beq _02309F74 - ldr r2, _02309FB4 ; =0x00000C42 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_02309F74: - ldr r0, [r5, #8] - cmp r0, #0 - beq _02309F94 - cmp r0, #1 - beq _02309FA8_EU - cmp r0, #3 - beq _02309FBC_EU - b _02309FCC_EU -_02309F94: - ldr r2, _02309FB8 ; =0x00000C43 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - b _02309FCC_EU -_02309FA8_EU: - ldr r2, _02309FBC ; =0x00000C44 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - b _02309FCC_EU -_02309FBC_EU: - ldr r2, _02309FC0 ; =0x00000C45 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_02309FCC_EU: - mov r0, #0 - mov r1, sl - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, sb - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r1, [r5] - cmp r1, #0 - bne _0230A07C - mov r0, sl - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _0230A044 - mov r0, sb - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _0230A044 - ldrb r0, [r7, #0x15c] - cmp r0, #0 - bne _0230A034 - ldr r2, _02309FC4 ; =0x00000C47 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_0230A034: - mov r0, sl - mov r1, sb - bl PlayMissSfx__022E611C - b _0230A06C -_0230A044: - ldrb r0, [r7, #0x15c + APPLY_DAMAGE_OFFSET] - cmp r0, #0 - bne _0230A060 - ldr r2, _02309FC4 ; =0x00000C47 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_0230A060: - mov r0, #0x1e - mov r1, #0x18 - bl ov29_022EA370 -_0230A06C: - mov r0, #1 - strb r0, [r5, #0x10] - mov r0, #0 - b _0230A918 -_0230A07C: - ldr r0, _02309FA4 ; =0x0000270F - cmp r1, r0 - bne _0230A16C - ldr r0, [sp, #0x90] - cmp r0, #0 - beq _0230A144 - mov r0, sb - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _0230A144 - mov r0, sb - bl GetTileAtEntity - mov r2, #0 - mov r1, #1 - str r2, [sp] - str r1, [sp, #4] - add r1, r1, #0x2b4 - str r2, [sp, #8] - str r2, [sp, #0xc] - mov fp, r0 - mov r0, sb - mov r3, #3 - bl PlayEffectAnimationEntity - mov r0, r0, lsl #0x10 - mov r6, r0, asr #0x10 - mvn r1, #0 - cmp r6, r1 - ldr r0, _02309FC8 ; =ov29_023535D4 - strh r1, [r0] - beq _0230A144 - b _0230A100 -_0230A0F8: - mov r0, #0x18 - bl AdvanceFrame -_0230A100: - mov r0, r6 - bl ov10_022BF964 - cmp r0, #0 - bne _0230A0F8 - mov r0, r6 - bl TerminateEffectWrapper - mov r2, #0 - str r2, [sp] - mov r0, #1 - stmib sp, {r0, r2} - ldr r1, _02309FCC ; =0x000002B6 - mov r0, sb - mov r3, #3 - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - ldr r1, _02309FC8 ; =ov29_023535D4 - strh r0, [r1] -_0230A144: - ldrb r0, [r7, #0x15c] - cmp r0, #0 - bne _0230A160 - ldr r2, _02309FD0 ; =0x00000C48 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_0230A160: - ldr r0, _02309FD4 ; =0x000003E7 - str r0, [r7, #0xb8] - b _0230A234 -_0230A16C: - mov r0, #0 - bl SetMessageLogPreprocessorArgsNumberVal - ldr r1, [r5, #4] - ldr r2, [r7, #0xb8] - cmp r1, #0x1b - ldrlt r0, _02309FD8 ; =DAMAGE_STRING_IDS - movge r6, #0 - movlt r1, r1, lsl #1 - ldrlth r6, [r0, r1] - ldr r1, [r5] - ldr r0, _02309FD4 ; =0x000003E7 - add r1, r2, r1 - str r1, [r7, #0xb8] - cmp r1, r0 - strgt r0, [r7, #0xb8] - mov r0, sb - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _0230A210 - ldr r0, [r5, #4] - cmp r0, #0xe - cmpne r0, #0x17 - ldrne r0, _02309FDC ; =0x0000025F - cmpne r8, r0 - beq _0230A1E8 - ldr r0, [r5] - mov r2, #1 - mov r1, sb - rsb r0, r0, #0 - sub r3, r2, #2 - bl DisplayAnimatedNumbers -_0230A1E8: - ldrb r0, [r7, #0x15c] - cmp r0, #0 - bne _0230A234 - cmp r6, #0 - beq _0230A234 - mov r0, sl - mov r1, sb - mov r2, r6 - bl LogMessageByIdWithPopupCheckUserTarget - b _0230A234 -_0230A210: - ldrb r0, [r7, #0x15c] - cmp r0, #0 - bne _0230A234 - cmp r6, #0 - beq _0230A234 - mov r0, sl - mov r1, sb - mov r2, r6 - bl LogMessageByIdWithPopupCheckUserTarget -_0230A234: - ldr r0, [r5, #4] - cmp r0, #0xe - bne _0230A24C - ldrsh r0, [r7, #0x10] - cmp r0, #1 - bgt _0230A348 -_0230A24C: - cmp fp, #0 - bne _0230A348 - mov r0, sb - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _0230A348 - ldrsh r1, [sl, #4] - ldrsh r0, [sb, #4] - cmp r1, r0 - ldreqsh r1, [sl, #6] - ldreqsh r0, [sb, #6] - cmpeq r1, r0 - beq _0230A318 - ldr r0, [sl] - cmp r0, #1 - bne _0230A318 - ldrb r0, [r7, #7] - mov r6, #0 - cmp r0, #0 - beq _0230A2CC - bl GetDamageTurnOption - cmp r0, #0 - beq _0230A2CC - mov r0, sb - bl ov29_022F9AF4 - cmp r0, #0 - bne _0230A2CC - mov r0, sb - mov r1, sl - bl CanSeeTarget - cmp r0, #0 - movne r6, #1 -_0230A2CC: - ldrb r0, [r7, #0xf1] - cmp r0, #2 - beq _0230A2EC - mov r0, sb - mov r1, #1 - bl IsBlinded - cmp r0, #0 - beq _0230A2F0 -_0230A2EC: - mov r6, #0 -_0230A2F0: - cmp r6, #0 - beq _0230A310 - add r0, sb, #4 - add r1, sl, #4 - ldr r6, [sb, #0xb4] - bl GetDirectionTowardsPosition - and r0, r0, #7 - strb r0, [r6, #0x4c] -_0230A310: - mov r0, sb - bl UpdateAiTargetPos -_0230A318: - ldr r0, _02309FDC ; =0x0000025F - cmp r8, r0 - beq _0230A348 - ldr r1, [sb, #0xb4] - mov r0, sb - ldrb r2, [r1, #0x4c] - mov r1, #6 - bl ChangeMonsterAnimation - mov r0, sb - mov r1, r5 - bl ov29_022E5478 - mov r4, #1 -_0230A348: - ldrb r0, [r7, #6] - cmp r0, #0 - beq _0230A388 - ldr r0, [r5] - cmp r0, #0 - ble _0230A388 - ldr r0, [sl] - cmp r0, #1 - ldreq r0, [sl, #0xb4] - ldreqb r0, [r0, #6] - cmpeq r0, #0 - bne _0230A388 - ldrsh r0, [r7, #2] - bl SetMonsterFlag2 - ldrsh r0, [r7, #2] - bl SetPokemonBattled -_0230A388: - ldrsh r6, [r7, #0x10] - ldr r0, [r5] - cmp r6, r0 - subgt r0, r6, r0 - movle r0, #0 - strh r0, [r7, #0x10] - ldrb r0, [r7, #0xd5] - cmp r0, #9 - bne _0230A3D4 - ldrsh r0, [r7, #0x10] - cmp r0, #0 - bne _0230A454 - ldr r2, _02309FE0 ; =0x00000C49 - mov r3, #1 - mov r0, sl - mov r1, sb - strh r3, [r7, #0x10] - bl LogMessageByIdWithPopupCheckUserTarget - b _0230A454 -_0230A3D4: - ldr r0, [sp, #0x10] - cmp r0, #1 - bne _0230A408 - ldrsh r0, [r7, #0x10] - cmp r0, #0 - bne _0230A454 - ldr r2, _02309FE4 ; =0x00000C4A - mov r3, #1 - mov r0, sl - mov r1, sb - strh r3, [r7, #0x10] - bl LogMessageByIdWithPopupCheckUserTarget - b _0230A454 -_0230A408: - mov r0, sb - mov r1, #0x22 - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _0230A454 - ldr r0, _02309FE8 ; =ov10_022C4834 - ldr r0, [r0] - bl DungeonRandOutcome__022EAB20 - cmp r0, #0 - beq _0230A454 - ldrsh r0, [r7, #0x10] - cmp r0, #0 - bne _0230A454 - ldr r2, _02309FE0 ; =0x00000C49 - mov r3, #1 - mov r0, sl - mov r1, sb - strh r3, [r7, #0x10] - bl LogMessageByIdWithPopupCheckUserTarget -_0230A454: - bl ov29_022E81F8 - ldrsh r0, [r7, #0x10] - subs r6, r6, r0 - movmi r6, #0 - cmp r4, #0 - cmpeq fp, #0 - beq _0230A47C - mov r0, #0xa - mov r1, #0x18 - bl ov29_022EA370 -_0230A47C: - mov r0, sb - bl UpdateStatusIconFlags - ldrsh r0, [r7, #0x10] - cmp r0, #0 - beq _0230A54C - cmp r4, #0 - beq _0230A4A4 - mov r0, sb - mov r1, #8 - bl ChangeMonsterAnimationToIdle -_0230A4A4: - ldr r0, [r5, #4] - cmp r0, #0xe - beq _0230A530 - mov r0, sb - mov r1, #0x17 - bl ItemIsActive__0230A9DC - cmp r0, #0 - beq _0230A4F0 - cmp r6, #0 - ble _0230A4F0 - ldr r1, [r5] - ldr r0, _02309FA4 ; =0x0000270F - cmp r1, r0 - beq _0230A4F0 - ldr r1, _02309FEC ; =ov10_022C45FC - mov r0, sl - ldrsh r2, [r1] - mov r1, sb - bl AddExpSpecial -_0230A4F0: - mov r0, sb - mov r1, #0x50 - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _0230A530 - cmp r6, #0 - ble _0230A530 - ldr r1, [r5] - ldr r0, _02309FA4 ; =0x0000270F - cmp r1, r0 - beq _0230A530 - ldr r1, _02309FEC ; =ov10_022C45FC - mov r0, sl - ldrsh r2, [r1] - mov r1, sb - bl AddExpSpecial -_0230A530: - cmp fp, #0 - beq _0230A544 - mov r0, sb - bl ov29_0230D7D4 - bl UpdateTrapsVisibility -_0230A544: - mov r0, #0 - b _0230A918 -_0230A54C: - ldr r0, _02309FDC ; =0x0000025F - cmp r8, r0 - bne _0230A588 - ldr r1, [sb, #0xb4] - mov r0, sb - ldrb r2, [r1, #0x4c] - mov r1, #6 - bl ChangeMonsterAnimation - mov r0, sb - mov r1, r5 - bl ov29_022E5478 - mov r0, #0xa - mov r1, #0x18 - bl ov29_022EA370 - mov r4, #1 -_0230A588: - ldrb r0, [r7, #0xef] - cmp r0, #2 - bne _0230A5A4 - mov r0, sl - mov r1, sb - mov r2, #0 - bl EndInvisibleClassStatus -_0230A5A4: - cmp fp, #0 - beq _0230A5D0 - mov r0, #0x14 - mov r1, #0x18 - bl ov29_022EA370 - mov r1, #2 - mov r0, sb - strb r1, [sb, #0x22] - bl ov29_0230D7D4 - bl UpdateTrapsVisibility - b _0230A5EC -_0230A5D0: - cmp r4, #0 - beq _0230A5EC - mov r2, #1 - mov r0, #0x1e - mov r1, #0x18 - strb r2, [sb, #0x22] - bl ov29_022EA370 -_0230A5EC: - mov r0, sl - mov r4, #1 - bl EntityIsValid__02308FBC - cmp r0, #0 - beq _0230A614 - ldr r0, [sl] - cmp r0, #1 - bne _0230A614 - cmp sl, sb - movne r4, #0 -_0230A614: - mov r0, #0 - mov r1, sl - mov r2, r0 - strb r0, [r7, #0x156] - bl SubstitutePlaceholderStringTags - mov r1, sb - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r0, [r5, #4] - mov fp, #0 - cmp r0, #0x13 - cmpne r0, #4 - cmpne r0, #0x14 - ldrb r0, [r7, #6] - bne _0230A680 - cmp r0, #0 - beq _0230A670 - ldr r2, _02309FF0 ; =0x00000C4B - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - b _0230A7E8 -_0230A670: - ldr r1, _02309FF0 ; =0x00000C4B - mov r0, sl - bl LogMessageByIdWithPopup - b _0230A7E8 -_0230A680: - cmp r0, #0 - beq _0230A6C8 - ldrb r0, [r7, #0xbc] - cmp r0, #7 - bne _0230A6AC - ldr r0, _02309FF4 ; =ov29_02353220 - mov r1, r4, lsl #1 - ldrh r1, [r0, r1] - mov r0, sl - bl LogMessageByIdWithPopup - b _0230A7E8 -_0230A6AC: - ldr r0, _02309FF8 ; =DEFEAT_STRING_IDS - mov r1, r4, lsl #1 - ldrh r2, [r0, r1] - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - b _0230A7E8 -_0230A6C8: - ldrsh r0, [r7, #0xc] - bl GetActiveTeamMember - ldrb r1, [r7, #7] - mov r5, r0 - cmp r1, #0 - bne _0230A704 - ldrb r0, [r7, #0x48] - bl JoinedAtRangeCheck2Veneer - cmp r0, #0 - beq _0230A71C - ldr r0, _02309FFC ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x75c] - cmp r0, #0 - bne _0230A71C -_0230A704: - ldr r0, _0230A000 ; =ov29_02353228 - mov r1, r4, lsl #1 - ldrh r1, [r0, r1] - mov r0, sl - bl LogMessageByIdWithPopup - b _0230A7E8 -_0230A71C: - mov r0, r7 - bl IsExperienceLocked - cmp r0, #0 - beq _0230A76C - mov r0, r7 - bl IsSpecialStoryAlly - cmp r0, #0 - beq _0230A754 - ldr r0, _0230A004 ; =ov29_02353234 - mov r1, r4, lsl #1 - ldrh r1, [r0, r1] - mov r0, sl - bl LogMessageByIdWithPopup - b _0230A7E8 -_0230A754: - ldr r0, _0230A008 ; =ov29_0235322C - mov r1, r4, lsl #1 - ldrh r1, [r0, r1] - mov r0, sl - bl LogMessageByIdWithPopup - b _0230A7E8 -_0230A76C: - ldrb r0, [r7, #0xbc] - cmp r0, #7 - bne _0230A790 - ldr r0, _02309FF4 ; =ov29_02353220 - mov r1, r4, lsl #1 - ldrh r1, [r0, r1] - mov r0, sl - bl LogMessageByIdWithPopup - b _0230A7E8 -_0230A790: - ldrsh r0, [r5, #8] - bl IsMonsterIdInNormalRangeVeneer - cmp r0, #0 - beq _0230A7E4 - ldr r0, _02309FFC ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x75d] - cmp r0, #0 - beq _0230A7CC - ldr r0, _0230A00C ; =ov29_02353224 - mov r1, r4, lsl #1 - ldrh r1, [r0, r1] - mov r0, sl - bl LogMessageByIdWithPopup - b _0230A7E8 -_0230A7CC: - ldr r0, _0230A010 ; =ov29_02353230 - mov r1, r4, lsl #1 - ldrh r1, [r0, r1] - mov r0, sl - bl LogMessageByIdWithPopup - b _0230A7E8 -_0230A7E4: - mov fp, #1 -_0230A7E8: - ldrb r0, [r7, #0xc4] - add r0, r0, #0xfd - and r0, r0, #0xff - cmp r0, #1 - bhi _0230A804 - ldr r0, [r7, #0xb4] - bl FreeOtherWrappedMonsters -_0230A804: - ldrb r0, [r7, #0x62] - tst r0, #1 - movne r1, #1 - moveq r1, #0 - tst r1, #0xff - beq _0230A964 - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - bne _0230A964 - ldrb r0, [r7, #0x62] - tst r0, #2 - ldreqsh r1, [r7, #0x66] - ldreq r0, _0230A018 ; =0x00000153 - cmpeq r1, r0 - bne _0230A964 - mov r0, sb - bl ov29_022E550C - mov r0, #0 - strb r0, [sb, #0x22] - ldrsh r2, [r7, #0x12] - ldrsh r1, [r7, #0x16] - ldr r0, _02309FD4 ; =0x000003E7 - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - strh r1, [r7, #0x10] - mov r2, #0 - strb r2, [r7, #0x162] - mov r0, #1 - strb r0, [r7, #0x156] - add r0, r7, #0x100 - ldrh r1, [r0, #0x4a] - strh r1, [r0, #0x46] - ldrh r1, [r0, #0x4c] - strh r1, [r0, #0x48] - ldrb r0, [r7, #7] - cmp r0, #0 - ldrne r0, _02309FFC ; =DUNGEON_PTR - ldrne r1, [r0] - strneb r2, [r1, #0x799] - ldrne r0, [r0] - strneb r2, [r0, #0x78d] - add r0, r7, #0x62 - bl ItemZInit - ldrb r0, [r7, #0xd8] - cmp r0, #3 - bne _0230A8E0 - mov r0, sl - mov r1, sb - mov r2, #3 - mov r3, #1 - bl EndCurseClassStatus - b _0230A8FC -_0230A8E0: - cmp r0, #2 - bne _0230A8FC - mov r0, sl - mov r1, sb - mov r2, #2 - mov r3, #1 - bl EndCurseClassStatus -_0230A8FC: - mov r0, sb - bl EndLeechSeedStatusForAllTargets - mov r0, r7 - mov r1, #0 - bl SubInitMonster - bl ov10_022BDC68 - mov r0, sb - bl RestorePpAllMovesSetFlags - mov r0, sb - bl GetIdleAnimationId - mov r1, r0 - mov r0, sb - bl ov29_02304830 - mov r0, sb - bl UpdateStatusIconFlags - mov r0, #1 - mov r1, sb - mov r2, #0 - bl SubstitutePlaceholderStringTags - mov r0, sl - ldr r1, _0230A01C ; =0x00000C4C - bl LogMessageByIdWithPopup - mov r0, sb - bl ov29_0230D628 - mov r0, #0 - b _0230A918 -_0230A964: - ldrb r0, [r7, #7] - cmp r0, #0 - beq _0230AC40_EU - ldrb r0, [r7, #0x62] - tst r0, #1 - movne r1, #1 - moveq r1, #0 - tst r1, #0xff - beq _0230AC40_EU - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - ldreqsh r1, [r7, #0x66] - ldreq r0, _0230A020 ; =0x00000159 - cmpeq r1, r0 - bne _0230AC40_EU - mov r6, #0 - mov r5, r6 -#else - ldr r5, [sp, #0x8c] - mov sb, #0 - mov r6, r2 - mov r7, r1 - strb sb, [r6, #0x10] - ldr r1, [r7] - mov r8, r0 - str r3, [sp, #0x10] - mov fp, sb - str sb, [sp, #0x14] - cmp r1, #1 - bne _0230902C - ldr r0, [r7, #0xb4] - ldrb r0, [r0, #0xbc] - bl IsSecretBazaarNpcBehavior - cmp r0, #0 - beq _0230903C -_0230902C: - mov r0, #1 - strb r0, [r6, #0x10] - mov r0, #0 - b _0230A918 -_0230903C: - ldr r4, [r7, #0xb4] - ldrb r0, [r4, #6] - cmp r0, #0 - beq _0230905C - ldrb r0, [r4, #8] - cmp r0, #0 - moveq r0, #1 - streq r0, [sp, #0x14] -_0230905C: - mov r0, r8 - mov r1, r7 - bl TryEndPetrifiedOrSleepStatus - mov r0, r8 - mov r1, r7 - bl UpdateShopkeeperModeAfterAttack - ldr r0, [r8] - cmp r0, #1 - ldreq r0, [r8, #0xb4] - ldreqb r0, [r0, #0xec] - cmpeq r0, #3 - ldreqb r0, [r6, #0xf] - cmpeq r0, #0 - ldreq r0, _02309F98 ; =SET_DAMAGE_STATUS_DAMAGE - ldreqsh r0, [r0] - streq r0, [r6] - ldr r0, [r8] - cmp r0, #1 - bne _02309134 - mov r0, r8 - mov r1, r7 - mov r2, #0x73 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - ldrne r0, [r6, #4] - cmpne r0, #4 - cmpne r0, #0xe - cmpne r0, #0 - cmpne r0, #0x17 - beq _023091A4 - mov r1, r7 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _02309F9C ; =0x00000C46 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r8 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02309124 - mov r0, r7 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02309124 - mov r0, r8 - mov r1, r7 - bl PlayMissSfx__022E611C -_02309124: - mov r0, #1 - strb r0, [r6, #0x10] - mov r0, #0 - b _0230A918 -_02309134: - cmp r0, #6 - bne _023091A4 - mov r0, r7 - mov r1, #0x73 - bl AbilityIsActiveVeneer - cmp r0, #0 - ldrne r0, [r6, #4] - cmpne r0, #4 - cmpne r0, #0xe - cmpne r0, #0x17 - beq _023091A4 - mov r1, r7 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r1, _02309F9C ; =0x00000C46 - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, r7 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02309194 - mov r0, r7 - bl PlayMissSfx__022E6150 -_02309194: - mov r0, #1 - strb r0, [r6, #0x10] - mov r0, #0 - b _0230A918 -_023091A4: - ldr r0, _02309FA0 ; =0x0000024D - cmp r5, r0 - beq _02309224 - ldr r0, [r8] - cmp r0, #1 - bne _02309224 - mov r0, r8 - mov r1, r7 - mov r2, #0xd -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02309224 - ldr r1, [r6] - ldr r0, _02309FA4 ; =0x0000270F - cmp r1, r0 - bne _02309224 - mov r1, r7 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags -#ifdef JAPAN - ldr r2, _0230B540 ; =0x0000097F - mov r0, r8 - mov r1, r7 -#else - mov r0, r8 - mov r1, r7 - mov r2, #0xc40 -#endif - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r8 - mov r1, r7 - bl PlayMissSfx__022E611C - mov r0, #1 - strb r0, [r6, #0x10] - mov r0, #0 - b _0230A918 -_02309224: - ldrb r0, [r4, #0xc4] - cmp r0, #1 - bne _02309274 - cmp r5, #0x250 - beq _02309264 - mov r1, r7 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags -#ifdef JAPAN - mov r0, r8 - mov r1, r7 - mov r2, #0x980 -#else - ldr r2, _02309FA8 ; =0x00000C41 - mov r0, r8 - mov r1, r7 -#endif - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r8 - mov r1, r7 - bl PlayMissSfx__022E611C -_02309264: - mov r0, #1 - strb r0, [r6, #0x10] - mov r0, #0 - b _0230A918 -_02309274: - ldrb r0, [r4, #0xbd] - cmp r0, #1 - cmpne r0, #5 - cmpne r0, #3 - bne _0230929C - ldrb r0, [r4, #0xbe] - cmp r0, #0x7f - bne _0230929C - mov r0, r7 - bl ov29_02307C48 -_0230929C: - ldr r0, [r8] - cmp r0, #1 - bne _023093D8 - mov r0, r8 - mov r1, r7 - mov r2, #0x23 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _023092F8 - ldrb r0, [r6, #0xc] - cmp r0, #5 - bne _023092F8 - mov r3, #0 - str r3, [sp] - ldr r2, [r6] - mov r0, r8 - mov r1, r7 - bl TryIncreaseHp - mov r0, #1 - strb r0, [r6, #0x10] - mov r0, #0 - b _0230A918 -_023092F8: - mov r0, r8 - mov r1, r7 - mov r2, #0x24 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02309348 - ldrb r0, [r6, #0xc] - cmp r0, #3 - bne _02309348 - mov r3, #0 - str r3, [sp] - ldr r2, [r6] - mov r0, r8 - mov r1, r7 - bl TryIncreaseHp - mov r0, #1 - strb r0, [r6, #0x10] - mov r0, #0 - b _0230A918 -_02309348: - mov r0, r8 - mov r1, r7 - mov r2, #0x55 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02309398 - ldrb r0, [r6, #0xc] - cmp r0, #3 - bne _02309398 - mov r3, #0 - str r3, [sp] - ldr r2, [r6] - mov r0, r8 - mov r1, r7 - bl TryIncreaseHp - mov r0, #1 - strb r0, [r6, #0x10] - mov r0, #0 - b _0230A918 -_02309398: - mov r0, r8 - mov r1, r7 - mov r2, #0x66 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _023093D8 - ldrb r0, [r6, #0xc] - cmp r0, #5 - bne _023093D8 - mov r0, r7 - bl ActivateMotorDrive - mov r0, #1 - strb r0, [r6, #0x10] - mov r0, #0 - b _0230A918 -_023093D8: - ldr sl, _02309FAC ; =TYPE_DAMAGE_NEGATING_EXCLUSIVE_ITEM_EFFECTS - b _0230944C -_023093E0: - ldrb r0, [r6, #0xc] - cmp r1, r0 - bne _02309448 - ldr r1, [sl, #4] - mov r0, r8 - and r2, r1, #0xff - str r2, [sp] - mov r2, #0 - mov r1, r7 - mov r3, r2 - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - beq _02309448 - ldr r0, [sl, #4] - cmp r0, #0x71 - mov r0, #1 - strleb r0, [r6, #0x10] - ble _02309440 - str r0, [sp] - ldr r2, [r6] - mov r0, r8 - mov r1, r7 - mov r3, #0 - bl TryIncreaseHp -_02309440: - mov r0, #0 - b _0230945C -_02309448: - add sl, sl, #8 -_0230944C: - ldrb r1, [sl] - cmp r1, #0x12 - bne _023093E0 - mov r0, #1 -_0230945C: - cmp r0, #0 - bne _023094D8 - ldrb r0, [r6, #0x10] - cmp r0, #0 - beq _023094C8 - ldr r0, [r8] - cmp r0, #1 - bne _023094AC - mov r0, r8 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _023094C8 - mov r0, r7 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _023094C8 - mov r0, r8 - mov r1, r7 - bl ov29_022FB98C - b _023094C8 -_023094AC: - mov r0, r7 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _023094C8 - mov r0, r8 - mov r1, r7 - bl ov29_022FB98C -_023094C8: - mov r0, #1 - strb r0, [r6, #0x10] - mov r0, #0 - b _0230A918 -_023094D8: - ldr r0, [r6] - cmp r0, #0 - ble _02309520 - mov r0, r7 - mov r1, #0x51 - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _02309520 - ldr r0, _02309FB0 ; =ov10_022C45C4 - ldrsh r0, [r0] - bl DungeonRandOutcome__022EAB20 - cmp r0, #0 - beq _02309520 - mov r0, r7 - mov r1, r7 - mov r2, #1 - mov r3, #0 - bl RestoreRandomMovePP -_02309520: - ldrb r0, [r4, #0x15c + APPLY_DAMAGE_OFFSET] - cmp r0, #0 - bne _023095A0 - ldrb r0, [r6, #0xe] - cmp r0, #0 - beq _02309548 - ldr r2, _02309FB4 ; =0x00000C42 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_02309548: - ldr r0, [r6, #8] - cmp r0, #0 - beq _02309568 - cmp r0, #1 - beq _0230957C - cmp r0, #3 - beq _02309590 - b _023095A0 -_02309568: - ldr r2, _02309FB8 ; =0x00000C43 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _023095A0 -_0230957C: - ldr r2, _02309FBC ; =0x00000C44 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _023095A0 -_02309590: - ldr r2, _02309FC0 ; =0x00000C45 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_023095A0: - mov r0, #0 - mov r1, r8 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r7 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r1, [r6] - cmp r1, #0 - bne _02309650 - mov r0, r8 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02309618 - mov r0, r7 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02309618 - ldrb r0, [r4, #0x15c + APPLY_DAMAGE_OFFSET] - cmp r0, #0 - bne _02309608 - ldr r2, _02309FC4 ; =0x00000C47 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_02309608: - mov r0, r8 - mov r1, r7 - bl PlayMissSfx__022E611C - b _02309640 -_02309618: - ldrb r0, [r4, #0x15c + APPLY_DAMAGE_OFFSET] - cmp r0, #0 - bne _02309634 - ldr r2, _02309FC4 ; =0x00000C47 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_02309634: - mov r0, #0x1e - mov r1, #0x18 - bl ov29_022EA370 -_02309640: - mov r0, #1 - strb r0, [r6, #0x10] - mov r0, #0 - b _0230A918 -_02309650: - ldr r0, _02309FA4 ; =0x0000270F - cmp r1, r0 - bne _02309740 - ldr r0, [sp, #0x90] - cmp r0, #0 - beq _02309718 - mov r0, r7 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02309718 - mov r0, r7 - bl GetTileAtEntity - mov r2, #0 - mov r1, #1 - str r2, [sp] - str r1, [sp, #4] - add r1, r1, #0x2b4 - str r2, [sp, #8] - str r2, [sp, #0xc] - mov fp, r0 - mov r0, r7 - mov r3, #3 - bl PlayEffectAnimationEntity - mov r0, r0, lsl #0x10 - mov sl, r0, asr #0x10 - mvn r1, #0 - cmp sl, r1 - ldr r0, _02309FC8 ; =ov29_023535D4 - strh r1, [r0] - beq _02309718 - b _023096D4 -_023096CC: - mov r0, #0x18 - bl AdvanceFrame -_023096D4: - mov r0, sl - bl ov10_022BF964 - cmp r0, #0 - bne _023096CC - mov r0, sl - bl TerminateEffectWrapper - mov r2, #0 - str r2, [sp] - mov r0, #1 - stmib sp, {r0, r2} - ldr r1, _02309FCC ; =0x000002B6 - mov r0, r7 - mov r3, #3 - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - ldr r1, _02309FC8 ; =ov29_023535D4 - strh r0, [r1] -_02309718: - ldrb r0, [r4, #0x15c + APPLY_DAMAGE_OFFSET] - cmp r0, #0 - bne _02309734 - ldr r2, _02309FD0 ; =0x00000C48 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_02309734: - ldr r0, _02309FD4 ; =0x000003E7 - str r0, [r4, #0xb8] - b _02309808 -_02309740: - mov r0, #0 - bl SetMessageLogPreprocessorArgsNumberVal - ldr r1, [r6, #4] - ldr r2, [r4, #0xb8] - cmp r1, #0x1b - ldrlt r0, _02309FD8 ; =DAMAGE_STRING_IDS - movge sl, #0 - movlt r1, r1, lsl #1 - ldrlth sl, [r0, r1] - ldr r1, [r6] - ldr r0, _02309FD4 ; =0x000003E7 - add r1, r2, r1 - str r1, [r4, #0xb8] - cmp r1, r0 - strgt r0, [r4, #0xb8] - mov r0, r7 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _023097E4 - ldr r0, [r6, #4] - cmp r0, #0xe - cmpne r0, #0x17 - ldrne r0, _02309FDC ; =0x0000025F - cmpne r5, r0 - beq _023097BC - ldr r0, [r6] - mov r2, #1 - mov r1, r7 - rsb r0, r0, #0 - sub r3, r2, #2 - bl DisplayAnimatedNumbers -_023097BC: - ldrb r0, [r4, #0x15c + APPLY_DAMAGE_OFFSET] - cmp r0, #0 - bne _02309808 - cmp sl, #0 - beq _02309808 - mov r0, r8 - mov r1, r7 - mov r2, sl - bl LogMessageByIdWithPopupCheckUserTarget - b _02309808 -_023097E4: - ldrb r0, [r4, #0x15c + APPLY_DAMAGE_OFFSET] - cmp r0, #0 - bne _02309808 - cmp sl, #0 - beq _02309808 - mov r0, r8 - mov r1, r7 - mov r2, sl - bl LogMessageByIdWithPopupCheckUserTarget -_02309808: - ldr r0, [r6, #4] - cmp r0, #0xe - bne _02309820 - ldrsh r0, [r4, #0x10] - cmp r0, #1 - bgt _0230991C -_02309820: - cmp fp, #0 - bne _0230991C - mov r0, r7 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _0230991C - ldrsh r1, [r8, #4] - ldrsh r0, [r7, #4] - cmp r1, r0 - ldreqsh r1, [r8, #6] - ldreqsh r0, [r7, #6] - cmpeq r1, r0 - beq _023098EC - ldr r0, [r8] - cmp r0, #1 - bne _023098EC - ldrb r0, [r4, #7] - mov sl, #0 - cmp r0, #0 - beq _023098A0 - bl GetDamageTurnOption - cmp r0, #0 - beq _023098A0 - mov r0, r7 - bl ov29_022F9AF4 - cmp r0, #0 - bne _023098A0 - mov r0, r7 - mov r1, r8 - bl CanSeeTarget - cmp r0, #0 - movne sl, #1 -_023098A0: - ldrb r0, [r4, #0xf1] - cmp r0, #2 - beq _023098C0 - mov r0, r7 - mov r1, #1 - bl IsBlinded - cmp r0, #0 - beq _023098C4 -_023098C0: - mov sl, #0 -_023098C4: - cmp sl, #0 - beq _023098E4 - add r0, r7, #4 - add r1, r8, #4 - ldr sl, [r7, #0xb4] - bl GetDirectionTowardsPosition - and r0, r0, #7 - strb r0, [sl, #0x4c] -_023098E4: - mov r0, r7 - bl UpdateAiTargetPos -_023098EC: - ldr r0, _02309FDC ; =0x0000025F - cmp r5, r0 - beq _0230991C - ldr r1, [r7, #0xb4] - mov r0, r7 - ldrb r2, [r1, #0x4c] - mov r1, #6 - bl ChangeMonsterAnimation - mov r0, r7 - mov r1, r6 - bl ov29_022E5478 - mov sb, #1 -_0230991C: - ldrb r0, [r4, #6] - cmp r0, #0 - beq _0230995C - ldr r0, [r6] - cmp r0, #0 - ble _0230995C - ldr r0, [r8] - cmp r0, #1 - ldreq r0, [r8, #0xb4] - ldreqb r0, [r0, #6] - cmpeq r0, #0 - bne _0230995C - ldrsh r0, [r4, #2] - bl SetMonsterFlag2 - ldrsh r0, [r4, #2] - bl SetPokemonBattled -_0230995C: - ldrsh sl, [r4, #0x10] - ldr r0, [r6] - cmp sl, r0 - subgt r0, sl, r0 - movle r0, #0 - strh r0, [r4, #0x10] - ldrb r0, [r4, #0xd5] - cmp r0, #9 - bne _023099A8 - ldrsh r0, [r4, #0x10] - cmp r0, #0 - bne _02309A28 - ldr r2, _02309FE0 ; =0x00000C49 - mov r3, #1 - mov r0, r8 - mov r1, r7 - strh r3, [r4, #0x10] - bl LogMessageByIdWithPopupCheckUserTarget - b _02309A28 -_023099A8: - ldr r0, [sp, #0x10] - cmp r0, #1 - bne _023099DC - ldrsh r0, [r4, #0x10] - cmp r0, #0 - bne _02309A28 - ldr r2, _02309FE4 ; =0x00000C4A - mov r3, #1 - mov r0, r8 - mov r1, r7 - strh r3, [r4, #0x10] - bl LogMessageByIdWithPopupCheckUserTarget - b _02309A28 -_023099DC: - mov r0, r7 - mov r1, #0x22 - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _02309A28 - ldr r0, _02309FE8 ; =ov10_022C4834 - ldr r0, [r0] - bl DungeonRandOutcome__022EAB20 - cmp r0, #0 - beq _02309A28 - ldrsh r0, [r4, #0x10] - cmp r0, #0 - bne _02309A28 - ldr r2, _02309FE0 ; =0x00000C49 - mov r3, #1 - mov r0, r8 - mov r1, r7 - strh r3, [r4, #0x10] - bl LogMessageByIdWithPopupCheckUserTarget -_02309A28: - bl ov29_022E81F8 - ldrsh r0, [r4, #0x10] - subs sl, sl, r0 - movmi sl, #0 - cmp sb, #0 - cmpeq fp, #0 - beq _02309A50 - mov r0, #0xa - mov r1, #0x18 - bl ov29_022EA370 -_02309A50: -#ifndef JAPAN - mov r0, r7 - bl UpdateStatusIconFlags -#endif - ldrsh r0, [r4, #0x10] - cmp r0, #0 - beq _02309B20 - cmp sb, #0 - beq _02309A78 - mov r0, r7 - mov r1, #8 - bl ChangeMonsterAnimationToIdle -_02309A78: - ldr r0, [r6, #4] - cmp r0, #0xe - beq _02309B04 - mov r0, r7 - mov r1, #0x17 - bl ItemIsActive__0230A9DC - cmp r0, #0 - beq _02309AC4 - cmp sl, #0 - ble _02309AC4 - ldr r1, [r6] - ldr r0, _02309FA4 ; =0x0000270F - cmp r1, r0 - beq _02309AC4 - ldr r1, _02309FEC ; =ov10_022C45FC - mov r0, r8 - ldrsh r2, [r1] - mov r1, r7 - bl AddExpSpecial -_02309AC4: - mov r0, r7 - mov r1, #0x50 - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _02309B04 - cmp sl, #0 - ble _02309B04 - ldr r1, [r6] - ldr r0, _02309FA4 ; =0x0000270F - cmp r1, r0 - beq _02309B04 - ldr r1, _02309FEC ; =ov10_022C45FC - mov r0, r8 - ldrsh r2, [r1] - mov r1, r7 - bl AddExpSpecial -_02309B04: - cmp fp, #0 - beq _02309B18 - mov r0, r7 - bl ov29_0230D7D4 - bl UpdateTrapsVisibility -_02309B18: - mov r0, #0 - b _0230A918 -_02309B20: - ldr r0, _02309FDC ; =0x0000025F - cmp r5, r0 - bne _02309B5C - ldr r1, [r7, #0xb4] - mov r0, r7 - ldrb r2, [r1, #0x4c] - mov r1, #6 - bl ChangeMonsterAnimation - mov r0, r7 - mov r1, r6 - bl ov29_022E5478 - mov r0, #0xa - mov r1, #0x18 - bl ov29_022EA370 - mov sb, #1 -_02309B5C: - ldrb r0, [r4, #0xef] - cmp r0, #2 - bne _02309B78 - mov r0, r8 - mov r1, r7 - mov r2, #0 - bl EndInvisibleClassStatus -_02309B78: - cmp fp, #0 - beq _02309BA4 - mov r0, #0x14 - mov r1, #0x18 - bl ov29_022EA370 - mov r1, #2 - mov r0, r7 - strb r1, [r7, #0x22] - bl ov29_0230D7D4 - bl UpdateTrapsVisibility - b _02309BC0 -_02309BA4: - cmp sb, #0 - beq _02309BC0 - mov r2, #1 - mov r0, #0x1e - mov r1, #0x18 - strb r2, [r7, #0x22] - bl ov29_022EA370 -_02309BC0: - mov r0, r8 - mov sb, #1 - bl EntityIsValid__02308FBC - cmp r0, #0 - beq _02309BE8 - ldr r0, [r8] - cmp r0, #1 - bne _02309BE8 - cmp r8, r7 - movne sb, #0 -_02309BE8: - mov r0, #0 - mov r1, r8 - mov r2, r0 - strb r0, [r4, #0x156 + APPLY_DAMAGE_OFFSET] - bl SubstitutePlaceholderStringTags - mov r1, r7 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r0, [r6, #4] - cmp r0, #0x13 - cmpne r0, #4 - cmpne r0, #0x14 - ldrb r0, [r4, #6] - bne _02309C50 - cmp r0, #0 - beq _02309C40 - ldr r2, _02309FF0 ; =0x00000C4B - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _02309DC8 -_02309C40: - ldr r1, _02309FF0 ; =0x00000C4B - mov r0, r8 - bl LogMessageByIdWithPopup - b _02309DC8 -_02309C50: - cmp r0, #0 - beq _02309C98 - ldrb r0, [r4, #0xbc] - cmp r0, #7 - bne _02309C7C - ldr r0, _02309FF4 ; =ov29_02353220 - mov r1, sb, lsl #1 - ldrh r1, [r0, r1] - mov r0, r8 - bl LogMessageByIdWithPopup - b _02309DC8 -_02309C7C: - ldr r0, _02309FF8 ; =DEFEAT_STRING_IDS - mov r1, sb, lsl #1 - ldrh r2, [r0, r1] - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _02309DC8 -_02309C98: - ldrsh r0, [r4, #0xc] - bl GetActiveTeamMember - ldrb r1, [r4, #7] - mov r6, r0 - cmp r1, #0 - bne _02309CD4 - ldrb r0, [r4, #0x48] - bl JoinedAtRangeCheck2Veneer - cmp r0, #0 - beq _02309CEC - ldr r0, _02309FFC ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x75c] - cmp r0, #0 - bne _02309CEC -_02309CD4: - ldr r0, _0230A000 ; =ov29_02353228 - mov r1, sb, lsl #1 - ldrh r1, [r0, r1] - mov r0, r8 - bl LogMessageByIdWithPopup - b _02309DC8 -_02309CEC: - mov r0, r4 - bl IsExperienceLocked - cmp r0, #0 - beq _02309D3C - mov r0, r4 - bl IsSpecialStoryAlly - cmp r0, #0 - beq _02309D24 - ldr r0, _0230A004 ; =ov29_02353234 - mov r1, sb, lsl #1 - ldrh r1, [r0, r1] - mov r0, r8 - bl LogMessageByIdWithPopup - b _02309DC8 -_02309D24: - ldr r0, _0230A008 ; =ov29_0235322C - mov r1, sb, lsl #1 - ldrh r1, [r0, r1] - mov r0, r8 - bl LogMessageByIdWithPopup - b _02309DC8 -_02309D3C: - ldrb r0, [r4, #0xbc] - cmp r0, #7 - bne _02309D60 - ldr r0, _02309FF4 ; =ov29_02353220 - mov r1, sb, lsl #1 - ldrh r1, [r0, r1] - mov r0, r8 - bl LogMessageByIdWithPopup - b _02309DC8 -_02309D60: - ldrsh r0, [r6, #8] - bl IsMonsterIdInNormalRangeVeneer - cmp r0, #0 - beq _02309DB4 - ldr r0, _02309FFC ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x75d] - cmp r0, #0 - beq _02309D9C - ldr r0, _0230A00C ; =ov29_02353224 - mov r1, sb, lsl #1 - ldrh r1, [r0, r1] - mov r0, r8 - bl LogMessageByIdWithPopup - b _02309DC8 -_02309D9C: - ldr r0, _0230A010 ; =ov29_02353230 - mov r1, sb, lsl #1 - ldrh r1, [r0, r1] - mov r0, r8 - bl LogMessageByIdWithPopup - b _02309DC8 -_02309DB4: - ldr r0, _0230A014 ; =ov29_02353218 - mov r1, sb, lsl #1 - ldrh r1, [r0, r1] - mov r0, r8 - bl LogMessageByIdWithPopup -_02309DC8: - ldrb r0, [r4, #0xc4] - add r0, r0, #0xfd - and r0, r0, #0xff - cmp r0, #1 - bhi _02309DE4 - ldr r0, [r4, #0xb4] - bl FreeOtherWrappedMonsters -_02309DE4: - ldrb r0, [r4, #0x62] - tst r0, #1 - movne r1, #1 - moveq r1, #0 - tst r1, #0xff - beq _02309F44 - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - bne _02309F44 - ldrb r0, [r4, #0x62] - tst r0, #2 - ldreqsh r1, [r4, #0x66] - ldreq r0, _0230A018 ; =0x00000153 - cmpeq r1, r0 - bne _02309F44 - mov r0, r7 - bl ov29_022E550C - mov r0, #0 - strb r0, [r7, #0x22] - ldrsh r2, [r4, #0x12] - ldrsh r1, [r4, #0x16] - ldr r0, _02309FD4 ; =0x000003E7 - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - strh r1, [r4, #0x10] - mov r2, #0 - strb r2, [r4, #0x162 + APPLY_DAMAGE_OFFSET] - mov r0, #1 - strb r0, [r4, #0x156 + APPLY_DAMAGE_OFFSET] - add r0, r4, #0x100 - ldrh r1, [r0, #0x4a + APPLY_DAMAGE_OFFSET] - strh r1, [r0, #0x46 + APPLY_DAMAGE_OFFSET] - ldrh r1, [r0, #0x4c + APPLY_DAMAGE_OFFSET] - strh r1, [r0, #0x48 + APPLY_DAMAGE_OFFSET] - ldrb r0, [r4, #7] - cmp r0, #0 - ldrne r0, _02309FFC ; =DUNGEON_PTR - ldrne r1, [r0] - strneb r2, [r1, #0x799] - ldrne r0, [r0] - strneb r2, [r0, #0x78d] - add r0, r4, #0x62 - bl ItemZInit - ldrb r0, [r4, #0xd8] - cmp r0, #3 - bne _02309EC0 - mov r0, r8 - mov r1, r7 - mov r2, #3 - mov r3, #1 - bl EndCurseClassStatus - b _02309EDC -_02309EC0: - cmp r0, #2 - bne _02309EDC - mov r0, r8 - mov r1, r7 - mov r2, #2 - mov r3, #1 - bl EndCurseClassStatus -_02309EDC: - mov r0, r7 - bl EndLeechSeedStatusForAllTargets - mov r0, r4 - mov r1, #0 - bl SubInitMonster - bl ov10_022BDC68 - mov r0, r7 - bl RestorePpAllMovesSetFlags - mov r0, r7 - bl GetIdleAnimationId - mov r1, r0 - mov r0, r7 - bl ov29_02304830 - mov r0, r7 - bl UpdateStatusIconFlags - mov r0, #1 - mov r1, r7 - mov r2, #0 - bl SubstitutePlaceholderStringTags - mov r0, r8 - ldr r1, _0230A01C ; =0x00000C4C - bl LogMessageByIdWithPopup - mov r0, r7 - bl ov29_0230D628 - mov r0, #0 - b _0230A918 -_02309F44: - ldrb r0, [r4, #7] - cmp r0, #0 - beq _0230A224 - ldrb r0, [r4, #0x62] - tst r0, #1 - movne r1, #1 - moveq r1, #0 - tst r1, #0xff - beq _0230A224 - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - ldreqsh r1, [r4, #0x66] - ldreq r0, _0230A020 ; =0x00000159 - cmpeq r1, r0 - bne _0230A224 - mov sl, #0 - mov sb, sl - ldr r6, _02309FFC ; =DUNGEON_PTR -#endif - b _0230A090 - .align 2, 0 -#ifdef JAPAN -#define APPLY_DAMAGE_DATA_OFFSET -0x2C1 -#else -#define APPLY_DAMAGE_DATA_OFFSET 0 -#endif -_02309F98: .word SET_DAMAGE_STATUS_DAMAGE -_02309F9C: .word 0x00000C46 + APPLY_DAMAGE_DATA_OFFSET -_02309FA0: .word 0x0000024D -_02309FA4: .word 0x0000270F -#ifdef JAPAN -_0230B540: .word 0x0000097F -#else -_02309FA8: .word 0x00000C41 -#endif -_02309FAC: .word TYPE_DAMAGE_NEGATING_EXCLUSIVE_ITEM_EFFECTS -_02309FB0: .word ov10_022C45C4 -_02309FB4: .word 0x00000C42 + APPLY_DAMAGE_DATA_OFFSET -_02309FB8: .word 0x00000C43 + APPLY_DAMAGE_DATA_OFFSET -_02309FBC: .word 0x00000C44 + APPLY_DAMAGE_DATA_OFFSET -_02309FC0: .word 0x00000C45 + APPLY_DAMAGE_DATA_OFFSET -_02309FC4: .word 0x00000C47 + APPLY_DAMAGE_DATA_OFFSET -_02309FC8: .word ov29_023535D4 -_02309FCC: .word 0x000002B6 -_02309FD0: .word 0x00000C48 + APPLY_DAMAGE_DATA_OFFSET -_02309FD4: .word 0x000003E7 -_02309FD8: .word DAMAGE_STRING_IDS -_02309FDC: .word 0x0000025F -_02309FE0: .word 0x00000C49 + APPLY_DAMAGE_DATA_OFFSET -_02309FE4: .word 0x00000C4A + APPLY_DAMAGE_DATA_OFFSET -_02309FE8: .word ov10_022C4834 -_02309FEC: .word ov10_022C45FC -_02309FF0: .word 0x00000C4B + APPLY_DAMAGE_DATA_OFFSET -_02309FF4: .word ov29_02353220 -_02309FF8: .word DEFEAT_STRING_IDS -_02309FFC: .word DUNGEON_PTR -_0230A000: .word ov29_02353228 -_0230A004: .word ov29_02353234 -_0230A008: .word ov29_0235322C -_0230A00C: .word ov29_02353224 -_0230A010: .word ov29_02353230 -#ifndef EUROPE -_0230A014: .word ov29_02353218 -#endif -_0230A018: .word 0x00000153 -_0230A01C: .word 0x00000C4C + APPLY_DAMAGE_DATA_OFFSET -_0230A020: .word 0x00000159 -_0230A024: -#ifdef EUROPE - ldr r0, _02309FFC ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 - ldr r6, [r0, #0xb28] - mov r0, r6 - bl EntityIsValid__02308FBC - cmp r0, #0 - cmpne r6, sb - beq _0230AAA8 - mov r0, sb - mov r1, r6 - bl CanSeeTarget - cmp r0, #0 - beq _0230AAA8 - ldrsh r1, [r6, #4] - ldrsh r0, [sb, #4] - sub r0, r1, r0 - bl abs - cmp r0, #1 - bgt _0230AAA8 - ldrsh r1, [r6, #6] - ldrsh r0, [sb, #6] - sub r0, r1, r0 - bl abs - cmp r0, #1 - ble _0230AAB4 -_0230AAA8: - add r5, r5, #1 -_0230A090: - cmp r5, #4 - blt _0230A024 -_0230AAB4: - cmp r5, #4 - beq _0230AC40_EU - mov r0, sb - bl ov29_022E550C - mov r0, #0 - mov r1, sb - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrh r2, [r6, #4] - ldrh r1, [r6, #6] - mov r0, r6 - strh r2, [sp, #0x18] - strh r1, [sp, #0x1a] - mov r2, sb - mov r1, #0x260 - bl HandleFaint - ldrsh r1, [sp, #0x18] - ldrsh r2, [sp, #0x1a] - mov r0, sb - mov r3, #1 - bl MoveMonsterToPos - mov r0, sb - mov r1, #0 - bl UpdateEntityPixelPos - mov r0, #0 - strb r0, [sb, #0x22] - ldrsh r2, [r7, #0x12] - ldrsh r1, [r7, #0x16] - ldr r0, _02309FD4 ; =0x000003E7 - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - mov r0, sb - strh r1, [r7, #0x10] - bl ov29_022E66D8 - mov r2, #0 - strb r2, [r7, #0x162] - mov r0, #1 - strb r0, [r7, #0x156] - add r0, r7, #0x100 - ldrh r1, [r0, #0x4a] - strh r1, [r0, #0x46] - ldrh r1, [r0, #0x4c] - strh r1, [r0, #0x48] - ldrb r0, [r7, #7] - cmp r0, #0 - ldrne r0, _02309FFC ; =DUNGEON_PTR - ldrne r1, [r0] - strneb r2, [r1, #0x799] - ldrne r0, [r0] - strneb r2, [r0, #0x78d] - add r0, r7, #0x62 - bl ItemZInit - ldrb r0, [r7, #0xd8] - cmp r0, #3 - bne _0230ABAC - mov r0, sl - mov r1, sb - mov r2, #3 - mov r3, #1 - bl EndCurseClassStatus - b _0230ABC8 -_0230ABAC: - cmp r0, #2 - bne _0230ABC8 - mov r0, sl - mov r1, sb - mov r2, #2 - mov r3, #1 - bl EndCurseClassStatus -_0230ABC8: - mov r0, sb - bl EndLeechSeedStatusForAllTargets - mov r0, r7 - mov r1, #0 - bl SubInitMonster - bl ov10_022BDC68 - mov r0, sb - bl RestorePpAllMovesSetFlags - mov r0, sb - bl GetIdleAnimationId - mov r1, r0 - mov r0, sb - bl ov29_02304830 - mov r0, sb - bl UpdateStatusIconFlags - mov r0, #0 - mov r1, sb - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r6 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - mov r0, sl - ldr r1, _0230A920 ; =0x00000C4D - bl LogMessageByIdWithPopup - mov r0, sb - bl ov29_0230D628 - mov r0, #0 - b _0230A918 -_0230AC40_EU: - mov r0, sb - mov r1, #0x16 - bl IqSkillIsEnabled - cmp r0, #0 - beq _0230B04C - ldrb r0, [r7, #0x62] - mov r5, #0 - mov r6, r5 - tst r0, #1 - movne r0, #1 - moveq r0, r5 - tst r0, #0xff - beq _0230ACB8 - mov r0, sb - mov r1, #0x6f - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _0230ACB8 - ldrb r0, [r7, #0x62] - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - bne _0230ACB8 - ldrsh r0, [r7, #0x66] - cmp r0, #0x49 - addeq r5, r7, #0x62 - beq _0230ACB8 - cmp r0, #0x69 - addeq r6, r7, #0x62 -_0230ACB8: - cmp r5, #0 - ldreqb r0, [r7, #6] - cmpeq r0, #0 - bne _0230AD44 - ldr r0, _0230A924 ; =BAG_ITEMS_PTR_MIRROR - mov r2, #0 - ldr ip, [r0] - mov lr, #6 - b _0230AD3C -_0230ACDC: - mul r0, r2, lr - ldr r1, [ip, #0x384] - add r3, r1, r0 - ldrb r0, [r1, r0] - tst r0, #1 - movne r1, #1 - moveq r1, #0 - tst r1, #0xff - beq _0230AD38 - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - ldreqb r0, [r3, #1] - cmpeq r0, #0 - bne _0230AD38 - ldrsh r0, [r3, #4] - cmp r0, #0x49 - moveq r5, r3 - beq _0230AD44 - cmp r6, #0 - cmpeq r0, #0x69 - moveq r6, r3 -_0230AD38: - add r2, r2, #1 -_0230AD3C: - cmp r2, #0x32 - blt _0230ACDC -_0230AD44: - cmp r5, #0 - beq _0230AE8C - cmp fp, #0 - beq _0230AD68 - ldr r0, _0230B394 ; =0x02353E44 - mov r1, r4, lsl #1 - ldrh r1, [r0, r1] - mov r0, sl - bl LogMessageByIdWithPopup -_0230AD68: - mov r0, sb - bl ov29_022FBD24 - mov r0, sb - bl ov29_022E550C - mov r0, r5 - bl ov29_0230D688 - mov r0, #0 - strb r0, [sb, #0x22] - ldrsh r2, [r7, #0x12] - ldrsh r1, [r7, #0x16] - ldr r0, _02309FD4 ; =0x000003E7 - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - strh r1, [r7, #0x10] - mov r2, #0 - strb r2, [r7, #0x162] - mov r0, #1 - strb r0, [r7, #0x156] - add r0, r7, #0x100 - ldrh r1, [r0, #0x4a] - strh r1, [r0, #0x46] - ldrh r1, [r0, #0x4c] - strh r1, [r0, #0x48] - ldrb r0, [r7, #7] - cmp r0, #0 - ldrne r0, _02309FFC ; =DUNGEON_PTR - ldrne r1, [r0] - strneb r2, [r1, #0x799] - ldrne r0, [r0] - strneb r2, [r0, #0x78d] - ldrb r0, [r7, #0xd8] - cmp r0, #3 - bne _0230AE08 - mov r0, sl - mov r1, sb - mov r2, #3 - mov r3, #1 - bl EndCurseClassStatus - b _0230AE24 -_0230AE08: - cmp r0, #2 - bne _0230AE24 - mov r0, sl - mov r1, sb - mov r2, #2 - mov r3, #1 - bl EndCurseClassStatus -_0230AE24: - mov r0, sb - bl EndLeechSeedStatusForAllTargets - mov r0, r7 - mov r1, #0 - bl SubInitMonster - bl ov10_022BDC68 - mov r0, sb - bl RestorePpAllMovesSetFlags - mov r0, sb - bl GetIdleAnimationId - mov r1, r0 - mov r0, sb - bl ov29_02304830 - mov r0, sb - bl UpdateStatusIconFlags - mov r0, #1 - mov r1, sb - mov r2, #0 - bl SubstitutePlaceholderStringTags - mov r0, sl - ldr r1, _0230A01C ; =0x00000C4C - bl LogMessageByIdWithPopup - mov r0, sb - bl ov29_0230D628 - mov r0, #0 - b _0230A918 -_0230AE8C: - ldr r0, _02309FFC ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #8] - cmp r0, #0 - bne _0230B030 - cmp r6, #0 - beq _0230B030 - cmp fp, #0 - beq _0230AEC4 - ldr r0, _0230B394 ; =0x02353E44 - mov r1, r4, lsl #1 - ldrh r1, [r0, r1] - mov r0, sl - bl LogMessageByIdWithPopup -_0230AEC4: - bl ov29_022EAF20 - ldrb r1, [r7, #0xd8] - mov r4, r0 - cmp r1, #2 - bne _0230AEEC - ldrb r2, [r7, #0xd8] - mov r0, sb - mov r1, sb - mov r3, #0 - bl EndCurseClassStatus -_0230AEEC: - mov r0, #0 - mov r1, #0x69 - bl ov29_02344B9C - mov r0, #1 - mov r1, #0x49 - bl ov29_02344B9C - mov r0, #0 - mov r1, sb - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r0, #1 - bl ov29_022EFB20 - mov r0, sb - bl ov29_022E550C - mov r0, r6 - bl ov29_0230D688 - mov r0, #0 - strb r0, [sb, #0x22] - mov r0, #1 - strb r0, [r7, #0x23d] - mov r0, sb - bl GetIdleAnimationId - mov r1, r0 - mov r0, sb - bl ov29_02304830 - mov r0, #1 - mov r1, sb - mov r2, #0 - bl SubstitutePlaceholderStringTags - mov r0, sl - ldr r1, _0230A01C ; =0x00000C4C - bl LogMessageByIdWithPopup - mov r0, #0xa - bl WaitUntilAlertBoxPauseIsOver - mov r0, #0 - bl ov29_0234B1A4 - mov r0, #1 - bl ov29_022F0534 - ldr r0, _0230A928 ; =0x00000C6A - bl ov29_022F0780 - mov r0, sb - mov r1, #0xb - bl ov29_02304830 - ldr r0, _0230A92C ; =0x00000C6B - mov r1, sb - mov r2, #0 - bl TalkToSecretBazaarNpcStandard - mov r0, #4 - bl SetUnkMusicFlag - mov r0, sb - bl UnfreezeAnim - mov r0, sb - mov r1, #6 - bl ov29_02304830 - ldr r0, _0230A930 ; =0x00000C6C - bl ov29_022F0780 - bl ov29_022F05E4 - mov r0, #1 - bl ov29_022EFB84 - mov r0, #1 - strb r0, [sb, #0x22] - mov r0, #0 - strb r0, [r7, #0x23d] - mov r0, sl - ldr r1, _0230A934 ; =0x00000C6D - bl LogMessageByIdWithPopup - mov r0, #0xa - bl WaitUntilAlertBoxPauseIsOver - mov r0, #0 - bl ov29_022F0534 - ldr r0, _02309FFC ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x4000 - ldrsh r0, [r0, #0xd6] - bl MusicTableIdxToMusicId - bl ChangeDungeonMusic - mov r0, r4 - bl SetUnkMusicFlag - mov r0, sb - bl ov29_0230D628 - b _0230B04C -_0230B030: - cmp fp, #0 - beq _0230B04C - ldr r0, _0230B3A8 ; =0x02353E40 - mov r1, r4, lsl #1 - ldrh r1, [r0, r1] - mov r0, sl - bl LogMessageByIdWithPopup -_0230B04C: - ldrb r0, [r7, #7] - cmp r0, #0 - bne _0230B108 - ldrb r0, [r7, #0x62] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _0230B0FC - ldrb r0, [r7, #6] - cmp r0, #0 - beq _0230B0E8 - mov r0, #9 - bl IsCurrentMissionType - cmp r0, #0 - beq _0230B0B4 - mov r0, r7 - bl IsMonsterLoneOutlaw - cmp r0, #0 - beq _0230B0B4 - ldrb r0, [r7, #0x62] - tst r0, #0x40 - bicne r1, r0, #0x40 - andne r0, r1, #0xff - orrne r0, r0, #0x80 - strneb r0, [r7, #0x62] -_0230B0B4: - mov r0, sb - add r1, sb, #4 - add r2, r7, #0x62 - mov r3, #1 - bl SpawnDroppedItemWrapper - cmp r0, #0 - beq _0230B0F0 - ldrb r0, [r7, #0x62] - tst r0, #0x80 - beq _0230B0F0 - mov r0, #1 - bl ov29_0234969C - b _0230B0F0 -_0230B0E8: - add r0, r7, #0x62 - bl RemoveHolderForItemInBag -_0230B0F0: - add r0, r7, #0x62 - bl ItemZInit - b _0230B108 -_0230B0FC: - mov r0, sl - mov r1, sb - bl TrySpawnEnemyItemDrop -_0230B108: - ldrb r0, [r7, #0x100] - mov r4, #0 - cmp r0, #0 - ldrne r0, _02309FFC ; =DUNGEON_PTR - ldrne r1, _02309FD4 ; =0x000003E7 - ldrne r0, [r0] - addne r0, r0, #0x700 - strneh r1, [r0, #0x96] - ldr r0, [sl] - cmp r0, #1 - bne _0230B268 - ldrsh r0, [r7, #2] - ldrb r1, [r7, #0xa] - ldr r6, [sl, #0xb4] - bl GetExp - mov r5, r0 - mov r0, r7 - bl ov29_02303E0C - cmp r0, #0 - bne _0230B268 - ldrb r0, [r7, #0x100] - cmp r0, #0 - beq _0230B180 - add r0, r7, #0x100 - ldrsh r2, [r0, #0x68] - mov r0, #0xc - ldr r1, _0230A938 ; =ov10_022C593C - smulbb r0, r2, r0 - ldrsh r5, [r1, r0] - b _0230B1AC -_0230B180: - ldrb r0, [r7, #0x108] - cmp r0, #0 - addeq r0, r5, r5, lsr #31 - moveq r5, r0, asr #1 - beq _0230B1A4 - cmp r0, #2 - addeq r0, r5, r5, lsl #1 - addeq r0, r0, r0, lsr #31 - moveq r5, r0, asr #1 -_0230B1A4: - cmp r5, #0 - moveq r5, #1 -_0230B1AC: - ldrb r0, [r7, #0xfd] - cmp r0, #0 - movne r0, #1 - strneb r0, [r6, #0x155] - ldr r0, [sp, #0x88] - cmp r0, #1 - bne _0230B268 - ldrb r0, [r6, #6] - cmp r0, #0 - bne _0230B240 - ldrb r0, [r7, #6] - cmp r0, #0 - beq _0230B268 - mov r0, sl - mov r1, sl - mov r2, r5 - bl AddExpSpecial - ldr r6, _02309FFC ; =DUNGEON_PTR - mov r4, #0 -_0230B1F8: - ldr r0, [r6] - add r0, r0, r4, lsl #2 - add r0, r0, #0x12000 - ldr r7, [r0, #0xb28] - mov r0, r7 - bl EntityIsValid__02308FBC - cmp r0, #0 - cmpne r7, sl - beq _0230B22C - mov r0, sl - mov r1, r7 - mov r2, r5 - bl AddExpSpecial -_0230B22C: - add r4, r4, #1 - cmp r4, #4 - blt _0230B1F8 - mov r4, #1 - b _0230B268 -_0230B240: - ldr r0, _02309FFC ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x748] - bl CanEnemyEvolve - cmp r0, #0 - movne r1, #1 - ldrne r0, _02309FFC ; =DUNGEON_PTR - strneb r1, [r6, #0x153] - ldrne r0, [r0] - strneb r1, [r0, #0xf] -_0230B268: - mov r0, sl - bl EntityIsValid__02308FBC - cmp r0, #0 - beq _0230B290 - ldr r0, [sl] - cmp r0, #1 - ldreq r0, [sl, #0xb4] - ldreqb r0, [r0, #7] - cmpeq r0, #0 - moveq r4, #0 -_0230B290: - cmp r4, #0 - beq _0230B338 - add r0, sp, #0x1c - mov r1, sb - bl FillRecruitInfo - mov r0, sl - mov r1, sb - bl RecruitCheck - cmp r0, #0 - beq _0230B314 - add r2, sp, #0x1c - mov r0, sl - mov r1, sb - bl TryRecruit - cmp r0, #0 - bne _0230B304 - mov r0, sb - bl EntityIsValid__02308FBC - cmp r0, #0 - beq _0230A8F4 - mov r0, sl - mov r1, sb - mov r2, r8 - bl AftermathCheck - mov r0, sb - mov r2, sl - mov r1, #0x234 - bl HandleFaint - b _0230A8F4 -_0230B304: - ldr r0, _0230A93C ; =ov29_0237CA6C - mov r1, #1 - strb r1, [r0] - b _0230A8F4 -_0230B314: - mov r0, sl - mov r1, sb - mov r2, r8 - bl AftermathCheck - mov r0, sb - mov r1, r8 - mov r2, sl - bl HandleFaint - b _0230A8F4 -_0230B338: - mov r0, sl - mov r1, sb - mov r2, r8 - bl AftermathCheck - mov r0, sl - bl ov29_022ECD84 - mov r0, sb - mov r1, r8 - mov r2, sl -#else - ldr r0, [r6] - add r0, r0, sb, lsl #2 - add r0, r0, #0x12000 - ldr sl, [r0, #0xb28 + APPLY_DAMAGE_OFFSET_2] - mov r0, sl - bl EntityIsValid__02308FBC - cmp r0, #0 - cmpne sl, r7 - beq _0230A08C - mov r0, r7 - mov r1, sl - bl CanSeeTarget - cmp r0, #0 - beq _0230A08C - ldrsh r1, [sl, #4] - ldrsh r0, [r7, #4] - sub r0, r1, r0 - bl abs - cmp r0, #1 - bgt _0230A08C - ldrsh r1, [sl, #6] - ldrsh r0, [r7, #6] - sub r0, r1, r0 - bl abs - cmp r0, #1 - ble _0230A098 -_0230A08C: - add sb, sb, #1 -_0230A090: - cmp sb, #4 - blt _0230A024 -_0230A098: - cmp sb, #4 - beq _0230A224 - mov r0, r7 - bl ov29_022E550C - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrh r2, [sl, #4] - ldrh r1, [sl, #6] - mov r0, sl - strh r2, [sp, #0x18] - strh r1, [sp, #0x1a] - mov r2, r7 - mov r1, #0x260 - bl HandleFaint - ldrsh r1, [sp, #0x18] - ldrsh r2, [sp, #0x1a] - mov r0, r7 - mov r3, #1 - bl MoveMonsterToPos - mov r0, r7 - mov r1, #0 - bl UpdateEntityPixelPos - mov r0, #0 - strb r0, [r7, #0x22] - ldrsh r2, [r4, #0x12] - ldrsh r1, [r4, #0x16] - ldr r0, _02309FD4 ; =0x000003E7 - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - mov r0, r7 - strh r1, [r4, #0x10] - bl ov29_022E66D8 - mov r2, #0 - strb r2, [r4, #0x162 + APPLY_DAMAGE_OFFSET] - mov r0, #1 - strb r0, [r4, #0x156 + APPLY_DAMAGE_OFFSET] - add r0, r4, #0x100 - ldrh r1, [r0, #0x4a + APPLY_DAMAGE_OFFSET] - strh r1, [r0, #0x46 + APPLY_DAMAGE_OFFSET] - ldrh r1, [r0, #0x4c + APPLY_DAMAGE_OFFSET] - strh r1, [r0, #0x48 + APPLY_DAMAGE_OFFSET] - ldrb r0, [r4, #7] - cmp r0, #0 - ldrne r0, _02309FFC ; =DUNGEON_PTR - ldrne r1, [r0] - strneb r2, [r1, #0x799] - ldrne r0, [r0] - strneb r2, [r0, #0x78d] - add r0, r4, #0x62 - bl ItemZInit - ldrb r0, [r4, #0xd8] - cmp r0, #3 - bne _0230A190 - mov r0, r8 - mov r1, r7 - mov r2, #3 - mov r3, #1 - bl EndCurseClassStatus - b _0230A1AC -_0230A190: - cmp r0, #2 - bne _0230A1AC - mov r0, r8 - mov r1, r7 - mov r2, #2 - mov r3, #1 - bl EndCurseClassStatus -_0230A1AC: - mov r0, r7 - bl EndLeechSeedStatusForAllTargets - mov r0, r4 - mov r1, #0 - bl SubInitMonster - bl ov10_022BDC68 - mov r0, r7 - bl RestorePpAllMovesSetFlags - mov r0, r7 - bl GetIdleAnimationId - mov r1, r0 - mov r0, r7 - bl ov29_02304830 - mov r0, r7 - bl UpdateStatusIconFlags - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, sl - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - mov r0, r8 - ldr r1, _0230A920 ; =0x00000C4D - bl LogMessageByIdWithPopup - mov r0, r7 - bl ov29_0230D628 - mov r0, #0 - b _0230A918 -_0230A224: - mov r0, r7 - mov r1, #0x16 - bl IqSkillIsEnabled - cmp r0, #0 - beq _0230A5E0 - ldrb r0, [r4, #0x62] - mov r6, #0 - mov sb, r6 - tst r0, #1 - movne r0, #1 - moveq r0, r6 - tst r0, #0xff - beq _0230A29C - mov r0, r7 - mov r1, #0x6f - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _0230A29C - ldrb r0, [r4, #0x62] - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - bne _0230A29C - ldrsh r0, [r4, #0x66] - cmp r0, #0x49 - addeq r6, r4, #0x62 - beq _0230A29C - cmp r0, #0x69 - addeq sb, r4, #0x62 -_0230A29C: - cmp r6, #0 - ldreqb r0, [r4, #6] - cmpeq r0, #0 - bne _0230A330 - ldr r0, _0230A924 ; =BAG_ITEMS_PTR_MIRROR - mov sl, #0 - ldr ip, [r0] - mov lr, sl - mov r1, #1 - mov r0, #6 - b _0230A328 -_0230A2C8: - mul r2, sl, r0 - ldr r3, [ip, #0x384] - add fp, r3, r2 - ldrb r2, [r3, r2] - tst r2, #1 - movne r3, r1 - moveq r3, lr - tst r3, #0xff - beq _0230A324 - tst r2, #8 - movne r2, #1 - moveq r2, #0 - tst r2, #0xff - ldreqb r2, [fp, #1] - cmpeq r2, #0 - bne _0230A324 - ldrsh r2, [fp, #4] - cmp r2, #0x49 - moveq r6, fp - beq _0230A330 - cmp sb, #0 - cmpeq r2, #0x69 - moveq sb, fp -_0230A324: - add sl, sl, #1 -_0230A328: - cmp sl, #0x32 - blt _0230A2C8 -_0230A330: - cmp r6, #0 - beq _0230A45C -#ifndef JAPAN - mov r0, r7 - bl ov29_022FBD24 -#endif - mov r0, r7 - bl ov29_022E550C - mov r0, r6 - bl ov29_0230D688 - mov r0, #0 - strb r0, [r7, #0x22] - ldrsh r2, [r4, #0x12] - ldrsh r1, [r4, #0x16] - ldr r0, _02309FD4 ; =0x000003E7 - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - strh r1, [r4, #0x10] - mov r2, #0 - strb r2, [r4, #0x162 + APPLY_DAMAGE_OFFSET] - mov r0, #1 - strb r0, [r4, #0x156 + APPLY_DAMAGE_OFFSET] - add r0, r4, #0x100 - ldrh r1, [r0, #0x4a + APPLY_DAMAGE_OFFSET] - strh r1, [r0, #0x46 + APPLY_DAMAGE_OFFSET] - ldrh r1, [r0, #0x4c + APPLY_DAMAGE_OFFSET] - strh r1, [r0, #0x48 + APPLY_DAMAGE_OFFSET] - ldrb r0, [r4, #7] - cmp r0, #0 - ldrne r0, _02309FFC ; =DUNGEON_PTR - ldrne r1, [r0] - strneb r2, [r1, #0x799] - ldrne r0, [r0] - strneb r2, [r0, #0x78d] - ldrb r0, [r4, #0xd8] - cmp r0, #3 - bne _0230A3D8 - mov r0, r8 - mov r1, r7 - mov r2, #3 - mov r3, #1 - bl EndCurseClassStatus - b _0230A3F4 -_0230A3D8: - cmp r0, #2 - bne _0230A3F4 - mov r0, r8 - mov r1, r7 - mov r2, #2 - mov r3, #1 - bl EndCurseClassStatus -_0230A3F4: -#ifdef JAPAN - mov r0, r7 - bl ov29_02307DC0 -#endif - mov r0, r7 - bl EndLeechSeedStatusForAllTargets - mov r0, r4 - mov r1, #0 - bl SubInitMonster - bl ov10_022BDC68 - mov r0, r7 - bl RestorePpAllMovesSetFlags - mov r0, r7 - bl GetIdleAnimationId - mov r1, r0 - mov r0, r7 - bl ov29_02304830 - mov r0, r7 - bl UpdateStatusIconFlags - mov r0, #1 - mov r1, r7 - mov r2, #0 - bl SubstitutePlaceholderStringTags - mov r0, r8 - ldr r1, _0230A01C ; =0x00000C4C - bl LogMessageByIdWithPopup - mov r0, r7 - bl ov29_0230D628 - mov r0, #0 - b _0230A918 -_0230A45C: -#ifndef JAPAN - ldr r0, _02309FFC ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #8] - cmp r0, #0 - bne _0230A5E0 -#endif - cmp sb, #0 - beq _0230A5E0 - bl ov29_022EAF20 - ldrb r1, [r4, #0xd8] - mov r6, r0 - cmp r1, #2 - bne _0230A4A0 - ldrb r2, [r4, #0xd8] - mov r0, r7 - mov r1, r7 - mov r3, #0 - bl EndCurseClassStatus -_0230A4A0: - mov r0, #0 - mov r1, #0x69 - bl ov29_02344B9C - mov r0, #1 - mov r1, #0x49 - bl ov29_02344B9C - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r0, #1 - bl ov29_022EFB20 - mov r0, r7 - bl ov29_022E550C - mov r0, sb - bl ov29_0230D688 - mov r0, #0 - strb r0, [r7, #0x22] - mov r0, #1 - strb r0, [r4, #0x23d + APPLY_DAMAGE_OFFSET] - mov r0, r7 - bl GetIdleAnimationId - mov r1, r0 - mov r0, r7 - bl ov29_02304830 - mov r0, #1 - mov r1, r7 - mov r2, #0 - bl SubstitutePlaceholderStringTags - mov r0, r8 - ldr r1, _0230A01C ; =0x00000C4C - bl LogMessageByIdWithPopup - mov r0, #0xa - bl WaitUntilAlertBoxPauseIsOver - mov r0, #0 - bl ov29_0234B1A4 - mov r0, #1 - bl ov29_022F0534 - ldr r0, _0230A928 ; =0x00000C6A - bl ov29_022F0780 - mov r0, r7 - mov r1, #0xb - bl ov29_02304830 - ldr r0, _0230A92C ; =0x00000C6B - mov r1, r7 - mov r2, #0 - bl TalkToSecretBazaarNpcStandard - mov r0, #4 - bl SetUnkMusicFlag - mov r0, r7 - bl UnfreezeAnim - mov r0, r7 - mov r1, #6 - bl ov29_02304830 - ldr r0, _0230A930 ; =0x00000C6C - bl ov29_022F0780 - bl ov29_022F05E4 - mov r0, #1 - bl ov29_022EFB84 - mov r0, #1 - strb r0, [r7, #0x22] - mov r0, #0 - strb r0, [r4, #0x23d + APPLY_DAMAGE_OFFSET] - mov r0, r8 - ldr r1, _0230A934 ; =0x00000C6D - bl LogMessageByIdWithPopup - mov r0, #0xa - bl WaitUntilAlertBoxPauseIsOver - mov r0, #0 - bl ov29_022F0534 - ldr r0, _02309FFC ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x4000 - ldrsh r0, [r0, #0xd6 + APPLY_DAMAGE_OFFSET_2] - bl MusicTableIdxToMusicId - bl ChangeDungeonMusic - mov r0, r6 - bl SetUnkMusicFlag - mov r0, r7 - bl ov29_0230D628 -_0230A5E0: - ldrb r0, [r4, #7] - cmp r0, #0 - bne _0230A69C - ldrb r0, [r4, #0x62] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _0230A690 - ldrb r0, [r4, #6] - cmp r0, #0 - beq _0230A67C - mov r0, #9 - bl IsCurrentMissionType - cmp r0, #0 - beq _0230A648 - mov r0, r4 - bl IsMonsterLoneOutlaw - cmp r0, #0 - beq _0230A648 - ldrb r0, [r4, #0x62] - tst r0, #0x40 - bicne r1, r0, #0x40 - andne r0, r1, #0xff - orrne r0, r0, #0x80 - strneb r0, [r4, #0x62] -_0230A648: - mov r0, r7 - add r1, r7, #4 - add r2, r4, #0x62 - mov r3, #1 - bl SpawnDroppedItemWrapper - cmp r0, #0 - beq _0230A684 - ldrb r0, [r4, #0x62] - tst r0, #0x80 - beq _0230A684 - mov r0, #1 - bl ov29_0234969C - b _0230A684 -_0230A67C: - add r0, r4, #0x62 - bl RemoveHolderForItemInBag -_0230A684: - add r0, r4, #0x62 - bl ItemZInit - b _0230A69C -_0230A690: - mov r0, r8 - mov r1, r7 - bl TrySpawnEnemyItemDrop -_0230A69C: - ldrb r0, [r4, #0x100] - mov r6, #0 - cmp r0, #0 - ldrne r0, _02309FFC ; =DUNGEON_PTR - ldrne r1, _02309FD4 ; =0x000003E7 - ldrne r0, [r0] - addne r0, r0, #0x700 - strneh r1, [r0, #0x96] - ldr r0, [r8] - cmp r0, #1 - bne _0230A7FC - ldrsh r0, [r4, #2] - ldrb r1, [r4, #0xa] - ldr sl, [r8, #0xb4] - bl GetExp - mov sb, r0 - mov r0, r4 - bl ov29_02303E0C - cmp r0, #0 - bne _0230A7FC - ldrb r0, [r4, #0x100] - cmp r0, #0 - beq _0230A714 - add r0, r4, #0x100 - ldrsh r2, [r0, #0x68 + APPLY_DAMAGE_OFFSET] - mov r0, #0xc - ldr r1, _0230A938 ; =ov10_022C593C - smulbb r0, r2, r0 - ldrsh sb, [r1, r0] - b _0230A740 -_0230A714: -#ifdef JAPAN - ldrb r0, [r4, #0x107] -#else - ldrb r0, [r4, #0x108] -#endif - cmp r0, #0 - addeq r0, sb, sb, lsr #31 - moveq sb, r0, asr #1 - beq _0230A738 - cmp r0, #2 - addeq r0, sb, sb, lsl #1 - addeq r0, r0, r0, lsr #31 - moveq sb, r0, asr #1 -_0230A738: - cmp sb, #0 - moveq sb, #1 -_0230A740: - ldrb r0, [r4, #0xfd] - cmp r0, #0 - movne r0, #1 - strneb r0, [sl, #0x155 + APPLY_DAMAGE_OFFSET] - ldr r0, [sp, #0x88] - cmp r0, #1 - bne _0230A7FC - ldrb r0, [sl, #6] - cmp r0, #0 - bne _0230A7D4 - ldrb r0, [r4, #6] - cmp r0, #0 - beq _0230A7FC - mov r0, r8 - mov r1, r8 - mov r2, sb - bl AddExpSpecial - ldr r6, _02309FFC ; =DUNGEON_PTR - mov r4, #0 -_0230A78C: - ldr r0, [r6] - add r0, r0, r4, lsl #2 - add r0, r0, #0x12000 - ldr sl, [r0, #0xb28 + APPLY_DAMAGE_OFFSET_2] - mov r0, sl - bl EntityIsValid__02308FBC - cmp r0, #0 - cmpne sl, r8 - beq _0230A7C0 - mov r0, r8 - mov r1, sl - mov r2, sb - bl AddExpSpecial -_0230A7C0: - add r4, r4, #1 - cmp r4, #4 - blt _0230A78C - mov r6, #1 - b _0230A7FC -_0230A7D4: - ldr r0, _02309FFC ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x748] - bl CanEnemyEvolve - cmp r0, #0 - movne r1, #1 - ldrne r0, _02309FFC ; =DUNGEON_PTR - strneb r1, [sl, #0x153 + APPLY_DAMAGE_OFFSET] - ldrne r0, [r0] - strneb r1, [r0, #0xf] -_0230A7FC: - mov r0, r8 - bl EntityIsValid__02308FBC - cmp r0, #0 - beq _0230A824 - ldr r0, [r8] - cmp r0, #1 - ldreq r0, [r8, #0xb4] - ldreqb r0, [r0, #7] - cmpeq r0, #0 - moveq r6, #0 -_0230A824: - cmp r6, #0 - beq _0230A8CC - add r0, sp, #0x1c - mov r1, r7 - bl FillRecruitInfo - mov r0, r8 - mov r1, r7 - bl RecruitCheck - cmp r0, #0 - beq _0230A8A8 - add r2, sp, #0x1c - mov r0, r8 - mov r1, r7 - bl TryRecruit - cmp r0, #0 - bne _0230A898 - mov r0, r7 - bl EntityIsValid__02308FBC - cmp r0, #0 - beq _0230A8F4 - mov r0, r8 - mov r1, r7 - mov r2, r5 - bl AftermathCheck - mov r0, r7 - mov r2, r8 - mov r1, #0x234 - bl HandleFaint - b _0230A8F4 -_0230A898: - ldr r0, _0230A93C ; =ov29_0237CA6C - mov r1, #1 - strb r1, [r0] - b _0230A8F4 -_0230A8A8: - mov r0, r8 - mov r1, r7 - mov r2, r5 - bl AftermathCheck - mov r0, r7 - mov r1, r5 - mov r2, r8 - bl HandleFaint - b _0230A8F4 -_0230A8CC: - mov r0, r8 - mov r1, r7 - mov r2, r5 - bl AftermathCheck - mov r0, r8 - bl ov29_022ECD84 - mov r0, r7 - mov r1, r5 - mov r2, r8 -#endif - bl HandleFaint -_0230A8F4: - ldr r0, _0230A93C ; =ov29_0237CA6C - ldrb r0, [r0] - cmp r0, #0 - bne _0230A914 - ldr r0, [sp, #0x14] - cmp r0, #0 - beq _0230A914 - bl ov29_0233847C -_0230A914: - mov r0, #1 -_0230A918: - add sp, sp, #0x64 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0230A920: .word 0x00000C4D + APPLY_DAMAGE_DATA_OFFSET -_0230A924: .word BAG_ITEMS_PTR_MIRROR -#ifdef EUROPE -_0230B394: .word 0x02353E44 -#endif -_0230A928: .word 0x00000C6A + APPLY_DAMAGE_DATA_OFFSET -_0230A92C: .word 0x00000C6B + APPLY_DAMAGE_DATA_OFFSET -_0230A930: .word 0x00000C6C + APPLY_DAMAGE_DATA_OFFSET -_0230A934: .word 0x00000C6D + APPLY_DAMAGE_DATA_OFFSET -#ifdef EUROPE -_0230B3A8: .word 0x02353E40 -#endif -_0230A938: .word ov10_022C593C -_0230A93C: .word ov29_0237CA6C - arm_func_end ApplyDamage diff --git a/include/dungeon.h b/include/dungeon.h index 9a5c58f7..6d06a290 100644 --- a/include/dungeon.h +++ b/include/dungeon.h @@ -85,7 +85,7 @@ struct dungeon_generation_info { enum hidden_stairs_type hidden_floor_type; s16 tileset_id; // 0x10 // 0x12: Music table index (see the same field in struct floor_properties) - u16 music_table_idx; + s16 music_table_idx; // 0x14: Controls which trap graphics to use for the staircase. Usually 0x2B (27) and // 0x2C (28) for down and up respectively. u16 staircase_visual_idx; diff --git a/include/dungeon_mode.h b/include/dungeon_mode.h index 223e3f10..aabdd176 100644 --- a/include/dungeon_mode.h +++ b/include/dungeon_mode.h @@ -319,7 +319,7 @@ struct monster { // 0xB4: Unique number between the wrapped and wrapping target to connect them. u32 wrap_pair_unique_id; // 0xB8: Tracks the damage taken to deal when bide status ends. Max 0x3E7 (999). - u32 bide_damage_tally; + s32 bide_damage_tally; enum monster_behavior monster_behavior; // 0xBC struct sleep_class_status sleep_class_status; // 0xBD struct burn_class_status burn_class_status; // 0xBF diff --git a/include/overlay_29_022F0590.h b/include/overlay_29_022F0590.h index d597c351..6acc5a2f 100644 --- a/include/overlay_29_022F0590.h +++ b/include/overlay_29_022F0590.h @@ -9,8 +9,8 @@ bool8 EntityIsValid__022F0590(struct entity *entity); void ov29_022F05B4(struct entity* a, struct entity* b, bool8 freeze); void ov29_022F05E4(void); -s32 TalkToSecretBazaarNpcStandard(struct entity* a, struct entity* b, s32 c); -s32 ov29_022F0618(struct entity* a, struct entity* b, s32 c, s32 d); -s32 TalkToSecretBazaarNpcWithYesNoMenu(struct entity* a, struct entity* b, s32 c, s32 d); +s32 TalkToSecretBazaarNpcStandard(s32 a, struct entity* b, s32 c); +s32 ov29_022F0618(s32 a, struct entity* b, s32 c, s32 d); +s32 TalkToSecretBazaarNpcWithYesNoMenu(s32 a, struct entity* b, s32 c, s32 d); #endif //PMDSKY_OVERLAY_29_022F0590_H diff --git a/include/overlay_29_02308FBC.h b/include/overlay_29_02308FBC.h index 9a2f717d..2072310e 100644 --- a/include/overlay_29_02308FBC.h +++ b/include/overlay_29_02308FBC.h @@ -3,7 +3,24 @@ #include "dungeon_mode.h" +struct unk_02308FE0 { + s32 field_0x0; + s32 field_0x4; + s32 field_0x8; + u8 field_0xc; + u8 field_0xd; + bool8 field_0xe; + bool8 field_0xf; + bool8 field_0x10; + u8 field_0x11; + u8 field_0x12; + u8 field_0x13; +}; + // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__02308FBC(struct entity *entity); +bool8 ApplyDamage(struct entity *attacker, struct entity *defender, + struct unk_02308FE0 *damage_data, int a4, int a5, + enum damage_source_non_move damage_source, int a7); #endif //PMDSKY_OVERLAY_29_02308FBC_H diff --git a/main.lsf b/main.lsf index 4860934d..11a88e68 100644 --- a/main.lsf +++ b/main.lsf @@ -969,7 +969,6 @@ Overlay OVY_29 Object src/dungeon_ai.o Object asm/overlay_29_023085DC.o Object src/overlay_29_02308FBC.o - Object asm/overlay_29_02308FE0.o Object src/overlay_29_0230A994.o Object src/overlay_29_0230A9DC.o Object asm/overlay_29_0230AA0C.o diff --git a/src/overlay_29_022F0590.c b/src/overlay_29_022F0590.c index 57a87c03..1fa23288 100644 --- a/src/overlay_29_022F0590.c +++ b/src/overlay_29_022F0590.c @@ -13,7 +13,7 @@ extern void ov29_0234D838(void); extern void ov29_022EA370(s32 a, s32 b); -extern s32 TalkToSecretBazaarNpc(struct entity *a, struct entity *b, s32 c, s32 d, s32 e); +extern s32 TalkToSecretBazaarNpc(s32 a, struct entity *b, s32 c, s32 d, s32 e); #include "dungeon_util_static.h" bool8 EntityIsValid__022F0590(struct entity *entity) @@ -43,17 +43,17 @@ void ov29_022F05E4(void) ov29_022EA370(0x20, 0x62); } -s32 TalkToSecretBazaarNpcStandard(struct entity* a, struct entity* b, s32 c) +s32 TalkToSecretBazaarNpcStandard(s32 a, struct entity* b, s32 c) { return TalkToSecretBazaarNpc(a, b, c, 0, 0); } -s32 ov29_022F0618(struct entity* a, struct entity* b, s32 c, s32 d) +s32 ov29_022F0618(s32 a, struct entity* b, s32 c, s32 d) { return TalkToSecretBazaarNpc(a, b, c, d, 0); } -s32 TalkToSecretBazaarNpcWithYesNoMenu(struct entity* a, struct entity* b, s32 c, s32 d) +s32 TalkToSecretBazaarNpcWithYesNoMenu(s32 a, struct entity* b, s32 c, s32 d) { s32 result = TalkToSecretBazaarNpc(a, b, c, d, 1); diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index 2c06a82c..882d34fa 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -1,6 +1,134 @@ #include "overlay_29_02308FBC.h" +#include "common.h" +#include "dg_object.h" +#include "dg_random.h" +#include "dungeon_logic_6.h" +#include "dungeon_logic_7.h" +#include "dungeon_misc.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_recruitment.h" +#include "dungeon_recruitment_2.h" +#include "dungeon_statuses.h" +#include "dungeon_util_1.h" +#include "dungeon_visibility.h" +#include "joined_at_checks.h" +#include "main_0200D81C.h" +#include "main_0204D188.h" +#include "main_0204FDFC.h" +#include "options.h" +#include "overlay_29_022E272C.h" +#include "overlay_29_022E66C4.h" +#include "overlay_29_022EAE14.h" +#include "overlay_29_022EAEFC.h" +#include "overlay_29_022F0590.h" +#include "overlay_29_022F7364.h" +#include "overlay_29_0230A994.h" +#include "overlay_29_0230A9DC.h" +#include "overlay_29_0233847C.h" +#include "overlay_29_02344B9C.h" +#include "overlay_29_02349208.h" +#include "overlay_29_02349688.h" +#include "overlay_29_0234B024.h" +#include "overlay_29_0234BA54.h" +#include "position_util.h" +#include "util.h" #include "dungeon_util_static.h" +struct unk_023528A4 { + u8 field_0x0; + s32 field_0x4; +}; + +struct unk_022C593C { + s16 field_0x0; + u8 filler[10]; +}; + +extern void ActivateMotorDrive(struct entity* entity); +extern void AddExpSpecial(struct entity* attacker, struct entity* defender, s32 base_exp); +extern void AdvanceFrame(u32); +extern bool8 AftermathCheck(struct entity *attacker, struct entity *defender, s32 damage_source); +extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); +extern void ChangeMonsterAnimationToIdle(struct entity* monster, enum direction_id direction); +extern void DisplayAnimatedNumbers(s32 amount, struct entity *entity, bool8 display_sign, s32 number_color); +extern void EndCurseClassStatus(struct entity* user, struct entity* target, u8 next_curse_class_status_being_applied, bool8 log_message); +extern void EndInvisibleClassStatus(struct entity* user, struct entity* target, bool8 no_slip_message); +extern int EndLeechSeedStatusForAllTargets(); +extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity* user, struct entity* target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); +extern void FillRecruitInfo(void *recruit_info, struct entity *monster); +extern void FreeOtherWrappedMonsters(u32 unique_id); +extern struct team_member* GetActiveTeamMember(s32 roster_idx); +extern s32 GetExp(enum monster_id monster_id, s32 level); +extern s32 GetIdleAnimationId(struct entity *entity); +extern void HandleFaint(struct entity *fainted_entity, s32 damage_source, struct entity *killer); +extern bool8 IsMonsterIdInNormalRangeVeneer(enum monster_id monster_id); +extern void LogMessageByIdWithPopup(struct entity* user, s32 message_id); +extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); +extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); +extern void MoveMonsterToPos(struct entity* entity, s32 x_pos, s32 y_pos, bool8 reset_prev_pos_fields); +extern enum music_id MusicTableIdxToMusicId(s32 music_table_idx); +extern s32 PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, s32 c, s32 d, s32 e, s32 f); +extern int PlayMissSfx__022E611C(); +extern int PlayMissSfx__022E6150(); +extern void RemoveHolderForItemInBag(struct item* item); +extern void RestorePpAllMovesSetFlags(struct entity* entity); +extern void RestoreRandomMovePP(struct entity* user, struct entity* target, s32 pp, bool8 log_message); +extern bool8 SpawnDroppedItemWrapper(struct entity *entity, struct position *pos, struct item *item, u32 param_4); +extern void SubInitMonster(struct monster* monster, bool8 flag); +extern void SubstitutePlaceholderStringTags(s32 slot, struct entity *entity, u32 param_3); +extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); +extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); +extern bool8 TryRecruit(struct entity *user, struct entity *recruit, void *recruit_info); +extern void TrySpawnEnemyItemDrop(struct entity* attacker, struct entity* defender); +extern void UnfreezeAnim(struct entity *e); +extern void UpdateShopkeeperModeAfterAttack(struct entity* attacker, struct entity* defender); +extern void UpdateStatusIconFlags(struct entity *); +extern void UpdateTrapsVisibility(void); +extern s32 abs(s32 n); +extern int ov10_022BDC68(); +extern int TerminateEffectWrapper(); +extern int ov10_022BF964(); +extern int ov29_022E5478(); +extern int ov29_022E550C(); +extern void ov29_022E81F8(void); +extern void ov29_022EA370(s32 a, s32 b); +extern int ov29_022ECD84(); +extern int ov29_022EFB20(); +extern int ov29_022EFB84(); +extern int ov29_022F0534(); +extern int ov29_022F0780(); +extern int ov29_022F9AF4(); +extern int ov29_022FB98C(); +extern int ov29_022FBD24(); +extern int ov29_02303E0C(); +extern int ov29_02304830(); +extern int ov29_02307C48(); +extern int ov29_0230D628(); +extern int ov29_0230D688(); +extern int ov29_0230D7D4(); +extern int ov29_0234B1A4(); + +extern struct unk_023528A4 TYPE_DAMAGE_NEGATING_EXCLUSIVE_ITEM_EFFECTS[]; +extern s16 SET_DAMAGE_STATUS_DAMAGE; +extern s16 ov10_022C45C4; +extern s32 ov10_022C4834; +extern s16 ov10_022C45FC; +extern struct unk_022C593C ov10_022C593C[]; +extern s16 ov29_023535D4; +extern u16 DAMAGE_STRING_IDS[]; +extern u16 DEFEAT_STRING_IDS[]; +extern u16 ov29_02353218[]; +extern u16 ov29_02353220[]; +extern u16 ov29_02353224[]; +extern u16 ov29_02353228[]; +extern u16 ov29_0235322C[]; +extern u16 ov29_02353230[]; +extern u16 ov29_02353234[]; +extern bool8 ov29_0237CA6C; +extern struct dungeon *DUNGEON_PTR; +extern struct bag_items *BAG_ITEMS_PTR_MIRROR; + bool8 EntityIsValid__02308FBC(struct entity *entity) { if (entity == NULL) @@ -8,3 +136,744 @@ bool8 EntityIsValid__02308FBC(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +bool8 ApplyDamage(struct entity *attacker, struct entity *defender, + struct unk_02308FE0 *damage_data, int a4, int a5, + enum damage_source_non_move damage_source, int a7) +{ + bool8 played_hurt_anim; + struct unk_023528A4 *neg; + struct tile *tile; + struct team_member *member; + struct item *reviver_seed; + struct item *revival_item; + bool8 proceed; + bool8 is_wild_enemy; + bool8 face_attacker; + bool8 gained_exp; + s32 defeat_idx; + s32 hp_lost; + struct monster *dmon; + s32 hp; + s32 exp; + struct monster *amon; + u8 music; + s32 i; + struct entity *other; + s32 j; + struct item *bag_item; + struct item *held_item; + s16 anim; + u16 message_id; + struct position revive_pos; + u8 recruit_info[0x48]; + + damage_data->field_0x10 = FALSE; + played_hurt_anim = FALSE; + tile = NULL; + is_wild_enemy = FALSE; + + if (defender->type != 1 + || IsSecretBazaarNpcBehavior( + ((struct monster *)defender->info)->monster_behavior)) { + damage_data->field_0x10 = TRUE; + return FALSE; + } + + dmon = defender->info; + if (dmon->is_not_team_member && !dmon->is_ally) { + is_wild_enemy = TRUE; + } + + TryEndPetrifiedOrSleepStatus(attacker, defender); + UpdateShopkeeperModeAfterAttack(attacker, defender); + + if (attacker->type == 1 + && ((struct monster *)attacker->info)->sure_shot_class_status.sure_shot == 3 + && !damage_data->field_0xf) { + damage_data->field_0x0 = SET_DAMAGE_STATUS_DAMAGE; + } + + if (attacker->type == 1) { + if (DefenderAbilityIsActive__0230A940(attacker, defender, + ABILITY_MAGIC_GUARD, TRUE) + && damage_data->field_0x4 != 4 + && damage_data->field_0x4 != 0xE + && damage_data->field_0x4 != 0 + && damage_data->field_0x4 != 0x17) { + SubstitutePlaceholderStringTags(1, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC46); + if (ShouldDisplayEntityWrapper(attacker) + && ShouldDisplayEntityWrapper(defender)) { + PlayMissSfx__022E611C(attacker, defender); + } + damage_data->field_0x10 = TRUE; + return FALSE; + } + } else if (attacker->type == 6) { + if (AbilityIsActiveVeneer(defender, ABILITY_MAGIC_GUARD) + && damage_data->field_0x4 != 4 + && damage_data->field_0x4 != 0xE + && damage_data->field_0x4 != 0x17) { + SubstitutePlaceholderStringTags(1, defender, 0); + LogMessageByIdWithPopupCheckUser(defender, 0xC46); + if (ShouldDisplayEntityWrapper(defender)) { + PlayMissSfx__022E6150(defender); + } + damage_data->field_0x10 = TRUE; + return FALSE; + } + } + + if (damage_source != 0x24D && attacker->type == 1 + && DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STURDY, + TRUE) + && damage_data->field_0x0 == 0x270F) { + SubstitutePlaceholderStringTags(1, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC40); + PlayMissSfx__022E611C(attacker, defender); + damage_data->field_0x10 = TRUE; + return FALSE; + } + + if (dmon->frozen_class_status.freeze == 1) { + if (damage_source != 0x250) { + SubstitutePlaceholderStringTags(1, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC41); + PlayMissSfx__022E611C(attacker, defender); + } + damage_data->field_0x10 = TRUE; + return FALSE; + } + + if ((dmon->sleep_class_status.sleep == 1 || dmon->sleep_class_status.sleep == 5 + || dmon->sleep_class_status.sleep == 3) + && dmon->sleep_class_status.sleep_turns == 0x7F) { + ov29_02307C48(defender); + } + + if (attacker->type == 1) { + if (DefenderAbilityIsActive__0230A940(attacker, defender, + ABILITY_VOLT_ABSORB, TRUE) + && damage_data->field_0xc == 5) { + TryIncreaseHp(attacker, defender, damage_data->field_0x0, 0, 0); + damage_data->field_0x10 = TRUE; + return FALSE; + } + if (DefenderAbilityIsActive__0230A940(attacker, defender, + ABILITY_WATER_ABSORB, TRUE) + && damage_data->field_0xc == 3) { + TryIncreaseHp(attacker, defender, damage_data->field_0x0, 0, 0); + damage_data->field_0x10 = TRUE; + return FALSE; + } + if (DefenderAbilityIsActive__0230A940(attacker, defender, + ABILITY_DRY_SKIN, TRUE) + && damage_data->field_0xc == 3) { + TryIncreaseHp(attacker, defender, damage_data->field_0x0, 0, 0); + damage_data->field_0x10 = TRUE; + return FALSE; + } + if (DefenderAbilityIsActive__0230A940(attacker, defender, + ABILITY_MOTOR_DRIVE, TRUE) + && damage_data->field_0xc == 5) { + ActivateMotorDrive(defender); + damage_data->field_0x10 = TRUE; + return FALSE; + } + } + + neg = TYPE_DAMAGE_NEGATING_EXCLUSIVE_ITEM_EFFECTS; + while (neg->field_0x0 != 0x12) { + if (neg->field_0x0 == damage_data->field_0xc + && ExclusiveItemEffectIsActiveWithLogging(attacker, defender, 0, 0, + (enum exclusive_item_effect_id)(neg->field_0x4 & 0xFF))) { + if (neg->field_0x4 > 0x71) { + TryIncreaseHp(attacker, defender, damage_data->field_0x0, 0, 1); + } else { + damage_data->field_0x10 = TRUE; + } + proceed = FALSE; + goto negation_checked; + } + neg++; + } + proceed = TRUE; +negation_checked: + + if (!proceed) { + if (damage_data->field_0x10) { + if (attacker->type == 1) { + if (ShouldDisplayEntityWrapper(attacker) + && ShouldDisplayEntityWrapper(defender)) { + ov29_022FB98C(attacker, defender); + } + } else if (ShouldDisplayEntityWrapper(defender)) { + ov29_022FB98C(attacker, defender); + } + } + damage_data->field_0x10 = TRUE; + return FALSE; + } + + if (damage_data->field_0x0 > 0 + && ExclusiveItemEffectIsActive__0230A9B8(defender, + EXCLUSIVE_EFF_MAY_RESTORE_PP_FROM_DAMAGE) + && DungeonRandOutcome__022EAB20(ov10_022C45C4)) { + RestoreRandomMovePP(defender, defender, 1, 0); + } + + if (!dmon->apply_flash_fire_boost) { + if (damage_data->field_0xe) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC42); + } + switch (damage_data->field_0x8) { + case 0: + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC43); + break; + case 1: + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC44); + break; + case 3: + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC45); + break; + } + } + + SubstitutePlaceholderStringTags(0, attacker, 0); + SubstitutePlaceholderStringTags(1, defender, 0); + + if (damage_data->field_0x0 == 0) { + if (ShouldDisplayEntityWrapper(attacker) + && ShouldDisplayEntityWrapper(defender)) { + if (!dmon->apply_flash_fire_boost) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC47); + } + PlayMissSfx__022E611C(attacker, defender); + } else { + if (!dmon->apply_flash_fire_boost) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC47); + } + ov29_022EA370(0x1E, 0x18); + } + damage_data->field_0x10 = TRUE; + return FALSE; + } + + if (damage_data->field_0x0 == 0x270F) { + if (a7 && ShouldDisplayEntityWrapper(defender)) { + tile = GetTileAtEntity(defender); + anim = PlayEffectAnimationEntity(defender, 0x2B5, 0, 3, 0, 1, 0, 0); + ov29_023535D4 = -1; + if (anim != -1) { + while (ov10_022BF964(anim)) { + AdvanceFrame(0x18); + } + TerminateEffectWrapper(anim); + ov29_023535D4 = + PlayEffectAnimationEntity(defender, 0x2B6, 0, 3, 0, 1, 0, 0); + } + } + if (!dmon->apply_flash_fire_boost) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC48); + } + dmon->bide_damage_tally = 0x3E7; + } else { + SetMessageLogPreprocessorArgsNumberVal(0, damage_data->field_0x0); + + if (damage_data->field_0x4 >= 0x1B) { + message_id = 0; + } else { + message_id = DAMAGE_STRING_IDS[damage_data->field_0x4]; + } + + dmon->bide_damage_tally += damage_data->field_0x0; + if (dmon->bide_damage_tally > 0x3E7) { + dmon->bide_damage_tally = 0x3E7; + } + + if (ShouldDisplayEntityWrapper(defender)) { + if (damage_data->field_0x4 != 0xE + && damage_data->field_0x4 != 0x17 + && damage_source != 0x25F) { + DisplayAnimatedNumbers(-damage_data->field_0x0, defender, TRUE, + -1); + } + if (!dmon->apply_flash_fire_boost && message_id != 0) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, + message_id); + } + } else if (!dmon->apply_flash_fire_boost && message_id != 0) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, message_id); + } + } + + if ((damage_data->field_0x4 != 0xE || dmon->hp <= 1) && tile == NULL + && ShouldDisplayEntityWrapper(defender)) { + if ((attacker->pos.x != defender->pos.x + || attacker->pos.y != defender->pos.y) + && attacker->type == 1) { + face_attacker = FALSE; + if (dmon->is_team_leader && GetDamageTurnOption() + && !ov29_022F9AF4(defender) + && CanSeeTarget(defender, attacker)) { + face_attacker = TRUE; + } + if (dmon->blinker_class_status.blinded == 2 + || IsBlinded(defender, TRUE)) { + face_attacker = FALSE; + } + if (face_attacker) { + struct monster *target_mon = defender->info; + + target_mon->action.direction = + GetDirectionTowardsPosition(&defender->pos, &attacker->pos) & 7; + } + UpdateAiTargetPos(defender); + } + if (damage_source != 0x25F) { + ChangeMonsterAnimation(defender, 6, + ((struct monster *)defender->info)->action.direction); + ov29_022E5478(defender, damage_data); + played_hurt_anim = TRUE; + } + } + + if (dmon->is_not_team_member && damage_data->field_0x0 > 0 + && attacker->type == 1 + && !((struct monster *)attacker->info)->is_not_team_member) { + SetMonsterFlag2(dmon->id); + SetPokemonBattled(dmon->id); + } + + hp_lost = dmon->hp; + if (hp_lost > damage_data->field_0x0) { + dmon->hp = hp_lost - damage_data->field_0x0; + } else { + dmon->hp = 0; + } + + if (dmon->reflect_class_status.reflect == 9) { + if (dmon->hp == 0) { + dmon->hp = 1; + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC49); + } + } else if (a4 == 1) { + if (dmon->hp == 0) { + dmon->hp = 1; + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC4A); + } + } else if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_MAY_ENDURE) + && DungeonRandOutcome__022EAB20(ov10_022C4834) + && dmon->hp == 0) { + dmon->hp = 1; + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC49); + } + + ov29_022E81F8(); + + hp_lost -= dmon->hp; + if (hp_lost < 0) { + hp_lost = 0; + } + + if (played_hurt_anim || tile != NULL) { + ov29_022EA370(0xA, 0x18); + } + + UpdateStatusIconFlags(defender); + + if (dmon->hp != 0) { + if (played_hurt_anim) { + ChangeMonsterAnimationToIdle(defender, DIR_CURRENT); + } + if (damage_data->field_0x4 != 0xE) { + if (ItemIsActive__0230A9DC(defender, ITEM_JOY_RIBBON) && hp_lost > 0 + && damage_data->field_0x0 != 0x270F) { + AddExpSpecial(attacker, defender, ov10_022C45FC); + } + if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_EXP_FROM_DAMAGE) + && hp_lost > 0 && damage_data->field_0x0 != 0x270F) { + AddExpSpecial(attacker, defender, ov10_022C45FC); + } + } + if (tile != NULL) { + ov29_0230D7D4(defender); + UpdateTrapsVisibility(); + } + return FALSE; + } + + if (damage_source == 0x25F) { + ChangeMonsterAnimation(defender, 6, + ((struct monster *)defender->info)->action.direction); + ov29_022E5478(defender, damage_data); + ov29_022EA370(0xA, 0x18); + played_hurt_anim = TRUE; + } + + if (dmon->invisible_class_status.status == 2) { + EndInvisibleClassStatus(attacker, defender, 0); + } + + if (tile != NULL) { + ov29_022EA370(0x14, 0x18); + defender->transparent = 2; + ov29_0230D7D4(defender); + UpdateTrapsVisibility(); + } else if (played_hurt_anim) { + defender->transparent = 1; + ov29_022EA370(0x1E, 0x18); + } + + defeat_idx = 1; + if (EntityIsValid__02308FBC(attacker) && attacker->type == 1 + && attacker != defender) { + defeat_idx = 0; + } + + dmon->field_0x156 = 0; + SubstitutePlaceholderStringTags(0, attacker, 0); + SubstitutePlaceholderStringTags(1, defender, 0); + + if (damage_data->field_0x4 == 0x13 || damage_data->field_0x4 == 4 + || damage_data->field_0x4 == 0x14) { + if (dmon->is_not_team_member) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC4B); + } else { + LogMessageByIdWithPopup(attacker, 0xC4B); + } + } else if (dmon->is_not_team_member) { + if (dmon->monster_behavior == 7) { + LogMessageByIdWithPopup(attacker, ov29_02353220[defeat_idx]); + } else { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, + DEFEAT_STRING_IDS[defeat_idx]); + } + } else { + member = GetActiveTeamMember(dmon->team_index); + if (dmon->is_team_leader + || (JoinedAtRangeCheck2Veneer(dmon->joined_at) + && !DUNGEON_PTR->nonstory_flag)) { + LogMessageByIdWithPopup(attacker, ov29_02353228[defeat_idx]); + } else if (IsExperienceLocked(dmon)) { + if (IsSpecialStoryAlly(dmon)) { + LogMessageByIdWithPopup(attacker, ov29_02353234[defeat_idx]); + } else { + LogMessageByIdWithPopup(attacker, ov29_0235322C[defeat_idx]); + } + } else if (dmon->monster_behavior == 7) { + LogMessageByIdWithPopup(attacker, ov29_02353220[defeat_idx]); + } else if (IsMonsterIdInNormalRangeVeneer((enum monster_id)member->member_index)) { + if (DUNGEON_PTR->send_home_disabled) { + LogMessageByIdWithPopup(attacker, ov29_02353224[defeat_idx]); + } else { + LogMessageByIdWithPopup(attacker, ov29_02353230[defeat_idx]); + } + } else { + LogMessageByIdWithPopup(attacker, ov29_02353218[defeat_idx]); + } + } + + if (dmon->frozen_class_status.freeze == 3 + || dmon->frozen_class_status.freeze == 4) { + FreeOtherWrappedMonsters(dmon->wrap_pair_unique_id); + } + + held_item = &dmon->held_item; + if (GetFlag(held_item->flags, 1) && !GetFlag(held_item->flags, 8) + && !(dmon->held_item.flags & 2) + && held_item->id == 0x153) { + ov29_022E550C(defender); + defender->transparent = 0; + hp = dmon->max_hp_stat + dmon->max_hp_boost; + if (hp > 0x3E7) { + hp = 0x3E7; + } + dmon->hp = hp; + dmon->field_0x162 = 0; + dmon->field_0x156 = TRUE; + dmon->belly = dmon->max_belly; + if (dmon->is_team_leader) { + DUNGEON_PTR->leader_hunger_message_tracker = 0; + DUNGEON_PTR->identify_orb_flag = 0; + } + ItemZInit(&dmon->held_item); + if (dmon->curse_class_status.curse == 3) { + EndCurseClassStatus(attacker, defender, 3, 1); + } else if (dmon->curse_class_status.curse == 2) { + EndCurseClassStatus(attacker, defender, 2, 1); + } + EndLeechSeedStatusForAllTargets(defender); + SubInitMonster(dmon, 0); + ov10_022BDC68(); + RestorePpAllMovesSetFlags(defender); + ov29_02304830(defender, GetIdleAnimationId(defender)); + UpdateStatusIconFlags(defender); + SubstitutePlaceholderStringTags(1, defender, 0); + LogMessageByIdWithPopup(attacker, 0xC4C); + ov29_0230D628(defender); + return FALSE; + } + + if (dmon->is_team_leader + && GetFlag(dmon->held_item.flags, 1) + && !GetFlag(dmon->held_item.flags, 8) + && dmon->held_item.id == 0x159) { + other = NULL; + for (i = 0; i < 4; i++) { + other = DUNGEON_PTR->monster_slot_ptrs[i]; + if (EntityIsValid__02308FBC(other) && other != defender + && CanSeeTarget(defender, other) + && abs(other->pos.x - defender->pos.x) <= 1 + && abs(other->pos.y - defender->pos.y) <= 1) { + break; + } + } + if (i != 4) { + ov29_022E550C(defender); + SubstitutePlaceholderStringTags(0, defender, 0); + revive_pos = other->pos; + HandleFaint(other, DAMAGE_SOURCE_POSSESS, defender); + MoveMonsterToPos(defender, revive_pos.x, revive_pos.y, 1); + UpdateEntityPixelPos(defender, 0); + defender->transparent = 0; + hp = dmon->max_hp_stat + dmon->max_hp_boost; + if (hp > 0x3E7) { + hp = 0x3E7; + } + dmon->hp = hp; + ov29_022E66D8(defender); + dmon->field_0x162 = 0; + dmon->field_0x156 = TRUE; + dmon->belly = dmon->max_belly; + if (dmon->is_team_leader) { + DUNGEON_PTR->leader_hunger_message_tracker = 0; + DUNGEON_PTR->identify_orb_flag = 0; + } + ItemZInit(&dmon->held_item); + if (dmon->curse_class_status.curse == 3) { + EndCurseClassStatus(attacker, defender, 3, 1); + } else if (dmon->curse_class_status.curse == 2) { + EndCurseClassStatus(attacker, defender, 2, 1); + } + EndLeechSeedStatusForAllTargets(defender); + SubInitMonster(dmon, 0); + ov10_022BDC68(); + RestorePpAllMovesSetFlags(defender); + ov29_02304830(defender, GetIdleAnimationId(defender)); + UpdateStatusIconFlags(defender); + SubstitutePlaceholderStringTags(0, defender, 0); + SubstitutePlaceholderStringTags(1, other, 0); + LogMessageByIdWithPopup(attacker, 0xC4D); + ov29_0230D628(defender); + return FALSE; + } + } + + if (IqSkillIsEnabled(defender, IQ_ITEM_MASTER)) { + reviver_seed = NULL; + revival_item = NULL; + if (GetFlag(dmon->held_item.flags, 1) + && !AbilityIsActiveVeneer(defender, ABILITY_KLUTZ) + && !GetFlag(dmon->held_item.flags, 8)) { + if (dmon->held_item.id == 0x49) { + reviver_seed = &dmon->held_item; + } else if (dmon->held_item.id == 0x69) { + revival_item = &dmon->held_item; + } + } + + if (reviver_seed == NULL && !dmon->is_not_team_member) { + for (j = 0; j < 0x32; j++) { + bag_item = &BAG_ITEMS_PTR_MIRROR->bag_items->bag_items[j]; + if (GetFlag(bag_item->flags, 1) && !GetFlag(bag_item->flags, 8) + && bag_item->held_by == 0) { + if (bag_item->id == 0x49) { + reviver_seed = bag_item; + break; + } + if (revival_item == NULL && bag_item->id == 0x69) { + revival_item = bag_item; + } + } + } + } + + if (reviver_seed != NULL) { + ov29_022FBD24(defender); + ov29_022E550C(defender); + ov29_0230D688(reviver_seed); + defender->transparent = 0; + hp = dmon->max_hp_stat + dmon->max_hp_boost; + if (hp > 0x3E7) { + hp = 0x3E7; + } + dmon->hp = hp; + dmon->field_0x162 = 0; + dmon->field_0x156 = TRUE; + dmon->belly = dmon->max_belly; + if (dmon->is_team_leader) { + DUNGEON_PTR->leader_hunger_message_tracker = 0; + DUNGEON_PTR->identify_orb_flag = 0; + } + if (dmon->curse_class_status.curse == 3) { + EndCurseClassStatus(attacker, defender, 3, 1); + } else if (dmon->curse_class_status.curse == 2) { + EndCurseClassStatus(attacker, defender, 2, 1); + } + EndLeechSeedStatusForAllTargets(defender); + SubInitMonster(dmon, 0); + ov10_022BDC68(); + RestorePpAllMovesSetFlags(defender); + ov29_02304830(defender, GetIdleAnimationId(defender)); + UpdateStatusIconFlags(defender); + SubstitutePlaceholderStringTags(1, defender, 0); + LogMessageByIdWithPopup(attacker, 0xC4C); + ov29_0230D628(defender); + return FALSE; + } + + if (!DUNGEON_PTR->end_floor_no_death_check_flag + && revival_item != NULL) { + music = ov29_022EAF20(); + if (dmon->curse_class_status.curse == 2) { + EndCurseClassStatus(defender, defender, + *(volatile u8 *)&dmon->curse_class_status.curse, + 0); + } + ov29_02344B9C(0, 0x69); + ov29_02344B9C(1, 0x49); + SubstitutePlaceholderStringTags(0, defender, 0); + ov29_022EFB20(1); + ov29_022E550C(defender); + ov29_0230D688(revival_item); + defender->transparent = 0; + dmon->unk_revive_visual_tracker = TRUE; + ov29_02304830(defender, GetIdleAnimationId(defender)); + SubstitutePlaceholderStringTags(1, defender, 0); + LogMessageByIdWithPopup(attacker, 0xC4C); + WaitUntilAlertBoxPauseIsOver(0xA); + ov29_0234B1A4(0); + ov29_022F0534(1); + ov29_022F0780(0xC6A); + ov29_02304830(defender, 0xB); + TalkToSecretBazaarNpcStandard(0xC6B, defender, 0); + SetUnkMusicFlag(4); + UnfreezeAnim(defender); + ov29_02304830(defender, 6); + ov29_022F0780(0xC6C); + ov29_022F05E4(); + ov29_022EFB84(1); + defender->transparent = 1; + dmon->unk_revive_visual_tracker = FALSE; + LogMessageByIdWithPopup(attacker, 0xC6D); + WaitUntilAlertBoxPauseIsOver(0xA); + ov29_022F0534(0); + ChangeDungeonMusic(MusicTableIdxToMusicId( + DUNGEON_PTR->gen_info.music_table_idx)); + SetUnkMusicFlag(music); + ov29_0230D628(defender); + } + } + + if (!dmon->is_team_leader) { + if (GetFlag(dmon->held_item.flags, 1)) { + if (dmon->is_not_team_member) { + if (IsCurrentMissionType(MISSION_TAKE_ITEM_FROM_OUTLAW) && IsMonsterLoneOutlaw(dmon) + && (dmon->held_item.flags & 0x40)) { + dmon->held_item.flags &= ~0x40; + dmon->held_item.flags |= 0x80; + } + if (SpawnDroppedItemWrapper(defender, &defender->pos, + &dmon->held_item, 1) + && (dmon->held_item.flags & 0x80)) { + ov29_0234969C(1); + } + } else { + RemoveHolderForItemInBag(&dmon->held_item); + } + ItemZInit(&dmon->held_item); + } else { + TrySpawnEnemyItemDrop(attacker, defender); + } + } + + gained_exp = FALSE; + if (dmon->boss_flag) { + DUNGEON_PTR->field_0x796 = 0x3E7; + } + + if (attacker->type == 1) { + amon = attacker->info; + exp = GetExp((enum monster_id)dmon->id, dmon->level); + if (!ov29_02303E0C(dmon)) { + if (dmon->boss_flag) { + exp = ov10_022C593C[dmon->field_0x168].field_0x0; + } else { + if (dmon->exp_yield == 0) { + exp = exp / 2; + } else if (dmon->exp_yield == 2) { + exp = (exp * 3) / 2; + } + if (exp == 0) { + exp = 1; + } + } + if (dmon->grudge) { + amon->hit_grudge_monster = TRUE; + } + if (a5 == 1) { + if (!amon->is_not_team_member) { + if (dmon->is_not_team_member) { + AddExpSpecial(attacker, attacker, exp); + for (i = 0; i < 4; i++) { + other = DUNGEON_PTR->monster_slot_ptrs[i]; + if (EntityIsValid__02308FBC(other) + && other != attacker) { + AddExpSpecial(attacker, other, exp); + } + } + gained_exp = TRUE; + } + } else if (CanEnemyEvolve(DUNGEON_PTR->id)) { + amon->should_evolve = TRUE; + DUNGEON_PTR->should_enemy_evolve = TRUE; + } + } + } + } + + if (EntityIsValid__02308FBC(attacker) && attacker->type == 1 + && !((struct monster *)attacker->info)->is_team_leader) { + gained_exp = FALSE; + } + + if (gained_exp) { + FillRecruitInfo(recruit_info, defender); + if (RecruitCheck(attacker, defender)) { + if (!TryRecruit(attacker, defender, recruit_info)) { + if (EntityIsValid__02308FBC(defender)) { + AftermathCheck(attacker, defender, damage_source); + HandleFaint(defender, DAMAGE_SOURCE_NOT_BEFRIENDED, + attacker); + } + } else { + ov29_0237CA6C = TRUE; + } + } else { + AftermathCheck(attacker, defender, damage_source); + HandleFaint(defender, damage_source, attacker); + } + } else { + AftermathCheck(attacker, defender, damage_source); + ov29_022ECD84(attacker); + HandleFaint(defender, damage_source, attacker); + } + + if (!ov29_0237CA6C && is_wild_enemy) { + ov29_0233847C(); + } + + return TRUE; +} From e0f7191722d61e83678c82009d6d53830b4b299d Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 23 Aug 2026 02:29:37 -0700 Subject: [PATCH 03/34] ApplyDamage: match the EU and JP builds Follow-up to ff65ac0e, which decompiled the US branch only. One source now matches all three regions: build/pmdsky.us/pmdsky.us.nds: OK build/pmdsky.eu/pmdsky.eu.nds: OK build/pmdsky.jp/pmdsky.jp.nds: OK JAPAN, five source differences: - DefenderAbilityIsActive__0230A940 takes three arguments, not four, at six call sites. include/overlay_29_0230A994.h already declares this, so the JP build failed to compile rather than to match. - every message id is US - 0x2C1. Kept as region-conditional #defines at file scope, following src/dungeon_ai.c. - no UpdateStatusIconFlags call before the HP check. - no end_floor_no_death_check_flag guard on the revival-item path. - in the reviver-seed block, no ov29_022FBD24; instead ov29_02307DC0 after the curse handling. EUROPE, one behavioural difference: the last arm of the defeat-message ladder records a flag instead of logging, and the message is emitted later at three points - the reviver-seed path, the revival-item path, and their else. The two revival paths log from a different table. That table is four bytes that exist only in the EUROPE branch of asm/overlay_29_rodata_02352A6C.s, immediately after ov29_02353218 and carrying no symbol; the extractor could only render both as raw addresses (0x02353E44 and 0x02353E40). This commit labels it. The label and .global add no bytes, and the EU checksum is what confirms both references resolve where intended - had either been wrong, pmdsky.eu.nds would not match. The name ov29_02353E44 is keyed to the symbol's EUROPE address, which breaks the file's convention of naming by US address. There is no US address to use: the data does not exist in that build. One change was needed for the EU register allocation and is byte-neutral for the other two builds: `dmon` is now assigned after the wild-enemy test rather than before it, with that test reading through defender->info. Introducing the variable later flips which web the allocator colours first and unwinds a whole-function rotation of three callee-saved registers. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds of all three regions. Co-Authored-By: Claude Opus 5 --- asm/overlay_29_rodata_02352A6C.s | 2 + src/overlay_29_02308FBC.c | 164 ++++++++++++++++++++++++++----- 2 files changed, 140 insertions(+), 26 deletions(-) diff --git a/asm/overlay_29_rodata_02352A6C.s b/asm/overlay_29_rodata_02352A6C.s index 8cf1fa65..1d179fcf 100644 --- a/asm/overlay_29_rodata_02352A6C.s +++ b/asm/overlay_29_rodata_02352A6C.s @@ -320,6 +320,8 @@ ov29_02353228: .global ov29_02353218 ov29_02353218: .byte 0x33, 0x0B, 0x34, 0x0B + .global ov29_02353E44 +ov29_02353E44: .byte 0x63, 0x0F, 0x64, 0x0F .global ov29_0235322C ov29_0235322C: diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index 882d34fa..86226ba4 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -137,6 +137,51 @@ bool8 EntityIsValid__02308FBC(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } +#ifdef JAPAN +#define MESSAGE_C40 0x97F +#define MESSAGE_C41 0x980 +#define MESSAGE_C42 0x981 +#define MESSAGE_C43 0x982 +#define MESSAGE_C44 0x983 +#define MESSAGE_C45 0x984 +#define MESSAGE_C46 0x985 +#define MESSAGE_C47 0x986 +#define MESSAGE_C48 0x987 +#define MESSAGE_C49 0x988 +#define MESSAGE_C4A 0x989 +#define MESSAGE_C4B 0x98A +#define MESSAGE_C4C 0x98B +#define MESSAGE_C4D 0x98C +#define MESSAGE_C6A 0x9A9 +#define MESSAGE_C6B 0x9AA +#define MESSAGE_C6C 0x9AB +#define MESSAGE_C6D 0x9AC +#else +#define MESSAGE_C40 0xC40 +#define MESSAGE_C41 0xC41 +#define MESSAGE_C42 0xC42 +#define MESSAGE_C43 0xC43 +#define MESSAGE_C44 0xC44 +#define MESSAGE_C45 0xC45 +#define MESSAGE_C46 0xC46 +#define MESSAGE_C47 0xC47 +#define MESSAGE_C48 0xC48 +#define MESSAGE_C49 0xC49 +#define MESSAGE_C4A 0xC4A +#define MESSAGE_C4B 0xC4B +#define MESSAGE_C4C 0xC4C +#define MESSAGE_C4D 0xC4D +#define MESSAGE_C6A 0xC6A +#define MESSAGE_C6B 0xC6B +#define MESSAGE_C6C 0xC6C +#define MESSAGE_C6D 0xC6D +#endif + +extern void ov29_02307DC0(struct entity *entity); +#ifdef EUROPE +extern u16 ov29_02353E44[]; +#endif + bool8 ApplyDamage(struct entity *attacker, struct entity *defender, struct unk_02308FE0 *damage_data, int a4, int a5, enum damage_source_non_move damage_source, int a7) @@ -167,6 +212,9 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, u16 message_id; struct position revive_pos; u8 recruit_info[0x48]; +#ifdef EUROPE + bool8 defer_defeat_message; +#endif damage_data->field_0x10 = FALSE; played_hurt_anim = FALSE; @@ -180,10 +228,11 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, return FALSE; } - dmon = defender->info; - if (dmon->is_not_team_member && !dmon->is_ally) { + if (((struct monster *)defender->info)->is_not_team_member + && !((struct monster *)defender->info)->is_ally) { is_wild_enemy = TRUE; } + dmon = defender->info; TryEndPetrifiedOrSleepStatus(attacker, defender); UpdateShopkeeperModeAfterAttack(attacker, defender); @@ -195,14 +244,19 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, } if (attacker->type == 1) { +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, + ABILITY_MAGIC_GUARD) +#else if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MAGIC_GUARD, TRUE) +#endif && damage_data->field_0x4 != 4 && damage_data->field_0x4 != 0xE && damage_data->field_0x4 != 0 && damage_data->field_0x4 != 0x17) { SubstitutePlaceholderStringTags(1, defender, 0); - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC46); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C46); if (ShouldDisplayEntityWrapper(attacker) && ShouldDisplayEntityWrapper(defender)) { PlayMissSfx__022E611C(attacker, defender); @@ -216,7 +270,7 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, && damage_data->field_0x4 != 0xE && damage_data->field_0x4 != 0x17) { SubstitutePlaceholderStringTags(1, defender, 0); - LogMessageByIdWithPopupCheckUser(defender, 0xC46); + LogMessageByIdWithPopupCheckUser(defender, MESSAGE_C46); if (ShouldDisplayEntityWrapper(defender)) { PlayMissSfx__022E6150(defender); } @@ -226,11 +280,15 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, } if (damage_source != 0x24D && attacker->type == 1 +#ifdef JAPAN + && DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STURDY) +#else && DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STURDY, TRUE) +#endif && damage_data->field_0x0 == 0x270F) { SubstitutePlaceholderStringTags(1, defender, 0); - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC40); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C40); PlayMissSfx__022E611C(attacker, defender); damage_data->field_0x10 = TRUE; return FALSE; @@ -239,7 +297,7 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, if (dmon->frozen_class_status.freeze == 1) { if (damage_source != 0x250) { SubstitutePlaceholderStringTags(1, defender, 0); - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC41); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C41); PlayMissSfx__022E611C(attacker, defender); } damage_data->field_0x10 = TRUE; @@ -253,29 +311,49 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, } if (attacker->type == 1) { +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, + ABILITY_VOLT_ABSORB) +#else if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_VOLT_ABSORB, TRUE) +#endif && damage_data->field_0xc == 5) { TryIncreaseHp(attacker, defender, damage_data->field_0x0, 0, 0); damage_data->field_0x10 = TRUE; return FALSE; } +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, + ABILITY_WATER_ABSORB) +#else if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_WATER_ABSORB, TRUE) +#endif && damage_data->field_0xc == 3) { TryIncreaseHp(attacker, defender, damage_data->field_0x0, 0, 0); damage_data->field_0x10 = TRUE; return FALSE; } +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, + ABILITY_DRY_SKIN) +#else if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_DRY_SKIN, TRUE) +#endif && damage_data->field_0xc == 3) { TryIncreaseHp(attacker, defender, damage_data->field_0x0, 0, 0); damage_data->field_0x10 = TRUE; return FALSE; } +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, + ABILITY_MOTOR_DRIVE) +#else if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MOTOR_DRIVE, TRUE) +#endif && damage_data->field_0xc == 5) { ActivateMotorDrive(defender); damage_data->field_0x10 = TRUE; @@ -325,17 +403,17 @@ negation_checked: if (!dmon->apply_flash_fire_boost) { if (damage_data->field_0xe) { - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC42); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C42); } switch (damage_data->field_0x8) { case 0: - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC43); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C43); break; case 1: - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC44); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C44); break; case 3: - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC45); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C45); break; } } @@ -347,12 +425,12 @@ negation_checked: if (ShouldDisplayEntityWrapper(attacker) && ShouldDisplayEntityWrapper(defender)) { if (!dmon->apply_flash_fire_boost) { - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC47); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C47); } PlayMissSfx__022E611C(attacker, defender); } else { if (!dmon->apply_flash_fire_boost) { - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC47); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C47); } ov29_022EA370(0x1E, 0x18); } @@ -375,7 +453,7 @@ negation_checked: } } if (!dmon->apply_flash_fire_boost) { - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC48); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C48); } dmon->bide_damage_tally = 0x3E7; } else { @@ -456,18 +534,18 @@ negation_checked: if (dmon->reflect_class_status.reflect == 9) { if (dmon->hp == 0) { dmon->hp = 1; - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC49); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C49); } } else if (a4 == 1) { if (dmon->hp == 0) { dmon->hp = 1; - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC4A); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C4A); } } else if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_MAY_ENDURE) && DungeonRandOutcome__022EAB20(ov10_022C4834) && dmon->hp == 0) { dmon->hp = 1; - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC49); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C49); } ov29_022E81F8(); @@ -481,7 +559,9 @@ negation_checked: ov29_022EA370(0xA, 0x18); } +#ifndef JAPAN UpdateStatusIconFlags(defender); +#endif if (dmon->hp != 0) { if (played_hurt_anim) { @@ -536,12 +616,16 @@ negation_checked: SubstitutePlaceholderStringTags(0, attacker, 0); SubstitutePlaceholderStringTags(1, defender, 0); +#ifdef EUROPE + defer_defeat_message = FALSE; +#endif + if (damage_data->field_0x4 == 0x13 || damage_data->field_0x4 == 4 || damage_data->field_0x4 == 0x14) { if (dmon->is_not_team_member) { - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xC4B); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C4B); } else { - LogMessageByIdWithPopup(attacker, 0xC4B); + LogMessageByIdWithPopup(attacker, MESSAGE_C4B); } } else if (dmon->is_not_team_member) { if (dmon->monster_behavior == 7) { @@ -571,7 +655,11 @@ negation_checked: LogMessageByIdWithPopup(attacker, ov29_02353230[defeat_idx]); } } else { +#ifdef EUROPE + defer_defeat_message = TRUE; +#else LogMessageByIdWithPopup(attacker, ov29_02353218[defeat_idx]); +#endif } } @@ -611,7 +699,7 @@ negation_checked: ov29_02304830(defender, GetIdleAnimationId(defender)); UpdateStatusIconFlags(defender); SubstitutePlaceholderStringTags(1, defender, 0); - LogMessageByIdWithPopup(attacker, 0xC4C); + LogMessageByIdWithPopup(attacker, MESSAGE_C4C); ov29_0230D628(defender); return FALSE; } @@ -665,7 +753,7 @@ negation_checked: UpdateStatusIconFlags(defender); SubstitutePlaceholderStringTags(0, defender, 0); SubstitutePlaceholderStringTags(1, other, 0); - LogMessageByIdWithPopup(attacker, 0xC4D); + LogMessageByIdWithPopup(attacker, MESSAGE_C4D); ov29_0230D628(defender); return FALSE; } @@ -701,7 +789,14 @@ negation_checked: } if (reviver_seed != NULL) { +#ifdef EUROPE + if (defer_defeat_message) { + LogMessageByIdWithPopup(attacker, ov29_02353E44[defeat_idx]); + } +#endif +#ifndef JAPAN ov29_022FBD24(defender); +#endif ov29_022E550C(defender); ov29_0230D688(reviver_seed); defender->transparent = 0; @@ -722,6 +817,9 @@ negation_checked: } else if (dmon->curse_class_status.curse == 2) { EndCurseClassStatus(attacker, defender, 2, 1); } +#ifdef JAPAN + ov29_02307DC0(defender); +#endif EndLeechSeedStatusForAllTargets(defender); SubInitMonster(dmon, 0); ov10_022BDC68(); @@ -729,13 +827,22 @@ negation_checked: ov29_02304830(defender, GetIdleAnimationId(defender)); UpdateStatusIconFlags(defender); SubstitutePlaceholderStringTags(1, defender, 0); - LogMessageByIdWithPopup(attacker, 0xC4C); + LogMessageByIdWithPopup(attacker, MESSAGE_C4C); ov29_0230D628(defender); return FALSE; } +#ifdef JAPAN + if (revival_item != NULL) { +#else if (!DUNGEON_PTR->end_floor_no_death_check_flag && revival_item != NULL) { +#endif +#ifdef EUROPE + if (defer_defeat_message) { + LogMessageByIdWithPopup(attacker, ov29_02353E44[defeat_idx]); + } +#endif music = ov29_022EAF20(); if (dmon->curse_class_status.curse == 2) { EndCurseClassStatus(defender, defender, @@ -752,22 +859,22 @@ negation_checked: dmon->unk_revive_visual_tracker = TRUE; ov29_02304830(defender, GetIdleAnimationId(defender)); SubstitutePlaceholderStringTags(1, defender, 0); - LogMessageByIdWithPopup(attacker, 0xC4C); + LogMessageByIdWithPopup(attacker, MESSAGE_C4C); WaitUntilAlertBoxPauseIsOver(0xA); ov29_0234B1A4(0); ov29_022F0534(1); - ov29_022F0780(0xC6A); + ov29_022F0780(MESSAGE_C6A); ov29_02304830(defender, 0xB); - TalkToSecretBazaarNpcStandard(0xC6B, defender, 0); + TalkToSecretBazaarNpcStandard(MESSAGE_C6B, defender, 0); SetUnkMusicFlag(4); UnfreezeAnim(defender); ov29_02304830(defender, 6); - ov29_022F0780(0xC6C); + ov29_022F0780(MESSAGE_C6C); ov29_022F05E4(); ov29_022EFB84(1); defender->transparent = 1; dmon->unk_revive_visual_tracker = FALSE; - LogMessageByIdWithPopup(attacker, 0xC6D); + LogMessageByIdWithPopup(attacker, MESSAGE_C6D); WaitUntilAlertBoxPauseIsOver(0xA); ov29_022F0534(0); ChangeDungeonMusic(MusicTableIdxToMusicId( @@ -775,6 +882,11 @@ negation_checked: SetUnkMusicFlag(music); ov29_0230D628(defender); } +#ifdef EUROPE + else if (defer_defeat_message) { + LogMessageByIdWithPopup(attacker, ov29_02353218[defeat_idx]); + } +#endif } if (!dmon->is_team_leader) { From 5f96316f71bfbd8dd235d2a9378a40c6440b4866 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Mon, 24 Aug 2026 00:45:54 -0700 Subject: [PATCH 04/34] Decomp ApplyDamageAndEffects; ApplyDamage's damage source is signed 16-bit ApplyDamageAndEffects (617 instructions, overlay 29 at 0x0230863C) lands in src/overlay_29_02308FBC.c beside ApplyDamage, with all three regions matching. JAPAN differs in eleven places: ten DefenderAbilityIsActive__0230A940 calls drop their fourth argument (the header already declares both forms), and the counter-damage message id is US - 0x2C1, added as MESSAGE_C3F alongside the existing per-region defines. EUROPE is byte-identical to US. ApplyDamage's sixth parameter changes from enum damage_source_non_move to s16. The caller loads it with ldrsh and passes it in a register; the enum is all-positive so -enum min makes it unsigned 2-byte, which emits ldrh there. s16 scores 0 on both functions and all three ROMs still match, so this is a correction to the type rather than a change in behaviour. New in this commit: struct unk_023535DC for the exclusive-item effect table at ov29_023535DC (16-byte stride: effect id, argument, handler), and externs for the ten ov10_022C* activation-chance globals and six overlay callees. Three constructs are colouring devices rather than recovered source and should be read as stand-ins: a (u32) cast on the final return, a (s16) cast on the counter-attack loop's damage-source argument, and *(u8 *)effect as the effect loop's condition. Each is plain C, and each is load-bearing for the match. Authored by Claude (Opus 5 and Fable 5) under human direction. Confirmed by matching builds of all three ROMs: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK -- each also passing main.sha1, so the ARM9 binaries match and not only the packaged ROMs. Co-Authored-By: Claude Opus 5 --- asm/include/overlay_29_023085DC.inc | 45 -- asm/overlay_29_023085DC.s | 693 ---------------------------- include/overlay_29_02308FBC.h | 3 +- src/overlay_29_02308FBC.c | 381 ++++++++++++++- 4 files changed, 374 insertions(+), 748 deletions(-) diff --git a/asm/include/overlay_29_023085DC.inc b/asm/include/overlay_29_023085DC.inc index 2faf5c91..65488e74 100644 --- a/asm/include/overlay_29_023085DC.inc +++ b/asm/include/overlay_29_023085DC.inc @@ -1,48 +1,3 @@ #pragma once -.public abs -.public ApplyDamage -.public ApplyDamageAndEffectsWrapper -.public ARENA_TRAP_ACTIVATION_CHANCE -.public ATK_STAT_IDX -.public BoostOffensiveStat -.public CategoryIsNotPhysical -.public CUTE_CHARM_INFATUATE_CHANCE -.public DefenderAbilityIsActive__0230A940 -.public DUNGEON_PTR .public DungeonRandInt -.public EntityIsValid__02308FBC -.public ExclusiveItemEffectIsActive__0230A9B8 -.public GendersNotEqualNotGenderless -.public GravityIsActive -.public HasLowHealth -.public HasTypeAffectedByGravity -.public IqSkillIsEnabled -.public IsEitherMonsterInvalid -.public LevitateIsActive -.public LogMessageByIdWithPopupCheckUserTarget -.public MAGNET_PULL_ACTIVATION_CHANCE -.public MonsterIsType -.public ov10_022C442C -.public ov10_022C4464 -.public ov10_022C44C0 -.public ov10_022C4550 -.public ov10_022C45AC -.public ov10_022C45B0 -.public ov10_022C45B4 -.public ov10_022C45C0 -.public ov10_022C4638 -.public ov10_022C467C -.public ov29_022E3F24 -.public ov29_022E40C0 -.public ov29_022E45D0 -.public ov29_022E57D4 -.public ov29_022E5E84 -.public ov29_02300D50 -.public ov29_0230F728 -.public ov29_023380FC -.public ov29_023535DC -.public RAPID_SPIN_BINDING_REMOVAL -.public ResetDamageData -.public SHADOW_TAG_ACTIVATION_CHANCE -.public TryHurl .public UpdateAiTargetPos diff --git a/asm/overlay_29_023085DC.s b/asm/overlay_29_023085DC.s index c22e96f8..64cb4b6a 100644 --- a/asm/overlay_29_023085DC.s +++ b/asm/overlay_29_023085DC.s @@ -31,696 +31,3 @@ _02308618: bl UpdateAiTargetPos ldmia sp!, {r3, r4, r5, pc} arm_func_end ov29_023085DC - - arm_func_start ApplyDamageAndEffects -ApplyDamageAndEffects: ; 0x0230863C -#ifdef JAPAN -#define APPLY_DAMAGE_AND_EFFECTS_OFFSET -4 -#else -#define APPLY_DAMAGE_AND_EFFECTS_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x40 - ldr r7, [sp, #0x68] - ldrsh r4, [sp, #0x6c] - ldr r6, [sp, #0x74] - str r7, [sp] - stmib sp, {r4, r6} - mov r8, r2 - mov sl, r0 - mov sb, r1 - bl ApplyDamage - cmp r0, #0 - ldreqb r0, [r8, #0x10] - cmpeq r0, #0 - bne _02308F68 - mov r0, sl - bl EntityIsValid__02308FBC - cmp r0, #0 - beq _02308F68 - mov r0, sb - bl EntityIsValid__02308FBC - cmp r0, #0 - beq _02308F68 - ldr r0, [sl] - cmp r0, #1 - ldreq r0, [sb] - cmpeq r0, #1 - bne _02308F68 - ldr r0, [sb, #0xb4] - ldrb r0, [r0, #0xd2] - cmp r0, #0xc - bne _023086D4 - ldr r1, _02308F70 ; =ATK_STAT_IDX - mov r0, sl - ldr r2, [r1] - mov r1, sb - mov r3, #1 - bl BoostOffensiveStat -_023086D4: - ldr r0, [sp, #0x70] - cmp r0, #0 - beq _02308F68 - mov r0, sb - bl ov29_02300D50 - cmp r0, #0 - ldreq r0, [sb, #0xb4] - ldreqb r0, [r0, #0xd2] - cmpeq r0, #0 - movne r0, #0 - bne _02308F64 - mov r0, sl - mov r1, #0x29 - bl IqSkillIsEnabled - cmp r0, #0 - beq _02308730 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308F74 ; =ov10_022C442C - ldrsh r1, [r1] - cmp r0, r1 - movlt r0, #0 - blt _02308F64 -_02308730: - ldrb r0, [r8, #0xd] - bl CategoryIsNotPhysical - cmp r0, #0 - bne _02308778 - cmp sl, sb - beq _02308778 - ldrsh r1, [sl, #4] - ldrsh r0, [sb, #4] - sub r0, r1, r0 - bl abs - cmp r0, #1 - bgt _02308778 - ldrsh r1, [sl, #6] - ldrsh r0, [sb, #6] - sub r0, r1, r0 - bl abs - cmp r0, #1 - ble _02308780 -_02308778: - mov r0, #0 - b _023087B4 -_02308780: - ldr r0, [sb, #0xb4] - ldrb r0, [r0, #0xd5] - cmp r0, #0xd - bne _023087A8 - mov r0, sb - mov r1, sl - bl ov29_022E5E84 - mov r0, sb - mov r1, sl - bl TryHurl -_023087A8: - mov r0, sl - mov r1, sb - bl IsEitherMonsterInvalid -_023087B4: - cmp r0, #0 - movne r0, #1 - bne _02308F64 - ldrb r0, [r8, #0xd] - bl CategoryIsNotPhysical - mov r4, r0 - cmp sl, sb - mov r5, #0 - beq _02308808 - ldrsh r1, [sl, #4] - ldrsh r0, [sb, #4] - sub r0, r1, r0 - bl abs - cmp r0, #1 - bgt _02308808 - ldrsh r1, [sl, #6] - ldrsh r0, [sb, #6] - sub r0, r1, r0 - bl abs - cmp r0, #1 - ble _02308810 -_02308808: - mov r0, #0 - b _02308A28 -_02308810: - add r0, sp, #0x2c - bl ResetDamageData - ldr r0, [sb, #0xb4] - cmp r4, #0 - ldrb r0, [r0, #0xd5] - bne _023088E4 - cmp r0, #4 - bne _0230883C - mov r0, sb - bl ov29_022E3F24 - add r5, r5, #4 -_0230883C: - ldr r0, [sb, #0xb4] - ldrb r0, [r0, #0xd5] - cmp r0, #0xa - bne _02308858 - mov r0, sb - bl ov29_022E3F24 - add r5, r5, #1 -_02308858: - mov r0, sb - mov r1, #0x20 - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - mov r0, sb - mov r1, #0x23 - addne r5, r5, #4 - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - mov r0, sb - mov r1, #0x31 - addne r5, r5, #1 - bl IqSkillIsEnabled - cmp r0, #0 - beq _023088B0 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308F78 ; =ov10_022C44C0 - mov r0, r0, lsl #0x10 - ldrsh r1, [r1] - cmp r1, r0, asr #16 - addgt r5, r5, #4 -_023088B0: - mov r0, sb - mov r1, #0x27 - bl IqSkillIsEnabled - cmp r0, #0 - beq _023088F8 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308F7C ; =ov10_022C4464 - mov r0, r0, lsl #0x10 - ldrsh r1, [r1] - cmp r1, r0, asr #16 - addgt r5, r5, #1 - b _023088F8 -_023088E4: - cmp r0, #8 - bne _023088F8 - mov r0, sb - bl ov29_022E40C0 - add r5, r5, #4 -_023088F8: - ldr r0, [sb, #0xb4] - ldrb r0, [r0, #0xd5] - cmp r0, #0xf - bne _02308914 - mov r0, sb - bl ov29_022E57D4 - add r5, r5, #2 -_02308914: - mov r0, sl - mov r1, sb - mov r2, #0x12 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - addne r5, r5, #2 - cmp r5, #0 - beq _02308A1C - ldr r2, _02308F80 ; =0x00000C3F - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - ldr r0, [r8] - mov r1, #6 - mul r2, r0, r5 - mov r0, r2, asr #1 - add r0, r2, r0, lsr #30 - mov r0, r0, asr #2 - str r0, [sp, #0x2c] - ldrb r2, [r8, #0xc] - mov r0, #2 - mov r3, #0 - strb r2, [sp, #0x38] - str r1, [sp, #0x30] - str r0, [sp, #0x34] - ldrb r0, [r8, #0xd] - strb r0, [sp, #0x39] - strb r3, [sp, #0x3a] - strb r3, [sp, #0x3b] - strb r3, [sp, #0x3c] - ldr r0, [sb, #0xb4] - ldrb r0, [r0, #0xd5] - cmp r0, #0xf - bne _023089FC - mov r2, #1 - add r1, sp, #0xc - mov r0, sb - strb r2, [sp, #0x39] - bl ov29_023380FC - mov fp, r0 - ldrsh r5, [sp, #0x6c] - mov r4, #0 - b _023089F0 -_023089C4: - str r7, [sp] - stmib sp, {r5, r6} - add r0, sp, #0xc - ldr r1, [r0, r4, lsl #2] - mov r0, sb - add r2, sp, #0x2c - mov r3, #0 - bl ApplyDamage - add r0, r4, #1 - mov r0, r0, lsl #0x10 - mov r4, r0, asr #0x10 -_023089F0: - cmp r4, fp - blt _023089C4 - b _02308A1C -_023089FC: - ldrsh r0, [sp, #0x6c] - str r7, [sp] - add r2, sp, #0x2c - str r0, [sp, #4] - mov r0, sb - mov r1, sl - str r6, [sp, #8] - bl ApplyDamage -_02308A1C: - mov r0, sl - mov r1, sb - bl IsEitherMonsterInvalid -_02308A28: - cmp r0, #0 - movne r0, #1 - bne _02308F64 - cmp sl, sb - beq _02308A6C - ldrsh r1, [sl, #4] - ldrsh r0, [sb, #4] - sub r0, r1, r0 - bl abs - cmp r0, #1 - bgt _02308A6C - ldrsh r1, [sl, #6] - ldrsh r0, [sb, #6] - sub r0, r1, r0 - bl abs - cmp r0, #1 - ble _02308A74 -_02308A6C: - mov r0, #0 - b _02308ECC -_02308A74: - ldrb r0, [r8, #0xd] - bl CategoryIsNotPhysical - mov r4, r0 - mov r0, sb - mov r1, #0xb - ldr r6, [sl, #0xb4] - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _02308B04 - cmp r4, #0 - bne _02308B04 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308F84 ; =ov10_022C45B4 - ldrsh r1, [r1] - cmp r0, r1 - bge _02308B04 - mov r0, #0x12c - bl DungeonRandInt - cmp r0, #0x64 - mov r2, #0xb - bge _02308AE0 - mov r0, sl - mov r1, sb - mov r3, #0x40 - bl ov29_0230F728 - b _02308B04 -_02308AE0: - cmp r0, #0xc8 - mov r0, sl - mov r1, sb - bge _02308AFC - mov r3, #0x10 - bl ov29_0230F728 - b _02308B04 -_02308AFC: - mov r3, #0x80 - bl ov29_0230F728 -_02308B04: - ldr r5, _02308F88 ; =ov29_023535DC - b _02308B54 -_02308B0C: - ldrb r1, [r5] - mov r0, sb - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _02308B50 - ldr r3, [r5, #8] - mov r0, sl - mov r1, sb - mov r2, r4 - blx r3 - cmp r0, #0 - beq _02308B50 - ldrb r2, [r5] - ldr r3, [r5, #4] - mov r0, sl - mov r1, sb - bl ov29_0230F728 -_02308B50: - add r5, r5, #0x10 -_02308B54: - ldrb r0, [r5] - cmp r0, #0 - bne _02308B0C - mov r0, sb - mov r1, #0x1b - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _02308BB0 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308F8C ; =ov10_022C45B0 - ldrsh r1, [r1] - cmp r0, r1 - bge _02308BB0 - mov r0, sb - bl HasLowHealth - cmp r0, #0 - beq _02308BB0 - mov r0, sl - mov r1, sb - mov r2, #0x1b - mov r3, #0x40000 - bl ov29_0230F728 -_02308BB0: - mov r0, sl - mov r1, sb - mov r2, #5 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02308C38 - ldrb r0, [r6, #0xf7] - mov r5, #0 - cmp r0, #1 - beq _02308C00 - mov r0, sl - mov r1, #0xa - bl HasTypeAffectedByGravity - cmp r0, #0 - bne _02308C00 - mov r0, sl - bl LevitateIsActive - cmp r0, #0 - beq _02308C0C -_02308C00: - bl GravityIsActive - cmp r0, #0 - moveq r5, #1 -_02308C0C: - cmp r5, #0 - bne _02308C38 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308F90 ; =ARENA_TRAP_ACTIVATION_CHANCE - ldrsh r1, [r1] - cmp r0, r1 - addlt r0, r6, #0x100 - ldrlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - orrlt r1, r1, #1 - strlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] -_02308C38: - mov r0, sl - mov r1, sb - mov r2, #0xa -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02308C88 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308F94 ; =SHADOW_TAG_ACTIVATION_CHANCE - ldrsh r1, [r1] - cmp r0, r1 - bge _02308C88 - add r0, r6, #0x100 - ldrh r3, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - ldr r1, _02308F98 ; =RAPID_SPIN_BINDING_REMOVAL - mov r2, #0 - orr r3, r3, #2 - strh r3, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - strb r2, [r1] -_02308C88: - mov r0, sl - mov r1, sb - mov r2, #0x17 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02308CDC - mov r0, sl - mov r1, #0x11 - bl MonsterIsType - cmp r0, #0 - beq _02308CDC - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308F9C ; =MAGNET_PULL_ACTIVATION_CHANCE - ldrsh r1, [r1] - cmp r0, r1 - addlt r0, r6, #0x100 - ldrlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - orrlt r1, r1, #4 - strlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] -_02308CDC: - mov r0, sl - mov r1, sb - mov r2, #0x20 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02308D24 - cmp r4, #0 - bne _02308D24 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308FA0 ; =ov10_022C4550 - ldrsh r1, [r1] - cmp r0, r1 - addlt r0, r6, #0x100 - ldrlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - orrlt r1, r1, #8 - strlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] -_02308D24: - mov r0, sl - mov r1, sb - mov r2, #0x27 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02308D64 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308FA4 ; =ov10_022C45C0 - ldrsh r1, [r1] - cmp r0, r1 - addlt r0, r6, #0x100 - ldrlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - orrlt r1, r1, #0x20 - strlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] -_02308D64: - mov r0, sl - mov r1, sb - mov r2, #0x3d -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02308DE0 - cmp r4, #0 - bne _02308DE0 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308FA8 ; =ov10_022C45AC - ldrsh r1, [r1] - cmp r0, r1 - bge _02308DE0 - mov r0, #3 - bl DungeonRandInt - cmp r0, #1 - addlt r0, r6, #0x100 - ldrlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - orrlt r1, r1, #0x40 - strlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - blt _02308DE0 - cmp r0, #2 - add r0, r6, #0x100 - ldrlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - orrlt r1, r1, #0x10 - strlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - ldrgeh r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - orrge r1, r1, #0x80 - strgeh r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] -_02308DE0: - mov r0, sl - mov r1, sb - mov r2, #0x3e -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02308E20 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308FAC ; =ov10_022C467C - ldrsh r1, [r1] - cmp r0, r1 - addlt r0, r6, #0x100 - ldrlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - orrlt r1, r1, #0x100 - strlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] -_02308E20: - mov r0, sl - mov r1, sb - mov r2, #0x44 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02308E80 - ldr r1, [sb, #0xb4] - ldrsh r0, [r6, #2] - ldrsh r1, [r1, #2] - bl GendersNotEqualNotGenderless - cmp r0, #0 - beq _02308E80 - cmp r4, #0 - bne _02308E80 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308FB0 ; =CUTE_CHARM_INFATUATE_CHANCE - ldrsh r1, [r1] - cmp r0, r1 - addlt r0, r6, #0x100 - ldrlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - orrlt r1, r1, #0x200 - strlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] -_02308E80: -#ifdef JAPAN - mov r0, sl - mov r1, sb - mov r2, #1 -#else - mov r2, #1 - mov r0, sl - mov r1, sb - mov r3, r2 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _02308EC0 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _02308FB4 ; =ov10_022C4638 - ldrsh r1, [r1] - cmp r0, r1 - addlt r0, r6, #0x100 - ldrlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] - orrlt r1, r1, #0x400 - strlth r1, [r0, #0x92 + APPLY_DAMAGE_AND_EFFECTS_OFFSET] -_02308EC0: - mov r0, sl - mov r1, sb - bl IsEitherMonsterInvalid -_02308ECC: - cmp r0, #0 - movne r0, #1 - bne _02308F64 - ldr r0, [sb, #0xb4] - ldrb r1, [r0, #0xe0] - cmp r1, #2 - bne _02308F4C - ldr r1, _02308FB8 ; =DUNGEON_PTR - ldrb r2, [r0, #0xe8] - ldr r1, [r1] - add r1, r1, r2, lsl #2 - add r1, r1, #0x12000 -#ifdef JAPAN - ldr r4, [r1, #0xad4] -#else - ldr r4, [r1, #0xb78] -#endif - cmp r4, #0 - moveq r1, #0 - streqb r1, [r0, #0xe0] - beq _02308F4C - ldr r1, [r4, #0xb4] - ldr r2, [r0, #0xe4] - ldr r1, [r1, #0xb0] - cmp r2, r1 - movne r1, #0 - strneb r1, [r0, #0xe0] - bne _02308F4C - mov r0, r4 - mov r1, sb - bl ov29_022E45D0 - ldr r1, [r8] - mov r0, r4 - mov r2, #0xc - mov r3, #0x238 - bl ApplyDamageAndEffectsWrapper -_02308F4C: - mov r0, sl - mov r1, sb - bl IsEitherMonsterInvalid - cmp r0, #0 - movne r0, #1 - moveq r0, #0 -_02308F64: - cmp r0, #0 -_02308F68: - add sp, sp, #0x40 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02308F70: .word ATK_STAT_IDX -_02308F74: .word ov10_022C442C -_02308F78: .word ov10_022C44C0 -_02308F7C: .word ov10_022C4464 -#ifdef JAPAN -_02308F80: .word 0x0000097E -#else -_02308F80: .word 0x00000C3F -#endif -_02308F84: .word ov10_022C45B4 -_02308F88: .word ov29_023535DC -_02308F8C: .word ov10_022C45B0 -_02308F90: .word ARENA_TRAP_ACTIVATION_CHANCE -_02308F94: .word SHADOW_TAG_ACTIVATION_CHANCE -_02308F98: .word RAPID_SPIN_BINDING_REMOVAL -_02308F9C: .word MAGNET_PULL_ACTIVATION_CHANCE -_02308FA0: .word ov10_022C4550 -_02308FA4: .word ov10_022C45C0 -_02308FA8: .word ov10_022C45AC -_02308FAC: .word ov10_022C467C -_02308FB0: .word CUTE_CHARM_INFATUATE_CHANCE -_02308FB4: .word ov10_022C4638 -_02308FB8: .word DUNGEON_PTR - arm_func_end ApplyDamageAndEffects diff --git a/include/overlay_29_02308FBC.h b/include/overlay_29_02308FBC.h index 2072310e..83439280 100644 --- a/include/overlay_29_02308FBC.h +++ b/include/overlay_29_02308FBC.h @@ -19,8 +19,9 @@ struct unk_02308FE0 { // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__02308FBC(struct entity *entity); +int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, struct unk_02308FE0 *damage_data, int a4, int a5, s16 a6, int a7, int a8); bool8 ApplyDamage(struct entity *attacker, struct entity *defender, struct unk_02308FE0 *damage_data, int a4, int a5, - enum damage_source_non_move damage_source, int a7); + s16 damage_source, int a7); #endif //PMDSKY_OVERLAY_29_02308FBC_H diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index 86226ba4..173902dc 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -34,6 +34,23 @@ #include "position_util.h" #include "util.h" #include "dungeon_util_static.h" +#include "dungeon_capabilities_1.h" +#include "dungeon_logic_3.h" +#include "dungeon_logic_4.h" +#include "item.h" +#include "main_02054DC4.h" +#include "move_orb_effects.h" +#include "overlay_29_022E3F20.h" +#include "overlay_29_022E406C.h" +#include "overlay_29_0233836C.h" + +struct unk_023535DC { + u8 field_0x0; + u8 filler1[3]; + s32 field_0x4; + bool8 (*field_0x8)(struct entity *attacker, struct entity *defender, s32 a); + u8 filler2[4]; +}; struct unk_023528A4 { u8 field_0x0; @@ -45,7 +62,34 @@ struct unk_022C593C { u8 filler[10]; }; +extern const struct StatIndex ATK_STAT_IDX; extern void ActivateMotorDrive(struct entity* entity); +extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); +extern bool8 CategoryIsNotPhysical(s32 category); +extern bool8 IsEitherMonsterInvalid(struct entity *a, struct entity *b); +extern void ResetDamageData(struct unk_02308FE0 *damage_data); +extern void TryHurl(struct entity *user, struct entity *target); +extern void ov29_022E45D0(struct entity *a, struct entity *b); +extern void ov29_022E57D4(struct entity *entity); +extern void ov29_022E5E84(struct entity *a, struct entity *b); +extern void ov29_0230F728(struct entity *attacker, struct entity *defender, enum exclusive_item_effect_id effect_id, s32 a); +extern s32 ov29_023380FC(struct entity *entity, struct entity **targets); +extern struct unk_023535DC ov29_023535DC[]; +extern s16 ARENA_TRAP_ACTIVATION_CHANCE; +extern s16 CUTE_CHARM_INFATUATE_CHANCE; +extern s16 MAGNET_PULL_ACTIVATION_CHANCE; +extern u8 RAPID_SPIN_BINDING_REMOVAL; +extern s16 SHADOW_TAG_ACTIVATION_CHANCE; +extern s16 ov10_022C442C; +extern s16 ov10_022C4464; +extern s16 ov10_022C44C0; +extern s16 ov10_022C4550; +extern s16 ov10_022C45AC; +extern s16 ov10_022C45B0; +extern s16 ov10_022C45B4; +extern s16 ov10_022C45C0; +extern s16 ov10_022C4638; +extern s16 ov10_022C467C; extern void AddExpSpecial(struct entity* attacker, struct entity* defender, s32 base_exp); extern void AdvanceFrame(u32); extern bool8 AftermathCheck(struct entity *attacker, struct entity *defender, s32 damage_source); @@ -129,15 +173,8 @@ extern bool8 ov29_0237CA6C; extern struct dungeon *DUNGEON_PTR; extern struct bag_items *BAG_ITEMS_PTR_MIRROR; -bool8 EntityIsValid__02308FBC(struct entity *entity) -{ - if (entity == NULL) - return FALSE; - - return GetEntityType(entity) != ENTITY_NOTHING; -} - #ifdef JAPAN +#define MESSAGE_C3F 0x97E #define MESSAGE_C40 0x97F #define MESSAGE_C41 0x980 #define MESSAGE_C42 0x981 @@ -157,6 +194,7 @@ bool8 EntityIsValid__02308FBC(struct entity *entity) #define MESSAGE_C6C 0x9AB #define MESSAGE_C6D 0x9AC #else +#define MESSAGE_C3F 0xC3F #define MESSAGE_C40 0xC40 #define MESSAGE_C41 0xC41 #define MESSAGE_C42 0xC42 @@ -177,6 +215,331 @@ bool8 EntityIsValid__02308FBC(struct entity *entity) #define MESSAGE_C6D 0xC6D #endif +int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, + struct unk_02308FE0 *damage_data, int a4, int a5, + s16 a6, int a7, int a8) +{ + struct unk_02308FE0 counter; + struct entity *targets[8]; + struct monster *dmon; + s32 mult; + s32 i; + s32 n; + s32 not_physical; + bool8 grounded; + s32 result; + s32 k; + + if ((result = ApplyDamage(attacker, defender, damage_data, a4, a5, a6, a8)) != 0 + || (result = damage_data->field_0x10) != 0) { + return result; + } + if ((result = EntityIsValid__02308FBC(attacker)) == 0) { + return result; + } + if ((result = EntityIsValid__02308FBC(defender)) == 0) { + return result; + } + if ((result = attacker->type) != 1 || (result = defender->type) != 1) { + return result; + } + + if (((struct monster *)defender->info)->bide_class_status.bide == 0xC) { + BoostOffensiveStat(attacker, defender, ATK_STAT_IDX, 1); + } + + if ((result = a7) == 0) { + return result; + } + + if (ov29_02300D50(defender) + || ((struct monster *)defender->info)->bide_class_status.bide != 0) { + result = FALSE; + } else if (IqSkillIsEnabled(attacker, IQ_HIT_AND_RUNNER) + && DungeonRandInt(100) < ov10_022C442C) { + result = FALSE; + } else { + if (CategoryIsNotPhysical(damage_data->field_0xd) || attacker == defender + || abs(attacker->pos.x - defender->pos.x) > 1 + || abs(attacker->pos.y - defender->pos.y) > 1) { + result = FALSE; + } else { + if (((struct monster *)defender->info)->reflect_class_status.reflect + == 0xD) { + ov29_022E5E84(defender, attacker); + TryHurl(defender, attacker); + } + result = IsEitherMonsterInvalid(attacker, defender); + } + if (result) { + result = TRUE; + } else { + + not_physical = CategoryIsNotPhysical(damage_data->field_0xd); + mult = 0; + + if (attacker == defender + || abs(attacker->pos.x - defender->pos.x) > 1 + || abs(attacker->pos.y - defender->pos.y) > 1) { + result = FALSE; + } else { + ResetDamageData(&counter); + dmon = defender->info; + + if (!not_physical) { + if (dmon->reflect_class_status.reflect == 4) { + ov29_022E3F24(defender); + mult += 4; + } + if (((struct monster *)defender->info)->reflect_class_status.reflect + == 0xA) { + ov29_022E3F24(defender); + mult += 1; + } + if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_COUNTER_PHYSICAL_DAMAGE)) { + mult += 4; + } + if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_COUNTER_25_PCT_PHYSICAL_DAMAGE)) { + mult += 1; + } + if (IqSkillIsEnabled(defender, IQ_COUNTER_BASHER) + && ov10_022C44C0 > (s16)DungeonRandInt(100)) { + mult += 4; + } + if (IqSkillIsEnabled(defender, IQ_COUNTER_HITTER) + && ov10_022C4464 > (s16)DungeonRandInt(100)) { + mult += 1; + } + } else if (dmon->reflect_class_status.reflect == 8) { + ov29_022E40C0(defender); + mult += 4; + } + + if (((struct monster *)defender->info)->reflect_class_status.reflect + == 0xF) { + ov29_022E57D4(defender); + mult += 2; + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ROUGH_SKIN)) { +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ROUGH_SKIN, TRUE)) { +#endif + + mult += 2; + } + + if (mult != 0) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C3F); + counter.field_0x0 = damage_data->field_0x0 * mult / 4; + counter.field_0xc = damage_data->field_0xc; + counter.field_0x4 = 6; + counter.field_0x8 = 2; + counter.field_0xd = damage_data->field_0xd; + counter.field_0xe = 0; + counter.field_0xf = 0; + counter.field_0x10 = 0; + + if (((struct monster *)defender->info)->reflect_class_status.reflect + == 0xF) { + counter.field_0xd = 1; + n = ov29_023380FC(defender, targets); + for (k = 0; k < n; k = (s16)(k + 1)) { + ApplyDamage(defender, targets[k], &counter, 0, a5, (s16)a6, a8); + } + } else { + ApplyDamage(defender, attacker, &counter, 0, a5, (s16)a6, a8); + } + } + + result = IsEitherMonsterInvalid(attacker, defender); + } + if (result) { + result = TRUE; + } else { + + if (attacker == defender + || abs(attacker->pos.x - defender->pos.x) > 1 + || abs(attacker->pos.y - defender->pos.y) > 1) { + result = FALSE; + } else { + { + s32 np3 = CategoryIsNotPhysical(damage_data->field_0xd); + struct unk_023535DC *eff3; + struct monster *amon3 = attacker->info; + + if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS) && !np3 + && DungeonRandInt(100) < ov10_022C45B4) { + i = DungeonRandInt(300); + if (i < 100) { + ov29_0230F728(attacker, defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS, 0x40); + } else if (i < 200) { + ov29_0230F728(attacker, defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS, 0x10); + } else { + ov29_0230F728(attacker, defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS, 0x80); + } + } + + for (eff3 = ov29_023535DC; *(u8 *)eff3 != 0; eff3++) { + if (ExclusiveItemEffectIsActive__0230A9B8(defender, (enum exclusive_item_effect_id)eff3->field_0x0) + && eff3->field_0x8(attacker, defender, np3)) { + ov29_0230F728(attacker, defender, (enum exclusive_item_effect_id)eff3->field_0x0, + eff3->field_0x4); + } + } + + if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_MAY_WARP_WHEN_ATTACKED) + && DungeonRandInt(100) < ov10_022C45B0 && HasLowHealth(defender)) { + ov29_0230F728(attacker, defender, EXCLUSIVE_EFF_MAY_WARP_WHEN_ATTACKED, 0x40000); + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ARENA_TRAP)) { +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ARENA_TRAP, TRUE)) { +#endif + + grounded = FALSE; + if (amon3->magnet_rise == 1 + || HasTypeAffectedByGravity(attacker, TYPE_FLYING) + || LevitateIsActive(attacker)) { + if (!GravityIsActive()) { + grounded = TRUE; + } + } + if (!grounded && DungeonRandInt(100) < ARENA_TRAP_ACTIVATION_CHANCE) { + amon3->contact_ability_trigger_bitflags |= 1; + } + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_SHADOW_TAG) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_SHADOW_TAG, TRUE) +#endif + && DungeonRandInt(100) < SHADOW_TAG_ACTIVATION_CHANCE) { + amon3->contact_ability_trigger_bitflags |= 2; + RAPID_SPIN_BINDING_REMOVAL = 0; + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MAGNET_PULL) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MAGNET_PULL, TRUE) +#endif + && MonsterIsType(attacker, TYPE_STEEL) + && DungeonRandInt(100) < MAGNET_PULL_ACTIVATION_CHANCE) { + amon3->contact_ability_trigger_bitflags |= 4; + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STATIC) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STATIC, TRUE) +#endif + && !np3 && DungeonRandInt(100) < ov10_022C4550) { + amon3->contact_ability_trigger_bitflags |= 8; + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_POISON_POINT) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_POISON_POINT, TRUE) +#endif + && DungeonRandInt(100) < ov10_022C45C0) { + amon3->contact_ability_trigger_bitflags |= 0x20; + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_EFFECT_SPORE) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_EFFECT_SPORE, TRUE) +#endif + && !np3 && DungeonRandInt(100) < ov10_022C45AC) { + i = DungeonRandInt(3); + if (i < 1) { + amon3->contact_ability_trigger_bitflags |= 0x40; + } else if (i < 2) { + amon3->contact_ability_trigger_bitflags |= 0x10; + } else { + amon3->contact_ability_trigger_bitflags |= 0x80; + } + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_FLAME_BODY) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_FLAME_BODY, TRUE) +#endif + && DungeonRandInt(100) < ov10_022C467C) { + amon3->contact_ability_trigger_bitflags |= 0x100; + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_CUTE_CHARM) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_CUTE_CHARM, TRUE) +#endif + && GendersNotEqualNotGenderless( + amon3->id, ((struct monster *)defender->info)->id) + && !np3 && DungeonRandInt(100) < CUTE_CHARM_INFATUATE_CHANCE) { + amon3->contact_ability_trigger_bitflags |= 0x200; + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STENCH) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STENCH, TRUE) +#endif + && DungeonRandInt(100) < ov10_022C4638) { + amon3->contact_ability_trigger_bitflags |= 0x400; + } + + result = IsEitherMonsterInvalid(attacker, defender); + } + } + if (result) { + result = TRUE; + } else { + + dmon = defender->info; + if (dmon->leech_seed_class_status.leech_seed == STATUS_LEECH_SEED_DESTINY_BOND) { + struct entity *bonded = + DUNGEON_PTR->active_monster_ptrs[dmon->leech_seed_class_status + .leech_seed_source_monster_index]; + + if (bonded == NULL) { + dmon->leech_seed_class_status.leech_seed = STATUS_LEECH_SEED_NONE; + } else if (dmon->leech_seed_class_status.statuses_applier_id + != ((struct monster *)bonded->info)->unique_id) { + dmon->leech_seed_class_status.leech_seed = STATUS_LEECH_SEED_NONE; + } else { + ov29_022E45D0(bonded, defender); + ApplyDamageAndEffectsWrapper(bonded, damage_data->field_0x0, 0xC, + 0x238); + } + } + + result = IsEitherMonsterInvalid(attacker, defender) != 0; + } + } + } + } + if (result) { + return result; + } + return (u32)result; +} + +bool8 EntityIsValid__02308FBC(struct entity *entity) +{ + if (entity == NULL) + return FALSE; + + return GetEntityType(entity) != ENTITY_NOTHING; +} + extern void ov29_02307DC0(struct entity *entity); #ifdef EUROPE extern u16 ov29_02353E44[]; @@ -184,7 +547,7 @@ extern u16 ov29_02353E44[]; bool8 ApplyDamage(struct entity *attacker, struct entity *defender, struct unk_02308FE0 *damage_data, int a4, int a5, - enum damage_source_non_move damage_source, int a7) + s16 damage_source, int a7) { bool8 played_hurt_anim; struct unk_023528A4 *neg; From 38aa265d9dcb7e2ad3f7fea7fd75bbf05ff92098 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Mon, 24 Aug 2026 03:11:36 -0700 Subject: [PATCH 05/34] Decomp CalcTypeBasedDamageEffects; pad damage_calc_diag to its real layout CalcTypeBasedDamageEffects (0x0230AD04, 676 instructions) applies every type-, ability-, weather- and status-based multiplier to a damage calculation. It merges into src/type_effectiveness.c, which already held its callee GetTypeMatchup, so asm/overlay_29_0230AD04.{s,inc} are removed and main.lsf loses that object with no new object added. struct damage_calc_diag modelled move_type as a 1-byte enum plus explicit field_0x1/0x2/0x3 padding, but gave move_category no such padding, so every member from move_indiv_type_matchups (0x8) to attacker_level (0x16) compiled below the offset its own comment states. Downstream alignment before damage_calc re-absorbed the drift, so the struct still totalled 0x54 and no build caught it; the two existing users in the tree both sit past the re-convergence point. asm/overlay_29_022E0378.s writes 0x188 and asm/overlay_29_022E335C.s reads 0x184/0x188 with word accesses, so both fields are four bytes in retail. Adding field_0x5/0x6/0x7 is byte-neutral for the existing tree. include/type_effectiveness.h gains overlay_29_02308FBC.h, which defines the struct unk_02308FE0 its new declaration names. Region handling follows the neighbouring files: six DefenderAbilityIsActive__0230A940 calls take three arguments under JAPAN and four elsewhere, and five message ids are file-scope defines at US - 0x2C1 under JAPAN. EU is identical to US - the original asm block carries no EUROPE directive at all. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK, each also passing main.sha1 and filesystem.sha1. Co-Authored-By: Claude Opus 5 --- asm/include/overlay_29_0230AD04.inc | 45 -- asm/overlay_29_0230AD04.s | 786 ---------------------------- include/dungeon_mode.h | 3 + include/type_effectiveness.h | 2 + main.lsf | 1 - src/type_effectiveness.c | 339 ++++++++++++ 6 files changed, 344 insertions(+), 832 deletions(-) delete mode 100644 asm/include/overlay_29_0230AD04.inc delete mode 100644 asm/overlay_29_0230AD04.s diff --git a/asm/include/overlay_29_0230AD04.inc b/asm/include/overlay_29_0230AD04.inc deleted file mode 100644 index b2ccddb8..00000000 --- a/asm/include/overlay_29_0230AD04.inc +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public BURN_DAMAGE_MULTIPLIER -.public CLOUDY_DAMAGE_MULTIPLIER -.public DAMAGE_MULTIPLIER_0_5 -.public DAMAGE_MULTIPLIER_1_5 -.public DAMAGE_MULTIPLIER_2 -.public DefenderAbilityIsActive__0230A940 -.public DUNGEON_PTR -.public EntityIsValid__02308FBC -.public ExclusiveItemEffectIsActive__0230A9B8 -.public FixedPoint32To64 -.public FixedPoint64IsZero -.public FlashFireShouldActivate -.public GetApparentWeather -.public GetTypeMatchup -.public GhostImmunityIsActive -.public IntToFixedPoint64 -.public IqSkillIsEnabled -.public IsFloating -.public IsTypeIneffectiveAgainstGhost -.public LevitateIsActive -.public LogMessageByIdWithPopupCheckParticipants -.public LogMessageByIdWithPopupCheckUserTarget -.public MATCHUP_IMMUNE_MULTIPLIER -.public MATCHUP_IMMUNE_MULTIPLIER_ERRATIC_PLAYER -.public MATCHUP_NEUTRAL_MULTIPLIER -.public MATCHUP_NEUTRAL_MULTIPLIER_ERRATIC_PLAYER -.public MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER -.public MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER -.public MATCHUP_SUPER_EFFECTIVE_MULTIPLIER -.public MATCHUP_SUPER_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER -.public MonsterIsType -.public MultiplyFixedPoint64 -.public ov29_02352838 -.public PlayEffectAnimation0x1A9__022E61C8 -.public PlayEffectAnimation0x1A9__022E6214 -.public PlayEffectAnimation0x1A9__022E64C4 -.public PlayEffectAnimation0x1A9__022E6510 -.public ScrappyShouldActivate -.public SOLID_ROCK_MULTIPLIER -.public TECHNICIAN_MOVE_POWER_THRESHOLD -.public TINTED_LENS_MULTIPLIER -.public TYPE_MATCHUP_COMBINATOR_TABLE -.public UpdateStateFlags diff --git a/asm/overlay_29_0230AD04.s b/asm/overlay_29_0230AD04.s deleted file mode 100644 index 19702152..00000000 --- a/asm/overlay_29_0230AD04.s +++ /dev/null @@ -1,786 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0230AD04.inc" - - .text - - arm_func_start CalcTypeBasedDamageEffects -CalcTypeBasedDamageEffects: ; 0x0230AD04 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x64 - ldr r5, _0230B774 ; =ov29_02352838 - mov sl, r1 - ldr r4, [r5, #0x1c] - ldr r5, [r5, #0x20] - ldr r8, [sp, #0x88] - ldr r1, [sp, #0x90] - ldr r7, [sp, #0x8c] - str r1, [sp, #0x90] - ldr r6, [sl, #0xb4] - mov r1, #1 - mov fp, r0 - mov sb, r2 - str r3, [sp, #4] - str r4, [sp, #0x34] - str r5, [sp, #0x38] - bl IntToFixedPoint64 - mov r0, #0 - str r0, [sp, #0x30] - strb r0, [r7, #0xe] - ldr r1, [sp, #0x30] - mov r0, sb - strb r1, [r7, #0xf] - bl EntityIsValid__02308FBC - cmp r0, #0 - moveq r0, #1 - beq _0230B76C - mov r0, r8 - bl IsTypeIneffectiveAgainstGhost - str r0, [sp, #0x2c] - mov r0, sl - mov r1, sb - mov r2, #0x35 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - cmpne r8, #0 - movne r0, #1 - strne r0, [sp, #0x30] - mov r3, #2 - mov r0, sl - mov r1, sb - mov r2, r8 - str r3, [r7, #8] - bl ScrappyShouldActivate - ldr r3, _0230B778 ; =MATCHUP_IMMUNE_MULTIPLIER_ERRATIC_PLAYER - str r0, [sp, #0x28] - ldr r0, [r3] - ldr r2, _0230B77C ; =MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER - str r0, [sp, #0x24] - ldr r0, [r2] - ldr r1, _0230B780 ; =MATCHUP_NEUTRAL_MULTIPLIER_ERRATIC_PLAYER - str r0, [sp, #0x20] - ldr r0, [r1] - ldr r1, _0230B784 ; =MATCHUP_IMMUNE_MULTIPLIER - str r0, [sp, #0x1c] - ldr r0, _0230B788 ; =MATCHUP_SUPER_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER - mov r4, #0 - ldr r0, [r0] - str r0, [sp, #0x18] - ldr r0, [r1] - ldr r1, _0230B78C ; =MATCHUP_NEUTRAL_MULTIPLIER - str r0, [sp, #0x14] - ldr r0, _0230B790 ; =MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER - ldr r0, [r0] - str r0, [sp, #0x10] - ldr r0, [r1] - str r0, [sp, #0xc] - ldr r0, _0230B794 ; =MATCHUP_SUPER_EFFECTIVE_MULTIPLIER - ldr r0, [r0] - str r0, [sp, #8] - b _0230AF8C -_0230AE28: - ldr r0, [sp, #0x90] - cmp r0, #0 - bne _0230AE90 - mov r0, sl - mov r1, #0x3b - bl IqSkillIsEnabled - cmp r0, #0 - bne _0230AE5C - mov r0, sb - mov r1, #0x3b - bl IqSkillIsEnabled - cmp r0, #0 - beq _0230AE90 -_0230AE5C: - ldr r1, [sp, #0x24] - add r0, sp, #0x44 - bl FixedPoint32To64 - ldr r1, [sp, #0x20] - add r0, sp, #0x4c - bl FixedPoint32To64 - ldr r1, [sp, #0x1c] - add r0, sp, #0x54 - bl FixedPoint32To64 - ldr r1, [sp, #0x18] - add r0, sp, #0x5c - bl FixedPoint32To64 - b _0230AEC0 -_0230AE90: - ldr r1, [sp, #0x14] - add r0, sp, #0x44 - bl FixedPoint32To64 - ldr r1, [sp, #0x10] - add r0, sp, #0x4c - bl FixedPoint32To64 - ldr r1, [sp, #0xc] - add r0, sp, #0x54 - bl FixedPoint32To64 - ldr r1, [sp, #8] - add r0, sp, #0x5c - bl FixedPoint32To64 -_0230AEC0: - mov r0, fp - bl FixedPoint64IsZero - cmp r0, #0 - bne _0230AF94 - ldr r0, [sp, #0x28] - cmp r0, #0 - bne _0230AF1C - ldr r0, [sp, #0x2c] - cmp r0, #0 - beq _0230AF1C - mov r0, sl - mov r1, sb - mov r2, r4, lsl #0x10 - mov r2, r2, asr #0x10 - bl GhostImmunityIsActive - cmp r0, #0 - beq _0230AF1C - ldr r0, _0230B798 ; =DUNGEON_PTR - mov r5, #0 - ldr r1, [r0] - mov r0, #1 - strb r0, [r1, #0x1d4] - b _0230AF38 -_0230AF1C: - mov r0, sl - mov r1, sb - mov r2, r4, lsl #0x10 - mov r2, r2, asr #0x10 - mov r3, r8 - bl GetTypeMatchup - mov r5, r0 -_0230AF38: - mov r0, sl - mov r1, #0x3b - bl IqSkillIsEnabled - cmp r0, #0 - beq _0230AF64 - add r2, sp, #0x44 - mov r0, fp - mov r1, fp - add r2, r2, r5, lsl #3 - bl MultiplyFixedPoint64 - b _0230AF80 -_0230AF64: - cmp r5, #2 - beq _0230AF80 - add r2, sp, #0x44 - mov r0, fp - mov r1, fp - add r2, r2, r5, lsl #3 - bl MultiplyFixedPoint64 -_0230AF80: - add r0, sp, #0x34 - str r5, [r0, r4, lsl #2] - add r4, r4, #1 -_0230AF8C: - cmp r4, #2 - blt _0230AE28 -_0230AF94: - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r4, [sp, #0x34] - ldr r2, [r0] - ldr r1, _0230B79C ; =TYPE_MATCHUP_COMBINATOR_TABLE - strb r4, [r2, #0x18c] - ldr r3, [sp, #0x38] - ldr r2, [r0] - add r1, r1, r4, lsl #4 - ldr r0, [r1, r3, lsl #2] - strb r3, [r2, #0x18d] - cmp r0, #3 - str r0, [r7, #8] - moveq r4, #1 - beq _0230AFEC - ldr r0, [sp, #0x30] - mov r4, #0 - cmp r0, #0 - ldrne r0, _0230B774 ; =ov29_02352838 - ldrne r1, [r0, #0x3c] - ldrne r0, [r0, #0x40] - strne r1, [fp] - strne r0, [fp, #4] -_0230AFEC: - mov r0, sl - mov r1, #0x50 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B02C - ldr r0, [r7, #8] - cmp r0, #1 - bne _0230B02C - ldr r1, _0230B7A0 ; =TINTED_LENS_MULTIPLIER - add r0, sp, #0x3c - ldr r1, [r1] - bl FixedPoint32To64 - add r2, sp, #0x3c - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 -_0230B02C: - mov r0, sl - mov r1, sb - mov r2, #0x6c -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - bne _0230B064 - mov r0, sl - mov r1, sb - mov r2, #0x6e -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230B080 -_0230B064: - ldr r0, [r7, #8] - cmp r0, #3 - bne _0230B080 - ldr r2, _0230B7A4 ; =SOLID_ROCK_MULTIPLIER - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 -_0230B080: - mov r0, sb - mov r1, #0x5a - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _0230B0A4 - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 -_0230B0A4: - ldr r0, [sp, #0x90] - cmp r0, #0 - bne _0230B104 - mov r0, sl - mov r1, #0x64 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B104 - ldr r0, _0230B7AC ; =TECHNICIAN_MOVE_POWER_THRESHOLD - ldrsh r1, [r0] - ldr r0, [sp, #4] - cmp r0, r1 - bgt _0230B104 - ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 - mov r1, #0x64 - ldr r2, _0230B7B4 ; =0x00000C3E - mov r0, sl - str r1, [sp] - mov r1, sb - mov r3, #2 - bl LogMessageByIdWithPopupCheckParticipants -_0230B104: - cmp r8, #2 - cmpne r8, #6 - bne _0230B14C - mov r0, sl - mov r1, sb - mov r2, #2 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230B14C - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - ldr r3, [r0] - mov r5, #1 - mov r0, fp - mov r1, fp - strb r5, [r3, #0x1c5] - bl MultiplyFixedPoint64 -_0230B14C: - cmp r8, #2 - bne _0230B198 - mov r0, sl - mov r1, sb - bl FlashFireShouldActivate - cmp r0, #0 - beq _0230B198 - ldr r1, _0230B798 ; =DUNGEON_PTR - mov r0, fp - ldr r2, [r1] - mov r3, #1 - mov r1, #0 - strb r3, [r2, #0x1c6] - bl IntToFixedPoint64 - mov r4, #0 - str r4, [r7, #8] - strb r4, [r7, #0xe] - mov r0, #1 - strb r0, [r7, #0xf] -_0230B198: - cmp r8, #2 - bne _0230B1DC - mov r0, sl - mov r1, sb - mov r2, #0x5f -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230B1DC - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - ldr r3, [r0] - mov r5, #1 - mov r0, fp - mov r1, fp - strb r5, [r3, #0x1c5] - bl MultiplyFixedPoint64 -_0230B1DC: - cmp r8, #9 - bne _0230B248 - mov r0, sl - mov r1, #0x53 - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _0230B208 - mov r0, sb - bl LevitateIsActive - cmp r0, #0 - bne _0230B218 -_0230B208: - mov r0, sb - bl IsFloating - cmp r0, #0 - beq _0230B248 -_0230B218: - ldr r1, _0230B798 ; =DUNGEON_PTR - mov r0, fp - ldr r2, [r1] - mov r3, #1 - mov r1, #0 - strb r3, [r2, #0x1c7] - bl IntToFixedPoint64 - mov r4, #0 - str r4, [r7, #8] - strb r4, [r7, #0xe] - mov r0, #1 - strb r0, [r7, #0xf] -_0230B248: - cmp r8, #3 - bne _0230B2F4 - mov r0, sl - mov r1, #0x10 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B2F4 - ldrsh r2, [r6, #0x12] - ldrsh r1, [r6, #0x16] - ldr r0, _0230B7B8 ; =0x000003E7 - add r2, r2, r1 - cmp r2, r0 - movgt r2, r0 - mov r0, r2, asr #1 - ldrsh r1, [r6, #0x10] - add r0, r2, r0, lsr #30 - cmp r1, r0, asr #2 - movle r0, #1 - movgt r0, #0 - and r7, r0, #0xff - mov r0, r6 - mov r2, r7 - mov r1, #0x80 - bl UpdateStateFlags - mov r5, r0 - cmp r7, #0 - beq _0230B2D4 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1c8] - bl MultiplyFixedPoint64 -_0230B2D4: - cmp r5, #0 - beq _0230B2F4 - mov r0, sl - bl PlayEffectAnimation0x1A9__022E6214 - ldr r2, _0230B7C0 ; =0x00000C4F - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_0230B2F4: - cmp r8, #4 - bne _0230B3A0 - mov r0, sl - mov r1, #0x1a - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B3A0 - ldrsh r2, [r6, #0x12] - ldrsh r1, [r6, #0x16] - ldr r0, _0230B7B8 ; =0x000003E7 - add r2, r2, r1 - cmp r2, r0 - movgt r2, r0 - mov r0, r2, asr #1 - ldrsh r1, [r6, #0x10] - add r0, r2, r0, lsr #30 - cmp r1, r0, asr #2 - movle r0, #1 - movgt r0, #0 - and r7, r0, #0xff - mov r0, r6 - mov r2, r7 - mov r1, #2 - bl UpdateStateFlags - mov r5, r0 - cmp r7, #0 - beq _0230B380 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1c9] - bl MultiplyFixedPoint64 -_0230B380: - cmp r5, #0 - beq _0230B3A0 - mov r0, sl - bl PlayEffectAnimation0x1A9__022E61C8 -#ifdef JAPAN - ldr r2, _0230CD24 ; =0x0000098F - mov r0, sl - mov r1, sb -#else - mov r0, sl - mov r1, sb - mov r2, #0xc50 -#endif - bl LogMessageByIdWithPopupCheckUserTarget -_0230B3A0: - cmp r8, #0xc - bne _0230B44C - mov r0, sl - mov r1, #0x43 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B44C - ldrsh r2, [r6, #0x12] - ldrsh r1, [r6, #0x16] - ldr r0, _0230B7B8 ; =0x000003E7 - add r2, r2, r1 - cmp r2, r0 - movgt r2, r0 - mov r0, r2, asr #1 - ldrsh r1, [r6, #0x10] - add r0, r2, r0, lsr #30 - cmp r1, r0, asr #2 - movle r0, #1 - movgt r0, #0 - and r7, r0, #0xff - mov r0, r6 - mov r2, r7 - mov r1, #0x10 - bl UpdateStateFlags - mov r5, r0 - cmp r7, #0 - beq _0230B42C - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1ca] - bl MultiplyFixedPoint64 -_0230B42C: - cmp r5, #0 - beq _0230B44C - mov r0, sl - bl PlayEffectAnimation0x1A9__022E64C4 -#ifdef JAPAN - mov r0, sl - mov r1, sb - mov r2, #0x990 -#else - ldr r2, _0230B7C4 ; =0x00000C51 - mov r0, sl - mov r1, sb -#endif - bl LogMessageByIdWithPopupCheckUserTarget -_0230B44C: - cmp r8, #2 - bne _0230B534 - mov r0, sl - mov r1, #0x46 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B4F8 - ldrsh r2, [r6, #0x12] - ldrsh r1, [r6, #0x16] - ldr r0, _0230B7B8 ; =0x000003E7 - add r2, r2, r1 - cmp r2, r0 - movgt r2, r0 - mov r0, r2, asr #1 - ldrsh r1, [r6, #0x10] - add r0, r2, r0, lsr #30 - cmp r1, r0, asr #2 - movle r0, #1 - movgt r0, #0 - and r7, r0, #0xff - mov r0, r6 - mov r2, r7 - mov r1, #0x20 - bl UpdateStateFlags - mov r5, r0 - cmp r7, #0 - beq _0230B4D8 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1cb] - bl MultiplyFixedPoint64 -_0230B4D8: - cmp r5, #0 - beq _0230B4F8 - mov r0, sl - bl PlayEffectAnimation0x1A9__022E6510 - ldr r2, _0230B7C8 ; =0x00000C52 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_0230B4F8: - mov r0, sl - mov r1, sb - mov r2, #0x55 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230B534 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 - ldr r3, [r0] - mov r5, #1 - mov r0, fp - mov r1, fp - strb r5, [r3, #0x1cb] - bl MultiplyFixedPoint64 -_0230B534: - ldrb r0, [r6, #0xbf] - cmp r0, #1 - bne _0230B560 - ldr r1, _0230B7CC ; =BURN_DAMAGE_MULTIPLIER - add r0, sp, #0x3c - ldr r1, [r1] - bl FixedPoint32To64 - add r2, sp, #0x3c - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 -_0230B560: - mov r0, fp - bl FixedPoint64IsZero - cmp r0, #0 - bne _0230B5CC - mov r0, sl - mov r1, r8 - bl MonsterIsType - cmp r0, #0 - beq _0230B5CC - ldr r1, _0230B798 ; =DUNGEON_PTR - mov r0, sl - ldr r2, [r1] - mov r3, #1 - mov r1, #0x63 - strb r3, [r2, #0x1cf] - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B5BC - ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 - b _0230B5CC -_0230B5BC: - ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 -_0230B5CC: - mov r0, sl - bl GetApparentWeather - mov r5, r0 - cmp r5, #1 - bne _0230B634 - cmp r8, #2 - bne _0230B60C - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1c4] - bl MultiplyFixedPoint64 - b _0230B634 -_0230B60C: - cmp r8, #3 - bne _0230B634 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1c4] - bl MultiplyFixedPoint64 -_0230B634: - cmp r5, #4 - bne _0230B690 - cmp r8, #2 - bne _0230B668 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1c3] - bl MultiplyFixedPoint64 - b _0230B690 -_0230B668: - cmp r8, #3 - bne _0230B690 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1c3] - bl MultiplyFixedPoint64 -_0230B690: - cmp r5, #3 - bne _0230B6C0 - cmp r8, #1 - beq _0230B6C0 - ldr r2, _0230B7D0 ; =CLOUDY_DAMAGE_MULTIPLIER - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 - ldr r0, _0230B798 ; =DUNGEON_PTR - mov r1, #1 - ldr r0, [r0] - strb r1, [r0, #0x1c2] -_0230B6C0: - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r7, [r0] - add r0, r7, #0xc000 -#ifdef JAPAN - ldrb r0, [r0, #0xcb7] -#else - ldrb r0, [r0, #0xd5b] -#endif - cmp r0, #0 - bne _0230B6E0 - cmp r5, #6 - bne _0230B700 -_0230B6E0: - cmp r8, #5 - bne _0230B700 - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - mov r3, #1 - mov r0, fp - mov r1, fp - strb r3, [r7, #0x1d0] - bl MultiplyFixedPoint64 -_0230B700: - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r5, [r0] - add r0, r5, #0xc000 -#ifdef JAPAN - ldrb r0, [r0, #0xcb8] -#else - ldrb r0, [r0, #0xd5c] -#endif - cmp r0, #0 - beq _0230B738 - cmp r8, #2 - bne _0230B738 - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - mov r3, #1 - mov r0, fp - mov r1, fp - strb r3, [r5, #0x1d1] - bl MultiplyFixedPoint64 -_0230B738: - cmp r8, #5 - ldreqb r0, [r6, #0xd2] - cmpeq r0, #0xb - bne _0230B768 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 - ldr r3, [r0] - mov r5, #1 - mov r0, fp - mov r1, fp - strb r5, [r3, #0x1d2] - bl MultiplyFixedPoint64 -_0230B768: - mov r0, r4 -_0230B76C: - add sp, sp, #0x64 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -#define CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET -0x2C1 -#else -#define CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET 0 -#endif -_0230B774: .word ov29_02352838 -_0230B778: .word MATCHUP_IMMUNE_MULTIPLIER_ERRATIC_PLAYER -_0230B77C: .word MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER -_0230B780: .word MATCHUP_NEUTRAL_MULTIPLIER_ERRATIC_PLAYER -_0230B784: .word MATCHUP_IMMUNE_MULTIPLIER -_0230B788: .word MATCHUP_SUPER_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER -_0230B78C: .word MATCHUP_NEUTRAL_MULTIPLIER -_0230B790: .word MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER -_0230B794: .word MATCHUP_SUPER_EFFECTIVE_MULTIPLIER -_0230B798: .word DUNGEON_PTR -_0230B79C: .word TYPE_MATCHUP_COMBINATOR_TABLE -_0230B7A0: .word TINTED_LENS_MULTIPLIER -_0230B7A4: .word SOLID_ROCK_MULTIPLIER -_0230B7A8: .word DAMAGE_MULTIPLIER_0_5 -_0230B7AC: .word TECHNICIAN_MOVE_POWER_THRESHOLD -_0230B7B0: .word DAMAGE_MULTIPLIER_1_5 -_0230B7B4: .word 0x00000C3E + CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET -_0230B7B8: .word 0x000003E7 -_0230B7BC: .word DAMAGE_MULTIPLIER_2 -_0230B7C0: .word 0x00000C4F + CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET -#ifdef JAPAN -_0230CD24: .word 0x0000098F -#else -_0230B7C4: .word 0x00000C51 -#endif -_0230B7C8: .word 0x00000C52 + CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET -_0230B7CC: .word BURN_DAMAGE_MULTIPLIER -_0230B7D0: .word CLOUDY_DAMAGE_MULTIPLIER - arm_func_end CalcTypeBasedDamageEffects diff --git a/include/dungeon_mode.h b/include/dungeon_mode.h index aabdd176..e33ce6c4 100644 --- a/include/dungeon_mode.h +++ b/include/dungeon_mode.h @@ -1166,6 +1166,9 @@ struct damage_calc_diag { u8 field_0x2; u8 field_0x3; enum move_category move_category; // 0x4: The category of the last move used + u8 field_0x5; + u8 field_0x6; + u8 field_0x7; // 0x8: The type matchup of the last move used against the individual types of the defender enum type_matchup move_indiv_type_matchups[2]; // 0xA: The modified offensive stat stage of the attacker for the last move used diff --git a/include/type_effectiveness.h b/include/type_effectiveness.h index f75b9448..6a8d8477 100644 --- a/include/type_effectiveness.h +++ b/include/type_effectiveness.h @@ -2,7 +2,9 @@ #define PMDSKY_TYPE_EFFECTIVENESS_H #include "dungeon_mode.h" +#include "overlay_29_02308FBC.h" s16 GetTypeMatchup(struct entity *attacker, struct entity *defender, s16 target_type_idx, enum type_id attack_type); +int CalcTypeBasedDamageEffects(struct fixed_point_64 *out, struct entity *attacker, struct entity *defender, s32 power, enum type_id attack_type, struct unk_02308FE0 *damage_data, bool8 is_projectile); #endif //PMDSKY_TYPE_EFFECTIVENESS_H diff --git a/main.lsf b/main.lsf index 11a88e68..c043d8c0 100644 --- a/main.lsf +++ b/main.lsf @@ -975,7 +975,6 @@ Overlay OVY_29 Object src/overlay_29_0230AB58.o Object asm/overlay_29_0230ABF0.o Object src/type_effectiveness.o - Object asm/overlay_29_0230AD04.o Object src/dungeon_damage.o Object asm/overlay_29_rodata_02352894.o Object asm/overlay_29_0230BBAC.o diff --git a/src/type_effectiveness.c b/src/type_effectiveness.c index 4166505f..38da123a 100644 --- a/src/type_effectiveness.c +++ b/src/type_effectiveness.c @@ -1,9 +1,63 @@ #include "type_effectiveness.h" +#include "dungeon_logic_3.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_pokemon_attributes_1.h" #include "dungeon_util_static.h" +#include "main_02001BB4.h" +#include "main_02001CD4.h" +#include "move_orb_effects.h" #include "overlay_29_0230A994.h" +#include "overlay_29_0230AB58.h" #include "overlay_29_02318A4C.h" #include "overlay_29_0233836C.h" #include "type_matchup_table.h" +#include "weather.h" + +extern struct dungeon *DUNGEON_PTR; + +extern bool8 UpdateStateFlags(struct monster *info, s32 flag, bool8 value); +extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); +extern void LogMessageByIdWithPopupCheckParticipants(struct entity *user, struct entity *target, u32 message_id, s32 a4, s32 a5); +extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); +extern bool8 GhostImmunityIsActive(struct entity *attacker, struct entity *defender, s16 target_type_idx); +extern bool8 IsTypeIneffectiveAgainstGhost(enum type_id type); +extern void PlayEffectAnimation0x1A9__022E61C8(struct entity *entity); +extern void PlayEffectAnimation0x1A9__022E6214(struct entity *entity); +extern void PlayEffectAnimation0x1A9__022E64C4(struct entity *entity); +extern void PlayEffectAnimation0x1A9__022E6510(struct entity *entity); + +extern const s32 ov29_02352838[]; +extern const struct fixed_point_64 DAMAGE_MULTIPLIER_0_5; +extern const struct fixed_point_64 DAMAGE_MULTIPLIER_1_5; +extern const struct fixed_point_64 DAMAGE_MULTIPLIER_2; +extern const struct fixed_point_64 CLOUDY_DAMAGE_MULTIPLIER; +extern const struct fixed_point_64 SOLID_ROCK_MULTIPLIER; +extern const s32 MATCHUP_IMMUNE_MULTIPLIER; +extern const s32 MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER; +extern const s32 MATCHUP_NEUTRAL_MULTIPLIER; +extern const s32 MATCHUP_SUPER_EFFECTIVE_MULTIPLIER; +extern const s32 MATCHUP_IMMUNE_MULTIPLIER_ERRATIC_PLAYER; +extern const s32 MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER; +extern const s32 MATCHUP_NEUTRAL_MULTIPLIER_ERRATIC_PLAYER; +extern const s32 MATCHUP_SUPER_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER; +extern const s32 TINTED_LENS_MULTIPLIER; +extern const s32 BURN_DAMAGE_MULTIPLIER; +extern const s16 TECHNICIAN_MOVE_POWER_THRESHOLD; +extern const s32 TYPE_MATCHUP_COMBINATOR_TABLE[4][4]; + +#ifdef JAPAN +#define MESSAGE_C3E 0x97D +#define MESSAGE_C4F 0x98E +#define MESSAGE_C50 0x98F +#define MESSAGE_C51 0x990 +#define MESSAGE_C52 0x991 +#else +#define MESSAGE_C3E 0xC3E +#define MESSAGE_C4F 0xC4F +#define MESSAGE_C50 0xC50 +#define MESSAGE_C51 0xC51 +#define MESSAGE_C52 0xC52 +#endif s16 GetTypeMatchup(struct entity *attacker, struct entity *defender, s16 target_type_idx, enum type_id attack_type) { @@ -24,3 +78,288 @@ s16 GetTypeMatchup(struct entity *attacker, struct entity *defender, s16 target_ return TYPE_MATCHUP_TABLE.matchups[attack_type][defender_monster->types[target_type_idx]]; } + +int CalcTypeBasedDamageEffects(struct fixed_point_64 *out, struct entity *attacker, + struct entity *defender, s32 power, + enum type_id attack_type, + struct unk_02308FE0 *damage_data, bool8 is_projectile) +{ + struct fixed_point_64 matchup_mult[4]; + struct fixed_point_64 tmp; + s32 matchups[2]; + struct monster *info; + enum weather_id weather; + s16 wonder_guard; + bool8 ghost_ineffective; + bool8 scrappy; + s32 result; + s32 i; + s32 matchup; + s32 max_hp; + bool8 low_hp; + bool8 announce; + + info = GetEntInfo(attacker); + matchups[0] = ov29_02352838[7]; + matchups[1] = ov29_02352838[8]; + IntToFixedPoint64(out, 1); + wonder_guard = FALSE; + damage_data->field_0xe = FALSE; + damage_data->field_0xf = FALSE; + if (!EntityIsValid__02308FBC(defender)) { + return TRUE; + } + + ghost_ineffective = IsTypeIneffectiveAgainstGhost(attack_type); +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_WONDER_GUARD) + && attack_type != TYPE_NONE) { +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_WONDER_GUARD, TRUE) + && attack_type != TYPE_NONE) { +#endif + wonder_guard = TRUE; + } + damage_data->field_0x8 = MATCHUP_NEUTRAL; + scrappy = ScrappyShouldActivate(attacker, defender, attack_type); + + for (i = 0; i < 2; i++) { + if (!is_projectile + && (IqSkillIsEnabled(attacker, IQ_ERRATIC_PLAYER) + || IqSkillIsEnabled(defender, IQ_ERRATIC_PLAYER))) { + FixedPoint32To64(&matchup_mult[0], MATCHUP_IMMUNE_MULTIPLIER_ERRATIC_PLAYER); + FixedPoint32To64(&matchup_mult[1], MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER); + FixedPoint32To64(&matchup_mult[2], MATCHUP_NEUTRAL_MULTIPLIER_ERRATIC_PLAYER); + FixedPoint32To64(&matchup_mult[3], MATCHUP_SUPER_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER); + } else { + FixedPoint32To64(&matchup_mult[0], MATCHUP_IMMUNE_MULTIPLIER); + FixedPoint32To64(&matchup_mult[1], MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER); + FixedPoint32To64(&matchup_mult[2], MATCHUP_NEUTRAL_MULTIPLIER); + FixedPoint32To64(&matchup_mult[3], MATCHUP_SUPER_EFFECTIVE_MULTIPLIER); + } + if (FixedPoint64IsZero(out)) { + break; + } + if (!scrappy && ghost_ineffective + && GhostImmunityIsActive(attacker, defender, i)) { + DUNGEON_PTR->last_damage_calc.ghost_immunity_activated = TRUE; + matchup = MATCHUP_IMMUNE; + } else { + matchup = GetTypeMatchup(attacker, defender, i, attack_type); + } + if (IqSkillIsEnabled(attacker, IQ_ERRATIC_PLAYER)) { + MultiplyFixedPoint64(out, out, &matchup_mult[matchup]); + } else if (matchup != MATCHUP_NEUTRAL) { + MultiplyFixedPoint64(out, out, &matchup_mult[matchup]); + } + matchups[i] = matchup; + } + + DUNGEON_PTR->last_damage_calc.move_indiv_type_matchups[0] = (enum type_matchup)matchups[0]; + DUNGEON_PTR->last_damage_calc.move_indiv_type_matchups[1] = (enum type_matchup)matchups[1]; + matchup = TYPE_MATCHUP_COMBINATOR_TABLE[matchups[0]][matchups[1]]; + damage_data->field_0x8 = matchup; + if (matchup == MATCHUP_SUPER_EFFECTIVE) { + result = TRUE; + } else { + result = FALSE; + if (wonder_guard) { + *out = *(const struct fixed_point_64 *)&ov29_02352838[15]; + } + } + + if (AbilityIsActiveVeneer(attacker, ABILITY_TINTED_LENS) + && damage_data->field_0x8 == MATCHUP_NOT_VERY_EFFECTIVE) { + FixedPoint32To64(&tmp, TINTED_LENS_MULTIPLIER); + MultiplyFixedPoint64(out, out, &tmp); + } + +#ifdef JAPAN + if ((DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_SOLID_ROCK) + || DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_FILTER)) + && damage_data->field_0x8 == MATCHUP_SUPER_EFFECTIVE) { +#else + if ((DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_SOLID_ROCK, TRUE) + || DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_FILTER, TRUE)) + && damage_data->field_0x8 == MATCHUP_SUPER_EFFECTIVE) { +#endif + MultiplyFixedPoint64(out, out, &SOLID_ROCK_MULTIPLIER); + } + + if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_HALVED_DAMAGE)) { + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_0_5); + } + + if (!is_projectile && AbilityIsActiveVeneer(attacker, ABILITY_TECHNICIAN) + && power <= TECHNICIAN_MOVE_POWER_THRESHOLD) { + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_1_5); + LogMessageByIdWithPopupCheckParticipants(attacker, defender, MESSAGE_C3E, 2, ABILITY_TECHNICIAN); + } + +#ifdef JAPAN + if ((attack_type == TYPE_FIRE || attack_type == TYPE_ICE) + && DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_THICK_FAT)) { +#else + if ((attack_type == TYPE_FIRE || attack_type == TYPE_ICE) + && DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_THICK_FAT, TRUE)) { +#endif + DUNGEON_PTR->last_damage_calc.fire_move_ability_drop_activated = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_0_5); + } + + if (attack_type == TYPE_FIRE && FlashFireShouldActivate(attacker, defender) != FLASH_FIRE_STATUS_NONE) { + DUNGEON_PTR->last_damage_calc.flash_fire_activated = TRUE; + IntToFixedPoint64(out, 0); + result = FALSE; + damage_data->field_0x8 = MATCHUP_IMMUNE; + damage_data->field_0xe = FALSE; + damage_data->field_0xf = TRUE; + } + +#ifdef JAPAN + if (attack_type == TYPE_FIRE + && DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_HEATPROOF)) { +#else + if (attack_type == TYPE_FIRE + && DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_HEATPROOF, TRUE)) { +#endif + DUNGEON_PTR->last_damage_calc.fire_move_ability_drop_activated = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_0_5); + } + + if (attack_type == TYPE_GROUND + && ((!AbilityIsActiveVeneer(attacker, ABILITY_MOLD_BREAKER) && LevitateIsActive(defender)) + || IsFloating(defender))) { + DUNGEON_PTR->last_damage_calc.levitate_activated = TRUE; + IntToFixedPoint64(out, 0); + result = FALSE; + damage_data->field_0x8 = MATCHUP_IMMUNE; + damage_data->field_0xe = FALSE; + damage_data->field_0xf = TRUE; + } + + if (attack_type == TYPE_WATER && AbilityIsActiveVeneer(attacker, ABILITY_TORRENT)) { + max_hp = MIN(info->max_hp_stat + info->max_hp_boost, MAX_HP_LIMIT); + low_hp = max_hp / 4 >= info->hp; + announce = UpdateStateFlags(info, 0x80, low_hp); + if (low_hp) { + DUNGEON_PTR->last_damage_calc.torrent_boost_activated = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_2); + } + if (announce) { + PlayEffectAnimation0x1A9__022E6214(attacker); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C4F); + } + } + + if (attack_type == TYPE_GRASS && AbilityIsActiveVeneer(attacker, ABILITY_OVERGROW)) { + max_hp = MIN(info->max_hp_stat + info->max_hp_boost, MAX_HP_LIMIT); + low_hp = max_hp / 4 >= info->hp; + announce = UpdateStateFlags(info, 2, low_hp); + if (low_hp) { + DUNGEON_PTR->last_damage_calc.overgrow_boost_activated = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_2); + } + if (announce) { + PlayEffectAnimation0x1A9__022E61C8(attacker); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C50); + } + } + + if (attack_type == TYPE_BUG && AbilityIsActiveVeneer(attacker, ABILITY_SWARM)) { + max_hp = MIN(info->max_hp_stat + info->max_hp_boost, MAX_HP_LIMIT); + low_hp = max_hp / 4 >= info->hp; + announce = UpdateStateFlags(info, 0x10, low_hp); + if (low_hp) { + DUNGEON_PTR->last_damage_calc.swarm_boost_activated = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_2); + } + if (announce) { + PlayEffectAnimation0x1A9__022E64C4(attacker); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C51); + } + } + + if (attack_type == TYPE_FIRE) { + if (AbilityIsActiveVeneer(attacker, ABILITY_BLAZE)) { + max_hp = MIN(info->max_hp_stat + info->max_hp_boost, MAX_HP_LIMIT); + low_hp = max_hp / 4 >= info->hp; + announce = UpdateStateFlags(info, 0x20, low_hp); + if (low_hp) { + DUNGEON_PTR->last_damage_calc.fire_move_ability_boost_activated = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_2); + } + if (announce) { + PlayEffectAnimation0x1A9__022E6510(attacker); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C52); + } + } +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_DRY_SKIN)) { +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_DRY_SKIN, TRUE)) { +#endif + DUNGEON_PTR->last_damage_calc.fire_move_ability_boost_activated = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_1_5); + } + } + + if (info->burn_class_status.burn == STATUS_BURN_BURN) { + FixedPoint32To64(&tmp, BURN_DAMAGE_MULTIPLIER); + MultiplyFixedPoint64(out, out, &tmp); + } + + if (!FixedPoint64IsZero(out) && MonsterIsType(attacker, attack_type)) { + DUNGEON_PTR->last_damage_calc.stab_boost_activated = TRUE; + if (AbilityIsActiveVeneer(attacker, ABILITY_ADAPTABILITY)) { + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_2); + } else { + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_1_5); + } + } + + weather = GetApparentWeather(attacker); + if (weather == WEATHER_SUNNY) { + if (attack_type == TYPE_FIRE) { + DUNGEON_PTR->last_damage_calc.sunny_multiplier_activated = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_1_5); + } else if (attack_type == TYPE_WATER) { + DUNGEON_PTR->last_damage_calc.sunny_multiplier_activated = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_0_5); + } + } + + if (weather == WEATHER_RAIN) { + if (attack_type == TYPE_FIRE) { + DUNGEON_PTR->last_damage_calc.rain_multiplier_activated = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_0_5); + } else if (attack_type == TYPE_WATER) { + DUNGEON_PTR->last_damage_calc.rain_multiplier_activated = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_1_5); + } + } + + if (weather == WEATHER_CLOUDY && attack_type != TYPE_NORMAL) { + MultiplyFixedPoint64(out, out, &CLOUDY_DAMAGE_MULTIPLIER); + DUNGEON_PTR->last_damage_calc.cloudy_drop_activated = TRUE; + } + + if ((DUNGEON_PTR->weather.mud_sport_turns != 0 || weather == WEATHER_FOG) + && attack_type == TYPE_ELECTRIC) { + DUNGEON_PTR->last_damage_calc.electric_move_dampened = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_0_5); + } + + if (DUNGEON_PTR->weather.water_sport_turns != 0 && attack_type == TYPE_FIRE) { + DUNGEON_PTR->last_damage_calc.water_sport_drop_activated = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_0_5); + } + + if (attack_type == TYPE_ELECTRIC + && info->bide_class_status.bide == STATUS_TWO_TURN_CHARGING) { + DUNGEON_PTR->last_damage_calc.charge_boost_activated = TRUE; + MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_2); + } + + return result; +} From 765335089622dad3ef8d307cf4672b5014f8daa3 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sat, 5 Sep 2026 23:53:28 -0700 Subject: [PATCH 06/34] Decomp CalcDamage; damage_calc_diag's move_category is 4 bytes, its modifiers unsigned CalcDamage (0x0230BBAC, 1290 instructions) is the damage formula: stat stages, item/ability/IQ-skill modifiers, the fixed-point base formula, CalcTypeBasedDamageEffects, critical hits, Reflect/Light Screen and the final multipliers, with its diagnostics in DUNGEON_PTR->last_damage_calc. It is the first of 26 functions in asm/overlay_29_0230BBAC.s and a rodata object precedes that object in main.lsf, so extract_function.py splits rather than merges: the function lands in src/overlay_29_0230BBAC.c with include/overlay_29_0230BBAC.h, the other 25 move to asm/overlay_29_0230D088.{s,inc}, and main.lsf lists both objects where it listed one. struct damage_calc_diag modelled move_category as a 1-byte enum plus field_0x5/0x6/0x7 padding (3fc6d8bd). Retail writes that field with a 4-byte str (0x0230BDC8) and reads the eight modifier bytes at 0x30..0x37 unsigned (ldrb at 24 sites), so move_category becomes s32 - the struct stays 0x54 bytes - and the modifiers become u8 (they were s8). No other source in the tree reads these members. Both deviate from pmdsky-debug's declarations; the reasoning note linked from the PR has the evidence. Region handling follows the neighbouring files: six DefenderAbilityIsActive__0230A940 calls take three arguments under JAPAN, and message ids C53/C54/C55/C57/C58 and DC1 are file-scope defines at US - 0x2C1 under JAPAN. One difference is real source: the defense-side apparent_id 0x211/0x218 checks compare the attacker's apparent_id under JAPAN (the JP-only ldrsh r1, [r6, #4]). EU is identical to US. The 17 callees that are still asm are declared extern in the .c with prototypes read off their own asm, as the sibling files do. The spelling of the ability-multiply block (an s32 calc[2] local, two temps and three volatile s32 * pointers) is match-derived, each element removing one measured compiler obstacle; the reasoning note explains it. Authored by Claude (Fable 5.1) under human direction. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK, each also passing main.sha1, filesystem.sha1 and arm7.sha1. Co-Authored-By: Claude Fable 5.1 --- asm/include/overlay_29_0230BBAC.inc | 100 -- asm/include/overlay_29_0230D088.inc | 37 + asm/overlay_29_0230BBAC.s | 2286 --------------------------- asm/overlay_29_0230D088.s | 845 ++++++++++ include/dungeon_mode.h | 21 +- include/overlay_29_0230BBAC.h | 12 + main.lsf | 3 +- src/overlay_29_0230BBAC.c | 734 +++++++++ 8 files changed, 1639 insertions(+), 2399 deletions(-) delete mode 100644 asm/include/overlay_29_0230BBAC.inc create mode 100644 asm/include/overlay_29_0230D088.inc delete mode 100644 asm/overlay_29_0230BBAC.s create mode 100644 asm/overlay_29_0230D088.s create mode 100644 include/overlay_29_0230BBAC.h create mode 100644 src/overlay_29_0230BBAC.c diff --git a/asm/include/overlay_29_0230BBAC.inc b/asm/include/overlay_29_0230BBAC.inc deleted file mode 100644 index 6f8c9e94..00000000 --- a/asm/include/overlay_29_0230BBAC.inc +++ /dev/null @@ -1,100 +0,0 @@ -#pragma once -.public _s32_div_f -.public AbilityIsActiveVeneer -.public AddFixedPoint64 -.public AdvanceFrame -.public AIR_BLADE_DAMAGE_MULTIPLIER -.public ApplyDamageAndEffects -.public AURA_BOW_STAT_BOOST -.public AuraBowIsActive -.public CalcTypeBasedDamageEffects -.public CeilFixedPoint -.public ClampedLn -.public CreateTemporaryEntity -.public DAMAGE_FORMULA_AT_PREFACTOR -.public DAMAGE_FORMULA_CONSTANT_SHIFT -.public DAMAGE_FORMULA_DEF_PREFACTOR -.public DAMAGE_FORMULA_FLV_DEFICIT_DIVISOR -.public DAMAGE_FORMULA_FLV_SHIFT -.public DAMAGE_FORMULA_LN_ARG_PREFACTOR -.public DAMAGE_FORMULA_LN_PREFACTOR -.public DAMAGE_FORMULA_MAX_BASE -.public DAMAGE_FORMULA_MIN_BASE -.public DAMAGE_FORMULA_NON_TEAM_MEMBER_MODIFIER -.public DAMAGE_MULTIPLIER_0_5 -.public DAMAGE_MULTIPLIER_1_5 -.public DAMAGE_MULTIPLIER_2 -.public Debug_Print0 -.public DEF_SCARF_STAT_BOOST -.public DefenderAbilityIsActive__0230A940 -.public DEFENSIVE_STAT_STAGE_MULTIPLIERS -.public DivideFixedPoint64 -.public DUNGEON_PTR -.public DungeonRandInt -.public EntityIsValid__02308FBC -.public ExclusiveItemDefenseBoost -.public ExclusiveItemEffectIsActive__0230A9B8 -.public ExclusiveItemEffectIsActiveWithLogging -.public ExclusiveItemOffenseBoost -.public FixedPoint32To64 -.public FixedPoint64CmpLt -.public FixedPoint64ToInt -.public FixedRoomIsSubstituteRoom -.public FlashFireShouldActivate -.public GendersEqualNotGenderless -.public GendersNotEqualNotGenderless -.public GenerateStandardItem -.public GetApparentWeather -.public GetEquivItemIndex -.public GetItemAtIdx -.public GetMonsterGenderVeneer -.public GetMoveCategory -.public GetTypeMatchup -.public IntToFixedPoint64 -.public IqSkillIsEnabled -.public IsMonster__0230A994 -.public IsPunchMove -.public IsRecoilMove -.public IsRegularAttackOrProjectile -.public ItemIsActive__0230A9DC -.public LogMessageByIdWithPopupCheckUserTarget -.public ME_FIRST_MULTIPLIER -.public MemZero -.public MonsterHasNegativeStatus -.public MonsterIsType -.public MoveIsNotPhysical -.public MultiplyByFixedPoint -.public MultiplyFixedPoint64 -.public MUNCH_BELT_STAT_BOOST -.public NearbyAllyIqSkillIsEnabled -.public OFFENSIVE_STAT_STAGE_MULTIPLIERS -.public OtherMonsterAbilityIsActive -.public ov10_022BF964 -.public ov10_022C45B4 -.public ov29_02352838 -.public ov29_02352894 -.public ov29_02352984 -.public ov29_02352990 -.public ov29_0235299C -.public ov29_023535D4 -.public PlayEffectAnimation0x171 -.public PlayEffectAnimation0x171Full -.public PlayEffectAnimation0x18E -.public PlayEffectAnimation0x1A9__022E6130 -.public PlayEffectAnimation0x1A9__022E617C -.public PlayEffectAnimationEntity -.public PointCameraToMonster -.public POWER_BAND_STAT_BOOST -.public POWER_PITCHER_DAMAGE_MULTIPLIER -.public ResetDamageData -.public RoundUpDiv256 -.public SCOPE_LENS_CRIT_RATE_BOOST -.public SetItemAcquired -.public SPECIAL_BAND_STAT_BOOST -.public SubstitutePlaceholderStringTags -.public SUPER_LUCK_CRIT_RATE_BOOST -.public TerminateEffectWrapper -.public TYPE_ADVANTAGE_MASTER_CRIT_RATE -.public TYPE_MATCHUP_COMBINATOR_TABLE -.public UpdateStateFlags -.public ZINC_BAND_STAT_BOOST diff --git a/asm/include/overlay_29_0230D088.inc b/asm/include/overlay_29_0230D088.inc new file mode 100644 index 00000000..d11911ac --- /dev/null +++ b/asm/include/overlay_29_0230D088.inc @@ -0,0 +1,37 @@ +#pragma once +.public AbilityIsActiveVeneer +.public AdvanceFrame +.public ApplyDamageAndEffects +.public CalcTypeBasedDamageEffects +.public CreateTemporaryEntity +.public DUNGEON_PTR +.public DefenderAbilityIsActive__0230A940 +.public DungeonRandInt +.public EntityIsValid__02308FBC +.public FixedPoint64ToInt +.public GendersNotEqualNotGenderless +.public GenerateStandardItem +.public GetEquivItemIndex +.public GetItemAtIdx +.public GetTypeMatchup +.public IntToFixedPoint64 +.public IqSkillIsEnabled +.public IsMonster__0230A994 +.public LogMessageByIdWithPopupCheckUserTarget +.public MemZero +.public MonsterIsType +.public MultiplyByFixedPoint +.public MultiplyFixedPoint64 +.public POWER_PITCHER_DAMAGE_MULTIPLIER +.public PlayEffectAnimationEntity +.public PointCameraToMonster +.public ResetDamageData +.public RoundUpDiv256 +.public SetItemAcquired +.public SubstitutePlaceholderStringTags +.public TYPE_MATCHUP_COMBINATOR_TABLE +.public TerminateEffectWrapper +.public ov10_022BF964 +.public ov10_022C45B4 +.public ov29_02352894 +.public ov29_023535D4 diff --git a/asm/overlay_29_0230BBAC.s b/asm/overlay_29_0230BBAC.s deleted file mode 100644 index 03cf985c..00000000 --- a/asm/overlay_29_0230BBAC.s +++ /dev/null @@ -1,2286 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0230BBAC.inc" - - .text - - arm_func_start CalcDamage -CalcDamage: ; 0x0230BBAC -#ifdef JAPAN -#define CALC_DAMAGE_OFFSET -4 -#else -#define CALC_DAMAGE_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0xc0 - ldr r4, _0230C450 ; =DUNGEON_PTR - mov sl, r0 - ldr r4, [r4] - ldr r6, [sl, #0xb4] - ldr r8, [sp, #0xec] - str r2, [sp, #0xc] - mov sb, r1 - ldr r1, [sp, #0xf4] - mov r0, r8 - str r1, [sp, #0xf4] - ldr r1, [sp, #0xf8] - str r3, [sp, #0x10] - str r1, [sp, #0xf8] - ldr r1, [sp, #0xf0] - add r5, r4, #0x184 - ldr r7, [sb, #0xb4] - str r1, [sp, #0x1c] - bl ResetDamageData - ldrb r0, [r6, #0x221 + CALC_DAMAGE_OFFSET] - cmp r0, #0 - beq _0230BC1C - ldr r1, _0230C454 ; =ME_FIRST_MULTIPLIER - ldr r0, [sp, #0x1c] - ldr r1, [r1] - bl MultiplyByFixedPoint - str r0, [sp, #0x1c] -_0230BC1C: - mov r0, sl - mov r1, #0x5c - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230BC50 - ldr r0, [sp, #0xf4] - bl IsRecoilMove - cmp r0, #0 - ldrne r0, [sp, #0x1c] - addne r0, r0, r0, lsl #1 - addne r0, r0, r0, lsr #31 - movne r0, r0, asr #1 - strne r0, [sp, #0x1c] -_0230BC50: - mov r0, sl - mov r1, #0x65 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230BC84 - ldr r0, [sp, #0xf4] - bl IsPunchMove - cmp r0, #0 - beq _0230BC84 - ldr r0, [sp, #0x1c] - mov r1, #0x180 - bl MultiplyByFixedPoint - str r0, [sp, #0x1c] -_0230BC84: - mov r0, sl - mov r1, #0x6b - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #1 - strne r0, [sp, #0xc] - ldr r1, _0230C458 ; =0x000001D3 - ldr r0, [sp, #0xf4] - cmp r0, r1 - ldreqb r0, [r6, #0x5e] - streq r0, [sp, #0xc] - ldr r0, [sp, #0xf4] - bl MoveIsNotPhysical - str r0, [sp, #0x18] - bl ResetDamageCalcDiagnostics - ldrb r0, [r6, #7] - cmp r0, #0 - bne _0230BD34 - add r0, r6, #0x100 - ldrh r1, [r0, #0x46 + CALC_DAMAGE_OFFSET] - sub r2, sp, #4 - strh r1, [r2] - ldrh r0, [r0, #0x48 + CALC_DAMAGE_OFFSET] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0 - bne _0230BD34 - mov r0, #1 - str r0, [r8] - mov r0, #0 - str r0, [r8, #4] - mov r0, #2 - str r0, [r8, #8] - ldr r0, [sp, #0xf4] - ldr r1, [sp, #0xc] - strb r1, [r8, #0xc] - bl GetMoveCategory - strb r0, [r8, #0xd] - mov r0, #0 - strb r0, [r8, #0xe] - strb r0, [r8, #0xf] - strb r0, [r8, #0x10] - b _0230D054 -_0230BD34: - ldr r1, _0230C45C ; =0x00000163 - ldr r0, [sp, #0xf4] - cmp r0, r1 - bne _0230BDA0 - mov r0, sl - mov r1, sb - mov r2, #0x35 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230BDA0 - mov r0, #1 - str r0, [r8] - mov r0, #0 - str r0, [r8, #4] - mov r0, #2 - str r0, [r8, #8] - ldr r0, [sp, #0xf4] - ldr r1, [sp, #0xc] - strb r1, [r8, #0xc] - bl GetMoveCategory - strb r0, [r8, #0xd] - mov r0, #0 - strb r0, [r8, #0xe] - strb r0, [r8, #0xf] - strb r0, [r8, #0x10] - b _0230D054 -_0230BDA0: - ldr r0, [sp, #0xf4] - ldr r1, [sp, #0xc] - strb r1, [r8, #0xc] - bl GetMoveCategory - strb r0, [r8, #0xd] - ldr r0, [sp, #0xc] - mov r4, #0 - strb r0, [r5] - ldr r0, [sp, #0x18] - mov r1, #0x60 - str r0, [r5, #4] - add r0, r6, r0, lsl #2 - ldr r0, [r0, #0x34] - mov fp, r4 - str r0, [sp, #0x3c] - ldr r0, [sp, #0x18] - add r0, r7, r0, lsl #2 - ldr r0, [r0, #0x3c] - str r0, [sp, #0x38] - mov r0, sl - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230BE40 - ldrb r1, [r7, #0x1c] - ldrb r0, [r7, #0x1d] - cmp r1, r0 - blo _0230BE28 - ldr r0, [sp, #0x18] - cmp r0, #1 - ldreqb r0, [r5, #0x32] - addeq r4, r4, #1 - addeq r0, r0, #1 - streqb r0, [r5, #0x32] - b _0230BE40 -_0230BE28: - ldr r0, [sp, #0x18] - cmp r0, #0 - ldreqb r0, [r5, #0x32] - addeq r4, r4, #1 - addeq r0, r0, #1 - streqb r0, [r5, #0x32] -_0230BE40: - ldr r0, [sp, #0xf8] - cmp r0, #0 - ldr r0, [sp, #0x18] - add r0, r6, r0, lsl #1 - ldrsh r0, [r0, #0x24] - str r0, [sp, #0x44] - beq _0230BE70 - ldr r0, [sp, #0xc] - cmp r0, #2 - ldreqsh r0, [r6, #0x30] - streqh r0, [r5, #0x10] - addeq r4, r4, r0 -_0230BE70: - mov r0, sl - mov r1, #0x22 - bl IqSkillIsEnabled - cmp r0, #0 - ldrneb r0, [r5, #0x34] - mov r1, #0x23 - addne r4, r4, #1 - addne r0, r0, #1 - strneb r0, [r5, #0x34] - mov r0, sl - bl IqSkillIsEnabled - cmp r0, #0 - ldrneb r0, [r5, #0x34] - mov r1, #0x3c - subne r4, r4, #1 - subne r0, r0, #1 - strneb r0, [r5, #0x34] - mov r0, sl - bl IqSkillIsEnabled - cmp r0, #0 - ldrneb r0, [r6, #0x166 + CALC_DAMAGE_OFFSET] - mov r1, #0x32 - cmpne r0, #0 - ldrneb r0, [r5, #0x34] - addne r4, r4, #1 - addne r0, r0, #1 - strneb r0, [r5, #0x34] - mov r0, sl - bl NearbyAllyIqSkillIsEnabled - cmp r0, #0 - ldr r0, [sp, #0x18] - addne r4, r4, #1 - cmp r0, #0 - mov r0, sl - bne _0230BFA8 - mov r1, #0x68 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230BF5C - ldrsh r0, [r6, #4] - ldrsh r1, [r7, #4] - bl GendersEqualNotGenderless - cmp r0, #0 - ldrneb r0, [r5, #0x32] - addne r4, r4, #1 - addne r0, r0, #1 - strneb r0, [r5, #0x32] - bne _0230BF5C - ldrsh r0, [r6, #4] - bl GetMonsterGenderVeneer - cmp r0, #3 - beq _0230BF5C - ldrsh r0, [r7, #4] - bl GetMonsterGenderVeneer - cmp r0, #3 - ldrneb r0, [r5, #0x32] - subne r4, r4, #1 - subne r0, r0, #1 - strneb r0, [r5, #0x32] -_0230BF5C: - mov r0, sl - bl GetApparentWeather - cmp r0, #1 - bne _0230C040 - mov r0, sl - mov r1, #0x71 - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _0230BF94 - mov r0, sl - mov r1, #0x71 - bl OtherMonsterAbilityIsActive - cmp r0, #0 - beq _0230C040 -_0230BF94: - add r4, r4, #1 - ldrb r0, [r5, #0x32] - add r0, r0, #1 - strb r0, [r5, #0x32] - b _0230C040 -_0230BFA8: - mov r1, #0x5a - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230BFD4 - mov r0, sl - bl GetApparentWeather - cmp r0, #1 - ldreqb r0, [r5, #0x32] - addeq r4, r4, #2 - addeq r0, r0, #2 - streqb r0, [r5, #0x32] -_0230BFD4: - mov r0, sb - bl GetApparentWeather - cmp r0, #1 - bne _0230C01C - mov r0, sb - mov r1, #0x71 - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _0230C00C - mov r0, sb - mov r1, #0x71 - bl OtherMonsterAbilityIsActive - cmp r0, #0 - beq _0230C01C -_0230C00C: - add fp, fp, #1 - ldrb r0, [r5, #0x33] - add r0, r0, #1 - strb r0, [r5, #0x33] -_0230C01C: - mov r0, sb - bl GetApparentWeather - cmp r0, #2 - bne _0230C040 - ldrb r0, [r7, #0x5e] - cmp r0, #0xd - ldrneb r0, [r7, #0x5f] - cmpne r0, #0xd - addeq fp, fp, #2 -_0230C040: - ldrsh r1, [r6, #4] - ldr r0, _0230C460 ; =0x000001A3 - cmp r1, r0 - addeq r4, r4, #2 - cmp r1, #0x1a4 - ldr r0, _0230C464 ; =0x000001A5 - subeq r4, r4, #2 - cmp r1, r0 - ldr r0, _0230C468 ; =0x00000211 - subeq r4, r4, #2 - cmp r1, r0 - subeq r4, r4, #2 - beq _0230C07C - cmp r1, #0x218 - addeq r4, r4, #2 -_0230C07C: - ldr r0, [sp, #0x44] - add r0, r0, r4 - str r0, [sp, #0x44] - ldrb r0, [r6, #0x167 + CALC_DAMAGE_OFFSET] - cmp r0, #0 - beq _0230C0AC - mov r0, sl - mov r1, #0x4f - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0x14 - strne r0, [sp, #0x44] -_0230C0AC: - ldr r0, [sp, #0x18] - cmp r0, #0 - add r0, r7, r0, lsl #1 - ldrsh r4, [r0, #0x28] - bne _0230C0F4 - ldrb r0, [r7, #0xd2] - mov r1, #0x31 - cmp r0, #6 - moveq r0, #1 - streqb r0, [r5, #0x51] - mov r0, sb - addeq fp, fp, #1 - bl IqSkillIsEnabled - cmp r0, #0 - ldrneb r0, [r5, #0x35] - subne fp, fp, #1 - subne r0, r0, #1 - strneb r0, [r5, #0x35] -_0230C0F4: - mov r0, sb - mov r1, #0x22 - bl IqSkillIsEnabled - cmp r0, #0 - ldrneb r0, [r5, #0x35] - mov r1, #0x23 - subne fp, fp, #1 - subne r0, r0, #1 - strneb r0, [r5, #0x35] - mov r0, sb - bl IqSkillIsEnabled - cmp r0, #0 - ldrneb r0, [r5, #0x35] - addne fp, fp, #1 - addne r0, r0, #1 - strneb r0, [r5, #0x35] - ldrsh r1, [r7, #4] - ldr r0, _0230C460 ; =0x000001A3 - cmp r1, r0 - subeq fp, fp, #2 - cmp r1, #0x1a4 - ldr r0, _0230C464 ; =0x000001A5 - addeq fp, fp, #2 - cmp r1, r0 -#ifdef JAPAN - ldrsh r1, [r6, #4] -#endif - ldr r0, _0230C468 ; =0x00000211 - subeq fp, fp, #2 - cmp r1, r0 - addeq fp, fp, #2 - beq _0230C170 - cmp r1, #0x218 - subeq fp, fp, #2 -_0230C170: - ldr r1, _0230C46C ; =0x000001BD - ldr r0, [sp, #0xf4] - add r4, r4, fp - cmp r0, r1 - bne _0230C1F4 - ldrsh r1, [r7, #0x24] - mov r0, #0 - cmp r1, #0xa - subgt r1, r1, #0xa - addgt r0, r0, r1 - movgt r0, r0, lsl #0x10 - ldrsh r1, [r7, #0x28] - movgt r0, r0, asr #0x10 - cmp r1, #0xa - subgt r1, r1, #0xa - addgt r0, r0, r1 - movgt r0, r0, lsl #0x10 - ldrsh r1, [r7, #0x26] - movgt r0, r0, asr #0x10 - cmp r1, #0xa - subgt r1, r1, #0xa - addgt r0, r0, r1 - movgt r0, r0, lsl #0x10 - ldrsh r1, [r7, #0x2a] - movgt r0, r0, asr #0x10 - cmp r1, #0xa - subgt r1, r1, #0xa - addgt r0, r0, r1 - movgt r0, r0, lsl #0x10 - ldr r1, [sp, #0x44] - movgt r0, r0, asr #0x10 - add r0, r1, r0 - str r0, [sp, #0x44] -_0230C1F4: - mov r0, sl - mov r1, #0x67 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0x100 - movne r4, #0xa - strne r0, [sp, #0x38] - bne _0230C23C - mov r0, sl - mov r1, sb - mov r2, #0x67 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - movne r0, #0xa - strne r0, [sp, #0x44] - movne r0, #0x100 - strne r0, [sp, #0x3c] -_0230C23C: - ldr r0, [sp, #0x44] - ldr r1, [sp, #0x18] - cmp r0, #0 - movlt r0, #0 - strlt r0, [sp, #0x44] - ldr r0, [sp, #0x44] - ldr r2, _0230C470 ; =OFFENSIVE_STAT_STAGE_MULTIPLIERS - cmp r0, #0x14 - movgt r0, #0x14 - strgt r0, [sp, #0x44] - ldr r0, [sp, #0x44] - strb r0, [r5, #0xa] - add r0, r6, #0x1a - ldrb r3, [r0, r1] - ldr r1, [sp, #0x44] - ldr fp, [r2, r1, lsl #2] - ldr r1, [sp, #0x18] - strh r3, [r5, #0xc] - ldrb r0, [r0, r1] - mov r1, fp - mov r0, r0, lsl #8 - bl MultiplyByFixedPoint - ldr r1, [sp, #0x3c] - bl MultiplyByFixedPoint - mov r0, r0, asr #8 - cmp r4, #0 - movlt r4, #0 - str r0, [sp, #0x90] - cmp r4, #0x14 - movgt r4, #0x14 - ldr r1, [sp, #0x18] - strb r4, [r5, #0xb] - add r0, r7, #0x1c - ldrb r2, [r0, r1] - ldr r1, _0230C474 ; =DEFENSIVE_STAT_STAGE_MULTIPLIERS - strh r2, [r5, #0xe] - ldr r2, [sp, #0x18] - ldr r1, [r1, r4, lsl #2] - ldrb r0, [r0, r2] - mov r0, r0, lsl #8 - bl MultiplyByFixedPoint - ldr r1, [sp, #0x38] - bl MultiplyByFixedPoint - mov r0, r0, asr #8 - str r0, [sp, #0x94] - ldrb r0, [r6, #6] - cmp r0, #0 - bne _0230C314 - ldr r1, [sp, #0x18] - mov r0, sl - bl ExclusiveItemOffenseBoost - ldr r1, [sp, #0x90] - add r0, r1, r0 - str r0, [sp, #0x90] -_0230C314: - ldrb r0, [r7, #6] - cmp r0, #0 - bne _0230C338 - ldr r1, [sp, #0x18] - mov r0, sb - bl ExclusiveItemDefenseBoost - ldr r1, [sp, #0x94] - add r0, r1, r0 - str r0, [sp, #0x94] -_0230C338: - ldr r0, [sp, #0x18] - cmp r0, #0 - bne _0230C4D8 - mov r0, sl - mov r1, #0x1a - bl ItemIsActive__0230A9DC - cmp r0, #0 - beq _0230C378 - ldr r0, _0230C478 ; =POWER_BAND_STAT_BOOST - ldr r1, [sp, #0x90] - ldrsh r2, [r0] - add r0, r1, r2 - str r0, [sp, #0x90] - ldrb r0, [r5, #0x30] - add r0, r0, r2 - strb r0, [r5, #0x30] -_0230C378: - mov r0, sl - mov r1, #0x32 - bl ItemIsActive__0230A9DC - cmp r0, #0 - beq _0230C3AC - ldr r0, _0230C47C ; =MUNCH_BELT_STAT_BOOST - ldr r1, [sp, #0x90] - ldrsh r2, [r0] - add r0, r1, r2 - str r0, [sp, #0x90] - ldrb r0, [r5, #0x30] - add r0, r0, r2 - strb r0, [r5, #0x30] -_0230C3AC: - mov r0, sl - bl AuraBowIsActive - cmp r0, #0 - beq _0230C3DC - ldr r0, _0230C480 ; =AURA_BOW_STAT_BOOST - ldr r1, [sp, #0x90] - ldrsh r2, [r0] - add r0, r1, r2 - str r0, [sp, #0x90] - ldrb r0, [r5, #0x31] - add r0, r0, r2 - strb r0, [r5, #0x31] -_0230C3DC: - ldr r0, [sp, #0xf8] - cmp r0, #0 - beq _0230C5E0 - mov r0, sb - mov r1, #0x25 - bl ItemIsActive__0230A9DC - cmp r0, #0 - beq _0230C41C - ldr r0, _0230C484 ; =DEF_SCARF_STAT_BOOST - ldr r1, [sp, #0x94] - ldrsh r2, [r0] - add r0, r1, r2 - str r0, [sp, #0x94] - ldrb r0, [r5, #0x36] - add r0, r0, r2 - strb r0, [r5, #0x36] -_0230C41C: - mov r0, sb - bl AuraBowIsActive - cmp r0, #0 - beq _0230C5E0 - ldr r0, _0230C480 ; =AURA_BOW_STAT_BOOST - ldr r1, [sp, #0x94] - ldrsh r2, [r0] - add r0, r1, r2 - str r0, [sp, #0x94] - ldrb r0, [r5, #0x36] - add r0, r0, r2 - strb r0, [r5, #0x36] - b _0230C5E0 - .align 2, 0 -#ifdef JAPAN -#define CALC_DAMAGE_DATA_OFFSET -0x2C1 -#else -#define CALC_DAMAGE_DATA_OFFSET 0 -#endif -_0230C450: .word DUNGEON_PTR -_0230C454: .word ME_FIRST_MULTIPLIER -_0230C458: .word 0x000001D3 -_0230C45C: .word 0x00000163 -_0230C460: .word 0x000001A3 -_0230C464: .word 0x000001A5 -_0230C468: .word 0x00000211 -_0230C46C: .word 0x000001BD -_0230C470: .word OFFENSIVE_STAT_STAGE_MULTIPLIERS -_0230C474: .word DEFENSIVE_STAT_STAGE_MULTIPLIERS -_0230C478: .word POWER_BAND_STAT_BOOST -_0230C47C: .word MUNCH_BELT_STAT_BOOST -_0230C480: .word AURA_BOW_STAT_BOOST -_0230C484: .word DEF_SCARF_STAT_BOOST -_0230C488: .word ZINC_BAND_STAT_BOOST -_0230C48C: .word SPECIAL_BAND_STAT_BOOST -_0230C490: .word 0x00000C53 + CALC_DAMAGE_DATA_OFFSET -_0230C494: .word 0x00000C54 + CALC_DAMAGE_DATA_OFFSET -_0230C498: .word 0x00000C55 + CALC_DAMAGE_DATA_OFFSET -_0230C49C: .word 0x000003E7 -_0230C4A0: .word DAMAGE_FORMULA_FLV_DEFICIT_DIVISOR -_0230C4A4: .word ov29_02352984 -_0230C4A8: .word ov29_02352990 -_0230C4AC: .word ov29_0235299C -_0230C4B0: .word DAMAGE_FORMULA_AT_PREFACTOR -_0230C4B4: .word DAMAGE_FORMULA_DEF_PREFACTOR -_0230C4B8: .word DAMAGE_FORMULA_FLV_SHIFT -_0230C4BC: .word DAMAGE_FORMULA_LN_ARG_PREFACTOR -_0230C4C0: .word DAMAGE_FORMULA_LN_PREFACTOR -_0230C4C4: .word DAMAGE_FORMULA_CONSTANT_SHIFT -_0230C4C8: .word DAMAGE_FORMULA_NON_TEAM_MEMBER_MODIFIER -_0230C4CC: .word DAMAGE_FORMULA_MAX_BASE -_0230C4D0: .word ov29_02352838 -_0230C4D4: .word DAMAGE_FORMULA_MIN_BASE -_0230C4D8: - ldr r0, [sp, #0xf8] - cmp r0, #0 - beq _0230C548 - mov r0, sb - mov r1, #0x29 - bl ItemIsActive__0230A9DC - cmp r0, #0 - beq _0230C518 - ldr r0, _0230C488 ; =ZINC_BAND_STAT_BOOST - ldr r1, [sp, #0x94] - ldrsh r2, [r0] - add r0, r1, r2 - str r0, [sp, #0x94] - ldrb r0, [r5, #0x37] - add r0, r0, r2 - strb r0, [r5, #0x37] -_0230C518: - mov r0, sb - bl AuraBowIsActive - cmp r0, #0 - beq _0230C548 - ldr r0, _0230C480 ; =AURA_BOW_STAT_BOOST - ldr r1, [sp, #0x94] - ldrsh r2, [r0] - add r0, r1, r2 - str r0, [sp, #0x94] - ldrb r0, [r5, #0x36] - add r0, r0, r2 - strb r0, [r5, #0x36] -_0230C548: - mov r0, sl - mov r1, #0x28 - bl ItemIsActive__0230A9DC - cmp r0, #0 - beq _0230C57C - ldr r0, _0230C48C ; =SPECIAL_BAND_STAT_BOOST - ldr r1, [sp, #0x90] - ldrsh r2, [r0] - add r0, r1, r2 - str r0, [sp, #0x90] - ldrb r0, [r5, #0x31] - add r0, r0, r2 - strb r0, [r5, #0x31] -_0230C57C: - mov r0, sl - mov r1, #0x32 - bl ItemIsActive__0230A9DC - cmp r0, #0 - beq _0230C5B0 - ldr r0, _0230C47C ; =MUNCH_BELT_STAT_BOOST - ldr r1, [sp, #0x90] - ldrsh r2, [r0] - add r0, r1, r2 - str r0, [sp, #0x90] - ldrb r0, [r5, #0x31] - add r0, r0, r2 - strb r0, [r5, #0x31] -_0230C5B0: - mov r0, sb - bl AuraBowIsActive - cmp r0, #0 - beq _0230C5E0 - ldr r0, _0230C480 ; =AURA_BOW_STAT_BOOST - ldr r1, [sp, #0x90] - ldrsh r2, [r0] - add r0, r1, r2 - str r0, [sp, #0x90] - ldrb r0, [r5, #0x31] - add r0, r0, r2 - strb r0, [r5, #0x31] -_0230C5E0: - ldr r0, [sp, #0x10] - mov r1, fp - mov r0, r0, lsl #8 - bl MultiplyByFixedPoint - ldr r1, [sp, #0x3c] - bl MultiplyByFixedPoint - mov r1, r0 - add r0, sp, #0xa0 - bl FixedPoint32To64 - mov r0, #0x64 - bl DungeonRandInt - mov r4, #1 - str r0, [sp, #0x40] - add r0, r6, #0x100 - ldrh r1, [r0, #0x5a + CALC_DAMAGE_OFFSET] - mov fp, r4 - str r4, [sp, #0x28] - bic r1, r1, #0x100 - strh r1, [r0, #0x5a + CALC_DAMAGE_OFFSET] - ldrh r1, [r0, #0x58 + CALC_DAMAGE_OFFSET] - str r4, [sp, #0x2c] - bic r1, r1, #0x100 - strh r1, [r0, #0x58 + CALC_DAMAGE_OFFSET] - ldr r0, [sp, #0xf4] - bl MoveIsNotPhysical - str r0, [sp, #0x30] - cmp r0, #0 - bne _0230C6B8 - mov r0, sl - mov r1, #0x11 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230C6B8 - ldr r0, [sl, #0xb4] - mov r1, r4 - str r0, [sp, #0x24] - mov r0, sl - bl MonsterHasNegativeStatus - str r0, [sp, #0x48] - ldr r0, [sp, #0x24] - ldr r2, [sp, #0x48] - mov r1, r4 - bl UpdateStateFlags - ldr r1, [sp, #0x48] - cmp r1, #0 - movne r4, r4, lsl #1 - cmp r0, #0 - beq _0230C6B8 - mov r0, sl - bl PlayEffectAnimation0x1A9__022E6130 - mov r0, sl - mov r1, sb - ldr r2, _0230C490 ; =0x00000C53 - bl LogMessageByIdWithPopupCheckUserTarget -_0230C6B8: - mov r0, sl - mov r1, #0x22 - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _0230C6E0 - mov r0, sl - mov r1, #0x4b - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230C748 -_0230C6E0: - ldr r0, [sp, #0x40] - cmp r0, #0x21 - ldr r0, [sl, #0xb4] - bge _0230C700 - ldr r1, [sp, #0x30] - cmp r1, #0 - moveq r1, #1 - beq _0230C704 -_0230C700: - mov r1, #0 -_0230C704: - and r1, r1, #0xff - str r1, [sp, #0x34] - ldr r2, [sp, #0x34] - mov r1, #0x100 - bl UpdateStateFlags - ldr r1, [sp, #0x34] - cmp r1, #0 - addne r4, r4, r4, lsl #1 - movne fp, fp, lsl #1 - cmp r0, #0 - beq _0230C748 - mov r0, sl - bl PlayEffectAnimation0x1A9__022E617C - mov r0, sl - mov r1, sb - ldr r2, _0230C494 ; =0x00000C54 - bl LogMessageByIdWithPopupCheckUserTarget -_0230C748: - mov r0, sl - mov r1, #0x30 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230C76C - ldr r0, [sp, #0x30] - cmp r0, #0 - addeq r4, r4, r4, lsl #1 - moveq fp, fp, lsl #1 -_0230C76C: - ldr r0, [sl, #0xb4] - mov r1, #0x38 - ldrb r0, [r0, #6] - cmp r0, #0 - moveq r0, #1 - streq r0, [sp, #0x14] - movne r0, #0 - strne r0, [sp, #0x14] - mov r0, sl - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230C7D4 - ldr r0, [sp, #0x30] - cmp r0, #1 - bne _0230C7D4 - ldr r0, _0230C450 ; =DUNGEON_PTR - ldr r1, [r0] - ldr r0, [sp, #0x14] - add r0, r1, r0 - add r0, r0, #0x3000 -#ifdef JAPAN - ldrb r0, [r0, #0xd92] -#else - ldrb r0, [r0, #0xe36] -#endif - cmp r0, #0 - movne r0, #0xa - mulne r0, fp, r0 - rsbne r4, r4, r4, lsl #4 - movne fp, r0 -_0230C7D4: - mov r0, sl - mov r1, #0x3f - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230C820 - ldr r0, [sp, #0x30] - cmp r0, #1 - bne _0230C820 - ldr r0, _0230C450 ; =DUNGEON_PTR - ldr r1, [r0] - ldr r0, [sp, #0x14] - add r0, r1, r0 - add r0, r0, #0x3000 -#ifdef JAPAN - ldrb r0, [r0, #0xd90] -#else - ldrb r0, [r0, #0xe34] -#endif - cmp r0, #0 - movne r0, #0xa - mulne r0, fp, r0 - rsbne r4, r4, r4, lsl #4 - movne fp, r0 -_0230C820: - mov r0, sl - mov r1, sb - mov r2, #6 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230C84C - ldr r0, [sp, #0x30] - cmp r0, #0 - moveq r4, r4, lsl #2 - addeq fp, fp, fp, lsl #2 -_0230C84C: - mov r0, sl - mov r1, sb - mov r2, #0x34 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230C8E0 - ldr r0, [sp, #0x30] - cmp r0, #0 - bne _0230C8E0 - ldr r0, [sb, #0xb4] - mov r1, #1 - str r0, [sp, #0x20] - mov r0, sb - bl MonsterHasNegativeStatus - str r0, [sp, #0x4c] - ldr r0, [sp, #0x20] - ldr r2, [sp, #0x4c] - mov r1, #8 - bl UpdateStateFlags - ldr r1, [sp, #0x4c] - cmp r1, #0 - beq _0230C8C0 - ldr r1, [sp, #0x28] - add r1, r1, r1, lsl #1 - str r1, [sp, #0x28] - ldr r1, [sp, #0x2c] - mov r1, r1, lsl #1 - str r1, [sp, #0x2c] -_0230C8C0: - cmp r0, #0 - beq _0230C8E0 - mov r0, sb - bl PlayEffectAnimation0x18E - mov r0, sl - mov r1, sb - ldr r2, _0230C498 ; =0x00000C55 - bl LogMessageByIdWithPopupCheckUserTarget -_0230C8E0: - add r0, sp, #0x90 - ldr r2, [r0] - add r1, sp, #0x94 - mul r0, r2, r4 - ldr r3, [r1] - ldr r2, [sp, #0x28] - cmp fp, #1 - mul r2, r3, r2 - str r2, [r1] - add r1, sp, #0x90 - str r0, [r1] - beq _0230C920 - mov r1, fp - bl _s32_div_f - add r1, sp, #0x90 - str r0, [r1] -_0230C920: - ldr r0, [sp, #0x2c] - cmp r0, #1 - beq _0230C940 - add r4, sp, #0x94 - mov r1, r0 - ldr r0, [r4] - bl _s32_div_f - str r0, [r4] -_0230C940: - ldr r0, [sp, #0x90] - strh r0, [r5, #0x12] - ldr r0, [sp, #0x94] - strh r0, [r5, #0x14] - ldr r0, [sp, #0x90] - cmp r0, #0 - movlt r0, #0 - strlt r0, [sp, #0x90] - ldr r1, [sp, #0x90] - ldr r0, _0230C49C ; =0x000003E7 - cmp r1, r0 - strge r0, [sp, #0x90] - ldr r1, [sp, #0x94] - add r0, sp, #0x98 - strh r1, [r5, #0x1a] - ldr r1, [sp, #0x94] - bl IntToFixedPoint64 - ldr r2, [sp, #0x90] - ldr r1, [sp, #0x94] - add r0, sp, #0x88 - sub r1, r2, r1 - bl IntToFixedPoint64 - ldr r1, _0230C4A0 ; =DAMAGE_FORMULA_FLV_DEFICIT_DIVISOR - add r0, sp, #0x80 - ldr r1, [r1] - bl FixedPoint32To64 - add r0, sp, #0x88 - add r2, sp, #0x80 - mov r1, r0 - bl DivideFixedPoint64 - ldrb r1, [r6, #0xa] - add r0, sp, #0x80 - bl IntToFixedPoint64 - add r0, sp, #0xa8 - add r1, sp, #0x80 - add r2, sp, #0x88 - bl AddFixedPoint64 - ldr r1, [sp, #0x90] - add r0, sp, #0x80 - bl IntToFixedPoint64 - add r0, sp, #0xa0 - add r2, sp, #0x80 - mov r1, r0 - bl AddFixedPoint64 - add r0, sp, #0xa0 - bl FixedPoint64ToInt - strh r0, [r5, #0x18] - ldrb r1, [r6, #0xa] - add r0, sp, #0xa8 - strh r1, [r5, #0x16] - bl FixedPoint64ToInt - strh r0, [r5, #0x1c] - add r0, sp, #0xa8 - bl FixedPoint64ToInt - mov r1, r0 - ldr r0, _0230C4A4 ; =ov29_02352984 - bl Debug_Print0 - add r0, sp, #0xa0 - bl FixedPoint64ToInt - mov r1, r0 - ldr r0, _0230C4A8 ; =ov29_02352990 - bl Debug_Print0 - add r0, sp, #0x98 - bl FixedPoint64ToInt - mov r1, r0 - ldr r0, _0230C4AC ; =ov29_0235299C - bl Debug_Print0 - ldr r1, _0230C4B0 ; =DAMAGE_FORMULA_AT_PREFACTOR - add r0, sp, #0x70 - ldr r1, [r1] - bl FixedPoint32To64 - add r0, sp, #0x70 - add r1, sp, #0xa0 - mov r2, r0 - bl MultiplyFixedPoint64 - ldr r1, _0230C4B4 ; =DAMAGE_FORMULA_DEF_PREFACTOR - add r0, sp, #0x68 - ldr r1, [r1] - bl FixedPoint32To64 - add r0, sp, #0x68 - add r1, sp, #0x98 - mov r2, r0 - bl MultiplyFixedPoint64 - ldr r1, _0230C4B8 ; =DAMAGE_FORMULA_FLV_SHIFT - add r0, sp, #0x78 - ldr r1, [r1] - bl FixedPoint32To64 - add r0, sp, #0x60 - add r1, sp, #0xa8 - add r2, sp, #0x78 - bl AddFixedPoint64 - ldr r1, _0230C4BC ; =DAMAGE_FORMULA_LN_ARG_PREFACTOR - add r0, sp, #0x78 - ldr r1, [r1] - bl FixedPoint32To64 - add r0, sp, #0x60 - add r2, sp, #0x78 - mov r1, r0 - bl MultiplyFixedPoint64 - add r0, sp, #0x60 - bl FixedPoint64ToInt - mov r1, r0 - add r0, sp, #0x60 - bl ClampedLn - ldr r1, _0230C4C0 ; =DAMAGE_FORMULA_LN_PREFACTOR - add r0, sp, #0x78 - ldr r1, [r1] - bl FixedPoint32To64 - add r0, sp, #0x60 - add r2, sp, #0x78 - mov r1, r0 - bl MultiplyFixedPoint64 - add r0, sp, #0xb0 - add r1, sp, #0x68 - add r2, sp, #0x70 - bl AddFixedPoint64 - add r0, sp, #0xb0 - add r2, sp, #0x60 - mov r1, r0 - bl AddFixedPoint64 - ldr r1, _0230C4C4 ; =DAMAGE_FORMULA_CONSTANT_SHIFT - add r0, sp, #0x78 - ldr r1, [r1] - bl FixedPoint32To64 - add r0, sp, #0xb0 - add r2, sp, #0x78 - mov r1, r0 - bl AddFixedPoint64 - bl FixedRoomIsSubstituteRoom - cmp r0, #0 - bne _0230CB78 - ldrb r0, [r6, #6] - cmp r0, #0 - beq _0230CB78 - ldr r1, _0230C4C8 ; =DAMAGE_FORMULA_NON_TEAM_MEMBER_MODIFIER - add r0, sp, #0x78 - ldr r1, [r1] - bl FixedPoint32To64 - add r0, sp, #0xb0 - add r2, sp, #0x78 - mov r1, r0 - bl DivideFixedPoint64 -_0230CB78: - ldr r0, _0230C4CC ; =DAMAGE_FORMULA_MAX_BASE - add r1, sp, #0xb0 - bl FixedPoint64CmpLt - cmp r0, #0 - ldrne r0, _0230C4D0 ; =ov29_02352838 - ldrne r1, [r0, #0x38] - ldrne r0, [r0, #0x34] - strne r1, [sp, #0xb4] - strne r0, [sp, #0xb0] - ldr r1, _0230C4D4 ; =DAMAGE_FORMULA_MIN_BASE - add r0, sp, #0xb0 - bl FixedPoint64CmpLt - cmp r0, #0 - ldrne r0, _0230C4D0 ; =ov29_02352838 - ldrne r1, [r0, #0x48] - ldrne r0, [r0, #0x44] - strne r1, [sp, #0xb4] - strne r0, [sp, #0xb0] - ldr r0, [sp, #0xf4] - bl IsRegularAttackOrProjectile - cmp r0, #0 - ldr r0, [sp, #0xc] - movne r1, #1 - str r0, [sp] - moveq r1, #0 - and r1, r1, #0xff - str r8, [sp, #4] - str r1, [sp, #8] - ldr r3, [sp, #0x10] - add r0, sp, #0xb8 - mov r1, sl - mov r2, sb - bl CalcTypeBasedDamageEffects - mov fp, r0 - ldr r0, [sp, #0xc] - cmp r0, #2 - bne _0230CC78 - mov r0, sl - mov r1, sb - bl FlashFireShouldActivate - movs r4, r0 - beq _0230CC78 - ldrb r0, [r7, #0x15c + CALC_DAMAGE_OFFSET] - cmp r0, #0 - bne _0230CC78 - ldr r0, [sp, #0xf8] - cmp r0, #0 - beq _0230CC78 - mov r0, #1 - mov r1, sb - strb r0, [r7, #0x15c + CALC_DAMAGE_OFFSET] - mov r2, #0 - bl SubstitutePlaceholderStringTags - cmp r4, #1 - bne _0230CC68 - ldr r2, _0230D05C ; =0x00000C58 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - b _0230CC78 -_0230CC68: - ldr r2, _0230D060 ; =0x00000C57 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_0230CC78: - ldr r0, [sp, #0xf8] - cmp r0, #0 - beq _0230CD3C - mov r0, sl - mov r1, #0x44 - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - bne _0230CD3C - ldr r0, [sp, #0x18] - cmp r0, #0 - bne _0230CCF0 - ldr r0, [sp, #0xf4] - cmp r0, #0x48 - beq _0230CCBC - ldrb r0, [r7, #0xd5] - cmp r0, #1 - beq _0230CCD0 -_0230CCBC: - mov r0, sb - mov r1, #0x1e - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _0230CCF0 -_0230CCD0: - mov r0, sb - bl PlayEffectAnimation0x171 - add r0, sp, #0xb8 - ldr r2, _0230D064 ; =DAMAGE_MULTIPLIER_0_5 - mov r1, r0 - bl MultiplyFixedPoint64 - mov r0, #1 - strb r0, [r5, #0x3a] -_0230CCF0: - ldr r0, [sp, #0x18] - cmp r0, #1 - bne _0230CD3C - ldrb r0, [r7, #0xd5] - cmp r0, #3 - beq _0230CD1C - mov r0, sb - mov r1, #0x1f - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _0230CD3C -_0230CD1C: - mov r0, sb - bl PlayEffectAnimation0x171Full - add r0, sp, #0xb8 - ldr r2, _0230D064 ; =DAMAGE_MULTIPLIER_0_5 - mov r1, r0 - bl MultiplyFixedPoint64 - mov r0, #1 - strb r0, [r5, #0x3b] -_0230CD3C: - ldrb r0, [r7, #0xd5] - cmp r0, #0x11 - beq _0230CEEC - mov r0, sl - mov r1, sb - mov r2, #0xc -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - bne _0230CEEC - mov r0, sl - mov r1, sb - mov r2, #0x13 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - bne _0230CEEC - mov r0, sb - mov r1, #0x40 - bl IqSkillIsEnabled - cmp r0, #0 - bne _0230CEEC - ldrsh r0, [r6, #2] - bl GetMonsterGenderVeneer - cmp r0, #2 - ldrne r1, [sp, #0xe8] - ldreq r4, [sp, #0xe8] - addne r0, r1, r1, lsr #31 - addne r4, r1, r0, asr #1 - ldrb r0, [r6, #0xec] - cmp r0, #4 - moveq r0, #1 - streqb r0, [r5, #0x3c] - ldreq r4, _0230C49C ; =0x000003E7 - beq _0230CE74 - mov r0, sl - mov r1, #0x13 - bl ItemIsActive__0230A9DC - cmp r0, #0 - bne _0230CDF0 - mov r0, sl - mov r1, #0x1d - bl IqSkillIsEnabled - cmp r0, #0 - beq _0230CE04 -_0230CDF0: - ldr r0, _0230D068 ; =SCOPE_LENS_CRIT_RATE_BOOST - mov r1, #1 - ldrsh r0, [r0] - strb r1, [r5, #0x38] - add r4, r4, r0 -_0230CE04: - mov r0, sl - mov r1, #0x58 - bl AbilityIsActiveVeneer - cmp r0, #0 - ldrne r0, _0230D06C ; =SUPER_LUCK_CRIT_RATE_BOOST - movne r1, #1 - ldrnesh r0, [r0] - strneb r1, [r5, #0x49] - mov r1, #0x14 - addne r4, r4, r0 - mov r0, sb - bl ItemIsActive__0230A9DC - cmp r0, #0 - ldrne r0, _0230D068 ; =SCOPE_LENS_CRIT_RATE_BOOST - movne r1, #1 - ldrnesh r0, [r0] - strneb r1, [r5, #0x39] - addne r4, r4, r0 - cmp fp, #0 - beq _0230CE74 - mov r0, sl - mov r1, #1 - bl IqSkillIsEnabled - cmp r0, #0 - ldrne r0, _0230D070 ; =TYPE_ADVANTAGE_MASTER_CRIT_RATE - movne r1, #1 - ldrnesh r4, [r0] - strneb r1, [r5, #0x3d] -_0230CE74: - mov r0, #0x64 - bl DungeonRandInt - cmp r0, r4 - bge _0230CEEC - mov r2, #1 - mov r4, #5 - mov r0, sl - mov r1, sb -#ifdef JAPAN - add r3, r2, #0xb00 -#else - add r3, r2, #0xdc0 -#endif - str r4, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - bne _0230CEEC - mov r2, #1 - mov r0, sl - mov r1, #0x5d - strb r2, [r8, #0xe] - bl AbilityIsActiveVeneer - cmp r0, #0 - add r0, sp, #0xb8 - beq _0230CEE0 - ldr r2, _0230D074 ; =DAMAGE_MULTIPLIER_2 - mov r1, r0 - bl MultiplyFixedPoint64 - mov r0, #1 - strb r0, [r5, #0x4a] - b _0230CEEC -_0230CEE0: - ldr r2, _0230D078 ; =DAMAGE_MULTIPLIER_1_5 - mov r1, r0 - bl MultiplyFixedPoint64 -_0230CEEC: - add r0, sp, #0xb0 - bl FixedPoint64ToInt - str r0, [r5, #0x24] - add r0, sp, #0xb0 - add r2, sp, #0xb8 - mov r1, r0 - bl MultiplyFixedPoint64 - ldr r1, [sp, #0x1c] - add r0, sp, #0x58 - mov r2, r1 - str r2, [r5, #0x2c] - bl FixedPoint32To64 - add r0, sp, #0xb0 - add r2, sp, #0x58 - mov r1, r0 - bl MultiplyFixedPoint64 - add r0, sp, #0xb0 - bl FixedPoint64ToInt - str r0, [r5, #0x20] - mov r0, #0x4000 - bl DungeonRandInt - add r0, r0, #0xe000 - mov r1, #0 - str r0, [sp, #0xbc] - add r0, sp, #0xb0 - str r1, [sp, #0xb8] - add r2, sp, #0xb8 - mov r1, r0 - bl MultiplyFixedPoint64 - add r0, sp, #0x50 - mov r1, #0x64 - bl IntToFixedPoint64 - add r0, sp, #0xb8 - add r1, sp, #0x50 - mov r2, r0 - bl MultiplyFixedPoint64 - add r0, sp, #0xb8 - bl FixedPoint64ToInt - str r0, [r5, #0x28] - add r0, sp, #0xb0 - bl FixedPoint64ToInt - str r0, [r8] - ldr r1, _0230D07C ; =0x00000195 - ldr r0, [sp, #0xf4] - cmp r0, r1 - bne _0230CFBC - ldr r0, [r8] - mov r1, #0x80 - mov r0, r0, lsl #8 - bl MultiplyByFixedPoint - bl RoundUpDiv256 - str r0, [r8] -_0230CFBC: - ldr r1, _0230D07C ; =0x00000195 - ldr r0, [sp, #0xf4] - cmp r0, r1 - bne _0230CFFC - mov r0, sl - mov r1, #0x2f - bl IqSkillIsEnabled - cmp r0, #0 - beq _0230CFFC - ldr r0, _0230D080 ; =POWER_PITCHER_DAMAGE_MULTIPLIER - ldr r2, [r8] - ldr r1, [r0] - mov r0, r2, lsl #8 - bl MultiplyByFixedPoint - bl RoundUpDiv256 - str r0, [r8] -_0230CFFC: - ldr r0, [r8] - cmp r0, #0 - ble _0230D038 - mov r0, sl - mov r1, #0x5b - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _0230D038 - ldr r0, _0230D084 ; =AIR_BLADE_DAMAGE_MULTIPLIER - ldr r2, [r8] - ldr r1, [r0] - mov r0, r2, lsl #8 - bl MultiplyByFixedPoint - bl RoundUpDiv256 - str r0, [r8] -_0230D038: - mov r1, #0 - str r1, [r8, #4] - ldr r0, [r8] - cmp r0, #0 - streqb r1, [r8, #0xe] - ldrb r0, [r8, #0xe] - strb r0, [r7, #0x167 + CALC_DAMAGE_OFFSET] -_0230D054: - add sp, sp, #0xc0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0230D05C: .word 0x00000C58 + CALC_DAMAGE_DATA_OFFSET -_0230D060: .word 0x00000C57 + CALC_DAMAGE_DATA_OFFSET -_0230D064: .word DAMAGE_MULTIPLIER_0_5 -_0230D068: .word SCOPE_LENS_CRIT_RATE_BOOST -_0230D06C: .word SUPER_LUCK_CRIT_RATE_BOOST -_0230D070: .word TYPE_ADVANTAGE_MASTER_CRIT_RATE -_0230D074: .word DAMAGE_MULTIPLIER_2 -_0230D078: .word DAMAGE_MULTIPLIER_1_5 -_0230D07C: .word 0x00000195 -_0230D080: .word POWER_PITCHER_DAMAGE_MULTIPLIER -_0230D084: .word AIR_BLADE_DAMAGE_MULTIPLIER - arm_func_end CalcDamage - - arm_func_start ov29_0230D088 -ov29_0230D088: ; 0x0230D088 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #0x1c - ldr r5, [sp, #0x2c] - ldr r4, [sp, #0x28] - mov lr, r0 - strb r2, [r5, #0xc] - cmp r4, #1 - strb r3, [r5, #0xd] - mov ip, r1 - str r2, [sp] - mov r2, ip - ldr r0, _0230D118 ; =0x000003E7 - movlt r4, #1 - cmp r4, r0 - movgt r4, r0 - add r0, sp, #0x14 - mov r1, lr - mov r3, r4 - str r5, [sp, #4] - mov ip, #0 - str ip, [sp, #8] - bl CalcTypeBasedDamageEffects - add r0, sp, #0xc - mov r1, r4 - bl IntToFixedPoint64 - add r0, sp, #0xc - add r2, sp, #0x14 - mov r1, r0 - bl MultiplyFixedPoint64 - add r0, sp, #0xc - bl FixedPoint64ToInt - str r0, [r5] - mov r0, #0 - str r0, [r5, #4] - add sp, sp, #0x1c - ldmia sp!, {r4, r5, pc} - .align 2, 0 -_0230D118: .word 0x000003E7 - arm_func_end ov29_0230D088 - - arm_func_start ApplyDamageAndEffectsWrapper -ApplyDamageAndEffectsWrapper: ; 0x0230D11C - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #0xdc - mov r7, r0 - add r0, sp, #0x10 - mov r6, r1 - mov r5, r2 - mov r4, r3 - bl ResetDamageData - add r0, sp, #0x24 - bl CreateTemporaryEntity - mov r3, #0 - mov r0, #2 - str r0, [sp, #0x18] - str r6, [sp, #0x10] - str r5, [sp, #0x14] - strb r3, [sp, #0x1c] - strb r3, [sp, #0x1e] - strb r3, [sp, #0x1f] - strb r3, [sp, #0x20] - stmia sp, {r3, r4} - str r3, [sp, #8] - mov r1, r7 - add r0, sp, #0x24 - add r2, sp, #0x10 - str r3, [sp, #0xc] - bl ApplyDamageAndEffects - add sp, sp, #0xdc - ldmia sp!, {r4, r5, r6, r7, pc} - arm_func_end ApplyDamageAndEffectsWrapper - - arm_func_start CalcRecoilDamageFixed -CalcRecoilDamageFixed: ; 0x0230D18C - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #0x1c - mov r7, r0 - mov r6, r1 - mov r5, r2 - mov r4, r3 - bl EntityIsValid__02308FBC - cmp r0, #0 - beq _0230D238 - ldr r0, [r7] - cmp r0, #1 - bne _0230D1F0 - ldr r0, [r7, #0xb4] - ldrsh r0, [r0, #0x10] - cmp r0, #0 - beq _0230D238 - mov r0, r7 - mov r1, #0x5c - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230D1F0 - mov r0, r6, lsl #8 - mov r1, #0x180 - bl MultiplyByFixedPoint - mov r6, r0, asr #8 -_0230D1F0: - ldrb r1, [sp, #0x34] - str r4, [sp] - ldrsh r0, [sp, #0x38] - str r1, [sp, #4] - mov r1, #3 - str r1, [sp, #8] - ldr r1, [sp, #0x3c] - str r0, [sp, #0xc] - ldr r0, [sp, #0x40] - str r1, [sp, #0x10] - ldr r4, [sp, #0x44] - str r0, [sp, #0x14] - mov r0, r7 - mov r1, r7 - mov r2, r6 - mov r3, r5 - str r4, [sp, #0x18] - bl CalcDamageFixed -_0230D238: - add sp, sp, #0x1c - ldmia sp!, {r4, r5, r6, r7, pc} - arm_func_end CalcRecoilDamageFixed - - arm_func_start CalcDamageFixed -CalcDamageFixed: ; 0x0230D240 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #0x2c - mov sl, r0 - add r0, sp, #0x18 - mov sb, r1 - mov r8, r2 - mov r7, r3 - ldr r6, [sp, #0x54] - bl ResetDamageData - mov r5, #0 - ldrb r0, [sp, #0x58] - ldr r1, [sp, #0x60] - mov r2, #2 - str r2, [sp, #0x20] - str r1, [sp, #0x1c] - strb r6, [sp, #0x24] - strb r5, [sp, #0x26] - strb r5, [sp, #0x27] - strb r0, [sp, #0x25] - cmp r6, #0 - beq _0230D2F8 - add r4, sp, #0x10 -_0230D298: - mov r2, r5, lsl #0x10 - mov r0, sl - mov r1, sb - mov r3, r6 - mov r2, r2, asr #0x10 - bl GetTypeMatchup - str r0, [r4, r5, lsl #2] - add r5, r5, #1 - cmp r5, #2 - blt _0230D298 - mov r0, sl - mov r1, sb - mov r2, #0x35 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230D2F8 - ldr r2, [sp, #0x10] - ldr r0, _0230D39C ; =TYPE_MATCHUP_COMBINATOR_TABLE - ldr r1, [sp, #0x14] - add r0, r0, r2, lsl #4 - ldr r0, [r0, r1, lsl #2] - cmp r0, #3 - movne r8, #0 -_0230D2F8: - ldrsh r1, [sp, #0x5c] - ldr r0, _0230D3A0 ; =0x00000256 - mov r8, r8, lsl #8 - cmp r1, r0 - bne _0230D334 - mov r0, sl - mov r1, #0x2f - bl IqSkillIsEnabled - cmp r0, #0 - beq _0230D334 - ldr r1, _0230D3A4 ; =POWER_PITCHER_DAMAGE_MULTIPLIER - mov r0, r8 - ldr r1, [r1] - bl MultiplyByFixedPoint - mov r8, r0 -_0230D334: - mov r0, r8 - bl RoundUpDiv256 - str r0, [sp, #0x18] - cmp r8, #0 - moveq r0, #1 - streqb r0, [sp, #0x28] - movne r0, #0 - strneb r0, [sp, #0x28] - ldrsh r1, [sp, #0x5c] - str r7, [sp] - ldr r0, [sp, #0x64] - str r1, [sp, #4] - str r0, [sp, #8] - ldr r4, [sp, #0x68] - add r2, sp, #0x18 - mov r0, sl - mov r1, sb - mov r3, #0 - str r4, [sp, #0xc] - bl ApplyDamageAndEffects - ldr r1, [sp, #0x50] - cmp r1, #0 - ldrneb r0, [sp, #0x28] - strneb r0, [r1] - add sp, sp, #0x2c - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_0230D39C: .word TYPE_MATCHUP_COMBINATOR_TABLE -_0230D3A0: .word 0x00000256 -_0230D3A4: .word POWER_PITCHER_DAMAGE_MULTIPLIER - arm_func_end CalcDamageFixed - - arm_func_start CalcDamageFixedNoCategory -CalcDamageFixedNoCategory: ; 0x0230D3A8 - stmdb sp!, {lr} - sub sp, sp, #0x1c - ldr lr, [sp, #0x20] - ldrb ip, [sp, #0x24] - str lr, [sp] - ldrsh lr, [sp, #0x28] - str ip, [sp, #4] - mov ip, #3 - str ip, [sp, #8] - ldr ip, [sp, #0x2c] - str lr, [sp, #0xc] - ldr lr, [sp, #0x30] - str ip, [sp, #0x10] - ldr ip, [sp, #0x34] - str lr, [sp, #0x14] - str ip, [sp, #0x18] - bl CalcDamageFixed - add sp, sp, #0x1c - ldmia sp!, {pc} - arm_func_end CalcDamageFixedNoCategory - - arm_func_start CalcDamageFixedWrapper -CalcDamageFixedWrapper: ; 0x0230D3F4 - stmdb sp!, {lr} - sub sp, sp, #0x1c - ldr ip, [sp, #0x20] - ldrb lr, [sp, #0x24] - str ip, [sp] - ldrb ip, [sp, #0x28] - str lr, [sp, #4] - ldrsh lr, [sp, #0x2c] - str ip, [sp, #8] - ldr ip, [sp, #0x30] - str lr, [sp, #0xc] - ldr lr, [sp, #0x34] - str ip, [sp, #0x10] - ldr ip, [sp, #0x38] - str lr, [sp, #0x14] - str ip, [sp, #0x18] - bl CalcDamageFixed - add sp, sp, #0x1c - ldmia sp!, {pc} - arm_func_end CalcDamageFixedWrapper - - arm_func_start UpdateShopkeeperModeAfterAttack -UpdateShopkeeperModeAfterAttack: ; 0x0230D440 - ldr r2, [r1, #0xb4] - ldrb r1, [r2, #9] - cmp r1, #0 - bxeq lr - ldr r1, [r0] - cmp r1, #1 - bxne lr - ldr r0, [r0, #0xb4] - ldrb r0, [r0, #6] - cmp r0, #0 - movne r0, #2 - strneb r0, [r2, #9] - moveq r0, #3 - streqb r0, [r2, #9] - bx lr - arm_func_end UpdateShopkeeperModeAfterAttack - - arm_func_start UpdateShopkeeperModeAfterTrap -UpdateShopkeeperModeAfterTrap: ; 0x0230D47C - ldr r2, [r0, #0xb4] - ldrb r0, [r2, #9] - cmp r0, #0 - bxeq lr - cmp r1, #0 - movne r0, #2 - strneb r0, [r2, #9] - moveq r0, #3 - streqb r0, [r2, #9] - bx lr - arm_func_end UpdateShopkeeperModeAfterTrap - - arm_func_start ov29_0230D4A4 -ov29_0230D4A4: ; 0x0230D4A4 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r6, r1 - mov r7, r0 - mov r0, r6 - mov r1, #0xe - mov r5, r2 - ldr r4, [r6, #0xb4] - bl MonsterIsType - cmp r0, #0 - beq _0230D4E8 - cmp r5, #1 - cmpne r5, #7 - bne _0230D4E8 - ldrb r0, [r4, #0xfe] - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} -_0230D4E8: - mov r4, #0 - b _0230D518 -_0230D4F0: - mov r2, r4, lsl #0x10 - mov r0, r7 - mov r1, r6 - mov r3, r5 - mov r2, r2, asr #0x10 - bl GetTypeMatchup - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - add r4, r4, #1 -_0230D518: - cmp r4, #2 - blt _0230D4F0 - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ov29_0230D4A4 - - arm_func_start ResetDamageCalcDiagnostics -ResetDamageCalcDiagnostics: ; 0x0230D528 - stmdb sp!, {r3, r4, r5, lr} - ldr r0, _0230D614 ; =DUNGEON_PTR - mov r1, #0x54 - ldr r4, [r0] - add r5, r4, #0x184 - mov r0, r5 - bl MemZero - mov r1, #0 - strb r1, [r4, #0x184] - str r1, [r5, #4] - strb r1, [r5, #8] - strb r1, [r5, #9] - mov r0, #0xa - strb r0, [r5, #0xa] - strb r0, [r5, #0xb] - mov r0, #1 - strh r0, [r5, #0xc] - strh r0, [r5, #0xe] - strh r1, [r5, #0x10] - strh r1, [r5, #0x14] - strh r1, [r5, #0x12] - strh r1, [r5, #0x16] - strh r1, [r5, #0x1c] - str r1, [r5, #0x20] - str r1, [r5, #0x28] - str r1, [r5, #0x2c] - strb r1, [r5, #0x30] - strb r1, [r5, #0x31] - strb r1, [r5, #0x36] - strb r1, [r5, #0x37] - strb r1, [r5, #0x34] - strb r1, [r5, #0x35] - strb r1, [r5, #0x38] - strb r1, [r5, #0x39] - strb r1, [r5, #0x3a] - strb r1, [r5, #0x3b] - strb r1, [r5, #0x3c] - strb r1, [r5, #0x3d] - strb r1, [r5, #0x3e] - strb r1, [r5, #0x40] - strb r1, [r5, #0x3f] - strb r1, [r5, #0x41] - strb r1, [r5, #0x42] - strb r1, [r5, #0x43] - strb r1, [r5, #0x44] - strb r1, [r5, #0x45] - strb r1, [r5, #0x46] - strb r1, [r5, #0x47] - strb r1, [r5, #0x48] - strb r1, [r5, #0x4b] - strb r1, [r5, #0x4c] - strb r1, [r5, #0x4d] - strb r1, [r5, #0x4e] - strb r1, [r5, #0x4f] - strb r1, [r5, #0x50] - strb r1, [r5, #0x51] - strb r1, [r5, #0x32] - strb r1, [r5, #0x33] - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230D614: .word DUNGEON_PTR - arm_func_end ResetDamageCalcDiagnostics - - arm_func_start ov29_0230D618 -ov29_0230D618: ; 0x0230D618 - ldr r1, _0230D624 ; =ov29_02352894 - ldr r0, [r1, r0, lsl #2] - bx lr - .align 2, 0 -_0230D624: .word ov29_02352894 - arm_func_end ov29_0230D618 - - arm_func_start ov29_0230D628 -ov29_0230D628: ; 0x0230D628 - stmdb sp!, {r3, lr} - ldr r1, _0230D650 ; =DUNGEON_PTR - ldr r1, [r1] - add r1, r1, #0x1a000 -#ifdef JAPAN - ldr r1, [r1, #0x188] -#else - ldr r1, [r1, #0x22c] -#endif - cmp r1, r0 - ldmneia sp!, {r3, pc} - mov r1, #1 - bl PointCameraToMonster - ldmia sp!, {r3, pc} - .align 2, 0 -_0230D650: .word DUNGEON_PTR - arm_func_end ov29_0230D628 - - arm_func_start IsEitherMonsterInvalid -IsEitherMonsterInvalid: ; 0x0230D654 - stmdb sp!, {r4, lr} - mov r4, r1 - bl EntityIsValid__02308FBC - cmp r0, #0 - beq _0230D678 - mov r0, r4 - bl EntityIsValid__02308FBC - cmp r0, #0 - bne _0230D680 -_0230D678: - mov r0, #1 - ldmia sp!, {r4, pc} -_0230D680: - mov r0, #0 - ldmia sp!, {r4, pc} - arm_func_end IsEitherMonsterInvalid - - arm_func_start ov29_0230D688 -ov29_0230D688: ; 0x0230D688 - stmdb sp!, {r4, lr} - sub sp, sp, #8 - mov r4, r0 - ldrh r3, [r4] - mov r1, #0x55 - mov r2, #2 - strh r3, [sp] - ldrh r3, [r4, #2] - strh r3, [sp, #2] - ldrh r3, [r4, #4] - strh r3, [sp, #4] - bl GenerateStandardItem - mov r0, r4 - bl SetItemAcquired - ldrb r0, [sp, #1] - strb r0, [r4, #1] - cmp r0, #0 - beq _0230D6FC - add r0, sp, #0 - bl GetEquivItemIndex - cmp r0, #0 - blt _0230D6FC - bl GetItemAtIdx - ldrh r1, [r4] - strh r1, [r0] - ldrh r1, [r4, #2] - strh r1, [r0, #2] - ldrh r1, [r4, #4] - strh r1, [r0, #4] -_0230D6FC: - add sp, sp, #8 - ldmia sp!, {r4, pc} - arm_func_end ov29_0230D688 - - arm_func_start ov29_0230D704 -ov29_0230D704: ; 0x0230D704 - mov r0, #0 - bx lr - arm_func_end ov29_0230D704 - - arm_func_start ov29_0230D70C -ov29_0230D70C: ; 0x0230D70C - stmdb sp!, {r3, lr} - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _0230D734 ; =ov10_022C45B4 - ldrsh r1, [r1] - cmp r0, r1 - movlt r0, #1 - movge r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - .align 2, 0 -_0230D734: .word ov10_022C45B4 - arm_func_end ov29_0230D70C - - arm_func_start ov29_0230D738 -ov29_0230D738: ; 0x0230D738 - stmdb sp!, {r3, lr} - cmp r2, #0 - bne _0230D760 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _0230D768 ; =ov10_022C45B4 - ldrsh r1, [r1] - cmp r0, r1 - movlt r0, #1 - ldmltia sp!, {r3, pc} -_0230D760: - mov r0, #0 - ldmia sp!, {r3, pc} - .align 2, 0 -_0230D768: .word ov10_022C45B4 - arm_func_end ov29_0230D738 - - arm_func_start ov29_0230D76C -ov29_0230D76C: ; 0x0230D76C - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - mov r4, r2 - bl IsMonster__0230A994 - cmp r0, #0 - beq _0230D798 - mov r0, r5 - bl IsMonster__0230A994 - cmp r0, #0 - bne _0230D7A0 -_0230D798: - mov r0, #0 - ldmia sp!, {r4, r5, r6, pc} -_0230D7A0: - ldr r0, [r6, #0xb4] - ldr r1, [r5, #0xb4] - ldrsh r0, [r0, #2] - ldrsh r1, [r1, #2] - bl GendersNotEqualNotGenderless - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, pc} - mov r0, r6 - mov r1, r5 - mov r2, r4 - bl ov29_0230D738 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end ov29_0230D76C - - arm_func_start ov29_0230D7D4 -ov29_0230D7D4: ; 0x0230D7D4 - stmdb sp!, {r3, r4, r5, lr} - sub sp, sp, #0x10 - ldr r2, _0230D870 ; =ov29_023535D4 - mvn r1, #0 - ldrsh r3, [r2] - mov r4, r0 - cmp r3, r1 - beq _0230D808 - ldrsh r0, [r2] - bl TerminateEffectWrapper - ldr r0, _0230D870 ; =ov29_023535D4 - mvn r1, #0 - strh r1, [r0] -_0230D808: - mov r2, #0 - mov r1, #1 - str r2, [sp] - stmib sp, {r1, r2} - mov r0, r4 - rsb r1, r1, #0x2b8 - mov r3, #3 - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 - mvn r0, #0 - cmp r5, r0 - beq _0230D868 - mov r4, #0x18 - b _0230D850 -_0230D848: - mov r0, r4 - bl AdvanceFrame -_0230D850: - mov r0, r5 - bl ov10_022BF964 - cmp r0, #0 - bne _0230D848 - mov r0, r5 - bl TerminateEffectWrapper -_0230D868: - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230D870: .word ov29_023535D4 - arm_func_end ov29_0230D7D4 - - arm_func_start SwapDefensiveStages -SwapDefensiveStages: ; 0x0230D874 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - ldr lr, [r5, #0xb4] - ldr ip, [r4, #0xb4] - ldrsh r3, [lr, #0x28] - ldrsh r1, [lr, #0x2a] - ldrsh r0, [ip, #0x28] - cmp r2, #0 - strh r0, [lr, #0x28] - ldrsh r0, [ip, #0x2a] - strh r0, [lr, #0x2a] - strh r3, [ip, #0x28] - strh r1, [ip, #0x2a] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _0230D8E4 ; =0x00000F2D - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_0230D8E4: .word 0x00002494 -#else -_0230D8E4: .word 0x00000F2D -#endif - arm_func_end SwapDefensiveStages - - arm_func_start SwapDefensiveMultipliers -SwapDefensiveMultipliers: ; 0x0230D8E8 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - ldr lr, [r5, #0xb4] - ldr ip, [r4, #0xb4] - ldr r3, [lr, #0x3c] - ldr r1, [lr, #0x40] - ldr r0, [ip, #0x3c] - cmp r2, #0 - str r0, [lr, #0x3c] - ldr r0, [ip, #0x40] - str r0, [lr, #0x40] - str r3, [ip, #0x3c] - str r1, [ip, #0x40] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _0230D958 ; =0x00000F2E - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_0230D958: .word 0x00002495 -#else -_0230D958: .word 0x00000F2E -#endif - arm_func_end SwapDefensiveMultipliers - - arm_func_start SwapOffensiveStages -SwapOffensiveStages: ; 0x0230D95C - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - ldr lr, [r5, #0xb4] - ldr ip, [r4, #0xb4] - ldrsh r3, [lr, #0x24] - ldrsh r1, [lr, #0x26] - ldrsh r0, [ip, #0x24] - cmp r2, #0 - strh r0, [lr, #0x24] - ldrsh r0, [ip, #0x26] - strh r0, [lr, #0x26] - strh r3, [ip, #0x24] - strh r1, [ip, #0x26] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _0230D9CC ; =0x00000F2B - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_0230D9CC: .word 0x00002492 -#else -_0230D9CC: .word 0x00000F2B -#endif - arm_func_end SwapOffensiveStages - - arm_func_start SwapOffensiveMultipliers -SwapOffensiveMultipliers: ; 0x0230D9D0 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - ldr lr, [r5, #0xb4] - ldr ip, [r4, #0xb4] - ldr r3, [lr, #0x34] - ldr r1, [lr, #0x38] - ldr r0, [ip, #0x34] - cmp r2, #0 - str r0, [lr, #0x34] - ldr r0, [ip, #0x38] - str r0, [lr, #0x38] - str r3, [ip, #0x34] - str r1, [ip, #0x38] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _0230DA40 ; =0x00000F2C - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_0230DA40: .word 0x00002493 -#else -_0230DA40: .word 0x00000F2C -#endif - arm_func_end SwapOffensiveMultipliers - - arm_func_start SwapHitChanceStages -SwapHitChanceStages: ; 0x0230DA44 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - ldr lr, [r5, #0xb4] - ldr ip, [r4, #0xb4] - ldrsh r3, [lr, #0x2c] - ldrsh r1, [lr, #0x2e] - ldrsh r0, [ip, #0x2c] - cmp r2, #0 - strh r0, [lr, #0x2c] - ldrsh r0, [ip, #0x2e] - strh r0, [lr, #0x2e] - strh r3, [ip, #0x2c] - strh r1, [ip, #0x2e] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _0230DAB4 ; =0x00000F2F - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_0230DAB4: .word 0x00002496 -#else -_0230DAB4: .word 0x00000F2F -#endif - arm_func_end SwapHitChanceStages - - arm_func_start SwapUserAtkAndDefModifiers -SwapUserAtkAndDefModifiers: ; 0x0230DAB8 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldr ip, [r5, #0xb4] - mov r4, r1 - ldrsh r1, [ip, #0x24] - ldr r3, [ip, #0x34] - ldr r0, [ip, #0x3c] - cmp r2, #0 - str r0, [ip, #0x34] - ldrsh r0, [ip, #0x28] - strh r0, [ip, #0x24] - str r3, [ip, #0x3c] - strh r1, [ip, #0x28] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags -#ifdef JAPAN - ldr r2, _0230F050 ; =0x00002497 - mov r0, r5 - mov r1, r4 -#else - mov r0, r5 - mov r1, r4 - mov r2, #0xf30 -#endif - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} -#ifdef JAPAN -_0230F050: .word 0x00002497 -#endif - arm_func_end SwapUserAtkAndDefModifiers diff --git a/asm/overlay_29_0230D088.s b/asm/overlay_29_0230D088.s new file mode 100644 index 00000000..e498351d --- /dev/null +++ b/asm/overlay_29_0230D088.s @@ -0,0 +1,845 @@ + .include "asm/macros.inc" + .include "overlay_29_0230D088.inc" + + .text + + arm_func_start ov29_0230D088 +ov29_0230D088: ; 0x0230D088 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0x1c + ldr r5, [sp, #0x2c] + ldr r4, [sp, #0x28] + mov lr, r0 + strb r2, [r5, #0xc] + cmp r4, #1 + strb r3, [r5, #0xd] + mov ip, r1 + str r2, [sp] + mov r2, ip + ldr r0, _0230D118 ; =0x000003E7 + movlt r4, #1 + cmp r4, r0 + movgt r4, r0 + add r0, sp, #0x14 + mov r1, lr + mov r3, r4 + str r5, [sp, #4] + mov ip, #0 + str ip, [sp, #8] + bl CalcTypeBasedDamageEffects + add r0, sp, #0xc + mov r1, r4 + bl IntToFixedPoint64 + add r0, sp, #0xc + add r2, sp, #0x14 + mov r1, r0 + bl MultiplyFixedPoint64 + add r0, sp, #0xc + bl FixedPoint64ToInt + str r0, [r5] + mov r0, #0 + str r0, [r5, #4] + add sp, sp, #0x1c + ldmia sp!, {r4, r5, pc} + .align 2, 0 +_0230D118: .word 0x000003E7 + arm_func_end ov29_0230D088 + + arm_func_start ApplyDamageAndEffectsWrapper +ApplyDamageAndEffectsWrapper: ; 0x0230D11C + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0xdc + mov r7, r0 + add r0, sp, #0x10 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl ResetDamageData + add r0, sp, #0x24 + bl CreateTemporaryEntity + mov r3, #0 + mov r0, #2 + str r0, [sp, #0x18] + str r6, [sp, #0x10] + str r5, [sp, #0x14] + strb r3, [sp, #0x1c] + strb r3, [sp, #0x1e] + strb r3, [sp, #0x1f] + strb r3, [sp, #0x20] + stmia sp, {r3, r4} + str r3, [sp, #8] + mov r1, r7 + add r0, sp, #0x24 + add r2, sp, #0x10 + str r3, [sp, #0xc] + bl ApplyDamageAndEffects + add sp, sp, #0xdc + ldmia sp!, {r4, r5, r6, r7, pc} + arm_func_end ApplyDamageAndEffectsWrapper + + arm_func_start CalcRecoilDamageFixed +CalcRecoilDamageFixed: ; 0x0230D18C + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x1c + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + bl EntityIsValid__02308FBC + cmp r0, #0 + beq _0230D238 + ldr r0, [r7] + cmp r0, #1 + bne _0230D1F0 + ldr r0, [r7, #0xb4] + ldrsh r0, [r0, #0x10] + cmp r0, #0 + beq _0230D238 + mov r0, r7 + mov r1, #0x5c + bl AbilityIsActiveVeneer + cmp r0, #0 + beq _0230D1F0 + mov r0, r6, lsl #8 + mov r1, #0x180 + bl MultiplyByFixedPoint + mov r6, r0, asr #8 +_0230D1F0: + ldrb r1, [sp, #0x34] + str r4, [sp] + ldrsh r0, [sp, #0x38] + str r1, [sp, #4] + mov r1, #3 + str r1, [sp, #8] + ldr r1, [sp, #0x3c] + str r0, [sp, #0xc] + ldr r0, [sp, #0x40] + str r1, [sp, #0x10] + ldr r4, [sp, #0x44] + str r0, [sp, #0x14] + mov r0, r7 + mov r1, r7 + mov r2, r6 + mov r3, r5 + str r4, [sp, #0x18] + bl CalcDamageFixed +_0230D238: + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, pc} + arm_func_end CalcRecoilDamageFixed + + arm_func_start CalcDamageFixed +CalcDamageFixed: ; 0x0230D240 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x2c + mov sl, r0 + add r0, sp, #0x18 + mov sb, r1 + mov r8, r2 + mov r7, r3 + ldr r6, [sp, #0x54] + bl ResetDamageData + mov r5, #0 + ldrb r0, [sp, #0x58] + ldr r1, [sp, #0x60] + mov r2, #2 + str r2, [sp, #0x20] + str r1, [sp, #0x1c] + strb r6, [sp, #0x24] + strb r5, [sp, #0x26] + strb r5, [sp, #0x27] + strb r0, [sp, #0x25] + cmp r6, #0 + beq _0230D2F8 + add r4, sp, #0x10 +_0230D298: + mov r2, r5, lsl #0x10 + mov r0, sl + mov r1, sb + mov r3, r6 + mov r2, r2, asr #0x10 + bl GetTypeMatchup + str r0, [r4, r5, lsl #2] + add r5, r5, #1 + cmp r5, #2 + blt _0230D298 + mov r0, sl + mov r1, sb + mov r2, #0x35 +#ifndef JAPAN + mov r3, #1 +#endif + bl DefenderAbilityIsActive__0230A940 + cmp r0, #0 + beq _0230D2F8 + ldr r2, [sp, #0x10] + ldr r0, _0230D39C ; =TYPE_MATCHUP_COMBINATOR_TABLE + ldr r1, [sp, #0x14] + add r0, r0, r2, lsl #4 + ldr r0, [r0, r1, lsl #2] + cmp r0, #3 + movne r8, #0 +_0230D2F8: + ldrsh r1, [sp, #0x5c] + ldr r0, _0230D3A0 ; =0x00000256 + mov r8, r8, lsl #8 + cmp r1, r0 + bne _0230D334 + mov r0, sl + mov r1, #0x2f + bl IqSkillIsEnabled + cmp r0, #0 + beq _0230D334 + ldr r1, _0230D3A4 ; =POWER_PITCHER_DAMAGE_MULTIPLIER + mov r0, r8 + ldr r1, [r1] + bl MultiplyByFixedPoint + mov r8, r0 +_0230D334: + mov r0, r8 + bl RoundUpDiv256 + str r0, [sp, #0x18] + cmp r8, #0 + moveq r0, #1 + streqb r0, [sp, #0x28] + movne r0, #0 + strneb r0, [sp, #0x28] + ldrsh r1, [sp, #0x5c] + str r7, [sp] + ldr r0, [sp, #0x64] + str r1, [sp, #4] + str r0, [sp, #8] + ldr r4, [sp, #0x68] + add r2, sp, #0x18 + mov r0, sl + mov r1, sb + mov r3, #0 + str r4, [sp, #0xc] + bl ApplyDamageAndEffects + ldr r1, [sp, #0x50] + cmp r1, #0 + ldrneb r0, [sp, #0x28] + strneb r0, [r1] + add sp, sp, #0x2c + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_0230D39C: .word TYPE_MATCHUP_COMBINATOR_TABLE +_0230D3A0: .word 0x00000256 +_0230D3A4: .word POWER_PITCHER_DAMAGE_MULTIPLIER + arm_func_end CalcDamageFixed + + arm_func_start CalcDamageFixedNoCategory +CalcDamageFixedNoCategory: ; 0x0230D3A8 + stmdb sp!, {lr} + sub sp, sp, #0x1c + ldr lr, [sp, #0x20] + ldrb ip, [sp, #0x24] + str lr, [sp] + ldrsh lr, [sp, #0x28] + str ip, [sp, #4] + mov ip, #3 + str ip, [sp, #8] + ldr ip, [sp, #0x2c] + str lr, [sp, #0xc] + ldr lr, [sp, #0x30] + str ip, [sp, #0x10] + ldr ip, [sp, #0x34] + str lr, [sp, #0x14] + str ip, [sp, #0x18] + bl CalcDamageFixed + add sp, sp, #0x1c + ldmia sp!, {pc} + arm_func_end CalcDamageFixedNoCategory + + arm_func_start CalcDamageFixedWrapper +CalcDamageFixedWrapper: ; 0x0230D3F4 + stmdb sp!, {lr} + sub sp, sp, #0x1c + ldr ip, [sp, #0x20] + ldrb lr, [sp, #0x24] + str ip, [sp] + ldrb ip, [sp, #0x28] + str lr, [sp, #4] + ldrsh lr, [sp, #0x2c] + str ip, [sp, #8] + ldr ip, [sp, #0x30] + str lr, [sp, #0xc] + ldr lr, [sp, #0x34] + str ip, [sp, #0x10] + ldr ip, [sp, #0x38] + str lr, [sp, #0x14] + str ip, [sp, #0x18] + bl CalcDamageFixed + add sp, sp, #0x1c + ldmia sp!, {pc} + arm_func_end CalcDamageFixedWrapper + + arm_func_start UpdateShopkeeperModeAfterAttack +UpdateShopkeeperModeAfterAttack: ; 0x0230D440 + ldr r2, [r1, #0xb4] + ldrb r1, [r2, #9] + cmp r1, #0 + bxeq lr + ldr r1, [r0] + cmp r1, #1 + bxne lr + ldr r0, [r0, #0xb4] + ldrb r0, [r0, #6] + cmp r0, #0 + movne r0, #2 + strneb r0, [r2, #9] + moveq r0, #3 + streqb r0, [r2, #9] + bx lr + arm_func_end UpdateShopkeeperModeAfterAttack + + arm_func_start UpdateShopkeeperModeAfterTrap +UpdateShopkeeperModeAfterTrap: ; 0x0230D47C + ldr r2, [r0, #0xb4] + ldrb r0, [r2, #9] + cmp r0, #0 + bxeq lr + cmp r1, #0 + movne r0, #2 + strneb r0, [r2, #9] + moveq r0, #3 + streqb r0, [r2, #9] + bx lr + arm_func_end UpdateShopkeeperModeAfterTrap + + arm_func_start ov29_0230D4A4 +ov29_0230D4A4: ; 0x0230D4A4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r1 + mov r7, r0 + mov r0, r6 + mov r1, #0xe + mov r5, r2 + ldr r4, [r6, #0xb4] + bl MonsterIsType + cmp r0, #0 + beq _0230D4E8 + cmp r5, #1 + cmpne r5, #7 + bne _0230D4E8 + ldrb r0, [r4, #0xfe] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} +_0230D4E8: + mov r4, #0 + b _0230D518 +_0230D4F0: + mov r2, r4, lsl #0x10 + mov r0, r7 + mov r1, r6 + mov r3, r5 + mov r2, r2, asr #0x10 + bl GetTypeMatchup + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + add r4, r4, #1 +_0230D518: + cmp r4, #2 + blt _0230D4F0 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov29_0230D4A4 + + arm_func_start ResetDamageCalcDiagnostics +ResetDamageCalcDiagnostics: ; 0x0230D528 + stmdb sp!, {r3, r4, r5, lr} + ldr r0, _0230D614 ; =DUNGEON_PTR + mov r1, #0x54 + ldr r4, [r0] + add r5, r4, #0x184 + mov r0, r5 + bl MemZero + mov r1, #0 + strb r1, [r4, #0x184] + str r1, [r5, #4] + strb r1, [r5, #8] + strb r1, [r5, #9] + mov r0, #0xa + strb r0, [r5, #0xa] + strb r0, [r5, #0xb] + mov r0, #1 + strh r0, [r5, #0xc] + strh r0, [r5, #0xe] + strh r1, [r5, #0x10] + strh r1, [r5, #0x14] + strh r1, [r5, #0x12] + strh r1, [r5, #0x16] + strh r1, [r5, #0x1c] + str r1, [r5, #0x20] + str r1, [r5, #0x28] + str r1, [r5, #0x2c] + strb r1, [r5, #0x30] + strb r1, [r5, #0x31] + strb r1, [r5, #0x36] + strb r1, [r5, #0x37] + strb r1, [r5, #0x34] + strb r1, [r5, #0x35] + strb r1, [r5, #0x38] + strb r1, [r5, #0x39] + strb r1, [r5, #0x3a] + strb r1, [r5, #0x3b] + strb r1, [r5, #0x3c] + strb r1, [r5, #0x3d] + strb r1, [r5, #0x3e] + strb r1, [r5, #0x40] + strb r1, [r5, #0x3f] + strb r1, [r5, #0x41] + strb r1, [r5, #0x42] + strb r1, [r5, #0x43] + strb r1, [r5, #0x44] + strb r1, [r5, #0x45] + strb r1, [r5, #0x46] + strb r1, [r5, #0x47] + strb r1, [r5, #0x48] + strb r1, [r5, #0x4b] + strb r1, [r5, #0x4c] + strb r1, [r5, #0x4d] + strb r1, [r5, #0x4e] + strb r1, [r5, #0x4f] + strb r1, [r5, #0x50] + strb r1, [r5, #0x51] + strb r1, [r5, #0x32] + strb r1, [r5, #0x33] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0230D614: .word DUNGEON_PTR + arm_func_end ResetDamageCalcDiagnostics + + arm_func_start ov29_0230D618 +ov29_0230D618: ; 0x0230D618 + ldr r1, _0230D624 ; =ov29_02352894 + ldr r0, [r1, r0, lsl #2] + bx lr + .align 2, 0 +_0230D624: .word ov29_02352894 + arm_func_end ov29_0230D618 + + arm_func_start ov29_0230D628 +ov29_0230D628: ; 0x0230D628 + stmdb sp!, {r3, lr} + ldr r1, _0230D650 ; =DUNGEON_PTR + ldr r1, [r1] + add r1, r1, #0x1a000 +#ifdef JAPAN + ldr r1, [r1, #0x188] +#else + ldr r1, [r1, #0x22c] +#endif + cmp r1, r0 + ldmneia sp!, {r3, pc} + mov r1, #1 + bl PointCameraToMonster + ldmia sp!, {r3, pc} + .align 2, 0 +_0230D650: .word DUNGEON_PTR + arm_func_end ov29_0230D628 + + arm_func_start IsEitherMonsterInvalid +IsEitherMonsterInvalid: ; 0x0230D654 + stmdb sp!, {r4, lr} + mov r4, r1 + bl EntityIsValid__02308FBC + cmp r0, #0 + beq _0230D678 + mov r0, r4 + bl EntityIsValid__02308FBC + cmp r0, #0 + bne _0230D680 +_0230D678: + mov r0, #1 + ldmia sp!, {r4, pc} +_0230D680: + mov r0, #0 + ldmia sp!, {r4, pc} + arm_func_end IsEitherMonsterInvalid + + arm_func_start ov29_0230D688 +ov29_0230D688: ; 0x0230D688 + stmdb sp!, {r4, lr} + sub sp, sp, #8 + mov r4, r0 + ldrh r3, [r4] + mov r1, #0x55 + mov r2, #2 + strh r3, [sp] + ldrh r3, [r4, #2] + strh r3, [sp, #2] + ldrh r3, [r4, #4] + strh r3, [sp, #4] + bl GenerateStandardItem + mov r0, r4 + bl SetItemAcquired + ldrb r0, [sp, #1] + strb r0, [r4, #1] + cmp r0, #0 + beq _0230D6FC + add r0, sp, #0 + bl GetEquivItemIndex + cmp r0, #0 + blt _0230D6FC + bl GetItemAtIdx + ldrh r1, [r4] + strh r1, [r0] + ldrh r1, [r4, #2] + strh r1, [r0, #2] + ldrh r1, [r4, #4] + strh r1, [r0, #4] +_0230D6FC: + add sp, sp, #8 + ldmia sp!, {r4, pc} + arm_func_end ov29_0230D688 + + arm_func_start ov29_0230D704 +ov29_0230D704: ; 0x0230D704 + mov r0, #0 + bx lr + arm_func_end ov29_0230D704 + + arm_func_start ov29_0230D70C +ov29_0230D70C: ; 0x0230D70C + stmdb sp!, {r3, lr} + mov r0, #0x64 + bl DungeonRandInt + ldr r1, _0230D734 ; =ov10_022C45B4 + ldrsh r1, [r1] + cmp r0, r1 + movlt r0, #1 + movge r0, #0 + and r0, r0, #0xff + ldmia sp!, {r3, pc} + .align 2, 0 +_0230D734: .word ov10_022C45B4 + arm_func_end ov29_0230D70C + + arm_func_start ov29_0230D738 +ov29_0230D738: ; 0x0230D738 + stmdb sp!, {r3, lr} + cmp r2, #0 + bne _0230D760 + mov r0, #0x64 + bl DungeonRandInt + ldr r1, _0230D768 ; =ov10_022C45B4 + ldrsh r1, [r1] + cmp r0, r1 + movlt r0, #1 + ldmltia sp!, {r3, pc} +_0230D760: + mov r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_0230D768: .word ov10_022C45B4 + arm_func_end ov29_0230D738 + + arm_func_start ov29_0230D76C +ov29_0230D76C: ; 0x0230D76C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl IsMonster__0230A994 + cmp r0, #0 + beq _0230D798 + mov r0, r5 + bl IsMonster__0230A994 + cmp r0, #0 + bne _0230D7A0 +_0230D798: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} +_0230D7A0: + ldr r0, [r6, #0xb4] + ldr r1, [r5, #0xb4] + ldrsh r0, [r0, #2] + ldrsh r1, [r1, #2] + bl GendersNotEqualNotGenderless + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r6 + mov r1, r5 + mov r2, r4 + bl ov29_0230D738 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov29_0230D76C + + arm_func_start ov29_0230D7D4 +ov29_0230D7D4: ; 0x0230D7D4 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x10 + ldr r2, _0230D870 ; =ov29_023535D4 + mvn r1, #0 + ldrsh r3, [r2] + mov r4, r0 + cmp r3, r1 + beq _0230D808 + ldrsh r0, [r2] + bl TerminateEffectWrapper + ldr r0, _0230D870 ; =ov29_023535D4 + mvn r1, #0 + strh r1, [r0] +_0230D808: + mov r2, #0 + mov r1, #1 + str r2, [sp] + stmib sp, {r1, r2} + mov r0, r4 + rsb r1, r1, #0x2b8 + mov r3, #3 + str r2, [sp, #0xc] + bl PlayEffectAnimationEntity + mov r0, r0, lsl #0x10 + mov r5, r0, asr #0x10 + mvn r0, #0 + cmp r5, r0 + beq _0230D868 + mov r4, #0x18 + b _0230D850 +_0230D848: + mov r0, r4 + bl AdvanceFrame +_0230D850: + mov r0, r5 + bl ov10_022BF964 + cmp r0, #0 + bne _0230D848 + mov r0, r5 + bl TerminateEffectWrapper +_0230D868: + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0230D870: .word ov29_023535D4 + arm_func_end ov29_0230D7D4 + + arm_func_start SwapDefensiveStages +SwapDefensiveStages: ; 0x0230D874 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + ldr lr, [r5, #0xb4] + ldr ip, [r4, #0xb4] + ldrsh r3, [lr, #0x28] + ldrsh r1, [lr, #0x2a] + ldrsh r0, [ip, #0x28] + cmp r2, #0 + strh r0, [lr, #0x28] + ldrsh r0, [ip, #0x2a] + strh r0, [lr, #0x2a] + strh r3, [ip, #0x28] + strh r1, [ip, #0x2a] + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + mov r1, r4 + mov r0, #1 + mov r2, #0 + bl SubstitutePlaceholderStringTags + ldr r2, _0230D8E4 ; =0x00000F2D + mov r0, r5 + mov r1, r4 + bl LogMessageByIdWithPopupCheckUserTarget + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +#ifdef JAPAN +_0230D8E4: .word 0x00002494 +#else +_0230D8E4: .word 0x00000F2D +#endif + arm_func_end SwapDefensiveStages + + arm_func_start SwapDefensiveMultipliers +SwapDefensiveMultipliers: ; 0x0230D8E8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + ldr lr, [r5, #0xb4] + ldr ip, [r4, #0xb4] + ldr r3, [lr, #0x3c] + ldr r1, [lr, #0x40] + ldr r0, [ip, #0x3c] + cmp r2, #0 + str r0, [lr, #0x3c] + ldr r0, [ip, #0x40] + str r0, [lr, #0x40] + str r3, [ip, #0x3c] + str r1, [ip, #0x40] + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + mov r1, r4 + mov r0, #1 + mov r2, #0 + bl SubstitutePlaceholderStringTags + ldr r2, _0230D958 ; =0x00000F2E + mov r0, r5 + mov r1, r4 + bl LogMessageByIdWithPopupCheckUserTarget + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +#ifdef JAPAN +_0230D958: .word 0x00002495 +#else +_0230D958: .word 0x00000F2E +#endif + arm_func_end SwapDefensiveMultipliers + + arm_func_start SwapOffensiveStages +SwapOffensiveStages: ; 0x0230D95C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + ldr lr, [r5, #0xb4] + ldr ip, [r4, #0xb4] + ldrsh r3, [lr, #0x24] + ldrsh r1, [lr, #0x26] + ldrsh r0, [ip, #0x24] + cmp r2, #0 + strh r0, [lr, #0x24] + ldrsh r0, [ip, #0x26] + strh r0, [lr, #0x26] + strh r3, [ip, #0x24] + strh r1, [ip, #0x26] + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + mov r1, r4 + mov r0, #1 + mov r2, #0 + bl SubstitutePlaceholderStringTags + ldr r2, _0230D9CC ; =0x00000F2B + mov r0, r5 + mov r1, r4 + bl LogMessageByIdWithPopupCheckUserTarget + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +#ifdef JAPAN +_0230D9CC: .word 0x00002492 +#else +_0230D9CC: .word 0x00000F2B +#endif + arm_func_end SwapOffensiveStages + + arm_func_start SwapOffensiveMultipliers +SwapOffensiveMultipliers: ; 0x0230D9D0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + ldr lr, [r5, #0xb4] + ldr ip, [r4, #0xb4] + ldr r3, [lr, #0x34] + ldr r1, [lr, #0x38] + ldr r0, [ip, #0x34] + cmp r2, #0 + str r0, [lr, #0x34] + ldr r0, [ip, #0x38] + str r0, [lr, #0x38] + str r3, [ip, #0x34] + str r1, [ip, #0x38] + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + mov r1, r4 + mov r0, #1 + mov r2, #0 + bl SubstitutePlaceholderStringTags + ldr r2, _0230DA40 ; =0x00000F2C + mov r0, r5 + mov r1, r4 + bl LogMessageByIdWithPopupCheckUserTarget + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +#ifdef JAPAN +_0230DA40: .word 0x00002493 +#else +_0230DA40: .word 0x00000F2C +#endif + arm_func_end SwapOffensiveMultipliers + + arm_func_start SwapHitChanceStages +SwapHitChanceStages: ; 0x0230DA44 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + ldr lr, [r5, #0xb4] + ldr ip, [r4, #0xb4] + ldrsh r3, [lr, #0x2c] + ldrsh r1, [lr, #0x2e] + ldrsh r0, [ip, #0x2c] + cmp r2, #0 + strh r0, [lr, #0x2c] + ldrsh r0, [ip, #0x2e] + strh r0, [lr, #0x2e] + strh r3, [ip, #0x2c] + strh r1, [ip, #0x2e] + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + mov r1, r4 + mov r0, #1 + mov r2, #0 + bl SubstitutePlaceholderStringTags + ldr r2, _0230DAB4 ; =0x00000F2F + mov r0, r5 + mov r1, r4 + bl LogMessageByIdWithPopupCheckUserTarget + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +#ifdef JAPAN +_0230DAB4: .word 0x00002496 +#else +_0230DAB4: .word 0x00000F2F +#endif + arm_func_end SwapHitChanceStages + + arm_func_start SwapUserAtkAndDefModifiers +SwapUserAtkAndDefModifiers: ; 0x0230DAB8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr ip, [r5, #0xb4] + mov r4, r1 + ldrsh r1, [ip, #0x24] + ldr r3, [ip, #0x34] + ldr r0, [ip, #0x3c] + cmp r2, #0 + str r0, [ip, #0x34] + ldrsh r0, [ip, #0x28] + strh r0, [ip, #0x24] + str r3, [ip, #0x3c] + strh r1, [ip, #0x28] + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags +#ifdef JAPAN + ldr r2, _0230F050 ; =0x00002497 + mov r0, r5 + mov r1, r4 +#else + mov r0, r5 + mov r1, r4 + mov r2, #0xf30 +#endif + bl LogMessageByIdWithPopupCheckUserTarget + ldmia sp!, {r3, r4, r5, pc} +#ifdef JAPAN +_0230F050: .word 0x00002497 +#endif + arm_func_end SwapUserAtkAndDefModifiers diff --git a/include/dungeon_mode.h b/include/dungeon_mode.h index e33ce6c4..9aada8db 100644 --- a/include/dungeon_mode.h +++ b/include/dungeon_mode.h @@ -1165,10 +1165,7 @@ struct damage_calc_diag { u8 field_0x1; u8 field_0x2; u8 field_0x3; - enum move_category move_category; // 0x4: The category of the last move used - u8 field_0x5; - u8 field_0x6; - u8 field_0x7; + s32 move_category; // 0x8: The type matchup of the last move used against the individual types of the defender enum type_matchup move_indiv_type_matchups[2]; // 0xA: The modified offensive stat stage of the attacker for the last move used @@ -1222,29 +1219,29 @@ struct damage_calc_diag { s32 static_damage_mult; // 0x30: The net number of attack boosts to an attacker due to a Power Band or Munch Belt. // It seems like there's a bug in the code; aura bows do not contribute to this field. - s8 item_atk_modifier; + u8 item_atk_modifier; // 0x31: The net number of special attack boosts to an attacker due to a Special Band, // Munch Belt, or aura bow. It seems like there's a bug in the code; physical attack boosts // from aura bows also contribute to this field. - s8 item_sp_atk_modifier; + u8 item_sp_atk_modifier; // 0x32: The net number of offense boosts to an attacker due to Download, Rivalry, // Flower Gift, and Solar Power - s8 ability_offense_modifier; + u8 ability_offense_modifier; // 0x33: The net number of defense boosts to a defender due to Flower Gift - s8 ability_defense_modifier; + u8 ability_defense_modifier; // 0x34: The net number of offense boosts to an attacker due to Aggressor, Defender, and // Practice Swinger - s8 iq_skill_offense_modifier; + u8 iq_skill_offense_modifier; // 0x35: The net number of defense boosts to a defender due to Counter Basher, Aggressor, and // Defender - s8 iq_skill_defense_modifier; + u8 iq_skill_defense_modifier; // 0x36: The net number of defense boosts to a defender due to a Def Scarf or aura bow. // It seems like there's a bug in the code; special defense boosts from aura bows also // contribute to this field. - s8 item_def_modifier; + u8 item_def_modifier; // 0x37: The net number of special defense boosts to a defender due to a Zinc Band. // It seems like there's a bug in the code; aura bows do not contribute to this field. - s8 item_sp_def_modifier; + u8 item_sp_def_modifier; // 0x38: Whether or not Scope Lens or Sharpshooter boosted the critical hit rate of a move bool8 scope_lens_or_sharpshooter_activated; // 0x39: Whether or not the Patsy Band boosted the critical hit rate of a move diff --git a/include/overlay_29_0230BBAC.h b/include/overlay_29_0230BBAC.h new file mode 100644 index 00000000..89b70f0a --- /dev/null +++ b/include/overlay_29_0230BBAC.h @@ -0,0 +1,12 @@ +#ifndef PMDSKY_OVERLAY_29_0230BBAC_H +#define PMDSKY_OVERLAY_29_0230BBAC_H + +#include "dungeon_mode.h" +#include "enums.h" +#include "overlay_29_02308FBC.h" + +void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id attack_type, + s32 power, s32 crit_chance, struct unk_02308FE0 *damage_out, + s32 damage_mult, enum move_id move_id, s32 a9); + +#endif diff --git a/main.lsf b/main.lsf index c043d8c0..d79a998a 100644 --- a/main.lsf +++ b/main.lsf @@ -977,7 +977,8 @@ Overlay OVY_29 Object src/type_effectiveness.o Object src/dungeon_damage.o Object asm/overlay_29_rodata_02352894.o - Object asm/overlay_29_0230BBAC.o + Object src/overlay_29_0230BBAC.o + Object asm/overlay_29_0230D088.o Object src/dungeon_recruitment.o Object asm/overlay_29_0230E064.o Object src/overlay_29_0230E578.o diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c new file mode 100644 index 00000000..6e81469f --- /dev/null +++ b/src/overlay_29_0230BBAC.c @@ -0,0 +1,734 @@ +#include "overlay_29_0230BBAC.h" +#include "debug.h" +#include "dg_random.h" +#include "dungeon.h" +#include "dungeon_logic.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_util_static.h" +#include "enums.h" +#include "item.h" +#include "main_02001894.h" +#include "main_02001A54.h" +#include "main_02001BB4.h" +#include "main_02001CD4.h" +#include "main_02014CEC.h" +#include "main_0201514C.h" +#include "main_02054DC4.h" +#include "move_orb_effects.h" +#include "number_util.h" +#include "overlay_29_022E3F20.h" +#include "overlay_29_022E406C.h" +#include "overlay_29_0230A994.h" +#include "overlay_29_0230A9DC.h" +#include "run_dungeon_1.h" +#include "type_effectiveness.h" +#include "weather.h" + +extern struct dungeon *DUNGEON_PTR; +extern u8 GetMonsterGenderVeneer(s16 monster_id); +extern u8 ExclusiveItemOffenseBoost(struct entity *entity, s32 idx); +extern u8 ExclusiveItemDefenseBoost(struct entity *entity, s32 idx); +extern int MoveIsNotPhysical(enum move_id move_id); +extern bool8 NearbyAllyIqSkillIsEnabled(struct entity *entity, enum iq_skill_id iq_skill); +extern s32 FixedPoint64ToInt(struct fixed_point_64 *x); +extern void AddFixedPoint64(struct fixed_point_64 *out, struct fixed_point_64 *a, struct fixed_point_64 *b); +extern void ClampedLn(struct fixed_point_64 *out, s32 x); +extern int IsRecoilMove(enum move_id move_id); +extern void PlayEffectAnimation0x1A9__022E6130(struct entity *entity); +extern void PlayEffectAnimation0x1A9__022E617C(struct entity *entity); +extern void PlayEffectAnimation0x18E(struct entity *entity); +extern bool8 AuraBowIsActive(struct entity *entity); +extern bool8 FixedPoint64CmpLt(const struct fixed_point_64 *a, const struct fixed_point_64 *b); +extern void DivideFixedPoint64(struct fixed_point_64 *out, struct fixed_point_64 *a, struct fixed_point_64 *b); +extern void ResetDamageCalcDiagnostics(void); +extern bool8 OtherMonsterAbilityIsActive(struct entity *entity, enum ability_id ability_id); +extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); +extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); +extern bool8 UpdateStateFlags(struct monster *info, s32 flag, bool8 value); +extern void ResetDamageData(struct unk_02308FE0 *damage_data); +extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity, u32 param_3); +extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); +extern const u8 ov29_02352984[]; +extern const u8 ov29_02352990[]; +extern const u8 ov29_0235299C[]; +extern const s32 ov29_02352838[]; +extern const s16 AURA_BOW_STAT_BOOST; +extern const s16 DEF_SCARF_STAT_BOOST; +extern const s16 MUNCH_BELT_STAT_BOOST; +extern const s16 POWER_BAND_STAT_BOOST; +extern const s16 SPECIAL_BAND_STAT_BOOST; +extern const s16 ZINC_BAND_STAT_BOOST; +extern const s16 SCOPE_LENS_CRIT_RATE_BOOST; +extern const s16 SUPER_LUCK_CRIT_RATE_BOOST; +extern const s16 TYPE_ADVANTAGE_MASTER_CRIT_RATE; +extern const s32 AIR_BLADE_DAMAGE_MULTIPLIER; +extern const s32 ME_FIRST_MULTIPLIER; +extern const s32 POWER_PITCHER_DAMAGE_MULTIPLIER; +extern const s32 DAMAGE_FORMULA_AT_PREFACTOR; +extern const s32 DAMAGE_FORMULA_CONSTANT_SHIFT; +extern const s32 DAMAGE_FORMULA_DEF_PREFACTOR; +extern const s32 DAMAGE_FORMULA_FLV_DEFICIT_DIVISOR; +extern const s32 DAMAGE_FORMULA_FLV_SHIFT; +extern const s32 DAMAGE_FORMULA_LN_ARG_PREFACTOR; +extern const s32 DAMAGE_FORMULA_LN_PREFACTOR; +extern const s32 DAMAGE_FORMULA_NON_TEAM_MEMBER_MODIFIER; +extern const s32 OFFENSIVE_STAT_STAGE_MULTIPLIERS[21]; +extern const s32 DEFENSIVE_STAT_STAGE_MULTIPLIERS[21]; +extern const struct fixed_point_64 DAMAGE_FORMULA_MAX_BASE; +extern const struct fixed_point_64 DAMAGE_FORMULA_MIN_BASE; +extern const struct fixed_point_64 DAMAGE_MULTIPLIER_0_5; +extern const struct fixed_point_64 DAMAGE_MULTIPLIER_1_5; +extern const struct fixed_point_64 DAMAGE_MULTIPLIER_2; + +#ifdef JAPAN +#define MESSAGE_C53 0x992 +#define MESSAGE_C54 0x993 +#define MESSAGE_C55 0x994 +#define MESSAGE_C57 0x996 +#define MESSAGE_C58 0x997 +#define MESSAGE_DC1 0xB01 +#else +#define MESSAGE_C53 0xC53 +#define MESSAGE_C54 0xC54 +#define MESSAGE_C55 0xC55 +#define MESSAGE_C57 0xC57 +#define MESSAGE_C58 0xC58 +#define MESSAGE_DC1 0xDC1 +#endif + +void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id attack_type, + s32 power, s32 crit_chance, struct unk_02308FE0 *damage_out, + s32 damage_mult, enum move_id move_id, s32 a9) +{ + struct fixed_point_64 type_mult; + struct fixed_point_64 base; + struct fixed_point_64 flv_fp; + struct fixed_point_64 at_fp; + struct fixed_point_64 def_fp; + s32 calc[2]; + struct fixed_point_64 tmp2; + struct fixed_point_64 tmp; + struct fixed_point_64 scratch; + struct fixed_point_64 tmp3; + struct fixed_point_64 mult_fp; + struct fixed_point_64 ln_fp; + struct fixed_point_64 mult32_fp; + struct fixed_point_64 hundred_fp; + struct monster *amon; + struct monster *dmon; + bool8 has_status; + s32 off_stage; + s32 ability_roll; + s32 off_mult; + s32 def_mult; + bool8 has_status2; + bool8 has_status3; + s32 not_physical2; + s32 def_ability_div; + s32 def_ability_mult; + s32 dv; + s32 p; + struct monster *info; + struct monster *info2; + int dmult; + s32 not_physical; + s32 is_team_member; + s32 def_stage; + s32 off_ability_mult; + s32 off_ability_div; + s32 off_mod; + s32 def_mod; + bool8 boosted; + s32 type_boosted; + s32 rate; + s32 flash; + volatile s32 *po; + volatile s32 *po2; + volatile s32 *pd; + struct damage_calc_diag *diag; + + amon = GetEntInfo(attacker); + dmon = GetEntInfo(defender); + dmult = damage_mult; + diag = &DUNGEON_PTR->last_damage_calc; + ResetDamageData(damage_out); + + if (amon->me_first_flag) { + dmult = MultiplyByFixedPoint(dmult, ME_FIRST_MULTIPLIER); + } + if (AbilityIsActiveVeneer(attacker, ABILITY_RECKLESS) && IsRecoilMove(move_id)) { + dmult = dmult * 3 / 2; + } + if (AbilityIsActiveVeneer(attacker, ABILITY_IRON_FIST) && IsPunchMove(move_id)) { + dmult = MultiplyByFixedPoint(dmult, 0x180); + } + if (AbilityIsActiveVeneer(attacker, ABILITY_NORMALIZE)) { + attack_type = TYPE_NORMAL; + } + if (move_id == 0x1D3) { + attack_type = amon->types[0]; + } + not_physical = MoveIsNotPhysical(move_id); + ResetDamageCalcDiagnostics(); + + if (!amon->is_team_leader && CeilFixedPoint(amon->belly) == 0) { + damage_out->field_0x0 = 1; + damage_out->field_0x4 = 0; + damage_out->field_0x8 = MATCHUP_NEUTRAL; + damage_out->field_0xc = attack_type; + damage_out->field_0xd = GetMoveCategory(move_id); + damage_out->field_0xe = FALSE; + damage_out->field_0xf = FALSE; + damage_out->field_0x10 = FALSE; + return; + } +#ifdef JAPAN + if (move_id == 0x163 + && DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_WONDER_GUARD)) { +#else + if (move_id == 0x163 + && DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_WONDER_GUARD, TRUE)) { +#endif + damage_out->field_0x0 = 1; + damage_out->field_0x4 = 0; + damage_out->field_0x8 = MATCHUP_NEUTRAL; + damage_out->field_0xc = attack_type; + damage_out->field_0xd = GetMoveCategory(move_id); + damage_out->field_0xe = FALSE; + damage_out->field_0xf = FALSE; + damage_out->field_0x10 = FALSE; + return; + } + + damage_out->field_0xc = attack_type; + damage_out->field_0xd = GetMoveCategory(move_id); + diag->move_type = attack_type; + off_mod = 0; + def_mod = 0; + diag->move_category = not_physical; + off_mult = amon->stat_modifiers.offensive_multipliers[not_physical]; + def_mult = dmon->stat_modifiers.defensive_multipliers[not_physical]; + + if (AbilityIsActiveVeneer(attacker, ABILITY_DOWNLOAD)) { + if (dmon->defensive_stats[0] >= dmon->defensive_stats[1]) { + if (not_physical == 1) { + off_mod++; + diag->ability_offense_modifier++; + } + } else if (not_physical == 0) { + off_mod++; + diag->ability_offense_modifier++; + } + } + + off_stage = amon->stat_modifiers.offensive_stages[not_physical]; + if (a9) { + if (attack_type == TYPE_FIRE) { + s16 boost = amon->stat_modifiers.flash_fire_boost; + diag->flash_fire_boost = boost; + off_mod += boost; + } + } + + if (IqSkillIsEnabled(attacker, IQ_AGGRESSOR)) { + off_mod++; + diag->iq_skill_offense_modifier++; + } + if (IqSkillIsEnabled(attacker, IQ_DEFENDER)) { + off_mod--; + diag->iq_skill_offense_modifier--; + } + if (IqSkillIsEnabled(attacker, IQ_PRACTICE_SWINGER) && amon->practice_swinger_flag) { + off_mod++; + diag->iq_skill_offense_modifier++; + } + if (NearbyAllyIqSkillIsEnabled(attacker, IQ_CHEERLEADER)) { + off_mod++; + } + + if (not_physical == 0) { + if (AbilityIsActiveVeneer(attacker, ABILITY_RIVALRY)) { + if (GendersEqualNotGenderless(amon->apparent_id, dmon->apparent_id)) { + off_mod++; + diag->ability_offense_modifier++; + } else if (GetMonsterGenderVeneer(amon->apparent_id) != 3 + && GetMonsterGenderVeneer(dmon->apparent_id) != 3) { + off_mod--; + diag->ability_offense_modifier--; + } + } + if (GetApparentWeather(attacker) == WEATHER_SUNNY + && (AbilityIsActiveVeneer(attacker, ABILITY_FLOWER_GIFT) + || OtherMonsterAbilityIsActive(attacker, ABILITY_FLOWER_GIFT))) { + off_mod++; + diag->ability_offense_modifier++; + } + } else { + if (AbilityIsActiveVeneer(attacker, ABILITY_SOLAR_POWER) + && GetApparentWeather(attacker) == WEATHER_SUNNY) { + off_mod += 2; + diag->ability_offense_modifier += 2; + } + if (GetApparentWeather(defender) == WEATHER_SUNNY + && (AbilityIsActiveVeneer(defender, ABILITY_FLOWER_GIFT) + || OtherMonsterAbilityIsActive(defender, ABILITY_FLOWER_GIFT))) { + def_mod++; + diag->ability_defense_modifier++; + } + if (GetApparentWeather(defender) == WEATHER_SANDSTORM + && (dmon->types[0] == TYPE_ROCK || dmon->types[1] == TYPE_ROCK)) { + def_mod += 2; + } + } + + if (amon->apparent_id == 0x1A3) { + off_mod += 2; + } + if (amon->apparent_id == 0x1A4) { + off_mod -= 2; + } + if (amon->apparent_id == 0x1A5) { + off_mod -= 2; + } + if (amon->apparent_id == 0x211) { + off_mod -= 2; + } else if (amon->apparent_id == 0x218) { + off_mod += 2; + } + + off_stage += off_mod; + if (amon->anger_point_flag && AbilityIsActiveVeneer(attacker, ABILITY_ANGER_POINT)) { + off_stage = 20; + } + + def_stage = dmon->stat_modifiers.defensive_stages[not_physical]; + if (not_physical == 0) { + if (dmon->bide_class_status.bide == 6) { + diag->skull_bash_defense_boost_activated = TRUE; + def_mod++; + } + if (IqSkillIsEnabled(defender, IQ_COUNTER_BASHER)) { + def_mod--; + diag->iq_skill_defense_modifier--; + } + } + if (IqSkillIsEnabled(defender, IQ_AGGRESSOR)) { + def_mod--; + diag->iq_skill_defense_modifier--; + } + if (IqSkillIsEnabled(defender, IQ_DEFENDER)) { + def_mod++; + diag->iq_skill_defense_modifier++; + } + if (dmon->apparent_id == 0x1A3) { + def_mod -= 2; + } + if (dmon->apparent_id == 0x1A4) { + def_mod += 2; + } + if (dmon->apparent_id == 0x1A5) { + def_mod -= 2; + } +#ifdef JAPAN + if (amon->apparent_id == 0x211) { + def_mod += 2; + } else if (amon->apparent_id == 0x218) { + def_mod -= 2; + } +#else + if (dmon->apparent_id == 0x211) { + def_mod += 2; + } else if (dmon->apparent_id == 0x218) { + def_mod -= 2; + } +#endif + def_stage += def_mod; + + if (move_id == 0x1BD) { + s16 sum = 0; + + if (dmon->stat_modifiers.offensive_stages[0] > 10) { + sum += dmon->stat_modifiers.offensive_stages[0] - 10; + } + if (dmon->stat_modifiers.defensive_stages[0] > 10) { + sum += dmon->stat_modifiers.defensive_stages[0] - 10; + } + if (dmon->stat_modifiers.offensive_stages[1] > 10) { + sum += dmon->stat_modifiers.offensive_stages[1] - 10; + } + if (dmon->stat_modifiers.defensive_stages[1] > 10) { + sum += dmon->stat_modifiers.defensive_stages[1] - 10; + } + off_stage += sum; + } + + if (AbilityIsActiveVeneer(attacker, ABILITY_UNAWARE)) { + def_stage = 10; + def_mult = 0x100; +#ifdef JAPAN + } else if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_UNAWARE)) { +#else + } else if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_UNAWARE, TRUE)) { +#endif + off_stage = 10; + off_mult = 0x100; + } + + if (off_stage < 0) { + off_stage = 0; + } + if (off_stage > 20) { + off_stage = 20; + } + diag->offensive_stat_stage = off_stage; + diag->offensive_stat = amon->offensive_stats[not_physical]; + calc[0] = MultiplyByFixedPoint( + MultiplyByFixedPoint(amon->offensive_stats[not_physical] << 8, + OFFENSIVE_STAT_STAGE_MULTIPLIERS[off_stage]), + off_mult) >> 8; + + if (def_stage < 0) { + def_stage = 0; + } + if (def_stage > 20) { + def_stage = 20; + } + diag->defensive_stat_stage = def_stage; + diag->defensive_stat = dmon->defensive_stats[not_physical]; + calc[1] = MultiplyByFixedPoint( + MultiplyByFixedPoint(dmon->defensive_stats[not_physical] << 8, + DEFENSIVE_STAT_STAGE_MULTIPLIERS[def_stage]), + def_mult) >> 8; + + if (!amon->is_not_team_member) { + calc[0] += ExclusiveItemOffenseBoost(attacker, not_physical); + } + if (!dmon->is_not_team_member) { + calc[1] += ExclusiveItemDefenseBoost(defender, not_physical); + } + + if (not_physical == 0) { + if (ItemIsActive__0230A9DC(attacker, ITEM_POWER_BAND)) { + calc[0] += POWER_BAND_STAT_BOOST; + diag->item_atk_modifier += POWER_BAND_STAT_BOOST; + } + if (ItemIsActive__0230A9DC(attacker, ITEM_MUNCH_BELT)) { + calc[0] += MUNCH_BELT_STAT_BOOST; + diag->item_atk_modifier += MUNCH_BELT_STAT_BOOST; + } + if (AuraBowIsActive(attacker)) { + calc[0] += AURA_BOW_STAT_BOOST; + diag->item_sp_atk_modifier += AURA_BOW_STAT_BOOST; + } + if (a9) { + if (ItemIsActive__0230A9DC(defender, ITEM_DEF_SCARF)) { + calc[1] += DEF_SCARF_STAT_BOOST; + diag->item_def_modifier += DEF_SCARF_STAT_BOOST; + } + if (AuraBowIsActive(defender)) { + calc[1] += AURA_BOW_STAT_BOOST; + diag->item_def_modifier += AURA_BOW_STAT_BOOST; + } + } + } else { + if (a9) { + if (ItemIsActive__0230A9DC(defender, ITEM_ZINC_BAND)) { + calc[1] += ZINC_BAND_STAT_BOOST; + diag->item_sp_def_modifier += ZINC_BAND_STAT_BOOST; + } + if (AuraBowIsActive(defender)) { + calc[1] += AURA_BOW_STAT_BOOST; + diag->item_def_modifier += AURA_BOW_STAT_BOOST; + } + } + if (ItemIsActive__0230A9DC(attacker, ITEM_SPECIAL_BAND)) { + calc[0] += SPECIAL_BAND_STAT_BOOST; + diag->item_sp_atk_modifier += SPECIAL_BAND_STAT_BOOST; + } + if (ItemIsActive__0230A9DC(attacker, ITEM_MUNCH_BELT)) { + calc[0] += MUNCH_BELT_STAT_BOOST; + diag->item_sp_atk_modifier += MUNCH_BELT_STAT_BOOST; + } + if (AuraBowIsActive(defender)) { + calc[0] += AURA_BOW_STAT_BOOST; + diag->item_sp_atk_modifier += AURA_BOW_STAT_BOOST; + } + } + + po = &calc[0]; + po2 = &calc[0]; + FixedPoint32To64(&at_fp, + MultiplyByFixedPoint(MultiplyByFixedPoint(power << 8, + OFFENSIVE_STAT_STAGE_MULTIPLIERS[off_stage]), + off_mult)); + ability_roll = DungeonRandInt(100); + amon->prev_state_flags &= ~0x100; + amon->state_flags &= ~0x100; + off_ability_mult = 1; + off_ability_div = 1; + def_ability_mult = 1; + def_ability_div = 1; + + not_physical2 = MoveIsNotPhysical(move_id); + if (not_physical2 == 0 && AbilityIsActiveVeneer(attacker, ABILITY_GUTS)) { + info = attacker->info; + has_status = MonsterHasNegativeStatus(attacker, TRUE); + boosted = UpdateStateFlags(info, 1, has_status); + if (has_status) { + off_ability_mult <<= 1; + } + if (boosted) { + PlayEffectAnimation0x1A9__022E6130(attacker); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C53); + } + } + + if (AbilityIsActiveVeneer(attacker, ABILITY_HUGE_POWER) + || AbilityIsActiveVeneer(attacker, ABILITY_PURE_POWER)) { + info = attacker->info; + has_status2 = (ability_roll < 0x21 && not_physical2 == 0); + boosted = UpdateStateFlags(info, 0x100, has_status2); + if (has_status2) { + off_ability_mult += off_ability_mult * 2; + off_ability_div <<= 1; + } + if (boosted) { + PlayEffectAnimation0x1A9__022E617C(attacker); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C54); + } + } + + if (AbilityIsActiveVeneer(attacker, ABILITY_HUSTLE) && not_physical2 == 0) { + off_ability_mult += off_ability_mult * 2; + off_ability_div <<= 1; + } + + is_team_member = !((struct monster *)attacker->info)->is_not_team_member; + if (AbilityIsActiveVeneer(attacker, ABILITY_PLUS) && not_physical2 == 1 + && DUNGEON_PTR->minus_is_active[is_team_member]) { + off_ability_mult = off_ability_mult * 16 - off_ability_mult; + off_ability_div *= 10; + } + if (AbilityIsActiveVeneer(attacker, ABILITY_MINUS) && not_physical2 == 1 + && DUNGEON_PTR->plus_is_active[is_team_member]) { + off_ability_mult = off_ability_mult * 16 - off_ability_mult; + off_ability_div *= 10; + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_INTIMIDATE) + && not_physical2 == 0) { +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_INTIMIDATE, TRUE) + && not_physical2 == 0) { +#endif + off_ability_mult <<= 2; + off_ability_div += off_ability_div * 4; + } +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MARVEL_SCALE) + && not_physical2 == 0) { +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MARVEL_SCALE, TRUE) + && not_physical2 == 0) { +#endif + info2 = defender->info; + has_status3 = MonsterHasNegativeStatus(defender, TRUE); + boosted = UpdateStateFlags(info2, 8, has_status3); + if (has_status3) { + def_ability_mult = def_ability_mult * 3; + def_ability_div <<= 1; + } + if (boosted) { + PlayEffectAnimation0x18E(defender); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C55); + } + } + + pd = &calc[1]; + p = *po * off_ability_mult; + dv = *pd; + *pd = dv * def_ability_mult; + *po2 = p; + if (off_ability_div != 1) { + *po2 = p / off_ability_div; + } + if (def_ability_div != 1) { + pd = &calc[1]; + *pd = *pd / def_ability_div; + } + + diag->offense_calc = calc[0]; + diag->defense_calc = calc[1]; + if (calc[0] < 0) { + calc[0] = 0; + } + if (calc[0] >= 999) { + calc[0] = 999; + } + diag->damage_calc_def = calc[1]; + IntToFixedPoint64(&def_fp, calc[1]); + IntToFixedPoint64(&tmp2, calc[0] - calc[1]); + FixedPoint32To64(&tmp, DAMAGE_FORMULA_FLV_DEFICIT_DIVISOR); + DivideFixedPoint64(&tmp2, &tmp2, &tmp); + IntToFixedPoint64(&tmp, amon->level); + AddFixedPoint64(&flv_fp, &tmp, &tmp2); + IntToFixedPoint64(&tmp, calc[0]); + AddFixedPoint64(&at_fp, &at_fp, &tmp); + diag->damage_calc_at = FixedPoint64ToInt(&at_fp); + diag->attacker_level = amon->level; + diag->damage_calc_flv = FixedPoint64ToInt(&flv_fp); + Debug_Print0(ov29_02352984, FixedPoint64ToInt(&flv_fp)); + Debug_Print0(ov29_02352990, FixedPoint64ToInt(&at_fp)); + Debug_Print0(ov29_0235299C, FixedPoint64ToInt(&def_fp)); + + FixedPoint32To64(&tmp3, DAMAGE_FORMULA_AT_PREFACTOR); + MultiplyFixedPoint64(&tmp3, &at_fp, &tmp3); + FixedPoint32To64(&mult_fp, DAMAGE_FORMULA_DEF_PREFACTOR); + MultiplyFixedPoint64(&mult_fp, &def_fp, &mult_fp); + FixedPoint32To64(&scratch, DAMAGE_FORMULA_FLV_SHIFT); + AddFixedPoint64(&ln_fp, &flv_fp, &scratch); + FixedPoint32To64(&scratch, DAMAGE_FORMULA_LN_ARG_PREFACTOR); + MultiplyFixedPoint64(&ln_fp, &ln_fp, &scratch); + ClampedLn(&ln_fp, FixedPoint64ToInt(&ln_fp)); + FixedPoint32To64(&scratch, DAMAGE_FORMULA_LN_PREFACTOR); + MultiplyFixedPoint64(&ln_fp, &ln_fp, &scratch); + AddFixedPoint64(&base, &mult_fp, &tmp3); + AddFixedPoint64(&base, &base, &ln_fp); + FixedPoint32To64(&scratch, DAMAGE_FORMULA_CONSTANT_SHIFT); + AddFixedPoint64(&base, &base, &scratch); + + if (!FixedRoomIsSubstituteRoom() && amon->is_not_team_member) { + FixedPoint32To64(&scratch, DAMAGE_FORMULA_NON_TEAM_MEMBER_MODIFIER); + DivideFixedPoint64(&base, &base, &scratch); + } + + if (FixedPoint64CmpLt(&DAMAGE_FORMULA_MAX_BASE, &base)) { + base.lower = ((const struct fixed_point_64 *)&ov29_02352838[13])->lower; + base.upper = ((const struct fixed_point_64 *)&ov29_02352838[13])->upper; + } + if (FixedPoint64CmpLt(&base, &DAMAGE_FORMULA_MIN_BASE)) { + base.lower = ((const struct fixed_point_64 *)&ov29_02352838[17])->lower; + base.upper = ((const struct fixed_point_64 *)&ov29_02352838[17])->upper; + } + + type_boosted = CalcTypeBasedDamageEffects(&type_mult, attacker, defender, power, attack_type, + damage_out, IsRegularAttackOrProjectile(move_id) != 0); + + if (attack_type == TYPE_FIRE) { + flash = FlashFireShouldActivate(attacker, defender); + if (flash && !dmon->apply_flash_fire_boost && a9) { + dmon->apply_flash_fire_boost = TRUE; + SubstitutePlaceholderStringTags(1, defender, 0); + if (flash == 1) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C58); + } else { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C57); + } + } + } + + if (a9 && !ExclusiveItemEffectIsActive__0230A9B8(attacker, EXCLUSIVE_EFF_BYPASS_REFLECT_LIGHT_SCREEN)) { + if (not_physical == 0) { + if ((move_id != 0x48 && dmon->reflect_class_status.reflect == 1) + || ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_HALVED_PHYSICAL_DAMAGE)) { + PlayEffectAnimation0x171(defender); + MultiplyFixedPoint64(&type_mult, &type_mult, &DAMAGE_MULTIPLIER_0_5); + diag->half_physical_damage_activated = TRUE; + } + } + if (not_physical == 1 + && (dmon->reflect_class_status.reflect == 3 + || ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_HALVED_SPECIAL_DAMAGE))) { + PlayEffectAnimation0x171Full(defender); + MultiplyFixedPoint64(&type_mult, &type_mult, &DAMAGE_MULTIPLIER_0_5); + diag->half_special_damage_activated = TRUE; + } + } + +#ifdef JAPAN + if (dmon->reflect_class_status.reflect != 0x11 + && !DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_BATTLE_ARMOR) + && !DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_SHELL_ARMOR) + && !IqSkillIsEnabled(defender, IQ_CRITICAL_DODGER)) { +#else + if (dmon->reflect_class_status.reflect != 0x11 + && !DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_BATTLE_ARMOR, TRUE) + && !DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_SHELL_ARMOR, TRUE) + && !IqSkillIsEnabled(defender, IQ_CRITICAL_DODGER)) { +#endif + if (GetMonsterGenderVeneer(amon->id) == 2) { + rate = crit_chance; + } else { + rate = crit_chance + crit_chance / 2; + } + if (amon->sure_shot_class_status.sure_shot == 4) { + rate = 999; + diag->focus_energy_activated = TRUE; + } else { + if (ItemIsActive__0230A9DC(attacker, ITEM_SCOPE_LENS) + || IqSkillIsEnabled(attacker, IQ_SHARPSHOOTER)) { + diag->scope_lens_or_sharpshooter_activated = TRUE; + rate += SCOPE_LENS_CRIT_RATE_BOOST; + } + if (AbilityIsActiveVeneer(attacker, ABILITY_SUPER_LUCK)) { + diag->super_luck_activated = TRUE; + rate += SUPER_LUCK_CRIT_RATE_BOOST; + } + if (ItemIsActive__0230A9DC(defender, ITEM_PATSY_BAND)) { + diag->patsy_band_activated = TRUE; + rate += SCOPE_LENS_CRIT_RATE_BOOST; + } + if (type_boosted && IqSkillIsEnabled(attacker, IQ_TYPE_ADVANTAGE_MASTER)) { + diag->type_advantage_master_activated = TRUE; + rate = TYPE_ADVANTAGE_MASTER_CRIT_RATE; + } + } + if (DungeonRandInt(100) < rate + && !ExclusiveItemEffectIsActiveWithLogging(attacker, defender, TRUE, MESSAGE_DC1, EXCLUSIVE_EFF_NO_CRITICAL_HITS)) { + damage_out->field_0xe = TRUE; + if (AbilityIsActiveVeneer(attacker, ABILITY_SNIPER)) { + MultiplyFixedPoint64(&type_mult, &type_mult, &DAMAGE_MULTIPLIER_2); + diag->sniper_activated = TRUE; + } else { + MultiplyFixedPoint64(&type_mult, &type_mult, &DAMAGE_MULTIPLIER_1_5); + } + } + } + + diag->damage_calc_base = FixedPoint64ToInt(&base); + MultiplyFixedPoint64(&base, &base, &type_mult); + diag->static_damage_mult = dmult; + FixedPoint32To64(&mult32_fp, dmult); + MultiplyFixedPoint64(&base, &base, &mult32_fp); + diag->damage_calc = FixedPoint64ToInt(&base); + + type_mult.lower = DungeonRandInt(0x4000); + type_mult.upper = 0; + type_mult.lower += 0xE000; + MultiplyFixedPoint64(&base, &base, &type_mult); + IntToFixedPoint64(&hundred_fp, 100); + MultiplyFixedPoint64(&type_mult, &hundred_fp, &type_mult); + diag->damage_calc_random_mult_pct = FixedPoint64ToInt(&type_mult); + damage_out->field_0x0 = FixedPoint64ToInt(&base); + + if (move_id == 0x195) { + damage_out->field_0x0 = RoundUpDiv256(MultiplyByFixedPoint(damage_out->field_0x0 << 8, 0x80)); + } + if (move_id == 0x195 && IqSkillIsEnabled(attacker, IQ_POWER_PITCHER)) { + damage_out->field_0x0 = RoundUpDiv256( + MultiplyByFixedPoint(damage_out->field_0x0 << 8, POWER_PITCHER_DAMAGE_MULTIPLIER)); + } + if (damage_out->field_0x0 > 0 + && ExclusiveItemEffectIsActive__0230A9B8(attacker, EXCLUSIVE_EFF_DAMAGE_BOOST_50_PCT)) { + damage_out->field_0x0 = RoundUpDiv256( + MultiplyByFixedPoint(damage_out->field_0x0 << 8, AIR_BLADE_DAMAGE_MULTIPLIER)); + } + + damage_out->field_0x4 = 0; + if (damage_out->field_0x0 == 0) { + damage_out->field_0xe = FALSE; + } + dmon->anger_point_flag = damage_out->field_0xe; +} From 9097cad39d167325b39d1c5ed768f59431219f9e Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 6 Sep 2026 00:33:27 -0700 Subject: [PATCH 07/34] Use generic local names in the five functions landed since 51c365db CalcDamage, CalcTypeBasedDamageEffects, ApplyDamage, ApplyDamageAndEffects and ov11_022ED69C had locals named after what the decompiler inferred them to mean. A local's meaning is not something the matching build can check, so every such name is replaced by a type-derived generic one numbered in declaration order: fixed-point temporaries fp1.., monster pointers mon1.., scalar values v1.., bool8 flags f1.., pointers p1.. / ent1.. / item1.. / ls1.., arrays arr / buf. Names that were already generic (i, j, k, n, result) or are simply the type's own name (diag, weather, tile, member, entry, spec) are unchanged, and so are all parameters, whose names upstream syncs from pmdsky-debug. Declaration order is untouched; only identifiers change, so no object changes. Authored by Claude (Fable 5.1) under human direction. Confirmed by matching builds of all three regions after the rename: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Fable 5.1 --- src/overlay_11_022ED69C.c | 224 ++++++------- src/overlay_29_02308FBC.c | 638 +++++++++++++++++++------------------- src/overlay_29_0230BBAC.c | 634 ++++++++++++++++++------------------- src/type_effectiveness.c | 130 ++++---- 4 files changed, 813 insertions(+), 813 deletions(-) diff --git a/src/overlay_11_022ED69C.c b/src/overlay_11_022ED69C.c index a434b237..fde88e35 100644 --- a/src/overlay_11_022ED69C.c +++ b/src/overlay_11_022ED69C.c @@ -3,29 +3,29 @@ bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) { - LayerSpecs *ds; - LayerSpecs *ss; + LayerSpecs *ls1; + LayerSpecs *ls2; s32 i; s32 j; s32 k; struct bg_list_entry entry; - UnkGroundBg_4 *sub4Ptr; + UnkGroundBg_4 *sub4; s32 n; - u16 *vram; - s32 si; - s32 sj; - s32 bgIdx; + u16 *p1; + s32 i2; + s32 j2; + s32 idx; struct UnkStruct_2324CBC_Sub98 *unkSubPtr; - const void *bplData; - const RGB_Array *palData; + const void *data1; + const RGB_Array *rgb; const AnimationSpecification *spec; - MapRender *srcRender; - MapRender *dstRender; - BplHeader *bplHeader; - BplHeader *srcBpl; - BmaHeader *dstBma; - BmaHeader *srcBma; - u16 palId; + MapRender *render1; + MapRender *render2; + BplHeader *bpl1; + BplHeader *bpl2; + BmaHeader *bma1; + BmaHeader *bma2; + u16 v1; if (src->unk1BE == -1) { ov11_022EC08C(dst); @@ -33,71 +33,71 @@ bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) } GroundBg_CloseOpenedFiles(dst); - bplData = src->bplFile.iov_base; + data1 = src->bplFile.iov_base; dst->newUnk0 = 3; dst->unk1C0 = 0; dst->unk1BE = src->unk1BE; dst->unk1C4 = src->unk1C4; LoadBackgroundAttributes(&entry, dst->unk1BE); - bplHeader = &dst->bplHeader; - srcBpl = &src->bplHeader; - bplHeader->numPalettes = srcBpl->numPalettes; - bplHeader->hasPalAnimations = srcBpl->hasPalAnimations; + bpl1 = &dst->bplHeader; + bpl2 = &src->bplHeader; + bpl1->numPalettes = bpl2->numPalettes; + bpl1->hasPalAnimations = bpl2->hasPalAnimations; for (i = 0; i < NUM_LAYERS; i++) { - ds = &dst->layerSpecs[i]; - ss = &src->layerSpecs[i]; + ls1 = &dst->layerSpecs[i]; + ls2 = &src->layerSpecs[i]; - ds->numTiles = ss->numTiles; + ls1->numTiles = ls2->numTiles; for (j = 0; j < MAX_BPA_SLOTS; j++) { - ds->bpaSlotNumTiles[j] = ss->bpaSlotNumTiles[j]; + ls1->bpaSlotNumTiles[j] = ls2->bpaSlotNumTiles[j]; } - ds->numChunks = ss->numChunks; + ls1->numChunks = ls2->numChunks; } - dstBma = &dst->bmaHeader; - srcBma = &src->bmaHeader; - dstBma->mapWidthTiles = srcBma->mapWidthTiles; - dstBma->mapHeightTiles = srcBma->mapHeightTiles; - dstBma->mapWidthChunks = srcBma->mapWidthChunks; - dstBma->mapHeightChunks = srcBma->mapHeightChunks; - dstBma->numLayers = srcBma->numLayers; - dstBma->hasDataLayer = srcBma->hasDataLayer; - dstBma->hasCollision = srcBma->hasCollision; + bma1 = &dst->bmaHeader; + bma2 = &src->bmaHeader; + bma1->mapWidthTiles = bma2->mapWidthTiles; + bma1->mapHeightTiles = bma2->mapHeightTiles; + bma1->mapWidthChunks = bma2->mapWidthChunks; + bma1->mapHeightChunks = bma2->mapHeightChunks; + bma1->numLayers = bma2->numLayers; + bma1->hasDataLayer = bma2->hasDataLayer; + bma1->hasCollision = bma2->hasCollision; unkSubPtr = &ov11_02324CBC->unk98[dst->unk2BC.unk0]; - palId = dst->unk2BC.unk6 * 16; - palData = bplData + 4; - for (i = 0; i < bplHeader->numPalettes && i < dst->unk2BC.unk8; i++) { - CopyColorToPaletteDataRgba(unkSubPtr, palId++, &ov11_02320BF4); - FillPaletteDataRgba(unkSubPtr, palId, palData, 15); - palId += 15; - palData += 15; + v1 = dst->unk2BC.unk6 * 16; + rgb = data1 + 4; + for (i = 0; i < bpl1->numPalettes && i < dst->unk2BC.unk8; i++) { + CopyColorToPaletteDataRgba(unkSubPtr, v1++, &ov11_02320BF4); + FillPaletteDataRgba(unkSubPtr, v1, rgb, 15); + v1 += 15; + rgb += 15; } for (; i < dst->unk2BC.unk8; i++) { - CopyColorToPaletteDataRgba(unkSubPtr, palId++, &ov11_02320BF4); + CopyColorToPaletteDataRgba(unkSubPtr, v1++, &ov11_02320BF4); for (j = 1; j < 16; j++) { - CopyColorToPaletteDataRgba(unkSubPtr, palId++, &ov11_02320BE8); + CopyColorToPaletteDataRgba(unkSubPtr, v1++, &ov11_02320BE8); } } MarkPaletteDataAsNeedingUpdate(unkSubPtr); - sub4Ptr = dst->unk4; + sub4 = dst->unk4; n = 0; - if (bplHeader->hasPalAnimations) { - s32 numPals = bplHeader->numPalettes * 15; - const void *afterSpecs; + if (bpl1->hasPalAnimations) { + s32 v2 = bpl1->numPalettes * 15; + const void *data2; - spec = bplData + 4 + numPals * 4; - afterSpecs = spec + bplHeader->numPalettes; - palData = afterSpecs; + spec = data1 + 4 + v2 * 4; + data2 = spec + bpl1->numPalettes; + rgb = data2; dst->animationSpecifications = spec; dst->unk1FB = 1; dst->unk1BC = 0; @@ -106,18 +106,18 @@ bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) dst->unk1FA = src->unk1FA; dst->unk1EE = src->unk1EE; - for (; n < bplHeader->numPalettes && n < dst->unk2BC.unk8; - n++, sub4Ptr++, spec++) { + for (; n < bpl1->numPalettes && n < dst->unk2BC.unk8; + n++, sub4++, spec++) { if (spec->numFrames > 0) { - sub4Ptr->unk4 = palData; - palData += spec->numFrames * 15; + sub4->unk4 = rgb; + rgb += spec->numFrames * 15; } else { - sub4Ptr->unk4 = NULL; + sub4->unk4 = NULL; } - sub4Ptr->unk0 = 0; - sub4Ptr->unk2 = 0; - sub4Ptr->unk8 = NULL; + sub4->unk0 = 0; + sub4->unk2 = 0; + sub4->unk8 = NULL; } } else { dst->animationSpecifications = NULL; @@ -128,11 +128,11 @@ bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) dst->unk1BC = 0; } - for (; n < UNK_4_ARR_COUNT; n++, sub4Ptr++) { - sub4Ptr->unk0 = 0; - sub4Ptr->unk2 = 0; - sub4Ptr->unk8 = NULL; - sub4Ptr->unk4 = NULL; + for (; n < UNK_4_ARR_COUNT; n++, sub4++) { + sub4->unk0 = 0; + sub4->unk2 = 0; + sub4->unk8 = NULL; + sub4->unk4 = NULL; } for (i = 0; i < UNK_C4_ARR_COUNT; i++) { @@ -154,43 +154,43 @@ bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) k = dst->unk2BC.unk2; for (i = 0; i < dst->unk2BC.numLayers; i++, k++) { - s32 c4Idx = (i == 0) ? 0 : 2; - s32 bpaIdx = (i == 0) ? 0 : 4; - LayerSpecs *sp = &dst->layerSpecs[i]; - u16 *layerVram = ov11_02320C18[dst->unk2BC.unk0][k]; + s32 v3 = (i == 0) ? 0 : 2; + s32 v4 = (i == 0) ? 0 : 4; + LayerSpecs *ls3 = &dst->layerSpecs[i]; + u16 *p2 = ov11_02320C18[dst->unk2BC.unk0][k]; - s32 tiles = dst->unk2BC.unkA; + s32 v5 = dst->unk2BC.unkA; - tiles += sp->numTiles; - vram = layerVram + tiles * 16; + v5 += ls3->numTiles; + p1 = p2 + v5 * 16; - for (j = 0; j < 2; j++, bpaIdx++, c4Idx++) { - UnkGroundBg_C4 *srcC4 = &src->unkC4[c4Idx]; - UnkGroundBg_C4 *dstC4 = &dst->unkC4[c4Idx]; + for (j = 0; j < 2; j++, v4++, v3++) { + UnkGroundBg_C4 *srcC4 = &src->unkC4[v3]; + UnkGroundBg_C4 *dstC4 = &dst->unkC4[v3]; - const char *bpaName = entry.others_bpa[bpaIdx].name; + const char *bpaName = entry.others_bpa[v4].name; if (bpaName[0] != 0) { - struct BpaHeader *hdr; - s32 *frames; - void *end; - s32 numFrames; + struct BpaHeader *bpa; + s32 *p3; + void *p4; + s32 v6; dstC4->bpaFile = srcC4->bpaFile; dstC4->unk0 = 1; dstC4->unk1 = 1; - hdr = dstC4->bpaFile.iov_base; - dstC4->unk10 = hdr; - frames = &hdr->durationPerFrame[0]; - numFrames = hdr->numFrames; - dstC4->unk14 = dstC4->unk18 = frames; - end = frames + numFrames; - dstC4->unk1C = dstC4->unk20 = end; + bpa = dstC4->bpaFile.iov_base; + dstC4->unk10 = bpa; + p3 = &bpa->durationPerFrame[0]; + v6 = bpa->numFrames; + dstC4->unk14 = dstC4->unk18 = p3; + p4 = p3 + v6; + dstC4->unk1C = dstC4->unk20 = p4; dstC4->unk2 = 0; dstC4->unk4 = *dstC4->unk18; - dstC4->unk24 = vram; - dstC4->unk28 = sp->bpaSlotNumTiles[j] * 32; - vram += sp->bpaSlotNumTiles[j] * 16; + dstC4->unk24 = p1; + dstC4->unk28 = ls3->bpaSlotNumTiles[j] * 32; + p1 += ls3->bpaSlotNumTiles[j] * 16; } } @@ -199,46 +199,46 @@ bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) k = dst->unk2BC.unk2; - for (si = 0; si < dst->unk2BC.numLayers; si++, k++) { - LayerSpecs *sp = &src->layerSpecs[si]; - s32 total = sp->numTiles; + for (i2 = 0; i2 < dst->unk2BC.numLayers; i2++, k++) { + LayerSpecs *ls3 = &src->layerSpecs[i2]; + s32 v7 = ls3->numTiles; - for (sj = 0; sj < MAX_BPA_SLOTS; sj++) { - total += sp->bpaSlotNumTiles[sj]; + for (j2 = 0; j2 < MAX_BPA_SLOTS; j2++) { + v7 += ls3->bpaSlotNumTiles[j2]; } - if (total > 0) { + if (v7 > 0) { Memcpy16(ov11_02320C18[dst->unk2BC.unk0][k], - ov11_02320C18[src->unk2BC.unk0][k], total * 32); + ov11_02320C18[src->unk2BC.unk0][k], v7 * 32); } - dst->unk2DC[si] = src->unk2DC[si]; - dst->unk2E4[si] = src->unk2E4[si]; + dst->unk2DC[i2] = src->unk2DC[i2]; + dst->unk2E4[i2] = src->unk2E4[i2]; } dst->unk1FC = src->unk1FC; - srcRender = src->mapRender; - dstRender = dst->mapRender; - for (i = 0; i < dst->unk1FC; i++, dstRender++, srcRender++) { - *dstRender = *srcRender; - bgIdx = dstRender->unk2; + render1 = src->mapRender; + render2 = dst->mapRender; + for (i = 0; i < dst->unk1FC; i++, render2++, render1++) { + *render2 = *render1; + idx = render2->unk2; - for (j = 0; j < dstRender->numBgs && bgIdx < dst->unk2BC.numLayers; - j++, bgIdx++) { - dstRender->unk2C[j] = dst->unk2EC[bgIdx]; + for (j = 0; j < render2->numBgs && idx < dst->unk2BC.numLayers; + j++, idx++) { + render2->unk2C[j] = dst->unk2EC[idx]; } for (; j < 2; j++) { - dstRender->unk1C[j] = NULL; - dstRender->unk24[j] = NULL; - dstRender->unk2C[j] = NULL; + render2->unk1C[j] = NULL; + render2->unk24[j] = NULL; + render2->unk2C[j] = NULL; } - ov11_022EE9B0(dstRender, dst->cameraPixelPosition); + ov11_022EE9B0(render2, dst->cameraPixelPosition); } - for (; i < 2; i++, dstRender++) { - ov11_022EE8CC(dstRender, dst, 0, 0, 0, 0); + for (; i < 2; i++, render2++) { + ov11_022EE8CC(render2, dst, 0, 0, 0, 0); } return TRUE; diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index 173902dc..cd2d424e 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -219,14 +219,14 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, struct unk_02308FE0 *damage_data, int a4, int a5, s16 a6, int a7, int a8) { - struct unk_02308FE0 counter; - struct entity *targets[8]; - struct monster *dmon; - s32 mult; + struct unk_02308FE0 unk1; + struct entity *arr[8]; + struct monster *mon1; + s32 v1; s32 i; s32 n; - s32 not_physical; - bool8 grounded; + s32 v2; + bool8 f1; s32 result; s32 k; @@ -275,50 +275,50 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, result = TRUE; } else { - not_physical = CategoryIsNotPhysical(damage_data->field_0xd); - mult = 0; + v2 = CategoryIsNotPhysical(damage_data->field_0xd); + v1 = 0; if (attacker == defender || abs(attacker->pos.x - defender->pos.x) > 1 || abs(attacker->pos.y - defender->pos.y) > 1) { result = FALSE; } else { - ResetDamageData(&counter); - dmon = defender->info; + ResetDamageData(&unk1); + mon1 = defender->info; - if (!not_physical) { - if (dmon->reflect_class_status.reflect == 4) { + if (!v2) { + if (mon1->reflect_class_status.reflect == 4) { ov29_022E3F24(defender); - mult += 4; + v1 += 4; } if (((struct monster *)defender->info)->reflect_class_status.reflect == 0xA) { ov29_022E3F24(defender); - mult += 1; + v1 += 1; } if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_COUNTER_PHYSICAL_DAMAGE)) { - mult += 4; + v1 += 4; } if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_COUNTER_25_PCT_PHYSICAL_DAMAGE)) { - mult += 1; + v1 += 1; } if (IqSkillIsEnabled(defender, IQ_COUNTER_BASHER) && ov10_022C44C0 > (s16)DungeonRandInt(100)) { - mult += 4; + v1 += 4; } if (IqSkillIsEnabled(defender, IQ_COUNTER_HITTER) && ov10_022C4464 > (s16)DungeonRandInt(100)) { - mult += 1; + v1 += 1; } - } else if (dmon->reflect_class_status.reflect == 8) { + } else if (mon1->reflect_class_status.reflect == 8) { ov29_022E40C0(defender); - mult += 4; + v1 += 4; } if (((struct monster *)defender->info)->reflect_class_status.reflect == 0xF) { ov29_022E57D4(defender); - mult += 2; + v1 += 2; } #ifdef JAPAN @@ -327,29 +327,29 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ROUGH_SKIN, TRUE)) { #endif - mult += 2; + v1 += 2; } - if (mult != 0) { + if (v1 != 0) { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C3F); - counter.field_0x0 = damage_data->field_0x0 * mult / 4; - counter.field_0xc = damage_data->field_0xc; - counter.field_0x4 = 6; - counter.field_0x8 = 2; - counter.field_0xd = damage_data->field_0xd; - counter.field_0xe = 0; - counter.field_0xf = 0; - counter.field_0x10 = 0; + unk1.field_0x0 = damage_data->field_0x0 * v1 / 4; + unk1.field_0xc = damage_data->field_0xc; + unk1.field_0x4 = 6; + unk1.field_0x8 = 2; + unk1.field_0xd = damage_data->field_0xd; + unk1.field_0xe = 0; + unk1.field_0xf = 0; + unk1.field_0x10 = 0; if (((struct monster *)defender->info)->reflect_class_status.reflect == 0xF) { - counter.field_0xd = 1; - n = ov29_023380FC(defender, targets); + unk1.field_0xd = 1; + n = ov29_023380FC(defender, arr); for (k = 0; k < n; k = (s16)(k + 1)) { - ApplyDamage(defender, targets[k], &counter, 0, a5, (s16)a6, a8); + ApplyDamage(defender, arr[k], &unk1, 0, a5, (s16)a6, a8); } } else { - ApplyDamage(defender, attacker, &counter, 0, a5, (s16)a6, a8); + ApplyDamage(defender, attacker, &unk1, 0, a5, (s16)a6, a8); } } @@ -365,11 +365,11 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, result = FALSE; } else { { - s32 np3 = CategoryIsNotPhysical(damage_data->field_0xd); - struct unk_023535DC *eff3; - struct monster *amon3 = attacker->info; + s32 v3 = CategoryIsNotPhysical(damage_data->field_0xd); + struct unk_023535DC *ptr1; + struct monster *mon2 = attacker->info; - if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS) && !np3 + if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS) && !v3 && DungeonRandInt(100) < ov10_022C45B4) { i = DungeonRandInt(300); if (i < 100) { @@ -381,11 +381,11 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, } } - for (eff3 = ov29_023535DC; *(u8 *)eff3 != 0; eff3++) { - if (ExclusiveItemEffectIsActive__0230A9B8(defender, (enum exclusive_item_effect_id)eff3->field_0x0) - && eff3->field_0x8(attacker, defender, np3)) { - ov29_0230F728(attacker, defender, (enum exclusive_item_effect_id)eff3->field_0x0, - eff3->field_0x4); + for (ptr1 = ov29_023535DC; *(u8 *)ptr1 != 0; ptr1++) { + if (ExclusiveItemEffectIsActive__0230A9B8(defender, (enum exclusive_item_effect_id)ptr1->field_0x0) + && ptr1->field_0x8(attacker, defender, v3)) { + ov29_0230F728(attacker, defender, (enum exclusive_item_effect_id)ptr1->field_0x0, + ptr1->field_0x4); } } @@ -400,16 +400,16 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ARENA_TRAP, TRUE)) { #endif - grounded = FALSE; - if (amon3->magnet_rise == 1 + f1 = FALSE; + if (mon2->magnet_rise == 1 || HasTypeAffectedByGravity(attacker, TYPE_FLYING) || LevitateIsActive(attacker)) { if (!GravityIsActive()) { - grounded = TRUE; + f1 = TRUE; } } - if (!grounded && DungeonRandInt(100) < ARENA_TRAP_ACTIVATION_CHANCE) { - amon3->contact_ability_trigger_bitflags |= 1; + if (!f1 && DungeonRandInt(100) < ARENA_TRAP_ACTIVATION_CHANCE) { + mon2->contact_ability_trigger_bitflags |= 1; } } @@ -419,7 +419,7 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_SHADOW_TAG, TRUE) #endif && DungeonRandInt(100) < SHADOW_TAG_ACTIVATION_CHANCE) { - amon3->contact_ability_trigger_bitflags |= 2; + mon2->contact_ability_trigger_bitflags |= 2; RAPID_SPIN_BINDING_REMOVAL = 0; } @@ -430,7 +430,7 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, #endif && MonsterIsType(attacker, TYPE_STEEL) && DungeonRandInt(100) < MAGNET_PULL_ACTIVATION_CHANCE) { - amon3->contact_ability_trigger_bitflags |= 4; + mon2->contact_ability_trigger_bitflags |= 4; } #ifdef JAPAN @@ -438,8 +438,8 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, #else if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STATIC, TRUE) #endif - && !np3 && DungeonRandInt(100) < ov10_022C4550) { - amon3->contact_ability_trigger_bitflags |= 8; + && !v3 && DungeonRandInt(100) < ov10_022C4550) { + mon2->contact_ability_trigger_bitflags |= 8; } #ifdef JAPAN @@ -448,7 +448,7 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_POISON_POINT, TRUE) #endif && DungeonRandInt(100) < ov10_022C45C0) { - amon3->contact_ability_trigger_bitflags |= 0x20; + mon2->contact_ability_trigger_bitflags |= 0x20; } #ifdef JAPAN @@ -456,14 +456,14 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, #else if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_EFFECT_SPORE, TRUE) #endif - && !np3 && DungeonRandInt(100) < ov10_022C45AC) { + && !v3 && DungeonRandInt(100) < ov10_022C45AC) { i = DungeonRandInt(3); if (i < 1) { - amon3->contact_ability_trigger_bitflags |= 0x40; + mon2->contact_ability_trigger_bitflags |= 0x40; } else if (i < 2) { - amon3->contact_ability_trigger_bitflags |= 0x10; + mon2->contact_ability_trigger_bitflags |= 0x10; } else { - amon3->contact_ability_trigger_bitflags |= 0x80; + mon2->contact_ability_trigger_bitflags |= 0x80; } } @@ -473,7 +473,7 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_FLAME_BODY, TRUE) #endif && DungeonRandInt(100) < ov10_022C467C) { - amon3->contact_ability_trigger_bitflags |= 0x100; + mon2->contact_ability_trigger_bitflags |= 0x100; } #ifdef JAPAN @@ -482,9 +482,9 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_CUTE_CHARM, TRUE) #endif && GendersNotEqualNotGenderless( - amon3->id, ((struct monster *)defender->info)->id) - && !np3 && DungeonRandInt(100) < CUTE_CHARM_INFATUATE_CHANCE) { - amon3->contact_ability_trigger_bitflags |= 0x200; + mon2->id, ((struct monster *)defender->info)->id) + && !v3 && DungeonRandInt(100) < CUTE_CHARM_INFATUATE_CHANCE) { + mon2->contact_ability_trigger_bitflags |= 0x200; } #ifdef JAPAN @@ -493,7 +493,7 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STENCH, TRUE) #endif && DungeonRandInt(100) < ov10_022C4638) { - amon3->contact_ability_trigger_bitflags |= 0x400; + mon2->contact_ability_trigger_bitflags |= 0x400; } result = IsEitherMonsterInvalid(attacker, defender); @@ -503,20 +503,20 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, result = TRUE; } else { - dmon = defender->info; - if (dmon->leech_seed_class_status.leech_seed == STATUS_LEECH_SEED_DESTINY_BOND) { - struct entity *bonded = - DUNGEON_PTR->active_monster_ptrs[dmon->leech_seed_class_status + mon1 = defender->info; + if (mon1->leech_seed_class_status.leech_seed == STATUS_LEECH_SEED_DESTINY_BOND) { + struct entity *ent1 = + DUNGEON_PTR->active_monster_ptrs[mon1->leech_seed_class_status .leech_seed_source_monster_index]; - if (bonded == NULL) { - dmon->leech_seed_class_status.leech_seed = STATUS_LEECH_SEED_NONE; - } else if (dmon->leech_seed_class_status.statuses_applier_id - != ((struct monster *)bonded->info)->unique_id) { - dmon->leech_seed_class_status.leech_seed = STATUS_LEECH_SEED_NONE; + if (ent1 == NULL) { + mon1->leech_seed_class_status.leech_seed = STATUS_LEECH_SEED_NONE; + } else if (mon1->leech_seed_class_status.statuses_applier_id + != ((struct monster *)ent1->info)->unique_id) { + mon1->leech_seed_class_status.leech_seed = STATUS_LEECH_SEED_NONE; } else { - ov29_022E45D0(bonded, defender); - ApplyDamageAndEffectsWrapper(bonded, damage_data->field_0x0, 0xC, + ov29_022E45D0(ent1, defender); + ApplyDamageAndEffectsWrapper(ent1, damage_data->field_0x0, 0xC, 0x238); } } @@ -549,40 +549,40 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, struct unk_02308FE0 *damage_data, int a4, int a5, s16 damage_source, int a7) { - bool8 played_hurt_anim; - struct unk_023528A4 *neg; + bool8 f1; + struct unk_023528A4 *ptr1; struct tile *tile; struct team_member *member; - struct item *reviver_seed; - struct item *revival_item; - bool8 proceed; - bool8 is_wild_enemy; - bool8 face_attacker; - bool8 gained_exp; - s32 defeat_idx; - s32 hp_lost; - struct monster *dmon; - s32 hp; - s32 exp; - struct monster *amon; - u8 music; + struct item *item1; + struct item *item2; + bool8 f2; + bool8 f3; + bool8 f4; + bool8 f5; + s32 v1; + s32 v2; + struct monster *mon1; + s32 v3; + s32 v4; + struct monster *mon2; + u8 v5; s32 i; - struct entity *other; + struct entity *ent1; s32 j; - struct item *bag_item; - struct item *held_item; - s16 anim; - u16 message_id; - struct position revive_pos; - u8 recruit_info[0x48]; + struct item *item3; + struct item *item4; + s16 v6; + u16 v7; + struct position pos; + u8 buf[0x48]; #ifdef EUROPE - bool8 defer_defeat_message; + bool8 f6; #endif damage_data->field_0x10 = FALSE; - played_hurt_anim = FALSE; + f1 = FALSE; tile = NULL; - is_wild_enemy = FALSE; + f3 = FALSE; if (defender->type != 1 || IsSecretBazaarNpcBehavior( @@ -593,9 +593,9 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, if (((struct monster *)defender->info)->is_not_team_member && !((struct monster *)defender->info)->is_ally) { - is_wild_enemy = TRUE; + f3 = TRUE; } - dmon = defender->info; + mon1 = defender->info; TryEndPetrifiedOrSleepStatus(attacker, defender); UpdateShopkeeperModeAfterAttack(attacker, defender); @@ -657,7 +657,7 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, return FALSE; } - if (dmon->frozen_class_status.freeze == 1) { + if (mon1->frozen_class_status.freeze == 1) { if (damage_source != 0x250) { SubstitutePlaceholderStringTags(1, defender, 0); LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C41); @@ -667,9 +667,9 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, return FALSE; } - if ((dmon->sleep_class_status.sleep == 1 || dmon->sleep_class_status.sleep == 5 - || dmon->sleep_class_status.sleep == 3) - && dmon->sleep_class_status.sleep_turns == 0x7F) { + if ((mon1->sleep_class_status.sleep == 1 || mon1->sleep_class_status.sleep == 5 + || mon1->sleep_class_status.sleep == 3) + && mon1->sleep_class_status.sleep_turns == 0x7F) { ov29_02307C48(defender); } @@ -724,25 +724,25 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, } } - neg = TYPE_DAMAGE_NEGATING_EXCLUSIVE_ITEM_EFFECTS; - while (neg->field_0x0 != 0x12) { - if (neg->field_0x0 == damage_data->field_0xc + ptr1 = TYPE_DAMAGE_NEGATING_EXCLUSIVE_ITEM_EFFECTS; + while (ptr1->field_0x0 != 0x12) { + if (ptr1->field_0x0 == damage_data->field_0xc && ExclusiveItemEffectIsActiveWithLogging(attacker, defender, 0, 0, - (enum exclusive_item_effect_id)(neg->field_0x4 & 0xFF))) { - if (neg->field_0x4 > 0x71) { + (enum exclusive_item_effect_id)(ptr1->field_0x4 & 0xFF))) { + if (ptr1->field_0x4 > 0x71) { TryIncreaseHp(attacker, defender, damage_data->field_0x0, 0, 1); } else { damage_data->field_0x10 = TRUE; } - proceed = FALSE; + f2 = FALSE; goto negation_checked; } - neg++; + ptr1++; } - proceed = TRUE; + f2 = TRUE; negation_checked: - if (!proceed) { + if (!f2) { if (damage_data->field_0x10) { if (attacker->type == 1) { if (ShouldDisplayEntityWrapper(attacker) @@ -764,7 +764,7 @@ negation_checked: RestoreRandomMovePP(defender, defender, 1, 0); } - if (!dmon->apply_flash_fire_boost) { + if (!mon1->apply_flash_fire_boost) { if (damage_data->field_0xe) { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C42); } @@ -787,12 +787,12 @@ negation_checked: if (damage_data->field_0x0 == 0) { if (ShouldDisplayEntityWrapper(attacker) && ShouldDisplayEntityWrapper(defender)) { - if (!dmon->apply_flash_fire_boost) { + if (!mon1->apply_flash_fire_boost) { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C47); } PlayMissSfx__022E611C(attacker, defender); } else { - if (!dmon->apply_flash_fire_boost) { + if (!mon1->apply_flash_fire_boost) { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C47); } ov29_022EA370(0x1E, 0x18); @@ -804,33 +804,33 @@ negation_checked: if (damage_data->field_0x0 == 0x270F) { if (a7 && ShouldDisplayEntityWrapper(defender)) { tile = GetTileAtEntity(defender); - anim = PlayEffectAnimationEntity(defender, 0x2B5, 0, 3, 0, 1, 0, 0); + v6 = PlayEffectAnimationEntity(defender, 0x2B5, 0, 3, 0, 1, 0, 0); ov29_023535D4 = -1; - if (anim != -1) { - while (ov10_022BF964(anim)) { + if (v6 != -1) { + while (ov10_022BF964(v6)) { AdvanceFrame(0x18); } - TerminateEffectWrapper(anim); + TerminateEffectWrapper(v6); ov29_023535D4 = PlayEffectAnimationEntity(defender, 0x2B6, 0, 3, 0, 1, 0, 0); } } - if (!dmon->apply_flash_fire_boost) { + if (!mon1->apply_flash_fire_boost) { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C48); } - dmon->bide_damage_tally = 0x3E7; + mon1->bide_damage_tally = 0x3E7; } else { SetMessageLogPreprocessorArgsNumberVal(0, damage_data->field_0x0); if (damage_data->field_0x4 >= 0x1B) { - message_id = 0; + v7 = 0; } else { - message_id = DAMAGE_STRING_IDS[damage_data->field_0x4]; + v7 = DAMAGE_STRING_IDS[damage_data->field_0x4]; } - dmon->bide_damage_tally += damage_data->field_0x0; - if (dmon->bide_damage_tally > 0x3E7) { - dmon->bide_damage_tally = 0x3E7; + mon1->bide_damage_tally += damage_data->field_0x0; + if (mon1->bide_damage_tally > 0x3E7) { + mon1->bide_damage_tally = 0x3E7; } if (ShouldDisplayEntityWrapper(defender)) { @@ -840,34 +840,34 @@ negation_checked: DisplayAnimatedNumbers(-damage_data->field_0x0, defender, TRUE, -1); } - if (!dmon->apply_flash_fire_boost && message_id != 0) { + if (!mon1->apply_flash_fire_boost && v7 != 0) { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, - message_id); + v7); } - } else if (!dmon->apply_flash_fire_boost && message_id != 0) { - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, message_id); + } else if (!mon1->apply_flash_fire_boost && v7 != 0) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, v7); } } - if ((damage_data->field_0x4 != 0xE || dmon->hp <= 1) && tile == NULL + if ((damage_data->field_0x4 != 0xE || mon1->hp <= 1) && tile == NULL && ShouldDisplayEntityWrapper(defender)) { if ((attacker->pos.x != defender->pos.x || attacker->pos.y != defender->pos.y) && attacker->type == 1) { - face_attacker = FALSE; - if (dmon->is_team_leader && GetDamageTurnOption() + f4 = FALSE; + if (mon1->is_team_leader && GetDamageTurnOption() && !ov29_022F9AF4(defender) && CanSeeTarget(defender, attacker)) { - face_attacker = TRUE; + f4 = TRUE; } - if (dmon->blinker_class_status.blinded == 2 + if (mon1->blinker_class_status.blinded == 2 || IsBlinded(defender, TRUE)) { - face_attacker = FALSE; + f4 = FALSE; } - if (face_attacker) { - struct monster *target_mon = defender->info; + if (f4) { + struct monster *mon3 = defender->info; - target_mon->action.direction = + mon3->action.direction = GetDirectionTowardsPosition(&defender->pos, &attacker->pos) & 7; } UpdateAiTargetPos(defender); @@ -876,49 +876,49 @@ negation_checked: ChangeMonsterAnimation(defender, 6, ((struct monster *)defender->info)->action.direction); ov29_022E5478(defender, damage_data); - played_hurt_anim = TRUE; + f1 = TRUE; } } - if (dmon->is_not_team_member && damage_data->field_0x0 > 0 + if (mon1->is_not_team_member && damage_data->field_0x0 > 0 && attacker->type == 1 && !((struct monster *)attacker->info)->is_not_team_member) { - SetMonsterFlag2(dmon->id); - SetPokemonBattled(dmon->id); + SetMonsterFlag2(mon1->id); + SetPokemonBattled(mon1->id); } - hp_lost = dmon->hp; - if (hp_lost > damage_data->field_0x0) { - dmon->hp = hp_lost - damage_data->field_0x0; + v2 = mon1->hp; + if (v2 > damage_data->field_0x0) { + mon1->hp = v2 - damage_data->field_0x0; } else { - dmon->hp = 0; + mon1->hp = 0; } - if (dmon->reflect_class_status.reflect == 9) { - if (dmon->hp == 0) { - dmon->hp = 1; + if (mon1->reflect_class_status.reflect == 9) { + if (mon1->hp == 0) { + mon1->hp = 1; LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C49); } } else if (a4 == 1) { - if (dmon->hp == 0) { - dmon->hp = 1; + if (mon1->hp == 0) { + mon1->hp = 1; LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C4A); } } else if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_MAY_ENDURE) && DungeonRandOutcome__022EAB20(ov10_022C4834) - && dmon->hp == 0) { - dmon->hp = 1; + && mon1->hp == 0) { + mon1->hp = 1; LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C49); } ov29_022E81F8(); - hp_lost -= dmon->hp; - if (hp_lost < 0) { - hp_lost = 0; + v2 -= mon1->hp; + if (v2 < 0) { + v2 = 0; } - if (played_hurt_anim || tile != NULL) { + if (f1 || tile != NULL) { ov29_022EA370(0xA, 0x18); } @@ -926,17 +926,17 @@ negation_checked: UpdateStatusIconFlags(defender); #endif - if (dmon->hp != 0) { - if (played_hurt_anim) { + if (mon1->hp != 0) { + if (f1) { ChangeMonsterAnimationToIdle(defender, DIR_CURRENT); } if (damage_data->field_0x4 != 0xE) { - if (ItemIsActive__0230A9DC(defender, ITEM_JOY_RIBBON) && hp_lost > 0 + if (ItemIsActive__0230A9DC(defender, ITEM_JOY_RIBBON) && v2 > 0 && damage_data->field_0x0 != 0x270F) { AddExpSpecial(attacker, defender, ov10_022C45FC); } if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_EXP_FROM_DAMAGE) - && hp_lost > 0 && damage_data->field_0x0 != 0x270F) { + && v2 > 0 && damage_data->field_0x0 != 0x270F) { AddExpSpecial(attacker, defender, ov10_022C45FC); } } @@ -952,10 +952,10 @@ negation_checked: ((struct monster *)defender->info)->action.direction); ov29_022E5478(defender, damage_data); ov29_022EA370(0xA, 0x18); - played_hurt_anim = TRUE; + f1 = TRUE; } - if (dmon->invisible_class_status.status == 2) { + if (mon1->invisible_class_status.status == 2) { EndInvisibleClassStatus(attacker, defender, 0); } @@ -964,99 +964,99 @@ negation_checked: defender->transparent = 2; ov29_0230D7D4(defender); UpdateTrapsVisibility(); - } else if (played_hurt_anim) { + } else if (f1) { defender->transparent = 1; ov29_022EA370(0x1E, 0x18); } - defeat_idx = 1; + v1 = 1; if (EntityIsValid__02308FBC(attacker) && attacker->type == 1 && attacker != defender) { - defeat_idx = 0; + v1 = 0; } - dmon->field_0x156 = 0; + mon1->field_0x156 = 0; SubstitutePlaceholderStringTags(0, attacker, 0); SubstitutePlaceholderStringTags(1, defender, 0); #ifdef EUROPE - defer_defeat_message = FALSE; + f6 = FALSE; #endif if (damage_data->field_0x4 == 0x13 || damage_data->field_0x4 == 4 || damage_data->field_0x4 == 0x14) { - if (dmon->is_not_team_member) { + if (mon1->is_not_team_member) { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C4B); } else { LogMessageByIdWithPopup(attacker, MESSAGE_C4B); } - } else if (dmon->is_not_team_member) { - if (dmon->monster_behavior == 7) { - LogMessageByIdWithPopup(attacker, ov29_02353220[defeat_idx]); + } else if (mon1->is_not_team_member) { + if (mon1->monster_behavior == 7) { + LogMessageByIdWithPopup(attacker, ov29_02353220[v1]); } else { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, - DEFEAT_STRING_IDS[defeat_idx]); + DEFEAT_STRING_IDS[v1]); } } else { - member = GetActiveTeamMember(dmon->team_index); - if (dmon->is_team_leader - || (JoinedAtRangeCheck2Veneer(dmon->joined_at) + member = GetActiveTeamMember(mon1->team_index); + if (mon1->is_team_leader + || (JoinedAtRangeCheck2Veneer(mon1->joined_at) && !DUNGEON_PTR->nonstory_flag)) { - LogMessageByIdWithPopup(attacker, ov29_02353228[defeat_idx]); - } else if (IsExperienceLocked(dmon)) { - if (IsSpecialStoryAlly(dmon)) { - LogMessageByIdWithPopup(attacker, ov29_02353234[defeat_idx]); + LogMessageByIdWithPopup(attacker, ov29_02353228[v1]); + } else if (IsExperienceLocked(mon1)) { + if (IsSpecialStoryAlly(mon1)) { + LogMessageByIdWithPopup(attacker, ov29_02353234[v1]); } else { - LogMessageByIdWithPopup(attacker, ov29_0235322C[defeat_idx]); + LogMessageByIdWithPopup(attacker, ov29_0235322C[v1]); } - } else if (dmon->monster_behavior == 7) { - LogMessageByIdWithPopup(attacker, ov29_02353220[defeat_idx]); + } else if (mon1->monster_behavior == 7) { + LogMessageByIdWithPopup(attacker, ov29_02353220[v1]); } else if (IsMonsterIdInNormalRangeVeneer((enum monster_id)member->member_index)) { if (DUNGEON_PTR->send_home_disabled) { - LogMessageByIdWithPopup(attacker, ov29_02353224[defeat_idx]); + LogMessageByIdWithPopup(attacker, ov29_02353224[v1]); } else { - LogMessageByIdWithPopup(attacker, ov29_02353230[defeat_idx]); + LogMessageByIdWithPopup(attacker, ov29_02353230[v1]); } } else { #ifdef EUROPE - defer_defeat_message = TRUE; + f6 = TRUE; #else - LogMessageByIdWithPopup(attacker, ov29_02353218[defeat_idx]); + LogMessageByIdWithPopup(attacker, ov29_02353218[v1]); #endif } } - if (dmon->frozen_class_status.freeze == 3 - || dmon->frozen_class_status.freeze == 4) { - FreeOtherWrappedMonsters(dmon->wrap_pair_unique_id); + if (mon1->frozen_class_status.freeze == 3 + || mon1->frozen_class_status.freeze == 4) { + FreeOtherWrappedMonsters(mon1->wrap_pair_unique_id); } - held_item = &dmon->held_item; - if (GetFlag(held_item->flags, 1) && !GetFlag(held_item->flags, 8) - && !(dmon->held_item.flags & 2) - && held_item->id == 0x153) { + item4 = &mon1->held_item; + if (GetFlag(item4->flags, 1) && !GetFlag(item4->flags, 8) + && !(mon1->held_item.flags & 2) + && item4->id == 0x153) { ov29_022E550C(defender); defender->transparent = 0; - hp = dmon->max_hp_stat + dmon->max_hp_boost; - if (hp > 0x3E7) { - hp = 0x3E7; + v3 = mon1->max_hp_stat + mon1->max_hp_boost; + if (v3 > 0x3E7) { + v3 = 0x3E7; } - dmon->hp = hp; - dmon->field_0x162 = 0; - dmon->field_0x156 = TRUE; - dmon->belly = dmon->max_belly; - if (dmon->is_team_leader) { + mon1->hp = v3; + mon1->field_0x162 = 0; + mon1->field_0x156 = TRUE; + mon1->belly = mon1->max_belly; + if (mon1->is_team_leader) { DUNGEON_PTR->leader_hunger_message_tracker = 0; DUNGEON_PTR->identify_orb_flag = 0; } - ItemZInit(&dmon->held_item); - if (dmon->curse_class_status.curse == 3) { + ItemZInit(&mon1->held_item); + if (mon1->curse_class_status.curse == 3) { EndCurseClassStatus(attacker, defender, 3, 1); - } else if (dmon->curse_class_status.curse == 2) { + } else if (mon1->curse_class_status.curse == 2) { EndCurseClassStatus(attacker, defender, 2, 1); } EndLeechSeedStatusForAllTargets(defender); - SubInitMonster(dmon, 0); + SubInitMonster(mon1, 0); ov10_022BDC68(); RestorePpAllMovesSetFlags(defender); ov29_02304830(defender, GetIdleAnimationId(defender)); @@ -1067,55 +1067,55 @@ negation_checked: return FALSE; } - if (dmon->is_team_leader - && GetFlag(dmon->held_item.flags, 1) - && !GetFlag(dmon->held_item.flags, 8) - && dmon->held_item.id == 0x159) { - other = NULL; + if (mon1->is_team_leader + && GetFlag(mon1->held_item.flags, 1) + && !GetFlag(mon1->held_item.flags, 8) + && mon1->held_item.id == 0x159) { + ent1 = NULL; for (i = 0; i < 4; i++) { - other = DUNGEON_PTR->monster_slot_ptrs[i]; - if (EntityIsValid__02308FBC(other) && other != defender - && CanSeeTarget(defender, other) - && abs(other->pos.x - defender->pos.x) <= 1 - && abs(other->pos.y - defender->pos.y) <= 1) { + ent1 = DUNGEON_PTR->monster_slot_ptrs[i]; + if (EntityIsValid__02308FBC(ent1) && ent1 != defender + && CanSeeTarget(defender, ent1) + && abs(ent1->pos.x - defender->pos.x) <= 1 + && abs(ent1->pos.y - defender->pos.y) <= 1) { break; } } if (i != 4) { ov29_022E550C(defender); SubstitutePlaceholderStringTags(0, defender, 0); - revive_pos = other->pos; - HandleFaint(other, DAMAGE_SOURCE_POSSESS, defender); - MoveMonsterToPos(defender, revive_pos.x, revive_pos.y, 1); + pos = ent1->pos; + HandleFaint(ent1, DAMAGE_SOURCE_POSSESS, defender); + MoveMonsterToPos(defender, pos.x, pos.y, 1); UpdateEntityPixelPos(defender, 0); defender->transparent = 0; - hp = dmon->max_hp_stat + dmon->max_hp_boost; - if (hp > 0x3E7) { - hp = 0x3E7; + v3 = mon1->max_hp_stat + mon1->max_hp_boost; + if (v3 > 0x3E7) { + v3 = 0x3E7; } - dmon->hp = hp; + mon1->hp = v3; ov29_022E66D8(defender); - dmon->field_0x162 = 0; - dmon->field_0x156 = TRUE; - dmon->belly = dmon->max_belly; - if (dmon->is_team_leader) { + mon1->field_0x162 = 0; + mon1->field_0x156 = TRUE; + mon1->belly = mon1->max_belly; + if (mon1->is_team_leader) { DUNGEON_PTR->leader_hunger_message_tracker = 0; DUNGEON_PTR->identify_orb_flag = 0; } - ItemZInit(&dmon->held_item); - if (dmon->curse_class_status.curse == 3) { + ItemZInit(&mon1->held_item); + if (mon1->curse_class_status.curse == 3) { EndCurseClassStatus(attacker, defender, 3, 1); - } else if (dmon->curse_class_status.curse == 2) { + } else if (mon1->curse_class_status.curse == 2) { EndCurseClassStatus(attacker, defender, 2, 1); } EndLeechSeedStatusForAllTargets(defender); - SubInitMonster(dmon, 0); + SubInitMonster(mon1, 0); ov10_022BDC68(); RestorePpAllMovesSetFlags(defender); ov29_02304830(defender, GetIdleAnimationId(defender)); UpdateStatusIconFlags(defender); SubstitutePlaceholderStringTags(0, defender, 0); - SubstitutePlaceholderStringTags(1, other, 0); + SubstitutePlaceholderStringTags(1, ent1, 0); LogMessageByIdWithPopup(attacker, MESSAGE_C4D); ov29_0230D628(defender); return FALSE; @@ -1123,68 +1123,68 @@ negation_checked: } if (IqSkillIsEnabled(defender, IQ_ITEM_MASTER)) { - reviver_seed = NULL; - revival_item = NULL; - if (GetFlag(dmon->held_item.flags, 1) + item1 = NULL; + item2 = NULL; + if (GetFlag(mon1->held_item.flags, 1) && !AbilityIsActiveVeneer(defender, ABILITY_KLUTZ) - && !GetFlag(dmon->held_item.flags, 8)) { - if (dmon->held_item.id == 0x49) { - reviver_seed = &dmon->held_item; - } else if (dmon->held_item.id == 0x69) { - revival_item = &dmon->held_item; + && !GetFlag(mon1->held_item.flags, 8)) { + if (mon1->held_item.id == 0x49) { + item1 = &mon1->held_item; + } else if (mon1->held_item.id == 0x69) { + item2 = &mon1->held_item; } } - if (reviver_seed == NULL && !dmon->is_not_team_member) { + if (item1 == NULL && !mon1->is_not_team_member) { for (j = 0; j < 0x32; j++) { - bag_item = &BAG_ITEMS_PTR_MIRROR->bag_items->bag_items[j]; - if (GetFlag(bag_item->flags, 1) && !GetFlag(bag_item->flags, 8) - && bag_item->held_by == 0) { - if (bag_item->id == 0x49) { - reviver_seed = bag_item; + item3 = &BAG_ITEMS_PTR_MIRROR->bag_items->bag_items[j]; + if (GetFlag(item3->flags, 1) && !GetFlag(item3->flags, 8) + && item3->held_by == 0) { + if (item3->id == 0x49) { + item1 = item3; break; } - if (revival_item == NULL && bag_item->id == 0x69) { - revival_item = bag_item; + if (item2 == NULL && item3->id == 0x69) { + item2 = item3; } } } } - if (reviver_seed != NULL) { + if (item1 != NULL) { #ifdef EUROPE - if (defer_defeat_message) { - LogMessageByIdWithPopup(attacker, ov29_02353E44[defeat_idx]); + if (f6) { + LogMessageByIdWithPopup(attacker, ov29_02353E44[v1]); } #endif #ifndef JAPAN ov29_022FBD24(defender); #endif ov29_022E550C(defender); - ov29_0230D688(reviver_seed); + ov29_0230D688(item1); defender->transparent = 0; - hp = dmon->max_hp_stat + dmon->max_hp_boost; - if (hp > 0x3E7) { - hp = 0x3E7; + v3 = mon1->max_hp_stat + mon1->max_hp_boost; + if (v3 > 0x3E7) { + v3 = 0x3E7; } - dmon->hp = hp; - dmon->field_0x162 = 0; - dmon->field_0x156 = TRUE; - dmon->belly = dmon->max_belly; - if (dmon->is_team_leader) { + mon1->hp = v3; + mon1->field_0x162 = 0; + mon1->field_0x156 = TRUE; + mon1->belly = mon1->max_belly; + if (mon1->is_team_leader) { DUNGEON_PTR->leader_hunger_message_tracker = 0; DUNGEON_PTR->identify_orb_flag = 0; } - if (dmon->curse_class_status.curse == 3) { + if (mon1->curse_class_status.curse == 3) { EndCurseClassStatus(attacker, defender, 3, 1); - } else if (dmon->curse_class_status.curse == 2) { + } else if (mon1->curse_class_status.curse == 2) { EndCurseClassStatus(attacker, defender, 2, 1); } #ifdef JAPAN ov29_02307DC0(defender); #endif EndLeechSeedStatusForAllTargets(defender); - SubInitMonster(dmon, 0); + SubInitMonster(mon1, 0); ov10_022BDC68(); RestorePpAllMovesSetFlags(defender); ov29_02304830(defender, GetIdleAnimationId(defender)); @@ -1196,20 +1196,20 @@ negation_checked: } #ifdef JAPAN - if (revival_item != NULL) { + if (item2 != NULL) { #else if (!DUNGEON_PTR->end_floor_no_death_check_flag - && revival_item != NULL) { + && item2 != NULL) { #endif #ifdef EUROPE - if (defer_defeat_message) { - LogMessageByIdWithPopup(attacker, ov29_02353E44[defeat_idx]); + if (f6) { + LogMessageByIdWithPopup(attacker, ov29_02353E44[v1]); } #endif - music = ov29_022EAF20(); - if (dmon->curse_class_status.curse == 2) { + v5 = ov29_022EAF20(); + if (mon1->curse_class_status.curse == 2) { EndCurseClassStatus(defender, defender, - *(volatile u8 *)&dmon->curse_class_status.curse, + *(volatile u8 *)&mon1->curse_class_status.curse, 0); } ov29_02344B9C(0, 0x69); @@ -1217,9 +1217,9 @@ negation_checked: SubstitutePlaceholderStringTags(0, defender, 0); ov29_022EFB20(1); ov29_022E550C(defender); - ov29_0230D688(revival_item); + ov29_0230D688(item2); defender->transparent = 0; - dmon->unk_revive_visual_tracker = TRUE; + mon1->unk_revive_visual_tracker = TRUE; ov29_02304830(defender, GetIdleAnimationId(defender)); SubstitutePlaceholderStringTags(1, defender, 0); LogMessageByIdWithPopup(attacker, MESSAGE_C4C); @@ -1236,83 +1236,83 @@ negation_checked: ov29_022F05E4(); ov29_022EFB84(1); defender->transparent = 1; - dmon->unk_revive_visual_tracker = FALSE; + mon1->unk_revive_visual_tracker = FALSE; LogMessageByIdWithPopup(attacker, MESSAGE_C6D); WaitUntilAlertBoxPauseIsOver(0xA); ov29_022F0534(0); ChangeDungeonMusic(MusicTableIdxToMusicId( DUNGEON_PTR->gen_info.music_table_idx)); - SetUnkMusicFlag(music); + SetUnkMusicFlag(v5); ov29_0230D628(defender); } #ifdef EUROPE - else if (defer_defeat_message) { - LogMessageByIdWithPopup(attacker, ov29_02353218[defeat_idx]); + else if (f6) { + LogMessageByIdWithPopup(attacker, ov29_02353218[v1]); } #endif } - if (!dmon->is_team_leader) { - if (GetFlag(dmon->held_item.flags, 1)) { - if (dmon->is_not_team_member) { - if (IsCurrentMissionType(MISSION_TAKE_ITEM_FROM_OUTLAW) && IsMonsterLoneOutlaw(dmon) - && (dmon->held_item.flags & 0x40)) { - dmon->held_item.flags &= ~0x40; - dmon->held_item.flags |= 0x80; + if (!mon1->is_team_leader) { + if (GetFlag(mon1->held_item.flags, 1)) { + if (mon1->is_not_team_member) { + if (IsCurrentMissionType(MISSION_TAKE_ITEM_FROM_OUTLAW) && IsMonsterLoneOutlaw(mon1) + && (mon1->held_item.flags & 0x40)) { + mon1->held_item.flags &= ~0x40; + mon1->held_item.flags |= 0x80; } if (SpawnDroppedItemWrapper(defender, &defender->pos, - &dmon->held_item, 1) - && (dmon->held_item.flags & 0x80)) { + &mon1->held_item, 1) + && (mon1->held_item.flags & 0x80)) { ov29_0234969C(1); } } else { - RemoveHolderForItemInBag(&dmon->held_item); + RemoveHolderForItemInBag(&mon1->held_item); } - ItemZInit(&dmon->held_item); + ItemZInit(&mon1->held_item); } else { TrySpawnEnemyItemDrop(attacker, defender); } } - gained_exp = FALSE; - if (dmon->boss_flag) { + f5 = FALSE; + if (mon1->boss_flag) { DUNGEON_PTR->field_0x796 = 0x3E7; } if (attacker->type == 1) { - amon = attacker->info; - exp = GetExp((enum monster_id)dmon->id, dmon->level); - if (!ov29_02303E0C(dmon)) { - if (dmon->boss_flag) { - exp = ov10_022C593C[dmon->field_0x168].field_0x0; + mon2 = attacker->info; + v4 = GetExp((enum monster_id)mon1->id, mon1->level); + if (!ov29_02303E0C(mon1)) { + if (mon1->boss_flag) { + v4 = ov10_022C593C[mon1->field_0x168].field_0x0; } else { - if (dmon->exp_yield == 0) { - exp = exp / 2; - } else if (dmon->exp_yield == 2) { - exp = (exp * 3) / 2; + if (mon1->exp_yield == 0) { + v4 = v4 / 2; + } else if (mon1->exp_yield == 2) { + v4 = (v4 * 3) / 2; } - if (exp == 0) { - exp = 1; + if (v4 == 0) { + v4 = 1; } } - if (dmon->grudge) { - amon->hit_grudge_monster = TRUE; + if (mon1->grudge) { + mon2->hit_grudge_monster = TRUE; } if (a5 == 1) { - if (!amon->is_not_team_member) { - if (dmon->is_not_team_member) { - AddExpSpecial(attacker, attacker, exp); + if (!mon2->is_not_team_member) { + if (mon1->is_not_team_member) { + AddExpSpecial(attacker, attacker, v4); for (i = 0; i < 4; i++) { - other = DUNGEON_PTR->monster_slot_ptrs[i]; - if (EntityIsValid__02308FBC(other) - && other != attacker) { - AddExpSpecial(attacker, other, exp); + ent1 = DUNGEON_PTR->monster_slot_ptrs[i]; + if (EntityIsValid__02308FBC(ent1) + && ent1 != attacker) { + AddExpSpecial(attacker, ent1, v4); } } - gained_exp = TRUE; + f5 = TRUE; } } else if (CanEnemyEvolve(DUNGEON_PTR->id)) { - amon->should_evolve = TRUE; + mon2->should_evolve = TRUE; DUNGEON_PTR->should_enemy_evolve = TRUE; } } @@ -1321,13 +1321,13 @@ negation_checked: if (EntityIsValid__02308FBC(attacker) && attacker->type == 1 && !((struct monster *)attacker->info)->is_team_leader) { - gained_exp = FALSE; + f5 = FALSE; } - if (gained_exp) { - FillRecruitInfo(recruit_info, defender); + if (f5) { + FillRecruitInfo(buf, defender); if (RecruitCheck(attacker, defender)) { - if (!TryRecruit(attacker, defender, recruit_info)) { + if (!TryRecruit(attacker, defender, buf)) { if (EntityIsValid__02308FBC(defender)) { AftermathCheck(attacker, defender, damage_source); HandleFaint(defender, DAMAGE_SOURCE_NOT_BEFRIENDED, @@ -1346,7 +1346,7 @@ negation_checked: HandleFaint(defender, damage_source, attacker); } - if (!ov29_0237CA6C && is_wild_enemy) { + if (!ov29_0237CA6C && f3) { ov29_0233847C(); } diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c index 6e81469f..aeb44f7e 100644 --- a/src/overlay_29_0230BBAC.c +++ b/src/overlay_29_0230BBAC.c @@ -101,78 +101,78 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a s32 power, s32 crit_chance, struct unk_02308FE0 *damage_out, s32 damage_mult, enum move_id move_id, s32 a9) { - struct fixed_point_64 type_mult; - struct fixed_point_64 base; - struct fixed_point_64 flv_fp; - struct fixed_point_64 at_fp; - struct fixed_point_64 def_fp; - s32 calc[2]; - struct fixed_point_64 tmp2; - struct fixed_point_64 tmp; - struct fixed_point_64 scratch; - struct fixed_point_64 tmp3; - struct fixed_point_64 mult_fp; - struct fixed_point_64 ln_fp; - struct fixed_point_64 mult32_fp; - struct fixed_point_64 hundred_fp; - struct monster *amon; - struct monster *dmon; - bool8 has_status; - s32 off_stage; - s32 ability_roll; - s32 off_mult; - s32 def_mult; - bool8 has_status2; - bool8 has_status3; - s32 not_physical2; - s32 def_ability_div; - s32 def_ability_mult; - s32 dv; - s32 p; - struct monster *info; - struct monster *info2; - int dmult; - s32 not_physical; - s32 is_team_member; - s32 def_stage; - s32 off_ability_mult; - s32 off_ability_div; - s32 off_mod; - s32 def_mod; - bool8 boosted; - s32 type_boosted; - s32 rate; - s32 flash; - volatile s32 *po; - volatile s32 *po2; - volatile s32 *pd; + struct fixed_point_64 fp1; + struct fixed_point_64 fp2; + struct fixed_point_64 fp3; + struct fixed_point_64 fp4; + struct fixed_point_64 fp5; + s32 arr[2]; + struct fixed_point_64 fp6; + struct fixed_point_64 fp7; + struct fixed_point_64 fp8; + struct fixed_point_64 fp9; + struct fixed_point_64 fp10; + struct fixed_point_64 fp11; + struct fixed_point_64 fp12; + struct fixed_point_64 fp13; + struct monster *mon1; + struct monster *mon2; + bool8 f1; + s32 v1; + s32 v2; + s32 v3; + s32 v4; + bool8 f2; + bool8 f3; + s32 v5; + s32 v6; + s32 v7; + s32 v8; + s32 v9; + struct monster *mon3; + struct monster *mon4; + int v10; + s32 v11; + s32 v12; + s32 v13; + s32 v14; + s32 v15; + s32 v16; + s32 v17; + bool8 f4; + s32 v18; + s32 v19; + s32 v20; + volatile s32 *p1; + volatile s32 *p2; + volatile s32 *p3; struct damage_calc_diag *diag; - amon = GetEntInfo(attacker); - dmon = GetEntInfo(defender); - dmult = damage_mult; + mon1 = GetEntInfo(attacker); + mon2 = GetEntInfo(defender); + v10 = damage_mult; diag = &DUNGEON_PTR->last_damage_calc; ResetDamageData(damage_out); - if (amon->me_first_flag) { - dmult = MultiplyByFixedPoint(dmult, ME_FIRST_MULTIPLIER); + if (mon1->me_first_flag) { + v10 = MultiplyByFixedPoint(v10, ME_FIRST_MULTIPLIER); } if (AbilityIsActiveVeneer(attacker, ABILITY_RECKLESS) && IsRecoilMove(move_id)) { - dmult = dmult * 3 / 2; + v10 = v10 * 3 / 2; } if (AbilityIsActiveVeneer(attacker, ABILITY_IRON_FIST) && IsPunchMove(move_id)) { - dmult = MultiplyByFixedPoint(dmult, 0x180); + v10 = MultiplyByFixedPoint(v10, 0x180); } if (AbilityIsActiveVeneer(attacker, ABILITY_NORMALIZE)) { attack_type = TYPE_NORMAL; } if (move_id == 0x1D3) { - attack_type = amon->types[0]; + attack_type = mon1->types[0]; } - not_physical = MoveIsNotPhysical(move_id); + v11 = MoveIsNotPhysical(move_id); ResetDamageCalcDiagnostics(); - if (!amon->is_team_leader && CeilFixedPoint(amon->belly) == 0) { + if (!mon1->is_team_leader && CeilFixedPoint(mon1->belly) == 0) { damage_out->field_0x0 = 1; damage_out->field_0x4 = 0; damage_out->field_0x8 = MATCHUP_NEUTRAL; @@ -204,281 +204,281 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a damage_out->field_0xc = attack_type; damage_out->field_0xd = GetMoveCategory(move_id); diag->move_type = attack_type; - off_mod = 0; - def_mod = 0; - diag->move_category = not_physical; - off_mult = amon->stat_modifiers.offensive_multipliers[not_physical]; - def_mult = dmon->stat_modifiers.defensive_multipliers[not_physical]; + v16 = 0; + v17 = 0; + diag->move_category = v11; + v3 = mon1->stat_modifiers.offensive_multipliers[v11]; + v4 = mon2->stat_modifiers.defensive_multipliers[v11]; if (AbilityIsActiveVeneer(attacker, ABILITY_DOWNLOAD)) { - if (dmon->defensive_stats[0] >= dmon->defensive_stats[1]) { - if (not_physical == 1) { - off_mod++; + if (mon2->defensive_stats[0] >= mon2->defensive_stats[1]) { + if (v11 == 1) { + v16++; diag->ability_offense_modifier++; } - } else if (not_physical == 0) { - off_mod++; + } else if (v11 == 0) { + v16++; diag->ability_offense_modifier++; } } - off_stage = amon->stat_modifiers.offensive_stages[not_physical]; + v1 = mon1->stat_modifiers.offensive_stages[v11]; if (a9) { if (attack_type == TYPE_FIRE) { - s16 boost = amon->stat_modifiers.flash_fire_boost; - diag->flash_fire_boost = boost; - off_mod += boost; + s16 v21 = mon1->stat_modifiers.flash_fire_boost; + diag->flash_fire_boost = v21; + v16 += v21; } } if (IqSkillIsEnabled(attacker, IQ_AGGRESSOR)) { - off_mod++; + v16++; diag->iq_skill_offense_modifier++; } if (IqSkillIsEnabled(attacker, IQ_DEFENDER)) { - off_mod--; + v16--; diag->iq_skill_offense_modifier--; } - if (IqSkillIsEnabled(attacker, IQ_PRACTICE_SWINGER) && amon->practice_swinger_flag) { - off_mod++; + if (IqSkillIsEnabled(attacker, IQ_PRACTICE_SWINGER) && mon1->practice_swinger_flag) { + v16++; diag->iq_skill_offense_modifier++; } if (NearbyAllyIqSkillIsEnabled(attacker, IQ_CHEERLEADER)) { - off_mod++; + v16++; } - if (not_physical == 0) { + if (v11 == 0) { if (AbilityIsActiveVeneer(attacker, ABILITY_RIVALRY)) { - if (GendersEqualNotGenderless(amon->apparent_id, dmon->apparent_id)) { - off_mod++; + if (GendersEqualNotGenderless(mon1->apparent_id, mon2->apparent_id)) { + v16++; diag->ability_offense_modifier++; - } else if (GetMonsterGenderVeneer(amon->apparent_id) != 3 - && GetMonsterGenderVeneer(dmon->apparent_id) != 3) { - off_mod--; + } else if (GetMonsterGenderVeneer(mon1->apparent_id) != 3 + && GetMonsterGenderVeneer(mon2->apparent_id) != 3) { + v16--; diag->ability_offense_modifier--; } } if (GetApparentWeather(attacker) == WEATHER_SUNNY && (AbilityIsActiveVeneer(attacker, ABILITY_FLOWER_GIFT) || OtherMonsterAbilityIsActive(attacker, ABILITY_FLOWER_GIFT))) { - off_mod++; + v16++; diag->ability_offense_modifier++; } } else { if (AbilityIsActiveVeneer(attacker, ABILITY_SOLAR_POWER) && GetApparentWeather(attacker) == WEATHER_SUNNY) { - off_mod += 2; + v16 += 2; diag->ability_offense_modifier += 2; } if (GetApparentWeather(defender) == WEATHER_SUNNY && (AbilityIsActiveVeneer(defender, ABILITY_FLOWER_GIFT) || OtherMonsterAbilityIsActive(defender, ABILITY_FLOWER_GIFT))) { - def_mod++; + v17++; diag->ability_defense_modifier++; } if (GetApparentWeather(defender) == WEATHER_SANDSTORM - && (dmon->types[0] == TYPE_ROCK || dmon->types[1] == TYPE_ROCK)) { - def_mod += 2; + && (mon2->types[0] == TYPE_ROCK || mon2->types[1] == TYPE_ROCK)) { + v17 += 2; } } - if (amon->apparent_id == 0x1A3) { - off_mod += 2; + if (mon1->apparent_id == 0x1A3) { + v16 += 2; } - if (amon->apparent_id == 0x1A4) { - off_mod -= 2; + if (mon1->apparent_id == 0x1A4) { + v16 -= 2; } - if (amon->apparent_id == 0x1A5) { - off_mod -= 2; + if (mon1->apparent_id == 0x1A5) { + v16 -= 2; } - if (amon->apparent_id == 0x211) { - off_mod -= 2; - } else if (amon->apparent_id == 0x218) { - off_mod += 2; + if (mon1->apparent_id == 0x211) { + v16 -= 2; + } else if (mon1->apparent_id == 0x218) { + v16 += 2; } - off_stage += off_mod; - if (amon->anger_point_flag && AbilityIsActiveVeneer(attacker, ABILITY_ANGER_POINT)) { - off_stage = 20; + v1 += v16; + if (mon1->anger_point_flag && AbilityIsActiveVeneer(attacker, ABILITY_ANGER_POINT)) { + v1 = 20; } - def_stage = dmon->stat_modifiers.defensive_stages[not_physical]; - if (not_physical == 0) { - if (dmon->bide_class_status.bide == 6) { + v13 = mon2->stat_modifiers.defensive_stages[v11]; + if (v11 == 0) { + if (mon2->bide_class_status.bide == 6) { diag->skull_bash_defense_boost_activated = TRUE; - def_mod++; + v17++; } if (IqSkillIsEnabled(defender, IQ_COUNTER_BASHER)) { - def_mod--; + v17--; diag->iq_skill_defense_modifier--; } } if (IqSkillIsEnabled(defender, IQ_AGGRESSOR)) { - def_mod--; + v17--; diag->iq_skill_defense_modifier--; } if (IqSkillIsEnabled(defender, IQ_DEFENDER)) { - def_mod++; + v17++; diag->iq_skill_defense_modifier++; } - if (dmon->apparent_id == 0x1A3) { - def_mod -= 2; + if (mon2->apparent_id == 0x1A3) { + v17 -= 2; } - if (dmon->apparent_id == 0x1A4) { - def_mod += 2; + if (mon2->apparent_id == 0x1A4) { + v17 += 2; } - if (dmon->apparent_id == 0x1A5) { - def_mod -= 2; + if (mon2->apparent_id == 0x1A5) { + v17 -= 2; } #ifdef JAPAN - if (amon->apparent_id == 0x211) { - def_mod += 2; - } else if (amon->apparent_id == 0x218) { - def_mod -= 2; + if (mon1->apparent_id == 0x211) { + v17 += 2; + } else if (mon1->apparent_id == 0x218) { + v17 -= 2; } #else - if (dmon->apparent_id == 0x211) { - def_mod += 2; - } else if (dmon->apparent_id == 0x218) { - def_mod -= 2; + if (mon2->apparent_id == 0x211) { + v17 += 2; + } else if (mon2->apparent_id == 0x218) { + v17 -= 2; } #endif - def_stage += def_mod; + v13 += v17; if (move_id == 0x1BD) { - s16 sum = 0; + s16 v22 = 0; - if (dmon->stat_modifiers.offensive_stages[0] > 10) { - sum += dmon->stat_modifiers.offensive_stages[0] - 10; + if (mon2->stat_modifiers.offensive_stages[0] > 10) { + v22 += mon2->stat_modifiers.offensive_stages[0] - 10; } - if (dmon->stat_modifiers.defensive_stages[0] > 10) { - sum += dmon->stat_modifiers.defensive_stages[0] - 10; + if (mon2->stat_modifiers.defensive_stages[0] > 10) { + v22 += mon2->stat_modifiers.defensive_stages[0] - 10; } - if (dmon->stat_modifiers.offensive_stages[1] > 10) { - sum += dmon->stat_modifiers.offensive_stages[1] - 10; + if (mon2->stat_modifiers.offensive_stages[1] > 10) { + v22 += mon2->stat_modifiers.offensive_stages[1] - 10; } - if (dmon->stat_modifiers.defensive_stages[1] > 10) { - sum += dmon->stat_modifiers.defensive_stages[1] - 10; + if (mon2->stat_modifiers.defensive_stages[1] > 10) { + v22 += mon2->stat_modifiers.defensive_stages[1] - 10; } - off_stage += sum; + v1 += v22; } if (AbilityIsActiveVeneer(attacker, ABILITY_UNAWARE)) { - def_stage = 10; - def_mult = 0x100; + v13 = 10; + v4 = 0x100; #ifdef JAPAN } else if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_UNAWARE)) { #else } else if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_UNAWARE, TRUE)) { #endif - off_stage = 10; - off_mult = 0x100; + v1 = 10; + v3 = 0x100; } - if (off_stage < 0) { - off_stage = 0; + if (v1 < 0) { + v1 = 0; } - if (off_stage > 20) { - off_stage = 20; + if (v1 > 20) { + v1 = 20; } - diag->offensive_stat_stage = off_stage; - diag->offensive_stat = amon->offensive_stats[not_physical]; - calc[0] = MultiplyByFixedPoint( - MultiplyByFixedPoint(amon->offensive_stats[not_physical] << 8, - OFFENSIVE_STAT_STAGE_MULTIPLIERS[off_stage]), - off_mult) >> 8; + diag->offensive_stat_stage = v1; + diag->offensive_stat = mon1->offensive_stats[v11]; + arr[0] = MultiplyByFixedPoint( + MultiplyByFixedPoint(mon1->offensive_stats[v11] << 8, + OFFENSIVE_STAT_STAGE_MULTIPLIERS[v1]), + v3) >> 8; - if (def_stage < 0) { - def_stage = 0; + if (v13 < 0) { + v13 = 0; } - if (def_stage > 20) { - def_stage = 20; + if (v13 > 20) { + v13 = 20; } - diag->defensive_stat_stage = def_stage; - diag->defensive_stat = dmon->defensive_stats[not_physical]; - calc[1] = MultiplyByFixedPoint( - MultiplyByFixedPoint(dmon->defensive_stats[not_physical] << 8, - DEFENSIVE_STAT_STAGE_MULTIPLIERS[def_stage]), - def_mult) >> 8; + diag->defensive_stat_stage = v13; + diag->defensive_stat = mon2->defensive_stats[v11]; + arr[1] = MultiplyByFixedPoint( + MultiplyByFixedPoint(mon2->defensive_stats[v11] << 8, + DEFENSIVE_STAT_STAGE_MULTIPLIERS[v13]), + v4) >> 8; - if (!amon->is_not_team_member) { - calc[0] += ExclusiveItemOffenseBoost(attacker, not_physical); + if (!mon1->is_not_team_member) { + arr[0] += ExclusiveItemOffenseBoost(attacker, v11); } - if (!dmon->is_not_team_member) { - calc[1] += ExclusiveItemDefenseBoost(defender, not_physical); + if (!mon2->is_not_team_member) { + arr[1] += ExclusiveItemDefenseBoost(defender, v11); } - if (not_physical == 0) { + if (v11 == 0) { if (ItemIsActive__0230A9DC(attacker, ITEM_POWER_BAND)) { - calc[0] += POWER_BAND_STAT_BOOST; + arr[0] += POWER_BAND_STAT_BOOST; diag->item_atk_modifier += POWER_BAND_STAT_BOOST; } if (ItemIsActive__0230A9DC(attacker, ITEM_MUNCH_BELT)) { - calc[0] += MUNCH_BELT_STAT_BOOST; + arr[0] += MUNCH_BELT_STAT_BOOST; diag->item_atk_modifier += MUNCH_BELT_STAT_BOOST; } if (AuraBowIsActive(attacker)) { - calc[0] += AURA_BOW_STAT_BOOST; + arr[0] += AURA_BOW_STAT_BOOST; diag->item_sp_atk_modifier += AURA_BOW_STAT_BOOST; } if (a9) { if (ItemIsActive__0230A9DC(defender, ITEM_DEF_SCARF)) { - calc[1] += DEF_SCARF_STAT_BOOST; + arr[1] += DEF_SCARF_STAT_BOOST; diag->item_def_modifier += DEF_SCARF_STAT_BOOST; } if (AuraBowIsActive(defender)) { - calc[1] += AURA_BOW_STAT_BOOST; + arr[1] += AURA_BOW_STAT_BOOST; diag->item_def_modifier += AURA_BOW_STAT_BOOST; } } } else { if (a9) { if (ItemIsActive__0230A9DC(defender, ITEM_ZINC_BAND)) { - calc[1] += ZINC_BAND_STAT_BOOST; + arr[1] += ZINC_BAND_STAT_BOOST; diag->item_sp_def_modifier += ZINC_BAND_STAT_BOOST; } if (AuraBowIsActive(defender)) { - calc[1] += AURA_BOW_STAT_BOOST; + arr[1] += AURA_BOW_STAT_BOOST; diag->item_def_modifier += AURA_BOW_STAT_BOOST; } } if (ItemIsActive__0230A9DC(attacker, ITEM_SPECIAL_BAND)) { - calc[0] += SPECIAL_BAND_STAT_BOOST; + arr[0] += SPECIAL_BAND_STAT_BOOST; diag->item_sp_atk_modifier += SPECIAL_BAND_STAT_BOOST; } if (ItemIsActive__0230A9DC(attacker, ITEM_MUNCH_BELT)) { - calc[0] += MUNCH_BELT_STAT_BOOST; + arr[0] += MUNCH_BELT_STAT_BOOST; diag->item_sp_atk_modifier += MUNCH_BELT_STAT_BOOST; } if (AuraBowIsActive(defender)) { - calc[0] += AURA_BOW_STAT_BOOST; + arr[0] += AURA_BOW_STAT_BOOST; diag->item_sp_atk_modifier += AURA_BOW_STAT_BOOST; } } - po = &calc[0]; - po2 = &calc[0]; - FixedPoint32To64(&at_fp, + p1 = &arr[0]; + p2 = &arr[0]; + FixedPoint32To64(&fp4, MultiplyByFixedPoint(MultiplyByFixedPoint(power << 8, - OFFENSIVE_STAT_STAGE_MULTIPLIERS[off_stage]), - off_mult)); - ability_roll = DungeonRandInt(100); - amon->prev_state_flags &= ~0x100; - amon->state_flags &= ~0x100; - off_ability_mult = 1; - off_ability_div = 1; - def_ability_mult = 1; - def_ability_div = 1; + OFFENSIVE_STAT_STAGE_MULTIPLIERS[v1]), + v3)); + v2 = DungeonRandInt(100); + mon1->prev_state_flags &= ~0x100; + mon1->state_flags &= ~0x100; + v14 = 1; + v15 = 1; + v7 = 1; + v6 = 1; - not_physical2 = MoveIsNotPhysical(move_id); - if (not_physical2 == 0 && AbilityIsActiveVeneer(attacker, ABILITY_GUTS)) { - info = attacker->info; - has_status = MonsterHasNegativeStatus(attacker, TRUE); - boosted = UpdateStateFlags(info, 1, has_status); - if (has_status) { - off_ability_mult <<= 1; + v5 = MoveIsNotPhysical(move_id); + if (v5 == 0 && AbilityIsActiveVeneer(attacker, ABILITY_GUTS)) { + mon3 = attacker->info; + f1 = MonsterHasNegativeStatus(attacker, TRUE); + f4 = UpdateStateFlags(mon3, 1, f1); + if (f1) { + v14 <<= 1; } - if (boosted) { + if (f4) { PlayEffectAnimation0x1A9__022E6130(attacker); LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C53); } @@ -486,142 +486,142 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a if (AbilityIsActiveVeneer(attacker, ABILITY_HUGE_POWER) || AbilityIsActiveVeneer(attacker, ABILITY_PURE_POWER)) { - info = attacker->info; - has_status2 = (ability_roll < 0x21 && not_physical2 == 0); - boosted = UpdateStateFlags(info, 0x100, has_status2); - if (has_status2) { - off_ability_mult += off_ability_mult * 2; - off_ability_div <<= 1; + mon3 = attacker->info; + f2 = (v2 < 0x21 && v5 == 0); + f4 = UpdateStateFlags(mon3, 0x100, f2); + if (f2) { + v14 += v14 * 2; + v15 <<= 1; } - if (boosted) { + if (f4) { PlayEffectAnimation0x1A9__022E617C(attacker); LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C54); } } - if (AbilityIsActiveVeneer(attacker, ABILITY_HUSTLE) && not_physical2 == 0) { - off_ability_mult += off_ability_mult * 2; - off_ability_div <<= 1; + if (AbilityIsActiveVeneer(attacker, ABILITY_HUSTLE) && v5 == 0) { + v14 += v14 * 2; + v15 <<= 1; } - is_team_member = !((struct monster *)attacker->info)->is_not_team_member; - if (AbilityIsActiveVeneer(attacker, ABILITY_PLUS) && not_physical2 == 1 - && DUNGEON_PTR->minus_is_active[is_team_member]) { - off_ability_mult = off_ability_mult * 16 - off_ability_mult; - off_ability_div *= 10; + v12 = !((struct monster *)attacker->info)->is_not_team_member; + if (AbilityIsActiveVeneer(attacker, ABILITY_PLUS) && v5 == 1 + && DUNGEON_PTR->minus_is_active[v12]) { + v14 = v14 * 16 - v14; + v15 *= 10; } - if (AbilityIsActiveVeneer(attacker, ABILITY_MINUS) && not_physical2 == 1 - && DUNGEON_PTR->plus_is_active[is_team_member]) { - off_ability_mult = off_ability_mult * 16 - off_ability_mult; - off_ability_div *= 10; + if (AbilityIsActiveVeneer(attacker, ABILITY_MINUS) && v5 == 1 + && DUNGEON_PTR->plus_is_active[v12]) { + v14 = v14 * 16 - v14; + v15 *= 10; } #ifdef JAPAN if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_INTIMIDATE) - && not_physical2 == 0) { + && v5 == 0) { #else if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_INTIMIDATE, TRUE) - && not_physical2 == 0) { + && v5 == 0) { #endif - off_ability_mult <<= 2; - off_ability_div += off_ability_div * 4; + v14 <<= 2; + v15 += v15 * 4; } #ifdef JAPAN if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MARVEL_SCALE) - && not_physical2 == 0) { + && v5 == 0) { #else if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MARVEL_SCALE, TRUE) - && not_physical2 == 0) { + && v5 == 0) { #endif - info2 = defender->info; - has_status3 = MonsterHasNegativeStatus(defender, TRUE); - boosted = UpdateStateFlags(info2, 8, has_status3); - if (has_status3) { - def_ability_mult = def_ability_mult * 3; - def_ability_div <<= 1; + mon4 = defender->info; + f3 = MonsterHasNegativeStatus(defender, TRUE); + f4 = UpdateStateFlags(mon4, 8, f3); + if (f3) { + v7 = v7 * 3; + v6 <<= 1; } - if (boosted) { + if (f4) { PlayEffectAnimation0x18E(defender); LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C55); } } - pd = &calc[1]; - p = *po * off_ability_mult; - dv = *pd; - *pd = dv * def_ability_mult; - *po2 = p; - if (off_ability_div != 1) { - *po2 = p / off_ability_div; + p3 = &arr[1]; + v9 = *p1 * v14; + v8 = *p3; + *p3 = v8 * v7; + *p2 = v9; + if (v15 != 1) { + *p2 = v9 / v15; } - if (def_ability_div != 1) { - pd = &calc[1]; - *pd = *pd / def_ability_div; + if (v6 != 1) { + p3 = &arr[1]; + *p3 = *p3 / v6; } - diag->offense_calc = calc[0]; - diag->defense_calc = calc[1]; - if (calc[0] < 0) { - calc[0] = 0; + diag->offense_calc = arr[0]; + diag->defense_calc = arr[1]; + if (arr[0] < 0) { + arr[0] = 0; } - if (calc[0] >= 999) { - calc[0] = 999; + if (arr[0] >= 999) { + arr[0] = 999; } - diag->damage_calc_def = calc[1]; - IntToFixedPoint64(&def_fp, calc[1]); - IntToFixedPoint64(&tmp2, calc[0] - calc[1]); - FixedPoint32To64(&tmp, DAMAGE_FORMULA_FLV_DEFICIT_DIVISOR); - DivideFixedPoint64(&tmp2, &tmp2, &tmp); - IntToFixedPoint64(&tmp, amon->level); - AddFixedPoint64(&flv_fp, &tmp, &tmp2); - IntToFixedPoint64(&tmp, calc[0]); - AddFixedPoint64(&at_fp, &at_fp, &tmp); - diag->damage_calc_at = FixedPoint64ToInt(&at_fp); - diag->attacker_level = amon->level; - diag->damage_calc_flv = FixedPoint64ToInt(&flv_fp); - Debug_Print0(ov29_02352984, FixedPoint64ToInt(&flv_fp)); - Debug_Print0(ov29_02352990, FixedPoint64ToInt(&at_fp)); - Debug_Print0(ov29_0235299C, FixedPoint64ToInt(&def_fp)); + diag->damage_calc_def = arr[1]; + IntToFixedPoint64(&fp5, arr[1]); + IntToFixedPoint64(&fp6, arr[0] - arr[1]); + FixedPoint32To64(&fp7, DAMAGE_FORMULA_FLV_DEFICIT_DIVISOR); + DivideFixedPoint64(&fp6, &fp6, &fp7); + IntToFixedPoint64(&fp7, mon1->level); + AddFixedPoint64(&fp3, &fp7, &fp6); + IntToFixedPoint64(&fp7, arr[0]); + AddFixedPoint64(&fp4, &fp4, &fp7); + diag->damage_calc_at = FixedPoint64ToInt(&fp4); + diag->attacker_level = mon1->level; + diag->damage_calc_flv = FixedPoint64ToInt(&fp3); + Debug_Print0(ov29_02352984, FixedPoint64ToInt(&fp3)); + Debug_Print0(ov29_02352990, FixedPoint64ToInt(&fp4)); + Debug_Print0(ov29_0235299C, FixedPoint64ToInt(&fp5)); - FixedPoint32To64(&tmp3, DAMAGE_FORMULA_AT_PREFACTOR); - MultiplyFixedPoint64(&tmp3, &at_fp, &tmp3); - FixedPoint32To64(&mult_fp, DAMAGE_FORMULA_DEF_PREFACTOR); - MultiplyFixedPoint64(&mult_fp, &def_fp, &mult_fp); - FixedPoint32To64(&scratch, DAMAGE_FORMULA_FLV_SHIFT); - AddFixedPoint64(&ln_fp, &flv_fp, &scratch); - FixedPoint32To64(&scratch, DAMAGE_FORMULA_LN_ARG_PREFACTOR); - MultiplyFixedPoint64(&ln_fp, &ln_fp, &scratch); - ClampedLn(&ln_fp, FixedPoint64ToInt(&ln_fp)); - FixedPoint32To64(&scratch, DAMAGE_FORMULA_LN_PREFACTOR); - MultiplyFixedPoint64(&ln_fp, &ln_fp, &scratch); - AddFixedPoint64(&base, &mult_fp, &tmp3); - AddFixedPoint64(&base, &base, &ln_fp); - FixedPoint32To64(&scratch, DAMAGE_FORMULA_CONSTANT_SHIFT); - AddFixedPoint64(&base, &base, &scratch); + FixedPoint32To64(&fp9, DAMAGE_FORMULA_AT_PREFACTOR); + MultiplyFixedPoint64(&fp9, &fp4, &fp9); + FixedPoint32To64(&fp10, DAMAGE_FORMULA_DEF_PREFACTOR); + MultiplyFixedPoint64(&fp10, &fp5, &fp10); + FixedPoint32To64(&fp8, DAMAGE_FORMULA_FLV_SHIFT); + AddFixedPoint64(&fp11, &fp3, &fp8); + FixedPoint32To64(&fp8, DAMAGE_FORMULA_LN_ARG_PREFACTOR); + MultiplyFixedPoint64(&fp11, &fp11, &fp8); + ClampedLn(&fp11, FixedPoint64ToInt(&fp11)); + FixedPoint32To64(&fp8, DAMAGE_FORMULA_LN_PREFACTOR); + MultiplyFixedPoint64(&fp11, &fp11, &fp8); + AddFixedPoint64(&fp2, &fp10, &fp9); + AddFixedPoint64(&fp2, &fp2, &fp11); + FixedPoint32To64(&fp8, DAMAGE_FORMULA_CONSTANT_SHIFT); + AddFixedPoint64(&fp2, &fp2, &fp8); - if (!FixedRoomIsSubstituteRoom() && amon->is_not_team_member) { - FixedPoint32To64(&scratch, DAMAGE_FORMULA_NON_TEAM_MEMBER_MODIFIER); - DivideFixedPoint64(&base, &base, &scratch); + if (!FixedRoomIsSubstituteRoom() && mon1->is_not_team_member) { + FixedPoint32To64(&fp8, DAMAGE_FORMULA_NON_TEAM_MEMBER_MODIFIER); + DivideFixedPoint64(&fp2, &fp2, &fp8); } - if (FixedPoint64CmpLt(&DAMAGE_FORMULA_MAX_BASE, &base)) { - base.lower = ((const struct fixed_point_64 *)&ov29_02352838[13])->lower; - base.upper = ((const struct fixed_point_64 *)&ov29_02352838[13])->upper; + if (FixedPoint64CmpLt(&DAMAGE_FORMULA_MAX_BASE, &fp2)) { + fp2.lower = ((const struct fixed_point_64 *)&ov29_02352838[13])->lower; + fp2.upper = ((const struct fixed_point_64 *)&ov29_02352838[13])->upper; } - if (FixedPoint64CmpLt(&base, &DAMAGE_FORMULA_MIN_BASE)) { - base.lower = ((const struct fixed_point_64 *)&ov29_02352838[17])->lower; - base.upper = ((const struct fixed_point_64 *)&ov29_02352838[17])->upper; + if (FixedPoint64CmpLt(&fp2, &DAMAGE_FORMULA_MIN_BASE)) { + fp2.lower = ((const struct fixed_point_64 *)&ov29_02352838[17])->lower; + fp2.upper = ((const struct fixed_point_64 *)&ov29_02352838[17])->upper; } - type_boosted = CalcTypeBasedDamageEffects(&type_mult, attacker, defender, power, attack_type, + v18 = CalcTypeBasedDamageEffects(&fp1, attacker, defender, power, attack_type, damage_out, IsRegularAttackOrProjectile(move_id) != 0); if (attack_type == TYPE_FIRE) { - flash = FlashFireShouldActivate(attacker, defender); - if (flash && !dmon->apply_flash_fire_boost && a9) { - dmon->apply_flash_fire_boost = TRUE; + v20 = FlashFireShouldActivate(attacker, defender); + if (v20 && !mon2->apply_flash_fire_boost && a9) { + mon2->apply_flash_fire_boost = TRUE; SubstitutePlaceholderStringTags(1, defender, 0); - if (flash == 1) { + if (v20 == 1) { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C58); } else { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C57); @@ -630,88 +630,88 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a } if (a9 && !ExclusiveItemEffectIsActive__0230A9B8(attacker, EXCLUSIVE_EFF_BYPASS_REFLECT_LIGHT_SCREEN)) { - if (not_physical == 0) { - if ((move_id != 0x48 && dmon->reflect_class_status.reflect == 1) + if (v11 == 0) { + if ((move_id != 0x48 && mon2->reflect_class_status.reflect == 1) || ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_HALVED_PHYSICAL_DAMAGE)) { PlayEffectAnimation0x171(defender); - MultiplyFixedPoint64(&type_mult, &type_mult, &DAMAGE_MULTIPLIER_0_5); + MultiplyFixedPoint64(&fp1, &fp1, &DAMAGE_MULTIPLIER_0_5); diag->half_physical_damage_activated = TRUE; } } - if (not_physical == 1 - && (dmon->reflect_class_status.reflect == 3 + if (v11 == 1 + && (mon2->reflect_class_status.reflect == 3 || ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_HALVED_SPECIAL_DAMAGE))) { PlayEffectAnimation0x171Full(defender); - MultiplyFixedPoint64(&type_mult, &type_mult, &DAMAGE_MULTIPLIER_0_5); + MultiplyFixedPoint64(&fp1, &fp1, &DAMAGE_MULTIPLIER_0_5); diag->half_special_damage_activated = TRUE; } } #ifdef JAPAN - if (dmon->reflect_class_status.reflect != 0x11 + if (mon2->reflect_class_status.reflect != 0x11 && !DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_BATTLE_ARMOR) && !DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_SHELL_ARMOR) && !IqSkillIsEnabled(defender, IQ_CRITICAL_DODGER)) { #else - if (dmon->reflect_class_status.reflect != 0x11 + if (mon2->reflect_class_status.reflect != 0x11 && !DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_BATTLE_ARMOR, TRUE) && !DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_SHELL_ARMOR, TRUE) && !IqSkillIsEnabled(defender, IQ_CRITICAL_DODGER)) { #endif - if (GetMonsterGenderVeneer(amon->id) == 2) { - rate = crit_chance; + if (GetMonsterGenderVeneer(mon1->id) == 2) { + v19 = crit_chance; } else { - rate = crit_chance + crit_chance / 2; + v19 = crit_chance + crit_chance / 2; } - if (amon->sure_shot_class_status.sure_shot == 4) { - rate = 999; + if (mon1->sure_shot_class_status.sure_shot == 4) { + v19 = 999; diag->focus_energy_activated = TRUE; } else { if (ItemIsActive__0230A9DC(attacker, ITEM_SCOPE_LENS) || IqSkillIsEnabled(attacker, IQ_SHARPSHOOTER)) { diag->scope_lens_or_sharpshooter_activated = TRUE; - rate += SCOPE_LENS_CRIT_RATE_BOOST; + v19 += SCOPE_LENS_CRIT_RATE_BOOST; } if (AbilityIsActiveVeneer(attacker, ABILITY_SUPER_LUCK)) { diag->super_luck_activated = TRUE; - rate += SUPER_LUCK_CRIT_RATE_BOOST; + v19 += SUPER_LUCK_CRIT_RATE_BOOST; } if (ItemIsActive__0230A9DC(defender, ITEM_PATSY_BAND)) { diag->patsy_band_activated = TRUE; - rate += SCOPE_LENS_CRIT_RATE_BOOST; + v19 += SCOPE_LENS_CRIT_RATE_BOOST; } - if (type_boosted && IqSkillIsEnabled(attacker, IQ_TYPE_ADVANTAGE_MASTER)) { + if (v18 && IqSkillIsEnabled(attacker, IQ_TYPE_ADVANTAGE_MASTER)) { diag->type_advantage_master_activated = TRUE; - rate = TYPE_ADVANTAGE_MASTER_CRIT_RATE; + v19 = TYPE_ADVANTAGE_MASTER_CRIT_RATE; } } - if (DungeonRandInt(100) < rate + if (DungeonRandInt(100) < v19 && !ExclusiveItemEffectIsActiveWithLogging(attacker, defender, TRUE, MESSAGE_DC1, EXCLUSIVE_EFF_NO_CRITICAL_HITS)) { damage_out->field_0xe = TRUE; if (AbilityIsActiveVeneer(attacker, ABILITY_SNIPER)) { - MultiplyFixedPoint64(&type_mult, &type_mult, &DAMAGE_MULTIPLIER_2); + MultiplyFixedPoint64(&fp1, &fp1, &DAMAGE_MULTIPLIER_2); diag->sniper_activated = TRUE; } else { - MultiplyFixedPoint64(&type_mult, &type_mult, &DAMAGE_MULTIPLIER_1_5); + MultiplyFixedPoint64(&fp1, &fp1, &DAMAGE_MULTIPLIER_1_5); } } } - diag->damage_calc_base = FixedPoint64ToInt(&base); - MultiplyFixedPoint64(&base, &base, &type_mult); - diag->static_damage_mult = dmult; - FixedPoint32To64(&mult32_fp, dmult); - MultiplyFixedPoint64(&base, &base, &mult32_fp); - diag->damage_calc = FixedPoint64ToInt(&base); + diag->damage_calc_base = FixedPoint64ToInt(&fp2); + MultiplyFixedPoint64(&fp2, &fp2, &fp1); + diag->static_damage_mult = v10; + FixedPoint32To64(&fp12, v10); + MultiplyFixedPoint64(&fp2, &fp2, &fp12); + diag->damage_calc = FixedPoint64ToInt(&fp2); - type_mult.lower = DungeonRandInt(0x4000); - type_mult.upper = 0; - type_mult.lower += 0xE000; - MultiplyFixedPoint64(&base, &base, &type_mult); - IntToFixedPoint64(&hundred_fp, 100); - MultiplyFixedPoint64(&type_mult, &hundred_fp, &type_mult); - diag->damage_calc_random_mult_pct = FixedPoint64ToInt(&type_mult); - damage_out->field_0x0 = FixedPoint64ToInt(&base); + fp1.lower = DungeonRandInt(0x4000); + fp1.upper = 0; + fp1.lower += 0xE000; + MultiplyFixedPoint64(&fp2, &fp2, &fp1); + IntToFixedPoint64(&fp13, 100); + MultiplyFixedPoint64(&fp1, &fp13, &fp1); + diag->damage_calc_random_mult_pct = FixedPoint64ToInt(&fp1); + damage_out->field_0x0 = FixedPoint64ToInt(&fp2); if (move_id == 0x195) { damage_out->field_0x0 = RoundUpDiv256(MultiplyByFixedPoint(damage_out->field_0x0 << 8, 0x80)); @@ -730,5 +730,5 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a if (damage_out->field_0x0 == 0) { damage_out->field_0xe = FALSE; } - dmon->anger_point_flag = damage_out->field_0xe; + mon2->anger_point_flag = damage_out->field_0xe; } diff --git a/src/type_effectiveness.c b/src/type_effectiveness.c index 38da123a..b9542329 100644 --- a/src/type_effectiveness.c +++ b/src/type_effectiveness.c @@ -84,33 +84,33 @@ int CalcTypeBasedDamageEffects(struct fixed_point_64 *out, struct entity *attack enum type_id attack_type, struct unk_02308FE0 *damage_data, bool8 is_projectile) { - struct fixed_point_64 matchup_mult[4]; - struct fixed_point_64 tmp; - s32 matchups[2]; - struct monster *info; + struct fixed_point_64 fparr[4]; + struct fixed_point_64 fp1; + s32 arr[2]; + struct monster *mon1; enum weather_id weather; - s16 wonder_guard; - bool8 ghost_ineffective; - bool8 scrappy; + s16 v1; + bool8 f1; + bool8 f2; s32 result; s32 i; - s32 matchup; - s32 max_hp; - bool8 low_hp; - bool8 announce; + s32 v2; + s32 v3; + bool8 f3; + bool8 f4; - info = GetEntInfo(attacker); - matchups[0] = ov29_02352838[7]; - matchups[1] = ov29_02352838[8]; + mon1 = GetEntInfo(attacker); + arr[0] = ov29_02352838[7]; + arr[1] = ov29_02352838[8]; IntToFixedPoint64(out, 1); - wonder_guard = FALSE; + v1 = FALSE; damage_data->field_0xe = FALSE; damage_data->field_0xf = FALSE; if (!EntityIsValid__02308FBC(defender)) { return TRUE; } - ghost_ineffective = IsTypeIneffectiveAgainstGhost(attack_type); + f1 = IsTypeIneffectiveAgainstGhost(attack_type); #ifdef JAPAN if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_WONDER_GUARD) && attack_type != TYPE_NONE) { @@ -118,60 +118,60 @@ int CalcTypeBasedDamageEffects(struct fixed_point_64 *out, struct entity *attack if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_WONDER_GUARD, TRUE) && attack_type != TYPE_NONE) { #endif - wonder_guard = TRUE; + v1 = TRUE; } damage_data->field_0x8 = MATCHUP_NEUTRAL; - scrappy = ScrappyShouldActivate(attacker, defender, attack_type); + f2 = ScrappyShouldActivate(attacker, defender, attack_type); for (i = 0; i < 2; i++) { if (!is_projectile && (IqSkillIsEnabled(attacker, IQ_ERRATIC_PLAYER) || IqSkillIsEnabled(defender, IQ_ERRATIC_PLAYER))) { - FixedPoint32To64(&matchup_mult[0], MATCHUP_IMMUNE_MULTIPLIER_ERRATIC_PLAYER); - FixedPoint32To64(&matchup_mult[1], MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER); - FixedPoint32To64(&matchup_mult[2], MATCHUP_NEUTRAL_MULTIPLIER_ERRATIC_PLAYER); - FixedPoint32To64(&matchup_mult[3], MATCHUP_SUPER_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER); + FixedPoint32To64(&fparr[0], MATCHUP_IMMUNE_MULTIPLIER_ERRATIC_PLAYER); + FixedPoint32To64(&fparr[1], MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER); + FixedPoint32To64(&fparr[2], MATCHUP_NEUTRAL_MULTIPLIER_ERRATIC_PLAYER); + FixedPoint32To64(&fparr[3], MATCHUP_SUPER_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER); } else { - FixedPoint32To64(&matchup_mult[0], MATCHUP_IMMUNE_MULTIPLIER); - FixedPoint32To64(&matchup_mult[1], MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER); - FixedPoint32To64(&matchup_mult[2], MATCHUP_NEUTRAL_MULTIPLIER); - FixedPoint32To64(&matchup_mult[3], MATCHUP_SUPER_EFFECTIVE_MULTIPLIER); + FixedPoint32To64(&fparr[0], MATCHUP_IMMUNE_MULTIPLIER); + FixedPoint32To64(&fparr[1], MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER); + FixedPoint32To64(&fparr[2], MATCHUP_NEUTRAL_MULTIPLIER); + FixedPoint32To64(&fparr[3], MATCHUP_SUPER_EFFECTIVE_MULTIPLIER); } if (FixedPoint64IsZero(out)) { break; } - if (!scrappy && ghost_ineffective + if (!f2 && f1 && GhostImmunityIsActive(attacker, defender, i)) { DUNGEON_PTR->last_damage_calc.ghost_immunity_activated = TRUE; - matchup = MATCHUP_IMMUNE; + v2 = MATCHUP_IMMUNE; } else { - matchup = GetTypeMatchup(attacker, defender, i, attack_type); + v2 = GetTypeMatchup(attacker, defender, i, attack_type); } if (IqSkillIsEnabled(attacker, IQ_ERRATIC_PLAYER)) { - MultiplyFixedPoint64(out, out, &matchup_mult[matchup]); - } else if (matchup != MATCHUP_NEUTRAL) { - MultiplyFixedPoint64(out, out, &matchup_mult[matchup]); + MultiplyFixedPoint64(out, out, &fparr[v2]); + } else if (v2 != MATCHUP_NEUTRAL) { + MultiplyFixedPoint64(out, out, &fparr[v2]); } - matchups[i] = matchup; + arr[i] = v2; } - DUNGEON_PTR->last_damage_calc.move_indiv_type_matchups[0] = (enum type_matchup)matchups[0]; - DUNGEON_PTR->last_damage_calc.move_indiv_type_matchups[1] = (enum type_matchup)matchups[1]; - matchup = TYPE_MATCHUP_COMBINATOR_TABLE[matchups[0]][matchups[1]]; - damage_data->field_0x8 = matchup; - if (matchup == MATCHUP_SUPER_EFFECTIVE) { + DUNGEON_PTR->last_damage_calc.move_indiv_type_matchups[0] = (enum type_matchup)arr[0]; + DUNGEON_PTR->last_damage_calc.move_indiv_type_matchups[1] = (enum type_matchup)arr[1]; + v2 = TYPE_MATCHUP_COMBINATOR_TABLE[arr[0]][arr[1]]; + damage_data->field_0x8 = v2; + if (v2 == MATCHUP_SUPER_EFFECTIVE) { result = TRUE; } else { result = FALSE; - if (wonder_guard) { + if (v1) { *out = *(const struct fixed_point_64 *)&ov29_02352838[15]; } } if (AbilityIsActiveVeneer(attacker, ABILITY_TINTED_LENS) && damage_data->field_0x8 == MATCHUP_NOT_VERY_EFFECTIVE) { - FixedPoint32To64(&tmp, TINTED_LENS_MULTIPLIER); - MultiplyFixedPoint64(out, out, &tmp); + FixedPoint32To64(&fp1, TINTED_LENS_MULTIPLIER); + MultiplyFixedPoint64(out, out, &fp1); } #ifdef JAPAN @@ -239,42 +239,42 @@ int CalcTypeBasedDamageEffects(struct fixed_point_64 *out, struct entity *attack } if (attack_type == TYPE_WATER && AbilityIsActiveVeneer(attacker, ABILITY_TORRENT)) { - max_hp = MIN(info->max_hp_stat + info->max_hp_boost, MAX_HP_LIMIT); - low_hp = max_hp / 4 >= info->hp; - announce = UpdateStateFlags(info, 0x80, low_hp); - if (low_hp) { + v3 = MIN(mon1->max_hp_stat + mon1->max_hp_boost, MAX_HP_LIMIT); + f3 = v3 / 4 >= mon1->hp; + f4 = UpdateStateFlags(mon1, 0x80, f3); + if (f3) { DUNGEON_PTR->last_damage_calc.torrent_boost_activated = TRUE; MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_2); } - if (announce) { + if (f4) { PlayEffectAnimation0x1A9__022E6214(attacker); LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C4F); } } if (attack_type == TYPE_GRASS && AbilityIsActiveVeneer(attacker, ABILITY_OVERGROW)) { - max_hp = MIN(info->max_hp_stat + info->max_hp_boost, MAX_HP_LIMIT); - low_hp = max_hp / 4 >= info->hp; - announce = UpdateStateFlags(info, 2, low_hp); - if (low_hp) { + v3 = MIN(mon1->max_hp_stat + mon1->max_hp_boost, MAX_HP_LIMIT); + f3 = v3 / 4 >= mon1->hp; + f4 = UpdateStateFlags(mon1, 2, f3); + if (f3) { DUNGEON_PTR->last_damage_calc.overgrow_boost_activated = TRUE; MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_2); } - if (announce) { + if (f4) { PlayEffectAnimation0x1A9__022E61C8(attacker); LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C50); } } if (attack_type == TYPE_BUG && AbilityIsActiveVeneer(attacker, ABILITY_SWARM)) { - max_hp = MIN(info->max_hp_stat + info->max_hp_boost, MAX_HP_LIMIT); - low_hp = max_hp / 4 >= info->hp; - announce = UpdateStateFlags(info, 0x10, low_hp); - if (low_hp) { + v3 = MIN(mon1->max_hp_stat + mon1->max_hp_boost, MAX_HP_LIMIT); + f3 = v3 / 4 >= mon1->hp; + f4 = UpdateStateFlags(mon1, 0x10, f3); + if (f3) { DUNGEON_PTR->last_damage_calc.swarm_boost_activated = TRUE; MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_2); } - if (announce) { + if (f4) { PlayEffectAnimation0x1A9__022E64C4(attacker); LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C51); } @@ -282,14 +282,14 @@ int CalcTypeBasedDamageEffects(struct fixed_point_64 *out, struct entity *attack if (attack_type == TYPE_FIRE) { if (AbilityIsActiveVeneer(attacker, ABILITY_BLAZE)) { - max_hp = MIN(info->max_hp_stat + info->max_hp_boost, MAX_HP_LIMIT); - low_hp = max_hp / 4 >= info->hp; - announce = UpdateStateFlags(info, 0x20, low_hp); - if (low_hp) { + v3 = MIN(mon1->max_hp_stat + mon1->max_hp_boost, MAX_HP_LIMIT); + f3 = v3 / 4 >= mon1->hp; + f4 = UpdateStateFlags(mon1, 0x20, f3); + if (f3) { DUNGEON_PTR->last_damage_calc.fire_move_ability_boost_activated = TRUE; MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_2); } - if (announce) { + if (f4) { PlayEffectAnimation0x1A9__022E6510(attacker); LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C52); } @@ -304,9 +304,9 @@ int CalcTypeBasedDamageEffects(struct fixed_point_64 *out, struct entity *attack } } - if (info->burn_class_status.burn == STATUS_BURN_BURN) { - FixedPoint32To64(&tmp, BURN_DAMAGE_MULTIPLIER); - MultiplyFixedPoint64(out, out, &tmp); + if (mon1->burn_class_status.burn == STATUS_BURN_BURN) { + FixedPoint32To64(&fp1, BURN_DAMAGE_MULTIPLIER); + MultiplyFixedPoint64(out, out, &fp1); } if (!FixedPoint64IsZero(out) && MonsterIsType(attacker, attack_type)) { @@ -356,7 +356,7 @@ int CalcTypeBasedDamageEffects(struct fixed_point_64 *out, struct entity *attack } if (attack_type == TYPE_ELECTRIC - && info->bide_class_status.bide == STATUS_TWO_TURN_CHARGING) { + && mon1->bide_class_status.bide == STATUS_TWO_TURN_CHARGING) { DUNGEON_PTR->last_damage_calc.charge_boost_activated = TRUE; MultiplyFixedPoint64(out, out, &DAMAGE_MULTIPLIER_2); } From 33d90d0f8d12fb68b822d26c55435e7200cd0255 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 6 Sep 2026 12:46:31 -0700 Subject: [PATCH 08/34] Decomp the fixed-point helper cluster at the end of main_020504BC.s sub_02050EBC, SubFixedPoint, sub_02050F78, sub_02050FF8 and BinToDecFixedPoint are the last five functions in asm/main_020504BC.s and all operate on struct fixed_point (106 instructions). The next object in main.lsf is src/number_util.o, which already holds their sibling CeilFixedPoint, so extract_function.py merges rather than splits and main.lsf is unchanged. They are landed in reverse address order so each prepends above the last, leaving number_util.c in ascending address order with CeilFixedPoint last. sub_02050EBC and sub_02050F78 keep their sub_ names - this is decompilation, not identification. A 4-byte struct fixed_point is passed and returned by value in r0, packed as integer | fractional << 16. The stmdb sp!, {r0, r1, r2, r3} at entry is MWCC giving the argument registers stack homes so a by-value struct parameter can be addressed, and writing to the parameter reuses that home, which is why SubFixedPoint and sub_02050EBC modify their first argument and return it. The caller-side sub rX, sp, #4 idiom around these calls is compiler-generated, not a source construct: src/dungeon_ai_movement.c already emits it from a plain CeilFixedPoint(pokemon_info->belly). None of the five blocks carries a region directive, so one source serves all three regions. Authored by Claude (Opus 5) under human direction. Confirmed by a matching build: build/pmdsky.us/pmdsky.us.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_020504BC.inc | 6 +- asm/main_020504BC.s | 127 ---------------------------------- include/number_util.h | 5 ++ src/number_util.c | 62 +++++++++++++++++ 4 files changed, 70 insertions(+), 130 deletions(-) diff --git a/asm/include/main_020504BC.inc b/asm/include/main_020504BC.inc index 86cffabb..2122160b 100644 --- a/asm/include/main_020504BC.inc +++ b/asm/include/main_020504BC.inc @@ -1,10 +1,8 @@ #pragma once -.public _0209E6BD -.public _022AB924 .public ADVENTURE_LOG_PTR .public ARM9_UNKNOWN_DATA__NA_209E6BC -.public ComputeSpecialCounters .public CONVERSION2_TYPE_TABLE +.public ComputeSpecialCounters .public Copy16BitsFrom .public Copy16BitsTo .public CopyNStringFromId @@ -16,3 +14,5 @@ .public StrncpySimpleNoPad .public StrncpySimpleNoPadSafe .public TEAM_NAME +.public _0209E6BD +.public _022AB924 diff --git a/asm/main_020504BC.s b/asm/main_020504BC.s index 87bc2710..f457bbaf 100644 --- a/asm/main_020504BC.s +++ b/asm/main_020504BC.s @@ -879,130 +879,3 @@ sub_02050E8C: ; 0x02050E8C bl CopyBitsFrom ldmia sp!, {r3, r4, r5, pc} arm_func_end sub_02050E8C - - arm_func_start sub_02050EBC -sub_02050EBC: ; 0x02050EBC - stmdb sp!, {r0, r1, r2, r3} - ldrsh r3, [sp, #2] - ldrsh r0, [sp, #6] - ldrsh r2, [sp] - ldrsh r1, [sp, #4] - add r0, r3, r0 - strh r0, [sp, #2] - ldrsh r0, [sp, #2] - add r1, r2, r1 - strh r1, [sp] - cmp r0, #0x3e8 - subge r0, r0, #0x3e8 - ldrgesh r1, [sp] - strgeh r0, [sp, #2] - addge r0, r1, #1 - strgeh r0, [sp] - ldrh r1, [sp, #2] - ldrh r0, [sp] - orr r0, r0, r1, lsl #16 - add sp, sp, #0x10 - bx lr - arm_func_end sub_02050EBC - - arm_func_start SubFixedPoint -SubFixedPoint: ; 0x02050F10 - stmdb sp!, {r0, r1, r2, r3} - ldrsh r3, [sp, #2] - ldrsh r0, [sp, #6] - ldrsh r2, [sp] - ldrsh r1, [sp, #4] - sub r0, r3, r0 - strh r0, [sp, #2] - ldrsh r0, [sp, #2] - sub r1, r2, r1 - strh r1, [sp] - cmp r0, #0 - addlt r0, r0, #0x3e8 - ldrltsh r1, [sp] - strlth r0, [sp, #2] - sublt r0, r1, #1 - strlth r0, [sp] - ldrsh r0, [sp] - cmp r0, #0 - movlt r0, #0 - strlth r0, [sp, #2] - strlth r0, [sp] - ldrh r1, [sp, #2] - ldrh r0, [sp] - orr r0, r0, r1, lsl #16 - add sp, sp, #0x10 - bx lr - arm_func_end SubFixedPoint - - arm_func_start sub_02050F78 -sub_02050F78: ; 0x02050F78 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3} - sub sp, sp, #4 - ldrsh r1, [sp, #8] - ldrsh r0, [sp, #0xc] - cmp r1, r0 - ldrgth r1, [sp, #0xe] - ldrgth r0, [sp, #0xc] - orrgt r0, r0, r1, lsl #16 - bgt _02050FE8 - ldrlth r1, [sp, #0xa] - ldrlth r0, [sp, #8] - orrlt r0, r0, r1, lsl #16 - blt _02050FE8 - ldrsh r1, [sp, #0xa] - ldrsh r0, [sp, #0xe] - cmp r1, r0 - ldrgth r1, [sp, #0xc] - ldrgth r0, [sp, #0xe] - strgth r1, [sp] - strgth r0, [sp, #2] - ldrleh r1, [sp, #8] - ldrleh r0, [sp, #0xa] - strleh r1, [sp] - strleh r0, [sp, #2] - ldrh r1, [sp, #2] - ldrh r0, [sp] - orr r0, r0, r1, lsl #16 -_02050FE8: - add sp, sp, #4 - ldmia sp!, {r3} - add sp, sp, #0x10 - bx lr - arm_func_end sub_02050F78 - - arm_func_start sub_02050FF8 -sub_02050FF8: ; 0x02050FF8 - stmdb sp!, {r3} - sub sp, sp, #4 - strh r0, [sp] - ldrh r0, [sp] - mov r1, #0 - strh r1, [sp, #2] - orr r0, r0, r1, lsl #16 - add sp, sp, #4 - ldmia sp!, {r3} - bx lr - arm_func_end sub_02050FF8 - - arm_func_start BinToDecFixedPoint -BinToDecFixedPoint: ; 0x02051020 - stmdb sp!, {r3} - sub sp, sp, #4 - ldr r2, [r0, #4] - mov r1, #0x3e8 - mov r0, r2, lsl #0x10 - mov r0, r0, lsr #0x10 - mul r1, r0, r1 - mov r2, r2, lsr #0x10 - mov r0, r1, lsr #0x10 - strh r2, [sp] - strh r0, [sp, #2] - ldrh r1, [sp, #2] - ldrh r0, [sp] - orr r0, r0, r1, lsl #16 - add sp, sp, #4 - ldmia sp!, {r3} - bx lr - arm_func_end BinToDecFixedPoint diff --git a/include/number_util.h b/include/number_util.h index e431e233..c0e9b1ea 100644 --- a/include/number_util.h +++ b/include/number_util.h @@ -3,6 +3,11 @@ #include "util.h" +struct fixed_point sub_02050EBC(struct fixed_point a, struct fixed_point b); +struct fixed_point SubFixedPoint(struct fixed_point a, struct fixed_point b); +struct fixed_point sub_02050F78(struct fixed_point a, struct fixed_point b); +struct fixed_point sub_02050FF8(s16 value); +struct fixed_point BinToDecFixedPoint(struct fixed_point_64 *val); s32 CeilFixedPoint(struct fixed_point val_fp); #endif //PMDSKY_NUMBER_UTIL_H diff --git a/src/number_util.c b/src/number_util.c index 95dfc4f0..78a66153 100644 --- a/src/number_util.c +++ b/src/number_util.c @@ -1,5 +1,67 @@ #include "number_util.h" +struct fixed_point sub_02050EBC(struct fixed_point a, struct fixed_point b) +{ + a.fractional += b.fractional; + a.integer += b.integer; + if (a.fractional >= 1000) + { + a.integer++; + a.fractional -= 1000; + } + return a; +} + +struct fixed_point SubFixedPoint(struct fixed_point a, struct fixed_point b) +{ + a.fractional -= b.fractional; + a.integer -= b.integer; + if (a.fractional < 0) + { + a.integer--; + a.fractional += 1000; + } + if (a.integer < 0) + { + a.fractional = 0; + a.integer = 0; + } + return a; +} + +struct fixed_point sub_02050F78(struct fixed_point a, struct fixed_point b) +{ + struct fixed_point result; + + if (a.integer > b.integer) + return b; + if (a.integer < b.integer) + return a; + + if (a.fractional > b.fractional) + result = b; + else + result = a; + + return result; +} + +struct fixed_point sub_02050FF8(s16 value) +{ + struct fixed_point result; + result.integer = value; + result.fractional = 0; + return result; +} + +struct fixed_point BinToDecFixedPoint(struct fixed_point_64 *val) +{ + struct fixed_point result; + result.integer = val->lower >> 16; + result.fractional = ((val->lower & 0xFFFF) * 1000) >> 16; + return result; +} + s32 CeilFixedPoint(struct fixed_point val_fp) { if (val_fp.integer == 0) From d387d4e2737b99d523dd7d23c73f2fd7004af266 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 6 Sep 2026 12:47:01 -0700 Subject: [PATCH 09/34] Decomp ActivateEndOfTurnEffects; monster::bide_move_id is a 2-byte enum move_id ActivateEndOfTurnEffects (0x0230FC24, 1235 instructions in US) is the per-turn status tick: the warp-scarf counter, the leader's belly and hunger messages, weather damage, Shed Skin and Hydration, the burn, poison, bad-poison, constriction, wrap, ingrain, curse and leech-seed damage countdowns, perish song and bide. It is the last of five functions in asm/overlay_29_0230F9A4.s and the next object in main.lsf is src/overlay_29_02311010.o, so extract_function.py merges rather than splits and main.lsf is unchanged. struct monster declared 0xAC as u8 bide_move_id plus u8 field_0xad. Retail accesses it with ldrh/strh and stores 0x165 = MOVE_BIDE_UNLEASH, which does not fit in a byte; enum move_id runs to 558, so -enum min sizes it to two bytes - the width struct move's own enum move_id id at 0x2 already has. The field becomes enum move_id and absorbs field_0xad. The struct size and every later offset are unchanged, no other source reads either member, and InitMove already takes enum move_id so no cast is needed. This deviates from pmdsky-debug's u8; the reasoning note linked from the PR has the evidence. The 29 callees that are still asm are declared extern in the .c with prototypes read off their own asm, as the sibling files do, and so are the 24 data symbols - const on the read-only rodata ones, which is what places their loads correctly. Region handling: the sound-effect guard in the hunger block is a genuine three-way fork, EU calling ov29_022E34A8_EU where JP omits the end_floor_no_death_check_flag test that US performs, and nine message ids are file-scope defines at US - 0x2C0 under JAPAN. The JP struct and dungeon offset shifts are absorbed by the headers with no directive. Locals are generic and declared at function scope. That is not cosmetic: the allocator's unit is the coalesced web, and the function-scope declaration list is the only thing that orders it, so the declaration order is what reproduces retail's register assignment. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/overlay_29_0230F9A4.inc | 79 +- asm/overlay_29_0230F9A4.s | 1356 --------------------------- include/dungeon_mode.h | 2 +- include/overlay_29_02311010.h | 1 + src/overlay_29_02311010.c | 639 +++++++++++++ 5 files changed, 645 insertions(+), 1432 deletions(-) diff --git a/asm/include/overlay_29_0230F9A4.inc b/asm/include/overlay_29_0230F9A4.inc index 69ecd822..23811b18 100644 --- a/asm/include/overlay_29_0230F9A4.inc +++ b/asm/include/overlay_29_0230F9A4.inc @@ -1,93 +1,22 @@ #pragma once .public AbilityIsActiveVeneer -.public ApplyDamageAndEffectsWrapper -.public BAD_POISON_DAMAGE_COOLDOWN -.public BAD_POISON_DAMAGE_TABLE -.public BAD_WEATHER_DAMAGE -.public BinToDecFixedPoint -.public BoostSpeedOneStage -.public BURN_DAMAGE -.public BURN_DAMAGE_COOLDOWN -.public CeilFixedPoint -.public CheckVariousStatuses2__02301244 -.public CheckVariousStatuses__023016DC -.public CONSTRICTION_DAMAGE -.public CURSE_DAMAGE_COOLDOWN -.public DisplayActions .public DUNGEON_PTR .public DungeonRandInt .public DungeonRandOutcome__022EAB20 -.public EndBurnClassStatus -.public EndMagnetRiseStatus -.public EndNegativeStatusCondition -.public EndNegativeStatusConditionWrapper -.public EnsureCanStandCurrentTile -.public EntityIsValid__02311010 .public ExclusiveItemEffectIsActive__0230F8AC -.public ExclusiveItemEffectIsActive__02311064 -.public ExclusiveItemEffectIsActiveWithLogging .public GenerateStandardItem -.public GetApparentWeather -.public GetTileAtEntity -.public GravityIsActive .public HasHeldItem -.public INGRAIN_BONUS_REGEN -.public INGRAIN_BONUS_REGEN_COOLDOWN -.public InitMove .public IqSkillIsEnabled -.public IsFloating -.public IsFloorOver .public IsMonster__0230F980 -.public IsTileGround -.public ItemIsActive__02311034 -.public LEECH_SEED_DAMAGE_COOLDOWN -.public LEECH_SEED_HP_DRAIN .public LogMessageByIdWithPopupCheckUser -.public MonsterCannotAttack -.public MonsterHasNegativeStatus -.public MonsterIsType -.public MultiplyFixedPoint64 -.public ov10_022C4454 -.public ov10_022C464C +.public SpawnDroppedItemWrapper +.public SubstitutePlaceholderStringTags +.public TreasureBoxDropsEnabled +.public TryGenerateUnownStoneDrop .public ov10_022C4650 -.public ov10_022C4664 -.public ov10_022C4A5C -.public ov10_022C4BBC .public ov10_022C4BE4 -.public ov10_022C4FC4 -.public ov29_022E34A8_EU -.public ov29_022E53F0 -.public ov29_022E543C -.public ov29_022EA370 -.public ov29_022EC62C -.public ov29_022F2FE4 -.public ov29_022F42F8 -.public ov29_022FB718 -.public ov29_02322374 .public ov29_02344B9C .public ov29_023460DC .public ov29_02347184 .public ov29_0234908C .public ov29_023529A8 -.public PlayEffectAnimationEntityStandard -.public PlaySeByIdIfNotSilence -.public POISON_DAMAGE -.public POISON_DAMAGE_COOLDOWN -.public SetPreprocessorArgsIdVal -.public SHED_SKIN_ACTIVATION_CHANCE -.public SpawnDroppedItemWrapper -.public SPEED_BOOST_TURNS -.public sub_02050FF8 -.public SubFixedPoint -.public SubstitutePlaceholderStringTags -.public TickStatusTurnCounter -.public TreasureBoxDropsEnabled -.public TryActivateBadDreams -.public TryEndPetrifiedOrSleepStatus -.public TryGenerateUnownStoneDrop -.public TryIncreaseHp -.public TryWarp -.public TryWeatherFormChange -.public WaitUntilAlertBoxTextIsLoadedWrapper -.public WRAP_DAMAGE -.public WRAP_DAMAGE_COOLDOWN diff --git a/asm/overlay_29_0230F9A4.s b/asm/overlay_29_0230F9A4.s index 4e023e79..b139e3de 100644 --- a/asm/overlay_29_0230F9A4.s +++ b/asm/overlay_29_0230F9A4.s @@ -195,1359 +195,3 @@ _0230FBB8: .align 2, 0 _0230FC20: .word ov10_022C4BE4 arm_func_end TickNoSlipCap - - arm_func_start ActivateEndOfTurnEffects -ActivateEndOfTurnEffects: ; 0x0230FC24 -#ifdef JAPAN -#define OV29_0230FC24_OFFSET -4 -#define OV29_0230FC24_OFFSET_2 -0xA4 -#define OV29_0230FC24_OFFSET_3 -1 -#else -#define OV29_0230FC24_OFFSET 0 -#define OV29_0230FC24_OFFSET_2 0 -#define OV29_0230FC24_OFFSET_3 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #0x34 - movs r5, r0 - beq _02310FF4 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r4, [r5, #0xb4] - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0x150 + OV29_0230FC24_OFFSET] - bl ov29_022FB718 - bl WaitUntilAlertBoxTextIsLoadedWrapper - mov r0, r5 - bl TryWeatherFormChange - mov r0, r5 - mov r1, #0x1d - bl ItemIsActive__02311034 - cmp r0, #0 - beq _0230FD0C - ldrb r0, [r4, #0x17c + OV29_0230FC24_OFFSET] - add r1, r0, #1 - and r0, r1, #0xff - cmp r0, #0x14 - strb r1, [r4, #0x17c + OV29_0230FC24_OFFSET] - movhs r0, #0x13 - strhsb r0, [r4, #0x17c + OV29_0230FC24_OFFSET] - mov r0, #0x64 - bl DungeonRandInt - ldrb r2, [r4, #0x17c + OV29_0230FC24_OFFSET] - ldr r1, _02310A6C ; =ov10_022C4BBC - mov r2, r2, lsl #1 - ldrsh r1, [r1, r2] - cmp r0, r1 - bge _0230FD0C - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0x17c + OV29_0230FC24_OFFSET] - bl ov29_022EC62C - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r2, #0 - mov r0, r5 - mov r1, r5 - mov r3, r2 - bl TryWarp - mov r0, r5 - bl ov29_022F42F8 -_0230FD0C: - ldrb r0, [r4, #7] - cmp r0, #0 - beq _0231013C - mov r0, r5 - mov r1, #0x1e - mov r7, #0xa - bl ItemIsActive__02311034 - cmp r0, #0 - movne r2, r7 - moveq r2, #0 - mov r0, r5 - mov r1, #0x26 - sub r7, r7, r2 - bl ItemIsActive__02311034 - cmp r0, #0 - movne r2, #1 - moveq r2, #0 - mov r0, r5 - mov r1, #0x10 - sub r7, r7, r2 - bl IqSkillIsEnabled - cmp r0, #0 - mov r0, r5 - mov r1, #0x22 - subne r7, r7, #1 - bl ItemIsActive__02311034 - cmp r0, #0 - movne r2, #1 - moveq r2, #0 - mov r0, r5 - mov r1, #0x11 - add r7, r7, r2 - bl ItemIsActive__02311034 - cmp r0, #0 - movne r2, #1 - moveq r2, #0 - mov r0, r5 - mov r1, #0x32 - add r7, r7, r2 - bl ItemIsActive__02311034 - cmp r0, #0 - movne r2, #1 - moveq r2, #0 - mov r0, r5 - mov r1, #0x59 - add r7, r7, r2 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - adds r7, r7, r0 - movmi r7, #0 - ldr r3, _02310A70 ; =0x0000199A - cmp r7, #0x13 - mov r6, #0 - ldr r2, _02310A74 ; =ov10_022C4FC4 - movgt r7, #0x13 - add r0, sp, #0x2c - add r1, sp, #0x24 - str r6, [sp, #0x24] - str r3, [sp, #0x28] - add r2, r2, r7, lsl #3 - bl MultiplyFixedPoint64 - ldrb r2, [r4, #0x15d + OV29_0230FC24_OFFSET] - cmp r2, #1 - ldrhi r0, _02310A78 ; =ov10_022C4A5C - ldrhi r1, [sp, #0x30] - ldrhi r0, [r0, r2, lsl #2] - addhi r0, r1, r0, lsl #16 - strhi r0, [sp, #0x30] - mov r0, #0 - strb r0, [r4, #0x15d + OV29_0230FC24_OFFSET] - add r0, r4, #0x100 - ldrh r2, [r0, #0x46 + OV29_0230FC24_OFFSET] - ldrh r1, [r0, #0x48 + OV29_0230FC24_OFFSET] - add r0, sp, #0x2c - strh r2, [sp, #0x20] - strh r1, [sp, #0x22] - bl BinToDecFixedPoint - strh r0, [sp, #0x14] - mov r0, r0, lsr #0x10 - add r1, r4, #0x100 - strh r0, [sp, #0x16] - ldrh r0, [r1, #0x46 + OV29_0230FC24_OFFSET] - sub r3, sp, #4 - ldrh r2, [sp, #0x14] - strh r0, [r3] - ldrh r0, [r1, #0x48 + OV29_0230FC24_OFFSET] - ldrh r1, [sp, #0x16] - strh r0, [r3, #2] - ldr r0, [r3] - strh r2, [r3] - strh r1, [r3, #2] - ldr r1, [r3] - bl SubFixedPoint - strh r0, [sp, #0x10] - mov r0, r0, lsr #0x10 - strh r0, [sp, #0x12] - ldrh r1, [sp, #0x10] - add r0, r4, #0x100 - ldrh r3, [sp, #0x12] - strh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - ldrh r2, [sp, #0x20] - strh r3, [r0, #0x48 + OV29_0230FC24_OFFSET] - sub r0, sp, #4 - ldrh r1, [sp, #0x22] - strh r2, [r0] - mov r6, #0 - strh r1, [r0, #2] - ldr r0, [r0] - mov r7, #1 - bl CeilFixedPoint - cmp r0, #0x14 - blt _0230FEFC - add r0, r4, #0x100 - ldrh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - sub r2, sp, #4 - strh r1, [r2] - ldrh r0, [r0, #0x48 + OV29_0230FC24_OFFSET] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0x14 - ldrlt r6, _02310A7C ; =0x00000DE6 -_0230FEFC: - ldrh r1, [sp, #0x20] - ldrh r0, [sp, #0x22] - sub r2, sp, #4 - strh r1, [r2] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0xa - blt _0230FF48 - add r0, r4, #0x100 - ldrh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - sub r2, sp, #4 - strh r1, [r2] - ldrh r0, [r0, #0x48 + OV29_0230FC24_OFFSET] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0xa - ldrlt r6, _02310A80 ; =0x00000DE7 -_0230FF48: - add r0, r4, #0x100 - ldrh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - sub r2, sp, #4 - strh r1, [r2] - ldrh r0, [r0, #0x48 + OV29_0230FC24_OFFSET] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0 - bne _0230FF98 - mov r0, #0 - bl sub_02050FF8 - strh r0, [sp, #0xc] - mov r0, r0, lsr #0x10 - strh r0, [sp, #0xe] - ldrh r2, [sp, #0xc] - add r0, r4, #0x100 - ldrh r1, [sp, #0xe] - strh r2, [r0, #0x46 + OV29_0230FC24_OFFSET] - strh r1, [r0, #0x48 + OV29_0230FC24_OFFSET] -_0230FF98: - add r0, r4, #0x100 - ldrh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - sub r2, sp, #4 - strh r1, [r2] - ldrh r0, [r0, #0x48 + OV29_0230FC24_OFFSET] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0 - bge _0230FFE8 - mov r0, #0 - bl sub_02050FF8 - strh r0, [sp, #8] - mov r0, r0, lsr #0x10 - strh r0, [sp, #0xa] - ldrh r2, [sp, #8] - add r0, r4, #0x100 - ldrh r1, [sp, #0xa] - strh r2, [r0, #0x46 + OV29_0230FC24_OFFSET] - strh r1, [r0, #0x48 + OV29_0230FC24_OFFSET] -_0230FFE8: - add r0, r4, #0x100 - ldrh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - sub r2, sp, #4 - strh r1, [r2] - ldrh r0, [r0, #0x48 + OV29_0230FC24_OFFSET] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0 - bne _023100D8 - bl ov29_022F2FE4 - mov r0, r5 - bl ov29_022EC62C - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r0, _02310A84 ; =DUNGEON_PTR - ldr r1, [r0] - ldrb r0, [r1, #0x799] - cmp r0, #0xa - addlo r0, r0, #1 - strlob r0, [r1, #0x799] - ldr r0, _02310A84 ; =DUNGEON_PTR - mov r1, r5 - ldr r0, [r0] - ldrb r0, [r0, #0x799] - cmp r0, #1 - ldreq r6, _02310A88 ; =0x00000DE8 - cmp r0, #2 - ldreq r6, _02310A8C ; =0x00000DE9 - moveq r7, #0 - cmp r0, #3 - mov r0, r5 - ldreq r6, _02310A90 ; =0x00000DEA - moveq r7, #0 - bl TryEndPetrifiedOrSleepStatus - mov r0, r5 - mov r1, #1 - mov r2, #0xe - mov r3, #0x250 - bl ApplyDamageAndEffectsWrapper - mov r0, #1 - strb r0, [r4, #0x150 + OV29_0230FC24_OFFSET] - add r0, r4, #0x100 - ldrh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - sub r2, sp, #4 - strh r1, [r2] - ldrh r0, [r0, #0x48 + OV29_0230FC24_OFFSET] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0 - movne r6, #0 - b _023100E8 -_023100D8: - ldr r0, _02310A84 ; =DUNGEON_PTR - mov r1, #0 - ldr r0, [r0] - strb r1, [r0, #0x799] -_023100E8: - cmp r6, #0 - beq _0231013C - cmp r7, #0 - beq _02310124 -#if defined(EUROPE) - mov r0, r5 - bl ov29_022E34A8_EU -#elif defined(JAPAN) - mov r0, r5 - bl EntityIsValid__02311010 -#else - ldr r0, _02310A84 ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #8] - cmp r0, #0 - bne _02310124 - mov r0, r5 - bl EntityIsValid__02311010 -#endif - cmp r0, #0 - beq _02310124 - ldr r0, _02310A94 ; =0x00001303 - bl PlaySeByIdIfNotSilence -_02310124: - mov r0, r5 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUser - mov r0, #0x1e - mov r1, #0x32 - bl ov29_022EA370 -_0231013C: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r0, _02310A84 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0xc000 - ldrb r0, [r0, #0xd5a + OV29_0230FC24_OFFSET_2] - cmp r0, #0 - bne _0231037C - mov r0, r5 - bl GetApparentWeather - cmp r0, #5 - mov r0, r5 - bne _023101FC - mov r1, #0x77 - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _02310360 - mov r0, r5 - mov r1, #0x4d - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _02310360 - mov r0, r5 - mov r1, #6 - bl MonsterIsType - cmp r0, #0 - bne _02310360 - ldr r3, _02310A98 ; =0x00000DBD - mov r6, #9 - mov r0, r5 - mov r1, r5 - mov r2, #1 - str r6, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - bne _02310360 - ldr r0, _02310A9C ; =BAD_WEATHER_DAMAGE - ldr r3, _02310AA0 ; =0x0000025F - ldrsh r1, [r0] - mov r0, r5 - mov r2, #0x12 - bl ApplyDamageAndEffectsWrapper - b _02310360 -_023101FC: - bl GetApparentWeather - cmp r0, #2 - mov r0, r5 - bne _02310298 - mov r1, #0x1d - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _02310360 - mov r0, r5 - mov r1, #9 - bl MonsterIsType - cmp r0, #0 - bne _02310360 - mov r0, r5 - mov r1, #0xd - bl MonsterIsType - cmp r0, #0 - bne _02310360 - mov r0, r5 - mov r1, #0x11 - bl MonsterIsType - cmp r0, #0 - bne _02310360 - ldr r3, _02310A98 ; =0x00000DBD - mov r6, #9 - mov r0, r5 - mov r1, r5 - mov r2, #1 - str r6, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - bne _02310360 - ldr r0, _02310A9C ; =BAD_WEATHER_DAMAGE - ldr r3, _02310AA0 ; =0x0000025F - ldrsh r1, [r0] - mov r0, r5 - mov r2, #0x12 - bl ApplyDamageAndEffectsWrapper - b _02310360 -_02310298: - bl GetApparentWeather - cmp r0, #1 - bne _02310360 - mov r0, r5 - mov r1, #0x5a - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _02310304 - ldr r3, _02310A98 ; =0x00000DBD - mov r6, #9 - mov r0, r5 - mov r1, r5 - mov r2, #1 - str r6, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - bne _02310360 - mov r0, #2 - mov r1, #0x5a - bl SetPreprocessorArgsIdVal - ldr r0, _02310A9C ; =BAD_WEATHER_DAMAGE - mov r2, #0x19 - ldrsh r1, [r0] - mov r0, r5 - rsb r3, r2, #0x278 - bl ApplyDamageAndEffectsWrapper - b _02310360 -_02310304: - mov r0, r5 - mov r1, #0x55 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _02310360 - ldr r3, _02310A98 ; =0x00000DBD - mov r6, #9 - mov r0, r5 - mov r1, r5 - mov r2, #1 - str r6, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - bne _02310360 - mov r0, #2 - mov r1, #0x55 - bl SetPreprocessorArgsIdVal - ldr r0, _02310A9C ; =BAD_WEATHER_DAMAGE - ldr r3, _02310AA0 ; =0x0000025F - ldrsh r1, [r0] - mov r0, r5 - mov r2, #0x1a - bl ApplyDamageAndEffectsWrapper -_02310360: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_0231037C: - mov r0, #0x64 - bl DungeonRandInt - mov r6, r0 - mov r0, r5 - mov r1, #0x21 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _023103F8 - ldr r0, _02310AA4 ; =SHED_SKIN_ACTIVATION_CHANCE - ldrsh r0, [r0] - cmp r6, r0 - bge _023103F8 - mov r0, r5 - mov r1, #0 - bl MonsterHasNegativeStatus - cmp r0, #0 - beq _023103F8 - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r0, r5 - mov r1, r5 - mov r2, #1 - mov r3, #0 - bl EndNegativeStatusConditionWrapper -_023103F8: - mov r0, r5 - mov r1, #0x51 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _02310474 - mov r0, r5 - bl GetApparentWeather - cmp r0, #4 - bne _02310474 - mov r0, r5 - mov r1, #0 - bl MonsterHasNegativeStatus - cmp r0, #0 - ldrneb r0, [r4, #0xc4] - cmpne r0, #3 - beq _02310474 - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r3, #0 - mov r0, r5 - mov r1, r5 - mov r2, #1 - str r3, [sp] - bl EndNegativeStatusCondition -_02310474: - mov r0, r5 - mov r1, #0xb - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _023104C0 - ldrb r1, [r4, #0x11f + OV29_0230FC24_OFFSET] - ldr r0, _02310AA8 ; =SPEED_BOOST_TURNS - add r2, r1, #1 - ldrsh r0, [r0] - and r1, r2, #0xff - strb r2, [r4, #0x11f + OV29_0230FC24_OFFSET] - cmp r1, r0 - blt _023104C0 - mov r3, #0 - mov r0, r5 - mov r1, r5 - mov r2, #0x7f - strb r3, [r4, #0x11f + OV29_0230FC24_OFFSET] - bl BoostSpeedOneStage -_023104C0: - ldrb r0, [r4, #0xbd] - cmp r0, #4 - bne _023104F8 - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r0, r5 - bl ov29_022E53F0 -_023104F8: - ldrb r0, [r4, #0xbf] - cmp r0, #1 - bne _02310590 - ldrb r0, [r4, #0xc1] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xc1] - ldrb r0, [r4, #0xc1] - cmp r0, #0 - bne _02310574 - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r1, _02310AAC ; =BURN_DAMAGE_COOLDOWN - mov r0, r5 - ldrsh r2, [r1] - mov r1, r5 - strb r2, [r4, #0xc1] - bl TryEndPetrifiedOrSleepStatus - ldr r0, _02310AB0 ; =BURN_DAMAGE - mov r2, #1 - ldrsh r1, [r0] - mov r0, r5 - rsb r3, r2, #0x248 - bl ApplyDamageAndEffectsWrapper -_02310574: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_02310590: - bl GravityIsActive - cmp r0, #0 - beq _023105DC - mov r0, r5 - bl IsFloating - cmp r0, #0 - beq _023105C0 - mov r0, r5 - mov r1, r5 - bl EndMagnetRiseStatus - mov r0, r5 - bl EnsureCanStandCurrentTile -_023105C0: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_023105DC: - mov r0, r5 - mov r1, #0x69 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _02310614 - mov r0, r5 - bl TryActivateBadDreams - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_02310614: - mov r0, r5 - bl GetTileAtEntity - bl IsTileGround - cmp r0, #0 - bne _023106A4 - ldrsh r2, [r4, #0x12] - ldrsh r1, [r4, #0x16] - ldr r0, _02310AB4 ; =0x000003E7 - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - ldrsh r0, [r4, #0x10] - cmp r0, r1 - bge _0231067C - mov r0, r5 - mov r1, #0x64 - bl ExclusiveItemEffectIsActive__02311064 - cmp r0, #0 - beq _0231067C - ldr r0, _02310AB8 ; =ov10_022C4664 - mov r3, #0 - ldrsh r2, [r0] - mov r0, r5 - mov r1, r5 - str r3, [sp] - bl TryIncreaseHp -_0231067C: - mov r0, r5 - mov r1, #0x65 - bl ExclusiveItemEffectIsActive__02311064 - cmp r0, #0 - beq _023106A4 - mov r2, #1 - mov r0, r5 - mov r1, r5 - mov r3, r2 - bl EndNegativeStatusConditionWrapper -_023106A4: - mov r0, r5 - mov r1, #0x5c - bl ExclusiveItemEffectIsActive__02311064 - cmp r0, #0 - beq _02310754 - mov sl, #0 - ldr r6, _02310A84 ; =DUNGEON_PTR - mov sb, sl - mov r7, #1 -_023106C8: - ldr r0, [r6] - add r0, r0, sb, lsl #2 - add r0, r0, #0x12000 - ldr r8, [r0, #0xb28 + OV29_0230FC24_OFFSET_2] - mov r0, r8 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310718 - ldr r0, [r8, #0xb4] - ldrb r0, [r0, #0xbf] - add r0, r0, #0xfe - and r0, r0, #0xff - cmp r0, #1 - bhi _02310718 - mov r0, r8 - bl ov29_022E543C - mov r0, r8 - mov r1, r8 - bl EndBurnClassStatus - mov sl, r7 -_02310718: - add r0, sb, #1 - mov r0, r0, lsl #0x10 - mov sb, r0, asr #0x10 - cmp sb, #4 - blt _023106C8 - cmp sl, #0 - beq _02310754 - ldr r0, _02310ABC ; =ov10_022C464C - mov r6, #1 - ldrsh r2, [r0] - mov r0, r5 - mov r1, r5 - mov r3, #0 - str r6, [sp] - bl TryIncreaseHp -_02310754: - ldrb r0, [r4, #0xbf] - cmp r0, #2 - bne _02310830 - ldrb r0, [r4, #0xc1] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xc1] - ldrb r0, [r4, #0xc1] - cmp r0, #0 - bne _02310810 - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - ldreqb r0, [r4, #0xbf] - cmpeq r0, #2 - bne _02310FF4 - ldr r1, _02310AC0 ; =POISON_DAMAGE_COOLDOWN - mov r0, r5 - ldrsh r2, [r1] - mov r1, r5 - strb r2, [r4, #0xc1] - bl TryEndPetrifiedOrSleepStatus - mov r0, r5 - mov r1, #0x72 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _023107F8 - ldr r0, _02310AC4 ; =POISON_DAMAGE - mov r6, #1 - ldrsh r2, [r0] - mov r0, r5 - mov r1, r5 - mov r3, #0 - str r6, [sp] - bl TryIncreaseHp - b _02310810 -_023107F8: - ldr r0, _02310AC4 ; =POISON_DAMAGE - mov r2, #3 - ldrsh r1, [r0] - mov r0, r5 - rsb r3, r2, #0x24c - bl ApplyDamageAndEffectsWrapper -_02310810: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - beq _0231092C - b _02310FF4 -_02310830: - cmp r0, #3 - bne _0231092C - ldrb r0, [r4, #0xc1] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xc1] - ldrb r0, [r4, #0xc1] - cmp r0, #0 - bne _02310910 - ldrb r6, [r4, #0xc2] - cmp r6, #0x1d - addlo r0, r6, #1 - strlob r0, [r4, #0xc2] - ldr r0, _02310AC8 ; =BAD_POISON_DAMAGE_COOLDOWN - cmp r6, #0x1d - ldrsh r0, [r0] - movge r6, #0x1d - cmp r6, #0 - strb r0, [r4, #0xc1] - mov r0, #0 - movlt r6, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - ldreqb r0, [r4, #0xbf] - cmpeq r0, #3 - bne _02310FF4 - mov r0, r5 - mov r1, r5 - bl TryEndPetrifiedOrSleepStatus - mov r0, r5 - mov r1, #0x72 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _023108F4 - ldr r0, _02310ACC ; =BAD_POISON_DAMAGE_TABLE - mov r1, r6, lsl #1 - ldrsh r2, [r0, r1] - mov r6, #1 - mov r0, r5 - mov r1, r5 - mov r3, #0 - str r6, [sp] - bl TryIncreaseHp - b _02310910 -_023108F4: - ldr r0, _02310ACC ; =BAD_POISON_DAMAGE_TABLE - mov r1, r6, lsl #1 - ldrsh r1, [r0, r1] - mov r2, #3 - mov r0, r5 - rsb r3, r2, #0x24c - bl ApplyDamageAndEffectsWrapper -_02310910: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_0231092C: - ldrb r0, [r4, #0xc4] - cmp r0, #7 - bne _023109D4 - ldrb r0, [r4, #0xcd] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xcd] - ldrb r0, [r4, #0xcd] - cmp r0, #0 - bne _023109B4 - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r1, _02310AD0 ; =ov10_022C4454 - mov r0, r5 - ldrsh r2, [r1] - mov r1, r5 - strb r2, [r4, #0xcd] - bl TryEndPetrifiedOrSleepStatus - ldr r1, [r4, #0xc8] - mov r0, r5 - bl PlayEffectAnimationEntityStandard - ldr r1, _02310AD4 ; =CONSTRICTION_DAMAGE - mov r0, r5 - ldrsh r1, [r1] - mov r2, #2 - mov r3, #0x248 - bl ApplyDamageAndEffectsWrapper -_023109B4: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - beq _02310B6C - b _02310FF4 -_023109D4: - cmp r0, #4 - bne _02310AF8 - ldrb r0, [r4, #0xcd] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xcd] - ldrb r0, [r4, #0xcd] - cmp r0, #0 - bne _02310A4C - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r1, _02310AD8 ; =WRAP_DAMAGE_COOLDOWN - mov r0, r5 - ldrsh r2, [r1] - mov r1, r5 - strb r2, [r4, #0xcd] - bl TryEndPetrifiedOrSleepStatus - ldr r0, _02310ADC ; =WRAP_DAMAGE - ldr r3, _02310AE0 ; =0x0000024A - ldrsh r1, [r0] - mov r0, r5 - mov r2, #5 - bl ApplyDamageAndEffectsWrapper -_02310A4C: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - beq _02310B6C - b _02310FF4 - .align 2, 0 -#ifdef JAPAN -#define OV29_0230FC24_DATA_OFFSET -0x2C0 -#else -#define OV29_0230FC24_DATA_OFFSET 0 -#endif -_02310A6C: .word ov10_022C4BBC -_02310A70: .word 0x0000199A -_02310A74: .word ov10_022C4FC4 -_02310A78: .word ov10_022C4A5C -_02310A7C: .word 0x00000DE6 + OV29_0230FC24_DATA_OFFSET -_02310A80: .word 0x00000DE7 + OV29_0230FC24_DATA_OFFSET -_02310A84: .word DUNGEON_PTR -_02310A88: .word 0x00000DE8 + OV29_0230FC24_DATA_OFFSET -_02310A8C: .word 0x00000DE9 + OV29_0230FC24_DATA_OFFSET -_02310A90: .word 0x00000DEA + OV29_0230FC24_DATA_OFFSET -_02310A94: .word 0x00001303 -_02310A98: .word 0x00000DBD + OV29_0230FC24_DATA_OFFSET -_02310A9C: .word BAD_WEATHER_DAMAGE -_02310AA0: .word 0x0000025F -_02310AA4: .word SHED_SKIN_ACTIVATION_CHANCE -_02310AA8: .word SPEED_BOOST_TURNS -_02310AAC: .word BURN_DAMAGE_COOLDOWN -_02310AB0: .word BURN_DAMAGE -_02310AB4: .word 0x000003E7 -_02310AB8: .word ov10_022C4664 -_02310ABC: .word ov10_022C464C -_02310AC0: .word POISON_DAMAGE_COOLDOWN -_02310AC4: .word POISON_DAMAGE -_02310AC8: .word BAD_POISON_DAMAGE_COOLDOWN -_02310ACC: .word BAD_POISON_DAMAGE_TABLE -_02310AD0: .word ov10_022C4454 -_02310AD4: .word CONSTRICTION_DAMAGE -_02310AD8: .word WRAP_DAMAGE_COOLDOWN -_02310ADC: .word WRAP_DAMAGE -_02310AE0: .word 0x0000024A -_02310AE4: .word INGRAIN_BONUS_REGEN_COOLDOWN -_02310AE8: .word INGRAIN_BONUS_REGEN -_02310AEC: .word CURSE_DAMAGE_COOLDOWN -_02310AF0: .word LEECH_SEED_DAMAGE_COOLDOWN -_02310AF4: .word LEECH_SEED_HP_DRAIN -_02310AF8: - cmp r0, #5 - bne _02310B6C - ldrb r0, [r4, #0xcd] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xcd] - ldrb r0, [r4, #0xcd] - cmp r0, #0 - bne _02310B6C - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r1, _02310AE4 ; =INGRAIN_BONUS_REGEN_COOLDOWN - ldr r0, _02310AE8 ; =INGRAIN_BONUS_REGEN - ldrsh r3, [r1] - ldrsh r2, [r0] - mov r0, r5 - mov r1, r5 - strb r3, [r4, #0xcd] - mov r6, #1 - mov r3, #0 - str r6, [sp] - bl TryIncreaseHp -_02310B6C: - ldrb r0, [r4, #0xd8] - cmp r0, #1 - bne _02310C28 - ldrb r0, [r4, #0xdc] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xdc] - ldrb r0, [r4, #0xdc] - cmp r0, #0 - bne _02310C0C - ldrsh r2, [r4, #0x12] - ldrsh r1, [r4, #0x16] - ldr r0, _02310AB4 ; =0x000003E7 - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - mov r0, r1, asr #1 - add r0, r1, r0, lsr #30 - ldr r1, _02310AEC ; =CURSE_DAMAGE_COOLDOWN - movs r6, r0, asr #2 - ldrsh r1, [r1] - mov r0, #0 - addeq r6, r6, #1 - strb r1, [r4, #0xdc] - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r0, r5 - mov r1, r5 - bl TryEndPetrifiedOrSleepStatus - mov r2, #7 - mov r0, r5 - mov r1, r6 - add r3, r2, #0x244 - bl ApplyDamageAndEffectsWrapper -_02310C0C: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_02310C28: - ldrb r0, [r4, #0xe0] - cmp r0, #1 - bne _02310DE0 - ldrb r0, [r4, #0xea] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xea] - ldrb r0, [r4, #0xea] - cmp r0, #0 - bne _02310DC4 - ldr r0, _02310A84 ; =DUNGEON_PTR - ldrb r2, [r4, #0xe8] - ldr r0, [r0] - ldr r1, _02310AF0 ; =LEECH_SEED_DAMAGE_COOLDOWN - add r0, r0, r2, lsl #2 - add r0, r0, #0x12000 - ldr r7, [r0, #0xb78 + OV29_0230FC24_OFFSET_2] - ldrsh r1, [r1] - ldr r0, _02310AF4 ; =LEECH_SEED_HP_DRAIN - cmp r7, #0 - ldrsh r6, [r0] - strb r1, [r4, #0xea] - moveq r0, #0 - streqb r0, [r4, #0xe0] - beq _02310DC4 - ldr r0, [r7, #0xb4] - ldr r1, [r4, #0xe4] - ldr r0, [r0, #0xb0] - cmp r1, r0 - movne r0, #0 - strneb r0, [r4, #0xe0] - bne _02310DC4 - cmp r7, r5 - beq _02310CF0 - cmp r7, #0 - moveq r0, #0 - beq _02310CD0 - ldr r0, [r7] - cmp r0, #1 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff -_02310CD0: - cmp r0, #0 - beq _02310CF0 - mov r0, r7 - mov r1, #0x53 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r8, #0 - bne _02310D00 -_02310CF0: - mov r0, r5 - mov r1, #0x3a - bl AbilityIsActiveVeneer - mov r8, r0 -_02310D00: - mov r0, r5 - bl ov29_022EC62C - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - mov r0, r7 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldrb r0, [r4, #0xc4] - cmp r0, #1 - beq _02310DC4 - mov r0, r5 - mov r1, r5 - bl TryEndPetrifiedOrSleepStatus - mov r0, r5 - mov r1, r6 - mov r2, #9 - mov r3, #0x24c - bl ApplyDamageAndEffectsWrapper - cmp r8, #0 - beq _02310D94 - mov r0, r7 - mov r1, r7 - bl TryEndPetrifiedOrSleepStatus - mov r2, #0xd - mov r0, r7 - mov r1, r6 - add r3, r2, #0x22c - bl ApplyDamageAndEffectsWrapper - b _02310DC4 -_02310D94: - mov r0, r5 - mov r1, #0x73 - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _02310DC4 - mov r8, #1 - mov r0, r7 - mov r1, r7 - mov r2, r6 - mov r3, #0 - str r8, [sp] - bl TryIncreaseHp -_02310DC4: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_02310DE0: - ldrb r0, [r4, #0x106 + OV29_0230FC24_OFFSET_3] - cmp r0, #0 - beq _02310E9C - add r0, r4, #6 + OV29_0230FC24_OFFSET_3 - add r0, r0, #0x100 - bl TickStatusTurnCounter - ldrb r0, [r4, #0x106 + OV29_0230FC24_OFFSET_3] - cmp r0, #0 - bne _02310E9C - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r1, r5 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r1, _02310FFC ; =0x00000DEB - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - mov r0, r5 - mov r1, r5 - bl TryEndPetrifiedOrSleepStatus - ldrb r0, [r4, #0xd5] - cmp r0, #7 - bne _02310E6C - ldr r1, _02311000 ; =0x00000DEC - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02310E80 -_02310E6C: - mov r2, #0xb - ldr r1, _02311004 ; =0x0000270F - mov r0, r5 - rsb r3, r2, #0x258 - bl ApplyDamageAndEffectsWrapper -_02310E80: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_02310E9C: - ldrb r0, [r4, #0xd2] - cmp r0, #1 - bne _02310F70 - add r0, r4, #0xd3 - bl TickStatusTurnCounter - ldrb r0, [r4, #0xd3] - cmp r0, #0 - bne _02310F70 - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0xd2] - bl CheckVariousStatuses2__02301244 - cmp r0, #0 - bne _02310F70 - mov r0, r5 - mov r1, #0 - bl MonsterCannotAttack - cmp r0, #0 - bne _02310F70 - mov r0, r5 - bl CheckVariousStatuses__023016DC - cmp r0, #0 - bne _02310F70 - mov r0, #0 - bl DisplayActions - ldrh r0, [r4, #0xac] - cmp r0, #0 - ldreq r0, _02311008 ; =0x00000165 - streqh r0, [r4, #0xac] - ldrh r1, [r4, #0xac] - add r0, sp, #0x18 - bl InitMove - mov r1, #0 - ldrb r0, [sp, #0x18] - add r6, sp, #0x18 - mov r2, r1 - orr r0, r0, #0x10 - strb r0, [sp, #0x18] - mov r0, r5 - mov r3, r1 - stmia sp, {r1, r6} - bl ov29_02322374 - mov r1, #0 - mov r0, r5 - strh r1, [r4, #0xac] - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r0, #0 - str r0, [r4, #0xb8] -_02310F70: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldrb r0, [r4, #0xd2] - cmp r0, #0xc - bne _02310FD0 - add r0, r4, #0xd3 - bl TickStatusTurnCounter - ldrb r0, [r4, #0xd3] - cmp r0, #0 - bne _02310FD0 - mov r0, #0 - strb r0, [r4, #0xd2] - mov r1, r5 - mov r2, r0 - strb r0, [r4, #0x154 + OV29_0230FC24_OFFSET] - bl SubstitutePlaceholderStringTags - ldr r1, _0231100C ; =0x00000CBA - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser -_02310FD0: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r0, r5 - bl TickNoSlipCap -_02310FF4: - add sp, sp, #0x34 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_02310FFC: .word 0x00000DEB + OV29_0230FC24_DATA_OFFSET -_02311000: .word 0x00000DEC + OV29_0230FC24_DATA_OFFSET -_02311004: .word 0x0000270F -_02311008: .word 0x00000165 -_0231100C: .word 0x00000CBA + OV29_0230FC24_DATA_OFFSET - arm_func_end ActivateEndOfTurnEffects diff --git a/include/dungeon_mode.h b/include/dungeon_mode.h index 9aada8db..5ff77a97 100644 --- a/include/dungeon_mode.h +++ b/include/dungeon_mode.h @@ -308,7 +308,7 @@ struct monster { // and restored to entity::types after statuses::roost ends. enum type_id original_types[2]; // 0xAC: The move id to be used if statuses::bide is 1. - s16 bide_move_id; + enum move_id bide_move_id; u8 field_0xae; u8 field_0xaf; // 0xB0: Unique number given to the monster when spawning to differentiate it from other diff --git a/include/overlay_29_02311010.h b/include/overlay_29_02311010.h index 16a43251..86eb4a0f 100644 --- a/include/overlay_29_02311010.h +++ b/include/overlay_29_02311010.h @@ -3,6 +3,7 @@ #include "dungeon_mode.h" +void ActivateEndOfTurnEffects(struct entity *entity); // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__02311010(struct entity *entity); // Checks if a monster is holding a certain item that isn't disabled by Klutz. diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index b7766ebd..0515cce5 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -3,6 +3,645 @@ #include "dungeon_pokemon_attributes.h" #include "dungeon_util_static.h" #include "exclusive_item.h" +#include "dg_random.h" +#include "dungeon_capabilities.h" +#include "dungeon_capabilities_1.h" +#include "dungeon_capabilities_3.h" +#include "dungeon_logic.h" +#include "dungeon_logic_3.h" +#include "dungeon_map_access_1.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_util_1.h" +#include "move_orb_effects.h" +#include "moves_1.h" +#include "number_util.h" +#include "overlay_29_022EAC7C.h" +#include "overlay_29_02318A4C.h" +#include "overlay_29_0233836C.h" +#include "overlay_29_0234B024.h" +#include "weather.h" + +#ifdef JAPAN +#define MESSAGE_DE6 0xB26 +#define MESSAGE_DE7 0xB27 +#define MESSAGE_DE8 0xB28 +#define MESSAGE_DE9 0xB29 +#define MESSAGE_DEA 0xB2A +#define MESSAGE_DBD 0xAFD +#define MESSAGE_DEB 0xB2B +#define MESSAGE_DEC 0xB2C +#define MESSAGE_CBA 0x9FA +#else +#define MESSAGE_DE6 0xDE6 +#define MESSAGE_DE7 0xDE7 +#define MESSAGE_DE8 0xDE8 +#define MESSAGE_DE9 0xDE9 +#define MESSAGE_DEA 0xDEA +#define MESSAGE_DBD 0xDBD +#define MESSAGE_DEB 0xDEB +#define MESSAGE_DEC 0xDEC +#define MESSAGE_CBA 0xCBA +#endif + + +#ifdef EUROPE +extern bool8 ov29_022E34A8_EU(struct entity *entity); +#endif + +extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); +extern s32 IsFloorOver(); +extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); +extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); +extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); +extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); +extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); +extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity, u32 param_3); +extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); +extern void EndNegativeStatusConditionWrapper(struct entity *user, struct entity *target, bool8 displayMessage, bool8 fromMove); +extern void ov29_022EA370(s32 a, s32 b); +extern s32 ov29_022F2FE4(); + +extern void WaitUntilAlertBoxTextIsLoadedWrapper(void); +extern u8 TickStatusTurnCounter(u8 *counter); +extern void EnsureCanStandCurrentTile(struct entity *entity); +extern void ov29_022E543C(struct entity *entity); +extern void ov29_022E53F0(struct entity *entity); +extern void PlayEffectAnimationEntityStandard(struct entity *entity, s32 anim_id); +extern void ov29_022F42F8(struct entity *entity); +extern void EndMagnetRiseStatus(struct entity *user, struct entity *target); +extern void TickNoSlipCap(struct entity *entity); +extern void EndBurnClassStatus(struct entity *user, struct entity *target); +extern void ov29_022EC62C(struct entity *entity); +extern void ov29_022FB718(struct entity *entity); +extern void TryActivateBadDreams(struct entity *entity); +extern void TryWeatherFormChange(struct entity *entity); +extern s32 EndNegativeStatusCondition(struct entity *user, struct entity *target, bool8 a, bool8 b, bool8 c); +extern s32 DisplayActions(s32 a); +extern s32 ov29_02322374(struct entity *entity, s32 a, s32 b, s32 c, s32 d, struct move *move); + +extern struct dungeon *DUNGEON_PTR; +extern const s16 ov10_022C4BBC[20]; +extern struct fixed_point_64 ov10_022C4FC4[]; +extern s32 ov10_022C4A5C[]; +extern const s16 BAD_WEATHER_DAMAGE; +extern const s16 SHED_SKIN_ACTIVATION_CHANCE; +extern const s16 SPEED_BOOST_TURNS; +extern const s16 BURN_DAMAGE_COOLDOWN; +extern const s16 BURN_DAMAGE; +extern const s16 ov10_022C4664; +extern const s16 ov10_022C464C; +extern const s16 POISON_DAMAGE_COOLDOWN; +extern const s16 POISON_DAMAGE; +extern const s16 BAD_POISON_DAMAGE_COOLDOWN; +extern const s16 BAD_POISON_DAMAGE_TABLE[30]; +extern const s16 ov10_022C4454; +extern const s16 CONSTRICTION_DAMAGE; +extern const s16 WRAP_DAMAGE_COOLDOWN; +extern const s16 WRAP_DAMAGE; +extern const s16 INGRAIN_BONUS_REGEN_COOLDOWN; +extern const s16 INGRAIN_BONUS_REGEN; +extern const s16 CURSE_DAMAGE_COOLDOWN; +extern const s16 LEECH_SEED_DAMAGE_COOLDOWN; +extern const s16 LEECH_SEED_HP_DRAIN; + +void ActivateEndOfTurnEffects(struct entity *entity) +{ + s32 v1; + s32 v2; + s32 v3; + struct fixed_point_64 f2; + struct fixed_point_64 f1; + struct fixed_point f3; + struct entity *e1; + s16 i; + struct monster *monster; + bool8 b1; + struct monster *mon1; + struct move mv; + + if (entity == NULL) + return; + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + monster = entity->info; + monster->famished = FALSE; + ov29_022FB718(entity); + WaitUntilAlertBoxTextIsLoadedWrapper(); + TryWeatherFormChange(entity); + if (ItemIsActive__02311034(entity, ITEM_WARP_SCARF)) { + monster->field_0x17c++; + if (monster->field_0x17c >= 20) + monster->field_0x17c = 19; + if (DungeonRandInt(100) < ov10_022C4BBC[monster->field_0x17c]) { + monster->field_0x17c = 0; + ov29_022EC62C(entity); + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + TryWarp(entity, entity, 0, 0); + ov29_022F42F8(entity); + } + } + if (monster->is_team_leader) { + v1 = 10; + v1 -= ItemIsActive__02311034(entity, ITEM_TIGHT_BELT) ? 10 : 0; + v1 -= ItemIsActive__02311034(entity, ITEM_STAMINA_BAND) != 0; + if (IqSkillIsEnabled(entity, IQ_ENERGY_SAVER)) + v1--; + v1 += ItemIsActive__02311034(entity, ITEM_DIET_RIBBON) != 0; + v1 += ItemIsActive__02311034(entity, ITEM_HEAL_RIBBON) != 0; + v1 += ItemIsActive__02311034(entity, ITEM_MUNCH_BELT) != 0; + v1 += AbilityIsActiveVeneer(entity, ABILITY_GLUTTONY) != 0; + if (v1 < 0) + v1 = 0; + if (v1 > 19) + v1 = 19; + f1.upper = 0; + f1.lower = 0x199A; + MultiplyFixedPoint64(&f2, &f1, &ov10_022C4FC4[v1]); + if (monster->rollout_hit_counter > 1) + f2.lower += ov10_022C4A5C[monster->rollout_hit_counter] << 16; + monster->rollout_hit_counter = 0; + f3 = monster->belly; + monster->belly = SubFixedPoint(monster->belly, BinToDecFixedPoint(&f2)); + v2 = 0; + v3 = 1; + if (CeilFixedPoint(f3) >= 20 && CeilFixedPoint(monster->belly) < 20) + v2 = MESSAGE_DE6; + if (CeilFixedPoint(f3) >= 10 && CeilFixedPoint(monster->belly) < 10) + v2 = MESSAGE_DE7; + if (CeilFixedPoint(monster->belly) == 0) + monster->belly = sub_02050FF8(0); + if (CeilFixedPoint(monster->belly) < 0) + monster->belly = sub_02050FF8(0); + if (CeilFixedPoint(monster->belly) == 0) { + ov29_022F2FE4(); + ov29_022EC62C(entity); + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + if (DUNGEON_PTR->leader_hunger_message_tracker < 10) + DUNGEON_PTR->leader_hunger_message_tracker++; + if (DUNGEON_PTR->leader_hunger_message_tracker == 1) + v2 = MESSAGE_DE8; + if (DUNGEON_PTR->leader_hunger_message_tracker == 2) { + v2 = MESSAGE_DE9; + v3 = 0; + } + if (DUNGEON_PTR->leader_hunger_message_tracker == 3) { + v2 = MESSAGE_DEA; + v3 = 0; + } + TryEndPetrifiedOrSleepStatus(entity, entity); + ApplyDamageAndEffectsWrapper(entity, 1, 0xE, 0x250); + monster->famished = TRUE; + if (CeilFixedPoint(monster->belly) != 0) + v2 = 0; + } else { + DUNGEON_PTR->leader_hunger_message_tracker = 0; + } + if (v2 != 0) { +#if defined(EUROPE) + if (v3 != 0 && ov29_022E34A8_EU(entity)) +#elif defined(JAPAN) + if (v3 != 0 && EntityIsValid__02311010(entity)) +#else + if (v3 != 0 && !DUNGEON_PTR->end_floor_no_death_check_flag && + EntityIsValid__02311010(entity)) +#endif + PlaySeByIdIfNotSilence(0x1303); + LogMessageByIdWithPopupCheckUser(entity, v2); + ov29_022EA370(0x1E, 0x32); + } + } + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + if (DUNGEON_PTR->weather.weather_damage_counter == 0) { + if (GetApparentWeather(entity) == WEATHER_HAIL) { + if (!AbilityIsActiveVeneer(entity, ABILITY_SNOW_CLOAK) && + !AbilityIsActiveVeneer(entity, ABILITY_ICE_BODY) && + !MonsterIsType(entity, TYPE_ICE) && + !ExclusiveItemEffectIsActiveWithLogging(entity, entity, TRUE, MESSAGE_DBD, + EXCLUSIVE_EFF_NO_WEATHER_DAMAGE)) { + ApplyDamageAndEffectsWrapper(entity, BAD_WEATHER_DAMAGE, 0x12, DAMAGE_SOURCE_WEATHER); + } + } else if (GetApparentWeather(entity) == WEATHER_SANDSTORM) { + if (!AbilityIsActiveVeneer(entity, ABILITY_SAND_VEIL) && + !MonsterIsType(entity, TYPE_GROUND) && + !MonsterIsType(entity, TYPE_ROCK) && + !MonsterIsType(entity, TYPE_STEEL) && + !ExclusiveItemEffectIsActiveWithLogging(entity, entity, TRUE, MESSAGE_DBD, + EXCLUSIVE_EFF_NO_WEATHER_DAMAGE)) { + ApplyDamageAndEffectsWrapper(entity, BAD_WEATHER_DAMAGE, 0x12, DAMAGE_SOURCE_WEATHER); + } + } else if (GetApparentWeather(entity) == WEATHER_SUNNY) { + if (AbilityIsActiveVeneer(entity, ABILITY_SOLAR_POWER)) { + if (!ExclusiveItemEffectIsActiveWithLogging(entity, entity, TRUE, MESSAGE_DBD, + EXCLUSIVE_EFF_NO_WEATHER_DAMAGE)) { + SetPreprocessorArgsIdVal(2, ABILITY_SOLAR_POWER); + ApplyDamageAndEffectsWrapper(entity, BAD_WEATHER_DAMAGE, 0x19, + DAMAGE_SOURCE_WEATHER); + } + } else if (AbilityIsActiveVeneer(entity, ABILITY_DRY_SKIN)) { + if (!ExclusiveItemEffectIsActiveWithLogging(entity, entity, TRUE, MESSAGE_DBD, + EXCLUSIVE_EFF_NO_WEATHER_DAMAGE)) { + SetPreprocessorArgsIdVal(2, ABILITY_DRY_SKIN); + ApplyDamageAndEffectsWrapper(entity, BAD_WEATHER_DAMAGE, 0x1A, + DAMAGE_SOURCE_WEATHER); + } + } + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + v1 = DungeonRandInt(100); + if (AbilityIsActiveVeneer(entity, ABILITY_SHED_SKIN) && + v1 < SHED_SKIN_ACTIVATION_CHANCE && + MonsterHasNegativeStatus(entity, FALSE)) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + EndNegativeStatusConditionWrapper(entity, entity, TRUE, FALSE); + } + if (AbilityIsActiveVeneer(entity, ABILITY_HYDRATION) && + GetApparentWeather(entity) == WEATHER_RAIN && + MonsterHasNegativeStatus(entity, FALSE) && + monster->frozen_class_status.freeze != STATUS_FROZEN_WRAP) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + EndNegativeStatusCondition(entity, entity, TRUE, FALSE, FALSE); + } + + if (AbilityIsActiveVeneer(entity, ABILITY_SPEED_BOOST)) { + monster->field_0x11f++; + if (monster->field_0x11f >= SPEED_BOOST_TURNS) { + monster->field_0x11f = 0; + BoostSpeedOneStage(entity, entity, 0x7f, FALSE); + } + } + + if (monster->sleep_class_status.sleep == STATUS_SLEEP_YAWNING) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + ov29_022E53F0(entity); + } + + if (monster->burn_class_status.burn == STATUS_BURN_BURN) { + if (monster->burn_class_status.burn_damage_countdown != 0) + monster->burn_class_status.burn_damage_countdown--; + if (monster->burn_class_status.burn_damage_countdown == 0) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + monster->burn_class_status.burn_damage_countdown = BURN_DAMAGE_COOLDOWN; + TryEndPetrifiedOrSleepStatus(entity, entity); + ApplyDamageAndEffectsWrapper(entity, BURN_DAMAGE, 1, 0x247); + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + + if (GravityIsActive()) { + if (IsFloating(entity)) { + EndMagnetRiseStatus(entity, entity); + EnsureCanStandCurrentTile(entity); + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + + if (AbilityIsActiveVeneer(entity, ABILITY_BAD_DREAMS)) { + TryActivateBadDreams(entity); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + + if (!IsTileGround(GetTileAtEntity(entity))) { + v1 = monster->max_hp_stat + monster->max_hp_boost; + if (v1 > 999) + v1 = 999; + if (monster->hp < v1 && + ExclusiveItemEffectIsActive__02311064(entity, EXCLUSIVE_EFF_RECOVER_HP_FROM_WATERY_TERRAIN)) { + TryIncreaseHp(entity, entity, ov10_022C4664, 0, FALSE); + } + if (ExclusiveItemEffectIsActive__02311064(entity, EXCLUSIVE_EFF_HEAL_STATUS_FROM_WATERY_TERRAIN)) + EndNegativeStatusConditionWrapper(entity, entity, TRUE, TRUE); + } + + if (ExclusiveItemEffectIsActive__02311064(entity, EXCLUSIVE_EFF_ABSORB_TEAMMATE_POISON)) { + b1 = FALSE; + for (i = 0; i < 4; i++) { + e1 = DUNGEON_PTR->monster_slot_ptrs[i]; + if (EntityIsValid__02311010(e1)) { + mon1 = e1->info; + if (mon1->burn_class_status.burn == STATUS_BURN_POISONED + || mon1->burn_class_status.burn == STATUS_BURN_BADLY_POISONED) { + ov29_022E543C(e1); + EndBurnClassStatus(e1, e1); + b1 = TRUE; + } + } + } + + if (b1) + TryIncreaseHp(entity, entity, ov10_022C464C, 0, TRUE); + } + + if (monster->burn_class_status.burn == STATUS_BURN_POISONED) { + if (monster->burn_class_status.burn_damage_countdown != 0) + monster->burn_class_status.burn_damage_countdown--; + + if (monster->burn_class_status.burn_damage_countdown == 0) { + DisplayActions(0); + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver() || monster->burn_class_status.burn != STATUS_BURN_POISONED) + return; + + monster->burn_class_status.burn_damage_countdown = POISON_DAMAGE_COOLDOWN; + TryEndPetrifiedOrSleepStatus(entity, entity); + + if (AbilityIsActiveVeneer(entity, ABILITY_POISON_HEAL)) + TryIncreaseHp(entity, entity, POISON_DAMAGE, 0, TRUE); + else + ApplyDamageAndEffectsWrapper(entity, POISON_DAMAGE, 3, DAMAGE_SOURCE_POISON); + } + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } else if (monster->burn_class_status.burn == STATUS_BURN_BADLY_POISONED) { + if (monster->burn_class_status.burn_damage_countdown != 0) + monster->burn_class_status.burn_damage_countdown--; + + if (monster->burn_class_status.burn_damage_countdown == 0) { + v1 = monster->burn_class_status.badly_poisoned_damage_count; + + if (monster->burn_class_status.badly_poisoned_damage_count < 0x1d) + monster->burn_class_status.badly_poisoned_damage_count++; + + monster->burn_class_status.burn_damage_countdown = BAD_POISON_DAMAGE_COOLDOWN; + + if (v1 >= 0x1d) + v1 = 0x1d; + if (v1 < 0) + v1 = 0; + + DisplayActions(0); + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver() || monster->burn_class_status.burn != STATUS_BURN_BADLY_POISONED) + return; + + TryEndPetrifiedOrSleepStatus(entity, entity); + + if (AbilityIsActiveVeneer(entity, ABILITY_POISON_HEAL)) + TryIncreaseHp(entity, entity, BAD_POISON_DAMAGE_TABLE[v1], 0, TRUE); + else + ApplyDamageAndEffectsWrapper(entity, BAD_POISON_DAMAGE_TABLE[v1], 3, + DAMAGE_SOURCE_POISON); + } + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + + if (monster->frozen_class_status.freeze == STATUS_FROZEN_CONSTRICTION) { + if (monster->frozen_class_status.freeze_damage_countdown != 0) + monster->frozen_class_status.freeze_damage_countdown--; + if (monster->frozen_class_status.freeze_damage_countdown == 0) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + monster->frozen_class_status.freeze_damage_countdown = ov10_022C4454; + TryEndPetrifiedOrSleepStatus(entity, entity); + PlayEffectAnimationEntityStandard(entity, monster->frozen_class_status.constriction_animation); + ApplyDamageAndEffectsWrapper(entity, CONSTRICTION_DAMAGE, 2, 0x248); + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } else if (monster->frozen_class_status.freeze == STATUS_FROZEN_WRAPPED) { + if (monster->frozen_class_status.freeze_damage_countdown != 0) + monster->frozen_class_status.freeze_damage_countdown--; + if (monster->frozen_class_status.freeze_damage_countdown == 0) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + monster->frozen_class_status.freeze_damage_countdown = WRAP_DAMAGE_COOLDOWN; + TryEndPetrifiedOrSleepStatus(entity, entity); + ApplyDamageAndEffectsWrapper(entity, WRAP_DAMAGE, 5, 0x24A); + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } else if (monster->frozen_class_status.freeze == STATUS_FROZEN_INGRAIN) { + if (monster->frozen_class_status.freeze_damage_countdown != 0) + monster->frozen_class_status.freeze_damage_countdown--; + if (monster->frozen_class_status.freeze_damage_countdown == 0) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + monster->frozen_class_status.freeze_damage_countdown = INGRAIN_BONUS_REGEN_COOLDOWN; + TryIncreaseHp(entity, entity, INGRAIN_BONUS_REGEN, 0, TRUE); + } + } + + if (monster->curse_class_status.curse == STATUS_CURSE_CURSED) + { + if (monster->curse_class_status.curse_damage_countdown != 0) + monster->curse_class_status.curse_damage_countdown--; + + if (monster->curse_class_status.curse_damage_countdown == 0) + { + v1 = monster->max_hp_stat + monster->max_hp_boost; + if (v1 > 999) + v1 = 999; + v2 = v1 / 4; + if (v2 == 0) + v2++; + + monster->curse_class_status.curse_damage_countdown = CURSE_DAMAGE_COOLDOWN; + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + + TryEndPetrifiedOrSleepStatus(entity, entity); + ApplyDamageAndEffectsWrapper(entity, v2, 7, 0x24B); + } + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + + if (monster->leech_seed_class_status.leech_seed == STATUS_LEECH_SEED_LEECH_SEED) + { + if (monster->leech_seed_class_status.leech_seed_damage_countdown != 0) + monster->leech_seed_class_status.leech_seed_damage_countdown--; + + if (monster->leech_seed_class_status.leech_seed_damage_countdown == 0) + { + e1 = DUNGEON_PTR->active_monster_ptrs[monster->leech_seed_class_status.leech_seed_source_monster_index]; + v2 = LEECH_SEED_DAMAGE_COOLDOWN; + v3 = LEECH_SEED_HP_DRAIN; + + monster->leech_seed_class_status.leech_seed_damage_countdown = v2; + if (e1 == NULL) + { + monster->leech_seed_class_status.leech_seed = STATUS_LEECH_SEED_NONE; + } + else if (monster->leech_seed_class_status.statuses_applier_id != GetEntInfo(e1)->unique_id) + { + monster->leech_seed_class_status.leech_seed = STATUS_LEECH_SEED_NONE; + } + else + { + if (e1 != entity && + (e1 == NULL ? FALSE : (bool8)(GetEntityType(e1) == ENTITY_MONSTER)) && + AbilityIsActiveVeneer(e1, ABILITY_MOLD_BREAKER)) + b1 = FALSE; + else + b1 = AbilityIsActiveVeneer(entity, ABILITY_LIQUID_OOZE); + + ov29_022EC62C(entity); + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (!EntityIsValid__02311010(e1)) + return; + if (IsFloorOver()) + return; + + if (monster->frozen_class_status.freeze != STATUS_FROZEN_FROZEN) + { + TryEndPetrifiedOrSleepStatus(entity, entity); + ApplyDamageAndEffectsWrapper(entity, v3, 9, 0x24C); + if (b1) + { + TryEndPetrifiedOrSleepStatus(e1, e1); + ApplyDamageAndEffectsWrapper(e1, v3, 0xD, 0x239); + } + else if (!AbilityIsActiveVeneer(entity, ABILITY_MAGIC_GUARD)) + { + TryIncreaseHp(e1, e1, v3, 0, TRUE); + } + } + } + } + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + + if (monster->perish_song_turns != 0) { + TickStatusTurnCounter(&monster->perish_song_turns); + if (monster->perish_song_turns == 0) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + SubstitutePlaceholderStringTags(1, entity, 0); + LogMessageByIdWithPopupCheckUser(entity, MESSAGE_DEB); + TryEndPetrifiedOrSleepStatus(entity, entity); + if (monster->reflect_class_status.reflect == STATUS_REFLECT_PROTECT) { + LogMessageByIdWithPopupCheckUser(entity, MESSAGE_DEC); + } else { + ApplyDamageAndEffectsWrapper(entity, 9999, 0xB, 0x24D); + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + } + if (monster->bide_class_status.bide == STATUS_TWO_TURN_BIDE) { + TickStatusTurnCounter(&monster->bide_class_status.bide_turns); + if (monster->bide_class_status.bide_turns == 0) { + monster->bide_class_status.bide = STATUS_TWO_TURN_NONE; + if (!CheckVariousStatuses2__02301244(entity, FALSE) && + !MonsterCannotAttack(entity, FALSE) && + !CheckVariousStatuses__023016DC(entity)) { + DisplayActions(0); + if (monster->bide_move_id == MOVE_NOTHING) + monster->bide_move_id = MOVE_BIDE_UNLEASH; + InitMove(&mv, monster->bide_move_id); + mv.flags0 |= MOVE_FLAG_LAST_USED; + ov29_02322374(entity, 0, 0, 0, 0, &mv); + monster->bide_move_id = MOVE_NOTHING; + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + monster->bide_damage_tally = 0; + } + } + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + if (monster->bide_class_status.bide == STATUS_TWO_TURN_ENRAGED) { + TickStatusTurnCounter(&monster->bide_class_status.bide_turns); + if (monster->bide_class_status.bide_turns == 0) { + monster->bide_class_status.bide = STATUS_TWO_TURN_NONE; + monster->using_charged_move = FALSE; + SubstitutePlaceholderStringTags(0, entity, 0); + LogMessageByIdWithPopupCheckUser(entity, MESSAGE_CBA); + } + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + TickNoSlipCap(entity); +} bool8 EntityIsValid__02311010(struct entity *entity) { From d814f8d017c15059c8b4feab42b2a3b82d99fd7b Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 6 Sep 2026 17:16:55 -0700 Subject: [PATCH 10/34] Decomp ApplyItemEffect; replace its stale extern with the new header ApplyItemEffect (0x0231B68C, 1310 instructions in US, 1312 in EU) is the thrown/eaten item dispatcher: an item-catcher preamble, the sticky-item block, and then one switch (item->id) over a 183-entry jump table with 85 distinct case bodies, a shared tail that walks APPLES_AND_BERRIES_ITEM_IDS, and EnemyEvolution. It is the last of ten functions in asm/overlay_29_0231B33C.s and the next object in main.lsf is src/overlay_29_0231CBC8.o, so extract_function.py merges rather than splits and main.lsf is unchanged. src/dungeon_projectile_throw.c declared ApplyItemEffect itself, with a live call site. That extern is removed and the file now includes the new header instead. It is a landed, already-matching object and parameters 1-3 are exactly where a wrong spelling would surface, so its rebuild in all three regions is a check on the signature rather than tidying. case ITEM_NOTHING is written explicitly above default even though the jump table sends id 0 there. The dispatch is cmp r0,#0 / addge pc,pc,r0,lsl #2 with no rebase, and a survey of all 786 such dispatches in asm/ shows MWCC's table spans the minimum to maximum LABELLED case: 104 of the 105 rebased tables have a real case at index 0, rebases occur for offsets as small as 3, yet 40 tables have 3-7 leading default entries un-rebased and 82 have trailing default entries, which padding cannot explain. Leading and trailing default entries are therefore explicit case labels sharing default's body. The category-5/10 test that skips the switch is an if/else whose else arm is the entire switch; both arms fall into the shared tail. Case emission order is source order and is not ascending (8 before 7, 77 before 74, 136 before 113, 182 before 104, default last). The 41 callees that are still asm are declared extern in the .c with prototypes read off their own asm, as the sibling files do, and so are the 28 rodata data symbols - const, with ov10_022C4864 as s32 where the other 25 scalars are s16, which is what makes its load a 32-bit ldr. Two prototypes deliberately differ from pmdsky-debug: ApplyKeyEffect takes one parameter, not two, and CalcDamageFixedNoCategory's fifth parameter points at a one-byte object, not a struct damage_data. Region handling: seven message ids are file-scope defines at US - 0x2C1 under JAPAN, and one EU-only call to ov29_022FB920 sits inside an ifdef EUROPE with its prototype. The JP fork of the exclusive_item_effect_flags offset needs nothing - the header already models the 4-byte JP struct monster shrink. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/overlay_29_0231B33C.inc | 100 +- asm/overlay_29_0231B33C.s | 1511 --------------------------- include/overlay_29_0231CBC8.h | 2 + src/dungeon_projectile_throw.c | 2 +- src/overlay_29_0231CBC8.c | 607 +++++++++++ 5 files changed, 614 insertions(+), 1608 deletions(-) diff --git a/asm/include/overlay_29_0231B33C.inc b/asm/include/overlay_29_0231B33C.inc index a1fadad6..cd8f2944 100644 --- a/asm/include/overlay_29_0231B33C.inc +++ b/asm/include/overlay_29_0231B33C.inc @@ -1,117 +1,25 @@ #pragma once .public AbilityIsActiveVeneer -.public AddHeldItemToBag .public AnimationDelayOrSomething -.public APPLES_AND_BERRIES_ITEM_IDS -.public ApplyBlastSeedEffect -.public ApplyCalciumEffect -.public ApplyCheriBerryEffect -.public ApplyDoughSeedEffect -.public ApplyGinsengEffect -.public ApplyGonePebbleEffect -.public ApplyGracideaEffect -.public ApplyGravelyrockEffect -.public ApplyGrimyFoodEffect -.public ApplyGummiBoostsDungeonMode -.public ApplyHungerSeedEffect -.public ApplyIronEffect -.public ApplyKeyEffect -.public ApplyMixElixirEffect -.public ApplyPechaBerryEffect -.public ApplyProteinEffect -.public ApplyRawstBerryEffect -.public ApplyViaSeedEffect -.public ApplyVileSeedEffect -.public ApplyViolentSeedEffect -.public ApplyZincEffect -.public BoostIQ .public BoostSpeedOneStage -.public CACNEA_SPIKE_POWER -.public CalcDamageFixedNoCategory -.public CALCIUM_STAT_BOOST -.public CalcStatusDuration -.public CheckVariousConditions__0230156C -.public CORSOLA_TWIG_POWER -.public DealDamageProjectile -.public DetermineMonsterShadow .public DUNGEON_PTR +.public DetermineMonsterShadow .public DungeonGetSpriteIndex -.public EndNegativeStatusConditionWrapper -.public EnemyEvolution -.public EntityIsValid__0231CBC8 -.public ExclusiveItemEffectFlagTest .public FemaleToMaleForm .public FreezeAnim -.public GEO_PEBBLE_DAMAGE .public GetActiveTeamMember .public GetIdleAnimationId -.public GetItemCategoryVeneer -.public GOLD_FANG_POWER -.public GOLD_THORN_POWER -.public GRAVELEROCK_DAMAGE -.public GUMMI_STAT_BOOST -.public InitMove -.public IqSkillIsEnabled -.public IRON_STAT_BOOST -.public IRON_THORN_POWER -.public IsBagFull .public IsShaymin .public IsSkyExclusiveDungeon -.public LevelUpItemEffect -.public LIFE_SEED_HP_BOOST -.public LogMessageByIdWithPopupCheckUserTarget -.public ORAN_BERRY_FULL_HP_BOOST -.public ORAN_BERRY_HP_RESTORATION -.public OREN_BERRY_DAMAGE -.public ov10_022C44EC -.public ov10_022C4558 -.public ov10_022C4574 +.public SetMonsterTypeAndAbility +.public SwapMonsterWanFileIndex +.public UnfreezeAnim .public ov10_022C457C -.public ov10_022C4864 .public ov29_022E3590 -.public ov29_022E5A00 -.public ov29_022E5AE4 .public ov29_022E60E4 .public ov29_022E81F8 .public ov29_022E9FD0 .public ov29_022EA370 -.public ov29_022F9EA0 -.public ov29_022FB920 -.public ov29_022FB9BC .public ov29_02304830 -.public ov29_0230F9A4 -.public PlaySeByIdIfNotSilence -.public PrepareItemForPrinting__02345728 -.public PROTEIN_STAT_BOOST -.public RARE_FOSSIL_DAMAGE -.public RestoreAllMovePP -.public SetMonsterTypeAndAbility -.public SILVER_SPIKE_POWER -.public SITRUS_BERRY_FULL_HP_BOOST -.public SITRUS_BERRY_HP_RESTORATION -.public SLEEP_TURN_RANGE -.public SpawnDroppedItemWrapper -.public STICK_POWER .public sub_020017EC .public sub_0201CF80 -.public SubstitutePlaceholderStringTags -.public SwapMonsterWanFileIndex -.public TryDecreaseLevel -.public TryIncreaseBelly -.public TryIncreaseHp -.public TryInflictBlinkerStatus -.public TryInflictConfusedStatus -.public TryInflictCrossEyedStatus -.public TryInflictDropeyeStatus -.public TryInflictEyedropStatus -.public TryInflictInvisibleStatus -.public TryInflictPetrifiedStatus -.public TryInflictSleeplessStatus -.public TryInflictSleepStatus -.public TryInflictSlipStatus -.public TryWarp -.public UnfreezeAnim -.public UpdateShopkeeperModeAfterAttack -.public WaitUntilAlertBoxPauseIsOver -.public WONDER_GUMMI_STAT_BOOST -.public ZINC_STAT_BOOST diff --git a/asm/overlay_29_0231B33C.s b/asm/overlay_29_0231B33C.s index 8596e6a1..dc22e1b7 100644 --- a/asm/overlay_29_0231B33C.s +++ b/asm/overlay_29_0231B33C.s @@ -285,1514 +285,3 @@ _0231B680: .word 0x00000216 _0231B684: .word 0x00000217 _0231B688: .word DUNGEON_PTR arm_func_end ChangeShayminForme - - arm_func_start ApplyItemEffect -ApplyItemEffect: ; 0x0231B68C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #0x5c - movs sb, r0 - mov sl, r2 - mov r8, r3 - ldr r7, [sp, #0x80] - ldr r6, [sp, #0x84] - beq _0231B840 - cmp r1, #0 - bne _0231B840 - mov r0, r7 - ldr r5, [r7, #0xb4] - mov r4, #0 - bl ov29_022FB9BC - cmp r0, #0 - beq _0231B6E4 - mov r0, r8 - mov r2, r6 - add r1, r7, #4 - mov r3, r4 - bl SpawnDroppedItemWrapper - b _0231CBA4 -_0231B6E4: - ldrb r0, [r5, #6] - cmp r0, #0 - ldrsh r0, [r6, #4] - beq _0231B74C - bl GetItemCategoryVeneer - cmp r0, #0 - beq _0231B720 - ldrsh r0, [r6, #4] - bl GetItemCategoryVeneer - cmp r0, #2 - beq _0231B720 - ldrsh r0, [r6, #4] - bl GetItemCategoryVeneer - cmp r0, #1 - movne r4, #1 -_0231B720: - ldrsh r0, [r6, #4] - bl GetItemCategoryVeneer - cmp r0, #4 - bne _0231B768 - ldrsh r1, [r6, #4] - cmp r1, #0x190 - blt _0231B768 - ldr r0, _0231C6C0 ; =0x000001AB - cmp r1, r0 - movle r4, #0 - b _0231B768 -_0231B74C: - bl GetItemCategoryVeneer - cmp r0, #2 - beq _0231B768 - mov r0, r7 - mov r1, #2 - bl IqSkillIsEnabled - mov r4, r0 -_0231B768: - mov r0, r7 - bl CheckVariousConditions__0230156C - cmp r0, #0 - movne r4, #0 - cmp r4, #0 - beq _0231B840 - ldrb r0, [r5, #0x62] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - bne _0231B840 - ldrb r0, [r5, #6] - cmp r0, #0 - bne _0231B7B0 - bl IsBagFull - cmp r0, #0 - bne _0231B840 -_0231B7B0: - ldrb r0, [r5, #9] - cmp r0, #1 - bne _0231B7D4 - mov r0, r8 - mov r2, r6 - add r1, r7, #4 - mov r3, #0 - bl SpawnDroppedItemWrapper - b _0231CBA4 -_0231B7D4: - ldr r0, _0231C6C4 ; =0x00001317 - bl PlaySeByIdIfNotSilence - mov r1, r6 - mov r0, #0 - bl PrepareItemForPrinting__02345728 - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231C6C8 ; =0x00000BE6 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - ldrh r0, [r6] - strh r0, [r5, #0x62] - ldrh r0, [r6, #2] - strh r0, [r5, #0x64] - ldrh r0, [r6, #4] - strh r0, [r5, #0x66] - ldrb r0, [r5, #6] - cmp r0, #0 - bne _0231B834 - mov r0, r5 - bl AddHeldItemToBag -_0231B834: - mov r0, r7 - bl ov29_022F9EA0 - b _0231CBA4 -_0231B840: - cmp sb, #0 - beq _0231B860 - mov r0, r7 - mov r1, r6 - bl ov29_022E5A00 - mov r0, r8 - mov r1, r7 - bl UpdateShopkeeperModeAfterAttack -_0231B860: - ldrb r0, [r6] - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _0231B8E4 - mov r1, r6 - mov r0, #0 - bl PrepareItemForPrinting__02345728 - ldr r2, _0231C6CC ; =0x00000BE7 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - cmp sb, #0 - beq _0231B8E4 - add r1, sp, #0x21 - ldr r0, _0231C6D0 ; =ov10_022C4574 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - mov r0, r8 - bl EnemyEvolution - b _0231CBA4 -_0231B8E4: - cmp sb, #0 - bne _0231B8F8 - mov r0, r7 - mov r1, r6 - bl ov29_022E5AE4 -_0231B8F8: - mov r0, r8 - mov r1, r6 - bl ov29_0230F9A4 - ldrsh r0, [r6, #4] - bl GetItemCategoryVeneer - cmp r0, #2 - bne _0231B92C - mov r3, #0 - mov r0, r8 - mov r1, r7 - mov r2, #5 - str r3, [sp] - bl TryIncreaseBelly -_0231B92C: - ldrsh r0, [r6, #4] - bl GetItemCategoryVeneer - cmp r0, #5 - beq _0231B94C - ldrsh r0, [r6, #4] - bl GetItemCategoryVeneer - cmp r0, #0xa - bne _0231B9A8 -_0231B94C: - cmp sb, #0 - beq _0231B994 - add r1, sp, #0x20 - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231B994: - ldr r2, _0231C6DC ; =0x00000BE8 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231B9A8: - ldrsh r0, [r6, #4] - cmp r0, #0x19c - bgt _0231BD6C - bge _0231CA60 - cmp r0, #0x194 - bgt _0231BD00 - bge _0231CA60 - cmp r0, #0x190 - bgt _0231BCD0 - bge _0231CA60 - cmp r0, #0xb6 - bgt _0231BCC0 - cmp r0, #0 - addge pc, pc, r0, lsl #2 - b _0231CABC -_0231B9E4: ; jump table - b _0231CABC ; case 0 - b _0231BE50 ; case 1 - b _0231BE88 ; case 2 - b _0231BEC0 ; case 3 - b _0231BEF8 ; case 4 - b _0231BF30 ; case 5 - b _0231BF68 ; case 6 - b _0231BFDC ; case 7 - b _0231BFA0 ; case 8 - b _0231C018 ; case 9 - b _0231C050 ; case 10 - b _0231CABC ; case 11 - b _0231CABC ; case 12 - b _0231CABC ; case 13 - b _0231CABC ; case 14 - b _0231CABC ; case 15 - b _0231CABC ; case 16 - b _0231CABC ; case 17 - b _0231CABC ; case 18 - b _0231CABC ; case 19 - b _0231CABC ; case 20 - b _0231CABC ; case 21 - b _0231CABC ; case 22 - b _0231CABC ; case 23 - b _0231CABC ; case 24 - b _0231CABC ; case 25 - b _0231CABC ; case 26 - b _0231CABC ; case 27 - b _0231CABC ; case 28 - b _0231CABC ; case 29 - b _0231CABC ; case 30 - b _0231CABC ; case 31 - b _0231CABC ; case 32 - b _0231CABC ; case 33 - b _0231CABC ; case 34 - b _0231CABC ; case 35 - b _0231CABC ; case 36 - b _0231CABC ; case 37 - b _0231CABC ; case 38 - b _0231CABC ; case 39 - b _0231CABC ; case 40 - b _0231CABC ; case 41 - b _0231CABC ; case 42 - b _0231CABC ; case 43 - b _0231CABC ; case 44 - b _0231CABC ; case 45 - b _0231CABC ; case 46 - b _0231CABC ; case 47 - b _0231CABC ; case 48 - b _0231CABC ; case 49 - b _0231CABC ; case 50 - b _0231CABC ; case 51 - b _0231CABC ; case 52 - b _0231CABC ; case 53 - b _0231CABC ; case 54 - b _0231CABC ; case 55 - b _0231CABC ; case 56 - b _0231CABC ; case 57 - b _0231CABC ; case 58 - b _0231CABC ; case 59 - b _0231CABC ; case 60 - b _0231CABC ; case 61 - b _0231CABC ; case 62 - b _0231CABC ; case 63 - b _0231CABC ; case 64 - b _0231CABC ; case 65 - b _0231CABC ; case 66 - b _0231CABC ; case 67 - b _0231CABC ; case 68 - b _0231C08C ; case 69 - b _0231C0A4 ; case 70 - b _0231C0CC ; case 71 - b _0231C15C ; case 72 - b _0231CABC ; case 73 - b _0231C118 ; case 74 - b _0231C210 ; case 75 - b _0231C130 ; case 76 - b _0231C0F4 ; case 77 - b _0231C248 ; case 78 - b _0231C258 ; case 79 - b _0231C144 ; case 80 - b _0231C194 ; case 81 - b _0231C184 ; case 82 - b _0231C16C ; case 83 - b _0231C1BC ; case 84 - b _0231C234 ; case 85 - b _0231C1A4 ; case 86 - b _0231C278 ; case 87 - b _0231C268 ; case 88 - b _0231C1F4 ; case 89 - b _0231C1E4 ; case 90 - b _0231C224 ; case 91 - b _0231C304 ; case 92 - b _0231C31C ; case 93 - b _0231C338 ; case 94 - b _0231C348 ; case 95 - b _0231C360 ; case 96 - b _0231C370 ; case 97 - b _0231CABC ; case 98 - b _0231C28C ; case 99 - b _0231C2A4 ; case 100 - b _0231C2BC ; case 101 - b _0231C2D4 ; case 102 - b _0231C380 ; case 103 - b _0231C6B0 ; case 104 - b _0231CABC ; case 105 - b _0231C768 ; case 106 - b _0231C7A0 ; case 107 - b _0231C2EC ; case 108 - b _0231C394 ; case 109 - b _0231C3B4 ; case 110 - b _0231C3F4 ; case 111 - b _0231C3D4 ; case 112 - b _0231C5FC ; case 113 - b _0231C61C ; case 114 - b _0231C63C ; case 115 - b _0231C7B0 ; case 116 - b _0231C7C0 ; case 117 - b _0231C7FC ; case 118 - b _0231C404 ; case 119 - b _0231C420 ; case 120 - b _0231C43C ; case 121 - b _0231C458 ; case 122 - b _0231C474 ; case 123 - b _0231C490 ; case 124 - b _0231C4AC ; case 125 - b _0231C4C8 ; case 126 - b _0231C4E4 ; case 127 - b _0231C500 ; case 128 - b _0231C51C ; case 129 - b _0231C538 ; case 130 - b _0231C554 ; case 131 - b _0231C570 ; case 132 - b _0231C58C ; case 133 - b _0231C5A8 ; case 134 - b _0231C5C4 ; case 135 - b _0231C5E0 ; case 136 - b _0231C80C ; case 137 - b _0231CABC ; case 138 - b _0231CABC ; case 139 - b _0231CABC ; case 140 - b _0231CABC ; case 141 - b _0231CABC ; case 142 - b _0231CABC ; case 143 - b _0231CABC ; case 144 - b _0231CABC ; case 145 - b _0231CABC ; case 146 - b _0231CABC ; case 147 - b _0231CABC ; case 148 - b _0231CABC ; case 149 - b _0231CABC ; case 150 - b _0231CABC ; case 151 - b _0231CABC ; case 152 - b _0231CABC ; case 153 - b _0231CABC ; case 154 - b _0231CABC ; case 155 - b _0231CABC ; case 156 - b _0231CABC ; case 157 - b _0231CABC ; case 158 - b _0231CABC ; case 159 - b _0231CABC ; case 160 - b _0231CABC ; case 161 - b _0231CABC ; case 162 - b _0231CABC ; case 163 - b _0231CABC ; case 164 - b _0231CABC ; case 165 - b _0231CABC ; case 166 - b _0231C81C ; case 167 - b _0231C82C ; case 168 - b _0231C844 ; case 169 - b _0231C8B0 ; case 170 - b _0231C91C ; case 171 - b _0231C988 ; case 172 - b _0231CABC ; case 173 - b _0231CABC ; case 174 - b _0231CABC ; case 175 - b _0231CABC ; case 176 - b _0231CABC ; case 177 - b _0231CABC ; case 178 - b _0231CA50 ; case 179 - b _0231C9F4 ; case 180 - b _0231CABC ; case 181 - b _0231C65C ; case 182 -_0231BCC0: - ldr r1, _0231C6E0 ; =0x0000016B - cmp r0, r1 - beq _0231CB14 - b _0231CABC -_0231BCD0: - ldr r1, _0231C6E4 ; =0x00000192 - cmp r0, r1 - bgt _0231BCF0 - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BCF0: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BD00: - cmp r0, #0x198 - bgt _0231BD3C - bge _0231CA60 - ldr r1, _0231C6E8 ; =0x00000196 - cmp r0, r1 - bgt _0231BD2C - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BD2C: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BD3C: - ldr r1, _0231C6EC ; =0x0000019A - cmp r0, r1 - bgt _0231BD5C - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BD5C: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BD6C: - cmp r0, #0x1a4 - bgt _0231BDE4 - bge _0231CA60 - cmp r0, #0x1a0 - bgt _0231BDB4 - bge _0231CA60 - ldr r1, _0231C6F0 ; =0x0000019E - cmp r0, r1 - bgt _0231BDA4 - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BDA4: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BDB4: - ldr r1, _0231C6F4 ; =0x000001A2 - cmp r0, r1 - bgt _0231BDD4 - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BDD4: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BDE4: - cmp r0, #0x1a8 - bgt _0231BE20 - bge _0231CA60 - ldr r1, _0231C6F8 ; =0x000001A6 - cmp r0, r1 - bgt _0231BE10 - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BE10: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BE20: - ldr r1, _0231C6FC ; =0x000001AA - cmp r0, r1 - bgt _0231BE40 - bge _0231CA60 - sub r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BE40: - add r1, r1, #1 - cmp r0, r1 - beq _0231CA60 - b _0231CABC -_0231BE50: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x52 - bl InitMove - ldr r0, _0231C704 ; =STICK_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #1 - add r2, sp, #0x52 - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231BE88: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x4a - bl InitMove - ldr r0, _0231C708 ; =IRON_THORN_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #2 - add r2, sp, #0x4a - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231BEC0: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x42 - bl InitMove - ldr r0, _0231C70C ; =SILVER_SPIKE_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #3 - add r2, sp, #0x42 - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231BEF8: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x3a - bl InitMove - ldr r0, _0231C710 ; =GOLD_FANG_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #4 - add r2, sp, #0x3a - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231BF30: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x32 - bl InitMove - ldr r0, _0231C714 ; =CACNEA_SPIKE_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #5 - add r2, sp, #0x32 - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231BF68: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x2a - bl InitMove - ldr r0, _0231C718 ; =CORSOLA_TWIG_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #6 - add r2, sp, #0x2a - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231BFA0: - mov r4, #0 - str r4, [sp] - ldr r0, _0231C71C ; =GEO_PEBBLE_DAMAGE - ldr r1, _0231C720 ; =0x0000024F - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - ldrsh r2, [r0] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231BFDC: - mov r4, #0 - str r4, [sp] - ldr r0, _0231C724 ; =GRAVELEROCK_DAMAGE - ldr r1, _0231C720 ; =0x0000024F - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - ldrsh r2, [r0] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C018: - ldr r1, _0231C700 ; =0x00000195 - add r0, sp, #0x22 - bl InitMove - ldr r0, _0231C728 ; =GOLD_THORN_POWER - mov r4, #0x100 - ldrsh r3, [r0] - str r4, [sp] - mov r4, #9 - add r2, sp, #0x22 - mov r0, r8 - mov r1, r7 - str r4, [sp, #4] - bl DealDamageProjectile - b _0231CB14 -_0231C050: - mov r4, #0 - str r4, [sp] - ldr r0, _0231C72C ; =RARE_FOSSIL_DAMAGE - ldr r1, _0231C720 ; =0x0000024F - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - ldrsh r2, [r0] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C08C: - mov r0, r8 - mov r1, r7 - mov r3, sl - mov r2, #1 - bl EndNegativeStatusConditionWrapper - b _0231CB14 -_0231C0A4: - ldr r1, _0231C730 ; =ORAN_BERRY_HP_RESTORATION - ldr r0, _0231C734 ; =ORAN_BERRY_FULL_HP_BOOST - ldrsh r2, [r1] - ldrsh r3, [r0] - mov r4, #1 - mov r0, r8 - mov r1, r7 - str r4, [sp] - bl TryIncreaseHp - b _0231CB14 -_0231C0CC: - ldr r1, _0231C738 ; =SITRUS_BERRY_HP_RESTORATION - ldr r0, _0231C73C ; =SITRUS_BERRY_FULL_HP_BOOST - ldrsh r2, [r1] - ldrsh r3, [r0] - mov r4, #1 - mov r0, r8 - mov r1, r7 - str r4, [sp] - bl TryIncreaseHp - b _0231CB14 -_0231C0F4: - ldr r0, _0231C740 ; =LIFE_SEED_HP_BOOST - mov r4, #1 - ldrsh r3, [r0] - mov r0, r8 - mov r1, r7 - mov r2, #0 - str r4, [sp] - bl TryIncreaseHp - b _0231CB14 -_0231C118: - mov r2, #0 - mov r0, r8 - mov r1, r7 - mov r3, r2 - bl TryInflictBlinkerStatus - b _0231CB14 -_0231C130: - mov r0, r8 - mov r1, r7 - mov r2, #0 - bl TryInflictCrossEyedStatus - b _0231CB14 -_0231C144: - mov r0, r8 - mov r1, r7 - mov r2, #0 - mov r3, #1 - bl BoostSpeedOneStage - b _0231CB14 -_0231C15C: - mov r0, r8 - mov r1, r7 - bl TryInflictEyedropStatus - b _0231CB14 -_0231C16C: - mov r0, r8 - mov r1, r7 - mov r2, #1 - mov r3, #0 - bl TryInflictConfusedStatus - b _0231CB14 -_0231C184: - mov r0, r8 - mov r1, r7 - bl ApplyCheriBerryEffect - b _0231CB14 -_0231C194: - mov r0, r8 - mov r1, r7 - bl ApplyPechaBerryEffect - b _0231CB14 -_0231C1A4: - mov r2, #0 - mov r0, r8 - mov r1, r7 - mov r3, r2 - bl TryWarp - b _0231CB14 -_0231C1BC: - ldr r1, _0231C744 ; =SLEEP_TURN_RANGE - mov r0, r7 - mov r2, #1 - bl CalcStatusDuration - mov r2, r0 - mov r0, r8 - mov r1, r7 - mov r3, #1 - bl TryInflictSleepStatus - b _0231CB14 -_0231C1E4: - mov r0, r8 - mov r1, r7 - bl TryInflictSleeplessStatus - b _0231CB14 -_0231C1F4: - mov r2, #1 - mov r0, r8 - mov r1, r7 - mov r3, r2 - str r2, [sp] - bl LevelUpItemEffect - b _0231CB14 -_0231C210: - mov r0, r8 - mov r1, r7 - mov r2, #1 - bl TryDecreaseLevel - b _0231CB14 -_0231C224: - mov r0, r8 - mov r1, r7 - bl TryInflictPetrifiedStatus - b _0231CB14 -_0231C234: - ldr r2, _0231C748 ; =0x00000BE9 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231C248: - mov r0, r8 - mov r1, r7 - bl ApplyRawstBerryEffect - b _0231CB14 -_0231C258: - mov r0, r8 - mov r1, r7 - bl ApplyHungerSeedEffect - b _0231CB14 -_0231C268: - mov r0, r8 - mov r1, r7 - bl ApplyGinsengEffect - b _0231CB14 -_0231C278: - mov r0, r8 - mov r1, r7 - mov r2, sb - bl ApplyBlastSeedEffect - b _0231CB14 -_0231C28C: - ldr r2, _0231C74C ; =0x000003E7 - mov r0, r8 - mov r1, r7 - mov r3, #0 - bl RestoreAllMovePP - b _0231CB14 -_0231C2A4: - ldr r1, _0231C750 ; =PROTEIN_STAT_BOOST - mov r0, r8 - ldrsh r2, [r1] - mov r1, r7 - bl ApplyProteinEffect - b _0231CB14 -_0231C2BC: - ldr r1, _0231C754 ; =CALCIUM_STAT_BOOST - mov r0, r8 - ldrsh r2, [r1] - mov r1, r7 - bl ApplyCalciumEffect - b _0231CB14 -_0231C2D4: - ldr r1, _0231C758 ; =IRON_STAT_BOOST - mov r0, r8 - ldrsh r2, [r1] - mov r1, r7 - bl ApplyIronEffect - b _0231CB14 -_0231C2EC: - ldr r1, _0231C75C ; =ZINC_STAT_BOOST - mov r0, r8 - ldrsh r2, [r1] - mov r1, r7 - bl ApplyZincEffect - b _0231CB14 -_0231C304: - mov r0, r8 - mov r1, r7 - mov r2, #1 - mov r3, #0 - bl EndNegativeStatusConditionWrapper - b _0231CB14 -_0231C31C: - mov r3, #1 - mov r0, r8 - mov r1, r7 - mov r2, #5 - str r3, [sp] - bl LevelUpItemEffect - b _0231CB14 -_0231C338: - mov r0, r8 - mov r1, r7 - bl ApplyVileSeedEffect - b _0231CB14 -_0231C348: - mov r0, r8 - mov r1, r7 - mov r2, #4 - mov r3, #0 - bl TryWarp - b _0231CB14 -_0231C360: - mov r0, r8 - mov r1, r7 - bl ApplyViolentSeedEffect - b _0231CB14 -_0231C370: - mov r0, r8 - mov r1, r7 - bl TryInflictInvisibleStatus - b _0231CB14 -_0231C380: - mov r0, r7 - mov r1, #0xa - mov r2, #0 - bl BoostIQ - b _0231CB14 -_0231C394: - mov r4, #1 - mov r0, r8 - mov r1, r7 - mov r2, #0x32 - mov r3, #5 - str r4, [sp] - bl TryIncreaseBelly - b _0231CB14 -_0231C3B4: - mov r4, #1 - mov r0, r8 - mov r1, r7 - mov r2, #0x64 - mov r3, #0xa - str r4, [sp] - bl TryIncreaseBelly - b _0231CB14 -_0231C3D4: - mov r4, #1 - mov r0, r8 - mov r1, r7 - rsb r2, r4, #0x3e8 - mov r3, #0xa - str r4, [sp] - bl TryIncreaseBelly - b _0231CB14 -_0231C3F4: - mov r0, r8 - mov r1, r7 - bl ApplyGrimyFoodEffect - b _0231CB14 -_0231C404: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #1 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C420: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #2 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C43C: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #3 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C458: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #4 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C474: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #5 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C490: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #6 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C4AC: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #7 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C4C8: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #8 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C4E4: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #9 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C500: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xa - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C51C: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xb - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C538: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xc - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C554: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xd - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C570: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xe - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C58C: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xf - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C5A8: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0x10 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C5C4: - ldr r1, _0231C760 ; =GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0x11 - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C5E0: - ldr r1, _0231C764 ; =WONDER_GUMMI_STAT_BOOST - mov r0, r8 - ldrsh r3, [r1] - mov r1, r7 - mov r2, #0xff - bl ApplyGummiBoostsDungeonMode - b _0231CB14 -_0231C5FC: - mov r4, #1 - mov r0, r8 - mov r1, r7 - mov r2, #0x32 - mov r3, #5 - str r4, [sp] - bl TryIncreaseBelly - b _0231CB14 -_0231C61C: - mov r4, #1 - mov r0, r8 - mov r1, r7 - mov r2, #0xa - mov r3, #0 - str r4, [sp] - bl TryIncreaseBelly - b _0231CB14 -_0231C63C: - mov r4, #1 - mov r0, r8 - mov r1, r7 - rsb r2, r4, #0x3e8 - mov r3, #0x32 - str r4, [sp] - bl TryIncreaseBelly - b _0231CB14 -_0231C65C: - cmp sb, #0 - beq _0231C6A4 - add r1, sp, #0x1f - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C6A4: - mov r0, r8 - bl ApplyKeyEffect - b _0231CB14 -_0231C6B0: - mov r0, r8 - mov r1, r7 - bl TryInflictDropeyeStatus - b _0231CB14 - .align 2, 0 -#ifdef JAPAN -#define APPLY_ITEM_EFFECT_OFFSET -0x2C1 -#else -#define APPLY_ITEM_EFFECT_OFFSET 0 -#endif -_0231C6C0: .word 0x000001AB -_0231C6C4: .word 0x00001317 -_0231C6C8: .word 0x00000BE6 + APPLY_ITEM_EFFECT_OFFSET -_0231C6CC: .word 0x00000BE7 + APPLY_ITEM_EFFECT_OFFSET -_0231C6D0: .word ov10_022C4574 -_0231C6D4: .word 0x00000256 -_0231C6D8: .word ov10_022C4558 -_0231C6DC: .word 0x00000BE8 + APPLY_ITEM_EFFECT_OFFSET -_0231C6E0: .word 0x0000016B -_0231C6E4: .word 0x00000192 -_0231C6E8: .word 0x00000196 -_0231C6EC: .word 0x0000019A -_0231C6F0: .word 0x0000019E -_0231C6F4: .word 0x000001A2 -_0231C6F8: .word 0x000001A6 -_0231C6FC: .word 0x000001AA -_0231C700: .word 0x00000195 -_0231C704: .word STICK_POWER -_0231C708: .word IRON_THORN_POWER -_0231C70C: .word SILVER_SPIKE_POWER -_0231C710: .word GOLD_FANG_POWER -_0231C714: .word CACNEA_SPIKE_POWER -_0231C718: .word CORSOLA_TWIG_POWER -_0231C71C: .word GEO_PEBBLE_DAMAGE -_0231C720: .word 0x0000024F -_0231C724: .word GRAVELEROCK_DAMAGE -_0231C728: .word GOLD_THORN_POWER -_0231C72C: .word RARE_FOSSIL_DAMAGE -_0231C730: .word ORAN_BERRY_HP_RESTORATION -_0231C734: .word ORAN_BERRY_FULL_HP_BOOST -_0231C738: .word SITRUS_BERRY_HP_RESTORATION -_0231C73C: .word SITRUS_BERRY_FULL_HP_BOOST -_0231C740: .word LIFE_SEED_HP_BOOST -_0231C744: .word SLEEP_TURN_RANGE -_0231C748: .word 0x00000BE9 + APPLY_ITEM_EFFECT_OFFSET -_0231C74C: .word 0x000003E7 -_0231C750: .word PROTEIN_STAT_BOOST -_0231C754: .word CALCIUM_STAT_BOOST -_0231C758: .word IRON_STAT_BOOST -_0231C75C: .word ZINC_STAT_BOOST -_0231C760: .word GUMMI_STAT_BOOST -_0231C764: .word WONDER_GUMMI_STAT_BOOST -_0231C768: - mov r0, r8 - mov r1, r7 - bl TryInflictSlipStatus - cmp r0, #0 - bne _0231CB14 - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231CBAC ; =0x00000C75 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231C7A0: - mov r0, r8 - mov r1, r7 - bl ApplyViaSeedEffect - b _0231CB14 -_0231C7B0: - mov r0, r8 - mov r1, r7 - bl ApplyMixElixirEffect - b _0231CB14 -_0231C7C0: - mov r4, #0 - str r4, [sp] - ldr r0, _0231CBB0 ; =OREN_BERRY_DAMAGE - str r4, [sp, #4] - mov r1, #0x270 - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - ldrsh r2, [r0] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C7FC: - mov r0, r8 - mov r1, r7 - bl ApplyDoughSeedEffect - b _0231CB14 -_0231C80C: - mov r0, r8 - mov r1, r7 - bl ApplyGravelyrockEffect - b _0231CB14 -_0231C81C: - mov r0, r8 - mov r1, r7 - bl ApplyGonePebbleEffect - b _0231CB14 -_0231C82C: - mov r2, #0 - mov r0, r8 - mov r1, r7 - mov r3, r2 - bl TryInflictBlinkerStatus - b _0231CB14 -_0231C844: - cmp sb, #0 - beq _0231C88C - add r1, sp, #0x1e - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C88C: - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231CBB4 ; =0x00000C67 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231C8B0: - cmp sb, #0 - beq _0231C8F8 - add r1, sp, #0x1d - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C8F8: - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231CBB4 ; =0x00000C67 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231C91C: - cmp sb, #0 - beq _0231C964 - add r1, sp, #0x1c - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C964: - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231CBB4 ; =0x00000C67 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231C988: - cmp sb, #0 - beq _0231C9D0 - add r1, sp, #0x1b - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231C9D0: - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231CBB4 ; =0x00000C67 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231C9F4: - cmp sb, #0 - beq _0231CA3C - add r1, sp, #0x1a - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231CA3C: - ldr r2, _0231CBB8 ; =0x00000C76 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231CA50: - mov r0, r8 - mov r1, r7 - bl ApplyGracideaEffect - b _0231CB14 -_0231CA60: - cmp sb, #0 - beq _0231CAA8 - add r1, sp, #0x19 - ldr r0, _0231CBBC ; =ov10_022C44EC - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231CAA8: - ldr r2, _0231C6DC ; =0x00000BE8 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231CB14 -_0231CABC: - cmp sb, #0 - beq _0231CB04 - add r1, sp, #0x18 - ldr r0, _0231C6D8 ; =ov10_022C4558 - str r1, [sp] - mov r4, #0 - ldrsh r2, [r0] - ldr r1, _0231C6D4 ; =0x00000256 - str r4, [sp, #4] - str r1, [sp, #8] - str r4, [sp, #0xc] - str r4, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r3, #1 - str r4, [sp, #0x14] - bl CalcDamageFixedNoCategory - b _0231CB14 -_0231CB04: - ldr r2, _0231C6DC ; =0x00000BE8 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_0231CB14: - mov r0, r7 - bl EntityIsValid__0231CBC8 - cmp r0, #0 - beq _0231CB9C - ldr r1, [r7, #0xb4] - ldrsh r4, [r6, #4] - ldrb r0, [r1, #6] - cmp r0, #0 - movne r0, #0 - bne _0231CB48 -#ifdef JAPAN - add r0, r1, #0x224 -#else - add r0, r1, #0x228 -#endif - mov r1, #0x5d - bl ExclusiveItemEffectFlagTest -_0231CB48: - cmp r0, #0 - beq _0231CB9C - ldr r0, _0231CBC0 ; =APPLES_AND_BERRIES_ITEM_IDS - b _0231CB90 -_0231CB58: - cmp r4, r1 - bne _0231CB8C - mov r0, #0xa - bl WaitUntilAlertBoxPauseIsOver - ldr r0, _0231CBC4 ; =ov10_022C4864 - mov r4, #1 - ldr r2, [r0] - mov r0, r8 - mov r1, r7 - mov r3, #0 - str r4, [sp] - bl TryIncreaseHp - b _0231CB9C -_0231CB8C: - add r0, r0, #2 -_0231CB90: - ldrsh r1, [r0] - cmp r1, #0 - bne _0231CB58 -_0231CB9C: -#ifdef EUROPE - mov r0, #1 - bl ov29_022FB920 -#endif - mov r0, r8 - bl EnemyEvolution -_0231CBA4: - add sp, sp, #0x5c - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_0231CBAC: .word 0x00000C75 + APPLY_ITEM_EFFECT_OFFSET -_0231CBB0: .word OREN_BERRY_DAMAGE -_0231CBB4: .word 0x00000C67 + APPLY_ITEM_EFFECT_OFFSET -_0231CBB8: .word 0x00000C76 + APPLY_ITEM_EFFECT_OFFSET -_0231CBBC: .word ov10_022C44EC -_0231CBC0: .word APPLES_AND_BERRIES_ITEM_IDS -_0231CBC4: .word ov10_022C4864 - arm_func_end ApplyItemEffect diff --git a/include/overlay_29_0231CBC8.h b/include/overlay_29_0231CBC8.h index ea4e4a67..2823f729 100644 --- a/include/overlay_29_0231CBC8.h +++ b/include/overlay_29_0231CBC8.h @@ -6,4 +6,6 @@ // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__0231CBC8(struct entity *entity); +void ApplyItemEffect(char param_1, u8 param_2, u8 param_3, struct entity *attacker, struct entity *defender, struct item *item); + #endif //PMDSKY_OVERLAY_29_0231CBC8_H diff --git a/src/dungeon_projectile_throw.c b/src/dungeon_projectile_throw.c index 79db778a..dd89c843 100644 --- a/src/dungeon_projectile_throw.c +++ b/src/dungeon_projectile_throw.c @@ -1,4 +1,5 @@ #include "dungeon_projectile_throw.h" +#include "overlay_29_0231CBC8.h" #include "dg_object.h" #include "dungeon.h" #include "dungeon_items.h" @@ -35,7 +36,6 @@ extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity extern void ChangeMonsterAnimationToHurt(struct entity *monster, u32 direction); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); -extern void ApplyItemEffect(char param_1, u8 param_2, u8 param_3, struct entity *attacker, struct entity *defender, struct item *thrown_item); extern void SpawnDroppedItem(struct entity *entity, struct entity *item_entity, struct item *item, bool8 param_4, struct position *dir_xy, u32 param_6); bool8 ItemIsActive__02347B50(struct entity *entity, enum item_id item_id) diff --git a/src/overlay_29_0231CBC8.c b/src/overlay_29_0231CBC8.c index a3ffb4f6..a961a270 100644 --- a/src/overlay_29_0231CBC8.c +++ b/src/overlay_29_0231CBC8.c @@ -1,5 +1,612 @@ #include "overlay_29_0231CBC8.h" #include "dungeon_util_static.h" +#include "dungeon_capabilities_1.h" +#include "dungeon_pokemon_attributes_1.h" +#include "exclusive_item.h" +#include "item_util.h" +#include "main_0200EDC0.h" +#include "move_orb_effects.h" +#include "moves_1.h" +#include "overlay_29_022EAC7C.h" +#include "overlay_29_02344AF8.h" +#include "overlay_29_0234BA54.h" + +#ifdef JAPAN +#define MESSAGE_BE6 0x925 +#define MESSAGE_BE7 0x926 +#define MESSAGE_BE8 0x927 +#define MESSAGE_BE9 0x928 +#define MESSAGE_C67 0x9A6 +#define MESSAGE_C75 0x9B4 +#define MESSAGE_C76 0x9B5 +#else +#define MESSAGE_BE6 0xBE6 +#define MESSAGE_BE7 0xBE7 +#define MESSAGE_BE8 0xBE8 +#define MESSAGE_BE9 0xBE9 +#define MESSAGE_C67 0xC67 +#define MESSAGE_C75 0xC75 +#define MESSAGE_C76 0xC76 +#endif + + +#ifdef EUROPE +extern void ov29_022FB920(bool8 a); +#endif + +extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); +extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity, u32 param_3); +extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); +extern void EndNegativeStatusConditionWrapper(struct entity *user, struct entity *target, bool8 displayMessage, bool8 fromMove); +extern bool8 SpawnDroppedItemWrapper(struct entity *entity, struct position *pos, struct item *item, u32 a); +extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); +extern void BoostIQ(struct entity *entity, s16 iq, bool8 a); +extern void UpdateShopkeeperModeAfterAttack(struct entity *attacker, struct entity *defender); +extern void TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 a, bool8 b); +extern void TryInflictInvisibleStatus(struct entity *user, struct entity *target); +extern void TryInflictPetrifiedStatus(struct entity *user, struct entity *target); +extern void TryInflictSleeplessStatus(struct entity *user, struct entity *target); +extern s32 CalcStatusDuration(struct entity *entity, const s16 *turn_range, bool8 iq_skill_effects); + +extern void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s16 fixed_damage, s32 a, bool8 *flag, s32 b, s32 damage_source, s32 c, s32 d, s32 e); +extern void DealDamageProjectile(struct entity *attacker, struct entity *defender, struct move *move, s16 power, s32 a, s32 b); +extern void ApplyGummiBoostsDungeonMode(struct entity *user, struct entity *target, s32 type, s16 boost); +extern void TryIncreaseBelly(struct entity *user, struct entity *target, s32 a, s32 b, s32 c); +extern void LevelUpItemEffect(struct entity *user, struct entity *target, s32 a, s32 b, s32 c); +extern void RestoreAllMovePP(struct entity *user, struct entity *target, s32 a, s32 b); +extern void TryInflictSleepStatus(struct entity *user, struct entity *target, s32 turns, bool8 a); +extern void TryInflictBlinkerStatus(struct entity *user, struct entity *target, bool8 a, bool8 b); +extern void TryInflictCrossEyedStatus(struct entity *user, struct entity *target, bool8 a); +extern void TryDecreaseLevel(struct entity *user, struct entity *target, s32 a); +extern void ApplyProteinEffect(struct entity *user, struct entity *target, s16 boost); +extern void ApplyCalciumEffect(struct entity *user, struct entity *target, s16 boost); +extern void ApplyIronEffect(struct entity *user, struct entity *target, s16 boost); +extern void ApplyZincEffect(struct entity *user, struct entity *target, s16 boost); +extern void ApplyBlastSeedEffect(struct entity *user, struct entity *target, char a); +extern void ApplyCheriBerryEffect(struct entity *user, struct entity *target); +extern void ApplyPechaBerryEffect(struct entity *user, struct entity *target); +extern void ApplyRawstBerryEffect(struct entity *user, struct entity *target); +extern void ApplyHungerSeedEffect(struct entity *user, struct entity *target); +extern void ApplyGinsengEffect(struct entity *user, struct entity *target); +extern void ApplyVileSeedEffect(struct entity *user, struct entity *target); +extern void ApplyViolentSeedEffect(struct entity *user, struct entity *target); +extern void ApplyGrimyFoodEffect(struct entity *user, struct entity *target); +extern void ApplyMixElixirEffect(struct entity *user, struct entity *target); +extern void ApplyDoughSeedEffect(struct entity *user, struct entity *target); +extern void ApplyViaSeedEffect(struct entity *user, struct entity *target); +extern void ApplyGravelyrockEffect(struct entity *user, struct entity *target); +extern void ApplyGonePebbleEffect(struct entity *user, struct entity *target); +extern void ApplyGracideaEffect(struct entity *user, struct entity *target); +extern void TryInflictDropeyeStatus(struct entity *user, struct entity *target); +extern void TryInflictEyedropStatus(struct entity *user, struct entity *target); +extern bool8 TryInflictSlipStatus(struct entity *user, struct entity *target); +extern void ov29_022E5A00(struct entity *entity, struct item *item); +extern void ov29_022E5AE4(struct entity *entity, struct item *item); +extern void ov29_0230F9A4(struct entity *entity, struct item *item); +extern bool8 ov29_022FB9BC(struct entity *entity); +extern void ov29_022F9EA0(struct entity *entity); +extern void EnemyEvolution(struct entity *entity); +extern bool8 AddHeldItemToBag(struct monster *monster); +extern void ApplyKeyEffect(struct entity *entity); + +extern const s16 STICK_POWER; +extern const s16 IRON_THORN_POWER; +extern const s16 SILVER_SPIKE_POWER; +extern const s16 GOLD_FANG_POWER; +extern const s16 CACNEA_SPIKE_POWER; +extern const s16 CORSOLA_TWIG_POWER; +extern const s16 GOLD_THORN_POWER; +extern const s16 GEO_PEBBLE_DAMAGE; +extern const s16 GRAVELEROCK_DAMAGE; +extern const s16 RARE_FOSSIL_DAMAGE; +extern const s16 OREN_BERRY_DAMAGE; +extern const s16 ORAN_BERRY_HP_RESTORATION; +extern const s16 ORAN_BERRY_FULL_HP_BOOST; +extern const s16 SITRUS_BERRY_HP_RESTORATION; +extern const s16 SITRUS_BERRY_FULL_HP_BOOST; +extern const s16 LIFE_SEED_HP_BOOST; +extern const s16 PROTEIN_STAT_BOOST; +extern const s16 CALCIUM_STAT_BOOST; +extern const s16 IRON_STAT_BOOST; +extern const s16 ZINC_STAT_BOOST; +extern const s16 GUMMI_STAT_BOOST; +extern const s16 WONDER_GUMMI_STAT_BOOST; +extern const s16 ov10_022C44EC; +extern const s16 ov10_022C4558; +extern const s16 ov10_022C4574; +extern const s32 ov10_022C4864; +extern const s16 SLEEP_TURN_RANGE[]; +extern const s16 APPLES_AND_BERRIES_ITEM_IDS[]; + +void ApplyItemEffect(char param_1, u8 param_2, u8 param_3, + struct entity *attacker, struct entity *defender, + struct item *item) +{ + if (param_1 != 0 && param_2 == 0) { + struct monster *monster = GetEntInfo(defender); + bool8 flag = FALSE; + + if (ov29_022FB9BC(defender)) { + SpawnDroppedItemWrapper(attacker, &defender->pos, item, 0); + return; + } + if (monster->is_not_team_member) { + if (GetItemCategoryVeneer(item->id) != CATEGORY_THROWN_LINE && + GetItemCategoryVeneer(item->id) != CATEGORY_BERRIES_SEEDS_VITAMINS && + GetItemCategoryVeneer(item->id) != CATEGORY_THROWN_ARC) { + flag = TRUE; + } + if (GetItemCategoryVeneer(item->id) == CATEGORY_HELD_ITEMS && + item->id >= ITEM_A_STONE && item->id <= ITEM_QUESTION_STONE) { + flag = FALSE; + } + } else if (GetItemCategoryVeneer(item->id) != CATEGORY_BERRIES_SEEDS_VITAMINS) { + flag = IqSkillIsEnabled(defender, IQ_ITEM_CATCHER); + } + if (CheckVariousConditions__0230156C(defender)) { + flag = FALSE; + } + if (flag) { + if (!ItemExists(monster->held_item.flags)) { + if (monster->is_not_team_member || !IsBagFull()) { + if (monster->shopkeeper == SHOPKEEPER_MODE_SHOPKEEPER) { + SpawnDroppedItemWrapper(attacker, &defender->pos, item, 0); + return; + } + PlaySeByIdIfNotSilence(0x1317); + PrepareItemForPrinting__02345728(0, item); + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE6); + monster->held_item = *item; + if (!monster->is_not_team_member) { + AddHeldItemToBag(monster); + } + ov29_022F9EA0(defender); + return; + } + } + } + } + if (param_1) { + ov29_022E5A00(defender, item); + UpdateShopkeeperModeAfterAttack(attacker, defender); + } + if (ItemSticky(item->flags)) { + PrepareItemForPrinting__02345728(0, item); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE7); + if (param_1) { + bool8 b; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4574, 1, &b, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + EnemyEvolution(attacker); + return; + } + } + if (!param_1) { + ov29_022E5AE4(defender, item); + } + ov29_0230F9A4(attacker, item); + if (GetItemCategoryVeneer(item->id) == CATEGORY_BERRIES_SEEDS_VITAMINS) { + TryIncreaseBelly(attacker, defender, 5, 0, 0); + } + if (GetItemCategoryVeneer(item->id) == CATEGORY_TMS_HMS || + GetItemCategoryVeneer(item->id) == CATEGORY_LINK_BOX) { + if (param_1) { + bool8 b; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &b, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE8); + } + } else { + switch (item->id) { + case ITEM_STICK: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, STICK_POWER, 0x100, ITEM_STICK); + break; + } + case ITEM_IRON_THORN: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, IRON_THORN_POWER, 0x100, ITEM_IRON_THORN); + break; + } + case ITEM_SILVER_SPIKE: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, SILVER_SPIKE_POWER, 0x100, ITEM_SILVER_SPIKE); + break; + } + case ITEM_GOLD_FANG: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, GOLD_FANG_POWER, 0x100, ITEM_GOLD_FANG); + break; + } + case ITEM_CACNEA_SPIKE: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, CACNEA_SPIKE_POWER, 0x100, ITEM_CACNEA_SPIKE); + break; + } + case ITEM_CORSOLA_TWIG: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, CORSOLA_TWIG_POWER, 0x100, ITEM_CORSOLA_TWIG); + break; + } + case ITEM_GEO_PEBBLE: + CalcDamageFixedNoCategory(attacker, defender, GEO_PEBBLE_DAMAGE, 1, NULL, 0, DAMAGE_SOURCE_THROWN_ROCK, 0, 0, 0); + break; + case ITEM_GRAVELEROCK: + CalcDamageFixedNoCategory(attacker, defender, GRAVELEROCK_DAMAGE, 1, NULL, 0, DAMAGE_SOURCE_THROWN_ROCK, 0, 0, 0); + break; + case ITEM_GOLD_THORN: { + struct move move; + + InitMove(&move, MOVE_PROJECTILE); + DealDamageProjectile(attacker, defender, &move, GOLD_THORN_POWER, 0x100, ITEM_GOLD_THORN); + break; + } + case ITEM_RARE_FOSSIL: + CalcDamageFixedNoCategory(attacker, defender, RARE_FOSSIL_DAMAGE, 1, NULL, 0, DAMAGE_SOURCE_THROWN_ROCK, 0, 0, 0); + break; + case ITEM_HEAL_SEED: + EndNegativeStatusConditionWrapper(attacker, defender, TRUE, param_3); + break; + case ITEM_ORAN_BERRY: + TryIncreaseHp(attacker, defender, ORAN_BERRY_HP_RESTORATION, ORAN_BERRY_FULL_HP_BOOST, TRUE); + break; + case ITEM_SITRUS_BERRY: + TryIncreaseHp(attacker, defender, SITRUS_BERRY_HP_RESTORATION, SITRUS_BERRY_FULL_HP_BOOST, TRUE); + break; + case ITEM_LIFE_SEED: + TryIncreaseHp(attacker, defender, 0, LIFE_SEED_HP_BOOST, TRUE); + break; + case ITEM_BLINKER_SEED: + TryInflictBlinkerStatus(attacker, defender, FALSE, FALSE); + break; + case ITEM_X_EYE_SEED: + TryInflictCrossEyedStatus(attacker, defender, FALSE); + break; + case ITEM_QUICK_SEED: + BoostSpeedOneStage(attacker, defender, 0, TRUE); + break; + case ITEM_EYEDROP_SEED: + TryInflictEyedropStatus(attacker, defender); + break; + case ITEM_TOTTER_SEED: + TryInflictConfusedStatus(attacker, defender, TRUE, FALSE); + break; + case ITEM_CHERI_BERRY: + ApplyCheriBerryEffect(attacker, defender); + break; + case ITEM_PECHA_BERRY: + ApplyPechaBerryEffect(attacker, defender); + break; + case ITEM_WARP_SEED: + TryWarp(attacker, defender, 0, 0); + break; + case ITEM_SLEEP_SEED: + TryInflictSleepStatus(attacker, defender, CalcStatusDuration(defender, SLEEP_TURN_RANGE, TRUE), TRUE); + break; + case ITEM_CHESTO_BERRY: + TryInflictSleeplessStatus(attacker, defender); + break; + case ITEM_JOY_SEED: + LevelUpItemEffect(attacker, defender, 1, 1, 1); + break; + case ITEM_DOOM_SEED: + TryDecreaseLevel(attacker, defender, 1); + break; + case ITEM_STUN_SEED: + TryInflictPetrifiedStatus(attacker, defender); + break; + case ITEM_PLAIN_SEED: + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE9); + break; + case ITEM_RAWST_BERRY: + ApplyRawstBerryEffect(attacker, defender); + break; + case ITEM_HUNGER_SEED: + ApplyHungerSeedEffect(attacker, defender); + break; + case ITEM_GINSENG: + ApplyGinsengEffect(attacker, defender); + break; + case ITEM_BLAST_SEED: + ApplyBlastSeedEffect(attacker, defender, param_1); + break; + case ITEM_MAX_ELIXIR: + RestoreAllMovePP(attacker, defender, 999, 0); + break; + case ITEM_PROTEIN: + ApplyProteinEffect(attacker, defender, PROTEIN_STAT_BOOST); + break; + case ITEM_CALCIUM: + ApplyCalciumEffect(attacker, defender, CALCIUM_STAT_BOOST); + break; + case ITEM_IRON: + ApplyIronEffect(attacker, defender, IRON_STAT_BOOST); + break; + case ITEM_ZINC: + ApplyZincEffect(attacker, defender, ZINC_STAT_BOOST); + break; + case ITEM_GABITE_SCALE: + EndNegativeStatusConditionWrapper(attacker, defender, TRUE, FALSE); + break; + case ITEM_GOLDEN_SEED: + LevelUpItemEffect(attacker, defender, 5, 1, 1); + break; + case ITEM_VILE_SEED: + ApplyVileSeedEffect(attacker, defender); + break; + case ITEM_PURE_SEED: + TryWarp(attacker, defender, 4, 0); + break; + case ITEM_VIOLENT_SEED: + ApplyViolentSeedEffect(attacker, defender); + break; + case ITEM_VANISH_SEED: + TryInflictInvisibleStatus(attacker, defender); + break; + case ITEM_NECTAR: + BoostIQ(defender, 10, FALSE); + break; + case ITEM_APPLE: + TryIncreaseBelly(attacker, defender, 50, 5, 1); + break; + case ITEM_BIG_APPLE: + TryIncreaseBelly(attacker, defender, 100, 10, 1); + break; + case ITEM_HUGE_APPLE: + TryIncreaseBelly(attacker, defender, 999, 10, 1); + break; + case ITEM_GRIMY_FOOD: + ApplyGrimyFoodEffect(attacker, defender); + break; + case ITEM_WHITE_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_NORMAL, GUMMI_STAT_BOOST); + break; + case ITEM_RED_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_FIRE, GUMMI_STAT_BOOST); + break; + case ITEM_BLUE_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_WATER, GUMMI_STAT_BOOST); + break; + case ITEM_GRASS_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_GRASS, GUMMI_STAT_BOOST); + break; + case ITEM_YELLOW_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_ELECTRIC, GUMMI_STAT_BOOST); + break; + case ITEM_CLEAR_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_ICE, GUMMI_STAT_BOOST); + break; + case ITEM_ORANGE_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_FIGHTING, GUMMI_STAT_BOOST); + break; + case ITEM_PINK_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_POISON, GUMMI_STAT_BOOST); + break; + case ITEM_BROWN_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_GROUND, GUMMI_STAT_BOOST); + break; + case ITEM_SKY_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_FLYING, GUMMI_STAT_BOOST); + break; + case ITEM_GOLD_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_PSYCHIC, GUMMI_STAT_BOOST); + break; + case ITEM_GREEN_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_BUG, GUMMI_STAT_BOOST); + break; + case ITEM_GRAY_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_ROCK, GUMMI_STAT_BOOST); + break; + case ITEM_PURPLE_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_GHOST, GUMMI_STAT_BOOST); + break; + case ITEM_ROYAL_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_DRAGON, GUMMI_STAT_BOOST); + break; + case ITEM_BLACK_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_DARK, GUMMI_STAT_BOOST); + break; + case ITEM_SILVER_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_STEEL, GUMMI_STAT_BOOST); + break; + case ITEM_WONDER_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, 0xFF, WONDER_GUMMI_STAT_BOOST); + break; + case ITEM_UNNAMED_0x71: + TryIncreaseBelly(attacker, defender, 50, 5, 1); + break; + case ITEM_UNNAMED_0x72: + TryIncreaseBelly(attacker, defender, 10, 0, 1); + break; + case ITEM_GOLDEN_APPLE: + TryIncreaseBelly(attacker, defender, 999, 50, 1); + break; + case ITEM_KEY: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } + else { + ApplyKeyEffect(attacker); + } + break; + case ITEM_DROPEYE_SEED: + TryInflictDropeyeStatus(attacker, defender); + break; +case ITEM_SLIP_SEED: + if (!TryInflictSlipStatus(attacker, defender)) { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C75); + } + break; +case ITEM_VIA_SEED: + ApplyViaSeedEffect(attacker, defender); + break; +case ITEM_MIX_ELIXIR: + ApplyMixElixirEffect(attacker, defender); + break; +case ITEM_OREN_BERRY: + CalcDamageFixedNoCategory(attacker, defender, OREN_BERRY_DAMAGE, 1, NULL, 0, + DAMAGE_SOURCE_OREN_BERRY, 0, 0, 0); + break; +case ITEM_DOUGH_SEED: + ApplyDoughSeedEffect(attacker, defender); + break; +case ITEM_GRAVELYROCK: + ApplyGravelyrockEffect(attacker, defender); + break; +case ITEM_GONE_PEBBLE: + ApplyGonePebbleEffect(attacker, defender); + break; +case ITEM_WANDER_GUMMI: + TryInflictBlinkerStatus(attacker, defender, 0, 0); + break; +case ITEM_PRIZE_TICKET: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); + } + break; +case ITEM_SILVER_TICKET: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); + } + break; +case ITEM_GOLD_TICKET: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); + } + break; +case ITEM_PRISM_TICKET: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); + } + break; +case ITEM_SKY_GIFT: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C76); + } + break; +case ITEM_GRACIDEA: + ApplyGracideaEffect(attacker, defender); + break; + case ITEM_UNNAMED_0x16B: + break; + case ITEM_A_STONE: + case ITEM_B_STONE: + case ITEM_C_STONE: + case ITEM_D_STONE: + case ITEM_E_STONE: + case ITEM_F_STONE: + case ITEM_G_STONE: + case ITEM_H_STONE: + case ITEM_I_STONE: + case ITEM_J_STONE: + case ITEM_K_STONE: + case ITEM_L_STONE: + case ITEM_M_STONE: + case ITEM_N_STONE: + case ITEM_O_STONE: + case ITEM_P_STONE: + case ITEM_Q_STONE: + case ITEM_R_STONE: + case ITEM_S_STONE: + case ITEM_T_STONE: + case ITEM_U_STONE: + case ITEM_V_STONE: + case ITEM_W_STONE: + case ITEM_X_STONE: + case ITEM_Y_STONE: + case ITEM_Z_STONE: + case ITEM_EXCLAMATION_STONE: + case ITEM_QUESTION_STONE: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C44EC, 1, &flag, 0, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE8); + } + break; + case ITEM_NOTHING: + default: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } + else { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE8); + } + break; + } + } + + if (EntityIsValid__0231CBC8(defender)) { + struct monster *info = GetEntInfo(defender); + s16 id = item->id; + bool8 active; + + if (!info->is_not_team_member) + active = ExclusiveItemEffectFlagTest(info->exclusive_item_effect_flags, EXCLUSIVE_EFF_RECOVER_HP_FROM_APPLES_AND_BERRIES); + else + active = FALSE; + + if (active) { + const s16 *p; + + for (p = APPLES_AND_BERRIES_ITEM_IDS; *p != 0; p++) { + if (id == *p) { + WaitUntilAlertBoxPauseIsOver(10); + TryIncreaseHp(attacker, defender, ov10_022C4864, 0, TRUE); + break; + } + } + } + } + +#ifdef EUROPE + ov29_022FB920(TRUE); +#endif + EnemyEvolution(attacker); +} bool8 EntityIsValid__0231CBC8(struct entity *entity) { From f47593d94ec5ca5d7f88d87e55363eb6bc6b1aa2 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Mon, 7 Sep 2026 01:56:08 -0700 Subject: [PATCH 11/34] Decomp sub_0203D538; replace its stale extern with the new header sub_0203D538 (0x0203D538, 1666 instructions in US and EU, 1640 in JP) is the mission-reward state machine: a 77-case dense switch over MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 driving money, egg, item, rank-up and recruit rewards through dialogue boxes and menus. It is function 13 of 89 in asm/main_0203CAF0.s, so extract_function.py splits rather than merges: the 76 functions after it move to asm/main_0203EFD4.s, the function lands in src/main_0203D538.c with include/main_0203D538.h, and main.lsf lists both new objects where it listed one. src/overlay_24_init.c declared sub_0203D538 itself, with a live call site in a switch. That extern is removed and the file now includes the new header. Case order is source order and is not ascending - two contiguous runs are swapped (32,33,34 before 30,31; and 52..57 before 45..51), read off the jump table. Every case ends `break` with a single `return 0` after the switch, because the target's exit block itself materialises the value: a `return 0` per case makes MWCC materialise r0 at each of 77 sites and, worse, de-predicates the short blocks above them. case 76 keeps its `return 1`, which is how the target jumps past that shared `mov r0, #0`. The nine function-scope locals are declared buffer-first then the five struct item in reverse case order, because MWCC gives the first-declared local the highest stack address and the target wants the buffer at sp+0x22. That ordering costs no instructions, so it shows up only as a wrong offset at every stack access - not as a length difference. struct unk_020AFE74 is a placeholder for the 0x3C0-byte state struct, with field_0x members and two u8 filler ranges this function never touches; it cannot be honestly typed from one caller. The 19 callees with no declaration anywhere are declared extern in the .c with prototypes read off their own asm, and two of them - sub_02046C78 and sub_02046D20 - take no arguments, contradicting src/main_020663C8.c. Region handling: 35 message ids carry a uniform +0x21D4 under JAPAN via one file-scope offset macro; one id at 0x2CC shifts by +0x2D20 instead and needs its own ifdef; StrncpySimple becomes the two-argument StrcpySimple; and JAPAN omits case 74's item fetch, its name formatting and its early-exit guard, which is what removes a struct item local and takes the frame from 0x11C to 0x114. EUROPE is byte-identical to NORTH_AMERICA - there is no EUROPE directive anywhere in this function. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_0203CAF0.inc | 272 +- asm/include/main_0203EFD4.inc | 176 + asm/main_0203CAF0.s | 6492 --------------------------------- asm/main_0203EFD4.s | 4533 +++++++++++++++++++++++ include/main_0203D538.h | 6 + main.lsf | 2 + src/main_0203D538.c | 915 +++++ src/overlay_24_init.c | 2 +- 8 files changed, 5663 insertions(+), 6735 deletions(-) create mode 100644 asm/include/main_0203EFD4.inc create mode 100644 asm/main_0203EFD4.s create mode 100644 include/main_0203D538.h create mode 100644 src/main_0203D538.c diff --git a/asm/include/main_0203CAF0.inc b/asm/include/main_0203CAF0.inc index 5326ed68..17844bc7 100644 --- a/asm/include/main_0203CAF0.inc +++ b/asm/include/main_0203CAF0.inc @@ -1,262 +1,50 @@ #pragma once +.public AppendStandardStringToMission +.public ClearWindow +.public ClosePortraitBox +.public CloseTextBox +.public CreatePortraitBox +.public CreateTextBox +.public DrawTextInWindow +.public GetDexNumber +.public GetNextIqSkill +.public GetSpeciesString +.public GetType +.public GetTypeStringId +.public HidePortraitBox +.public InitPortraitParams +.public InitPortraitParamsWithMonsterId +.public InitPreprocessorArgs +.public IsTextboxState3 +.public MISSION_REWARD_STRUCT_MAIN_PTR +.public MemAlloc +.public MemZero +.public PreprocessString +.public PreprocessStringFromId +.public SetPortraitEmotion +.public SetPortraitLayout +.public SetPortraitOffset +.public ShowPortraitInPortraitBox +.public StringFromId +.public StrncpySimpleNoPadSafe +.public TEAM_MEMBER_TABLE_PTR +.public UpdateWindow .public _0209C7CC .public _0209C7D4 .public _0209C7E4 .public _0209C820 .public _0209C82C .public _0209C83C -.public _0209C844 -.public _0209C846 -.public _0209C850 -.public _0209C85C -.public _0209C86C -.public _0209C884 -.public _0209C89C -.public _0209C8A8 -.public _0209C8B8 -.public _0209C8C8 -.public _0209C928 -.public _0209C92C -.public _0209C93C -.public _0209C94C -.public _0209C95C -.public _0209C96C -.public _0209C97C -.public _0209C98C -.public _0209C99C -.public _0209C9AC -.public _0209C9B0 -.public _0209C9CC -.public _0209C9D4 -.public _0209C9DC -.public _0209C9E4 -.public _0209C9F4 -.public _0209C9FC -.public _0209CA08 -.public _0209CA18 -.public _0209CA2C -.public _0209E912 .public _020AFE70 -.public _020AFE78 -.public _020AFE7C -.public _020AFE8C -.public _020AFE90 -.public _020AFE98 -.public _022AADFC -.public _022AAE00 -.public _022AAE2A -.public _022AAE2E -.public _022AAE58 .public _s32_div_f -.public AddItemToStorage -.public AddMoneyCarried -.public AppendStandardStringToMission -.public ApplyLevelUpBoostsToGroundMonster -.public Arm9LoadUnkFieldNa0x2029EC8 -.public Arm9StoreUnkFieldNa0x2029ED8 -.public BAG_ITEMS_PTR_MIRROR -.public CanMonsterUseMove -.public ClearBagSelectedItemTable -.public ClearWindow -.public CloseAdvancedMenu -.public CloseAdvancedTextBox -.public CloseCollectionMenu -.public CloseDialogueBox -.public CloseParentMenu -.public ClosePortraitBox -.public CloseScrollBox -.public CloseSimpleMenu -.public CloseTextBox -.public CopyNStringFromId -.public CountNbOfItemsInStorage -.public CreateAdvancedMenu -.public CreateAdvancedTextBox -.public CreateCollectionMenu -.public CreateParentMenuFromStringIds -.public CreatePortraitBox -.public CreateScrollBoxMulti -.public CreateScrollBoxSingle -.public CreateSimpleMenuFromStringIds -.public CreateTextBox -.public DisableIqSkill -.public DrawTextInWindow -.public FormatMoveStringMore -.public GetActiveTeamMember -.public GetActualSellPrice -.public GetAdvancedMenuResult -.public GetAdvancedTextBoxFlags2 -.public GetDexNumber -.public GetDigitInputResult -.public GetDungeonResultString -.public GetEggSpecies -.public GetHeldButtons -.public GetIqSkillStringId -.public GetItemAtIdx -.public GetItemCategory -.public GetKeyboardStatus -.public GetKeyboardStringResult -.public GetLearnableIqSkills -.public GetMaxPp -.public GetMoneyCarried -.public GetMonsterName -.public GetMoveRangeId -.public GetMoveType -.public GetNameRaw -.public GetNameWithGender -.public GetNbItemsInBag -.public GetNextIqSkill -.public GetPpIncrease -.public GetPressedButtons -.public GetRank -.public GetRankUpEntry -.public GetReleasedStylus -.public GetResolvedPerformanceProgressFlag -.public GetSimpleMenuResult__0202AEA4 -.public GetSimpleMenuResult__0202B870 -.public GetSpeciesString -.public GetStringFromFileVeneer -.public GetType -.public GetTypeStringId -.public GetWindowIdPageStart -.public GetWindowIdSelectedMenuItemIdx -.public HidePortraitBox -.public InitMove -.public InitPortraitParams -.public InitPortraitParamsWithMonsterId -.public InitPreprocessorArgs -.public InitUnkStorageStruct0x410 -.public IqSkillFlagTest -.public Is2TurnsMove -.public IsAdvancedMenuActive2 -.public IsAdvancedTextBoxActive -.public IsCollectionMenuActive -.public IsCollectionMenuState3 -.public IsDeoxys -.public IsGummi -.public IsMonsterIllegalForMissions -.public IsNot2TurnsMoveOrSketch -.public IsParentMenuActive -.public IsScrollBoxActive -.public IsShoppableItem -.public IsSimpleMenuActive -.public IsStorableItem -.public IsTextboxState3 -.public IsThrownItem -.public IsTouchScreenNotOff -.public LAST_NEW_MOVE -.public LoadScriptVariableValue -.public MaybeGetColoredFormattedItemName -.public MaybeGetUncoloredFormattedItemName -.public MemAlloc -.public memcpy -.public MemcpySimple -.public MemFree -.public MemZero -.public MISSION_REWARD_STRUCT_MAIN_PTR -.public ov11_023061CC -.public ov11_023061E4 -.public ov11_02306C64 -.public ov11_02306C9C .public ov11_0230D000 .public ov11_0230D220 .public ov11_0230D92C -.public ov11_02310BDC -.public PlayAdvancedTextBoxInputSound -.public PlaySeByIdVolumeWrapper -.public PlaySeVolumeWrapper -.public PreprocessString -.public PreprocessStringFromId -.public RandIntSafe -.public RemoveEmptyItemsInBag -.public ResumeAdvancedMenu -.public SetAdvancedTextBoxField0x1C2 -.public SetAdvancedTextBoxState5 -.public SetCollectionMenuField0x1BC -.public SetCollectionMenuVoidFn -.public SetCollectionMenuWidth -.public SetEggHatchTimer -.public SetEggSpecies -.public SetPortraitEmotion -.public SetPortraitLayout -.public SetPortraitOffset -.public SetUnkAdvancedTextBoxFn -.public SetUnkAdvancedTextBoxWindowFn -.public ShowKeyboard -.public ShowPortraitInPortraitBox -.public STATUSES_FULL_DESCRIPTION_STRING_IDS -.public strcat -.public strcpy -.public StrcpySimple -.public StringFromId -.public StrncpySimple -.public StrncpySimpleNoPadSafe -.public sub_02001808 -.public sub_020063F4 -.public sub_02006498 -.public sub_02006BFC -.public sub_0200FD48 -.public sub_02013E54 -.public sub_02013F58 -.public sub_02017C50 -.public sub_02017C74 .public sub_02024D7C -.public sub_02025D50 -.public sub_02027B1C -.public sub_0202810C -.public sub_0202812C -.public sub_02028354 -.public sub_020288DC -.public sub_0202A2A4 -.public sub_0202C1E4 -.public sub_0202C620 -.public sub_0202C75C -.public sub_0202D068 -.public sub_0202D0EC -.public sub_0202D16C .public sub_0202F954 -.public sub_020307EC -.public sub_020308E4 -.public sub_02030908 -.public sub_02030978 -.public sub_02030A50 -.public sub_02030A64 -.public sub_02030A74 -.public sub_02030A90 -.public sub_02030EF0 -.public sub_02037468 -.public sub_0203909C -.public sub_02039218 -.public sub_0203931C -.public sub_02042B20 -.public sub_02042BE0 -.public sub_0204426C -.public sub_020442CC -.public sub_02044308 -.public sub_0204440C -.public sub_02044474 -.public sub_020444B0 -.public sub_02044568 -.public sub_020445C8 -.public sub_02045FD0 -.public sub_02046028 -.public sub_02046A20 -.public sub_02046B04 -.public sub_02046BA0 -.public sub_02046BE8 -.public sub_02046C78 -.public sub_02046D20 -.public sub_02050C10 -.public sub_02052E2C -.public sub_02053A0C -.public sub_02055D4C .public sub_02056410 .public sub_020564B0 .public sub_02056F60 -.public sub_0205A4B4 .public sub_0205B028 .public sub_0205B0A0 -.public sub_0205B0B8 -.public TEAM_MEMBER_TABLE_PTR -.public UNK_STORAGE_STRUCT_0XC -.public UpdateWindow .public vsprintf diff --git a/asm/include/main_0203EFD4.inc b/asm/include/main_0203EFD4.inc new file mode 100644 index 00000000..d951197d --- /dev/null +++ b/asm/include/main_0203EFD4.inc @@ -0,0 +1,176 @@ +#pragma once +.public Arm9LoadUnkFieldNa0x2029EC8 +.public Arm9StoreUnkFieldNa0x2029ED8 +.public BAG_ITEMS_PTR_MIRROR +.public CanMonsterUseMove +.public ClearBagSelectedItemTable +.public CloseAdvancedMenu +.public CloseAdvancedTextBox +.public CloseCollectionMenu +.public CloseDialogueBox +.public CloseParentMenu +.public ClosePortraitBox +.public CloseScrollBox +.public CopyNStringFromId +.public CountNbOfItemsInStorage +.public CreateAdvancedMenu +.public CreateAdvancedTextBox +.public CreateCollectionMenu +.public CreatePortraitBox +.public CreateScrollBoxMulti +.public CreateScrollBoxSingle +.public DisableIqSkill +.public DrawTextInWindow +.public FormatMoveStringMore +.public GetActiveTeamMember +.public GetActualSellPrice +.public GetAdvancedMenuResult +.public GetAdvancedTextBoxFlags2 +.public GetDigitInputResult +.public GetDungeonResultString +.public GetHeldButtons +.public GetIqSkillStringId +.public GetItemAtIdx +.public GetLearnableIqSkills +.public GetMaxPp +.public GetMoneyCarried +.public GetMonsterName +.public GetMoveRangeId +.public GetMoveType +.public GetNbItemsInBag +.public GetPpIncrease +.public GetPressedButtons +.public GetReleasedStylus +.public GetResolvedPerformanceProgressFlag +.public GetStringFromFileVeneer +.public GetWindowIdPageStart +.public GetWindowIdSelectedMenuItemIdx +.public InitMove +.public InitPreprocessorArgs +.public IqSkillFlagTest +.public Is2TurnsMove +.public IsAdvancedMenuActive2 +.public IsAdvancedTextBoxActive +.public IsCollectionMenuActive +.public IsCollectionMenuState3 +.public IsDeoxys +.public IsGummi +.public IsNot2TurnsMoveOrSketch +.public IsScrollBoxActive +.public IsShoppableItem +.public IsStorableItem +.public IsTouchScreenNotOff +.public LAST_NEW_MOVE +.public MISSION_REWARD_STRUCT_MAIN_PTR +.public MaybeGetColoredFormattedItemName +.public MaybeGetUncoloredFormattedItemName +.public MemAlloc +.public MemFree +.public MemZero +.public PlayAdvancedTextBoxInputSound +.public PlaySeByIdVolumeWrapper +.public PlaySeVolumeWrapper +.public PreprocessString +.public RemoveEmptyItemsInBag +.public ResumeAdvancedMenu +.public STATUSES_FULL_DESCRIPTION_STRING_IDS +.public SetAdvancedTextBoxField0x1C2 +.public SetAdvancedTextBoxState5 +.public SetCollectionMenuField0x1BC +.public SetCollectionMenuVoidFn +.public SetCollectionMenuWidth +.public SetUnkAdvancedTextBoxFn +.public SetUnkAdvancedTextBoxWindowFn +.public ShowPortraitInPortraitBox +.public StrncpySimpleNoPadSafe +.public TEAM_MEMBER_TABLE_PTR +.public UNK_STORAGE_STRUCT_0XC +.public UpdateWindow +.public _0209C89C +.public _0209C8A8 +.public _0209C8B8 +.public _0209C8C8 +.public _0209C928 +.public _0209C92C +.public _0209C93C +.public _0209C94C +.public _0209C95C +.public _0209C96C +.public _0209C97C +.public _0209C98C +.public _0209C99C +.public _0209C9AC +.public _0209C9B0 +.public _0209C9CC +.public _0209C9D4 +.public _0209C9DC +.public _0209C9E4 +.public _0209C9F4 +.public _0209C9FC +.public _0209CA08 +.public _0209CA18 +.public _0209CA2C +.public _0209E912 +.public _020AFE78 +.public _020AFE7C +.public _020AFE8C +.public _020AFE90 +.public _020AFE98 +.public _022AADFC +.public _022AAE00 +.public _022AAE2A +.public _022AAE2E +.public _022AAE58 +.public memcpy +.public strcat +.public strcpy +.public sub_02001808 +.public sub_020063F4 +.public sub_02006498 +.public sub_02006BFC +.public sub_0200FD48 +.public sub_02013E54 +.public sub_02013F58 +.public sub_02017C74 +.public sub_02025D50 +.public sub_02027B1C +.public sub_0202810C +.public sub_0202812C +.public sub_02028354 +.public sub_020288DC +.public sub_0202A2A4 +.public sub_0202C1E4 +.public sub_0202C620 +.public sub_0202C75C +.public sub_0202D068 +.public sub_0202D0EC +.public sub_0202D16C +.public sub_020307EC +.public sub_020308E4 +.public sub_02030908 +.public sub_02030978 +.public sub_02030A50 +.public sub_02030A64 +.public sub_02030A74 +.public sub_02030A90 +.public sub_02030EF0 +.public sub_02042B20 +.public sub_02042BE0 +.public sub_0204426C +.public sub_020442CC +.public sub_02044308 +.public sub_0204440C +.public sub_02044474 +.public sub_020444B0 +.public sub_02044568 +.public sub_020445C8 +.public sub_02046A20 +.public sub_02046B04 +.public sub_02046BA0 +.public sub_02046D20 +.public sub_02056410 +.public sub_020564B0 +.public sub_02056F60 +.public sub_0205A4B4 +.public sub_0205B0B8 +.public vsprintf diff --git a/asm/main_0203CAF0.s b/asm/main_0203CAF0.s index fc309f67..64e554bf 100644 --- a/asm/main_0203CAF0.s +++ b/asm/main_0203CAF0.s @@ -745,6495 +745,3 @@ _0203D4F8: .align 2, 0 _0203D534: .word MISSION_REWARD_STRUCT_MAIN_PTR arm_func_end sub_0203D438 - - arm_func_start sub_0203D538 -sub_0203D538: ; 0x0203D538 -#ifdef JAPAN -#define SUB_0203D538_STACK_OFFSET -6 -#define SUB_0203D538_STACK_OFFSET_2 -8 -#else -#define SUB_0203D538_STACK_OFFSET 0 -#define SUB_0203D538_STACK_OFFSET_2 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} - sub sp, sp, #0x11c + SUB_0203D538_STACK_OFFSET_2 - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r4, [r1] - ldr r0, [r4] - cmp r0, #0x4c - addls pc, pc, r0, lsl #2 - b _0203EF9C -_0203D558: ; jump table - b _0203D68C ; case 0 - b _0203D7D4 ; case 1 - b _0203D89C ; case 2 - b _0203D8CC ; case 3 - b _0203D8EC ; case 4 - b _0203D954 ; case 5 - b _0203D984 ; case 6 - b _0203D9A4 ; case 7 - b _0203DA64 ; case 8 - b _0203DAA0 ; case 9 - b _0203DAEC ; case 10 - b _0203DB20 ; case 11 - b _0203DBB0 ; case 12 - b _0203DC68 ; case 13 - b _0203DC98 ; case 14 - b _0203DCB8 ; case 15 - b _0203DD68 ; case 16 - b _0203DDAC ; case 17 - b _0203DE38 ; case 18 - b _0203DE50 ; case 19 - b _0203DE6C ; case 20 - b _0203DEA0 ; case 21 - b _0203DEBC ; case 22 - b _0203DF1C ; case 23 - b _0203DF40 ; case 24 - b _0203DF5C ; case 25 - b _0203DF74 ; case 26 - b _0203DF90 ; case 27 - b _0203DFB0 ; case 28 - b _0203DFD8 ; case 29 - b _0203E10C ; case 30 - b _0203E150 ; case 31 - b _0203E038 ; case 32 - b _0203E0BC ; case 33 - b _0203E0EC ; case 34 - b _0203E198 ; case 35 - b _0203E1DC ; case 36 - b _0203E20C ; case 37 - b _0203E22C ; case 38 - b _0203E274 ; case 39 - b _0203E2A4 ; case 40 - b _0203E2C4 ; case 41 - b _0203E460 ; case 42 - b _0203E490 ; case 43 - b _0203E518 ; case 44 - b _0203E8E8 ; case 45 - b _0203E934 ; case 46 - b _0203E964 ; case 47 - b _0203E984 ; case 48 - b _0203E9A8 ; case 49 - b _0203E9D8 ; case 50 - b _0203E9F8 ; case 51 - b _0203E5B4 ; case 52 - b _0203E61C ; case 53 - b _0203E6B8 ; case 54 - b _0203E6D8 ; case 55 - b _0203E7EC ; case 56 - b _0203E80C ; case 57 - b _0203EA24 ; case 58 - b _0203EAB8 ; case 59 - b _0203EAE8 ; case 60 - b _0203EB08 ; case 61 - b _0203EB64 ; case 62 - b _0203EB94 ; case 63 - b _0203EBB4 ; case 64 - b _0203EC28 ; case 65 - b _0203EC5C ; case 66 - b _0203ECA8 ; case 67 - b _0203ECC4 ; case 68 - b _0203ED34 ; case 69 - b _0203ED50 ; case 70 - b _0203EE14 ; case 71 - b _0203EE30 ; case 72 - b _0203EE68 ; case 73 - b _0203EEBC ; case 74 - b _0203EF78 ; case 75 - b _0203EF94 ; case 76 -_0203D68C: - ldrb r0, [r4, #0x36] - cmp r0, #0 - beq _0203D6E4 - bl GetEggSpecies - cmp r0, #0 - bne _0203D6B4 - mov r0, #0x1e - bl GetResolvedPerformanceProgressFlag - cmp r0, #0 - bne _0203D73C -_0203D6B4: - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mvn r0, #0 - ldr r4, [r1] - mov r2, #0 - ldr r3, [r4, #0x1c] - mul r0, r3, r0 - str r0, [r4, #0x1c] - ldr r0, [r1] - strb r2, [r0, #0x36] - ldr r0, [r1] - strh r2, [r0, #0x38] - b _0203D73C -_0203D6E4: - ldrsh r0, [r4, #0x38] - cmp r0, #0 - beq _0203D73C - mov r0, #0x1d - bl GetResolvedPerformanceProgressFlag - cmp r0, #0 - beq _0203D718 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - ldrsh r0, [r0, #0x38] - bl IsMonsterIllegalForMissions - cmp r0, #0 - beq _0203D73C -_0203D718: - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0 - ldr r2, [r1] - sub r0, r3, #1 - strh r3, [r2, #0x38] - ldr r2, [r1] - ldr r1, [r2, #0x1c] - mul r0, r1, r0 - str r0, [r2, #0x1c] -_0203D73C: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - ldr r0, [r0, #0xe4] - tst r0, #0x10 - bne _0203D7C0 - mov r0, #0x1f - bl GetResolvedPerformanceProgressFlag - cmp r0, #0 - bne _0203D7C0 - mov r5, #0 - mov r4, r5 - ldr sb, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mvn r7, #0 - mov r8, #6 - b _0203D7B0 -_0203D778: - mul r6, r5, r8 - add r0, r1, r6 - ldrsh r0, [r0, #0x28] - bl GetItemCategory - cmp r0, #0xf - bne _0203D7AC - ldr r0, [sb] - add r0, r0, r6 - strh r4, [r0, #0x28] - ldr r2, [sb] - ldr r0, [r2, #0x1c] - mul r1, r0, r7 - str r1, [r2, #0x1c] -_0203D7AC: - add r5, r5, #1 -_0203D7B0: - ldr r1, [sb] - ldr r0, [r1, #0x20] - cmp r5, r0 - blt _0203D778 -_0203D7C0: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #1 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203D7D4: - ldr r0, [r4, #0x1c] - cmp r0, #0 - movle r0, #7 - strle r0, [r4] - ble _0203EF9C - str r0, [r4, #0xb0] -#ifdef JAPAN - ldr r3, [r1] - mov r0, #0xa - ldr r2, [r3, #0x1c] - mul r0, r2, r0 - str r0, [r3, #0xb4] - ldr r1, [r1] - ldr r0, [r1, #8] - cmp r0, #0 - beq _0203D890 - cmp r0, #2 - bne _0203DC0C - ldr r4, _0203E4B4 ; =0x0000245D - bl sub_0203F00C - b _0203D864 -_0203DC0C: - cmp r0, #3 - bne _0203DC20 - ldr r4, _0203E89C ; =0x0000245E - bl sub_0203F00C - b _0203D864 -_0203DC20: - cmp r0, #4 - ldrne r4, _0203E8A0 ; =0x0000245C -#else - ldr r4, [r1] - mov r0, #0xa - ldr r2, [r4, #0x1c] - mul r3, r2, r0 - str r3, [r4, #0xb4] - ldr r2, [r1] - ldr r1, [r2, #8] - cmp r1, #0 - beq _0203D890 - cmp r1, #2 - bne _0203D824 - ldr r4, _0203E4B4 ; =0x00000289 - bl sub_0203F00C - b _0203D864 -_0203D824: - cmp r1, #3 - bne _0203D838 - add r4, r0, #0x280 - bl sub_0203F00C - b _0203D864 -_0203D838: - cmp r1, #4 - movne r4, #0x288 -#endif - bne _0203D864 - mov r0, #0 - mov r1, #0x69 - bl LoadScriptVariableValue -#ifdef JAPAN - add r0, r0, #0x5f - add r0, r0, #0x2400 -#else - add r0, r0, #0x8b - add r0, r0, #0x200 -#endif - mov r0, r0, lsl #0x10 - mov r4, r0, lsr #0x10 - bl sub_0203F00C -_0203D864: - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4B8 ; =0x0000101C - ldr r2, [r1] - mov r1, r4 - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #2 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203D890: - mov r0, #4 -#ifdef JAPAN - str r0, [r1] -#else - str r0, [r2] -#endif - b _0203EF9C -_0203D89C: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - bl MissionRewardCloseAllBoxes - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #3 - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203D8CC: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - ldrle r0, [r1] - movle r1, #4 - strle r1, [r0] - b _0203EF9C -_0203D8EC: - mov r0, #4 - bl sub_02017C50 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - ldr r0, [r0, #0x1c] - bl AddMoneyCarried - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r2, [r0] - ldr r0, [r2, #8] - cmp r0, #2 - ldreq r1, _0203E4BC ; =0x0000026F - beq _0203D934 - cmp r0, #3 -#ifdef JAPAN - ldreq r1, _0203E8AC ; =0x00002444 -#else - moveq r1, #0x270 -#endif - beq _0203D934 - cmp r0, #4 - ldreq r1, _0203E4C0 ; =0x00000271 - ldrne r1, _0203E4C4 ; =0x0000026E -_0203D934: - ldr r0, _0203E4B8 ; =0x0000101C - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #5 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203D954: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - bl MissionRewardCloseAllBoxes - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #6 - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203D984: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - ldrle r0, [r1] - movle r1, #7 - strle r1, [r0] - b _0203EF9C -_0203D9A4: - ldrsh r0, [r4, #0x38] - cmp r0, #0 - beq _0203D9BC - ldrb r0, [r4, #0x36] - cmp r0, #0 - beq _0203D9C8 -_0203D9BC: - mov r0, #0x29 - str r0, [r4] - b _0203EF9C -_0203D9C8: - ldrsh r0, [r4, #0x14] - str r0, [r4, #0x8c] - ldr r2, [r1] - ldrsh r0, [r2, #0x38] - str r0, [r2, #0x90] - ldr r1, [r1] - ldr r0, [r1, #8] - cmp r0, #0 - beq _0203DA58 - cmp r0, #2 - bne _0203DA00 - ldr r4, _0203E4C8 ; =0x0000029A - bl sub_0203F00C - b _0203DA2C -_0203DA00: - cmp r0, #4 - ldrne r4, _0203E4CC ; =0x00000299 - bne _0203DA2C - mov r0, #0 - mov r1, #0x69 - bl LoadScriptVariableValue -#ifdef JAPAN - add r0, r0, #0x6f - add r0, r0, #0x2400 -#else - add r0, r0, #0x9b - add r0, r0, #0x200 -#endif - mov r0, r0, lsl #0x10 - mov r4, r0, lsr #0x10 - bl sub_0203F00C -_0203DA2C: - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4D0 ; =0x00003008 - ldr r2, [r1] - mov r1, r4 - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #8 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203DA58: - mov r0, #0xb - str r0, [r1] - b _0203EF9C -_0203DA64: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - mov r0, #0 - ldr r3, _0203E4D4 ; =_0209C884 - mov r2, r0 - mov r1, #0x11 - bl CreateParentMenuFromStringIds - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r2, #9 - ldr r3, [r1] - strb r0, [r3, #4] - ldr r0, [r1] - str r2, [r0] - b _0203EF9C -_0203DAA0: - ldrsb r0, [r4, #4] - bl IsParentMenuActive - cmp r0, #0 - bne _0203EF9C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl GetSimpleMenuResult__0202AEA4 - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r1, [r1] - str r0, [r1, #0x18c] - bl MissionRewardCloseAllBoxes - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r2, #0xa - ldr r1, [r0] - str r2, [r1, #0x188] - ldr r0, [r0] - str r2, [r0] - b _0203EF9C -_0203DAEC: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - bgt _0203EF9C - ldr r1, [r1] - ldr r0, [r1, #0x18c] - cmp r0, #0 - moveq r0, #0xb - streq r0, [r1] - movne r0, #0x23 - strne r0, [r1] - b _0203EF9C -_0203DB20: - ldr r3, _0203E4D8 ; =_0209C846 - add r2, sp, #0x22 + SUB_0203D538_STACK_OFFSET - mov r1, #4 -_0203DB2C: - ldrh r0, [r3], #2 - subs r1, r1, #1 - strh r0, [r2], #2 - bne _0203DB2C - ldrsh r1, [r4, #0x38] - add r0, sp, #0x22 + SUB_0203D538_STACK_OFFSET - mov r2, #1 - mov r3, #0 - bl sub_02053A0C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - add r1, sp, #0x22 + SUB_0203D538_STACK_OFFSET - ldr r0, [r0] - ldr r3, _0203E4DC ; =_0209C844 - str r1, [sp] - ldrsh r1, [r0, #0x38] - add r0, r0, #0x40 - mov r2, #0 - bl sub_02052E2C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - add r0, r0, #0x40 - bl sub_02055D4C - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r2, [r1] - str r0, [r2, #0x3b8] - ldr r1, [r1] - ldr r0, [r1, #0x3b8] - cmp r0, #0 - movne r0, #0xc - strne r0, [r1] - moveq r0, #0x1e - streq r0, [r1] - b _0203EF9C -_0203DBB0: - ldr r0, [r4, #0x18] - cmp r0, #1 - ble _0203DBD0 - mov r1, r0, lsl #0x10 - ldr r0, [r4, #0x3b8] - mov r1, r1, asr #0x10 - mov r2, #1 - bl ApplyLevelUpBoostsToGroundMonster -_0203DBD0: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r2, [r0] - ldrsh r1, [r2, #0x38] - str r1, [r2, #0x8c] - ldr r4, [r0] - ldr r0, [r4, #8] - cmp r0, #2 - bne _0203DC18 - ldr r0, _0203E4B8 ; =0x0000101C - ldr r1, _0203E4E0 ; =0x0000027A - add r2, r4, #0x8c - bl sub_02046BE8 - bl sub_0203F00C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0xd - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203DC18: - cmp r0, #4 - movne r0, #0xf - strne r0, [r4] - bne _0203EF9C - mov r0, #0 - mov r1, #0x69 - bl LoadScriptVariableValue -#ifdef JAPAN - add r0, r0, #0x4f - add r0, r0, #0x2400 -#else - add r0, r0, #0x7b - add r0, r0, #0x200 -#endif - mov r1, r0, lsl #0x10 - ldr r0, _0203E4B8 ; =0x0000101C - mov r1, r1, lsr #0x10 - add r2, r4, #0x8c - bl sub_02046BE8 - bl sub_0203F00C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0xd - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203DC68: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - bl MissionRewardCloseAllBoxes - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #0xe - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203DC98: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - ldrle r0, [r1] - movle r1, #0xf - strle r1, [r0] - b _0203EF9C -_0203DCB8: - ldrsh r1, [r4, #0x38] - add r0, r4, #0xb5 - add r0, r0, #0x200 - mov r2, #0x4e - bl GetNameWithGender - ldr r3, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4E4 ; =0x0000100C - ldr r4, [r3] - ldr r1, _0203E4E8 ; =0x000002A6 - add r2, r4, #0xb5 - add r2, r2, #0x200 - str r2, [r4, #0xc4] - ldr r2, [r3] - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR -#ifndef JAPAN - mov r2, #0xa -#endif - ldr r0, [r0] - ldr r1, [r0, #0x3b8] - add r0, r0, #0xa1 - add r0, r0, #0x100 - add r1, r1, #0x3a -#ifdef JAPAN - bl StrcpySimple -#else - bl StrncpySimple -#endif - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r2, #0xa - ldr r0, [r0] - ldr r1, [r0, #0x3b8] - add r0, r0, #0xab - add r0, r0, #0x100 - add r1, r1, #0x3a - bl MemcpySimple - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r2, #0xa - ldr r1, [r0] - add r0, r1, #0xb5 - add r0, r0, #0x100 - add r1, r1, #0xab - add r1, r1, #0x100 - bl StrncpySimpleNoPadSafe - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x10 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203DD68: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - ldr r0, _0203E4EC ; =_0209C85C - mov r4, #2 - ldr r1, _0203E4F0 ; =0x00300011 - ldr r3, _0203E4F4 ; =_0209C86C - mov r2, #0 - str r4, [sp] - bl CreateSimpleMenuFromStringIds - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r2, #0x11 - ldr r3, [r1] - strb r0, [r3, #0x1a0] - ldr r0, [r1] - str r2, [r0] - b _0203EF9C -_0203DDAC: - add r0, r4, #0x100 - ldrsb r0, [r0, #0xa0] - bl IsSimpleMenuActive - cmp r0, #0 - bne _0203EF9C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - add r0, r0, #0x100 - ldrsb r0, [r0, #0xa0] - bl GetSimpleMenuResult__0202B870 - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r4, r0 - ldr r0, [r1] - add r0, r0, #0x100 - ldrsb r0, [r0, #0xa0] - bl CloseSimpleMenu - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #0x1a0] - bl sub_02046D20 - cmp r4, #0 - beq _0203DE10 - cmp r4, #1 - b _0203DE24 -_0203DE10: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x12 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203DE24: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x20 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203DE38: - bl ov11_0230D92C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x13 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203DE50: - bl ov11_0230D220 - cmp r0, #0 - ldreq r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - moveq r1, #0x14 - ldreq r0, [r0] - streq r1, [r0] - b _0203EF9C -_0203DE6C: - add r0, r4, #0xab - add r2, r4, #0xa1 - add r1, r0, #0x100 - add r3, r2, #0x100 - mov r0, #2 - mov r2, #0 - bl ShowKeyboard - bl ov11_02310BDC - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x15 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203DEA0: - bl ov11_0230D220 - cmp r0, #0 - ldreq r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - moveq r1, #0x16 - ldreq r0, [r0] - streq r1, [r0] - b _0203EF9C -_0203DEBC: - bl GetKeyboardStatus - cmp r0, #3 - bne _0203EF9C - bl GetKeyboardStringResult - ldr r2, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, r0 - ldr r0, [r2] - mov r2, #0xa - add r0, r0, #0xab - add r0, r0, #0x100 - bl MemcpySimple - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r2, #0xa - ldr r1, [r0] - add r0, r1, #0xb5 - add r1, r1, #0xab - add r0, r0, #0x100 - add r1, r1, #0x100 - bl StrncpySimpleNoPadSafe - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x17 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203DF1C: - bl sub_02037468 - cmp r0, #0 - beq _0203EF9C - bl ov11_0230D92C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x18 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203DF40: - bl ov11_0230D220 - cmp r0, #0 - ldreq r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - moveq r1, #0x19 - ldreq r0, [r0] - streq r1, [r0] - b _0203EF9C -_0203DF5C: - bl ov11_0230D92C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x1a - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203DF74: - bl ov11_0230D220 - cmp r0, #0 - ldreq r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - moveq r1, #0x1b - ldreq r0, [r0] - streq r1, [r0] - b _0203EF9C -_0203DF90: - add r0, r4, #0xb5 - add r0, r0, #0x100 - bl sub_0203909C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x1c - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203DFB0: - bl sub_0203931C - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r2, [r1] - str r0, [r2, #0x3bc] - ldr r1, [r1] - ldr r0, [r1, #0x3bc] - cmp r0, #0 - movge r0, #0x1d - strge r0, [r1] - b _0203EF9C -_0203DFD8: - bl sub_02039218 - cmp r0, #0 - beq _0203EF9C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r1, [r0] - ldr r0, [r1, #0x3bc] - cmp r0, #0 - beq _0203E000 - cmp r0, #1 - b _0203E02C -_0203E000: - ldr r0, [r1, #0x3b8] - add r1, r1, #0xab - add r0, r0, #0x3a - add r1, r1, #0x100 - mov r2, #0xa - bl MemcpySimple - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x20 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E02C: - mov r0, #0x12 - str r0, [r1] - b _0203EF9C -_0203E038: - ldrsh r0, [r4, #0x38] - mov r2, #0xa - orr r0, r0, #0x80000 - str r0, [r4, #0x8c] - ldr r1, [r1] - add r0, r1, #0xb5 - add r1, r1, #0xab - add r0, r0, #0x100 - add r1, r1, #0x100 - bl StrncpySimpleNoPadSafe - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r2, [r1] - add r0, r2, #0xb5 - add r0, r0, #0x100 - str r0, [r2, #0xc4] - ldr r0, [r1] - ldr r0, [r0, #8] - cmp r0, #2 - ldreq r4, _0203E4F8 ; =0x00000283 - mov r0, #5 - ldrne r4, _0203E4FC ; =0x00000281 - bl sub_02017C50 - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4B8 ; =0x0000101C - ldr r2, [r1] - mov r1, r4 - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x21 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E0BC: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - bl MissionRewardCloseAllBoxes - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #0x22 - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E0EC: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - ldrle r0, [r1] - movle r1, #0x29 - strle r1, [r0] - b _0203EF9C -_0203E10C: - bl sub_02046D20 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r1, [r0] - ldr r0, [r1, #8] - sub r0, r0, #2 - cmp r0, #1 - add r0, r1, #0x40 - bhi _0203E138 - mov r1, #1 - bl ov11_023061E4 - b _0203E13C -_0203E138: - bl ov11_023061CC -_0203E13C: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x1f - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E150: - bl ov11_02306C9C - cmp r0, #3 - cmpne r0, #4 - bne _0203EF9C - bl ov11_02306C64 - cmp r0, #0 - ldreq r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - moveq r1, #0x23 - ldreq r0, [r0] - streq r1, [r0] - beq _0203EF9C - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r2, #0xc - ldr r3, [r1] - str r0, [r3, #0x3b8] - ldr r0, [r1] - str r2, [r0] - b _0203EF9C -_0203E198: - ldrsh r1, [r4, #0x38] - add r0, r4, #0xe8 - bl GetNameRaw - ldr r2, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4B8 ; =0x0000101C - ldr r4, [r2] -#ifdef JAPAN - ldr r1, _0203E8F0 ; =0x00002458 -#else - mov r1, #0x284 -#endif - add r3, r4, #0xe8 - str r3, [r4, #0xc4] - ldr r2, [r2] - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x24 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E1DC: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - bl MissionRewardCloseAllBoxes - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #0x25 - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E20C: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - ldrle r0, [r1] - movle r1, #0x26 - strle r1, [r0] - b _0203EF9C -_0203E22C: - mov r0, #4 - bl sub_02017C50 - mov r0, #0x3e8 - bl AddMoneyCarried - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0x3e8 - ldr r2, [r1] - ldr r0, _0203E4B8 ; =0x0000101C - str r3, [r2, #0xb0] - ldr r2, [r1] - ldr r1, _0203E500 ; =0x00000285 - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x27 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E274: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - bl MissionRewardCloseAllBoxes - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #0x28 - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E2A4: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - ldrle r0, [r1] - movle r1, #0x29 - strle r1, [r0] - b _0203EF9C -_0203E2C4: - ldr r1, [r4, #0x10] - ldr r0, [r4, #0x20] - cmp r1, r0 - movge r0, #0x3a - strge r0, [r4] - bge _0203EF9C - mov r0, #6 - mla r0, r1, r0, r4 - ldrsh r0, [r0, #0x28] - mov r1, #0 - strh r0, [sp, #0x20 + SUB_0203D538_STACK_OFFSET] - strb r1, [sp, #0x1c + SUB_0203D538_STACK_OFFSET] - bl IsStorableItem - cmp r0, #0 - beq _0203E44C - ldrsh r0, [sp, #0x20 + SUB_0203D538_STACK_OFFSET] - bl IsThrownItem - cmp r0, #0 - bne _0203E328 - ldrsh r1, [sp, #0x20 + SUB_0203D538_STACK_OFFSET] - cmp r1, #0x16c - blt _0203E348 - ldr r0, _0203E504 ; =0x0000018F - cmp r1, r0 - bgt _0203E348 -_0203E328: - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r0, #6 - ldr r2, [r1] - ldr r1, [r2, #0x10] - mla r0, r1, r0, r2 - ldrh r0, [r0, #0x26] - strh r0, [sp, #0x1e + SUB_0203D538_STACK_OFFSET] - b _0203E350 -_0203E348: - mov r0, #0 - strh r0, [sp, #0x1e + SUB_0203D538_STACK_OFFSET] -_0203E350: - ldr r3, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r0, #1 - ldr r6, [r3] - strb r0, [sp, #0x1c + SUB_0203D538_STACK_OFFSET] - ldr r1, [r6, #0x10] - mov r0, #6 - mla r5, r1, r0, r6 - ldrh r0, [sp, #0x1c + SUB_0203D538_STACK_OFFSET] - mov r4, #0 - ldr r2, _0203E508 ; =_0209C850 - strh r0, [r5, #0x24] - ldrh r0, [sp, #0x1e + SUB_0203D538_STACK_OFFSET] - add r1, sp, #0x1c + SUB_0203D538_STACK_OFFSET - strh r0, [r5, #0x26] - ldrh r0, [sp, #0x20 + SUB_0203D538_STACK_OFFSET] - strh r0, [r5, #0x28] - ldrsh r0, [sp, #0x20 + SUB_0203D538_STACK_OFFSET] - str r0, [r6, #0x9c] - ldr r0, [r3] - str r4, [r0, #0xb0] - ldr r0, [r3] - add r0, r0, #0xe8 - bl MaybeGetColoredFormattedItemName - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r2, [r0] - add r1, r2, #0xe8 - str r1, [r2, #0xc4] - ldr r2, [r0] - ldrsh r1, [r2, #0x14] - str r1, [r2, #0x8c] - ldr r1, [r0] - ldr r0, [r1, #8] - cmp r0, #0 - beq _0203E440 - cmp r0, #2 - bne _0203E3EC - ldr r4, _0203E50C ; =0x00000296 - bl sub_0203F00C - b _0203E414 -_0203E3EC: - cmp r0, #3 - bne _0203E400 - ldr r4, _0203E510 ; =0x00000297 - bl sub_0203F00C - b _0203E414 -_0203E400: - cmp r0, #4 - ldrne r4, _0203E514 ; =0x00000295 - bne _0203E414 -#ifdef JAPAN - ldr r4, _0203E90C ; =0x0000246C -#else - mov r4, #0x298 -#endif - bl sub_0203F00C -_0203E414: - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4B8 ; =0x0000101C - ldr r2, [r1] - mov r1, r4 - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x2a - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E440: - mov r0, #0x2c - str r0, [r1] - b _0203EF9C -_0203E44C: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x33 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E460: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - bl MissionRewardCloseAllBoxes - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #0x2b - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E490: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - ldrle r0, [r1] - movle r1, #0x2c - strle r1, [r0] - b _0203EF9C - .align 2, 0 -#ifdef JAPAN -#define SUB_0203D538_DATA_OFFSET 0x21D4 -#else -#define SUB_0203D538_DATA_OFFSET 0 -#endif -_0203E4B0: .word MISSION_REWARD_STRUCT_MAIN_PTR -_0203E4B4: .word 0x00000289 + SUB_0203D538_DATA_OFFSET -#ifdef JAPAN -_0203E89C: .word 0x0000245E -_0203E8A0: .word 0x0000245C -#endif -_0203E4B8: .word 0x0000101C -_0203E4BC: .word 0x0000026F + SUB_0203D538_DATA_OFFSET -#ifdef JAPAN -_0203E8AC: .word 0x00002444 -#endif -_0203E4C0: .word 0x00000271 + SUB_0203D538_DATA_OFFSET -_0203E4C4: .word 0x0000026E + SUB_0203D538_DATA_OFFSET -_0203E4C8: .word 0x0000029A + SUB_0203D538_DATA_OFFSET -_0203E4CC: .word 0x00000299 + SUB_0203D538_DATA_OFFSET -_0203E4D0: .word 0x00003008 -_0203E4D4: .word _0209C884 -_0203E4D8: .word _0209C846 -_0203E4DC: .word _0209C844 -_0203E4E0: .word 0x0000027A + SUB_0203D538_DATA_OFFSET -_0203E4E4: .word 0x0000100C -_0203E4E8: .word 0x000002A6 + SUB_0203D538_DATA_OFFSET -_0203E4EC: .word _0209C85C -_0203E4F0: .word 0x00300011 -_0203E4F4: .word _0209C86C -_0203E4F8: .word 0x00000283 + SUB_0203D538_DATA_OFFSET -_0203E4FC: .word 0x00000281 + SUB_0203D538_DATA_OFFSET -#ifdef JAPAN -_0203E8F0: .word 0x00002458 -#endif -_0203E500: .word 0x00000285 + SUB_0203D538_DATA_OFFSET -_0203E504: .word 0x0000018F -_0203E508: .word _0209C850 -_0203E50C: .word 0x00000296 + SUB_0203D538_DATA_OFFSET -_0203E510: .word 0x00000297 + SUB_0203D538_DATA_OFFSET -_0203E514: .word 0x00000295 + SUB_0203D538_DATA_OFFSET -#ifdef JAPAN -_0203E90C: .word 0x0000246C -#endif -_0203E518: - ldr r1, [r4, #0x10] - add r2, r4, #0x24 - mov r0, #6 - mla r0, r1, r0, r2 - bl AddItemToStorage - cmp r0, #0 - beq _0203E5A0 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - ldr r0, [r0, #0xe4] - tst r0, #2 - bne _0203E550 - mov r0, #4 - bl sub_02017C50 -_0203E550: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r2, [r0] - ldr r0, [r2, #0xe4] - tst r0, #4 - bne _0203E588 - ldr r1, _0203EFA8 ; =0x00000273 - add r2, r2, #0x8c - mov r0, #0x1c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x2e - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E588: - tst r0, #8 - movne r0, #0x30 - strne r0, [r2] - moveq r0, #0x33 - streq r0, [r2] - b _0203EF9C -_0203E5A0: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x34 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E5B4: - ldr r2, [r4, #0x10] - mov r0, #6 - mla r1, r2, r0, r4 - ldrsh r2, [r1, #0x28] - mov r1, #0 - strh r2, [sp, #0x1a + SUB_0203D538_STACK_OFFSET] - ldr r2, [r4, #0x10] - mla r0, r2, r0, r4 - ldrh r0, [r0, #0x26] - strh r0, [sp, #0x18 + SUB_0203D538_STACK_OFFSET] - strb r1, [sp, #0x16 + SUB_0203D538_STACK_OFFSET] - bl sub_02046D20 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - ldr r0, [r0, #0xe4] - tst r0, #1 - moveq r1, #1 - movne r1, #0 - add r0, sp, #0x16 + SUB_0203D538_STACK_OFFSET - and r1, r1, #0xff - bl InitUnkStorageStruct0x410 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x35 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E61C: - bl sub_02046028 - cmp r0, #2 - beq _0203E658 - cmp r0, #3 - beq _0203E688 - cmp r0, #4 - bne _0203EF9C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #0x2d - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E658: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - add r0, r0, #0xde - bl sub_02045FD0 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #0x36 - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E688: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - add r0, r0, #0xde - bl sub_02045FD0 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #0x38 - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E6B8: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - ldrle r0, [r1] - movle r1, #0x37 - strle r1, [r0] - b _0203EF9C -_0203E6D8: - ldr r1, [r4, #0x10] - add r2, r4, #0x24 - mov r0, #6 - mla r0, r1, r0, r2 - bl AddItemToStorage - cmp r0, #0 - beq _0203E7D8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - ldr r0, [r0, #0xe4] - tst r0, #2 - bne _0203E710 - mov r0, #4 - bl sub_02017C50 -_0203E710: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #6 - ldr r5, [r0] - mov r6, #0 - ldr r4, [r5, #0x10] - ldr r2, _0203E508 ; =_0209C850 - mla r3, r4, r1, r5 - ldrsh r3, [r3, #0x28] - str r3, [r5, #0x9c] - ldr r3, [r0] - str r6, [r3, #0xb0] - ldr r4, [r0] - ldrsh r3, [r4, #0xdc] - str r3, [r4, #0xa4] - ldr r3, [r0] - str r6, [r3, #0xb8] - ldr r5, [r0] - ldrsh r3, [r5, #0xe2] - add r4, r5, #0x24 - add r0, r5, #0xe8 - strh r3, [sp, #0x14 + SUB_0203D538_STACK_OFFSET] - ldrh r3, [r5, #0xe0] - strb r6, [sp, #0x10 + SUB_0203D538_STACK_OFFSET] - strh r3, [sp, #0x12 + SUB_0203D538_STACK_OFFSET] - ldr r3, [r5, #0x10] - mla r1, r3, r1, r4 - bl MaybeGetColoredFormattedItemName - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r2, _0203E508 ; =_0209C850 - ldr r0, [r0] - add r1, sp, #0x10 + SUB_0203D538_STACK_OFFSET - add r0, r0, #0x138 - bl MaybeGetColoredFormattedItemName - ldr r2, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4B8 ; =0x0000101C - ldr r4, [r2] - ldr r1, _0203EFAC ; =0x00000275 - add r3, r4, #0x138 - str r3, [r4, #0xcc] - ldr r4, [r2] - add r3, r4, #0xe8 - str r3, [r4, #0xc4] - ldr r2, [r2] - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x2e - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E7D8: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x34 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E7EC: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - ldrle r0, [r1] - movle r1, #0x39 - strle r1, [r0] - b _0203EF9C -_0203E80C: - ldr r1, [r4, #0x10] - add r2, r4, #0x24 - mov r0, #6 - mla r0, r1, r0, r2 - bl AddItemToStorage - cmp r0, #0 - beq _0203E8D4 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - ldr r0, [r0, #0xe4] - tst r0, #2 - bne _0203E844 - mov r0, #4 - bl sub_02017C50 -_0203E844: - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r0, #6 - ldr r6, [r1] - mov r5, #0 - ldr r4, [r6, #0x10] - ldr r2, _0203E508 ; =_0209C850 - mla r3, r4, r0, r6 - ldrsh r3, [r3, #0x28] - str r3, [r6, #0x9c] - ldr r3, [r1] - str r5, [r3, #0xb0] - ldr r4, [r1] - ldrsh r3, [r4, #0xdc] - str r3, [r4, #0xa4] - ldr r3, [r1] - str r5, [r3, #0xb8] - ldr r4, [r1] - ldr r3, [r4, #0x10] - add r1, r4, #0x24 - mla r1, r3, r0, r1 - add r0, r4, #0xe8 - bl MaybeGetColoredFormattedItemName - ldr r2, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4B8 ; =0x0000101C - ldr r4, [r2] - ldr r1, _0203EFB0 ; =0x00000277 - add r3, r4, #0xe8 - str r3, [r4, #0xc4] - ldr r2, [r2] - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x2e - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E8D4: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x34 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E8E8: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - bgt _0203EF9C - ldr r2, [r1] - ldr r0, _0203E4B8 ; =0x0000101C - ldr r1, _0203EFB4 ; =0x00000286 - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - add r0, r0, #0xde - bl sub_02045FD0 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x2e - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E934: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - bl MissionRewardCloseAllBoxes - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #0x2f - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E964: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - ldrle r0, [r1] - movle r1, #0x33 - strle r1, [r0] - b _0203EF9C -_0203E984: - ldr r0, _0203E4B8 ; =0x0000101C -#ifdef JAPAN - ldr r1, _0203F34C_JP ; =0x00002FEC - add r2, r4, #0x8c -#else - add r2, r4, #0x8c - mov r1, #0x2cc -#endif - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x31 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E9A8: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - bl MissionRewardCloseAllBoxes - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #0x32 - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203E9D8: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - ldrle r0, [r1] - movle r1, #0x33 - strle r1, [r0] - b _0203EF9C -_0203E9F8: - ldr r0, [r4, #0x10] - add r0, r0, #1 - str r0, [r4, #0x10] - ldr r1, [r1] - ldr r0, [r1, #0x10] - cmp r0, #3 - movlt r0, #0x29 - strlt r0, [r1] - movge r0, #0x3a - strge r0, [r1] - b _0203EF9C -_0203EA24: - ldrb r0, [r4, #0x36] - cmp r0, #0 - moveq r0, #0x40 - streq r0, [r4] - beq _0203EF9C - ldr r0, [r4, #8] - cmp r0, #0 - beq _0203EAAC - cmp r0, #2 - bne _0203EA58 - ldr r4, _0203EFB8 ; =0x00000292 - bl sub_0203F00C - b _0203EA80 -_0203EA58: - cmp r0, #3 - bne _0203EA6C - ldr r4, _0203EFBC ; =0x00000293 - bl sub_0203F00C - b _0203EA80 -_0203EA6C: - cmp r0, #4 - ldrne r4, _0203EFC0 ; =0x00000291 - bne _0203EA80 -#ifdef JAPAN - ldr r4, _0203F35C_JP ; =0x00002468 -#else - mov r4, #0x294 -#endif - bl sub_0203F00C -_0203EA80: - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4B8 ; =0x0000101C - ldr r2, [r1] - mov r1, r4 - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x3b - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203EAAC: - mov r0, #0x3d - str r0, [r4] - b _0203EF9C -_0203EAB8: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - bl MissionRewardCloseAllBoxes - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #0x3c - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203EAE8: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - ldrle r0, [r1] - movle r1, #0x3d - strle r1, [r0] - b _0203EF9C -_0203EB08: - mov r0, #5 - bl sub_02017C50 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - ldrsh r0, [r0, #0x38] - bl SetEggSpecies - mov r0, #4 - bl RandIntSafe - add r0, r0, #6 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bl SetEggHatchTimer - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4B8 ; =0x0000101C - ldr r2, [r1] - ldr r1, _0203EFC4 ; =0x00000272 - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x3e - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203EB64: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - bl MissionRewardCloseAllBoxes - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r3, #0xa - ldr r2, [r0] - mov r1, #0x3f - str r3, [r2, #0x188] - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203EB94: - ldr r2, [r4, #0x188] - sub r0, r2, #1 - str r0, [r4, #0x188] - cmp r2, #0 - ldrle r0, [r1] - movle r1, #0x40 - strle r1, [r0] - b _0203EF9C -_0203EBB4: - ldr r0, [r4, #0x3c] - cmp r0, #0 - moveq r0, #0x4c - streq r0, [r4] - beq _0203EF9C - add r0, sp, #0xcc + SUB_0203D538_STACK_OFFSET_2 - bl InitPreprocessorArgs - bl GetRank - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r2, [r1] - strb r0, [r2, #0xc] - ldr r0, [r1] - ldr r0, [r0, #0x3c] - bl sub_02050C10 - mov r0, #4 - bl sub_02017C50 - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4B8 ; =0x0000101C - ldr r2, [r1] - ldr r1, _0203EFC8 ; =0x000002A1 - ldr r3, [r2, #0x3c] - add r2, sp, #0xcc + SUB_0203D538_STACK_OFFSET_2 - str r3, [sp, #0xf0 + SUB_0203D538_STACK_OFFSET_2] - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x41 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203EC28: - bl sub_02046C78 - cmp r0, #0 - beq _0203EF9C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r4, [r0] - bl GetRank - ldrb r1, [r4, #0xc] - cmp r1, r0 - movne r0, #0x42 - strne r0, [r4] - moveq r0, #0x4c - streq r0, [r4] - b _0203EF9C -_0203EC5C: - mov r0, #2 - bl sub_02017C50 - add r0, sp, #0x7c + SUB_0203D538_STACK_OFFSET_2 - bl InitPreprocessorArgs - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - ldrb r0, [r0, #0xc] - str r0, [sp, #0x94 + SUB_0203D538_STACK_OFFSET_2] - bl GetRank - str r0, [sp, #0x98 + SUB_0203D538_STACK_OFFSET_2] - ldr r0, _0203E4B8 ; =0x0000101C - ldr r1, _0203EFCC ; =0x000002A2 - add r2, sp, #0x7c + SUB_0203D538_STACK_OFFSET_2 - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x43 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203ECA8: - bl sub_02046C78 - cmp r0, #0 - ldrne r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - movne r1, #0x44 - ldrne r0, [r0] - strne r1, [r0] - b _0203EF9C -_0203ECC4: - add r0, sp, #0x2c + SUB_0203D538_STACK_OFFSET_2 - bl InitPreprocessorArgs - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - ldrb r0, [r0, #0xc] - bl GetRankUpEntry - ldr r0, [r0, #8] - str r0, [sp, #0x50 + SUB_0203D538_STACK_OFFSET_2] - bl GetRank - bl GetRankUpEntry - ldr r1, [r0, #8] - ldr r0, [sp, #0x50 + SUB_0203D538_STACK_OFFSET_2] - str r1, [sp, #0x54 + SUB_0203D538_STACK_OFFSET_2] - cmp r0, r1 - ldreq r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - moveq r1, #0x46 - ldreq r0, [r0] - streq r1, [r0] - beq _0203EF9C - ldr r0, _0203E4B8 ; =0x0000101C - ldr r1, _0203EFD0 ; =0x000002A3 - add r2, sp, #0x2c + SUB_0203D538_STACK_OFFSET_2 - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x45 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203ED34: - bl sub_02046C78 - cmp r0, #0 - ldrne r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - movne r1, #0x46 - ldrne r0, [r0] - strne r1, [r0] - b _0203EF9C -_0203ED50: - bl GetRank - bl GetRankUpEntry - ldrsh r0, [r0, #0xc] - strh r0, [r4, #0x88] - cmp r0, #0 - bne _0203ED80 - bl sub_02046D20 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x4c - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203ED80: - bl IsStorableItem - cmp r0, #0 - beq _0203EDFC - ldrsh r0, [r4, #0x88] - bl IsThrownItem - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - strh r0, [r4, #0x86] - mov r0, #1 - strb r0, [r4, #0x84] - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldrsh r3, [r4, #0x88] - ldr r1, [r0] - mov r2, #0 - str r3, [r1, #0x9c] - ldr r1, [r0] - mov r0, #4 - str r2, [r1, #0xb0] - bl sub_02017C50 - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4B8 ; =0x0000101C - ldr r2, [r1] -#ifdef JAPAN - ldr r1, _0203F370 ; =0x00002478 -#else - mov r1, #0x2a4 -#endif - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x47 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203EDFC: - bl sub_02046D20 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x4c - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203EE14: - bl sub_02046C78 - cmp r0, #0 - ldrne r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - movne r1, #0x48 - ldrne r0, [r0] - strne r1, [r0] - b _0203EF9C -_0203EE30: - add r0, r4, #0x84 - bl AddItemToStorage - cmp r0, #0 - ldreq r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - moveq r1, #0x49 - ldreq r0, [r0] - streq r1, [r0] - beq _0203EF9C - bl sub_02046D20 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x4c - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203EE68: - ldrsh r1, [r4, #0x88] - mov r0, #0 - strh r1, [sp, #0xe + SUB_0203D538_STACK_OFFSET] - ldrh r1, [r4, #0x86] - strh r1, [sp, #0xc + SUB_0203D538_STACK_OFFSET] - strb r0, [sp, #0xa + SUB_0203D538_STACK_OFFSET] - bl sub_02046D20 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - ldr r0, [r0, #0xe4] - tst r0, #1 - moveq r1, #1 - movne r1, #0 - add r0, sp, #0xa + SUB_0203D538_STACK_OFFSET - and r1, r1, #0xff - bl InitUnkStorageStruct0x410 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x4a - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203EEBC: - bl sub_02046028 -#ifdef JAPAN - cmp r0, #2 - cmpne r0, #3 - beq _0203EF64 - cmp r0, #4 - bne _0203EF9C - ldr r1, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4B8 ; =0x0000101C - ldr r2, [r1] - ldr r1, _0203EFB4 ; =0x0000245A -#else - mov r4, r0 - cmp r4, #1 - beq _0203EF9C - add r0, sp, #4 - bl sub_02045FD0 - ldrsh r0, [sp, #8] - cmp r0, #0 - bne _0203EF00 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r1, [r0] - ldrh r0, [r1, #0x84] - strh r0, [sp, #4] - ldrh r0, [r1, #0x86] - strh r0, [sp, #6] - ldrh r0, [r1, #0x88] - strh r0, [sp, #8] -_0203EF00: - cmp r4, #2 - cmpne r4, #3 - beq _0203EF64 - cmp r4, #4 - bne _0203EF9C - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r2, _0203E508 ; =_0209C850 - ldr r0, [r0] - add r1, sp, #4 - add r0, r0, #0xe8 - bl MaybeGetColoredFormattedItemName - ldr r2, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, _0203E4B8 ; =0x0000101C - ldr r4, [r2] - ldr r1, _0203EFB4 ; =0x00000286 - add r3, r4, #0xe8 - str r3, [r4, #0xc4] - ldr r2, [r2] -#endif - add r2, r2, #0x8c - bl sub_02046BE8 - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x4b - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203EF64: - ldr r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0x48 - ldr r0, [r0] - str r1, [r0] - b _0203EF9C -_0203EF78: - bl sub_02046C78 - cmp r0, #0 - ldrne r0, _0203E4B0 ; =MISSION_REWARD_STRUCT_MAIN_PTR - movne r1, #0x4c - ldrne r0, [r0] - strne r1, [r0] - b _0203EF9C -_0203EF94: - mov r0, #1 - b _0203EFA0 -_0203EF9C: - mov r0, #0 -_0203EFA0: - add sp, sp, #0x11c + SUB_0203D538_STACK_OFFSET_2 - ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_0203EFA8: .word 0x00000273 + SUB_0203D538_DATA_OFFSET -_0203EFAC: .word 0x00000275 + SUB_0203D538_DATA_OFFSET -_0203EFB0: .word 0x00000277 + SUB_0203D538_DATA_OFFSET -_0203EFB4: .word 0x00000286 + SUB_0203D538_DATA_OFFSET -#ifdef JAPAN -_0203F34C_JP: .word 0x00002FEC -#endif -_0203EFB8: .word 0x00000292 + SUB_0203D538_DATA_OFFSET -_0203EFBC: .word 0x00000293 + SUB_0203D538_DATA_OFFSET -_0203EFC0: .word 0x00000291 + SUB_0203D538_DATA_OFFSET -#ifdef JAPAN -_0203F35C_JP: .word 0x00002468 -#endif -_0203EFC4: .word 0x00000272 + SUB_0203D538_DATA_OFFSET -_0203EFC8: .word 0x000002A1 + SUB_0203D538_DATA_OFFSET -_0203EFCC: .word 0x000002A2 + SUB_0203D538_DATA_OFFSET -_0203EFD0: .word 0x000002A3 + SUB_0203D538_DATA_OFFSET -#ifdef JAPAN -_0203F370: .word 0x00002478 -#endif - arm_func_end sub_0203D538 - - arm_func_start FreeMissionRewardStructMain -FreeMissionRewardStructMain: ; 0x0203EFD4 - stmdb sp!, {r3, lr} - ldr r0, _0203F008 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl MissionRewardCloseAllBoxes - ldr r0, _0203F008 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r0, [r0] - bl MemFree - ldr r0, _0203F008 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mov r1, #0 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_0203F008: .word MISSION_REWARD_STRUCT_MAIN_PTR - arm_func_end FreeMissionRewardStructMain - - arm_func_start sub_0203F00C -sub_0203F00C: ; 0x0203F00C - stmdb sp!, {r3, lr} - ldr r1, _0203F058 ; =MISSION_REWARD_STRUCT_MAIN_PTR - mvn r0, #1 - ldr r1, [r1] - ldrsb r1, [r1, #6] - cmp r1, r0 - ldmneia sp!, {r3, pc} - mov r0, #0 - mov r1, #3 - mov r2, #1 - bl CreatePortraitBox - ldr r1, _0203F058 ; =MISSION_REWARD_STRUCT_MAIN_PTR - ldr r2, [r1] - strb r0, [r2, #6] - ldr r1, [r1] - ldrsb r0, [r1, #6] - add r1, r1, #0x190 - bl ShowPortraitInPortraitBox - ldmia sp!, {r3, pc} - .align 2, 0 -_0203F058: .word MISSION_REWARD_STRUCT_MAIN_PTR - arm_func_end sub_0203F00C - - arm_func_start MissionRewardCloseAllBoxes -MissionRewardCloseAllBoxes: ; 0x0203F05C - stmdb sp!, {r3, lr} - ldr r0, _0203F0EC ; =MISSION_REWARD_STRUCT_MAIN_PTR - mvn r1, #1 - ldr r0, [r0] - ldrsb r0, [r0, #4] - cmp r0, r1 - beq _0203F08C - bl CloseParentMenu - ldr r0, _0203F0EC ; =MISSION_REWARD_STRUCT_MAIN_PTR - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #4] -_0203F08C: - ldr r0, _0203F0EC ; =MISSION_REWARD_STRUCT_MAIN_PTR - mvn r1, #1 - ldr r0, [r0] - ldrsb r0, [r0, #5] - cmp r0, r1 - beq _0203F0B8 - bl CloseDialogueBox - ldr r0, _0203F0EC ; =MISSION_REWARD_STRUCT_MAIN_PTR - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #5] -_0203F0B8: - ldr r0, _0203F0EC ; =MISSION_REWARD_STRUCT_MAIN_PTR - mvn r1, #1 - ldr r0, [r0] - ldrsb r0, [r0, #6] - cmp r0, r1 - beq _0203F0E4 - bl ClosePortraitBox - ldr r0, _0203F0EC ; =MISSION_REWARD_STRUCT_MAIN_PTR - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #6] -_0203F0E4: - bl sub_02046D20 - ldmia sp!, {r3, pc} - .align 2, 0 -_0203F0EC: .word MISSION_REWARD_STRUCT_MAIN_PTR - arm_func_end MissionRewardCloseAllBoxes - - arm_func_start sub_0203F0F0 -sub_0203F0F0: ; 0x0203F0F0 - stmdb sp!, {r4, lr} - ldr r1, _0203F148 ; =_020AFE78 - ldr r2, _0203F14C ; =_0209C89C - ldr r3, [r1] - mov r4, r0 - ldrsh r1, [r3, #0xc] - add r0, r3, #0xdc - add r1, r3, r1, lsl #2 - ldr r1, [r1, #0x14] - mov r1, r1, lsl #1 - ldrh r1, [r2, r1] - bl GetStringFromFileVeneer - ldr r0, _0203F148 ; =_020AFE78 - mov r3, r4 - ldr r4, [r0] - ldrsh r0, [r4, #0xc] - add r1, r4, #0x64 - add r2, r4, #0x30 - add r0, r4, r0, lsl #2 - ldr r0, [r0, #0x14] - bl sub_0205A4B4 - ldmia sp!, {r4, pc} - .align 2, 0 -_0203F148: .word _020AFE78 -_0203F14C: .word _0209C89C - arm_func_end sub_0203F0F0 - - arm_func_start sub_0203F150 -sub_0203F150: ; 0x0203F150 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0xa0 - mov r6, r0 - mov r5, r1 - mov r0, #0xfc - mov r1, #8 - bl MemAlloc - ldr r2, _0203F340 ; =_020AFE78 - mvn r1, #1 - str r0, [r2] - mov ip, #0 - strb r1, [r0] - mov r0, ip -_0203F184: - add r1, ip, #1 - ldr r3, [r2] - mov r1, r1, lsl #0x10 - add r3, r3, ip, lsl #2 - mov ip, r1, asr #0x10 - str r0, [r3, #0x14] - cmp ip, #6 - blt _0203F184 - ldr r3, _0203F344 ; =_0209C8C8 - ldr r2, _0203F340 ; =_020AFE78 - mov r1, #0x18 - ldr ip, [r2] - mla r1, r5, r1, r3 - strh r0, [ip, #0xe] - b _0203F1E0 -_0203F1C0: - ldr r0, [r2] - ldr r3, [r1, lr, lsl #2] - add r0, r0, lr, lsl #2 - str r3, [r0, #0x14] - ldr r3, [r2] - ldrsh r0, [r3, #0xe] - add r0, r0, #1 - strh r0, [r3, #0xe] -_0203F1E0: - ldr ip, [r2] - ldrsh lr, [ip, #0xe] - cmp lr, #6 - bge _0203F1FC - ldr r0, [r1, lr, lsl #2] - cmp r0, #0 - bne _0203F1C0 -_0203F1FC: - mov r3, #0 - strh r3, [ip, #0xc] - ldr r0, _0203F340 ; =_020AFE78 - sub r2, r3, #1 - ldr r1, [r0] - mov ip, #1 - strh r2, [r1, #0x10] - ldr r1, [r0] - strh r3, [r1, #0x12] - ldr r2, [r0] - mov r1, r6 - strb ip, [r2, #0x2c] - ldr r3, [r0] - mov r2, #0x78 - str r5, [r3, #4] - ldr r3, [r0] - str ip, [r3, #8] - ldr r0, [r0] - add r0, r0, #0x64 - bl memcpy - ldr r0, _0203F340 ; =_020AFE78 - ldr r1, _0203F348 ; =0x00000975 - ldr r3, [r0] - mov r0, #0x10 - str r0, [sp, #0x14] - strh r1, [sp, #0x10] - ldrsh r2, [r3, #0xc] - add r0, r3, #0xdc - mov r1, #0xc - str r1, [sp, #0xc] - str r0, [sp, #0x50] - str r2, [sp, #8] - ldrsh r2, [r3, #0xc] - ldr r1, _0203F34C ; =_0209C89C - add r2, r3, r2, lsl #2 - ldr r2, [r2, #0x14] - mov r2, r2, lsl #1 - ldrh r1, [r1, r2] - bl GetStringFromFileVeneer - ldr r0, _0203F340 ; =_020AFE78 - ldr r2, [r0] - ldr r0, [r2, #4] - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0203F324 -_0203F2B0: ; jump table - b _0203F2C0 ; case 0 - b _0203F2C0 ; case 1 - b _0203F2FC ; case 2 - b _0203F2FC ; case 3 -_0203F2C0: - cmp r0, #1 - ldrsh r4, [r2, #0xe] - ldreq r1, _0203F350 ; =0x60481C3B - ldr r0, _0203F354 ; =_0209C8A8 - str r4, [sp] - mov r4, #1 - ldrne r1, _0203F358 ; =0x60489C3B - ldr r3, _0203F35C ; =sub_0203F0F0 - add r2, sp, #8 - str r4, [sp, #4] - bl CreateAdvancedTextBox - ldr r1, _0203F360 ; =sub_0203F928 - mov r4, r0 - bl SetUnkAdvancedTextBoxWindowFn - b _0203F324 -_0203F2FC: - ldrsh r4, [r2, #0xe] - ldr r0, _0203F354 ; =_0209C8A8 - ldr r1, _0203F364 ; =0x60089C3B - str r4, [sp] - mov r4, #1 - ldr r3, _0203F35C ; =sub_0203F0F0 - add r2, sp, #8 - str r4, [sp, #4] - bl CreateAdvancedTextBox - mov r4, r0 -_0203F324: - ldr r0, _0203F340 ; =_020AFE78 - ldr r1, [r0] - strb r4, [r1] - ldr r0, [r0] - ldrsb r0, [r0] - add sp, sp, #0xa0 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0203F340: .word _020AFE78 -_0203F344: .word _0209C8C8 -#ifdef JAPAN -_0203F348: .word 0x00002345 -#else -_0203F348: .word 0x00000975 -#endif -_0203F34C: .word _0209C89C -_0203F350: .word 0x60481C3B -_0203F354: .word _0209C8A8 -_0203F358: .word 0x60489C3B -_0203F35C: .word sub_0203F0F0 -_0203F360: .word sub_0203F928 -_0203F364: .word 0x60089C3B - arm_func_end sub_0203F150 - - arm_func_start sub_0203F368 -sub_0203F368: ; 0x0203F368 - stmdb sp!, {r3, r4, r5, lr} - ldr r2, _0203F394 ; =_020AFE78 - mov r5, r0 - ldr r0, [r2] - mov r4, r1 - add r0, r0, #0x64 - bl sub_0205B0B8 - str r0, [r5] - mov r0, #0xc - str r0, [r4] - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0203F394: .word _020AFE78 - arm_func_end sub_0203F368 - - arm_func_start sub_0203F398 -sub_0203F398: ; 0x0203F398 - stmdb sp!, {r3, r4, r5, lr} - sub sp, sp, #0x10 - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r4, [r0] - cmp r4, #0 - moveq r0, #1 - beq _0203F8CC - ldr r0, [r4, #8] - cmp r0, #4 - addls pc, pc, r0, lsl #2 - b _0203F8C8 -_0203F3C4: ; jump table - b _0203F3D8 ; case 0 - b _0203F404 ; case 1 - b _0203F8C8 ; case 2 - b _0203F83C ; case 3 - b _0203F898 ; case 4 -_0203F3D8: - ldrsb r0, [r4] - bl sub_020307EC - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r0, [r0] - ldrsb r0, [r0] - bl sub_0202810C - ldr r0, _0203F8D4 ; =_020AFE78 - mov r1, #1 - ldr r0, [r0] - str r1, [r0, #8] - b _0203F8C8 -_0203F404: - ldrsb r0, [r4] - mov r1, #0 - bl SetUnkAdvancedTextBoxFn - ldr r0, _0203F8D4 ; =_020AFE78 -#ifdef JAPAN - ldr r1, [r0] - ldrb r0, [r1, #0x2c] - cmp r0, #0 - beq _0203F464 - ldrsb r0, [r1] - ldrsh r1, [r1, #0x12] -#else - ldr r2, [r0] - ldrb r0, [r2, #0x2c] - cmp r0, #0 - beq _0203F464 - ldrsh r0, [r2, #0xc] - add r0, r2, r0, lsl #2 - ldr r0, [r0, #0x14] - cmp r0, #1 - ldreqsh r1, [r2, #0x12] - ldrsb r0, [r2] - movne r1, #0 -#endif - bl sub_02030A50 - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r0, [r0] - ldrsb r0, [r0] - bl SetAdvancedTextBoxField0x1C2 - ldr r0, _0203F8D4 ; =_020AFE78 - mov r1, #0 - ldr r0, [r0] - strb r1, [r0, #0x2c] -_0203F464: - add r1, sp, #0xc - mov r0, #0 - bl sub_02006498 - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r0, [r0] - ldrsb r0, [r0] - bl GetWindowIdPageStart - ldr r1, _0203F8D4 ; =_020AFE78 - ldr r2, [r1] - strh r0, [r2, #0xc] - ldr r3, [r1] - ldrsh r2, [r3, #0xc] - ldrsh r0, [r3, #0x10] - cmp r0, r2 - strneh r2, [r3, #0x10] - ldrne r0, [r1] - movne r1, #1 - strneb r1, [r0, #0x2c] - bne _0203F8C8 - add r0, r3, r2, lsl #2 - ldr r0, [r0, #0x14] - cmp r0, #1 - ldrsb r0, [r3] - bne _0203F7EC - ldr r1, _0203F8D8 ; =sub_0203F368 - bl SetUnkAdvancedTextBoxFn - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r0, [r0] - ldrsb r0, [r0] - bl GetAdvancedTextBoxFlags2 - ldr r1, _0203F8D4 ; =_020AFE78 - mov r4, r0 - ldr r0, [r1] - ldrsb r0, [r0] - bl sub_02028354 - cmp r0, #3 - beq _0203F508 - bl sub_0203F8EC - cmp r0, #0 - movne r1, #1 - bne _0203F50C -_0203F508: - mov r1, #0 -_0203F50C: - ldr r0, _0203F8D4 ; =_020AFE78 - and r5, r1, #0xff - ldr r0, [r0] - ldrsb r0, [r0] - bl IsAdvancedTextBoxActive - cmp r0, #0 - bne _0203F588 - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r0, [r0] - ldrsb r0, [r0] - bl sub_02030908 - cmp r0, #0 - blt _0203F558 - bl sub_0203F8EC - cmp r0, #0 - beq _0203F558 - bl sub_02001808 - cmp r0, #0xa000 - bge _0203F560 -_0203F558: - mov r0, #1 - b _0203F8CC -_0203F560: - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r0, [r0] - ldrsb r0, [r0] - bl sub_0202812C - ldr r0, _0203F8D4 ; =_020AFE78 - mov r1, #3 - ldr r0, [r0] - mov r5, #0 - str r1, [r0, #8] - b _0203F748 -_0203F588: - ldrh r0, [sp, #0xc] - tst r0, #8 - cmpne r5, #0 - beq _0203F5FC - bl sub_0203F8EC - cmp r0, #0 - beq _0203F748 - ldr r0, _0203F8D4 ; =_020AFE78 - mov r1, #0 - ldr r0, [r0] - ldrsb r0, [r0] - bl PlayAdvancedTextBoxInputSound - bl sub_02001808 - cmp r0, #0xa000 - blt _0203F748 - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r0, [r0] - ldrsb r0, [r0] - bl sub_02030EF0 - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r0, [r0] - ldrsb r0, [r0] - bl sub_0202812C - ldr r0, _0203F8D4 ; =_020AFE78 - mov r1, #3 - ldr r0, [r0] - mov r5, #0 - str r1, [r0, #8] - b _0203F748 -_0203F5FC: - tst r0, #0x40 - bne _0203F60C - tst r4, #0x40000 - beq _0203F698 -_0203F60C: - cmp r5, #0 - beq _0203F698 - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r2, [r0] - ldrsh r1, [r2, #0x12] - cmp r1, #0 - bne _0203F660 - ldrsh r1, [r2, #0xba] - cmp r1, #0 - beq _0203F748 - sub r1, r1, #1 - strh r1, [r2, #0xba] - ldr r0, [r0] - mov r1, #1 - strb r1, [r0, #0x2c] - ldrh r0, [sp, #0xc] - tst r0, #0x40 - beq _0203F748 - mov r0, #3 - bl PlaySeVolumeWrapper - b _0203F748 -_0203F660: - ldrsb r0, [r2] - bl sub_02030A64 - cmp r0, #0 - bne _0203F680 - tst r4, #0x40000 - bne _0203F680 - mov r0, #3 - bl PlaySeVolumeWrapper -_0203F680: - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r1, [r0] - ldrsh r0, [r1, #0x12] - sub r0, r0, #1 - strh r0, [r1, #0x12] - b _0203F748 -_0203F698: - tst r0, #0x80 - bne _0203F6A8 - tst r4, #0x80000 - beq _0203F748 -_0203F6A8: - cmp r5, #0 - beq _0203F748 - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r3, [r0] - ldrsh r1, [r3, #0x12] - cmp r1, #8 - bne _0203F708 - ldrsh r2, [r3, #0xba] - add r1, r2, #9 - add r1, r3, r1 - ldrb r1, [r1, #0xbc] - cmp r1, #0 - beq _0203F748 - add r1, r2, #1 - strh r1, [r3, #0xba] - ldr r0, [r0] - mov r1, #1 - strb r1, [r0, #0x2c] - ldrh r0, [sp, #0xc] - tst r0, #0x80 - beq _0203F748 - mov r0, #3 - bl PlaySeVolumeWrapper - b _0203F748 -_0203F708: - ldrsb r0, [r3] - bl sub_02030A64 - cmp r0, #8 - bne _0203F728 - tst r4, #0x80000 - bne _0203F728 - mov r0, #3 - bl PlaySeVolumeWrapper -_0203F728: - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r2, [r0] - ldrsh r0, [r2, #0x12] - add r1, r0, #1 - add r0, r2, r1 - ldrb r0, [r0, #0xbc] - cmp r0, #0 - strneh r1, [r2, #0x12] -_0203F748: - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r1, [r0] - ldrsh r0, [r1, #0xba] - add r0, r0, #9 - add r0, r1, r0 - ldrb r0, [r0, #0xbc] - cmp r0, #0 - ldrsb r0, [r1] - mov r1, #0x40000000 - beq _0203F778 - bl sub_02030A90 - b _0203F77C -_0203F778: - bl sub_02030A74 -_0203F77C: - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r1, [r0] - ldrsh r0, [r1, #0xba] - cmp r0, #0 - ldrsb r0, [r1] - mov r1, #0x20000000 - bne _0203F7A0 - bl sub_02030A74 - b _0203F7A4 -_0203F7A0: - bl sub_02030A90 -_0203F7A4: - cmp r5, #0 - beq _0203F7D8 - ldr r0, _0203F8D4 ; =_020AFE78 - mov r3, #0xc - ldr r0, [r0] - mov r1, #1 - ldrsh r4, [r0, #0x12] - ldrsb r0, [r0] - mov r2, #3 - smulbb r3, r4, r3 - add r3, r3, #0x11 - bl sub_02030978 - b _0203F8C8 -_0203F7D8: - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r0, [r0] - ldrsb r0, [r0] - bl sub_020288DC - b _0203F8C8 -_0203F7EC: - mov r1, #0x20000000 - bl sub_02030A74 - ldr r0, _0203F8D4 ; =_020AFE78 - mov r1, #0x40000000 - ldr r0, [r0] - ldrsb r0, [r0] - bl sub_02030A74 - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r0, [r0] - ldrsb r0, [r0] - bl IsAdvancedTextBoxActive - cmp r0, #0 - beq _0203F834 - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r0, [r0] - ldrsb r0, [r0] - bl sub_020288DC - b _0203F8C8 -_0203F834: - mov r0, #1 - b _0203F8CC -_0203F83C: - ldrsh r2, [r4, #0xba] - ldrsh r0, [r4, #0x12] - ldr r3, _0203F8DC ; =_0209E912 - ldr r1, _0203F8E0 ; =STATUSES_FULL_DESCRIPTION_STRING_IDS - add r0, r2, r0 - add r0, r4, r0 - ldrb r4, [r0, #0xbc] - mov r2, #0 - ldr r0, _0203F8E4 ; =_0209C8B8 - mov r5, r4, lsl #2 - ldrh r4, [r3, r5] - ldrh r3, [r1, r5] - ldr r1, _0203F8E8 ; =0x00001013 - stmia sp, {r2, r4} - str r2, [sp, #8] - bl CreateScrollBoxSingle - ldr r1, _0203F8D4 ; =_020AFE78 - mov r2, #4 - ldr r3, [r1] - strb r0, [r3, #1] - ldr r0, [r1] - str r2, [r0, #8] - b _0203F8C8 -_0203F898: - ldrsb r0, [r4, #1] - bl IsScrollBoxActive - cmp r0, #0 - bne _0203F8C8 - ldr r0, _0203F8D4 ; =_020AFE78 - ldr r0, [r0] - ldrsb r0, [r0, #1] - bl CloseScrollBox - ldr r0, _0203F8D4 ; =_020AFE78 - mov r1, #0 - ldr r0, [r0] - str r1, [r0, #8] -_0203F8C8: - mov r0, #0 -_0203F8CC: - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0203F8D4: .word _020AFE78 -_0203F8D8: .word sub_0203F368 -_0203F8DC: .word _0209E912 -_0203F8E0: .word STATUSES_FULL_DESCRIPTION_STRING_IDS -_0203F8E4: .word _0209C8B8 -_0203F8E8: .word 0x00001013 - arm_func_end sub_0203F398 - - arm_func_start sub_0203F8EC -sub_0203F8EC: ; 0x0203F8EC - ldr r0, _0203F924 ; =_020AFE78 - mov r1, #0 - ldr r2, [r0] - b _0203F914 -_0203F8FC: - add r0, r2, r1 - ldrb r0, [r0, #0xbc] - cmp r0, #0 - movne r0, #1 - bxne lr - add r1, r1, #1 -_0203F914: - cmp r1, #0x1e - blt _0203F8FC - mov r0, #0 - bx lr - .align 2, 0 -_0203F924: .word _020AFE78 - arm_func_end sub_0203F8EC - - arm_func_start sub_0203F928 -sub_0203F928: ; 0x0203F928 - stmdb sp!, {r4, lr} - mov r4, r0 - cmp r1, #0 - ldmeqia sp!, {r4, pc} - bl sub_02030908 - ldr r2, _0203F970 ; =_020AFE78 - mov r3, #0xc - ldr ip, [r2] - mov r1, #1 - strh r0, [ip, #0x12] - ldr r2, [r2] - mov r0, r4 - ldrsh ip, [r2, #0x12] - mov r2, #3 - smulbb r3, ip, r3 - add r3, r3, #0x11 - bl sub_02030978 - ldmia sp!, {r4, pc} - .align 2, 0 -_0203F970: .word _020AFE78 - arm_func_end sub_0203F928 - - arm_func_start sub_0203F974 -sub_0203F974: ; 0x0203F974 - ldr r0, _0203F988 ; =_020AFE78 - ldr ip, _0203F98C ; =SetAdvancedTextBoxState5 - ldr r0, [r0] - ldrsb r0, [r0] - bx ip - .align 2, 0 -_0203F988: .word _020AFE78 -_0203F98C: .word SetAdvancedTextBoxState5 - arm_func_end sub_0203F974 - - arm_func_start sub_0203F990 -sub_0203F990: ; 0x0203F990 - stmdb sp!, {r3, lr} - ldr r0, _0203F9C8 ; =_020AFE78 - ldr r0, [r0] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - ldrsb r0, [r0] - bl CloseAdvancedTextBox - ldr r0, _0203F9C8 ; =_020AFE78 - ldr r0, [r0] - bl MemFree - ldr r0, _0203F9C8 ; =_020AFE78 - mov r1, #0 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_0203F9C8: .word _020AFE78 - arm_func_end sub_0203F990 - - arm_func_start sub_0203F9CC -sub_0203F9CC: ; 0x0203F9CC - stmdb sp!, {r3, r4, r5, lr} - ldr r1, _0203FA50 ; =_022AADFC - mov r2, #0 - mov r5, r0 - str r2, [r1] - ldr r4, [r5, #0xb4] - ldr r0, _0203FA54 ; =_022AAE00 - mov r1, r4 - bl GetMonsterName - ldr r0, _0203FA58 ; =_022AAE2A -#ifdef JAPAN - add r1, r4, #0x120 -#else - add r1, r4, #0x124 -#endif - mov r2, #0x22 - bl memcpy - ldrb r2, [r4, #7] - ldr r1, _0203FA50 ; =_022AADFC - mov r0, #0 - strb r2, [r1, #0x2c] - str r5, [r1] - strb r0, [r1, #0x58] - ldrsh r2, [r4, #4] - ldr r0, _0203FA5C ; =0x000001A2 - ldr r3, _0203FA60 ; =_022AAE58 - cmp r2, r0 - moveq r0, #1 - streqb r0, [r1, #0x58] - ldrsh r1, [r4, #2] - ldr r0, _0203FA50 ; =_022AADFC - strh r1, [r0, #0x5a] - add r0, r4, #0x9c - ldmia r0, {r0, r1, r2} - stmia r3, {r0, r1, r2} - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0203FA50: .word _022AADFC -_0203FA54: .word _022AAE00 -_0203FA58: .word _022AAE2A -_0203FA5C: .word 0x000001A2 -_0203FA60: .word _022AAE58 - arm_func_end sub_0203F9CC - - arm_func_start sub_0203FA64 -sub_0203FA64: ; 0x0203FA64 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x14 - ldr r1, _0203FBBC ; =TEAM_MEMBER_TABLE_PTR - mov sl, r0 - mov r0, #0x44 - smulbb r2, sl, r0 - ldr r1, [r1] - mov r4, #0x46 - ldrb r0, [r1, r2] - add r8, r1, r2 - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - moveq r0, #0 - beq _0203FBB4 - ldr r1, _0203FBC0 ; =_022AADFC - mov r2, #0 - mov r0, sl - str r2, [r1] - bl sub_02056410 - cmp r0, #0 - mov r0, sl - beq _0203FAD4 - bl sub_020564B0 - cmp r0, #0 - movne r4, #0x59 - b _0203FAE4 -_0203FAD4: - bl sub_02056F60 - cmp r0, #0 - movne r4, #0x44 - moveq r4, #0x57 -_0203FAE4: - add r0, sp, #0 - add r1, r8, #0x3a - mov r2, #0xa - bl StrncpySimpleNoPadSafe - ldr r0, _0203FBC4 ; =_022AAE00 - ldr r1, _0203FBC8 ; =_0209C96C - add r3, sp, #0 - and r2, r4, #0xff - bl SprintfStatic__0204174C - ldrsh r1, [r8, #4] - ldr r0, _0203FBC0 ; =_022AADFC - ldr r3, _0203FBCC ; =_022AAE58 - strh r1, [r0, #0x5a] - add r4, r8, #0x14 - ldmia r4, {r0, r1, r2} - stmia r3, {r0, r1, r2} - ldrsh r0, [r8, #4] - mov r1, r4 - bl GetPpIncrease - mov r6, #0 - ldr r5, _0203FBD0 ; =_022AAE2A - ldr r4, _0203FBC0 ; =_022AADFC - mov r7, r0 - mov fp, r6 -_0203FB44: - mov r0, #6 - mla sb, r6, r0, r8 - ldrh r1, [sb, #0x24] - add r0, r5, r6, lsl #3 - bl InitMove - ldrb r1, [sb, #0x22] - add r2, r4, r6, lsl #3 - add r0, r5, r6, lsl #3 - strb r1, [r2, #0x2e] - strh r7, [r2, #0x30] - strb fp, [r2, #0x34] - ldrb r1, [sb, #0x26] - strb r1, [r2, #0x35] - bl GetMaxPp - add r1, r6, #1 - add r2, r4, r6, lsl #3 - mov r1, r1, lsl #0x10 - mov r6, r1, lsr #0x10 - strb r0, [r2, #0x34] - cmp r6, #4 - blo _0203FB44 - mov r0, sl - bl sub_020564B0 - ldr r1, _0203FBC0 ; =_022AADFC - strb r0, [r1, #0x2c] - ldrsh r0, [r8, #4] - bl sub_02041724 - mov r0, #1 -_0203FBB4: - add sp, sp, #0x14 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0203FBBC: .word TEAM_MEMBER_TABLE_PTR -_0203FBC0: .word _022AADFC -_0203FBC4: .word _022AAE00 -_0203FBC8: .word _0209C96C -_0203FBCC: .word _022AAE58 -_0203FBD0: .word _022AAE2A - arm_func_end sub_0203FA64 - - arm_func_start sub_0203FBD4 -sub_0203FBD4: ; 0x0203FBD4 - stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} - sub sp, sp, #0x14 - ldr r1, _0203FCFC ; =TEAM_MEMBER_TABLE_PTR - mov r2, #0x68 - ldr r1, [r1] - ldr r3, _0203FD00 ; =_022AADFC - add r1, r1, #0x9000 - ldr r1, [r1, #0x84c] - mov r4, #0 - smlabb r8, r0, r2, r1 - str r4, [r3] - ldrsh r0, [r8, #8] - sub r1, r4, #1 - cmp r0, r1 - streqb r4, [r3, #0x2c] - beq _0203FC20 - bl sub_020564B0 - ldr r1, _0203FD00 ; =_022AADFC - strb r0, [r1, #0x2c] -_0203FC20: - ldr r0, _0203FD00 ; =_022AADFC - add r1, r8, #0x5e - ldrb r0, [r0, #0x2c] - mov r2, #0xa - cmp r0, #0 - movne r4, #0x59 - add r0, sp, #0 - moveq r4, #0x46 - bl StrncpySimpleNoPadSafe - ldr r0, _0203FD04 ; =_022AAE00 - ldr r1, _0203FD08 ; =_0209C96C - add r3, sp, #0 - and r2, r4, #0xff - bl SprintfStatic__0204174C - ldrsh r0, [r8, #0xc] - add r1, r8, #0x4c - bl GetPpIncrease - ldr r5, _0203FD0C ; =_022AAE2A - ldr r4, _0203FD00 ; =_022AADFC - mov r7, r0 - mov r6, #0 -_0203FC74: - add r0, r8, r6, lsl #3 - ldrh r1, [r0, #0x20] - add r0, r5, r6, lsl #3 - bl InitMove - add r3, r8, r6, lsl #3 - ldrb r1, [r3, #0x1c] - add r2, r4, r6, lsl #3 - add r0, r5, r6, lsl #3 - strb r1, [r2, #0x2e] - strh r7, [r2, #0x30] - ldrb r1, [r3, #0x22] - strb r1, [r2, #0x34] - ldrb r1, [r3, #0x23] - strb r1, [r2, #0x35] - bl GetMaxPp - add r1, r6, #1 - add r2, r4, r6, lsl #3 - mov r1, r1, lsl #0x10 - mov r6, r1, lsr #0x10 - strb r0, [r2, #0x34] - cmp r6, #4 - blo _0203FC74 - ldrsh r0, [r8, #0xc] - bl sub_02041724 - ldrsh r1, [r8, #0xc] - ldr r0, _0203FD00 ; =_022AADFC - ldr r3, _0203FD10 ; =_022AAE58 - strh r1, [r0, #0x5a] - add r0, r8, #0x4c - ldmia r0, {r0, r1, r2} - stmia r3, {r0, r1, r2} - mov r0, #1 - add sp, sp, #0x14 - ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} - .align 2, 0 -_0203FCFC: .word TEAM_MEMBER_TABLE_PTR -_0203FD00: .word _022AADFC -_0203FD04: .word _022AAE00 -_0203FD08: .word _0209C96C -_0203FD0C: .word _022AAE2A -_0203FD10: .word _022AAE58 - arm_func_end sub_0203FBD4 - - arm_func_start sub_0203FD14 -sub_0203FD14: ; 0x0203FD14 - ldr ip, _0203FD24 ; =InitMove - mov r1, r0 - ldr r0, _0203FD28 ; =LAST_NEW_MOVE - bx ip - .align 2, 0 -_0203FD24: .word InitMove -_0203FD28: .word LAST_NEW_MOVE - arm_func_end sub_0203FD14 - - arm_func_start sub_0203FD2C -sub_0203FD2C: ; 0x0203FD2C - ldr r0, _0203FD34 ; =LAST_NEW_MOVE - bx lr - .align 2, 0 -_0203FD34: .word LAST_NEW_MOVE - arm_func_end sub_0203FD2C - - arm_func_start sub_0203FD38 -sub_0203FD38: ; 0x0203FD38 - ldr r0, _0203FD40 ; =_022AAE2A - bx lr - .align 2, 0 -_0203FD40: .word _022AAE2A - arm_func_end sub_0203FD38 - - arm_func_start sub_0203FD44 -sub_0203FD44: ; 0x0203FD44 - stmdb sp!, {r4, lr} - ldr r4, [r0, #0xb4] - ldr r1, _0203FD74 ; =_022AAE2A -#ifdef JAPAN - add r0, r4, #0x120 -#else - add r0, r4, #0x124 -#endif - mov r2, #0x22 - bl memcpy - ldr r1, _0203FD78 ; =_022AADFC - ldr r0, _0203FD7C ; =_020AFE7C - ldrb r1, [r1, #0x2c] - strb r1, [r4, #7] - ldrsh r0, [r0, #2] - ldmia sp!, {r4, pc} - .align 2, 0 -_0203FD74: .word _022AAE2A -_0203FD78: .word _022AADFC -_0203FD7C: .word _020AFE7C - arm_func_end sub_0203FD44 - - arm_func_start sub_0203FD80 -sub_0203FD80: ; 0x0203FD80 - stmdb sp!, {r3, r4, r5, lr} - ldr r2, _0203FDE0 ; =TEAM_MEMBER_TABLE_PTR - mov r1, #0x44 - ldr r2, [r2] - ldr ip, _0203FDE4 ; =_022AADFC - mla r5, r0, r1, r2 - mov r4, #0 - mov r0, #6 -_0203FDA0: - mla lr, r4, r0, r5 - add r3, ip, r4, lsl #3 - ldrb r2, [r3, #0x2e] - add r1, r4, #1 - mov r1, r1, lsl #0x10 - strb r2, [lr, #0x22] - ldrh r2, [r3, #0x32] - mov r4, r1, lsr #0x10 - cmp r4, #4 - strh r2, [lr, #0x24] - ldrb r1, [r3, #0x35] - strb r1, [lr, #0x26] - blo _0203FDA0 - ldr r0, _0203FDE8 ; =_020AFE7C - ldrsh r0, [r0, #2] - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0203FDE0: .word TEAM_MEMBER_TABLE_PTR -_0203FDE4: .word _022AADFC -_0203FDE8: .word _020AFE7C - arm_func_end sub_0203FD80 - - arm_func_start sub_0203FDEC -sub_0203FDEC: ; 0x0203FDEC - stmdb sp!, {r4, lr} - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetActiveTeamMember - ldr lr, _0203FE54 ; =_022AADFC - mov r4, #0 -_0203FE04: - add ip, lr, r4, lsl #3 - ldrb r2, [ip, #0x2e] - add r3, r0, r4, lsl #3 - add r1, r4, #1 - strb r2, [r3, #0x1c] - ldrh r2, [ip, #0x30] - mov r1, r1, lsl #0x10 - mov r4, r1, lsr #0x10 - strh r2, [r3, #0x1e] - ldrh r1, [ip, #0x32] - cmp r4, #4 - strh r1, [r3, #0x20] - ldrb r1, [ip, #0x34] - strb r1, [r3, #0x22] - ldrb r1, [ip, #0x35] - strb r1, [r3, #0x23] - blo _0203FE04 - ldr r0, _0203FE58 ; =_020AFE7C - ldrsh r0, [r0, #2] - ldmia sp!, {r4, pc} - .align 2, 0 -_0203FE54: .word _022AADFC -_0203FE58: .word _020AFE7C - arm_func_end sub_0203FDEC - - arm_func_start sub_0203FE5C -sub_0203FE5C: ; 0x0203FE5C - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #8 - mov r7, r0 - mov r6, r1 - mov r0, #0x3fc - mov r1, #8 - mov r5, r2 - mov r4, r3 - bl MemAlloc - ldr r1, _02040154 ; =_020AFE7C - mvn r2, #1 - str r0, [r1, #8] - strb r2, [r0] - ldr r0, [r1, #0xc] - ldr r2, _02040154 ; =_020AFE7C - cmp r0, r7 - strne r7, [r1, #0xc] - movne r0, #0 - strneh r0, [r1, #2] - ldr r0, _02040154 ; =_020AFE7C - ldr r3, _02040158 ; =0x00000A3E - ldrsh r1, [r0, #4] - mov r7, #0x17 - cmp r1, r6 - strneh r6, [r0, #4] - movne r1, #0 - strneh r1, [r0, #2] - ldr r0, [r2, #8] - mov r1, #0x10 - str r1, [r0, #0x10] - ldr r0, [r2, #8] - str r1, [r0, #8] - ldr r0, [r2, #8] - mov r1, #0 - strh r3, [r0, #0xc] - ldr r0, [r2, #8] - ldr r3, _0204015C ; =_022AAE00 - str r7, [r0, #0x98] - ldr r0, [r2, #8] - str r1, [r0, #0x64] - ldr r0, [r2, #8] - str r3, [r0, #0x4c] - ldr r0, [r2, #8] - strb r1, [r0, #0x3f8] - ldr r0, [r2, #8] - str r4, [r0, #0x3f4] - ldr r0, [r2, #0xc] - cmp r0, #7 - addls pc, pc, r0, lsl #2 - b _0203FF44 -_0203FF24: ; jump table - b _02040084 ; case 0 - b _0203FF44 ; case 1 - b _0203FFAC ; case 2 - b _0204003C ; case 3 - b _0203FF44 ; case 4 - b _0203FF44 ; case 5 - b _0203FFF4 ; case 6 - b _0203FF7C ; case 7 -_0203FF44: - mov r1, #0 - str r1, [sp] - ldr r0, _02040154 ; =_020AFE7C - str r1, [sp, #4] - ldr r2, [r0, #8] - ldr r0, _02040160 ; =_0209C93C - ldr r1, _02040164 ; =0x00401803 - ldr r3, _02040168 ; =sub_020401A8 - add r2, r2, #4 - bl CreateAdvancedTextBox - ldr r1, _02040154 ; =_020AFE7C - ldr r1, [r1, #8] - strb r0, [r1] - b _020400FC -_0203FF7C: - str r1, [sp] - str r1, [sp, #4] - ldr r2, [r2, #8] - ldr r0, _0204016C ; =_0209C94C - ldr r1, _02040170 ; =0x00400800 - ldr r3, _02040168 ; =sub_020401A8 - add r2, r2, #4 - bl CreateAdvancedTextBox - ldr r1, _02040154 ; =_020AFE7C - ldr r1, [r1, #8] - strb r0, [r1] - b _020400FC -_0203FFAC: - ldr r0, [r2, #8] - mov r3, #1 - strb r3, [r0, #0x3f8] - ldr r4, [r2, #8] - ldr r0, _02040174 ; =_0209C92C - add r3, r4, #0x3e0 - str r3, [r4, #0x64] - str r1, [sp] - str r1, [sp, #4] - ldr r2, [r2, #8] - ldr r1, _02040164 ; =0x00401803 - ldr r3, _02040168 ; =sub_020401A8 - add r2, r2, #4 - bl CreateAdvancedTextBox - ldr r1, _02040154 ; =_020AFE7C - ldr r1, [r1, #8] - strb r0, [r1] - b _020400FC -_0203FFF4: - ldr r0, [r2, #8] - mov r3, #1 - strb r3, [r0, #0x3f8] - ldr r4, [r2, #8] - ldr r0, _02040174 ; =_0209C92C - add r3, r4, #0x3e0 - str r3, [r4, #0x64] - str r1, [sp] - str r1, [sp, #4] - ldr r2, [r2, #8] - ldr r1, _02040178 ; =0x00401A03 - ldr r3, _02040168 ; =sub_020401A8 - add r2, r2, #4 - bl CreateAdvancedTextBox - ldr r1, _02040154 ; =_020AFE7C - ldr r1, [r1, #8] - strb r0, [r1] - b _020400FC -_0204003C: - ldr r0, [r2, #8] - mov r3, #1 - strb r3, [r0, #0x3f8] - ldr r4, [r2, #8] - ldr r0, _0204017C ; =_0209C95C - add r3, r4, #0x3e0 - str r3, [r4, #0x64] - str r1, [sp] - str r1, [sp, #4] - ldr r2, [r2, #8] - ldr r1, _02040180 ; =0x00400A00 - ldr r3, _02040168 ; =sub_020401A8 - add r2, r2, #4 - bl CreateAdvancedTextBox - ldr r1, _02040154 ; =_020AFE7C - ldr r1, [r1, #8] - strb r0, [r1] - b _020400FC -_02040084: - cmp r6, #1 - ble _020400C8 - ldr r1, [r2, #8] - mov r0, #1 - str r5, [r1, #4] - str r6, [sp] - str r0, [sp, #4] - ldr r2, [r2, #8] - ldr r0, _02040160 ; =_0209C93C - ldr r1, _02040184 ; =0x00409823 - ldr r3, _02040168 ; =sub_020401A8 - add r2, r2, #4 - bl CreateAdvancedTextBox - ldr r1, _02040154 ; =_020AFE7C - ldr r1, [r1, #8] - strb r0, [r1] - b _020400FC -_020400C8: - ldr r3, [r2, #8] - ldr r0, _02040160 ; =_0209C93C - str r1, [r3, #4] - str r1, [sp] - str r1, [sp, #4] - ldr r2, [r2, #8] - ldr r1, _02040188 ; =0x00401823 - ldr r3, _02040168 ; =sub_020401A8 - add r2, r2, #4 - bl CreateAdvancedTextBox - ldr r1, _02040154 ; =_020AFE7C - ldr r1, [r1, #8] - strb r0, [r1] -_020400FC: - ldr r0, _02040154 ; =_020AFE7C - ldr r0, [r0, #8] - ldrsb r0, [r0] - bl GetWindowIdPageStart - ldr r1, _02040154 ; =_020AFE7C - ldr r1, [r1, #8] - add r1, r1, #0x300 - strh r0, [r1, #0xe8] - mov r0, #1 - bl sub_0204027C - bl PrintMoveOptionMenu - ldr r1, _02040154 ; =_020AFE7C - mov r2, #0 - ldr r0, [r1, #8] - strb r2, [r0, #0x3e5] - ldr r0, [r1, #8] - add r0, r0, #0x300 - strh r2, [r0, #0xe6] - ldr r0, [r1, #8] - ldrsb r0, [r0] - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_02040154: .word _020AFE7C -#ifdef JAPAN -_02040158: .word 0x00000879 -#else -_02040158: .word 0x00000A3E -#endif -_0204015C: .word _022AAE00 -_02040160: .word _0209C93C -_02040164: .word 0x00401803 -_02040168: .word sub_020401A8 -_0204016C: .word _0209C94C -_02040170: .word 0x00400800 -_02040174: .word _0209C92C -_02040178: .word 0x00401A03 -_0204017C: .word _0209C95C -_02040180: .word 0x00400A00 -_02040184: .word 0x00409823 -_02040188: .word 0x00401823 - arm_func_end sub_0203FE5C - - arm_func_start sub_0204018C -sub_0204018C: ; 0x0204018C - ldr ip, _02040198 ; =sub_0203FE5C - mov r3, #0 - bx ip - .align 2, 0 -_02040198: .word sub_0203FE5C - arm_func_end sub_0204018C - - arm_func_start sub_0204019C -sub_0204019C: ; 0x0204019C - ldr ip, _020401A4 ; =sub_0203FE5C - bx ip - .align 2, 0 -_020401A4: .word sub_0203FE5C - arm_func_end sub_0204019C - - arm_func_start sub_020401A8 -sub_020401A8: ; 0x020401A8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov sl, r0 - bl sub_02027B1C - ldr r4, _02040274 ; =_020AFE7C - mov sb, #0 - ldr r0, [r4, #8] - ldr r7, _02040278 ; =_022AADFC - ldr r0, [r0, #0x10] - mov fp, #8 - mov r0, r0, lsl #0x10 - mov r8, r0, asr #0x10 - mov r6, #0xd - mov r5, #0x17 - b _02040250 -_020401E0: - add r0, r7, sb, lsl #3 - ldrb r0, [r0, #0x2e] - tst r0, #2 - add r0, r2, sb, lsl #3 - movne r1, r6 - ldr r3, [r0, #0xa8] - moveq r1, fp - mov r0, sl - add r2, r8, #2 - bl DrawTextInWindow - cmp sb, #0 - ble _02040238 - add r0, r7, sb, lsl #3 - ldrb r0, [r0, #0x2e] - tst r0, #2 - bne _02040238 - mov r0, sl - mov r1, #0x10 - mov r2, r8 - mov r3, #0x7e - str r5, [sp] - bl sub_02025D50 -_02040238: - add r0, r8, #0x10 - add r1, sb, #1 - mov r0, r0, lsl #0x10 - mov r1, r1, lsl #0x10 - mov r8, r0, asr #0x10 - mov sb, r1, asr #0x10 -_02040250: - ldr r2, [r4, #8] - ldrsh r0, [r2, #0xa4] - cmp sb, r0 - blt _020401E0 - mov r0, #1 - bl sub_0204027C - mov r0, sl - bl UpdateWindow - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02040274: .word _020AFE7C -_02040278: .word _022AADFC - arm_func_end sub_020401A8 - - arm_func_start sub_0204027C -sub_0204027C: ; 0x0204027C - cmp r0, #0 - ldrne r0, _020402BC ; =_020AFE7C - movne r3, #2 - ldrne r2, [r0, #8] - ldreq r0, _020402BC ; =_020AFE7C - moveq r3, #1 - ldreq r2, [r0, #8] - movne r1, #1 - str r3, [r2, #0x3ec] - ldr r0, [r0, #8] - moveq r1, #2 - str r1, [r0, #0x3f0] - ldr r0, _020402BC ; =_020AFE7C - ldr r0, [r0, #0xc] - cmp r0, #7 - bx lr - .align 2, 0 -_020402BC: .word _020AFE7C - arm_func_end sub_0204027C - - arm_func_start PrintMoveOptionMenu -PrintMoveOptionMenu: ; 0x020402C0 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x5c - ldr r0, _020407AC ; =_020AFE7C - ldr r2, _020407B0 ; =_022AAE00 - ldr r1, [r0, #8] - str r2, [r1, #0x4c] - ldr r1, [r0, #0xc] - cmp r1, #2 - cmpne r1, #3 - cmpne r1, #6 - beq _020402FC - ldrsh r1, [r0, #2] - cmp r1, #4 - movge r1, #0 - strgeh r1, [r0, #2] -_020402FC: - ldr r0, _020407AC ; =_020AFE7C - ldrsh r0, [r0, #2] - bl sub_020410A4 - ldr r1, _020407AC ; =_020AFE7C - mov r0, #0 - ldr r1, [r1, #8] - strh r0, [r1, #0xa4] -_02040318: - ldr r1, _020407AC ; =_020AFE7C - ldr r2, _020407B4 ; =_022AAE2A - ldr r1, [r1, #8] - mov r3, #0 - add r1, r1, r0 - strb r3, [r1, #0x3e0] - ldrb r1, [r2, r0, lsl #3] - add r4, r2, r0, lsl #3 - tst r1, #1 - movne r3, #1 - tst r3, #0xff - beq _020403B4 - ldr r1, _020407AC ; =_020AFE7C - ldr r3, [r1, #8] - ldrsh r2, [r3, #0xa4] - add r2, r2, #1 - strh r2, [r3, #0xa4] - ldr r5, [r1, #8] - ldrb r1, [r5, #0x3f8] - cmp r1, #0 - ldrne r2, [r5, #0x3f4] - cmpne r2, #0 - beq _020403C8 - ldrh r1, [r4, #4] - b _02040388 -_0204037C: - cmp r3, r1 - beq _02040394 - add r2, r2, #2 -_02040388: - ldrh r3, [r2] - cmp r3, #0 - bne _0204037C -_02040394: - cmp r3, #0 - movne r1, #1 - moveq r1, #0 - tst r1, #0xff - addne r1, r5, r0 - movne r2, #3 - strneb r2, [r1, #0x3e0] - b _020403C8 -_020403B4: - ldr r1, _020407AC ; =_020AFE7C - ldrsh r2, [r1, #2] - cmp r0, r2 - moveq r2, #0 - streqh r2, [r1, #2] -_020403C8: - add r0, r0, #1 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - cmp r0, #4 - blt _02040318 - ldr r1, _020407AC ; =_020AFE7C - mov r0, #0 - ldr r2, [r1, #8] - strb r0, [r2, #0x3e4] - ldr r2, [r1, #8] - ldrb r1, [r2, #0x3f8] - cmp r1, #0 - ldrne r1, [r2, #0x3f4] - cmpne r1, #0 - beq _020404B4 -_02040404: - ldr r1, _020407AC ; =_020AFE7C - ldr r3, _020407B4 ; =_022AAE2A - ldr r2, [r1, #8] - add r2, r2, r0 - ldrb r2, [r2, #0x3e0] - tst r2, #1 - beq _020404A0 - ldrb r2, [r3, r0, lsl #3] - tst r2, #2 - beq _02040464 - sub r6, r0, #1 - mov r5, #3 - ldr r3, _020407B8 ; =_022AADFC - b _0204045C -_0204043C: - ldr r4, [r1, #8] - add r2, r3, r6, lsl #3 - add r4, r4, r6 - strb r5, [r4, #0x3e0] - ldrb r2, [r2, #0x2e] - tst r2, #2 - beq _02040464 - sub r6, r6, #1 -_0204045C: - cmp r6, #0 - bge _0204043C -_02040464: - add r5, r0, #1 - ldr r4, _020407B8 ; =_022AADFC - mov r3, #3 - ldr r1, _020407AC ; =_020AFE7C - b _02040498 -_02040478: - add r2, r4, r5, lsl #3 - ldrb r2, [r2, #0x2e] - tst r2, #2 - beq _020404A0 - ldr r2, [r1, #8] - add r2, r2, r5 - strb r3, [r2, #0x3e0] - add r5, r5, #1 -_02040498: - cmp r5, #4 - blt _02040478 -_020404A0: - add r0, r0, #1 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - cmp r0, #4 - blt _02040404 -_020404B4: - ldr r0, _020407AC ; =_020AFE7C - mov r8, #0 - ldr r0, [r0, #0xc] - ldr fp, _020407B4 ; =_022AAE2A - cmp r0, #2 - cmpne r0, #3 - cmpne r0, #6 - ldreq r0, _020407AC ; =_020AFE7C - ldr r5, _020407B8 ; =_022AADFC - ldreq r1, [r0, #8] - ldr r4, _020407AC ; =_020AFE7C - ldreqsh r0, [r1, #0xa4] - mov sb, r8 - mov r7, r8 - addeq r0, r0, #1 - streqh r0, [r1, #0xa4] - mov r6, #0x6a -_020404F8: - ldrb r0, [fp, sb, lsl #3] - str r7, [sp] - str r6, [sp, #4] - tst r0, #1 - movne r0, #1 - moveq r0, r7 - strb r7, [sp, #8] - strb r7, [sp, #9] - add sl, fp, sb, lsl #3 - tst r0, #0xff - beq _02040634 - ldrb r0, [r5, #0x2c] - cmp r0, #0 - movne r0, #2 - strne r0, [sp] - moveq r0, #4 - streq r0, [sp] - ldr r0, [r4, #0xc] - cmp r0, #1 - cmpne r0, #5 - bne _02040574 - ldrh r0, [sl, #4] - bl Is2TurnsMove - cmp r0, #0 - movne r0, #1 - strneb r0, [sp, #9] - bne _02040574 - ldrh r0, [sl, #4] - cmp r0, #0x8a - moveq r0, #1 - streqb r0, [sp, #8] -_02040574: - ldr r0, [r4, #0xc] - cmp r0, #0 - cmpne r0, #1 - bne _020405A4 - ldr r0, [r5] - mov r1, sl - mov r2, #1 - bl CanMonsterUseMove - cmp r0, #0 - moveq r0, #1 - streqb r0, [sp, #8] - b _020405B4 -_020405A4: - ldrb r0, [sl, #6] - cmp r0, #0 - moveq r0, #1 - streqb r0, [sp, #8] -_020405B4: - ldr r1, [r4, #8] - ldrb r0, [r1, #0x3f8] - cmp r0, #0 - beq _020405D8 - add r0, r1, sb - ldrb r0, [r0, #0x3e0] - tst r0, #2 - movne r0, #1 - strneb r0, [sp, #8] -_020405D8: - mov r2, sl - add r0, sp, #0xc - mov r1, #0 - add r3, sp, #0 - bl FormatMoveStringMore - mov r0, #0 - bl GetDungeonResultString - mov r1, r0 - ldr r0, [r4, #8] - add r0, r0, #0xe0 - add r0, r0, r8, lsl #7 - bl strcpy - ldr r3, [r4, #8] - add r0, r8, #1 - add r1, r3, #0xe0 - add r2, r1, r8, lsl #7 - add r1, r3, r8, lsl #3 - str r2, [r1, #0xa8] - ldr r1, [r4, #8] - mov r0, r0, lsl #0x10 - add r1, r1, r8, lsl #3 - str r8, [r1, #0xac] - mov r8, r0, asr #0x10 -_02040634: - add r0, sb, #1 - mov r0, r0, lsl #0x10 - mov sb, r0, asr #0x10 - cmp sb, #4 - blt _020404F8 - cmp r8, #4 - bne _02040710 - ldr r0, _020407AC ; =_020AFE7C - ldr r0, [r0, #0xc] - cmp r0, #2 - cmpne r0, #3 - cmpne r0, #6 - bne _02040710 - ldr r0, _020407B8 ; =_022AADFC - mov r2, #0 - ldrb r0, [r0, #0x2c] - str r2, [sp] - strb r2, [sp, #8] - strb r2, [sp, #9] - ldr r2, _020407BC ; =LAST_NEW_MOVE - cmp r0, #0 - ldrb r0, [r2] - mov r1, #0x6a - str r1, [sp, #4] - movne r1, #2 - bicne r0, r0, #8 - strne r1, [sp] - moveq r1, #4 - biceq r0, r0, #4 - streq r1, [sp] - strb r0, [r2] - add r0, sp, #0xc - add r3, sp, #0 - mov r1, #0 - bl FormatMoveStringMore - mov r0, #0 - bl GetDungeonResultString - ldr r2, _020407AC ; =_020AFE7C - mov r1, r0 - ldr r0, [r2, #8] - add r0, r0, #0xe0 - add r0, r0, r8, lsl #7 - bl strcpy - ldr r1, _020407AC ; =_020AFE7C - add r0, r8, #1 - ldr r4, [r1, #8] - mov r0, r0, lsl #0x10 - add r2, r4, #0xe0 - add r3, r2, r8, lsl #7 - add r2, r4, r8, lsl #3 - str r3, [r2, #0xa8] - ldr r1, [r1, #8] - add r1, r1, r8, lsl #3 - str r8, [r1, #0xac] - mov r8, r0, asr #0x10 -_02040710: - ldr r0, _020407AC ; =_020AFE7C - mov r4, #0 - ldr r1, [r0, #8] - sub r3, r4, #1 - add r1, r1, r8, lsl #3 - str r4, [r1, #0xa8] - ldr r2, [r0, #8] - sub r1, r4, #2 - add r2, r2, r8, lsl #3 - str r3, [r2, #0xac] - ldr r0, [r0, #8] - ldrsb r0, [r0] - cmp r0, r1 - beq _0204075C - bl sub_020307EC - ldr r0, _020407AC ; =_020AFE7C - ldr r0, [r0, #8] - ldrsb r0, [r0] - bl SetAdvancedTextBoxField0x1C2 -_0204075C: - ldr r0, _020407AC ; =_020AFE7C - ldr r1, [r0, #0xc] - cmp r1, #7 - ldrne r3, [r0, #8] - ldrne r2, [r3, #0x3ec] - ldrne r1, [r3, #0x3f0] - cmpne r2, r1 - beq _020407A4 - str r1, [r3, #0x3ec] - ldr r3, [r0, #8] - ldrsh r1, [r0, #2] - ldr r2, [r3, #0x10] - ldrsb r0, [r3] - add r2, r2, r1, lsl #4 - ldr r1, [r3, #0x3ec] - add r3, r2, #4 - mov r2, #0 - bl sub_02030978 -_020407A4: - add sp, sp, #0x5c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_020407AC: .word _020AFE7C -_020407B0: .word _022AAE00 -_020407B4: .word _022AAE2A -_020407B8: .word _022AADFC -_020407BC: .word LAST_NEW_MOVE - arm_func_end PrintMoveOptionMenu - - arm_func_start sub_020407C0 -sub_020407C0: ; 0x020407C0 - stmdb sp!, {r3, lr} - ldr r0, _020407E8 ; =_020AFE7C - ldr r0, [r0, #8] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl MemFree - ldr r0, _020407E8 ; =_020AFE7C - mov r1, #0 - str r1, [r0, #8] - ldmia sp!, {r3, pc} - .align 2, 0 -_020407E8: .word _020AFE7C - arm_func_end sub_020407C0 - - arm_func_start sub_020407EC -sub_020407EC: ; 0x020407EC - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #0x34 - add r1, sp, #0xc - mov r0, #0 - bl GetHeldButtons - add r1, sp, #0xa - mov r0, #0 - bl GetPressedButtons - add r1, sp, #8 - mov r0, #0 - bl sub_020063F4 - ldrh r0, [sp, #0xc] - ldr r5, _02040F90 ; =_022AAE2A - tst r0, #0x200 - movne r1, #1 - moveq r1, #0 - and r6, r1, #0xff - ldr r1, _02040F94 ; =_020AFE7C - tst r0, #0x100 - movne r0, #1 - moveq r0, #0 - ldr r3, [r1, #8] - and r7, r0, #0xff - add r0, r3, #0x300 - ldrsh r2, [r0, #0xe6] - cmp r2, #0 - ble _0204087C - sub r2, r2, #1 - strh r2, [r0, #0xe6] - ldr r0, [r1, #8] - add r0, r0, #0x300 - ldrsh r0, [r0, #0xe6] - cmp r0, #0 - moveq r0, #2 - movne r0, #0 - b _02040F88 -_0204087C: - ldrsb r0, [r3] - bl IsAdvancedTextBoxActive - cmp r0, #0 - bne _020408B8 - ldr r0, _02040F94 ; =_020AFE7C - ldr r0, [r0, #8] - ldrsb r0, [r0] - bl GetDigitInputResult - mvn r1, #0 - cmp r0, r1 - bne _020408B8 - mov r0, #1 - bl PlaySeVolumeWrapper - mov r0, #1 - b _02040F88 -_020408B8: - ldr r0, _02040F94 ; =_020AFE7C - ldr r0, [r0, #0xc] - cmp r0, #9 - addls pc, pc, r0, lsl #2 - b _02040958 -_020408CC: ; jump table - b _02040958 ; case 0 - b _0204094C ; case 1 - b _0204090C ; case 2 - b _020408F4 ; case 3 - b _02040958 ; case 4 - b _02040958 ; case 5 - b _0204090C ; case 6 - b _0204093C ; case 7 - b _02040924 ; case 8 - b _0204090C ; case 9 -_020408F4: - ldrh r0, [sp, #0xa] - mov r6, #0 - mov r7, r6 - bic r0, r0, #6 - strh r0, [sp, #0xa] - b _02040958 -_0204090C: - ldrh r0, [sp, #0xa] - mov r6, #0 - mov r7, r6 - bic r0, r0, #4 - strh r0, [sp, #0xa] - b _02040958 -_02040924: - ldrh r0, [sp, #0xa] - mov r6, #0 - mov r7, r6 - bic r0, r0, #4 - strh r0, [sp, #0xa] - b _02040958 -_0204093C: - mov r6, #0 - mov r7, r6 - strh r6, [sp, #0xa] - b _02040958 -_0204094C: - ldrh r0, [sp, #8] - bic r0, r0, #0x30 - strh r0, [sp, #8] -_02040958: - ldr r0, _02040F94 ; =_020AFE7C - ldr r0, [r0, #8] - ldrb r0, [r0, #0x3e5] - cmp r0, #0 - beq _02040980 - bl PrintMoveOptionMenu - ldr r0, _02040F94 ; =_020AFE7C - mov r1, #0 - ldr r0, [r0, #8] - strb r1, [r0, #0x3e5] -_02040980: - ldrh r0, [sp, #8] - tst r0, #0x80 - beq _02040A44 - bl sub_02041178 - cmp r7, #0 - beq _020409E4 - ldr r1, _02040F94 ; =_020AFE7C - ldr r0, _02040F90 ; =_022AAE2A - ldrsh r1, [r1, #2] - bl sub_02013E54 - ldr r1, _02040F94 ; =_020AFE7C - mov r0, r0, lsl #0x10 - ldrsh r1, [r1, #2] - mov r4, r0, asr #0x10 - cmp r1, r0, asr #16 - beq _020409D8 - mov r0, #3 - bl PlaySeVolumeWrapper - ldr r1, _02040F94 ; =_020AFE7C - mov r0, #3 - strh r4, [r1, #2] - b _02040F88 -_020409D8: - mov r0, #2 - bl PlaySeVolumeWrapper - b _02040A44 -_020409E4: - mov r0, #3 - bl PlaySeVolumeWrapper - ldr r0, _02040F94 ; =_020AFE7C - ldr r1, [r0, #8] - ldrsh r2, [r0, #2] - ldrsh r1, [r1, #0xa4] - add r0, r2, #1 - mov r0, r0, lsl #0x10 - mov r3, r0, asr #0x10 - b _02040A24 -_02040A0C: - ldrb r0, [r5, r3, lsl #3] - tst r0, #2 - beq _02040A2C - add r0, r3, #1 - mov r0, r0, lsl #0x10 - mov r3, r0, asr #0x10 -_02040A24: - cmp r2, r1 - blt _02040A0C -_02040A2C: - cmp r3, r1 - ldr r1, _02040F94 ; =_020AFE7C - movge r3, #0 - mov r0, #9 - strh r3, [r1, #2] - b _02040F88 -_02040A44: - ldrh r0, [sp, #8] - tst r0, #0x40 - beq _02040B10 - bl sub_02041178 - cmp r7, #0 - beq _02040AA8 - ldr r1, _02040F94 ; =_020AFE7C - ldr r0, _02040F90 ; =_022AAE2A - ldrsh r1, [r1, #2] - bl sub_02013F58 - ldr r1, _02040F94 ; =_020AFE7C - mov r0, r0, lsl #0x10 - ldrsh r1, [r1, #2] - mov r4, r0, asr #0x10 - cmp r1, r0, asr #16 - beq _02040A9C - mov r0, #3 - bl PlaySeVolumeWrapper - ldr r1, _02040F94 ; =_020AFE7C - mov r0, #4 - strh r4, [r1, #2] - b _02040F88 -_02040A9C: - mov r0, #2 - bl PlaySeVolumeWrapper - b _02040B10 -_02040AA8: - mov r0, #3 - bl PlaySeVolumeWrapper - ldr r0, _02040F94 ; =_020AFE7C - ldrsh r1, [r0, #2] - cmp r1, #0 - subgt r0, r1, #1 - ldrle r0, [r0, #8] - ldrlesh r0, [r0, #0xa4] - suble r0, r0, #1 - mov r0, r0, lsl #0x10 - mov r2, r0, asr #0x10 - b _02040AF0 -_02040AD8: - ldrb r0, [r5, r2, lsl #3] - tst r0, #2 - beq _02040AF8 - sub r0, r2, #1 - mov r0, r0, lsl #0x10 - mov r2, r0, asr #0x10 -_02040AF0: - cmp r1, #0 - bge _02040AD8 -_02040AF8: - ldr r1, _02040F94 ; =_020AFE7C - cmp r2, #0 - movlt r2, #0 - mov r0, #9 - strh r2, [r1, #2] - b _02040F88 -_02040B10: - mov r4, #0 - bl IsTouchScreenNotOff - cmp r0, #0 - add r0, sp, #0x10 - beq _02040B2C - bl GetReleasedStylus - b _02040B30 -_02040B2C: - bl sub_02006BFC -_02040B30: - ldrh r0, [sp, #0x10] - tst r0, #0x40 - beq _02040C38 - tst r0, #2 - ldrne r0, _02040F94 ; =_020AFE7C - ldrne r0, [r0, #0xc] - cmpne r0, #7 - beq _02040C38 - cmp r0, #2 - cmpne r0, #3 - cmpne r0, #6 - bne _02040B68 - mov r1, #0x70 - b _02040B6C -_02040B68: - mov r1, #0x60 -_02040B6C: - ldr r0, [sp, #0x14] - cmp r0, #0x10 - blt _02040C38 - cmp r0, #0xa0 - bge _02040C38 - ldr r0, [sp, #0x18] - cmp r0, #0x20 - blt _02040C38 - cmp r0, r1 - bge _02040C38 - sub r1, r0, #0x20 - mov r0, r1, asr #3 - add r0, r1, r0, lsr #28 - mov r0, r0, lsl #0xc - ldr r2, _02040F94 ; =_020AFE7C - mov r1, r0, asr #0x10 - ldr r5, [r2, #8] - add r7, r1, #1 - mov r3, #0 - mvn r2, #0 - b _02040BDC -_02040BC0: - add r0, r5, r3, lsl #3 - ldr r0, [r0, #0xac] - cmp r0, r2 - beq _02040BE4 - add r0, r3, #1 - mov r0, r0, lsl #0x10 - mov r3, r0, asr #0x10 -_02040BDC: - cmp r3, r7 - blt _02040BC0 -_02040BE4: - cmp r3, r1 - ble _02040C38 - ldr r0, _02040F90 ; =_022AAE2A - ldrb r0, [r0, r1, lsl #3] - tst r0, #2 - bne _02040C38 - mov r0, r1, lsl #4 - ldr r3, _02040F94 ; =_020AFE7C - add r0, r0, #0x20 - mov r2, r0, lsl #0x10 - mov r0, #0x10 - ldr r4, _02040F98 ; =_0209C928 - strh r1, [r3, #2] - mov r3, r0 - str r4, [sp] - mov r4, #0x40 - mov r1, r2, asr #0x10 - mov r2, #0x90 - str r4, [sp, #4] - mov r4, #1 - bl sub_0202A2A4 -_02040C38: - ldr r0, _02040F94 ; =_020AFE7C - ldr r5, [r0, #8] - ldrsb r0, [r5] - bl GetWindowIdPageStart - add r1, r5, #0x300 - ldrsh r1, [r1, #0xe8] - cmp r1, r0 - beq _02040C90 - mov r0, #4 - bl PlaySeVolumeWrapper - ldr r0, _02040F94 ; =_020AFE7C - mov r1, #0 - strh r1, [r0, #2] - ldr r0, [r0, #8] - ldrsb r0, [r0] - bl GetWindowIdPageStart - ldr r1, _02040F94 ; =_020AFE7C - ldr r1, [r1, #8] - add r1, r1, #0x300 - strh r0, [r1, #0xe8] - mov r0, #5 - b _02040F88 -_02040C90: - ldrh r0, [sp, #0xa] - tst r0, #2 - beq _02040CAC - mov r0, #1 - bl PlaySeVolumeWrapper - mov r0, #1 - b _02040F88 -_02040CAC: - tst r0, #4 - beq _02040D0C - ldr r0, _02040F9C ; =0x00003F07 - mov r1, #0x100 - bl sub_02017C74 - ldr r0, _02040F94 ; =_020AFE7C - ldr r1, [r0, #0xc] - cmp r1, #3 - addls pc, pc, r1, lsl #2 - b _02040CF4 -_02040CD4: ; jump table - b _02040CE4 ; case 0 - b _02040CE4 ; case 1 - b _02040CE4 ; case 2 - b _02040CE4 ; case 3 -_02040CE4: - ldr r0, [r0, #8] - ldrsb r0, [r0] - bl sub_02030EF0 - b _02040D04 -_02040CF4: - bl sub_02041178 - ldr r0, _02040F94 ; =_020AFE7C - ldrsh r0, [r0, #2] - bl sub_02041000 -_02040D04: - mov r0, #6 - b _02040F88 -_02040D0C: - tst r0, #8 - beq _02040D28 - ldr r0, _02040FA0 ; =0x00003F04 - mov r1, #0x100 - bl sub_02017C74 - mov r0, #7 - b _02040F88 -_02040D28: -#ifndef JAPAN - ldrsb r0, [r5] - bl sub_020308E4 - cmp r0, #0 - bne _02040F84 - ldrh r0, [sp, #0xa] -#endif - tst r0, #0x400 - bne _02040D50 - tst r0, #1 - cmpeq r4, #0 - beq _02040F84 -_02040D50: -#ifdef JAPAN - ldrb r0, [r5, #0x3f8] - cmp r0, #0 - beq _020410EC - ldr r0, _02040F94 ; =_020AFE7C - ldrsh r0, [r0, #2] - add r0, r5, r0 - ldrb r0, [r0, #0x3e0] - tst r0, #1 - bne _02040F70 -_020410EC: - cmp r4, #0 - addne r0, r5, #0x300 -#else - ldr r0, _02040F94 ; =_020AFE7C - mov r2, #0 - ldr r3, [r0, #8] - ldrb r1, [r3, #0x3f8] - cmp r1, #0 - beq _02040D7C - ldrsh r0, [r0, #2] - add r0, r3, r0 - ldrb r0, [r0, #0x3e0] - tst r0, #1 - movne r2, #1 -_02040D7C: - cmp r2, #0 - bne _02040F70 - cmp r4, #0 - addne r0, r3, #0x300 -#endif - movne r1, #6 - strneh r1, [r0, #0xe6] - cmp r6, #0 - beq _02040EC8 - ldr r0, _02040F94 ; =_020AFE7C - ldr r0, [r0, #0xc] - cmp r0, #1 - cmpne r0, #5 - bne _02040EC8 - cmp r4, #0 - ldrne r0, _02040F94 ; =_020AFE7C - movne r1, #0 - ldrne r0, [r0, #8] - addne r0, r0, #0x300 - strneh r1, [r0, #0xe6] - ldr r0, _02040F94 ; =_020AFE7C - ldr r1, [r0, #0xc] - cmp r1, #3 - addls pc, pc, r1, lsl #2 - b _02040E34 -_02040DDC: ; jump table - b _02040DEC ; case 0 - b _02040DEC ; case 1 - b _02040DEC ; case 2 - b _02040DEC ; case 3 -_02040DEC: - ldrsh r0, [r0, #2] - bl sub_02041194 - cmp r0, #0 - bne _02040E10 - ldr r0, _02040F94 ; =_020AFE7C - ldrsh r0, [r0, #2] - bl sub_02041364 - cmp r0, #0 - beq _02040E34 -_02040E10: - ldr r0, _02040F9C ; =0x00003F07 - mov r1, #0x100 - bl sub_02017C74 - ldr r0, _02040F94 ; =_020AFE7C - ldr r0, [r0, #8] - ldrsb r0, [r0] - bl sub_02030EF0 - mov r0, #8 - b _02040F88 -_02040E34: - ldr r0, _02040F94 ; =_020AFE7C - ldrsh r0, [r0, #2] - bl sub_02041194 - cmp r0, #0 - beq _02040E88 - ldr r0, _02040F94 ; =_020AFE7C - ldr r1, [r0, #0xc] - cmp r1, #5 - ldreqb r0, [r0] - cmpeq r0, #0 - bne _02040E6C - ldr r0, _02040FA4 ; =0x00001308 - bl PlaySeByIdVolumeWrapper - b _02040E78 -_02040E6C: - ldr r0, _02040F9C ; =0x00003F07 - mov r1, #0x100 - bl sub_02017C74 -_02040E78: - ldr r0, _02040F94 ; =_020AFE7C - ldrsh r0, [r0, #2] - bl sub_020412B0 - b _02040EC0 -_02040E88: - ldr r0, _02040F94 ; =_020AFE7C - ldrsh r0, [r0, #2] - bl sub_02041364 - cmp r0, #0 - beq _02040EB8 - ldr r0, _02040F9C ; =0x00003F07 - mov r1, #0x100 - bl sub_02017C74 - ldr r0, _02040F94 ; =_020AFE7C - ldrsh r0, [r0, #2] - bl sub_02041394 - b _02040EC0 -_02040EB8: - mov r0, #2 - bl PlaySeVolumeWrapper -_02040EC0: - bl sub_02041178 - b _02040F84 -_02040EC8: - cmp r4, #0 - beq _02040EEC - mov r0, #0 - bl PlaySeVolumeWrapper - ldr r0, _02040F94 ; =_020AFE7C - ldr r0, [r0, #8] - ldrsb r0, [r0] - bl sub_02030EF0 - b _02040F18 -_02040EEC: - ldrh r0, [sp, #0xa] - tst r0, #0x400 - mov r0, #0 - beq _02040F14 - bl PlaySeVolumeWrapper - ldr r0, _02040F94 ; =_020AFE7C - ldr r0, [r0, #8] - ldrsb r0, [r0] - bl sub_02030EF0 - b _02040F18 -_02040F14: - bl PlaySeVolumeWrapper -_02040F18: - ldr r0, _02040F94 ; =_020AFE7C - mov r1, #2 - ldr r3, [r0, #8] - mov r2, #0 - str r1, [r3, #0x3ec] - ldr r3, [r0, #8] - str r1, [r3, #0x3f0] - ldr r6, [r0, #8] - ldrsh r3, [r0, #2] - ldr r5, [r6, #0x10] - ldrsb r0, [r6] - add r3, r5, r3, lsl #4 - add r3, r3, #4 - bl sub_02030978 - ldr r0, _02040F94 ; =_020AFE7C - ldr r0, [r0, #8] - ldrsb r0, [r0] - bl UpdateWindow - cmp r4, #0 - bne _02040F84 - mov r0, #2 - b _02040F88 -_02040F70: - mov r0, #2 - bl PlaySeVolumeWrapper - cmp r4, #0 - beq _02040F84 - bl sub_02041178 -_02040F84: - mov r0, #0 -_02040F88: - add sp, sp, #0x34 - ldmia sp!, {r4, r5, r6, r7, pc} - .align 2, 0 -_02040F90: .word _022AAE2A -_02040F94: .word _020AFE7C -_02040F98: .word _0209C928 -_02040F9C: .word 0x00003F07 -_02040FA0: .word 0x00003F04 -_02040FA4: .word 0x00001308 - arm_func_end sub_020407EC - - arm_func_start sub_02040FA8 -sub_02040FA8: ; 0x02040FA8 - ldr r0, _02040FF4 ; =_022AADFC - ldrb r0, [r0, #0x2c] - cmp r0, #0 - beq _02040FD0 - ldr r0, _02040FF8 ; =_020AFE7C - ldr r1, _02040FFC ; =_022AAE2A - ldrsh r0, [r0, #2] - ldrb r0, [r1, r0, lsl #3] - tst r0, #8 - b _02040FE4 -_02040FD0: - ldr r0, _02040FF8 ; =_020AFE7C - ldr r1, _02040FFC ; =_022AAE2A - ldrsh r0, [r0, #2] - ldrb r0, [r1, r0, lsl #3] - tst r0, #4 -_02040FE4: - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - bx lr - .align 2, 0 -_02040FF4: .word _022AADFC -_02040FF8: .word _020AFE7C -_02040FFC: .word _022AAE2A - arm_func_end sub_02040FA8 - - arm_func_start sub_02041000 -sub_02041000: ; 0x02041000 - stmdb sp!, {r4, lr} - mov r4, r0 - bl sub_02041178 - ldr r2, _0204108C ; =_022AADFC - ldrb r0, [r2, #0x2c] - cmp r0, #0 - beq _02041078 - ldr r1, _02041090 ; =_022AAE2A - ldrb r0, [r1, r4, lsl #3] - tst r0, #8 - eorne r0, r0, #8 - strneb r0, [r1, r4, lsl #3] - ldmneia sp!, {r4, pc} - mov r3, #0 -_02041038: - add r0, r2, r3, lsl #3 - ldrb r0, [r0, #0x2e] - tst r0, #8 - bne _02041050 - cmp r3, r4 - bne _02041060 -_02041050: - add r1, r2, r3, lsl #3 - ldrb r0, [r1, #0x2e] - eor r0, r0, #8 - strb r0, [r1, #0x2e] -_02041060: - add r0, r3, #1 - mov r0, r0, lsl #0x10 - mov r3, r0, asr #0x10 - cmp r3, #4 - blt _02041038 - ldmia sp!, {r4, pc} -_02041078: - ldr r1, _02041090 ; =_022AAE2A - ldrb r0, [r1, r4, lsl #3] - eor r0, r0, #4 - strb r0, [r1, r4, lsl #3] - ldmia sp!, {r4, pc} - .align 2, 0 -_0204108C: .word _022AADFC -_02041090: .word _022AAE2A - arm_func_end sub_02041000 - - arm_func_start sub_02041094 -sub_02041094: ; 0x02041094 - ldr r0, _020410A0 ; =_020AFE7C - ldrsh r0, [r0, #2] - bx lr - .align 2, 0 -_020410A0: .word _020AFE7C - arm_func_end sub_02041094 - - arm_func_start sub_020410A4 -sub_020410A4: ; 0x020410A4 - ldr r1, _0204114C ; =_020AFE7C - cmp r0, #0 - strh r0, [r1, #2] - movlt r0, #0 - strlth r0, [r1, #2] - ldr r0, _0204114C ; =_020AFE7C - ldrsh r2, [r0, #2] - cmp r2, #4 - blt _02041100 - ldr r1, [r0, #0xc] - cmp r1, #2 - cmpne r1, #3 - arm_func_end sub_020410A4 - - arm_func_start sub_020410D4 -sub_020410D4: ; 0x020410D4 - cmpne r1, #6 - arm_func_end sub_020410D4 - - arm_func_start sub_020410D8 -sub_020410D8: ; 0x020410D8 - bne _020410F8 - arm_func_end sub_020410D8 - - arm_func_start sub_020410DC -sub_020410DC: ; 0x020410DC - cmp r2, #4 - ldreq r0, _0204114C ; =_020AFE7C - moveq r1, #4 - ldrne r0, _0204114C ; =_020AFE7C - movne r1, #0 - strh r1, [r0, #2] - bx lr -_020410F8: - mov r1, #3 - strh r1, [r0, #2] -_02041100: - ldr r2, _02041150 ; =_022AADFC - ldr r0, _0204114C ; =_020AFE7C -_02041108: - ldrsh r1, [r0, #2] - cmp r1, #0 - ldrlt r0, _0204114C ; =_020AFE7C - movlt r1, #0 - strlth r1, [r0, #2] - bxlt lr - add r1, r2, r1, lsl #3 - ldrb r1, [r1, #0x2e] - tst r1, #1 - beq _02041138 - tst r1, #2 - bxeq lr -_02041138: - ldrsh r1, [r0, #2] - sub r1, r1, #1 - strh r1, [r0, #2] - b _02041108 -_02041148: - bx lr - .align 2, 0 -_0204114C: .word _020AFE7C -_02041150: .word _022AADFC - arm_func_end sub_020410DC - - arm_func_start sub_02041154 -sub_02041154: ; 0x02041154 - cmp r0, #4 - ldreq r0, _02041170 ; =_022AADFC - ldrne r1, _02041174 ; =_022AAE2E - ldreqh r0, [r0, #0x54] - movne r0, r0, lsl #3 - ldrneh r0, [r1, r0] - bx lr - .align 2, 0 -_02041170: .word _022AADFC -_02041174: .word _022AAE2E - arm_func_end sub_02041154 - - arm_func_start sub_02041178 -sub_02041178: ; 0x02041178 - ldr r0, _02041190 ; =_020AFE7C - ldr r1, [r0, #8] - cmp r1, #0 - movne r0, #1 - strneb r0, [r1, #0x3e5] - bx lr - .align 2, 0 -_02041190: .word _020AFE7C - arm_func_end sub_02041178 - - arm_func_start sub_02041194 -sub_02041194: ; 0x02041194 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - ldr r4, _020412AC ; =_022AAE2A - mov r6, r0 - add r0, r4, r6, lsl #3 - ldrh r0, [r0, #4] - bl IsNot2TurnsMoveOrSketch - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - add r5, r6, #1 - mov r7, #0 - mov r8, #1 - b _0204129C -_020411C8: - ldrb r0, [r4, r5, lsl #3] - tst r0, #1 - movne r0, r8 - moveq r0, r7 - tst r0, #0xff - beq _020412A4 - add r0, r4, r5, lsl #3 - ldrh r0, [r0, #4] - bl IsNot2TurnsMoveOrSketch - cmp r0, #0 - beq _020412A4 - ldrb r0, [r4, r5, lsl #3] - tst r0, #2 - bne _02041298 - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - b _02041228 -_02041210: - ldrb r1, [r4, r0, lsl #3] - tst r1, #2 - beq _02041230 - add r0, r0, #1 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 -_02041228: - cmp r0, #4 - blt _02041210 -_02041230: - mov r1, r6, lsl #0x10 - mov r5, r1, asr #0x10 - b _02041288 -_0204123C: - add r1, r5, #1 - mov r1, r1, lsl #0x10 - mov r3, r1, asr #0x10 - add r1, r4, r5, lsl #3 - ldrh r2, [r1, #4] - b _02041274 -_02041254: - add r1, r4, r3, lsl #3 - ldrh r1, [r1, #4] - cmp r2, r1 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - add r1, r3, #1 - mov r1, r1, lsl #0x10 - mov r3, r1, asr #0x10 -_02041274: - cmp r3, r0 - blt _02041254 - add r1, r5, #1 - mov r1, r1, lsl #0x10 - mov r5, r1, asr #0x10 -_02041288: - cmp r5, r0 - blt _0204123C - mov r0, #1 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02041298: - add r5, r5, #1 -_0204129C: - cmp r5, #4 - blt _020411C8 -_020412A4: - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_020412AC: .word _022AAE2A - arm_func_end sub_02041194 - - arm_func_start sub_020412B0 -sub_020412B0: ; 0x020412B0 - stmdb sp!, {r4, lr} - mov r4, r0 - bl sub_02041194 - cmp r0, #0 - ldmeqia sp!, {r4, pc} - add r1, r4, #1 - ldr r0, _02041358 ; =_022AAE2A - mov r3, #0 - mov ip, #1 - b _0204133C -_020412D8: - ldrb r2, [r0, r1, lsl #3] - tst r2, #1 - movne r2, ip - moveq r2, r3 - tst r2, #0xff - beq _02041344 - ldrb r2, [r0, r1, lsl #3] - tst r2, #2 - bne _02041338 - ldr r2, _0204135C ; =_022AADFC - ldr lr, _02041358 ; =_022AAE2A - ldrb r2, [r2, #0x2c] - cmp r2, #0 - ldrne r3, _02041358 ; =_022AAE2A - ldrneb r2, [r3, r1, lsl #3] - bicne r2, r2, #8 - strneb r2, [r3, r1, lsl #3] - ldrb ip, [lr, r1, lsl #3] - ldr r2, _02041360 ; =_020AFE7C - mov r3, #1 - strb r3, [r2] - bic r2, ip, #4 - strb r2, [lr, r1, lsl #3] - b _02041344 -_02041338: - add r1, r1, #1 -_0204133C: - cmp r1, #4 - blt _020412D8 -_02041344: - ldrb r2, [r0, r1, lsl #3] - orr r2, r2, #2 - strb r2, [r0, r1, lsl #3] - bl sub_02041178 - ldmia sp!, {r4, pc} - .align 2, 0 -_02041358: .word _022AAE2A -_0204135C: .word _022AADFC -_02041360: .word _020AFE7C - arm_func_end sub_020412B0 - - arm_func_start sub_02041364 -sub_02041364: ; 0x02041364 - cmp r0, #3 - ldr r1, _02041390 ; =_022AAE2A - moveq r0, #0 - bxeq lr - add r0, r0, #1 - ldrb r0, [r1, r0, lsl #3] - tst r0, #2 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - bx lr - .align 2, 0 -_02041390: .word _022AAE2A - arm_func_end sub_02041364 - - arm_func_start sub_02041394 -sub_02041394: ; 0x02041394 - stmdb sp!, {r4, lr} - mov r4, r0 - bl sub_02041364 - cmp r0, #0 - ldmeqia sp!, {r4, pc} - add ip, r4, #1 - ldr r3, _020413FC ; =_022AAE2A - mov r1, #0 - mov r2, #1 - b _020413EC -_020413BC: - ldrb r0, [r3, ip, lsl #3] - tst r0, #1 - movne r0, r2 - moveq r0, r1 - tst r0, #0xff - beq _020413F4 - ldrb r0, [r3, ip, lsl #3] - tst r0, #2 - beq _020413F4 - eor r0, r0, #2 - strb r0, [r3, ip, lsl #3] - add ip, ip, #1 -_020413EC: - cmp ip, #4 - blt _020413BC -_020413F4: - bl sub_02041178 - ldmia sp!, {r4, pc} - .align 2, 0 -_020413FC: .word _022AAE2A - arm_func_end sub_02041394 - - arm_func_start sub_02041400 -sub_02041400: ; 0x02041400 - ldr r0, _02041410 ; =_020AFE7C - mov r1, #0 - strb r1, [r0] - bx lr - .align 2, 0 -_02041410: .word _020AFE7C - arm_func_end sub_02041400 - - arm_func_start sub_02041414 -sub_02041414: ; 0x02041414 - ldr r0, _02041420 ; =_020AFE7C - ldrb r0, [r0] - bx lr - .align 2, 0 -_02041420: .word _020AFE7C - arm_func_end sub_02041414 - - arm_func_start sub_02041424 -sub_02041424: ; 0x02041424 - cmp r0, #0 - movgt r0, #1 - bxgt lr - mov ip, #1 - ldr r3, _02041480 ; =_022AAE2A - mov r1, #0 - mov r2, ip - b _02041470 -_02041444: - ldrb r0, [r3, ip, lsl #3] - tst r0, #1 - movne r0, r2 - moveq r0, r1 - tst r0, #0xff - beq _02041478 - ldrb r0, [r3, ip, lsl #3] - tst r0, #2 - moveq r0, #1 - bxeq lr - add ip, ip, #1 -_02041470: - cmp ip, #4 - blt _02041444 -_02041478: - mov r0, #0 - bx lr - .align 2, 0 -_02041480: .word _022AAE2A - arm_func_end sub_02041424 - - arm_func_start sub_02041484 -sub_02041484: ; 0x02041484 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #0x20 - ldr r1, _02041594 ; =_020AFE7C - ldr r0, _02041598 ; =_022AAE2A - ldrsh r2, [r1, #2] - mov r1, #0 - mov r3, r1 - strb r1, [r0, r2, lsl #3] - add r5, r2, #1 - mov r4, #1 - b _020414DC -_020414B0: - ldrb r2, [r0, r5, lsl #3] - tst r2, #1 - movne r2, r4 - moveq r2, r3 - tst r2, #0xff - beq _020414E4 - ldrb r2, [r0, r5, lsl #3] - tst r2, #2 - beq _020414E4 - strb r1, [r0, r5, lsl #3] - add r5, r5, #1 -_020414DC: - cmp r5, #4 - blt _020414B0 -_020414E4: - mov r6, #0 - mov r7, r6 - mov r4, r6 - mov r5, #1 - add lr, sp, #0 -_020414F8: - ldrb r1, [r0, r7, lsl #3] - tst r1, #1 - movne r1, r5 - moveq r1, r4 - tst r1, #0xff - beq _02041530 - add ip, r0, r7, lsl #3 - add r3, lr, r6, lsl #3 - mov r2, #4 -_0204151C: - ldrh r1, [ip], #2 - subs r2, r2, #1 - strh r1, [r3], #2 - bne _0204151C - add r6, r6, #1 -_02041530: - add r7, r7, #1 - cmp r7, #4 - blt _020414F8 - mov r2, #0 - add r1, sp, #0 - b _02041550 -_02041548: - strb r2, [r1, r6, lsl #3] - add r6, r6, #1 -_02041550: - cmp r6, #4 - blt _02041548 - mov r4, #0 - add lr, sp, #0 -_02041560: - add ip, lr, r4, lsl #3 - add r3, r0, r4, lsl #3 - mov r2, #4 -_0204156C: - ldrh r1, [ip], #2 - subs r2, r2, #1 - strh r1, [r3], #2 - bne _0204156C - add r4, r4, #1 - cmp r4, #4 - blt _02041560 - bl sub_02041178 - add sp, sp, #0x20 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_02041594: .word _020AFE7C -_02041598: .word _022AAE2A - arm_func_end sub_02041484 - - arm_func_start sub_0204159C -sub_0204159C: ; 0x0204159C - ldr r0, _020415B8 ; =_022AADFC - ldrb r0, [r0, #0x58] - cmp r0, #0 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - bx lr - .align 2, 0 -_020415B8: .word _022AADFC - arm_func_end sub_0204159C - - arm_func_start sub_020415BC -sub_020415BC: ; 0x020415BC - mov r3, #0 - ldr ip, _02041610 ; =_022AAE2A - mov r1, r3 - mov r2, #1 - b _020415F4 -_020415D0: - ldrb r0, [ip, r3, lsl #3] - tst r0, #1 - movne r0, r2 - moveq r0, r1 - tst r0, #0xff - beq _020415FC - add r0, r3, #1 - mov r0, r0, lsl #0x10 - mov r3, r0, asr #0x10 -_020415F4: - cmp r3, #4 - blt _020415D0 -_020415FC: - cmp r3, #4 - movge r0, #1 - movlt r0, #0 - and r0, r0, #0xff - bx lr - .align 2, 0 -_02041610: .word _022AAE2A - arm_func_end sub_020415BC - - arm_func_start sub_02041614 -sub_02041614: ; 0x02041614 - stmdb sp!, {r3, r4, r5, lr} - mov r5, #0 - ldr r4, _020416B0 ; =_022AAE2A - mov r2, r5 - mov r3, #1 - b _02041694 -_0204162C: - ldrb r1, [r4, r5, lsl #3] - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - bne _02041688 - mov r1, #5 - strb r1, [r4, r5, lsl #3] - add r2, r4, r5, lsl #3 - strh r0, [r2, #4] - mov r1, #0 - ldr r0, _020416B4 ; =_022AADFC - strb r1, [r2, #7] - ldrsh r0, [r0, #0x5a] - ldr r1, _020416B8 ; =_022AAE58 - bl GetPpIncrease - add r1, r4, r5, lsl #3 - strh r0, [r1, #2] - mov r0, r1 - bl GetMaxPp - add r1, r4, r5, lsl #3 - strb r0, [r1, #6] - b _0204169C -_02041688: - add r1, r5, #1 - mov r1, r1, lsl #0x10 - mov r5, r1, asr #0x10 -_02041694: - cmp r5, #4 - blt _0204162C -_0204169C: - cmp r5, #4 - mvnge r5, #0 - mov r0, r5, lsl #0x10 - mov r0, r0, asr #0x10 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_020416B0: .word _022AAE2A -_020416B4: .word _022AADFC -_020416B8: .word _022AAE58 - arm_func_end sub_02041614 - - arm_func_start sub_020416BC -sub_020416BC: ; 0x020416BC - stmdb sp!, {r3, lr} - mov r1, r0 - ldr r0, _020416D8 ; =_022AAE2A - bl sub_02013F58 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - ldmia sp!, {r3, pc} - .align 2, 0 -_020416D8: .word _022AAE2A - arm_func_end sub_020416BC - - arm_func_start sub_020416DC -sub_020416DC: ; 0x020416DC - stmdb sp!, {r3, lr} - mov r1, r0 - ldr r0, _020416F8 ; =_022AAE2A - bl sub_02013E54 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - ldmia sp!, {r3, pc} - .align 2, 0 -_020416F8: .word _022AAE2A - arm_func_end sub_020416DC - - arm_func_start sub_020416FC -sub_020416FC: ; 0x020416FC - stmdb sp!, {r3, lr} - ldr r0, _02041720 ; =_020AFE7C - ldr r0, [r0, #8] - ldrsb r0, [r0] - bl sub_020307EC - mov r0, #1 - bl sub_0204027C - bl sub_02041178 - ldmia sp!, {r3, pc} - .align 2, 0 -_02041720: .word _020AFE7C - arm_func_end sub_020416FC - - arm_func_start sub_02041724 -sub_02041724: ; 0x02041724 - stmdb sp!, {r3, lr} - bl IsDeoxys - cmp r0, #0 - ldrne r0, _02041748 ; =_022AADFC - movne r1, #1 - ldreq r0, _02041748 ; =_022AADFC - moveq r1, #0 - strb r1, [r0, #0x58] - ldmia sp!, {r3, pc} - .align 2, 0 -_02041748: .word _022AADFC - arm_func_end sub_02041724 - - arm_func_start SprintfStatic__0204174C -SprintfStatic__0204174C: ; 0x0204174C - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3, lr} - add r2, sp, #0xc - bic r2, r2, #3 - ldr r1, [sp, #0xc] - add r2, r2, #4 - bl vsprintf - ldmia sp!, {r3, lr} - add sp, sp, #0x10 - bx lr - arm_func_end SprintfStatic__0204174C - - arm_func_start sub_02041774 -sub_02041774: ; 0x02041774 - stmdb sp!, {r4, lr} - mov r4, r0 - mov r0, #0x2bc - mov r1, #8 - bl MemAlloc - ldr r1, _020417A4 ; =_020AFE8C - mvn r2, #1 - str r0, [r1] - str r4, [r0, #4] - ldr r0, [r1] - strb r2, [r0] - ldmia sp!, {r4, pc} - .align 2, 0 -_020417A4: .word _020AFE8C - arm_func_end sub_02041774 - - arm_func_start sub_020417A8 -sub_020417A8: ; 0x020417A8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r6, r1 - mov r4, r2 - mov r7, r0 - cmp r4, r6 - mvnge r0, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - ldrb r0, [r7, r4, lsl #3] - tst r0, #1 - mvneq r0, #1 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r0, r3 - bl sub_02041774 - ldr r0, _0204185C ; =_020AFE8C - add r1, r7, r4, lsl #3 - ldr r0, [r0] - mov r2, #8 - add r0, r0, #8 - bl memcpy - add r5, r4, #1 - mov r4, #1 - mov sb, #8 - ldr r8, _0204185C ; =_020AFE8C - b _02041840 -_02041808: - ldrb r0, [r7, r5, lsl #3] - mov r1, r5, lsl #3 - tst r0, #1 - beq _0204183C - tst r0, #2 - beq _02041848 - ldr r0, [r8] - mov r2, sb - add r0, r0, #8 - add r0, r0, r4, lsl #3 - add r1, r7, r1 - bl memcpy - add r4, r4, #1 -_0204183C: - add r5, r5, #1 -_02041840: - cmp r5, r6 - blt _02041808 -_02041848: - ldr r0, _0204185C ; =_020AFE8C - ldr r0, [r0] - strh r4, [r0, #0x28] - bl sub_020418A4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_0204185C: .word _020AFE8C - arm_func_end sub_020417A8 - - arm_func_start sub_02041860 -sub_02041860: ; 0x02041860 - stmdb sp!, {r4, lr} - mov r4, r0 - mov r0, r1 - bl sub_02041774 - ldr r0, _020418A0 ; =_020AFE8C - mov r1, r4 - ldr r0, [r0] - mov r2, #8 - add r0, r0, #8 - bl memcpy - ldr r0, _020418A0 ; =_020AFE8C - mov r1, #1 - ldr r0, [r0] - strh r1, [r0, #0x28] - bl sub_020418A4 - ldmia sp!, {r4, pc} - .align 2, 0 -_020418A0: .word _020AFE8C - arm_func_end sub_02041860 - - arm_func_start sub_020418A4 -sub_020418A4: ; 0x020418A4 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - sub sp, sp, #0x10 - mov r7, #0 - ldr r6, _020419F0 ; =0x000008D4 - ldr r5, _020419F4 ; =_020AFE8C - mov r4, #0x50 - b _02041950 -_020418C0: - ldr r1, [r5] - mul r8, r7, r4 - add r0, r1, r7, lsl #3 - ldrh r0, [r0, #0xc] - add r1, r1, r7, lsl #1 - add r1, r1, #0x200 - strh r6, [r1, #0xac] - ldr r2, [r5] -#if defined(EUROPE) - add r1, r0, #0x3a4 -#elif defined(JAPAN) - add r1, r0, #0x9f -#else - add r1, r0, #0xa2 -#endif - add r2, r2, r8 - str r0, [r2, #0x3c] - ldr r2, [r5] -#if defined(EUROPE) - add r3, r1, #0x2400 -#elif defined(JAPAN) - add r3, r1, #0x3f00 -#else - add r3, r1, #0x2700 -#endif - add r1, r2, r7, lsl #1 - add r1, r1, #0x200 - strh r3, [r1, #0xb4] - ldr r1, [r5] - add r1, r1, r8 - str r0, [r1, #0x17c] - ldr r0, [r5] - add r0, r0, #8 - add r0, r0, r7, lsl #3 - bl GetMoveRangeId - ldr r1, [r5] - add r1, r1, r8 - str r0, [r1, #0x180] - ldr r0, [r5] - add r0, r0, #8 - add r0, r0, r7, lsl #3 - bl GetMoveType - ldr r2, [r5] - add r1, r7, #1 - add r2, r2, r8 - mov r1, r1, lsl #0x10 - str r0, [r2, #0x184] - mov r7, r1, asr #0x10 -_02041950: - ldr r2, [r5] - ldrsh r3, [r2, #0x28] - cmp r7, r3 - blt _020418C0 - cmp r3, #1 - ble _020419A0 - add r0, r2, #0x2ac - str r0, [sp] - add r0, r2, #0x2c - str r0, [sp, #4] - add r4, r2, #0x2b4 - str r4, [sp, #8] - add r4, r2, #0x16c - ldr r0, _020419F8 ; =_0209C97C - ldr r1, _020419FC ; =0x00001013 - mov r2, #0 - str r4, [sp, #0xc] - bl CreateScrollBoxMulti - ldr r1, _020419F4 ; =_020AFE8C - b _020419D4 -_020419A0: - add r0, r2, #0x2c - str r0, [sp] - add r1, r2, #0x200 - ldrh r3, [r1, #0xb4] - add r2, r2, #0x16c - ldr r0, _020419F8 ; =_0209C97C - str r3, [sp, #4] - str r2, [sp, #8] - ldrh r3, [r1, #0xac] - ldr r1, _020419FC ; =0x00001013 - mov r2, #0 - bl CreateScrollBoxSingle - ldr r1, _020419F4 ; =_020AFE8C -_020419D4: - ldr r1, [r1] - strb r0, [r1] - ldr r0, _020419F4 ; =_020AFE8C - ldr r0, [r0] - ldrsb r0, [r0] - add sp, sp, #0x10 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -#ifdef JAPAN -_020419F0: .word 0x00001D2C -#else -_020419F0: .word 0x000008D4 -#endif -_020419F4: .word _020AFE8C -_020419F8: .word _0209C97C -_020419FC: .word 0x00001013 - arm_func_end sub_020418A4 - - arm_func_start sub_02041A00 -sub_02041A00: ; 0x02041A00 - ldr r0, _02041A10 ; =_020AFE8C - ldr ip, _02041A14 ; =MemFree - ldr r0, [r0] - bx ip - .align 2, 0 -_02041A10: .word _020AFE8C -_02041A14: .word MemFree - arm_func_end sub_02041A00 - - arm_func_start sub_02041A18 -sub_02041A18: ; 0x02041A18 - stmdb sp!, {r3, lr} - ldr r0, _02041A3C ; =_020AFE8C - ldr r0, [r0] - ldrsb r0, [r0] - bl IsScrollBoxActive - cmp r0, #0 - movne r0, #0 - moveq r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_02041A3C: .word _020AFE8C - arm_func_end sub_02041A18 - - arm_func_start PrintIqSkillsMenu -PrintIqSkillsMenu: ; 0x02041A40 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #0xa0 - mov r7, r0 - mov r6, r1 - add r0, sp, #8 - mov r1, #0x98 - mov r5, r2 - mov r4, r3 - bl MemZero - mov r1, #0xd -#ifdef JAPAN - ldr r0, _02041ED4 ; =0x00001586 -#else - rsb r0, r1, #0xa80 -#endif - str r1, [sp, #0xc] - mov r1, #0 - str r1, [sp, #8] - mov r1, #0x10 - strh r0, [sp, #0x10] - str r1, [sp, #0x14] - mov r0, #0x840 - mov r1, #8 - bl MemAlloc - ldr r2, _02041B6C ; =_020AFE90 - mov r1, #0x840 - str r0, [r2, #4] - bl MemZero - ldr r3, _02041B6C ; =_020AFE90 - mov r1, r7 - ldr r0, [r3, #4] - mov r2, r5 - str r6, [r0, #0x790] - ldr r0, [r3, #4] - add r0, r0, #0x700 - strh r7, [r0, #0x94] - ldr r0, [r3, #4] - str r5, [r0, #0x798] - ldr r0, [r3, #4] - add r0, r0, #0x64 - bl GetLearnableIqSkills - ldr r3, _02041B6C ; =_020AFE90 - ldr r1, _02041B70 ; =0x80401C33 - ldr r2, [r3, #4] - mov r5, #8 - add r2, r2, #0x700 - strh r0, [r2, #0x8c] - ldr r2, [r3, #4] - ldr r0, _02041B74 ; =_0209C98C - add r2, r2, #0x700 - ldrsh r6, [r2, #0x8c] - ldr r3, _02041B78 ; =GetCheckIqMenuSkillString - add r2, sp, #8 - str r6, [sp] - str r5, [sp, #4] - bl CreateAdvancedMenu - ldr r1, _02041B6C ; =_020AFE90 - mov r2, #0 - ldr r3, [r1, #4] - strb r0, [r3] - ldr r0, [r1, #4] - str r2, [r0, #0x6f0] - ldr r0, [r1, #4] - str r2, [r0, #0x6ec] - ldr r0, [r1, #4] - strb r4, [r0, #0x83c] - ldr r0, [r1, #4] - add r0, r0, #0x700 - strh r2, [r0, #0x8e] - ldr r0, [r1, #4] - add r0, r0, #0x14 - bl InitPreprocessorArgs - ldr r0, _02041B6C ; =_020AFE90 - ldr r1, [r0, #4] - add r0, r1, #0x34 - add r0, r0, #0x800 - str r0, [r1, #0x7fc] - add sp, sp, #0xa0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -#ifdef JAPAN -_02041ED4: .word 0x00001586 -#endif -_02041B6C: .word _020AFE90 -_02041B70: .word 0x80401C33 -_02041B74: .word _0209C98C -_02041B78: .word GetCheckIqMenuSkillString - arm_func_end PrintIqSkillsMenu - - arm_func_start sub_02041B7C -sub_02041B7C: ; 0x02041B7C - stmdb sp!, {r4, lr} - sub sp, sp, #0xf8 - ldr r1, _020420BC ; =_020AFE90 - ldr r3, [r1, #4] - ldr r0, [r3, #0x6f0] - cmp r0, #8 - addls pc, pc, r0, lsl #2 - b _020420B0 -_02041B9C: ; jump table - b _02041BC0 ; case 0 - b _02041DB0 ; case 1 - b _02041E40 ; case 2 - b _02041EBC ; case 3 - b _02041F30 ; case 4 - b _02041EE4 ; case 5 - b _02041FA4 ; case 6 - b _02041FE8 ; case 7 - b _020420A0 ; case 8 -_02041BC0: - ldrsb r0, [r3] - bl IsAdvancedMenuActive2 - cmp r0, #0 - bne _02041CF8 - ldr r0, _020420BC ; =_020AFE90 - ldr r0, [r0, #4] - ldrsb r0, [r0] - bl GetAdvancedMenuResult - ldr r2, _020420BC ; =_020AFE90 - mvn r1, #0 - ldr r3, [r2, #4] - str r0, [r3, #0x838] - ldr r2, [r2, #4] - ldr r0, [r2, #0x838] - cmp r0, r1 - moveq r0, #8 - streq r0, [r2, #0x6f0] - beq _020420B0 - mov r0, #0 - bl PlaySeVolumeWrapper - ldr r0, _020420BC ; =_020AFE90 - ldr r2, _020420C0 ; =_0209C9B0 - ldrsb r3, [r0] - ldr r1, [r0, #4] - ldr r2, [r2, r3, lsl #3] - str r2, [r1, #0x79c] - ldr r3, [r0, #4] - ldr r2, [r3, #0x838] - ldrb r1, [r3, #0x83c] - add r2, r3, r2 - ldrb r2, [r2, #0x64] - cmp r1, #0 - bne _02041C60 - cmp r2, #0x18 - cmpne r2, #0x1b - beq _02041C60 - add r1, r2, #0xc8 - and r1, r1, #0xff - cmp r1, #1 - bhi _02041C7C -_02041C60: - mov r1, #3 - ldr r0, _020420BC ; =_020AFE90 - strb r1, [r3, #0x834] - ldr r0, [r0, #4] - mov r1, #0 - strb r1, [r0, #0x835] - b _02041C8C -_02041C7C: - mov r1, #0 - strb r1, [r3, #0x834] - ldr r0, [r0, #4] - strb r1, [r0, #0x835] -_02041C8C: - ldr r0, _020420BC ; =_020AFE90 - mov r1, #0x98 - ldr r0, [r0, #4] - add r0, r0, #0x39c - add r0, r0, #0x400 - bl MemZero - ldr r2, _020420BC ; =_020AFE90 - ldr r3, _020420C4 ; =_0209C9AC - ldr r4, [r2, #4] - mov r1, #0 - add r0, r4, #0x34 - add r0, r0, #0x800 - str r0, [r4, #0x7fc] - str r3, [sp] - str r1, [sp, #4] - str r1, [sp, #8] - ldr r2, [r2, #4] - ldr r0, _020420C8 ; =_0209C99C - add r3, r2, #0x39c - ldr r2, _020420CC ; =0x80000233 - add r3, r3, #0x400 - bl sub_02046A20 - ldr r0, _020420BC ; =_020AFE90 - mov r1, #1 - ldr r0, [r0, #4] - str r1, [r0, #0x6f0] - b _020420B0 -_02041CF8: - add r1, sp, #0xc - mov r0, #0 - bl GetPressedButtons - ldrh r0, [sp, #0xc] - tst r0, #8 - beq _02041D54 - ldr r0, _020420D0 ; =0x00003F04 - bl PlaySeByIdVolumeWrapper - ldr r0, _020420BC ; =_020AFE90 - ldr r0, [r0, #4] - ldrsb r0, [r0] - bl sub_0202C1E4 - ldr r0, _020420BC ; =_020AFE90 - ldr r0, [r0, #4] - ldrsb r0, [r0] - bl GetAdvancedMenuResult - ldr r1, _020420BC ; =_020AFE90 - mov r2, #3 - ldr r3, [r1, #4] - str r0, [r3, #0x838] - ldr r0, [r1, #4] - str r2, [r0, #0x6f0] - b _020420B0 -_02041D54: - tst r0, #4 - beq _020420B0 - ldr r0, _020420BC ; =_020AFE90 - ldr r1, [r0, #4] - ldrb r0, [r1, #0x83c] - cmp r0, #0 - beq _02041D7C - ldr r0, _020420D4 ; =0x00003F03 - bl PlaySeByIdVolumeWrapper - b _020420B0 -_02041D7C: - ldrsb r0, [r1] - bl sub_0202C1E4 - ldr r0, _020420BC ; =_020AFE90 - ldr r0, [r0, #4] - ldrsb r0, [r0] - bl GetAdvancedMenuResult - ldr r1, _020420BC ; =_020AFE90 - mov r2, #2 - ldr r3, [r1, #4] - str r0, [r3, #0x838] - ldr r0, [r1, #4] - str r2, [r0, #0x6f0] - b _020420B0 -_02041DB0: - bl sub_02046B04 - mov r4, r0 - bl sub_02046BA0 - ldr r1, _020420BC ; =_020AFE90 - add r2, r4, #2 - strb r0, [r1] - cmp r2, #4 - addls pc, pc, r2, lsl #2 - b _020420B0 -_02041DD4: ; jump table - b _02041DF0 ; case 0 - b _020420B0 ; case 1 - b _02041E14 ; case 2 - b _02041E24 ; case 3 - b _02041DE8 ; case 4 -_02041DE8: - mov r0, #0 - bl PlaySeVolumeWrapper -_02041DF0: - ldr r0, _020420BC ; =_020AFE90 - ldr r0, [r0, #4] - ldrsb r0, [r0] - bl ResumeAdvancedMenu - ldr r0, _020420BC ; =_020AFE90 - mov r1, #0 - ldr r0, [r0, #4] - str r1, [r0, #0x6f0] - b _020420B0 -_02041E14: - ldr r0, [r1, #4] - mov r1, #2 - str r1, [r0, #0x6f0] - b _020420B0 -_02041E24: - mov r0, #0 - bl PlaySeVolumeWrapper - ldr r0, _020420BC ; =_020AFE90 - mov r1, #3 - ldr r0, [r0, #4] - str r1, [r0, #0x6f0] - b _020420B0 -_02041E40: - ldr r1, [r3, #0x838] - add r2, r3, #0x64 - ldrb r0, [r2, r1] - cmp r0, #0x18 - bne _02041E60 - mov r0, #2 - bl PlaySeVolumeWrapper - b _02041E98 -_02041E60: - cmp r0, #0x1b - beq _02041E78 - add r0, r0, #0xc8 - and r0, r0, #0xff - cmp r0, #1 - bhi _02041E84 -_02041E78: - mov r0, #2 - bl PlaySeVolumeWrapper - b _02041E98 -_02041E84: - ldrb r1, [r2, r1] - ldr r0, [r3, #0x790] - bl DisableIqSkill - ldr r0, _020420D8 ; =0x00003F07 - bl PlaySeByIdVolumeWrapper -_02041E98: - ldr r0, _020420BC ; =_020AFE90 - ldr r0, [r0, #4] - ldrsb r0, [r0] - bl ResumeAdvancedMenu - ldr r0, _020420BC ; =_020AFE90 - mov r1, #0 - ldr r0, [r0, #4] - str r1, [r0, #0x6f0] - b _020420B0 -_02041EBC: - ldrsb r0, [r3] - bl sub_0202812C - ldr r1, _020420BC ; =_020AFE90 - mov r2, #5 - ldr r0, [r1, #4] - add r0, r0, #0x700 - strh r2, [r0, #0x8e] - ldr r0, [r1, #4] - str r2, [r0, #0x6f0] - b _020420B0 -_02041EE4: - add r0, r3, #0x700 - ldrsh r2, [r0, #0x8e] - sub r2, r2, #1 - strh r2, [r0, #0x8e] - ldr r2, [r1, #4] - add r0, r2, #0x700 - ldrsh r0, [r0, #0x8e] - cmp r0, #0 - bge _020420B0 - mov r0, #4 - str r0, [r2, #0x6f0] - ldr r0, [r1, #4] - ldrsb r0, [r0] - bl CloseAdvancedMenu - ldr r0, _020420BC ; =_020AFE90 - mvn r1, #1 - ldr r0, [r0, #4] - strb r1, [r0] - b _020420B0 -_02041F30: - add r0, sp, #0xa8 - bl InitPreprocessorArgs - ldr r0, _020420BC ; =_020AFE90 - add ip, sp, #0xa8 - ldr r3, [r0, #4] - ldr r0, _020420DC ; =_020AFE98 - ldr r2, [r3, #0x838] - ldr r1, _020420E0 ; =0x00001013 - add r2, r3, r2 - ldrb lr, [r2, #0x64] - ldr r3, _020420E4 ; =0x00000A77 - mov r2, #0 - str lr, [sp, #0xb8] - str ip, [sp] - ldr ip, [sp, #0xb8] -#if defined(EUROPE) - add ip, ip, #0x32c - add ip, ip, #0x2400 -#elif defined(JAPAN) - add ip, ip, #0x358 - add ip, ip, #0x3c00 -#else - add ip, ip, #0x2a - add ip, ip, #0x2700 -#endif - mov ip, ip, lsl #0x10 - mov ip, ip, lsr #0x10 - str ip, [sp, #4] - str r2, [sp, #8] - bl CreateScrollBoxSingle - ldr r1, _020420BC ; =_020AFE90 - mov r2, #6 - ldr r3, [r1, #4] - strb r0, [r3, #1] - ldr r0, [r1, #4] - str r2, [r0, #0x6f0] - b _020420B0 -_02041FA4: - ldrsb r0, [r3, #1] - bl IsScrollBoxActive - cmp r0, #0 - bne _020420B0 - ldr r0, _020420BC ; =_020AFE90 - ldr r0, [r0, #4] - ldrsb r0, [r0, #1] - bl CloseScrollBox - ldr r0, _020420BC ; =_020AFE90 - mov r3, #7 - ldr r2, [r0, #4] - mov r1, #8 - str r3, [r2, #0x6f0] - ldr r0, [r0, #4] - add r0, r0, #0x700 - strh r1, [r0, #0x8e] - b _020420B0 -_02041FE8: - add r0, r3, #0x700 - ldrsh r2, [r0, #0x8e] - sub r2, r2, #1 - strh r2, [r0, #0x8e] - ldr r0, [r1, #4] - add r0, r0, #0x700 - ldrsh r2, [r0, #0x8e] - cmp r2, #0 - bge _020420B0 - mov r3, #0 - strh r3, [r0, #0x8e] - ldr r2, [r1, #4] - mov r0, #0xd - str r3, [r2, #0x6f0] - ldr r3, [r1, #4] - str r0, [sp, #0x14] - ldr r2, [r3, #0x838] -#ifdef JAPAN - ldr r1, _02042454 ; =0x00001586 -#else - rsb r1, r0, #0xa80 -#endif - mov r0, #0x10 - str r0, [sp, #0x1c] - str r2, [sp, #0x10] - strh r1, [sp, #0x18] - add r0, r3, #0x700 - ldrsh r1, [r0, #0x94] - ldr r2, [r3, #0x798] - add r0, r3, #0x64 - bl GetLearnableIqSkills - ldr ip, _020420BC ; =_020AFE90 - ldr r1, _020420E8 ; =0x80401C33 - ldr r3, [ip, #4] - add r2, sp, #0x10 - add r3, r3, #0x700 - strh r0, [r3, #0x8c] - ldr r3, [ip, #4] - ldr r0, _020420EC ; =_0209C98C - add r3, r3, #0x700 - ldrsh lr, [r3, #0x8c] - ldr r3, _020420F0 ; =GetCheckIqMenuSkillString - mov ip, #8 - str lr, [sp] - str ip, [sp, #4] - bl CreateAdvancedMenu - ldr r1, _020420BC ; =_020AFE90 - ldr r1, [r1, #4] - strb r0, [r1] - b _020420B0 -_020420A0: - mov r0, #9 - str r0, [r3, #0x6f0] - mov r0, #1 - b _020420B4 -_020420B0: - mov r0, #0 -_020420B4: - add sp, sp, #0xf8 - ldmia sp!, {r4, pc} - .align 2, 0 -_020420BC: .word _020AFE90 -_020420C0: .word _0209C9B0 -_020420C4: .word _0209C9AC -_020420C8: .word _0209C99C -_020420CC: .word 0x80000233 -_020420D0: .word 0x00003F04 -_020420D4: .word 0x00003F03 -_020420D8: .word 0x00003F07 -_020420DC: .word _020AFE98 -_020420E0: .word 0x00001013 -#ifdef JAPAN -_020420E4: .word 0x0000158A -_02042454: .word 0x00001586 -#else -_020420E4: .word 0x00000A77 -#endif -_020420E8: .word 0x80401C33 -_020420EC: .word _0209C98C -_020420F0: .word GetCheckIqMenuSkillString - arm_func_end sub_02041B7C - - arm_func_start sub_020420F4 -sub_020420F4: ; 0x020420F4 - stmdb sp!, {r3, lr} - ldr r0, _02042138 ; =_020AFE90 - ldr r0, [r0, #4] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - ldrsb r0, [r0] - mvn r1, #1 - cmp r0, r1 - beq _0204211C - bl CloseAdvancedMenu -_0204211C: - ldr r0, _02042138 ; =_020AFE90 - ldr r0, [r0, #4] - bl MemFree - ldr r0, _02042138 ; =_020AFE90 - mov r1, #0 - str r1, [r0, #4] - ldmia sp!, {r3, pc} - .align 2, 0 -_02042138: .word _020AFE90 - arm_func_end sub_020420F4 - - arm_func_start GetCheckIqMenuSkillString -GetCheckIqMenuSkillString: ; 0x0204213C - stmdb sp!, {r3, r4, r5, r6, lr} - sub sp, sp, #0x84 - ldr r2, _02042248 ; =_020AFE90 - mov r4, r0 - ldr r2, [r2, #4] - mov r6, #0 - add r0, r2, r1 - ldrb r5, [r0, #0x64] - ldr r0, [r2, #0x790] - cmp r5, #0x18 - bne _02042174 - mov r0, #3 - bl GetResolvedPerformanceProgressFlag - b _0204217C -_02042174: - mov r1, r5 - bl IqSkillFlagTest -_0204217C: - cmp r0, #0 - movne r6, #1 - cmp r6, #0 - beq _020421DC - cmp r5, #0x38 - bgt _020421B4 - bge _020421BC - cmp r5, #0x1b - bgt _020421CC - cmp r5, #0x18 - blt _020421CC - cmpne r5, #0x1b - beq _020421BC - b _020421CC -_020421B4: - cmp r5, #0x39 - bne _020421CC -_020421BC: - ldr r1, _0204224C ; =_0209C9CC - add r0, sp, #0x44 - bl strcpy - b _020421E8 -_020421CC: - ldr r1, _02042250 ; =_0209C9D4 - add r0, sp, #0x44 - bl strcpy - b _020421E8 -_020421DC: - ldr r1, _02042254 ; =_0209C9DC - add r0, sp, #0x44 - bl strcpy -_020421E8: - ldr r1, _02042248 ; =_020AFE90 - mov r0, r5 - ldr r1, [r1, #4] - str r5, [r1, #0x24] - bl GetIqSkillStringId - mov r1, r0 - add r0, sp, #4 - mov r2, #0x40 - bl CopyNStringFromId - add r0, sp, #0x44 - add r1, sp, #4 - bl strcat - ldr r1, _02042248 ; =_020AFE90 - mov r0, r4 - ldr r2, [r1, #4] - mov r1, #0x40 - add r2, r2, #0x14 - str r2, [sp] - add r2, sp, #0x44 - mov r3, #0 - bl PreprocessString - mov r0, r4 - add sp, sp, #0x84 - ldmia sp!, {r3, r4, r5, r6, pc} - .align 2, 0 -_02042248: .word _020AFE90 -_0204224C: .word _0209C9CC -_02042250: .word _0209C9D4 -_02042254: .word _0209C9DC - arm_func_end GetCheckIqMenuSkillString - - arm_func_start InitUnkStorageStruct0xA0 -InitUnkStorageStruct0xA0: ; 0x02042258 - stmdb sp!, {r3, r4, r5, r6, lr} - sub sp, sp, #0xc - mov r6, r0 - mov r0, #0xa0 - mov r1, #8 - mov r5, r2 - mov r4, r3 - bl MemAlloc - ldr r1, _020423B4 ; =UNK_STORAGE_STRUCT_0XC - str r0, [r1, #4] - str r6, [r0] - bl RemoveEmptyItemsInBag - mov r0, #0x14 - bl Arm9LoadUnkFieldNa0x2029EC8 - ldr r1, _020423B4 ; =UNK_STORAGE_STRUCT_0XC - cmp r4, #0 - ldr r3, [r1, #4] - ldrne r4, _020423B8 ; =sub_020423D8 - str r0, [r3, #8] - ldr r2, _020423BC ; =0x0000032F - ldr r0, [r1, #4] - mov ip, #0x10 - strh r2, [r0, #0x10] - ldr r0, [r1, #4] - mov r3, #0xd - str ip, [r0, #0x14] - ldr r0, [r1, #4] - ldr r2, _020423C0 ; =sub_0204261C - str r3, [r0, #0xc] - ldr r0, [r1, #4] - moveq r4, #0 - str r2, [r0, #0x7c] - bl GetNbItemsInBag - str r4, [sp] - str r0, [sp, #4] - ldr r0, _020423B4 ; =UNK_STORAGE_STRUCT_0XC - str r5, [sp, #8] - ldr r2, [r0, #4] - ldr r0, _020423C4 ; =_0209C9E4 - ldr r1, _020423C8 ; =0x00443C33 - ldr r3, _020423CC ; =sub_02042760 - add r2, r2, #8 - bl CreateCollectionMenu - ldr r2, _020423B4 ; =UNK_STORAGE_STRUCT_0XC - ldr r1, _020423D0 ; =sub_0204262C - ldr r3, [r2, #4] - strb r0, [r3, #4] - ldr r0, [r2, #4] - ldrsb r0, [r0, #4] - bl sub_0202D068 - ldr r0, _020423B4 ; =UNK_STORAGE_STRUCT_0XC - ldr r1, _020423D4 ; =sub_0204263C - ldr r0, [r0, #4] - ldrsb r0, [r0, #4] - bl SetCollectionMenuVoidFn - ldr r0, _020423B4 ; =UNK_STORAGE_STRUCT_0XC - mov r1, #0xd - ldr r0, [r0, #4] - ldrsb r0, [r0, #4] - bl SetCollectionMenuField0x1BC - ldr r0, _020423B4 ; =UNK_STORAGE_STRUCT_0XC - ldr r1, [r0, #4] - ldr r0, [r1] - cmp r0, #3 - beq _02042368 - cmp r0, #4 - beq _0204237C - b _020423A0 -_02042368: -#ifdef EUROPE - ldrsb r0, [r1, #4] - mov r1, #9 - bl SetCollectionMenuField0x1BC -#endif - mov r0, #0 - bl sub_0204440C - mov r0, #2 - bl sub_0204426C - b _020423A0 -_0204237C: - ldrsb r0, [r1, #4] -#ifdef EUROPE - mov r1, #9 - bl SetCollectionMenuField0x1BC - ldr r0, _020423B4 ; =UNK_STORAGE_STRUCT_0XC -#endif - mov r1, #0x76 -#ifdef EUROPE - ldr r0, [r0, #4] - ldrsb r0, [r0, #4] -#endif - bl SetCollectionMenuWidth - mov r0, #0 - bl sub_0204440C - mov r0, #0 - bl sub_0204426C - mov r0, #0 - bl sub_02044568 -_020423A0: - ldr r0, _020423B4 ; =UNK_STORAGE_STRUCT_0XC - ldr r0, [r0, #4] - ldrsb r0, [r0, #4] - add sp, sp, #0xc - ldmia sp!, {r3, r4, r5, r6, pc} - .align 2, 0 -_020423B4: .word UNK_STORAGE_STRUCT_0XC -_020423B8: .word sub_020423D8 -#ifdef JAPAN -_020423BC: .word 0x000031F4 -#else -_020423BC: .word 0x0000032F -#endif -_020423C0: .word sub_0204261C -_020423C4: .word _0209C9E4 -_020423C8: .word 0x00443C33 -_020423CC: .word sub_02042760 -_020423D0: .word sub_0204262C -_020423D4: .word sub_0204263C - arm_func_end InitUnkStorageStruct0xA0 - - arm_func_start sub_020423D8 -sub_020423D8: ; 0x020423D8 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - ldr r1, _02042618 ; =UNK_STORAGE_STRUCT_0XC - mov r5, #0 - ldr r2, [r1, #4] - ldr r1, [r2] - cmp r1, #3 - bne _02042498 - tst r0, #0x800 - beq _02042498 - bl sub_02042B20 - cmp r0, #0 - ble _0204241C - bl ClearBagSelectedItemTable - mov r0, #6 - bl PlaySeVolumeWrapper - mov r5, #1 - b _020425D8 -_0204241C: - bl sub_0200FD48 - mov r4, r0 - bl CountNbOfItemsInStorage - sub r7, r4, r0 - mov r8, r5 - mov r6, #1 - ldr r4, _02042618 ; =UNK_STORAGE_STRUCT_0XC - b _02042470 -_0204243C: - cmp r7, #0 - ble _02042478 - mov r0, r8, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetItemAtIdx - ldrsh r0, [r0, #4] - bl IsStorableItem - cmp r0, #0 - ldrne r0, [r4, #8] - movne r5, r6 - strne r6, [r0, r8, lsl #2] - subne r7, r7, #1 - add r8, r8, #1 -_02042470: - cmp r8, #0x32 - blt _0204243C -_02042478: - cmp r5, #0 - beq _0204248C - mov r0, #6 - bl PlaySeVolumeWrapper - b _020425D8 -_0204248C: - mov r0, #2 - bl PlaySeVolumeWrapper - b _020425D8 -_02042498: - tst r0, #0x400 - beq _020425D8 - ldrsb r0, [r2, #4] - bl sub_0202D0EC - ldr r1, _02042618 ; =UNK_STORAGE_STRUCT_0XC - mov r4, r0 - ldr r0, [r1, #4] - ldr r0, [r0] - cmp r0, #3 - beq _020424CC - cmp r0, #4 - beq _02042570 - b _020425D8 -_020424CC: - mov r0, r4, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetItemAtIdx - ldrsh r0, [r0, #4] - bl IsStorableItem - cmp r0, #0 - beq _02042560 - ldr r0, _02042618 ; =UNK_STORAGE_STRUCT_0XC - ldr r2, [r0, #8] - ldr r0, [r2, r4, lsl #2] - tst r0, #1 - beq _02042514 - mov r1, #0 - mov r0, #6 - str r1, [r2, r4, lsl #2] - bl PlaySeVolumeWrapper - mov r5, #1 - b _020425D8 -_02042514: - bl CountNbOfItemsInStorage - mov r6, r0 - bl sub_02042B20 - mov r5, r0 - bl sub_0200FD48 - add r1, r6, r5 - cmp r1, r0 - bge _02042550 - mov r0, #6 - bl PlaySeVolumeWrapper - ldr r0, _02042618 ; =UNK_STORAGE_STRUCT_0XC - mov r5, #1 - ldr r0, [r0, #8] - str r5, [r0, r4, lsl #2] - b _020425D8 -_02042550: - mov r0, #2 - bl PlaySeVolumeWrapper - mov r5, #0 - b _020425D8 -_02042560: - mov r0, #2 - bl PlaySeVolumeWrapper - mov r5, #0 - b _020425D8 -_02042570: - mov r0, r4, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetItemAtIdx - ldrsh r0, [r0, #4] - bl IsShoppableItem - cmp r0, #0 - beq _020425CC - ldr r0, _02042618 ; =UNK_STORAGE_STRUCT_0XC - mov r5, #1 - ldr r2, [r0, #8] - ldr r0, [r2, r4, lsl #2] - tst r0, #1 - mov r0, #6 - beq _020425B8 - mov r1, #0 - str r1, [r2, r4, lsl #2] - bl PlaySeVolumeWrapper - b _020425D8 -_020425B8: - bl PlaySeVolumeWrapper - ldr r0, _02042618 ; =UNK_STORAGE_STRUCT_0XC - ldr r0, [r0, #8] - str r5, [r0, r4, lsl #2] - b _020425D8 -_020425CC: - mov r0, #2 - bl PlaySeVolumeWrapper - mov r5, #0 -_020425D8: - bl sub_02042B20 - cmp r0, #0 - beq _020425FC - ldr r0, _02042618 ; =UNK_STORAGE_STRUCT_0XC - mov r1, #1 - ldr r0, [r0, #4] - ldrsb r0, [r0, #4] - bl sub_0202D16C - b _02042610 -_020425FC: - ldr r0, _02042618 ; =UNK_STORAGE_STRUCT_0XC - mov r1, #0 - ldr r0, [r0, #4] - ldrsb r0, [r0, #4] - bl sub_0202D16C -_02042610: - mov r0, r5 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_02042618: .word UNK_STORAGE_STRUCT_0XC - arm_func_end sub_020423D8 - - arm_func_start sub_0204261C -sub_0204261C: ; 0x0204261C - stmdb sp!, {r3, lr} - bl sub_02042BE0 - bl sub_02044308 - ldmia sp!, {r3, pc} - arm_func_end sub_0204261C - - arm_func_start sub_0204262C -sub_0204262C: ; 0x0204262C - stmdb sp!, {r3, lr} - bl sub_02042BE0 - bl sub_02044308 - ldmia sp!, {r3, pc} - arm_func_end sub_0204262C - - arm_func_start sub_0204263C -sub_0204263C: ; 0x0204263C - ldr r2, _0204265C ; =BAG_ITEMS_PTR_MIRROR - mov r1, #6 - ldr r2, [r2] - ldr ip, _02042660 ; =sub_020444B0 - ldr r2, [r2, #0x384] - mla r1, r0, r1, r2 - ldrsh r0, [r1, #4] - bx ip - .align 2, 0 -_0204265C: .word BAG_ITEMS_PTR_MIRROR -_02042660: .word sub_020444B0 - arm_func_end sub_0204263C - - arm_func_start FreeUnkStorageStruct0xA0 -FreeUnkStorageStruct0xA0: ; 0x02042664 - stmdb sp!, {r3, lr} - ldr r0, _020426B0 ; =UNK_STORAGE_STRUCT_0XC - ldr r0, [r0, #4] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl sub_02044474 - bl sub_020442CC - bl sub_020445C8 - ldr r0, _020426B0 ; =UNK_STORAGE_STRUCT_0XC - ldr r0, [r0, #4] - ldrsb r0, [r0, #4] - bl CloseCollectionMenu - ldr r0, _020426B0 ; =UNK_STORAGE_STRUCT_0XC - ldr r0, [r0, #4] - bl MemFree - ldr r0, _020426B0 ; =UNK_STORAGE_STRUCT_0XC - mov r1, #0 - str r1, [r0, #4] - ldmia sp!, {r3, pc} - .align 2, 0 -_020426B0: .word UNK_STORAGE_STRUCT_0XC - arm_func_end FreeUnkStorageStruct0xA0 - - arm_func_start sub_020426B4 -sub_020426B4: ; 0x020426B4 - stmdb sp!, {r3, lr} - ldr r0, _0204272C ; =UNK_STORAGE_STRUCT_0XC - ldr r0, [r0, #4] - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, pc} - ldrsb r0, [r0, #4] - bl IsCollectionMenuActive - cmp r0, #0 - bne _02042708 - ldr r0, _0204272C ; =UNK_STORAGE_STRUCT_0XC - ldr r0, [r0, #4] - ldrsb r0, [r0, #4] - bl sub_0202C75C - mvn r1, #0 - cmp r0, r1 - ldrne r1, _0204272C ; =UNK_STORAGE_STRUCT_0XC - moveq r0, #2 - strneh r0, [r1] - movne r0, #3 - ldmia sp!, {r3, pc} -_02042708: - ldr r0, _0204272C ; =UNK_STORAGE_STRUCT_0XC - ldr r0, [r0, #4] - ldrsb r0, [r0, #4] - bl GetWindowIdSelectedMenuItemIdx - and r1, r0, #0xff - mov r0, #0x14 - bl Arm9StoreUnkFieldNa0x2029ED8 - mov r0, #0 - ldmia sp!, {r3, pc} - .align 2, 0 -_0204272C: .word UNK_STORAGE_STRUCT_0XC - arm_func_end sub_020426B4 - - arm_func_start sub_02042730 -sub_02042730: ; 0x02042730 - ldr r0, _02042740 ; =UNK_STORAGE_STRUCT_0XC - mov r1, #0 - strh r1, [r0] - bx lr - .align 2, 0 -_02042740: .word UNK_STORAGE_STRUCT_0XC - arm_func_end sub_02042730 - - arm_func_start sub_02042744 -sub_02042744: ; 0x02042744 - ldr r0, _02042758 ; =UNK_STORAGE_STRUCT_0XC - ldr ip, _0204275C ; =sub_0202C620 - ldr r0, [r0, #4] - ldrsb r0, [r0, #4] - bx ip - .align 2, 0 -_02042758: .word UNK_STORAGE_STRUCT_0XC -_0204275C: .word sub_0202C620 - arm_func_end sub_02042744 - - arm_func_start sub_02042760 -sub_02042760: ; 0x02042760 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #0x64 - mov r5, r1 - mov r1, #6 - ldr r3, _02042A64 ; =BAG_ITEMS_PTR_MIRROR - mul r4, r5, r1 - ldr r1, [r3] - ldr r3, _02042A68 ; =UNK_STORAGE_STRUCT_0XC - ldr r6, [r1, #0x384] - ldr r7, [r3, #4] - ldrh r1, [r6, r4] - add lr, r6, r4 - mov r4, r2 - strh r1, [sp] - ldrh ip, [lr, #2] - mov r6, r0 - add r1, sp, #0 - strh ip, [sp, #2] - ldrh r2, [lr, #4] - strh r2, [sp, #4] - ldr r2, [r7] - cmp r2, #5 - addls pc, pc, r2, lsl #2 - b _02042A3C -_020427C0: ; jump table - b _020427D8 ; case 0 - b _020427E4 ; case 1 - b _020427E4 ; case 2 - b _02042808 ; case 3 - b _020428D4 ; case 4 - b _020429E8 ; case 5 -_020427D8: - mov r2, #0 - bl MaybeGetColoredFormattedItemName - b _02042A3C -_020427E4: - mov r7, #0 - mov r3, #1 - add r2, sp, #8 - str r7, [sp, #8] - strb r7, [sp, #0xc] - strb r3, [sp, #0x10] - strb r3, [sp] - bl MaybeGetColoredFormattedItemName - b _02042A3C -_02042808: - mov r1, #0 - mov r0, #1 - str r1, [sp, #8] - strb r1, [sp, #0xc] - strb r0, [sp, #0x10] - strb r0, [sp] - ldr r0, [r3, #8] - ldr r0, [r0, r5, lsl #2] - tst r0, #1 - bne _0204284C - mov r0, r5, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetItemAtIdx - ldrsh r0, [r0, #4] - bl IsStorableItem - cmp r0, #0 - beq _02042890 -_0204284C: - add r0, sp, #0x14 - add r1, sp, #0 - add r2, sp, #8 - bl MaybeGetColoredFormattedItemName - ldrb r2, [sp, #1] - cmp r2, #0 - beq _0204287C - ldr r1, _02042A6C ; =_0209C9F4 - add r3, sp, #0x14 - mov r0, r6 - bl SprintfStatic__02042A84 - b _02042A3C -_0204287C: - ldr r1, _02042A70 ; =_0209C9FC - add r2, sp, #0x14 - mov r0, r6 - bl SprintfStatic__02042A84 - b _02042A3C -_02042890: - add r0, sp, #0x14 - add r1, sp, #0 - add r2, sp, #8 - bl MaybeGetUncoloredFormattedItemName - ldrb r2, [sp, #1] - cmp r2, #0 - beq _020428C0 - ldr r1, _02042A74 ; =_0209CA08 - add r3, sp, #0x14 - mov r0, r6 - bl SprintfStatic__02042A84 - b _02042A3C -_020428C0: - ldr r1, _02042A78 ; =_0209CA18 - add r2, sp, #0x14 - mov r0, r6 - bl SprintfStatic__02042A84 - b _02042A3C -_020428D4: - ldrsh r0, [sp, #4] - bl IsShoppableItem - cmp r0, #0 - beq _020429A4 - mov r7, #3 - mov r3, #0 - mov r2, #0x6a - mov r1, #1 - add r0, sp, #0 - str r7, [sp, #8] - strb r3, [sp, #0xc] - strh r2, [sp, #0xe] - strb r1, [sp, #0x10] - strb r7, [sp] - bl GetActualSellPrice - mov r7, r0 - bl GetMoneyCarried - ldr r1, _02042A7C ; =0x0001869F - add r0, r7, r0 - cmp r0, r1 - add r0, sp, #0x14 - add r1, sp, #0 - add r2, sp, #8 - bgt _0204296C - bl MaybeGetColoredFormattedItemName - ldrb r2, [sp, #1] - cmp r2, #0 - beq _02042958 - ldr r1, _02042A6C ; =_0209C9F4 - add r3, sp, #0x14 - mov r0, r6 - bl SprintfStatic__02042A84 - b _02042A3C -_02042958: - ldr r1, _02042A70 ; =_0209C9FC - add r2, sp, #0x14 - mov r0, r6 - bl SprintfStatic__02042A84 - b _02042A3C -_0204296C: - bl MaybeGetUncoloredFormattedItemName - ldrb r2, [sp, #1] - cmp r2, #0 - beq _02042990 - ldr r1, _02042A74 ; =_0209CA08 - add r3, sp, #0x14 - mov r0, r6 - bl SprintfStatic__02042A84 - b _02042A3C -_02042990: - ldr r1, _02042A78 ; =_0209CA18 - add r2, sp, #0x14 - mov r0, r6 - bl SprintfStatic__02042A84 - b _02042A3C -_020429A4: - add r0, sp, #0x14 - add r1, sp, #0 - mov r2, #0 - bl MaybeGetUncoloredFormattedItemName - ldrb r2, [sp, #1] - cmp r2, #0 - beq _020429D4 - ldr r1, _02042A74 ; =_0209CA08 - add r3, sp, #0x14 - mov r0, r6 - bl SprintfStatic__02042A84 - b _02042A3C -_020429D4: - ldr r1, _02042A78 ; =_0209CA18 - add r2, sp, #0x14 - mov r0, r6 - bl SprintfStatic__02042A84 - b _02042A3C -_020429E8: - ldrsh r0, [sp, #4] - mov r2, #0 - mov r1, #1 - str r2, [sp, #8] - strb r2, [sp, #0xc] - strb r1, [sp, #0x10] - strb r1, [sp] - bl IsGummi - cmp r0, #0 - add r1, sp, #0 - add r2, sp, #8 - beq _02042A24 - mov r0, r6 - bl MaybeGetColoredFormattedItemName - b _02042A3C -_02042A24: - add r0, sp, #0x14 - bl MaybeGetUncoloredFormattedItemName - ldr r1, _02042A80 ; =_0209CA2C - add r2, sp, #0x14 - mov r0, r6 - bl SprintfStatic__02042A84 -_02042A3C: - ldr r0, _02042A68 ; =UNK_STORAGE_STRUCT_0XC - ldr r0, [r0, #8] - ldr r0, [r0, r5, lsl #2] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - str r0, [r4] - mov r0, r6 - add sp, sp, #0x64 - ldmia sp!, {r4, r5, r6, r7, pc} - .align 2, 0 -_02042A64: .word BAG_ITEMS_PTR_MIRROR -_02042A68: .word UNK_STORAGE_STRUCT_0XC -_02042A6C: .word _0209C9F4 -_02042A70: .word _0209C9FC -_02042A74: .word _0209CA08 -_02042A78: .word _0209CA18 -_02042A7C: .word 0x0001869F -_02042A80: .word _0209CA2C - arm_func_end sub_02042760 - - arm_func_start SprintfStatic__02042A84 -SprintfStatic__02042A84: ; 0x02042A84 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3, lr} - add r2, sp, #0xc - bic r2, r2, #3 - ldr r1, [sp, #0xc] - add r2, r2, #4 - bl vsprintf - ldmia sp!, {r3, lr} - add sp, sp, #0x10 - bx lr - arm_func_end SprintfStatic__02042A84 - - arm_func_start sub_02042AAC -sub_02042AAC: ; 0x02042AAC - stmdb sp!, {r3, lr} - ldr r0, _02042AD8 ; =UNK_STORAGE_STRUCT_0XC - ldr r0, [r0, #4] - cmp r0, #0 - ldrnesb r0, [r0, #4] - mvnne r1, #1 - cmpne r0, r1 - moveq r0, #0 - ldmeqia sp!, {r3, pc} - bl IsCollectionMenuState3 - ldmia sp!, {r3, pc} - .align 2, 0 -_02042AD8: .word UNK_STORAGE_STRUCT_0XC - arm_func_end sub_02042AAC - - arm_func_start sub_02042ADC -sub_02042ADC: ; 0x02042ADC - ldr r0, _02042AF0 ; =UNK_STORAGE_STRUCT_0XC - ldr ip, _02042AF4 ; =sub_0202D0EC - ldr r0, [r0, #4] - ldrsb r0, [r0, #4] - bx ip - .align 2, 0 -_02042AF0: .word UNK_STORAGE_STRUCT_0XC -_02042AF4: .word sub_0202D0EC - arm_func_end sub_02042ADC diff --git a/asm/main_0203EFD4.s b/asm/main_0203EFD4.s new file mode 100644 index 00000000..d8983601 --- /dev/null +++ b/asm/main_0203EFD4.s @@ -0,0 +1,4533 @@ + .include "asm/macros.inc" + .include "main_0203EFD4.inc" + + .text + + arm_func_start FreeMissionRewardStructMain +FreeMissionRewardStructMain: ; 0x0203EFD4 + stmdb sp!, {r3, lr} + ldr r0, _0203F008 ; =MISSION_REWARD_STRUCT_MAIN_PTR + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl MissionRewardCloseAllBoxes + ldr r0, _0203F008 ; =MISSION_REWARD_STRUCT_MAIN_PTR + ldr r0, [r0] + bl MemFree + ldr r0, _0203F008 ; =MISSION_REWARD_STRUCT_MAIN_PTR + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_0203F008: .word MISSION_REWARD_STRUCT_MAIN_PTR + arm_func_end FreeMissionRewardStructMain + + arm_func_start sub_0203F00C +sub_0203F00C: ; 0x0203F00C + stmdb sp!, {r3, lr} + ldr r1, _0203F058 ; =MISSION_REWARD_STRUCT_MAIN_PTR + mvn r0, #1 + ldr r1, [r1] + ldrsb r1, [r1, #6] + cmp r1, r0 + ldmneia sp!, {r3, pc} + mov r0, #0 + mov r1, #3 + mov r2, #1 + bl CreatePortraitBox + ldr r1, _0203F058 ; =MISSION_REWARD_STRUCT_MAIN_PTR + ldr r2, [r1] + strb r0, [r2, #6] + ldr r1, [r1] + ldrsb r0, [r1, #6] + add r1, r1, #0x190 + bl ShowPortraitInPortraitBox + ldmia sp!, {r3, pc} + .align 2, 0 +_0203F058: .word MISSION_REWARD_STRUCT_MAIN_PTR + arm_func_end sub_0203F00C + + arm_func_start MissionRewardCloseAllBoxes +MissionRewardCloseAllBoxes: ; 0x0203F05C + stmdb sp!, {r3, lr} + ldr r0, _0203F0EC ; =MISSION_REWARD_STRUCT_MAIN_PTR + mvn r1, #1 + ldr r0, [r0] + ldrsb r0, [r0, #4] + cmp r0, r1 + beq _0203F08C + bl CloseParentMenu + ldr r0, _0203F0EC ; =MISSION_REWARD_STRUCT_MAIN_PTR + mvn r1, #1 + ldr r0, [r0] + strb r1, [r0, #4] +_0203F08C: + ldr r0, _0203F0EC ; =MISSION_REWARD_STRUCT_MAIN_PTR + mvn r1, #1 + ldr r0, [r0] + ldrsb r0, [r0, #5] + cmp r0, r1 + beq _0203F0B8 + bl CloseDialogueBox + ldr r0, _0203F0EC ; =MISSION_REWARD_STRUCT_MAIN_PTR + mvn r1, #1 + ldr r0, [r0] + strb r1, [r0, #5] +_0203F0B8: + ldr r0, _0203F0EC ; =MISSION_REWARD_STRUCT_MAIN_PTR + mvn r1, #1 + ldr r0, [r0] + ldrsb r0, [r0, #6] + cmp r0, r1 + beq _0203F0E4 + bl ClosePortraitBox + ldr r0, _0203F0EC ; =MISSION_REWARD_STRUCT_MAIN_PTR + mvn r1, #1 + ldr r0, [r0] + strb r1, [r0, #6] +_0203F0E4: + bl sub_02046D20 + ldmia sp!, {r3, pc} + .align 2, 0 +_0203F0EC: .word MISSION_REWARD_STRUCT_MAIN_PTR + arm_func_end MissionRewardCloseAllBoxes + + arm_func_start sub_0203F0F0 +sub_0203F0F0: ; 0x0203F0F0 + stmdb sp!, {r4, lr} + ldr r1, _0203F148 ; =_020AFE78 + ldr r2, _0203F14C ; =_0209C89C + ldr r3, [r1] + mov r4, r0 + ldrsh r1, [r3, #0xc] + add r0, r3, #0xdc + add r1, r3, r1, lsl #2 + ldr r1, [r1, #0x14] + mov r1, r1, lsl #1 + ldrh r1, [r2, r1] + bl GetStringFromFileVeneer + ldr r0, _0203F148 ; =_020AFE78 + mov r3, r4 + ldr r4, [r0] + ldrsh r0, [r4, #0xc] + add r1, r4, #0x64 + add r2, r4, #0x30 + add r0, r4, r0, lsl #2 + ldr r0, [r0, #0x14] + bl sub_0205A4B4 + ldmia sp!, {r4, pc} + .align 2, 0 +_0203F148: .word _020AFE78 +_0203F14C: .word _0209C89C + arm_func_end sub_0203F0F0 + + arm_func_start sub_0203F150 +sub_0203F150: ; 0x0203F150 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0xa0 + mov r6, r0 + mov r5, r1 + mov r0, #0xfc + mov r1, #8 + bl MemAlloc + ldr r2, _0203F340 ; =_020AFE78 + mvn r1, #1 + str r0, [r2] + mov ip, #0 + strb r1, [r0] + mov r0, ip +_0203F184: + add r1, ip, #1 + ldr r3, [r2] + mov r1, r1, lsl #0x10 + add r3, r3, ip, lsl #2 + mov ip, r1, asr #0x10 + str r0, [r3, #0x14] + cmp ip, #6 + blt _0203F184 + ldr r3, _0203F344 ; =_0209C8C8 + ldr r2, _0203F340 ; =_020AFE78 + mov r1, #0x18 + ldr ip, [r2] + mla r1, r5, r1, r3 + strh r0, [ip, #0xe] + b _0203F1E0 +_0203F1C0: + ldr r0, [r2] + ldr r3, [r1, lr, lsl #2] + add r0, r0, lr, lsl #2 + str r3, [r0, #0x14] + ldr r3, [r2] + ldrsh r0, [r3, #0xe] + add r0, r0, #1 + strh r0, [r3, #0xe] +_0203F1E0: + ldr ip, [r2] + ldrsh lr, [ip, #0xe] + cmp lr, #6 + bge _0203F1FC + ldr r0, [r1, lr, lsl #2] + cmp r0, #0 + bne _0203F1C0 +_0203F1FC: + mov r3, #0 + strh r3, [ip, #0xc] + ldr r0, _0203F340 ; =_020AFE78 + sub r2, r3, #1 + ldr r1, [r0] + mov ip, #1 + strh r2, [r1, #0x10] + ldr r1, [r0] + strh r3, [r1, #0x12] + ldr r2, [r0] + mov r1, r6 + strb ip, [r2, #0x2c] + ldr r3, [r0] + mov r2, #0x78 + str r5, [r3, #4] + ldr r3, [r0] + str ip, [r3, #8] + ldr r0, [r0] + add r0, r0, #0x64 + bl memcpy + ldr r0, _0203F340 ; =_020AFE78 + ldr r1, _0203F348 ; =0x00000975 + ldr r3, [r0] + mov r0, #0x10 + str r0, [sp, #0x14] + strh r1, [sp, #0x10] + ldrsh r2, [r3, #0xc] + add r0, r3, #0xdc + mov r1, #0xc + str r1, [sp, #0xc] + str r0, [sp, #0x50] + str r2, [sp, #8] + ldrsh r2, [r3, #0xc] + ldr r1, _0203F34C ; =_0209C89C + add r2, r3, r2, lsl #2 + ldr r2, [r2, #0x14] + mov r2, r2, lsl #1 + ldrh r1, [r1, r2] + bl GetStringFromFileVeneer + ldr r0, _0203F340 ; =_020AFE78 + ldr r2, [r0] + ldr r0, [r2, #4] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0203F324 +_0203F2B0: ; jump table + b _0203F2C0 ; case 0 + b _0203F2C0 ; case 1 + b _0203F2FC ; case 2 + b _0203F2FC ; case 3 +_0203F2C0: + cmp r0, #1 + ldrsh r4, [r2, #0xe] + ldreq r1, _0203F350 ; =0x60481C3B + ldr r0, _0203F354 ; =_0209C8A8 + str r4, [sp] + mov r4, #1 + ldrne r1, _0203F358 ; =0x60489C3B + ldr r3, _0203F35C ; =sub_0203F0F0 + add r2, sp, #8 + str r4, [sp, #4] + bl CreateAdvancedTextBox + ldr r1, _0203F360 ; =sub_0203F928 + mov r4, r0 + bl SetUnkAdvancedTextBoxWindowFn + b _0203F324 +_0203F2FC: + ldrsh r4, [r2, #0xe] + ldr r0, _0203F354 ; =_0209C8A8 + ldr r1, _0203F364 ; =0x60089C3B + str r4, [sp] + mov r4, #1 + ldr r3, _0203F35C ; =sub_0203F0F0 + add r2, sp, #8 + str r4, [sp, #4] + bl CreateAdvancedTextBox + mov r4, r0 +_0203F324: + ldr r0, _0203F340 ; =_020AFE78 + ldr r1, [r0] + strb r4, [r1] + ldr r0, [r0] + ldrsb r0, [r0] + add sp, sp, #0xa0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_0203F340: .word _020AFE78 +_0203F344: .word _0209C8C8 +#ifdef JAPAN +_0203F348: .word 0x00002345 +#else +_0203F348: .word 0x00000975 +#endif +_0203F34C: .word _0209C89C +_0203F350: .word 0x60481C3B +_0203F354: .word _0209C8A8 +_0203F358: .word 0x60489C3B +_0203F35C: .word sub_0203F0F0 +_0203F360: .word sub_0203F928 +_0203F364: .word 0x60089C3B + arm_func_end sub_0203F150 + + arm_func_start sub_0203F368 +sub_0203F368: ; 0x0203F368 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _0203F394 ; =_020AFE78 + mov r5, r0 + ldr r0, [r2] + mov r4, r1 + add r0, r0, #0x64 + bl sub_0205B0B8 + str r0, [r5] + mov r0, #0xc + str r0, [r4] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0203F394: .word _020AFE78 + arm_func_end sub_0203F368 + + arm_func_start sub_0203F398 +sub_0203F398: ; 0x0203F398 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #0x10 + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r4, [r0] + cmp r4, #0 + moveq r0, #1 + beq _0203F8CC + ldr r0, [r4, #8] + cmp r0, #4 + addls pc, pc, r0, lsl #2 + b _0203F8C8 +_0203F3C4: ; jump table + b _0203F3D8 ; case 0 + b _0203F404 ; case 1 + b _0203F8C8 ; case 2 + b _0203F83C ; case 3 + b _0203F898 ; case 4 +_0203F3D8: + ldrsb r0, [r4] + bl sub_020307EC + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r0, [r0] + ldrsb r0, [r0] + bl sub_0202810C + ldr r0, _0203F8D4 ; =_020AFE78 + mov r1, #1 + ldr r0, [r0] + str r1, [r0, #8] + b _0203F8C8 +_0203F404: + ldrsb r0, [r4] + mov r1, #0 + bl SetUnkAdvancedTextBoxFn + ldr r0, _0203F8D4 ; =_020AFE78 +#ifdef JAPAN + ldr r1, [r0] + ldrb r0, [r1, #0x2c] + cmp r0, #0 + beq _0203F464 + ldrsb r0, [r1] + ldrsh r1, [r1, #0x12] +#else + ldr r2, [r0] + ldrb r0, [r2, #0x2c] + cmp r0, #0 + beq _0203F464 + ldrsh r0, [r2, #0xc] + add r0, r2, r0, lsl #2 + ldr r0, [r0, #0x14] + cmp r0, #1 + ldreqsh r1, [r2, #0x12] + ldrsb r0, [r2] + movne r1, #0 +#endif + bl sub_02030A50 + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r0, [r0] + ldrsb r0, [r0] + bl SetAdvancedTextBoxField0x1C2 + ldr r0, _0203F8D4 ; =_020AFE78 + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x2c] +_0203F464: + add r1, sp, #0xc + mov r0, #0 + bl sub_02006498 + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r0, [r0] + ldrsb r0, [r0] + bl GetWindowIdPageStart + ldr r1, _0203F8D4 ; =_020AFE78 + ldr r2, [r1] + strh r0, [r2, #0xc] + ldr r3, [r1] + ldrsh r2, [r3, #0xc] + ldrsh r0, [r3, #0x10] + cmp r0, r2 + strneh r2, [r3, #0x10] + ldrne r0, [r1] + movne r1, #1 + strneb r1, [r0, #0x2c] + bne _0203F8C8 + add r0, r3, r2, lsl #2 + ldr r0, [r0, #0x14] + cmp r0, #1 + ldrsb r0, [r3] + bne _0203F7EC + ldr r1, _0203F8D8 ; =sub_0203F368 + bl SetUnkAdvancedTextBoxFn + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r0, [r0] + ldrsb r0, [r0] + bl GetAdvancedTextBoxFlags2 + ldr r1, _0203F8D4 ; =_020AFE78 + mov r4, r0 + ldr r0, [r1] + ldrsb r0, [r0] + bl sub_02028354 + cmp r0, #3 + beq _0203F508 + bl sub_0203F8EC + cmp r0, #0 + movne r1, #1 + bne _0203F50C +_0203F508: + mov r1, #0 +_0203F50C: + ldr r0, _0203F8D4 ; =_020AFE78 + and r5, r1, #0xff + ldr r0, [r0] + ldrsb r0, [r0] + bl IsAdvancedTextBoxActive + cmp r0, #0 + bne _0203F588 + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r0, [r0] + ldrsb r0, [r0] + bl sub_02030908 + cmp r0, #0 + blt _0203F558 + bl sub_0203F8EC + cmp r0, #0 + beq _0203F558 + bl sub_02001808 + cmp r0, #0xa000 + bge _0203F560 +_0203F558: + mov r0, #1 + b _0203F8CC +_0203F560: + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r0, [r0] + ldrsb r0, [r0] + bl sub_0202812C + ldr r0, _0203F8D4 ; =_020AFE78 + mov r1, #3 + ldr r0, [r0] + mov r5, #0 + str r1, [r0, #8] + b _0203F748 +_0203F588: + ldrh r0, [sp, #0xc] + tst r0, #8 + cmpne r5, #0 + beq _0203F5FC + bl sub_0203F8EC + cmp r0, #0 + beq _0203F748 + ldr r0, _0203F8D4 ; =_020AFE78 + mov r1, #0 + ldr r0, [r0] + ldrsb r0, [r0] + bl PlayAdvancedTextBoxInputSound + bl sub_02001808 + cmp r0, #0xa000 + blt _0203F748 + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r0, [r0] + ldrsb r0, [r0] + bl sub_02030EF0 + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r0, [r0] + ldrsb r0, [r0] + bl sub_0202812C + ldr r0, _0203F8D4 ; =_020AFE78 + mov r1, #3 + ldr r0, [r0] + mov r5, #0 + str r1, [r0, #8] + b _0203F748 +_0203F5FC: + tst r0, #0x40 + bne _0203F60C + tst r4, #0x40000 + beq _0203F698 +_0203F60C: + cmp r5, #0 + beq _0203F698 + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r2, [r0] + ldrsh r1, [r2, #0x12] + cmp r1, #0 + bne _0203F660 + ldrsh r1, [r2, #0xba] + cmp r1, #0 + beq _0203F748 + sub r1, r1, #1 + strh r1, [r2, #0xba] + ldr r0, [r0] + mov r1, #1 + strb r1, [r0, #0x2c] + ldrh r0, [sp, #0xc] + tst r0, #0x40 + beq _0203F748 + mov r0, #3 + bl PlaySeVolumeWrapper + b _0203F748 +_0203F660: + ldrsb r0, [r2] + bl sub_02030A64 + cmp r0, #0 + bne _0203F680 + tst r4, #0x40000 + bne _0203F680 + mov r0, #3 + bl PlaySeVolumeWrapper +_0203F680: + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r1, [r0] + ldrsh r0, [r1, #0x12] + sub r0, r0, #1 + strh r0, [r1, #0x12] + b _0203F748 +_0203F698: + tst r0, #0x80 + bne _0203F6A8 + tst r4, #0x80000 + beq _0203F748 +_0203F6A8: + cmp r5, #0 + beq _0203F748 + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r3, [r0] + ldrsh r1, [r3, #0x12] + cmp r1, #8 + bne _0203F708 + ldrsh r2, [r3, #0xba] + add r1, r2, #9 + add r1, r3, r1 + ldrb r1, [r1, #0xbc] + cmp r1, #0 + beq _0203F748 + add r1, r2, #1 + strh r1, [r3, #0xba] + ldr r0, [r0] + mov r1, #1 + strb r1, [r0, #0x2c] + ldrh r0, [sp, #0xc] + tst r0, #0x80 + beq _0203F748 + mov r0, #3 + bl PlaySeVolumeWrapper + b _0203F748 +_0203F708: + ldrsb r0, [r3] + bl sub_02030A64 + cmp r0, #8 + bne _0203F728 + tst r4, #0x80000 + bne _0203F728 + mov r0, #3 + bl PlaySeVolumeWrapper +_0203F728: + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r2, [r0] + ldrsh r0, [r2, #0x12] + add r1, r0, #1 + add r0, r2, r1 + ldrb r0, [r0, #0xbc] + cmp r0, #0 + strneh r1, [r2, #0x12] +_0203F748: + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r1, [r0] + ldrsh r0, [r1, #0xba] + add r0, r0, #9 + add r0, r1, r0 + ldrb r0, [r0, #0xbc] + cmp r0, #0 + ldrsb r0, [r1] + mov r1, #0x40000000 + beq _0203F778 + bl sub_02030A90 + b _0203F77C +_0203F778: + bl sub_02030A74 +_0203F77C: + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r1, [r0] + ldrsh r0, [r1, #0xba] + cmp r0, #0 + ldrsb r0, [r1] + mov r1, #0x20000000 + bne _0203F7A0 + bl sub_02030A74 + b _0203F7A4 +_0203F7A0: + bl sub_02030A90 +_0203F7A4: + cmp r5, #0 + beq _0203F7D8 + ldr r0, _0203F8D4 ; =_020AFE78 + mov r3, #0xc + ldr r0, [r0] + mov r1, #1 + ldrsh r4, [r0, #0x12] + ldrsb r0, [r0] + mov r2, #3 + smulbb r3, r4, r3 + add r3, r3, #0x11 + bl sub_02030978 + b _0203F8C8 +_0203F7D8: + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r0, [r0] + ldrsb r0, [r0] + bl sub_020288DC + b _0203F8C8 +_0203F7EC: + mov r1, #0x20000000 + bl sub_02030A74 + ldr r0, _0203F8D4 ; =_020AFE78 + mov r1, #0x40000000 + ldr r0, [r0] + ldrsb r0, [r0] + bl sub_02030A74 + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r0, [r0] + ldrsb r0, [r0] + bl IsAdvancedTextBoxActive + cmp r0, #0 + beq _0203F834 + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r0, [r0] + ldrsb r0, [r0] + bl sub_020288DC + b _0203F8C8 +_0203F834: + mov r0, #1 + b _0203F8CC +_0203F83C: + ldrsh r2, [r4, #0xba] + ldrsh r0, [r4, #0x12] + ldr r3, _0203F8DC ; =_0209E912 + ldr r1, _0203F8E0 ; =STATUSES_FULL_DESCRIPTION_STRING_IDS + add r0, r2, r0 + add r0, r4, r0 + ldrb r4, [r0, #0xbc] + mov r2, #0 + ldr r0, _0203F8E4 ; =_0209C8B8 + mov r5, r4, lsl #2 + ldrh r4, [r3, r5] + ldrh r3, [r1, r5] + ldr r1, _0203F8E8 ; =0x00001013 + stmia sp, {r2, r4} + str r2, [sp, #8] + bl CreateScrollBoxSingle + ldr r1, _0203F8D4 ; =_020AFE78 + mov r2, #4 + ldr r3, [r1] + strb r0, [r3, #1] + ldr r0, [r1] + str r2, [r0, #8] + b _0203F8C8 +_0203F898: + ldrsb r0, [r4, #1] + bl IsScrollBoxActive + cmp r0, #0 + bne _0203F8C8 + ldr r0, _0203F8D4 ; =_020AFE78 + ldr r0, [r0] + ldrsb r0, [r0, #1] + bl CloseScrollBox + ldr r0, _0203F8D4 ; =_020AFE78 + mov r1, #0 + ldr r0, [r0] + str r1, [r0, #8] +_0203F8C8: + mov r0, #0 +_0203F8CC: + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0203F8D4: .word _020AFE78 +_0203F8D8: .word sub_0203F368 +_0203F8DC: .word _0209E912 +_0203F8E0: .word STATUSES_FULL_DESCRIPTION_STRING_IDS +_0203F8E4: .word _0209C8B8 +_0203F8E8: .word 0x00001013 + arm_func_end sub_0203F398 + + arm_func_start sub_0203F8EC +sub_0203F8EC: ; 0x0203F8EC + ldr r0, _0203F924 ; =_020AFE78 + mov r1, #0 + ldr r2, [r0] + b _0203F914 +_0203F8FC: + add r0, r2, r1 + ldrb r0, [r0, #0xbc] + cmp r0, #0 + movne r0, #1 + bxne lr + add r1, r1, #1 +_0203F914: + cmp r1, #0x1e + blt _0203F8FC + mov r0, #0 + bx lr + .align 2, 0 +_0203F924: .word _020AFE78 + arm_func_end sub_0203F8EC + + arm_func_start sub_0203F928 +sub_0203F928: ; 0x0203F928 + stmdb sp!, {r4, lr} + mov r4, r0 + cmp r1, #0 + ldmeqia sp!, {r4, pc} + bl sub_02030908 + ldr r2, _0203F970 ; =_020AFE78 + mov r3, #0xc + ldr ip, [r2] + mov r1, #1 + strh r0, [ip, #0x12] + ldr r2, [r2] + mov r0, r4 + ldrsh ip, [r2, #0x12] + mov r2, #3 + smulbb r3, ip, r3 + add r3, r3, #0x11 + bl sub_02030978 + ldmia sp!, {r4, pc} + .align 2, 0 +_0203F970: .word _020AFE78 + arm_func_end sub_0203F928 + + arm_func_start sub_0203F974 +sub_0203F974: ; 0x0203F974 + ldr r0, _0203F988 ; =_020AFE78 + ldr ip, _0203F98C ; =SetAdvancedTextBoxState5 + ldr r0, [r0] + ldrsb r0, [r0] + bx ip + .align 2, 0 +_0203F988: .word _020AFE78 +_0203F98C: .word SetAdvancedTextBoxState5 + arm_func_end sub_0203F974 + + arm_func_start sub_0203F990 +sub_0203F990: ; 0x0203F990 + stmdb sp!, {r3, lr} + ldr r0, _0203F9C8 ; =_020AFE78 + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldrsb r0, [r0] + bl CloseAdvancedTextBox + ldr r0, _0203F9C8 ; =_020AFE78 + ldr r0, [r0] + bl MemFree + ldr r0, _0203F9C8 ; =_020AFE78 + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_0203F9C8: .word _020AFE78 + arm_func_end sub_0203F990 + + arm_func_start sub_0203F9CC +sub_0203F9CC: ; 0x0203F9CC + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0203FA50 ; =_022AADFC + mov r2, #0 + mov r5, r0 + str r2, [r1] + ldr r4, [r5, #0xb4] + ldr r0, _0203FA54 ; =_022AAE00 + mov r1, r4 + bl GetMonsterName + ldr r0, _0203FA58 ; =_022AAE2A +#ifdef JAPAN + add r1, r4, #0x120 +#else + add r1, r4, #0x124 +#endif + mov r2, #0x22 + bl memcpy + ldrb r2, [r4, #7] + ldr r1, _0203FA50 ; =_022AADFC + mov r0, #0 + strb r2, [r1, #0x2c] + str r5, [r1] + strb r0, [r1, #0x58] + ldrsh r2, [r4, #4] + ldr r0, _0203FA5C ; =0x000001A2 + ldr r3, _0203FA60 ; =_022AAE58 + cmp r2, r0 + moveq r0, #1 + streqb r0, [r1, #0x58] + ldrsh r1, [r4, #2] + ldr r0, _0203FA50 ; =_022AADFC + strh r1, [r0, #0x5a] + add r0, r4, #0x9c + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0203FA50: .word _022AADFC +_0203FA54: .word _022AAE00 +_0203FA58: .word _022AAE2A +_0203FA5C: .word 0x000001A2 +_0203FA60: .word _022AAE58 + arm_func_end sub_0203F9CC + + arm_func_start sub_0203FA64 +sub_0203FA64: ; 0x0203FA64 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x14 + ldr r1, _0203FBBC ; =TEAM_MEMBER_TABLE_PTR + mov sl, r0 + mov r0, #0x44 + smulbb r2, sl, r0 + ldr r1, [r1] + mov r4, #0x46 + ldrb r0, [r1, r2] + add r8, r1, r2 + tst r0, #1 + movne r0, #1 + moveq r0, #0 + tst r0, #0xff + moveq r0, #0 + beq _0203FBB4 + ldr r1, _0203FBC0 ; =_022AADFC + mov r2, #0 + mov r0, sl + str r2, [r1] + bl sub_02056410 + cmp r0, #0 + mov r0, sl + beq _0203FAD4 + bl sub_020564B0 + cmp r0, #0 + movne r4, #0x59 + b _0203FAE4 +_0203FAD4: + bl sub_02056F60 + cmp r0, #0 + movne r4, #0x44 + moveq r4, #0x57 +_0203FAE4: + add r0, sp, #0 + add r1, r8, #0x3a + mov r2, #0xa + bl StrncpySimpleNoPadSafe + ldr r0, _0203FBC4 ; =_022AAE00 + ldr r1, _0203FBC8 ; =_0209C96C + add r3, sp, #0 + and r2, r4, #0xff + bl SprintfStatic__0204174C + ldrsh r1, [r8, #4] + ldr r0, _0203FBC0 ; =_022AADFC + ldr r3, _0203FBCC ; =_022AAE58 + strh r1, [r0, #0x5a] + add r4, r8, #0x14 + ldmia r4, {r0, r1, r2} + stmia r3, {r0, r1, r2} + ldrsh r0, [r8, #4] + mov r1, r4 + bl GetPpIncrease + mov r6, #0 + ldr r5, _0203FBD0 ; =_022AAE2A + ldr r4, _0203FBC0 ; =_022AADFC + mov r7, r0 + mov fp, r6 +_0203FB44: + mov r0, #6 + mla sb, r6, r0, r8 + ldrh r1, [sb, #0x24] + add r0, r5, r6, lsl #3 + bl InitMove + ldrb r1, [sb, #0x22] + add r2, r4, r6, lsl #3 + add r0, r5, r6, lsl #3 + strb r1, [r2, #0x2e] + strh r7, [r2, #0x30] + strb fp, [r2, #0x34] + ldrb r1, [sb, #0x26] + strb r1, [r2, #0x35] + bl GetMaxPp + add r1, r6, #1 + add r2, r4, r6, lsl #3 + mov r1, r1, lsl #0x10 + mov r6, r1, lsr #0x10 + strb r0, [r2, #0x34] + cmp r6, #4 + blo _0203FB44 + mov r0, sl + bl sub_020564B0 + ldr r1, _0203FBC0 ; =_022AADFC + strb r0, [r1, #0x2c] + ldrsh r0, [r8, #4] + bl sub_02041724 + mov r0, #1 +_0203FBB4: + add sp, sp, #0x14 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0203FBBC: .word TEAM_MEMBER_TABLE_PTR +_0203FBC0: .word _022AADFC +_0203FBC4: .word _022AAE00 +_0203FBC8: .word _0209C96C +_0203FBCC: .word _022AAE58 +_0203FBD0: .word _022AAE2A + arm_func_end sub_0203FA64 + + arm_func_start sub_0203FBD4 +sub_0203FBD4: ; 0x0203FBD4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x14 + ldr r1, _0203FCFC ; =TEAM_MEMBER_TABLE_PTR + mov r2, #0x68 + ldr r1, [r1] + ldr r3, _0203FD00 ; =_022AADFC + add r1, r1, #0x9000 + ldr r1, [r1, #0x84c] + mov r4, #0 + smlabb r8, r0, r2, r1 + str r4, [r3] + ldrsh r0, [r8, #8] + sub r1, r4, #1 + cmp r0, r1 + streqb r4, [r3, #0x2c] + beq _0203FC20 + bl sub_020564B0 + ldr r1, _0203FD00 ; =_022AADFC + strb r0, [r1, #0x2c] +_0203FC20: + ldr r0, _0203FD00 ; =_022AADFC + add r1, r8, #0x5e + ldrb r0, [r0, #0x2c] + mov r2, #0xa + cmp r0, #0 + movne r4, #0x59 + add r0, sp, #0 + moveq r4, #0x46 + bl StrncpySimpleNoPadSafe + ldr r0, _0203FD04 ; =_022AAE00 + ldr r1, _0203FD08 ; =_0209C96C + add r3, sp, #0 + and r2, r4, #0xff + bl SprintfStatic__0204174C + ldrsh r0, [r8, #0xc] + add r1, r8, #0x4c + bl GetPpIncrease + ldr r5, _0203FD0C ; =_022AAE2A + ldr r4, _0203FD00 ; =_022AADFC + mov r7, r0 + mov r6, #0 +_0203FC74: + add r0, r8, r6, lsl #3 + ldrh r1, [r0, #0x20] + add r0, r5, r6, lsl #3 + bl InitMove + add r3, r8, r6, lsl #3 + ldrb r1, [r3, #0x1c] + add r2, r4, r6, lsl #3 + add r0, r5, r6, lsl #3 + strb r1, [r2, #0x2e] + strh r7, [r2, #0x30] + ldrb r1, [r3, #0x22] + strb r1, [r2, #0x34] + ldrb r1, [r3, #0x23] + strb r1, [r2, #0x35] + bl GetMaxPp + add r1, r6, #1 + add r2, r4, r6, lsl #3 + mov r1, r1, lsl #0x10 + mov r6, r1, lsr #0x10 + strb r0, [r2, #0x34] + cmp r6, #4 + blo _0203FC74 + ldrsh r0, [r8, #0xc] + bl sub_02041724 + ldrsh r1, [r8, #0xc] + ldr r0, _0203FD00 ; =_022AADFC + ldr r3, _0203FD10 ; =_022AAE58 + strh r1, [r0, #0x5a] + add r0, r8, #0x4c + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + mov r0, #1 + add sp, sp, #0x14 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_0203FCFC: .word TEAM_MEMBER_TABLE_PTR +_0203FD00: .word _022AADFC +_0203FD04: .word _022AAE00 +_0203FD08: .word _0209C96C +_0203FD0C: .word _022AAE2A +_0203FD10: .word _022AAE58 + arm_func_end sub_0203FBD4 + + arm_func_start sub_0203FD14 +sub_0203FD14: ; 0x0203FD14 + ldr ip, _0203FD24 ; =InitMove + mov r1, r0 + ldr r0, _0203FD28 ; =LAST_NEW_MOVE + bx ip + .align 2, 0 +_0203FD24: .word InitMove +_0203FD28: .word LAST_NEW_MOVE + arm_func_end sub_0203FD14 + + arm_func_start sub_0203FD2C +sub_0203FD2C: ; 0x0203FD2C + ldr r0, _0203FD34 ; =LAST_NEW_MOVE + bx lr + .align 2, 0 +_0203FD34: .word LAST_NEW_MOVE + arm_func_end sub_0203FD2C + + arm_func_start sub_0203FD38 +sub_0203FD38: ; 0x0203FD38 + ldr r0, _0203FD40 ; =_022AAE2A + bx lr + .align 2, 0 +_0203FD40: .word _022AAE2A + arm_func_end sub_0203FD38 + + arm_func_start sub_0203FD44 +sub_0203FD44: ; 0x0203FD44 + stmdb sp!, {r4, lr} + ldr r4, [r0, #0xb4] + ldr r1, _0203FD74 ; =_022AAE2A +#ifdef JAPAN + add r0, r4, #0x120 +#else + add r0, r4, #0x124 +#endif + mov r2, #0x22 + bl memcpy + ldr r1, _0203FD78 ; =_022AADFC + ldr r0, _0203FD7C ; =_020AFE7C + ldrb r1, [r1, #0x2c] + strb r1, [r4, #7] + ldrsh r0, [r0, #2] + ldmia sp!, {r4, pc} + .align 2, 0 +_0203FD74: .word _022AAE2A +_0203FD78: .word _022AADFC +_0203FD7C: .word _020AFE7C + arm_func_end sub_0203FD44 + + arm_func_start sub_0203FD80 +sub_0203FD80: ; 0x0203FD80 + stmdb sp!, {r3, r4, r5, lr} + ldr r2, _0203FDE0 ; =TEAM_MEMBER_TABLE_PTR + mov r1, #0x44 + ldr r2, [r2] + ldr ip, _0203FDE4 ; =_022AADFC + mla r5, r0, r1, r2 + mov r4, #0 + mov r0, #6 +_0203FDA0: + mla lr, r4, r0, r5 + add r3, ip, r4, lsl #3 + ldrb r2, [r3, #0x2e] + add r1, r4, #1 + mov r1, r1, lsl #0x10 + strb r2, [lr, #0x22] + ldrh r2, [r3, #0x32] + mov r4, r1, lsr #0x10 + cmp r4, #4 + strh r2, [lr, #0x24] + ldrb r1, [r3, #0x35] + strb r1, [lr, #0x26] + blo _0203FDA0 + ldr r0, _0203FDE8 ; =_020AFE7C + ldrsh r0, [r0, #2] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0203FDE0: .word TEAM_MEMBER_TABLE_PTR +_0203FDE4: .word _022AADFC +_0203FDE8: .word _020AFE7C + arm_func_end sub_0203FD80 + + arm_func_start sub_0203FDEC +sub_0203FDEC: ; 0x0203FDEC + stmdb sp!, {r4, lr} + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + bl GetActiveTeamMember + ldr lr, _0203FE54 ; =_022AADFC + mov r4, #0 +_0203FE04: + add ip, lr, r4, lsl #3 + ldrb r2, [ip, #0x2e] + add r3, r0, r4, lsl #3 + add r1, r4, #1 + strb r2, [r3, #0x1c] + ldrh r2, [ip, #0x30] + mov r1, r1, lsl #0x10 + mov r4, r1, lsr #0x10 + strh r2, [r3, #0x1e] + ldrh r1, [ip, #0x32] + cmp r4, #4 + strh r1, [r3, #0x20] + ldrb r1, [ip, #0x34] + strb r1, [r3, #0x22] + ldrb r1, [ip, #0x35] + strb r1, [r3, #0x23] + blo _0203FE04 + ldr r0, _0203FE58 ; =_020AFE7C + ldrsh r0, [r0, #2] + ldmia sp!, {r4, pc} + .align 2, 0 +_0203FE54: .word _022AADFC +_0203FE58: .word _020AFE7C + arm_func_end sub_0203FDEC + + arm_func_start sub_0203FE5C +sub_0203FE5C: ; 0x0203FE5C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #8 + mov r7, r0 + mov r6, r1 + mov r0, #0x3fc + mov r1, #8 + mov r5, r2 + mov r4, r3 + bl MemAlloc + ldr r1, _02040154 ; =_020AFE7C + mvn r2, #1 + str r0, [r1, #8] + strb r2, [r0] + ldr r0, [r1, #0xc] + ldr r2, _02040154 ; =_020AFE7C + cmp r0, r7 + strne r7, [r1, #0xc] + movne r0, #0 + strneh r0, [r1, #2] + ldr r0, _02040154 ; =_020AFE7C + ldr r3, _02040158 ; =0x00000A3E + ldrsh r1, [r0, #4] + mov r7, #0x17 + cmp r1, r6 + strneh r6, [r0, #4] + movne r1, #0 + strneh r1, [r0, #2] + ldr r0, [r2, #8] + mov r1, #0x10 + str r1, [r0, #0x10] + ldr r0, [r2, #8] + str r1, [r0, #8] + ldr r0, [r2, #8] + mov r1, #0 + strh r3, [r0, #0xc] + ldr r0, [r2, #8] + ldr r3, _0204015C ; =_022AAE00 + str r7, [r0, #0x98] + ldr r0, [r2, #8] + str r1, [r0, #0x64] + ldr r0, [r2, #8] + str r3, [r0, #0x4c] + ldr r0, [r2, #8] + strb r1, [r0, #0x3f8] + ldr r0, [r2, #8] + str r4, [r0, #0x3f4] + ldr r0, [r2, #0xc] + cmp r0, #7 + addls pc, pc, r0, lsl #2 + b _0203FF44 +_0203FF24: ; jump table + b _02040084 ; case 0 + b _0203FF44 ; case 1 + b _0203FFAC ; case 2 + b _0204003C ; case 3 + b _0203FF44 ; case 4 + b _0203FF44 ; case 5 + b _0203FFF4 ; case 6 + b _0203FF7C ; case 7 +_0203FF44: + mov r1, #0 + str r1, [sp] + ldr r0, _02040154 ; =_020AFE7C + str r1, [sp, #4] + ldr r2, [r0, #8] + ldr r0, _02040160 ; =_0209C93C + ldr r1, _02040164 ; =0x00401803 + ldr r3, _02040168 ; =sub_020401A8 + add r2, r2, #4 + bl CreateAdvancedTextBox + ldr r1, _02040154 ; =_020AFE7C + ldr r1, [r1, #8] + strb r0, [r1] + b _020400FC +_0203FF7C: + str r1, [sp] + str r1, [sp, #4] + ldr r2, [r2, #8] + ldr r0, _0204016C ; =_0209C94C + ldr r1, _02040170 ; =0x00400800 + ldr r3, _02040168 ; =sub_020401A8 + add r2, r2, #4 + bl CreateAdvancedTextBox + ldr r1, _02040154 ; =_020AFE7C + ldr r1, [r1, #8] + strb r0, [r1] + b _020400FC +_0203FFAC: + ldr r0, [r2, #8] + mov r3, #1 + strb r3, [r0, #0x3f8] + ldr r4, [r2, #8] + ldr r0, _02040174 ; =_0209C92C + add r3, r4, #0x3e0 + str r3, [r4, #0x64] + str r1, [sp] + str r1, [sp, #4] + ldr r2, [r2, #8] + ldr r1, _02040164 ; =0x00401803 + ldr r3, _02040168 ; =sub_020401A8 + add r2, r2, #4 + bl CreateAdvancedTextBox + ldr r1, _02040154 ; =_020AFE7C + ldr r1, [r1, #8] + strb r0, [r1] + b _020400FC +_0203FFF4: + ldr r0, [r2, #8] + mov r3, #1 + strb r3, [r0, #0x3f8] + ldr r4, [r2, #8] + ldr r0, _02040174 ; =_0209C92C + add r3, r4, #0x3e0 + str r3, [r4, #0x64] + str r1, [sp] + str r1, [sp, #4] + ldr r2, [r2, #8] + ldr r1, _02040178 ; =0x00401A03 + ldr r3, _02040168 ; =sub_020401A8 + add r2, r2, #4 + bl CreateAdvancedTextBox + ldr r1, _02040154 ; =_020AFE7C + ldr r1, [r1, #8] + strb r0, [r1] + b _020400FC +_0204003C: + ldr r0, [r2, #8] + mov r3, #1 + strb r3, [r0, #0x3f8] + ldr r4, [r2, #8] + ldr r0, _0204017C ; =_0209C95C + add r3, r4, #0x3e0 + str r3, [r4, #0x64] + str r1, [sp] + str r1, [sp, #4] + ldr r2, [r2, #8] + ldr r1, _02040180 ; =0x00400A00 + ldr r3, _02040168 ; =sub_020401A8 + add r2, r2, #4 + bl CreateAdvancedTextBox + ldr r1, _02040154 ; =_020AFE7C + ldr r1, [r1, #8] + strb r0, [r1] + b _020400FC +_02040084: + cmp r6, #1 + ble _020400C8 + ldr r1, [r2, #8] + mov r0, #1 + str r5, [r1, #4] + str r6, [sp] + str r0, [sp, #4] + ldr r2, [r2, #8] + ldr r0, _02040160 ; =_0209C93C + ldr r1, _02040184 ; =0x00409823 + ldr r3, _02040168 ; =sub_020401A8 + add r2, r2, #4 + bl CreateAdvancedTextBox + ldr r1, _02040154 ; =_020AFE7C + ldr r1, [r1, #8] + strb r0, [r1] + b _020400FC +_020400C8: + ldr r3, [r2, #8] + ldr r0, _02040160 ; =_0209C93C + str r1, [r3, #4] + str r1, [sp] + str r1, [sp, #4] + ldr r2, [r2, #8] + ldr r1, _02040188 ; =0x00401823 + ldr r3, _02040168 ; =sub_020401A8 + add r2, r2, #4 + bl CreateAdvancedTextBox + ldr r1, _02040154 ; =_020AFE7C + ldr r1, [r1, #8] + strb r0, [r1] +_020400FC: + ldr r0, _02040154 ; =_020AFE7C + ldr r0, [r0, #8] + ldrsb r0, [r0] + bl GetWindowIdPageStart + ldr r1, _02040154 ; =_020AFE7C + ldr r1, [r1, #8] + add r1, r1, #0x300 + strh r0, [r1, #0xe8] + mov r0, #1 + bl sub_0204027C + bl PrintMoveOptionMenu + ldr r1, _02040154 ; =_020AFE7C + mov r2, #0 + ldr r0, [r1, #8] + strb r2, [r0, #0x3e5] + ldr r0, [r1, #8] + add r0, r0, #0x300 + strh r2, [r0, #0xe6] + ldr r0, [r1, #8] + ldrsb r0, [r0] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_02040154: .word _020AFE7C +#ifdef JAPAN +_02040158: .word 0x00000879 +#else +_02040158: .word 0x00000A3E +#endif +_0204015C: .word _022AAE00 +_02040160: .word _0209C93C +_02040164: .word 0x00401803 +_02040168: .word sub_020401A8 +_0204016C: .word _0209C94C +_02040170: .word 0x00400800 +_02040174: .word _0209C92C +_02040178: .word 0x00401A03 +_0204017C: .word _0209C95C +_02040180: .word 0x00400A00 +_02040184: .word 0x00409823 +_02040188: .word 0x00401823 + arm_func_end sub_0203FE5C + + arm_func_start sub_0204018C +sub_0204018C: ; 0x0204018C + ldr ip, _02040198 ; =sub_0203FE5C + mov r3, #0 + bx ip + .align 2, 0 +_02040198: .word sub_0203FE5C + arm_func_end sub_0204018C + + arm_func_start sub_0204019C +sub_0204019C: ; 0x0204019C + ldr ip, _020401A4 ; =sub_0203FE5C + bx ip + .align 2, 0 +_020401A4: .word sub_0203FE5C + arm_func_end sub_0204019C + + arm_func_start sub_020401A8 +sub_020401A8: ; 0x020401A8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + bl sub_02027B1C + ldr r4, _02040274 ; =_020AFE7C + mov sb, #0 + ldr r0, [r4, #8] + ldr r7, _02040278 ; =_022AADFC + ldr r0, [r0, #0x10] + mov fp, #8 + mov r0, r0, lsl #0x10 + mov r8, r0, asr #0x10 + mov r6, #0xd + mov r5, #0x17 + b _02040250 +_020401E0: + add r0, r7, sb, lsl #3 + ldrb r0, [r0, #0x2e] + tst r0, #2 + add r0, r2, sb, lsl #3 + movne r1, r6 + ldr r3, [r0, #0xa8] + moveq r1, fp + mov r0, sl + add r2, r8, #2 + bl DrawTextInWindow + cmp sb, #0 + ble _02040238 + add r0, r7, sb, lsl #3 + ldrb r0, [r0, #0x2e] + tst r0, #2 + bne _02040238 + mov r0, sl + mov r1, #0x10 + mov r2, r8 + mov r3, #0x7e + str r5, [sp] + bl sub_02025D50 +_02040238: + add r0, r8, #0x10 + add r1, sb, #1 + mov r0, r0, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r8, r0, asr #0x10 + mov sb, r1, asr #0x10 +_02040250: + ldr r2, [r4, #8] + ldrsh r0, [r2, #0xa4] + cmp sb, r0 + blt _020401E0 + mov r0, #1 + bl sub_0204027C + mov r0, sl + bl UpdateWindow + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_02040274: .word _020AFE7C +_02040278: .word _022AADFC + arm_func_end sub_020401A8 + + arm_func_start sub_0204027C +sub_0204027C: ; 0x0204027C + cmp r0, #0 + ldrne r0, _020402BC ; =_020AFE7C + movne r3, #2 + ldrne r2, [r0, #8] + ldreq r0, _020402BC ; =_020AFE7C + moveq r3, #1 + ldreq r2, [r0, #8] + movne r1, #1 + str r3, [r2, #0x3ec] + ldr r0, [r0, #8] + moveq r1, #2 + str r1, [r0, #0x3f0] + ldr r0, _020402BC ; =_020AFE7C + ldr r0, [r0, #0xc] + cmp r0, #7 + bx lr + .align 2, 0 +_020402BC: .word _020AFE7C + arm_func_end sub_0204027C + + arm_func_start PrintMoveOptionMenu +PrintMoveOptionMenu: ; 0x020402C0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x5c + ldr r0, _020407AC ; =_020AFE7C + ldr r2, _020407B0 ; =_022AAE00 + ldr r1, [r0, #8] + str r2, [r1, #0x4c] + ldr r1, [r0, #0xc] + cmp r1, #2 + cmpne r1, #3 + cmpne r1, #6 + beq _020402FC + ldrsh r1, [r0, #2] + cmp r1, #4 + movge r1, #0 + strgeh r1, [r0, #2] +_020402FC: + ldr r0, _020407AC ; =_020AFE7C + ldrsh r0, [r0, #2] + bl sub_020410A4 + ldr r1, _020407AC ; =_020AFE7C + mov r0, #0 + ldr r1, [r1, #8] + strh r0, [r1, #0xa4] +_02040318: + ldr r1, _020407AC ; =_020AFE7C + ldr r2, _020407B4 ; =_022AAE2A + ldr r1, [r1, #8] + mov r3, #0 + add r1, r1, r0 + strb r3, [r1, #0x3e0] + ldrb r1, [r2, r0, lsl #3] + add r4, r2, r0, lsl #3 + tst r1, #1 + movne r3, #1 + tst r3, #0xff + beq _020403B4 + ldr r1, _020407AC ; =_020AFE7C + ldr r3, [r1, #8] + ldrsh r2, [r3, #0xa4] + add r2, r2, #1 + strh r2, [r3, #0xa4] + ldr r5, [r1, #8] + ldrb r1, [r5, #0x3f8] + cmp r1, #0 + ldrne r2, [r5, #0x3f4] + cmpne r2, #0 + beq _020403C8 + ldrh r1, [r4, #4] + b _02040388 +_0204037C: + cmp r3, r1 + beq _02040394 + add r2, r2, #2 +_02040388: + ldrh r3, [r2] + cmp r3, #0 + bne _0204037C +_02040394: + cmp r3, #0 + movne r1, #1 + moveq r1, #0 + tst r1, #0xff + addne r1, r5, r0 + movne r2, #3 + strneb r2, [r1, #0x3e0] + b _020403C8 +_020403B4: + ldr r1, _020407AC ; =_020AFE7C + ldrsh r2, [r1, #2] + cmp r0, r2 + moveq r2, #0 + streqh r2, [r1, #2] +_020403C8: + add r0, r0, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + cmp r0, #4 + blt _02040318 + ldr r1, _020407AC ; =_020AFE7C + mov r0, #0 + ldr r2, [r1, #8] + strb r0, [r2, #0x3e4] + ldr r2, [r1, #8] + ldrb r1, [r2, #0x3f8] + cmp r1, #0 + ldrne r1, [r2, #0x3f4] + cmpne r1, #0 + beq _020404B4 +_02040404: + ldr r1, _020407AC ; =_020AFE7C + ldr r3, _020407B4 ; =_022AAE2A + ldr r2, [r1, #8] + add r2, r2, r0 + ldrb r2, [r2, #0x3e0] + tst r2, #1 + beq _020404A0 + ldrb r2, [r3, r0, lsl #3] + tst r2, #2 + beq _02040464 + sub r6, r0, #1 + mov r5, #3 + ldr r3, _020407B8 ; =_022AADFC + b _0204045C +_0204043C: + ldr r4, [r1, #8] + add r2, r3, r6, lsl #3 + add r4, r4, r6 + strb r5, [r4, #0x3e0] + ldrb r2, [r2, #0x2e] + tst r2, #2 + beq _02040464 + sub r6, r6, #1 +_0204045C: + cmp r6, #0 + bge _0204043C +_02040464: + add r5, r0, #1 + ldr r4, _020407B8 ; =_022AADFC + mov r3, #3 + ldr r1, _020407AC ; =_020AFE7C + b _02040498 +_02040478: + add r2, r4, r5, lsl #3 + ldrb r2, [r2, #0x2e] + tst r2, #2 + beq _020404A0 + ldr r2, [r1, #8] + add r2, r2, r5 + strb r3, [r2, #0x3e0] + add r5, r5, #1 +_02040498: + cmp r5, #4 + blt _02040478 +_020404A0: + add r0, r0, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + cmp r0, #4 + blt _02040404 +_020404B4: + ldr r0, _020407AC ; =_020AFE7C + mov r8, #0 + ldr r0, [r0, #0xc] + ldr fp, _020407B4 ; =_022AAE2A + cmp r0, #2 + cmpne r0, #3 + cmpne r0, #6 + ldreq r0, _020407AC ; =_020AFE7C + ldr r5, _020407B8 ; =_022AADFC + ldreq r1, [r0, #8] + ldr r4, _020407AC ; =_020AFE7C + ldreqsh r0, [r1, #0xa4] + mov sb, r8 + mov r7, r8 + addeq r0, r0, #1 + streqh r0, [r1, #0xa4] + mov r6, #0x6a +_020404F8: + ldrb r0, [fp, sb, lsl #3] + str r7, [sp] + str r6, [sp, #4] + tst r0, #1 + movne r0, #1 + moveq r0, r7 + strb r7, [sp, #8] + strb r7, [sp, #9] + add sl, fp, sb, lsl #3 + tst r0, #0xff + beq _02040634 + ldrb r0, [r5, #0x2c] + cmp r0, #0 + movne r0, #2 + strne r0, [sp] + moveq r0, #4 + streq r0, [sp] + ldr r0, [r4, #0xc] + cmp r0, #1 + cmpne r0, #5 + bne _02040574 + ldrh r0, [sl, #4] + bl Is2TurnsMove + cmp r0, #0 + movne r0, #1 + strneb r0, [sp, #9] + bne _02040574 + ldrh r0, [sl, #4] + cmp r0, #0x8a + moveq r0, #1 + streqb r0, [sp, #8] +_02040574: + ldr r0, [r4, #0xc] + cmp r0, #0 + cmpne r0, #1 + bne _020405A4 + ldr r0, [r5] + mov r1, sl + mov r2, #1 + bl CanMonsterUseMove + cmp r0, #0 + moveq r0, #1 + streqb r0, [sp, #8] + b _020405B4 +_020405A4: + ldrb r0, [sl, #6] + cmp r0, #0 + moveq r0, #1 + streqb r0, [sp, #8] +_020405B4: + ldr r1, [r4, #8] + ldrb r0, [r1, #0x3f8] + cmp r0, #0 + beq _020405D8 + add r0, r1, sb + ldrb r0, [r0, #0x3e0] + tst r0, #2 + movne r0, #1 + strneb r0, [sp, #8] +_020405D8: + mov r2, sl + add r0, sp, #0xc + mov r1, #0 + add r3, sp, #0 + bl FormatMoveStringMore + mov r0, #0 + bl GetDungeonResultString + mov r1, r0 + ldr r0, [r4, #8] + add r0, r0, #0xe0 + add r0, r0, r8, lsl #7 + bl strcpy + ldr r3, [r4, #8] + add r0, r8, #1 + add r1, r3, #0xe0 + add r2, r1, r8, lsl #7 + add r1, r3, r8, lsl #3 + str r2, [r1, #0xa8] + ldr r1, [r4, #8] + mov r0, r0, lsl #0x10 + add r1, r1, r8, lsl #3 + str r8, [r1, #0xac] + mov r8, r0, asr #0x10 +_02040634: + add r0, sb, #1 + mov r0, r0, lsl #0x10 + mov sb, r0, asr #0x10 + cmp sb, #4 + blt _020404F8 + cmp r8, #4 + bne _02040710 + ldr r0, _020407AC ; =_020AFE7C + ldr r0, [r0, #0xc] + cmp r0, #2 + cmpne r0, #3 + cmpne r0, #6 + bne _02040710 + ldr r0, _020407B8 ; =_022AADFC + mov r2, #0 + ldrb r0, [r0, #0x2c] + str r2, [sp] + strb r2, [sp, #8] + strb r2, [sp, #9] + ldr r2, _020407BC ; =LAST_NEW_MOVE + cmp r0, #0 + ldrb r0, [r2] + mov r1, #0x6a + str r1, [sp, #4] + movne r1, #2 + bicne r0, r0, #8 + strne r1, [sp] + moveq r1, #4 + biceq r0, r0, #4 + streq r1, [sp] + strb r0, [r2] + add r0, sp, #0xc + add r3, sp, #0 + mov r1, #0 + bl FormatMoveStringMore + mov r0, #0 + bl GetDungeonResultString + ldr r2, _020407AC ; =_020AFE7C + mov r1, r0 + ldr r0, [r2, #8] + add r0, r0, #0xe0 + add r0, r0, r8, lsl #7 + bl strcpy + ldr r1, _020407AC ; =_020AFE7C + add r0, r8, #1 + ldr r4, [r1, #8] + mov r0, r0, lsl #0x10 + add r2, r4, #0xe0 + add r3, r2, r8, lsl #7 + add r2, r4, r8, lsl #3 + str r3, [r2, #0xa8] + ldr r1, [r1, #8] + add r1, r1, r8, lsl #3 + str r8, [r1, #0xac] + mov r8, r0, asr #0x10 +_02040710: + ldr r0, _020407AC ; =_020AFE7C + mov r4, #0 + ldr r1, [r0, #8] + sub r3, r4, #1 + add r1, r1, r8, lsl #3 + str r4, [r1, #0xa8] + ldr r2, [r0, #8] + sub r1, r4, #2 + add r2, r2, r8, lsl #3 + str r3, [r2, #0xac] + ldr r0, [r0, #8] + ldrsb r0, [r0] + cmp r0, r1 + beq _0204075C + bl sub_020307EC + ldr r0, _020407AC ; =_020AFE7C + ldr r0, [r0, #8] + ldrsb r0, [r0] + bl SetAdvancedTextBoxField0x1C2 +_0204075C: + ldr r0, _020407AC ; =_020AFE7C + ldr r1, [r0, #0xc] + cmp r1, #7 + ldrne r3, [r0, #8] + ldrne r2, [r3, #0x3ec] + ldrne r1, [r3, #0x3f0] + cmpne r2, r1 + beq _020407A4 + str r1, [r3, #0x3ec] + ldr r3, [r0, #8] + ldrsh r1, [r0, #2] + ldr r2, [r3, #0x10] + ldrsb r0, [r3] + add r2, r2, r1, lsl #4 + ldr r1, [r3, #0x3ec] + add r3, r2, #4 + mov r2, #0 + bl sub_02030978 +_020407A4: + add sp, sp, #0x5c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_020407AC: .word _020AFE7C +_020407B0: .word _022AAE00 +_020407B4: .word _022AAE2A +_020407B8: .word _022AADFC +_020407BC: .word LAST_NEW_MOVE + arm_func_end PrintMoveOptionMenu + + arm_func_start sub_020407C0 +sub_020407C0: ; 0x020407C0 + stmdb sp!, {r3, lr} + ldr r0, _020407E8 ; =_020AFE7C + ldr r0, [r0, #8] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl MemFree + ldr r0, _020407E8 ; =_020AFE7C + mov r1, #0 + str r1, [r0, #8] + ldmia sp!, {r3, pc} + .align 2, 0 +_020407E8: .word _020AFE7C + arm_func_end sub_020407C0 + + arm_func_start sub_020407EC +sub_020407EC: ; 0x020407EC + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x34 + add r1, sp, #0xc + mov r0, #0 + bl GetHeldButtons + add r1, sp, #0xa + mov r0, #0 + bl GetPressedButtons + add r1, sp, #8 + mov r0, #0 + bl sub_020063F4 + ldrh r0, [sp, #0xc] + ldr r5, _02040F90 ; =_022AAE2A + tst r0, #0x200 + movne r1, #1 + moveq r1, #0 + and r6, r1, #0xff + ldr r1, _02040F94 ; =_020AFE7C + tst r0, #0x100 + movne r0, #1 + moveq r0, #0 + ldr r3, [r1, #8] + and r7, r0, #0xff + add r0, r3, #0x300 + ldrsh r2, [r0, #0xe6] + cmp r2, #0 + ble _0204087C + sub r2, r2, #1 + strh r2, [r0, #0xe6] + ldr r0, [r1, #8] + add r0, r0, #0x300 + ldrsh r0, [r0, #0xe6] + cmp r0, #0 + moveq r0, #2 + movne r0, #0 + b _02040F88 +_0204087C: + ldrsb r0, [r3] + bl IsAdvancedTextBoxActive + cmp r0, #0 + bne _020408B8 + ldr r0, _02040F94 ; =_020AFE7C + ldr r0, [r0, #8] + ldrsb r0, [r0] + bl GetDigitInputResult + mvn r1, #0 + cmp r0, r1 + bne _020408B8 + mov r0, #1 + bl PlaySeVolumeWrapper + mov r0, #1 + b _02040F88 +_020408B8: + ldr r0, _02040F94 ; =_020AFE7C + ldr r0, [r0, #0xc] + cmp r0, #9 + addls pc, pc, r0, lsl #2 + b _02040958 +_020408CC: ; jump table + b _02040958 ; case 0 + b _0204094C ; case 1 + b _0204090C ; case 2 + b _020408F4 ; case 3 + b _02040958 ; case 4 + b _02040958 ; case 5 + b _0204090C ; case 6 + b _0204093C ; case 7 + b _02040924 ; case 8 + b _0204090C ; case 9 +_020408F4: + ldrh r0, [sp, #0xa] + mov r6, #0 + mov r7, r6 + bic r0, r0, #6 + strh r0, [sp, #0xa] + b _02040958 +_0204090C: + ldrh r0, [sp, #0xa] + mov r6, #0 + mov r7, r6 + bic r0, r0, #4 + strh r0, [sp, #0xa] + b _02040958 +_02040924: + ldrh r0, [sp, #0xa] + mov r6, #0 + mov r7, r6 + bic r0, r0, #4 + strh r0, [sp, #0xa] + b _02040958 +_0204093C: + mov r6, #0 + mov r7, r6 + strh r6, [sp, #0xa] + b _02040958 +_0204094C: + ldrh r0, [sp, #8] + bic r0, r0, #0x30 + strh r0, [sp, #8] +_02040958: + ldr r0, _02040F94 ; =_020AFE7C + ldr r0, [r0, #8] + ldrb r0, [r0, #0x3e5] + cmp r0, #0 + beq _02040980 + bl PrintMoveOptionMenu + ldr r0, _02040F94 ; =_020AFE7C + mov r1, #0 + ldr r0, [r0, #8] + strb r1, [r0, #0x3e5] +_02040980: + ldrh r0, [sp, #8] + tst r0, #0x80 + beq _02040A44 + bl sub_02041178 + cmp r7, #0 + beq _020409E4 + ldr r1, _02040F94 ; =_020AFE7C + ldr r0, _02040F90 ; =_022AAE2A + ldrsh r1, [r1, #2] + bl sub_02013E54 + ldr r1, _02040F94 ; =_020AFE7C + mov r0, r0, lsl #0x10 + ldrsh r1, [r1, #2] + mov r4, r0, asr #0x10 + cmp r1, r0, asr #16 + beq _020409D8 + mov r0, #3 + bl PlaySeVolumeWrapper + ldr r1, _02040F94 ; =_020AFE7C + mov r0, #3 + strh r4, [r1, #2] + b _02040F88 +_020409D8: + mov r0, #2 + bl PlaySeVolumeWrapper + b _02040A44 +_020409E4: + mov r0, #3 + bl PlaySeVolumeWrapper + ldr r0, _02040F94 ; =_020AFE7C + ldr r1, [r0, #8] + ldrsh r2, [r0, #2] + ldrsh r1, [r1, #0xa4] + add r0, r2, #1 + mov r0, r0, lsl #0x10 + mov r3, r0, asr #0x10 + b _02040A24 +_02040A0C: + ldrb r0, [r5, r3, lsl #3] + tst r0, #2 + beq _02040A2C + add r0, r3, #1 + mov r0, r0, lsl #0x10 + mov r3, r0, asr #0x10 +_02040A24: + cmp r2, r1 + blt _02040A0C +_02040A2C: + cmp r3, r1 + ldr r1, _02040F94 ; =_020AFE7C + movge r3, #0 + mov r0, #9 + strh r3, [r1, #2] + b _02040F88 +_02040A44: + ldrh r0, [sp, #8] + tst r0, #0x40 + beq _02040B10 + bl sub_02041178 + cmp r7, #0 + beq _02040AA8 + ldr r1, _02040F94 ; =_020AFE7C + ldr r0, _02040F90 ; =_022AAE2A + ldrsh r1, [r1, #2] + bl sub_02013F58 + ldr r1, _02040F94 ; =_020AFE7C + mov r0, r0, lsl #0x10 + ldrsh r1, [r1, #2] + mov r4, r0, asr #0x10 + cmp r1, r0, asr #16 + beq _02040A9C + mov r0, #3 + bl PlaySeVolumeWrapper + ldr r1, _02040F94 ; =_020AFE7C + mov r0, #4 + strh r4, [r1, #2] + b _02040F88 +_02040A9C: + mov r0, #2 + bl PlaySeVolumeWrapper + b _02040B10 +_02040AA8: + mov r0, #3 + bl PlaySeVolumeWrapper + ldr r0, _02040F94 ; =_020AFE7C + ldrsh r1, [r0, #2] + cmp r1, #0 + subgt r0, r1, #1 + ldrle r0, [r0, #8] + ldrlesh r0, [r0, #0xa4] + suble r0, r0, #1 + mov r0, r0, lsl #0x10 + mov r2, r0, asr #0x10 + b _02040AF0 +_02040AD8: + ldrb r0, [r5, r2, lsl #3] + tst r0, #2 + beq _02040AF8 + sub r0, r2, #1 + mov r0, r0, lsl #0x10 + mov r2, r0, asr #0x10 +_02040AF0: + cmp r1, #0 + bge _02040AD8 +_02040AF8: + ldr r1, _02040F94 ; =_020AFE7C + cmp r2, #0 + movlt r2, #0 + mov r0, #9 + strh r2, [r1, #2] + b _02040F88 +_02040B10: + mov r4, #0 + bl IsTouchScreenNotOff + cmp r0, #0 + add r0, sp, #0x10 + beq _02040B2C + bl GetReleasedStylus + b _02040B30 +_02040B2C: + bl sub_02006BFC +_02040B30: + ldrh r0, [sp, #0x10] + tst r0, #0x40 + beq _02040C38 + tst r0, #2 + ldrne r0, _02040F94 ; =_020AFE7C + ldrne r0, [r0, #0xc] + cmpne r0, #7 + beq _02040C38 + cmp r0, #2 + cmpne r0, #3 + cmpne r0, #6 + bne _02040B68 + mov r1, #0x70 + b _02040B6C +_02040B68: + mov r1, #0x60 +_02040B6C: + ldr r0, [sp, #0x14] + cmp r0, #0x10 + blt _02040C38 + cmp r0, #0xa0 + bge _02040C38 + ldr r0, [sp, #0x18] + cmp r0, #0x20 + blt _02040C38 + cmp r0, r1 + bge _02040C38 + sub r1, r0, #0x20 + mov r0, r1, asr #3 + add r0, r1, r0, lsr #28 + mov r0, r0, lsl #0xc + ldr r2, _02040F94 ; =_020AFE7C + mov r1, r0, asr #0x10 + ldr r5, [r2, #8] + add r7, r1, #1 + mov r3, #0 + mvn r2, #0 + b _02040BDC +_02040BC0: + add r0, r5, r3, lsl #3 + ldr r0, [r0, #0xac] + cmp r0, r2 + beq _02040BE4 + add r0, r3, #1 + mov r0, r0, lsl #0x10 + mov r3, r0, asr #0x10 +_02040BDC: + cmp r3, r7 + blt _02040BC0 +_02040BE4: + cmp r3, r1 + ble _02040C38 + ldr r0, _02040F90 ; =_022AAE2A + ldrb r0, [r0, r1, lsl #3] + tst r0, #2 + bne _02040C38 + mov r0, r1, lsl #4 + ldr r3, _02040F94 ; =_020AFE7C + add r0, r0, #0x20 + mov r2, r0, lsl #0x10 + mov r0, #0x10 + ldr r4, _02040F98 ; =_0209C928 + strh r1, [r3, #2] + mov r3, r0 + str r4, [sp] + mov r4, #0x40 + mov r1, r2, asr #0x10 + mov r2, #0x90 + str r4, [sp, #4] + mov r4, #1 + bl sub_0202A2A4 +_02040C38: + ldr r0, _02040F94 ; =_020AFE7C + ldr r5, [r0, #8] + ldrsb r0, [r5] + bl GetWindowIdPageStart + add r1, r5, #0x300 + ldrsh r1, [r1, #0xe8] + cmp r1, r0 + beq _02040C90 + mov r0, #4 + bl PlaySeVolumeWrapper + ldr r0, _02040F94 ; =_020AFE7C + mov r1, #0 + strh r1, [r0, #2] + ldr r0, [r0, #8] + ldrsb r0, [r0] + bl GetWindowIdPageStart + ldr r1, _02040F94 ; =_020AFE7C + ldr r1, [r1, #8] + add r1, r1, #0x300 + strh r0, [r1, #0xe8] + mov r0, #5 + b _02040F88 +_02040C90: + ldrh r0, [sp, #0xa] + tst r0, #2 + beq _02040CAC + mov r0, #1 + bl PlaySeVolumeWrapper + mov r0, #1 + b _02040F88 +_02040CAC: + tst r0, #4 + beq _02040D0C + ldr r0, _02040F9C ; =0x00003F07 + mov r1, #0x100 + bl sub_02017C74 + ldr r0, _02040F94 ; =_020AFE7C + ldr r1, [r0, #0xc] + cmp r1, #3 + addls pc, pc, r1, lsl #2 + b _02040CF4 +_02040CD4: ; jump table + b _02040CE4 ; case 0 + b _02040CE4 ; case 1 + b _02040CE4 ; case 2 + b _02040CE4 ; case 3 +_02040CE4: + ldr r0, [r0, #8] + ldrsb r0, [r0] + bl sub_02030EF0 + b _02040D04 +_02040CF4: + bl sub_02041178 + ldr r0, _02040F94 ; =_020AFE7C + ldrsh r0, [r0, #2] + bl sub_02041000 +_02040D04: + mov r0, #6 + b _02040F88 +_02040D0C: + tst r0, #8 + beq _02040D28 + ldr r0, _02040FA0 ; =0x00003F04 + mov r1, #0x100 + bl sub_02017C74 + mov r0, #7 + b _02040F88 +_02040D28: +#ifndef JAPAN + ldrsb r0, [r5] + bl sub_020308E4 + cmp r0, #0 + bne _02040F84 + ldrh r0, [sp, #0xa] +#endif + tst r0, #0x400 + bne _02040D50 + tst r0, #1 + cmpeq r4, #0 + beq _02040F84 +_02040D50: +#ifdef JAPAN + ldrb r0, [r5, #0x3f8] + cmp r0, #0 + beq _020410EC + ldr r0, _02040F94 ; =_020AFE7C + ldrsh r0, [r0, #2] + add r0, r5, r0 + ldrb r0, [r0, #0x3e0] + tst r0, #1 + bne _02040F70 +_020410EC: + cmp r4, #0 + addne r0, r5, #0x300 +#else + ldr r0, _02040F94 ; =_020AFE7C + mov r2, #0 + ldr r3, [r0, #8] + ldrb r1, [r3, #0x3f8] + cmp r1, #0 + beq _02040D7C + ldrsh r0, [r0, #2] + add r0, r3, r0 + ldrb r0, [r0, #0x3e0] + tst r0, #1 + movne r2, #1 +_02040D7C: + cmp r2, #0 + bne _02040F70 + cmp r4, #0 + addne r0, r3, #0x300 +#endif + movne r1, #6 + strneh r1, [r0, #0xe6] + cmp r6, #0 + beq _02040EC8 + ldr r0, _02040F94 ; =_020AFE7C + ldr r0, [r0, #0xc] + cmp r0, #1 + cmpne r0, #5 + bne _02040EC8 + cmp r4, #0 + ldrne r0, _02040F94 ; =_020AFE7C + movne r1, #0 + ldrne r0, [r0, #8] + addne r0, r0, #0x300 + strneh r1, [r0, #0xe6] + ldr r0, _02040F94 ; =_020AFE7C + ldr r1, [r0, #0xc] + cmp r1, #3 + addls pc, pc, r1, lsl #2 + b _02040E34 +_02040DDC: ; jump table + b _02040DEC ; case 0 + b _02040DEC ; case 1 + b _02040DEC ; case 2 + b _02040DEC ; case 3 +_02040DEC: + ldrsh r0, [r0, #2] + bl sub_02041194 + cmp r0, #0 + bne _02040E10 + ldr r0, _02040F94 ; =_020AFE7C + ldrsh r0, [r0, #2] + bl sub_02041364 + cmp r0, #0 + beq _02040E34 +_02040E10: + ldr r0, _02040F9C ; =0x00003F07 + mov r1, #0x100 + bl sub_02017C74 + ldr r0, _02040F94 ; =_020AFE7C + ldr r0, [r0, #8] + ldrsb r0, [r0] + bl sub_02030EF0 + mov r0, #8 + b _02040F88 +_02040E34: + ldr r0, _02040F94 ; =_020AFE7C + ldrsh r0, [r0, #2] + bl sub_02041194 + cmp r0, #0 + beq _02040E88 + ldr r0, _02040F94 ; =_020AFE7C + ldr r1, [r0, #0xc] + cmp r1, #5 + ldreqb r0, [r0] + cmpeq r0, #0 + bne _02040E6C + ldr r0, _02040FA4 ; =0x00001308 + bl PlaySeByIdVolumeWrapper + b _02040E78 +_02040E6C: + ldr r0, _02040F9C ; =0x00003F07 + mov r1, #0x100 + bl sub_02017C74 +_02040E78: + ldr r0, _02040F94 ; =_020AFE7C + ldrsh r0, [r0, #2] + bl sub_020412B0 + b _02040EC0 +_02040E88: + ldr r0, _02040F94 ; =_020AFE7C + ldrsh r0, [r0, #2] + bl sub_02041364 + cmp r0, #0 + beq _02040EB8 + ldr r0, _02040F9C ; =0x00003F07 + mov r1, #0x100 + bl sub_02017C74 + ldr r0, _02040F94 ; =_020AFE7C + ldrsh r0, [r0, #2] + bl sub_02041394 + b _02040EC0 +_02040EB8: + mov r0, #2 + bl PlaySeVolumeWrapper +_02040EC0: + bl sub_02041178 + b _02040F84 +_02040EC8: + cmp r4, #0 + beq _02040EEC + mov r0, #0 + bl PlaySeVolumeWrapper + ldr r0, _02040F94 ; =_020AFE7C + ldr r0, [r0, #8] + ldrsb r0, [r0] + bl sub_02030EF0 + b _02040F18 +_02040EEC: + ldrh r0, [sp, #0xa] + tst r0, #0x400 + mov r0, #0 + beq _02040F14 + bl PlaySeVolumeWrapper + ldr r0, _02040F94 ; =_020AFE7C + ldr r0, [r0, #8] + ldrsb r0, [r0] + bl sub_02030EF0 + b _02040F18 +_02040F14: + bl PlaySeVolumeWrapper +_02040F18: + ldr r0, _02040F94 ; =_020AFE7C + mov r1, #2 + ldr r3, [r0, #8] + mov r2, #0 + str r1, [r3, #0x3ec] + ldr r3, [r0, #8] + str r1, [r3, #0x3f0] + ldr r6, [r0, #8] + ldrsh r3, [r0, #2] + ldr r5, [r6, #0x10] + ldrsb r0, [r6] + add r3, r5, r3, lsl #4 + add r3, r3, #4 + bl sub_02030978 + ldr r0, _02040F94 ; =_020AFE7C + ldr r0, [r0, #8] + ldrsb r0, [r0] + bl UpdateWindow + cmp r4, #0 + bne _02040F84 + mov r0, #2 + b _02040F88 +_02040F70: + mov r0, #2 + bl PlaySeVolumeWrapper + cmp r4, #0 + beq _02040F84 + bl sub_02041178 +_02040F84: + mov r0, #0 +_02040F88: + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, pc} + .align 2, 0 +_02040F90: .word _022AAE2A +_02040F94: .word _020AFE7C +_02040F98: .word _0209C928 +_02040F9C: .word 0x00003F07 +_02040FA0: .word 0x00003F04 +_02040FA4: .word 0x00001308 + arm_func_end sub_020407EC + + arm_func_start sub_02040FA8 +sub_02040FA8: ; 0x02040FA8 + ldr r0, _02040FF4 ; =_022AADFC + ldrb r0, [r0, #0x2c] + cmp r0, #0 + beq _02040FD0 + ldr r0, _02040FF8 ; =_020AFE7C + ldr r1, _02040FFC ; =_022AAE2A + ldrsh r0, [r0, #2] + ldrb r0, [r1, r0, lsl #3] + tst r0, #8 + b _02040FE4 +_02040FD0: + ldr r0, _02040FF8 ; =_020AFE7C + ldr r1, _02040FFC ; =_022AAE2A + ldrsh r0, [r0, #2] + ldrb r0, [r1, r0, lsl #3] + tst r0, #4 +_02040FE4: + movne r0, #1 + moveq r0, #0 + and r0, r0, #0xff + bx lr + .align 2, 0 +_02040FF4: .word _022AADFC +_02040FF8: .word _020AFE7C +_02040FFC: .word _022AAE2A + arm_func_end sub_02040FA8 + + arm_func_start sub_02041000 +sub_02041000: ; 0x02041000 + stmdb sp!, {r4, lr} + mov r4, r0 + bl sub_02041178 + ldr r2, _0204108C ; =_022AADFC + ldrb r0, [r2, #0x2c] + cmp r0, #0 + beq _02041078 + ldr r1, _02041090 ; =_022AAE2A + ldrb r0, [r1, r4, lsl #3] + tst r0, #8 + eorne r0, r0, #8 + strneb r0, [r1, r4, lsl #3] + ldmneia sp!, {r4, pc} + mov r3, #0 +_02041038: + add r0, r2, r3, lsl #3 + ldrb r0, [r0, #0x2e] + tst r0, #8 + bne _02041050 + cmp r3, r4 + bne _02041060 +_02041050: + add r1, r2, r3, lsl #3 + ldrb r0, [r1, #0x2e] + eor r0, r0, #8 + strb r0, [r1, #0x2e] +_02041060: + add r0, r3, #1 + mov r0, r0, lsl #0x10 + mov r3, r0, asr #0x10 + cmp r3, #4 + blt _02041038 + ldmia sp!, {r4, pc} +_02041078: + ldr r1, _02041090 ; =_022AAE2A + ldrb r0, [r1, r4, lsl #3] + eor r0, r0, #4 + strb r0, [r1, r4, lsl #3] + ldmia sp!, {r4, pc} + .align 2, 0 +_0204108C: .word _022AADFC +_02041090: .word _022AAE2A + arm_func_end sub_02041000 + + arm_func_start sub_02041094 +sub_02041094: ; 0x02041094 + ldr r0, _020410A0 ; =_020AFE7C + ldrsh r0, [r0, #2] + bx lr + .align 2, 0 +_020410A0: .word _020AFE7C + arm_func_end sub_02041094 + + arm_func_start sub_020410A4 +sub_020410A4: ; 0x020410A4 + ldr r1, _0204114C ; =_020AFE7C + cmp r0, #0 + strh r0, [r1, #2] + movlt r0, #0 + strlth r0, [r1, #2] + ldr r0, _0204114C ; =_020AFE7C + ldrsh r2, [r0, #2] + cmp r2, #4 + blt _02041100 + ldr r1, [r0, #0xc] + cmp r1, #2 + cmpne r1, #3 + arm_func_end sub_020410A4 + + arm_func_start sub_020410D4 +sub_020410D4: ; 0x020410D4 + cmpne r1, #6 + arm_func_end sub_020410D4 + + arm_func_start sub_020410D8 +sub_020410D8: ; 0x020410D8 + bne _020410F8 + arm_func_end sub_020410D8 + + arm_func_start sub_020410DC +sub_020410DC: ; 0x020410DC + cmp r2, #4 + ldreq r0, _0204114C ; =_020AFE7C + moveq r1, #4 + ldrne r0, _0204114C ; =_020AFE7C + movne r1, #0 + strh r1, [r0, #2] + bx lr +_020410F8: + mov r1, #3 + strh r1, [r0, #2] +_02041100: + ldr r2, _02041150 ; =_022AADFC + ldr r0, _0204114C ; =_020AFE7C +_02041108: + ldrsh r1, [r0, #2] + cmp r1, #0 + ldrlt r0, _0204114C ; =_020AFE7C + movlt r1, #0 + strlth r1, [r0, #2] + bxlt lr + add r1, r2, r1, lsl #3 + ldrb r1, [r1, #0x2e] + tst r1, #1 + beq _02041138 + tst r1, #2 + bxeq lr +_02041138: + ldrsh r1, [r0, #2] + sub r1, r1, #1 + strh r1, [r0, #2] + b _02041108 +_02041148: + bx lr + .align 2, 0 +_0204114C: .word _020AFE7C +_02041150: .word _022AADFC + arm_func_end sub_020410DC + + arm_func_start sub_02041154 +sub_02041154: ; 0x02041154 + cmp r0, #4 + ldreq r0, _02041170 ; =_022AADFC + ldrne r1, _02041174 ; =_022AAE2E + ldreqh r0, [r0, #0x54] + movne r0, r0, lsl #3 + ldrneh r0, [r1, r0] + bx lr + .align 2, 0 +_02041170: .word _022AADFC +_02041174: .word _022AAE2E + arm_func_end sub_02041154 + + arm_func_start sub_02041178 +sub_02041178: ; 0x02041178 + ldr r0, _02041190 ; =_020AFE7C + ldr r1, [r0, #8] + cmp r1, #0 + movne r0, #1 + strneb r0, [r1, #0x3e5] + bx lr + .align 2, 0 +_02041190: .word _020AFE7C + arm_func_end sub_02041178 + + arm_func_start sub_02041194 +sub_02041194: ; 0x02041194 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r4, _020412AC ; =_022AAE2A + mov r6, r0 + add r0, r4, r6, lsl #3 + ldrh r0, [r0, #4] + bl IsNot2TurnsMoveOrSketch + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + add r5, r6, #1 + mov r7, #0 + mov r8, #1 + b _0204129C +_020411C8: + ldrb r0, [r4, r5, lsl #3] + tst r0, #1 + movne r0, r8 + moveq r0, r7 + tst r0, #0xff + beq _020412A4 + add r0, r4, r5, lsl #3 + ldrh r0, [r0, #4] + bl IsNot2TurnsMoveOrSketch + cmp r0, #0 + beq _020412A4 + ldrb r0, [r4, r5, lsl #3] + tst r0, #2 + bne _02041298 + add r0, r5, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + b _02041228 +_02041210: + ldrb r1, [r4, r0, lsl #3] + tst r1, #2 + beq _02041230 + add r0, r0, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 +_02041228: + cmp r0, #4 + blt _02041210 +_02041230: + mov r1, r6, lsl #0x10 + mov r5, r1, asr #0x10 + b _02041288 +_0204123C: + add r1, r5, #1 + mov r1, r1, lsl #0x10 + mov r3, r1, asr #0x10 + add r1, r4, r5, lsl #3 + ldrh r2, [r1, #4] + b _02041274 +_02041254: + add r1, r4, r3, lsl #3 + ldrh r1, [r1, #4] + cmp r2, r1 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + add r1, r3, #1 + mov r1, r1, lsl #0x10 + mov r3, r1, asr #0x10 +_02041274: + cmp r3, r0 + blt _02041254 + add r1, r5, #1 + mov r1, r1, lsl #0x10 + mov r5, r1, asr #0x10 +_02041288: + cmp r5, r0 + blt _0204123C + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02041298: + add r5, r5, #1 +_0204129C: + cmp r5, #4 + blt _020411C8 +_020412A4: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_020412AC: .word _022AAE2A + arm_func_end sub_02041194 + + arm_func_start sub_020412B0 +sub_020412B0: ; 0x020412B0 + stmdb sp!, {r4, lr} + mov r4, r0 + bl sub_02041194 + cmp r0, #0 + ldmeqia sp!, {r4, pc} + add r1, r4, #1 + ldr r0, _02041358 ; =_022AAE2A + mov r3, #0 + mov ip, #1 + b _0204133C +_020412D8: + ldrb r2, [r0, r1, lsl #3] + tst r2, #1 + movne r2, ip + moveq r2, r3 + tst r2, #0xff + beq _02041344 + ldrb r2, [r0, r1, lsl #3] + tst r2, #2 + bne _02041338 + ldr r2, _0204135C ; =_022AADFC + ldr lr, _02041358 ; =_022AAE2A + ldrb r2, [r2, #0x2c] + cmp r2, #0 + ldrne r3, _02041358 ; =_022AAE2A + ldrneb r2, [r3, r1, lsl #3] + bicne r2, r2, #8 + strneb r2, [r3, r1, lsl #3] + ldrb ip, [lr, r1, lsl #3] + ldr r2, _02041360 ; =_020AFE7C + mov r3, #1 + strb r3, [r2] + bic r2, ip, #4 + strb r2, [lr, r1, lsl #3] + b _02041344 +_02041338: + add r1, r1, #1 +_0204133C: + cmp r1, #4 + blt _020412D8 +_02041344: + ldrb r2, [r0, r1, lsl #3] + orr r2, r2, #2 + strb r2, [r0, r1, lsl #3] + bl sub_02041178 + ldmia sp!, {r4, pc} + .align 2, 0 +_02041358: .word _022AAE2A +_0204135C: .word _022AADFC +_02041360: .word _020AFE7C + arm_func_end sub_020412B0 + + arm_func_start sub_02041364 +sub_02041364: ; 0x02041364 + cmp r0, #3 + ldr r1, _02041390 ; =_022AAE2A + moveq r0, #0 + bxeq lr + add r0, r0, #1 + ldrb r0, [r1, r0, lsl #3] + tst r0, #2 + movne r0, #1 + moveq r0, #0 + and r0, r0, #0xff + bx lr + .align 2, 0 +_02041390: .word _022AAE2A + arm_func_end sub_02041364 + + arm_func_start sub_02041394 +sub_02041394: ; 0x02041394 + stmdb sp!, {r4, lr} + mov r4, r0 + bl sub_02041364 + cmp r0, #0 + ldmeqia sp!, {r4, pc} + add ip, r4, #1 + ldr r3, _020413FC ; =_022AAE2A + mov r1, #0 + mov r2, #1 + b _020413EC +_020413BC: + ldrb r0, [r3, ip, lsl #3] + tst r0, #1 + movne r0, r2 + moveq r0, r1 + tst r0, #0xff + beq _020413F4 + ldrb r0, [r3, ip, lsl #3] + tst r0, #2 + beq _020413F4 + eor r0, r0, #2 + strb r0, [r3, ip, lsl #3] + add ip, ip, #1 +_020413EC: + cmp ip, #4 + blt _020413BC +_020413F4: + bl sub_02041178 + ldmia sp!, {r4, pc} + .align 2, 0 +_020413FC: .word _022AAE2A + arm_func_end sub_02041394 + + arm_func_start sub_02041400 +sub_02041400: ; 0x02041400 + ldr r0, _02041410 ; =_020AFE7C + mov r1, #0 + strb r1, [r0] + bx lr + .align 2, 0 +_02041410: .word _020AFE7C + arm_func_end sub_02041400 + + arm_func_start sub_02041414 +sub_02041414: ; 0x02041414 + ldr r0, _02041420 ; =_020AFE7C + ldrb r0, [r0] + bx lr + .align 2, 0 +_02041420: .word _020AFE7C + arm_func_end sub_02041414 + + arm_func_start sub_02041424 +sub_02041424: ; 0x02041424 + cmp r0, #0 + movgt r0, #1 + bxgt lr + mov ip, #1 + ldr r3, _02041480 ; =_022AAE2A + mov r1, #0 + mov r2, ip + b _02041470 +_02041444: + ldrb r0, [r3, ip, lsl #3] + tst r0, #1 + movne r0, r2 + moveq r0, r1 + tst r0, #0xff + beq _02041478 + ldrb r0, [r3, ip, lsl #3] + tst r0, #2 + moveq r0, #1 + bxeq lr + add ip, ip, #1 +_02041470: + cmp ip, #4 + blt _02041444 +_02041478: + mov r0, #0 + bx lr + .align 2, 0 +_02041480: .word _022AAE2A + arm_func_end sub_02041424 + + arm_func_start sub_02041484 +sub_02041484: ; 0x02041484 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x20 + ldr r1, _02041594 ; =_020AFE7C + ldr r0, _02041598 ; =_022AAE2A + ldrsh r2, [r1, #2] + mov r1, #0 + mov r3, r1 + strb r1, [r0, r2, lsl #3] + add r5, r2, #1 + mov r4, #1 + b _020414DC +_020414B0: + ldrb r2, [r0, r5, lsl #3] + tst r2, #1 + movne r2, r4 + moveq r2, r3 + tst r2, #0xff + beq _020414E4 + ldrb r2, [r0, r5, lsl #3] + tst r2, #2 + beq _020414E4 + strb r1, [r0, r5, lsl #3] + add r5, r5, #1 +_020414DC: + cmp r5, #4 + blt _020414B0 +_020414E4: + mov r6, #0 + mov r7, r6 + mov r4, r6 + mov r5, #1 + add lr, sp, #0 +_020414F8: + ldrb r1, [r0, r7, lsl #3] + tst r1, #1 + movne r1, r5 + moveq r1, r4 + tst r1, #0xff + beq _02041530 + add ip, r0, r7, lsl #3 + add r3, lr, r6, lsl #3 + mov r2, #4 +_0204151C: + ldrh r1, [ip], #2 + subs r2, r2, #1 + strh r1, [r3], #2 + bne _0204151C + add r6, r6, #1 +_02041530: + add r7, r7, #1 + cmp r7, #4 + blt _020414F8 + mov r2, #0 + add r1, sp, #0 + b _02041550 +_02041548: + strb r2, [r1, r6, lsl #3] + add r6, r6, #1 +_02041550: + cmp r6, #4 + blt _02041548 + mov r4, #0 + add lr, sp, #0 +_02041560: + add ip, lr, r4, lsl #3 + add r3, r0, r4, lsl #3 + mov r2, #4 +_0204156C: + ldrh r1, [ip], #2 + subs r2, r2, #1 + strh r1, [r3], #2 + bne _0204156C + add r4, r4, #1 + cmp r4, #4 + blt _02041560 + bl sub_02041178 + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_02041594: .word _020AFE7C +_02041598: .word _022AAE2A + arm_func_end sub_02041484 + + arm_func_start sub_0204159C +sub_0204159C: ; 0x0204159C + ldr r0, _020415B8 ; =_022AADFC + ldrb r0, [r0, #0x58] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + and r0, r0, #0xff + bx lr + .align 2, 0 +_020415B8: .word _022AADFC + arm_func_end sub_0204159C + + arm_func_start sub_020415BC +sub_020415BC: ; 0x020415BC + mov r3, #0 + ldr ip, _02041610 ; =_022AAE2A + mov r1, r3 + mov r2, #1 + b _020415F4 +_020415D0: + ldrb r0, [ip, r3, lsl #3] + tst r0, #1 + movne r0, r2 + moveq r0, r1 + tst r0, #0xff + beq _020415FC + add r0, r3, #1 + mov r0, r0, lsl #0x10 + mov r3, r0, asr #0x10 +_020415F4: + cmp r3, #4 + blt _020415D0 +_020415FC: + cmp r3, #4 + movge r0, #1 + movlt r0, #0 + and r0, r0, #0xff + bx lr + .align 2, 0 +_02041610: .word _022AAE2A + arm_func_end sub_020415BC + + arm_func_start sub_02041614 +sub_02041614: ; 0x02041614 + stmdb sp!, {r3, r4, r5, lr} + mov r5, #0 + ldr r4, _020416B0 ; =_022AAE2A + mov r2, r5 + mov r3, #1 + b _02041694 +_0204162C: + ldrb r1, [r4, r5, lsl #3] + tst r1, #1 + movne r1, r3 + moveq r1, r2 + tst r1, #0xff + bne _02041688 + mov r1, #5 + strb r1, [r4, r5, lsl #3] + add r2, r4, r5, lsl #3 + strh r0, [r2, #4] + mov r1, #0 + ldr r0, _020416B4 ; =_022AADFC + strb r1, [r2, #7] + ldrsh r0, [r0, #0x5a] + ldr r1, _020416B8 ; =_022AAE58 + bl GetPpIncrease + add r1, r4, r5, lsl #3 + strh r0, [r1, #2] + mov r0, r1 + bl GetMaxPp + add r1, r4, r5, lsl #3 + strb r0, [r1, #6] + b _0204169C +_02041688: + add r1, r5, #1 + mov r1, r1, lsl #0x10 + mov r5, r1, asr #0x10 +_02041694: + cmp r5, #4 + blt _0204162C +_0204169C: + cmp r5, #4 + mvnge r5, #0 + mov r0, r5, lsl #0x10 + mov r0, r0, asr #0x10 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020416B0: .word _022AAE2A +_020416B4: .word _022AADFC +_020416B8: .word _022AAE58 + arm_func_end sub_02041614 + + arm_func_start sub_020416BC +sub_020416BC: ; 0x020416BC + stmdb sp!, {r3, lr} + mov r1, r0 + ldr r0, _020416D8 ; =_022AAE2A + bl sub_02013F58 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + ldmia sp!, {r3, pc} + .align 2, 0 +_020416D8: .word _022AAE2A + arm_func_end sub_020416BC + + arm_func_start sub_020416DC +sub_020416DC: ; 0x020416DC + stmdb sp!, {r3, lr} + mov r1, r0 + ldr r0, _020416F8 ; =_022AAE2A + bl sub_02013E54 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + ldmia sp!, {r3, pc} + .align 2, 0 +_020416F8: .word _022AAE2A + arm_func_end sub_020416DC + + arm_func_start sub_020416FC +sub_020416FC: ; 0x020416FC + stmdb sp!, {r3, lr} + ldr r0, _02041720 ; =_020AFE7C + ldr r0, [r0, #8] + ldrsb r0, [r0] + bl sub_020307EC + mov r0, #1 + bl sub_0204027C + bl sub_02041178 + ldmia sp!, {r3, pc} + .align 2, 0 +_02041720: .word _020AFE7C + arm_func_end sub_020416FC + + arm_func_start sub_02041724 +sub_02041724: ; 0x02041724 + stmdb sp!, {r3, lr} + bl IsDeoxys + cmp r0, #0 + ldrne r0, _02041748 ; =_022AADFC + movne r1, #1 + ldreq r0, _02041748 ; =_022AADFC + moveq r1, #0 + strb r1, [r0, #0x58] + ldmia sp!, {r3, pc} + .align 2, 0 +_02041748: .word _022AADFC + arm_func_end sub_02041724 + + arm_func_start SprintfStatic__0204174C +SprintfStatic__0204174C: ; 0x0204174C + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + add r2, sp, #0xc + bic r2, r2, #3 + ldr r1, [sp, #0xc] + add r2, r2, #4 + bl vsprintf + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + arm_func_end SprintfStatic__0204174C + + arm_func_start sub_02041774 +sub_02041774: ; 0x02041774 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #0x2bc + mov r1, #8 + bl MemAlloc + ldr r1, _020417A4 ; =_020AFE8C + mvn r2, #1 + str r0, [r1] + str r4, [r0, #4] + ldr r0, [r1] + strb r2, [r0] + ldmia sp!, {r4, pc} + .align 2, 0 +_020417A4: .word _020AFE8C + arm_func_end sub_02041774 + + arm_func_start sub_020417A8 +sub_020417A8: ; 0x020417A8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r6, r1 + mov r4, r2 + mov r7, r0 + cmp r4, r6 + mvnge r0, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldrb r0, [r7, r4, lsl #3] + tst r0, #1 + mvneq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r3 + bl sub_02041774 + ldr r0, _0204185C ; =_020AFE8C + add r1, r7, r4, lsl #3 + ldr r0, [r0] + mov r2, #8 + add r0, r0, #8 + bl memcpy + add r5, r4, #1 + mov r4, #1 + mov sb, #8 + ldr r8, _0204185C ; =_020AFE8C + b _02041840 +_02041808: + ldrb r0, [r7, r5, lsl #3] + mov r1, r5, lsl #3 + tst r0, #1 + beq _0204183C + tst r0, #2 + beq _02041848 + ldr r0, [r8] + mov r2, sb + add r0, r0, #8 + add r0, r0, r4, lsl #3 + add r1, r7, r1 + bl memcpy + add r4, r4, #1 +_0204183C: + add r5, r5, #1 +_02041840: + cmp r5, r6 + blt _02041808 +_02041848: + ldr r0, _0204185C ; =_020AFE8C + ldr r0, [r0] + strh r4, [r0, #0x28] + bl sub_020418A4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_0204185C: .word _020AFE8C + arm_func_end sub_020417A8 + + arm_func_start sub_02041860 +sub_02041860: ; 0x02041860 + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, r1 + bl sub_02041774 + ldr r0, _020418A0 ; =_020AFE8C + mov r1, r4 + ldr r0, [r0] + mov r2, #8 + add r0, r0, #8 + bl memcpy + ldr r0, _020418A0 ; =_020AFE8C + mov r1, #1 + ldr r0, [r0] + strh r1, [r0, #0x28] + bl sub_020418A4 + ldmia sp!, {r4, pc} + .align 2, 0 +_020418A0: .word _020AFE8C + arm_func_end sub_02041860 + + arm_func_start sub_020418A4 +sub_020418A4: ; 0x020418A4 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + sub sp, sp, #0x10 + mov r7, #0 + ldr r6, _020419F0 ; =0x000008D4 + ldr r5, _020419F4 ; =_020AFE8C + mov r4, #0x50 + b _02041950 +_020418C0: + ldr r1, [r5] + mul r8, r7, r4 + add r0, r1, r7, lsl #3 + ldrh r0, [r0, #0xc] + add r1, r1, r7, lsl #1 + add r1, r1, #0x200 + strh r6, [r1, #0xac] + ldr r2, [r5] +#if defined(EUROPE) + add r1, r0, #0x3a4 +#elif defined(JAPAN) + add r1, r0, #0x9f +#else + add r1, r0, #0xa2 +#endif + add r2, r2, r8 + str r0, [r2, #0x3c] + ldr r2, [r5] +#if defined(EUROPE) + add r3, r1, #0x2400 +#elif defined(JAPAN) + add r3, r1, #0x3f00 +#else + add r3, r1, #0x2700 +#endif + add r1, r2, r7, lsl #1 + add r1, r1, #0x200 + strh r3, [r1, #0xb4] + ldr r1, [r5] + add r1, r1, r8 + str r0, [r1, #0x17c] + ldr r0, [r5] + add r0, r0, #8 + add r0, r0, r7, lsl #3 + bl GetMoveRangeId + ldr r1, [r5] + add r1, r1, r8 + str r0, [r1, #0x180] + ldr r0, [r5] + add r0, r0, #8 + add r0, r0, r7, lsl #3 + bl GetMoveType + ldr r2, [r5] + add r1, r7, #1 + add r2, r2, r8 + mov r1, r1, lsl #0x10 + str r0, [r2, #0x184] + mov r7, r1, asr #0x10 +_02041950: + ldr r2, [r5] + ldrsh r3, [r2, #0x28] + cmp r7, r3 + blt _020418C0 + cmp r3, #1 + ble _020419A0 + add r0, r2, #0x2ac + str r0, [sp] + add r0, r2, #0x2c + str r0, [sp, #4] + add r4, r2, #0x2b4 + str r4, [sp, #8] + add r4, r2, #0x16c + ldr r0, _020419F8 ; =_0209C97C + ldr r1, _020419FC ; =0x00001013 + mov r2, #0 + str r4, [sp, #0xc] + bl CreateScrollBoxMulti + ldr r1, _020419F4 ; =_020AFE8C + b _020419D4 +_020419A0: + add r0, r2, #0x2c + str r0, [sp] + add r1, r2, #0x200 + ldrh r3, [r1, #0xb4] + add r2, r2, #0x16c + ldr r0, _020419F8 ; =_0209C97C + str r3, [sp, #4] + str r2, [sp, #8] + ldrh r3, [r1, #0xac] + ldr r1, _020419FC ; =0x00001013 + mov r2, #0 + bl CreateScrollBoxSingle + ldr r1, _020419F4 ; =_020AFE8C +_020419D4: + ldr r1, [r1] + strb r0, [r1] + ldr r0, _020419F4 ; =_020AFE8C + ldr r0, [r0] + ldrsb r0, [r0] + add sp, sp, #0x10 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +#ifdef JAPAN +_020419F0: .word 0x00001D2C +#else +_020419F0: .word 0x000008D4 +#endif +_020419F4: .word _020AFE8C +_020419F8: .word _0209C97C +_020419FC: .word 0x00001013 + arm_func_end sub_020418A4 + + arm_func_start sub_02041A00 +sub_02041A00: ; 0x02041A00 + ldr r0, _02041A10 ; =_020AFE8C + ldr ip, _02041A14 ; =MemFree + ldr r0, [r0] + bx ip + .align 2, 0 +_02041A10: .word _020AFE8C +_02041A14: .word MemFree + arm_func_end sub_02041A00 + + arm_func_start sub_02041A18 +sub_02041A18: ; 0x02041A18 + stmdb sp!, {r3, lr} + ldr r0, _02041A3C ; =_020AFE8C + ldr r0, [r0] + ldrsb r0, [r0] + bl IsScrollBoxActive + cmp r0, #0 + movne r0, #0 + moveq r0, #1 + ldmia sp!, {r3, pc} + .align 2, 0 +_02041A3C: .word _020AFE8C + arm_func_end sub_02041A18 + + arm_func_start PrintIqSkillsMenu +PrintIqSkillsMenu: ; 0x02041A40 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0xa0 + mov r7, r0 + mov r6, r1 + add r0, sp, #8 + mov r1, #0x98 + mov r5, r2 + mov r4, r3 + bl MemZero + mov r1, #0xd +#ifdef JAPAN + ldr r0, _02041ED4 ; =0x00001586 +#else + rsb r0, r1, #0xa80 +#endif + str r1, [sp, #0xc] + mov r1, #0 + str r1, [sp, #8] + mov r1, #0x10 + strh r0, [sp, #0x10] + str r1, [sp, #0x14] + mov r0, #0x840 + mov r1, #8 + bl MemAlloc + ldr r2, _02041B6C ; =_020AFE90 + mov r1, #0x840 + str r0, [r2, #4] + bl MemZero + ldr r3, _02041B6C ; =_020AFE90 + mov r1, r7 + ldr r0, [r3, #4] + mov r2, r5 + str r6, [r0, #0x790] + ldr r0, [r3, #4] + add r0, r0, #0x700 + strh r7, [r0, #0x94] + ldr r0, [r3, #4] + str r5, [r0, #0x798] + ldr r0, [r3, #4] + add r0, r0, #0x64 + bl GetLearnableIqSkills + ldr r3, _02041B6C ; =_020AFE90 + ldr r1, _02041B70 ; =0x80401C33 + ldr r2, [r3, #4] + mov r5, #8 + add r2, r2, #0x700 + strh r0, [r2, #0x8c] + ldr r2, [r3, #4] + ldr r0, _02041B74 ; =_0209C98C + add r2, r2, #0x700 + ldrsh r6, [r2, #0x8c] + ldr r3, _02041B78 ; =GetCheckIqMenuSkillString + add r2, sp, #8 + str r6, [sp] + str r5, [sp, #4] + bl CreateAdvancedMenu + ldr r1, _02041B6C ; =_020AFE90 + mov r2, #0 + ldr r3, [r1, #4] + strb r0, [r3] + ldr r0, [r1, #4] + str r2, [r0, #0x6f0] + ldr r0, [r1, #4] + str r2, [r0, #0x6ec] + ldr r0, [r1, #4] + strb r4, [r0, #0x83c] + ldr r0, [r1, #4] + add r0, r0, #0x700 + strh r2, [r0, #0x8e] + ldr r0, [r1, #4] + add r0, r0, #0x14 + bl InitPreprocessorArgs + ldr r0, _02041B6C ; =_020AFE90 + ldr r1, [r0, #4] + add r0, r1, #0x34 + add r0, r0, #0x800 + str r0, [r1, #0x7fc] + add sp, sp, #0xa0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +#ifdef JAPAN +_02041ED4: .word 0x00001586 +#endif +_02041B6C: .word _020AFE90 +_02041B70: .word 0x80401C33 +_02041B74: .word _0209C98C +_02041B78: .word GetCheckIqMenuSkillString + arm_func_end PrintIqSkillsMenu + + arm_func_start sub_02041B7C +sub_02041B7C: ; 0x02041B7C + stmdb sp!, {r4, lr} + sub sp, sp, #0xf8 + ldr r1, _020420BC ; =_020AFE90 + ldr r3, [r1, #4] + ldr r0, [r3, #0x6f0] + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _020420B0 +_02041B9C: ; jump table + b _02041BC0 ; case 0 + b _02041DB0 ; case 1 + b _02041E40 ; case 2 + b _02041EBC ; case 3 + b _02041F30 ; case 4 + b _02041EE4 ; case 5 + b _02041FA4 ; case 6 + b _02041FE8 ; case 7 + b _020420A0 ; case 8 +_02041BC0: + ldrsb r0, [r3] + bl IsAdvancedMenuActive2 + cmp r0, #0 + bne _02041CF8 + ldr r0, _020420BC ; =_020AFE90 + ldr r0, [r0, #4] + ldrsb r0, [r0] + bl GetAdvancedMenuResult + ldr r2, _020420BC ; =_020AFE90 + mvn r1, #0 + ldr r3, [r2, #4] + str r0, [r3, #0x838] + ldr r2, [r2, #4] + ldr r0, [r2, #0x838] + cmp r0, r1 + moveq r0, #8 + streq r0, [r2, #0x6f0] + beq _020420B0 + mov r0, #0 + bl PlaySeVolumeWrapper + ldr r0, _020420BC ; =_020AFE90 + ldr r2, _020420C0 ; =_0209C9B0 + ldrsb r3, [r0] + ldr r1, [r0, #4] + ldr r2, [r2, r3, lsl #3] + str r2, [r1, #0x79c] + ldr r3, [r0, #4] + ldr r2, [r3, #0x838] + ldrb r1, [r3, #0x83c] + add r2, r3, r2 + ldrb r2, [r2, #0x64] + cmp r1, #0 + bne _02041C60 + cmp r2, #0x18 + cmpne r2, #0x1b + beq _02041C60 + add r1, r2, #0xc8 + and r1, r1, #0xff + cmp r1, #1 + bhi _02041C7C +_02041C60: + mov r1, #3 + ldr r0, _020420BC ; =_020AFE90 + strb r1, [r3, #0x834] + ldr r0, [r0, #4] + mov r1, #0 + strb r1, [r0, #0x835] + b _02041C8C +_02041C7C: + mov r1, #0 + strb r1, [r3, #0x834] + ldr r0, [r0, #4] + strb r1, [r0, #0x835] +_02041C8C: + ldr r0, _020420BC ; =_020AFE90 + mov r1, #0x98 + ldr r0, [r0, #4] + add r0, r0, #0x39c + add r0, r0, #0x400 + bl MemZero + ldr r2, _020420BC ; =_020AFE90 + ldr r3, _020420C4 ; =_0209C9AC + ldr r4, [r2, #4] + mov r1, #0 + add r0, r4, #0x34 + add r0, r0, #0x800 + str r0, [r4, #0x7fc] + str r3, [sp] + str r1, [sp, #4] + str r1, [sp, #8] + ldr r2, [r2, #4] + ldr r0, _020420C8 ; =_0209C99C + add r3, r2, #0x39c + ldr r2, _020420CC ; =0x80000233 + add r3, r3, #0x400 + bl sub_02046A20 + ldr r0, _020420BC ; =_020AFE90 + mov r1, #1 + ldr r0, [r0, #4] + str r1, [r0, #0x6f0] + b _020420B0 +_02041CF8: + add r1, sp, #0xc + mov r0, #0 + bl GetPressedButtons + ldrh r0, [sp, #0xc] + tst r0, #8 + beq _02041D54 + ldr r0, _020420D0 ; =0x00003F04 + bl PlaySeByIdVolumeWrapper + ldr r0, _020420BC ; =_020AFE90 + ldr r0, [r0, #4] + ldrsb r0, [r0] + bl sub_0202C1E4 + ldr r0, _020420BC ; =_020AFE90 + ldr r0, [r0, #4] + ldrsb r0, [r0] + bl GetAdvancedMenuResult + ldr r1, _020420BC ; =_020AFE90 + mov r2, #3 + ldr r3, [r1, #4] + str r0, [r3, #0x838] + ldr r0, [r1, #4] + str r2, [r0, #0x6f0] + b _020420B0 +_02041D54: + tst r0, #4 + beq _020420B0 + ldr r0, _020420BC ; =_020AFE90 + ldr r1, [r0, #4] + ldrb r0, [r1, #0x83c] + cmp r0, #0 + beq _02041D7C + ldr r0, _020420D4 ; =0x00003F03 + bl PlaySeByIdVolumeWrapper + b _020420B0 +_02041D7C: + ldrsb r0, [r1] + bl sub_0202C1E4 + ldr r0, _020420BC ; =_020AFE90 + ldr r0, [r0, #4] + ldrsb r0, [r0] + bl GetAdvancedMenuResult + ldr r1, _020420BC ; =_020AFE90 + mov r2, #2 + ldr r3, [r1, #4] + str r0, [r3, #0x838] + ldr r0, [r1, #4] + str r2, [r0, #0x6f0] + b _020420B0 +_02041DB0: + bl sub_02046B04 + mov r4, r0 + bl sub_02046BA0 + ldr r1, _020420BC ; =_020AFE90 + add r2, r4, #2 + strb r0, [r1] + cmp r2, #4 + addls pc, pc, r2, lsl #2 + b _020420B0 +_02041DD4: ; jump table + b _02041DF0 ; case 0 + b _020420B0 ; case 1 + b _02041E14 ; case 2 + b _02041E24 ; case 3 + b _02041DE8 ; case 4 +_02041DE8: + mov r0, #0 + bl PlaySeVolumeWrapper +_02041DF0: + ldr r0, _020420BC ; =_020AFE90 + ldr r0, [r0, #4] + ldrsb r0, [r0] + bl ResumeAdvancedMenu + ldr r0, _020420BC ; =_020AFE90 + mov r1, #0 + ldr r0, [r0, #4] + str r1, [r0, #0x6f0] + b _020420B0 +_02041E14: + ldr r0, [r1, #4] + mov r1, #2 + str r1, [r0, #0x6f0] + b _020420B0 +_02041E24: + mov r0, #0 + bl PlaySeVolumeWrapper + ldr r0, _020420BC ; =_020AFE90 + mov r1, #3 + ldr r0, [r0, #4] + str r1, [r0, #0x6f0] + b _020420B0 +_02041E40: + ldr r1, [r3, #0x838] + add r2, r3, #0x64 + ldrb r0, [r2, r1] + cmp r0, #0x18 + bne _02041E60 + mov r0, #2 + bl PlaySeVolumeWrapper + b _02041E98 +_02041E60: + cmp r0, #0x1b + beq _02041E78 + add r0, r0, #0xc8 + and r0, r0, #0xff + cmp r0, #1 + bhi _02041E84 +_02041E78: + mov r0, #2 + bl PlaySeVolumeWrapper + b _02041E98 +_02041E84: + ldrb r1, [r2, r1] + ldr r0, [r3, #0x790] + bl DisableIqSkill + ldr r0, _020420D8 ; =0x00003F07 + bl PlaySeByIdVolumeWrapper +_02041E98: + ldr r0, _020420BC ; =_020AFE90 + ldr r0, [r0, #4] + ldrsb r0, [r0] + bl ResumeAdvancedMenu + ldr r0, _020420BC ; =_020AFE90 + mov r1, #0 + ldr r0, [r0, #4] + str r1, [r0, #0x6f0] + b _020420B0 +_02041EBC: + ldrsb r0, [r3] + bl sub_0202812C + ldr r1, _020420BC ; =_020AFE90 + mov r2, #5 + ldr r0, [r1, #4] + add r0, r0, #0x700 + strh r2, [r0, #0x8e] + ldr r0, [r1, #4] + str r2, [r0, #0x6f0] + b _020420B0 +_02041EE4: + add r0, r3, #0x700 + ldrsh r2, [r0, #0x8e] + sub r2, r2, #1 + strh r2, [r0, #0x8e] + ldr r2, [r1, #4] + add r0, r2, #0x700 + ldrsh r0, [r0, #0x8e] + cmp r0, #0 + bge _020420B0 + mov r0, #4 + str r0, [r2, #0x6f0] + ldr r0, [r1, #4] + ldrsb r0, [r0] + bl CloseAdvancedMenu + ldr r0, _020420BC ; =_020AFE90 + mvn r1, #1 + ldr r0, [r0, #4] + strb r1, [r0] + b _020420B0 +_02041F30: + add r0, sp, #0xa8 + bl InitPreprocessorArgs + ldr r0, _020420BC ; =_020AFE90 + add ip, sp, #0xa8 + ldr r3, [r0, #4] + ldr r0, _020420DC ; =_020AFE98 + ldr r2, [r3, #0x838] + ldr r1, _020420E0 ; =0x00001013 + add r2, r3, r2 + ldrb lr, [r2, #0x64] + ldr r3, _020420E4 ; =0x00000A77 + mov r2, #0 + str lr, [sp, #0xb8] + str ip, [sp] + ldr ip, [sp, #0xb8] +#if defined(EUROPE) + add ip, ip, #0x32c + add ip, ip, #0x2400 +#elif defined(JAPAN) + add ip, ip, #0x358 + add ip, ip, #0x3c00 +#else + add ip, ip, #0x2a + add ip, ip, #0x2700 +#endif + mov ip, ip, lsl #0x10 + mov ip, ip, lsr #0x10 + str ip, [sp, #4] + str r2, [sp, #8] + bl CreateScrollBoxSingle + ldr r1, _020420BC ; =_020AFE90 + mov r2, #6 + ldr r3, [r1, #4] + strb r0, [r3, #1] + ldr r0, [r1, #4] + str r2, [r0, #0x6f0] + b _020420B0 +_02041FA4: + ldrsb r0, [r3, #1] + bl IsScrollBoxActive + cmp r0, #0 + bne _020420B0 + ldr r0, _020420BC ; =_020AFE90 + ldr r0, [r0, #4] + ldrsb r0, [r0, #1] + bl CloseScrollBox + ldr r0, _020420BC ; =_020AFE90 + mov r3, #7 + ldr r2, [r0, #4] + mov r1, #8 + str r3, [r2, #0x6f0] + ldr r0, [r0, #4] + add r0, r0, #0x700 + strh r1, [r0, #0x8e] + b _020420B0 +_02041FE8: + add r0, r3, #0x700 + ldrsh r2, [r0, #0x8e] + sub r2, r2, #1 + strh r2, [r0, #0x8e] + ldr r0, [r1, #4] + add r0, r0, #0x700 + ldrsh r2, [r0, #0x8e] + cmp r2, #0 + bge _020420B0 + mov r3, #0 + strh r3, [r0, #0x8e] + ldr r2, [r1, #4] + mov r0, #0xd + str r3, [r2, #0x6f0] + ldr r3, [r1, #4] + str r0, [sp, #0x14] + ldr r2, [r3, #0x838] +#ifdef JAPAN + ldr r1, _02042454 ; =0x00001586 +#else + rsb r1, r0, #0xa80 +#endif + mov r0, #0x10 + str r0, [sp, #0x1c] + str r2, [sp, #0x10] + strh r1, [sp, #0x18] + add r0, r3, #0x700 + ldrsh r1, [r0, #0x94] + ldr r2, [r3, #0x798] + add r0, r3, #0x64 + bl GetLearnableIqSkills + ldr ip, _020420BC ; =_020AFE90 + ldr r1, _020420E8 ; =0x80401C33 + ldr r3, [ip, #4] + add r2, sp, #0x10 + add r3, r3, #0x700 + strh r0, [r3, #0x8c] + ldr r3, [ip, #4] + ldr r0, _020420EC ; =_0209C98C + add r3, r3, #0x700 + ldrsh lr, [r3, #0x8c] + ldr r3, _020420F0 ; =GetCheckIqMenuSkillString + mov ip, #8 + str lr, [sp] + str ip, [sp, #4] + bl CreateAdvancedMenu + ldr r1, _020420BC ; =_020AFE90 + ldr r1, [r1, #4] + strb r0, [r1] + b _020420B0 +_020420A0: + mov r0, #9 + str r0, [r3, #0x6f0] + mov r0, #1 + b _020420B4 +_020420B0: + mov r0, #0 +_020420B4: + add sp, sp, #0xf8 + ldmia sp!, {r4, pc} + .align 2, 0 +_020420BC: .word _020AFE90 +_020420C0: .word _0209C9B0 +_020420C4: .word _0209C9AC +_020420C8: .word _0209C99C +_020420CC: .word 0x80000233 +_020420D0: .word 0x00003F04 +_020420D4: .word 0x00003F03 +_020420D8: .word 0x00003F07 +_020420DC: .word _020AFE98 +_020420E0: .word 0x00001013 +#ifdef JAPAN +_020420E4: .word 0x0000158A +_02042454: .word 0x00001586 +#else +_020420E4: .word 0x00000A77 +#endif +_020420E8: .word 0x80401C33 +_020420EC: .word _0209C98C +_020420F0: .word GetCheckIqMenuSkillString + arm_func_end sub_02041B7C + + arm_func_start sub_020420F4 +sub_020420F4: ; 0x020420F4 + stmdb sp!, {r3, lr} + ldr r0, _02042138 ; =_020AFE90 + ldr r0, [r0, #4] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + ldrsb r0, [r0] + mvn r1, #1 + cmp r0, r1 + beq _0204211C + bl CloseAdvancedMenu +_0204211C: + ldr r0, _02042138 ; =_020AFE90 + ldr r0, [r0, #4] + bl MemFree + ldr r0, _02042138 ; =_020AFE90 + mov r1, #0 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + .align 2, 0 +_02042138: .word _020AFE90 + arm_func_end sub_020420F4 + + arm_func_start GetCheckIqMenuSkillString +GetCheckIqMenuSkillString: ; 0x0204213C + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0x84 + ldr r2, _02042248 ; =_020AFE90 + mov r4, r0 + ldr r2, [r2, #4] + mov r6, #0 + add r0, r2, r1 + ldrb r5, [r0, #0x64] + ldr r0, [r2, #0x790] + cmp r5, #0x18 + bne _02042174 + mov r0, #3 + bl GetResolvedPerformanceProgressFlag + b _0204217C +_02042174: + mov r1, r5 + bl IqSkillFlagTest +_0204217C: + cmp r0, #0 + movne r6, #1 + cmp r6, #0 + beq _020421DC + cmp r5, #0x38 + bgt _020421B4 + bge _020421BC + cmp r5, #0x1b + bgt _020421CC + cmp r5, #0x18 + blt _020421CC + cmpne r5, #0x1b + beq _020421BC + b _020421CC +_020421B4: + cmp r5, #0x39 + bne _020421CC +_020421BC: + ldr r1, _0204224C ; =_0209C9CC + add r0, sp, #0x44 + bl strcpy + b _020421E8 +_020421CC: + ldr r1, _02042250 ; =_0209C9D4 + add r0, sp, #0x44 + bl strcpy + b _020421E8 +_020421DC: + ldr r1, _02042254 ; =_0209C9DC + add r0, sp, #0x44 + bl strcpy +_020421E8: + ldr r1, _02042248 ; =_020AFE90 + mov r0, r5 + ldr r1, [r1, #4] + str r5, [r1, #0x24] + bl GetIqSkillStringId + mov r1, r0 + add r0, sp, #4 + mov r2, #0x40 + bl CopyNStringFromId + add r0, sp, #0x44 + add r1, sp, #4 + bl strcat + ldr r1, _02042248 ; =_020AFE90 + mov r0, r4 + ldr r2, [r1, #4] + mov r1, #0x40 + add r2, r2, #0x14 + str r2, [sp] + add r2, sp, #0x44 + mov r3, #0 + bl PreprocessString + mov r0, r4 + add sp, sp, #0x84 + ldmia sp!, {r3, r4, r5, r6, pc} + .align 2, 0 +_02042248: .word _020AFE90 +_0204224C: .word _0209C9CC +_02042250: .word _0209C9D4 +_02042254: .word _0209C9DC + arm_func_end GetCheckIqMenuSkillString + + arm_func_start InitUnkStorageStruct0xA0 +InitUnkStorageStruct0xA0: ; 0x02042258 + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #0xc + mov r6, r0 + mov r0, #0xa0 + mov r1, #8 + mov r5, r2 + mov r4, r3 + bl MemAlloc + ldr r1, _020423B4 ; =UNK_STORAGE_STRUCT_0XC + str r0, [r1, #4] + str r6, [r0] + bl RemoveEmptyItemsInBag + mov r0, #0x14 + bl Arm9LoadUnkFieldNa0x2029EC8 + ldr r1, _020423B4 ; =UNK_STORAGE_STRUCT_0XC + cmp r4, #0 + ldr r3, [r1, #4] + ldrne r4, _020423B8 ; =sub_020423D8 + str r0, [r3, #8] + ldr r2, _020423BC ; =0x0000032F + ldr r0, [r1, #4] + mov ip, #0x10 + strh r2, [r0, #0x10] + ldr r0, [r1, #4] + mov r3, #0xd + str ip, [r0, #0x14] + ldr r0, [r1, #4] + ldr r2, _020423C0 ; =sub_0204261C + str r3, [r0, #0xc] + ldr r0, [r1, #4] + moveq r4, #0 + str r2, [r0, #0x7c] + bl GetNbItemsInBag + str r4, [sp] + str r0, [sp, #4] + ldr r0, _020423B4 ; =UNK_STORAGE_STRUCT_0XC + str r5, [sp, #8] + ldr r2, [r0, #4] + ldr r0, _020423C4 ; =_0209C9E4 + ldr r1, _020423C8 ; =0x00443C33 + ldr r3, _020423CC ; =sub_02042760 + add r2, r2, #8 + bl CreateCollectionMenu + ldr r2, _020423B4 ; =UNK_STORAGE_STRUCT_0XC + ldr r1, _020423D0 ; =sub_0204262C + ldr r3, [r2, #4] + strb r0, [r3, #4] + ldr r0, [r2, #4] + ldrsb r0, [r0, #4] + bl sub_0202D068 + ldr r0, _020423B4 ; =UNK_STORAGE_STRUCT_0XC + ldr r1, _020423D4 ; =sub_0204263C + ldr r0, [r0, #4] + ldrsb r0, [r0, #4] + bl SetCollectionMenuVoidFn + ldr r0, _020423B4 ; =UNK_STORAGE_STRUCT_0XC + mov r1, #0xd + ldr r0, [r0, #4] + ldrsb r0, [r0, #4] + bl SetCollectionMenuField0x1BC + ldr r0, _020423B4 ; =UNK_STORAGE_STRUCT_0XC + ldr r1, [r0, #4] + ldr r0, [r1] + cmp r0, #3 + beq _02042368 + cmp r0, #4 + beq _0204237C + b _020423A0 +_02042368: +#ifdef EUROPE + ldrsb r0, [r1, #4] + mov r1, #9 + bl SetCollectionMenuField0x1BC +#endif + mov r0, #0 + bl sub_0204440C + mov r0, #2 + bl sub_0204426C + b _020423A0 +_0204237C: + ldrsb r0, [r1, #4] +#ifdef EUROPE + mov r1, #9 + bl SetCollectionMenuField0x1BC + ldr r0, _020423B4 ; =UNK_STORAGE_STRUCT_0XC +#endif + mov r1, #0x76 +#ifdef EUROPE + ldr r0, [r0, #4] + ldrsb r0, [r0, #4] +#endif + bl SetCollectionMenuWidth + mov r0, #0 + bl sub_0204440C + mov r0, #0 + bl sub_0204426C + mov r0, #0 + bl sub_02044568 +_020423A0: + ldr r0, _020423B4 ; =UNK_STORAGE_STRUCT_0XC + ldr r0, [r0, #4] + ldrsb r0, [r0, #4] + add sp, sp, #0xc + ldmia sp!, {r3, r4, r5, r6, pc} + .align 2, 0 +_020423B4: .word UNK_STORAGE_STRUCT_0XC +_020423B8: .word sub_020423D8 +#ifdef JAPAN +_020423BC: .word 0x000031F4 +#else +_020423BC: .word 0x0000032F +#endif +_020423C0: .word sub_0204261C +_020423C4: .word _0209C9E4 +_020423C8: .word 0x00443C33 +_020423CC: .word sub_02042760 +_020423D0: .word sub_0204262C +_020423D4: .word sub_0204263C + arm_func_end InitUnkStorageStruct0xA0 + + arm_func_start sub_020423D8 +sub_020423D8: ; 0x020423D8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + ldr r1, _02042618 ; =UNK_STORAGE_STRUCT_0XC + mov r5, #0 + ldr r2, [r1, #4] + ldr r1, [r2] + cmp r1, #3 + bne _02042498 + tst r0, #0x800 + beq _02042498 + bl sub_02042B20 + cmp r0, #0 + ble _0204241C + bl ClearBagSelectedItemTable + mov r0, #6 + bl PlaySeVolumeWrapper + mov r5, #1 + b _020425D8 +_0204241C: + bl sub_0200FD48 + mov r4, r0 + bl CountNbOfItemsInStorage + sub r7, r4, r0 + mov r8, r5 + mov r6, #1 + ldr r4, _02042618 ; =UNK_STORAGE_STRUCT_0XC + b _02042470 +_0204243C: + cmp r7, #0 + ble _02042478 + mov r0, r8, lsl #0x10 + mov r0, r0, asr #0x10 + bl GetItemAtIdx + ldrsh r0, [r0, #4] + bl IsStorableItem + cmp r0, #0 + ldrne r0, [r4, #8] + movne r5, r6 + strne r6, [r0, r8, lsl #2] + subne r7, r7, #1 + add r8, r8, #1 +_02042470: + cmp r8, #0x32 + blt _0204243C +_02042478: + cmp r5, #0 + beq _0204248C + mov r0, #6 + bl PlaySeVolumeWrapper + b _020425D8 +_0204248C: + mov r0, #2 + bl PlaySeVolumeWrapper + b _020425D8 +_02042498: + tst r0, #0x400 + beq _020425D8 + ldrsb r0, [r2, #4] + bl sub_0202D0EC + ldr r1, _02042618 ; =UNK_STORAGE_STRUCT_0XC + mov r4, r0 + ldr r0, [r1, #4] + ldr r0, [r0] + cmp r0, #3 + beq _020424CC + cmp r0, #4 + beq _02042570 + b _020425D8 +_020424CC: + mov r0, r4, lsl #0x10 + mov r0, r0, asr #0x10 + bl GetItemAtIdx + ldrsh r0, [r0, #4] + bl IsStorableItem + cmp r0, #0 + beq _02042560 + ldr r0, _02042618 ; =UNK_STORAGE_STRUCT_0XC + ldr r2, [r0, #8] + ldr r0, [r2, r4, lsl #2] + tst r0, #1 + beq _02042514 + mov r1, #0 + mov r0, #6 + str r1, [r2, r4, lsl #2] + bl PlaySeVolumeWrapper + mov r5, #1 + b _020425D8 +_02042514: + bl CountNbOfItemsInStorage + mov r6, r0 + bl sub_02042B20 + mov r5, r0 + bl sub_0200FD48 + add r1, r6, r5 + cmp r1, r0 + bge _02042550 + mov r0, #6 + bl PlaySeVolumeWrapper + ldr r0, _02042618 ; =UNK_STORAGE_STRUCT_0XC + mov r5, #1 + ldr r0, [r0, #8] + str r5, [r0, r4, lsl #2] + b _020425D8 +_02042550: + mov r0, #2 + bl PlaySeVolumeWrapper + mov r5, #0 + b _020425D8 +_02042560: + mov r0, #2 + bl PlaySeVolumeWrapper + mov r5, #0 + b _020425D8 +_02042570: + mov r0, r4, lsl #0x10 + mov r0, r0, asr #0x10 + bl GetItemAtIdx + ldrsh r0, [r0, #4] + bl IsShoppableItem + cmp r0, #0 + beq _020425CC + ldr r0, _02042618 ; =UNK_STORAGE_STRUCT_0XC + mov r5, #1 + ldr r2, [r0, #8] + ldr r0, [r2, r4, lsl #2] + tst r0, #1 + mov r0, #6 + beq _020425B8 + mov r1, #0 + str r1, [r2, r4, lsl #2] + bl PlaySeVolumeWrapper + b _020425D8 +_020425B8: + bl PlaySeVolumeWrapper + ldr r0, _02042618 ; =UNK_STORAGE_STRUCT_0XC + ldr r0, [r0, #8] + str r5, [r0, r4, lsl #2] + b _020425D8 +_020425CC: + mov r0, #2 + bl PlaySeVolumeWrapper + mov r5, #0 +_020425D8: + bl sub_02042B20 + cmp r0, #0 + beq _020425FC + ldr r0, _02042618 ; =UNK_STORAGE_STRUCT_0XC + mov r1, #1 + ldr r0, [r0, #4] + ldrsb r0, [r0, #4] + bl sub_0202D16C + b _02042610 +_020425FC: + ldr r0, _02042618 ; =UNK_STORAGE_STRUCT_0XC + mov r1, #0 + ldr r0, [r0, #4] + ldrsb r0, [r0, #4] + bl sub_0202D16C +_02042610: + mov r0, r5 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_02042618: .word UNK_STORAGE_STRUCT_0XC + arm_func_end sub_020423D8 + + arm_func_start sub_0204261C +sub_0204261C: ; 0x0204261C + stmdb sp!, {r3, lr} + bl sub_02042BE0 + bl sub_02044308 + ldmia sp!, {r3, pc} + arm_func_end sub_0204261C + + arm_func_start sub_0204262C +sub_0204262C: ; 0x0204262C + stmdb sp!, {r3, lr} + bl sub_02042BE0 + bl sub_02044308 + ldmia sp!, {r3, pc} + arm_func_end sub_0204262C + + arm_func_start sub_0204263C +sub_0204263C: ; 0x0204263C + ldr r2, _0204265C ; =BAG_ITEMS_PTR_MIRROR + mov r1, #6 + ldr r2, [r2] + ldr ip, _02042660 ; =sub_020444B0 + ldr r2, [r2, #0x384] + mla r1, r0, r1, r2 + ldrsh r0, [r1, #4] + bx ip + .align 2, 0 +_0204265C: .word BAG_ITEMS_PTR_MIRROR +_02042660: .word sub_020444B0 + arm_func_end sub_0204263C + + arm_func_start FreeUnkStorageStruct0xA0 +FreeUnkStorageStruct0xA0: ; 0x02042664 + stmdb sp!, {r3, lr} + ldr r0, _020426B0 ; =UNK_STORAGE_STRUCT_0XC + ldr r0, [r0, #4] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl sub_02044474 + bl sub_020442CC + bl sub_020445C8 + ldr r0, _020426B0 ; =UNK_STORAGE_STRUCT_0XC + ldr r0, [r0, #4] + ldrsb r0, [r0, #4] + bl CloseCollectionMenu + ldr r0, _020426B0 ; =UNK_STORAGE_STRUCT_0XC + ldr r0, [r0, #4] + bl MemFree + ldr r0, _020426B0 ; =UNK_STORAGE_STRUCT_0XC + mov r1, #0 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + .align 2, 0 +_020426B0: .word UNK_STORAGE_STRUCT_0XC + arm_func_end FreeUnkStorageStruct0xA0 + + arm_func_start sub_020426B4 +sub_020426B4: ; 0x020426B4 + stmdb sp!, {r3, lr} + ldr r0, _0204272C ; =UNK_STORAGE_STRUCT_0XC + ldr r0, [r0, #4] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldrsb r0, [r0, #4] + bl IsCollectionMenuActive + cmp r0, #0 + bne _02042708 + ldr r0, _0204272C ; =UNK_STORAGE_STRUCT_0XC + ldr r0, [r0, #4] + ldrsb r0, [r0, #4] + bl sub_0202C75C + mvn r1, #0 + cmp r0, r1 + ldrne r1, _0204272C ; =UNK_STORAGE_STRUCT_0XC + moveq r0, #2 + strneh r0, [r1] + movne r0, #3 + ldmia sp!, {r3, pc} +_02042708: + ldr r0, _0204272C ; =UNK_STORAGE_STRUCT_0XC + ldr r0, [r0, #4] + ldrsb r0, [r0, #4] + bl GetWindowIdSelectedMenuItemIdx + and r1, r0, #0xff + mov r0, #0x14 + bl Arm9StoreUnkFieldNa0x2029ED8 + mov r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_0204272C: .word UNK_STORAGE_STRUCT_0XC + arm_func_end sub_020426B4 + + arm_func_start sub_02042730 +sub_02042730: ; 0x02042730 + ldr r0, _02042740 ; =UNK_STORAGE_STRUCT_0XC + mov r1, #0 + strh r1, [r0] + bx lr + .align 2, 0 +_02042740: .word UNK_STORAGE_STRUCT_0XC + arm_func_end sub_02042730 + + arm_func_start sub_02042744 +sub_02042744: ; 0x02042744 + ldr r0, _02042758 ; =UNK_STORAGE_STRUCT_0XC + ldr ip, _0204275C ; =sub_0202C620 + ldr r0, [r0, #4] + ldrsb r0, [r0, #4] + bx ip + .align 2, 0 +_02042758: .word UNK_STORAGE_STRUCT_0XC +_0204275C: .word sub_0202C620 + arm_func_end sub_02042744 + + arm_func_start sub_02042760 +sub_02042760: ; 0x02042760 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #0x64 + mov r5, r1 + mov r1, #6 + ldr r3, _02042A64 ; =BAG_ITEMS_PTR_MIRROR + mul r4, r5, r1 + ldr r1, [r3] + ldr r3, _02042A68 ; =UNK_STORAGE_STRUCT_0XC + ldr r6, [r1, #0x384] + ldr r7, [r3, #4] + ldrh r1, [r6, r4] + add lr, r6, r4 + mov r4, r2 + strh r1, [sp] + ldrh ip, [lr, #2] + mov r6, r0 + add r1, sp, #0 + strh ip, [sp, #2] + ldrh r2, [lr, #4] + strh r2, [sp, #4] + ldr r2, [r7] + cmp r2, #5 + addls pc, pc, r2, lsl #2 + b _02042A3C +_020427C0: ; jump table + b _020427D8 ; case 0 + b _020427E4 ; case 1 + b _020427E4 ; case 2 + b _02042808 ; case 3 + b _020428D4 ; case 4 + b _020429E8 ; case 5 +_020427D8: + mov r2, #0 + bl MaybeGetColoredFormattedItemName + b _02042A3C +_020427E4: + mov r7, #0 + mov r3, #1 + add r2, sp, #8 + str r7, [sp, #8] + strb r7, [sp, #0xc] + strb r3, [sp, #0x10] + strb r3, [sp] + bl MaybeGetColoredFormattedItemName + b _02042A3C +_02042808: + mov r1, #0 + mov r0, #1 + str r1, [sp, #8] + strb r1, [sp, #0xc] + strb r0, [sp, #0x10] + strb r0, [sp] + ldr r0, [r3, #8] + ldr r0, [r0, r5, lsl #2] + tst r0, #1 + bne _0204284C + mov r0, r5, lsl #0x10 + mov r0, r0, asr #0x10 + bl GetItemAtIdx + ldrsh r0, [r0, #4] + bl IsStorableItem + cmp r0, #0 + beq _02042890 +_0204284C: + add r0, sp, #0x14 + add r1, sp, #0 + add r2, sp, #8 + bl MaybeGetColoredFormattedItemName + ldrb r2, [sp, #1] + cmp r2, #0 + beq _0204287C + ldr r1, _02042A6C ; =_0209C9F4 + add r3, sp, #0x14 + mov r0, r6 + bl SprintfStatic__02042A84 + b _02042A3C +_0204287C: + ldr r1, _02042A70 ; =_0209C9FC + add r2, sp, #0x14 + mov r0, r6 + bl SprintfStatic__02042A84 + b _02042A3C +_02042890: + add r0, sp, #0x14 + add r1, sp, #0 + add r2, sp, #8 + bl MaybeGetUncoloredFormattedItemName + ldrb r2, [sp, #1] + cmp r2, #0 + beq _020428C0 + ldr r1, _02042A74 ; =_0209CA08 + add r3, sp, #0x14 + mov r0, r6 + bl SprintfStatic__02042A84 + b _02042A3C +_020428C0: + ldr r1, _02042A78 ; =_0209CA18 + add r2, sp, #0x14 + mov r0, r6 + bl SprintfStatic__02042A84 + b _02042A3C +_020428D4: + ldrsh r0, [sp, #4] + bl IsShoppableItem + cmp r0, #0 + beq _020429A4 + mov r7, #3 + mov r3, #0 + mov r2, #0x6a + mov r1, #1 + add r0, sp, #0 + str r7, [sp, #8] + strb r3, [sp, #0xc] + strh r2, [sp, #0xe] + strb r1, [sp, #0x10] + strb r7, [sp] + bl GetActualSellPrice + mov r7, r0 + bl GetMoneyCarried + ldr r1, _02042A7C ; =0x0001869F + add r0, r7, r0 + cmp r0, r1 + add r0, sp, #0x14 + add r1, sp, #0 + add r2, sp, #8 + bgt _0204296C + bl MaybeGetColoredFormattedItemName + ldrb r2, [sp, #1] + cmp r2, #0 + beq _02042958 + ldr r1, _02042A6C ; =_0209C9F4 + add r3, sp, #0x14 + mov r0, r6 + bl SprintfStatic__02042A84 + b _02042A3C +_02042958: + ldr r1, _02042A70 ; =_0209C9FC + add r2, sp, #0x14 + mov r0, r6 + bl SprintfStatic__02042A84 + b _02042A3C +_0204296C: + bl MaybeGetUncoloredFormattedItemName + ldrb r2, [sp, #1] + cmp r2, #0 + beq _02042990 + ldr r1, _02042A74 ; =_0209CA08 + add r3, sp, #0x14 + mov r0, r6 + bl SprintfStatic__02042A84 + b _02042A3C +_02042990: + ldr r1, _02042A78 ; =_0209CA18 + add r2, sp, #0x14 + mov r0, r6 + bl SprintfStatic__02042A84 + b _02042A3C +_020429A4: + add r0, sp, #0x14 + add r1, sp, #0 + mov r2, #0 + bl MaybeGetUncoloredFormattedItemName + ldrb r2, [sp, #1] + cmp r2, #0 + beq _020429D4 + ldr r1, _02042A74 ; =_0209CA08 + add r3, sp, #0x14 + mov r0, r6 + bl SprintfStatic__02042A84 + b _02042A3C +_020429D4: + ldr r1, _02042A78 ; =_0209CA18 + add r2, sp, #0x14 + mov r0, r6 + bl SprintfStatic__02042A84 + b _02042A3C +_020429E8: + ldrsh r0, [sp, #4] + mov r2, #0 + mov r1, #1 + str r2, [sp, #8] + strb r2, [sp, #0xc] + strb r1, [sp, #0x10] + strb r1, [sp] + bl IsGummi + cmp r0, #0 + add r1, sp, #0 + add r2, sp, #8 + beq _02042A24 + mov r0, r6 + bl MaybeGetColoredFormattedItemName + b _02042A3C +_02042A24: + add r0, sp, #0x14 + bl MaybeGetUncoloredFormattedItemName + ldr r1, _02042A80 ; =_0209CA2C + add r2, sp, #0x14 + mov r0, r6 + bl SprintfStatic__02042A84 +_02042A3C: + ldr r0, _02042A68 ; =UNK_STORAGE_STRUCT_0XC + ldr r0, [r0, #8] + ldr r0, [r0, r5, lsl #2] + tst r0, #1 + movne r0, #1 + moveq r0, #0 + str r0, [r4] + mov r0, r6 + add sp, sp, #0x64 + ldmia sp!, {r4, r5, r6, r7, pc} + .align 2, 0 +_02042A64: .word BAG_ITEMS_PTR_MIRROR +_02042A68: .word UNK_STORAGE_STRUCT_0XC +_02042A6C: .word _0209C9F4 +_02042A70: .word _0209C9FC +_02042A74: .word _0209CA08 +_02042A78: .word _0209CA18 +_02042A7C: .word 0x0001869F +_02042A80: .word _0209CA2C + arm_func_end sub_02042760 + + arm_func_start SprintfStatic__02042A84 +SprintfStatic__02042A84: ; 0x02042A84 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + add r2, sp, #0xc + bic r2, r2, #3 + ldr r1, [sp, #0xc] + add r2, r2, #4 + bl vsprintf + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + arm_func_end SprintfStatic__02042A84 + + arm_func_start sub_02042AAC +sub_02042AAC: ; 0x02042AAC + stmdb sp!, {r3, lr} + ldr r0, _02042AD8 ; =UNK_STORAGE_STRUCT_0XC + ldr r0, [r0, #4] + cmp r0, #0 + ldrnesb r0, [r0, #4] + mvnne r1, #1 + cmpne r0, r1 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + bl IsCollectionMenuState3 + ldmia sp!, {r3, pc} + .align 2, 0 +_02042AD8: .word UNK_STORAGE_STRUCT_0XC + arm_func_end sub_02042AAC + + arm_func_start sub_02042ADC +sub_02042ADC: ; 0x02042ADC + ldr r0, _02042AF0 ; =UNK_STORAGE_STRUCT_0XC + ldr ip, _02042AF4 ; =sub_0202D0EC + ldr r0, [r0, #4] + ldrsb r0, [r0, #4] + bx ip + .align 2, 0 +_02042AF0: .word UNK_STORAGE_STRUCT_0XC +_02042AF4: .word sub_0202D0EC + arm_func_end sub_02042ADC diff --git a/include/main_0203D538.h b/include/main_0203D538.h new file mode 100644 index 00000000..a7394fd5 --- /dev/null +++ b/include/main_0203D538.h @@ -0,0 +1,6 @@ +#ifndef PMDSKY_MAIN_0203D538_H +#define PMDSKY_MAIN_0203D538_H + +s32 sub_0203D538(void); + +#endif diff --git a/main.lsf b/main.lsf index d79a998a..527a9d95 100644 --- a/main.lsf +++ b/main.lsf @@ -207,6 +207,8 @@ Static main Object asm/main_0203C774.o Object src/main_0203C910.o Object asm/main_0203CAF0.o + Object src/main_0203D538.o + Object asm/main_0203EFD4.o Object src/main_02042AF8.o Object src/main_02042B84.o Object asm/main_02042BE0.o diff --git a/src/main_0203D538.c b/src/main_0203D538.c new file mode 100644 index 00000000..1d08e6ca --- /dev/null +++ b/src/main_0203D538.c @@ -0,0 +1,915 @@ +#include "main_0203D538.h" +#include "window.h" +#include "common.h" +#include "item.h" +#include "main_0200C4FC.h" +#include "item_util.h" +#include "item_util_4.h" +#include "main_02017B58.h" +#include "main_0201077C.h" +#include "main_020107DC.h" +#include "item_util_1.h" +#include "main_0200330C.h" +#include "main_0200ECFC.h" +#include "main_020251AC.h" +#include "main_0202AB40.h" +#include "main_0202B4C4.h" +#include "main_0203755C.h" +#include "progression.h" +#include "script_variable.h" + +struct unk_020517F4 { + u8 field_0x0[8]; + s32 field_0x8; + s16 field_0xc; + u8 field_0xe[2]; +}; + +struct unk_020AFE74 { + s32 field_0x0; + s8 field_0x4; + s8 field_0x5; + s8 field_0x6; + u8 field_0x7; + s32 field_0x8; + u8 field_0xc; + u8 field_0xd[3]; + s32 field_0x10; + s16 field_0x14; + u8 field_0x16[2]; + s32 field_0x18; + s32 field_0x1c; + s32 field_0x20; + struct item field_0x24[3]; + u8 field_0x36; + u8 field_0x37; + s16 field_0x38; + u8 field_0x3a[2]; + s32 field_0x3c; + struct ground_monster field_0x40; + struct item field_0x84; + u8 field_0x8a[2]; + struct preprocessor_args field_0x8c; + s16 field_0xdc; + struct item field_0xde; + u32 field_0xe4; + char field_0xe8[0x50]; + char field_0x138[0x50]; + s32 field_0x188; + s32 field_0x18c; + portrait_params field_0x190; + s8 field_0x1a0; + char field_0x1a1[10]; + char field_0x1ab[10]; + char field_0x1b5[10]; + u8 field_0x1bf[0xf6]; + char field_0x2b5[0x4e]; + u8 field_0x303[0xb5]; + struct ground_monster *field_0x3b8; + s32 field_0x3bc; +}; + +extern struct unk_020AFE74 *MISSION_REWARD_STRUCT_MAIN_PTR; + +extern void MaybeGetColoredFormattedItemName(void*, struct item*, void*); +extern s8 CreateSimpleMenuFromStringIds(void*, s32, s32, void*, s32); +extern u8 CreateParentMenuFromStringIds(void *, u32, void *, void *); +extern void GetNameWithGender(char *dst, s16 monster_id, char color_id); +extern void GetNameRaw(unsigned char *, s32); +extern void StrncpySimpleNoPadSafe(u8* dest, const u8* src, u32 n); +extern s32 GetSimpleMenuResult__0202B870(s8); +extern s32 GetSimpleMenuResult__0202AEA4(s8); +extern void InitPreprocessorArgs(struct preprocessor_args* args); +extern bool8 IsMonsterIllegalForMissions(enum monster_id); +extern void sub_02046BE8(s32 a, s32 b, struct preprocessor_args *c); +extern s32 sub_02046C78(void); +extern void sub_02046D20(void); +extern s32 ov11_0230D220(void); +extern void ov11_0230D92C(void); +extern void *ov11_02306C64(); +extern s32 ov11_02306C9C(); +extern s32 GetKeyboardStatus(); +extern s32 sub_02037468(); +extern s32 sub_02039218(); +extern s32 sub_0203931C(); + +extern s32 sub_02046028(void); +extern void sub_02045FD0(struct item *out); +extern bool8 AddItemToStorage(struct item *item); +extern void InitUnkStorageStruct0x410(struct item *, u8); +extern s32 GetRank(void); +extern struct unk_020517F4 *GetRankUpEntry(s32 rank); +extern void sub_0203F00C(void); +extern void MissionRewardCloseAllBoxes(void); +extern struct ground_monster *sub_02055D4C(struct ground_monster *mon); +extern void sub_02052E2C(struct ground_monster *, s16, s32, const u8 *, const u16 *); +extern void sub_02053A0C(u16 *buf, s16 monster_id, s32, s32); +extern void ApplyLevelUpBoostsToGroundMonster(void *mon, s16 levels, s32 flag); +extern void sub_02050C10(s32 delta); +extern void sub_0203909C(u8 *name); +extern void ShowKeyboard(s32 mode, u8 *, s32, u8 *); +extern s32 RandIntSafe(s32 n); +extern void ov11_023061CC(void *); +extern void ov11_023061E4(void *, s32); +extern void ov11_02310BDC(void); + +extern const u8 _0209C844[2]; +extern const u16 _0209C846[4]; +extern s32 _0209C850; +extern s32 _0209C85C; +extern s32 _0209C86C; +extern s32 _0209C884; + +#ifdef JAPAN +#define SUB_0203D538_OFFSET 0x21D4 +#else +#define SUB_0203D538_OFFSET 0 +#endif + +s32 sub_0203D538(void) +{ + u16 v6[4]; + struct item v5; + struct item v4; + struct item v3; + struct item v2; +#ifndef JAPAN + struct item v1; +#endif + struct preprocessor_args v7; + struct preprocessor_args v8; + struct preprocessor_args v9; + + switch (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0) { + case 0: { + s32 i; + s32 k; + k = -1; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x36 != 0) { + if (GetEggSpecies() != 0 || !GetResolvedPerformanceProgressFlag(0x1e)) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1c = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1c * k; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x36 = 0; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38 = 0; + } + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38 != 0) { + if (!GetResolvedPerformanceProgressFlag(0x1d) || IsMonsterIllegalForMissions((enum monster_id)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38)) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38 = 0; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1c = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1c * k; + } + } + if (!(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 0x10) && !GetResolvedPerformanceProgressFlag(0x1f)) { + for (i = 0; i < MISSION_REWARD_STRUCT_MAIN_PTR->field_0x20; i++) { + if (GetItemCategory(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[i].id) == CATEGORY_EXCLUSIVE_ITEMS) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[i].id = ITEM_NOTHING; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1c = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1c * k; + } + } + } + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 1; + break; + } + case 1: { + u16 msg; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1c <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 7; + break; + } + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1c; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[1] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1c * 10; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 != 0) { + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { + msg = (0x289 + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 3) { + msg = (0x28a + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 4) { + msg = LoadScriptVariableValue(NULL, VAR_REQUEST_THANKS_RESULT_VARIATION) + (0x28b + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else { + msg = (0x288 + SUB_0203D538_OFFSET); + } + sub_02046BE8(0x101c, msg, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 2; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 4; + } + break; + } + case 2: + if (sub_02046C78() != 0) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 3; + } + break; + case 3: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 4; + } + break; + case 4: { + u16 msg; + sub_02017C50(4); + AddMoneyCarried(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1c); + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { + msg = (0x26f + SUB_0203D538_OFFSET); + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 3) { + msg = (0x270 + SUB_0203D538_OFFSET); + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 4) { + msg = (0x271 + SUB_0203D538_OFFSET); + } else { + msg = (0x26e + SUB_0203D538_OFFSET); + } + sub_02046BE8(0x101c, msg, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 5; + break; + } + case 5: + if (sub_02046C78() != 0) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 6; + } + break; + case 6: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 7; + } + break; + case 7: { + u16 msg; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38 == 0 || MISSION_REWARD_STRUCT_MAIN_PTR->field_0x36 != 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x29; + break; + } + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.flag_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x14; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.flag_vals[1] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 != 0) { + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { + msg = (0x29a + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 4) { + msg = LoadScriptVariableValue(NULL, VAR_REQUEST_THANKS_RESULT_VARIATION) + (0x29b + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else { + msg = (0x299 + SUB_0203D538_OFFSET); + } + sub_02046BE8(0x3008, msg, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 8; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xb; + } + break; + } + case 8: + if (sub_02046C78() != 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x4 = CreateParentMenuFromStringIds(NULL, 0x11, NULL, &_0209C884); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 9; + } + break; + case 9: + if (!IsParentMenuActive(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x4)) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x18c = GetSimpleMenuResult__0202AEA4(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x4); + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 10; + } + break; + case 10: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x18c == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xb; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x23; + } + } + break; + case 11: { + struct unk_0209C846 { + u16 field_0x0[4]; + }; + *(struct unk_0209C846 *)v6 = *(const struct unk_0209C846 *)_0209C846; + sub_02053A0C(v6, MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38, 1, 0); + sub_02052E2C(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x40, MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38, 0, _0209C844, v6); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8 = sub_02055D4C(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x40); + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8 != NULL) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xc; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1e; + } + break; + } + case 12: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x18 > 1) { + ApplyLevelUpBoostsToGroundMonster(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8, (s16)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x18, 1); + } + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.flag_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { + sub_02046BE8(0x101C, (0x27A + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + sub_0203F00C(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xd; + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 4) { + sub_02046BE8(0x101C, (u16)(LoadScriptVariableValue(0, 0x69) + (0x27B + SUB_0203D538_OFFSET)), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + sub_0203F00C(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xd; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xf; + } + break; + case 13: + if (sub_02046C78() != 0) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xe; + } + break; + case 14: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xf; + } + break; + case 15: + GetNameWithGender(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x2b5, MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38, 0x4e); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x2b5; + sub_02046BE8(0x100C, (0x2A6 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); +#ifdef JAPAN + StrcpySimple((unsigned char *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a1, (const unsigned char *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8->name); +#else + StrncpySimple((unsigned char *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a1, (const unsigned char *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8->name, 10); +#endif + MemcpySimple((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8->name, 10); + StrncpySimpleNoPadSafe((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5, (const u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 10); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x10; + break; + case 16: + if (sub_02046C78() != 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0 = CreateSimpleMenuFromStringIds(&_0209C85C, 0x300011, 0, &_0209C86C, 2); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x11; + } + break; + case 17: + if (IsSimpleMenuActive(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0) == 0) { + s32 result = GetSimpleMenuResult__0202B870(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0); + CloseSimpleMenu(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0 = -2; + sub_02046D20(); + switch (result) { + case 0: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x12; + break; + case 1: + default: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x20; + break; + } + } + break; + case 18: + ov11_0230D92C(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x13; + break; + case 19: + if (ov11_0230D220() == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x14; + } + break; + case 20: + ShowKeyboard(2, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 0, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a1); + ov11_02310BDC(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x15; + break; + case 21: + if (ov11_0230D220() == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x16; + } + break; + case 22: + if (GetKeyboardStatus() == 3) { + MemcpySimple((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, (u8 *)GetKeyboardStringResult(), 10); + StrncpySimpleNoPadSafe((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5, (const u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 10); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x17; + } + break; + case 23: + if (sub_02037468() != 0) { + ov11_0230D92C(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x18; + } + break; + case 24: + if (ov11_0230D220() == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x19; + } + break; + case 25: + ov11_0230D92C(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1a; + break; + case 26: + if (ov11_0230D220() == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1b; + } + break; + case 27: + sub_0203909C((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1c; + break; + case 28: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3bc = sub_0203931C(); + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3bc >= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1d; + } + break; + case 29: + if (sub_02039218() != 0) { + switch (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3bc) { + case 0: + MemcpySimple((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8->name, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 10); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x20; + break; + case 1: + default: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x12; + break; + } + } + break; + case 32: + { + s32 v10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.flag_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38 | 0x80000; + StrncpySimpleNoPadSafe((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 10); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { + v10 = (0x283 + SUB_0203D538_OFFSET); + } else { + v10 = (0x281 + SUB_0203D538_OFFSET); + } + sub_02017C50(5); + sub_02046BE8(0x101C, v10, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x21; + } + break; + case 33: + if (sub_02046C78()) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x22; + } + break; + case 34: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x29; + } + break; + case 30: + sub_02046D20(); + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2 || MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 3) { + ov11_023061E4(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x40, 1); + } else { + ov11_023061CC(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x40); + } + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1f; + break; + case 31: + { + s32 v10; + struct ground_monster *v11; + v10 = ov11_02306C9C(); + switch (v10) { + case 3: + case 4: + v11 = ov11_02306C64(); + if (v11 == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x23; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8 = v11; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xc; + } + break; + } + } + break; + case 35: + GetNameRaw((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; + sub_02046BE8(0x101C, (0x284 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x24; + break; + case 36: + if (sub_02046C78()) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x25; + } + break; + case 37: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x26; + } + break; + case 38: + sub_02017C50(4); + AddMoneyCarried(1000); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 1000; + sub_02046BE8(0x101C, (0x285 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x27; + break; + case 39: + if (sub_02046C78()) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x28; + } + break; + case 40: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x29; + } + break; + case 41: + { + s32 v10; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10 >= MISSION_REWARD_STRUCT_MAIN_PTR->field_0x20) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3a; + break; + } + v5.id = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].id; + v5.flags = 0; + if (IsStorableItem(v5.id)) { + if (IsThrownItem(v5.id) || (v5.id >= ITEM_GORGEOUS_BOX_1 && v5.id <= ITEM_SINISTER_BOX_3)) { + v5.quantity = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].quantity; + } else { + v5.quantity = 0; + } + v5.flags = 1; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10] = v5; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[0] = v5.id; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 0; + MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, &v5, &_0209C850); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.flag_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x14; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 != 0) { + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { + v10 = (0x296 + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 3) { + v10 = (0x297 + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 4) { + v10 = (0x298 + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else { + v10 = (0x295 + SUB_0203D538_OFFSET); + } + sub_02046BE8(0x101C, v10, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2a; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2c; + } + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x33; + } + } + break; + case 42: + if (sub_02046C78()) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2b; + } + break; + case 43: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2c; + } + break; + case 44: + if (AddItemToStorage(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10])) { + if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 2) == 0) { + sub_02017C50(4); + } + if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 4) == 0) { + sub_02046BE8(0x1c, (0x273 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2e; + } else if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 8) != 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x30; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x33; + } + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x34; + } + break; +case 52: + v4.id = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].id; + v4.quantity = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].quantity; + v4.flags = 0; + sub_02046D20(); + InitUnkStorageStruct0x410(&v4, (MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 1) == 0); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x35; + break; +case 53: + switch (sub_02046028()) { + case 4: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2d; + break; + case 2: + sub_02045FD0(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x36; + break; + case 3: + sub_02045FD0(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x38; + break; + } + break; +case 54: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x37; + } + break; +case 55: + if (AddItemToStorage(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10])) { + if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 2) == 0) { + sub_02017C50(4); + } + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].id; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 0; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[2] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xdc; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[2] = 0; + v3.id = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde.id; + v3.quantity = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde.quantity; + v3.flags = 0; + MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10], &_0209C850); + MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x138, &v3, &_0209C850); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[2] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x138; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; + sub_02046BE8(0x101C, (0x275 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2e; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x34; + } + break; +case 56: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x39; + } + break; +case 57: + if (AddItemToStorage(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10])) { + if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 2) == 0) { + sub_02017C50(4); + } + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].id; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 0; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[2] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xdc; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[2] = 0; + MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10], &_0209C850); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; + sub_02046BE8(0x101C, (0x277 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2e; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x34; + } + break; +case 45: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + sub_02046BE8(0x101C, (0x286 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + sub_02045FD0(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2e; + } + break; +case 46: + if (sub_02046C78()) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2f; + } + break; +case 47: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x33; + } + break; +case 48: + #ifdef JAPAN + sub_02046BE8(0x101C, 0x2FEC, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); +#else + sub_02046BE8(0x101C, 0x2CC, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); +#endif + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x31; + break; +case 49: + if (sub_02046C78()) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x32; + } + break; +case 50: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x33; + } + break; +case 51: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10++; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10 < 3) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x29; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3a; + } + break; +case 58: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x36 == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x40; + break; + } + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 != 0) { + s32 v10; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { + v10 = (0x292 + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 3) { + v10 = (0x293 + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 4) { + v10 = (0x294 + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else { + v10 = (0x291 + SUB_0203D538_OFFSET); + } + sub_02046BE8(0x101c, v10, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3b; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3d; + } + break; +case 59: + if (sub_02046C78() != 0) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3c; + } + break; +case 60: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3d; + } + break; +case 61: + sub_02017C50(5); + SetEggSpecies(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38); + SetEggHatchTimer((u16)(RandIntSafe(4) + 6)); + sub_02046BE8(0x101c, (0x272 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3e; + break; +case 62: + if (sub_02046C78() != 0) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3f; + } + break; +case 63: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x40; + } + break; +case 64: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3c == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; + break; + } + InitPreprocessorArgs(&v7); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0xc = GetRank(); + sub_02050C10(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3c); + sub_02017C50(4); + v7.number_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3c; + sub_02046BE8(0x101c, (0x2a1 + SUB_0203D538_OFFSET), &v7); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x41; + break; +case 65: + if (sub_02046C78() != 0) { + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0xc != GetRank()) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x42; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; + } + } + break; +case 66: + sub_02017C50(2); + InitPreprocessorArgs(&v8); + v8.id_vals[2] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xc; + v8.id_vals[3] = GetRank(); + sub_02046BE8(0x101c, (0x2a2 + SUB_0203D538_OFFSET), &v8); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x43; + break; +case 67: + if (sub_02046C78() != 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x44; + } + break; +case 68: + InitPreprocessorArgs(&v9); + v9.number_vals[0] = GetRankUpEntry(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xc)->field_0x8; + v9.number_vals[1] = GetRankUpEntry(GetRank())->field_0x8; + if (v9.number_vals[0] == v9.number_vals[1]) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x46; + break; + } + sub_02046BE8(0x101c, (0x2a3 + SUB_0203D538_OFFSET), &v9); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x45; + break; +case 69: + if (sub_02046C78() != 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x46; + } + break; +case 70: { + struct unk_020AFE74 *p; + s16 v; + p = MISSION_REWARD_STRUCT_MAIN_PTR; + v = GetRankUpEntry(GetRank())->field_0xc; + p->field_0x84.id = v; + if (v == 0) { + sub_02046D20(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; + } else if (IsStorableItem(v)) { + p->field_0x84.quantity = IsThrownItem(p->field_0x84.id) != 0; + p->field_0x84.flags = ITEM_FLAG_EXISTS; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[0] = p->field_0x84.id; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 0; + sub_02017C50(4); + sub_02046BE8(0x101c, (0x2a4 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x47; + } else { + sub_02046D20(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; + } + break; +} +case 71: + if (sub_02046C78()) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x48; + } + break; +case 72: + if (!AddItemToStorage(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x84)) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x49; + } else { + sub_02046D20(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; + } + break; +case 73: + v2.id = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x84.id; + v2.quantity = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x84.quantity; + v2.flags = 0; + sub_02046D20(); + InitUnkStorageStruct0x410(&v2, (MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 1) == 0); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4a; + break; +case 74: { + s32 v10; + v10 = sub_02046028(); +#ifndef JAPAN + if (v10 == 1) { + break; + } + sub_02045FD0(&v1); + if (v1.id == 0) { + v1 = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x84; + } +#endif + switch (v10) { + case 4: +#ifndef JAPAN + MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, &v1, &_0209C850); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; +#endif + sub_02046BE8(0x101c, (0x286 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4b; + break; + case 2: + case 3: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x48; + break; + } + break; +} +case 75: + if (sub_02046C78()) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; + } + break; +case 76: + return 1; + } + return 0; +} diff --git a/src/overlay_24_init.c b/src/overlay_24_init.c index 941803f1..05d3c728 100644 --- a/src/overlay_24_init.c +++ b/src/overlay_24_init.c @@ -1,4 +1,5 @@ #include "overlay_24.h" +#include "main_0203D538.h" extern void CloseCollectionMenu(s8); extern void CloseDialogueBox(s8); @@ -23,7 +24,6 @@ extern void sub_0202F2C4(s8); extern s32 sub_02037468(); extern s32 sub_02039218(); extern s32 sub_0203931C(); -extern s32 sub_0203D538(); s32 ov24_0238A140(void) From 240bea143d02cbb2ac2d1fcc34e3c32a2b233b27 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Mon, 7 Sep 2026 15:33:54 -0700 Subject: [PATCH 12/34] Decomp ov11_02307334; correct three callee declarations it exposes ov11_02307334 (0x02307334, 1624 instructions in all three regions) is the TM/HM use flow: a 42-case dense switch over *ov11_02324D8C, driving the bag inventory menu, the TM info and confirmation dialogues, the gummi/IQ path and the move-forget flow through menus, text boxes and scroll boxes. It is function 145 of 215 in asm/overlay_11_022FE5F8.s, so extract_function.py splits rather than merges: the 70 functions after it move to asm/overlay_11_02308D1C.s, the function lands in src/overlay_11_02307334.c with include/overlay_11_02307334.h, and main.lsf lists both new objects where it listed one. Unlike the last three functions on this branch there is no stale extern to reconcile. The symbol has exactly one caller, ov11_02304B4C, in the same object and still in asm; it has no external linkage today, appears in no function-pointer table, and a scan of all 512 .s files for the little-endian encoding of its address finds nothing. Three declarations elsewhere in the tree are wrong and this function is the first caller that makes them matter. RemoveItemNoHoleCheck takes an item index, not a struct item *: asm/main_0200F390.s does mov r1,#6 / smulbb r1, r0, r1, and SMULBB multiplies the low halfwords, so the argument is a signed 16-bit value scaled by sizeof(struct item). Its only other caller passes GetFirstUnequippedItemOfType, which likewise returns an index rather than a pointer, so the two errors cancelled and the pair matched by accident. ov10_022BCDA8 is declared void but its body ends in sub_02033064, which returns s32, and both of this function's call sites consume the result. All three are -W error blockers here, and the matching build confirms the fixes are byte-neutral. Case emission order is source order and is not ascending: 0, 2, 1, 3, 17..25, 33, 34, 31, 32, 35..40, 26..30, 41, then 4..16 last. Every case breaks to a single trailing return 0; case 16 returns 1, and case 15 falls through into it. The eight function-scope locals are declared in descending stack-address order because MWCC gives the first-declared local the highest address, which tiles the frame exactly to 0x5A0. The 43-instruction block shared by cases 32 and 34 is written out twice rather than factored into a helper - MWCC 2.0 does not tail-merge blocks of that size, and the target has both copies. Several shapes that read as redundant are load-bearing and reproduce the target: case 4's v1 != 8 && v1 == 4, the dead field_0x0 = 0x1a in case 38 and field_0x24e = v6->id in case 1 that the following if/else overwrites in both arms, the guard if (field_0x8 == -2) ov11_02308EDC() in case 12 that the callee performs again itself, and case 21's two search loops being written differently. struct unk_02324D8C is a placeholder for the 0x330-byte state struct MemAlloc'd by ov11_02307244, with field_0x members, three identified sub-object types where the arithmetic closes, and u8 filler elsewhere. The 0x14-byte object at 0x238 has to be a real nested struct: the target holds base + 0x238 in a callee-saved register across two calls, while flat fields make MWCC round the base to #0x200 and re-offset per use. The 49 callees with no declaration anywhere are declared extern in the .c with prototypes read off their own asm; every name is established by a literal bl in the target, but the argument types are inference. Region handling: three file-scope offset macros under JAPAN cover the id families at +0x2D20 (16 sites), +0x1458 and +0x1567, and the two genuine three-way forks - the StringFromId base in case 1 and the CreateScrollBoxSingle base in case 10 - are written out per region as src/get_category_string.c and src/overlay_25_init.c already do. The asm's four #ifdef JAPAN code forks need no #if here: each exists only because exactly one of the two constants is an ARM rotated-8-bit immediate, so writing id + OFFSET and letting MWCC choose mov versus a pool word reproduces all four. EUROPE differs from NORTH_AMERICA in two constants and nothing else. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/overlay_11_022FE5F8.inc | 254 +- asm/include/overlay_11_02308D1C.inc | 189 + asm/overlay_11_022FE5F8.s | 6609 --------------------------- asm/overlay_11_02308D1C.s | 4763 +++++++++++++++++++ include/main_0200F798.h | 4 +- include/overlay_10_022BCC60.h | 2 +- include/overlay_11_02307334.h | 6 + main.lsf | 2 + src/overlay_10_022BCC60.c | 4 +- src/overlay_11_02307334.c | 896 ++++ 10 files changed, 5905 insertions(+), 6824 deletions(-) create mode 100644 asm/include/overlay_11_02308D1C.inc create mode 100644 asm/overlay_11_02308D1C.s create mode 100644 include/overlay_11_02307334.h create mode 100644 src/overlay_11_02307334.c diff --git a/asm/include/overlay_11_022FE5F8.inc b/asm/include/overlay_11_022FE5F8.inc index 2fc0ff08..17e19f25 100644 --- a/asm/include/overlay_11_022FE5F8.inc +++ b/asm/include/overlay_11_022FE5F8.inc @@ -1,40 +1,25 @@ #pragma once .public AddItemToBagNoHeld .public AnyDungeonRequestsDone -.public AppendStandardStringToMission -.public ApplyGummiBoostsToGroundMonster -.public ApplyGummiBoostsToTeamMember .public ApplyLevelUpBoostsToGroundMonster -.public BAG_ITEMS_PTR_MIRROR .public C_ROUTINES .public CheckInventoryMenuField0x1A0 .public CheckParentMenuField0x1A0 -.public CheckTeamMemberIdx .public CloseAdvancedMenu -.public CloseAdvancedTextBox .public CloseAreaNameBox -.public CloseCollectionMenu .public CloseDialogueBox .public CloseInventoryMenu .public CloseParentMenu .public CloseScrollBox .public CloseSimpleMenu -.public CloseSynthBin .public CloseTextBox -.public CloseTextBox2 .public CopyItemAtIdx .public CopyMenuControlWindowExtraInfo .public CopyOrInitPreprocessorArgs -.public CountNbItemsOfTypeInBag -.public CountNbItemsOfTypeInStorage .public CreateAdvancedMenu -.public CreateAdvancedTextBox .public CreateAreaNameBox -.public CreateCollectionMenu .public CreateDialogueBox .public CreateInventoryMenuOuter -.public CreateMonsterSummaryFromTeamMember -.public CreateParentMenu .public CreateParentMenuFromStringIds .public CreateScrollBoxSingle .public CreateSimpleMenu @@ -47,35 +32,22 @@ .public DigitInputMenuInit .public DigitInputMenuReturn .public DrawTextInWindow -.public DungeonMoveToGroundMove .public DungeonSwapIdxToId -.public EnableIqSkill .public EVENTS -.public EXCLUSIVE_ITEM_REQUIREMENTS_PTR .public FreeMissionRewardStructMain .public FuncThatCallsRunNextOpcode .public GetActiveRosterIndex .public GetActiveTeamMember -.public GetActorMatchingStorageId .public GetAdvancedMenuCurrentOption .public GetAdvancedMenuResult -.public GetCroagunkItemTemplates -.public GetCurrentBagCapacity -.public GetDexNumber .public GetDungeonMode -.public GetExclusiveItemType .public GetExecuteSpecialEpisodeType .public GetFirstEmptyMemberIdx .public GetFirstMatchingMemberIdx .public GetGameMode .public GetHero -.public GetInfoMoveGround -.public GetItemAtIdx -.public GetItemCategoryVeneer -.public GetItemMoveId16 .public GetKeyboardStatus .public GetKeyboardStringResult -.public GetLearnableIqSkills .public GetMaxReachedFloor .public GetMoneyCarried .public GetNameRaw @@ -91,23 +63,14 @@ .public GetStringFromFileVeneer .public GetTeamMember .public GetWindowContents -.public GetWindowIdPageStart -.public GetWindowIdSelectedItemOnPage -.public GetWindowIdSelectedMenuItemIdx .public InitMenu -.public InitMove .public InitPortraitParams .public InitPreprocessorArgs .public IsAdvancedMenuActive .public IsAdvancedMenuActive2 -.public IsAdvancedTextBoxActive .public IsAreaNameBoxActive .public IsBagFull -.public IsCollectionMenuActive -.public IsCollectionMenuState3 .public IsDialogueBoxActive -.public IsGummi -.public IsHM .public IsInventoryMenuActive .public IsInventoryMenuState3 .public IsMonsterOnTeam @@ -117,23 +80,55 @@ .public ItemZInit .public LoadFileFromRomVeneer .public LoadScriptVariableValue -.public LoadSynthBin .public MaybeGetColoredFormattedItemName .public MaybeGetFormattedItemName -.public MaybeGetUncoloredFormattedItemName .public MemAlloc -.public memcpy -.public MemcpySimple .public MemFree -.public MemZero .public NewWindowScreenCheck +.public PlaySeVolumeWrapper +.public PopInventoryMenuField0x1A3 +.public PreprocessString +.public PreprocessStringFromId +.public PrintBadgeMark +.public PrintIqSkillsMenu +.public RemoveItemNoHole +.public ResetAttributeBitfieldLivePerformer +.public ResumeAdvancedMenu +.public ReturnScriptMenuResult +.public ReturnScriptMenuResultZero +.public SaveScriptVariableValue +.public SaveScriptVariableValueBytes +.public SetAnimDataFields2 +.public SetAreaNameBoxState3 +.public SetAttributeBitfieldLivePerformer +.public SetInventoryMenuState0 +.public SetInventoryMenuState6 +.public SetNewFriendActor +.public SetParentMenuState7 +.public ShowDialogueBox +.public ShowKeyboard +.public ShowStringIdInDialogueBox +.public ShowStringInDialogueBox +.public SortItemsInBag +.public StrcpyName +.public StrcpySimple +.public StrncpyName +.public StrncpySimple +.public StrncpySimpleNoPadSafe +.public TEAM_INFO_BOX_DEFAULT_WINDOW_PARAMS +.public TEAM_MEMBER_TABLE_PTR +.public UnloadFile +.public UpdateWindow +.public ValidateTeamMembers +.public WorldMapSetCamera +.public WorldMapSetMode +.public ZeroInitMissionRewardDataStruct .public ov10_022BCC60 .public ov10_022BCC7C .public ov10_022BCCB0 .public ov10_022BCD10 .public ov10_022BCDA8 .public ov10_022BCDBC -.public ov10_022BCDF4 .public ov10_022BD394 .public ov11_022DC504 .public ov11_022E45F4 @@ -157,11 +152,16 @@ .public ov11_022F6FA8 .public ov11_022F7188 .public ov11_022F74A0 +.public ov11_02307334 +.public ov11_02308D1C +.public ov11_02309040 +.public ov11_023090DC +.public ov11_02309DF8 +.public ov11_0230A07C .public ov11_0230CFF4 .public ov11_0230D000 .public ov11_0230D220 .public ov11_0230D71C -.public ov11_0230D92C .public ov11_0230E964 .public ov11_0230F138 .public ov11_0230F1EC @@ -255,44 +255,6 @@ .public ov11_02322C20 .public ov11_02322C38 .public ov11_02322C50 -.public ov11_02322C78 -.public ov11_02322C88 -.public ov11_02322C98 -.public ov11_02322CA8 -.public ov11_02322CB8 -.public ov11_02322CC8 -.public ov11_02322CD8 -.public ov11_02322CF0 -.public ov11_02322D10 -.public ov11_02322D38 -.public ov11_02322D60 -.public ov11_02322D88 -.public ov11_02322DB0 -.public ov11_02322DB8 -.public ov11_02322DC8 -.public ov11_02322DD0 -.public ov11_02322DE0 -.public ov11_02322DF0 -.public ov11_02322E00 -.public ov11_02322E28 -.public ov11_02322E58 -.public ov11_02322E7C -.public ov11_02322EA0 -.public ov11_02322EAC -.public ov11_02322EBC -.public ov11_02322ECC -.public ov11_02322EDC -.public ov11_02322F24 -.public ov11_02322F30 -.public ov11_02322F40 -.public ov11_02322F58 -.public ov11_02322F5C -.public ov11_02322F80 -.public ov11_02322F84 -.public ov11_02322F98 -.public ov11_02322FD4 -.public ov11_02322FE4 -.public ov11_02322FF4 .public ov11_02324D04 .public ov11_02324D08 .public ov11_02324D0C @@ -316,87 +278,29 @@ .public ov11_02324D84 .public ov11_02324D88 .public ov11_02324D8C -.public ov11_02324D90 -.public ov11_02324D94 -.public ov11_02324D98 .public ov11_0238A074 .public ov11_0238A078 .public ov11_0238A080 .public ov11_0238A084 .public ov11_0238A088 -.public PlaySeVolumeWrapper -.public PopInventoryMenuField0x1A3 -.public PreprocessString -.public PreprocessStringFromId -.public PrintBadgeMark -.public PrintIqSkillsMenu -.public RecolorNameString -.public RemoveItemNoHole -.public RemoveItemNoHoleCheck -.public ResetAttributeBitfieldLivePerformer -.public ResumeAdvancedMenu -.public ResumeParentMenu -.public ReturnScriptMenuResult -.public ReturnScriptMenuResultZero -.public SaveScriptVariableValue -.public SaveScriptVariableValueBytes -.public SetAnimDataFields2 -.public SetAreaNameBoxState3 -.public SetAttributeBitfieldLivePerformer -.public SetCollectionMenuField0x1A4 -.public SetCollectionMenuField0x1C8 -.public SetInventoryMenuState0 -.public SetInventoryMenuState6 -.public SetItemAcquired -.public SetNewFriendActor -.public SetParentMenuState7 -.public SetWindowTitle -.public ShowDialogueBox -.public ShowKeyboard -.public ShowStringIdInDialogueBox -.public ShowStringInDialogueBox -.public SortItemsInBag .public sprintf -.public strcat -.public StrcmpMonsterName .public strcpy -.public StrcpyName -.public StrcpySimple -.public StringFromId -.public StrncpyName -.public StrncpySimple -.public StrncpySimpleNoPad -.public StrncpySimpleNoPadSafe -.public sub_020037A4 .public sub_02008BA8 .public sub_0200CF6C -.public sub_0200FD48 -.public sub_02010044 -.public sub_02011420 .public sub_02017C50 -.public sub_02017C74 .public sub_02025304_JP -.public sub_020262E0 .public sub_020265A8 .public sub_02027B1C .public sub_0202810C .public sub_0202812C .public sub_020282F4 -.public sub_02028354 .public sub_0202836C -.public sub_0202A03C -.public sub_0202B030 -.public sub_0202C620 -.public sub_0202C75C -.public sub_0202D07C -.public sub_0202D0EC .public sub_0202F16C .public sub_0202F190 .public sub_0202F2C4 .public sub_0202F334 .public sub_0202F3F8 .public sub_0202F954 -.public sub_020307EC .public sub_02034840 .public sub_0203559C .public sub_02035CE4 @@ -417,70 +321,19 @@ .public sub_0203D538 .public sub_0203F150 .public sub_0203F398 -.public sub_0203F974 .public sub_0203F990 -.public sub_0203FA64 -.public sub_0203FBD4 -.public sub_0203FD14 -.public sub_0203FD2C -.public sub_0203FD38 -.public sub_0203FD80 -.public sub_0203FDEC -.public sub_0204018C -.public sub_0204019C -.public sub_020407C0 -.public sub_020407EC -.public sub_02041094 -.public sub_020410A4 -.public sub_02041154 -.public sub_02041364 -.public sub_02041394 -.public sub_02041484 -.public sub_020415BC -.public sub_02041614 -.public sub_020416FC -.public sub_020417A8 -.public sub_02041A00 -.public sub_02041A18 .public sub_02041B7C .public sub_020420F4 -.public sub_02044688 -.public sub_02044800 -.public sub_020448EC -.public sub_02046A20 -.public sub_02046B04 -.public sub_02046BA0 -.public sub_02046BE8 -.public sub_02046C30 -.public sub_02046C78 -.public sub_02046D20 -.public sub_0204707C -.public sub_020470D0 -.public sub_02047148 -.public sub_02047150 -.public sub_02047188 .public sub_02048764 .public sub_02048794 .public sub_0204CF0C -.public sub_0204E210 .public sub_02052E2C -.public sub_02053A0C -.public sub_02053CA0 -.public sub_02053D1C -.public sub_020546E8 -.public sub_02055894 .public sub_02055B20 .public sub_02055D4C .public sub_02055DD0 -.public sub_02055FCC -.public sub_02056094 .public sub_0205633C -.public sub_020564B0 .public sub_02057180 .public sub_020572EC -.public sub_020582E0 -.public sub_020586F0 -.public sub_02058794 .public sub_0205B028 .public sub_02064FFC .public sub_02065C08 @@ -494,22 +347,3 @@ .public sub_02067664 .public sub_0206A84C .public sub_0206C110 -.public SWAP_SHOP_CLUMSET_ONE_STAR_STR -.public SWAP_SHOP_CLUMSET_THREE_STAR_STR -.public SWAP_SHOP_CLUMSET_TWO_STAR_STR -.public SWAP_SHOP_INVENTORY_PTRS -.public SWAP_SHOP_ONE_STAR_STR -.public SWAP_SHOP_RED_TEXT_TAG_STR -.public SWAP_SHOP_THREE_STAR_STR -.public SWAP_SHOP_TWO_STAR_STR -.public SWAP_SHOP_UNCENTER_TEXT_TAG_STR -.public SwapShopFreeDoublePointer -.public TEAM_INFO_BOX_DEFAULT_WINDOW_PARAMS -.public TEAM_MEMBER_TABLE_PTR -.public UnloadFile -.public UpdateWindow -.public ValidateTeamMembers -.public vsprintf -.public WorldMapSetCamera -.public WorldMapSetMode -.public ZeroInitMissionRewardDataStruct diff --git a/asm/include/overlay_11_02308D1C.inc b/asm/include/overlay_11_02308D1C.inc new file mode 100644 index 00000000..5c42fc68 --- /dev/null +++ b/asm/include/overlay_11_02308D1C.inc @@ -0,0 +1,189 @@ +#pragma once +.public AppendStandardStringToMission +.public BAG_ITEMS_PTR_MIRROR +.public CheckTeamMemberIdx +.public CloseAdvancedTextBox +.public CloseCollectionMenu +.public CloseDialogueBox +.public CloseInventoryMenu +.public CloseParentMenu +.public CloseScrollBox +.public CloseSynthBin +.public CloseTextBox2 +.public CountNbItemsOfTypeInBag +.public CountNbItemsOfTypeInStorage +.public CreateAdvancedTextBox +.public CreateCollectionMenu +.public CreateDialogueBox +.public CreateMonsterSummaryFromTeamMember +.public CreateParentMenu +.public CreateParentMenuFromStringIds +.public DrawTextInWindow +.public DungeonMoveToGroundMove +.public EXCLUSIVE_ITEM_REQUIREMENTS_PTR +.public GetActiveRosterIndex +.public GetActiveTeamMember +.public GetActorMatchingStorageId +.public GetCroagunkItemTemplates +.public GetCurrentBagCapacity +.public GetDexNumber +.public GetExclusiveItemType +.public GetGameMode +.public GetInfoMoveGround +.public GetItemAtIdx +.public GetItemMoveId16 +.public GetKeyboardStatus +.public GetKeyboardStringResult +.public GetPressedButtons +.public GetSimpleMenuResult__0202AEA4 +.public GetTeamMember +.public GetWindowIdPageStart +.public GetWindowIdSelectedItemOnPage +.public GetWindowIdSelectedMenuItemIdx +.public InitMenu +.public InitMove +.public InitPreprocessorArgs +.public IsAdvancedTextBoxActive +.public IsCollectionMenuActive +.public IsCollectionMenuState3 +.public IsParentMenuActive +.public LoadSynthBin +.public MaybeGetColoredFormattedItemName +.public MaybeGetUncoloredFormattedItemName +.public MemAlloc +.public MemFree +.public MemZero +.public MemcpySimple +.public PlaySeVolumeWrapper +.public PreprocessString +.public PreprocessStringFromId +.public PrintIqSkillsMenu +.public RecolorNameString +.public ResumeParentMenu +.public SWAP_SHOP_CLUMSET_ONE_STAR_STR +.public SWAP_SHOP_CLUMSET_THREE_STAR_STR +.public SWAP_SHOP_CLUMSET_TWO_STAR_STR +.public SWAP_SHOP_INVENTORY_PTRS +.public SWAP_SHOP_ONE_STAR_STR +.public SWAP_SHOP_RED_TEXT_TAG_STR +.public SWAP_SHOP_THREE_STAR_STR +.public SWAP_SHOP_TWO_STAR_STR +.public SWAP_SHOP_UNCENTER_TEXT_TAG_STR +.public SetCollectionMenuField0x1A4 +.public SetCollectionMenuField0x1C8 +.public SetWindowTitle +.public ShowKeyboard +.public StrcmpMonsterName +.public StrcpySimple +.public StrncpySimple +.public StrncpySimpleNoPad +.public StrncpySimpleNoPadSafe +.public SwapShopFreeDoublePointer +.public UpdateWindow +.public ov11_02301174 +.public ov11_0230D000 +.public ov11_0230D220 +.public ov11_0230D92C +.public ov11_02310BDC +.public ov11_02322DB8 +.public ov11_02322DC8 +.public ov11_02322DD0 +.public ov11_02322DE0 +.public ov11_02322DF0 +.public ov11_02322E00 +.public ov11_02322E28 +.public ov11_02322E58 +.public ov11_02322E7C +.public ov11_02322EA0 +.public ov11_02322EAC +.public ov11_02322EBC +.public ov11_02322ECC +.public ov11_02322EDC +.public ov11_02322F24 +.public ov11_02322F30 +.public ov11_02322F40 +.public ov11_02322F58 +.public ov11_02322F5C +.public ov11_02322F80 +.public ov11_02322F84 +.public ov11_02322F98 +.public ov11_02322FD4 +.public ov11_02322FE4 +.public ov11_02322FF4 +.public ov11_02324D8C +.public ov11_02324D90 +.public ov11_02324D94 +.public ov11_02324D98 +.public strcat +.public strcpy +.public sub_020037A4 +.public sub_0200FD48 +.public sub_02010044 +.public sub_02011420 +.public sub_02017C50 +.public sub_02017C74 +.public sub_020262E0 +.public sub_0202810C +.public sub_0202812C +.public sub_02028354 +.public sub_0202836C +.public sub_0202A03C +.public sub_0202B030 +.public sub_0202C620 +.public sub_0202C75C +.public sub_0202D07C +.public sub_0202D0EC +.public sub_020307EC +.public sub_02037468 +.public sub_0203909C +.public sub_02039218 +.public sub_0203931C +.public sub_0203F150 +.public sub_0203F398 +.public sub_0203F974 +.public sub_0203F990 +.public sub_0203FA64 +.public sub_0203FBD4 +.public sub_0203FD14 +.public sub_0203FD38 +.public sub_0203FD80 +.public sub_0203FDEC +.public sub_0204018C +.public sub_020407C0 +.public sub_020407EC +.public sub_02041094 +.public sub_020410A4 +.public sub_02041154 +.public sub_02041364 +.public sub_02041394 +.public sub_02041484 +.public sub_020416FC +.public sub_020417A8 +.public sub_02041A00 +.public sub_02041A18 +.public sub_02041B7C +.public sub_020420F4 +.public sub_02046A20 +.public sub_02046B04 +.public sub_02046BA0 +.public sub_02046BE8 +.public sub_02046C30 +.public sub_02046C78 +.public sub_02046D20 +.public sub_0204707C +.public sub_020470D0 +.public sub_02047148 +.public sub_02047150 +.public sub_02047188 +.public sub_0204E210 +.public sub_02053A0C +.public sub_02053D1C +.public sub_020546E8 +.public sub_02055894 +.public sub_02055FCC +.public sub_02056094 +.public sub_0205633C +.public sub_020564B0 +.public sub_020586F0 +.public sub_02058794 +.public vsprintf diff --git a/asm/overlay_11_022FE5F8.s b/asm/overlay_11_022FE5F8.s index c90d406b..8cd6ef66 100644 --- a/asm/overlay_11_022FE5F8.s +++ b/asm/overlay_11_022FE5F8.s @@ -10918,6612 +10918,3 @@ ov11_02307300: ; 0x02307300 .align 2, 0 _02307330: .word ov11_02324D8C arm_func_end ov11_02307300 - - arm_func_start ov11_02307334 -ov11_02307334: ; 0x02307334 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - sub sp, sp, #0x5a0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r4, [r0] - ldr r1, [r4] - cmp r1, #0x29 - addls pc, pc, r1, lsl #2 - b _02308CF0 -_02307354: ; jump table - b _023073FC ; case 0 - b _023074B8 ; case 1 - b _02307464 ; case 2 - b _023078D4 ; case 3 - b _02308844 ; case 4 - b _02308940 ; case 5 - b _023089C0 ; case 6 - b _02308A14 ; case 7 - b _02308A54 ; case 8 - b _02308A88 ; case 9 - b _02308AB4 ; case 10 - b _02308B70 ; case 11 - b _02308BB0 ; case 12 - b _02308C4C ; case 13 - b _02308C84 ; case 14 - b _02308C90 ; case 15 - b _02308CE8 ; case 16 - b _02307A14 ; case 17 - b _02307A30 ; case 18 - b _02307C14 ; case 19 - b _02307CD0 ; case 20 - b _02307D08 ; case 21 - b _02307E68 ; case 22 - b _02307F20 ; case 23 - b _02307F58 ; case 24 - b _02307F84 ; case 25 - b _02308658 ; case 26 - b _0230871C ; case 27 - b _02308748 ; case 28 - b _023087A0 ; case 29 - b _023087D4 ; case 30 - b _023081D0 ; case 31 - b _02308214 ; case 32 - b _02308054 ; case 33 - b _023080BC ; case 34 - b _023083E0 ; case 35 - b _02308450 ; case 36 - b _02308470 ; case 37 - b _023084AC ; case 38 - b _023085C8 ; case 39 - b _02308614 ; case 40 - b _0230880C ; case 41 -_023073FC: - bl GetNbItemsInBag - ldr r2, _023082B8 ; =ov11_02307300 - add r1, r4, #0x31c - str r2, [sp] - str r1, [sp, #4] - mov r1, #0 - str r1, [sp, #8] - ldr r2, [r4, #0x10] - add r3, r4, #0x104 - bl CreateInventoryMenuOuter - ldr r2, _023082B4 ; =ov11_02324D8C - mov r1, #0 - ldr r2, [r2] - strb r0, [r2, #4] - ldr r0, _023082BC ; =ov11_02322C88 - bl CreateTextBox - ldr r1, _023082B4 ; =ov11_02324D8C - mvn r3, #0 - ldr r4, [r1] - mov r2, #1 - strb r0, [r4, #5] - ldr r0, [r1] - str r3, [r0, #0x18] - ldr r0, [r1] - str r2, [r0] - b _02308CF0 -_02307464: - bl IsBagNotEmpty - cmp r0, #0 - bne _02307494 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl SetInventoryMenuState6 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0xc - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02307494: - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl ov10_022BCC7C - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #1 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_023074B8: - add r1, sp, #0xe - mov r0, #0 - bl GetPressedButtons - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl PopInventoryMenuField0x1A3 - ldrh r1, [sp, #0xe] - tst r1, #4 - bne _023074EC - tst r1, #0x800 - cmpeq r0, #0 - beq _02307548 -_023074EC: - cmp r0, #0 - bne _023074FC - mov r0, #5 - bl PlaySeVolumeWrapper -_023074FC: - bl SortItemsInBag - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0 - ldr r0, [r0] - str r1, [r0, #0x10] - bl GetNbItemsInBag - ldr r2, _023082B4 ; =ov11_02324D8C - mov r1, r0 - ldr r0, [r2] - ldrsb r0, [r0, #4] - bl ov10_022BCC60 - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r2, #0 - ldr r1, [r0] - str r2, [r1, #0x18] - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl ov10_022BCCB0 - b _02308CF0 -_02307548: - ldr r1, _023082B4 ; =ov11_02324D8C - mvn r0, #1 - ldr r1, [r1] - ldrsb r5, [r1, #5] - cmp r5, r0 - beq _0230760C - ldrsb r0, [r1, #4] - bl ov10_022BCDA8 - ldr r1, _023082B4 ; =ov11_02324D8C - mov r4, r0 - ldr r0, [r1] - ldr r0, [r0, #0x18] - cmp r0, r4 - beq _0230760C - mov r0, r4, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetItemAtIdx - ldr r1, _023082B4 ; =ov11_02324D8C - mov r6, r0 - ldr r1, [r1] - mov r0, r5 - str r4, [r1, #0x18] - bl sub_02027B1C - ldrb r0, [r6] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _023075E4 - ldrsh r0, [r6, #4] -#if defined(EUROPE) - add r0, r0, #0x4b - add r0, r0, #0x2f00 -#elif defined(JAPAN) - add r0, r0, #0x41 - add r0, r0, #0x1d00 -#else - add r0, r0, #0x49 - add r0, r0, #0x2f00 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bl StringFromId - mov r1, r0 - add r0, sp, #0x20 - bl strcpy - b _023075F0 -_023075E4: - ldr r1, _023082C0 ; =ov11_02322DB0 - add r0, sp, #0x20 - bl strcpy -_023075F0: - mov r1, #2 - add r3, sp, #0x20 - mov r0, r5 - mov r2, r1 - bl DrawTextInWindow - mov r0, r5 - bl UpdateWindow -_0230760C: - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl IsInventoryMenuActive - cmp r0, #0 - bne _02307840 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl ov10_022BCDBC - cmp r0, #0 - blt _0230781C - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r2, [r1] - str r0, [r2, #0x10] - ldr r0, [r1] - ldr r0, [r0, #0x10] - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetItemAtIdx - ldr r1, _023082B4 ; =ov11_02324D8C - mov r4, r0 - ldr r0, [r1] - ldrsh r1, [r4, #4] - add r0, r0, #0x200 - strh r1, [r0, #0x4e] - ldrb r0, [r4] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - ldrne r0, _023082B4 ; =ov11_02324D8C - ldrnesh r1, [r4, #4] - ldreq r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - moveq r1, #0 - add r0, r0, #0x200 - strh r1, [r0, #0x4e] - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - add r0, r0, #0x200 - ldrsh r0, [r0, #0x4e] - bl GetItemCategoryVeneer - mov r5, r0 - bl GetGameMode - mov r6, r0 - cmp r5, #5 - bne _0230777C - cmp r6, #4 - cmpne r6, #5 - beq _0230777C - mov sb, #0 - mov r8, sb - mov r7, #3 - ldr r6, _023082C4 ; =ov11_02322D38 - ldr r5, _023082B4 ; =ov11_02324D8C - ldr r4, _023082C8 ; =0x000002B6 - b _02307734 -_023076F4: - ldr r0, [r5] - cmp r1, r4 - add r0, r0, sb - strb r8, [r0, #0x276] - bne _02307728 - ldr r0, [r5] - add r0, r0, #0x200 - ldrsh r0, [r0, #0x4e] - bl ov11_02309E48 - cmp r0, #0 - ldreq r0, [r5] - addeq r0, r0, sb - streqb r7, [r0, #0x276] -_02307728: - add r0, sb, #1 - mov r0, r0, lsl #0x10 - mov sb, r0, asr #0x10 -_02307734: - mov r0, sb, lsl #3 - ldrh r1, [r6, r0] - cmp r1, #0 - bne _023076F4 - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r0, _023082CC ; =ov11_02322CB8 - ldr r2, [r1] - ldr r1, _023082D0 ; =0x00400213 - add r2, r2, #0x76 - add r4, r2, #0x200 - add r2, sp, #0x470 - mov r3, r6 - str r4, [sp, #0x4d0] - bl CreateParentMenuFromStringIds - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r1, [r1] - strb r0, [r1, #6] - b _02307808 -_0230777C: - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - add r0, r0, #0x200 - ldrsh r0, [r0, #0x4e] - bl IsGummi - cmp r0, #0 - cmpne r6, #4 - cmpne r6, #5 - ldr r1, _023082D4 ; =0x00400013 - beq _023077C4 - ldr r0, _023082CC ; =ov11_02322CB8 - ldr r3, _023082D8 ; =ov11_02322D88 - mov r2, #0 - bl CreateParentMenuFromStringIds - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r1, [r1] - strb r0, [r1, #6] - b _02307808 -_023077C4: - ldrb r0, [r4, #1] - mov r2, #0 - cmp r0, #0 - beq _023077F0 - ldr r0, _023082DC ; =ov11_02322CA8 - ldr r3, _023082E0 ; =ov11_02322D10 - bl CreateParentMenuFromStringIds - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r1, [r1] - strb r0, [r1, #6] - b _02307808 -_023077F0: - ldr r0, _023082DC ; =ov11_02322CA8 - ldr r3, _023082E4 ; =ov11_02322D60 - bl CreateParentMenuFromStringIds - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r1, [r1] - strb r0, [r1, #6] -_02307808: - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #3 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_0230781C: - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl ov10_022BCD10 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0xe - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02307840: - add r1, sp, #0xc - mov r0, #0 - bl GetPressedButtons - ldrh r0, [sp, #0xc] - tst r0, #8 - beq _02308CF0 - mov r0, #0 - bl PlaySeVolumeWrapper - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl ov10_022BCDF4 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl ov10_022BCDA8 - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r2, [r1] - str r0, [r2, #0x10] - ldr r0, [r1] - ldrsb r0, [r0, #5] - bl CloseTextBox2 - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r2, #1 - ldr r1, [r0] - strb r2, [r1, #5] - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl CloseInventoryMenu - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r3, #1 - ldr r2, [r0] - mov r1, #0xa - strb r3, [r2, #4] - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_023078D4: - ldrsb r0, [r4, #6] - bl IsParentMenuActive - cmp r0, #0 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #6] - bl GetSimpleMenuResult__0202AEA4 - cmp r0, #8 - beq _023079E4 - ldr r1, _023082B4 ; =ov11_02324D8C - cmp r0, #0 - ldr r1, [r1] - str r0, [r1, #0x14] - bne _02307928 - bl ov11_02308D48 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #7 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02307928: - cmp r0, #1 - bne _02307948 - bl ov11_02308D48 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #9 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02307948: - cmp r0, #2 - bne _0230798C - add r2, sp, #0x500 - mov r4, #5 - ldr r0, _023082E8 ; =ov11_02322C98 - ldr r3, _023082EC ; =ov11_02322CD8 - add r2, r2, #8 - mov r1, #0x33 - str r4, [sp, #0x508] - bl CreateParentMenuFromStringIds - ldr r1, _023082B4 ; =ov11_02324D8C - mov r2, #4 - ldr r3, [r1] - strb r0, [r3, #7] - ldr r0, [r1] - str r2, [r0] - b _02308CF0 -_0230798C: - cmp r0, #6 - bne _023079AC - bl ov11_02308D48 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x11 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_023079AC: - cmp r0, #7 - bne _023079CC - bl ov11_02308D48 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x18 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_023079CC: - bl ov11_02308D48 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0xa - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_023079E4: - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #6] - bl CloseParentMenu - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r3, #1 - ldr r2, [r0] - mov r1, #2 - strb r3, [r2, #6] - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02307A14: - mov r0, #1 - bl ov11_02309040 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x12 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02307A30: - bl ov11_023090DC - cmp r0, #0 - beq _02308CF0 - bl ov11_02309E24 - mvn r1, #0 - cmp r0, r1 - beq _02307BFC - ldr r1, _023082B4 ; =ov11_02324D8C - add r0, sp, #0x18 - ldr r4, [r1] - add r5, r4, #0x238 - bl ov11_02309DAC - add r1, sp, #0x18 - mov r0, r5 - bl ov11_02308F4C - ldr r2, [r5, #0x10] - ldr r0, _023082B4 ; =ov11_02324D8C - ldrsh r1, [r5, #8] - ldr r0, [r0] - ldrsh r2, [r2] - add r0, r0, #0x280 - bl GetLearnableIqSkills - ldr r1, _023082B4 ; =ov11_02324D8C - mvn r2, #0 - ldr r3, [r1] - str r0, [r3, #0x30c] - ldr r0, [r1] - add r0, r0, #0x200 - strh r2, [r0, #0x50] - ldr r2, [r5, #0x10] - ldr r0, [r1] - ldrsh r2, [r2] - str r2, [r0, #0x318] - ldr r6, [r1] - ldr r1, [r4, #0x238] - add r0, r6, #0x200 - cmp r1, #0 - ldrsh r4, [r0, #0x4e] - bne _02307AE8 - ldrsh r0, [r5, #4] - bl GetTeamMember - mov r1, r4 - add r3, r6, #0x250 - mov r2, #1 - bl ApplyGummiBoostsToGroundMonster - b _02307B08 -_02307AE8: - cmp r1, #1 - bne _02307B08 - ldrsh r0, [r5, #4] - bl GetActiveTeamMember - mov r1, r4 - add r3, r6, #0x250 - mov r2, #1 - bl ApplyGummiBoostsToTeamMember -_02307B08: - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r1, [r5, #0x10] - ldr r2, [r0] - ldrsh r0, [r1] - ldr r1, [r2, #0x318] - sub r0, r1, r0 - str r0, [r2, #0x318] - bl ov11_022DC504 - ldr r0, [r5] - cmp r0, #1 - bne _02307B3C - ldrsh r0, [r5, #4] - bl sub_02058794 -_02307B3C: - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r2, [r5, #0x10] - ldr r0, [r0] - ldrsh r1, [r5, #8] - add r0, r0, #0xc5 - ldrsh r2, [r2] - add r0, r0, #0x200 - bl GetLearnableIqSkills - ldr r1, _023082B4 ; =ov11_02324D8C - mov r2, #1 - ldr r3, [r1] - str r0, [r3, #0x310] - ldr r0, [r1] - str r2, [r0, #0x314] - ldr r0, [r1] - add r0, r0, #0x200 - ldrsh r4, [r0, #0x50] - bl ov11_02308EDC - cmp r4, #0 - blt _02307BCC - cmp r4, #3 - bgt _02307BCC - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldr r0, [r0, #0x10] - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - bl RemoveItemNoHoleCheck - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r3, #0 - ldr r2, [r0] - mov r1, #0x13 - str r3, [r2, #0x18] - ldr r0, [r0] - str r1, [r0] - b _02307C0C -_02307BCC: - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r2, _023082F0 ; =0x000002BE - ldr r3, [r0] - mov r1, #0x18 - ldrsb r0, [r3, #8] - add r3, r3, #0xb4 - bl ShowStringIdInDialogueBox - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0xd - ldr r0, [r0] - str r1, [r0] - b _02307C0C -_02307BFC: - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0 - ldr r0, [r0] - str r1, [r0] -_02307C0C: - bl ov11_02309DF8 - b _02308CF0 -_02307C14: - add r0, r4, #0x200 - ldrsh r1, [r0, #0x50] - cmp r1, #3 - addls pc, pc, r1, lsl #2 - b _02307C58 -_02307C28: ; jump table - b _02307C38 ; case 0 - b _02307C40 ; case 1 - b _02307C48 ; case 2 - b _02307C50 ; case 3 -_02307C38: - ldr r5, _023082F4 ; =0x000002B9 - b _02307C5C -_02307C40: - ldr r5, _023082F8 ; =0x000002BA - b _02307C5C -_02307C48: - ldr r5, _023082FC ; =0x000002BB - b _02307C5C -_02307C50: -#ifdef JAPAN - ldr r5, _02309898 ; =0x00002FDC -#else - mov r5, #0x2bc -#endif - b _02307C5C -_02307C58: - mov r5, #0 -_02307C5C: - ldr r0, [r4, #0x318] - cmp r0, #0 - bne _02307C78 - cmp r1, #0 - blt _02307C78 - cmp r1, #3 - ldrle r5, _02308300 ; =0x000002BD -_02307C78: - cmp r5, #0 - moveq r0, #0x10 - streq r0, [r4] - beq _02308CF0 - add r0, r4, #0x238 - bl ov11_0230901C - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r1, [r1] - str r0, [r1, #0xb4] - bl ov11_02308EDC - ldr r0, _023082B4 ; =ov11_02324D8C - mov r2, r5 - ldr r3, [r0] - mov r1, #0x18 - ldrsb r0, [r3, #8] - add r3, r3, #0xb4 - bl ShowStringIdInDialogueBox - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x14 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02307CD0: - ldrsb r0, [r4, #8] - bl IsDialogueBoxActive - cmp r0, #0 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #8] - bl ShowDialogueBox - bl ov11_02308F14 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x15 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02307D08: - mov r2, #1 - mov r1, #0 - mov r0, r2 - mov r3, r1 -_02307D18: - ldr r6, _023082B4 ; =ov11_02324D8C - mov r5, r3 - ldr ip, [r6] - mov r6, r3 - mov sb, r3 - ldr lr, [ip, #0x30c] - b _02307D50 -_02307D34: - add r7, ip, sb - ldrb r7, [r7, #0x280] - ldr r8, [ip, #0x314] - cmp r8, r7 - moveq r5, r2 - beq _02307D58 - add sb, sb, #1 -_02307D50: - cmp sb, lr - blt _02307D34 -_02307D58: - ldr r8, _023082B4 ; =ov11_02324D8C - mov r7, r1 - ldr ip, [r8] - ldr lr, [ip, #0x310] - b _02307D88 -_02307D6C: - add r8, ip, r7 - ldrb r8, [r8, #0x2c5] - ldr sb, [ip, #0x314] - cmp sb, r8 - moveq r6, r0 - beq _02307D90 - add r7, r7, #1 -_02307D88: - cmp r7, lr - blt _02307D6C -_02307D90: - cmp r5, r6 - beq _02307E2C - add r0, r4, #0x238 - bl ov11_0230901C - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r2, [r1] - str r0, [r2, #0xb4] - ldr r2, [r1] - mov r0, #4 - ldr r1, [r2, #0x314] - str r1, [r2, #0xc4] - bl sub_02017C50 - bl ov11_02308EDC - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r2, _02308304 ; =0x000002BF - ldr r3, [r0] - mov r1, #0x18 - ldrsb r0, [r3, #8] - add r3, r3, #0xb4 - bl ShowStringIdInDialogueBox - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r1, [r0] - ldr r0, [r1, #0x244] - ldr r1, [r1, #0x314] - and r1, r1, #0xff - bl EnableIqSkill - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - add r0, r0, #0x238 - bl ov11_02308FD0 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x14 - ldr r3, [r0] - ldr r2, [r3, #0x314] - add r2, r2, #1 - str r2, [r3, #0x314] - ldr r0, [r0] - str r1, [r0] - b _02307E4C -_02307E2C: - ldr r6, [r4, #0x314] - ldr r5, _023082B4 ; =ov11_02324D8C - add r6, r6, #1 - str r6, [r4, #0x314] - ldr r4, [r5] - ldr r5, [r4, #0x314] - cmp r5, #0x45 - blt _02307D18 -_02307E4C: - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r1, [r0] - ldr r0, [r1, #0x314] - cmp r0, #0x45 - movge r0, #0x16 - strge r0, [r1] - b _02308CF0 -_02307E68: - add r0, r4, #0x200 - ldrh r0, [r0, #0x52] - cmp r0, #8 - addls pc, pc, r0, lsl #2 - b _02307EC8 -_02307E7C: ; jump table - b _02307EA0 ; case 0 - b _02307EA8 ; case 1 - b _02307EB0 ; case 2 - b _02307EC8 ; case 3 - b _02307EB8 ; case 4 - b _02307EC8 ; case 5 - b _02307EC8 ; case 6 - b _02307EC8 ; case 7 - b _02307EC0 ; case 8 -_02307EA0: - mov r0, #0 - b _02307ECC -_02307EA8: - ldr r0, _02308308 ; =0x000002C1 - b _02307ECC -_02307EB0: - ldr r0, _0230830C ; =0x000002C2 - b _02307ECC -_02307EB8: - ldr r0, _02308310 ; =0x000002C3 - b _02307ECC -_02307EC0: -#ifdef JAPAN - ldr r0, _023098B0 ; =0x00002FE4 - b _02307ECC -_02307EC8: - ldr r0, _023098B4 ; =0x00002FE0 -#else - mov r0, #0x2c4 - b _02307ECC -_02307EC8: - mov r0, #0x2c0 -#endif -_02307ECC: - cmp r0, #0 - moveq r0, #0x10 - streq r0, [r4] - beq _02308CF0 - bl ov11_02308EDC - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r2, _02308304 ; =0x000002BF - ldr r3, [r0] - mov r1, #0x18 - ldrsb r0, [r3, #8] - add r3, r3, #0xb4 - bl ShowStringIdInDialogueBox - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x17 - ldr r3, [r0] - ldr r2, [r3, #0x314] - add r2, r2, #1 - str r2, [r3, #0x314] - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02307F20: - ldrsb r0, [r4, #8] - bl IsDialogueBoxActive - cmp r0, #0 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #8] - bl ShowDialogueBox - bl ov11_02308F14 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x10 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02307F58: - ldr r0, [r4, #0x10] - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetItemAtIdx - ldrsh r0, [r0, #4] - bl ov11_02309084 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x19 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02307F84: - bl ov11_023090DC - cmp r0, #0 - beq _02308CF0 - bl ov11_02309E24 - mvn r1, #0 - cmp r0, r1 - beq _0230803C - ldr r1, _023082B4 ; =ov11_02324D8C - add r0, sp, #0x10 - ldr r4, [r1] - bl ov11_02309DAC - add r1, sp, #0x10 - add r0, r4, #0x238 - bl ov11_02308F4C - add r0, r4, #0x238 - bl ov11_02308FEC - bl sub_020415BC - cmp r0, #0 - ldrne r0, _023082B4 ; =ov11_02324D8C - movne r1, #0x1d - ldrne r0, [r0] - strne r1, [r0] - bne _0230804C - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldr r0, [r0, #0x10] - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetItemAtIdx - mov r4, r0 - ldrsh r0, [r4, #4] - bl IsHM - cmp r0, #0 - bne _02308028 - ldrsh r2, [r4, #4] - mov r0, r4 - mov r1, #0xbb - sub r2, r2, #0xbc - strh r2, [r4, #2] - strh r1, [r4, #4] - bl SetItemAcquired -_02308028: - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x1a - ldr r0, [r0] - str r1, [r0] - b _0230804C -_0230803C: - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0 - ldr r0, [r0] - str r1, [r0] -_0230804C: - bl ov11_02309DF8 - b _02308CF0 -_02308054: - add r0, r4, #0x200 - ldrsh r2, [r0, #0x40] - ldrb r3, [r4, #0x242] - add r0, r4, #0x328 - mov r1, #2 - bl sub_02053CA0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - add r0, r0, #0x200 - ldrsh r0, [r0, #0x4e] - bl GetItemMoveId16 - bl sub_0203FD14 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0 - ldr r0, [r0] - mov r2, r1 - add r3, r0, #0x328 - mov r0, #6 - bl sub_0204019C - ldr r1, _023082B4 ; =ov11_02324D8C - mov r2, #0x22 - ldr r3, [r1] - strb r0, [r3, #0xa] - ldr r0, [r1] - str r2, [r0] - b _02308CF0 -_023080BC: - bl sub_020407EC - cmp r0, #1 - beq _023080F0 - cmp r0, #2 - beq _023080DC - cmp r0, #7 - beq _02308124 - b _02308CF0 -_023080DC: - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x1f - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_023080F0: - bl sub_020407C0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #0xa] - bl CloseAdvancedTextBox - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r3, #1 - ldr r2, [r0] - mov r1, #0x18 - strb r3, [r2, #0xa] - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02308124: - bl sub_02041094 - cmp r0, #4 - bge _02308168 - bl sub_0203FD38 - ldr r2, _023082B4 ; =ov11_02324D8C - mov r1, r0 - ldr r0, [r2] - mov r2, #0x20 - add r0, r0, #0x56 - add r0, r0, #0x200 - bl memcpy - bl sub_02041094 - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r1, [r1] - add r1, r1, #0x200 - strh r0, [r1, #0x54] - b _0230819C -_02308168: - bl sub_0203FD2C - ldr r2, _023082B4 ; =ov11_02324D8C - mov r1, r0 - ldr r0, [r2] - mov r2, #8 - add r0, r0, #0x56 - add r0, r0, #0x200 - bl memcpy - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r1, #0 - ldr r0, [r0] - add r0, r0, #0x200 - strh r1, [r0, #0x54] -_0230819C: - bl sub_020407C0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #0xa] - bl CloseAdvancedTextBox - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r3, #1 - ldr r2, [r0] - mov r1, #0x27 - strb r3, [r2, #0xa] - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_023081D0: - mov r1, #1 - str r1, [r4, #0x1c] - mov r1, #3 - str r1, [sp] - ldr r1, [r0] - ldr r0, _02308314 ; =ov11_02322CC8 - ldr r3, _02308318 ; =ov11_02322CF0 - add r2, r1, #0x1c - mov r1, #0x33 - bl CreateSimpleMenuFromStringIds - ldr r1, _023082B4 ; =ov11_02324D8C - mov r2, #0x20 - ldr r3, [r1] - strb r0, [r3, #0xc] - ldr r0, [r1] - str r2, [r0] - b _02308CF0 -_02308214: - ldrsb r0, [r4, #0xc] - bl IsSimpleMenuActive - cmp r0, #0 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #0xc] - bl GetSimpleMenuResult__0202B870 - ldr r1, _023082B4 ; =ov11_02324D8C - mov r4, r0 - ldr r0, [r1] - ldrsb r0, [r0, #0xc] - bl CloseSimpleMenu - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - cmp r4, #0 - strb r1, [r0, #0xc] - beq _02308274 - cmp r4, #1 - beq _0230831C - cmp r4, #2 - beq _023083C8 - b _02308CF0 -_02308274: - bl sub_02041094 - ldr r2, _023082B4 ; =ov11_02324D8C - ldr r1, [r2] - add r1, r1, #0x200 - strh r0, [r1, #0x4c] - ldr r0, [r2] - ldrsb r0, [r0, #0xa] - bl CloseAdvancedTextBox - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r3, #1 - ldr r2, [r0] - mov r1, #0x23 - strb r3, [r2, #0xa] - ldr r0, [r0] - str r1, [r0] - b _02308CF0 - .align 2, 0 -#ifdef JAPAN -#define OV11_02307334_OFFSET 0x2D20 -#else -#define OV11_02307334_OFFSET 0 -#endif -_023082B4: .word ov11_02324D8C -_023082B8: .word ov11_02307300 -_023082BC: .word ov11_02322C88 -_023082C0: .word ov11_02322DB0 -_023082C4: .word ov11_02322D38 -_023082C8: .word 0x000002B6 + OV11_02307334_OFFSET -_023082CC: .word ov11_02322CB8 -_023082D0: .word 0x00400213 -_023082D4: .word 0x00400013 -_023082D8: .word ov11_02322D88 -_023082DC: .word ov11_02322CA8 -_023082E0: .word ov11_02322D10 -_023082E4: .word ov11_02322D60 -_023082E8: .word ov11_02322C98 -_023082EC: .word ov11_02322CD8 -_023082F0: .word 0x000002BE + OV11_02307334_OFFSET -_023082F4: .word 0x000002B9 + OV11_02307334_OFFSET -_023082F8: .word 0x000002BA + OV11_02307334_OFFSET -_023082FC: .word 0x000002BB + OV11_02307334_OFFSET -#ifdef JAPAN -_02309898: .word 0x00002FDC -#endif -_02308300: .word 0x000002BD + OV11_02307334_OFFSET -_02308304: .word 0x000002BF + OV11_02307334_OFFSET -_02308308: .word 0x000002C1 + OV11_02307334_OFFSET -_0230830C: .word 0x000002C2 + OV11_02307334_OFFSET -_02308310: .word 0x000002C3 + OV11_02307334_OFFSET -#ifdef JAPAN -_023098B0: .word 0x00002FE4 -_023098B4: .word 0x00002FE0 -#endif -_02308314: .word ov11_02322CC8 -_02308318: .word ov11_02322CF0 -_0230831C: - bl sub_02041094 - cmp r0, #4 - bge _02308360 - bl sub_0203FD38 - ldr r2, _023082B4 ; =ov11_02324D8C - mov r1, r0 - ldr r0, [r2] - mov r2, #0x20 - add r0, r0, #0x56 - add r0, r0, #0x200 - bl memcpy - bl sub_02041094 - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r1, [r1] - add r1, r1, #0x200 - strh r0, [r1, #0x54] - b _02308394 -_02308360: - bl sub_0203FD2C - ldr r2, _023082B4 ; =ov11_02324D8C - mov r1, r0 - ldr r0, [r2] - mov r2, #8 - add r0, r0, #0x56 - add r0, r0, #0x200 - bl memcpy - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r1, #0 - ldr r0, [r0] - add r0, r0, #0x200 - strh r1, [r0, #0x54] -_02308394: - bl sub_020407C0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #0xa] - bl CloseAdvancedTextBox - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r3, #1 - ldr r2, [r0] - mov r1, #0x27 - strb r3, [r2, #0xa] - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_023083C8: - bl sub_020416FC - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x22 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_023083E0: - add r0, r4, #0x200 - ldrsh r0, [r0, #0x4c] - bl sub_02041154 - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r4, _02308CFC ; =0x000008D7 - ldr r2, [r1] - str r0, [r2, #0xc4] - ldr r0, [r1] - add r0, r0, #0x200 - ldrsh r0, [r0, #0x4c] - cmp r0, #3 - bge _0230841C - bl sub_02041364 - cmp r0, #0 - subne r4, r4, #1 -_0230841C: - bl ov11_02308EDC - ldr r0, _023082B4 ; =ov11_02324D8C - mov r2, r4 - ldr r3, [r0] - mov r1, #0x18 - ldrsb r0, [r3, #8] - add r3, r3, #0xb4 - bl ShowStringIdInDialogueBox - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x24 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02308450: - ldrsb r0, [r4, #8] - bl IsDialogueBoxActive - cmp r0, #0 - ldreq r0, _023082B4 ; =ov11_02324D8C - moveq r1, #0x25 - ldreq r0, [r0] - streq r1, [r0] - b _02308CF0 -_02308470: - add r2, sp, #0x500 - mov r4, #5 - ldr r3, _023082EC ; =ov11_02322CD8 - add r2, r2, #8 - mov r0, #0 - mov r1, #0x33 - str r4, [sp, #0x508] - bl CreateParentMenuFromStringIds - ldr r1, _023082B4 ; =ov11_02324D8C - mov r2, #0x26 - ldr r3, [r1] - strb r0, [r3, #7] - ldr r0, [r1] - str r2, [r0] - b _02308CF0 -_023084AC: - ldrsb r0, [r4, #7] - bl IsParentMenuActive - cmp r0, #0 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #7] - bl GetSimpleMenuResult__0202AEA4 - cmp r0, #4 - bne _02308570 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldr r0, [r0, #0x10] - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetItemAtIdx - mov r4, r0 - ldrsh r0, [r4, #4] - bl IsHM - cmp r0, #0 - bne _0230852C - ldrb r0, [r4, #1] - cmp r0, #0 - beq _02308510 - bl sub_020582E0 -_02308510: - ldrsh r2, [r4, #4] - mov r0, r4 - mov r1, #0xbb - sub r2, r2, #0xbc - strh r2, [r4, #2] - strh r1, [r4, #4] - bl SetItemAcquired -_0230852C: - ldr r0, _023082B4 ; =ov11_02324D8C - mov r2, #0x1a - ldr r1, [r0] - str r2, [r1] - ldr r1, [r0] - add r0, r1, #0x200 - ldrsh r0, [r0, #0x4c] - cmp r0, #4 - movge r0, #0x1b - strge r0, [r1] - bge _02308594 - bl sub_02041484 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x1a - ldr r0, [r0] - str r1, [r0] - b _02308594 -_02308570: - bl sub_020407C0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - add r0, r0, #0x238 - bl ov11_02308FEC - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x21 - ldr r0, [r0] - str r1, [r0] -_02308594: - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #7] - bl CloseParentMenu - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r2, #1 - ldr r1, [r0] - strb r2, [r1, #7] - ldr r0, [r0] - ldrsb r0, [r0, #8] - bl ShowDialogueBox - bl ov11_02308F14 - b _02308CF0 -_023085C8: - add r0, r4, #0x200 - ldrsh r0, [r0, #0x54] - mov r3, #1 - cmp r0, #0 - movlt r2, #0 - movge r2, r0 - cmp r0, #0 - movlt r1, #1 - add r0, r4, #0x56 - movge r1, #4 - add r0, r0, #0x200 - bl sub_020417A8 - ldr r1, _023082B4 ; =ov11_02324D8C - mov r2, #0x28 - ldr r3, [r1] - strb r0, [r3, #0xb] - ldr r0, [r1] - str r2, [r0] - b _02308CF0 -_02308614: - ldrsb r0, [r4, #0xb] - bl IsScrollBoxActive - cmp r0, #0 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #0xb] - bl CloseScrollBox - bl sub_02041A00 - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r3, #1 - ldr r2, [r0] - mov r1, #0x21 - strb r3, [r2, #0xb] - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02308658: - add r0, r4, #0x200 - ldrsh r0, [r0, #0x4e] - bl GetItemMoveId16 - mov r4, r0 - ldr r0, _02308D00 ; =0x0000131B - mov r1, #0x100 - bl sub_02017C74 - mov r0, r4 - bl sub_02041614 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r1, [r0] - ldr r0, [r1, #0x238] - add r1, r1, #0x238 - cmp r0, #0 - bne _023086A0 - ldrsh r0, [r1, #4] - bl sub_0203FD80 - b _023086B0 -_023086A0: - cmp r0, #1 - bne _023086B0 - ldrsh r0, [r1, #4] - bl sub_0203FDEC -_023086B0: - bl sub_020407C0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r1, [r0] - str r4, [r1, #0xc4] - ldr r0, [r0] - add r0, r0, #0x238 - bl ov11_02308DD8 - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r1, [r1] - str r0, [r1, #0xec] - bl ov11_02308EDC - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r2, _02308D04 ; =0x00000F23 - ldr r3, [r0] - mov r1, #0x18 - ldrsb r0, [r3, #8] - add r3, r3, #0xb4 - bl ShowStringIdInDialogueBox - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - add r0, r0, #0x238 - bl ov11_02308FD0 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x29 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_0230871C: - bl sub_020407C0 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x1c - ldr r0, [r0] - str r1, [r0] - bl sub_020037A4 - ldr r1, _023082B4 ; =ov11_02324D8C - add r2, r0, #0xa - ldr r0, [r1] - str r2, [r0, #0x32c] - b _02308CF0 -_02308748: - bl sub_020037A4 - ldr r1, [r4, #0x32c] - cmp r0, r1 - ble _02308CF0 - add r0, r4, #0x238 - bl ov11_02308DD8 - ldr r1, _023082B4 ; =ov11_02324D8C - ldr r1, [r1] - str r0, [r1, #0xec] - bl ov11_02308EDC - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r2, _02308D08 ; =0x00000F24 - ldr r3, [r0] - mov r1, #0x18 - ldrsb r0, [r3, #8] - add r3, r3, #0xb4 - bl ShowStringIdInDialogueBox - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x29 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_023087A0: - bl ov11_02308EDC - ldr r0, _023082B4 ; =ov11_02324D8C -#ifdef JAPAN - ldr r2, _0230A2B0_JP ; =0x0000248F - ldr r0, [r0] - mov r1, #0x18 -#else - mov r1, #0x18 - ldr r0, [r0] - add r2, r1, #0xf10 -#endif - ldrsb r0, [r0, #8] - mov r3, #0 - bl ShowStringIdInDialogueBox - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x1e - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_023087D4: - ldrsb r0, [r4, #8] - bl IsDialogueBoxActive - cmp r0, #0 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #8] - bl ShowDialogueBox - bl ov11_02308F14 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x21 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_0230880C: - ldrsb r0, [r4, #8] - bl IsDialogueBoxActive - cmp r0, #0 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #8] - bl ShowDialogueBox - bl ov11_02308F14 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02308844: - ldrsb r0, [r4, #7] - bl IsParentMenuActive - cmp r0, #0 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #7] - bl GetSimpleMenuResult__0202AEA4 - ldr r1, _023082B4 ; =ov11_02324D8C - mov r3, #2 - ldr r2, [r1] - cmp r0, #8 - str r3, [r2] - beq _02308900 - cmp r0, #4 - bne _02308900 - ldr r3, [r1] - mov r2, #0 - add r0, r3, #0x200 - ldrsh r0, [r0, #0x4e] - str r0, [r3, #0xc4] - ldr r0, [r1] - str r2, [r0, #0xd8] - ldr r0, [r1] - ldr r0, [r0, #0x10] - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - bl RemoveItemNoHoleCheck - bl ov11_022DC504 - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r1, #0 - ldr r0, [r0] - str r1, [r0, #0x18] - bl GetNbItemsInBag - ldr r2, _023082B4 ; =ov11_02324D8C - mov r1, r0 - ldr r0, [r2] - ldrsb r0, [r0, #4] - bl ov10_022BCC60 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl SetInventoryMenuState6 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #5 - ldr r0, [r0] - str r1, [r0] -_02308900: - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #7] - bl CloseParentMenu - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r2, #1 - ldr r1, [r0] - strb r2, [r1, #7] - ldr r0, [r0] - ldrsb r0, [r0, #6] - bl CloseParentMenu - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #6] - b _02308CF0 -_02308940: - ldrsb r0, [r4, #4] - bl IsInventoryMenuActive - cmp r0, #0 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #5] - bl CloseTextBox2 - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r2, #1 - ldr r1, [r0] - strb r2, [r1, #5] - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl CloseInventoryMenu - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #4] - bl ov11_02308EDC - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r2, _02308D0C ; =0x000002CB - ldr r3, [r0] - mov r1, #0x18 - ldrsb r0, [r3, #8] - add r3, r3, #0xb4 - bl ShowStringIdInDialogueBox - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #6 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_023089C0: - ldrsb r0, [r4, #8] - bl IsDialogueBoxActive - cmp r0, #0 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #8] - bl ShowDialogueBox - bl IsBagNotEmpty - cmp r0, #0 - ldreq r0, _023082B4 ; =ov11_02324D8C - moveq r1, #0xc - ldreq r0, [r0] - streq r1, [r0] - beq _02308CF0 - bl ov11_02308F14 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02308A14: - mov r2, #0 - str r2, [sp] - str r2, [sp, #4] - ldr r0, [r4, #0x10] - mov r3, r2 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - mov r1, #2 - bl sub_02044688 - ldr r1, _023082B4 ; =ov11_02324D8C - mov r2, #8 - ldr r3, [r1] - str r0, [r3, #0x324] - ldr r0, [r1] - str r2, [r0] - b _02308CF0 -_02308A54: - ldr r0, [r4, #0x324] - bl sub_02044800 - cmp r0, #1 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - add r0, r0, #0x324 - bl sub_020448EC - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02308A88: - ldr r0, [r4, #0x10] - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetItemAtIdx - ldrb r0, [r0, #1] - bl sub_020582E0 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02308AB4: - ldr r0, [r4, #0x10] - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetItemAtIdx - mov r4, r0 - ldrb r0, [r4] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - ldrne r0, _023082B4 ; =ov11_02324D8C - ldrnesh r1, [r4, #4] - ldreq r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - moveq r1, #0 - add r0, r0, #0x200 - strh r1, [r0, #0x4e] - add r0, sp, #0x420 - bl InitPreprocessorArgs - ldr r0, _023082B4 ; =ov11_02324D8C - add r6, sp, #0x420 - ldr r1, [r0] - ldr r0, _02308D10 ; =ov11_02322C78 - add r5, r1, #0x200 - ldrsh r2, [r5, #0x4e] - ldr r1, _02308D14 ; =0x00001013 - ldr r3, _02308D18 ; =0x000008E4 - str r2, [sp, #0x430] - ldrh r4, [r4, #2] - mov r2, #0 - add r4, r4, #0xbc - str r4, [sp, #0x438] - str r6, [sp] - ldrsh r4, [r5, #0x4e] -#if defined(EUROPE) - add r4, r4, #0xd3 - add r4, r4, #0x2900 -#elif defined(JAPAN) - add r4, r4, #0xce - add r4, r4, #0x4100 -#else - add r4, r4, #0xd1 - add r4, r4, #0x2900 -#endif - mov r4, r4, lsl #0x10 - mov r4, r4, lsr #0x10 - stmib sp, {r4, r6} - bl CreateScrollBoxSingle - ldr r1, _023082B4 ; =ov11_02324D8C - mov r2, #0xb - ldr r3, [r1] - strb r0, [r3, #9] - ldr r0, [r1] - str r2, [r0] - b _02308CF0 -_02308B70: - ldrsb r0, [r4, #9] - bl IsScrollBoxActive - cmp r0, #0 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #9] - bl CloseScrollBox - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r3, #1 - ldr r2, [r0] - mov r1, #0 - strb r3, [r2, #9] - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02308BB0: - ldrsb r0, [r4, #5] - mvn r1, #1 - cmp r0, r1 - beq _02308BD4 - bl CloseTextBox2 - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #5] -_02308BD4: - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - ldrsb r0, [r0, #4] - cmp r0, r1 - beq _02308C00 - bl CloseInventoryMenu - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #4] -_02308C00: - ldr r1, _023082B4 ; =ov11_02324D8C - mvn r0, #1 - ldr r1, [r1] - ldrsb r1, [r1, #8] - cmp r1, r0 - bne _02308C1C - bl ov11_02308EDC -_02308C1C: - ldr r0, _023082B4 ; =ov11_02324D8C -#ifdef JAPAN - ldr r2, _0230A2C4_JP ; =0x00002FD4 - ldr r0, [r0] - mov r1, #0x18 -#else - mov r1, #0x18 - ldr r0, [r0] - mov r2, #0x2b4 -#endif - ldrsb r0, [r0, #8] - mov r3, #0 - bl ShowStringIdInDialogueBox - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0xd - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02308C4C: - ldrsb r0, [r4, #8] - bl IsDialogueBoxActive - cmp r0, #0 - bne _02308CF0 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #8] - bl ShowDialogueBox - bl ov11_02308F14 - ldr r0, _023082B4 ; =ov11_02324D8C - mov r1, #0x10 - ldr r0, [r0] - str r1, [r0] - b _02308CF0 -_02308C84: - mov r0, #0xf - str r0, [r4] - b _02308CF0 -_02308C90: - ldrsb r0, [r4, #4] - bl IsInventoryMenuActive - cmp r0, #0 - bne _02308CE8 - ldr r0, _023082B4 ; =ov11_02324D8C - ldr r0, [r0] - ldrsb r0, [r0, #5] - bl CloseTextBox2 - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r2, #1 - ldr r1, [r0] - strb r2, [r1, #5] - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl CloseInventoryMenu - ldr r0, _023082B4 ; =ov11_02324D8C - mvn r3, #1 - ldr r2, [r0] - mov r1, #0x10 - strb r3, [r2, #4] - ldr r0, [r0] - str r1, [r0] -_02308CE8: - mov r0, #1 - b _02308CF4 -_02308CF0: - mov r0, #0 -_02308CF4: - add sp, sp, #0x5a0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -#ifdef JAPAN -_02308CFC: .word 0x00001D2F -_02308D00: .word 0x0000131B -_02308D04: .word 0x0000248A -_02308D08: .word 0x0000248B -_0230A2B0_JP: .word 0x0000248F -#else -_02308CFC: .word 0x000008D7 -_02308D00: .word 0x0000131B -_02308D04: .word 0x00000F23 -_02308D08: .word 0x00000F24 -#endif -_02308D0C: .word 0x000002CB + OV11_02307334_OFFSET -_02308D10: .word ov11_02322C78 -_02308D14: .word 0x00001013 -#ifdef JAPAN -_02308D18: .word 0x00001D3C -_0230A2C4_JP: .word 0x00002FD4 -#else -_02308D18: .word 0x000008E4 -#endif - arm_func_end ov11_02307334 - - arm_func_start ov11_02308D1C -ov11_02308D1C: ; 0x02308D1C - stmdb sp!, {r3, lr} - ldr r0, _02308D44 ; =ov11_02324D8C - ldr r0, [r0] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl MemFree - ldr r0, _02308D44 ; =ov11_02324D8C - mov r1, #0 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_02308D44: .word ov11_02324D8C - arm_func_end ov11_02308D1C - - arm_func_start ov11_02308D48 -ov11_02308D48: ; 0x02308D48 - stmdb sp!, {r3, lr} - ldr r0, _02308DD4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - ldrsb r0, [r0, #6] - cmp r0, r1 - beq _02308D78 - bl CloseParentMenu - ldr r0, _02308DD4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #6] -_02308D78: - ldr r0, _02308DD4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - ldrsb r0, [r0, #5] - cmp r0, r1 - beq _02308DA4 - bl CloseTextBox2 - ldr r0, _02308DD4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #5] -_02308DA4: - ldr r0, _02308DD4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - ldrsb r0, [r0, #4] - cmp r0, r1 - ldmeqia sp!, {r3, pc} - bl CloseInventoryMenu - ldr r0, _02308DD4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #4] - ldmia sp!, {r3, pc} - .align 2, 0 -_02308DD4: .word ov11_02324D8C - arm_func_end ov11_02308D48 - - arm_func_start ov11_02308DD8 -ov11_02308DD8: ; 0x02308DD8 - stmdb sp!, {r3, r4, lr} - sub sp, sp, #0xc - ldr r1, [r0] - cmp r1, #0 - bne _02308E20 - ldrsh r0, [r0, #4] - bl GetTeamMember - mov r4, r0 - bl sub_02055894 - bl sub_020564B0 - ldr r1, _02308EAC ; =ov11_02324D8C - mov r2, r0 - ldr r0, [r1] - mov r1, r4 - add r0, r0, #0x36 - add r0, r0, #0x100 - bl sub_02056094 - b _02308E94 -_02308E20: - cmp r1, #1 - bne _02308E94 - ldrsh r0, [r0, #4] - bl GetActiveTeamMember - mov r4, r0 - add r0, sp, #0 - add r1, r4, #0x5e - mov r2, #0xa - bl StrncpySimpleNoPadSafe - ldrb r0, [r4] - mov r2, #0x44 - ldr r1, _02308EB0 ; =ov11_02322DB8 - tst r0, #2 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - ldrb r0, [r4, #1] - movne r2, #0x46 - add r3, sp, #0 - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - ldr r0, _02308EAC ; =ov11_02324D8C - movne r2, #0x59 - ldr r0, [r0] - add r0, r0, #0x36 - add r0, r0, #0x100 - bl ov11_02308EB4 -_02308E94: - ldr r0, _02308EAC ; =ov11_02324D8C - ldr r0, [r0] - add r0, r0, #0x36 - add r0, r0, #0x100 - add sp, sp, #0xc - ldmia sp!, {r3, r4, pc} - .align 2, 0 -_02308EAC: .word ov11_02324D8C -_02308EB0: .word ov11_02322DB8 - arm_func_end ov11_02308DD8 - - arm_func_start ov11_02308EB4 -ov11_02308EB4: ; 0x02308EB4 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3, lr} - add r2, sp, #0xc - bic r2, r2, #3 - ldr r1, [sp, #0xc] - add r2, r2, #4 - bl vsprintf - ldmia sp!, {r3, lr} - add sp, sp, #0x10 - bx lr - arm_func_end ov11_02308EB4 - - arm_func_start ov11_02308EDC -ov11_02308EDC: ; 0x02308EDC - stmdb sp!, {r3, lr} - ldr r1, _02308F10 ; =ov11_02324D8C - mvn r0, #1 - ldr r1, [r1] - ldrsb r1, [r1, #8] - cmp r1, r0 - ldmneia sp!, {r3, pc} - mov r0, #0 - bl CreateDialogueBox - ldr r1, _02308F10 ; =ov11_02324D8C - ldr r1, [r1] - strb r0, [r1, #8] - ldmia sp!, {r3, pc} - .align 2, 0 -_02308F10: .word ov11_02324D8C - arm_func_end ov11_02308EDC - - arm_func_start ov11_02308F14 -ov11_02308F14: ; 0x02308F14 - stmdb sp!, {r3, lr} - ldr r0, _02308F48 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - ldrsb r0, [r0, #8] - cmp r0, r1 - ldmeqia sp!, {r3, pc} - bl CloseDialogueBox - ldr r0, _02308F48 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #8] - ldmia sp!, {r3, pc} - .align 2, 0 -_02308F48: .word ov11_02324D8C - arm_func_end ov11_02308F14 - - arm_func_start ov11_02308F4C -ov11_02308F4C: ; 0x02308F4C - stmdb sp!, {r4, lr} - ldr r2, [r1] - ldr r1, [r1, #4] - mov r4, r0 - str r2, [r4] - str r1, [r4, #4] - ldr r0, [r4] - cmp r0, #0 - bne _02308F9C - ldrsh r0, [r4, #4] - bl GetTeamMember - ldrsh r3, [r0, #4] - add r2, r0, #0x14 - add r1, r0, #8 - strh r3, [r4, #8] - ldrb r0, [r0, #2] - strb r0, [r4, #0xa] - str r2, [r4, #0xc] - str r1, [r4, #0x10] - ldmia sp!, {r4, pc} -_02308F9C: - cmp r0, #1 - ldmneia sp!, {r4, pc} - ldrsh r0, [r4, #4] - bl GetActiveTeamMember - ldrsh r3, [r0, #0xc] - add r2, r0, #0x4c - add r1, r0, #6 - strh r3, [r4, #8] - ldrb r0, [r0, #3] - strb r0, [r4, #0xa] - str r2, [r4, #0xc] - str r1, [r4, #0x10] - ldmia sp!, {r4, pc} - arm_func_end ov11_02308F4C - - arm_func_start ov11_02308FD0 -ov11_02308FD0: ; 0x02308FD0 - stmdb sp!, {r3, lr} - ldr r1, [r0] - cmp r1, #1 - ldmneia sp!, {r3, pc} - ldrsh r0, [r0, #4] - bl sub_02058794 - ldmia sp!, {r3, pc} - arm_func_end ov11_02308FD0 - - arm_func_start ov11_02308FEC -ov11_02308FEC: ; 0x02308FEC - stmdb sp!, {r3, lr} - ldr r1, [r0] - cmp r1, #0 - bne _02309008 - ldrsh r0, [r0, #4] - bl sub_0203FA64 - ldmia sp!, {r3, pc} -_02309008: - cmp r1, #1 - ldmneia sp!, {r3, pc} - ldrsh r0, [r0, #4] - bl sub_0203FBD4 - ldmia sp!, {r3, pc} - arm_func_end ov11_02308FEC - - arm_func_start ov11_0230901C -ov11_0230901C: ; 0x0230901C - ldr r1, [r0] - cmp r1, #0 - ldreqsh r0, [r0, #4] - orreq r0, r0, #0x20000 - bxeq lr - cmp r1, #1 - ldreqsh r0, [r0, #4] - orreq r0, r0, #0x30000 - bx lr - arm_func_end ov11_0230901C - - arm_func_start ov11_02309040 -ov11_02309040: ; 0x02309040 - stmdb sp!, {r4, lr} - mov r4, r0 - ldr r0, _0230907C ; =0x00000794 - mov r1, #8 - bl MemAlloc - ldr r1, _02309080 ; =ov11_02324D90 - cmp r0, #0 - str r0, [r1] - moveq r0, #0 -#ifdef JAPAN - strne r4, [r0, #0xf4] -#else - strne r4, [r0, #0x114] -#endif - ldrne r0, [r1] - movne r1, #0 - strne r1, [r0] - movne r0, #1 - ldmia sp!, {r4, pc} - .align 2, 0 -#ifdef JAPAN -_0230907C: .word 0x00000774 -#else -_0230907C: .word 0x00000794 -#endif -_02309080: .word ov11_02324D90 - arm_func_end ov11_02309040 - - arm_func_start ov11_02309084 -ov11_02309084: ; 0x02309084 -#ifdef JAPAN -#define OV11_02309084_OFFSET -0x20 -#else -#define OV11_02309084_OFFSET 0 -#endif - stmdb sp!, {r4, lr} - mov r4, r0 - ldr r0, _023090D4 ; =0x00000794 - mov r1, #8 - bl MemAlloc - ldr r1, _023090D8 ; =ov11_02324D90 - cmp r0, #0 - str r0, [r1] - moveq r0, #0 - ldmeqia sp!, {r4, pc} - mov r2, #2 - str r2, [r0, #0x114 + OV11_02309084_OFFSET] - ldr r0, [r1] - mov r2, #0 - str r2, [r0] - ldr r1, [r1] - mov r0, #1 -#ifdef JAPAN - strh r4, [r1, #0xf8] -#else - add r1, r1, #0x100 - strh r4, [r1, #0x18] -#endif - ldmia sp!, {r4, pc} - .align 2, 0 -#ifdef JAPAN -_023090D4: .word 0x00000774 -#else -_023090D4: .word 0x00000794 -#endif -_023090D8: .word ov11_02324D90 - arm_func_end ov11_02309084 - - arm_func_start ov11_023090DC -ov11_023090DC: ; 0x023090DC - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x124 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r3, [r0] - ldr r0, [r3] - cmp r0, #0x1b - addls pc, pc, r0, lsl #2 - b _02309D74 -_023090FC: ; jump table - b _0230916C ; case 0 - b _0230955C ; case 1 - b _02309518 ; case 2 - b _02309724 ; case 3 - b _023097EC ; case 4 - b _0230984C ; case 5 - b _0230987C ; case 6 - b _023098A8 ; case 7 - b _023098E4 ; case 8 - b _023099B0 ; case 9 - b _023099CC ; case 10 - b _023099F8 ; case 11 - b _02309A2C ; case 12 - b _02309A68 ; case 13 - b _02309A8C ; case 14 - b _02309AB4 ; case 15 - b _02309AD0 ; case 16 - b _02309B40 ; case 17 - b _02309B5C ; case 18 - b _02309BA4 ; case 19 - b _02309C04 ; case 20 - b _02309CA4 ; case 21 - b _02309CE0 ; case 22 - b _02309CF8 ; case 23 - b _02309D20 ; case 24 - b _02309D38 ; case 25 - b _02309D54 ; case 26 - b _02309D6C ; case 27 -_0230916C: - ldr r5, [r3, #0x114 + OV11_02309084_OFFSET] - mov r0, #0 - str r0, [sp, #4] - ldr r8, [sp, #4] - add r4, r3, #0x11c + OV11_02309084_OFFSET - mov r2, r8 -#ifdef JAPAN - str r2, [sp, #8] - ldrsh r2, [r3, #0xf8] -#else - add r3, r3, #0x100 - str r2, [sp, #8] - ldrsh r2, [r3, #0x18] -#endif - mov r0, r4 - mov r1, r5 - str r2, [sp, #0x10] - ldr r2, _02309D84 ; =0x00401833 - add r7, r4, #0x38 - str r2, [sp, #0x14] - bl ov11_02309EE4 - mov r2, #0 - mov r1, r2 - b _023091C4 -_023091B8: - add r0, r4, r2 - strb r1, [r0, #0x70] - add r2, r2, #1 -_023091C4: - ldr r0, [r4, #0x30] - cmp r2, r0 - blt _023091B8 - cmp r5, #2 - bne _023092FC - mov sl, #0 - b _023092F0 -_023091E0: - ldr r0, [sp, #0x10] - add fp, r4, sl, lsl #3 - bl GetItemMoveId16 - ldr r1, [r4, sl, lsl #3] - mov r6, r0 - cmp r1, #1 - bne _02309258 - ldrsh r0, [fp, #4] - bl GetTeamMember - ldrsh r1, [r0, #4] - mov sb, #0 - mov r3, sb - str r1, [sp, #0xc] - mov fp, #1 - mov r1, #6 - b _0230924C -_02309220: - mla ip, sb, r1, r0 - ldrb r2, [ip, #0x22] - tst r2, #1 - movne r2, fp - moveq r2, r3 - tst r2, #0xff - beq _02309248 - ldrh r2, [ip, #0x24] - cmp r6, r2 - beq _023092B8 -_02309248: - add sb, sb, #1 -_0230924C: - cmp sb, #4 - blt _02309220 - b _023092B8 -_02309258: - cmp r1, #2 - bne _023092B8 - ldrsh r0, [fp, #4] - bl GetActiveTeamMember - ldrsh r1, [r0, #0xc] - mov sb, #0 - mov r2, sb - str r1, [sp, #0xc] - mov r3, #1 - b _023092B0 -_02309280: - add r1, r0, sb, lsl #3 - ldrb r1, [r1, #0x1c] - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - beq _023092AC - add r1, r0, sb, lsl #3 - ldrh r1, [r1, #0x20] - cmp r6, r1 - beq _023092B8 -_023092AC: - add sb, sb, #1 -_023092B0: - cmp sb, #4 - blt _02309280 -_023092B8: - ldr r1, [sp, #0xc] - mov r0, r6 - bl sub_02053D1C - cmp r0, #0 - beq _023092E0 - cmp sb, #4 - addlt r0, r4, sl - movlt r1, #3 - strltb r1, [r0, #0x70] - b _023092EC -_023092E0: - add r0, r4, sl - mov r1, #3 - strb r1, [r0, #0x70] -_023092EC: - add sl, sl, #1 -_023092F0: - ldr r0, [r4, #0x30] - cmp sl, r0 - blt _023091E0 -_023092FC: - mov sl, #0 - add r6, r4, #0x76 - add fp, sp, #0x5c - b _02309450 -_0230930C: - add sb, r4, sl, lsl #3 - ldr r0, [r4, sl, lsl #3] - cmp r0, #1 - bne _0230935C - ldrsh r0, [sb, #4] - bl GetTeamMember - ldrsh r1, [sb, #4] - mov sb, r0 - orr r0, r1, #0x20000 - str r0, [sp, #0x5c] - ldrsh r0, [sb, #4] - bl GetDexNumber - str r0, [sp, #0x80] - add r1, sb, #0x3a - add r0, sp, #0x1a - mov r2, #0 - bl RecolorNameString - add r0, sp, #0x1a - str r0, [sp, #0x94] - b _023093A0 -_0230935C: - cmp r0, #2 - bne _023093A0 - ldrsh r0, [sb, #4] - bl GetActiveTeamMember - ldrsh r1, [sb, #4] - mov sb, r0 - orr r0, r1, #0x30000 - str r0, [sp, #0x5c] - ldrsh r0, [sb, #0xc] - bl GetDexNumber - str r0, [sp, #0x80] - add r1, sb, #0x5e - add r0, sp, #0x1a - mov r2, #0 - bl RecolorNameString - add r0, sp, #0x1a - str r0, [sp, #0x94] -_023093A0: - cmp r5, #1 - mov r1, #0x100 - mov r3, #0 - bne _023093C8 - ldr r2, _02309D88 ; =ov11_02322E58 - add r0, r6, r8, lsl #8 - str fp, [sp] - mov sb, r8, lsl #8 - bl PreprocessString - b _0230941C -_023093C8: - cmp r5, #2 - bne _02309408 - add r0, r4, sl - ldrb r0, [r0, #0x70] - mov sb, r8, lsl #8 - tst r0, #2 - str fp, [sp] - beq _023093F8 - ldr r2, _02309D8C ; =ov11_02322E7C - add r0, r6, r8, lsl #8 - bl PreprocessString - b _0230941C -_023093F8: - ldr r2, _02309D88 ; =ov11_02322E58 - add r0, r6, r8, lsl #8 - bl PreprocessString - b _0230941C -_02309408: - ldr r2, _02309D90 ; =ov11_02322EA0 - add r0, r6, r8, lsl #8 - str fp, [sp] - mov sb, r8, lsl #8 - bl PreprocessString -_0230941C: - add r0, r4, sl - ldrb r0, [r0, #0x70] - add r8, r8, #1 - cmp r0, #0 - ldreq r0, [sp, #4] - cmpeq r0, #0 - moveq r0, #1 - streq r0, [sp, #4] - add r0, r6, sb - stmia r7, {r0, sl} - streq sl, [sp, #8] - add r7, r7, #8 - add sl, sl, #1 -_02309450: - ldr r0, [r4, #0x30] - cmp sl, r0 - blt _0230930C - mov r3, #0 - str r3, [r7] - sub r0, r3, #1 - str r0, [r7, #4] - ldr r0, [sp, #8] - ldr r1, _02309D80 ; =ov11_02324D90 - str r0, [r4, #0x34] - ldr r0, [r1] - mov r2, #0x10 - str r2, [r0, #0x88 + OV11_02309084_OFFSET] - ldr r0, [r1] - str r3, [r0, #0x7c + OV11_02309084_OFFSET] - ldr r3, [r1] - ldr r0, [r3, #0x114 + OV11_02309084_OFFSET] - cmp r0, #1 - ldreq r0, _02309D94 ; =0x000002F2 - streqh r0, [r3, #0x84 + OV11_02309084_OFFSET] - beq _023094E0 - cmp r0, #2 - ldrne r0, _02309D98 ; =0x00000A3A - strneh r0, [r3, #0x84 + OV11_02309084_OFFSET] - bne _023094E0 - ldr r2, _02309D94 ; =0x000002F2 - ldr r0, [sp, #0x14] - strh r2, [r3, #0x84 + OV11_02309084_OFFSET] - orr r0, r0, #0x200 - ldr r2, [r1] - str r0, [sp, #0x14] - add r0, r2, #0x18c + OV11_02309084_OFFSET - str r0, [r2, #0xdc + OV11_02309084_OFFSET] - ldr r1, [r1] - ldr r0, [r1, #0x150 + OV11_02309084_OFFSET] - str r0, [r1, #0x7c + OV11_02309084_OFFSET] -_023094E0: - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r0, _02309D9C ; =ov11_02322DD0 - ldr r3, [r1] - ldr r1, [sp, #0x14] - add r2, r3, #0x7c + OV11_02309084_OFFSET - add r3, r3, #0x154 + OV11_02309084_OFFSET - bl CreateParentMenu - ldr r1, _02309D80 ; =ov11_02324D90 - mov r2, #1 - ldr r3, [r1] - strb r0, [r3, #4] - ldr r0, [r1] - str r2, [r0] - b _02309D74 -_02309518: - ldrsb r0, [r3, #4] - bl sub_02028354 - cmp r0, #3 - bne _02309538 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl sub_0202810C -_02309538: - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl ResumeParentMenu - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #1 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_0230955C: - add r1, sp, #0x18 - mov r0, #0 - ldr r5, [r3, #0x114 + OV11_02309084_OFFSET] - bl GetPressedButtons - ldrh r0, [sp, #0x18] - tst r0, #8 - beq _02309584 - cmp r5, #0 - moveq r0, #1 - beq _02309588 -_02309584: - mov r0, #0 -_02309588: - cmp r0, #0 - beq _023095E0 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r4, [r0] - ldrsb r0, [r4, #4] - bl GetWindowIdSelectedItemOnPage - add r0, r4, r0, lsl #3 - ldr r1, [r0, #0x158 + OV11_02309084_OFFSET] - ldr r0, _02309D80 ; =ov11_02324D90 - str r1, [r4, #0x10] - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl sub_0202B030 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl sub_0202812C - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #4 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_023095E0: - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl IsParentMenuActive - cmp r0, #0 - bne _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl GetSimpleMenuResult__0202AEA4 - cmp r0, #0 - blt _02309704 - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r2, [r1] - str r0, [r2, #0x10] - ldr r1, [r1] - add r2, r1, #0x11c + OV11_02309084_OFFSET - ldr r1, [r2, r0, lsl #3] - add r5, r2, r0, lsl #3 - cmp r1, #1 - bne _02309644 - ldrsh r0, [r5, #4] - bl GetTeamMember - ldrsh r4, [r0, #4] - b _02309658 -_02309644: - cmp r1, #2 - bne _02309658 - ldrsh r0, [r5, #4] - bl GetActiveTeamMember - ldrsh r4, [r0, #0xc] -_02309658: - mov r0, r5 - bl ov11_0230A044 - ldr r1, _02309D80 ; =ov11_02324D90 - mov r5, r0 - ldr r1, [r1] - ldr r0, [r1, #0x114 + OV11_02309084_OFFSET] - sub r0, r0, #1 - cmp r0, #1 - movls r0, #0x1a - strls r0, [r1] - bls _02309D74 - bl GetGameMode - cmp r0, #5 - beq _023096D0 - cmp r4, #0x140 - bne _023096D0 - mov r0, r5 - mov r1, r4 - bl StrcmpMonsterName - cmp r0, #0 - beq _023096D0 - ldr r0, _02309DA0 ; =ov11_02322DE0 - ldr r3, _02309DA4 ; =ov11_02322E28 - mov r1, #0x13 - mov r2, #0 - bl CreateParentMenuFromStringIds - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r1, [r1] - strb r0, [r1, #5] - b _023096F0 -_023096D0: - ldr r0, _02309DA0 ; =ov11_02322DE0 - ldr r3, _02309DA8 ; =ov11_02322E00 - mov r1, #0x13 - mov r2, #0 - bl CreateParentMenuFromStringIds - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r1, [r1] - strb r0, [r1, #5] -_023096F0: - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #3 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309704: - ldr r0, _02309D80 ; =ov11_02324D90 - mov r3, #0x1a - ldr r2, [r0] - sub r1, r3, #0x1b - str r3, [r2] - ldr r0, [r0] - str r1, [r0, #0x10] - b _02309D74 -_02309724: - ldrsb r0, [r3, #5] - bl IsParentMenuActive - cmp r0, #0 - bne _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #5] - bl GetSimpleMenuResult__0202AEA4 - mvn r1, #0 - cmp r0, r1 - beq _023097C8 - ldr r1, _02309D80 ; =ov11_02324D90 - cmp r0, #3 - ldr r2, [r1] - str r0, [r2, #0x14] - addls pc, pc, r0, lsl #2 - b _023097B4 -_02309768: ; jump table - b _02309778 ; case 0 - b _02309788 ; case 1 - b _02309798 ; case 2 - b _023097A8 ; case 3 -_02309778: - ldr r0, [r1] - mov r1, #4 - str r1, [r0] - b _023097B4 -_02309788: - ldr r0, [r1] - mov r1, #7 - str r1, [r0] - b _023097B4 -_02309798: - ldr r0, [r1] - mov r1, #0xc - str r1, [r0] - b _023097B4 -_023097A8: - ldr r0, [r1] - mov r1, #0xe - str r1, [r0] -_023097B4: - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl sub_0202812C - b _023097D8 -_023097C8: - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #2 - ldr r0, [r0] - str r1, [r0] -_023097D8: - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #5] - bl CloseParentMenu - b _02309D74 -_023097EC: - ldr r0, [r3, #0x10] - add r1, r3, #0x11c + OV11_02309084_OFFSET - add r4, r1, r0, lsl #3 - ldrsh r0, [r4, #4] - bl GetActiveTeamMember - ldrb r0, [r0, #1] - cmp r0, #0 - movne r5, #1 - ldrsh r0, [r4, #4] - moveq r5, #0 - bl GetActiveTeamMember - mov r1, r0 - add r0, sp, #0xac - and r2, r5, #0xff - bl CreateMonsterSummaryFromTeamMember - add r0, sp, #0xac - mov r1, #3 - bl sub_0203F150 - ldr r1, _02309D80 ; =ov11_02324D90 - mov r2, #5 - ldr r3, [r1] - strb r0, [r3, #9] - ldr r0, [r1] - str r2, [r0] -_0230984C: - bl sub_0203F398 - cmp r0, #1 - bne _02309D74 - bl sub_0203F974 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r3, #1 - ldr r2, [r0] - mov r1, #6 - str r3, [r2, #0x18] - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_0230987C: - ldr r1, [r3, #0x18] - sub r0, r1, #1 - str r0, [r3, #0x18] - cmp r1, #0 - bne _02309D74 - bl sub_0203F990 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #2 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_023098A8: - ldr r0, [r3, #0x10] -#ifdef JAPAN - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 -#else - add r0, r3, r0, lsl #3 - add r0, r0, #0x100 - ldrsh r0, [r0, #0x20] -#endif - bl sub_0203FBD4 - mov r1, #0 - mov r2, r1 - mov r0, #9 - bl sub_0204018C - ldr r1, _02309D80 ; =ov11_02324D90 - mov r2, #8 - ldr r3, [r1] - strb r0, [r3, #0xa] - ldr r0, [r1] - str r2, [r0] -_023098E4: - bl sub_020407EC - cmp r0, #1 - bne _02309934 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r1, [r0] - ldr r0, [r1, #0x10] - add r0, r1, r0, lsl #3 - add r0, r0, #0x100 - ldrsh r0, [r0, #0x20 + OV11_02309084_OFFSET] - bl sub_0203FDEC - bl sub_020407C0 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #0xa] - bl CloseAdvancedTextBox - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #2 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309934: - cmp r0, #2 - cmpne r0, #7 - bne _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r1, [r0] - ldr r0, [r1, #0x10] - add r1, r1, #0x11c + OV11_02309084_OFFSET - add r4, r1, r0, lsl #3 - bl sub_0203FD38 - ldr r2, _02309D80 ; =ov11_02324D90 - mov r1, r0 - ldr r0, [r2] - mov r2, #0x20 - add r0, r0, #0x1e - bl MemcpySimple - bl sub_02041094 - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r1, [r1] - strh r0, [r1, #0x1c] - ldrsh r0, [r4, #4] - bl sub_0203FDEC - bl sub_020407C0 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #0xa] - bl CloseAdvancedTextBox - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0xa - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_023099B0: - ldrsb r0, [r3, #0xa] - bl sub_020307EC - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #8 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_023099CC: - ldrsh r2, [r3, #0x1c] - add r0, r3, #0x1e - mov r1, #4 - mov r3, #1 - bl sub_020417A8 - ldr r1, _02309D80 ; =ov11_02324D90 - mov r2, #0xb - ldr r3, [r1] - strb r0, [r3, #0xb] - ldr r0, [r1] - str r2, [r0] -_023099F8: - bl sub_02041A18 - cmp r0, #1 - bne _02309D74 - bl sub_02041A00 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #0xb] - bl CloseScrollBox - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #7 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309A2C: - ldr r0, [r3, #0x10] - add r0, r3, r0, lsl #3 - add r0, r0, #0x100 - ldrsh r0, [r0, #0x20 + OV11_02309084_OFFSET] - bl GetActiveTeamMember - mov r1, r0 - ldrsh r0, [r1, #0xc] - ldrsh r2, [r1, #6] - add r1, r1, #0x4c - mov r3, #0 - bl PrintIqSkillsMenu - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0xd - ldr r0, [r0] - str r1, [r0] -_02309A68: - bl sub_02041B7C - cmp r0, #1 - bne _02309D74 - bl sub_020420F4 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #2 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309A8C: - bl ov11_0230D92C - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl CloseParentMenu - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0xf - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309AB4: - bl ov11_0230D220 - cmp r0, #0 - ldreq r0, _02309D80 ; =ov11_02324D90 - moveq r1, #0x10 - ldreq r0, [r0] - streq r1, [r0] - b _02309D74 -_02309AD0: - ldr r0, [r3, #0x10] - add r1, r3, #0x11c + OV11_02309084_OFFSET - add r0, r1, r0, lsl #3 - bl ov11_0230A044 - ldr r2, _02309D80 ; =ov11_02324D90 - mov r1, r0 - ldr r0, [r2] - mov r2, #0xa - add r0, r0, #0x3e - bl StrncpySimpleNoPad - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r1, [r0] -#ifdef JAPAN - add r0, r1, #0x48 -#else - add r0, r1, #0x52 -#endif - add r1, r1, #0x3e - bl StrcpySimple - ldr r1, _02309D80 ; =ov11_02324D90 - mov r0, #2 - ldr r3, [r1] - mov r2, #0 - add r1, r3, #0x3e -#ifdef JAPAN - add r3, r3, #0x48 -#else - add r3, r3, #0x52 -#endif - bl ShowKeyboard - bl ov11_02310BDC - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x11 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309B40: - bl ov11_0230D220 - cmp r0, #0 - ldreq r0, _02309D80 ; =ov11_02324D90 - moveq r1, #0x12 - ldreq r0, [r0] - streq r1, [r0] - b _02309D74 -_02309B5C: - bl GetKeyboardStatus - cmp r0, #3 - bne _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0xa - ldr r0, [r0] - str r1, [r0, #0x18] - bl GetKeyboardStringResult - ldr r2, _02309D80 ; =ov11_02324D90 - mov r1, r0 - ldr r0, [r2] - add r0, r0, #0x3e - bl StrcpySimple - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x13 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309BA4: - bl sub_02037468 - cmp r0, #0 - beq _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r3, [r0] - ldr r2, [r3, #0x18] - sub r1, r2, #1 - str r1, [r3, #0x18] - cmp r2, #0 - bgt _02309D74 - ldr r1, [r0] - mov r2, #0xa -#ifdef JAPAN - add r0, r1, #0x52 -#else - add r0, r1, #0x66 -#endif - add r1, r1, #0x3e - bl StrncpySimpleNoPadSafe - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] -#ifdef JAPAN - add r0, r0, #0x52 -#else - add r0, r0, #0x66 -#endif - bl sub_0203909C - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x14 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309C04: - ldr r0, [r3, #0x10] - add r1, r3, #0x11c + OV11_02309084_OFFSET - add r4, r1, r0, lsl #3 - mov r0, r4 - bl ov11_0230A044 - mov r5, r0 - bl sub_0203931C - mvn r1, #0 - cmp r0, r1 - beq _02309D74 - cmp r0, #0 - beq _02309C4C - cmp r0, #1 - ldreq r0, _02309D80 ; =ov11_02324D90 - moveq r1, #0x15 - ldreq r0, [r0] - streq r1, [r0] - b _02309D74 -_02309C4C: - ldr r1, _02309D80 ; =ov11_02324D90 - mov r0, r5 - ldr r1, [r1] - mov r2, #0xa - add r1, r1, #0x3e - bl StrncpySimple - ldr r1, _02309D80 ; =ov11_02324D90 - mov r0, r5 - ldr r1, [r1] - mov r2, #0xa - add r1, r1, #0x3e - bl StrncpySimple - ldr r0, [r4] - cmp r0, #2 - bne _02309C90 - ldrsh r0, [r4, #4] - bl sub_02058794 -_02309C90: - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x16 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309CA4: - bl sub_02039218 - cmp r0, #0 - beq _02309D74 - ldr r1, _02309D80 ; =ov11_02324D90 - mov r0, #2 - ldr r3, [r1] - mov r2, #0 - add r1, r3, #0x3e -#ifdef JAPAN - add r3, r3, #0x48 -#else - add r3, r3, #0x52 -#endif - bl ShowKeyboard - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x12 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309CE0: - bl ov11_0230D92C - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x17 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309CF8: - bl ov11_0230D220 - cmp r0, #0 - bne _02309D74 - bl sub_02039218 - cmp r0, #0 - ldrne r0, _02309D80 ; =ov11_02324D90 - movne r1, #0x18 - ldrne r0, [r0] - strne r1, [r0] - b _02309D74 -_02309D20: - bl ov11_0230D000 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x19 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309D38: - bl ov11_0230D220 - cmp r0, #0 - ldreq r0, _02309D80 ; =ov11_02324D90 - moveq r1, #0 - ldreq r0, [r0] - streq r1, [r0] - b _02309D74 -_02309D54: - ldrsb r0, [r3, #4] - bl CloseParentMenu - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x1b - ldr r0, [r0] - str r1, [r0] -_02309D6C: - mov r0, #1 - b _02309D78 -_02309D74: - mov r0, #0 -_02309D78: - add sp, sp, #0x124 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02309D80: .word ov11_02324D90 -_02309D84: .word 0x00401833 -_02309D88: .word ov11_02322E58 -_02309D8C: .word ov11_02322E7C -_02309D90: .word ov11_02322EA0 -#ifdef JAPAN -_02309D94: .word 0x00002FF2 -_02309D98: .word 0x00000875 -#else -_02309D94: .word 0x000002F2 -_02309D98: .word 0x00000A3A -#endif -_02309D9C: .word ov11_02322DD0 -_02309DA0: .word ov11_02322DE0 -_02309DA4: .word ov11_02322E28 -_02309DA8: .word ov11_02322E00 - arm_func_end ov11_023090DC - - arm_func_start ov11_02309DAC -ov11_02309DAC: ; 0x02309DAC - ldr r1, _02309DF4 ; =ov11_02324D90 - ldr r1, [r1] - ldr r2, [r1, #0x10] -#ifdef JAPAN - add r3, r1, #0xfc -#else - add r3, r1, #0x11c -#endif - ldr r1, [r3, r2, lsl #3] - add r2, r3, r2, lsl #3 - cmp r1, #1 - moveq r1, #0 - streq r1, [r0] - ldreqsh r1, [r2, #4] - streqh r1, [r0, #4] - bxeq lr - cmp r1, #2 - moveq r1, #1 - streq r1, [r0] - ldreqsh r1, [r2, #4] - streqh r1, [r0, #4] - bx lr - .align 2, 0 -_02309DF4: .word ov11_02324D90 - arm_func_end ov11_02309DAC - - arm_func_start ov11_02309DF8 -ov11_02309DF8: ; 0x02309DF8 - stmdb sp!, {r3, lr} - ldr r0, _02309E20 ; =ov11_02324D90 - ldr r0, [r0] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl MemFree - ldr r0, _02309E20 ; =ov11_02324D90 - mov r1, #0 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_02309E20: .word ov11_02324D90 - arm_func_end ov11_02309DF8 - - arm_func_start ov11_02309E24 -ov11_02309E24: ; 0x02309E24 - ldr r0, _02309E44 ; =ov11_02324D90 - ldr r0, [r0] - cmp r0, #0 - ldrne r0, [r0, #0x10] - movne r0, r0, lsl #0x10 - movne r0, r0, asr #0x10 - mvneq r0, #0 - bx lr - .align 2, 0 -_02309E44: .word ov11_02324D90 - arm_func_end ov11_02309E24 - - arm_func_start ov11_02309E48 -ov11_02309E48: ; 0x02309E48 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r0 - mov r0, #0x34 - mov r1, #0 - mov r5, #1 - bl MemAlloc - mov r1, #2 - mov r4, r0 - bl ov11_02309EE4 - mov r6, #0 - b _02309EBC -_02309E74: - ldr r0, [r4, r6, lsl #3] - add r1, r4, r6, lsl #3 - cmp r0, #1 - bne _02309E9C - ldrsh r0, [r1, #4] - mov r1, r7 - bl sub_02055FCC - cmp r0, #0 - bne _02309EC8 - b _02309EB8 -_02309E9C: - cmp r0, #2 - bne _02309EB8 - ldrsh r0, [r1, #4] - mov r1, r7 - bl sub_020586F0 - cmp r0, #0 - bne _02309EC8 -_02309EB8: - add r6, r6, #1 -_02309EBC: - ldr r0, [r4, #0x30] - cmp r6, r0 - blt _02309E74 -_02309EC8: - ldr r0, [r4, #0x30] - cmp r6, r0 - mov r0, r4 - moveq r5, #0 - bl MemFree - mov r0, r5 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ov11_02309E48 - - arm_func_start ov11_02309EE4 -ov11_02309EE4: ; 0x02309EE4 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov r4, #0 - mov sl, r0 - mov r5, r1 - mov r1, r4 - str r4, [sl, #0x30] - mov r0, r4 -_02309F00: - str r0, [sl, r1, lsl #3] - add r1, r1, #1 - cmp r1, #6 - blt _02309F00 - bl sub_0204E210 - mvn r1, #0 - cmp r0, r1 - bne _02309F2C - bl sub_0205633C - cmp r0, #0 - moveq r4, #1 -_02309F2C: - cmp r4, #0 - beq _02309FD4 - sub r0, r5, #1 - cmp r0, #1 - bhi _02309FD4 - bl GetGameMode - cmp r0, #1 - ldrls sb, _0230A03C ; =ov11_02322DC8 - mov fp, #2 - ldrhi sb, _0230A040 ; =ov11_02322DF0 - mov r5, #1 - mvn r4, #0 - b _02309FB8 -_02309F60: - ldrsh r0, [sb], #2 - bl GetActorMatchingStorageId - ldr r1, [sl, #0x30] - mov r7, r0 - cmp r7, r4 - add r8, sl, r1, lsl #3 - beq _02309FB8 - bl GetActiveRosterIndex - mov r6, r0 - cmp r6, r4 - streq r5, [r8] - streqh r7, [r8, #4] - beq _02309FAC - bl GetActiveTeamMember - ldrsh r0, [r0, #8] - bl CheckTeamMemberIdx - cmp r0, #0 - streq fp, [r8] - streqh r6, [r8, #4] -_02309FAC: - ldr r0, [sl, #0x30] - add r0, r0, #1 - str r0, [sl, #0x30] -_02309FB8: - ldrsh r0, [sb] - cmp r0, r4 - beq _0230A034 - ldr r0, [sl, #0x30] - cmp r0, #6 - blt _02309F60 - b _0230A034 -_02309FD4: - mov r7, #0 - mov r8, sl - mov r5, r7 - mov r6, #1 - mov r4, #2 -_02309FE8: - mov r0, r7 - bl GetActiveTeamMember - ldrb r0, [r0] - tst r0, #1 - movne r0, r6 - moveq r0, r5 - tst r0, #0xff - beq _0230A020 - str r4, [r8] - strh r7, [r8, #4] - ldr r0, [sl, #0x30] - add r8, r8, #8 - add r0, r0, #1 - str r0, [sl, #0x30] -_0230A020: - add r0, r7, #1 - mov r0, r0, lsl #0x10 - mov r7, r0, asr #0x10 - cmp r7, #4 - blt _02309FE8 -_0230A034: - ldr r0, [sl, #0x30] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0230A03C: .word ov11_02322DC8 -_0230A040: .word ov11_02322DF0 - arm_func_end ov11_02309EE4 - - arm_func_start ov11_0230A044 -ov11_0230A044: ; 0x0230A044 - stmdb sp!, {r3, lr} - ldr r1, [r0] - cmp r1, #1 - bne _0230A064 - ldrsh r0, [r0, #4] - bl GetTeamMember - add r0, r0, #0x3a - ldmia sp!, {r3, pc} -_0230A064: - cmp r1, #2 - ldmneia sp!, {r3, pc} - ldrsh r0, [r0, #4] - bl GetActiveTeamMember - add r0, r0, #0x5e - ldmia sp!, {r3, pc} - arm_func_end ov11_0230A044 - - arm_func_start ov11_0230A07C -ov11_0230A07C: ; 0x0230A07C - stmdb sp!, {r3, lr} - ldr r0, _0230A0CC ; =ov11_02322ECC - bl InitMenu - cmp r0, #0 - ldmeqia sp!, {r3, pc} - mov r0, #0xc - mov r1, #8 - bl MemAlloc - ldr r1, _0230A0D0 ; =ov11_02324D94 - mov r3, #0 - str r0, [r1] - str r3, [r0, #4] - ldr r0, [r1] - sub r2, r3, #2 - str r3, [r0, #8] - ldr r0, [r1] - strb r2, [r0] - ldr r0, [r1] - strb r2, [r0, #1] - ldmia sp!, {r3, pc} - .align 2, 0 -_0230A0CC: .word ov11_02322ECC -_0230A0D0: .word ov11_02324D94 - arm_func_end ov11_0230A07C - - arm_func_start ov11_0230A0D4 -ov11_0230A0D4: ; 0x0230A0D4 - stmdb sp!, {r3, lr} - ldr r0, _0230A0FC ; =ov11_02324D94 - ldr r0, [r0] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl MemFree - ldr r0, _0230A0FC ; =ov11_02324D94 - mov r1, #0 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_0230A0FC: .word ov11_02324D94 - arm_func_end ov11_0230A0D4 - - arm_func_start ov11_0230A100 -ov11_0230A100: ; 0x0230A100 - stmdb sp!, {r4, lr} - sub sp, sp, #0x138 - ldr r0, _0230A2B0 ; =ov11_02324D94 - ldr r2, [r0] - ldr r0, [r2, #8] - cmp r0, #6 - addls pc, pc, r0, lsl #2 - b _0230A2A4 -_0230A120: ; jump table - b _0230A13C ; case 0 - b _0230A184 ; case 1 - b _0230A13C ; case 2 - b _0230A1F4 ; case 3 - b _0230A258 ; case 4 - b _0230A298 ; case 5 - b _0230A298 ; case 6 -_0230A13C: - ldr lr, [r2, #4] - ldr ip, _0230A2B4 ; =0x00003FB8 - mov r4, #0x10 - ldr r0, _0230A2B8 ; =ov11_02322EAC - ldr r1, _0230A2BC ; =0x00401833 - ldr r3, _0230A2C0 ; =ov11_02322EDC - add r2, sp, #0xa0 - str lr, [sp, #0xa0] - strh ip, [sp, #0xa8] - str r4, [sp, #0xac] - bl CreateParentMenuFromStringIds - ldr r1, _0230A2B0 ; =ov11_02324D94 - mov r2, #1 - ldr r3, [r1] - strb r0, [r3] - ldr r0, [r1] - str r2, [r0, #8] - b _0230A2A4 -_0230A184: - ldrsb r0, [r2] - bl IsParentMenuActive - cmp r0, #0 - bne _0230A2A4 - ldr r0, _0230A2B0 ; =ov11_02324D94 - ldr r0, [r0] - ldrsb r0, [r0] - bl GetSimpleMenuResult__0202AEA4 - ldr r1, _0230A2B0 ; =ov11_02324D94 - mov r4, r0 - ldr r0, [r1] - ldrsb r0, [r0] - bl CloseParentMenu - ldr r0, _0230A2B0 ; =ov11_02324D94 - mvn r2, #1 - ldr r1, [r0] - cmp r4, #0 - strb r2, [r1] - ldrlt r0, [r0] - movlt r1, #6 - strlt r1, [r0, #8] - blt _0230A2A4 - ldr r2, [r0] - mov r1, #3 - str r4, [r2, #4] - ldr r0, [r0] - str r1, [r0, #8] - b _0230A2A4 -_0230A1F4: - mov r0, #0x10 - str r0, [sp, #0x14] - ldr r1, [r2, #4] - ldr r0, _0230A2C0 ; =ov11_02322EDC - mov r1, r1, lsl #3 - ldrh r1, [r0, r1] - mov r4, #8 - ldr r0, _0230A2C4 ; =ov11_02322EBC - strh r1, [sp, #0x10] - ldr r2, [r2, #4] - ldr r1, _0230A2C8 ; =0x00009833 - str r2, [sp, #8] - str r4, [sp] - mov r4, #1 - ldr r3, _0230A2CC ; =ov11_0230A2D0 - add r2, sp, #8 - str r4, [sp, #4] - bl CreateAdvancedTextBox - ldr r1, _0230A2B0 ; =ov11_02324D94 - mov r2, #4 - ldr r3, [r1] - strb r0, [r3, #1] - ldr r0, [r1] - str r2, [r0, #8] - b _0230A2A4 -_0230A258: - ldrsb r0, [r2, #1] - bl IsAdvancedTextBoxActive - cmp r0, #0 - bne _0230A2A4 - ldr r0, _0230A2B0 ; =ov11_02324D94 - ldr r0, [r0] - ldrsb r0, [r0, #1] - bl CloseAdvancedTextBox - ldr r0, _0230A2B0 ; =ov11_02324D94 - mvn r3, #1 - ldr r2, [r0] - mov r1, #2 - strb r3, [r2, #1] - ldr r0, [r0] - str r1, [r0, #8] - b _0230A2A4 -_0230A298: - bl ov11_02301174 - mov r0, #4 - b _0230A2A8 -_0230A2A4: - mov r0, #1 -_0230A2A8: - add sp, sp, #0x138 - ldmia sp!, {r4, pc} - .align 2, 0 -_0230A2B0: .word ov11_02324D94 -#if defined(EUROPE) -_0230A2B4: .word 0x00003FBA -#elif defined(JAPAN) -_0230A2B4: .word 0x000049BB -#else -_0230A2B4: .word 0x00003FB8 -#endif -_0230A2B8: .word ov11_02322EAC -_0230A2BC: .word 0x00401833 -_0230A2C0: .word ov11_02322EDC -_0230A2C4: .word ov11_02322EBC -_0230A2C8: .word 0x00009833 -_0230A2CC: .word ov11_0230A2D0 - arm_func_end ov11_0230A100 - - arm_func_start ov11_0230A2D0 -ov11_0230A2D0: ; 0x0230A2D0 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - bl GetWindowIdPageStart - mov r4, r0 - ldr r0, _0230A318 ; =ov11_02322EDC - mov r1, r4, lsl #3 - ldrh r1, [r0, r1] - mov r0, r5 - bl SetWindowTitle -#if defined(EUROPE) - add r0, r4, #0xc3 - add r0, r0, #0x3f00 -#elif defined(JAPAN) - add r0, r4, #0x1c4 - add r0, r0, #0x4800 -#else - add r0, r4, #0xc1 - add r0, r0, #0x3f00 -#endif - mov r1, r0, lsl #0x10 - mov r0, r5 - mov r3, r1, lsr #0x10 - mov r1, #4 - mov r2, #0x10 - bl AppendStandardStringToMission - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230A318: .word ov11_02322EDC - arm_func_end ov11_0230A2D0 - - arm_func_start ov11_0230A31C -ov11_0230A31C: ; 0x0230A31C - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - mov r0, #0x148 - mov r1, #8 - bl MemAlloc - ldr r2, _0230A38C ; =ov11_02324D98 - mov r1, #0x148 - str r0, [r2, #4] - bl MemZero - ldr r0, _0230A38C ; =ov11_02324D98 - mov ip, #4 - ldr r4, [r0, #4] - stmib r4, {r5, r6} - add lr, r4, #0xc -_0230A358: - ldmia r6!, {r0, r1, r2, r3} - stmia lr!, {r0, r1, r2, r3} - subs ip, ip, #1 - bne _0230A358 - ldr r1, [r6] - mvn r0, #1 - str r1, [lr] - strb r0, [r4, #0x74] - strb r0, [r4, #0x78] - mov r0, #0 - str r0, [r4] - str r0, [r4, #0x144] - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0230A38C: .word ov11_02324D98 - arm_func_end ov11_0230A31C - - arm_func_start ov11_0230A390 -ov11_0230A390: ; 0x0230A390 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x1b4 - ldr r0, _0230AD0C ; =ov11_02324D98 - ldr sb, [r0, #4] - ldr r0, [sb] - cmp r0, #0xe - addls pc, pc, r0, lsl #2 - b _0230AD00 -_0230A3B0: ; jump table - b _0230A3EC ; case 0 - b _0230A41C ; case 1 - b _0230A4B8 ; case 2 - b _0230A510 ; case 3 - b _0230A68C ; case 4 - b _0230A68C ; case 5 - b _0230A6C8 ; case 6 - b _0230A6E4 ; case 7 - b _0230A750 ; case 8 - b _0230A844 ; case 9 - b _0230A958 ; case 10 - b _0230A98C ; case 11 - b _0230A9D0 ; case 12 - b _0230AB1C ; case 13 - b _0230ACE4 ; case 14 -_0230A3EC: - ldr r0, [sb, #8] - ldrb r0, [r0, #1] - cmp r0, #0x64 - bhs _0230A410 - ldr r0, [sb, #4] - cmp r0, #0 - ble _0230A410 - mov r0, #1 - bl sub_02017C50 -_0230A410: - mov r0, #1 - str r0, [sb] - b _0230AD00 -_0230A41C: - ldr r5, [sb, #8] - ldrb r2, [r5, #1] - cmp r2, #0x64 - bhs _0230A440 - ldrb r1, [sb, #0xd] - ldr r0, [sb, #4] - add r0, r1, r0 - cmp r2, r0 - blt _0230A44C -_0230A440: - mov r0, #0xd - str r0, [sb] - b _0230AD00 -_0230A44C: - mov r0, #0x100 - mov r1, #0xf - bl MemAlloc - mov r4, r0 - mov r0, r5 - bl sub_020546E8 - add r0, sp, #0x164 - bl InitPreprocessorArgs - mov r0, r5 - bl sub_02055894 - bl sub_020564B0 - mov r2, r0 - mov r0, r4 - mov r1, r5 - bl sub_02056094 - str r4, [sp, #0x19c] - ldrb r2, [r5, #1] - ldr r1, _0230AD10 ; =0x000004A6 - mov r0, #0x1c - str r2, [sp, #0x188] - add r2, sp, #0x164 - bl sub_02046BE8 - mov r0, r4 - bl MemFree - mov r0, #2 - str r0, [sb] - b _0230AD00 -_0230A4B8: - bl sub_02046C78 - cmp r0, #0 - movne r0, #6 - moveq r0, #0 - cmp r0, #6 - bne _0230AD00 -#ifdef JAPAN - ldr r0, [sb, #8] - ldr r3, _0230C2B4 ; =0x000003E7 - ldrsh r1, [r0, #4] - ldrb r2, [r0, #1] - add r0, sb, #0x54 -#else - ldr r3, [sb, #8] - add r0, sb, #0x54 - ldrsh r1, [r3, #4] - ldrb r2, [r3, #1] - ldrsh r3, [r3, #8] -#endif - bl sub_02053A0C - strh r0, [sb, #0x50] - mov r0, #0 - strh r0, [sb, #0x52] - ldrh r0, [sb, #0x50] - cmp r0, #0 - movne r0, #3 - strne r0, [sb] - moveq r0, #1 - streq r0, [sb] - b _0230AD00 -_0230A510: - ldrh r1, [sb, #0x52] - ldrh r0, [sb, #0x50] - ldr r4, [sb, #8] - mov r8, #0 - cmp r1, r0 - movhs r0, #1 - sub r5, r8, #1 - strhs r0, [sb] - bhs _0230AD00 - mov sl, r8 - add r2, sb, r1, lsl #1 - mov r6, r8 - mov r7, #1 - mov r0, #6 - b _0230A58C -_0230A54C: - mla r3, sl, r0, r4 - ldrb r1, [r3, #0x22] - tst r1, #1 - movne r1, r7 - moveq r1, r6 - tst r1, #0xff - beq _0230A580 - ldrh r3, [r3, #0x24] - ldrh r1, [r2, #0x54] - cmp r3, r1 - bne _0230A588 - mov r8, #1 - b _0230A594 -_0230A580: - cmp r5, #0 - movlt r5, sl -_0230A588: - add sl, sl, #1 -_0230A58C: - cmp sl, #4 - blt _0230A54C -_0230A594: - cmp r8, #0 - ldrneh r0, [sb, #0x52] - addne r0, r0, #1 - strneh r0, [sb, #0x52] - bne _0230AD00 - add r0, sp, #0x114 - bl InitPreprocessorArgs - mov r0, #0x100 - mov r1, #0xf - bl MemAlloc - mov r6, r0 - mov r0, r4 - bl sub_02055894 - bl sub_020564B0 - mov r2, r0 - mov r0, r6 - mov r1, r4 - bl sub_02056094 - str r6, [sp, #0x14c] - cmp r5, #0 - blt _0230A644 - ldrh r1, [sb, #0x52] - add r2, r4, #0x22 - mov r0, #6 - add r1, sb, r1, lsl #1 - mla r0, r5, r0, r2 - ldrh r1, [r1, #0x54] - bl GetInfoMoveGround - ldrh r2, [sb, #0x52] - ldr r0, _0230AD14 ; =0x0000131B - mov r1, #0x100 - add r2, sb, r2, lsl #1 - ldrh r2, [r2, #0x54] - str r2, [sp, #0x124] - bl sub_02017C74 - ldr r1, _0230AD18 ; =0x000004A8 - add r2, sp, #0x114 - mov r0, #0x1c - bl sub_02046BE8 - ldrh r1, [sb, #0x52] - mov r0, #4 - add r1, r1, #1 - strh r1, [sb, #0x52] - b _0230A67C -_0230A644: - ldrsh r2, [r4, #4] - ldr r0, _0230AD1C ; =0xFFFFFE5E - ldr r1, _0230AD20 ; =0x000004A9 -#ifdef JAPAN - add r0, r2, r0 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - cmp r0, #3 - addls r1, r1, #1 -#else - add r2, r2, r0 - mov r2, r2, lsl #0x10 - mov r2, r2, asr #0x10 - mov r2, r2, lsl #0x10 - mov r2, r2, lsr #0x10 - cmp r2, #3 - rsbls r1, r0, #0x308 -#endif - add r2, sp, #0x114 - mov r0, #0x1c - bl sub_02046BE8 - mov r0, #5 -_0230A67C: - str r0, [sb] - mov r0, r6 - bl MemFree - b _0230AD00 -_0230A68C: - bl sub_02046C78 - cmp r0, #0 - movne r0, #6 - moveq r0, #0 - cmp r0, #6 - bne _0230AD00 - ldr r0, [sb] - cmp r0, #5 - moveq r0, #0 - streqh r0, [sb, #0x76] - moveq r0, #6 - streq r0, [sb] - movne r0, #1 - strne r0, [sb] - b _0230AD00 -_0230A6C8: - bl sub_02046D20 - mov r0, #7 - str r0, [sb] - bl sub_020037A4 - add r0, r0, #0xa - str r0, [sb, #0x144] - b _0230AD00 -_0230A6E4: - bl sub_020037A4 - ldr r1, [sb, #0x144] - cmp r1, r0 - bge _0230AD00 - ldr r1, _0230AD0C ; =ov11_02324D98 - mvn r0, #1 - ldr r4, [r1, #4] - ldrsb r1, [r4, #0x74] - cmp r1, r0 - bne _0230A744 - ldrh r0, [r4, #0x52] - add r0, r4, r0, lsl #1 - ldrh r0, [r0, #0x54] - bl sub_0203FD14 - ldr r0, [r4, #8] - bl sub_02055894 - bl sub_0203FA64 - mov r1, #0 - mov r2, r1 - mov r0, #3 - bl sub_0204018C - strb r0, [r4, #0x74] - ldrsh r0, [r4, #0x76] - bl sub_020410A4 -_0230A744: - mov r0, #8 - str r0, [sb] - b _0230AD00 -_0230A750: - bl sub_020407EC - cmp r0, #1 - beq _0230AD00 - cmp r0, #7 - bne _0230A7A4 - bl sub_02041094 - strh r0, [sb, #0x76] - bl sub_0203FD38 - mov r1, r0 - add r0, sb, #0x7a - mov r2, #0x20 - bl MemcpySimple - ldrh r1, [sb, #0x52] - add r0, sb, #0x9a - add r1, sb, r1, lsl #1 - ldrh r1, [r1, #0x54] - bl InitMove - bl ov11_0230ADCC - mov r0, #0xa - str r0, [sb] - b _0230AD00 -_0230A7A4: - cmp r0, #2 - bne _0230AD00 - bl sub_02041094 - strh r0, [sb, #0x76] - add r0, sb, #0xa4 - mov r1, #0x98 - bl MemZero - mov r2, #0 - mov r1, r2 -_0230A7C8: - add r0, sb, r2 - add r2, r2, #1 - strb r1, [r0, #0x13c] - cmp r2, #5 - blt _0230A7C8 - ldrsh r0, [sb, #0x76] - cmp r0, #4 - bge _0230A7F4 - bl sub_02041364 - cmp r0, #0 - bne _0230A7FC -_0230A7F4: - mov r0, #3 - strb r0, [sb, #0x13d] -_0230A7FC: - ldr r0, _0230AD0C ; =ov11_02324D98 - ldr r1, _0230AD24 ; =ov11_02322F5C - ldrsb r3, [r0] - add r2, sb, #0x13c - ldr r0, _0230AD28 ; =ov11_02322F58 - ldr r3, [r1, r3, lsl #3] - mov r1, #0 - str r3, [sb, #0xa4] - str r2, [sb, #0x104] - stmia sp, {r0, r1} - ldr r0, _0230AD2C ; =ov11_02322F30 - ldr r2, _0230AD30 ; =0x00000233 - add r3, sb, #0xa4 - str r1, [sp, #8] - bl sub_02046A20 - mov r0, #9 - str r0, [sb] - b _0230AD00 -_0230A844: - bl ov11_0230AD94 - mov r4, r0 - bl sub_02046BA0 - ldr r1, _0230AD0C ; =ov11_02324D98 - cmp r4, #6 - strb r0, [r1] - bne _0230A870 - bl sub_020416FC - mov r0, #6 - str r0, [sb] - b _0230AD00 -_0230A870: - cmp r4, #1 - bne _0230A8F8 - ldrsh r0, [sb, #0x76] - cmp r0, #4 - bge _0230A890 - bl sub_02041364 - cmp r0, #0 - bne _0230A898 -_0230A890: - ldr r4, _0230AD34 ; =0x000004AC - b _0230A89C -_0230A898: - ldr r4, _0230AD38 ; =0x000004AB -_0230A89C: - add r0, sp, #0xc4 - bl InitPreprocessorArgs - ldrsh r0, [sb, #0x76] - bl sub_02041154 - str r0, [sp, #0xd4] - bl ov11_0230ADCC - add r0, sb, #0xa4 - mov r1, #0x98 - bl MemZero - mov r0, #5 - str r0, [sb, #0xa4] - ldr r1, _0230AD3C ; =ov11_02322F40 - add r0, sp, #0xc4 - stmia sp, {r1, r4} - str r0, [sp, #8] - mov r0, #0 - mov r1, r0 - mov r2, #0x33 - add r3, sb, #0xa4 - bl sub_02046A20 - mov r0, #0xc - str r0, [sb] - b _0230AD00 -_0230A8F8: - cmp r4, #2 - bne _0230A918 - ldrsh r0, [sb, #0x76] - bl sub_02041394 - bl ov11_0230ADCC - mov r0, #6 - str r0, [sb] - b _0230AD00 -_0230A918: - cmp r4, #3 - bne _0230AD00 - bl sub_0203FD38 - mov r1, r0 - add r0, sb, #0x7a - mov r2, #0x20 - bl MemcpySimple - ldrh r1, [sb, #0x52] - add r0, sb, #0x9a - add r1, sb, r1, lsl #1 - ldrh r1, [r1, #0x54] - bl InitMove - bl ov11_0230ADCC - mov r0, #0xa - str r0, [sb] - b _0230AD00 -_0230A958: - ldrsb r1, [sb, #0x78] - mvn r0, #1 - cmp r1, r0 - bne _0230A980 - ldrsh r2, [sb, #0x76] - add r0, sb, #0x7a - mov r1, #5 - mov r3, #1 - bl sub_020417A8 - strb r0, [sb, #0x78] -_0230A980: - mov r0, #0xb - str r0, [sb] - b _0230AD00 -_0230A98C: - bl sub_02041A18 - cmp r0, #1 - bne _0230AD00 - ldr r1, _0230AD0C ; =ov11_02324D98 - mvn r0, #1 - ldr r4, [r1, #4] - ldrsb r1, [r4, #0x78] - cmp r1, r0 - beq _0230A9C4 - bl sub_02041A00 - ldrsb r0, [r4, #0x78] - bl CloseScrollBox - mvn r0, #1 - strb r0, [r4, #0x78] -_0230A9C4: - mov r0, #6 - str r0, [sb] - b _0230AD00 -_0230A9D0: - bl ov11_0230AD94 - cmp r0, #4 - bne _0230AB08 - ldrsh r0, [sb, #0x76] - cmp r0, #4 - blt _0230AA00 - ldrh r1, [sb, #0x52] - mov r0, #1 - add r1, r1, #1 - strh r1, [sb, #0x52] - str r0, [sb] - b _0230AAFC -_0230AA00: - ldr r7, [sb, #8] - mvn r5, #0 - bl sub_02041484 - bl sub_0203FD38 - mov r6, r0 - mov r8, #0 - add r4, r7, #0x22 - mov fp, #6 -_0230AA20: - mul sl, r8, fp - add r0, r4, sl - add r1, r6, r8, lsl #3 - bl DungeonMoveToGroundMove - cmp r5, #0 - bge _0230AA54 - add r0, r7, sl - ldrb r0, [r0, #0x22] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - moveq r5, r8 -_0230AA54: - add r8, r8, #1 - cmp r8, #4 - blt _0230AA20 - add r0, sp, #0x74 - bl InitPreprocessorArgs - mov r0, #0x100 - mov r1, #0xf - bl MemAlloc - mov r4, r0 - mov r0, r7 - bl sub_02055894 - bl sub_020564B0 - mov r2, r0 - mov r0, r4 - mov r1, r7 - bl sub_02056094 - add r1, r7, #0x22 - mov r0, #6 - str r4, [sp, #0xac] - mla r0, r5, r0, r1 - ldrh r1, [sb, #0x52] - add r1, sb, r1, lsl #1 - ldrh r1, [r1, #0x54] - bl GetInfoMoveGround - ldrh r2, [sb, #0x52] - ldr r0, _0230AD14 ; =0x0000131B - mov r1, #0x100 - add r2, sb, r2, lsl #1 - ldrh r2, [r2, #0x54] - str r2, [sp, #0x84] - bl sub_02017C74 - ldr r1, _0230AD18 ; =0x000004A8 - mov r0, #0x1c - add r2, sp, #0x74 - bl sub_02046BE8 - ldrh r2, [sb, #0x52] - mov r0, r4 - mov r1, #4 - add r2, r2, #1 - strh r2, [sb, #0x52] - str r1, [sb] - bl MemFree -_0230AAFC: - mov r0, #0 - bl sub_020410A4 - b _0230AD00 -_0230AB08: - sub r0, r0, #5 - cmp r0, #1 - movls r0, #6 - strls r0, [sb] - b _0230AD00 -_0230AB1C: - mov r0, #0x400 - mov r1, #0xf - ldr r6, [sb, #8] - mov r7, #0 - bl MemAlloc - mov r4, r0 - mov r0, #0x100 - mov r1, #0xf - bl MemAlloc - str r0, [sp, #0xc] - mov r0, #0x100 - mov r1, #0xf - bl MemAlloc - mov r5, r0 - mov r0, r7 - strb r0, [r4] - mov r0, r6 - bl sub_02055894 - bl sub_020564B0 - mov r2, r0 - mov r0, r5 - mov r1, r6 - bl sub_02056094 - add r0, sp, #0x24 - bl InitPreprocessorArgs - mov r8, r7 - ldrb r1, [r6, #0xc] - ldrb r0, [sb, #0x18] - ldrsh r3, [r6, #0xa] - ldrsh r2, [sb, #0x16] - sub r0, r1, r0 - str r0, [sp, #0x14] - sub r2, r3, r2 - str r2, [sp, #0x10] - ldrb r1, [r6, #0xe] - ldrb r0, [sb, #0x1a] - ldrb r3, [r6, #0xd] - ldrb r2, [sb, #0x19] - sub r0, r1, r0 - str r0, [sp, #0x1c] - sub r2, r3, r2 - ldrb r1, [r6, #0xf] - ldrb r0, [sb, #0x1b] - str r2, [sp, #0x18] - mov sl, r8 - sub r0, r1, r0 - str r0, [sp, #0x20] -_0230ABD8: - add r0, sp, #0x10 - ldr fp, [r0, sl, lsl #2] - cmp fp, #0 - ble _0230AC58 - cmp r7, #0 - beq _0230AC10 - cmp r8, #3 - beq _0230AC04 - ldr r1, _0230AD40 ; =ov11_02322F80 - mov r0, r4 - bl strcat -_0230AC04: - ldr r1, _0230AD44 ; =ov11_02322F84 - mov r0, r4 - bl strcat -_0230AC10: - add r0, sp, #0x24 - ldr r2, _0230AD48 ; =ov11_02322F24 - mov r3, sl, lsl #1 - ldrh r2, [r2, r3] - str r5, [sp, #0x5c] - add r0, r0, sl, lsl #2 - str fp, [r0, #0x24] - add r0, sp, #0x24 - str r0, [sp] - ldr r0, [sp, #0xc] - mov r1, #0x100 - mov r3, #0 - bl PreprocessStringFromId - ldr r1, [sp, #0xc] - mov r0, r4 - bl strcat - mov r7, #1 - add r8, r8, #1 -_0230AC58: - add sl, sl, #1 - cmp sl, #5 - blt _0230ABD8 - ldr r1, _0230AD44 ; =ov11_02322F84 - mov r0, r4 - bl strcat - cmp r7, #0 - beq _0230AC8C - add r2, sp, #0x24 - mov r1, r4 - mov r0, #0x1c - bl sub_02046C30 - b _0230ACB4 -_0230AC8C: - ldrb r1, [r6, #1] - ldrb r0, [sb, #0xd] - cmp r1, r0 - bne _0230ACB4 - ldr r1, _0230AD4C ; =0x000004A7 - add r2, sp, #0x24 - mov r0, #0x1c - str r5, [sp, #0x5c] - bl sub_02046BE8 - mov r7, #1 -_0230ACB4: - mov r0, r4 - bl MemFree - ldr r0, [sp, #0xc] - bl MemFree - mov r0, r5 - bl MemFree - cmp r7, #0 - movne r0, #0xe - strne r0, [sb] - bne _0230AD00 - mov r0, #1 - b _0230AD04 -_0230ACE4: - bl sub_02046C78 - cmp r0, #0 - movne r0, #6 - moveq r0, #0 - cmp r0, #6 - moveq r0, #1 - beq _0230AD04 -_0230AD00: - mov r0, #0 -_0230AD04: - add sp, sp, #0x1b4 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -#define OV11_0230A390_OFFSET 0x3725 -#else -#define OV11_0230A390_OFFSET 0 -#endif -_0230AD0C: .word ov11_02324D98 -_0230AD10: .word 0x000004A6 + OV11_0230A390_OFFSET -#ifdef JAPAN -_0230C2B4: .word 0x000003E7 -#endif -_0230AD14: .word 0x0000131B -_0230AD18: .word 0x000004A8 + OV11_0230A390_OFFSET -_0230AD1C: .word 0xFFFFFE5E -_0230AD20: .word 0x000004A9 + OV11_0230A390_OFFSET -_0230AD24: .word ov11_02322F5C -_0230AD28: .word ov11_02322F58 -_0230AD2C: .word ov11_02322F30 -_0230AD30: .word 0x00000233 -_0230AD34: .word 0x000004AC + OV11_0230A390_OFFSET -_0230AD38: .word 0x000004AB + OV11_0230A390_OFFSET -_0230AD3C: .word ov11_02322F40 -_0230AD40: .word ov11_02322F80 -_0230AD44: .word ov11_02322F84 -_0230AD48: .word ov11_02322F24 -_0230AD4C: .word 0x000004A7 + OV11_0230A390_OFFSET - arm_func_end ov11_0230A390 - - arm_func_start ov11_0230AD50 -ov11_0230AD50: ; 0x0230AD50 - stmdb sp!, {r3, lr} - ldr r0, _0230AD78 ; =ov11_02324D98 - ldr r0, [r0, #4] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl MemFree - ldr r0, _0230AD78 ; =ov11_02324D98 - mov r1, #0 - str r1, [r0, #4] - ldmia sp!, {r3, pc} - .align 2, 0 -_0230AD78: .word ov11_02324D98 - arm_func_end ov11_0230AD50 - - arm_func_start IsGroundMonsterAtMaxLevel -IsGroundMonsterAtMaxLevel: ; 0x0230AD7C - ldrb r0, [r0, #1] - cmp r0, #0x64 - movhs r0, #1 - movlo r0, #0 - and r0, r0, #0xff - bx lr - arm_func_end IsGroundMonsterAtMaxLevel - - arm_func_start ov11_0230AD94 -ov11_0230AD94: ; 0x0230AD94 - stmdb sp!, {r3, lr} - bl sub_02046B04 - mvn r2, #0 - cmp r0, r2 - moveq r0, #0 - ldmeqia sp!, {r3, pc} - sub r1, r2, #1 - cmp r0, r1 - moveq r0, #6 - ldmeqia sp!, {r3, pc} - sub r1, r2, #2 - cmp r0, r1 - moveq r0, #6 - ldmia sp!, {r3, pc} - arm_func_end ov11_0230AD94 - - arm_func_start ov11_0230ADCC -ov11_0230ADCC: ; 0x0230ADCC - stmdb sp!, {r4, lr} - ldr r1, _0230AE0C ; =ov11_02324D98 - mvn r0, #1 - ldr r4, [r1, #4] - ldrsb r1, [r4, #0x74] - cmp r1, r0 - ldmeqia sp!, {r4, pc} - ldr r0, [r4, #8] - bl sub_02055894 - bl sub_0203FD80 - bl sub_020407C0 - ldrsb r0, [r4, #0x74] - bl CloseAdvancedTextBox - mvn r0, #1 - strb r0, [r4, #0x74] - ldmia sp!, {r4, pc} - .align 2, 0 -_0230AE0C: .word ov11_02324D98 - arm_func_end ov11_0230ADCC - - arm_func_start ov11_0230AE10 -ov11_0230AE10: ; 0x0230AE10 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldr r0, [r5] - cmp r0, #0 - cmpne r0, #1 - ldmneia sp!, {r3, r4, r5, pc} - mov r0, #0x10 - mov r1, #8 - bl MemAlloc - ldr r2, _0230AE78 ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR - mov r1, #0x10 - str r0, [r2] - bl MemZero - ldr r0, _0230AE78 ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR - ldmia r5, {r1, r2} - ldr r4, [r0] - str r1, [r4] - add r0, r4, #0xc - add r1, r4, #0xe - str r2, [r4, #4] - bl ov11_0230C050 - ldr r1, _0230AE7C ; =ov11_02322F98 - ldr r2, _0230AE80 ; =GetExclusiveItemRequirements - add r0, r4, #8 - bl sub_0204707C - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230AE78: .word EXCLUSIVE_ITEM_REQUIREMENTS_PTR -_0230AE7C: .word ov11_02322F98 -_0230AE80: .word GetExclusiveItemRequirements - arm_func_end ov11_0230AE10 - - arm_func_start ov11_0230AE84 -ov11_0230AE84: ; 0x0230AE84 - stmdb sp!, {r3, lr} - ldr r0, _0230AECC ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR - ldr r0, [r0] - cmp r0, #0 - ldrne r0, [r0, #8] - cmpne r0, #0 - beq _0230AEC4 - bl sub_020470D0 - ldr r0, _0230AECC ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR - ldr r0, [r0] - ldr r0, [r0, #8] - bl sub_02047148 - mvn r1, #0 - cmp r0, r1 - moveq r0, #1 - ldmeqia sp!, {r3, pc} -_0230AEC4: - mov r0, #0 - ldmia sp!, {r3, pc} - .align 2, 0 -_0230AECC: .word EXCLUSIVE_ITEM_REQUIREMENTS_PTR - arm_func_end ov11_0230AE84 - - arm_func_start ov11_0230AED0 -ov11_0230AED0: ; 0x0230AED0 - stmdb sp!, {r3, lr} - ldr r0, _0230AF08 ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR - ldr r0, [r0] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - add r0, r0, #8 - bl sub_02047150 - ldr r0, _0230AF08 ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR - ldr r0, [r0] - bl MemFree - ldr r0, _0230AF08 ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR - mov r1, #0 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_0230AF08: .word EXCLUSIVE_ITEM_REQUIREMENTS_PTR - arm_func_end ov11_0230AED0 - - arm_func_start ov11_0230AF0C -ov11_0230AF0C: ; 0x0230AF0C - ldr r1, _0230AF30 ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR - ldr r2, [r0] - ldr r3, [r1] - ldr r1, [r0, #4] - ldr ip, _0230AF34 ; =sub_02047188 - str r2, [r3] - add r0, r3, #8 - str r1, [r3, #4] - bx ip - .align 2, 0 -_0230AF30: .word EXCLUSIVE_ITEM_REQUIREMENTS_PTR -_0230AF34: .word sub_02047188 - arm_func_end ov11_0230AF0C - - arm_func_start GetExclusiveItemRequirements -GetExclusiveItemRequirements: ; 0x0230AF38 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x15c - ldr r1, _0230B1DC ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR - mov r7, r0 - ldr r6, [r1] - add r0, sp, #0xa - ldrsh r8, [r6, #4] - mov r2, #0 - mov r3, #1 - add r1, sp, #4 - strh r8, [sp, #8] - strh r2, [sp, #6] - strb r3, [sp, #4] - mov sb, #0x10 - bl MaybeGetColoredFormattedItemName - add r0, sp, #0x10c - bl InitPreprocessorArgs - mov r0, r7 - mov r1, #0x18 - mov r2, sb - add r3, sp, #0xa - bl DrawTextInWindow - mov r0, r8 - bl ov11_0230C068 - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0230AFF8 -_0230AFA4: ; jump table - b _0230AFB4 ; case 0 - b _0230AFB4 ; case 1 - b _0230AFCC ; case 2 - b _0230AFE4 ; case 3 -_0230AFB4: - ldr r3, _0230B1E0 ; =SWAP_SHOP_ONE_STAR_STR - mov r0, r7 - mov r1, #0x6c - mov r2, sb - bl DrawTextInWindow - b _0230AFF8 -_0230AFCC: - ldr r3, _0230B1E4 ; =SWAP_SHOP_TWO_STAR_STR - mov r0, r7 - mov r1, #0x6c - mov r2, sb - bl DrawTextInWindow - b _0230AFF8 -_0230AFE4: - ldr r3, _0230B1E8 ; =SWAP_SHOP_THREE_STAR_STR - mov r0, r7 - mov r1, #0x6c - mov r2, sb - bl DrawTextInWindow -_0230AFF8: - ldr r0, [r6] - cmp r0, #0 - bne _0230B144 - ldr r3, _0230B1EC ; =0x000004B2 - mov r0, r7 - mov r1, #0x18 - mov r2, #0x28 - mov r4, #0 - bl AppendStandardStringToMission - ldr r3, _0230B1F0 ; =0x000004B3 - mov r0, r7 - mov r1, #0x7a - mov r2, #0x28 - bl AppendStandardStringToMission - mov r0, r8 - add sb, sb, #0x30 - bl GetExclusiveItemType - cmp r0, #0xa - addls pc, pc, r0, lsl #2 - b _0230B0E0 -_0230B048: ; jump table - b _0230B0E0 ; case 0 - b _0230B0E0 ; case 1 - b _0230B0E0 ; case 2 - b _0230B074 ; case 3 - b _0230B088 ; case 4 - b _0230B0E0 ; case 5 - b _0230B0E0 ; case 6 - b _0230B074 ; case 7 - b _0230B088 ; case 8 - b _0230B0E0 ; case 9 - b _0230B09C ; case 10 -_0230B074: - sub r0, r8, #2 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 - mov r4, #2 - b _0230B0E0 -_0230B088: - sub r0, r8, #3 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 - mov r4, #3 - b _0230B0E0 -_0230B09C: - sub r0, r8, #0x1bc - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - cmp r0, #7 - ldrls r5, _0230B1F4 ; =0x000002FE - movls r4, #3 - bls _0230B0E0 - sub r0, r8, #0x1c4 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - cmp r0, #3 - ldrls r5, _0230B1F8 ; =0x00000336 - movls r4, #3 -_0230B0E0: - mov sl, #0 - add fp, sp, #0x10c - b _0230B138 -_0230B0EC: - mov r0, r5 - str r5, [sp, #0x11c] - bl CountNbItemsOfTypeInBag - mov r8, r0 - mov r0, r5 - bl CountNbItemsOfTypeInStorage - add r0, r8, r0 - str r0, [sp, #0x130] - ldr r3, _0230B1FC ; =0x000004B5 - mov r0, r7 - mov r1, #0x18 - mov r2, sb - str fp, [sp] - bl sub_020262E0 - add r0, r5, #1 - mov r0, r0, lsl #0x10 - add sb, sb, #0xc - mov r5, r0, asr #0x10 - add sl, sl, #1 -_0230B138: - cmp sl, r4 - blt _0230B0EC - b _0230B184 -_0230B144: - cmp r0, #1 - bne _0230B184 - ldr r3, _0230B1EC ; =0x000004B2 - mov r0, r7 - mov r1, #0x18 - mov r2, #0x28 - bl AppendStandardStringToMission - ldrh r0, [r6, #6] - ldr r3, _0230B200 ; =0x000004B4 - add r4, sp, #0x10c - str r0, [sp, #0x130] - mov r0, r7 - mov r1, #0x18 - mov r2, #0x40 - str r4, [sp] - bl sub_020262E0 -_0230B184: - ldrh r0, [r6, #0xc] - add r1, sp, #0x10c - ldr r3, _0230B204 ; =0x000004B6 - str r0, [sp, #0x130] - str r1, [sp] - mov r0, r7 - mov r1, #0x1c - mov r2, #0x7e - bl sub_020262E0 - ldrh r0, [r6, #0xe] - ldr r3, _0230B208 ; =0x000004B7 - add r4, sp, #0x10c - str r0, [sp, #0x130] - mov r0, r7 - mov r1, #0x1c - mov r2, #0x8a - str r4, [sp] - bl sub_020262E0 - mov r0, r7 - bl UpdateWindow - add sp, sp, #0x15c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -#define GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET 0x3528 -#else -#define GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET 0 -#endif -_0230B1DC: .word EXCLUSIVE_ITEM_REQUIREMENTS_PTR -_0230B1E0: .word SWAP_SHOP_ONE_STAR_STR -_0230B1E4: .word SWAP_SHOP_TWO_STAR_STR -_0230B1E8: .word SWAP_SHOP_THREE_STAR_STR -_0230B1EC: .word 0x000004B2 + GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET -_0230B1F0: .word 0x000004B3 + GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET -_0230B1F4: .word 0x000002FE -_0230B1F8: .word 0x00000336 -_0230B1FC: .word 0x000004B5 + GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET -_0230B200: .word 0x000004B4 + GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET -_0230B204: .word 0x000004B6 + GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET -_0230B208: .word 0x000004B7 + GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET - arm_func_end GetExclusiveItemRequirements - - arm_func_start SwapShopInventoryManager -SwapShopInventoryManager: ; 0x0230B20C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x20 - ldr r2, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS - mov r4, r0 - ldr r0, [r2, #4] - mov r8, r1 - cmp r0, #0 - ldr r5, _0230B668 ; =0x00401A33 - mov r6, #0 - ldr r7, _0230B66C ; =ov11_0230BD5C - bne _0230B24C - ldr r0, _0230B670 ; =0x000046D4 - mov r1, #8 - bl MemAlloc - ldr r1, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS - str r0, [r1, #4] -_0230B24C: - ldr r0, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - str r4, [r0] - bl ov11_0230BF98 - bl LoadSynthBin - ldr sb, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS - mov r2, #0 - ldr r3, [sb, #4] - mov r1, #0x10 - add r3, r3, #0x4000 - strb r0, [r3, #0x6c4] - ldr r0, [sb, #4] - cmp r4, #3 - add r0, r0, #0x4000 - str r2, [r0, #0x6c8] - ldr r0, [sb, #4] - add r0, r0, #0x4000 - str r2, [r0, #0x6cc] - ldr r0, [sb, #4] - add r0, r0, #0x4000 - str r1, [r0, #0x638] - addls pc, pc, r4, lsl #2 - b _0230B474 -_0230B2A8: ; jump table - b _0230B2B8 ; case 0 - b _0230B2EC ; case 1 - b _0230B308 ; case 2 - b _0230B428 ; case 3 -_0230B2B8: - bl ov11_0230C3CC - bl ov11_0230C61C - mov r0, sb - ldr r0, [r0, #4] - add r0, r0, #0xe6 - add r0, r0, #0x4500 - bl GetCroagunkItemTemplates - mov r0, sb - ldr r0, [r0, #4] - ldr r1, _0230B674 ; =0x000003A6 - add r0, r0, #0x4600 - strh r1, [r0, #0x34] - b _0230B474 -_0230B2EC: - bl ov11_0230C4D4 - mov r0, sb - ldr r0, [r0, #4] - ldr r1, _0230B678 ; =0x000003A7 - add r0, r0, #0x4600 - strh r1, [r0, #0x34] - b _0230B474 -_0230B308: - mov r0, r8, lsl #0x10 - mov r0, r0, asr #0x10 - bl sub_02011420 - mov sb, #0 - mov sl, sb - str r0, [sp, #0x14] - mov fp, sb - b _0230B370 -_0230B328: - ldr r1, [r1] - mov r0, sl, lsl #1 - ldrsh r0, [r1, r0] - bl GetExclusiveItemType - cmp r0, #1 - blt _0230B348 - cmp r0, #4 - ble _0230B36C -_0230B348: - ldr r1, [sp, #0x14] - mov r0, sb, lsl #0x10 - ldr r2, [r1] - mov r1, sl, lsl #1 - ldrh r2, [r2, r1] - mov r1, fp - mov r0, r0, lsr #0x10 - bl ov11_0230C924 - add sb, sb, #1 -_0230B36C: - add sl, sl, #1 -_0230B370: - ldr r1, [sp, #0x14] - ldr r0, [r1, #4] - cmp sl, r0 - blt _0230B328 - mov sl, #0 - mov fp, sl - b _0230B3D4 -_0230B38C: - ldr r1, [r0] - mov r0, sl, lsl #1 - ldrsh r0, [r1, r0] - bl GetExclusiveItemType - cmp r0, #1 - blt _0230B3D0 - cmp r0, #4 - bgt _0230B3D0 - ldr r1, [sp, #0x14] - mov r0, sb, lsl #0x10 - ldr r2, [r1] - mov r1, sl, lsl #1 - ldrh r2, [r2, r1] - mov r1, fp - mov r0, r0, lsr #0x10 - bl ov11_0230C924 - add sb, sb, #1 -_0230B3D0: - add sl, sl, #1 -_0230B3D4: - ldr r0, [sp, #0x14] - ldr r2, [r0, #4] - cmp sl, r2 - blt _0230B38C - ldr r1, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS - add r0, sp, #0x14 - ldr r1, [r1, #4] - add r1, r1, #0x4600 - strh r2, [r1, #0x26] - bl SwapShopFreeDoublePointer - ldr r1, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS - mov r0, r8, lsl #0x10 - ldr r2, [r1, #4] - mov r3, r0, asr #0x10 - add r0, r2, #0x4000 - str r3, [r0, #0x63c] - ldr r0, [r1, #4] -#ifdef JAPAN - ldr r1, _0230CC20_JP ; =0x000032B2 -#else - mov r1, #0x3a8 -#endif - add r0, r0, #0x4600 - strh r1, [r0, #0x34] - b _0230B474 -_0230B428: - add r1, sp, #0xc - add r2, sp, #0xe - mov r0, #1 - bl ov11_0230C1D0 - mov r3, sb - ldr r1, [r3, #4] - ldr r7, _0230B67C ; =0x0000032F - add r1, r1, #0x4600 - strh r0, [r1, #0x26] - ldr r0, [r3, #4] - ldr r2, _0230B680 ; =0x80040004 - add r0, r0, #0x4600 - strh r7, [r0, #0x34] - ldr r0, [r3, #4] - ldr r6, _0230B684 ; =ov11_0230B78C - add r0, r0, #0x4600 - ldr r7, _0230B688 ; =ov11_0230BE34 - strh r8, [r0, #0x28] - orr r5, r5, r2 -_0230B474: - cmp r4, #0 - bne _0230B5A8 - ldr r0, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS - mov r1, #6 - ldrsh r2, [r0] - ldr r0, [r0, #4] - add r0, r0, #0xe6 - smulbb r8, r2, r1 - add sb, r0, #0x1400 - ldrh r0, [sb, r8] - add sl, sb, r8 - bl ov11_0230C9EC - ldr r1, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS - str r0, [sp, #0x18] - ldrh r0, [r1] - bl ov11_0230C970 - strh r0, [sp, #0x1c] - ldrh r0, [sb, r8] - cmp r0, #1 - movne r0, #0 - strneh r0, [sp, #0x1e] - bne _0230B4E8 - ldr r0, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS - ldrh r1, [sl, #2] - ldr r0, [r0, #4] - add r0, r0, r1, lsl #3 - add r0, r0, #0x4500 - ldrh r0, [r0, #0xea] - strh r0, [sp, #0x1e] -_0230B4E8: - add r0, sp, #0x18 - bl ov11_0230AE10 - ldr r0, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS - add r1, sp, #0x12 - ldr r2, [r0, #4] - ldrsh r8, [r0] - add r3, r2, #0x4600 - add r2, sp, #0x10 - mov r0, #0 - strh r8, [r3, #0xd0] - bl ov11_0230C1D0 - ldr fp, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS - ldrh r2, [sp, #0x12] - ldr r0, [fp, #4] - ldrh r1, [sp, #0x10] - add r0, r0, #0x4600 - ldrh r8, [r0, #0x26] - add sb, r2, r1 - mov sl, #0 - b _0230B5A0 -_0230B538: - mov r0, sl, lsl #0x10 - mov r1, r0, lsr #0x10 - ldr r2, [fp, #4] - mov r0, #6 - mla r0, r1, r0, r2 - add r0, r0, #0x1400 - ldrh r0, [r0, #0xe6] - bl ov11_0230C9EC - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - cmp r0, #1 - bne _0230B59C - ldr r0, [fp, #4] - mov r1, #6 - mla r1, sl, r1, r0 - add r1, r1, #0x1400 - ldrh r1, [r1, #0xe8] - add r1, r0, r1, lsl #3 - add r1, r1, #0x4500 - ldrh r1, [r1, #0xea] - cmp r1, sb - addgt r0, r0, sl - addgt r1, r0, #0x1000 - movgt r0, #2 - strgtb r0, [r1, #0xb8] -_0230B59C: - add sl, sl, #1 -_0230B5A0: - cmp sl, r8 - blt _0230B538 -_0230B5A8: - ldr r8, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS - mov r1, r5 - ldr sb, [r8, #4] - mov r3, r7 - add r2, sb, #0x4600 - ldrh r2, [r2, #0x26] - ldr r0, _0230B68C ; =ov11_02322FE4 - mov r5, #8 - str r2, [sb, #4] - ldr r2, [r8, #4] - ldrsh r7, [r8] - add r2, r2, #0x4000 - str r7, [r2, #0x62c] - ldr sb, [r8, #4] - add r2, sb, #0xb8 - add r7, r2, #0x1000 - add r2, sb, #0x4000 - str r7, [r2, #0x68c] - ldr r2, [r8, #4] - str r6, [sp] - ldr r6, [r2, #4] - add r2, r2, #0x22c - str r6, [sp, #4] - add r2, r2, #0x4400 - str r5, [sp, #8] - bl CreateCollectionMenu - mov r2, r8 - ldr r1, [r2, #4] - cmp r4, #3 - add r1, r1, #0x1000 - strb r0, [r1, #0x4e4] - bne _0230B65C - ldr r0, [r2, #4] - mov r1, #1 - add r0, r0, #0x1400 - ldrsb r0, [r0, #0xe4] - bl SetCollectionMenuField0x1C8 - mov r0, r8 - ldr r0, [r0, #4] - ldr r1, _0230B690 ; =ov11_0230BF38 - add r0, r0, #0x1400 - ldrsb r0, [r0, #0xe4] - bl SetCollectionMenuField0x1A4 - bl ov11_0230CAA4 - bl ov11_0230C9F8 -_0230B65C: - add sp, sp, #0x20 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0230B664: .word SWAP_SHOP_INVENTORY_PTRS -_0230B668: .word 0x00401A33 -_0230B66C: .word ov11_0230BD5C -_0230B670: .word 0x000046D4 -#ifdef JAPAN -_0230B674: .word 0x000032B0 -_0230B678: .word 0x000032B1 -_0230CC20_JP: .word 0x000032B2 -_0230B67C: .word 0x000031F4 -#else -_0230B674: .word 0x000003A6 -_0230B678: .word 0x000003A7 -_0230B67C: .word 0x0000032F -#endif -_0230B680: .word 0x80040004 -_0230B684: .word ov11_0230B78C -_0230B688: .word ov11_0230BE34 -_0230B68C: .word ov11_02322FE4 -_0230B690: .word ov11_0230BF38 - arm_func_end SwapShopInventoryManager - - arm_func_start ov11_0230B694 -ov11_0230B694: ; 0x0230B694 - stmdb sp!, {r4, lr} - ldr r0, _0230B71C ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - cmp r0, #0 - bne _0230B6BC - ldr r0, _0230B720 ; =0x000046D4 - mov r1, #8 - bl MemAlloc - ldr r1, _0230B71C ; =SWAP_SHOP_INVENTORY_PTRS - str r0, [r1, #4] -_0230B6BC: - bl LoadSynthBin - mov r4, r0 - bl ov11_0230BF98 - bl ov11_0230C3CC - bl ov11_0230C61C - mov r0, #0 - bl GetCroagunkItemTemplates - ldr r1, _0230B71C ; =SWAP_SHOP_INVENTORY_PTRS - cmp r4, #0 - ldr r1, [r1, #4] - add r1, r1, #0x4600 - ldrh r1, [r1, #0x26] - add r4, r1, r0 - beq _0230B6F8 - bl CloseSynthBin -_0230B6F8: - ldr r0, _0230B71C ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - bl MemFree - ldr r1, _0230B71C ; =SWAP_SHOP_INVENTORY_PTRS - mov r0, #0 - str r0, [r1, #4] - cmp r4, #0 - movne r0, #1 - ldmia sp!, {r4, pc} - .align 2, 0 -_0230B71C: .word SWAP_SHOP_INVENTORY_PTRS -_0230B720: .word 0x000046D4 - arm_func_end ov11_0230B694 - - arm_func_start ov11_0230B724 -ov11_0230B724: ; 0x0230B724 - stmdb sp!, {r4, lr} - ldr r0, _0230B784 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - cmp r0, #0 - bne _0230B74C - ldr r0, _0230B788 ; =0x000046D4 - mov r1, #8 - bl MemAlloc - ldr r1, _0230B784 ; =SWAP_SHOP_INVENTORY_PTRS - str r0, [r1, #4] -_0230B74C: - bl ov11_0230BF98 - bl ov11_0230C4D4 - ldr r0, _0230B784 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - add r1, r0, #0x4600 - ldrh r4, [r1, #0x26] - bl MemFree - ldr r0, _0230B784 ; =SWAP_SHOP_INVENTORY_PTRS - mov r1, #0 - str r1, [r0, #4] - cmp r4, #0 - movne r1, #1 - and r0, r1, #0xff - ldmia sp!, {r4, pc} - .align 2, 0 -_0230B784: .word SWAP_SHOP_INVENTORY_PTRS -_0230B788: .word 0x000046D4 - arm_func_end ov11_0230B724 - - arm_func_start ov11_0230B78C -ov11_0230B78C: ; 0x0230B78C - stmdb sp!, {r3, r4, r5, lr} - ldr r1, _0230B870 ; =SWAP_SHOP_INVENTORY_PTRS - tst r0, #0x400 - ldr r4, [r1, #4] - beq _0230B868 - add r0, r4, #0x1400 - ldrsb r0, [r0, #0xe4] - bl GetWindowIdSelectedMenuItemIdx - add r1, r4, #0xe6 - add r2, r1, #0x1400 - mov r1, #6 - mla r5, r0, r1, r2 - ldrb r0, [r5, #4] - cmp r0, #0 - beq _0230B7E8 - mov r0, r1 - bl PlaySeVolumeWrapper - mov r1, #0 - strb r1, [r5, #4] - add r0, r4, #0x1400 - ldrsb r0, [r0, #0xe4] - bl sub_0202D07C - b _0230B83C -_0230B7E8: - bl ov11_0230B874 - add r1, r4, #0x4600 - ldrh r1, [r1, #0x28] - cmp r0, r1 - bge _0230B834 - mov r0, #6 - bl PlaySeVolumeWrapper - mov r0, #1 - strb r0, [r5, #4] - bl ov11_0230B874 - add r1, r4, #0x4600 - ldrh r1, [r1, #0x28] - cmp r1, r0 - bne _0230B83C - add r0, r4, #0x1400 - ldrsb r0, [r0, #0xe4] - mov r1, #1 - bl sub_0202D07C - b _0230B83C -_0230B834: - mov r0, #2 - bl PlaySeVolumeWrapper -_0230B83C: - ldr r0, _0230B870 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r1, [r0, #4] - add r0, r1, #0x4000 - ldr r0, [r0, #0x6c8] - cmp r0, #0 - beq _0230B860 - add r0, r1, #0x2c8 - add r0, r0, #0x4400 - bl sub_02047188 -_0230B860: - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_0230B868: - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230B870: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230B78C - - arm_func_start ov11_0230B874 -ov11_0230B874: ; 0x0230B874 - stmdb sp!, {r3, lr} - ldr r1, _0230B8BC ; =SWAP_SHOP_INVENTORY_PTRS - mov r0, #0 - ldr ip, [r1, #4] - mov r3, r0 - add r1, ip, #0x4600 - ldrh lr, [r1, #0x26] - mov r1, #6 - b _0230B8B0 -_0230B898: - mla r2, r3, r1, ip - add r2, r2, #0x1000 - ldrb r2, [r2, #0x4ea] - add r3, r3, #1 - cmp r2, #0 - addne r0, r0, #1 -_0230B8B0: - cmp r3, lr - blt _0230B898 - ldmia sp!, {r3, pc} - .align 2, 0 -_0230B8BC: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230B874 - - arm_func_start ov11_0230B8C0 -ov11_0230B8C0: ; 0x0230B8C0 - stmdb sp!, {r3, r4, r5, lr} - ldr r1, _0230B910 ; =SWAP_SHOP_INVENTORY_PTRS - mov r4, r0 - ldr r0, [r1, #4] - add r0, r0, #0x1400 - ldrsb r0, [r0, #0xe4] - bl sub_0202D0EC - mov r5, r0 - mov r0, r5, lsl #0x10 - mov r0, r0, lsr #0x10 - bl ov11_0230C970 - ldr r1, _0230B910 ; =SWAP_SHOP_INVENTORY_PTRS - strh r0, [r4] - ldr r0, [r1, #4] - add r0, r0, r5, lsl #1 - add r0, r0, #0x2d00 - ldrh r0, [r0, #0xee] - strh r0, [r4, #2] - ldrsh r0, [r4] - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230B910: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230B8C0 - - arm_func_start ov11_0230B914 -ov11_0230B914: ; 0x0230B914 - stmdb sp!, {r3, lr} - ldr r0, _0230B954 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - add r0, r0, #0x1400 - ldrsb r0, [r0, #0xe4] - bl sub_0202D0EC - ldr r1, _0230B954 ; =SWAP_SHOP_INVENTORY_PTRS - mov r0, r0, lsl #0x10 - ldr r2, [r1, #4] - mov r1, r0, lsr #0x10 - mov r0, #6 - mla r0, r1, r0, r2 - add r0, r0, #0x1400 - ldrh r0, [r0, #0xe6] - bl ov11_0230C9EC - ldmia sp!, {r3, pc} - .align 2, 0 -_0230B954: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230B914 - - arm_func_start ov11_0230B958 -ov11_0230B958: ; 0x0230B958 - stmdb sp!, {r3, lr} - ldr r0, _0230B9B8 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - add r0, r0, #0x1400 - ldrsb r0, [r0, #0xe4] - bl sub_0202D0EC - ldr r2, _0230B9B8 ; =SWAP_SHOP_INVENTORY_PTRS - mov r1, r0, lsl #0x10 - mov r3, r1, lsr #0x10 - ldr ip, [r2, #4] - mov r1, #6 - mla r2, r3, r1, ip - add r2, r2, #0x1400 - ldrh r2, [r2, #0xe6] - cmp r2, #1 - movne r0, #0 - ldmneia sp!, {r3, pc} - mla r1, r0, r1, ip - add r0, r1, #0x1400 - ldrh r0, [r0, #0xe8] - add r0, ip, r0, lsl #3 - add r0, r0, #0x4500 - ldrh r0, [r0, #0xea] - ldmia sp!, {r3, pc} - .align 2, 0 -_0230B9B8: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230B958 - - arm_func_start ov11_0230B9BC -ov11_0230B9BC: ; 0x0230B9BC - stmdb sp!, {r3, lr} - ldr r0, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl ov11_0230AED0 - bl ov11_0230CAE4 - bl ov11_0230CA38 - ldr r0, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - add r0, r0, #0x4000 - ldrb r0, [r0, #0x6c4] - cmp r0, #0 - beq _0230B9F8 - bl CloseSynthBin -_0230B9F8: - ldr r0, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS - mvn r1, #1 - ldr r0, [r0, #4] - add r0, r0, #0x1400 - ldrsb r0, [r0, #0xe4] - cmp r0, r1 - beq _0230BA44 - bl sub_0202D0EC - ldr r1, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS - strh r0, [r1] - ldr r0, [r1, #4] - add r0, r0, #0x1400 - ldrsb r0, [r0, #0xe4] - bl sub_0202836C - ldr r0, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - add r0, r0, #0x1400 - ldrsb r0, [r0, #0xe4] - bl CloseCollectionMenu -_0230BA44: - ldr r0, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - bl MemFree - ldr r0, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS - mov r1, #0 - str r1, [r0, #4] - ldmia sp!, {r3, pc} - .align 2, 0 -_0230BA60: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230B9BC - - arm_func_start ov11_0230BA64 -ov11_0230BA64: ; 0x0230BA64 - stmdb sp!, {r3, r4, r5, lr} - sub sp, sp, #8 - ldr r0, _0230BB18 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r4, [r0, #4] - cmp r4, #0 - moveq r0, #0 - beq _0230BB10 - add r0, r4, #0x1400 - ldrsb r0, [r0, #0xe4] - bl sub_0202D0EC - mov r5, r0 - bl ov11_0230AE84 - cmp r0, #0 - addne r0, r4, #0x4600 - ldrneh r0, [r0, #0xd0] - cmpne r0, r5 - beq _0230BAD8 - bl ov11_0230B914 - mov r1, r5, lsl #0x10 - str r0, [sp] - mov r0, r1, lsr #0x10 - bl ov11_0230C970 - strh r0, [sp, #4] - bl ov11_0230B958 - strh r0, [sp, #6] - add r0, sp, #0 - bl ov11_0230AF0C - add r0, r4, #0x4600 - strh r5, [r0, #0xd0] -_0230BAD8: - add r0, r4, #0x1400 - ldrsb r0, [r0, #0xe4] - bl IsCollectionMenuActive - cmp r0, #0 - bne _0230BB0C - add r0, r4, #0x1400 - ldrsb r0, [r0, #0xe4] - bl sub_0202C75C - mvn r1, #0 - cmp r0, r1 - moveq r0, #2 - movne r0, #3 - b _0230BB10 -_0230BB0C: - mov r0, #0 -_0230BB10: - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230BB18: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230BA64 - - arm_func_start ov11_0230BB1C -ov11_0230BB1C: ; 0x0230BB1C - stmdb sp!, {r3, lr} - ldr r0, _0230BB94 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - cmp r0, #0 - addne r0, r0, #0x1400 - ldrnesb r0, [r0, #0xe4] - mvnne r1, #1 - cmpne r0, r1 - ldmeqia sp!, {r3, pc} - bl sub_0202D0EC - ldr r1, _0230BB94 ; =SWAP_SHOP_INVENTORY_PTRS - strh r0, [r1] - bl ov11_0230CA38 - bl ov11_0230CAE4 - ldr r0, _0230BB94 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - add r0, r0, #0x1400 - ldrsb r0, [r0, #0xe4] - bl sub_0202836C - ldr r0, _0230BB94 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - add r0, r0, #0x1400 - ldrsb r0, [r0, #0xe4] - bl CloseCollectionMenu - ldr r0, _0230BB94 ; =SWAP_SHOP_INVENTORY_PTRS - mvn r1, #1 - ldr r0, [r0, #4] - add r0, r0, #0x1000 - strb r1, [r0, #0x4e4] - ldmia sp!, {r3, pc} - .align 2, 0 -_0230BB94: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230BB1C - - arm_func_start ov11_0230BB98 -ov11_0230BB98: ; 0x0230BB98 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #0xc - ldr r0, _0230BCD8 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r2, [r0, #4] - cmp r2, #0 - beq _0230BCD0 - add r0, r2, #0x1400 - ldrsb r1, [r0, #0xe4] - mvn r0, #1 - cmp r1, r0 - bne _0230BCD0 - ldr r0, [r2] - ldr r1, _0230BCDC ; =0x00401833 - ldr r3, _0230BCE0 ; =ov11_0230BD5C - cmp r0, #3 - mov r5, #0 - addls pc, pc, r0, lsl #2 - b _0230BC00 -_0230BBE0: ; jump table - b _0230BC00 ; case 0 - b _0230BC00 ; case 1 - b _0230BC00 ; case 2 - b _0230BBF0 ; case 3 -_0230BBF0: - ldr r0, _0230BCE4 ; =0x80040004 - ldr r5, _0230BCE8 ; =ov11_0230B78C - ldr r3, _0230BCEC ; =ov11_0230BE34 - orr r1, r1, r0 -_0230BC00: - ldr ip, _0230BCD8 ; =SWAP_SHOP_INVENTORY_PTRS - add r2, r2, #0x4000 - ldrsh r4, [ip] - ldr r0, _0230BCF0 ; =ov11_02322FE4 - mov lr, #8 - str r4, [r2, #0x62c] - ldr r2, [ip, #4] - str r5, [sp] - ldr ip, [r2, #4] - add r2, r2, #0x22c - add r2, r2, #0x4400 - stmib sp, {ip, lr} - bl CreateCollectionMenu - ldr r2, _0230BCD8 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r1, [r2, #4] - add r1, r1, #0x1000 - strb r0, [r1, #0x4e4] - ldr r1, [r2, #4] - ldr r0, [r1] - cmp r0, #3 - bne _0230BCD0 - add r0, r1, #0x1400 - ldrsb r0, [r0, #0xe4] - mov r1, #1 - bl SetCollectionMenuField0x1C8 - ldr r0, _0230BCD8 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r1, _0230BCF4 ; =ov11_0230BF38 - ldr r0, [r0, #4] - add r0, r0, #0x1400 - ldrsb r0, [r0, #0xe4] - bl SetCollectionMenuField0x1A4 - bl ov11_0230CAA4 - bl ov11_0230C9F8 - ldr r0, _0230BCD8 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r4, [r0, #4] - ldr r0, [r4] - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0230BCD0 -_0230BC9C: ; jump table - b _0230BCD0 ; case 0 - b _0230BCD0 ; case 1 - b _0230BCD0 ; case 2 - b _0230BCAC ; case 3 -_0230BCAC: - bl ov11_0230B874 - add r1, r4, #0x4600 - ldrh r1, [r1, #0x28] - cmp r1, r0 - bne _0230BCD0 - add r0, r4, #0x1400 - ldrsb r0, [r0, #0xe4] - mov r1, #1 - bl sub_0202D07C -_0230BCD0: - add sp, sp, #0xc - ldmia sp!, {r4, r5, pc} - .align 2, 0 -_0230BCD8: .word SWAP_SHOP_INVENTORY_PTRS -_0230BCDC: .word 0x00401833 -_0230BCE0: .word ov11_0230BD5C -_0230BCE4: .word 0x80040004 -_0230BCE8: .word ov11_0230B78C -_0230BCEC: .word ov11_0230BE34 -_0230BCF0: .word ov11_02322FE4 -_0230BCF4: .word ov11_0230BF38 - arm_func_end ov11_0230BB98 - - arm_func_start ov11_0230BCF8 -ov11_0230BCF8: ; 0x0230BCF8 - stmdb sp!, {r3, lr} - ldr r0, _0230BD24 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - cmp r0, #0 - addne r0, r0, #0x1400 - ldrnesb r0, [r0, #0xe4] - mvnne r1, #1 - cmpne r0, r1 - ldmeqia sp!, {r3, pc} - bl sub_0202C620 - ldmia sp!, {r3, pc} - .align 2, 0 -_0230BD24: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230BCF8 - - arm_func_start ov11_0230BD28 -ov11_0230BD28: ; 0x0230BD28 - stmdb sp!, {r3, lr} - ldr r0, _0230BD58 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - cmp r0, #0 - addne r0, r0, #0x1400 - ldrnesb r0, [r0, #0xe4] - mvnne r1, #1 - cmpne r0, r1 - moveq r0, #0 - ldmeqia sp!, {r3, pc} - bl IsCollectionMenuState3 - ldmia sp!, {r3, pc} - .align 2, 0 -_0230BD58: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230BD28 - - arm_func_start ov11_0230BD5C -ov11_0230BD5C: ; 0x0230BD5C - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x58 - mov r5, r1 - mov r1, r5, lsl #0x10 - mov r6, r0 - mov r0, r1, lsr #0x10 - mov r4, r2 - bl ov11_0230C970 - ldr r1, _0230BE28 ; =SWAP_SHOP_INVENTORY_PTRS - strh r0, [sp, #4] - ldr r3, [r1, #4] - mov r1, #1 - add r0, r3, r5, lsl #1 - add r0, r0, #0x2d00 - ldrh r2, [r0, #0xee] - add r0, r3, r5 - add r0, r0, #0x1000 - strh r2, [sp, #2] - strb r1, [sp] - ldrb r0, [r0, #0xb8] - add r1, sp, #0 - mov r2, #0 - tst r0, #2 - beq _0230BDEC - add r0, sp, #6 - bl MaybeGetUncoloredFormattedItemName - ldr r1, _0230BE2C ; =SWAP_SHOP_RED_TEXT_TAG_STR - mov r0, r6 - bl strcpy - add r1, sp, #6 - mov r0, r6 - bl strcat - ldr r1, _0230BE30 ; =SWAP_SHOP_UNCENTER_TEXT_TAG_STR - mov r0, r6 - bl strcat - b _0230BDF4 -_0230BDEC: - mov r0, r6 - bl MaybeGetColoredFormattedItemName -_0230BDF4: - ldr r1, _0230BE28 ; =SWAP_SHOP_INVENTORY_PTRS - mov r0, #6 - ldr r1, [r1, #4] - mla r0, r5, r0, r1 - add r0, r0, #0x1000 - ldrb r0, [r0, #0x4ea] - cmp r0, #0 - movne r1, #1 - moveq r1, #0 - mov r0, r6 - str r1, [r4] - add sp, sp, #0x58 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0230BE28: .word SWAP_SHOP_INVENTORY_PTRS -_0230BE2C: .word SWAP_SHOP_RED_TEXT_TAG_STR -_0230BE30: .word SWAP_SHOP_UNCENTER_TEXT_TAG_STR - arm_func_end ov11_0230BD5C - - arm_func_start ov11_0230BE34 -ov11_0230BE34: ; 0x0230BE34 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #8 - ldr r3, _0230BF28 ; =SWAP_SHOP_INVENTORY_PTRS - mov r5, r1 - mov r1, r5, lsl #0x10 - mov r6, r0 - mov r0, r1, lsr #0x10 - ldr r3, [r3, #4] - mov r1, #6 - mla r1, r0, r1, r3 - add r1, r1, #0x1400 - ldrh r1, [r1, #0xe6] - mov r4, r2 - cmp r1, #4 - moveq r0, #0 - beq _0230BF20 - bl ov11_0230C970 - ldr r1, _0230BF28 ; =SWAP_SHOP_INVENTORY_PTRS - strh r0, [sp, #4] - ldr r0, [r1, #4] - add r1, sp, #0 - add r0, r0, r5, lsl #1 - add r0, r0, #0x2d00 - ldrh ip, [r0, #0xee] - mov r3, #1 - mov r0, r6 - mov r2, #0 - strh ip, [sp, #2] - strb r3, [sp] - bl MaybeGetColoredFormattedItemName - ldrsh r0, [sp, #4] - bl ov11_0230C068 - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0230BEE8 -_0230BEC0: ; jump table - b _0230BED0 ; case 0 - b _0230BED0 ; case 1 - b _0230BED8 ; case 2 - b _0230BEE0 ; case 3 -_0230BED0: - ldr r1, _0230BF2C ; =SWAP_SHOP_CLUMSET_ONE_STAR_STR - b _0230BEEC -_0230BED8: - ldr r1, _0230BF30 ; =SWAP_SHOP_CLUMSET_TWO_STAR_STR - b _0230BEEC -_0230BEE0: - ldr r1, _0230BF34 ; =SWAP_SHOP_CLUMSET_THREE_STAR_STR - b _0230BEEC -_0230BEE8: - mov r1, #0 -_0230BEEC: - mov r0, r6 - bl strcat - ldr r1, _0230BF28 ; =SWAP_SHOP_INVENTORY_PTRS - mov r0, #6 - ldr r1, [r1, #4] - mla r0, r5, r0, r1 - add r0, r0, #0x1000 - ldrb r0, [r0, #0x4ea] - cmp r0, #0 - movne r1, #1 - moveq r1, #0 - mov r0, r6 - str r1, [r4] -_0230BF20: - add sp, sp, #8 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0230BF28: .word SWAP_SHOP_INVENTORY_PTRS -_0230BF2C: .word SWAP_SHOP_CLUMSET_ONE_STAR_STR -_0230BF30: .word SWAP_SHOP_CLUMSET_TWO_STAR_STR -_0230BF34: .word SWAP_SHOP_CLUMSET_THREE_STAR_STR - arm_func_end ov11_0230BE34 - - arm_func_start ov11_0230BF38 -ov11_0230BF38: ; 0x0230BF38 - stmdb sp!, {r3, lr} - ldr r3, _0230BF8C ; =SWAP_SHOP_INVENTORY_PTRS - mov r2, r2, lsl #0x10 - ldr ip, [r3, #4] - mov r3, r2, lsr #0x10 - mov r2, #6 - mla r2, r3, r2, ip - add r2, r2, #0x1400 - ldrh r2, [r2, #0xe6] - mov r3, r0 - cmp r2, #2 - ldreq r0, _0230BF90 ; =0x0000032F - streqh r0, [r1, #0x1c] - beq _0230BF7C - cmp r2, #3 - ldreq r0, _0230BF94 ; =0x00004623 - streqh r0, [r1, #0x1c] -_0230BF7C: - mov r0, r1 - mov r1, r3 - bl sub_0202A03C - ldmia sp!, {r3, pc} - .align 2, 0 -_0230BF8C: .word SWAP_SHOP_INVENTORY_PTRS -#if defined(EUROPE) -_0230BF90: .word 0x0000032F -_0230BF94: .word 0x00004642 -#elif defined(JAPAN) -_0230BF90: .word 0x000031F4 -_0230BF94: .word 0x00001CDF -#else -_0230BF90: .word 0x0000032F -_0230BF94: .word 0x00004623 -#endif - arm_func_end ov11_0230BF38 - - arm_func_start ov11_0230BF98 -ov11_0230BF98: ; 0x0230BF98 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r4, #0 - ldr r3, _0230C048 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r2, _0230C04C ; =0x0000042C - mov r0, r4 -_0230BFAC: - ldr r1, [r3, #4] - add r1, r1, r4, lsl #2 - str r0, [r1, #8] - ldr r1, [r3, #4] - add r1, r1, r4 - add r1, r1, #0x1000 - add r4, r4, #1 - strb r0, [r1, #0xb8] - cmp r4, r2 - blt _0230BFAC - ldr r2, _0230C048 ; =SWAP_SHOP_INVENTORY_PTRS - mov r5, #0 -_0230BFDC: - ldr r1, [r2, #4] - add r1, r1, r0, lsl #1 - add r1, r1, #0x3e00 - strh r5, [r1, #0x16] - ldr r1, [r2, #4] - add r1, r1, r0, lsl #1 - add r1, r1, #0x3600 - add r0, r0, #1 - strh r5, [r1, #0x46] - cmp r0, #0x3e8 - blt _0230BFDC - ldr r7, _0230C048 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r6, _0230C04C ; =0x0000042C - mov r4, #0 -_0230C014: - ldr r1, [r7, #4] - mov r0, r5, lsl #0x10 - add r1, r1, r5, lsl #1 - add r3, r1, #0x2d00 - mov r1, r4 - mov r2, r4 - mov r0, r0, lsr #0x10 - strh r4, [r3, #0xee] - bl ov11_0230C924 - add r5, r5, #1 - cmp r5, r6 - blt _0230C014 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_0230C048: .word SWAP_SHOP_INVENTORY_PTRS -_0230C04C: .word 0x0000042C - arm_func_end ov11_0230BF98 - - arm_func_start ov11_0230C050 -ov11_0230C050: ; 0x0230C050 - ldr ip, _0230C064 ; =ov11_0230C1D0 - mov r2, r1 - mov r1, r0 - mov r0, #0 - bx ip - .align 2, 0 -_0230C064: .word ov11_0230C1D0 - arm_func_end ov11_0230C050 - - arm_func_start ov11_0230C068 -ov11_0230C068: ; 0x0230C068 - cmp r0, #0x1bc - blt _0230C080 - ldr r1, _0230C0FC ; =0x000001C3 - cmp r0, r1 - movle r0, #3 - bxle lr -_0230C080: - cmp r0, #0x1c4 - blt _0230C098 - ldr r1, _0230C100 ; =0x000001C7 - cmp r0, r1 - movle r0, #3 - bxle lr -_0230C098: - cmp r0, #0x1c8 - blt _0230C0B0 - ldr r1, _0230C104 ; =0x000001D7 - cmp r0, r1 - movle r0, #3 - bxle lr -_0230C0B0: - cmp r0, #0x1d8 - blt _0230C0C8 - ldr r1, _0230C108 ; =0x000001F9 - cmp r0, r1 - movle r0, #3 - bxle lr -_0230C0C8: - ldr r1, _0230C10C ; =0x000003F6 - cmp r0, r1 - blt _0230C0E4 - ldr r1, _0230C110 ; =0x00000547 - cmp r0, r1 - movle r0, #3 - bxle lr -_0230C0E4: - ldr r1, _0230C114 ; =0xFFFFFE06 - add r0, r0, r1 - mov r1, r0, lsr #0x1f - rsb r0, r1, r0, lsl #30 - add r0, r1, r0, ror #30 - bx lr - .align 2, 0 -_0230C0FC: .word 0x000001C3 -_0230C100: .word 0x000001C7 -_0230C104: .word 0x000001D7 -_0230C108: .word 0x000001F9 -_0230C10C: .word 0x000003F6 -_0230C110: .word 0x00000547 -_0230C114: .word 0xFFFFFE06 - arm_func_end ov11_0230C068 - - arm_func_start ov11_0230C118 -ov11_0230C118: ; 0x0230C118 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - ldr r6, _0230C1CC ; =SWAP_SHOP_INVENTORY_PTRS - mov lr, #0 - ldr r7, [r6, #4] - mov r4, lr - add r6, r7, #0xe6 - add ip, r6, #0x1400 - add r6, r7, #0x4600 - mov r5, lr - mov r7, #6 - b _0230C1AC -_0230C144: - mla sb, r5, r7, ip - ldrb r8, [sb, #4] - cmp r8, #0 - beq _0230C1A8 - ldrh r8, [sb] - cmp r8, #2 - beq _0230C16C - cmp r8, #3 - beq _0230C18C - b _0230C1A8 -_0230C16C: - cmp r1, #0 - ldrneh sb, [sb, #2] - movne r8, lr, lsl #1 - strneh sb, [r1, r8] - add r8, lr, #1 - mov lr, r8, lsl #0x10 - mov lr, lr, lsr #0x10 - b _0230C1A8 -_0230C18C: - cmp r3, #0 - movne r8, r4, lsl #1 - ldrneh sb, [sb, #2] - add r4, r4, #1 - mov r4, r4, lsl #0x10 - strneh sb, [r3, r8] - mov r4, r4, lsr #0x10 -_0230C1A8: - add r5, r5, #1 -_0230C1AC: - ldrh r8, [r6, #0x26] - cmp r5, r8 - blt _0230C144 - cmp r0, #0 - strneh lr, [r0] - cmp r2, #0 - strneh r4, [r2] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_0230C1CC: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230C118 - - arm_func_start ov11_0230C1D0 -ov11_0230C1D0: ; 0x0230C1D0 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov r6, r0 - mov r5, r1 - mov r4, r2 - bl GetCurrentBagCapacity - mov fp, r0 - bl sub_0200FD48 - mov r8, #0 - mov r7, r0 - mov sb, r8 - mov sl, r8 - cmp r5, #0 - beq _0230C288 - b _0230C278 -_0230C208: - ldr r0, _0230C3C4 ; =BAG_ITEMS_PTR_MIRROR - ldr r1, [r0] - mov r0, #6 - mul r0, sl, r0 - ldr r1, [r1, #0x384] - add r2, r1, r0 - ldrb r0, [r1, r0] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _0230C274 - ldrsh r1, [r2, #4] - cmp r1, #0x1bc - blt _0230C274 - ldr r0, _0230C3C8 ; =0x00000547 - cmp r1, r0 - bgt _0230C274 - cmp r6, #0 - beq _0230C270 - mov r0, r8, lsl #0x10 - mov r2, sl, lsl #0x10 - mov r0, r0, lsr #0x10 - mov r1, #2 - mov r2, r2, lsr #0x10 - bl ov11_0230C924 -_0230C270: - add r8, r8, #1 -_0230C274: - add sl, sl, #1 -_0230C278: - cmp sl, fp - blt _0230C208 - mov sl, r8 - strh r8, [r5] -_0230C288: - cmp r4, #0 - beq _0230C3BC - ldr r0, _0230C3C4 ; =BAG_ITEMS_PTR_MIRROR - mov r5, #0 - ldr r2, [r0] - ldr r0, _0230C3C8 ; =0x00000547 - b _0230C2CC -_0230C2A4: - add r1, r2, r5, lsl #1 - add r1, r1, #0x300 - ldrsh r1, [r1, #0x8a] - cmp r1, #0 - beq _0230C2D4 - cmp r1, #0x1bc - blt _0230C2C8 - cmp r1, r0 - ble _0230C2D4 -_0230C2C8: - add r5, r5, #1 -_0230C2CC: - cmp r5, r7 - blt _0230C2A4 -_0230C2D4: - cmp r5, r7 - bge _0230C31C - add r0, r2, r5, lsl #1 - add r0, r0, #0x300 - ldrsh r0, [r0, #0x8a] - cmp r0, #0 - beq _0230C31C - tst r8, #7 - cmpne r6, #0 - beq _0230C31C - mov r0, r8, lsl #0x10 - mov r0, r0, lsr #0x10 - mov r1, #4 - mov r2, #0 - bl ov11_0230C924 - add r8, r8, #1 - add r0, r8, #7 - bic sl, r0, #7 -_0230C31C: - ldr fp, _0230C3C4 ; =BAG_ITEMS_PTR_MIRROR - b _0230C37C -_0230C324: - ldr r0, [fp] - add r0, r0, r5, lsl #1 - add r0, r0, #0x300 - ldrsh r1, [r0, #0x8a] - cmp r1, #0 - beq _0230C384 - cmp r1, #0x1bc - blt _0230C378 - ldr r0, _0230C3C8 ; =0x00000547 - cmp r1, r0 - bgt _0230C378 - cmp r6, #0 - beq _0230C374 - add r0, sl, sb - mov r0, r0, lsl #0x10 - mov r2, r5, lsl #0x10 - mov r1, #3 - mov r0, r0, lsr #0x10 - mov r2, r2, lsr #0x10 - bl ov11_0230C924 -_0230C374: - add sb, sb, #1 -_0230C378: - add r5, r5, #1 -_0230C37C: - cmp r5, r7 - blt _0230C324 -_0230C384: - strh sb, [r4] - cmp r8, #0 - ble _0230C3B8 - tst sb, #7 - cmpne r6, #0 - beq _0230C3B8 - add r0, sl, sb - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - mov r1, #4 - mov r2, #0 - bl ov11_0230C924 - add sb, sb, #1 -_0230C3B8: - add sl, sl, sb -_0230C3BC: - mov r0, sl - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0230C3C4: .word BAG_ITEMS_PTR_MIRROR -_0230C3C8: .word 0x00000547 - arm_func_end ov11_0230C1D0 - - arm_func_start ov11_0230C3CC -ov11_0230C3CC: ; 0x0230C3CC - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - bl GetCurrentBagCapacity - mov r7, r0 - bl sub_0200FD48 - mov sb, #0 - mov r8, r0 - mov sl, sb - mov fp, #1 - ldr r6, _0230C4C8 ; =BAG_ITEMS_PTR_MIRROR - mov r5, #6 - ldr r4, _0230C4CC ; =0x000003F5 - b _0230C450 -_0230C3FC: - mul r1, sl, r5 - ldr r0, [r6] - ldr r2, [r0, #0x384] - ldrb r0, [r2, r1] - add r1, r2, r1 - tst r0, #1 - movne r0, fp - moveq r0, #0 - tst r0, #0xff - beq _0230C44C - ldrsh r0, [r1, #4] - cmp r0, r4, lsr #1 - blt _0230C44C - cmp r0, r4 - bgt _0230C44C - ldrh r1, [r1, #2] - mov r2, sb - bl ov11_0230C5A0 - cmp r0, #0 - addne sb, sb, #1 -_0230C44C: - add sl, sl, #1 -_0230C450: - cmp sl, r7 - blt _0230C3FC - mov r4, #0 - ldr r6, _0230C4C8 ; =BAG_ITEMS_PTR_MIRROR - ldr r5, _0230C4CC ; =0x000003F5 - b _0230C4AC -_0230C468: - ldr r0, [r6] - add r1, r0, r4, lsl #1 - add r0, r1, #0x300 - ldrsh r0, [r0, #0x8a] - cmp r0, #0 - beq _0230C4B4 - cmp r0, r5, lsr #1 - blt _0230C4A8 - cmp r0, r5 - bgt _0230C4A8 - add r1, r1, #0xb00 - ldrh r1, [r1, #0x5a] - mov r2, sb - bl ov11_0230C5A0 - cmp r0, #0 - addne sb, sb, #1 -_0230C4A8: - add r4, r4, #1 -_0230C4AC: - cmp r4, r8 - blt _0230C468 -_0230C4B4: - ldr r0, _0230C4D0 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - add r0, r0, #0x4600 - strh sb, [r0, #0x28] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0230C4C8: .word BAG_ITEMS_PTR_MIRROR -_0230C4CC: .word 0x000003F5 -_0230C4D0: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230C3CC - - arm_func_start ov11_0230C4D4 -ov11_0230C4D4: ; 0x0230C4D4 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - bl GetCurrentBagCapacity - mov r8, #0 - mov r7, r0 - mov sb, r8 - mov r4, #6 - ldr r6, _0230C594 ; =BAG_ITEMS_PTR_MIRROR - ldr r5, _0230C598 ; =SWAP_SHOP_INVENTORY_PTRS - ldr fp, _0230C59C ; =0x0000018F - b _0230C578 -_0230C4FC: - mul sl, sb, r4 - ldr r0, [r6] - ldr r1, [r0, #0x384] - ldrb r0, [r1, sl] - add r1, r1, sl - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _0230C574 - ldrsh r0, [r1, #4] - cmp r0, #0x16c - blt _0230C574 - cmp r0, fp - bgt _0230C574 - mov r0, r8, lsl #0x10 - mov r2, sb, lsl #0x10 - mov r1, #2 - mov r0, r0, lsr #0x10 - mov r2, r2, lsr #0x10 - bl ov11_0230C924 - ldr r1, [r6] - ldr r0, [r5, #4] - ldr r1, [r1, #0x384] - add r0, r0, r8, lsl #1 - add r1, r1, sl - ldrh r1, [r1, #2] - add r0, r0, #0x2d00 - add r8, r8, #1 - strh r1, [r0, #0xee] -_0230C574: - add sb, sb, #1 -_0230C578: - cmp sb, r7 - blt _0230C4FC - ldr r0, _0230C598 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - add r0, r0, #0x4600 - strh r8, [r0, #0x26] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0230C594: .word BAG_ITEMS_PTR_MIRROR -_0230C598: .word SWAP_SHOP_INVENTORY_PTRS -_0230C59C: .word 0x0000018F - arm_func_end ov11_0230C4D4 - - arm_func_start ov11_0230C5A0 -ov11_0230C5A0: ; 0x0230C5A0 - stmdb sp!, {r4, lr} - cmp r2, #0 - beq _0230C5EC - ldr r3, _0230C618 ; =SWAP_SHOP_INVENTORY_PTRS - mov lr, #0 - ldr r4, [r3, #4] - b _0230C5E4 -_0230C5BC: - add ip, r4, lr, lsl #1 - add r3, ip, #0x3600 - ldrh r3, [r3, #0x46] - cmp r0, r3 - addeq r3, ip, #0x3e00 - ldreqh r3, [r3, #0x16] - cmpeq r1, r3 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - add lr, lr, #1 -_0230C5E4: - cmp lr, r2 - blt _0230C5BC -_0230C5EC: - ldr ip, _0230C618 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r3, [ip, #4] - add r3, r3, r2, lsl #1 - add r3, r3, #0x3600 - strh r0, [r3, #0x46] - ldr r3, [ip, #4] - mov r0, #1 - add r2, r3, r2, lsl #1 - add r2, r2, #0x3e00 - strh r1, [r2, #0x16] - ldmia sp!, {r4, pc} - .align 2, 0 -_0230C618: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230C5A0 - - arm_func_start ov11_0230C61C -ov11_0230C61C: ; 0x0230C61C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - ldr r4, _0230C8DC ; =0x000001FA - mov r5, #0 -_0230C628: - ldr r0, _0230C8E0 ; =SWAP_SHOP_INVENTORY_PTRS - ldr lr, [r0, #4] - add r0, lr, #0x4600 - ldrh ip, [r0, #0x28] - cmp ip, #0 - moveq r0, #0 - beq _0230C6C0 - mov r0, r4, lsl #0x10 - mov r3, #0 - mov r2, r0, asr #0x10 - add r1, r2, #1 - add r0, r2, #2 - mov r7, r3 - mov r8, r3 - mov sb, r3 - b _0230C698 -_0230C668: - add r6, lr, r3, lsl #1 - add r6, r6, #0x3600 - ldrh r6, [r6, #0x46] - cmp r2, r6 - moveq r2, sb - beq _0230C694 - cmp r1, r6 - moveq r1, r8 - beq _0230C694 - cmp r0, r6 - moveq r0, r7 -_0230C694: - add r3, r3, #1 -_0230C698: - cmp r3, ip - blt _0230C668 - cmp r2, #0 - cmpeq r1, #0 - bne _0230C6BC - cmp r0, #0 - moveq r0, #2 - movne r0, #1 - b _0230C6C0 -_0230C6BC: - mov r0, #0 -_0230C6C0: - cmp r0, #1 - beq _0230C834 - cmp r0, #2 - bne _0230C86C - add r0, lr, r5, lsl #1 - ldr r2, _0230C8E4 ; =0x000002FE - add r0, r0, #0x2d00 - mov r1, #0 - strh r1, [r0, #0xee] - cmp r4, r2 - bne _0230C7AC - mov r0, r5, lsl #0x10 - ldr r2, _0230C8E8 ; =0x000001BD - mov r0, r0, lsr #0x10 - bl ov11_0230C924 - add r0, r5, #1 - mov r0, r0, lsl #0x10 - ldr r2, _0230C8EC ; =0x000001BE - mov r0, r0, lsr #0x10 - mov r1, #0 - bl ov11_0230C924 - add r0, r5, #2 - mov r0, r0, lsl #0x10 - ldr r2, _0230C8F0 ; =0x000001BF - mov r0, r0, lsr #0x10 - mov r1, #0 - bl ov11_0230C924 - add r0, r5, #3 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - mov r1, #0 - mov r2, #0x1c0 - bl ov11_0230C924 - add r0, r5, #4 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - mov r1, #0 - ldr r2, _0230C8F4 ; =0x000001C1 - bl ov11_0230C924 - add r0, r5, #5 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - mov r1, #0 - ldr r2, _0230C8F8 ; =0x000001C2 - bl ov11_0230C924 - add r0, r5, #6 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - mov r1, #0 - ldr r2, _0230C8FC ; =0x000001C3 - bl ov11_0230C924 - add r0, r5, #7 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - add r5, r5, #8 - mov r1, #0 - mov r2, #0x1bc - bl ov11_0230C924 - b _0230C834 -_0230C7AC: - add r0, r2, #0x38 - cmp r4, r0 - bne _0230C818 - mov r0, r5, lsl #0x10 - ldr r2, _0230C900 ; =0x000001C5 - mov r0, r0, lsr #0x10 - bl ov11_0230C924 - add r0, r5, #1 - mov r0, r0, lsl #0x10 - ldr r2, _0230C904 ; =0x000001C6 - mov r0, r0, lsr #0x10 - mov r1, #0 - bl ov11_0230C924 - add r0, r5, #2 - mov r0, r0, lsl #0x10 - ldr r2, _0230C908 ; =0x000001C7 - mov r0, r0, lsr #0x10 - mov r1, #0 - bl ov11_0230C924 - add r0, r5, #3 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - mov r1, #0 - mov r2, #0x1c4 - add r5, r5, #4 - bl ov11_0230C924 - b _0230C834 -_0230C818: - add r2, r4, #3 - mov r0, r5, lsl #0x10 - mov r2, r2, lsl #0x10 - mov r0, r0, lsr #0x10 - mov r2, r2, lsr #0x10 - add r5, r5, #1 - bl ov11_0230C924 -_0230C834: - add r1, r4, #2 - mov r0, r5, lsl #0x10 - mov r1, r1, lsl #0x10 - mov r0, r0, lsr #0x10 - mov r2, r1, lsr #0x10 - mov r1, #0 - bl ov11_0230C924 - ldr r0, _0230C8E0 ; =SWAP_SHOP_INVENTORY_PTRS - mov r1, #0 - ldr r0, [r0, #4] - add r0, r0, r5, lsl #1 - add r0, r0, #0x2d00 - strh r1, [r0, #0xee] - add r5, r5, #1 -_0230C86C: - ldr r0, _0230C90C ; =0x000003F6 - add r4, r4, #4 - cmp r4, r0 - blt _0230C628 - ldr r0, _0230C8E0 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - add r0, r0, #0xe6 - add r0, r0, #0x4500 - bl GetCroagunkItemTemplates - mov r6, r0 - mov r7, #0 - mov r4, #1 - b _0230C8C0 -_0230C8A0: - mov r0, r5, lsl #0x10 - mov r2, r7, lsl #0x10 - mov r1, r4 - mov r0, r0, lsr #0x10 - mov r2, r2, lsr #0x10 - add r5, r5, #1 - bl ov11_0230C924 - add r7, r7, #1 -_0230C8C0: - cmp r7, r6 - blt _0230C8A0 - ldr r0, _0230C8E0 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r0, [r0, #4] - add r0, r0, #0x4600 - strh r5, [r0, #0x26] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_0230C8DC: .word 0x000001FA -_0230C8E0: .word SWAP_SHOP_INVENTORY_PTRS -_0230C8E4: .word 0x000002FE -_0230C8E8: .word 0x000001BD -_0230C8EC: .word 0x000001BE -_0230C8F0: .word 0x000001BF -_0230C8F4: .word 0x000001C1 -_0230C8F8: .word 0x000001C2 -_0230C8FC: .word 0x000001C3 -_0230C900: .word 0x000001C5 -_0230C904: .word 0x000001C6 -_0230C908: .word 0x000001C7 -_0230C90C: .word 0x000003F6 - arm_func_end ov11_0230C61C - - arm_func_start ov11_0230C910 -ov11_0230C910: ; 0x0230C910 - ldr r0, _0230C920 ; =SWAP_SHOP_INVENTORY_PTRS - mov r1, #0 - strh r1, [r0] - bx lr - .align 2, 0 -_0230C920: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230C910 - - arm_func_start ov11_0230C924 -ov11_0230C924: ; 0x0230C924 - stmdb sp!, {r3, lr} - mov r3, #6 - mul lr, r0, r3 - ldr r3, _0230C96C ; =SWAP_SHOP_INVENTORY_PTRS - mov ip, #0 - ldr r0, [r3, #4] - add r0, r0, lr - add r0, r0, #0x1400 - strh r1, [r0, #0xe6] - ldr r0, [r3, #4] - add r0, r0, lr - add r0, r0, #0x1400 - strh r2, [r0, #0xe8] - ldr r0, [r3, #4] - add r0, r0, lr - add r0, r0, #0x1000 - strb ip, [r0, #0x4ea] - ldmia sp!, {r3, pc} - .align 2, 0 -_0230C96C: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230C924 - - arm_func_start ov11_0230C970 -ov11_0230C970: ; 0x0230C970 - stmdb sp!, {r3, lr} - mov r1, #6 - ldr r2, _0230C9E8 ; =SWAP_SHOP_INVENTORY_PTRS - mul r1, r0, r1 - ldr r3, [r2, #4] - add r0, r3, #0xe6 - add r2, r0, #0x1400 - ldrh r0, [r2, r1] - add r1, r2, r1 - cmp r0, #1 - beq _0230C9B0 - cmp r0, #2 - beq _0230C9C4 - cmp r0, #3 - beq _0230C9D4 - b _0230C9E0 -_0230C9B0: - ldrh r0, [r1, #2] - add r0, r3, r0, lsl #3 - add r0, r0, #0x4500 - ldrsh r0, [r0, #0xe6] - ldmia sp!, {r3, pc} -_0230C9C4: - ldrsh r0, [r1, #2] - bl GetItemAtIdx - ldrsh r0, [r0, #4] - ldmia sp!, {r3, pc} -_0230C9D4: - ldrsh r0, [r1, #2] - bl sub_02010044 - ldmia sp!, {r3, pc} -_0230C9E0: - ldrsh r0, [r1, #2] - ldmia sp!, {r3, pc} - .align 2, 0 -_0230C9E8: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230C970 - - arm_func_start ov11_0230C9EC -ov11_0230C9EC: ; 0x0230C9EC - cmp r0, #4 - moveq r0, #4 - bx lr - arm_func_end ov11_0230C9EC - - arm_func_start ov11_0230C9F8 -ov11_0230C9F8: ; 0x0230C9F8 - stmdb sp!, {r3, lr} - ldr r0, _0230CA2C ; =SWAP_SHOP_INVENTORY_PTRS - ldr r1, [r0, #4] - add r0, r1, #0x4000 - ldr r0, [r0, #0x6cc] - cmp r0, #0 - ldmneia sp!, {r3, pc} - add r0, r1, #0x2cc - ldr r1, _0230CA30 ; =ov11_02322FF4 - ldr r2, _0230CA34 ; =ov11_0230CA7C - add r0, r0, #0x4400 - bl sub_0204707C - ldmia sp!, {r3, pc} - .align 2, 0 -_0230CA2C: .word SWAP_SHOP_INVENTORY_PTRS -_0230CA30: .word ov11_02322FF4 -_0230CA34: .word ov11_0230CA7C - arm_func_end ov11_0230C9F8 - - arm_func_start ov11_0230CA38 -ov11_0230CA38: ; 0x0230CA38 - stmdb sp!, {r3, lr} - ldr r0, _0230CA78 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r1, [r0, #4] - add r0, r1, #0x4000 - ldr r0, [r0, #0x6cc] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - add r0, r1, #0x2cc - add r0, r0, #0x4400 - bl sub_02047150 - ldr r0, _0230CA78 ; =SWAP_SHOP_INVENTORY_PTRS - mov r1, #0 - ldr r0, [r0, #4] - add r0, r0, #0x4000 - str r1, [r0, #0x6cc] - ldmia sp!, {r3, pc} - .align 2, 0 -_0230CA78: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230CA38 - - arm_func_start ov11_0230CA7C -ov11_0230CA7C: ; 0x0230CA7C - stmdb sp!, {r4, lr} - ldr r3, _0230CAA0 ; =0x000003A9 - mov r4, r0 - mov r1, #6 - mov r2, #2 - bl AppendStandardStringToMission - mov r0, r4 - bl UpdateWindow - ldmia sp!, {r4, pc} - .align 2, 0 -#ifdef JAPAN -_0230CAA0: .word 0x000032B3 -#else -_0230CAA0: .word 0x000003A9 -#endif - arm_func_end ov11_0230CA7C - - arm_func_start ov11_0230CAA4 -ov11_0230CAA4: ; 0x0230CAA4 - stmdb sp!, {r3, lr} - ldr r0, _0230CAD8 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r1, [r0, #4] - add r0, r1, #0x4000 - ldr r0, [r0, #0x6c8] - cmp r0, #0 - ldmneia sp!, {r3, pc} - add r0, r1, #0x2c8 - ldr r1, _0230CADC ; =ov11_02322FD4 - ldr r2, _0230CAE0 ; =ov11_0230CB28 - add r0, r0, #0x4400 - bl sub_0204707C - ldmia sp!, {r3, pc} - .align 2, 0 -_0230CAD8: .word SWAP_SHOP_INVENTORY_PTRS -_0230CADC: .word ov11_02322FD4 -_0230CAE0: .word ov11_0230CB28 - arm_func_end ov11_0230CAA4 - - arm_func_start ov11_0230CAE4 -ov11_0230CAE4: ; 0x0230CAE4 - stmdb sp!, {r3, lr} - ldr r0, _0230CB24 ; =SWAP_SHOP_INVENTORY_PTRS - ldr r1, [r0, #4] - add r0, r1, #0x4000 - ldr r0, [r0, #0x6c8] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - add r0, r1, #0x2c8 - add r0, r0, #0x4400 - bl sub_02047150 - ldr r0, _0230CB24 ; =SWAP_SHOP_INVENTORY_PTRS - mov r1, #0 - ldr r0, [r0, #4] - add r0, r0, #0x4000 - str r1, [r0, #0x6c8] - ldmia sp!, {r3, pc} - .align 2, 0 -_0230CB24: .word SWAP_SHOP_INVENTORY_PTRS - arm_func_end ov11_0230CAE4 - - arm_func_start ov11_0230CB28 -ov11_0230CB28: ; 0x0230CB28 - stmdb sp!, {r3, r4, lr} - sub sp, sp, #0x54 - mov r4, r0 - add r0, sp, #4 - bl InitPreprocessorArgs - bl ov11_0230B874 - ldr r1, _0230CB84 ; =SWAP_SHOP_INVENTORY_PTRS - str r0, [sp, #0x28] - ldr r0, [r1, #4] -#ifdef JAPAN - add r2, sp, #4 - add r0, r0, #0x4600 - ldrh r1, [r0, #0x28] - ldr r3, _0230E130 ; =0x000032B4 - mov r0, r4 - str r1, [sp, #0x2c] - str r2, [sp] - mov r1, #6 - mov r2, #2 -#else - mov r2, #2 - add r0, r0, #0x4600 - ldrh r3, [r0, #0x28] - add r1, sp, #4 - mov r0, r4 - str r3, [sp, #0x2c] - str r1, [sp] - add r3, r2, #0x3a8 - mov r1, #6 -#endif - bl sub_020262E0 - mov r0, r4 - bl UpdateWindow - add sp, sp, #0x54 - ldmia sp!, {r3, r4, pc} - .align 2, 0 -_0230CB84: .word SWAP_SHOP_INVENTORY_PTRS -#ifdef JAPAN -_0230E130: .word 0x000032B4 -#endif - arm_func_end ov11_0230CB28 diff --git a/asm/overlay_11_02308D1C.s b/asm/overlay_11_02308D1C.s new file mode 100644 index 00000000..5c13f0b1 --- /dev/null +++ b/asm/overlay_11_02308D1C.s @@ -0,0 +1,4763 @@ + .include "asm/macros.inc" + .include "overlay_11_02308D1C.inc" + + .text + + arm_func_start ov11_02308D1C +ov11_02308D1C: ; 0x02308D1C + stmdb sp!, {r3, lr} + ldr r0, _02308D44 ; =ov11_02324D8C + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl MemFree + ldr r0, _02308D44 ; =ov11_02324D8C + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_02308D44: .word ov11_02324D8C + arm_func_end ov11_02308D1C + + arm_func_start ov11_02308D48 +ov11_02308D48: ; 0x02308D48 + stmdb sp!, {r3, lr} + ldr r0, _02308DD4 ; =ov11_02324D8C + mvn r1, #1 + ldr r0, [r0] + ldrsb r0, [r0, #6] + cmp r0, r1 + beq _02308D78 + bl CloseParentMenu + ldr r0, _02308DD4 ; =ov11_02324D8C + mvn r1, #1 + ldr r0, [r0] + strb r1, [r0, #6] +_02308D78: + ldr r0, _02308DD4 ; =ov11_02324D8C + mvn r1, #1 + ldr r0, [r0] + ldrsb r0, [r0, #5] + cmp r0, r1 + beq _02308DA4 + bl CloseTextBox2 + ldr r0, _02308DD4 ; =ov11_02324D8C + mvn r1, #1 + ldr r0, [r0] + strb r1, [r0, #5] +_02308DA4: + ldr r0, _02308DD4 ; =ov11_02324D8C + mvn r1, #1 + ldr r0, [r0] + ldrsb r0, [r0, #4] + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl CloseInventoryMenu + ldr r0, _02308DD4 ; =ov11_02324D8C + mvn r1, #1 + ldr r0, [r0] + strb r1, [r0, #4] + ldmia sp!, {r3, pc} + .align 2, 0 +_02308DD4: .word ov11_02324D8C + arm_func_end ov11_02308D48 + + arm_func_start ov11_02308DD8 +ov11_02308DD8: ; 0x02308DD8 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0xc + ldr r1, [r0] + cmp r1, #0 + bne _02308E20 + ldrsh r0, [r0, #4] + bl GetTeamMember + mov r4, r0 + bl sub_02055894 + bl sub_020564B0 + ldr r1, _02308EAC ; =ov11_02324D8C + mov r2, r0 + ldr r0, [r1] + mov r1, r4 + add r0, r0, #0x36 + add r0, r0, #0x100 + bl sub_02056094 + b _02308E94 +_02308E20: + cmp r1, #1 + bne _02308E94 + ldrsh r0, [r0, #4] + bl GetActiveTeamMember + mov r4, r0 + add r0, sp, #0 + add r1, r4, #0x5e + mov r2, #0xa + bl StrncpySimpleNoPadSafe + ldrb r0, [r4] + mov r2, #0x44 + ldr r1, _02308EB0 ; =ov11_02322DB8 + tst r0, #2 + movne r0, #1 + moveq r0, #0 + tst r0, #0xff + ldrb r0, [r4, #1] + movne r2, #0x46 + add r3, sp, #0 + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + tst r0, #0xff + ldr r0, _02308EAC ; =ov11_02324D8C + movne r2, #0x59 + ldr r0, [r0] + add r0, r0, #0x36 + add r0, r0, #0x100 + bl ov11_02308EB4 +_02308E94: + ldr r0, _02308EAC ; =ov11_02324D8C + ldr r0, [r0] + add r0, r0, #0x36 + add r0, r0, #0x100 + add sp, sp, #0xc + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_02308EAC: .word ov11_02324D8C +_02308EB0: .word ov11_02322DB8 + arm_func_end ov11_02308DD8 + + arm_func_start ov11_02308EB4 +ov11_02308EB4: ; 0x02308EB4 + stmdb sp!, {r0, r1, r2, r3} + stmdb sp!, {r3, lr} + add r2, sp, #0xc + bic r2, r2, #3 + ldr r1, [sp, #0xc] + add r2, r2, #4 + bl vsprintf + ldmia sp!, {r3, lr} + add sp, sp, #0x10 + bx lr + arm_func_end ov11_02308EB4 + + arm_func_start ov11_02308EDC +ov11_02308EDC: ; 0x02308EDC + stmdb sp!, {r3, lr} + ldr r1, _02308F10 ; =ov11_02324D8C + mvn r0, #1 + ldr r1, [r1] + ldrsb r1, [r1, #8] + cmp r1, r0 + ldmneia sp!, {r3, pc} + mov r0, #0 + bl CreateDialogueBox + ldr r1, _02308F10 ; =ov11_02324D8C + ldr r1, [r1] + strb r0, [r1, #8] + ldmia sp!, {r3, pc} + .align 2, 0 +_02308F10: .word ov11_02324D8C + arm_func_end ov11_02308EDC + + arm_func_start ov11_02308F14 +ov11_02308F14: ; 0x02308F14 + stmdb sp!, {r3, lr} + ldr r0, _02308F48 ; =ov11_02324D8C + mvn r1, #1 + ldr r0, [r0] + ldrsb r0, [r0, #8] + cmp r0, r1 + ldmeqia sp!, {r3, pc} + bl CloseDialogueBox + ldr r0, _02308F48 ; =ov11_02324D8C + mvn r1, #1 + ldr r0, [r0] + strb r1, [r0, #8] + ldmia sp!, {r3, pc} + .align 2, 0 +_02308F48: .word ov11_02324D8C + arm_func_end ov11_02308F14 + + arm_func_start ov11_02308F4C +ov11_02308F4C: ; 0x02308F4C + stmdb sp!, {r4, lr} + ldr r2, [r1] + ldr r1, [r1, #4] + mov r4, r0 + str r2, [r4] + str r1, [r4, #4] + ldr r0, [r4] + cmp r0, #0 + bne _02308F9C + ldrsh r0, [r4, #4] + bl GetTeamMember + ldrsh r3, [r0, #4] + add r2, r0, #0x14 + add r1, r0, #8 + strh r3, [r4, #8] + ldrb r0, [r0, #2] + strb r0, [r4, #0xa] + str r2, [r4, #0xc] + str r1, [r4, #0x10] + ldmia sp!, {r4, pc} +_02308F9C: + cmp r0, #1 + ldmneia sp!, {r4, pc} + ldrsh r0, [r4, #4] + bl GetActiveTeamMember + ldrsh r3, [r0, #0xc] + add r2, r0, #0x4c + add r1, r0, #6 + strh r3, [r4, #8] + ldrb r0, [r0, #3] + strb r0, [r4, #0xa] + str r2, [r4, #0xc] + str r1, [r4, #0x10] + ldmia sp!, {r4, pc} + arm_func_end ov11_02308F4C + + arm_func_start ov11_02308FD0 +ov11_02308FD0: ; 0x02308FD0 + stmdb sp!, {r3, lr} + ldr r1, [r0] + cmp r1, #1 + ldmneia sp!, {r3, pc} + ldrsh r0, [r0, #4] + bl sub_02058794 + ldmia sp!, {r3, pc} + arm_func_end ov11_02308FD0 + + arm_func_start ov11_02308FEC +ov11_02308FEC: ; 0x02308FEC + stmdb sp!, {r3, lr} + ldr r1, [r0] + cmp r1, #0 + bne _02309008 + ldrsh r0, [r0, #4] + bl sub_0203FA64 + ldmia sp!, {r3, pc} +_02309008: + cmp r1, #1 + ldmneia sp!, {r3, pc} + ldrsh r0, [r0, #4] + bl sub_0203FBD4 + ldmia sp!, {r3, pc} + arm_func_end ov11_02308FEC + + arm_func_start ov11_0230901C +ov11_0230901C: ; 0x0230901C + ldr r1, [r0] + cmp r1, #0 + ldreqsh r0, [r0, #4] + orreq r0, r0, #0x20000 + bxeq lr + cmp r1, #1 + ldreqsh r0, [r0, #4] + orreq r0, r0, #0x30000 + bx lr + arm_func_end ov11_0230901C + + arm_func_start ov11_02309040 +ov11_02309040: ; 0x02309040 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, _0230907C ; =0x00000794 + mov r1, #8 + bl MemAlloc + ldr r1, _02309080 ; =ov11_02324D90 + cmp r0, #0 + str r0, [r1] + moveq r0, #0 +#ifdef JAPAN + strne r4, [r0, #0xf4] +#else + strne r4, [r0, #0x114] +#endif + ldrne r0, [r1] + movne r1, #0 + strne r1, [r0] + movne r0, #1 + ldmia sp!, {r4, pc} + .align 2, 0 +#ifdef JAPAN +_0230907C: .word 0x00000774 +#else +_0230907C: .word 0x00000794 +#endif +_02309080: .word ov11_02324D90 + arm_func_end ov11_02309040 + + arm_func_start ov11_02309084 +ov11_02309084: ; 0x02309084 +#ifdef JAPAN +#define OV11_02309084_OFFSET -0x20 +#else +#define OV11_02309084_OFFSET 0 +#endif + stmdb sp!, {r4, lr} + mov r4, r0 + ldr r0, _023090D4 ; =0x00000794 + mov r1, #8 + bl MemAlloc + ldr r1, _023090D8 ; =ov11_02324D90 + cmp r0, #0 + str r0, [r1] + moveq r0, #0 + ldmeqia sp!, {r4, pc} + mov r2, #2 + str r2, [r0, #0x114 + OV11_02309084_OFFSET] + ldr r0, [r1] + mov r2, #0 + str r2, [r0] + ldr r1, [r1] + mov r0, #1 +#ifdef JAPAN + strh r4, [r1, #0xf8] +#else + add r1, r1, #0x100 + strh r4, [r1, #0x18] +#endif + ldmia sp!, {r4, pc} + .align 2, 0 +#ifdef JAPAN +_023090D4: .word 0x00000774 +#else +_023090D4: .word 0x00000794 +#endif +_023090D8: .word ov11_02324D90 + arm_func_end ov11_02309084 + + arm_func_start ov11_023090DC +ov11_023090DC: ; 0x023090DC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x124 + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r3, [r0] + ldr r0, [r3] + cmp r0, #0x1b + addls pc, pc, r0, lsl #2 + b _02309D74 +_023090FC: ; jump table + b _0230916C ; case 0 + b _0230955C ; case 1 + b _02309518 ; case 2 + b _02309724 ; case 3 + b _023097EC ; case 4 + b _0230984C ; case 5 + b _0230987C ; case 6 + b _023098A8 ; case 7 + b _023098E4 ; case 8 + b _023099B0 ; case 9 + b _023099CC ; case 10 + b _023099F8 ; case 11 + b _02309A2C ; case 12 + b _02309A68 ; case 13 + b _02309A8C ; case 14 + b _02309AB4 ; case 15 + b _02309AD0 ; case 16 + b _02309B40 ; case 17 + b _02309B5C ; case 18 + b _02309BA4 ; case 19 + b _02309C04 ; case 20 + b _02309CA4 ; case 21 + b _02309CE0 ; case 22 + b _02309CF8 ; case 23 + b _02309D20 ; case 24 + b _02309D38 ; case 25 + b _02309D54 ; case 26 + b _02309D6C ; case 27 +_0230916C: + ldr r5, [r3, #0x114 + OV11_02309084_OFFSET] + mov r0, #0 + str r0, [sp, #4] + ldr r8, [sp, #4] + add r4, r3, #0x11c + OV11_02309084_OFFSET + mov r2, r8 +#ifdef JAPAN + str r2, [sp, #8] + ldrsh r2, [r3, #0xf8] +#else + add r3, r3, #0x100 + str r2, [sp, #8] + ldrsh r2, [r3, #0x18] +#endif + mov r0, r4 + mov r1, r5 + str r2, [sp, #0x10] + ldr r2, _02309D84 ; =0x00401833 + add r7, r4, #0x38 + str r2, [sp, #0x14] + bl ov11_02309EE4 + mov r2, #0 + mov r1, r2 + b _023091C4 +_023091B8: + add r0, r4, r2 + strb r1, [r0, #0x70] + add r2, r2, #1 +_023091C4: + ldr r0, [r4, #0x30] + cmp r2, r0 + blt _023091B8 + cmp r5, #2 + bne _023092FC + mov sl, #0 + b _023092F0 +_023091E0: + ldr r0, [sp, #0x10] + add fp, r4, sl, lsl #3 + bl GetItemMoveId16 + ldr r1, [r4, sl, lsl #3] + mov r6, r0 + cmp r1, #1 + bne _02309258 + ldrsh r0, [fp, #4] + bl GetTeamMember + ldrsh r1, [r0, #4] + mov sb, #0 + mov r3, sb + str r1, [sp, #0xc] + mov fp, #1 + mov r1, #6 + b _0230924C +_02309220: + mla ip, sb, r1, r0 + ldrb r2, [ip, #0x22] + tst r2, #1 + movne r2, fp + moveq r2, r3 + tst r2, #0xff + beq _02309248 + ldrh r2, [ip, #0x24] + cmp r6, r2 + beq _023092B8 +_02309248: + add sb, sb, #1 +_0230924C: + cmp sb, #4 + blt _02309220 + b _023092B8 +_02309258: + cmp r1, #2 + bne _023092B8 + ldrsh r0, [fp, #4] + bl GetActiveTeamMember + ldrsh r1, [r0, #0xc] + mov sb, #0 + mov r2, sb + str r1, [sp, #0xc] + mov r3, #1 + b _023092B0 +_02309280: + add r1, r0, sb, lsl #3 + ldrb r1, [r1, #0x1c] + tst r1, #1 + movne r1, r3 + moveq r1, r2 + tst r1, #0xff + beq _023092AC + add r1, r0, sb, lsl #3 + ldrh r1, [r1, #0x20] + cmp r6, r1 + beq _023092B8 +_023092AC: + add sb, sb, #1 +_023092B0: + cmp sb, #4 + blt _02309280 +_023092B8: + ldr r1, [sp, #0xc] + mov r0, r6 + bl sub_02053D1C + cmp r0, #0 + beq _023092E0 + cmp sb, #4 + addlt r0, r4, sl + movlt r1, #3 + strltb r1, [r0, #0x70] + b _023092EC +_023092E0: + add r0, r4, sl + mov r1, #3 + strb r1, [r0, #0x70] +_023092EC: + add sl, sl, #1 +_023092F0: + ldr r0, [r4, #0x30] + cmp sl, r0 + blt _023091E0 +_023092FC: + mov sl, #0 + add r6, r4, #0x76 + add fp, sp, #0x5c + b _02309450 +_0230930C: + add sb, r4, sl, lsl #3 + ldr r0, [r4, sl, lsl #3] + cmp r0, #1 + bne _0230935C + ldrsh r0, [sb, #4] + bl GetTeamMember + ldrsh r1, [sb, #4] + mov sb, r0 + orr r0, r1, #0x20000 + str r0, [sp, #0x5c] + ldrsh r0, [sb, #4] + bl GetDexNumber + str r0, [sp, #0x80] + add r1, sb, #0x3a + add r0, sp, #0x1a + mov r2, #0 + bl RecolorNameString + add r0, sp, #0x1a + str r0, [sp, #0x94] + b _023093A0 +_0230935C: + cmp r0, #2 + bne _023093A0 + ldrsh r0, [sb, #4] + bl GetActiveTeamMember + ldrsh r1, [sb, #4] + mov sb, r0 + orr r0, r1, #0x30000 + str r0, [sp, #0x5c] + ldrsh r0, [sb, #0xc] + bl GetDexNumber + str r0, [sp, #0x80] + add r1, sb, #0x5e + add r0, sp, #0x1a + mov r2, #0 + bl RecolorNameString + add r0, sp, #0x1a + str r0, [sp, #0x94] +_023093A0: + cmp r5, #1 + mov r1, #0x100 + mov r3, #0 + bne _023093C8 + ldr r2, _02309D88 ; =ov11_02322E58 + add r0, r6, r8, lsl #8 + str fp, [sp] + mov sb, r8, lsl #8 + bl PreprocessString + b _0230941C +_023093C8: + cmp r5, #2 + bne _02309408 + add r0, r4, sl + ldrb r0, [r0, #0x70] + mov sb, r8, lsl #8 + tst r0, #2 + str fp, [sp] + beq _023093F8 + ldr r2, _02309D8C ; =ov11_02322E7C + add r0, r6, r8, lsl #8 + bl PreprocessString + b _0230941C +_023093F8: + ldr r2, _02309D88 ; =ov11_02322E58 + add r0, r6, r8, lsl #8 + bl PreprocessString + b _0230941C +_02309408: + ldr r2, _02309D90 ; =ov11_02322EA0 + add r0, r6, r8, lsl #8 + str fp, [sp] + mov sb, r8, lsl #8 + bl PreprocessString +_0230941C: + add r0, r4, sl + ldrb r0, [r0, #0x70] + add r8, r8, #1 + cmp r0, #0 + ldreq r0, [sp, #4] + cmpeq r0, #0 + moveq r0, #1 + streq r0, [sp, #4] + add r0, r6, sb + stmia r7, {r0, sl} + streq sl, [sp, #8] + add r7, r7, #8 + add sl, sl, #1 +_02309450: + ldr r0, [r4, #0x30] + cmp sl, r0 + blt _0230930C + mov r3, #0 + str r3, [r7] + sub r0, r3, #1 + str r0, [r7, #4] + ldr r0, [sp, #8] + ldr r1, _02309D80 ; =ov11_02324D90 + str r0, [r4, #0x34] + ldr r0, [r1] + mov r2, #0x10 + str r2, [r0, #0x88 + OV11_02309084_OFFSET] + ldr r0, [r1] + str r3, [r0, #0x7c + OV11_02309084_OFFSET] + ldr r3, [r1] + ldr r0, [r3, #0x114 + OV11_02309084_OFFSET] + cmp r0, #1 + ldreq r0, _02309D94 ; =0x000002F2 + streqh r0, [r3, #0x84 + OV11_02309084_OFFSET] + beq _023094E0 + cmp r0, #2 + ldrne r0, _02309D98 ; =0x00000A3A + strneh r0, [r3, #0x84 + OV11_02309084_OFFSET] + bne _023094E0 + ldr r2, _02309D94 ; =0x000002F2 + ldr r0, [sp, #0x14] + strh r2, [r3, #0x84 + OV11_02309084_OFFSET] + orr r0, r0, #0x200 + ldr r2, [r1] + str r0, [sp, #0x14] + add r0, r2, #0x18c + OV11_02309084_OFFSET + str r0, [r2, #0xdc + OV11_02309084_OFFSET] + ldr r1, [r1] + ldr r0, [r1, #0x150 + OV11_02309084_OFFSET] + str r0, [r1, #0x7c + OV11_02309084_OFFSET] +_023094E0: + ldr r1, _02309D80 ; =ov11_02324D90 + ldr r0, _02309D9C ; =ov11_02322DD0 + ldr r3, [r1] + ldr r1, [sp, #0x14] + add r2, r3, #0x7c + OV11_02309084_OFFSET + add r3, r3, #0x154 + OV11_02309084_OFFSET + bl CreateParentMenu + ldr r1, _02309D80 ; =ov11_02324D90 + mov r2, #1 + ldr r3, [r1] + strb r0, [r3, #4] + ldr r0, [r1] + str r2, [r0] + b _02309D74 +_02309518: + ldrsb r0, [r3, #4] + bl sub_02028354 + cmp r0, #3 + bne _02309538 + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r0, [r0] + ldrsb r0, [r0, #4] + bl sub_0202810C +_02309538: + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r0, [r0] + ldrsb r0, [r0, #4] + bl ResumeParentMenu + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #1 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_0230955C: + add r1, sp, #0x18 + mov r0, #0 + ldr r5, [r3, #0x114 + OV11_02309084_OFFSET] + bl GetPressedButtons + ldrh r0, [sp, #0x18] + tst r0, #8 + beq _02309584 + cmp r5, #0 + moveq r0, #1 + beq _02309588 +_02309584: + mov r0, #0 +_02309588: + cmp r0, #0 + beq _023095E0 + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r4, [r0] + ldrsb r0, [r4, #4] + bl GetWindowIdSelectedItemOnPage + add r0, r4, r0, lsl #3 + ldr r1, [r0, #0x158 + OV11_02309084_OFFSET] + ldr r0, _02309D80 ; =ov11_02324D90 + str r1, [r4, #0x10] + ldr r0, [r0] + ldrsb r0, [r0, #4] + bl sub_0202B030 + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r0, [r0] + ldrsb r0, [r0, #4] + bl sub_0202812C + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #4 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_023095E0: + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r0, [r0] + ldrsb r0, [r0, #4] + bl IsParentMenuActive + cmp r0, #0 + bne _02309D74 + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r0, [r0] + ldrsb r0, [r0, #4] + bl GetSimpleMenuResult__0202AEA4 + cmp r0, #0 + blt _02309704 + ldr r1, _02309D80 ; =ov11_02324D90 + ldr r2, [r1] + str r0, [r2, #0x10] + ldr r1, [r1] + add r2, r1, #0x11c + OV11_02309084_OFFSET + ldr r1, [r2, r0, lsl #3] + add r5, r2, r0, lsl #3 + cmp r1, #1 + bne _02309644 + ldrsh r0, [r5, #4] + bl GetTeamMember + ldrsh r4, [r0, #4] + b _02309658 +_02309644: + cmp r1, #2 + bne _02309658 + ldrsh r0, [r5, #4] + bl GetActiveTeamMember + ldrsh r4, [r0, #0xc] +_02309658: + mov r0, r5 + bl ov11_0230A044 + ldr r1, _02309D80 ; =ov11_02324D90 + mov r5, r0 + ldr r1, [r1] + ldr r0, [r1, #0x114 + OV11_02309084_OFFSET] + sub r0, r0, #1 + cmp r0, #1 + movls r0, #0x1a + strls r0, [r1] + bls _02309D74 + bl GetGameMode + cmp r0, #5 + beq _023096D0 + cmp r4, #0x140 + bne _023096D0 + mov r0, r5 + mov r1, r4 + bl StrcmpMonsterName + cmp r0, #0 + beq _023096D0 + ldr r0, _02309DA0 ; =ov11_02322DE0 + ldr r3, _02309DA4 ; =ov11_02322E28 + mov r1, #0x13 + mov r2, #0 + bl CreateParentMenuFromStringIds + ldr r1, _02309D80 ; =ov11_02324D90 + ldr r1, [r1] + strb r0, [r1, #5] + b _023096F0 +_023096D0: + ldr r0, _02309DA0 ; =ov11_02322DE0 + ldr r3, _02309DA8 ; =ov11_02322E00 + mov r1, #0x13 + mov r2, #0 + bl CreateParentMenuFromStringIds + ldr r1, _02309D80 ; =ov11_02324D90 + ldr r1, [r1] + strb r0, [r1, #5] +_023096F0: + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #3 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_02309704: + ldr r0, _02309D80 ; =ov11_02324D90 + mov r3, #0x1a + ldr r2, [r0] + sub r1, r3, #0x1b + str r3, [r2] + ldr r0, [r0] + str r1, [r0, #0x10] + b _02309D74 +_02309724: + ldrsb r0, [r3, #5] + bl IsParentMenuActive + cmp r0, #0 + bne _02309D74 + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r0, [r0] + ldrsb r0, [r0, #5] + bl GetSimpleMenuResult__0202AEA4 + mvn r1, #0 + cmp r0, r1 + beq _023097C8 + ldr r1, _02309D80 ; =ov11_02324D90 + cmp r0, #3 + ldr r2, [r1] + str r0, [r2, #0x14] + addls pc, pc, r0, lsl #2 + b _023097B4 +_02309768: ; jump table + b _02309778 ; case 0 + b _02309788 ; case 1 + b _02309798 ; case 2 + b _023097A8 ; case 3 +_02309778: + ldr r0, [r1] + mov r1, #4 + str r1, [r0] + b _023097B4 +_02309788: + ldr r0, [r1] + mov r1, #7 + str r1, [r0] + b _023097B4 +_02309798: + ldr r0, [r1] + mov r1, #0xc + str r1, [r0] + b _023097B4 +_023097A8: + ldr r0, [r1] + mov r1, #0xe + str r1, [r0] +_023097B4: + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r0, [r0] + ldrsb r0, [r0, #4] + bl sub_0202812C + b _023097D8 +_023097C8: + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #2 + ldr r0, [r0] + str r1, [r0] +_023097D8: + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r0, [r0] + ldrsb r0, [r0, #5] + bl CloseParentMenu + b _02309D74 +_023097EC: + ldr r0, [r3, #0x10] + add r1, r3, #0x11c + OV11_02309084_OFFSET + add r4, r1, r0, lsl #3 + ldrsh r0, [r4, #4] + bl GetActiveTeamMember + ldrb r0, [r0, #1] + cmp r0, #0 + movne r5, #1 + ldrsh r0, [r4, #4] + moveq r5, #0 + bl GetActiveTeamMember + mov r1, r0 + add r0, sp, #0xac + and r2, r5, #0xff + bl CreateMonsterSummaryFromTeamMember + add r0, sp, #0xac + mov r1, #3 + bl sub_0203F150 + ldr r1, _02309D80 ; =ov11_02324D90 + mov r2, #5 + ldr r3, [r1] + strb r0, [r3, #9] + ldr r0, [r1] + str r2, [r0] +_0230984C: + bl sub_0203F398 + cmp r0, #1 + bne _02309D74 + bl sub_0203F974 + ldr r0, _02309D80 ; =ov11_02324D90 + mov r3, #1 + ldr r2, [r0] + mov r1, #6 + str r3, [r2, #0x18] + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_0230987C: + ldr r1, [r3, #0x18] + sub r0, r1, #1 + str r0, [r3, #0x18] + cmp r1, #0 + bne _02309D74 + bl sub_0203F990 + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #2 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_023098A8: + ldr r0, [r3, #0x10] +#ifdef JAPAN + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 +#else + add r0, r3, r0, lsl #3 + add r0, r0, #0x100 + ldrsh r0, [r0, #0x20] +#endif + bl sub_0203FBD4 + mov r1, #0 + mov r2, r1 + mov r0, #9 + bl sub_0204018C + ldr r1, _02309D80 ; =ov11_02324D90 + mov r2, #8 + ldr r3, [r1] + strb r0, [r3, #0xa] + ldr r0, [r1] + str r2, [r0] +_023098E4: + bl sub_020407EC + cmp r0, #1 + bne _02309934 + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r1, [r0] + ldr r0, [r1, #0x10] + add r0, r1, r0, lsl #3 + add r0, r0, #0x100 + ldrsh r0, [r0, #0x20 + OV11_02309084_OFFSET] + bl sub_0203FDEC + bl sub_020407C0 + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r0, [r0] + ldrsb r0, [r0, #0xa] + bl CloseAdvancedTextBox + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #2 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_02309934: + cmp r0, #2 + cmpne r0, #7 + bne _02309D74 + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r1, [r0] + ldr r0, [r1, #0x10] + add r1, r1, #0x11c + OV11_02309084_OFFSET + add r4, r1, r0, lsl #3 + bl sub_0203FD38 + ldr r2, _02309D80 ; =ov11_02324D90 + mov r1, r0 + ldr r0, [r2] + mov r2, #0x20 + add r0, r0, #0x1e + bl MemcpySimple + bl sub_02041094 + ldr r1, _02309D80 ; =ov11_02324D90 + ldr r1, [r1] + strh r0, [r1, #0x1c] + ldrsh r0, [r4, #4] + bl sub_0203FDEC + bl sub_020407C0 + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r0, [r0] + ldrsb r0, [r0, #0xa] + bl CloseAdvancedTextBox + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #0xa + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_023099B0: + ldrsb r0, [r3, #0xa] + bl sub_020307EC + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #8 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_023099CC: + ldrsh r2, [r3, #0x1c] + add r0, r3, #0x1e + mov r1, #4 + mov r3, #1 + bl sub_020417A8 + ldr r1, _02309D80 ; =ov11_02324D90 + mov r2, #0xb + ldr r3, [r1] + strb r0, [r3, #0xb] + ldr r0, [r1] + str r2, [r0] +_023099F8: + bl sub_02041A18 + cmp r0, #1 + bne _02309D74 + bl sub_02041A00 + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r0, [r0] + ldrsb r0, [r0, #0xb] + bl CloseScrollBox + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #7 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_02309A2C: + ldr r0, [r3, #0x10] + add r0, r3, r0, lsl #3 + add r0, r0, #0x100 + ldrsh r0, [r0, #0x20 + OV11_02309084_OFFSET] + bl GetActiveTeamMember + mov r1, r0 + ldrsh r0, [r1, #0xc] + ldrsh r2, [r1, #6] + add r1, r1, #0x4c + mov r3, #0 + bl PrintIqSkillsMenu + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #0xd + ldr r0, [r0] + str r1, [r0] +_02309A68: + bl sub_02041B7C + cmp r0, #1 + bne _02309D74 + bl sub_020420F4 + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #2 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_02309A8C: + bl ov11_0230D92C + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r0, [r0] + ldrsb r0, [r0, #4] + bl CloseParentMenu + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #0xf + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_02309AB4: + bl ov11_0230D220 + cmp r0, #0 + ldreq r0, _02309D80 ; =ov11_02324D90 + moveq r1, #0x10 + ldreq r0, [r0] + streq r1, [r0] + b _02309D74 +_02309AD0: + ldr r0, [r3, #0x10] + add r1, r3, #0x11c + OV11_02309084_OFFSET + add r0, r1, r0, lsl #3 + bl ov11_0230A044 + ldr r2, _02309D80 ; =ov11_02324D90 + mov r1, r0 + ldr r0, [r2] + mov r2, #0xa + add r0, r0, #0x3e + bl StrncpySimpleNoPad + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r1, [r0] +#ifdef JAPAN + add r0, r1, #0x48 +#else + add r0, r1, #0x52 +#endif + add r1, r1, #0x3e + bl StrcpySimple + ldr r1, _02309D80 ; =ov11_02324D90 + mov r0, #2 + ldr r3, [r1] + mov r2, #0 + add r1, r3, #0x3e +#ifdef JAPAN + add r3, r3, #0x48 +#else + add r3, r3, #0x52 +#endif + bl ShowKeyboard + bl ov11_02310BDC + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #0x11 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_02309B40: + bl ov11_0230D220 + cmp r0, #0 + ldreq r0, _02309D80 ; =ov11_02324D90 + moveq r1, #0x12 + ldreq r0, [r0] + streq r1, [r0] + b _02309D74 +_02309B5C: + bl GetKeyboardStatus + cmp r0, #3 + bne _02309D74 + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #0xa + ldr r0, [r0] + str r1, [r0, #0x18] + bl GetKeyboardStringResult + ldr r2, _02309D80 ; =ov11_02324D90 + mov r1, r0 + ldr r0, [r2] + add r0, r0, #0x3e + bl StrcpySimple + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #0x13 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_02309BA4: + bl sub_02037468 + cmp r0, #0 + beq _02309D74 + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r3, [r0] + ldr r2, [r3, #0x18] + sub r1, r2, #1 + str r1, [r3, #0x18] + cmp r2, #0 + bgt _02309D74 + ldr r1, [r0] + mov r2, #0xa +#ifdef JAPAN + add r0, r1, #0x52 +#else + add r0, r1, #0x66 +#endif + add r1, r1, #0x3e + bl StrncpySimpleNoPadSafe + ldr r0, _02309D80 ; =ov11_02324D90 + ldr r0, [r0] +#ifdef JAPAN + add r0, r0, #0x52 +#else + add r0, r0, #0x66 +#endif + bl sub_0203909C + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #0x14 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_02309C04: + ldr r0, [r3, #0x10] + add r1, r3, #0x11c + OV11_02309084_OFFSET + add r4, r1, r0, lsl #3 + mov r0, r4 + bl ov11_0230A044 + mov r5, r0 + bl sub_0203931C + mvn r1, #0 + cmp r0, r1 + beq _02309D74 + cmp r0, #0 + beq _02309C4C + cmp r0, #1 + ldreq r0, _02309D80 ; =ov11_02324D90 + moveq r1, #0x15 + ldreq r0, [r0] + streq r1, [r0] + b _02309D74 +_02309C4C: + ldr r1, _02309D80 ; =ov11_02324D90 + mov r0, r5 + ldr r1, [r1] + mov r2, #0xa + add r1, r1, #0x3e + bl StrncpySimple + ldr r1, _02309D80 ; =ov11_02324D90 + mov r0, r5 + ldr r1, [r1] + mov r2, #0xa + add r1, r1, #0x3e + bl StrncpySimple + ldr r0, [r4] + cmp r0, #2 + bne _02309C90 + ldrsh r0, [r4, #4] + bl sub_02058794 +_02309C90: + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #0x16 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_02309CA4: + bl sub_02039218 + cmp r0, #0 + beq _02309D74 + ldr r1, _02309D80 ; =ov11_02324D90 + mov r0, #2 + ldr r3, [r1] + mov r2, #0 + add r1, r3, #0x3e +#ifdef JAPAN + add r3, r3, #0x48 +#else + add r3, r3, #0x52 +#endif + bl ShowKeyboard + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #0x12 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_02309CE0: + bl ov11_0230D92C + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #0x17 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_02309CF8: + bl ov11_0230D220 + cmp r0, #0 + bne _02309D74 + bl sub_02039218 + cmp r0, #0 + ldrne r0, _02309D80 ; =ov11_02324D90 + movne r1, #0x18 + ldrne r0, [r0] + strne r1, [r0] + b _02309D74 +_02309D20: + bl ov11_0230D000 + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #0x19 + ldr r0, [r0] + str r1, [r0] + b _02309D74 +_02309D38: + bl ov11_0230D220 + cmp r0, #0 + ldreq r0, _02309D80 ; =ov11_02324D90 + moveq r1, #0 + ldreq r0, [r0] + streq r1, [r0] + b _02309D74 +_02309D54: + ldrsb r0, [r3, #4] + bl CloseParentMenu + ldr r0, _02309D80 ; =ov11_02324D90 + mov r1, #0x1b + ldr r0, [r0] + str r1, [r0] +_02309D6C: + mov r0, #1 + b _02309D78 +_02309D74: + mov r0, #0 +_02309D78: + add sp, sp, #0x124 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_02309D80: .word ov11_02324D90 +_02309D84: .word 0x00401833 +_02309D88: .word ov11_02322E58 +_02309D8C: .word ov11_02322E7C +_02309D90: .word ov11_02322EA0 +#ifdef JAPAN +_02309D94: .word 0x00002FF2 +_02309D98: .word 0x00000875 +#else +_02309D94: .word 0x000002F2 +_02309D98: .word 0x00000A3A +#endif +_02309D9C: .word ov11_02322DD0 +_02309DA0: .word ov11_02322DE0 +_02309DA4: .word ov11_02322E28 +_02309DA8: .word ov11_02322E00 + arm_func_end ov11_023090DC + + arm_func_start ov11_02309DAC +ov11_02309DAC: ; 0x02309DAC + ldr r1, _02309DF4 ; =ov11_02324D90 + ldr r1, [r1] + ldr r2, [r1, #0x10] +#ifdef JAPAN + add r3, r1, #0xfc +#else + add r3, r1, #0x11c +#endif + ldr r1, [r3, r2, lsl #3] + add r2, r3, r2, lsl #3 + cmp r1, #1 + moveq r1, #0 + streq r1, [r0] + ldreqsh r1, [r2, #4] + streqh r1, [r0, #4] + bxeq lr + cmp r1, #2 + moveq r1, #1 + streq r1, [r0] + ldreqsh r1, [r2, #4] + streqh r1, [r0, #4] + bx lr + .align 2, 0 +_02309DF4: .word ov11_02324D90 + arm_func_end ov11_02309DAC + + arm_func_start ov11_02309DF8 +ov11_02309DF8: ; 0x02309DF8 + stmdb sp!, {r3, lr} + ldr r0, _02309E20 ; =ov11_02324D90 + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl MemFree + ldr r0, _02309E20 ; =ov11_02324D90 + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_02309E20: .word ov11_02324D90 + arm_func_end ov11_02309DF8 + + arm_func_start ov11_02309E24 +ov11_02309E24: ; 0x02309E24 + ldr r0, _02309E44 ; =ov11_02324D90 + ldr r0, [r0] + cmp r0, #0 + ldrne r0, [r0, #0x10] + movne r0, r0, lsl #0x10 + movne r0, r0, asr #0x10 + mvneq r0, #0 + bx lr + .align 2, 0 +_02309E44: .word ov11_02324D90 + arm_func_end ov11_02309E24 + + arm_func_start ov11_02309E48 +ov11_02309E48: ; 0x02309E48 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r0, #0x34 + mov r1, #0 + mov r5, #1 + bl MemAlloc + mov r1, #2 + mov r4, r0 + bl ov11_02309EE4 + mov r6, #0 + b _02309EBC +_02309E74: + ldr r0, [r4, r6, lsl #3] + add r1, r4, r6, lsl #3 + cmp r0, #1 + bne _02309E9C + ldrsh r0, [r1, #4] + mov r1, r7 + bl sub_02055FCC + cmp r0, #0 + bne _02309EC8 + b _02309EB8 +_02309E9C: + cmp r0, #2 + bne _02309EB8 + ldrsh r0, [r1, #4] + mov r1, r7 + bl sub_020586F0 + cmp r0, #0 + bne _02309EC8 +_02309EB8: + add r6, r6, #1 +_02309EBC: + ldr r0, [r4, #0x30] + cmp r6, r0 + blt _02309E74 +_02309EC8: + ldr r0, [r4, #0x30] + cmp r6, r0 + mov r0, r4 + moveq r5, #0 + bl MemFree + mov r0, r5 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov11_02309E48 + + arm_func_start ov11_02309EE4 +ov11_02309EE4: ; 0x02309EE4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r4, #0 + mov sl, r0 + mov r5, r1 + mov r1, r4 + str r4, [sl, #0x30] + mov r0, r4 +_02309F00: + str r0, [sl, r1, lsl #3] + add r1, r1, #1 + cmp r1, #6 + blt _02309F00 + bl sub_0204E210 + mvn r1, #0 + cmp r0, r1 + bne _02309F2C + bl sub_0205633C + cmp r0, #0 + moveq r4, #1 +_02309F2C: + cmp r4, #0 + beq _02309FD4 + sub r0, r5, #1 + cmp r0, #1 + bhi _02309FD4 + bl GetGameMode + cmp r0, #1 + ldrls sb, _0230A03C ; =ov11_02322DC8 + mov fp, #2 + ldrhi sb, _0230A040 ; =ov11_02322DF0 + mov r5, #1 + mvn r4, #0 + b _02309FB8 +_02309F60: + ldrsh r0, [sb], #2 + bl GetActorMatchingStorageId + ldr r1, [sl, #0x30] + mov r7, r0 + cmp r7, r4 + add r8, sl, r1, lsl #3 + beq _02309FB8 + bl GetActiveRosterIndex + mov r6, r0 + cmp r6, r4 + streq r5, [r8] + streqh r7, [r8, #4] + beq _02309FAC + bl GetActiveTeamMember + ldrsh r0, [r0, #8] + bl CheckTeamMemberIdx + cmp r0, #0 + streq fp, [r8] + streqh r6, [r8, #4] +_02309FAC: + ldr r0, [sl, #0x30] + add r0, r0, #1 + str r0, [sl, #0x30] +_02309FB8: + ldrsh r0, [sb] + cmp r0, r4 + beq _0230A034 + ldr r0, [sl, #0x30] + cmp r0, #6 + blt _02309F60 + b _0230A034 +_02309FD4: + mov r7, #0 + mov r8, sl + mov r5, r7 + mov r6, #1 + mov r4, #2 +_02309FE8: + mov r0, r7 + bl GetActiveTeamMember + ldrb r0, [r0] + tst r0, #1 + movne r0, r6 + moveq r0, r5 + tst r0, #0xff + beq _0230A020 + str r4, [r8] + strh r7, [r8, #4] + ldr r0, [sl, #0x30] + add r8, r8, #8 + add r0, r0, #1 + str r0, [sl, #0x30] +_0230A020: + add r0, r7, #1 + mov r0, r0, lsl #0x10 + mov r7, r0, asr #0x10 + cmp r7, #4 + blt _02309FE8 +_0230A034: + ldr r0, [sl, #0x30] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0230A03C: .word ov11_02322DC8 +_0230A040: .word ov11_02322DF0 + arm_func_end ov11_02309EE4 + + arm_func_start ov11_0230A044 +ov11_0230A044: ; 0x0230A044 + stmdb sp!, {r3, lr} + ldr r1, [r0] + cmp r1, #1 + bne _0230A064 + ldrsh r0, [r0, #4] + bl GetTeamMember + add r0, r0, #0x3a + ldmia sp!, {r3, pc} +_0230A064: + cmp r1, #2 + ldmneia sp!, {r3, pc} + ldrsh r0, [r0, #4] + bl GetActiveTeamMember + add r0, r0, #0x5e + ldmia sp!, {r3, pc} + arm_func_end ov11_0230A044 + + arm_func_start ov11_0230A07C +ov11_0230A07C: ; 0x0230A07C + stmdb sp!, {r3, lr} + ldr r0, _0230A0CC ; =ov11_02322ECC + bl InitMenu + cmp r0, #0 + ldmeqia sp!, {r3, pc} + mov r0, #0xc + mov r1, #8 + bl MemAlloc + ldr r1, _0230A0D0 ; =ov11_02324D94 + mov r3, #0 + str r0, [r1] + str r3, [r0, #4] + ldr r0, [r1] + sub r2, r3, #2 + str r3, [r0, #8] + ldr r0, [r1] + strb r2, [r0] + ldr r0, [r1] + strb r2, [r0, #1] + ldmia sp!, {r3, pc} + .align 2, 0 +_0230A0CC: .word ov11_02322ECC +_0230A0D0: .word ov11_02324D94 + arm_func_end ov11_0230A07C + + arm_func_start ov11_0230A0D4 +ov11_0230A0D4: ; 0x0230A0D4 + stmdb sp!, {r3, lr} + ldr r0, _0230A0FC ; =ov11_02324D94 + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl MemFree + ldr r0, _0230A0FC ; =ov11_02324D94 + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_0230A0FC: .word ov11_02324D94 + arm_func_end ov11_0230A0D4 + + arm_func_start ov11_0230A100 +ov11_0230A100: ; 0x0230A100 + stmdb sp!, {r4, lr} + sub sp, sp, #0x138 + ldr r0, _0230A2B0 ; =ov11_02324D94 + ldr r2, [r0] + ldr r0, [r2, #8] + cmp r0, #6 + addls pc, pc, r0, lsl #2 + b _0230A2A4 +_0230A120: ; jump table + b _0230A13C ; case 0 + b _0230A184 ; case 1 + b _0230A13C ; case 2 + b _0230A1F4 ; case 3 + b _0230A258 ; case 4 + b _0230A298 ; case 5 + b _0230A298 ; case 6 +_0230A13C: + ldr lr, [r2, #4] + ldr ip, _0230A2B4 ; =0x00003FB8 + mov r4, #0x10 + ldr r0, _0230A2B8 ; =ov11_02322EAC + ldr r1, _0230A2BC ; =0x00401833 + ldr r3, _0230A2C0 ; =ov11_02322EDC + add r2, sp, #0xa0 + str lr, [sp, #0xa0] + strh ip, [sp, #0xa8] + str r4, [sp, #0xac] + bl CreateParentMenuFromStringIds + ldr r1, _0230A2B0 ; =ov11_02324D94 + mov r2, #1 + ldr r3, [r1] + strb r0, [r3] + ldr r0, [r1] + str r2, [r0, #8] + b _0230A2A4 +_0230A184: + ldrsb r0, [r2] + bl IsParentMenuActive + cmp r0, #0 + bne _0230A2A4 + ldr r0, _0230A2B0 ; =ov11_02324D94 + ldr r0, [r0] + ldrsb r0, [r0] + bl GetSimpleMenuResult__0202AEA4 + ldr r1, _0230A2B0 ; =ov11_02324D94 + mov r4, r0 + ldr r0, [r1] + ldrsb r0, [r0] + bl CloseParentMenu + ldr r0, _0230A2B0 ; =ov11_02324D94 + mvn r2, #1 + ldr r1, [r0] + cmp r4, #0 + strb r2, [r1] + ldrlt r0, [r0] + movlt r1, #6 + strlt r1, [r0, #8] + blt _0230A2A4 + ldr r2, [r0] + mov r1, #3 + str r4, [r2, #4] + ldr r0, [r0] + str r1, [r0, #8] + b _0230A2A4 +_0230A1F4: + mov r0, #0x10 + str r0, [sp, #0x14] + ldr r1, [r2, #4] + ldr r0, _0230A2C0 ; =ov11_02322EDC + mov r1, r1, lsl #3 + ldrh r1, [r0, r1] + mov r4, #8 + ldr r0, _0230A2C4 ; =ov11_02322EBC + strh r1, [sp, #0x10] + ldr r2, [r2, #4] + ldr r1, _0230A2C8 ; =0x00009833 + str r2, [sp, #8] + str r4, [sp] + mov r4, #1 + ldr r3, _0230A2CC ; =ov11_0230A2D0 + add r2, sp, #8 + str r4, [sp, #4] + bl CreateAdvancedTextBox + ldr r1, _0230A2B0 ; =ov11_02324D94 + mov r2, #4 + ldr r3, [r1] + strb r0, [r3, #1] + ldr r0, [r1] + str r2, [r0, #8] + b _0230A2A4 +_0230A258: + ldrsb r0, [r2, #1] + bl IsAdvancedTextBoxActive + cmp r0, #0 + bne _0230A2A4 + ldr r0, _0230A2B0 ; =ov11_02324D94 + ldr r0, [r0] + ldrsb r0, [r0, #1] + bl CloseAdvancedTextBox + ldr r0, _0230A2B0 ; =ov11_02324D94 + mvn r3, #1 + ldr r2, [r0] + mov r1, #2 + strb r3, [r2, #1] + ldr r0, [r0] + str r1, [r0, #8] + b _0230A2A4 +_0230A298: + bl ov11_02301174 + mov r0, #4 + b _0230A2A8 +_0230A2A4: + mov r0, #1 +_0230A2A8: + add sp, sp, #0x138 + ldmia sp!, {r4, pc} + .align 2, 0 +_0230A2B0: .word ov11_02324D94 +#if defined(EUROPE) +_0230A2B4: .word 0x00003FBA +#elif defined(JAPAN) +_0230A2B4: .word 0x000049BB +#else +_0230A2B4: .word 0x00003FB8 +#endif +_0230A2B8: .word ov11_02322EAC +_0230A2BC: .word 0x00401833 +_0230A2C0: .word ov11_02322EDC +_0230A2C4: .word ov11_02322EBC +_0230A2C8: .word 0x00009833 +_0230A2CC: .word ov11_0230A2D0 + arm_func_end ov11_0230A100 + + arm_func_start ov11_0230A2D0 +ov11_0230A2D0: ; 0x0230A2D0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + bl GetWindowIdPageStart + mov r4, r0 + ldr r0, _0230A318 ; =ov11_02322EDC + mov r1, r4, lsl #3 + ldrh r1, [r0, r1] + mov r0, r5 + bl SetWindowTitle +#if defined(EUROPE) + add r0, r4, #0xc3 + add r0, r0, #0x3f00 +#elif defined(JAPAN) + add r0, r4, #0x1c4 + add r0, r0, #0x4800 +#else + add r0, r4, #0xc1 + add r0, r0, #0x3f00 +#endif + mov r1, r0, lsl #0x10 + mov r0, r5 + mov r3, r1, lsr #0x10 + mov r1, #4 + mov r2, #0x10 + bl AppendStandardStringToMission + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0230A318: .word ov11_02322EDC + arm_func_end ov11_0230A2D0 + + arm_func_start ov11_0230A31C +ov11_0230A31C: ; 0x0230A31C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r0, #0x148 + mov r1, #8 + bl MemAlloc + ldr r2, _0230A38C ; =ov11_02324D98 + mov r1, #0x148 + str r0, [r2, #4] + bl MemZero + ldr r0, _0230A38C ; =ov11_02324D98 + mov ip, #4 + ldr r4, [r0, #4] + stmib r4, {r5, r6} + add lr, r4, #0xc +_0230A358: + ldmia r6!, {r0, r1, r2, r3} + stmia lr!, {r0, r1, r2, r3} + subs ip, ip, #1 + bne _0230A358 + ldr r1, [r6] + mvn r0, #1 + str r1, [lr] + strb r0, [r4, #0x74] + strb r0, [r4, #0x78] + mov r0, #0 + str r0, [r4] + str r0, [r4, #0x144] + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_0230A38C: .word ov11_02324D98 + arm_func_end ov11_0230A31C + + arm_func_start ov11_0230A390 +ov11_0230A390: ; 0x0230A390 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x1b4 + ldr r0, _0230AD0C ; =ov11_02324D98 + ldr sb, [r0, #4] + ldr r0, [sb] + cmp r0, #0xe + addls pc, pc, r0, lsl #2 + b _0230AD00 +_0230A3B0: ; jump table + b _0230A3EC ; case 0 + b _0230A41C ; case 1 + b _0230A4B8 ; case 2 + b _0230A510 ; case 3 + b _0230A68C ; case 4 + b _0230A68C ; case 5 + b _0230A6C8 ; case 6 + b _0230A6E4 ; case 7 + b _0230A750 ; case 8 + b _0230A844 ; case 9 + b _0230A958 ; case 10 + b _0230A98C ; case 11 + b _0230A9D0 ; case 12 + b _0230AB1C ; case 13 + b _0230ACE4 ; case 14 +_0230A3EC: + ldr r0, [sb, #8] + ldrb r0, [r0, #1] + cmp r0, #0x64 + bhs _0230A410 + ldr r0, [sb, #4] + cmp r0, #0 + ble _0230A410 + mov r0, #1 + bl sub_02017C50 +_0230A410: + mov r0, #1 + str r0, [sb] + b _0230AD00 +_0230A41C: + ldr r5, [sb, #8] + ldrb r2, [r5, #1] + cmp r2, #0x64 + bhs _0230A440 + ldrb r1, [sb, #0xd] + ldr r0, [sb, #4] + add r0, r1, r0 + cmp r2, r0 + blt _0230A44C +_0230A440: + mov r0, #0xd + str r0, [sb] + b _0230AD00 +_0230A44C: + mov r0, #0x100 + mov r1, #0xf + bl MemAlloc + mov r4, r0 + mov r0, r5 + bl sub_020546E8 + add r0, sp, #0x164 + bl InitPreprocessorArgs + mov r0, r5 + bl sub_02055894 + bl sub_020564B0 + mov r2, r0 + mov r0, r4 + mov r1, r5 + bl sub_02056094 + str r4, [sp, #0x19c] + ldrb r2, [r5, #1] + ldr r1, _0230AD10 ; =0x000004A6 + mov r0, #0x1c + str r2, [sp, #0x188] + add r2, sp, #0x164 + bl sub_02046BE8 + mov r0, r4 + bl MemFree + mov r0, #2 + str r0, [sb] + b _0230AD00 +_0230A4B8: + bl sub_02046C78 + cmp r0, #0 + movne r0, #6 + moveq r0, #0 + cmp r0, #6 + bne _0230AD00 +#ifdef JAPAN + ldr r0, [sb, #8] + ldr r3, _0230C2B4 ; =0x000003E7 + ldrsh r1, [r0, #4] + ldrb r2, [r0, #1] + add r0, sb, #0x54 +#else + ldr r3, [sb, #8] + add r0, sb, #0x54 + ldrsh r1, [r3, #4] + ldrb r2, [r3, #1] + ldrsh r3, [r3, #8] +#endif + bl sub_02053A0C + strh r0, [sb, #0x50] + mov r0, #0 + strh r0, [sb, #0x52] + ldrh r0, [sb, #0x50] + cmp r0, #0 + movne r0, #3 + strne r0, [sb] + moveq r0, #1 + streq r0, [sb] + b _0230AD00 +_0230A510: + ldrh r1, [sb, #0x52] + ldrh r0, [sb, #0x50] + ldr r4, [sb, #8] + mov r8, #0 + cmp r1, r0 + movhs r0, #1 + sub r5, r8, #1 + strhs r0, [sb] + bhs _0230AD00 + mov sl, r8 + add r2, sb, r1, lsl #1 + mov r6, r8 + mov r7, #1 + mov r0, #6 + b _0230A58C +_0230A54C: + mla r3, sl, r0, r4 + ldrb r1, [r3, #0x22] + tst r1, #1 + movne r1, r7 + moveq r1, r6 + tst r1, #0xff + beq _0230A580 + ldrh r3, [r3, #0x24] + ldrh r1, [r2, #0x54] + cmp r3, r1 + bne _0230A588 + mov r8, #1 + b _0230A594 +_0230A580: + cmp r5, #0 + movlt r5, sl +_0230A588: + add sl, sl, #1 +_0230A58C: + cmp sl, #4 + blt _0230A54C +_0230A594: + cmp r8, #0 + ldrneh r0, [sb, #0x52] + addne r0, r0, #1 + strneh r0, [sb, #0x52] + bne _0230AD00 + add r0, sp, #0x114 + bl InitPreprocessorArgs + mov r0, #0x100 + mov r1, #0xf + bl MemAlloc + mov r6, r0 + mov r0, r4 + bl sub_02055894 + bl sub_020564B0 + mov r2, r0 + mov r0, r6 + mov r1, r4 + bl sub_02056094 + str r6, [sp, #0x14c] + cmp r5, #0 + blt _0230A644 + ldrh r1, [sb, #0x52] + add r2, r4, #0x22 + mov r0, #6 + add r1, sb, r1, lsl #1 + mla r0, r5, r0, r2 + ldrh r1, [r1, #0x54] + bl GetInfoMoveGround + ldrh r2, [sb, #0x52] + ldr r0, _0230AD14 ; =0x0000131B + mov r1, #0x100 + add r2, sb, r2, lsl #1 + ldrh r2, [r2, #0x54] + str r2, [sp, #0x124] + bl sub_02017C74 + ldr r1, _0230AD18 ; =0x000004A8 + add r2, sp, #0x114 + mov r0, #0x1c + bl sub_02046BE8 + ldrh r1, [sb, #0x52] + mov r0, #4 + add r1, r1, #1 + strh r1, [sb, #0x52] + b _0230A67C +_0230A644: + ldrsh r2, [r4, #4] + ldr r0, _0230AD1C ; =0xFFFFFE5E + ldr r1, _0230AD20 ; =0x000004A9 +#ifdef JAPAN + add r0, r2, r0 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #3 + addls r1, r1, #1 +#else + add r2, r2, r0 + mov r2, r2, lsl #0x10 + mov r2, r2, asr #0x10 + mov r2, r2, lsl #0x10 + mov r2, r2, lsr #0x10 + cmp r2, #3 + rsbls r1, r0, #0x308 +#endif + add r2, sp, #0x114 + mov r0, #0x1c + bl sub_02046BE8 + mov r0, #5 +_0230A67C: + str r0, [sb] + mov r0, r6 + bl MemFree + b _0230AD00 +_0230A68C: + bl sub_02046C78 + cmp r0, #0 + movne r0, #6 + moveq r0, #0 + cmp r0, #6 + bne _0230AD00 + ldr r0, [sb] + cmp r0, #5 + moveq r0, #0 + streqh r0, [sb, #0x76] + moveq r0, #6 + streq r0, [sb] + movne r0, #1 + strne r0, [sb] + b _0230AD00 +_0230A6C8: + bl sub_02046D20 + mov r0, #7 + str r0, [sb] + bl sub_020037A4 + add r0, r0, #0xa + str r0, [sb, #0x144] + b _0230AD00 +_0230A6E4: + bl sub_020037A4 + ldr r1, [sb, #0x144] + cmp r1, r0 + bge _0230AD00 + ldr r1, _0230AD0C ; =ov11_02324D98 + mvn r0, #1 + ldr r4, [r1, #4] + ldrsb r1, [r4, #0x74] + cmp r1, r0 + bne _0230A744 + ldrh r0, [r4, #0x52] + add r0, r4, r0, lsl #1 + ldrh r0, [r0, #0x54] + bl sub_0203FD14 + ldr r0, [r4, #8] + bl sub_02055894 + bl sub_0203FA64 + mov r1, #0 + mov r2, r1 + mov r0, #3 + bl sub_0204018C + strb r0, [r4, #0x74] + ldrsh r0, [r4, #0x76] + bl sub_020410A4 +_0230A744: + mov r0, #8 + str r0, [sb] + b _0230AD00 +_0230A750: + bl sub_020407EC + cmp r0, #1 + beq _0230AD00 + cmp r0, #7 + bne _0230A7A4 + bl sub_02041094 + strh r0, [sb, #0x76] + bl sub_0203FD38 + mov r1, r0 + add r0, sb, #0x7a + mov r2, #0x20 + bl MemcpySimple + ldrh r1, [sb, #0x52] + add r0, sb, #0x9a + add r1, sb, r1, lsl #1 + ldrh r1, [r1, #0x54] + bl InitMove + bl ov11_0230ADCC + mov r0, #0xa + str r0, [sb] + b _0230AD00 +_0230A7A4: + cmp r0, #2 + bne _0230AD00 + bl sub_02041094 + strh r0, [sb, #0x76] + add r0, sb, #0xa4 + mov r1, #0x98 + bl MemZero + mov r2, #0 + mov r1, r2 +_0230A7C8: + add r0, sb, r2 + add r2, r2, #1 + strb r1, [r0, #0x13c] + cmp r2, #5 + blt _0230A7C8 + ldrsh r0, [sb, #0x76] + cmp r0, #4 + bge _0230A7F4 + bl sub_02041364 + cmp r0, #0 + bne _0230A7FC +_0230A7F4: + mov r0, #3 + strb r0, [sb, #0x13d] +_0230A7FC: + ldr r0, _0230AD0C ; =ov11_02324D98 + ldr r1, _0230AD24 ; =ov11_02322F5C + ldrsb r3, [r0] + add r2, sb, #0x13c + ldr r0, _0230AD28 ; =ov11_02322F58 + ldr r3, [r1, r3, lsl #3] + mov r1, #0 + str r3, [sb, #0xa4] + str r2, [sb, #0x104] + stmia sp, {r0, r1} + ldr r0, _0230AD2C ; =ov11_02322F30 + ldr r2, _0230AD30 ; =0x00000233 + add r3, sb, #0xa4 + str r1, [sp, #8] + bl sub_02046A20 + mov r0, #9 + str r0, [sb] + b _0230AD00 +_0230A844: + bl ov11_0230AD94 + mov r4, r0 + bl sub_02046BA0 + ldr r1, _0230AD0C ; =ov11_02324D98 + cmp r4, #6 + strb r0, [r1] + bne _0230A870 + bl sub_020416FC + mov r0, #6 + str r0, [sb] + b _0230AD00 +_0230A870: + cmp r4, #1 + bne _0230A8F8 + ldrsh r0, [sb, #0x76] + cmp r0, #4 + bge _0230A890 + bl sub_02041364 + cmp r0, #0 + bne _0230A898 +_0230A890: + ldr r4, _0230AD34 ; =0x000004AC + b _0230A89C +_0230A898: + ldr r4, _0230AD38 ; =0x000004AB +_0230A89C: + add r0, sp, #0xc4 + bl InitPreprocessorArgs + ldrsh r0, [sb, #0x76] + bl sub_02041154 + str r0, [sp, #0xd4] + bl ov11_0230ADCC + add r0, sb, #0xa4 + mov r1, #0x98 + bl MemZero + mov r0, #5 + str r0, [sb, #0xa4] + ldr r1, _0230AD3C ; =ov11_02322F40 + add r0, sp, #0xc4 + stmia sp, {r1, r4} + str r0, [sp, #8] + mov r0, #0 + mov r1, r0 + mov r2, #0x33 + add r3, sb, #0xa4 + bl sub_02046A20 + mov r0, #0xc + str r0, [sb] + b _0230AD00 +_0230A8F8: + cmp r4, #2 + bne _0230A918 + ldrsh r0, [sb, #0x76] + bl sub_02041394 + bl ov11_0230ADCC + mov r0, #6 + str r0, [sb] + b _0230AD00 +_0230A918: + cmp r4, #3 + bne _0230AD00 + bl sub_0203FD38 + mov r1, r0 + add r0, sb, #0x7a + mov r2, #0x20 + bl MemcpySimple + ldrh r1, [sb, #0x52] + add r0, sb, #0x9a + add r1, sb, r1, lsl #1 + ldrh r1, [r1, #0x54] + bl InitMove + bl ov11_0230ADCC + mov r0, #0xa + str r0, [sb] + b _0230AD00 +_0230A958: + ldrsb r1, [sb, #0x78] + mvn r0, #1 + cmp r1, r0 + bne _0230A980 + ldrsh r2, [sb, #0x76] + add r0, sb, #0x7a + mov r1, #5 + mov r3, #1 + bl sub_020417A8 + strb r0, [sb, #0x78] +_0230A980: + mov r0, #0xb + str r0, [sb] + b _0230AD00 +_0230A98C: + bl sub_02041A18 + cmp r0, #1 + bne _0230AD00 + ldr r1, _0230AD0C ; =ov11_02324D98 + mvn r0, #1 + ldr r4, [r1, #4] + ldrsb r1, [r4, #0x78] + cmp r1, r0 + beq _0230A9C4 + bl sub_02041A00 + ldrsb r0, [r4, #0x78] + bl CloseScrollBox + mvn r0, #1 + strb r0, [r4, #0x78] +_0230A9C4: + mov r0, #6 + str r0, [sb] + b _0230AD00 +_0230A9D0: + bl ov11_0230AD94 + cmp r0, #4 + bne _0230AB08 + ldrsh r0, [sb, #0x76] + cmp r0, #4 + blt _0230AA00 + ldrh r1, [sb, #0x52] + mov r0, #1 + add r1, r1, #1 + strh r1, [sb, #0x52] + str r0, [sb] + b _0230AAFC +_0230AA00: + ldr r7, [sb, #8] + mvn r5, #0 + bl sub_02041484 + bl sub_0203FD38 + mov r6, r0 + mov r8, #0 + add r4, r7, #0x22 + mov fp, #6 +_0230AA20: + mul sl, r8, fp + add r0, r4, sl + add r1, r6, r8, lsl #3 + bl DungeonMoveToGroundMove + cmp r5, #0 + bge _0230AA54 + add r0, r7, sl + ldrb r0, [r0, #0x22] + tst r0, #1 + movne r0, #1 + moveq r0, #0 + tst r0, #0xff + moveq r5, r8 +_0230AA54: + add r8, r8, #1 + cmp r8, #4 + blt _0230AA20 + add r0, sp, #0x74 + bl InitPreprocessorArgs + mov r0, #0x100 + mov r1, #0xf + bl MemAlloc + mov r4, r0 + mov r0, r7 + bl sub_02055894 + bl sub_020564B0 + mov r2, r0 + mov r0, r4 + mov r1, r7 + bl sub_02056094 + add r1, r7, #0x22 + mov r0, #6 + str r4, [sp, #0xac] + mla r0, r5, r0, r1 + ldrh r1, [sb, #0x52] + add r1, sb, r1, lsl #1 + ldrh r1, [r1, #0x54] + bl GetInfoMoveGround + ldrh r2, [sb, #0x52] + ldr r0, _0230AD14 ; =0x0000131B + mov r1, #0x100 + add r2, sb, r2, lsl #1 + ldrh r2, [r2, #0x54] + str r2, [sp, #0x84] + bl sub_02017C74 + ldr r1, _0230AD18 ; =0x000004A8 + mov r0, #0x1c + add r2, sp, #0x74 + bl sub_02046BE8 + ldrh r2, [sb, #0x52] + mov r0, r4 + mov r1, #4 + add r2, r2, #1 + strh r2, [sb, #0x52] + str r1, [sb] + bl MemFree +_0230AAFC: + mov r0, #0 + bl sub_020410A4 + b _0230AD00 +_0230AB08: + sub r0, r0, #5 + cmp r0, #1 + movls r0, #6 + strls r0, [sb] + b _0230AD00 +_0230AB1C: + mov r0, #0x400 + mov r1, #0xf + ldr r6, [sb, #8] + mov r7, #0 + bl MemAlloc + mov r4, r0 + mov r0, #0x100 + mov r1, #0xf + bl MemAlloc + str r0, [sp, #0xc] + mov r0, #0x100 + mov r1, #0xf + bl MemAlloc + mov r5, r0 + mov r0, r7 + strb r0, [r4] + mov r0, r6 + bl sub_02055894 + bl sub_020564B0 + mov r2, r0 + mov r0, r5 + mov r1, r6 + bl sub_02056094 + add r0, sp, #0x24 + bl InitPreprocessorArgs + mov r8, r7 + ldrb r1, [r6, #0xc] + ldrb r0, [sb, #0x18] + ldrsh r3, [r6, #0xa] + ldrsh r2, [sb, #0x16] + sub r0, r1, r0 + str r0, [sp, #0x14] + sub r2, r3, r2 + str r2, [sp, #0x10] + ldrb r1, [r6, #0xe] + ldrb r0, [sb, #0x1a] + ldrb r3, [r6, #0xd] + ldrb r2, [sb, #0x19] + sub r0, r1, r0 + str r0, [sp, #0x1c] + sub r2, r3, r2 + ldrb r1, [r6, #0xf] + ldrb r0, [sb, #0x1b] + str r2, [sp, #0x18] + mov sl, r8 + sub r0, r1, r0 + str r0, [sp, #0x20] +_0230ABD8: + add r0, sp, #0x10 + ldr fp, [r0, sl, lsl #2] + cmp fp, #0 + ble _0230AC58 + cmp r7, #0 + beq _0230AC10 + cmp r8, #3 + beq _0230AC04 + ldr r1, _0230AD40 ; =ov11_02322F80 + mov r0, r4 + bl strcat +_0230AC04: + ldr r1, _0230AD44 ; =ov11_02322F84 + mov r0, r4 + bl strcat +_0230AC10: + add r0, sp, #0x24 + ldr r2, _0230AD48 ; =ov11_02322F24 + mov r3, sl, lsl #1 + ldrh r2, [r2, r3] + str r5, [sp, #0x5c] + add r0, r0, sl, lsl #2 + str fp, [r0, #0x24] + add r0, sp, #0x24 + str r0, [sp] + ldr r0, [sp, #0xc] + mov r1, #0x100 + mov r3, #0 + bl PreprocessStringFromId + ldr r1, [sp, #0xc] + mov r0, r4 + bl strcat + mov r7, #1 + add r8, r8, #1 +_0230AC58: + add sl, sl, #1 + cmp sl, #5 + blt _0230ABD8 + ldr r1, _0230AD44 ; =ov11_02322F84 + mov r0, r4 + bl strcat + cmp r7, #0 + beq _0230AC8C + add r2, sp, #0x24 + mov r1, r4 + mov r0, #0x1c + bl sub_02046C30 + b _0230ACB4 +_0230AC8C: + ldrb r1, [r6, #1] + ldrb r0, [sb, #0xd] + cmp r1, r0 + bne _0230ACB4 + ldr r1, _0230AD4C ; =0x000004A7 + add r2, sp, #0x24 + mov r0, #0x1c + str r5, [sp, #0x5c] + bl sub_02046BE8 + mov r7, #1 +_0230ACB4: + mov r0, r4 + bl MemFree + ldr r0, [sp, #0xc] + bl MemFree + mov r0, r5 + bl MemFree + cmp r7, #0 + movne r0, #0xe + strne r0, [sb] + bne _0230AD00 + mov r0, #1 + b _0230AD04 +_0230ACE4: + bl sub_02046C78 + cmp r0, #0 + movne r0, #6 + moveq r0, #0 + cmp r0, #6 + moveq r0, #1 + beq _0230AD04 +_0230AD00: + mov r0, #0 +_0230AD04: + add sp, sp, #0x1b4 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +#ifdef JAPAN +#define OV11_0230A390_OFFSET 0x3725 +#else +#define OV11_0230A390_OFFSET 0 +#endif +_0230AD0C: .word ov11_02324D98 +_0230AD10: .word 0x000004A6 + OV11_0230A390_OFFSET +#ifdef JAPAN +_0230C2B4: .word 0x000003E7 +#endif +_0230AD14: .word 0x0000131B +_0230AD18: .word 0x000004A8 + OV11_0230A390_OFFSET +_0230AD1C: .word 0xFFFFFE5E +_0230AD20: .word 0x000004A9 + OV11_0230A390_OFFSET +_0230AD24: .word ov11_02322F5C +_0230AD28: .word ov11_02322F58 +_0230AD2C: .word ov11_02322F30 +_0230AD30: .word 0x00000233 +_0230AD34: .word 0x000004AC + OV11_0230A390_OFFSET +_0230AD38: .word 0x000004AB + OV11_0230A390_OFFSET +_0230AD3C: .word ov11_02322F40 +_0230AD40: .word ov11_02322F80 +_0230AD44: .word ov11_02322F84 +_0230AD48: .word ov11_02322F24 +_0230AD4C: .word 0x000004A7 + OV11_0230A390_OFFSET + arm_func_end ov11_0230A390 + + arm_func_start ov11_0230AD50 +ov11_0230AD50: ; 0x0230AD50 + stmdb sp!, {r3, lr} + ldr r0, _0230AD78 ; =ov11_02324D98 + ldr r0, [r0, #4] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl MemFree + ldr r0, _0230AD78 ; =ov11_02324D98 + mov r1, #0 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + .align 2, 0 +_0230AD78: .word ov11_02324D98 + arm_func_end ov11_0230AD50 + + arm_func_start IsGroundMonsterAtMaxLevel +IsGroundMonsterAtMaxLevel: ; 0x0230AD7C + ldrb r0, [r0, #1] + cmp r0, #0x64 + movhs r0, #1 + movlo r0, #0 + and r0, r0, #0xff + bx lr + arm_func_end IsGroundMonsterAtMaxLevel + + arm_func_start ov11_0230AD94 +ov11_0230AD94: ; 0x0230AD94 + stmdb sp!, {r3, lr} + bl sub_02046B04 + mvn r2, #0 + cmp r0, r2 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + sub r1, r2, #1 + cmp r0, r1 + moveq r0, #6 + ldmeqia sp!, {r3, pc} + sub r1, r2, #2 + cmp r0, r1 + moveq r0, #6 + ldmia sp!, {r3, pc} + arm_func_end ov11_0230AD94 + + arm_func_start ov11_0230ADCC +ov11_0230ADCC: ; 0x0230ADCC + stmdb sp!, {r4, lr} + ldr r1, _0230AE0C ; =ov11_02324D98 + mvn r0, #1 + ldr r4, [r1, #4] + ldrsb r1, [r4, #0x74] + cmp r1, r0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #8] + bl sub_02055894 + bl sub_0203FD80 + bl sub_020407C0 + ldrsb r0, [r4, #0x74] + bl CloseAdvancedTextBox + mvn r0, #1 + strb r0, [r4, #0x74] + ldmia sp!, {r4, pc} + .align 2, 0 +_0230AE0C: .word ov11_02324D98 + arm_func_end ov11_0230ADCC + + arm_func_start ov11_0230AE10 +ov11_0230AE10: ; 0x0230AE10 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5] + cmp r0, #0 + cmpne r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #0x10 + mov r1, #8 + bl MemAlloc + ldr r2, _0230AE78 ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR + mov r1, #0x10 + str r0, [r2] + bl MemZero + ldr r0, _0230AE78 ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR + ldmia r5, {r1, r2} + ldr r4, [r0] + str r1, [r4] + add r0, r4, #0xc + add r1, r4, #0xe + str r2, [r4, #4] + bl ov11_0230C050 + ldr r1, _0230AE7C ; =ov11_02322F98 + ldr r2, _0230AE80 ; =GetExclusiveItemRequirements + add r0, r4, #8 + bl sub_0204707C + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0230AE78: .word EXCLUSIVE_ITEM_REQUIREMENTS_PTR +_0230AE7C: .word ov11_02322F98 +_0230AE80: .word GetExclusiveItemRequirements + arm_func_end ov11_0230AE10 + + arm_func_start ov11_0230AE84 +ov11_0230AE84: ; 0x0230AE84 + stmdb sp!, {r3, lr} + ldr r0, _0230AECC ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR + ldr r0, [r0] + cmp r0, #0 + ldrne r0, [r0, #8] + cmpne r0, #0 + beq _0230AEC4 + bl sub_020470D0 + ldr r0, _0230AECC ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR + ldr r0, [r0] + ldr r0, [r0, #8] + bl sub_02047148 + mvn r1, #0 + cmp r0, r1 + moveq r0, #1 + ldmeqia sp!, {r3, pc} +_0230AEC4: + mov r0, #0 + ldmia sp!, {r3, pc} + .align 2, 0 +_0230AECC: .word EXCLUSIVE_ITEM_REQUIREMENTS_PTR + arm_func_end ov11_0230AE84 + + arm_func_start ov11_0230AED0 +ov11_0230AED0: ; 0x0230AED0 + stmdb sp!, {r3, lr} + ldr r0, _0230AF08 ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR + ldr r0, [r0] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + add r0, r0, #8 + bl sub_02047150 + ldr r0, _0230AF08 ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR + ldr r0, [r0] + bl MemFree + ldr r0, _0230AF08 ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR + mov r1, #0 + str r1, [r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_0230AF08: .word EXCLUSIVE_ITEM_REQUIREMENTS_PTR + arm_func_end ov11_0230AED0 + + arm_func_start ov11_0230AF0C +ov11_0230AF0C: ; 0x0230AF0C + ldr r1, _0230AF30 ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR + ldr r2, [r0] + ldr r3, [r1] + ldr r1, [r0, #4] + ldr ip, _0230AF34 ; =sub_02047188 + str r2, [r3] + add r0, r3, #8 + str r1, [r3, #4] + bx ip + .align 2, 0 +_0230AF30: .word EXCLUSIVE_ITEM_REQUIREMENTS_PTR +_0230AF34: .word sub_02047188 + arm_func_end ov11_0230AF0C + + arm_func_start GetExclusiveItemRequirements +GetExclusiveItemRequirements: ; 0x0230AF38 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x15c + ldr r1, _0230B1DC ; =EXCLUSIVE_ITEM_REQUIREMENTS_PTR + mov r7, r0 + ldr r6, [r1] + add r0, sp, #0xa + ldrsh r8, [r6, #4] + mov r2, #0 + mov r3, #1 + add r1, sp, #4 + strh r8, [sp, #8] + strh r2, [sp, #6] + strb r3, [sp, #4] + mov sb, #0x10 + bl MaybeGetColoredFormattedItemName + add r0, sp, #0x10c + bl InitPreprocessorArgs + mov r0, r7 + mov r1, #0x18 + mov r2, sb + add r3, sp, #0xa + bl DrawTextInWindow + mov r0, r8 + bl ov11_0230C068 + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0230AFF8 +_0230AFA4: ; jump table + b _0230AFB4 ; case 0 + b _0230AFB4 ; case 1 + b _0230AFCC ; case 2 + b _0230AFE4 ; case 3 +_0230AFB4: + ldr r3, _0230B1E0 ; =SWAP_SHOP_ONE_STAR_STR + mov r0, r7 + mov r1, #0x6c + mov r2, sb + bl DrawTextInWindow + b _0230AFF8 +_0230AFCC: + ldr r3, _0230B1E4 ; =SWAP_SHOP_TWO_STAR_STR + mov r0, r7 + mov r1, #0x6c + mov r2, sb + bl DrawTextInWindow + b _0230AFF8 +_0230AFE4: + ldr r3, _0230B1E8 ; =SWAP_SHOP_THREE_STAR_STR + mov r0, r7 + mov r1, #0x6c + mov r2, sb + bl DrawTextInWindow +_0230AFF8: + ldr r0, [r6] + cmp r0, #0 + bne _0230B144 + ldr r3, _0230B1EC ; =0x000004B2 + mov r0, r7 + mov r1, #0x18 + mov r2, #0x28 + mov r4, #0 + bl AppendStandardStringToMission + ldr r3, _0230B1F0 ; =0x000004B3 + mov r0, r7 + mov r1, #0x7a + mov r2, #0x28 + bl AppendStandardStringToMission + mov r0, r8 + add sb, sb, #0x30 + bl GetExclusiveItemType + cmp r0, #0xa + addls pc, pc, r0, lsl #2 + b _0230B0E0 +_0230B048: ; jump table + b _0230B0E0 ; case 0 + b _0230B0E0 ; case 1 + b _0230B0E0 ; case 2 + b _0230B074 ; case 3 + b _0230B088 ; case 4 + b _0230B0E0 ; case 5 + b _0230B0E0 ; case 6 + b _0230B074 ; case 7 + b _0230B088 ; case 8 + b _0230B0E0 ; case 9 + b _0230B09C ; case 10 +_0230B074: + sub r0, r8, #2 + mov r0, r0, lsl #0x10 + mov r5, r0, asr #0x10 + mov r4, #2 + b _0230B0E0 +_0230B088: + sub r0, r8, #3 + mov r0, r0, lsl #0x10 + mov r5, r0, asr #0x10 + mov r4, #3 + b _0230B0E0 +_0230B09C: + sub r0, r8, #0x1bc + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #7 + ldrls r5, _0230B1F4 ; =0x000002FE + movls r4, #3 + bls _0230B0E0 + sub r0, r8, #0x1c4 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #3 + ldrls r5, _0230B1F8 ; =0x00000336 + movls r4, #3 +_0230B0E0: + mov sl, #0 + add fp, sp, #0x10c + b _0230B138 +_0230B0EC: + mov r0, r5 + str r5, [sp, #0x11c] + bl CountNbItemsOfTypeInBag + mov r8, r0 + mov r0, r5 + bl CountNbItemsOfTypeInStorage + add r0, r8, r0 + str r0, [sp, #0x130] + ldr r3, _0230B1FC ; =0x000004B5 + mov r0, r7 + mov r1, #0x18 + mov r2, sb + str fp, [sp] + bl sub_020262E0 + add r0, r5, #1 + mov r0, r0, lsl #0x10 + add sb, sb, #0xc + mov r5, r0, asr #0x10 + add sl, sl, #1 +_0230B138: + cmp sl, r4 + blt _0230B0EC + b _0230B184 +_0230B144: + cmp r0, #1 + bne _0230B184 + ldr r3, _0230B1EC ; =0x000004B2 + mov r0, r7 + mov r1, #0x18 + mov r2, #0x28 + bl AppendStandardStringToMission + ldrh r0, [r6, #6] + ldr r3, _0230B200 ; =0x000004B4 + add r4, sp, #0x10c + str r0, [sp, #0x130] + mov r0, r7 + mov r1, #0x18 + mov r2, #0x40 + str r4, [sp] + bl sub_020262E0 +_0230B184: + ldrh r0, [r6, #0xc] + add r1, sp, #0x10c + ldr r3, _0230B204 ; =0x000004B6 + str r0, [sp, #0x130] + str r1, [sp] + mov r0, r7 + mov r1, #0x1c + mov r2, #0x7e + bl sub_020262E0 + ldrh r0, [r6, #0xe] + ldr r3, _0230B208 ; =0x000004B7 + add r4, sp, #0x10c + str r0, [sp, #0x130] + mov r0, r7 + mov r1, #0x1c + mov r2, #0x8a + str r4, [sp] + bl sub_020262E0 + mov r0, r7 + bl UpdateWindow + add sp, sp, #0x15c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +#ifdef JAPAN +#define GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET 0x3528 +#else +#define GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET 0 +#endif +_0230B1DC: .word EXCLUSIVE_ITEM_REQUIREMENTS_PTR +_0230B1E0: .word SWAP_SHOP_ONE_STAR_STR +_0230B1E4: .word SWAP_SHOP_TWO_STAR_STR +_0230B1E8: .word SWAP_SHOP_THREE_STAR_STR +_0230B1EC: .word 0x000004B2 + GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET +_0230B1F0: .word 0x000004B3 + GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET +_0230B1F4: .word 0x000002FE +_0230B1F8: .word 0x00000336 +_0230B1FC: .word 0x000004B5 + GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET +_0230B200: .word 0x000004B4 + GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET +_0230B204: .word 0x000004B6 + GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET +_0230B208: .word 0x000004B7 + GET_EXCLUSIVE_ITEM_REQUIREMENTS_OFFSET + arm_func_end GetExclusiveItemRequirements + + arm_func_start SwapShopInventoryManager +SwapShopInventoryManager: ; 0x0230B20C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x20 + ldr r2, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS + mov r4, r0 + ldr r0, [r2, #4] + mov r8, r1 + cmp r0, #0 + ldr r5, _0230B668 ; =0x00401A33 + mov r6, #0 + ldr r7, _0230B66C ; =ov11_0230BD5C + bne _0230B24C + ldr r0, _0230B670 ; =0x000046D4 + mov r1, #8 + bl MemAlloc + ldr r1, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS + str r0, [r1, #4] +_0230B24C: + ldr r0, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + str r4, [r0] + bl ov11_0230BF98 + bl LoadSynthBin + ldr sb, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS + mov r2, #0 + ldr r3, [sb, #4] + mov r1, #0x10 + add r3, r3, #0x4000 + strb r0, [r3, #0x6c4] + ldr r0, [sb, #4] + cmp r4, #3 + add r0, r0, #0x4000 + str r2, [r0, #0x6c8] + ldr r0, [sb, #4] + add r0, r0, #0x4000 + str r2, [r0, #0x6cc] + ldr r0, [sb, #4] + add r0, r0, #0x4000 + str r1, [r0, #0x638] + addls pc, pc, r4, lsl #2 + b _0230B474 +_0230B2A8: ; jump table + b _0230B2B8 ; case 0 + b _0230B2EC ; case 1 + b _0230B308 ; case 2 + b _0230B428 ; case 3 +_0230B2B8: + bl ov11_0230C3CC + bl ov11_0230C61C + mov r0, sb + ldr r0, [r0, #4] + add r0, r0, #0xe6 + add r0, r0, #0x4500 + bl GetCroagunkItemTemplates + mov r0, sb + ldr r0, [r0, #4] + ldr r1, _0230B674 ; =0x000003A6 + add r0, r0, #0x4600 + strh r1, [r0, #0x34] + b _0230B474 +_0230B2EC: + bl ov11_0230C4D4 + mov r0, sb + ldr r0, [r0, #4] + ldr r1, _0230B678 ; =0x000003A7 + add r0, r0, #0x4600 + strh r1, [r0, #0x34] + b _0230B474 +_0230B308: + mov r0, r8, lsl #0x10 + mov r0, r0, asr #0x10 + bl sub_02011420 + mov sb, #0 + mov sl, sb + str r0, [sp, #0x14] + mov fp, sb + b _0230B370 +_0230B328: + ldr r1, [r1] + mov r0, sl, lsl #1 + ldrsh r0, [r1, r0] + bl GetExclusiveItemType + cmp r0, #1 + blt _0230B348 + cmp r0, #4 + ble _0230B36C +_0230B348: + ldr r1, [sp, #0x14] + mov r0, sb, lsl #0x10 + ldr r2, [r1] + mov r1, sl, lsl #1 + ldrh r2, [r2, r1] + mov r1, fp + mov r0, r0, lsr #0x10 + bl ov11_0230C924 + add sb, sb, #1 +_0230B36C: + add sl, sl, #1 +_0230B370: + ldr r1, [sp, #0x14] + ldr r0, [r1, #4] + cmp sl, r0 + blt _0230B328 + mov sl, #0 + mov fp, sl + b _0230B3D4 +_0230B38C: + ldr r1, [r0] + mov r0, sl, lsl #1 + ldrsh r0, [r1, r0] + bl GetExclusiveItemType + cmp r0, #1 + blt _0230B3D0 + cmp r0, #4 + bgt _0230B3D0 + ldr r1, [sp, #0x14] + mov r0, sb, lsl #0x10 + ldr r2, [r1] + mov r1, sl, lsl #1 + ldrh r2, [r2, r1] + mov r1, fp + mov r0, r0, lsr #0x10 + bl ov11_0230C924 + add sb, sb, #1 +_0230B3D0: + add sl, sl, #1 +_0230B3D4: + ldr r0, [sp, #0x14] + ldr r2, [r0, #4] + cmp sl, r2 + blt _0230B38C + ldr r1, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS + add r0, sp, #0x14 + ldr r1, [r1, #4] + add r1, r1, #0x4600 + strh r2, [r1, #0x26] + bl SwapShopFreeDoublePointer + ldr r1, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS + mov r0, r8, lsl #0x10 + ldr r2, [r1, #4] + mov r3, r0, asr #0x10 + add r0, r2, #0x4000 + str r3, [r0, #0x63c] + ldr r0, [r1, #4] +#ifdef JAPAN + ldr r1, _0230CC20_JP ; =0x000032B2 +#else + mov r1, #0x3a8 +#endif + add r0, r0, #0x4600 + strh r1, [r0, #0x34] + b _0230B474 +_0230B428: + add r1, sp, #0xc + add r2, sp, #0xe + mov r0, #1 + bl ov11_0230C1D0 + mov r3, sb + ldr r1, [r3, #4] + ldr r7, _0230B67C ; =0x0000032F + add r1, r1, #0x4600 + strh r0, [r1, #0x26] + ldr r0, [r3, #4] + ldr r2, _0230B680 ; =0x80040004 + add r0, r0, #0x4600 + strh r7, [r0, #0x34] + ldr r0, [r3, #4] + ldr r6, _0230B684 ; =ov11_0230B78C + add r0, r0, #0x4600 + ldr r7, _0230B688 ; =ov11_0230BE34 + strh r8, [r0, #0x28] + orr r5, r5, r2 +_0230B474: + cmp r4, #0 + bne _0230B5A8 + ldr r0, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS + mov r1, #6 + ldrsh r2, [r0] + ldr r0, [r0, #4] + add r0, r0, #0xe6 + smulbb r8, r2, r1 + add sb, r0, #0x1400 + ldrh r0, [sb, r8] + add sl, sb, r8 + bl ov11_0230C9EC + ldr r1, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS + str r0, [sp, #0x18] + ldrh r0, [r1] + bl ov11_0230C970 + strh r0, [sp, #0x1c] + ldrh r0, [sb, r8] + cmp r0, #1 + movne r0, #0 + strneh r0, [sp, #0x1e] + bne _0230B4E8 + ldr r0, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS + ldrh r1, [sl, #2] + ldr r0, [r0, #4] + add r0, r0, r1, lsl #3 + add r0, r0, #0x4500 + ldrh r0, [r0, #0xea] + strh r0, [sp, #0x1e] +_0230B4E8: + add r0, sp, #0x18 + bl ov11_0230AE10 + ldr r0, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS + add r1, sp, #0x12 + ldr r2, [r0, #4] + ldrsh r8, [r0] + add r3, r2, #0x4600 + add r2, sp, #0x10 + mov r0, #0 + strh r8, [r3, #0xd0] + bl ov11_0230C1D0 + ldr fp, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS + ldrh r2, [sp, #0x12] + ldr r0, [fp, #4] + ldrh r1, [sp, #0x10] + add r0, r0, #0x4600 + ldrh r8, [r0, #0x26] + add sb, r2, r1 + mov sl, #0 + b _0230B5A0 +_0230B538: + mov r0, sl, lsl #0x10 + mov r1, r0, lsr #0x10 + ldr r2, [fp, #4] + mov r0, #6 + mla r0, r1, r0, r2 + add r0, r0, #0x1400 + ldrh r0, [r0, #0xe6] + bl ov11_0230C9EC + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + cmp r0, #1 + bne _0230B59C + ldr r0, [fp, #4] + mov r1, #6 + mla r1, sl, r1, r0 + add r1, r1, #0x1400 + ldrh r1, [r1, #0xe8] + add r1, r0, r1, lsl #3 + add r1, r1, #0x4500 + ldrh r1, [r1, #0xea] + cmp r1, sb + addgt r0, r0, sl + addgt r1, r0, #0x1000 + movgt r0, #2 + strgtb r0, [r1, #0xb8] +_0230B59C: + add sl, sl, #1 +_0230B5A0: + cmp sl, r8 + blt _0230B538 +_0230B5A8: + ldr r8, _0230B664 ; =SWAP_SHOP_INVENTORY_PTRS + mov r1, r5 + ldr sb, [r8, #4] + mov r3, r7 + add r2, sb, #0x4600 + ldrh r2, [r2, #0x26] + ldr r0, _0230B68C ; =ov11_02322FE4 + mov r5, #8 + str r2, [sb, #4] + ldr r2, [r8, #4] + ldrsh r7, [r8] + add r2, r2, #0x4000 + str r7, [r2, #0x62c] + ldr sb, [r8, #4] + add r2, sb, #0xb8 + add r7, r2, #0x1000 + add r2, sb, #0x4000 + str r7, [r2, #0x68c] + ldr r2, [r8, #4] + str r6, [sp] + ldr r6, [r2, #4] + add r2, r2, #0x22c + str r6, [sp, #4] + add r2, r2, #0x4400 + str r5, [sp, #8] + bl CreateCollectionMenu + mov r2, r8 + ldr r1, [r2, #4] + cmp r4, #3 + add r1, r1, #0x1000 + strb r0, [r1, #0x4e4] + bne _0230B65C + ldr r0, [r2, #4] + mov r1, #1 + add r0, r0, #0x1400 + ldrsb r0, [r0, #0xe4] + bl SetCollectionMenuField0x1C8 + mov r0, r8 + ldr r0, [r0, #4] + ldr r1, _0230B690 ; =ov11_0230BF38 + add r0, r0, #0x1400 + ldrsb r0, [r0, #0xe4] + bl SetCollectionMenuField0x1A4 + bl ov11_0230CAA4 + bl ov11_0230C9F8 +_0230B65C: + add sp, sp, #0x20 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0230B664: .word SWAP_SHOP_INVENTORY_PTRS +_0230B668: .word 0x00401A33 +_0230B66C: .word ov11_0230BD5C +_0230B670: .word 0x000046D4 +#ifdef JAPAN +_0230B674: .word 0x000032B0 +_0230B678: .word 0x000032B1 +_0230CC20_JP: .word 0x000032B2 +_0230B67C: .word 0x000031F4 +#else +_0230B674: .word 0x000003A6 +_0230B678: .word 0x000003A7 +_0230B67C: .word 0x0000032F +#endif +_0230B680: .word 0x80040004 +_0230B684: .word ov11_0230B78C +_0230B688: .word ov11_0230BE34 +_0230B68C: .word ov11_02322FE4 +_0230B690: .word ov11_0230BF38 + arm_func_end SwapShopInventoryManager + + arm_func_start ov11_0230B694 +ov11_0230B694: ; 0x0230B694 + stmdb sp!, {r4, lr} + ldr r0, _0230B71C ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + cmp r0, #0 + bne _0230B6BC + ldr r0, _0230B720 ; =0x000046D4 + mov r1, #8 + bl MemAlloc + ldr r1, _0230B71C ; =SWAP_SHOP_INVENTORY_PTRS + str r0, [r1, #4] +_0230B6BC: + bl LoadSynthBin + mov r4, r0 + bl ov11_0230BF98 + bl ov11_0230C3CC + bl ov11_0230C61C + mov r0, #0 + bl GetCroagunkItemTemplates + ldr r1, _0230B71C ; =SWAP_SHOP_INVENTORY_PTRS + cmp r4, #0 + ldr r1, [r1, #4] + add r1, r1, #0x4600 + ldrh r1, [r1, #0x26] + add r4, r1, r0 + beq _0230B6F8 + bl CloseSynthBin +_0230B6F8: + ldr r0, _0230B71C ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + bl MemFree + ldr r1, _0230B71C ; =SWAP_SHOP_INVENTORY_PTRS + mov r0, #0 + str r0, [r1, #4] + cmp r4, #0 + movne r0, #1 + ldmia sp!, {r4, pc} + .align 2, 0 +_0230B71C: .word SWAP_SHOP_INVENTORY_PTRS +_0230B720: .word 0x000046D4 + arm_func_end ov11_0230B694 + + arm_func_start ov11_0230B724 +ov11_0230B724: ; 0x0230B724 + stmdb sp!, {r4, lr} + ldr r0, _0230B784 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + cmp r0, #0 + bne _0230B74C + ldr r0, _0230B788 ; =0x000046D4 + mov r1, #8 + bl MemAlloc + ldr r1, _0230B784 ; =SWAP_SHOP_INVENTORY_PTRS + str r0, [r1, #4] +_0230B74C: + bl ov11_0230BF98 + bl ov11_0230C4D4 + ldr r0, _0230B784 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + add r1, r0, #0x4600 + ldrh r4, [r1, #0x26] + bl MemFree + ldr r0, _0230B784 ; =SWAP_SHOP_INVENTORY_PTRS + mov r1, #0 + str r1, [r0, #4] + cmp r4, #0 + movne r1, #1 + and r0, r1, #0xff + ldmia sp!, {r4, pc} + .align 2, 0 +_0230B784: .word SWAP_SHOP_INVENTORY_PTRS +_0230B788: .word 0x000046D4 + arm_func_end ov11_0230B724 + + arm_func_start ov11_0230B78C +ov11_0230B78C: ; 0x0230B78C + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0230B870 ; =SWAP_SHOP_INVENTORY_PTRS + tst r0, #0x400 + ldr r4, [r1, #4] + beq _0230B868 + add r0, r4, #0x1400 + ldrsb r0, [r0, #0xe4] + bl GetWindowIdSelectedMenuItemIdx + add r1, r4, #0xe6 + add r2, r1, #0x1400 + mov r1, #6 + mla r5, r0, r1, r2 + ldrb r0, [r5, #4] + cmp r0, #0 + beq _0230B7E8 + mov r0, r1 + bl PlaySeVolumeWrapper + mov r1, #0 + strb r1, [r5, #4] + add r0, r4, #0x1400 + ldrsb r0, [r0, #0xe4] + bl sub_0202D07C + b _0230B83C +_0230B7E8: + bl ov11_0230B874 + add r1, r4, #0x4600 + ldrh r1, [r1, #0x28] + cmp r0, r1 + bge _0230B834 + mov r0, #6 + bl PlaySeVolumeWrapper + mov r0, #1 + strb r0, [r5, #4] + bl ov11_0230B874 + add r1, r4, #0x4600 + ldrh r1, [r1, #0x28] + cmp r1, r0 + bne _0230B83C + add r0, r4, #0x1400 + ldrsb r0, [r0, #0xe4] + mov r1, #1 + bl sub_0202D07C + b _0230B83C +_0230B834: + mov r0, #2 + bl PlaySeVolumeWrapper +_0230B83C: + ldr r0, _0230B870 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r1, [r0, #4] + add r0, r1, #0x4000 + ldr r0, [r0, #0x6c8] + cmp r0, #0 + beq _0230B860 + add r0, r1, #0x2c8 + add r0, r0, #0x4400 + bl sub_02047188 +_0230B860: + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} +_0230B868: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0230B870: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230B78C + + arm_func_start ov11_0230B874 +ov11_0230B874: ; 0x0230B874 + stmdb sp!, {r3, lr} + ldr r1, _0230B8BC ; =SWAP_SHOP_INVENTORY_PTRS + mov r0, #0 + ldr ip, [r1, #4] + mov r3, r0 + add r1, ip, #0x4600 + ldrh lr, [r1, #0x26] + mov r1, #6 + b _0230B8B0 +_0230B898: + mla r2, r3, r1, ip + add r2, r2, #0x1000 + ldrb r2, [r2, #0x4ea] + add r3, r3, #1 + cmp r2, #0 + addne r0, r0, #1 +_0230B8B0: + cmp r3, lr + blt _0230B898 + ldmia sp!, {r3, pc} + .align 2, 0 +_0230B8BC: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230B874 + + arm_func_start ov11_0230B8C0 +ov11_0230B8C0: ; 0x0230B8C0 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0230B910 ; =SWAP_SHOP_INVENTORY_PTRS + mov r4, r0 + ldr r0, [r1, #4] + add r0, r0, #0x1400 + ldrsb r0, [r0, #0xe4] + bl sub_0202D0EC + mov r5, r0 + mov r0, r5, lsl #0x10 + mov r0, r0, lsr #0x10 + bl ov11_0230C970 + ldr r1, _0230B910 ; =SWAP_SHOP_INVENTORY_PTRS + strh r0, [r4] + ldr r0, [r1, #4] + add r0, r0, r5, lsl #1 + add r0, r0, #0x2d00 + ldrh r0, [r0, #0xee] + strh r0, [r4, #2] + ldrsh r0, [r4] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0230B910: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230B8C0 + + arm_func_start ov11_0230B914 +ov11_0230B914: ; 0x0230B914 + stmdb sp!, {r3, lr} + ldr r0, _0230B954 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + add r0, r0, #0x1400 + ldrsb r0, [r0, #0xe4] + bl sub_0202D0EC + ldr r1, _0230B954 ; =SWAP_SHOP_INVENTORY_PTRS + mov r0, r0, lsl #0x10 + ldr r2, [r1, #4] + mov r1, r0, lsr #0x10 + mov r0, #6 + mla r0, r1, r0, r2 + add r0, r0, #0x1400 + ldrh r0, [r0, #0xe6] + bl ov11_0230C9EC + ldmia sp!, {r3, pc} + .align 2, 0 +_0230B954: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230B914 + + arm_func_start ov11_0230B958 +ov11_0230B958: ; 0x0230B958 + stmdb sp!, {r3, lr} + ldr r0, _0230B9B8 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + add r0, r0, #0x1400 + ldrsb r0, [r0, #0xe4] + bl sub_0202D0EC + ldr r2, _0230B9B8 ; =SWAP_SHOP_INVENTORY_PTRS + mov r1, r0, lsl #0x10 + mov r3, r1, lsr #0x10 + ldr ip, [r2, #4] + mov r1, #6 + mla r2, r3, r1, ip + add r2, r2, #0x1400 + ldrh r2, [r2, #0xe6] + cmp r2, #1 + movne r0, #0 + ldmneia sp!, {r3, pc} + mla r1, r0, r1, ip + add r0, r1, #0x1400 + ldrh r0, [r0, #0xe8] + add r0, ip, r0, lsl #3 + add r0, r0, #0x4500 + ldrh r0, [r0, #0xea] + ldmia sp!, {r3, pc} + .align 2, 0 +_0230B9B8: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230B958 + + arm_func_start ov11_0230B9BC +ov11_0230B9BC: ; 0x0230B9BC + stmdb sp!, {r3, lr} + ldr r0, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + bl ov11_0230AED0 + bl ov11_0230CAE4 + bl ov11_0230CA38 + ldr r0, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + add r0, r0, #0x4000 + ldrb r0, [r0, #0x6c4] + cmp r0, #0 + beq _0230B9F8 + bl CloseSynthBin +_0230B9F8: + ldr r0, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS + mvn r1, #1 + ldr r0, [r0, #4] + add r0, r0, #0x1400 + ldrsb r0, [r0, #0xe4] + cmp r0, r1 + beq _0230BA44 + bl sub_0202D0EC + ldr r1, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS + strh r0, [r1] + ldr r0, [r1, #4] + add r0, r0, #0x1400 + ldrsb r0, [r0, #0xe4] + bl sub_0202836C + ldr r0, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + add r0, r0, #0x1400 + ldrsb r0, [r0, #0xe4] + bl CloseCollectionMenu +_0230BA44: + ldr r0, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + bl MemFree + ldr r0, _0230BA60 ; =SWAP_SHOP_INVENTORY_PTRS + mov r1, #0 + str r1, [r0, #4] + ldmia sp!, {r3, pc} + .align 2, 0 +_0230BA60: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230B9BC + + arm_func_start ov11_0230BA64 +ov11_0230BA64: ; 0x0230BA64 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + ldr r0, _0230BB18 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r4, [r0, #4] + cmp r4, #0 + moveq r0, #0 + beq _0230BB10 + add r0, r4, #0x1400 + ldrsb r0, [r0, #0xe4] + bl sub_0202D0EC + mov r5, r0 + bl ov11_0230AE84 + cmp r0, #0 + addne r0, r4, #0x4600 + ldrneh r0, [r0, #0xd0] + cmpne r0, r5 + beq _0230BAD8 + bl ov11_0230B914 + mov r1, r5, lsl #0x10 + str r0, [sp] + mov r0, r1, lsr #0x10 + bl ov11_0230C970 + strh r0, [sp, #4] + bl ov11_0230B958 + strh r0, [sp, #6] + add r0, sp, #0 + bl ov11_0230AF0C + add r0, r4, #0x4600 + strh r5, [r0, #0xd0] +_0230BAD8: + add r0, r4, #0x1400 + ldrsb r0, [r0, #0xe4] + bl IsCollectionMenuActive + cmp r0, #0 + bne _0230BB0C + add r0, r4, #0x1400 + ldrsb r0, [r0, #0xe4] + bl sub_0202C75C + mvn r1, #0 + cmp r0, r1 + moveq r0, #2 + movne r0, #3 + b _0230BB10 +_0230BB0C: + mov r0, #0 +_0230BB10: + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0230BB18: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230BA64 + + arm_func_start ov11_0230BB1C +ov11_0230BB1C: ; 0x0230BB1C + stmdb sp!, {r3, lr} + ldr r0, _0230BB94 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + cmp r0, #0 + addne r0, r0, #0x1400 + ldrnesb r0, [r0, #0xe4] + mvnne r1, #1 + cmpne r0, r1 + ldmeqia sp!, {r3, pc} + bl sub_0202D0EC + ldr r1, _0230BB94 ; =SWAP_SHOP_INVENTORY_PTRS + strh r0, [r1] + bl ov11_0230CA38 + bl ov11_0230CAE4 + ldr r0, _0230BB94 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + add r0, r0, #0x1400 + ldrsb r0, [r0, #0xe4] + bl sub_0202836C + ldr r0, _0230BB94 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + add r0, r0, #0x1400 + ldrsb r0, [r0, #0xe4] + bl CloseCollectionMenu + ldr r0, _0230BB94 ; =SWAP_SHOP_INVENTORY_PTRS + mvn r1, #1 + ldr r0, [r0, #4] + add r0, r0, #0x1000 + strb r1, [r0, #0x4e4] + ldmia sp!, {r3, pc} + .align 2, 0 +_0230BB94: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230BB1C + + arm_func_start ov11_0230BB98 +ov11_0230BB98: ; 0x0230BB98 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #0xc + ldr r0, _0230BCD8 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r2, [r0, #4] + cmp r2, #0 + beq _0230BCD0 + add r0, r2, #0x1400 + ldrsb r1, [r0, #0xe4] + mvn r0, #1 + cmp r1, r0 + bne _0230BCD0 + ldr r0, [r2] + ldr r1, _0230BCDC ; =0x00401833 + ldr r3, _0230BCE0 ; =ov11_0230BD5C + cmp r0, #3 + mov r5, #0 + addls pc, pc, r0, lsl #2 + b _0230BC00 +_0230BBE0: ; jump table + b _0230BC00 ; case 0 + b _0230BC00 ; case 1 + b _0230BC00 ; case 2 + b _0230BBF0 ; case 3 +_0230BBF0: + ldr r0, _0230BCE4 ; =0x80040004 + ldr r5, _0230BCE8 ; =ov11_0230B78C + ldr r3, _0230BCEC ; =ov11_0230BE34 + orr r1, r1, r0 +_0230BC00: + ldr ip, _0230BCD8 ; =SWAP_SHOP_INVENTORY_PTRS + add r2, r2, #0x4000 + ldrsh r4, [ip] + ldr r0, _0230BCF0 ; =ov11_02322FE4 + mov lr, #8 + str r4, [r2, #0x62c] + ldr r2, [ip, #4] + str r5, [sp] + ldr ip, [r2, #4] + add r2, r2, #0x22c + add r2, r2, #0x4400 + stmib sp, {ip, lr} + bl CreateCollectionMenu + ldr r2, _0230BCD8 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r1, [r2, #4] + add r1, r1, #0x1000 + strb r0, [r1, #0x4e4] + ldr r1, [r2, #4] + ldr r0, [r1] + cmp r0, #3 + bne _0230BCD0 + add r0, r1, #0x1400 + ldrsb r0, [r0, #0xe4] + mov r1, #1 + bl SetCollectionMenuField0x1C8 + ldr r0, _0230BCD8 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r1, _0230BCF4 ; =ov11_0230BF38 + ldr r0, [r0, #4] + add r0, r0, #0x1400 + ldrsb r0, [r0, #0xe4] + bl SetCollectionMenuField0x1A4 + bl ov11_0230CAA4 + bl ov11_0230C9F8 + ldr r0, _0230BCD8 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r4, [r0, #4] + ldr r0, [r4] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0230BCD0 +_0230BC9C: ; jump table + b _0230BCD0 ; case 0 + b _0230BCD0 ; case 1 + b _0230BCD0 ; case 2 + b _0230BCAC ; case 3 +_0230BCAC: + bl ov11_0230B874 + add r1, r4, #0x4600 + ldrh r1, [r1, #0x28] + cmp r1, r0 + bne _0230BCD0 + add r0, r4, #0x1400 + ldrsb r0, [r0, #0xe4] + mov r1, #1 + bl sub_0202D07C +_0230BCD0: + add sp, sp, #0xc + ldmia sp!, {r4, r5, pc} + .align 2, 0 +_0230BCD8: .word SWAP_SHOP_INVENTORY_PTRS +_0230BCDC: .word 0x00401833 +_0230BCE0: .word ov11_0230BD5C +_0230BCE4: .word 0x80040004 +_0230BCE8: .word ov11_0230B78C +_0230BCEC: .word ov11_0230BE34 +_0230BCF0: .word ov11_02322FE4 +_0230BCF4: .word ov11_0230BF38 + arm_func_end ov11_0230BB98 + + arm_func_start ov11_0230BCF8 +ov11_0230BCF8: ; 0x0230BCF8 + stmdb sp!, {r3, lr} + ldr r0, _0230BD24 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + cmp r0, #0 + addne r0, r0, #0x1400 + ldrnesb r0, [r0, #0xe4] + mvnne r1, #1 + cmpne r0, r1 + ldmeqia sp!, {r3, pc} + bl sub_0202C620 + ldmia sp!, {r3, pc} + .align 2, 0 +_0230BD24: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230BCF8 + + arm_func_start ov11_0230BD28 +ov11_0230BD28: ; 0x0230BD28 + stmdb sp!, {r3, lr} + ldr r0, _0230BD58 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + cmp r0, #0 + addne r0, r0, #0x1400 + ldrnesb r0, [r0, #0xe4] + mvnne r1, #1 + cmpne r0, r1 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + bl IsCollectionMenuState3 + ldmia sp!, {r3, pc} + .align 2, 0 +_0230BD58: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230BD28 + + arm_func_start ov11_0230BD5C +ov11_0230BD5C: ; 0x0230BD5C + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x58 + mov r5, r1 + mov r1, r5, lsl #0x10 + mov r6, r0 + mov r0, r1, lsr #0x10 + mov r4, r2 + bl ov11_0230C970 + ldr r1, _0230BE28 ; =SWAP_SHOP_INVENTORY_PTRS + strh r0, [sp, #4] + ldr r3, [r1, #4] + mov r1, #1 + add r0, r3, r5, lsl #1 + add r0, r0, #0x2d00 + ldrh r2, [r0, #0xee] + add r0, r3, r5 + add r0, r0, #0x1000 + strh r2, [sp, #2] + strb r1, [sp] + ldrb r0, [r0, #0xb8] + add r1, sp, #0 + mov r2, #0 + tst r0, #2 + beq _0230BDEC + add r0, sp, #6 + bl MaybeGetUncoloredFormattedItemName + ldr r1, _0230BE2C ; =SWAP_SHOP_RED_TEXT_TAG_STR + mov r0, r6 + bl strcpy + add r1, sp, #6 + mov r0, r6 + bl strcat + ldr r1, _0230BE30 ; =SWAP_SHOP_UNCENTER_TEXT_TAG_STR + mov r0, r6 + bl strcat + b _0230BDF4 +_0230BDEC: + mov r0, r6 + bl MaybeGetColoredFormattedItemName +_0230BDF4: + ldr r1, _0230BE28 ; =SWAP_SHOP_INVENTORY_PTRS + mov r0, #6 + ldr r1, [r1, #4] + mla r0, r5, r0, r1 + add r0, r0, #0x1000 + ldrb r0, [r0, #0x4ea] + cmp r0, #0 + movne r1, #1 + moveq r1, #0 + mov r0, r6 + str r1, [r4] + add sp, sp, #0x58 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_0230BE28: .word SWAP_SHOP_INVENTORY_PTRS +_0230BE2C: .word SWAP_SHOP_RED_TEXT_TAG_STR +_0230BE30: .word SWAP_SHOP_UNCENTER_TEXT_TAG_STR + arm_func_end ov11_0230BD5C + + arm_func_start ov11_0230BE34 +ov11_0230BE34: ; 0x0230BE34 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + ldr r3, _0230BF28 ; =SWAP_SHOP_INVENTORY_PTRS + mov r5, r1 + mov r1, r5, lsl #0x10 + mov r6, r0 + mov r0, r1, lsr #0x10 + ldr r3, [r3, #4] + mov r1, #6 + mla r1, r0, r1, r3 + add r1, r1, #0x1400 + ldrh r1, [r1, #0xe6] + mov r4, r2 + cmp r1, #4 + moveq r0, #0 + beq _0230BF20 + bl ov11_0230C970 + ldr r1, _0230BF28 ; =SWAP_SHOP_INVENTORY_PTRS + strh r0, [sp, #4] + ldr r0, [r1, #4] + add r1, sp, #0 + add r0, r0, r5, lsl #1 + add r0, r0, #0x2d00 + ldrh ip, [r0, #0xee] + mov r3, #1 + mov r0, r6 + mov r2, #0 + strh ip, [sp, #2] + strb r3, [sp] + bl MaybeGetColoredFormattedItemName + ldrsh r0, [sp, #4] + bl ov11_0230C068 + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0230BEE8 +_0230BEC0: ; jump table + b _0230BED0 ; case 0 + b _0230BED0 ; case 1 + b _0230BED8 ; case 2 + b _0230BEE0 ; case 3 +_0230BED0: + ldr r1, _0230BF2C ; =SWAP_SHOP_CLUMSET_ONE_STAR_STR + b _0230BEEC +_0230BED8: + ldr r1, _0230BF30 ; =SWAP_SHOP_CLUMSET_TWO_STAR_STR + b _0230BEEC +_0230BEE0: + ldr r1, _0230BF34 ; =SWAP_SHOP_CLUMSET_THREE_STAR_STR + b _0230BEEC +_0230BEE8: + mov r1, #0 +_0230BEEC: + mov r0, r6 + bl strcat + ldr r1, _0230BF28 ; =SWAP_SHOP_INVENTORY_PTRS + mov r0, #6 + ldr r1, [r1, #4] + mla r0, r5, r0, r1 + add r0, r0, #0x1000 + ldrb r0, [r0, #0x4ea] + cmp r0, #0 + movne r1, #1 + moveq r1, #0 + mov r0, r6 + str r1, [r4] +_0230BF20: + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_0230BF28: .word SWAP_SHOP_INVENTORY_PTRS +_0230BF2C: .word SWAP_SHOP_CLUMSET_ONE_STAR_STR +_0230BF30: .word SWAP_SHOP_CLUMSET_TWO_STAR_STR +_0230BF34: .word SWAP_SHOP_CLUMSET_THREE_STAR_STR + arm_func_end ov11_0230BE34 + + arm_func_start ov11_0230BF38 +ov11_0230BF38: ; 0x0230BF38 + stmdb sp!, {r3, lr} + ldr r3, _0230BF8C ; =SWAP_SHOP_INVENTORY_PTRS + mov r2, r2, lsl #0x10 + ldr ip, [r3, #4] + mov r3, r2, lsr #0x10 + mov r2, #6 + mla r2, r3, r2, ip + add r2, r2, #0x1400 + ldrh r2, [r2, #0xe6] + mov r3, r0 + cmp r2, #2 + ldreq r0, _0230BF90 ; =0x0000032F + streqh r0, [r1, #0x1c] + beq _0230BF7C + cmp r2, #3 + ldreq r0, _0230BF94 ; =0x00004623 + streqh r0, [r1, #0x1c] +_0230BF7C: + mov r0, r1 + mov r1, r3 + bl sub_0202A03C + ldmia sp!, {r3, pc} + .align 2, 0 +_0230BF8C: .word SWAP_SHOP_INVENTORY_PTRS +#if defined(EUROPE) +_0230BF90: .word 0x0000032F +_0230BF94: .word 0x00004642 +#elif defined(JAPAN) +_0230BF90: .word 0x000031F4 +_0230BF94: .word 0x00001CDF +#else +_0230BF90: .word 0x0000032F +_0230BF94: .word 0x00004623 +#endif + arm_func_end ov11_0230BF38 + + arm_func_start ov11_0230BF98 +ov11_0230BF98: ; 0x0230BF98 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, #0 + ldr r3, _0230C048 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r2, _0230C04C ; =0x0000042C + mov r0, r4 +_0230BFAC: + ldr r1, [r3, #4] + add r1, r1, r4, lsl #2 + str r0, [r1, #8] + ldr r1, [r3, #4] + add r1, r1, r4 + add r1, r1, #0x1000 + add r4, r4, #1 + strb r0, [r1, #0xb8] + cmp r4, r2 + blt _0230BFAC + ldr r2, _0230C048 ; =SWAP_SHOP_INVENTORY_PTRS + mov r5, #0 +_0230BFDC: + ldr r1, [r2, #4] + add r1, r1, r0, lsl #1 + add r1, r1, #0x3e00 + strh r5, [r1, #0x16] + ldr r1, [r2, #4] + add r1, r1, r0, lsl #1 + add r1, r1, #0x3600 + add r0, r0, #1 + strh r5, [r1, #0x46] + cmp r0, #0x3e8 + blt _0230BFDC + ldr r7, _0230C048 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r6, _0230C04C ; =0x0000042C + mov r4, #0 +_0230C014: + ldr r1, [r7, #4] + mov r0, r5, lsl #0x10 + add r1, r1, r5, lsl #1 + add r3, r1, #0x2d00 + mov r1, r4 + mov r2, r4 + mov r0, r0, lsr #0x10 + strh r4, [r3, #0xee] + bl ov11_0230C924 + add r5, r5, #1 + cmp r5, r6 + blt _0230C014 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_0230C048: .word SWAP_SHOP_INVENTORY_PTRS +_0230C04C: .word 0x0000042C + arm_func_end ov11_0230BF98 + + arm_func_start ov11_0230C050 +ov11_0230C050: ; 0x0230C050 + ldr ip, _0230C064 ; =ov11_0230C1D0 + mov r2, r1 + mov r1, r0 + mov r0, #0 + bx ip + .align 2, 0 +_0230C064: .word ov11_0230C1D0 + arm_func_end ov11_0230C050 + + arm_func_start ov11_0230C068 +ov11_0230C068: ; 0x0230C068 + cmp r0, #0x1bc + blt _0230C080 + ldr r1, _0230C0FC ; =0x000001C3 + cmp r0, r1 + movle r0, #3 + bxle lr +_0230C080: + cmp r0, #0x1c4 + blt _0230C098 + ldr r1, _0230C100 ; =0x000001C7 + cmp r0, r1 + movle r0, #3 + bxle lr +_0230C098: + cmp r0, #0x1c8 + blt _0230C0B0 + ldr r1, _0230C104 ; =0x000001D7 + cmp r0, r1 + movle r0, #3 + bxle lr +_0230C0B0: + cmp r0, #0x1d8 + blt _0230C0C8 + ldr r1, _0230C108 ; =0x000001F9 + cmp r0, r1 + movle r0, #3 + bxle lr +_0230C0C8: + ldr r1, _0230C10C ; =0x000003F6 + cmp r0, r1 + blt _0230C0E4 + ldr r1, _0230C110 ; =0x00000547 + cmp r0, r1 + movle r0, #3 + bxle lr +_0230C0E4: + ldr r1, _0230C114 ; =0xFFFFFE06 + add r0, r0, r1 + mov r1, r0, lsr #0x1f + rsb r0, r1, r0, lsl #30 + add r0, r1, r0, ror #30 + bx lr + .align 2, 0 +_0230C0FC: .word 0x000001C3 +_0230C100: .word 0x000001C7 +_0230C104: .word 0x000001D7 +_0230C108: .word 0x000001F9 +_0230C10C: .word 0x000003F6 +_0230C110: .word 0x00000547 +_0230C114: .word 0xFFFFFE06 + arm_func_end ov11_0230C068 + + arm_func_start ov11_0230C118 +ov11_0230C118: ; 0x0230C118 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r6, _0230C1CC ; =SWAP_SHOP_INVENTORY_PTRS + mov lr, #0 + ldr r7, [r6, #4] + mov r4, lr + add r6, r7, #0xe6 + add ip, r6, #0x1400 + add r6, r7, #0x4600 + mov r5, lr + mov r7, #6 + b _0230C1AC +_0230C144: + mla sb, r5, r7, ip + ldrb r8, [sb, #4] + cmp r8, #0 + beq _0230C1A8 + ldrh r8, [sb] + cmp r8, #2 + beq _0230C16C + cmp r8, #3 + beq _0230C18C + b _0230C1A8 +_0230C16C: + cmp r1, #0 + ldrneh sb, [sb, #2] + movne r8, lr, lsl #1 + strneh sb, [r1, r8] + add r8, lr, #1 + mov lr, r8, lsl #0x10 + mov lr, lr, lsr #0x10 + b _0230C1A8 +_0230C18C: + cmp r3, #0 + movne r8, r4, lsl #1 + ldrneh sb, [sb, #2] + add r4, r4, #1 + mov r4, r4, lsl #0x10 + strneh sb, [r3, r8] + mov r4, r4, lsr #0x10 +_0230C1A8: + add r5, r5, #1 +_0230C1AC: + ldrh r8, [r6, #0x26] + cmp r5, r8 + blt _0230C144 + cmp r0, #0 + strneh lr, [r0] + cmp r2, #0 + strneh r4, [r2] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_0230C1CC: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230C118 + + arm_func_start ov11_0230C1D0 +ov11_0230C1D0: ; 0x0230C1D0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl GetCurrentBagCapacity + mov fp, r0 + bl sub_0200FD48 + mov r8, #0 + mov r7, r0 + mov sb, r8 + mov sl, r8 + cmp r5, #0 + beq _0230C288 + b _0230C278 +_0230C208: + ldr r0, _0230C3C4 ; =BAG_ITEMS_PTR_MIRROR + ldr r1, [r0] + mov r0, #6 + mul r0, sl, r0 + ldr r1, [r1, #0x384] + add r2, r1, r0 + ldrb r0, [r1, r0] + tst r0, #1 + movne r0, #1 + moveq r0, #0 + tst r0, #0xff + beq _0230C274 + ldrsh r1, [r2, #4] + cmp r1, #0x1bc + blt _0230C274 + ldr r0, _0230C3C8 ; =0x00000547 + cmp r1, r0 + bgt _0230C274 + cmp r6, #0 + beq _0230C270 + mov r0, r8, lsl #0x10 + mov r2, sl, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #2 + mov r2, r2, lsr #0x10 + bl ov11_0230C924 +_0230C270: + add r8, r8, #1 +_0230C274: + add sl, sl, #1 +_0230C278: + cmp sl, fp + blt _0230C208 + mov sl, r8 + strh r8, [r5] +_0230C288: + cmp r4, #0 + beq _0230C3BC + ldr r0, _0230C3C4 ; =BAG_ITEMS_PTR_MIRROR + mov r5, #0 + ldr r2, [r0] + ldr r0, _0230C3C8 ; =0x00000547 + b _0230C2CC +_0230C2A4: + add r1, r2, r5, lsl #1 + add r1, r1, #0x300 + ldrsh r1, [r1, #0x8a] + cmp r1, #0 + beq _0230C2D4 + cmp r1, #0x1bc + blt _0230C2C8 + cmp r1, r0 + ble _0230C2D4 +_0230C2C8: + add r5, r5, #1 +_0230C2CC: + cmp r5, r7 + blt _0230C2A4 +_0230C2D4: + cmp r5, r7 + bge _0230C31C + add r0, r2, r5, lsl #1 + add r0, r0, #0x300 + ldrsh r0, [r0, #0x8a] + cmp r0, #0 + beq _0230C31C + tst r8, #7 + cmpne r6, #0 + beq _0230C31C + mov r0, r8, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #4 + mov r2, #0 + bl ov11_0230C924 + add r8, r8, #1 + add r0, r8, #7 + bic sl, r0, #7 +_0230C31C: + ldr fp, _0230C3C4 ; =BAG_ITEMS_PTR_MIRROR + b _0230C37C +_0230C324: + ldr r0, [fp] + add r0, r0, r5, lsl #1 + add r0, r0, #0x300 + ldrsh r1, [r0, #0x8a] + cmp r1, #0 + beq _0230C384 + cmp r1, #0x1bc + blt _0230C378 + ldr r0, _0230C3C8 ; =0x00000547 + cmp r1, r0 + bgt _0230C378 + cmp r6, #0 + beq _0230C374 + add r0, sl, sb + mov r0, r0, lsl #0x10 + mov r2, r5, lsl #0x10 + mov r1, #3 + mov r0, r0, lsr #0x10 + mov r2, r2, lsr #0x10 + bl ov11_0230C924 +_0230C374: + add sb, sb, #1 +_0230C378: + add r5, r5, #1 +_0230C37C: + cmp r5, r7 + blt _0230C324 +_0230C384: + strh sb, [r4] + cmp r8, #0 + ble _0230C3B8 + tst sb, #7 + cmpne r6, #0 + beq _0230C3B8 + add r0, sl, sb + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #4 + mov r2, #0 + bl ov11_0230C924 + add sb, sb, #1 +_0230C3B8: + add sl, sl, sb +_0230C3BC: + mov r0, sl + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0230C3C4: .word BAG_ITEMS_PTR_MIRROR +_0230C3C8: .word 0x00000547 + arm_func_end ov11_0230C1D0 + + arm_func_start ov11_0230C3CC +ov11_0230C3CC: ; 0x0230C3CC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bl GetCurrentBagCapacity + mov r7, r0 + bl sub_0200FD48 + mov sb, #0 + mov r8, r0 + mov sl, sb + mov fp, #1 + ldr r6, _0230C4C8 ; =BAG_ITEMS_PTR_MIRROR + mov r5, #6 + ldr r4, _0230C4CC ; =0x000003F5 + b _0230C450 +_0230C3FC: + mul r1, sl, r5 + ldr r0, [r6] + ldr r2, [r0, #0x384] + ldrb r0, [r2, r1] + add r1, r2, r1 + tst r0, #1 + movne r0, fp + moveq r0, #0 + tst r0, #0xff + beq _0230C44C + ldrsh r0, [r1, #4] + cmp r0, r4, lsr #1 + blt _0230C44C + cmp r0, r4 + bgt _0230C44C + ldrh r1, [r1, #2] + mov r2, sb + bl ov11_0230C5A0 + cmp r0, #0 + addne sb, sb, #1 +_0230C44C: + add sl, sl, #1 +_0230C450: + cmp sl, r7 + blt _0230C3FC + mov r4, #0 + ldr r6, _0230C4C8 ; =BAG_ITEMS_PTR_MIRROR + ldr r5, _0230C4CC ; =0x000003F5 + b _0230C4AC +_0230C468: + ldr r0, [r6] + add r1, r0, r4, lsl #1 + add r0, r1, #0x300 + ldrsh r0, [r0, #0x8a] + cmp r0, #0 + beq _0230C4B4 + cmp r0, r5, lsr #1 + blt _0230C4A8 + cmp r0, r5 + bgt _0230C4A8 + add r1, r1, #0xb00 + ldrh r1, [r1, #0x5a] + mov r2, sb + bl ov11_0230C5A0 + cmp r0, #0 + addne sb, sb, #1 +_0230C4A8: + add r4, r4, #1 +_0230C4AC: + cmp r4, r8 + blt _0230C468 +_0230C4B4: + ldr r0, _0230C4D0 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + add r0, r0, #0x4600 + strh sb, [r0, #0x28] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0230C4C8: .word BAG_ITEMS_PTR_MIRROR +_0230C4CC: .word 0x000003F5 +_0230C4D0: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230C3CC + + arm_func_start ov11_0230C4D4 +ov11_0230C4D4: ; 0x0230C4D4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bl GetCurrentBagCapacity + mov r8, #0 + mov r7, r0 + mov sb, r8 + mov r4, #6 + ldr r6, _0230C594 ; =BAG_ITEMS_PTR_MIRROR + ldr r5, _0230C598 ; =SWAP_SHOP_INVENTORY_PTRS + ldr fp, _0230C59C ; =0x0000018F + b _0230C578 +_0230C4FC: + mul sl, sb, r4 + ldr r0, [r6] + ldr r1, [r0, #0x384] + ldrb r0, [r1, sl] + add r1, r1, sl + tst r0, #1 + movne r0, #1 + moveq r0, #0 + tst r0, #0xff + beq _0230C574 + ldrsh r0, [r1, #4] + cmp r0, #0x16c + blt _0230C574 + cmp r0, fp + bgt _0230C574 + mov r0, r8, lsl #0x10 + mov r2, sb, lsl #0x10 + mov r1, #2 + mov r0, r0, lsr #0x10 + mov r2, r2, lsr #0x10 + bl ov11_0230C924 + ldr r1, [r6] + ldr r0, [r5, #4] + ldr r1, [r1, #0x384] + add r0, r0, r8, lsl #1 + add r1, r1, sl + ldrh r1, [r1, #2] + add r0, r0, #0x2d00 + add r8, r8, #1 + strh r1, [r0, #0xee] +_0230C574: + add sb, sb, #1 +_0230C578: + cmp sb, r7 + blt _0230C4FC + ldr r0, _0230C598 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + add r0, r0, #0x4600 + strh r8, [r0, #0x26] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0230C594: .word BAG_ITEMS_PTR_MIRROR +_0230C598: .word SWAP_SHOP_INVENTORY_PTRS +_0230C59C: .word 0x0000018F + arm_func_end ov11_0230C4D4 + + arm_func_start ov11_0230C5A0 +ov11_0230C5A0: ; 0x0230C5A0 + stmdb sp!, {r4, lr} + cmp r2, #0 + beq _0230C5EC + ldr r3, _0230C618 ; =SWAP_SHOP_INVENTORY_PTRS + mov lr, #0 + ldr r4, [r3, #4] + b _0230C5E4 +_0230C5BC: + add ip, r4, lr, lsl #1 + add r3, ip, #0x3600 + ldrh r3, [r3, #0x46] + cmp r0, r3 + addeq r3, ip, #0x3e00 + ldreqh r3, [r3, #0x16] + cmpeq r1, r3 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + add lr, lr, #1 +_0230C5E4: + cmp lr, r2 + blt _0230C5BC +_0230C5EC: + ldr ip, _0230C618 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r3, [ip, #4] + add r3, r3, r2, lsl #1 + add r3, r3, #0x3600 + strh r0, [r3, #0x46] + ldr r3, [ip, #4] + mov r0, #1 + add r2, r3, r2, lsl #1 + add r2, r2, #0x3e00 + strh r1, [r2, #0x16] + ldmia sp!, {r4, pc} + .align 2, 0 +_0230C618: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230C5A0 + + arm_func_start ov11_0230C61C +ov11_0230C61C: ; 0x0230C61C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r4, _0230C8DC ; =0x000001FA + mov r5, #0 +_0230C628: + ldr r0, _0230C8E0 ; =SWAP_SHOP_INVENTORY_PTRS + ldr lr, [r0, #4] + add r0, lr, #0x4600 + ldrh ip, [r0, #0x28] + cmp ip, #0 + moveq r0, #0 + beq _0230C6C0 + mov r0, r4, lsl #0x10 + mov r3, #0 + mov r2, r0, asr #0x10 + add r1, r2, #1 + add r0, r2, #2 + mov r7, r3 + mov r8, r3 + mov sb, r3 + b _0230C698 +_0230C668: + add r6, lr, r3, lsl #1 + add r6, r6, #0x3600 + ldrh r6, [r6, #0x46] + cmp r2, r6 + moveq r2, sb + beq _0230C694 + cmp r1, r6 + moveq r1, r8 + beq _0230C694 + cmp r0, r6 + moveq r0, r7 +_0230C694: + add r3, r3, #1 +_0230C698: + cmp r3, ip + blt _0230C668 + cmp r2, #0 + cmpeq r1, #0 + bne _0230C6BC + cmp r0, #0 + moveq r0, #2 + movne r0, #1 + b _0230C6C0 +_0230C6BC: + mov r0, #0 +_0230C6C0: + cmp r0, #1 + beq _0230C834 + cmp r0, #2 + bne _0230C86C + add r0, lr, r5, lsl #1 + ldr r2, _0230C8E4 ; =0x000002FE + add r0, r0, #0x2d00 + mov r1, #0 + strh r1, [r0, #0xee] + cmp r4, r2 + bne _0230C7AC + mov r0, r5, lsl #0x10 + ldr r2, _0230C8E8 ; =0x000001BD + mov r0, r0, lsr #0x10 + bl ov11_0230C924 + add r0, r5, #1 + mov r0, r0, lsl #0x10 + ldr r2, _0230C8EC ; =0x000001BE + mov r0, r0, lsr #0x10 + mov r1, #0 + bl ov11_0230C924 + add r0, r5, #2 + mov r0, r0, lsl #0x10 + ldr r2, _0230C8F0 ; =0x000001BF + mov r0, r0, lsr #0x10 + mov r1, #0 + bl ov11_0230C924 + add r0, r5, #3 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0 + mov r2, #0x1c0 + bl ov11_0230C924 + add r0, r5, #4 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0 + ldr r2, _0230C8F4 ; =0x000001C1 + bl ov11_0230C924 + add r0, r5, #5 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0 + ldr r2, _0230C8F8 ; =0x000001C2 + bl ov11_0230C924 + add r0, r5, #6 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0 + ldr r2, _0230C8FC ; =0x000001C3 + bl ov11_0230C924 + add r0, r5, #7 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + add r5, r5, #8 + mov r1, #0 + mov r2, #0x1bc + bl ov11_0230C924 + b _0230C834 +_0230C7AC: + add r0, r2, #0x38 + cmp r4, r0 + bne _0230C818 + mov r0, r5, lsl #0x10 + ldr r2, _0230C900 ; =0x000001C5 + mov r0, r0, lsr #0x10 + bl ov11_0230C924 + add r0, r5, #1 + mov r0, r0, lsl #0x10 + ldr r2, _0230C904 ; =0x000001C6 + mov r0, r0, lsr #0x10 + mov r1, #0 + bl ov11_0230C924 + add r0, r5, #2 + mov r0, r0, lsl #0x10 + ldr r2, _0230C908 ; =0x000001C7 + mov r0, r0, lsr #0x10 + mov r1, #0 + bl ov11_0230C924 + add r0, r5, #3 + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r1, #0 + mov r2, #0x1c4 + add r5, r5, #4 + bl ov11_0230C924 + b _0230C834 +_0230C818: + add r2, r4, #3 + mov r0, r5, lsl #0x10 + mov r2, r2, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r2, r2, lsr #0x10 + add r5, r5, #1 + bl ov11_0230C924 +_0230C834: + add r1, r4, #2 + mov r0, r5, lsl #0x10 + mov r1, r1, lsl #0x10 + mov r0, r0, lsr #0x10 + mov r2, r1, lsr #0x10 + mov r1, #0 + bl ov11_0230C924 + ldr r0, _0230C8E0 ; =SWAP_SHOP_INVENTORY_PTRS + mov r1, #0 + ldr r0, [r0, #4] + add r0, r0, r5, lsl #1 + add r0, r0, #0x2d00 + strh r1, [r0, #0xee] + add r5, r5, #1 +_0230C86C: + ldr r0, _0230C90C ; =0x000003F6 + add r4, r4, #4 + cmp r4, r0 + blt _0230C628 + ldr r0, _0230C8E0 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + add r0, r0, #0xe6 + add r0, r0, #0x4500 + bl GetCroagunkItemTemplates + mov r6, r0 + mov r7, #0 + mov r4, #1 + b _0230C8C0 +_0230C8A0: + mov r0, r5, lsl #0x10 + mov r2, r7, lsl #0x10 + mov r1, r4 + mov r0, r0, lsr #0x10 + mov r2, r2, lsr #0x10 + add r5, r5, #1 + bl ov11_0230C924 + add r7, r7, #1 +_0230C8C0: + cmp r7, r6 + blt _0230C8A0 + ldr r0, _0230C8E0 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r0, [r0, #4] + add r0, r0, #0x4600 + strh r5, [r0, #0x26] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_0230C8DC: .word 0x000001FA +_0230C8E0: .word SWAP_SHOP_INVENTORY_PTRS +_0230C8E4: .word 0x000002FE +_0230C8E8: .word 0x000001BD +_0230C8EC: .word 0x000001BE +_0230C8F0: .word 0x000001BF +_0230C8F4: .word 0x000001C1 +_0230C8F8: .word 0x000001C2 +_0230C8FC: .word 0x000001C3 +_0230C900: .word 0x000001C5 +_0230C904: .word 0x000001C6 +_0230C908: .word 0x000001C7 +_0230C90C: .word 0x000003F6 + arm_func_end ov11_0230C61C + + arm_func_start ov11_0230C910 +ov11_0230C910: ; 0x0230C910 + ldr r0, _0230C920 ; =SWAP_SHOP_INVENTORY_PTRS + mov r1, #0 + strh r1, [r0] + bx lr + .align 2, 0 +_0230C920: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230C910 + + arm_func_start ov11_0230C924 +ov11_0230C924: ; 0x0230C924 + stmdb sp!, {r3, lr} + mov r3, #6 + mul lr, r0, r3 + ldr r3, _0230C96C ; =SWAP_SHOP_INVENTORY_PTRS + mov ip, #0 + ldr r0, [r3, #4] + add r0, r0, lr + add r0, r0, #0x1400 + strh r1, [r0, #0xe6] + ldr r0, [r3, #4] + add r0, r0, lr + add r0, r0, #0x1400 + strh r2, [r0, #0xe8] + ldr r0, [r3, #4] + add r0, r0, lr + add r0, r0, #0x1000 + strb ip, [r0, #0x4ea] + ldmia sp!, {r3, pc} + .align 2, 0 +_0230C96C: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230C924 + + arm_func_start ov11_0230C970 +ov11_0230C970: ; 0x0230C970 + stmdb sp!, {r3, lr} + mov r1, #6 + ldr r2, _0230C9E8 ; =SWAP_SHOP_INVENTORY_PTRS + mul r1, r0, r1 + ldr r3, [r2, #4] + add r0, r3, #0xe6 + add r2, r0, #0x1400 + ldrh r0, [r2, r1] + add r1, r2, r1 + cmp r0, #1 + beq _0230C9B0 + cmp r0, #2 + beq _0230C9C4 + cmp r0, #3 + beq _0230C9D4 + b _0230C9E0 +_0230C9B0: + ldrh r0, [r1, #2] + add r0, r3, r0, lsl #3 + add r0, r0, #0x4500 + ldrsh r0, [r0, #0xe6] + ldmia sp!, {r3, pc} +_0230C9C4: + ldrsh r0, [r1, #2] + bl GetItemAtIdx + ldrsh r0, [r0, #4] + ldmia sp!, {r3, pc} +_0230C9D4: + ldrsh r0, [r1, #2] + bl sub_02010044 + ldmia sp!, {r3, pc} +_0230C9E0: + ldrsh r0, [r1, #2] + ldmia sp!, {r3, pc} + .align 2, 0 +_0230C9E8: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230C970 + + arm_func_start ov11_0230C9EC +ov11_0230C9EC: ; 0x0230C9EC + cmp r0, #4 + moveq r0, #4 + bx lr + arm_func_end ov11_0230C9EC + + arm_func_start ov11_0230C9F8 +ov11_0230C9F8: ; 0x0230C9F8 + stmdb sp!, {r3, lr} + ldr r0, _0230CA2C ; =SWAP_SHOP_INVENTORY_PTRS + ldr r1, [r0, #4] + add r0, r1, #0x4000 + ldr r0, [r0, #0x6cc] + cmp r0, #0 + ldmneia sp!, {r3, pc} + add r0, r1, #0x2cc + ldr r1, _0230CA30 ; =ov11_02322FF4 + ldr r2, _0230CA34 ; =ov11_0230CA7C + add r0, r0, #0x4400 + bl sub_0204707C + ldmia sp!, {r3, pc} + .align 2, 0 +_0230CA2C: .word SWAP_SHOP_INVENTORY_PTRS +_0230CA30: .word ov11_02322FF4 +_0230CA34: .word ov11_0230CA7C + arm_func_end ov11_0230C9F8 + + arm_func_start ov11_0230CA38 +ov11_0230CA38: ; 0x0230CA38 + stmdb sp!, {r3, lr} + ldr r0, _0230CA78 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r1, [r0, #4] + add r0, r1, #0x4000 + ldr r0, [r0, #0x6cc] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + add r0, r1, #0x2cc + add r0, r0, #0x4400 + bl sub_02047150 + ldr r0, _0230CA78 ; =SWAP_SHOP_INVENTORY_PTRS + mov r1, #0 + ldr r0, [r0, #4] + add r0, r0, #0x4000 + str r1, [r0, #0x6cc] + ldmia sp!, {r3, pc} + .align 2, 0 +_0230CA78: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230CA38 + + arm_func_start ov11_0230CA7C +ov11_0230CA7C: ; 0x0230CA7C + stmdb sp!, {r4, lr} + ldr r3, _0230CAA0 ; =0x000003A9 + mov r4, r0 + mov r1, #6 + mov r2, #2 + bl AppendStandardStringToMission + mov r0, r4 + bl UpdateWindow + ldmia sp!, {r4, pc} + .align 2, 0 +#ifdef JAPAN +_0230CAA0: .word 0x000032B3 +#else +_0230CAA0: .word 0x000003A9 +#endif + arm_func_end ov11_0230CA7C + + arm_func_start ov11_0230CAA4 +ov11_0230CAA4: ; 0x0230CAA4 + stmdb sp!, {r3, lr} + ldr r0, _0230CAD8 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r1, [r0, #4] + add r0, r1, #0x4000 + ldr r0, [r0, #0x6c8] + cmp r0, #0 + ldmneia sp!, {r3, pc} + add r0, r1, #0x2c8 + ldr r1, _0230CADC ; =ov11_02322FD4 + ldr r2, _0230CAE0 ; =ov11_0230CB28 + add r0, r0, #0x4400 + bl sub_0204707C + ldmia sp!, {r3, pc} + .align 2, 0 +_0230CAD8: .word SWAP_SHOP_INVENTORY_PTRS +_0230CADC: .word ov11_02322FD4 +_0230CAE0: .word ov11_0230CB28 + arm_func_end ov11_0230CAA4 + + arm_func_start ov11_0230CAE4 +ov11_0230CAE4: ; 0x0230CAE4 + stmdb sp!, {r3, lr} + ldr r0, _0230CB24 ; =SWAP_SHOP_INVENTORY_PTRS + ldr r1, [r0, #4] + add r0, r1, #0x4000 + ldr r0, [r0, #0x6c8] + cmp r0, #0 + ldmeqia sp!, {r3, pc} + add r0, r1, #0x2c8 + add r0, r0, #0x4400 + bl sub_02047150 + ldr r0, _0230CB24 ; =SWAP_SHOP_INVENTORY_PTRS + mov r1, #0 + ldr r0, [r0, #4] + add r0, r0, #0x4000 + str r1, [r0, #0x6c8] + ldmia sp!, {r3, pc} + .align 2, 0 +_0230CB24: .word SWAP_SHOP_INVENTORY_PTRS + arm_func_end ov11_0230CAE4 + + arm_func_start ov11_0230CB28 +ov11_0230CB28: ; 0x0230CB28 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #0x54 + mov r4, r0 + add r0, sp, #4 + bl InitPreprocessorArgs + bl ov11_0230B874 + ldr r1, _0230CB84 ; =SWAP_SHOP_INVENTORY_PTRS + str r0, [sp, #0x28] + ldr r0, [r1, #4] +#ifdef JAPAN + add r2, sp, #4 + add r0, r0, #0x4600 + ldrh r1, [r0, #0x28] + ldr r3, _0230E130 ; =0x000032B4 + mov r0, r4 + str r1, [sp, #0x2c] + str r2, [sp] + mov r1, #6 + mov r2, #2 +#else + mov r2, #2 + add r0, r0, #0x4600 + ldrh r3, [r0, #0x28] + add r1, sp, #4 + mov r0, r4 + str r3, [sp, #0x2c] + str r1, [sp] + add r3, r2, #0x3a8 + mov r1, #6 +#endif + bl sub_020262E0 + mov r0, r4 + bl UpdateWindow + add sp, sp, #0x54 + ldmia sp!, {r3, r4, pc} + .align 2, 0 +_0230CB84: .word SWAP_SHOP_INVENTORY_PTRS +#ifdef JAPAN +_0230E130: .word 0x000032B4 +#endif + arm_func_end ov11_0230CB28 diff --git a/include/main_0200F798.h b/include/main_0200F798.h index 4e000349..3601f6fe 100644 --- a/include/main_0200F798.h +++ b/include/main_0200F798.h @@ -3,8 +3,8 @@ #include "item.h" -struct item *GetFirstUnequippedItemOfType(s16 type); -u32 RemoveItemNoHoleCheck(struct item *item); +s16 GetFirstUnequippedItemOfType(s16 type); +u32 RemoveItemNoHoleCheck(s16 index); u32 RemoveFirstUnequippedItemOfType(s16 type); diff --git a/include/overlay_10_022BCC60.h b/include/overlay_10_022BCC60.h index 0d260416..b7109afd 100644 --- a/include/overlay_10_022BCC60.h +++ b/include/overlay_10_022BCC60.h @@ -12,7 +12,7 @@ void CloseInventoryMenu(s32 window_id); bool8 ov10_022BCD10(s32 window_id); s32 IsInventoryMenuActive(s32 window_id); bool8 CheckInventoryMenuField0x1A0(s32 window_id); -void ov10_022BCDA8(s32 window_id); +s32 ov10_022BCDA8(s32 window_id); s32 ov10_022BCDBC(s32 window_id); #endif //PMDSKY_OVERLAY_10_022BCC60_H diff --git a/include/overlay_11_02307334.h b/include/overlay_11_02307334.h new file mode 100644 index 00000000..f8280731 --- /dev/null +++ b/include/overlay_11_02307334.h @@ -0,0 +1,6 @@ +#ifndef PMDSKY_OVERLAY_11_02307334_H +#define PMDSKY_OVERLAY_11_02307334_H + +s32 ov11_02307334(void); + +#endif diff --git a/main.lsf b/main.lsf index 527a9d95..d2b2016e 100644 --- a/main.lsf +++ b/main.lsf @@ -661,6 +661,8 @@ Overlay OVY_11 Object asm/overlay_11_022FE4AC.o Object src/overlay_11_022FE58C.o Object asm/overlay_11_022FE5F8.o + Object src/overlay_11_02307334.o + Object asm/overlay_11_02308D1C.o Object src/overlay_11_0230CB88.o Object src/overlay_11_0230CD48.o Object asm/overlay_11_0230CE30.o diff --git a/src/overlay_10_022BCC60.c b/src/overlay_10_022BCC60.c index cbb013e6..0cf69f47 100644 --- a/src/overlay_10_022BCC60.c +++ b/src/overlay_10_022BCC60.c @@ -95,11 +95,11 @@ bool8 CheckInventoryMenuField0x1A0(s32 window_id) return w->field_0x1A0 == 0; } -void ov10_022BCDA8(s32 window_id) +s32 ov10_022BCDA8(s32 window_id) { struct unk_0202AAA8 *w = GetWindowContents(window_id); - sub_02033064((void *) w + 4); + return sub_02033064((void *) w + 4); } s32 ov10_022BCDBC(s32 window_id) diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c new file mode 100644 index 00000000..b5cba470 --- /dev/null +++ b/src/overlay_11_02307334.c @@ -0,0 +1,896 @@ +#include "overlay_11_02307334.h" +#include "item.h" +#include "item_util.h" +#include "game_mode.h" +#include "main_0200C4FC.h" +#include "main_0200EDC0.h" +#include "main_0200F370.h" +#include "main_0200F798.h" +#include "main_02017B58.h" +#include "main_02017C80.h" +#include "main_0202593C.h" +#include "main_02027AF0.h" +#include "main_0202AAA8.h" +#include "main_0202AB40.h" +#include "main_0202B4C4.h" +#include "main_0202F180.h" +#include "main_02058CD8.h" +#include "main_02058E68.h" +#include "overlay_10_022BCC60.h" +#include "overlay_31_02382820.h" + +struct unk_02309DAC { + s32 field_0x0; + s16 field_0x4; +}; + +struct unk_02308F4C { + s32 field_0x0; + s16 field_0x4; + u8 field_0x6[2]; + s16 field_0x8; + u8 field_0xa; + u8 field_0xb; + u32 *field_0xc; + s16 *field_0x10; +}; + +struct unk_02324D8C { + s32 field_0x0; s8 field_0x4; + s8 field_0x5; + s8 field_0x6; + s8 field_0x7; + s8 field_0x8; + s8 field_0x9; + s8 field_0xa; + s8 field_0xb; + s8 field_0xc; + u8 field_0xd[3]; + s32 field_0x10; + s32 field_0x14; + s32 field_0x18; + struct struct_2 field_0x1c; struct preprocessor_args field_0xb4; u8 field_0x104[0x134]; + struct unk_02308F4C field_0x238; s16 field_0x24c; + s16 field_0x24e; + s16 field_0x250; + u16 field_0x252; + s16 field_0x254; + u8 field_0x256[0x20]; + u8 field_0x276[0xa]; + u8 field_0x280[0x45]; + u8 field_0x2c5[0x45]; + u8 field_0x30a[2]; + s32 field_0x30c; + s32 field_0x310; + s32 field_0x314; + s32 field_0x318; + u8 field_0x31c[8]; + void *field_0x324; + u16 field_0x328[2]; + s32 field_0x32c; +}; + +extern struct unk_02324D8C *ov11_02324D8C; + +struct unk_02322D38 { + u16 field_0x0; + u16 field_0x2; + u32 field_0x4; +}; + +extern struct unk_02322D38 ov11_02322D38[]; +extern s32 ov11_02322C78; +extern s32 ov11_02322C88; +extern s32 ov11_02322C98; +extern s32 ov11_02322CA8; +extern s32 ov11_02322CB8; +extern s32 ov11_02322CC8; +extern s32 ov11_02322CD8; +extern s32 ov11_02322CF0; +extern s32 ov11_02322D10; +extern s32 ov11_02322D60; +extern s32 ov11_02322D88; +extern u8 ov11_02322DB0[]; + +extern void CloseScrollBox(s8); extern void CloseTextBox2(s8); extern u8 CreateParentMenuFromStringIds(void *, u32, void *, void *); extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateSimpleMenuFromStringIds(void *, s32, s32, void *, s32); extern s8 CreateTextBox(void *, void *); extern void DrawTextInWindow(s32 window_id, s32 x, s32 y, char *string); +extern struct team_member *GetActiveTeamMember(s32 roster_idx); +extern void GetPressedButtons(u32, u16 *); +extern s32 GetSimpleMenuResult__0202AEA4(s8); extern s32 GetSimpleMenuResult__0202B870(s8); extern struct ground_monster *GetTeamMember(s32 member_idx); +extern void InitPreprocessorArgs(struct preprocessor_args *); +extern s32 IsScrollBoxActive(s8); extern void ShowDialogueBox(s8); extern void ShowStringIdInDialogueBox(s8, s32, s32, void *); extern void ov11_022DC504(void); +extern u8 *strcpy(u8 *dest, const u8 *src); + +extern void ApplyGummiBoostsToGroundMonster(struct ground_monster *, s16, int, void *); +extern void ApplyGummiBoostsToTeamMember(struct team_member *, s16, int, void *); +extern void CloseAdvancedTextBox(s32 window_id); +extern s8 CreateInventoryMenuOuter(s32, s32, s32, void *, void *, void *, u8); +extern bool8 IsBagNotEmpty(void); +extern u8 PopInventoryMenuField0x1A3(s32 window_id); +extern void SetItemAcquired(struct item *); +extern void SortItemsInBag(void); +extern void *memcpy(void *, const void *, u32); +extern void ov10_022BCDF4(s32 window_id); +extern void ov11_02308D48(void); +extern void *ov11_02308DD8(void *); +extern void ov11_02308EDC(void); +extern void ov11_02308F14(void); +extern void ov11_02308F4C(void *dst, const void *src); +extern void ov11_02308FD0(void *); +extern void ov11_02308FEC(void *); +extern s32 ov11_0230901C(void *); +extern int ov11_02309040(s32); +extern int ov11_02309084(s16); +extern int ov11_023090DC(void); +extern void ov11_02309DAC(void *out); +extern void ov11_02309DF8(void); +extern s16 ov11_02309E24(void); +extern int ov11_02309E48(s16); +extern s32 ov11_02307300(s32, s32, s32); +extern s32 sub_020037A4(void); +extern void sub_0203FD14(u16 move_id); +extern struct move *sub_0203FD2C(void); +extern void *sub_0203FD38(void); +extern s16 sub_0203FD80(s32); +extern s16 sub_0203FDEC(s16); +extern s8 sub_0204019C(s32, s32, s32, void *); +extern void sub_020407C0(void); +extern int sub_020407EC(void); +extern s16 sub_02041094(void); +extern u16 sub_02041154(s32); +extern bool8 sub_02041364(s32); +extern void sub_02041484(void); +extern bool8 sub_020415BC(void); +extern s16 sub_02041614(u16 move_id); +extern void sub_020416FC(void); +extern s8 sub_020417A8(void *, s32, s32, s32); +extern void sub_02041A00(void); +extern void *sub_02044688(s16, s32, s32, s32, u8, s32); +extern int sub_02044800(void *); +extern void sub_020448EC(void **); +extern s32 sub_02053CA0(u16 *out, s32 limit, s16, u8); +extern void sub_020582E0(u8 held_by); +extern void sub_02058794(s16); + +#ifdef JAPAN +#define OV11_02307334_OFFSET 0x2D20 +#define OV11_02307334_OFFSET_2 0x1458 +#define OV11_02307334_OFFSET_3 0x1567 +#else +#define OV11_02307334_OFFSET 0 +#define OV11_02307334_OFFSET_2 0 +#define OV11_02307334_OFFSET_3 0 +#endif + +s32 ov11_02307334(void) +{ + struct struct_2 menu_b; + struct struct_2 menu_a; + struct preprocessor_args args; + char buf[0x400]; + struct unk_02309DAC sel_18; + struct unk_02309DAC sel_10; + u16 btn_e; + u16 btn_c; + + switch (ov11_02324D8C->field_0x0) { + case 0: { + ov11_02324D8C->field_0x4 = CreateInventoryMenuOuter(GetNbItemsInBag(), 0, ov11_02324D8C->field_0x10, ov11_02324D8C->field_0x104, (void *)ov11_02307300, ov11_02324D8C->field_0x31c, 0); + ov11_02324D8C->field_0x5 = CreateTextBox(&ov11_02322C88, 0); + ov11_02324D8C->field_0x18 = -1; + ov11_02324D8C->field_0x0 = 1; + break; + } + case 2: { + if (!IsBagNotEmpty()) { + SetInventoryMenuState6(ov11_02324D8C->field_0x4); + ov11_02324D8C->field_0x0 = 0xc; + break; + } + ov10_022BCC7C(ov11_02324D8C->field_0x4); + ov11_02324D8C->field_0x0 = 1; + break; + } + case 1: { + u8 v1; + + GetPressedButtons(0, &btn_e); + v1 = PopInventoryMenuField0x1A3(ov11_02324D8C->field_0x4); + if ((btn_e & 4) || (btn_e & 0x800) || v1) { + if (!v1) { + PlaySeVolumeWrapper(5); + } + SortItemsInBag(); + ov11_02324D8C->field_0x10 = 0; + ov10_022BCC60(ov11_02324D8C->field_0x4, GetNbItemsInBag()); + ov11_02324D8C->field_0x18 = -1; + ov10_022BCCB0(ov11_02324D8C->field_0x4); + } else { + s8 v2 = ov11_02324D8C->field_0x5; + + if (v2 != -2) { + s32 v3 = ov10_022BCDA8(ov11_02324D8C->field_0x4); + + if (ov11_02324D8C->field_0x18 != v3) { + struct item *v4 = GetItemAtIdx(v3); + + ov11_02324D8C->field_0x18 = v3; + sub_02027B1C(v2); + if ((bool8)((v4->flags & 1) != 0)) { +#ifdef EUROPE + strcpy((u8 *)buf, StringFromId((u16)(v4->id + 0x2f4b))); +#elif defined(JAPAN) + strcpy((u8 *)buf, StringFromId((u16)(v4->id + 0x1d41))); +#else + strcpy((u8 *)buf, StringFromId((u16)(v4->id + 0x2f49))); +#endif + } else { + strcpy((u8 *)buf, ov11_02322DB0); + } + DrawTextInWindow(v2, 2, 2, buf); + UpdateWindow(v2); + } + } + if (!IsInventoryMenuActive(ov11_02324D8C->field_0x4)) { + s32 v5 = ov10_022BCDBC(ov11_02324D8C->field_0x4); + + if (v5 >= 0) { + struct item *v6; + s32 v7; + s32 v8; + + ov11_02324D8C->field_0x10 = v5; + v6 = GetItemAtIdx(ov11_02324D8C->field_0x10); + ov11_02324D8C->field_0x24e = v6->id; + if ((bool8)((v6->flags & 1) != 0)) { + ov11_02324D8C->field_0x24e = v6->id; + } else { + ov11_02324D8C->field_0x24e = 0; + } + v7 = GetItemCategoryVeneer(ov11_02324D8C->field_0x24e); + v8 = GetGameMode(); + if (v7 == 5 && v8 != 4 && v8 != 5) { + s16 i; + + for (i = 0; ov11_02322D38[i].field_0x0 != 0; i++) { + ov11_02324D8C->field_0x276[i] = 0; + switch (ov11_02322D38[i].field_0x0) { + case 0x2b6 + OV11_02307334_OFFSET: + if (!ov11_02309E48(ov11_02324D8C->field_0x24e)) { + ov11_02324D8C->field_0x276[i] = 3; + } + break; + } + } + menu_a.c = ov11_02324D8C->field_0x276; + ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CB8, 0x400213, &menu_a, ov11_02322D38); + } else if (IsGummi(ov11_02324D8C->field_0x24e) && v8 != 4 && v8 != 5) { + ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CB8, 0x400013, 0, &ov11_02322D88); + } else if (v6->held_by) { + ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CA8, 0x400013, 0, &ov11_02322D10); + } else { + ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CA8, 0x400013, 0, &ov11_02322D60); + } + ov11_02324D8C->field_0x0 = 3; + } else { + ov10_022BCD10(ov11_02324D8C->field_0x4); + ov11_02324D8C->field_0x0 = 0xe; + } + } else { + GetPressedButtons(0, &btn_c); + if (btn_c & 8) { + PlaySeVolumeWrapper(0); + ov10_022BCDF4(ov11_02324D8C->field_0x4); + ov11_02324D8C->field_0x10 = ov10_022BCDA8(ov11_02324D8C->field_0x4); + CloseTextBox2(ov11_02324D8C->field_0x5); + ov11_02324D8C->field_0x5 = -2; + CloseInventoryMenu(ov11_02324D8C->field_0x4); + ov11_02324D8C->field_0x4 = -2; + ov11_02324D8C->field_0x0 = 0xa; + } + } + } + break; + } + case 3: { + if (IsParentMenuActive(ov11_02324D8C->field_0x6)) { + break; + } + { + s32 v1 = GetSimpleMenuResult__0202AEA4(ov11_02324D8C->field_0x6); + + if (v1 != 8) { + ov11_02324D8C->field_0x14 = v1; + if (v1 == 0) { + ov11_02308D48(); + ov11_02324D8C->field_0x0 = 7; + } else if (v1 == 1) { + ov11_02308D48(); + ov11_02324D8C->field_0x0 = 9; + } else if (v1 == 2) { + menu_b.b = 5; + ov11_02324D8C->field_0x7 = CreateParentMenuFromStringIds(&ov11_02322C98, 0x33, &menu_b, &ov11_02322CD8); + ov11_02324D8C->field_0x0 = 4; + } else if (v1 == 6) { + ov11_02308D48(); + ov11_02324D8C->field_0x0 = 0x11; + } else if (v1 == 7) { + ov11_02308D48(); + ov11_02324D8C->field_0x0 = 0x18; + } else { + ov11_02308D48(); + ov11_02324D8C->field_0x0 = 0xa; + } + } else { + CloseParentMenu(ov11_02324D8C->field_0x6); + ov11_02324D8C->field_0x6 = -2; + ov11_02324D8C->field_0x0 = 2; + } + } + break; + } + case 17: { + ov11_02309040(1); + ov11_02324D8C->field_0x0 = 0x12; + break; + } + case 18: { + struct unk_02308F4C *v2; + s16 v3; + s32 v4; + + if (!ov11_023090DC()) { + break; + } + if (ov11_02309E24() != -1) { + v2 = &ov11_02324D8C->field_0x238; + ov11_02309DAC(&sel_18); + ov11_02308F4C(v2, &sel_18); + ov11_02324D8C->field_0x30c = GetLearnableIqSkills(ov11_02324D8C->field_0x280, v2->field_0x8, *v2->field_0x10); + ov11_02324D8C->field_0x250 = -1; + ov11_02324D8C->field_0x318 = *v2->field_0x10; + v3 = ov11_02324D8C->field_0x24e; + if (v2->field_0x0 == 0) { + ApplyGummiBoostsToGroundMonster(GetTeamMember(v2->field_0x4), v3, 1, &ov11_02324D8C->field_0x250); + } else if (v2->field_0x0 == 1) { + ApplyGummiBoostsToTeamMember(GetActiveTeamMember(v2->field_0x4), v3, 1, &ov11_02324D8C->field_0x250); + } + ov11_02324D8C->field_0x318 -= *v2->field_0x10; + ov11_022DC504(); + if (v2->field_0x0 == 1) { + sub_02058794(v2->field_0x4); + } + ov11_02324D8C->field_0x310 = GetLearnableIqSkills(ov11_02324D8C->field_0x2c5, v2->field_0x8, *v2->field_0x10); + ov11_02324D8C->field_0x314 = 1; + v4 = ov11_02324D8C->field_0x250; + ov11_02308EDC(); + if (v4 >= 0 && v4 <= 3) { + RemoveItemNoHoleCheck(ov11_02324D8C->field_0x10); + ov11_02324D8C->field_0x18 = -1; + ov11_02324D8C->field_0x0 = 0x13; + } else { + ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, 0x2be + OV11_02307334_OFFSET, &ov11_02324D8C->field_0xb4); + ov11_02324D8C->field_0x0 = 0xd; + } + } else { + ov11_02324D8C->field_0x0 = 0; + } + ov11_02309DF8(); + break; + } + case 19: { + s32 v1; + s16 v2; + + v2 = ov11_02324D8C->field_0x250; + switch (v2) { + case 0: + v1 = 0x2b9 + OV11_02307334_OFFSET; + break; + case 1: + v1 = 0x2ba + OV11_02307334_OFFSET; + break; + case 2: + v1 = 0x2bb + OV11_02307334_OFFSET; + break; + case 3: + v1 = 0x2bc + OV11_02307334_OFFSET; + break; + default: + v1 = 0; + break; + } + if (ov11_02324D8C->field_0x318 == 0 && v2 >= 0 && v2 <= 3) { + v1 = 0x2bd + OV11_02307334_OFFSET; + } + if (v1 == 0) { + ov11_02324D8C->field_0x0 = 0x10; + break; + } + ov11_02324D8C->field_0xb4.flag_vals[0] = ov11_0230901C(&ov11_02324D8C->field_0x238); + ov11_02308EDC(); + ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, v1, &ov11_02324D8C->field_0xb4); + ov11_02324D8C->field_0x0 = 0x14; + break; + } + case 20: { + if (IsDialogueBoxActive(ov11_02324D8C->field_0x8)) { + break; + } + ShowDialogueBox(ov11_02324D8C->field_0x8); + ov11_02308F14(); + ov11_02324D8C->field_0x0 = 0x15; + break; + } + case 21: { + do { + int v1 = 0; + int v2 = 0; + int i; + struct unk_02324D8C *st = ov11_02324D8C; + int n = st->field_0x30c; + + for (i = 0; i < n; i++) { + if (st->field_0x314 == st->field_0x280[i]) { + v1 = 1; + break; + } + } + for (i = 0; i < ov11_02324D8C->field_0x310; i++) { + if (ov11_02324D8C->field_0x314 == ov11_02324D8C->field_0x2c5[i]) { + v2 = 1; + break; + } + } + if (v1 != v2) { + ov11_02324D8C->field_0xb4.flag_vals[0] = ov11_0230901C(&ov11_02324D8C->field_0x238); + ov11_02324D8C->field_0xb4.id_vals[0] = ov11_02324D8C->field_0x314; + sub_02017C50(4); + ov11_02308EDC(); + ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, 0x2BF + OV11_02307334_OFFSET, &ov11_02324D8C->field_0xb4); + EnableIqSkill(ov11_02324D8C->field_0x238.field_0xc, (u8)ov11_02324D8C->field_0x314); + ov11_02308FD0(&ov11_02324D8C->field_0x238); + ov11_02324D8C->field_0x314++; + ov11_02324D8C->field_0x0 = 0x14; + break; + } + ov11_02324D8C->field_0x314++; + } while (ov11_02324D8C->field_0x314 < 0x45); + if (ov11_02324D8C->field_0x314 >= 0x45) { + ov11_02324D8C->field_0x0 = 0x16; + } + break; + } + case 22: { + s32 v1; + + switch (ov11_02324D8C->field_0x252) { + case 0: + v1 = 0; + break; + case 1: + v1 = 0x2C1 + OV11_02307334_OFFSET; + break; + case 2: + v1 = 0x2C2 + OV11_02307334_OFFSET; + break; + case 4: + v1 = 0x2C3 + OV11_02307334_OFFSET; + break; + case 8: + v1 = 0x2C4 + OV11_02307334_OFFSET; + break; + default: + v1 = 0x2C0 + OV11_02307334_OFFSET; + break; + } + if (v1 == 0) { + ov11_02324D8C->field_0x0 = 0x10; + break; + } + ov11_02308EDC(); + ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, 0x2BF + OV11_02307334_OFFSET, &ov11_02324D8C->field_0xb4); + ov11_02324D8C->field_0x314++; + ov11_02324D8C->field_0x0 = 0x17; + break; + } + case 23: { + if (IsDialogueBoxActive(ov11_02324D8C->field_0x8)) { + break; + } + ShowDialogueBox(ov11_02324D8C->field_0x8); + ov11_02308F14(); + ov11_02324D8C->field_0x0 = 0x10; + break; + } + case 24: { + ov11_02309084(GetItemAtIdx(ov11_02324D8C->field_0x10)->id); + ov11_02324D8C->field_0x0 = 0x19; + break; + } + case 25: { + if (!ov11_023090DC()) { + break; + } + if (ov11_02309E24() != -1) { + struct unk_02324D8C *v1 = ov11_02324D8C; + + ov11_02309DAC(&sel_10); + ov11_02308F4C(&v1->field_0x238, &sel_10); + ov11_02308FEC(&v1->field_0x238); + if (sub_020415BC()) { + ov11_02324D8C->field_0x0 = 0x1d; + } else { + struct item *v2 = GetItemAtIdx(ov11_02324D8C->field_0x10); + if (!IsHM(v2->id)) { + v2->quantity = v2->id - 0xbc; + v2->id = 0xbb; + SetItemAcquired(v2); + } + ov11_02324D8C->field_0x0 = 0x1a; + } + } else { + ov11_02324D8C->field_0x0 = 0; + } + ov11_02309DF8(); + break; + } + case 33: { + sub_02053CA0(ov11_02324D8C->field_0x328, 2, ov11_02324D8C->field_0x238.field_0x8, ov11_02324D8C->field_0x238.field_0xa); + sub_0203FD14(GetItemMoveId16(ov11_02324D8C->field_0x24e)); + ov11_02324D8C->field_0xa = sub_0204019C(6, 0, 0, ov11_02324D8C->field_0x328); + ov11_02324D8C->field_0x0 = 0x22; + break; + } + case 34: { + switch (sub_020407EC()) { + case 2: + ov11_02324D8C->field_0x0 = 0x1f; + break; + case 1: + sub_020407C0(); + CloseAdvancedTextBox(ov11_02324D8C->field_0xa); + ov11_02324D8C->field_0xa = -2; + ov11_02324D8C->field_0x0 = 0x18; + break; + case 7: + if (sub_02041094() < 4) { + memcpy(ov11_02324D8C->field_0x256, sub_0203FD38(), 0x20); + ov11_02324D8C->field_0x254 = sub_02041094(); + } else { + memcpy(ov11_02324D8C->field_0x256, sub_0203FD2C(), 8); + ov11_02324D8C->field_0x254 = -1; + } + sub_020407C0(); + CloseAdvancedTextBox(ov11_02324D8C->field_0xa); + ov11_02324D8C->field_0xa = -2; + ov11_02324D8C->field_0x0 = 0x27; + break; + } + break; + } + case 31: { + ov11_02324D8C->field_0x1c.b = 1; + ov11_02324D8C->field_0xc = CreateSimpleMenuFromStringIds(&ov11_02322CC8, 0x33, (s32)&ov11_02324D8C->field_0x1c, &ov11_02322CF0, 3); + ov11_02324D8C->field_0x0 = 0x20; + break; + } + case 32: { + if (!IsSimpleMenuActive(ov11_02324D8C->field_0xc)) { + s32 v1; + + v1 = GetSimpleMenuResult__0202B870(ov11_02324D8C->field_0xc); + CloseSimpleMenu(ov11_02324D8C->field_0xc); + ov11_02324D8C->field_0xc = -2; + switch (v1) { + case 0: + ov11_02324D8C->field_0x24c = sub_02041094(); + CloseAdvancedTextBox(ov11_02324D8C->field_0xa); + ov11_02324D8C->field_0xa = -2; + ov11_02324D8C->field_0x0 = 0x23; + break; + case 1: + if (sub_02041094() < 4) { + memcpy(ov11_02324D8C->field_0x256, sub_0203FD38(), 0x20); + ov11_02324D8C->field_0x254 = sub_02041094(); + } else { + memcpy(ov11_02324D8C->field_0x256, sub_0203FD2C(), 8); + ov11_02324D8C->field_0x254 = -1; + } + sub_020407C0(); + CloseAdvancedTextBox(ov11_02324D8C->field_0xa); + ov11_02324D8C->field_0xa = -2; + ov11_02324D8C->field_0x0 = 0x27; + break; + case 2: + sub_020416FC(); + ov11_02324D8C->field_0x0 = 0x22; + break; + } + } + break; + } + case 35: { + ov11_02324D8C->field_0xb4.id_vals[0] = sub_02041154(ov11_02324D8C->field_0x24c); + { + s32 v1 = 0x8d7 + OV11_02307334_OFFSET_2; + + if (ov11_02324D8C->field_0x24c < 3) { + if (sub_02041364(ov11_02324D8C->field_0x24c)) { + v1--; + } + } + ov11_02308EDC(); + ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, v1, &ov11_02324D8C->field_0xb4); + } + ov11_02324D8C->field_0x0 = 0x24; + break; + } + case 36: { + if (!IsDialogueBoxActive(ov11_02324D8C->field_0x8)) { + ov11_02324D8C->field_0x0 = 0x25; + } + break; + } + case 37: { + menu_b.b = 5; + ov11_02324D8C->field_0x7 = CreateParentMenuFromStringIds(0, 0x33, &menu_b, &ov11_02322CD8); + ov11_02324D8C->field_0x0 = 0x26; + break; + } + case 38: { + if (IsParentMenuActive(ov11_02324D8C->field_0x7)) { + break; + } + if (GetSimpleMenuResult__0202AEA4(ov11_02324D8C->field_0x7) == 4) { + struct item *v1 = GetItemAtIdx(ov11_02324D8C->field_0x10); + if (!IsHM(v1->id)) { + if (v1->held_by != 0) { + sub_020582E0(v1->held_by); + } + v1->quantity = v1->id - 0xbc; + v1->id = 0xbb; + SetItemAcquired(v1); + } + ov11_02324D8C->field_0x0 = 0x1a; + if (ov11_02324D8C->field_0x24c >= 4) { + ov11_02324D8C->field_0x0 = 0x1b; + } else { + sub_02041484(); + ov11_02324D8C->field_0x0 = 0x1a; + } + } else { + sub_020407C0(); + ov11_02308FEC(&ov11_02324D8C->field_0x238); + ov11_02324D8C->field_0x0 = 0x21; + } + CloseParentMenu(ov11_02324D8C->field_0x7); + ov11_02324D8C->field_0x7 = -2; + ShowDialogueBox(ov11_02324D8C->field_0x8); + ov11_02308F14(); + break; + } + case 39: { + { + s16 v1 = ov11_02324D8C->field_0x254; + ov11_02324D8C->field_0xb = sub_020417A8(ov11_02324D8C->field_0x256, + v1 < 0 ? 1 : 4, + v1 < 0 ? 0 : v1, 1); + } + ov11_02324D8C->field_0x0 = 0x28; + break; + } + case 40: { + if (IsScrollBoxActive(ov11_02324D8C->field_0xb)) { + break; + } + CloseScrollBox(ov11_02324D8C->field_0xb); + sub_02041A00(); + ov11_02324D8C->field_0xb = -2; + ov11_02324D8C->field_0x0 = 0x21; + break; + } + case 26: { + { + u16 v1 = GetItemMoveId16(ov11_02324D8C->field_0x24e); + sub_02017C74(0x131b, 0x100); + sub_02041614(v1); + { + struct unk_02308F4C *v2 = &ov11_02324D8C->field_0x238; + if (v2->field_0x0 == 0) { + sub_0203FD80(v2->field_0x4); + } else if (v2->field_0x0 == 1) { + sub_0203FDEC(v2->field_0x4); + } + } + sub_020407C0(); + ov11_02324D8C->field_0xb4.id_vals[0] = v1; + } + ov11_02324D8C->field_0xb4.strings[0] = ov11_02308DD8(&ov11_02324D8C->field_0x238); + ov11_02308EDC(); + ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, 0xf23 + OV11_02307334_OFFSET_3, &ov11_02324D8C->field_0xb4); + ov11_02308FD0(&ov11_02324D8C->field_0x238); + ov11_02324D8C->field_0x0 = 0x29; + break; + } + case 27: { + sub_020407C0(); + ov11_02324D8C->field_0x0 = 0x1c; + ov11_02324D8C->field_0x32c = sub_020037A4() + 10; + break; + } + case 28: { + if (sub_020037A4() > ov11_02324D8C->field_0x32c) { + ov11_02324D8C->field_0xb4.strings[0] = ov11_02308DD8(&ov11_02324D8C->field_0x238); + ov11_02308EDC(); + ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, 0xf24 + OV11_02307334_OFFSET_3, &ov11_02324D8C->field_0xb4); + ov11_02324D8C->field_0x0 = 0x29; + } + break; + } + case 29: { + ov11_02308EDC(); + ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, 0xf28 + OV11_02307334_OFFSET_3, 0); + ov11_02324D8C->field_0x0 = 0x1e; + break; + } + case 30: { + if (IsDialogueBoxActive(ov11_02324D8C->field_0x8)) { + break; + } + ShowDialogueBox(ov11_02324D8C->field_0x8); + ov11_02308F14(); + ov11_02324D8C->field_0x0 = 0x21; + break; + } + case 41: { + if (IsDialogueBoxActive(ov11_02324D8C->field_0x8)) { + break; + } + ShowDialogueBox(ov11_02324D8C->field_0x8); + ov11_02308F14(); + ov11_02324D8C->field_0x0 = 0; + break; + } + case 4: { + if (IsParentMenuActive(ov11_02324D8C->field_0x7)) { + break; + } + { + s32 v1 = GetSimpleMenuResult__0202AEA4(ov11_02324D8C->field_0x7); + ov11_02324D8C->field_0x0 = 2; + if (v1 != 8 && v1 == 4) { + ov11_02324D8C->field_0xb4.id_vals[0] = ov11_02324D8C->field_0x24e; + ov11_02324D8C->field_0xb4.number_vals[0] = 0; + RemoveItemNoHoleCheck(ov11_02324D8C->field_0x10); + ov11_022DC504(); + ov11_02324D8C->field_0x18 = -1; + ov10_022BCC60(ov11_02324D8C->field_0x4, GetNbItemsInBag()); + SetInventoryMenuState6(ov11_02324D8C->field_0x4); + ov11_02324D8C->field_0x0 = 5; + } + } + CloseParentMenu(ov11_02324D8C->field_0x7); + ov11_02324D8C->field_0x7 = -2; + CloseParentMenu(ov11_02324D8C->field_0x6); + ov11_02324D8C->field_0x6 = -2; + break; + } + case 5: { + if (IsInventoryMenuActive(ov11_02324D8C->field_0x4)) { + break; + } + CloseTextBox2(ov11_02324D8C->field_0x5); + ov11_02324D8C->field_0x5 = -2; + CloseInventoryMenu(ov11_02324D8C->field_0x4); + ov11_02324D8C->field_0x4 = -2; + ov11_02308EDC(); + ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, 0x2cb + OV11_02307334_OFFSET, &ov11_02324D8C->field_0xb4); + ov11_02324D8C->field_0x0 = 6; + break; + } + case 6: { + if (IsDialogueBoxActive(ov11_02324D8C->field_0x8)) { + break; + } + ShowDialogueBox(ov11_02324D8C->field_0x8); + if (!IsBagNotEmpty()) { + ov11_02324D8C->field_0x0 = 0xc; + break; + } + ov11_02308F14(); + ov11_02324D8C->field_0x0 = 0; + break; + } + case 7: { + ov11_02324D8C->field_0x324 = sub_02044688(ov11_02324D8C->field_0x10, 2, 0, 0, 0, 0); + ov11_02324D8C->field_0x0 = 8; + break; + } + case 8: { + if (sub_02044800(ov11_02324D8C->field_0x324) != 1) { + break; + } + sub_020448EC(&ov11_02324D8C->field_0x324); + ov11_02324D8C->field_0x0 = 0; + break; + } + case 9: { + sub_020582E0(GetItemAtIdx(ov11_02324D8C->field_0x10)->held_by); + ov11_02324D8C->field_0x0 = 0; + break; + } + case 10: { + struct item *v1 = GetItemAtIdx(ov11_02324D8C->field_0x10); + bool8 v2 = (v1->flags & 1) != 0; + + if (v2) { + ov11_02324D8C->field_0x24e = v1->id; + } else { + ov11_02324D8C->field_0x24e = 0; + } + InitPreprocessorArgs(&args); + args.id_vals[0] = ov11_02324D8C->field_0x24e; + args.id_vals[2] = v1->quantity + 0xbc; +#ifdef EUROPE + ov11_02324D8C->field_0x9 = CreateScrollBoxSingle(&ov11_02322C78, 0x1013, 0, 0x8e4, &args, (u16)(ov11_02324D8C->field_0x24e + 0x29d3), &args); +#elif defined(JAPAN) + ov11_02324D8C->field_0x9 = CreateScrollBoxSingle(&ov11_02322C78, 0x1013, 0, 0x1d3c, &args, (u16)(ov11_02324D8C->field_0x24e + 0x41ce), &args); +#else + ov11_02324D8C->field_0x9 = CreateScrollBoxSingle(&ov11_02322C78, 0x1013, 0, 0x8e4, &args, (u16)(ov11_02324D8C->field_0x24e + 0x29d1), &args); +#endif + ov11_02324D8C->field_0x0 = 0xb; + break; + } + case 11: { + if (IsScrollBoxActive(ov11_02324D8C->field_0x9)) { + break; + } + CloseScrollBox(ov11_02324D8C->field_0x9); + ov11_02324D8C->field_0x9 = -2; + ov11_02324D8C->field_0x0 = 0; + break; + } + case 12: { + if (ov11_02324D8C->field_0x5 != -2) { + CloseTextBox2(ov11_02324D8C->field_0x5); + ov11_02324D8C->field_0x5 = -2; + } + if (ov11_02324D8C->field_0x4 != -2) { + CloseInventoryMenu(ov11_02324D8C->field_0x4); + ov11_02324D8C->field_0x4 = -2; + } + if (ov11_02324D8C->field_0x8 == -2) { + ov11_02308EDC(); + } + ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, 0x2b4 + OV11_02307334_OFFSET, 0); + ov11_02324D8C->field_0x0 = 0xd; + break; + } + case 13: { + if (IsDialogueBoxActive(ov11_02324D8C->field_0x8)) { + break; + } + ShowDialogueBox(ov11_02324D8C->field_0x8); + ov11_02308F14(); + ov11_02324D8C->field_0x0 = 0x10; + break; + } + case 14: { + ov11_02324D8C->field_0x0 = 0xf; + break; + } + case 15: { + if (!IsInventoryMenuActive(ov11_02324D8C->field_0x4)) { + CloseTextBox2(ov11_02324D8C->field_0x5); + ov11_02324D8C->field_0x5 = -2; + CloseInventoryMenu(ov11_02324D8C->field_0x4); + ov11_02324D8C->field_0x4 = -2; + ov11_02324D8C->field_0x0 = 0x10; + } + } + case 16: + return 1; + } + + return 0; +} From 2447a0200d004d9ceca4b80ecea0ab4951fabd1b Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Tue, 8 Sep 2026 16:39:41 -0700 Subject: [PATCH 13/34] Decompile GenerateMission (0x0205D224) 864 instructions, a 19-step pipeline with five jump tables. No region preprocessor directives -- all three regions assemble identical text, so one source serves US/EU/JP. asm/main_0205D1F4.s is split: GenerateMission merges into src/main_0205D11C.c and the remainder becomes asm/main_0205DFAC.s. main.lsf swaps the object in place. include/main_0205D11C.h gains struct unk_0205DFAC (the 6-byte record), struct unk_0205D224 (the 0x22-byte template) and the prototype; CheckItemForMissionType's second parameter is corrected to union mission_subtype *. Authored by Claude (Opus 4.8) under human direction. Confirmed by a matching build: build/pmdsky.us/pmdsky.us.nds: OK. Co-Authored-By: Claude Opus 4.8 --- asm/include/main_0205D1F4.inc | 37 -- asm/include/main_0205DFAC.inc | 4 + asm/main_0205D1F4.s | 1005 --------------------------------- asm/main_0205DFAC.s | 38 ++ include/main_0205D11C.h | 16 +- main.lsf | 2 +- src/main_0205D11C.c | 618 +++++++++++++++++++- 7 files changed, 675 insertions(+), 1045 deletions(-) delete mode 100644 asm/include/main_0205D1F4.inc create mode 100644 asm/include/main_0205DFAC.inc delete mode 100644 asm/main_0205D1F4.s create mode 100644 asm/main_0205DFAC.s diff --git a/asm/include/main_0205D1F4.inc b/asm/include/main_0205D1F4.inc deleted file mode 100644 index 1a7b3d87..00000000 --- a/asm/include/main_0205D1F4.inc +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -.public CanDungeonBeUsedForMission -.public CanMonsterBeUsedForMission -.public CanMonsterBeUsedForMissionWrapper -.public CheckItemForMissionType -.public CheckMonsterForMissionType -.public ClearMissionData -.public GetAllPossibleMonsters -.public GetMaxItemsAllowed -.public GetMaxMembersAllowed -.public GetMissionSpecificFixedRoom -.public GetSecondFormIfValid -.public IsAvailableItem -.public IsForbiddenFloor -.public IsMissionValid -.public IsStorableItem -.public IsThrownItem -.public LoadMissionTemplates -.public MemAlloc -.public MemFree -.public MISSION_DELIVER_LIST_PTR -.public MtNext -.public RandInt -.public RandIntSafe -.public RollRandomItemReward -.public sub_0205CF58 -.public sub_0205E090 -.public sub_0205E1E8 -.public sub_0205E258 -.public sub_020627F4 -.public sub_02062814 -.public sub_0206282C -.public sub_02062900 -.public sub_02062AD0 -.public sub_02062C4C -.public sub_02062D40 -.public sub_02063424 diff --git a/asm/include/main_0205DFAC.inc b/asm/include/main_0205DFAC.inc new file mode 100644 index 00000000..db34afbd --- /dev/null +++ b/asm/include/main_0205DFAC.inc @@ -0,0 +1,4 @@ +#pragma once +.public CanMonsterBeUsedForMissionWrapper +.public MemAlloc +.public sub_020627F4 diff --git a/asm/main_0205D1F4.s b/asm/main_0205D1F4.s deleted file mode 100644 index d1e66812..00000000 --- a/asm/main_0205D1F4.s +++ /dev/null @@ -1,1005 +0,0 @@ - .include "asm/macros.inc" - .include "main_0205D1F4.inc" - - .text - - arm_func_start GenerateMission -GenerateMission: ; 0x0205D224 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x14 - mov sb, r0 - add r0, sp, #0x10 - mov r8, r1 - bl GetAllPossibleMonsters - str r0, [sp] - cmp r0, #0 - bne _0205D258 - mov r0, r8 - bl ClearMissionData - mov r0, #2 - b _0205DF9C -_0205D258: - mov r0, #4 - strb r0, [r8] - ldrb r0, [sb, #0x20] - strb r0, [r8, #1] - ldrb r0, [sb, #0x21] - strb r0, [r8, #2] - ldrh r0, [sb, #8] - cmp r0, #5 - addls pc, pc, r0, lsl #2 - b _0205D414 -_0205D280: ; jump table - b _0205D298 ; case 0 - b _0205D298 ; case 1 - b _0205D414 ; case 2 - b _0205D414 ; case 3 - b _0205D414 ; case 4 - b _0205D338 ; case 5 -_0205D298: - ldrh r0, [sb, #0xc] - and r1, r0, #0xff - strb r0, [sp, #4] - strb r1, [sp, #5] - ldrh r0, [sb, #8] - cmp r0, #0 - bne _0205D2C8 - and r0, r1, #0xff - bl CanDungeonBeUsedForMission - cmp r0, #0 - moveq r5, #1 - beq _0205D51C -_0205D2C8: - mov r0, r8 - bl sub_0205E258 - mov r3, r0 - add r1, sp, #4 - add r2, sp, #5 - mov r0, #1 - bl sub_02062C4C - cmp r0, #0 - bne _0205D304 - mov r0, r8 - bl sub_0205E258 - cmp r0, #0 - movne r5, #1 - moveq r5, #2 - b _0205D51C -_0205D304: - ldrb r0, [sb, #0x20] - add r2, sp, #5 - add r1, sb, #0x21 - bl sub_0205CF58 - cmp r0, #0 - moveq r5, #1 - beq _0205D51C - ldrb r0, [sp, #5] - mov r5, #0 - strb r0, [r8, #4] - ldrb r0, [sp, #6] - strb r0, [r8, #5] - b _0205D51C -_0205D338: - add r0, sp, #0xc - bl sub_02062814 - ldrb r1, [sb, #0x20] - cmp r1, #3 - ldreqb r1, [sb, #0x21] - cmpeq r1, #3 - movne r5, #1 - bne _0205D51C - mov r1, #0xf - bl MemAlloc - mov r7, r0 - bl sub_0206282C - movs r5, r0 - bne _0205D380 - mov r0, r7 - bl MemFree - mov r5, #1 - b _0205D51C -_0205D380: - mov r0, r8 - bl sub_0205E258 - mov r3, r0 - add r2, sp, #5 - mov r0, r5 - mov r1, r7 - bl sub_02062C4C - mov r6, r0 - ldrb r0, [r8, #1] - ldrb r2, [sp, #5] - add r1, r8, #2 - bl sub_02063424 - strb r0, [sp, #6] - add r5, sp, #5 - b _0205D3D8 -_0205D3BC: - mov r0, r5 - bl IsForbiddenFloor - cmp r0, #0 - beq _0205D3E4 - ldrb r0, [sp, #6] - sub r0, r0, #1 - strb r0, [sp, #6] -_0205D3D8: - ldrb r0, [sp, #6] - cmp r0, #0 - bne _0205D3BC -_0205D3E4: - mov r0, r7 - bl MemFree - cmp r6, #0 - ldrneb r0, [sp, #6] - cmpne r0, #0 - beq _0205D518 - ldrb r0, [sp, #5] - mov r5, #0 - strb r0, [r8, #4] - ldrb r0, [sp, #6] - strb r0, [r8, #5] - b _0205D51C -_0205D414: - ldr r0, _0205DFA4 ; =MISSION_DELIVER_LIST_PTR - mov r5, #1 - ldr r6, [r0, #0xc] - ldr r7, [r0, #8] - cmp r6, #0 - moveq r5, #2 - beq _0205D51C - mov r0, r8 - bl sub_0205E258 - mov r3, r0 - add r2, sp, #5 - mov r0, r6 - mov r1, r7 - bl sub_02062C4C - cmp r0, #0 - bne _0205D468 - mov r0, r8 - bl sub_0205E258 - cmp r0, #0 - moveq r5, #2 - b _0205D51C -_0205D468: - ldrb r0, [r8, #1] - cmp r0, #0xa - addls pc, pc, r0, lsl #2 - b _0205D4F8 -_0205D478: ; jump table - b _0205D4F8 ; case 0 - b _0205D4F8 ; case 1 - b _0205D4A4 ; case 2 - b _0205D4A4 ; case 3 - b _0205D4A4 ; case 4 - b _0205D4A4 ; case 5 - b _0205D4C8 ; case 6 - b _0205D4B8 ; case 7 - b _0205D4F8 ; case 8 - b _0205D4F8 ; case 9 - b _0205D4DC ; case 10 -_0205D4A4: - ldrb r0, [sp, #5] - bl GetMaxMembersAllowed - cmp r0, #4 - movlt r5, #0 - b _0205D4F8 -_0205D4B8: - ldrb r0, [sp, #5] - bl GetMaxItemsAllowed - cmp r0, #0 - moveq r5, #0 -_0205D4C8: - add r0, sp, #5 - bl sub_02062D40 - cmp r0, #0 - moveq r5, #0 - b _0205D4F8 -_0205D4DC: - ldrb r0, [r8, #2] - cmp r0, #4 - bne _0205D4F8 - ldrb r0, [sp, #5] - bl GetMaxMembersAllowed - cmp r0, #4 - movlt r5, #0 -_0205D4F8: - cmp r5, #0 - beq _0205D518 - ldrb r0, [sp, #5] - mov r5, #0 - strb r0, [r8, #4] - ldrb r0, [sp, #6] - strb r0, [r8, #5] - b _0205D51C -_0205D518: - mov r5, #1 -_0205D51C: - cmp r5, #0 - beq _0205D534 - mov r0, r8 - bl ClearMissionData - mov r0, r5 - b _0205DF9C -_0205D534: - bl MtNext - bic r0, r0, #0xff000000 - str r0, [r8, #8] - mov r0, #0 - str r0, [sp, #8] - ldrh r0, [sb, #0xe] - cmp r0, #4 - addls pc, pc, r0, lsl #2 - b _0205D7E4 -_0205D558: ; jump table - b _0205D56C ; case 0 - b _0205D56C ; case 1 - b _0205D62C ; case 2 - b _0205D6F8 ; case 3 - b _0205D77C ; case 4 -_0205D56C: - ldrsh r5, [sb, #0x12] - ldrb r0, [sb, #0x20] - add r1, sb, #0x21 - mov r2, r5 - mov r3, #1 - bl CheckMonsterForMissionType - cmp r0, #0 - moveq r4, #1 - beq _0205DB40 - ldrb r0, [sb, #0x20] - cmp r0, #0xb - ldreqb r0, [sb, #0x21] - cmpeq r0, #0 - bne _0205D5F0 - ldr r0, _0205DFA8 ; =0x000001EA - cmp r5, r0 - addne r0, r0, #0x258 - cmpne r5, r0 - movne r1, #1 - moveq r1, #0 - mov r0, r5 - and r1, r1, #0xff - bl CanMonsterBeUsedForMission - cmp r0, #0 - moveq r4, #1 - beq _0205DB40 - strh r5, [r8, #0xe] - ldrh r0, [sb, #0x18] - mov r4, #0 - strh r0, [r8, #0x10] - ldrh r0, [sb, #0x1e] - strh r0, [r8, #0x12] - b _0205DB40 -_0205D5F0: - ldrh r0, [sb, #0xe] - cmp r0, #0 - mov r0, r5 - bne _0205D614 - bl CanMonsterBeUsedForMissionWrapper - cmp r0, #0 - bne _0205D624 - mov r4, #1 - b _0205DB40 -_0205D614: - bl sub_02062AD0 - cmp r0, #0 - moveq r4, #1 - beq _0205DB40 -_0205D624: - strh r5, [r8, #0xe] - b _0205D7E4 -_0205D62C: - add r0, sp, #8 - add r1, sb, #0xe - bl CountAndPopulateValidMissionTableMonsters - movs r4, r0 - bne _0205D658 - ldr r0, [sp, #8] - bl MemFree - mov r0, #0 - str r0, [sp, #8] - mov r4, #1 - b _0205DB40 -_0205D658: - bl RandInt - mov r1, r0, lsl #1 - ldr r2, [sp, #8] - ldrb r0, [sb, #0x20] - ldrsh r5, [r2, r1] - add r1, sb, #0x21 - mov r3, #1 - mov r2, r5 - bl CheckMonsterForMissionType - cmp r0, #0 - bne _0205D69C - ldr r0, [sp, #8] - bl MemFree - mov r0, #0 - str r0, [sp, #8] - mov r4, #1 - b _0205DB40 -_0205D69C: - ldrh r1, [sb, #0xe] - ldrh r0, [sb, #0x14] - cmp r1, r0 - ldreqh r1, [sb, #0x10] - ldreqh r0, [sb, #0x16] - cmpeq r1, r0 - ldreqh r1, [sb, #0x12] - ldreqh r0, [sb, #0x18] - cmpeq r1, r0 - beq _0205D6D8 - ldr r0, [sp, #8] - mov r4, #0 - bl MemFree - mov r0, r4 - str r0, [sp, #8] -_0205D6D8: - strh r5, [r8, #0xe] - ldrb r0, [r8, #5] - tst r0, #1 - bne _0205D7E4 - ldrsh r0, [r8, #0xe] - bl GetSecondFormIfValid - strh r0, [r8, #0xe] - b _0205D7E4 -_0205D6F8: - ldrh r4, [sb, #0x10] - bl sub_020627F4 - ldrh r1, [sb, #0x12] - add r1, r0, r1, lsl #1 - mov r0, r4 - str r1, [sp, #8] - bl RandInt - mov r1, r0, lsl #1 - ldr r2, [sp, #8] - ldrb r0, [sb, #0x20] - ldrsh r4, [r2, r1] - add r1, sb, #0x21 - mov r3, #1 - mov r2, r4 - bl CheckMonsterForMissionType - cmp r0, #0 - moveq r4, #1 - beq _0205DB40 - mov r0, r4 - bl sub_02062AD0 - cmp r0, #0 - moveq r4, #1 - beq _0205DB40 - strh r4, [r8, #0xe] - ldrb r0, [r8, #5] - tst r0, #1 - bne _0205D770 - ldrsh r0, [r8, #0xe] - bl GetSecondFormIfValid - strh r0, [r8, #0xe] -_0205D770: - mov r4, #0 - str r4, [sp, #8] - b _0205D7E4 -_0205D77C: - add r0, sp, #8 - bl GetAllPossibleMonsters - cmp r0, #0 - moveq r4, #2 - beq _0205DB40 - bl RandIntSafe - mov r1, r0, lsl #1 - ldr r2, [sp, #8] - ldrb r0, [sb, #0x20] - ldrsh r4, [r2, r1] - add r1, sb, #0x21 - mov r3, #1 - mov r2, r4 - bl CheckMonsterForMissionType - cmp r0, #0 - moveq r4, #1 - beq _0205DB40 - strh r4, [r8, #0xe] - ldrb r0, [r8, #5] - tst r0, #1 - bne _0205D7DC - ldrsh r0, [r8, #0xe] - bl GetSecondFormIfValid - strh r0, [r8, #0xe] -_0205D7DC: - mov r4, #0 - str r4, [sp, #8] -_0205D7E4: - mov r0, r8 - bl sub_0205E1E8 - cmp r0, #0 - beq _0205D820 - ldr r0, [sp, #8] - cmp r0, #0 - beq _0205D80C - bl MemFree - mov r0, #0 - str r0, [sp, #8] -_0205D80C: - ldrsh r0, [r8, #0xe] - mov r4, #0 - strh r0, [r8, #0x10] - strh r4, [r8, #0x12] - b _0205DB40 -_0205D820: - ldrb r1, [r8, #1] - cmp r1, #0xa - ldreqb r0, [r8, #2] - cmpeq r0, #6 - beq _0205D844 - cmp r1, #0xb - ldreqb r0, [r8, #2] - cmpeq r0, #0 - bne _0205D84C -_0205D844: - mov sl, #2 - b _0205D858 -_0205D84C: - mov r0, #0 - strh r0, [r8, #0x12] - mov sl, #1 -_0205D858: - mov r6, #0 - add fp, sb, #0x14 - b _0205DB34 -_0205D864: - mov r0, #6 - mul r1, r6, r0 - add r5, sb, r1 - ldrh r0, [r5, #0x14] - cmp r0, #6 - addls pc, pc, r0, lsl #2 - b _0205DB30 -_0205D880: ; jump table - b _0205D89C ; case 0 - b _0205D89C ; case 1 - b _0205D938 ; case 2 - b _0205DA30 ; case 3 - b _0205DAC0 ; case 4 - b _0205DB30 ; case 5 - b _0205DAC0 ; case 6 -_0205D89C: - ldrsh r7, [r5, #0x18] - ldrb r0, [sb, #0x20] - add r1, sb, #0x21 - mov r2, r7 - mov r3, #0 - bl CheckMonsterForMissionType - cmp r0, #0 - moveq r4, #1 - beq _0205DB40 - ldrb r0, [sb, #0x20] - cmp r0, #0xa - ldreqb r0, [sb, #0x21] - cmpeq r0, #6 - bne _0205D8F8 - mov r0, r7 - bl CanMonsterBeUsedForMissionWrapper - cmp r0, #0 - strneh r7, [r8, #0x10] - ldrneh r0, [sb, #0x1e] - moveq r4, #1 - movne r4, #0 - strneh r0, [r8, #0x12] - b _0205DB40 -_0205D8F8: - ldrh r0, [r5, #0x14] - cmp r0, #0 - mov r0, r7 - bne _0205D91C - bl CanMonsterBeUsedForMissionWrapper - cmp r0, #0 - bne _0205D92C - mov r4, #1 - b _0205DB40 -_0205D91C: - bl sub_02062AD0 - cmp r0, #0 - moveq r4, #1 - beq _0205DB40 -_0205D92C: - add r0, r8, r6, lsl #1 - strh r7, [r0, #0x10] - b _0205DB30 -_0205D938: - ldr r0, [sp, #8] - cmp r0, #0 - bne _0205D970 - add r1, fp, r1 - add r0, sp, #8 - bl CountAndPopulateValidMissionTableMonsters - movs r4, r0 - bne _0205D970 - ldr r0, [sp, #8] - bl MemFree - mov r0, #0 - str r0, [sp, #8] - mov r4, #1 - b _0205DB40 -_0205D970: - mov r0, r4 - bl RandInt - ldr r1, [sp, #8] - mov r0, r0, lsl #1 - ldrsh r5, [r1, r0] - ldrb r0, [sb, #0x20] - add r1, sb, #0x21 - mov r2, r5 - mov r3, #0 - bl CheckMonsterForMissionType - cmp r0, #0 - bne _0205D9B8 - ldr r0, [sp, #8] - bl MemFree - mov r0, #0 - str r0, [sp, #8] - mov r4, #1 - b _0205DB40 -_0205D9B8: - add r0, r6, #1 - cmp r0, sl - bge _0205D9F4 - mov r0, #6 - mla r0, r6, r0, sb - ldrh r2, [r0, #0x14] - ldrh r1, [r0, #0x1a] - cmp r2, r1 - ldreqh r2, [r0, #0x16] - ldreqh r1, [r0, #0x1c] - cmpeq r2, r1 - ldreqh r1, [r0, #0x18] - ldreqh r0, [r0, #0x1e] - cmpeq r1, r0 - beq _0205DA08 -_0205D9F4: - ldr r0, [sp, #8] - mov r4, #0 - bl MemFree - mov r0, r4 - str r0, [sp, #8] -_0205DA08: - add r1, r8, r6, lsl #1 - strh r5, [r1, #0x10] - ldrb r0, [r8, #5] - tst r0, #1 - bne _0205DB30 - ldrsh r0, [r1, #0x10] - bl GetSecondFormIfValid - add r1, r8, r6, lsl #1 - strh r0, [r1, #0x10] - b _0205DB30 -_0205DA30: - ldrh r4, [r5, #0x16] - bl sub_020627F4 - ldrh r1, [r5, #0x18] - add r0, r0, r1, lsl #1 - str r0, [sp, #8] - mov r0, r4 - bl RandInt - ldr r1, [sp, #8] - mov r0, r0, lsl #1 - ldrsh r4, [r1, r0] - ldrb r0, [sb, #0x20] - add r1, sb, #0x21 - mov r2, r4 - mov r3, #0 - bl CheckMonsterForMissionType - cmp r0, #0 - moveq r4, #1 - beq _0205DB40 - mov r0, r4 - bl sub_02062AD0 - cmp r0, #0 - moveq r4, #1 - beq _0205DB40 - add r1, r8, r6, lsl #1 - strh r4, [r1, #0x10] - ldrb r0, [r8, #5] - tst r0, #1 - bne _0205DAB0 - ldrsh r0, [r1, #0x10] - bl GetSecondFormIfValid - add r1, r8, r6, lsl #1 - strh r0, [r1, #0x10] -_0205DAB0: - mov r0, #0 - str r0, [sp, #8] - mov r4, r0 - b _0205DB30 -_0205DAC0: - add r0, sp, #8 - bl GetAllPossibleMonsters - cmp r0, #0 - moveq r4, #2 - beq _0205DB40 - bl RandIntSafe - ldr r1, [sp, #8] - mov r0, r0, lsl #1 - ldrsh r5, [r1, r0] - ldrb r0, [sb, #0x20] - add r1, sb, #0x21 - mov r2, r5 - mov r3, #0 - bl CheckMonsterForMissionType - cmp r0, #0 - moveq r4, #1 - beq _0205DB40 - add r1, r8, r6, lsl #1 - strh r5, [r1, #0x10] - ldrb r0, [r8, #5] - tst r0, #1 - bne _0205DB28 - ldrsh r0, [r1, #0x10] - bl GetSecondFormIfValid - add r1, r8, r6, lsl #1 - strh r0, [r1, #0x10] -_0205DB28: - mov r0, #0 - str r0, [sp, #8] -_0205DB30: - add r6, r6, #1 -_0205DB34: - cmp r6, sl - blt _0205D864 - mov r4, #0 -_0205DB40: - cmp r4, #0 - beq _0205DB58 - mov r0, r8 - bl ClearMissionData - mov r0, r4 - b _0205DF9C -_0205DB58: - ldrh r0, [sb, #2] - cmp r0, #4 - addls pc, pc, r0, lsl #2 - b _0205DD34 -_0205DB68: ; jump table - b _0205DB7C ; case 0 - b _0205DB7C ; case 1 - b _0205DBC4 ; case 2 - b _0205DC74 ; case 3 - b _0205DCB8 ; case 4 -_0205DB7C: - ldrsh r4, [sb, #6] - ldrb r0, [sb, #0x20] - add r1, sb, #0x21 - mov r2, r4 - bl CheckItemForMissionType - cmp r0, #0 - moveq r4, #1 - beq _0205DD38 - ldrh r0, [sb, #2] - cmp r0, #0 - bne _0205DBBC - mov r0, r4 - bl IsAvailableItem - cmp r0, #0 - moveq r4, #1 - beq _0205DD38 -_0205DBBC: - strh r4, [r8, #0x14] - b _0205DD34 -_0205DBC4: - ldrh r7, [sb, #4] - ldrh sl, [sb, #6] - mov r5, #0 - bl LoadMissionTemplates - mov fp, r0 - mov r0, r7, lsl #1 - mov r1, #0xf - bl MemAlloc - mov r4, r0 - mov r6, r5 - add sl, fp, sl, lsl #1 - b _0205DC18 -_0205DBF4: - mov r0, r6, lsl #1 - ldrsh fp, [r0, sl] - mov r0, fp - bl IsAvailableItem - cmp r0, #0 - movne r0, r5, lsl #1 - strneh fp, [r4, r0] - addne r5, r5, #1 - add r6, r6, #1 -_0205DC18: - cmp r6, r7 - blt _0205DBF4 - cmp r5, #0 - bne _0205DC38 - mov r0, r4 - bl MemFree - mov r4, #1 - b _0205DD38 -_0205DC38: - mov r0, r5 - bl RandIntSafe - mov r1, r0, lsl #1 - mov r0, r4 - ldrsh r4, [r4, r1] - bl MemFree - ldrb r0, [sb, #0x20] - mov r2, r4 - add r1, sb, #0x21 - bl CheckItemForMissionType - cmp r0, #0 - moveq r4, #1 - beq _0205DD38 - strh r4, [r8, #0x14] - b _0205DD34 -_0205DC74: - ldrh r5, [sb, #4] - ldrh r4, [sb, #6] - bl LoadMissionTemplates - add r4, r0, r4, lsl #1 - mov r0, r5 - bl RandIntSafe - mov r0, r0, lsl #1 - ldrsh r4, [r4, r0] - ldrb r0, [sb, #0x20] - add r1, sb, #0x21 - mov r2, r4 - bl CheckItemForMissionType - cmp r0, #0 - moveq r4, #1 - beq _0205DD38 - strh r4, [r8, #0x14] - b _0205DD34 -_0205DCB8: - ldr r1, _0205DFA4 ; =MISSION_DELIVER_LIST_PTR - ldr r0, [r1, #4] - ldr r4, [r1] - cmp r0, #0 - moveq r0, #0x46 - beq _0205DCDC - bl RandIntSafe - mov r0, r0, lsl #1 - ldrsh r0, [r4, r0] -_0205DCDC: - strh r0, [r8, #0x14] - ldrsh r0, [r8, #0x14] - cmp r0, #0 - bne _0205DD34 - ldrb r0, [r8, #1] - add r0, r0, #0xfa - and r0, r0, #0xff - cmp r0, #1 - movls r4, #1 - bls _0205DD38 -_0205DD04: - ldrb r1, [r8, #1] - add r0, r8, #4 - add r2, r8, #0x14 - bl RollRandomItemReward - ldrsh r0, [r8, #0x14] - bl IsThrownItem - cmp r0, #0 - bne _0205DD04 - ldrsh r0, [r8, #0x14] - bl IsStorableItem - cmp r0, #0 - beq _0205DD04 -_0205DD34: - mov r4, #0 -_0205DD38: - cmp r4, #0 - beq _0205DD50 - mov r0, r8 - bl ClearMissionData - mov r0, r4 - b _0205DF9C -_0205DD50: - ldrb r0, [r8, #4] - cmp r0, #0x26 - cmpne r0, #0x29 - beq _0205DD70 - ldrb r0, [r8, #4] - bl GetMaxMembersAllowed - cmp r0, #4 - bge _0205DD80 -_0205DD70: - mov r0, #0 - strb r0, [r8, #0x1a] - strh r0, [r8, #0x1c] - b _0205DD98 -_0205DD80: - ldr r0, [sp] - ldr r1, [sp, #0x10] - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - add r2, r8, #0x1a - bl sub_02062900 -_0205DD98: - mov r4, #0 - strb r4, [r8, #0xc] - ldrb r0, [r8, #1] - cmp r0, #0xe - addls pc, pc, r0, lsl #2 - b _0205DF84 -_0205DDB0: ; jump table - b _0205DF84 ; case 0 - b _0205DF84 ; case 1 - b _0205DF84 ; case 2 - b _0205DDEC ; case 3 - b _0205DF84 ; case 4 - b _0205DF84 ; case 5 - b _0205DE20 ; case 6 - b _0205DF84 ; case 7 - b _0205DF84 ; case 8 - b _0205DE7C ; case 9 - b _0205DE98 ; case 10 - b _0205DED4 ; case 11 - b _0205DF48 ; case 12 - b _0205DF84 ; case 13 - b _0205DF64 ; case 14 -_0205DDEC: - ldrb r1, [r8, #2] - cmp r1, #1 - beq _0205DE08 - cmp r1, #2 - beq _0205DE14 - cmp r1, #3 - b _0205DF84 -_0205DE08: - bl GetMissionSpecificFixedRoom - strb r0, [r8, #0xc] - b _0205DF84 -_0205DE14: - bl GetMissionSpecificFixedRoom - strb r0, [r8, #0xc] - b _0205DF84 -_0205DE20: - ldrb r0, [r8, #2] - cmp r0, #4 - addls pc, pc, r0, lsl #2 - b _0205DF84 -_0205DE30: ; jump table - b _0205DF84 ; case 0 - b _0205DF84 ; case 1 - b _0205DF84 ; case 2 - b _0205DF84 ; case 3 - b _0205DE44 ; case 4 -_0205DE44: - ldrb r6, [r8, #4] - ldrb r0, [r8, #1] - add r1, r8, #2 - mov r2, r6 - bl sub_02063424 - mov r5, r0 - mov r0, r6 - mov r1, r5 - mov r2, #1 - bl sub_0205E090 - cmp r0, #0 - movne r4, #1 - streqb r5, [r8, #5] - b _0205DF84 -_0205DE7C: - ldrsh r0, [r8, #0x14] - cmp r0, #0x49 - ldrnesh r1, [r8, #0xe] - ldrnesh r0, [r8, #0x10] - cmpne r1, r0 - moveq r4, #1 - b _0205DF84 -_0205DE98: - ldrb r1, [r8, #2] - cmp r1, #7 - addls pc, pc, r1, lsl #2 - b _0205DF84 -_0205DEA8: ; jump table - b _0205DF84 ; case 0 - b _0205DF84 ; case 1 - b _0205DF84 ; case 2 - b _0205DF84 ; case 3 - b _0205DF84 ; case 4 - b _0205DF84 ; case 5 - b _0205DEC8 ; case 6 - b _0205DF84 ; case 7 -_0205DEC8: - bl GetMissionSpecificFixedRoom - strb r0, [r8, #0xc] - b _0205DF84 -_0205DED4: - ldrb r0, [r8, #2] - cmp r0, #5 - addls pc, pc, r0, lsl #2 - b _0205DF34 -_0205DEE4: ; jump table - b _0205DF34 ; case 0 - b _0205DF34 ; case 1 - b _0205DF34 ; case 2 - b _0205DF34 ; case 3 - b _0205DF34 ; case 4 - b _0205DEFC ; case 5 -_0205DEFC: - ldrb r6, [r8, #4] - ldrb r0, [r8, #1] - add r1, r8, #2 - mov r2, r6 - bl sub_02063424 - mov r5, r0 - mov r0, r6 - mov r1, r5 - mov r2, #1 - bl sub_0205E090 - cmp r0, #0 - movne r4, #1 - bne _0205DF84 - strb r5, [r8, #5] -_0205DF34: - ldrb r0, [r8, #1] - ldrb r1, [r8, #2] - bl GetMissionSpecificFixedRoom - strb r0, [r8, #0xc] - b _0205DF84 -_0205DF48: - ldrb r1, [r8, #2] - bl GetMissionSpecificFixedRoom - strb r0, [r8, #0xc] - mov r0, r4 - strb r0, [r8, #0x1a] - strh r0, [r8, #0x1c] - b _0205DF84 -_0205DF64: - ldrb r0, [r8, #2] - cmp r0, #1 - beq _0205DF7C - cmp r0, #2 - moveq r4, #1 - b _0205DF84 -_0205DF7C: - strb r4, [r8, #0x1a] - strh r4, [r8, #0x1c] -_0205DF84: - cmp r4, #0 - moveq r0, #0 - beq _0205DF9C - mov r0, r8 - bl ClearMissionData - mov r0, r4 -_0205DF9C: - add sp, sp, #0x14 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0205DFA4: .word MISSION_DELIVER_LIST_PTR -_0205DFA8: .word 0x000001EA - arm_func_end GenerateMission - - arm_func_start CountAndPopulateValidMissionTableMonsters -CountAndPopulateValidMissionTableMonsters: ; 0x0205DFAC - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - ldrh r6, [r1, #2] - ldrh r8, [r1, #4] - mov sl, r0 - mov r7, #0 - bl sub_020627F4 - mov r4, r0 - mov r0, r6, lsl #1 - mov r1, #0xf - bl MemAlloc - mov sb, r0 - mov r5, r7 - add r4, r4, r8, lsl #1 - b _0205E008 -_0205DFE4: - mov r0, r5, lsl #1 - ldrsh r8, [r0, r4] - mov r0, r8 - bl CanMonsterBeUsedForMissionWrapper - cmp r0, #0 - movne r0, r7, lsl #1 - strneh r8, [sb, r0] - addne r7, r7, #1 - add r5, r5, #1 -_0205E008: - cmp r5, r6 - blt _0205DFE4 - mov r0, r7 - str sb, [sl] - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end CountAndPopulateValidMissionTableMonsters diff --git a/asm/main_0205DFAC.s b/asm/main_0205DFAC.s new file mode 100644 index 00000000..31d1e7e8 --- /dev/null +++ b/asm/main_0205DFAC.s @@ -0,0 +1,38 @@ + .include "asm/macros.inc" + .include "main_0205DFAC.inc" + + .text + + arm_func_start CountAndPopulateValidMissionTableMonsters +CountAndPopulateValidMissionTableMonsters: ; 0x0205DFAC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + ldrh r6, [r1, #2] + ldrh r8, [r1, #4] + mov sl, r0 + mov r7, #0 + bl sub_020627F4 + mov r4, r0 + mov r0, r6, lsl #1 + mov r1, #0xf + bl MemAlloc + mov sb, r0 + mov r5, r7 + add r4, r4, r8, lsl #1 + b _0205E008 +_0205DFE4: + mov r0, r5, lsl #1 + ldrsh r8, [r0, r4] + mov r0, r8 + bl CanMonsterBeUsedForMissionWrapper + cmp r0, #0 + movne r0, r7, lsl #1 + strneh r8, [sb, r0] + addne r7, r7, #1 + add r5, r5, #1 +_0205E008: + cmp r5, r6 + blt _0205DFE4 + mov r0, r7 + str sb, [sl] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end CountAndPopulateValidMissionTableMonsters diff --git a/include/main_0205D11C.h b/include/main_0205D11C.h index ed751c11..44868f67 100644 --- a/include/main_0205D11C.h +++ b/include/main_0205D11C.h @@ -5,9 +5,23 @@ #include "util.h" #include "mission.h" +struct unk_0205DFAC { + u16 field_0x0; + u16 field_0x2; + s16 field_0x4; +}; + +struct unk_0205D224 { + u16 field_0x0; + struct unk_0205DFAC field_0x2[5]; + enum mission_type field_0x20; + union mission_subtype field_0x21; +}; + bool8 sub_0205CF58(enum mission_type type, union mission_subtype* subtype, struct dungeon_floor_pair* df_pair); bool8 CheckMonsterForMissionType(enum mission_type type, union mission_subtype* subtype, enum monster_id outlaw_backup_species, bool8 arg3); -bool8 CheckItemForMissionType(u32 r0, u32 r1, s16 r2); +bool8 CheckItemForMissionType(u32 r0, union mission_subtype *r1, s16 r2); bool8 sub_0205D1F4(struct mission *mission); +s32 GenerateMission(struct unk_0205D224 *tmpl, struct mission *mission); #endif //PMDSKY_MAIN_0205D11C_H diff --git a/main.lsf b/main.lsf index d2b2016e..946bcbc4 100644 --- a/main.lsf +++ b/main.lsf @@ -348,7 +348,7 @@ Static main Object src/main_0205C73C.o Object asm/main_0205CA40.o Object src/main_0205D11C.o - Object asm/main_0205D1F4.o + Object asm/main_0205DFAC.o Object src/main_0205E01C.o Object src/main_0205E288.o Object asm/main_0205E48C.o diff --git a/src/main_0205D11C.c b/src/main_0205D11C.c index 087067e5..a5ce1bb0 100644 --- a/src/main_0205D11C.c +++ b/src/main_0205D11C.c @@ -5,6 +5,14 @@ #include "item_util.h" #include "item_util_4.h" #include "mission.h" +#include "item_util.h" +#include "main_02001188.h" +#include "main_0200224C.h" +#include "main_02054BE0.h" +#include "main_02062A58.h" +#include "main_0205E01C.h" +#include "main_0205E288.h" +#include "dungeon_recruitment_2.h" extern u8 _020A39C0; extern u8 _020A39D4; @@ -18,6 +26,26 @@ extern const char _020A3AD4[]; extern const char _020A3AF4[]; extern const char _020A3B18[]; +extern s32 RandIntSafe(s32 n); +extern void ClearMissionData(struct mission *mission); +extern void *MemAlloc(u32 len, u32 flags); +extern struct mission_deliver_list MISSION_DELIVER_LIST_PTR; +extern s32 CanDungeonBeUsedForMission(enum dungeon_id); +extern s32 CountAndPopulateValidMissionTableMonsters(s16 **out, struct unk_0205DFAC *spec); +extern s32 GetAllPossibleMonsters(s16 **out); +extern u8 GetMissionSpecificFixedRoom(enum mission_type, u32); +extern bool8 IsAvailableItem(s16 item_id); +extern void *LoadMissionTemplates(void); +extern s32 MtNext(void); +extern void RollRandomItemReward(struct dungeon_floor_pair *, enum mission_type, s16 *out); +extern void sub_02062900(u16, s16 *, void *out); +extern bool8 sub_02062AD0(enum monster_id); +extern bool8 sub_02062C4C(s32, u8 *, struct dungeon_floor_pair *, s32); +extern s32 sub_02062814(void **out); +extern s32 sub_0206282C(u8 *out); +extern bool8 sub_02062D40(struct dungeon_floor_pair *); +extern s16 *sub_020627F4(void); + extern enum monster_id GetBaseForm(enum monster_id); extern s32 GetBodySize(enum monster_id); extern bool8 IsForbiddenFloor(struct dungeon_floor_pair*); @@ -93,7 +121,7 @@ bool8 CheckMonsterForMissionType(enum mission_type type, union mission_subtype* return TRUE; } -bool8 CheckItemForMissionType(u32 r0, u32 r1, s16 r2) +bool8 CheckItemForMissionType(u32 r0, union mission_subtype *r1, s16 r2) { if (r2 == 0) { Debug_Print0(_020A3AD4, r2); @@ -129,3 +157,591 @@ bool8 sub_0205D1F4(struct mission *mission) { } return TRUE; } + +s32 GenerateMission(struct unk_0205D224 *tmpl, struct mission *mission) +{ + s16 *sp10; + void *sp0c; + s16 *sp08; + struct { u8 list[1]; struct dungeon_floor_pair df; } x; + s32 count; + s32 err; + + s16 m; + + count = GetAllPossibleMonsters(&sp10); + if (count == 0) { + ClearMissionData(mission); + return 2; + } + mission->status = MISSION_STATUS_SUSPENDED; + mission->type = tmpl->field_0x20; + mission->subtype = tmpl->field_0x21; + { + s32 e; + + do { + switch (tmpl->field_0x2[1].field_0x0) { + case 0: + case 1: + x.list[0] = *(u16 *)&tmpl->field_0x2[1].field_0x4; + x.df.dungeon_id = (enum dungeon_id)x.list[0]; + if (tmpl->field_0x2[1].field_0x0 == 0 && CanDungeonBeUsedForMission(x.df.dungeon_id) == 0) { + e = 1; + } else if (!sub_02062C4C(1, x.list, &x.df, sub_0205E258(mission))) { + e = sub_0205E258(mission) ? 1 : 2; + } else if (!sub_0205CF58(tmpl->field_0x20, &tmpl->field_0x21, &x.df)) { + e = 1; + } else { + e = 0; + mission->dungeon_id = x.df.dungeon_id; + mission->floor = x.df.floor_id; + } + continue; + case 5: + { + s32 n; + s32 ok; + u8 *p; + n = sub_02062814(&sp0c); + if (tmpl->field_0x20 != 3 || tmpl->field_0x21.other != 3) { + e = 1; + continue; + } + p = MemAlloc(n, 0xf); + n = sub_0206282C(p); + if (n == 0) { + MemFree(p); + e = 1; + continue; + } + ok = sub_02062C4C(n, p, &x.df, sub_0205E258(mission)); + x.df.floor_id = sub_02063424(mission->type, &mission->subtype, x.df.dungeon_id); + while (x.df.floor_id != 0) { + if (!IsForbiddenFloor(&x.df)) { + break; + } + x.df.floor_id--; + } + MemFree(p); + if (ok && x.df.floor_id != 0) { + e = 0; + mission->dungeon_id = x.df.dungeon_id; + mission->floor = x.df.floor_id; + continue; + } + } + break; + case 2: + case 3: + case 4: + default: + { + s32 n; + u8 *p; + e = 1; + n = *(s32 *)&MISSION_DELIVER_LIST_PTR.unk0[0xc]; + p = *(u8 **)&MISSION_DELIVER_LIST_PTR.unk0[8]; + if (n == 0) { + e = 2; + continue; + } + if (!sub_02062C4C(n, p, &x.df, sub_0205E258(mission))) { + if (sub_0205E258(mission) == 0) { + e = 2; + } + continue; + } + switch (mission->type) { + case 2: + case 3: + case 4: + case 5: + if (GetMaxMembersAllowed(x.df.dungeon_id) < 4) { + e = 0; + } + break; + case 7: + if (GetMaxItemsAllowed(x.df.dungeon_id) == 0) { + e = 0; + } + case 6: + if (!sub_02062D40(&x.df)) { + e = 0; + } + break; + case 10: + if (mission->subtype.other == 4 && GetMaxMembersAllowed(x.df.dungeon_id) < 4) { + e = 0; + } + break; + default: + break; + } + if (e != 0) { + e = 0; + mission->dungeon_id = x.df.dungeon_id; + mission->floor = x.df.floor_id; + continue; + } + } + break; + } + e = 1; + } while (0); + if (e) { + ClearMissionData(mission); + return e; + } + mission->description_id = MtNext() & 0xFFFFFF; + sp08 = NULL; + } + do { + switch (tmpl->field_0x2[2].field_0x0) { + case 0: + case 1: { + m = tmpl->field_0x2[2].field_0x4; + if (!CheckMonsterForMissionType(tmpl->field_0x20, &tmpl->field_0x21, (enum monster_id)m, TRUE)) { + err = 1; + } else if (tmpl->field_0x20 == MISSION_CHALLENGE_REQUEST && tmpl->field_0x21.other == 0) { + if (CanMonsterBeUsedForMission(m, m != MONSTER_LUCARIO && m != MONSTER_LUCARIO_SECONDARY)) { + mission->client = (enum monster_id)m; + mission->target = (enum monster_id)*(u16 *)&tmpl->field_0x2[3].field_0x4; + mission->outlaw_backup_species = (enum monster_id)*(u16 *)&tmpl->field_0x2[4].field_0x4; + err = 0; + } else { + err = 1; + } + } else { + if (tmpl->field_0x2[2].field_0x0 == 0) { + if (!CanMonsterBeUsedForMissionWrapper(m)) { + err = 1; + continue; + } + } else if (!sub_02062AD0((enum monster_id)m)) { + err = 1; + continue; + } + mission->client = (enum monster_id)m; + break; + } + continue; + } + case 2: { + err = CountAndPopulateValidMissionTableMonsters(&sp08, &tmpl->field_0x2[2]); + if (err == 0) { + MemFree(sp08); + sp08 = NULL; + err = 1; + } else { + m = sp08[RandInt(err)]; + if (!CheckMonsterForMissionType(tmpl->field_0x20, &tmpl->field_0x21, (enum monster_id)m, TRUE)) { + MemFree(sp08); + sp08 = NULL; + err = 1; + } else { + if (!(tmpl->field_0x2[2].field_0x0 == tmpl->field_0x2[3].field_0x0 + && tmpl->field_0x2[2].field_0x2 == tmpl->field_0x2[3].field_0x2 + && (u16)tmpl->field_0x2[2].field_0x4 == (u16)tmpl->field_0x2[3].field_0x4)) { + err = 0; + MemFree(sp08); + sp08 = NULL; + } + mission->client = (enum monster_id)m; + if (!(mission->floor & 1)) { + mission->client = (enum monster_id)GetSecondFormIfValid((enum monster_id)mission->client); + } + break; + } + } + continue; + } + case 3: { + u16 n = tmpl->field_0x2[2].field_0x2; + sp08 = sub_020627F4() + (u16)tmpl->field_0x2[2].field_0x4; + m = sp08[RandInt(n)]; + if (!CheckMonsterForMissionType(tmpl->field_0x20, &tmpl->field_0x21, (enum monster_id)m, TRUE)) { + err = 1; + } else if (!sub_02062AD0((enum monster_id)m)) { + err = 1; + } else { + mission->client = (enum monster_id)m; + if (!(mission->floor & 1)) { + mission->client = (enum monster_id)GetSecondFormIfValid((enum monster_id)mission->client); + } + err = 0; + sp08 = NULL; + break; + } + continue; + } + case 4: { + s32 n = GetAllPossibleMonsters(&sp08); + if (n == 0) { + err = 2; + } else { + m = sp08[RandIntSafe(n)]; + if (!CheckMonsterForMissionType(tmpl->field_0x20, &tmpl->field_0x21, (enum monster_id)m, TRUE)) { + err = 1; + } else { + mission->client = (enum monster_id)m; + if (!(mission->floor & 1)) { + mission->client = (enum monster_id)GetSecondFormIfValid((enum monster_id)mission->client); + } + err = 0; + sp08 = NULL; + break; + } + } + continue; + } + } + if (sub_0205E1E8(mission)) { + if (sp08 != NULL) { + MemFree(sp08); + sp08 = NULL; + } + mission->target = (enum monster_id)mission->client; + mission->outlaw_backup_species = (enum monster_id)0; + err = 0; + } else { + int i; + s32 sl; + + if ((mission->type == MISSION_ARREST_OUTLAW && mission->subtype.outlaw == MISSION_OUTLAW_HIDEOUT) || + (mission->type == MISSION_CHALLENGE_REQUEST && mission->subtype.challenge == MISSION_CHALLENGE_NORMAL)) { + sl = 2; + } else { + mission->outlaw_backup_species = (enum monster_id)0; + sl = 1; + } + for (i = 0; i < sl || (err = 0); i++) { + switch (tmpl->field_0x2[i + 3].field_0x0) { + case 0: + case 1: { + m = tmpl->field_0x2[i + 3].field_0x4; + if (!CheckMonsterForMissionType(tmpl->field_0x20, &tmpl->field_0x21, (enum monster_id)m, 0)) { + err = 1; + break; + } else if (tmpl->field_0x20 == MISSION_ARREST_OUTLAW && + tmpl->field_0x21.outlaw == MISSION_OUTLAW_HIDEOUT) { + if (!CanMonsterBeUsedForMissionWrapper(m)) { + err = 1; + } else { + mission->target = (enum monster_id)m; + mission->outlaw_backup_species = (enum monster_id)*(u16 *)&tmpl->field_0x2[4].field_0x4; + err = 0; + } + break; + } else if (tmpl->field_0x2[i + 3].field_0x0 == 0) { + if (!CanMonsterBeUsedForMissionWrapper(m)) { + err = 1; + break; + } + } else { + if (!sub_02062AD0((enum monster_id)m)) { + err = 1; + break; + } + } + ((s16 *)&mission->target)[i] = m; + continue; + } + case 2: { + s16 id; + if (sp08 == NULL) { + err = CountAndPopulateValidMissionTableMonsters(&sp08, &tmpl->field_0x2[3] + i); + if (err == 0) { + MemFree(sp08); + sp08 = NULL; + err = 1; + break; + } + } + id = sp08[RandInt(err)]; + if (!CheckMonsterForMissionType(tmpl->field_0x20, &tmpl->field_0x21, (enum monster_id)id, 0)) { + MemFree(sp08); + sp08 = NULL; + err = 1; + } else { + if (i + 1 >= sl || + tmpl->field_0x2[(u32)i + 3].field_0x0 != tmpl->field_0x2[(u32)i + 4].field_0x0 || + tmpl->field_0x2[(u32)i + 3].field_0x2 != tmpl->field_0x2[(u32)i + 4].field_0x2 || + (u16)tmpl->field_0x2[(u32)i + 3].field_0x4 != (u16)tmpl->field_0x2[(u32)i + 4].field_0x4) { + err = 0; + MemFree(sp08); + sp08 = NULL; + } + ((s16 *)&mission->target)[i] = id; + if (!(mission->floor & 1)) { + ((s16 *)&mission->target)[i] = GetSecondFormIfValid(((s16 *)&mission->target)[i]); + } + continue; + } + break; + } + case 3: { + s16 id; + s32 m = tmpl->field_0x2[i + 3].field_0x2; + sp08 = sub_020627F4() + (u16)tmpl->field_0x2[i + 3].field_0x4; + id = sp08[RandInt(m)]; + if (!CheckMonsterForMissionType(tmpl->field_0x20, &tmpl->field_0x21, (enum monster_id)id, 0)) { + err = 1; + } else if (!sub_02062AD0((enum monster_id)id)) { + err = 1; + } else { + ((s16 *)&mission->target)[i] = id; + if (!(mission->floor & 1)) { + ((s16 *)&mission->target)[i] = GetSecondFormIfValid(((s16 *)&mission->target)[i]); + } + sp08 = NULL; + err = 0; + continue; + } + break; + } + case 4: + case 6: { + s16 id; + s32 m = GetAllPossibleMonsters(&sp08); + if (m == 0) { + err = 2; + } else { + id = sp08[RandIntSafe(m)]; + if (!CheckMonsterForMissionType(tmpl->field_0x20, &tmpl->field_0x21, (enum monster_id)id, 0)) { + err = 1; + } else { + ((s16 *)&mission->target)[i] = id; + if (!(mission->floor & 1)) { + ((s16 *)&mission->target)[i] = GetSecondFormIfValid(((s16 *)&mission->target)[i]); + } + sp08 = NULL; + continue; + } + } + break; + } + default: + continue; + } + break; + } + } + } while (0); + if (err != 0) { + ClearMissionData(mission); + return err; + } + do { + s16 item; + + switch (tmpl->field_0x2[0].field_0x0) { + case 0: + case 1: + item = tmpl->field_0x2[0].field_0x4; + if (CheckItemForMissionType(tmpl->field_0x20, &tmpl->field_0x21, item) == 0) { + err = 1; + } else if (tmpl->field_0x2[0].field_0x0 == 0 && IsAvailableItem(item) == 0) { + err = 1; + } else { + mission->item_wanted = (enum item_id)item; + break; + } + continue; + case 2: { + s16 *buf; + s32 k; + s32 i; + s32 n; + s32 off; + s16 v; + s16 *base; + + n = tmpl->field_0x2[0].field_0x2; + off = (u16)tmpl->field_0x2[0].field_0x4; + k = 0; + base = (s16 *)LoadMissionTemplates(); + buf = (s16 *)MemAlloc(n * 2, 0xf); + for (i = 0; i < n; i++) { + v = base[off + i]; + if (IsAvailableItem(v) != 0) { + buf[k] = v; + k++; + } + } + if (k == 0) { + MemFree(buf); + err = 1; + } else { + item = buf[RandIntSafe(k)]; + MemFree(buf); + if (CheckItemForMissionType(tmpl->field_0x20, &tmpl->field_0x21, item) == 0) { + err = 1; + } else { + mission->item_wanted = (enum item_id)item; + break; + } + } + continue; + } + case 3: { + s32 off; + s32 n; + s16 *p; + + n = tmpl->field_0x2[0].field_0x2; + off = (u16)tmpl->field_0x2[0].field_0x4; + p = (s16 *)LoadMissionTemplates() + off; + item = p[RandIntSafe(n)]; + if (CheckItemForMissionType(tmpl->field_0x20, &tmpl->field_0x21, item) == 0) { + err = 1; + } else { + mission->item_wanted = (enum item_id)item; + break; + } + continue; + } + case 4: { + s32 cnt; + s16 *lst; + s16 v; + + cnt = *(s32 *)&MISSION_DELIVER_LIST_PTR.unk0[4]; + lst = *(s16 **)&MISSION_DELIVER_LIST_PTR.unk0[0]; + if (cnt == 0) + v = 0x46; + else + v = lst[RandIntSafe(cnt)]; + mission->item_wanted = (enum item_id)v; + if (*(s16 *)&mission->item_wanted == 0) { + if (mission->type == 6 || mission->type == 7) { + err = 1; + continue; + } else { + do { + RollRandomItemReward((struct dungeon_floor_pair *)&mission->dungeon_id, + mission->type, + (s16 *)&mission->item_wanted); + } while (IsThrownItem(*(s16 *)&mission->item_wanted) + || !IsStorableItem(*(s16 *)&mission->item_wanted)); + } + } + break; + } + default: + break; + } + err = 0; + } while (0); + if (err != 0) { + ClearMissionData(mission); + return err; + } + if (mission->dungeon_id == 0x26 || mission->dungeon_id == 0x29 || + GetMaxMembersAllowed(*(volatile enum dungeon_id *)&mission->dungeon_id) < 4) { + mission->restriction_type = (enum mission_restriction_type)0; + mission->restriction.monster_id = (enum monster_id)0; + } else { + sub_02062900((u16)count, sp10, &mission->restriction_type); + } + err = 0; + mission->unique_map_id = 0; + switch (mission->type) { + case 3: + switch (mission->subtype.other) { + case 1: + mission->unique_map_id = GetMissionSpecificFixedRoom(mission->type, mission->subtype.other); + break; + case 2: + mission->unique_map_id = GetMissionSpecificFixedRoom(mission->type, mission->subtype.other); + break; + case 3: + break; + } + break; + case 6: + switch (mission->subtype.other) { + case 0: + case 1: + case 2: + case 3: + break; + case 4: + { + enum dungeon_id dn = mission->dungeon_id; + s32 v = sub_02063424(*(volatile enum mission_type *)&mission->type, &mission->subtype, dn); + if (sub_0205E090(dn, v, 1)) { + err = 1; + } else { + mission->floor = v; + } + break; + } + } + break; + case 9: + if (*(s16 *)&mission->item_wanted == 0x49 || mission->client == mission->target) { + err = 1; + } + break; + case 10: + switch (mission->subtype.other) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 7: + break; + case 6: + mission->unique_map_id = GetMissionSpecificFixedRoom(mission->type, mission->subtype.other); + break; + } + break; + case 11: + switch (mission->subtype.other) { + case 5: + { + enum dungeon_id dn = mission->dungeon_id; + s32 v = sub_02063424(*(volatile enum mission_type *)&mission->type, &mission->subtype, dn); + if (sub_0205E090(dn, v, 1)) { + err = 1; + break; + } + mission->floor = v; + } + case 0: + case 1: + case 2: + case 3: + case 4: + default: + mission->unique_map_id = GetMissionSpecificFixedRoom(mission->type, mission->subtype.other); + break; + } + break; + case 12: + mission->unique_map_id = GetMissionSpecificFixedRoom(mission->type, mission->subtype.other); + mission->restriction_type = (enum mission_restriction_type)0; + mission->restriction.monster_id = (enum monster_id)0; + break; + case 14: + switch (mission->subtype.other) { + case 1: + mission->restriction_type = (enum mission_restriction_type)0; + mission->restriction.monster_id = (enum monster_id)0; + break; + case 2: + err = 1; + break; + } + break; + } + if (err) { + ClearMissionData(mission); + return err; + } + + return 0; +} From fd3564d3129e6a30ac10b64b3fe8c328b765537e Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Tue, 8 Sep 2026 22:46:23 -0700 Subject: [PATCH 14/34] Decompile GenerateExtraHallways (0x0233C9E8) 356 instructions in overlay_29. No region preprocessor directives -- all three regions assemble identical text, so one source serves US/EU/JP. asm/overlay_29_0233AE84.s is split: the function becomes the new pair src/overlay_29_0233C9E8.c + include/overlay_29_0233C9E8.h, and the remainder becomes asm/overlay_29_0233CF84.s. main.lsf gains two objects. The header carries two placeholder types the function needs and the tree did not have: struct unk_0233C9E8, the 30-byte dungeon grid cell (no such struct existed, and the grid is a stack local in every caller, so it has no global to key a name on), and struct unk_0237CFBC for FLOOR_GENERATION_STATUS, which had no C declaration anywhere. That symbol's asm reserves .space 0x4 but this function reads byte +6, so the declaration is sized to what is used. Authored by Claude (Opus 4.8) under human direction. Confirmed by a matching build: build/pmdsky.us/pmdsky.us.nds: OK. Co-Authored-By: Claude Opus 4.8 --- asm/include/overlay_29_0233AE84.inc | 27 +- asm/include/overlay_29_0233CF84.inc | 15 + asm/overlay_29_0233AE84.s | 4838 --------------------------- asm/overlay_29_0233CF84.s | 4451 ++++++++++++++++++++++++ include/overlay_29_0233C9E8.h | 38 + main.lsf | 2 + src/overlay_29_0233C9E8.c | 175 + 7 files changed, 4698 insertions(+), 4848 deletions(-) create mode 100644 asm/include/overlay_29_0233CF84.inc create mode 100644 asm/overlay_29_0233CF84.s create mode 100644 include/overlay_29_0233C9E8.h create mode 100644 src/overlay_29_0233C9E8.c diff --git a/asm/include/overlay_29_0233AE84.inc b/asm/include/overlay_29_0233AE84.inc index f374758b..dffd93c9 100644 --- a/asm/include/overlay_29_0233AE84.inc +++ b/asm/include/overlay_29_0233AE84.inc @@ -1,22 +1,29 @@ #pragma once -.public _s32_div_f -.public abs -.public CORNER_CARDINAL_NEIGHBOR_IS_OPEN -.public DIRECTIONS_XY +.public AssignGridCellConnections +.public AssignRooms +.public CreateGridCellConnections +.public CreateRoomsAndAnchors .public DUNGEON_PTR .public DungeonRandInt .public DungeonRandRange +.public EnsureConnectedGrid .public FLOOR_GENERATION_STATUS -.public GetFloorType +.public FinalizeJunctions +.public GenerateExtraHallways +.public GenerateKecleonShop +.public GenerateMazeRoom +.public GenerateMonsterHouse +.public GenerateRoomImperfections +.public GenerateSecondaryStructures +.public GetGridPositions .public GetNextFixedRoomAction .public GetTile .public GetTileSafe .public HIDDEN_STAIRS_SPAWN_BLOCKED +.public InitDungeonGrid .public IsCurrentTilesetBackground -.public IsDestinationFloorWithMonster -.public IsOutlawMonsterHouseFloor +.public PlaceFixedRoomTile +.public ResetHiddenStairsSpawn +.public _s32_div_f .public ov29_0234217C .public ov29_02342594 -.public PlaceFixedRoomTile -.public PosIsOutOfBounds -.public ResetHiddenStairsSpawn diff --git a/asm/include/overlay_29_0233CF84.inc b/asm/include/overlay_29_0233CF84.inc new file mode 100644 index 00000000..28bcd334 --- /dev/null +++ b/asm/include/overlay_29_0233CF84.inc @@ -0,0 +1,15 @@ +#pragma once +.public CORNER_CARDINAL_NEIGHBOR_IS_OPEN +.public DIRECTIONS_XY +.public DUNGEON_PTR +.public DungeonRandInt +.public DungeonRandRange +.public FLOOR_GENERATION_STATUS +.public GetFloorType +.public GetTile +.public GetTileSafe +.public IsDestinationFloorWithMonster +.public IsOutlawMonsterHouseFloor +.public PosIsOutOfBounds +.public _s32_div_f +.public abs diff --git a/asm/overlay_29_0233AE84.s b/asm/overlay_29_0233AE84.s index 06d5a229..70bb9632 100644 --- a/asm/overlay_29_0233AE84.s +++ b/asm/overlay_29_0233AE84.s @@ -1962,4841 +1962,3 @@ _0233C97C: .align 2, 0 _0233C9E4: .word 0x000001C2 arm_func_end GenerateTwoRoomsWithMonsterHouseFloor - - arm_func_start GenerateExtraHallways -GenerateExtraHallways: ; 0x0233C9E8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x10 - movs sl, r3 - str r0, [sp] - str r1, [sp, #4] - str r2, [sp, #8] - beq _0233CF70 - mov r5, #0 - b _0233CF68 -_0233CA0C: - ldr r0, [sp, #4] - bl DungeonRandInt - mov r4, r0 - ldr r0, [sp, #8] - bl DungeonRandInt - mov sb, r0 - ldr r1, _0233CF78 ; =0x000001C2 - ldr r0, [sp] - mla r1, r4, r1, r0 - mov r0, #0x1e - mla r6, sb, r0, r1 - ldrb r0, [r6, #0xa] - cmp r0, #0 - ldrneb r0, [r6, #0xb] - cmpne r0, #0 - beq _0233CF64 - ldrb r0, [r6, #8] - cmp r0, #0 - ldreqb r0, [r6, #0x10] - cmpeq r0, #0 - bne _0233CF64 - ldrsh r0, [r6] - ldrsh r1, [r6, #4] - bl DungeonRandRange - mov r8, r0 - ldrsh r0, [r6, #2] - ldrsh r1, [r6, #6] - bl DungeonRandRange - mov r7, r0 - mov r0, #4 - bl DungeonRandInt - mov r6, r0, lsl #1 - ldr r0, [sp, #8] - mov ip, #0 - sub fp, r0, #1 - ldr r0, [sp, #4] - mov r3, #2 - sub r2, r0, #1 - mov r1, #4 - mov r0, #6 - mov lr, ip -_0233CAB0: - cmp r6, #0 - bne _0233CAC0 - cmp sb, fp - movge r6, r3 -_0233CAC0: - cmp r6, #2 - bne _0233CAD0 - cmp r4, r2 - movge r6, r1 -_0233CAD0: - cmp r6, #4 - bne _0233CAE0 - cmp sb, #0 - movle r6, r0 -_0233CAE0: - cmp r6, #6 - bne _0233CAF0 - cmp r4, #0 - movle r6, lr -_0233CAF0: - add ip, ip, #1 - cmp ip, #3 - blt _0233CAB0 - mov r0, r8 - mov r1, r7 - bl GetTile - ldrb sb, [r0, #7] - ldr r0, _0233CF7C ; =DIRECTIONS_XY - mov r4, r6, lsl #2 - add fp, r0, r6, lsl #2 -_0233CB18: - mov r0, r8 - mov r1, r7 - bl GetTile - ldrb r0, [r0, #7] - cmp sb, r0 - ldreq r0, _0233CF7C ; =DIRECTIONS_XY - ldreqsh r1, [r0, r4] - ldreqsh r0, [fp, #2] - addeq r8, r8, r1 - addeq r7, r7, r0 - beq _0233CB18 - ldr fp, _0233CF7C ; =DIRECTIONS_XY - mov sb, r6, lsl #2 - add r4, fp, r6, lsl #2 -_0233CB50: - mov r0, r8 - mov r1, r7 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - ldreqsh r1, [fp, sb] - ldreqsh r0, [r4, #2] - addeq r8, r8, r1 - addeq r7, r7, r0 - beq _0233CB50 - mov r0, r8 - mov r1, r7 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #2 - beq _0233CF64 - sub sb, r8, #2 - mov r4, #0 - add r1, r7, #2 - sub r3, r7, #2 - add r0, r8, #2 - mov r2, #1 - b _0233CBFC -_0233CBB4: - mov fp, r3 - b _0233CBE8 -_0233CBBC: - cmp sb, #0 - blt _0233CBDC - cmp sb, #0x38 - bge _0233CBDC - cmp fp, #0 - blt _0233CBDC - cmp fp, #0x20 - blt _0233CBE4 -_0233CBDC: - mov r4, r2 - b _0233CBF0 -_0233CBE4: - add fp, fp, #1 -_0233CBE8: - cmp fp, r1 - ble _0233CBBC -_0233CBF0: - cmp r4, #0 - bne _0233CC04 - add sb, sb, #1 -_0233CBFC: - cmp sb, r0 - ble _0233CBB4 -_0233CC04: - cmp r4, #0 - bne _0233CF64 - add r0, r6, #2 - and r0, r0, #6 - ldr r1, _0233CF7C ; =DIRECTIONS_XY - mov r2, r0, lsl #2 - add r0, r1, r0, lsl #2 - ldrsh r2, [r1, r2] - ldrsh r1, [r0, #2] - add r0, r8, r2 - add r1, r7, r1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233CF64 - sub r0, r6, #2 - and r0, r0, #6 - ldr r1, _0233CF7C ; =DIRECTIONS_XY - mov r2, r0, lsl #2 - add r0, r1, r0, lsl #2 - ldrsh r2, [r1, r2] - ldrsh r1, [r0, #2] - add r0, r8, r2 - add r1, r7, r1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233CF64 - mov r0, #3 - bl DungeonRandInt - ldr r4, _0233CF7C ; =DIRECTIONS_XY - add sb, r0, #3 -_0233CC8C: - cmp r8, #1 - cmpgt r7, #1 - ble _0233CF64 - cmp r8, #0x37 - cmplt r7, #0x1f - bge _0233CF64 - mov r0, r8 - mov r1, r7 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233CF64 - mov r0, r8 - mov r1, r7 - bl GetTile - ldrh r0, [r0] - tst r0, #0x10 - bne _0233CF64 - mov r0, #1 - str r0, [sp, #0xc] - add r0, r8, #1 - mov r1, r7 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _0233CD38 - add r0, r8, #1 - add r1, r7, #1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _0233CD38 - mov r0, r8 - add r1, r7, #1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - moveq r0, #0 - streq r0, [sp, #0xc] -_0233CD38: - add r0, r8, #1 - mov r1, r7 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _0233CD94 - sub fp, r7, #1 - add r0, r8, #1 - mov r1, fp - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _0233CD94 - mov r1, fp - mov r0, r8 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - moveq r0, #0 - streq r0, [sp, #0xc] -_0233CD94: - sub fp, r8, #1 - mov r0, fp - mov r1, r7 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _0233CDF0 - mov r0, fp - add r1, r7, #1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _0233CDF0 - mov r0, r8 - add r1, r7, #1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - moveq r0, #0 - streq r0, [sp, #0xc] -_0233CDF0: - mov r0, fp - mov r1, r7 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _0233CE4C - mov r0, fp - sub fp, r7, #1 - mov r1, fp - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _0233CE4C - mov r1, fp - mov r0, r8 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - moveq r0, #0 - streq r0, [sp, #0xc] -_0233CE4C: - ldr r0, [sp, #0xc] - cmp r0, #0 - beq _0233CE7C - mov r0, r8 - mov r1, r7 - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] -_0233CE7C: - add r0, r6, #2 - and r1, r0, #6 - mov r0, r1, lsl #2 - ldrsh r2, [r4, r0] - add r0, r4, r1, lsl #2 - ldrsh r1, [r0, #2] - add r0, r8, r2 - add r1, r7, r1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233CF64 - sub r0, r6, #2 - and r1, r0, #6 - mov r0, r1, lsl #2 - ldrsh r2, [r4, r0] - add r0, r4, r1, lsl #2 - ldrsh r1, [r0, #2] - add r0, r8, r2 - add r1, r7, r1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233CF64 - subs sb, sb, #1 - bne _0233CF48 - mov r0, #3 - bl DungeonRandInt - add sb, r0, #3 - mov r0, #0x64 - bl DungeonRandInt - cmp r0, #0x32 - addlt r6, r6, #2 - subge r6, r6, #2 - cmp r8, #0x20 - and r6, r6, #6 - blt _0233CF2C - ldr r0, _0233CF80 ; =FLOOR_GENERATION_STATUS - ldrb r0, [r0, #6] - cmp r0, #1 - cmpeq r6, #2 - beq _0233CF64 -_0233CF2C: - cmp r8, #0x30 - blt _0233CF48 - ldr r0, _0233CF80 ; =FLOOR_GENERATION_STATUS - ldrb r0, [r0, #6] - cmp r0, #2 - cmpeq r6, #2 - beq _0233CF64 -_0233CF48: - mov r0, r6, lsl #2 - ldrsh r1, [r4, r0] - add r0, r4, r6, lsl #2 - ldrsh r0, [r0, #2] - add r8, r8, r1 - add r7, r7, r0 - b _0233CC8C -_0233CF64: - add r5, r5, #1 -_0233CF68: - cmp r5, sl - blt _0233CA0C -_0233CF70: - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233CF78: .word 0x000001C2 -_0233CF7C: .word DIRECTIONS_XY -_0233CF80: .word FLOOR_GENERATION_STATUS - arm_func_end GenerateExtraHallways - - arm_func_start GetGridPositions -GetGridPositions: ; 0x0233CF84 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov r4, #0 - mov sl, r0 - mov sb, r1 - mov r8, r2 - mov r7, r3 - mov r6, r4 - mov r5, #0x38 - b _0233CFC0 -_0233CFA8: - mov r0, r5 - mov r1, r8 - str r4, [sl, r6, lsl #2] - bl _s32_div_f - add r4, r4, r0 - add r6, r6, #1 -_0233CFC0: - cmp r6, r8 - blt _0233CFA8 - mov r6, #0 - str r4, [sl, r8, lsl #2] - mov r5, r6 - mov r4, #0x20 - b _0233CFF4 -_0233CFDC: - mov r0, r4 - mov r1, r7 - str r6, [sb, r5, lsl #2] - bl _s32_div_f - add r6, r6, r0 - add r5, r5, #1 -_0233CFF4: - cmp r5, r7 - blt _0233CFDC - str r6, [sb, r7, lsl #2] - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end GetGridPositions - - arm_func_start InitDungeonGrid -InitDungeonGrid: ; 0x0233D004 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - add r5, r1, r1, lsl #1 - mov r4, r5, asr #1 - add r3, r1, r1, lsr #31 - add ip, r5, r4, lsr #30 - mov r7, #0 - b _0233D0F0 -_0233D020: - ldr r4, _0233D0FC ; =0x000001C2 - mov r8, #0 - mla sb, r7, r4, r0 - mov r5, #1 - mov r4, r8 - mov r6, r5 - mov lr, r8 - b _0233D0E4 -_0233D040: - ldr sl, _0233D100 ; =FLOOR_GENERATION_STATUS - ldrb sl, [sl, #6] - cmp sl, #1 - bne _0233D064 - cmp r7, r3, asr #1 - movge sl, #0x1e - mlage sl, r8, sl, sb - strgeb r6, [sl, #8] - bge _0233D08C -_0233D064: - cmp sl, #2 - bne _0233D080 - cmp r7, ip, asr #2 - movge sl, #0x1e - mlage sl, r8, sl, sb - strgeb r5, [sl, #8] - bge _0233D08C -_0233D080: - mov sl, #0x1e - mla sl, r8, sl, sb - strb r4, [sl, #8] -_0233D08C: - mov fp, #1 - strb fp, [sl, #0xa] - strb lr, [sl, #0xb] - strb lr, [sl, #0xf] - and fp, lr, #0xff - strb fp, [sl, #0xe] - strb fp, [sl, #0xc] - strb lr, [sl, #0x16] - strb fp, [sl, #0x15] - strb fp, [sl, #0x14] - strb fp, [sl, #0x13] - strb lr, [sl, #0x1a] - strb fp, [sl, #0x19] - strb fp, [sl, #0x18] - strb fp, [sl, #0x17] - strb lr, [sl, #9] - strb lr, [sl, #0x11] - strb lr, [sl, #0x10] - strb lr, [sl, #0x12] - strb lr, [sl, #0x1c] - strb lr, [sl, #0x1d] - add r8, r8, #1 -_0233D0E4: - cmp r8, r2 - blt _0233D040 - add r7, r7, #1 -_0233D0F0: - cmp r7, r1 - blt _0233D020 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233D0FC: .word 0x000001C2 -_0233D100: .word FLOOR_GENERATION_STATUS - arm_func_end InitDungeonGrid - - arm_func_start AssignRooms -AssignRooms: ; 0x0233D104 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x104 - mov sl, r0 - mov r4, r3 - mov r0, #3 - mov sb, r1 - mov r8, r2 - bl DungeonRandInt - cmp r4, #0 - rsblt r4, r4, #0 - addge r4, r4, r0 - mov r2, #0 - mov r1, #1 - add r0, sp, #4 - b _0233D148 -_0233D140: - strb r1, [r0, r2] - add r2, r2, #1 -_0233D148: - cmp r2, r4 - blt _0233D140 - mov r1, #0 - add r0, sp, #4 - b _0233D164 -_0233D15C: - strb r1, [r0, r2] - add r2, r2, #1 -_0233D164: - cmp r2, #0x100 - blt _0233D15C - mul r7, sb, r8 - mov r6, #0 - add r4, sp, #4 -_0233D178: - mov r0, r7 - bl DungeonRandInt - mov r5, r0 - mov r0, r7 - bl DungeonRandInt - add r6, r6, #1 - ldrb r2, [r4, r5] - ldrb r1, [r4, r0] - cmp r6, #0x40 - strb r1, [r4, r5] - strb r2, [r4, r0] - blt _0233D178 - ldr r0, _0233D310 ; =FLOOR_GENERATION_STATUS - mov fp, #0 - sub r1, sb, #1 - str fp, [r0, #0x14] - mov r3, fp - and r5, sb, #1 - add r0, r1, r1, lsr #31 - mov r2, fp - add lr, sp, #4 - b _0233D25C -_0233D1D0: - ldr r1, _0233D314 ; =0x000001C2 - mov r4, #0 - mla r6, r3, r1, sl - ldr r1, _0233D310 ; =FLOOR_GENERATION_STATUS - b _0233D250 -_0233D1E4: - mov r7, #0x1e - mla r7, r4, r7, r6 - ldrb ip, [r7, #8] - cmp ip, #0 - bne _0233D24C - ldr ip, [r1, #0x14] - cmp ip, #0x20 - strgeb r2, [r7, #0xa] - ldrb ip, [lr, fp] - cmp ip, #0 - beq _0233D240 - mov ip, #1 - strb ip, [r7, #0xa] - ldr ip, [r1, #0x14] - cmp r5, #0 - add ip, ip, #1 - str ip, [r1, #0x14] - beq _0233D248 - cmp r3, r0, asr #1 - cmpeq r4, #1 - moveq ip, #0 - streqb ip, [r7, #0xa] - b _0233D248 -_0233D240: - mov ip, #0 - strb ip, [r7, #0xa] -_0233D248: - add fp, fp, #1 -_0233D24C: - add r4, r4, #1 -_0233D250: - cmp r4, r8 - blt _0233D1E4 - add r3, r3, #1 -_0233D25C: - cmp r3, sb - blt _0233D1D0 - ldr r0, _0233D310 ; =FLOOR_GENERATION_STATUS - ldr r0, [r0, #0x14] - cmp r0, #2 - bge _0233D308 - mov r4, #0 - b _0233D2F4 -_0233D27C: - mov r0, #0 - str r0, [sp] - mov r6, r0 - b _0233D2DC -_0233D28C: - ldr r0, _0233D314 ; =0x000001C2 - mov r7, #0 - mla fp, r6, r0, sl - b _0233D2D0 -_0233D29C: - mov r0, #0x1e - mla r5, r7, r0, fp - ldrb r0, [r5, #8] - cmp r0, #0 - bne _0233D2CC - mov r0, #0x64 - bl DungeonRandInt - cmp r0, #0x3c - movlt r0, #1 - strlt r0, [sp] - strltb r0, [r5, #0xa] - blt _0233D2E4 -_0233D2CC: - add r7, r7, #1 -_0233D2D0: - cmp r7, r8 - blt _0233D29C - add r6, r6, #1 -_0233D2DC: - cmp r6, sb - blt _0233D28C -_0233D2E4: - ldr r0, [sp] - cmp r0, #0 - bne _0233D2FC - add r4, r4, #1 -_0233D2F4: - cmp r4, #0xc8 - blt _0233D27C -_0233D2FC: - ldr r0, _0233D310 ; =FLOOR_GENERATION_STATUS - mov r1, #0 - strb r1, [r0] -_0233D308: - add sp, sp, #0x104 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233D310: .word FLOOR_GENERATION_STATUS -_0233D314: .word 0x000001C2 - arm_func_end AssignRooms - - arm_func_start CreateRoomsAndAnchors -CreateRoomsAndAnchors: ; 0x0233D318 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x30 - ldr r5, [sp, #0x5c] - str r0, [sp] - and r0, r5, #4 - str r0, [sp, #0x14] - ldr r0, [sp, #0x58] - mov r4, #0 - str r4, [sp, #0x1c] - str r1, [sp, #4] - str r2, [sp, #8] - str r3, [sp, #0xc] - str r0, [sp, #0x58] - b _0233D658 -_0233D350: - ldr r0, [sp] - mov r1, #0x1e - mla sb, r4, r1, r0 - ldr r0, [sp, #4] - mov sl, #0 - sub r0, r0, #1 - str r0, [sp, #0x28] - ldr r0, [sp, #8] - sub r0, r0, #1 - str r0, [sp, #0x2c] - ldr r0, [sp, #0x58] - add r0, r0, r4, lsl #2 - str r0, [sp, #0x20] - b _0233D648 -_0233D388: - ldr r0, [sp, #0xc] - ldr r3, [r0, sl, lsl #2] - ldr r0, [sp, #0x58] - add fp, r3, #2 - ldr r2, [r0, r4, lsl #2] - add r0, r2, #2 - str r0, [sp, #0x18] - ldr r0, [sp, #0xc] - add r0, r0, sl, lsl #2 - ldr r1, [r0, #4] - ldr r0, [sp, #0x20] - sub r1, r1, r3 - ldr r0, [r0, #4] - sub r5, r1, #4 - sub r0, r0, r2 - sub r6, r0, #3 - ldr r0, _0233D66C ; =0x000001C2 - mla r0, sl, r0, sb - str r0, [sp, #0x10] - ldrb r0, [r0, #8] - cmp r0, #0 - bne _0233D644 - ldr r0, [sp, #0x10] - ldrb r0, [r0, #0xa] - cmp r0, #0 - beq _0233D580 - mov r0, #5 - mov r1, r5 - bl DungeonRandRange - mov r7, r0 - mov r0, #4 - mov r1, r6 - bl DungeonRandRange - mov r8, r0 - orr r0, r7, #1 - cmp r0, r5 - movlt r7, r0 - orr r0, r8, #1 - cmp r0, r6 - movlt r8, r0 - add r0, r8, r8, lsl #1 - add r0, r0, r0, lsr #31 - cmp r7, r0, asr #1 - mov r0, r0, asr #1 - movgt r7, r0 - add r0, r7, r7, lsl #1 - add r0, r0, r0, lsr #31 - cmp r8, r0, asr #1 - mov r0, r0, asr #1 - movgt r8, r0 - sub r0, r5, r7 - bl DungeonRandInt - add r5, fp, r0 - sub r0, r6, r8 - bl DungeonRandInt - ldr r1, [sp, #0x18] - add fp, r5, r7 - add r6, r1, r0 - ldr r0, _0233D66C ; =0x000001C2 - add r7, r6, r8 - mul r0, sl, r0 - strh r5, [sb, r0] - add r0, sb, r0 - strh fp, [r0, #4] - strh r6, [r0, #2] - strh r7, [r0, #6] - ldr r0, [sp, #0x1c] - and r0, r0, #0xff - str r0, [sp, #0x24] - b _0233D4F0 -_0233D4A0: - mov r8, r6 - b _0233D4E4 -_0233D4A8: - mov r0, r5 - mov r1, r8 - bl GetTileSafe - ldrh r2, [r0] - mov r1, r8 - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #1 - strh r2, [r0] - mov r0, r5 - bl GetTileSafe - ldr r1, [sp, #0x24] - add r8, r8, #1 - strb r1, [r0, #7] -_0233D4E4: - cmp r8, r7 - blt _0233D4A8 - add r5, r5, #1 -_0233D4F0: - cmp r5, fp - blt _0233D4A0 - mov r5, #1 - mov r0, #0x64 - bl DungeonRandInt - cmp r0, #0x50 - movlt r0, r5 - movge r0, #0 - and r6, r0, #0xff - ldr r0, _0233D670 ; =FLOOR_GENERATION_STATUS - ldr r0, [r0, #0x18] - cmp r0, #0 - ldr r0, [sp, #0x14] - moveq r6, #0 - cmp r0, #0 - moveq r5, #0 - cmp r5, #0 - cmpne r6, #0 - beq _0233D550 - mov r0, #0x64 - bl DungeonRandInt - cmp r0, #0x32 - movlt r5, #0 - movge r6, #0 -_0233D550: - cmp r5, #0 - ldrne r0, [sp, #0x10] - movne r1, #1 - strneb r1, [r0, #0x1c] - cmp r6, #0 - ldrne r0, [sp, #0x10] - movne r1, #1 - strneb r1, [r0, #0x1d] - ldr r0, [sp, #0x1c] - add r0, r0, #1 - str r0, [sp, #0x1c] - b _0233D644 -_0233D580: - mov r2, #2 - ldr r0, [sp, #0x28] - mov r8, r2 - cmp sl, #0 - moveq r2, #1 - cmp r4, #0 - moveq r8, #1 - cmp sl, r0 - mov r1, #4 - mov r7, r1 - ldr r0, [sp, #0x2c] - moveq r1, #2 - cmp r4, r0 - add r0, fp, r2 - add r2, fp, r5 - sub r1, r2, r1 - moveq r7, #2 - bl DungeonRandRange - ldr r1, [sp, #0x18] - add r1, r1, r6 - mov r6, r0 - ldr r0, [sp, #0x18] - sub r1, r1, r7 - add r0, r0, r8 - bl DungeonRandRange - mov r5, r0 - ldr r0, _0233D66C ; =0x000001C2 - mul r0, sl, r0 - strh r6, [sb, r0] - add r1, sb, r0 - add r0, r6, #1 - strh r0, [r1, #4] - strh r5, [r1, #2] - add r0, r5, #1 - strh r0, [r1, #6] - mov r0, r6 - mov r1, r5 - bl GetTileSafe - ldrh r2, [r0] - mov r1, r5 - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #1 - strh r2, [r0] - mov r0, r6 - bl GetTileSafe - mov r1, #0xfe - strb r1, [r0, #7] -_0233D644: - add sl, sl, #1 -_0233D648: - ldr r0, [sp, #4] - cmp sl, r0 - blt _0233D388 - add r4, r4, #1 -_0233D658: - ldr r0, [sp, #8] - cmp r4, r0 - blt _0233D350 - add sp, sp, #0x30 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233D66C: .word 0x000001C2 -_0233D670: .word FLOOR_GENERATION_STATUS - arm_func_end CreateRoomsAndAnchors - - arm_func_start GenerateSecondaryStructures -GenerateSecondaryStructures: ; 0x0233D674 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x2c - mov sl, r0 - mov r0, #0 - str r1, [sp] - str r2, [sp, #4] - str r0, [sp, #0x20] - b _0233E03C -_0233D694: - ldr r0, [sp, #0x20] - mov r1, #0x1e - mul r7, r0, r1 - mov r0, #0 - add r6, sl, r7 - str r0, [sp, #0x24] - b _0233E020 -_0233D6B0: - ldr r1, [sp, #0x24] - ldr r0, _0233E054 ; =0x000001C2 - mul sb, r1, r0 - add r8, r6, sb - ldrb r0, [r8, #8] - cmp r0, #0 - ldreqb r0, [r8, #0xe] - cmpeq r0, #0 - ldreqb r0, [r8, #0x12] - cmpeq r0, #0 - bne _0233E014 - ldrb r0, [r8, #0xa] - cmp r0, #0 - beq _0233E014 - ldrb r0, [r8, #0x1c] - cmp r0, #0 - bne _0233E014 - ldrb r0, [r8, #0x1d] - cmp r0, #0 - beq _0233E014 - mov r0, #6 - bl DungeonRandInt - cmp r0, #5 - addls pc, pc, r0, lsl #2 - b _0233E014 -_0233D714: ; jump table - b _0233E014 ; case 0 - b _0233DE94 ; case 1 - b _0233DDC8 ; case 2 - b _0233DC9C ; case 3 - b _0233D938 ; case 4 - b _0233D72C ; case 5 -_0233D72C: - ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS - ldr r0, [r0, #0x18] - cmp r0, #0 - beq _0233E014 - sub r1, r0, #1 - ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS - str r1, [r0, #0x18] - add r0, sl, sb - add r0, r0, r7 - bl SetSpawnFlag5 - mov r0, #2 - bl DungeonRandInt - cmp r0, #0 - mov r0, #0 - beq _0233D850 - str r0, [sp, #0x10] - mov r4, r8 - ldrsh r1, [r6, sb] - ldrsh r0, [r4, #4] - ldrsh r5, [r4, #2] - add r0, r1, r0 - add r0, r0, r0, lsr #31 - mov fp, r0, asr #1 - b _0233D7AC -_0233D78C: - mov r0, fp - mov r1, r5 - bl IsNextToHallway - cmp r0, #0 - movne r0, #1 - strne r0, [sp, #0x10] - bne _0233D7B8 - add r5, r5, #1 -_0233D7AC: - ldrsh r0, [r4, #6] - cmp r5, r0 - blt _0233D78C -_0233D7B8: - ldr r0, [sp, #0x10] - cmp r0, #0 - bne _0233E014 - ldrsh r5, [r4, #2] - b _0233D7F4 -_0233D7CC: - mov r0, fp - mov r1, r5 - bl GetTileSafe - ldrh r1, [r0] - add r5, r5, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #2 - strh r1, [r0] -_0233D7F4: - ldrsh r0, [r4, #6] - cmp r5, r0 - blt _0233D7CC - ldrsh sb, [r4] - b _0233D83C -_0233D808: - ldrsh r5, [r4, #2] - b _0233D82C -_0233D810: - mov r0, sb - mov r1, r5 - bl GetTileSafe - ldrh r1, [r0] - add r5, r5, #1 - orr r1, r1, #0x80 - strh r1, [r0] -_0233D82C: - ldrsh r0, [r4, #6] - cmp r5, r0 - blt _0233D810 - add sb, sb, #1 -_0233D83C: - cmp sb, fp - blt _0233D808 - mov r0, #1 - strb r0, [r8, #9] - b _0233E014 -_0233D850: - str r0, [sp, #0x14] - mov r4, r8 - ldrsh r1, [r4, #2] - ldrsh r0, [r4, #6] - ldrsh r5, [r6, sb] - add r0, r1, r0 - add r0, r0, r0, lsr #31 - mov fp, r0, asr #1 - b _0233D894 -_0233D874: - mov r0, r5 - mov r1, fp - bl IsNextToHallway - cmp r0, #0 - movne r0, #1 - strne r0, [sp, #0x14] - bne _0233D8A0 - add r5, r5, #1 -_0233D894: - ldrsh r0, [r4, #4] - cmp r5, r0 - blt _0233D874 -_0233D8A0: - ldr r0, [sp, #0x14] - cmp r0, #0 - bne _0233E014 - ldrsh r5, [r4] - b _0233D8DC -_0233D8B4: - mov r0, r5 - mov r1, fp - bl GetTileSafe - ldrh r1, [r0] - add r5, r5, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #2 - strh r1, [r0] -_0233D8DC: - ldrsh r0, [r4, #4] - cmp r5, r0 - blt _0233D8B4 - ldrsh sb, [r4, #2] - b _0233D924 -_0233D8F0: - ldrsh r5, [r4] - b _0233D914 -_0233D8F8: - mov r0, r5 - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - add r5, r5, #1 - orr r1, r1, #0x80 - strh r1, [r0] -_0233D914: - ldrsh r0, [r4, #4] - cmp r5, r0 - blt _0233D8F8 - add sb, sb, #1 -_0233D924: - cmp sb, fp - blt _0233D8F0 - mov r0, #1 - strb r0, [r8, #9] - b _0233E014 -_0233D938: - mov r1, r8 - ldrsh r4, [r6, sb] - ldrsh r3, [r1, #4] - sub r0, r3, r4 - cmp r0, #6 - ldrgesh r2, [r1, #2] - ldrgesh r1, [r1, #6] - subge r0, r1, r2 - cmpge r0, #6 - blt _0233E014 - add r0, r4, r3 - add r0, r0, r0, lsr #31 - mov r5, r0, asr #1 - ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS - add r1, r2, r1 - ldr r0, [r0, #0x18] - add r1, r1, r1, lsr #31 - mov r4, r1, asr #1 - cmp r0, #0 - beq _0233E014 - sub r1, r0, #1 - ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS - str r1, [r0, #0x18] - add r0, sl, sb - add r0, r0, r7 - bl SetSpawnFlag5 - sub r0, r4, #2 - str r0, [sp, #0xc] - sub r0, r5, #2 - ldr r1, [sp, #0xc] - str r0, [sp, #8] - bl GetTileSafe - ldrh r2, [r0] - sub fp, r5, #1 - ldr r1, [sp, #0xc] - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #6 - strh r2, [r0] - mov r0, fp - bl GetTileSafe - ldrh r2, [r0] - ldr r1, [sp, #0xc] - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #6 - strh r2, [r0] - mov r0, r5 - bl GetTileSafe - ldrh r2, [r0] - ldr r1, [sp, #0xc] - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #6 - strh r2, [r0] - add r0, r5, #1 - bl GetTileSafe - ldrh r1, [r0] - sub sb, r4, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #6 - strh r1, [r0] - ldr r0, [sp, #8] - mov r1, sb - bl GetTileSafe - ldrh r2, [r0] - mov r1, r4 - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #6 - strh r2, [r0] - ldr r0, [sp, #8] - bl GetTileSafe - ldrh r2, [r0] - add r1, r4, #1 - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #6 - strh r2, [r0] - ldr r0, [sp, #8] - bl GetTileSafe - ldrh r2, [r0] - add r1, r4, #1 - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #6 - strh r2, [r0] - ldr r0, [sp, #8] - bl GetTileSafe - ldrh r2, [r0] - add r1, r4, #1 - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #6 - strh r2, [r0] - mov r0, fp - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #2 - strh r1, [r0] - ldrh r2, [r0] - add r1, r4, #1 - orr r2, r2, #4 - strh r2, [r0] - mov r0, r5 - bl GetTileSafe - ldrh r2, [r0] - ldr r1, [sp, #0xc] - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #6 - strh r2, [r0] - add r0, r5, #1 - bl GetTileSafe - ldrh r2, [r0] - mov r1, sb - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #6 - strh r2, [r0] - add r0, r5, #1 - bl GetTileSafe - ldrh r2, [r0] - mov r1, r4 - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #6 - strh r2, [r0] - add r0, r5, #1 - bl GetTileSafe - ldrh r2, [r0] - add r1, r4, #1 - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #6 - strh r2, [r0] - add r0, r5, #1 - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r2, [r0] - mov r1, sb - orr r2, r2, #6 - strh r2, [r0] - mov r0, fp - bl GetTileSafe - ldrh r2, [r0, #2] - mov r1, sb - orr r2, r2, #4 - strh r2, [r0, #2] - mov r0, fp - bl GetTileSafe - ldrh r2, [r0, #2] - mov r1, sb - orr r2, r2, #0x40 - strh r2, [r0, #2] - mov r0, r5 - bl GetTileSafe - ldrh r2, [r0, #2] - mov r1, r4 - orr r2, r2, #2 - strh r2, [r0, #2] - mov r0, fp - bl GetTileSafe - ldrh r2, [r0, #2] - mov r1, r4 - orr r2, r2, #2 - strh r2, [r0, #2] - mov r0, r5 - bl GetTileSafe - ldrh r2, [r0, #2] - mov r1, sb - orr r2, r2, #2 - strh r2, [r0, #2] - mov r0, fp - bl GetTileSafe - ldrh r2, [r0, #2] - mov r1, sb - orr r2, r2, #0x10 - strh r2, [r0, #2] - mov r0, r5 - bl GetTileSafe - ldrh r2, [r0, #2] - mov r1, r4 - orr r2, r2, #0x10 - strh r2, [r0, #2] - mov r0, fp - bl GetTileSafe - ldrh r2, [r0, #2] - mov r1, r4 - orr r2, r2, #0x10 - strh r2, [r0, #2] - mov r0, r5 - bl GetTileSafe - ldrh r1, [r0, #2] - orr r1, r1, #0x10 - strh r1, [r0, #2] - mov r0, #1 - strb r0, [r8, #9] - b _0233E014 -_0233DC9C: - mov r4, r8 - ldrsh r3, [r6, sb] - ldrsh r2, [r4, #4] - sub r0, r2, r3 - cmp r0, #5 - ldrgesh r1, [r4, #6] - ldrgesh r0, [r4, #2] - subge r0, r1, r0 - cmpge r0, #5 - blt _0233E014 - add r0, r3, #2 - sub r1, r2, #3 - bl DungeonRandRange - ldrsh r1, [r4, #6] - str r0, [sp, #0x28] - mov r5, r0 - ldrsh r0, [r4, #2] - sub r1, r1, #3 - add r0, r0, #2 - bl DungeonRandRange - str r0, [sp, #0x18] - ldrsh r0, [r4] - ldrsh r1, [r4, #4] - add r0, r0, #2 - sub r1, r1, #3 - bl DungeonRandRange - str r0, [sp, #0x1c] - ldrsh r0, [r4, #2] - ldrsh r1, [r4, #6] - add r0, r0, #2 - sub r1, r1, #3 - bl DungeonRandRange - mov fp, r0 - ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS - ldr r0, [r0, #0x18] - cmp r0, #0 - beq _0233E014 - sub r1, r0, #1 - ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS - str r1, [r0, #0x18] - add r0, sl, sb - add r0, r0, r7 - bl SetSpawnFlag5 - ldr r1, [sp, #0x28] - ldr r0, [sp, #0x1c] - cmp r1, r0 - movgt r5, r0 - movgt r0, r1 - strgt r0, [sp, #0x1c] - ldr r0, [sp, #0x18] - cmp r0, fp - strgt fp, [sp, #0x18] - movgt fp, r0 - b _0233DDB0 -_0233DD74: - ldr r4, [sp, #0x18] - b _0233DDA4 -_0233DD7C: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0] - add r4, r4, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #2 - strh r1, [r0] -_0233DDA4: - cmp r4, fp - ble _0233DD7C - add r5, r5, #1 -_0233DDB0: - ldr r0, [sp, #0x1c] - cmp r5, r0 - ble _0233DD74 - mov r0, #1 - strb r0, [r8, #9] - b _0233E014 -_0233DDC8: - mov r2, r8 - ldrsh r1, [r2, #4] - ldrsh r0, [r6, sb] - sub r0, r1, r0 - tst r0, #1 - beq _0233E014 - ldrsh r1, [r2, #6] - ldrsh r0, [r2, #2] - sub r0, r1, r0 - tst r0, #1 - ldrne r0, _0233E058 ; =FLOOR_GENERATION_STATUS - ldrne r0, [r0, #0x18] - cmpne r0, #0 - beq _0233E014 - sub r1, r0, #1 - ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS - str r1, [r0, #0x18] - add r0, sl, sb - add r0, r0, r7 - bl SetSpawnFlag5 - mov r5, #0 -_0233DE1C: - ldrsh r1, [r8, #4] - ldrsh r0, [r8] - sub r0, r1, r0 - bl DungeonRandInt - mov r4, r0 - ldrsh r1, [r8, #6] - ldrsh r0, [r8, #2] - sub r0, r1, r0 - bl DungeonRandInt - mov r2, r0 - add r0, r4, r2 - tst r0, #1 - beq _0233DE7C - ldrsh r0, [r8] - ldrsh r1, [r8, #2] - add r0, r0, r4 - add r1, r1, r2 - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #2 - strh r1, [r0] -_0233DE7C: - add r5, r5, #1 - cmp r5, #0x40 - blt _0233DE1C - mov r0, #1 - strb r0, [r8, #9] - b _0233E014 -_0233DE94: - ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS - ldr r0, [r0, #0x18] - cmp r0, #0 - beq _0233E014 - sub r1, r0, #1 - ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS - str r1, [r0, #0x18] - mov r0, r8 - ldrsh r2, [r0, #4] - ldrsh r1, [r6, sb] - sub r3, r2, r1 - tst r3, #1 - beq _0233DEDC - ldrsh r2, [r0, #6] - ldrsh r1, [r0, #2] - sub r1, r2, r1 - tst r1, #1 - bne _0233DFF4 -_0233DEDC: - cmp r3, #5 - ldrsh r4, [r0] - ldrsh r3, [r0, #4] - ldrsh r2, [r0, #6] - ldrsh r1, [r0, #2] - add r0, r4, r3 - add r0, r0, r0, lsr #31 - mov r4, r0, asr #1 - add r0, r1, r2 - add r0, r0, r0, lsr #31 - mov r5, r0, asr #1 - subge r0, r2, r1 - cmpge r0, #5 - blt _0233DFCC - add r0, r4, #1 - mov r1, r5 - bl GetTileSafe - ldrh r2, [r0] - add r1, r5, #1 - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #2 - strh r2, [r0] - mov r0, r4 - bl GetTileSafe - ldrh r2, [r0] - mov r1, r5 - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #2 - strh r2, [r0] - sub r0, r4, #1 - bl GetTileSafe - ldrh r2, [r0] - sub r1, r5, #1 - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #2 - strh r2, [r0] - mov r0, r4 - bl GetTileSafe - mov r1, r5 - ldrh r2, [r0] - bic r2, r2, #3 - strh r2, [r0] - ldrh r2, [r0] - orr r2, r2, #2 - strh r2, [r0] - mov r0, r4 - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #2 - strh r1, [r0] - b _0233E00C -_0233DFCC: - mov r0, r4 - mov r1, r5 - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #2 - strh r1, [r0] - b _0233E00C -_0233DFF4: - add r4, sl, sb - add r0, r4, r7 - bl SetSpawnFlag5 - add r0, r4, r7 - mov r1, #1 - bl GenerateMaze -_0233E00C: - mov r0, #1 - strb r0, [r8, #9] -_0233E014: - ldr r0, [sp, #0x24] - add r0, r0, #1 - str r0, [sp, #0x24] -_0233E020: - ldr r1, [sp, #0x24] - ldr r0, [sp] - cmp r1, r0 - blt _0233D6B0 - ldr r0, [sp, #0x20] - add r0, r0, #1 - str r0, [sp, #0x20] -_0233E03C: - ldr r1, [sp, #0x20] - ldr r0, [sp, #4] - cmp r1, r0 - blt _0233D694 - add sp, sp, #0x2c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233E054: .word 0x000001C2 -_0233E058: .word FLOOR_GENERATION_STATUS - arm_func_end GenerateSecondaryStructures - - arm_func_start AssignGridCellConnections -AssignGridCellConnections: ; 0x0233E05C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x10 - ldr r4, [sp, #0x3c] - mov r8, r1 - mov r1, r4 - ldrb r1, [r1, #5] - mov sb, r0 - mov r0, #4 - str r4, [sp, #0x3c] - mov fp, r2 - mov r7, r3 - ldr r5, [sp, #0x38] - str r1, [sp, #4] - bl DungeonRandInt - mov r6, r0 - mov sl, #0 - b _0233E208 -_0233E0A0: - mov r0, #8 - bl DungeonRandInt - mov r4, r0 - mov r0, #4 - bl DungeonRandInt - mov lr, #1 - cmp r4, #4 - movlt r6, r0 - sub r1, r8, #1 - sub r0, fp, #1 - mov ip, lr - mov r3, #0 -_0233E0D0: - and r2, r6, #3 - mov r4, r3 - cmp r2, #3 - addls pc, pc, r2, lsl #2 - b _0233E130 -_0233E0E4: ; jump table - b _0233E0F4 ; case 0 - b _0233E104 ; case 1 - b _0233E114 ; case 2 - b _0233E124 ; case 3 -_0233E0F4: - cmp r7, r1 - movlt r4, ip - addge r6, r6, #1 - b _0233E130 -_0233E104: - cmp r5, #0 - movgt r4, lr - addle r6, r6, #1 - b _0233E130 -_0233E114: - cmp r7, #0 - movgt r4, #1 - addle r6, r6, #1 - b _0233E130 -_0233E124: - cmp r5, r0 - movlt r4, #1 - addge r6, r6, #1 -_0233E130: - cmp r4, #0 - beq _0233E0D0 - and r0, r6, #3 - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0233E204 -_0233E148: ; jump table - b _0233E158 ; case 0 - b _0233E184 ; case 1 - b _0233E1B0 ; case 2 - b _0233E1DC ; case 3 -_0233E158: - ldr r0, _0233E438 ; =0x000001C2 - mov r1, #0x1e - mla r0, r7, r0, sb - mla r1, r5, r1, r0 - ldrb r0, [r1, #0x1ca] - cmp r0, #0 - moveq r0, #1 - streqb r0, [r1, #0x16] - streqb r0, [r1, #0x1d7] - addeq r7, r7, #1 - b _0233E204 -_0233E184: - ldr r0, _0233E438 ; =0x000001C2 - mov r1, #0x1e - mla r0, r7, r0, sb - mla r1, r5, r1, r0 - ldrb r0, [r1, #-0x16] - cmp r0, #0 - moveq r0, #1 - streqb r0, [r1, #0x13] - streqb r0, [r1, #-0xa] - subeq r5, r5, #1 - b _0233E204 -_0233E1B0: - ldr r0, _0233E438 ; =0x000001C2 - mov r1, #0x1e - mla r0, r7, r0, sb - mla r1, r5, r1, r0 - ldrb r0, [r1, #-0x1ba] - cmp r0, #0 - moveq r0, #1 - streqb r0, [r1, #0x15] - streqb r0, [r1, #-0x1ac] - subeq r7, r7, #1 - b _0233E204 -_0233E1DC: - ldr r0, _0233E438 ; =0x000001C2 - mov r1, #0x1e - mla r0, r7, r0, sb - mla r1, r5, r1, r0 - ldrb r0, [r1, #0x26] - cmp r0, #0 - moveq r0, #1 - streqb r0, [r1, #0x14] - streqb r0, [r1, #0x31] - addeq r5, r5, #1 -_0233E204: - add sl, sl, #1 -_0233E208: - ldr r0, [sp, #4] - cmp sl, r0 - blt _0233E0A0 - ldr r0, [sp, #0x3c] - ldrb r0, [r0, #0xb] - cmp r0, #0 - bne _0233E430 -_0233E224: - sub r0, r8, #1 - mov r6, #0 - str r0, [sp, #8] - sub r0, fp, #1 - str r6, [sp] - str r0, [sp, #0xc] - b _0233E41C -_0233E240: - ldr r0, _0233E438 ; =0x000001C2 - mov r7, #0 - mla sl, r6, r0, sb - b _0233E410 -_0233E250: - mov r1, #0x1e - mla r5, r7, r1, sl - ldrb r1, [r5, #8] - mov r0, #0 - cmp r1, #0 - ldreqb r1, [r5, #0xa] - cmpeq r1, #0 - bne _0233E40C - ldrb r1, [r5, #0x13] - cmp r1, #0 - ldrb r1, [r5, #0x14] - addne r0, r0, #1 - cmp r1, #0 - ldrb r1, [r5, #0x15] - addne r0, r0, #1 - cmp r1, #0 - ldrb r1, [r5, #0x16] - addne r0, r0, #1 - cmp r1, #0 - addne r0, r0, #1 - cmp r0, #1 - bne _0233E40C - mov r4, #0 - mov r0, #4 - bl DungeonRandInt - mov r1, r4 - b _0233E370 -_0233E2BC: - and r2, r0, #3 - mov r4, #0 - cmp r2, #3 - addls pc, pc, r2, lsl #2 - b _0233E364 -_0233E2D0: ; jump table - b _0233E2E0 ; case 0 - b _0233E304 ; case 1 - b _0233E324 ; case 2 - b _0233E344 ; case 3 -_0233E2E0: - ldr r2, [sp, #8] - cmp r6, r2 - bge _0233E2FC - ldrb r2, [r5, #0x16] - cmp r2, #0 - moveq r4, #1 - beq _0233E364 -_0233E2FC: - add r0, r0, #1 - b _0233E364 -_0233E304: - cmp r7, #0 - ble _0233E31C - ldrb r2, [r5, #0x13] - cmp r2, #0 - moveq r4, #1 - beq _0233E364 -_0233E31C: - add r0, r0, #1 - b _0233E364 -_0233E324: - cmp r6, #0 - ble _0233E33C - ldrb r2, [r5, #0x15] - cmp r2, #0 - moveq r4, #1 - beq _0233E364 -_0233E33C: - add r0, r0, #1 - b _0233E364 -_0233E344: - ldr r2, [sp, #0xc] - cmp r7, r2 - bge _0233E360 - ldrb r2, [r5, #0x14] - cmp r2, #0 - moveq r4, #1 - beq _0233E364 -_0233E360: - add r0, r0, #1 -_0233E364: - cmp r4, #0 - bne _0233E378 - add r1, r1, #1 -_0233E370: - cmp r1, #8 - blt _0233E2BC -_0233E378: - cmp r4, #0 - beq _0233E40C - and r0, r0, #3 - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0233E40C -_0233E390: ; jump table - b _0233E3A0 ; case 0 - b _0233E3BC ; case 1 - b _0233E3D8 ; case 2 - b _0233E3F4 ; case 3 -_0233E3A0: - ldrb r0, [r5, #0x1ca] - cmp r0, #0 - moveq r0, #1 - streqb r0, [r5, #0x16] - streqb r0, [r5, #0x1d7] - streq r0, [sp] - b _0233E40C -_0233E3BC: - ldrb r0, [r5, #0x1ca] - cmp r0, #0 - moveq r0, #1 - streqb r0, [r5, #0x13] - streqb r0, [r5, #-0xa] - streq r0, [sp] - b _0233E40C -_0233E3D8: - ldrb r0, [r5, #0x1ca] - cmp r0, #0 - moveq r0, #1 - streqb r0, [r5, #0x15] - streqb r0, [r5, #-0x1ac] - streq r0, [sp] - b _0233E40C -_0233E3F4: - ldrb r0, [r5, #0x1ca] - cmp r0, #0 - moveq r0, #1 - streqb r0, [r5, #0x14] - streqb r0, [r5, #0x31] - streq r0, [sp] -_0233E40C: - add r7, r7, #1 -_0233E410: - cmp r7, fp - blt _0233E250 - add r6, r6, #1 -_0233E41C: - cmp r6, r8 - blt _0233E240 - ldr r0, [sp] - cmp r0, #0 - bne _0233E224 -_0233E430: - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233E438: .word 0x000001C2 - arm_func_end AssignGridCellConnections - - arm_func_start CreateGridCellConnections -CreateGridCellConnections: ; 0x0233E43C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x48 - str r0, [sp, #0xc] - str r1, [sp, #0x10] - str r2, [sp, #0x14] - mov sb, r3 - ldr r8, [sp, #0x70] - mov r5, #0 - b _0233E510 -_0233E460: - ldr r1, _0233ED30 ; =0x000001C2 - ldr r0, [sp, #0xc] - mov r6, #0 - mla r7, r5, r1, r0 - ldr r0, [sp, #0x10] - mov r3, r6 - sub r1, r0, #1 - ldr r0, [sp, #0x14] - mov r2, r6 - sub r0, r0, #1 - mov ip, r6 - mov lr, r6 - mov r4, r6 - b _0233E500 -_0233E498: - mov sl, #0x1e - mla sl, r6, sl, r7 - ldrb fp, [sl, #8] - cmp fp, #0 - strneb r4, [sl, #0x17] - strneb r4, [sl, #0x18] - strneb r4, [sl, #0x19] - strneb r4, [sl, #0x1a] - bne _0233E4FC - cmp r5, #0 - strleb r3, [sl, #0x15] - cmp r6, #0 - strleb r2, [sl, #0x13] - cmp r5, r1 - strgeb ip, [sl, #0x16] - cmp r6, r0 - strgeb lr, [sl, #0x14] - ldrb fp, [sl, #0x13] - strb fp, [sl, #0x17] - ldrb fp, [sl, #0x14] - strb fp, [sl, #0x18] - ldrb fp, [sl, #0x15] - strb fp, [sl, #0x19] - ldrb fp, [sl, #0x16] - strb fp, [sl, #0x1a] -_0233E4FC: - add r6, r6, #1 -_0233E500: - ldr sl, [sp, #0x14] - cmp r6, sl - blt _0233E498 - add r5, r5, #1 -_0233E510: - ldr r0, [sp, #0x10] - cmp r5, r0 - blt _0233E460 - mov r6, #0 - b _0233E800 -_0233E524: - ldr r1, _0233ED30 ; =0x000001C2 - ldr r0, [sp, #0xc] - mov r7, #0 - mla r4, r6, r1, r0 - add r0, sb, r6, lsl #2 - str r0, [sp, #0x2c] - b _0233E7F0 -_0233E540: - mov r0, #0x1e - mla r5, r7, r0, r4 - ldrb r0, [r5, #8] - cmp r0, #0 - bne _0233E7EC - ldrb r0, [r5, #0xa] - cmp r0, #0 - ldreqsh fp, [r5] - ldreqsh sl, [r5, #2] - beq _0233E598 - ldrsh r0, [r5] - ldrsh r1, [r5, #4] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - mov fp, r0 - ldrsh r0, [r5, #2] - ldrsh r1, [r5, #6] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - mov sl, r0 -_0233E598: - ldrb r0, [r5, #0x17] - cmp r0, #0 - beq _0233E624 - ldrb r0, [r5, #-0x16] - cmp r0, #0 - bne _0233E60C - ldrb r0, [r5, #-0x14] - cmp r0, #0 - ldreqsh r2, [r5, #-0x1e] - beq _0233E5D8 - ldrsh r0, [r5, #-0x1e] - ldrsh r1, [r5, #-0x1a] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - mov r2, r0 -_0233E5D8: - mov r0, #1 - str r0, [sp] - mov r0, #0x1e - mla r3, r7, r0, r4 - ldr r1, [sb, r6, lsl #2] - mov r0, fp - str r1, [sp, #4] - ldr r1, [r8, r7, lsl #2] - str r1, [sp, #8] - ldrsh r1, [r3, #2] - ldrsh r3, [r3, #-0x18] - sub r3, r3, #1 - bl CreateHallway -_0233E60C: - mov r0, #0 - strb r0, [r5, #0x17] - strb r0, [r5, #-6] - mov r0, #1 - strb r0, [r5, #0xb] - strb r0, [r5, #-0x13] -_0233E624: - ldrb r0, [r5, #0x18] - cmp r0, #0 - beq _0233E6B8 - ldrb r0, [r5, #0x26] - cmp r0, #0 - bne _0233E6A0 - ldrb r0, [r5, #0x28] - cmp r0, #0 - ldreqsh r2, [r5, #0x1e] - beq _0233E664 - ldrsh r0, [r5, #0x1e] - ldrsh r1, [r5, #0x22] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - mov r2, r0 -_0233E664: - mov r1, #1 - str r1, [sp] - mov r0, fp - mov r1, #0x1e - ldr fp, [sb, r6, lsl #2] - mla r1, r7, r1, r4 - add r3, r8, r7, lsl #2 - str fp, [sp, #4] - ldr r3, [r3, #4] - sub r3, r3, #1 - str r3, [sp, #8] - ldrsh fp, [r1, #6] - ldrsh r3, [r1, #0x20] - sub r1, fp, #1 - bl CreateHallway -_0233E6A0: - mov r0, #0 - strb r0, [r5, #0x18] - strb r0, [r5, #0x35] - mov r0, #1 - strb r0, [r5, #0xb] - strb r0, [r5, #0x29] -_0233E6B8: - ldrb r0, [r5, #0x19] - cmp r0, #0 - beq _0233E750 - ldrb r0, [r5, #-0x1ba] - cmp r0, #0 - bne _0233E738 - ldrb r0, [r5, #-0x1b8] - cmp r0, #0 - sub r0, r5, #0x100 - ldreqsh r3, [r0, #-0xc0] - beq _0233E6FC - ldrsh r1, [r0, #-0xbc] - ldrsh r2, [r0, #-0xc0] - sub r1, r1, #1 - add r0, r2, #1 - bl DungeonRandRange - mov r3, r0 -_0233E6FC: - mov r0, #0 - str r0, [sp] - mov r0, #0x1e - mul r0, r7, r0 - ldr fp, [sb, r6, lsl #2] - add r1, r4, r0 - str fp, [sp, #4] - ldr fp, [r8, r7, lsl #2] - sub r2, r1, #0x100 - str fp, [sp, #8] - ldrsh r2, [r2, #-0xc2] - ldrsh r0, [r4, r0] - mov r1, sl - sub r2, r2, #1 - bl CreateHallway -_0233E738: - mov r0, #0 - strb r0, [r5, #0x19] - strb r0, [r5, #-0x1a8] - mov r0, #1 - strb r0, [r5, #0xb] - strb r0, [r5, #-0x1b7] -_0233E750: - ldrb r0, [r5, #0x1a] - cmp r0, #0 - beq _0233E7EC - ldrb r0, [r5, #0x1ca] - cmp r0, #0 - bne _0233E7D4 - ldrb r0, [r5, #0x1cc] - cmp r0, #0 - add r0, r5, #0x100 - ldreqsh r3, [r0, #0xc4] - beq _0233E794 - ldrsh r1, [r0, #0xc8] - ldrsh r2, [r0, #0xc4] - sub r1, r1, #1 - add r0, r2, #1 - bl DungeonRandRange - mov r3, r0 -_0233E794: - mov r0, #0 - str r0, [sp] - mov r0, #0x1e - ldr r2, [sp, #0x2c] - mov r1, sl - ldr sl, [r2, #4] - mla r0, r7, r0, r4 - sub sl, sl, #1 - str sl, [sp, #4] - ldr sl, [r8, r7, lsl #2] - add r2, r0, #0x100 - str sl, [sp, #8] - ldrsh r0, [r0, #4] - ldrsh r2, [r2, #0xc2] - sub r0, r0, #1 - bl CreateHallway -_0233E7D4: - mov r0, #0 - strb r0, [r5, #0x1a] - strb r0, [r5, #0x1db] - mov r0, #1 - strb r0, [r5, #0xb] - strb r0, [r5, #0x1cd] -_0233E7EC: - add r7, r7, #1 -_0233E7F0: - ldr r0, [sp, #0x14] - cmp r7, r0 - blt _0233E540 - add r6, r6, #1 -_0233E800: - ldr r0, [sp, #0x10] - cmp r6, r0 - blt _0233E524 - ldrb r0, [sp, #0x74] - cmp r0, #0 - bne _0233ED28 - mov r7, #0 - b _0233ED1C -_0233E820: - ldr r1, _0233ED30 ; =0x000001C2 - ldr r0, [sp, #0xc] - mov r8, #0 - mla r0, r7, r1, r0 - str r0, [sp, #0x20] - ldr r0, [sp, #0x14] - sub r0, r0, #2 - str r0, [sp, #0x40] - ldr r0, [sp, #0x10] - sub r0, r0, #2 - str r0, [sp, #0x38] - b _0233ED0C -_0233E850: - mov r0, #0x64 - bl DungeonRandInt - cmp r0, #5 - bge _0233ED08 - ldr r0, [sp, #0x20] - mov r1, #0x1e - mla r6, r8, r1, r0 - ldrb r0, [r6, #8] - cmp r0, #0 - bne _0233ED08 - ldrb r0, [r6, #0xb] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #0x12] - cmp r0, #0 - ldreqb r0, [r6, #9] - cmpeq r0, #0 - bne _0233ED08 - ldrb r0, [r6, #0xa] - cmp r0, #0 - beq _0233ED08 - mov r0, #4 - bl DungeonRandInt - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0233ED08 -_0233E8B8: ; jump table - b _0233E8C8 ; case 0 - b _0233E9DC ; case 1 - b _0233EAE4 ; case 2 - b _0233EBFC ; case 3 -_0233E8C8: - cmp r7, #1 - blt _0233ED08 - ldrb r0, [r6, #-0x1b7] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #-0x1ba] - cmp r0, #0 - bne _0233ED08 - ldrb r0, [r6, #-0x1b8] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #-0x1b9] - cmp r0, #0 - ldreqb r0, [r6, #-0x1b0] - cmpeq r0, #0 - bne _0233ED08 - sub r1, r6, #0x100 - ldrsh r0, [r1, #-0xc2] - ldrsh fp, [r1, #-0xc0] - ldrsh r1, [r6, #2] - str r0, [sp, #0x28] - sub r0, r6, #0x100 - ldrsh sb, [r0, #-0xbc] - ldrsh r2, [r6, #6] - cmp fp, r1 - movge fp, r1 - cmp sb, r2 - ldrsh r0, [r6] - ldrsh sl, [r6, #4] - movle sb, r2 - bl GetTile - ldrb r0, [r0, #7] - ldr r5, [sp, #0x28] - and r0, r0, #0xff - str r0, [sp, #0x30] - b _0233E99C -_0233E958: - mov r4, fp - b _0233E990 -_0233E960: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0] - add r4, r4, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - ldr r1, [sp, #0x30] - strb r1, [r0, #7] -_0233E990: - cmp r4, sb - blt _0233E960 - add r5, r5, #1 -_0233E99C: - cmp r5, sl - blt _0233E958 - ldr r0, [sp, #0x28] - sub r1, r6, #0x100 - strh r0, [r1, #-0xc2] - strh sl, [r1, #-0xbe] - strh fp, [r1, #-0xc0] - strh sb, [r1, #-0xbc] - mov r0, #1 - strb r0, [r6, #0x12] - strb r0, [r6, #-0x1b0] - mov r0, #0 - strb r0, [r6, #0xb] - mov r0, #1 - strb r0, [r6, #0x11] - b _0233ED08 -_0233E9DC: - cmp r8, #1 - blt _0233ED08 - ldrb r0, [r6, #-0x13] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #-0x16] - cmp r0, #0 - bne _0233ED08 - ldrb r0, [r6, #-0x14] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #-0x15] - cmp r0, #0 - ldreqb r0, [r6, #-0xc] - cmpeq r0, #0 - bne _0233ED08 - ldrsh r1, [r6, #-0x1c] - ldrsh r0, [r6] - ldrsh fp, [r6, #-0x1e] - str r1, [sp, #0x24] - ldrsh r1, [r6, #4] - ldrsh sb, [r6, #-0x1a] - cmp fp, r0 - movge fp, r0 - cmp sb, r1 - movle sb, r1 - ldrsh r1, [r6, #2] - ldrsh sl, [r6, #6] - bl GetTile - ldrb r0, [r0, #7] - mov r5, fp - and r0, r0, #0xff - str r0, [sp, #0x34] - b _0233EAA8 -_0233EA64: - ldr r4, [sp, #0x24] - b _0233EA9C -_0233EA6C: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0] - add r4, r4, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - ldr r1, [sp, #0x34] - strb r1, [r0, #7] -_0233EA9C: - cmp r4, sl - blt _0233EA6C - add r5, r5, #1 -_0233EAA8: - cmp r5, sb - blt _0233EA64 - strh fp, [r6, #-0x1e] - ldr r0, [sp, #0x24] - strh sb, [r6, #-0x1a] - strh r0, [r6, #-0x1c] - strh sl, [r6, #-0x18] - mov r0, #1 - strb r0, [r6, #0x12] - strb r0, [r6, #-0xc] - mov r0, #0 - strb r0, [r6, #0xb] - mov r0, #1 - strb r0, [r6, #0x11] - b _0233ED08 -_0233EAE4: - ldr r0, [sp, #0x38] - cmp r7, r0 - bgt _0233ED08 - ldrb r0, [r6, #0x1cd] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #0x1ca] - cmp r0, #0 - bne _0233ED08 - ldrb r0, [r6, #0x1cc] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #0x1cb] - cmp r0, #0 - ldreqb r0, [r6, #0x1d4] - cmpeq r0, #0 - bne _0233ED08 - add r0, r6, #0x100 - ldrsh sl, [r6] - ldrsh r0, [r0, #0xc4] - str r0, [sp, #0x1c] - ldrsh r1, [r6, #2] - mov r0, r0 - cmp r1, r0 - strlt r1, [sp, #0x1c] - add r0, r6, #0x100 - ldrsh fp, [r0, #0xc6] - ldrsh r0, [r0, #0xc8] - ldrsh sb, [r6, #6] - cmp sb, r0 - movle sb, r0 - mov r0, sl - bl GetTile - ldrb r0, [r0, #7] - mov r5, sl - and r0, r0, #0xff - str r0, [sp, #0x3c] - b _0233EBC0 -_0233EB7C: - ldr r4, [sp, #0x1c] - b _0233EBB4 -_0233EB84: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0] - add r4, r4, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - ldr r1, [sp, #0x3c] - strb r1, [r0, #7] -_0233EBB4: - cmp r4, sb - blt _0233EB84 - add r5, r5, #1 -_0233EBC0: - cmp r5, fp - blt _0233EB7C - strh sl, [r6] - strh fp, [r6, #4] - ldr r0, [sp, #0x1c] - strh r0, [r6, #2] - strh sb, [r6, #6] - mov r0, #1 - strb r0, [r6, #0x1d4] - strb r0, [r6, #0x12] - mov r0, #0 - strb r0, [r6, #0x1cd] - mov r0, #1 - strb r0, [r6, #0x1d3] - b _0233ED08 -_0233EBFC: - ldr r0, [sp, #0x40] - cmp r8, r0 - bgt _0233ED08 - ldrb r0, [r6, #0x29] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #0x26] - cmp r0, #0 - bne _0233ED08 - ldrb r0, [r6, #0x28] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #0x27] - cmp r0, #0 - ldreqb r0, [r6, #0x30] - cmpeq r0, #0 - bne _0233ED08 - ldrsh r0, [r6, #0x1e] - str r0, [sp, #0x18] - ldrsh r0, [r6] - ldr r1, [sp, #0x18] - cmp r0, r1 - strlt r0, [sp, #0x18] - ldrsh sl, [r6, #2] - ldrsh r1, [r6, #0x22] - ldrsh sb, [r6, #4] - ldrsh fp, [r6, #0x24] - cmp sb, r1 - movle sb, r1 - mov r1, sl - bl GetTile - ldrb r0, [r0, #7] - ldr r5, [sp, #0x18] - and r0, r0, #0xff - str r0, [sp, #0x44] - b _0233ECD0 -_0233EC8C: - mov r4, sl - b _0233ECC4 -_0233EC94: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0] - add r4, r4, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - ldr r1, [sp, #0x44] - strb r1, [r0, #7] -_0233ECC4: - cmp r4, fp - blt _0233EC94 - add r5, r5, #1 -_0233ECD0: - cmp r5, sb - blt _0233EC8C - ldr r0, [sp, #0x18] - strh r0, [r6] - strh sb, [r6, #4] - strh sl, [r6, #2] - strh fp, [r6, #6] - mov r0, #1 - strb r0, [r6, #0x30] - strb r0, [r6, #0x12] - mov r0, #0 - strb r0, [r6, #0x29] - mov r0, #1 - strb r0, [r6, #0x2f] -_0233ED08: - add r8, r8, #1 -_0233ED0C: - ldr r0, [sp, #0x14] - cmp r8, r0 - blt _0233E850 - add r7, r7, #1 -_0233ED1C: - ldr r0, [sp, #0x10] - cmp r7, r0 - blt _0233E820 -_0233ED28: - add sp, sp, #0x48 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233ED30: .word 0x000001C2 - arm_func_end CreateGridCellConnections - - arm_func_start GenerateRoomImperfections -GenerateRoomImperfections: ; 0x0233ED34 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x34 - str r0, [sp] - str r1, [sp, #4] - str r2, [sp, #8] - mov fp, #0 - b _0233F100 -_0233ED50: - ldr r1, _0233F114 ; =0x000001C2 - ldr r0, [sp] - mov sl, #0 - mla r0, fp, r1, r0 - str r0, [sp, #0xc] - mvn r0, #0 - str r0, [sp, #0x30] - b _0233F0F0 -_0233ED70: - ldr r0, [sp, #0xc] - mov r1, #0x1e - mla sb, sl, r1, r0 - ldrb r0, [sb, #8] - cmp r0, #0 - ldreqb r0, [sb, #0x11] - cmpeq r0, #0 - ldreqb r0, [sb, #0x12] - cmpeq r0, #0 - bne _0233F0EC - ldrb r0, [sb, #0xb] - cmp r0, #0 - ldrneb r0, [sb, #0xa] - cmpne r0, #0 - beq _0233F0EC - ldrb r0, [sb, #9] - cmp r0, #0 - ldreqb r0, [sb, #0x10] - cmpeq r0, #0 - bne _0233F0EC - ldrb r0, [sb, #0x1c] - cmp r0, #0 - beq _0233F0EC - mov r0, #0x64 - bl DungeonRandInt - cmp r0, #0x3c - blt _0233F0EC - ldrsh r3, [sb, #4] - ldrsh r2, [sb] - ldrsh r1, [sb, #6] - ldrsh r0, [sb, #2] - sub r2, r3, r2 - sub r0, r1, r0 - add r1, r2, r0 - mov r0, r1, asr #1 - add r0, r1, r0, lsr #30 - movs r0, r0, asr #2 - str r0, [sp, #0x24] - moveq r0, #1 - streq r0, [sp, #0x24] - mov r0, #0 - str r0, [sp, #0x2c] - b _0233F0DC -_0233EE1C: - mov r4, #0 -_0233EE20: - mov r0, #4 - bl DungeonRandInt - str r0, [sp, #0x20] - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0233EE48 -_0233EE38: ; jump table - b _0233EE48 ; case 0 - b _0233EE70 ; case 1 - b _0233EE9C ; case 2 - b _0233EECC ; case 3 -_0233EE48: - cmp r4, #0 - movne r0, #1 - strne r0, [sp, #0x28] - movne r5, #0 - moveq r0, #0 - ldrsh r8, [sb] - ldrsh r7, [sb, #2] - streq r0, [sp, #0x28] - moveq r5, #1 - b _0233EEF4 -_0233EE70: - ldrsh r0, [sb, #4] - cmp r4, #0 - movne r5, #1 - sub r8, r0, #1 - movne r0, #0 - strne r0, [sp, #0x28] - ldreq r0, [sp, #0x30] - ldrsh r7, [sb, #2] - streq r0, [sp, #0x28] - moveq r5, #0 - b _0233EEF4 -_0233EE9C: - ldrsh r0, [sb, #6] - cmp r4, #0 - ldrsh r1, [sb, #4] - sub r7, r0, #1 - ldrne r0, [sp, #0x30] - movne r5, #0 - strne r0, [sp, #0x28] - moveq r0, #0 - sub r8, r1, #1 - streq r0, [sp, #0x28] - ldreq r5, [sp, #0x30] - b _0233EEF4 -_0233EECC: - ldrsh r0, [sb, #6] - cmp r4, #0 - ldrne r5, [sp, #0x30] - sub r7, r0, #1 - movne r0, #0 - strne r0, [sp, #0x28] - moveq r0, #1 - ldrsh r8, [sb] - streq r0, [sp, #0x28] - moveq r5, #0 -_0233EEF4: - mov r6, #0 - b _0233F0BC -_0233EEFC: - ldrsh r0, [sb] - cmp r8, r0 - blt _0233F0C4 - ldrsh r0, [sb, #4] - cmp r8, r0 - bge _0233F0C4 - ldrsh r0, [sb, #2] - cmp r7, r0 - blt _0233F0C4 - ldrsh r0, [sb, #6] - cmp r7, r0 - bge _0233F0C4 - mov r0, r8 - mov r1, r7 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _0233F0AC - mov r5, #0 - b _0233F014 -_0233EF50: - ldr r0, _0233F118 ; =DIRECTIONS_XY - mov r1, r5, lsl #2 - ldrsh r2, [r0, r1] - add r0, r0, r5, lsl #2 - ldrsh r1, [r0, #2] - add r0, r8, r2 - str r0, [sp, #0x1c] - mov r0, #0 - str r0, [sp, #0x10] - add r0, r7, r1 - str r0, [sp, #0x18] - ldr r6, [sp, #0x30] - b _0233EFFC -_0233EF84: - ldr r0, [sp, #0x30] - str r0, [sp, #0x14] - b _0233EFE0 -_0233EF90: - ldr r1, [sp, #0x1c] - ldr r0, [sp, #0x14] - add r0, r1, r0 - ldr r1, [sp, #0x18] - add r1, r1, r6 - bl GetTile - ldrh r1, [r0] - and r1, r1, #3 - cmp r1, #1 - bne _0233EFD4 - ldrb r0, [r0, #7] - cmp r0, #0xff - moveq r0, #1 - streq r0, [sp, #0x10] - ldr r0, [sp, #0x10] - cmp r0, #0 - bne _0233EFEC -_0233EFD4: - ldr r0, [sp, #0x14] - add r0, r0, #1 - str r0, [sp, #0x14] -_0233EFE0: - ldr r0, [sp, #0x14] - cmp r0, #1 - ble _0233EF90 -_0233EFEC: - ldr r0, [sp, #0x10] - cmp r0, #0 - bne _0233F004 - add r6, r6, #1 -_0233EFFC: - cmp r6, #1 - ble _0233EF84 -_0233F004: - ldr r0, [sp, #0x10] - cmp r0, #0 - bne _0233F01C - add r5, r5, #1 -_0233F014: - cmp r5, #8 - blt _0233EF50 -_0233F01C: - cmp r5, #8 - bne _0233F0C4 - ldr r1, _0233F11C ; =CORNER_CARDINAL_NEIGHBOR_IS_OPEN - ldr r0, [sp, #0x20] - mov r5, #0 - add r6, r1, r0, lsl #3 - b _0233F080 -_0233F038: - ldr r0, _0233F118 ; =DIRECTIONS_XY - mov r1, r5, lsl #2 - ldrsh r2, [r0, r1] - add r0, r0, r5, lsl #2 - ldrsh r1, [r0, #2] - add r0, r8, r2 - add r1, r7, r1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - moveq r0, #1 - movne r0, #0 - and r1, r0, #0xff - ldrb r0, [r5, r6] - cmp r1, r0 - bne _0233F088 - add r5, r5, #2 -_0233F080: - cmp r5, #8 - blt _0233F038 -_0233F088: - cmp r5, #8 - bne _0233F0C4 - mov r0, r8 - mov r1, r7 - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - b _0233F0C4 -_0233F0AC: - ldr r0, [sp, #0x28] - add r7, r7, r5 - add r8, r8, r0 - add r6, r6, #1 -_0233F0BC: - cmp r6, #0xa - blt _0233EEFC -_0233F0C4: - add r4, r4, #1 - cmp r4, #2 - blt _0233EE20 - ldr r0, [sp, #0x2c] - add r0, r0, #1 - str r0, [sp, #0x2c] -_0233F0DC: - ldr r1, [sp, #0x2c] - ldr r0, [sp, #0x24] - cmp r1, r0 - blt _0233EE1C -_0233F0EC: - add sl, sl, #1 -_0233F0F0: - ldr r0, [sp, #8] - cmp sl, r0 - blt _0233ED70 - add fp, fp, #1 -_0233F100: - ldr r0, [sp, #4] - cmp fp, r0 - blt _0233ED50 - add sp, sp, #0x34 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233F114: .word 0x000001C2 -_0233F118: .word DIRECTIONS_XY -_0233F11C: .word CORNER_CARDINAL_NEIGHBOR_IS_OPEN - arm_func_end GenerateRoomImperfections - - arm_func_start CreateHallway -CreateHallway: ; 0x0233F120 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - ldrb r6, [sp, #0x28] - mov sl, r0 - ldr r0, [sp, #0x30] - mov sb, r1 - cmp r6, #0 - mov r8, r2 - mov r7, r3 - mov r4, sl - mov r5, sb - ldr fp, [sp, #0x2c] - str r0, [sp, #0x30] - mov r6, #0 - beq _0233F328 - b _0233F1C4 -_0233F15C: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F1AC - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F1B4 -_0233F1AC: - cmp sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F1B4: - ldr r0, [sp, #0x30] - cmp sb, r0 - addlt sb, sb, #1 - subge sb, sb, #1 -_0233F1C4: - ldr r0, [sp, #0x30] - cmp sb, r0 - bne _0233F15C - mov r6, #0 - b _0233F240 -_0233F1D8: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F228 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F234 -_0233F228: - cmp sl, r4 - cmpeq sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F234: - cmp sl, r8 - addlt sl, sl, #1 - subge sl, sl, #1 -_0233F240: - cmp sl, r8 - bne _0233F1D8 - mov r6, #0 - b _0233F2B8 -_0233F250: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F2A0 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F2AC -_0233F2A0: - cmp sl, r4 - cmpeq sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F2AC: - cmp sb, r7 - addlt sb, sb, #1 - subge sb, sb, #1 -_0233F2B8: - cmp sb, r7 - bne _0233F250 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F2C4: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F314 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F31C -_0233F314: - cmp sl, r4 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F31C: - cmp sl, fp - addlt sl, sl, #1 - subge sl, sl, #1 -_0233F328: - cmp sl, fp - bne _0233F2C4 - mov r6, #0 - b _0233F3A0 -_0233F338: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F388 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F394 -_0233F388: - cmp sl, r4 - cmpeq sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F394: - cmp sb, r7 - addlt sb, sb, #1 - subge sb, sb, #1 -_0233F3A0: - cmp sb, r7 - bne _0233F338 - mov r6, #0 - b _0233F418 -_0233F3B0: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F400 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F40C -_0233F400: - cmp sl, r4 - cmpeq sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F40C: - cmp sl, r8 - addlt sl, sl, #1 - subge sl, sl, #1 -_0233F418: - cmp sl, r8 - bne _0233F3B0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - arm_func_end CreateHallway - - arm_func_start EnsureConnectedGrid -EnsureConnectedGrid: ; 0x0233F424 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x2c - str r0, [sp, #0xc] - mov r7, r1 - mov fp, r2 - mov r6, r3 - ldr r5, [sp, #0x50] - mov r8, #0 - b _0233F818 -_0233F448: - ldr r1, _0233F8FC ; =0x000001C2 - ldr r0, [sp, #0xc] - mov r4, #0 - mla sb, r8, r1, r0 - sub r0, fp, #1 - str r0, [sp, #0x20] - add r0, r6, r8, lsl #2 - str r0, [sp, #0x28] - sub r0, r7, #1 - str r0, [sp, #0x24] - b _0233F80C -_0233F474: - mov r0, #0x1e - mla sl, r4, r0, sb - ldrb r0, [sl, #8] - cmp r0, #0 - ldreqb r0, [sl, #0x11] - cmpeq r0, #0 - ldreqb r0, [sl, #0xb] - cmpeq r0, #0 - bne _0233F808 - ldrb r0, [sl, #0xa] - cmp r0, #0 - beq _0233F7CC - ldrb r0, [sl, #9] - cmp r0, #0 - bne _0233F7CC - ldrsh r0, [sl] - ldrsh r1, [sl, #4] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - str r0, [sp, #0x1c] - ldrsh r0, [sl, #2] - ldrsh r1, [sl, #6] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - str r0, [sp, #0x18] - cmp r4, #0 - ble _0233F590 - ldrb r0, [sl, #-0x16] - cmp r0, #0 - ldreqb r0, [sl, #-0xc] - cmpeq r0, #0 - bne _0233F590 - ldrb r0, [sl, #-0x13] - cmp r0, #0 - beq _0233F590 - ldrb r0, [sl, #-0x14] - cmp r0, #0 - ldrsh r0, [sl, #-0x1e] - streq r0, [sp, #0x14] - beq _0233F544 - ldrsh r1, [sl, #-0x1a] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - str r0, [sp, #0x14] - ldrsh r0, [sl, #-0x1c] - ldrsh r1, [sl, #-0x18] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange -_0233F544: - mov r1, #1 - str r1, [sp] - mov r1, #0x1e - mla sl, r4, r1, sb - ldr r1, [r6, r8, lsl #2] - ldr r0, [sp, #0x1c] - str r1, [sp, #4] - ldr r1, [r5, r4, lsl #2] - ldr r2, [sp, #0x14] - str r1, [sp, #8] - ldrsh r3, [sl, #-0x18] - ldrsh r1, [sl, #2] - sub r3, r3, #1 - bl CreateHallway - mov r0, #1 - strb r0, [sl, #0xb] - strb r0, [sl, #0x13] - strb r0, [sl, #-0xa] - b _0233F808 -_0233F590: - ldr r0, [sp, #0x20] - cmp r4, r0 - bge _0233F64C - ldrb r0, [sl, #0x26] - cmp r0, #0 - ldreqb r0, [sl, #0x30] - cmpeq r0, #0 - bne _0233F64C - ldrb r0, [sl, #0x29] - cmp r0, #0 - beq _0233F64C - ldrb r0, [sl, #0x28] - cmp r0, #0 - ldrsh r0, [sl, #0x1e] - streq r0, [sp, #0x10] - beq _0233F5F8 - ldrsh r1, [sl, #0x22] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - str r0, [sp, #0x10] - ldrsh r0, [sl, #0x20] - ldrsh r1, [sl, #0x24] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange -_0233F5F8: - mov r1, #1 - str r1, [sp] - mov r1, #0x1e - mla sl, r4, r1, sb - ldr r3, [r6, r8, lsl #2] - add r1, r5, r4, lsl #2 - str r3, [sp, #4] - ldr r1, [r1, #4] - ldr r0, [sp, #0x1c] - sub r1, r1, #1 - str r1, [sp, #8] - ldrsh r1, [sl, #6] - ldrsh r3, [sl, #0x20] - ldr r2, [sp, #0x10] - sub r1, r1, #1 - bl CreateHallway - mov r0, #1 - strb r0, [sl, #0xb] - strb r0, [sl, #0x14] - strb r0, [sl, #0x31] - b _0233F808 -_0233F64C: - cmp r8, #0 - ble _0233F708 - ldrb r0, [sl, #-0x1ba] - cmp r0, #0 - ldreqb r0, [sl, #-0x1b0] - cmpeq r0, #0 - bne _0233F708 - ldrb r0, [sl, #-0x1b7] - cmp r0, #0 - beq _0233F708 - ldrb r0, [sl, #-0x1b8] - cmp r0, #0 - sub r0, sl, #0x100 - ldreqsh r3, [r0, #-0xc0] - beq _0233F6B8 - ldrsh r1, [r0, #-0xbe] - ldrsh r2, [r0, #-0xc2] - sub r1, r1, #1 - add r0, r2, #1 - bl DungeonRandRange - sub r0, sl, #0x100 - ldrsh r1, [r0, #-0xbc] - ldrsh r2, [r0, #-0xc0] - sub r1, r1, #1 - add r0, r2, #1 - bl DungeonRandRange - mov r3, r0 -_0233F6B8: - mov r0, #0 - str r0, [sp] - mov r0, #0x1e - mul r0, r4, r0 - ldr ip, [r6, r8, lsl #2] - add sl, sb, r0 - str ip, [sp, #4] - ldr ip, [r5, r4, lsl #2] - sub r2, sl, #0x100 - str ip, [sp, #8] - ldrsh r2, [r2, #-0xc2] - ldrsh r0, [sb, r0] - ldr r1, [sp, #0x18] - sub r2, r2, #1 - bl CreateHallway - mov r0, #1 - strb r0, [sl, #0xb] - strb r0, [sl, #0x15] - strb r0, [sl, #-0x1ac] - b _0233F808 -_0233F708: - ldr r0, [sp, #0x24] - cmp r8, r0 - bge _0233F808 - ldrb r0, [sl, #0x1ca] - cmp r0, #0 - ldreqb r0, [sl, #0x1d4] - cmpeq r0, #0 - bne _0233F808 - ldrb r0, [sl, #0x1cd] - cmp r0, #0 - beq _0233F808 - ldrb r0, [sl, #0x1cc] - cmp r0, #0 - add r0, sl, #0x100 - ldreqsh r3, [r0, #0xc4] - beq _0233F778 - ldrsh r1, [r0, #0xc6] - ldrsh r2, [r0, #0xc2] - sub r1, r1, #1 - add r0, r2, #1 - bl DungeonRandRange - add r0, sl, #0x100 - ldrsh r1, [r0, #0xc8] - ldrsh r2, [r0, #0xc4] - sub r1, r1, #1 - add r0, r2, #1 - bl DungeonRandRange - mov r3, r0 -_0233F778: - mov r0, #0 - str r0, [sp] - mov r0, #0x1e - mla sl, r4, r0, sb - ldr r0, [sp, #0x28] - ldr r1, [sp, #0x18] - ldr r2, [r0, #4] - add r0, sl, #0x100 - sub r2, r2, #1 - str r2, [sp, #4] - ldr r2, [r5, r4, lsl #2] - str r2, [sp, #8] - ldrsh r2, [r0, #0xc2] - ldrsh r0, [sl, #4] - sub r0, r0, #1 - bl CreateHallway - mov r0, #1 - strb r0, [sl, #0xb] - strb r0, [sl, #0x16] - strb r0, [sl, #0x1d7] - b _0233F808 -_0233F7CC: - ldrsh r0, [sl] - ldrsh r1, [sl, #2] - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0, #2] - bic r1, r1, #1 - strh r1, [r0, #2] - ldrh r1, [r0, #2] - bic r1, r1, #2 - strh r1, [r0, #2] - ldrh r1, [r0, #2] - bic r1, r1, #4 - strh r1, [r0, #2] -_0233F808: - add r4, r4, #1 -_0233F80C: - cmp r4, fp - blt _0233F474 - add r8, r8, #1 -_0233F818: - cmp r8, r7 - blt _0233F448 - mov r8, #0 - b _0233F8EC -_0233F828: - ldr r1, _0233F8FC ; =0x000001C2 - ldr r0, [sp, #0xc] - mov sb, #0 - mla sl, r8, r1, r0 - b _0233F8E0 -_0233F83C: - mov r0, #0x1e - mla r5, sb, r0, sl - ldrb r0, [r5, #8] - cmp r0, #0 - ldreqb r0, [r5, #0x11] - cmpeq r0, #0 - ldreqb r0, [r5, #0xb] - cmpeq r0, #0 - ldreqb r0, [r5, #0xf] - cmpeq r0, #0 - bne _0233F8DC - ldrsh r6, [r5] - b _0233F8D0 -_0233F870: - ldrsh r4, [r5, #2] - b _0233F8C0 -_0233F878: - mov r0, r6 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0] - add r4, r4, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0, #2] - bic r1, r1, #2 - strh r1, [r0, #2] - ldrh r1, [r0, #2] - bic r1, r1, #1 - strh r1, [r0, #2] - ldrh r1, [r0, #2] - bic r1, r1, #4 - strh r1, [r0, #2] - mov r1, #0xff - strb r1, [r0, #7] -_0233F8C0: - ldrsh r0, [r5, #6] - cmp r4, r0 - blt _0233F878 - add r6, r6, #1 -_0233F8D0: - ldrsh r0, [r5, #4] - cmp r6, r0 - blt _0233F870 -_0233F8DC: - add sb, sb, #1 -_0233F8E0: - cmp sb, fp - blt _0233F83C - add r8, r8, #1 -_0233F8EC: - cmp r8, r7 - blt _0233F828 - add sp, sp, #0x2c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233F8FC: .word 0x000001C2 - arm_func_end EnsureConnectedGrid - - arm_func_start SetTerrainObstacleChecked -SetTerrainObstacleChecked: ; 0x0233F900 - ldrh r3, [r0] - cmp r1, #0 - bic r1, r3, #3 - strh r1, [r0] - bxeq lr - ldrb r1, [r0, #7] - cmp r1, r2 - bxne lr - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #2 - strh r1, [r0] - bx lr - arm_func_end SetTerrainObstacleChecked - - arm_func_start FinalizeJunctions -FinalizeJunctions: ; 0x0233F93C - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r4, #0 -_0233F944: - sub r5, r4, #1 - mov r6, #0 - mov r7, #0xff -_0233F950: - mov r0, r4 - mov r1, r6 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _0233FAFC - mov r0, r4 - mov r1, r6 - bl GetTile - ldrb r0, [r0, #7] - cmp r0, #0xff - bne _0233FAD4 - cmp r4, #0 - ble _0233F9D4 - mov r0, r5 - mov r1, r6 - bl GetTileSafe - ldrb r1, [r0, #7] - cmp r1, #0xff - beq _0233F9D4 - ldrh r1, [r0] - orr r2, r1, #8 - and r1, r2, #3 - strh r2, [r0] - cmp r1, #2 - bne _0233F9D4 - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] -_0233F9D4: - cmp r6, #0 - ble _0233FA28 - mov r0, r4 - sub r1, r6, #1 - bl GetTileSafe - ldrb r1, [r0, #7] - cmp r1, #0xff - beq _0233FA28 - ldrh r1, [r0] - orr r1, r1, #8 - orr r2, r1, #8 - and r1, r2, #3 - strh r2, [r0] - cmp r1, #2 - bne _0233FA28 - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] -_0233FA28: - cmp r6, #0x1f - bge _0233FA7C - mov r0, r4 - add r1, r6, #1 - bl GetTileSafe - ldrb r1, [r0, #7] - cmp r1, #0xff - beq _0233FA7C - ldrh r1, [r0] - orr r1, r1, #8 - orr r2, r1, #8 - and r1, r2, #3 - strh r2, [r0] - cmp r1, #2 - bne _0233FA7C - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] -_0233FA7C: - cmp r4, #0x37 - bge _0233FAFC - mov r1, r6 - add r0, r4, #1 - bl GetTileSafe - ldrb r1, [r0, #7] - cmp r1, #0xff - beq _0233FAFC - ldrh r1, [r0] - orr r1, r1, #8 - orr r2, r1, #8 - and r1, r2, #3 - strh r2, [r0] - cmp r1, #2 - bne _0233FAFC - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233FAFC -_0233FAD4: - mov r0, r4 - mov r1, r6 - bl GetTile - ldrb r0, [r0, #7] - cmp r0, #0xfe - bne _0233FAFC - mov r0, r4 - mov r1, r6 - bl GetTileSafe - strb r7, [r0, #7] -_0233FAFC: - add r6, r6, #1 - cmp r6, #0x20 - blt _0233F950 - add r4, r4, #1 - cmp r4, #0x38 - blt _0233F944 - bl ov29_0233FB1C - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end FinalizeJunctions - - arm_func_start ov29_0233FB1C -ov29_0233FB1C: ; 0x0233FB1C -#ifdef JAPAN -#define OV29_0233FB1C_OFFSET 0x5C -#else -#define OV29_0233FB1C_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, lr} - ldr r0, _0233FBE4 ; =DUNGEON_PTR - mov r1, #0 - ldr r6, [r0] - mov r7, r1 -_0233FB30: - add r0, r6, r1, lsl #1 -#ifdef JAPAN - add r0, r0, #0xf100 -#else - add r0, r0, #0xf200 -#endif - add r1, r1, #1 - strh r7, [r0, #0x68 + OV29_0233FB1C_OFFSET] - cmp r1, #0x20 - blt _0233FB30 -_0233FB48: - mov r0, r7, lsl #0x10 - mov r5, #0 - mov r4, r0, asr #0x10 -_0233FB54: - mov r0, r7 - mov r1, r5 - bl GetTile - ldrh r0, [r0] - tst r0, #8 - beq _0233FBC8 - mov r0, r7 - mov r1, r5 - bl GetTile - ldrb r2, [r0, #7] - cmp r2, #0 - blt _0233FBC8 - cmp r2, #0x20 - addlt r0, r6, r2, lsl #1 -#ifdef JAPAN - addlt r1, r0, #0xf100 -#else - addlt r1, r0, #0xf200 -#endif - ldrltsh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] - cmplt r0, #0x20 - bge _0233FBC8 - add r2, r6, r2, lsl #7 - add r0, r2, r0, lsl #2 - add r0, r0, #0xf200 -#ifdef JAPAN - strh r4, [r0, #4] -#else - strh r4, [r0, #0xa8] -#endif - ldrsh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] - add r0, r2, r0, lsl #2 - add r0, r0, #0xf200 -#ifdef JAPAN - strh r5, [r0, #6] -#else - strh r5, [r0, #0xaa] -#endif - ldrsh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] - add r0, r0, #1 - strh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] -_0233FBC8: - add r5, r5, #1 - cmp r5, #0x20 - blt _0233FB54 - add r7, r7, #1 - cmp r7, #0x38 - blt _0233FB48 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_0233FBE4: .word DUNGEON_PTR - arm_func_end ov29_0233FB1C - - arm_func_start GenerateKecleonShop -GenerateKecleonShop: ; 0x0233FBE8 -#ifdef JAPAN -#define GENERATE_KECLEON_SHOP_OFFSET -0xA4 -#else -#define GENERATE_KECLEON_SHOP_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x44 - ldr r5, _0233FF8C ; =DUNGEON_PTR - ldr r4, _0233FF90 ; =FLOOR_GENERATION_STATUS - mvn r7, #0 - ldr r6, [r5] - strh r7, [r4, #0x20] - strh r7, [r4, #0x22] - ldrb r4, [r4, #1] - mov sl, r0 - str r1, [sp] - str r2, [sp, #4] - mov r5, r3 - cmp r4, #0 - bne _0233FF84 - bl GetFloorType - cmp r0, #2 - cmpne r5, #0 - beq _0233FF84 - mov r0, #0x64 - bl DungeonRandInt - cmp r5, r0 - ble _0233FF84 - mov r4, #0 - add r2, sp, #0x26 - add r1, sp, #8 -_0233FC50: - mov r0, r4, lsl #0x10 - mov r3, r4, lsl #1 - mov r0, r0, asr #0x10 - add r4, r4, #1 - strh r0, [r2, r3] - strh r0, [r1, r3] - cmp r4, #0xf - blt _0233FC50 - mov r7, #0xf - mov r8, #0 - mov r5, r7 - add r4, sp, #0x26 -_0233FC80: - mov r0, r7 - bl DungeonRandInt - mov sb, r0 - mov r0, r5 - bl DungeonRandInt - mov r3, sb, lsl #1 - mov r1, r0, lsl #1 - add r8, r8, #1 - ldrsh r2, [r4, r3] - ldrsh r0, [r4, r1] - cmp r8, #0xc8 - strh r0, [r4, r3] - strh r2, [r4, r1] - blt _0233FC80 - mov r7, #0xf - mov r8, #0 - mov r5, r7 - add r4, sp, #8 -_0233FCC8: - mov r0, r7 - bl DungeonRandInt - mov sb, r0 - mov r0, r5 - bl DungeonRandInt - mov r3, sb, lsl #1 - mov r1, r0, lsl #1 - add r8, r8, #1 - ldrsh r2, [r4, r3] - ldrsh r0, [r4, r1] - cmp r8, #0xc8 - strh r0, [r4, r3] - strh r2, [r4, r1] - blt _0233FCC8 - mov r4, #0 - b _0233FF7C -_0233FD08: - add r0, sp, #0x26 - mov r1, r4, lsl #1 - ldrsh r1, [r0, r1] - ldr r0, [sp] - cmp r1, r0 - bge _0233FF78 - ldr r0, _0233FF94 ; =0x000001C2 - mov r5, #0 - mul fp, r1, r0 - add sb, sl, fp - b _0233FF70 -_0233FD34: - mov r1, r5, lsl #1 - add r0, sp, #8 - ldrsh r1, [r0, r1] - ldr r0, [sp, #4] - cmp r1, r0 - bge _0233FF6C - mov r0, #0x1e - mul r7, r1, r0 - add r8, sb, r7 - ldrb r0, [r8, #8] - cmp r0, #0 - ldreqb r0, [r8, #0x11] - cmpeq r0, #0 - ldreqb r0, [r8, #0x12] - cmpeq r0, #0 - bne _0233FF6C - ldrb r0, [r8, #0xb] - cmp r0, #0 - ldrneb r0, [r8, #0xa] - cmpne r0, #0 - beq _0233FF6C - ldrb r0, [r8, #9] - cmp r0, #0 - ldreqb r0, [r8, #0x10] - cmpeq r0, #0 - ldreqb r0, [r8, #0x1d] - cmpeq r0, #0 - bne _0233FF6C - ldrsh r1, [r8, #4] - ldrsh r0, [r8] - sub r0, r1, r0 - bl abs - cmp r0, #5 - blt _0233FF6C - ldrsh r1, [r8, #6] - ldrsh r0, [r8, #2] - sub r0, r1, r0 - bl abs - cmp r0, #4 - blt _0233FF6C - ldr r0, _0233FF90 ; =FLOOR_GENERATION_STATUS - add r1, sl, fp - mov r3, #1 - strb r3, [r0, #3] - add r2, r1, r7 - strb r3, [r2, #0xc] - ldrsh r1, [sb, r7] - add r1, r1, #1 - str r1, [r0, #0x30] - ldrsh r1, [r2, #4] - sub r1, r1, #1 - str r1, [r0, #0x38] - ldrsh r1, [r2, #2] - add r3, r1, #1 - str r3, [r0, #0x34] - ldrsh r1, [r2, #6] - sub r2, r1, #1 - sub r1, r2, r3 - cmp r1, #3 - str r2, [r0, #0x3c] - addlt r1, r2, #1 - strlt r1, [r0, #0x3c] - ldr r1, _0233FF98 ; =0x0000270F - add r0, r6, #0xc000 - str r1, [r0, #0xd14 + GENERATE_KECLEON_SHOP_OFFSET] - str r1, [r0, #0xd18 + GENERATE_KECLEON_SHOP_OFFSET] - rsb r2, r1, #0 - str r2, [r0, #0xd1c + GENERATE_KECLEON_SHOP_OFFSET] - ldr r1, _0233FF90 ; =FLOOR_GENERATION_STATUS - str r2, [r0, #0xd20 + GENERATE_KECLEON_SHOP_OFFSET] - ldr r4, [r1, #0x30] - b _0233FED8 -_0233FE54: - ldr sl, _0233FF90 ; =FLOOR_GENERATION_STATUS - add r8, r6, #0xc000 - ldr r5, [sl, #0x34] - b _0233FEC8 -_0233FE64: - mov r0, r4 - mov r1, r5 - bl GetTileSafe - ldrh r1, [r0] - orr r1, r1, #0x20 - strh r1, [r0] - ldrh r1, [r0, #2] - bic r1, r1, #8 - strh r1, [r0, #2] - ldrh r1, [r0, #2] - bic r1, r1, #1 - strh r1, [r0, #2] - ldr r0, [r8, #0xd14 + GENERATE_KECLEON_SHOP_OFFSET] - cmp r0, r4 - strgt r4, [r8, #0xd14 + GENERATE_KECLEON_SHOP_OFFSET] - ldr r0, [r8, #0xd18 + GENERATE_KECLEON_SHOP_OFFSET] - cmp r0, r5 - strgt r5, [r8, #0xd18 + GENERATE_KECLEON_SHOP_OFFSET] - ldr r0, [r8, #0xd1c + GENERATE_KECLEON_SHOP_OFFSET] - cmp r0, r4 - strlt r4, [r8, #0xd1c + GENERATE_KECLEON_SHOP_OFFSET] - ldr r0, [r8, #0xd20 + GENERATE_KECLEON_SHOP_OFFSET] - cmp r0, r5 - strlt r5, [r8, #0xd20 + GENERATE_KECLEON_SHOP_OFFSET] - add r5, r5, #1 -_0233FEC8: - ldr r0, [sl, #0x3c] - cmp r5, r0 - blt _0233FE64 - add r4, r4, #1 -_0233FED8: - ldr r0, _0233FF90 ; =FLOOR_GENERATION_STATUS - ldr r0, [r0, #0x38] - cmp r4, r0 - blt _0233FE54 - add r4, sb, r7 - ldrsh r5, [sb, r7] - b _0233FF28 -_0233FEF4: - ldrsh r6, [r4, #2] - b _0233FF18 -_0233FEFC: - mov r0, r5 - mov r1, r6 - bl GetTileSafe - ldrh r1, [r0, #2] - add r6, r6, #1 - orr r1, r1, #0x10 - strh r1, [r0, #2] -_0233FF18: - ldrsh r0, [r4, #6] - cmp r6, r0 - blt _0233FEFC - add r5, r5, #1 -_0233FF28: - ldrsh r0, [r4, #4] - cmp r5, r0 - blt _0233FEF4 - ldr r1, _0233FF90 ; =FLOOR_GENERATION_STATUS - ldr r2, [r1, #0x30] - ldr r0, [r1, #0x38] - add r0, r2, r0 - add r0, r0, r0, lsr #31 - mov r0, r0, asr #1 - strh r0, [r1, #0x20] - ldr r2, [r1, #0x34] - ldr r0, [r1, #0x3c] - add r0, r2, r0 - add r0, r0, r0, lsr #31 - mov r0, r0, asr #1 - strh r0, [r1, #0x22] - b _0233FF84 -_0233FF6C: - add r5, r5, #1 -_0233FF70: - cmp r5, #0xf - blt _0233FD34 -_0233FF78: - add r4, r4, #1 -_0233FF7C: - cmp r4, #0xf - blt _0233FD08 -_0233FF84: - add sp, sp, #0x44 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233FF8C: .word DUNGEON_PTR -_0233FF90: .word FLOOR_GENERATION_STATUS -_0233FF94: .word 0x000001C2 -_0233FF98: .word 0x0000270F - arm_func_end GenerateKecleonShop - - arm_func_start GenerateMonsterHouse -GenerateMonsterHouse: ; 0x0233FF9C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x100 - ldr r4, _02340218 ; =DUNGEON_PTR - movs r5, r3 - mov sl, r0 - mov sb, r1 - mov r8, r2 - ldr r6, [r4] - beq _02340210 - mov r0, #0x64 - bl DungeonRandInt - cmp r5, r0 - ble _02340210 - ldr r0, _0234021C ; =FLOOR_GENERATION_STATUS - ldrb r0, [r0, #3] - cmp r0, #0 - bne _02340210 - bl IsOutlawMonsterHouseFloor - cmp r0, #0 - bne _0233FFF8 - bl IsDestinationFloorWithMonster - cmp r0, #0 - bne _02340210 -_0233FFF8: - bl GetFloorType - cmp r0, #0 - bne _02340210 - mov r5, #0 - mov r2, r5 - mov r1, r5 - b _02340088 -_02340014: - ldr r0, _02340220 ; =0x000001C2 - mov r3, r1 - mla r4, r2, r0, sl - mov r7, #0x1e - b _0234007C -_02340028: - mla r0, r3, r7, r4 - ldrb fp, [r0, #8] - cmp fp, #0 - ldreqb fp, [r0, #0x11] - cmpeq fp, #0 - bne _02340078 - ldrb fp, [r0, #0xb] - cmp fp, #0 - ldrneb fp, [r0, #0xa] - cmpne fp, #0 - beq _02340078 - ldrb fp, [r0, #0xc] - cmp fp, #0 - ldreqb fp, [r0, #0xf] - cmpeq fp, #0 - ldreqb fp, [r0, #0x10] - cmpeq fp, #0 - ldreqb r0, [r0, #9] - cmpeq r0, #0 - addeq r5, r5, #1 -_02340078: - add r3, r3, #1 -_0234007C: - cmp r3, r8 - blt _02340028 - add r2, r2, #1 -_02340088: - cmp r2, sb - blt _02340014 - cmp r5, #0 - beq _02340210 - mov r1, #0 - mov r7, r1 - add r0, sp, #0 -_023400A4: - strb r7, [r0, r1] - add r1, r1, #1 - cmp r1, #0x100 - blt _023400A4 - mov r0, #1 - strb r0, [sp] - add fp, sp, #0 -_023400C0: - mov r0, r5 - bl DungeonRandInt - mov r4, r0 - mov r0, r5 - bl DungeonRandInt - add r7, r7, #1 - ldrb r2, [fp, r4] - ldrb r1, [fp, r0] - cmp r7, #0x40 - strb r1, [fp, r4] - strb r2, [fp, r0] - blt _023400C0 - mov r7, #0 - mov r4, r7 - add fp, sp, #0 - b _02340208 -_02340100: - ldr r0, _02340220 ; =0x000001C2 - mov r5, #0 - mul r3, r4, r0 - add r2, sl, r3 - mov lr, #0x1e - b _023401FC -_02340118: - mul r1, r5, lr - add r0, r2, r1 - ldrb ip, [r0, #8] - cmp ip, #0 - ldreqb ip, [r0, #0x11] - cmpeq ip, #0 - bne _023401F8 - ldrb ip, [r0, #0xb] - cmp ip, #0 - ldrneb ip, [r0, #0xa] - cmpne ip, #0 - beq _023401F8 - ldrb ip, [r0, #0xc] - cmp ip, #0 - ldreqb ip, [r0, #0xf] - cmpeq ip, #0 - ldreqb ip, [r0, #0x10] - cmpeq ip, #0 - ldreqb r0, [r0, #9] - cmpeq r0, #0 - bne _023401F8 - ldrb r0, [fp, r7] - cmp r0, #0 - beq _023401F4 - ldr r0, _0234021C ; =FLOOR_GENERATION_STATUS - add r2, sl, r3 - mov r3, #1 - strb r3, [r0, #1] - add r7, r2, r1 - strb r3, [r7, #0xe] - ldrsh r5, [r2, r1] - add r6, r6, #0x4000 - b _023401E4 -_0234019C: - ldrsh r4, [r7, #2] - b _023401D4 -_023401A4: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r2, [r0] - mov r1, r4 - orr r2, r2, #0x40 - strh r2, [r0] - mov r0, r5 - bl GetTile - ldrb r0, [r0, #7] - add r4, r4, #1 -#ifdef JAPAN - strb r0, [r6, #0x25] -#else - strb r0, [r6, #0xc9] -#endif -_023401D4: - ldrsh r0, [r7, #6] - cmp r4, r0 - blt _023401A4 - add r5, r5, #1 -_023401E4: - ldrsh r0, [r7, #4] - cmp r5, r0 - blt _0234019C - b _02340210 -_023401F4: - add r7, r7, #1 -_023401F8: - add r5, r5, #1 -_023401FC: - cmp r5, r8 - blt _02340118 - add r4, r4, #1 -_02340208: - cmp r4, sb - blt _02340100 -_02340210: - add sp, sp, #0x100 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02340218: .word DUNGEON_PTR -_0234021C: .word FLOOR_GENERATION_STATUS -_02340220: .word 0x000001C2 - arm_func_end GenerateMonsterHouse - - arm_func_start GenerateMazeRoom -GenerateMazeRoom: ; 0x02340224 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #0x100 - ldr r7, _02340450 ; =DUNGEON_PTR - movs r8, r3 - mov r6, r0 - mov r5, r1 - mov r4, r2 - ldr r7, [r7] - beq _02340448 - mov r0, #0x64 - bl DungeonRandInt - cmp r8, r0 - ble _02340448 - add r0, r7, #0x4000 -#ifdef JAPAN - ldrsh r0, [r0, #0x3a] -#else - ldrsh r0, [r0, #0xde] -#endif - cmp r0, #0 - bge _02340448 - mov sb, #0 - mov r1, sb - b _02340310 -_02340274: - ldr r0, _02340454 ; =0x000001C2 - mov r2, #0 - mla r3, r1, r0, r6 - mov r7, #0x1e - b _02340304 -_02340288: - mla r0, r2, r7, r3 - ldrb r8, [r0, #8] - cmp r8, #0 - ldreqb r8, [r0, #0x11] - cmpeq r8, #0 - bne _02340300 - ldrb r8, [r0, #0xb] - cmp r8, #0 - ldrneb r8, [r0, #0xa] - cmpne r8, #0 - beq _02340300 - ldrb r8, [r0, #0xc] - cmp r8, #0 - ldreqb r8, [r0, #0xf] - cmpeq r8, #0 - ldreqb r8, [r0, #0xe] - cmpeq r8, #0 - ldreqb r8, [r0, #9] - cmpeq r8, #0 - bne _02340300 - ldrsh sl, [r0, #4] - ldrsh r8, [r0] - sub r8, sl, r8 - tst r8, #1 - beq _02340300 - ldrsh r8, [r0, #6] - ldrsh r0, [r0, #2] - sub r0, r8, r0 - tst r0, #1 - addne sb, sb, #1 -_02340300: - add r2, r2, #1 -_02340304: - cmp r2, r4 - blt _02340288 - add r1, r1, #1 -_02340310: - cmp r1, r5 - blt _02340274 - cmp sb, #0 - beq _02340448 - mov r1, #0 - mov sl, r1 - add r0, sp, #0 -_0234032C: - strb sl, [r0, r1] - add r1, r1, #1 - cmp r1, #0x100 - blt _0234032C - mov r0, #1 - strb r0, [sp] - add r7, sp, #0 -_02340348: - mov r0, sb - bl DungeonRandInt - mov r8, r0 - mov r0, sb - bl DungeonRandInt - add sl, sl, #1 - ldrb r2, [r7, r8] - ldrb r1, [r7, r0] - cmp sl, #0x40 - strb r1, [r7, r8] - strb r2, [r7, r0] - blt _02340348 - mov r7, #0 - mov r2, r7 - b _02340440 -_02340384: - ldr r0, _02340454 ; =0x000001C2 - mov r3, #0 - mla r1, r2, r0, r6 - add sl, sp, #0 - mov r8, #0x1e - b _02340434 -_0234039C: - mla r0, r3, r8, r1 - ldrb sb, [r0, #8] - cmp sb, #0 - ldreqb sb, [r0, #0x11] - cmpeq sb, #0 - bne _02340430 - ldrb sb, [r0, #0xb] - cmp sb, #0 - ldrneb sb, [r0, #0xa] - cmpne sb, #0 - beq _02340430 - ldrb sb, [r0, #0xc] - cmp sb, #0 - ldreqb sb, [r0, #0xf] - cmpeq sb, #0 - ldreqb sb, [r0, #0xe] - cmpeq sb, #0 - ldreqb sb, [r0, #9] - cmpeq sb, #0 - bne _02340430 - ldrsh ip, [r0, #4] - ldrsh sb, [r0] - sub sb, ip, sb - tst sb, #1 - beq _02340430 - ldrsh ip, [r0, #6] - ldrsh sb, [r0, #2] - sub sb, ip, sb - tst sb, #1 - beq _02340430 - ldrb sb, [sl, r7] - cmp sb, #0 - beq _0234042C - mov r1, #0 - bl GenerateMaze - b _02340448 -_0234042C: - add r7, r7, #1 -_02340430: - add r3, r3, #1 -_02340434: - cmp r3, r4 - blt _0234039C - add r2, r2, #1 -_02340440: - cmp r2, r5 - blt _02340384 -_02340448: - add sp, sp, #0x100 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_02340450: .word DUNGEON_PTR -_02340454: .word 0x000001C2 - arm_func_end GenerateMazeRoom - - arm_func_start GenerateMaze -GenerateMaze: ; 0x02340458 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - sub sp, sp, #0x10 - ldr r2, _023406D0 ; =FLOOR_GENERATION_STATUS - mov r3, #1 - mov r5, r0 - strb r3, [r2, #7] - strb r3, [r5, #0x10] - mov r4, r1 - ldrsh r0, [r5] - ldrsh r1, [r5, #2] - bl GetTile - ldrsh r1, [r5] - ldrb r7, [r0, #7] - add r6, r1, #1 - b _023404DC -_02340494: - ldrsh r1, [r5, #2] - mov r0, r6 - sub r1, r1, #1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _023404D8 - ldrsh r3, [r5, #2] - ldrsh r2, [r5, #4] - mov r0, r6 - sub r1, r3, #1 - str r2, [sp] - ldrsh r2, [r5, #6] - stmib sp, {r2, r4, r7} - ldrsh r2, [r5] - bl GenerateMazeLine -_023404D8: - add r6, r6, #2 -_023404DC: - ldrsh r0, [r5, #4] - sub r0, r0, #1 - cmp r6, r0 - blt _02340494 - ldrsh r0, [r5, #2] - add r6, r0, #1 - b _02340538 -_023404F8: - ldrsh r0, [r5, #4] - mov r1, r6 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _02340534 - ldrsh r0, [r5, #4] - mov r1, r6 - str r0, [sp] - ldrsh r2, [r5, #6] - stmib sp, {r2, r4, r7} - ldrsh r2, [r5] - ldrsh r3, [r5, #2] - bl GenerateMazeLine -_02340534: - add r6, r6, #2 -_02340538: - ldrsh r0, [r5, #6] - sub r0, r0, #1 - cmp r6, r0 - blt _023404F8 - ldrsh r0, [r5] - add r6, r0, #1 - b _02340594 -_02340554: - ldrsh r1, [r5, #6] - mov r0, r6 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _02340590 - ldrsh r1, [r5, #6] - ldrsh r2, [r5, #4] - mov r0, r6 - str r2, [sp] - stmib sp, {r1, r4, r7} - ldrsh r2, [r5] - ldrsh r3, [r5, #2] - bl GenerateMazeLine -_02340590: - add r6, r6, #2 -_02340594: - ldrsh r0, [r5, #4] - sub r0, r0, #1 - cmp r6, r0 - blt _02340554 - ldrsh r0, [r5, #2] - add r6, r0, #1 - b _023405F8 -_023405B0: - ldrsh r0, [r5] - mov r1, r6 - sub r0, r0, #1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _023405F4 - ldrsh r2, [r5] - ldrsh r3, [r5, #4] - mov r1, r6 - sub r0, r2, #1 - str r3, [sp] - ldrsh r3, [r5, #6] - stmib sp, {r3, r4, r7} - ldrsh r3, [r5, #2] - bl GenerateMazeLine -_023405F4: - add r6, r6, #2 -_023405F8: - ldrsh r0, [r5, #6] - sub r0, r0, #1 - cmp r6, r0 - blt _023405B0 - ldrsh r0, [r5] - add r8, r0, #3 - b _023406B8 -_02340614: - ldrsh r0, [r5, #2] - sub r6, r8, #1 - add sb, r0, #3 - b _023406A4 -_02340624: - mov r0, r8 - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _023406A0 - cmp r4, #0 - mov r0, r6 - mov r1, sb - beq _0234066C - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #2 - b _02340678 -_0234066C: - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 -_02340678: - strh r1, [r0] - ldrsh r2, [r5, #4] - mov r0, r8 - mov r1, sb - str r2, [sp] - ldrsh r2, [r5, #6] - stmib sp, {r2, r4, r7} - ldrsh r2, [r5] - ldrsh r3, [r5, #2] - bl GenerateMazeLine -_023406A0: - add sb, sb, #2 -_023406A4: - ldrsh r0, [r5, #6] - sub r0, r0, #3 - cmp sb, r0 - blt _02340624 - add r8, r8, #2 -_023406B8: - ldrsh r0, [r5, #4] - sub r0, r0, #3 - cmp r8, r0 - blt _02340614 - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_023406D0: .word FLOOR_GENERATION_STATUS - arm_func_end GenerateMaze - - arm_func_start GenerateMazeLine -GenerateMazeLine: ; 0x023406D4 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0xc - ldr r4, [sp, #0x34] - ldr fp, [sp, #0x30] - ldr r7, [sp, #0x38] - ldr r6, [sp, #0x3c] - str r4, [sp, #0x34] - mov sb, r0 - mov r8, r1 - str r2, [sp] - str r3, [sp, #4] -_02340700: - mov r0, #4 - bl DungeonRandInt - mov r4, r0 - mov r0, sb - mov r1, r8 - mov sl, #0 - bl GetTileSafe - mov r1, r7 - and r2, r6, #0xff - bl SetTerrainObstacleChecked - mvn r0, #1 - str r0, [sp, #8] -_02340730: - and r5, r4, #3 - cmp r5, #3 - addls pc, pc, r5, lsl #2 - b _02340774 -_02340740: ; jump table - b _02340750 ; case 0 - b _0234075C ; case 1 - b _02340768 ; case 2 - b _02340774 ; case 3 -_02340750: - mov r0, #2 - mov r2, #0 - b _0234077C -_0234075C: - mov r0, #0 - ldr r2, [sp, #8] - b _0234077C -_02340768: - ldr r0, [sp, #8] - mov r2, #0 - b _0234077C -_02340774: - mov r0, #0 - mov r2, #2 -_0234077C: - ldr r1, [sp] - add r0, sb, r0 - cmp r1, r0 - bgt _023407C4 - cmp fp, r0 - ble _023407C4 - add r1, r8, r2 - ldr r2, [sp, #4] - cmp r2, r1 - bgt _023407C4 - ldr r2, [sp, #0x34] - cmp r2, r1 - ble _023407C4 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _023407D8 -_023407C4: - add r4, r4, #1 - add sl, sl, #1 - cmp sl, #4 - blt _02340730 - b _02340874 -_023407D8: - cmp r5, #3 - addls pc, pc, r5, lsl #2 - b _02340700 -_023407E4: ; jump table - b _023407F4 ; case 0 - b _02340814 ; case 1 - b _02340834 ; case 2 - b _02340854 ; case 3 -_023407F4: - mov r1, r8 - add r0, sb, #1 - bl GetTileSafe - mov r1, r7 - and r2, r6, #0xff - bl SetTerrainObstacleChecked - add sb, sb, #2 - b _02340700 -_02340814: - mov r0, sb - sub r1, r8, #1 - bl GetTileSafe - mov r1, r7 - and r2, r6, #0xff - bl SetTerrainObstacleChecked - sub r8, r8, #2 - b _02340700 -_02340834: - mov r1, r8 - sub r0, sb, #1 - bl GetTileSafe - mov r1, r7 - and r2, r6, #0xff - bl SetTerrainObstacleChecked - sub sb, sb, #2 - b _02340700 -_02340854: - mov r0, sb - add r1, r8, #1 - bl GetTileSafe - mov r1, r7 - and r2, r6, #0xff - bl SetTerrainObstacleChecked - add r8, r8, #2 - b _02340700 -_02340874: - add sp, sp, #0xc - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - arm_func_end GenerateMazeLine - - arm_func_start SetSpawnFlag5 -SetSpawnFlag5: ; 0x0234087C - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - ldrsh r5, [r6] - b _023408C0 -_0234088C: - ldrsh r4, [r6, #2] - b _023408B0 -_02340894: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0, #2] - add r4, r4, #1 - orr r1, r1, #0x20 - strh r1, [r0, #2] -_023408B0: - ldrsh r0, [r6, #6] - cmp r4, r0 - blt _02340894 - add r5, r5, #1 -_023408C0: - ldrsh r0, [r6, #4] - cmp r5, r0 - blt _0234088C - ldmia sp!, {r4, r5, r6, pc} - arm_func_end SetSpawnFlag5 - - arm_func_start IsNextToHallway -IsNextToHallway: ; 0x023408D0 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mvn r5, #0 - mov sl, r0 - mov sb, r1 - mov r4, r5 - b _02340964 -_023408E8: - adds r8, sl, r5 - bmi _02340960 - cmp r8, #0x38 - bge _0234096C - mov r6, r4 - b _02340958 -_02340900: - adds r7, sb, r6 - bmi _02340954 - cmp r7, #0x20 - bge _02340960 - cmp r5, #0 - cmpne r6, #0 - bne _02340954 - mov r0, r8 - mov r1, r7 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _02340954 - mov r0, r8 - mov r1, r7 - bl GetTile - ldrb r0, [r0, #7] - cmp r0, #0xff - moveq r0, #1 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} -_02340954: - add r6, r6, #1 -_02340958: - cmp r6, #1 - ble _02340900 -_02340960: - add r5, r5, #1 -_02340964: - cmp r5, #1 - ble _023408E8 -_0234096C: - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end IsNextToHallway - - arm_func_start ResolveInvalidSpawns -ResolveInvalidSpawns: ; 0x02340974 - stmdb sp!, {r3, r4, r5, lr} - mov r5, #0 -_0234097C: - mov r4, #0 -_02340980: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0] - and r1, r1, #3 - cmp r1, #1 - beq _023409BC - ldrh r1, [r0] - tst r1, #0x110 - ldrneh r1, [r0, #2] - bicne r1, r1, #2 - strneh r1, [r0, #2] - ldrh r1, [r0, #2] - bic r1, r1, #4 - strh r1, [r0, #2] -_023409BC: - ldrh r1, [r0, #2] - tst r1, #1 - beq _023409E0 - ldrh r1, [r0] - orr r1, r1, #0x200 - strh r1, [r0] - ldrh r1, [r0, #2] - bic r1, r1, #4 - strh r1, [r0, #2] -_023409E0: - ldrh r1, [r0, #2] - add r4, r4, #1 - tst r1, #2 - bicne r1, r1, #4 - strneh r1, [r0, #2] - cmp r4, #0x20 - blt _02340980 - add r5, r5, #1 - cmp r5, #0x38 - blt _0234097C - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ResolveInvalidSpawns - - arm_func_start ConvertSecondaryTerrainToChasms -ConvertSecondaryTerrainToChasms: ; 0x02340A0C - stmdb sp!, {r4, r5, r6, lr} - mov r6, #0 - mov r4, r6 -_02340A18: - mov r5, r4 -_02340A1C: - mov r0, r6 - mov r1, r5 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #2 - bne _02340A5C - mov r0, r6 - mov r1, r5 - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #3 - strh r1, [r0] -_02340A5C: - add r5, r5, #1 - cmp r5, #0x20 - blt _02340A1C - add r6, r6, #1 - cmp r6, #0x38 - blt _02340A18 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end ConvertSecondaryTerrainToChasms - - arm_func_start EnsureImpassableTilesAreWalls -EnsureImpassableTilesAreWalls: ; 0x02340A78 - stmdb sp!, {r4, r5, r6, lr} - mov r6, #0 - mov r4, r6 -_02340A84: - mov r5, r4 -_02340A88: - mov r0, r6 - mov r1, r5 - bl GetTile - ldrh r0, [r0] - tst r0, #0x10 - beq _02340AB8 - mov r0, r6 - mov r1, r5 - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] -_02340AB8: - add r5, r5, #1 - cmp r5, #0x20 - blt _02340A88 - add r6, r6, #1 - cmp r6, #0x38 - blt _02340A84 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end EnsureImpassableTilesAreWalls - - arm_func_start InitializeTile -InitializeTile: ; 0x02340AD4 - mov r2, #0 - strh r2, [r0] - strh r2, [r0, #2] - mov r1, #0xff - strb r1, [r0, #7] - strh r2, [r0, #4] - strb r2, [r0, #8] - strb r2, [r0, #9] - strb r2, [r0, #0xa] - strb r2, [r0, #0xb] - strb r2, [r0, #6] - str r2, [r0, #0xc] - str r2, [r0, #0x10] - bx lr - arm_func_end InitializeTile - - arm_func_start ResetFloor -ResetFloor: ; 0x02340B0C -#ifdef JAPAN -#define RESET_FLOOR_OFFSET -0xA4 -#else -#define RESET_FLOOR_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov r6, #0 - mov r4, r6 -_02340B18: - mov r5, r4 - sub r7, r6, #1 -_02340B20: - mov r0, r6 - mov r1, r5 - bl GetTileSafe - bl InitializeTile - sub r8, r5, #1 - mov r0, r6 - mov r1, r8 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - mov r1, r8 - add r0, r6, #1 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - mov r1, r8 - add r0, r6, #1 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - add r0, r6, #1 - add r1, r5, #1 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - mov r0, r6 - add r1, r5, #1 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - mov r0, r7 - add r1, r5, #1 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - mov r0, r7 - mov r1, r5 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - mov r0, r7 - mov r1, r8 - bl PosIsOutOfBounds - cmp r0, #0 - beq _02340BEC -_02340BD4: - mov r0, r6 - mov r1, r5 - bl GetTileSafe - ldrh r1, [r0] - orr r1, r1, #0x10 - strh r1, [r0] -_02340BEC: - add r5, r5, #1 - cmp r5, #0x20 - blt _02340B20 - add r6, r6, #1 - cmp r6, #0x38 - blt _02340B18 - ldr r6, _02340CA8 ; =DUNGEON_PTR - mov sb, #0 - ldr r0, [r6] - mvn r1, #0 - add r0, r0, #0xcc00 - strh r1, [r0, #0xe4 + RESET_FLOOR_OFFSET] - ldr r0, [r6] - mov r7, sb - add r0, r0, #0xcc00 - strh r1, [r0, #0xe6 + RESET_FLOOR_OFFSET] - mov r4, #0x14 - mov r5, #0xa0 -_02340C34: - mul r8, sb, r5 - mov sl, r7 -_02340C3C: - ldr r0, [r6] -#ifdef JAPAN - add r0, r0, #0xbc - add r0, r0, #0xcc00 -#else - add r0, r0, #0xd60 - add r0, r0, #0xc000 -#endif - add r0, r0, r8 - mla r0, sl, r4, r0 - bl InitializeTile - add sl, sl, #1 - cmp sl, #8 - blt _02340C3C - add sb, sb, #1 - cmp sb, #8 - blt _02340C34 - ldr r1, _02340CA8 ; =DUNGEON_PTR - mov r3, #0 - ldr r0, [r1] - mov r2, r3 - add r0, r0, #0x3f00 - strh r3, [r0, #0xc0 + RESET_FLOOR_OFFSET] -_02340C84: - ldr r0, [r1] - add r0, r0, r3, lsl #2 - add r0, r0, #0x12000 - ldr r0, [r0, #0xcc8 + RESET_FLOOR_OFFSET] - add r3, r3, #1 - str r2, [r0] - cmp r3, #0x40 - blt _02340C84 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_02340CA8: .word DUNGEON_PTR - arm_func_end ResetFloor diff --git a/asm/overlay_29_0233CF84.s b/asm/overlay_29_0233CF84.s new file mode 100644 index 00000000..c9e495c1 --- /dev/null +++ b/asm/overlay_29_0233CF84.s @@ -0,0 +1,4451 @@ + .include "asm/macros.inc" + .include "overlay_29_0233CF84.inc" + + .text + + arm_func_start GetGridPositions +GetGridPositions: ; 0x0233CF84 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r4, #0 + mov sl, r0 + mov sb, r1 + mov r8, r2 + mov r7, r3 + mov r6, r4 + mov r5, #0x38 + b _0233CFC0 +_0233CFA8: + mov r0, r5 + mov r1, r8 + str r4, [sl, r6, lsl #2] + bl _s32_div_f + add r4, r4, r0 + add r6, r6, #1 +_0233CFC0: + cmp r6, r8 + blt _0233CFA8 + mov r6, #0 + str r4, [sl, r8, lsl #2] + mov r5, r6 + mov r4, #0x20 + b _0233CFF4 +_0233CFDC: + mov r0, r4 + mov r1, r7 + str r6, [sb, r5, lsl #2] + bl _s32_div_f + add r6, r6, r0 + add r5, r5, #1 +_0233CFF4: + cmp r5, r7 + blt _0233CFDC + str r6, [sb, r7, lsl #2] + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end GetGridPositions + + arm_func_start InitDungeonGrid +InitDungeonGrid: ; 0x0233D004 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + add r5, r1, r1, lsl #1 + mov r4, r5, asr #1 + add r3, r1, r1, lsr #31 + add ip, r5, r4, lsr #30 + mov r7, #0 + b _0233D0F0 +_0233D020: + ldr r4, _0233D0FC ; =0x000001C2 + mov r8, #0 + mla sb, r7, r4, r0 + mov r5, #1 + mov r4, r8 + mov r6, r5 + mov lr, r8 + b _0233D0E4 +_0233D040: + ldr sl, _0233D100 ; =FLOOR_GENERATION_STATUS + ldrb sl, [sl, #6] + cmp sl, #1 + bne _0233D064 + cmp r7, r3, asr #1 + movge sl, #0x1e + mlage sl, r8, sl, sb + strgeb r6, [sl, #8] + bge _0233D08C +_0233D064: + cmp sl, #2 + bne _0233D080 + cmp r7, ip, asr #2 + movge sl, #0x1e + mlage sl, r8, sl, sb + strgeb r5, [sl, #8] + bge _0233D08C +_0233D080: + mov sl, #0x1e + mla sl, r8, sl, sb + strb r4, [sl, #8] +_0233D08C: + mov fp, #1 + strb fp, [sl, #0xa] + strb lr, [sl, #0xb] + strb lr, [sl, #0xf] + and fp, lr, #0xff + strb fp, [sl, #0xe] + strb fp, [sl, #0xc] + strb lr, [sl, #0x16] + strb fp, [sl, #0x15] + strb fp, [sl, #0x14] + strb fp, [sl, #0x13] + strb lr, [sl, #0x1a] + strb fp, [sl, #0x19] + strb fp, [sl, #0x18] + strb fp, [sl, #0x17] + strb lr, [sl, #9] + strb lr, [sl, #0x11] + strb lr, [sl, #0x10] + strb lr, [sl, #0x12] + strb lr, [sl, #0x1c] + strb lr, [sl, #0x1d] + add r8, r8, #1 +_0233D0E4: + cmp r8, r2 + blt _0233D040 + add r7, r7, #1 +_0233D0F0: + cmp r7, r1 + blt _0233D020 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0233D0FC: .word 0x000001C2 +_0233D100: .word FLOOR_GENERATION_STATUS + arm_func_end InitDungeonGrid + + arm_func_start AssignRooms +AssignRooms: ; 0x0233D104 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x104 + mov sl, r0 + mov r4, r3 + mov r0, #3 + mov sb, r1 + mov r8, r2 + bl DungeonRandInt + cmp r4, #0 + rsblt r4, r4, #0 + addge r4, r4, r0 + mov r2, #0 + mov r1, #1 + add r0, sp, #4 + b _0233D148 +_0233D140: + strb r1, [r0, r2] + add r2, r2, #1 +_0233D148: + cmp r2, r4 + blt _0233D140 + mov r1, #0 + add r0, sp, #4 + b _0233D164 +_0233D15C: + strb r1, [r0, r2] + add r2, r2, #1 +_0233D164: + cmp r2, #0x100 + blt _0233D15C + mul r7, sb, r8 + mov r6, #0 + add r4, sp, #4 +_0233D178: + mov r0, r7 + bl DungeonRandInt + mov r5, r0 + mov r0, r7 + bl DungeonRandInt + add r6, r6, #1 + ldrb r2, [r4, r5] + ldrb r1, [r4, r0] + cmp r6, #0x40 + strb r1, [r4, r5] + strb r2, [r4, r0] + blt _0233D178 + ldr r0, _0233D310 ; =FLOOR_GENERATION_STATUS + mov fp, #0 + sub r1, sb, #1 + str fp, [r0, #0x14] + mov r3, fp + and r5, sb, #1 + add r0, r1, r1, lsr #31 + mov r2, fp + add lr, sp, #4 + b _0233D25C +_0233D1D0: + ldr r1, _0233D314 ; =0x000001C2 + mov r4, #0 + mla r6, r3, r1, sl + ldr r1, _0233D310 ; =FLOOR_GENERATION_STATUS + b _0233D250 +_0233D1E4: + mov r7, #0x1e + mla r7, r4, r7, r6 + ldrb ip, [r7, #8] + cmp ip, #0 + bne _0233D24C + ldr ip, [r1, #0x14] + cmp ip, #0x20 + strgeb r2, [r7, #0xa] + ldrb ip, [lr, fp] + cmp ip, #0 + beq _0233D240 + mov ip, #1 + strb ip, [r7, #0xa] + ldr ip, [r1, #0x14] + cmp r5, #0 + add ip, ip, #1 + str ip, [r1, #0x14] + beq _0233D248 + cmp r3, r0, asr #1 + cmpeq r4, #1 + moveq ip, #0 + streqb ip, [r7, #0xa] + b _0233D248 +_0233D240: + mov ip, #0 + strb ip, [r7, #0xa] +_0233D248: + add fp, fp, #1 +_0233D24C: + add r4, r4, #1 +_0233D250: + cmp r4, r8 + blt _0233D1E4 + add r3, r3, #1 +_0233D25C: + cmp r3, sb + blt _0233D1D0 + ldr r0, _0233D310 ; =FLOOR_GENERATION_STATUS + ldr r0, [r0, #0x14] + cmp r0, #2 + bge _0233D308 + mov r4, #0 + b _0233D2F4 +_0233D27C: + mov r0, #0 + str r0, [sp] + mov r6, r0 + b _0233D2DC +_0233D28C: + ldr r0, _0233D314 ; =0x000001C2 + mov r7, #0 + mla fp, r6, r0, sl + b _0233D2D0 +_0233D29C: + mov r0, #0x1e + mla r5, r7, r0, fp + ldrb r0, [r5, #8] + cmp r0, #0 + bne _0233D2CC + mov r0, #0x64 + bl DungeonRandInt + cmp r0, #0x3c + movlt r0, #1 + strlt r0, [sp] + strltb r0, [r5, #0xa] + blt _0233D2E4 +_0233D2CC: + add r7, r7, #1 +_0233D2D0: + cmp r7, r8 + blt _0233D29C + add r6, r6, #1 +_0233D2DC: + cmp r6, sb + blt _0233D28C +_0233D2E4: + ldr r0, [sp] + cmp r0, #0 + bne _0233D2FC + add r4, r4, #1 +_0233D2F4: + cmp r4, #0xc8 + blt _0233D27C +_0233D2FC: + ldr r0, _0233D310 ; =FLOOR_GENERATION_STATUS + mov r1, #0 + strb r1, [r0] +_0233D308: + add sp, sp, #0x104 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0233D310: .word FLOOR_GENERATION_STATUS +_0233D314: .word 0x000001C2 + arm_func_end AssignRooms + + arm_func_start CreateRoomsAndAnchors +CreateRoomsAndAnchors: ; 0x0233D318 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x30 + ldr r5, [sp, #0x5c] + str r0, [sp] + and r0, r5, #4 + str r0, [sp, #0x14] + ldr r0, [sp, #0x58] + mov r4, #0 + str r4, [sp, #0x1c] + str r1, [sp, #4] + str r2, [sp, #8] + str r3, [sp, #0xc] + str r0, [sp, #0x58] + b _0233D658 +_0233D350: + ldr r0, [sp] + mov r1, #0x1e + mla sb, r4, r1, r0 + ldr r0, [sp, #4] + mov sl, #0 + sub r0, r0, #1 + str r0, [sp, #0x28] + ldr r0, [sp, #8] + sub r0, r0, #1 + str r0, [sp, #0x2c] + ldr r0, [sp, #0x58] + add r0, r0, r4, lsl #2 + str r0, [sp, #0x20] + b _0233D648 +_0233D388: + ldr r0, [sp, #0xc] + ldr r3, [r0, sl, lsl #2] + ldr r0, [sp, #0x58] + add fp, r3, #2 + ldr r2, [r0, r4, lsl #2] + add r0, r2, #2 + str r0, [sp, #0x18] + ldr r0, [sp, #0xc] + add r0, r0, sl, lsl #2 + ldr r1, [r0, #4] + ldr r0, [sp, #0x20] + sub r1, r1, r3 + ldr r0, [r0, #4] + sub r5, r1, #4 + sub r0, r0, r2 + sub r6, r0, #3 + ldr r0, _0233D66C ; =0x000001C2 + mla r0, sl, r0, sb + str r0, [sp, #0x10] + ldrb r0, [r0, #8] + cmp r0, #0 + bne _0233D644 + ldr r0, [sp, #0x10] + ldrb r0, [r0, #0xa] + cmp r0, #0 + beq _0233D580 + mov r0, #5 + mov r1, r5 + bl DungeonRandRange + mov r7, r0 + mov r0, #4 + mov r1, r6 + bl DungeonRandRange + mov r8, r0 + orr r0, r7, #1 + cmp r0, r5 + movlt r7, r0 + orr r0, r8, #1 + cmp r0, r6 + movlt r8, r0 + add r0, r8, r8, lsl #1 + add r0, r0, r0, lsr #31 + cmp r7, r0, asr #1 + mov r0, r0, asr #1 + movgt r7, r0 + add r0, r7, r7, lsl #1 + add r0, r0, r0, lsr #31 + cmp r8, r0, asr #1 + mov r0, r0, asr #1 + movgt r8, r0 + sub r0, r5, r7 + bl DungeonRandInt + add r5, fp, r0 + sub r0, r6, r8 + bl DungeonRandInt + ldr r1, [sp, #0x18] + add fp, r5, r7 + add r6, r1, r0 + ldr r0, _0233D66C ; =0x000001C2 + add r7, r6, r8 + mul r0, sl, r0 + strh r5, [sb, r0] + add r0, sb, r0 + strh fp, [r0, #4] + strh r6, [r0, #2] + strh r7, [r0, #6] + ldr r0, [sp, #0x1c] + and r0, r0, #0xff + str r0, [sp, #0x24] + b _0233D4F0 +_0233D4A0: + mov r8, r6 + b _0233D4E4 +_0233D4A8: + mov r0, r5 + mov r1, r8 + bl GetTileSafe + ldrh r2, [r0] + mov r1, r8 + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #1 + strh r2, [r0] + mov r0, r5 + bl GetTileSafe + ldr r1, [sp, #0x24] + add r8, r8, #1 + strb r1, [r0, #7] +_0233D4E4: + cmp r8, r7 + blt _0233D4A8 + add r5, r5, #1 +_0233D4F0: + cmp r5, fp + blt _0233D4A0 + mov r5, #1 + mov r0, #0x64 + bl DungeonRandInt + cmp r0, #0x50 + movlt r0, r5 + movge r0, #0 + and r6, r0, #0xff + ldr r0, _0233D670 ; =FLOOR_GENERATION_STATUS + ldr r0, [r0, #0x18] + cmp r0, #0 + ldr r0, [sp, #0x14] + moveq r6, #0 + cmp r0, #0 + moveq r5, #0 + cmp r5, #0 + cmpne r6, #0 + beq _0233D550 + mov r0, #0x64 + bl DungeonRandInt + cmp r0, #0x32 + movlt r5, #0 + movge r6, #0 +_0233D550: + cmp r5, #0 + ldrne r0, [sp, #0x10] + movne r1, #1 + strneb r1, [r0, #0x1c] + cmp r6, #0 + ldrne r0, [sp, #0x10] + movne r1, #1 + strneb r1, [r0, #0x1d] + ldr r0, [sp, #0x1c] + add r0, r0, #1 + str r0, [sp, #0x1c] + b _0233D644 +_0233D580: + mov r2, #2 + ldr r0, [sp, #0x28] + mov r8, r2 + cmp sl, #0 + moveq r2, #1 + cmp r4, #0 + moveq r8, #1 + cmp sl, r0 + mov r1, #4 + mov r7, r1 + ldr r0, [sp, #0x2c] + moveq r1, #2 + cmp r4, r0 + add r0, fp, r2 + add r2, fp, r5 + sub r1, r2, r1 + moveq r7, #2 + bl DungeonRandRange + ldr r1, [sp, #0x18] + add r1, r1, r6 + mov r6, r0 + ldr r0, [sp, #0x18] + sub r1, r1, r7 + add r0, r0, r8 + bl DungeonRandRange + mov r5, r0 + ldr r0, _0233D66C ; =0x000001C2 + mul r0, sl, r0 + strh r6, [sb, r0] + add r1, sb, r0 + add r0, r6, #1 + strh r0, [r1, #4] + strh r5, [r1, #2] + add r0, r5, #1 + strh r0, [r1, #6] + mov r0, r6 + mov r1, r5 + bl GetTileSafe + ldrh r2, [r0] + mov r1, r5 + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #1 + strh r2, [r0] + mov r0, r6 + bl GetTileSafe + mov r1, #0xfe + strb r1, [r0, #7] +_0233D644: + add sl, sl, #1 +_0233D648: + ldr r0, [sp, #4] + cmp sl, r0 + blt _0233D388 + add r4, r4, #1 +_0233D658: + ldr r0, [sp, #8] + cmp r4, r0 + blt _0233D350 + add sp, sp, #0x30 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0233D66C: .word 0x000001C2 +_0233D670: .word FLOOR_GENERATION_STATUS + arm_func_end CreateRoomsAndAnchors + + arm_func_start GenerateSecondaryStructures +GenerateSecondaryStructures: ; 0x0233D674 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x2c + mov sl, r0 + mov r0, #0 + str r1, [sp] + str r2, [sp, #4] + str r0, [sp, #0x20] + b _0233E03C +_0233D694: + ldr r0, [sp, #0x20] + mov r1, #0x1e + mul r7, r0, r1 + mov r0, #0 + add r6, sl, r7 + str r0, [sp, #0x24] + b _0233E020 +_0233D6B0: + ldr r1, [sp, #0x24] + ldr r0, _0233E054 ; =0x000001C2 + mul sb, r1, r0 + add r8, r6, sb + ldrb r0, [r8, #8] + cmp r0, #0 + ldreqb r0, [r8, #0xe] + cmpeq r0, #0 + ldreqb r0, [r8, #0x12] + cmpeq r0, #0 + bne _0233E014 + ldrb r0, [r8, #0xa] + cmp r0, #0 + beq _0233E014 + ldrb r0, [r8, #0x1c] + cmp r0, #0 + bne _0233E014 + ldrb r0, [r8, #0x1d] + cmp r0, #0 + beq _0233E014 + mov r0, #6 + bl DungeonRandInt + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _0233E014 +_0233D714: ; jump table + b _0233E014 ; case 0 + b _0233DE94 ; case 1 + b _0233DDC8 ; case 2 + b _0233DC9C ; case 3 + b _0233D938 ; case 4 + b _0233D72C ; case 5 +_0233D72C: + ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS + ldr r0, [r0, #0x18] + cmp r0, #0 + beq _0233E014 + sub r1, r0, #1 + ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS + str r1, [r0, #0x18] + add r0, sl, sb + add r0, r0, r7 + bl SetSpawnFlag5 + mov r0, #2 + bl DungeonRandInt + cmp r0, #0 + mov r0, #0 + beq _0233D850 + str r0, [sp, #0x10] + mov r4, r8 + ldrsh r1, [r6, sb] + ldrsh r0, [r4, #4] + ldrsh r5, [r4, #2] + add r0, r1, r0 + add r0, r0, r0, lsr #31 + mov fp, r0, asr #1 + b _0233D7AC +_0233D78C: + mov r0, fp + mov r1, r5 + bl IsNextToHallway + cmp r0, #0 + movne r0, #1 + strne r0, [sp, #0x10] + bne _0233D7B8 + add r5, r5, #1 +_0233D7AC: + ldrsh r0, [r4, #6] + cmp r5, r0 + blt _0233D78C +_0233D7B8: + ldr r0, [sp, #0x10] + cmp r0, #0 + bne _0233E014 + ldrsh r5, [r4, #2] + b _0233D7F4 +_0233D7CC: + mov r0, fp + mov r1, r5 + bl GetTileSafe + ldrh r1, [r0] + add r5, r5, #1 + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #2 + strh r1, [r0] +_0233D7F4: + ldrsh r0, [r4, #6] + cmp r5, r0 + blt _0233D7CC + ldrsh sb, [r4] + b _0233D83C +_0233D808: + ldrsh r5, [r4, #2] + b _0233D82C +_0233D810: + mov r0, sb + mov r1, r5 + bl GetTileSafe + ldrh r1, [r0] + add r5, r5, #1 + orr r1, r1, #0x80 + strh r1, [r0] +_0233D82C: + ldrsh r0, [r4, #6] + cmp r5, r0 + blt _0233D810 + add sb, sb, #1 +_0233D83C: + cmp sb, fp + blt _0233D808 + mov r0, #1 + strb r0, [r8, #9] + b _0233E014 +_0233D850: + str r0, [sp, #0x14] + mov r4, r8 + ldrsh r1, [r4, #2] + ldrsh r0, [r4, #6] + ldrsh r5, [r6, sb] + add r0, r1, r0 + add r0, r0, r0, lsr #31 + mov fp, r0, asr #1 + b _0233D894 +_0233D874: + mov r0, r5 + mov r1, fp + bl IsNextToHallway + cmp r0, #0 + movne r0, #1 + strne r0, [sp, #0x14] + bne _0233D8A0 + add r5, r5, #1 +_0233D894: + ldrsh r0, [r4, #4] + cmp r5, r0 + blt _0233D874 +_0233D8A0: + ldr r0, [sp, #0x14] + cmp r0, #0 + bne _0233E014 + ldrsh r5, [r4] + b _0233D8DC +_0233D8B4: + mov r0, r5 + mov r1, fp + bl GetTileSafe + ldrh r1, [r0] + add r5, r5, #1 + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #2 + strh r1, [r0] +_0233D8DC: + ldrsh r0, [r4, #4] + cmp r5, r0 + blt _0233D8B4 + ldrsh sb, [r4, #2] + b _0233D924 +_0233D8F0: + ldrsh r5, [r4] + b _0233D914 +_0233D8F8: + mov r0, r5 + mov r1, sb + bl GetTileSafe + ldrh r1, [r0] + add r5, r5, #1 + orr r1, r1, #0x80 + strh r1, [r0] +_0233D914: + ldrsh r0, [r4, #4] + cmp r5, r0 + blt _0233D8F8 + add sb, sb, #1 +_0233D924: + cmp sb, fp + blt _0233D8F0 + mov r0, #1 + strb r0, [r8, #9] + b _0233E014 +_0233D938: + mov r1, r8 + ldrsh r4, [r6, sb] + ldrsh r3, [r1, #4] + sub r0, r3, r4 + cmp r0, #6 + ldrgesh r2, [r1, #2] + ldrgesh r1, [r1, #6] + subge r0, r1, r2 + cmpge r0, #6 + blt _0233E014 + add r0, r4, r3 + add r0, r0, r0, lsr #31 + mov r5, r0, asr #1 + ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS + add r1, r2, r1 + ldr r0, [r0, #0x18] + add r1, r1, r1, lsr #31 + mov r4, r1, asr #1 + cmp r0, #0 + beq _0233E014 + sub r1, r0, #1 + ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS + str r1, [r0, #0x18] + add r0, sl, sb + add r0, r0, r7 + bl SetSpawnFlag5 + sub r0, r4, #2 + str r0, [sp, #0xc] + sub r0, r5, #2 + ldr r1, [sp, #0xc] + str r0, [sp, #8] + bl GetTileSafe + ldrh r2, [r0] + sub fp, r5, #1 + ldr r1, [sp, #0xc] + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #6 + strh r2, [r0] + mov r0, fp + bl GetTileSafe + ldrh r2, [r0] + ldr r1, [sp, #0xc] + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #6 + strh r2, [r0] + mov r0, r5 + bl GetTileSafe + ldrh r2, [r0] + ldr r1, [sp, #0xc] + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #6 + strh r2, [r0] + add r0, r5, #1 + bl GetTileSafe + ldrh r1, [r0] + sub sb, r4, #1 + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #6 + strh r1, [r0] + ldr r0, [sp, #8] + mov r1, sb + bl GetTileSafe + ldrh r2, [r0] + mov r1, r4 + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #6 + strh r2, [r0] + ldr r0, [sp, #8] + bl GetTileSafe + ldrh r2, [r0] + add r1, r4, #1 + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #6 + strh r2, [r0] + ldr r0, [sp, #8] + bl GetTileSafe + ldrh r2, [r0] + add r1, r4, #1 + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #6 + strh r2, [r0] + ldr r0, [sp, #8] + bl GetTileSafe + ldrh r2, [r0] + add r1, r4, #1 + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #6 + strh r2, [r0] + mov r0, fp + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #2 + strh r1, [r0] + ldrh r2, [r0] + add r1, r4, #1 + orr r2, r2, #4 + strh r2, [r0] + mov r0, r5 + bl GetTileSafe + ldrh r2, [r0] + ldr r1, [sp, #0xc] + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #6 + strh r2, [r0] + add r0, r5, #1 + bl GetTileSafe + ldrh r2, [r0] + mov r1, sb + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #6 + strh r2, [r0] + add r0, r5, #1 + bl GetTileSafe + ldrh r2, [r0] + mov r1, r4 + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #6 + strh r2, [r0] + add r0, r5, #1 + bl GetTileSafe + ldrh r2, [r0] + add r1, r4, #1 + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #6 + strh r2, [r0] + add r0, r5, #1 + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r2, [r0] + mov r1, sb + orr r2, r2, #6 + strh r2, [r0] + mov r0, fp + bl GetTileSafe + ldrh r2, [r0, #2] + mov r1, sb + orr r2, r2, #4 + strh r2, [r0, #2] + mov r0, fp + bl GetTileSafe + ldrh r2, [r0, #2] + mov r1, sb + orr r2, r2, #0x40 + strh r2, [r0, #2] + mov r0, r5 + bl GetTileSafe + ldrh r2, [r0, #2] + mov r1, r4 + orr r2, r2, #2 + strh r2, [r0, #2] + mov r0, fp + bl GetTileSafe + ldrh r2, [r0, #2] + mov r1, r4 + orr r2, r2, #2 + strh r2, [r0, #2] + mov r0, r5 + bl GetTileSafe + ldrh r2, [r0, #2] + mov r1, sb + orr r2, r2, #2 + strh r2, [r0, #2] + mov r0, fp + bl GetTileSafe + ldrh r2, [r0, #2] + mov r1, sb + orr r2, r2, #0x10 + strh r2, [r0, #2] + mov r0, r5 + bl GetTileSafe + ldrh r2, [r0, #2] + mov r1, r4 + orr r2, r2, #0x10 + strh r2, [r0, #2] + mov r0, fp + bl GetTileSafe + ldrh r2, [r0, #2] + mov r1, r4 + orr r2, r2, #0x10 + strh r2, [r0, #2] + mov r0, r5 + bl GetTileSafe + ldrh r1, [r0, #2] + orr r1, r1, #0x10 + strh r1, [r0, #2] + mov r0, #1 + strb r0, [r8, #9] + b _0233E014 +_0233DC9C: + mov r4, r8 + ldrsh r3, [r6, sb] + ldrsh r2, [r4, #4] + sub r0, r2, r3 + cmp r0, #5 + ldrgesh r1, [r4, #6] + ldrgesh r0, [r4, #2] + subge r0, r1, r0 + cmpge r0, #5 + blt _0233E014 + add r0, r3, #2 + sub r1, r2, #3 + bl DungeonRandRange + ldrsh r1, [r4, #6] + str r0, [sp, #0x28] + mov r5, r0 + ldrsh r0, [r4, #2] + sub r1, r1, #3 + add r0, r0, #2 + bl DungeonRandRange + str r0, [sp, #0x18] + ldrsh r0, [r4] + ldrsh r1, [r4, #4] + add r0, r0, #2 + sub r1, r1, #3 + bl DungeonRandRange + str r0, [sp, #0x1c] + ldrsh r0, [r4, #2] + ldrsh r1, [r4, #6] + add r0, r0, #2 + sub r1, r1, #3 + bl DungeonRandRange + mov fp, r0 + ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS + ldr r0, [r0, #0x18] + cmp r0, #0 + beq _0233E014 + sub r1, r0, #1 + ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS + str r1, [r0, #0x18] + add r0, sl, sb + add r0, r0, r7 + bl SetSpawnFlag5 + ldr r1, [sp, #0x28] + ldr r0, [sp, #0x1c] + cmp r1, r0 + movgt r5, r0 + movgt r0, r1 + strgt r0, [sp, #0x1c] + ldr r0, [sp, #0x18] + cmp r0, fp + strgt fp, [sp, #0x18] + movgt fp, r0 + b _0233DDB0 +_0233DD74: + ldr r4, [sp, #0x18] + b _0233DDA4 +_0233DD7C: + mov r0, r5 + mov r1, r4 + bl GetTileSafe + ldrh r1, [r0] + add r4, r4, #1 + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #2 + strh r1, [r0] +_0233DDA4: + cmp r4, fp + ble _0233DD7C + add r5, r5, #1 +_0233DDB0: + ldr r0, [sp, #0x1c] + cmp r5, r0 + ble _0233DD74 + mov r0, #1 + strb r0, [r8, #9] + b _0233E014 +_0233DDC8: + mov r2, r8 + ldrsh r1, [r2, #4] + ldrsh r0, [r6, sb] + sub r0, r1, r0 + tst r0, #1 + beq _0233E014 + ldrsh r1, [r2, #6] + ldrsh r0, [r2, #2] + sub r0, r1, r0 + tst r0, #1 + ldrne r0, _0233E058 ; =FLOOR_GENERATION_STATUS + ldrne r0, [r0, #0x18] + cmpne r0, #0 + beq _0233E014 + sub r1, r0, #1 + ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS + str r1, [r0, #0x18] + add r0, sl, sb + add r0, r0, r7 + bl SetSpawnFlag5 + mov r5, #0 +_0233DE1C: + ldrsh r1, [r8, #4] + ldrsh r0, [r8] + sub r0, r1, r0 + bl DungeonRandInt + mov r4, r0 + ldrsh r1, [r8, #6] + ldrsh r0, [r8, #2] + sub r0, r1, r0 + bl DungeonRandInt + mov r2, r0 + add r0, r4, r2 + tst r0, #1 + beq _0233DE7C + ldrsh r0, [r8] + ldrsh r1, [r8, #2] + add r0, r0, r4 + add r1, r1, r2 + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #2 + strh r1, [r0] +_0233DE7C: + add r5, r5, #1 + cmp r5, #0x40 + blt _0233DE1C + mov r0, #1 + strb r0, [r8, #9] + b _0233E014 +_0233DE94: + ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS + ldr r0, [r0, #0x18] + cmp r0, #0 + beq _0233E014 + sub r1, r0, #1 + ldr r0, _0233E058 ; =FLOOR_GENERATION_STATUS + str r1, [r0, #0x18] + mov r0, r8 + ldrsh r2, [r0, #4] + ldrsh r1, [r6, sb] + sub r3, r2, r1 + tst r3, #1 + beq _0233DEDC + ldrsh r2, [r0, #6] + ldrsh r1, [r0, #2] + sub r1, r2, r1 + tst r1, #1 + bne _0233DFF4 +_0233DEDC: + cmp r3, #5 + ldrsh r4, [r0] + ldrsh r3, [r0, #4] + ldrsh r2, [r0, #6] + ldrsh r1, [r0, #2] + add r0, r4, r3 + add r0, r0, r0, lsr #31 + mov r4, r0, asr #1 + add r0, r1, r2 + add r0, r0, r0, lsr #31 + mov r5, r0, asr #1 + subge r0, r2, r1 + cmpge r0, #5 + blt _0233DFCC + add r0, r4, #1 + mov r1, r5 + bl GetTileSafe + ldrh r2, [r0] + add r1, r5, #1 + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #2 + strh r2, [r0] + mov r0, r4 + bl GetTileSafe + ldrh r2, [r0] + mov r1, r5 + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #2 + strh r2, [r0] + sub r0, r4, #1 + bl GetTileSafe + ldrh r2, [r0] + sub r1, r5, #1 + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #2 + strh r2, [r0] + mov r0, r4 + bl GetTileSafe + mov r1, r5 + ldrh r2, [r0] + bic r2, r2, #3 + strh r2, [r0] + ldrh r2, [r0] + orr r2, r2, #2 + strh r2, [r0] + mov r0, r4 + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #2 + strh r1, [r0] + b _0233E00C +_0233DFCC: + mov r0, r4 + mov r1, r5 + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #2 + strh r1, [r0] + b _0233E00C +_0233DFF4: + add r4, sl, sb + add r0, r4, r7 + bl SetSpawnFlag5 + add r0, r4, r7 + mov r1, #1 + bl GenerateMaze +_0233E00C: + mov r0, #1 + strb r0, [r8, #9] +_0233E014: + ldr r0, [sp, #0x24] + add r0, r0, #1 + str r0, [sp, #0x24] +_0233E020: + ldr r1, [sp, #0x24] + ldr r0, [sp] + cmp r1, r0 + blt _0233D6B0 + ldr r0, [sp, #0x20] + add r0, r0, #1 + str r0, [sp, #0x20] +_0233E03C: + ldr r1, [sp, #0x20] + ldr r0, [sp, #4] + cmp r1, r0 + blt _0233D694 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0233E054: .word 0x000001C2 +_0233E058: .word FLOOR_GENERATION_STATUS + arm_func_end GenerateSecondaryStructures + + arm_func_start AssignGridCellConnections +AssignGridCellConnections: ; 0x0233E05C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x10 + ldr r4, [sp, #0x3c] + mov r8, r1 + mov r1, r4 + ldrb r1, [r1, #5] + mov sb, r0 + mov r0, #4 + str r4, [sp, #0x3c] + mov fp, r2 + mov r7, r3 + ldr r5, [sp, #0x38] + str r1, [sp, #4] + bl DungeonRandInt + mov r6, r0 + mov sl, #0 + b _0233E208 +_0233E0A0: + mov r0, #8 + bl DungeonRandInt + mov r4, r0 + mov r0, #4 + bl DungeonRandInt + mov lr, #1 + cmp r4, #4 + movlt r6, r0 + sub r1, r8, #1 + sub r0, fp, #1 + mov ip, lr + mov r3, #0 +_0233E0D0: + and r2, r6, #3 + mov r4, r3 + cmp r2, #3 + addls pc, pc, r2, lsl #2 + b _0233E130 +_0233E0E4: ; jump table + b _0233E0F4 ; case 0 + b _0233E104 ; case 1 + b _0233E114 ; case 2 + b _0233E124 ; case 3 +_0233E0F4: + cmp r7, r1 + movlt r4, ip + addge r6, r6, #1 + b _0233E130 +_0233E104: + cmp r5, #0 + movgt r4, lr + addle r6, r6, #1 + b _0233E130 +_0233E114: + cmp r7, #0 + movgt r4, #1 + addle r6, r6, #1 + b _0233E130 +_0233E124: + cmp r5, r0 + movlt r4, #1 + addge r6, r6, #1 +_0233E130: + cmp r4, #0 + beq _0233E0D0 + and r0, r6, #3 + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0233E204 +_0233E148: ; jump table + b _0233E158 ; case 0 + b _0233E184 ; case 1 + b _0233E1B0 ; case 2 + b _0233E1DC ; case 3 +_0233E158: + ldr r0, _0233E438 ; =0x000001C2 + mov r1, #0x1e + mla r0, r7, r0, sb + mla r1, r5, r1, r0 + ldrb r0, [r1, #0x1ca] + cmp r0, #0 + moveq r0, #1 + streqb r0, [r1, #0x16] + streqb r0, [r1, #0x1d7] + addeq r7, r7, #1 + b _0233E204 +_0233E184: + ldr r0, _0233E438 ; =0x000001C2 + mov r1, #0x1e + mla r0, r7, r0, sb + mla r1, r5, r1, r0 + ldrb r0, [r1, #-0x16] + cmp r0, #0 + moveq r0, #1 + streqb r0, [r1, #0x13] + streqb r0, [r1, #-0xa] + subeq r5, r5, #1 + b _0233E204 +_0233E1B0: + ldr r0, _0233E438 ; =0x000001C2 + mov r1, #0x1e + mla r0, r7, r0, sb + mla r1, r5, r1, r0 + ldrb r0, [r1, #-0x1ba] + cmp r0, #0 + moveq r0, #1 + streqb r0, [r1, #0x15] + streqb r0, [r1, #-0x1ac] + subeq r7, r7, #1 + b _0233E204 +_0233E1DC: + ldr r0, _0233E438 ; =0x000001C2 + mov r1, #0x1e + mla r0, r7, r0, sb + mla r1, r5, r1, r0 + ldrb r0, [r1, #0x26] + cmp r0, #0 + moveq r0, #1 + streqb r0, [r1, #0x14] + streqb r0, [r1, #0x31] + addeq r5, r5, #1 +_0233E204: + add sl, sl, #1 +_0233E208: + ldr r0, [sp, #4] + cmp sl, r0 + blt _0233E0A0 + ldr r0, [sp, #0x3c] + ldrb r0, [r0, #0xb] + cmp r0, #0 + bne _0233E430 +_0233E224: + sub r0, r8, #1 + mov r6, #0 + str r0, [sp, #8] + sub r0, fp, #1 + str r6, [sp] + str r0, [sp, #0xc] + b _0233E41C +_0233E240: + ldr r0, _0233E438 ; =0x000001C2 + mov r7, #0 + mla sl, r6, r0, sb + b _0233E410 +_0233E250: + mov r1, #0x1e + mla r5, r7, r1, sl + ldrb r1, [r5, #8] + mov r0, #0 + cmp r1, #0 + ldreqb r1, [r5, #0xa] + cmpeq r1, #0 + bne _0233E40C + ldrb r1, [r5, #0x13] + cmp r1, #0 + ldrb r1, [r5, #0x14] + addne r0, r0, #1 + cmp r1, #0 + ldrb r1, [r5, #0x15] + addne r0, r0, #1 + cmp r1, #0 + ldrb r1, [r5, #0x16] + addne r0, r0, #1 + cmp r1, #0 + addne r0, r0, #1 + cmp r0, #1 + bne _0233E40C + mov r4, #0 + mov r0, #4 + bl DungeonRandInt + mov r1, r4 + b _0233E370 +_0233E2BC: + and r2, r0, #3 + mov r4, #0 + cmp r2, #3 + addls pc, pc, r2, lsl #2 + b _0233E364 +_0233E2D0: ; jump table + b _0233E2E0 ; case 0 + b _0233E304 ; case 1 + b _0233E324 ; case 2 + b _0233E344 ; case 3 +_0233E2E0: + ldr r2, [sp, #8] + cmp r6, r2 + bge _0233E2FC + ldrb r2, [r5, #0x16] + cmp r2, #0 + moveq r4, #1 + beq _0233E364 +_0233E2FC: + add r0, r0, #1 + b _0233E364 +_0233E304: + cmp r7, #0 + ble _0233E31C + ldrb r2, [r5, #0x13] + cmp r2, #0 + moveq r4, #1 + beq _0233E364 +_0233E31C: + add r0, r0, #1 + b _0233E364 +_0233E324: + cmp r6, #0 + ble _0233E33C + ldrb r2, [r5, #0x15] + cmp r2, #0 + moveq r4, #1 + beq _0233E364 +_0233E33C: + add r0, r0, #1 + b _0233E364 +_0233E344: + ldr r2, [sp, #0xc] + cmp r7, r2 + bge _0233E360 + ldrb r2, [r5, #0x14] + cmp r2, #0 + moveq r4, #1 + beq _0233E364 +_0233E360: + add r0, r0, #1 +_0233E364: + cmp r4, #0 + bne _0233E378 + add r1, r1, #1 +_0233E370: + cmp r1, #8 + blt _0233E2BC +_0233E378: + cmp r4, #0 + beq _0233E40C + and r0, r0, #3 + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0233E40C +_0233E390: ; jump table + b _0233E3A0 ; case 0 + b _0233E3BC ; case 1 + b _0233E3D8 ; case 2 + b _0233E3F4 ; case 3 +_0233E3A0: + ldrb r0, [r5, #0x1ca] + cmp r0, #0 + moveq r0, #1 + streqb r0, [r5, #0x16] + streqb r0, [r5, #0x1d7] + streq r0, [sp] + b _0233E40C +_0233E3BC: + ldrb r0, [r5, #0x1ca] + cmp r0, #0 + moveq r0, #1 + streqb r0, [r5, #0x13] + streqb r0, [r5, #-0xa] + streq r0, [sp] + b _0233E40C +_0233E3D8: + ldrb r0, [r5, #0x1ca] + cmp r0, #0 + moveq r0, #1 + streqb r0, [r5, #0x15] + streqb r0, [r5, #-0x1ac] + streq r0, [sp] + b _0233E40C +_0233E3F4: + ldrb r0, [r5, #0x1ca] + cmp r0, #0 + moveq r0, #1 + streqb r0, [r5, #0x14] + streqb r0, [r5, #0x31] + streq r0, [sp] +_0233E40C: + add r7, r7, #1 +_0233E410: + cmp r7, fp + blt _0233E250 + add r6, r6, #1 +_0233E41C: + cmp r6, r8 + blt _0233E240 + ldr r0, [sp] + cmp r0, #0 + bne _0233E224 +_0233E430: + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0233E438: .word 0x000001C2 + arm_func_end AssignGridCellConnections + + arm_func_start CreateGridCellConnections +CreateGridCellConnections: ; 0x0233E43C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x48 + str r0, [sp, #0xc] + str r1, [sp, #0x10] + str r2, [sp, #0x14] + mov sb, r3 + ldr r8, [sp, #0x70] + mov r5, #0 + b _0233E510 +_0233E460: + ldr r1, _0233ED30 ; =0x000001C2 + ldr r0, [sp, #0xc] + mov r6, #0 + mla r7, r5, r1, r0 + ldr r0, [sp, #0x10] + mov r3, r6 + sub r1, r0, #1 + ldr r0, [sp, #0x14] + mov r2, r6 + sub r0, r0, #1 + mov ip, r6 + mov lr, r6 + mov r4, r6 + b _0233E500 +_0233E498: + mov sl, #0x1e + mla sl, r6, sl, r7 + ldrb fp, [sl, #8] + cmp fp, #0 + strneb r4, [sl, #0x17] + strneb r4, [sl, #0x18] + strneb r4, [sl, #0x19] + strneb r4, [sl, #0x1a] + bne _0233E4FC + cmp r5, #0 + strleb r3, [sl, #0x15] + cmp r6, #0 + strleb r2, [sl, #0x13] + cmp r5, r1 + strgeb ip, [sl, #0x16] + cmp r6, r0 + strgeb lr, [sl, #0x14] + ldrb fp, [sl, #0x13] + strb fp, [sl, #0x17] + ldrb fp, [sl, #0x14] + strb fp, [sl, #0x18] + ldrb fp, [sl, #0x15] + strb fp, [sl, #0x19] + ldrb fp, [sl, #0x16] + strb fp, [sl, #0x1a] +_0233E4FC: + add r6, r6, #1 +_0233E500: + ldr sl, [sp, #0x14] + cmp r6, sl + blt _0233E498 + add r5, r5, #1 +_0233E510: + ldr r0, [sp, #0x10] + cmp r5, r0 + blt _0233E460 + mov r6, #0 + b _0233E800 +_0233E524: + ldr r1, _0233ED30 ; =0x000001C2 + ldr r0, [sp, #0xc] + mov r7, #0 + mla r4, r6, r1, r0 + add r0, sb, r6, lsl #2 + str r0, [sp, #0x2c] + b _0233E7F0 +_0233E540: + mov r0, #0x1e + mla r5, r7, r0, r4 + ldrb r0, [r5, #8] + cmp r0, #0 + bne _0233E7EC + ldrb r0, [r5, #0xa] + cmp r0, #0 + ldreqsh fp, [r5] + ldreqsh sl, [r5, #2] + beq _0233E598 + ldrsh r0, [r5] + ldrsh r1, [r5, #4] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange + mov fp, r0 + ldrsh r0, [r5, #2] + ldrsh r1, [r5, #6] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange + mov sl, r0 +_0233E598: + ldrb r0, [r5, #0x17] + cmp r0, #0 + beq _0233E624 + ldrb r0, [r5, #-0x16] + cmp r0, #0 + bne _0233E60C + ldrb r0, [r5, #-0x14] + cmp r0, #0 + ldreqsh r2, [r5, #-0x1e] + beq _0233E5D8 + ldrsh r0, [r5, #-0x1e] + ldrsh r1, [r5, #-0x1a] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange + mov r2, r0 +_0233E5D8: + mov r0, #1 + str r0, [sp] + mov r0, #0x1e + mla r3, r7, r0, r4 + ldr r1, [sb, r6, lsl #2] + mov r0, fp + str r1, [sp, #4] + ldr r1, [r8, r7, lsl #2] + str r1, [sp, #8] + ldrsh r1, [r3, #2] + ldrsh r3, [r3, #-0x18] + sub r3, r3, #1 + bl CreateHallway +_0233E60C: + mov r0, #0 + strb r0, [r5, #0x17] + strb r0, [r5, #-6] + mov r0, #1 + strb r0, [r5, #0xb] + strb r0, [r5, #-0x13] +_0233E624: + ldrb r0, [r5, #0x18] + cmp r0, #0 + beq _0233E6B8 + ldrb r0, [r5, #0x26] + cmp r0, #0 + bne _0233E6A0 + ldrb r0, [r5, #0x28] + cmp r0, #0 + ldreqsh r2, [r5, #0x1e] + beq _0233E664 + ldrsh r0, [r5, #0x1e] + ldrsh r1, [r5, #0x22] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange + mov r2, r0 +_0233E664: + mov r1, #1 + str r1, [sp] + mov r0, fp + mov r1, #0x1e + ldr fp, [sb, r6, lsl #2] + mla r1, r7, r1, r4 + add r3, r8, r7, lsl #2 + str fp, [sp, #4] + ldr r3, [r3, #4] + sub r3, r3, #1 + str r3, [sp, #8] + ldrsh fp, [r1, #6] + ldrsh r3, [r1, #0x20] + sub r1, fp, #1 + bl CreateHallway +_0233E6A0: + mov r0, #0 + strb r0, [r5, #0x18] + strb r0, [r5, #0x35] + mov r0, #1 + strb r0, [r5, #0xb] + strb r0, [r5, #0x29] +_0233E6B8: + ldrb r0, [r5, #0x19] + cmp r0, #0 + beq _0233E750 + ldrb r0, [r5, #-0x1ba] + cmp r0, #0 + bne _0233E738 + ldrb r0, [r5, #-0x1b8] + cmp r0, #0 + sub r0, r5, #0x100 + ldreqsh r3, [r0, #-0xc0] + beq _0233E6FC + ldrsh r1, [r0, #-0xbc] + ldrsh r2, [r0, #-0xc0] + sub r1, r1, #1 + add r0, r2, #1 + bl DungeonRandRange + mov r3, r0 +_0233E6FC: + mov r0, #0 + str r0, [sp] + mov r0, #0x1e + mul r0, r7, r0 + ldr fp, [sb, r6, lsl #2] + add r1, r4, r0 + str fp, [sp, #4] + ldr fp, [r8, r7, lsl #2] + sub r2, r1, #0x100 + str fp, [sp, #8] + ldrsh r2, [r2, #-0xc2] + ldrsh r0, [r4, r0] + mov r1, sl + sub r2, r2, #1 + bl CreateHallway +_0233E738: + mov r0, #0 + strb r0, [r5, #0x19] + strb r0, [r5, #-0x1a8] + mov r0, #1 + strb r0, [r5, #0xb] + strb r0, [r5, #-0x1b7] +_0233E750: + ldrb r0, [r5, #0x1a] + cmp r0, #0 + beq _0233E7EC + ldrb r0, [r5, #0x1ca] + cmp r0, #0 + bne _0233E7D4 + ldrb r0, [r5, #0x1cc] + cmp r0, #0 + add r0, r5, #0x100 + ldreqsh r3, [r0, #0xc4] + beq _0233E794 + ldrsh r1, [r0, #0xc8] + ldrsh r2, [r0, #0xc4] + sub r1, r1, #1 + add r0, r2, #1 + bl DungeonRandRange + mov r3, r0 +_0233E794: + mov r0, #0 + str r0, [sp] + mov r0, #0x1e + ldr r2, [sp, #0x2c] + mov r1, sl + ldr sl, [r2, #4] + mla r0, r7, r0, r4 + sub sl, sl, #1 + str sl, [sp, #4] + ldr sl, [r8, r7, lsl #2] + add r2, r0, #0x100 + str sl, [sp, #8] + ldrsh r0, [r0, #4] + ldrsh r2, [r2, #0xc2] + sub r0, r0, #1 + bl CreateHallway +_0233E7D4: + mov r0, #0 + strb r0, [r5, #0x1a] + strb r0, [r5, #0x1db] + mov r0, #1 + strb r0, [r5, #0xb] + strb r0, [r5, #0x1cd] +_0233E7EC: + add r7, r7, #1 +_0233E7F0: + ldr r0, [sp, #0x14] + cmp r7, r0 + blt _0233E540 + add r6, r6, #1 +_0233E800: + ldr r0, [sp, #0x10] + cmp r6, r0 + blt _0233E524 + ldrb r0, [sp, #0x74] + cmp r0, #0 + bne _0233ED28 + mov r7, #0 + b _0233ED1C +_0233E820: + ldr r1, _0233ED30 ; =0x000001C2 + ldr r0, [sp, #0xc] + mov r8, #0 + mla r0, r7, r1, r0 + str r0, [sp, #0x20] + ldr r0, [sp, #0x14] + sub r0, r0, #2 + str r0, [sp, #0x40] + ldr r0, [sp, #0x10] + sub r0, r0, #2 + str r0, [sp, #0x38] + b _0233ED0C +_0233E850: + mov r0, #0x64 + bl DungeonRandInt + cmp r0, #5 + bge _0233ED08 + ldr r0, [sp, #0x20] + mov r1, #0x1e + mla r6, r8, r1, r0 + ldrb r0, [r6, #8] + cmp r0, #0 + bne _0233ED08 + ldrb r0, [r6, #0xb] + cmp r0, #0 + beq _0233ED08 + ldrb r0, [r6, #0x12] + cmp r0, #0 + ldreqb r0, [r6, #9] + cmpeq r0, #0 + bne _0233ED08 + ldrb r0, [r6, #0xa] + cmp r0, #0 + beq _0233ED08 + mov r0, #4 + bl DungeonRandInt + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0233ED08 +_0233E8B8: ; jump table + b _0233E8C8 ; case 0 + b _0233E9DC ; case 1 + b _0233EAE4 ; case 2 + b _0233EBFC ; case 3 +_0233E8C8: + cmp r7, #1 + blt _0233ED08 + ldrb r0, [r6, #-0x1b7] + cmp r0, #0 + beq _0233ED08 + ldrb r0, [r6, #-0x1ba] + cmp r0, #0 + bne _0233ED08 + ldrb r0, [r6, #-0x1b8] + cmp r0, #0 + beq _0233ED08 + ldrb r0, [r6, #-0x1b9] + cmp r0, #0 + ldreqb r0, [r6, #-0x1b0] + cmpeq r0, #0 + bne _0233ED08 + sub r1, r6, #0x100 + ldrsh r0, [r1, #-0xc2] + ldrsh fp, [r1, #-0xc0] + ldrsh r1, [r6, #2] + str r0, [sp, #0x28] + sub r0, r6, #0x100 + ldrsh sb, [r0, #-0xbc] + ldrsh r2, [r6, #6] + cmp fp, r1 + movge fp, r1 + cmp sb, r2 + ldrsh r0, [r6] + ldrsh sl, [r6, #4] + movle sb, r2 + bl GetTile + ldrb r0, [r0, #7] + ldr r5, [sp, #0x28] + and r0, r0, #0xff + str r0, [sp, #0x30] + b _0233E99C +_0233E958: + mov r4, fp + b _0233E990 +_0233E960: + mov r0, r5 + mov r1, r4 + bl GetTileSafe + ldrh r1, [r0] + add r4, r4, #1 + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + ldr r1, [sp, #0x30] + strb r1, [r0, #7] +_0233E990: + cmp r4, sb + blt _0233E960 + add r5, r5, #1 +_0233E99C: + cmp r5, sl + blt _0233E958 + ldr r0, [sp, #0x28] + sub r1, r6, #0x100 + strh r0, [r1, #-0xc2] + strh sl, [r1, #-0xbe] + strh fp, [r1, #-0xc0] + strh sb, [r1, #-0xbc] + mov r0, #1 + strb r0, [r6, #0x12] + strb r0, [r6, #-0x1b0] + mov r0, #0 + strb r0, [r6, #0xb] + mov r0, #1 + strb r0, [r6, #0x11] + b _0233ED08 +_0233E9DC: + cmp r8, #1 + blt _0233ED08 + ldrb r0, [r6, #-0x13] + cmp r0, #0 + beq _0233ED08 + ldrb r0, [r6, #-0x16] + cmp r0, #0 + bne _0233ED08 + ldrb r0, [r6, #-0x14] + cmp r0, #0 + beq _0233ED08 + ldrb r0, [r6, #-0x15] + cmp r0, #0 + ldreqb r0, [r6, #-0xc] + cmpeq r0, #0 + bne _0233ED08 + ldrsh r1, [r6, #-0x1c] + ldrsh r0, [r6] + ldrsh fp, [r6, #-0x1e] + str r1, [sp, #0x24] + ldrsh r1, [r6, #4] + ldrsh sb, [r6, #-0x1a] + cmp fp, r0 + movge fp, r0 + cmp sb, r1 + movle sb, r1 + ldrsh r1, [r6, #2] + ldrsh sl, [r6, #6] + bl GetTile + ldrb r0, [r0, #7] + mov r5, fp + and r0, r0, #0xff + str r0, [sp, #0x34] + b _0233EAA8 +_0233EA64: + ldr r4, [sp, #0x24] + b _0233EA9C +_0233EA6C: + mov r0, r5 + mov r1, r4 + bl GetTileSafe + ldrh r1, [r0] + add r4, r4, #1 + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + ldr r1, [sp, #0x34] + strb r1, [r0, #7] +_0233EA9C: + cmp r4, sl + blt _0233EA6C + add r5, r5, #1 +_0233EAA8: + cmp r5, sb + blt _0233EA64 + strh fp, [r6, #-0x1e] + ldr r0, [sp, #0x24] + strh sb, [r6, #-0x1a] + strh r0, [r6, #-0x1c] + strh sl, [r6, #-0x18] + mov r0, #1 + strb r0, [r6, #0x12] + strb r0, [r6, #-0xc] + mov r0, #0 + strb r0, [r6, #0xb] + mov r0, #1 + strb r0, [r6, #0x11] + b _0233ED08 +_0233EAE4: + ldr r0, [sp, #0x38] + cmp r7, r0 + bgt _0233ED08 + ldrb r0, [r6, #0x1cd] + cmp r0, #0 + beq _0233ED08 + ldrb r0, [r6, #0x1ca] + cmp r0, #0 + bne _0233ED08 + ldrb r0, [r6, #0x1cc] + cmp r0, #0 + beq _0233ED08 + ldrb r0, [r6, #0x1cb] + cmp r0, #0 + ldreqb r0, [r6, #0x1d4] + cmpeq r0, #0 + bne _0233ED08 + add r0, r6, #0x100 + ldrsh sl, [r6] + ldrsh r0, [r0, #0xc4] + str r0, [sp, #0x1c] + ldrsh r1, [r6, #2] + mov r0, r0 + cmp r1, r0 + strlt r1, [sp, #0x1c] + add r0, r6, #0x100 + ldrsh fp, [r0, #0xc6] + ldrsh r0, [r0, #0xc8] + ldrsh sb, [r6, #6] + cmp sb, r0 + movle sb, r0 + mov r0, sl + bl GetTile + ldrb r0, [r0, #7] + mov r5, sl + and r0, r0, #0xff + str r0, [sp, #0x3c] + b _0233EBC0 +_0233EB7C: + ldr r4, [sp, #0x1c] + b _0233EBB4 +_0233EB84: + mov r0, r5 + mov r1, r4 + bl GetTileSafe + ldrh r1, [r0] + add r4, r4, #1 + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + ldr r1, [sp, #0x3c] + strb r1, [r0, #7] +_0233EBB4: + cmp r4, sb + blt _0233EB84 + add r5, r5, #1 +_0233EBC0: + cmp r5, fp + blt _0233EB7C + strh sl, [r6] + strh fp, [r6, #4] + ldr r0, [sp, #0x1c] + strh r0, [r6, #2] + strh sb, [r6, #6] + mov r0, #1 + strb r0, [r6, #0x1d4] + strb r0, [r6, #0x12] + mov r0, #0 + strb r0, [r6, #0x1cd] + mov r0, #1 + strb r0, [r6, #0x1d3] + b _0233ED08 +_0233EBFC: + ldr r0, [sp, #0x40] + cmp r8, r0 + bgt _0233ED08 + ldrb r0, [r6, #0x29] + cmp r0, #0 + beq _0233ED08 + ldrb r0, [r6, #0x26] + cmp r0, #0 + bne _0233ED08 + ldrb r0, [r6, #0x28] + cmp r0, #0 + beq _0233ED08 + ldrb r0, [r6, #0x27] + cmp r0, #0 + ldreqb r0, [r6, #0x30] + cmpeq r0, #0 + bne _0233ED08 + ldrsh r0, [r6, #0x1e] + str r0, [sp, #0x18] + ldrsh r0, [r6] + ldr r1, [sp, #0x18] + cmp r0, r1 + strlt r0, [sp, #0x18] + ldrsh sl, [r6, #2] + ldrsh r1, [r6, #0x22] + ldrsh sb, [r6, #4] + ldrsh fp, [r6, #0x24] + cmp sb, r1 + movle sb, r1 + mov r1, sl + bl GetTile + ldrb r0, [r0, #7] + ldr r5, [sp, #0x18] + and r0, r0, #0xff + str r0, [sp, #0x44] + b _0233ECD0 +_0233EC8C: + mov r4, sl + b _0233ECC4 +_0233EC94: + mov r0, r5 + mov r1, r4 + bl GetTileSafe + ldrh r1, [r0] + add r4, r4, #1 + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + ldr r1, [sp, #0x44] + strb r1, [r0, #7] +_0233ECC4: + cmp r4, fp + blt _0233EC94 + add r5, r5, #1 +_0233ECD0: + cmp r5, sb + blt _0233EC8C + ldr r0, [sp, #0x18] + strh r0, [r6] + strh sb, [r6, #4] + strh sl, [r6, #2] + strh fp, [r6, #6] + mov r0, #1 + strb r0, [r6, #0x30] + strb r0, [r6, #0x12] + mov r0, #0 + strb r0, [r6, #0x29] + mov r0, #1 + strb r0, [r6, #0x2f] +_0233ED08: + add r8, r8, #1 +_0233ED0C: + ldr r0, [sp, #0x14] + cmp r8, r0 + blt _0233E850 + add r7, r7, #1 +_0233ED1C: + ldr r0, [sp, #0x10] + cmp r7, r0 + blt _0233E820 +_0233ED28: + add sp, sp, #0x48 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0233ED30: .word 0x000001C2 + arm_func_end CreateGridCellConnections + + arm_func_start GenerateRoomImperfections +GenerateRoomImperfections: ; 0x0233ED34 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x34 + str r0, [sp] + str r1, [sp, #4] + str r2, [sp, #8] + mov fp, #0 + b _0233F100 +_0233ED50: + ldr r1, _0233F114 ; =0x000001C2 + ldr r0, [sp] + mov sl, #0 + mla r0, fp, r1, r0 + str r0, [sp, #0xc] + mvn r0, #0 + str r0, [sp, #0x30] + b _0233F0F0 +_0233ED70: + ldr r0, [sp, #0xc] + mov r1, #0x1e + mla sb, sl, r1, r0 + ldrb r0, [sb, #8] + cmp r0, #0 + ldreqb r0, [sb, #0x11] + cmpeq r0, #0 + ldreqb r0, [sb, #0x12] + cmpeq r0, #0 + bne _0233F0EC + ldrb r0, [sb, #0xb] + cmp r0, #0 + ldrneb r0, [sb, #0xa] + cmpne r0, #0 + beq _0233F0EC + ldrb r0, [sb, #9] + cmp r0, #0 + ldreqb r0, [sb, #0x10] + cmpeq r0, #0 + bne _0233F0EC + ldrb r0, [sb, #0x1c] + cmp r0, #0 + beq _0233F0EC + mov r0, #0x64 + bl DungeonRandInt + cmp r0, #0x3c + blt _0233F0EC + ldrsh r3, [sb, #4] + ldrsh r2, [sb] + ldrsh r1, [sb, #6] + ldrsh r0, [sb, #2] + sub r2, r3, r2 + sub r0, r1, r0 + add r1, r2, r0 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + movs r0, r0, asr #2 + str r0, [sp, #0x24] + moveq r0, #1 + streq r0, [sp, #0x24] + mov r0, #0 + str r0, [sp, #0x2c] + b _0233F0DC +_0233EE1C: + mov r4, #0 +_0233EE20: + mov r0, #4 + bl DungeonRandInt + str r0, [sp, #0x20] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0233EE48 +_0233EE38: ; jump table + b _0233EE48 ; case 0 + b _0233EE70 ; case 1 + b _0233EE9C ; case 2 + b _0233EECC ; case 3 +_0233EE48: + cmp r4, #0 + movne r0, #1 + strne r0, [sp, #0x28] + movne r5, #0 + moveq r0, #0 + ldrsh r8, [sb] + ldrsh r7, [sb, #2] + streq r0, [sp, #0x28] + moveq r5, #1 + b _0233EEF4 +_0233EE70: + ldrsh r0, [sb, #4] + cmp r4, #0 + movne r5, #1 + sub r8, r0, #1 + movne r0, #0 + strne r0, [sp, #0x28] + ldreq r0, [sp, #0x30] + ldrsh r7, [sb, #2] + streq r0, [sp, #0x28] + moveq r5, #0 + b _0233EEF4 +_0233EE9C: + ldrsh r0, [sb, #6] + cmp r4, #0 + ldrsh r1, [sb, #4] + sub r7, r0, #1 + ldrne r0, [sp, #0x30] + movne r5, #0 + strne r0, [sp, #0x28] + moveq r0, #0 + sub r8, r1, #1 + streq r0, [sp, #0x28] + ldreq r5, [sp, #0x30] + b _0233EEF4 +_0233EECC: + ldrsh r0, [sb, #6] + cmp r4, #0 + ldrne r5, [sp, #0x30] + sub r7, r0, #1 + movne r0, #0 + strne r0, [sp, #0x28] + moveq r0, #1 + ldrsh r8, [sb] + streq r0, [sp, #0x28] + moveq r5, #0 +_0233EEF4: + mov r6, #0 + b _0233F0BC +_0233EEFC: + ldrsh r0, [sb] + cmp r8, r0 + blt _0233F0C4 + ldrsh r0, [sb, #4] + cmp r8, r0 + bge _0233F0C4 + ldrsh r0, [sb, #2] + cmp r7, r0 + blt _0233F0C4 + ldrsh r0, [sb, #6] + cmp r7, r0 + bge _0233F0C4 + mov r0, r8 + mov r1, r7 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + bne _0233F0AC + mov r5, #0 + b _0233F014 +_0233EF50: + ldr r0, _0233F118 ; =DIRECTIONS_XY + mov r1, r5, lsl #2 + ldrsh r2, [r0, r1] + add r0, r0, r5, lsl #2 + ldrsh r1, [r0, #2] + add r0, r8, r2 + str r0, [sp, #0x1c] + mov r0, #0 + str r0, [sp, #0x10] + add r0, r7, r1 + str r0, [sp, #0x18] + ldr r6, [sp, #0x30] + b _0233EFFC +_0233EF84: + ldr r0, [sp, #0x30] + str r0, [sp, #0x14] + b _0233EFE0 +_0233EF90: + ldr r1, [sp, #0x1c] + ldr r0, [sp, #0x14] + add r0, r1, r0 + ldr r1, [sp, #0x18] + add r1, r1, r6 + bl GetTile + ldrh r1, [r0] + and r1, r1, #3 + cmp r1, #1 + bne _0233EFD4 + ldrb r0, [r0, #7] + cmp r0, #0xff + moveq r0, #1 + streq r0, [sp, #0x10] + ldr r0, [sp, #0x10] + cmp r0, #0 + bne _0233EFEC +_0233EFD4: + ldr r0, [sp, #0x14] + add r0, r0, #1 + str r0, [sp, #0x14] +_0233EFE0: + ldr r0, [sp, #0x14] + cmp r0, #1 + ble _0233EF90 +_0233EFEC: + ldr r0, [sp, #0x10] + cmp r0, #0 + bne _0233F004 + add r6, r6, #1 +_0233EFFC: + cmp r6, #1 + ble _0233EF84 +_0233F004: + ldr r0, [sp, #0x10] + cmp r0, #0 + bne _0233F01C + add r5, r5, #1 +_0233F014: + cmp r5, #8 + blt _0233EF50 +_0233F01C: + cmp r5, #8 + bne _0233F0C4 + ldr r1, _0233F11C ; =CORNER_CARDINAL_NEIGHBOR_IS_OPEN + ldr r0, [sp, #0x20] + mov r5, #0 + add r6, r1, r0, lsl #3 + b _0233F080 +_0233F038: + ldr r0, _0233F118 ; =DIRECTIONS_XY + mov r1, r5, lsl #2 + ldrsh r2, [r0, r1] + add r0, r0, r5, lsl #2 + ldrsh r1, [r0, #2] + add r0, r8, r2 + add r1, r7, r1 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + moveq r0, #1 + movne r0, #0 + and r1, r0, #0xff + ldrb r0, [r5, r6] + cmp r1, r0 + bne _0233F088 + add r5, r5, #2 +_0233F080: + cmp r5, #8 + blt _0233F038 +_0233F088: + cmp r5, #8 + bne _0233F0C4 + mov r0, r8 + mov r1, r7 + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + b _0233F0C4 +_0233F0AC: + ldr r0, [sp, #0x28] + add r7, r7, r5 + add r8, r8, r0 + add r6, r6, #1 +_0233F0BC: + cmp r6, #0xa + blt _0233EEFC +_0233F0C4: + add r4, r4, #1 + cmp r4, #2 + blt _0233EE20 + ldr r0, [sp, #0x2c] + add r0, r0, #1 + str r0, [sp, #0x2c] +_0233F0DC: + ldr r1, [sp, #0x2c] + ldr r0, [sp, #0x24] + cmp r1, r0 + blt _0233EE1C +_0233F0EC: + add sl, sl, #1 +_0233F0F0: + ldr r0, [sp, #8] + cmp sl, r0 + blt _0233ED70 + add fp, fp, #1 +_0233F100: + ldr r0, [sp, #4] + cmp fp, r0 + blt _0233ED50 + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0233F114: .word 0x000001C2 +_0233F118: .word DIRECTIONS_XY +_0233F11C: .word CORNER_CARDINAL_NEIGHBOR_IS_OPEN + arm_func_end GenerateRoomImperfections + + arm_func_start CreateHallway +CreateHallway: ; 0x0233F120 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldrb r6, [sp, #0x28] + mov sl, r0 + ldr r0, [sp, #0x30] + mov sb, r1 + cmp r6, #0 + mov r8, r2 + mov r7, r3 + mov r4, sl + mov r5, sb + ldr fp, [sp, #0x2c] + str r0, [sp, #0x30] + mov r6, #0 + beq _0233F328 + b _0233F1C4 +_0233F15C: + cmp r6, #0x38 + add r6, r6, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _0233F1AC + mov r0, sl + mov r1, sb + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233F1B4 +_0233F1AC: + cmp sb, r5 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F1B4: + ldr r0, [sp, #0x30] + cmp sb, r0 + addlt sb, sb, #1 + subge sb, sb, #1 +_0233F1C4: + ldr r0, [sp, #0x30] + cmp sb, r0 + bne _0233F15C + mov r6, #0 + b _0233F240 +_0233F1D8: + cmp r6, #0x38 + add r6, r6, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _0233F228 + mov r0, sl + mov r1, sb + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233F234 +_0233F228: + cmp sl, r4 + cmpeq sb, r5 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F234: + cmp sl, r8 + addlt sl, sl, #1 + subge sl, sl, #1 +_0233F240: + cmp sl, r8 + bne _0233F1D8 + mov r6, #0 + b _0233F2B8 +_0233F250: + cmp r6, #0x38 + add r6, r6, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _0233F2A0 + mov r0, sl + mov r1, sb + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233F2AC +_0233F2A0: + cmp sl, r4 + cmpeq sb, r5 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F2AC: + cmp sb, r7 + addlt sb, sb, #1 + subge sb, sb, #1 +_0233F2B8: + cmp sb, r7 + bne _0233F250 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F2C4: + cmp r6, #0x38 + add r6, r6, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _0233F314 + mov r0, sl + mov r1, sb + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233F31C +_0233F314: + cmp sl, r4 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F31C: + cmp sl, fp + addlt sl, sl, #1 + subge sl, sl, #1 +_0233F328: + cmp sl, fp + bne _0233F2C4 + mov r6, #0 + b _0233F3A0 +_0233F338: + cmp r6, #0x38 + add r6, r6, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _0233F388 + mov r0, sl + mov r1, sb + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233F394 +_0233F388: + cmp sl, r4 + cmpeq sb, r5 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F394: + cmp sb, r7 + addlt sb, sb, #1 + subge sb, sb, #1 +_0233F3A0: + cmp sb, r7 + bne _0233F338 + mov r6, #0 + b _0233F418 +_0233F3B0: + cmp r6, #0x38 + add r6, r6, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _0233F400 + mov r0, sl + mov r1, sb + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233F40C +_0233F400: + cmp sl, r4 + cmpeq sb, r5 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F40C: + cmp sl, r8 + addlt sl, sl, #1 + subge sl, sl, #1 +_0233F418: + cmp sl, r8 + bne _0233F3B0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end CreateHallway + + arm_func_start EnsureConnectedGrid +EnsureConnectedGrid: ; 0x0233F424 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x2c + str r0, [sp, #0xc] + mov r7, r1 + mov fp, r2 + mov r6, r3 + ldr r5, [sp, #0x50] + mov r8, #0 + b _0233F818 +_0233F448: + ldr r1, _0233F8FC ; =0x000001C2 + ldr r0, [sp, #0xc] + mov r4, #0 + mla sb, r8, r1, r0 + sub r0, fp, #1 + str r0, [sp, #0x20] + add r0, r6, r8, lsl #2 + str r0, [sp, #0x28] + sub r0, r7, #1 + str r0, [sp, #0x24] + b _0233F80C +_0233F474: + mov r0, #0x1e + mla sl, r4, r0, sb + ldrb r0, [sl, #8] + cmp r0, #0 + ldreqb r0, [sl, #0x11] + cmpeq r0, #0 + ldreqb r0, [sl, #0xb] + cmpeq r0, #0 + bne _0233F808 + ldrb r0, [sl, #0xa] + cmp r0, #0 + beq _0233F7CC + ldrb r0, [sl, #9] + cmp r0, #0 + bne _0233F7CC + ldrsh r0, [sl] + ldrsh r1, [sl, #4] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange + str r0, [sp, #0x1c] + ldrsh r0, [sl, #2] + ldrsh r1, [sl, #6] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange + str r0, [sp, #0x18] + cmp r4, #0 + ble _0233F590 + ldrb r0, [sl, #-0x16] + cmp r0, #0 + ldreqb r0, [sl, #-0xc] + cmpeq r0, #0 + bne _0233F590 + ldrb r0, [sl, #-0x13] + cmp r0, #0 + beq _0233F590 + ldrb r0, [sl, #-0x14] + cmp r0, #0 + ldrsh r0, [sl, #-0x1e] + streq r0, [sp, #0x14] + beq _0233F544 + ldrsh r1, [sl, #-0x1a] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange + str r0, [sp, #0x14] + ldrsh r0, [sl, #-0x1c] + ldrsh r1, [sl, #-0x18] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange +_0233F544: + mov r1, #1 + str r1, [sp] + mov r1, #0x1e + mla sl, r4, r1, sb + ldr r1, [r6, r8, lsl #2] + ldr r0, [sp, #0x1c] + str r1, [sp, #4] + ldr r1, [r5, r4, lsl #2] + ldr r2, [sp, #0x14] + str r1, [sp, #8] + ldrsh r3, [sl, #-0x18] + ldrsh r1, [sl, #2] + sub r3, r3, #1 + bl CreateHallway + mov r0, #1 + strb r0, [sl, #0xb] + strb r0, [sl, #0x13] + strb r0, [sl, #-0xa] + b _0233F808 +_0233F590: + ldr r0, [sp, #0x20] + cmp r4, r0 + bge _0233F64C + ldrb r0, [sl, #0x26] + cmp r0, #0 + ldreqb r0, [sl, #0x30] + cmpeq r0, #0 + bne _0233F64C + ldrb r0, [sl, #0x29] + cmp r0, #0 + beq _0233F64C + ldrb r0, [sl, #0x28] + cmp r0, #0 + ldrsh r0, [sl, #0x1e] + streq r0, [sp, #0x10] + beq _0233F5F8 + ldrsh r1, [sl, #0x22] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange + str r0, [sp, #0x10] + ldrsh r0, [sl, #0x20] + ldrsh r1, [sl, #0x24] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange +_0233F5F8: + mov r1, #1 + str r1, [sp] + mov r1, #0x1e + mla sl, r4, r1, sb + ldr r3, [r6, r8, lsl #2] + add r1, r5, r4, lsl #2 + str r3, [sp, #4] + ldr r1, [r1, #4] + ldr r0, [sp, #0x1c] + sub r1, r1, #1 + str r1, [sp, #8] + ldrsh r1, [sl, #6] + ldrsh r3, [sl, #0x20] + ldr r2, [sp, #0x10] + sub r1, r1, #1 + bl CreateHallway + mov r0, #1 + strb r0, [sl, #0xb] + strb r0, [sl, #0x14] + strb r0, [sl, #0x31] + b _0233F808 +_0233F64C: + cmp r8, #0 + ble _0233F708 + ldrb r0, [sl, #-0x1ba] + cmp r0, #0 + ldreqb r0, [sl, #-0x1b0] + cmpeq r0, #0 + bne _0233F708 + ldrb r0, [sl, #-0x1b7] + cmp r0, #0 + beq _0233F708 + ldrb r0, [sl, #-0x1b8] + cmp r0, #0 + sub r0, sl, #0x100 + ldreqsh r3, [r0, #-0xc0] + beq _0233F6B8 + ldrsh r1, [r0, #-0xbe] + ldrsh r2, [r0, #-0xc2] + sub r1, r1, #1 + add r0, r2, #1 + bl DungeonRandRange + sub r0, sl, #0x100 + ldrsh r1, [r0, #-0xbc] + ldrsh r2, [r0, #-0xc0] + sub r1, r1, #1 + add r0, r2, #1 + bl DungeonRandRange + mov r3, r0 +_0233F6B8: + mov r0, #0 + str r0, [sp] + mov r0, #0x1e + mul r0, r4, r0 + ldr ip, [r6, r8, lsl #2] + add sl, sb, r0 + str ip, [sp, #4] + ldr ip, [r5, r4, lsl #2] + sub r2, sl, #0x100 + str ip, [sp, #8] + ldrsh r2, [r2, #-0xc2] + ldrsh r0, [sb, r0] + ldr r1, [sp, #0x18] + sub r2, r2, #1 + bl CreateHallway + mov r0, #1 + strb r0, [sl, #0xb] + strb r0, [sl, #0x15] + strb r0, [sl, #-0x1ac] + b _0233F808 +_0233F708: + ldr r0, [sp, #0x24] + cmp r8, r0 + bge _0233F808 + ldrb r0, [sl, #0x1ca] + cmp r0, #0 + ldreqb r0, [sl, #0x1d4] + cmpeq r0, #0 + bne _0233F808 + ldrb r0, [sl, #0x1cd] + cmp r0, #0 + beq _0233F808 + ldrb r0, [sl, #0x1cc] + cmp r0, #0 + add r0, sl, #0x100 + ldreqsh r3, [r0, #0xc4] + beq _0233F778 + ldrsh r1, [r0, #0xc6] + ldrsh r2, [r0, #0xc2] + sub r1, r1, #1 + add r0, r2, #1 + bl DungeonRandRange + add r0, sl, #0x100 + ldrsh r1, [r0, #0xc8] + ldrsh r2, [r0, #0xc4] + sub r1, r1, #1 + add r0, r2, #1 + bl DungeonRandRange + mov r3, r0 +_0233F778: + mov r0, #0 + str r0, [sp] + mov r0, #0x1e + mla sl, r4, r0, sb + ldr r0, [sp, #0x28] + ldr r1, [sp, #0x18] + ldr r2, [r0, #4] + add r0, sl, #0x100 + sub r2, r2, #1 + str r2, [sp, #4] + ldr r2, [r5, r4, lsl #2] + str r2, [sp, #8] + ldrsh r2, [r0, #0xc2] + ldrsh r0, [sl, #4] + sub r0, r0, #1 + bl CreateHallway + mov r0, #1 + strb r0, [sl, #0xb] + strb r0, [sl, #0x16] + strb r0, [sl, #0x1d7] + b _0233F808 +_0233F7CC: + ldrsh r0, [sl] + ldrsh r1, [sl, #2] + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0, #2] + bic r1, r1, #1 + strh r1, [r0, #2] + ldrh r1, [r0, #2] + bic r1, r1, #2 + strh r1, [r0, #2] + ldrh r1, [r0, #2] + bic r1, r1, #4 + strh r1, [r0, #2] +_0233F808: + add r4, r4, #1 +_0233F80C: + cmp r4, fp + blt _0233F474 + add r8, r8, #1 +_0233F818: + cmp r8, r7 + blt _0233F448 + mov r8, #0 + b _0233F8EC +_0233F828: + ldr r1, _0233F8FC ; =0x000001C2 + ldr r0, [sp, #0xc] + mov sb, #0 + mla sl, r8, r1, r0 + b _0233F8E0 +_0233F83C: + mov r0, #0x1e + mla r5, sb, r0, sl + ldrb r0, [r5, #8] + cmp r0, #0 + ldreqb r0, [r5, #0x11] + cmpeq r0, #0 + ldreqb r0, [r5, #0xb] + cmpeq r0, #0 + ldreqb r0, [r5, #0xf] + cmpeq r0, #0 + bne _0233F8DC + ldrsh r6, [r5] + b _0233F8D0 +_0233F870: + ldrsh r4, [r5, #2] + b _0233F8C0 +_0233F878: + mov r0, r6 + mov r1, r4 + bl GetTileSafe + ldrh r1, [r0] + add r4, r4, #1 + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0, #2] + bic r1, r1, #2 + strh r1, [r0, #2] + ldrh r1, [r0, #2] + bic r1, r1, #1 + strh r1, [r0, #2] + ldrh r1, [r0, #2] + bic r1, r1, #4 + strh r1, [r0, #2] + mov r1, #0xff + strb r1, [r0, #7] +_0233F8C0: + ldrsh r0, [r5, #6] + cmp r4, r0 + blt _0233F878 + add r6, r6, #1 +_0233F8D0: + ldrsh r0, [r5, #4] + cmp r6, r0 + blt _0233F870 +_0233F8DC: + add sb, sb, #1 +_0233F8E0: + cmp sb, fp + blt _0233F83C + add r8, r8, #1 +_0233F8EC: + cmp r8, r7 + blt _0233F828 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0233F8FC: .word 0x000001C2 + arm_func_end EnsureConnectedGrid + + arm_func_start SetTerrainObstacleChecked +SetTerrainObstacleChecked: ; 0x0233F900 + ldrh r3, [r0] + cmp r1, #0 + bic r1, r3, #3 + strh r1, [r0] + bxeq lr + ldrb r1, [r0, #7] + cmp r1, r2 + bxne lr + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #2 + strh r1, [r0] + bx lr + arm_func_end SetTerrainObstacleChecked + + arm_func_start FinalizeJunctions +FinalizeJunctions: ; 0x0233F93C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, #0 +_0233F944: + sub r5, r4, #1 + mov r6, #0 + mov r7, #0xff +_0233F950: + mov r0, r4 + mov r1, r6 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + bne _0233FAFC + mov r0, r4 + mov r1, r6 + bl GetTile + ldrb r0, [r0, #7] + cmp r0, #0xff + bne _0233FAD4 + cmp r4, #0 + ble _0233F9D4 + mov r0, r5 + mov r1, r6 + bl GetTileSafe + ldrb r1, [r0, #7] + cmp r1, #0xff + beq _0233F9D4 + ldrh r1, [r0] + orr r2, r1, #8 + and r1, r2, #3 + strh r2, [r0] + cmp r1, #2 + bne _0233F9D4 + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] +_0233F9D4: + cmp r6, #0 + ble _0233FA28 + mov r0, r4 + sub r1, r6, #1 + bl GetTileSafe + ldrb r1, [r0, #7] + cmp r1, #0xff + beq _0233FA28 + ldrh r1, [r0] + orr r1, r1, #8 + orr r2, r1, #8 + and r1, r2, #3 + strh r2, [r0] + cmp r1, #2 + bne _0233FA28 + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] +_0233FA28: + cmp r6, #0x1f + bge _0233FA7C + mov r0, r4 + add r1, r6, #1 + bl GetTileSafe + ldrb r1, [r0, #7] + cmp r1, #0xff + beq _0233FA7C + ldrh r1, [r0] + orr r1, r1, #8 + orr r2, r1, #8 + and r1, r2, #3 + strh r2, [r0] + cmp r1, #2 + bne _0233FA7C + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] +_0233FA7C: + cmp r4, #0x37 + bge _0233FAFC + mov r1, r6 + add r0, r4, #1 + bl GetTileSafe + ldrb r1, [r0, #7] + cmp r1, #0xff + beq _0233FAFC + ldrh r1, [r0] + orr r1, r1, #8 + orr r2, r1, #8 + and r1, r2, #3 + strh r2, [r0] + cmp r1, #2 + bne _0233FAFC + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233FAFC +_0233FAD4: + mov r0, r4 + mov r1, r6 + bl GetTile + ldrb r0, [r0, #7] + cmp r0, #0xfe + bne _0233FAFC + mov r0, r4 + mov r1, r6 + bl GetTileSafe + strb r7, [r0, #7] +_0233FAFC: + add r6, r6, #1 + cmp r6, #0x20 + blt _0233F950 + add r4, r4, #1 + cmp r4, #0x38 + blt _0233F944 + bl ov29_0233FB1C + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end FinalizeJunctions + + arm_func_start ov29_0233FB1C +ov29_0233FB1C: ; 0x0233FB1C +#ifdef JAPAN +#define OV29_0233FB1C_OFFSET 0x5C +#else +#define OV29_0233FB1C_OFFSET 0 +#endif + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r0, _0233FBE4 ; =DUNGEON_PTR + mov r1, #0 + ldr r6, [r0] + mov r7, r1 +_0233FB30: + add r0, r6, r1, lsl #1 +#ifdef JAPAN + add r0, r0, #0xf100 +#else + add r0, r0, #0xf200 +#endif + add r1, r1, #1 + strh r7, [r0, #0x68 + OV29_0233FB1C_OFFSET] + cmp r1, #0x20 + blt _0233FB30 +_0233FB48: + mov r0, r7, lsl #0x10 + mov r5, #0 + mov r4, r0, asr #0x10 +_0233FB54: + mov r0, r7 + mov r1, r5 + bl GetTile + ldrh r0, [r0] + tst r0, #8 + beq _0233FBC8 + mov r0, r7 + mov r1, r5 + bl GetTile + ldrb r2, [r0, #7] + cmp r2, #0 + blt _0233FBC8 + cmp r2, #0x20 + addlt r0, r6, r2, lsl #1 +#ifdef JAPAN + addlt r1, r0, #0xf100 +#else + addlt r1, r0, #0xf200 +#endif + ldrltsh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] + cmplt r0, #0x20 + bge _0233FBC8 + add r2, r6, r2, lsl #7 + add r0, r2, r0, lsl #2 + add r0, r0, #0xf200 +#ifdef JAPAN + strh r4, [r0, #4] +#else + strh r4, [r0, #0xa8] +#endif + ldrsh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] + add r0, r2, r0, lsl #2 + add r0, r0, #0xf200 +#ifdef JAPAN + strh r5, [r0, #6] +#else + strh r5, [r0, #0xaa] +#endif + ldrsh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] + add r0, r0, #1 + strh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] +_0233FBC8: + add r5, r5, #1 + cmp r5, #0x20 + blt _0233FB54 + add r7, r7, #1 + cmp r7, #0x38 + blt _0233FB48 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_0233FBE4: .word DUNGEON_PTR + arm_func_end ov29_0233FB1C + + arm_func_start GenerateKecleonShop +GenerateKecleonShop: ; 0x0233FBE8 +#ifdef JAPAN +#define GENERATE_KECLEON_SHOP_OFFSET -0xA4 +#else +#define GENERATE_KECLEON_SHOP_OFFSET 0 +#endif + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x44 + ldr r5, _0233FF8C ; =DUNGEON_PTR + ldr r4, _0233FF90 ; =FLOOR_GENERATION_STATUS + mvn r7, #0 + ldr r6, [r5] + strh r7, [r4, #0x20] + strh r7, [r4, #0x22] + ldrb r4, [r4, #1] + mov sl, r0 + str r1, [sp] + str r2, [sp, #4] + mov r5, r3 + cmp r4, #0 + bne _0233FF84 + bl GetFloorType + cmp r0, #2 + cmpne r5, #0 + beq _0233FF84 + mov r0, #0x64 + bl DungeonRandInt + cmp r5, r0 + ble _0233FF84 + mov r4, #0 + add r2, sp, #0x26 + add r1, sp, #8 +_0233FC50: + mov r0, r4, lsl #0x10 + mov r3, r4, lsl #1 + mov r0, r0, asr #0x10 + add r4, r4, #1 + strh r0, [r2, r3] + strh r0, [r1, r3] + cmp r4, #0xf + blt _0233FC50 + mov r7, #0xf + mov r8, #0 + mov r5, r7 + add r4, sp, #0x26 +_0233FC80: + mov r0, r7 + bl DungeonRandInt + mov sb, r0 + mov r0, r5 + bl DungeonRandInt + mov r3, sb, lsl #1 + mov r1, r0, lsl #1 + add r8, r8, #1 + ldrsh r2, [r4, r3] + ldrsh r0, [r4, r1] + cmp r8, #0xc8 + strh r0, [r4, r3] + strh r2, [r4, r1] + blt _0233FC80 + mov r7, #0xf + mov r8, #0 + mov r5, r7 + add r4, sp, #8 +_0233FCC8: + mov r0, r7 + bl DungeonRandInt + mov sb, r0 + mov r0, r5 + bl DungeonRandInt + mov r3, sb, lsl #1 + mov r1, r0, lsl #1 + add r8, r8, #1 + ldrsh r2, [r4, r3] + ldrsh r0, [r4, r1] + cmp r8, #0xc8 + strh r0, [r4, r3] + strh r2, [r4, r1] + blt _0233FCC8 + mov r4, #0 + b _0233FF7C +_0233FD08: + add r0, sp, #0x26 + mov r1, r4, lsl #1 + ldrsh r1, [r0, r1] + ldr r0, [sp] + cmp r1, r0 + bge _0233FF78 + ldr r0, _0233FF94 ; =0x000001C2 + mov r5, #0 + mul fp, r1, r0 + add sb, sl, fp + b _0233FF70 +_0233FD34: + mov r1, r5, lsl #1 + add r0, sp, #8 + ldrsh r1, [r0, r1] + ldr r0, [sp, #4] + cmp r1, r0 + bge _0233FF6C + mov r0, #0x1e + mul r7, r1, r0 + add r8, sb, r7 + ldrb r0, [r8, #8] + cmp r0, #0 + ldreqb r0, [r8, #0x11] + cmpeq r0, #0 + ldreqb r0, [r8, #0x12] + cmpeq r0, #0 + bne _0233FF6C + ldrb r0, [r8, #0xb] + cmp r0, #0 + ldrneb r0, [r8, #0xa] + cmpne r0, #0 + beq _0233FF6C + ldrb r0, [r8, #9] + cmp r0, #0 + ldreqb r0, [r8, #0x10] + cmpeq r0, #0 + ldreqb r0, [r8, #0x1d] + cmpeq r0, #0 + bne _0233FF6C + ldrsh r1, [r8, #4] + ldrsh r0, [r8] + sub r0, r1, r0 + bl abs + cmp r0, #5 + blt _0233FF6C + ldrsh r1, [r8, #6] + ldrsh r0, [r8, #2] + sub r0, r1, r0 + bl abs + cmp r0, #4 + blt _0233FF6C + ldr r0, _0233FF90 ; =FLOOR_GENERATION_STATUS + add r1, sl, fp + mov r3, #1 + strb r3, [r0, #3] + add r2, r1, r7 + strb r3, [r2, #0xc] + ldrsh r1, [sb, r7] + add r1, r1, #1 + str r1, [r0, #0x30] + ldrsh r1, [r2, #4] + sub r1, r1, #1 + str r1, [r0, #0x38] + ldrsh r1, [r2, #2] + add r3, r1, #1 + str r3, [r0, #0x34] + ldrsh r1, [r2, #6] + sub r2, r1, #1 + sub r1, r2, r3 + cmp r1, #3 + str r2, [r0, #0x3c] + addlt r1, r2, #1 + strlt r1, [r0, #0x3c] + ldr r1, _0233FF98 ; =0x0000270F + add r0, r6, #0xc000 + str r1, [r0, #0xd14 + GENERATE_KECLEON_SHOP_OFFSET] + str r1, [r0, #0xd18 + GENERATE_KECLEON_SHOP_OFFSET] + rsb r2, r1, #0 + str r2, [r0, #0xd1c + GENERATE_KECLEON_SHOP_OFFSET] + ldr r1, _0233FF90 ; =FLOOR_GENERATION_STATUS + str r2, [r0, #0xd20 + GENERATE_KECLEON_SHOP_OFFSET] + ldr r4, [r1, #0x30] + b _0233FED8 +_0233FE54: + ldr sl, _0233FF90 ; =FLOOR_GENERATION_STATUS + add r8, r6, #0xc000 + ldr r5, [sl, #0x34] + b _0233FEC8 +_0233FE64: + mov r0, r4 + mov r1, r5 + bl GetTileSafe + ldrh r1, [r0] + orr r1, r1, #0x20 + strh r1, [r0] + ldrh r1, [r0, #2] + bic r1, r1, #8 + strh r1, [r0, #2] + ldrh r1, [r0, #2] + bic r1, r1, #1 + strh r1, [r0, #2] + ldr r0, [r8, #0xd14 + GENERATE_KECLEON_SHOP_OFFSET] + cmp r0, r4 + strgt r4, [r8, #0xd14 + GENERATE_KECLEON_SHOP_OFFSET] + ldr r0, [r8, #0xd18 + GENERATE_KECLEON_SHOP_OFFSET] + cmp r0, r5 + strgt r5, [r8, #0xd18 + GENERATE_KECLEON_SHOP_OFFSET] + ldr r0, [r8, #0xd1c + GENERATE_KECLEON_SHOP_OFFSET] + cmp r0, r4 + strlt r4, [r8, #0xd1c + GENERATE_KECLEON_SHOP_OFFSET] + ldr r0, [r8, #0xd20 + GENERATE_KECLEON_SHOP_OFFSET] + cmp r0, r5 + strlt r5, [r8, #0xd20 + GENERATE_KECLEON_SHOP_OFFSET] + add r5, r5, #1 +_0233FEC8: + ldr r0, [sl, #0x3c] + cmp r5, r0 + blt _0233FE64 + add r4, r4, #1 +_0233FED8: + ldr r0, _0233FF90 ; =FLOOR_GENERATION_STATUS + ldr r0, [r0, #0x38] + cmp r4, r0 + blt _0233FE54 + add r4, sb, r7 + ldrsh r5, [sb, r7] + b _0233FF28 +_0233FEF4: + ldrsh r6, [r4, #2] + b _0233FF18 +_0233FEFC: + mov r0, r5 + mov r1, r6 + bl GetTileSafe + ldrh r1, [r0, #2] + add r6, r6, #1 + orr r1, r1, #0x10 + strh r1, [r0, #2] +_0233FF18: + ldrsh r0, [r4, #6] + cmp r6, r0 + blt _0233FEFC + add r5, r5, #1 +_0233FF28: + ldrsh r0, [r4, #4] + cmp r5, r0 + blt _0233FEF4 + ldr r1, _0233FF90 ; =FLOOR_GENERATION_STATUS + ldr r2, [r1, #0x30] + ldr r0, [r1, #0x38] + add r0, r2, r0 + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 + strh r0, [r1, #0x20] + ldr r2, [r1, #0x34] + ldr r0, [r1, #0x3c] + add r0, r2, r0 + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 + strh r0, [r1, #0x22] + b _0233FF84 +_0233FF6C: + add r5, r5, #1 +_0233FF70: + cmp r5, #0xf + blt _0233FD34 +_0233FF78: + add r4, r4, #1 +_0233FF7C: + cmp r4, #0xf + blt _0233FD08 +_0233FF84: + add sp, sp, #0x44 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0233FF8C: .word DUNGEON_PTR +_0233FF90: .word FLOOR_GENERATION_STATUS +_0233FF94: .word 0x000001C2 +_0233FF98: .word 0x0000270F + arm_func_end GenerateKecleonShop + + arm_func_start GenerateMonsterHouse +GenerateMonsterHouse: ; 0x0233FF9C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x100 + ldr r4, _02340218 ; =DUNGEON_PTR + movs r5, r3 + mov sl, r0 + mov sb, r1 + mov r8, r2 + ldr r6, [r4] + beq _02340210 + mov r0, #0x64 + bl DungeonRandInt + cmp r5, r0 + ble _02340210 + ldr r0, _0234021C ; =FLOOR_GENERATION_STATUS + ldrb r0, [r0, #3] + cmp r0, #0 + bne _02340210 + bl IsOutlawMonsterHouseFloor + cmp r0, #0 + bne _0233FFF8 + bl IsDestinationFloorWithMonster + cmp r0, #0 + bne _02340210 +_0233FFF8: + bl GetFloorType + cmp r0, #0 + bne _02340210 + mov r5, #0 + mov r2, r5 + mov r1, r5 + b _02340088 +_02340014: + ldr r0, _02340220 ; =0x000001C2 + mov r3, r1 + mla r4, r2, r0, sl + mov r7, #0x1e + b _0234007C +_02340028: + mla r0, r3, r7, r4 + ldrb fp, [r0, #8] + cmp fp, #0 + ldreqb fp, [r0, #0x11] + cmpeq fp, #0 + bne _02340078 + ldrb fp, [r0, #0xb] + cmp fp, #0 + ldrneb fp, [r0, #0xa] + cmpne fp, #0 + beq _02340078 + ldrb fp, [r0, #0xc] + cmp fp, #0 + ldreqb fp, [r0, #0xf] + cmpeq fp, #0 + ldreqb fp, [r0, #0x10] + cmpeq fp, #0 + ldreqb r0, [r0, #9] + cmpeq r0, #0 + addeq r5, r5, #1 +_02340078: + add r3, r3, #1 +_0234007C: + cmp r3, r8 + blt _02340028 + add r2, r2, #1 +_02340088: + cmp r2, sb + blt _02340014 + cmp r5, #0 + beq _02340210 + mov r1, #0 + mov r7, r1 + add r0, sp, #0 +_023400A4: + strb r7, [r0, r1] + add r1, r1, #1 + cmp r1, #0x100 + blt _023400A4 + mov r0, #1 + strb r0, [sp] + add fp, sp, #0 +_023400C0: + mov r0, r5 + bl DungeonRandInt + mov r4, r0 + mov r0, r5 + bl DungeonRandInt + add r7, r7, #1 + ldrb r2, [fp, r4] + ldrb r1, [fp, r0] + cmp r7, #0x40 + strb r1, [fp, r4] + strb r2, [fp, r0] + blt _023400C0 + mov r7, #0 + mov r4, r7 + add fp, sp, #0 + b _02340208 +_02340100: + ldr r0, _02340220 ; =0x000001C2 + mov r5, #0 + mul r3, r4, r0 + add r2, sl, r3 + mov lr, #0x1e + b _023401FC +_02340118: + mul r1, r5, lr + add r0, r2, r1 + ldrb ip, [r0, #8] + cmp ip, #0 + ldreqb ip, [r0, #0x11] + cmpeq ip, #0 + bne _023401F8 + ldrb ip, [r0, #0xb] + cmp ip, #0 + ldrneb ip, [r0, #0xa] + cmpne ip, #0 + beq _023401F8 + ldrb ip, [r0, #0xc] + cmp ip, #0 + ldreqb ip, [r0, #0xf] + cmpeq ip, #0 + ldreqb ip, [r0, #0x10] + cmpeq ip, #0 + ldreqb r0, [r0, #9] + cmpeq r0, #0 + bne _023401F8 + ldrb r0, [fp, r7] + cmp r0, #0 + beq _023401F4 + ldr r0, _0234021C ; =FLOOR_GENERATION_STATUS + add r2, sl, r3 + mov r3, #1 + strb r3, [r0, #1] + add r7, r2, r1 + strb r3, [r7, #0xe] + ldrsh r5, [r2, r1] + add r6, r6, #0x4000 + b _023401E4 +_0234019C: + ldrsh r4, [r7, #2] + b _023401D4 +_023401A4: + mov r0, r5 + mov r1, r4 + bl GetTileSafe + ldrh r2, [r0] + mov r1, r4 + orr r2, r2, #0x40 + strh r2, [r0] + mov r0, r5 + bl GetTile + ldrb r0, [r0, #7] + add r4, r4, #1 +#ifdef JAPAN + strb r0, [r6, #0x25] +#else + strb r0, [r6, #0xc9] +#endif +_023401D4: + ldrsh r0, [r7, #6] + cmp r4, r0 + blt _023401A4 + add r5, r5, #1 +_023401E4: + ldrsh r0, [r7, #4] + cmp r5, r0 + blt _0234019C + b _02340210 +_023401F4: + add r7, r7, #1 +_023401F8: + add r5, r5, #1 +_023401FC: + cmp r5, r8 + blt _02340118 + add r4, r4, #1 +_02340208: + cmp r4, sb + blt _02340100 +_02340210: + add sp, sp, #0x100 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_02340218: .word DUNGEON_PTR +_0234021C: .word FLOOR_GENERATION_STATUS +_02340220: .word 0x000001C2 + arm_func_end GenerateMonsterHouse + + arm_func_start GenerateMazeRoom +GenerateMazeRoom: ; 0x02340224 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x100 + ldr r7, _02340450 ; =DUNGEON_PTR + movs r8, r3 + mov r6, r0 + mov r5, r1 + mov r4, r2 + ldr r7, [r7] + beq _02340448 + mov r0, #0x64 + bl DungeonRandInt + cmp r8, r0 + ble _02340448 + add r0, r7, #0x4000 +#ifdef JAPAN + ldrsh r0, [r0, #0x3a] +#else + ldrsh r0, [r0, #0xde] +#endif + cmp r0, #0 + bge _02340448 + mov sb, #0 + mov r1, sb + b _02340310 +_02340274: + ldr r0, _02340454 ; =0x000001C2 + mov r2, #0 + mla r3, r1, r0, r6 + mov r7, #0x1e + b _02340304 +_02340288: + mla r0, r2, r7, r3 + ldrb r8, [r0, #8] + cmp r8, #0 + ldreqb r8, [r0, #0x11] + cmpeq r8, #0 + bne _02340300 + ldrb r8, [r0, #0xb] + cmp r8, #0 + ldrneb r8, [r0, #0xa] + cmpne r8, #0 + beq _02340300 + ldrb r8, [r0, #0xc] + cmp r8, #0 + ldreqb r8, [r0, #0xf] + cmpeq r8, #0 + ldreqb r8, [r0, #0xe] + cmpeq r8, #0 + ldreqb r8, [r0, #9] + cmpeq r8, #0 + bne _02340300 + ldrsh sl, [r0, #4] + ldrsh r8, [r0] + sub r8, sl, r8 + tst r8, #1 + beq _02340300 + ldrsh r8, [r0, #6] + ldrsh r0, [r0, #2] + sub r0, r8, r0 + tst r0, #1 + addne sb, sb, #1 +_02340300: + add r2, r2, #1 +_02340304: + cmp r2, r4 + blt _02340288 + add r1, r1, #1 +_02340310: + cmp r1, r5 + blt _02340274 + cmp sb, #0 + beq _02340448 + mov r1, #0 + mov sl, r1 + add r0, sp, #0 +_0234032C: + strb sl, [r0, r1] + add r1, r1, #1 + cmp r1, #0x100 + blt _0234032C + mov r0, #1 + strb r0, [sp] + add r7, sp, #0 +_02340348: + mov r0, sb + bl DungeonRandInt + mov r8, r0 + mov r0, sb + bl DungeonRandInt + add sl, sl, #1 + ldrb r2, [r7, r8] + ldrb r1, [r7, r0] + cmp sl, #0x40 + strb r1, [r7, r8] + strb r2, [r7, r0] + blt _02340348 + mov r7, #0 + mov r2, r7 + b _02340440 +_02340384: + ldr r0, _02340454 ; =0x000001C2 + mov r3, #0 + mla r1, r2, r0, r6 + add sl, sp, #0 + mov r8, #0x1e + b _02340434 +_0234039C: + mla r0, r3, r8, r1 + ldrb sb, [r0, #8] + cmp sb, #0 + ldreqb sb, [r0, #0x11] + cmpeq sb, #0 + bne _02340430 + ldrb sb, [r0, #0xb] + cmp sb, #0 + ldrneb sb, [r0, #0xa] + cmpne sb, #0 + beq _02340430 + ldrb sb, [r0, #0xc] + cmp sb, #0 + ldreqb sb, [r0, #0xf] + cmpeq sb, #0 + ldreqb sb, [r0, #0xe] + cmpeq sb, #0 + ldreqb sb, [r0, #9] + cmpeq sb, #0 + bne _02340430 + ldrsh ip, [r0, #4] + ldrsh sb, [r0] + sub sb, ip, sb + tst sb, #1 + beq _02340430 + ldrsh ip, [r0, #6] + ldrsh sb, [r0, #2] + sub sb, ip, sb + tst sb, #1 + beq _02340430 + ldrb sb, [sl, r7] + cmp sb, #0 + beq _0234042C + mov r1, #0 + bl GenerateMaze + b _02340448 +_0234042C: + add r7, r7, #1 +_02340430: + add r3, r3, #1 +_02340434: + cmp r3, r4 + blt _0234039C + add r2, r2, #1 +_02340440: + cmp r2, r5 + blt _02340384 +_02340448: + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_02340450: .word DUNGEON_PTR +_02340454: .word 0x000001C2 + arm_func_end GenerateMazeRoom + + arm_func_start GenerateMaze +GenerateMaze: ; 0x02340458 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x10 + ldr r2, _023406D0 ; =FLOOR_GENERATION_STATUS + mov r3, #1 + mov r5, r0 + strb r3, [r2, #7] + strb r3, [r5, #0x10] + mov r4, r1 + ldrsh r0, [r5] + ldrsh r1, [r5, #2] + bl GetTile + ldrsh r1, [r5] + ldrb r7, [r0, #7] + add r6, r1, #1 + b _023404DC +_02340494: + ldrsh r1, [r5, #2] + mov r0, r6 + sub r1, r1, #1 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _023404D8 + ldrsh r3, [r5, #2] + ldrsh r2, [r5, #4] + mov r0, r6 + sub r1, r3, #1 + str r2, [sp] + ldrsh r2, [r5, #6] + stmib sp, {r2, r4, r7} + ldrsh r2, [r5] + bl GenerateMazeLine +_023404D8: + add r6, r6, #2 +_023404DC: + ldrsh r0, [r5, #4] + sub r0, r0, #1 + cmp r6, r0 + blt _02340494 + ldrsh r0, [r5, #2] + add r6, r0, #1 + b _02340538 +_023404F8: + ldrsh r0, [r5, #4] + mov r1, r6 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _02340534 + ldrsh r0, [r5, #4] + mov r1, r6 + str r0, [sp] + ldrsh r2, [r5, #6] + stmib sp, {r2, r4, r7} + ldrsh r2, [r5] + ldrsh r3, [r5, #2] + bl GenerateMazeLine +_02340534: + add r6, r6, #2 +_02340538: + ldrsh r0, [r5, #6] + sub r0, r0, #1 + cmp r6, r0 + blt _023404F8 + ldrsh r0, [r5] + add r6, r0, #1 + b _02340594 +_02340554: + ldrsh r1, [r5, #6] + mov r0, r6 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _02340590 + ldrsh r1, [r5, #6] + ldrsh r2, [r5, #4] + mov r0, r6 + str r2, [sp] + stmib sp, {r1, r4, r7} + ldrsh r2, [r5] + ldrsh r3, [r5, #2] + bl GenerateMazeLine +_02340590: + add r6, r6, #2 +_02340594: + ldrsh r0, [r5, #4] + sub r0, r0, #1 + cmp r6, r0 + blt _02340554 + ldrsh r0, [r5, #2] + add r6, r0, #1 + b _023405F8 +_023405B0: + ldrsh r0, [r5] + mov r1, r6 + sub r0, r0, #1 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _023405F4 + ldrsh r2, [r5] + ldrsh r3, [r5, #4] + mov r1, r6 + sub r0, r2, #1 + str r3, [sp] + ldrsh r3, [r5, #6] + stmib sp, {r3, r4, r7} + ldrsh r3, [r5, #2] + bl GenerateMazeLine +_023405F4: + add r6, r6, #2 +_023405F8: + ldrsh r0, [r5, #6] + sub r0, r0, #1 + cmp r6, r0 + blt _023405B0 + ldrsh r0, [r5] + add r8, r0, #3 + b _023406B8 +_02340614: + ldrsh r0, [r5, #2] + sub r6, r8, #1 + add sb, r0, #3 + b _023406A4 +_02340624: + mov r0, r8 + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + bne _023406A0 + cmp r4, #0 + mov r0, r6 + mov r1, sb + beq _0234066C + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #2 + b _02340678 +_0234066C: + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 +_02340678: + strh r1, [r0] + ldrsh r2, [r5, #4] + mov r0, r8 + mov r1, sb + str r2, [sp] + ldrsh r2, [r5, #6] + stmib sp, {r2, r4, r7} + ldrsh r2, [r5] + ldrsh r3, [r5, #2] + bl GenerateMazeLine +_023406A0: + add sb, sb, #2 +_023406A4: + ldrsh r0, [r5, #6] + sub r0, r0, #3 + cmp sb, r0 + blt _02340624 + add r8, r8, #2 +_023406B8: + ldrsh r0, [r5, #4] + sub r0, r0, #3 + cmp r8, r0 + blt _02340614 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_023406D0: .word FLOOR_GENERATION_STATUS + arm_func_end GenerateMaze + + arm_func_start GenerateMazeLine +GenerateMazeLine: ; 0x023406D4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + ldr r4, [sp, #0x34] + ldr fp, [sp, #0x30] + ldr r7, [sp, #0x38] + ldr r6, [sp, #0x3c] + str r4, [sp, #0x34] + mov sb, r0 + mov r8, r1 + str r2, [sp] + str r3, [sp, #4] +_02340700: + mov r0, #4 + bl DungeonRandInt + mov r4, r0 + mov r0, sb + mov r1, r8 + mov sl, #0 + bl GetTileSafe + mov r1, r7 + and r2, r6, #0xff + bl SetTerrainObstacleChecked + mvn r0, #1 + str r0, [sp, #8] +_02340730: + and r5, r4, #3 + cmp r5, #3 + addls pc, pc, r5, lsl #2 + b _02340774 +_02340740: ; jump table + b _02340750 ; case 0 + b _0234075C ; case 1 + b _02340768 ; case 2 + b _02340774 ; case 3 +_02340750: + mov r0, #2 + mov r2, #0 + b _0234077C +_0234075C: + mov r0, #0 + ldr r2, [sp, #8] + b _0234077C +_02340768: + ldr r0, [sp, #8] + mov r2, #0 + b _0234077C +_02340774: + mov r0, #0 + mov r2, #2 +_0234077C: + ldr r1, [sp] + add r0, sb, r0 + cmp r1, r0 + bgt _023407C4 + cmp fp, r0 + ble _023407C4 + add r1, r8, r2 + ldr r2, [sp, #4] + cmp r2, r1 + bgt _023407C4 + ldr r2, [sp, #0x34] + cmp r2, r1 + ble _023407C4 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _023407D8 +_023407C4: + add r4, r4, #1 + add sl, sl, #1 + cmp sl, #4 + blt _02340730 + b _02340874 +_023407D8: + cmp r5, #3 + addls pc, pc, r5, lsl #2 + b _02340700 +_023407E4: ; jump table + b _023407F4 ; case 0 + b _02340814 ; case 1 + b _02340834 ; case 2 + b _02340854 ; case 3 +_023407F4: + mov r1, r8 + add r0, sb, #1 + bl GetTileSafe + mov r1, r7 + and r2, r6, #0xff + bl SetTerrainObstacleChecked + add sb, sb, #2 + b _02340700 +_02340814: + mov r0, sb + sub r1, r8, #1 + bl GetTileSafe + mov r1, r7 + and r2, r6, #0xff + bl SetTerrainObstacleChecked + sub r8, r8, #2 + b _02340700 +_02340834: + mov r1, r8 + sub r0, sb, #1 + bl GetTileSafe + mov r1, r7 + and r2, r6, #0xff + bl SetTerrainObstacleChecked + sub sb, sb, #2 + b _02340700 +_02340854: + mov r0, sb + add r1, r8, #1 + bl GetTileSafe + mov r1, r7 + and r2, r6, #0xff + bl SetTerrainObstacleChecked + add r8, r8, #2 + b _02340700 +_02340874: + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end GenerateMazeLine + + arm_func_start SetSpawnFlag5 +SetSpawnFlag5: ; 0x0234087C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrsh r5, [r6] + b _023408C0 +_0234088C: + ldrsh r4, [r6, #2] + b _023408B0 +_02340894: + mov r0, r5 + mov r1, r4 + bl GetTileSafe + ldrh r1, [r0, #2] + add r4, r4, #1 + orr r1, r1, #0x20 + strh r1, [r0, #2] +_023408B0: + ldrsh r0, [r6, #6] + cmp r4, r0 + blt _02340894 + add r5, r5, #1 +_023408C0: + ldrsh r0, [r6, #4] + cmp r5, r0 + blt _0234088C + ldmia sp!, {r4, r5, r6, pc} + arm_func_end SetSpawnFlag5 + + arm_func_start IsNextToHallway +IsNextToHallway: ; 0x023408D0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mvn r5, #0 + mov sl, r0 + mov sb, r1 + mov r4, r5 + b _02340964 +_023408E8: + adds r8, sl, r5 + bmi _02340960 + cmp r8, #0x38 + bge _0234096C + mov r6, r4 + b _02340958 +_02340900: + adds r7, sb, r6 + bmi _02340954 + cmp r7, #0x20 + bge _02340960 + cmp r5, #0 + cmpne r6, #0 + bne _02340954 + mov r0, r8 + mov r1, r7 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + bne _02340954 + mov r0, r8 + mov r1, r7 + bl GetTile + ldrb r0, [r0, #7] + cmp r0, #0xff + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02340954: + add r6, r6, #1 +_02340958: + cmp r6, #1 + ble _02340900 +_02340960: + add r5, r5, #1 +_02340964: + cmp r5, #1 + ble _023408E8 +_0234096C: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end IsNextToHallway + + arm_func_start ResolveInvalidSpawns +ResolveInvalidSpawns: ; 0x02340974 + stmdb sp!, {r3, r4, r5, lr} + mov r5, #0 +_0234097C: + mov r4, #0 +_02340980: + mov r0, r5 + mov r1, r4 + bl GetTileSafe + ldrh r1, [r0] + and r1, r1, #3 + cmp r1, #1 + beq _023409BC + ldrh r1, [r0] + tst r1, #0x110 + ldrneh r1, [r0, #2] + bicne r1, r1, #2 + strneh r1, [r0, #2] + ldrh r1, [r0, #2] + bic r1, r1, #4 + strh r1, [r0, #2] +_023409BC: + ldrh r1, [r0, #2] + tst r1, #1 + beq _023409E0 + ldrh r1, [r0] + orr r1, r1, #0x200 + strh r1, [r0] + ldrh r1, [r0, #2] + bic r1, r1, #4 + strh r1, [r0, #2] +_023409E0: + ldrh r1, [r0, #2] + add r4, r4, #1 + tst r1, #2 + bicne r1, r1, #4 + strneh r1, [r0, #2] + cmp r4, #0x20 + blt _02340980 + add r5, r5, #1 + cmp r5, #0x38 + blt _0234097C + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ResolveInvalidSpawns + + arm_func_start ConvertSecondaryTerrainToChasms +ConvertSecondaryTerrainToChasms: ; 0x02340A0C + stmdb sp!, {r4, r5, r6, lr} + mov r6, #0 + mov r4, r6 +_02340A18: + mov r5, r4 +_02340A1C: + mov r0, r6 + mov r1, r5 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #2 + bne _02340A5C + mov r0, r6 + mov r1, r5 + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #3 + strh r1, [r0] +_02340A5C: + add r5, r5, #1 + cmp r5, #0x20 + blt _02340A1C + add r6, r6, #1 + cmp r6, #0x38 + blt _02340A18 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ConvertSecondaryTerrainToChasms + + arm_func_start EnsureImpassableTilesAreWalls +EnsureImpassableTilesAreWalls: ; 0x02340A78 + stmdb sp!, {r4, r5, r6, lr} + mov r6, #0 + mov r4, r6 +_02340A84: + mov r5, r4 +_02340A88: + mov r0, r6 + mov r1, r5 + bl GetTile + ldrh r0, [r0] + tst r0, #0x10 + beq _02340AB8 + mov r0, r6 + mov r1, r5 + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] +_02340AB8: + add r5, r5, #1 + cmp r5, #0x20 + blt _02340A88 + add r6, r6, #1 + cmp r6, #0x38 + blt _02340A84 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end EnsureImpassableTilesAreWalls + + arm_func_start InitializeTile +InitializeTile: ; 0x02340AD4 + mov r2, #0 + strh r2, [r0] + strh r2, [r0, #2] + mov r1, #0xff + strb r1, [r0, #7] + strh r2, [r0, #4] + strb r2, [r0, #8] + strb r2, [r0, #9] + strb r2, [r0, #0xa] + strb r2, [r0, #0xb] + strb r2, [r0, #6] + str r2, [r0, #0xc] + str r2, [r0, #0x10] + bx lr + arm_func_end InitializeTile + + arm_func_start ResetFloor +ResetFloor: ; 0x02340B0C +#ifdef JAPAN +#define RESET_FLOOR_OFFSET -0xA4 +#else +#define RESET_FLOOR_OFFSET 0 +#endif + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r6, #0 + mov r4, r6 +_02340B18: + mov r5, r4 + sub r7, r6, #1 +_02340B20: + mov r0, r6 + mov r1, r5 + bl GetTileSafe + bl InitializeTile + sub r8, r5, #1 + mov r0, r6 + mov r1, r8 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + mov r1, r8 + add r0, r6, #1 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + mov r1, r8 + add r0, r6, #1 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + add r0, r6, #1 + add r1, r5, #1 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + mov r0, r6 + add r1, r5, #1 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + mov r0, r7 + add r1, r5, #1 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + mov r0, r7 + mov r1, r5 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + mov r0, r7 + mov r1, r8 + bl PosIsOutOfBounds + cmp r0, #0 + beq _02340BEC +_02340BD4: + mov r0, r6 + mov r1, r5 + bl GetTileSafe + ldrh r1, [r0] + orr r1, r1, #0x10 + strh r1, [r0] +_02340BEC: + add r5, r5, #1 + cmp r5, #0x20 + blt _02340B20 + add r6, r6, #1 + cmp r6, #0x38 + blt _02340B18 + ldr r6, _02340CA8 ; =DUNGEON_PTR + mov sb, #0 + ldr r0, [r6] + mvn r1, #0 + add r0, r0, #0xcc00 + strh r1, [r0, #0xe4 + RESET_FLOOR_OFFSET] + ldr r0, [r6] + mov r7, sb + add r0, r0, #0xcc00 + strh r1, [r0, #0xe6 + RESET_FLOOR_OFFSET] + mov r4, #0x14 + mov r5, #0xa0 +_02340C34: + mul r8, sb, r5 + mov sl, r7 +_02340C3C: + ldr r0, [r6] +#ifdef JAPAN + add r0, r0, #0xbc + add r0, r0, #0xcc00 +#else + add r0, r0, #0xd60 + add r0, r0, #0xc000 +#endif + add r0, r0, r8 + mla r0, sl, r4, r0 + bl InitializeTile + add sl, sl, #1 + cmp sl, #8 + blt _02340C3C + add sb, sb, #1 + cmp sb, #8 + blt _02340C34 + ldr r1, _02340CA8 ; =DUNGEON_PTR + mov r3, #0 + ldr r0, [r1] + mov r2, r3 + add r0, r0, #0x3f00 + strh r3, [r0, #0xc0 + RESET_FLOOR_OFFSET] +_02340C84: + ldr r0, [r1] + add r0, r0, r3, lsl #2 + add r0, r0, #0x12000 + ldr r0, [r0, #0xcc8 + RESET_FLOOR_OFFSET] + add r3, r3, #1 + str r2, [r0] + cmp r3, #0x40 + blt _02340C84 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_02340CA8: .word DUNGEON_PTR + arm_func_end ResetFloor diff --git a/include/overlay_29_0233C9E8.h b/include/overlay_29_0233C9E8.h new file mode 100644 index 00000000..25208951 --- /dev/null +++ b/include/overlay_29_0233C9E8.h @@ -0,0 +1,38 @@ +#ifndef PMDSKY_OVERLAY_29_0233C9E8_H +#define PMDSKY_OVERLAY_29_0233C9E8_H + +#include "dungeon_mode.h" + +struct unk_0233C9E8 { + s16 field_0x0; + s16 field_0x2; + s16 field_0x4; + s16 field_0x6; + u8 field_0x8; + u8 field_0x9; + u8 field_0xa; + u8 field_0xb; + u8 field_0xc; + u8 field_0xd; + u8 field_0xe; + u8 field_0xf; + u8 field_0x10; + u8 field_0x11[0xd]; +}; + +struct unk_0237CFBC { + u8 field_0x0; + u8 field_0x1; + u8 field_0x2; + u8 field_0x3; + u8 field_0x4; + u8 field_0x5; + u8 field_0x6; +}; + +extern struct unk_0237CFBC FLOOR_GENERATION_STATUS; + +void GenerateExtraHallways(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, s32 grid_size_y, + s32 n_extra_hallways); + +#endif //PMDSKY_OVERLAY_29_0233C9E8_H diff --git a/main.lsf b/main.lsf index 946bcbc4..236f236e 100644 --- a/main.lsf +++ b/main.lsf @@ -1226,6 +1226,8 @@ Overlay OVY_29 Object asm/overlay_29_0233A248.o Object src/overlay_29_0233AE78.o Object asm/overlay_29_0233AE84.o + Object src/overlay_29_0233C9E8.o + Object asm/overlay_29_0233CF84.o Object src/overlay_29_02340CAC.o Object asm/overlay_29_02340CE4.o Object src/dungeon_generation.o diff --git a/src/overlay_29_0233C9E8.c b/src/overlay_29_0233C9E8.c new file mode 100644 index 00000000..90774eb7 --- /dev/null +++ b/src/overlay_29_0233C9E8.c @@ -0,0 +1,175 @@ +#include "overlay_29_0233C9E8.h" +#include "dg_random.h" +#include "dungeon_map_access.h" +#include "dungeon_util.h" + +void GenerateExtraHallways(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, s32 grid_size_y, s32 n_extra_hallways) +{ + s32 i; + s32 x; + s32 dir; + s32 k; + s32 oob; + s32 d; + + if (n_extra_hallways == 0) { + return; + } + for (i = 0; i < n_extra_hallways; i++) { + struct unk_0233C9E8 *cell; + s32 ty; + s32 tx; + s32 y; + s32 room; + s32 seg; + s32 bx; + s32 by; + + x = DungeonRandInt(grid_size_x); + y = DungeonRandInt(grid_size_y); + cell = &grid[x][y]; + if (cell->field_0xa == 0 || cell->field_0xb == 0) { + continue; + } + if (cell->field_0x8 != 0 || cell->field_0x10 != 0) { + continue; + } + tx = DungeonRandRange(cell->field_0x0, cell->field_0x4); + ty = DungeonRandRange(cell->field_0x2, cell->field_0x6); + dir = DungeonRandInt(4) * 2; + for (k = 0; k < 3; k++) { + if (dir == 0 && y >= grid_size_y - 1) { + dir = 2; + } + if (dir == 2 && x >= grid_size_x - 1) { + dir = 4; + } + if (dir == 4 && y <= 0) { + dir = 6; + } + if (dir == 6 && x <= 0) { + dir = 0; + } + } + room = GetTile(tx, ty)->room; + for (;;) { + if (GetTile(tx, ty)->room != room) { + break; + } + tx += DIRECTIONS_XY[dir].x; + ty += DIRECTIONS_XY[dir].y; + } + for (;;) { + if ((GetTile(tx, ty)->terrain_flags & 3) != 1) { + break; + } + tx += DIRECTIONS_XY[dir].x; + ty += DIRECTIONS_XY[dir].y; + } + if ((GetTile(tx, ty)->terrain_flags & 3) == 2) { + continue; + } + oob = 0; + for (bx = tx - 2; bx <= tx + 2; bx++) { + for (by = ty - 2; by <= ty + 2; by++) { + if (bx < 0 || bx >= 56 || by < 0 || by >= 32) { + oob = 1; + break; + } + } + if (oob) { + break; + } + } + if (oob) { + continue; + } + d = (dir + 2) & 6; + if ((GetTile(tx + DIRECTIONS_XY[d].x, ty + DIRECTIONS_XY[d].y)->terrain_flags & 3) == 1) { + continue; + } + d = (dir - 2) & 6; + if ((GetTile(tx + DIRECTIONS_XY[d].x, ty + DIRECTIONS_XY[d].y)->terrain_flags & 3) == 1) { + continue; + } + seg = DungeonRandInt(3) + 3; + for (;;) { + int flag; + + if (tx <= 1 || ty <= 1) { + break; + } + if (tx >= 0x37 || ty >= 0x1f) { + break; + } + if ((GetTile(tx, ty)->terrain_flags & 3) == 1) { + break; + } + if (GetTile(tx, ty)->terrain_flags & 0x10) { + break; + } + flag = 1; + if ((GetTile(tx + 1, ty)->terrain_flags & 3) == 1 + && (GetTile(tx + 1, ty + 1)->terrain_flags & 3) == 1 + && (GetTile(tx, ty + 1)->terrain_flags & 3) == 1) { + flag = 0; + } + if ((GetTile(tx + 1, ty)->terrain_flags & 3) == 1) { + s32 ym = ty - 1; + + if ((GetTile(tx + 1, ym)->terrain_flags & 3) == 1 + && (GetTile(tx, ym)->terrain_flags & 3) == 1) { + flag = 0; + } + } + { + s32 xm = tx - 1; + + if ((GetTile(xm, ty)->terrain_flags & 3) == 1 + && (GetTile(xm, ty + 1)->terrain_flags & 3) == 1 + && (GetTile(tx, ty + 1)->terrain_flags & 3) == 1) { + flag = 0; + } + if ((GetTile(xm, ty)->terrain_flags & 3) == 1) { + s32 ym = ty - 1; + + if ((GetTile(xm, ym)->terrain_flags & 3) == 1 + && (GetTile(tx, ym)->terrain_flags & 3) == 1) { + flag = 0; + } + } + } + if (flag) { + struct tile *t = GetTileSafe(tx, ty); + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + } + d = (dir + 2) & 6; + if ((GetTile(tx + DIRECTIONS_XY[d].x, ty + DIRECTIONS_XY[d].y)->terrain_flags & 3) == 1) { + break; + } + d = (dir - 2) & 6; + if ((GetTile(tx + DIRECTIONS_XY[d].x, ty + DIRECTIONS_XY[d].y)->terrain_flags & 3) == 1) { + break; + } + if (--seg == 0) { + seg = DungeonRandInt(3) + 3; + if (DungeonRandInt(100) < 50) { + dir += 2; + } else { + dir -= 2; + } + dir &= 6; + if (tx >= 0x20 && FLOOR_GENERATION_STATUS.field_0x6 == 1 && dir == 2) { + break; + } + if (tx >= 0x30 && FLOOR_GENERATION_STATUS.field_0x6 == 2 && dir == 2) { + break; + } + } + tx += DIRECTIONS_XY[dir].x; + ty += DIRECTIONS_XY[dir].y; + } + } + +} From 4c7fe63636fff4dc89a35c3acadd46777399d1dd Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Fri, 11 Sep 2026 14:20:40 -0700 Subject: [PATCH 15/34] Decompile CreateGridCellConnections (0x0233E43C) 573 instructions in overlay_29, the immediate neighbour of GenerateExtraHallways. No region preprocessor directives -- all three regions assemble identical text, so one source serves US/EU/JP. asm/overlay_29_0233CF84.s is split: the function becomes the new pair src/overlay_29_0233E43C.c + include/overlay_29_0233E43C.h, and the remainder becomes asm/overlay_29_0233ED34.s. main.lsf gains two objects. The header adds a provisional prototype for CreateHallway, which had no C declaration anywhere in the tree. Its arity of 7 is read off its own prologue (ten pushed registers, no sub sp, and reads at [sp,#0x28]/[sp,#0x2c]/[sp,#0x30]); the parameter types are the loosest that fit and the names are positional placeholders. struct unk_0233C9E8 and FLOOR_GENERATION_STATUS come from include/overlay_29_0233C9E8.h, landed by the previous function; the grid's 450/30 strides and 450/30 = 15 confirm the (*)[15] shape independently here. Authored by Claude (Opus 5) under human direction. Confirmed by a matching build: build/pmdsky.us/pmdsky.us.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/overlay_29_0233CF84.inc | 12 +- asm/include/overlay_29_0233ED34.inc | 14 + asm/overlay_29_0233CF84.s | 2968 --------------------------- asm/overlay_29_0233ED34.s | 2344 +++++++++++++++++++++ include/overlay_29_0233E43C.h | 11 + main.lsf | 2 + src/overlay_29_0233E43C.c | 325 +++ 7 files changed, 2699 insertions(+), 2977 deletions(-) create mode 100644 asm/include/overlay_29_0233ED34.inc create mode 100644 asm/overlay_29_0233ED34.s create mode 100644 include/overlay_29_0233E43C.h create mode 100644 src/overlay_29_0233E43C.c diff --git a/asm/include/overlay_29_0233CF84.inc b/asm/include/overlay_29_0233CF84.inc index 28bcd334..6bf1d0b0 100644 --- a/asm/include/overlay_29_0233CF84.inc +++ b/asm/include/overlay_29_0233CF84.inc @@ -1,15 +1,9 @@ #pragma once -.public CORNER_CARDINAL_NEIGHBOR_IS_OPEN -.public DIRECTIONS_XY -.public DUNGEON_PTR .public DungeonRandInt .public DungeonRandRange .public FLOOR_GENERATION_STATUS -.public GetFloorType -.public GetTile +.public GenerateMaze .public GetTileSafe -.public IsDestinationFloorWithMonster -.public IsOutlawMonsterHouseFloor -.public PosIsOutOfBounds +.public IsNextToHallway +.public SetSpawnFlag5 .public _s32_div_f -.public abs diff --git a/asm/include/overlay_29_0233ED34.inc b/asm/include/overlay_29_0233ED34.inc new file mode 100644 index 00000000..8964d136 --- /dev/null +++ b/asm/include/overlay_29_0233ED34.inc @@ -0,0 +1,14 @@ +#pragma once +.public CORNER_CARDINAL_NEIGHBOR_IS_OPEN +.public DIRECTIONS_XY +.public DUNGEON_PTR +.public DungeonRandInt +.public DungeonRandRange +.public FLOOR_GENERATION_STATUS +.public GetFloorType +.public GetTile +.public GetTileSafe +.public IsDestinationFloorWithMonster +.public IsOutlawMonsterHouseFloor +.public PosIsOutOfBounds +.public abs diff --git a/asm/overlay_29_0233CF84.s b/asm/overlay_29_0233CF84.s index c9e495c1..a0663e3c 100644 --- a/asm/overlay_29_0233CF84.s +++ b/asm/overlay_29_0233CF84.s @@ -1481,2971 +1481,3 @@ _0233E430: .align 2, 0 _0233E438: .word 0x000001C2 arm_func_end AssignGridCellConnections - - arm_func_start CreateGridCellConnections -CreateGridCellConnections: ; 0x0233E43C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x48 - str r0, [sp, #0xc] - str r1, [sp, #0x10] - str r2, [sp, #0x14] - mov sb, r3 - ldr r8, [sp, #0x70] - mov r5, #0 - b _0233E510 -_0233E460: - ldr r1, _0233ED30 ; =0x000001C2 - ldr r0, [sp, #0xc] - mov r6, #0 - mla r7, r5, r1, r0 - ldr r0, [sp, #0x10] - mov r3, r6 - sub r1, r0, #1 - ldr r0, [sp, #0x14] - mov r2, r6 - sub r0, r0, #1 - mov ip, r6 - mov lr, r6 - mov r4, r6 - b _0233E500 -_0233E498: - mov sl, #0x1e - mla sl, r6, sl, r7 - ldrb fp, [sl, #8] - cmp fp, #0 - strneb r4, [sl, #0x17] - strneb r4, [sl, #0x18] - strneb r4, [sl, #0x19] - strneb r4, [sl, #0x1a] - bne _0233E4FC - cmp r5, #0 - strleb r3, [sl, #0x15] - cmp r6, #0 - strleb r2, [sl, #0x13] - cmp r5, r1 - strgeb ip, [sl, #0x16] - cmp r6, r0 - strgeb lr, [sl, #0x14] - ldrb fp, [sl, #0x13] - strb fp, [sl, #0x17] - ldrb fp, [sl, #0x14] - strb fp, [sl, #0x18] - ldrb fp, [sl, #0x15] - strb fp, [sl, #0x19] - ldrb fp, [sl, #0x16] - strb fp, [sl, #0x1a] -_0233E4FC: - add r6, r6, #1 -_0233E500: - ldr sl, [sp, #0x14] - cmp r6, sl - blt _0233E498 - add r5, r5, #1 -_0233E510: - ldr r0, [sp, #0x10] - cmp r5, r0 - blt _0233E460 - mov r6, #0 - b _0233E800 -_0233E524: - ldr r1, _0233ED30 ; =0x000001C2 - ldr r0, [sp, #0xc] - mov r7, #0 - mla r4, r6, r1, r0 - add r0, sb, r6, lsl #2 - str r0, [sp, #0x2c] - b _0233E7F0 -_0233E540: - mov r0, #0x1e - mla r5, r7, r0, r4 - ldrb r0, [r5, #8] - cmp r0, #0 - bne _0233E7EC - ldrb r0, [r5, #0xa] - cmp r0, #0 - ldreqsh fp, [r5] - ldreqsh sl, [r5, #2] - beq _0233E598 - ldrsh r0, [r5] - ldrsh r1, [r5, #4] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - mov fp, r0 - ldrsh r0, [r5, #2] - ldrsh r1, [r5, #6] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - mov sl, r0 -_0233E598: - ldrb r0, [r5, #0x17] - cmp r0, #0 - beq _0233E624 - ldrb r0, [r5, #-0x16] - cmp r0, #0 - bne _0233E60C - ldrb r0, [r5, #-0x14] - cmp r0, #0 - ldreqsh r2, [r5, #-0x1e] - beq _0233E5D8 - ldrsh r0, [r5, #-0x1e] - ldrsh r1, [r5, #-0x1a] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - mov r2, r0 -_0233E5D8: - mov r0, #1 - str r0, [sp] - mov r0, #0x1e - mla r3, r7, r0, r4 - ldr r1, [sb, r6, lsl #2] - mov r0, fp - str r1, [sp, #4] - ldr r1, [r8, r7, lsl #2] - str r1, [sp, #8] - ldrsh r1, [r3, #2] - ldrsh r3, [r3, #-0x18] - sub r3, r3, #1 - bl CreateHallway -_0233E60C: - mov r0, #0 - strb r0, [r5, #0x17] - strb r0, [r5, #-6] - mov r0, #1 - strb r0, [r5, #0xb] - strb r0, [r5, #-0x13] -_0233E624: - ldrb r0, [r5, #0x18] - cmp r0, #0 - beq _0233E6B8 - ldrb r0, [r5, #0x26] - cmp r0, #0 - bne _0233E6A0 - ldrb r0, [r5, #0x28] - cmp r0, #0 - ldreqsh r2, [r5, #0x1e] - beq _0233E664 - ldrsh r0, [r5, #0x1e] - ldrsh r1, [r5, #0x22] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - mov r2, r0 -_0233E664: - mov r1, #1 - str r1, [sp] - mov r0, fp - mov r1, #0x1e - ldr fp, [sb, r6, lsl #2] - mla r1, r7, r1, r4 - add r3, r8, r7, lsl #2 - str fp, [sp, #4] - ldr r3, [r3, #4] - sub r3, r3, #1 - str r3, [sp, #8] - ldrsh fp, [r1, #6] - ldrsh r3, [r1, #0x20] - sub r1, fp, #1 - bl CreateHallway -_0233E6A0: - mov r0, #0 - strb r0, [r5, #0x18] - strb r0, [r5, #0x35] - mov r0, #1 - strb r0, [r5, #0xb] - strb r0, [r5, #0x29] -_0233E6B8: - ldrb r0, [r5, #0x19] - cmp r0, #0 - beq _0233E750 - ldrb r0, [r5, #-0x1ba] - cmp r0, #0 - bne _0233E738 - ldrb r0, [r5, #-0x1b8] - cmp r0, #0 - sub r0, r5, #0x100 - ldreqsh r3, [r0, #-0xc0] - beq _0233E6FC - ldrsh r1, [r0, #-0xbc] - ldrsh r2, [r0, #-0xc0] - sub r1, r1, #1 - add r0, r2, #1 - bl DungeonRandRange - mov r3, r0 -_0233E6FC: - mov r0, #0 - str r0, [sp] - mov r0, #0x1e - mul r0, r7, r0 - ldr fp, [sb, r6, lsl #2] - add r1, r4, r0 - str fp, [sp, #4] - ldr fp, [r8, r7, lsl #2] - sub r2, r1, #0x100 - str fp, [sp, #8] - ldrsh r2, [r2, #-0xc2] - ldrsh r0, [r4, r0] - mov r1, sl - sub r2, r2, #1 - bl CreateHallway -_0233E738: - mov r0, #0 - strb r0, [r5, #0x19] - strb r0, [r5, #-0x1a8] - mov r0, #1 - strb r0, [r5, #0xb] - strb r0, [r5, #-0x1b7] -_0233E750: - ldrb r0, [r5, #0x1a] - cmp r0, #0 - beq _0233E7EC - ldrb r0, [r5, #0x1ca] - cmp r0, #0 - bne _0233E7D4 - ldrb r0, [r5, #0x1cc] - cmp r0, #0 - add r0, r5, #0x100 - ldreqsh r3, [r0, #0xc4] - beq _0233E794 - ldrsh r1, [r0, #0xc8] - ldrsh r2, [r0, #0xc4] - sub r1, r1, #1 - add r0, r2, #1 - bl DungeonRandRange - mov r3, r0 -_0233E794: - mov r0, #0 - str r0, [sp] - mov r0, #0x1e - ldr r2, [sp, #0x2c] - mov r1, sl - ldr sl, [r2, #4] - mla r0, r7, r0, r4 - sub sl, sl, #1 - str sl, [sp, #4] - ldr sl, [r8, r7, lsl #2] - add r2, r0, #0x100 - str sl, [sp, #8] - ldrsh r0, [r0, #4] - ldrsh r2, [r2, #0xc2] - sub r0, r0, #1 - bl CreateHallway -_0233E7D4: - mov r0, #0 - strb r0, [r5, #0x1a] - strb r0, [r5, #0x1db] - mov r0, #1 - strb r0, [r5, #0xb] - strb r0, [r5, #0x1cd] -_0233E7EC: - add r7, r7, #1 -_0233E7F0: - ldr r0, [sp, #0x14] - cmp r7, r0 - blt _0233E540 - add r6, r6, #1 -_0233E800: - ldr r0, [sp, #0x10] - cmp r6, r0 - blt _0233E524 - ldrb r0, [sp, #0x74] - cmp r0, #0 - bne _0233ED28 - mov r7, #0 - b _0233ED1C -_0233E820: - ldr r1, _0233ED30 ; =0x000001C2 - ldr r0, [sp, #0xc] - mov r8, #0 - mla r0, r7, r1, r0 - str r0, [sp, #0x20] - ldr r0, [sp, #0x14] - sub r0, r0, #2 - str r0, [sp, #0x40] - ldr r0, [sp, #0x10] - sub r0, r0, #2 - str r0, [sp, #0x38] - b _0233ED0C -_0233E850: - mov r0, #0x64 - bl DungeonRandInt - cmp r0, #5 - bge _0233ED08 - ldr r0, [sp, #0x20] - mov r1, #0x1e - mla r6, r8, r1, r0 - ldrb r0, [r6, #8] - cmp r0, #0 - bne _0233ED08 - ldrb r0, [r6, #0xb] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #0x12] - cmp r0, #0 - ldreqb r0, [r6, #9] - cmpeq r0, #0 - bne _0233ED08 - ldrb r0, [r6, #0xa] - cmp r0, #0 - beq _0233ED08 - mov r0, #4 - bl DungeonRandInt - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0233ED08 -_0233E8B8: ; jump table - b _0233E8C8 ; case 0 - b _0233E9DC ; case 1 - b _0233EAE4 ; case 2 - b _0233EBFC ; case 3 -_0233E8C8: - cmp r7, #1 - blt _0233ED08 - ldrb r0, [r6, #-0x1b7] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #-0x1ba] - cmp r0, #0 - bne _0233ED08 - ldrb r0, [r6, #-0x1b8] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #-0x1b9] - cmp r0, #0 - ldreqb r0, [r6, #-0x1b0] - cmpeq r0, #0 - bne _0233ED08 - sub r1, r6, #0x100 - ldrsh r0, [r1, #-0xc2] - ldrsh fp, [r1, #-0xc0] - ldrsh r1, [r6, #2] - str r0, [sp, #0x28] - sub r0, r6, #0x100 - ldrsh sb, [r0, #-0xbc] - ldrsh r2, [r6, #6] - cmp fp, r1 - movge fp, r1 - cmp sb, r2 - ldrsh r0, [r6] - ldrsh sl, [r6, #4] - movle sb, r2 - bl GetTile - ldrb r0, [r0, #7] - ldr r5, [sp, #0x28] - and r0, r0, #0xff - str r0, [sp, #0x30] - b _0233E99C -_0233E958: - mov r4, fp - b _0233E990 -_0233E960: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0] - add r4, r4, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - ldr r1, [sp, #0x30] - strb r1, [r0, #7] -_0233E990: - cmp r4, sb - blt _0233E960 - add r5, r5, #1 -_0233E99C: - cmp r5, sl - blt _0233E958 - ldr r0, [sp, #0x28] - sub r1, r6, #0x100 - strh r0, [r1, #-0xc2] - strh sl, [r1, #-0xbe] - strh fp, [r1, #-0xc0] - strh sb, [r1, #-0xbc] - mov r0, #1 - strb r0, [r6, #0x12] - strb r0, [r6, #-0x1b0] - mov r0, #0 - strb r0, [r6, #0xb] - mov r0, #1 - strb r0, [r6, #0x11] - b _0233ED08 -_0233E9DC: - cmp r8, #1 - blt _0233ED08 - ldrb r0, [r6, #-0x13] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #-0x16] - cmp r0, #0 - bne _0233ED08 - ldrb r0, [r6, #-0x14] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #-0x15] - cmp r0, #0 - ldreqb r0, [r6, #-0xc] - cmpeq r0, #0 - bne _0233ED08 - ldrsh r1, [r6, #-0x1c] - ldrsh r0, [r6] - ldrsh fp, [r6, #-0x1e] - str r1, [sp, #0x24] - ldrsh r1, [r6, #4] - ldrsh sb, [r6, #-0x1a] - cmp fp, r0 - movge fp, r0 - cmp sb, r1 - movle sb, r1 - ldrsh r1, [r6, #2] - ldrsh sl, [r6, #6] - bl GetTile - ldrb r0, [r0, #7] - mov r5, fp - and r0, r0, #0xff - str r0, [sp, #0x34] - b _0233EAA8 -_0233EA64: - ldr r4, [sp, #0x24] - b _0233EA9C -_0233EA6C: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0] - add r4, r4, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - ldr r1, [sp, #0x34] - strb r1, [r0, #7] -_0233EA9C: - cmp r4, sl - blt _0233EA6C - add r5, r5, #1 -_0233EAA8: - cmp r5, sb - blt _0233EA64 - strh fp, [r6, #-0x1e] - ldr r0, [sp, #0x24] - strh sb, [r6, #-0x1a] - strh r0, [r6, #-0x1c] - strh sl, [r6, #-0x18] - mov r0, #1 - strb r0, [r6, #0x12] - strb r0, [r6, #-0xc] - mov r0, #0 - strb r0, [r6, #0xb] - mov r0, #1 - strb r0, [r6, #0x11] - b _0233ED08 -_0233EAE4: - ldr r0, [sp, #0x38] - cmp r7, r0 - bgt _0233ED08 - ldrb r0, [r6, #0x1cd] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #0x1ca] - cmp r0, #0 - bne _0233ED08 - ldrb r0, [r6, #0x1cc] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #0x1cb] - cmp r0, #0 - ldreqb r0, [r6, #0x1d4] - cmpeq r0, #0 - bne _0233ED08 - add r0, r6, #0x100 - ldrsh sl, [r6] - ldrsh r0, [r0, #0xc4] - str r0, [sp, #0x1c] - ldrsh r1, [r6, #2] - mov r0, r0 - cmp r1, r0 - strlt r1, [sp, #0x1c] - add r0, r6, #0x100 - ldrsh fp, [r0, #0xc6] - ldrsh r0, [r0, #0xc8] - ldrsh sb, [r6, #6] - cmp sb, r0 - movle sb, r0 - mov r0, sl - bl GetTile - ldrb r0, [r0, #7] - mov r5, sl - and r0, r0, #0xff - str r0, [sp, #0x3c] - b _0233EBC0 -_0233EB7C: - ldr r4, [sp, #0x1c] - b _0233EBB4 -_0233EB84: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0] - add r4, r4, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - ldr r1, [sp, #0x3c] - strb r1, [r0, #7] -_0233EBB4: - cmp r4, sb - blt _0233EB84 - add r5, r5, #1 -_0233EBC0: - cmp r5, fp - blt _0233EB7C - strh sl, [r6] - strh fp, [r6, #4] - ldr r0, [sp, #0x1c] - strh r0, [r6, #2] - strh sb, [r6, #6] - mov r0, #1 - strb r0, [r6, #0x1d4] - strb r0, [r6, #0x12] - mov r0, #0 - strb r0, [r6, #0x1cd] - mov r0, #1 - strb r0, [r6, #0x1d3] - b _0233ED08 -_0233EBFC: - ldr r0, [sp, #0x40] - cmp r8, r0 - bgt _0233ED08 - ldrb r0, [r6, #0x29] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #0x26] - cmp r0, #0 - bne _0233ED08 - ldrb r0, [r6, #0x28] - cmp r0, #0 - beq _0233ED08 - ldrb r0, [r6, #0x27] - cmp r0, #0 - ldreqb r0, [r6, #0x30] - cmpeq r0, #0 - bne _0233ED08 - ldrsh r0, [r6, #0x1e] - str r0, [sp, #0x18] - ldrsh r0, [r6] - ldr r1, [sp, #0x18] - cmp r0, r1 - strlt r0, [sp, #0x18] - ldrsh sl, [r6, #2] - ldrsh r1, [r6, #0x22] - ldrsh sb, [r6, #4] - ldrsh fp, [r6, #0x24] - cmp sb, r1 - movle sb, r1 - mov r1, sl - bl GetTile - ldrb r0, [r0, #7] - ldr r5, [sp, #0x18] - and r0, r0, #0xff - str r0, [sp, #0x44] - b _0233ECD0 -_0233EC8C: - mov r4, sl - b _0233ECC4 -_0233EC94: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0] - add r4, r4, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - ldr r1, [sp, #0x44] - strb r1, [r0, #7] -_0233ECC4: - cmp r4, fp - blt _0233EC94 - add r5, r5, #1 -_0233ECD0: - cmp r5, sb - blt _0233EC8C - ldr r0, [sp, #0x18] - strh r0, [r6] - strh sb, [r6, #4] - strh sl, [r6, #2] - strh fp, [r6, #6] - mov r0, #1 - strb r0, [r6, #0x30] - strb r0, [r6, #0x12] - mov r0, #0 - strb r0, [r6, #0x29] - mov r0, #1 - strb r0, [r6, #0x2f] -_0233ED08: - add r8, r8, #1 -_0233ED0C: - ldr r0, [sp, #0x14] - cmp r8, r0 - blt _0233E850 - add r7, r7, #1 -_0233ED1C: - ldr r0, [sp, #0x10] - cmp r7, r0 - blt _0233E820 -_0233ED28: - add sp, sp, #0x48 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233ED30: .word 0x000001C2 - arm_func_end CreateGridCellConnections - - arm_func_start GenerateRoomImperfections -GenerateRoomImperfections: ; 0x0233ED34 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x34 - str r0, [sp] - str r1, [sp, #4] - str r2, [sp, #8] - mov fp, #0 - b _0233F100 -_0233ED50: - ldr r1, _0233F114 ; =0x000001C2 - ldr r0, [sp] - mov sl, #0 - mla r0, fp, r1, r0 - str r0, [sp, #0xc] - mvn r0, #0 - str r0, [sp, #0x30] - b _0233F0F0 -_0233ED70: - ldr r0, [sp, #0xc] - mov r1, #0x1e - mla sb, sl, r1, r0 - ldrb r0, [sb, #8] - cmp r0, #0 - ldreqb r0, [sb, #0x11] - cmpeq r0, #0 - ldreqb r0, [sb, #0x12] - cmpeq r0, #0 - bne _0233F0EC - ldrb r0, [sb, #0xb] - cmp r0, #0 - ldrneb r0, [sb, #0xa] - cmpne r0, #0 - beq _0233F0EC - ldrb r0, [sb, #9] - cmp r0, #0 - ldreqb r0, [sb, #0x10] - cmpeq r0, #0 - bne _0233F0EC - ldrb r0, [sb, #0x1c] - cmp r0, #0 - beq _0233F0EC - mov r0, #0x64 - bl DungeonRandInt - cmp r0, #0x3c - blt _0233F0EC - ldrsh r3, [sb, #4] - ldrsh r2, [sb] - ldrsh r1, [sb, #6] - ldrsh r0, [sb, #2] - sub r2, r3, r2 - sub r0, r1, r0 - add r1, r2, r0 - mov r0, r1, asr #1 - add r0, r1, r0, lsr #30 - movs r0, r0, asr #2 - str r0, [sp, #0x24] - moveq r0, #1 - streq r0, [sp, #0x24] - mov r0, #0 - str r0, [sp, #0x2c] - b _0233F0DC -_0233EE1C: - mov r4, #0 -_0233EE20: - mov r0, #4 - bl DungeonRandInt - str r0, [sp, #0x20] - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0233EE48 -_0233EE38: ; jump table - b _0233EE48 ; case 0 - b _0233EE70 ; case 1 - b _0233EE9C ; case 2 - b _0233EECC ; case 3 -_0233EE48: - cmp r4, #0 - movne r0, #1 - strne r0, [sp, #0x28] - movne r5, #0 - moveq r0, #0 - ldrsh r8, [sb] - ldrsh r7, [sb, #2] - streq r0, [sp, #0x28] - moveq r5, #1 - b _0233EEF4 -_0233EE70: - ldrsh r0, [sb, #4] - cmp r4, #0 - movne r5, #1 - sub r8, r0, #1 - movne r0, #0 - strne r0, [sp, #0x28] - ldreq r0, [sp, #0x30] - ldrsh r7, [sb, #2] - streq r0, [sp, #0x28] - moveq r5, #0 - b _0233EEF4 -_0233EE9C: - ldrsh r0, [sb, #6] - cmp r4, #0 - ldrsh r1, [sb, #4] - sub r7, r0, #1 - ldrne r0, [sp, #0x30] - movne r5, #0 - strne r0, [sp, #0x28] - moveq r0, #0 - sub r8, r1, #1 - streq r0, [sp, #0x28] - ldreq r5, [sp, #0x30] - b _0233EEF4 -_0233EECC: - ldrsh r0, [sb, #6] - cmp r4, #0 - ldrne r5, [sp, #0x30] - sub r7, r0, #1 - movne r0, #0 - strne r0, [sp, #0x28] - moveq r0, #1 - ldrsh r8, [sb] - streq r0, [sp, #0x28] - moveq r5, #0 -_0233EEF4: - mov r6, #0 - b _0233F0BC -_0233EEFC: - ldrsh r0, [sb] - cmp r8, r0 - blt _0233F0C4 - ldrsh r0, [sb, #4] - cmp r8, r0 - bge _0233F0C4 - ldrsh r0, [sb, #2] - cmp r7, r0 - blt _0233F0C4 - ldrsh r0, [sb, #6] - cmp r7, r0 - bge _0233F0C4 - mov r0, r8 - mov r1, r7 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _0233F0AC - mov r5, #0 - b _0233F014 -_0233EF50: - ldr r0, _0233F118 ; =DIRECTIONS_XY - mov r1, r5, lsl #2 - ldrsh r2, [r0, r1] - add r0, r0, r5, lsl #2 - ldrsh r1, [r0, #2] - add r0, r8, r2 - str r0, [sp, #0x1c] - mov r0, #0 - str r0, [sp, #0x10] - add r0, r7, r1 - str r0, [sp, #0x18] - ldr r6, [sp, #0x30] - b _0233EFFC -_0233EF84: - ldr r0, [sp, #0x30] - str r0, [sp, #0x14] - b _0233EFE0 -_0233EF90: - ldr r1, [sp, #0x1c] - ldr r0, [sp, #0x14] - add r0, r1, r0 - ldr r1, [sp, #0x18] - add r1, r1, r6 - bl GetTile - ldrh r1, [r0] - and r1, r1, #3 - cmp r1, #1 - bne _0233EFD4 - ldrb r0, [r0, #7] - cmp r0, #0xff - moveq r0, #1 - streq r0, [sp, #0x10] - ldr r0, [sp, #0x10] - cmp r0, #0 - bne _0233EFEC -_0233EFD4: - ldr r0, [sp, #0x14] - add r0, r0, #1 - str r0, [sp, #0x14] -_0233EFE0: - ldr r0, [sp, #0x14] - cmp r0, #1 - ble _0233EF90 -_0233EFEC: - ldr r0, [sp, #0x10] - cmp r0, #0 - bne _0233F004 - add r6, r6, #1 -_0233EFFC: - cmp r6, #1 - ble _0233EF84 -_0233F004: - ldr r0, [sp, #0x10] - cmp r0, #0 - bne _0233F01C - add r5, r5, #1 -_0233F014: - cmp r5, #8 - blt _0233EF50 -_0233F01C: - cmp r5, #8 - bne _0233F0C4 - ldr r1, _0233F11C ; =CORNER_CARDINAL_NEIGHBOR_IS_OPEN - ldr r0, [sp, #0x20] - mov r5, #0 - add r6, r1, r0, lsl #3 - b _0233F080 -_0233F038: - ldr r0, _0233F118 ; =DIRECTIONS_XY - mov r1, r5, lsl #2 - ldrsh r2, [r0, r1] - add r0, r0, r5, lsl #2 - ldrsh r1, [r0, #2] - add r0, r8, r2 - add r1, r7, r1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - moveq r0, #1 - movne r0, #0 - and r1, r0, #0xff - ldrb r0, [r5, r6] - cmp r1, r0 - bne _0233F088 - add r5, r5, #2 -_0233F080: - cmp r5, #8 - blt _0233F038 -_0233F088: - cmp r5, #8 - bne _0233F0C4 - mov r0, r8 - mov r1, r7 - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - b _0233F0C4 -_0233F0AC: - ldr r0, [sp, #0x28] - add r7, r7, r5 - add r8, r8, r0 - add r6, r6, #1 -_0233F0BC: - cmp r6, #0xa - blt _0233EEFC -_0233F0C4: - add r4, r4, #1 - cmp r4, #2 - blt _0233EE20 - ldr r0, [sp, #0x2c] - add r0, r0, #1 - str r0, [sp, #0x2c] -_0233F0DC: - ldr r1, [sp, #0x2c] - ldr r0, [sp, #0x24] - cmp r1, r0 - blt _0233EE1C -_0233F0EC: - add sl, sl, #1 -_0233F0F0: - ldr r0, [sp, #8] - cmp sl, r0 - blt _0233ED70 - add fp, fp, #1 -_0233F100: - ldr r0, [sp, #4] - cmp fp, r0 - blt _0233ED50 - add sp, sp, #0x34 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233F114: .word 0x000001C2 -_0233F118: .word DIRECTIONS_XY -_0233F11C: .word CORNER_CARDINAL_NEIGHBOR_IS_OPEN - arm_func_end GenerateRoomImperfections - - arm_func_start CreateHallway -CreateHallway: ; 0x0233F120 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - ldrb r6, [sp, #0x28] - mov sl, r0 - ldr r0, [sp, #0x30] - mov sb, r1 - cmp r6, #0 - mov r8, r2 - mov r7, r3 - mov r4, sl - mov r5, sb - ldr fp, [sp, #0x2c] - str r0, [sp, #0x30] - mov r6, #0 - beq _0233F328 - b _0233F1C4 -_0233F15C: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F1AC - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F1B4 -_0233F1AC: - cmp sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F1B4: - ldr r0, [sp, #0x30] - cmp sb, r0 - addlt sb, sb, #1 - subge sb, sb, #1 -_0233F1C4: - ldr r0, [sp, #0x30] - cmp sb, r0 - bne _0233F15C - mov r6, #0 - b _0233F240 -_0233F1D8: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F228 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F234 -_0233F228: - cmp sl, r4 - cmpeq sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F234: - cmp sl, r8 - addlt sl, sl, #1 - subge sl, sl, #1 -_0233F240: - cmp sl, r8 - bne _0233F1D8 - mov r6, #0 - b _0233F2B8 -_0233F250: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F2A0 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F2AC -_0233F2A0: - cmp sl, r4 - cmpeq sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F2AC: - cmp sb, r7 - addlt sb, sb, #1 - subge sb, sb, #1 -_0233F2B8: - cmp sb, r7 - bne _0233F250 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F2C4: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F314 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F31C -_0233F314: - cmp sl, r4 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F31C: - cmp sl, fp - addlt sl, sl, #1 - subge sl, sl, #1 -_0233F328: - cmp sl, fp - bne _0233F2C4 - mov r6, #0 - b _0233F3A0 -_0233F338: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F388 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F394 -_0233F388: - cmp sl, r4 - cmpeq sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F394: - cmp sb, r7 - addlt sb, sb, #1 - subge sb, sb, #1 -_0233F3A0: - cmp sb, r7 - bne _0233F338 - mov r6, #0 - b _0233F418 -_0233F3B0: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F400 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F40C -_0233F400: - cmp sl, r4 - cmpeq sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F40C: - cmp sl, r8 - addlt sl, sl, #1 - subge sl, sl, #1 -_0233F418: - cmp sl, r8 - bne _0233F3B0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - arm_func_end CreateHallway - - arm_func_start EnsureConnectedGrid -EnsureConnectedGrid: ; 0x0233F424 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x2c - str r0, [sp, #0xc] - mov r7, r1 - mov fp, r2 - mov r6, r3 - ldr r5, [sp, #0x50] - mov r8, #0 - b _0233F818 -_0233F448: - ldr r1, _0233F8FC ; =0x000001C2 - ldr r0, [sp, #0xc] - mov r4, #0 - mla sb, r8, r1, r0 - sub r0, fp, #1 - str r0, [sp, #0x20] - add r0, r6, r8, lsl #2 - str r0, [sp, #0x28] - sub r0, r7, #1 - str r0, [sp, #0x24] - b _0233F80C -_0233F474: - mov r0, #0x1e - mla sl, r4, r0, sb - ldrb r0, [sl, #8] - cmp r0, #0 - ldreqb r0, [sl, #0x11] - cmpeq r0, #0 - ldreqb r0, [sl, #0xb] - cmpeq r0, #0 - bne _0233F808 - ldrb r0, [sl, #0xa] - cmp r0, #0 - beq _0233F7CC - ldrb r0, [sl, #9] - cmp r0, #0 - bne _0233F7CC - ldrsh r0, [sl] - ldrsh r1, [sl, #4] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - str r0, [sp, #0x1c] - ldrsh r0, [sl, #2] - ldrsh r1, [sl, #6] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - str r0, [sp, #0x18] - cmp r4, #0 - ble _0233F590 - ldrb r0, [sl, #-0x16] - cmp r0, #0 - ldreqb r0, [sl, #-0xc] - cmpeq r0, #0 - bne _0233F590 - ldrb r0, [sl, #-0x13] - cmp r0, #0 - beq _0233F590 - ldrb r0, [sl, #-0x14] - cmp r0, #0 - ldrsh r0, [sl, #-0x1e] - streq r0, [sp, #0x14] - beq _0233F544 - ldrsh r1, [sl, #-0x1a] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - str r0, [sp, #0x14] - ldrsh r0, [sl, #-0x1c] - ldrsh r1, [sl, #-0x18] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange -_0233F544: - mov r1, #1 - str r1, [sp] - mov r1, #0x1e - mla sl, r4, r1, sb - ldr r1, [r6, r8, lsl #2] - ldr r0, [sp, #0x1c] - str r1, [sp, #4] - ldr r1, [r5, r4, lsl #2] - ldr r2, [sp, #0x14] - str r1, [sp, #8] - ldrsh r3, [sl, #-0x18] - ldrsh r1, [sl, #2] - sub r3, r3, #1 - bl CreateHallway - mov r0, #1 - strb r0, [sl, #0xb] - strb r0, [sl, #0x13] - strb r0, [sl, #-0xa] - b _0233F808 -_0233F590: - ldr r0, [sp, #0x20] - cmp r4, r0 - bge _0233F64C - ldrb r0, [sl, #0x26] - cmp r0, #0 - ldreqb r0, [sl, #0x30] - cmpeq r0, #0 - bne _0233F64C - ldrb r0, [sl, #0x29] - cmp r0, #0 - beq _0233F64C - ldrb r0, [sl, #0x28] - cmp r0, #0 - ldrsh r0, [sl, #0x1e] - streq r0, [sp, #0x10] - beq _0233F5F8 - ldrsh r1, [sl, #0x22] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange - str r0, [sp, #0x10] - ldrsh r0, [sl, #0x20] - ldrsh r1, [sl, #0x24] - add r0, r0, #1 - sub r1, r1, #1 - bl DungeonRandRange -_0233F5F8: - mov r1, #1 - str r1, [sp] - mov r1, #0x1e - mla sl, r4, r1, sb - ldr r3, [r6, r8, lsl #2] - add r1, r5, r4, lsl #2 - str r3, [sp, #4] - ldr r1, [r1, #4] - ldr r0, [sp, #0x1c] - sub r1, r1, #1 - str r1, [sp, #8] - ldrsh r1, [sl, #6] - ldrsh r3, [sl, #0x20] - ldr r2, [sp, #0x10] - sub r1, r1, #1 - bl CreateHallway - mov r0, #1 - strb r0, [sl, #0xb] - strb r0, [sl, #0x14] - strb r0, [sl, #0x31] - b _0233F808 -_0233F64C: - cmp r8, #0 - ble _0233F708 - ldrb r0, [sl, #-0x1ba] - cmp r0, #0 - ldreqb r0, [sl, #-0x1b0] - cmpeq r0, #0 - bne _0233F708 - ldrb r0, [sl, #-0x1b7] - cmp r0, #0 - beq _0233F708 - ldrb r0, [sl, #-0x1b8] - cmp r0, #0 - sub r0, sl, #0x100 - ldreqsh r3, [r0, #-0xc0] - beq _0233F6B8 - ldrsh r1, [r0, #-0xbe] - ldrsh r2, [r0, #-0xc2] - sub r1, r1, #1 - add r0, r2, #1 - bl DungeonRandRange - sub r0, sl, #0x100 - ldrsh r1, [r0, #-0xbc] - ldrsh r2, [r0, #-0xc0] - sub r1, r1, #1 - add r0, r2, #1 - bl DungeonRandRange - mov r3, r0 -_0233F6B8: - mov r0, #0 - str r0, [sp] - mov r0, #0x1e - mul r0, r4, r0 - ldr ip, [r6, r8, lsl #2] - add sl, sb, r0 - str ip, [sp, #4] - ldr ip, [r5, r4, lsl #2] - sub r2, sl, #0x100 - str ip, [sp, #8] - ldrsh r2, [r2, #-0xc2] - ldrsh r0, [sb, r0] - ldr r1, [sp, #0x18] - sub r2, r2, #1 - bl CreateHallway - mov r0, #1 - strb r0, [sl, #0xb] - strb r0, [sl, #0x15] - strb r0, [sl, #-0x1ac] - b _0233F808 -_0233F708: - ldr r0, [sp, #0x24] - cmp r8, r0 - bge _0233F808 - ldrb r0, [sl, #0x1ca] - cmp r0, #0 - ldreqb r0, [sl, #0x1d4] - cmpeq r0, #0 - bne _0233F808 - ldrb r0, [sl, #0x1cd] - cmp r0, #0 - beq _0233F808 - ldrb r0, [sl, #0x1cc] - cmp r0, #0 - add r0, sl, #0x100 - ldreqsh r3, [r0, #0xc4] - beq _0233F778 - ldrsh r1, [r0, #0xc6] - ldrsh r2, [r0, #0xc2] - sub r1, r1, #1 - add r0, r2, #1 - bl DungeonRandRange - add r0, sl, #0x100 - ldrsh r1, [r0, #0xc8] - ldrsh r2, [r0, #0xc4] - sub r1, r1, #1 - add r0, r2, #1 - bl DungeonRandRange - mov r3, r0 -_0233F778: - mov r0, #0 - str r0, [sp] - mov r0, #0x1e - mla sl, r4, r0, sb - ldr r0, [sp, #0x28] - ldr r1, [sp, #0x18] - ldr r2, [r0, #4] - add r0, sl, #0x100 - sub r2, r2, #1 - str r2, [sp, #4] - ldr r2, [r5, r4, lsl #2] - str r2, [sp, #8] - ldrsh r2, [r0, #0xc2] - ldrsh r0, [sl, #4] - sub r0, r0, #1 - bl CreateHallway - mov r0, #1 - strb r0, [sl, #0xb] - strb r0, [sl, #0x16] - strb r0, [sl, #0x1d7] - b _0233F808 -_0233F7CC: - ldrsh r0, [sl] - ldrsh r1, [sl, #2] - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0, #2] - bic r1, r1, #1 - strh r1, [r0, #2] - ldrh r1, [r0, #2] - bic r1, r1, #2 - strh r1, [r0, #2] - ldrh r1, [r0, #2] - bic r1, r1, #4 - strh r1, [r0, #2] -_0233F808: - add r4, r4, #1 -_0233F80C: - cmp r4, fp - blt _0233F474 - add r8, r8, #1 -_0233F818: - cmp r8, r7 - blt _0233F448 - mov r8, #0 - b _0233F8EC -_0233F828: - ldr r1, _0233F8FC ; =0x000001C2 - ldr r0, [sp, #0xc] - mov sb, #0 - mla sl, r8, r1, r0 - b _0233F8E0 -_0233F83C: - mov r0, #0x1e - mla r5, sb, r0, sl - ldrb r0, [r5, #8] - cmp r0, #0 - ldreqb r0, [r5, #0x11] - cmpeq r0, #0 - ldreqb r0, [r5, #0xb] - cmpeq r0, #0 - ldreqb r0, [r5, #0xf] - cmpeq r0, #0 - bne _0233F8DC - ldrsh r6, [r5] - b _0233F8D0 -_0233F870: - ldrsh r4, [r5, #2] - b _0233F8C0 -_0233F878: - mov r0, r6 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0] - add r4, r4, #1 - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0, #2] - bic r1, r1, #2 - strh r1, [r0, #2] - ldrh r1, [r0, #2] - bic r1, r1, #1 - strh r1, [r0, #2] - ldrh r1, [r0, #2] - bic r1, r1, #4 - strh r1, [r0, #2] - mov r1, #0xff - strb r1, [r0, #7] -_0233F8C0: - ldrsh r0, [r5, #6] - cmp r4, r0 - blt _0233F878 - add r6, r6, #1 -_0233F8D0: - ldrsh r0, [r5, #4] - cmp r6, r0 - blt _0233F870 -_0233F8DC: - add sb, sb, #1 -_0233F8E0: - cmp sb, fp - blt _0233F83C - add r8, r8, #1 -_0233F8EC: - cmp r8, r7 - blt _0233F828 - add sp, sp, #0x2c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233F8FC: .word 0x000001C2 - arm_func_end EnsureConnectedGrid - - arm_func_start SetTerrainObstacleChecked -SetTerrainObstacleChecked: ; 0x0233F900 - ldrh r3, [r0] - cmp r1, #0 - bic r1, r3, #3 - strh r1, [r0] - bxeq lr - ldrb r1, [r0, #7] - cmp r1, r2 - bxne lr - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #2 - strh r1, [r0] - bx lr - arm_func_end SetTerrainObstacleChecked - - arm_func_start FinalizeJunctions -FinalizeJunctions: ; 0x0233F93C - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r4, #0 -_0233F944: - sub r5, r4, #1 - mov r6, #0 - mov r7, #0xff -_0233F950: - mov r0, r4 - mov r1, r6 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _0233FAFC - mov r0, r4 - mov r1, r6 - bl GetTile - ldrb r0, [r0, #7] - cmp r0, #0xff - bne _0233FAD4 - cmp r4, #0 - ble _0233F9D4 - mov r0, r5 - mov r1, r6 - bl GetTileSafe - ldrb r1, [r0, #7] - cmp r1, #0xff - beq _0233F9D4 - ldrh r1, [r0] - orr r2, r1, #8 - and r1, r2, #3 - strh r2, [r0] - cmp r1, #2 - bne _0233F9D4 - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] -_0233F9D4: - cmp r6, #0 - ble _0233FA28 - mov r0, r4 - sub r1, r6, #1 - bl GetTileSafe - ldrb r1, [r0, #7] - cmp r1, #0xff - beq _0233FA28 - ldrh r1, [r0] - orr r1, r1, #8 - orr r2, r1, #8 - and r1, r2, #3 - strh r2, [r0] - cmp r1, #2 - bne _0233FA28 - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] -_0233FA28: - cmp r6, #0x1f - bge _0233FA7C - mov r0, r4 - add r1, r6, #1 - bl GetTileSafe - ldrb r1, [r0, #7] - cmp r1, #0xff - beq _0233FA7C - ldrh r1, [r0] - orr r1, r1, #8 - orr r2, r1, #8 - and r1, r2, #3 - strh r2, [r0] - cmp r1, #2 - bne _0233FA7C - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] -_0233FA7C: - cmp r4, #0x37 - bge _0233FAFC - mov r1, r6 - add r0, r4, #1 - bl GetTileSafe - ldrb r1, [r0, #7] - cmp r1, #0xff - beq _0233FAFC - ldrh r1, [r0] - orr r1, r1, #8 - orr r2, r1, #8 - and r1, r2, #3 - strh r2, [r0] - cmp r1, #2 - bne _0233FAFC - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233FAFC -_0233FAD4: - mov r0, r4 - mov r1, r6 - bl GetTile - ldrb r0, [r0, #7] - cmp r0, #0xfe - bne _0233FAFC - mov r0, r4 - mov r1, r6 - bl GetTileSafe - strb r7, [r0, #7] -_0233FAFC: - add r6, r6, #1 - cmp r6, #0x20 - blt _0233F950 - add r4, r4, #1 - cmp r4, #0x38 - blt _0233F944 - bl ov29_0233FB1C - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end FinalizeJunctions - - arm_func_start ov29_0233FB1C -ov29_0233FB1C: ; 0x0233FB1C -#ifdef JAPAN -#define OV29_0233FB1C_OFFSET 0x5C -#else -#define OV29_0233FB1C_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, lr} - ldr r0, _0233FBE4 ; =DUNGEON_PTR - mov r1, #0 - ldr r6, [r0] - mov r7, r1 -_0233FB30: - add r0, r6, r1, lsl #1 -#ifdef JAPAN - add r0, r0, #0xf100 -#else - add r0, r0, #0xf200 -#endif - add r1, r1, #1 - strh r7, [r0, #0x68 + OV29_0233FB1C_OFFSET] - cmp r1, #0x20 - blt _0233FB30 -_0233FB48: - mov r0, r7, lsl #0x10 - mov r5, #0 - mov r4, r0, asr #0x10 -_0233FB54: - mov r0, r7 - mov r1, r5 - bl GetTile - ldrh r0, [r0] - tst r0, #8 - beq _0233FBC8 - mov r0, r7 - mov r1, r5 - bl GetTile - ldrb r2, [r0, #7] - cmp r2, #0 - blt _0233FBC8 - cmp r2, #0x20 - addlt r0, r6, r2, lsl #1 -#ifdef JAPAN - addlt r1, r0, #0xf100 -#else - addlt r1, r0, #0xf200 -#endif - ldrltsh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] - cmplt r0, #0x20 - bge _0233FBC8 - add r2, r6, r2, lsl #7 - add r0, r2, r0, lsl #2 - add r0, r0, #0xf200 -#ifdef JAPAN - strh r4, [r0, #4] -#else - strh r4, [r0, #0xa8] -#endif - ldrsh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] - add r0, r2, r0, lsl #2 - add r0, r0, #0xf200 -#ifdef JAPAN - strh r5, [r0, #6] -#else - strh r5, [r0, #0xaa] -#endif - ldrsh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] - add r0, r0, #1 - strh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] -_0233FBC8: - add r5, r5, #1 - cmp r5, #0x20 - blt _0233FB54 - add r7, r7, #1 - cmp r7, #0x38 - blt _0233FB48 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_0233FBE4: .word DUNGEON_PTR - arm_func_end ov29_0233FB1C - - arm_func_start GenerateKecleonShop -GenerateKecleonShop: ; 0x0233FBE8 -#ifdef JAPAN -#define GENERATE_KECLEON_SHOP_OFFSET -0xA4 -#else -#define GENERATE_KECLEON_SHOP_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x44 - ldr r5, _0233FF8C ; =DUNGEON_PTR - ldr r4, _0233FF90 ; =FLOOR_GENERATION_STATUS - mvn r7, #0 - ldr r6, [r5] - strh r7, [r4, #0x20] - strh r7, [r4, #0x22] - ldrb r4, [r4, #1] - mov sl, r0 - str r1, [sp] - str r2, [sp, #4] - mov r5, r3 - cmp r4, #0 - bne _0233FF84 - bl GetFloorType - cmp r0, #2 - cmpne r5, #0 - beq _0233FF84 - mov r0, #0x64 - bl DungeonRandInt - cmp r5, r0 - ble _0233FF84 - mov r4, #0 - add r2, sp, #0x26 - add r1, sp, #8 -_0233FC50: - mov r0, r4, lsl #0x10 - mov r3, r4, lsl #1 - mov r0, r0, asr #0x10 - add r4, r4, #1 - strh r0, [r2, r3] - strh r0, [r1, r3] - cmp r4, #0xf - blt _0233FC50 - mov r7, #0xf - mov r8, #0 - mov r5, r7 - add r4, sp, #0x26 -_0233FC80: - mov r0, r7 - bl DungeonRandInt - mov sb, r0 - mov r0, r5 - bl DungeonRandInt - mov r3, sb, lsl #1 - mov r1, r0, lsl #1 - add r8, r8, #1 - ldrsh r2, [r4, r3] - ldrsh r0, [r4, r1] - cmp r8, #0xc8 - strh r0, [r4, r3] - strh r2, [r4, r1] - blt _0233FC80 - mov r7, #0xf - mov r8, #0 - mov r5, r7 - add r4, sp, #8 -_0233FCC8: - mov r0, r7 - bl DungeonRandInt - mov sb, r0 - mov r0, r5 - bl DungeonRandInt - mov r3, sb, lsl #1 - mov r1, r0, lsl #1 - add r8, r8, #1 - ldrsh r2, [r4, r3] - ldrsh r0, [r4, r1] - cmp r8, #0xc8 - strh r0, [r4, r3] - strh r2, [r4, r1] - blt _0233FCC8 - mov r4, #0 - b _0233FF7C -_0233FD08: - add r0, sp, #0x26 - mov r1, r4, lsl #1 - ldrsh r1, [r0, r1] - ldr r0, [sp] - cmp r1, r0 - bge _0233FF78 - ldr r0, _0233FF94 ; =0x000001C2 - mov r5, #0 - mul fp, r1, r0 - add sb, sl, fp - b _0233FF70 -_0233FD34: - mov r1, r5, lsl #1 - add r0, sp, #8 - ldrsh r1, [r0, r1] - ldr r0, [sp, #4] - cmp r1, r0 - bge _0233FF6C - mov r0, #0x1e - mul r7, r1, r0 - add r8, sb, r7 - ldrb r0, [r8, #8] - cmp r0, #0 - ldreqb r0, [r8, #0x11] - cmpeq r0, #0 - ldreqb r0, [r8, #0x12] - cmpeq r0, #0 - bne _0233FF6C - ldrb r0, [r8, #0xb] - cmp r0, #0 - ldrneb r0, [r8, #0xa] - cmpne r0, #0 - beq _0233FF6C - ldrb r0, [r8, #9] - cmp r0, #0 - ldreqb r0, [r8, #0x10] - cmpeq r0, #0 - ldreqb r0, [r8, #0x1d] - cmpeq r0, #0 - bne _0233FF6C - ldrsh r1, [r8, #4] - ldrsh r0, [r8] - sub r0, r1, r0 - bl abs - cmp r0, #5 - blt _0233FF6C - ldrsh r1, [r8, #6] - ldrsh r0, [r8, #2] - sub r0, r1, r0 - bl abs - cmp r0, #4 - blt _0233FF6C - ldr r0, _0233FF90 ; =FLOOR_GENERATION_STATUS - add r1, sl, fp - mov r3, #1 - strb r3, [r0, #3] - add r2, r1, r7 - strb r3, [r2, #0xc] - ldrsh r1, [sb, r7] - add r1, r1, #1 - str r1, [r0, #0x30] - ldrsh r1, [r2, #4] - sub r1, r1, #1 - str r1, [r0, #0x38] - ldrsh r1, [r2, #2] - add r3, r1, #1 - str r3, [r0, #0x34] - ldrsh r1, [r2, #6] - sub r2, r1, #1 - sub r1, r2, r3 - cmp r1, #3 - str r2, [r0, #0x3c] - addlt r1, r2, #1 - strlt r1, [r0, #0x3c] - ldr r1, _0233FF98 ; =0x0000270F - add r0, r6, #0xc000 - str r1, [r0, #0xd14 + GENERATE_KECLEON_SHOP_OFFSET] - str r1, [r0, #0xd18 + GENERATE_KECLEON_SHOP_OFFSET] - rsb r2, r1, #0 - str r2, [r0, #0xd1c + GENERATE_KECLEON_SHOP_OFFSET] - ldr r1, _0233FF90 ; =FLOOR_GENERATION_STATUS - str r2, [r0, #0xd20 + GENERATE_KECLEON_SHOP_OFFSET] - ldr r4, [r1, #0x30] - b _0233FED8 -_0233FE54: - ldr sl, _0233FF90 ; =FLOOR_GENERATION_STATUS - add r8, r6, #0xc000 - ldr r5, [sl, #0x34] - b _0233FEC8 -_0233FE64: - mov r0, r4 - mov r1, r5 - bl GetTileSafe - ldrh r1, [r0] - orr r1, r1, #0x20 - strh r1, [r0] - ldrh r1, [r0, #2] - bic r1, r1, #8 - strh r1, [r0, #2] - ldrh r1, [r0, #2] - bic r1, r1, #1 - strh r1, [r0, #2] - ldr r0, [r8, #0xd14 + GENERATE_KECLEON_SHOP_OFFSET] - cmp r0, r4 - strgt r4, [r8, #0xd14 + GENERATE_KECLEON_SHOP_OFFSET] - ldr r0, [r8, #0xd18 + GENERATE_KECLEON_SHOP_OFFSET] - cmp r0, r5 - strgt r5, [r8, #0xd18 + GENERATE_KECLEON_SHOP_OFFSET] - ldr r0, [r8, #0xd1c + GENERATE_KECLEON_SHOP_OFFSET] - cmp r0, r4 - strlt r4, [r8, #0xd1c + GENERATE_KECLEON_SHOP_OFFSET] - ldr r0, [r8, #0xd20 + GENERATE_KECLEON_SHOP_OFFSET] - cmp r0, r5 - strlt r5, [r8, #0xd20 + GENERATE_KECLEON_SHOP_OFFSET] - add r5, r5, #1 -_0233FEC8: - ldr r0, [sl, #0x3c] - cmp r5, r0 - blt _0233FE64 - add r4, r4, #1 -_0233FED8: - ldr r0, _0233FF90 ; =FLOOR_GENERATION_STATUS - ldr r0, [r0, #0x38] - cmp r4, r0 - blt _0233FE54 - add r4, sb, r7 - ldrsh r5, [sb, r7] - b _0233FF28 -_0233FEF4: - ldrsh r6, [r4, #2] - b _0233FF18 -_0233FEFC: - mov r0, r5 - mov r1, r6 - bl GetTileSafe - ldrh r1, [r0, #2] - add r6, r6, #1 - orr r1, r1, #0x10 - strh r1, [r0, #2] -_0233FF18: - ldrsh r0, [r4, #6] - cmp r6, r0 - blt _0233FEFC - add r5, r5, #1 -_0233FF28: - ldrsh r0, [r4, #4] - cmp r5, r0 - blt _0233FEF4 - ldr r1, _0233FF90 ; =FLOOR_GENERATION_STATUS - ldr r2, [r1, #0x30] - ldr r0, [r1, #0x38] - add r0, r2, r0 - add r0, r0, r0, lsr #31 - mov r0, r0, asr #1 - strh r0, [r1, #0x20] - ldr r2, [r1, #0x34] - ldr r0, [r1, #0x3c] - add r0, r2, r0 - add r0, r0, r0, lsr #31 - mov r0, r0, asr #1 - strh r0, [r1, #0x22] - b _0233FF84 -_0233FF6C: - add r5, r5, #1 -_0233FF70: - cmp r5, #0xf - blt _0233FD34 -_0233FF78: - add r4, r4, #1 -_0233FF7C: - cmp r4, #0xf - blt _0233FD08 -_0233FF84: - add sp, sp, #0x44 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233FF8C: .word DUNGEON_PTR -_0233FF90: .word FLOOR_GENERATION_STATUS -_0233FF94: .word 0x000001C2 -_0233FF98: .word 0x0000270F - arm_func_end GenerateKecleonShop - - arm_func_start GenerateMonsterHouse -GenerateMonsterHouse: ; 0x0233FF9C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x100 - ldr r4, _02340218 ; =DUNGEON_PTR - movs r5, r3 - mov sl, r0 - mov sb, r1 - mov r8, r2 - ldr r6, [r4] - beq _02340210 - mov r0, #0x64 - bl DungeonRandInt - cmp r5, r0 - ble _02340210 - ldr r0, _0234021C ; =FLOOR_GENERATION_STATUS - ldrb r0, [r0, #3] - cmp r0, #0 - bne _02340210 - bl IsOutlawMonsterHouseFloor - cmp r0, #0 - bne _0233FFF8 - bl IsDestinationFloorWithMonster - cmp r0, #0 - bne _02340210 -_0233FFF8: - bl GetFloorType - cmp r0, #0 - bne _02340210 - mov r5, #0 - mov r2, r5 - mov r1, r5 - b _02340088 -_02340014: - ldr r0, _02340220 ; =0x000001C2 - mov r3, r1 - mla r4, r2, r0, sl - mov r7, #0x1e - b _0234007C -_02340028: - mla r0, r3, r7, r4 - ldrb fp, [r0, #8] - cmp fp, #0 - ldreqb fp, [r0, #0x11] - cmpeq fp, #0 - bne _02340078 - ldrb fp, [r0, #0xb] - cmp fp, #0 - ldrneb fp, [r0, #0xa] - cmpne fp, #0 - beq _02340078 - ldrb fp, [r0, #0xc] - cmp fp, #0 - ldreqb fp, [r0, #0xf] - cmpeq fp, #0 - ldreqb fp, [r0, #0x10] - cmpeq fp, #0 - ldreqb r0, [r0, #9] - cmpeq r0, #0 - addeq r5, r5, #1 -_02340078: - add r3, r3, #1 -_0234007C: - cmp r3, r8 - blt _02340028 - add r2, r2, #1 -_02340088: - cmp r2, sb - blt _02340014 - cmp r5, #0 - beq _02340210 - mov r1, #0 - mov r7, r1 - add r0, sp, #0 -_023400A4: - strb r7, [r0, r1] - add r1, r1, #1 - cmp r1, #0x100 - blt _023400A4 - mov r0, #1 - strb r0, [sp] - add fp, sp, #0 -_023400C0: - mov r0, r5 - bl DungeonRandInt - mov r4, r0 - mov r0, r5 - bl DungeonRandInt - add r7, r7, #1 - ldrb r2, [fp, r4] - ldrb r1, [fp, r0] - cmp r7, #0x40 - strb r1, [fp, r4] - strb r2, [fp, r0] - blt _023400C0 - mov r7, #0 - mov r4, r7 - add fp, sp, #0 - b _02340208 -_02340100: - ldr r0, _02340220 ; =0x000001C2 - mov r5, #0 - mul r3, r4, r0 - add r2, sl, r3 - mov lr, #0x1e - b _023401FC -_02340118: - mul r1, r5, lr - add r0, r2, r1 - ldrb ip, [r0, #8] - cmp ip, #0 - ldreqb ip, [r0, #0x11] - cmpeq ip, #0 - bne _023401F8 - ldrb ip, [r0, #0xb] - cmp ip, #0 - ldrneb ip, [r0, #0xa] - cmpne ip, #0 - beq _023401F8 - ldrb ip, [r0, #0xc] - cmp ip, #0 - ldreqb ip, [r0, #0xf] - cmpeq ip, #0 - ldreqb ip, [r0, #0x10] - cmpeq ip, #0 - ldreqb r0, [r0, #9] - cmpeq r0, #0 - bne _023401F8 - ldrb r0, [fp, r7] - cmp r0, #0 - beq _023401F4 - ldr r0, _0234021C ; =FLOOR_GENERATION_STATUS - add r2, sl, r3 - mov r3, #1 - strb r3, [r0, #1] - add r7, r2, r1 - strb r3, [r7, #0xe] - ldrsh r5, [r2, r1] - add r6, r6, #0x4000 - b _023401E4 -_0234019C: - ldrsh r4, [r7, #2] - b _023401D4 -_023401A4: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r2, [r0] - mov r1, r4 - orr r2, r2, #0x40 - strh r2, [r0] - mov r0, r5 - bl GetTile - ldrb r0, [r0, #7] - add r4, r4, #1 -#ifdef JAPAN - strb r0, [r6, #0x25] -#else - strb r0, [r6, #0xc9] -#endif -_023401D4: - ldrsh r0, [r7, #6] - cmp r4, r0 - blt _023401A4 - add r5, r5, #1 -_023401E4: - ldrsh r0, [r7, #4] - cmp r5, r0 - blt _0234019C - b _02340210 -_023401F4: - add r7, r7, #1 -_023401F8: - add r5, r5, #1 -_023401FC: - cmp r5, r8 - blt _02340118 - add r4, r4, #1 -_02340208: - cmp r4, sb - blt _02340100 -_02340210: - add sp, sp, #0x100 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02340218: .word DUNGEON_PTR -_0234021C: .word FLOOR_GENERATION_STATUS -_02340220: .word 0x000001C2 - arm_func_end GenerateMonsterHouse - - arm_func_start GenerateMazeRoom -GenerateMazeRoom: ; 0x02340224 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #0x100 - ldr r7, _02340450 ; =DUNGEON_PTR - movs r8, r3 - mov r6, r0 - mov r5, r1 - mov r4, r2 - ldr r7, [r7] - beq _02340448 - mov r0, #0x64 - bl DungeonRandInt - cmp r8, r0 - ble _02340448 - add r0, r7, #0x4000 -#ifdef JAPAN - ldrsh r0, [r0, #0x3a] -#else - ldrsh r0, [r0, #0xde] -#endif - cmp r0, #0 - bge _02340448 - mov sb, #0 - mov r1, sb - b _02340310 -_02340274: - ldr r0, _02340454 ; =0x000001C2 - mov r2, #0 - mla r3, r1, r0, r6 - mov r7, #0x1e - b _02340304 -_02340288: - mla r0, r2, r7, r3 - ldrb r8, [r0, #8] - cmp r8, #0 - ldreqb r8, [r0, #0x11] - cmpeq r8, #0 - bne _02340300 - ldrb r8, [r0, #0xb] - cmp r8, #0 - ldrneb r8, [r0, #0xa] - cmpne r8, #0 - beq _02340300 - ldrb r8, [r0, #0xc] - cmp r8, #0 - ldreqb r8, [r0, #0xf] - cmpeq r8, #0 - ldreqb r8, [r0, #0xe] - cmpeq r8, #0 - ldreqb r8, [r0, #9] - cmpeq r8, #0 - bne _02340300 - ldrsh sl, [r0, #4] - ldrsh r8, [r0] - sub r8, sl, r8 - tst r8, #1 - beq _02340300 - ldrsh r8, [r0, #6] - ldrsh r0, [r0, #2] - sub r0, r8, r0 - tst r0, #1 - addne sb, sb, #1 -_02340300: - add r2, r2, #1 -_02340304: - cmp r2, r4 - blt _02340288 - add r1, r1, #1 -_02340310: - cmp r1, r5 - blt _02340274 - cmp sb, #0 - beq _02340448 - mov r1, #0 - mov sl, r1 - add r0, sp, #0 -_0234032C: - strb sl, [r0, r1] - add r1, r1, #1 - cmp r1, #0x100 - blt _0234032C - mov r0, #1 - strb r0, [sp] - add r7, sp, #0 -_02340348: - mov r0, sb - bl DungeonRandInt - mov r8, r0 - mov r0, sb - bl DungeonRandInt - add sl, sl, #1 - ldrb r2, [r7, r8] - ldrb r1, [r7, r0] - cmp sl, #0x40 - strb r1, [r7, r8] - strb r2, [r7, r0] - blt _02340348 - mov r7, #0 - mov r2, r7 - b _02340440 -_02340384: - ldr r0, _02340454 ; =0x000001C2 - mov r3, #0 - mla r1, r2, r0, r6 - add sl, sp, #0 - mov r8, #0x1e - b _02340434 -_0234039C: - mla r0, r3, r8, r1 - ldrb sb, [r0, #8] - cmp sb, #0 - ldreqb sb, [r0, #0x11] - cmpeq sb, #0 - bne _02340430 - ldrb sb, [r0, #0xb] - cmp sb, #0 - ldrneb sb, [r0, #0xa] - cmpne sb, #0 - beq _02340430 - ldrb sb, [r0, #0xc] - cmp sb, #0 - ldreqb sb, [r0, #0xf] - cmpeq sb, #0 - ldreqb sb, [r0, #0xe] - cmpeq sb, #0 - ldreqb sb, [r0, #9] - cmpeq sb, #0 - bne _02340430 - ldrsh ip, [r0, #4] - ldrsh sb, [r0] - sub sb, ip, sb - tst sb, #1 - beq _02340430 - ldrsh ip, [r0, #6] - ldrsh sb, [r0, #2] - sub sb, ip, sb - tst sb, #1 - beq _02340430 - ldrb sb, [sl, r7] - cmp sb, #0 - beq _0234042C - mov r1, #0 - bl GenerateMaze - b _02340448 -_0234042C: - add r7, r7, #1 -_02340430: - add r3, r3, #1 -_02340434: - cmp r3, r4 - blt _0234039C - add r2, r2, #1 -_02340440: - cmp r2, r5 - blt _02340384 -_02340448: - add sp, sp, #0x100 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_02340450: .word DUNGEON_PTR -_02340454: .word 0x000001C2 - arm_func_end GenerateMazeRoom - - arm_func_start GenerateMaze -GenerateMaze: ; 0x02340458 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - sub sp, sp, #0x10 - ldr r2, _023406D0 ; =FLOOR_GENERATION_STATUS - mov r3, #1 - mov r5, r0 - strb r3, [r2, #7] - strb r3, [r5, #0x10] - mov r4, r1 - ldrsh r0, [r5] - ldrsh r1, [r5, #2] - bl GetTile - ldrsh r1, [r5] - ldrb r7, [r0, #7] - add r6, r1, #1 - b _023404DC -_02340494: - ldrsh r1, [r5, #2] - mov r0, r6 - sub r1, r1, #1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _023404D8 - ldrsh r3, [r5, #2] - ldrsh r2, [r5, #4] - mov r0, r6 - sub r1, r3, #1 - str r2, [sp] - ldrsh r2, [r5, #6] - stmib sp, {r2, r4, r7} - ldrsh r2, [r5] - bl GenerateMazeLine -_023404D8: - add r6, r6, #2 -_023404DC: - ldrsh r0, [r5, #4] - sub r0, r0, #1 - cmp r6, r0 - blt _02340494 - ldrsh r0, [r5, #2] - add r6, r0, #1 - b _02340538 -_023404F8: - ldrsh r0, [r5, #4] - mov r1, r6 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _02340534 - ldrsh r0, [r5, #4] - mov r1, r6 - str r0, [sp] - ldrsh r2, [r5, #6] - stmib sp, {r2, r4, r7} - ldrsh r2, [r5] - ldrsh r3, [r5, #2] - bl GenerateMazeLine -_02340534: - add r6, r6, #2 -_02340538: - ldrsh r0, [r5, #6] - sub r0, r0, #1 - cmp r6, r0 - blt _023404F8 - ldrsh r0, [r5] - add r6, r0, #1 - b _02340594 -_02340554: - ldrsh r1, [r5, #6] - mov r0, r6 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _02340590 - ldrsh r1, [r5, #6] - ldrsh r2, [r5, #4] - mov r0, r6 - str r2, [sp] - stmib sp, {r1, r4, r7} - ldrsh r2, [r5] - ldrsh r3, [r5, #2] - bl GenerateMazeLine -_02340590: - add r6, r6, #2 -_02340594: - ldrsh r0, [r5, #4] - sub r0, r0, #1 - cmp r6, r0 - blt _02340554 - ldrsh r0, [r5, #2] - add r6, r0, #1 - b _023405F8 -_023405B0: - ldrsh r0, [r5] - mov r1, r6 - sub r0, r0, #1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _023405F4 - ldrsh r2, [r5] - ldrsh r3, [r5, #4] - mov r1, r6 - sub r0, r2, #1 - str r3, [sp] - ldrsh r3, [r5, #6] - stmib sp, {r3, r4, r7} - ldrsh r3, [r5, #2] - bl GenerateMazeLine -_023405F4: - add r6, r6, #2 -_023405F8: - ldrsh r0, [r5, #6] - sub r0, r0, #1 - cmp r6, r0 - blt _023405B0 - ldrsh r0, [r5] - add r8, r0, #3 - b _023406B8 -_02340614: - ldrsh r0, [r5, #2] - sub r6, r8, #1 - add sb, r0, #3 - b _023406A4 -_02340624: - mov r0, r8 - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _023406A0 - cmp r4, #0 - mov r0, r6 - mov r1, sb - beq _0234066C - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #2 - b _02340678 -_0234066C: - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 -_02340678: - strh r1, [r0] - ldrsh r2, [r5, #4] - mov r0, r8 - mov r1, sb - str r2, [sp] - ldrsh r2, [r5, #6] - stmib sp, {r2, r4, r7} - ldrsh r2, [r5] - ldrsh r3, [r5, #2] - bl GenerateMazeLine -_023406A0: - add sb, sb, #2 -_023406A4: - ldrsh r0, [r5, #6] - sub r0, r0, #3 - cmp sb, r0 - blt _02340624 - add r8, r8, #2 -_023406B8: - ldrsh r0, [r5, #4] - sub r0, r0, #3 - cmp r8, r0 - blt _02340614 - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_023406D0: .word FLOOR_GENERATION_STATUS - arm_func_end GenerateMaze - - arm_func_start GenerateMazeLine -GenerateMazeLine: ; 0x023406D4 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0xc - ldr r4, [sp, #0x34] - ldr fp, [sp, #0x30] - ldr r7, [sp, #0x38] - ldr r6, [sp, #0x3c] - str r4, [sp, #0x34] - mov sb, r0 - mov r8, r1 - str r2, [sp] - str r3, [sp, #4] -_02340700: - mov r0, #4 - bl DungeonRandInt - mov r4, r0 - mov r0, sb - mov r1, r8 - mov sl, #0 - bl GetTileSafe - mov r1, r7 - and r2, r6, #0xff - bl SetTerrainObstacleChecked - mvn r0, #1 - str r0, [sp, #8] -_02340730: - and r5, r4, #3 - cmp r5, #3 - addls pc, pc, r5, lsl #2 - b _02340774 -_02340740: ; jump table - b _02340750 ; case 0 - b _0234075C ; case 1 - b _02340768 ; case 2 - b _02340774 ; case 3 -_02340750: - mov r0, #2 - mov r2, #0 - b _0234077C -_0234075C: - mov r0, #0 - ldr r2, [sp, #8] - b _0234077C -_02340768: - ldr r0, [sp, #8] - mov r2, #0 - b _0234077C -_02340774: - mov r0, #0 - mov r2, #2 -_0234077C: - ldr r1, [sp] - add r0, sb, r0 - cmp r1, r0 - bgt _023407C4 - cmp fp, r0 - ble _023407C4 - add r1, r8, r2 - ldr r2, [sp, #4] - cmp r2, r1 - bgt _023407C4 - ldr r2, [sp, #0x34] - cmp r2, r1 - ble _023407C4 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _023407D8 -_023407C4: - add r4, r4, #1 - add sl, sl, #1 - cmp sl, #4 - blt _02340730 - b _02340874 -_023407D8: - cmp r5, #3 - addls pc, pc, r5, lsl #2 - b _02340700 -_023407E4: ; jump table - b _023407F4 ; case 0 - b _02340814 ; case 1 - b _02340834 ; case 2 - b _02340854 ; case 3 -_023407F4: - mov r1, r8 - add r0, sb, #1 - bl GetTileSafe - mov r1, r7 - and r2, r6, #0xff - bl SetTerrainObstacleChecked - add sb, sb, #2 - b _02340700 -_02340814: - mov r0, sb - sub r1, r8, #1 - bl GetTileSafe - mov r1, r7 - and r2, r6, #0xff - bl SetTerrainObstacleChecked - sub r8, r8, #2 - b _02340700 -_02340834: - mov r1, r8 - sub r0, sb, #1 - bl GetTileSafe - mov r1, r7 - and r2, r6, #0xff - bl SetTerrainObstacleChecked - sub sb, sb, #2 - b _02340700 -_02340854: - mov r0, sb - add r1, r8, #1 - bl GetTileSafe - mov r1, r7 - and r2, r6, #0xff - bl SetTerrainObstacleChecked - add r8, r8, #2 - b _02340700 -_02340874: - add sp, sp, #0xc - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - arm_func_end GenerateMazeLine - - arm_func_start SetSpawnFlag5 -SetSpawnFlag5: ; 0x0234087C - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - ldrsh r5, [r6] - b _023408C0 -_0234088C: - ldrsh r4, [r6, #2] - b _023408B0 -_02340894: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0, #2] - add r4, r4, #1 - orr r1, r1, #0x20 - strh r1, [r0, #2] -_023408B0: - ldrsh r0, [r6, #6] - cmp r4, r0 - blt _02340894 - add r5, r5, #1 -_023408C0: - ldrsh r0, [r6, #4] - cmp r5, r0 - blt _0234088C - ldmia sp!, {r4, r5, r6, pc} - arm_func_end SetSpawnFlag5 - - arm_func_start IsNextToHallway -IsNextToHallway: ; 0x023408D0 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mvn r5, #0 - mov sl, r0 - mov sb, r1 - mov r4, r5 - b _02340964 -_023408E8: - adds r8, sl, r5 - bmi _02340960 - cmp r8, #0x38 - bge _0234096C - mov r6, r4 - b _02340958 -_02340900: - adds r7, sb, r6 - bmi _02340954 - cmp r7, #0x20 - bge _02340960 - cmp r5, #0 - cmpne r6, #0 - bne _02340954 - mov r0, r8 - mov r1, r7 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _02340954 - mov r0, r8 - mov r1, r7 - bl GetTile - ldrb r0, [r0, #7] - cmp r0, #0xff - moveq r0, #1 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} -_02340954: - add r6, r6, #1 -_02340958: - cmp r6, #1 - ble _02340900 -_02340960: - add r5, r5, #1 -_02340964: - cmp r5, #1 - ble _023408E8 -_0234096C: - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end IsNextToHallway - - arm_func_start ResolveInvalidSpawns -ResolveInvalidSpawns: ; 0x02340974 - stmdb sp!, {r3, r4, r5, lr} - mov r5, #0 -_0234097C: - mov r4, #0 -_02340980: - mov r0, r5 - mov r1, r4 - bl GetTileSafe - ldrh r1, [r0] - and r1, r1, #3 - cmp r1, #1 - beq _023409BC - ldrh r1, [r0] - tst r1, #0x110 - ldrneh r1, [r0, #2] - bicne r1, r1, #2 - strneh r1, [r0, #2] - ldrh r1, [r0, #2] - bic r1, r1, #4 - strh r1, [r0, #2] -_023409BC: - ldrh r1, [r0, #2] - tst r1, #1 - beq _023409E0 - ldrh r1, [r0] - orr r1, r1, #0x200 - strh r1, [r0] - ldrh r1, [r0, #2] - bic r1, r1, #4 - strh r1, [r0, #2] -_023409E0: - ldrh r1, [r0, #2] - add r4, r4, #1 - tst r1, #2 - bicne r1, r1, #4 - strneh r1, [r0, #2] - cmp r4, #0x20 - blt _02340980 - add r5, r5, #1 - cmp r5, #0x38 - blt _0234097C - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ResolveInvalidSpawns - - arm_func_start ConvertSecondaryTerrainToChasms -ConvertSecondaryTerrainToChasms: ; 0x02340A0C - stmdb sp!, {r4, r5, r6, lr} - mov r6, #0 - mov r4, r6 -_02340A18: - mov r5, r4 -_02340A1C: - mov r0, r6 - mov r1, r5 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #2 - bne _02340A5C - mov r0, r6 - mov r1, r5 - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #3 - strh r1, [r0] -_02340A5C: - add r5, r5, #1 - cmp r5, #0x20 - blt _02340A1C - add r6, r6, #1 - cmp r6, #0x38 - blt _02340A18 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end ConvertSecondaryTerrainToChasms - - arm_func_start EnsureImpassableTilesAreWalls -EnsureImpassableTilesAreWalls: ; 0x02340A78 - stmdb sp!, {r4, r5, r6, lr} - mov r6, #0 - mov r4, r6 -_02340A84: - mov r5, r4 -_02340A88: - mov r0, r6 - mov r1, r5 - bl GetTile - ldrh r0, [r0] - tst r0, #0x10 - beq _02340AB8 - mov r0, r6 - mov r1, r5 - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] -_02340AB8: - add r5, r5, #1 - cmp r5, #0x20 - blt _02340A88 - add r6, r6, #1 - cmp r6, #0x38 - blt _02340A84 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end EnsureImpassableTilesAreWalls - - arm_func_start InitializeTile -InitializeTile: ; 0x02340AD4 - mov r2, #0 - strh r2, [r0] - strh r2, [r0, #2] - mov r1, #0xff - strb r1, [r0, #7] - strh r2, [r0, #4] - strb r2, [r0, #8] - strb r2, [r0, #9] - strb r2, [r0, #0xa] - strb r2, [r0, #0xb] - strb r2, [r0, #6] - str r2, [r0, #0xc] - str r2, [r0, #0x10] - bx lr - arm_func_end InitializeTile - - arm_func_start ResetFloor -ResetFloor: ; 0x02340B0C -#ifdef JAPAN -#define RESET_FLOOR_OFFSET -0xA4 -#else -#define RESET_FLOOR_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov r6, #0 - mov r4, r6 -_02340B18: - mov r5, r4 - sub r7, r6, #1 -_02340B20: - mov r0, r6 - mov r1, r5 - bl GetTileSafe - bl InitializeTile - sub r8, r5, #1 - mov r0, r6 - mov r1, r8 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - mov r1, r8 - add r0, r6, #1 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - mov r1, r8 - add r0, r6, #1 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - add r0, r6, #1 - add r1, r5, #1 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - mov r0, r6 - add r1, r5, #1 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - mov r0, r7 - add r1, r5, #1 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - mov r0, r7 - mov r1, r5 - bl PosIsOutOfBounds - cmp r0, #0 - bne _02340BD4 - mov r0, r7 - mov r1, r8 - bl PosIsOutOfBounds - cmp r0, #0 - beq _02340BEC -_02340BD4: - mov r0, r6 - mov r1, r5 - bl GetTileSafe - ldrh r1, [r0] - orr r1, r1, #0x10 - strh r1, [r0] -_02340BEC: - add r5, r5, #1 - cmp r5, #0x20 - blt _02340B20 - add r6, r6, #1 - cmp r6, #0x38 - blt _02340B18 - ldr r6, _02340CA8 ; =DUNGEON_PTR - mov sb, #0 - ldr r0, [r6] - mvn r1, #0 - add r0, r0, #0xcc00 - strh r1, [r0, #0xe4 + RESET_FLOOR_OFFSET] - ldr r0, [r6] - mov r7, sb - add r0, r0, #0xcc00 - strh r1, [r0, #0xe6 + RESET_FLOOR_OFFSET] - mov r4, #0x14 - mov r5, #0xa0 -_02340C34: - mul r8, sb, r5 - mov sl, r7 -_02340C3C: - ldr r0, [r6] -#ifdef JAPAN - add r0, r0, #0xbc - add r0, r0, #0xcc00 -#else - add r0, r0, #0xd60 - add r0, r0, #0xc000 -#endif - add r0, r0, r8 - mla r0, sl, r4, r0 - bl InitializeTile - add sl, sl, #1 - cmp sl, #8 - blt _02340C3C - add sb, sb, #1 - cmp sb, #8 - blt _02340C34 - ldr r1, _02340CA8 ; =DUNGEON_PTR - mov r3, #0 - ldr r0, [r1] - mov r2, r3 - add r0, r0, #0x3f00 - strh r3, [r0, #0xc0 + RESET_FLOOR_OFFSET] -_02340C84: - ldr r0, [r1] - add r0, r0, r3, lsl #2 - add r0, r0, #0x12000 - ldr r0, [r0, #0xcc8 + RESET_FLOOR_OFFSET] - add r3, r3, #1 - str r2, [r0] - cmp r3, #0x40 - blt _02340C84 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_02340CA8: .word DUNGEON_PTR - arm_func_end ResetFloor diff --git a/asm/overlay_29_0233ED34.s b/asm/overlay_29_0233ED34.s new file mode 100644 index 00000000..0ff8745b --- /dev/null +++ b/asm/overlay_29_0233ED34.s @@ -0,0 +1,2344 @@ + .include "asm/macros.inc" + .include "overlay_29_0233ED34.inc" + + .text + + arm_func_start GenerateRoomImperfections +GenerateRoomImperfections: ; 0x0233ED34 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x34 + str r0, [sp] + str r1, [sp, #4] + str r2, [sp, #8] + mov fp, #0 + b _0233F100 +_0233ED50: + ldr r1, _0233F114 ; =0x000001C2 + ldr r0, [sp] + mov sl, #0 + mla r0, fp, r1, r0 + str r0, [sp, #0xc] + mvn r0, #0 + str r0, [sp, #0x30] + b _0233F0F0 +_0233ED70: + ldr r0, [sp, #0xc] + mov r1, #0x1e + mla sb, sl, r1, r0 + ldrb r0, [sb, #8] + cmp r0, #0 + ldreqb r0, [sb, #0x11] + cmpeq r0, #0 + ldreqb r0, [sb, #0x12] + cmpeq r0, #0 + bne _0233F0EC + ldrb r0, [sb, #0xb] + cmp r0, #0 + ldrneb r0, [sb, #0xa] + cmpne r0, #0 + beq _0233F0EC + ldrb r0, [sb, #9] + cmp r0, #0 + ldreqb r0, [sb, #0x10] + cmpeq r0, #0 + bne _0233F0EC + ldrb r0, [sb, #0x1c] + cmp r0, #0 + beq _0233F0EC + mov r0, #0x64 + bl DungeonRandInt + cmp r0, #0x3c + blt _0233F0EC + ldrsh r3, [sb, #4] + ldrsh r2, [sb] + ldrsh r1, [sb, #6] + ldrsh r0, [sb, #2] + sub r2, r3, r2 + sub r0, r1, r0 + add r1, r2, r0 + mov r0, r1, asr #1 + add r0, r1, r0, lsr #30 + movs r0, r0, asr #2 + str r0, [sp, #0x24] + moveq r0, #1 + streq r0, [sp, #0x24] + mov r0, #0 + str r0, [sp, #0x2c] + b _0233F0DC +_0233EE1C: + mov r4, #0 +_0233EE20: + mov r0, #4 + bl DungeonRandInt + str r0, [sp, #0x20] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0233EE48 +_0233EE38: ; jump table + b _0233EE48 ; case 0 + b _0233EE70 ; case 1 + b _0233EE9C ; case 2 + b _0233EECC ; case 3 +_0233EE48: + cmp r4, #0 + movne r0, #1 + strne r0, [sp, #0x28] + movne r5, #0 + moveq r0, #0 + ldrsh r8, [sb] + ldrsh r7, [sb, #2] + streq r0, [sp, #0x28] + moveq r5, #1 + b _0233EEF4 +_0233EE70: + ldrsh r0, [sb, #4] + cmp r4, #0 + movne r5, #1 + sub r8, r0, #1 + movne r0, #0 + strne r0, [sp, #0x28] + ldreq r0, [sp, #0x30] + ldrsh r7, [sb, #2] + streq r0, [sp, #0x28] + moveq r5, #0 + b _0233EEF4 +_0233EE9C: + ldrsh r0, [sb, #6] + cmp r4, #0 + ldrsh r1, [sb, #4] + sub r7, r0, #1 + ldrne r0, [sp, #0x30] + movne r5, #0 + strne r0, [sp, #0x28] + moveq r0, #0 + sub r8, r1, #1 + streq r0, [sp, #0x28] + ldreq r5, [sp, #0x30] + b _0233EEF4 +_0233EECC: + ldrsh r0, [sb, #6] + cmp r4, #0 + ldrne r5, [sp, #0x30] + sub r7, r0, #1 + movne r0, #0 + strne r0, [sp, #0x28] + moveq r0, #1 + ldrsh r8, [sb] + streq r0, [sp, #0x28] + moveq r5, #0 +_0233EEF4: + mov r6, #0 + b _0233F0BC +_0233EEFC: + ldrsh r0, [sb] + cmp r8, r0 + blt _0233F0C4 + ldrsh r0, [sb, #4] + cmp r8, r0 + bge _0233F0C4 + ldrsh r0, [sb, #2] + cmp r7, r0 + blt _0233F0C4 + ldrsh r0, [sb, #6] + cmp r7, r0 + bge _0233F0C4 + mov r0, r8 + mov r1, r7 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + bne _0233F0AC + mov r5, #0 + b _0233F014 +_0233EF50: + ldr r0, _0233F118 ; =DIRECTIONS_XY + mov r1, r5, lsl #2 + ldrsh r2, [r0, r1] + add r0, r0, r5, lsl #2 + ldrsh r1, [r0, #2] + add r0, r8, r2 + str r0, [sp, #0x1c] + mov r0, #0 + str r0, [sp, #0x10] + add r0, r7, r1 + str r0, [sp, #0x18] + ldr r6, [sp, #0x30] + b _0233EFFC +_0233EF84: + ldr r0, [sp, #0x30] + str r0, [sp, #0x14] + b _0233EFE0 +_0233EF90: + ldr r1, [sp, #0x1c] + ldr r0, [sp, #0x14] + add r0, r1, r0 + ldr r1, [sp, #0x18] + add r1, r1, r6 + bl GetTile + ldrh r1, [r0] + and r1, r1, #3 + cmp r1, #1 + bne _0233EFD4 + ldrb r0, [r0, #7] + cmp r0, #0xff + moveq r0, #1 + streq r0, [sp, #0x10] + ldr r0, [sp, #0x10] + cmp r0, #0 + bne _0233EFEC +_0233EFD4: + ldr r0, [sp, #0x14] + add r0, r0, #1 + str r0, [sp, #0x14] +_0233EFE0: + ldr r0, [sp, #0x14] + cmp r0, #1 + ble _0233EF90 +_0233EFEC: + ldr r0, [sp, #0x10] + cmp r0, #0 + bne _0233F004 + add r6, r6, #1 +_0233EFFC: + cmp r6, #1 + ble _0233EF84 +_0233F004: + ldr r0, [sp, #0x10] + cmp r0, #0 + bne _0233F01C + add r5, r5, #1 +_0233F014: + cmp r5, #8 + blt _0233EF50 +_0233F01C: + cmp r5, #8 + bne _0233F0C4 + ldr r1, _0233F11C ; =CORNER_CARDINAL_NEIGHBOR_IS_OPEN + ldr r0, [sp, #0x20] + mov r5, #0 + add r6, r1, r0, lsl #3 + b _0233F080 +_0233F038: + ldr r0, _0233F118 ; =DIRECTIONS_XY + mov r1, r5, lsl #2 + ldrsh r2, [r0, r1] + add r0, r0, r5, lsl #2 + ldrsh r1, [r0, #2] + add r0, r8, r2 + add r1, r7, r1 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + moveq r0, #1 + movne r0, #0 + and r1, r0, #0xff + ldrb r0, [r5, r6] + cmp r1, r0 + bne _0233F088 + add r5, r5, #2 +_0233F080: + cmp r5, #8 + blt _0233F038 +_0233F088: + cmp r5, #8 + bne _0233F0C4 + mov r0, r8 + mov r1, r7 + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + b _0233F0C4 +_0233F0AC: + ldr r0, [sp, #0x28] + add r7, r7, r5 + add r8, r8, r0 + add r6, r6, #1 +_0233F0BC: + cmp r6, #0xa + blt _0233EEFC +_0233F0C4: + add r4, r4, #1 + cmp r4, #2 + blt _0233EE20 + ldr r0, [sp, #0x2c] + add r0, r0, #1 + str r0, [sp, #0x2c] +_0233F0DC: + ldr r1, [sp, #0x2c] + ldr r0, [sp, #0x24] + cmp r1, r0 + blt _0233EE1C +_0233F0EC: + add sl, sl, #1 +_0233F0F0: + ldr r0, [sp, #8] + cmp sl, r0 + blt _0233ED70 + add fp, fp, #1 +_0233F100: + ldr r0, [sp, #4] + cmp fp, r0 + blt _0233ED50 + add sp, sp, #0x34 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0233F114: .word 0x000001C2 +_0233F118: .word DIRECTIONS_XY +_0233F11C: .word CORNER_CARDINAL_NEIGHBOR_IS_OPEN + arm_func_end GenerateRoomImperfections + + arm_func_start CreateHallway +CreateHallway: ; 0x0233F120 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldrb r6, [sp, #0x28] + mov sl, r0 + ldr r0, [sp, #0x30] + mov sb, r1 + cmp r6, #0 + mov r8, r2 + mov r7, r3 + mov r4, sl + mov r5, sb + ldr fp, [sp, #0x2c] + str r0, [sp, #0x30] + mov r6, #0 + beq _0233F328 + b _0233F1C4 +_0233F15C: + cmp r6, #0x38 + add r6, r6, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _0233F1AC + mov r0, sl + mov r1, sb + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233F1B4 +_0233F1AC: + cmp sb, r5 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F1B4: + ldr r0, [sp, #0x30] + cmp sb, r0 + addlt sb, sb, #1 + subge sb, sb, #1 +_0233F1C4: + ldr r0, [sp, #0x30] + cmp sb, r0 + bne _0233F15C + mov r6, #0 + b _0233F240 +_0233F1D8: + cmp r6, #0x38 + add r6, r6, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _0233F228 + mov r0, sl + mov r1, sb + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233F234 +_0233F228: + cmp sl, r4 + cmpeq sb, r5 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F234: + cmp sl, r8 + addlt sl, sl, #1 + subge sl, sl, #1 +_0233F240: + cmp sl, r8 + bne _0233F1D8 + mov r6, #0 + b _0233F2B8 +_0233F250: + cmp r6, #0x38 + add r6, r6, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _0233F2A0 + mov r0, sl + mov r1, sb + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233F2AC +_0233F2A0: + cmp sl, r4 + cmpeq sb, r5 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F2AC: + cmp sb, r7 + addlt sb, sb, #1 + subge sb, sb, #1 +_0233F2B8: + cmp sb, r7 + bne _0233F250 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F2C4: + cmp r6, #0x38 + add r6, r6, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _0233F314 + mov r0, sl + mov r1, sb + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233F31C +_0233F314: + cmp sl, r4 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F31C: + cmp sl, fp + addlt sl, sl, #1 + subge sl, sl, #1 +_0233F328: + cmp sl, fp + bne _0233F2C4 + mov r6, #0 + b _0233F3A0 +_0233F338: + cmp r6, #0x38 + add r6, r6, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _0233F388 + mov r0, sl + mov r1, sb + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233F394 +_0233F388: + cmp sl, r4 + cmpeq sb, r5 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F394: + cmp sb, r7 + addlt sb, sb, #1 + subge sb, sb, #1 +_0233F3A0: + cmp sb, r7 + bne _0233F338 + mov r6, #0 + b _0233F418 +_0233F3B0: + cmp r6, #0x38 + add r6, r6, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sl + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _0233F400 + mov r0, sl + mov r1, sb + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233F40C +_0233F400: + cmp sl, r4 + cmpeq sb, r5 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_0233F40C: + cmp sl, r8 + addlt sl, sl, #1 + subge sl, sl, #1 +_0233F418: + cmp sl, r8 + bne _0233F3B0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end CreateHallway + + arm_func_start EnsureConnectedGrid +EnsureConnectedGrid: ; 0x0233F424 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x2c + str r0, [sp, #0xc] + mov r7, r1 + mov fp, r2 + mov r6, r3 + ldr r5, [sp, #0x50] + mov r8, #0 + b _0233F818 +_0233F448: + ldr r1, _0233F8FC ; =0x000001C2 + ldr r0, [sp, #0xc] + mov r4, #0 + mla sb, r8, r1, r0 + sub r0, fp, #1 + str r0, [sp, #0x20] + add r0, r6, r8, lsl #2 + str r0, [sp, #0x28] + sub r0, r7, #1 + str r0, [sp, #0x24] + b _0233F80C +_0233F474: + mov r0, #0x1e + mla sl, r4, r0, sb + ldrb r0, [sl, #8] + cmp r0, #0 + ldreqb r0, [sl, #0x11] + cmpeq r0, #0 + ldreqb r0, [sl, #0xb] + cmpeq r0, #0 + bne _0233F808 + ldrb r0, [sl, #0xa] + cmp r0, #0 + beq _0233F7CC + ldrb r0, [sl, #9] + cmp r0, #0 + bne _0233F7CC + ldrsh r0, [sl] + ldrsh r1, [sl, #4] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange + str r0, [sp, #0x1c] + ldrsh r0, [sl, #2] + ldrsh r1, [sl, #6] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange + str r0, [sp, #0x18] + cmp r4, #0 + ble _0233F590 + ldrb r0, [sl, #-0x16] + cmp r0, #0 + ldreqb r0, [sl, #-0xc] + cmpeq r0, #0 + bne _0233F590 + ldrb r0, [sl, #-0x13] + cmp r0, #0 + beq _0233F590 + ldrb r0, [sl, #-0x14] + cmp r0, #0 + ldrsh r0, [sl, #-0x1e] + streq r0, [sp, #0x14] + beq _0233F544 + ldrsh r1, [sl, #-0x1a] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange + str r0, [sp, #0x14] + ldrsh r0, [sl, #-0x1c] + ldrsh r1, [sl, #-0x18] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange +_0233F544: + mov r1, #1 + str r1, [sp] + mov r1, #0x1e + mla sl, r4, r1, sb + ldr r1, [r6, r8, lsl #2] + ldr r0, [sp, #0x1c] + str r1, [sp, #4] + ldr r1, [r5, r4, lsl #2] + ldr r2, [sp, #0x14] + str r1, [sp, #8] + ldrsh r3, [sl, #-0x18] + ldrsh r1, [sl, #2] + sub r3, r3, #1 + bl CreateHallway + mov r0, #1 + strb r0, [sl, #0xb] + strb r0, [sl, #0x13] + strb r0, [sl, #-0xa] + b _0233F808 +_0233F590: + ldr r0, [sp, #0x20] + cmp r4, r0 + bge _0233F64C + ldrb r0, [sl, #0x26] + cmp r0, #0 + ldreqb r0, [sl, #0x30] + cmpeq r0, #0 + bne _0233F64C + ldrb r0, [sl, #0x29] + cmp r0, #0 + beq _0233F64C + ldrb r0, [sl, #0x28] + cmp r0, #0 + ldrsh r0, [sl, #0x1e] + streq r0, [sp, #0x10] + beq _0233F5F8 + ldrsh r1, [sl, #0x22] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange + str r0, [sp, #0x10] + ldrsh r0, [sl, #0x20] + ldrsh r1, [sl, #0x24] + add r0, r0, #1 + sub r1, r1, #1 + bl DungeonRandRange +_0233F5F8: + mov r1, #1 + str r1, [sp] + mov r1, #0x1e + mla sl, r4, r1, sb + ldr r3, [r6, r8, lsl #2] + add r1, r5, r4, lsl #2 + str r3, [sp, #4] + ldr r1, [r1, #4] + ldr r0, [sp, #0x1c] + sub r1, r1, #1 + str r1, [sp, #8] + ldrsh r1, [sl, #6] + ldrsh r3, [sl, #0x20] + ldr r2, [sp, #0x10] + sub r1, r1, #1 + bl CreateHallway + mov r0, #1 + strb r0, [sl, #0xb] + strb r0, [sl, #0x14] + strb r0, [sl, #0x31] + b _0233F808 +_0233F64C: + cmp r8, #0 + ble _0233F708 + ldrb r0, [sl, #-0x1ba] + cmp r0, #0 + ldreqb r0, [sl, #-0x1b0] + cmpeq r0, #0 + bne _0233F708 + ldrb r0, [sl, #-0x1b7] + cmp r0, #0 + beq _0233F708 + ldrb r0, [sl, #-0x1b8] + cmp r0, #0 + sub r0, sl, #0x100 + ldreqsh r3, [r0, #-0xc0] + beq _0233F6B8 + ldrsh r1, [r0, #-0xbe] + ldrsh r2, [r0, #-0xc2] + sub r1, r1, #1 + add r0, r2, #1 + bl DungeonRandRange + sub r0, sl, #0x100 + ldrsh r1, [r0, #-0xbc] + ldrsh r2, [r0, #-0xc0] + sub r1, r1, #1 + add r0, r2, #1 + bl DungeonRandRange + mov r3, r0 +_0233F6B8: + mov r0, #0 + str r0, [sp] + mov r0, #0x1e + mul r0, r4, r0 + ldr ip, [r6, r8, lsl #2] + add sl, sb, r0 + str ip, [sp, #4] + ldr ip, [r5, r4, lsl #2] + sub r2, sl, #0x100 + str ip, [sp, #8] + ldrsh r2, [r2, #-0xc2] + ldrsh r0, [sb, r0] + ldr r1, [sp, #0x18] + sub r2, r2, #1 + bl CreateHallway + mov r0, #1 + strb r0, [sl, #0xb] + strb r0, [sl, #0x15] + strb r0, [sl, #-0x1ac] + b _0233F808 +_0233F708: + ldr r0, [sp, #0x24] + cmp r8, r0 + bge _0233F808 + ldrb r0, [sl, #0x1ca] + cmp r0, #0 + ldreqb r0, [sl, #0x1d4] + cmpeq r0, #0 + bne _0233F808 + ldrb r0, [sl, #0x1cd] + cmp r0, #0 + beq _0233F808 + ldrb r0, [sl, #0x1cc] + cmp r0, #0 + add r0, sl, #0x100 + ldreqsh r3, [r0, #0xc4] + beq _0233F778 + ldrsh r1, [r0, #0xc6] + ldrsh r2, [r0, #0xc2] + sub r1, r1, #1 + add r0, r2, #1 + bl DungeonRandRange + add r0, sl, #0x100 + ldrsh r1, [r0, #0xc8] + ldrsh r2, [r0, #0xc4] + sub r1, r1, #1 + add r0, r2, #1 + bl DungeonRandRange + mov r3, r0 +_0233F778: + mov r0, #0 + str r0, [sp] + mov r0, #0x1e + mla sl, r4, r0, sb + ldr r0, [sp, #0x28] + ldr r1, [sp, #0x18] + ldr r2, [r0, #4] + add r0, sl, #0x100 + sub r2, r2, #1 + str r2, [sp, #4] + ldr r2, [r5, r4, lsl #2] + str r2, [sp, #8] + ldrsh r2, [r0, #0xc2] + ldrsh r0, [sl, #4] + sub r0, r0, #1 + bl CreateHallway + mov r0, #1 + strb r0, [sl, #0xb] + strb r0, [sl, #0x16] + strb r0, [sl, #0x1d7] + b _0233F808 +_0233F7CC: + ldrsh r0, [sl] + ldrsh r1, [sl, #2] + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0, #2] + bic r1, r1, #1 + strh r1, [r0, #2] + ldrh r1, [r0, #2] + bic r1, r1, #2 + strh r1, [r0, #2] + ldrh r1, [r0, #2] + bic r1, r1, #4 + strh r1, [r0, #2] +_0233F808: + add r4, r4, #1 +_0233F80C: + cmp r4, fp + blt _0233F474 + add r8, r8, #1 +_0233F818: + cmp r8, r7 + blt _0233F448 + mov r8, #0 + b _0233F8EC +_0233F828: + ldr r1, _0233F8FC ; =0x000001C2 + ldr r0, [sp, #0xc] + mov sb, #0 + mla sl, r8, r1, r0 + b _0233F8E0 +_0233F83C: + mov r0, #0x1e + mla r5, sb, r0, sl + ldrb r0, [r5, #8] + cmp r0, #0 + ldreqb r0, [r5, #0x11] + cmpeq r0, #0 + ldreqb r0, [r5, #0xb] + cmpeq r0, #0 + ldreqb r0, [r5, #0xf] + cmpeq r0, #0 + bne _0233F8DC + ldrsh r6, [r5] + b _0233F8D0 +_0233F870: + ldrsh r4, [r5, #2] + b _0233F8C0 +_0233F878: + mov r0, r6 + mov r1, r4 + bl GetTileSafe + ldrh r1, [r0] + add r4, r4, #1 + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0, #2] + bic r1, r1, #2 + strh r1, [r0, #2] + ldrh r1, [r0, #2] + bic r1, r1, #1 + strh r1, [r0, #2] + ldrh r1, [r0, #2] + bic r1, r1, #4 + strh r1, [r0, #2] + mov r1, #0xff + strb r1, [r0, #7] +_0233F8C0: + ldrsh r0, [r5, #6] + cmp r4, r0 + blt _0233F878 + add r6, r6, #1 +_0233F8D0: + ldrsh r0, [r5, #4] + cmp r6, r0 + blt _0233F870 +_0233F8DC: + add sb, sb, #1 +_0233F8E0: + cmp sb, fp + blt _0233F83C + add r8, r8, #1 +_0233F8EC: + cmp r8, r7 + blt _0233F828 + add sp, sp, #0x2c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0233F8FC: .word 0x000001C2 + arm_func_end EnsureConnectedGrid + + arm_func_start SetTerrainObstacleChecked +SetTerrainObstacleChecked: ; 0x0233F900 + ldrh r3, [r0] + cmp r1, #0 + bic r1, r3, #3 + strh r1, [r0] + bxeq lr + ldrb r1, [r0, #7] + cmp r1, r2 + bxne lr + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #2 + strh r1, [r0] + bx lr + arm_func_end SetTerrainObstacleChecked + + arm_func_start FinalizeJunctions +FinalizeJunctions: ; 0x0233F93C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r4, #0 +_0233F944: + sub r5, r4, #1 + mov r6, #0 + mov r7, #0xff +_0233F950: + mov r0, r4 + mov r1, r6 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + bne _0233FAFC + mov r0, r4 + mov r1, r6 + bl GetTile + ldrb r0, [r0, #7] + cmp r0, #0xff + bne _0233FAD4 + cmp r4, #0 + ble _0233F9D4 + mov r0, r5 + mov r1, r6 + bl GetTileSafe + ldrb r1, [r0, #7] + cmp r1, #0xff + beq _0233F9D4 + ldrh r1, [r0] + orr r2, r1, #8 + and r1, r2, #3 + strh r2, [r0] + cmp r1, #2 + bne _0233F9D4 + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] +_0233F9D4: + cmp r6, #0 + ble _0233FA28 + mov r0, r4 + sub r1, r6, #1 + bl GetTileSafe + ldrb r1, [r0, #7] + cmp r1, #0xff + beq _0233FA28 + ldrh r1, [r0] + orr r1, r1, #8 + orr r2, r1, #8 + and r1, r2, #3 + strh r2, [r0] + cmp r1, #2 + bne _0233FA28 + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] +_0233FA28: + cmp r6, #0x1f + bge _0233FA7C + mov r0, r4 + add r1, r6, #1 + bl GetTileSafe + ldrb r1, [r0, #7] + cmp r1, #0xff + beq _0233FA7C + ldrh r1, [r0] + orr r1, r1, #8 + orr r2, r1, #8 + and r1, r2, #3 + strh r2, [r0] + cmp r1, #2 + bne _0233FA7C + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] +_0233FA7C: + cmp r4, #0x37 + bge _0233FAFC + mov r1, r6 + add r0, r4, #1 + bl GetTileSafe + ldrb r1, [r0, #7] + cmp r1, #0xff + beq _0233FAFC + ldrh r1, [r0] + orr r1, r1, #8 + orr r2, r1, #8 + and r1, r2, #3 + strh r2, [r0] + cmp r1, #2 + bne _0233FAFC + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #1 + strh r1, [r0] + b _0233FAFC +_0233FAD4: + mov r0, r4 + mov r1, r6 + bl GetTile + ldrb r0, [r0, #7] + cmp r0, #0xfe + bne _0233FAFC + mov r0, r4 + mov r1, r6 + bl GetTileSafe + strb r7, [r0, #7] +_0233FAFC: + add r6, r6, #1 + cmp r6, #0x20 + blt _0233F950 + add r4, r4, #1 + cmp r4, #0x38 + blt _0233F944 + bl ov29_0233FB1C + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end FinalizeJunctions + + arm_func_start ov29_0233FB1C +ov29_0233FB1C: ; 0x0233FB1C +#ifdef JAPAN +#define OV29_0233FB1C_OFFSET 0x5C +#else +#define OV29_0233FB1C_OFFSET 0 +#endif + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r0, _0233FBE4 ; =DUNGEON_PTR + mov r1, #0 + ldr r6, [r0] + mov r7, r1 +_0233FB30: + add r0, r6, r1, lsl #1 +#ifdef JAPAN + add r0, r0, #0xf100 +#else + add r0, r0, #0xf200 +#endif + add r1, r1, #1 + strh r7, [r0, #0x68 + OV29_0233FB1C_OFFSET] + cmp r1, #0x20 + blt _0233FB30 +_0233FB48: + mov r0, r7, lsl #0x10 + mov r5, #0 + mov r4, r0, asr #0x10 +_0233FB54: + mov r0, r7 + mov r1, r5 + bl GetTile + ldrh r0, [r0] + tst r0, #8 + beq _0233FBC8 + mov r0, r7 + mov r1, r5 + bl GetTile + ldrb r2, [r0, #7] + cmp r2, #0 + blt _0233FBC8 + cmp r2, #0x20 + addlt r0, r6, r2, lsl #1 +#ifdef JAPAN + addlt r1, r0, #0xf100 +#else + addlt r1, r0, #0xf200 +#endif + ldrltsh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] + cmplt r0, #0x20 + bge _0233FBC8 + add r2, r6, r2, lsl #7 + add r0, r2, r0, lsl #2 + add r0, r0, #0xf200 +#ifdef JAPAN + strh r4, [r0, #4] +#else + strh r4, [r0, #0xa8] +#endif + ldrsh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] + add r0, r2, r0, lsl #2 + add r0, r0, #0xf200 +#ifdef JAPAN + strh r5, [r0, #6] +#else + strh r5, [r0, #0xaa] +#endif + ldrsh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] + add r0, r0, #1 + strh r0, [r1, #0x68 + OV29_0233FB1C_OFFSET] +_0233FBC8: + add r5, r5, #1 + cmp r5, #0x20 + blt _0233FB54 + add r7, r7, #1 + cmp r7, #0x38 + blt _0233FB48 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_0233FBE4: .word DUNGEON_PTR + arm_func_end ov29_0233FB1C + + arm_func_start GenerateKecleonShop +GenerateKecleonShop: ; 0x0233FBE8 +#ifdef JAPAN +#define GENERATE_KECLEON_SHOP_OFFSET -0xA4 +#else +#define GENERATE_KECLEON_SHOP_OFFSET 0 +#endif + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x44 + ldr r5, _0233FF8C ; =DUNGEON_PTR + ldr r4, _0233FF90 ; =FLOOR_GENERATION_STATUS + mvn r7, #0 + ldr r6, [r5] + strh r7, [r4, #0x20] + strh r7, [r4, #0x22] + ldrb r4, [r4, #1] + mov sl, r0 + str r1, [sp] + str r2, [sp, #4] + mov r5, r3 + cmp r4, #0 + bne _0233FF84 + bl GetFloorType + cmp r0, #2 + cmpne r5, #0 + beq _0233FF84 + mov r0, #0x64 + bl DungeonRandInt + cmp r5, r0 + ble _0233FF84 + mov r4, #0 + add r2, sp, #0x26 + add r1, sp, #8 +_0233FC50: + mov r0, r4, lsl #0x10 + mov r3, r4, lsl #1 + mov r0, r0, asr #0x10 + add r4, r4, #1 + strh r0, [r2, r3] + strh r0, [r1, r3] + cmp r4, #0xf + blt _0233FC50 + mov r7, #0xf + mov r8, #0 + mov r5, r7 + add r4, sp, #0x26 +_0233FC80: + mov r0, r7 + bl DungeonRandInt + mov sb, r0 + mov r0, r5 + bl DungeonRandInt + mov r3, sb, lsl #1 + mov r1, r0, lsl #1 + add r8, r8, #1 + ldrsh r2, [r4, r3] + ldrsh r0, [r4, r1] + cmp r8, #0xc8 + strh r0, [r4, r3] + strh r2, [r4, r1] + blt _0233FC80 + mov r7, #0xf + mov r8, #0 + mov r5, r7 + add r4, sp, #8 +_0233FCC8: + mov r0, r7 + bl DungeonRandInt + mov sb, r0 + mov r0, r5 + bl DungeonRandInt + mov r3, sb, lsl #1 + mov r1, r0, lsl #1 + add r8, r8, #1 + ldrsh r2, [r4, r3] + ldrsh r0, [r4, r1] + cmp r8, #0xc8 + strh r0, [r4, r3] + strh r2, [r4, r1] + blt _0233FCC8 + mov r4, #0 + b _0233FF7C +_0233FD08: + add r0, sp, #0x26 + mov r1, r4, lsl #1 + ldrsh r1, [r0, r1] + ldr r0, [sp] + cmp r1, r0 + bge _0233FF78 + ldr r0, _0233FF94 ; =0x000001C2 + mov r5, #0 + mul fp, r1, r0 + add sb, sl, fp + b _0233FF70 +_0233FD34: + mov r1, r5, lsl #1 + add r0, sp, #8 + ldrsh r1, [r0, r1] + ldr r0, [sp, #4] + cmp r1, r0 + bge _0233FF6C + mov r0, #0x1e + mul r7, r1, r0 + add r8, sb, r7 + ldrb r0, [r8, #8] + cmp r0, #0 + ldreqb r0, [r8, #0x11] + cmpeq r0, #0 + ldreqb r0, [r8, #0x12] + cmpeq r0, #0 + bne _0233FF6C + ldrb r0, [r8, #0xb] + cmp r0, #0 + ldrneb r0, [r8, #0xa] + cmpne r0, #0 + beq _0233FF6C + ldrb r0, [r8, #9] + cmp r0, #0 + ldreqb r0, [r8, #0x10] + cmpeq r0, #0 + ldreqb r0, [r8, #0x1d] + cmpeq r0, #0 + bne _0233FF6C + ldrsh r1, [r8, #4] + ldrsh r0, [r8] + sub r0, r1, r0 + bl abs + cmp r0, #5 + blt _0233FF6C + ldrsh r1, [r8, #6] + ldrsh r0, [r8, #2] + sub r0, r1, r0 + bl abs + cmp r0, #4 + blt _0233FF6C + ldr r0, _0233FF90 ; =FLOOR_GENERATION_STATUS + add r1, sl, fp + mov r3, #1 + strb r3, [r0, #3] + add r2, r1, r7 + strb r3, [r2, #0xc] + ldrsh r1, [sb, r7] + add r1, r1, #1 + str r1, [r0, #0x30] + ldrsh r1, [r2, #4] + sub r1, r1, #1 + str r1, [r0, #0x38] + ldrsh r1, [r2, #2] + add r3, r1, #1 + str r3, [r0, #0x34] + ldrsh r1, [r2, #6] + sub r2, r1, #1 + sub r1, r2, r3 + cmp r1, #3 + str r2, [r0, #0x3c] + addlt r1, r2, #1 + strlt r1, [r0, #0x3c] + ldr r1, _0233FF98 ; =0x0000270F + add r0, r6, #0xc000 + str r1, [r0, #0xd14 + GENERATE_KECLEON_SHOP_OFFSET] + str r1, [r0, #0xd18 + GENERATE_KECLEON_SHOP_OFFSET] + rsb r2, r1, #0 + str r2, [r0, #0xd1c + GENERATE_KECLEON_SHOP_OFFSET] + ldr r1, _0233FF90 ; =FLOOR_GENERATION_STATUS + str r2, [r0, #0xd20 + GENERATE_KECLEON_SHOP_OFFSET] + ldr r4, [r1, #0x30] + b _0233FED8 +_0233FE54: + ldr sl, _0233FF90 ; =FLOOR_GENERATION_STATUS + add r8, r6, #0xc000 + ldr r5, [sl, #0x34] + b _0233FEC8 +_0233FE64: + mov r0, r4 + mov r1, r5 + bl GetTileSafe + ldrh r1, [r0] + orr r1, r1, #0x20 + strh r1, [r0] + ldrh r1, [r0, #2] + bic r1, r1, #8 + strh r1, [r0, #2] + ldrh r1, [r0, #2] + bic r1, r1, #1 + strh r1, [r0, #2] + ldr r0, [r8, #0xd14 + GENERATE_KECLEON_SHOP_OFFSET] + cmp r0, r4 + strgt r4, [r8, #0xd14 + GENERATE_KECLEON_SHOP_OFFSET] + ldr r0, [r8, #0xd18 + GENERATE_KECLEON_SHOP_OFFSET] + cmp r0, r5 + strgt r5, [r8, #0xd18 + GENERATE_KECLEON_SHOP_OFFSET] + ldr r0, [r8, #0xd1c + GENERATE_KECLEON_SHOP_OFFSET] + cmp r0, r4 + strlt r4, [r8, #0xd1c + GENERATE_KECLEON_SHOP_OFFSET] + ldr r0, [r8, #0xd20 + GENERATE_KECLEON_SHOP_OFFSET] + cmp r0, r5 + strlt r5, [r8, #0xd20 + GENERATE_KECLEON_SHOP_OFFSET] + add r5, r5, #1 +_0233FEC8: + ldr r0, [sl, #0x3c] + cmp r5, r0 + blt _0233FE64 + add r4, r4, #1 +_0233FED8: + ldr r0, _0233FF90 ; =FLOOR_GENERATION_STATUS + ldr r0, [r0, #0x38] + cmp r4, r0 + blt _0233FE54 + add r4, sb, r7 + ldrsh r5, [sb, r7] + b _0233FF28 +_0233FEF4: + ldrsh r6, [r4, #2] + b _0233FF18 +_0233FEFC: + mov r0, r5 + mov r1, r6 + bl GetTileSafe + ldrh r1, [r0, #2] + add r6, r6, #1 + orr r1, r1, #0x10 + strh r1, [r0, #2] +_0233FF18: + ldrsh r0, [r4, #6] + cmp r6, r0 + blt _0233FEFC + add r5, r5, #1 +_0233FF28: + ldrsh r0, [r4, #4] + cmp r5, r0 + blt _0233FEF4 + ldr r1, _0233FF90 ; =FLOOR_GENERATION_STATUS + ldr r2, [r1, #0x30] + ldr r0, [r1, #0x38] + add r0, r2, r0 + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 + strh r0, [r1, #0x20] + ldr r2, [r1, #0x34] + ldr r0, [r1, #0x3c] + add r0, r2, r0 + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 + strh r0, [r1, #0x22] + b _0233FF84 +_0233FF6C: + add r5, r5, #1 +_0233FF70: + cmp r5, #0xf + blt _0233FD34 +_0233FF78: + add r4, r4, #1 +_0233FF7C: + cmp r4, #0xf + blt _0233FD08 +_0233FF84: + add sp, sp, #0x44 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0233FF8C: .word DUNGEON_PTR +_0233FF90: .word FLOOR_GENERATION_STATUS +_0233FF94: .word 0x000001C2 +_0233FF98: .word 0x0000270F + arm_func_end GenerateKecleonShop + + arm_func_start GenerateMonsterHouse +GenerateMonsterHouse: ; 0x0233FF9C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x100 + ldr r4, _02340218 ; =DUNGEON_PTR + movs r5, r3 + mov sl, r0 + mov sb, r1 + mov r8, r2 + ldr r6, [r4] + beq _02340210 + mov r0, #0x64 + bl DungeonRandInt + cmp r5, r0 + ble _02340210 + ldr r0, _0234021C ; =FLOOR_GENERATION_STATUS + ldrb r0, [r0, #3] + cmp r0, #0 + bne _02340210 + bl IsOutlawMonsterHouseFloor + cmp r0, #0 + bne _0233FFF8 + bl IsDestinationFloorWithMonster + cmp r0, #0 + bne _02340210 +_0233FFF8: + bl GetFloorType + cmp r0, #0 + bne _02340210 + mov r5, #0 + mov r2, r5 + mov r1, r5 + b _02340088 +_02340014: + ldr r0, _02340220 ; =0x000001C2 + mov r3, r1 + mla r4, r2, r0, sl + mov r7, #0x1e + b _0234007C +_02340028: + mla r0, r3, r7, r4 + ldrb fp, [r0, #8] + cmp fp, #0 + ldreqb fp, [r0, #0x11] + cmpeq fp, #0 + bne _02340078 + ldrb fp, [r0, #0xb] + cmp fp, #0 + ldrneb fp, [r0, #0xa] + cmpne fp, #0 + beq _02340078 + ldrb fp, [r0, #0xc] + cmp fp, #0 + ldreqb fp, [r0, #0xf] + cmpeq fp, #0 + ldreqb fp, [r0, #0x10] + cmpeq fp, #0 + ldreqb r0, [r0, #9] + cmpeq r0, #0 + addeq r5, r5, #1 +_02340078: + add r3, r3, #1 +_0234007C: + cmp r3, r8 + blt _02340028 + add r2, r2, #1 +_02340088: + cmp r2, sb + blt _02340014 + cmp r5, #0 + beq _02340210 + mov r1, #0 + mov r7, r1 + add r0, sp, #0 +_023400A4: + strb r7, [r0, r1] + add r1, r1, #1 + cmp r1, #0x100 + blt _023400A4 + mov r0, #1 + strb r0, [sp] + add fp, sp, #0 +_023400C0: + mov r0, r5 + bl DungeonRandInt + mov r4, r0 + mov r0, r5 + bl DungeonRandInt + add r7, r7, #1 + ldrb r2, [fp, r4] + ldrb r1, [fp, r0] + cmp r7, #0x40 + strb r1, [fp, r4] + strb r2, [fp, r0] + blt _023400C0 + mov r7, #0 + mov r4, r7 + add fp, sp, #0 + b _02340208 +_02340100: + ldr r0, _02340220 ; =0x000001C2 + mov r5, #0 + mul r3, r4, r0 + add r2, sl, r3 + mov lr, #0x1e + b _023401FC +_02340118: + mul r1, r5, lr + add r0, r2, r1 + ldrb ip, [r0, #8] + cmp ip, #0 + ldreqb ip, [r0, #0x11] + cmpeq ip, #0 + bne _023401F8 + ldrb ip, [r0, #0xb] + cmp ip, #0 + ldrneb ip, [r0, #0xa] + cmpne ip, #0 + beq _023401F8 + ldrb ip, [r0, #0xc] + cmp ip, #0 + ldreqb ip, [r0, #0xf] + cmpeq ip, #0 + ldreqb ip, [r0, #0x10] + cmpeq ip, #0 + ldreqb r0, [r0, #9] + cmpeq r0, #0 + bne _023401F8 + ldrb r0, [fp, r7] + cmp r0, #0 + beq _023401F4 + ldr r0, _0234021C ; =FLOOR_GENERATION_STATUS + add r2, sl, r3 + mov r3, #1 + strb r3, [r0, #1] + add r7, r2, r1 + strb r3, [r7, #0xe] + ldrsh r5, [r2, r1] + add r6, r6, #0x4000 + b _023401E4 +_0234019C: + ldrsh r4, [r7, #2] + b _023401D4 +_023401A4: + mov r0, r5 + mov r1, r4 + bl GetTileSafe + ldrh r2, [r0] + mov r1, r4 + orr r2, r2, #0x40 + strh r2, [r0] + mov r0, r5 + bl GetTile + ldrb r0, [r0, #7] + add r4, r4, #1 +#ifdef JAPAN + strb r0, [r6, #0x25] +#else + strb r0, [r6, #0xc9] +#endif +_023401D4: + ldrsh r0, [r7, #6] + cmp r4, r0 + blt _023401A4 + add r5, r5, #1 +_023401E4: + ldrsh r0, [r7, #4] + cmp r5, r0 + blt _0234019C + b _02340210 +_023401F4: + add r7, r7, #1 +_023401F8: + add r5, r5, #1 +_023401FC: + cmp r5, r8 + blt _02340118 + add r4, r4, #1 +_02340208: + cmp r4, sb + blt _02340100 +_02340210: + add sp, sp, #0x100 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_02340218: .word DUNGEON_PTR +_0234021C: .word FLOOR_GENERATION_STATUS +_02340220: .word 0x000001C2 + arm_func_end GenerateMonsterHouse + + arm_func_start GenerateMazeRoom +GenerateMazeRoom: ; 0x02340224 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #0x100 + ldr r7, _02340450 ; =DUNGEON_PTR + movs r8, r3 + mov r6, r0 + mov r5, r1 + mov r4, r2 + ldr r7, [r7] + beq _02340448 + mov r0, #0x64 + bl DungeonRandInt + cmp r8, r0 + ble _02340448 + add r0, r7, #0x4000 +#ifdef JAPAN + ldrsh r0, [r0, #0x3a] +#else + ldrsh r0, [r0, #0xde] +#endif + cmp r0, #0 + bge _02340448 + mov sb, #0 + mov r1, sb + b _02340310 +_02340274: + ldr r0, _02340454 ; =0x000001C2 + mov r2, #0 + mla r3, r1, r0, r6 + mov r7, #0x1e + b _02340304 +_02340288: + mla r0, r2, r7, r3 + ldrb r8, [r0, #8] + cmp r8, #0 + ldreqb r8, [r0, #0x11] + cmpeq r8, #0 + bne _02340300 + ldrb r8, [r0, #0xb] + cmp r8, #0 + ldrneb r8, [r0, #0xa] + cmpne r8, #0 + beq _02340300 + ldrb r8, [r0, #0xc] + cmp r8, #0 + ldreqb r8, [r0, #0xf] + cmpeq r8, #0 + ldreqb r8, [r0, #0xe] + cmpeq r8, #0 + ldreqb r8, [r0, #9] + cmpeq r8, #0 + bne _02340300 + ldrsh sl, [r0, #4] + ldrsh r8, [r0] + sub r8, sl, r8 + tst r8, #1 + beq _02340300 + ldrsh r8, [r0, #6] + ldrsh r0, [r0, #2] + sub r0, r8, r0 + tst r0, #1 + addne sb, sb, #1 +_02340300: + add r2, r2, #1 +_02340304: + cmp r2, r4 + blt _02340288 + add r1, r1, #1 +_02340310: + cmp r1, r5 + blt _02340274 + cmp sb, #0 + beq _02340448 + mov r1, #0 + mov sl, r1 + add r0, sp, #0 +_0234032C: + strb sl, [r0, r1] + add r1, r1, #1 + cmp r1, #0x100 + blt _0234032C + mov r0, #1 + strb r0, [sp] + add r7, sp, #0 +_02340348: + mov r0, sb + bl DungeonRandInt + mov r8, r0 + mov r0, sb + bl DungeonRandInt + add sl, sl, #1 + ldrb r2, [r7, r8] + ldrb r1, [r7, r0] + cmp sl, #0x40 + strb r1, [r7, r8] + strb r2, [r7, r0] + blt _02340348 + mov r7, #0 + mov r2, r7 + b _02340440 +_02340384: + ldr r0, _02340454 ; =0x000001C2 + mov r3, #0 + mla r1, r2, r0, r6 + add sl, sp, #0 + mov r8, #0x1e + b _02340434 +_0234039C: + mla r0, r3, r8, r1 + ldrb sb, [r0, #8] + cmp sb, #0 + ldreqb sb, [r0, #0x11] + cmpeq sb, #0 + bne _02340430 + ldrb sb, [r0, #0xb] + cmp sb, #0 + ldrneb sb, [r0, #0xa] + cmpne sb, #0 + beq _02340430 + ldrb sb, [r0, #0xc] + cmp sb, #0 + ldreqb sb, [r0, #0xf] + cmpeq sb, #0 + ldreqb sb, [r0, #0xe] + cmpeq sb, #0 + ldreqb sb, [r0, #9] + cmpeq sb, #0 + bne _02340430 + ldrsh ip, [r0, #4] + ldrsh sb, [r0] + sub sb, ip, sb + tst sb, #1 + beq _02340430 + ldrsh ip, [r0, #6] + ldrsh sb, [r0, #2] + sub sb, ip, sb + tst sb, #1 + beq _02340430 + ldrb sb, [sl, r7] + cmp sb, #0 + beq _0234042C + mov r1, #0 + bl GenerateMaze + b _02340448 +_0234042C: + add r7, r7, #1 +_02340430: + add r3, r3, #1 +_02340434: + cmp r3, r4 + blt _0234039C + add r2, r2, #1 +_02340440: + cmp r2, r5 + blt _02340384 +_02340448: + add sp, sp, #0x100 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_02340450: .word DUNGEON_PTR +_02340454: .word 0x000001C2 + arm_func_end GenerateMazeRoom + + arm_func_start GenerateMaze +GenerateMaze: ; 0x02340458 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #0x10 + ldr r2, _023406D0 ; =FLOOR_GENERATION_STATUS + mov r3, #1 + mov r5, r0 + strb r3, [r2, #7] + strb r3, [r5, #0x10] + mov r4, r1 + ldrsh r0, [r5] + ldrsh r1, [r5, #2] + bl GetTile + ldrsh r1, [r5] + ldrb r7, [r0, #7] + add r6, r1, #1 + b _023404DC +_02340494: + ldrsh r1, [r5, #2] + mov r0, r6 + sub r1, r1, #1 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _023404D8 + ldrsh r3, [r5, #2] + ldrsh r2, [r5, #4] + mov r0, r6 + sub r1, r3, #1 + str r2, [sp] + ldrsh r2, [r5, #6] + stmib sp, {r2, r4, r7} + ldrsh r2, [r5] + bl GenerateMazeLine +_023404D8: + add r6, r6, #2 +_023404DC: + ldrsh r0, [r5, #4] + sub r0, r0, #1 + cmp r6, r0 + blt _02340494 + ldrsh r0, [r5, #2] + add r6, r0, #1 + b _02340538 +_023404F8: + ldrsh r0, [r5, #4] + mov r1, r6 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _02340534 + ldrsh r0, [r5, #4] + mov r1, r6 + str r0, [sp] + ldrsh r2, [r5, #6] + stmib sp, {r2, r4, r7} + ldrsh r2, [r5] + ldrsh r3, [r5, #2] + bl GenerateMazeLine +_02340534: + add r6, r6, #2 +_02340538: + ldrsh r0, [r5, #6] + sub r0, r0, #1 + cmp r6, r0 + blt _023404F8 + ldrsh r0, [r5] + add r6, r0, #1 + b _02340594 +_02340554: + ldrsh r1, [r5, #6] + mov r0, r6 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _02340590 + ldrsh r1, [r5, #6] + ldrsh r2, [r5, #4] + mov r0, r6 + str r2, [sp] + stmib sp, {r1, r4, r7} + ldrsh r2, [r5] + ldrsh r3, [r5, #2] + bl GenerateMazeLine +_02340590: + add r6, r6, #2 +_02340594: + ldrsh r0, [r5, #4] + sub r0, r0, #1 + cmp r6, r0 + blt _02340554 + ldrsh r0, [r5, #2] + add r6, r0, #1 + b _023405F8 +_023405B0: + ldrsh r0, [r5] + mov r1, r6 + sub r0, r0, #1 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _023405F4 + ldrsh r2, [r5] + ldrsh r3, [r5, #4] + mov r1, r6 + sub r0, r2, #1 + str r3, [sp] + ldrsh r3, [r5, #6] + stmib sp, {r3, r4, r7} + ldrsh r3, [r5, #2] + bl GenerateMazeLine +_023405F4: + add r6, r6, #2 +_023405F8: + ldrsh r0, [r5, #6] + sub r0, r0, #1 + cmp r6, r0 + blt _023405B0 + ldrsh r0, [r5] + add r8, r0, #3 + b _023406B8 +_02340614: + ldrsh r0, [r5, #2] + sub r6, r8, #1 + add sb, r0, #3 + b _023406A4 +_02340624: + mov r0, r8 + mov r1, sb + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + bne _023406A0 + cmp r4, #0 + mov r0, r6 + mov r1, sb + beq _0234066C + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #2 + b _02340678 +_0234066C: + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 +_02340678: + strh r1, [r0] + ldrsh r2, [r5, #4] + mov r0, r8 + mov r1, sb + str r2, [sp] + ldrsh r2, [r5, #6] + stmib sp, {r2, r4, r7} + ldrsh r2, [r5] + ldrsh r3, [r5, #2] + bl GenerateMazeLine +_023406A0: + add sb, sb, #2 +_023406A4: + ldrsh r0, [r5, #6] + sub r0, r0, #3 + cmp sb, r0 + blt _02340624 + add r8, r8, #2 +_023406B8: + ldrsh r0, [r5, #4] + sub r0, r0, #3 + cmp r8, r0 + blt _02340614 + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_023406D0: .word FLOOR_GENERATION_STATUS + arm_func_end GenerateMaze + + arm_func_start GenerateMazeLine +GenerateMazeLine: ; 0x023406D4 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0xc + ldr r4, [sp, #0x34] + ldr fp, [sp, #0x30] + ldr r7, [sp, #0x38] + ldr r6, [sp, #0x3c] + str r4, [sp, #0x34] + mov sb, r0 + mov r8, r1 + str r2, [sp] + str r3, [sp, #4] +_02340700: + mov r0, #4 + bl DungeonRandInt + mov r4, r0 + mov r0, sb + mov r1, r8 + mov sl, #0 + bl GetTileSafe + mov r1, r7 + and r2, r6, #0xff + bl SetTerrainObstacleChecked + mvn r0, #1 + str r0, [sp, #8] +_02340730: + and r5, r4, #3 + cmp r5, #3 + addls pc, pc, r5, lsl #2 + b _02340774 +_02340740: ; jump table + b _02340750 ; case 0 + b _0234075C ; case 1 + b _02340768 ; case 2 + b _02340774 ; case 3 +_02340750: + mov r0, #2 + mov r2, #0 + b _0234077C +_0234075C: + mov r0, #0 + ldr r2, [sp, #8] + b _0234077C +_02340768: + ldr r0, [sp, #8] + mov r2, #0 + b _0234077C +_02340774: + mov r0, #0 + mov r2, #2 +_0234077C: + ldr r1, [sp] + add r0, sb, r0 + cmp r1, r0 + bgt _023407C4 + cmp fp, r0 + ble _023407C4 + add r1, r8, r2 + ldr r2, [sp, #4] + cmp r2, r1 + bgt _023407C4 + ldr r2, [sp, #0x34] + cmp r2, r1 + ble _023407C4 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + beq _023407D8 +_023407C4: + add r4, r4, #1 + add sl, sl, #1 + cmp sl, #4 + blt _02340730 + b _02340874 +_023407D8: + cmp r5, #3 + addls pc, pc, r5, lsl #2 + b _02340700 +_023407E4: ; jump table + b _023407F4 ; case 0 + b _02340814 ; case 1 + b _02340834 ; case 2 + b _02340854 ; case 3 +_023407F4: + mov r1, r8 + add r0, sb, #1 + bl GetTileSafe + mov r1, r7 + and r2, r6, #0xff + bl SetTerrainObstacleChecked + add sb, sb, #2 + b _02340700 +_02340814: + mov r0, sb + sub r1, r8, #1 + bl GetTileSafe + mov r1, r7 + and r2, r6, #0xff + bl SetTerrainObstacleChecked + sub r8, r8, #2 + b _02340700 +_02340834: + mov r1, r8 + sub r0, sb, #1 + bl GetTileSafe + mov r1, r7 + and r2, r6, #0xff + bl SetTerrainObstacleChecked + sub sb, sb, #2 + b _02340700 +_02340854: + mov r0, sb + add r1, r8, #1 + bl GetTileSafe + mov r1, r7 + and r2, r6, #0xff + bl SetTerrainObstacleChecked + add r8, r8, #2 + b _02340700 +_02340874: + add sp, sp, #0xc + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end GenerateMazeLine + + arm_func_start SetSpawnFlag5 +SetSpawnFlag5: ; 0x0234087C + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + ldrsh r5, [r6] + b _023408C0 +_0234088C: + ldrsh r4, [r6, #2] + b _023408B0 +_02340894: + mov r0, r5 + mov r1, r4 + bl GetTileSafe + ldrh r1, [r0, #2] + add r4, r4, #1 + orr r1, r1, #0x20 + strh r1, [r0, #2] +_023408B0: + ldrsh r0, [r6, #6] + cmp r4, r0 + blt _02340894 + add r5, r5, #1 +_023408C0: + ldrsh r0, [r6, #4] + cmp r5, r0 + blt _0234088C + ldmia sp!, {r4, r5, r6, pc} + arm_func_end SetSpawnFlag5 + + arm_func_start IsNextToHallway +IsNextToHallway: ; 0x023408D0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mvn r5, #0 + mov sl, r0 + mov sb, r1 + mov r4, r5 + b _02340964 +_023408E8: + adds r8, sl, r5 + bmi _02340960 + cmp r8, #0x38 + bge _0234096C + mov r6, r4 + b _02340958 +_02340900: + adds r7, sb, r6 + bmi _02340954 + cmp r7, #0x20 + bge _02340960 + cmp r5, #0 + cmpne r6, #0 + bne _02340954 + mov r0, r8 + mov r1, r7 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #1 + bne _02340954 + mov r0, r8 + mov r1, r7 + bl GetTile + ldrb r0, [r0, #7] + cmp r0, #0xff + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_02340954: + add r6, r6, #1 +_02340958: + cmp r6, #1 + ble _02340900 +_02340960: + add r5, r5, #1 +_02340964: + cmp r5, #1 + ble _023408E8 +_0234096C: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end IsNextToHallway + + arm_func_start ResolveInvalidSpawns +ResolveInvalidSpawns: ; 0x02340974 + stmdb sp!, {r3, r4, r5, lr} + mov r5, #0 +_0234097C: + mov r4, #0 +_02340980: + mov r0, r5 + mov r1, r4 + bl GetTileSafe + ldrh r1, [r0] + and r1, r1, #3 + cmp r1, #1 + beq _023409BC + ldrh r1, [r0] + tst r1, #0x110 + ldrneh r1, [r0, #2] + bicne r1, r1, #2 + strneh r1, [r0, #2] + ldrh r1, [r0, #2] + bic r1, r1, #4 + strh r1, [r0, #2] +_023409BC: + ldrh r1, [r0, #2] + tst r1, #1 + beq _023409E0 + ldrh r1, [r0] + orr r1, r1, #0x200 + strh r1, [r0] + ldrh r1, [r0, #2] + bic r1, r1, #4 + strh r1, [r0, #2] +_023409E0: + ldrh r1, [r0, #2] + add r4, r4, #1 + tst r1, #2 + bicne r1, r1, #4 + strneh r1, [r0, #2] + cmp r4, #0x20 + blt _02340980 + add r5, r5, #1 + cmp r5, #0x38 + blt _0234097C + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ResolveInvalidSpawns + + arm_func_start ConvertSecondaryTerrainToChasms +ConvertSecondaryTerrainToChasms: ; 0x02340A0C + stmdb sp!, {r4, r5, r6, lr} + mov r6, #0 + mov r4, r6 +_02340A18: + mov r5, r4 +_02340A1C: + mov r0, r6 + mov r1, r5 + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #2 + bne _02340A5C + mov r0, r6 + mov r1, r5 + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + orr r1, r1, #3 + strh r1, [r0] +_02340A5C: + add r5, r5, #1 + cmp r5, #0x20 + blt _02340A1C + add r6, r6, #1 + cmp r6, #0x38 + blt _02340A18 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ConvertSecondaryTerrainToChasms + + arm_func_start EnsureImpassableTilesAreWalls +EnsureImpassableTilesAreWalls: ; 0x02340A78 + stmdb sp!, {r4, r5, r6, lr} + mov r6, #0 + mov r4, r6 +_02340A84: + mov r5, r4 +_02340A88: + mov r0, r6 + mov r1, r5 + bl GetTile + ldrh r0, [r0] + tst r0, #0x10 + beq _02340AB8 + mov r0, r6 + mov r1, r5 + bl GetTileSafe + ldrh r1, [r0] + bic r1, r1, #3 + strh r1, [r0] +_02340AB8: + add r5, r5, #1 + cmp r5, #0x20 + blt _02340A88 + add r6, r6, #1 + cmp r6, #0x38 + blt _02340A84 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end EnsureImpassableTilesAreWalls + + arm_func_start InitializeTile +InitializeTile: ; 0x02340AD4 + mov r2, #0 + strh r2, [r0] + strh r2, [r0, #2] + mov r1, #0xff + strb r1, [r0, #7] + strh r2, [r0, #4] + strb r2, [r0, #8] + strb r2, [r0, #9] + strb r2, [r0, #0xa] + strb r2, [r0, #0xb] + strb r2, [r0, #6] + str r2, [r0, #0xc] + str r2, [r0, #0x10] + bx lr + arm_func_end InitializeTile + + arm_func_start ResetFloor +ResetFloor: ; 0x02340B0C +#ifdef JAPAN +#define RESET_FLOOR_OFFSET -0xA4 +#else +#define RESET_FLOOR_OFFSET 0 +#endif + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r6, #0 + mov r4, r6 +_02340B18: + mov r5, r4 + sub r7, r6, #1 +_02340B20: + mov r0, r6 + mov r1, r5 + bl GetTileSafe + bl InitializeTile + sub r8, r5, #1 + mov r0, r6 + mov r1, r8 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + mov r1, r8 + add r0, r6, #1 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + mov r1, r8 + add r0, r6, #1 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + add r0, r6, #1 + add r1, r5, #1 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + mov r0, r6 + add r1, r5, #1 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + mov r0, r7 + add r1, r5, #1 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + mov r0, r7 + mov r1, r5 + bl PosIsOutOfBounds + cmp r0, #0 + bne _02340BD4 + mov r0, r7 + mov r1, r8 + bl PosIsOutOfBounds + cmp r0, #0 + beq _02340BEC +_02340BD4: + mov r0, r6 + mov r1, r5 + bl GetTileSafe + ldrh r1, [r0] + orr r1, r1, #0x10 + strh r1, [r0] +_02340BEC: + add r5, r5, #1 + cmp r5, #0x20 + blt _02340B20 + add r6, r6, #1 + cmp r6, #0x38 + blt _02340B18 + ldr r6, _02340CA8 ; =DUNGEON_PTR + mov sb, #0 + ldr r0, [r6] + mvn r1, #0 + add r0, r0, #0xcc00 + strh r1, [r0, #0xe4 + RESET_FLOOR_OFFSET] + ldr r0, [r6] + mov r7, sb + add r0, r0, #0xcc00 + strh r1, [r0, #0xe6 + RESET_FLOOR_OFFSET] + mov r4, #0x14 + mov r5, #0xa0 +_02340C34: + mul r8, sb, r5 + mov sl, r7 +_02340C3C: + ldr r0, [r6] +#ifdef JAPAN + add r0, r0, #0xbc + add r0, r0, #0xcc00 +#else + add r0, r0, #0xd60 + add r0, r0, #0xc000 +#endif + add r0, r0, r8 + mla r0, sl, r4, r0 + bl InitializeTile + add sl, sl, #1 + cmp sl, #8 + blt _02340C3C + add sb, sb, #1 + cmp sb, #8 + blt _02340C34 + ldr r1, _02340CA8 ; =DUNGEON_PTR + mov r3, #0 + ldr r0, [r1] + mov r2, r3 + add r0, r0, #0x3f00 + strh r3, [r0, #0xc0 + RESET_FLOOR_OFFSET] +_02340C84: + ldr r0, [r1] + add r0, r0, r3, lsl #2 + add r0, r0, #0x12000 + ldr r0, [r0, #0xcc8 + RESET_FLOOR_OFFSET] + add r3, r3, #1 + str r2, [r0] + cmp r3, #0x40 + blt _02340C84 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_02340CA8: .word DUNGEON_PTR + arm_func_end ResetFloor diff --git a/include/overlay_29_0233E43C.h b/include/overlay_29_0233E43C.h new file mode 100644 index 00000000..16a08bd2 --- /dev/null +++ b/include/overlay_29_0233E43C.h @@ -0,0 +1,11 @@ +#ifndef PMDSKY_OVERLAY_29_0233E43C_H +#define PMDSKY_OVERLAY_29_0233E43C_H + +#include "overlay_29_0233C9E8.h" + +void CreateHallway(s32 arg1, s32 arg2, s32 arg3, s32 arg4, bool8 arg5, s32 arg6, s32 arg7); + +void CreateGridCellConnections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, + s32 grid_size_y, s32 *arg4, s32 *arg5, bool8 arg6); + +#endif //PMDSKY_OVERLAY_29_0233E43C_H diff --git a/main.lsf b/main.lsf index 236f236e..5732f772 100644 --- a/main.lsf +++ b/main.lsf @@ -1228,6 +1228,8 @@ Overlay OVY_29 Object asm/overlay_29_0233AE84.o Object src/overlay_29_0233C9E8.o Object asm/overlay_29_0233CF84.o + Object src/overlay_29_0233E43C.o + Object asm/overlay_29_0233ED34.o Object src/overlay_29_02340CAC.o Object asm/overlay_29_02340CE4.o Object src/dungeon_generation.o diff --git a/src/overlay_29_0233E43C.c b/src/overlay_29_0233E43C.c new file mode 100644 index 00000000..c425d041 --- /dev/null +++ b/src/overlay_29_0233E43C.c @@ -0,0 +1,325 @@ +#include "overlay_29_0233E43C.h" +#include "overlay_29_0233C9E8.h" +#include "dg_random.h" +#include "dungeon_map_access.h" + +void CreateGridCellConnections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, s32 grid_size_y, s32 *arg4, s32 *arg5, bool8 arg6) +{ + s32 i; + s32 j; + + for (i = 0; i < grid_size_x; i++) { + for (j = 0; j < grid_size_y; j++) { + + if (grid[i][j].field_0x8 != 0) { + grid[i][j].field_0x11[6] = 0; + grid[i][j].field_0x11[7] = 0; + grid[i][j].field_0x11[8] = 0; + grid[i][j].field_0x11[9] = 0; + continue; + } + if (i <= 0) { + grid[i][j].field_0x11[4] = 0; + } + if (j <= 0) { + grid[i][j].field_0x11[2] = 0; + } + if (i >= grid_size_x - 1) { + grid[i][j].field_0x11[5] = 0; + } + if (j >= grid_size_y - 1) { + grid[i][j].field_0x11[3] = 0; + } + grid[i][j].field_0x11[6] = grid[i][j].field_0x11[2]; + grid[i][j].field_0x11[7] = grid[i][j].field_0x11[3]; + grid[i][j].field_0x11[8] = grid[i][j].field_0x11[4]; + grid[i][j].field_0x11[9] = grid[i][j].field_0x11[5]; + } + } + for (i = 0; i < grid_size_x; i++) { + for (j = 0; j < grid_size_y; j++) { + s32 v0; + s32 v1; + + if (grid[i][j].field_0x8 != 0) { + continue; + } + if (grid[i][j].field_0xa == 0) { + v0 = grid[i][j].field_0x0; + v1 = grid[i][j].field_0x2; + } else { + v0 = DungeonRandRange(grid[i][j].field_0x0 + 1, grid[i][j].field_0x4 - 1); + v1 = DungeonRandRange(grid[i][j].field_0x2 + 1, grid[i][j].field_0x6 - 1); + } + + if (grid[i][j].field_0x11[6] != 0) { + if (grid[i][j - 1].field_0x8 == 0) { + s32 t; + if (grid[i][j - 1].field_0xa == 0) { + t = grid[i][j - 1].field_0x0; + } else { + t = DungeonRandRange(grid[i][j - 1].field_0x0 + 1, grid[i][j - 1].field_0x4 - 1); + } + CreateHallway(v0, grid[i][(u32)j].field_0x2, t, grid[i][(u32)j - 1].field_0x6 - 1, TRUE, + arg4[i], arg5[j]); + } + grid[i][j].field_0x11[6] = 0; + grid[i][j - 1].field_0x11[7] = 0; + grid[i][j].field_0xb = 1; + grid[i][j - 1].field_0xb = 1; + } + + if (grid[i][j].field_0x11[7] != 0) { + if (grid[i][j + 1].field_0x8 == 0) { + s32 t; + if (grid[i][j + 1].field_0xa == 0) { + t = grid[i][j + 1].field_0x0; + } else { + t = DungeonRandRange(grid[i][j + 1].field_0x0 + 1, grid[i][j + 1].field_0x4 - 1); + } + CreateHallway(v0, grid[i][(u32)j].field_0x6 - 1, t, grid[i][(u32)j + 1].field_0x2, TRUE, + arg4[i], arg5[j + 1] - 1); + } + grid[i][j].field_0x11[7] = 0; + grid[i][j + 1].field_0x11[6] = 0; + grid[i][j].field_0xb = 1; + grid[i][j + 1].field_0xb = 1; + } + + if (grid[i][j].field_0x11[8] != 0) { + if (grid[i - 1][j].field_0x8 == 0) { + s32 t; + if (grid[i - 1][j].field_0xa == 0) { + t = grid[i - 1][j].field_0x2; + } else { + t = DungeonRandRange(grid[i - 1][j].field_0x2 + 1, grid[i - 1][j].field_0x6 - 1); + } + CreateHallway(grid[i][(u32)j].field_0x0, v1, grid[i - 1][(u32)j].field_0x0 - 1, t, FALSE, + arg4[i], arg5[j]); + } + grid[i][j].field_0x11[8] = 0; + grid[i - 1][j].field_0x11[9] = 0; + grid[i][j].field_0xb = 1; + grid[i - 1][j].field_0xb = 1; + } + + if (grid[i][j].field_0x11[9] != 0) { + if (grid[i + 1][j].field_0x8 == 0) { + s32 t; + if (grid[i + 1][j].field_0xa == 0) { + t = grid[i + 1][j].field_0x2; + } else { + t = DungeonRandRange(grid[i + 1][j].field_0x2 + 1, grid[i + 1][j].field_0x6 - 1); + } + CreateHallway(grid[i][(u32)j].field_0x4 - 1, v1, grid[i + 1][(u32)j].field_0x0, t, FALSE, + arg4[i + 1] - 1, arg5[j]); + } + grid[i][j].field_0x11[9] = 0; + grid[i + 1][j].field_0x11[8] = 0; + grid[i][j].field_0xb = 1; + grid[i + 1][j].field_0xb = 1; + } + } + } + if (arg6) { + return; + } + for (i = 0; i < grid_size_x; i++) { + for (j = 0; j < grid_size_y; j++) { + struct unk_0233C9E8 *cell; + + if (DungeonRandInt(100) >= 5) { + continue; + } + cell = &grid[i][j]; + if (cell->field_0x8 != 0) { + continue; + } + if (cell->field_0xb == 0) { + continue; + } + if (cell->field_0x11[1] != 0 || cell->field_0x9 != 0) { + continue; + } + if (cell->field_0xa == 0) { + continue; + } + switch (DungeonRandInt(4)) { + case 0: { + s32 x0, y0, y1; + int x1; + s32 y, x; + s32 room; + + if (i < 1) { + break; + } + if (cell[-15].field_0xb == 0) { + break; + } + if (cell[-15].field_0x8 != 0) { + break; + } + if (cell[-15].field_0xa == 0) { + break; + } + if (cell[-15].field_0x9 != 0 || cell[-15].field_0x11[1] != 0) { + break; + } + x0 = cell[-15].field_0x0; + y0 = cell[-15].field_0x2 < cell->field_0x2 ? cell[-15].field_0x2 : cell->field_0x2; + x1 = cell->field_0x4; + y1 = cell[-15].field_0x6 > cell->field_0x6 ? cell[-15].field_0x6 : cell->field_0x6; + room = GetTile(cell->field_0x0, cell->field_0x2)->room; + for (x = x0; x < x1; x++) { + for (y = y0; y < y1; y++) { + struct tile *t = GetTileSafe(x, y); + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + t->room = room; + } + } + cell[-15].field_0x0 = x0; + cell[-15].field_0x4 = x1; + cell[-15].field_0x2 = y0; + cell[-15].field_0x6 = y1; + cell->field_0x11[1] = 1; + cell[-15].field_0x11[1] = 1; + cell->field_0xb = 0; + cell->field_0x11[0] = 1; + break; + } + case 1: { + s32 x0, y0, y1; + int x1; + s32 y, x; + s32 room; + + if (j < 1) { + break; + } + if (cell[-1].field_0xb == 0) { + break; + } + if (cell[-1].field_0x8 != 0) { + break; + } + if (cell[-1].field_0xa == 0) { + break; + } + if (cell[-1].field_0x9 != 0 || cell[-1].field_0x11[1] != 0) { + break; + } + x0 = cell[-1].field_0x0 < cell->field_0x0 ? cell[-1].field_0x0 : cell->field_0x0; + y0 = cell[-1].field_0x2; + x1 = cell[-1].field_0x4 > cell->field_0x4 ? cell[-1].field_0x4 : cell->field_0x4; + y1 = cell->field_0x6; + room = GetTile(cell->field_0x0, cell->field_0x2)->room; + for (x = x0; x < x1; x++) { + for (y = y0; y < y1; y++) { + struct tile *t = GetTileSafe(x, y); + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + t->room = room; + } + } + cell[-1].field_0x0 = x0; + cell[-1].field_0x4 = x1; + cell[-1].field_0x2 = y0; + cell[-1].field_0x6 = y1; + cell->field_0x11[1] = 1; + cell[-1].field_0x11[1] = 1; + cell->field_0xb = 0; + cell->field_0x11[0] = 1; + break; + } + case 2: { + s32 x0, y0, x1, y1, y, x; + s32 room; + + if (i > grid_size_x - 2) { + break; + } + if (grid[i + 1][j].field_0xb == 0) { + break; + } + if (grid[i + 1][j].field_0x8 != 0) { + break; + } + if (grid[i + 1][j].field_0xa == 0) { + break; + } + if (grid[i + 1][j].field_0x9 != 0 || grid[i + 1][j].field_0x11[1] != 0) { + break; + } + x0 = cell->field_0x0; + y0 = cell->field_0x2 < grid[i + 1][j].field_0x2 ? cell->field_0x2 : grid[i + 1][j].field_0x2; + x1 = grid[i + 1][j].field_0x4; + y1 = cell->field_0x6 > grid[i + 1][j].field_0x6 ? cell->field_0x6 : grid[i + 1][j].field_0x6; + room = GetTile(cell->field_0x0, cell->field_0x2)->room; + for (x = x0; x < x1; x++) { + for (y = y0; y < y1; y++) { + struct tile *t = GetTileSafe(x, y); + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + t->room = room; + } + } + cell->field_0x0 = x0; + cell->field_0x4 = x1; + cell->field_0x2 = y0; + cell->field_0x6 = y1; + grid[i + 1][j].field_0x11[1] = 1; + cell->field_0x11[1] = 1; + grid[i + 1][j].field_0xb = 0; + grid[i + 1][j].field_0x11[0] = 1; + break; + } + case 3: { + s32 x0, y0, x1, y1, y, x; + s32 room; + + if (j > grid_size_y - 2) { + break; + } + if (grid[i][j + 1].field_0xb == 0) { + break; + } + if (grid[i][j + 1].field_0x8 != 0) { + break; + } + if (grid[i][j + 1].field_0xa == 0) { + break; + } + if (grid[i][j + 1].field_0x9 != 0 || grid[i][j + 1].field_0x11[1] != 0) { + break; + } + x0 = cell->field_0x0 < grid[i][j + 1].field_0x0 ? cell->field_0x0 : grid[i][j + 1].field_0x0; + y0 = cell->field_0x2; + x1 = cell->field_0x4 > grid[i][j + 1].field_0x4 ? cell->field_0x4 : grid[i][j + 1].field_0x4; + y1 = grid[i][j + 1].field_0x6; + room = GetTile(cell->field_0x0, cell->field_0x2)->room; + for (x = x0; x < x1; x++) { + for (y = y0; y < y1; y++) { + struct tile *t = GetTileSafe(x, y); + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + t->room = room; + } + } + cell->field_0x0 = x0; + cell->field_0x4 = x1; + cell->field_0x2 = y0; + cell->field_0x6 = y1; + grid[i][j + 1].field_0x11[1] = 1; + cell->field_0x11[1] = 1; + grid[i][j + 1].field_0xb = 0; + grid[i][j + 1].field_0x11[0] = 1; + break; + } + } + } + } + + +} From dae72255ffd3fe2cf28c2793100827019de3e9b6 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sat, 12 Sep 2026 00:47:37 -0700 Subject: [PATCH 16/34] Rephrase eight matched functions; drop index casts and magic numbers Re-land eight already-matching functions in more idiomatic C. Every one was verified at score 0 in each region it has a target for BEFORE landing, and by a matching US build AFTER landing, one function at a time. CreateGridCellConnections 320 -> 278 eight (u32) index casts removed GenerateExtraHallways 170 -> 161 terrain_flags & 3 -> GetTerrainType ActivateEndOfTurnEffects 538 -> 533 MAX_HP_LIMIT for the 999 literals ApplyDamageAndEffects 316 -> 314 CalcDamage 635 -> 631 one volatile local dropped ApplyDamage 807 -> 818 ov11_022ED69C 242 -> 240 const void * -> typed pointers ov11_02307334 733 -> 735 three redundant (u8 *) casts dropped The CreateGridCellConnections index casts had been recorded as load-bearing. They are not. MWCC keys common-subexpression elimination on the address expression INCLUDING integer conversion nodes, so an `int` alias of an `s32` index splits the use-set exactly as a cast does, while a same-type copy is erased by copy propagation. An identity (s32) cast is byte-identical to the (u32) one, and casting every site is byte-identical to casting none, which is what shows the lever is the split rather than the cast. overlay_29_0233C9E8.c gains #include "dungeon.h" and "dungeon_util_static.h" for TERRAIN_TYPE_*, DUNGEON_MAX_SIZE_* and GetTerrainType. All three were already in the tree; no name is introduced here. Three candidate rephrasings were rejected on measurement and are not included: one scored 1195 in EUROPE against a landed baseline of 10, one carried an artificial `damage_data++; damage_data--;` pair, and one did not match at all. Authored by Claude (Opus 5) under human direction. Confirmed by a matching build after each individual change: build/pmdsky.us/pmdsky.us.nds: OK. Co-Authored-By: Claude Opus 5 --- src/overlay_11_022ED69C.c | 26 +-- src/overlay_11_02307334.c | 68 +++--- src/overlay_29_02308FBC.c | 445 +++++++++++++++++++------------------- src/overlay_29_0230BBAC.c | 32 ++- src/overlay_29_02311010.c | 203 +++++++++-------- src/overlay_29_0233C9E8.c | 65 +++--- src/overlay_29_0233E43C.c | 374 ++++++++++++++------------------ 7 files changed, 582 insertions(+), 631 deletions(-) diff --git a/src/overlay_11_022ED69C.c b/src/overlay_11_022ED69C.c index fde88e35..27e9ebaa 100644 --- a/src/overlay_11_022ED69C.c +++ b/src/overlay_11_022ED69C.c @@ -14,9 +14,8 @@ bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) u16 *p1; s32 i2; s32 j2; - s32 idx; struct UnkStruct_2324CBC_Sub98 *unkSubPtr; - const void *data1; + const u8 *data1; const RGB_Array *rgb; const AnimationSpecification *spec; MapRender *render1; @@ -25,7 +24,6 @@ bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) BplHeader *bpl2; BmaHeader *bma1; BmaHeader *bma2; - u16 v1; if (src->unk1BE == -1) { ov11_022EC08C(dst); @@ -69,8 +67,8 @@ bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) bma1->hasCollision = bma2->hasCollision; unkSubPtr = &ov11_02324CBC->unk98[dst->unk2BC.unk0]; - v1 = dst->unk2BC.unk6 * 16; - rgb = data1 + 4; + u16 v1 = dst->unk2BC.unk6 * 16; + rgb = (const RGB_Array *)(data1 + 4); for (i = 0; i < bpl1->numPalettes && i < dst->unk2BC.unk8; i++) { CopyColorToPaletteDataRgba(unkSubPtr, v1++, &ov11_02320BF4); FillPaletteDataRgba(unkSubPtr, v1, rgb, 15); @@ -93,11 +91,9 @@ bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) if (bpl1->hasPalAnimations) { s32 v2 = bpl1->numPalettes * 15; - const void *data2; - spec = data1 + 4 + v2 * 4; - data2 = spec + bpl1->numPalettes; - rgb = data2; + spec = (const AnimationSpecification *)(data1 + 4 + v2 * 4); + rgb = (const RGB_Array *)(spec + bpl1->numPalettes); dst->animationSpecifications = spec; dst->unk1FB = 1; dst->unk1BC = 0; @@ -173,7 +169,7 @@ bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) if (bpaName[0] != 0) { struct BpaHeader *bpa; s32 *p3; - void *p4; + u16 *p4; s32 v6; dstC4->bpaFile = srcC4->bpaFile; @@ -183,9 +179,11 @@ bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) dstC4->unk10 = bpa; p3 = &bpa->durationPerFrame[0]; v6 = bpa->numFrames; - dstC4->unk14 = dstC4->unk18 = p3; - p4 = p3 + v6; - dstC4->unk1C = dstC4->unk20 = p4; + dstC4->unk18 = p3; + dstC4->unk14 = p3; + p4 = (u16 *)(p3 + v6); + dstC4->unk20 = p4; + dstC4->unk1C = p4; dstC4->unk2 = 0; dstC4->unk4 = *dstC4->unk18; dstC4->unk24 = p1; @@ -221,7 +219,7 @@ bool8 ov11_022ED69C(GroundBg *dst, GroundBg *src) render2 = dst->mapRender; for (i = 0; i < dst->unk1FC; i++, render2++, render1++) { *render2 = *render1; - idx = render2->unk2; + s32 idx = render2->unk2; for (j = 0; j < render2->numBgs && idx < dst->unk2BC.numLayers; j++, idx++) { diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index b5cba470..d9e1e7e5 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -166,15 +166,10 @@ s32 ov11_02307334(void) struct struct_2 menu_b; struct struct_2 menu_a; struct preprocessor_args args; - char buf[0x400]; - struct unk_02309DAC sel_18; - struct unk_02309DAC sel_10; - u16 btn_e; - u16 btn_c; switch (ov11_02324D8C->field_0x0) { case 0: { - ov11_02324D8C->field_0x4 = CreateInventoryMenuOuter(GetNbItemsInBag(), 0, ov11_02324D8C->field_0x10, ov11_02324D8C->field_0x104, (void *)ov11_02307300, ov11_02324D8C->field_0x31c, 0); + ov11_02324D8C->field_0x4 = CreateInventoryMenuOuter(GetNbItemsInBag(), 0, ov11_02324D8C->field_0x10, ov11_02324D8C->field_0x104, ov11_02307300, ov11_02324D8C->field_0x31c, 0); ov11_02324D8C->field_0x5 = CreateTextBox(&ov11_02322C88, 0); ov11_02324D8C->field_0x18 = -1; ov11_02324D8C->field_0x0 = 1; @@ -191,11 +186,13 @@ s32 ov11_02307334(void) break; } case 1: { - u8 v1; + u8 v1; + char buf[0x400]; + u16 buttons; - GetPressedButtons(0, &btn_e); + GetPressedButtons(0, &buttons); v1 = PopInventoryMenuField0x1A3(ov11_02324D8C->field_0x4); - if ((btn_e & 4) || (btn_e & 0x800) || v1) { + if ((buttons & 4) || (buttons & 0x800) || v1) { if (!v1) { PlaySeVolumeWrapper(5); } @@ -217,14 +214,14 @@ s32 ov11_02307334(void) sub_02027B1C(v2); if ((bool8)((v4->flags & 1) != 0)) { #ifdef EUROPE - strcpy((u8 *)buf, StringFromId((u16)(v4->id + 0x2f4b))); + strcpy(buf, StringFromId((u16)(v4->id + 0x2f4b))); #elif defined(JAPAN) - strcpy((u8 *)buf, StringFromId((u16)(v4->id + 0x1d41))); + strcpy(buf, StringFromId((u16)(v4->id + 0x1d41))); #else - strcpy((u8 *)buf, StringFromId((u16)(v4->id + 0x2f49))); + strcpy(buf, StringFromId((u16)(v4->id + 0x2f49))); #endif } else { - strcpy((u8 *)buf, ov11_02322DB0); + strcpy(buf, ov11_02322DB0); } DrawTextInWindow(v2, 2, 2, buf); UpdateWindow(v2); @@ -235,13 +232,15 @@ s32 ov11_02307334(void) if (v5 >= 0) { struct item *v6; + bool8 v6f; s32 v7; s32 v8; ov11_02324D8C->field_0x10 = v5; v6 = GetItemAtIdx(ov11_02324D8C->field_0x10); ov11_02324D8C->field_0x24e = v6->id; - if ((bool8)((v6->flags & 1) != 0)) { + v6f = (v6->flags & 1) != 0; + if (v6f) { ov11_02324D8C->field_0x24e = v6->id; } else { ov11_02324D8C->field_0x24e = 0; @@ -259,6 +258,8 @@ s32 ov11_02307334(void) ov11_02324D8C->field_0x276[i] = 3; } break; + default: + break; } } menu_a.c = ov11_02324D8C->field_0x276; @@ -276,8 +277,10 @@ s32 ov11_02307334(void) ov11_02324D8C->field_0x0 = 0xe; } } else { - GetPressedButtons(0, &btn_c); - if (btn_c & 8) { + u16 pressed; + + GetPressedButtons(0, &pressed); + if (pressed & 8) { PlaySeVolumeWrapper(0); ov10_022BCDF4(ov11_02324D8C->field_0x4); ov11_02324D8C->field_0x10 = ov10_022BCDA8(ov11_02324D8C->field_0x4); @@ -334,6 +337,7 @@ s32 ov11_02307334(void) break; } case 18: { + struct unk_02309DAC sel; struct unk_02308F4C *v2; s16 v3; s32 v4; @@ -343,8 +347,8 @@ s32 ov11_02307334(void) } if (ov11_02309E24() != -1) { v2 = &ov11_02324D8C->field_0x238; - ov11_02309DAC(&sel_18); - ov11_02308F4C(v2, &sel_18); + ov11_02309DAC(&sel); + ov11_02308F4C(v2, &sel); ov11_02324D8C->field_0x30c = GetLearnableIqSkills(ov11_02324D8C->field_0x280, v2->field_0x8, *v2->field_0x10); ov11_02324D8C->field_0x250 = -1; ov11_02324D8C->field_0x318 = *v2->field_0x10; @@ -446,7 +450,7 @@ s32 ov11_02307334(void) ov11_02324D8C->field_0xb4.id_vals[0] = ov11_02324D8C->field_0x314; sub_02017C50(4); ov11_02308EDC(); - ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, 0x2BF + OV11_02307334_OFFSET, &ov11_02324D8C->field_0xb4); + ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, 0x2bf + OV11_02307334_OFFSET, &ov11_02324D8C->field_0xb4); EnableIqSkill(ov11_02324D8C->field_0x238.field_0xc, (u8)ov11_02324D8C->field_0x314); ov11_02308FD0(&ov11_02324D8C->field_0x238); ov11_02324D8C->field_0x314++; @@ -468,19 +472,19 @@ s32 ov11_02307334(void) v1 = 0; break; case 1: - v1 = 0x2C1 + OV11_02307334_OFFSET; + v1 = 0x2c1 + OV11_02307334_OFFSET; break; case 2: - v1 = 0x2C2 + OV11_02307334_OFFSET; + v1 = 0x2c2 + OV11_02307334_OFFSET; break; case 4: - v1 = 0x2C3 + OV11_02307334_OFFSET; + v1 = 0x2c3 + OV11_02307334_OFFSET; break; case 8: - v1 = 0x2C4 + OV11_02307334_OFFSET; + v1 = 0x2c4 + OV11_02307334_OFFSET; break; default: - v1 = 0x2C0 + OV11_02307334_OFFSET; + v1 = 0x2c0 + OV11_02307334_OFFSET; break; } if (v1 == 0) { @@ -488,7 +492,7 @@ s32 ov11_02307334(void) break; } ov11_02308EDC(); - ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, 0x2BF + OV11_02307334_OFFSET, &ov11_02324D8C->field_0xb4); + ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, 0x2bf + OV11_02307334_OFFSET, &ov11_02324D8C->field_0xb4); ov11_02324D8C->field_0x314++; ov11_02324D8C->field_0x0 = 0x17; break; @@ -513,9 +517,10 @@ s32 ov11_02307334(void) } if (ov11_02309E24() != -1) { struct unk_02324D8C *v1 = ov11_02324D8C; + struct unk_02309DAC sel; - ov11_02309DAC(&sel_10); - ov11_02308F4C(&v1->field_0x238, &sel_10); + ov11_02309DAC(&sel); + ov11_02308F4C(&v1->field_0x238, &sel); ov11_02308FEC(&v1->field_0x238); if (sub_020415BC()) { ov11_02324D8C->field_0x0 = 0x1d; @@ -614,10 +619,8 @@ s32 ov11_02307334(void) { s32 v1 = 0x8d7 + OV11_02307334_OFFSET_2; - if (ov11_02324D8C->field_0x24c < 3) { - if (sub_02041364(ov11_02324D8C->field_0x24c)) { - v1--; - } + if (ov11_02324D8C->field_0x24c < 3 && sub_02041364(ov11_02324D8C->field_0x24c)) { + v1 = 0x8d6 + OV11_02307334_OFFSET_2; } ov11_02308EDC(); ShowStringIdInDialogueBox(ov11_02324D8C->field_0x8, 0x18, v1, &ov11_02324D8C->field_0xb4); @@ -879,7 +882,7 @@ s32 ov11_02307334(void) ov11_02324D8C->field_0x0 = 0xf; break; } - case 15: { + case 15: if (!IsInventoryMenuActive(ov11_02324D8C->field_0x4)) { CloseTextBox2(ov11_02324D8C->field_0x5); ov11_02324D8C->field_0x5 = -2; @@ -887,7 +890,6 @@ s32 ov11_02307334(void) ov11_02324D8C->field_0x4 = -2; ov11_02324D8C->field_0x0 = 0x10; } - } case 16: return 1; } diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index cd2d424e..ce16d975 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -222,13 +222,13 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, struct unk_02308FE0 unk1; struct entity *arr[8]; struct monster *mon1; - s32 v1; + s32 result; s32 i; + s32 k; s32 n; + s32 v1; s32 v2; bool8 f1; - s32 result; - s32 k; if ((result = ApplyDamage(attacker, defender, damage_data, a4, a5, a6, a8)) != 0 || (result = damage_data->field_0x10) != 0) { @@ -240,11 +240,12 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, if ((result = EntityIsValid__02308FBC(defender)) == 0) { return result; } - if ((result = attacker->type) != 1 || (result = defender->type) != 1) { + if ((result = attacker->type) != ENTITY_MONSTER + || (result = defender->type) != ENTITY_MONSTER) { return result; } - if (((struct monster *)defender->info)->bide_class_status.bide == 0xC) { + if (((struct monster *)defender->info)->bide_class_status.bide == STATUS_TWO_TURN_ENRAGED) { BoostOffensiveStat(attacker, defender, ATK_STAT_IDX, 1); } @@ -253,7 +254,7 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, } if (ov29_02300D50(defender) - || ((struct monster *)defender->info)->bide_class_status.bide != 0) { + || ((struct monster *)defender->info)->bide_class_status.bide != STATUS_TWO_TURN_NONE) { result = FALSE; } else if (IqSkillIsEnabled(attacker, IQ_HIT_AND_RUNNER) && DungeonRandInt(100) < ov10_022C442C) { @@ -265,7 +266,7 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, result = FALSE; } else { if (((struct monster *)defender->info)->reflect_class_status.reflect - == 0xD) { + == STATUS_REFLECT_VITAL_THROW) { ov29_022E5E84(defender, attacker); TryHurl(defender, attacker); } @@ -283,75 +284,75 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, || abs(attacker->pos.y - defender->pos.y) > 1) { result = FALSE; } else { - ResetDamageData(&unk1); - mon1 = defender->info; + ResetDamageData(&unk1); + mon1 = defender->info; - if (!v2) { - if (mon1->reflect_class_status.reflect == 4) { - ov29_022E3F24(defender); + if (!v2) { + if (mon1->reflect_class_status.reflect == STATUS_REFLECT_COUNTER) { + ov29_022E3F24(defender); + v1 += 4; + } + if (((struct monster *)defender->info)->reflect_class_status.reflect + == STATUS_REFLECT_MINI_COUNTER) { + ov29_022E3F24(defender); + v1 += 1; + } + if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_COUNTER_PHYSICAL_DAMAGE)) { + v1 += 4; + } + if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_COUNTER_25_PCT_PHYSICAL_DAMAGE)) { + v1 += 1; + } + if (IqSkillIsEnabled(defender, IQ_COUNTER_BASHER) + && ov10_022C44C0 > (s16)DungeonRandInt(100)) { + v1 += 4; + } + if (IqSkillIsEnabled(defender, IQ_COUNTER_HITTER) + && ov10_022C4464 > (s16)DungeonRandInt(100)) { + v1 += 1; + } + } else if (mon1->reflect_class_status.reflect == STATUS_REFLECT_MIRROR_COAT) { + ov29_022E40C0(defender); v1 += 4; } + if (((struct monster *)defender->info)->reflect_class_status.reflect - == 0xA) { - ov29_022E3F24(defender); - v1 += 1; + == STATUS_REFLECT_METAL_BURST) { + ov29_022E57D4(defender); + v1 += 2; } - if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_COUNTER_PHYSICAL_DAMAGE)) { - v1 += 4; - } - if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_COUNTER_25_PCT_PHYSICAL_DAMAGE)) { - v1 += 1; - } - if (IqSkillIsEnabled(defender, IQ_COUNTER_BASHER) - && ov10_022C44C0 > (s16)DungeonRandInt(100)) { - v1 += 4; - } - if (IqSkillIsEnabled(defender, IQ_COUNTER_HITTER) - && ov10_022C4464 > (s16)DungeonRandInt(100)) { - v1 += 1; - } - } else if (mon1->reflect_class_status.reflect == 8) { - ov29_022E40C0(defender); - v1 += 4; - } - - if (((struct monster *)defender->info)->reflect_class_status.reflect - == 0xF) { - ov29_022E57D4(defender); - v1 += 2; - } #ifdef JAPAN - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ROUGH_SKIN)) { + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ROUGH_SKIN)) { #else - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ROUGH_SKIN, TRUE)) { + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ROUGH_SKIN, TRUE)) { #endif - v1 += 2; - } - - if (v1 != 0) { - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C3F); - unk1.field_0x0 = damage_data->field_0x0 * v1 / 4; - unk1.field_0xc = damage_data->field_0xc; - unk1.field_0x4 = 6; - unk1.field_0x8 = 2; - unk1.field_0xd = damage_data->field_0xd; - unk1.field_0xe = 0; - unk1.field_0xf = 0; - unk1.field_0x10 = 0; - - if (((struct monster *)defender->info)->reflect_class_status.reflect - == 0xF) { - unk1.field_0xd = 1; - n = ov29_023380FC(defender, arr); - for (k = 0; k < n; k = (s16)(k + 1)) { - ApplyDamage(defender, arr[k], &unk1, 0, a5, (s16)a6, a8); - } - } else { - ApplyDamage(defender, attacker, &unk1, 0, a5, (s16)a6, a8); + v1 += 2; + } + + if (v1 != 0) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C3F); + unk1.field_0x0 = damage_data->field_0x0 * v1 / 4; + unk1.field_0xc = damage_data->field_0xc; + unk1.field_0x4 = 6; + unk1.field_0x8 = MATCHUP_NEUTRAL; + unk1.field_0xd = damage_data->field_0xd; + unk1.field_0xe = FALSE; + unk1.field_0xf = FALSE; + unk1.field_0x10 = FALSE; + + if (((struct monster *)defender->info)->reflect_class_status.reflect + == STATUS_REFLECT_METAL_BURST) { + unk1.field_0xd = 1; + n = ov29_023380FC(defender, arr); + for (k = 0; k < n; k = (s16)(k + 1)) { + ApplyDamage(defender, arr[k], &unk1, 0, a5, (s16)a6, a8); + } + } else { + ApplyDamage(defender, attacker, &unk1, 0, a5, (s16)a6, a8); + } } - } result = IsEitherMonsterInvalid(attacker, defender); } @@ -364,141 +365,138 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, || abs(attacker->pos.y - defender->pos.y) > 1) { result = FALSE; } else { - { - s32 v3 = CategoryIsNotPhysical(damage_data->field_0xd); - struct unk_023535DC *ptr1; - struct monster *mon2 = attacker->info; + s32 v3 = CategoryIsNotPhysical(damage_data->field_0xd); + struct unk_023535DC *ptr1; + struct monster *mon2 = attacker->info; - if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS) && !v3 - && DungeonRandInt(100) < ov10_022C45B4) { - i = DungeonRandInt(300); - if (i < 100) { - ov29_0230F728(attacker, defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS, 0x40); - } else if (i < 200) { - ov29_0230F728(attacker, defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS, 0x10); - } else { - ov29_0230F728(attacker, defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS, 0x80); - } - } - - for (ptr1 = ov29_023535DC; *(u8 *)ptr1 != 0; ptr1++) { - if (ExclusiveItemEffectIsActive__0230A9B8(defender, (enum exclusive_item_effect_id)ptr1->field_0x0) - && ptr1->field_0x8(attacker, defender, v3)) { - ov29_0230F728(attacker, defender, (enum exclusive_item_effect_id)ptr1->field_0x0, - ptr1->field_0x4); - } - } - - if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_MAY_WARP_WHEN_ATTACKED) - && DungeonRandInt(100) < ov10_022C45B0 && HasLowHealth(defender)) { - ov29_0230F728(attacker, defender, EXCLUSIVE_EFF_MAY_WARP_WHEN_ATTACKED, 0x40000); - } - -#ifdef JAPAN - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ARENA_TRAP)) { -#else - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ARENA_TRAP, TRUE)) { -#endif - - f1 = FALSE; - if (mon2->magnet_rise == 1 - || HasTypeAffectedByGravity(attacker, TYPE_FLYING) - || LevitateIsActive(attacker)) { - if (!GravityIsActive()) { - f1 = TRUE; + if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS) && !v3 + && DungeonRandInt(100) < ov10_022C45B4) { + i = DungeonRandInt(300); + if (i < 100) { + ov29_0230F728(attacker, defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS, 0x40); + } else if (i < 200) { + ov29_0230F728(attacker, defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS, 0x10); + } else { + ov29_0230F728(attacker, defender, EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS, 0x80); } } - if (!f1 && DungeonRandInt(100) < ARENA_TRAP_ACTIVATION_CHANCE) { - mon2->contact_ability_trigger_bitflags |= 1; + + for (ptr1 = ov29_023535DC; *(u8 *)ptr1 != 0; ptr1++) { + if (ExclusiveItemEffectIsActive__0230A9B8(defender, (enum exclusive_item_effect_id)ptr1->field_0x0) + && ptr1->field_0x8(attacker, defender, v3)) { + ov29_0230F728(attacker, defender, (enum exclusive_item_effect_id)ptr1->field_0x0, ptr1->field_0x4); + } } - } -#ifdef JAPAN - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_SHADOW_TAG) -#else - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_SHADOW_TAG, TRUE) -#endif - && DungeonRandInt(100) < SHADOW_TAG_ACTIVATION_CHANCE) { - mon2->contact_ability_trigger_bitflags |= 2; - RAPID_SPIN_BINDING_REMOVAL = 0; - } - -#ifdef JAPAN - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MAGNET_PULL) -#else - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MAGNET_PULL, TRUE) -#endif - && MonsterIsType(attacker, TYPE_STEEL) - && DungeonRandInt(100) < MAGNET_PULL_ACTIVATION_CHANCE) { - mon2->contact_ability_trigger_bitflags |= 4; - } - -#ifdef JAPAN - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STATIC) -#else - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STATIC, TRUE) -#endif - && !v3 && DungeonRandInt(100) < ov10_022C4550) { - mon2->contact_ability_trigger_bitflags |= 8; - } - -#ifdef JAPAN - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_POISON_POINT) -#else - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_POISON_POINT, TRUE) -#endif - && DungeonRandInt(100) < ov10_022C45C0) { - mon2->contact_ability_trigger_bitflags |= 0x20; - } - -#ifdef JAPAN - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_EFFECT_SPORE) -#else - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_EFFECT_SPORE, TRUE) -#endif - && !v3 && DungeonRandInt(100) < ov10_022C45AC) { - i = DungeonRandInt(3); - if (i < 1) { - mon2->contact_ability_trigger_bitflags |= 0x40; - } else if (i < 2) { - mon2->contact_ability_trigger_bitflags |= 0x10; - } else { - mon2->contact_ability_trigger_bitflags |= 0x80; + if (ExclusiveItemEffectIsActive__0230A9B8(defender, EXCLUSIVE_EFF_MAY_WARP_WHEN_ATTACKED) + && DungeonRandInt(100) < ov10_022C45B0 && HasLowHealth(defender)) { + ov29_0230F728(attacker, defender, EXCLUSIVE_EFF_MAY_WARP_WHEN_ATTACKED, 0x40000); } - } #ifdef JAPAN - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_FLAME_BODY) + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ARENA_TRAP)) { #else - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_FLAME_BODY, TRUE) + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_ARENA_TRAP, TRUE)) { #endif - && DungeonRandInt(100) < ov10_022C467C) { - mon2->contact_ability_trigger_bitflags |= 0x100; - } + + f1 = FALSE; + if (mon2->magnet_rise == 1 + || HasTypeAffectedByGravity(attacker, TYPE_FLYING) + || LevitateIsActive(attacker)) { + if (!GravityIsActive()) { + f1 = TRUE; + } + } + if (!f1 && DungeonRandInt(100) < ARENA_TRAP_ACTIVATION_CHANCE) { + mon2->contact_ability_trigger_bitflags |= 1; + } + } #ifdef JAPAN - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_CUTE_CHARM) + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_SHADOW_TAG) #else - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_CUTE_CHARM, TRUE) + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_SHADOW_TAG, TRUE) #endif - && GendersNotEqualNotGenderless( - mon2->id, ((struct monster *)defender->info)->id) - && !v3 && DungeonRandInt(100) < CUTE_CHARM_INFATUATE_CHANCE) { - mon2->contact_ability_trigger_bitflags |= 0x200; - } + && DungeonRandInt(100) < SHADOW_TAG_ACTIVATION_CHANCE) { + mon2->contact_ability_trigger_bitflags |= 2; + RAPID_SPIN_BINDING_REMOVAL = 0; + } #ifdef JAPAN - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STENCH) + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MAGNET_PULL) #else - if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STENCH, TRUE) + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MAGNET_PULL, TRUE) #endif - && DungeonRandInt(100) < ov10_022C4638) { - mon2->contact_ability_trigger_bitflags |= 0x400; - } + && MonsterIsType(attacker, TYPE_STEEL) + && DungeonRandInt(100) < MAGNET_PULL_ACTIVATION_CHANCE) { + mon2->contact_ability_trigger_bitflags |= 4; + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STATIC) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STATIC, TRUE) +#endif + && !v3 && DungeonRandInt(100) < ov10_022C4550) { + mon2->contact_ability_trigger_bitflags |= 8; + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_POISON_POINT) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_POISON_POINT, TRUE) +#endif + && DungeonRandInt(100) < ov10_022C45C0) { + mon2->contact_ability_trigger_bitflags |= 0x20; + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_EFFECT_SPORE) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_EFFECT_SPORE, TRUE) +#endif + && !v3 && DungeonRandInt(100) < ov10_022C45AC) { + i = DungeonRandInt(3); + if (i < 1) { + mon2->contact_ability_trigger_bitflags |= 0x40; + } else if (i < 2) { + mon2->contact_ability_trigger_bitflags |= 0x10; + } else { + mon2->contact_ability_trigger_bitflags |= 0x80; + } + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_FLAME_BODY) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_FLAME_BODY, TRUE) +#endif + && DungeonRandInt(100) < ov10_022C467C) { + mon2->contact_ability_trigger_bitflags |= 0x100; + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_CUTE_CHARM) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_CUTE_CHARM, TRUE) +#endif + && GendersNotEqualNotGenderless( + mon2->id, ((struct monster *)defender->info)->id) + && !v3 && DungeonRandInt(100) < CUTE_CHARM_INFATUATE_CHANCE) { + mon2->contact_ability_trigger_bitflags |= 0x200; + } + +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STENCH) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_STENCH, TRUE) +#endif + && DungeonRandInt(100) < ov10_022C4638) { + mon2->contact_ability_trigger_bitflags |= 0x400; + } result = IsEitherMonsterInvalid(attacker, defender); } - } if (result) { result = TRUE; } else { @@ -516,8 +514,8 @@ int ApplyDamageAndEffects(struct entity *attacker, struct entity *defender, mon1->leech_seed_class_status.leech_seed = STATUS_LEECH_SEED_NONE; } else { ov29_022E45D0(ent1, defender); - ApplyDamageAndEffectsWrapper(ent1, damage_data->field_0x0, 0xC, - 0x238); + ApplyDamageAndEffectsWrapper(ent1, damage_data->field_0x0, + 0xC, DAMAGE_SOURCE_DESTINY_BOND); } } @@ -549,14 +547,12 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, struct unk_02308FE0 *damage_data, int a4, int a5, s16 damage_source, int a7) { - bool8 f1; + bool8 f1 = FALSE; struct unk_023528A4 *ptr1; - struct tile *tile; + struct tile *tile = NULL; struct team_member *member; - struct item *item1; - struct item *item2; bool8 f2; - bool8 f3; + bool8 f3 = FALSE; bool8 f4; bool8 f5; s32 v1; @@ -569,10 +565,8 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, s32 i; struct entity *ent1; s32 j; - struct item *item3; struct item *item4; s16 v6; - u16 v7; struct position pos; u8 buf[0x48]; #ifdef EUROPE @@ -580,9 +574,6 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, #endif damage_data->field_0x10 = FALSE; - f1 = FALSE; - tile = NULL; - f3 = FALSE; if (defender->type != 1 || IsSecretBazaarNpcBehavior( @@ -685,7 +676,7 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, TryIncreaseHp(attacker, defender, damage_data->field_0x0, 0, 0); damage_data->field_0x10 = TRUE; return FALSE; - } + } else #ifdef JAPAN if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_WATER_ABSORB) @@ -697,7 +688,7 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, TryIncreaseHp(attacker, defender, damage_data->field_0x0, 0, 0); damage_data->field_0x10 = TRUE; return FALSE; - } + } else #ifdef JAPAN if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_DRY_SKIN) @@ -709,7 +700,7 @@ bool8 ApplyDamage(struct entity *attacker, struct entity *defender, TryIncreaseHp(attacker, defender, damage_data->field_0x0, 0, 0); damage_data->field_0x10 = TRUE; return FALSE; - } + } else #ifdef JAPAN if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MOTOR_DRIVE) @@ -820,6 +811,8 @@ negation_checked: } mon1->bide_damage_tally = 0x3E7; } else { + u16 v7; + SetMessageLogPreprocessorArgsNumberVal(0, damage_data->field_0x0); if (damage_data->field_0x4 >= 0x1B) { @@ -855,10 +848,16 @@ negation_checked: || attacker->pos.y != defender->pos.y) && attacker->type == 1) { f4 = FALSE; - if (mon1->is_team_leader && GetDamageTurnOption() - && !ov29_022F9AF4(defender) - && CanSeeTarget(defender, attacker)) { - f4 = TRUE; + if (mon1->is_team_leader) { + if (GetDamageTurnOption() && !ov29_022F9AF4(defender)) { + if (CanSeeTarget(defender, attacker)) { + f4 = TRUE; + } else { + f4 = FALSE; + } + } + } else { + f4 = FALSE; } if (mon1->blinker_class_status.blinded == 2 || IsBlinded(defender, TRUE)) { @@ -888,8 +887,8 @@ negation_checked: } v2 = mon1->hp; - if (v2 > damage_data->field_0x0) { - mon1->hp = v2 - damage_data->field_0x0; + if (mon1->hp > damage_data->field_0x0) { + mon1->hp -= damage_data->field_0x0; } else { mon1->hp = 0; } @@ -1032,9 +1031,10 @@ negation_checked: } item4 = &mon1->held_item; - if (GetFlag(item4->flags, 1) && !GetFlag(item4->flags, 8) + if (GetFlag(item4->flags, 1)) + if (!GetFlag(item4->flags, 8) && !(mon1->held_item.flags & 2) - && item4->id == 0x153) { + && (u32)item4->id == 0x153) { ov29_022E550C(defender); defender->transparent = 0; v3 = mon1->max_hp_stat + mon1->max_hp_boost; @@ -1070,7 +1070,7 @@ negation_checked: if (mon1->is_team_leader && GetFlag(mon1->held_item.flags, 1) && !GetFlag(mon1->held_item.flags, 8) - && mon1->held_item.id == 0x159) { + && (u32)mon1->held_item.id == 0x159) { ent1 = NULL; for (i = 0; i < 4; i++) { ent1 = DUNGEON_PTR->monster_slot_ptrs[i]; @@ -1123,14 +1123,16 @@ negation_checked: } if (IqSkillIsEnabled(defender, IQ_ITEM_MASTER)) { - item1 = NULL; - item2 = NULL; + struct item *item1 = NULL; + struct item *item2 = NULL; + struct item *item3; + if (GetFlag(mon1->held_item.flags, 1) && !AbilityIsActiveVeneer(defender, ABILITY_KLUTZ) && !GetFlag(mon1->held_item.flags, 8)) { - if (mon1->held_item.id == 0x49) { + if ((u32)mon1->held_item.id == 0x49) { item1 = &mon1->held_item; - } else if (mon1->held_item.id == 0x69) { + } else if ((u32)mon1->held_item.id == 0x69) { item2 = &mon1->held_item; } } @@ -1138,15 +1140,21 @@ negation_checked: if (item1 == NULL && !mon1->is_not_team_member) { for (j = 0; j < 0x32; j++) { item3 = &BAG_ITEMS_PTR_MIRROR->bag_items->bag_items[j]; - if (GetFlag(item3->flags, 1) && !GetFlag(item3->flags, 8) - && item3->held_by == 0) { - if (item3->id == 0x49) { - item1 = item3; - break; - } - if (item2 == NULL && item3->id == 0x69) { - item2 = item3; - } + if (!GetFlag(item3->flags, 1)) { + continue; + } + if (GetFlag(item3->flags, 8)) { + continue; + } + if (item3->held_by != 0) { + continue; + } + if ((u32)item3->id == 0x49) { + item1 = item3; + break; + } + if (item2 == NULL && (u32)item3->id == 0x69) { + item2 = item3; } } } @@ -1287,9 +1295,10 @@ negation_checked: v4 = ov10_022C593C[mon1->field_0x168].field_0x0; } else { if (mon1->exp_yield == 0) { - v4 = v4 / 2; + v4 /= 2; } else if (mon1->exp_yield == 2) { - v4 = (v4 * 3) / 2; + v4 *= 3; + v4 /= 2; } if (v4 == 0) { v4 = 1; diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c index aeb44f7e..64439fc4 100644 --- a/src/overlay_29_0230BBAC.c +++ b/src/overlay_29_0230BBAC.c @@ -127,7 +127,6 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a s32 v5; s32 v6; s32 v7; - s32 v8; s32 v9; struct monster *mon3; struct monster *mon4; @@ -144,7 +143,6 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a s32 v19; s32 v20; volatile s32 *p1; - volatile s32 *p2; volatile s32 *p3; struct damage_calc_diag *diag; @@ -457,7 +455,6 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a } p1 = &arr[0]; - p2 = &arr[0]; FixedPoint32To64(&fp4, MultiplyByFixedPoint(MultiplyByFixedPoint(power << 8, OFFENSIVE_STAT_STAGE_MULTIPLIERS[v1]), @@ -476,7 +473,7 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a f1 = MonsterHasNegativeStatus(attacker, TRUE); f4 = UpdateStateFlags(mon3, 1, f1); if (f1) { - v14 <<= 1; + v14 *= 2; } if (f4) { PlayEffectAnimation0x1A9__022E6130(attacker); @@ -490,8 +487,8 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a f2 = (v2 < 0x21 && v5 == 0); f4 = UpdateStateFlags(mon3, 0x100, f2); if (f2) { - v14 += v14 * 2; - v15 <<= 1; + v14 *= 3; + v15 *= 2; } if (f4) { PlayEffectAnimation0x1A9__022E617C(attacker); @@ -500,19 +497,19 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a } if (AbilityIsActiveVeneer(attacker, ABILITY_HUSTLE) && v5 == 0) { - v14 += v14 * 2; - v15 <<= 1; + v14 *= 3; + v15 *= 2; } v12 = !((struct monster *)attacker->info)->is_not_team_member; if (AbilityIsActiveVeneer(attacker, ABILITY_PLUS) && v5 == 1 && DUNGEON_PTR->minus_is_active[v12]) { - v14 = v14 * 16 - v14; + v14 *= 15; v15 *= 10; } if (AbilityIsActiveVeneer(attacker, ABILITY_MINUS) && v5 == 1 && DUNGEON_PTR->plus_is_active[v12]) { - v14 = v14 * 16 - v14; + v14 *= 15; v15 *= 10; } @@ -523,8 +520,8 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_INTIMIDATE, TRUE) && v5 == 0) { #endif - v14 <<= 2; - v15 += v15 * 4; + v14 *= 4; + v15 *= 5; } #ifdef JAPAN if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_MARVEL_SCALE) @@ -537,8 +534,8 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a f3 = MonsterHasNegativeStatus(defender, TRUE); f4 = UpdateStateFlags(mon4, 8, f3); if (f3) { - v7 = v7 * 3; - v6 <<= 1; + v7 *= 3; + v6 *= 2; } if (f4) { PlayEffectAnimation0x18E(defender); @@ -548,11 +545,10 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a p3 = &arr[1]; v9 = *p1 * v14; - v8 = *p3; - *p3 = v8 * v7; - *p2 = v9; + *p3 = *p3 * v7; + *p1 = v9; if (v15 != 1) { - *p2 = v9 / v15; + *p1 = v9 / v15; } if (v6 != 1) { p3 = &arr[1]; diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index 0515cce5..d0d38c5d 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -109,6 +109,12 @@ void ActivateEndOfTurnEffects(struct entity *entity) s32 v1; s32 v2; s32 v3; + s32 v4; + s32 v5; + s32 v6; + s32 v7; + s32 v8; + s32 v9; struct fixed_point_64 f2; struct fixed_point_64 f1; struct fixed_point f3; @@ -116,6 +122,7 @@ void ActivateEndOfTurnEffects(struct entity *entity) s16 i; struct monster *monster; bool8 b1; + bool8 b2; struct monster *mon1; struct move mv; @@ -199,7 +206,7 @@ void ActivateEndOfTurnEffects(struct entity *entity) v3 = 0; } TryEndPetrifiedOrSleepStatus(entity, entity); - ApplyDamageAndEffectsWrapper(entity, 1, 0xE, 0x250); + ApplyDamageAndEffectsWrapper(entity, 1, 0xE, DAMAGE_SOURCE_HUNGER); monster->famished = TRUE; if (CeilFixedPoint(monster->belly) != 0) v2 = 0; @@ -215,7 +222,9 @@ void ActivateEndOfTurnEffects(struct entity *entity) if (v3 != 0 && !DUNGEON_PTR->end_floor_no_death_check_flag && EntityIsValid__02311010(entity)) #endif + { PlaySeByIdIfNotSilence(0x1303); + } LogMessageByIdWithPopupCheckUser(entity, v2); ov29_022EA370(0x1E, 0x32); } @@ -265,9 +274,9 @@ void ActivateEndOfTurnEffects(struct entity *entity) if (IsFloorOver()) return; } - v1 = DungeonRandInt(100); + v4 = DungeonRandInt(100); if (AbilityIsActiveVeneer(entity, ABILITY_SHED_SKIN) && - v1 < SHED_SKIN_ACTIVATION_CHANCE && + v4 < SHED_SKIN_ACTIVATION_CHANCE && MonsterHasNegativeStatus(entity, FALSE)) { DisplayActions(0); if (!EntityIsValid__02311010(entity)) @@ -288,72 +297,72 @@ void ActivateEndOfTurnEffects(struct entity *entity) EndNegativeStatusCondition(entity, entity, TRUE, FALSE, FALSE); } - if (AbilityIsActiveVeneer(entity, ABILITY_SPEED_BOOST)) { - monster->field_0x11f++; - if (monster->field_0x11f >= SPEED_BOOST_TURNS) { - monster->field_0x11f = 0; - BoostSpeedOneStage(entity, entity, 0x7f, FALSE); - } + if (AbilityIsActiveVeneer(entity, ABILITY_SPEED_BOOST)) { + monster->field_0x11f++; + if (monster->field_0x11f >= SPEED_BOOST_TURNS) { + monster->field_0x11f = 0; + BoostSpeedOneStage(entity, entity, 0x7f, FALSE); } + } - if (monster->sleep_class_status.sleep == STATUS_SLEEP_YAWNING) { + if (monster->sleep_class_status.sleep == STATUS_SLEEP_YAWNING) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + ov29_022E53F0(entity); + } + + if (monster->burn_class_status.burn == STATUS_BURN_BURN) { + if (monster->burn_class_status.burn_damage_countdown != 0) + monster->burn_class_status.burn_damage_countdown--; + if (monster->burn_class_status.burn_damage_countdown == 0) { DisplayActions(0); if (!EntityIsValid__02311010(entity)) return; if (IsFloorOver()) return; - ov29_022E53F0(entity); + monster->burn_class_status.burn_damage_countdown = BURN_DAMAGE_COOLDOWN; + TryEndPetrifiedOrSleepStatus(entity, entity); + ApplyDamageAndEffectsWrapper(entity, BURN_DAMAGE, 1, DAMAGE_SOURCE_BURN); } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } - if (monster->burn_class_status.burn == STATUS_BURN_BURN) { - if (monster->burn_class_status.burn_damage_countdown != 0) - monster->burn_class_status.burn_damage_countdown--; - if (monster->burn_class_status.burn_damage_countdown == 0) { - DisplayActions(0); - if (!EntityIsValid__02311010(entity)) - return; - if (IsFloorOver()) - return; - monster->burn_class_status.burn_damage_countdown = BURN_DAMAGE_COOLDOWN; - TryEndPetrifiedOrSleepStatus(entity, entity); - ApplyDamageAndEffectsWrapper(entity, BURN_DAMAGE, 1, 0x247); - } - if (!EntityIsValid__02311010(entity)) - return; - if (IsFloorOver()) - return; + if (GravityIsActive()) { + if (IsFloating(entity)) { + EndMagnetRiseStatus(entity, entity); + EnsureCanStandCurrentTile(entity); } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } - if (GravityIsActive()) { - if (IsFloating(entity)) { - EndMagnetRiseStatus(entity, entity); - EnsureCanStandCurrentTile(entity); - } - if (!EntityIsValid__02311010(entity)) - return; - if (IsFloorOver()) - return; - } + if (AbilityIsActiveVeneer(entity, ABILITY_BAD_DREAMS)) { + TryActivateBadDreams(entity); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } - if (AbilityIsActiveVeneer(entity, ABILITY_BAD_DREAMS)) { - TryActivateBadDreams(entity); - if (!EntityIsValid__02311010(entity)) - return; - if (IsFloorOver()) - return; - } - - if (!IsTileGround(GetTileAtEntity(entity))) { - v1 = monster->max_hp_stat + monster->max_hp_boost; - if (v1 > 999) - v1 = 999; - if (monster->hp < v1 && - ExclusiveItemEffectIsActive__02311064(entity, EXCLUSIVE_EFF_RECOVER_HP_FROM_WATERY_TERRAIN)) { - TryIncreaseHp(entity, entity, ov10_022C4664, 0, FALSE); - } - if (ExclusiveItemEffectIsActive__02311064(entity, EXCLUSIVE_EFF_HEAL_STATUS_FROM_WATERY_TERRAIN)) - EndNegativeStatusConditionWrapper(entity, entity, TRUE, TRUE); + if (!IsTileGround(GetTileAtEntity(entity))) { + v5 = monster->max_hp_stat + monster->max_hp_boost; + if (v5 > MAX_HP_LIMIT) + v5 = MAX_HP_LIMIT; + if (monster->hp < v5 && + ExclusiveItemEffectIsActive__02311064(entity, EXCLUSIVE_EFF_RECOVER_HP_FROM_WATERY_TERRAIN)) { + TryIncreaseHp(entity, entity, ov10_022C4664, 0, FALSE); } + if (ExclusiveItemEffectIsActive__02311064(entity, EXCLUSIVE_EFF_HEAL_STATUS_FROM_WATERY_TERRAIN)) + EndNegativeStatusConditionWrapper(entity, entity, TRUE, TRUE); + } if (ExclusiveItemEffectIsActive__02311064(entity, EXCLUSIVE_EFF_ABSORB_TEAMMATE_POISON)) { b1 = FALSE; @@ -404,17 +413,17 @@ void ActivateEndOfTurnEffects(struct entity *entity) monster->burn_class_status.burn_damage_countdown--; if (monster->burn_class_status.burn_damage_countdown == 0) { - v1 = monster->burn_class_status.badly_poisoned_damage_count; + v6 = monster->burn_class_status.badly_poisoned_damage_count; if (monster->burn_class_status.badly_poisoned_damage_count < 0x1d) monster->burn_class_status.badly_poisoned_damage_count++; monster->burn_class_status.burn_damage_countdown = BAD_POISON_DAMAGE_COOLDOWN; - if (v1 >= 0x1d) - v1 = 0x1d; - if (v1 < 0) - v1 = 0; + if (v6 >= 0x1d) + v6 = 0x1d; + if (v6 < 0) + v6 = 0; DisplayActions(0); @@ -426,9 +435,9 @@ void ActivateEndOfTurnEffects(struct entity *entity) TryEndPetrifiedOrSleepStatus(entity, entity); if (AbilityIsActiveVeneer(entity, ABILITY_POISON_HEAL)) - TryIncreaseHp(entity, entity, BAD_POISON_DAMAGE_TABLE[v1], 0, TRUE); + TryIncreaseHp(entity, entity, BAD_POISON_DAMAGE_TABLE[v6], 0, TRUE); else - ApplyDamageAndEffectsWrapper(entity, BAD_POISON_DAMAGE_TABLE[v1], 3, + ApplyDamageAndEffectsWrapper(entity, BAD_POISON_DAMAGE_TABLE[v6], 3, DAMAGE_SOURCE_POISON); } @@ -450,7 +459,7 @@ void ActivateEndOfTurnEffects(struct entity *entity) monster->frozen_class_status.freeze_damage_countdown = ov10_022C4454; TryEndPetrifiedOrSleepStatus(entity, entity); PlayEffectAnimationEntityStandard(entity, monster->frozen_class_status.constriction_animation); - ApplyDamageAndEffectsWrapper(entity, CONSTRICTION_DAMAGE, 2, 0x248); + ApplyDamageAndEffectsWrapper(entity, CONSTRICTION_DAMAGE, 2, DAMAGE_SOURCE_CONSTRICTION); } if (!EntityIsValid__02311010(entity)) return; @@ -467,7 +476,7 @@ void ActivateEndOfTurnEffects(struct entity *entity) return; monster->frozen_class_status.freeze_damage_countdown = WRAP_DAMAGE_COOLDOWN; TryEndPetrifiedOrSleepStatus(entity, entity); - ApplyDamageAndEffectsWrapper(entity, WRAP_DAMAGE, 5, 0x24A); + ApplyDamageAndEffectsWrapper(entity, WRAP_DAMAGE, 5, DAMAGE_SOURCE_WRAP); } if (!EntityIsValid__02311010(entity)) return; @@ -487,19 +496,17 @@ void ActivateEndOfTurnEffects(struct entity *entity) } } - if (monster->curse_class_status.curse == STATUS_CURSE_CURSED) - { + if (monster->curse_class_status.curse == STATUS_CURSE_CURSED) { if (monster->curse_class_status.curse_damage_countdown != 0) monster->curse_class_status.curse_damage_countdown--; - if (monster->curse_class_status.curse_damage_countdown == 0) - { - v1 = monster->max_hp_stat + monster->max_hp_boost; - if (v1 > 999) - v1 = 999; - v2 = v1 / 4; - if (v2 == 0) - v2++; + if (monster->curse_class_status.curse_damage_countdown == 0) { + v7 = monster->max_hp_stat + monster->max_hp_boost; + if (v7 > MAX_HP_LIMIT) + v7 = MAX_HP_LIMIT; + v8 = v7 / 4; + if (v8 == 0) + v8++; monster->curse_class_status.curse_damage_countdown = CURSE_DAMAGE_COOLDOWN; DisplayActions(0); @@ -509,7 +516,7 @@ void ActivateEndOfTurnEffects(struct entity *entity) return; TryEndPetrifiedOrSleepStatus(entity, entity); - ApplyDamageAndEffectsWrapper(entity, v2, 7, 0x24B); + ApplyDamageAndEffectsWrapper(entity, v8, 7, DAMAGE_SOURCE_CURSE); } if (!EntityIsValid__02311010(entity)) @@ -518,34 +525,26 @@ void ActivateEndOfTurnEffects(struct entity *entity) return; } - if (monster->leech_seed_class_status.leech_seed == STATUS_LEECH_SEED_LEECH_SEED) - { + if (monster->leech_seed_class_status.leech_seed == STATUS_LEECH_SEED_LEECH_SEED) { if (monster->leech_seed_class_status.leech_seed_damage_countdown != 0) monster->leech_seed_class_status.leech_seed_damage_countdown--; - if (monster->leech_seed_class_status.leech_seed_damage_countdown == 0) - { + if (monster->leech_seed_class_status.leech_seed_damage_countdown == 0) { e1 = DUNGEON_PTR->active_monster_ptrs[monster->leech_seed_class_status.leech_seed_source_monster_index]; - v2 = LEECH_SEED_DAMAGE_COOLDOWN; - v3 = LEECH_SEED_HP_DRAIN; + v9 = LEECH_SEED_HP_DRAIN; - monster->leech_seed_class_status.leech_seed_damage_countdown = v2; - if (e1 == NULL) - { + monster->leech_seed_class_status.leech_seed_damage_countdown = LEECH_SEED_DAMAGE_COOLDOWN; + if (e1 == NULL) { monster->leech_seed_class_status.leech_seed = STATUS_LEECH_SEED_NONE; - } - else if (monster->leech_seed_class_status.statuses_applier_id != GetEntInfo(e1)->unique_id) - { + } else if (monster->leech_seed_class_status.statuses_applier_id != GetEntInfo(e1)->unique_id) { monster->leech_seed_class_status.leech_seed = STATUS_LEECH_SEED_NONE; - } - else - { + } else { if (e1 != entity && (e1 == NULL ? FALSE : (bool8)(GetEntityType(e1) == ENTITY_MONSTER)) && AbilityIsActiveVeneer(e1, ABILITY_MOLD_BREAKER)) - b1 = FALSE; + b2 = FALSE; else - b1 = AbilityIsActiveVeneer(entity, ABILITY_LIQUID_OOZE); + b2 = AbilityIsActiveVeneer(entity, ABILITY_LIQUID_OOZE); ov29_022EC62C(entity); DisplayActions(0); @@ -556,18 +555,14 @@ void ActivateEndOfTurnEffects(struct entity *entity) if (IsFloorOver()) return; - if (monster->frozen_class_status.freeze != STATUS_FROZEN_FROZEN) - { + if (monster->frozen_class_status.freeze != STATUS_FROZEN_FROZEN) { TryEndPetrifiedOrSleepStatus(entity, entity); - ApplyDamageAndEffectsWrapper(entity, v3, 9, 0x24C); - if (b1) - { + ApplyDamageAndEffectsWrapper(entity, v9, 9, DAMAGE_SOURCE_LEECH_SEED); + if (b2) { TryEndPetrifiedOrSleepStatus(e1, e1); - ApplyDamageAndEffectsWrapper(e1, v3, 0xD, 0x239); - } - else if (!AbilityIsActiveVeneer(entity, ABILITY_MAGIC_GUARD)) - { - TryIncreaseHp(e1, e1, v3, 0, TRUE); + ApplyDamageAndEffectsWrapper(e1, v9, 0xD, DAMAGE_SOURCE_SLUDGE); + } else if (!AbilityIsActiveVeneer(entity, ABILITY_MAGIC_GUARD)) { + TryIncreaseHp(e1, e1, v9, 0, TRUE); } } } @@ -593,7 +588,7 @@ void ActivateEndOfTurnEffects(struct entity *entity) if (monster->reflect_class_status.reflect == STATUS_REFLECT_PROTECT) { LogMessageByIdWithPopupCheckUser(entity, MESSAGE_DEC); } else { - ApplyDamageAndEffectsWrapper(entity, 9999, 0xB, 0x24D); + ApplyDamageAndEffectsWrapper(entity, 9999, 0xB, DAMAGE_SOURCE_PERISH_SONG); } if (!EntityIsValid__02311010(entity)) return; diff --git a/src/overlay_29_0233C9E8.c b/src/overlay_29_0233C9E8.c index 90774eb7..be101bbc 100644 --- a/src/overlay_29_0233C9E8.c +++ b/src/overlay_29_0233C9E8.c @@ -1,7 +1,9 @@ #include "overlay_29_0233C9E8.h" #include "dg_random.h" +#include "dungeon.h" #include "dungeon_map_access.h" #include "dungeon_util.h" +#include "dungeon_util_static.h" void GenerateExtraHallways(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, s32 grid_size_y, s32 n_extra_hallways) { @@ -10,7 +12,6 @@ void GenerateExtraHallways(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, s32 s32 dir; s32 k; s32 oob; - s32 d; if (n_extra_hallways == 0) { return; @@ -28,10 +29,8 @@ void GenerateExtraHallways(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, s32 x = DungeonRandInt(grid_size_x); y = DungeonRandInt(grid_size_y); cell = &grid[x][y]; - if (cell->field_0xa == 0 || cell->field_0xb == 0) { - continue; - } - if (cell->field_0x8 != 0 || cell->field_0x10 != 0) { + if (cell->field_0xa == 0 || cell->field_0xb == 0 + || cell->field_0x8 != 0 || cell->field_0x10 != 0) { continue; } tx = DungeonRandRange(cell->field_0x0, cell->field_0x4); @@ -60,19 +59,19 @@ void GenerateExtraHallways(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, s32 ty += DIRECTIONS_XY[dir].y; } for (;;) { - if ((GetTile(tx, ty)->terrain_flags & 3) != 1) { + if (GetTerrainType(GetTile(tx, ty)) != TERRAIN_TYPE_NORMAL) { break; } tx += DIRECTIONS_XY[dir].x; ty += DIRECTIONS_XY[dir].y; } - if ((GetTile(tx, ty)->terrain_flags & 3) == 2) { + if (GetTerrainType(GetTile(tx, ty)) == TERRAIN_TYPE_SECONDARY) { continue; } oob = 0; for (bx = tx - 2; bx <= tx + 2; bx++) { for (by = ty - 2; by <= ty + 2; by++) { - if (bx < 0 || bx >= 56 || by < 0 || by >= 32) { + if (bx < 0 || bx >= DUNGEON_MAX_SIZE_X || by < 0 || by >= DUNGEON_MAX_SIZE_Y) { oob = 1; break; } @@ -84,72 +83,66 @@ void GenerateExtraHallways(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, s32 if (oob) { continue; } - d = (dir + 2) & 6; - if ((GetTile(tx + DIRECTIONS_XY[d].x, ty + DIRECTIONS_XY[d].y)->terrain_flags & 3) == 1) { + if (GetTerrainType(GetTile(tx + DIRECTIONS_XY[(dir + 2) & 6].x, ty + DIRECTIONS_XY[(dir + 2) & 6].y)) == TERRAIN_TYPE_NORMAL) { continue; } - d = (dir - 2) & 6; - if ((GetTile(tx + DIRECTIONS_XY[d].x, ty + DIRECTIONS_XY[d].y)->terrain_flags & 3) == 1) { + if (GetTerrainType(GetTile(tx + DIRECTIONS_XY[(dir - 2) & 6].x, ty + DIRECTIONS_XY[(dir - 2) & 6].y)) == TERRAIN_TYPE_NORMAL) { continue; } seg = DungeonRandInt(3) + 3; for (;;) { - int flag; + s32 flag; if (tx <= 1 || ty <= 1) { break; } - if (tx >= 0x37 || ty >= 0x1f) { + if (tx >= DUNGEON_MAX_SIZE_X - 1 || ty >= DUNGEON_MAX_SIZE_Y - 1) { break; } - if ((GetTile(tx, ty)->terrain_flags & 3) == 1) { + if (GetTerrainType(GetTile(tx, ty)) == TERRAIN_TYPE_NORMAL) { break; } - if (GetTile(tx, ty)->terrain_flags & 0x10) { + if (GetTile(tx, ty)->terrain_flags & TERRAIN_TYPE_IMPASSABLE_WALL) { break; } flag = 1; - if ((GetTile(tx + 1, ty)->terrain_flags & 3) == 1 - && (GetTile(tx + 1, ty + 1)->terrain_flags & 3) == 1 - && (GetTile(tx, ty + 1)->terrain_flags & 3) == 1) { + if (GetTerrainType(GetTile(tx + 1, ty)) == TERRAIN_TYPE_NORMAL + && GetTerrainType(GetTile(tx + 1, ty + 1)) == TERRAIN_TYPE_NORMAL + && GetTerrainType(GetTile(tx, ty + 1)) == TERRAIN_TYPE_NORMAL) { flag = 0; } - if ((GetTile(tx + 1, ty)->terrain_flags & 3) == 1) { + if (GetTerrainType(GetTile(tx + 1, ty)) == TERRAIN_TYPE_NORMAL) { s32 ym = ty - 1; - if ((GetTile(tx + 1, ym)->terrain_flags & 3) == 1 - && (GetTile(tx, ym)->terrain_flags & 3) == 1) { + if (GetTerrainType(GetTile(tx + 1, ym)) == TERRAIN_TYPE_NORMAL + && GetTerrainType(GetTile(tx, ym)) == TERRAIN_TYPE_NORMAL) { flag = 0; } } - { s32 xm = tx - 1; - if ((GetTile(xm, ty)->terrain_flags & 3) == 1 - && (GetTile(xm, ty + 1)->terrain_flags & 3) == 1 - && (GetTile(tx, ty + 1)->terrain_flags & 3) == 1) { + if (GetTerrainType(GetTile(xm, ty)) == TERRAIN_TYPE_NORMAL + && GetTerrainType(GetTile(xm, ty + 1)) == TERRAIN_TYPE_NORMAL + && GetTerrainType(GetTile(tx, ty + 1)) == TERRAIN_TYPE_NORMAL) { flag = 0; } - if ((GetTile(xm, ty)->terrain_flags & 3) == 1) { + if (GetTerrainType(GetTile(xm, ty)) == TERRAIN_TYPE_NORMAL) { s32 ym = ty - 1; - if ((GetTile(xm, ym)->terrain_flags & 3) == 1 - && (GetTile(tx, ym)->terrain_flags & 3) == 1) { + if (GetTerrainType(GetTile(xm, ym)) == TERRAIN_TYPE_NORMAL + && GetTerrainType(GetTile(tx, ym)) == TERRAIN_TYPE_NORMAL) { flag = 0; } } - } if (flag) { struct tile *t = GetTileSafe(tx, ty); - t->terrain_flags &= ~3; - t->terrain_flags |= 1; + t->terrain_flags &= ~(TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + t->terrain_flags |= TERRAIN_TYPE_NORMAL; } - d = (dir + 2) & 6; - if ((GetTile(tx + DIRECTIONS_XY[d].x, ty + DIRECTIONS_XY[d].y)->terrain_flags & 3) == 1) { + if (GetTerrainType(GetTile(tx + DIRECTIONS_XY[(dir + 2) & 6].x, ty + DIRECTIONS_XY[(dir + 2) & 6].y)) == TERRAIN_TYPE_NORMAL) { break; } - d = (dir - 2) & 6; - if ((GetTile(tx + DIRECTIONS_XY[d].x, ty + DIRECTIONS_XY[d].y)->terrain_flags & 3) == 1) { + if (GetTerrainType(GetTile(tx + DIRECTIONS_XY[(dir - 2) & 6].x, ty + DIRECTIONS_XY[(dir - 2) & 6].y)) == TERRAIN_TYPE_NORMAL) { break; } if (--seg == 0) { diff --git a/src/overlay_29_0233E43C.c b/src/overlay_29_0233E43C.c index c425d041..87b0c2e4 100644 --- a/src/overlay_29_0233E43C.c +++ b/src/overlay_29_0233E43C.c @@ -7,6 +7,7 @@ void CreateGridCellConnections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, { s32 i; s32 j; + int jj; for (i = 0; i < grid_size_x; i++) { for (j = 0; j < grid_size_y; j++) { @@ -16,51 +17,51 @@ void CreateGridCellConnections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, grid[i][j].field_0x11[7] = 0; grid[i][j].field_0x11[8] = 0; grid[i][j].field_0x11[9] = 0; - continue; + } else { + if (i <= 0) { + grid[i][j].field_0x11[4] = 0; + } + if (j <= 0) { + grid[i][j].field_0x11[2] = 0; + } + if (i >= grid_size_x - 1) { + grid[i][j].field_0x11[5] = 0; + } + if (j >= grid_size_y - 1) { + grid[i][j].field_0x11[3] = 0; + } + grid[i][j].field_0x11[6] = grid[i][j].field_0x11[2]; + grid[i][j].field_0x11[7] = grid[i][j].field_0x11[3]; + grid[i][j].field_0x11[8] = grid[i][j].field_0x11[4]; + grid[i][j].field_0x11[9] = grid[i][j].field_0x11[5]; } - if (i <= 0) { - grid[i][j].field_0x11[4] = 0; - } - if (j <= 0) { - grid[i][j].field_0x11[2] = 0; - } - if (i >= grid_size_x - 1) { - grid[i][j].field_0x11[5] = 0; - } - if (j >= grid_size_y - 1) { - grid[i][j].field_0x11[3] = 0; - } - grid[i][j].field_0x11[6] = grid[i][j].field_0x11[2]; - grid[i][j].field_0x11[7] = grid[i][j].field_0x11[3]; - grid[i][j].field_0x11[8] = grid[i][j].field_0x11[4]; - grid[i][j].field_0x11[9] = grid[i][j].field_0x11[5]; } } for (i = 0; i < grid_size_x; i++) { for (j = 0; j < grid_size_y; j++) { - s32 v0; - s32 v1; + s32 v0, v1, t0, t1; + + jj = j; if (grid[i][j].field_0x8 != 0) { continue; } - if (grid[i][j].field_0xa == 0) { - v0 = grid[i][j].field_0x0; - v1 = grid[i][j].field_0x2; - } else { + if (grid[i][j].field_0xa != 0) { v0 = DungeonRandRange(grid[i][j].field_0x0 + 1, grid[i][j].field_0x4 - 1); v1 = DungeonRandRange(grid[i][j].field_0x2 + 1, grid[i][j].field_0x6 - 1); + } else { + v0 = grid[i][j].field_0x0; + v1 = grid[i][j].field_0x2; } if (grid[i][j].field_0x11[6] != 0) { if (grid[i][j - 1].field_0x8 == 0) { - s32 t; - if (grid[i][j - 1].field_0xa == 0) { - t = grid[i][j - 1].field_0x0; + if (grid[i][j - 1].field_0xa != 0) { + t0 = DungeonRandRange(grid[i][j - 1].field_0x0 + 1, grid[i][j - 1].field_0x4 - 1); } else { - t = DungeonRandRange(grid[i][j - 1].field_0x0 + 1, grid[i][j - 1].field_0x4 - 1); + t0 = grid[i][j - 1].field_0x0; } - CreateHallway(v0, grid[i][(u32)j].field_0x2, t, grid[i][(u32)j - 1].field_0x6 - 1, TRUE, + CreateHallway(v0, grid[i][jj].field_0x2, t0, grid[i][jj - 1].field_0x6 - 1, TRUE, arg4[i], arg5[j]); } grid[i][j].field_0x11[6] = 0; @@ -71,13 +72,12 @@ void CreateGridCellConnections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, if (grid[i][j].field_0x11[7] != 0) { if (grid[i][j + 1].field_0x8 == 0) { - s32 t; - if (grid[i][j + 1].field_0xa == 0) { - t = grid[i][j + 1].field_0x0; + if (grid[i][j + 1].field_0xa != 0) { + t0 = DungeonRandRange(grid[i][j + 1].field_0x0 + 1, grid[i][j + 1].field_0x4 - 1); } else { - t = DungeonRandRange(grid[i][j + 1].field_0x0 + 1, grid[i][j + 1].field_0x4 - 1); + t0 = grid[i][j + 1].field_0x0; } - CreateHallway(v0, grid[i][(u32)j].field_0x6 - 1, t, grid[i][(u32)j + 1].field_0x2, TRUE, + CreateHallway(v0, grid[i][jj].field_0x6 - 1, t0, grid[i][jj + 1].field_0x2, TRUE, arg4[i], arg5[j + 1] - 1); } grid[i][j].field_0x11[7] = 0; @@ -88,13 +88,12 @@ void CreateGridCellConnections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, if (grid[i][j].field_0x11[8] != 0) { if (grid[i - 1][j].field_0x8 == 0) { - s32 t; - if (grid[i - 1][j].field_0xa == 0) { - t = grid[i - 1][j].field_0x2; + if (grid[i - 1][j].field_0xa != 0) { + t1 = DungeonRandRange(grid[i - 1][j].field_0x2 + 1, grid[i - 1][j].field_0x6 - 1); } else { - t = DungeonRandRange(grid[i - 1][j].field_0x2 + 1, grid[i - 1][j].field_0x6 - 1); + t1 = grid[i - 1][j].field_0x2; } - CreateHallway(grid[i][(u32)j].field_0x0, v1, grid[i - 1][(u32)j].field_0x0 - 1, t, FALSE, + CreateHallway(grid[i][jj].field_0x0, v1, grid[i - 1][jj].field_0x0 - 1, t1, FALSE, arg4[i], arg5[j]); } grid[i][j].field_0x11[8] = 0; @@ -105,13 +104,12 @@ void CreateGridCellConnections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, if (grid[i][j].field_0x11[9] != 0) { if (grid[i + 1][j].field_0x8 == 0) { - s32 t; - if (grid[i + 1][j].field_0xa == 0) { - t = grid[i + 1][j].field_0x2; + if (grid[i + 1][j].field_0xa != 0) { + t1 = DungeonRandRange(grid[i + 1][j].field_0x2 + 1, grid[i + 1][j].field_0x6 - 1); } else { - t = DungeonRandRange(grid[i + 1][j].field_0x2 + 1, grid[i + 1][j].field_0x6 - 1); + t1 = grid[i + 1][j].field_0x2; } - CreateHallway(grid[i][(u32)j].field_0x4 - 1, v1, grid[i + 1][(u32)j].field_0x0, t, FALSE, + CreateHallway(grid[i][jj].field_0x4 - 1, v1, grid[i + 1][jj].field_0x0, t1, FALSE, arg4[i + 1] - 1, arg5[j]); } grid[i][j].field_0x11[9] = 0; @@ -126,198 +124,158 @@ void CreateGridCellConnections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, } for (i = 0; i < grid_size_x; i++) { for (j = 0; j < grid_size_y; j++) { - struct unk_0233C9E8 *cell; + s32 chance = DungeonRandInt(100); - if (DungeonRandInt(100) >= 5) { - continue; - } - cell = &grid[i][j]; - if (cell->field_0x8 != 0) { - continue; - } - if (cell->field_0xb == 0) { - continue; - } - if (cell->field_0x11[1] != 0 || cell->field_0x9 != 0) { - continue; - } - if (cell->field_0xa == 0) { - continue; - } + if (chance < 5 && + grid[i][j].field_0x8 == 0 && + grid[i][j].field_0xb != 0 && + grid[i][j].field_0x11[1] == 0 && + grid[i][j].field_0x9 == 0 && + grid[i][j].field_0xa != 0) + { switch (DungeonRandInt(4)) { case 0: { - s32 x0, y0, y1; - int x1; - s32 y, x; - s32 room; - if (i < 1) { - break; - } - if (cell[-15].field_0xb == 0) { - break; - } - if (cell[-15].field_0x8 != 0) { - break; - } - if (cell[-15].field_0xa == 0) { - break; - } - if (cell[-15].field_0x9 != 0 || cell[-15].field_0x11[1] != 0) { - break; - } - x0 = cell[-15].field_0x0; - y0 = cell[-15].field_0x2 < cell->field_0x2 ? cell[-15].field_0x2 : cell->field_0x2; - x1 = cell->field_0x4; - y1 = cell[-15].field_0x6 > cell->field_0x6 ? cell[-15].field_0x6 : cell->field_0x6; - room = GetTile(cell->field_0x0, cell->field_0x2)->room; - for (x = x0; x < x1; x++) { - for (y = y0; y < y1; y++) { - struct tile *t = GetTileSafe(x, y); - t->terrain_flags &= ~3; - t->terrain_flags |= 1; - t->room = room; + if (i >= 1 && + grid[i - 1][j].field_0xb && + !grid[i - 1][j].field_0x8 && + grid[i - 1][j].field_0xa && + !grid[i - 1][j].field_0x9 && + !grid[i - 1][j].field_0x11[1]) { + s32 y, x; + + s32 x0 = grid[i - 1][j].field_0x0; + s32 y0 = grid[i - 1][j].field_0x2 < grid[i][j].field_0x2 ? grid[i - 1][j].field_0x2 : grid[i][j].field_0x2; + s32 x1 = grid[i][j].field_0x4; + s32 y1 = grid[i - 1][j].field_0x6 > grid[i][j].field_0x6 ? grid[i - 1][j].field_0x6 : grid[i][j].field_0x6; + s32 room = GetTile(grid[i][j].field_0x0, grid[i][j].field_0x2)->room; + for (x = x0; x < x1; x++) { + for (y = y0; y < y1; y++) { + struct tile *t = GetTileSafe(x, y); + + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + t->room = room; + } } + grid[i - 1][j].field_0x0 = x0; + grid[i - 1][j].field_0x4 = x1; + grid[i - 1][j].field_0x2 = y0; + grid[i - 1][j].field_0x6 = y1; + grid[i][j].field_0x11[1] = 1; + grid[i - 1][j].field_0x11[1] = 1; + grid[i][j].field_0xb = 0; + grid[i][j].field_0x11[0] = 1; } - cell[-15].field_0x0 = x0; - cell[-15].field_0x4 = x1; - cell[-15].field_0x2 = y0; - cell[-15].field_0x6 = y1; - cell->field_0x11[1] = 1; - cell[-15].field_0x11[1] = 1; - cell->field_0xb = 0; - cell->field_0x11[0] = 1; break; } case 1: { - s32 x0, y0, y1; - int x1; - s32 y, x; - s32 room; - if (j < 1) { - break; - } - if (cell[-1].field_0xb == 0) { - break; - } - if (cell[-1].field_0x8 != 0) { - break; - } - if (cell[-1].field_0xa == 0) { - break; - } - if (cell[-1].field_0x9 != 0 || cell[-1].field_0x11[1] != 0) { - break; - } - x0 = cell[-1].field_0x0 < cell->field_0x0 ? cell[-1].field_0x0 : cell->field_0x0; - y0 = cell[-1].field_0x2; - x1 = cell[-1].field_0x4 > cell->field_0x4 ? cell[-1].field_0x4 : cell->field_0x4; - y1 = cell->field_0x6; - room = GetTile(cell->field_0x0, cell->field_0x2)->room; - for (x = x0; x < x1; x++) { - for (y = y0; y < y1; y++) { - struct tile *t = GetTileSafe(x, y); - t->terrain_flags &= ~3; - t->terrain_flags |= 1; - t->room = room; + if (j >= 1 && + grid[i][j - 1].field_0xb && + !grid[i][j - 1].field_0x8 && + grid[i][j - 1].field_0xa && + !grid[i][j - 1].field_0x9 && + !grid[i][j - 1].field_0x11[1]) { + s32 y, x; + + s32 x0 = grid[i][j - 1].field_0x0 < grid[i][j].field_0x0 ? grid[i][j - 1].field_0x0 : grid[i][j].field_0x0; + s32 y0 = grid[i][j - 1].field_0x2; + s32 x1 = grid[i][j - 1].field_0x4 > grid[i][j].field_0x4 ? grid[i][j - 1].field_0x4 : grid[i][j].field_0x4; + s32 y1 = grid[i][j].field_0x6; + s32 room = GetTile(grid[i][j].field_0x0, grid[i][j].field_0x2)->room; + for (x = x0; x < x1; x++) { + for (y = y0; y < y1; y++) { + struct tile *t = GetTileSafe(x, y); + + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + t->room = room; + } } + grid[i][j - 1].field_0x0 = x0; + grid[i][j - 1].field_0x4 = x1; + grid[i][j - 1].field_0x2 = y0; + grid[i][j - 1].field_0x6 = y1; + grid[i][j].field_0x11[1] = 1; + grid[i][j - 1].field_0x11[1] = 1; + grid[i][j].field_0xb = 0; + grid[i][j].field_0x11[0] = 1; } - cell[-1].field_0x0 = x0; - cell[-1].field_0x4 = x1; - cell[-1].field_0x2 = y0; - cell[-1].field_0x6 = y1; - cell->field_0x11[1] = 1; - cell[-1].field_0x11[1] = 1; - cell->field_0xb = 0; - cell->field_0x11[0] = 1; break; } case 2: { - s32 x0, y0, x1, y1, y, x; - s32 room; - if (i > grid_size_x - 2) { - break; - } - if (grid[i + 1][j].field_0xb == 0) { - break; - } - if (grid[i + 1][j].field_0x8 != 0) { - break; - } - if (grid[i + 1][j].field_0xa == 0) { - break; - } - if (grid[i + 1][j].field_0x9 != 0 || grid[i + 1][j].field_0x11[1] != 0) { - break; - } - x0 = cell->field_0x0; - y0 = cell->field_0x2 < grid[i + 1][j].field_0x2 ? cell->field_0x2 : grid[i + 1][j].field_0x2; - x1 = grid[i + 1][j].field_0x4; - y1 = cell->field_0x6 > grid[i + 1][j].field_0x6 ? cell->field_0x6 : grid[i + 1][j].field_0x6; - room = GetTile(cell->field_0x0, cell->field_0x2)->room; - for (x = x0; x < x1; x++) { - for (y = y0; y < y1; y++) { - struct tile *t = GetTileSafe(x, y); - t->terrain_flags &= ~3; - t->terrain_flags |= 1; - t->room = room; + if (i <= grid_size_x - 2 && + grid[i + 1][j].field_0xb && + !grid[i + 1][j].field_0x8 && + grid[i + 1][j].field_0xa && + !grid[i + 1][j].field_0x9 && + !grid[i + 1][j].field_0x11[1]) { + s32 y, x; + + s32 x0 = grid[i][j].field_0x0; + s32 y0 = grid[i][j].field_0x2 < grid[i + 1][j].field_0x2 ? grid[i][j].field_0x2 : grid[i + 1][j].field_0x2; + s32 x1 = grid[i + 1][j].field_0x4; + s32 y1 = grid[i][j].field_0x6 > grid[i + 1][j].field_0x6 ? grid[i][j].field_0x6 : grid[i + 1][j].field_0x6; + s32 room = GetTile(grid[i][j].field_0x0, grid[i][j].field_0x2)->room; + for (x = x0; x < x1; x++) { + for (y = y0; y < y1; y++) { + struct tile *t = GetTileSafe(x, y); + + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + t->room = room; + } } + grid[i][j].field_0x0 = x0; + grid[i][j].field_0x4 = x1; + grid[i][j].field_0x2 = y0; + grid[i][j].field_0x6 = y1; + grid[i + 1][j].field_0x11[1] = 1; + grid[i][j].field_0x11[1] = 1; + grid[i + 1][j].field_0xb = 0; + grid[i + 1][j].field_0x11[0] = 1; } - cell->field_0x0 = x0; - cell->field_0x4 = x1; - cell->field_0x2 = y0; - cell->field_0x6 = y1; - grid[i + 1][j].field_0x11[1] = 1; - cell->field_0x11[1] = 1; - grid[i + 1][j].field_0xb = 0; - grid[i + 1][j].field_0x11[0] = 1; break; } case 3: { - s32 x0, y0, x1, y1, y, x; - s32 room; - if (j > grid_size_y - 2) { - break; - } - if (grid[i][j + 1].field_0xb == 0) { - break; - } - if (grid[i][j + 1].field_0x8 != 0) { - break; - } - if (grid[i][j + 1].field_0xa == 0) { - break; - } - if (grid[i][j + 1].field_0x9 != 0 || grid[i][j + 1].field_0x11[1] != 0) { - break; - } - x0 = cell->field_0x0 < grid[i][j + 1].field_0x0 ? cell->field_0x0 : grid[i][j + 1].field_0x0; - y0 = cell->field_0x2; - x1 = cell->field_0x4 > grid[i][j + 1].field_0x4 ? cell->field_0x4 : grid[i][j + 1].field_0x4; - y1 = grid[i][j + 1].field_0x6; - room = GetTile(cell->field_0x0, cell->field_0x2)->room; - for (x = x0; x < x1; x++) { - for (y = y0; y < y1; y++) { - struct tile *t = GetTileSafe(x, y); - t->terrain_flags &= ~3; - t->terrain_flags |= 1; - t->room = room; + if (j <= grid_size_y - 2 && + grid[i][j + 1].field_0xb && + !grid[i][j + 1].field_0x8 && + grid[i][j + 1].field_0xa && + !grid[i][j + 1].field_0x9 && + !grid[i][j + 1].field_0x11[1]) { + s32 y, x; + + s32 x0 = grid[i][j].field_0x0 < grid[i][j + 1].field_0x0 ? grid[i][j].field_0x0 : grid[i][j + 1].field_0x0; + s32 y0 = grid[i][j].field_0x2; + s32 x1 = grid[i][j].field_0x4 > grid[i][j + 1].field_0x4 ? grid[i][j].field_0x4 : grid[i][j + 1].field_0x4; + s32 y1 = grid[i][j + 1].field_0x6; + s32 room = GetTile(grid[i][j].field_0x0, grid[i][j].field_0x2)->room; + for (x = x0; x < x1; x++) { + for (y = y0; y < y1; y++) { + struct tile *t = GetTileSafe(x, y); + + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + t->room = room; + } } + grid[i][j].field_0x0 = x0; + grid[i][j].field_0x4 = x1; + grid[i][j].field_0x2 = y0; + grid[i][j].field_0x6 = y1; + grid[i][j + 1].field_0x11[1] = 1; + grid[i][j].field_0x11[1] = 1; + grid[i][j + 1].field_0xb = 0; + grid[i][j + 1].field_0x11[0] = 1; } - cell->field_0x0 = x0; - cell->field_0x4 = x1; - cell->field_0x2 = y0; - cell->field_0x6 = y1; - grid[i][j + 1].field_0x11[1] = 1; - cell->field_0x11[1] = 1; - grid[i][j + 1].field_0xb = 0; - grid[i][j + 1].field_0x11[0] = 1; break; } } + } } } From 3fd44e59880fbfc47f3a82bb0c6604a4d229811b Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sat, 12 Sep 2026 17:16:58 -0700 Subject: [PATCH 17/34] Decompile 16 callees of the combat and dungeon-generation functions Every function was verified at score 0 against its NORTH_AMERICA, EUROPE and JAPAN targets before landing, with the target's address walk closing exactly in each region, and by a matching US build after landing. overlay_29_0233E43C.c GenerateRoomImperfections, CreateHallway overlay_29_022E3F20.c UpdateStatusIconFlags, PlayQuestionMarkEffect, PlayExclamationPointEffect__022E47D4, PlayExclamationPointEffect__022E4880, ov29_022E3E74 dungeon_util_2.c PopulateActiveMonsterPtrs, GetTeamMemberIndex, GetMonsterOrTrapName, SubstitutePlaceholderStringTags overlay_29_022EC7E8.c IsFloorOver (new file) overlay_29_02345A3C.c SpawnDroppedItemWrapper (new file) overlay_29_023061A8.c EndBurnClassStatus (new file) overlay_29_02306728.c EndCurseClassStatus (new file) overlay_29_02336F4C.c UpdateTrapsVisibility (new file) Eleven were landed at a file boundary by first decompiling the functions between them and the nearest end of their .s, so they merge into the adjacent source file instead of splitting it. The other five sit too far from either end to make that worthwhile and split their .s as usual. CreateHallway closes a provisional declaration: CreateGridCellConnections had declared it from the call site as (s32 arg1 .. s32 arg7), and that guessed prototype is now replaced by the real one in the same header. Eighteen pre-existing declarations of these functions, written from call sites in other translation units, are replaced by an include of the owning header. Three of them disagreed with the real signature, and no build could have caught any of them because two declarations of one function never meet in a single translation unit: IsFloorOver declared `extern s32` in two files; it returns bool8. SpawnDroppedItem declared `void`; SpawnDroppedItemWrapper returns its value. Corrected in src/dungeon_projectile_throw.c. SetPreprocessorArgsStringToName declared with `u8 pos` / `u8 param_4`. Every existing call site passes literal constants, where the narrowing is invisible; SubstitutePlaceholderStringTags passes variables, and the narrow form emits two `and rX,#0xff` rows the target does not have. Widened to s32/u32. GetMonsterOrTrapName is landed with three parameters rather than two. Both score 0 -- an ignored third argument costs the callee nothing, so the callee's bytes cannot distinguish them -- but src/overlay_31_02382820.c has always called it with three, which is evidence about the caller that the callee cannot supply. pret/pmd-red was used as a structural reference where it has an equivalent function. It supplied the shape and never the spelling: it is a different game built by a different compiler. IsFloorOver is the clearest case -- translating its nested form literally scored 1525, and flattening to four independent early returns scored 0. Authored by Claude (Opus 5) under human direction. Confirmed by a matching build: build/pmdsky.us/pmdsky.us.nds: OK. Co-Authored-By: Claude Opus 5 --- ...9_022E2978.inc => overlay_29_022E34A8.inc} | 18 +- asm/include/overlay_29_022E37DC.inc | 19 +- asm/include/overlay_29_022EC62C.inc | 21 +- asm/include/overlay_29_022EC85C.inc | 22 + asm/include/overlay_29_02305C28.inc | 72 +- asm/include/overlay_29_02306258.inc | 12 + asm/include/overlay_29_023068C4.inc | 55 + asm/include/overlay_29_02336450.inc | 21 +- asm/include/overlay_29_0233711C.inc | 23 + ...9_0233ED34.inc => overlay_29_0233F424.inc} | 3 +- asm/include/overlay_29_023456BC.inc | 38 +- asm/include/overlay_29_02345AD8.inc | 41 + ...ay_29_022E2978.s => overlay_29_022E34A8.s} | 176 +- asm/overlay_29_022E37DC.s | 316 --- asm/overlay_29_022EC62C.s | 477 ---- asm/overlay_29_022EC85C.s | 447 ++++ asm/overlay_29_02305C28.s | 2306 ----------------- asm/overlay_29_02306258.s | 401 +++ asm/overlay_29_023068C4.s | 1726 ++++++++++++ asm/overlay_29_02336450.s | 1013 -------- asm/overlay_29_0233711C.s | 888 +++++++ ...ay_29_0233ED34.s => overlay_29_0233F424.s} | 510 +--- asm/overlay_29_023456BC.s | 993 ------- asm/overlay_29_02345AD8.s | 954 +++++++ include/dungeon_util_2.h | 4 + include/overlay_29_022E3F20.h | 5 + include/overlay_29_022EC7E8.h | 8 + include/overlay_29_023061A8.h | 8 + include/overlay_29_02306728.h | 8 + include/overlay_29_02336F4C.h | 8 + include/overlay_29_0233E43C.h | 3 +- include/overlay_29_02345A3C.h | 8 + main.lsf | 14 +- src/dungeon_ai.c | 2 +- src/dungeon_projectile_throw.c | 4 +- src/dungeon_util_2.c | 102 + src/move_orb_effects.c | 6 +- src/overlay_29_022E3F20.c | 113 + src/overlay_29_022EC7E8.c | 28 + src/overlay_29_022F0EDC.c | 4 +- src/overlay_29_023061A8.c | 41 + src/overlay_29_02306728.c | 74 + src/overlay_29_02308FBC.c | 9 +- src/overlay_29_0230BBAC.c | 2 +- src/overlay_29_02311010.c | 6 +- src/overlay_29_0231CBC8.c | 4 +- src/overlay_29_0232D368.c | 2 +- src/overlay_29_02336F4C.c | 65 + src/overlay_29_0233E43C.c | 294 +++ src/overlay_29_02345A3C.c | 20 + src/overlay_31_02382820.c | 3 +- src/status_checks.c | 2 +- 52 files changed, 5423 insertions(+), 5976 deletions(-) rename asm/include/{overlay_29_022E2978.inc => overlay_29_022E34A8.inc} (72%) create mode 100644 asm/include/overlay_29_022EC85C.inc create mode 100644 asm/include/overlay_29_02306258.inc create mode 100644 asm/include/overlay_29_023068C4.inc create mode 100644 asm/include/overlay_29_0233711C.inc rename asm/include/{overlay_29_0233ED34.inc => overlay_29_0233F424.inc} (81%) create mode 100644 asm/include/overlay_29_02345AD8.inc rename asm/{overlay_29_022E2978.s => overlay_29_022E34A8.s} (77%) create mode 100644 asm/overlay_29_022EC85C.s create mode 100644 asm/overlay_29_02306258.s create mode 100644 asm/overlay_29_023068C4.s create mode 100644 asm/overlay_29_0233711C.s rename asm/{overlay_29_0233ED34.s => overlay_29_0233F424.s} (78%) create mode 100644 asm/overlay_29_02345AD8.s create mode 100644 include/overlay_29_022EC7E8.h create mode 100644 include/overlay_29_023061A8.h create mode 100644 include/overlay_29_02306728.h create mode 100644 include/overlay_29_02336F4C.h create mode 100644 include/overlay_29_02345A3C.h create mode 100644 src/overlay_29_022EC7E8.c create mode 100644 src/overlay_29_023061A8.c create mode 100644 src/overlay_29_02306728.c create mode 100644 src/overlay_29_02336F4C.c create mode 100644 src/overlay_29_02345A3C.c diff --git a/asm/include/overlay_29_022E2978.inc b/asm/include/overlay_29_022E34A8.inc similarity index 72% rename from asm/include/overlay_29_022E2978.inc rename to asm/include/overlay_29_022E34A8.inc index cb9b3204..d15ff07c 100644 --- a/asm/include/overlay_29_022E2978.inc +++ b/asm/include/overlay_29_022E34A8.inc @@ -1,18 +1,18 @@ #pragma once -.public abs .public CanSeeInvisibleMonsters -.public DrawMinimapTile .public DUNGEON_PTR +.public DrawMinimapTile .public EntityIsValid__022E1A1C .public EntityIsValid__022E32E8 .public GetForcedLossReason -.public GetMessageLogPreprocessorArgs -.public GetMonsterName -.public GetTrapName .public HasDropeyeStatus .public IsBlinded .public IsPositionActuallyInSight .public ItemIsActive__022E330C +.public TeamMemberHasEnabledIqSkill +.public UpdateMinimap +.public UpdateTrapsVisibility +.public abs .public ov29_022E34C8 .public ov29_022E3534 .public ov29_022E3A58 @@ -21,13 +21,5 @@ .public ov29_0233711C .public ov29_023372A4 .public ov29_0237C84C -.public PrepareItemForPrinting2 -.public SetPreprocessorArgsStringToName -.public strcpy -.public StringFromId .public sub_02009194 .public sub_020091B0 -.public SubstitutePlaceholderTrapTags -.public TeamMemberHasEnabledIqSkill -.public UpdateMinimap -.public UpdateTrapsVisibility diff --git a/asm/include/overlay_29_022E37DC.inc b/asm/include/overlay_29_022E37DC.inc index c9c9dd4e..69dd29be 100644 --- a/asm/include/overlay_29_022E37DC.inc +++ b/asm/include/overlay_29_022E37DC.inc @@ -3,8 +3,8 @@ .public AnimationHasMoreFrames .public DUNGEON_PTR .public EntityIsValid__022E37B8 -.public GetEffectAnimationWanOffset .public InitOamAdjustmentInfo +.public UpdateStatusIconFlags .public ov10_022BDC68 .public ov10_022BF274 .public ov10_022BF2B4 @@ -14,20 +14,3 @@ .public ov29_022E6E40 .public ov29_022ED0F4 .public ov29_0235354C -.public PlayEffectAnimationEntity -.public PlaySeByIdIfShouldDisplayEntity -.public STATUS_ICON_ARRAY_BIDE -.public STATUS_ICON_ARRAY_BLINDED -.public STATUS_ICON_ARRAY_BURN -.public STATUS_ICON_ARRAY_CRINGE -.public STATUS_ICON_ARRAY_CURSE -.public STATUS_ICON_ARRAY_FREEZE -.public STATUS_ICON_ARRAY_INVISIBLE -.public STATUS_ICON_ARRAY_LEECH_SEED -.public STATUS_ICON_ARRAY_LONG_TOSS -.public STATUS_ICON_ARRAY_MAGNET_RISE -.public STATUS_ICON_ARRAY_MIRACLE_EYE -.public STATUS_ICON_ARRAY_MUZZLED -.public STATUS_ICON_ARRAY_REFLECT -.public STATUS_ICON_ARRAY_SLEEP -.public STATUS_ICON_ARRAY_SURE_SHOT diff --git a/asm/include/overlay_29_022EC62C.inc b/asm/include/overlay_29_022EC62C.inc index 6dd6860b..cb6adc71 100644 --- a/asm/include/overlay_29_022EC62C.inc +++ b/asm/include/overlay_29_022EC62C.inc @@ -1,29 +1,12 @@ #pragma once -.public _s32_div_f .public AbilityIsActiveVeneer -.public AdvanceFrame -.public ChangeDungeonMusic -.public DisplayActions .public DUNGEON_PTR .public EntityIsValid__022EC608 -.public EntityIsValid__022ECDC0 .public ExecuteMonsterAction -.public GetForcedLossReason .public GetLeader -.public GetMonsterName -.public HandleFaint +.public IsFloorOver .public IsFloorOver2 -.public LogMessageByIdWithPopupCheckUser -.public ov10_022C6320 -.public ov29_022E5DBC -.public ov29_022EAEF0 -.public ov29_022F2FE4 -.public ov29_023522B6 -.public ov29_02352380 -.public ov29_02352390 -.public ov29_02353598 -.public ov29_0237C974 .public RunMonsterAi .public TryForcedLoss -.public TryPointCameraToMonster .public TrySpawnMonsterAndTickSpawnCounter +.public ov29_023522B6 diff --git a/asm/include/overlay_29_022EC85C.inc b/asm/include/overlay_29_022EC85C.inc new file mode 100644 index 00000000..8b4ecf50 --- /dev/null +++ b/asm/include/overlay_29_022EC85C.inc @@ -0,0 +1,22 @@ +#pragma once +.public AdvanceFrame +.public ChangeDungeonMusic +.public DUNGEON_PTR +.public DisplayActions +.public EntityIsValid__022ECDC0 +.public GetForcedLossReason +.public GetLeader +.public GetMonsterName +.public HandleFaint +.public IsFloorOver +.public LogMessageByIdWithPopupCheckUser +.public TryPointCameraToMonster +.public _s32_div_f +.public ov10_022C6320 +.public ov29_022E5DBC +.public ov29_022EAEF0 +.public ov29_022F2FE4 +.public ov29_02352380 +.public ov29_02352390 +.public ov29_02353598 +.public ov29_0237C974 diff --git a/asm/include/overlay_29_02305C28.inc b/asm/include/overlay_29_02305C28.inc index 12f8e7fd..1884fbb1 100644 --- a/asm/include/overlay_29_02305C28.inc +++ b/asm/include/overlay_29_02305C28.inc @@ -1,68 +1,32 @@ #pragma once -.public abs -.public AdvanceFrame .public ApplyDamageAndEffectsWrapper .public CalcSpeedStageWrapper .public CalcStatusDuration .public ChangeMonsterAnimationToIdle -.public DUNGEON_PTR -.public DungeonGetSpriteIndex .public EndNegativeStatusCondition -.public EnsureCanStandCurrentTile .public EntityIsValid__02305C04 -.public EntityIsValid__02307EF8 -.public FreeOtherWrappedMonsters -.public GetIdleAnimationId -.public GetMonsterApparentId -.public GetType -.public HandleShopTransaction .public IsProtectedFromNegativeStatus -.public ItemIsActive__02307F1C -.public LogMessageByIdWithPopupCheckUser .public LogMessageByIdWithPopupCheckUserTarget .public MonsterHasNegativeStatus +.public SafeguardIsActive +.public SubInitMonster +.public SubstitutePlaceholderStringTags +.public TransferNegativeBlinkerClassStatus +.public TryIncreaseHp +.public TryInflictExposedStatus +.public TryInflictPerishSongStatus +.public TryInflictSleepStatus +.public UpdateStatusIconFlags .public ov10_022C45A0 .public ov10_022C45A8 .public ov10_022C4868 .public ov29_022E543C -.public ov29_022E65F4 -.public ov29_022E6798 -.public ov29_022FA1D8 -.public ov29_022FB984 -.public ov29_02304830 -.public ov29_02311C28 -.public ov29_02321134 -.public SafeguardIsActive -.public SubInitMonster -.public SubstitutePlaceholderStringTags -.public TryIncreaseHp -.public TryInflictBadlyPoisonedStatus -.public TryInflictBlinkerStatus -.public TryInflictBurnStatus -.public TryInflictConfusedStatus -.public TryInflictConstrictionStatus -.public TryInflictCoweringStatus -.public TryInflictCringeStatus -.public TryInflictCrossEyedStatus -.public TryInflictDecoyStatus -.public TryInflictDropeyeStatus -.public TryInflictEmbargoStatus -.public TryInflictEncoreStatus -.public TryInflictExposedStatus -.public TryInflictGastroAcidStatus -.public TryInflictHealBlockStatus -.public TryInflictInfatuatedStatus -.public TryInflictLeechSeedStatus -.public TryInflictMiracleEyeStatus -.public TryInflictMuzzledStatus -.public TryInflictParalysisStatus -.public TryInflictPausedStatus -.public TryInflictPerishSongStatus -.public TryInflictPoisonedStatus -.public TryInflictShadowHoldStatus -.public TryInflictSleepStatus -.public TryInflictTauntStatus -.public TryInflictWhifferStatus -.public UpdateMinimap -.public UpdateStatusIconFlags -.public UpdateTrapsVisibility +.public ov29_02306DCC +.public ov29_02306F00 +.public ov29_02307078 +.public ov29_02307198 +.public ov29_0230737C +.public ov29_023076C0 +.public ov29_023077FC +.public ov29_02307A2C +.public ov29_02307B0C diff --git a/asm/include/overlay_29_02306258.inc b/asm/include/overlay_29_02306258.inc new file mode 100644 index 00000000..8b70d54f --- /dev/null +++ b/asm/include/overlay_29_02306258.inc @@ -0,0 +1,12 @@ +#pragma once +.public CalcSpeedStageWrapper +.public DUNGEON_PTR +.public EntityIsValid__02305C04 +.public FreeOtherWrappedMonsters +.public LogMessageByIdWithPopupCheckUser +.public LogMessageByIdWithPopupCheckUserTarget +.public ResetTypeChanges +.public SubstitutePlaceholderStringTags +.public UpdateStatusIconFlags +.public ov29_022E65F4 +.public ov29_022E6798 diff --git a/asm/include/overlay_29_023068C4.inc b/asm/include/overlay_29_023068C4.inc new file mode 100644 index 00000000..110ef79d --- /dev/null +++ b/asm/include/overlay_29_023068C4.inc @@ -0,0 +1,55 @@ +#pragma once +.public AdvanceFrame +.public CalcSpeedStageWrapper +.public ChangeMonsterAnimationToIdle +.public DUNGEON_PTR +.public DungeonGetSpriteIndex +.public EndCurseClassStatus +.public EndFrozenClassStatus +.public EndReflectClassStatus +.public EndSleepClassStatus +.public EnsureCanStandCurrentTile +.public EntityIsValid__02305C04 +.public EntityIsValid__02307EF8 +.public GetIdleAnimationId +.public GetMonsterApparentId +.public GetType +.public ItemIsActive__02307F1C +.public LogMessageByIdWithPopupCheckUser +.public LogMessageByIdWithPopupCheckUserTarget +.public SubstitutePlaceholderStringTags +.public TryInflictBadlyPoisonedStatus +.public TryInflictBlinkerStatus +.public TryInflictBurnStatus +.public TryInflictConfusedStatus +.public TryInflictConstrictionStatus +.public TryInflictCoweringStatus +.public TryInflictCringeStatus +.public TryInflictCrossEyedStatus +.public TryInflictDecoyStatus +.public TryInflictDropeyeStatus +.public TryInflictEmbargoStatus +.public TryInflictEncoreStatus +.public TryInflictGastroAcidStatus +.public TryInflictHealBlockStatus +.public TryInflictInfatuatedStatus +.public TryInflictLeechSeedStatus +.public TryInflictMiracleEyeStatus +.public TryInflictMuzzledStatus +.public TryInflictParalysisStatus +.public TryInflictPausedStatus +.public TryInflictPoisonedStatus +.public TryInflictShadowHoldStatus +.public TryInflictTauntStatus +.public TryInflictWhifferStatus +.public TryRemoveSnatchedMonsterFromDungeonStruct +.public UpdateMinimap +.public UpdateStatusIconFlags +.public UpdateTrapsVisibility +.public abs +.public HandleShopTransaction +.public ov29_022FA1D8 +.public ov29_022FB984 +.public ov29_02304830 +.public ov29_02311C28 +.public ov29_02321134 diff --git a/asm/include/overlay_29_02336450.inc b/asm/include/overlay_29_02336450.inc index 0479cc9a..856ecc31 100644 --- a/asm/include/overlay_29_02336450.inc +++ b/asm/include/overlay_29_02336450.inc @@ -1,24 +1,16 @@ #pragma once -.public CannotStandOnTileNoMonsterCheck -.public CanSeePosition -.public Debug_Print0 .public DEFAULT_TILE -.public DetermineMonsterShadow -.public DIRECTIONS_XY -.public DrawMinimapTile .public DUNGEON_PTR -.public EntityIsValid__02337CA8 +.public Debug_Print0 .public FloorSecondaryTerrainIsChasm .public GetBgRegionArea -.public GetGridsOption -.public GetLeader .public GetTile .public GetTileSafe -.public GetVisibilityRange .public InitTilesetBuffer .public IsCurrentFixedRoomBossFight -.public IsSecretBazaar .public MOBILITY_TYPE_TO_DUNGEON_MOBILITY_TYPE +.public RandIntSafe +.public SECONDARY_TERRAIN_TYPES .public ov10_022C2588 .public ov10_022C25EC .public ov10_022C2638 @@ -26,17 +18,10 @@ .public ov10_022C26A0 .public ov10_022C2720 .public ov29_022DE0EC -.public ov29_022E66C4 .public ov29_022E9F80 .public ov29_02352B60 .public ov29_02352B74 .public ov29_02352B88 -.public ov29_02352B9C -.public ov29_02352D58 .public ov29_02352F14 .public ov29_0237CAA0 .public ov29_0237CAAC -.public RandIntSafe -.public SECONDARY_TERRAIN_TYPES -.public sub_02051D8C -.public sub_02051E60 diff --git a/asm/include/overlay_29_0233711C.inc b/asm/include/overlay_29_0233711C.inc new file mode 100644 index 00000000..b735e51e --- /dev/null +++ b/asm/include/overlay_29_0233711C.inc @@ -0,0 +1,23 @@ +#pragma once +.public CanSeePosition +.public CannotStandOnTileNoMonsterCheck +.public DIRECTIONS_XY +.public DUNGEON_PTR +.public DetermineMonsterShadow +.public DetermineTileWalkableNeighbors +.public DrawMinimapTile +.public EntityIsValid__02337CA8 +.public GetGridsOption +.public GetLeader +.public GetTile +.public GetTileSafe +.public GetVisibilityRange +.public IsSecretBazaar +.public UpdateTrapsVisibility +.public ov29_022E66C4 +.public ov29_02336694 +.public ov29_02336DB0 +.public ov29_02352B9C +.public ov29_02352D58 +.public sub_02051D8C +.public sub_02051E60 diff --git a/asm/include/overlay_29_0233ED34.inc b/asm/include/overlay_29_0233F424.inc similarity index 81% rename from asm/include/overlay_29_0233ED34.inc rename to asm/include/overlay_29_0233F424.inc index 8964d136..9dd55e52 100644 --- a/asm/include/overlay_29_0233ED34.inc +++ b/asm/include/overlay_29_0233F424.inc @@ -1,6 +1,5 @@ #pragma once -.public CORNER_CARDINAL_NEIGHBOR_IS_OPEN -.public DIRECTIONS_XY +.public CreateHallway .public DUNGEON_PTR .public DungeonRandInt .public DungeonRandRange diff --git a/asm/include/overlay_29_023456BC.inc b/asm/include/overlay_29_023456BC.inc index 34730a3f..85d361ab 100644 --- a/asm/include/overlay_29_023456BC.inc +++ b/asm/include/overlay_29_023456BC.inc @@ -1,53 +1,17 @@ #pragma once -.public _s32_div_f .public AddSimpleObjToOam -.public AdvanceFrame -.public DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST -.public DISPLACEMENTS_WITHIN_3 -.public DisplayMessage2 -.public DrawMinimapTile .public DUNGEON_PTR -.public DungeonRandInt -.public DungeonRandOutcome__022EAB20 .public EntityIsValid__02345698 -.public GenerateItem .public GetActualBuyPrice .public GetActualSellPrice -.public GetExclusiveItem .public GetItemInfo .public GetItemSpriteId -.public GetMissionRank__0204FAE0 .public GetTile .public GetTileSafe -.public GetTreasureBoxChances -.public IncrementEntityPixelPosXY -.public IsCurrentFixedRoomBossFight -.public IsMarowakTrainingMaze .public IsShoppableItem -.public IsUnown -.public LogMessageByIdQuiet -.public LogMessageByIdWithPopupCheckUser -.public LogMessageByIdWithPopupCheckUserUnknown .public OBJ_GRAPHICS_CONTROLS_PTR -.public ov10_022C44C8 -.public ov10_022C48EC -.public ov29_022E563C -.public ov29_022FB51C -.public ov29_02344BF8 -.public ov29_02347378 -.public ov29_023531BC +.public ShouldDisplayEntityWrapper .public ov29_023537B4 .public ov29_023537BC .public ov29_0237C864 -.public PlayDungeonTipSound__022EB66C -.public RetrieveFromItemList1 -.public RevealAttackedTile -.public SECONDARY_TERRAIN_TYPES -.public SetEntityPixelPosXY -.public SetPreprocessorArgsIdVal -.public ShouldDisplayEntityWrapper -.public SinAbs4096 -.public SpawnItem .public sub_0200D1FC -.public SubstitutePlaceholderItemTags -.public UNOWN_STONE_DROP_CHANCE diff --git a/asm/include/overlay_29_02345AD8.inc b/asm/include/overlay_29_02345AD8.inc new file mode 100644 index 00000000..68cc3363 --- /dev/null +++ b/asm/include/overlay_29_02345AD8.inc @@ -0,0 +1,41 @@ +#pragma once +.public AdvanceFrame +.public DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST +.public DISPLACEMENTS_WITHIN_3 +.public DUNGEON_PTR +.public DisplayItem +.public DisplayMessage2 +.public DrawMinimapTile +.public DungeonRandInt +.public DungeonRandOutcome__022EAB20 +.public EntityIsValid__02345698 +.public GenerateItem +.public GetExclusiveItem +.public GetMissionRank__0204FAE0 +.public GetTile +.public GetTreasureBoxChances +.public IncrementEntityPixelPosXY +.public IsCurrentFixedRoomBossFight +.public IsMarowakTrainingMaze +.public IsUnown +.public LogMessageByIdQuiet +.public LogMessageByIdWithPopupCheckUser +.public LogMessageByIdWithPopupCheckUserUnknown +.public PlayDungeonTipSound__022EB66C +.public RetrieveFromItemList1 +.public RevealAttackedTile +.public SECONDARY_TERRAIN_TYPES +.public SetEntityPixelPosXY +.public SetPreprocessorArgsIdVal +.public SinAbs4096 +.public SpawnItem +.public SubstitutePlaceholderItemTags +.public UNOWN_STONE_DROP_CHANCE +.public _s32_div_f +.public ov10_022C44C8 +.public ov10_022C48EC +.public ov29_022E563C +.public ov29_022FB51C +.public ov29_02344BF8 +.public ov29_02347378 +.public ov29_023531BC diff --git a/asm/overlay_29_022E2978.s b/asm/overlay_29_022E34A8.s similarity index 77% rename from asm/overlay_29_022E2978.s rename to asm/overlay_29_022E34A8.s index 69b51462..c1468a67 100644 --- a/asm/overlay_29_022E2978.s +++ b/asm/overlay_29_022E34A8.s @@ -1,182 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_022E2978.inc" + .include "overlay_29_022E34A8.inc" .text - arm_func_start PopulateActiveMonsterPtrs -PopulateActiveMonsterPtrs: ; 0x022E2978 -#ifdef JAPAN -#define OV29_022E2978_OFFSET -0xA4 -#else -#define OV29_022E2978_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r5, #0 - ldr r6, _022E2A34 ; =DUNGEON_PTR - mov r4, r5 -_022E2988: - ldr r0, [r6] - add r0, r0, r4, lsl #2 - add r0, r0, #0x12000 - ldr r7, [r0, #0xb28 + OV29_022E2978_OFFSET] - mov r0, r7 - bl EntityIsValid__022E1A1C - cmp r0, #0 - ldrne r0, [r6] - add r4, r4, #1 - addne r0, r0, r5, lsl #2 - addne r0, r0, #0x12000 - strne r7, [r0, #0xb78 + OV29_022E2978_OFFSET] - addne r5, r5, #1 - cmp r4, #4 - blt _022E2988 - ldr r6, _022E2A34 ; =DUNGEON_PTR - mov r4, #0 -_022E29CC: - ldr r0, [r6] - add r0, r0, r4, lsl #2 - add r0, r0, #0x12000 - ldr r7, [r0, #0xb38 + OV29_022E2978_OFFSET] - mov r0, r7 - bl EntityIsValid__022E1A1C - cmp r0, #0 - ldrne r0, [r6] - add r4, r4, #1 - addne r0, r0, r5, lsl #2 - addne r0, r0, #0x12000 - strne r7, [r0, #0xb78 + OV29_022E2978_OFFSET] - addne r5, r5, #1 - cmp r4, #0x10 - blt _022E29CC - mov r2, #0 - ldr r1, _022E2A34 ; =DUNGEON_PTR - b _022E2A28 -_022E2A14: - ldr r0, [r1] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 - str r2, [r0, #0xb78 + OV29_022E2978_OFFSET] - add r5, r5, #1 -_022E2A28: - cmp r5, #0x14 - blt _022E2A14 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_022E2A34: .word DUNGEON_PTR - arm_func_end PopulateActiveMonsterPtrs - - arm_func_start GetTeamMemberIndex -GetTeamMemberIndex: ; 0x022E2A38 - ldr r1, _022E2A74 ; =DUNGEON_PTR - mov r2, #0 - ldr r3, [r1] - b _022E2A64 -_022E2A48: - add r1, r3, r2, lsl #2 - add r1, r1, #0x12000 -#ifdef JAPAN - ldr r1, [r1, #0xa84] -#else - ldr r1, [r1, #0xb28] -#endif - cmp r0, r1 - moveq r0, r2 - bxeq lr - add r2, r2, #1 -_022E2A64: - cmp r2, #4 - blt _022E2A48 - mvn r0, #0 - bx lr - .align 2, 0 -_022E2A74: .word DUNGEON_PTR - arm_func_end GetTeamMemberIndex - - arm_func_start GetMonsterOrTrapName -GetMonsterOrTrapName: ; 0x022E2A78 - stmdb sp!, {r4, lr} - ldr r2, [r1] - mov r4, r0 - cmp r2, #1 - beq _022E2AA0 - cmp r2, #2 - beq _022E2AAC - cmp r2, #3 - ldmeqia sp!, {r4, pc} - b _022E2ABC -_022E2AA0: - ldr r1, [r1, #0xb4] - bl GetMonsterName - ldmia sp!, {r4, pc} -_022E2AAC: - ldr r1, [r1, #0xb4] - ldrb r1, [r1] - bl GetTrapName - ldmia sp!, {r4, pc} -_022E2ABC: - ldr r0, _022E2AD4 ; =0x00000A42 - bl StringFromId - mov r1, r0 - mov r0, r4 - bl strcpy - ldmia sp!, {r4, pc} - .align 2, 0 -#ifdef JAPAN -_022E2AD4: .word 0x00000B42 -#else -_022E2AD4: .word 0x00000A42 -#endif - arm_func_end GetMonsterOrTrapName - - arm_func_start SubstitutePlaceholderStringTags -SubstitutePlaceholderStringTags: ; 0x022E2AD8 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r6, r1 - mov r7, r0 - mov r5, r2 - bl GetMessageLogPreprocessorArgs - ldr r1, [r6] - mov r4, r0 - cmp r1, #1 - beq _022E2B10 - cmp r1, #2 - beq _022E2B3C - cmp r1, #3 - beq _022E2B2C - b _022E2B50 -_022E2B10: - mov r1, #0 - str r1, [sp] - ldr r2, [r6, #0xb4] - mov r1, r7 - mov r3, r5 - bl SetPreprocessorArgsStringToName - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022E2B2C: - ldr r2, [r6, #0xb4] - mov r1, r7 - bl PrepareItemForPrinting2 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022E2B3C: - ldr r2, [r6, #0xb4] - mov r1, r7 - ldrb r2, [r2] - bl SubstitutePlaceholderTrapTags - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022E2B50: - ldr r0, _022E2B64 ; =0x00000A42 - bl StringFromId - add r1, r4, r7, lsl #2 - str r0, [r1, #0x38] - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -#ifdef JAPAN -_022E2B64: .word 0x00000B42 -#else -_022E2B64: .word 0x00000A42 -#endif - arm_func_end SubstitutePlaceholderStringTags - #ifdef EUROPE arm_func_start ov29_022E34A8_EU ov29_022E34A8_EU: ; 0x022E34A8 diff --git a/asm/overlay_29_022E37DC.s b/asm/overlay_29_022E37DC.s index ee84a0dc..65c27938 100644 --- a/asm/overlay_29_022E37DC.s +++ b/asm/overlay_29_022E37DC.s @@ -243,319 +243,3 @@ _022E3AA0: .align 2, 0 _022E3AB0: .word DUNGEON_PTR arm_func_end ov29_022E3A58 - - arm_func_start UpdateStatusIconFlags -UpdateStatusIconFlags: ; 0x022E3AB4 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov r4, r0 - bl EntityIsValid__022E37B8 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldr r2, [r4, #0xb4] - mov r1, #0 - ldrsh r4, [r2, #2] - mov r5, #1 - mov r0, r1 - cmp r4, #0xb9 - addne r3, r5, #0x310 - cmpne r4, r3 - bne _022E3AF8 - ldrb r3, [r2, #0xbe] - cmp r3, #0x7f - moveq r5, #0 -_022E3AF8: - cmp r5, #0 - beq _022E3B1C - ldrb r5, [r2, #0xbd] - ldr r4, _022E3D94 ; =STATUS_ICON_ARRAY_SLEEP - add r3, r4, r5, lsl #3 - ldr r4, [r4, r5, lsl #3] - ldr r3, [r3, #4] - orr r1, r1, r4 - orr r0, r0, r3 -_022E3B1C: - ldrb r7, [r2, #0xbf] - ldr r4, _022E3D98 ; =STATUS_ICON_ARRAY_BURN - ldrb r6, [r2, #0xc4] - ldr r3, _022E3D9C ; =STATUS_ICON_ARRAY_FREEZE - add r5, r4, r7, lsl #3 - add ip, r3, r6, lsl #3 - ldr r4, [r4, r7, lsl #3] - ldr lr, [r5, #4] - ldrb sl, [r2, #0xd0] - ldr r8, _022E3DA0 ; =STATUS_ICON_ARRAY_CRINGE - ldrb r7, [r2, #0xd2] - ldr r5, _022E3DA4 ; =STATUS_ICON_ARRAY_BIDE - add fp, r8, sl, lsl #3 - add sb, r5, r7, lsl #3 - orr r0, r0, lr - ldr lr, [ip, #4] - ldrb ip, [r2, #0xd5] - orr r1, r1, r4 - ldr r4, _022E3DA8 ; =STATUS_ICON_ARRAY_REFLECT - ldr r3, [r3, r6, lsl #3] - add r6, r4, ip, lsl #3 - orr r0, r0, lr - ldr lr, [fp, #4] - ldrb fp, [r2, #0xd8] - orr r1, r1, r3 - ldr r3, _022E3DAC ; =STATUS_ICON_ARRAY_CURSE - ldr r8, [r8, sl, lsl #3] - add sl, r3, fp, lsl #3 - orr r0, r0, lr - ldr lr, [sb, #4] - ldrb sb, [r2, #0xe0] - orr r1, r1, r8 - ldr r8, _022E3DB0 ; =STATUS_ICON_ARRAY_LEECH_SEED - ldr r5, [r5, r7, lsl #3] - add r7, r8, sb, lsl #3 - orr r0, r0, lr - ldr lr, [r6, #4] - ldrb r6, [r2, #0xec] - orr r1, r1, r5 - ldr r5, _022E3DB4 ; =STATUS_ICON_ARRAY_SURE_SHOT - ldr ip, [r4, ip, lsl #3] - add r4, r5, r6, lsl #3 - orr r0, r0, lr - ldr sl, [sl, #4] - ldrb lr, [r2, #0xee] - orr r1, r1, ip - ldr ip, _022E3DB8 ; =STATUS_ICON_ARRAY_LONG_TOSS - ldr fp, [r3, fp, lsl #3] - add r3, ip, lr, lsl #3 - orr r0, r0, sl - ldr sl, [r7, #4] - ldrb r7, [r2, #0xef] - orr fp, r1, fp - ldr r1, _022E3DBC ; =STATUS_ICON_ARRAY_INVISIBLE - ldr sb, [r8, sb, lsl #3] - add r8, r1, r7, lsl #3 - orr r0, r0, sl - ldr sl, [r4, #4] - ldrb r4, [r2, #0xf1] - orr fp, fp, sb - ldr sb, _022E3DC0 ; =STATUS_ICON_ARRAY_BLINDED - ldr r6, [r5, r6, lsl #3] - add r5, sb, r4, lsl #3 - orr r0, r0, sl - ldr sl, [r3, #4] - ldrb r3, [r2, #0xf3] - orr r6, fp, r6 - ldr fp, _022E3DC4 ; =STATUS_ICON_ARRAY_MUZZLED - ldr ip, [ip, lr, lsl #3] - add lr, fp, r3, lsl #3 - orr sl, r0, sl - ldr r0, [r8, #4] - ldr r1, [r1, r7, lsl #3] - orr r7, r6, ip - ldr r6, [sb, r4, lsl #3] - orr r8, r7, r1 - ldr r4, [r5, #4] - orr r7, sl, r0 - ldr r1, [fp, r3, lsl #3] - orr r5, r8, r6 - ldr r0, [lr, #4] - orr r3, r7, r4 - orr r0, r3, r0 - orr r8, r5, r1 - ldrb r7, [r2, #0xf5] - ldr r6, _022E3DC8 ; =STATUS_ICON_ARRAY_MIRACLE_EYE - ldrb r5, [r2, #0xf7] - ldr r4, _022E3DCC ; =STATUS_ICON_ARRAY_MAGNET_RISE - add r1, r6, r7, lsl #3 - add r3, r4, r5, lsl #3 - ldr r7, [r6, r7, lsl #3] - ldr r6, [r1, #4] - ldrb r1, [r2, #0xfd] - ldr r4, [r4, r5, lsl #3] - ldr r3, [r3, #4] - orr r0, r0, r6 - orr r0, r0, r3 - cmp r1, #0 - orr r5, r8, r7 - orr r1, r5, r4 - ldrb r3, [r2, #0xfe] - orrne r0, r0, #0 - orrne r1, r1, #0x1000000 - cmp r3, #0 - ldrb r3, [r2, #6] - orrne r0, r0, #0 - orrne r1, r1, #0x2000000 - cmp r3, #0 - bne _022E3D00 - ldrsh r5, [r2, #0x12] - ldrsh r4, [r2, #0x16] - ldr r3, _022E3DD0 ; =0x000003E7 - add r5, r5, r4 - cmp r5, r3 - movgt r5, r3 - mov r3, r5, asr #1 - ldrsh r4, [r2, #0x10] - add r3, r5, r3, lsr #30 - cmp r4, r3, asr #2 - orrlt r0, r0, #0 - orrlt r1, r1, #0x2000 -_022E3D00: - ldr r3, _022E3DD4 ; =DUNGEON_PTR - ldr r3, [r3] - ldrb r3, [r3, #0x78d] - cmp r3, #0 - beq _022E3D30 - ldrb r3, [r2, #0x62] - tst r3, #1 - movne r3, #1 - moveq r3, #0 - tst r3, #0xff - orrne r0, r0, #0 - orrne r1, r1, #0x2000 -_022E3D30: - ldr r3, [r2, #0x34] - cmp r3, #0x100 - ldrge r3, [r2, #0x38] - cmpge r3, #0x100 - ldrge r3, [r2, #0x3c] - cmpge r3, #0x100 - ldrge r3, [r2, #0x40] - cmpge r3, #0x100 - ldrgesh r3, [r2, #0x24] - cmpge r3, #0xa - ldrgesh r3, [r2, #0x26] - cmpge r3, #0xa - ldrgesh r3, [r2, #0x28] - cmpge r3, #0xa - ldrgesh r3, [r2, #0x2a] - cmpge r3, #0xa - ldrgesh r3, [r2, #0x2c] - cmpge r3, #0xa - ldrgesh r3, [r2, #0x2e] - cmpge r3, #0xa - orrlt r1, r1, #0x8000000 - orrlt r0, r0, #0 -#ifdef JAPAN - str r1, [r2, #0x214] - str r0, [r2, #0x218] -#else - str r1, [r2, #0x218] - str r0, [r2, #0x21c] -#endif - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022E3D94: .word STATUS_ICON_ARRAY_SLEEP -_022E3D98: .word STATUS_ICON_ARRAY_BURN -_022E3D9C: .word STATUS_ICON_ARRAY_FREEZE -_022E3DA0: .word STATUS_ICON_ARRAY_CRINGE -_022E3DA4: .word STATUS_ICON_ARRAY_BIDE -_022E3DA8: .word STATUS_ICON_ARRAY_REFLECT -_022E3DAC: .word STATUS_ICON_ARRAY_CURSE -_022E3DB0: .word STATUS_ICON_ARRAY_LEECH_SEED -_022E3DB4: .word STATUS_ICON_ARRAY_SURE_SHOT -_022E3DB8: .word STATUS_ICON_ARRAY_LONG_TOSS -_022E3DBC: .word STATUS_ICON_ARRAY_INVISIBLE -_022E3DC0: .word STATUS_ICON_ARRAY_BLINDED -_022E3DC4: .word STATUS_ICON_ARRAY_MUZZLED -_022E3DC8: .word STATUS_ICON_ARRAY_MIRACLE_EYE -_022E3DCC: .word STATUS_ICON_ARRAY_MAGNET_RISE -_022E3DD0: .word 0x000003E7 -_022E3DD4: .word DUNGEON_PTR - arm_func_end UpdateStatusIconFlags - - arm_func_start PlayQuestionMarkEffect -PlayQuestionMarkEffect: ; 0x022E3DD8 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - mov r0, #0x144 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x144 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end PlayQuestionMarkEffect - - arm_func_start PlayExclamationPointEffect__022E47D4 -PlayExclamationPointEffect__022E47D4: ; 0x022E3E24 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E3E70 ; =0x00000143 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E3E70 ; =0x00000143 - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E3E70: .word 0x00000143 - arm_func_end PlayExclamationPointEffect__022E47D4 - - arm_func_start ov29_022E3E74 -ov29_022E3E74: ; 0x022E3E74 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - mov r0, #0x25 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x25 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - ldr r1, _022E3ECC ; =0x0000030E - mov r0, r4 - bl PlaySeByIdIfShouldDisplayEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E3ECC: .word 0x0000030E - arm_func_end ov29_022E3E74 - - arm_func_start PlayExclamationPointEffect__022E4880 -PlayExclamationPointEffect__022E4880: ; 0x022E3ED0 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E3F1C ; =0x00000143 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E3F1C ; =0x00000143 - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E3F1C: .word 0x00000143 - arm_func_end PlayExclamationPointEffect__022E4880 diff --git a/asm/overlay_29_022EC62C.s b/asm/overlay_29_022EC62C.s index defbead2..dec53715 100644 --- a/asm/overlay_29_022EC62C.s +++ b/asm/overlay_29_022EC62C.s @@ -142,480 +142,3 @@ _022EC7C8: _022EC7E0: .word DUNGEON_PTR _022EC7E4: .word ov29_023522B6 arm_func_end TrySpawnMonsterAndActivatePlusMinus - - arm_func_start IsFloorOver -IsFloorOver: ; 0x022EC7E8 - stmdb sp!, {r3, lr} - ldr r0, _022EC858 ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #8] - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r3, pc} - bl GetLeader - cmp r0, #0 - ldreq r1, _022EC858 ; =DUNGEON_PTR - moveq r0, #1 - ldreq r1, [r1] - streqb r0, [r1, #0x758] - ldmeqia sp!, {r3, pc} - ldr r0, _022EC858 ; =DUNGEON_PTR - ldr r1, [r0] - ldrb r0, [r1, #6] - cmp r0, #1 - moveq r0, #2 - streqb r0, [r1, #0x758] - moveq r0, #1 - ldmeqia sp!, {r3, pc} - cmp r0, #2 - moveq r0, #2 - streqb r0, [r1, #0x758] - moveq r0, #1 - movne r0, #0 - ldmia sp!, {r3, pc} - .align 2, 0 -_022EC858: .word DUNGEON_PTR - arm_func_end IsFloorOver - - arm_func_start ov29_022EC85C -ov29_022EC85C: ; 0x022EC85C - stmdb sp!, {r3, lr} - bl GetForcedLossReason - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r3, pc} - bl IsFloorOver - ldmia sp!, {r3, pc} - arm_func_end ov29_022EC85C - - arm_func_start ov29_022EC878 -ov29_022EC878: ; 0x022EC878 - mov r2, #0 - strb r2, [r0] - strb r2, [r0, #1] - strb r2, [r0, #2] - strb r2, [r0, #3] - strb r2, [r0, #4] - ldr r1, _022EC8A4 ; =ov29_02353598 - strb r2, [r0, #5] - mov r0, #1 - strb r0, [r1] - bx lr - .align 2, 0 -_022EC8A4: .word ov29_02353598 - arm_func_end ov29_022EC878 - - arm_func_start ov29_022EC8A8 -ov29_022EC8A8: ; 0x022EC8A8 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r6, r0 - mov r5, r1 - mov r0, r2 - mov r1, #0x30 - mov r4, r3 - bl _s32_div_f - mov r3, r1, lsl #1 - and r0, r3, #0xff - mov r2, r0, lsr #1 - ldr r1, _022EC998 ; =ov29_02352390 - mov r0, #0xc0 - strb r3, [r6, #4] - add r2, r2, #1 - strb r2, [r6, #2] - add r4, r4, #2 - smlabb r5, r5, r0, r1 - b _022EC96C -_022EC8F0: - strb r4, [r6, #3] - mov r8, #0x63 - ldr r7, _022EC99C ; =DUNGEON_PTR - b _022EC93C -_022EC900: - ldrb r1, [r6, #3] - mov r0, r8 - sub r1, r1, #1 - strb r1, [r6, #3] - ldrb r1, [r6, #5] - eor r1, r1, #1 - strb r1, [r6, #5] - ldrb r3, [r6, #4] - and r2, r1, #0xff - ldr r1, [r7] - add r2, r3, r2 - ldr r2, [r5, r2, lsl #2] - add r1, r1, #0x1a000 -#ifdef JAPAN - str r2, [r1, #0x18c] -#else - str r2, [r1, #0x230] -#endif - bl AdvanceFrame -_022EC93C: - ldrb r0, [r6, #3] - cmp r0, #0 - bne _022EC900 - ldrb r0, [r6, #4] - cmp r0, #0 - subne r0, r0, #2 - strneb r0, [r6, #4] - mov r0, #0 - strb r0, [r6, #5] - ldrb r0, [r6, #2] - sub r0, r0, #1 - strb r0, [r6, #2] -_022EC96C: - ldrb r0, [r6, #2] - cmp r0, #0 - bne _022EC8F0 - ldr r0, _022EC99C ; =DUNGEON_PTR - mov r2, #0 - ldr r0, [r0] - ldr r1, _022EC9A0 ; =ov29_02353598 - add r0, r0, #0x1a000 -#ifdef JAPAN - str r2, [r0, #0x18c] -#else - str r2, [r0, #0x230] -#endif - strb r2, [r1] - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_022EC998: .word ov29_02352390 -_022EC99C: .word DUNGEON_PTR -_022EC9A0: .word ov29_02353598 - arm_func_end ov29_022EC8A8 - - arm_func_start ov29_022EC9A4 -ov29_022EC9A4: ; 0x022EC9A4 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #8 - mov r3, #0xc -#ifdef JAPAN - smulbb r4, r1, r3 - ldr r1, _022ECAD8 ; =ov10_022C6320 - mov r6, r0 - ldrb r4, [r1, r4] -#else - smulbb r3, r1, r3 - ldr r1, _022ECAD8 ; =ov10_022C6320 - mov r6, r0 - ldrb r4, [r1, r3] -#endif - mov r5, r2 - cmp r4, #5 - beq _022ECA28 - cmp r5, #0 - bne _022EC9E0 -#ifdef JAPAN - add r1, r3, #0x930 -#else - ldr r1, _022ECADC ; =0x00000BFD -#endif - bl LogMessageByIdWithPopupCheckUser - b _022ECA18 -_022EC9E0: - cmp r5, #1 - bne _022EC9F4 - ldr r1, _022ECAE0 ; =0x00000BFE - bl LogMessageByIdWithPopupCheckUser - b _022ECA18 -_022EC9F4: - cmp r5, #2 - bne _022ECA08 - ldr r1, _022ECAE4 ; =0x00000BFF - bl LogMessageByIdWithPopupCheckUser - b _022ECA18 -_022ECA08: - cmp r5, #3 - bne _022ECA18 -#ifdef JAPAN - ldr r1, _022EE14C ; =0x0000093F -#else - mov r1, #0xc00 -#endif - bl LogMessageByIdWithPopupCheckUser -_022ECA18: - mov r0, r4 - mov r1, #0 - bl ov29_022E5DBC - b _022ECAD0 -_022ECA28: - bl ov29_022EAEF0 - mov r4, r0 - cmp r5, #0 - bne _022ECA48 -#ifdef JAPAN - mov r0, r6 - mov r1, #0x940 -#else - ldr r1, _022ECAE8 ; =0x00000C01 - mov r0, r6 -#endif - bl LogMessageByIdWithPopupCheckUser - b _022ECA8C -_022ECA48: - cmp r5, #1 - bne _022ECA60 - ldr r1, _022ECAEC ; =0x00000C02 - mov r0, r6 - bl LogMessageByIdWithPopupCheckUser - b _022ECA8C -_022ECA60: - cmp r5, #2 - bne _022ECA78 - ldr r1, _022ECAF0 ; =0x00000C03 - mov r0, r6 - bl LogMessageByIdWithPopupCheckUser - b _022ECA8C -_022ECA78: - cmp r5, #3 - bne _022ECA8C - ldr r1, _022ECAF4 ; =0x00000C04 - mov r0, r6 - bl LogMessageByIdWithPopupCheckUser -_022ECA8C: - add r0, sp, #0 - bl ov29_022EC878 - ldr r0, _022ECAF8 ; =ov29_02352380 - ldr r0, [r0, r5, lsl #2] - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bl ChangeDungeonMusic - mov r0, r5, lsl #2 - add r0, r0, #8 - mov r2, r0, lsl #0x10 - mov r3, r2, asr #0x10 - add r0, sp, #0 - mov r1, r5 - mov r2, #0x10 - bl ov29_022EC8A8 - mov r0, r4 - bl ChangeDungeonMusic -_022ECAD0: - add sp, sp, #8 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_022ECAD8: .word ov10_022C6320 -#ifdef JAPAN -_022ECAE0: .word 0x0000093D -_022ECAE4: .word 0x0000093E -_022EE14C: .word 0x0000093F -_022ECAEC: .word 0x00000941 -_022ECAF0: .word 0x00000942 -_022ECAF4: .word 0x00000943 -#else -_022ECADC: .word 0x00000BFD -_022ECAE0: .word 0x00000BFE -_022ECAE4: .word 0x00000BFF -_022ECAE8: .word 0x00000C01 -_022ECAEC: .word 0x00000C02 -_022ECAF0: .word 0x00000C03 -_022ECAF4: .word 0x00000C04 -#endif -_022ECAF8: .word ov29_02352380 - arm_func_end ov29_022EC9A4 - - arm_func_start ov29_022ECAFC -ov29_022ECAFC: ; 0x022ECAFC - stmdb sp!, {r4, lr} - sub sp, sp, #8 - mov r4, r0 - add r0, sp, #0 - bl ov29_022EC878 - mov r0, r4, lsl #2 - add r0, r0, #2 - mov r2, r0, lsl #0x10 - mov r3, r2, asr #0x10 - add r0, sp, #0 - mov r1, r4 - mov r2, #8 - bl ov29_022EC8A8 - add sp, sp, #8 - ldmia sp!, {r4, pc} - arm_func_end ov29_022ECAFC - - arm_func_start ov29_022ECB38 -ov29_022ECB38: ; 0x022ECB38 - ldr r0, _022ECB44 ; =ov29_02353598 - ldrb r0, [r0] - bx lr - .align 2, 0 -_022ECB44: .word ov29_02353598 - arm_func_end ov29_022ECB38 - - arm_func_start DecrementWindCounter -DecrementWindCounter: ; 0x022ECB48 -#ifdef JAPAN -#define DECREMENT_WIND_COUNTER_OFFSET -0xA4 -#else -#define DECREMENT_WIND_COUNTER_OFFSET 0 -#endif - stmdb sp!, {r4, lr} - bl GetLeader - movs r4, r0 - moveq r0, #0 - beq _022ECB70 - ldr r0, [r4] - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff -_022ECB70: - cmp r0, #0 - ldmeqia sp!, {r4, pc} - ldr r0, _022ECD7C ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x700 - ldrsh r1, [r0, #0x84] - cmp r1, #0 - subgt r1, r1, #1 - strgth r1, [r0, #0x84] - ldr r0, _022ECD7C ; =DUNGEON_PTR - ldr r1, [r0] - add r0, r1, #0x700 - ldrsh r0, [r0, #0x84] - cmp r0, #1 - movlt r0, #3 - strltb r0, [r1, #0x79a] - ldr r0, _022ECD7C ; =DUNGEON_PTR - ldr r1, [r0] - ldrb r0, [r1, #0x79a] - cmp r0, #0 - bne _022ECC2C - add r0, r1, #0x700 - ldrsh r0, [r0, #0x84] - cmp r0, #0xfa - ldmgeia sp!, {r4, pc} - bl ov29_022F2FE4 - mov r1, #1 - mov r0, r4 - mov r2, r1 - bl TryPointCameraToMonster - mov r0, r4 - bl DisplayActions - bl IsFloorOver - cmp r0, #0 - ldmneia sp!, {r4, pc} - ldr r1, _022ECD7C ; =DUNGEON_PTR - mov r0, r4 - ldr r2, [r1] - add r1, r2, #0x4000 - ldrsh r1, [r1, #0xd4 + DECREMENT_WIND_COUNTER_OFFSET] - ldrb r2, [r2, #0x79a] - bl ov29_022EC9A4 - ldr r0, _022ECD7C ; =DUNGEON_PTR - mov r1, #1 - ldr r0, [r0] - strb r1, [r0, #0x79a] - ldmia sp!, {r4, pc} -_022ECC2C: - cmp r0, #1 - bne _022ECC9C - add r0, r1, #0x700 - ldrsh r0, [r0, #0x84] - cmp r0, #0x96 - ldmgeia sp!, {r4, pc} - bl ov29_022F2FE4 - mov r1, #1 - mov r0, r4 - mov r2, r1 - bl TryPointCameraToMonster - mov r0, r4 - bl DisplayActions - bl IsFloorOver - cmp r0, #0 - ldmneia sp!, {r4, pc} - ldr r1, _022ECD7C ; =DUNGEON_PTR - mov r0, r4 - ldr r2, [r1] - add r1, r2, #0x4000 - ldrsh r1, [r1, #0xd4 + DECREMENT_WIND_COUNTER_OFFSET] - ldrb r2, [r2, #0x79a] - bl ov29_022EC9A4 - ldr r0, _022ECD7C ; =DUNGEON_PTR - mov r1, #2 - ldr r0, [r0] - strb r1, [r0, #0x79a] - ldmia sp!, {r4, pc} -_022ECC9C: - cmp r0, #2 - add r0, r1, #0x700 - ldrsh r0, [r0, #0x84] - bne _022ECD0C - cmp r0, #0x32 - ldmgeia sp!, {r4, pc} - bl ov29_022F2FE4 - mov r1, #1 - mov r0, r4 - mov r2, r1 - bl TryPointCameraToMonster - mov r0, r4 - bl DisplayActions - bl IsFloorOver - cmp r0, #0 - ldmneia sp!, {r4, pc} - ldr r1, _022ECD7C ; =DUNGEON_PTR - mov r0, r4 - ldr r2, [r1] - add r1, r2, #0x4000 - ldrsh r1, [r1, #0xd4 + DECREMENT_WIND_COUNTER_OFFSET] - ldrb r2, [r2, #0x79a] - bl ov29_022EC9A4 - ldr r0, _022ECD7C ; =DUNGEON_PTR - mov r1, #3 - ldr r0, [r0] - strb r1, [r0, #0x79a] - ldmia sp!, {r4, pc} -_022ECD0C: - cmp r0, #1 - ldmgeia sp!, {r4, pc} - bl ov29_022F2FE4 - mov r1, #1 - mov r0, r4 - mov r2, r1 - bl TryPointCameraToMonster - mov r0, r4 - bl DisplayActions - bl IsFloorOver - cmp r0, #0 - ldmneia sp!, {r4, pc} - ldr r1, _022ECD7C ; =DUNGEON_PTR - mov r0, r4 - ldr r2, [r1] - add r1, r2, #0x4000 - ldrsh r1, [r1, #0xd4 + DECREMENT_WIND_COUNTER_OFFSET] - ldrb r2, [r2, #0x79a] - bl ov29_022EC9A4 - ldr r0, _022ECD7C ; =DUNGEON_PTR - ldr r1, _022ECD80 ; =0x0000025D - ldr r3, [r0] - mov ip, #4 - mov r0, r4 - mov r2, r4 - strb ip, [r3, #0x79a] - bl HandleFaint - ldmia sp!, {r4, pc} - .align 2, 0 -_022ECD7C: .word DUNGEON_PTR -_022ECD80: .word 0x0000025D - arm_func_end DecrementWindCounter - - arm_func_start ov29_022ECD84 -ov29_022ECD84: ; 0x022ECD84 - stmdb sp!, {r4, lr} - mov r4, r0 - bl EntityIsValid__022ECDC0 - cmp r0, #0 - ldmeqia sp!, {r4, pc} - ldr r0, [r4] - cmp r0, #1 - ldmneia sp!, {r4, pc} - ldr r1, [r4, #0xb4] - cmp r1, #0 - ldmeqia sp!, {r4, pc} - ldr r0, _022ECDBC ; =ov29_0237C974 - bl GetMonsterName - ldmia sp!, {r4, pc} - .align 2, 0 -_022ECDBC: .word ov29_0237C974 - arm_func_end ov29_022ECD84 diff --git a/asm/overlay_29_022EC85C.s b/asm/overlay_29_022EC85C.s new file mode 100644 index 00000000..8a5da291 --- /dev/null +++ b/asm/overlay_29_022EC85C.s @@ -0,0 +1,447 @@ + .include "asm/macros.inc" + .include "overlay_29_022EC85C.inc" + + .text + + arm_func_start ov29_022EC85C +ov29_022EC85C: ; 0x022EC85C + stmdb sp!, {r3, lr} + bl GetForcedLossReason + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, pc} + bl IsFloorOver + ldmia sp!, {r3, pc} + arm_func_end ov29_022EC85C + + arm_func_start ov29_022EC878 +ov29_022EC878: ; 0x022EC878 + mov r2, #0 + strb r2, [r0] + strb r2, [r0, #1] + strb r2, [r0, #2] + strb r2, [r0, #3] + strb r2, [r0, #4] + ldr r1, _022EC8A4 ; =ov29_02353598 + strb r2, [r0, #5] + mov r0, #1 + strb r0, [r1] + bx lr + .align 2, 0 +_022EC8A4: .word ov29_02353598 + arm_func_end ov29_022EC878 + + arm_func_start ov29_022EC8A8 +ov29_022EC8A8: ; 0x022EC8A8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r6, r0 + mov r5, r1 + mov r0, r2 + mov r1, #0x30 + mov r4, r3 + bl _s32_div_f + mov r3, r1, lsl #1 + and r0, r3, #0xff + mov r2, r0, lsr #1 + ldr r1, _022EC998 ; =ov29_02352390 + mov r0, #0xc0 + strb r3, [r6, #4] + add r2, r2, #1 + strb r2, [r6, #2] + add r4, r4, #2 + smlabb r5, r5, r0, r1 + b _022EC96C +_022EC8F0: + strb r4, [r6, #3] + mov r8, #0x63 + ldr r7, _022EC99C ; =DUNGEON_PTR + b _022EC93C +_022EC900: + ldrb r1, [r6, #3] + mov r0, r8 + sub r1, r1, #1 + strb r1, [r6, #3] + ldrb r1, [r6, #5] + eor r1, r1, #1 + strb r1, [r6, #5] + ldrb r3, [r6, #4] + and r2, r1, #0xff + ldr r1, [r7] + add r2, r3, r2 + ldr r2, [r5, r2, lsl #2] + add r1, r1, #0x1a000 +#ifdef JAPAN + str r2, [r1, #0x18c] +#else + str r2, [r1, #0x230] +#endif + bl AdvanceFrame +_022EC93C: + ldrb r0, [r6, #3] + cmp r0, #0 + bne _022EC900 + ldrb r0, [r6, #4] + cmp r0, #0 + subne r0, r0, #2 + strneb r0, [r6, #4] + mov r0, #0 + strb r0, [r6, #5] + ldrb r0, [r6, #2] + sub r0, r0, #1 + strb r0, [r6, #2] +_022EC96C: + ldrb r0, [r6, #2] + cmp r0, #0 + bne _022EC8F0 + ldr r0, _022EC99C ; =DUNGEON_PTR + mov r2, #0 + ldr r0, [r0] + ldr r1, _022EC9A0 ; =ov29_02353598 + add r0, r0, #0x1a000 +#ifdef JAPAN + str r2, [r0, #0x18c] +#else + str r2, [r0, #0x230] +#endif + strb r2, [r1] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_022EC998: .word ov29_02352390 +_022EC99C: .word DUNGEON_PTR +_022EC9A0: .word ov29_02353598 + arm_func_end ov29_022EC8A8 + + arm_func_start ov29_022EC9A4 +ov29_022EC9A4: ; 0x022EC9A4 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r3, #0xc +#ifdef JAPAN + smulbb r4, r1, r3 + ldr r1, _022ECAD8 ; =ov10_022C6320 + mov r6, r0 + ldrb r4, [r1, r4] +#else + smulbb r3, r1, r3 + ldr r1, _022ECAD8 ; =ov10_022C6320 + mov r6, r0 + ldrb r4, [r1, r3] +#endif + mov r5, r2 + cmp r4, #5 + beq _022ECA28 + cmp r5, #0 + bne _022EC9E0 +#ifdef JAPAN + add r1, r3, #0x930 +#else + ldr r1, _022ECADC ; =0x00000BFD +#endif + bl LogMessageByIdWithPopupCheckUser + b _022ECA18 +_022EC9E0: + cmp r5, #1 + bne _022EC9F4 + ldr r1, _022ECAE0 ; =0x00000BFE + bl LogMessageByIdWithPopupCheckUser + b _022ECA18 +_022EC9F4: + cmp r5, #2 + bne _022ECA08 + ldr r1, _022ECAE4 ; =0x00000BFF + bl LogMessageByIdWithPopupCheckUser + b _022ECA18 +_022ECA08: + cmp r5, #3 + bne _022ECA18 +#ifdef JAPAN + ldr r1, _022EE14C ; =0x0000093F +#else + mov r1, #0xc00 +#endif + bl LogMessageByIdWithPopupCheckUser +_022ECA18: + mov r0, r4 + mov r1, #0 + bl ov29_022E5DBC + b _022ECAD0 +_022ECA28: + bl ov29_022EAEF0 + mov r4, r0 + cmp r5, #0 + bne _022ECA48 +#ifdef JAPAN + mov r0, r6 + mov r1, #0x940 +#else + ldr r1, _022ECAE8 ; =0x00000C01 + mov r0, r6 +#endif + bl LogMessageByIdWithPopupCheckUser + b _022ECA8C +_022ECA48: + cmp r5, #1 + bne _022ECA60 + ldr r1, _022ECAEC ; =0x00000C02 + mov r0, r6 + bl LogMessageByIdWithPopupCheckUser + b _022ECA8C +_022ECA60: + cmp r5, #2 + bne _022ECA78 + ldr r1, _022ECAF0 ; =0x00000C03 + mov r0, r6 + bl LogMessageByIdWithPopupCheckUser + b _022ECA8C +_022ECA78: + cmp r5, #3 + bne _022ECA8C + ldr r1, _022ECAF4 ; =0x00000C04 + mov r0, r6 + bl LogMessageByIdWithPopupCheckUser +_022ECA8C: + add r0, sp, #0 + bl ov29_022EC878 + ldr r0, _022ECAF8 ; =ov29_02352380 + ldr r0, [r0, r5, lsl #2] + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + bl ChangeDungeonMusic + mov r0, r5, lsl #2 + add r0, r0, #8 + mov r2, r0, lsl #0x10 + mov r3, r2, asr #0x10 + add r0, sp, #0 + mov r1, r5 + mov r2, #0x10 + bl ov29_022EC8A8 + mov r0, r4 + bl ChangeDungeonMusic +_022ECAD0: + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_022ECAD8: .word ov10_022C6320 +#ifdef JAPAN +_022ECAE0: .word 0x0000093D +_022ECAE4: .word 0x0000093E +_022EE14C: .word 0x0000093F +_022ECAEC: .word 0x00000941 +_022ECAF0: .word 0x00000942 +_022ECAF4: .word 0x00000943 +#else +_022ECADC: .word 0x00000BFD +_022ECAE0: .word 0x00000BFE +_022ECAE4: .word 0x00000BFF +_022ECAE8: .word 0x00000C01 +_022ECAEC: .word 0x00000C02 +_022ECAF0: .word 0x00000C03 +_022ECAF4: .word 0x00000C04 +#endif +_022ECAF8: .word ov29_02352380 + arm_func_end ov29_022EC9A4 + + arm_func_start ov29_022ECAFC +ov29_022ECAFC: ; 0x022ECAFC + stmdb sp!, {r4, lr} + sub sp, sp, #8 + mov r4, r0 + add r0, sp, #0 + bl ov29_022EC878 + mov r0, r4, lsl #2 + add r0, r0, #2 + mov r2, r0, lsl #0x10 + mov r3, r2, asr #0x10 + add r0, sp, #0 + mov r1, r4 + mov r2, #8 + bl ov29_022EC8A8 + add sp, sp, #8 + ldmia sp!, {r4, pc} + arm_func_end ov29_022ECAFC + + arm_func_start ov29_022ECB38 +ov29_022ECB38: ; 0x022ECB38 + ldr r0, _022ECB44 ; =ov29_02353598 + ldrb r0, [r0] + bx lr + .align 2, 0 +_022ECB44: .word ov29_02353598 + arm_func_end ov29_022ECB38 + + arm_func_start DecrementWindCounter +DecrementWindCounter: ; 0x022ECB48 +#ifdef JAPAN +#define DECREMENT_WIND_COUNTER_OFFSET -0xA4 +#else +#define DECREMENT_WIND_COUNTER_OFFSET 0 +#endif + stmdb sp!, {r4, lr} + bl GetLeader + movs r4, r0 + moveq r0, #0 + beq _022ECB70 + ldr r0, [r4] + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + and r0, r0, #0xff +_022ECB70: + cmp r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, _022ECD7C ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, #0x700 + ldrsh r1, [r0, #0x84] + cmp r1, #0 + subgt r1, r1, #1 + strgth r1, [r0, #0x84] + ldr r0, _022ECD7C ; =DUNGEON_PTR + ldr r1, [r0] + add r0, r1, #0x700 + ldrsh r0, [r0, #0x84] + cmp r0, #1 + movlt r0, #3 + strltb r0, [r1, #0x79a] + ldr r0, _022ECD7C ; =DUNGEON_PTR + ldr r1, [r0] + ldrb r0, [r1, #0x79a] + cmp r0, #0 + bne _022ECC2C + add r0, r1, #0x700 + ldrsh r0, [r0, #0x84] + cmp r0, #0xfa + ldmgeia sp!, {r4, pc} + bl ov29_022F2FE4 + mov r1, #1 + mov r0, r4 + mov r2, r1 + bl TryPointCameraToMonster + mov r0, r4 + bl DisplayActions + bl IsFloorOver + cmp r0, #0 + ldmneia sp!, {r4, pc} + ldr r1, _022ECD7C ; =DUNGEON_PTR + mov r0, r4 + ldr r2, [r1] + add r1, r2, #0x4000 + ldrsh r1, [r1, #0xd4 + DECREMENT_WIND_COUNTER_OFFSET] + ldrb r2, [r2, #0x79a] + bl ov29_022EC9A4 + ldr r0, _022ECD7C ; =DUNGEON_PTR + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0x79a] + ldmia sp!, {r4, pc} +_022ECC2C: + cmp r0, #1 + bne _022ECC9C + add r0, r1, #0x700 + ldrsh r0, [r0, #0x84] + cmp r0, #0x96 + ldmgeia sp!, {r4, pc} + bl ov29_022F2FE4 + mov r1, #1 + mov r0, r4 + mov r2, r1 + bl TryPointCameraToMonster + mov r0, r4 + bl DisplayActions + bl IsFloorOver + cmp r0, #0 + ldmneia sp!, {r4, pc} + ldr r1, _022ECD7C ; =DUNGEON_PTR + mov r0, r4 + ldr r2, [r1] + add r1, r2, #0x4000 + ldrsh r1, [r1, #0xd4 + DECREMENT_WIND_COUNTER_OFFSET] + ldrb r2, [r2, #0x79a] + bl ov29_022EC9A4 + ldr r0, _022ECD7C ; =DUNGEON_PTR + mov r1, #2 + ldr r0, [r0] + strb r1, [r0, #0x79a] + ldmia sp!, {r4, pc} +_022ECC9C: + cmp r0, #2 + add r0, r1, #0x700 + ldrsh r0, [r0, #0x84] + bne _022ECD0C + cmp r0, #0x32 + ldmgeia sp!, {r4, pc} + bl ov29_022F2FE4 + mov r1, #1 + mov r0, r4 + mov r2, r1 + bl TryPointCameraToMonster + mov r0, r4 + bl DisplayActions + bl IsFloorOver + cmp r0, #0 + ldmneia sp!, {r4, pc} + ldr r1, _022ECD7C ; =DUNGEON_PTR + mov r0, r4 + ldr r2, [r1] + add r1, r2, #0x4000 + ldrsh r1, [r1, #0xd4 + DECREMENT_WIND_COUNTER_OFFSET] + ldrb r2, [r2, #0x79a] + bl ov29_022EC9A4 + ldr r0, _022ECD7C ; =DUNGEON_PTR + mov r1, #3 + ldr r0, [r0] + strb r1, [r0, #0x79a] + ldmia sp!, {r4, pc} +_022ECD0C: + cmp r0, #1 + ldmgeia sp!, {r4, pc} + bl ov29_022F2FE4 + mov r1, #1 + mov r0, r4 + mov r2, r1 + bl TryPointCameraToMonster + mov r0, r4 + bl DisplayActions + bl IsFloorOver + cmp r0, #0 + ldmneia sp!, {r4, pc} + ldr r1, _022ECD7C ; =DUNGEON_PTR + mov r0, r4 + ldr r2, [r1] + add r1, r2, #0x4000 + ldrsh r1, [r1, #0xd4 + DECREMENT_WIND_COUNTER_OFFSET] + ldrb r2, [r2, #0x79a] + bl ov29_022EC9A4 + ldr r0, _022ECD7C ; =DUNGEON_PTR + ldr r1, _022ECD80 ; =0x0000025D + ldr r3, [r0] + mov ip, #4 + mov r0, r4 + mov r2, r4 + strb ip, [r3, #0x79a] + bl HandleFaint + ldmia sp!, {r4, pc} + .align 2, 0 +_022ECD7C: .word DUNGEON_PTR +_022ECD80: .word 0x0000025D + arm_func_end DecrementWindCounter + + arm_func_start ov29_022ECD84 +ov29_022ECD84: ; 0x022ECD84 + stmdb sp!, {r4, lr} + mov r4, r0 + bl EntityIsValid__022ECDC0 + cmp r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4] + cmp r0, #1 + ldmneia sp!, {r4, pc} + ldr r1, [r4, #0xb4] + cmp r1, #0 + ldmeqia sp!, {r4, pc} + ldr r0, _022ECDBC ; =ov29_0237C974 + bl GetMonsterName + ldmia sp!, {r4, pc} + .align 2, 0 +_022ECDBC: .word ov29_0237C974 + arm_func_end ov29_022ECD84 diff --git a/asm/overlay_29_02305C28.s b/asm/overlay_29_02305C28.s index e932355e..823fd7a3 100644 --- a/asm/overlay_29_02305C28.s +++ b/asm/overlay_29_02305C28.s @@ -429,2309 +429,3 @@ _0230619C: .word ov10_022C45A0 _023061A0: .word ov10_022C4868 _023061A4: .word 0x00000C91 + END_SLEEP_CLASS_STATUS_OFFSET arm_func_end EndSleepClassStatus - - arm_func_start EndBurnClassStatus -EndBurnClassStatus: ; 0x023061A8 - stmdb sp!, {r4, r5, r6, lr} - mov r5, r1 - mov r6, r0 - mov r0, r5 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, pc} - mov r0, #0 - ldr r4, [r5, #0xb4] - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r0, [r4, #0xbf] - cmp r0, #5 - addls pc, pc, r0, lsl #2 - b _02306238 -_023061E8: ; jump table - b _02306238 ; case 0 - b _02306228 ; case 1 - b _02306200 ; case 2 - b _02306200 ; case 3 - b _02306214 ; case 4 - b _02306238 ; case 5 -_02306200: - ldr r2, _0230624C ; =0x00000C9E - mov r0, r6 - mov r1, r5 - bl LogMessageByIdWithPopupCheckUserTarget - b _02306238 -_02306214: - ldr r2, _02306250 ; =0x00000C9C - mov r0, r6 - mov r1, r5 - bl LogMessageByIdWithPopupCheckUserTarget - b _02306238 -_02306228: - ldr r2, _02306254 ; =0x00000C9D - mov r0, r6 - mov r1, r5 - bl LogMessageByIdWithPopupCheckUserTarget -_02306238: - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0xbf] - bl UpdateStatusIconFlags - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -#ifdef JAPAN -_0230624C: .word 0x000009DE -_02306250: .word 0x000009DC -_02306254: .word 0x000009DD -#else -_0230624C: .word 0x00000C9E -_02306250: .word 0x00000C9C -_02306254: .word 0x00000C9D -#endif - arm_func_end EndBurnClassStatus - - arm_func_start EndFrozenClassStatus -EndFrozenClassStatus: ; 0x02306258 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r7, r1 - mov r8, r0 - mov r0, r7 - mov r6, r2 - mov r4, #0 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - mov r0, r4 - ldr r5, [r7, #0xb4] - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r0, [r5, #0xc4] - cmp r0, #8 - addls pc, pc, r0, lsl #2 - b _02306398 -_023062A0: ; jump table - b _02306398 ; case 0 - b _023062C4 ; case 1 - b _02306300 ; case 2 - b _02306338 ; case 3 - b _0230635C ; case 4 -#ifdef JAPAN - b _02306300 ; case 5 -#else - b _0230631C ; case 5 -#endif - b _02306380 ; case 6 - b _023062E4 ; case 7 - b _02306398 ; case 8 -_023062C4: - cmp r6, #0 - beq _023062DC - ldr r2, _023063BC ; =0x00000C9F - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_023062DC: - mov r4, #1 - b _02306398 -_023062E4: - cmp r6, #0 - beq _02306398 - ldr r2, _023063C0 ; =0x00000C99 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _02306398 -_02306300: - cmp r6, #0 - beq _02306398 - ldr r2, _023063C4 ; =0x00000C9A - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _02306398 -#ifndef JAPAN -_0230631C: - cmp r6, #0 - beq _02306398 - ldr r2, _023063C8 ; =0x00000C9B - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _02306398 -#endif -_02306338: - cmp r6, #0 - beq _02306350 - ldr r2, _023063CC ; =0x00000C98 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_02306350: - ldr r0, [r5, #0xb4] - bl FreeOtherWrappedMonsters - b _02306398 -_0230635C: - cmp r6, #0 - beq _02306374 - ldr r2, _023063CC ; =0x00000C98 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_02306374: - ldr r0, [r5, #0xb4] - bl FreeOtherWrappedMonsters - b _02306398 -_02306380: - cmp r6, #0 - beq _02306398 - ldr r2, _023063D0 ; =0x00000CBB - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_02306398: - mov r1, #0 - mov r0, r7 - strb r1, [r5, #0xc4] - bl UpdateStatusIconFlags - cmp r4, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - mov r0, r7 - bl ov29_022E6798 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -#ifdef JAPAN -#define END_FROZEN_CLASS_STATUS_OFFSET -0x2C0 -#else -#define END_FROZEN_CLASS_STATUS_OFFSET 0 -#endif -_023063BC: .word 0x00000C9F + END_FROZEN_CLASS_STATUS_OFFSET -_023063C0: .word 0x00000C99 + END_FROZEN_CLASS_STATUS_OFFSET -_023063C4: .word 0x00000C9A + END_FROZEN_CLASS_STATUS_OFFSET -#ifndef JAPAN -_023063C8: .word 0x00000C9B -#endif -_023063CC: .word 0x00000C98 + END_FROZEN_CLASS_STATUS_OFFSET -_023063D0: .word 0x00000CBB + END_FROZEN_CLASS_STATUS_OFFSET - arm_func_end EndFrozenClassStatus - - arm_func_start EndCringeClassStatus -EndCringeClassStatus: ; 0x023063D4 -#ifdef JAPAN -#define END_CRINGE_CLASS_STATUS_OFFSET -0x2C0 -#else -#define END_CRINGE_CLASS_STATUS_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, lr} - mov r5, r1 - mov r6, r0 - mov r0, r5 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, pc} - mov r0, #0 - ldr r4, [r5, #0xb4] - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r0, [r4, #0xd0] - cmp r0, #8 - addls pc, pc, r0, lsl #2 - b _023064C0 -_02306414: ; jump table - b _023064C0 ; case 0 - b _023064B0 ; case 1 - b _02306438 ; case 2 - b _02306474 ; case 3 - b _0230644C ; case 4 - b _02306460 ; case 5 - b _0230649C ; case 6 - b _02306488 ; case 7 - b _023064C0 ; case 8 -_02306438: - ldr r2, _023064DC ; =0x00000C97 - mov r0, r6 - mov r1, r5 - bl LogMessageByIdWithPopupCheckUserTarget - b _023064C0 -_0230644C: - ldr r2, _023064E0 ; =0x00000CA4 - mov r0, r6 - mov r1, r5 - bl LogMessageByIdWithPopupCheckUserTarget - b _023064C0 -_02306460: - ldr r2, _023064E4 ; =0x00000CA7 - mov r0, r6 - mov r1, r5 - bl LogMessageByIdWithPopupCheckUserTarget - b _023064C0 -_02306474: - ldr r2, _023064E8 ; =0x00000CBD - mov r0, r6 - mov r1, r5 - bl LogMessageByIdWithPopupCheckUserTarget - b _023064C0 -_02306488: - ldr r2, _023064EC ; =0x00000CB7 - mov r0, r6 - mov r1, r5 - bl LogMessageByIdWithPopupCheckUserTarget - b _023064C0 -_0230649C: - mov r0, r6 - mov r1, r5 - mov r2, #0xcb0 + END_CRINGE_CLASS_STATUS_OFFSET - bl LogMessageByIdWithPopupCheckUserTarget - b _023064C0 -_023064B0: - ldr r2, _023064F0 ; =0x00000CBC - mov r0, r6 - mov r1, r5 - bl LogMessageByIdWithPopupCheckUserTarget -_023064C0: - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0xd0] - bl UpdateStatusIconFlags - mov r0, r5 - bl CalcSpeedStageWrapper - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_023064DC: .word 0x00000C97 + END_CRINGE_CLASS_STATUS_OFFSET -_023064E0: .word 0x00000CA4 + END_CRINGE_CLASS_STATUS_OFFSET -_023064E4: .word 0x00000CA7 + END_CRINGE_CLASS_STATUS_OFFSET -_023064E8: .word 0x00000CBD + END_CRINGE_CLASS_STATUS_OFFSET -_023064EC: .word 0x00000CB7 + END_CRINGE_CLASS_STATUS_OFFSET -_023064F0: .word 0x00000CBC + END_CRINGE_CLASS_STATUS_OFFSET - arm_func_end EndCringeClassStatus - - arm_func_start EndReflectClassStatus -EndReflectClassStatus: ; 0x023064F4 -#ifdef JAPAN -#define END_REFLECT_CLASS_STATUS_OFFSET -0x2C0 -#else -#define END_REFLECT_CLASS_STATUS_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - mov r0, r5 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - ldr r4, [r5, #0xb4] - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r0, [r4, #0xd5] - cmp r0, #0x12 - addls pc, pc, r0, lsl #2 - b _02306688 -_02306530: ; jump table - b _02306688 ; case 0 - b _0230657C ; case 1 - b _0230658C ; case 2 - b _0230659C ; case 3 - b _023065AC ; case 4 - b _023065BC ; case 5 - b _023065CC ; case 6 - b _023065DC ; case 7 - b _023065EC ; case 8 - b _023065FC ; case 9 - b _023065AC ; case 10 - b _0230660C ; case 11 - b _0230661C ; case 12 - b _0230663C ; case 13 - b _0230664C ; case 14 - b _0230665C ; case 15 - b _0230666C ; case 16 - b _0230667C ; case 17 - b _02306688 ; case 18 -_0230657C: - ldr r1, _0230669C ; =0x00000C87 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_0230658C: - ldr r1, _023066A0 ; =0x00000C8A - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_0230659C: - ldr r1, _023066A4 ; =0x00000C88 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_023065AC: - ldr r1, _023066A8 ; =0x00000C89 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_023065BC: - ldr r1, _023066AC ; =0x00000C8B - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_023065CC: - ldr r1, _023066B0 ; =0x00000C8C - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_023065DC: - ldr r1, _023066B4 ; =0x00000CA6 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_023065EC: - ldr r1, _023066B8 ; =0x00000CAE - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_023065FC: - ldr r1, _023066BC ; =0x00000CB1 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_0230660C: - ldr r1, _023066C0 ; =0x00000CB2 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_0230661C: - ldr r1, _023066C4 ; =0x00000CB3 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - mov r0, r5 - bl ov29_022E65F4 - mov r0, r5 - bl ResetTypeChanges - b _02306688 -_0230663C: - ldr r1, _023066C8 ; =0x00000CB4 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_0230664C: - ldr r1, _023066CC ; =0x00000CB5 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_0230665C: - ldr r1, _023066D0 ; =0x00000CBE - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_0230666C: - mov r0, r5 - mov r1, #0xcc0 + END_REFLECT_CLASS_STATUS_OFFSET - bl LogMessageByIdWithPopupCheckUser - b _02306688 -_0230667C: - ldr r1, _023066D4 ; =0x00000CC1 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser -_02306688: - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0xd5] - bl UpdateStatusIconFlags - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230669C: .word 0x00000C87 + END_REFLECT_CLASS_STATUS_OFFSET -_023066A0: .word 0x00000C8A + END_REFLECT_CLASS_STATUS_OFFSET -_023066A4: .word 0x00000C88 + END_REFLECT_CLASS_STATUS_OFFSET -_023066A8: .word 0x00000C89 + END_REFLECT_CLASS_STATUS_OFFSET -_023066AC: .word 0x00000C8B + END_REFLECT_CLASS_STATUS_OFFSET -_023066B0: .word 0x00000C8C + END_REFLECT_CLASS_STATUS_OFFSET -_023066B4: .word 0x00000CA6 + END_REFLECT_CLASS_STATUS_OFFSET -_023066B8: .word 0x00000CAE + END_REFLECT_CLASS_STATUS_OFFSET -_023066BC: .word 0x00000CB1 + END_REFLECT_CLASS_STATUS_OFFSET -_023066C0: .word 0x00000CB2 + END_REFLECT_CLASS_STATUS_OFFSET -_023066C4: .word 0x00000CB3 + END_REFLECT_CLASS_STATUS_OFFSET -_023066C8: .word 0x00000CB4 + END_REFLECT_CLASS_STATUS_OFFSET -_023066CC: .word 0x00000CB5 + END_REFLECT_CLASS_STATUS_OFFSET -_023066D0: .word 0x00000CBE + END_REFLECT_CLASS_STATUS_OFFSET -_023066D4: .word 0x00000CC1 + END_REFLECT_CLASS_STATUS_OFFSET - arm_func_end EndReflectClassStatus - - arm_func_start TryRemoveSnatchedMonsterFromDungeonStruct -TryRemoveSnatchedMonsterFromDungeonStruct: ; 0x023066D8 - stmdb sp!, {r4, lr} - mov r4, r1 - mov r0, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r4, pc} - ldr r0, [r4, #0xb4] - ldrb r0, [r0, #0xd8] - cmp r0, #3 - ldmneia sp!, {r4, pc} - ldr r1, _02306724 ; =DUNGEON_PTR - mov r2, #0 - ldr r0, [r1] - add r0, r0, #0x19000 -#ifdef JAPAN - str r2, [r0, #0x860] - ldr r0, [r1] - add r0, r0, #0x19000 - str r2, [r0, #0x868] -#else - str r2, [r0, #0x904] - ldr r0, [r1] - add r0, r0, #0x19000 - str r2, [r0, #0x90c] -#endif - ldmia sp!, {r4, pc} - .align 2, 0 -_02306724: .word DUNGEON_PTR - arm_func_end TryRemoveSnatchedMonsterFromDungeonStruct - - arm_func_start EndCurseClassStatus -EndCurseClassStatus: ; 0x02306728 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r7, r1 - mov r8, r0 - mov r0, r7 - mov r6, r2 - mov r5, r3 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - mov r0, #0 - ldr r4, [r7, #0xb4] - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r0, [r4, #0xd8] - cmp r0, #7 - addls pc, pc, r0, lsl #2 - b _02306894 -_02306770: ; jump table - b _02306894 ; case 0 - b _02306790 ; case 1 - b _023067D4 ; case 2 - b _023067AC ; case 3 - b _02306830 ; case 4 - b _02306868 ; case 5 - b _02306880 ; case 6 - b _02306894 ; case 7 -_02306790: - cmp r6, #1 - cmpne r5, #0 - beq _02306894 - ldr r1, _023068A8 ; =0x00000C95 - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - b _02306894 -_023067AC: - cmp r6, #3 - cmpne r5, #0 - beq _023067C4 - ldr r1, _023068AC ; =0x00000C96 - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser -_023067C4: - mov r0, r8 - mov r1, r7 - bl TryRemoveSnatchedMonsterFromDungeonStruct - b _02306894 -_023067D4: - mov r1, #0 - mov r0, r7 - strb r1, [r4, #0xd8] - bl GetIdleAnimationId - mov r1, r0 - mov r0, r7 - bl ov29_02304830 - ldr r1, _023068B0 ; =DUNGEON_PTR - mov r0, #0 - ldr r1, [r1] - cmp r6, #2 - add r1, r1, #0x3000 -#ifdef JAPAN - strb r0, [r1, #0xd94] -#else - strb r0, [r1, #0xe38] -#endif - beq _02306894 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - cmp r5, #0 - beq _02306894 - ldr r1, _023068B4 ; =0x00000CA5 - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - b _02306894 -_02306830: - mov r1, #0 - mov r0, r7 - strb r1, [r4, #0xd8] - bl ov29_022FB984 - cmp r5, #0 - beq _02306854 - ldr r1, _023068B8 ; =0x00000CBF - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser -_02306854: - ldr r0, _023068B0 ; =DUNGEON_PTR - mov r1, #1 - ldr r0, [r0] - strb r1, [r0, #0xe] - b _02306894 -_02306868: - cmp r5, #0 - beq _02306894 - ldr r1, _023068BC ; =0x00000CC2 - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - b _02306894 -_02306880: - cmp r5, #0 - beq _02306894 - ldr r1, _023068C0 ; =0x00000CC3 - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser -_02306894: - mov r1, #0 - mov r0, r7 - strb r1, [r4, #0xd8] - bl UpdateStatusIconFlags - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -#ifdef JAPAN -#define END_CURSE_CLASS_OFFSET -0x2C0 -#else -#define END_CURSE_CLASS_OFFSET 0 -#endif -_023068A8: .word 0x00000C95 + END_CURSE_CLASS_OFFSET -_023068AC: .word 0x00000C96 + END_CURSE_CLASS_OFFSET -_023068B0: .word DUNGEON_PTR -_023068B4: .word 0x00000CA5 + END_CURSE_CLASS_OFFSET -_023068B8: .word 0x00000CBF + END_CURSE_CLASS_OFFSET -_023068BC: .word 0x00000CC2 + END_CURSE_CLASS_OFFSET -_023068C0: .word 0x00000CC3 + END_CURSE_CLASS_OFFSET - arm_func_end EndCurseClassStatus - - arm_func_start EndLeechSeedClassStatus -EndLeechSeedClassStatus: ; 0x023068C4 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - mov r0, r5 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - ldr r4, [r5, #0xb4] - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r0, [r4, #0xe0] - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0230692C -_02306900: ; jump table - b _0230692C ; case 0 - b _02306910 ; case 1 - b _02306920 ; case 2 - b _0230692C ; case 3 -_02306910: - ldr r1, _02306948 ; =0x00000C94 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _0230692C -_02306920: - ldr r1, _0230694C ; =0x00000CAF - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser -_0230692C: - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0xe0] - mov r1, #0xff - strb r1, [r4, #0xe8] - bl UpdateStatusIconFlags - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_02306948: .word 0x000009D4 -_0230694C: .word 0x000009EF -#else -_02306948: .word 0x00000C94 -_0230694C: .word 0x00000CAF -#endif - arm_func_end EndLeechSeedClassStatus - - arm_func_start EndSureShotClassStatus -EndSureShotClassStatus: ; 0x02306950 -#ifdef JAPAN -#define END_SURE_SHOT_CLASS_STATUS_OFFSET -0x2C0 -#else -#define END_SURE_SHOT_CLASS_STATUS_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - mov r0, r5 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - ldr r4, [r5, #0xb4] - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r0, [r4, #0xec] - cmp r0, #5 - addls pc, pc, r0, lsl #2 - b _023069E0 -_0230698C: ; jump table - b _023069E0 ; case 0 - b _023069A4 ; case 1 - b _023069B4 ; case 2 - b _023069C4 ; case 3 - b _023069D4 ; case 4 - b _023069E0 ; case 5 -_023069A4: - mov r0, r5 - mov r1, #0xca0 + END_SURE_SHOT_CLASS_STATUS_OFFSET - bl LogMessageByIdWithPopupCheckUser - b _023069E0 -_023069B4: - ldr r1, _023069F4 ; =0x00000CA1 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _023069E0 -_023069C4: - ldr r1, _023069F8 ; =0x00000CA2 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _023069E0 -_023069D4: - ldr r1, _023069FC ; =0x00000CA3 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser -_023069E0: - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0xec] - bl UpdateStatusIconFlags - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_023069F4: .word 0x00000CA1 + END_SURE_SHOT_CLASS_STATUS_OFFSET -_023069F8: .word 0x00000CA2 + END_SURE_SHOT_CLASS_STATUS_OFFSET -_023069FC: .word 0x00000CA3 + END_SURE_SHOT_CLASS_STATUS_OFFSET - arm_func_end EndSureShotClassStatus - - arm_func_start EndInvisibleClassStatus -EndInvisibleClassStatus: ; 0x02306A00 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r1 - mov r4, #0 - mov r0, r8 - mov r7, r2 - mov r5, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - mov r0, r4 - ldr r6, [r8, #0xb4] - mov r1, r8 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r0, [r6, #0xef] - cmp r0, #5 - addls pc, pc, r0, lsl #2 - b _02306ADC -_02306A48: ; jump table - b _02306ADC ; case 0 - b _02306A60 ; case 1 - b _02306A84 ; case 2 - b _02306A74 ; case 3 - b _02306AC4 ; case 4 - b _02306ADC ; case 5 -_02306A60: - ldr r1, _02306B18 ; =0x00000CA8 - mov r0, r8 - mov r4, #1 - bl LogMessageByIdWithPopupCheckUser - b _02306ADC -_02306A74: - ldr r1, _02306B1C ; =0x00000CB8 - mov r0, r8 - bl LogMessageByIdWithPopupCheckUser - b _02306ADC -_02306A84: - ldrsh r1, [r6, #2] - mov r0, r8 - bl GetMonsterApparentId - strh r0, [r6, #4] - ldrsh r0, [r6, #4] - bl DungeonGetSpriteIndex - strh r0, [r8, #0xa8] - mov r0, r8 - bl GetIdleAnimationId - mov r1, r0 - mov r0, r8 - bl ov29_02304830 - ldr r1, _02306B20 ; =0x00000CB6 - mov r0, r8 - bl LogMessageByIdWithPopupCheckUser - b _02306ADC -_02306AC4: - cmp r7, #0 - bne _02306AD8 - ldr r1, _02306B24 ; =0x00000CAC - mov r0, r8 - bl LogMessageByIdWithPopupCheckUser -_02306AD8: - mov r5, #1 -_02306ADC: - mov r1, #0 - mov r0, r8 - strb r1, [r6, #0xef] - bl UpdateStatusIconFlags - cmp r4, #0 - beq _02306AFC - mov r0, #1 - bl HandleShopTransaction -_02306AFC: - cmp r7, #0 - ldmneia sp!, {r4, r5, r6, r7, r8, pc} - cmp r5, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - mov r0, r8 - bl EnsureCanStandCurrentTile - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -#ifdef JAPAN -#define END_INVISIBLE_CLASS_OFFSET -0x2C0 -#else -#define END_INVISIBLE_CLASS_OFFSET 0 -#endif -_02306B18: .word 0x00000CA8 + END_INVISIBLE_CLASS_OFFSET -_02306B1C: .word 0x00000CB8 + END_INVISIBLE_CLASS_OFFSET -_02306B20: .word 0x00000CB6 + END_INVISIBLE_CLASS_OFFSET -_02306B24: .word 0x00000CAC + END_INVISIBLE_CLASS_OFFSET - arm_func_end EndInvisibleClassStatus - - arm_func_start EndBlinkerClassStatus -EndBlinkerClassStatus: ; 0x02306B28 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - mov r0, r5 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - ldr r4, [r5, #0xb4] - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r0, [r4, #0xf1] - cmp r0, #5 - addls pc, pc, r0, lsl #2 - b _02306BB8 -_02306B64: ; jump table - b _02306BB8 ; case 0 - b _02306B7C ; case 1 - b _02306B8C ; case 2 - b _02306B9C ; case 3 - b _02306BAC ; case 4 - b _02306BB8 ; case 5 -_02306B7C: - ldr r1, _02306BE8 ; =0x00000CA9 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306BB8 -_02306B8C: - ldr r1, _02306BEC ; =0x00000CAA - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306BB8 -_02306B9C: - ldr r1, _02306BF0 ; =0x00000CAB - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02306BB8 -_02306BAC: - ldr r1, _02306BF4 ; =0x00000CAD - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser -_02306BB8: - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0xf1] - bl UpdateStatusIconFlags - ldrb r0, [r4, #7] - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0x31 - bl AdvanceFrame - bl UpdateTrapsVisibility - bl UpdateMinimap - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -#define END_BLINKER_CLASS_OFFSET -0x2C0 -#else -#define END_BLINKER_CLASS_OFFSET 0 -#endif -_02306BE8: .word 0x00000CA9 + END_BLINKER_CLASS_OFFSET -_02306BEC: .word 0x00000CAA + END_BLINKER_CLASS_OFFSET -_02306BF0: .word 0x00000CAB + END_BLINKER_CLASS_OFFSET -_02306BF4: .word 0x00000CAD + END_BLINKER_CLASS_OFFSET - arm_func_end EndBlinkerClassStatus - - arm_func_start EndMuzzledStatus -EndMuzzledStatus: ; 0x02306BF8 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - mov r0, r5 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - ldr r4, [r5, #0xb4] - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r0, [r4, #0xf3] - cmp r0, #0 - beq _02306C4C - cmp r0, #1 - beq _02306C40 - cmp r0, #2 - b _02306C4C -_02306C40: - ldr r1, _02306C60 ; =0x00000CB9 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser -_02306C4C: - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0xf3] - bl UpdateStatusIconFlags - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_02306C60: .word 0x000009F9 -#else -_02306C60: .word 0x00000CB9 -#endif - arm_func_end EndMuzzledStatus - - arm_func_start EndMiracleEyeStatus -EndMiracleEyeStatus: ; 0x02306C64 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - mov r0, r5 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - ldr r4, [r5, #0xb4] - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r0, [r4, #0xf5] - cmp r0, #0 - beq _02306CB8 - cmp r0, #1 - beq _02306CAC - cmp r0, #2 - b _02306CB8 -_02306CAC: - ldr r1, _02306CCC ; =0x00000CC4 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser -_02306CB8: - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0xf5] - bl UpdateStatusIconFlags - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_02306CCC: .word 0x00000A04 -#else -_02306CCC: .word 0x00000CC4 -#endif - arm_func_end EndMiracleEyeStatus - - arm_func_start EndMagnetRiseStatus -EndMagnetRiseStatus: ; 0x02306CD0 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r1 - mov r0, r6 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, pc} - mov r4, #0 - ldr r5, [r6, #0xb4] - mov r0, r4 - mov r1, r6 - mov r2, r4 - bl SubstitutePlaceholderStringTags - ldrb r0, [r5, #0xf7] - cmp r0, #0 - beq _02306D2C - cmp r0, #1 - beq _02306D1C - cmp r0, #2 - b _02306D2C -_02306D1C: - ldr r1, _02306D50 ; =0x00000CC5 - mov r0, r6 - bl LogMessageByIdWithPopupCheckUser - mov r4, #1 -_02306D2C: - mov r1, #0 - mov r0, r6 - strb r1, [r5, #0xf7] - bl UpdateStatusIconFlags - cmp r4, #0 - ldmeqia sp!, {r4, r5, r6, pc} - mov r0, r6 - bl ov29_02321134 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -#ifdef JAPAN -_02306D50: .word 0x00000A05 -#else -_02306D50: .word 0x00000CC5 -#endif - arm_func_end EndMagnetRiseStatus - - arm_func_start ov29_02306D54 -ov29_02306D54: ; 0x02306D54 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r8, #0 - ldr r4, _02306DC8 ; =DUNGEON_PTR - mov sb, r0 - mov r5, r8 - mov r6, #1 - mov r7, r8 -_02306D70: - ldr r0, [r4] - add r0, r0, r8, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r1, [r0, #0xad4] -#else - ldr r1, [r0, #0xb78] -#endif - cmp r1, #0 - moveq r0, r7 - beq _02306DA0 - ldr r0, [r1] - cmp r0, #1 - moveq r0, r6 - movne r0, r5 - and r0, r0, #0xff -_02306DA0: - cmp r0, #0 - beq _02306DB0 - mov r0, sb - bl EndMagnetRiseStatus -_02306DB0: - add r0, r8, #1 - mov r0, r0, lsl #0x10 - mov r8, r0, asr #0x10 - cmp r8, #0x14 - blt _02306D70 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_02306DC8: .word DUNGEON_PTR - arm_func_end ov29_02306D54 - - arm_func_start ov29_02306DCC -ov29_02306DCC: ; 0x02306DCC - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #4 - mov r8, r1 - mov r4, #0 - mov sb, r0 - mov r0, r8 - mov sl, r4 - mov r5, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - mov r0, r4 - beq _02306EF8 - mov r1, sb - mov r2, r0 - ldr r6, [sb, #0xb4] - ldr r7, [r8, #0xb4] - bl SubstitutePlaceholderStringTags - mov r1, r8 - mov r0, #1 - mov r2, r4 - bl SubstitutePlaceholderStringTags - ldrb r0, [r6, #0xbd] - cmp r0, #0 - moveq r0, r4 - beq _02306EF8 - cmp r0, #6 - addls pc, pc, r0, lsl #2 - b _02306E9C -_02306E3C: ; jump table - b _02306E9C ; case 0 - b _02306E58 ; case 1 - b _02306E9C ; case 2 - b _02306E58 ; case 3 - b _02306E58 ; case 4 - b _02306E7C ; case 5 - b _02306E9C ; case 6 -_02306E58: - mov r2, #1 - mov r0, sb - mov r1, r8 - mov r3, r2 - str r4, [sp] - bl ov29_02311C28 - mov sl, r0 - mov r4, #1 - b _02306E9C -_02306E7C: - mov r2, r4 - mov r0, sb - mov r1, r8 - mov r3, r2 - str r2, [sp] - bl ov29_02311C28 - mov sl, r0 - mov r4, #1 -_02306E9C: - cmp sl, #0 - beq _02306EBC - ldrb r1, [r6, #0xbd] - orr r0, r5, #0x11 - and r5, r0, #0xff - strb r1, [r7, #0xbd] - ldrb r0, [r6, #0xbe] - strb r0, [r7, #0xbe] -_02306EBC: - cmp r4, #0 - orrne r1, r5, #1 - movne r0, #0 - strneb r0, [r6, #0xbd] - andne r5, r1, #0xff - cmp r4, #0 - beq _02306EE4 - mov r0, sb - mov r1, #0x378 - bl ChangeMonsterAnimationToIdle -_02306EE4: - mov r0, sb - bl UpdateStatusIconFlags - mov r0, r8 - bl UpdateStatusIconFlags - mov r0, r5 -_02306EF8: - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end ov29_02306DCC - - arm_func_start ov29_02306F00 -ov29_02306F00: ; 0x02306F00 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #4 - mov sl, #0 - mov sb, r0 - mov r8, r1 - mov r4, sl - mov r5, sl - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, sl - beq _02307070 - mov r0, r8 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, sl - beq _02307070 - ldr r6, [sb, #0xb4] - ldr r7, [r8, #0xb4] - ldrb r0, [r6, #0xbf] - cmp r0, #0 - mov r0, sl - beq _02307070 - mov r1, sb - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r8 - mov r0, #1 - mov r2, sl - bl SubstitutePlaceholderStringTags - ldrb r0, [r6, #0xbf] - cmp r0, #5 - addls pc, pc, r0, lsl #2 - b _0230701C -_02306F84: ; jump table - b _0230701C ; case 0 - b _02306FFC ; case 1 - b _02306F9C ; case 2 - b _02306FBC ; case 3 - b _02306FDC ; case 4 - b _0230701C ; case 5 -_02306F9C: - mov r0, sb - mov r1, r8 - mov r2, sl - mov r3, #1 - bl TryInflictPoisonedStatus - mov sl, r0 - mov r4, #1 - b _0230701C -_02306FBC: - mov r0, sb - mov r1, r8 - mov r2, sl - mov r3, #1 - bl TryInflictBadlyPoisonedStatus - mov sl, r0 - mov r4, #1 - b _0230701C -_02306FDC: - mov r0, sb - mov r1, r8 - mov r2, sl - mov r3, #1 - bl TryInflictParalysisStatus - mov sl, r0 - mov r4, #1 - b _0230701C -_02306FFC: - mov r2, sl - mov r4, #1 - mov r0, sb - mov r1, r8 - mov r3, r2 - str r4, [sp] - bl TryInflictBurnStatus - mov sl, r0 -_0230701C: - cmp sl, #0 - beq _02307048 - add r3, r6, #0xbf - add r2, r7, #0xbf - mov r1, #4 -_02307030: - ldrb r0, [r3], #1 - subs r1, r1, #1 - strb r0, [r2], #1 - bne _02307030 - orr r0, r5, #0x11 - and r5, r0, #0xff -_02307048: - cmp r4, #0 - orrne r0, r5, #1 - movne r1, #0 - andne r5, r0, #0xff - mov r0, sb - strneb r1, [r6, #0xbf] - bl UpdateStatusIconFlags - mov r0, r8 - bl UpdateStatusIconFlags - mov r0, r5 -_02307070: - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end ov29_02306F00 - - arm_func_start ov29_02307078 -ov29_02307078: ; 0x02307078 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov r4, #0 - mov sb, r0 - mov r8, r1 - mov sl, r4 - mov r5, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - mov r0, r8 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - ldr r6, [sb, #0xb4] - ldr r7, [r8, #0xb4] - ldrb r1, [r6, #0xc4] - cmp r1, #3 - cmpne r1, #4 - beq _023070E0 - ldrb r0, [r7, #0xc4] - add r0, r0, #0xfd - and r0, r0, #0xff - cmp r0, #1 - bhi _023070E8 -_023070E0: - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} -_023070E8: - cmp r1, #7 - addls pc, pc, r1, lsl #2 - b _0230714C -_023070F4: ; jump table - b _0230714C ; case 0 - b _0230714C ; case 1 - b _02307114 ; case 2 - b _0230714C ; case 3 - b _0230714C ; case 4 - b _0230714C ; case 5 - b _0230714C ; case 6 - b _02307130 ; case 7 -_02307114: - mov r0, sb - mov r1, r8 - mov r2, #1 - bl TryInflictShadowHoldStatus - mov sl, r0 - mov r4, #1 - b _0230714C -_02307130: - mov r0, sb - mov r1, r8 - mov r2, #0x7e - mov r3, #1 - bl TryInflictConstrictionStatus - mov sl, r0 - mov r4, #1 -_0230714C: - cmp sl, #0 - beq _0230716C - add r0, r6, #0xc4 - add r7, r7, #0xc4 - ldmia r0, {r0, r1, r2} - orr r3, r5, #0x11 - stmia r7, {r0, r1, r2} - and r5, r3, #0xff -_0230716C: - cmp r4, #0 - orrne r0, r5, #1 - movne r1, #0 - andne r5, r0, #0xff - mov r0, sb - strneb r1, [r6, #0xc4] - bl UpdateStatusIconFlags - mov r0, r8 - bl UpdateStatusIconFlags - mov r0, r5 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end ov29_02307078 - - arm_func_start ov29_02307198 -ov29_02307198: ; 0x02307198 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #8 - mov r4, #0 - mov sb, r0 - mov r8, r1 - mov sl, r4 - mov r5, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, r4 - beq _02307374 - mov r0, r8 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, r4 - beq _02307374 - ldr r6, [sb, #0xb4] - ldr r7, [r8, #0xb4] - ldrb r0, [r6, #0xd0] - cmp r0, #0 - mov r0, r4 - beq _02307374 - mov r1, sb - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r8 - mov r0, #1 - mov r2, r4 - bl SubstitutePlaceholderStringTags - ldrb r0, [r6, #0xd0] - cmp r0, #8 - addls pc, pc, r0, lsl #2 - b _0230731C -_0230721C: ; jump table - b _0230731C ; case 0 - b _02307300 ; case 1 - b _02307240 ; case 2 - b _0230729C ; case 3 - b _02307260 ; case 4 - b _02307280 ; case 5 - b _023072E4 ; case 6 - b _023072C4 ; case 7 - b _0230731C ; case 8 -_02307240: - mov r0, sb - mov r1, r8 - mov r2, r4 - mov r3, #1 - bl TryInflictConfusedStatus - mov sl, r0 - mov r4, #1 - b _0230731C -_02307260: - mov r0, sb - mov r1, r8 - mov r2, r4 - mov r3, #1 - bl TryInflictCoweringStatus - mov sl, r0 - mov r4, #1 - b _0230731C -_02307280: - mov r0, sb - mov r1, r8 - mov r2, #1 - bl TryInflictTauntStatus - mov sl, r0 - mov r4, #1 - b _0230731C -_0230729C: - mov r3, r4 - mov r0, sb - mov r1, r8 - str r3, [sp] - mov r2, #1 - str r2, [sp, #4] - bl TryInflictPausedStatus - mov sl, r0 - mov r4, #1 - b _0230731C -_023072C4: - mov r0, sb - mov r1, r8 - mov r2, r4 - mov r3, #1 - bl TryInflictInfatuatedStatus - mov sl, r0 - mov r4, #1 - b _0230731C -_023072E4: - mov r0, sb - mov r1, r8 - mov r2, #1 - bl TryInflictEncoreStatus - mov sl, r0 - mov r4, #1 - b _0230731C -_02307300: - mov r0, sb - mov r1, r8 - mov r2, r4 - mov r3, #1 - bl TryInflictCringeStatus - mov sl, r0 - mov r4, #1 -_0230731C: - cmp sl, #0 - beq _0230733C - ldrb r1, [r6, #0xd0] - orr r0, r5, #0x11 - and r5, r0, #0xff - strb r1, [r7, #0xd0] - ldrb r0, [r6, #0xd1] - strb r0, [r7, #0xd1] -_0230733C: - cmp r4, #0 - movne r0, #0 - orrne r1, r5, #1 - strneb r0, [r6, #0xd0] - mov r0, sb - andne r5, r1, #0xff - bl UpdateStatusIconFlags - mov r0, r8 - bl UpdateStatusIconFlags - mov r0, sb - bl CalcSpeedStageWrapper - mov r0, r8 - bl CalcSpeedStageWrapper - mov r0, r5 -_02307374: - add sp, sp, #8 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end ov29_02307198 - - arm_func_start ov29_0230737C -ov29_0230737C: ; 0x0230737C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #4 - mov r4, #0 - mov sb, r0 - mov r8, r1 - mov r5, r4 - mov r6, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, r4 - beq _023076B4 - mov r0, r8 - bl EntityIsValid__02305C04 - cmp r0, #0 - mov r0, r4 - beq _023076B4 - mov r1, sb - mov r2, r0 - ldr r7, [sb, #0xb4] - ldr sl, [r8, #0xb4] - bl SubstitutePlaceholderStringTags - mov r1, r8 - mov r0, #1 - mov r2, r4 - bl SubstitutePlaceholderStringTags - ldrb r0, [r7, #0xd8] - cmp r0, #7 - addls pc, pc, r0, lsl #2 - b _0230749C -_023073F0: ; jump table - b _0230749C ; case 0 - b _02307410 ; case 1 - b _0230741C ; case 2 - b _0230749C ; case 3 - b _02307440 ; case 4 - b _02307460 ; case 5 - b _02307480 ; case 6 - b _0230749C ; case 7 -_02307410: - mov r5, #1 - mov r4, r5 - b _0230749C -_0230741C: - mov r2, r4 - mov r4, #1 - mov r0, sb - mov r1, r8 - mov r3, r2 - str r4, [sp] - bl TryInflictDecoyStatus - mov r5, r0 - b _0230749C -_02307440: - mov r0, sb - mov r1, r8 - mov r2, r4 - mov r3, #1 - bl TryInflictGastroAcidStatus - mov r5, r0 - mov r4, #1 - b _0230749C -_02307460: - mov r0, sb - mov r1, r8 - mov r2, r4 - mov r3, #1 - bl TryInflictHealBlockStatus - mov r5, r0 - mov r4, #1 - b _0230749C -_02307480: - mov r0, sb - mov r1, r8 - mov r2, r4 - mov r3, #1 - bl TryInflictEmbargoStatus - mov r5, r0 - mov r4, #1 -_0230749C: - ldrb r0, [r7, #0xd8] - cmp r0, #6 - addls pc, pc, r0, lsl #2 - b _023076A0 -_023074AC: ; jump table - b _023076A0 ; case 0 - b _023074C8 ; case 1 - b _02307528 ; case 2 - b _023076A0 ; case 3 - b _02307554 ; case 4 - b _023075D4 ; case 5 - b _0230763C ; case 6 -_023074C8: - cmp r5, #0 - beq _02307500 - mov r0, sb - mov r1, r8 - bl TryRemoveSnatchedMonsterFromDungeonStruct - add r3, r7, #0xd8 - add r2, sl, #0xd8 - mov r1, #5 -_023074E8: - ldrb r0, [r3], #1 - subs r1, r1, #1 - strb r0, [r2], #1 - bne _023074E8 - orr r0, r6, #0x11 - and r6, r0, #0xff -_02307500: - cmp r4, #0 - beq _023076A0 - mov r0, r8 - mov r1, sb - mov r2, #1 - mov r3, #0 - bl EndCurseClassStatus - orr r0, r6, #1 - and r6, r0, #0xff - b _023076A0 -_02307528: - cmp r5, #0 - beq _023076A0 - mov r3, #0 - mov r0, sb - mov r1, r8 - mov r2, #1 - str r3, [sp] - bl TryInflictDecoyStatus - orr r0, r6, #0x11 - and r6, r0, #0xff - b _023076A0 -_02307554: - cmp r5, #0 - beq _023075AC - mov r0, sb - mov r1, r8 - bl TryRemoveSnatchedMonsterFromDungeonStruct - add r3, r7, #0xd8 - add r2, sl, #0xd8 - mov r1, #5 -_02307574: - ldrb r0, [r3], #1 - subs r1, r1, #1 - strb r0, [r2], #1 - bne _02307574 - ldr r1, _023076BC ; =DUNGEON_PTR - mov r0, r8 - ldr r1, [r1] - mov r2, #1 - strb r2, [r1, #0xe] - bl ov29_022FB984 - mov r0, r8 - bl UpdateStatusIconFlags - orr r0, r6, #0x11 - and r6, r0, #0xff -_023075AC: - cmp r4, #0 - beq _023076A0 - mov r0, r8 - mov r1, sb - mov r2, #4 - mov r3, #0 - bl EndCurseClassStatus - orr r0, r6, #1 - and r6, r0, #0xff - b _023076A0 -_023075D4: - cmp r5, #0 - beq _02307614 - mov r0, sb - mov r1, r8 - bl TryRemoveSnatchedMonsterFromDungeonStruct - add r3, r7, #0xd8 - add r2, sl, #0xd8 - mov r1, #5 -_023075F4: - ldrb r0, [r3], #1 - subs r1, r1, #1 - strb r0, [r2], #1 - bne _023075F4 - mov r0, r8 - bl UpdateStatusIconFlags - orr r0, r6, #0x11 - and r6, r0, #0xff -_02307614: - cmp r4, #0 - beq _023076A0 - mov r0, r8 - mov r1, sb - mov r2, #5 - mov r3, #0 - bl EndCurseClassStatus - orr r0, r6, #1 - and r6, r0, #0xff - b _023076A0 -_0230763C: - cmp r5, #0 - beq _0230767C - mov r0, sb - mov r1, r8 - bl TryRemoveSnatchedMonsterFromDungeonStruct - add r3, r7, #0xd8 - add r2, sl, #0xd8 - mov r1, #5 -_0230765C: - ldrb r0, [r3], #1 - subs r1, r1, #1 - strb r0, [r2], #1 - bne _0230765C - mov r0, r8 - bl UpdateStatusIconFlags - orr r0, r6, #0x11 - and r6, r0, #0xff -_0230767C: - cmp r4, #0 - beq _023076A0 - mov r0, r8 - mov r1, sb - mov r2, #6 - mov r3, #0 - bl EndCurseClassStatus - orr r0, r6, #1 - and r6, r0, #0xff -_023076A0: - mov r0, sb - bl UpdateStatusIconFlags - mov r0, r8 - bl UpdateStatusIconFlags - mov r0, r6 -_023076B4: - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_023076BC: .word DUNGEON_PTR - arm_func_end ov29_0230737C - - arm_func_start ov29_023076C0 -ov29_023076C0: ; 0x023076C0 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov r4, #0 - mov sb, r0 - mov r8, r1 - mov sl, r4 - mov r5, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - mov r0, r8 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - ldr r6, [sb, #0xb4] - ldr r7, [r8, #0xb4] - ldrb r0, [r6, #0xe0] - cmp r0, #0 - mov r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - mov r1, sb - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r8 - mov r0, #1 - mov r2, r4 - bl SubstitutePlaceholderStringTags - ldrb r0, [r6, #0xe0] - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0230776C -_02307740: ; jump table - b _0230776C ; case 0 - b _02307750 ; case 1 - b _0230776C ; case 2 - b _0230776C ; case 3 -_02307750: - mov r0, sb - mov r1, r8 - mov r2, r4 - mov r3, #1 - bl TryInflictLeechSeedStatus - mov sl, r0 - mov r4, #1 -_0230776C: - cmp sl, #0 - beq _023077CC - add r0, r6, #0xe0 - add r3, r7, #0xe0 - ldmia r0, {r0, r1, r2} - stmia r3, {r0, r1, r2} - mov r0, #0xff - strb r0, [r7, #0xe8] - ldr r2, _023077F8 ; =DUNGEON_PTR - mov r0, #0 -_02307794: - ldr r1, [r2] - add r1, r1, r0, lsl #2 - add r1, r1, #0x12000 -#ifdef JAPAN - ldr r1, [r1, #0xad4] -#else - ldr r1, [r1, #0xb78] -#endif - cmp sb, r1 - streqb r0, [r7, #0xe8] - ldreq r1, [sb, #0xb4] - add r0, r0, #1 - ldreq r1, [r1, #0xb0] - streq r1, [r7, #0xe4] - cmp r0, #0x14 - blt _02307794 - orr r0, r5, #0x11 - and r5, r0, #0xff -_023077CC: - cmp r4, #0 - orrne r0, r5, #1 - movne r1, #0 - andne r5, r0, #0xff - mov r0, sb - strneb r1, [r6, #0xe0] - bl UpdateStatusIconFlags - mov r0, r8 - bl UpdateStatusIconFlags - mov r0, r5 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_023077F8: .word DUNGEON_PTR - arm_func_end ov29_023076C0 - - arm_func_start ov29_023077FC -ov29_023077FC: ; 0x023077FC - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov r4, #0 - mov sb, r0 - mov r8, r1 - mov sl, r4 - mov r5, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - mov r0, r8 - bl EntityIsValid__02305C04 - cmp r0, #0 - mov r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - mov r1, sb - mov r2, r0 - ldr r6, [sb, #0xb4] - ldr r7, [r8, #0xb4] - bl SubstitutePlaceholderStringTags - mov r1, r8 - mov r0, #1 - mov r2, r4 - bl SubstitutePlaceholderStringTags - ldrb r0, [r6, #0xec] - cmp r0, #5 - addls pc, pc, r0, lsl #2 - b _023078A0 -_0230786C: ; jump table - b _023078A0 ; case 0 - b _023078A0 ; case 1 - b _02307884 ; case 2 - b _023078A0 ; case 3 - b _023078A0 ; case 4 - b _023078A0 ; case 5 -_02307884: - mov r0, sb - mov r1, r8 - mov r2, r4 - mov r3, #1 - bl TryInflictWhifferStatus - mov sl, r0 - mov r4, #1 -_023078A0: - cmp sl, #0 - beq _023078C0 - ldrb r1, [r6, #0xec] - orr r0, r5, #0x11 - and r5, r0, #0xff - strb r1, [r7, #0xec] - ldrb r0, [r6, #0xed] - strb r0, [r7, #0xed] -_023078C0: - cmp r4, #0 - orrne r0, r5, #1 - movne r1, #0 - andne r5, r0, #0xff - mov r0, sb - strneb r1, [r6, #0xec] - bl UpdateStatusIconFlags - mov r0, r8 - bl UpdateStatusIconFlags - mov r0, r5 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end ov29_023077FC - - arm_func_start TransferNegativeBlinkerClassStatus -TransferNegativeBlinkerClassStatus: ; 0x023078EC - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov r4, #0 - mov sb, r0 - mov r8, r1 - mov sl, r4 - mov r5, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - mov r0, r8 - bl EntityIsValid__02305C04 - cmp r0, #0 - mov r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - mov r1, sb - mov r2, r0 - ldr r6, [sb, #0xb4] - ldr r7, [r8, #0xb4] - bl SubstitutePlaceholderStringTags - mov r1, r8 - mov r0, #1 - mov r2, r4 - bl SubstitutePlaceholderStringTags - ldrb r0, [r6, #0xf1] - cmp r0, #5 - addls pc, pc, r0, lsl #2 - b _023079C4 -_0230795C: ; jump table - b _023079C4 ; case 0 - b _02307974 ; case 1 - b _02307994 ; case 2 - b _023079C4 ; case 3 - b _023079B0 ; case 4 - b _023079C4 ; case 5 -_02307974: - mov r0, sb - mov r1, r8 - mov r2, #1 - mov r3, r4 - bl TryInflictBlinkerStatus - mov sl, r0 - mov r4, #1 - b _023079C4 -_02307994: - mov r0, sb - mov r1, r8 - mov r2, #1 - bl TryInflictCrossEyedStatus - mov sl, r0 - mov r4, #1 - b _023079C4 -_023079B0: - mov r0, sb - mov r1, r8 - bl TryInflictDropeyeStatus - mov sl, r0 - mov r4, #1 -_023079C4: - cmp sl, #0 - beq _023079E4 - ldrb r1, [r6, #0xf1] - orr r0, r5, #0x11 - and r5, r0, #0xff - strb r1, [r7, #0xf1] - ldrb r0, [r6, #0xf2] - strb r0, [r7, #0xf2] -_023079E4: - cmp r4, #0 - orrne r0, r5, #1 - movne r1, #0 - andne r5, r0, #0xff - mov r0, sb - strneb r1, [r6, #0xf1] - bl UpdateStatusIconFlags - mov r0, r8 - bl UpdateStatusIconFlags - ldrb r0, [r6, #7] - cmp r0, #0 - beq _02307A24 - mov r0, #0x31 - bl AdvanceFrame - bl UpdateTrapsVisibility - bl UpdateMinimap -_02307A24: - mov r0, r5 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end TransferNegativeBlinkerClassStatus - - arm_func_start ov29_02307A2C -ov29_02307A2C: ; 0x02307A2C - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov r4, #0 - mov sl, r0 - mov sb, r1 - mov r5, r4 - mov r6, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - mov r0, sb - bl EntityIsValid__02305C04 - cmp r0, #0 - mov r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - mov r1, sl - mov r2, r0 - ldr r7, [sl, #0xb4] - ldr r8, [sb, #0xb4] - bl SubstitutePlaceholderStringTags - mov r1, sb - mov r0, #1 - mov r2, r4 - bl SubstitutePlaceholderStringTags - ldrb r0, [r7, #0xf3] - cmp r0, #0 - beq _02307AC0 - cmp r0, #1 - beq _02307AA8 - cmp r0, #2 - b _02307AC0 -_02307AA8: - mov r0, sl - mov r1, sb - mov r2, #1 - bl TryInflictMuzzledStatus - mov r5, r0 - mov r4, #1 -_02307AC0: - cmp r5, #0 - beq _02307AE0 - ldrb r1, [r7, #0xf3] - orr r0, r6, #0x11 - and r6, r0, #0xff - strb r1, [r8, #0xf3] - ldrb r0, [r7, #0xf4] - strb r0, [r8, #0xf4] -_02307AE0: - cmp r4, #0 - orrne r0, r6, #1 - movne r1, #0 - andne r6, r0, #0xff - mov r0, sl - strneb r1, [r7, #0xf3] - bl UpdateStatusIconFlags - mov r0, sb - bl UpdateStatusIconFlags - mov r0, r6 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end ov29_02307A2C - - arm_func_start ov29_02307B0C -ov29_02307B0C: ; 0x02307B0C - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov r4, #0 - mov sl, r0 - mov sb, r1 - mov r5, r4 - mov r6, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - mov r0, sb - bl EntityIsValid__02305C04 - cmp r0, #0 - mov r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - mov r1, sl - mov r2, r0 - ldr r7, [sl, #0xb4] - ldr r8, [sb, #0xb4] - bl SubstitutePlaceholderStringTags - mov r1, sb - mov r0, #1 - mov r2, r4 - bl SubstitutePlaceholderStringTags - ldrb r0, [r7, #0xf5] - cmp r0, #1 - bne _02307B90 - mov r0, sl - mov r1, sb - mov r2, #1 - bl TryInflictMiracleEyeStatus - mov r5, r0 - mov r4, #1 -_02307B90: - cmp r5, #0 - beq _02307BB0 - ldrb r1, [r7, #0xf5] - orr r0, r6, #0x11 - and r6, r0, #0xff - strb r1, [r8, #0xf5] - ldrb r0, [r7, #0xf6] - strb r0, [r8, #0xf6] -_02307BB0: - cmp r4, #0 - orrne r0, r6, #1 - movne r1, #0 - andne r6, r0, #0xff - mov r0, sl - strneb r1, [r7, #0xf5] - bl UpdateStatusIconFlags - mov r0, sb - bl UpdateStatusIconFlags - mov r0, r6 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end ov29_02307B0C - - arm_func_start TryEndPetrifiedOrSleepStatus -TryEndPetrifiedOrSleepStatus: ; 0x02307BDC - stmdb sp!, {r3, r4, r5, r6, lr} - sub sp, sp, #4 - mov r5, r1 - ldr r4, [r5, #0xb4] - mov r6, r0 - ldrb r2, [r4, #0xc4] - mov r3, #0 - cmp r2, #6 - bne _02307C0C - mov r2, #1 - bl EndFrozenClassStatus - mov r3, #1 -_02307C0C: - ldrb r0, [r4, #0xbd] - cmp r0, #1 - ldreqb r0, [r4, #0xbe] - cmpeq r0, #0x7f - bne _02307C3C - mov r3, #1 - mov r0, r6 - mov r1, r5 - mov r2, #0 - str r3, [sp] - bl EndSleepClassStatus - mov r3, #1 -_02307C3C: - mov r0, r3 - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, pc} - arm_func_end TryEndPetrifiedOrSleepStatus - - arm_func_start ov29_02307C48 -ov29_02307C48: ; 0x02307C48 - stmdb sp!, {r4, lr} - mov r4, r0 - ldr ip, [r4, #0xb4] - mov r3, #0 - mov r1, #1 - strb r3, [ip, #0xbd] - mov r2, r1 - strb r3, [ip, #0xbe] - bl ov29_022FA1D8 - mov r0, r4 - bl UpdateStatusIconFlags - ldmia sp!, {r4, pc} - arm_func_end ov29_02307C48 - - arm_func_start EndFrozenStatus -EndFrozenStatus: ; 0x02307C78 - stmdb sp!, {r3, r4, r5, lr} - mov r4, r1 - mov r5, r0 - mov r0, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r3, [r4, #0xb4] - ldrb r0, [r3, #0xc4] - cmp r0, #1 - ldmneia sp!, {r3, r4, r5, pc} - mov r0, #0 - strb r0, [r3, #0xc4] - strb r0, [r3, #0xcc] - mov r1, r4 - mov r2, r0 - strb r0, [r3, #0xcd] - bl SubstitutePlaceholderStringTags - ldr r2, _02307CDC ; =0x00000C9F - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r4 - bl UpdateStatusIconFlags - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_02307CDC: .word 0x000009DF -#else -_02307CDC: .word 0x00000C9F -#endif - arm_func_end EndFrozenStatus - - arm_func_start ResetTypeChanges -ResetTypeChanges: ; 0x02307CE0 - stmdb sp!, {r4, lr} - ldr r4, [r0, #0xb4] - mov r1, #0 - bl TryRestoreRoostTyping - mov r1, #0 - strb r1, [r4, #0xff] - ldrsh r0, [r4, #2] - bl GetType - strb r0, [r4, #0x5e] - ldrsh r0, [r4, #2] - mov r1, #1 - bl GetType - strb r0, [r4, #0x5f] - ldmia sp!, {r4, pc} - arm_func_end ResetTypeChanges - - arm_func_start EndProtectStatus -EndProtectStatus: ; 0x02307D18 - stmdb sp!, {r3, r4, r5, lr} - mov r4, r1 - mov r5, r0 - mov r0, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r0, [r4, #0xb4] - ldrb r0, [r0, #0xd5] - cmp r0, #7 - ldmneia sp!, {r3, r4, r5, pc} - mov r0, r5 - mov r1, r4 - bl EndReflectClassStatus - ldmia sp!, {r3, r4, r5, pc} - arm_func_end EndProtectStatus - - arm_func_start TryRestoreRoostTyping -TryRestoreRoostTyping: ; 0x02307D54 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - bl EntityIsValid__02305C04 - cmp r0, #0 - ldrne r2, [r5, #0xb4] - ldrneb r0, [r2, #0xa9] - cmpne r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - strb r0, [r2, #0xa9] - ldrb r1, [r2, #0xaa] - cmp r4, #0 - strb r1, [r2, #0x5e] - ldrb r1, [r2, #0xab] - strb r1, [r2, #0x5f] - strb r0, [r2, #0xaa] - strb r0, [r2, #0xab] - ldmeqia sp!, {r3, r4, r5, pc} - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r1, _02307DBC ; =0x00000CC8 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_02307DBC: .word 0x00000A08 -#else -_02307DBC: .word 0x00000CC8 -#endif - arm_func_end TryRestoreRoostTyping - - arm_func_start ov29_02307DC0 -ov29_02307DC0: ; 0x02307DC0 -#ifdef JAPAN - ldr r1, [r0, #0xb4] - mov r0, #0 - strb r0, [r1, #0x103] - strb r0, [r1, #0x104] -#else - mov r1, #0 - strb r1, [r0, #0x104] - strb r1, [r0, #0x105] -#endif - bx lr - arm_func_end ov29_02307DC0 - - arm_func_start ov29_02307DD0 -ov29_02307DD0: ; 0x02307DD0 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov r4, #0 -_02307DD8: - ldr r0, _02307EF4 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, r4, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r6, [r0, #0xa94] -#else - ldr r6, [r0, #0xb38] -#endif - mov r0, r6 - bl EntityIsValid__02307EF8 - cmp r0, #0 - beq _02307EE4 - ldr r1, [r6, #0xb4] - ldrb r0, [r1, #0xbd] - cmp r0, #1 - ldreqb r0, [r1, #0xbe] - cmpeq r0, #0x7f - bne _02307EE4 - mov r8, #0 - mov r7, r8 - mov r5, r8 - ldrb sl, [r6, #0x25] - ldr fp, _02307EF4 ; =DUNGEON_PTR - b _02307EBC -_02307E2C: - ldr r0, [fp] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr sb, [r0, #0xa84] -#else - ldr sb, [r0, #0xb28] -#endif - mov r0, sb - bl EntityIsValid__02307EF8 - cmp r0, #0 - beq _02307EB8 - mov r0, sb - mov r1, #0x1f - bl ItemIsActive__02307F1C - cmp r0, #0 - bne _02307EB8 - ldrsh r1, [sb, #4] - ldrsh r0, [r6, #4] - sub r0, r1, r0 - bl abs - cmp r0, #1 - bgt _02307E94 - ldrsh r1, [sb, #6] - ldrsh r0, [r6, #6] - sub r0, r1, r0 - bl abs - cmp r0, #1 - movle r8, #1 - ble _02307EC4 -_02307E94: - mov r0, sb - mov r1, #0x24 - bl ItemIsActive__02307F1C - cmp r0, #0 - beq _02307EB8 - ldrb r0, [sb, #0x25] - cmp sl, r0 - moveq r7, #1 - beq _02307EC4 -_02307EB8: - add r5, r5, #1 -_02307EBC: - cmp r5, #4 - blt _02307E2C -_02307EC4: - cmp r7, #0 - bne _02307ED4 - cmp r8, #0 - movne r7, #1 -_02307ED4: - cmp r7, #0 - beq _02307EE4 - mov r0, r6 - bl ov29_02307C48 -_02307EE4: - add r4, r4, #1 - cmp r4, #0x10 - blt _02307DD8 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02307EF4: .word DUNGEON_PTR - arm_func_end ov29_02307DD0 diff --git a/asm/overlay_29_02306258.s b/asm/overlay_29_02306258.s new file mode 100644 index 00000000..9e491225 --- /dev/null +++ b/asm/overlay_29_02306258.s @@ -0,0 +1,401 @@ + .include "asm/macros.inc" + .include "overlay_29_02306258.inc" + + .text + + arm_func_start EndFrozenClassStatus +EndFrozenClassStatus: ; 0x02306258 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r7, r1 + mov r8, r0 + mov r0, r7 + mov r6, r2 + mov r4, #0 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r4 + ldr r5, [r7, #0xb4] + mov r1, r7 + mov r2, r0 + bl SubstitutePlaceholderStringTags + ldrb r0, [r5, #0xc4] + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _02306398 +_023062A0: ; jump table + b _02306398 ; case 0 + b _023062C4 ; case 1 + b _02306300 ; case 2 + b _02306338 ; case 3 + b _0230635C ; case 4 +#ifdef JAPAN + b _02306300 ; case 5 +#else + b _0230631C ; case 5 +#endif + b _02306380 ; case 6 + b _023062E4 ; case 7 + b _02306398 ; case 8 +_023062C4: + cmp r6, #0 + beq _023062DC + ldr r2, _023063BC ; =0x00000C9F + mov r0, r8 + mov r1, r7 + bl LogMessageByIdWithPopupCheckUserTarget +_023062DC: + mov r4, #1 + b _02306398 +_023062E4: + cmp r6, #0 + beq _02306398 + ldr r2, _023063C0 ; =0x00000C99 + mov r0, r8 + mov r1, r7 + bl LogMessageByIdWithPopupCheckUserTarget + b _02306398 +_02306300: + cmp r6, #0 + beq _02306398 + ldr r2, _023063C4 ; =0x00000C9A + mov r0, r8 + mov r1, r7 + bl LogMessageByIdWithPopupCheckUserTarget + b _02306398 +#ifndef JAPAN +_0230631C: + cmp r6, #0 + beq _02306398 + ldr r2, _023063C8 ; =0x00000C9B + mov r0, r8 + mov r1, r7 + bl LogMessageByIdWithPopupCheckUserTarget + b _02306398 +#endif +_02306338: + cmp r6, #0 + beq _02306350 + ldr r2, _023063CC ; =0x00000C98 + mov r0, r8 + mov r1, r7 + bl LogMessageByIdWithPopupCheckUserTarget +_02306350: + ldr r0, [r5, #0xb4] + bl FreeOtherWrappedMonsters + b _02306398 +_0230635C: + cmp r6, #0 + beq _02306374 + ldr r2, _023063CC ; =0x00000C98 + mov r0, r8 + mov r1, r7 + bl LogMessageByIdWithPopupCheckUserTarget +_02306374: + ldr r0, [r5, #0xb4] + bl FreeOtherWrappedMonsters + b _02306398 +_02306380: + cmp r6, #0 + beq _02306398 + ldr r2, _023063D0 ; =0x00000CBB + mov r0, r8 + mov r1, r7 + bl LogMessageByIdWithPopupCheckUserTarget +_02306398: + mov r1, #0 + mov r0, r7 + strb r1, [r5, #0xc4] + bl UpdateStatusIconFlags + cmp r4, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r7 + bl ov29_022E6798 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +#ifdef JAPAN +#define END_FROZEN_CLASS_STATUS_OFFSET -0x2C0 +#else +#define END_FROZEN_CLASS_STATUS_OFFSET 0 +#endif +_023063BC: .word 0x00000C9F + END_FROZEN_CLASS_STATUS_OFFSET +_023063C0: .word 0x00000C99 + END_FROZEN_CLASS_STATUS_OFFSET +_023063C4: .word 0x00000C9A + END_FROZEN_CLASS_STATUS_OFFSET +#ifndef JAPAN +_023063C8: .word 0x00000C9B +#endif +_023063CC: .word 0x00000C98 + END_FROZEN_CLASS_STATUS_OFFSET +_023063D0: .word 0x00000CBB + END_FROZEN_CLASS_STATUS_OFFSET + arm_func_end EndFrozenClassStatus + + arm_func_start EndCringeClassStatus +EndCringeClassStatus: ; 0x023063D4 +#ifdef JAPAN +#define END_CRINGE_CLASS_STATUS_OFFSET -0x2C0 +#else +#define END_CRINGE_CLASS_STATUS_OFFSET 0 +#endif + stmdb sp!, {r4, r5, r6, lr} + mov r5, r1 + mov r6, r0 + mov r0, r5 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, #0 + ldr r4, [r5, #0xb4] + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + ldrb r0, [r4, #0xd0] + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _023064C0 +_02306414: ; jump table + b _023064C0 ; case 0 + b _023064B0 ; case 1 + b _02306438 ; case 2 + b _02306474 ; case 3 + b _0230644C ; case 4 + b _02306460 ; case 5 + b _0230649C ; case 6 + b _02306488 ; case 7 + b _023064C0 ; case 8 +_02306438: + ldr r2, _023064DC ; =0x00000C97 + mov r0, r6 + mov r1, r5 + bl LogMessageByIdWithPopupCheckUserTarget + b _023064C0 +_0230644C: + ldr r2, _023064E0 ; =0x00000CA4 + mov r0, r6 + mov r1, r5 + bl LogMessageByIdWithPopupCheckUserTarget + b _023064C0 +_02306460: + ldr r2, _023064E4 ; =0x00000CA7 + mov r0, r6 + mov r1, r5 + bl LogMessageByIdWithPopupCheckUserTarget + b _023064C0 +_02306474: + ldr r2, _023064E8 ; =0x00000CBD + mov r0, r6 + mov r1, r5 + bl LogMessageByIdWithPopupCheckUserTarget + b _023064C0 +_02306488: + ldr r2, _023064EC ; =0x00000CB7 + mov r0, r6 + mov r1, r5 + bl LogMessageByIdWithPopupCheckUserTarget + b _023064C0 +_0230649C: + mov r0, r6 + mov r1, r5 + mov r2, #0xcb0 + END_CRINGE_CLASS_STATUS_OFFSET + bl LogMessageByIdWithPopupCheckUserTarget + b _023064C0 +_023064B0: + ldr r2, _023064F0 ; =0x00000CBC + mov r0, r6 + mov r1, r5 + bl LogMessageByIdWithPopupCheckUserTarget +_023064C0: + mov r1, #0 + mov r0, r5 + strb r1, [r4, #0xd0] + bl UpdateStatusIconFlags + mov r0, r5 + bl CalcSpeedStageWrapper + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_023064DC: .word 0x00000C97 + END_CRINGE_CLASS_STATUS_OFFSET +_023064E0: .word 0x00000CA4 + END_CRINGE_CLASS_STATUS_OFFSET +_023064E4: .word 0x00000CA7 + END_CRINGE_CLASS_STATUS_OFFSET +_023064E8: .word 0x00000CBD + END_CRINGE_CLASS_STATUS_OFFSET +_023064EC: .word 0x00000CB7 + END_CRINGE_CLASS_STATUS_OFFSET +_023064F0: .word 0x00000CBC + END_CRINGE_CLASS_STATUS_OFFSET + arm_func_end EndCringeClassStatus + + arm_func_start EndReflectClassStatus +EndReflectClassStatus: ; 0x023064F4 +#ifdef JAPAN +#define END_REFLECT_CLASS_STATUS_OFFSET -0x2C0 +#else +#define END_REFLECT_CLASS_STATUS_OFFSET 0 +#endif + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + mov r0, r5 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + ldr r4, [r5, #0xb4] + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + ldrb r0, [r4, #0xd5] + cmp r0, #0x12 + addls pc, pc, r0, lsl #2 + b _02306688 +_02306530: ; jump table + b _02306688 ; case 0 + b _0230657C ; case 1 + b _0230658C ; case 2 + b _0230659C ; case 3 + b _023065AC ; case 4 + b _023065BC ; case 5 + b _023065CC ; case 6 + b _023065DC ; case 7 + b _023065EC ; case 8 + b _023065FC ; case 9 + b _023065AC ; case 10 + b _0230660C ; case 11 + b _0230661C ; case 12 + b _0230663C ; case 13 + b _0230664C ; case 14 + b _0230665C ; case 15 + b _0230666C ; case 16 + b _0230667C ; case 17 + b _02306688 ; case 18 +_0230657C: + ldr r1, _0230669C ; =0x00000C87 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_0230658C: + ldr r1, _023066A0 ; =0x00000C8A + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_0230659C: + ldr r1, _023066A4 ; =0x00000C88 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_023065AC: + ldr r1, _023066A8 ; =0x00000C89 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_023065BC: + ldr r1, _023066AC ; =0x00000C8B + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_023065CC: + ldr r1, _023066B0 ; =0x00000C8C + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_023065DC: + ldr r1, _023066B4 ; =0x00000CA6 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_023065EC: + ldr r1, _023066B8 ; =0x00000CAE + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_023065FC: + ldr r1, _023066BC ; =0x00000CB1 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_0230660C: + ldr r1, _023066C0 ; =0x00000CB2 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_0230661C: + ldr r1, _023066C4 ; =0x00000CB3 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + mov r0, r5 + bl ov29_022E65F4 + mov r0, r5 + bl ResetTypeChanges + b _02306688 +_0230663C: + ldr r1, _023066C8 ; =0x00000CB4 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_0230664C: + ldr r1, _023066CC ; =0x00000CB5 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_0230665C: + ldr r1, _023066D0 ; =0x00000CBE + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_0230666C: + mov r0, r5 + mov r1, #0xcc0 + END_REFLECT_CLASS_STATUS_OFFSET + bl LogMessageByIdWithPopupCheckUser + b _02306688 +_0230667C: + ldr r1, _023066D4 ; =0x00000CC1 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser +_02306688: + mov r1, #0 + mov r0, r5 + strb r1, [r4, #0xd5] + bl UpdateStatusIconFlags + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0230669C: .word 0x00000C87 + END_REFLECT_CLASS_STATUS_OFFSET +_023066A0: .word 0x00000C8A + END_REFLECT_CLASS_STATUS_OFFSET +_023066A4: .word 0x00000C88 + END_REFLECT_CLASS_STATUS_OFFSET +_023066A8: .word 0x00000C89 + END_REFLECT_CLASS_STATUS_OFFSET +_023066AC: .word 0x00000C8B + END_REFLECT_CLASS_STATUS_OFFSET +_023066B0: .word 0x00000C8C + END_REFLECT_CLASS_STATUS_OFFSET +_023066B4: .word 0x00000CA6 + END_REFLECT_CLASS_STATUS_OFFSET +_023066B8: .word 0x00000CAE + END_REFLECT_CLASS_STATUS_OFFSET +_023066BC: .word 0x00000CB1 + END_REFLECT_CLASS_STATUS_OFFSET +_023066C0: .word 0x00000CB2 + END_REFLECT_CLASS_STATUS_OFFSET +_023066C4: .word 0x00000CB3 + END_REFLECT_CLASS_STATUS_OFFSET +_023066C8: .word 0x00000CB4 + END_REFLECT_CLASS_STATUS_OFFSET +_023066CC: .word 0x00000CB5 + END_REFLECT_CLASS_STATUS_OFFSET +_023066D0: .word 0x00000CBE + END_REFLECT_CLASS_STATUS_OFFSET +_023066D4: .word 0x00000CC1 + END_REFLECT_CLASS_STATUS_OFFSET + arm_func_end EndReflectClassStatus + + arm_func_start TryRemoveSnatchedMonsterFromDungeonStruct +TryRemoveSnatchedMonsterFromDungeonStruct: ; 0x023066D8 + stmdb sp!, {r4, lr} + mov r4, r1 + mov r0, r4 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #0xb4] + ldrb r0, [r0, #0xd8] + cmp r0, #3 + ldmneia sp!, {r4, pc} + ldr r1, _02306724 ; =DUNGEON_PTR + mov r2, #0 + ldr r0, [r1] + add r0, r0, #0x19000 +#ifdef JAPAN + str r2, [r0, #0x860] + ldr r0, [r1] + add r0, r0, #0x19000 + str r2, [r0, #0x868] +#else + str r2, [r0, #0x904] + ldr r0, [r1] + add r0, r0, #0x19000 + str r2, [r0, #0x90c] +#endif + ldmia sp!, {r4, pc} + .align 2, 0 +_02306724: .word DUNGEON_PTR + arm_func_end TryRemoveSnatchedMonsterFromDungeonStruct diff --git a/asm/overlay_29_023068C4.s b/asm/overlay_29_023068C4.s new file mode 100644 index 00000000..b8b7d82c --- /dev/null +++ b/asm/overlay_29_023068C4.s @@ -0,0 +1,1726 @@ + .include "asm/macros.inc" + .include "overlay_29_023068C4.inc" + + .text + + arm_func_start EndLeechSeedClassStatus +EndLeechSeedClassStatus: ; 0x023068C4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + mov r0, r5 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + ldr r4, [r5, #0xb4] + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + ldrb r0, [r4, #0xe0] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0230692C +_02306900: ; jump table + b _0230692C ; case 0 + b _02306910 ; case 1 + b _02306920 ; case 2 + b _0230692C ; case 3 +_02306910: + ldr r1, _02306948 ; =0x00000C94 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _0230692C +_02306920: + ldr r1, _0230694C ; =0x00000CAF + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser +_0230692C: + mov r1, #0 + mov r0, r5 + strb r1, [r4, #0xe0] + mov r1, #0xff + strb r1, [r4, #0xe8] + bl UpdateStatusIconFlags + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +#ifdef JAPAN +_02306948: .word 0x000009D4 +_0230694C: .word 0x000009EF +#else +_02306948: .word 0x00000C94 +_0230694C: .word 0x00000CAF +#endif + arm_func_end EndLeechSeedClassStatus + + arm_func_start EndSureShotClassStatus +EndSureShotClassStatus: ; 0x02306950 +#ifdef JAPAN +#define END_SURE_SHOT_CLASS_STATUS_OFFSET -0x2C0 +#else +#define END_SURE_SHOT_CLASS_STATUS_OFFSET 0 +#endif + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + mov r0, r5 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + ldr r4, [r5, #0xb4] + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + ldrb r0, [r4, #0xec] + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _023069E0 +_0230698C: ; jump table + b _023069E0 ; case 0 + b _023069A4 ; case 1 + b _023069B4 ; case 2 + b _023069C4 ; case 3 + b _023069D4 ; case 4 + b _023069E0 ; case 5 +_023069A4: + mov r0, r5 + mov r1, #0xca0 + END_SURE_SHOT_CLASS_STATUS_OFFSET + bl LogMessageByIdWithPopupCheckUser + b _023069E0 +_023069B4: + ldr r1, _023069F4 ; =0x00000CA1 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _023069E0 +_023069C4: + ldr r1, _023069F8 ; =0x00000CA2 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _023069E0 +_023069D4: + ldr r1, _023069FC ; =0x00000CA3 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser +_023069E0: + mov r1, #0 + mov r0, r5 + strb r1, [r4, #0xec] + bl UpdateStatusIconFlags + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_023069F4: .word 0x00000CA1 + END_SURE_SHOT_CLASS_STATUS_OFFSET +_023069F8: .word 0x00000CA2 + END_SURE_SHOT_CLASS_STATUS_OFFSET +_023069FC: .word 0x00000CA3 + END_SURE_SHOT_CLASS_STATUS_OFFSET + arm_func_end EndSureShotClassStatus + + arm_func_start EndInvisibleClassStatus +EndInvisibleClassStatus: ; 0x02306A00 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r1 + mov r4, #0 + mov r0, r8 + mov r7, r2 + mov r5, r4 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r4 + ldr r6, [r8, #0xb4] + mov r1, r8 + mov r2, r0 + bl SubstitutePlaceholderStringTags + ldrb r0, [r6, #0xef] + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _02306ADC +_02306A48: ; jump table + b _02306ADC ; case 0 + b _02306A60 ; case 1 + b _02306A84 ; case 2 + b _02306A74 ; case 3 + b _02306AC4 ; case 4 + b _02306ADC ; case 5 +_02306A60: + ldr r1, _02306B18 ; =0x00000CA8 + mov r0, r8 + mov r4, #1 + bl LogMessageByIdWithPopupCheckUser + b _02306ADC +_02306A74: + ldr r1, _02306B1C ; =0x00000CB8 + mov r0, r8 + bl LogMessageByIdWithPopupCheckUser + b _02306ADC +_02306A84: + ldrsh r1, [r6, #2] + mov r0, r8 + bl GetMonsterApparentId + strh r0, [r6, #4] + ldrsh r0, [r6, #4] + bl DungeonGetSpriteIndex + strh r0, [r8, #0xa8] + mov r0, r8 + bl GetIdleAnimationId + mov r1, r0 + mov r0, r8 + bl ov29_02304830 + ldr r1, _02306B20 ; =0x00000CB6 + mov r0, r8 + bl LogMessageByIdWithPopupCheckUser + b _02306ADC +_02306AC4: + cmp r7, #0 + bne _02306AD8 + ldr r1, _02306B24 ; =0x00000CAC + mov r0, r8 + bl LogMessageByIdWithPopupCheckUser +_02306AD8: + mov r5, #1 +_02306ADC: + mov r1, #0 + mov r0, r8 + strb r1, [r6, #0xef] + bl UpdateStatusIconFlags + cmp r4, #0 + beq _02306AFC + mov r0, #1 + bl HandleShopTransaction +_02306AFC: + cmp r7, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + cmp r5, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r8 + bl EnsureCanStandCurrentTile + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +#ifdef JAPAN +#define END_INVISIBLE_CLASS_OFFSET -0x2C0 +#else +#define END_INVISIBLE_CLASS_OFFSET 0 +#endif +_02306B18: .word 0x00000CA8 + END_INVISIBLE_CLASS_OFFSET +_02306B1C: .word 0x00000CB8 + END_INVISIBLE_CLASS_OFFSET +_02306B20: .word 0x00000CB6 + END_INVISIBLE_CLASS_OFFSET +_02306B24: .word 0x00000CAC + END_INVISIBLE_CLASS_OFFSET + arm_func_end EndInvisibleClassStatus + + arm_func_start EndBlinkerClassStatus +EndBlinkerClassStatus: ; 0x02306B28 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + mov r0, r5 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + ldr r4, [r5, #0xb4] + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + ldrb r0, [r4, #0xf1] + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _02306BB8 +_02306B64: ; jump table + b _02306BB8 ; case 0 + b _02306B7C ; case 1 + b _02306B8C ; case 2 + b _02306B9C ; case 3 + b _02306BAC ; case 4 + b _02306BB8 ; case 5 +_02306B7C: + ldr r1, _02306BE8 ; =0x00000CA9 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306BB8 +_02306B8C: + ldr r1, _02306BEC ; =0x00000CAA + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306BB8 +_02306B9C: + ldr r1, _02306BF0 ; =0x00000CAB + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + b _02306BB8 +_02306BAC: + ldr r1, _02306BF4 ; =0x00000CAD + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser +_02306BB8: + mov r1, #0 + mov r0, r5 + strb r1, [r4, #0xf1] + bl UpdateStatusIconFlags + ldrb r0, [r4, #7] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0x31 + bl AdvanceFrame + bl UpdateTrapsVisibility + bl UpdateMinimap + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +#ifdef JAPAN +#define END_BLINKER_CLASS_OFFSET -0x2C0 +#else +#define END_BLINKER_CLASS_OFFSET 0 +#endif +_02306BE8: .word 0x00000CA9 + END_BLINKER_CLASS_OFFSET +_02306BEC: .word 0x00000CAA + END_BLINKER_CLASS_OFFSET +_02306BF0: .word 0x00000CAB + END_BLINKER_CLASS_OFFSET +_02306BF4: .word 0x00000CAD + END_BLINKER_CLASS_OFFSET + arm_func_end EndBlinkerClassStatus + + arm_func_start EndMuzzledStatus +EndMuzzledStatus: ; 0x02306BF8 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + mov r0, r5 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + ldr r4, [r5, #0xb4] + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + ldrb r0, [r4, #0xf3] + cmp r0, #0 + beq _02306C4C + cmp r0, #1 + beq _02306C40 + cmp r0, #2 + b _02306C4C +_02306C40: + ldr r1, _02306C60 ; =0x00000CB9 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser +_02306C4C: + mov r1, #0 + mov r0, r5 + strb r1, [r4, #0xf3] + bl UpdateStatusIconFlags + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +#ifdef JAPAN +_02306C60: .word 0x000009F9 +#else +_02306C60: .word 0x00000CB9 +#endif + arm_func_end EndMuzzledStatus + + arm_func_start EndMiracleEyeStatus +EndMiracleEyeStatus: ; 0x02306C64 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r1 + mov r0, r5 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + ldr r4, [r5, #0xb4] + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + ldrb r0, [r4, #0xf5] + cmp r0, #0 + beq _02306CB8 + cmp r0, #1 + beq _02306CAC + cmp r0, #2 + b _02306CB8 +_02306CAC: + ldr r1, _02306CCC ; =0x00000CC4 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser +_02306CB8: + mov r1, #0 + mov r0, r5 + strb r1, [r4, #0xf5] + bl UpdateStatusIconFlags + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +#ifdef JAPAN +_02306CCC: .word 0x00000A04 +#else +_02306CCC: .word 0x00000CC4 +#endif + arm_func_end EndMiracleEyeStatus + + arm_func_start EndMagnetRiseStatus +EndMagnetRiseStatus: ; 0x02306CD0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r0, r6 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r4, #0 + ldr r5, [r6, #0xb4] + mov r0, r4 + mov r1, r6 + mov r2, r4 + bl SubstitutePlaceholderStringTags + ldrb r0, [r5, #0xf7] + cmp r0, #0 + beq _02306D2C + cmp r0, #1 + beq _02306D1C + cmp r0, #2 + b _02306D2C +_02306D1C: + ldr r1, _02306D50 ; =0x00000CC5 + mov r0, r6 + bl LogMessageByIdWithPopupCheckUser + mov r4, #1 +_02306D2C: + mov r1, #0 + mov r0, r6 + strb r1, [r5, #0xf7] + bl UpdateStatusIconFlags + cmp r4, #0 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r6 + bl ov29_02321134 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +#ifdef JAPAN +_02306D50: .word 0x00000A05 +#else +_02306D50: .word 0x00000CC5 +#endif + arm_func_end EndMagnetRiseStatus + + arm_func_start ov29_02306D54 +ov29_02306D54: ; 0x02306D54 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r8, #0 + ldr r4, _02306DC8 ; =DUNGEON_PTR + mov sb, r0 + mov r5, r8 + mov r6, #1 + mov r7, r8 +_02306D70: + ldr r0, [r4] + add r0, r0, r8, lsl #2 + add r0, r0, #0x12000 +#ifdef JAPAN + ldr r1, [r0, #0xad4] +#else + ldr r1, [r0, #0xb78] +#endif + cmp r1, #0 + moveq r0, r7 + beq _02306DA0 + ldr r0, [r1] + cmp r0, #1 + moveq r0, r6 + movne r0, r5 + and r0, r0, #0xff +_02306DA0: + cmp r0, #0 + beq _02306DB0 + mov r0, sb + bl EndMagnetRiseStatus +_02306DB0: + add r0, r8, #1 + mov r0, r0, lsl #0x10 + mov r8, r0, asr #0x10 + cmp r8, #0x14 + blt _02306D70 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_02306DC8: .word DUNGEON_PTR + arm_func_end ov29_02306D54 + + arm_func_start ov29_02306DCC +ov29_02306DCC: ; 0x02306DCC + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #4 + mov r8, r1 + mov r4, #0 + mov sb, r0 + mov r0, r8 + mov sl, r4 + mov r5, r4 + bl EntityIsValid__02305C04 + cmp r0, #0 + mov r0, r4 + beq _02306EF8 + mov r1, sb + mov r2, r0 + ldr r6, [sb, #0xb4] + ldr r7, [r8, #0xb4] + bl SubstitutePlaceholderStringTags + mov r1, r8 + mov r0, #1 + mov r2, r4 + bl SubstitutePlaceholderStringTags + ldrb r0, [r6, #0xbd] + cmp r0, #0 + moveq r0, r4 + beq _02306EF8 + cmp r0, #6 + addls pc, pc, r0, lsl #2 + b _02306E9C +_02306E3C: ; jump table + b _02306E9C ; case 0 + b _02306E58 ; case 1 + b _02306E9C ; case 2 + b _02306E58 ; case 3 + b _02306E58 ; case 4 + b _02306E7C ; case 5 + b _02306E9C ; case 6 +_02306E58: + mov r2, #1 + mov r0, sb + mov r1, r8 + mov r3, r2 + str r4, [sp] + bl ov29_02311C28 + mov sl, r0 + mov r4, #1 + b _02306E9C +_02306E7C: + mov r2, r4 + mov r0, sb + mov r1, r8 + mov r3, r2 + str r2, [sp] + bl ov29_02311C28 + mov sl, r0 + mov r4, #1 +_02306E9C: + cmp sl, #0 + beq _02306EBC + ldrb r1, [r6, #0xbd] + orr r0, r5, #0x11 + and r5, r0, #0xff + strb r1, [r7, #0xbd] + ldrb r0, [r6, #0xbe] + strb r0, [r7, #0xbe] +_02306EBC: + cmp r4, #0 + orrne r1, r5, #1 + movne r0, #0 + strneb r0, [r6, #0xbd] + andne r5, r1, #0xff + cmp r4, #0 + beq _02306EE4 + mov r0, sb + mov r1, #0x378 + bl ChangeMonsterAnimationToIdle +_02306EE4: + mov r0, sb + bl UpdateStatusIconFlags + mov r0, r8 + bl UpdateStatusIconFlags + mov r0, r5 +_02306EF8: + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov29_02306DCC + + arm_func_start ov29_02306F00 +ov29_02306F00: ; 0x02306F00 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #4 + mov sl, #0 + mov sb, r0 + mov r8, r1 + mov r4, sl + mov r5, sl + bl EntityIsValid__02305C04 + cmp r0, #0 + moveq r0, sl + beq _02307070 + mov r0, r8 + bl EntityIsValid__02305C04 + cmp r0, #0 + moveq r0, sl + beq _02307070 + ldr r6, [sb, #0xb4] + ldr r7, [r8, #0xb4] + ldrb r0, [r6, #0xbf] + cmp r0, #0 + mov r0, sl + beq _02307070 + mov r1, sb + mov r2, r0 + bl SubstitutePlaceholderStringTags + mov r1, r8 + mov r0, #1 + mov r2, sl + bl SubstitutePlaceholderStringTags + ldrb r0, [r6, #0xbf] + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _0230701C +_02306F84: ; jump table + b _0230701C ; case 0 + b _02306FFC ; case 1 + b _02306F9C ; case 2 + b _02306FBC ; case 3 + b _02306FDC ; case 4 + b _0230701C ; case 5 +_02306F9C: + mov r0, sb + mov r1, r8 + mov r2, sl + mov r3, #1 + bl TryInflictPoisonedStatus + mov sl, r0 + mov r4, #1 + b _0230701C +_02306FBC: + mov r0, sb + mov r1, r8 + mov r2, sl + mov r3, #1 + bl TryInflictBadlyPoisonedStatus + mov sl, r0 + mov r4, #1 + b _0230701C +_02306FDC: + mov r0, sb + mov r1, r8 + mov r2, sl + mov r3, #1 + bl TryInflictParalysisStatus + mov sl, r0 + mov r4, #1 + b _0230701C +_02306FFC: + mov r2, sl + mov r4, #1 + mov r0, sb + mov r1, r8 + mov r3, r2 + str r4, [sp] + bl TryInflictBurnStatus + mov sl, r0 +_0230701C: + cmp sl, #0 + beq _02307048 + add r3, r6, #0xbf + add r2, r7, #0xbf + mov r1, #4 +_02307030: + ldrb r0, [r3], #1 + subs r1, r1, #1 + strb r0, [r2], #1 + bne _02307030 + orr r0, r5, #0x11 + and r5, r0, #0xff +_02307048: + cmp r4, #0 + orrne r0, r5, #1 + movne r1, #0 + andne r5, r0, #0xff + mov r0, sb + strneb r1, [r6, #0xbf] + bl UpdateStatusIconFlags + mov r0, r8 + bl UpdateStatusIconFlags + mov r0, r5 +_02307070: + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov29_02306F00 + + arm_func_start ov29_02307078 +ov29_02307078: ; 0x02307078 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r4, #0 + mov sb, r0 + mov r8, r1 + mov sl, r4 + mov r5, r4 + bl EntityIsValid__02305C04 + cmp r0, #0 + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r0, r8 + bl EntityIsValid__02305C04 + cmp r0, #0 + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r6, [sb, #0xb4] + ldr r7, [r8, #0xb4] + ldrb r1, [r6, #0xc4] + cmp r1, #3 + cmpne r1, #4 + beq _023070E0 + ldrb r0, [r7, #0xc4] + add r0, r0, #0xfd + and r0, r0, #0xff + cmp r0, #1 + bhi _023070E8 +_023070E0: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} +_023070E8: + cmp r1, #7 + addls pc, pc, r1, lsl #2 + b _0230714C +_023070F4: ; jump table + b _0230714C ; case 0 + b _0230714C ; case 1 + b _02307114 ; case 2 + b _0230714C ; case 3 + b _0230714C ; case 4 + b _0230714C ; case 5 + b _0230714C ; case 6 + b _02307130 ; case 7 +_02307114: + mov r0, sb + mov r1, r8 + mov r2, #1 + bl TryInflictShadowHoldStatus + mov sl, r0 + mov r4, #1 + b _0230714C +_02307130: + mov r0, sb + mov r1, r8 + mov r2, #0x7e + mov r3, #1 + bl TryInflictConstrictionStatus + mov sl, r0 + mov r4, #1 +_0230714C: + cmp sl, #0 + beq _0230716C + add r0, r6, #0xc4 + add r7, r7, #0xc4 + ldmia r0, {r0, r1, r2} + orr r3, r5, #0x11 + stmia r7, {r0, r1, r2} + and r5, r3, #0xff +_0230716C: + cmp r4, #0 + orrne r0, r5, #1 + movne r1, #0 + andne r5, r0, #0xff + mov r0, sb + strneb r1, [r6, #0xc4] + bl UpdateStatusIconFlags + mov r0, r8 + bl UpdateStatusIconFlags + mov r0, r5 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov29_02307078 + + arm_func_start ov29_02307198 +ov29_02307198: ; 0x02307198 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #8 + mov r4, #0 + mov sb, r0 + mov r8, r1 + mov sl, r4 + mov r5, r4 + bl EntityIsValid__02305C04 + cmp r0, #0 + moveq r0, r4 + beq _02307374 + mov r0, r8 + bl EntityIsValid__02305C04 + cmp r0, #0 + moveq r0, r4 + beq _02307374 + ldr r6, [sb, #0xb4] + ldr r7, [r8, #0xb4] + ldrb r0, [r6, #0xd0] + cmp r0, #0 + mov r0, r4 + beq _02307374 + mov r1, sb + mov r2, r0 + bl SubstitutePlaceholderStringTags + mov r1, r8 + mov r0, #1 + mov r2, r4 + bl SubstitutePlaceholderStringTags + ldrb r0, [r6, #0xd0] + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _0230731C +_0230721C: ; jump table + b _0230731C ; case 0 + b _02307300 ; case 1 + b _02307240 ; case 2 + b _0230729C ; case 3 + b _02307260 ; case 4 + b _02307280 ; case 5 + b _023072E4 ; case 6 + b _023072C4 ; case 7 + b _0230731C ; case 8 +_02307240: + mov r0, sb + mov r1, r8 + mov r2, r4 + mov r3, #1 + bl TryInflictConfusedStatus + mov sl, r0 + mov r4, #1 + b _0230731C +_02307260: + mov r0, sb + mov r1, r8 + mov r2, r4 + mov r3, #1 + bl TryInflictCoweringStatus + mov sl, r0 + mov r4, #1 + b _0230731C +_02307280: + mov r0, sb + mov r1, r8 + mov r2, #1 + bl TryInflictTauntStatus + mov sl, r0 + mov r4, #1 + b _0230731C +_0230729C: + mov r3, r4 + mov r0, sb + mov r1, r8 + str r3, [sp] + mov r2, #1 + str r2, [sp, #4] + bl TryInflictPausedStatus + mov sl, r0 + mov r4, #1 + b _0230731C +_023072C4: + mov r0, sb + mov r1, r8 + mov r2, r4 + mov r3, #1 + bl TryInflictInfatuatedStatus + mov sl, r0 + mov r4, #1 + b _0230731C +_023072E4: + mov r0, sb + mov r1, r8 + mov r2, #1 + bl TryInflictEncoreStatus + mov sl, r0 + mov r4, #1 + b _0230731C +_02307300: + mov r0, sb + mov r1, r8 + mov r2, r4 + mov r3, #1 + bl TryInflictCringeStatus + mov sl, r0 + mov r4, #1 +_0230731C: + cmp sl, #0 + beq _0230733C + ldrb r1, [r6, #0xd0] + orr r0, r5, #0x11 + and r5, r0, #0xff + strb r1, [r7, #0xd0] + ldrb r0, [r6, #0xd1] + strb r0, [r7, #0xd1] +_0230733C: + cmp r4, #0 + movne r0, #0 + orrne r1, r5, #1 + strneb r0, [r6, #0xd0] + mov r0, sb + andne r5, r1, #0xff + bl UpdateStatusIconFlags + mov r0, r8 + bl UpdateStatusIconFlags + mov r0, sb + bl CalcSpeedStageWrapper + mov r0, r8 + bl CalcSpeedStageWrapper + mov r0, r5 +_02307374: + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov29_02307198 + + arm_func_start ov29_0230737C +ov29_0230737C: ; 0x0230737C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} + sub sp, sp, #4 + mov r4, #0 + mov sb, r0 + mov r8, r1 + mov r5, r4 + mov r6, r4 + bl EntityIsValid__02305C04 + cmp r0, #0 + moveq r0, r4 + beq _023076B4 + mov r0, r8 + bl EntityIsValid__02305C04 + cmp r0, #0 + mov r0, r4 + beq _023076B4 + mov r1, sb + mov r2, r0 + ldr r7, [sb, #0xb4] + ldr sl, [r8, #0xb4] + bl SubstitutePlaceholderStringTags + mov r1, r8 + mov r0, #1 + mov r2, r4 + bl SubstitutePlaceholderStringTags + ldrb r0, [r7, #0xd8] + cmp r0, #7 + addls pc, pc, r0, lsl #2 + b _0230749C +_023073F0: ; jump table + b _0230749C ; case 0 + b _02307410 ; case 1 + b _0230741C ; case 2 + b _0230749C ; case 3 + b _02307440 ; case 4 + b _02307460 ; case 5 + b _02307480 ; case 6 + b _0230749C ; case 7 +_02307410: + mov r5, #1 + mov r4, r5 + b _0230749C +_0230741C: + mov r2, r4 + mov r4, #1 + mov r0, sb + mov r1, r8 + mov r3, r2 + str r4, [sp] + bl TryInflictDecoyStatus + mov r5, r0 + b _0230749C +_02307440: + mov r0, sb + mov r1, r8 + mov r2, r4 + mov r3, #1 + bl TryInflictGastroAcidStatus + mov r5, r0 + mov r4, #1 + b _0230749C +_02307460: + mov r0, sb + mov r1, r8 + mov r2, r4 + mov r3, #1 + bl TryInflictHealBlockStatus + mov r5, r0 + mov r4, #1 + b _0230749C +_02307480: + mov r0, sb + mov r1, r8 + mov r2, r4 + mov r3, #1 + bl TryInflictEmbargoStatus + mov r5, r0 + mov r4, #1 +_0230749C: + ldrb r0, [r7, #0xd8] + cmp r0, #6 + addls pc, pc, r0, lsl #2 + b _023076A0 +_023074AC: ; jump table + b _023076A0 ; case 0 + b _023074C8 ; case 1 + b _02307528 ; case 2 + b _023076A0 ; case 3 + b _02307554 ; case 4 + b _023075D4 ; case 5 + b _0230763C ; case 6 +_023074C8: + cmp r5, #0 + beq _02307500 + mov r0, sb + mov r1, r8 + bl TryRemoveSnatchedMonsterFromDungeonStruct + add r3, r7, #0xd8 + add r2, sl, #0xd8 + mov r1, #5 +_023074E8: + ldrb r0, [r3], #1 + subs r1, r1, #1 + strb r0, [r2], #1 + bne _023074E8 + orr r0, r6, #0x11 + and r6, r0, #0xff +_02307500: + cmp r4, #0 + beq _023076A0 + mov r0, r8 + mov r1, sb + mov r2, #1 + mov r3, #0 + bl EndCurseClassStatus + orr r0, r6, #1 + and r6, r0, #0xff + b _023076A0 +_02307528: + cmp r5, #0 + beq _023076A0 + mov r3, #0 + mov r0, sb + mov r1, r8 + mov r2, #1 + str r3, [sp] + bl TryInflictDecoyStatus + orr r0, r6, #0x11 + and r6, r0, #0xff + b _023076A0 +_02307554: + cmp r5, #0 + beq _023075AC + mov r0, sb + mov r1, r8 + bl TryRemoveSnatchedMonsterFromDungeonStruct + add r3, r7, #0xd8 + add r2, sl, #0xd8 + mov r1, #5 +_02307574: + ldrb r0, [r3], #1 + subs r1, r1, #1 + strb r0, [r2], #1 + bne _02307574 + ldr r1, _023076BC ; =DUNGEON_PTR + mov r0, r8 + ldr r1, [r1] + mov r2, #1 + strb r2, [r1, #0xe] + bl ov29_022FB984 + mov r0, r8 + bl UpdateStatusIconFlags + orr r0, r6, #0x11 + and r6, r0, #0xff +_023075AC: + cmp r4, #0 + beq _023076A0 + mov r0, r8 + mov r1, sb + mov r2, #4 + mov r3, #0 + bl EndCurseClassStatus + orr r0, r6, #1 + and r6, r0, #0xff + b _023076A0 +_023075D4: + cmp r5, #0 + beq _02307614 + mov r0, sb + mov r1, r8 + bl TryRemoveSnatchedMonsterFromDungeonStruct + add r3, r7, #0xd8 + add r2, sl, #0xd8 + mov r1, #5 +_023075F4: + ldrb r0, [r3], #1 + subs r1, r1, #1 + strb r0, [r2], #1 + bne _023075F4 + mov r0, r8 + bl UpdateStatusIconFlags + orr r0, r6, #0x11 + and r6, r0, #0xff +_02307614: + cmp r4, #0 + beq _023076A0 + mov r0, r8 + mov r1, sb + mov r2, #5 + mov r3, #0 + bl EndCurseClassStatus + orr r0, r6, #1 + and r6, r0, #0xff + b _023076A0 +_0230763C: + cmp r5, #0 + beq _0230767C + mov r0, sb + mov r1, r8 + bl TryRemoveSnatchedMonsterFromDungeonStruct + add r3, r7, #0xd8 + add r2, sl, #0xd8 + mov r1, #5 +_0230765C: + ldrb r0, [r3], #1 + subs r1, r1, #1 + strb r0, [r2], #1 + bne _0230765C + mov r0, r8 + bl UpdateStatusIconFlags + orr r0, r6, #0x11 + and r6, r0, #0xff +_0230767C: + cmp r4, #0 + beq _023076A0 + mov r0, r8 + mov r1, sb + mov r2, #6 + mov r3, #0 + bl EndCurseClassStatus + orr r0, r6, #1 + and r6, r0, #0xff +_023076A0: + mov r0, sb + bl UpdateStatusIconFlags + mov r0, r8 + bl UpdateStatusIconFlags + mov r0, r6 +_023076B4: + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_023076BC: .word DUNGEON_PTR + arm_func_end ov29_0230737C + + arm_func_start ov29_023076C0 +ov29_023076C0: ; 0x023076C0 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r4, #0 + mov sb, r0 + mov r8, r1 + mov sl, r4 + mov r5, r4 + bl EntityIsValid__02305C04 + cmp r0, #0 + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r0, r8 + bl EntityIsValid__02305C04 + cmp r0, #0 + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r6, [sb, #0xb4] + ldr r7, [r8, #0xb4] + ldrb r0, [r6, #0xe0] + cmp r0, #0 + mov r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r1, sb + mov r2, r0 + bl SubstitutePlaceholderStringTags + mov r1, r8 + mov r0, #1 + mov r2, r4 + bl SubstitutePlaceholderStringTags + ldrb r0, [r6, #0xe0] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0230776C +_02307740: ; jump table + b _0230776C ; case 0 + b _02307750 ; case 1 + b _0230776C ; case 2 + b _0230776C ; case 3 +_02307750: + mov r0, sb + mov r1, r8 + mov r2, r4 + mov r3, #1 + bl TryInflictLeechSeedStatus + mov sl, r0 + mov r4, #1 +_0230776C: + cmp sl, #0 + beq _023077CC + add r0, r6, #0xe0 + add r3, r7, #0xe0 + ldmia r0, {r0, r1, r2} + stmia r3, {r0, r1, r2} + mov r0, #0xff + strb r0, [r7, #0xe8] + ldr r2, _023077F8 ; =DUNGEON_PTR + mov r0, #0 +_02307794: + ldr r1, [r2] + add r1, r1, r0, lsl #2 + add r1, r1, #0x12000 +#ifdef JAPAN + ldr r1, [r1, #0xad4] +#else + ldr r1, [r1, #0xb78] +#endif + cmp sb, r1 + streqb r0, [r7, #0xe8] + ldreq r1, [sb, #0xb4] + add r0, r0, #1 + ldreq r1, [r1, #0xb0] + streq r1, [r7, #0xe4] + cmp r0, #0x14 + blt _02307794 + orr r0, r5, #0x11 + and r5, r0, #0xff +_023077CC: + cmp r4, #0 + orrne r0, r5, #1 + movne r1, #0 + andne r5, r0, #0xff + mov r0, sb + strneb r1, [r6, #0xe0] + bl UpdateStatusIconFlags + mov r0, r8 + bl UpdateStatusIconFlags + mov r0, r5 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_023077F8: .word DUNGEON_PTR + arm_func_end ov29_023076C0 + + arm_func_start ov29_023077FC +ov29_023077FC: ; 0x023077FC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r4, #0 + mov sb, r0 + mov r8, r1 + mov sl, r4 + mov r5, r4 + bl EntityIsValid__02305C04 + cmp r0, #0 + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r0, r8 + bl EntityIsValid__02305C04 + cmp r0, #0 + mov r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r1, sb + mov r2, r0 + ldr r6, [sb, #0xb4] + ldr r7, [r8, #0xb4] + bl SubstitutePlaceholderStringTags + mov r1, r8 + mov r0, #1 + mov r2, r4 + bl SubstitutePlaceholderStringTags + ldrb r0, [r6, #0xec] + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _023078A0 +_0230786C: ; jump table + b _023078A0 ; case 0 + b _023078A0 ; case 1 + b _02307884 ; case 2 + b _023078A0 ; case 3 + b _023078A0 ; case 4 + b _023078A0 ; case 5 +_02307884: + mov r0, sb + mov r1, r8 + mov r2, r4 + mov r3, #1 + bl TryInflictWhifferStatus + mov sl, r0 + mov r4, #1 +_023078A0: + cmp sl, #0 + beq _023078C0 + ldrb r1, [r6, #0xec] + orr r0, r5, #0x11 + and r5, r0, #0xff + strb r1, [r7, #0xec] + ldrb r0, [r6, #0xed] + strb r0, [r7, #0xed] +_023078C0: + cmp r4, #0 + orrne r0, r5, #1 + movne r1, #0 + andne r5, r0, #0xff + mov r0, sb + strneb r1, [r6, #0xec] + bl UpdateStatusIconFlags + mov r0, r8 + bl UpdateStatusIconFlags + mov r0, r5 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov29_023077FC + + arm_func_start TransferNegativeBlinkerClassStatus +TransferNegativeBlinkerClassStatus: ; 0x023078EC + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r4, #0 + mov sb, r0 + mov r8, r1 + mov sl, r4 + mov r5, r4 + bl EntityIsValid__02305C04 + cmp r0, #0 + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r0, r8 + bl EntityIsValid__02305C04 + cmp r0, #0 + mov r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r1, sb + mov r2, r0 + ldr r6, [sb, #0xb4] + ldr r7, [r8, #0xb4] + bl SubstitutePlaceholderStringTags + mov r1, r8 + mov r0, #1 + mov r2, r4 + bl SubstitutePlaceholderStringTags + ldrb r0, [r6, #0xf1] + cmp r0, #5 + addls pc, pc, r0, lsl #2 + b _023079C4 +_0230795C: ; jump table + b _023079C4 ; case 0 + b _02307974 ; case 1 + b _02307994 ; case 2 + b _023079C4 ; case 3 + b _023079B0 ; case 4 + b _023079C4 ; case 5 +_02307974: + mov r0, sb + mov r1, r8 + mov r2, #1 + mov r3, r4 + bl TryInflictBlinkerStatus + mov sl, r0 + mov r4, #1 + b _023079C4 +_02307994: + mov r0, sb + mov r1, r8 + mov r2, #1 + bl TryInflictCrossEyedStatus + mov sl, r0 + mov r4, #1 + b _023079C4 +_023079B0: + mov r0, sb + mov r1, r8 + bl TryInflictDropeyeStatus + mov sl, r0 + mov r4, #1 +_023079C4: + cmp sl, #0 + beq _023079E4 + ldrb r1, [r6, #0xf1] + orr r0, r5, #0x11 + and r5, r0, #0xff + strb r1, [r7, #0xf1] + ldrb r0, [r6, #0xf2] + strb r0, [r7, #0xf2] +_023079E4: + cmp r4, #0 + orrne r0, r5, #1 + movne r1, #0 + andne r5, r0, #0xff + mov r0, sb + strneb r1, [r6, #0xf1] + bl UpdateStatusIconFlags + mov r0, r8 + bl UpdateStatusIconFlags + ldrb r0, [r6, #7] + cmp r0, #0 + beq _02307A24 + mov r0, #0x31 + bl AdvanceFrame + bl UpdateTrapsVisibility + bl UpdateMinimap +_02307A24: + mov r0, r5 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end TransferNegativeBlinkerClassStatus + + arm_func_start ov29_02307A2C +ov29_02307A2C: ; 0x02307A2C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r4, #0 + mov sl, r0 + mov sb, r1 + mov r5, r4 + mov r6, r4 + bl EntityIsValid__02305C04 + cmp r0, #0 + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r0, sb + bl EntityIsValid__02305C04 + cmp r0, #0 + mov r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r1, sl + mov r2, r0 + ldr r7, [sl, #0xb4] + ldr r8, [sb, #0xb4] + bl SubstitutePlaceholderStringTags + mov r1, sb + mov r0, #1 + mov r2, r4 + bl SubstitutePlaceholderStringTags + ldrb r0, [r7, #0xf3] + cmp r0, #0 + beq _02307AC0 + cmp r0, #1 + beq _02307AA8 + cmp r0, #2 + b _02307AC0 +_02307AA8: + mov r0, sl + mov r1, sb + mov r2, #1 + bl TryInflictMuzzledStatus + mov r5, r0 + mov r4, #1 +_02307AC0: + cmp r5, #0 + beq _02307AE0 + ldrb r1, [r7, #0xf3] + orr r0, r6, #0x11 + and r6, r0, #0xff + strb r1, [r8, #0xf3] + ldrb r0, [r7, #0xf4] + strb r0, [r8, #0xf4] +_02307AE0: + cmp r4, #0 + orrne r0, r6, #1 + movne r1, #0 + andne r6, r0, #0xff + mov r0, sl + strneb r1, [r7, #0xf3] + bl UpdateStatusIconFlags + mov r0, sb + bl UpdateStatusIconFlags + mov r0, r6 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov29_02307A2C + + arm_func_start ov29_02307B0C +ov29_02307B0C: ; 0x02307B0C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov r4, #0 + mov sl, r0 + mov sb, r1 + mov r5, r4 + mov r6, r4 + bl EntityIsValid__02305C04 + cmp r0, #0 + moveq r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r0, sb + bl EntityIsValid__02305C04 + cmp r0, #0 + mov r0, r4 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + mov r1, sl + mov r2, r0 + ldr r7, [sl, #0xb4] + ldr r8, [sb, #0xb4] + bl SubstitutePlaceholderStringTags + mov r1, sb + mov r0, #1 + mov r2, r4 + bl SubstitutePlaceholderStringTags + ldrb r0, [r7, #0xf5] + cmp r0, #1 + bne _02307B90 + mov r0, sl + mov r1, sb + mov r2, #1 + bl TryInflictMiracleEyeStatus + mov r5, r0 + mov r4, #1 +_02307B90: + cmp r5, #0 + beq _02307BB0 + ldrb r1, [r7, #0xf5] + orr r0, r6, #0x11 + and r6, r0, #0xff + strb r1, [r8, #0xf5] + ldrb r0, [r7, #0xf6] + strb r0, [r8, #0xf6] +_02307BB0: + cmp r4, #0 + orrne r0, r6, #1 + movne r1, #0 + andne r6, r0, #0xff + mov r0, sl + strneb r1, [r7, #0xf5] + bl UpdateStatusIconFlags + mov r0, sb + bl UpdateStatusIconFlags + mov r0, r6 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + arm_func_end ov29_02307B0C + + arm_func_start TryEndPetrifiedOrSleepStatus +TryEndPetrifiedOrSleepStatus: ; 0x02307BDC + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r5, r1 + ldr r4, [r5, #0xb4] + mov r6, r0 + ldrb r2, [r4, #0xc4] + mov r3, #0 + cmp r2, #6 + bne _02307C0C + mov r2, #1 + bl EndFrozenClassStatus + mov r3, #1 +_02307C0C: + ldrb r0, [r4, #0xbd] + cmp r0, #1 + ldreqb r0, [r4, #0xbe] + cmpeq r0, #0x7f + bne _02307C3C + mov r3, #1 + mov r0, r6 + mov r1, r5 + mov r2, #0 + str r3, [sp] + bl EndSleepClassStatus + mov r3, #1 +_02307C3C: + mov r0, r3 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end TryEndPetrifiedOrSleepStatus + + arm_func_start ov29_02307C48 +ov29_02307C48: ; 0x02307C48 + stmdb sp!, {r4, lr} + mov r4, r0 + ldr ip, [r4, #0xb4] + mov r3, #0 + mov r1, #1 + strb r3, [ip, #0xbd] + mov r2, r1 + strb r3, [ip, #0xbe] + bl ov29_022FA1D8 + mov r0, r4 + bl UpdateStatusIconFlags + ldmia sp!, {r4, pc} + arm_func_end ov29_02307C48 + + arm_func_start EndFrozenStatus +EndFrozenStatus: ; 0x02307C78 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + mov r0, r4 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r3, [r4, #0xb4] + ldrb r0, [r3, #0xc4] + cmp r0, #1 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, #0 + strb r0, [r3, #0xc4] + strb r0, [r3, #0xcc] + mov r1, r4 + mov r2, r0 + strb r0, [r3, #0xcd] + bl SubstitutePlaceholderStringTags + ldr r2, _02307CDC ; =0x00000C9F + mov r0, r5 + mov r1, r4 + bl LogMessageByIdWithPopupCheckUserTarget + mov r0, r4 + bl UpdateStatusIconFlags + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +#ifdef JAPAN +_02307CDC: .word 0x000009DF +#else +_02307CDC: .word 0x00000C9F +#endif + arm_func_end EndFrozenStatus + + arm_func_start ResetTypeChanges +ResetTypeChanges: ; 0x02307CE0 + stmdb sp!, {r4, lr} + ldr r4, [r0, #0xb4] + mov r1, #0 + bl TryRestoreRoostTyping + mov r1, #0 + strb r1, [r4, #0xff] + ldrsh r0, [r4, #2] + bl GetType + strb r0, [r4, #0x5e] + ldrsh r0, [r4, #2] + mov r1, #1 + bl GetType + strb r0, [r4, #0x5f] + ldmia sp!, {r4, pc} + arm_func_end ResetTypeChanges + + arm_func_start EndProtectStatus +EndProtectStatus: ; 0x02307D18 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r1 + mov r5, r0 + mov r0, r4 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r4, #0xb4] + ldrb r0, [r0, #0xd5] + cmp r0, #7 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, r4 + bl EndReflectClassStatus + ldmia sp!, {r3, r4, r5, pc} + arm_func_end EndProtectStatus + + arm_func_start TryRestoreRoostTyping +TryRestoreRoostTyping: ; 0x02307D54 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl EntityIsValid__02305C04 + cmp r0, #0 + ldrne r2, [r5, #0xb4] + ldrneb r0, [r2, #0xa9] + cmpne r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + strb r0, [r2, #0xa9] + ldrb r1, [r2, #0xaa] + cmp r4, #0 + strb r1, [r2, #0x5e] + ldrb r1, [r2, #0xab] + strb r1, [r2, #0x5f] + strb r0, [r2, #0xaa] + strb r0, [r2, #0xab] + ldmeqia sp!, {r3, r4, r5, pc} + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + ldr r1, _02307DBC ; =0x00000CC8 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +#ifdef JAPAN +_02307DBC: .word 0x00000A08 +#else +_02307DBC: .word 0x00000CC8 +#endif + arm_func_end TryRestoreRoostTyping + + arm_func_start ov29_02307DC0 +ov29_02307DC0: ; 0x02307DC0 +#ifdef JAPAN + ldr r1, [r0, #0xb4] + mov r0, #0 + strb r0, [r1, #0x103] + strb r0, [r1, #0x104] +#else + mov r1, #0 + strb r1, [r0, #0x104] + strb r1, [r0, #0x105] +#endif + bx lr + arm_func_end ov29_02307DC0 + + arm_func_start ov29_02307DD0 +ov29_02307DD0: ; 0x02307DD0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov r4, #0 +_02307DD8: + ldr r0, _02307EF4 ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, r4, lsl #2 + add r0, r0, #0x12000 +#ifdef JAPAN + ldr r6, [r0, #0xa94] +#else + ldr r6, [r0, #0xb38] +#endif + mov r0, r6 + bl EntityIsValid__02307EF8 + cmp r0, #0 + beq _02307EE4 + ldr r1, [r6, #0xb4] + ldrb r0, [r1, #0xbd] + cmp r0, #1 + ldreqb r0, [r1, #0xbe] + cmpeq r0, #0x7f + bne _02307EE4 + mov r8, #0 + mov r7, r8 + mov r5, r8 + ldrb sl, [r6, #0x25] + ldr fp, _02307EF4 ; =DUNGEON_PTR + b _02307EBC +_02307E2C: + ldr r0, [fp] + add r0, r0, r5, lsl #2 + add r0, r0, #0x12000 +#ifdef JAPAN + ldr sb, [r0, #0xa84] +#else + ldr sb, [r0, #0xb28] +#endif + mov r0, sb + bl EntityIsValid__02307EF8 + cmp r0, #0 + beq _02307EB8 + mov r0, sb + mov r1, #0x1f + bl ItemIsActive__02307F1C + cmp r0, #0 + bne _02307EB8 + ldrsh r1, [sb, #4] + ldrsh r0, [r6, #4] + sub r0, r1, r0 + bl abs + cmp r0, #1 + bgt _02307E94 + ldrsh r1, [sb, #6] + ldrsh r0, [r6, #6] + sub r0, r1, r0 + bl abs + cmp r0, #1 + movle r8, #1 + ble _02307EC4 +_02307E94: + mov r0, sb + mov r1, #0x24 + bl ItemIsActive__02307F1C + cmp r0, #0 + beq _02307EB8 + ldrb r0, [sb, #0x25] + cmp sl, r0 + moveq r7, #1 + beq _02307EC4 +_02307EB8: + add r5, r5, #1 +_02307EBC: + cmp r5, #4 + blt _02307E2C +_02307EC4: + cmp r7, #0 + bne _02307ED4 + cmp r8, #0 + movne r7, #1 +_02307ED4: + cmp r7, #0 + beq _02307EE4 + mov r0, r6 + bl ov29_02307C48 +_02307EE4: + add r4, r4, #1 + cmp r4, #0x10 + blt _02307DD8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_02307EF4: .word DUNGEON_PTR + arm_func_end ov29_02307DD0 diff --git a/asm/overlay_29_02336450.s b/asm/overlay_29_02336450.s index 2d5b4000..696a87c9 100644 --- a/asm/overlay_29_02336450.s +++ b/asm/overlay_29_02336450.s @@ -817,1016 +817,3 @@ _02336F2C: .align 2, 0 _02336F48: .word ov29_02352F14 arm_func_end ov29_02336DB0 - - arm_func_start UpdateTrapsVisibility -UpdateTrapsVisibility: ; 0x02336F4C -#ifdef JAPAN -#define UPDATE_TRAPS_VISIBILITY_OFFSET -0xA4 -#else -#define UPDATE_TRAPS_VISIBILITY_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x30 - ldr r0, _02337108 ; =DUNGEON_PTR - ldr sl, [r0] - add r1, sl, #0x1a000 - ldrb r0, [r1, #0x245 + UPDATE_TRAPS_VISIBILITY_OFFSET] - str r0, [sp, #0x18] - ldrb fp, [r1, #0x244 + UPDATE_TRAPS_VISIBILITY_OFFSET] - bl IsSecretBazaar - ldr r1, _0233710C ; =0x0001A224 - ldr r2, _02337110 ; =ov29_02352B9C - ldrsh r3, [sl, r1] - ldr r1, _02337114 ; =ov29_02352D58 - mov sb, r3, asr #3 - str r0, [sp, #0x14] - add r0, sb, #0x1e - mov r0, r0, lsl #1 - ldrsh r7, [r2, r0] - ldrsh r5, [r1, r0] - mov r0, #0 - str r0, [sp, #0x10] -_02336FA0: - ldr r0, _02337118 ; =0x0001A226 - add r1, sl, #0xc4 + UPDATE_TRAPS_VISIBILITY_OFFSET - ldrsh r3, [sl, r0] - ldr r0, _02337110 ; =ov29_02352B9C - mov r2, r5, lsl #0x10 - mov r3, r3, asr #3 - sub r4, r3, #1 - add r3, r0, r4, lsl #1 - ldr r0, _02337114 ; =ov29_02352D58 - ldrsh r8, [r3, #0x3c] - add r0, r0, r4, lsl #1 - ldrsh r6, [r0, #0x3c] - add r0, r1, #0x4000 - add r3, r8, r8, lsl #1 - mov r1, r2, asr #0x10 - add r2, r7, r3 - mov r2, r2, lsl #0x10 - str fp, [sp] - mov r3, r2, asr #0x10 - ldr r2, [sp, #0x18] - and sb, sb, #0x3f - str r2, [sp, #4] - ldr r2, [sp, #0x14] - str r2, [sp, #8] - mov r2, r6, lsl #0x10 - mov r2, r2, asr #0x10 - bl ov29_02336DB0 - str r0, [sp, #0x1c] - mov r0, #0 - str r0, [sp, #0xc] - mov r0, r5, lsl #0x10 - mov r0, r0, asr #0x10 - str r0, [sp, #0x24] - add r0, sl, #0xc4 + UPDATE_TRAPS_VISIBILITY_OFFSET - str r0, [sp, #0x2c] - mov r0, r7, lsl #0x10 - mov r0, r0, asr #0x10 - str r0, [sp, #0x28] - mov r0, sb, lsl #0x10 - mov r0, r0, asr #0x10 - str r0, [sp, #0x20] -_02337044: - mov r0, #0 - str r0, [sp] - ldr r3, [sp, #0x1c] - and r4, r4, #0x1f - ldrh r2, [r3], #6 - str r3, [sp, #0x1c] - ldr r0, [sp, #0x20] - mov r1, r4 - mov r3, #1 - bl sub_02051D8C - add r8, r8, #1 - add r4, r4, #1 - cmp r8, #3 - bne _023370B8 - str fp, [sp] - ldr r0, [sp, #0x18] - add r6, r6, #1 - str r0, [sp, #4] - ldr r0, [sp, #0x14] - mov r2, r6, lsl #0x10 - str r0, [sp, #8] - ldr r0, [sp, #0x2c] - ldr r1, [sp, #0x24] - ldr r3, [sp, #0x28] - add r0, r0, #0x4000 - mov r2, r2, asr #0x10 - mov r8, #0 - bl ov29_02336DB0 - str r0, [sp, #0x1c] -_023370B8: - ldr r0, [sp, #0xc] - add r0, r0, #1 - str r0, [sp, #0xc] - cmp r0, #0x1b - blt _02337044 - ldr r0, [sp, #0x10] - add r7, r7, #1 - add r0, r0, #1 - cmp r7, #3 - add sb, sb, #1 - addeq r5, r5, #1 - moveq r7, #0 - str r0, [sp, #0x10] - cmp r0, #0x21 - blt _02336FA0 - mov r0, #1 - mov r1, #0 - bl sub_02051E60 - add sp, sp, #0x30 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02337108: .word DUNGEON_PTR -_0233710C: .word 0x0001A224 + UPDATE_TRAPS_VISIBILITY_OFFSET -_02337110: .word ov29_02352B9C -_02337114: .word ov29_02352D58 -_02337118: .word 0x0001A226 + UPDATE_TRAPS_VISIBILITY_OFFSET - arm_func_end UpdateTrapsVisibility - - arm_func_start ov29_0233711C -ov29_0233711C: ; 0x0233711C -#ifdef JAPAN -#define OV29_0233711C_OFFSET -0xA4 -#else -#define OV29_0233711C_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x1c - ldr r2, _02337294 ; =DUNGEON_PTR - mov r4, r1 - ldr sl, [r2] - mov r5, r0 - add r1, sl, #0x1a000 - ldrb r0, [r1, #0x245 + OV29_0233711C_OFFSET] - str r0, [sp, #0x18] - ldrb fp, [r1, #0x244 + OV29_0233711C_OFFSET] - bl IsSecretBazaar - ldr r2, _02337298 ; =0x0001A224 - ldr r1, _0233729C ; =ov29_02352B9C - add r3, r2, #2 - ldrsh r6, [sl, r2] - ldrsh r2, [sl, r3] - add r3, r6, r5 - str r0, [sp, #0x14] - add r0, r2, r4 - mov r0, r0, asr #3 - sub sb, r0, #1 - add r0, sb, #0x1e - mov r2, r0, lsl #1 - str fp, [sp] - ldr r0, [sp, #0x18] - mov r8, r3, asr #3 - str r0, [sp, #4] - ldr r0, [sp, #0x14] - ldrsh r7, [r1, r2] - str r0, [sp, #8] - add r0, r8, #0x1e - mov r3, r0, lsl #1 - ldrsh r6, [r1, r3] - ldr r1, _023372A0 ; =ov29_02352D58 - add r0, sl, #0xc4 + OV29_0233711C_OFFSET - ldrsh r4, [r1, r3] - ldrsh r5, [r1, r2] - add r3, r7, r7, lsl #1 - add r3, r6, r3 - mov r1, r4, lsl #0x10 - mov r2, r5, lsl #0x10 - mov r3, r3, lsl #0x10 - add r0, r0, #0x4000 - mov r1, r1, asr #0x10 - mov r2, r2, asr #0x10 - mov r3, r3, asr #0x10 - bl ov29_02336DB0 - str r0, [sp, #0x10] - mov r0, #0 - str r0, [sp, #0xc] - mov r0, r4, lsl #0x10 - mov r1, r6, lsl #0x10 - add r4, sl, #0xc4 + OV29_0233711C_OFFSET - mov r6, r0, asr #0x10 - mov sl, r1, asr #0x10 -_023371F8: - mov r0, #0 - ldr r3, [sp, #0x10] - str r0, [sp] - ldrh r2, [r3], #6 - and r8, r8, #0x3f - and sb, sb, #0x1f - str r3, [sp, #0x10] - mov r0, r8 - mov r1, sb - mov r3, #1 - bl sub_02051D8C - add r7, r7, #1 - add sb, sb, #1 - cmp r7, #3 - bne _0233726C - str fp, [sp] - ldr r0, [sp, #0x18] - add r5, r5, #1 - str r0, [sp, #4] - ldr r0, [sp, #0x14] - mov r2, r5, lsl #0x10 - str r0, [sp, #8] - add r0, r4, #0x4000 - mov r1, r6 - mov r2, r2, asr #0x10 - mov r3, sl - mov r7, #0 - bl ov29_02336DB0 - str r0, [sp, #0x10] -_0233726C: - ldr r0, [sp, #0xc] - add r0, r0, #1 - str r0, [sp, #0xc] - cmp r0, #0x1b - blt _023371F8 - mov r0, #1 - mov r1, #0 - bl sub_02051E60 - add sp, sp, #0x1c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02337294: .word DUNGEON_PTR -_02337298: .word 0x0001A224 + OV29_0233711C_OFFSET -_0233729C: .word ov29_02352B9C -_023372A0: .word ov29_02352D58 - arm_func_end ov29_0233711C - - arm_func_start ov29_023372A4 -ov29_023372A4: ; 0x023372A4 -#ifdef JAPAN -#define OV29_023372A4_OFFSET -0xA4 -#else -#define OV29_023372A4_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x1c - ldr r2, _02337418 ; =DUNGEON_PTR - mov r4, r1 - ldr sl, [r2] - mov r5, r0 - add r1, sl, #0x1a000 - ldrb r0, [r1, #0x245 + OV29_023372A4_OFFSET] - str r0, [sp, #0x18] - ldrb fp, [r1, #0x244 + OV29_023372A4_OFFSET] - bl IsSecretBazaar - ldr r2, _0233741C ; =0x0001A224 - ldr r1, _02337420 ; =ov29_02352B9C - add r3, r2, #2 - ldrsh r6, [sl, r2] - ldrsh r2, [sl, r3] - add r3, r6, r5 - str r0, [sp, #0x14] - add r0, r2, r4 - mov r8, r0, asr #3 - add r0, r8, #0x1e - mov r7, r3, asr #3 - str fp, [sp] - mov r2, r0, lsl #1 - ldr r0, [sp, #0x18] - ldr r3, _02337424 ; =ov29_02352D58 - str r0, [sp, #4] - ldr r0, [sp, #0x14] - ldrsh r5, [r3, r2] - str r0, [sp, #8] - add r0, r7, #0x1e - mov r4, r0, lsl #1 - ldrsh r6, [r1, r4] - ldrsh r1, [r1, r2] - add r0, sl, #0xc4 + OV29_023372A4_OFFSET - mov r2, r5, lsl #0x10 - ldrsh r4, [r3, r4] - add sb, r1, r1, lsl #1 - add r3, r6, sb - mov r1, r4, lsl #0x10 - mov r3, r3, lsl #0x10 - add r0, r0, #0x4000 - mov r1, r1, asr #0x10 - mov r2, r2, asr #0x10 - mov r3, r3, asr #0x10 - bl ov29_02336DB0 - str r0, [sp, #0x10] - mov r0, #0 - str r0, [sp, #0xc] - mov r0, r5, lsl #0x10 - mov r1, sb, lsl #0x10 - add r5, sl, #0xc4 + OV29_023372A4_OFFSET - mov sb, r0, asr #0x10 - mov sl, r1, asr #0x10 -_0233737C: - mov r0, #0 - ldr r3, [sp, #0x10] - str r0, [sp] - ldrh r2, [r3], #2 - and r7, r7, #0x3f - and r8, r8, #0x1f - str r3, [sp, #0x10] - mov r0, r7 - mov r1, r8 - mov r3, #1 - bl sub_02051D8C - add r6, r6, #1 - add r7, r7, #1 - cmp r6, #3 - bne _023373F0 - str fp, [sp] - ldr r0, [sp, #0x18] - add r4, r4, #1 - str r0, [sp, #4] - ldr r0, [sp, #0x14] - mov r1, r4, lsl #0x10 - str r0, [sp, #8] - add r0, r5, #0x4000 - mov r1, r1, asr #0x10 - mov r2, sb - mov r3, sl - mov r6, #0 - bl ov29_02336DB0 - str r0, [sp, #0x10] -_023373F0: - ldr r0, [sp, #0xc] - add r0, r0, #1 - str r0, [sp, #0xc] - cmp r0, #0x21 - blt _0233737C - mov r0, #1 - mov r1, #0 - bl sub_02051E60 - add sp, sp, #0x1c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02337418: .word DUNGEON_PTR -_0233741C: .word 0x0001A224 + OV29_023372A4_OFFSET -_02337420: .word ov29_02352B9C -_02337424: .word ov29_02352D58 - arm_func_end ov29_023372A4 - - arm_func_start DrawTileGrid -DrawTileGrid: ; 0x02337428 -#ifdef JAPAN -#define DRAW_TILE_GRID_OFFSET -0xA4 -#else -#define DRAW_TILE_GRID_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x44 - ldr r5, _02337780 ; =DUNGEON_PTR - str r2, [sp, #4] - mov r4, r0 - mov r7, r1 - mov r6, r3 - ldr r5, [r5] - bl GetLeader - ldr r1, _02337784 ; =0x0001A224 - ldr r2, _02337780 ; =DUNGEON_PTR - ldrsh r8, [r5, r1] - ldr r1, [r2] - ldr r2, _02337788 ; =DIRECTIONS_XY - add r1, r1, #0x1a000 - strb r6, [r1, #0x251 + DRAW_TILE_GRID_OFFSET] - mov r3, r7, lsl #2 - add r1, r2, r7, lsl #2 - ldrsh r3, [r2, r3] - ldrsh sl, [r1, #2] - ldrsh r6, [r4] - ldrsh r7, [r4, #2] - str r0, [sp, #0x20] - mov sb, r8, asr #3 - mov r2, #0 - add r1, sp, #0x2c -_02337490: - mov r0, r2, lsl #2 - strh r6, [r1, r0] - add r0, r1, r2, lsl #2 - add r2, r2, #1 - strh r7, [r0, #2] - cmp r2, #6 - add r6, r6, r3 - add r7, r7, sl - blt _02337490 - add r0, sb, #0x1e - mov r2, r0, lsl #1 - ldr r1, _0233778C ; =ov29_02352B9C - ldr r0, _02337790 ; =ov29_02352D58 - ldrsh r8, [r1, r2] - ldrsh r6, [r0, r2] - mov r0, #0 - str r0, [sp, #0xc] -_023374D4: - ldr r0, _02337794 ; =0x0001A226 - ldr r2, _0233778C ; =ov29_02352B9C - ldrsh r3, [r5, r0] - ldr r0, [sp, #4] - ldr r1, _02337790 ; =ov29_02352D58 - mov fp, r3, asr #3 - cmp r0, #0 - add r0, r2, fp, lsl #1 - add r1, r1, fp, lsl #1 - ldrsh r0, [r0, #0x3c] - ldrsh r7, [r1, #0x3c] - strh r6, [sp, #0x28] - str r0, [sp, #0x1c] - add r0, r0, r0, lsl #1 - strh r7, [sp, #0x2a] - add sl, r8, r0 - beq _02337544 - ldrsh r0, [r4] - cmp r6, r0 - ldreqsh r0, [r4, #2] - cmpeq r7, r0 - addeq r0, r5, #0x150 + DRAW_TILE_GRID_OFFSET - addeq r0, r0, #0x12000 - addeq sl, r0, sl, lsl #1 - addne r0, r5, #0x12c + DRAW_TILE_GRID_OFFSET - addne r0, r0, #0x12000 - addne sl, r0, sl, lsl #1 - b _023375E8 -_02337544: - ldr r0, [sp, #0x20] - add r1, sp, #0x28 - bl CannotStandOnTileNoMonsterCheck - cmp r0, #0 - bne _023375DC - ldr r0, [sp, #0x20] - add r1, sp, #0x28 - bl CanSeePosition - cmp r0, #0 - beq _023375DC - mov r0, #0 - add r2, sp, #0x2c - b _02337598 -_02337578: - mov r3, r0, lsl #2 - ldrsh r1, [r2, r3] - cmp r6, r1 - addeq r1, r2, r3 - ldreqsh r1, [r1, #2] - cmpeq r7, r1 - beq _023375A0 - add r0, r0, #1 -_02337598: - cmp r0, #6 - blt _02337578 -_023375A0: - cmp r0, #6 - bne _023375CC - bl GetGridsOption - cmp r0, #0 -#ifdef JAPAN - addne r0, r5, #0x9a - addne r0, r0, #0x12000 -#else - ldrne r0, _02337798 ; =0x0001213E - addne r0, r5, r0 -#endif - addne sl, r0, sl, lsl #1 - addeq r0, r5, #0x12c + DRAW_TILE_GRID_OFFSET - addeq r0, r0, #0x12000 - addeq sl, r0, sl, lsl #1 - b _023375E8 -_023375CC: - add r0, r5, #0x150 + DRAW_TILE_GRID_OFFSET - add r0, r0, #0x12000 - add sl, r0, sl, lsl #1 - b _023375E8 -_023375DC: - add r0, r5, #0x12c + DRAW_TILE_GRID_OFFSET - add r0, r0, #0x12000 - add sl, r0, sl, lsl #1 -_023375E8: - add r0, r5, #0x150 + DRAW_TILE_GRID_OFFSET - add r0, r0, #0x12000 - add r0, r0, r8, lsl #1 -#ifdef JAPAN - add r1, r5, #0x88 - str r0, [sp, #0x18] - add r0, r1, #0x12000 - add r0, r0, r8, lsl #1 - str r0, [sp, #0x14] - mov r0, #0 - str r0, [sp, #8] - add r0, r5, #0x9a - add r0, r0, #0x12000 - add r0, r0, r8, lsl #1 - str r0, [sp, #0x10] -#else - ldr r1, _02337798 ; =0x0001213E - str r0, [sp, #0x18] - add r0, r5, r1 - add r0, r0, r8, lsl #1 - str r0, [sp, #0x10] - mov r0, #0 - str r0, [sp, #8] - add r0, r5, #0x12c - add r0, r0, #0x12000 - add r0, r0, r8, lsl #1 - str r0, [sp, #0x14] -#endif - mov r0, r6, lsl #0x10 - mov r0, r0, asr #0x10 - str r0, [sp, #0x24] -_0233762C: - mov r0, #0 - str r0, [sp] - ldrh r2, [sl], #6 - and sb, sb, #0x3f - and fp, fp, #0x1f - mov r0, sb - mov r1, fp - mov r3, #0 - bl sub_02051D8C - ldr r0, [sp, #0x1c] - add fp, fp, #1 - add r0, r0, #1 - str r0, [sp, #0x1c] - cmp r0, #3 - bne _02337730 - ldr r0, [sp, #0x24] - add r7, r7, #1 - strh r0, [sp, #0x28] - ldr r0, [sp, #4] - cmp r0, #0 - mov r0, #0 - str r0, [sp, #0x1c] - strh r7, [sp, #0x2a] - beq _023376A8 - ldrsh r0, [r4] - cmp r6, r0 - ldreqsh r0, [r4, #2] - cmpeq r7, r0 - ldreq sl, [sp, #0x18] - ldrne sl, [sp, #0x14] - b _02337730 -_023376A8: - ldr r0, [sp, #0x20] - add r1, sp, #0x28 - bl CannotStandOnTileNoMonsterCheck - cmp r0, #0 - bne _0233772C - ldr r0, [sp, #0x20] - add r1, sp, #0x28 - bl CanSeePosition - cmp r0, #0 - beq _0233772C - mov r0, #0 - b _02337700 -_023376D8: - mov r2, r0, lsl #2 - add r1, sp, #0x2c - ldrsh r1, [r1, r2] - cmp r6, r1 - addeq r1, sp, #0x2c - addeq r1, r1, r2 - ldreqsh r1, [r1, #2] - cmpeq r7, r1 - beq _02337708 - add r0, r0, #1 -_02337700: - cmp r0, #6 - blt _023376D8 -_02337708: - cmp r0, #6 - bne _02337724 - bl GetGridsOption - cmp r0, #0 - ldrne sl, [sp, #0x10] - ldreq sl, [sp, #0x14] - b _02337730 -_02337724: - ldr sl, [sp, #0x18] - b _02337730 -_0233772C: - ldr sl, [sp, #0x14] -_02337730: - ldr r0, [sp, #8] - add r0, r0, #1 - str r0, [sp, #8] - cmp r0, #0x19 - blt _0233762C - ldr r0, [sp, #0xc] - add r8, r8, #1 - add r0, r0, #1 - cmp r8, #3 - add sb, sb, #1 - addeq r6, r6, #1 - moveq r8, #0 - str r0, [sp, #0xc] - cmp r0, #0x21 - blt _023374D4 - mov r0, #0 - mov r1, r0 - bl sub_02051E60 - add sp, sp, #0x44 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02337780: .word DUNGEON_PTR -_02337784: .word 0x0001A224 + DRAW_TILE_GRID_OFFSET -_02337788: .word DIRECTIONS_XY -_0233778C: .word ov29_02352B9C -_02337790: .word ov29_02352D58 -_02337794: .word 0x0001A226 + DRAW_TILE_GRID_OFFSET -#ifndef JAPAN -_02337798: .word 0x0001213E -#endif - arm_func_end DrawTileGrid - - arm_func_start HideTileGrid -HideTileGrid: ; 0x0233779C - stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} - sub sp, sp, #4 - mov r8, #0 - mov r5, r8 - mov r6, r8 -_023377B0: - mov r0, r8, lsl #0x10 - mov r7, r6 - mov r4, r0, asr #0x10 -_023377BC: - mov r0, r7, lsl #0x10 - mov r1, r4 - mov r2, r5 - mov r3, r5 - mov r0, r0, asr #0x10 - str r5, [sp] - bl sub_02051D8C - add r7, r7, #1 - cmp r7, #0x20 - blt _023377BC - add r8, r8, #1 - cmp r8, #0x20 - blt _023377B0 - mov r0, #0 - mov r1, r0 - bl sub_02051E60 - ldr r0, _02337818 ; =DUNGEON_PTR - mov r1, #0 - ldr r0, [r0] - add r0, r0, #0x1a000 -#ifdef JAPAN - strb r1, [r0, #0x1ad] -#else - strb r1, [r0, #0x251] -#endif - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} - .align 2, 0 -_02337818: .word DUNGEON_PTR - arm_func_end HideTileGrid - - arm_func_start ov29_0233781C -ov29_0233781C: ; 0x0233781C - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, #0 - mov r4, r7 - mov r5, r7 -_0233782C: - mov r6, r5 -_02337830: - mov r0, r6 - mov r1, r7 - bl GetTileSafe - add r6, r6, #1 - strh r4, [r0, #2] - cmp r6, #0x38 - blt _02337830 - add r7, r7, #1 - cmp r7, #0x20 - blt _0233782C - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ov29_0233781C - - arm_func_start ov29_0233785C -ov29_0233785C: ; 0x0233785C -#ifdef JAPAN -#define OV29_0233785C_OFFSET -0xA4 -#else -#define OV29_0233785C_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - ldr r1, _02337A34 ; =0x0000270F - mov r3, #0 - ldr r6, _02337A38 ; =DUNGEON_PTR - mov sb, r3 - rsb r0, r1, #0 - mov r4, #0x1c -_02337878: - mul r2, r3, r4 - ldr r5, [r6] - add r3, r3, #1 - add r5, r5, r2 - add r5, r5, #0xe000 - strb sb, [r5, #0xee8 + OV29_0233785C_OFFSET] - ldr r5, [r6] - cmp r3, #0x20 - add r5, r5, r2 - add r5, r5, #0xe000 - strb sb, [r5, #0xee9 + OV29_0233785C_OFFSET] - ldr r5, [r6] - add r5, r5, r2 - add r5, r5, #0xee00 - strh r1, [r5, #0xea + OV29_0233785C_OFFSET] - ldr r5, [r6] - add r5, r5, r2 - add r5, r5, #0xee00 - strh r1, [r5, #0xec + OV29_0233785C_OFFSET] - ldr r5, [r6] - add r5, r5, r2 - add r5, r5, #0xee00 - strh r0, [r5, #0xee + OV29_0233785C_OFFSET] - ldr r5, [r6] - add r2, r5, r2 - add r2, r2, #0xee00 - strh r0, [r2, #0xf0 + OV29_0233785C_OFFSET] - blt _02337878 - mov sl, sb -_023378EC: - add r5, sl, #1 - mov r0, sl, lsl #0x10 - mov r1, r5, lsl #0x10 - ldr fp, _02337A38 ; =DUNGEON_PTR - mov r8, #0 - mov r6, r0, asr #0x10 - mov r4, r1, asr #0x10 - mov r7, #1 -_0233790C: - mov r0, r8 - mov r1, sl - bl GetTile - ldrb r1, [r0, #7] - cmp r1, #0xff - beq _0233797C - mov r0, #0x1c - mul r2, r1, r0 - ldr r0, [fp] - add r0, r0, #0x2e8 + OV29_0233785C_OFFSET - add r0, r0, #0xec00 - strb r7, [r0, r2] - add r0, r0, r2 - ldrsh r2, [r0, #2] - cmp r2, r8 - strgth r8, [r0, #2] - ldrsh r2, [r0, #4] - cmp r2, sl - strgth r6, [r0, #4] - ldrsh r3, [r0, #6] - add r2, r8, #1 - cmp r3, r2 - strlth r2, [r0, #6] - ldrsh r2, [r0, #8] - cmp r2, r5 - strlth r4, [r0, #8] - cmp sb, r1 - andlt sb, r1, #0xff -_0233797C: - add r8, r8, #1 - cmp r8, #0x38 - blt _0233790C - add sl, sl, #1 - cmp sl, #0x20 - blt _023378EC - mov r2, #0x18 - ldr r7, _02337A38 ; =DUNGEON_PTR - mov r1, #0 - mov r3, r2 - mov r4, r2 - mov r5, r2 - mov r6, #0x1c -_023379B0: - mul sl, r1, r6 - ldr r0, [r7] - add r0, r0, #0x2e8 + OV29_0233785C_OFFSET - add r0, r0, #0xec00 - ldrb r8, [r0, sl] - add r0, r0, sl - cmp r8, #0 - beq _02337A10 - ldrsh r8, [r0, #2] - sub r8, r8, #1 - mul sl, r8, r2 - str sl, [r0, #0xc] - ldrsh r8, [r0, #4] - sub r8, r8, #1 - mul sl, r8, r3 - str sl, [r0, #0x10] - ldrsh r8, [r0, #6] - add r8, r8, #1 - mul sl, r8, r4 - str sl, [r0, #0x14] - ldrsh r8, [r0, #8] - add r8, r8, #1 - mul sl, r8, r5 - str sl, [r0, #0x18] -_02337A10: - add r1, r1, #1 - cmp r1, #0x20 - blt _023379B0 - ldr r0, _02337A38 ; =DUNGEON_PTR - add r1, sb, #1 - ldr r0, [r0] - add r0, r0, #0xe000 - strb r1, [r0, #0xee4 + OV29_0233785C_OFFSET] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02337A34: .word 0x0000270F -_02337A38: .word DUNGEON_PTR - arm_func_end ov29_0233785C - - arm_func_start DiscoverMinimap -DiscoverMinimap: ; 0x02337A3C -#ifdef JAPAN -#define DISCOVER_MINIMAP_OFFSET -0xA4 -#else -#define DISCOVER_MINIMAP_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r5, r0 - ldrsh r0, [r5] - ldrsh r1, [r5, #2] - bl GetTile - ldrb r4, [r0, #7] - bl GetVisibilityRange - ldr r1, _02337B28 ; =DUNGEON_PTR - ldr r3, [r1] - add r1, r3, #0x1a000 - ldrb r2, [r1, #0x23e + DISCOVER_MINIMAP_OFFSET] - cmp r2, #0 - ldmneia sp!, {r4, r5, r6, r7, r8, pc} - ldrb r1, [r1, #0x250 + DISCOVER_MINIMAP_OFFSET] - cmp r1, #0 - bne _02337A84 - cmp r4, #0xff - bne _02337AA0 -_02337A84: - ldrsh r2, [r5] - ldrsh r1, [r5, #2] - sub r4, r2, r0 - sub r7, r1, r0 - add r5, r2, r0 - add r6, r1, r0 - b _02337B1C -_02337AA0: - add r0, r3, #0x2e8 + DISCOVER_MINIMAP_OFFSET - add r1, r0, #0xec00 - mov r0, #0x1c - mla r2, r4, r0, r1 - ldrb r0, [r2, #1] - cmp r0, #0 - ldmneia sp!, {r4, r5, r6, r7, r8, pc} - mov r0, #1 - strb r0, [r2, #1] - ldrsh r1, [r2, #2] - ldrsh r0, [r2, #4] - ldrsh r5, [r2, #6] - ldrsh r6, [r2, #8] - sub r4, r1, #1 - sub r7, r0, #1 - b _02337B1C -_02337AE0: - mov r8, r4 - b _02337B10 -_02337AE8: - mov r0, r8 - mov r1, r7 - bl GetTileSafe - ldrh r2, [r0, #2] - mov r1, r7 - orr r2, r2, #3 - strh r2, [r0, #2] - mov r0, r8 - bl DrawMinimapTile - add r8, r8, #1 -_02337B10: - cmp r8, r5 - ble _02337AE8 - add r7, r7, #1 -_02337B1C: - cmp r7, r6 - ble _02337AE0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_02337B28: .word DUNGEON_PTR - arm_func_end DiscoverMinimap - - arm_func_start PositionHasItem -PositionHasItem: ; 0x02337B2C - stmdb sp!, {r3, lr} - mov r1, r0 - ldrsh r0, [r1] - ldrsh r1, [r1, #2] - bl GetTile - ldr r0, [r0, #0x10] - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, pc} - ldr r0, [r0] - cmp r0, #3 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - arm_func_end PositionHasItem - - arm_func_start PositionHasMonster -PositionHasMonster: ; 0x02337B68 - stmdb sp!, {r3, lr} - mov r1, r0 - ldrsh r0, [r1] - ldrsh r1, [r1, #2] - bl GetTile - ldr r0, [r0, #0xc] - cmp r0, #0 - beq _02337B94 - ldr r1, [r0] - cmp r1, #1 - ldmeqia sp!, {r3, pc} -_02337B94: - mov r0, #0 - ldmia sp!, {r3, pc} - arm_func_end PositionHasMonster - - arm_func_start TrySmashWall -TrySmashWall: ; 0x02337B9C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r0 - ldrsh r0, [r8] - ldrsh r1, [r8, #2] - mov r5, #0 - bl GetTileSafe - ldrh r1, [r0] - tst r1, #3 - bne _02337C4C - ldrh r1, [r0] - tst r1, #0x100 - bne _02337C4C - tst r1, #0x10 - bne _02337C4C - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - mov r5, #1 - sub r7, r5, #2 - orr r1, r1, #1 - strh r1, [r0] - mov r4, r7 -_02337BF4: - mov r6, r4 -_02337BF8: - ldrsh r0, [r8] - ldrsh r1, [r8, #2] - add r0, r6, r0 - add r1, r7, r1 - bl ov29_02336694 - ldrsh r0, [r8] - ldrsh r1, [r8, #2] - add r0, r6, r0 - add r1, r7, r1 - bl DetermineTileWalkableNeighbors - ldrsh r0, [r8] - ldrsh r1, [r8, #2] - add r0, r6, r0 - add r1, r7, r1 - bl DrawMinimapTile - add r6, r6, #1 - cmp r6, #1 - ble _02337BF8 - add r7, r7, #1 - cmp r7, #1 - ble _02337BF4 -_02337C4C: - cmp r5, #0 - beq _02337C9C - ldr r4, _02337CA4 ; =DUNGEON_PTR - mov r6, #0 -_02337C5C: - ldr r0, [r4] - add r0, r0, r6, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r7, [r0, #0xad4] -#else - ldr r7, [r0, #0xb78] -#endif - mov r0, r7 - bl EntityIsValid__02337CA8 - cmp r0, #0 - beq _02337C84 - mov r0, r7 - bl DetermineMonsterShadow -_02337C84: - add r6, r6, #1 - cmp r6, #0x14 - blt _02337C5C - bl UpdateTrapsVisibility - mov r0, r8 - bl ov29_022E66C4 -_02337C9C: - mov r0, r5 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_02337CA4: .word DUNGEON_PTR - arm_func_end TrySmashWall diff --git a/asm/overlay_29_0233711C.s b/asm/overlay_29_0233711C.s new file mode 100644 index 00000000..1bee35a9 --- /dev/null +++ b/asm/overlay_29_0233711C.s @@ -0,0 +1,888 @@ + .include "asm/macros.inc" + .include "overlay_29_0233711C.inc" + + .text + + arm_func_start ov29_0233711C +ov29_0233711C: ; 0x0233711C +#ifdef JAPAN +#define OV29_0233711C_OFFSET -0xA4 +#else +#define OV29_0233711C_OFFSET 0 +#endif + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x1c + ldr r2, _02337294 ; =DUNGEON_PTR + mov r4, r1 + ldr sl, [r2] + mov r5, r0 + add r1, sl, #0x1a000 + ldrb r0, [r1, #0x245 + OV29_0233711C_OFFSET] + str r0, [sp, #0x18] + ldrb fp, [r1, #0x244 + OV29_0233711C_OFFSET] + bl IsSecretBazaar + ldr r2, _02337298 ; =0x0001A224 + ldr r1, _0233729C ; =ov29_02352B9C + add r3, r2, #2 + ldrsh r6, [sl, r2] + ldrsh r2, [sl, r3] + add r3, r6, r5 + str r0, [sp, #0x14] + add r0, r2, r4 + mov r0, r0, asr #3 + sub sb, r0, #1 + add r0, sb, #0x1e + mov r2, r0, lsl #1 + str fp, [sp] + ldr r0, [sp, #0x18] + mov r8, r3, asr #3 + str r0, [sp, #4] + ldr r0, [sp, #0x14] + ldrsh r7, [r1, r2] + str r0, [sp, #8] + add r0, r8, #0x1e + mov r3, r0, lsl #1 + ldrsh r6, [r1, r3] + ldr r1, _023372A0 ; =ov29_02352D58 + add r0, sl, #0xc4 + OV29_0233711C_OFFSET + ldrsh r4, [r1, r3] + ldrsh r5, [r1, r2] + add r3, r7, r7, lsl #1 + add r3, r6, r3 + mov r1, r4, lsl #0x10 + mov r2, r5, lsl #0x10 + mov r3, r3, lsl #0x10 + add r0, r0, #0x4000 + mov r1, r1, asr #0x10 + mov r2, r2, asr #0x10 + mov r3, r3, asr #0x10 + bl ov29_02336DB0 + str r0, [sp, #0x10] + mov r0, #0 + str r0, [sp, #0xc] + mov r0, r4, lsl #0x10 + mov r1, r6, lsl #0x10 + add r4, sl, #0xc4 + OV29_0233711C_OFFSET + mov r6, r0, asr #0x10 + mov sl, r1, asr #0x10 +_023371F8: + mov r0, #0 + ldr r3, [sp, #0x10] + str r0, [sp] + ldrh r2, [r3], #6 + and r8, r8, #0x3f + and sb, sb, #0x1f + str r3, [sp, #0x10] + mov r0, r8 + mov r1, sb + mov r3, #1 + bl sub_02051D8C + add r7, r7, #1 + add sb, sb, #1 + cmp r7, #3 + bne _0233726C + str fp, [sp] + ldr r0, [sp, #0x18] + add r5, r5, #1 + str r0, [sp, #4] + ldr r0, [sp, #0x14] + mov r2, r5, lsl #0x10 + str r0, [sp, #8] + add r0, r4, #0x4000 + mov r1, r6 + mov r2, r2, asr #0x10 + mov r3, sl + mov r7, #0 + bl ov29_02336DB0 + str r0, [sp, #0x10] +_0233726C: + ldr r0, [sp, #0xc] + add r0, r0, #1 + str r0, [sp, #0xc] + cmp r0, #0x1b + blt _023371F8 + mov r0, #1 + mov r1, #0 + bl sub_02051E60 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_02337294: .word DUNGEON_PTR +_02337298: .word 0x0001A224 + OV29_0233711C_OFFSET +_0233729C: .word ov29_02352B9C +_023372A0: .word ov29_02352D58 + arm_func_end ov29_0233711C + + arm_func_start ov29_023372A4 +ov29_023372A4: ; 0x023372A4 +#ifdef JAPAN +#define OV29_023372A4_OFFSET -0xA4 +#else +#define OV29_023372A4_OFFSET 0 +#endif + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x1c + ldr r2, _02337418 ; =DUNGEON_PTR + mov r4, r1 + ldr sl, [r2] + mov r5, r0 + add r1, sl, #0x1a000 + ldrb r0, [r1, #0x245 + OV29_023372A4_OFFSET] + str r0, [sp, #0x18] + ldrb fp, [r1, #0x244 + OV29_023372A4_OFFSET] + bl IsSecretBazaar + ldr r2, _0233741C ; =0x0001A224 + ldr r1, _02337420 ; =ov29_02352B9C + add r3, r2, #2 + ldrsh r6, [sl, r2] + ldrsh r2, [sl, r3] + add r3, r6, r5 + str r0, [sp, #0x14] + add r0, r2, r4 + mov r8, r0, asr #3 + add r0, r8, #0x1e + mov r7, r3, asr #3 + str fp, [sp] + mov r2, r0, lsl #1 + ldr r0, [sp, #0x18] + ldr r3, _02337424 ; =ov29_02352D58 + str r0, [sp, #4] + ldr r0, [sp, #0x14] + ldrsh r5, [r3, r2] + str r0, [sp, #8] + add r0, r7, #0x1e + mov r4, r0, lsl #1 + ldrsh r6, [r1, r4] + ldrsh r1, [r1, r2] + add r0, sl, #0xc4 + OV29_023372A4_OFFSET + mov r2, r5, lsl #0x10 + ldrsh r4, [r3, r4] + add sb, r1, r1, lsl #1 + add r3, r6, sb + mov r1, r4, lsl #0x10 + mov r3, r3, lsl #0x10 + add r0, r0, #0x4000 + mov r1, r1, asr #0x10 + mov r2, r2, asr #0x10 + mov r3, r3, asr #0x10 + bl ov29_02336DB0 + str r0, [sp, #0x10] + mov r0, #0 + str r0, [sp, #0xc] + mov r0, r5, lsl #0x10 + mov r1, sb, lsl #0x10 + add r5, sl, #0xc4 + OV29_023372A4_OFFSET + mov sb, r0, asr #0x10 + mov sl, r1, asr #0x10 +_0233737C: + mov r0, #0 + ldr r3, [sp, #0x10] + str r0, [sp] + ldrh r2, [r3], #2 + and r7, r7, #0x3f + and r8, r8, #0x1f + str r3, [sp, #0x10] + mov r0, r7 + mov r1, r8 + mov r3, #1 + bl sub_02051D8C + add r6, r6, #1 + add r7, r7, #1 + cmp r6, #3 + bne _023373F0 + str fp, [sp] + ldr r0, [sp, #0x18] + add r4, r4, #1 + str r0, [sp, #4] + ldr r0, [sp, #0x14] + mov r1, r4, lsl #0x10 + str r0, [sp, #8] + add r0, r5, #0x4000 + mov r1, r1, asr #0x10 + mov r2, sb + mov r3, sl + mov r6, #0 + bl ov29_02336DB0 + str r0, [sp, #0x10] +_023373F0: + ldr r0, [sp, #0xc] + add r0, r0, #1 + str r0, [sp, #0xc] + cmp r0, #0x21 + blt _0233737C + mov r0, #1 + mov r1, #0 + bl sub_02051E60 + add sp, sp, #0x1c + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_02337418: .word DUNGEON_PTR +_0233741C: .word 0x0001A224 + OV29_023372A4_OFFSET +_02337420: .word ov29_02352B9C +_02337424: .word ov29_02352D58 + arm_func_end ov29_023372A4 + + arm_func_start DrawTileGrid +DrawTileGrid: ; 0x02337428 +#ifdef JAPAN +#define DRAW_TILE_GRID_OFFSET -0xA4 +#else +#define DRAW_TILE_GRID_OFFSET 0 +#endif + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x44 + ldr r5, _02337780 ; =DUNGEON_PTR + str r2, [sp, #4] + mov r4, r0 + mov r7, r1 + mov r6, r3 + ldr r5, [r5] + bl GetLeader + ldr r1, _02337784 ; =0x0001A224 + ldr r2, _02337780 ; =DUNGEON_PTR + ldrsh r8, [r5, r1] + ldr r1, [r2] + ldr r2, _02337788 ; =DIRECTIONS_XY + add r1, r1, #0x1a000 + strb r6, [r1, #0x251 + DRAW_TILE_GRID_OFFSET] + mov r3, r7, lsl #2 + add r1, r2, r7, lsl #2 + ldrsh r3, [r2, r3] + ldrsh sl, [r1, #2] + ldrsh r6, [r4] + ldrsh r7, [r4, #2] + str r0, [sp, #0x20] + mov sb, r8, asr #3 + mov r2, #0 + add r1, sp, #0x2c +_02337490: + mov r0, r2, lsl #2 + strh r6, [r1, r0] + add r0, r1, r2, lsl #2 + add r2, r2, #1 + strh r7, [r0, #2] + cmp r2, #6 + add r6, r6, r3 + add r7, r7, sl + blt _02337490 + add r0, sb, #0x1e + mov r2, r0, lsl #1 + ldr r1, _0233778C ; =ov29_02352B9C + ldr r0, _02337790 ; =ov29_02352D58 + ldrsh r8, [r1, r2] + ldrsh r6, [r0, r2] + mov r0, #0 + str r0, [sp, #0xc] +_023374D4: + ldr r0, _02337794 ; =0x0001A226 + ldr r2, _0233778C ; =ov29_02352B9C + ldrsh r3, [r5, r0] + ldr r0, [sp, #4] + ldr r1, _02337790 ; =ov29_02352D58 + mov fp, r3, asr #3 + cmp r0, #0 + add r0, r2, fp, lsl #1 + add r1, r1, fp, lsl #1 + ldrsh r0, [r0, #0x3c] + ldrsh r7, [r1, #0x3c] + strh r6, [sp, #0x28] + str r0, [sp, #0x1c] + add r0, r0, r0, lsl #1 + strh r7, [sp, #0x2a] + add sl, r8, r0 + beq _02337544 + ldrsh r0, [r4] + cmp r6, r0 + ldreqsh r0, [r4, #2] + cmpeq r7, r0 + addeq r0, r5, #0x150 + DRAW_TILE_GRID_OFFSET + addeq r0, r0, #0x12000 + addeq sl, r0, sl, lsl #1 + addne r0, r5, #0x12c + DRAW_TILE_GRID_OFFSET + addne r0, r0, #0x12000 + addne sl, r0, sl, lsl #1 + b _023375E8 +_02337544: + ldr r0, [sp, #0x20] + add r1, sp, #0x28 + bl CannotStandOnTileNoMonsterCheck + cmp r0, #0 + bne _023375DC + ldr r0, [sp, #0x20] + add r1, sp, #0x28 + bl CanSeePosition + cmp r0, #0 + beq _023375DC + mov r0, #0 + add r2, sp, #0x2c + b _02337598 +_02337578: + mov r3, r0, lsl #2 + ldrsh r1, [r2, r3] + cmp r6, r1 + addeq r1, r2, r3 + ldreqsh r1, [r1, #2] + cmpeq r7, r1 + beq _023375A0 + add r0, r0, #1 +_02337598: + cmp r0, #6 + blt _02337578 +_023375A0: + cmp r0, #6 + bne _023375CC + bl GetGridsOption + cmp r0, #0 +#ifdef JAPAN + addne r0, r5, #0x9a + addne r0, r0, #0x12000 +#else + ldrne r0, _02337798 ; =0x0001213E + addne r0, r5, r0 +#endif + addne sl, r0, sl, lsl #1 + addeq r0, r5, #0x12c + DRAW_TILE_GRID_OFFSET + addeq r0, r0, #0x12000 + addeq sl, r0, sl, lsl #1 + b _023375E8 +_023375CC: + add r0, r5, #0x150 + DRAW_TILE_GRID_OFFSET + add r0, r0, #0x12000 + add sl, r0, sl, lsl #1 + b _023375E8 +_023375DC: + add r0, r5, #0x12c + DRAW_TILE_GRID_OFFSET + add r0, r0, #0x12000 + add sl, r0, sl, lsl #1 +_023375E8: + add r0, r5, #0x150 + DRAW_TILE_GRID_OFFSET + add r0, r0, #0x12000 + add r0, r0, r8, lsl #1 +#ifdef JAPAN + add r1, r5, #0x88 + str r0, [sp, #0x18] + add r0, r1, #0x12000 + add r0, r0, r8, lsl #1 + str r0, [sp, #0x14] + mov r0, #0 + str r0, [sp, #8] + add r0, r5, #0x9a + add r0, r0, #0x12000 + add r0, r0, r8, lsl #1 + str r0, [sp, #0x10] +#else + ldr r1, _02337798 ; =0x0001213E + str r0, [sp, #0x18] + add r0, r5, r1 + add r0, r0, r8, lsl #1 + str r0, [sp, #0x10] + mov r0, #0 + str r0, [sp, #8] + add r0, r5, #0x12c + add r0, r0, #0x12000 + add r0, r0, r8, lsl #1 + str r0, [sp, #0x14] +#endif + mov r0, r6, lsl #0x10 + mov r0, r0, asr #0x10 + str r0, [sp, #0x24] +_0233762C: + mov r0, #0 + str r0, [sp] + ldrh r2, [sl], #6 + and sb, sb, #0x3f + and fp, fp, #0x1f + mov r0, sb + mov r1, fp + mov r3, #0 + bl sub_02051D8C + ldr r0, [sp, #0x1c] + add fp, fp, #1 + add r0, r0, #1 + str r0, [sp, #0x1c] + cmp r0, #3 + bne _02337730 + ldr r0, [sp, #0x24] + add r7, r7, #1 + strh r0, [sp, #0x28] + ldr r0, [sp, #4] + cmp r0, #0 + mov r0, #0 + str r0, [sp, #0x1c] + strh r7, [sp, #0x2a] + beq _023376A8 + ldrsh r0, [r4] + cmp r6, r0 + ldreqsh r0, [r4, #2] + cmpeq r7, r0 + ldreq sl, [sp, #0x18] + ldrne sl, [sp, #0x14] + b _02337730 +_023376A8: + ldr r0, [sp, #0x20] + add r1, sp, #0x28 + bl CannotStandOnTileNoMonsterCheck + cmp r0, #0 + bne _0233772C + ldr r0, [sp, #0x20] + add r1, sp, #0x28 + bl CanSeePosition + cmp r0, #0 + beq _0233772C + mov r0, #0 + b _02337700 +_023376D8: + mov r2, r0, lsl #2 + add r1, sp, #0x2c + ldrsh r1, [r1, r2] + cmp r6, r1 + addeq r1, sp, #0x2c + addeq r1, r1, r2 + ldreqsh r1, [r1, #2] + cmpeq r7, r1 + beq _02337708 + add r0, r0, #1 +_02337700: + cmp r0, #6 + blt _023376D8 +_02337708: + cmp r0, #6 + bne _02337724 + bl GetGridsOption + cmp r0, #0 + ldrne sl, [sp, #0x10] + ldreq sl, [sp, #0x14] + b _02337730 +_02337724: + ldr sl, [sp, #0x18] + b _02337730 +_0233772C: + ldr sl, [sp, #0x14] +_02337730: + ldr r0, [sp, #8] + add r0, r0, #1 + str r0, [sp, #8] + cmp r0, #0x19 + blt _0233762C + ldr r0, [sp, #0xc] + add r8, r8, #1 + add r0, r0, #1 + cmp r8, #3 + add sb, sb, #1 + addeq r6, r6, #1 + moveq r8, #0 + str r0, [sp, #0xc] + cmp r0, #0x21 + blt _023374D4 + mov r0, #0 + mov r1, r0 + bl sub_02051E60 + add sp, sp, #0x44 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_02337780: .word DUNGEON_PTR +_02337784: .word 0x0001A224 + DRAW_TILE_GRID_OFFSET +_02337788: .word DIRECTIONS_XY +_0233778C: .word ov29_02352B9C +_02337790: .word ov29_02352D58 +_02337794: .word 0x0001A226 + DRAW_TILE_GRID_OFFSET +#ifndef JAPAN +_02337798: .word 0x0001213E +#endif + arm_func_end DrawTileGrid + + arm_func_start HideTileGrid +HideTileGrid: ; 0x0233779C + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + mov r8, #0 + mov r5, r8 + mov r6, r8 +_023377B0: + mov r0, r8, lsl #0x10 + mov r7, r6 + mov r4, r0, asr #0x10 +_023377BC: + mov r0, r7, lsl #0x10 + mov r1, r4 + mov r2, r5 + mov r3, r5 + mov r0, r0, asr #0x10 + str r5, [sp] + bl sub_02051D8C + add r7, r7, #1 + cmp r7, #0x20 + blt _023377BC + add r8, r8, #1 + cmp r8, #0x20 + blt _023377B0 + mov r0, #0 + mov r1, r0 + bl sub_02051E60 + ldr r0, _02337818 ; =DUNGEON_PTR + mov r1, #0 + ldr r0, [r0] + add r0, r0, #0x1a000 +#ifdef JAPAN + strb r1, [r0, #0x1ad] +#else + strb r1, [r0, #0x251] +#endif + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_02337818: .word DUNGEON_PTR + arm_func_end HideTileGrid + + arm_func_start ov29_0233781C +ov29_0233781C: ; 0x0233781C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, #0 + mov r4, r7 + mov r5, r7 +_0233782C: + mov r6, r5 +_02337830: + mov r0, r6 + mov r1, r7 + bl GetTileSafe + add r6, r6, #1 + strh r4, [r0, #2] + cmp r6, #0x38 + blt _02337830 + add r7, r7, #1 + cmp r7, #0x20 + blt _0233782C + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov29_0233781C + + arm_func_start ov29_0233785C +ov29_0233785C: ; 0x0233785C +#ifdef JAPAN +#define OV29_0233785C_OFFSET -0xA4 +#else +#define OV29_0233785C_OFFSET 0 +#endif + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r1, _02337A34 ; =0x0000270F + mov r3, #0 + ldr r6, _02337A38 ; =DUNGEON_PTR + mov sb, r3 + rsb r0, r1, #0 + mov r4, #0x1c +_02337878: + mul r2, r3, r4 + ldr r5, [r6] + add r3, r3, #1 + add r5, r5, r2 + add r5, r5, #0xe000 + strb sb, [r5, #0xee8 + OV29_0233785C_OFFSET] + ldr r5, [r6] + cmp r3, #0x20 + add r5, r5, r2 + add r5, r5, #0xe000 + strb sb, [r5, #0xee9 + OV29_0233785C_OFFSET] + ldr r5, [r6] + add r5, r5, r2 + add r5, r5, #0xee00 + strh r1, [r5, #0xea + OV29_0233785C_OFFSET] + ldr r5, [r6] + add r5, r5, r2 + add r5, r5, #0xee00 + strh r1, [r5, #0xec + OV29_0233785C_OFFSET] + ldr r5, [r6] + add r5, r5, r2 + add r5, r5, #0xee00 + strh r0, [r5, #0xee + OV29_0233785C_OFFSET] + ldr r5, [r6] + add r2, r5, r2 + add r2, r2, #0xee00 + strh r0, [r2, #0xf0 + OV29_0233785C_OFFSET] + blt _02337878 + mov sl, sb +_023378EC: + add r5, sl, #1 + mov r0, sl, lsl #0x10 + mov r1, r5, lsl #0x10 + ldr fp, _02337A38 ; =DUNGEON_PTR + mov r8, #0 + mov r6, r0, asr #0x10 + mov r4, r1, asr #0x10 + mov r7, #1 +_0233790C: + mov r0, r8 + mov r1, sl + bl GetTile + ldrb r1, [r0, #7] + cmp r1, #0xff + beq _0233797C + mov r0, #0x1c + mul r2, r1, r0 + ldr r0, [fp] + add r0, r0, #0x2e8 + OV29_0233785C_OFFSET + add r0, r0, #0xec00 + strb r7, [r0, r2] + add r0, r0, r2 + ldrsh r2, [r0, #2] + cmp r2, r8 + strgth r8, [r0, #2] + ldrsh r2, [r0, #4] + cmp r2, sl + strgth r6, [r0, #4] + ldrsh r3, [r0, #6] + add r2, r8, #1 + cmp r3, r2 + strlth r2, [r0, #6] + ldrsh r2, [r0, #8] + cmp r2, r5 + strlth r4, [r0, #8] + cmp sb, r1 + andlt sb, r1, #0xff +_0233797C: + add r8, r8, #1 + cmp r8, #0x38 + blt _0233790C + add sl, sl, #1 + cmp sl, #0x20 + blt _023378EC + mov r2, #0x18 + ldr r7, _02337A38 ; =DUNGEON_PTR + mov r1, #0 + mov r3, r2 + mov r4, r2 + mov r5, r2 + mov r6, #0x1c +_023379B0: + mul sl, r1, r6 + ldr r0, [r7] + add r0, r0, #0x2e8 + OV29_0233785C_OFFSET + add r0, r0, #0xec00 + ldrb r8, [r0, sl] + add r0, r0, sl + cmp r8, #0 + beq _02337A10 + ldrsh r8, [r0, #2] + sub r8, r8, #1 + mul sl, r8, r2 + str sl, [r0, #0xc] + ldrsh r8, [r0, #4] + sub r8, r8, #1 + mul sl, r8, r3 + str sl, [r0, #0x10] + ldrsh r8, [r0, #6] + add r8, r8, #1 + mul sl, r8, r4 + str sl, [r0, #0x14] + ldrsh r8, [r0, #8] + add r8, r8, #1 + mul sl, r8, r5 + str sl, [r0, #0x18] +_02337A10: + add r1, r1, #1 + cmp r1, #0x20 + blt _023379B0 + ldr r0, _02337A38 ; =DUNGEON_PTR + add r1, sb, #1 + ldr r0, [r0] + add r0, r0, #0xe000 + strb r1, [r0, #0xee4 + OV29_0233785C_OFFSET] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_02337A34: .word 0x0000270F +_02337A38: .word DUNGEON_PTR + arm_func_end ov29_0233785C + + arm_func_start DiscoverMinimap +DiscoverMinimap: ; 0x02337A3C +#ifdef JAPAN +#define DISCOVER_MINIMAP_OFFSET -0xA4 +#else +#define DISCOVER_MINIMAP_OFFSET 0 +#endif + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r5, r0 + ldrsh r0, [r5] + ldrsh r1, [r5, #2] + bl GetTile + ldrb r4, [r0, #7] + bl GetVisibilityRange + ldr r1, _02337B28 ; =DUNGEON_PTR + ldr r3, [r1] + add r1, r3, #0x1a000 + ldrb r2, [r1, #0x23e + DISCOVER_MINIMAP_OFFSET] + cmp r2, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + ldrb r1, [r1, #0x250 + DISCOVER_MINIMAP_OFFSET] + cmp r1, #0 + bne _02337A84 + cmp r4, #0xff + bne _02337AA0 +_02337A84: + ldrsh r2, [r5] + ldrsh r1, [r5, #2] + sub r4, r2, r0 + sub r7, r1, r0 + add r5, r2, r0 + add r6, r1, r0 + b _02337B1C +_02337AA0: + add r0, r3, #0x2e8 + DISCOVER_MINIMAP_OFFSET + add r1, r0, #0xec00 + mov r0, #0x1c + mla r2, r4, r0, r1 + ldrb r0, [r2, #1] + cmp r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, #1 + strb r0, [r2, #1] + ldrsh r1, [r2, #2] + ldrsh r0, [r2, #4] + ldrsh r5, [r2, #6] + ldrsh r6, [r2, #8] + sub r4, r1, #1 + sub r7, r0, #1 + b _02337B1C +_02337AE0: + mov r8, r4 + b _02337B10 +_02337AE8: + mov r0, r8 + mov r1, r7 + bl GetTileSafe + ldrh r2, [r0, #2] + mov r1, r7 + orr r2, r2, #3 + strh r2, [r0, #2] + mov r0, r8 + bl DrawMinimapTile + add r8, r8, #1 +_02337B10: + cmp r8, r5 + ble _02337AE8 + add r7, r7, #1 +_02337B1C: + cmp r7, r6 + ble _02337AE0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_02337B28: .word DUNGEON_PTR + arm_func_end DiscoverMinimap + + arm_func_start PositionHasItem +PositionHasItem: ; 0x02337B2C + stmdb sp!, {r3, lr} + mov r1, r0 + ldrsh r0, [r1] + ldrsh r1, [r1, #2] + bl GetTile + ldr r0, [r0, #0x10] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, pc} + ldr r0, [r0] + cmp r0, #3 + moveq r0, #1 + movne r0, #0 + and r0, r0, #0xff + ldmia sp!, {r3, pc} + arm_func_end PositionHasItem + + arm_func_start PositionHasMonster +PositionHasMonster: ; 0x02337B68 + stmdb sp!, {r3, lr} + mov r1, r0 + ldrsh r0, [r1] + ldrsh r1, [r1, #2] + bl GetTile + ldr r0, [r0, #0xc] + cmp r0, #0 + beq _02337B94 + ldr r1, [r0] + cmp r1, #1 + ldmeqia sp!, {r3, pc} +_02337B94: + mov r0, #0 + ldmia sp!, {r3, pc} + arm_func_end PositionHasMonster + + arm_func_start TrySmashWall +TrySmashWall: ; 0x02337B9C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + ldrsh r0, [r8] + ldrsh r1, [r8, #2] + mov r5, #0 + bl GetTileSafe + ldrh r1, [r0] + tst r1, #3 + bne _02337C4C + ldrh r1, [r0] + tst r1, #0x100 + bne _02337C4C + tst r1, #0x10 + bne _02337C4C + bic r1, r1, #3 + strh r1, [r0] + ldrh r1, [r0] + mov r5, #1 + sub r7, r5, #2 + orr r1, r1, #1 + strh r1, [r0] + mov r4, r7 +_02337BF4: + mov r6, r4 +_02337BF8: + ldrsh r0, [r8] + ldrsh r1, [r8, #2] + add r0, r6, r0 + add r1, r7, r1 + bl ov29_02336694 + ldrsh r0, [r8] + ldrsh r1, [r8, #2] + add r0, r6, r0 + add r1, r7, r1 + bl DetermineTileWalkableNeighbors + ldrsh r0, [r8] + ldrsh r1, [r8, #2] + add r0, r6, r0 + add r1, r7, r1 + bl DrawMinimapTile + add r6, r6, #1 + cmp r6, #1 + ble _02337BF8 + add r7, r7, #1 + cmp r7, #1 + ble _02337BF4 +_02337C4C: + cmp r5, #0 + beq _02337C9C + ldr r4, _02337CA4 ; =DUNGEON_PTR + mov r6, #0 +_02337C5C: + ldr r0, [r4] + add r0, r0, r6, lsl #2 + add r0, r0, #0x12000 +#ifdef JAPAN + ldr r7, [r0, #0xad4] +#else + ldr r7, [r0, #0xb78] +#endif + mov r0, r7 + bl EntityIsValid__02337CA8 + cmp r0, #0 + beq _02337C84 + mov r0, r7 + bl DetermineMonsterShadow +_02337C84: + add r6, r6, #1 + cmp r6, #0x14 + blt _02337C5C + bl UpdateTrapsVisibility + mov r0, r8 + bl ov29_022E66C4 +_02337C9C: + mov r0, r5 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_02337CA4: .word DUNGEON_PTR + arm_func_end TrySmashWall diff --git a/asm/overlay_29_0233ED34.s b/asm/overlay_29_0233F424.s similarity index 78% rename from asm/overlay_29_0233ED34.s rename to asm/overlay_29_0233F424.s index 0ff8745b..10c3b2d3 100644 --- a/asm/overlay_29_0233ED34.s +++ b/asm/overlay_29_0233F424.s @@ -1,516 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_0233ED34.inc" + .include "overlay_29_0233F424.inc" .text - arm_func_start GenerateRoomImperfections -GenerateRoomImperfections: ; 0x0233ED34 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x34 - str r0, [sp] - str r1, [sp, #4] - str r2, [sp, #8] - mov fp, #0 - b _0233F100 -_0233ED50: - ldr r1, _0233F114 ; =0x000001C2 - ldr r0, [sp] - mov sl, #0 - mla r0, fp, r1, r0 - str r0, [sp, #0xc] - mvn r0, #0 - str r0, [sp, #0x30] - b _0233F0F0 -_0233ED70: - ldr r0, [sp, #0xc] - mov r1, #0x1e - mla sb, sl, r1, r0 - ldrb r0, [sb, #8] - cmp r0, #0 - ldreqb r0, [sb, #0x11] - cmpeq r0, #0 - ldreqb r0, [sb, #0x12] - cmpeq r0, #0 - bne _0233F0EC - ldrb r0, [sb, #0xb] - cmp r0, #0 - ldrneb r0, [sb, #0xa] - cmpne r0, #0 - beq _0233F0EC - ldrb r0, [sb, #9] - cmp r0, #0 - ldreqb r0, [sb, #0x10] - cmpeq r0, #0 - bne _0233F0EC - ldrb r0, [sb, #0x1c] - cmp r0, #0 - beq _0233F0EC - mov r0, #0x64 - bl DungeonRandInt - cmp r0, #0x3c - blt _0233F0EC - ldrsh r3, [sb, #4] - ldrsh r2, [sb] - ldrsh r1, [sb, #6] - ldrsh r0, [sb, #2] - sub r2, r3, r2 - sub r0, r1, r0 - add r1, r2, r0 - mov r0, r1, asr #1 - add r0, r1, r0, lsr #30 - movs r0, r0, asr #2 - str r0, [sp, #0x24] - moveq r0, #1 - streq r0, [sp, #0x24] - mov r0, #0 - str r0, [sp, #0x2c] - b _0233F0DC -_0233EE1C: - mov r4, #0 -_0233EE20: - mov r0, #4 - bl DungeonRandInt - str r0, [sp, #0x20] - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0233EE48 -_0233EE38: ; jump table - b _0233EE48 ; case 0 - b _0233EE70 ; case 1 - b _0233EE9C ; case 2 - b _0233EECC ; case 3 -_0233EE48: - cmp r4, #0 - movne r0, #1 - strne r0, [sp, #0x28] - movne r5, #0 - moveq r0, #0 - ldrsh r8, [sb] - ldrsh r7, [sb, #2] - streq r0, [sp, #0x28] - moveq r5, #1 - b _0233EEF4 -_0233EE70: - ldrsh r0, [sb, #4] - cmp r4, #0 - movne r5, #1 - sub r8, r0, #1 - movne r0, #0 - strne r0, [sp, #0x28] - ldreq r0, [sp, #0x30] - ldrsh r7, [sb, #2] - streq r0, [sp, #0x28] - moveq r5, #0 - b _0233EEF4 -_0233EE9C: - ldrsh r0, [sb, #6] - cmp r4, #0 - ldrsh r1, [sb, #4] - sub r7, r0, #1 - ldrne r0, [sp, #0x30] - movne r5, #0 - strne r0, [sp, #0x28] - moveq r0, #0 - sub r8, r1, #1 - streq r0, [sp, #0x28] - ldreq r5, [sp, #0x30] - b _0233EEF4 -_0233EECC: - ldrsh r0, [sb, #6] - cmp r4, #0 - ldrne r5, [sp, #0x30] - sub r7, r0, #1 - movne r0, #0 - strne r0, [sp, #0x28] - moveq r0, #1 - ldrsh r8, [sb] - streq r0, [sp, #0x28] - moveq r5, #0 -_0233EEF4: - mov r6, #0 - b _0233F0BC -_0233EEFC: - ldrsh r0, [sb] - cmp r8, r0 - blt _0233F0C4 - ldrsh r0, [sb, #4] - cmp r8, r0 - bge _0233F0C4 - ldrsh r0, [sb, #2] - cmp r7, r0 - blt _0233F0C4 - ldrsh r0, [sb, #6] - cmp r7, r0 - bge _0233F0C4 - mov r0, r8 - mov r1, r7 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - bne _0233F0AC - mov r5, #0 - b _0233F014 -_0233EF50: - ldr r0, _0233F118 ; =DIRECTIONS_XY - mov r1, r5, lsl #2 - ldrsh r2, [r0, r1] - add r0, r0, r5, lsl #2 - ldrsh r1, [r0, #2] - add r0, r8, r2 - str r0, [sp, #0x1c] - mov r0, #0 - str r0, [sp, #0x10] - add r0, r7, r1 - str r0, [sp, #0x18] - ldr r6, [sp, #0x30] - b _0233EFFC -_0233EF84: - ldr r0, [sp, #0x30] - str r0, [sp, #0x14] - b _0233EFE0 -_0233EF90: - ldr r1, [sp, #0x1c] - ldr r0, [sp, #0x14] - add r0, r1, r0 - ldr r1, [sp, #0x18] - add r1, r1, r6 - bl GetTile - ldrh r1, [r0] - and r1, r1, #3 - cmp r1, #1 - bne _0233EFD4 - ldrb r0, [r0, #7] - cmp r0, #0xff - moveq r0, #1 - streq r0, [sp, #0x10] - ldr r0, [sp, #0x10] - cmp r0, #0 - bne _0233EFEC -_0233EFD4: - ldr r0, [sp, #0x14] - add r0, r0, #1 - str r0, [sp, #0x14] -_0233EFE0: - ldr r0, [sp, #0x14] - cmp r0, #1 - ble _0233EF90 -_0233EFEC: - ldr r0, [sp, #0x10] - cmp r0, #0 - bne _0233F004 - add r6, r6, #1 -_0233EFFC: - cmp r6, #1 - ble _0233EF84 -_0233F004: - ldr r0, [sp, #0x10] - cmp r0, #0 - bne _0233F01C - add r5, r5, #1 -_0233F014: - cmp r5, #8 - blt _0233EF50 -_0233F01C: - cmp r5, #8 - bne _0233F0C4 - ldr r1, _0233F11C ; =CORNER_CARDINAL_NEIGHBOR_IS_OPEN - ldr r0, [sp, #0x20] - mov r5, #0 - add r6, r1, r0, lsl #3 - b _0233F080 -_0233F038: - ldr r0, _0233F118 ; =DIRECTIONS_XY - mov r1, r5, lsl #2 - ldrsh r2, [r0, r1] - add r0, r0, r5, lsl #2 - ldrsh r1, [r0, #2] - add r0, r8, r2 - add r1, r7, r1 - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - moveq r0, #1 - movne r0, #0 - and r1, r0, #0xff - ldrb r0, [r5, r6] - cmp r1, r0 - bne _0233F088 - add r5, r5, #2 -_0233F080: - cmp r5, #8 - blt _0233F038 -_0233F088: - cmp r5, #8 - bne _0233F0C4 - mov r0, r8 - mov r1, r7 - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - b _0233F0C4 -_0233F0AC: - ldr r0, [sp, #0x28] - add r7, r7, r5 - add r8, r8, r0 - add r6, r6, #1 -_0233F0BC: - cmp r6, #0xa - blt _0233EEFC -_0233F0C4: - add r4, r4, #1 - cmp r4, #2 - blt _0233EE20 - ldr r0, [sp, #0x2c] - add r0, r0, #1 - str r0, [sp, #0x2c] -_0233F0DC: - ldr r1, [sp, #0x2c] - ldr r0, [sp, #0x24] - cmp r1, r0 - blt _0233EE1C -_0233F0EC: - add sl, sl, #1 -_0233F0F0: - ldr r0, [sp, #8] - cmp sl, r0 - blt _0233ED70 - add fp, fp, #1 -_0233F100: - ldr r0, [sp, #4] - cmp fp, r0 - blt _0233ED50 - add sp, sp, #0x34 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233F114: .word 0x000001C2 -_0233F118: .word DIRECTIONS_XY -_0233F11C: .word CORNER_CARDINAL_NEIGHBOR_IS_OPEN - arm_func_end GenerateRoomImperfections - - arm_func_start CreateHallway -CreateHallway: ; 0x0233F120 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - ldrb r6, [sp, #0x28] - mov sl, r0 - ldr r0, [sp, #0x30] - mov sb, r1 - cmp r6, #0 - mov r8, r2 - mov r7, r3 - mov r4, sl - mov r5, sb - ldr fp, [sp, #0x2c] - str r0, [sp, #0x30] - mov r6, #0 - beq _0233F328 - b _0233F1C4 -_0233F15C: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F1AC - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F1B4 -_0233F1AC: - cmp sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F1B4: - ldr r0, [sp, #0x30] - cmp sb, r0 - addlt sb, sb, #1 - subge sb, sb, #1 -_0233F1C4: - ldr r0, [sp, #0x30] - cmp sb, r0 - bne _0233F15C - mov r6, #0 - b _0233F240 -_0233F1D8: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F228 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F234 -_0233F228: - cmp sl, r4 - cmpeq sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F234: - cmp sl, r8 - addlt sl, sl, #1 - subge sl, sl, #1 -_0233F240: - cmp sl, r8 - bne _0233F1D8 - mov r6, #0 - b _0233F2B8 -_0233F250: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F2A0 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F2AC -_0233F2A0: - cmp sl, r4 - cmpeq sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F2AC: - cmp sb, r7 - addlt sb, sb, #1 - subge sb, sb, #1 -_0233F2B8: - cmp sb, r7 - bne _0233F250 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F2C4: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F314 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F31C -_0233F314: - cmp sl, r4 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F31C: - cmp sl, fp - addlt sl, sl, #1 - subge sl, sl, #1 -_0233F328: - cmp sl, fp - bne _0233F2C4 - mov r6, #0 - b _0233F3A0 -_0233F338: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F388 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F394 -_0233F388: - cmp sl, r4 - cmpeq sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F394: - cmp sb, r7 - addlt sb, sb, #1 - subge sb, sb, #1 -_0233F3A0: - cmp sb, r7 - bne _0233F338 - mov r6, #0 - b _0233F418 -_0233F3B0: - cmp r6, #0x38 - add r6, r6, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #1 - beq _0233F400 - mov r0, sl - mov r1, sb - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - strh r1, [r0] - b _0233F40C -_0233F400: - cmp sl, r4 - cmpeq sb, r5 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0233F40C: - cmp sl, r8 - addlt sl, sl, #1 - subge sl, sl, #1 -_0233F418: - cmp sl, r8 - bne _0233F3B0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - arm_func_end CreateHallway - arm_func_start EnsureConnectedGrid EnsureConnectedGrid: ; 0x0233F424 stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} diff --git a/asm/overlay_29_023456BC.s b/asm/overlay_29_023456BC.s index 1080f952..4a571746 100644 --- a/asm/overlay_29_023456BC.s +++ b/asm/overlay_29_023456BC.s @@ -260,996 +260,3 @@ _02345A30: .word ov29_023537B4 _02345A34: .word 0xFFFF000F _02345A38: .word OBJ_GRAPHICS_CONTROLS_PTR arm_func_end DisplayItem - - arm_func_start SpawnDroppedItemWrapper -SpawnDroppedItemWrapper: ; 0x02345A3C - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0xc0 - mov r5, r2 - mov r4, #0 - mov r6, #3 - mov r2, #1 - str r6, [sp, #8] - strb r2, [sp, #0x28] - str r5, [sp, #0xbc] - strb r4, [sp, #0x2c] - strb r4, [sp, #0x2a] - ldrh r4, [r1] - mov r6, r0 - mov r2, #0x18 - strh r4, [sp, #0xc] - ldrh ip, [r1, #2] - mov r4, r3 - add r0, sp, #8 - strh ip, [sp, #0xe] - ldrsh r3, [r1] - ldrsh r1, [r1, #2] - smulbb r3, r3, r2 - smulbb r1, r1, r2 - add r2, r1, #4 - add r3, r3, #4 - mov r1, r3, lsl #8 - mov r2, r2, lsl #8 - bl SetEntityPixelPosXY - mov r0, #0 - strh r0, [sp, #0x2e] - str r0, [sp] - add r1, sp, #8 - mov r0, r6 - mov r2, r5 - mov r3, #1 - str r4, [sp, #4] - bl SpawnDroppedItem - add sp, sp, #0xc0 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end SpawnDroppedItemWrapper - - arm_func_start SpawnDroppedItem -SpawnDroppedItem: ; 0x02345AD8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x10 - mov r8, r1 - mov sb, r0 - ldrsh r0, [r8, #4] - ldrsh r1, [r8, #6] - mov r7, r2 - mov r4, r3 - ldr r6, [sp, #0x38] - bl GetTile - ldr r0, [r0, #0x10] - mov r5, #0 - cmp r0, #0 - beq _02345B5C - ldr r0, [r0] - cmp r0, #2 - bne _02345B5C - ldrb r2, [sp, #0x3c] - mov r0, r8 - add r1, r8, #4 - bl ov29_02347378 - add r0, r8, #4 - bl RevealAttackedTile - ldr r1, _02345D64 ; =0x00000BD8 - mov r0, sb - bl LogMessageByIdWithPopupCheckUser - ldrb r0, [r7] - tst r0, #1 - movne r0, #1 - moveq r0, r5 - tst r0, #0xff - moveq r0, #0 - beq _02345D5C -_02345B5C: - ldrsh r0, [r8, #4] - cmp r4, #0 - movne r4, #0 - strh r0, [sp, #0xc] - ldrsh r0, [r8, #6] - ldrh r1, [sp, #0xc] - ldr fp, _02345D68 ; =DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST - strh r0, [sp, #0xe] - ldrh r0, [sp, #0xe] - strh r1, [sp, #8] - moveq r4, #1 - strh r0, [sp, #0xa] -_02345B8C: - mov r0, r4, lsl #2 - ldrsh r3, [fp, r0] - cmp r3, #0x63 - moveq r5, #0 - beq _02345C44 - ldrsh r2, [r8, #4] - add r0, fp, r0 - ldrsh r1, [r0, #2] - add r0, r2, r3 - strh r0, [sp, #0xc] - ldrsh r2, [r8, #6] - ldrsh r0, [sp, #0xc] - add r1, r2, r1 - strh r1, [sp, #0xe] - ldrsh r1, [sp, #0xe] - bl GetTile - mov sl, r0 - ldrh r0, [sl] - tst r0, #3 - beq _02345C3C - tst r0, #0x200 - ldreq r0, [sl, #0x10] - cmpeq r0, #0 - bne _02345C3C - ldrb r2, [sp, #0x3c] - add r1, sp, #0xc - mov r0, r8 - bl ov29_02347378 - ldrh r0, [sl] - ldrh r2, [sp, #0xc] - ldrh r1, [sp, #0xe] - and r0, r0, #3 - cmp r0, #3 - strh r2, [sp, #8] - strh r1, [sp, #0xa] - moveq r5, #1 - beq _02345C44 - add r0, sp, #0xc - mov r1, r7 - mov r2, #1 - bl SpawnItem - cmp r0, #0 - movne r5, #1 - b _02345C44 -_02345C3C: - add r4, r4, #1 - b _02345B8C -_02345C44: - mov r0, #0 - mov r1, #0x40000 - bl SetPreprocessorArgsIdVal - ldr r2, _02345D6C ; =ov29_023531BC - mov r1, r7 - mov r0, #0 - bl SubstitutePlaceholderItemTags - cmp r5, #0 - beq _02345CF4 - ldrsh r0, [sp, #0xc] - ldrsh r1, [sp, #0xe] - bl DrawMinimapTile - ldrsh r0, [sp, #0xc] - ldrsh r1, [sp, #0xe] - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _02345D58 -_02345C94: ; jump table - b _02345CCC ; case 0 - b _02345CA4 ; case 1 - b _02345CB8 ; case 2 - b _02345CE0 ; case 3 -_02345CA4: - ldr r2, _02345D70 ; =0x00000BD9 - add r1, sp, #0xc - mov r0, sb - bl LogMessageByIdWithPopupCheckUserUnknown - b _02345D58 -_02345CB8: - ldr r2, _02345D74 ; =0x00000BDA - add r1, sp, #0xc - mov r0, sb - bl LogMessageByIdWithPopupCheckUserUnknown - b _02345D58 -_02345CCC: - ldr r2, _02345D78 ; =0x00000BDB - add r1, sp, #0xc - mov r0, sb - bl LogMessageByIdWithPopupCheckUserUnknown - b _02345D58 -_02345CE0: - ldr r2, _02345D7C ; =0x00000BDF - add r1, sp, #0xc - mov r0, sb - bl LogMessageByIdWithPopupCheckUserUnknown - b _02345D58 -_02345CF4: - ldrsh r2, [sp, #8] - ldrsh r1, [sp, #0xa] - mov r0, #0x18 - smulbb r2, r2, r0 - smulbb r0, r1, r0 - add r1, r2, #0xc - add r0, r0, #0xc - mov r2, r1, lsl #8 - mov r1, r0, lsl #8 - str r2, [sp] - str r1, [sp, #4] - cmp r6, #0 - beq _02345D40 - ldrsh r0, [r6] - add r0, r2, r0, lsl #8 - str r0, [sp] - ldrsh r0, [r6, #2] - add r0, r1, r0, lsl #8 - str r0, [sp, #4] -_02345D40: - add r0, sp, #0 - bl ov29_022E563C - ldr r2, _02345D80 ; =0x00000BDC - add r1, sp, #0xc - mov r0, sb - bl LogMessageByIdWithPopupCheckUserUnknown -_02345D58: - mov r0, r5 -_02345D5C: - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -#define SPAWN_DROPPED_ITEM_OFFSET -0x2C1 -#else -#define SPAWN_DROPPED_ITEM_OFFSET 0 -#endif -_02345D64: .word 0x00000BD8 + SPAWN_DROPPED_ITEM_OFFSET -_02345D68: .word DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST -_02345D6C: .word ov29_023531BC -_02345D70: .word 0x00000BD9 + SPAWN_DROPPED_ITEM_OFFSET -_02345D74: .word 0x00000BDA + SPAWN_DROPPED_ITEM_OFFSET -_02345D78: .word 0x00000BDB + SPAWN_DROPPED_ITEM_OFFSET -_02345D7C: .word 0x00000BDF + SPAWN_DROPPED_ITEM_OFFSET -_02345D80: .word 0x00000BDC + SPAWN_DROPPED_ITEM_OFFSET - arm_func_end SpawnDroppedItem - - arm_func_start ov29_02345D84 -ov29_02345D84: ; 0x02345D84 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x18 - mov sl, r1 - ldrsh r0, [sl, #4] - ldrsh r1, [sl, #6] - str r2, [sp, #4] - mov sb, r3 - bl GetTile - ldr r0, _02346048 ; =DUNGEON_PTR - mov r4, #0 - ldr r0, [r0] - ldr r1, _0234604C ; =SECONDARY_TERRAIN_TYPES - add r0, r0, #0x4000 -#ifdef JAPAN - ldrsh r0, [r0, #0x30] -#else - ldrsh r0, [r0, #0xd4] -#endif - mov r7, r4 - mov r8, r4 - ldrb r0, [r1, r0] - mov r6, #1 - mov fp, #0 - cmp r0, #1 - ldrsh r0, [sl, #4] - moveq r7, #1 - ldr r5, _02346050 ; =DISPLACEMENTS_WITHIN_3 - strh r0, [sp, #0x14] - ldrsh r0, [sl, #6] - ldrh r1, [sp, #0x14] - strh r0, [sp, #0x16] - ldrh r0, [sp, #0x16] - strh r1, [sp, #0x10] - strh r0, [sp, #0x12] - b _02345F74 -_02345E00: - mov r0, r6, lsl #2 - ldrsh r0, [r5, r0] - ldrsh r3, [sl, #4] - cmp r0, #0x63 - moveq r6, fp - mov r0, r6, lsl #2 - ldrsh r2, [r5, r0] - add r0, r5, r6, lsl #2 - ldrsh r1, [r0, #2] - add r0, r3, r2 - strh r0, [sp, #0x14] - ldrsh r2, [sl, #6] - ldrsh r0, [sp, #0x14] - moveq r8, #1 - add r1, r2, r1 - strh r1, [sp, #0x16] - ldrsh r1, [sp, #0x16] - bl GetTile - ldrh r1, [r0] - ands r2, r1, #3 - beq _02345F70 - tst r1, #0x200 - bne _02345F70 - ldr r0, [r0, #0x10] - cmp r0, #0 - bne _02345F64 - ldrh r1, [sp, #0x14] - ldrh r0, [sp, #0x16] - cmp r2, #3 - strh r1, [sp, #0x10] - strh r0, [sp, #0x12] - beq _02345F70 - cmp r7, #0 - beq _02345E90 - cmp r2, #2 - beq _02345F70 -_02345E90: - ldr r0, _02346048 ; =DUNGEON_PTR - ldrsh r2, [sp, #0x14] - ldr r3, [r0] - mov r0, #0x18 - ldrsh r1, [sp, #0x16] - smulbb r2, r2, r0 - smulbb r1, r1, r0 - add r0, r3, #0x1a000 - add r2, r2, #4 - add r1, r1, #4 -#ifdef JAPAN - ldrb fp, [r0, #0x1a1] -#else - ldrb fp, [r0, #0x245] -#endif - mov r5, #0x10000 - mov r7, r2, lsl #8 - mov r8, r1, lsl #8 - mov r0, sl - mov r1, r7 - mov r2, r8 - str r5, [sl, #0x1c] - bl SetEntityPixelPosXY - mov r6, #0 -_02345EE0: - sub r5, r5, #0x800 - mov r2, #0 - str r5, [sl, #0x1c] - mov r0, sl - mov r1, fp - mov r3, r2 - str r2, [sp] - bl DisplayItem - mov r0, #0x13 - bl AdvanceFrame - add r6, r6, #1 - cmp r6, #0x20 - blt _02345EE0 - mov r0, sl - mov r1, r7 - mov r2, r8 - bl SetEntityPixelPosXY - mov r2, #0 - str r2, [sl, #0x1c] - mov r0, sl - mov r1, fp - mov r3, r2 - str r2, [sp] - bl DisplayItem - mov r0, #0x13 - bl AdvanceFrame - ldr r1, [sp, #4] - add r0, sp, #0x14 - mov r2, #1 - bl SpawnItem - cmp r0, #0 - movne r4, #1 - b _02345F7C -_02345F64: - cmp r8, #0 - movne r4, #0 - bne _02345F7C -_02345F70: - add r6, r6, #1 -_02345F74: - cmp r8, #0 - beq _02345E00 -_02345F7C: - mov r0, #0 - mov r1, #0x40000 - bl SetPreprocessorArgsIdVal - ldr r2, _02346054 ; =ov29_023531BC - ldr r1, [sp, #4] - mov r0, #0 - bl SubstitutePlaceholderItemTags - cmp r4, #0 - beq _02345FC4 - bl PlayDungeonTipSound__022EB66C - ldr r1, _02346058 ; =0x00000B74 - mov r0, #0 - mov r2, #1 - bl DisplayMessage2 - ldr r1, _02346058 ; =0x00000B74 - mov r0, #0 - bl LogMessageByIdQuiet - b _0234603C -_02345FC4: - ldrsh r2, [sp, #0x10] - ldrsh r1, [sp, #0x12] - mov r0, #0x18 - smulbb r2, r2, r0 - smulbb r0, r1, r0 - add r1, r2, #0xc - add r0, r0, #0xc - mov r2, r1, lsl #8 - mov r1, r0, lsl #8 - str r2, [sp, #8] - str r1, [sp, #0xc] - cmp sb, #0 - beq _02346010 - ldrsh r0, [sb] - add r0, r2, r0, lsl #8 - str r0, [sp, #8] - ldrsh r0, [sb, #2] - add r0, r1, r0, lsl #8 - str r0, [sp, #0xc] -_02346010: - add r0, sp, #8 - bl ov29_022E563C - ldr r1, _0234605C ; =0x00000B75 - mov r0, #0 - mov r2, #1 - bl DisplayMessage2 - ldr r1, _0234605C ; =0x00000B75 - mov r0, #0 - bl LogMessageByIdQuiet - mov r0, #0 - b _02346040 -_0234603C: - mov r0, #1 -_02346040: - add sp, sp, #0x18 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02346048: .word DUNGEON_PTR -_0234604C: .word SECONDARY_TERRAIN_TYPES -_02346050: .word DISPLACEMENTS_WITHIN_3 -_02346054: .word ov29_023531BC -#ifdef JAPAN -_02346058: .word 0x00000885 -_0234605C: .word 0x00000886 -#else -_02346058: .word 0x00000B74 -_0234605C: .word 0x00000B75 -#endif - arm_func_end ov29_02345D84 - - arm_func_start TryGenerateUnownStoneDrop -TryGenerateUnownStoneDrop: ; 0x02346060 - stmdb sp!, {r3, r4, r5, lr} - mov r4, r0 - mov r5, r1 - bl IsMarowakTrainingMaze - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, pc} - mov r0, r5 - bl IsUnown - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r0, _023460D8 ; =UNOWN_STONE_DROP_CHANCE - ldrsh r0, [r0] - bl DungeonRandOutcome__022EAB20 - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - sub r0, r5, #0xc9 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - add r0, r0, #0x190 - mov r1, r0, lsl #0x10 - mov r0, r4 - mov r1, r1, asr #0x10 - mov r2, #0 - mov r3, #2 - bl GenerateItem - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_023460D8: .word UNOWN_STONE_DROP_CHANCE - arm_func_end TryGenerateUnownStoneDrop - - arm_func_start ov29_023460DC -ov29_023460DC: ; 0x023460DC - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #0x18 - mov r7, r0 - mov r4, r1 - mov r6, r2 - mov r5, r3 - bl ov29_022FB51C - cmp r0, #0 - beq _02346134 - bl IsCurrentFixedRoomBossFight - cmp r0, #0 - bne _02346134 - bl IsMarowakTrainingMaze - cmp r0, #0 - bne _02346134 - mov r0, r4 - bl EntityIsValid__02345698 - cmp r0, #0 - beq _02346134 - ldr r0, [r4] - cmp r0, #1 - beq _0234613C -_02346134: - mov r0, #0 - b _02346330 -_0234613C: - ldr r4, [r4, #0xb4] - add r1, sp, #0 - ldrsh r0, [r4, #2] - bl GetTreasureBoxChances - cmp r5, #0 - ble _02346184 - ldr r1, _02346338 ; =ov10_022C48EC - mov lr, #0 - add r3, sp, #0 -_02346160: - mov ip, lr, lsl #1 - ldrsh r2, [r3, ip] - add lr, lr, #1 - cmp r2, #0 - ldrnesh r0, [r1, ip] - mlane r0, r5, r0, r2 - strneh r0, [r3, ip] - cmp lr, #4 - blt _02346160 -_02346184: - mov r2, #0 - mov r1, r2 - add r0, sp, #8 -_02346190: - str r1, [r0, r2, lsl #2] - add r2, r2, #1 - cmp r2, #4 - blt _02346190 - ldrsh r0, [sp] - mov ip, #1 - add r5, sp, #0 - str r0, [sp, #8] - add r2, sp, #8 -_023461B4: - mov r3, ip, lsl #1 - add r1, r2, ip, lsl #2 - ldrsh r3, [r5, r3] - ldr r1, [r1, #-4] - add r1, r1, r3 - str r1, [r2, ip, lsl #2] - add ip, ip, #1 - cmp ip, #4 - add r0, r0, r3 - blt _023461B4 - bl DungeonRandInt - ldr r1, [sp, #8] - cmp r1, #0 - beq _023461F4 - cmp r0, r1 - bge _023461FC -_023461F4: - mov r0, #0 - b _02346330 -_023461FC: - ldr r1, [sp, #0xc] - cmp r0, r1 - bge _0234626C - mov r5, #0 - mov r4, r5 - cmp r6, #0 - beq _02346230 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _0234633C ; =ov10_022C44C8 - ldrsh r1, [r1] - cmp r1, r0 - movlt r5, #1 -_02346230: - cmp r5, #0 - movne r5, #0x67 - bne _02346310 - ldr r0, _02346340 ; =DUNGEON_PTR - ldr r0, [r0] - add r5, r0, #0x348 - add r0, r5, #0x400 - bl GetMissionRank__0204FAE0 - mov r1, r0 - cmp r1, #0xf - movgt r1, #0xf - add r0, r5, #0x400 - bl RetrieveFromItemList1 - mov r5, r0 - b _02346310 -_0234626C: - ldr r1, [sp, #0x10] - cmp r0, r1 - ldrsh r0, [r4, #2] - bge _023462C8 - mov r1, #0 - bl GetExclusiveItem - movs r5, r0 - mov r4, #1 - bne _02346310 - ldr r0, _02346340 ; =DUNGEON_PTR - ldr r0, [r0] - ldr r0, [r0, #0x7cc] - cmp r0, #0 - moveq r0, #0x6e - movne r0, #0x6a - bl DungeonRandInt - mov r0, r0, lsl #0x12 - mov r0, r0, asr #0x10 - add r0, r0, #0x3e - add r0, r0, #0x200 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 - b _02346310 -_023462C8: - mov r1, #1 - bl GetExclusiveItem - movs r5, r0 - mov r4, #2 - bne _02346310 - ldr r0, _02346340 ; =DUNGEON_PTR - ldr r0, [r0] - ldr r0, [r0, #0x7cc] - cmp r0, #0 - moveq r0, #0x6e - movne r0, #0x6a - bl DungeonRandInt - mov r0, r0, lsl #0x12 - mov r0, r0, asr #0x10 - add r0, r0, #0x3f - add r0, r0, #0x200 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 -_02346310: - mov r0, r4 - bl ov29_02344BF8 - mov r1, r0 - mov r0, r7 - mov r2, r5 - mov r3, #2 - bl GenerateItem - mov r0, #1 -_02346330: - add sp, sp, #0x18 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_02346338: .word ov10_022C48EC -_0234633C: .word ov10_022C44C8 -_02346340: .word DUNGEON_PTR - arm_func_end ov29_023460DC - - arm_func_start ov29_02346344 -ov29_02346344: ; 0x02346344 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x3ec - sub sp, sp, #0x400 - mov r4, #0 - str r0, [sp, #4] - str r1, [sp, #8] - ldr sb, [sp, #0x810] - ldr r8, [sp, #0x814] - ldr r7, [sp, #0x818] - mov fp, r2 - mov sl, r3 - mov r1, r4 - mov r6, r4 - add r0, sp, #0x24 -_0234637C: - strb r6, [r0, r1] - add r1, r1, #1 - cmp r1, #0x1e - blt _0234637C - b _0234647C -_02346390: - ldrsh r1, [fp] - ldrsh r0, [fp, #2] - mov r5, #0 - strh r1, [sp, #0x20] - str r5, [sp, #0x14] - strh r0, [sp, #0x22] -_023463A8: - cmp r5, #0x1e - bge _02346454 - mov r2, r5, lsl #2 - ldrsh r0, [r8, r2] - cmp r0, #0x63 - beq _02346454 - add r1, sp, #0x24 - ldrb r1, [r1, r5] - cmp r1, #0 - bne _0234644C - add r1, r8, r2 - ldrsh r1, [r1, #2] - ldrsh r3, [fp] - ldrsh r2, [fp, #2] - add r3, r3, r0 - add r0, r2, r1 - strh r3, [sp, #0x20] - strh r0, [sp, #0x22] - ldrsh r0, [sp, #0x20] - ldrsh r1, [sp, #0x22] - bl GetTile - ldrh r1, [r0] - tst r1, #3 - beq _0234644C - tst r1, #0x200 - ldreq r0, [r0, #0x10] - cmpeq r0, #0 - bne _0234644C - ldrh r1, [sp, #0x20] - add r0, sp, #0x42 - mov r2, r6, lsl #2 - strh r1, [r0, r2] - mov r1, #1 - ldrh r3, [sp, #0x22] - str r1, [sp, #0x14] - mov r2, r1 - add r1, sp, #0x24 - add r0, r0, r6, lsl #2 - strb r2, [r1, r5] - strh r3, [r0, #2] - b _02346454 -_0234644C: - add r5, r5, #1 - b _023463A8 -_02346454: - ldr r0, [sp, #0x14] - cmp r0, #0 - bne _02346478 - add r0, sp, #0x42 - mov r1, r6, lsl #2 - mvn r2, #0 - strh r2, [r0, r1] - add r0, r0, r6, lsl #2 - strh r2, [r0, #2] -_02346478: - add r6, r6, #1 -_0234647C: - cmp r6, sb - blt _02346390 - mov r1, #0 - mov r5, r1 - mov r8, r1 - add fp, sp, #0x42 - b _023465B4 -_02346498: - mov r0, r8, lsl #2 - ldrsh r2, [fp, r0] - cmp r2, #0 - bge _023464C4 - mov r0, #0xb8 - mul r3, r8, r0 - mov r2, #0 - add r0, sp, #0xbc - str r2, [r0, r3] - mov r5, #1 - b _023465B0 -_023464C4: - mov r1, #0xb8 - mul r3, r8, r1 - add r1, sp, #0xbc - mov r2, #3 - str r2, [r1, r3] - add r6, r1, r3 - mov r1, #0 - strb r1, [r6, #0x24] - mov r1, #1 - strb r1, [r6, #0x20] - mov r1, #0 - strb r1, [r6, #0x22] - mov r1, #6 - mla r1, r8, r1, sl - str r1, [r6, #0xb4] - add r1, fp, r0 - ldrh r2, [fp, r0] - ldrh r1, [r1, #2] - mov r0, r6 - strh r2, [r6, #4] - strh r1, [r6, #6] - ldr r1, [sp, #8] - ldrsh r2, [r1] - ldrsh r3, [r1, #2] - mov r1, #0x18 - smulbb r1, r2, r1 - mov r2, #0x18 - smulbb r2, r3, r2 - add r1, r1, #4 - add r2, r2, #4 - mov r1, r1, lsl #8 - mov r2, r2, lsl #8 - bl SetEntityPixelPosXY - mov r0, #0 - strh r0, [r6, #0x26] - mov r0, r8, lsl #2 - ldrsh r3, [fp, r0] - mov r1, #0x18 - mov r0, r1 - smulbb r0, r3, r0 - ldr r2, [r6, #0xc] - add r0, r0, #4 - rsb r0, r2, r0, lsl #8 - bl _s32_div_f - add r1, sp, #0x6c - str r0, [r1, r8, lsl #3] - add r0, fp, r8, lsl #2 - ldrsh r3, [r0, #2] - mov r1, #0x18 - mov r0, r1 - smulbb r0, r3, r0 - ldr r2, [r6, #0x10] - add r0, r0, #4 - rsb r0, r2, r0, lsl #8 - bl _s32_div_f - add r1, sp, #0x6c - add r1, r1, r8, lsl #3 - str r0, [r1, #4] - mov r1, #1 -_023465B0: - add r8, r8, #1 -_023465B4: - cmp r8, sb - blt _02346498 - cmp r1, #0 - bne _02346614 - cmp r7, #0 - beq _0234660C - cmp sb, #2 - blt _023465E4 - ldr r1, _023467D0 ; =0x00000BDD - ldr r0, [sp, #4] - bl LogMessageByIdWithPopupCheckUser - b _0234660C -_023465E4: - mov r0, #0 - mov r1, #0x40000 - bl SetPreprocessorArgsIdVal - ldr r2, _023467D4 ; =ov29_023531BC - mov r1, sl - mov r0, #0 - bl SubstitutePlaceholderItemTags - ldr r1, _023467D8 ; =0x00000BDC - ldr r0, [sp, #4] - bl LogMessageByIdWithPopupCheckUser -_0234660C: - mov r0, #0 - b _023467C4 -_02346614: - cmp r5, #0 - cmpne r7, #0 - beq _0234662C - ldr r1, _023467DC ; =0x00000BDE - ldr r0, [sp, #4] - bl LogMessageByIdWithPopupCheckUser -_0234662C: - ldr r0, _023467E0 ; =DUNGEON_PTR - mov r6, #0 - ldr r0, [r0] - mov fp, r6 - add r0, r0, #0x1a000 -#ifdef JAPAN - ldrb r0, [r0, #0x1a1] -#else - ldrb r0, [r0, #0x245] -#endif - mov r5, r6 - str r0, [sp, #0x10] -_0234664C: - and r0, r6, #0xff - mov r8, #0 - str r0, [sp, #0x1c] - b _023466E4 -_0234665C: - mov r0, #0xb8 - mul r0, r8, r0 - add r1, sp, #0xbc - str r0, [sp, #0x18] - add r0, r1, r0 - bl EntityIsValid__02345698 - cmp r0, #0 - beq _023466E0 - mov r1, #0xb8 - add r0, sp, #0xbc - mla r0, r8, r1, r0 - add r2, sp, #0x6c - add r1, sp, #0x6c - add r2, r2, r8, lsl #3 - ldr r1, [r1, r8, lsl #3] - ldr r2, [r2, #4] - str r0, [sp, #0xc] - bl IncrementEntityPixelPosXY - mov r0, fp - bl SinAbs4096 - mov r1, #0xc - mul r1, r0, r1 - ldr r0, [sp, #0xc] - ldr r3, [sp, #0x1c] - str r1, [r0, #0x1c] - ldr r0, [sp, #0x18] - add r1, sp, #0xbc - add r0, r1, r0 - mov r1, #0 - str r1, [sp] - ldr r1, [sp, #0x10] - mov r2, #1 - bl DisplayItem -_023466E0: - add r8, r8, #1 -_023466E4: - cmp r8, sb - blt _0234665C - mov r0, #0x13 - bl AdvanceFrame - tst r5, #3 - addeq r6, r6, #1 - add r5, r5, #1 - add fp, fp, #0x55 - and r6, r6, #7 - cmp r5, #0x18 - blt _0234664C - mov r8, #0 - add r6, sp, #0x42 - mov fp, r8 - mov r5, #6 - b _023467B8 -_02346724: - mov r1, r8, lsl #2 - ldrsh r0, [r6, r1] - cmp r0, #0 - blt _023467B4 - add r1, r6, r1 - ldrsh r1, [r1, #2] - bl GetTile - ldrh r0, [r0] - and r0, r0, #3 - cmp r0, #3 - bne _02346784 - cmp r7, #0 - beq _023467B4 - mov r0, fp - mov r1, #0x40000 - bl SetPreprocessorArgsIdVal - ldr r2, _023467D4 ; =ov29_023531BC - mov r0, #0 - mov r1, sl - bl SubstitutePlaceholderItemTags - ldr r0, [sp, #4] - ldr r1, _023467D8 ; =0x00000BDC - bl LogMessageByIdWithPopupCheckUser - b _023467B4 -_02346784: - mla r1, r8, r5, sl - add r0, r6, r8, lsl #2 - mov r2, #1 - bl SpawnItem -#ifndef JAPAN - mov r0, r8, lsl #2 - add r1, r6, r8, lsl #2 - ldrsh r0, [r6, r0] - ldrsh r1, [r1, #2] - bl DrawMinimapTile -#endif - add r0, r4, #1 - mov r0, r0, lsl #0x10 - mov r4, r0, asr #0x10 -_023467B4: - add r8, r8, #1 -_023467B8: - cmp r8, sb - blt _02346724 - mov r0, r4 -_023467C4: - add sp, sp, #0x3ec - add sp, sp, #0x400 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -#define OV29_02346344_OFFSET -0x2C1 -#else -#define OV29_02346344_OFFSET 0 -#endif -_023467D0: .word 0x00000BDD + OV29_02346344_OFFSET -_023467D4: .word ov29_023531BC -_023467D8: .word 0x00000BDC + OV29_02346344_OFFSET -_023467DC: .word 0x00000BDE + OV29_02346344_OFFSET -_023467E0: .word DUNGEON_PTR - arm_func_end ov29_02346344 diff --git a/asm/overlay_29_02345AD8.s b/asm/overlay_29_02345AD8.s new file mode 100644 index 00000000..0aa727fa --- /dev/null +++ b/asm/overlay_29_02345AD8.s @@ -0,0 +1,954 @@ + .include "asm/macros.inc" + .include "overlay_29_02345AD8.inc" + + .text + + arm_func_start SpawnDroppedItem +SpawnDroppedItem: ; 0x02345AD8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x10 + mov r8, r1 + mov sb, r0 + ldrsh r0, [r8, #4] + ldrsh r1, [r8, #6] + mov r7, r2 + mov r4, r3 + ldr r6, [sp, #0x38] + bl GetTile + ldr r0, [r0, #0x10] + mov r5, #0 + cmp r0, #0 + beq _02345B5C + ldr r0, [r0] + cmp r0, #2 + bne _02345B5C + ldrb r2, [sp, #0x3c] + mov r0, r8 + add r1, r8, #4 + bl ov29_02347378 + add r0, r8, #4 + bl RevealAttackedTile + ldr r1, _02345D64 ; =0x00000BD8 + mov r0, sb + bl LogMessageByIdWithPopupCheckUser + ldrb r0, [r7] + tst r0, #1 + movne r0, #1 + moveq r0, r5 + tst r0, #0xff + moveq r0, #0 + beq _02345D5C +_02345B5C: + ldrsh r0, [r8, #4] + cmp r4, #0 + movne r4, #0 + strh r0, [sp, #0xc] + ldrsh r0, [r8, #6] + ldrh r1, [sp, #0xc] + ldr fp, _02345D68 ; =DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST + strh r0, [sp, #0xe] + ldrh r0, [sp, #0xe] + strh r1, [sp, #8] + moveq r4, #1 + strh r0, [sp, #0xa] +_02345B8C: + mov r0, r4, lsl #2 + ldrsh r3, [fp, r0] + cmp r3, #0x63 + moveq r5, #0 + beq _02345C44 + ldrsh r2, [r8, #4] + add r0, fp, r0 + ldrsh r1, [r0, #2] + add r0, r2, r3 + strh r0, [sp, #0xc] + ldrsh r2, [r8, #6] + ldrsh r0, [sp, #0xc] + add r1, r2, r1 + strh r1, [sp, #0xe] + ldrsh r1, [sp, #0xe] + bl GetTile + mov sl, r0 + ldrh r0, [sl] + tst r0, #3 + beq _02345C3C + tst r0, #0x200 + ldreq r0, [sl, #0x10] + cmpeq r0, #0 + bne _02345C3C + ldrb r2, [sp, #0x3c] + add r1, sp, #0xc + mov r0, r8 + bl ov29_02347378 + ldrh r0, [sl] + ldrh r2, [sp, #0xc] + ldrh r1, [sp, #0xe] + and r0, r0, #3 + cmp r0, #3 + strh r2, [sp, #8] + strh r1, [sp, #0xa] + moveq r5, #1 + beq _02345C44 + add r0, sp, #0xc + mov r1, r7 + mov r2, #1 + bl SpawnItem + cmp r0, #0 + movne r5, #1 + b _02345C44 +_02345C3C: + add r4, r4, #1 + b _02345B8C +_02345C44: + mov r0, #0 + mov r1, #0x40000 + bl SetPreprocessorArgsIdVal + ldr r2, _02345D6C ; =ov29_023531BC + mov r1, r7 + mov r0, #0 + bl SubstitutePlaceholderItemTags + cmp r5, #0 + beq _02345CF4 + ldrsh r0, [sp, #0xc] + ldrsh r1, [sp, #0xe] + bl DrawMinimapTile + ldrsh r0, [sp, #0xc] + ldrsh r1, [sp, #0xe] + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _02345D58 +_02345C94: ; jump table + b _02345CCC ; case 0 + b _02345CA4 ; case 1 + b _02345CB8 ; case 2 + b _02345CE0 ; case 3 +_02345CA4: + ldr r2, _02345D70 ; =0x00000BD9 + add r1, sp, #0xc + mov r0, sb + bl LogMessageByIdWithPopupCheckUserUnknown + b _02345D58 +_02345CB8: + ldr r2, _02345D74 ; =0x00000BDA + add r1, sp, #0xc + mov r0, sb + bl LogMessageByIdWithPopupCheckUserUnknown + b _02345D58 +_02345CCC: + ldr r2, _02345D78 ; =0x00000BDB + add r1, sp, #0xc + mov r0, sb + bl LogMessageByIdWithPopupCheckUserUnknown + b _02345D58 +_02345CE0: + ldr r2, _02345D7C ; =0x00000BDF + add r1, sp, #0xc + mov r0, sb + bl LogMessageByIdWithPopupCheckUserUnknown + b _02345D58 +_02345CF4: + ldrsh r2, [sp, #8] + ldrsh r1, [sp, #0xa] + mov r0, #0x18 + smulbb r2, r2, r0 + smulbb r0, r1, r0 + add r1, r2, #0xc + add r0, r0, #0xc + mov r2, r1, lsl #8 + mov r1, r0, lsl #8 + str r2, [sp] + str r1, [sp, #4] + cmp r6, #0 + beq _02345D40 + ldrsh r0, [r6] + add r0, r2, r0, lsl #8 + str r0, [sp] + ldrsh r0, [r6, #2] + add r0, r1, r0, lsl #8 + str r0, [sp, #4] +_02345D40: + add r0, sp, #0 + bl ov29_022E563C + ldr r2, _02345D80 ; =0x00000BDC + add r1, sp, #0xc + mov r0, sb + bl LogMessageByIdWithPopupCheckUserUnknown +_02345D58: + mov r0, r5 +_02345D5C: + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +#ifdef JAPAN +#define SPAWN_DROPPED_ITEM_OFFSET -0x2C1 +#else +#define SPAWN_DROPPED_ITEM_OFFSET 0 +#endif +_02345D64: .word 0x00000BD8 + SPAWN_DROPPED_ITEM_OFFSET +_02345D68: .word DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST +_02345D6C: .word ov29_023531BC +_02345D70: .word 0x00000BD9 + SPAWN_DROPPED_ITEM_OFFSET +_02345D74: .word 0x00000BDA + SPAWN_DROPPED_ITEM_OFFSET +_02345D78: .word 0x00000BDB + SPAWN_DROPPED_ITEM_OFFSET +_02345D7C: .word 0x00000BDF + SPAWN_DROPPED_ITEM_OFFSET +_02345D80: .word 0x00000BDC + SPAWN_DROPPED_ITEM_OFFSET + arm_func_end SpawnDroppedItem + + arm_func_start ov29_02345D84 +ov29_02345D84: ; 0x02345D84 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + mov sl, r1 + ldrsh r0, [sl, #4] + ldrsh r1, [sl, #6] + str r2, [sp, #4] + mov sb, r3 + bl GetTile + ldr r0, _02346048 ; =DUNGEON_PTR + mov r4, #0 + ldr r0, [r0] + ldr r1, _0234604C ; =SECONDARY_TERRAIN_TYPES + add r0, r0, #0x4000 +#ifdef JAPAN + ldrsh r0, [r0, #0x30] +#else + ldrsh r0, [r0, #0xd4] +#endif + mov r7, r4 + mov r8, r4 + ldrb r0, [r1, r0] + mov r6, #1 + mov fp, #0 + cmp r0, #1 + ldrsh r0, [sl, #4] + moveq r7, #1 + ldr r5, _02346050 ; =DISPLACEMENTS_WITHIN_3 + strh r0, [sp, #0x14] + ldrsh r0, [sl, #6] + ldrh r1, [sp, #0x14] + strh r0, [sp, #0x16] + ldrh r0, [sp, #0x16] + strh r1, [sp, #0x10] + strh r0, [sp, #0x12] + b _02345F74 +_02345E00: + mov r0, r6, lsl #2 + ldrsh r0, [r5, r0] + ldrsh r3, [sl, #4] + cmp r0, #0x63 + moveq r6, fp + mov r0, r6, lsl #2 + ldrsh r2, [r5, r0] + add r0, r5, r6, lsl #2 + ldrsh r1, [r0, #2] + add r0, r3, r2 + strh r0, [sp, #0x14] + ldrsh r2, [sl, #6] + ldrsh r0, [sp, #0x14] + moveq r8, #1 + add r1, r2, r1 + strh r1, [sp, #0x16] + ldrsh r1, [sp, #0x16] + bl GetTile + ldrh r1, [r0] + ands r2, r1, #3 + beq _02345F70 + tst r1, #0x200 + bne _02345F70 + ldr r0, [r0, #0x10] + cmp r0, #0 + bne _02345F64 + ldrh r1, [sp, #0x14] + ldrh r0, [sp, #0x16] + cmp r2, #3 + strh r1, [sp, #0x10] + strh r0, [sp, #0x12] + beq _02345F70 + cmp r7, #0 + beq _02345E90 + cmp r2, #2 + beq _02345F70 +_02345E90: + ldr r0, _02346048 ; =DUNGEON_PTR + ldrsh r2, [sp, #0x14] + ldr r3, [r0] + mov r0, #0x18 + ldrsh r1, [sp, #0x16] + smulbb r2, r2, r0 + smulbb r1, r1, r0 + add r0, r3, #0x1a000 + add r2, r2, #4 + add r1, r1, #4 +#ifdef JAPAN + ldrb fp, [r0, #0x1a1] +#else + ldrb fp, [r0, #0x245] +#endif + mov r5, #0x10000 + mov r7, r2, lsl #8 + mov r8, r1, lsl #8 + mov r0, sl + mov r1, r7 + mov r2, r8 + str r5, [sl, #0x1c] + bl SetEntityPixelPosXY + mov r6, #0 +_02345EE0: + sub r5, r5, #0x800 + mov r2, #0 + str r5, [sl, #0x1c] + mov r0, sl + mov r1, fp + mov r3, r2 + str r2, [sp] + bl DisplayItem + mov r0, #0x13 + bl AdvanceFrame + add r6, r6, #1 + cmp r6, #0x20 + blt _02345EE0 + mov r0, sl + mov r1, r7 + mov r2, r8 + bl SetEntityPixelPosXY + mov r2, #0 + str r2, [sl, #0x1c] + mov r0, sl + mov r1, fp + mov r3, r2 + str r2, [sp] + bl DisplayItem + mov r0, #0x13 + bl AdvanceFrame + ldr r1, [sp, #4] + add r0, sp, #0x14 + mov r2, #1 + bl SpawnItem + cmp r0, #0 + movne r4, #1 + b _02345F7C +_02345F64: + cmp r8, #0 + movne r4, #0 + bne _02345F7C +_02345F70: + add r6, r6, #1 +_02345F74: + cmp r8, #0 + beq _02345E00 +_02345F7C: + mov r0, #0 + mov r1, #0x40000 + bl SetPreprocessorArgsIdVal + ldr r2, _02346054 ; =ov29_023531BC + ldr r1, [sp, #4] + mov r0, #0 + bl SubstitutePlaceholderItemTags + cmp r4, #0 + beq _02345FC4 + bl PlayDungeonTipSound__022EB66C + ldr r1, _02346058 ; =0x00000B74 + mov r0, #0 + mov r2, #1 + bl DisplayMessage2 + ldr r1, _02346058 ; =0x00000B74 + mov r0, #0 + bl LogMessageByIdQuiet + b _0234603C +_02345FC4: + ldrsh r2, [sp, #0x10] + ldrsh r1, [sp, #0x12] + mov r0, #0x18 + smulbb r2, r2, r0 + smulbb r0, r1, r0 + add r1, r2, #0xc + add r0, r0, #0xc + mov r2, r1, lsl #8 + mov r1, r0, lsl #8 + str r2, [sp, #8] + str r1, [sp, #0xc] + cmp sb, #0 + beq _02346010 + ldrsh r0, [sb] + add r0, r2, r0, lsl #8 + str r0, [sp, #8] + ldrsh r0, [sb, #2] + add r0, r1, r0, lsl #8 + str r0, [sp, #0xc] +_02346010: + add r0, sp, #8 + bl ov29_022E563C + ldr r1, _0234605C ; =0x00000B75 + mov r0, #0 + mov r2, #1 + bl DisplayMessage2 + ldr r1, _0234605C ; =0x00000B75 + mov r0, #0 + bl LogMessageByIdQuiet + mov r0, #0 + b _02346040 +_0234603C: + mov r0, #1 +_02346040: + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_02346048: .word DUNGEON_PTR +_0234604C: .word SECONDARY_TERRAIN_TYPES +_02346050: .word DISPLACEMENTS_WITHIN_3 +_02346054: .word ov29_023531BC +#ifdef JAPAN +_02346058: .word 0x00000885 +_0234605C: .word 0x00000886 +#else +_02346058: .word 0x00000B74 +_0234605C: .word 0x00000B75 +#endif + arm_func_end ov29_02345D84 + + arm_func_start TryGenerateUnownStoneDrop +TryGenerateUnownStoneDrop: ; 0x02346060 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + mov r5, r1 + bl IsMarowakTrainingMaze + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, r5 + bl IsUnown + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, _023460D8 ; =UNOWN_STONE_DROP_CHANCE + ldrsh r0, [r0] + bl DungeonRandOutcome__022EAB20 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + sub r0, r5, #0xc9 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 + add r0, r0, #0x190 + mov r1, r0, lsl #0x10 + mov r0, r4 + mov r1, r1, asr #0x10 + mov r2, #0 + mov r3, #2 + bl GenerateItem + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_023460D8: .word UNOWN_STONE_DROP_CHANCE + arm_func_end TryGenerateUnownStoneDrop + + arm_func_start ov29_023460DC +ov29_023460DC: ; 0x023460DC + stmdb sp!, {r3, r4, r5, r6, r7, lr} + sub sp, sp, #0x18 + mov r7, r0 + mov r4, r1 + mov r6, r2 + mov r5, r3 + bl ov29_022FB51C + cmp r0, #0 + beq _02346134 + bl IsCurrentFixedRoomBossFight + cmp r0, #0 + bne _02346134 + bl IsMarowakTrainingMaze + cmp r0, #0 + bne _02346134 + mov r0, r4 + bl EntityIsValid__02345698 + cmp r0, #0 + beq _02346134 + ldr r0, [r4] + cmp r0, #1 + beq _0234613C +_02346134: + mov r0, #0 + b _02346330 +_0234613C: + ldr r4, [r4, #0xb4] + add r1, sp, #0 + ldrsh r0, [r4, #2] + bl GetTreasureBoxChances + cmp r5, #0 + ble _02346184 + ldr r1, _02346338 ; =ov10_022C48EC + mov lr, #0 + add r3, sp, #0 +_02346160: + mov ip, lr, lsl #1 + ldrsh r2, [r3, ip] + add lr, lr, #1 + cmp r2, #0 + ldrnesh r0, [r1, ip] + mlane r0, r5, r0, r2 + strneh r0, [r3, ip] + cmp lr, #4 + blt _02346160 +_02346184: + mov r2, #0 + mov r1, r2 + add r0, sp, #8 +_02346190: + str r1, [r0, r2, lsl #2] + add r2, r2, #1 + cmp r2, #4 + blt _02346190 + ldrsh r0, [sp] + mov ip, #1 + add r5, sp, #0 + str r0, [sp, #8] + add r2, sp, #8 +_023461B4: + mov r3, ip, lsl #1 + add r1, r2, ip, lsl #2 + ldrsh r3, [r5, r3] + ldr r1, [r1, #-4] + add r1, r1, r3 + str r1, [r2, ip, lsl #2] + add ip, ip, #1 + cmp ip, #4 + add r0, r0, r3 + blt _023461B4 + bl DungeonRandInt + ldr r1, [sp, #8] + cmp r1, #0 + beq _023461F4 + cmp r0, r1 + bge _023461FC +_023461F4: + mov r0, #0 + b _02346330 +_023461FC: + ldr r1, [sp, #0xc] + cmp r0, r1 + bge _0234626C + mov r5, #0 + mov r4, r5 + cmp r6, #0 + beq _02346230 + mov r0, #0x64 + bl DungeonRandInt + ldr r1, _0234633C ; =ov10_022C44C8 + ldrsh r1, [r1] + cmp r1, r0 + movlt r5, #1 +_02346230: + cmp r5, #0 + movne r5, #0x67 + bne _02346310 + ldr r0, _02346340 ; =DUNGEON_PTR + ldr r0, [r0] + add r5, r0, #0x348 + add r0, r5, #0x400 + bl GetMissionRank__0204FAE0 + mov r1, r0 + cmp r1, #0xf + movgt r1, #0xf + add r0, r5, #0x400 + bl RetrieveFromItemList1 + mov r5, r0 + b _02346310 +_0234626C: + ldr r1, [sp, #0x10] + cmp r0, r1 + ldrsh r0, [r4, #2] + bge _023462C8 + mov r1, #0 + bl GetExclusiveItem + movs r5, r0 + mov r4, #1 + bne _02346310 + ldr r0, _02346340 ; =DUNGEON_PTR + ldr r0, [r0] + ldr r0, [r0, #0x7cc] + cmp r0, #0 + moveq r0, #0x6e + movne r0, #0x6a + bl DungeonRandInt + mov r0, r0, lsl #0x12 + mov r0, r0, asr #0x10 + add r0, r0, #0x3e + add r0, r0, #0x200 + mov r0, r0, lsl #0x10 + mov r5, r0, asr #0x10 + b _02346310 +_023462C8: + mov r1, #1 + bl GetExclusiveItem + movs r5, r0 + mov r4, #2 + bne _02346310 + ldr r0, _02346340 ; =DUNGEON_PTR + ldr r0, [r0] + ldr r0, [r0, #0x7cc] + cmp r0, #0 + moveq r0, #0x6e + movne r0, #0x6a + bl DungeonRandInt + mov r0, r0, lsl #0x12 + mov r0, r0, asr #0x10 + add r0, r0, #0x3f + add r0, r0, #0x200 + mov r0, r0, lsl #0x10 + mov r5, r0, asr #0x10 +_02346310: + mov r0, r4 + bl ov29_02344BF8 + mov r1, r0 + mov r0, r7 + mov r2, r5 + mov r3, #2 + bl GenerateItem + mov r0, #1 +_02346330: + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_02346338: .word ov10_022C48EC +_0234633C: .word ov10_022C44C8 +_02346340: .word DUNGEON_PTR + arm_func_end ov29_023460DC + + arm_func_start ov29_02346344 +ov29_02346344: ; 0x02346344 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x3ec + sub sp, sp, #0x400 + mov r4, #0 + str r0, [sp, #4] + str r1, [sp, #8] + ldr sb, [sp, #0x810] + ldr r8, [sp, #0x814] + ldr r7, [sp, #0x818] + mov fp, r2 + mov sl, r3 + mov r1, r4 + mov r6, r4 + add r0, sp, #0x24 +_0234637C: + strb r6, [r0, r1] + add r1, r1, #1 + cmp r1, #0x1e + blt _0234637C + b _0234647C +_02346390: + ldrsh r1, [fp] + ldrsh r0, [fp, #2] + mov r5, #0 + strh r1, [sp, #0x20] + str r5, [sp, #0x14] + strh r0, [sp, #0x22] +_023463A8: + cmp r5, #0x1e + bge _02346454 + mov r2, r5, lsl #2 + ldrsh r0, [r8, r2] + cmp r0, #0x63 + beq _02346454 + add r1, sp, #0x24 + ldrb r1, [r1, r5] + cmp r1, #0 + bne _0234644C + add r1, r8, r2 + ldrsh r1, [r1, #2] + ldrsh r3, [fp] + ldrsh r2, [fp, #2] + add r3, r3, r0 + add r0, r2, r1 + strh r3, [sp, #0x20] + strh r0, [sp, #0x22] + ldrsh r0, [sp, #0x20] + ldrsh r1, [sp, #0x22] + bl GetTile + ldrh r1, [r0] + tst r1, #3 + beq _0234644C + tst r1, #0x200 + ldreq r0, [r0, #0x10] + cmpeq r0, #0 + bne _0234644C + ldrh r1, [sp, #0x20] + add r0, sp, #0x42 + mov r2, r6, lsl #2 + strh r1, [r0, r2] + mov r1, #1 + ldrh r3, [sp, #0x22] + str r1, [sp, #0x14] + mov r2, r1 + add r1, sp, #0x24 + add r0, r0, r6, lsl #2 + strb r2, [r1, r5] + strh r3, [r0, #2] + b _02346454 +_0234644C: + add r5, r5, #1 + b _023463A8 +_02346454: + ldr r0, [sp, #0x14] + cmp r0, #0 + bne _02346478 + add r0, sp, #0x42 + mov r1, r6, lsl #2 + mvn r2, #0 + strh r2, [r0, r1] + add r0, r0, r6, lsl #2 + strh r2, [r0, #2] +_02346478: + add r6, r6, #1 +_0234647C: + cmp r6, sb + blt _02346390 + mov r1, #0 + mov r5, r1 + mov r8, r1 + add fp, sp, #0x42 + b _023465B4 +_02346498: + mov r0, r8, lsl #2 + ldrsh r2, [fp, r0] + cmp r2, #0 + bge _023464C4 + mov r0, #0xb8 + mul r3, r8, r0 + mov r2, #0 + add r0, sp, #0xbc + str r2, [r0, r3] + mov r5, #1 + b _023465B0 +_023464C4: + mov r1, #0xb8 + mul r3, r8, r1 + add r1, sp, #0xbc + mov r2, #3 + str r2, [r1, r3] + add r6, r1, r3 + mov r1, #0 + strb r1, [r6, #0x24] + mov r1, #1 + strb r1, [r6, #0x20] + mov r1, #0 + strb r1, [r6, #0x22] + mov r1, #6 + mla r1, r8, r1, sl + str r1, [r6, #0xb4] + add r1, fp, r0 + ldrh r2, [fp, r0] + ldrh r1, [r1, #2] + mov r0, r6 + strh r2, [r6, #4] + strh r1, [r6, #6] + ldr r1, [sp, #8] + ldrsh r2, [r1] + ldrsh r3, [r1, #2] + mov r1, #0x18 + smulbb r1, r2, r1 + mov r2, #0x18 + smulbb r2, r3, r2 + add r1, r1, #4 + add r2, r2, #4 + mov r1, r1, lsl #8 + mov r2, r2, lsl #8 + bl SetEntityPixelPosXY + mov r0, #0 + strh r0, [r6, #0x26] + mov r0, r8, lsl #2 + ldrsh r3, [fp, r0] + mov r1, #0x18 + mov r0, r1 + smulbb r0, r3, r0 + ldr r2, [r6, #0xc] + add r0, r0, #4 + rsb r0, r2, r0, lsl #8 + bl _s32_div_f + add r1, sp, #0x6c + str r0, [r1, r8, lsl #3] + add r0, fp, r8, lsl #2 + ldrsh r3, [r0, #2] + mov r1, #0x18 + mov r0, r1 + smulbb r0, r3, r0 + ldr r2, [r6, #0x10] + add r0, r0, #4 + rsb r0, r2, r0, lsl #8 + bl _s32_div_f + add r1, sp, #0x6c + add r1, r1, r8, lsl #3 + str r0, [r1, #4] + mov r1, #1 +_023465B0: + add r8, r8, #1 +_023465B4: + cmp r8, sb + blt _02346498 + cmp r1, #0 + bne _02346614 + cmp r7, #0 + beq _0234660C + cmp sb, #2 + blt _023465E4 + ldr r1, _023467D0 ; =0x00000BDD + ldr r0, [sp, #4] + bl LogMessageByIdWithPopupCheckUser + b _0234660C +_023465E4: + mov r0, #0 + mov r1, #0x40000 + bl SetPreprocessorArgsIdVal + ldr r2, _023467D4 ; =ov29_023531BC + mov r1, sl + mov r0, #0 + bl SubstitutePlaceholderItemTags + ldr r1, _023467D8 ; =0x00000BDC + ldr r0, [sp, #4] + bl LogMessageByIdWithPopupCheckUser +_0234660C: + mov r0, #0 + b _023467C4 +_02346614: + cmp r5, #0 + cmpne r7, #0 + beq _0234662C + ldr r1, _023467DC ; =0x00000BDE + ldr r0, [sp, #4] + bl LogMessageByIdWithPopupCheckUser +_0234662C: + ldr r0, _023467E0 ; =DUNGEON_PTR + mov r6, #0 + ldr r0, [r0] + mov fp, r6 + add r0, r0, #0x1a000 +#ifdef JAPAN + ldrb r0, [r0, #0x1a1] +#else + ldrb r0, [r0, #0x245] +#endif + mov r5, r6 + str r0, [sp, #0x10] +_0234664C: + and r0, r6, #0xff + mov r8, #0 + str r0, [sp, #0x1c] + b _023466E4 +_0234665C: + mov r0, #0xb8 + mul r0, r8, r0 + add r1, sp, #0xbc + str r0, [sp, #0x18] + add r0, r1, r0 + bl EntityIsValid__02345698 + cmp r0, #0 + beq _023466E0 + mov r1, #0xb8 + add r0, sp, #0xbc + mla r0, r8, r1, r0 + add r2, sp, #0x6c + add r1, sp, #0x6c + add r2, r2, r8, lsl #3 + ldr r1, [r1, r8, lsl #3] + ldr r2, [r2, #4] + str r0, [sp, #0xc] + bl IncrementEntityPixelPosXY + mov r0, fp + bl SinAbs4096 + mov r1, #0xc + mul r1, r0, r1 + ldr r0, [sp, #0xc] + ldr r3, [sp, #0x1c] + str r1, [r0, #0x1c] + ldr r0, [sp, #0x18] + add r1, sp, #0xbc + add r0, r1, r0 + mov r1, #0 + str r1, [sp] + ldr r1, [sp, #0x10] + mov r2, #1 + bl DisplayItem +_023466E0: + add r8, r8, #1 +_023466E4: + cmp r8, sb + blt _0234665C + mov r0, #0x13 + bl AdvanceFrame + tst r5, #3 + addeq r6, r6, #1 + add r5, r5, #1 + add fp, fp, #0x55 + and r6, r6, #7 + cmp r5, #0x18 + blt _0234664C + mov r8, #0 + add r6, sp, #0x42 + mov fp, r8 + mov r5, #6 + b _023467B8 +_02346724: + mov r1, r8, lsl #2 + ldrsh r0, [r6, r1] + cmp r0, #0 + blt _023467B4 + add r1, r6, r1 + ldrsh r1, [r1, #2] + bl GetTile + ldrh r0, [r0] + and r0, r0, #3 + cmp r0, #3 + bne _02346784 + cmp r7, #0 + beq _023467B4 + mov r0, fp + mov r1, #0x40000 + bl SetPreprocessorArgsIdVal + ldr r2, _023467D4 ; =ov29_023531BC + mov r0, #0 + mov r1, sl + bl SubstitutePlaceholderItemTags + ldr r0, [sp, #4] + ldr r1, _023467D8 ; =0x00000BDC + bl LogMessageByIdWithPopupCheckUser + b _023467B4 +_02346784: + mla r1, r8, r5, sl + add r0, r6, r8, lsl #2 + mov r2, #1 + bl SpawnItem +#ifndef JAPAN + mov r0, r8, lsl #2 + add r1, r6, r8, lsl #2 + ldrsh r0, [r6, r0] + ldrsh r1, [r1, #2] + bl DrawMinimapTile +#endif + add r0, r4, #1 + mov r0, r0, lsl #0x10 + mov r4, r0, asr #0x10 +_023467B4: + add r8, r8, #1 +_023467B8: + cmp r8, sb + blt _02346724 + mov r0, r4 +_023467C4: + add sp, sp, #0x3ec + add sp, sp, #0x400 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +#ifdef JAPAN +#define OV29_02346344_OFFSET -0x2C1 +#else +#define OV29_02346344_OFFSET 0 +#endif +_023467D0: .word 0x00000BDD + OV29_02346344_OFFSET +_023467D4: .word ov29_023531BC +_023467D8: .word 0x00000BDC + OV29_02346344_OFFSET +_023467DC: .word 0x00000BDE + OV29_02346344_OFFSET +_023467E0: .word DUNGEON_PTR + arm_func_end ov29_02346344 diff --git a/include/dungeon_util_2.h b/include/dungeon_util_2.h index 0ae3c635..d5615404 100644 --- a/include/dungeon_util_2.h +++ b/include/dungeon_util_2.h @@ -5,5 +5,9 @@ // Checks if a monster can target a position. This function just calls IsPositionInSight using the position of the user as the origin. bool8 CanTargetPosition(struct entity *monster, struct position *position); +void PopulateActiveMonsterPtrs(void); +s32 GetTeamMemberIndex(struct entity *entity); +void GetMonsterOrTrapName(char *buf, struct entity *entity, u32 param_3); +void SubstitutePlaceholderStringTags(s32 pos, struct entity* entity, u32 param_3); #endif //PMDSKY_DUNGEON_UTIL_2_H diff --git a/include/overlay_29_022E3F20.h b/include/overlay_29_022E3F20.h index aa0064c4..48de6756 100644 --- a/include/overlay_29_022E3F20.h +++ b/include/overlay_29_022E3F20.h @@ -3,6 +3,11 @@ #include "dungeon_mode.h" +void UpdateStatusIconFlags(struct entity *entity); +void PlayQuestionMarkEffect(struct entity *entity); +void PlayExclamationPointEffect__022E47D4(struct entity *entity); +void ov29_022E3E74(struct entity *entity); +void PlayExclamationPointEffect__022E4880(struct entity *entity); void ov29_022E3F20(void); void ov29_022E3F24(struct entity *entity); void ov29_022E3F74(void); diff --git a/include/overlay_29_022EC7E8.h b/include/overlay_29_022EC7E8.h new file mode 100644 index 00000000..7487d4b8 --- /dev/null +++ b/include/overlay_29_022EC7E8.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_OVERLAY_29_022EC7E8_H +#define PMDSKY_OVERLAY_29_022EC7E8_H + +#include "dungeon_mode.h" + +bool8 IsFloorOver(void); + +#endif //PMDSKY_OVERLAY_29_022EC7E8_H diff --git a/include/overlay_29_023061A8.h b/include/overlay_29_023061A8.h new file mode 100644 index 00000000..8c9397d3 --- /dev/null +++ b/include/overlay_29_023061A8.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_OVERLAY_29_023061A8_H +#define PMDSKY_OVERLAY_29_023061A8_H + +#include "dungeon_mode.h" + +void EndBurnClassStatus(struct entity *user, struct entity *target); + +#endif //PMDSKY_OVERLAY_29_023061A8_H diff --git a/include/overlay_29_02306728.h b/include/overlay_29_02306728.h new file mode 100644 index 00000000..13011eaa --- /dev/null +++ b/include/overlay_29_02306728.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_OVERLAY_29_02306728_H +#define PMDSKY_OVERLAY_29_02306728_H + +#include "dungeon_mode.h" + +void EndCurseClassStatus(struct entity *user, struct entity *target, u8 next_curse_class_status_being_applied, bool8 log_message); + +#endif //PMDSKY_OVERLAY_29_02306728_H diff --git a/include/overlay_29_02336F4C.h b/include/overlay_29_02336F4C.h new file mode 100644 index 00000000..980aefd1 --- /dev/null +++ b/include/overlay_29_02336F4C.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_OVERLAY_29_02336F4C_H +#define PMDSKY_OVERLAY_29_02336F4C_H + +#include "dungeon_mode.h" + +void UpdateTrapsVisibility(void); + +#endif //PMDSKY_OVERLAY_29_02336F4C_H diff --git a/include/overlay_29_0233E43C.h b/include/overlay_29_0233E43C.h index 16a08bd2..dfa103b9 100644 --- a/include/overlay_29_0233E43C.h +++ b/include/overlay_29_0233E43C.h @@ -3,9 +3,10 @@ #include "overlay_29_0233C9E8.h" -void CreateHallway(s32 arg1, s32 arg2, s32 arg3, s32 arg4, bool8 arg5, s32 arg6, s32 arg7); void CreateGridCellConnections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, s32 grid_size_y, s32 *arg4, s32 *arg5, bool8 arg6); +void GenerateRoomImperfections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, s32 grid_size_y); +void CreateHallway(s32 x, s32 y, s32 end_x, s32 end_y, bool8 vertical, s32 turn_x, s32 turn_y); #endif //PMDSKY_OVERLAY_29_0233E43C_H diff --git a/include/overlay_29_02345A3C.h b/include/overlay_29_02345A3C.h new file mode 100644 index 00000000..e6151dfa --- /dev/null +++ b/include/overlay_29_02345A3C.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_OVERLAY_29_02345A3C_H +#define PMDSKY_OVERLAY_29_02345A3C_H + +#include "dungeon_mode.h" + +bool8 SpawnDroppedItemWrapper(struct entity *entity, struct position *pos, struct item *item, u32 param_4); + +#endif //PMDSKY_OVERLAY_29_02345A3C_H diff --git a/main.lsf b/main.lsf index 5732f772..2da6b02e 100644 --- a/main.lsf +++ b/main.lsf @@ -802,7 +802,7 @@ Overlay OVY_29 Object src/overlay_29_022E272C.o Object src/dungeon_visibility.o Object src/dungeon_util_2.o - Object asm/overlay_29_022E2978.o + Object asm/overlay_29_022E34A8.o Object src/dg_camera.o Object asm/overlay_29_022E335C.o Object src/dg_effect.o @@ -862,6 +862,8 @@ Overlay OVY_29 Object asm/overlay_29_022EBCE8.o Object src/overlay_29_022EC608.o Object asm/overlay_29_022EC62C.o + Object src/overlay_29_022EC7E8.o + Object asm/overlay_29_022EC85C.o Object src/overlay_29_022ECDC0.o Object asm/overlay_29_022ECDE4.o Object src/overlay_29_022ECF44.o @@ -967,6 +969,10 @@ Overlay OVY_29 Object asm/overlay_29_023055B0.o Object src/overlay_29_02305C04.o Object asm/overlay_29_02305C28.o + Object src/overlay_29_023061A8.o + Object asm/overlay_29_02306258.o + Object src/overlay_29_02306728.o + Object asm/overlay_29_023068C4.o Object src/overlay_29_02307EF8.o Object asm/overlay_29_02307F4C.o Object src/dungeon_ai_leader.o @@ -1205,6 +1211,8 @@ Overlay OVY_29 Object asm/overlay_29_02336224.o Object src/overlay_29_02336428.o Object asm/overlay_29_02336450.o + Object src/overlay_29_02336F4C.o + Object asm/overlay_29_0233711C.o Object src/overlay_29_02337CA8.o Object asm/overlay_29_02337CCC.o Object src/dungeon_map_access_1.o @@ -1229,7 +1237,7 @@ Overlay OVY_29 Object src/overlay_29_0233C9E8.o Object asm/overlay_29_0233CF84.o Object src/overlay_29_0233E43C.o - Object asm/overlay_29_0233ED34.o + Object asm/overlay_29_0233F424.o Object src/overlay_29_02340CAC.o Object asm/overlay_29_02340CE4.o Object src/dungeon_generation.o @@ -1245,6 +1253,8 @@ Overlay OVY_29 Object asm/overlay_29_02344BF8.o Object src/overlay_29_02345698.o Object asm/overlay_29_023456BC.o + Object src/overlay_29_02345A3C.o + Object asm/overlay_29_02345AD8.o Object src/dungeon_items.o Object asm/overlay_29_02346834.o Object src/dungeon_projectile_throw.o diff --git a/src/dungeon_ai.c b/src/dungeon_ai.c index ee47a624..05abac36 100644 --- a/src/dungeon_ai.c +++ b/src/dungeon_ai.c @@ -15,6 +15,7 @@ #include "overlay_29_022FB538.h" #include "status_checks.h" #include "targeting.h" +#include "dungeon_util_2.h" #ifdef JAPAN #define CANNOT_USE_ITEM_MESSAGE 0xB2D @@ -27,7 +28,6 @@ extern struct dungeon *DUNGEON_PTR[]; extern void EndFrozenClassStatus(struct entity *user, struct entity *target, bool8 log); -extern void SubstitutePlaceholderStringTags(s32 slot, struct entity *entity, u32 param_3); extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); void RunMonsterAi(struct entity *monster, u32 unused) diff --git a/src/dungeon_projectile_throw.c b/src/dungeon_projectile_throw.c index dd89c843..058b1cea 100644 --- a/src/dungeon_projectile_throw.c +++ b/src/dungeon_projectile_throw.c @@ -11,6 +11,7 @@ #include "MSL_C/stdlib.h" #include "moves_1.h" #include "overlay_29_02344AF8.h" +#include "dungeon_util_2.h" #ifdef JAPAN #define CURVED_PROJECTILE_LOG_MESSAGE_1 0x920 @@ -32,11 +33,10 @@ extern bool8 DisplayItem(struct entity *item, bool8 hallucinate, u8 on_floor, u8 extern void AdvanceFrame(u32 param_1); extern bool8 TwoTurnMoveForcedMiss(struct entity *target, struct move *move); extern bool8 DoesProjectileHitTarget(struct entity *user, struct entity *target); -extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity, u32 param_3); extern void ChangeMonsterAnimationToHurt(struct entity *monster, u32 direction); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); -extern void SpawnDroppedItem(struct entity *entity, struct entity *item_entity, struct item *item, bool8 param_4, struct position *dir_xy, u32 param_6); +extern bool8 SpawnDroppedItem(struct entity *entity, struct entity *item_entity, struct item *item, bool8 param_4, struct position *dir_xy, u32 param_6); bool8 ItemIsActive__02347B50(struct entity *entity, enum item_id item_id) { diff --git a/src/dungeon_util_2.c b/src/dungeon_util_2.c index f7926c55..06609577 100644 --- a/src/dungeon_util_2.c +++ b/src/dungeon_util_2.c @@ -1,8 +1,110 @@ #include "dungeon_util_2.h" #include "dungeon_pokemon_attributes_1.h" #include "dungeon_range.h" +#include "dungeon.h" +#include "dg_object.h" +#include "main_0200C4FC.h" +#include "main_0202593C.h" +#include "overlay_29_023000E4.h" +#include "overlay_29_0234B024.h" + +extern struct dungeon *DUNGEON_PTR; +extern u8 *strcpy(u8 *dest, const u8 *src); +extern void GetTrapName(char *buf, enum trap_id trap_id); +extern void PrepareItemForPrinting2(struct preprocessor_args *preprocessor_args, s32 pos, struct item *item); +extern void SubstitutePlaceholderTrapTags(struct preprocessor_args *preprocessor_args, s32 pos, u32 trap_id); +extern void SetPreprocessorArgsStringToName(struct preprocessor_args *preprocessor_args, s32 pos, struct monster *monster, u32 param_4, u8 name_type); bool8 CanTargetPosition(struct entity *monster, struct position *position) { return IsPositionInSight(&monster->pos, position, HasDropeyeStatus(monster)); } + +void PopulateActiveMonsterPtrs(void) +{ + s32 i; + s32 n; + struct entity *entity; + + n = 0; + for (i = 0; i < MAX_TEAM_MEMBERS; i++) + { + entity = DUNGEON_PTR->monster_slots.party_members[i]; + if (EntityIsValid__022E1A1C(entity)) + { + DUNGEON_PTR->active_monster_ptrs[n] = entity; + n++; + } + } + for (i = 0; i < DUNGEON_MAX_WILD_POKEMON; i++) + { + entity = DUNGEON_PTR->monster_slots.wild_pokemon[i]; + if (EntityIsValid__022E1A1C(entity)) + { + DUNGEON_PTR->active_monster_ptrs[n] = entity; + n++; + } + } + for (; n < DUNGEON_MAX_POKEMON; n++) + { + DUNGEON_PTR->active_monster_ptrs[n] = NULL; + } +} + +s32 GetTeamMemberIndex(struct entity *entity) +{ + s32 i; + + for (i = 0; i < MAX_TEAM_MEMBERS; i++) + { + if (entity == DUNGEON_PTR->monster_slots.party_members[i]) + return i; + } + return -1; +} + +void GetMonsterOrTrapName(char *buf, struct entity *entity, u32 param_3) +{ + switch (entity->type) + { + case ENTITY_MONSTER: + GetMonsterName(buf, (struct monster *)entity->info); + break; + case ENTITY_TRAP: + GetTrapName(buf, ((struct trap *)entity->info)->id); + break; + case ENTITY_ITEM: + break; + default: +#ifdef JAPAN + strcpy((u8 *)buf, StringFromId(0xB42)); +#else + strcpy((u8 *)buf, StringFromId(0xA42)); +#endif + break; + } +} + +void SubstitutePlaceholderStringTags(s32 pos, struct entity* entity, u32 param_3) +{ + struct preprocessor_args* args = GetMessageLogPreprocessorArgs(); + + switch (entity->type) { + case ENTITY_MONSTER: + SetPreprocessorArgsStringToName(args, pos, entity->info, param_3, 0); + break; + case ENTITY_ITEM: + PrepareItemForPrinting2(args, pos, entity->info); + break; + case ENTITY_TRAP: + SubstitutePlaceholderTrapTags(args, pos, ((struct trap*)entity->info)->id); + break; + default: +#ifdef JAPAN + args->strings[pos] = (char*)StringFromId(0xB42); +#else + args->strings[pos] = (char*)StringFromId(0xA42); +#endif + break; + } +} diff --git a/src/move_orb_effects.c b/src/move_orb_effects.c index bac7c63f..282bf3ce 100644 --- a/src/move_orb_effects.c +++ b/src/move_orb_effects.c @@ -9,12 +9,13 @@ #include "overlay_29_023118B4.h" #include "overlay_29_02311BF8.h" #include "overlay_29_02344AF8.h" +#include "dungeon_util_2.h" +#include "overlay_29_022E3F20.h" extern u8* AllocateTemp1024ByteBufferFromPool(void); extern void CopyStringFromId(u8* buf, u32 string_id); extern void SetMessageLogPreprocessorArgsString(u32 a, u8 *buf); extern bool8 IsProtectedFromStatDrops(struct entity *user, struct entity *target, bool8 log_message); -extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity, u32 param_3); extern void PlayOffensiveStatUpEffect(struct entity *entity, struct StatIndex stat_index); extern void PlayDefensiveStatDownEffect(struct entity *entity, struct StatIndex stat_index); extern void PlayDefensiveStatUpEffect(struct entity *entity, struct StatIndex stat_index); @@ -26,7 +27,6 @@ extern void PlayDefensiveStatMultiplierUpEffect(struct entity *entity, struct St extern void PlayHitChanceUpEffect(struct entity *entity, struct StatIndex stat_index); extern void PlayHitChanceDownEffect(struct entity *entity, struct StatIndex stat_index); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); -extern void UpdateStatusIconFlags(struct entity *entity); extern void ov29_022E4338(struct entity *); extern void PlayExclamationPointEffect__022E5D4C(struct entity *entity); extern void PlayParalysisEffect(struct entity *entity); @@ -40,7 +40,7 @@ extern void TryActivateQuickFeet(struct entity *attacker ,struct entity *defende extern s32 CalcStatusDuration(struct entity *entity, const s16 *turn_range, bool8 iq_skill_effects); extern bool8 GetExclusiveItemWithEffectFromBag(struct entity *, enum exclusive_item_effect_id effect_id, struct item *item); extern struct preprocessor_args* GetMessageLogPreprocessorArgs(void); -extern void SetPreprocessorArgsStringToName(struct preprocessor_args* preprocessor_args, u8 pos, struct monster* monster, u8 param_4, u8 name_type); +extern void SetPreprocessorArgsStringToName(struct preprocessor_args* preprocessor_args, s32 pos, struct monster* monster, u32 param_4, u8 name_type); extern int CalcSpeedStageWrapper(struct entity* entity); extern int CalcSpeedStage(struct entity *entity, s32 counter_weight); diff --git a/src/overlay_29_022E3F20.c b/src/overlay_29_022E3F20.c index 0b363074..407d012a 100644 --- a/src/overlay_29_022E3F20.c +++ b/src/overlay_29_022E3F20.c @@ -1,10 +1,123 @@ #include "overlay_29_022E3F20.h" +#include "dungeon.h" +#include "dungeon_util_static.h" +#include "dg_effect.h" + +extern struct dungeon *DUNGEON_PTR[]; + +extern void PlaySeByIdIfShouldDisplayEntity(struct entity *entity, s32 se_id); extern s32 GetEffectAnimationWanOffset(s32 id); extern void PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, s32 c, s32 d, s32 e, s32 f); +extern const u64 STATUS_ICON_ARRAY_SLEEP[]; +extern const u64 STATUS_ICON_ARRAY_BURN[]; +extern const u64 STATUS_ICON_ARRAY_FREEZE[]; +extern const u64 STATUS_ICON_ARRAY_CRINGE[]; +extern const u64 STATUS_ICON_ARRAY_BIDE[]; +extern const u64 STATUS_ICON_ARRAY_REFLECT[]; +extern const u64 STATUS_ICON_ARRAY_CURSE[]; +extern const u64 STATUS_ICON_ARRAY_LEECH_SEED[]; +extern const u64 STATUS_ICON_ARRAY_SURE_SHOT[]; +extern const u64 STATUS_ICON_ARRAY_LONG_TOSS[]; +extern const u64 STATUS_ICON_ARRAY_INVISIBLE[]; +extern const u64 STATUS_ICON_ARRAY_BLINDED[]; +extern const u64 STATUS_ICON_ARRAY_MUZZLED[]; +extern const u64 STATUS_ICON_ARRAY_MIRACLE_EYE[]; +extern const u64 STATUS_ICON_ARRAY_MAGNET_RISE[]; + +void UpdateStatusIconFlags(struct entity *entity) +{ + struct monster *info; + u64 icons; + bool32 show_sleep; + s32 max_hp; + + if (!EntityIsValid__022E37B8(entity)) + return; + + info = GetEntInfo(entity); + icons = 0; + show_sleep = TRUE; + if (info->id == MONSTER_SUDOWOODO || info->id == MONSTER_SUDOWOODO_SECONDARY) { + if (info->sleep_class_status.sleep_turns == 0x7f) + show_sleep = FALSE; + } + if (show_sleep) + icons = icons | STATUS_ICON_ARRAY_SLEEP[info->sleep_class_status.sleep]; + + icons = icons | STATUS_ICON_ARRAY_BURN[info->burn_class_status.burn]; + icons = icons | STATUS_ICON_ARRAY_FREEZE[info->frozen_class_status.freeze]; + icons = icons | STATUS_ICON_ARRAY_CRINGE[info->cringe_class_status.cringe]; + icons = icons | STATUS_ICON_ARRAY_BIDE[info->bide_class_status.bide]; + icons = icons | STATUS_ICON_ARRAY_REFLECT[info->reflect_class_status.reflect]; + icons = icons | STATUS_ICON_ARRAY_CURSE[info->curse_class_status.curse]; + icons = icons | STATUS_ICON_ARRAY_LEECH_SEED[info->leech_seed_class_status.leech_seed]; + icons = icons | STATUS_ICON_ARRAY_SURE_SHOT[info->sure_shot_class_status.sure_shot]; + icons = icons | STATUS_ICON_ARRAY_LONG_TOSS[info->long_toss_class_status.status]; + icons = icons | STATUS_ICON_ARRAY_INVISIBLE[info->invisible_class_status.status]; + icons = icons | STATUS_ICON_ARRAY_BLINDED[info->blinker_class_status.blinded]; + icons = icons | STATUS_ICON_ARRAY_MUZZLED[info->muzzled]; + icons = icons | STATUS_ICON_ARRAY_MIRACLE_EYE[info->miracle_eye]; + icons = icons | STATUS_ICON_ARRAY_MAGNET_RISE[info->magnet_rise]; + + if (info->grudge) + icons |= 0x1000000; + if (info->exposed) + icons |= 0x2000000; + if (!info->is_not_team_member) { + max_hp = info->max_hp_stat + info->max_hp_boost; + if (max_hp > MAX_HP_LIMIT) + max_hp = MAX_HP_LIMIT; + if (info->hp < max_hp / 4) + icons |= 0x2000; + } + if (DUNGEON_PTR[0]->identify_orb_flag) { + if (ItemExists(info->held_item.flags)) + icons |= 0x2000; + } + if (info->stat_modifiers.offensive_multipliers[0] < 0x100 || + info->stat_modifiers.offensive_multipliers[1] < 0x100 || + info->stat_modifiers.defensive_multipliers[0] < 0x100 || + info->stat_modifiers.defensive_multipliers[1] < 0x100 || + info->stat_modifiers.offensive_stages[0] < DEFAULT_STAT_STAGE || + info->stat_modifiers.offensive_stages[1] < DEFAULT_STAT_STAGE || + info->stat_modifiers.defensive_stages[0] < DEFAULT_STAT_STAGE || + info->stat_modifiers.defensive_stages[1] < DEFAULT_STAT_STAGE || + info->stat_modifiers.hit_chance_stages[0] < DEFAULT_STAT_STAGE || + info->stat_modifiers.hit_chance_stages[1] < DEFAULT_STAT_STAGE) + icons |= 0x8000000; + + *(u64 *)&info->status_icons = icons; +} + +void PlayQuestionMarkEffect(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x144, 1, GetEffectAnimationWanOffset(0x144), + 2, 0, -1, 0); +} + +void PlayExclamationPointEffect__022E47D4(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x143, 1, GetEffectAnimationWanOffset(0x143), + 2, 0, -1, 0); +} + +void ov29_022E3E74(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x25, 1, GetEffectAnimationWanOffset(0x25), + 2, 0, -1, 0); + PlaySeByIdIfShouldDisplayEntity(entity, 0x30E); +} + +void PlayExclamationPointEffect__022E4880(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x143, 1, GetEffectAnimationWanOffset(0x143), + 2, 0, -1, 0); +} + void ov29_022E3F20(void) { diff --git a/src/overlay_29_022EC7E8.c b/src/overlay_29_022EC7E8.c new file mode 100644 index 00000000..55931ce3 --- /dev/null +++ b/src/overlay_29_022EC7E8.c @@ -0,0 +1,28 @@ +#include "overlay_29_022EC7E8.h" +#include "dungeon.h" +#include "dg_uty.h" + +extern struct dungeon *DUNGEON_PTR[]; + +bool8 IsFloorOver(void) +{ + if (DUNGEON_PTR[0]->end_floor_no_death_check_flag != 0) + return TRUE; + + if (GetLeader() == NULL) { + DUNGEON_PTR[0]->floor_loop_status = FLOOR_LOOP_LEADER_FAINTED; + return TRUE; + } + + if (DUNGEON_PTR[0]->end_floor_flag == 1) { + DUNGEON_PTR[0]->floor_loop_status = FLOOR_LOOP_NEXT_FLOOR; + return TRUE; + } + + if (DUNGEON_PTR[0]->end_floor_flag == 2) { + DUNGEON_PTR[0]->floor_loop_status = FLOOR_LOOP_NEXT_FLOOR; + return TRUE; + } + + return FALSE; +} diff --git a/src/overlay_29_022F0EDC.c b/src/overlay_29_022F0EDC.c index 715a30e4..74dec6e3 100644 --- a/src/overlay_29_022F0EDC.c +++ b/src/overlay_29_022F0EDC.c @@ -17,6 +17,8 @@ #include "overlay_29_0234928C.h" #include "overlay_29_022FB538.h" #include "position_util.h" +#include "dungeon_util_2.h" +#include "overlay_29_022EC7E8.h" #ifdef JAPAN #define SET_LEADER_ACTION_DATA_OFFSET -0x2C1 @@ -57,10 +59,8 @@ extern s32 GetEntityTouchscreenArea(); extern s32 GetIdleAnimationId(); extern struct entity *GetMonsterInFront(); extern void GetPressedButtons(u32 param_1, u16 *pressed); -extern s32 GetTeamMemberIndex(); extern s32 HasStatusThatPreventsLeaderActing(); extern s32 HideTileGrid(); -extern s32 IsFloorOver(); extern s32 LogItemBlockedByEmbargo(); extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); extern s32 MonsterHasEmbargoStatus(); diff --git a/src/overlay_29_023061A8.c b/src/overlay_29_023061A8.c new file mode 100644 index 00000000..a862fef3 --- /dev/null +++ b/src/overlay_29_023061A8.c @@ -0,0 +1,41 @@ +#include "overlay_29_023061A8.h" +#include "overlay_29_02305C04.h" +#include "dungeon_util_2.h" +#include "overlay_29_022E3F20.h" +#include "dungeon_util_static.h" + +#ifdef JAPAN +#define JPN_MSG_OFFSET -0x2C0 +#else +#define JPN_MSG_OFFSET 0 +#endif + +extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); + +void EndBurnClassStatus(struct entity *user, struct entity *target) +{ + struct monster *entityInfo; + + if (!EntityIsValid__02305C04(target)) + return; + + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0, target, 0); + switch (entityInfo->burn_class_status.burn) { + case STATUS_BURN_NONE: + case 5: + break; + case STATUS_BURN_POISONED: + case STATUS_BURN_BADLY_POISONED: + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xc9e + JPN_MSG_OFFSET); + break; + case STATUS_BURN_PARALYSIS: + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xc9c + JPN_MSG_OFFSET); + break; + case STATUS_BURN_BURN: + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xc9d + JPN_MSG_OFFSET); + break; + } + entityInfo->burn_class_status.burn = STATUS_BURN_NONE; + UpdateStatusIconFlags(target); +} diff --git a/src/overlay_29_02306728.c b/src/overlay_29_02306728.c new file mode 100644 index 00000000..931980a0 --- /dev/null +++ b/src/overlay_29_02306728.c @@ -0,0 +1,74 @@ +#include "overlay_29_02306728.h" +#include "overlay_29_02305C04.h" +#include "dungeon_util_2.h" +#include "overlay_29_022E3F20.h" +#include "dungeon.h" +#include "dungeon_util_static.h" + +extern struct dungeon *DUNGEON_PTR[]; + +extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); +extern s32 GetIdleAnimationId(struct entity *entity); +extern int ov29_02304830(); +extern void TryRemoveSnatchedMonsterFromDungeonStruct(struct entity *user, struct entity *target); +extern void ov29_022FB984(struct entity *entity); + +#ifdef JAPAN +#define JPN_MSG_OFFSET -0x2C0 +#else +#define JPN_MSG_OFFSET 0 +#endif + +void EndCurseClassStatus(struct entity *user, struct entity *target, u8 next_curse_class_status_being_applied, bool8 log_message) +{ + struct monster *entityInfo; + + if (!EntityIsValid__02305C04(target)) + return; + + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0, target, 0); + + switch (entityInfo->curse_class_status.curse) { + case STATUS_CURSE_NONE: + case 7: + break; + case STATUS_CURSE_CURSED: + if (next_curse_class_status_being_applied != STATUS_CURSE_CURSED && log_message) + LogMessageByIdWithPopupCheckUser(target, 0xc95 + JPN_MSG_OFFSET); + break; + case STATUS_CURSE_SNATCH: + if (next_curse_class_status_being_applied != STATUS_CURSE_SNATCH && log_message) + LogMessageByIdWithPopupCheckUser(target, 0xc96 + JPN_MSG_OFFSET); + TryRemoveSnatchedMonsterFromDungeonStruct(user, target); + break; + case STATUS_CURSE_DECOY: + entityInfo->curse_class_status.curse = STATUS_CURSE_NONE; + ov29_02304830(target, GetIdleAnimationId(target)); + DUNGEON_PTR[0]->decoy_is_active = FALSE; + if (next_curse_class_status_being_applied != STATUS_CURSE_DECOY) { + SubstitutePlaceholderStringTags(0, target, 0); + if (log_message) + LogMessageByIdWithPopupCheckUser(target, 0xca5 + JPN_MSG_OFFSET); + } + break; + case STATUS_CURSE_GASTRO_ACID: + entityInfo->curse_class_status.curse = STATUS_CURSE_NONE; + ov29_022FB984(target); + if (log_message) + LogMessageByIdWithPopupCheckUser(target, 0xcbf + JPN_MSG_OFFSET); + DUNGEON_PTR[0]->activate_artificial_weather_flag = TRUE; + break; + case STATUS_CURSE_HEAL_BLOCK: + if (log_message) + LogMessageByIdWithPopupCheckUser(target, 0xcc2 + JPN_MSG_OFFSET); + break; + case STATUS_CURSE_EMBARGO: + if (log_message) + LogMessageByIdWithPopupCheckUser(target, 0xcc3 + JPN_MSG_OFFSET); + break; + } + + entityInfo->curse_class_status.curse = STATUS_CURSE_NONE; + UpdateStatusIconFlags(target); +} diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index ce16d975..07b0f9da 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -43,6 +43,10 @@ #include "overlay_29_022E3F20.h" #include "overlay_29_022E406C.h" #include "overlay_29_0233836C.h" +#include "dungeon_util_2.h" +#include "overlay_29_02345A3C.h" +#include "overlay_29_02306728.h" +#include "overlay_29_02336F4C.h" struct unk_023535DC { u8 field_0x0; @@ -96,7 +100,6 @@ extern bool8 AftermathCheck(struct entity *attacker, struct entity *defender, s3 extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); extern void ChangeMonsterAnimationToIdle(struct entity* monster, enum direction_id direction); extern void DisplayAnimatedNumbers(s32 amount, struct entity *entity, bool8 display_sign, s32 number_color); -extern void EndCurseClassStatus(struct entity* user, struct entity* target, u8 next_curse_class_status_being_applied, bool8 log_message); extern void EndInvisibleClassStatus(struct entity* user, struct entity* target, bool8 no_slip_message); extern int EndLeechSeedStatusForAllTargets(); extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity* user, struct entity* target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); @@ -118,17 +121,13 @@ extern int PlayMissSfx__022E6150(); extern void RemoveHolderForItemInBag(struct item* item); extern void RestorePpAllMovesSetFlags(struct entity* entity); extern void RestoreRandomMovePP(struct entity* user, struct entity* target, s32 pp, bool8 log_message); -extern bool8 SpawnDroppedItemWrapper(struct entity *entity, struct position *pos, struct item *item, u32 param_4); extern void SubInitMonster(struct monster* monster, bool8 flag); -extern void SubstitutePlaceholderStringTags(s32 slot, struct entity *entity, u32 param_3); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); extern bool8 TryRecruit(struct entity *user, struct entity *recruit, void *recruit_info); extern void TrySpawnEnemyItemDrop(struct entity* attacker, struct entity* defender); extern void UnfreezeAnim(struct entity *e); extern void UpdateShopkeeperModeAfterAttack(struct entity* attacker, struct entity* defender); -extern void UpdateStatusIconFlags(struct entity *); -extern void UpdateTrapsVisibility(void); extern s32 abs(s32 n); extern int ov10_022BDC68(); extern int TerminateEffectWrapper(); diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c index 64439fc4..fb6d1431 100644 --- a/src/overlay_29_0230BBAC.c +++ b/src/overlay_29_0230BBAC.c @@ -24,6 +24,7 @@ #include "run_dungeon_1.h" #include "type_effectiveness.h" #include "weather.h" +#include "dungeon_util_2.h" extern struct dungeon *DUNGEON_PTR; extern u8 GetMonsterGenderVeneer(s16 monster_id); @@ -47,7 +48,6 @@ extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_ extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern bool8 UpdateStateFlags(struct monster *info, s32 flag, bool8 value); extern void ResetDamageData(struct unk_02308FE0 *damage_data); -extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity, u32 param_3); extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); extern const u8 ov29_02352984[]; extern const u8 ov29_02352990[]; diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index d0d38c5d..85c39318 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -20,6 +20,9 @@ #include "overlay_29_0233836C.h" #include "overlay_29_0234B024.h" #include "weather.h" +#include "dungeon_util_2.h" +#include "overlay_29_022EC7E8.h" +#include "overlay_29_023061A8.h" #ifdef JAPAN #define MESSAGE_DE6 0xB26 @@ -49,13 +52,11 @@ extern bool8 ov29_022E34A8_EU(struct entity *entity); #endif extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); -extern s32 IsFloorOver(); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); -extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity, u32 param_3); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern void EndNegativeStatusConditionWrapper(struct entity *user, struct entity *target, bool8 displayMessage, bool8 fromMove); extern void ov29_022EA370(s32 a, s32 b); @@ -70,7 +71,6 @@ extern void PlayEffectAnimationEntityStandard(struct entity *entity, s32 anim_id extern void ov29_022F42F8(struct entity *entity); extern void EndMagnetRiseStatus(struct entity *user, struct entity *target); extern void TickNoSlipCap(struct entity *entity); -extern void EndBurnClassStatus(struct entity *user, struct entity *target); extern void ov29_022EC62C(struct entity *entity); extern void ov29_022FB718(struct entity *entity); extern void TryActivateBadDreams(struct entity *entity); diff --git a/src/overlay_29_0231CBC8.c b/src/overlay_29_0231CBC8.c index a961a270..118439f9 100644 --- a/src/overlay_29_0231CBC8.c +++ b/src/overlay_29_0231CBC8.c @@ -10,6 +10,8 @@ #include "overlay_29_022EAC7C.h" #include "overlay_29_02344AF8.h" #include "overlay_29_0234BA54.h" +#include "dungeon_util_2.h" +#include "overlay_29_02345A3C.h" #ifdef JAPAN #define MESSAGE_BE6 0x925 @@ -35,10 +37,8 @@ extern void ov29_022FB920(bool8 a); #endif extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); -extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity, u32 param_3); extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); extern void EndNegativeStatusConditionWrapper(struct entity *user, struct entity *target, bool8 displayMessage, bool8 fromMove); -extern bool8 SpawnDroppedItemWrapper(struct entity *entity, struct position *pos, struct item *item, u32 a); extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern void BoostIQ(struct entity *entity, s16 iq, bool8 a); extern void UpdateShopkeeperModeAfterAttack(struct entity *attacker, struct entity *defender); diff --git a/src/overlay_29_0232D368.c b/src/overlay_29_0232D368.c index 93fbb945..938f5173 100644 --- a/src/overlay_29_0232D368.c +++ b/src/overlay_29_0232D368.c @@ -1,4 +1,5 @@ #include "overlay_29_0232D368.h" +#include "dungeon_util_2.h" #ifdef JAPAN #define GUARD_SWAP_LOG_MESSAGE 0x2495 @@ -7,7 +8,6 @@ #endif extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); -extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity, u32 param_3); extern void SwapDefensiveStages(struct entity *attacker, struct entity *defender, s32 log_message); extern void SwapDefensiveMultipliers(struct entity *attacker, struct entity *defender, s32 log_message); extern void TryInflictLuckyChantStatus(struct entity *user, struct entity *target); diff --git a/src/overlay_29_02336F4C.c b/src/overlay_29_02336F4C.c new file mode 100644 index 00000000..626d62a5 --- /dev/null +++ b/src/overlay_29_02336F4C.c @@ -0,0 +1,65 @@ +#include "overlay_29_02336F4C.h" +#include "dungeon.h" +#include "overlay_29_02338604.h" + +extern struct dungeon *DUNGEON_PTR[]; +extern const s16 ov29_02352B9C[222]; +extern const s16 ov29_02352D58[222]; +extern u16 *ov29_02336DB0(struct dungeon_generation_info *a, s16 x, s16 y, s16 idx, bool8 can_see_traps, bool8 hallucinating, bool8 bazaar); +extern void sub_02051D8C(s16 x, s16 y, u16 val, s32 a, s32 b); +extern void sub_02051E60(s32, s32); + +void UpdateTrapsVisibility(void) +{ + struct dungeon *dungeon; + u16 *src; + s32 y; + s32 mapx; + s32 mapy; + s32 tx; + s32 ty; + s32 x; + bool8 hallucinating; + bool8 can_see_traps; + bool8 bazaar; + s32 i; + s32 j; + s32 k; + + dungeon = DUNGEON_PTR[0]; + hallucinating = dungeon->display_data.hallucinating; + can_see_traps = dungeon->display_data.can_see_traps; + bazaar = IsSecretBazaar(); + x = dungeon->display_data.camera_pixel_pos.x >> 3; + k = 30 + x; + tx = ov29_02352B9C[k]; + mapx = ov29_02352D58[k]; + for (i = 0; i < 33; i++) { + y = (dungeon->display_data.camera_pixel_pos.y >> 3) - 1; + x &= 0x3F; + ty = ov29_02352B9C[30 + y]; + mapy = ov29_02352D58[30 + y]; + src = ov29_02336DB0(&dungeon->gen_info, mapx, mapy, tx + ty * 3, can_see_traps, + hallucinating, bazaar); + for (j = 0; j < 27; j++) { + y &= 0x1F; + sub_02051D8C(x, y, *src, 1, 0); + src += 3; + y++; + ty++; + if (ty == 3) { + ty = 0; + mapy++; + src = ov29_02336DB0(&dungeon->gen_info, mapx, mapy, tx, can_see_traps, + hallucinating, bazaar); + } + } + x++; + tx++; + if (tx == 3) { + tx = 0; + mapx++; + } + } + sub_02051E60(1, 0); +} diff --git a/src/overlay_29_0233E43C.c b/src/overlay_29_0233E43C.c index 87b0c2e4..a1fa5961 100644 --- a/src/overlay_29_0233E43C.c +++ b/src/overlay_29_0233E43C.c @@ -1,7 +1,12 @@ #include "overlay_29_0233E43C.h" #include "overlay_29_0233C9E8.h" #include "dg_random.h" +#include "dungeon.h" #include "dungeon_map_access.h" +#include "dungeon_util.h" +#include "dungeon_util_static.h" + +extern const bool8 CORNER_CARDINAL_NEIGHBOR_IS_OPEN[4][NUM_DIRECTIONS]; void CreateGridCellConnections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, s32 grid_size_y, s32 *arg4, s32 *arg5, bool8 arg6) { @@ -281,3 +286,292 @@ void CreateGridCellConnections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, } + +void GenerateRoomImperfections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, s32 grid_size_y) +{ + s32 x; + s32 y; + s32 counter; + s32 move_x; + s32 move_y; + s32 length; + s32 i; + s32 v; + s32 corner; + s32 dir; + s32 next_x; + s32 next_y; + s32 off_x; + s32 off_y; + s32 found; + const struct tile *tile; + bool8 is_open; + s32 pt_y; + s32 pt_x; + + for (x = 0; x < grid_size_x; x++) { + for (y = 0; y < grid_size_y; y++) { + if (grid[x][y].field_0x8 != 0 || grid[x][y].field_0x11[0] != 0 + || grid[x][y].field_0x11[1] != 0) { + continue; + } + if (grid[x][y].field_0xb == 0 || grid[x][y].field_0xa == 0) { + continue; + } + if (grid[x][y].field_0x9 != 0 || grid[x][y].field_0x10 != 0) { + continue; + } + if (grid[x][y].field_0x11[0xb] == 0) { + continue; + } + if (DungeonRandInt(100) < 60) { + continue; + } + + length = (grid[x][y].field_0x4 - grid[x][y].field_0x0) + + (grid[x][y].field_0x6 - grid[x][y].field_0x2); + length /= 4; + if (length == 0) { + length = 1; + } + + for (counter = 0; counter < length; counter++) { + for (i = 0; i < 2; i++) { + corner = DungeonRandInt(4); + + switch (corner) { + case 0: + default: + pt_x = grid[x][y].field_0x0; + pt_y = grid[x][y].field_0x2; + if (i != 0) { + move_x = 1; + move_y = 0; + } else { + move_x = 0; + move_y = 1; + } + break; + case 1: + pt_x = grid[x][y].field_0x4 - 1; + pt_y = grid[x][y].field_0x2; + if (i != 0) { + move_x = 0; + move_y = 1; + } else { + move_x = -1; + move_y = 0; + } + break; + case 2: + pt_x = grid[x][y].field_0x4 - 1; + pt_y = grid[x][y].field_0x6 - 1; + if (i != 0) { + move_x = -1; + move_y = 0; + } else { + move_x = 0; + move_y = -1; + } + break; + case 3: + pt_x = grid[x][y].field_0x0; + pt_y = grid[x][y].field_0x6 - 1; + if (i != 0) { + move_x = 0; + move_y = -1; + } else { + move_x = 1; + move_y = 0; + } + break; + } + + for (v = 0; v < 10; v++) { + if (pt_x < grid[x][y].field_0x0 || pt_x >= grid[x][y].field_0x4) { + break; + } + if (pt_y < grid[x][y].field_0x2 || pt_y >= grid[x][y].field_0x6) { + break; + } + + if (GetTerrainType(GetTile(pt_x, pt_y)) == TERRAIN_TYPE_NORMAL) { + dir = 0; + while (dir < NUM_DIRECTIONS) { + next_x = pt_x + DIRECTIONS_XY[dir].x; + next_y = pt_y + DIRECTIONS_XY[dir].y; + found = FALSE; + + for (off_y = -1; off_y <= 1; off_y++) { + for (off_x = -1; off_x <= 1; off_x++) { + tile = GetTile(next_x + off_x, next_y + off_y); + + if (GetTerrainType(tile) != TERRAIN_TYPE_NORMAL) { + continue; + } + if (tile->room == CORRIDOR_ROOM) { + found = TRUE; + } + if (found) { + break; + } + } + if (found) { + break; + } + } + if (found) { + break; + } + dir++; + } + + if (dir == NUM_DIRECTIONS) { + dir = 0; + while (dir < NUM_DIRECTIONS) { + next_x = DIRECTIONS_XY[dir].x; + next_y = DIRECTIONS_XY[dir].y; + is_open = (GetTerrainType(GetTile(pt_x + next_x, pt_y + next_y)) + == TERRAIN_TYPE_NORMAL); + + if (CORNER_CARDINAL_NEIGHBOR_IS_OPEN[corner][dir] != is_open) { + break; + } + dir += 2; + } + if (dir == NUM_DIRECTIONS) { + GetTileSafe(pt_x, pt_y)->terrain_flags &= + ~(TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + } + } + break; + } else { + pt_x += move_x; + pt_y += move_y; + } + } + } + } + } + } +} + +void CreateHallway(s32 x, s32 y, s32 end_x, s32 end_y, bool8 vertical, s32 turn_x, s32 turn_y) +{ + s32 start_x = x; + s32 start_y = y; + s32 i; + struct tile *t; + + if (vertical) { + i = 0; + while (y != turn_y) { + if (i++ >= DUNGEON_MAX_SIZE_X) { + return; + } + if (GetTerrainType(GetTile(x, y)) != TERRAIN_TYPE_NORMAL) { + t = GetTileSafe(x, y); + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + } else if (x != start_x || y != start_y) { + return; + } + if (y < turn_y) { + y++; + } else { + y--; + } + } + i = 0; + while (x != end_x) { + if (i++ >= DUNGEON_MAX_SIZE_X) { + return; + } + if (GetTerrainType(GetTile(x, y)) != TERRAIN_TYPE_NORMAL) { + t = GetTileSafe(x, y); + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + } else if (x != start_x || y != start_y) { + return; + } + if (x < end_x) { + x++; + } else { + x--; + } + } + i = 0; + while (y != end_y) { + if (i++ >= DUNGEON_MAX_SIZE_X) { + return; + } + if (GetTerrainType(GetTile(x, y)) != TERRAIN_TYPE_NORMAL) { + t = GetTileSafe(x, y); + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + } else if (x != start_x || y != start_y) { + return; + } + if (y < end_y) { + y++; + } else { + y--; + } + } + } else { + i = 0; + while (x != turn_x) { + if (i++ >= DUNGEON_MAX_SIZE_X) { + return; + } + if (GetTerrainType(GetTile(x, y)) != TERRAIN_TYPE_NORMAL) { + t = GetTileSafe(x, y); + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + } else if (x != start_x || y != start_y) { + return; + } + if (x < turn_x) { + x++; + } else { + x--; + } + } + i = 0; + while (y != end_y) { + if (i++ >= DUNGEON_MAX_SIZE_X) { + return; + } + if (GetTerrainType(GetTile(x, y)) != TERRAIN_TYPE_NORMAL) { + t = GetTileSafe(x, y); + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + } else if (x != start_x || y != start_y) { + return; + } + if (y < end_y) { + y++; + } else { + y--; + } + } + i = 0; + while (x != end_x) { + if (i++ >= DUNGEON_MAX_SIZE_X) { + return; + } + if (GetTerrainType(GetTile(x, y)) != TERRAIN_TYPE_NORMAL) { + t = GetTileSafe(x, y); + t->terrain_flags &= ~3; + t->terrain_flags |= 1; + } else if (x != start_x || y != start_y) { + return; + } + if (x < end_x) { + x++; + } else { + x--; + } + } + } +} diff --git a/src/overlay_29_02345A3C.c b/src/overlay_29_02345A3C.c new file mode 100644 index 00000000..927c2540 --- /dev/null +++ b/src/overlay_29_02345A3C.c @@ -0,0 +1,20 @@ +#include "overlay_29_02345A3C.h" +#include "dg_object.h" + +extern bool8 SpawnDroppedItem(struct entity *entity, struct entity *item_entity, struct item *item, bool8 param_4, struct position *dir_xy, u32 param_6); + +bool8 SpawnDroppedItemWrapper(struct entity *entity, struct position *pos, struct item *item, u32 param_4) +{ + struct entity item_entity; + + item_entity.type = ENTITY_ITEM; + item_entity.field_0x24 = 0; + item_entity.is_visible = TRUE; + item_entity.transparent = 0; + item_entity.info = item; + item_entity.pos = *pos; + + SetEntityPixelPosXY(&item_entity, (pos->x * 24 + 4) << 8, (pos->y * 24 + 4) << 8); + item_entity.spawn_genid = 0; + return SpawnDroppedItem(entity, &item_entity, item, TRUE, NULL, param_4); +} diff --git a/src/overlay_31_02382820.c b/src/overlay_31_02382820.c index 57ae4806..b13811da 100644 --- a/src/overlay_31_02382820.c +++ b/src/overlay_31_02382820.c @@ -8,6 +8,7 @@ #include "main_02001188.h" #include "window.h" #include "main_02027AF0.h" +#include "dungeon_util_2.h" extern struct dungeon *DUNGEON_PTR[]; @@ -31,8 +32,6 @@ extern void* MemAlloc(u32 size, u32 nmemb); extern u32 GetMoneyCarried(void); extern u32 sub_0204F9E0(void); -extern void GetMonsterOrTrapName(u8*, void*, u32); // The third argument isn't actually used in the - // function (../asm/overlay_29_022E1A40.s#L1378) extern u8* StringFromId(u32); extern void PreprocessString(u8* dst, u32 dsize, const u8* src, u32 flags, struct PPStrValues* ptr); extern void DrawTextInWindow(s32, u32, u32, u8*); diff --git a/src/status_checks.c b/src/status_checks.c index c2bb54a1..5fb496e2 100644 --- a/src/status_checks.c +++ b/src/status_checks.c @@ -5,6 +5,7 @@ #include "dungeon_capabilities_3.h" #include "dungeon_statuses.h" #include "dungeon_util_static.h" +#include "dungeon_util_2.h" #ifdef JAPAN #define HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET -0x2C1 @@ -19,7 +20,6 @@ #define INFATUATED_MESSAGE (0xC2C + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) #define BIDE_MESSAGE (0xC2D + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) -extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity, u32 param_3); extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); bool8 HasStatusThatPreventsActing(struct entity *monster) From 7e1755ddf8cf489497599be94cbb39f745976be6 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 13 Sep 2026 00:32:46 -0700 Subject: [PATCH 18/34] Decompile 11 more callees; give them headers and drop 40 call-site declarations Each function was verified at score 0 against its NORTH_AMERICA, EUROPE and JAPAN targets before landing, with the address walk closing exactly in each region, and by a matching US build after. main_020517D4.c GetRankUpEntry main_02001188.c MemAlloc main_0203088C.c CloseAdvancedTextBox main_020114F8.c ApplyGummiBoostsToGroundMonster main_0205283C.c GetExp overlay_29_02305C04.c EndNegativeStatusConditionWrapper overlay_29_02338350.c NearbyAllyIqSkillIsEnabled overlay_29_022E9FC0.c AdvanceFrame overlay_29_022E99F0.c TickStatusTurnCounter overlay_29_0234B4BC.c LogMessageByIdWithPopup overlay_29_0234B340.c LogMessageByIdWithPopupCheckUserTarget All eleven sat at the head or tail of their .s, so every one merges into the adjacent source file and no assembly file is split. Forty call-site declarations of these functions are replaced by an include of the owning header. Two of them disagreed with the real signature, and one had to be fixed for the tree to compile at all: MemAlloc was declared six different ways. src/overlay_24_end.c spelled it `void* MemAlloc(s32, s32);` -- signed -- and that file already includes main_02001188.h, so the contradiction became a hard compile error the moment MemAlloc had a header to contradict. It had been harmless only because the function had none. AdvanceFrame was declared `void AdvanceFrame(u8);` in two overlay_31 files against the real u32. Byte-neutral in practice, since every call site passes the literal 0x62, but wrong. struct unk_020517F4 was defined file-locally in src/main_0203D538.c. It now has one definition, in include/main_020517D4.h, and both local copies are gone -- otherwise including that header where GetRankUpEntry is called would collide. Two generated headers are made self-contained. extract_function.py emits a header that names types it does not include, and since the .c includes it first, the prototype builds its own scoped tag: include/main_020114F8.h declaring `struct ground_monster *` before common.h defines it made the definition read as a redeclaration with a different type. Authored by Claude (Opus 5) under human direction. Confirmed by a matching build: build/pmdsky.us/pmdsky.us.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_02000DE0.inc | 9 ++--- .../{main_02011528.inc => main_02011554.inc} | 2 +- .../{main_020308A0.inc => main_020308C4.inc} | 2 - .../{main_020517F4.inc => main_02051804.inc} | 7 ++-- ...9_022E9A44.inc => overlay_29_022E9A6C.inc} | 0 ...9_022E9FE0.inc => overlay_29_022EA008.inc} | 12 +++--- ...9_02305C28.inc => overlay_29_02305C3C.inc} | 0 ...9_0234B350.inc => overlay_29_0234B3A4.inc} | 2 +- asm/main_02000DE0.s | 11 ----- asm/{main_02011528.s => main_02011554.s} | 17 +------- asm/{main_020308A0.s => main_020308C4.s} | 15 +------ asm/{main_020517F4.s => main_02051804.s} | 11 +---- ...ay_29_022E9A44.s => overlay_29_022E9A6C.s} | 16 +------- ...ay_29_022E9FE0.s => overlay_29_022EA008.s} | 18 +-------- ...ay_29_02305C28.s => overlay_29_02305C3C.s} | 11 +---- asm/overlay_29_02337EC0.s | 12 ------ ...ay_29_0234B350.s => overlay_29_0234B3A4.s} | 40 +------------------ include/main_02001188.h | 1 + include/main_020114F8.h | 3 ++ include/main_0203088C.h | 1 + include/main_020517D4.h | 8 ++++ include/overlay_29_022E99F0.h | 1 + include/overlay_29_022E9FC0.h | 1 + include/overlay_29_02305C04.h | 1 + include/overlay_29_02338350.h | 1 + include/overlay_29_0234B340.h | 1 + include/overlay_29_0234B4BC.h | 1 + main.lsf | 14 +++---- src/directory_file.c | 2 +- src/directory_file_mngr.c | 2 +- src/dungeon_projectile_throw.c | 4 +- src/ground_bg.c | 1 - src/main_02001188.c | 7 ++++ src/main_020114F8.c | 9 +++++ src/main_0203088C.c | 9 +++++ src/main_0203D538.c | 9 +---- src/main_02042B84.c | 1 - src/main_020517D4.c | 7 ++++ src/main_02051FF0.c | 2 +- src/main_0205D11C.c | 1 - src/move_orb_effects.c | 2 +- src/overlay_10_022BFD58.c | 2 +- src/overlay_11_02307334.c | 4 +- src/overlay_13_EntryOverlay13.c | 1 - src/overlay_15_0238A140.c | 2 +- src/overlay_24_end.c | 1 - src/overlay_25_init.c | 2 +- src/overlay_29_022DEAB0.c | 2 +- src/overlay_29_022E99F0.c | 12 ++++++ src/overlay_29_022E9FC0.c | 13 ++++++ src/overlay_29_022F0EDC.c | 2 +- src/overlay_29_02305C04.c | 7 ++++ src/overlay_29_023061A8.c | 2 +- src/overlay_29_02308FBC.c | 8 ++-- src/overlay_29_0230BBAC.c | 4 +- src/overlay_29_02311010.c | 4 +- src/overlay_29_0231CBC8.c | 4 +- src/overlay_29_02326188.c | 2 +- src/overlay_29_02329664.c | 2 +- src/overlay_29_0232A480.c | 2 +- src/overlay_29_0232CE40.c | 2 +- src/overlay_29_0232D368.c | 2 +- src/overlay_29_02338350.c | 7 ++++ src/overlay_29_0234B340.c | 15 +++++++ src/overlay_29_0234B4BC.c | 6 +++ src/overlay_29_0234BA54.c | 2 +- src/overlay_31_02382820.c | 3 +- src/overlay_31_02383880.c | 2 +- src/type_effectiveness.c | 2 +- 69 files changed, 174 insertions(+), 217 deletions(-) rename asm/include/{main_02011528.inc => main_02011554.inc} (100%) rename asm/include/{main_020308A0.inc => main_020308C4.inc} (79%) rename asm/include/{main_020517F4.inc => main_02051804.inc} (95%) rename asm/include/{overlay_29_022E9A44.inc => overlay_29_022E9A6C.inc} (100%) rename asm/include/{overlay_29_022E9FE0.inc => overlay_29_022EA008.inc} (100%) rename asm/include/{overlay_29_02305C28.inc => overlay_29_02305C3C.inc} (100%) rename asm/include/{overlay_29_0234B350.inc => overlay_29_0234B3A4.inc} (100%) rename asm/{main_02011528.s => main_02011554.s} (93%) rename asm/{main_020308A0.s => main_020308C4.s} (88%) rename asm/{main_020517F4.s => main_02051804.s} (98%) rename asm/{overlay_29_022E9A44.s => overlay_29_022E9A6C.s} (96%) rename asm/{overlay_29_022E9FE0.s => overlay_29_022EA008.s} (97%) rename asm/{overlay_29_02305C28.s => overlay_29_02305C3C.s} (96%) rename asm/{overlay_29_0234B350.s => overlay_29_0234B3A4.s} (65%) diff --git a/asm/include/main_02000DE0.inc b/asm/include/main_02000DE0.inc index d695cb95..ad918cfa 100644 --- a/asm/include/main_02000DE0.inc +++ b/asm/include/main_02000DE0.inc @@ -1,4 +1,8 @@ #pragma once +.public DEFAULT_MEMORY_ARENA_MEMORY +.public Debug_FatalError +.public Debug_Print0 +.public MEMORY_ALLOCATION_ARENA_GETTERS .public _02090B40 .public _02090B70 .public _02090BA0 @@ -7,11 +11,6 @@ .public _020B3384 .public _020B33A0 .public _020B33C0 -.public Debug_FatalError -.public Debug_Print0 -.public DEFAULT_MEMORY_ARENA_MEMORY -.public MemLocateSet -.public MEMORY_ALLOCATION_ARENA_GETTERS .public sub_02002C40 .public sub_02002CAC .public sub_02002CB4 diff --git a/asm/include/main_02011528.inc b/asm/include/main_02011554.inc similarity index 100% rename from asm/include/main_02011528.inc rename to asm/include/main_02011554.inc index bc33df29..390cce2b 100644 --- a/asm/include/main_02011528.inc +++ b/asm/include/main_02011554.inc @@ -1,9 +1,9 @@ #pragma once .public ApplyGummiBoostsGroundMode .public CALCIUM_STAT_BOOST +.public GINSENG_CHANCE_3 .public GetMoveBasePowerGround .public GetMoveMaxGinsengBoostGround -.public GINSENG_CHANCE_3 .public IRON_STAT_BOOST .public LIFE_SEED_HP_BOOST .public ModifyDefensiveStat diff --git a/asm/include/main_020308A0.inc b/asm/include/main_020308C4.inc similarity index 79% rename from asm/include/main_020308A0.inc rename to asm/include/main_020308C4.inc index 3c7c1302..a322e73c 100644 --- a/asm/include/main_020308A0.inc +++ b/asm/include/main_020308C4.inc @@ -1,8 +1,6 @@ #pragma once -.public DeleteWindow .public GetSelectedItemOnPage .public GetSelectedMenuItemIdx .public GetWindowContents -.public MemFree .public sub_020289B8 .public sub_02028A08 diff --git a/asm/include/main_020517F4.inc b/asm/include/main_02051804.inc similarity index 95% rename from asm/include/main_020517F4.inc rename to asm/include/main_02051804.inc index 99c325f2..21dcdd81 100644 --- a/asm/include/main_020517F4.inc +++ b/asm/include/main_02051804.inc @@ -1,13 +1,12 @@ #pragma once -.public _020B09B0 .public CopyColorToPaletteDataRgba +.public MTi_CpuClear32 +.public MTi_CpuCopy32 .public MarkPaletteDataAsNeedingUpdate .public MemAlloc .public MemFree .public MemZero -.public MTi_CpuClear32 -.public MTi_CpuCopy32 -.public RANK_UP_TABLE +.public _020B09B0 .public sub_0200302C .public sub_020030FC .public sub_0200A124 diff --git a/asm/include/overlay_29_022E9A44.inc b/asm/include/overlay_29_022E9A6C.inc similarity index 100% rename from asm/include/overlay_29_022E9A44.inc rename to asm/include/overlay_29_022E9A6C.inc diff --git a/asm/include/overlay_29_022E9FE0.inc b/asm/include/overlay_29_022EA008.inc similarity index 100% rename from asm/include/overlay_29_022E9FE0.inc rename to asm/include/overlay_29_022EA008.inc index 1863674a..56fb91ea 100644 --- a/asm/include/overlay_29_022E9FE0.inc +++ b/asm/include/overlay_29_022EA008.inc @@ -1,11 +1,10 @@ #pragma once -.public _s32_div_f .public ChangeSimpleObjTexture -.public DisplayMonstersAndItems -.public DisplayUi .public DUNGEON_BUTTON_INPUT .public DUNGEON_FRAMES_PASSED .public DUNGEON_PTR +.public DisplayMonstersAndItems +.public DisplayUi .public FlashLeaderIcon .public GetAlertBoxLoadingStatus .public GetBottomScreenOption @@ -14,6 +13,10 @@ .public HandleTopScreenFades .public InitWeirdMinimapMatrix .public OBJ_GRAPHICS_CONTROLS_PTR +.public RenderWeather3D +.public UpdateCamera +.public UpdateMinimap +.public _s32_div_f .public ov29_022DD8B4 .public ov29_022DDEF8 .public ov29_022DE11C @@ -30,7 +33,4 @@ .public ov29_0234B854 .public ov29_02353540 .public ov29_02353560 -.public RenderWeather3D .public sub_02051E20 -.public UpdateCamera -.public UpdateMinimap diff --git a/asm/include/overlay_29_02305C28.inc b/asm/include/overlay_29_02305C3C.inc similarity index 100% rename from asm/include/overlay_29_02305C28.inc rename to asm/include/overlay_29_02305C3C.inc diff --git a/asm/include/overlay_29_0234B350.inc b/asm/include/overlay_29_0234B3A4.inc similarity index 100% rename from asm/include/overlay_29_0234B350.inc rename to asm/include/overlay_29_0234B3A4.inc index 5eec7f07..c84645b1 100644 --- a/asm/include/overlay_29_0234B350.inc +++ b/asm/include/overlay_29_0234B3A4.inc @@ -1,5 +1,5 @@ #pragma once .public LogMessage -.public ov29_022E2CA0 .public ShouldDisplayEntityWrapper .public StringFromId +.public ov29_022E2CA0 diff --git a/asm/main_02000DE0.s b/asm/main_02000DE0.s index 6c525705..26a093c2 100644 --- a/asm/main_02000DE0.s +++ b/asm/main_02000DE0.s @@ -283,14 +283,3 @@ _02001148: _02001168: .word _02090B40 _0200116C: .word _02090BA0 arm_func_end SplitMemBlock - - arm_func_start MemAlloc -MemAlloc: ; 0x02001170 - ldr ip, _02001184 ; =MemLocateSet - mov r2, r1 - mov r1, r0 - mov r0, #0 - bx ip - .align 2, 0 -_02001184: .word MemLocateSet - arm_func_end MemAlloc diff --git a/asm/main_02011528.s b/asm/main_02011554.s similarity index 93% rename from asm/main_02011528.s rename to asm/main_02011554.s index 10af6256..12b4a031 100644 --- a/asm/main_02011528.s +++ b/asm/main_02011554.s @@ -1,23 +1,8 @@ .include "asm/macros.inc" - .include "main_02011528.inc" + .include "main_02011554.inc" .text - arm_func_start ApplyGummiBoostsToGroundMonster -ApplyGummiBoostsToGroundMonster: ; 0x02011528 - stmdb sp!, {lr} - sub sp, sp, #0xc - mov ip, r0 - stmia sp, {r1, r2, r3} - add r0, ip, #4 - add r1, ip, #8 - add r2, ip, #0xc - add r3, ip, #0xe - bl ApplyGummiBoostsGroundMode - add sp, sp, #0xc - ldmia sp!, {pc} - arm_func_end ApplyGummiBoostsToGroundMonster - arm_func_start ApplyGummiBoostsToTeamMember ApplyGummiBoostsToTeamMember: ; 0x02011554 stmdb sp!, {lr} diff --git a/asm/main_020308A0.s b/asm/main_020308C4.s similarity index 88% rename from asm/main_020308A0.s rename to asm/main_020308C4.s index 885dfa3d..d52d5fec 100644 --- a/asm/main_020308A0.s +++ b/asm/main_020308C4.s @@ -1,21 +1,8 @@ .include "asm/macros.inc" - .include "main_020308A0.inc" + .include "main_020308C4.inc" .text - arm_func_start CloseAdvancedTextBox -CloseAdvancedTextBox: ; 0x020308A0 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - bl GetWindowContents - mov r4, r0 - mov r0, r5 - bl DeleteWindow - mov r0, r4 - bl MemFree - ldmia sp!, {r3, r4, r5, pc} - arm_func_end CloseAdvancedTextBox - arm_func_start IsAdvancedTextBoxActive IsAdvancedTextBoxActive: ; 0x020308C4 stmdb sp!, {r3, lr} diff --git a/asm/main_020517F4.s b/asm/main_02051804.s similarity index 98% rename from asm/main_020517F4.s rename to asm/main_02051804.s index fa7174b3..e4f917aa 100644 --- a/asm/main_020517F4.s +++ b/asm/main_02051804.s @@ -1,17 +1,8 @@ .include "asm/macros.inc" - .include "main_020517F4.inc" + .include "main_02051804.inc" .text - arm_func_start GetRankUpEntry -GetRankUpEntry: ; 0x020517F4 - ldr r1, _02051800 ; =RANK_UP_TABLE - add r0, r1, r0, lsl #4 - bx lr - .align 2, 0 -_02051800: .word RANK_UP_TABLE - arm_func_end GetRankUpEntry - arm_func_start sub_02051804 sub_02051804: ; 0x02051804 stmdb sp!, {r4, lr} diff --git a/asm/overlay_29_022E9A44.s b/asm/overlay_29_022E9A6C.s similarity index 96% rename from asm/overlay_29_022E9A44.s rename to asm/overlay_29_022E9A6C.s index 484993b9..307ef31c 100644 --- a/asm/overlay_29_022E9A44.s +++ b/asm/overlay_29_022E9A6C.s @@ -1,22 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_022E9A44.inc" + .include "overlay_29_022E9A6C.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] diff --git a/asm/overlay_29_022E9FE0.s b/asm/overlay_29_022EA008.s similarity index 97% rename from asm/overlay_29_022E9FE0.s rename to asm/overlay_29_022EA008.s index 3745e9f3..c73338d0 100644 --- a/asm/overlay_29_022E9FE0.s +++ b/asm/overlay_29_022EA008.s @@ -1,24 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_022E9FE0.inc" + .include "overlay_29_022EA008.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 diff --git a/asm/overlay_29_02305C28.s b/asm/overlay_29_02305C3C.s similarity index 96% rename from asm/overlay_29_02305C28.s rename to asm/overlay_29_02305C3C.s index 823fd7a3..06cc054e 100644 --- a/asm/overlay_29_02305C28.s +++ b/asm/overlay_29_02305C3C.s @@ -1,17 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_02305C28.inc" + .include "overlay_29_02305C3C.inc" .text - arm_func_start EndNegativeStatusConditionWrapper -EndNegativeStatusConditionWrapper: ; 0x02305C28 - stmdb sp!, {r3, lr} - mov ip, #0 - str ip, [sp] - bl EndNegativeStatusCondition - ldmia sp!, {r3, pc} - arm_func_end EndNegativeStatusConditionWrapper - arm_func_start TransferNegativeStatusCondition TransferNegativeStatusCondition: ; 0x02305C3C #ifdef JAPAN diff --git a/asm/overlay_29_02337EC0.s b/asm/overlay_29_02337EC0.s index fe58b540..524fee28 100644 --- a/asm/overlay_29_02337EC0.s +++ b/asm/overlay_29_02337EC0.s @@ -301,15 +301,3 @@ _02338274: .align 2, 0 _02338284: .word DIRECTIONS_XY arm_func_end ov29_023381C0 - - arm_func_start NearbyAllyIqSkillIsEnabled -NearbyAllyIqSkillIsEnabled: ; 0x02338288 - stmdb sp!, {r3, lr} - mov r2, #0 - bl ov29_023381C0 - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - arm_func_end NearbyAllyIqSkillIsEnabled diff --git a/asm/overlay_29_0234B350.s b/asm/overlay_29_0234B3A4.s similarity index 65% rename from asm/overlay_29_0234B350.s rename to asm/overlay_29_0234B3A4.s index 009685be..047e1293 100644 --- a/asm/overlay_29_0234B350.s +++ b/asm/overlay_29_0234B3A4.s @@ -1,33 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_0234B350.inc" + .include "overlay_29_0234B3A4.inc" .text - arm_func_start LogMessageByIdWithPopupCheckUserTarget -LogMessageByIdWithPopupCheckUserTarget: ; 0x0234B350 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r6, r1 - mov r4, #0 - mov r7, r0 - mov r5, r2 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - movne r4, #1 - mov r0, r6 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - movne r4, #1 - cmp r4, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r5 - bl StringFromId - mov r1, r0 - mov r0, r7 - mov r2, #1 - bl LogMessage - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end LogMessageByIdWithPopupCheckUserTarget - arm_func_start LogMessageWithPopupCheckUserTarget LogMessageWithPopupCheckUserTarget: ; 0x0234B3A4 stmdb sp!, {r3, r4, r5, r6, r7, lr} @@ -100,16 +75,3 @@ LogMessageByIdWithPopupCheckUserUnknown: ; 0x0234B444 bl LogMessage ldmia sp!, {r3, r4, r5, r6, r7, pc} arm_func_end LogMessageByIdWithPopupCheckUserUnknown - - arm_func_start LogMessageByIdWithPopup -LogMessageByIdWithPopup: ; 0x0234B498 - stmdb sp!, {r4, lr} - mov r4, r0 - mov r0, r1 - bl StringFromId - mov r1, r0 - mov r0, r4 - mov r2, #1 - bl LogMessage - ldmia sp!, {r4, pc} - arm_func_end LogMessageByIdWithPopup diff --git a/include/main_02001188.h b/include/main_02001188.h index a8a31104..653baa7a 100644 --- a/include/main_02001188.h +++ b/include/main_02001188.h @@ -1,6 +1,7 @@ #ifndef PMDSKY_MAIN_02001188_H #define PMDSKY_MAIN_02001188_H +void* MemAlloc(u32 len, u32 flags); // Unclear if these structs match, since they haven't been used other than in extern prototypes. Hopefully they do, though. struct mem_block { u32 content_flags; // Bit 0: in_use. Bit 1: object. Bit 2: arena. Bits 3-31: Unused? diff --git a/include/main_020114F8.h b/include/main_020114F8.h index d18a3385..c7113562 100644 --- a/include/main_020114F8.h +++ b/include/main_020114F8.h @@ -1,6 +1,9 @@ #ifndef PMDSKY_MAIN_020114F8_H #define PMDSKY_MAIN_020114F8_H +#include "common.h" + void SwapShopFreeDoublePointer(void** p); +void ApplyGummiBoostsToGroundMonster(struct ground_monster *monster, s16 item_id, int a3, void *a4); #endif diff --git a/include/main_0203088C.h b/include/main_0203088C.h index 3bcb3294..8a3fd671 100644 --- a/include/main_0203088C.h +++ b/include/main_0203088C.h @@ -2,5 +2,6 @@ #define PMDSKY_MAIN_0203088C_H void SetAdvancedTextBoxState5(s32 window_id); +void CloseAdvancedTextBox(s32 window_id); #endif diff --git a/include/main_020517D4.h b/include/main_020517D4.h index 95cb9969..8a2c33d2 100644 --- a/include/main_020517D4.h +++ b/include/main_020517D4.h @@ -4,5 +4,13 @@ // Returns the player's bag capacity for a given point in the game. u32 GetBagCapacity(s32 scenario_balance); u32 GetBagCapacitySpecialEpisode(s32 se_type); +struct unk_020517F4 { + u8 field_0x0[8]; + s32 field_0x8; + s16 field_0xc; + u8 field_0xe[2]; +}; + +struct unk_020517F4* GetRankUpEntry(s32 rank); #endif //PMDSKY_MAIN_020517D4_H diff --git a/include/overlay_29_022E99F0.h b/include/overlay_29_022E99F0.h index 2589a19a..c7c5c60f 100644 --- a/include/overlay_29_022E99F0.h +++ b/include/overlay_29_022E99F0.h @@ -6,5 +6,6 @@ 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); +u8 TickStatusTurnCounter(u8 *counter); #endif diff --git a/include/overlay_29_022E9FC0.h b/include/overlay_29_022E9FC0.h index 57171a5f..86d4fb99 100644 --- a/include/overlay_29_022E9FC0.h +++ b/include/overlay_29_022E9FC0.h @@ -3,5 +3,6 @@ u8 ov29_022E9FC0(void); void ov29_022E9FD0(u8 value); +void AdvanceFrame(u32 param_1); #endif diff --git a/include/overlay_29_02305C04.h b/include/overlay_29_02305C04.h index ba403710..0d0b4f53 100644 --- a/include/overlay_29_02305C04.h +++ b/include/overlay_29_02305C04.h @@ -5,5 +5,6 @@ // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__02305C04(struct entity *entity); +void EndNegativeStatusConditionWrapper(struct entity *user, struct entity *target, bool8 displayMessage, bool8 fromMove); #endif //PMDSKY_OVERLAY_29_02305C04_H diff --git a/include/overlay_29_02338350.h b/include/overlay_29_02338350.h index 0ce94e2c..c99f46c6 100644 --- a/include/overlay_29_02338350.h +++ b/include/overlay_29_02338350.h @@ -3,6 +3,7 @@ #include "dungeon_mode.h" +bool8 NearbyAllyIqSkillIsEnabled(struct entity *entity, enum iq_skill_id iq_skill); struct entity* FindAdjacentEnemy(struct entity *monster); bool8 IsAdjacentToEnemyIgnoreTreatment(struct entity *monster); diff --git a/include/overlay_29_0234B340.h b/include/overlay_29_0234B340.h index 2f1e8df5..44db9db5 100644 --- a/include/overlay_29_0234B340.h +++ b/include/overlay_29_0234B340.h @@ -6,5 +6,6 @@ #include "move.h" void LogMessageQuiet(struct entity *user, const char *message); +void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); #endif diff --git a/include/overlay_29_0234B4BC.h b/include/overlay_29_0234B4BC.h index ff5c76f7..f5e0c2e4 100644 --- a/include/overlay_29_0234B4BC.h +++ b/include/overlay_29_0234B4BC.h @@ -5,6 +5,7 @@ #include "item.h" #include "move.h" +void LogMessageByIdWithPopup(struct entity *user, s32 message_id); void LogMessageWithPopup(struct entity *user, const char *message); #endif diff --git a/main.lsf b/main.lsf index 2da6b02e..f036ca29 100644 --- a/main.lsf +++ b/main.lsf @@ -95,7 +95,7 @@ Static main Object src/exclusive_item.o Object asm/main_02010FC4.o Object src/main_020114F8.o - Object asm/main_02011528.o + Object asm/main_02011554.o Object src/main_02011830.o Object asm/main_02011850.o Object src/main_02011DF0.o @@ -188,7 +188,7 @@ Static main Object src/main_020307A4.o Object src/main_0203083C.o Object src/main_0203088C.o - Object asm/main_020308A0.o + Object asm/main_020308C4.o Object src/main_02030A18.o Object src/main_02030A40.o Object asm/main_02030A90.o @@ -282,7 +282,7 @@ Static main Object src/iq_skills.o Object asm/main_rodata_020A20B1.o Object src/main_020517D4.o - Object asm/main_020517F4.o + Object asm/main_02051804.o Object src/main_02051FF0.o Object asm/main_02052060.o Object src/main_020526EC.o @@ -841,9 +841,9 @@ Overlay OVY_29 Object src/dg_uty.o Object asm/overlay_29_022E9628.o Object src/overlay_29_022E99F0.o - Object asm/overlay_29_022E9A44.o + Object asm/overlay_29_022E9A6C.o Object src/overlay_29_022E9FC0.o - Object asm/overlay_29_022E9FE0.o + Object asm/overlay_29_022EA008.o Object src/overlay_29_022EA968.o Object src/overlay_29_022EA9CC.o Object src/dg_random.o @@ -968,7 +968,7 @@ Overlay OVY_29 Object src/overlay_29_0230558C.o Object asm/overlay_29_023055B0.o Object src/overlay_29_02305C04.o - Object asm/overlay_29_02305C28.o + Object asm/overlay_29_02305C3C.o Object src/overlay_29_023061A8.o Object asm/overlay_29_02306258.o Object src/overlay_29_02306728.o @@ -1282,7 +1282,7 @@ Overlay OVY_29 Object src/overlay_29_0234B104.o Object asm/overlay_29_0234B130.o Object src/overlay_29_0234B340.o - Object asm/overlay_29_0234B350.o + Object asm/overlay_29_0234B3A4.o Object src/overlay_29_0234B4BC.o Object asm/overlay_29_0234B4CC.o Object src/overlay_29_0234BA54.o diff --git a/src/directory_file.c b/src/directory_file.c index 9088da44..c5cd0651 100644 --- a/src/directory_file.c +++ b/src/directory_file.c @@ -4,8 +4,8 @@ extern const struct unk_02094C18 _02094C18; #include "file_rom.h" #include "debug.h" +#include "main_02001188.h" -extern void* MemAlloc(u32 len, u32 flags); extern char STRING_FILE_DIRECTORY_INIT; diff --git a/src/directory_file_mngr.c b/src/directory_file_mngr.c index 0265e9f9..95f59ef1 100644 --- a/src/directory_file_mngr.c +++ b/src/directory_file_mngr.c @@ -1,7 +1,7 @@ #include "directory_file_mngr.h" #include "directory_file.h" +#include "main_02001188.h" -extern void* MemAlloc(u32 len, u32 flags); extern void MemZero(void* ptr, u32 len); extern struct directory *DIRECTORY_FILES_EXTRACTED; diff --git a/src/dungeon_projectile_throw.c b/src/dungeon_projectile_throw.c index 058b1cea..5a2d5544 100644 --- a/src/dungeon_projectile_throw.c +++ b/src/dungeon_projectile_throw.c @@ -12,6 +12,8 @@ #include "moves_1.h" #include "overlay_29_02344AF8.h" #include "dungeon_util_2.h" +#include "overlay_29_022E9FC0.h" +#include "overlay_29_0234B340.h" #ifdef JAPAN #define CURVED_PROJECTILE_LOG_MESSAGE_1 0x920 @@ -30,11 +32,9 @@ extern void ov29_0234B4CC(bool8 val); extern s32 SinAbs4096(s32 x); extern bool8 DisplayThrownItemShadow(s32 x, s32 y, u8 index); extern bool8 DisplayItem(struct entity *item, bool8 hallucinate, u8 on_floor, u8 dir, u8 priority); -extern void AdvanceFrame(u32 param_1); extern bool8 TwoTurnMoveForcedMiss(struct entity *target, struct move *move); extern bool8 DoesProjectileHitTarget(struct entity *user, struct entity *target); extern void ChangeMonsterAnimationToHurt(struct entity *monster, u32 direction); -extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); extern bool8 SpawnDroppedItem(struct entity *entity, struct entity *item_entity, struct item *item, bool8 param_4, struct position *dir_xy, u32 param_6); diff --git a/src/ground_bg.c b/src/ground_bg.c index 1b2d3841..47ea280b 100644 --- a/src/ground_bg.c +++ b/src/ground_bg.c @@ -7,7 +7,6 @@ #define VRAM 0x6000000 extern void FileClose(struct file_stream* file); -extern void* MemAlloc(u32 len, u32 flags); extern s32 sprintf(u8* str, const u8* format, ...); extern void LoadFileFromRom(struct iovec* iov, const char* filepath, u32 flags); diff --git a/src/main_02001188.c b/src/main_02001188.c index 2ecc398e..12dbee90 100644 --- a/src/main_02001188.c +++ b/src/main_02001188.c @@ -1,5 +1,12 @@ #include "main_02001188.h" +extern void *MemLocateSet(struct mem_arena *arena, u32 len, u32 flags); + +void* MemAlloc(u32 len, u32 flags) +{ + return MemLocateSet(0, len, flags); +} + extern void MemLocateUnset(struct mem_arena *arena, void *ptr); void MemFree(void * ptr) diff --git a/src/main_020114F8.c b/src/main_020114F8.c index 73ae4b14..e9f3945e 100644 --- a/src/main_020114F8.c +++ b/src/main_020114F8.c @@ -1,5 +1,8 @@ #include "main_020114F8.h" #include "main_02001188.h" +#include "common.h" + +extern void ApplyGummiBoostsGroundMode(s16 *monster_id, u16 *iq, u8 *offensive_stats, u8 *defensive_stats, s16 item_id, int a6, void *a7); void SwapShopFreeDoublePointer(void** p) { @@ -10,3 +13,9 @@ void SwapShopFreeDoublePointer(void** p) MemFree(*p); *p = NULL; } + +void ApplyGummiBoostsToGroundMonster(struct ground_monster *monster, s16 item_id, int a3, void *a4) +{ + ApplyGummiBoostsGroundMode(&monster->id, &monster->iq, monster->offensive_stats, + monster->defensive_stats, item_id, a3, a4); +} diff --git a/src/main_0203088C.c b/src/main_0203088C.c index 19e5b168..84591122 100644 --- a/src/main_0203088C.c +++ b/src/main_0203088C.c @@ -8,3 +8,12 @@ void SetAdvancedTextBoxState5(s32 window_id) w->field_0x1BC = 5; } + +void CloseAdvancedTextBox(s32 window_id) +{ + void *contents; + + contents = GetWindowContents(window_id); + DeleteWindow(window_id); + MemFree(contents); +} diff --git a/src/main_0203D538.c b/src/main_0203D538.c index 1d08e6ca..f51fd192 100644 --- a/src/main_0203D538.c +++ b/src/main_0203D538.c @@ -17,13 +17,7 @@ #include "main_0203755C.h" #include "progression.h" #include "script_variable.h" - -struct unk_020517F4 { - u8 field_0x0[8]; - s32 field_0x8; - s16 field_0xc; - u8 field_0xe[2]; -}; +#include "main_020517D4.h" struct unk_020AFE74 { s32 field_0x0; @@ -98,7 +92,6 @@ extern void sub_02045FD0(struct item *out); extern bool8 AddItemToStorage(struct item *item); extern void InitUnkStorageStruct0x410(struct item *, u8); extern s32 GetRank(void); -extern struct unk_020517F4 *GetRankUpEntry(s32 rank); extern void sub_0203F00C(void); extern void MissionRewardCloseAllBoxes(void); extern struct ground_monster *sub_02055D4C(struct ground_monster *mon); diff --git a/src/main_02042B84.c b/src/main_02042B84.c index 1aca27a0..94eb2feb 100644 --- a/src/main_02042B84.c +++ b/src/main_02042B84.c @@ -2,7 +2,6 @@ #include "main_02042AF8.h" #include "main_02001188.h" -void *MemAlloc(u32 size, u32 nmemb); s32 IsBagItemIndexSelected(s32 idx) { diff --git a/src/main_020517D4.c b/src/main_020517D4.c index 15a8c621..e43825c1 100644 --- a/src/main_020517D4.c +++ b/src/main_020517D4.c @@ -1,6 +1,8 @@ #include "main_020517D4.h" #include "enums.h" +extern struct unk_020517F4 RANK_UP_TABLE[]; + // Array of 4-byte integers containing the bag capacity for each bag level. const u32 BAG_CAPACITY_TABLE[8] = { 16, 24, 32, 40, 40, 40, 48, 48 }; const u32 BAG_CAPACITY_TABLE_SPECIAL_EPISODES[NUM_SPECIAL_EPISODES] = @@ -21,3 +23,8 @@ u32 GetBagCapacitySpecialEpisode(s32 se_type) { return BAG_CAPACITY_TABLE_SPECIAL_EPISODES[se_type]; } + +struct unk_020517F4* GetRankUpEntry(s32 rank) +{ + return &RANK_UP_TABLE[rank]; +} diff --git a/src/main_02051FF0.c b/src/main_02051FF0.c index 6b75ede9..68db72e8 100644 --- a/src/main_02051FF0.c +++ b/src/main_02051FF0.c @@ -1,9 +1,9 @@ #include "main_02051FF0.h" #include "main_02008BD4.h" +#include "main_02001188.h" extern void LoadFileFromRom(struct iovec *handle, u32 fileId, s32 param2); extern s32 GetAtSize(void *data); -extern void *MemAlloc(u32 size, u32 heapId); extern void DecompressAtNormalVeneer(void *dest, u32 size, void *src); s32 sub_02051FF0(u32 fileId, void **outPtr, s32 param2) diff --git a/src/main_0205D11C.c b/src/main_0205D11C.c index a5ce1bb0..2b8a8bfe 100644 --- a/src/main_0205D11C.c +++ b/src/main_0205D11C.c @@ -28,7 +28,6 @@ extern const char _020A3B18[]; extern s32 RandIntSafe(s32 n); extern void ClearMissionData(struct mission *mission); -extern void *MemAlloc(u32 len, u32 flags); extern struct mission_deliver_list MISSION_DELIVER_LIST_PTR; extern s32 CanDungeonBeUsedForMission(enum dungeon_id); extern s32 CountAndPopulateValidMissionTableMonsters(s16 **out, struct unk_0205DFAC *spec); diff --git a/src/move_orb_effects.c b/src/move_orb_effects.c index 282bf3ce..4ff10e51 100644 --- a/src/move_orb_effects.c +++ b/src/move_orb_effects.c @@ -11,6 +11,7 @@ #include "overlay_29_02344AF8.h" #include "dungeon_util_2.h" #include "overlay_29_022E3F20.h" +#include "overlay_29_0234B340.h" extern u8* AllocateTemp1024ByteBufferFromPool(void); extern void CopyStringFromId(u8* buf, u32 string_id); @@ -26,7 +27,6 @@ extern void PlayDefensiveStatMultiplierDownEffect(struct entity *entity, struct extern void PlayDefensiveStatMultiplierUpEffect(struct entity *entity, struct StatIndex stat_index); extern void PlayHitChanceUpEffect(struct entity *entity, struct StatIndex stat_index); extern void PlayHitChanceDownEffect(struct entity *entity, struct StatIndex stat_index); -extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void ov29_022E4338(struct entity *); extern void PlayExclamationPointEffect__022E5D4C(struct entity *entity); extern void PlayParalysisEffect(struct entity *entity); diff --git a/src/overlay_10_022BFD58.c b/src/overlay_10_022BFD58.c index 1e7aaf49..86de60d7 100644 --- a/src/overlay_10_022BFD58.c +++ b/src/overlay_10_022BFD58.c @@ -1,8 +1,8 @@ #include "overlay_10_022BFD58.h" +#include "main_02001188.h" extern struct unk_022DC1C4 *ov10_022DC1C4; -extern void *MemAlloc(u32 size, u32 flags); extern void MemZero(void *p, s32 n); diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index d9e1e7e5..8a6a036a 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -18,6 +18,8 @@ #include "main_02058E68.h" #include "overlay_10_022BCC60.h" #include "overlay_31_02382820.h" +#include "main_020114F8.h" +#include "main_0203088C.h" struct unk_02309DAC { s32 field_0x0; @@ -100,9 +102,7 @@ extern void InitPreprocessorArgs(struct preprocessor_args *); extern s32 IsScrollBoxActive(s8); extern void ShowDialogueBox(s8); extern void ShowStringIdInDialogueBox(s8, s32, s32, void *); extern void ov11_022DC504(void); extern u8 *strcpy(u8 *dest, const u8 *src); -extern void ApplyGummiBoostsToGroundMonster(struct ground_monster *, s16, int, void *); extern void ApplyGummiBoostsToTeamMember(struct team_member *, s16, int, void *); -extern void CloseAdvancedTextBox(s32 window_id); extern s8 CreateInventoryMenuOuter(s32, s32, s32, void *, void *, void *, u8); extern bool8 IsBagNotEmpty(void); extern u8 PopInventoryMenuField0x1A3(s32 window_id); diff --git a/src/overlay_13_EntryOverlay13.c b/src/overlay_13_EntryOverlay13.c index 9ceb550a..5b4cba94 100644 --- a/src/overlay_13_EntryOverlay13.c +++ b/src/overlay_13_EntryOverlay13.c @@ -2,7 +2,6 @@ #include "overlay_13_0238BDA8.h" #include "main_02001188.h" -extern void* MemAlloc(u32 len, u32 flags); void sub_0201F2E4(void); void InitMenu(const u8 *); extern void ReturnScriptMenuResult(u32); diff --git a/src/overlay_15_0238A140.c b/src/overlay_15_0238A140.c index 87cfbebd..ebf8afb8 100644 --- a/src/overlay_15_0238A140.c +++ b/src/overlay_15_0238A140.c @@ -1,8 +1,8 @@ #include "overlay_15_0238A140.h" +#include "main_02001188.h" extern unkBankStruct* DUSKULL_BANK_STRUCT_PTR; -extern void* MemAlloc(u32 len, u32 flags); extern void InitPreprocessorArgs(preprocessor_args*); extern u32 CreateDialogueBox(u32); extern u32 CreatePortraitBox(u32, u32, u32); diff --git a/src/overlay_24_end.c b/src/overlay_24_end.c index 4e8143f1..bd792f2c 100644 --- a/src/overlay_24_end.c +++ b/src/overlay_24_end.c @@ -17,7 +17,6 @@ void GetNameRaw(unsigned char *, s32); void GetNameWithGender(unsigned char*, s32, char color_id); s8 GetUnkGameState0x13a6(); extern void InitPreprocessorArgs(void* args); -void* MemAlloc(s32, s32); s16 ReturnEggExclusiveItem(s32); void SetUnkGameState0x13a6(s32); void StrcpyName(const unsigned char*, const unsigned char*); diff --git a/src/overlay_25_init.c b/src/overlay_25_init.c index db610649..8538eec2 100644 --- a/src/overlay_25_init.c +++ b/src/overlay_25_init.c @@ -1,6 +1,7 @@ #include "overlay_25.h" #include "main_0200C4FC.h" #include "item.h" +#include "main_02001188.h" extern void CloseDialogueBox(s8); @@ -50,7 +51,6 @@ extern void ShowPortraitInPortraitBox(s8, void*); extern void SwapShopInventoryManager(s32, s32); extern void ov11_022DC504(); extern void ov11_0230C910(); -extern void* MemAlloc(s32, s32); extern void MemFree(void *ptr); extern BOOL IsScriptMenuReturnDisabled(); extern void ReturnScriptMenuResult(s32); diff --git a/src/overlay_29_022DEAB0.c b/src/overlay_29_022DEAB0.c index a9d55ed4..99373de4 100644 --- a/src/overlay_29_022DEAB0.c +++ b/src/overlay_29_022DEAB0.c @@ -1,9 +1,9 @@ #include "overlay_29_022DEAB0.h" #include "dungeon.h" +#include "main_02001188.h" void MemFree(void* ptr); void MemZero(void* ptr, u32 len); -void* MemAlloc(u32 len, u32 flags); void ov29_0234C654(s32); void sub_020091B0(s32, s32); void sub_02009194(s32, s32); diff --git a/src/overlay_29_022E99F0.c b/src/overlay_29_022E99F0.c index 56fdcd42..fd8d57ab 100644 --- a/src/overlay_29_022E99F0.c +++ b/src/overlay_29_022E99F0.c @@ -23,3 +23,15 @@ struct position* FindUnoccupiedTileWithin3(struct position* out, struct position { return FindNearbyUnoccupiedTile(out, origin, DISPLACEMENTS_WITHIN_3, 0x31, a); } + +u8 TickStatusTurnCounter(u8 *counter) +{ + u8 turns = *counter; + + if (turns == 0x7F) + return turns; + if (turns == 0) + return turns; + *counter = turns - 1; + return *counter; +} diff --git a/src/overlay_29_022E9FC0.c b/src/overlay_29_022E9FC0.c index 4538368b..5f5f58d1 100644 --- a/src/overlay_29_022E9FC0.c +++ b/src/overlay_29_022E9FC0.c @@ -1,5 +1,8 @@ #include "overlay_29_022E9FC0.h" +extern void ov29_022EA2A4(u32 param_1); +extern void ov29_022EA324(u32 param_1); + struct unk_02353560 { u8 field_0x0; u8 field_0x1; @@ -19,3 +22,13 @@ void ov29_022E9FD0(u8 value) { ov29_02353560.field_0x3 = value; } + +void AdvanceFrame(u32 param_1) +{ + if (ov29_02353560.field_0x3) { + ov29_022EA2A4(param_1); + } + else { + ov29_022EA324(param_1); + } +} diff --git a/src/overlay_29_022F0EDC.c b/src/overlay_29_022F0EDC.c index 74dec6e3..f896345b 100644 --- a/src/overlay_29_022F0EDC.c +++ b/src/overlay_29_022F0EDC.c @@ -19,6 +19,7 @@ #include "position_util.h" #include "dungeon_util_2.h" #include "overlay_29_022EC7E8.h" +#include "overlay_29_022E9FC0.h" #ifdef JAPAN #define SET_LEADER_ACTION_DATA_OFFSET -0x2C1 @@ -47,7 +48,6 @@ extern struct unk_0237C9A4 ov29_0237C9A4; extern u16 DUNGEON_BUTTON_INPUT[8]; extern u16 ov29_0237C6A4; -extern void AdvanceFrame(u32); extern bool8 CanSeeTarget(struct entity *user, struct entity *target); extern bool8 IsBlinded(struct entity *entity, bool8 check_held_item); extern void MemZero(u8 *ptr, s32 len); diff --git a/src/overlay_29_02305C04.c b/src/overlay_29_02305C04.c index 5318d7e9..f69acedb 100644 --- a/src/overlay_29_02305C04.c +++ b/src/overlay_29_02305C04.c @@ -1,6 +1,8 @@ #include "overlay_29_02305C04.h" #include "dungeon_util_static.h" +extern s32 EndNegativeStatusCondition(struct entity *user, struct entity *target, bool8 a, bool8 b, bool8 c); + bool8 EntityIsValid__02305C04(struct entity *entity) { if (entity == NULL) @@ -8,3 +10,8 @@ bool8 EntityIsValid__02305C04(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +void EndNegativeStatusConditionWrapper(struct entity *user, struct entity *target, bool8 displayMessage, bool8 fromMove) +{ + EndNegativeStatusCondition(user, target, displayMessage, fromMove, FALSE); +} diff --git a/src/overlay_29_023061A8.c b/src/overlay_29_023061A8.c index a862fef3..4f9a0a76 100644 --- a/src/overlay_29_023061A8.c +++ b/src/overlay_29_023061A8.c @@ -3,6 +3,7 @@ #include "dungeon_util_2.h" #include "overlay_29_022E3F20.h" #include "dungeon_util_static.h" +#include "overlay_29_0234B340.h" #ifdef JAPAN #define JPN_MSG_OFFSET -0x2C0 @@ -10,7 +11,6 @@ #define JPN_MSG_OFFSET 0 #endif -extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); void EndBurnClassStatus(struct entity *user, struct entity *target) { diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index 07b0f9da..9de9eb2f 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -47,6 +47,10 @@ #include "overlay_29_02345A3C.h" #include "overlay_29_02306728.h" #include "overlay_29_02336F4C.h" +#include "main_0205283C.h" +#include "overlay_29_022E9FC0.h" +#include "overlay_29_0234B340.h" +#include "overlay_29_0234B4BC.h" struct unk_023535DC { u8 field_0x0; @@ -95,7 +99,6 @@ extern s16 ov10_022C45C0; extern s16 ov10_022C4638; extern s16 ov10_022C467C; extern void AddExpSpecial(struct entity* attacker, struct entity* defender, s32 base_exp); -extern void AdvanceFrame(u32); extern bool8 AftermathCheck(struct entity *attacker, struct entity *defender, s32 damage_source); extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); extern void ChangeMonsterAnimationToIdle(struct entity* monster, enum direction_id direction); @@ -106,13 +109,10 @@ extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity* user, struct extern void FillRecruitInfo(void *recruit_info, struct entity *monster); extern void FreeOtherWrappedMonsters(u32 unique_id); extern struct team_member* GetActiveTeamMember(s32 roster_idx); -extern s32 GetExp(enum monster_id monster_id, s32 level); extern s32 GetIdleAnimationId(struct entity *entity); extern void HandleFaint(struct entity *fainted_entity, s32 damage_source, struct entity *killer); extern bool8 IsMonsterIdInNormalRangeVeneer(enum monster_id monster_id); -extern void LogMessageByIdWithPopup(struct entity* user, s32 message_id); extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); -extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void MoveMonsterToPos(struct entity* entity, s32 x_pos, s32 y_pos, bool8 reset_prev_pos_fields); extern enum music_id MusicTableIdxToMusicId(s32 music_table_idx); extern s32 PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, s32 c, s32 d, s32 e, s32 f); diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c index fb6d1431..c0f0b885 100644 --- a/src/overlay_29_0230BBAC.c +++ b/src/overlay_29_0230BBAC.c @@ -25,13 +25,14 @@ #include "type_effectiveness.h" #include "weather.h" #include "dungeon_util_2.h" +#include "overlay_29_02338350.h" +#include "overlay_29_0234B340.h" extern struct dungeon *DUNGEON_PTR; extern u8 GetMonsterGenderVeneer(s16 monster_id); extern u8 ExclusiveItemOffenseBoost(struct entity *entity, s32 idx); extern u8 ExclusiveItemDefenseBoost(struct entity *entity, s32 idx); extern int MoveIsNotPhysical(enum move_id move_id); -extern bool8 NearbyAllyIqSkillIsEnabled(struct entity *entity, enum iq_skill_id iq_skill); extern s32 FixedPoint64ToInt(struct fixed_point_64 *x); extern void AddFixedPoint64(struct fixed_point_64 *out, struct fixed_point_64 *a, struct fixed_point_64 *b); extern void ClampedLn(struct fixed_point_64 *out, s32 x); @@ -45,7 +46,6 @@ extern void DivideFixedPoint64(struct fixed_point_64 *out, struct fixed_point_64 extern void ResetDamageCalcDiagnostics(void); extern bool8 OtherMonsterAbilityIsActive(struct entity *entity, enum ability_id ability_id); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); -extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern bool8 UpdateStateFlags(struct monster *info, s32 flag, bool8 value); extern void ResetDamageData(struct unk_02308FE0 *damage_data); extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index 85c39318..a79e0d18 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -23,6 +23,8 @@ #include "dungeon_util_2.h" #include "overlay_29_022EC7E8.h" #include "overlay_29_023061A8.h" +#include "overlay_29_022E99F0.h" +#include "overlay_29_02305C04.h" #ifdef JAPAN #define MESSAGE_DE6 0xB26 @@ -58,12 +60,10 @@ extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); -extern void EndNegativeStatusConditionWrapper(struct entity *user, struct entity *target, bool8 displayMessage, bool8 fromMove); extern void ov29_022EA370(s32 a, s32 b); extern s32 ov29_022F2FE4(); extern void WaitUntilAlertBoxTextIsLoadedWrapper(void); -extern u8 TickStatusTurnCounter(u8 *counter); extern void EnsureCanStandCurrentTile(struct entity *entity); extern void ov29_022E543C(struct entity *entity); extern void ov29_022E53F0(struct entity *entity); diff --git a/src/overlay_29_0231CBC8.c b/src/overlay_29_0231CBC8.c index 118439f9..bf627602 100644 --- a/src/overlay_29_0231CBC8.c +++ b/src/overlay_29_0231CBC8.c @@ -12,6 +12,8 @@ #include "overlay_29_0234BA54.h" #include "dungeon_util_2.h" #include "overlay_29_02345A3C.h" +#include "overlay_29_02305C04.h" +#include "overlay_29_0234B340.h" #ifdef JAPAN #define MESSAGE_BE6 0x925 @@ -36,9 +38,7 @@ extern void ov29_022FB920(bool8 a); #endif -extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); -extern void EndNegativeStatusConditionWrapper(struct entity *user, struct entity *target, bool8 displayMessage, bool8 fromMove); extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern void BoostIQ(struct entity *entity, s16 iq, bool8 a); extern void UpdateShopkeeperModeAfterAttack(struct entity *attacker, struct entity *defender); diff --git a/src/overlay_29_02326188.c b/src/overlay_29_02326188.c index 6b9fa417..e52805d3 100644 --- a/src/overlay_29_02326188.c +++ b/src/overlay_29_02326188.c @@ -3,6 +3,7 @@ #include "item.h" #include "move.h" #include "move_orb_effects.h" +#include "overlay_29_02305C04.h" extern const s16 BUBBLE_LOWER_SPEED_CHANCE; @@ -10,7 +11,6 @@ extern s32 DealDamage(struct entity *attacker, struct entity *defender, struct m extern bool8 DungeonRandOutcomeUserTargetInteraction(struct entity *user, struct entity *target, s16 chance); -extern void EndNegativeStatusConditionWrapper(struct entity *user, struct entity *target, bool8 displayMessage, bool8 fromMove); bool8 DoMoveHealStatus(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id) { diff --git a/src/overlay_29_02329664.c b/src/overlay_29_02329664.c index df828ac9..49379c1e 100644 --- a/src/overlay_29_02329664.c +++ b/src/overlay_29_02329664.c @@ -1,5 +1,6 @@ #include "overlay_29_02329664.h" #include "move_orb_effects.h" +#include "overlay_29_0234B340.h" #ifdef JAPAN #define HELPING_HAND_LOG_MESSAGE 0xC1C @@ -8,7 +9,6 @@ #endif -extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern const struct StatIndex ATK_STAT_IDX; diff --git a/src/overlay_29_0232A480.c b/src/overlay_29_0232A480.c index e6eebe9a..5e575c7f 100644 --- a/src/overlay_29_0232A480.c +++ b/src/overlay_29_0232A480.c @@ -1,5 +1,6 @@ #include "overlay_29_0232A480.h" #include "dungeon_util_static.h" +#include "overlay_29_0234B340.h" #ifdef JAPAN #define SWALLOW_LOG_MESSAGE 0xC26 @@ -8,7 +9,6 @@ #endif -extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern const s32 ov10_022C49D4[]; diff --git a/src/overlay_29_0232CE40.c b/src/overlay_29_0232CE40.c index 32e3545b..34cda62b 100644 --- a/src/overlay_29_0232CE40.c +++ b/src/overlay_29_0232CE40.c @@ -1,4 +1,5 @@ #include "overlay_29_0232CE40.h" +#include "overlay_29_0234B340.h" #ifdef JAPAN #define REVIVER_LOG_MESSAGE 0xC4B @@ -7,7 +8,6 @@ #endif -extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern s16 ov10_022C456C; diff --git a/src/overlay_29_0232D368.c b/src/overlay_29_0232D368.c index 938f5173..bb73c735 100644 --- a/src/overlay_29_0232D368.c +++ b/src/overlay_29_0232D368.c @@ -1,5 +1,6 @@ #include "overlay_29_0232D368.h" #include "dungeon_util_2.h" +#include "overlay_29_0234B340.h" #ifdef JAPAN #define GUARD_SWAP_LOG_MESSAGE 0x2495 @@ -7,7 +8,6 @@ #define GUARD_SWAP_LOG_MESSAGE 0xF2E #endif -extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void SwapDefensiveStages(struct entity *attacker, struct entity *defender, s32 log_message); extern void SwapDefensiveMultipliers(struct entity *attacker, struct entity *defender, s32 log_message); extern void TryInflictLuckyChantStatus(struct entity *user, struct entity *target); diff --git a/src/overlay_29_02338350.c b/src/overlay_29_02338350.c index cfe26628..4a957e6d 100644 --- a/src/overlay_29_02338350.c +++ b/src/overlay_29_02338350.c @@ -3,6 +3,13 @@ #include "dungeon_util.h" #include "dungeon_util_static.h" +extern struct entity *ov29_023381C0(struct entity *entity, enum iq_skill_id iq_skill, bool8 param_3); + +bool8 NearbyAllyIqSkillIsEnabled(struct entity *entity, enum iq_skill_id iq_skill) +{ + return ov29_023381C0(entity, iq_skill, FALSE) != NULL; +} + struct entity* FindAdjacentEnemy(struct entity *monster) { s16 i; diff --git a/src/overlay_29_0234B340.c b/src/overlay_29_0234B340.c index a2245de4..d6d433d7 100644 --- a/src/overlay_29_0234B340.c +++ b/src/overlay_29_0234B340.c @@ -1,4 +1,6 @@ #include "overlay_29_0234B340.h" +#include "main_0202593C.h" +#include "overlay_29_022E272C.h" extern void LogMessage(struct entity *user, const char *message, bool8 show_popup); @@ -6,3 +8,16 @@ void LogMessageQuiet(struct entity *user, const char *message) { LogMessage(user, message, FALSE); } + +void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id) +{ + bool8 display = FALSE; + + if (ShouldDisplayEntityWrapper(user)) + display = TRUE; + if (ShouldDisplayEntityWrapper(target)) + display = TRUE; + + if (display) + LogMessage(user, (char *)StringFromId(message_id), TRUE); +} diff --git a/src/overlay_29_0234B4BC.c b/src/overlay_29_0234B4BC.c index 7794fd8b..ad2eaf4c 100644 --- a/src/overlay_29_0234B4BC.c +++ b/src/overlay_29_0234B4BC.c @@ -1,7 +1,13 @@ #include "overlay_29_0234B4BC.h" +#include "main_0202593C.h" extern void LogMessage(struct entity *user, const char *message, bool8 show_popup); +void LogMessageByIdWithPopup(struct entity *user, s32 message_id) +{ + LogMessage(user, (char *)StringFromId(message_id), TRUE); +} + void LogMessageWithPopup(struct entity *user, const char *message) { LogMessage(user, message, TRUE); diff --git a/src/overlay_29_0234BA54.c b/src/overlay_29_0234BA54.c index e8b277d5..a6d9423a 100644 --- a/src/overlay_29_0234BA54.c +++ b/src/overlay_29_0234BA54.c @@ -1,5 +1,6 @@ #include "overlay_29_0234BA54.h" #include "overlay_29_0234B024.h" +#include "overlay_29_022E9FC0.h" extern struct message_log_info MESSAGE_LOG_INFO; extern u16 DUNGEON_BUTTON_INPUT[8]; @@ -18,7 +19,6 @@ extern void sub_02047FFC(s32 a); extern void InitPortraitParams(portrait_params *portrait); extern void AllowPortraitDefault(portrait_params *portrait, bool32 allow); extern void WaitUntilAlertBoxTextIsLoaded(u32 param_1); -extern void AdvanceFrame(u32 param_1); void WaitUntilAlertBoxPauseIsOver(u32 param_1) { diff --git a/src/overlay_31_02382820.c b/src/overlay_31_02382820.c index b13811da..f06ab50e 100644 --- a/src/overlay_31_02382820.c +++ b/src/overlay_31_02382820.c @@ -9,6 +9,7 @@ #include "window.h" #include "main_02027AF0.h" #include "dungeon_util_2.h" +#include "overlay_29_022E9FC0.h" extern struct dungeon *DUNGEON_PTR[]; @@ -28,7 +29,6 @@ extern struct struct_1 OVERLAY31_UNKNOWN_STRUCT__NA_2389E30; extern u16 ov31_02389E22[]; -extern void* MemAlloc(u32 size, u32 nmemb); extern u32 GetMoneyCarried(void); extern u32 sub_0204F9E0(void); @@ -53,7 +53,6 @@ extern void CloseTextBox(s8); extern void CloseParentMenu(s8); extern void UnkMapRelatedFunc(u32, u32); -extern void AdvanceFrame(u8); extern u32 GetLeaderActionId(void); extern void ov29_022E0C2C(u32); diff --git a/src/overlay_31_02383880.c b/src/overlay_31_02383880.c index aa018b57..0452a00c 100644 --- a/src/overlay_31_02383880.c +++ b/src/overlay_31_02383880.c @@ -4,13 +4,13 @@ #include "overlay_31_02383478.h" #include "main_02001188.h" #include "main_020282F4.h" +#include "overlay_29_022E9FC0.h" extern struct dungeon *DUNGEON_PTR[]; extern struct loc_struct* OVERLAY31_UNKNOWN_POINTER__NA_238A26C; extern u8 PositionHasItem(struct position* pos); extern bool8 ov10_022BCD10(s8); -extern void AdvanceFrame(u8); extern void CloseInventoryMenu(s8); extern void ov29_0234E988(u8*); extern void CloseTextBox2(); diff --git a/src/type_effectiveness.c b/src/type_effectiveness.c index b9542329..4ddc0d23 100644 --- a/src/type_effectiveness.c +++ b/src/type_effectiveness.c @@ -12,11 +12,11 @@ #include "overlay_29_0233836C.h" #include "type_matchup_table.h" #include "weather.h" +#include "overlay_29_0234B340.h" extern struct dungeon *DUNGEON_PTR; extern bool8 UpdateStateFlags(struct monster *info, s32 flag, bool8 value); -extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void LogMessageByIdWithPopupCheckParticipants(struct entity *user, struct entity *target, u32 message_id, s32 a4, s32 a5); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern bool8 GhostImmunityIsActive(struct entity *attacker, struct entity *defender, s16 target_type_idx); From 2cfa18739d00db673bf54a6615352d0c2b7964c2 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 13 Sep 2026 02:25:04 -0700 Subject: [PATCH 19/34] Decompile 13 more callees; all merge at a file boundary Each was verified at score 0 against its NORTH_AMERICA, EUROPE and JAPAN targets before landing, with the address walk closing exactly in each region, and by a matching US build after. main_0200224C.c sub_02002228, ClampedLn main_020114F8.c ApplyGummiBoostsToTeamMember main_0200F798.c RemoveItemNoHoleCheck main_02062A58.c CanMonsterBeUsedForMission main_0205D11C.c CountAndPopulateValidMissionTableMonsters overlay_10_022BCC60.c ov10_022BCDF4 overlay_29_022E4338.c PlayEffectAnimationEntityStandard overlay_29_022EAC7C.c MusicTableIdxToMusicId overlay_29_022ECDC0.c ov29_022ECD84 overlay_29_022F0590.c ov29_022F0534 overlay_29_0230A9DC.c AftermathCheck dungeon_logic_6.c ov29_022EFB20 Every one sat at the head or tail of its .s, so all thirteen merge into an adjacent source file and no assembly file is split. sub_02002228 is one instruction and was taken only because it is the single function standing between ClampedLn and the end of its file. Ten call-site declarations are replaced by an include of the owning header, including three unprototyped `extern int ov29_...();` forms in src/overlay_29_02308FBC.c that became hard conflicts the moment these functions had real headers to contradict. Three implicit-conversion errors were fixed by correcting a declaration rather than by adding a cast, which is the better repair when the declaration is ours: RANDOM_MUSIC_ID_TABLE had no C declaration anywhere, so the u16 in the first draft was a guess. It is declared `enum music_id[30][4]` here; -enum min sizes that enum (max 999) to two bytes, so the layout is unchanged and the cast is unnecessary. GetBaseForm and IsMonsterMissionAllowed had no declaration either, and the invented `enum monster_id` parameters created the conversions. They take s16 here, matching the tree's own FemaleToMaleForm(s16) and HasMonsterBeenAttackedInDungeons(s16) for the same ids. One cast is kept deliberately: MUSIC_ID_TABLE entries carry a 0x8000 flag bit that the source tests and masks off, so an entry is not a valid music_id enumerator and typing that table as the enum would be false. Two generated headers are made self-contained -- overlay_29_022EAC7C.h named enum music_id and main_0200224C.h named struct fixed_point_64 without including anything, so each prototype built its own scoped tag and the definition read as a redeclaration with a different type. Authored by Claude (Opus 5) under human direction. Confirmed by a matching build: build/pmdsky.us/pmdsky.us.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_02001D68.inc | 1 - .../{main_02011554.inc => main_02011580.inc} | 1 - asm/include/main_0205DFAC.inc | 4 -- .../{main_02062A68.inc => main_02062AD0.inc} | 34 +++++----- ...0_022BCDF4.inc => overlay_10_022BCE44.inc} | 23 +++---- ...9_022EAD00.inc => overlay_29_022EAD68.inc} | 5 +- asm/include/overlay_29_022EC85C.inc | 3 - asm/include/overlay_29_022EFB20.inc | 12 ---- asm/include/overlay_29_022EFB84.inc | 4 ++ ...9_0230AA0C.inc => overlay_29_0230AA8C.inc} | 6 +- asm/main_02001D68.s | 23 ------- asm/main_0200F390.s | 39 ----------- asm/{main_02011554.s => main_02011580.s} | 17 +---- asm/main_0205DFAC.s | 38 ----------- asm/{main_02062A68.s => main_02062AD0.s} | 33 +-------- ...ay_10_022BCDF4.s => overlay_10_022BCE44.s} | 27 +------- asm/overlay_29_022E41F0.s | 24 ------- ...ay_29_022EAD00.s => overlay_29_022EAD68.s} | 33 +-------- asm/overlay_29_022EC85C.s | 20 ------ ...ay_29_022EFB20.s => overlay_29_022EFB84.s} | 68 +------------------ ...ay_29_0230AA0C.s => overlay_29_0230AA8C.s} | 43 +----------- include/dungeon_logic_6.h | 1 + include/main_0200224C.h | 4 ++ include/main_0200F798.h | 1 + include/main_020114F8.h | 1 + include/main_0205D11C.h | 1 + include/main_02062A58.h | 1 + include/overlay_10_022BCC60.h | 1 + include/overlay_29_022E4338.h | 1 + include/overlay_29_022EAC7C.h | 3 + include/overlay_29_022ECDC0.h | 1 + include/overlay_29_022F0590.h | 1 + include/overlay_29_0230A9DC.h | 1 + main.lsf | 13 ++-- src/dungeon_logic_6.c | 22 ++++++ src/main_02000C6C.c | 2 +- src/main_0200224C.c | 19 ++++++ src/main_0200F798.c | 25 +++++++ src/main_020114F8.c | 6 ++ src/main_0205D11C.c | 27 +++++++- src/main_02062A58.c | 30 ++++++++ src/overlay_10_022BCC60.c | 14 ++++ src/overlay_11_02307334.c | 2 - src/overlay_29_022E4338.c | 11 +++ src/overlay_29_022EAC7C.c | 16 +++++ src/overlay_29_022ECDC0.c | 14 ++++ src/overlay_29_022F0590.c | 28 +++++++- src/overlay_29_02308FBC.c | 7 +- src/overlay_29_0230A9DC.c | 22 ++++++ src/overlay_29_0230BBAC.c | 2 +- src/overlay_29_02311010.c | 2 +- 51 files changed, 298 insertions(+), 439 deletions(-) rename asm/include/{main_02011554.inc => main_02011580.inc} (91%) delete mode 100644 asm/include/main_0205DFAC.inc rename asm/include/{main_02062A68.inc => main_02062AD0.inc} (96%) rename asm/include/{overlay_10_022BCDF4.inc => overlay_10_022BCE44.inc} (99%) rename asm/include/{overlay_29_022EAD00.inc => overlay_29_022EAD68.inc} (69%) delete mode 100644 asm/include/overlay_29_022EFB20.inc create mode 100644 asm/include/overlay_29_022EFB84.inc rename asm/include/{overlay_29_0230AA0C.inc => overlay_29_0230AA8C.inc} (61%) rename asm/{main_02011554.s => main_02011580.s} (92%) delete mode 100644 asm/main_0205DFAC.s rename asm/{main_02062A68.s => main_02062AD0.s} (98%) rename asm/{overlay_10_022BCDF4.s => overlay_10_022BCE44.s} (99%) rename asm/{overlay_29_022EAD00.s => overlay_29_022EAD68.s} (60%) rename asm/{overlay_29_022EFB20.s => overlay_29_022EFB84.s} (91%) rename asm/{overlay_29_0230AA0C.s => overlay_29_0230AA8C.s} (61%) diff --git a/asm/include/main_02001D68.inc b/asm/include/main_02001D68.inc index ad0bc982..8a26e6e4 100644 --- a/asm/include/main_02001D68.inc +++ b/asm/include/main_02001D68.inc @@ -1,6 +1,5 @@ #pragma once .public FixedPoint64IsNegative .public FixedPoint64IsZero -.public NATURAL_LOG_VALUE_TABLE .public NegateFixedPoint64 .public UFixedPoint64CmpLt diff --git a/asm/include/main_02011554.inc b/asm/include/main_02011580.inc similarity index 91% rename from asm/include/main_02011554.inc rename to asm/include/main_02011580.inc index 390cce2b..7434e963 100644 --- a/asm/include/main_02011554.inc +++ b/asm/include/main_02011580.inc @@ -1,5 +1,4 @@ #pragma once -.public ApplyGummiBoostsGroundMode .public CALCIUM_STAT_BOOST .public GINSENG_CHANCE_3 .public GetMoveBasePowerGround diff --git a/asm/include/main_0205DFAC.inc b/asm/include/main_0205DFAC.inc deleted file mode 100644 index db34afbd..00000000 --- a/asm/include/main_0205DFAC.inc +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once -.public CanMonsterBeUsedForMissionWrapper -.public MemAlloc -.public sub_020627F4 diff --git a/asm/include/main_02062A68.inc b/asm/include/main_02062AD0.inc similarity index 96% rename from asm/include/main_02062A68.inc rename to asm/include/main_02062AD0.inc index 691d0d5f..bbfc7d03 100644 --- a/asm/include/main_02062A68.inc +++ b/asm/include/main_02062AD0.inc @@ -1,14 +1,8 @@ #pragma once -.public _020A3CAD -.public _020A46B0 -.public _020A46D0 -.public _020AFC70 -.public _020B0B04 -.public _s32_div_f .public CAFE_MISSION_REWARD_TYPE_WEIGHTS .public CopyColorToPaletteDataRgba -.public Debug_Print0 .public DEFAULT_MISSION_REWARD_TYPE_WEIGHTS +.public Debug_Print0 .public DirectoryFileMngr_OpenDirectoryFile .public DungeonSwapIdToIdx .public EnqueueRender3dTiling @@ -26,31 +20,36 @@ .public GetScenarioBalance .public GetType .public HandleSir0TranslationVeneer -.public HasMonsterBeenAttackedInDungeons +.public ITEM_DELIVERY_TABLE .public IsForbiddenFloor .public IsItemAvailableInDungeonGroup .public IsItemInTimeDarkness -.public IsMonsterMissionAllowed .public IsMonsterValid .public IsStoryBeforePoint -.public ITEM_DELIVERY_TABLE -.public MarkPaletteDataAsNeedingUpdate -.public MemAlloc -.public MemcpySimple -.public MemFree -.public MemZero .public MISSION_BANNED_STORY_MONSTERS .public MISSION_DUNGEON_UNLOCK_TABLE .public MISSION_RANK_POINTS +.public MarkPaletteDataAsNeedingUpdate +.public MemAlloc +.public MemFree +.public MemZero +.public MemcpySimple .public MultiplyByFixedPoint .public NO_SEND_ITEM_TABLE .public OUTLAW_MISSION_REWARD_TYPE_WEIGHTS +.public RANK_STRING_PTR_TABLE +.public RESCUE_BIN_UNPACK .public RandInt .public RandIntSafe .public RandRangeSafe -.public RANK_STRING_PTR_TABLE -.public RESCUE_BIN_UNPACK .public RetrieveFromItemList2 +.public UnloadFile +.public _020A3CAD +.public _020A46B0 +.public _020A46D0 +.public _020AFC70 +.public _020B0B04 +.public _s32_div_f .public sub_02001AB0 .public sub_020090A0 .public sub_020090C0 @@ -70,4 +69,3 @@ .public sub_0205E090 .public sub_0206220C .public sub_02064FE4 -.public UnloadFile diff --git a/asm/include/overlay_10_022BCDF4.inc b/asm/include/overlay_10_022BCE44.inc similarity index 99% rename from asm/include/overlay_10_022BCDF4.inc rename to asm/include/overlay_10_022BCE44.inc index cf1e6135..78f19977 100644 --- a/asm/include/overlay_10_022BCDF4.inc +++ b/asm/include/overlay_10_022BCE44.inc @@ -1,6 +1,4 @@ #pragma once -.public _s32_div_f -.public abs .public CreateInventoryMenu .public Debug_Print0 .public DeleteWanTableEntryVeneer @@ -25,6 +23,17 @@ .public MemFree .public MemZero .public OBJ_GRAPHICS_CONTROLS_PTR +.public PlaySeByIdVolumeWrapper +.public SetAnimationControlPausedFlag +.public SetAnimationForAnimationControl +.public SetSpriteIdForAnimationControl +.public SwitchAnimationControlToNextFrame +.public TEAM_MEMBER_TABLE_PTR +.public UnkMapRelatedFunc +.public UpdateWindow +.public WAN_TABLE +.public _s32_div_f +.public abs .public ov10_022BCCB0 .public ov10_022BFE3C .public ov10_022BFE54 @@ -70,10 +79,6 @@ .public ov11_023061CC .public ov11_02306C64 .public ov11_02306C9C -.public PlaySeByIdVolumeWrapper -.public SetAnimationControlPausedFlag -.public SetAnimationForAnimationControl -.public SetSpriteIdForAnimationControl .public strcpy .public sub_02001808 .public sub_0201C108 @@ -87,7 +92,6 @@ .public sub_02027B1C .public sub_0202810C .public sub_0202812C -.public sub_0202830C .public sub_020287C4 .public sub_02028980 .public sub_0202A0B0 @@ -118,9 +122,4 @@ .public sub_020640DC .public sub_0206423C .public sub_020642A8 -.public SwitchAnimationControlToNextFrame -.public TEAM_MEMBER_TABLE_PTR -.public UnkMapRelatedFunc -.public UpdateWindow .public vsprintf -.public WAN_TABLE diff --git a/asm/include/overlay_29_022EAD00.inc b/asm/include/overlay_29_022EAD68.inc similarity index 69% rename from asm/include/overlay_29_022EAD00.inc rename to asm/include/overlay_29_022EAD68.inc index f56723e6..223b1911 100644 --- a/asm/include/overlay_29_022EAD00.inc +++ b/asm/include/overlay_29_022EAD68.inc @@ -1,13 +1,10 @@ #pragma once -.public _s32_div_f .public AdvanceFrame .public ChangeDungeonMusic .public DUNGEON_PTR -.public DungeonRandInt .public FIXED_ROOM_PROPERTIES_TABLE .public IsCurrentFixedRoomBossFight -.public MUSIC_ID_TABLE +.public MusicTableIdxToMusicId .public ov29_022EAE40 -.public RANDOM_MUSIC_ID_TABLE .public sub_02017B18 .public sub_02017C68 diff --git a/asm/include/overlay_29_022EC85C.inc b/asm/include/overlay_29_022EC85C.inc index 8b4ecf50..507965f3 100644 --- a/asm/include/overlay_29_022EC85C.inc +++ b/asm/include/overlay_29_022EC85C.inc @@ -3,10 +3,8 @@ .public ChangeDungeonMusic .public DUNGEON_PTR .public DisplayActions -.public EntityIsValid__022ECDC0 .public GetForcedLossReason .public GetLeader -.public GetMonsterName .public HandleFaint .public IsFloorOver .public LogMessageByIdWithPopupCheckUser @@ -19,4 +17,3 @@ .public ov29_02352380 .public ov29_02352390 .public ov29_02353598 -.public ov29_0237C974 diff --git a/asm/include/overlay_29_022EFB20.inc b/asm/include/overlay_29_022EFB20.inc deleted file mode 100644 index 62a23201..00000000 --- a/asm/include/overlay_29_022EFB20.inc +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -.public DUNGEON_PTR -.public EntityIsValid__022F0590 -.public ov29_022DE5F0 -.public ov29_022EA370 -.public ov29_0234B1A4 -.public ov29_0234D630 -.public ov29_0234D8A0 -.public ov29_023535A4 -.public ov29_0237C9A0 -.public SetAnimationControlPausedFlag -.public WaitUntilAlertBoxPauseIsOver diff --git a/asm/include/overlay_29_022EFB84.inc b/asm/include/overlay_29_022EFB84.inc new file mode 100644 index 00000000..10cbf8b9 --- /dev/null +++ b/asm/include/overlay_29_022EFB84.inc @@ -0,0 +1,4 @@ +#pragma once +.public SetAnimationControlPausedFlag +.public ov29_022EA370 +.public ov29_0234D8A0 diff --git a/asm/include/overlay_29_0230AA0C.inc b/asm/include/overlay_29_0230AA8C.inc similarity index 61% rename from asm/include/overlay_29_0230AA0C.inc rename to asm/include/overlay_29_0230AA8C.inc index 161dcc1d..8a62d9f5 100644 --- a/asm/include/overlay_29_0230AA0C.inc +++ b/asm/include/overlay_29_0230AA8C.inc @@ -1,12 +1,8 @@ #pragma once -.public AFTERMATH_CHANCE -.public DefenderAbilityIsActive__0230A940 .public DUNGEON_PTR -.public DungeonRandOutcome__022EAB20 .public GetTypeMatchup .public GhostImmunityIsActive .public IsTypeIneffectiveAgainstGhost -.public ov29_02352838 .public ScrappyShouldActivate -.public TryAftermathExplosion .public TYPE_MATCHUP_COMBINATOR_TABLE +.public ov29_02352838 diff --git a/asm/main_02001D68.s b/asm/main_02001D68.s index 6ed3b844..66c03a96 100644 --- a/asm/main_02001D68.s +++ b/asm/main_02001D68.s @@ -337,26 +337,3 @@ AddFixedPoint64: ; 0x020021C8 stmia r0, {r1, r2} ldmia sp!, {r3, pc} arm_func_end AddFixedPoint64 - - arm_func_start ClampedLn -ClampedLn: ; 0x020021F4 - cmp r1, #1 - movlt r1, #1 - cmp r1, #0x800 - ldrge r1, _02002220 ; =0x000007FF - ldr r2, _02002224 ; =NATURAL_LOG_VALUE_TABLE - mov r1, r1, lsl #1 - ldrsh r2, [r2, r1] - mov r1, #0 - mov r2, r2, lsl #4 - stmia r0, {r1, r2} - bx lr - .align 2, 0 -_02002220: .word 0x000007FF -_02002224: .word NATURAL_LOG_VALUE_TABLE - arm_func_end ClampedLn - - arm_func_start sub_02002228 -sub_02002228: ; 0x02002228 - bx lr - arm_func_end sub_02002228 diff --git a/asm/main_0200F390.s b/asm/main_0200F390.s index 32fbaf8f..60ced848 100644 --- a/asm/main_0200F390.s +++ b/asm/main_0200F390.s @@ -283,42 +283,3 @@ _0200F704: .align 2, 0 _0200F714: .word BAG_ITEMS_PTR_MIRROR arm_func_end DecrementStackItem - - arm_func_start RemoveItemNoHoleCheck -RemoveItemNoHoleCheck: ; 0x0200F718 - stmdb sp!, {r4, lr} - mvn r1, #0 - cmp r0, r1 - beq _0200F78C - ldr r2, _0200F794 ; =BAG_ITEMS_PTR_MIRROR - mov r1, #6 - ldr r2, [r2] - smulbb r1, r0, r1 - ldr r2, [r2, #0x384] - ldrb r0, [r2, r1] - add r4, r2, r1 - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _0200F78C - ldrb r0, [r4, #1] - cmp r0, #0 - beq _0200F768 - bl sub_020582E0 -_0200F768: - mov r0, r4 - bl ItemZInit - ldr r0, _0200F794 ; =BAG_ITEMS_PTR_MIRROR - mov r1, #0x32 - ldr r0, [r0] - ldr r0, [r0, #0x384] - bl RemoveEmptyItems - mov r0, #1 - ldmia sp!, {r4, pc} -_0200F78C: - mov r0, #0 - ldmia sp!, {r4, pc} - .align 2, 0 -_0200F794: .word BAG_ITEMS_PTR_MIRROR - arm_func_end RemoveItemNoHoleCheck diff --git a/asm/main_02011554.s b/asm/main_02011580.s similarity index 92% rename from asm/main_02011554.s rename to asm/main_02011580.s index 12b4a031..e109cc80 100644 --- a/asm/main_02011554.s +++ b/asm/main_02011580.s @@ -1,23 +1,8 @@ .include "asm/macros.inc" - .include "main_02011554.inc" + .include "main_02011580.inc" .text - arm_func_start ApplyGummiBoostsToTeamMember -ApplyGummiBoostsToTeamMember: ; 0x02011554 - stmdb sp!, {lr} - sub sp, sp, #0xc - mov ip, r0 - stmia sp, {r1, r2, r3} - add r0, ip, #0xc - add r1, ip, #6 - add r2, ip, #0x12 - add r3, ip, #0x14 - bl ApplyGummiBoostsGroundMode - add sp, sp, #0xc - ldmia sp!, {pc} - arm_func_end ApplyGummiBoostsToTeamMember - arm_func_start ApplySitrusBerryBoostToGroundMonster ApplySitrusBerryBoostToGroundMonster: ; 0x02011580 stmdb sp!, {r3, r4, r5, r6, r7, lr} diff --git a/asm/main_0205DFAC.s b/asm/main_0205DFAC.s deleted file mode 100644 index 31d1e7e8..00000000 --- a/asm/main_0205DFAC.s +++ /dev/null @@ -1,38 +0,0 @@ - .include "asm/macros.inc" - .include "main_0205DFAC.inc" - - .text - - arm_func_start CountAndPopulateValidMissionTableMonsters -CountAndPopulateValidMissionTableMonsters: ; 0x0205DFAC - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - ldrh r6, [r1, #2] - ldrh r8, [r1, #4] - mov sl, r0 - mov r7, #0 - bl sub_020627F4 - mov r4, r0 - mov r0, r6, lsl #1 - mov r1, #0xf - bl MemAlloc - mov sb, r0 - mov r5, r7 - add r4, r4, r8, lsl #1 - b _0205E008 -_0205DFE4: - mov r0, r5, lsl #1 - ldrsh r8, [r0, r4] - mov r0, r8 - bl CanMonsterBeUsedForMissionWrapper - cmp r0, #0 - movne r0, r7, lsl #1 - strneh r8, [sb, r0] - addne r7, r7, #1 - add r5, r5, #1 -_0205E008: - cmp r5, r6 - blt _0205DFE4 - mov r0, r7 - str sb, [sl] - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end CountAndPopulateValidMissionTableMonsters diff --git a/asm/main_02062A68.s b/asm/main_02062AD0.s similarity index 98% rename from asm/main_02062A68.s rename to asm/main_02062AD0.s index e7dfcd2b..8c06847e 100644 --- a/asm/main_02062A68.s +++ b/asm/main_02062AD0.s @@ -1,39 +1,8 @@ .include "asm/macros.inc" - .include "main_02062A68.inc" + .include "main_02062AD0.inc" .text - arm_func_start CanMonsterBeUsedForMission -CanMonsterBeUsedForMission: ; 0x02062A68 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - bl FemaleToMaleForm - mov r4, r0 - bl HasMonsterBeenAttackedInDungeons - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, r4 - bl GetBaseForm - cmp r4, r0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, pc} - cmp r5, #0 - beq _02062AB8 - mov r0, r4 - bl IsMonsterMissionAllowed - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} -_02062AB8: - mov r0, r4 - bl IsMonsterMissionAllowedStory - cmp r0, #0 - moveq r0, #0 - movne r0, #1 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end CanMonsterBeUsedForMission - arm_func_start sub_02062AD0 sub_02062AD0: ; 0x02062AD0 stmdb sp!, {r3, lr} diff --git a/asm/overlay_10_022BCDF4.s b/asm/overlay_10_022BCE44.s similarity index 99% rename from asm/overlay_10_022BCDF4.s rename to asm/overlay_10_022BCE44.s index 32b5afe0..c4bcc235 100644 --- a/asm/overlay_10_022BCDF4.s +++ b/asm/overlay_10_022BCE44.s @@ -1,33 +1,8 @@ .include "asm/macros.inc" - .include "overlay_10_022BCDF4.inc" + .include "overlay_10_022BCE44.inc" .text - arm_func_start ov10_022BCDF4 -ov10_022BCDF4: ; 0x022BCDF4 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - bl GetWindowContents - mov r4, r0 - mov r0, #1 - mov r1, #0 - strb r0, [r4, #0x1a0] - mov r0, r5 - strb r1, [r4, #0x1a1] - sub r1, r1, #4 - bl sub_0202830C - ldr r0, [r4, #0xf8] - tst r0, #0x400000 - beq _022BCE38 - mov r0, r5 - add r1, r4, #4 - bl sub_02028980 -_022BCE38: - mov r0, #5 - str r0, [r4, #0x19c] - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ov10_022BCDF4 - arm_func_start ov10_022BCE44 ov10_022BCE44: ; 0x022BCE44 stmdb sp!, {r3, lr} diff --git a/asm/overlay_29_022E41F0.s b/asm/overlay_29_022E41F0.s index fcdc07c0..f6c53bb7 100644 --- a/asm/overlay_29_022E41F0.s +++ b/asm/overlay_29_022E41F0.s @@ -90,27 +90,3 @@ ov29_022E42E0: ; 0x022E42E0 ov29_022E42E4: ; 0x022E42E4 bx lr arm_func_end ov29_022E42E4 - - arm_func_start PlayEffectAnimationEntityStandard -PlayEffectAnimationEntityStandard: ; 0x022E42E8 - stmdb sp!, {r3, r4, r5, lr} - sub sp, sp, #0x10 - mov r4, r1 - mov r5, r0 - mov r0, r4 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r5 - mov r1, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end PlayEffectAnimationEntityStandard diff --git a/asm/overlay_29_022EAD00.s b/asm/overlay_29_022EAD68.s similarity index 60% rename from asm/overlay_29_022EAD00.s rename to asm/overlay_29_022EAD68.s index aea9ed7e..ce0d06c8 100644 --- a/asm/overlay_29_022EAD00.s +++ b/asm/overlay_29_022EAD68.s @@ -1,39 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_022EAD00.inc" + .include "overlay_29_022EAD68.inc" .text - arm_func_start MusicTableIdxToMusicId -MusicTableIdxToMusicId: ; 0x022EAD00 - stmdb sp!, {r4, lr} - mov r1, #0xaa - bl _s32_div_f - ldr r0, _022EAD5C ; =MUSIC_ID_TABLE - mov r1, r1, lsl #1 - ldrh r4, [r0, r1] - tst r4, #0x8000 - ldreq r0, _022EAD60 ; =0x00007FFF - andeq r0, r4, r0 - moveq r0, r0, lsl #0x10 - moveq r0, r0, lsr #0x10 - ldmeqia sp!, {r4, pc} - mov r0, #4 - bl DungeonRandInt - ldr r1, _022EAD60 ; =0x00007FFF - mov r0, r0, lsl #0x10 - and r1, r4, r1 - ldr r3, _022EAD64 ; =RANDOM_MUSIC_ID_TABLE - mov r1, r1, lsl #0x10 - mov r2, r0, asr #0xf - add r0, r3, r1, lsr #13 - ldrh r0, [r2, r0] - ldmia sp!, {r4, pc} - .align 2, 0 -_022EAD5C: .word MUSIC_ID_TABLE -_022EAD60: .word 0x00007FFF -_022EAD64: .word RANDOM_MUSIC_ID_TABLE - arm_func_end MusicTableIdxToMusicId - arm_func_start ov29_022EAD68 ov29_022EAD68: ; 0x022EAD68 #ifdef JAPAN diff --git a/asm/overlay_29_022EC85C.s b/asm/overlay_29_022EC85C.s index 8a5da291..56e53d27 100644 --- a/asm/overlay_29_022EC85C.s +++ b/asm/overlay_29_022EC85C.s @@ -425,23 +425,3 @@ _022ECD0C: _022ECD7C: .word DUNGEON_PTR _022ECD80: .word 0x0000025D arm_func_end DecrementWindCounter - - arm_func_start ov29_022ECD84 -ov29_022ECD84: ; 0x022ECD84 - stmdb sp!, {r4, lr} - mov r4, r0 - bl EntityIsValid__022ECDC0 - cmp r0, #0 - ldmeqia sp!, {r4, pc} - ldr r0, [r4] - cmp r0, #1 - ldmneia sp!, {r4, pc} - ldr r1, [r4, #0xb4] - cmp r1, #0 - ldmeqia sp!, {r4, pc} - ldr r0, _022ECDBC ; =ov29_0237C974 - bl GetMonsterName - ldmia sp!, {r4, pc} - .align 2, 0 -_022ECDBC: .word ov29_0237C974 - arm_func_end ov29_022ECD84 diff --git a/asm/overlay_29_022EFB20.s b/asm/overlay_29_022EFB84.s similarity index 91% rename from asm/overlay_29_022EFB20.s rename to asm/overlay_29_022EFB84.s index b700466e..681be774 100644 --- a/asm/overlay_29_022EFB20.s +++ b/asm/overlay_29_022EFB84.s @@ -1,39 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_022EFB20.inc" + .include "overlay_29_022EFB84.inc" .text - arm_func_start ov29_022EFB20 -ov29_022EFB20: ; 0x022EFB20 - stmdb sp!, {r3, lr} - cmp r0, #0 - beq _022EFB48 - mov r0, #0xa - bl WaitUntilAlertBoxPauseIsOver - mov r0, #0 - bl ov29_0234B1A4 - mov r0, #0xa - mov r1, #0x62 - bl ov29_022EA370 -_022EFB48: - bl ov29_0234D630 - ldr r1, _022EFB7C ; =ov29_023535A4 - mvn r2, #1 - mov r0, #1 - strb r2, [r1] - bl ov29_022DE5F0 - ldr r1, _022EFB80 ; =ov29_0237C9A0 - strh r0, [r1, #2] - mov r0, #0 - bl ov29_022DE5F0 - ldr r1, _022EFB80 ; =ov29_0237C9A0 - strh r0, [r1] - ldmia sp!, {r3, pc} - .align 2, 0 -_022EFB7C: .word ov29_023535A4 -_022EFB80: .word ov29_0237C9A0 - arm_func_end ov29_022EFB20 - arm_func_start ov29_022EFB84 ov29_022EFB84: ; 0x022EFB84 stmdb sp!, {r4, lr} @@ -719,38 +688,3 @@ UnfreezeAnim: ; 0x022F0518 .align 2, 0 _022F0530: .word SetAnimationControlPausedFlag arm_func_end UnfreezeAnim - - arm_func_start ov29_022F0534 -ov29_022F0534: ; 0x022F0534 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - ldr r4, _022F058C ; =DUNGEON_PTR - mov r7, r0 - mov r5, #0 -_022F0544: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r6, [r0, #0xad4] -#else - ldr r6, [r0, #0xb78] -#endif - mov r0, r6 - bl EntityIsValid__022F0590 - cmp r0, #0 - beq _022F057C - cmp r7, #0 - mov r0, r6 - bne _022F0578 - bl UnfreezeAnim - b _022F057C -_022F0578: - bl FreezeAnim -_022F057C: - add r5, r5, #1 - cmp r5, #0x14 - blt _022F0544 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_022F058C: .word DUNGEON_PTR - arm_func_end ov29_022F0534 diff --git a/asm/overlay_29_0230AA0C.s b/asm/overlay_29_0230AA8C.s similarity index 61% rename from asm/overlay_29_0230AA0C.s rename to asm/overlay_29_0230AA8C.s index 5ec0361b..fb8df5ed 100644 --- a/asm/overlay_29_0230AA0C.s +++ b/asm/overlay_29_0230AA8C.s @@ -1,49 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_0230AA0C.inc" + .include "overlay_29_0230AA8C.inc" .text - arm_func_start AftermathCheck -AftermathCheck: ; 0x0230AA0C - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #8 - mov r4, r2 - mov r2, #0x76 -#ifndef JAPAN - mov r3, #1 -#endif - mov r6, r0 - mov r5, r1 - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230AA78 - ldr r0, _0230AA84 ; =AFTERMATH_CHANCE - ldrsh r0, [r0] - bl DungeonRandOutcome__022EAB20 - cmp r0, #0 - ldrne ip, _0230AA88 ; =0x0000026F - cmpne r4, ip - beq _0230AA78 - mov r0, #0 - str r0, [sp] - mov r0, r6 - mov r1, r5 - add r2, r5, #4 - mov r3, #1 - str ip, [sp, #4] - bl TryAftermathExplosion - mov r0, #1 - b _0230AA7C -_0230AA78: - mov r0, #0 -_0230AA7C: - add sp, sp, #8 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0230AA84: .word AFTERMATH_CHANCE -_0230AA88: .word 0x0000026F - arm_func_end AftermathCheck - arm_func_start GetTypeMatchupBothTypes GetTypeMatchupBothTypes: ; 0x0230AA8C stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} diff --git a/include/dungeon_logic_6.h b/include/dungeon_logic_6.h index 8f4ca015..d95e006a 100644 --- a/include/dungeon_logic_6.h +++ b/include/dungeon_logic_6.h @@ -7,5 +7,6 @@ bool8 IsBehaviorLoneOutlaw(enum monster_behavior behavior); // Checks if a behavior ID corresponds to one of the Secret Bazaar NPCs. bool8 IsSecretBazaarNpcBehavior(enum monster_behavior behavior); +void ov29_022EFB20(bool8 param_1); #endif //PMDSKY_DUNGEON_LOGIC_6_H diff --git a/include/main_0200224C.h b/include/main_0200224C.h index 929a9c09..83bce7fd 100644 --- a/include/main_0200224C.h +++ b/include/main_0200224C.h @@ -1,6 +1,10 @@ #ifndef PMDSKY_MAIN_0200224C_H #define PMDSKY_MAIN_0200224C_H +#include "main_02001BB4.h" + +void ClampedLn(struct fixed_point_64 *out, s32 x); +void sub_02002228(u32 param_1); u16 GetRngSeed(void); void SetRngSeed(u16 seed); u16 Rand16Bit(); diff --git a/include/main_0200F798.h b/include/main_0200F798.h index 3601f6fe..5ac343c2 100644 --- a/include/main_0200F798.h +++ b/include/main_0200F798.h @@ -3,6 +3,7 @@ #include "item.h" +u32 RemoveItemNoHoleCheck(s16 index); s16 GetFirstUnequippedItemOfType(s16 type); u32 RemoveItemNoHoleCheck(s16 index); diff --git a/include/main_020114F8.h b/include/main_020114F8.h index c7113562..36af878a 100644 --- a/include/main_020114F8.h +++ b/include/main_020114F8.h @@ -5,5 +5,6 @@ void SwapShopFreeDoublePointer(void** p); void ApplyGummiBoostsToGroundMonster(struct ground_monster *monster, s16 item_id, int a3, void *a4); +void ApplyGummiBoostsToTeamMember(struct team_member *member, s16 item_id, int a3, void *a4); #endif diff --git a/include/main_0205D11C.h b/include/main_0205D11C.h index 44868f67..a5899f20 100644 --- a/include/main_0205D11C.h +++ b/include/main_0205D11C.h @@ -23,5 +23,6 @@ bool8 CheckMonsterForMissionType(enum mission_type type, union mission_subtype* bool8 CheckItemForMissionType(u32 r0, union mission_subtype *r1, s16 r2); bool8 sub_0205D1F4(struct mission *mission); s32 GenerateMission(struct unk_0205D224 *tmpl, struct mission *mission); +s32 CountAndPopulateValidMissionTableMonsters(s16 **out, struct unk_0205DFAC *spec); #endif //PMDSKY_MAIN_0205D11C_H diff --git a/include/main_02062A58.h b/include/main_02062A58.h index b88dba87..e6cdeb6b 100644 --- a/include/main_02062A58.h +++ b/include/main_02062A58.h @@ -6,5 +6,6 @@ bool8 CanMonsterBeUsedForMission(s16 id, bool8 flag); bool8 CanMonsterBeUsedForMissionWrapper(s16 id); +bool8 CanMonsterBeUsedForMission(s16 id, bool8 flag); #endif diff --git a/include/overlay_10_022BCC60.h b/include/overlay_10_022BCC60.h index b7109afd..f26810e8 100644 --- a/include/overlay_10_022BCC60.h +++ b/include/overlay_10_022BCC60.h @@ -14,5 +14,6 @@ s32 IsInventoryMenuActive(s32 window_id); bool8 CheckInventoryMenuField0x1A0(s32 window_id); s32 ov10_022BCDA8(s32 window_id); s32 ov10_022BCDBC(s32 window_id); +void ov10_022BCDF4(s32 window_id); #endif //PMDSKY_OVERLAY_10_022BCC60_H diff --git a/include/overlay_29_022E4338.h b/include/overlay_29_022E4338.h index 47ecf5e3..20a76067 100644 --- a/include/overlay_29_022E4338.h +++ b/include/overlay_29_022E4338.h @@ -3,6 +3,7 @@ #include "dungeon_mode.h" +void PlayEffectAnimationEntityStandard(struct entity *entity, s32 anim_id); void ov29_022E4338(struct entity *entity); void ov29_022E4388(struct entity *entity); void ov29_022E43D8(struct entity *entity); diff --git a/include/overlay_29_022EAC7C.h b/include/overlay_29_022EAC7C.h index bde40a82..2fc79dfe 100644 --- a/include/overlay_29_022EAC7C.h +++ b/include/overlay_29_022EAC7C.h @@ -1,6 +1,8 @@ #ifndef PMDSKY_OVERLAY_29_022EAC7C_H #define PMDSKY_OVERLAY_29_022EAC7C_H +#include "dungeon.h" + void PlayLevelUpSound(void); void PlayDungeonTipSound__022EB63C(void); void ov29_022EAC9C(void); @@ -8,5 +10,6 @@ void ov29_022EACAC(void); void PlayDungeonTipSound__022EB66C(void); void PlaySeByIdIfNotSilence(s32 id); void PlayMeByIdIfNot998(s32 id); +enum music_id MusicTableIdxToMusicId(s32 music_table_idx); #endif diff --git a/include/overlay_29_022ECDC0.h b/include/overlay_29_022ECDC0.h index 1dca1719..037ad1dc 100644 --- a/include/overlay_29_022ECDC0.h +++ b/include/overlay_29_022ECDC0.h @@ -3,6 +3,7 @@ #include "dungeon_mode.h" +void ov29_022ECD84(struct entity *entity); // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__022ECDC0(struct entity *entity); diff --git a/include/overlay_29_022F0590.h b/include/overlay_29_022F0590.h index 6acc5a2f..6f0e8630 100644 --- a/include/overlay_29_022F0590.h +++ b/include/overlay_29_022F0590.h @@ -5,6 +5,7 @@ #include "dungeon_mode.h" +void ov29_022F0534(bool8 freeze); // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__022F0590(struct entity *entity); void ov29_022F05B4(struct entity* a, struct entity* b, bool8 freeze); diff --git a/include/overlay_29_0230A9DC.h b/include/overlay_29_0230A9DC.h index 97caea87..bb31211c 100644 --- a/include/overlay_29_0230A9DC.h +++ b/include/overlay_29_0230A9DC.h @@ -5,5 +5,6 @@ // Checks if a monster is holding a certain item that isn't disabled by Klutz. bool8 ItemIsActive__0230A9DC(struct entity *entity, enum item_id item_id); +bool8 AftermathCheck(struct entity *attacker, struct entity *defender, s32 damage_source); #endif //PMDSKY_OVERLAY_29_0230A9DC_H diff --git a/main.lsf b/main.lsf index f036ca29..8b84db62 100644 --- a/main.lsf +++ b/main.lsf @@ -95,7 +95,7 @@ Static main Object src/exclusive_item.o Object asm/main_02010FC4.o Object src/main_020114F8.o - Object asm/main_02011554.o + Object asm/main_02011580.o Object src/main_02011830.o Object asm/main_02011850.o Object src/main_02011DF0.o @@ -348,7 +348,6 @@ Static main Object src/main_0205C73C.o Object asm/main_0205CA40.o Object src/main_0205D11C.o - Object asm/main_0205DFAC.o Object src/main_0205E01C.o Object src/main_0205E288.o Object asm/main_0205E48C.o @@ -363,7 +362,7 @@ Static main Object src/main_0205ED84.o Object asm/main_0205EDA4.o Object src/main_02062A58.o - Object asm/main_02062A68.o + Object asm/main_02062AD0.o Object src/main_02064FFC.o Object src/main_02065974.o Object asm/main_02065998.o @@ -612,7 +611,7 @@ Overlay OVY_10 After main Object asm/overlay_10.o Object src/overlay_10_022BCC60.o - Object asm/overlay_10_022BCDF4.o + Object asm/overlay_10_022BCE44.o Object src/overlay_10_022BFD58.o Object asm/overlay_10_022BFF78.o Object src/overlay_10_022C2574.o @@ -850,7 +849,7 @@ Overlay OVY_29 Object asm/overlay_29_022EAB50.o Object src/overlay_29_022EAC34.o Object src/overlay_29_022EAC7C.o - Object asm/overlay_29_022EAD00.o + Object asm/overlay_29_022EAD68.o Object src/overlay_29_022EAE14.o Object asm/overlay_29_022EAE40.o Object src/overlay_29_022EAEFC.o @@ -884,7 +883,7 @@ Overlay OVY_29 Object asm/overlay_29_rodata_0235179C.o Object src/overlay_29_022EFA6C.o Object src/dungeon_logic_6.o - Object asm/overlay_29_022EFB20.o + Object asm/overlay_29_022EFB84.o Object src/overlay_29_022F0590.o Object asm/overlay_29_022F0654.o Object src/overlay_29_022F0EDC.o @@ -981,7 +980,7 @@ Overlay OVY_29 Object src/overlay_29_02308FBC.o Object src/overlay_29_0230A994.o Object src/overlay_29_0230A9DC.o - Object asm/overlay_29_0230AA0C.o + Object asm/overlay_29_0230AA8C.o Object src/overlay_29_0230AB58.o Object asm/overlay_29_0230ABF0.o Object src/type_effectiveness.o diff --git a/src/dungeon_logic_6.c b/src/dungeon_logic_6.c index d1858fcb..ca9be477 100644 --- a/src/dungeon_logic_6.c +++ b/src/dungeon_logic_6.c @@ -3,6 +3,15 @@ #include "dungeon_mode.h" #include "util.h" + +#include "overlay_29_0234BA54.h" +extern s16 ov29_022DE5F0(s32 index); +extern void ov29_022EA370(s32 a, s32 b); +extern int ov29_0234B1A4(); +extern void ov29_0234D630(void); +extern s8 ov29_023535A4; +extern s16 ov29_0237C9A0[2]; + bool8 IsBehaviorLoneOutlaw(enum monster_behavior behavior) { bool8 result; @@ -28,3 +37,16 @@ bool8 IsSecretBazaarNpcBehavior(enum monster_behavior behavior) return TRUE; return FALSE; } + +void ov29_022EFB20(bool8 param_1) +{ + if (param_1) { + WaitUntilAlertBoxPauseIsOver(10); + ov29_0234B1A4(0); + ov29_022EA370(10, 0x62); + } + ov29_0234D630(); + ov29_023535A4 = -2; + ov29_0237C9A0[1] = ov29_022DE5F0(1); + ov29_0237C9A0[0] = ov29_022DE5F0(0); +} diff --git a/src/main_02000C6C.c b/src/main_02000C6C.c index 1bdbbe37..14c61859 100644 --- a/src/main_02000C6C.c +++ b/src/main_02000C6C.c @@ -1,10 +1,10 @@ #include "main_02000C6C.h" #include +#include "main_0200224C.h" extern u32 _02092448; extern u32 _02092460; -extern void sub_02002228(u32); extern void sub_020024D4(); extern void sub_020024E4(); extern void sub_020028AC(); diff --git a/src/main_0200224C.c b/src/main_0200224C.c index 4f5312c7..a5406c4a 100644 --- a/src/main_0200224C.c +++ b/src/main_0200224C.c @@ -1,5 +1,24 @@ #include "main_0200224C.h" +extern s16 NATURAL_LOG_VALUE_TABLE[]; + + +void ClampedLn(struct fixed_point_64 *out, s32 x) +{ + if (x < 1) { + x = 1; + } + if (x >= 0x800) { + x = 0x7FF; + } + out->lower = NATURAL_LOG_VALUE_TABLE[x] << 4; + out->upper = 0; +} + +void sub_02002228(u32 param_1) +{ +} + extern u16 PRNG_SEQUENCE_NUM; u16 GetRngSeed(void) diff --git a/src/main_0200F798.c b/src/main_0200F798.c index 0f571643..edb1b225 100644 --- a/src/main_0200F798.c +++ b/src/main_0200F798.c @@ -1,5 +1,30 @@ #include "main_0200F798.h" + + +#include "main_0200D81C.h" +#include "item.h" +extern struct bag_items *BAG_ITEMS_PTR_MIRROR; +extern u32 RemoveEmptyItems(struct item *items, s32 count); +extern void sub_020582E0(u8 held_by); +u32 RemoveItemNoHoleCheck(s16 index) +{ + if (index != -1) { + struct item *item = &BAG_ITEMS_PTR_MIRROR->bag_items->bag_items[index]; + bool8 exists = (item->flags & ITEM_FLAG_EXISTS) != 0; + + if (exists) { + if (item->held_by != 0) + sub_020582E0(item->held_by); + + ItemZInit(item); + RemoveEmptyItems(BAG_ITEMS_PTR_MIRROR->bag_items->bag_items, INVENTORY_SIZE); + return 1; + } + } + return 0; +} + u32 RemoveFirstUnequippedItemOfType(s16 type) { return RemoveItemNoHoleCheck(GetFirstUnequippedItemOfType(type)); diff --git a/src/main_020114F8.c b/src/main_020114F8.c index e9f3945e..02408063 100644 --- a/src/main_020114F8.c +++ b/src/main_020114F8.c @@ -19,3 +19,9 @@ void ApplyGummiBoostsToGroundMonster(struct ground_monster *monster, s16 item_id ApplyGummiBoostsGroundMode(&monster->id, &monster->iq, monster->offensive_stats, monster->defensive_stats, item_id, a3, a4); } + +void ApplyGummiBoostsToTeamMember(struct team_member *member, s16 item_id, int a3, void *a4) +{ + ApplyGummiBoostsGroundMode((s16 *)&member->id, &member->iq, member->offensive_stats, + member->defensive_stats, item_id, a3, a4); +} diff --git a/src/main_0205D11C.c b/src/main_0205D11C.c index 2b8a8bfe..a9ddd941 100644 --- a/src/main_0205D11C.c +++ b/src/main_0205D11C.c @@ -30,7 +30,6 @@ extern s32 RandIntSafe(s32 n); extern void ClearMissionData(struct mission *mission); extern struct mission_deliver_list MISSION_DELIVER_LIST_PTR; extern s32 CanDungeonBeUsedForMission(enum dungeon_id); -extern s32 CountAndPopulateValidMissionTableMonsters(s16 **out, struct unk_0205DFAC *spec); extern s32 GetAllPossibleMonsters(s16 **out); extern u8 GetMissionSpecificFixedRoom(enum mission_type, u32); extern bool8 IsAvailableItem(s16 item_id); @@ -744,3 +743,29 @@ s32 GenerateMission(struct unk_0205D224 *tmpl, struct mission *mission) return 0; } + +s32 CountAndPopulateValidMissionTableMonsters(s16 **out, struct unk_0205DFAC *spec) +{ + s16 *base; + s32 i; + s32 n; + s32 k; + s16 v; + s16 *buf; + s32 off; + + n = spec->field_0x2; + off = (u16)spec->field_0x4; + k = 0; + base = sub_020627F4(); + buf = (s16 *)MemAlloc(n * 2, 0xf); + for (i = 0; i < n; i++) { + v = base[off + i]; + if (CanMonsterBeUsedForMissionWrapper(v) != 0) { + buf[k] = v; + k++; + } + } + *out = buf; + return k; +} diff --git a/src/main_02062A58.c b/src/main_02062A58.c index bb2346d6..972ed57f 100644 --- a/src/main_02062A58.c +++ b/src/main_02062A58.c @@ -1,6 +1,36 @@ #include "main_02062A58.h" + + +#include "main_02054BE0.h" +#include "main_0204D188.h" +#include "enums.h" +extern s16 GetBaseForm(s16 id); +extern bool8 IsMonsterMissionAllowed(s16 id); +extern bool8 IsMonsterMissionAllowedStory(s16 id); bool8 CanMonsterBeUsedForMissionWrapper(s16 id) { return CanMonsterBeUsedForMission(id, TRUE); } + +bool8 CanMonsterBeUsedForMission(s16 id, bool8 flag) +{ + s16 m; + + m = FemaleToMaleForm(id); + if (!HasMonsterBeenAttackedInDungeons(m)) { + return FALSE; + } + if (m != GetBaseForm(m)) { + return FALSE; + } + if (flag) { + if (!IsMonsterMissionAllowed(m)) { + return FALSE; + } + } + if (!IsMonsterMissionAllowedStory(m)) { + return FALSE; + } + return TRUE; +} diff --git a/src/overlay_10_022BCC60.c b/src/overlay_10_022BCC60.c index 0cf69f47..ce9743d8 100644 --- a/src/overlay_10_022BCC60.c +++ b/src/overlay_10_022BCC60.c @@ -3,6 +3,7 @@ #include "main_02001188.h" #include "main_02028080.h" #include "main_020282F4.h" +extern void sub_02028980(s32 window_id, void *p); extern void sub_020333FC(void *p); @@ -116,3 +117,16 @@ s32 ov10_022BCDBC(s32 window_id) return -1; } + +void ov10_022BCDF4(s32 window_id) +{ + struct unk_0202AAA8 *w = GetWindowContents(window_id); + + w->field_0x1A0 = 1; + w->field_0x1A1 = 0; + sub_0202830C(window_id, -4); + if (w->field_0xF8 & 0x400000) { + sub_02028980(window_id, (void *) w + 4); + } + w->field_0x19C = 5; +} diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index 8a6a036a..6dcc3aa9 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -102,14 +102,12 @@ extern void InitPreprocessorArgs(struct preprocessor_args *); extern s32 IsScrollBoxActive(s8); extern void ShowDialogueBox(s8); extern void ShowStringIdInDialogueBox(s8, s32, s32, void *); extern void ov11_022DC504(void); extern u8 *strcpy(u8 *dest, const u8 *src); -extern void ApplyGummiBoostsToTeamMember(struct team_member *, s16, int, void *); extern s8 CreateInventoryMenuOuter(s32, s32, s32, void *, void *, void *, u8); extern bool8 IsBagNotEmpty(void); extern u8 PopInventoryMenuField0x1A3(s32 window_id); extern void SetItemAcquired(struct item *); extern void SortItemsInBag(void); extern void *memcpy(void *, const void *, u32); -extern void ov10_022BCDF4(s32 window_id); extern void ov11_02308D48(void); extern void *ov11_02308DD8(void *); extern void ov11_02308EDC(void); diff --git a/src/overlay_29_022E4338.c b/src/overlay_29_022E4338.c index feb66273..501970e8 100644 --- a/src/overlay_29_022E4338.c +++ b/src/overlay_29_022E4338.c @@ -1,5 +1,16 @@ #include "overlay_29_022E4338.h" +extern s32 GetEffectAnimationWanOffset(s32 id); +extern void PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, + s32 c, s32 d, s32 e, s32 f); + + +void PlayEffectAnimationEntityStandard(struct entity *entity, s32 anim_id) +{ + PlayEffectAnimationEntity(entity, anim_id, 1, GetEffectAnimationWanOffset(anim_id), + 2, 0, -1, 0); +} + extern s32 GetEffectAnimationWanOffset(s32 id); extern void PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, diff --git a/src/overlay_29_022EAC7C.c b/src/overlay_29_022EAC7C.c index 11f7e65b..1c8d1c73 100644 --- a/src/overlay_29_022EAC7C.c +++ b/src/overlay_29_022EAC7C.c @@ -1,5 +1,10 @@ #include "overlay_29_022EAC7C.h" + +#include "dg_random.h" +extern u16 MUSIC_ID_TABLE[170]; +extern enum music_id RANDOM_MUSIC_ID_TABLE[30][4]; + extern void sub_02017C50(s32 id); extern void sub_02017C74(s32, s32); @@ -45,3 +50,14 @@ void PlayMeByIdIfNot998(s32 id) sub_02017C50(id); } + +enum music_id MusicTableIdxToMusicId(s32 music_table_idx) +{ + s32 music = MUSIC_ID_TABLE[music_table_idx % 170]; + + if (music & 0x8000) { + s16 rand = DungeonRandInt(4); + return RANDOM_MUSIC_ID_TABLE[(u16)(music & 0x7FFF)][rand]; + } + return (enum music_id)(music & 0x7FFF); +} diff --git a/src/overlay_29_022ECDC0.c b/src/overlay_29_022ECDC0.c index e71987df..074d6552 100644 --- a/src/overlay_29_022ECDC0.c +++ b/src/overlay_29_022ECDC0.c @@ -1,5 +1,19 @@ #include "overlay_29_022ECDC0.h" #include "dungeon_util_static.h" +#include "overlay_29_023000E4.h" + +extern char ov29_0237C974[40]; + +void ov29_022ECD84(struct entity *entity) +{ + if (!EntityIsValid__022ECDC0(entity)) + return; + if (entity->type != ENTITY_MONSTER) + return; + if (entity->info == 0) + return; + GetMonsterName(ov29_0237C974, (struct monster *)entity->info); +} bool8 EntityIsValid__022ECDC0(struct entity *entity) { diff --git a/src/overlay_29_022F0590.c b/src/overlay_29_022F0590.c index 1fa23288..860ea13a 100644 --- a/src/overlay_29_022F0590.c +++ b/src/overlay_29_022F0590.c @@ -1,10 +1,31 @@ #include "overlay_29_022F0590.h" - +#include "dungeon.h" +extern struct dungeon *DUNGEON_PTR[]; +extern bool8 EntityIsValid__022F0590(struct entity *entity); extern void FreezeAnim(struct entity *e); - extern void UnfreezeAnim(struct entity *e); + +void ov29_022F0534(bool8 freeze) +{ + s32 i; + + for (i = 0; i < 20; i++) + { + struct entity *entity = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (EntityIsValid__022F0590(entity)) + { + if (!freeze) + UnfreezeAnim(entity); + else + FreezeAnim(entity); + } + } +} + + + extern void ov29_022F0AE0(void); extern void ov29_0234D668(void); @@ -16,6 +37,9 @@ extern void ov29_022EA370(s32 a, s32 b); extern s32 TalkToSecretBazaarNpc(s32 a, struct entity *b, s32 c, s32 d, s32 e); #include "dungeon_util_static.h" +extern void FreezeAnim(struct entity *e); +extern void UnfreezeAnim(struct entity *e); + bool8 EntityIsValid__022F0590(struct entity *entity) { if (entity == NULL) diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index 9de9eb2f..611e4a4d 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -51,6 +51,8 @@ #include "overlay_29_022E9FC0.h" #include "overlay_29_0234B340.h" #include "overlay_29_0234B4BC.h" +#include "overlay_29_022EAC7C.h" +#include "overlay_29_022ECDC0.h" struct unk_023535DC { u8 field_0x0; @@ -99,7 +101,6 @@ extern s16 ov10_022C45C0; extern s16 ov10_022C4638; extern s16 ov10_022C467C; extern void AddExpSpecial(struct entity* attacker, struct entity* defender, s32 base_exp); -extern bool8 AftermathCheck(struct entity *attacker, struct entity *defender, s32 damage_source); extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); extern void ChangeMonsterAnimationToIdle(struct entity* monster, enum direction_id direction); extern void DisplayAnimatedNumbers(s32 amount, struct entity *entity, bool8 display_sign, s32 number_color); @@ -114,7 +115,6 @@ extern void HandleFaint(struct entity *fainted_entity, s32 damage_source, struct extern bool8 IsMonsterIdInNormalRangeVeneer(enum monster_id monster_id); extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); extern void MoveMonsterToPos(struct entity* entity, s32 x_pos, s32 y_pos, bool8 reset_prev_pos_fields); -extern enum music_id MusicTableIdxToMusicId(s32 music_table_idx); extern s32 PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, s32 c, s32 d, s32 e, s32 f); extern int PlayMissSfx__022E611C(); extern int PlayMissSfx__022E6150(); @@ -136,10 +136,7 @@ extern int ov29_022E5478(); extern int ov29_022E550C(); extern void ov29_022E81F8(void); extern void ov29_022EA370(s32 a, s32 b); -extern int ov29_022ECD84(); -extern int ov29_022EFB20(); extern int ov29_022EFB84(); -extern int ov29_022F0534(); extern int ov29_022F0780(); extern int ov29_022F9AF4(); extern int ov29_022FB98C(); diff --git a/src/overlay_29_0230A9DC.c b/src/overlay_29_0230A9DC.c index 815a21e8..2cc3b176 100644 --- a/src/overlay_29_0230A9DC.c +++ b/src/overlay_29_0230A9DC.c @@ -2,6 +2,13 @@ #include "dungeon_items.h" #include "dungeon_pokemon_attributes.h" + + +#include "overlay_29_0230A994.h" +#include "enums.h" +extern bool8 DungeonRandOutcome__022EAB20(s32 percentChance); +extern void TryAftermathExplosion(struct entity *attacker, struct entity *defender, struct position *pos, s32 radius, s32 a, s32 damage_source); +extern const s16 AFTERMATH_CHANCE; bool8 ItemIsActive__0230A9DC(struct entity *entity, enum item_id item_id) { if (AbilityIsActiveVeneer(entity, ABILITY_KLUTZ)) @@ -9,3 +16,18 @@ bool8 ItemIsActive__0230A9DC(struct entity *entity, enum item_id item_id) return HasHeldItem(entity, item_id); } + +bool8 AftermathCheck(struct entity *attacker, struct entity *defender, s32 damage_source) +{ +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_AFTERMATH) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_AFTERMATH, TRUE) +#endif + && DungeonRandOutcome__022EAB20(AFTERMATH_CHANCE) + && damage_source != DAMAGE_SOURCE_EXPLOSION) { + TryAftermathExplosion(attacker, defender, &defender->pos, 1, 0, DAMAGE_SOURCE_EXPLOSION); + return TRUE; + } + return FALSE; +} diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c index c0f0b885..506605b9 100644 --- a/src/overlay_29_0230BBAC.c +++ b/src/overlay_29_0230BBAC.c @@ -27,6 +27,7 @@ #include "dungeon_util_2.h" #include "overlay_29_02338350.h" #include "overlay_29_0234B340.h" +#include "main_0200224C.h" extern struct dungeon *DUNGEON_PTR; extern u8 GetMonsterGenderVeneer(s16 monster_id); @@ -35,7 +36,6 @@ extern u8 ExclusiveItemDefenseBoost(struct entity *entity, s32 idx); extern int MoveIsNotPhysical(enum move_id move_id); extern s32 FixedPoint64ToInt(struct fixed_point_64 *x); extern void AddFixedPoint64(struct fixed_point_64 *out, struct fixed_point_64 *a, struct fixed_point_64 *b); -extern void ClampedLn(struct fixed_point_64 *out, s32 x); extern int IsRecoilMove(enum move_id move_id); extern void PlayEffectAnimation0x1A9__022E6130(struct entity *entity); extern void PlayEffectAnimation0x1A9__022E617C(struct entity *entity); diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index a79e0d18..38489a5e 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -25,6 +25,7 @@ #include "overlay_29_023061A8.h" #include "overlay_29_022E99F0.h" #include "overlay_29_02305C04.h" +#include "overlay_29_022E4338.h" #ifdef JAPAN #define MESSAGE_DE6 0xB26 @@ -67,7 +68,6 @@ extern void WaitUntilAlertBoxTextIsLoadedWrapper(void); extern void EnsureCanStandCurrentTile(struct entity *entity); extern void ov29_022E543C(struct entity *entity); extern void ov29_022E53F0(struct entity *entity); -extern void PlayEffectAnimationEntityStandard(struct entity *entity, s32 anim_id); extern void ov29_022F42F8(struct entity *entity); extern void EndMagnetRiseStatus(struct entity *user, struct entity *target); extern void TickNoSlipCap(struct entity *entity); From 7f1656cfc907729acde8d37efd28b1db687914f9 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 13 Sep 2026 04:09:48 -0700 Subject: [PATCH 20/34] Decompile 11 more callees; two cheap neighbour clusters Each was verified at score 0 against its NORTH_AMERICA, EUROPE and JAPAN targets before landing, with the address walk closing exactly in each region, and by a matching US build after. overlay_29_0231E9F0.c InitMoveWrapper, MoveIsNotPhysical, CategoryIsNotPhysical overlay_29_022E45B8.c ov29_022E45CC, ov29_022E45D0 overlay_29_022F0590.c UnfreezeAnim overlay_29_02311010.c TickNoSlipCap dungeon_logic_6.c ov29_022EFB84 main_02062A58.c sub_02062AD0 main_0200224C.c AddFixedPoint64 main_0202A66C.c CreateParentMenuFromStringIds All eleven merge into an adjacent source file; no assembly file is split. Two of them were bought cheaply: InitMoveWrapper is four instructions and clearing it puts MoveIsNotPhysical and CategoryIsNotPhysical at the file head, and ov29_022E45CC is a single instruction standing in front of ov29_022E45D0. TickNoSlipCap needed a repair the compiler could not report. extract_function.py placed its generated placeholder immediately after a pre-existing `#ifdef EUROPE` in overlay_29_02311010.c, so the definition existed only in EU builds: every object compiled and the failure appeared at the link step as `Undefined : "TickNoSlipCap"`, referenced from ActivateEndOfTurnEffects in the same object. Moving it out of the block then exposed two of its own declarations that had been invisible while the region never compiled it. main.lsf confirms the merge target itself was right -- asm/overlay_29_0230F9A4.o is immediately followed by src/overlay_29_02311010.o, and the function sat at the tail of the former. build-tools/check_landed_guards.py now reports any definition at conditional depth > 0; it is clean across every function landed so far. Twelve call-site declarations are replaced by an include of the owning header. CreateParentMenuFromStringIds had THREE mutually contradictory ones -- (void*, u32, void*, void*), (u32*, u32, struct struct_2*, u32*), and the matching signature -- which could coexist only while the function had no header. Its body indexes the fourth argument as struct unk_0202A5CC throughout, so the two call sites are cast rather than the parameter weakened to void*, which would only move the casts inside. Authored by Claude (Opus 5) under human direction. Confirmed by a matching build: build/pmdsky.us/pmdsky.us.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_0202A3E4.inc | 10 ++-- .../{main_02062AD0.inc => main_02062AE4.inc} | 1 - ...9_022E45CC.inc => overlay_29_022E465C.inc} | 0 asm/include/overlay_29_022EFB84.inc | 4 -- asm/include/overlay_29_022EFBAC.inc | 1 + asm/include/overlay_29_0230F9A4.inc | 3 -- ...9_0231EA04.inc => overlay_29_0231EA40.inc} | 12 ++--- asm/main_02001D68.s | 15 ------ asm/main_0202A3E4.s | 48 ------------------- asm/{main_02062AD0.s => main_02062AE4.s} | 11 +---- ...ay_29_022E45CC.s => overlay_29_022E465C.s} | 46 +----------------- ...ay_29_022EFB84.s => overlay_29_022EFBAC.s} | 32 +------------ asm/overlay_29_0230F9A4.s | 48 ------------------- ...ay_29_0231EA04.s => overlay_29_0231EA40.s} | 30 +----------- include/dungeon_logic_6.h | 1 + include/main_0200224C.h | 1 + include/main_0202A66C.h | 12 +++++ include/main_02062A58.h | 1 + include/overlay_29_022E45B8.h | 2 + include/overlay_29_022F0590.h | 1 + include/overlay_29_02311010.h | 1 + include/overlay_29_0231E9F0.h | 5 ++ main.lsf | 8 ++-- src/dungeon_logic_6.c | 10 ++++ src/main_0200224C.c | 12 +++++ src/main_0202A66C.c | 32 +++++++++++++ src/main_0203D538.c | 4 +- src/main_0205D11C.c | 1 - src/main_02062A58.c | 5 ++ src/overlay_29_022E45B8.c | 16 +++++++ src/overlay_29_022F0590.c | 12 ++++- src/overlay_29_02308FBC.c | 6 +-- src/overlay_29_0230BBAC.c | 3 +- src/overlay_29_02311010.c | 32 ++++++++++++- src/overlay_29_0231E9F0.c | 29 +++++++++++ src/overlay_31_02382820.c | 4 +- 36 files changed, 194 insertions(+), 265 deletions(-) rename asm/include/{main_02062AD0.inc => main_02062AE4.inc} (98%) rename asm/include/{overlay_29_022E45CC.inc => overlay_29_022E465C.inc} (100%) delete mode 100644 asm/include/overlay_29_022EFB84.inc create mode 100644 asm/include/overlay_29_022EFBAC.inc rename asm/include/{overlay_29_0231EA04.inc => overlay_29_0231EA40.inc} (92%) rename asm/{main_02062AD0.s => main_02062AE4.s} (99%) rename asm/{overlay_29_022E45CC.s => overlay_29_022E465C.s} (54%) rename asm/{overlay_29_022EFB84.s => overlay_29_022EFBAC.s} (95%) rename asm/{overlay_29_0231EA04.s => overlay_29_0231EA40.s} (89%) diff --git a/asm/include/main_0202A3E4.inc b/asm/include/main_0202A3E4.inc index de4b0892..7ff07cf0 100644 --- a/asm/include/main_0202A3E4.inc +++ b/asm/include/main_0202A3E4.inc @@ -1,8 +1,4 @@ #pragma once -.public _0209AE34 -.public _0209AE44 -.public _020AFDAC -.public CreateParentMenuInternal .public CreateTextBox .public FileClose .public FileRom_HandleOpen @@ -11,10 +7,12 @@ .public FileRom_InitDataTransfer .public FileRom_StopDataTransfer .public FileRom_Veneer_FileInit -.public GetStringFromFileVeneer .public MemAlloc .public MemFree +.public UpdateWindow +.public _0209AE34 +.public _0209AE44 +.public _020AFDAC .public sub_02026E3C .public sub_02027040 .public sub_02027A08 -.public UpdateWindow diff --git a/asm/include/main_02062AD0.inc b/asm/include/main_02062AE4.inc similarity index 98% rename from asm/include/main_02062AD0.inc rename to asm/include/main_02062AE4.inc index bbfc7d03..d16b586e 100644 --- a/asm/include/main_02062AD0.inc +++ b/asm/include/main_02062AE4.inc @@ -8,7 +8,6 @@ .public EnqueueRender3dTiling .public FemaleToMaleForm .public FillPaletteDataRgba -.public GetBaseForm .public GetDungeonMode .public GetExclusiveItem .public GetHero diff --git a/asm/include/overlay_29_022E45CC.inc b/asm/include/overlay_29_022E465C.inc similarity index 100% rename from asm/include/overlay_29_022E45CC.inc rename to asm/include/overlay_29_022E465C.inc diff --git a/asm/include/overlay_29_022EFB84.inc b/asm/include/overlay_29_022EFB84.inc deleted file mode 100644 index 10cbf8b9..00000000 --- a/asm/include/overlay_29_022EFB84.inc +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once -.public SetAnimationControlPausedFlag -.public ov29_022EA370 -.public ov29_0234D8A0 diff --git a/asm/include/overlay_29_022EFBAC.inc b/asm/include/overlay_29_022EFBAC.inc new file mode 100644 index 00000000..6f70f09b --- /dev/null +++ b/asm/include/overlay_29_022EFBAC.inc @@ -0,0 +1 @@ +#pragma once diff --git a/asm/include/overlay_29_0230F9A4.inc b/asm/include/overlay_29_0230F9A4.inc index 23811b18..ace32b8c 100644 --- a/asm/include/overlay_29_0230F9A4.inc +++ b/asm/include/overlay_29_0230F9A4.inc @@ -1,11 +1,9 @@ #pragma once .public AbilityIsActiveVeneer .public DUNGEON_PTR -.public DungeonRandInt .public DungeonRandOutcome__022EAB20 .public ExclusiveItemEffectIsActive__0230F8AC .public GenerateStandardItem -.public HasHeldItem .public IqSkillIsEnabled .public IsMonster__0230F980 .public LogMessageByIdWithPopupCheckUser @@ -14,7 +12,6 @@ .public TreasureBoxDropsEnabled .public TryGenerateUnownStoneDrop .public ov10_022C4650 -.public ov10_022C4BE4 .public ov29_02344B9C .public ov29_023460DC .public ov29_02347184 diff --git a/asm/include/overlay_29_0231EA04.inc b/asm/include/overlay_29_0231EA40.inc similarity index 92% rename from asm/include/overlay_29_0231EA04.inc rename to asm/include/overlay_29_0231EA40.inc index 62165b03..e6b0a432 100644 --- a/asm/include/overlay_29_0231EA04.inc +++ b/asm/include/overlay_29_0231EA40.inc @@ -1,22 +1,20 @@ #pragma once -.public ActivateTerrainEffects +.public DUNGEON_PTR .public DetermineAllMonsterShadow .public DetermineTileWalkableNeighbors -.public DUNGEON_PTR .public EnsureCanStandCurrentTile .public EntityIsValid__0231EDD8 .public FloorSecondaryTerrainIsChasm -.public GetMoveCategory .public GetTile .public GetTileSafe -.public InitMove .public IsFullFloorFixedRoom .public LogMessageByIdWithPopupCheckUser +.public StairsAlwaysReachable +.public UpdateMinimap +.public UpdateTrapsVisibility .public ov29_022EA370 +.public ActivateTerrainEffects .public ov29_02305814 .public ov29_0233665C .public ov29_0233785C .public ov29_0233FB1C -.public StairsAlwaysReachable -.public UpdateMinimap -.public UpdateTrapsVisibility diff --git a/asm/main_02001D68.s b/asm/main_02001D68.s index 66c03a96..a3ca79e8 100644 --- a/asm/main_02001D68.s +++ b/asm/main_02001D68.s @@ -322,18 +322,3 @@ _020021C0: add sp, sp, #8 ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} arm_func_end UDivideFixedPoint64 - - arm_func_start AddFixedPoint64 -AddFixedPoint64: ; 0x020021C8 - stmdb sp!, {r3, lr} - ldr ip, [r1, #4] - ldr lr, [r1] - ldr r1, [r2] - ldr r3, [r2, #4] - add r1, lr, r1 - add r2, ip, r3 - cmp r2, ip - addlo r1, r1, #1 - stmia r0, {r1, r2} - ldmia sp!, {r3, pc} - arm_func_end AddFixedPoint64 diff --git a/asm/main_0202A3E4.s b/asm/main_0202A3E4.s index c73dd11f..56e2f0db 100644 --- a/asm/main_0202A3E4.s +++ b/asm/main_0202A3E4.s @@ -144,51 +144,3 @@ _0202A5C0: .word _020AFDAC _0202A5C4: .word _0209AE44 _0202A5C8: .word _0209AE34 arm_func_end PrintMark - - arm_func_start CreateParentMenuFromStringIds -CreateParentMenuFromStringIds: ; 0x0202A5CC - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r6, r3 - mov r8, r1 - mov r7, r2 - mov sb, r0 - mov r1, r6 - mov r2, #0 - b _0202A5F4 -_0202A5EC: - add r1, r1, #8 - add r2, r2, #1 -_0202A5F4: - ldrh r0, [r1] - cmp r0, #0 - bne _0202A5EC - add r0, r2, #1 - add r0, r0, r0, lsl #6 - mov r0, r0, lsl #2 - mov r1, #8 - bl MemAlloc - mov r4, r0 - mov r5, r4 - b _0202A638 -_0202A620: - mov r0, r5 - bl GetStringFromFileVeneer - ldr r0, [r6, #4] - add r6, r6, #8 - str r0, [r5, #0x100] - add r5, r5, #0x104 -_0202A638: - ldrh r1, [r6] - cmp r1, #0 - bne _0202A620 - mov r0, #0 - strb r0, [r5] - ldr r6, [r6, #4] - mov r0, sb - mov r1, r8 - mov r2, r7 - mov r3, r4 - str r6, [r5, #0x100] - bl CreateParentMenuInternal - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - arm_func_end CreateParentMenuFromStringIds diff --git a/asm/main_02062AD0.s b/asm/main_02062AE4.s similarity index 99% rename from asm/main_02062AD0.s rename to asm/main_02062AE4.s index 8c06847e..e59afecc 100644 --- a/asm/main_02062AD0.s +++ b/asm/main_02062AE4.s @@ -1,17 +1,8 @@ .include "asm/macros.inc" - .include "main_02062AD0.inc" + .include "main_02062AE4.inc" .text - arm_func_start sub_02062AD0 -sub_02062AD0: ; 0x02062AD0 - stmdb sp!, {r3, lr} - bl GetBaseForm - bl FemaleToMaleForm - bl IsMonsterMissionAllowedStory - ldmia sp!, {r3, pc} - arm_func_end sub_02062AD0 - arm_func_start IsMonsterMissionAllowedStory IsMonsterMissionAllowedStory: ; 0x02062AE4 stmdb sp!, {r4, lr} diff --git a/asm/overlay_29_022E45CC.s b/asm/overlay_29_022E465C.s similarity index 54% rename from asm/overlay_29_022E45CC.s rename to asm/overlay_29_022E465C.s index 5827a744..518a248b 100644 --- a/asm/overlay_29_022E45CC.s +++ b/asm/overlay_29_022E465C.s @@ -1,52 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_022E45CC.inc" + .include "overlay_29_022E465C.inc" .text - arm_func_start ov29_022E45CC -ov29_022E45CC: ; 0x022E45CC - bx lr - arm_func_end ov29_022E45CC - - arm_func_start ov29_022E45D0 -ov29_022E45D0: ; 0x022E45D0 - stmdb sp!, {r3, r4, r5, lr} - sub sp, sp, #0x10 - mov r5, r0 - mov r0, #0x2f - mov r4, r1 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x2f - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - mov r0, #0x30 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r1, #2 - str r1, [sp] - mov r2, #0 - str r2, [sp, #4] - sub r1, r2, #1 - str r1, [sp, #8] - str r2, [sp, #0xc] - mov r0, r5 - mov r1, #0x30 - mov r2, #1 - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ov29_022E45D0 - arm_func_start ov29_022E465C ov29_022E465C: ; 0x022E465C bx lr diff --git a/asm/overlay_29_022EFB84.s b/asm/overlay_29_022EFBAC.s similarity index 95% rename from asm/overlay_29_022EFB84.s rename to asm/overlay_29_022EFBAC.s index 681be774..222396f4 100644 --- a/asm/overlay_29_022EFB84.s +++ b/asm/overlay_29_022EFBAC.s @@ -1,22 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_022EFB84.inc" + .include "overlay_29_022EFBAC.inc" .text - arm_func_start ov29_022EFB84 -ov29_022EFB84: ; 0x022EFB84 - stmdb sp!, {r4, lr} - mov r4, r0 - mov r0, #0 - bl ov29_0234D8A0 - cmp r4, #0 - ldmeqia sp!, {r4, pc} - mov r0, #0xa - mov r1, #0x62 - bl ov29_022EA370 - ldmia sp!, {r4, pc} - arm_func_end ov29_022EFB84 - arm_func_start ov29_022EFBAC ov29_022EFBAC: ; 0x022EFBAC ldr r1, _022F04E4 ; =0x000001FE @@ -672,19 +658,3 @@ FreezeAnim: ; 0x022F04F0 #endif ldmia sp!, {r3, r4, r5, pc} arm_func_end FreezeAnim - - arm_func_start UnfreezeAnim -UnfreezeAnim: ; 0x022F0518 - ldr r2, [r0, #0xb4] - mov r1, #0 - ldr ip, _022F0530 ; =SetAnimationControlPausedFlag - add r0, r0, #0x2c -#ifdef JAPAN - strb r1, [r2, #0x16d] -#else - strb r1, [r2, #0x171] -#endif - bx ip - .align 2, 0 -_022F0530: .word SetAnimationControlPausedFlag - arm_func_end UnfreezeAnim diff --git a/asm/overlay_29_0230F9A4.s b/asm/overlay_29_0230F9A4.s index b139e3de..b84e6d22 100644 --- a/asm/overlay_29_0230F9A4.s +++ b/asm/overlay_29_0230F9A4.s @@ -147,51 +147,3 @@ _0230FB8C: .word 0x000009B6 _0230FB8C: .word 0x00000F62 #endif arm_func_end ov29_0230FB30 - - arm_func_start TickNoSlipCap -TickNoSlipCap: ; 0x0230FB90 -#ifdef JAPAN -#define TICK_NO_SLIP_CAP_OFFSET -1 -#else -#define TICK_NO_SLIP_CAP_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, lr} - mov r1, #0x6f - mov r5, r0 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0 - bne _0230FBB8 - mov r0, r5 - mov r1, #0xd - bl HasHeldItem -_0230FBB8: - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r4, [r5, #0xb4] - ldrb r0, [r4, #6] - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, pc} - ldrb r0, [r4, #0x107 + TICK_NO_SLIP_CAP_OFFSET] - add r1, r0, #1 - and r0, r1, #0xff - cmp r0, #0x14 - strb r1, [r4, #0x107 + TICK_NO_SLIP_CAP_OFFSET] - movhs r0, #0x13 - strhsb r0, [r4, #0x107 + TICK_NO_SLIP_CAP_OFFSET] - mov r0, #0x64 - bl DungeonRandInt - ldrb r2, [r4, #0x107 + TICK_NO_SLIP_CAP_OFFSET] - ldr r1, _0230FC20 ; =ov10_022C4BE4 - mov r2, r2, lsl #1 - ldrsh r1, [r1, r2] - cmp r0, r1 - ldmgeia sp!, {r3, r4, r5, pc} - mov r0, r5 - bl ov29_0230FB30 - mov r0, #0 - strb r0, [r4, #0x107 + TICK_NO_SLIP_CAP_OFFSET] - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230FC20: .word ov10_022C4BE4 - arm_func_end TickNoSlipCap diff --git a/asm/overlay_29_0231EA04.s b/asm/overlay_29_0231EA40.s similarity index 89% rename from asm/overlay_29_0231EA04.s rename to asm/overlay_29_0231EA40.s index f0e1eebd..c7cf07e0 100644 --- a/asm/overlay_29_0231EA04.s +++ b/asm/overlay_29_0231EA40.s @@ -1,36 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_0231EA04.inc" + .include "overlay_29_0231EA40.inc" .text - arm_func_start InitMoveWrapper -InitMoveWrapper: ; 0x0231EA04 - ldr ip, _0231EA14 ; =InitMove - mov r0, r1 - mov r1, r2 - bx ip - .align 2, 0 -_0231EA14: .word InitMove - arm_func_end InitMoveWrapper - - arm_func_start MoveIsNotPhysical -MoveIsNotPhysical: ; 0x0231EA18 - stmdb sp!, {r3, lr} - bl GetMoveCategory - cmp r0, #0 - moveq r0, #0 - movne r0, #1 - ldmia sp!, {r3, pc} - arm_func_end MoveIsNotPhysical - - arm_func_start CategoryIsNotPhysical -CategoryIsNotPhysical: ; 0x0231EA30 - cmp r0, #0 - moveq r0, #0 - movne r0, #1 - bx lr - arm_func_end CategoryIsNotPhysical - arm_func_start MakeFloorOneRoom MakeFloorOneRoom: ; 0x0231EA40 #ifdef JAPAN diff --git a/include/dungeon_logic_6.h b/include/dungeon_logic_6.h index d95e006a..e1dd12ba 100644 --- a/include/dungeon_logic_6.h +++ b/include/dungeon_logic_6.h @@ -8,5 +8,6 @@ bool8 IsBehaviorLoneOutlaw(enum monster_behavior behavior); // Checks if a behavior ID corresponds to one of the Secret Bazaar NPCs. bool8 IsSecretBazaarNpcBehavior(enum monster_behavior behavior); void ov29_022EFB20(bool8 param_1); +void ov29_022EFB84(bool8 param_1); #endif //PMDSKY_DUNGEON_LOGIC_6_H diff --git a/include/main_0200224C.h b/include/main_0200224C.h index 83bce7fd..bd26b356 100644 --- a/include/main_0200224C.h +++ b/include/main_0200224C.h @@ -3,6 +3,7 @@ #include "main_02001BB4.h" +void AddFixedPoint64(struct fixed_point_64 *out, struct fixed_point_64 *a, struct fixed_point_64 *b); void ClampedLn(struct fixed_point_64 *out, s32 x); void sub_02002228(u32 param_1); u16 GetRngSeed(void); diff --git a/include/main_0202A66C.h b/include/main_0202A66C.h index ac3b68c1..5c8b7bbb 100644 --- a/include/main_0202A66C.h +++ b/include/main_0202A66C.h @@ -1,8 +1,20 @@ #ifndef PMDSKY_MAIN_0202A66C_H #define PMDSKY_MAIN_0202A66C_H +struct unk_0202A5CC { + u16 field_0x0; + u8 field_0x2[2]; + s32 field_0x4; +}; + +struct unk_0202A75C { + u8 field_0x0[0x100]; + s32 field_0x100; +}; + #include "util.h" +u8 CreateParentMenuFromStringIds(void *a, u32 b, void *c, struct unk_0202A5CC *items); bool8 IsEmptyString(u8* str); #endif diff --git a/include/main_02062A58.h b/include/main_02062A58.h index e6cdeb6b..2b9c690b 100644 --- a/include/main_02062A58.h +++ b/include/main_02062A58.h @@ -7,5 +7,6 @@ bool8 CanMonsterBeUsedForMission(s16 id, bool8 flag); bool8 CanMonsterBeUsedForMissionWrapper(s16 id); bool8 CanMonsterBeUsedForMission(s16 id, bool8 flag); +bool8 sub_02062AD0(s16 id); #endif diff --git a/include/overlay_29_022E45B8.h b/include/overlay_29_022E45B8.h index 065cb9a7..b0e21fea 100644 --- a/include/overlay_29_022E45B8.h +++ b/include/overlay_29_022E45B8.h @@ -6,5 +6,7 @@ #include "move.h" void ov29_022E45B8(struct entity *entity); +void ov29_022E45CC(struct entity *entity); +void ov29_022E45D0(struct entity *a, struct entity *b); #endif diff --git a/include/overlay_29_022F0590.h b/include/overlay_29_022F0590.h index 6f0e8630..3df35483 100644 --- a/include/overlay_29_022F0590.h +++ b/include/overlay_29_022F0590.h @@ -5,6 +5,7 @@ #include "dungeon_mode.h" +void UnfreezeAnim(struct entity *entity); void ov29_022F0534(bool8 freeze); // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__022F0590(struct entity *entity); diff --git a/include/overlay_29_02311010.h b/include/overlay_29_02311010.h index 86eb4a0f..736e014f 100644 --- a/include/overlay_29_02311010.h +++ b/include/overlay_29_02311010.h @@ -3,6 +3,7 @@ #include "dungeon_mode.h" +void TickNoSlipCap(struct entity *entity); void ActivateEndOfTurnEffects(struct entity *entity); // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__02311010(struct entity *entity); diff --git a/include/overlay_29_0231E9F0.h b/include/overlay_29_0231E9F0.h index 90f18103..cce9dafb 100644 --- a/include/overlay_29_0231E9F0.h +++ b/include/overlay_29_0231E9F0.h @@ -1,10 +1,15 @@ #ifndef PMDSKY_OVERLAY_29_0231E9F0_H #define PMDSKY_OVERLAY_29_0231E9F0_H +#include "dungeon_mode.h" + #include "move.h" // Gets the maximum PP for a given move. A wrapper around the function in the ARM 9 binary. // return: max PP for the given move, capped at 99 s16 GetMaxPpWrapper(struct move *move); +void InitMoveWrapper(struct entity *entity, struct move *move, enum move_id move_id); +int MoveIsNotPhysical(enum move_id move_id); +bool8 CategoryIsNotPhysical(s32 category); #endif //PMDSKY_OVERLAY_29_0231E9F0_H diff --git a/main.lsf b/main.lsf index 8b84db62..5d341b07 100644 --- a/main.lsf +++ b/main.lsf @@ -362,7 +362,7 @@ Static main Object src/main_0205ED84.o Object asm/main_0205EDA4.o Object src/main_02062A58.o - Object asm/main_02062AD0.o + Object asm/main_02062AE4.o Object src/main_02064FFC.o Object src/main_02065974.o Object asm/main_02065998.o @@ -812,7 +812,7 @@ Overlay OVY_29 Object asm/overlay_29_022E41F0.o Object src/overlay_29_022E4338.o Object src/overlay_29_022E45B8.o - Object asm/overlay_29_022E45CC.o + Object asm/overlay_29_022E465C.o Object src/overlay_29_022E46C0.o Object src/overlay_29_022E4704.o Object asm/overlay_29_022E4868.o @@ -883,7 +883,7 @@ Overlay OVY_29 Object asm/overlay_29_rodata_0235179C.o Object src/overlay_29_022EFA6C.o Object src/dungeon_logic_6.o - Object asm/overlay_29_022EFB84.o + Object asm/overlay_29_022EFBAC.o Object src/overlay_29_022F0590.o Object asm/overlay_29_022F0654.o Object src/overlay_29_022F0EDC.o @@ -1038,7 +1038,7 @@ Overlay OVY_29 Object asm/overlay_29_0231CBEC.o Object src/dungeon_ai_item_weight.o Object src/overlay_29_0231E9F0.o - Object asm/overlay_29_0231EA04.o + Object asm/overlay_29_0231EA40.o Object src/overlay_29_0231EDD8.o Object asm/overlay_29_0231EDFC.o Object src/overlay_29_0231F570.o diff --git a/src/dungeon_logic_6.c b/src/dungeon_logic_6.c index ca9be477..ed5ced86 100644 --- a/src/dungeon_logic_6.c +++ b/src/dungeon_logic_6.c @@ -5,6 +5,8 @@ #include "overlay_29_0234BA54.h" + +extern void ov29_0234D8A0(s32 a); extern s16 ov29_022DE5F0(s32 index); extern void ov29_022EA370(s32 a, s32 b); extern int ov29_0234B1A4(); @@ -50,3 +52,11 @@ void ov29_022EFB20(bool8 param_1) ov29_0237C9A0[1] = ov29_022DE5F0(1); ov29_0237C9A0[0] = ov29_022DE5F0(0); } + +void ov29_022EFB84(bool8 param_1) +{ + ov29_0234D8A0(0); + if (param_1) { + ov29_022EA370(10, 0x62); + } +} diff --git a/src/main_0200224C.c b/src/main_0200224C.c index a5406c4a..f3f207f2 100644 --- a/src/main_0200224C.c +++ b/src/main_0200224C.c @@ -1,5 +1,17 @@ #include "main_0200224C.h" +void AddFixedPoint64(struct fixed_point_64 *out, struct fixed_point_64 *a, struct fixed_point_64 *b) +{ + s32 upper = a->upper + b->upper; + u32 lower = a->lower + b->lower; + + if (lower < a->lower) { + upper++; + } + out->upper = upper; + out->lower = lower; +} + extern s16 NATURAL_LOG_VALUE_TABLE[]; diff --git a/src/main_0202A66C.c b/src/main_0202A66C.c index 63791800..6e2a4d5f 100644 --- a/src/main_0202A66C.c +++ b/src/main_0202A66C.c @@ -1,5 +1,37 @@ #include "main_0202A66C.h" +#include "main_02001188.h" + +extern void GetStringFromFileVeneer(u8 *buf, s32 string_id); +extern u8 CreateParentMenuInternal(void *a, u32 b, void *c, struct unk_0202A75C *items); + +u8 CreateParentMenuFromStringIds(void *a, u32 b, void *c, struct unk_0202A5CC *items) +{ + struct unk_0202A5CC *p; + struct unk_0202A75C *buf; + struct unk_0202A75C *q; + s32 n; + + p = items; + n = 0; + while (p->field_0x0 != 0) { + p++; + n++; + } + + buf = MemAlloc((n + 1) * sizeof(struct unk_0202A75C), 8); + q = buf; + while (items->field_0x0 != 0) { + GetStringFromFileVeneer(q->field_0x0, items->field_0x0); + q->field_0x100 = items->field_0x4; + items++; + q++; + } + q->field_0x0[0] = 0; + q->field_0x100 = items->field_0x4; + return CreateParentMenuInternal(a, b, c, buf); +} + bool8 IsEmptyString(u8* str) { if (str == 0) { diff --git a/src/main_0203D538.c b/src/main_0203D538.c index f51fd192..a15c16aa 100644 --- a/src/main_0203D538.c +++ b/src/main_0203D538.c @@ -18,6 +18,7 @@ #include "progression.h" #include "script_variable.h" #include "main_020517D4.h" +#include "main_0202A66C.h" struct unk_020AFE74 { s32 field_0x0; @@ -67,7 +68,6 @@ extern struct unk_020AFE74 *MISSION_REWARD_STRUCT_MAIN_PTR; extern void MaybeGetColoredFormattedItemName(void*, struct item*, void*); extern s8 CreateSimpleMenuFromStringIds(void*, s32, s32, void*, s32); -extern u8 CreateParentMenuFromStringIds(void *, u32, void *, void *); extern void GetNameWithGender(char *dst, s16 monster_id, char color_id); extern void GetNameRaw(unsigned char *, s32); extern void StrncpySimpleNoPadSafe(u8* dest, const u8* src, u32 n); @@ -257,7 +257,7 @@ s32 sub_0203D538(void) } case 8: if (sub_02046C78() != 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x4 = CreateParentMenuFromStringIds(NULL, 0x11, NULL, &_0209C884); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x4 = CreateParentMenuFromStringIds(NULL, 0x11, NULL, (struct unk_0202A5CC *)&_0209C884); MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 9; } break; diff --git a/src/main_0205D11C.c b/src/main_0205D11C.c index a9ddd941..c6b20133 100644 --- a/src/main_0205D11C.c +++ b/src/main_0205D11C.c @@ -37,7 +37,6 @@ extern void *LoadMissionTemplates(void); extern s32 MtNext(void); extern void RollRandomItemReward(struct dungeon_floor_pair *, enum mission_type, s16 *out); extern void sub_02062900(u16, s16 *, void *out); -extern bool8 sub_02062AD0(enum monster_id); extern bool8 sub_02062C4C(s32, u8 *, struct dungeon_floor_pair *, s32); extern s32 sub_02062814(void **out); extern s32 sub_0206282C(u8 *out); diff --git a/src/main_02062A58.c b/src/main_02062A58.c index 972ed57f..ee4e5568 100644 --- a/src/main_02062A58.c +++ b/src/main_02062A58.c @@ -34,3 +34,8 @@ bool8 CanMonsterBeUsedForMission(s16 id, bool8 flag) } return TRUE; } + +bool8 sub_02062AD0(s16 id) +{ + return IsMonsterMissionAllowedStory(FemaleToMaleForm(GetBaseForm(id))); +} diff --git a/src/overlay_29_022E45B8.c b/src/overlay_29_022E45B8.c index fce7b34a..86e11904 100644 --- a/src/overlay_29_022E45B8.c +++ b/src/overlay_29_022E45B8.c @@ -1,8 +1,24 @@ #include "overlay_29_022E45B8.h" +extern s32 GetEffectAnimationWanOffset(s32 id); +extern void PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, + s32 c, s32 d, s32 e, s32 f); + extern void PlaySeByIdIfShouldDisplayEntity(struct entity *entity, s32 se_id); void ov29_022E45B8(struct entity *entity) { PlaySeByIdIfShouldDisplayEntity(entity, 0x227); } + +void ov29_022E45CC(struct entity *entity) +{ +} + +void ov29_022E45D0(struct entity *a, struct entity *b) +{ + PlayEffectAnimationEntity(b, 0x2F, 1, GetEffectAnimationWanOffset(0x2F), + 2, 0, -1, 0); + PlayEffectAnimationEntity(a, 0x30, 1, GetEffectAnimationWanOffset(0x30), + 2, 0, -1, 0); +} diff --git a/src/overlay_29_022F0590.c b/src/overlay_29_022F0590.c index 860ea13a..56921c43 100644 --- a/src/overlay_29_022F0590.c +++ b/src/overlay_29_022F0590.c @@ -1,10 +1,19 @@ #include "overlay_29_022F0590.h" #include "dungeon.h" + +#include "main_0201D198.h" +void UnfreezeAnim(struct entity *entity) +{ + struct monster *monster = entity->info; + + monster->field_0x171 = FALSE; + SetAnimationControlPausedFlag(&entity->anim_ctrl, FALSE); +} + extern struct dungeon *DUNGEON_PTR[]; extern bool8 EntityIsValid__022F0590(struct entity *entity); extern void FreezeAnim(struct entity *e); -extern void UnfreezeAnim(struct entity *e); void ov29_022F0534(bool8 freeze) @@ -38,7 +47,6 @@ extern s32 TalkToSecretBazaarNpc(s32 a, struct entity *b, s32 c, s32 d, s32 e); #include "dungeon_util_static.h" extern void FreezeAnim(struct entity *e); -extern void UnfreezeAnim(struct entity *e); bool8 EntityIsValid__022F0590(struct entity *entity) { diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index 611e4a4d..e3639e57 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -53,6 +53,8 @@ #include "overlay_29_0234B4BC.h" #include "overlay_29_022EAC7C.h" #include "overlay_29_022ECDC0.h" +#include "overlay_29_022E45B8.h" +#include "overlay_29_0231E9F0.h" struct unk_023535DC { u8 field_0x0; @@ -75,11 +77,9 @@ struct unk_022C593C { extern const struct StatIndex ATK_STAT_IDX; extern void ActivateMotorDrive(struct entity* entity); extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); -extern bool8 CategoryIsNotPhysical(s32 category); extern bool8 IsEitherMonsterInvalid(struct entity *a, struct entity *b); extern void ResetDamageData(struct unk_02308FE0 *damage_data); extern void TryHurl(struct entity *user, struct entity *target); -extern void ov29_022E45D0(struct entity *a, struct entity *b); extern void ov29_022E57D4(struct entity *entity); extern void ov29_022E5E84(struct entity *a, struct entity *b); extern void ov29_0230F728(struct entity *attacker, struct entity *defender, enum exclusive_item_effect_id effect_id, s32 a); @@ -126,7 +126,6 @@ extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *ta extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); extern bool8 TryRecruit(struct entity *user, struct entity *recruit, void *recruit_info); extern void TrySpawnEnemyItemDrop(struct entity* attacker, struct entity* defender); -extern void UnfreezeAnim(struct entity *e); extern void UpdateShopkeeperModeAfterAttack(struct entity* attacker, struct entity* defender); extern s32 abs(s32 n); extern int ov10_022BDC68(); @@ -136,7 +135,6 @@ extern int ov29_022E5478(); extern int ov29_022E550C(); extern void ov29_022E81F8(void); extern void ov29_022EA370(s32 a, s32 b); -extern int ov29_022EFB84(); extern int ov29_022F0780(); extern int ov29_022F9AF4(); extern int ov29_022FB98C(); diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c index 506605b9..a7c401f9 100644 --- a/src/overlay_29_0230BBAC.c +++ b/src/overlay_29_0230BBAC.c @@ -28,14 +28,13 @@ #include "overlay_29_02338350.h" #include "overlay_29_0234B340.h" #include "main_0200224C.h" +#include "overlay_29_0231E9F0.h" extern struct dungeon *DUNGEON_PTR; extern u8 GetMonsterGenderVeneer(s16 monster_id); extern u8 ExclusiveItemOffenseBoost(struct entity *entity, s32 idx); extern u8 ExclusiveItemDefenseBoost(struct entity *entity, s32 idx); -extern int MoveIsNotPhysical(enum move_id move_id); extern s32 FixedPoint64ToInt(struct fixed_point_64 *x); -extern void AddFixedPoint64(struct fixed_point_64 *out, struct fixed_point_64 *a, struct fixed_point_64 *b); extern int IsRecoilMove(enum move_id move_id); extern void PlayEffectAnimation0x1A9__022E6130(struct entity *entity); extern void PlayEffectAnimation0x1A9__022E617C(struct entity *entity); diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index 38489a5e..426cd964 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -27,6 +27,9 @@ #include "overlay_29_02305C04.h" #include "overlay_29_022E4338.h" +extern s16 ov10_022C4BE4[20]; +extern void ov29_0230FB30(struct entity *entity); + #ifdef JAPAN #define MESSAGE_DE6 0xB26 #define MESSAGE_DE7 0xB27 @@ -51,6 +54,7 @@ #ifdef EUROPE + extern bool8 ov29_022E34A8_EU(struct entity *entity); #endif @@ -70,7 +74,6 @@ extern void ov29_022E543C(struct entity *entity); extern void ov29_022E53F0(struct entity *entity); extern void ov29_022F42F8(struct entity *entity); extern void EndMagnetRiseStatus(struct entity *user, struct entity *target); -extern void TickNoSlipCap(struct entity *entity); extern void ov29_022EC62C(struct entity *entity); extern void ov29_022FB718(struct entity *entity); extern void TryActivateBadDreams(struct entity *entity); @@ -104,6 +107,33 @@ extern const s16 CURSE_DAMAGE_COOLDOWN; extern const s16 LEECH_SEED_DAMAGE_COOLDOWN; extern const s16 LEECH_SEED_HP_DRAIN; +void TickNoSlipCap(struct entity *entity) +{ + struct monster *monster; + bool8 has_no_slip_cap; + + if (AbilityIsActiveVeneer(entity, ABILITY_KLUTZ)) + has_no_slip_cap = FALSE; + else + has_no_slip_cap = HasHeldItem(entity, ITEM_NO_SLIP_CAP); + + if (!has_no_slip_cap) + return; + + monster = entity->info; + if (monster->is_not_team_member) + return; + + monster->no_slip_cap_counter++; + if (monster->no_slip_cap_counter >= 20) + monster->no_slip_cap_counter = 19; + + if (DungeonRandInt(100) < ov10_022C4BE4[monster->no_slip_cap_counter]) { + ov29_0230FB30(entity); + monster->no_slip_cap_counter = 0; + } +} + void ActivateEndOfTurnEffects(struct entity *entity) { s32 v1; diff --git a/src/overlay_29_0231E9F0.c b/src/overlay_29_0231E9F0.c index 37b4df49..39282646 100644 --- a/src/overlay_29_0231E9F0.c +++ b/src/overlay_29_0231E9F0.c @@ -1,7 +1,36 @@ #include "overlay_29_0231E9F0.h" #include "moves.h" +#include "moves_1.h" +#include "main_0201514C.h" s16 GetMaxPpWrapper(struct move *move) { return GetMaxPp(move); } + +void InitMoveWrapper(struct entity *entity, struct move *move, enum move_id move_id) +{ + InitMove(move, move_id); +} + +int MoveIsNotPhysical(enum move_id move_id) +{ + s32 category = GetMoveCategory(move_id); + + if (category == CATEGORY_PHYSICAL) { + return FALSE; + } else if (category != CATEGORY_PHYSICAL) { + return TRUE; + } + return TRUE; +} + +bool8 CategoryIsNotPhysical(s32 category) +{ + if (category == CATEGORY_PHYSICAL) { + return FALSE; + } else if (category != CATEGORY_PHYSICAL) { + return TRUE; + } + return TRUE; +} diff --git a/src/overlay_31_02382820.c b/src/overlay_31_02382820.c index f06ab50e..a577683d 100644 --- a/src/overlay_31_02382820.c +++ b/src/overlay_31_02382820.c @@ -10,6 +10,7 @@ #include "main_02027AF0.h" #include "dungeon_util_2.h" #include "overlay_29_022E9FC0.h" +#include "main_0202A66C.h" extern struct dungeon *DUNGEON_PTR[]; @@ -39,7 +40,6 @@ extern void DrawTextInWindow(s32, u32, u32, u8*); extern u8* AllocateTemp1024ByteBufferFromPool(void); extern s32 sub_020265A8(u8*); // Measures the text's width in pixels -extern u8 CreateParentMenuFromStringIds(u32*, u32, struct struct_2*, u32*); extern u8 CreateTextBox(u32*, void (*fun)(s32)); extern u32 IsParentMenuActive(s8); extern u32 GetWindowIdSelectedItemOnPage(s8); @@ -179,7 +179,7 @@ u32 DungeonMenuLoop(void) sp.c = OVERLAY31_UNKNOWN_POINTER__NA_238A260[0]->b; sp.b = Arm9LoadUnkFieldNa0x2029EC8(5, sp.c); - OVERLAY31_UNKNOWN_POINTER__NA_238A260[0]->f[0] = CreateParentMenuFromStringIds(&DUNGEON_WINDOW_PARAMS_1, OV31_02382B54_CONST_1, &sp, &DUNGEON_MAIN_MENU_ITEMS); + OVERLAY31_UNKNOWN_POINTER__NA_238A260[0]->f[0] = CreateParentMenuFromStringIds(&DUNGEON_WINDOW_PARAMS_1, OV31_02382B54_CONST_1, &sp, (struct unk_0202A5CC *)&DUNGEON_MAIN_MENU_ITEMS); OVERLAY31_UNKNOWN_POINTER__NA_238A260[0]->f[2] = CreateTextBox(&DUNGEON_WINDOW_PARAMS_4, DrawDungeonMenuStatusWindow); OVERLAY31_UNKNOWN_POINTER__NA_238A260[0]->f[1] = CreateTextBox(&DUNGEON_WINDOW_PARAMS_2, DungeonMenuSwitch); From 49da4ee98e0a8d32fa6b8527ba6210eb6603fb2d Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 13 Sep 2026 05:34:39 -0700 Subject: [PATCH 21/34] Decompile 12 more callees; clear the head of overlay_11_02308D1C Twelve contiguous functions from the head of asm/overlay_11_02308D1C.s, merged into src/overlay_11_02307334.c so the .s splits rather than the source file: ov11_02308D1C ov11_02308D48 ov11_02308DD8 ov11_02308EB4 ov11_02308EDC ov11_02308F14 ov11_02308F4C ov11_02308FD0 ov11_02308FEC ov11_0230901C ov11_02309040 ov11_02309084 Ten are callees of ov11_02307334; ov11_02308D1C and ov11_02308D48 are the head neighbours that had to clear first for the run to reach a file boundary. The remainder of the file becomes asm/overlay_11_023090DC.s, which keeps the OV11_02309084_OFFSET definition its 24 users need. include/overlay_11_02307334.h gains struct unk_02309DAC, struct unk_02308F4C and the twelve prototypes; nine superseded void*-typed forward declarations in src/overlay_11_02307334.c are removed. Two file-local types in src/overlay_11_02307334.c change. struct unk_02324D90 is added, its second member region-split (JP 0xF0 against 0x110 elsewhere). struct unk_02324D8C's u8 field_0x104[0x134] splits into u8 field_0x104[0x32] plus char field_0x136[0x102] -- same size, same layout, naming the offset ov11_02308DD8 writes through. Neither type appears outside this file. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- ...1_02308D1C.inc => overlay_11_023090DC.inc} | 7 - ...ay_11_02308D1C.s => overlay_11_023090DC.s} | 322 +----------------- include/overlay_11_02307334.h | 30 ++ main.lsf | 2 +- src/overlay_11_02307334.c | 194 +++++++++-- 5 files changed, 205 insertions(+), 350 deletions(-) rename asm/include/{overlay_11_02308D1C.inc => overlay_11_023090DC.inc} (96%) rename asm/{overlay_11_02308D1C.s => overlay_11_023090DC.s} (93%) diff --git a/asm/include/overlay_11_02308D1C.inc b/asm/include/overlay_11_023090DC.inc similarity index 96% rename from asm/include/overlay_11_02308D1C.inc rename to asm/include/overlay_11_023090DC.inc index 5c42fc68..1eafb560 100644 --- a/asm/include/overlay_11_02308D1C.inc +++ b/asm/include/overlay_11_023090DC.inc @@ -4,17 +4,13 @@ .public CheckTeamMemberIdx .public CloseAdvancedTextBox .public CloseCollectionMenu -.public CloseDialogueBox -.public CloseInventoryMenu .public CloseParentMenu .public CloseScrollBox .public CloseSynthBin -.public CloseTextBox2 .public CountNbItemsOfTypeInBag .public CountNbItemsOfTypeInStorage .public CreateAdvancedTextBox .public CreateCollectionMenu -.public CreateDialogueBox .public CreateMonsterSummaryFromTeamMember .public CreateParentMenu .public CreateParentMenuFromStringIds @@ -85,7 +81,6 @@ .public ov11_0230D220 .public ov11_0230D92C .public ov11_02310BDC -.public ov11_02322DB8 .public ov11_02322DC8 .public ov11_02322DD0 .public ov11_02322DE0 @@ -110,7 +105,6 @@ .public ov11_02322FD4 .public ov11_02322FE4 .public ov11_02322FF4 -.public ov11_02324D8C .public ov11_02324D90 .public ov11_02324D94 .public ov11_02324D98 @@ -186,4 +180,3 @@ .public sub_020564B0 .public sub_020586F0 .public sub_02058794 -.public vsprintf diff --git a/asm/overlay_11_02308D1C.s b/asm/overlay_11_023090DC.s similarity index 93% rename from asm/overlay_11_02308D1C.s rename to asm/overlay_11_023090DC.s index 5c13f0b1..3ce49cb5 100644 --- a/asm/overlay_11_02308D1C.s +++ b/asm/overlay_11_023090DC.s @@ -1,329 +1,13 @@ .include "asm/macros.inc" - .include "overlay_11_02308D1C.inc" + .include "overlay_11_023090DC.inc" - .text - - arm_func_start ov11_02308D1C -ov11_02308D1C: ; 0x02308D1C - stmdb sp!, {r3, lr} - ldr r0, _02308D44 ; =ov11_02324D8C - ldr r0, [r0] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl MemFree - ldr r0, _02308D44 ; =ov11_02324D8C - mov r1, #0 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_02308D44: .word ov11_02324D8C - arm_func_end ov11_02308D1C - - arm_func_start ov11_02308D48 -ov11_02308D48: ; 0x02308D48 - stmdb sp!, {r3, lr} - ldr r0, _02308DD4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - ldrsb r0, [r0, #6] - cmp r0, r1 - beq _02308D78 - bl CloseParentMenu - ldr r0, _02308DD4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #6] -_02308D78: - ldr r0, _02308DD4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - ldrsb r0, [r0, #5] - cmp r0, r1 - beq _02308DA4 - bl CloseTextBox2 - ldr r0, _02308DD4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #5] -_02308DA4: - ldr r0, _02308DD4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - ldrsb r0, [r0, #4] - cmp r0, r1 - ldmeqia sp!, {r3, pc} - bl CloseInventoryMenu - ldr r0, _02308DD4 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #4] - ldmia sp!, {r3, pc} - .align 2, 0 -_02308DD4: .word ov11_02324D8C - arm_func_end ov11_02308D48 - - arm_func_start ov11_02308DD8 -ov11_02308DD8: ; 0x02308DD8 - stmdb sp!, {r3, r4, lr} - sub sp, sp, #0xc - ldr r1, [r0] - cmp r1, #0 - bne _02308E20 - ldrsh r0, [r0, #4] - bl GetTeamMember - mov r4, r0 - bl sub_02055894 - bl sub_020564B0 - ldr r1, _02308EAC ; =ov11_02324D8C - mov r2, r0 - ldr r0, [r1] - mov r1, r4 - add r0, r0, #0x36 - add r0, r0, #0x100 - bl sub_02056094 - b _02308E94 -_02308E20: - cmp r1, #1 - bne _02308E94 - ldrsh r0, [r0, #4] - bl GetActiveTeamMember - mov r4, r0 - add r0, sp, #0 - add r1, r4, #0x5e - mov r2, #0xa - bl StrncpySimpleNoPadSafe - ldrb r0, [r4] - mov r2, #0x44 - ldr r1, _02308EB0 ; =ov11_02322DB8 - tst r0, #2 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - ldrb r0, [r4, #1] - movne r2, #0x46 - add r3, sp, #0 - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - ldr r0, _02308EAC ; =ov11_02324D8C - movne r2, #0x59 - ldr r0, [r0] - add r0, r0, #0x36 - add r0, r0, #0x100 - bl ov11_02308EB4 -_02308E94: - ldr r0, _02308EAC ; =ov11_02324D8C - ldr r0, [r0] - add r0, r0, #0x36 - add r0, r0, #0x100 - add sp, sp, #0xc - ldmia sp!, {r3, r4, pc} - .align 2, 0 -_02308EAC: .word ov11_02324D8C -_02308EB0: .word ov11_02322DB8 - arm_func_end ov11_02308DD8 - - arm_func_start ov11_02308EB4 -ov11_02308EB4: ; 0x02308EB4 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3, lr} - add r2, sp, #0xc - bic r2, r2, #3 - ldr r1, [sp, #0xc] - add r2, r2, #4 - bl vsprintf - ldmia sp!, {r3, lr} - add sp, sp, #0x10 - bx lr - arm_func_end ov11_02308EB4 - - arm_func_start ov11_02308EDC -ov11_02308EDC: ; 0x02308EDC - stmdb sp!, {r3, lr} - ldr r1, _02308F10 ; =ov11_02324D8C - mvn r0, #1 - ldr r1, [r1] - ldrsb r1, [r1, #8] - cmp r1, r0 - ldmneia sp!, {r3, pc} - mov r0, #0 - bl CreateDialogueBox - ldr r1, _02308F10 ; =ov11_02324D8C - ldr r1, [r1] - strb r0, [r1, #8] - ldmia sp!, {r3, pc} - .align 2, 0 -_02308F10: .word ov11_02324D8C - arm_func_end ov11_02308EDC - - arm_func_start ov11_02308F14 -ov11_02308F14: ; 0x02308F14 - stmdb sp!, {r3, lr} - ldr r0, _02308F48 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - ldrsb r0, [r0, #8] - cmp r0, r1 - ldmeqia sp!, {r3, pc} - bl CloseDialogueBox - ldr r0, _02308F48 ; =ov11_02324D8C - mvn r1, #1 - ldr r0, [r0] - strb r1, [r0, #8] - ldmia sp!, {r3, pc} - .align 2, 0 -_02308F48: .word ov11_02324D8C - arm_func_end ov11_02308F14 - - arm_func_start ov11_02308F4C -ov11_02308F4C: ; 0x02308F4C - stmdb sp!, {r4, lr} - ldr r2, [r1] - ldr r1, [r1, #4] - mov r4, r0 - str r2, [r4] - str r1, [r4, #4] - ldr r0, [r4] - cmp r0, #0 - bne _02308F9C - ldrsh r0, [r4, #4] - bl GetTeamMember - ldrsh r3, [r0, #4] - add r2, r0, #0x14 - add r1, r0, #8 - strh r3, [r4, #8] - ldrb r0, [r0, #2] - strb r0, [r4, #0xa] - str r2, [r4, #0xc] - str r1, [r4, #0x10] - ldmia sp!, {r4, pc} -_02308F9C: - cmp r0, #1 - ldmneia sp!, {r4, pc} - ldrsh r0, [r4, #4] - bl GetActiveTeamMember - ldrsh r3, [r0, #0xc] - add r2, r0, #0x4c - add r1, r0, #6 - strh r3, [r4, #8] - ldrb r0, [r0, #3] - strb r0, [r4, #0xa] - str r2, [r4, #0xc] - str r1, [r4, #0x10] - ldmia sp!, {r4, pc} - arm_func_end ov11_02308F4C - - arm_func_start ov11_02308FD0 -ov11_02308FD0: ; 0x02308FD0 - stmdb sp!, {r3, lr} - ldr r1, [r0] - cmp r1, #1 - ldmneia sp!, {r3, pc} - ldrsh r0, [r0, #4] - bl sub_02058794 - ldmia sp!, {r3, pc} - arm_func_end ov11_02308FD0 - - arm_func_start ov11_02308FEC -ov11_02308FEC: ; 0x02308FEC - stmdb sp!, {r3, lr} - ldr r1, [r0] - cmp r1, #0 - bne _02309008 - ldrsh r0, [r0, #4] - bl sub_0203FA64 - ldmia sp!, {r3, pc} -_02309008: - cmp r1, #1 - ldmneia sp!, {r3, pc} - ldrsh r0, [r0, #4] - bl sub_0203FBD4 - ldmia sp!, {r3, pc} - arm_func_end ov11_02308FEC - - arm_func_start ov11_0230901C -ov11_0230901C: ; 0x0230901C - ldr r1, [r0] - cmp r1, #0 - ldreqsh r0, [r0, #4] - orreq r0, r0, #0x20000 - bxeq lr - cmp r1, #1 - ldreqsh r0, [r0, #4] - orreq r0, r0, #0x30000 - bx lr - arm_func_end ov11_0230901C - - arm_func_start ov11_02309040 -ov11_02309040: ; 0x02309040 - stmdb sp!, {r4, lr} - mov r4, r0 - ldr r0, _0230907C ; =0x00000794 - mov r1, #8 - bl MemAlloc - ldr r1, _02309080 ; =ov11_02324D90 - cmp r0, #0 - str r0, [r1] - moveq r0, #0 -#ifdef JAPAN - strne r4, [r0, #0xf4] -#else - strne r4, [r0, #0x114] -#endif - ldrne r0, [r1] - movne r1, #0 - strne r1, [r0] - movne r0, #1 - ldmia sp!, {r4, pc} - .align 2, 0 -#ifdef JAPAN -_0230907C: .word 0x00000774 -#else -_0230907C: .word 0x00000794 -#endif -_02309080: .word ov11_02324D90 - arm_func_end ov11_02309040 - - arm_func_start ov11_02309084 -ov11_02309084: ; 0x02309084 #ifdef JAPAN #define OV11_02309084_OFFSET -0x20 #else #define OV11_02309084_OFFSET 0 #endif - stmdb sp!, {r4, lr} - mov r4, r0 - ldr r0, _023090D4 ; =0x00000794 - mov r1, #8 - bl MemAlloc - ldr r1, _023090D8 ; =ov11_02324D90 - cmp r0, #0 - str r0, [r1] - moveq r0, #0 - ldmeqia sp!, {r4, pc} - mov r2, #2 - str r2, [r0, #0x114 + OV11_02309084_OFFSET] - ldr r0, [r1] - mov r2, #0 - str r2, [r0] - ldr r1, [r1] - mov r0, #1 -#ifdef JAPAN - strh r4, [r1, #0xf8] -#else - add r1, r1, #0x100 - strh r4, [r1, #0x18] -#endif - ldmia sp!, {r4, pc} - .align 2, 0 -#ifdef JAPAN -_023090D4: .word 0x00000774 -#else -_023090D4: .word 0x00000794 -#endif -_023090D8: .word ov11_02324D90 - arm_func_end ov11_02309084 + + .text arm_func_start ov11_023090DC ov11_023090DC: ; 0x023090DC diff --git a/include/overlay_11_02307334.h b/include/overlay_11_02307334.h index f8280731..f1187aa4 100644 --- a/include/overlay_11_02307334.h +++ b/include/overlay_11_02307334.h @@ -1,6 +1,36 @@ #ifndef PMDSKY_OVERLAY_11_02307334_H #define PMDSKY_OVERLAY_11_02307334_H +#include "common.h" + +struct unk_02309DAC { + s32 field_0x0; + s16 field_0x4; +}; + +struct unk_02308F4C { + s32 field_0x0; + s16 field_0x4; + u8 field_0x6[2]; + s16 field_0x8; + u8 field_0xa; + u8 field_0xb; + u32 *field_0xc; + s16 *field_0x10; +}; + s32 ov11_02307334(void); +void ov11_02308D1C(void); +void ov11_02308D48(void); +char* ov11_02308DD8(struct unk_02308F4C *a); +void ov11_02308EB4(char *str, const char *format, ...); +void ov11_02308EDC(void); +void ov11_02308F14(void); +void ov11_02308F4C(struct unk_02308F4C *dst, const struct unk_02309DAC *src); +void ov11_02308FD0(struct unk_02308F4C *a); +void ov11_02308FEC(struct unk_02308F4C *a); +s32 ov11_0230901C(struct unk_02308F4C *a); +int ov11_02309040(s32 param_1); +int ov11_02309084(s16 param_1); #endif diff --git a/main.lsf b/main.lsf index 5d341b07..0106c954 100644 --- a/main.lsf +++ b/main.lsf @@ -661,7 +661,7 @@ Overlay OVY_11 Object src/overlay_11_022FE58C.o Object asm/overlay_11_022FE5F8.o Object src/overlay_11_02307334.o - Object asm/overlay_11_02308D1C.o + Object asm/overlay_11_023090DC.o Object src/overlay_11_0230CB88.o Object src/overlay_11_0230CD48.o Object asm/overlay_11_0230CE30.o diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index 6dcc3aa9..2e9a1b4d 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -20,22 +20,34 @@ #include "overlay_31_02382820.h" #include "main_020114F8.h" #include "main_0203088C.h" +#include "main_02001188.h" +#include "common.h" +#include +extern void sub_02056094(char *dst, struct ground_monster *ground_monster, + bool8 is_leader); -struct unk_02309DAC { +struct unk_02324D90 { s32 field_0x0; - s16 field_0x4; +#ifdef JAPAN + u8 field_0x4[0xF0]; +#else + u8 field_0x4[0x110]; +#endif + s32 field_0x114; + s16 field_0x118; + u8 field_0x11a[0x67A]; }; -struct unk_02308F4C { - s32 field_0x0; - s16 field_0x4; - u8 field_0x6[2]; - s16 field_0x8; - u8 field_0xa; - u8 field_0xb; - u32 *field_0xc; - s16 *field_0x10; -}; +extern struct unk_02324D90 *ov11_02324D90; +extern char ov11_02322DB8[]; +extern void StrncpySimpleNoPadSafe(u8 *dest, const u8 *src, u32 n); +extern s32 sub_02055894(struct ground_monster *member); +extern bool8 sub_020564B0(int idx); +extern s32 vsprintf(u8 *str, const u8 *format, va_list ap); +extern s8 CreateDialogueBox(s8); +extern void CloseDialogueBox(s8); +extern void sub_0203FA64(s16 idx); +extern void sub_0203FBD4(s16 idx); struct unk_02324D8C { s32 field_0x0; s8 field_0x4; @@ -51,7 +63,8 @@ struct unk_02324D8C { s32 field_0x10; s32 field_0x14; s32 field_0x18; - struct struct_2 field_0x1c; struct preprocessor_args field_0xb4; u8 field_0x104[0x134]; + struct struct_2 field_0x1c; struct preprocessor_args field_0xb4; u8 field_0x104[0x32]; + char field_0x136[0x102]; struct unk_02308F4C field_0x238; s16 field_0x24c; s16 field_0x24e; s16 field_0x250; @@ -108,16 +121,6 @@ extern u8 PopInventoryMenuField0x1A3(s32 window_id); extern void SetItemAcquired(struct item *); extern void SortItemsInBag(void); extern void *memcpy(void *, const void *, u32); -extern void ov11_02308D48(void); -extern void *ov11_02308DD8(void *); -extern void ov11_02308EDC(void); -extern void ov11_02308F14(void); -extern void ov11_02308F4C(void *dst, const void *src); -extern void ov11_02308FD0(void *); -extern void ov11_02308FEC(void *); -extern s32 ov11_0230901C(void *); -extern int ov11_02309040(s32); -extern int ov11_02309084(s16); extern int ov11_023090DC(void); extern void ov11_02309DAC(void *out); extern void ov11_02309DF8(void); @@ -894,3 +897,148 @@ s32 ov11_02307334(void) return 0; } + +void ov11_02308D1C(void) +{ + if (ov11_02324D8C != 0) { + MemFree(ov11_02324D8C); + ov11_02324D8C = 0; + } +} + +void ov11_02308D48(void) +{ + if (ov11_02324D8C->field_0x6 != -2) { + CloseParentMenu(ov11_02324D8C->field_0x6); + ov11_02324D8C->field_0x6 = -2; + } + if (ov11_02324D8C->field_0x5 != -2) { + CloseTextBox2(ov11_02324D8C->field_0x5); + ov11_02324D8C->field_0x5 = -2; + } + if (ov11_02324D8C->field_0x4 != -2) { + CloseInventoryMenu(ov11_02324D8C->field_0x4); + ov11_02324D8C->field_0x4 = -2; + } +} + +char* ov11_02308DD8(struct unk_02308F4C *a) +{ + u8 name[12]; + struct ground_monster *ground_monster; + struct team_member *team_member; + u32 color; + bool8 f; + bool8 leader; + + if (a->field_0x0 == 0) { + ground_monster = GetTeamMember(a->field_0x4); + sub_02056094(ov11_02324D8C->field_0x136, ground_monster, + sub_020564B0(sub_02055894(ground_monster))); + } else if (a->field_0x0 == 1) { + team_member = GetActiveTeamMember(a->field_0x4); + StrncpySimpleNoPadSafe(name, (const u8 *)team_member->name, 10); + color = 0x44; + f = (*(u8 *)team_member & 2) != 0; + if (f) { + color = 0x46; + } + leader = team_member->is_leader != 0; + if (leader) { + color = 0x59; + } + ov11_02308EB4(ov11_02324D8C->field_0x136, ov11_02322DB8, color, name); + } + return ov11_02324D8C->field_0x136; +} + +void ov11_02308EB4(char *str, const char *format, ...) +{ + va_list args; + va_start(args, format); + vsprintf(str, format, args); +} + +void ov11_02308EDC(void) +{ + if (ov11_02324D8C->field_0x8 == -2) { + ov11_02324D8C->field_0x8 = CreateDialogueBox(0); + } +} + +void ov11_02308F14(void) +{ + if (ov11_02324D8C->field_0x8 != -2) { + CloseDialogueBox(ov11_02324D8C->field_0x8); + ov11_02324D8C->field_0x8 = -2; + } +} + +void ov11_02308F4C(struct unk_02308F4C *dst, const struct unk_02309DAC *src) +{ + *(struct unk_02309DAC *)dst = *src; + if (dst->field_0x0 == 0) { + struct ground_monster *mon = GetTeamMember(dst->field_0x4); + + dst->field_0x8 = mon->id; + dst->field_0xa = mon->joined_at; + dst->field_0xc = mon->iq_skill_flags; + dst->field_0x10 = (s16 *)&mon->iq; + } else if (dst->field_0x0 == 1) { + struct team_member *mem = GetActiveTeamMember(dst->field_0x4); + + dst->field_0x8 = *(s16 *)&mem->id; + dst->field_0xa = mem->joined_at; + dst->field_0xc = mem->iq_skill_flags; + dst->field_0x10 = (s16 *)&mem->iq; + } +} + +void ov11_02308FD0(struct unk_02308F4C *a) +{ + if (a->field_0x0 == 1) { + sub_02058794(a->field_0x4); + } +} + +void ov11_02308FEC(struct unk_02308F4C *a) +{ + if (a->field_0x0 == 0) { + sub_0203FA64(a->field_0x4); + } else if (a->field_0x0 == 1) { + sub_0203FBD4(a->field_0x4); + } +} + +s32 ov11_0230901C(struct unk_02308F4C *a) +{ + if (a->field_0x0 == 0) { + return a->field_0x4 | 0x20000; + } + if (a->field_0x0 == 1) { + return a->field_0x4 | 0x30000; + } +} + +int ov11_02309040(s32 param_1) +{ + ov11_02324D90 = MemAlloc(sizeof(struct unk_02324D90), 8); + if (ov11_02324D90 == 0) { + return 0; + } + ov11_02324D90->field_0x114 = param_1; + ov11_02324D90->field_0x0 = 0; + return 1; +} + +int ov11_02309084(s16 param_1) +{ + ov11_02324D90 = MemAlloc(sizeof(struct unk_02324D90), 8); + if (ov11_02324D90 == NULL) { + return 0; + } + ov11_02324D90->field_0x114 = 2; + ov11_02324D90->field_0x0 = 0; + ov11_02324D90->field_0x118 = param_1; + return 1; +} From 9b3650fe33bc77142837c2e4046f10bb5006a5bc Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 13 Sep 2026 13:54:12 -0700 Subject: [PATCH 22/34] Decompile 26 more callees; clear six asm files entirely Twenty-six functions across twelve groups, each group chosen so it clears a .s file's head or the whole file, never splitting one: asm/overlay_29_0231EDFC.s TryHurl asm/overlay_29_0230E064.s TryRecruit asm/overlay_29_0234B130.s ov29_0234B130, ov29_0234B1A4, LogMessageByIdWithPopupCheckParticipants, WaitUntilAlertBoxTextIsLoadedWrapper, LogMessageByIdWithPopupCheckUser, LogMessageWithPopupCheckUser, LogMessageByIdQuiet asm/overlay_29_0231B1B8.s TryActivateBadDreams asm/overlay_29_02301D84.s OtherMonsterAbilityIsActive asm/main_02050300.s SetItemAcquired asm/overlay_29_0230F9A4.s ov29_0230F9A4, TrySpawnEnemyItemDrop asm/main_02051504.s RetrieveFromItemList1, IsForbiddenFloor asm/main_020251F0.s sub_020251F0, StrncpySimpleNoPadSafe asm/main_020261F4.s sub_020261F4, sub_02026204, DrawTextInWindow asm/main_0202B568.s sub_0202B568, GetSimpleMenuResult__0202B870 asm/main_020022C4.s sub_020022C4, sub_020022D0, RandIntSafe Fourteen are callees of the ten previously landed functions; the rest are the neighbours that had to clear first to reach a file boundary. Six .s files are consumed entirely, so main.lsf loses six asm objects and gains six tails. Thirty-five call-site declarations are replaced by an include of the owning header, across twenty-one files. Several were not duplicates but genuine disagreements: GetSimpleMenuResult__0202B870 had five declarations, all giving the window id as s8 against the definition's s32; two were K&R `extern int ov29_0234B1A4();`. None of these can surface in a build, since two declarations in two translation units never meet. A declaration that disagrees is NOT automatically stale. src/overlay_13_0238BDA8.c keeps its own `extern void DrawTextInWindow(s8 window_id, ...)`: that file's DrawPersonalityTestDebug carries the window id in an s8 local, and against the header's s32 the call needs a sign extension retail does not emit. Replacing it broke OVY_13.sbin. Retail's translation units genuinely disagreed about this prototype, so the per-TU declaration is evidence, not a defect to tidy away. Three shared types change, all layout-preserving: * struct team_member's first byte, a 1+7 bitfield pair, becomes u8 flags. TryRecruit writes the whole byte in one strb and reads bit 0 through GetFlag(u8, u8), which takes a value a bitfield member cannot supply. * struct unk_02026130's field_0x4 grows from [4] to [0x118] (total 0x11C). DrawTextInWindow declares one as a local, so its size sets the frame. * alert_box_info::alert_box_window_id becomes s8; it holds -2, and seven ldrsb reads of offset 0xCEC corroborate the signedness. sub_02026194 is corrected from one argument to three: sub_02020BC4 reads r1 and r2 (tst r1, #0x400; strh r1, [r4, #0x60]; str r2, [r4, #0x88]) and every asm caller passes all three, so the wrapper was forwarding registers it never named. Its pre-landing asm was recovered from git and both forms measured. Authored by Claude (Opus 5) under human direction. Each function was measured at decomp.me score 0 in all three regions and re-measured by an independent verifier. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- .../{main_020022C4.inc => main_02002318.inc} | 0 .../{main_020251F0.inc => main_02025230.inc} | 0 .../{main_020261F4.inc => main_02026268.inc} | 3 +- .../{main_0202B568.inc => main_0202B5C8.inc} | 5 +- asm/include/main_02050300.inc | 7 - .../{main_02051504.inc => main_020515C4.inc} | 4 +- asm/include/overlay_29_02301D84.inc | 5 - asm/include/overlay_29_0230E064.inc | 57 -- asm/include/overlay_29_0230F9A4.inc | 19 - asm/include/overlay_29_0230FB30.inc | 6 + asm/include/overlay_29_0231B1B8.inc | 10 - asm/include/overlay_29_0231EDFC.inc | 33 -- asm/include/overlay_29_0234B130.inc | 12 - asm/{main_020022C4.s => main_02002318.s} | 36 +- asm/{main_020251F0.s => main_02025230.s} | 69 +-- asm/{main_020261F4.s => main_02026268.s} | 46 +- asm/{main_0202B568.s => main_0202B5C8.s} | 37 +- asm/main_02050300.s | 64 --- asm/{main_02051504.s => main_020515C4.s} | 62 +- asm/overlay_29_02301D84.s | 89 --- asm/overlay_29_0230E064.s | 374 ------------ asm/overlay_29_0230F9A4.s | 149 ----- asm/overlay_29_0230FB30.s | 37 ++ asm/overlay_29_0231B1B8.s | 108 ---- asm/overlay_29_0231EDFC.s | 534 ------------------ asm/overlay_29_0234B130.s | 171 ------ include/common.h | 4 +- include/dungeon_pokemon_attributes.h | 1 + include/dungeon_recruitment.h | 1 + include/main_0200224C.h | 3 + include/main_020251AC.h | 2 + include/main_0202613C.h | 2 +- include/main_02026174.h | 5 +- include/main_0202B558.h | 2 + include/main_020502B0.h | 1 + include/main_020514CC.h | 3 + include/overlay_29_0230F8AC.h | 2 + include/overlay_29_0231B194.h | 1 + include/overlay_29_0231EDD8.h | 1 + include/overlay_29_0234B024.h | 4 +- include/overlay_29_0234B104.h | 8 + main.lsf | 18 +- src/dungeon_ai.c | 2 +- src/dungeon_logic_6.c | 2 +- src/dungeon_pokemon_attributes.c | 22 + src/dungeon_recruitment.c | 220 ++++++++ src/main_0200224C.c | 20 + src/main_020251AC.c | 39 ++ src/main_02026174.c | 39 +- src/main_0202B558.c | 24 + src/main_0203D538.c | 5 +- src/main_020502B0.c | 29 + src/main_020514CC.c | 41 ++ src/main_02059060.c | 2 +- src/main_0205D11C.c | 3 +- src/main_02065B3C.c | 2 +- src/overlay_11_02307334.c | 10 +- src/overlay_17_0238B10C.c | 2 +- src/overlay_18_0238BF60.c | 2 +- src/overlay_24_init.c | 4 +- src/overlay_25_init.c | 6 +- src/overlay_29_022F0EDC.c | 2 +- src/overlay_29_02306728.c | 2 +- src/overlay_29_02308FBC.c | 8 +- src/overlay_29_0230BBAC.c | 1 - src/overlay_29_0230F8AC.c | 61 ++ src/overlay_29_02311010.c | 5 +- src/overlay_29_0231B194.c | 49 ++ src/overlay_29_0231CBC8.c | 2 +- src/overlay_29_0231EDD8.c | 256 +++++++++ src/overlay_29_0232D1DC.c | 2 +- src/overlay_29_0233836C.c | 2 +- src/overlay_29_0234B104.c | 96 ++++ src/overlay_31_02382820.c | 2 +- src/overlay_31_02383880.c | 6 +- src/status_checks.c | 2 +- src/type_effectiveness.c | 2 +- 77 files changed, 1019 insertions(+), 1948 deletions(-) rename asm/include/{main_020022C4.inc => main_02002318.inc} (100%) rename asm/include/{main_020251F0.inc => main_02025230.inc} (100%) rename asm/include/{main_020261F4.inc => main_02026268.inc} (93%) rename asm/include/{main_0202B568.inc => main_0202B5C8.inc} (86%) delete mode 100644 asm/include/main_02050300.inc rename asm/include/{main_02051504.inc => main_020515C4.inc} (72%) delete mode 100644 asm/include/overlay_29_02301D84.inc delete mode 100644 asm/include/overlay_29_0230E064.inc delete mode 100644 asm/include/overlay_29_0230F9A4.inc create mode 100644 asm/include/overlay_29_0230FB30.inc delete mode 100644 asm/include/overlay_29_0231B1B8.inc delete mode 100644 asm/include/overlay_29_0231EDFC.inc delete mode 100644 asm/include/overlay_29_0234B130.inc rename asm/{main_020022C4.s => main_02002318.s} (53%) rename asm/{main_020251F0.s => main_02025230.s} (90%) rename asm/{main_020261F4.s => main_02026268.s} (86%) rename asm/{main_0202B568.s => main_0202B5C8.s} (87%) delete mode 100644 asm/main_02050300.s rename asm/{main_02051504.s => main_020515C4.s} (66%) delete mode 100644 asm/overlay_29_02301D84.s delete mode 100644 asm/overlay_29_0230E064.s delete mode 100644 asm/overlay_29_0230F9A4.s create mode 100644 asm/overlay_29_0230FB30.s delete mode 100644 asm/overlay_29_0231B1B8.s delete mode 100644 asm/overlay_29_0231EDFC.s delete mode 100644 asm/overlay_29_0234B130.s diff --git a/asm/include/main_020022C4.inc b/asm/include/main_02002318.inc similarity index 100% rename from asm/include/main_020022C4.inc rename to asm/include/main_02002318.inc diff --git a/asm/include/main_020251F0.inc b/asm/include/main_02025230.inc similarity index 100% rename from asm/include/main_020251F0.inc rename to asm/include/main_02025230.inc diff --git a/asm/include/main_020261F4.inc b/asm/include/main_02026268.inc similarity index 93% rename from asm/include/main_020261F4.inc rename to asm/include/main_02026268.inc index fd58f093..8cb78456 100644 --- a/asm/include/main_020261F4.inc +++ b/asm/include/main_02026268.inc @@ -1,15 +1,14 @@ #pragma once -.public _020AFD04 .public AnalyzeText .public DrawChar .public GetColorCodePaletteOffset .public PreprocessStringFromId +.public _020AFD04 .public sub_02020B4C .public sub_02020B60 .public sub_02020B74 .public sub_02020B94 .public sub_02020BC4 -.public sub_02020D7C .public sub_02022118 .public sub_02025C7C .public sub_02025E84 diff --git a/asm/include/main_0202B568.inc b/asm/include/main_0202B5C8.inc similarity index 86% rename from asm/include/main_0202B568.inc rename to asm/include/main_0202B5C8.inc index 2abef97c..212fee34 100644 --- a/asm/include/main_0202B568.inc +++ b/asm/include/main_0202B5C8.inc @@ -1,13 +1,11 @@ #pragma once -.public GetMaxItemsOnPage .public GetNumItemsOnPage .public GetPageItemYOffset .public GetPageStart .public GetSelectedMenuItemIdx -.public GetTotalNumMenuItems -.public GetWindowContents .public IsMenuOptionActive .public PlayWindowInputSound +.public UpdateWindow .public sub_020263C8 .public sub_02027B1C .public sub_0202810C @@ -23,4 +21,3 @@ .public sub_0203250C .public sub_02032684 .public sub_02033758 -.public UpdateWindow diff --git a/asm/include/main_02050300.inc b/asm/include/main_02050300.inc deleted file mode 100644 index 19875dc0..00000000 --- a/asm/include/main_02050300.inc +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once -.public ADVENTURE_LOG_PTR -.public GetAdventureLogCompleted -.public IsItemValidVeneer -.public NormalizeTreasureBox -.public SetAdventureLogCompleted -.public SetResolvedPerformanceProgressFlag diff --git a/asm/include/main_02051504.inc b/asm/include/main_020515C4.inc similarity index 72% rename from asm/include/main_02051504.inc rename to asm/include/main_020515C4.inc index ee539950..7566f88f 100644 --- a/asm/include/main_02051504.inc +++ b/asm/include/main_020515C4.inc @@ -1,10 +1,8 @@ #pragma once -.public _020A1864 .public CopyBitsFrom .public CopyBitsTo .public DUNGEON_RESTRICTIONS -.public DungeonFloorToGroupFloor .public GetItemIdFromList .public GetNbFloorsPlusOne -.public MISSION_FLOORS_FORBIDDEN .public RandIntSafe +.public _020A1864 diff --git a/asm/include/overlay_29_02301D84.inc b/asm/include/overlay_29_02301D84.inc deleted file mode 100644 index 3db6528d..00000000 --- a/asm/include/overlay_29_02301D84.inc +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -.public DefenderAbilityIsActive__02301A0C -.public DUNGEON_PTR -.public EntityIsValid__023000E4 -.public ShouldTreatMonsterAsAlly diff --git a/asm/include/overlay_29_0230E064.inc b/asm/include/overlay_29_0230E064.inc deleted file mode 100644 index d1cc8531..00000000 --- a/asm/include/overlay_29_0230E064.inc +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once -.public abs -.public CanSeeTarget -.public ChangeMonsterAnimationToIdle -.public DUNGEON_PTR -.public DungeonModeSetupAndShowNameKeyboard -.public EnableAllLearnableIqSkills -.public EnsureCanStandCurrentTile -.public GetActiveTeamMember -.public GetDirectionTowardsPosition -.public GetMessageLogPreprocessorArgs -.public GetNameString -.public GetRecoloredNameOfTeamMemberAtIdx -.public GetRecoloredTeamMemberName -.public HandleFaint -.public InitTeamMember -.public IsMonsterOnTeam -.public LogMessageByIdWithPopupCheckUser -.public MonsterIsType -.public ov10_022C4410 -.public ov10_022C441C -.public ov10_022C443C -.public ov10_022C447C -.public ov10_022C44FC -.public ov10_022C46FC -.public ov10_022C4700 -.public ov10_022C4704 -.public ov10_022C4708 -.public ov10_022C470C -.public ov29_022E1B28 -.public ov29_022E68BC -.public ov29_022E8104 -.public ov29_022E81F8 -.public ov29_022EACAC -.public ov29_02305F60 -.public ov29_0230E5A8 -.public ov29_0230E5FC -.public ov29_0230E658 -.public ov29_0234B1A4 -.public ov29_0234D630 -.public ov29_0234D7C0 -.public ov29_0234D838 -.public ov29_0234D8A0 -.public ov29_0234EE10 -.public RECRUITMENT_LEVEL_BOOST_TABLE -.public RemoveMonsterFromTile -.public SetMessageLogPreprocessorArgsString -.public SetPokemonJoined -.public SetPreprocessorArgsIdVal -.public SetPreprocessorArgsStringToName -.public SpecificRecruitCheck -.public StrcpySimple -.public StrncpyName -.public StrncpySimpleNoPad -.public sub_02056698 -.public SubstitutePlaceholderStringTags -.public WaitUntilAlertBoxPauseIsOver diff --git a/asm/include/overlay_29_0230F9A4.inc b/asm/include/overlay_29_0230F9A4.inc deleted file mode 100644 index ace32b8c..00000000 --- a/asm/include/overlay_29_0230F9A4.inc +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public DUNGEON_PTR -.public DungeonRandOutcome__022EAB20 -.public ExclusiveItemEffectIsActive__0230F8AC -.public GenerateStandardItem -.public IqSkillIsEnabled -.public IsMonster__0230F980 -.public LogMessageByIdWithPopupCheckUser -.public SpawnDroppedItemWrapper -.public SubstitutePlaceholderStringTags -.public TreasureBoxDropsEnabled -.public TryGenerateUnownStoneDrop -.public ov10_022C4650 -.public ov29_02344B9C -.public ov29_023460DC -.public ov29_02347184 -.public ov29_0234908C -.public ov29_023529A8 diff --git a/asm/include/overlay_29_0230FB30.inc b/asm/include/overlay_29_0230FB30.inc new file mode 100644 index 00000000..196190d1 --- /dev/null +++ b/asm/include/overlay_29_0230FB30.inc @@ -0,0 +1,6 @@ +#pragma once +.public LogMessageByIdWithPopupCheckUser +.public SubstitutePlaceholderStringTags +.public ov29_02344B9C +.public ov29_02347184 +.public ov29_023529A8 diff --git a/asm/include/overlay_29_0231B1B8.inc b/asm/include/overlay_29_0231B1B8.inc deleted file mode 100644 index 6bf67c84..00000000 --- a/asm/include/overlay_29_0231B1B8.inc +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once -.public ApplyDamageAndEffectsWrapper -.public DUNGEON_PTR -.public EntityIsValid__0231B194 -.public IsMonster__0231B318 -.public IsMonsterSleeping -.public IsValidTargetEntity -.public ov10_022C4530 -.public SetPreprocessorArgsIdVal -.public TryEndPetrifiedOrSleepStatus diff --git a/asm/include/overlay_29_0231EDFC.inc b/asm/include/overlay_29_0231EDFC.inc deleted file mode 100644 index 5fc909c3..00000000 --- a/asm/include/overlay_29_0231EDFC.inc +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -.public _s32_div_f -.public AbilityIsActiveVeneer -.public AdvanceFrame -.public CalcDamageFixedNoCategory -.public CannotMoveToTile -.public CanSeeTarget -.public ChangeMonsterAnimation -.public ChangeMonsterAnimationToIdle -.public DIRECTIONS_XY -.public DUNGEON_PTR -.public DungeonRandInt -.public DungeonRandRange -.public EntityIsValid__0231F570 -.public GetDirectionTowardsPosition -.public GetTile -.public GetTreatmentBetweenMonsters -.public HasDropeyeStatus -.public HURL_DAMAGE -.public InitMove -.public LogMessageByIdWithPopupCheckUserTarget -.public MoveMonsterToPos -.public ov29_022E9298 -.public ov29_022EA370 -.public ov29_0232033C -.public ov29_02321238 -.public PlaySeByIdIfNotSilence -.public ShouldDisplayEntityWrapper -.public SinAbs4096 -.public SubstitutePlaceholderStringTags -.public TryWarp -.public TwoTurnMoveForcedMiss -.public UpdateEntityPixelPos diff --git a/asm/include/overlay_29_0234B130.inc b/asm/include/overlay_29_0234B130.inc deleted file mode 100644 index 94e40567..00000000 --- a/asm/include/overlay_29_0234B130.inc +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -.public AdvanceFrame -.public FullyCloseAlertBox -.public InitPreprocessorArgs -.public LogMessage -.public LogMessageByIdWithPopupCheckUserTarget -.public MESSAGE_LOG_INFO -.public ov29_022E9FC0 -.public ShouldDisplayEntityWrapper -.public StringFromId -.public UnkMapRelatedFunc -.public WaitUntilAlertBoxTextIsLoaded diff --git a/asm/main_020022C4.s b/asm/main_02002318.s similarity index 53% rename from asm/main_020022C4.s rename to asm/main_02002318.s index da40ad4f..e0d9367a 100644 --- a/asm/main_020022C4.s +++ b/asm/main_02002318.s @@ -1,42 +1,8 @@ .include "asm/macros.inc" - .include "main_020022C4.inc" + .include "main_02002318.inc" .text - arm_func_start sub_020022C4 -sub_020022C4: ; 0x020022C4 - mov r1, #1 - str r1, [r0] - bx lr - arm_func_end sub_020022C4 - - arm_func_start sub_020022D0 -sub_020022D0: ; 0x020022D0 - ldr r3, [r0] - ldr r2, _020022F4 ; =0x5D588B65 - mul r2, r3, r2 - add r3, r2, #1 - mov r2, r3, lsr #0x10 - mul r1, r2, r1 - str r3, [r0] - mov r0, r1, lsr #0x10 - bx lr - .align 2, 0 -_020022F4: .word 0x5D588B65 - arm_func_end sub_020022D0 - - arm_func_start RandIntSafe -RandIntSafe: ; 0x020022F8 - stmdb sp!, {r4, lr} - mov r4, r0 - bl Rand16Bit - mov r0, r0, lsl #0x10 - mov r1, r0, lsr #0x10 - mul r0, r1, r4 - mov r0, r0, asr #0x10 - ldmia sp!, {r4, pc} - arm_func_end RandIntSafe - arm_func_start RandRangeSafe RandRangeSafe: ; 0x02002318 stmdb sp!, {r3, r4, r5, lr} diff --git a/asm/main_020251F0.s b/asm/main_02025230.s similarity index 90% rename from asm/main_020251F0.s rename to asm/main_02025230.s index 0f61c6c9..8fed9a76 100644 --- a/asm/main_020251F0.s +++ b/asm/main_02025230.s @@ -1,75 +1,8 @@ .include "asm/macros.inc" - .include "main_020251F0.inc" + .include "main_02025230.inc" .text - arm_func_start sub_020251F0 -sub_020251F0: ; 0x020251F0 -#ifdef JAPAN - ldr r1, _02025264 ; =_020B112C_JP - ldr r1, [r1, #4] - add r2, r1, r0, lsl #1 - ldrb r1, [r1, r0, lsl #1] - ldrb r0, [r2, #1] - add r0, r0, r1, lsl #8 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bx lr - .align 2, 0 -_02025264: .word _020B112C_JP -#else - bx lr -#endif - arm_func_end sub_020251F0 - - arm_func_start StrncpySimpleNoPadSafe -StrncpySimpleNoPadSafe: ; 0x020251F4 -#ifdef JAPAN - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - mov r4, r2 - b _02025294 -_0202527C: - ldrb r0, [r5], #1 - bl sub_020251F0 - mov r1, r0, asr #8 - strb r1, [r6] - strb r0, [r6, #1] - add r6, r6, #2 -_02025294: - cmp r4, #0 - sub r4, r4, #1 - ble _020252AC - ldrb r0, [r5] - cmp r0, #0 - bne _0202527C -_020252AC: - mov r0, #0 - strb r0, [r6] - ldmia sp!, {r4, r5, r6, pc} -#else - mov ip, #0x20 - b _0202520C -_020251FC: - ldrb r3, [r1], #1 - cmp r3, #0x100 - strlob r3, [r0], #1 - strhsb ip, [r0], #1 -_0202520C: - cmp r2, #0 - sub r2, r2, #1 - ble _02025224 - ldrb r3, [r1] - cmp r3, #0 - bne _020251FC -_02025224: - mov r1, #0 - strb r1, [r0] - bx lr -#endif - arm_func_end StrncpySimpleNoPadSafe - arm_func_start StrcpyName StrcpyName: ; 0x02025230 #ifdef JAPAN diff --git a/asm/main_020261F4.s b/asm/main_02026268.s similarity index 86% rename from asm/main_020261F4.s rename to asm/main_02026268.s index 8b7f0812..7b37b257 100644 --- a/asm/main_020261F4.s +++ b/asm/main_02026268.s @@ -1,52 +1,8 @@ .include "asm/macros.inc" - .include "main_020261F4.inc" + .include "main_02026268.inc" .text - arm_func_start sub_020261F4 -sub_020261F4: ; 0x020261F4 - ldr ip, _02026200 ; =sub_02020D7C - add r0, r0, #4 - bx ip - .align 2, 0 -_02026200: .word sub_02020D7C - arm_func_end sub_020261F4 - - arm_func_start sub_02026204 -sub_02026204: ; 0x02026204 - ldr ip, _02026210 ; =AnalyzeText - add r0, r0, #4 - bx ip - .align 2, 0 -_02026210: .word AnalyzeText - arm_func_end sub_02026204 - - arm_func_start DrawTextInWindow -DrawTextInWindow: ; 0x02026214 - stmdb sp!, {r3, r4, lr} - sub sp, sp, #0x124 - mov r4, r0 - str r1, [sp] - mov r1, r4 - add r0, sp, #8 - mov r4, r3 - str r2, [sp, #4] - bl sub_02025E84 - add r0, sp, #0xc - add r1, sp, #0 - bl sub_02020B60 - ldr r1, _02026264 ; =0x0000C402 - add r0, sp, #0xc - mov r2, r4 - bl sub_02020BC4 - add r0, sp, #0xc - bl AnalyzeText - add sp, sp, #0x124 - ldmia sp!, {r3, r4, pc} - .align 2, 0 -_02026264: .word 0x0000C402 - arm_func_end DrawTextInWindow - arm_func_start AppendStandardStringToMission AppendStandardStringToMission: ; 0x02026268 stmdb sp!, {r4, lr} diff --git a/asm/main_0202B568.s b/asm/main_0202B5C8.s similarity index 87% rename from asm/main_0202B568.s rename to asm/main_0202B5C8.s index 9f929512..6ab0dc85 100644 --- a/asm/main_0202B568.s +++ b/asm/main_0202B5C8.s @@ -1,43 +1,8 @@ .include "asm/macros.inc" - .include "main_0202B568.inc" + .include "main_0202B5C8.inc" .text - arm_func_start sub_0202B568 -sub_0202B568: ; 0x0202B568 - stmdb sp!, {r3, lr} - bl GetWindowContents - add r0, r0, #4 - bl GetMaxItemsOnPage - ldmia sp!, {r3, pc} - arm_func_end sub_0202B568 - - arm_func_start GetSimpleMenuResult__0202B870 -GetSimpleMenuResult__0202B870: ; 0x0202B57C - stmdb sp!, {r4, lr} - bl GetWindowContents - ldrb r1, [r0, #0x1a0] - ldr r4, [r0, #0x198] - cmp r1, #0 - beq _0202B5C0 - ldrb r1, [r0, #0x1a1] - add r0, r0, #4 - cmp r1, #0 - beq _0202B5AC - bl GetTotalNumMenuItems - b _0202B5B0 -_0202B5AC: - bl GetSelectedMenuItemIdx -_0202B5B0: - add r0, r0, r0, lsl #6 - add r0, r4, r0, lsl #2 - ldr r0, [r0, #0x100] - ldmia sp!, {r4, pc} -_0202B5C0: - mov r0, #0 - ldmia sp!, {r4, pc} - arm_func_end GetSimpleMenuResult__0202B870 - arm_func_start UpdateSimpleMenu UpdateSimpleMenu: ; 0x0202B5C8 stmdb sp!, {r4, r5, r6, lr} diff --git a/asm/main_02050300.s b/asm/main_02050300.s deleted file mode 100644 index 5e9aa045..00000000 --- a/asm/main_02050300.s +++ /dev/null @@ -1,64 +0,0 @@ - .include "asm/macros.inc" - .include "main_02050300.inc" - - .text - - arm_func_start SetItemAcquired -SetItemAcquired: ; 0x02050300 - stmdb sp!, {r4, r5, r6, lr} - ldrsh r0, [r0, #4] - bl NormalizeTreasureBox - mov r4, r0 - mov r0, r4, lsl #0x10 - mov r0, r0, asr #0x10 - bl IsItemValidVeneer - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, pc} - cmp r4, #0x3b - blt _02050380 - cmp r4, #0x41 - bgt _02050380 - sub r0, r4, #0x21 - and r0, r0, #0xff - mov r5, #1 - bl SetAdventureLogCompleted - mov r6, #0x1a - b _02050364 -_0205034C: - and r0, r6, #0xff - bl GetAdventureLogCompleted - cmp r0, #0 - moveq r5, #0 - beq _0205036C - add r6, r6, #1 -_02050364: - cmp r6, #0x20 - ble _0205034C -_0205036C: - cmp r5, #0 - beq _02050380 - mov r0, #0x15 - mov r1, #1 - bl SetResolvedPerformanceProgressFlag -_02050380: - ldr r3, _020503C8 ; =ADVENTURE_LOG_PTR - mov r0, r4, asr #4 - ldr ip, [r3] - add r0, r4, r0, lsr #27 - mov r2, r4, lsr #0x1f - rsb r1, r2, r4, lsl #27 - add lr, ip, #0x1b0 - mov ip, r0, asr #5 - ldr r4, [lr, ip, lsl #2] - add r0, r2, r1, ror #27 - mov r1, #1 - orr r0, r4, r1, lsl r0 - str r0, [lr, ip, lsl #2] - ldr r1, [r3] - ldr r0, [r1] - orr r0, r0, #8 - str r0, [r1] - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_020503C8: .word ADVENTURE_LOG_PTR - arm_func_end SetItemAcquired diff --git a/asm/main_02051504.s b/asm/main_020515C4.s similarity index 66% rename from asm/main_02051504.s rename to asm/main_020515C4.s index fd88c3ab..bb64bfa4 100644 --- a/asm/main_02051504.s +++ b/asm/main_020515C4.s @@ -1,68 +1,8 @@ .include "asm/macros.inc" - .include "main_02051504.inc" + .include "main_020515C4.inc" .text - arm_func_start RetrieveFromItemList1 -RetrieveFromItemList1: ; 0x02051504 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r0 - ldr r0, _02051564 ; =0x0000270F - mov r6, r1 - bl RandIntSafe - mov r4, r0 - ldr r0, _02051564 ; =0x0000270F - bl RandIntSafe - mov r5, r0 - ldrb r0, [r7] - cmp r0, #0xb4 - cmphs r0, #0xd3 - movhs r0, #0x55 - ldmhsia sp!, {r3, r4, r5, r6, r7, pc} - bl GetNbFloorsPlusOne - ldrb r1, [r7, #1] - cmp r1, r0 - movhs r0, #0x55 - ldmhsia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r6 - mov r1, r4 - mov r2, r5 - bl GetItemIdFromList - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_02051564: .word 0x0000270F - arm_func_end RetrieveFromItemList1 - - arm_func_start IsForbiddenFloor -IsForbiddenFloor: ; 0x02051568 - stmdb sp!, {r3, lr} - mov r1, r0 - add r0, sp, #0 - bl DungeonFloorToGroupFloor - ldrb ip, [sp] - ldrb lr, [sp, #1] - ldr r1, _020515C0 ; =MISSION_FLOORS_FORBIDDEN - mov r3, #0 -_02051588: - ldrb r0, [r1, r3, lsl #1] - mov r2, r3, lsl #1 - cmp r0, #0x64 - beq _020515B8 - cmp ip, r0 - addeq r0, r1, r2 - ldreqb r0, [r0, #1] - cmpeq lr, r0 - moveq r0, #1 - ldmeqia sp!, {r3, pc} - add r3, r3, #1 - b _02051588 -_020515B8: - mov r0, #0 - ldmia sp!, {r3, pc} - .align 2, 0 -_020515C0: .word MISSION_FLOORS_FORBIDDEN - arm_func_end IsForbiddenFloor - arm_func_start Copy16BitsTo Copy16BitsTo: ; 0x020515C4 stmdb sp!, {r3, r4, r5, lr} diff --git a/asm/overlay_29_02301D84.s b/asm/overlay_29_02301D84.s deleted file mode 100644 index 76575589..00000000 --- a/asm/overlay_29_02301D84.s +++ /dev/null @@ -1,89 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02301D84.inc" - - .text - - arm_func_start OtherMonsterAbilityIsActive -OtherMonsterAbilityIsActive: ; 0x02301D84 -#ifdef JAPAN - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r5, r0 - mov r4, r1 - mov r7, #0 - ldr r6, _02301E14 ; =DUNGEON_PTR - b _02303354 -_023032F4: - ldr r0, [r6] - add r0, r0, r7, lsl #2 - add r0, r0, #0x12000 - ldr r8, [r0, #0xad4] - mov r0, r8 - bl EntityIsValid__023000E4 - cmp r0, #0 - cmpne r5, r8 - beq _02303348 - mov r0, r5 - mov r1, r8 - bl ShouldTreatMonsterAsAlly - cmp r0, #0 - beq _02303348 - mov r0, r5 - mov r1, r8 - mov r2, r4 - bl DefenderAbilityIsActive__02301A0C - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r4, r5, r6, r7, r8, pc} -_02303348: - add r0, r7, #1 - mov r0, r0, lsl #0x10 - mov r7, r0, asr #0x10 -_02303354: - cmp r7, #0x14 - blt _023032F4 - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -#else - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r7, r0 - mov r6, r1 - mov r5, #0 - mov r4, #1 - ldr r8, _02301E14 ; =DUNGEON_PTR - b _02301E04 -_02301DA0: - ldr r0, [r8] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 - ldr sb, [r0, #0xb78] - mov r0, sb - bl EntityIsValid__023000E4 - cmp r0, #0 - cmpne r7, sb - beq _02301DF8 - mov r0, r7 - mov r1, sb - bl ShouldTreatMonsterAsAlly - cmp r0, #0 - beq _02301DF8 - mov r0, r7 - mov r1, sb - mov r2, r6 - mov r3, r4 - bl DefenderAbilityIsActive__02301A0C - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_02301DF8: - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 -_02301E04: - cmp r5, #0x14 - blt _02301DA0 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -#endif - .align 2, 0 -_02301E14: .word DUNGEON_PTR - arm_func_end OtherMonsterAbilityIsActive diff --git a/asm/overlay_29_0230E064.s b/asm/overlay_29_0230E064.s deleted file mode 100644 index d569cf76..00000000 --- a/asm/overlay_29_0230E064.s +++ /dev/null @@ -1,374 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0230E064.inc" - - .text - - arm_func_start TryRecruit -TryRecruit: ; 0x0230E064 -#ifdef JAPAN -#define TRY_RECRUIT_OFFSET -4 -#define TRY_RECRUIT_OFFSET_2 -0x2C0 -#else -#define TRY_RECRUIT_OFFSET 0 -#define TRY_RECRUIT_OFFSET_2 0 -#endif -#ifdef JAPAN - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} -#else - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} -#endif - sub sp, sp, #0x114 + TRY_RECRUIT_OFFSET - mov sl, r0 - mov r0, #0xa - mov r5, #0 - mov sb, r1 - mov r8, r2 - bl WaitUntilAlertBoxPauseIsOver - mov r0, r5 - bl ov29_0234B1A4 - bl ov29_0234D630 - add r0, sb, #4 - add r1, sl, #4 - mvn r7, #0 - bl GetDirectionTowardsPosition - mov r6, r0 - ldr r4, [sb, #0xb4] - mov r0, r5 - strb r0, [sb, #0x22] - mov r0, sl - mov r1, sb - bl ov29_02305F60 - mov r1, r6 - mov r0, sb - bl ChangeMonsterAnimationToIdle - ldrsh r0, [r4, #2] - mov r1, #1 - bl IsMonsterOnTeam - cmp r0, #0 - beq _0230E0FC - bl GetMessageLogPreprocessorArgs - mov r1, #1 - str r1, [sp] - mov r1, r5 - ldr r2, [sb, #0xb4] - mov r3, r1 - bl SetPreprocessorArgsStringToName - b _0230E114 -_0230E0FC: - bl GetMessageLogPreprocessorArgs - mov r1, r5 - str r1, [sp] - ldr r2, [sb, #0xb4] - mov r3, r1 - bl SetPreprocessorArgsStringToName -_0230E114: - bl GetMessageLogPreprocessorArgs - mov r1, r0 - mov r3, #1 - mov r2, #0 - str r3, [sp] - ldr r0, _0230E55C ; =0x00000C77 - mov r3, r2 - bl ov29_0234D7C0 - cmp r0, #2 - moveq r4, #0 - beq _0230E524 - mov r4, #1 - mov r0, #0 - orr r1, r4, #2 - strb r1, [sp, #0xac + TRY_RECRUIT_OFFSET] - strb r0, [sp, #0xad + TRY_RECRUIT_OFFSET] - ldrsh r2, [r8, #0xc] - ldr r1, _0230E560 ; =DUNGEON_PTR - sub r3, r0, #1 - strb r2, [sp, #0xae + TRY_RECRUIT_OFFSET] - strh r4, [sp, #0xb2 + TRY_RECRUIT_OFFSET] - ldr r2, [r1] - ldrh r4, [r8, #0x44] - add r1, sp, #0x14 - strh r4, [r1, #0xf2 + TRY_RECRUIT_OFFSET] - ldrh r4, [r8, #0x46] - strh r4, [r1, #0xf4 + TRY_RECRUIT_OFFSET] - strb r0, [sp, #0x104 + TRY_RECRUIT_OFFSET] - strh r3, [sp, #0xb4 + TRY_RECRUIT_OFFSET] - strh r3, [sp, #0xb6 + TRY_RECRUIT_OFFSET] - ldrsh r1, [r8] - strh r1, [sp, #0xb8 + TRY_RECRUIT_OFFSET] - ldrb r1, [r2, #0x748] - strb r1, [sp, #0xaf + TRY_RECRUIT_OFFSET] - ldrb r1, [r2, #0x749] - add r2, sp, #0xac + TRY_RECRUIT_OFFSET - strb r1, [sp, #0xb0 + TRY_RECRUIT_OFFSET] - ldrsh r1, [r8, #6] - strh r1, [sp, #0xba + TRY_RECRUIT_OFFSET] - ldrsh r1, [r8, #6] - strh r1, [sp, #0xbc + TRY_RECRUIT_OFFSET] - ldrh r1, [r8, #0x14] - strh r1, [sp, #0xf0 + TRY_RECRUIT_OFFSET] - ldrh r1, [r8, #0x16] - strh r1, [sp, #0xf2 + TRY_RECRUIT_OFFSET] - ldrh r1, [r8, #0x18] - strh r1, [sp, #0xf4 + TRY_RECRUIT_OFFSET] - ldrh r1, [r8, #0x1a] - strh r1, [sp, #0xf6 + TRY_RECRUIT_OFFSET] -_0230E1D8: - add r4, r8, r0 - ldrb r1, [r4, #8] - add r3, r2, r0 - add r0, r0, #1 - strb r1, [r3, #0x12] - ldrb r1, [r4, #0xa] - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - strb r1, [r3, #0x14] - cmp r0, #2 - blt _0230E1D8 - ldr r0, [r8, #0x10] - add r2, sp, #0xc8 + TRY_RECRUIT_OFFSET - str r0, [sp, #0xc4 + TRY_RECRUIT_OFFSET] - add r3, r8, #0x22 - mov r1, #0x11 -_0230E218: - ldrh r0, [r3], #2 - subs r1, r1, #1 - strh r0, [r2], #2 - bne _0230E218 - ldrh r0, [r8, #0x1c] - strh r0, [sp, #0xea + TRY_RECRUIT_OFFSET] - ldrh r0, [r8, #0x1e] - strh r0, [sp, #0xec + TRY_RECRUIT_OFFSET] - ldrh r0, [r8, #0x20] - strh r0, [sp, #0xee + TRY_RECRUIT_OFFSET] - ldrsh r0, [r8] - bl GetNameString - mov r1, r0 - add r0, sp, #0x100 - add r0, r0, #0xa + TRY_RECRUIT_OFFSET - mov r2, #0xa - bl StrncpyName - ldrsh r1, [sp, #0xb8 + TRY_RECRUIT_OFFSET] - ldrsh r2, [sp, #0xb2 + TRY_RECRUIT_OFFSET] - add r0, sp, #0xf8 + TRY_RECRUIT_OFFSET - bl EnableAllLearnableIqSkills - add r1, sp, #0x100 - add r0, sp, #0x98 - add r1, r1, #0xa + TRY_RECRUIT_OFFSET -#ifdef JAPAN - add r4, sp, #0x18 - bl StrcpySimple -#else - mov r2, #0xa - add r4, sp, #0x18 - bl StrncpySimpleNoPad -#endif - bl ov29_022EACAC - bl GetMessageLogPreprocessorArgs - mov r1, r0 - mov r0, #1 - str r0, [sp] - mov r2, #0 - ldr r0, _0230E564 ; =0x00000C7B - mov r3, r2 - bl ov29_0234D7C0 - cmp r0, #1 - bne _0230E2D4 - bl ov29_0234D838 - add r6, sp, #0x100 - add r6, r6, #0xa + TRY_RECRUIT_OFFSET -_0230E2BC: - mov r0, r6 - add r1, sp, #0x98 - mov r2, #0 - bl DungeonModeSetupAndShowNameKeyboard - cmp r0, #0 - beq _0230E2BC -_0230E2D4: - add r1, sp, #0xac + TRY_RECRUIT_OFFSET - mov r0, r4 - bl GetRecoloredTeamMemberName - mov r1, r4 - mov r0, #0 - bl SetMessageLogPreprocessorArgsString - mov r0, #1 - mov r1, #0 - bl SetPreprocessorArgsIdVal - ldr r0, _0230E568 ; =0x00000C7E - bl ov29_0230E658 - ldrsh r1, [r8, #2] - ldrsh r2, [r8, #4] - mov r0, sb - bl RemoveMonsterFromTile - ldrsh r2, [r8, #2] - ldrsh r3, [r8, #4] - mov r0, sl - mov r1, sb - bl ov29_0230E5A8 - cmp r0, #0 - bne _0230E42C - add r0, sp, #0xac + TRY_RECRUIT_OFFSET - mvn r1, #0 - bl ov29_0230E5FC - mov r7, r0 - b _0230E410 -_0230E340: - ldr r0, _0230E56C ; =0x00000C7F - bl ov29_0230E658 - mvn r4, #0 -_0230E34C: - bl ov29_0234D838 - add r1, sp, #0x100 - mov r0, sb - add r1, r1, #0xa + TRY_RECRUIT_OFFSET - bl ov29_0234EE10 - movs r6, r0 - beq _0230E3D4 - cmp r6, sb - add r0, sp, #0x58 - bne _0230E380 - add r1, sp, #0xac + TRY_RECRUIT_OFFSET - bl GetRecoloredTeamMemberName - b _0230E38C -_0230E380: - ldr r1, [r6, #0xb4] - ldrsh r1, [r1, #0xc] - bl GetRecoloredNameOfTeamMemberAtIdx -_0230E38C: - mov r0, #0 - add r1, sp, #0x58 - bl SetMessageLogPreprocessorArgsString - mov r0, #1 - mov r1, sl - mov r2, #0 - bl SubstitutePlaceholderStringTags - bl GetMessageLogPreprocessorArgs - mov r1, #1 - mov r2, #0 - str r1, [sp] - mov r1, r0 - mov r0, #0xc80 + TRY_RECRUIT_OFFSET_2 - mov r3, r2 - bl ov29_0234D7C0 - mov fp, r0 - cmp fp, r4 - beq _0230E34C -_0230E3D4: - cmp fp, #2 - cmpne r6, #0 - beq _0230E410 - ldr r0, _0230E56C ; =0x00000C7F - add r0, r0, #2 - bl ov29_0230E658 - mov r0, r6 - bl ov29_022E68BC - ldr r1, _0230E570 ; =0x00000233 - mov r0, r6 - mov r2, sl - bl HandleFaint - cmp r6, sb - moveq r4, #1 - beq _0230E524 -_0230E410: - mov r0, sl - mov r1, sb - ldrsh r2, [r8, #2] - ldrsh r3, [r8, #4] - bl ov29_0230E5A8 - cmp r0, #0 - beq _0230E340 -_0230E42C: - mov r6, #0 - mov r4, r6 - mov r5, #1 - b _0230E468 -_0230E43C: - mov r0, r6 - bl GetActiveTeamMember - ldrb r0, [r0] - tst r0, #1 - movne r0, r5 - moveq r0, r4 - tst r0, #0xff - beq _0230E470 - add r0, r6, #1 - mov r0, r0, lsl #0x10 - mov r6, r0, asr #0x10 -_0230E468: - cmp r6, #4 - blt _0230E43C -_0230E470: - add r0, sp, #0xac + TRY_RECRUIT_OFFSET - mov r1, r7 - strh r6, [sp, #0xb6 + TRY_RECRUIT_OFFSET] - bl ov29_0230E5FC - strh r0, [sp, #0xb4 + TRY_RECRUIT_OFFSET] - ldrsh r1, [sp, #0xb4 + TRY_RECRUIT_OFFSET] - mov r0, r6 - bl sub_02056698 - ldr r1, _0230E570 ; =0x00000233 - mov r0, sb - mov r2, sl - bl HandleFaint - mov r0, r6 - bl GetActiveTeamMember - mov r4, r0 - add r7, sp, #0xac + TRY_RECRUIT_OFFSET - mov r6, r4 - mov r5, #6 -_0230E4B8: - ldmia r7!, {r0, r1, r2, r3} - stmia r6!, {r0, r1, r2, r3} - subs r5, r5, #1 - bne _0230E4B8 - ldmia r7, {r0, r1} - stmia r6, {r0, r1} - bl ov29_022E8104 - bl ov29_022E81F8 - add r1, sp, #0x14 - mov r0, #0 - str r1, [sp] - str r0, [sp, #4] - mov r0, #1 - str r0, [sp, #8] - str r0, [sp, #0xc] - str r0, [sp, #0x10] - ldrsh r0, [r8] - ldrsh r1, [r8, #2] - ldrsh r2, [r8, #4] - mov r3, r4 - bl InitTeamMember - ldrsh r0, [r4, #0xc] - bl SetPokemonJoined - bl ov29_022E8104 - bl ov29_022E81F8 - ldr r5, [sp, #0x14] - mov r4, #1 -_0230E524: - mov r0, #1 - bl ov29_0234D8A0 - cmp r4, #0 - bne _0230E540 - ldr r1, _0230E574 ; =0x00000C78 - mov r0, sl - bl LogMessageByIdWithPopupCheckUser -_0230E540: - cmp r5, #0 - beq _0230E550 - mov r0, r5 - bl EnsureCanStandCurrentTile -_0230E550: - mov r0, r4 - add sp, sp, #0x114 + TRY_RECRUIT_OFFSET -#ifdef JAPAN - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -#else - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} -#endif - .align 2, 0 -_0230E55C: .word 0x00000C77 + TRY_RECRUIT_OFFSET_2 -_0230E560: .word DUNGEON_PTR -_0230E564: .word 0x00000C7B + TRY_RECRUIT_OFFSET_2 -_0230E568: .word 0x00000C7E + TRY_RECRUIT_OFFSET_2 -_0230E56C: .word 0x00000C7F + TRY_RECRUIT_OFFSET_2 -_0230E570: .word 0x00000233 -_0230E574: .word 0x00000C78 + TRY_RECRUIT_OFFSET_2 - arm_func_end TryRecruit diff --git a/asm/overlay_29_0230F9A4.s b/asm/overlay_29_0230F9A4.s deleted file mode 100644 index b84e6d22..00000000 --- a/asm/overlay_29_0230F9A4.s +++ /dev/null @@ -1,149 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0230F9A4.inc" - - .text - - arm_func_start ov29_0230F9A4 -ov29_0230F9A4: ; 0x0230F9A4 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - bl IsMonster__0230F980 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r0, [r5, #0xb4] - ldrb r0, [r0, #6] - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, pc} - mov r0, r4 - bl ov29_0234908C - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ov29_0230F9A4 - - arm_func_start TrySpawnEnemyItemDrop -TrySpawnEnemyItemDrop: ; 0x0230F9D8 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #8 - ldr r2, _0230FB28 ; =DUNGEON_PTR - mov r6, r0 - ldr r0, [r2] - mov r5, r1 - ldrb r0, [r0, #0x748] - bl TreasureBoxDropsEnabled - cmp r0, #0 - ldrne r4, [r5, #0xb4] - ldrneb r0, [r4, #6] - cmpne r0, #0 - beq _0230FB20 - ldr r0, [r6] - mov r7, #0 - cmp r0, #1 - bne _0230FA54 - mov r0, r6 - mov r1, #0x43 - bl IqSkillIsEnabled - cmp r0, #0 - addne r0, r7, #1 - movne r0, r0, lsl #0x10 - movne r7, r0, asr #0x10 - mov r0, r6 - mov r1, #0x56 - bl ExclusiveItemEffectIsActive__0230F8AC - cmp r0, #0 - addne r0, r7, #1 - movne r0, r0, lsl #0x10 - movne r7, r0, asr #0x10 -_0230FA54: - ldrsh r1, [r4, #2] - add r0, sp, #0 - mov r2, r7 - bl TryGenerateUnownStoneDrop - cmp r0, #0 - beq _0230FA84 - add r2, sp, #0 - mov r0, r5 - add r1, r5, #4 - mov r3, #1 - bl SpawnDroppedItemWrapper - b _0230FB20 -_0230FA84: - mov r0, r6 - mov r1, #0x75 - bl AbilityIsActiveVeneer - mov r2, r0 - add r0, sp, #0 - mov r1, r5 - mov r3, r7 - bl ov29_023460DC - cmp r0, #0 - beq _0230FAC4 - add r2, sp, #0 - mov r0, r5 - add r1, r5, #4 - mov r3, #1 - bl SpawnDroppedItemWrapper - b _0230FB20 -_0230FAC4: - mov r0, r6 - bl IsMonster__0230F980 - cmp r0, #0 - beq _0230FB20 - mov r0, r6 - mov r1, #0x62 - bl ExclusiveItemEffectIsActive__0230F8AC - cmp r0, #0 - beq _0230FB20 - ldr r0, _0230FB2C ; =ov10_022C4650 - ldrsh r0, [r0] - bl DungeonRandOutcome__022EAB20 - cmp r0, #0 - beq _0230FB20 - add r0, sp, #0 - mov r1, #0xb7 - mov r2, #2 - bl GenerateStandardItem - add r2, sp, #0 - mov r0, r5 - add r1, r5, #4 - mov r3, #1 - bl SpawnDroppedItemWrapper -_0230FB20: - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_0230FB28: .word DUNGEON_PTR -_0230FB2C: .word ov10_022C4650 - arm_func_end TrySpawnEnemyItemDrop - - arm_func_start ov29_0230FB30 -ov29_0230FB30: ; 0x0230FB30 - stmdb sp!, {r3, r4, r5, lr} - ldr r1, _0230FB88 ; =ov29_023529A8 - mov r5, r0 - ldrh r2, [r1] - add r0, sp, #0 - strh r2, [sp] - ldrh r1, [r1, #2] - strh r1, [sp, #2] - bl ov29_02347184 - movs r4, r0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r4 - mov r0, #0 - bl ov29_02344B9C - ldr r1, _0230FB8C ; =0x00000F62 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230FB88: .word ov29_023529A8 -#ifdef JAPAN -_0230FB8C: .word 0x000009B6 -#else -_0230FB8C: .word 0x00000F62 -#endif - arm_func_end ov29_0230FB30 diff --git a/asm/overlay_29_0230FB30.s b/asm/overlay_29_0230FB30.s new file mode 100644 index 00000000..81fcd045 --- /dev/null +++ b/asm/overlay_29_0230FB30.s @@ -0,0 +1,37 @@ + .include "asm/macros.inc" + .include "overlay_29_0230FB30.inc" + + .text + + arm_func_start ov29_0230FB30 +ov29_0230FB30: ; 0x0230FB30 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0230FB88 ; =ov29_023529A8 + mov r5, r0 + ldrh r2, [r1] + add r0, sp, #0 + strh r2, [sp] + ldrh r1, [r1, #2] + strh r1, [sp, #2] + bl ov29_02347184 + movs r4, r0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + mov r1, r4 + mov r0, #0 + bl ov29_02344B9C + ldr r1, _0230FB8C ; =0x00000F62 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0230FB88: .word ov29_023529A8 +#ifdef JAPAN +_0230FB8C: .word 0x000009B6 +#else +_0230FB8C: .word 0x00000F62 +#endif + arm_func_end ov29_0230FB30 diff --git a/asm/overlay_29_0231B1B8.s b/asm/overlay_29_0231B1B8.s deleted file mode 100644 index 3138c917..00000000 --- a/asm/overlay_29_0231B1B8.s +++ /dev/null @@ -1,108 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0231B1B8.inc" - - .text - - arm_func_start TryActivateBadDreams -TryActivateBadDreams: ; 0x0231B1B8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x50 - mov sl, r0 - ldr r0, [sl, #0xb4] - mov r6, #0 - ldrb r0, [r0, #6] - ldr r4, _0231B30C ; =DUNGEON_PTR - mov r7, #0 - cmp r0, #0 - moveq r0, #1 - movne r0, r6 - and sb, r0, #0xff - add r5, sp, #0 -_0231B1EC: - ldr r0, [r4] - add r0, r0, r7, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r8, [r0, #0xad4] -#else - ldr r8, [r0, #0xb78] -#endif - mov r0, r8 - bl IsMonster__0231B318 - cmp r0, #0 - beq _0231B240 - ldr r0, [r8, #0xb4] - cmp sb, #0 - ldrb r0, [r0, #6] - beq _0231B228 - cmp r0, #0 - beq _0231B240 - b _0231B230 -_0231B228: - cmp r0, #0 - bne _0231B240 -_0231B230: - add r0, r6, #1 - mov r0, r0, lsl #0x10 - str r8, [r5, r6, lsl #2] - mov r6, r0, asr #0x10 -_0231B240: - add r0, r7, #1 - mov r0, r0, lsl #0x10 - mov r7, r0, asr #0x10 - cmp r7, #0x14 - blt _0231B1EC - mov r0, #2 - mov r1, #0x69 - bl SetPreprocessorArgsIdVal - ldr r0, _0231B310 ; =ov10_022C4530 - mov r8, #0 - ldrsh r7, [r0] - mov r4, #0x18 - ldr fp, _0231B314 ; =0x0000026E - add r5, sp, #0 - b _0231B2FC -_0231B27C: - ldr sb, [r5, r8, lsl #2] - cmp sb, #0 - beq _0231B2F0 - mov r0, sb - bl IsMonster__0231B318 - cmp r0, #0 - beq _0231B2F0 - mov r0, sl - mov r1, sb - bl IsValidTargetEntity - cmp r0, #0 - cmpne sl, sb - beq _0231B2F0 - mov r0, sb - bl IsMonsterSleeping - cmp r0, #0 - beq _0231B2F0 - mov r0, sb - mov r1, r7 - mov r2, r4 - mov r3, fp - bl ApplyDamageAndEffectsWrapper - mov r0, sb - bl EntityIsValid__0231B194 - cmp r0, #0 - beq _0231B2F0 - mov r0, sl - mov r1, sb - bl TryEndPetrifiedOrSleepStatus -_0231B2F0: - add r0, r8, #1 - mov r0, r0, lsl #0x10 - mov r8, r0, asr #0x10 -_0231B2FC: - cmp r8, r6 - blt _0231B27C - add sp, sp, #0x50 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0231B30C: .word DUNGEON_PTR -_0231B310: .word ov10_022C4530 -_0231B314: .word 0x0000026E - arm_func_end TryActivateBadDreams diff --git a/asm/overlay_29_0231EDFC.s b/asm/overlay_29_0231EDFC.s deleted file mode 100644 index e03673be..00000000 --- a/asm/overlay_29_0231EDFC.s +++ /dev/null @@ -1,534 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0231EDFC.inc" - - .text - - arm_func_start TryHurl -TryHurl: ; 0x0231EDFC - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0xf4 - mov r5, r0 - mov r4, r1 - cmp r5, r4 - beq _0231EE54 - cmp r5, #0 - moveq r0, #0 - beq _0231EE34 - ldr r0, [r5] - cmp r0, #1 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff -_0231EE34: - cmp r0, #0 - beq _0231EE54 - mov r0, r5 - mov r1, #0x53 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0 - bne _0231EE60 -_0231EE54: - mov r0, r4 - mov r1, #0xe - bl AbilityIsActiveVeneer -_0231EE60: - cmp r0, #0 - beq _0231EE8C - mov r0, #0 - mov r1, r4 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231F544 ; =0x00000E45 - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231F53C -_0231EE8C: - cmp r5, r4 - bne _0231EEB8 - mov r0, #0 - mov r1, r4 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231F548 ; =0x00000E46 - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231F53C -_0231EEB8: - ldrh r0, [r4, #4] - mov sl, #0 - mov r8, sl - strh r0, [sp, #0x40] - ldrh r0, [r4, #6] - strh r0, [sp, #0x42] - b _0231F098 -_0231EED4: - mov sl, #0 - ldr fp, _0231F54C ; =DIRECTIONS_XY - mov r6, sl -_0231EEE0: - ldr r0, _0231F550 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, r6, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr sb, [r0, #0xad4] -#else - ldr sb, [r0, #0xb78] -#endif - mov r0, sb - bl EntityIsValid__0231F570 - cmp r0, #0 - cmpne r5, sb - cmpne r4, sb - beq _0231F080 - mov r0, r5 - mov r1, sb - bl CanSeeTarget - cmp r0, #0 - beq _0231F080 - cmp r8, #0 - mov r0, r5 - mov r2, #0 - mov r1, sb - mov r3, #1 - bne _0231EF48 - bl GetTreatmentBetweenMonsters - cmp r0, #1 - bne _0231F080 - b _0231EF54 -_0231EF48: - bl GetTreatmentBetweenMonsters - cmp r0, #0 - bne _0231F080 -_0231EF54: - cmp r8, #0 - mov r7, #0 - bne _0231EFF8 - b _0231EFBC -_0231EF64: - mov r0, r7, lsl #2 - ldrsh r1, [fp, r0] - ldrsh r3, [sb, #4] - add r0, fp, r7, lsl #2 - ldrsh r2, [r0, #2] - add r0, r3, r1 - strh r0, [sp, #0x34] - ldrsh r3, [sb, #6] - mov r0, r4 - add r1, sp, #0x34 - add r2, r3, r2 - strh r2, [sp, #0x36] - bl CannotMoveToTile - cmp r0, #0 - bne _0231EFB8 - ldrsh r0, [sp, #0x34] - ldrsh r1, [sp, #0x36] - bl GetTile - ldrh r0, [r0] - tst r0, #0x800 - beq _0231EFC4 -_0231EFB8: - add r7, r7, #1 -_0231EFBC: - cmp r7, #8 - blt _0231EF64 -_0231EFC4: - cmp r7, #8 - beq _0231F080 - cmp sl, #0x28 - bge _0231F080 - ldrh r1, [sb, #4] - mov r3, sl, lsl #2 - add r0, sp, #0x54 - add r2, r0, r3 - strh r1, [r0, r3] - ldrh r0, [sb, #6] - add sl, sl, #1 - strh r0, [r2, #2] - b _0231F080 -_0231EFF8: - mov r0, r7, lsl #2 - ldrsh r1, [fp, r0] - ldrsh r3, [sb, #4] - add r0, fp, r7, lsl #2 - ldrsh r2, [r0, #2] - add r0, r3, r1 - strh r0, [sp, #0x30] - ldrsh r3, [sb, #6] - mov r0, r4 - add r1, sp, #0x30 - add r2, r3, r2 - strh r2, [sp, #0x32] - bl CannotMoveToTile - cmp r0, #0 - bne _0231F074 - ldrsh r0, [sp, #0x30] - ldrsh r1, [sp, #0x32] - bl GetTile - ldrh r0, [r0] - tst r0, #0x800 - bne _0231F074 - cmp sl, #0x28 - bge _0231F074 - ldrh r3, [sp, #0x30] - ldrh r2, [sp, #0x32] - mov r0, sl, lsl #2 - add r1, sp, #0x54 - add ip, r1, r0 - strh r3, [r1, r0] - add sl, sl, #1 - strh r2, [ip, #2] -_0231F074: - add r7, r7, #1 - cmp r7, #8 - blt _0231EFF8 -_0231F080: - add r6, r6, #1 - cmp r6, #0x14 - blt _0231EEE0 - cmp sl, #0 - bne _0231F0A0 - add r8, r8, #1 -_0231F098: - cmp r8, #2 - blt _0231EED4 -_0231F0A0: - cmp sl, #0 - beq _0231F0D0 - mov r0, sl - bl DungeonRandInt - add r1, sp, #0x54 - mov r2, r0, lsl #2 - add r0, r1, r0, lsl #2 - ldrh r1, [r1, r2] - ldrh r0, [r0, #2] - strh r1, [sp, #0x40] - strh r0, [sp, #0x42] - b _0231F178 -_0231F0D0: - mov r0, r5 - bl HasDropeyeStatus - mov r2, r0 - add r1, sp, #0x44 - add r0, r5, #4 - bl ov29_022E9298 - mov r7, #0 - add r6, sp, #0x2c - b _0231F154 -_0231F0F4: - ldr r0, [sp, #0x44] - ldr r1, [sp, #0x4c] - bl DungeonRandRange - strh r0, [sp, #0x2c] - ldr r0, [sp, #0x48] - ldr r1, [sp, #0x50] - bl DungeonRandRange - strh r0, [sp, #0x2e] - mov r0, r4 - mov r1, r6 - bl CannotMoveToTile - cmp r0, #0 - bne _0231F150 - ldrsh r0, [sp, #0x2c] - ldrsh r1, [sp, #0x2e] - bl GetTile - ldrh r0, [r0] - tst r0, #0x800 - ldreqh r1, [sp, #0x2c] - ldreqh r0, [sp, #0x2e] - streqh r1, [sp, #0x40] - streqh r0, [sp, #0x42] - beq _0231F15C -_0231F150: - add r7, r7, #1 -_0231F154: - cmp r7, #0x64 - blt _0231F0F4 -_0231F15C: - cmp r7, #0x64 - bne _0231F178 - ldr r2, _0231F554 ; =0x00000E48 - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231F53C -_0231F178: - mov r0, #0 - mov r1, r4 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231F558 ; =0x00000E47 - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r4 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _0231F1B0 - ldr r0, _0231F55C ; =0x00000212 - bl PlaySeByIdIfNotSilence -_0231F1B0: - ldrsh r3, [sp, #0x42] - ldrsh r2, [r4, #6] - ldrsh r1, [sp, #0x40] - ldrsh r0, [r4, #4] - sub r2, r3, r2 - ldr r6, [r4, #0xb4] - sub r0, r1, r0 - cmp r0, r2 - movle r0, r2 - mov sb, r0, lsl #4 - cmp sb, #0x50 - movgt sb, #0x50 - cmp sb, #0xa - add r0, sp, #0x40 - add r1, r4, #4 - ldrb r8, [r6, #0x4c] - mov r7, #0 - movlt sb, #0xa - bl GetDirectionTowardsPosition - mov r6, r0 - ldr r0, _0231F54C ; =DIRECTIONS_XY - mov r1, r6, lsl #2 - ldrsh r0, [r0, r1] - mov r1, #3 - mov r0, r0, lsl #8 - bl _s32_div_f - ldrsh sl, [sp, #0x40] - mov r1, #0x18 - ldr r2, _0231F560 ; =DIRECTIONS_XY + 2 - mov r3, r6, lsl #2 - smulbb r1, sl, r1 - add r1, r1, #0xc - add r6, r0, r1, lsl #8 - ldrsh r2, [r2, r3] - mov r1, #3 - mov r0, r2, lsl #8 - bl _s32_div_f - ldrsh r2, [sp, #0x42] - mov r1, #0x18 - ldr sl, [r4, #0xc] - smulbb r1, r2, r1 - add r1, r1, #0x10 - add fp, r0, r1, lsl #8 - ldr r0, [r4, #0x10] - mov r1, sb - sub r0, fp, r0 - bl _s32_div_f - str sl, [sp, #0x38] - ldr r1, [r4, #0x10] - str r0, [sp, #0x18] - sub r0, r6, sl - str r1, [sp, #0x3c] - mov r1, sb - mov sl, #0 - bl _s32_div_f - str r0, [sp, #0x1c] - b _0231F31C -_0231F294: - ldr r2, [sp, #0x38] - ldr r0, [sp, #0x1c] - ldr r1, [sp, #0x3c] - add r0, r2, r0 - str r0, [sp, #0x38] - ldr r0, [sp, #0x18] - add r0, r1, r0 - str r0, [sp, #0x3c] - mov r0, r4 - add r1, sp, #0x38 - bl UpdateEntityPixelPos - mov r0, r4 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _0231F308 - mov r0, r7 - bl SinAbs4096 - mov r0, r0, lsl #5 - str r0, [r4, #0x1c] - mov r0, #0x3b - bl AdvanceFrame - tst sl, #3 - bne _0231F308 - and r8, r8, #7 - mov r0, r4 - mov r1, #6 - mov r2, r8 - bl ChangeMonsterAnimation - add r8, r8, #1 -_0231F308: - mov r0, #0x800 - mov r1, sb - bl _s32_div_f - add r7, r7, r0 - add sl, sl, #1 -_0231F31C: - cmp sl, sb - blt _0231F294 - add r1, sp, #0x38 - mov r0, r4 - str r6, [sp, #0x38] - str fp, [sp, #0x3c] - mov r2, #0 - str r2, [r4, #0x1c] - bl UpdateEntityPixelPos - mov r0, #0x3b - bl AdvanceFrame - ldr r0, [r4, #0xb4] - and r1, r8, #7 - strb r1, [r0, #0x4c] - ldrsh r0, [sp, #0x40] - ldrsh r1, [sp, #0x42] - bl GetTile - ldr r7, [r0, #0xc] - mov r0, r7 - bl EntityIsValid__0231F570 - cmp r0, #0 - bne _0231F394 - ldrsh r1, [sp, #0x40] - ldrsh r2, [sp, #0x42] - mov r0, r4 - mov r3, #1 - bl MoveMonsterToPos - mov r0, r4 - bl ov29_02321238 - b _0231F53C -_0231F394: - mov r8, #0 - ldr r6, _0231F54C ; =DIRECTIONS_XY - add sb, sp, #0x28 - b _0231F40C -_0231F3A4: - mov r1, r8, lsl #2 - add r0, r6, r8, lsl #2 - ldrsh sl, [sp, #0x40] - ldrsh r3, [r6, r1] - ldrsh r2, [sp, #0x42] - ldrsh r1, [r0, #2] - add r3, sl, r3 - mov r0, r4 - add r2, r2, r1 - mov r1, sb - strh r3, [sp, #0x28] - strh r2, [sp, #0x2a] - bl CannotMoveToTile - cmp r0, #0 - bne _0231F408 - ldrsh r0, [sp, #0x28] - ldrsh r1, [sp, #0x2a] - bl GetTile - ldrh r0, [r0] - tst r0, #0x800 - ldreqh r1, [sp, #0x28] - ldreqh r0, [sp, #0x2a] - streqh r1, [sp, #0x40] - streqh r0, [sp, #0x42] - beq _0231F414 -_0231F408: - add r8, r8, #1 -_0231F40C: - cmp r8, #8 - blt _0231F3A4 -_0231F414: - cmp r8, #8 - bne _0231F434 - mov r2, #0 - mov r0, r5 - mov r1, r4 - mov r3, r2 - bl TryWarp - b _0231F454 -_0231F434: - add r1, sp, #0x40 - mov r0, r4 - bl ov29_0232033C - ldrsh r1, [sp, #0x40] - ldrsh r2, [sp, #0x42] - mov r0, r4 - mov r3, #1 - bl MoveMonsterToPos -_0231F454: - ldr r0, [r7] - cmp r0, #1 - bne _0231F4D4 - ldr r1, _0231F564 ; =0x00000163 - add r0, sp, #0x20 - bl InitMove - add r1, sp, #0x20 - mov r0, r7 - bl TwoTurnMoveForcedMiss - cmp r0, #0 - bne _0231F4B4 - mov r3, #0 - str r3, [sp] - ldr r0, _0231F568 ; =HURL_DAMAGE - ldr r1, _0231F56C ; =0x00000259 - str r3, [sp, #4] - str r1, [sp, #8] - str r3, [sp, #0xc] - str r3, [sp, #0x10] - ldrsh r2, [r0] - mov r0, r5 - mov r1, r7 - str r3, [sp, #0x14] - bl CalcDamageFixedNoCategory -_0231F4B4: - mov r0, r7 - bl EntityIsValid__0231F570 - cmp r0, #0 - beq _0231F4D4 - ldr r1, [r7, #0xb4] - mov r0, r7 - ldrb r1, [r1, #0x4c] - bl ChangeMonsterAnimationToIdle -_0231F4D4: - mov r3, #0 - str r3, [sp] - ldr r0, _0231F568 ; =HURL_DAMAGE - str r3, [sp, #4] - mov r1, #0x258 - str r1, [sp, #8] - str r3, [sp, #0xc] - str r3, [sp, #0x10] - ldrsh r2, [r0] - mov r0, r5 - mov r1, r4 - str r3, [sp, #0x14] - bl CalcDamageFixedNoCategory - mov r0, r4 - bl EntityIsValid__0231F570 - cmp r0, #0 - beq _0231F528 - ldr r1, [r4, #0xb4] - mov r0, r4 - ldrb r1, [r1, #0x4c] - bl ChangeMonsterAnimationToIdle -_0231F528: - mov r0, #0x1e - mov r1, #0x3b - bl ov29_022EA370 - mov r0, r4 - bl ov29_02321238 -_0231F53C: - add sp, sp, #0xf4 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -#define OV29_0231EDFC_OFFSET -0x2BF -#else -#define OV29_0231EDFC_OFFSET 0 -#endif -_0231F544: .word 0x00000E45 + OV29_0231EDFC_OFFSET -_0231F548: .word 0x00000E46 + OV29_0231EDFC_OFFSET -_0231F54C: .word DIRECTIONS_XY -_0231F550: .word DUNGEON_PTR -_0231F554: .word 0x00000E48 + OV29_0231EDFC_OFFSET -_0231F558: .word 0x00000E47 + OV29_0231EDFC_OFFSET -_0231F55C: .word 0x00000212 -_0231F560: .word DIRECTIONS_XY + 2 -_0231F564: .word 0x00000163 -_0231F568: .word HURL_DAMAGE -_0231F56C: .word 0x00000259 - arm_func_end TryHurl diff --git a/asm/overlay_29_0234B130.s b/asm/overlay_29_0234B130.s deleted file mode 100644 index 587f4e7d..00000000 --- a/asm/overlay_29_0234B130.s +++ /dev/null @@ -1,171 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0234B130.inc" - - .text - - arm_func_start ov29_0234B130 -ov29_0234B130: ; 0x0234B130 - stmdb sp!, {r3, lr} - mov r3, #0 - ldr r1, _0234B1A0 ; =MESSAGE_LOG_INFO - mov r0, r3 -_0234B140: - ldr r2, [r1, #4] - add r2, r2, r3 - add r3, r3, #1 - strb r0, [r2, #0xc80] - cmp r3, #0xa - blt _0234B140 - ldr r1, _0234B1A0 ; =MESSAGE_LOG_INFO - mvn ip, #1 - ldr r3, [r1, #4] - mov r2, #1 - strb ip, [r3, #0xcec] - ldr r3, [r1, #4] - strb r0, [r3, #0xcee] - ldr r3, [r1, #4] - strb r0, [r3, #0xced] - str r0, [r1, #8] - strb r2, [r1] - bl ov29_0234B1A4 - ldr r0, _0234B1A0 ; =MESSAGE_LOG_INFO - ldr r0, [r0, #4] - add r0, r0, #0x9c - add r0, r0, #0xc00 - bl InitPreprocessorArgs - ldmia sp!, {r3, pc} - .align 2, 0 -_0234B1A0: .word MESSAGE_LOG_INFO - arm_func_end ov29_0234B130 - - arm_func_start ov29_0234B1A4 -ov29_0234B1A4: ; 0x0234B1A4 - stmdb sp!, {r4, lr} - mov r4, r0 - bl ov29_022E9FC0 - cmp r0, #0 - ldmeqia sp!, {r4, pc} - mov ip, #0 - ldr r2, _0234B24C ; =MESSAGE_LOG_INFO - mov r0, ip -_0234B1C4: - ldr r3, [r2, #4] - add r1, ip, ip, lsl #2 - add ip, ip, #1 - strb r0, [r3, r1, lsl #6] - cmp ip, #0xa - blt _0234B1C4 - ldr r2, _0234B24C ; =MESSAGE_LOG_INFO - mov r3, #4 - ldr r1, [r2, #4] - strb r0, [r1, #0xc8b] - ldr r1, [r2, #4] - add r1, r1, #0xc00 - strh r0, [r1, #0x8c] - ldr r1, [r2, #4] - add r1, r1, #0xc00 - strh r0, [r1, #0x8e] - ldr r1, [r2, #4] - add r1, r1, #0xc00 - strh r0, [r1, #0x90] - ldr r1, [r2, #4] - add r1, r1, #0xc00 - strh r3, [r1, #0x92] - ldr r1, [r2, #4] - str r0, [r1, #0xc98] - bl FullyCloseAlertBox - cmp r0, #0 - cmpne r4, #0 - ldmeqia sp!, {r4, pc} - mov r0, #0 - mov r1, r0 - bl UnkMapRelatedFunc - mov r0, #0xb - bl AdvanceFrame - ldmia sp!, {r4, pc} - .align 2, 0 -_0234B24C: .word MESSAGE_LOG_INFO - arm_func_end ov29_0234B1A4 - - arm_func_start LogMessageByIdWithPopupCheckParticipants -LogMessageByIdWithPopupCheckParticipants: ; 0x0234B250 - stmdb sp!, {r3, lr} - ldr ip, _0234B290 ; =MESSAGE_LOG_INFO - cmp r1, #0 - ldr ip, [ip, #4] - ldrsh lr, [sp, #8] - add r3, ip, r3, lsl #2 - cmpne r0, #0 - str lr, [r3, #0xcac] - beq _0234B27C - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, pc} -_0234B27C: - cmp r0, #0 - ldmeqia sp!, {r3, pc} - mov r1, r2 - bl LogMessageByIdWithPopupCheckUser - ldmia sp!, {r3, pc} - .align 2, 0 -_0234B290: .word MESSAGE_LOG_INFO - arm_func_end LogMessageByIdWithPopupCheckParticipants - - arm_func_start WaitUntilAlertBoxTextIsLoadedWrapper -WaitUntilAlertBoxTextIsLoadedWrapper: ; 0x0234B294 - ldr ip, _0234B2A0 ; =WaitUntilAlertBoxTextIsLoaded - mov r0, #0x50 - bx ip - .align 2, 0 -_0234B2A0: .word WaitUntilAlertBoxTextIsLoaded - arm_func_end WaitUntilAlertBoxTextIsLoadedWrapper - - arm_func_start LogMessageByIdWithPopupCheckUser -LogMessageByIdWithPopupCheckUser: ; 0x0234B2A4 - stmdb sp!, {r4, r5, r6, lr} - mov r4, #0 - mov r6, r0 - mov r5, r1 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - movne r4, #1 - cmp r4, #0 - ldmeqia sp!, {r4, r5, r6, pc} - mov r0, r5 - bl StringFromId - mov r1, r0 - mov r0, r6 - mov r2, #1 - bl LogMessage - ldmia sp!, {r4, r5, r6, pc} - arm_func_end LogMessageByIdWithPopupCheckUser - - arm_func_start LogMessageWithPopupCheckUser -LogMessageWithPopupCheckUser: ; 0x0234B2E4 - stmdb sp!, {r4, r5, r6, lr} - mov r4, #0 - mov r6, r0 - mov r5, r1 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - movne r4, #1 - cmp r4, #0 - ldmeqia sp!, {r4, r5, r6, pc} - mov r0, r6 - mov r1, r5 - mov r2, #1 - bl LogMessage - ldmia sp!, {r4, r5, r6, pc} - arm_func_end LogMessageWithPopupCheckUser - - arm_func_start LogMessageByIdQuiet -LogMessageByIdQuiet: ; 0x0234B31C - stmdb sp!, {r4, lr} - mov r4, r0 - mov r0, r1 - bl StringFromId - mov r1, r0 - mov r0, r4 - mov r2, #0 - bl LogMessage - ldmia sp!, {r4, pc} - arm_func_end LogMessageByIdQuiet diff --git a/include/common.h b/include/common.h index 85c094f2..ad45953a 100644 --- a/include/common.h +++ b/include/common.h @@ -54,9 +54,7 @@ struct ground_monster { // Stores information about active team members, including those from special episodes. // A lot of the fields seem to be analogous to fields on struct monster. struct team_member { - // 0x0: flags: 1-byte bitfield - u8 f_is_valid : 1; - u8 flags_unk1 : 7; + u8 flags; u8 is_leader; // 0x1 u8 level; // 0x2 diff --git a/include/dungeon_pokemon_attributes.h b/include/dungeon_pokemon_attributes.h index e6d1d6c3..e90ebfeb 100644 --- a/include/dungeon_pokemon_attributes.h +++ b/include/dungeon_pokemon_attributes.h @@ -10,5 +10,6 @@ bool8 AbilityIsActive(struct entity *entity, enum ability_id ability_id); // Likely a linker-generated veneer for AbilityIsActive. // See https://developer.arm.com/documentation/dui0474/k/image-structure-and-generation/linker-generated-veneers/what-is-a-veneer- bool8 AbilityIsActiveVeneer(struct entity *entity, enum ability_id ability_id); +bool8 OtherMonsterAbilityIsActive(struct entity *entity, enum ability_id ability_id); #endif //PMDSKY_DUNGEON_POKEMON_ATTRIBUTES_H diff --git a/include/dungeon_recruitment.h b/include/dungeon_recruitment.h index c53a0103..3477ed88 100644 --- a/include/dungeon_recruitment.h +++ b/include/dungeon_recruitment.h @@ -7,5 +7,6 @@ bool8 RecruitCheck(struct entity* leader, struct entity* target); bool8 SpecificRecruitCheck(u32 monster_id); extern bool8 DebugRecruitingEnabled(u32 monster_id); +bool8 TryRecruit(struct entity *user, struct entity *recruit, void *recruit_info); #endif //PMDSKY_DUNGEON_RECRUITMENT_H diff --git a/include/main_0200224C.h b/include/main_0200224C.h index bd26b356..09835f7b 100644 --- a/include/main_0200224C.h +++ b/include/main_0200224C.h @@ -12,5 +12,8 @@ u16 Rand16Bit(); u32 RandInt(u32 n); s32 RandRange(s32 x, s32 y); u32 Rand32Bit(); +void sub_020022C4(u32 *param_1); +u32 sub_020022D0(u32 *param_1, u32 param_2); +s32 RandIntSafe(s32 n); #endif //PMDSKY_MAIN_0200224C_H diff --git a/include/main_020251AC.h b/include/main_020251AC.h index c9f03389..b7e7ac8e 100644 --- a/include/main_020251AC.h +++ b/include/main_020251AC.h @@ -6,5 +6,7 @@ void StrcpySimple(unsigned char* dest, const unsigned char* src); void StrncpySimple(unsigned char* dest, const unsigned char* src, s32 n); void StrncpySimpleNoPad(unsigned char* dest, const unsigned char* src, s32 n); int StrncmpSimple(const unsigned char* c1, const unsigned char* c2, s32 n); +u16 sub_020251F0(u8 c); +void StrncpySimpleNoPadSafe(unsigned char* dest, const unsigned char* src, s32 n); #endif //PMDSKY_MAIN_020251AC_H diff --git a/include/main_0202613C.h b/include/main_0202613C.h index 14f453d8..00b547c4 100644 --- a/include/main_0202613C.h +++ b/include/main_0202613C.h @@ -3,7 +3,7 @@ struct unk_02026130 { u8 field_0x0[4]; - u8 field_0x4[4]; + u8 field_0x4[0x118]; }; void sub_0202613C(struct unk_02026130* p); diff --git a/include/main_02026174.h b/include/main_02026174.h index 328e5607..015fdbbf 100644 --- a/include/main_02026174.h +++ b/include/main_02026174.h @@ -5,11 +5,14 @@ void sub_02026174(struct unk_02026130* p); void sub_02026184(struct unk_02026130* p); -void sub_02026194(struct unk_02026130* p); +void sub_02026194(struct unk_02026130* p, u32 flags, char* string); void sub_020261A4(struct unk_02026130* p); void sub_020261B4(struct unk_02026130* p); void sub_020261C4(struct unk_02026130* p); void sub_020261D4(struct unk_02026130* p); void sub_020261E4(struct unk_02026130* p); +void sub_020261F4(struct unk_02026130* p, void* dst); +void sub_02026204(struct unk_02026130* p); +void DrawTextInWindow(s32 window_id, s32 x, s32 y, char* string); #endif diff --git a/include/main_0202B558.h b/include/main_0202B558.h index db8642e0..a54d0141 100644 --- a/include/main_0202B558.h +++ b/include/main_0202B558.h @@ -2,5 +2,7 @@ #define PMDSKY_MAIN_0202B558_H s32 GetSimpleMenuField0x1A4(s32 window_id); +s32 sub_0202B568(s32 window_id); +s32 GetSimpleMenuResult__0202B870(s32 window_id); #endif diff --git a/include/main_020502B0.h b/include/main_020502B0.h index 2295575f..1f9328e3 100644 --- a/include/main_020502B0.h +++ b/include/main_020502B0.h @@ -4,5 +4,6 @@ #include "adventure_log.h" void IncrementNbFainted(void); u32 GetNbFainted(void); +void SetItemAcquired(struct item *item); #endif diff --git a/include/main_020514CC.h b/include/main_020514CC.h index 06651df7..a45dccff 100644 --- a/include/main_020514CC.h +++ b/include/main_020514CC.h @@ -1,9 +1,12 @@ #ifndef PMDSKY_MAIN_020514CC_H #define PMDSKY_MAIN_020514CC_H #include "util.h" +#include "dungeon.h" bool32 IsDojoDungeon(u8 dungeon_id); bool32 IsFutureDungeon(u8 dungeon_id); bool32 IsSpecialEpisodeDungeon(u8 dungeon_id); +s32 RetrieveFromItemList1(struct dungeon_floor_pair *pair, s32 list_idx); +bool8 IsForbiddenFloor(struct dungeon_floor_pair *pair); #endif //PMDSKY_MAIN_020514CC_H diff --git a/include/overlay_29_0230F8AC.h b/include/overlay_29_0230F8AC.h index c8129573..6a56c3dc 100644 --- a/include/overlay_29_0230F8AC.h +++ b/include/overlay_29_0230F8AC.h @@ -8,5 +8,7 @@ bool8 ExclusiveItemEffectIsActive__0230F8AC(struct entity *entity, enum exclusiv u8 FindDirectionOfAdjacentMonsterWithItem(struct entity *entity, enum item_id item_id); // Checks if an entity is a monster (entity type 1). bool8 IsMonster__0230F980(struct entity *entity); +void ov29_0230F9A4(struct entity *entity, struct item *item); +void TrySpawnEnemyItemDrop(struct entity *attacker, struct entity *defender); #endif //PMDSKY_OVERLAY_29_0230F8AC_H diff --git a/include/overlay_29_0231B194.h b/include/overlay_29_0231B194.h index d9a4b8bd..b1f82236 100644 --- a/include/overlay_29_0231B194.h +++ b/include/overlay_29_0231B194.h @@ -5,5 +5,6 @@ // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__0231B194(struct entity *entity); +void TryActivateBadDreams(struct entity *attacker); #endif //PMDSKY_OVERLAY_29_0231B194_H diff --git a/include/overlay_29_0231EDD8.h b/include/overlay_29_0231EDD8.h index 99c8ddf8..0e46d0ef 100644 --- a/include/overlay_29_0231EDD8.h +++ b/include/overlay_29_0231EDD8.h @@ -5,5 +5,6 @@ // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__0231EDD8(struct entity *entity); +void TryHurl(struct entity *user, struct entity *target); #endif //PMDSKY_OVERLAY_29_0231EDD8_H diff --git a/include/overlay_29_0234B024.h b/include/overlay_29_0234B024.h index 2602363d..3e1b0ef4 100644 --- a/include/overlay_29_0234B024.h +++ b/include/overlay_29_0234B024.h @@ -18,7 +18,7 @@ struct alert_box_info { // (i.e. for which the scrolling is finished) u16 alert_box_current_loaded_idx; s16 frames_until_close; // 0xC90 - u8 field_0xc92; + u16 field_0xc92; u8 field_0xc94; u8 field_0xc95; u8 field_0xc96; @@ -27,7 +27,7 @@ struct alert_box_info { // 2 means a message is currently loading/scrolling. u32 loading_status; struct preprocessor_args preprocessor_args; - u8 alert_box_window_id; // 0xCEC + s8 alert_box_window_id; u8 field_0xced; u8 field_0xcee; u8 field_0xcef; diff --git a/include/overlay_29_0234B104.h b/include/overlay_29_0234B104.h index 16167cf0..1c5e3493 100644 --- a/include/overlay_29_0234B104.h +++ b/include/overlay_29_0234B104.h @@ -3,8 +3,16 @@ #include "util.h" #include "main_0200C4FC.h" +#include "dungeon_mode.h" void SetMessageLogPreprocessorArgsSpeakerId(u32 monster_id); void SetMessageLogPreprocessorArgsSpeakerId0x30000(u32 team_index); +void ov29_0234B130(void); +void ov29_0234B1A4(bool8 param_1); +void LogMessageByIdWithPopupCheckParticipants(struct entity *user, struct entity *target, u32 message_id, s32 pos, s16 val); +void WaitUntilAlertBoxTextIsLoadedWrapper(void); +void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); +void LogMessageWithPopupCheckUser(struct entity *user, const char *message); +void LogMessageByIdQuiet(struct entity *user, u32 message_id); #endif diff --git a/main.lsf b/main.lsf index 0106c954..f6f6c098 100644 --- a/main.lsf +++ b/main.lsf @@ -22,7 +22,7 @@ Static main Object src/main_02001CD4.o Object asm/main_02001D68.o Object src/main_0200224C.o - Object asm/main_020022C4.o + Object asm/main_02002318.o Object src/main_0200238C.o Object asm/main_020024E4.o Object src/main_020027E8.o @@ -132,13 +132,13 @@ Static main Object src/main_0201E380.o Object asm/main_0201E3AC.o Object src/main_020251AC.o - Object asm/main_020251F0.o + Object asm/main_02025230.o Object src/main_02025788.o Object src/main_0202593C.o Object asm/main_0202598C.o Object src/main_0202613C.o Object src/main_02026174.o - Object asm/main_020261F4.o + Object asm/main_02026268.o Object src/main_020265C4.o Object asm/main_0202676C.o Object src/main_020275F8.o @@ -167,7 +167,7 @@ Static main Object asm/main_0202AB94.o Object src/main_0202B4C4.o Object src/main_0202B558.o - Object asm/main_0202B568.o + Object asm/main_0202B5C8.o Object src/main_0202BA0C.o Object asm/main_0202BA20.o Object src/main_0202BC44.o @@ -263,7 +263,6 @@ Static main Object src/main_0204FEB4.o Object asm/main_0204FFEC.o Object src/main_020502B0.o - Object asm/main_02050300.o Object src/main_020503CC.o Object asm/main_02050420.o Object src/main_020504A4.o @@ -272,7 +271,7 @@ Static main Object asm/main_02051098.o Object src/dungeon_recruitment_2.o Object src/main_020514CC.o - Object asm/main_02051504.o + Object asm/main_020515C4.o Object src/main_02051760.o Object src/tactics_data.o Object asm/main_rodata_020A190C.o @@ -952,7 +951,6 @@ Overlay OVY_29 Object src/overlay_29_02301A60.o Object asm/overlay_29_02301A84.o Object src/dungeon_pokemon_attributes.o - Object asm/overlay_29_02301D84.o Object src/dungeon_logic_3.o Object src/dungeon_pokemon_attributes_1.o Object src/dungeon_logic_5.o @@ -989,7 +987,6 @@ Overlay OVY_29 Object src/overlay_29_0230BBAC.o Object asm/overlay_29_0230D088.o Object src/dungeon_recruitment.o - Object asm/overlay_29_0230E064.o Object src/overlay_29_0230E578.o Object asm/overlay_29_0230E5A8.o Object src/dungeon_ai_items.o @@ -998,7 +995,7 @@ Overlay OVY_29 Object asm/overlay_29_0230F02C.o Object src/overlay_29_0230F810.o Object src/overlay_29_0230F8AC.o - Object asm/overlay_29_0230F9A4.o + Object asm/overlay_29_0230FB30.o Object src/overlay_29_02311010.o Object asm/overlay_29_02311088.o Object src/overlay_29_023118B4.o @@ -1031,7 +1028,6 @@ Overlay OVY_29 Object src/special_move_types.o Object asm/overlay_29_0231AFB4.o Object src/overlay_29_0231B194.o - Object asm/overlay_29_0231B1B8.o Object src/overlay_29_0231B318.o Object asm/overlay_29_0231B33C.o Object src/overlay_29_0231CBC8.o @@ -1040,7 +1036,6 @@ Overlay OVY_29 Object src/overlay_29_0231E9F0.o Object asm/overlay_29_0231EA40.o Object src/overlay_29_0231EDD8.o - Object asm/overlay_29_0231EDFC.o Object src/overlay_29_0231F570.o Object asm/overlay_29_0231F594.o Object src/overlay_29_0231FBFC.o @@ -1279,7 +1274,6 @@ Overlay OVY_29 Object src/overlay_29_0234AFFC.o Object src/overlay_29_0234B024.o Object src/overlay_29_0234B104.o - Object asm/overlay_29_0234B130.o Object src/overlay_29_0234B340.o Object asm/overlay_29_0234B3A4.o Object src/overlay_29_0234B4BC.o diff --git a/src/dungeon_ai.c b/src/dungeon_ai.c index 05abac36..f8ae49e7 100644 --- a/src/dungeon_ai.c +++ b/src/dungeon_ai.c @@ -16,6 +16,7 @@ #include "status_checks.h" #include "targeting.h" #include "dungeon_util_2.h" +#include "overlay_29_0234B104.h" #ifdef JAPAN #define CANNOT_USE_ITEM_MESSAGE 0xB2D @@ -28,7 +29,6 @@ extern struct dungeon *DUNGEON_PTR[]; extern void EndFrozenClassStatus(struct entity *user, struct entity *target, bool8 log); -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); void RunMonsterAi(struct entity *monster, u32 unused) { diff --git a/src/dungeon_logic_6.c b/src/dungeon_logic_6.c index ed5ced86..43bb39e2 100644 --- a/src/dungeon_logic_6.c +++ b/src/dungeon_logic_6.c @@ -5,11 +5,11 @@ #include "overlay_29_0234BA54.h" +#include "overlay_29_0234B104.h" extern void ov29_0234D8A0(s32 a); extern s16 ov29_022DE5F0(s32 index); extern void ov29_022EA370(s32 a, s32 b); -extern int ov29_0234B1A4(); extern void ov29_0234D630(void); extern s8 ov29_023535A4; extern s16 ov29_0237C9A0[2]; diff --git a/src/dungeon_pokemon_attributes.c b/src/dungeon_pokemon_attributes.c index 77d9f3c3..268d5ae6 100644 --- a/src/dungeon_pokemon_attributes.c +++ b/src/dungeon_pokemon_attributes.c @@ -1,6 +1,10 @@ #include "dungeon_pokemon_attributes.h" #include "dungeon_util_static.h" #include "overlay_29_02301A60.h" +#include "overlay_29_023000E4.h" + +extern struct dungeon *DUNGEON_PTR[]; +extern bool8 ShouldTreatMonsterAsAlly(struct entity *monster, struct entity *other); bool8 NoGastroAcidStatus(struct entity *entity, enum ability_id ability_id) { @@ -35,3 +39,21 @@ bool8 AbilityIsActiveVeneer(struct entity *entity, enum ability_id ability_id) { return AbilityIsActive(entity, ability_id); } + +bool8 OtherMonsterAbilityIsActive(struct entity *entity, enum ability_id ability_id) +{ + for (s16 i = 0; i < DUNGEON_MAX_POKEMON; i++) + { + struct entity *target = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (EntityIsValid__023000E4(target) && entity != target && + ShouldTreatMonsterAsAlly(entity, target) && +#ifdef JAPAN + DefenderAbilityIsActive__02301A0C(entity, target, ability_id)) +#else + DefenderAbilityIsActive__02301A0C(entity, target, ability_id, TRUE)) +#endif + return TRUE; + } + + return FALSE; +} diff --git a/src/dungeon_recruitment.c b/src/dungeon_recruitment.c index 8b98eb3d..95d846a3 100644 --- a/src/dungeon_recruitment.c +++ b/src/dungeon_recruitment.c @@ -15,6 +15,67 @@ #include "overlay_29_0230E578.h" // ItemIsActive__0230E578 #include "progression.h" #include "overlay_29_02349208.h" +#include "common.h" +#include "dungeon_util_2.h" +#include "main_020251AC.h" +#include "main_0204FDFC.h" +#include "main_02058E68.h" +#include "overlay_29_022E68BC.h" +#include "overlay_29_022EAC7C.h" +#include "overlay_29_0234B024.h" +#include "overlay_29_0234BA54.h" +#include "position_util.h" +#include "overlay_29_0234B104.h" + +struct unk_0230E064 { + s16 field_0x0; + s16 field_0x2; + s16 field_0x4; + s16 field_0x6; + u8 field_0x8[2]; + u8 field_0xa[2]; + s16 field_0xc; + s16 field_0xe; + s32 field_0x10; + u16 field_0x14; + u16 field_0x16; + u16 field_0x18; + u16 field_0x1a; + struct item field_0x1c; + struct moves field_0x22; + u16 field_0x44; + u16 field_0x46; +}; + +void SetPreprocessorArgsStringToName(struct preprocessor_args *preprocessor_args, + s32 pos, struct monster *monster, + u32 param_4, u8 name_type); +void HandleFaint(struct entity *fainted_entity, s32 damage_source, + struct entity *killer); +struct team_member *GetActiveTeamMember(s32 roster_idx); +void GetRecoloredTeamMemberName(char *dst, struct team_member *team_member); +void ov29_0234D630(void); +void ov29_0234D838(void); +const u8 *GetNameString(enum monster_id monster_id); +void StrncpyName(char *dest, const char *src, u32 n); +void EnsureCanStandCurrentTile(struct entity *entity); +void ov29_02305F60(struct entity *user, struct entity *target); +void ChangeMonsterAnimationToIdle(struct entity *monster, s32 direction); +s32 ov29_0234D7C0(s32 message_id, struct preprocessor_args *args, s32 param_3, + s32 param_4, u8 param_5); +void ov29_0234D8A0(s32 param_1); +struct entity *ov29_0234EE10(struct entity *entity, char *name); +bool8 DungeonModeSetupAndShowNameKeyboard(char *name, char *param_2, s32 param_3); +void RemoveMonsterFromTile(struct entity *entity, s32 x, s32 y); +bool8 ov29_0230E5A8(struct entity *user, struct entity *target, s32 x, s32 y); +s32 ov29_0230E5FC(struct team_member *member, s32 param_2); +void ov29_0230E658(s32 message_id); +void GetRecoloredNameOfTeamMemberAtIdx(char *dst, s32 roster_idx); +void sub_02056698(s32 roster_idx, s16 member_idx); +void ov29_022E8104(void); +bool8 InitTeamMember(s16 monster_id, s32 x, s32 y, struct team_member *member, + struct entity **out, bool8 param_6, bool8 param_7, + bool8 param_8, bool8 param_9); extern bool8 IsLegendaryChallengeFloor(void); extern bool8 IsMonsterOnTeam(s16 monsterId, s32 checkType); @@ -202,3 +263,162 @@ bool8 RecruitCheck(struct entity* leader, struct entity* target) return TRUE; } + +#ifdef JAPAN +#define TRY_RECRUIT_MESSAGE_OFFSET -0x2C0 +#else +#define TRY_RECRUIT_MESSAGE_OFFSET 0 +#endif + +bool8 TryRecruit(struct entity *user, struct entity *recruit, void *recruit_info) +{ + struct unk_0230E064 *info = recruit_info; + struct entity *spawned; + struct entity *out; +#ifdef JAPAN + char keyboard_buf[16]; +#else + char keyboard_buf[20]; +#endif + char name_buf2[64]; + char name_buf1[64]; + struct team_member member; + struct monster *mon; + struct entity *ent; + char *recolored; + struct team_member *slot; + s32 dir; + s32 response; + s32 idx; + bool8 ret; + s16 i; + + spawned = NULL; + WaitUntilAlertBoxPauseIsOver(10); + ov29_0234B1A4(0); + ov29_0234D630(); + idx = -1; + dir = GetDirectionTowardsPosition(&recruit->pos, &user->pos); + mon = recruit->info; + recruit->transparent = 0; + ov29_02305F60(user, recruit); + ChangeMonsterAnimationToIdle(recruit, dir); + if (IsMonsterOnTeam(mon->id, 1)) { + SetPreprocessorArgsStringToName(GetMessageLogPreprocessorArgs(), 0, + recruit->info, 0, 1); + } else { + SetPreprocessorArgsStringToName(GetMessageLogPreprocessorArgs(), 0, + recruit->info, 0, 0); + } + + if (ov29_0234D7C0(0xC77 + TRY_RECRUIT_MESSAGE_OFFSET, + GetMessageLogPreprocessorArgs(), 0, 0, 1) == 2) { + ret = FALSE; + } else { + member.flags = TRUE; + member.flags |= 2; + member.is_leader = 0; + member.level = info->field_0xc; + member.iq = 1; + member.hidden_power_base_power = info->field_0x44; + *(u16 *)&member.hidden_power_type = info->field_0x46; + member.tactic = 0; + member.member_index = -1; + member.team_index = -1; + member.id = info->field_0x0; + member.joined_at = DUNGEON_PTR[0]->id; + member.joined_at_floor = DUNGEON_PTR[0]->floor; + member.current_hp = info->field_0x6; + member.max_hp = info->field_0x6; + member.belly = info->field_0x14; + member.belly_thousandths = info->field_0x16; + member.max_belly = info->field_0x18; + member.max_belly_thousandths = info->field_0x1a; + for (i = 0; i < 2; i++) { + member.offensive_stats[i] = info->field_0x8[i]; + member.defensive_stats[i] = info->field_0xa[i]; + } + member.exp = info->field_0x10; + *(struct moves *)member.moves = info->field_0x22; + member.held_item = info->field_0x1c; + StrncpyName(member.name, (const char *)GetNameString((enum monster_id)info->field_0x0), 10); + EnableAllLearnableIqSkills(member.iq_skill_flags, (s16)member.id, + (s16)member.iq); + recolored = name_buf1; +#ifdef JAPAN + StrcpySimple((unsigned char *)keyboard_buf, (const unsigned char *)member.name); +#else + StrncpySimpleNoPad((unsigned char *)keyboard_buf, + (const unsigned char *)member.name, 10); +#endif + ov29_022EACAC(); + if (ov29_0234D7C0(0xC7B + TRY_RECRUIT_MESSAGE_OFFSET, + GetMessageLogPreprocessorArgs(), 0, 0, 1) == 1) { + ov29_0234D838(); + while (!DungeonModeSetupAndShowNameKeyboard(member.name, keyboard_buf, 0)) + ; + } + GetRecoloredTeamMemberName(recolored, &member); + SetMessageLogPreprocessorArgsString(0, recolored); + SetPreprocessorArgsIdVal(1, 0); + ov29_0230E658(0xC7E + TRY_RECRUIT_MESSAGE_OFFSET); + RemoveMonsterFromTile(recruit, info->field_0x2, info->field_0x4); + if (!ov29_0230E5A8(user, recruit, info->field_0x2, info->field_0x4)) { + idx = ov29_0230E5FC(&member, -1); + while (!ov29_0230E5A8(user, recruit, info->field_0x2, info->field_0x4)) { + ov29_0230E658(0xC7F + TRY_RECRUIT_MESSAGE_OFFSET); + do { + ov29_0234D838(); + ent = ov29_0234EE10(recruit, member.name); + if (ent == NULL) + break; + if (ent == recruit) { + GetRecoloredTeamMemberName(name_buf2, &member); + } else { + GetRecoloredNameOfTeamMemberAtIdx( + name_buf2, ((struct monster *)ent->info)->team_index); + } + SetMessageLogPreprocessorArgsString(0, name_buf2); + SubstitutePlaceholderStringTags(1, user, 0); + response = ov29_0234D7C0(0xC80 + TRY_RECRUIT_MESSAGE_OFFSET, + GetMessageLogPreprocessorArgs(), 0, 0, 1); + } while (response == -1); + if (response != 2 && ent != NULL) { + ov29_0230E658(0xC81 + TRY_RECRUIT_MESSAGE_OFFSET); + ov29_022E68BC(ent); + HandleFaint(ent, DAMAGE_SOURCE_TRANSFORM_FRIEND, user); + if (ent == recruit) { + ret = TRUE; + goto done; + } + } + } + } + for (i = 0; i < 4; i++) { + if (!GetFlag(GetActiveTeamMember(i)->flags, 1)) + break; + } + member.team_index = i; + member.member_index = ov29_0230E5FC(&member, idx); + sub_02056698(i, member.member_index); + HandleFaint(recruit, DAMAGE_SOURCE_TRANSFORM_FRIEND, user); + slot = GetActiveTeamMember(i); + *slot = member; + ov29_022E8104(); + ov29_022E81F8(); + InitTeamMember(info->field_0x0, info->field_0x2, info->field_0x4, slot, + &out, FALSE, TRUE, TRUE, TRUE); + SetPokemonJoined((s16)slot->id); + ov29_022E8104(); + ov29_022E81F8(); + spawned = out; + ret = TRUE; + } +done: + ov29_0234D8A0(1); + if (!ret) + LogMessageByIdWithPopupCheckUser(user, 0xC78 + TRY_RECRUIT_MESSAGE_OFFSET); + if (spawned != NULL) + EnsureCanStandCurrentTile(spawned); + return ret; +} diff --git a/src/main_0200224C.c b/src/main_0200224C.c index f3f207f2..89a66aea 100644 --- a/src/main_0200224C.c +++ b/src/main_0200224C.c @@ -59,3 +59,23 @@ s32 RandRange(s32 x, s32 y) { u32 Rand32Bit() { return (Rand16Bit() << 0x10) | Rand16Bit(); } + +void sub_020022C4(u32 *param_1) +{ + *param_1 = 1; +} + +u32 sub_020022D0(u32 *param_1, u32 param_2) +{ + u32 value = *param_1 * 0x5D588B65 + 1; + *param_1 = value; + return ((value >> 0x10) * param_2) >> 0x10; +} + +s32 RandIntSafe(s32 n) +{ + s32 entropy = Rand16Bit(); + entropy &= 0xFFFF; + entropy *= n; + return entropy >> 0x10; +} diff --git a/src/main_020251AC.c b/src/main_020251AC.c index e7c40879..b6c272f1 100644 --- a/src/main_020251AC.c +++ b/src/main_020251AC.c @@ -78,3 +78,42 @@ int StrncmpSimple(const unsigned char* s1, const unsigned char* s2, s32 n) } while (bytes_compared < n); return 0; } + +#ifdef JAPAN +struct unk_020B112C { + const u16 *field_0x0; + const u8 (*field_0x4)[2]; +}; +extern const struct unk_020B112C _020B112C_JP; +#endif + +u16 sub_020251F0(u8 c) +{ +#ifdef JAPAN + const u8 *row = _020B112C_JP.field_0x4[c]; + return (row[0] << 8) + row[1]; +#else + return c; +#endif +} + +void StrncpySimpleNoPadSafe(unsigned char* dest, const unsigned char* src, s32 n) +{ + while (n-- > 0 && *src != 0) { +#ifdef JAPAN + u16 c = sub_020251F0(*src++); + dest[0] = c >> 8; + dest[1] = c; + dest += 2; +#else + u32 c = *src++; + if (c < 0x100) { + *dest++ = c; + } + else { + *dest++ = ' '; + } +#endif + } + *dest = 0; +} diff --git a/src/main_02026174.c b/src/main_02026174.c index 956b12e1..6693fd81 100644 --- a/src/main_02026174.c +++ b/src/main_02026174.c @@ -1,11 +1,21 @@ #include "main_02026174.h" +struct unk_02020B60 { + s32 field_0x0; + s32 field_0x4; +}; + +extern void sub_02020B60(void *p, struct unk_02020B60 *pos); +extern void AnalyzeText(void *p); +extern void sub_02020D7C(void *p, void *dst); +extern void sub_02025E84(struct unk_02026130 *p, s32 window_id); + extern void sub_02020B74(void *p); extern void sub_02020BB8(void *p); -extern void sub_02020BC4(void *p); +extern void sub_02020BC4(void *p, u32 flags, char *string); extern void sub_02020CCC(void *p); @@ -27,9 +37,9 @@ void sub_02026184(struct unk_02026130* p) sub_02020BB8((void *) p + 4); } -void sub_02026194(struct unk_02026130* p) +void sub_02026194(struct unk_02026130* p, u32 flags, char* string) { - sub_02020BC4((void *) p + 4); + sub_02020BC4((void *) p + 4, flags, string); } void sub_020261A4(struct unk_02026130* p) @@ -56,3 +66,26 @@ void sub_020261E4(struct unk_02026130* p) { sub_02020D5C((void *) p + 4); } + +void sub_020261F4(struct unk_02026130* p, void* dst) +{ + sub_02020D7C((void *) p + 4, dst); +} + +void sub_02026204(struct unk_02026130* p) +{ + AnalyzeText((void *) p + 4); +} + +void DrawTextInWindow(s32 window_id, s32 x, s32 y, char* string) +{ + struct unk_02020B60 pos; + struct unk_02026130 state; + + pos.field_0x0 = x; + pos.field_0x4 = y; + sub_02025E84(&state, window_id); + sub_02020B60(state.field_0x4, &pos); + sub_02020BC4(state.field_0x4, 0xC402, string); + AnalyzeText(state.field_0x4); +} diff --git a/src/main_0202B558.c b/src/main_0202B558.c index f5336145..430abd6f 100644 --- a/src/main_0202B558.c +++ b/src/main_0202B558.c @@ -1,5 +1,7 @@ #include "main_0202B558.h" #include "main_0202AAA8.h" +#include "main_0202A66C.h" +#include "main_0203258C.h" s32 GetSimpleMenuField0x1A4(s32 window_id) { @@ -7,3 +9,25 @@ s32 GetSimpleMenuField0x1A4(s32 window_id) return menu->field_0x1A4; } + +s32 sub_0202B568(s32 window_id) +{ + return GetMaxItemsOnPage(GetWindowContents(window_id) + 4); +} + +s32 GetSimpleMenuResult__0202B870(s32 window_id) +{ + struct unk_0202AAA8 *menu = GetWindowContents(window_id); + struct unk_0202A75C *items = menu->field_0x198; + s32 idx; + + if (menu->field_0x1A0 != 0) { + if (menu->field_0x1A1 != 0) { + idx = GetTotalNumMenuItems((void *)menu + 4); + } else { + idx = GetSelectedMenuItemIdx((void *)menu + 4); + } + return items[idx].field_0x100; + } + return 0; +} diff --git a/src/main_0203D538.c b/src/main_0203D538.c index a15c16aa..be3608eb 100644 --- a/src/main_0203D538.c +++ b/src/main_0203D538.c @@ -19,6 +19,8 @@ #include "script_variable.h" #include "main_020517D4.h" #include "main_0202A66C.h" +#include "main_0200224C.h" +#include "main_0202B558.h" struct unk_020AFE74 { s32 field_0x0; @@ -70,8 +72,6 @@ extern void MaybeGetColoredFormattedItemName(void*, struct item*, void*); extern s8 CreateSimpleMenuFromStringIds(void*, s32, s32, void*, s32); extern void GetNameWithGender(char *dst, s16 monster_id, char color_id); extern void GetNameRaw(unsigned char *, s32); -extern void StrncpySimpleNoPadSafe(u8* dest, const u8* src, u32 n); -extern s32 GetSimpleMenuResult__0202B870(s8); extern s32 GetSimpleMenuResult__0202AEA4(s8); extern void InitPreprocessorArgs(struct preprocessor_args* args); extern bool8 IsMonsterIllegalForMissions(enum monster_id); @@ -101,7 +101,6 @@ extern void ApplyLevelUpBoostsToGroundMonster(void *mon, s16 levels, s32 flag); extern void sub_02050C10(s32 delta); extern void sub_0203909C(u8 *name); extern void ShowKeyboard(s32 mode, u8 *, s32, u8 *); -extern s32 RandIntSafe(s32 n); extern void ov11_023061CC(void *); extern void ov11_023061E4(void *, s32); extern void ov11_02310BDC(void); diff --git a/src/main_020502B0.c b/src/main_020502B0.c index a86ad84f..7337b7c5 100644 --- a/src/main_020502B0.c +++ b/src/main_020502B0.c @@ -1,5 +1,10 @@ #include "main_020502B0.h" #include "adventure_log.h" +#include "item_util_1.h" +#include "main_0204FB9C.h" +#include "progression.h" + +extern s32 NormalizeTreasureBox(s32 item_id); void IncrementNbFainted(void) { @@ -13,3 +18,27 @@ u32 GetNbFainted(void) { return ADVENTURE_LOG_PTR->nb_faints; } + +void SetItemAcquired(struct item *item) +{ + s32 id = NormalizeTreasureBox(item->id); + if (!IsItemValidVeneer(id)) { + return; + } + if (id >= 0x3B && id <= 0x41) { + s32 all = 1; + s32 i; + SetAdventureLogCompleted((u8) (id - 0x21)); + for (i = 0x1A; i <= 0x20; i++) { + if (!GetAdventureLogCompleted((u8) i)) { + all = 0; + break; + } + } + if (all) { + SetResolvedPerformanceProgressFlag(0x15, 1); + } + } + ADVENTURE_LOG_PTR->items_acquired_flags[id / 32] |= 1 << (id % 32); + ADVENTURE_LOG_PTR->completion_flags[0] |= 8; +} diff --git a/src/main_020514CC.c b/src/main_020514CC.c index 7d891132..14aa68c8 100644 --- a/src/main_020514CC.c +++ b/src/main_020514CC.c @@ -1,6 +1,13 @@ #include "main_020514CC.h" #include "util.h" #include "enums.h" +#include "dungeon.h" +#include "main_0200224C.h" + +extern u8 GetNbFloorsPlusOne(enum dungeon_id dungeon_id); +extern s32 GetItemIdFromList(s32 list_idx, s32 a, s32 b); +extern void DungeonFloorToGroupFloor(struct dungeon_floor_pair *out, struct dungeon_floor_pair *pair); +extern const struct dungeon_floor_pair MISSION_FLOORS_FORBIDDEN[]; bool32 IsDojoDungeon(u8 dungeon_id) { @@ -15,3 +22,37 @@ bool32 IsFutureDungeon(u8 dungeon_id) { bool32 IsSpecialEpisodeDungeon(u8 dungeon_id) { return dungeon_id >= DUNGEON_STAR_CAVE_SE1 && dungeon_id <= DUNGEON_SPRING_CAVE_PIT; } + +s32 RetrieveFromItemList1(struct dungeon_floor_pair *pair, s32 list_idx) +{ + s32 rnd1 = RandIntSafe(9999); + s32 rnd2 = RandIntSafe(9999); + enum dungeon_id dungeon_id = pair->dungeon_id; + + if (dungeon_id >= DUNGEON_NORMAL_FLY_MAZE && + dungeon_id >= DUNGEON_DOJO_0xD3) { + return ITEM_PLAIN_SEED; + } + if (pair->floor_id >= GetNbFloorsPlusOne(dungeon_id)) { + return ITEM_PLAIN_SEED; + } + return GetItemIdFromList(list_idx, rnd1, rnd2); +} + +bool8 IsForbiddenFloor(struct dungeon_floor_pair *pair) +{ + struct dungeon_floor_pair group; + s32 i; + + DungeonFloorToGroupFloor(&group, pair); + for (i = 0; ; i++) { + if (MISSION_FLOORS_FORBIDDEN[i].dungeon_id == 100) { + break; + } + if (group.dungeon_id == MISSION_FLOORS_FORBIDDEN[i].dungeon_id && + group.floor_id == MISSION_FLOORS_FORBIDDEN[i].floor_id) { + return TRUE; + } + } + return FALSE; +} diff --git a/src/main_02059060.c b/src/main_02059060.c index 213b8166..462316a3 100644 --- a/src/main_02059060.c +++ b/src/main_02059060.c @@ -3,11 +3,11 @@ #include "save.h" #include "main_0202593C.h" #include "main_02058FA4.h" +#include "main_020251AC.h" extern struct team_member_table *TEAM_MEMBER_TABLE_PTR; extern s32 GetLanguageType(void); -extern void StrncpySimpleNoPadSafe(u8* dest, const u8* src, u32 n); extern void InitBitstreamForRead(struct bitstream *ptr, void *start_addr, u32 total_len); extern void WriteMonsterToSave(struct bitstream *stream, struct ground_monster *monster); extern void CopyBitsTo(void *ctx, void *src, s32 nbits); diff --git a/src/main_0205D11C.c b/src/main_0205D11C.c index c6b20133..caa1b942 100644 --- a/src/main_0205D11C.c +++ b/src/main_0205D11C.c @@ -13,6 +13,7 @@ #include "main_0205E01C.h" #include "main_0205E288.h" #include "dungeon_recruitment_2.h" +#include "main_020514CC.h" extern u8 _020A39C0; extern u8 _020A39D4; @@ -26,7 +27,6 @@ extern const char _020A3AD4[]; extern const char _020A3AF4[]; extern const char _020A3B18[]; -extern s32 RandIntSafe(s32 n); extern void ClearMissionData(struct mission *mission); extern struct mission_deliver_list MISSION_DELIVER_LIST_PTR; extern s32 CanDungeonBeUsedForMission(enum dungeon_id); @@ -45,7 +45,6 @@ extern s16 *sub_020627F4(void); extern enum monster_id GetBaseForm(enum monster_id); extern s32 GetBodySize(enum monster_id); -extern bool8 IsForbiddenFloor(struct dungeon_floor_pair*); extern bool8 IsInvalidForMission(enum dungeon_id); extern bool8 IsItemValidVeneer(s16 item_id); extern bool8 IsMissionValid(struct mission *mission); diff --git a/src/main_02065B3C.c b/src/main_02065B3C.c index 402714ba..426d0e4a 100644 --- a/src/main_02065B3C.c +++ b/src/main_02065B3C.c @@ -1,6 +1,6 @@ #include "enums.h" +#include "main_020251AC.h" -extern void StrncpySimpleNoPadSafe(u8 *dest, const u8 *src, u32 n); extern u8 _022B7310[]; diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index 2e9a1b4d..1c892152 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -23,6 +23,10 @@ #include "main_02001188.h" #include "common.h" #include +#include "main_020251AC.h" +#include "main_020502B0.h" +#include "main_02026174.h" +#include "main_0202B558.h" extern void sub_02056094(char *dst, struct ground_monster *ground_monster, bool8 is_leader); @@ -40,7 +44,6 @@ struct unk_02324D90 { extern struct unk_02324D90 *ov11_02324D90; extern char ov11_02322DB8[]; -extern void StrncpySimpleNoPadSafe(u8 *dest, const u8 *src, u32 n); extern s32 sub_02055894(struct ground_monster *member); extern bool8 sub_020564B0(int idx); extern s32 vsprintf(u8 *str, const u8 *format, va_list ap); @@ -107,10 +110,10 @@ extern s32 ov11_02322D60; extern s32 ov11_02322D88; extern u8 ov11_02322DB0[]; -extern void CloseScrollBox(s8); extern void CloseTextBox2(s8); extern u8 CreateParentMenuFromStringIds(void *, u32, void *, void *); extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateSimpleMenuFromStringIds(void *, s32, s32, void *, s32); extern s8 CreateTextBox(void *, void *); extern void DrawTextInWindow(s32 window_id, s32 x, s32 y, char *string); +extern void CloseScrollBox(s8); extern void CloseTextBox2(s8); extern u8 CreateParentMenuFromStringIds(void *, u32, void *, void *); extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateSimpleMenuFromStringIds(void *, s32, s32, void *, s32); extern s8 CreateTextBox(void *, void *); extern struct team_member *GetActiveTeamMember(s32 roster_idx); extern void GetPressedButtons(u32, u16 *); -extern s32 GetSimpleMenuResult__0202AEA4(s8); extern s32 GetSimpleMenuResult__0202B870(s8); extern struct ground_monster *GetTeamMember(s32 member_idx); +extern s32 GetSimpleMenuResult__0202AEA4(s8);extern struct ground_monster *GetTeamMember(s32 member_idx); extern void InitPreprocessorArgs(struct preprocessor_args *); extern s32 IsScrollBoxActive(s8); extern void ShowDialogueBox(s8); extern void ShowStringIdInDialogueBox(s8, s32, s32, void *); extern void ov11_022DC504(void); extern u8 *strcpy(u8 *dest, const u8 *src); @@ -118,7 +121,6 @@ extern u8 *strcpy(u8 *dest, const u8 *src); extern s8 CreateInventoryMenuOuter(s32, s32, s32, void *, void *, void *, u8); extern bool8 IsBagNotEmpty(void); extern u8 PopInventoryMenuField0x1A3(s32 window_id); -extern void SetItemAcquired(struct item *); extern void SortItemsInBag(void); extern void *memcpy(void *, const void *, u32); extern int ov11_023090DC(void); diff --git a/src/overlay_17_0238B10C.c b/src/overlay_17_0238B10C.c index 60d0f902..bb27f2d5 100644 --- a/src/overlay_17_0238B10C.c +++ b/src/overlay_17_0238B10C.c @@ -1,5 +1,6 @@ #include "overlay_17_0238B10C.h" #include "enums.h" +#include "main_0202B558.h" extern void ov17_0238A278(void); @@ -7,7 +8,6 @@ extern struct unk_0238BE00 *OVERLAY17_UNKNOWN_POINTER__NA_238BE00; extern u32 IsSimpleMenuActive(s32 window_id); -extern s32 GetSimpleMenuResult__0202B870(s8 window_id); extern void ov17_0238B028(s32 a); diff --git a/src/overlay_18_0238BF60.c b/src/overlay_18_0238BF60.c index 9e55c31f..6e9f72e3 100644 --- a/src/overlay_18_0238BF60.c +++ b/src/overlay_18_0238BF60.c @@ -1,11 +1,11 @@ #include "overlay_18_0238BF60.h" #include "overlay_18_0238C950.h" +#include "main_0202B558.h" extern void ov18_0238BE28(s32 a); extern u32 IsSimpleMenuActive(s32 window_id); -extern s32 GetSimpleMenuResult__0202B870(s8 window_id); extern struct unk_0238C950 *LINK_SHOP_PTR; diff --git a/src/overlay_24_init.c b/src/overlay_24_init.c index 05d3c728..3d11f42c 100644 --- a/src/overlay_24_init.c +++ b/src/overlay_24_init.c @@ -1,5 +1,7 @@ #include "overlay_24.h" #include "main_0203D538.h" +#include "main_020251AC.h" +#include "main_0202B558.h" extern void CloseCollectionMenu(s8); extern void CloseDialogueBox(s8); @@ -7,12 +9,10 @@ extern void FreeMissionRewardStructMain(); extern s32 GetEggHatchTimer(); extern s32 GetKeyboardStatus(); extern const u8 *GetKeyboardStringResult(); -extern s32 GetSimpleMenuResult__0202B870(s8); extern void HidePortraitBox(s8); extern s32 IsDialogueBoxActive(s8); extern void ShowDialogueBox(s8); extern void StrcpySimple(unsigned char* dest, const unsigned char* src); -extern void StrncpySimpleNoPadSafe(u8* dest, const u8* src, u32 n); extern void ov11_022DC504(); extern struct overlay_24_unk1E8_sub *ov11_02306C64(); extern s32 ov11_02306C9C(); diff --git a/src/overlay_25_init.c b/src/overlay_25_init.c index 8538eec2..02f9f781 100644 --- a/src/overlay_25_init.c +++ b/src/overlay_25_init.c @@ -2,6 +2,8 @@ #include "main_0200C4FC.h" #include "item.h" #include "main_02001188.h" +#include "main_02026174.h" +#include "main_0202B558.h" extern void CloseDialogueBox(s8); @@ -13,7 +15,6 @@ extern void CloseTextBox(s8); extern s32 GetMoneyCarried(); extern s32 GetNbItemsInBag(); extern void GetPressedButtons(void *, u16*); -extern s32 GetSimpleMenuResult__0202B870(s8); extern void HidePortraitBox(s8); extern s32 IsDialogueBoxActive(s8); extern s32 IsScrollBoxActive(s8); @@ -58,7 +59,6 @@ extern void ReturnScriptMenuResultZero(void); extern void UpdateWindow(char *); extern void sub_02027B1C(char *); extern void AppendStandardStringToMission(char *, s32, s32, s32); -extern void DrawTextInWindow(char *, s32, s32, void*); extern s32 APPRAISAL_MAIN_MENU_ITEMS; extern s32 APPRAISAL_MENU_ITEMS_CONFIRM; @@ -617,6 +617,6 @@ void ov25_0238B414(char *output) #else AppendStandardStringToMission(output, 4, 2, 0x225); #endif - DrawTextInWindow(output, 0x10, 0x10, buffer); + DrawTextInWindow((s32)output, 0x10, 0x10, buffer); UpdateWindow(output); } diff --git a/src/overlay_29_022F0EDC.c b/src/overlay_29_022F0EDC.c index f896345b..a260dc11 100644 --- a/src/overlay_29_022F0EDC.c +++ b/src/overlay_29_022F0EDC.c @@ -20,6 +20,7 @@ #include "dungeon_util_2.h" #include "overlay_29_022EC7E8.h" #include "overlay_29_022E9FC0.h" +#include "overlay_29_0234B104.h" #ifdef JAPAN #define SET_LEADER_ACTION_DATA_OFFSET -0x2C1 @@ -62,7 +63,6 @@ extern void GetPressedButtons(u32 param_1, u16 *pressed); extern s32 HasStatusThatPreventsLeaderActing(); extern s32 HideTileGrid(); extern s32 LogItemBlockedByEmbargo(); -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); extern s32 MonsterHasEmbargoStatus(); extern s32 OpenMenu(bool8 a, u8 b, s32 c); extern s32 OpenMessageLog(); diff --git a/src/overlay_29_02306728.c b/src/overlay_29_02306728.c index 931980a0..35ddb696 100644 --- a/src/overlay_29_02306728.c +++ b/src/overlay_29_02306728.c @@ -4,10 +4,10 @@ #include "overlay_29_022E3F20.h" #include "dungeon.h" #include "dungeon_util_static.h" +#include "overlay_29_0234B104.h" extern struct dungeon *DUNGEON_PTR[]; -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); extern s32 GetIdleAnimationId(struct entity *entity); extern int ov29_02304830(); extern void TryRemoveSnatchedMonsterFromDungeonStruct(struct entity *user, struct entity *target); diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index e3639e57..0da3c560 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -55,6 +55,9 @@ #include "overlay_29_022ECDC0.h" #include "overlay_29_022E45B8.h" #include "overlay_29_0231E9F0.h" +#include "overlay_29_0230F8AC.h" +#include "overlay_29_0231EDD8.h" +#include "overlay_29_0234B104.h" struct unk_023535DC { u8 field_0x0; @@ -79,7 +82,6 @@ extern void ActivateMotorDrive(struct entity* entity); extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); extern bool8 IsEitherMonsterInvalid(struct entity *a, struct entity *b); extern void ResetDamageData(struct unk_02308FE0 *damage_data); -extern void TryHurl(struct entity *user, struct entity *target); extern void ov29_022E57D4(struct entity *entity); extern void ov29_022E5E84(struct entity *a, struct entity *b); extern void ov29_0230F728(struct entity *attacker, struct entity *defender, enum exclusive_item_effect_id effect_id, s32 a); @@ -113,7 +115,6 @@ extern struct team_member* GetActiveTeamMember(s32 roster_idx); extern s32 GetIdleAnimationId(struct entity *entity); extern void HandleFaint(struct entity *fainted_entity, s32 damage_source, struct entity *killer); extern bool8 IsMonsterIdInNormalRangeVeneer(enum monster_id monster_id); -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); extern void MoveMonsterToPos(struct entity* entity, s32 x_pos, s32 y_pos, bool8 reset_prev_pos_fields); extern s32 PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, s32 c, s32 d, s32 e, s32 f); extern int PlayMissSfx__022E611C(); @@ -124,8 +125,6 @@ extern void RestoreRandomMovePP(struct entity* user, struct entity* target, s32 extern void SubInitMonster(struct monster* monster, bool8 flag); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); -extern bool8 TryRecruit(struct entity *user, struct entity *recruit, void *recruit_info); -extern void TrySpawnEnemyItemDrop(struct entity* attacker, struct entity* defender); extern void UpdateShopkeeperModeAfterAttack(struct entity* attacker, struct entity* defender); extern s32 abs(s32 n); extern int ov10_022BDC68(); @@ -145,7 +144,6 @@ extern int ov29_02307C48(); extern int ov29_0230D628(); extern int ov29_0230D688(); extern int ov29_0230D7D4(); -extern int ov29_0234B1A4(); extern struct unk_023528A4 TYPE_DAMAGE_NEGATING_EXCLUSIVE_ITEM_EFFECTS[]; extern s16 SET_DAMAGE_STATUS_DAMAGE; diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c index a7c401f9..ff0fafd6 100644 --- a/src/overlay_29_0230BBAC.c +++ b/src/overlay_29_0230BBAC.c @@ -43,7 +43,6 @@ extern bool8 AuraBowIsActive(struct entity *entity); extern bool8 FixedPoint64CmpLt(const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern void DivideFixedPoint64(struct fixed_point_64 *out, struct fixed_point_64 *a, struct fixed_point_64 *b); extern void ResetDamageCalcDiagnostics(void); -extern bool8 OtherMonsterAbilityIsActive(struct entity *entity, enum ability_id ability_id); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern bool8 UpdateStateFlags(struct monster *info, s32 flag, bool8 value); extern void ResetDamageData(struct unk_02308FE0 *damage_data); diff --git a/src/overlay_29_0230F8AC.c b/src/overlay_29_0230F8AC.c index 1e93f793..2cc6dcae 100644 --- a/src/overlay_29_0230F8AC.c +++ b/src/overlay_29_0230F8AC.c @@ -5,6 +5,19 @@ #include "dungeon_util_static.h" #include "exclusive_item.h" #include "overlay_29_0230F810.h" +#include "dg_random.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_recruitment_2.h" +#include "overlay_29_02344BE4.h" +#include "overlay_29_02345A3C.h" + +extern struct dungeon *DUNGEON_PTR; +extern const s16 ov10_022C4650; + +extern bool8 TryGenerateUnownStoneDrop(struct item *item, s16 monster_id, s32 param_3); +extern bool8 ov29_023460DC(struct item *item, struct entity *entity, bool8 param_3, s32 param_4); +extern bool8 ov29_0234908C(struct item *item); bool8 ExclusiveItemEffectIsActive__0230F8AC(struct entity *entity, enum exclusive_item_effect_id effect_id) { @@ -39,3 +52,51 @@ bool8 IsMonster__0230F980(struct entity *entity) return GetEntityType(entity) == ENTITY_MONSTER; } + +void ov29_0230F9A4(struct entity *entity, struct item *item) +{ + if (!IsMonster__0230F980(entity)) + return; + + if (GetEntInfo(entity)->is_not_team_member) + return; + + ov29_0234908C(item); +} + +void TrySpawnEnemyItemDrop(struct entity *attacker, struct entity *defender) +{ + struct item item; + struct monster *monster; + s16 n; + + if (TreasureBoxDropsEnabled(DUNGEON_PTR->id) && + (monster = GetEntInfo(defender))->is_not_team_member) + { + n = 0; + if (GetEntityType(attacker) == ENTITY_MONSTER) + { + if (IqSkillIsEnabled(attacker, IQ_COLLECTOR)) + n++; + if (ExclusiveItemEffectIsActive__0230F8AC(attacker, EXCLUSIVE_EFF_MORE_TREASURE_DROPS)) + n++; + } + + if (TryGenerateUnownStoneDrop(&item, monster->id, n)) + { + SpawnDroppedItemWrapper(defender, &defender->pos, &item, 1); + } + else if (ov29_023460DC(&item, defender, + AbilityIsActiveVeneer(attacker, ABILITY_HONEY_GATHER), n)) + { + SpawnDroppedItemWrapper(defender, &defender->pos, &item, 1); + } + else if (IsMonster__0230F980(attacker) && + ExclusiveItemEffectIsActive__0230F8AC(attacker, EXCLUSIVE_EFF_MORE_MONEY_DROPS) && + DungeonRandOutcome__022EAB20(ov10_022C4650)) + { + GenerateStandardItem(&item, ITEM_POKE, 2); + SpawnDroppedItemWrapper(defender, &defender->pos, &item, 1); + } + } +} diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index 426cd964..a15cdca9 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -26,6 +26,8 @@ #include "overlay_29_022E99F0.h" #include "overlay_29_02305C04.h" #include "overlay_29_022E4338.h" +#include "overlay_29_0231B194.h" +#include "overlay_29_0234B104.h" extern s16 ov10_022C4BE4[20]; extern void ov29_0230FB30(struct entity *entity); @@ -61,14 +63,12 @@ extern bool8 ov29_022E34A8_EU(struct entity *entity); extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern void ov29_022EA370(s32 a, s32 b); extern s32 ov29_022F2FE4(); -extern void WaitUntilAlertBoxTextIsLoadedWrapper(void); extern void EnsureCanStandCurrentTile(struct entity *entity); extern void ov29_022E543C(struct entity *entity); extern void ov29_022E53F0(struct entity *entity); @@ -76,7 +76,6 @@ extern void ov29_022F42F8(struct entity *entity); extern void EndMagnetRiseStatus(struct entity *user, struct entity *target); extern void ov29_022EC62C(struct entity *entity); extern void ov29_022FB718(struct entity *entity); -extern void TryActivateBadDreams(struct entity *entity); extern void TryWeatherFormChange(struct entity *entity); extern s32 EndNegativeStatusCondition(struct entity *user, struct entity *target, bool8 a, bool8 b, bool8 c); extern s32 DisplayActions(s32 a); diff --git a/src/overlay_29_0231B194.c b/src/overlay_29_0231B194.c index c190b0bf..ea02ac4b 100644 --- a/src/overlay_29_0231B194.c +++ b/src/overlay_29_0231B194.c @@ -1,5 +1,14 @@ #include "overlay_29_0231B194.h" #include "dungeon_util_static.h" +#include "dungeon_capabilities.h" +#include "dungeon_visibility.h" +#include "overlay_29_0231B318.h" +#include "overlay_29_0234B024.h" + +extern struct dungeon *DUNGEON_PTR; +extern const s16 ov10_022C4530; +extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); +extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); bool8 EntityIsValid__0231B194(struct entity *entity) { @@ -8,3 +17,43 @@ bool8 EntityIsValid__0231B194(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +void TryActivateBadDreams(struct entity *attacker) +{ + struct entity *targets[DUNGEON_MAX_POKEMON]; + s16 num_targets; + s16 i; + struct entity *target; + bool8 attacker_is_team_member; + + num_targets = 0; + attacker_is_team_member = GetEntInfo(attacker)->is_not_team_member == 0; + + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + target = DUNGEON_PTR->active_monster_ptrs[i]; + if (!IsMonster__0231B318(target)) + continue; + if (attacker_is_team_member) { + if (!GetEntInfo(target)->is_not_team_member) + continue; + } else { + if (GetEntInfo(target)->is_not_team_member) + continue; + } + targets[num_targets++] = target; + } + + SetPreprocessorArgsIdVal(2, ABILITY_BAD_DREAMS); + + for (i = 0; i < num_targets; i++) { + target = targets[i]; + if (target != NULL && IsMonster__0231B318(target) && + IsValidTargetEntity(attacker, target) && attacker != target && + IsMonsterSleeping(target)) { + ApplyDamageAndEffectsWrapper(target, ov10_022C4530, 0x18, + DAMAGE_SOURCE_BAD_DREAMS); + if (EntityIsValid__0231B194(target)) + TryEndPetrifiedOrSleepStatus(attacker, target); + } + } +} diff --git a/src/overlay_29_0231CBC8.c b/src/overlay_29_0231CBC8.c index bf627602..eff1ddf3 100644 --- a/src/overlay_29_0231CBC8.c +++ b/src/overlay_29_0231CBC8.c @@ -14,6 +14,7 @@ #include "overlay_29_02345A3C.h" #include "overlay_29_02305C04.h" #include "overlay_29_0234B340.h" +#include "overlay_29_0230F8AC.h" #ifdef JAPAN #define MESSAGE_BE6 0x925 @@ -82,7 +83,6 @@ extern void TryInflictEyedropStatus(struct entity *user, struct entity *target); extern bool8 TryInflictSlipStatus(struct entity *user, struct entity *target); extern void ov29_022E5A00(struct entity *entity, struct item *item); extern void ov29_022E5AE4(struct entity *entity, struct item *item); -extern void ov29_0230F9A4(struct entity *entity, struct item *item); extern bool8 ov29_022FB9BC(struct entity *entity); extern void ov29_022F9EA0(struct entity *entity); extern void EnemyEvolution(struct entity *entity); diff --git a/src/overlay_29_0231EDD8.c b/src/overlay_29_0231EDD8.c index a73ed0b8..a5c229d8 100644 --- a/src/overlay_29_0231EDD8.c +++ b/src/overlay_29_0231EDD8.c @@ -1,5 +1,56 @@ #include "overlay_29_0231EDD8.h" #include "dungeon_util_static.h" +#include "dg_object.h" +#include "dg_random.h" +#include "dungeon_ai_targeting_1.h" +#include "dungeon_map_access.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_util.h" +#include "dungeon_util_2.h" +#include "dungeon_visibility.h" +#include "main_020018D0.h" +#include "moves_1.h" +#include "overlay_29_022E272C.h" +#include "overlay_29_022E9FC0.h" +#include "overlay_29_022EAC7C.h" +#include "overlay_29_0231F570.h" +#include "overlay_29_02321238.h" +#include "overlay_29_0234B340.h" +#include "position_util.h" +#include "util.h" + +#ifdef JAPAN +#define MESSAGE_E45 0xB86 +#define MESSAGE_E46 0xB87 +#define MESSAGE_E47 0xB88 +#define MESSAGE_E48 0xB89 +#else +#define MESSAGE_E45 0xE45 +#define MESSAGE_E46 0xE46 +#define MESSAGE_E47 0xE47 +#define MESSAGE_E48 0xE48 +#endif + +struct unk_022E9298 { + s32 field_0x0; + s32 field_0x4; + s32 field_0x8; + s32 field_0xc; +}; + +extern struct dungeon *DUNGEON_PTR[]; +extern const s16 HURL_DAMAGE; +extern void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s16 fixed_damage, s32 a, bool8 *flag, s32 b, s32 damage_source, s32 c, s32 d, s32 e); +extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); +extern void ChangeMonsterAnimationToIdle(struct entity *monster, s32 direction); +extern void MoveMonsterToPos(struct entity *entity, s32 x_pos, s32 y_pos, bool8 reset_prev_pos_fields); +extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); +extern bool8 TwoTurnMoveForcedMiss(struct entity *target, struct move *move); +extern void ov29_022E9298(struct position *pos, struct unk_022E9298 *bounds, bool8 a); +extern void ov29_022EA370(s32 a, s32 b); +extern bool8 CannotMoveToTile(struct entity *entity, struct position *pos); +extern void ov29_0232033C(struct entity *entity, struct position *pos); bool8 EntityIsValid__0231EDD8(struct entity *entity) { @@ -8,3 +59,208 @@ bool8 EntityIsValid__0231EDD8(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +void TryHurl(struct entity *user, struct entity *target) +{ + struct position list[40]; + struct unk_022E9298 bounds; + struct position dest; + struct pixel_position pixel_pos; + s32 i; + s32 j; + s32 pass; + struct entity *monster; + s32 count; + s32 dir; + s32 end_x; + s32 angle; + s32 anim_dir; + s32 num_frames; + s32 px; + s32 step_x; + s32 step_y; + bool8 suction_cups; + s32 idx; + s32 end_y; + struct entity *occupant; + + if (user != target && (user == NULL ? FALSE : (bool8)(GetEntityType(user) == ENTITY_MONSTER)) && AbilityIsActiveVeneer(user, ABILITY_MOLD_BREAKER)) + suction_cups = FALSE; + else + suction_cups = AbilityIsActiveVeneer(target, ABILITY_SUCTION_CUPS); + + if (suction_cups) { + SubstitutePlaceholderStringTags(0, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E45); + return; + } + + if (user == target) { + SubstitutePlaceholderStringTags(0, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E46); + return; + } + + dest = target->pos; + count = 0; + + for (pass = 0; pass < 2; pass++) { + count = 0; + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + monster = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (!EntityIsValid__0231F570(monster) || user == monster || target == monster) + continue; + if (!CanSeeTarget(user, monster)) + continue; + if (pass == 0) { + if (GetTreatmentBetweenMonsters(user, monster, FALSE, TRUE) != + TREATMENT_TREAT_AS_ENEMY) + continue; + } else { + if (GetTreatmentBetweenMonsters(user, monster, FALSE, TRUE) != + TREATMENT_TREAT_AS_ALLY) + continue; + } + + if (pass == 0) { + struct position pos; + + for (j = 0; j < NUM_DIRECTIONS; j++) { + pos.x = monster->pos.x + DIRECTIONS_XY[j].x; + pos.y = monster->pos.y + DIRECTIONS_XY[j].y; + if (!CannotMoveToTile(target, &pos) && + !(GetTile(pos.x, pos.y)->terrain_flags & 0x800)) + break; + } + if (j != NUM_DIRECTIONS && count < 40) { + list[count++] = monster->pos; + } + } else { + struct position pos; + + for (j = 0; j < NUM_DIRECTIONS; j++) { + pos.x = monster->pos.x + DIRECTIONS_XY[j].x; + pos.y = monster->pos.y + DIRECTIONS_XY[j].y; + if (!CannotMoveToTile(target, &pos) && + !(GetTile(pos.x, pos.y)->terrain_flags & 0x800) && count < 40) { + list[count++] = pos; + } + } + } + } + if (count != 0) + break; + } + + if (count != 0) { + idx = DungeonRandInt(count); + dest = list[idx]; + } else { + struct position pos; + + ov29_022E9298(&user->pos, &bounds, HasDropeyeStatus(user)); + for (j = 0; j < 100; j++) { + pos.x = DungeonRandRange(bounds.field_0x0, bounds.field_0x8); + pos.y = DungeonRandRange(bounds.field_0x4, bounds.field_0xc); + if (!CannotMoveToTile(target, &pos) && + !(GetTile(pos.x, pos.y)->terrain_flags & 0x800)) { + dest = pos; + break; + } + } + if (j == 100) { + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E48); + return; + } + } + + SubstitutePlaceholderStringTags(0, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E47); + if (ShouldDisplayEntityWrapper(target)) + PlaySeByIdIfNotSilence(0x212); + + anim_dir = GetEntInfo(target)->action.direction; + angle = 0; + num_frames = Max(dest.x - target->pos.x, dest.y - target->pos.y) * 16; + if (num_frames > 80) + num_frames = 80; + if (num_frames < 10) + num_frames = 10; + dir = GetDirectionTowardsPosition(&dest, &target->pos); + end_x = ((dest.x * 24 + 12) << 8) + (DIRECTIONS_XY[dir].x << 8) / 3; + end_y = ((dest.y * 24 + 16) << 8) + (DIRECTIONS_XY[dir].y << 8) / 3; + px = target->pixel_pos.x; + step_y = (end_y - (s32)target->pixel_pos.y) / num_frames; + pixel_pos.x = px; + pixel_pos.y = target->pixel_pos.y; + i = 0; + step_x = (end_x - px) / num_frames; + + while (i < num_frames) { + pixel_pos.x += step_x; + pixel_pos.y += step_y; + UpdateEntityPixelPos(target, &pixel_pos); + if (ShouldDisplayEntityWrapper(target)) { + target->elevation = SinAbs4096(angle) << 5; + AdvanceFrame(0x3B); + if (!(i & 3)) { + anim_dir &= 7; + ChangeMonsterAnimation(target, 6, anim_dir); + anim_dir++; + } + } + angle += 0x800 / num_frames; + i++; + } + + pixel_pos.x = end_x; + pixel_pos.y = end_y; + target->elevation = 0; + UpdateEntityPixelPos(target, &pixel_pos); + AdvanceFrame(0x3B); + GetEntInfo(target)->action.direction = anim_dir & 7; + + occupant = GetTile(dest.x, dest.y)->monster; + if (!EntityIsValid__0231F570(occupant)) { + MoveMonsterToPos(target, dest.x, dest.y, TRUE); + ov29_02321238(target); + return; + } + + for (j = 0; j < NUM_DIRECTIONS; j++) { + struct position pos; + + pos.x = dest.x + DIRECTIONS_XY[j].x; + pos.y = dest.y + DIRECTIONS_XY[j].y; + if (!CannotMoveToTile(target, &pos) && + !(GetTile(pos.x, pos.y)->terrain_flags & 0x800)) { + dest = pos; + break; + } + } + + if (j == NUM_DIRECTIONS) { + TryWarp(user, target, 0, 0); + } else { + ov29_0232033C(target, &dest); + MoveMonsterToPos(target, dest.x, dest.y, TRUE); + } + + if (GetEntityType(occupant) == ENTITY_MONSTER) { + struct move move; + + InitMove(&move, MOVE_REGULAR_ATTACK); + if (!TwoTurnMoveForcedMiss(occupant, &move)) + CalcDamageFixedNoCategory(user, occupant, HURL_DAMAGE, 0, NULL, 0, + DAMAGE_SOURCE_FLYING_MONSTER, 0, 0, 0); + if (EntityIsValid__0231F570(occupant)) + ChangeMonsterAnimationToIdle(occupant, GetEntInfo(occupant)->action.direction); + } + + CalcDamageFixedNoCategory(user, target, HURL_DAMAGE, 0, NULL, 0, + DAMAGE_SOURCE_KNOCKED_FLYING, 0, 0, 0); + if (EntityIsValid__0231F570(target)) + ChangeMonsterAnimationToIdle(target, GetEntInfo(target)->action.direction); + ov29_022EA370(0x1E, 0x3B); + ov29_02321238(target); +} diff --git a/src/overlay_29_0232D1DC.c b/src/overlay_29_0232D1DC.c index 8b485c38..c056caf8 100644 --- a/src/overlay_29_0232D1DC.c +++ b/src/overlay_29_0232D1DC.c @@ -1,5 +1,6 @@ #include "overlay_29_0232D1DC.h" #include "move_orb_effects.h" +#include "overlay_29_0231EDD8.h" extern s32 DealDamage(struct entity *attacker, struct entity *defender, struct move *move, s32 damageMultiplier, enum item_id item_id); @@ -11,7 +12,6 @@ extern void RevealStairs(struct entity *user, struct entity *target); extern void TryInflictMobileStatus(struct entity *user, struct entity *target); -extern void TryHurl(struct entity *user, struct entity *target); bool8 DoMoveHurl(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id) { diff --git a/src/overlay_29_0233836C.c b/src/overlay_29_0233836C.c index ace89675..05055593 100644 --- a/src/overlay_29_0233836C.c +++ b/src/overlay_29_0233836C.c @@ -2,10 +2,10 @@ #include "dungeon.h" #include "main_0200330C.h" #include "overlay_29_02337CA8.h" +#include "overlay_29_0234B104.h" extern struct dungeon *DUNGEON_PTR[]; -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); extern void ov29_02306D54(struct entity *); void ResetGravity(void) diff --git a/src/overlay_29_0234B104.c b/src/overlay_29_0234B104.c index 3ce15f79..b005b311 100644 --- a/src/overlay_29_0234B104.c +++ b/src/overlay_29_0234B104.c @@ -1,6 +1,16 @@ #include "overlay_29_0234B104.h" #include "main_0200C4FC.h" #include "overlay_29_0234B024.h" +#include "main_0202593C.h" +#include "overlay_29_022E272C.h" +#include "overlay_29_022E9FC0.h" +#include "overlay_29_0234B340.h" + +extern void InitPreprocessorArgs(struct preprocessor_args *args); +extern void LogMessage(struct entity *user, const char *message, bool8 show_popup); +extern void UnkMapRelatedFunc(u32 switch_case, u32 param_2); +extern void WaitUntilAlertBoxTextIsLoaded(u32 param_1); +extern int FullyCloseAlertBox(void); extern struct message_log_info MESSAGE_LOG_INFO; @@ -13,3 +23,89 @@ void SetMessageLogPreprocessorArgsSpeakerId0x30000(u32 team_index) { MESSAGE_LOG_INFO.alert_box_info->preprocessor_args.speaker_id = team_index | 0x30000; } + +void ov29_0234B130(void) +{ + s32 i; + + for (i = 0; i < 10; i++) { + MESSAGE_LOG_INFO.alert_box_info->message_starts_group[i] = FALSE; + } + + MESSAGE_LOG_INFO.alert_box_info->alert_box_window_id = -2; + MESSAGE_LOG_INFO.alert_box_info->field_0xcee = 0; + MESSAGE_LOG_INFO.alert_box_info->field_0xced = 0; + MESSAGE_LOG_INFO.last_user = NULL; + MESSAGE_LOG_INFO.should_start_group = TRUE; + ov29_0234B1A4(FALSE); + InitPreprocessorArgs(&MESSAGE_LOG_INFO.alert_box_info->preprocessor_args); +} + +void ov29_0234B1A4(bool8 param_1) +{ + s32 i; + + if (!ov29_022E9FC0()) + return; + + for (i = 0; i < 10; i++) { + MESSAGE_LOG_INFO.alert_box_info->alert_box_messages[i][0] = 0; + } + + MESSAGE_LOG_INFO.alert_box_info->field_0xc8b = 0; + MESSAGE_LOG_INFO.alert_box_info->alert_box_current_idx = 0; + MESSAGE_LOG_INFO.alert_box_info->alert_box_current_loaded_idx = 0; + MESSAGE_LOG_INFO.alert_box_info->frames_until_close = 0; + MESSAGE_LOG_INFO.alert_box_info->field_0xc92 = 4; + MESSAGE_LOG_INFO.alert_box_info->loading_status = 0; + + if (FullyCloseAlertBox() && param_1) { + UnkMapRelatedFunc(0, 0); + AdvanceFrame(11); + } +} + +void LogMessageByIdWithPopupCheckParticipants(struct entity *user, struct entity *target, + u32 message_id, s32 pos, s16 val) +{ + MESSAGE_LOG_INFO.alert_box_info->preprocessor_args.id_vals[pos] = val; + + if (target != NULL && user != NULL) { + LogMessageByIdWithPopupCheckUserTarget(user, target, message_id); + } + else if (user != NULL) { + LogMessageByIdWithPopupCheckUser(user, message_id); + } +} + +void WaitUntilAlertBoxTextIsLoadedWrapper(void) +{ + WaitUntilAlertBoxTextIsLoaded(0x50); +} + +void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id) +{ + bool8 display = FALSE; + + if (ShouldDisplayEntityWrapper(user)) + display = TRUE; + + if (display) + LogMessage(user, (char *)StringFromId(message_id), TRUE); +} + +void LogMessageWithPopupCheckUser(struct entity *user, const char *message) +{ + bool8 display = FALSE; + + if (ShouldDisplayEntityWrapper(user)) + display = TRUE; + + if (display) + LogMessage(user, message, TRUE); +} + +void LogMessageByIdQuiet(struct entity *user, u32 message_id) +{ + LogMessage(user, (char *)StringFromId(message_id), FALSE); +} diff --git a/src/overlay_31_02382820.c b/src/overlay_31_02382820.c index a577683d..7ba84da0 100644 --- a/src/overlay_31_02382820.c +++ b/src/overlay_31_02382820.c @@ -11,6 +11,7 @@ #include "dungeon_util_2.h" #include "overlay_29_022E9FC0.h" #include "main_0202A66C.h" +#include "main_02026174.h" extern struct dungeon *DUNGEON_PTR[]; @@ -35,7 +36,6 @@ extern u32 GetMoneyCarried(void); extern u32 sub_0204F9E0(void); extern u8* StringFromId(u32); extern void PreprocessString(u8* dst, u32 dsize, const u8* src, u32 flags, struct PPStrValues* ptr); -extern void DrawTextInWindow(s32, u32, u32, u8*); extern u8* AllocateTemp1024ByteBufferFromPool(void); extern s32 sub_020265A8(u8*); // Measures the text's width in pixels diff --git a/src/overlay_31_02383880.c b/src/overlay_31_02383880.c index 0452a00c..411b45b5 100644 --- a/src/overlay_31_02383880.c +++ b/src/overlay_31_02383880.c @@ -5,6 +5,7 @@ #include "main_02001188.h" #include "main_020282F4.h" #include "overlay_29_022E9FC0.h" +#include "main_02026174.h" extern struct dungeon *DUNGEON_PTR[]; extern struct loc_struct* OVERLAY31_UNKNOWN_POINTER__NA_238A26C; @@ -14,7 +15,6 @@ extern bool8 ov10_022BCD10(s8); extern void CloseInventoryMenu(s8); extern void ov29_0234E988(u8*); extern void CloseTextBox2(); -extern void DrawTextInWindow(struct window*, u32, u32, u8*); u8 ov31_0238372C(struct position* x) { @@ -58,9 +58,9 @@ void ov31_023837C8(void) void ov31_02383854(struct window* w) { #ifdef JAPAN - DrawTextInWindow(w, 2, 2, StringFromId(0x1d3e)); + DrawTextInWindow((s32)w, 2, 2, StringFromId(0x1d3e)); #else - DrawTextInWindow(w, 2, 2, StringFromId(0x08e6)); + DrawTextInWindow((s32)w, 2, 2, StringFromId(0x08e6)); #endif } diff --git a/src/status_checks.c b/src/status_checks.c index 5fb496e2..24fa22ea 100644 --- a/src/status_checks.c +++ b/src/status_checks.c @@ -6,6 +6,7 @@ #include "dungeon_statuses.h" #include "dungeon_util_static.h" #include "dungeon_util_2.h" +#include "overlay_29_0234B104.h" #ifdef JAPAN #define HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET -0x2C1 @@ -20,7 +21,6 @@ #define INFATUATED_MESSAGE (0xC2C + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) #define BIDE_MESSAGE (0xC2D + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); bool8 HasStatusThatPreventsActing(struct entity *monster) { diff --git a/src/type_effectiveness.c b/src/type_effectiveness.c index 4ddc0d23..61852906 100644 --- a/src/type_effectiveness.c +++ b/src/type_effectiveness.c @@ -13,11 +13,11 @@ #include "type_matchup_table.h" #include "weather.h" #include "overlay_29_0234B340.h" +#include "overlay_29_0234B104.h" extern struct dungeon *DUNGEON_PTR; extern bool8 UpdateStateFlags(struct monster *info, s32 flag, bool8 value); -extern void LogMessageByIdWithPopupCheckParticipants(struct entity *user, struct entity *target, u32 message_id, s32 a4, s32 a5); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern bool8 GhostImmunityIsActive(struct entity *attacker, struct entity *defender, s16 target_type_idx); extern bool8 IsTypeIneffectiveAgainstGhost(enum type_id type); From 964beafb7d87ff2fd12c5852300832881c1ed3c8 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 13 Sep 2026 16:08:55 -0700 Subject: [PATCH 23/34] Decompile 38 more callees; clear five more asm files entirely Thirty-eight functions in nine groups, each group clearing a .s file's head or the whole file so nothing splits: asm/overlay_29_0231AFB4.s ov29_0231AFB4, ov29_0231B008, ActivateMotorDrive, TryActivateFrisk (whole file) asm/overlay_29_022FBC4C.s CountActiveMonsters, ov29_022FBC94, ov29_022FBD08, ov29_022FBD24, ov29_022FBD80 (whole file) asm/overlay_29_02302388.s ov29_02302388, UpdateStateFlags, IsProtectedFromNegativeStatus, ov29_023024E0, AddExpSpecial (whole file) asm/main_02051098.s sub_02051098, sub_020510C0, MtInit, MtNext (whole file) asm/main_02055528.s IsMainCharacter, GetTeamMember, GetRecruitMentryIdBySpecies (whole file) asm/overlay_29_023350FC.s ov29_023350FC, TryWeatherFormChange asm/main_020562B8.s sub_020562B8, SetActiveTeam, sub_02056318, sub_0205633C, sub_02056360, GetActiveTeamMember asm/overlay_29_022F0654.s MakeTargetFaceUserAndIdle, ov29_022F067C, ov29_022F0780 asm/main_02013C30.s GetMovesetIdx__02013CAC, IsReflectedByMagicCoat, CanBeSnatched, FailsWhileMuzzled, IsSoundMove, IsRecoilMove Five files are consumed entirely, so main.lsf loses five asm objects. ov29_022FBD08, ov29_022FBD24 and ov29_022FBD80 do not exist in the JAPAN build: they sit inside one #ifndef JAPAN in the .s, so their definitions and their prototypes carry the same guard. include/dungeon.h gains struct unk_022FBD24, grouping the two members at 0x3DCC and 0x3E1C into one sub-object. Layout is byte-identical -- u32[20] then u32, same order, same offsets -- but the grouping is what makes MWCC materialise the single base register the target uses; without the type src/overlay_29_022FBBEC.c does not compile. The four comment lines move verbatim with the members. struct unk_022C4C6C::field_0x0 is enum type_id, not u8: it feeds monster->types[0]. enum type_id maxes at 18, so -enum min keeps it one byte and the layout is unchanged. src/special_move_types.c declares DUNGEON_PTR as [2], not the [] the tree usually writes. With the incomplete array type MWCC hoists the ldr out of the outer loop of ov29_0231AFB4 and ov29_0231B008 (scores 460 and 515); 8 bytes is the symbol's measured extent and [] and [2] are compatible types, so nothing else changes. Eighteen call-site declarations are replaced by an include of the owning header. Three were required rather than cosmetic: two K&R `extern int ov29_022FBD24();` and `extern int ov29_022F0780();` with the wrong return type, and a GetActiveTeamMember declared (int) against the definition's s32. Authored by Claude (Opus 5) under human direction. Each function was measured at decomp.me score 0 in every region it exists in, and re-measured by an independent verifier. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- .../{main_02013C30.inc => main_02013E54.inc} | 3 +- asm/include/main_02051098.inc | 7 - asm/include/main_02055528.inc | 3 - .../{main_020562B8.inc => main_020563BC.inc} | 0 ...9_022F0654.inc => overlay_29_022F07BC.inc} | 33 +-- asm/include/overlay_29_022FBC4C.inc | 5 - asm/include/overlay_29_02302388.inc | 21 -- asm/include/overlay_29_0231AFB4.inc | 11 - ...9_023350FC.inc => overlay_29_0233544C.inc} | 28 +- asm/{main_02013C30.s => main_02013E54.s} | 142 +--------- asm/main_02051098.s | 154 ---------- asm/main_02055528.s | 99 ------- asm/main_020562B8.s | 183 ------------ asm/main_020563BC.s | 89 ++++++ ...ay_29_022F0654.s => overlay_29_022F07BC.s} | 112 +------- asm/overlay_29_022FBC4C.s | 151 ---------- asm/overlay_29_02302388.s | 263 ------------------ asm/overlay_29_0231AFB4.s | 173 ------------ ...ay_29_023350FC.s => overlay_29_0233544C.s} | 241 +--------------- include/dungeon.h | 16 +- include/dungeon_logic_2.h | 5 + include/main_02055410.h | 5 + include/main_02056294.h | 7 + include/moves_3.h | 7 + include/number_util.h | 5 + include/overlay_29_022F0590.h | 3 + include/overlay_29_022FBBEC.h | 7 + include/overlay_29_023350D8.h | 2 + include/special_move_types.h | 4 + main.lsf | 13 +- src/dungeon_ai_itcm.c | 2 +- src/dungeon_ai_targeting.c | 2 +- src/dungeon_logic_2.c | 130 +++++++++ src/dungeon_recruitment.c | 2 +- src/main_02055410.c | 41 +++ src/main_02056294.c | 42 +++ src/main_0205A288.c | 2 +- src/main_0205B008.c | 2 +- src/main_0205D11C.c | 2 +- src/move_orb_effects.c | 2 +- src/moves_3.c | 84 ++++++ src/number_util.c | 66 +++++ src/overlay_11_02307334.c | 5 +- src/overlay_29_022F0590.c | 76 +++++ src/overlay_29_022FBBEC.c | 68 +++++ src/overlay_29_023000E4.c | 2 +- src/overlay_29_02308FBC.c | 9 +- src/overlay_29_0230BBAC.c | 4 +- src/overlay_29_02311010.c | 2 +- src/overlay_29_023350D8.c | 134 +++++++++ src/special_move_types.c | 90 ++++++ src/type_effectiveness.c | 2 +- 52 files changed, 921 insertions(+), 1640 deletions(-) rename asm/include/{main_02013C30.inc => main_02013E54.inc} (80%) delete mode 100644 asm/include/main_02051098.inc delete mode 100644 asm/include/main_02055528.inc rename asm/include/{main_020562B8.inc => main_020563BC.inc} (100%) rename asm/include/{overlay_29_022F0654.inc => overlay_29_022F07BC.inc} (86%) delete mode 100644 asm/include/overlay_29_022FBC4C.inc delete mode 100644 asm/include/overlay_29_02302388.inc delete mode 100644 asm/include/overlay_29_0231AFB4.inc rename asm/include/{overlay_29_023350FC.inc => overlay_29_0233544C.inc} (67%) rename asm/{main_02013C30.s => main_02013E54.s} (86%) delete mode 100644 asm/main_02051098.s delete mode 100644 asm/main_02055528.s delete mode 100644 asm/main_020562B8.s create mode 100644 asm/main_020563BC.s rename asm/{overlay_29_022F0654.s => overlay_29_022F07BC.s} (83%) delete mode 100644 asm/overlay_29_022FBC4C.s delete mode 100644 asm/overlay_29_02302388.s delete mode 100644 asm/overlay_29_0231AFB4.s rename asm/{overlay_29_023350FC.s => overlay_29_0233544C.s} (86%) diff --git a/asm/include/main_02013C30.inc b/asm/include/main_02013E54.inc similarity index 80% rename from asm/include/main_02013C30.inc rename to asm/include/main_02013E54.inc index 0ec3022e..3e44c472 100644 --- a/asm/include/main_02013C30.inc +++ b/asm/include/main_02013E54.inc @@ -1,6 +1,5 @@ #pragma once -.public _s32_div_f .public DUNGEON_MOVE_TABLES .public GetInfoMoveGround .public Rand16Bit -.public RECOIL_MOVE_LIST +.public _s32_div_f diff --git a/asm/include/main_02051098.inc b/asm/include/main_02051098.inc deleted file mode 100644 index 44e15ef9..00000000 --- a/asm/include/main_02051098.inc +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once -.public _020AFF80 -.public _020AFF88 -.public CopyBitsFrom -.public CopyBitsTo -.public DUNGEON_RESTRICTIONS -.public MT_TABLE diff --git a/asm/include/main_02055528.inc b/asm/include/main_02055528.inc deleted file mode 100644 index 3e1f5535..00000000 --- a/asm/include/main_02055528.inc +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once -.public GetGameMode -.public TEAM_MEMBER_TABLE_PTR diff --git a/asm/include/main_020562B8.inc b/asm/include/main_020563BC.inc similarity index 100% rename from asm/include/main_020562B8.inc rename to asm/include/main_020563BC.inc diff --git a/asm/include/overlay_29_022F0654.inc b/asm/include/overlay_29_022F07BC.inc similarity index 86% rename from asm/include/overlay_29_022F0654.inc rename to asm/include/overlay_29_022F07BC.inc index dc717b8f..f34216e7 100644 --- a/asm/include/overlay_29_022F0654.inc +++ b/asm/include/overlay_29_022F07BC.inc @@ -1,19 +1,15 @@ #pragma once .public AddMoneyCarried .public AdvanceFrame -.public AnimationDelayOrSomething .public AppendStandardStringToMission .public CheckMonsterTeamMemberIdx .public CloseTextBox .public CreateTextBox -.public DrawTextInWindow .public DUNGEON_BUTTON_INPUT .public DUNGEON_PTR +.public DrawTextInWindow .public EntityIsValid__022F0590 -.public ExecuteMoveEffect .public GetBottomScreenOption -.public GetDirectionTowardsPosition -.public GetLeader .public GetLeaderMonster .public GetMessageLogPreprocessorArgs .public GetMoneyCarried @@ -26,15 +22,24 @@ .public MakeMonsterIdleInDirection2 .public MemAlloc .public MemFree +.public PlaySeByIdVolumeWrapper +.public PreprocessString +.public SetMessageLogPreprocessorArgsSpeakerId +.public SetMessageLogPreprocessorArgsSpeakerId0x30000 +.public SetMessageLogPreprocessorArgsStringToName +.public SetTopScreenOption +.public SubstitutePlaceholderStringTags +.public UnkMapRelatedFunc +.public UpdateAiTargetPos +.public UpdateMinimap +.public UpdateWindow .public ov29_022DE608 .public ov29_022E0B44 .public ov29_022E0C4C .public ov29_022E0DD8 .public ov29_022E0DF0 -.public ov29_022E81F8 .public ov29_022EA370 .public ov29_022F3B98 -.public ov29_02322DDC .public ov29_02338F58 .public ov29_02339190 .public ov29_023391C0 @@ -43,7 +48,6 @@ .public ov29_0234B1A4 .public ov29_0234D650 .public ov29_0234D65C -.public ov29_0234D668 .public ov29_0234D690 .public ov29_0234D860 .public ov29_0234D878 @@ -53,19 +57,6 @@ .public ov29_023535A4 .public ov29_0237C6A4 .public ov29_0237CFBB -.public PlaySeByIdVolumeWrapper -.public PreprocessString -.public SetMessageLogPreprocessorArgsSpeakerId -.public SetMessageLogPreprocessorArgsSpeakerId0x30000 -.public SetMessageLogPreprocessorArgsStringToName -.public SetTopScreenOption .public sub_02001AB0 .public sub_02006B70 .public sub_02027B1C -.public SubstitutePlaceholderStringTags -.public TryPointCameraToMonster -.public UnkMapRelatedFunc -.public UpdateAiTargetPos -.public UpdateMinimap -.public UpdateWindow -.public WaitUntilAlertBoxPauseIsOver diff --git a/asm/include/overlay_29_022FBC4C.inc b/asm/include/overlay_29_022FBC4C.inc deleted file mode 100644 index c6491025..00000000 --- a/asm/include/overlay_29_022FBC4C.inc +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -.public DUNGEON_PTR -.public EntityIsValid__022F7364 -.public GetBodySize -.public IsMonster__022F9720 diff --git a/asm/include/overlay_29_02302388.inc b/asm/include/overlay_29_02302388.inc deleted file mode 100644 index 37f11755..00000000 --- a/asm/include/overlay_29_02302388.inc +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once -.public _s32_div_f -.public DUNGEON_PTR -.public EntityIsValid__023000E4 -.public EXCLUSIVE_ITEM_EXP_BOOST -.public ExclusiveItemEffectFlagTest -.public ExclusiveItemEffectIsActive__022FFF28 -.public EXP_ELITE_EXP_BOOST -.public GetExclusiveItemWithEffectFromBag -.public IqSkillIsEnabled -.public IsBlinded -.public IsExperienceLocked -.public ItemIsActive__023026CC -.public LeafGuardIsActive -.public LogMessageByIdWithPopupCheckUserTarget -.public MIRACLE_CHEST_EXP_BOOST -.public MultiplyByFixedPoint -.public ov29_02301A84 -.public PrepareItemForPrinting__02345728 -.public SubstitutePlaceholderStringTags -.public WONDER_CHEST_EXP_BOOST diff --git a/asm/include/overlay_29_0231AFB4.inc b/asm/include/overlay_29_0231AFB4.inc deleted file mode 100644 index e8899997..00000000 --- a/asm/include/overlay_29_0231AFB4.inc +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once -.public BoostSpeedOneStage -.public DUNGEON_PTR -.public EntityIsValid__0231B194 -.public GetTreasureBoxChances -.public LogMessageByIdWithPopupCheckParticipants -.public LogMessageByIdWithPopupCheckUserTarget -.public ov29_022E4110 -.public ov29_0232E80C -.public PrepareItemForPrinting__02345728 -.public SubstitutePlaceholderStringTags diff --git a/asm/include/overlay_29_023350FC.inc b/asm/include/overlay_29_0233544C.inc similarity index 67% rename from asm/include/overlay_29_023350FC.inc rename to asm/include/overlay_29_0233544C.inc index 020e7e74..ae90ff93 100644 --- a/asm/include/overlay_29_023350FC.inc +++ b/asm/include/overlay_29_0233544C.inc @@ -1,35 +1,26 @@ #pragma once -.public _020AFC70 -.public _s32_div_f -.public AbilityIsActiveVeneer -.public CalcSpeedStageWrapper .public CalcStatusDuration -.public CASTFORM_WEATHER_ATTRIBUTE_TABLE .public CeilFixedPoint -.public Conversion2IsActive -.public DetermineMonsterShadow .public DUNGEON_FRAMES_PASSED .public DUNGEON_PTR -.public DungeonGetSpriteIndex .public DungeonGoesUp -.public EntityIsValid__023350D8 .public GetApparentWeather -.public GetIdleAnimationId .public GetLanguage .public GetLeader -.public GetMonsterApparentId -.public GetType -.public GetWeatherColorTable .public HasLowHealth .public InitRender3dElement64 .public IsCurrentFixedRoomBossFight .public LoadWteFromFileDirectory .public LoadWtuFromBin .public LogMessageByIdWithPopupCheckUser -.public ov29_022DE608 -.public ov29_022E65F4 +.public ProcessWte +.public SPORT_CONDITION_TURN_RANGE +.public SetBothScreensWindowColorToDefault +.public SetScreenWindowsColor +.public TickStatusTurnCounter +.public _020AFC70 +.public _s32_div_f .public ov29_022E9A6C -.public ov29_02304830 .public ov29_02334E70 .public ov29_02352B4C .public ov29_0235371C @@ -37,11 +28,6 @@ .public ov29_0237CA8C .public ov29_0237CA90 .public ov29_0237CA96 -.public ProcessWte -.public SetBothScreensWindowColorToDefault -.public SetScreenWindowsColor -.public SPORT_CONDITION_TURN_RANGE .public sub_0201E020 .public sub_0201E080 .public sub_0201F2A0 -.public TickStatusTurnCounter diff --git a/asm/main_02013C30.s b/asm/main_02013E54.s similarity index 86% rename from asm/main_02013C30.s rename to asm/main_02013E54.s index 95695157..afbfcc96 100644 --- a/asm/main_02013C30.s +++ b/asm/main_02013E54.s @@ -1,148 +1,8 @@ .include "asm/macros.inc" - .include "main_02013C30.inc" + .include "main_02013E54.inc" .text - arm_func_start GetMovesetIdx__02013CAC -GetMovesetIdx__02013CAC: ; 0x02013CAC - stmdb sp!, {r3, r4, r5, lr} - mov r5, #0 - mov ip, r5 - mov lr, #1 - mov r2, #6 - b _02013CF8 -_02013CC4: - mul r4, r5, r2 - ldrb r3, [r0, r4] - add r4, r0, r4 - tst r3, #1 - movne r3, lr - moveq r3, ip - tst r3, #0xff - beq _02013CF4 - ldrh r3, [r4, #2] - cmp r1, r3 - moveq r0, r5 - ldmeqia sp!, {r3, r4, r5, pc} -_02013CF4: - add r5, r5, #1 -_02013CF8: - cmp r5, #4 - blt _02013CC4 - mvn r0, #0 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end GetMovesetIdx__02013CAC - - arm_func_start IsReflectedByMagicCoat -IsReflectedByMagicCoat: ; 0x02013D08 - ldr r2, _02013D20 ; =DUNGEON_MOVE_TABLES - mov r1, #0x1a - ldr r2, [r2, #8] - mla r1, r0, r1, r2 - ldrb r0, [r1, #0x10] - bx lr - .align 2, 0 -_02013D20: .word DUNGEON_MOVE_TABLES - arm_func_end IsReflectedByMagicCoat - - arm_func_start CanBeSnatched -CanBeSnatched: ; 0x02013D24 - ldr r2, _02013D3C ; =DUNGEON_MOVE_TABLES - mov r1, #0x1a - ldr r2, [r2, #8] - mla r1, r0, r1, r2 - ldrb r0, [r1, #0x11] - bx lr - .align 2, 0 -_02013D3C: .word DUNGEON_MOVE_TABLES - arm_func_end CanBeSnatched - - arm_func_start FailsWhileMuzzled -FailsWhileMuzzled: ; 0x02013D40 - ldr r2, _02013D58 ; =DUNGEON_MOVE_TABLES - mov r1, #0x1a - ldr r2, [r2, #8] - mla r1, r0, r1, r2 - ldrb r0, [r1, #0x12] - bx lr - .align 2, 0 -_02013D58: .word DUNGEON_MOVE_TABLES - arm_func_end FailsWhileMuzzled - - arm_func_start IsSoundMove -IsSoundMove: ; 0x02013D5C - ldrh r2, [r0, #4] - cmp r2, #0xd9 - moveq r0, #1 - bxeq lr - cmp r2, #0x11c - moveq r0, #1 - bxeq lr - cmp r2, #0x53 - moveq r0, #1 - bxeq lr - cmp r2, #0x22 - moveq r0, #1 - bxeq lr - cmp r2, #0x54 - moveq r0, #1 - bxeq lr - cmp r2, #0xab - moveq r0, #1 - bxeq lr - ldr r1, _02013E10 ; =0x00000125 - cmp r2, r1 - moveq r0, #1 - bxeq lr - cmp r2, #0x1b - moveq r0, #1 - bxeq lr - cmp r2, #0xf1 - moveq r0, #1 - bxeq lr - cmp r2, #0x19 - moveq r0, #1 - bxeq lr - cmp r2, #0x1a - moveq r0, #1 - bxeq lr - add r0, r1, #0xed - cmp r2, r0 - moveq r0, #1 - bxeq lr - add r0, r1, #0x99 - cmp r2, r0 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - bx lr - .align 2, 0 -_02013E10: .word 0x00000125 - arm_func_end IsSoundMove - - arm_func_start IsRecoilMove -IsRecoilMove: ; 0x02013E14 - mov r3, #0 - ldr r2, _02013E50 ; =RECOIL_MOVE_LIST - b _02013E38 -_02013E20: - cmp r0, r1 - moveq r0, #1 - bxeq lr - add r1, r3, #1 - mov r1, r1, lsl #0x10 - mov r3, r1, asr #0x10 -_02013E38: - mov r1, r3, lsl #1 - ldrh r1, [r2, r1] - cmp r1, #0 - bne _02013E20 - mov r0, #0 - bx lr - .align 2, 0 -_02013E50: .word RECOIL_MOVE_LIST - arm_func_end IsRecoilMove - arm_func_start sub_02013E54 sub_02013E54: ; 0x02013E54 stmdb sp!, {r4, r5, r6, lr} diff --git a/asm/main_02051098.s b/asm/main_02051098.s deleted file mode 100644 index f0a21c46..00000000 --- a/asm/main_02051098.s +++ /dev/null @@ -1,154 +0,0 @@ - .include "asm/macros.inc" - .include "main_02051098.inc" - - .text - - arm_func_start sub_02051098 -sub_02051098: ; 0x02051098 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - mov r2, #0x10 - bl CopyBitsFrom - mov r0, r5 - add r1, r4, #2 - mov r2, #0x10 - bl CopyBitsFrom - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_02051098 - - arm_func_start sub_020510C0 -sub_020510C0: ; 0x020510C0 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - mov r2, #0x10 - bl CopyBitsTo - mov r0, r5 - add r1, r4, #2 - mov r2, #0x10 - bl CopyBitsTo - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_020510C0 - - arm_func_start MtInit -MtInit: ; 0x020510E8 - ldr r3, _02051128 ; =_020AFF88 - mov ip, #1 - str r0, [r3] - ldr r0, _0205112C ; =0x6C078965 - b _02051114 -_020510FC: - add r1, r3, ip, lsl #2 - ldr r1, [r1, #-4] - eor r1, r1, r1, lsr #30 - mla r2, r1, r0, ip - str r2, [r3, ip, lsl #2] - add ip, ip, #1 -_02051114: - cmp ip, #0x270 - blt _020510FC - ldr r0, _02051130 ; =MT_TABLE - str ip, [r0] - bx lr - .align 2, 0 -_02051128: .word _020AFF88 -_0205112C: .word 0x6C078965 -_02051130: .word MT_TABLE - arm_func_end MtInit - - arm_func_start MtNext -MtNext: ; 0x02051134 - stmdb sp!, {r4, lr} - ldr r0, _0205126C ; =MT_TABLE - ldr r1, [r0] - cmp r1, #0x270 - blt _02051230 - ldr r0, _02051270 ; =0x00000271 - cmp r1, r0 - bne _0205115C - add r0, r0, #0x1300 - bl MtInit -_0205115C: - ldr ip, _02051274 ; =_020AFF88 - ldr r2, _02051278 ; =_020AFF80 - mov r0, #0 -_02051168: - add r3, ip, r0, lsl #2 - ldr r4, [ip, r0, lsl #2] - ldr r1, [r3, #4] - and r4, r4, #0x80000000 - bic r1, r1, #0x80000000 - orr r4, r4, r1 - and r1, r4, #1 - ldr r3, [r3, #0x634] - ldr r1, [r2, r1, lsl #2] - eor r3, r3, r4, lsr #1 - eor r1, r3, r1 - str r1, [ip, r0, lsl #2] - add r0, r0, #1 - cmp r0, #0xe3 - blt _02051168 - ldr r4, _02051274 ; =_020AFF88 - ldr r3, _02051278 ; =_020AFF80 - ldr r1, _0205127C ; =0x0000026F - b _020511E8 -_020511B4: - add ip, r4, r0, lsl #2 - ldr lr, [r4, r0, lsl #2] - ldr r2, [ip, #4] - and lr, lr, #0x80000000 - bic r2, r2, #0x80000000 - orr lr, lr, r2 - and r2, lr, #1 - ldr ip, [ip, #-0x38c] - ldr r2, [r3, r2, lsl #2] - eor ip, ip, lr, lsr #1 - eor r2, ip, r2 - str r2, [r4, r0, lsl #2] - add r0, r0, #1 -_020511E8: - cmp r0, r1 - blt _020511B4 - ldr r1, _02051274 ; =_020AFF88 - ldr r0, _02051278 ; =_020AFF80 - ldr r3, [r1, #0x9bc] - ldr r2, [r1] - and r3, r3, #0x80000000 - bic r2, r2, #0x80000000 - orr ip, r3, r2 - and r2, ip, #1 - ldr r3, [r1, #0x630] - ldr r0, [r0, r2, lsl #2] - eor r2, r3, ip, lsr #1 - eor r2, r2, r0 - ldr r0, _0205126C ; =MT_TABLE - str r2, [r1, #0x9bc] - mov r1, #0 - str r1, [r0] -_02051230: - ldr r1, _0205126C ; =MT_TABLE - ldr r2, _02051274 ; =_020AFF88 - ldr r3, [r1] - ldr r0, _02051280 ; =0x9D2C5680 - ldr r2, [r2, r3, lsl #2] - add ip, r3, #1 - eor r3, r2, r2, lsr #11 - and r2, r0, r3, lsl #7 - ldr r0, _02051284 ; =0xEFC60000 - eor r2, r3, r2 - and r0, r0, r2, lsl #15 - eor r0, r2, r0 - str ip, [r1] - eor r0, r0, r0, lsr #18 - ldmia sp!, {r4, pc} - .align 2, 0 -_0205126C: .word MT_TABLE -_02051270: .word 0x00000271 -_02051274: .word _020AFF88 -_02051278: .word _020AFF80 -_0205127C: .word 0x0000026F -_02051280: .word 0x9D2C5680 -_02051284: .word 0xEFC60000 - arm_func_end MtNext - diff --git a/asm/main_02055528.s b/asm/main_02055528.s deleted file mode 100644 index 6e0519a9..00000000 --- a/asm/main_02055528.s +++ /dev/null @@ -1,99 +0,0 @@ - .include "asm/macros.inc" - .include "main_02055528.inc" - - .text - - arm_func_start IsMainCharacter -IsMainCharacter: ; 0x02055528 - stmdb sp!, {r4, lr} - ldr r1, _020555A4 ; =TEAM_MEMBER_TABLE_PTR - mov r4, r0 - mov r0, #0x44 - smulbb r0, r4, r0 - ldr r1, [r1] - ldrb r0, [r1, r0] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _0205559C - cmp r4, #5 - bge _0205559C - bl GetGameMode - cmp r0, #3 - bne _02055584 - cmp r4, #2 - cmpne r4, #3 - cmpne r4, #4 - beq _02055594 - mov r0, #0 - ldmia sp!, {r4, pc} -_02055584: - cmp r4, #0 - cmpne r4, #1 - movne r0, #0 - ldmneia sp!, {r4, pc} -_02055594: - mov r0, #1 - ldmia sp!, {r4, pc} -_0205559C: - mov r0, #0 - ldmia sp!, {r4, pc} - .align 2, 0 -_020555A4: .word TEAM_MEMBER_TABLE_PTR - arm_func_end IsMainCharacter - - arm_func_start GetTeamMember -GetTeamMember: ; 0x020555A8 - mvn r1, #0 - cmp r0, r1 - moveq r0, #0 - bxeq lr - ldr r2, _020555CC ; =TEAM_MEMBER_TABLE_PTR - mov r1, #0x44 - ldr r2, [r2] - smlabb r0, r0, r1, r2 - bx lr - .align 2, 0 -_020555CC: .word TEAM_MEMBER_TABLE_PTR - arm_func_end GetTeamMember - - arm_func_start GetRecruitMentryIdBySpecies -GetRecruitMentryIdBySpecies: ; 0x020555D0 - stmdb sp!, {r4, r5, r6, lr} - ldr r2, _02055648 ; =TEAM_MEMBER_TABLE_PTR - mov r5, #0 - ldr r2, [r2] - mov r6, #5 - add r4, r2, #0x154 - mov ip, r5 - mov lr, #1 - ldr r2, _0205564C ; =0x0000022B - b _02055638 -_020555F8: - ldrb r3, [r4] - tst r3, #1 - movne r3, lr - moveq r3, ip - tst r3, #0xff - beq _02055630 - ldrsh r3, [r4, #4] - cmp r3, r0 - bne _02055630 - cmp r5, r1 - moveq r0, r6, lsl #0x10 - moveq r0, r0, asr #0x10 - ldmeqia sp!, {r4, r5, r6, pc} - add r5, r5, #1 -_02055630: - add r6, r6, #1 - add r4, r4, #0x44 -_02055638: - cmp r6, r2 - blt _020555F8 - mvn r0, #0 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_02055648: .word TEAM_MEMBER_TABLE_PTR -_0205564C: .word 0x0000022B - arm_func_end GetRecruitMentryIdBySpecies diff --git a/asm/main_020562B8.s b/asm/main_020562B8.s deleted file mode 100644 index da487a92..00000000 --- a/asm/main_020562B8.s +++ /dev/null @@ -1,183 +0,0 @@ - .include "asm/macros.inc" - .include "main_020562B8.inc" - - .text - - arm_func_start sub_020562B8 -sub_020562B8: ; 0x020562B8 - cmp r0, #0 - movlt r0, #1 - movge r0, #0 - and r0, r0, #0xff - bx lr - arm_func_end sub_020562B8 - - arm_func_start SetActiveTeam -SetActiveTeam: ; 0x020562CC - ldr r3, _02056314 ; =TEAM_MEMBER_TABLE_PTR - mov r2, #0x1a0 - ldr r1, [r3] - add r1, r1, #0x9000 - strb r0, [r1, #0x877] - ldr ip, [r3] - add r1, ip, #0x36c - add r1, r1, #0x9000 - mla r2, r0, r2, r1 - add r1, ip, #0x9000 - str r2, [r1, #0x84c] - ldr r2, [r3] - add r1, r2, #0x56 - add r1, r1, #0x9800 - add r1, r1, r0, lsl #3 - add r0, r2, #0x9000 - str r1, [r0, #0x870] - bx lr - .align 2, 0 -_02056314: .word TEAM_MEMBER_TABLE_PTR - arm_func_end SetActiveTeam - - arm_func_start sub_02056318 -sub_02056318: ; 0x02056318 - ldr r1, _02056338 ; =TEAM_MEMBER_TABLE_PTR - ldr r2, [r1] - add r1, r2, #0x9000 - ldrb r1, [r1, #0x877] - add r1, r2, r1 - add r1, r1, #0x9000 - strb r0, [r1, #0x874] - bx lr - .align 2, 0 -_02056338: .word TEAM_MEMBER_TABLE_PTR - arm_func_end sub_02056318 - - arm_func_start sub_0205633C -sub_0205633C: ; 0x0205633C - ldr r0, _0205635C ; =TEAM_MEMBER_TABLE_PTR - ldr r1, [r0] - add r0, r1, #0x9000 - ldrb r0, [r0, #0x877] - add r0, r1, r0 - add r0, r0, #0x9000 - ldrb r0, [r0, #0x874] - bx lr - .align 2, 0 -_0205635C: .word TEAM_MEMBER_TABLE_PTR - arm_func_end sub_0205633C - - arm_func_start sub_02056360 -sub_02056360: ; 0x02056360 - ldr r0, _02056388 ; =TEAM_MEMBER_TABLE_PTR - ldr r0, [r0] - add r0, r0, #0x9000 - ldrb r1, [r0, #0x874] - cmp r1, #0 - ldreqb r0, [r0, #0x875] - cmpeq r0, #0 - movne r0, #1 - moveq r0, #0 - bx lr - .align 2, 0 -_02056388: .word TEAM_MEMBER_TABLE_PTR - arm_func_end sub_02056360 - - arm_func_start GetActiveTeamMember -GetActiveTeamMember: ; 0x0205638C - mvn r1, #0 - cmp r0, r1 - moveq r0, #0 - bxeq lr - ldr r1, _020563B8 ; =TEAM_MEMBER_TABLE_PTR - mov r2, #0x68 - ldr r1, [r1] - add r1, r1, #0x9000 - ldr r1, [r1, #0x84c] - smlabb r0, r0, r2, r1 - bx lr - .align 2, 0 -_020563B8: .word TEAM_MEMBER_TABLE_PTR - arm_func_end GetActiveTeamMember - - arm_func_start GetActiveRosterIndex -GetActiveRosterIndex: ; 0x020563BC - mvn r1, #0 - cmp r0, r1 - beq _02056404 - ldr r1, _0205640C ; =TEAM_MEMBER_TABLE_PTR - mov ip, #0 - ldr r1, [r1] - add r1, r1, #0x9000 - b _020563FC -_020563DC: - ldr r3, [r1, #0x870] - mov r2, ip, lsl #1 - ldrsh r2, [r3, r2] - cmp r0, r2 - moveq r0, ip, lsl #0x10 - moveq r0, r0, asr #0x10 - bxeq lr - add ip, ip, #1 -_020563FC: - cmp ip, #4 - blt _020563DC -_02056404: - mvn r0, #0 - bx lr - .align 2, 0 -_0205640C: .word TEAM_MEMBER_TABLE_PTR - arm_func_end GetActiveRosterIndex - - arm_func_start sub_02056410 -sub_02056410: ; 0x02056410 - mvn r1, #0 - cmp r0, r1 - beq _02056454 - ldr r1, _0205645C ; =TEAM_MEMBER_TABLE_PTR - mov ip, #0 - ldr r1, [r1] - add r1, r1, #0x9000 - b _0205644C -_02056430: - ldr r3, [r1, #0x870] - mov r2, ip, lsl #1 - ldrsh r2, [r3, r2] - cmp r0, r2 - moveq r0, #1 - bxeq lr - add ip, ip, #1 -_0205644C: - cmp ip, #4 - blt _02056430 -_02056454: - mov r0, #0 - bx lr - .align 2, 0 -_0205645C: .word TEAM_MEMBER_TABLE_PTR - arm_func_end sub_02056410 - - arm_func_start sub_02056460 -sub_02056460: ; 0x02056460 - mvn r2, #0 - cmp r0, r2 - beq _020564A4 - ldr r2, _020564AC ; =TEAM_MEMBER_TABLE_PTR - mov r3, #0 - ldr r2, [r2] - add r2, r2, r1, lsl #3 - b _0205649C -_02056480: - add r1, r2, r3, lsl #1 - add r1, r1, #0x9800 - ldrsh r1, [r1, #0x56] - cmp r0, r1 - moveq r0, #1 - bxeq lr - add r3, r3, #1 -_0205649C: - cmp r3, #4 - blt _02056480 -_020564A4: - mov r0, #0 - bx lr - .align 2, 0 -_020564AC: .word TEAM_MEMBER_TABLE_PTR - arm_func_end sub_02056460 diff --git a/asm/main_020563BC.s b/asm/main_020563BC.s new file mode 100644 index 00000000..7c1d2df6 --- /dev/null +++ b/asm/main_020563BC.s @@ -0,0 +1,89 @@ + .include "asm/macros.inc" + .include "main_020563BC.inc" + + .text + + arm_func_start GetActiveRosterIndex +GetActiveRosterIndex: ; 0x020563BC + mvn r1, #0 + cmp r0, r1 + beq _02056404 + ldr r1, _0205640C ; =TEAM_MEMBER_TABLE_PTR + mov ip, #0 + ldr r1, [r1] + add r1, r1, #0x9000 + b _020563FC +_020563DC: + ldr r3, [r1, #0x870] + mov r2, ip, lsl #1 + ldrsh r2, [r3, r2] + cmp r0, r2 + moveq r0, ip, lsl #0x10 + moveq r0, r0, asr #0x10 + bxeq lr + add ip, ip, #1 +_020563FC: + cmp ip, #4 + blt _020563DC +_02056404: + mvn r0, #0 + bx lr + .align 2, 0 +_0205640C: .word TEAM_MEMBER_TABLE_PTR + arm_func_end GetActiveRosterIndex + + arm_func_start sub_02056410 +sub_02056410: ; 0x02056410 + mvn r1, #0 + cmp r0, r1 + beq _02056454 + ldr r1, _0205645C ; =TEAM_MEMBER_TABLE_PTR + mov ip, #0 + ldr r1, [r1] + add r1, r1, #0x9000 + b _0205644C +_02056430: + ldr r3, [r1, #0x870] + mov r2, ip, lsl #1 + ldrsh r2, [r3, r2] + cmp r0, r2 + moveq r0, #1 + bxeq lr + add ip, ip, #1 +_0205644C: + cmp ip, #4 + blt _02056430 +_02056454: + mov r0, #0 + bx lr + .align 2, 0 +_0205645C: .word TEAM_MEMBER_TABLE_PTR + arm_func_end sub_02056410 + + arm_func_start sub_02056460 +sub_02056460: ; 0x02056460 + mvn r2, #0 + cmp r0, r2 + beq _020564A4 + ldr r2, _020564AC ; =TEAM_MEMBER_TABLE_PTR + mov r3, #0 + ldr r2, [r2] + add r2, r2, r1, lsl #3 + b _0205649C +_02056480: + add r1, r2, r3, lsl #1 + add r1, r1, #0x9800 + ldrsh r1, [r1, #0x56] + cmp r0, r1 + moveq r0, #1 + bxeq lr + add r3, r3, #1 +_0205649C: + cmp r3, #4 + blt _02056480 +_020564A4: + mov r0, #0 + bx lr + .align 2, 0 +_020564AC: .word TEAM_MEMBER_TABLE_PTR + arm_func_end sub_02056460 diff --git a/asm/overlay_29_022F0654.s b/asm/overlay_29_022F07BC.s similarity index 83% rename from asm/overlay_29_022F0654.s rename to asm/overlay_29_022F07BC.s index 552a502b..0e7a48b8 100644 --- a/asm/overlay_29_022F0654.s +++ b/asm/overlay_29_022F07BC.s @@ -1,118 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_022F0654.inc" + .include "overlay_29_022F07BC.inc" .text - arm_func_start MakeTargetFaceUserAndIdle -MakeTargetFaceUserAndIdle: ; 0x022F0654 - stmdb sp!, {r4, lr} - mov r4, r0 - add r0, r4, #4 - add r1, r1, #4 - bl GetDirectionTowardsPosition - mov r1, r0 - mov r0, r4 - and r1, r1, #0xff - bl MakeMonsterIdleInDirection2 - ldmia sp!, {r4, pc} - arm_func_end MakeTargetFaceUserAndIdle - - arm_func_start ov29_022F067C -ov29_022F067C: ; 0x022F067C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #0x24 - mov r7, r0 - mov r6, r2 - cmp r1, #0 - bne _022F06F4 - mov r5, #0 - ldr r8, _022F077C ; =DUNGEON_PTR - mov r4, r5 - add sb, sp, #0x10 -_022F06A4: - ldr r0, [r8] - add r0, r0, r4, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr sl, [r0, #0xa84] -#else - ldr sl, [r0, #0xb28] -#endif - mov r0, sl - bl EntityIsValid__022F0590 - cmp r0, #0 - strne sl, [sb, r5, lsl #2] - add r4, r4, #1 - addne r5, r5, #1 - cmp r4, #4 - blt _022F06A4 - cmp r5, #4 - addlt r0, sp, #0x10 - movlt r1, #0 - strlt r1, [r0, r5, lsl #2] - blt _022F0700 - moveq r0, #0 - streq r0, [sp, #0x20] - b _022F0700 -_022F06F4: - mov r0, #0 - str r1, [sp, #0x10] - str r0, [sp, #0x14] -_022F0700: - mov r2, #0 - mov r4, #1 - strb r4, [sp, #8] - strh r2, [sp, #0xa] - strh r6, [sp, #0xc] - strb r4, [sp, #0xe] - strb r2, [sp, #0xf] - add r1, sp, #8 - add r3, sp, #0x10 - mov r0, r7 - stmia sp, {r2, r4} - bl ov29_02322DDC - mov r0, r4 - bl AnimationDelayOrSomething - mov r3, #0 - add r0, sp, #0x10 - add r2, sp, #8 - mov r1, r7 - str r3, [sp] - bl ExecuteMoveEffect - bl ov29_022E81F8 - mov r0, #0xa - bl WaitUntilAlertBoxPauseIsOver - mov r0, #0 - bl ov29_0234B1A4 - bl GetLeader - mov r1, r4 - mov r2, r1 - bl TryPointCameraToMonster - add sp, sp, #0x24 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_022F077C: .word DUNGEON_PTR - arm_func_end ov29_022F067C - - arm_func_start ov29_022F0780 -ov29_022F0780: ; 0x022F0780 - stmdb sp!, {r3, r4, lr} - sub sp, sp, #4 - mov r4, r0 - bl ov29_0234D668 - bl GetMessageLogPreprocessorArgs - mov r2, #0 - mov r1, r0 - mov ip, #1 - mov r0, r4 - mov r3, r2 - str ip, [sp] - bl ov29_0234D690 - bl ov29_0234D650 - add sp, sp, #4 - ldmia sp!, {r3, r4, pc} - arm_func_end ov29_022F0780 - arm_func_start SubtractMoneyCarriedWithSfx SubtractMoneyCarriedWithSfx: ; 0x022F07BC stmdb sp!, {r3, lr} diff --git a/asm/overlay_29_022FBC4C.s b/asm/overlay_29_022FBC4C.s deleted file mode 100644 index 824f6475..00000000 --- a/asm/overlay_29_022FBC4C.s +++ /dev/null @@ -1,151 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022FBC4C.inc" - - .text - - arm_func_start CountActiveMonsters -CountActiveMonsters: ; 0x022FBC4C - stmdb sp!, {r3, r4, r5, lr} - mov r5, #0 - ldr r4, _022FBC90 ; =DUNGEON_PTR - b _022FBC80 -_022FBC5C: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r0, [r0, #0xa84] -#else - ldr r0, [r0, #0xb28] -#endif - bl EntityIsValid__022F7364 - cmp r0, #0 - moveq r0, #1 - ldmeqia sp!, {r3, r4, r5, pc} - add r5, r5, #1 -_022FBC80: - cmp r5, #4 - blt _022FBC5C - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_022FBC90: .word DUNGEON_PTR - arm_func_end CountActiveMonsters - - arm_func_start ov29_022FBC94 -ov29_022FBC94: ; 0x022FBC94 - stmdb sp!, {r4, r5, r6, lr} - bl GetBodySize - ldr r6, _022FBD04 ; =DUNGEON_PTR - mov r4, r0 - mov r5, #0 -_022FBCA8: - ldr r0, [r6] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r0, [r0, #0xa84] -#else - ldr r0, [r0, #0xb28] -#endif - bl EntityIsValid__022F7364 - cmp r0, #0 - beq _022FBCE4 - ldr r0, [r6] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r0, [r0, #0xa84] -#else - ldr r0, [r0, #0xb28] -#endif - ldr r0, [r0, #0xb4] - ldrsh r0, [r0, #2] - bl GetBodySize - add r4, r4, r0 -_022FBCE4: - add r5, r5, #1 - cmp r5, #4 - blt _022FBCA8 - cmp r4, #6 - movle r0, #1 - movgt r0, #0 - and r0, r0, #0xff - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_022FBD04: .word DUNGEON_PTR - arm_func_end ov29_022FBC94 - -#ifndef JAPAN - arm_func_start ov29_022FBD08 -ov29_022FBD08: ; 0x022FBD08 - ldr r0, _022FBD20 ; =DUNGEON_PTR - mov r1, #0 - ldr r0, [r0] - add r0, r0, #0x3000 - str r1, [r0, #0xe1c] - bx lr - .align 2, 0 -_022FBD20: .word DUNGEON_PTR - arm_func_end ov29_022FBD08 - - arm_func_start ov29_022FBD24 -ov29_022FBD24: ; 0x022FBD24 - stmdb sp!, {r4, lr} - mov r4, r0 - bl IsMonster__022F9720 - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - ldr r0, _022FBD7C ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x1cc - add r3, r0, #0x3c00 - ldr r2, [r3, #0x50] - cmp r2, #0x14 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - ldr r1, [r4, #0xb4] - mov r0, #1 - ldr r1, [r1, #0xb0] - str r1, [r3, r2, lsl #2] - ldr r1, [r3, #0x50] - add r1, r1, #1 - str r1, [r3, #0x50] - ldmia sp!, {r4, pc} - .align 2, 0 -_022FBD7C: .word DUNGEON_PTR - arm_func_end ov29_022FBD24 - - arm_func_start ov29_022FBD80 -ov29_022FBD80: ; 0x022FBD80 - stmdb sp!, {r4, lr} - mov r4, r0 - bl IsMonster__022F9720 - cmp r0, #0 - beq _022FBDD4 - ldr r0, _022FBDDC ; =DUNGEON_PTR - ldr r1, [r4, #0xb4] - ldr r0, [r0] - ldr r2, [r1, #0xb0] - add r0, r0, #0x1cc - add r1, r0, #0x3c00 - ldr ip, [r1, #0x50] - mov r3, #0 - b _022FBDCC -_022FBDB8: - ldr r0, [r1, r3, lsl #2] - cmp r2, r0 - moveq r0, #1 - ldmeqia sp!, {r4, pc} - add r3, r3, #1 -_022FBDCC: - cmp r3, ip - blt _022FBDB8 -_022FBDD4: - mov r0, #0 - ldmia sp!, {r4, pc} - .align 2, 0 -_022FBDDC: .word DUNGEON_PTR - arm_func_end ov29_022FBD80 -#endif diff --git a/asm/overlay_29_02302388.s b/asm/overlay_29_02302388.s deleted file mode 100644 index 430be18a..00000000 --- a/asm/overlay_29_02302388.s +++ /dev/null @@ -1,263 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02302388.inc" - - .text - - arm_func_start ov29_02302388 -ov29_02302388: ; 0x02302388 - stmdb sp!, {r4, lr} - mov r4, r0 - bl EntityIsValid__023000E4 - cmp r0, #0 - ldrne r0, [r4, #0xb4] - ldrneb r1, [r0, #0xbc] - cmpne r1, #7 - beq _023023B8 - bl IsExperienceLocked - cmp r0, #0 - moveq r0, #1 - ldmeqia sp!, {r4, pc} -_023023B8: - mov r0, #0 - ldmia sp!, {r4, pc} - arm_func_end ov29_02302388 - - arm_func_start UpdateStateFlags -UpdateStateFlags: ; 0x023023C0 -#ifdef JAPAN -#define UPDATE_STATE_FLAGS_OFFSET -4 -#else -#define UPDATE_STATE_FLAGS_OFFSET 0 -#endif - stmdb sp!, {r3, lr} - add r3, r0, #0x100 - ldrh ip, [r3, #0x58 + UPDATE_STATE_FLAGS_OFFSET] - tst ip, r1 - ldrneh ip, [r3, #0x5a + UPDATE_STATE_FLAGS_OFFSET] - ldreqh lr, [r3, #0x5a + UPDATE_STATE_FLAGS_OFFSET] - orrne ip, ip, r1 - mvneq ip, r1 - andeq ip, lr, ip - cmp r2, #0 - add r2, r0, #0x100 - strh ip, [r3, #0x5a + UPDATE_STATE_FLAGS_OFFSET] - ldrneh r3, [r2, #0x58 + UPDATE_STATE_FLAGS_OFFSET] - ldreqh ip, [r2, #0x58 + UPDATE_STATE_FLAGS_OFFSET] - add r0, r0, #0x100 - orrne r3, r3, r1 - mvneq r3, r1 - andeq r3, ip, r3 - strh r3, [r2, #0x58 + UPDATE_STATE_FLAGS_OFFSET] - ldrh r2, [r0, #0x5a + UPDATE_STATE_FLAGS_OFFSET] - tst r2, r1 - bne _02302428 - ldrh r0, [r0, #0x58 + UPDATE_STATE_FLAGS_OFFSET] - tst r0, r1 - movne r0, #1 - ldmneia sp!, {r3, pc} -_02302428: - mov r0, #0 - ldmia sp!, {r3, pc} - arm_func_end UpdateStateFlags - - arm_func_start IsProtectedFromNegativeStatus -IsProtectedFromNegativeStatus: ; 0x02302430 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #8 - mov r6, r0 - mov r5, r1 - mov r4, r2 - bl LeafGuardIsActive - cmp r0, #0 - movne r0, #1 - bne _023024D4 - mov r0, r5 - mov r1, #0x59 - bl ExclusiveItemEffectIsActive__022FFF28 - cmp r0, #0 - beq _023024B4 - cmp r4, #0 - beq _023024AC - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - add r2, sp, #0 - mov r0, r5 - mov r1, #0x59 - bl GetExclusiveItemWithEffectFromBag - add r1, sp, #0 - mov r0, #1 - bl PrepareItemForPrinting__02345728 - ldr r2, _023024DC ; =0x00000C39 - mov r0, r6 - mov r1, r5 - bl LogMessageByIdWithPopupCheckUserTarget -_023024AC: - mov r0, #1 - b _023024D4 -_023024B4: - mov r0, r6 - mov r1, r5 - mov r2, r4 - bl ov29_02301A84 - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff -_023024D4: - add sp, sp, #8 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -#ifdef JAPAN -_023024DC: .word 0x00000978 -#else -_023024DC: .word 0x00000C39 -#endif - arm_func_end IsProtectedFromNegativeStatus - - arm_func_start ov29_023024E0 -ov29_023024E0: ; 0x023024E0 - stmdb sp!, {r3, r4, r5, lr} - mov r4, r1 - mov r1, #7 - mov r5, r0 - bl IqSkillIsEnabled - cmp r0, #0 - bne _02302534 - cmp r4, #0 - beq _02302518 - mov r0, r5 - mov r1, #1 - bl IsBlinded - cmp r0, #0 - bne _0230252C -_02302518: - ldr r0, [r5, #0xb4] - ldrb r0, [r0, #0xd0] - cmp r0, #2 - cmpne r0, #4 - bne _02302534 -_0230252C: - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_02302534: - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ov29_023024E0 - - arm_func_start AddExpSpecial -AddExpSpecial: ; 0x0230253C -#ifdef JAPAN -#define ADD_EXP_SPECIAL_OFFSET -4 -#else -#define ADD_EXP_SPECIAL_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r1 - ldr r5, [r7, #0xb4] - mov r6, r2 - mov r0, r5 - bl IsExperienceLocked - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - ldrb r0, [r5, #0xa] - cmp r0, #0x64 - bne _02302580 - cmp r6, #0 - ldrgt r0, _023026B4 ; =DUNGEON_PTR - movgt r1, #1 - ldrgt r0, [r0] - strgtb r1, [r0, #0xf] - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_02302580: - ldr r2, [r5, #0x20] - mov r0, r7 - mov r1, #0x1c - add r4, r2, r6 - bl IqSkillIsEnabled - cmp r0, #0 - beq _023025C0 - ldr r0, _023026B8 ; =EXP_ELITE_EXP_BOOST - mov r1, #0x64 - ldrsh r0, [r0] - mov r0, r0, lsl #8 - bl _s32_div_f - mov r1, r0 - mov r0, r6, lsl #8 - bl MultiplyByFixedPoint - add r4, r4, r0, asr #8 -_023025C0: - mov r0, r7 - mov r1, #0x43 - bl ItemIsActive__023026CC - cmp r0, #0 - beq _023025F8 - ldr r0, _023026BC ; =WONDER_CHEST_EXP_BOOST - mov r1, #0x64 - ldrsh r0, [r0] - mov r0, r0, lsl #8 - bl _s32_div_f - mov r1, r0 - mov r0, r6, lsl #8 - bl MultiplyByFixedPoint - add r4, r4, r0, asr #8 -_023025F8: - mov r0, r7 - mov r1, #0x42 - bl ItemIsActive__023026CC - cmp r0, #0 - beq _02302630 - ldr r0, _023026C0 ; =MIRACLE_CHEST_EXP_BOOST - mov r1, #0x64 - ldrsh r0, [r0] - mov r0, r0, lsl #8 - bl _s32_div_f - mov r1, r0 - mov r0, r6, lsl #8 - bl MultiplyByFixedPoint - add r4, r4, r0, asr #8 -_02302630: - ldr r1, [r7, #0xb4] - ldrb r0, [r1, #6] - cmp r0, #0 - movne r0, #0 - bne _02302650 - add r0, r1, #0x228 + ADD_EXP_SPECIAL_OFFSET - mov r1, #0x4f - bl ExclusiveItemEffectFlagTest -_02302650: - cmp r0, #0 - beq _0230267C - ldr r0, _023026C4 ; =EXCLUSIVE_ITEM_EXP_BOOST - mov r1, #0x64 - ldrsh r0, [r0] - mov r0, r0, lsl #8 - bl _s32_div_f - mov r1, r0 - mov r0, r6, lsl #8 - bl MultiplyByFixedPoint - add r4, r4, r0, asr #8 -_0230267C: - ldr r0, _023026C8 ; =0x0098967F - cmp r4, r0 - movge r4, r0 - ldr r0, [r5, #0x20] - subs r2, r4, r0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - ldr r1, [r5, #0x214 + ADD_EXP_SPECIAL_OFFSET] - ldr r0, _023026B4 ; =DUNGEON_PTR - add r1, r1, r2 - str r1, [r5, #0x214 + ADD_EXP_SPECIAL_OFFSET] - ldr r0, [r0] - mov r1, #1 - strb r1, [r0, #0xf] - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_023026B4: .word DUNGEON_PTR -_023026B8: .word EXP_ELITE_EXP_BOOST -_023026BC: .word WONDER_CHEST_EXP_BOOST -_023026C0: .word MIRACLE_CHEST_EXP_BOOST -_023026C4: .word EXCLUSIVE_ITEM_EXP_BOOST -_023026C8: .word 0x0098967F - arm_func_end AddExpSpecial diff --git a/asm/overlay_29_0231AFB4.s b/asm/overlay_29_0231AFB4.s deleted file mode 100644 index 15f0e00e..00000000 --- a/asm/overlay_29_0231AFB4.s +++ /dev/null @@ -1,173 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0231AFB4.inc" - - .text - - arm_func_start ov29_0231AFB4 -ov29_0231AFB4: ; 0x0231AFB4 - stmdb sp!, {r4, lr} - mov ip, #0 - ldr r1, _0231B004 ; =DUNGEON_PTR - mov r2, ip - mov r3, ip -_0231AFC8: - ldr r0, [r1] - mov r4, r3 -#ifdef JAPAN - add r0, r0, #0x1840 - add r0, r0, #0x18000 -#else - add r0, r0, #0xe4 - add r0, r0, #0x19800 -#endif - add lr, r0, ip, lsl #4 -_0231AFDC: - str r2, [lr, r4, lsl #3] - add r0, lr, r4, lsl #3 - add r4, r4, #1 - str r2, [r0, #4] - cmp r4, #2 - blt _0231AFDC - add ip, ip, #1 - cmp ip, #2 - blt _0231AFC8 - ldmia sp!, {r4, pc} - .align 2, 0 -_0231B004: .word DUNGEON_PTR - arm_func_end ov29_0231AFB4 - - arm_func_start ov29_0231B008 -ov29_0231B008: ; 0x0231B008 - stmdb sp!, {r3, r4, r5, lr} - mov lr, #0 - ldr r1, _0231B05C ; =DUNGEON_PTR - mov r3, lr - mov r2, #2 - mov ip, lr -_0231B020: - ldr r0, [r1] - mov r5, ip -#ifdef JAPAN - add r0, r0, #0x1840 - add r0, r0, #0x18000 -#else - add r0, r0, #0xe4 - add r0, r0, #0x19800 -#endif - add r4, r0, lr, lsl #4 -_0231B034: - str r3, [r4, r5, lsl #3] - add r0, r4, r5, lsl #3 - add r5, r5, #1 - str r2, [r0, #4] - cmp r5, #2 - blt _0231B034 - add lr, lr, #1 - cmp lr, #2 - blt _0231B020 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0231B05C: .word DUNGEON_PTR - arm_func_end ov29_0231B008 - - arm_func_start ActivateMotorDrive -ActivateMotorDrive: ; 0x0231B060 - stmdb sp!, {r3, r4, lr} - sub sp, sp, #4 -#ifdef JAPAN - mov ip, #0x66 - mov r4, r0 - rsb r2, ip, #0x9e0 -#else - ldr r2, _0231B0A0 ; =0x00000C3B - mov ip, #0x66 - mov r4, r0 -#endif - mov r1, #0 - mov r3, #2 - str ip, [sp] - bl LogMessageByIdWithPopupCheckParticipants - mov r0, r4 - mov r1, r4 - mov r2, #0 - mov r3, #1 - bl BoostSpeedOneStage - add sp, sp, #4 - ldmia sp!, {r3, r4, pc} - .align 2, 0 -#ifndef JAPAN -_0231B0A0: .word 0x00000C3B -#endif - arm_func_end ActivateMotorDrive - - arm_func_start TryActivateFrisk -TryActivateFrisk: ; 0x0231B0A4 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #8 - mov r5, r0 - mov r4, r1 - bl EntityIsValid__0231B194 - cmp r0, #0 - beq _0231B184 - mov r0, r4 - bl EntityIsValid__0231B194 - cmp r0, #0 - beq _0231B184 - ldr r0, [r5, #0xb4] - ldr r6, [r4, #0xb4] - ldrb r0, [r0, #6] - cmp r0, #0 - bne _0231B184 - bl ov29_0232E80C - cmp r4, r0 - ldrneb r0, [r6, #6] - cmpne r0, #0 - beq _0231B184 - ldrsh r0, [r6, #0x66] - cmp r0, #0 - bne _0231B150 - ldrsh r0, [r6, #2] - add r1, sp, #0 - bl GetTreasureBoxChances - ldrsh r0, [sp, #4] - cmp r0, #0 - ldrlesh r0, [sp, #6] - cmple r0, #0 - ble _0231B184 - mov r0, r5 - bl ov29_022E4110 - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231B18C ; =0x00000C3D - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231B184 -_0231B150: - mov r0, r5 - bl ov29_022E4110 - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - add r1, r6, #0x62 - mov r0, #2 - bl PrepareItemForPrinting__02345728 - ldr r2, _0231B190 ; =0x00000C3C - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget -_0231B184: - add sp, sp, #8 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -#ifdef JAPAN -_0231B18C: .word 0x0000097C -_0231B190: .word 0x0000097B -#else -_0231B18C: .word 0x00000C3D -_0231B190: .word 0x00000C3C -#endif - arm_func_end TryActivateFrisk diff --git a/asm/overlay_29_023350FC.s b/asm/overlay_29_0233544C.s similarity index 86% rename from asm/overlay_29_023350FC.s rename to asm/overlay_29_0233544C.s index e773b82f..6388e51f 100644 --- a/asm/overlay_29_023350FC.s +++ b/asm/overlay_29_0233544C.s @@ -1,247 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_023350FC.inc" + .include "overlay_29_0233544C.inc" .text - arm_func_start ov29_023350FC -ov29_023350FC: ; 0x023350FC - stmdb sp!, {r3, lr} - mov r0, #0 - bl GetApparentWeather - bl GetWeatherColorTable - ldr r2, _0233516C ; =DUNGEON_PTR - mov r1, #0 -_02335114: - ldr r3, [r2] - ldrb ip, [r0, r1, lsl #2] - add r3, r3, r1, lsl #2 - add lr, r0, r1, lsl #2 - strb ip, [r3, #0x1e0] - ldr r3, [r2] - ldrb ip, [lr, #1] - add r3, r3, r1, lsl #2 - strb ip, [r3, #0x1e1] - ldr r3, [r2] - ldrb ip, [lr, #2] - add r3, r3, r1, lsl #2 - strb ip, [r3, #0x1e2] - ldr r3, [r2] - ldrb ip, [lr, #3] - add r3, r3, r1, lsl #2 - add r1, r1, #1 - strb ip, [r3, #0x1e3] - cmp r1, #0x100 - blt _02335114 - bl ov29_022DE608 - ldmia sp!, {r3, pc} - .align 2, 0 -_0233516C: .word DUNGEON_PTR - arm_func_end ov29_023350FC - - arm_func_start TryWeatherFormChange -TryWeatherFormChange: ; 0x02335170 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov r5, #0 - mov sl, r0 - mov r6, r5 - bl EntityIsValid__023350D8 - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - ldr r7, [sl, #0xb4] - mov r0, sl - ldrsh r4, [r7, #4] - ldrb r8, [r7, #0x5e] - ldrb sb, [r7, #0x5f] - bl CalcSpeedStageWrapper - mov r0, sl - mov r1, #0x25 - bl AbilityIsActiveVeneer - cmp r0, #0 - mov r0, sl - beq _023351E0 - bl GetApparentWeather - mov r1, #6 - mul r2, r0, r1 - ldr r1, _02335434 ; =CASTFORM_WEATHER_ATTRIBUTE_TABLE - mov r0, r5 - ldrb r1, [r1, r2] - strb r1, [r7, #0x5e] - strb r0, [r7, #0x5f] - b _02335220 -_023351E0: - bl Conversion2IsActive - cmp r0, #0 - ldreqb r0, [r7, #0xff] - cmpeq r0, #0 - ldreqb r0, [r7, #0xa9] - cmpeq r0, #0 - bne _02335220 - ldrsh r0, [r7, #2] - mov r1, r5 - bl GetType - strb r0, [r7, #0x5e] - ldrsh r0, [r7, #2] - mov r1, #1 - bl GetType - strb r0, [r7, #0x5f] - mov r6, #1 -_02335220: - ldrb r0, [r7, #0x5e] - cmp r8, r0 - ldreqb r0, [r7, #0x5f] - cmpeq sb, r0 - beq _0233523C - cmp r6, #0 - moveq r5, #1 -_0233523C: - ldrsh r1, [r7, #2] - ldr r0, _02335438 ; =0x0000017B - cmp r1, r0 - blt _02335258 - add r0, r0, #3 - cmp r1, r0 - ble _02335270 -_02335258: - ldr r0, _0233543C ; =0x000003D3 - cmp r1, r0 - blt _023352FC - add r0, r0, #3 - cmp r1, r0 - bgt _023352FC -_02335270: - mov r0, sl - mov r1, #0x25 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _02335298 - ldrsh r1, [r7, #2] - mov r0, sl - bl GetMonsterApparentId - strh r0, [r7, #4] - b _023352C0 -_02335298: - ldrsh r2, [r7, #2] - ldr r1, _02335438 ; =0x0000017B - cmp r2, r1 - blt _023352B8 - add r0, r1, #3 - cmp r2, r0 - strleh r1, [r7, #4] - ble _023352C0 -_023352B8: - ldr r0, _0233543C ; =0x000003D3 - strh r0, [r7, #4] -_023352C0: - ldrsh r0, [r7, #4] - cmp r0, r4 - beq _02335420 - ldrsh r0, [r7, #4] - bl DungeonGetSpriteIndex - strh r0, [sl, #0xa8] - mov r0, sl - bl GetIdleAnimationId - mov r1, r0 - mov r0, sl - bl ov29_02304830 - mov r0, sl - bl DetermineMonsterShadow - mov r5, #1 - b _02335420 -_023352FC: - cmp r1, #0x1cc - blt _02335310 - ldr r0, _02335440 ; =0x000001CD - cmp r1, r0 - ble _02335328 -_02335310: - ldr r0, _02335444 ; =0x00000424 - cmp r1, r0 - blt _02335420 - add r0, r0, #1 - cmp r1, r0 - bgt _02335420 -_02335328: - mov r0, sl - bl GetApparentWeather - cmp r0, #1 - ldrsh r1, [r7, #2] - bne _02335394 - cmp r1, #0x1cc - ldreq r0, _02335440 ; =0x000001CD - streqh r0, [r7, #4] - beq _0233535C - ldr r0, _02335444 ; =0x00000424 - cmp r1, r0 - addeq r0, r0, #1 - streqh r0, [r7, #4] -_0233535C: - ldrsh r2, [r7, #2] - ldr r0, _02335440 ; =0x000001CD - cmp r2, r0 - ldreqsh r1, [r7, #4] - cmpeq r1, #0x1cc - streqh r0, [r7, #4] - beq _023353F0 - ldr r1, _02335448 ; =0x00000425 - cmp r2, r1 - ldreqsh r2, [r7, #4] - subeq r0, r1, #1 - cmpeq r2, r0 - streqh r1, [r7, #4] - b _023353F0 -_02335394: - ldr r0, _02335440 ; =0x000001CD - cmp r1, r0 - moveq r0, #0x1cc - streqh r0, [r7, #4] - beq _023353B8 - add r0, r0, #0x258 - cmp r1, r0 - ldreq r0, _02335444 ; =0x00000424 - streqh r0, [r7, #4] -_023353B8: - ldrsh r2, [r7, #2] - cmp r2, #0x1cc - ldreqsh r1, [r7, #4] - ldreq r0, _02335440 ; =0x000001CD - cmpeq r1, r0 - moveq r0, #0x1cc - streqh r0, [r7, #4] - beq _023353F0 - ldr r1, _02335444 ; =0x00000424 - cmp r2, r1 - ldreqsh r2, [r7, #4] - addeq r0, r1, #1 - cmpeq r2, r0 - streqh r1, [r7, #4] -_023353F0: - ldrsh r0, [r7, #4] - cmp r0, r4 - beq _02335420 - ldrsh r0, [r7, #4] - bl DungeonGetSpriteIndex - strh r0, [sl, #0xa8] - mov r0, sl - bl GetIdleAnimationId - mov r1, r0 - mov r0, sl - bl ov29_02304830 - mov r5, #1 -_02335420: - cmp r5, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - mov r0, sl - bl ov29_022E65F4 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_02335434: .word CASTFORM_WEATHER_ATTRIBUTE_TABLE -_02335438: .word 0x0000017B -_0233543C: .word 0x000003D3 -_02335440: .word 0x000001CD -_02335444: .word 0x00000424 -_02335448: .word 0x00000425 - arm_func_end TryWeatherFormChange - arm_func_start ActivateSportCondition ActivateSportCondition: ; 0x0233544C stmdb sp!, {r3, lr} diff --git a/include/dungeon.h b/include/dungeon.h index 6d06a290..acea9103 100644 --- a/include/dungeon.h +++ b/include/dungeon.h @@ -111,6 +111,15 @@ struct item_spawn_weights { s16 unknown_2[0x40c]; }; +struct unk_022FBD24 { + // 0x3DCC: Appears to be a table that holds the statuses::statuses_unique_id value for + // the monsters. Maybe just for convenience to avoid loading it from every monster? + u32 monster_unique_id[20]; + // 0x3E1C: Appears to be be an index inside or length for + // dungeon::active_monsters_unique_statuses_ids. + u32 unique_id_index; +}; + // Dungeon state struct dungeon { u8 field_0x0; // 0x0: Initialized to 0x0. @@ -1213,12 +1222,7 @@ struct dungeon { // Species not on the floor have the value 1. u8 exp_yield_rankings[NUM_SPECIES]; #ifndef JAPAN - // 0x3DCC: Appears to be a table that holds the statuses::statuses_unique_id value for - // the monsters. Maybe just for convenience to avoid loading it from every monster? - u32 monster_unique_id[20]; - // 0x3E1C: Appears to be be an index inside or length for - // dungeon::active_monsters_unique_statuses_ids. - u32 unique_id_index; + struct unk_022FBD24 field_0x3dcc; #endif // 0x3E20: Number of valid monster spawn entries (see spawn_entries). int monster_spawn_entries_length; diff --git a/include/dungeon_logic_2.h b/include/dungeon_logic_2.h index aca94bcd..492905ba 100644 --- a/include/dungeon_logic_2.h +++ b/include/dungeon_logic_2.h @@ -5,5 +5,10 @@ // Returns a boolean indicating whether or not the given monster can throw items based on its monster ID. bool8 MonsterCanThrowItems(struct monster *monster); +bool8 ov29_02302388(struct entity *entity); +bool8 UpdateStateFlags(struct monster *monster, s32 flag, bool8 value); +bool8 IsProtectedFromNegativeStatus(struct entity *user, struct entity *target, bool8 log_message); +bool8 ov29_023024E0(struct entity *entity, bool8 check_blinded); +void AddExpSpecial(struct entity *attacker, struct entity *defender, s32 base_exp); #endif //PMDSKY_DUNGEON_LOGIC_2_H diff --git a/include/main_02055410.h b/include/main_02055410.h index 45154e58..0bcda1b6 100644 --- a/include/main_02055410.h +++ b/include/main_02055410.h @@ -3,8 +3,13 @@ #include "util.h" +struct ground_monster; + bool8 sub_02055410(int idx); bool8 sub_02055474(int idx); bool8 sub_020554D8(int idx); +bool8 IsMainCharacter(int idx); +struct ground_monster* GetTeamMember(s32 member_idx); +s16 GetRecruitMentryIdBySpecies(s16 species, s32 n); #endif diff --git a/include/main_02056294.h b/include/main_02056294.h index 5ef7b4af..845b5ae6 100644 --- a/include/main_02056294.h +++ b/include/main_02056294.h @@ -2,7 +2,14 @@ #define PMDSKY_MAIN_02056294_H #include "util.h" +#include "common.h" bool8 IsMonsterIdInNormalRange(s16 id); +bool8 sub_020562B8(int a); +void SetActiveTeam(enum team_id team); +void sub_02056318(u8 a); +u8 sub_0205633C(void); +bool32 sub_02056360(void); +struct team_member* GetActiveTeamMember(s32 roster_idx); #endif diff --git a/include/moves_3.h b/include/moves_3.h index 15386292..92029d00 100644 --- a/include/moves_3.h +++ b/include/moves_3.h @@ -4,6 +4,7 @@ #include "move.h" #include "util.h" #include "dungeon_mode.h" +#include "common.h" bool8 IsThawingMove(struct move *move); // Returns true if the given move can be used while the user is affected by Taunt, or false if the move cannot be used while taunted. @@ -15,6 +16,12 @@ s16 GetMoveBasePowerFromId(s32 move_id); bool32 IsMoveRangeStringUser(struct move *move); u8 *GetMoveMessageFromId(s32 move_id); s32 GetNbMoves(struct moves *moves); +s32 GetMovesetIdx__02013CAC(struct ground_move *moveset, enum move_id move_id); +bool8 IsReflectedByMagicCoat(enum move_id move_id); +bool8 CanBeSnatched(enum move_id move_id); +bool8 FailsWhileMuzzled(enum move_id move_id); +bool8 IsSoundMove(struct move *move); +bool8 IsRecoilMove(enum move_id move_id); #endif //PMDSKY_MOVES_3_H diff --git a/include/number_util.h b/include/number_util.h index c0e9b1ea..50c21c21 100644 --- a/include/number_util.h +++ b/include/number_util.h @@ -2,6 +2,7 @@ #define PMDSKY_NUMBER_UTIL_H #include "util.h" +#include "save.h" struct fixed_point sub_02050EBC(struct fixed_point a, struct fixed_point b); struct fixed_point SubFixedPoint(struct fixed_point a, struct fixed_point b); @@ -9,5 +10,9 @@ struct fixed_point sub_02050F78(struct fixed_point a, struct fixed_point b); struct fixed_point sub_02050FF8(s16 value); struct fixed_point BinToDecFixedPoint(struct fixed_point_64 *val); s32 CeilFixedPoint(struct fixed_point val_fp); +void sub_02051098(struct bitstream *stream, u16 *buf); +void sub_020510C0(struct bitstream *stream, u16 *buf); +void MtInit(u32 seed); +u32 MtNext(void); #endif //PMDSKY_NUMBER_UTIL_H diff --git a/include/overlay_29_022F0590.h b/include/overlay_29_022F0590.h index 3df35483..e16ad279 100644 --- a/include/overlay_29_022F0590.h +++ b/include/overlay_29_022F0590.h @@ -14,5 +14,8 @@ void ov29_022F05E4(void); s32 TalkToSecretBazaarNpcStandard(s32 a, struct entity* b, s32 c); s32 ov29_022F0618(s32 a, struct entity* b, s32 c, s32 d); s32 TalkToSecretBazaarNpcWithYesNoMenu(s32 a, struct entity* b, s32 c, s32 d); +void MakeTargetFaceUserAndIdle(struct entity *target, struct entity *user); +void ov29_022F067C(struct entity *user, struct entity *target, enum move_id move_id); +void ov29_022F0780(s32 message_id); #endif //PMDSKY_OVERLAY_29_022F0590_H diff --git a/include/overlay_29_022FBBEC.h b/include/overlay_29_022FBBEC.h index d8361e5d..97bd5119 100644 --- a/include/overlay_29_022FBBEC.h +++ b/include/overlay_29_022FBBEC.h @@ -4,5 +4,12 @@ #include "dungeon_mode.h" struct entity* FindMonsterWithBehavior(enum monster_behavior monster_behavior); +bool8 CountActiveMonsters(void); +bool8 ov29_022FBC94(s16 monster_id); +#ifndef JAPAN +void ov29_022FBD08(void); +bool8 ov29_022FBD24(struct entity *entity); +bool8 ov29_022FBD80(struct entity *entity); +#endif #endif //PMDSKY_OVERLAY_29_022FBBEC_H diff --git a/include/overlay_29_023350D8.h b/include/overlay_29_023350D8.h index a1aa5a9b..2419041e 100644 --- a/include/overlay_29_023350D8.h +++ b/include/overlay_29_023350D8.h @@ -5,5 +5,7 @@ // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__023350D8(struct entity *entity); +void ov29_023350FC(void); +void TryWeatherFormChange(struct entity *entity); #endif //PMDSKY_OVERLAY_29_023350D8_H diff --git a/include/special_move_types.h b/include/special_move_types.h index d98803ad..23bcacde 100644 --- a/include/special_move_types.h +++ b/include/special_move_types.h @@ -8,5 +8,9 @@ const struct natural_gift_item_info* GetEntityNaturalGiftInfo(struct entity* ent // Gets the current Weather Ball type for the given entity, based on the apparent weather. enum type_id GetEntityWeatherBallType(struct entity* entity); void UseMoveByMoveId(struct entity *entity, enum move_id move_id, bool8 add_move_if_not_exists); +void ov29_0231AFB4(void); +void ov29_0231B008(void); +void ActivateMotorDrive(struct entity* entity); +void TryActivateFrisk(struct entity* user, struct entity* target); #endif //PMDSKY_SPECIAL_MOVE_TYPES_H diff --git a/main.lsf b/main.lsf index f6f6c098..6382135a 100644 --- a/main.lsf +++ b/main.lsf @@ -110,7 +110,7 @@ Static main Object src/moves_4.o Object src/moves.o Object src/moves_3.o - Object asm/main_02013C30.o + Object asm/main_02013E54.o Object src/main_02014A4C.o Object asm/main_02014B1C.o Object src/main_02014CEC.o @@ -268,7 +268,6 @@ Static main Object src/main_020504A4.o Object asm/main_020504BC.o Object src/number_util.o - Object asm/main_02051098.o Object src/dungeon_recruitment_2.o Object src/main_020514CC.o Object asm/main_020515C4.o @@ -296,12 +295,11 @@ Static main Object src/main_02054DC4.o Object asm/main_02054E4C.o Object src/main_02055410.o - Object asm/main_02055528.o Object src/main_0205567C.o Object src/main_02055770.o Object asm/main_02055894.o Object src/main_02056294.o - Object asm/main_020562B8.o + Object asm/main_020563BC.o Object src/main_020564B0.o Object asm/main_02056504.o Object src/main_020568A4.o @@ -884,7 +882,7 @@ Overlay OVY_29 Object src/dungeon_logic_6.o Object asm/overlay_29_022EFBAC.o Object src/overlay_29_022F0590.o - Object asm/overlay_29_022F0654.o + Object asm/overlay_29_022F07BC.o Object src/overlay_29_022F0EDC.o Object asm/overlay_29_022F2B3C.o Object src/overlay_29_022F528C.o @@ -914,7 +912,6 @@ Overlay OVY_29 Object src/joined_at_checks.o Object asm/overlay_29_022FBB1C.o Object src/overlay_29_022FBBEC.o - Object asm/overlay_29_022FBC4C.o Object src/dungeon_logic_7.o Object asm/overlay_29_022FBE58.o Object src/overlay_29_022FC99C.o @@ -955,7 +952,6 @@ Overlay OVY_29 Object src/dungeon_pokemon_attributes_1.o Object src/dungeon_logic_5.o Object src/dungeon_logic_2.o - Object asm/overlay_29_02302388.o Object src/overlay_29_023026CC.o Object asm/overlay_29_023026FC.o Object src/overlay_29_02302A38.o @@ -1026,7 +1022,6 @@ Overlay OVY_29 Object src/overlay_29_0231ACAC.o Object asm/overlay_29_0231AD38.o Object src/special_move_types.o - Object asm/overlay_29_0231AFB4.o Object src/overlay_29_0231B194.o Object src/overlay_29_0231B318.o Object asm/overlay_29_0231B33C.o @@ -1198,7 +1193,7 @@ Overlay OVY_29 Object src/weather.o Object asm/overlay_29_02334D58.o Object src/overlay_29_023350D8.o - Object asm/overlay_29_023350FC.o + Object asm/overlay_29_0233544C.o Object src/dungeon_map_access.o Object src/fixed_room_data_1.o Object src/run_dungeon.o diff --git a/src/dungeon_ai_itcm.c b/src/dungeon_ai_itcm.c index a143c109..507143f9 100644 --- a/src/dungeon_ai_itcm.c +++ b/src/dungeon_ai_itcm.c @@ -27,6 +27,7 @@ #include "overlay_29_0231A9D4.h" #include "overlay_29_0231ACAC.h" #include "targeting.h" +#include "special_move_types.h" #ifdef SDK_ARM9 #include @@ -791,7 +792,6 @@ _01FFBD0C: #endif extern bool8 sub_01FFBF78(struct entity *pokemon, struct entity *target); -extern void ov29_0231B008(); void sub_01FFBD20(struct entity *monster, struct entity *target) { diff --git a/src/dungeon_ai_targeting.c b/src/dungeon_ai_targeting.c index 86ff6934..d7cac42e 100644 --- a/src/dungeon_ai_targeting.c +++ b/src/dungeon_ai_targeting.c @@ -1,7 +1,7 @@ #include "dungeon_ai_targeting.h" #include "util.h" +#include "dungeon_logic_2.h" -extern bool8 UpdateStateFlags(struct monster *info, s32 flag, bool8 value); extern void PlayEffectAnimation0x29(struct entity *entity); #include "dungeon_pokemon_attributes.h" diff --git a/src/dungeon_logic_2.c b/src/dungeon_logic_2.c index 1583f47f..a6920a15 100644 --- a/src/dungeon_logic_2.c +++ b/src/dungeon_logic_2.c @@ -1,7 +1,137 @@ #include "dungeon_logic_2.h" #include "main_0205283C.h" +#include "dungeon.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_statuses.h" +#include "dungeon_util_2.h" +#include "dungeon_util_static.h" +#include "exclusive_item.h" +#include "joined_at_checks.h" +#include "main_02001A54.h" +#include "overlay_29_022FFF28.h" +#include "overlay_29_023000E4.h" +#include "overlay_29_023026CC.h" +#include "overlay_29_02344AF8.h" +#include "overlay_29_0234B340.h" + +#ifdef JAPAN +#define NEGATIVE_STATUS_PROTECTION_LOG_MESSAGE 0x978 +#else +#define NEGATIVE_STATUS_PROTECTION_LOG_MESSAGE 0xc39 +#endif + +extern struct dungeon *DUNGEON_PTR[]; + +extern const s16 EXP_ELITE_EXP_BOOST; +extern const s16 WONDER_CHEST_EXP_BOOST; +extern const s16 MIRACLE_CHEST_EXP_BOOST; +extern const s16 EXCLUSIVE_ITEM_EXP_BOOST; + +extern bool8 LeafGuardIsActive(struct entity *user, struct entity *target, bool8 log_message); +extern bool8 ov29_02301A84(struct entity *user, struct entity *target, bool8 log_message); +extern bool8 GetExclusiveItemWithEffectFromBag(struct entity *, enum exclusive_item_effect_id effect_id, struct item *item); bool8 MonsterCanThrowItems(struct monster *monster) { return CanThrowItems(monster->id) ? TRUE : FALSE; } + +bool8 ov29_02302388(struct entity *entity) +{ + if (EntityIsValid__023000E4(entity) && + GetEntInfo(entity)->monster_behavior != BEHAVIOR_RESCUE_TARGET && + !IsExperienceLocked(GetEntInfo(entity))) + return TRUE; + return FALSE; +} + +bool8 UpdateStateFlags(struct monster *monster, s32 flag, bool8 value) +{ + if (monster->state_flags & flag) + monster->prev_state_flags |= flag; + else + monster->prev_state_flags &= ~flag; + + if (value) + monster->state_flags |= flag; + else + monster->state_flags &= ~flag; + + if (!(monster->prev_state_flags & flag) && (monster->state_flags & flag)) + return TRUE; + return FALSE; +} + +bool8 IsProtectedFromNegativeStatus(struct entity *user, struct entity *target, bool8 log_message) +{ + struct item item; + + if (LeafGuardIsActive(user, target, log_message)) + return TRUE; + + if (ExclusiveItemEffectIsActive__022FFF28(target, EXCLUSIVE_EFF_NO_STATUS)) { + if (log_message) { + SubstitutePlaceholderStringTags(0, target, 0); + GetExclusiveItemWithEffectFromBag(target, EXCLUSIVE_EFF_NO_STATUS, &item); + PrepareItemForPrinting__02345728(1, &item); + LogMessageByIdWithPopupCheckUserTarget(user, target, NEGATIVE_STATUS_PROTECTION_LOG_MESSAGE); + } + return TRUE; + } + + return ov29_02301A84(user, target, log_message) ? TRUE : FALSE; +} + +bool8 ov29_023024E0(struct entity *entity, bool8 check_blinded) +{ + if (!IqSkillIsEnabled(entity, IQ_NONTRAITOR)) { + if ((check_blinded && IsBlinded(entity, TRUE)) || + GetEntInfo(entity)->cringe_class_status.cringe == STATUS_CRINGE_CONFUSED || + GetEntInfo(entity)->cringe_class_status.cringe == STATUS_CRINGE_COWERING) + return TRUE; + } + + return FALSE; +} + +void AddExpSpecial(struct entity *attacker, struct entity *defender, s32 base_exp) +{ + struct monster *info = GetEntInfo(defender); + s32 total; + s32 gained; + + if (IsExperienceLocked(info)) + return; + + if (info->level == 100) { + if (base_exp > 0) + DUNGEON_PTR[0]->should_enemy_evolve = TRUE; + return; + } + + total = info->exp + base_exp; + + if (IqSkillIsEnabled(defender, IQ_EXP_ELITE)) + total += MultiplyByFixedPoint(base_exp << 8, (EXP_ELITE_EXP_BOOST << 8) / 100) >> 8; + + if (ItemIsActive__023026CC(defender, ITEM_WONDER_CHEST)) + total += MultiplyByFixedPoint(base_exp << 8, (WONDER_CHEST_EXP_BOOST << 8) / 100) >> 8; + + if (ItemIsActive__023026CC(defender, ITEM_MIRACLE_CHEST)) + total += MultiplyByFixedPoint(base_exp << 8, (MIRACLE_CHEST_EXP_BOOST << 8) / 100) >> 8; + + if (GetEntInfo(defender)->is_not_team_member + ? FALSE + : ExclusiveItemEffectFlagTest(GetEntInfo(defender)->exclusive_item_effect_flags, + EXCLUSIVE_EFF_EXP_BOOST)) + total += MultiplyByFixedPoint(base_exp << 8, (EXCLUSIVE_ITEM_EXP_BOOST << 8) / 100) >> 8; + + if (total >= 9999999) + total = 9999999; + + gained = total - info->exp; + if (gained != 0) { + info->unk_exp_tracker += gained; + DUNGEON_PTR[0]->should_enemy_evolve = TRUE; + } +} diff --git a/src/dungeon_recruitment.c b/src/dungeon_recruitment.c index 95d846a3..e6add580 100644 --- a/src/dungeon_recruitment.c +++ b/src/dungeon_recruitment.c @@ -26,6 +26,7 @@ #include "overlay_29_0234BA54.h" #include "position_util.h" #include "overlay_29_0234B104.h" +#include "main_02056294.h" struct unk_0230E064 { s16 field_0x0; @@ -52,7 +53,6 @@ void SetPreprocessorArgsStringToName(struct preprocessor_args *preprocessor_args u32 param_4, u8 name_type); void HandleFaint(struct entity *fainted_entity, s32 damage_source, struct entity *killer); -struct team_member *GetActiveTeamMember(s32 roster_idx); void GetRecoloredTeamMemberName(char *dst, struct team_member *team_member); void ov29_0234D630(void); void ov29_0234D838(void); diff --git a/src/main_02055410.c b/src/main_02055410.c index cef144d9..34dcbd31 100644 --- a/src/main_02055410.c +++ b/src/main_02055410.c @@ -42,3 +42,44 @@ bool8 sub_020554D8(int idx) } return 0; } + +bool8 IsMainCharacter(int idx) +{ + bool8 valid = (TEAM_MEMBER_TABLE_PTR->members[(s16)idx].is_valid & 1) != 0; + if (valid && idx < 5) { + if (GetGameMode() == GAME_MODE_SPECIAL_EPISODE) { + if (idx != 2 && idx != 3 && idx != 4) { + return 0; + } + } else if (idx != 0 && idx != 1) { + return 0; + } + return 1; + } + return 0; +} + +struct ground_monster *GetTeamMember(s32 member_idx) +{ + if (member_idx == -1) { + return NULL; + } + return &TEAM_MEMBER_TABLE_PTR->members[(s16)member_idx]; +} + +s16 GetRecruitMentryIdBySpecies(s16 species, s32 n) +{ + struct ground_monster *m = &TEAM_MEMBER_TABLE_PTR->members[5]; + s32 count = 0; + s32 i; + for (i = 5; i < MAX_GROUND_TEAM_MEMBERS; i++, m++) { + bool8 valid = (m->is_valid & 1) != 0; + if (valid && m->id == species) { + if (count == n) { + return i; + } + count++; + } + } + return -1; +} diff --git a/src/main_02056294.c b/src/main_02056294.c index 9aeddb2c..7659bec3 100644 --- a/src/main_02056294.c +++ b/src/main_02056294.c @@ -1,4 +1,7 @@ #include "main_02056294.h" +#include "common.h" + +extern struct team_member_table *TEAM_MEMBER_TABLE_PTR; bool8 IsMonsterIdInNormalRange(s16 id) { @@ -7,3 +10,42 @@ bool8 IsMonsterIdInNormalRange(s16 id) } return FALSE; } + +bool8 sub_020562B8(int a) +{ + return a < 0; +} + +void SetActiveTeam(enum team_id team) +{ + TEAM_MEMBER_TABLE_PTR->active_team = team; + TEAM_MEMBER_TABLE_PTR->active_roster = TEAM_MEMBER_TABLE_PTR->active_team_rosters[team]; + TEAM_MEMBER_TABLE_PTR->active_roster_member_idxs = + TEAM_MEMBER_TABLE_PTR->active_team_roster_member_idxs[team]; +} + +void sub_02056318(u8 a) +{ + struct team_member_table *t = TEAM_MEMBER_TABLE_PTR; + (&t->field_0x9874)[t->active_team] = a; +} + +u8 sub_0205633C(void) +{ + struct team_member_table *t = TEAM_MEMBER_TABLE_PTR; + return (&t->field_0x9874)[t->active_team]; +} + +bool32 sub_02056360(void) +{ + struct team_member_table *t = TEAM_MEMBER_TABLE_PTR; + return t->field_0x9874 != 0 || t->field_0x9875 != 0; +} + +struct team_member* GetActiveTeamMember(s32 roster_idx) +{ + if (roster_idx == -1) { + return NULL; + } + return &TEAM_MEMBER_TABLE_PTR->active_roster[(s16)roster_idx]; +} diff --git a/src/main_0205A288.c b/src/main_0205A288.c index ceb66b2e..30e7f21d 100644 --- a/src/main_0205A288.c +++ b/src/main_0205A288.c @@ -1,7 +1,7 @@ #include "main_0205A288.h" #include "common.h" +#include "main_02055410.h" -extern struct ground_monster* GetTeamMember(s32 member_idx); extern void sub_0205A340(s16 *ptr, struct ground_monster *data, s32 monster_id); extern const u8* GetNameString(enum monster_id monster_id); extern void StrncpyName(char *dest, const char *src, u32 n); diff --git a/src/main_0205B008.c b/src/main_0205B008.c index 26f5358c..5e4fc2b3 100644 --- a/src/main_0205B008.c +++ b/src/main_0205B008.c @@ -1,5 +1,6 @@ #include "main_0205B008.h" #include "common.h" +#include "main_02056294.h" extern u8 _020A34D2; @@ -7,7 +8,6 @@ extern s32 sub_02055894(u32 b); extern s32 GetActiveRosterIndex(s32 member_idx); extern void sub_02053224(struct team_member *team_member, s32 member_idx, s32 arg2); extern bool8 sub_020564B0(s32 member_idx); -extern struct team_member* GetActiveTeamMember(s32 roster_idx); extern void CreateMonsterSummaryFromTeamMember(struct monster_summary *monster_summary, struct team_member *team_member, bool8 is_leader); extern void sub_0205B39C(void *p0, void *p1); diff --git a/src/main_0205D11C.c b/src/main_0205D11C.c index caa1b942..e85ac1dd 100644 --- a/src/main_0205D11C.c +++ b/src/main_0205D11C.c @@ -14,6 +14,7 @@ #include "main_0205E288.h" #include "dungeon_recruitment_2.h" #include "main_020514CC.h" +#include "number_util.h" extern u8 _020A39C0; extern u8 _020A39D4; @@ -34,7 +35,6 @@ extern s32 GetAllPossibleMonsters(s16 **out); extern u8 GetMissionSpecificFixedRoom(enum mission_type, u32); extern bool8 IsAvailableItem(s16 item_id); extern void *LoadMissionTemplates(void); -extern s32 MtNext(void); extern void RollRandomItemReward(struct dungeon_floor_pair *, enum mission_type, s16 *out); extern void sub_02062900(u16, s16 *, void *out); extern bool8 sub_02062C4C(s32, u8 *, struct dungeon_floor_pair *, s32); diff --git a/src/move_orb_effects.c b/src/move_orb_effects.c index 4ff10e51..90993d62 100644 --- a/src/move_orb_effects.c +++ b/src/move_orb_effects.c @@ -12,6 +12,7 @@ #include "dungeon_util_2.h" #include "overlay_29_022E3F20.h" #include "overlay_29_0234B340.h" +#include "dungeon_logic_2.h" extern u8* AllocateTemp1024ByteBufferFromPool(void); extern void CopyStringFromId(u8* buf, u32 string_id); @@ -33,7 +34,6 @@ extern void PlayParalysisEffect(struct entity *entity); extern void PlaySpeedUpEffect(struct entity *entity); extern void PlaySpeedDownEffect(struct entity *entity); extern fx32_8 MultiplyByFixedPoint(fx32_8 x, fx32_8 mult_fp); -extern bool8 IsProtectedFromNegativeStatus(struct entity *user ,struct entity *target, bool8 log_message); extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 log_message); extern void TryActivateSteadfast(struct entity *attacker, struct entity *defender); extern void TryActivateQuickFeet(struct entity *attacker ,struct entity *defender); diff --git a/src/moves_3.c b/src/moves_3.c index 42c4ea99..ecb757e1 100644 --- a/src/moves_3.c +++ b/src/moves_3.c @@ -2,6 +2,8 @@ #include "move_data.h" #include "main_0202593C.h" +extern u16 RECOIL_MOVE_LIST[]; + extern struct move_data_table_outer DUNGEON_MOVE_TABLES; bool8 IsThawingMove(struct move *move) @@ -85,3 +87,85 @@ s32 GetNbMoves(struct moves *moves) } return num_moves; } + +s32 GetMovesetIdx__02013CAC(struct ground_move *moveset, enum move_id move_id) +{ + s32 i; + + for (i = 0; i < 4; i++) { + if (GET_FLAG(moveset[i].flags0, MOVE_FLAG_EXISTS)) { + if (move_id == moveset[i].id) { + return i; + } + } + } + return -1; +} + +bool8 IsReflectedByMagicCoat(enum move_id move_id) +{ + return DUNGEON_MOVE_TABLES.moves->moves[move_id].reflected_by_magic_coat; +} + +bool8 CanBeSnatched(enum move_id move_id) +{ + return DUNGEON_MOVE_TABLES.moves->moves[move_id].can_be_snatched; +} + +bool8 FailsWhileMuzzled(enum move_id move_id) +{ + return DUNGEON_MOVE_TABLES.moves->moves[move_id].fails_while_muzzled; +} + +bool8 IsSoundMove(struct move *move) +{ + enum move_id id = move->id; + + if (id == MOVE_GROWL) { + return TRUE; + } + if (id == MOVE_ROAR) { + return TRUE; + } + if (id == MOVE_METAL_SOUND) { + return TRUE; + } + if (id == MOVE_SING) { + return TRUE; + } + if (id == MOVE_GRASSWHISTLE) { + return TRUE; + } + if (id == MOVE_SUPERSONIC) { + return TRUE; + } + if (id == MOVE_PERISH_SONG) { + return TRUE; + } + if (id == MOVE_SCREECH) { + return TRUE; + } + if (id == MOVE_HYPER_VOICE) { + return TRUE; + } + if (id == MOVE_SNORE) { + return TRUE; + } + if (id == MOVE_HEAL_BELL) { + return TRUE; + } + if (id == MOVE_BUG_BUZZ) { + return TRUE; + } + return id == MOVE_CHATTER; +} + +bool8 IsRecoilMove(enum move_id move_id) +{ + for (s16 i = 0; RECOIL_MOVE_LIST[i] != 0; i++) { + if (RECOIL_MOVE_LIST[i] == move_id) { + return TRUE; + } + } + return FALSE; +} diff --git a/src/number_util.c b/src/number_util.c index 78a66153..fb5909e2 100644 --- a/src/number_util.c +++ b/src/number_util.c @@ -1,5 +1,12 @@ #include "number_util.h" +extern void CopyBitsTo(struct bitstream *stream, void *buf_write, s32 nbits); +extern void CopyBitsFrom(struct bitstream *stream, void *buf_read, s32 nbits); + +extern s32 MT_TABLE; +extern u32 _020AFF80[2]; +extern u32 _020AFF88[624]; + struct fixed_point sub_02050EBC(struct fixed_point a, struct fixed_point b) { a.fractional += b.fractional; @@ -81,3 +88,62 @@ s32 CeilFixedPoint(struct fixed_point val_fp) return val_fp.integer; } } + +void sub_02051098(struct bitstream *stream, u16 *buf) +{ + CopyBitsFrom(stream, buf, 16); + CopyBitsFrom(stream, buf + 1, 16); +} + +void sub_020510C0(struct bitstream *stream, u16 *buf) +{ + CopyBitsTo(stream, buf, 16); + CopyBitsTo(stream, buf + 1, 16); +} + +void MtInit(u32 seed) +{ + _020AFF88[0] = seed; + for (MT_TABLE = 1; MT_TABLE < 624; MT_TABLE++) + { + _020AFF88[MT_TABLE] = 1812433253 * (_020AFF88[MT_TABLE - 1] ^ (_020AFF88[MT_TABLE - 1] >> 30)) + MT_TABLE; + } +} + +u32 MtNext(void) +{ + u32 y; + s32 kk; + + if (MT_TABLE >= 624) + { + if (MT_TABLE == 625) + { + MtInit(5489); + } + + for (kk = 0; kk < 227; kk++) + { + y = (_020AFF88[kk] & 0x80000000) | (_020AFF88[kk + 1] & 0x7FFFFFFF); + _020AFF88[kk] = _020AFF88[kk + 397] ^ (y >> 1) ^ _020AFF80[y & 1]; + } + for (; kk < 623; kk++) + { + y = (_020AFF88[kk] & 0x80000000) | (_020AFF88[kk + 1] & 0x7FFFFFFF); + _020AFF88[kk] = _020AFF88[kk - 227] ^ (y >> 1) ^ _020AFF80[y & 1]; + } + y = (_020AFF88[623] & 0x80000000) | (_020AFF88[0] & 0x7FFFFFFF); + _020AFF88[623] = _020AFF88[396] ^ (y >> 1) ^ _020AFF80[y & 1]; + + MT_TABLE = 0; + } + + y = _020AFF88[MT_TABLE++]; + + y ^= y >> 11; + y ^= (y << 7) & 0x9D2C5680; + y ^= (y << 15) & 0xEFC60000; + y ^= y >> 18; + + return y; +} diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index 1c892152..f8dc7c19 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -27,6 +27,8 @@ #include "main_020502B0.h" #include "main_02026174.h" #include "main_0202B558.h" +#include "main_02055410.h" +#include "main_02056294.h" extern void sub_02056094(char *dst, struct ground_monster *ground_monster, bool8 is_leader); @@ -111,9 +113,8 @@ extern s32 ov11_02322D88; extern u8 ov11_02322DB0[]; extern void CloseScrollBox(s8); extern void CloseTextBox2(s8); extern u8 CreateParentMenuFromStringIds(void *, u32, void *, void *); extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateSimpleMenuFromStringIds(void *, s32, s32, void *, s32); extern s8 CreateTextBox(void *, void *); -extern struct team_member *GetActiveTeamMember(s32 roster_idx); extern void GetPressedButtons(u32, u16 *); -extern s32 GetSimpleMenuResult__0202AEA4(s8);extern struct ground_monster *GetTeamMember(s32 member_idx); +extern s32 GetSimpleMenuResult__0202AEA4(s8); extern void InitPreprocessorArgs(struct preprocessor_args *); extern s32 IsScrollBoxActive(s8); extern void ShowDialogueBox(s8); extern void ShowStringIdInDialogueBox(s8, s32, s32, void *); extern void ov11_022DC504(void); extern u8 *strcpy(u8 *dest, const u8 *src); diff --git a/src/overlay_29_022F0590.c b/src/overlay_29_022F0590.c index 56921c43..c0296927 100644 --- a/src/overlay_29_022F0590.c +++ b/src/overlay_29_022F0590.c @@ -3,6 +3,11 @@ #include "dungeon.h" #include "main_0201D198.h" +#include "dg_uty.h" +#include "overlay_29_0234B024.h" +#include "overlay_29_0234B104.h" +#include "overlay_29_0234BA54.h" +#include "position_util.h" void UnfreezeAnim(struct entity *entity) { struct monster *monster = entity->info; @@ -93,3 +98,74 @@ s32 TalkToSecretBazaarNpcWithYesNoMenu(s32 a, struct entity* b, s32 c, s32 d) return result; } + +extern void MakeMonsterIdleInDirection2(struct entity *entity, u8 direction); +extern void ov29_02322DDC(struct entity *user, struct move *move, char *message, + struct entity **targets, s32 param_5, s32 param_6); +extern void AnimationDelayOrSomething(s32 param_1); +extern void ExecuteMoveEffect(struct entity **targets, struct entity *user, + struct move *move, s32 param_4, s32 param_5); +extern void ov29_022E81F8(void); +extern s32 TryPointCameraToMonster(struct entity *entity, s32 param_2, s32 param_3); +extern void ov29_0234D690(s32 message_id, struct preprocessor_args *args, + s32 param_3, s32 param_4, u8 param_5); +extern void ov29_0234D650(void); + +void MakeTargetFaceUserAndIdle(struct entity *target, struct entity *user) +{ + MakeMonsterIdleInDirection2(target, + GetDirectionTowardsPosition(&target->pos, &user->pos)); +} + +void ov29_022F067C(struct entity *user, struct entity *target, enum move_id move_id) +{ + struct move move; + struct entity *targets[5]; + s32 i; + s32 n; + + if (target == NULL) { + n = 0; + for (i = 0; i < 4; i++) { + struct entity *entity = DUNGEON_PTR[0]->monster_slot_ptrs[i]; + if (EntityIsValid__022F0590(entity)) { + targets[n] = entity; + n++; + } + } + if (n < 4) { + targets[n] = NULL; + } else if (n == 4) { + targets[4] = NULL; + } + } else { + targets[0] = target; + targets[1] = NULL; + } + + move.flags0 = 0; + move.flags2 = 0; + move.id = (enum move_id)0; + move.pp = 0; + move.ginseng = 0; + move.flags0 = 1; + move.flags2 = 0; + move.id = move_id; + move.pp = 1; + move.ginseng = 0; + + ov29_02322DDC(user, &move, NULL, targets, 0, 1); + AnimationDelayOrSomething(1); + ExecuteMoveEffect(targets, user, &move, 0, 0); + ov29_022E81F8(); + WaitUntilAlertBoxPauseIsOver(10); + ov29_0234B1A4(0); + TryPointCameraToMonster(GetLeader(), 1, 1); +} + +void ov29_022F0780(s32 message_id) +{ + ov29_0234D668(); + ov29_0234D690(message_id, GetMessageLogPreprocessorArgs(), 0, 0, 1); + ov29_0234D650(); +} diff --git a/src/overlay_29_022FBBEC.c b/src/overlay_29_022FBBEC.c index bbc00357..fd09a1b2 100644 --- a/src/overlay_29_022FBBEC.c +++ b/src/overlay_29_022FBBEC.c @@ -2,6 +2,8 @@ #include "dungeon.h" #include "dungeon_util_static.h" #include "overlay_29_022F7364.h" +#include "main_020527A8.h" +#include "overlay_29_022F9720.h" extern struct dungeon *DUNGEON_PTR[]; @@ -15,3 +17,69 @@ struct entity* FindMonsterWithBehavior(enum monster_behavior monster_behavior) } return NULL; } + +bool8 CountActiveMonsters(void) +{ + s32 i; + + for (i = 0; i < MAX_TEAM_MEMBERS; i++) + { + if (!EntityIsValid__022F7364(DUNGEON_PTR[0]->monster_slots.party_members[i])) + return TRUE; + } + return FALSE; +} + +bool8 ov29_022FBC94(s16 monster_id) +{ + s32 total = GetBodySize(monster_id); + s32 i; + + for (i = 0; i < MAX_TEAM_MEMBERS; i++) + { + if (EntityIsValid__022F7364(DUNGEON_PTR[0]->monster_slots.party_members[i])) + total += GetBodySize(GetEntInfo(DUNGEON_PTR[0]->monster_slots.party_members[i])->id); + } + return total <= 6; +} + +#ifndef JAPAN +void ov29_022FBD08(void) +{ + DUNGEON_PTR[0]->field_0x3dcc.unique_id_index = 0; +} + +bool8 ov29_022FBD24(struct entity *entity) +{ + struct unk_022FBD24 *p; + + if (!IsMonster__022F9720(entity)) + return FALSE; + + p = &DUNGEON_PTR[0]->field_0x3dcc; + if (p->unique_id_index == 20) + return FALSE; + + p->monster_unique_id[p->unique_id_index] = GetEntInfo(entity)->unique_id; + p->unique_id_index++; + return TRUE; +} + +bool8 ov29_022FBD80(struct entity *entity) +{ + if (IsMonster__022F9720(entity)) + { + struct unk_022FBD24 *p = &DUNGEON_PTR[0]->field_0x3dcc; + u32 unique_id = GetEntInfo(entity)->unique_id; + s32 i; + s32 n = p->unique_id_index; + + for (i = 0; i < n; i++) + { + if (unique_id == p->monster_unique_id[i]) + return TRUE; + } + } + return FALSE; +} +#endif diff --git a/src/overlay_29_023000E4.c b/src/overlay_29_023000E4.c index 6e3363e8..539dfe32 100644 --- a/src/overlay_29_023000E4.c +++ b/src/overlay_29_023000E4.c @@ -1,5 +1,6 @@ #include "overlay_29_023000E4.h" #include "dungeon_util_static.h" +#include "main_02056294.h" extern struct dungeon *DUNGEON_PTR[]; @@ -26,7 +27,6 @@ extern void GetNameWithGender(char *dst, s16 monster_id, char color_id); extern struct ground_monster *GetExplorerMazeMonster(u8 entry_number); extern void GetRecoloredGroundMonsterName(char *dst, struct ground_monster *ground_monster, u8 unk); extern void GetRecoloredTeamMemberName(char *dst, struct team_member *team_member); -extern struct team_member *GetActiveTeamMember(int roster_idx); void GetMonsterName(char *buffer, struct monster *target_info) { #ifndef JAPAN diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index 0da3c560..58bbced1 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -58,6 +58,10 @@ #include "overlay_29_0230F8AC.h" #include "overlay_29_0231EDD8.h" #include "overlay_29_0234B104.h" +#include "dungeon_logic_2.h" +#include "main_02056294.h" +#include "overlay_29_022FBBEC.h" +#include "special_move_types.h" struct unk_023535DC { u8 field_0x0; @@ -78,7 +82,6 @@ struct unk_022C593C { }; extern const struct StatIndex ATK_STAT_IDX; -extern void ActivateMotorDrive(struct entity* entity); extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); extern bool8 IsEitherMonsterInvalid(struct entity *a, struct entity *b); extern void ResetDamageData(struct unk_02308FE0 *damage_data); @@ -102,7 +105,6 @@ extern s16 ov10_022C45B4; extern s16 ov10_022C45C0; extern s16 ov10_022C4638; extern s16 ov10_022C467C; -extern void AddExpSpecial(struct entity* attacker, struct entity* defender, s32 base_exp); extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); extern void ChangeMonsterAnimationToIdle(struct entity* monster, enum direction_id direction); extern void DisplayAnimatedNumbers(s32 amount, struct entity *entity, bool8 display_sign, s32 number_color); @@ -111,7 +113,6 @@ extern int EndLeechSeedStatusForAllTargets(); extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity* user, struct entity* target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); extern void FillRecruitInfo(void *recruit_info, struct entity *monster); extern void FreeOtherWrappedMonsters(u32 unique_id); -extern struct team_member* GetActiveTeamMember(s32 roster_idx); extern s32 GetIdleAnimationId(struct entity *entity); extern void HandleFaint(struct entity *fainted_entity, s32 damage_source, struct entity *killer); extern bool8 IsMonsterIdInNormalRangeVeneer(enum monster_id monster_id); @@ -134,10 +135,8 @@ extern int ov29_022E5478(); extern int ov29_022E550C(); extern void ov29_022E81F8(void); extern void ov29_022EA370(s32 a, s32 b); -extern int ov29_022F0780(); extern int ov29_022F9AF4(); extern int ov29_022FB98C(); -extern int ov29_022FBD24(); extern int ov29_02303E0C(); extern int ov29_02304830(); extern int ov29_02307C48(); diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c index ff0fafd6..84b7c9fc 100644 --- a/src/overlay_29_0230BBAC.c +++ b/src/overlay_29_0230BBAC.c @@ -29,13 +29,14 @@ #include "overlay_29_0234B340.h" #include "main_0200224C.h" #include "overlay_29_0231E9F0.h" +#include "dungeon_logic_2.h" +#include "moves_3.h" extern struct dungeon *DUNGEON_PTR; extern u8 GetMonsterGenderVeneer(s16 monster_id); extern u8 ExclusiveItemOffenseBoost(struct entity *entity, s32 idx); extern u8 ExclusiveItemDefenseBoost(struct entity *entity, s32 idx); extern s32 FixedPoint64ToInt(struct fixed_point_64 *x); -extern int IsRecoilMove(enum move_id move_id); extern void PlayEffectAnimation0x1A9__022E6130(struct entity *entity); extern void PlayEffectAnimation0x1A9__022E617C(struct entity *entity); extern void PlayEffectAnimation0x18E(struct entity *entity); @@ -44,7 +45,6 @@ extern bool8 FixedPoint64CmpLt(const struct fixed_point_64 *a, const struct fixe extern void DivideFixedPoint64(struct fixed_point_64 *out, struct fixed_point_64 *a, struct fixed_point_64 *b); extern void ResetDamageCalcDiagnostics(void); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); -extern bool8 UpdateStateFlags(struct monster *info, s32 flag, bool8 value); extern void ResetDamageData(struct unk_02308FE0 *damage_data); extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); extern const u8 ov29_02352984[]; diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index a15cdca9..c148f75f 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -28,6 +28,7 @@ #include "overlay_29_022E4338.h" #include "overlay_29_0231B194.h" #include "overlay_29_0234B104.h" +#include "overlay_29_023350D8.h" extern s16 ov10_022C4BE4[20]; extern void ov29_0230FB30(struct entity *entity); @@ -76,7 +77,6 @@ extern void ov29_022F42F8(struct entity *entity); extern void EndMagnetRiseStatus(struct entity *user, struct entity *target); extern void ov29_022EC62C(struct entity *entity); extern void ov29_022FB718(struct entity *entity); -extern void TryWeatherFormChange(struct entity *entity); extern s32 EndNegativeStatusCondition(struct entity *user, struct entity *target, bool8 a, bool8 b, bool8 c); extern s32 DisplayActions(s32 a); extern s32 ov29_02322374(struct entity *entity, s32 a, s32 b, s32 c, s32 d, struct move *move); diff --git a/src/overlay_29_023350D8.c b/src/overlay_29_023350D8.c index cdd6e191..c68850bf 100644 --- a/src/overlay_29_023350D8.c +++ b/src/overlay_29_023350D8.c @@ -1,5 +1,30 @@ #include "overlay_29_023350D8.h" #include "dungeon_util_static.h" +#include "dungeon_pokemon_attributes.h" +#include "inflict_status.h" +#include "main_0205283C.h" +#include "overlay_29_022F7364.h" +#include "overlay_29_022FFF28.h" +#include "weather.h" + +extern struct dungeon *DUNGEON_PTR; + +struct unk_022C4C6C { + enum type_id field_0x0; + u8 field_0x1; + s16 field_0x2; + s16 field_0x4; +}; + +extern struct unk_022C4C6C CASTFORM_WEATHER_ATTRIBUTE_TABLE[]; + +extern struct rgba *GetWeatherColorTable(enum weather_id weather); +extern void ov29_022DE608(void); +extern s16 GetMonsterApparentId(struct entity *entity, s16 monster_id); +extern s32 GetIdleAnimationId(struct entity *entity); +extern void ov29_02304830(struct entity *entity, s32 animation_id); +extern void DetermineMonsterShadow(struct entity *entity); +extern void ov29_022E65F4(struct entity *entity); bool8 EntityIsValid__023350D8(struct entity *entity) { @@ -8,3 +33,112 @@ bool8 EntityIsValid__023350D8(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +void ov29_023350FC(void) +{ + struct rgba *colors; + s32 i; + + colors = GetWeatherColorTable(GetApparentWeather(NULL)); + for (i = 0; i < 256; i++) { + DUNGEON_PTR->color_table[i].r = colors[i].r; + DUNGEON_PTR->color_table[i].b = colors[i].b; + DUNGEON_PTR->color_table[i].g = colors[i].g; + DUNGEON_PTR->color_table[i].a = colors[i].a; + } + ov29_022DE608(); +} + +void TryWeatherFormChange(struct entity *entity) +{ + const struct monster *cmonster; + s16 prev_apparent_id; + bool8 changed; + bool8 retyped; + struct monster *monster; + enum type_id prev_type0; + enum type_id prev_type1; + + changed = FALSE; + retyped = FALSE; + if (!EntityIsValid__023350D8(entity)) + return; + + monster = entity->info; + cmonster = monster; + prev_apparent_id = monster->apparent_id; + prev_type0 = monster->types[0]; + prev_type1 = monster->types[1]; + CalcSpeedStageWrapper(entity); + + if (AbilityIsActiveVeneer(entity, ABILITY_FORECAST)) { + monster->types[0] = + CASTFORM_WEATHER_ATTRIBUTE_TABLE[GetApparentWeather(entity)].field_0x0; + monster->types[1] = TYPE_NONE; + } else if (!Conversion2IsActive(entity) && !monster->type_changed && !monster->roost) { + monster->types[0] = GetType(monster->id, 0); + monster->types[1] = GetType(monster->id, 1); + retyped = TRUE; + } + + if (prev_type0 != monster->types[0] || prev_type1 != monster->types[1]) { + if (!retyped) + changed = TRUE; + } + + if ((monster->id >= MONSTER_CASTFORM_NORMAL && monster->id <= MONSTER_CASTFORM_RAINY) || + (monster->id >= MONSTER_CASTFORM_NORMAL_SECONDARY && + monster->id <= MONSTER_CASTFORM_RAINY_SECONDARY)) { + if (AbilityIsActiveVeneer(entity, ABILITY_FORECAST)) { + monster->apparent_id = GetMonsterApparentId(entity, monster->id); + } else if (monster->id >= MONSTER_CASTFORM_NORMAL && + monster->id <= MONSTER_CASTFORM_RAINY) { + monster->apparent_id = MONSTER_CASTFORM_NORMAL; + } else { + monster->apparent_id = MONSTER_CASTFORM_NORMAL_SECONDARY; + } + if (cmonster->apparent_id != prev_apparent_id) { + entity->sprite_index = DungeonGetSpriteIndex(monster->apparent_id); + ov29_02304830(entity, GetIdleAnimationId(entity)); + DetermineMonsterShadow(entity); + changed = TRUE; + } + } else if ((monster->id >= MONSTER_CHERRIM_OVERCAST && + monster->id <= MONSTER_CHERRIM_SUNSHINE) || + (monster->id >= MONSTER_CHERRIM_OVERCAST_SECONDARY && + monster->id <= MONSTER_CHERRIM_SUNSHINE_SECONDARY)) { + if (GetApparentWeather(entity) == WEATHER_SUNNY) { + if (monster->id == MONSTER_CHERRIM_OVERCAST) + monster->apparent_id = MONSTER_CHERRIM_SUNSHINE; + else if (monster->id == MONSTER_CHERRIM_OVERCAST_SECONDARY) + monster->apparent_id = MONSTER_CHERRIM_SUNSHINE_SECONDARY; + + if (monster->id == MONSTER_CHERRIM_SUNSHINE && + monster->apparent_id == MONSTER_CHERRIM_OVERCAST) + monster->apparent_id = MONSTER_CHERRIM_SUNSHINE; + else if (monster->id == MONSTER_CHERRIM_SUNSHINE_SECONDARY && + monster->apparent_id == MONSTER_CHERRIM_OVERCAST_SECONDARY) + monster->apparent_id = MONSTER_CHERRIM_SUNSHINE_SECONDARY; + } else { + if (monster->id == MONSTER_CHERRIM_SUNSHINE) + monster->apparent_id = MONSTER_CHERRIM_OVERCAST; + else if (monster->id == MONSTER_CHERRIM_SUNSHINE_SECONDARY) + monster->apparent_id = MONSTER_CHERRIM_OVERCAST_SECONDARY; + + if (monster->id == MONSTER_CHERRIM_OVERCAST && + monster->apparent_id == MONSTER_CHERRIM_SUNSHINE) + monster->apparent_id = MONSTER_CHERRIM_OVERCAST; + else if (monster->id == MONSTER_CHERRIM_OVERCAST_SECONDARY && + monster->apparent_id == MONSTER_CHERRIM_SUNSHINE_SECONDARY) + monster->apparent_id = MONSTER_CHERRIM_OVERCAST_SECONDARY; + } + if (cmonster->apparent_id != prev_apparent_id) { + entity->sprite_index = DungeonGetSpriteIndex(monster->apparent_id); + ov29_02304830(entity, GetIdleAnimationId(entity)); + changed = TRUE; + } + } + + if (changed) + ov29_022E65F4(entity); +} diff --git a/src/special_move_types.c b/src/special_move_types.c index 2d00ecac..ed830287 100644 --- a/src/special_move_types.c +++ b/src/special_move_types.c @@ -6,6 +6,28 @@ #include "overlay_29_0231A9D4.h" #include "overlay_29_022FBA54.h" #include "weather.h" +#include "dungeon_util_2.h" +#include "move_orb_effects.h" +#include "overlay_29_022E406C.h" +#include "overlay_29_0231B194.h" +#include "overlay_29_02344AF8.h" +#include "overlay_29_0234B104.h" +#include "overlay_29_0234B340.h" + +extern struct dungeon *DUNGEON_PTR[2]; + +extern void GetTreasureBoxChances(s16 monster_id, s16 *chances); +extern struct entity *ov29_0232E80C(void); + +#ifdef JAPAN +#define MESSAGE_C3B 0x97A +#define MESSAGE_C3C 0x97B +#define MESSAGE_C3D 0x97C +#else +#define MESSAGE_C3B 0xC3B +#define MESSAGE_C3C 0xC3C +#define MESSAGE_C3D 0xC3D +#endif extern void UseMove(struct entity*, s16, s32, s32, s32); @@ -61,3 +83,71 @@ void UseMoveByMoveId(struct entity *entity, enum move_id move_id, bool8 add_move } UseMove(entity, move_index, 1, 0, 0); } + +void ov29_0231AFB4(void) +{ + s32 i; + + for (i = 0; i < 2; i++) { + struct monster_id_struct *slots = &DUNGEON_PTR[0]->storm_drain_lightning_rod[i * 2]; + s32 j; + for (j = 0; j < 2; j++) { + slots[j].entity = NULL; + slots[j].entity_id = 0; + } + } +} + +void ov29_0231B008(void) +{ + s32 i; + + for (i = 0; i < 2; i++) { + struct monster_id_struct *slots = &DUNGEON_PTR[0]->storm_drain_lightning_rod[i * 2]; + s32 j; + for (j = 0; j < 2; j++) { + slots[j].entity = NULL; + slots[j].entity_id = 2; + } + } +} + +void ActivateMotorDrive(struct entity *entity) +{ + LogMessageByIdWithPopupCheckParticipants(entity, NULL, MESSAGE_C3B, 2, ABILITY_MOTOR_DRIVE); + BoostSpeedOneStage(entity, entity, 0, TRUE); +} + +void TryActivateFrisk(struct entity *user, struct entity *target) +{ + s16 chances[4]; + struct monster *user_info; + struct monster *target_info; + + if (!EntityIsValid__0231B194(user)) + return; + if (!EntityIsValid__0231B194(target)) + return; + + user_info = GetEntInfo(user); + target_info = GetEntInfo(target); + if (user_info->is_not_team_member) + return; + if (target == ov29_0232E80C() || !target_info->is_not_team_member) + return; + + if (target_info->held_item.id == ITEM_NOTHING) { + GetTreasureBoxChances(target_info->id, chances); + if (chances[2] > 0 || chances[3] > 0) { + ov29_022E4110(user); + SubstitutePlaceholderStringTags(1, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_C3D); + } + } + else { + ov29_022E4110(user); + SubstitutePlaceholderStringTags(1, target, 0); + PrepareItemForPrinting__02345728(2, &target_info->held_item); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_C3C); + } +} diff --git a/src/type_effectiveness.c b/src/type_effectiveness.c index 61852906..4ba0c8ca 100644 --- a/src/type_effectiveness.c +++ b/src/type_effectiveness.c @@ -14,10 +14,10 @@ #include "weather.h" #include "overlay_29_0234B340.h" #include "overlay_29_0234B104.h" +#include "dungeon_logic_2.h" extern struct dungeon *DUNGEON_PTR; -extern bool8 UpdateStateFlags(struct monster *info, s32 flag, bool8 value); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern bool8 GhostImmunityIsActive(struct entity *attacker, struct entity *defender, s16 target_type_idx); extern bool8 IsTypeIneffectiveAgainstGhost(enum type_id type); From 92774e8a2b304d18fde0729676f7a1fd36eb2ad5 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 13 Sep 2026 18:52:06 -0700 Subject: [PATCH 24/34] Decompile the head of overlay_11_023090DC; type the parent-menu tables Five functions, the head of asm/overlay_11_023090DC.s, all merging into src/overlay_11_02307334.c beside their only caller ov11_02307334: ov11_023090DC 809 insn (NA/EU), 807 (JAPAN) ov11_02309DAC 18 ov11_02309DF8 10 ov11_02309E24 8 ov11_02309E48 39 ov11_023090DC is the largest function landed on this branch. It reached STRUCT 0 -- every instruction, immediate and branch target correct -- while a single register permutation over 35 rows held it at score 230. The rule that closed it: MWCC colours the locals living across a call in case-scope declaration order, lowest free register first, and a local assigned only inside a loop body does not join that group from case scope. Four qualifying locals therefore reach only r4-r7; the target needs one on r8, so a fifth member has to exist. Hoisting e, move_id, k and q into the case's declaration list supplies it. No statement moved and no type changed. struct unk_02324D90 gains 22 offsets, replacing padding. Size and every pre-existing offset are unchanged in all three regions, checked by compiling sizeof/offsetof comparisons against the previous layout with the real compiler and reading the folded constant back out. The parent-menu tables are typed from their data rather than from the weakest prototype that accepted them. asm/overlay_11_022ECD24_data.s shows each as a run of 8-byte entries -- u16 string id, 2 bytes padding, s32 value -- i.e. struct unk_0202A5CC, which include/main_0202A66C.h already declares and which CreateParentMenuFromStringIds already takes. Four were declared extern s32 as scalars (hence the & at every call site), one duplicated the struct under a second name, and this file carried its own void*-taking prototype that let all of it compile. Seven globals are now struct unk_0202A5CC[], the duplicate struct unk_02322D38 is gone, the local prototype yields to the header, and five redundant & are dropped. Byte-neutral: &scalar and array yield the same address. Authored by Claude (Opus 5) under human direction. All five measured at decomp.me score 0 in all three regions and re-measured independently. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- ...1_023090DC.inc => overlay_11_02309EE4.inc} | 51 - ...ay_11_023090DC.s => overlay_11_02309EE4.s} | 1049 +---------------- include/overlay_11_02307334.h | 5 + main.lsf | 2 +- src/overlay_11_02307334.c | 655 +++++++++- 5 files changed, 637 insertions(+), 1125 deletions(-) rename asm/include/{overlay_11_023090DC.inc => overlay_11_02309EE4.inc} (73%) rename asm/{overlay_11_023090DC.s => overlay_11_02309EE4.s} (77%) diff --git a/asm/include/overlay_11_023090DC.inc b/asm/include/overlay_11_02309EE4.inc similarity index 73% rename from asm/include/overlay_11_023090DC.inc rename to asm/include/overlay_11_02309EE4.inc index 1eafb560..1463c744 100644 --- a/asm/include/overlay_11_023090DC.inc +++ b/asm/include/overlay_11_02309EE4.inc @@ -11,8 +11,6 @@ .public CountNbItemsOfTypeInStorage .public CreateAdvancedTextBox .public CreateCollectionMenu -.public CreateMonsterSummaryFromTeamMember -.public CreateParentMenu .public CreateParentMenuFromStringIds .public DrawTextInWindow .public DungeonMoveToGroundMove @@ -22,19 +20,13 @@ .public GetActorMatchingStorageId .public GetCroagunkItemTemplates .public GetCurrentBagCapacity -.public GetDexNumber .public GetExclusiveItemType .public GetGameMode .public GetInfoMoveGround .public GetItemAtIdx -.public GetItemMoveId16 -.public GetKeyboardStatus -.public GetKeyboardStringResult -.public GetPressedButtons .public GetSimpleMenuResult__0202AEA4 .public GetTeamMember .public GetWindowIdPageStart -.public GetWindowIdSelectedItemOnPage .public GetWindowIdSelectedMenuItemIdx .public InitMenu .public InitMove @@ -51,11 +43,7 @@ .public MemZero .public MemcpySimple .public PlaySeVolumeWrapper -.public PreprocessString .public PreprocessStringFromId -.public PrintIqSkillsMenu -.public RecolorNameString -.public ResumeParentMenu .public SWAP_SHOP_CLUMSET_ONE_STAR_STR .public SWAP_SHOP_CLUMSET_THREE_STAR_STR .public SWAP_SHOP_CLUMSET_TWO_STAR_STR @@ -68,28 +56,11 @@ .public SetCollectionMenuField0x1A4 .public SetCollectionMenuField0x1C8 .public SetWindowTitle -.public ShowKeyboard -.public StrcmpMonsterName -.public StrcpySimple -.public StrncpySimple -.public StrncpySimpleNoPad -.public StrncpySimpleNoPadSafe .public SwapShopFreeDoublePointer .public UpdateWindow .public ov11_02301174 -.public ov11_0230D000 -.public ov11_0230D220 -.public ov11_0230D92C -.public ov11_02310BDC .public ov11_02322DC8 -.public ov11_02322DD0 -.public ov11_02322DE0 .public ov11_02322DF0 -.public ov11_02322E00 -.public ov11_02322E28 -.public ov11_02322E58 -.public ov11_02322E7C -.public ov11_02322EA0 .public ov11_02322EAC .public ov11_02322EBC .public ov11_02322ECC @@ -105,7 +76,6 @@ .public ov11_02322FD4 .public ov11_02322FE4 .public ov11_02322FF4 -.public ov11_02324D90 .public ov11_02324D94 .public ov11_02324D98 .public strcat @@ -117,31 +87,16 @@ .public sub_02017C50 .public sub_02017C74 .public sub_020262E0 -.public sub_0202810C -.public sub_0202812C -.public sub_02028354 .public sub_0202836C .public sub_0202A03C -.public sub_0202B030 .public sub_0202C620 .public sub_0202C75C .public sub_0202D07C .public sub_0202D0EC -.public sub_020307EC -.public sub_02037468 -.public sub_0203909C -.public sub_02039218 -.public sub_0203931C -.public sub_0203F150 -.public sub_0203F398 -.public sub_0203F974 -.public sub_0203F990 .public sub_0203FA64 -.public sub_0203FBD4 .public sub_0203FD14 .public sub_0203FD38 .public sub_0203FD80 -.public sub_0203FDEC .public sub_0204018C .public sub_020407C0 .public sub_020407EC @@ -155,8 +110,6 @@ .public sub_020417A8 .public sub_02041A00 .public sub_02041A18 -.public sub_02041B7C -.public sub_020420F4 .public sub_02046A20 .public sub_02046B04 .public sub_02046BA0 @@ -171,12 +124,8 @@ .public sub_02047188 .public sub_0204E210 .public sub_02053A0C -.public sub_02053D1C .public sub_020546E8 .public sub_02055894 -.public sub_02055FCC .public sub_02056094 .public sub_0205633C .public sub_020564B0 -.public sub_020586F0 -.public sub_02058794 diff --git a/asm/overlay_11_023090DC.s b/asm/overlay_11_02309EE4.s similarity index 77% rename from asm/overlay_11_023090DC.s rename to asm/overlay_11_02309EE4.s index 3ce49cb5..58a04711 100644 --- a/asm/overlay_11_023090DC.s +++ b/asm/overlay_11_02309EE4.s @@ -1,1055 +1,8 @@ .include "asm/macros.inc" - .include "overlay_11_023090DC.inc" - -#ifdef JAPAN -#define OV11_02309084_OFFSET -0x20 -#else -#define OV11_02309084_OFFSET 0 -#endif + .include "overlay_11_02309EE4.inc" .text - arm_func_start ov11_023090DC -ov11_023090DC: ; 0x023090DC - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x124 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r3, [r0] - ldr r0, [r3] - cmp r0, #0x1b - addls pc, pc, r0, lsl #2 - b _02309D74 -_023090FC: ; jump table - b _0230916C ; case 0 - b _0230955C ; case 1 - b _02309518 ; case 2 - b _02309724 ; case 3 - b _023097EC ; case 4 - b _0230984C ; case 5 - b _0230987C ; case 6 - b _023098A8 ; case 7 - b _023098E4 ; case 8 - b _023099B0 ; case 9 - b _023099CC ; case 10 - b _023099F8 ; case 11 - b _02309A2C ; case 12 - b _02309A68 ; case 13 - b _02309A8C ; case 14 - b _02309AB4 ; case 15 - b _02309AD0 ; case 16 - b _02309B40 ; case 17 - b _02309B5C ; case 18 - b _02309BA4 ; case 19 - b _02309C04 ; case 20 - b _02309CA4 ; case 21 - b _02309CE0 ; case 22 - b _02309CF8 ; case 23 - b _02309D20 ; case 24 - b _02309D38 ; case 25 - b _02309D54 ; case 26 - b _02309D6C ; case 27 -_0230916C: - ldr r5, [r3, #0x114 + OV11_02309084_OFFSET] - mov r0, #0 - str r0, [sp, #4] - ldr r8, [sp, #4] - add r4, r3, #0x11c + OV11_02309084_OFFSET - mov r2, r8 -#ifdef JAPAN - str r2, [sp, #8] - ldrsh r2, [r3, #0xf8] -#else - add r3, r3, #0x100 - str r2, [sp, #8] - ldrsh r2, [r3, #0x18] -#endif - mov r0, r4 - mov r1, r5 - str r2, [sp, #0x10] - ldr r2, _02309D84 ; =0x00401833 - add r7, r4, #0x38 - str r2, [sp, #0x14] - bl ov11_02309EE4 - mov r2, #0 - mov r1, r2 - b _023091C4 -_023091B8: - add r0, r4, r2 - strb r1, [r0, #0x70] - add r2, r2, #1 -_023091C4: - ldr r0, [r4, #0x30] - cmp r2, r0 - blt _023091B8 - cmp r5, #2 - bne _023092FC - mov sl, #0 - b _023092F0 -_023091E0: - ldr r0, [sp, #0x10] - add fp, r4, sl, lsl #3 - bl GetItemMoveId16 - ldr r1, [r4, sl, lsl #3] - mov r6, r0 - cmp r1, #1 - bne _02309258 - ldrsh r0, [fp, #4] - bl GetTeamMember - ldrsh r1, [r0, #4] - mov sb, #0 - mov r3, sb - str r1, [sp, #0xc] - mov fp, #1 - mov r1, #6 - b _0230924C -_02309220: - mla ip, sb, r1, r0 - ldrb r2, [ip, #0x22] - tst r2, #1 - movne r2, fp - moveq r2, r3 - tst r2, #0xff - beq _02309248 - ldrh r2, [ip, #0x24] - cmp r6, r2 - beq _023092B8 -_02309248: - add sb, sb, #1 -_0230924C: - cmp sb, #4 - blt _02309220 - b _023092B8 -_02309258: - cmp r1, #2 - bne _023092B8 - ldrsh r0, [fp, #4] - bl GetActiveTeamMember - ldrsh r1, [r0, #0xc] - mov sb, #0 - mov r2, sb - str r1, [sp, #0xc] - mov r3, #1 - b _023092B0 -_02309280: - add r1, r0, sb, lsl #3 - ldrb r1, [r1, #0x1c] - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - beq _023092AC - add r1, r0, sb, lsl #3 - ldrh r1, [r1, #0x20] - cmp r6, r1 - beq _023092B8 -_023092AC: - add sb, sb, #1 -_023092B0: - cmp sb, #4 - blt _02309280 -_023092B8: - ldr r1, [sp, #0xc] - mov r0, r6 - bl sub_02053D1C - cmp r0, #0 - beq _023092E0 - cmp sb, #4 - addlt r0, r4, sl - movlt r1, #3 - strltb r1, [r0, #0x70] - b _023092EC -_023092E0: - add r0, r4, sl - mov r1, #3 - strb r1, [r0, #0x70] -_023092EC: - add sl, sl, #1 -_023092F0: - ldr r0, [r4, #0x30] - cmp sl, r0 - blt _023091E0 -_023092FC: - mov sl, #0 - add r6, r4, #0x76 - add fp, sp, #0x5c - b _02309450 -_0230930C: - add sb, r4, sl, lsl #3 - ldr r0, [r4, sl, lsl #3] - cmp r0, #1 - bne _0230935C - ldrsh r0, [sb, #4] - bl GetTeamMember - ldrsh r1, [sb, #4] - mov sb, r0 - orr r0, r1, #0x20000 - str r0, [sp, #0x5c] - ldrsh r0, [sb, #4] - bl GetDexNumber - str r0, [sp, #0x80] - add r1, sb, #0x3a - add r0, sp, #0x1a - mov r2, #0 - bl RecolorNameString - add r0, sp, #0x1a - str r0, [sp, #0x94] - b _023093A0 -_0230935C: - cmp r0, #2 - bne _023093A0 - ldrsh r0, [sb, #4] - bl GetActiveTeamMember - ldrsh r1, [sb, #4] - mov sb, r0 - orr r0, r1, #0x30000 - str r0, [sp, #0x5c] - ldrsh r0, [sb, #0xc] - bl GetDexNumber - str r0, [sp, #0x80] - add r1, sb, #0x5e - add r0, sp, #0x1a - mov r2, #0 - bl RecolorNameString - add r0, sp, #0x1a - str r0, [sp, #0x94] -_023093A0: - cmp r5, #1 - mov r1, #0x100 - mov r3, #0 - bne _023093C8 - ldr r2, _02309D88 ; =ov11_02322E58 - add r0, r6, r8, lsl #8 - str fp, [sp] - mov sb, r8, lsl #8 - bl PreprocessString - b _0230941C -_023093C8: - cmp r5, #2 - bne _02309408 - add r0, r4, sl - ldrb r0, [r0, #0x70] - mov sb, r8, lsl #8 - tst r0, #2 - str fp, [sp] - beq _023093F8 - ldr r2, _02309D8C ; =ov11_02322E7C - add r0, r6, r8, lsl #8 - bl PreprocessString - b _0230941C -_023093F8: - ldr r2, _02309D88 ; =ov11_02322E58 - add r0, r6, r8, lsl #8 - bl PreprocessString - b _0230941C -_02309408: - ldr r2, _02309D90 ; =ov11_02322EA0 - add r0, r6, r8, lsl #8 - str fp, [sp] - mov sb, r8, lsl #8 - bl PreprocessString -_0230941C: - add r0, r4, sl - ldrb r0, [r0, #0x70] - add r8, r8, #1 - cmp r0, #0 - ldreq r0, [sp, #4] - cmpeq r0, #0 - moveq r0, #1 - streq r0, [sp, #4] - add r0, r6, sb - stmia r7, {r0, sl} - streq sl, [sp, #8] - add r7, r7, #8 - add sl, sl, #1 -_02309450: - ldr r0, [r4, #0x30] - cmp sl, r0 - blt _0230930C - mov r3, #0 - str r3, [r7] - sub r0, r3, #1 - str r0, [r7, #4] - ldr r0, [sp, #8] - ldr r1, _02309D80 ; =ov11_02324D90 - str r0, [r4, #0x34] - ldr r0, [r1] - mov r2, #0x10 - str r2, [r0, #0x88 + OV11_02309084_OFFSET] - ldr r0, [r1] - str r3, [r0, #0x7c + OV11_02309084_OFFSET] - ldr r3, [r1] - ldr r0, [r3, #0x114 + OV11_02309084_OFFSET] - cmp r0, #1 - ldreq r0, _02309D94 ; =0x000002F2 - streqh r0, [r3, #0x84 + OV11_02309084_OFFSET] - beq _023094E0 - cmp r0, #2 - ldrne r0, _02309D98 ; =0x00000A3A - strneh r0, [r3, #0x84 + OV11_02309084_OFFSET] - bne _023094E0 - ldr r2, _02309D94 ; =0x000002F2 - ldr r0, [sp, #0x14] - strh r2, [r3, #0x84 + OV11_02309084_OFFSET] - orr r0, r0, #0x200 - ldr r2, [r1] - str r0, [sp, #0x14] - add r0, r2, #0x18c + OV11_02309084_OFFSET - str r0, [r2, #0xdc + OV11_02309084_OFFSET] - ldr r1, [r1] - ldr r0, [r1, #0x150 + OV11_02309084_OFFSET] - str r0, [r1, #0x7c + OV11_02309084_OFFSET] -_023094E0: - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r0, _02309D9C ; =ov11_02322DD0 - ldr r3, [r1] - ldr r1, [sp, #0x14] - add r2, r3, #0x7c + OV11_02309084_OFFSET - add r3, r3, #0x154 + OV11_02309084_OFFSET - bl CreateParentMenu - ldr r1, _02309D80 ; =ov11_02324D90 - mov r2, #1 - ldr r3, [r1] - strb r0, [r3, #4] - ldr r0, [r1] - str r2, [r0] - b _02309D74 -_02309518: - ldrsb r0, [r3, #4] - bl sub_02028354 - cmp r0, #3 - bne _02309538 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl sub_0202810C -_02309538: - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl ResumeParentMenu - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #1 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_0230955C: - add r1, sp, #0x18 - mov r0, #0 - ldr r5, [r3, #0x114 + OV11_02309084_OFFSET] - bl GetPressedButtons - ldrh r0, [sp, #0x18] - tst r0, #8 - beq _02309584 - cmp r5, #0 - moveq r0, #1 - beq _02309588 -_02309584: - mov r0, #0 -_02309588: - cmp r0, #0 - beq _023095E0 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r4, [r0] - ldrsb r0, [r4, #4] - bl GetWindowIdSelectedItemOnPage - add r0, r4, r0, lsl #3 - ldr r1, [r0, #0x158 + OV11_02309084_OFFSET] - ldr r0, _02309D80 ; =ov11_02324D90 - str r1, [r4, #0x10] - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl sub_0202B030 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl sub_0202812C - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #4 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_023095E0: - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl IsParentMenuActive - cmp r0, #0 - bne _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl GetSimpleMenuResult__0202AEA4 - cmp r0, #0 - blt _02309704 - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r2, [r1] - str r0, [r2, #0x10] - ldr r1, [r1] - add r2, r1, #0x11c + OV11_02309084_OFFSET - ldr r1, [r2, r0, lsl #3] - add r5, r2, r0, lsl #3 - cmp r1, #1 - bne _02309644 - ldrsh r0, [r5, #4] - bl GetTeamMember - ldrsh r4, [r0, #4] - b _02309658 -_02309644: - cmp r1, #2 - bne _02309658 - ldrsh r0, [r5, #4] - bl GetActiveTeamMember - ldrsh r4, [r0, #0xc] -_02309658: - mov r0, r5 - bl ov11_0230A044 - ldr r1, _02309D80 ; =ov11_02324D90 - mov r5, r0 - ldr r1, [r1] - ldr r0, [r1, #0x114 + OV11_02309084_OFFSET] - sub r0, r0, #1 - cmp r0, #1 - movls r0, #0x1a - strls r0, [r1] - bls _02309D74 - bl GetGameMode - cmp r0, #5 - beq _023096D0 - cmp r4, #0x140 - bne _023096D0 - mov r0, r5 - mov r1, r4 - bl StrcmpMonsterName - cmp r0, #0 - beq _023096D0 - ldr r0, _02309DA0 ; =ov11_02322DE0 - ldr r3, _02309DA4 ; =ov11_02322E28 - mov r1, #0x13 - mov r2, #0 - bl CreateParentMenuFromStringIds - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r1, [r1] - strb r0, [r1, #5] - b _023096F0 -_023096D0: - ldr r0, _02309DA0 ; =ov11_02322DE0 - ldr r3, _02309DA8 ; =ov11_02322E00 - mov r1, #0x13 - mov r2, #0 - bl CreateParentMenuFromStringIds - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r1, [r1] - strb r0, [r1, #5] -_023096F0: - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #3 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309704: - ldr r0, _02309D80 ; =ov11_02324D90 - mov r3, #0x1a - ldr r2, [r0] - sub r1, r3, #0x1b - str r3, [r2] - ldr r0, [r0] - str r1, [r0, #0x10] - b _02309D74 -_02309724: - ldrsb r0, [r3, #5] - bl IsParentMenuActive - cmp r0, #0 - bne _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #5] - bl GetSimpleMenuResult__0202AEA4 - mvn r1, #0 - cmp r0, r1 - beq _023097C8 - ldr r1, _02309D80 ; =ov11_02324D90 - cmp r0, #3 - ldr r2, [r1] - str r0, [r2, #0x14] - addls pc, pc, r0, lsl #2 - b _023097B4 -_02309768: ; jump table - b _02309778 ; case 0 - b _02309788 ; case 1 - b _02309798 ; case 2 - b _023097A8 ; case 3 -_02309778: - ldr r0, [r1] - mov r1, #4 - str r1, [r0] - b _023097B4 -_02309788: - ldr r0, [r1] - mov r1, #7 - str r1, [r0] - b _023097B4 -_02309798: - ldr r0, [r1] - mov r1, #0xc - str r1, [r0] - b _023097B4 -_023097A8: - ldr r0, [r1] - mov r1, #0xe - str r1, [r0] -_023097B4: - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl sub_0202812C - b _023097D8 -_023097C8: - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #2 - ldr r0, [r0] - str r1, [r0] -_023097D8: - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #5] - bl CloseParentMenu - b _02309D74 -_023097EC: - ldr r0, [r3, #0x10] - add r1, r3, #0x11c + OV11_02309084_OFFSET - add r4, r1, r0, lsl #3 - ldrsh r0, [r4, #4] - bl GetActiveTeamMember - ldrb r0, [r0, #1] - cmp r0, #0 - movne r5, #1 - ldrsh r0, [r4, #4] - moveq r5, #0 - bl GetActiveTeamMember - mov r1, r0 - add r0, sp, #0xac - and r2, r5, #0xff - bl CreateMonsterSummaryFromTeamMember - add r0, sp, #0xac - mov r1, #3 - bl sub_0203F150 - ldr r1, _02309D80 ; =ov11_02324D90 - mov r2, #5 - ldr r3, [r1] - strb r0, [r3, #9] - ldr r0, [r1] - str r2, [r0] -_0230984C: - bl sub_0203F398 - cmp r0, #1 - bne _02309D74 - bl sub_0203F974 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r3, #1 - ldr r2, [r0] - mov r1, #6 - str r3, [r2, #0x18] - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_0230987C: - ldr r1, [r3, #0x18] - sub r0, r1, #1 - str r0, [r3, #0x18] - cmp r1, #0 - bne _02309D74 - bl sub_0203F990 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #2 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_023098A8: - ldr r0, [r3, #0x10] -#ifdef JAPAN - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 -#else - add r0, r3, r0, lsl #3 - add r0, r0, #0x100 - ldrsh r0, [r0, #0x20] -#endif - bl sub_0203FBD4 - mov r1, #0 - mov r2, r1 - mov r0, #9 - bl sub_0204018C - ldr r1, _02309D80 ; =ov11_02324D90 - mov r2, #8 - ldr r3, [r1] - strb r0, [r3, #0xa] - ldr r0, [r1] - str r2, [r0] -_023098E4: - bl sub_020407EC - cmp r0, #1 - bne _02309934 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r1, [r0] - ldr r0, [r1, #0x10] - add r0, r1, r0, lsl #3 - add r0, r0, #0x100 - ldrsh r0, [r0, #0x20 + OV11_02309084_OFFSET] - bl sub_0203FDEC - bl sub_020407C0 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #0xa] - bl CloseAdvancedTextBox - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #2 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309934: - cmp r0, #2 - cmpne r0, #7 - bne _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r1, [r0] - ldr r0, [r1, #0x10] - add r1, r1, #0x11c + OV11_02309084_OFFSET - add r4, r1, r0, lsl #3 - bl sub_0203FD38 - ldr r2, _02309D80 ; =ov11_02324D90 - mov r1, r0 - ldr r0, [r2] - mov r2, #0x20 - add r0, r0, #0x1e - bl MemcpySimple - bl sub_02041094 - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r1, [r1] - strh r0, [r1, #0x1c] - ldrsh r0, [r4, #4] - bl sub_0203FDEC - bl sub_020407C0 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #0xa] - bl CloseAdvancedTextBox - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0xa - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_023099B0: - ldrsb r0, [r3, #0xa] - bl sub_020307EC - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #8 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_023099CC: - ldrsh r2, [r3, #0x1c] - add r0, r3, #0x1e - mov r1, #4 - mov r3, #1 - bl sub_020417A8 - ldr r1, _02309D80 ; =ov11_02324D90 - mov r2, #0xb - ldr r3, [r1] - strb r0, [r3, #0xb] - ldr r0, [r1] - str r2, [r0] -_023099F8: - bl sub_02041A18 - cmp r0, #1 - bne _02309D74 - bl sub_02041A00 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #0xb] - bl CloseScrollBox - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #7 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309A2C: - ldr r0, [r3, #0x10] - add r0, r3, r0, lsl #3 - add r0, r0, #0x100 - ldrsh r0, [r0, #0x20 + OV11_02309084_OFFSET] - bl GetActiveTeamMember - mov r1, r0 - ldrsh r0, [r1, #0xc] - ldrsh r2, [r1, #6] - add r1, r1, #0x4c - mov r3, #0 - bl PrintIqSkillsMenu - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0xd - ldr r0, [r0] - str r1, [r0] -_02309A68: - bl sub_02041B7C - cmp r0, #1 - bne _02309D74 - bl sub_020420F4 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #2 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309A8C: - bl ov11_0230D92C - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl CloseParentMenu - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0xf - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309AB4: - bl ov11_0230D220 - cmp r0, #0 - ldreq r0, _02309D80 ; =ov11_02324D90 - moveq r1, #0x10 - ldreq r0, [r0] - streq r1, [r0] - b _02309D74 -_02309AD0: - ldr r0, [r3, #0x10] - add r1, r3, #0x11c + OV11_02309084_OFFSET - add r0, r1, r0, lsl #3 - bl ov11_0230A044 - ldr r2, _02309D80 ; =ov11_02324D90 - mov r1, r0 - ldr r0, [r2] - mov r2, #0xa - add r0, r0, #0x3e - bl StrncpySimpleNoPad - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r1, [r0] -#ifdef JAPAN - add r0, r1, #0x48 -#else - add r0, r1, #0x52 -#endif - add r1, r1, #0x3e - bl StrcpySimple - ldr r1, _02309D80 ; =ov11_02324D90 - mov r0, #2 - ldr r3, [r1] - mov r2, #0 - add r1, r3, #0x3e -#ifdef JAPAN - add r3, r3, #0x48 -#else - add r3, r3, #0x52 -#endif - bl ShowKeyboard - bl ov11_02310BDC - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x11 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309B40: - bl ov11_0230D220 - cmp r0, #0 - ldreq r0, _02309D80 ; =ov11_02324D90 - moveq r1, #0x12 - ldreq r0, [r0] - streq r1, [r0] - b _02309D74 -_02309B5C: - bl GetKeyboardStatus - cmp r0, #3 - bne _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0xa - ldr r0, [r0] - str r1, [r0, #0x18] - bl GetKeyboardStringResult - ldr r2, _02309D80 ; =ov11_02324D90 - mov r1, r0 - ldr r0, [r2] - add r0, r0, #0x3e - bl StrcpySimple - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x13 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309BA4: - bl sub_02037468 - cmp r0, #0 - beq _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r3, [r0] - ldr r2, [r3, #0x18] - sub r1, r2, #1 - str r1, [r3, #0x18] - cmp r2, #0 - bgt _02309D74 - ldr r1, [r0] - mov r2, #0xa -#ifdef JAPAN - add r0, r1, #0x52 -#else - add r0, r1, #0x66 -#endif - add r1, r1, #0x3e - bl StrncpySimpleNoPadSafe - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] -#ifdef JAPAN - add r0, r0, #0x52 -#else - add r0, r0, #0x66 -#endif - bl sub_0203909C - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x14 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309C04: - ldr r0, [r3, #0x10] - add r1, r3, #0x11c + OV11_02309084_OFFSET - add r4, r1, r0, lsl #3 - mov r0, r4 - bl ov11_0230A044 - mov r5, r0 - bl sub_0203931C - mvn r1, #0 - cmp r0, r1 - beq _02309D74 - cmp r0, #0 - beq _02309C4C - cmp r0, #1 - ldreq r0, _02309D80 ; =ov11_02324D90 - moveq r1, #0x15 - ldreq r0, [r0] - streq r1, [r0] - b _02309D74 -_02309C4C: - ldr r1, _02309D80 ; =ov11_02324D90 - mov r0, r5 - ldr r1, [r1] - mov r2, #0xa - add r1, r1, #0x3e - bl StrncpySimple - ldr r1, _02309D80 ; =ov11_02324D90 - mov r0, r5 - ldr r1, [r1] - mov r2, #0xa - add r1, r1, #0x3e - bl StrncpySimple - ldr r0, [r4] - cmp r0, #2 - bne _02309C90 - ldrsh r0, [r4, #4] - bl sub_02058794 -_02309C90: - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x16 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309CA4: - bl sub_02039218 - cmp r0, #0 - beq _02309D74 - ldr r1, _02309D80 ; =ov11_02324D90 - mov r0, #2 - ldr r3, [r1] - mov r2, #0 - add r1, r3, #0x3e -#ifdef JAPAN - add r3, r3, #0x48 -#else - add r3, r3, #0x52 -#endif - bl ShowKeyboard - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x12 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309CE0: - bl ov11_0230D92C - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x17 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309CF8: - bl ov11_0230D220 - cmp r0, #0 - bne _02309D74 - bl sub_02039218 - cmp r0, #0 - ldrne r0, _02309D80 ; =ov11_02324D90 - movne r1, #0x18 - ldrne r0, [r0] - strne r1, [r0] - b _02309D74 -_02309D20: - bl ov11_0230D000 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x19 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309D38: - bl ov11_0230D220 - cmp r0, #0 - ldreq r0, _02309D80 ; =ov11_02324D90 - moveq r1, #0 - ldreq r0, [r0] - streq r1, [r0] - b _02309D74 -_02309D54: - ldrsb r0, [r3, #4] - bl CloseParentMenu - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x1b - ldr r0, [r0] - str r1, [r0] -_02309D6C: - mov r0, #1 - b _02309D78 -_02309D74: - mov r0, #0 -_02309D78: - add sp, sp, #0x124 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02309D80: .word ov11_02324D90 -_02309D84: .word 0x00401833 -_02309D88: .word ov11_02322E58 -_02309D8C: .word ov11_02322E7C -_02309D90: .word ov11_02322EA0 -#ifdef JAPAN -_02309D94: .word 0x00002FF2 -_02309D98: .word 0x00000875 -#else -_02309D94: .word 0x000002F2 -_02309D98: .word 0x00000A3A -#endif -_02309D9C: .word ov11_02322DD0 -_02309DA0: .word ov11_02322DE0 -_02309DA4: .word ov11_02322E28 -_02309DA8: .word ov11_02322E00 - arm_func_end ov11_023090DC - - arm_func_start ov11_02309DAC -ov11_02309DAC: ; 0x02309DAC - ldr r1, _02309DF4 ; =ov11_02324D90 - ldr r1, [r1] - ldr r2, [r1, #0x10] -#ifdef JAPAN - add r3, r1, #0xfc -#else - add r3, r1, #0x11c -#endif - ldr r1, [r3, r2, lsl #3] - add r2, r3, r2, lsl #3 - cmp r1, #1 - moveq r1, #0 - streq r1, [r0] - ldreqsh r1, [r2, #4] - streqh r1, [r0, #4] - bxeq lr - cmp r1, #2 - moveq r1, #1 - streq r1, [r0] - ldreqsh r1, [r2, #4] - streqh r1, [r0, #4] - bx lr - .align 2, 0 -_02309DF4: .word ov11_02324D90 - arm_func_end ov11_02309DAC - - arm_func_start ov11_02309DF8 -ov11_02309DF8: ; 0x02309DF8 - stmdb sp!, {r3, lr} - ldr r0, _02309E20 ; =ov11_02324D90 - ldr r0, [r0] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl MemFree - ldr r0, _02309E20 ; =ov11_02324D90 - mov r1, #0 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_02309E20: .word ov11_02324D90 - arm_func_end ov11_02309DF8 - - arm_func_start ov11_02309E24 -ov11_02309E24: ; 0x02309E24 - ldr r0, _02309E44 ; =ov11_02324D90 - ldr r0, [r0] - cmp r0, #0 - ldrne r0, [r0, #0x10] - movne r0, r0, lsl #0x10 - movne r0, r0, asr #0x10 - mvneq r0, #0 - bx lr - .align 2, 0 -_02309E44: .word ov11_02324D90 - arm_func_end ov11_02309E24 - - arm_func_start ov11_02309E48 -ov11_02309E48: ; 0x02309E48 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r0 - mov r0, #0x34 - mov r1, #0 - mov r5, #1 - bl MemAlloc - mov r1, #2 - mov r4, r0 - bl ov11_02309EE4 - mov r6, #0 - b _02309EBC -_02309E74: - ldr r0, [r4, r6, lsl #3] - add r1, r4, r6, lsl #3 - cmp r0, #1 - bne _02309E9C - ldrsh r0, [r1, #4] - mov r1, r7 - bl sub_02055FCC - cmp r0, #0 - bne _02309EC8 - b _02309EB8 -_02309E9C: - cmp r0, #2 - bne _02309EB8 - ldrsh r0, [r1, #4] - mov r1, r7 - bl sub_020586F0 - cmp r0, #0 - bne _02309EC8 -_02309EB8: - add r6, r6, #1 -_02309EBC: - ldr r0, [r4, #0x30] - cmp r6, r0 - blt _02309E74 -_02309EC8: - ldr r0, [r4, #0x30] - cmp r6, r0 - mov r0, r4 - moveq r5, #0 - bl MemFree - mov r0, r5 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ov11_02309E48 - arm_func_start ov11_02309EE4 ov11_02309EE4: ; 0x02309EE4 stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} diff --git a/include/overlay_11_02307334.h b/include/overlay_11_02307334.h index f1187aa4..cbd2973d 100644 --- a/include/overlay_11_02307334.h +++ b/include/overlay_11_02307334.h @@ -32,5 +32,10 @@ void ov11_02308FEC(struct unk_02308F4C *a); s32 ov11_0230901C(struct unk_02308F4C *a); int ov11_02309040(s32 param_1); int ov11_02309084(s16 param_1); +int ov11_023090DC(void); +void ov11_02309DAC(struct unk_02309DAC *out); +void ov11_02309DF8(void); +s16 ov11_02309E24(void); +int ov11_02309E48(s16 param_1); #endif diff --git a/main.lsf b/main.lsf index 6382135a..bba8d585 100644 --- a/main.lsf +++ b/main.lsf @@ -658,7 +658,7 @@ Overlay OVY_11 Object src/overlay_11_022FE58C.o Object asm/overlay_11_022FE5F8.o Object src/overlay_11_02307334.o - Object asm/overlay_11_023090DC.o + Object asm/overlay_11_02309EE4.o Object src/overlay_11_0230CB88.o Object src/overlay_11_0230CD48.o Object asm/overlay_11_0230CE30.o diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index f8dc7c19..fe283c43 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -29,23 +29,115 @@ #include "main_0202B558.h" #include "main_02055410.h" #include "main_02056294.h" +#include "main_020526EC.h" +#include "main_0203755C.h" +#include "main_0200330C.h" +#include "main_020307A4.h" +#include "main_0202A66C.h" extern void sub_02056094(char *dst, struct ground_monster *ground_monster, bool8 is_leader); +struct unk_0202A690 { char *field_0x0; s32 field_0x4; }; +struct unk_0230A044 { s32 field_0x0; s16 field_0x4; }; +struct unk_02309EE4 { struct unk_0230A044 field_0x0[6]; s32 field_0x30; }; +struct unk_023090DC { + struct unk_02309EE4 field_0x0; + s32 field_0x34; + struct unk_0202A690 field_0x38[7]; + u8 field_0x70[6]; + char field_0x76[6][0x100]; +}; + struct unk_02324D90 { s32 field_0x0; + s8 field_0x4; + s8 field_0x5; + u8 field_0x6[3]; + s8 field_0x9; + s8 field_0xa; + s8 field_0xb; + u8 field_0xc[4]; + s32 field_0x10; + s32 field_0x14; + s32 field_0x18; + s16 field_0x1c; + u8 field_0x1e[0x20]; #ifdef JAPAN - u8 field_0x4[0xF0]; + u8 field_0x3e[0xA]; + u8 field_0x52[0xA]; + u8 field_0x66[0xA]; #else - u8 field_0x4[0x110]; + u8 field_0x3e[0x14]; + u8 field_0x52[0x14]; + u8 field_0x66[0x14]; #endif + u32 field_0x7c; + u8 field_0x80[4]; + s16 field_0x84; + u8 field_0x86[2]; + s32 field_0x88; + u8 field_0x8c[0x50]; + u8 *field_0xdc; + u8 field_0xe0[0x34]; s32 field_0x114; s16 field_0x118; - u8 field_0x11a[0x67A]; + u8 field_0x11a[2]; + struct unk_023090DC field_0x11c; }; extern struct unk_02324D90 *ov11_02324D90; extern char ov11_02322DB8[]; + +extern u8 ov11_02322DD0[]; +extern u8 ov11_02322DE0[]; +extern struct unk_0202A5CC ov11_02322E00[]; +extern struct unk_0202A5CC ov11_02322E28[]; +extern char ov11_02322E58[]; +extern char ov11_02322E7C[]; +extern char ov11_02322EA0[]; + +extern void CreateMonsterSummaryFromTeamMember(struct monster_summary *monster_summary, struct team_member *team_member, bool8 is_leader); +extern s32 GetKeyboardStatus(); +extern int PreprocessString(char* output, int output_size, const char* format, u16 flags, struct preprocessor_args* args); +extern void ShowKeyboard(s32 mode, u8 *, s32, u8 *); +extern void sub_0202B030(s8); +extern s32 sub_02037468(); +extern void sub_0203909C(u8 *name); +extern s32 sub_02039218(); +extern s32 sub_0203931C(); +extern u8 CreateParentMenu(void *a, u32 b, void *c, struct unk_0202A690 *items); +extern void ResumeParentMenu(s8 menu_id); +extern void PrintIqSkillsMenu(s16 monster_id, u32 *iq_skill_flags, s16 iq, s32 d); +extern void RecolorNameString(char *dst, const char *src, s32 mode); +extern s32 StrcmpMonsterName(u8 *name, s16 monster_id); +extern s32 sub_02028354(s8); +extern s8 sub_0203F150(struct monster_summary *summary, s32 b); +extern s32 sub_0203F398(void); +extern void sub_0203F974(void); +extern void sub_0203F990(void); +extern s8 sub_0204018C(s32 a, s32 b, s32 c); +extern s32 sub_02041A18(void); +extern s32 sub_02041B7C(void); +extern void sub_020420F4(void); +extern s32 sub_02053D1C(u16 move_id, s16 monster_id); +extern s32 sub_02055FCC(s16 a, s16 b); +extern s32 sub_020586F0(s16 a, s16 b); + +extern s32 ov11_02309EE4(struct unk_02309EE4 *out, s32 mode); +extern u8 *ov11_0230A044(struct unk_0230A044 *entry); +extern void ov11_0230D000(void); +extern s32 ov11_0230D220(void); +extern void ov11_0230D92C(void); +extern void ov11_02310BDC(void); + +#ifdef JAPAN +#define OV11_023090DC_CONST_1 0x2FF2 +#define OV11_023090DC_CONST_2 0x875 +#else +#define OV11_023090DC_CONST_1 0x2F2 +#define OV11_023090DC_CONST_2 0xA3A +#endif + extern s32 sub_02055894(struct ground_monster *member); extern bool8 sub_020564B0(int idx); extern s32 vsprintf(u8 *str, const u8 *format, va_list ap); @@ -92,27 +184,21 @@ struct unk_02324D8C { extern struct unk_02324D8C *ov11_02324D8C; -struct unk_02322D38 { - u16 field_0x0; - u16 field_0x2; - u32 field_0x4; -}; - -extern struct unk_02322D38 ov11_02322D38[]; +extern struct unk_0202A5CC ov11_02322D38[]; extern s32 ov11_02322C78; extern s32 ov11_02322C88; extern s32 ov11_02322C98; extern s32 ov11_02322CA8; extern s32 ov11_02322CB8; extern s32 ov11_02322CC8; -extern s32 ov11_02322CD8; +extern struct unk_0202A5CC ov11_02322CD8[]; extern s32 ov11_02322CF0; -extern s32 ov11_02322D10; -extern s32 ov11_02322D60; -extern s32 ov11_02322D88; +extern struct unk_0202A5CC ov11_02322D10[]; +extern struct unk_0202A5CC ov11_02322D60[]; +extern struct unk_0202A5CC ov11_02322D88[]; extern u8 ov11_02322DB0[]; -extern void CloseScrollBox(s8); extern void CloseTextBox2(s8); extern u8 CreateParentMenuFromStringIds(void *, u32, void *, void *); extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateSimpleMenuFromStringIds(void *, s32, s32, void *, s32); extern s8 CreateTextBox(void *, void *); +extern void CloseScrollBox(s8); extern void CloseTextBox2(s8);extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateSimpleMenuFromStringIds(void *, s32, s32, void *, s32); extern s8 CreateTextBox(void *, void *); extern void GetPressedButtons(u32, u16 *); extern s32 GetSimpleMenuResult__0202AEA4(s8); extern void InitPreprocessorArgs(struct preprocessor_args *); @@ -124,11 +210,6 @@ extern bool8 IsBagNotEmpty(void); extern u8 PopInventoryMenuField0x1A3(s32 window_id); extern void SortItemsInBag(void); extern void *memcpy(void *, const void *, u32); -extern int ov11_023090DC(void); -extern void ov11_02309DAC(void *out); -extern void ov11_02309DF8(void); -extern s16 ov11_02309E24(void); -extern int ov11_02309E48(s16); extern s32 ov11_02307300(s32, s32, s32); extern s32 sub_020037A4(void); extern void sub_0203FD14(u16 move_id); @@ -269,11 +350,11 @@ s32 ov11_02307334(void) menu_a.c = ov11_02324D8C->field_0x276; ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CB8, 0x400213, &menu_a, ov11_02322D38); } else if (IsGummi(ov11_02324D8C->field_0x24e) && v8 != 4 && v8 != 5) { - ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CB8, 0x400013, 0, &ov11_02322D88); + ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CB8, 0x400013, 0, ov11_02322D88); } else if (v6->held_by) { - ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CA8, 0x400013, 0, &ov11_02322D10); + ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CA8, 0x400013, 0, ov11_02322D10); } else { - ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CA8, 0x400013, 0, &ov11_02322D60); + ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CA8, 0x400013, 0, ov11_02322D60); } ov11_02324D8C->field_0x0 = 3; } else { @@ -315,7 +396,7 @@ s32 ov11_02307334(void) ov11_02324D8C->field_0x0 = 9; } else if (v1 == 2) { menu_b.b = 5; - ov11_02324D8C->field_0x7 = CreateParentMenuFromStringIds(&ov11_02322C98, 0x33, &menu_b, &ov11_02322CD8); + ov11_02324D8C->field_0x7 = CreateParentMenuFromStringIds(&ov11_02322C98, 0x33, &menu_b, ov11_02322CD8); ov11_02324D8C->field_0x0 = 4; } else if (v1 == 6) { ov11_02308D48(); @@ -640,7 +721,7 @@ s32 ov11_02307334(void) } case 37: { menu_b.b = 5; - ov11_02324D8C->field_0x7 = CreateParentMenuFromStringIds(0, 0x33, &menu_b, &ov11_02322CD8); + ov11_02324D8C->field_0x7 = CreateParentMenuFromStringIds(0, 0x33, &menu_b, ov11_02322CD8); ov11_02324D8C->field_0x0 = 0x26; break; } @@ -1045,3 +1126,527 @@ int ov11_02309084(s16 param_1) ov11_02324D90->field_0x118 = param_1; return 1; } + +int ov11_023090DC(void) +{ + struct monster_summary summary; + struct preprocessor_args args; + char buf[0x42]; + u16 buttons; + + switch (ov11_02324D90->field_0x0) { + case 0: { + struct unk_02324D90 *p = ov11_02324D90; + struct unk_023090DC *lst; + s32 mode; + struct unk_0230A044 *e; + u16 move_id; + struct unk_0202A690 *w; + s32 n; + s32 k; + s32 i; + s32 q; + u32 flags; + s16 item_id; + s16 monster_id; + s32 v_sel; + bool8 v_flag; + + mode = p->field_0x114; + v_flag = 0; + n = v_flag; + lst = &p->field_0x11c; + v_sel = n; + item_id = p->field_0x118; + flags = 0x00401833; + w = lst->field_0x38; + ov11_02309EE4(&lst->field_0x0, mode); + + for (i = 0; i < lst->field_0x0.field_0x30; i++) { + lst->field_0x70[i] = 0; + } + + if (mode == 2) { + for (i = 0; i < lst->field_0x0.field_0x30; i++) { + e = &lst->field_0x0.field_0x0[i]; + move_id = GetItemMoveId16(item_id); + + if (e->field_0x0 == 1) { + struct ground_monster *gm = GetTeamMember(e->field_0x4); + + monster_id = gm->id; + for (k = 0; k < 4; k++) { + bool8 exists = (gm->moves[k].flags0 & 1) != 0; + + if (exists) { + if (move_id == gm->moves[k].id) { + break; + } + } + } + } else if (e->field_0x0 == 2) { + struct team_member *tm = GetActiveTeamMember(e->field_0x4); + + monster_id = tm->id; + for (k = 0; k < 4; k++) { + bool8 exists = (tm->moves[k].flags0 & 1) != 0; + + if (exists) { + if (move_id == tm->moves[k].id) { + break; + } + } + } + } + if (sub_02053D1C(move_id, monster_id)) { + if (k < 4) { + lst->field_0x70[i] = 3; + } + } else { + lst->field_0x70[i] = 3; + } + } + } + + for (i = 0; i < lst->field_0x0.field_0x30; i++) { + e = &lst->field_0x0.field_0x0[i]; + + if (e->field_0x0 == 1) { + struct ground_monster *gm = GetTeamMember(e->field_0x4); + + args.flag_vals[0] = e->field_0x4 | 0x20000; + args.number_vals[0] = GetDexNumber(gm->id); + RecolorNameString(buf, gm->name, 0); + args.strings[0] = buf; + } else if (e->field_0x0 == 2) { + struct team_member *tm = GetActiveTeamMember(e->field_0x4); + + args.flag_vals[0] = e->field_0x4 | 0x30000; + args.number_vals[0] = GetDexNumber(tm->id); + RecolorNameString(buf, tm->name, 0); + args.strings[0] = buf; + } + + if (mode == 1) { + q = n * 0x100; + PreprocessString(lst->field_0x76[n], 0x100, ov11_02322E58, 0, &args); + } else if (mode == 2) { + if (lst->field_0x70[i] & 2) { + q = n * 0x100; + PreprocessString(lst->field_0x76[n], 0x100, ov11_02322E7C, 0, &args); + } else { + q = n * 0x100; + PreprocessString(lst->field_0x76[n], 0x100, ov11_02322E58, 0, &args); + } + } else { + q = n * 0x100; + PreprocessString(lst->field_0x76[n], 0x100, ov11_02322EA0, 0, &args); + } + + if (lst->field_0x70[i] == 0 && v_flag == 0) { + v_flag = 1; + v_sel = i; + } + n++; + w->field_0x0 = lst->field_0x76[0] + q; + w->field_0x4 = i; + w++; + } + w->field_0x0 = 0; + w->field_0x4 = -1; + lst->field_0x34 = v_sel; + + ov11_02324D90->field_0x88 = 0x10; + ov11_02324D90->field_0x7c = 0; + if (ov11_02324D90->field_0x114 == 1) { + ov11_02324D90->field_0x84 = OV11_023090DC_CONST_1; + } else if (ov11_02324D90->field_0x114 == 2) { + ov11_02324D90->field_0x84 = OV11_023090DC_CONST_1; + flags |= 0x200; + ov11_02324D90->field_0xdc = ov11_02324D90->field_0x11c.field_0x70; + ov11_02324D90->field_0x7c = ov11_02324D90->field_0x11c.field_0x34; + } else { + ov11_02324D90->field_0x84 = OV11_023090DC_CONST_2; + } + ov11_02324D90->field_0x4 = + CreateParentMenu(ov11_02322DD0, flags, &ov11_02324D90->field_0x7c, + ov11_02324D90->field_0x11c.field_0x38); + ov11_02324D90->field_0x0 = 1; + break; + } + + case 2: + if (sub_02028354(ov11_02324D90->field_0x4) == 3) { + sub_0202810C(ov11_02324D90->field_0x4); + } + ResumeParentMenu(ov11_02324D90->field_0x4); + ov11_02324D90->field_0x0 = 1; + break; + + case 1: { + s32 mode = ov11_02324D90->field_0x114; + s32 r; + s32 cond; + + GetPressedButtons(0, &buttons); + cond = (buttons & 8) && mode == 0; + if (cond) { + ov11_02324D90->field_0x10 = + ov11_02324D90->field_0x11c.field_0x38[GetWindowIdSelectedItemOnPage( + ov11_02324D90->field_0x4)].field_0x4; + sub_0202B030(ov11_02324D90->field_0x4); + sub_0202812C(ov11_02324D90->field_0x4); + ov11_02324D90->field_0x0 = 4; + break; + } + if (IsParentMenuActive(ov11_02324D90->field_0x4)) { + break; + } + r = GetSimpleMenuResult__0202AEA4(ov11_02324D90->field_0x4); + if (r >= 0) { + struct unk_0230A044 *e; + s16 id; + u8 *name; + + ov11_02324D90->field_0x10 = r; + e = &ov11_02324D90->field_0x11c.field_0x0.field_0x0[r]; + if (e->field_0x0 == 1) { + id = GetTeamMember(e->field_0x4)->id; + } else if (e->field_0x0 == 2) { + id = GetActiveTeamMember(e->field_0x4)->id; + } + name = ov11_0230A044(e); + if (ov11_02324D90->field_0x114 == 1 || ov11_02324D90->field_0x114 == 2) { + ov11_02324D90->field_0x0 = 0x1a; + break; + } + if (GetGameMode() != GAME_MODE_5 && id == 0x140 && + StrcmpMonsterName(name, id)) { + ov11_02324D90->field_0x5 = CreateParentMenuFromStringIds( + ov11_02322DE0, 0x13, 0, ov11_02322E28); + } else { + ov11_02324D90->field_0x5 = CreateParentMenuFromStringIds( + ov11_02322DE0, 0x13, 0, ov11_02322E00); + } + ov11_02324D90->field_0x0 = 3; + } else { + ov11_02324D90->field_0x0 = 0x1a; + ov11_02324D90->field_0x10 = -1; + } + break; + } + + case 3: { + s32 r; + + if (IsParentMenuActive(ov11_02324D90->field_0x5)) { + break; + } + r = GetSimpleMenuResult__0202AEA4(ov11_02324D90->field_0x5); + if (r != -1) { + ov11_02324D90->field_0x14 = r; + switch (r) { + case 0: + ov11_02324D90->field_0x0 = 4; + break; + case 1: + ov11_02324D90->field_0x0 = 7; + break; + case 2: + ov11_02324D90->field_0x0 = 0xc; + break; + case 3: + ov11_02324D90->field_0x0 = 0xe; + break; + } + sub_0202812C(ov11_02324D90->field_0x4); + } else { + ov11_02324D90->field_0x0 = 2; + } + CloseParentMenu(ov11_02324D90->field_0x5); + break; + } + + case 4: { + struct unk_0230A044 *e = + &ov11_02324D90->field_0x11c.field_0x0.field_0x0[ov11_02324D90->field_0x10]; + s32 leader = GetActiveTeamMember(e->field_0x4)->is_leader != 0; + + CreateMonsterSummaryFromTeamMember(&summary, + GetActiveTeamMember(e->field_0x4), + leader); + ov11_02324D90->field_0x9 = sub_0203F150(&summary, 3); + ov11_02324D90->field_0x0 = 5; + } + + case 5: + if (sub_0203F398() != 1) { + break; + } + sub_0203F974(); + ov11_02324D90->field_0x18 = 1; + ov11_02324D90->field_0x0 = 6; + break; + + case 6: + if (ov11_02324D90->field_0x18-- != 0) { + break; + } + sub_0203F990(); + ov11_02324D90->field_0x0 = 2; + break; + + case 7: +#ifdef JAPAN + sub_0203FBD4(ov11_02324D90->field_0x10); +#else + sub_0203FBD4(ov11_02324D90->field_0x11c.field_0x0 + .field_0x0[ov11_02324D90->field_0x10] + .field_0x4); +#endif + ov11_02324D90->field_0xa = sub_0204018C(9, 0, 0); + ov11_02324D90->field_0x0 = 8; + + case 8: { + s32 r = sub_020407EC(); + + if (r == 1) { + sub_0203FDEC(ov11_02324D90->field_0x11c.field_0x0 + .field_0x0[ov11_02324D90->field_0x10] + .field_0x4); + sub_020407C0(); + CloseAdvancedTextBox(ov11_02324D90->field_0xa); + ov11_02324D90->field_0x0 = 2; + break; + } + if (r == 2 || r == 7) { + struct unk_0230A044 *e = + &ov11_02324D90->field_0x11c.field_0x0.field_0x0[ov11_02324D90->field_0x10]; + + MemcpySimple(ov11_02324D90->field_0x1e, sub_0203FD38(), 0x20); + ov11_02324D90->field_0x1c = sub_02041094(); + sub_0203FDEC(e->field_0x4); + sub_020407C0(); + CloseAdvancedTextBox(ov11_02324D90->field_0xa); + ov11_02324D90->field_0x0 = 0xa; + } + break; + } + + case 9: + sub_020307EC(ov11_02324D90->field_0xa); + ov11_02324D90->field_0x0 = 8; + break; + + case 10: + ov11_02324D90->field_0xb = sub_020417A8(ov11_02324D90->field_0x1e, 4, + ov11_02324D90->field_0x1c, 1); + ov11_02324D90->field_0x0 = 0xb; + + case 11: + if (sub_02041A18() != 1) { + break; + } + sub_02041A00(); + CloseScrollBox(ov11_02324D90->field_0xb); + ov11_02324D90->field_0x0 = 7; + break; + + case 12: { + struct team_member *tm = + GetActiveTeamMember(ov11_02324D90->field_0x11c.field_0x0 + .field_0x0[ov11_02324D90->field_0x10] + .field_0x4); + + PrintIqSkillsMenu(tm->id, tm->iq_skill_flags, tm->iq, 0); + ov11_02324D90->field_0x0 = 0xd; + } + + case 13: + if (sub_02041B7C() != 1) { + break; + } + sub_020420F4(); + ov11_02324D90->field_0x0 = 2; + break; + + case 14: + ov11_0230D92C(); + CloseParentMenu(ov11_02324D90->field_0x4); + ov11_02324D90->field_0x0 = 0xf; + break; + + case 15: + if (ov11_0230D220() == 0) { + ov11_02324D90->field_0x0 = 0x10; + } + break; + + case 16: + StrncpySimpleNoPad( + ov11_02324D90->field_0x3e, + ov11_0230A044(&ov11_02324D90->field_0x11c.field_0x0 + .field_0x0[ov11_02324D90->field_0x10]), + 10); + StrcpySimple(ov11_02324D90->field_0x52, ov11_02324D90->field_0x3e); + ShowKeyboard(2, ov11_02324D90->field_0x3e, 0, ov11_02324D90->field_0x52); + ov11_02310BDC(); + ov11_02324D90->field_0x0 = 0x11; + break; + + case 17: + if (ov11_0230D220() == 0) { + ov11_02324D90->field_0x0 = 0x12; + } + break; + + case 18: + if (GetKeyboardStatus() != 3) { + break; + } + ov11_02324D90->field_0x18 = 0xa; + StrcpySimple(ov11_02324D90->field_0x3e, (u8 *)GetKeyboardStringResult()); + ov11_02324D90->field_0x0 = 0x13; + break; + + case 19: + if (!sub_02037468()) { + break; + } + if (ov11_02324D90->field_0x18-- > 0) { + break; + } + StrncpySimpleNoPadSafe(ov11_02324D90->field_0x66, + ov11_02324D90->field_0x3e, 10); + sub_0203909C(ov11_02324D90->field_0x66); + ov11_02324D90->field_0x0 = 0x14; + break; + + case 20: { + struct unk_0230A044 *e = + &ov11_02324D90->field_0x11c.field_0x0.field_0x0[ov11_02324D90->field_0x10]; + u8 *name = ov11_0230A044(e); + s32 r = sub_0203931C(); + + if (r == -1) { + break; + } + if (r != 0) { + if (r == 1) { + ov11_02324D90->field_0x0 = 0x15; + } + break; + } + StrncpySimple(name, ov11_02324D90->field_0x3e, 10); + StrncpySimple(name, ov11_02324D90->field_0x3e, 10); + if (e->field_0x0 == 2) { + sub_02058794(e->field_0x4); + } + ov11_02324D90->field_0x0 = 0x16; + break; + } + + case 21: + if (!sub_02039218()) { + break; + } + ShowKeyboard(2, ov11_02324D90->field_0x3e, 0, ov11_02324D90->field_0x52); + ov11_02324D90->field_0x0 = 0x12; + break; + + case 22: + ov11_0230D92C(); + ov11_02324D90->field_0x0 = 0x17; + break; + + case 23: + if (ov11_0230D220() != 0) { + break; + } + if (sub_02039218() != 0) { + ov11_02324D90->field_0x0 = 0x18; + } + break; + + case 24: + ov11_0230D000(); + ov11_02324D90->field_0x0 = 0x19; + break; + + case 25: + if (ov11_0230D220() == 0) { + ov11_02324D90->field_0x0 = 0; + } + break; + + case 26: + CloseParentMenu(ov11_02324D90->field_0x4); + ov11_02324D90->field_0x0 = 0x1b; + + case 27: + return 1; + } + return 0; +} + +void ov11_02309DAC(struct unk_02309DAC *out) +{ + struct unk_02324D90 *p = ov11_02324D90; + struct unk_0230A044 *list = p->field_0x11c.field_0x0.field_0x0; + struct unk_0230A044 *e = &list[p->field_0x10]; + + if (e->field_0x0 == 1) { + out->field_0x0 = 0; + out->field_0x4 = e->field_0x4; + return; + } + if (e->field_0x0 == 2) { + out->field_0x0 = 1; + out->field_0x4 = e->field_0x4; + } +} + +void ov11_02309DF8(void) +{ + if (ov11_02324D90 == NULL) { + return; + } + MemFree(ov11_02324D90); + ov11_02324D90 = NULL; +} + +s16 ov11_02309E24(void) +{ + if (ov11_02324D90 != NULL) { + return ov11_02324D90->field_0x10; + } + return -1; +} + +int ov11_02309E48(s16 param_1) +{ + struct unk_02309EE4 *p; + int found = 1; + s32 i; + + p = MemAlloc(sizeof(struct unk_02309EE4), 0); + ov11_02309EE4(p, 2); + for (i = 0; i < p->field_0x30; i++) { + struct unk_0230A044 *e = &p->field_0x0[i]; + + if (e->field_0x0 == 1) { + if (sub_02055FCC(e->field_0x4, param_1)) { + break; + } + } else if (e->field_0x0 == 2) { + if (sub_020586F0(e->field_0x4, param_1)) { + break; + } + } + } + if (i == p->field_0x30) { + found = 0; + } + MemFree(p); + return found; +} From 967fe53b74a9b7b851d008df07dd778f4611c0e0 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 13 Sep 2026 20:29:15 -0700 Subject: [PATCH 25/34] Decompile 17 more callees; clear two asm files; enum item_id gains ITEM_INVALID Two .s files cleared entirely, so main.lsf loses both objects: asm/overlay_29_022FB678.s AreEntitiesAdjacent, IsHero, ov29_022FB718, ov29_022FB83C, ov29_022FB920, ov29_022FB984, ov29_022FB98C, ov29_022FB9BC asm/main_02003328.s TaskProcBoot, EnableAllInterrupts, sub_02003620, sub_02003704, sub_02003754, sub_02003780, sub_020037A4, GetTime, DisableAllInterrupts main_02003328 lands as TWO objects, not one. GetTime calls EnableAllInterrupts, which precedes it in address order, and at -O4,s MWCC folds a callee whose body it has already seen: in one translation unit GetTime's two bl EnableAllInterrupts become the inlined body. So GetTime and DisableAllInterrupts go to a new src/main_020037B4.c; the other seven merge into src/main_0200330C.c. DisableAllInterrupts is not inlined in the same run because it is defined after GetTime, which is the same rule seen from the other side. enum item_id gains ITEM_INVALID = -1, placed as MONSTER_INVALID is in enum monster_id. Under -enum min an enum with no negative enumerator is unsigned, so a field of that type compiles to ldrh where AuraBowIsActive's target has ldrsh; a cast at the call site cannot fix it, which was measured. Range becomes -1..1399, still two bytes. VERIFIED IN ISOLATION -- added alone, nothing else changed, all three ROMs still matching -- so it is byte-neutral for existing code, the same standard ENTITY_NONE and MONSTER_INVALID were held to. Five call-site declarations are replaced by an include of the owning header. Two were wrong, not merely redundant: ov29_022FB984 was declared void where it returns bool8, and ov29_022FB98C was an unprototyped extern int for a function that returns nothing and takes two struct entity *. Authored by Claude (Opus 5) under human direction. Each function was measured at decomp.me score 0 in every region it exists in and re-measured by an independent verifier. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_02003328.inc | 60 ----- asm/include/overlay_29_022FB678.inc | 19 -- asm/main_02003328.s | 392 ---------------------------- asm/overlay_29_022FB678.s | 313 ---------------------- include/dungeon_logic_4.h | 8 + include/item.h | 1 + include/main_0200330C.h | 50 ++++ include/main_020037B4.h | 9 + main.lsf | 3 +- src/dungeon_logic_4.c | 151 +++++++++++ src/main_02000C6C.c | 2 +- src/main_0200330C.c | 269 +++++++++++++++++++ src/main_020037B4.c | 27 ++ src/overlay_11_02307334.c | 1 - src/overlay_29_02306728.c | 2 +- src/overlay_29_02308FBC.c | 1 - src/overlay_29_02311010.c | 2 +- src/overlay_29_0231CBC8.c | 3 +- 18 files changed, 520 insertions(+), 793 deletions(-) delete mode 100644 asm/include/main_02003328.inc delete mode 100644 asm/include/overlay_29_022FB678.inc delete mode 100644 asm/main_02003328.s delete mode 100644 asm/overlay_29_022FB678.s create mode 100644 include/main_020037B4.h create mode 100644 src/main_020037B4.c diff --git a/asm/include/main_02003328.inc b/asm/include/main_02003328.inc deleted file mode 100644 index f5586c29..00000000 --- a/asm/include/main_02003328.inc +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once -.public _020924D8 -.public _020AEF7C -.public _020AEFB4 -.public _020AEFC8 -.public _020AEFDC -.public _020AF000 -.public _020AF028 -.public _020AF050 -.public _020AF078 -.public _020AF154 -.public _0229B220 -.public _0229B248 -.public _0229F248 -.public _fadd -.public _fflt -.public _fmul -.public Debug_Print0 -.public GetHeldButtons -.public GetReleasedStylus -.public GX_VBlankIntr -.public HaltProcessDisp -.public KeyWaitInit -.public MainLoop -.public OS_CreateVAlarm -.public OS_EnableIrqMask -.public OS_InitVAlarm -.public OS_IRQTable -.public OS_SetIrqFunction -.public OS_SetPeriodicVAlarm -.public OS_SleepThread -.public OS_WakeupThreadDirect -.public PM_SetLcdPower -.public Rand16Bit -.public sub_02002580 -.public sub_020025F8 -.public sub_02002628 -.public sub_0200265C -.public sub_02002670 -.public sub_020026B8 -.public sub_02002778 -.public sub_020027E8 -.public sub_020027F8 -.public sub_02002858 -.public sub_02002950 -.public sub_020029A0 -.public sub_020029B8 -.public sub_02002A44 -.public sub_02002C40 -.public sub_02003A40 -.public sub_02003B5C -.public sub_02005EAC -.public sub_02006098 -.public sub_02006D4C -.public sub_02006DEC -.public sub_020082E0 -.public sub_02017D20 -.public sub_0201849C -.public sub_020820E8 -.public WaitForever diff --git a/asm/include/overlay_29_022FB678.inc b/asm/include/overlay_29_022FB678.inc deleted file mode 100644 index 438a1319..00000000 --- a/asm/include/overlay_29_022FB678.inc +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once -.public _020A1870 -.public Conversion2IsActive -.public DIRECTIONS_XY -.public DisplayAnimatedNumbers -.public DUNGEON_PTR -.public EntityIsValid__022F7364 -.public GetMaxPp -.public GetMoveBasePp -.public GetTile -.public IqSkillIsEnabled -.public IsMonster__022F9720 -.public IsSecretBazaarNpcBehavior -.public ov29_02348100 -.public PlayMissSfx__022E611C -.public ResetTypeChanges -.public TeamMemberHasEnabledIqSkill -.public UpdateMapSurveyorFlag -.public UpdateMinimap diff --git a/asm/main_02003328.s b/asm/main_02003328.s deleted file mode 100644 index 5100f2d5..00000000 --- a/asm/main_02003328.s +++ /dev/null @@ -1,392 +0,0 @@ - .include "asm/macros.inc" - .include "main_02003328.inc" - - .text - - arm_func_start TaskProcBoot -TaskProcBoot: ; 0x02003328 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0xc - ldr r0, _020035CC ; =_020AF000 - bl sub_02002950 - ldr r0, _020035D0 ; =_020AF028 - bl sub_02002950 - ldr r0, _020035D4 ; =_020AF050 - bl sub_02002950 - ldr r0, _020035D8 ; =_020AEFDC - bl sub_02002C40 - bl sub_02006D4C - bl sub_02017D20 - ldr r2, _020035DC ; =_0229B248 - ldr r1, _020035E0 ; =_020AEF7C - ldr r0, _020035E4 ; =_020AF078 - str r2, [r1, #0x3c] - ldr r1, _020035E8 ; =_020AEFB4 - mov r2, #0 - bl sub_02002778 - ldr r0, _020035E4 ; =_020AF078 - bl sub_020027E8 - bl OS_InitVAlarm - ldr r0, _020035EC ; =_0229B220 - bl OS_CreateVAlarm - mov r1, #0 - str r1, [sp] - ldr r0, _020035EC ; =_0229B220 - mov r2, #0x64 - ldr r3, _020035F0 ; =sub_02003754 - bl OS_SetPeriodicVAlarm - mov r0, #1 - ldr r1, _020035F4 ; =sub_02003704 - bl OS_SetIrqFunction - mov r0, #1 - bl OS_EnableIrqMask - bl EnableAllInterrupts - mov r0, #1 - bl GX_VBlankIntr - ldr r0, _020035F8 ; =_020AF154 - ldr r1, _020035E0 ; =_020AEF7C - ldr r2, _020035FC ; =_0229F248 - str r0, [r1, #0x24] - str r2, [r1, #0x50] - ldr r1, _02003600 ; =_020AEFC8 - mov r2, #0 - bl sub_02002778 - ldr r0, _020035F8 ; =_020AF154 - bl sub_020027E8 - bl sub_02002580 - ldr r2, _020035E0 ; =_020AEF7C - mov r1, #0xf - str r0, [r2, #0x34] - bl sub_020027F8 - ldr r0, _020035E0 ; =_020AEF7C - mov r1, #2 - ldr r0, [r0, #0x34] - bl sub_02002858 - mov sl, #0 - ldr r1, _020035E0 ; =_020AEF7C - ldr r0, _02003604 ; =_020924D8 - strb sl, [r1, #5] - bl Debug_Print0 - mov r8, #1 - ldr r4, _020035E0 ; =_020AEF7C - mov r6, sl - mov sb, sl - mov r7, r8 - mov r5, sl - mov fp, r8 -_0200343C: - add r0, sp, #4 - mov r1, #0xb - bl sub_02002628 - ldrb r0, [r4, #7] - cmp r0, #0 - strneb sb, [r4, #7] - bne _02003460 - ldr r0, _020035D4 ; =_020AF050 - bl sub_02002A44 -_02003460: - cmp sl, #0 - beq _020034A8 - ldrb r0, [r4, #6] - cmp r0, #0 - ldrneb r0, [r4] - cmpne r0, #0 - beq _020034C8 - ldr r0, _020035CC ; =_020AF000 - strb r8, [r4, #3] - bl sub_020029A0 - ldr r0, _020035D0 ; =_020AF028 - bl sub_02002A44 - bl sub_02002670 - ldr r0, [r4, #0x10] - cmp r0, #0 - moveq sl, #0 - bl sub_020026B8 - b _020034C8 -_020034A8: - bl sub_02002670 - ldr sl, [r4, #0x10] - bl sub_020026B8 - cmp sl, #0 - beq _020034C8 - ldr r0, _020035D0 ; =_020AF028 - strb r7, [r4, #3] - bl sub_02002A44 -_020034C8: - add r0, sp, #4 - bl sub_0200265C - bl sub_02002670 - ldr r0, [r4, #0x10] - cmp r0, #0 - movne sl, r0 - cmp sl, #0 - beq _02003518 - ldrb r0, [r4, #3] - cmp r0, #0 - strneb r6, [r4] - str sl, [r4, #0x18] - bl sub_020026B8 - ldr r0, [r4, #0x30] - add r0, r0, #1 - str r0, [r4, #0x30] - bl sub_02006098 - blx sl - strb r0, [r4, #6] - b _02003530 -_02003518: - bl sub_020026B8 - bl sub_02003A40 - bl sub_02002670 - str r5, [r4, #0x18] - strb fp, [r4, #6] - bl sub_020026B8 -_02003530: - ldrb r0, [r4, #0xd] - cmp r0, #0 - beq _02003544 - mov r0, #0 - bl sub_020025F8 -_02003544: - ldrb r0, [r4, #2] - cmp r0, #0 - beq _0200343C - bl sub_02003B5C - cmp r0, #0 - beq _020035A8 - ldrb r0, [r4, #1] - cmp r0, #0 - beq _02003584 - mov r0, #0 - mov r1, #0 - strb r0, [r4, #0xb] - mov r0, #0xc - mov r2, r1 - bl sub_020820E8 - b _0200343C -_02003584: - ldr r0, [r4, #0x14] - cmp r0, #0 - bne _0200343C - mov r0, #0 - bl PM_SetLcdPower - cmp r0, #0 - movne r0, #1 - strne r0, [r4, #0x14] - b _0200343C -_020035A8: - ldr r0, [r4, #0x14] - cmp r0, #0 - beq _0200343C - mov r0, #1 - bl PM_SetLcdPower - cmp r0, #0 - movne r0, #0 - strne r0, [r4, #0x14] - b _0200343C - .align 2, 0 -_020035CC: .word _020AF000 -_020035D0: .word _020AF028 -_020035D4: .word _020AF050 -_020035D8: .word _020AEFDC -_020035DC: .word _0229B248 -_020035E0: .word _020AEF7C -_020035E4: .word _020AF078 -_020035E8: .word _020AEFB4 -_020035EC: .word _0229B220 -_020035F0: .word sub_02003754 -_020035F4: .word sub_02003704 -_020035F8: .word _020AF154 -_020035FC: .word _0229F248 -_02003600: .word _020AEFC8 -_02003604: .word _020924D8 - arm_func_end TaskProcBoot - - arm_func_start EnableAllInterrupts -EnableAllInterrupts: ; 0x02003608 - ldr r2, _0200361C ; =0x04000208 - mov r1, #1 - ldrh r0, [r2] - strh r1, [r2] - bx lr - .align 2, 0 -_0200361C: .word 0x04000208 - arm_func_end EnableAllInterrupts - - arm_func_start sub_02003620 -sub_02003620: ; 0x02003620 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x28 - mov r7, #0 - ldr fp, _020036FC ; =_020AF050 - ldr r4, _02003700 ; =_020AEF7C - add r6, sp, #0 - add r5, sp, #4 - mov r8, #1 - mov sb, r7 - mov sl, r7 -_02003648: - mov r0, sl - bl OS_SleepThread - ldr r0, [r4, #0x28] - add r0, r0, #1 - str r0, [r4, #0x28] - ldrb r0, [r4, #0xd] - cmp r0, #0 - beq _02003674 - mov r0, sb - bl HaltProcessDisp - b _02003688 -_02003674: - ldrb r0, [r4, #0xc] - cmp r0, #0 - beq _02003688 - mov r0, r8 - bl HaltProcessDisp -_02003688: - ldrb r0, [r4, #1] - cmp r0, #0 - bne _020036AC - bl sub_02003B5C - cmp r0, #0 - beq _020036AC - ldrb r0, [r4, #8] - cmp r0, #0 - beq _020036E8 -_020036AC: - bl sub_02006DEC - bl Rand16Bit - mov r0, r7 - mov r1, r6 - bl GetHeldButtons - mov r0, r5 - bl GetReleasedStylus - ldrh r0, [sp] - cmp r0, #0 - bne _020036E0 - ldrh r0, [sp, #4] - tst r0, #1 - beq _020036EC -_020036E0: - bl Rand16Bit - b _020036EC -_020036E8: - bl KeyWaitInit -_020036EC: - mov r0, fp - bl sub_020029B8 - bl sub_0201849C - b _02003648 - .align 2, 0 -_020036FC: .word _020AF050 -_02003700: .word _020AEF7C - arm_func_end sub_02003620 - - arm_func_start sub_02003704 -sub_02003704: ; 0x02003704 - stmdb sp!, {r3, lr} - ldr r0, _0200374C ; =OS_IRQTable - ldr r1, _02003750 ; =_020AEF7C - add r0, r0, #0x3000 - ldr r2, [r0, #0xff8] - orr r2, r2, #1 - str r2, [r0, #0xff8] - ldr r0, [r1, #0x20] - add r0, r0, #1 - str r0, [r1, #0x20] - ldrb r0, [r1, #9] - cmp r0, #0 - beq _02003744 - ldr r0, [r1, #0x34] - ldr r0, [r0] - bl OS_WakeupThreadDirect -_02003744: - bl sub_020082E0 - ldmia sp!, {r3, pc} - .align 2, 0 -_0200374C: .word OS_IRQTable -_02003750: .word _020AEF7C - arm_func_end sub_02003704 - - arm_func_start sub_02003754 -sub_02003754: ; 0x02003754 - ldr r1, _02003774 ; =_020AEF7C - ldr r0, _02003778 ; =_020AF078 - ldr r2, [r1, #0x1c] - ldr ip, _0200377C ; =OS_WakeupThreadDirect - add r2, r2, #1 - ldr r0, [r0] - str r2, [r1, #0x1c] - bx ip - .align 2, 0 -_02003774: .word _020AEF7C -_02003778: .word _020AF078 -_0200377C: .word OS_WakeupThreadDirect - arm_func_end sub_02003754 - - arm_func_start sub_02003780 -sub_02003780: ; 0x02003780 - stmdb sp!, {r3, lr} - bl sub_02005EAC - ldr r0, _020037A0 ; =_020AEF7C - mov r1, #1 - strb r1, [r0] - bl MainLoop - bl WaitForever - ldmia sp!, {r3, pc} - .align 2, 0 -_020037A0: .word _020AEF7C - arm_func_end sub_02003780 - - arm_func_start sub_020037A4 -sub_020037A4: ; 0x020037A4 - ldr r0, _020037B0 ; =_020AEF7C - ldr r0, [r0, #0x28] - bx lr - .align 2, 0 -_020037B0: .word _020AEF7C - arm_func_end sub_020037A4 - - arm_func_start GetTime -GetTime: ; 0x020037B4 - stmdb sp!, {r3, r4, r5, lr} - bl DisableAllInterrupts - ldr r0, _02003818 ; =_020AEF7C - ldr r1, [r0, #0x1c] - cmp r1, #0 - bne _020037D8 - bl EnableAllInterrupts - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} -_020037D8: - ldr r1, _0200381C ; =0x04000006 - ldr r4, [r0, #0x1c] - ldrh r5, [r1] - bl EnableAllInterrupts - mov r0, r4 - bl _fflt - mov r4, r0 - mov r0, r5 - bl _fflt - mov r1, r0 - ldr r0, _02003820 ; =0x3B792FB2 - bl _fmul - mov r1, r0 - mov r0, r4 - bl _fadd - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02003818: .word _020AEF7C -_0200381C: .word 0x04000006 -_02003820: .word 0x3B792FB2 - arm_func_end GetTime - - arm_func_start DisableAllInterrupts -DisableAllInterrupts: ; 0x02003824 - ldr r2, _02003838 ; =0x04000208 - mov r1, #0 - ldrh r0, [r2] - strh r1, [r2] - bx lr - .align 2, 0 -_02003838: .word 0x04000208 - arm_func_end DisableAllInterrupts diff --git a/asm/overlay_29_022FB678.s b/asm/overlay_29_022FB678.s deleted file mode 100644 index 3a31539c..00000000 --- a/asm/overlay_29_022FB678.s +++ /dev/null @@ -1,313 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022FB678.inc" - - .text - - arm_func_start AreEntitiesAdjacent -AreEntitiesAdjacent: ; 0x022FB678 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r0 - mov r6, r1 - mov r5, #0 - ldr r4, _022FB6E0 ; =DIRECTIONS_XY - b _022FB6D0 -_022FB690: - mov r1, r5, lsl #2 - add r0, r4, r5, lsl #2 - ldrsh r3, [r4, r1] - ldrsh ip, [r7, #4] - ldrsh r1, [r0, #2] - ldrsh r2, [r7, #6] - add r0, ip, r3 - add r1, r2, r1 - bl GetTile - ldr r0, [r0, #0xc] - cmp r0, r6 - moveq r0, #1 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 -_022FB6D0: - cmp r5, #8 - blt _022FB690 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_022FB6E0: .word DIRECTIONS_XY - arm_func_end AreEntitiesAdjacent - - arm_func_start IsHero -IsHero: ; 0x022FB6E4 - stmdb sp!, {r4, lr} - mov r4, r0 - bl IsMonster__022F9720 - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - ldr r0, [r4, #0xb4] - ldrb r0, [r0, #0x48] - cmp r0, #0xd6 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - ldmia sp!, {r4, pc} - arm_func_end IsHero - - arm_func_start ov29_022FB718 -ov29_022FB718: ; 0x022FB718 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov sl, r0 - bl EntityIsValid__022F7364 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldr sb, [sl, #0xb4] - mov r1, #0 - mov r0, sl - strh r1, [sb, #0x16] - bl Conversion2IsActive - mov r6, r0 - mov r0, sl - mov r1, #0x38 - ldr r4, [sl, #0xb4] - bl IqSkillIsEnabled - cmp r0, #0 - ldrne r0, _022FB834 ; =_020A1870 - mov r8, #0 - ldrnesh r1, [r4, #0x16] - ldrnesh r0, [r0] -#ifdef JAPAN - add r5, r4, #0x120 -#else - add r5, r4, #0x124 -#endif - mov fp, r8 - addne r0, r1, r0 - strneh r0, [r4, #0x16] - mov r4, #1 -_022FB77C: - ldrb r0, [r5, r8, lsl #3] - add r7, r5, r8, lsl #3 - tst r0, #1 - movne r0, r4 - moveq r0, fp - tst r0, #0xff - beq _022FB7C0 - ldrh r2, [r7, #2] - mov r0, sl - mov r1, #0x39 - bic r2, r2, #0x100 - strh r2, [r7, #2] - bl IqSkillIsEnabled - cmp r0, #0 - ldrneh r0, [r7, #2] - orrne r0, r0, #0x100 - strneh r0, [r7, #2] -_022FB7C0: - add r0, r8, #1 - mov r0, r0, lsl #0x10 - mov r8, r0, asr #0x10 - cmp r8, #4 - blt _022FB77C - mov r0, sl - bl ov29_02348100 - cmp r6, #2 - bne _022FB7FC - mov r0, sl - bl Conversion2IsActive - cmp r0, #0 - bne _022FB7FC - mov r0, sl - bl ResetTypeChanges -_022FB7FC: - ldrsh r1, [sb, #0x12] - ldrsh r0, [sb, #0x16] - ldr r2, _022FB838 ; =0x000003E7 - add r1, r1, r0 - cmp r1, r2 - ldrsh r0, [sb, #0x10] - movle r2, r1 - cmp r0, r2 - ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldr r0, _022FB838 ; =0x000003E7 - cmp r1, r0 - movgt r1, r0 - strh r1, [sb, #0x10] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022FB834: .word _020A1870 -_022FB838: .word 0x000003E7 - arm_func_end ov29_022FB718 - - arm_func_start ov29_022FB83C -ov29_022FB83C: ; 0x022FB83C - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov sl, r0 - mov sb, r1 - bl EntityIsValid__022F7364 - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - ldr r8, [sl, #0xb4] - mov r7, #0 -#ifdef JAPAN - add r6, r8, #0x120 -#else - add r6, r8, #0x124 -#endif - mov r4, r7 - mov r5, #1 -_022FB868: - ldrb r0, [r6, r7, lsl #3] - mov r1, r7, lsl #3 - tst r0, #1 - movne r0, r5 - moveq r0, r4 - tst r0, #0xff - beq _022FB88C - add r0, r6, r1 - bl GetMoveBasePp -_022FB88C: - add r0, r7, #1 - mov r0, r0, lsl #0x10 - mov r7, r0, asr #0x10 - cmp r7, #4 - blt _022FB868 - mov r0, sl - bl ov29_022FB718 - cmp sb, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - ldrsh r2, [r8, #0x12] - ldrsh r1, [r8, #0x16] - ldr r0, _022FB91C ; =0x000003E7 - mov sb, #0 - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - strh r1, [r8, #0x10] -#ifdef JAPAN - add r6, r8, #0x120 -#else - add r6, r8, #0x124 -#endif - mov r4, sb - mov r5, #1 -_022FB8DC: - ldrb r0, [r6, sb, lsl #3] - add r7, r6, sb, lsl #3 - tst r0, #1 - movne r0, r5 - moveq r0, r4 - tst r0, #0xff - beq _022FB904 - mov r0, r7 - bl GetMaxPp - strb r0, [r7, #6] -_022FB904: - add r0, sb, #1 - mov r0, r0, lsl #0x10 - mov sb, r0, asr #0x10 - cmp sb, #4 - blt _022FB8DC - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_022FB91C: .word 0x000003E7 - arm_func_end ov29_022FB83C - - arm_func_start ov29_022FB920 -ov29_022FB920: ; 0x022FB920 -#ifdef EUROPE - stmdb sp!, {r4, r5, r6, lr} - ldr r5, _022FB980 ; =DUNGEON_PTR - mov r4, r0 - mov r6, #0 -_022FC33C_EU: - ldr r0, [r5] - add r0, r0, r6, lsl #2 - add r0, r0, #0x12000 - ldr r0, [r0, #0xb28] - bl ov29_022FB718 - add r0, r6, #1 - mov r0, r0, lsl #0x10 - mov r6, r0, asr #0x10 - cmp r6, #4 - blt _022FC33C_EU - bl UpdateMapSurveyorFlag - cmp r0, #0 - cmpne r4, #0 - ldmeqia sp!, {r4, r5, r6, pc} - bl UpdateMinimap - ldmia sp!, {r4, r5, r6, pc} -#else - stmdb sp!, {r3, r4, r5, lr} - ldr r4, _022FB980 ; =DUNGEON_PTR - mov r5, #0 -_022FB92C: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r0, [r0, #0xa84] -#else - ldr r0, [r0, #0xb28] -#endif - bl ov29_022FB718 - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 - cmp r5, #4 - blt _022FB92C - mov r0, #0x41 - bl TeamMemberHasEnabledIqSkill - cmp r0, #0 - ldrne r0, _022FB980 ; =DUNGEON_PTR - movne r1, #1 - ldreq r0, _022FB980 ; =DUNGEON_PTR - moveq r1, #0 - ldr r0, [r0] - add r0, r0, #0x1a000 -#ifdef JAPAN - strb r1, [r0, #0x19d] -#else - strb r1, [r0, #0x241] -#endif - ldmia sp!, {r3, r4, r5, pc} -#endif - .align 2, 0 -_022FB980: .word DUNGEON_PTR - arm_func_end ov29_022FB920 - - arm_func_start ov29_022FB984 -ov29_022FB984: ; 0x022FB984 - mov r0, #0 - bx lr - arm_func_end ov29_022FB984 - - arm_func_start ov29_022FB98C -ov29_022FB98C: ; 0x022FB98C - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r2, #1 - ldr r0, _022FB9B8 ; =0x0000270F - mov r4, r1 - sub r3, r2, #2 - bl DisplayAnimatedNumbers - mov r0, r5 - mov r1, r4 - bl PlayMissSfx__022E611C - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_022FB9B8: .word 0x0000270F - arm_func_end ov29_022FB98C - - arm_func_start ov29_022FB9BC -ov29_022FB9BC: ; 0x022FB9BC - stmdb sp!, {r3, lr} - ldr r0, [r0, #0xb4] - ldrb r0, [r0, #0xbc] - bl IsSecretBazaarNpcBehavior - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - arm_func_end ov29_022FB9BC diff --git a/include/dungeon_logic_4.h b/include/dungeon_logic_4.h index ea2df186..dad97bd2 100644 --- a/include/dungeon_logic_4.h +++ b/include/dungeon_logic_4.h @@ -5,5 +5,13 @@ // Checks if the entity passed is a valid monster, and if it's at low health (below 25% rounded down) bool8 HasLowHealth(struct entity *entity); +bool8 AreEntitiesAdjacent(struct entity *entity, struct entity *other); +bool8 IsHero(struct entity *entity); +void ov29_022FB718(struct entity *entity); +void ov29_022FB83C(struct entity *entity, bool8 a); +void ov29_022FB920(bool8 a); +bool8 ov29_022FB984(struct entity *entity); +void ov29_022FB98C(struct entity *attacker, struct entity *defender); +bool8 ov29_022FB9BC(struct entity *entity); #endif //PMDSKY_DUNGEON_LOGIC_4_H diff --git a/include/item.h b/include/item.h index 15d22d59..f1397120 100644 --- a/include/item.h +++ b/include/item.h @@ -6,6 +6,7 @@ // Item ID enum item_id { + ITEM_INVALID = -1, ITEM_NOTHING = 0, ITEM_STICK = 1, ITEM_IRON_THORN = 2, diff --git a/include/main_0200330C.h b/include/main_0200330C.h index 24abf62d..19f43d8d 100644 --- a/include/main_0200330C.h +++ b/include/main_0200330C.h @@ -14,5 +14,55 @@ void Memset32(u32* ptr, u32 val, s32 len); void MemcpySimple(u8* dest, u8* src, s32 n); void Memcpy16(u16* dest, u16* src, s32 n); void Memcpy32(u32* dest, u32* src, s32 n); +struct unk_020027E8; + +struct unk_020AEFB4 { + void (*field_0x0)(void *); + void *field_0x4; + u32 field_0x8; + u32 field_0xc; + u32 field_0x10; +}; + +struct unk_020AEF7C { + u8 field_0x0; + u8 field_0x1; + u8 field_0x2; + u8 field_0x3; + u8 field_0x4; + u8 field_0x5; + u8 field_0x6; + u8 field_0x7; + u8 field_0x8; + u8 field_0x9; + u8 field_0xa; + u8 field_0xb; + u8 field_0xc; + u8 field_0xd; + u8 field_0xe; + u8 field_0xf; + u8 (*field_0x10)(void); + s32 field_0x14; + u8 (*field_0x18)(void); + volatile s32 field_0x1c; + volatile s32 field_0x20; + struct unk_020027E8 *field_0x24; + s32 field_0x28; + s32 field_0x2c; + s32 field_0x30; + struct unk_020027E8 *field_0x34; + struct unk_020AEFB4 field_0x38; + struct unk_020AEFB4 field_0x4c; +}; + +extern struct unk_020AEF7C _020AEF7C; + +void TaskProcBoot(void); +u16 EnableAllInterrupts(void); +void sub_02003620(void *arg); +void sub_02003704(void); +void sub_02003754(void *arg); +void sub_02003780(void *arg); +s32 sub_020037A4(void); #endif //PMDSKY_MAIN_0200330C_H diff --git a/include/main_020037B4.h b/include/main_020037B4.h new file mode 100644 index 00000000..1cb2c993 --- /dev/null +++ b/include/main_020037B4.h @@ -0,0 +1,9 @@ +#ifndef PMDSKY_MAIN_020037B4_H +#define PMDSKY_MAIN_020037B4_H + +#include "main_0200330C.h" + +float GetTime(void); +u16 DisableAllInterrupts(void); + +#endif //PMDSKY_MAIN_020037B4_H diff --git a/main.lsf b/main.lsf index bba8d585..dcf2cff4 100644 --- a/main.lsf +++ b/main.lsf @@ -28,7 +28,7 @@ Static main Object src/main_020027E8.o Object asm/main_02002910.o Object src/main_0200330C.o - Object asm/main_02003328.o + Object src/main_020037B4.o Object src/main_0200383C.o Object asm/main_020038D8.o Object src/main_02003D2C.o @@ -907,7 +907,6 @@ Overlay OVY_29 Object asm/overlay_29_022FACBC.o Object src/overlay_29_022FB538.o Object src/dungeon_logic_4.o - Object asm/overlay_29_022FB678.o Object src/overlay_29_022FBA54.o Object src/joined_at_checks.o Object asm/overlay_29_022FBB1C.o diff --git a/src/dungeon_logic_4.c b/src/dungeon_logic_4.c index 74c98472..a36c714e 100644 --- a/src/dungeon_logic_4.c +++ b/src/dungeon_logic_4.c @@ -1,6 +1,27 @@ #include "dungeon_logic_4.h" #include "dungeon_util_static.h" #include "overlay_29_022F7364.h" +#include "dungeon.h" +#include "dungeon_logic_6.h" +#include "dungeon_map_access.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_util.h" +#include "inflict_status.h" +#include "move_effects.h" +#include "moves.h" +#include "moves_4.h" +#include "overlay_29_022F9720.h" + +extern struct dungeon *DUNGEON_PTR[]; +extern const s16 _020A1870; +bool8 ov29_02348100(struct entity *entity); +void ResetTypeChanges(struct entity *entity); +bool8 TeamMemberHasEnabledIqSkill(enum iq_skill_id iq_skill); +bool8 UpdateMapSurveyorFlag(void); +void UpdateMinimap(void); +void DisplayAnimatedNumbers(s32 amount, struct entity *entity, + bool8 display_sign, s32 number_color); +void PlayMissSfx__022E611C(struct entity *attacker, struct entity *defender); bool8 HasLowHealth(struct entity *entity) { @@ -17,3 +38,133 @@ bool8 HasLowHealth(struct entity *entity) return pokemon_info->hp < max_hp / 4; } + +bool8 AreEntitiesAdjacent(struct entity *entity, struct entity *other) +{ + s16 i; + + for (i = 0; i < NUM_DIRECTIONS; i++) { + if (GetTile(entity->pos.x + DIRECTIONS_XY[i].x, + entity->pos.y + DIRECTIONS_XY[i].y)->monster == other) + return TRUE; + } + + return FALSE; +} + +bool8 IsHero(struct entity *entity) +{ + enum dungeon_id joined_at; + + if (!IsMonster__022F9720(entity)) + return FALSE; + + joined_at = GetEntInfo(entity)->joined_at; + return joined_at == DUNGEON_JOINED_AT_QUESTION_MARKS; +} + +void ov29_022FB718(struct entity *entity) +{ + struct monster *info; + struct monster *info2; + s32 max_hp; + u8 conversion2; + struct move *move; + s16 i; + + if (!EntityIsValid__022F7364(entity)) + return; + + info = GetEntInfo(entity); + info->max_hp_boost = 0; + conversion2 = Conversion2IsActive(entity); + + info2 = GetEntInfo(entity); + if (IqSkillIsEnabled(entity, IQ_BRICK_TOUGH)) + info2->max_hp_boost += _020A1870; + + for (i = 0; i < MAX_MON_MOVES; i++) { + move = &info2->moves.moves[i]; + if (MoveExists(move)) { + move->flags2 &= ~MOVE_FLAG_MULTITALENT_PP_BOOST; + if (IqSkillIsEnabled(entity, IQ_MULTITALENT)) + move->flags2 |= MOVE_FLAG_MULTITALENT_PP_BOOST; + } + } + + ov29_02348100(entity); + if (conversion2 == EFFECT_ACTIVE_FROM_EXCLUSIVE_ITEM && !Conversion2IsActive(entity)) + ResetTypeChanges(entity); + + max_hp = info->max_hp_stat + info->max_hp_boost; + if (info->hp > (max_hp > MAX_HP_LIMIT ? MAX_HP_LIMIT : max_hp)) + info->hp = max_hp > MAX_HP_LIMIT ? MAX_HP_LIMIT : max_hp; +} + +void ov29_022FB83C(struct entity *entity, bool8 a) +{ + struct monster *info; + s32 max_hp; + s16 i; + + if (!EntityIsValid__022F7364(entity)) + return; + + info = GetEntInfo(entity); + + for (i = 0; i < MAX_MON_MOVES; i++) { + struct move *move = &info->moves.moves[i]; + if (MoveExists(move)) + GetMoveBasePp(move); + } + + ov29_022FB718(entity); + if (!a) + return; + + max_hp = info->max_hp_stat + info->max_hp_boost; + if (max_hp > MAX_HP_LIMIT) + max_hp = MAX_HP_LIMIT; + info->hp = max_hp; + + for (i = 0; i < MAX_MON_MOVES; i++) { + struct move *move = &info->moves.moves[i]; + if (MoveExists(move)) + move->pp = GetMaxPp(move); + } +} + +void ov29_022FB920(bool8 a) +{ + s16 i; + + for (i = 0; i < MAX_TEAM_MEMBERS; i++) + ov29_022FB718(DUNGEON_PTR[0]->monster_slots.party_members[i]); + +#ifdef EUROPE + if (UpdateMapSurveyorFlag() && a) + UpdateMinimap(); +#else + if (TeamMemberHasEnabledIqSkill(IQ_MAP_SURVEYOR)) + DUNGEON_PTR[0]->display_data.map_surveyor = TRUE; + else + DUNGEON_PTR[0]->display_data.map_surveyor = FALSE; +#endif +} + +bool8 ov29_022FB984(struct entity *entity) +{ + return FALSE; +} + +void ov29_022FB98C(struct entity *attacker, struct entity *defender) +{ + DisplayAnimatedNumbers(9999, defender, TRUE, -1); + PlayMissSfx__022E611C(attacker, defender); +} + +bool8 ov29_022FB9BC(struct entity *entity) +{ + return IsSecretBazaarNpcBehavior(GetEntInfo(entity)->monster_behavior) + ? TRUE : FALSE; +} diff --git a/src/main_02000C6C.c b/src/main_02000C6C.c index 14c61859..f36c6fcf 100644 --- a/src/main_02000C6C.c +++ b/src/main_02000C6C.c @@ -1,6 +1,7 @@ #include "main_02000C6C.h" #include #include "main_0200224C.h" +#include "main_0200330C.h" extern u32 _02092448; extern u32 _02092460; @@ -31,7 +32,6 @@ extern void Card_SetPulledOutCallback(void (*)); extern void Debug_Init(); extern void Debug_Print0(u32*, u32, u32); extern void InitMemAllocTableVeneer(); -extern void TaskProcBoot(); extern void WaitForInterrupt(); void NitroMain(void) diff --git a/src/main_0200330C.c b/src/main_0200330C.c index 2e1f034a..832a75be 100644 --- a/src/main_0200330C.c +++ b/src/main_0200330C.c @@ -1,4 +1,90 @@ #include "main_0200330C.h" +#include "main_020027E8.h" +#include "main_0200224C.h" +#include "main_0200238C.h" +#include + +struct unk_0229B220 { + u8 field_0x0[0x28]; +}; + +struct unk_020AEFDC { + OSMutex field_0x0; + struct unk_020027E8 *field_0x18; + s32 field_0x1c; + s32 field_0x20; +}; + +struct unk_020AF000 { + OSMessage *field_0x0; + OSMessage field_0x4; + OSMessageQueue field_0x8; +}; + +struct unk_02006C1C { + u16 field_0x0; + u16 field_0x2; + s32 field_0x4; + s32 field_0x8; + s32 field_0xc; + s32 field_0x10; + s32 field_0x14; + s32 field_0x18; + s32 field_0x1c; + s32 field_0x20; +}; + +extern struct unk_0229B220 _0229B220; +extern struct unk_020AEFB4 _020AEFB4; +extern struct unk_020AEFB4 _020AEFC8; +extern struct unk_020AEFDC _020AEFDC; +extern struct unk_020AF000 _020AF000; +extern struct unk_020AF000 _020AF028; +extern struct unk_020AF000 _020AF050; +extern struct unk_020027E8 _020AF078; +extern struct unk_020027E8 _020AF154; +extern u8 _0229B248[0x4000]; +extern u8 _0229F248[0x4000]; +extern u8 _020924D8[]; +extern u32 OS_IRQTable[]; + +void OS_InitVAlarm(void); +void OS_CreateVAlarm(struct unk_0229B220 *alarm); +void OS_SetPeriodicVAlarm(struct unk_0229B220 *alarm, s32 tick, s32 delay, + void (*handler)(void *), void *arg); +void OS_SetIrqFunction(u32 mask, void (*func)(void)); +u32 OS_EnableIrqMask(u32 mask); +u32 PM_SetLcdPower(u32 sw); + +bool8 GetHeldButtons(s32 index, u16 *out); +void GetReleasedStylus(struct unk_02006C1C *out); +void KeyWaitInit(void); +void HaltProcessDisp(s32 a); +void MainLoop(void); + +struct unk_020027E8 *sub_02002580(void); +void sub_02002628(void *a, u32 b); +void sub_0200265C(void *a); +void sub_02002670(void); +void sub_020026B8(void); +void sub_02002778(struct unk_020027E8 *task, + const struct unk_020AEFB4 *desc, void *arg); +void sub_02002950(struct unk_020AF000 *a); +void sub_020029A0(struct unk_020AF000 *a); +void sub_020029B8(struct unk_020AF000 *a); +void sub_02002A44(struct unk_020AF000 *a); +void sub_02002C40(struct unk_020AEFDC *a); +void sub_020025F8(u32 a); +void sub_02003A40(void); +bool8 sub_02003B5C(void); +void sub_02005EAC(void); +void sub_02006098(void); +void sub_02006D4C(void); +void sub_02006DEC(void); +void sub_020082E0(void); +void sub_020820E8(s32 a, s32 b, s32 c); +void sub_02017D20(void); +void sub_0201849C(void); void ZInit8(struct iovec* ptr) { @@ -73,3 +159,186 @@ void Memcpy32(u32* dest, u32* src, s32 n) n -= 4; } } + +void TaskProcBoot(void) +{ + u32 temp[2]; + u8 (*fn)(void); + + sub_02002950(&_020AF000); + sub_02002950(&_020AF028); + sub_02002950(&_020AF050); + sub_02002C40(&_020AEFDC); + sub_02006D4C(); + sub_02017D20(); + + _020AEF7C.field_0x38.field_0x4 = _0229B248; + sub_02002778(&_020AF078, &_020AEFB4, NULL); + sub_020027E8(&_020AF078); + + OS_InitVAlarm(); + OS_CreateVAlarm(&_0229B220); + OS_SetPeriodicVAlarm(&_0229B220, 0, 100, sub_02003754, NULL); + OS_SetIrqFunction(1, sub_02003704); + OS_EnableIrqMask(1); + EnableAllInterrupts(); + GX_VBlankIntr(TRUE); + + _020AEF7C.field_0x24 = &_020AF154; + _020AEF7C.field_0x4c.field_0x4 = _0229F248; + sub_02002778(&_020AF154, &_020AEFC8, NULL); + sub_020027E8(&_020AF154); + + _020AEF7C.field_0x34 = sub_02002580(); + sub_020027F8(_020AEF7C.field_0x34, 0xF); + sub_02002858(_020AEF7C.field_0x34, 2); + + fn = NULL; + _020AEF7C.field_0x5 = 0; + Debug_Print0(_020924D8); + + while (TRUE) { + sub_02002628(temp, 0xB); + if (_020AEF7C.field_0x7 != 0) { + _020AEF7C.field_0x7 = 0; + } else { + sub_02002A44(&_020AF050); + } + + if (fn != NULL) { + if (_020AEF7C.field_0x6 != 0 && _020AEF7C.field_0x0 != 0) { + _020AEF7C.field_0x3 = 1; + sub_020029A0(&_020AF000); + sub_02002A44(&_020AF028); + sub_02002670(); + if (_020AEF7C.field_0x10 == NULL) { + fn = NULL; + } + sub_020026B8(); + } + } else { + sub_02002670(); + fn = _020AEF7C.field_0x10; + sub_020026B8(); + if (fn != NULL) { + _020AEF7C.field_0x3 = 1; + sub_02002A44(&_020AF028); + } + } + + sub_0200265C(temp); + sub_02002670(); + if (_020AEF7C.field_0x10 != NULL) { + fn = _020AEF7C.field_0x10; + } + if (fn != NULL) { + if (_020AEF7C.field_0x3 != 0) { + _020AEF7C.field_0x0 = 0; + } + _020AEF7C.field_0x18 = fn; + sub_020026B8(); + _020AEF7C.field_0x30 += 1; + sub_02006098(); + _020AEF7C.field_0x6 = fn(); + } else { + sub_020026B8(); + sub_02003A40(); + sub_02002670(); + _020AEF7C.field_0x18 = NULL; + _020AEF7C.field_0x6 = 1; + sub_020026B8(); + } + + if (_020AEF7C.field_0xd != 0) { + sub_020025F8(0); + } + + if (_020AEF7C.field_0x2 != 0) { + if (sub_02003B5C()) { + if (_020AEF7C.field_0x1 != 0) { + _020AEF7C.field_0xb = 0; + sub_020820E8(0xC, 0, 0); + } else if (_020AEF7C.field_0x14 == 0) { + if (PM_SetLcdPower(0)) { + _020AEF7C.field_0x14 = 1; + } + } + } else if (_020AEF7C.field_0x14 != 0) { + if (PM_SetLcdPower(1)) { + _020AEF7C.field_0x14 = 0; + } + } + } + } +} + +u16 EnableAllInterrupts(void) +{ + u16 old; + + old = reg_OS_IME; + reg_OS_IME = 1; + return old; +} + +void sub_02003620(void *arg) +{ + u16 buttons; + struct unk_02006C1C stylus; + + while (TRUE) { + OS_SleepThread(NULL); + _020AEF7C.field_0x28 += 1; + + if (_020AEF7C.field_0xd != 0) { + HaltProcessDisp(0); + } else if (_020AEF7C.field_0xc != 0) { + HaltProcessDisp(1); + } + + if (_020AEF7C.field_0x1 != 0 || !sub_02003B5C() || _020AEF7C.field_0x8 != 0) { + sub_02006DEC(); + Rand16Bit(); + GetHeldButtons(0, &buttons); + GetReleasedStylus(&stylus); + if (buttons != 0 || (stylus.field_0x0 & 1)) { + Rand16Bit(); + } + } else { + KeyWaitInit(); + } + + sub_020029B8(&_020AF050); + sub_0201849C(); + } +} + +void sub_02003704(void) +{ + *(vu32 *)((u32)OS_IRQTable + 0x3ff8) |= 1; + _020AEF7C.field_0x20 += 1; + if (_020AEF7C.field_0x9 != 0) { + OS_WakeupThreadDirect(_020AEF7C.field_0x34->field_0x0); + } + sub_020082E0(); +} + +void sub_02003754(void *arg) +{ + _020AEF7C.field_0x1c += 1; + OS_WakeupThreadDirect(_020AF078.field_0x0); +} + +void sub_02003780(void *arg) +{ + sub_02005EAC(); + _020AEF7C.field_0x0 = 1; + MainLoop(); + WaitForever(); +} + +s32 sub_020037A4(void) +{ + return _020AEF7C.field_0x28; +} + diff --git a/src/main_020037B4.c b/src/main_020037B4.c new file mode 100644 index 00000000..860d6e49 --- /dev/null +++ b/src/main_020037B4.c @@ -0,0 +1,27 @@ +#include "main_020037B4.h" + +float GetTime(void) +{ + s32 frames; + s32 vcount; + + DisableAllInterrupts(); + if (_020AEF7C.field_0x1c == 0) { + EnableAllInterrupts(); + return 0.0f; + } + + frames = _020AEF7C.field_0x1c; + vcount = reg_GX_VCOUNT; + EnableAllInterrupts(); + return (float)frames + (1.0f / 263.0f) * (float)vcount; +} + +u16 DisableAllInterrupts(void) +{ + u16 old; + + old = reg_OS_IME; + reg_OS_IME = 0; + return old; +} diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index fe283c43..7d42a34e 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -211,7 +211,6 @@ extern u8 PopInventoryMenuField0x1A3(s32 window_id); extern void SortItemsInBag(void); extern void *memcpy(void *, const void *, u32); extern s32 ov11_02307300(s32, s32, s32); -extern s32 sub_020037A4(void); extern void sub_0203FD14(u16 move_id); extern struct move *sub_0203FD2C(void); extern void *sub_0203FD38(void); diff --git a/src/overlay_29_02306728.c b/src/overlay_29_02306728.c index 35ddb696..b9cf7178 100644 --- a/src/overlay_29_02306728.c +++ b/src/overlay_29_02306728.c @@ -5,13 +5,13 @@ #include "dungeon.h" #include "dungeon_util_static.h" #include "overlay_29_0234B104.h" +#include "dungeon_logic_4.h" extern struct dungeon *DUNGEON_PTR[]; extern s32 GetIdleAnimationId(struct entity *entity); extern int ov29_02304830(); extern void TryRemoveSnatchedMonsterFromDungeonStruct(struct entity *user, struct entity *target); -extern void ov29_022FB984(struct entity *entity); #ifdef JAPAN #define JPN_MSG_OFFSET -0x2C0 diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index 58bbced1..8b44f15f 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -136,7 +136,6 @@ extern int ov29_022E550C(); extern void ov29_022E81F8(void); extern void ov29_022EA370(s32 a, s32 b); extern int ov29_022F9AF4(); -extern int ov29_022FB98C(); extern int ov29_02303E0C(); extern int ov29_02304830(); extern int ov29_02307C48(); diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index c148f75f..5cebe33b 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -29,6 +29,7 @@ #include "overlay_29_0231B194.h" #include "overlay_29_0234B104.h" #include "overlay_29_023350D8.h" +#include "dungeon_logic_4.h" extern s16 ov10_022C4BE4[20]; extern void ov29_0230FB30(struct entity *entity); @@ -76,7 +77,6 @@ extern void ov29_022E53F0(struct entity *entity); extern void ov29_022F42F8(struct entity *entity); extern void EndMagnetRiseStatus(struct entity *user, struct entity *target); extern void ov29_022EC62C(struct entity *entity); -extern void ov29_022FB718(struct entity *entity); extern s32 EndNegativeStatusCondition(struct entity *user, struct entity *target, bool8 a, bool8 b, bool8 c); extern s32 DisplayActions(s32 a); extern s32 ov29_02322374(struct entity *entity, s32 a, s32 b, s32 c, s32 d, struct move *move); diff --git a/src/overlay_29_0231CBC8.c b/src/overlay_29_0231CBC8.c index eff1ddf3..282d1693 100644 --- a/src/overlay_29_0231CBC8.c +++ b/src/overlay_29_0231CBC8.c @@ -15,6 +15,7 @@ #include "overlay_29_02305C04.h" #include "overlay_29_0234B340.h" #include "overlay_29_0230F8AC.h" +#include "dungeon_logic_4.h" #ifdef JAPAN #define MESSAGE_BE6 0x925 @@ -36,7 +37,6 @@ #ifdef EUROPE -extern void ov29_022FB920(bool8 a); #endif extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); @@ -83,7 +83,6 @@ extern void TryInflictEyedropStatus(struct entity *user, struct entity *target); extern bool8 TryInflictSlipStatus(struct entity *user, struct entity *target); extern void ov29_022E5A00(struct entity *entity, struct item *item); extern void ov29_022E5AE4(struct entity *entity, struct item *item); -extern bool8 ov29_022FB9BC(struct entity *entity); extern void ov29_022F9EA0(struct entity *entity); extern void EnemyEvolution(struct entity *entity); extern bool8 AddHeldItemToBag(struct monster *monster); From 0f3cbcbcd20586e4a6df5c9b3b03b26294bcf395 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Mon, 14 Sep 2026 01:37:20 -0700 Subject: [PATCH 26/34] Decompile 26 more callees; clear three asm files entirely Closes the three near-match groups left from the previous batch. All of asm/overlay_29_02337EC0.s 6 functions asm/overlay_29_022E335C.s 10 functions asm/overlay_29_0230F02C.s 10 functions now match, so the three objects leave main.lsf and the .s/.inc files go. struct dungeon gains struct unk_02337EE8, grouping the ten members from 0x286B0 through spawn_table_entries_chosen into one sub-object at unchanged offsets. ov29_02337EE8 and GetRandomSpawnMonsterID reach spawn_entries_master through a local pointer to that member, which is what makes mwcc form the member base and the inner offset as two additions the way the target does; the sub-object alone, or the local alone, still scores 225. The spelling is already in the tree at src/overlay_29_022FBBEC.c:72 for the other grouped member. Eighteen expressions in seven files gain field_0x286b0; four of them are in upstream's src/overlay_30_init.c, which reaches highest_enemy_level and spawn_table_entries_chosen directly. Two width corrections, each replacing adjacent u8 members with one wider member at the same offset, so no following offset or alignment moves: dungeon::number_completed_floors u8 -> s16, absorbing speed_boost_counter at 0x1F (read ldrsh in three places, written strh in a fourth); and monster::field_0x188, four u8 -> one s32 (read ldr twice here, written str in overlay_29_022E0378). src/dg_camera.c declares DUNGEON_PTR as struct dungeon *[2] rather than the incomplete *[]. A complete type is what makes mwcc reload the pointer across an intervening store, which ov29_022E34C8 needs; [] and [2] are compatible types, so no use site changes. src/dungeon_map_access_1.c takes the scalar form for the same reason. Sixteen call-site-derived declarations in twelve files are replaced by an include of the owning header. Eight of them declared PlayEffectAnimationEntity with the wrong tail types -- s32, s32, s32 where its prologue reads u8, s16 and a pointer. Every affected call site passes literals, so the correction is byte-neutral, which the build confirms. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds in all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/overlay_29_022E335C.inc | 23 -- asm/include/overlay_29_0230F02C.inc | 39 -- asm/include/overlay_29_02337EC0.inc | 13 - asm/overlay_29_022E335C.s | 386 ------------------- asm/overlay_29_0230F02C.s | 561 ---------------------------- asm/overlay_29_02337EC0.s | 303 --------------- include/dg_camera.h | 9 + include/dg_effect.h | 24 ++ include/dungeon.h | 56 +-- include/dungeon_map_access_1.h | 3 + include/overlay_29_0230F810.h | 10 + include/overlay_29_02338350.h | 3 + main.lsf | 3 - src/dg_camera.c | 136 ++++++- src/dg_effect.c | 80 ++++ src/dungeon_logic_2.c | 2 +- src/dungeon_map_access_1.c | 58 ++- src/dungeon_recruitment.c | 2 +- src/move_orb_effects.c | 2 +- src/overlay_29_022E3F20.c | 3 - src/overlay_29_022E406C.c | 4 +- src/overlay_29_022E4338.c | 7 +- src/overlay_29_022E45B8.c | 4 +- src/overlay_29_022E4704.c | 4 +- src/overlay_29_022E66C4.c | 4 +- src/overlay_29_022EFA6C.c | 4 +- src/overlay_29_02308FBC.c | 6 +- src/overlay_29_0230BBAC.c | 4 +- src/overlay_29_0230F810.c | 313 +++++++++++++++- src/overlay_29_0232CA14.c | 2 +- src/overlay_29_02338350.c | 76 +++- src/overlay_30_init.c | 8 +- src/random_trap.c | 2 +- src/spawn_1.c | 16 +- src/spawn_2.c | 2 +- 35 files changed, 762 insertions(+), 1410 deletions(-) delete mode 100644 asm/include/overlay_29_022E335C.inc delete mode 100644 asm/include/overlay_29_0230F02C.inc delete mode 100644 asm/include/overlay_29_02337EC0.inc delete mode 100644 asm/overlay_29_022E335C.s delete mode 100644 asm/overlay_29_0230F02C.s delete mode 100644 asm/overlay_29_02337EC0.s diff --git a/asm/include/overlay_29_022E335C.inc b/asm/include/overlay_29_022E335C.inc deleted file mode 100644 index d509ecfa..00000000 --- a/asm/include/overlay_29_022E335C.inc +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -.public AdvanceFrame -.public AnimationDelayOrSomething -.public AnimationHasMoreFrames -.public DisplayUi -.public DUNGEON_PTR -.public EntityIsValid__022E37B8 -.public GetEffectAnimationWanOffset -.public GetPixelOffsetFromSprite -.public GetTileSafe -.public InitOamAdjustmentInfo -.public LogMessageByIdWithPopupCheckUser -.public ov10_022BF274 -.public ov10_022BF2B4 -.public ov10_022BFD20 -.public ov29_022E2C6C -.public ov29_0235110C -.public ov29_0235354C -.public ScreenEffectActive -.public ShouldDisplayEntityAdvanced -.public UpdateCamera -.public UpdateMinimap -.public UpdateTrapsVisibility diff --git a/asm/include/overlay_29_0230F02C.inc b/asm/include/overlay_29_0230F02C.inc deleted file mode 100644 index 7bccfc72..00000000 --- a/asm/include/overlay_29_0230F02C.inc +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public abs -.public AddMoneyCarried -.public AI_THROWN_ITEM_ACTION_CHOICE_COUNT -.public BAG_ITEMS_PTR_MIRROR -.public CanSeeTarget -.public DUNGEON_PTR -.public DungeonRandOutcome__022EAB20 -.public EntityIsValid__0230F008 -.public GetAiUseItemProbability -.public GetCurrentBagCapacity -.public GetExclusiveItemForMonsterFromBag -.public GetItemCategoryVeneer -.public GetItemInfo -.public GetMoneyQuantity -.public GetTileAtEntity -.public GetTreatmentBetweenMonsters -.public HasHeldItem -.public IqSkillIsEnabled -.public IsAuraBow -.public IsExperienceLocked -.public IsFloorOver -.public IsItemUnkMissionItem2 -.public ItemIsActive__0230F810 -.public LogMessageByIdWithPopup -.public ov29_022F9EA0 -.public ov29_02345004 -.public ov29_02347040 -.public ov29_02348D3C -.public ov29_02348DD8 -.public ov29_02348ECC -.public PlaySeByIdIfNotSilence -.public PrepareItemForPrinting__02345728 -.public RemoveGroundItem -.public ShouldMonsterRunAwayAndShowEffect -.public SubstitutePlaceholderStringTags -.public UseSingleUseItemSelf -.public UseThrowableItem diff --git a/asm/include/overlay_29_02337EC0.inc b/asm/include/overlay_29_02337EC0.inc deleted file mode 100644 index 83095f82..00000000 --- a/asm/include/overlay_29_02337EC0.inc +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once -.public DIRECTIONS_XY -.public DUNGEON_PTR -.public DungeonRandInt -.public DungeonRandRange -.public GetMonsterIdFromSpawnEntry -.public GetTile -.public GetTileSafe -.public IqSkillIsEnabled -.public MemAlloc -.public MemFree -.public RandInt -.public ShouldTreatMonsterAsAlly diff --git a/asm/overlay_29_022E335C.s b/asm/overlay_29_022E335C.s deleted file mode 100644 index dd35a9af..00000000 --- a/asm/overlay_29_022E335C.s +++ /dev/null @@ -1,386 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022E335C.inc" - - .text - - arm_func_start ov29_022E335C -ov29_022E335C: ; 0x022E335C -#ifdef JAPAN -#define OV29_022E335C_OFFSET -0xA4 -#else -#define OV29_022E335C_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, lr} - ldr r0, _022E3428 ; =DUNGEON_PTR - mov r5, #0 - ldr r0, [r0] - add r0, r0, #0x1a000 - ldrb r1, [r0, #0x24d + OV29_022E335C_OFFSET] - ldr r4, [r0, #0x22c + OV29_022E335C_OFFSET] - cmp r1, #0 - bne _022E33A0 - bl ov10_022BFD20 - cmp r0, #0 - bne _022E33A0 - cmp r4, #0 - beq _022E33A0 - ldr r0, [r4] - cmp r0, #1 - moveq r5, #1 -_022E33A0: - cmp r5, #0 - bne _022E33B0 - bl ov29_022E2C6C - ldmia sp!, {r3, r4, r5, pc} -_022E33B0: - ldr r0, _022E3428 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x21c + OV29_022E335C_OFFSET - add r4, r0, #0x1a000 - ldr r0, [r4, #0x10] - ldr r5, [r0, #0xb4] - bl DisplayUi - ldr r1, _022E3428 ; =DUNGEON_PTR - ldr r0, _022E342C ; =0x000003E7 - ldr r1, [r1] - ldrb r2, [r1, #0x749] - ldrsh r1, [r1, #0x1e] - add r1, r2, r1 - strh r1, [r4, #0x3c] - ldrsh r2, [r5, #0x12] - ldrsh r1, [r5, #0x16] - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - strh r1, [r4, #0x42] - ldrsh r0, [r5, #0x10] - strh r0, [r4, #0x40] - ldrb r0, [r5, #0xa] - strh r0, [r4, #0x3e] - ldrsh r1, [r4, #0x42] - mov r0, r1, asr #2 - add r0, r1, r0, lsr #29 - mov r0, r0, asr #3 - strh r0, [r4, #0x44] - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_022E3428: .word DUNGEON_PTR -_022E342C: .word 0x000003E7 - arm_func_end ov29_022E335C - - arm_func_start RevealWholeFloor -RevealWholeFloor: ; 0x022E3430 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - ldr r1, _022E34A8 ; =DUNGEON_PTR - mov r7, #0 - ldr r1, [r1] - mov r4, r0 - mov r2, #1 - add r0, r1, #0x1a000 -#ifdef JAPAN - strb r2, [r0, #0x19b] -#else - strb r2, [r0, #0x23f] -#endif - mov r5, r7 -_022E3454: - mov r6, r5 -_022E3458: - mov r0, r6 - mov r1, r7 - bl GetTileSafe - ldrh r1, [r0, #2] - add r6, r6, #1 - cmp r6, #0x38 - orr r1, r1, #1 - strh r1, [r0, #2] - blt _022E3458 - add r7, r7, #1 - cmp r7, #0x20 - blt _022E3454 - mov r0, #0 - bl UpdateCamera - bl UpdateTrapsVisibility - bl UpdateMinimap - ldr r1, _022E34AC ; =0x00000B77 - mov r0, r4 - bl LogMessageByIdWithPopupCheckUser - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_022E34A8: .word DUNGEON_PTR -#ifdef JAPAN -_022E34AC: .word 0x00000888 -#else -_022E34AC: .word 0x00000B77 -#endif - arm_func_end RevealWholeFloor - - arm_func_start ov29_022E34B0 -ov29_022E34B0: ; 0x022E34B0 - ldr r1, _022E34C4 ; =DUNGEON_PTR - ldr r1, [r1] - add r1, r1, #0x1a000 -#ifdef JAPAN - strb r0, [r1, #0x1a8] -#else - strb r0, [r1, #0x24c] -#endif - bx lr - .align 2, 0 -_022E34C4: .word DUNGEON_PTR - arm_func_end ov29_022E34B0 - - arm_func_start ov29_022E34C8 -ov29_022E34C8: ; 0x022E34C8 -#ifdef JAPAN -#define OV29_022E34C8_OFFSET -0xA4 -#else -#define OV29_022E34C8_OFFSET 0 -#endif - ldr r0, _022E352C ; =DUNGEON_PTR - ldr r3, [r0] - add r0, r3, #0x1a000 - ldr r2, [r0, #0x234 + OV29_022E34C8_OFFSET] - cmp r2, #0 - bxeq lr - ldr r1, _022E3530 ; =ov29_0235110C - cmp r2, #0x1f - movge r2, #0x1f - ldr r2, [r1, r2, lsl #2] - add r0, r3, #0x1a000 - ldr r1, _022E352C ; =DUNGEON_PTR - str r2, [r0, #0x230 + OV29_022E34C8_OFFSET] - ldr r0, [r1] - add r0, r0, #0x1a000 - ldr r2, [r0, #0x234 + OV29_022E34C8_OFFSET] - sub r2, r2, #1 - str r2, [r0, #0x234 + OV29_022E34C8_OFFSET] - ldr r0, [r1] - add r0, r0, #0x1a000 - ldr r1, [r0, #0x234 + OV29_022E34C8_OFFSET] - cmp r1, #0 - ldreq r1, [r0, #0x238 + OV29_022E34C8_OFFSET] - streq r1, [r0, #0x234 + OV29_022E34C8_OFFSET] - bx lr - .align 2, 0 -_022E352C: .word DUNGEON_PTR -_022E3530: .word ov29_0235110C - arm_func_end ov29_022E34C8 - - arm_func_start ov29_022E3534 -ov29_022E3534: ; 0x022E3534 - ldrb r1, [r0, #0x34] - cmp r1, #0 - bne _022E3558 - ldrb r1, [r0, #0x23] - cmp r1, #0 - ldreqb r0, [r0, #0x24] - cmpeq r0, #0 - movne r0, #1 - bxne lr -_022E3558: - mov r0, #0 - bx lr - arm_func_end ov29_022E3534 - - arm_func_start ov29_022E3560 -ov29_022E3560: ; 0x022E3560 - ldr r1, _022E356C ; =ov29_0235354C - strb r0, [r1] - bx lr - .align 2, 0 -_022E356C: .word ov29_0235354C - arm_func_end ov29_022E3560 - - arm_func_start ov29_022E3570 -ov29_022E3570: ; 0x022E3570 - ldr r0, _022E357C ; =ov29_0235354C - ldrb r0, [r0] - bx lr - .align 2, 0 -_022E357C: .word ov29_0235354C - arm_func_end ov29_022E3570 - - arm_func_start DungeonScreenEffectActive -DungeonScreenEffectActive: ; 0x022E3580 - ldr ip, _022E358C ; =ScreenEffectActive - mov r0, #0 - bx ip - .align 2, 0 -_022E358C: .word ScreenEffectActive - arm_func_end DungeonScreenEffectActive - - arm_func_start ov29_022E3590 -ov29_022E3590: ; 0x022E3590 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x10 - mov r5, r1 - mov r6, r0 - mov r0, r5 - mov r4, r2 - bl GetEffectAnimationWanOffset - mov r3, r0 - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r6 - mov r1, r5 - mov r2, r4 - and r3, r3, #0xff - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end ov29_022E3590 - - arm_func_start PlayEffectAnimationEntity -PlayEffectAnimationEntity: ; 0x022E35E4 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - sub sp, sp, #0x30 - mov r8, r0 - mov r5, r1 - mov r4, r2 - mov r7, r3 - bl EntityIsValid__022E37B8 - cmp r0, #0 - mvneq r0, #0 - beq _022E37A8 - mov r0, r8 - ldr r6, [r8, #0xb4] - bl ShouldDisplayEntityAdvanced - cmp r0, #0 - mvneq r0, #0 - beq _022E37A8 - ldrb r0, [sp, #0x4c] - cmp r0, #0 -#ifdef JAPAN - ldreqb r0, [r6, #0x10a] -#else - ldreqb r0, [r6, #0x10b] -#endif - cmpeq r0, #2 - mvneq r0, #0 - beq _022E37A8 - ldr r0, [sp, #0x48] - cmp r0, #0 - beq _022E365C - cmp r0, #2 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - bl AnimationDelayOrSomething -_022E365C: - add r0, sp, #0 - mov r2, r7 - add r1, r8, #0x2c - bl GetPixelOffsetFromSprite - ldrsh r7, [sp] - cmp r7, #0x63 - ldrnesh r2, [sp, #2] - cmpne r2, #0x63 - ldreq r1, [r8, #0x10] -#ifdef JAPAN - ldreq r0, [r6, #0x184] -#else - ldreq r0, [r6, #0x188] -#endif - ldreq r7, [r8, #0xc] - subeq r8, r1, r0 - beq _022E36A8 - ldr r1, [r8, #0x10] - ldr r3, [r8, #0xc] -#ifdef JAPAN - ldr r0, [r6, #0x184] -#else - ldr r0, [r6, #0x188] -#endif - add r2, r1, r2, lsl #8 - add r7, r3, r7, lsl #8 - sub r8, r2, r0 -_022E36A8: - ldr r0, _022E37B0 ; =DUNGEON_PTR - ldr r2, _022E37B4 ; =0x0001A226 - ldr r3, [r0] - add r0, sp, #4 - ldrsh r2, [r3, r2] - rsb r6, r2, r1, asr #8 - bl ov10_022BF274 - ldrsh r0, [sp, #0x50] - mov r1, #0 - str r5, [sp, #4] - str r1, [sp, #8] - cmp r0, #0 - blt _022E36E4 - cmp r0, #8 - ble _022E36F0 -_022E36E4: - mvn r0, #0 - str r0, [sp, #0xc] - b _022E36F4 -_022E36F0: - str r0, [sp, #0xc] -_022E36F4: - add r0, r6, r6, lsr #31 - mov r0, r0, asr #1 - mov r1, #0 - ldr r3, [sp, #0x54] - mov r6, r7, asr #8 - mov r5, r8, asr #8 - add r0, r0, #1 - mvn r2, #0 - strh r6, [sp, #0x10] - strh r5, [sp, #0x12] - strb r2, [sp, #0x18] - strh r1, [sp, #0x14] - strh r1, [sp, #0x16] - str r0, [sp, #0x1c] - cmp r3, #0 - bne _022E3740 - add r0, sp, #0x20 - bl InitOamAdjustmentInfo - b _022E3758 -_022E3740: - add r2, sp, #0x20 - mov r1, #6 -_022E3748: - ldrh r0, [r3], #2 - subs r1, r1, #1 - strh r0, [r2], #2 - bne _022E3748 -_022E3758: - add r0, sp, #4 - mov r1, #0 - bl ov10_022BF2B4 - cmp r4, #0 - beq _022E37A8 - mov r0, r0, lsl #0x10 - mov r6, #0 - mov r5, r0, asr #0x10 - mov r4, #0x42 - b _022E379C -_022E3780: - mov r0, r5 - bl AnimationHasMoreFrames - cmp r0, #0 - beq _022E37A4 - mov r0, r4 - bl AdvanceFrame - add r6, r6, #1 -_022E379C: - cmp r6, #0x64 - blt _022E3780 -_022E37A4: - mvn r0, #0 -_022E37A8: - add sp, sp, #0x30 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_022E37B0: .word DUNGEON_PTR -#ifdef JAPAN -_022E37B4: .word 0x0001A182 -#else -_022E37B4: .word 0x0001A226 -#endif - arm_func_end PlayEffectAnimationEntity diff --git a/asm/overlay_29_0230F02C.s b/asm/overlay_29_0230F02C.s deleted file mode 100644 index 7b206e2e..00000000 --- a/asm/overlay_29_0230F02C.s +++ /dev/null @@ -1,561 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0230F02C.inc" - - .text - - arm_func_start ov29_0230F140 -ov29_0230F140: ; 0x0230F140 - ldr ip, _0230F148 ; =UseSingleUseItemSelf - bx ip - .align 2, 0 -_0230F148: .word UseSingleUseItemSelf - arm_func_end ov29_0230F140 - - arm_func_start ov29_0230F14C -ov29_0230F14C: ; 0x0230F14C - ldr ip, _0230F154 ; =UseThrowableItem - bx ip - .align 2, 0 -_0230F154: .word UseThrowableItem - arm_func_end ov29_0230F14C - - arm_func_start ov29_0230F158 -ov29_0230F158: ; 0x0230F158 - ldr ip, _0230F160 ; =TryNonLeaderItemPickUp - bx ip - .align 2, 0 -_0230F160: .word TryNonLeaderItemPickUp - arm_func_end ov29_0230F158 - - arm_func_start TryNonLeaderItemPickUp -TryNonLeaderItemPickUp: ; 0x0230F164 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x198 - mov r8, r0 - ldr r6, [r8, #0xb4] - bl GetTileAtEntity - mov r5, r0 - ldr r4, [r5, #0x10] - cmp r4, #0 - beq _0230F624 - bl IsFloorOver - cmp r0, #0 - bne _0230F624 - mov r0, #0 - mov r1, r8 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r0, [r6, #7] - cmp r0, #0 - bne _0230F624 - ldrb r0, [r6, #9] - cmp r0, #1 - beq _0230F624 - mov r0, r6 - bl IsExperienceLocked - cmp r0, #0 - bne _0230F624 - ldrb r0, [r6, #0xbc] - cmp r0, #7 - beq _0230F624 - ldr r6, [r8, #0xb4] - mov r0, r4 - mov r7, #1 - bl GetItemInfo - ldrb r1, [r6, #6] - mov r4, r0 - cmp r1, #0 - beq _0230F204 - bl IsItemUnkMissionItem2 - cmp r0, #0 - bne _0230F624 -_0230F204: - ldrb r0, [r4] - tst r0, #2 - bne _0230F228 - ldrb r0, [r6, #6] - cmp r0, #0 - bne _0230F22C - ldrh r0, [r5] - tst r0, #0x20 - beq _0230F22C -_0230F228: - mov r7, #0 -_0230F22C: - cmp r7, #0 - beq _0230F624 - mov r0, r8 - mov r1, #1 - bl ShouldMonsterRunAwayAndShowEffect - cmp r0, #0 - beq _0230F274 - mov r1, r4 - mov r0, #0 - bl PrepareItemForPrinting__02345728 - mov r0, #0 - mov r1, r8 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r1, _0230F62C ; =0x00000C5E - mov r0, r8 - bl LogMessageByIdWithPopup - b _0230F624 -_0230F274: - ldrb r0, [r6, #6] - cmp r0, #0 - bne _0230F300 - ldrsh r0, [r4, #4] - bl GetItemCategoryVeneer - cmp r0, #6 - bne _0230F300 - ldrb r0, [r6, #6] - cmp r0, #0 - beq _0230F2A8 - ldr r0, _0230F630 ; =0x00001305 - bl PlaySeByIdIfNotSilence - b _0230F2B0 -_0230F2A8: - ldr r0, _0230F634 ; =0x00001308 - bl PlaySeByIdIfNotSilence -_0230F2B0: - mov r0, r8 - mov r1, #0x1b - bl IqSkillIsEnabled - cmp r0, #0 - ldrneb r0, [r4] - orrne r0, r0, #0x20 - strneb r0, [r4] - mov r0, r4 - bl GetMoneyQuantity - bl AddMoneyCarried - mov r1, r4 - mov r0, #0 - bl PrepareItemForPrinting__02345728 - add r0, r8, #4 - mov r1, #1 - bl RemoveGroundItem - ldr r1, _0230F638 ; =0x00000C5F - mov r0, r8 - bl LogMessageByIdWithPopup - b _0230F624 -_0230F300: - ldr r0, _0230F63C ; =DUNGEON_PTR - ldr r0, [r0] - ldrb sb, [r0, #0x75b] - cmp sb, #0 - beq _0230F36C - ldrb r0, [r6, #6] - cmp r0, #0 - bne _0230F36C - ldr r0, _0230F640 ; =BAG_ITEMS_PTR_MIRROR - mov r5, #0 - ldr r0, [r0] - add r2, sp, #0 - ldr r7, [r0, #0x384] - add r1, sp, #0xcc - mov r0, #6 -_0230F33C: - mla r3, r5, r0, r7 - str r3, [r2, r5, lsl #2] - str r5, [r1, r5, lsl #2] - add r5, r5, #1 - cmp r5, #0x32 - blt _0230F33C - add r1, r6, #0x62 - mvn r0, #0 - str r1, [sp, #0xc8] - str r0, [sp, #0x194] - mov r5, #0x33 - b _0230F380 -_0230F36C: - add r1, r6, #0x62 - mvn r0, #0 - str r1, [sp] - str r0, [sp, #0xcc] - mov r5, #1 -_0230F380: - ldrsh lr, [r4, #4] - cmp lr, #0xb - bge _0230F4B0 - ldrb r0, [r4] - tst r0, #2 - bne _0230F4B0 - mvn r7, #0 - mov ip, r7 - mov sl, #0 - and r0, r0, #8 - add fp, sp, #0 - b _0230F408 -_0230F3B0: - ldr r1, [fp, sl, lsl #2] - ldrb r1, [r1] - tst r1, #1 - movne r1, #1 - moveq r1, #0 - tst r1, #0xff - beq _0230F404 - ldr r3, [fp, sl, lsl #2] - ldrb r2, [r3] - tst r2, #2 - ldreqsh r1, [r3, #4] - cmpeq lr, r1 - andeq r1, r2, #8 - cmpeq r0, r1 - bne _0230F404 - ldrh r1, [r3, #2] - cmp r1, #0x63 - beq _0230F404 - cmp ip, r1 - movlt ip, r1 - movlt r7, sl -_0230F404: - add sl, sl, #1 -_0230F408: - cmp sl, r5 - blt _0230F3B0 - mvn r0, #0 - cmp r7, r0 - beq _0230F4B0 - add r1, sp, #0 - ldr r2, [r1, r7, lsl #2] - ldrh r0, [r4, #2] - ldrh r1, [r2, #2] - add r0, r1, r0 - cmp r0, #0x63 - movge r0, #0x63 - strh r0, [r2, #2] - ldrb r0, [r4] - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - ldrneb r0, [r2] - orrne r0, r0, #8 - strneb r0, [r2] - bl ov29_02347040 - mov r1, r4 - mov r0, #0 - bl PrepareItemForPrinting__02345728 - add r0, r8, #4 - mov r1, #1 - bl RemoveGroundItem - ldr r0, _0230F644 ; =0x00001304 - bl PlaySeByIdIfNotSilence - add r0, sp, #0xcc - ldr r0, [r0, r7, lsl #2] - cmp r0, #0 - bge _0230F4A0 -#ifdef JAPAN - ldr r1, _02310B84 ; =0x0000099F - mov r0, r8 -#else - mov r0, r8 - mov r1, #0xc60 -#endif - bl LogMessageByIdWithPopup - b _0230F624 -_0230F4A0: -#ifdef JAPAN - mov r0, r8 - mov r1, #0x9a0 -#else - ldr r1, _0230F648 ; =0x00000C61 - mov r0, r8 -#endif - bl LogMessageByIdWithPopup - b _0230F624 -_0230F4B0: - cmp sb, #0 - beq _0230F4CC - ldrb r0, [r6, #6] - cmp r0, #0 - bne _0230F4CC - bl GetCurrentBagCapacity - mov r5, r0 -_0230F4CC: - mov r7, #0 - add r3, sp, #0 - mov r0, r7 - mov r1, #1 - b _0230F500 -_0230F4E0: - ldr r2, [r3, r7, lsl #2] - ldrb r2, [r2] - tst r2, #1 - movne r2, r1 - moveq r2, r0 - tst r2, #0xff - beq _0230F508 - add r7, r7, #1 -_0230F500: - cmp r7, r5 - blt _0230F4E0 -_0230F508: - mov r0, r8 - mov r1, r4 - mov r2, #1 - bl ov29_02348DD8 - cmp r0, #0 - bne _0230F624 - cmp r7, r5 - bne _0230F544 - mov r1, r4 - mov r0, #0 - bl PrepareItemForPrinting__02345728 - ldr r1, _0230F64C ; =0x00000C62 - mov r0, r8 - bl LogMessageByIdWithPopup - b _0230F624 -_0230F544: - ldrb r0, [r6, #6] - cmp r0, #0 - beq _0230F55C - ldr r0, _0230F630 ; =0x00001305 - bl PlaySeByIdIfNotSilence - b _0230F564 -_0230F55C: - ldr r0, _0230F644 ; =0x00001304 - bl PlaySeByIdIfNotSilence -_0230F564: - add r0, sp, #0xcc - ldr r0, [r0, r7, lsl #2] - cmp r0, #0 - bge _0230F5BC - ldrh r1, [r4] - mov r0, r8 - strh r1, [r6, #0x62] - ldrh r1, [r4, #2] - strh r1, [r6, #0x64] - ldrh r1, [r4, #4] - strh r1, [r6, #0x66] - bl ov29_022F9EA0 - mov r1, r4 - mov r0, #0 - bl PrepareItemForPrinting__02345728 - add r0, r8, #4 - mov r1, #1 - bl RemoveGroundItem -#ifdef JAPAN - ldr r1, _02310B84 ; =0x0000099F - mov r0, r8 -#else - mov r0, r8 - mov r1, #0xc60 -#endif - bl LogMessageByIdWithPopup - b _0230F624 -_0230F5BC: - mov r0, r4 - bl ov29_02348D3C - mov r5, r0 - mov r0, r4 - bl ov29_02345004 - cmp r0, #0 - mov r0, #0 - beq _0230F5F8 - mov r1, r8 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r1, _0230F650 ; =0x00000C63 - mov r0, r8 - bl LogMessageByIdWithPopup - b _0230F624 -_0230F5F8: - mov r1, r4 - bl PrepareItemForPrinting__02345728 - add r0, r8, #4 - mov r1, #1 - bl RemoveGroundItem -#ifdef JAPAN - mov r0, r8 - mov r1, #0x9a0 -#else - ldr r1, _0230F648 ; =0x00000C61 - mov r0, r8 -#endif - bl LogMessageByIdWithPopup - mov r0, r4 - mov r1, r5 - bl ov29_02348ECC -_0230F624: - add sp, sp, #0x198 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -#define TRY_NON_LEADER_ITEM_PICK_UP_OFFSET -0x2C1 -#else -#define TRY_NON_LEADER_ITEM_PICK_UP_OFFSET 0 -#endif -_0230F62C: .word 0x00000C5E + TRY_NON_LEADER_ITEM_PICK_UP_OFFSET -_0230F630: .word 0x00001305 -_0230F634: .word 0x00001308 -_0230F638: .word 0x00000C5F + TRY_NON_LEADER_ITEM_PICK_UP_OFFSET -_0230F63C: .word DUNGEON_PTR -_0230F640: .word BAG_ITEMS_PTR_MIRROR -_0230F644: .word 0x00001304 -#ifdef JAPAN -_02310B84: .word 0x0000099F -#else -_0230F648: .word 0x00000C61 -#endif -_0230F64C: .word 0x00000C62 + TRY_NON_LEADER_ITEM_PICK_UP_OFFSET -_0230F650: .word 0x00000C63 + TRY_NON_LEADER_ITEM_PICK_UP_OFFSET - arm_func_end TryNonLeaderItemPickUp - - arm_func_start GetExclusiveItemWithEffectFromBag -GetExclusiveItemWithEffectFromBag: ; 0x0230F654 - stmdb sp!, {r3, r4, r5, r6, lr} - sub sp, sp, #0xc - mov r6, r0 - mov r5, r1 - mov r4, r2 - bl EntityIsValid__0230F008 - cmp r0, #0 - moveq r0, #0 - beq _0230F6C0 - ldr r3, [r6, #0xb4] - add r0, sp, #4 - ldrb r2, [r3, #0x5f] - mov r1, r5 - str r2, [sp] - ldrsh r2, [r3, #4] - ldrb r3, [r3, #0x5e] - bl GetExclusiveItemForMonsterFromBag - cmp r0, #0 - moveq r0, #0 - beq _0230F6C0 - ldrh r1, [sp, #4] - mov r0, #1 - strh r1, [r4] - ldrh r1, [sp, #6] - strh r1, [r4, #2] - ldrh r1, [sp, #8] - strh r1, [r4, #4] -_0230F6C0: - add sp, sp, #0xc - ldmia sp!, {r3, r4, r5, r6, pc} - arm_func_end GetExclusiveItemWithEffectFromBag - - arm_func_start AuraBowIsActive -AuraBowIsActive: ; 0x0230F6C8 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldr r4, [r5, #0xb4] - mov r1, #0x6f - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, pc} - ldrb r0, [r4, #0x62] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _0230F710 - ldrsh r0, [r4, #0x66] - bl IsAuraBow - cmp r0, #0 - bne _0230F718 -_0230F710: - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} -_0230F718: - ldrsh r1, [r4, #0x66] - mov r0, r5 - bl HasHeldItem - ldmia sp!, {r3, r4, r5, pc} - arm_func_end AuraBowIsActive - - arm_func_start ov29_0230F728 -ov29_0230F728: ; 0x0230F728 -#ifdef JAPAN -#define OV29_0230F728_OFFSET -4 -#else -#define OV29_0230F728_OFFSET 0 -#endif - stmdb sp!, {r4, r5, lr} - sub sp, sp, #0xc - ldr ip, [r1, #0xb4] - ldr r4, [r0, #0xb4] - ldrb r0, [ip, #0x5f] - mov r5, r3 - mov r1, r2 - str r0, [sp] - ldrsh r2, [ip, #4] - ldrb r3, [ip, #0x5e] - add r0, sp, #4 - bl GetExclusiveItemForMonsterFromBag - ldr r1, [r4, #0x18c + OV29_0230F728_OFFSET] - add r0, r4, #0x100 - orr r1, r1, r5 - str r1, [r4, #0x18c + OV29_0230F728_OFFSET] - ldrsh r1, [sp, #8] - strh r1, [r0, #0x90 + OV29_0230F728_OFFSET] - add sp, sp, #0xc - ldmia sp!, {r4, r5, pc} - arm_func_end ov29_0230F728 - - arm_func_start ExclusiveItemOffenseBoost -ExclusiveItemOffenseBoost: ; 0x0230F778 - ldr r0, [r0, #0xb4] - add r0, r0, r1 -#ifdef JAPAN - ldrb r0, [r0, #0x220] -#else - ldrb r0, [r0, #0x224] -#endif - bx lr - arm_func_end ExclusiveItemOffenseBoost - - arm_func_start ExclusiveItemDefenseBoost -ExclusiveItemDefenseBoost: ; 0x0230F788 - ldr r0, [r0, #0xb4] - add r0, r0, r1 -#ifdef JAPAN - ldrb r0, [r0, #0x222] -#else - ldrb r0, [r0, #0x226] -#endif - bx lr - arm_func_end ExclusiveItemDefenseBoost - - arm_func_start TeamMemberHasItemActive -TeamMemberHasItemActive: ; 0x0230F798 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r6, #0 - ldr r4, _0230F80C ; =DUNGEON_PTR - mov sb, r0 - mov r8, r1 - mov r5, r6 -_0230F7B0: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r7, [r0, #0xa84] -#else - ldr r7, [r0, #0xb28] -#endif - mov r0, r7 - bl EntityIsValid__0230F008 - cmp r0, #0 - beq _0230F7F0 - mov r0, r7 - mov r1, r8 - bl ItemIsActive__0230F810 - cmp r0, #0 - addne r0, r6, #1 - movne r0, r0, lsl #0x10 - strne r7, [sb, r6, lsl #2] - movne r6, r0, asr #0x10 -_0230F7F0: - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 - cmp r5, #4 - blt _0230F7B0 - mov r0, r6 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_0230F80C: .word DUNGEON_PTR - arm_func_end TeamMemberHasItemActive diff --git a/asm/overlay_29_02337EC0.s b/asm/overlay_29_02337EC0.s deleted file mode 100644 index 524fee28..00000000 --- a/asm/overlay_29_02337EC0.s +++ /dev/null @@ -1,303 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02337EC0.inc" - - .text - - arm_func_start RemoveMonsterFromTile -RemoveMonsterFromTile: ; 0x02337EC0 - stmdb sp!, {r4, lr} - mov r4, r0 - mov r0, r1 - mov r1, r2 - bl GetTileSafe - ldr r1, [r0, #0xc] - cmp r1, r4 - moveq r1, #0 - streq r1, [r0, #0xc] - ldmia sp!, {r4, pc} - arm_func_end RemoveMonsterFromTile - - arm_func_start ov29_02337EE8 -ov29_02337EE8: ; 0x02337EE8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x20 - ldr r0, _02337F8C ; =DUNGEON_PTR - ldr r4, _02337F90 ; =0x0000022A - ldr r0, [r0] - ldr r6, _02337F94 ; =0x000003D7 -#ifdef JAPAN - add r0, r0, #0x20c - add r0, r0, #0x28400 -#else - add r0, r0, #0x6b0 - add r0, r0, #0x28000 -#endif - mov sl, #0 - add r0, r0, #0x2b4 - mov sb, sl - add r8, r0, #0x4000 - sub r5, r4, #1 - sub r7, r6, #0x258 - add fp, sp, #0 - b _02337F68 -_02337F28: - add r0, r8, sb, lsl #3 - bl GetMonsterIdFromSpawnEntry - cmp r0, #0 - beq _02337F70 - cmp r0, r7 - cmpne r0, r6 - cmpne r0, r5 - cmpne r0, r4 - movne r2, sl, lsl #1 - addne r1, sl, #1 - strneh r0, [fp, r2] - add r0, sb, #1 - movne r1, r1, lsl #0x10 - mov r0, r0, lsl #0x10 - movne sl, r1, asr #0x10 - mov sb, r0, asr #0x10 -_02337F68: - cmp sb, #0x10 - blt _02337F28 -_02337F70: - mov r0, sl - bl RandInt - add r1, sp, #0 - mov r0, r0, lsl #1 - ldrsh r0, [r1, r0] - add sp, sp, #0x20 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02337F8C: .word DUNGEON_PTR -_02337F90: .word 0x0000022A -_02337F94: .word 0x000003D7 - arm_func_end ov29_02337EE8 - - arm_func_start GetRandomSpawnMonsterID -GetRandomSpawnMonsterID: ; 0x02337F98 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x20 - ldr r0, _02338040 ; =DUNGEON_PTR - ldr r4, _02338044 ; =0x0000022A - ldr r0, [r0] - ldr r6, _02338048 ; =0x000003D7 -#ifdef JAPAN - add r0, r0, #0x20c - add r0, r0, #0x28400 -#else - add r0, r0, #0x6b0 - add r0, r0, #0x28000 -#endif - mov sl, #0 - add r0, r0, #0x2b4 - mov sb, sl - add r8, r0, #0x4000 - sub r5, r4, #1 - sub r7, r6, #0x258 - add fp, sp, #0 - b _0233801C -_02337FD8: - add r0, r8, sb, lsl #3 - bl GetMonsterIdFromSpawnEntry - cmp r0, #0 - beq _02338024 - cmp r0, r7 - cmpne r0, r6 - cmpne r0, r5 - cmpne r0, r4 - cmpne r0, #0x84 - movne r2, sl, lsl #1 - addne r1, sl, #1 - strneh r0, [fp, r2] - add r0, sb, #1 - movne r1, r1, lsl #0x10 - mov r0, r0, lsl #0x10 - movne sl, r1, asr #0x10 - mov sb, r0, asr #0x10 -_0233801C: - cmp sb, #0x10 - blt _02337FD8 -_02338024: - mov r0, sl - bl DungeonRandInt - add r1, sp, #0 - mov r0, r0, lsl #1 - ldrsh r0, [r1, r0] - add sp, sp, #0x20 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02338040: .word DUNGEON_PTR -_02338044: .word 0x0000022A -_02338048: .word 0x000003D7 - arm_func_end GetRandomSpawnMonsterID - - arm_func_start ov29_0233804C -ov29_0233804C: ; 0x0233804C - stmdb sp!, {r3, r4, r5, lr} - mov r0, #0x2d8 - mov r1, #0x10 - bl MemAlloc - mov r4, r0 - mov r0, #1 - mov r1, #0x16c - bl DungeonRandRange - mov r1, r0, lsl #0x10 - mov r0, #0 - mov r3, r1, asr #0x10 - ldr r5, _023380F4 ; =DUNGEON_PTR - ldr lr, _023380F8 ; =0x000286F2 - mov r2, r0 - mov r1, r0 -_02338088: - ldr ip, [r5] - cmp r3, #0x16c - movge r3, r1 - add ip, ip, r3, lsl #1 - ldrsh ip, [ip, lr] - add r2, r2, #1 - mov r2, r2, lsl #0x10 - cmp ip, #0 - addne ip, r0, #1 - movne r0, r0, lsl #1 - strneh r3, [r4, r0] - add r3, r3, #1 - movne ip, ip, lsl #0x10 - mov r3, r3, lsl #0x10 - mov r2, r2, asr #0x10 - movne r0, ip, asr #0x10 - cmp r2, #0x16c - mov r3, r3, asr #0x10 - blt _02338088 - bl DungeonRandInt - mov r0, r0, lsl #0x10 - mov r1, r0, asr #0xf - mov r0, r4 - ldrsh r4, [r4, r1] - bl MemFree - mov r0, r4 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_023380F4: .word DUNGEON_PTR -#ifdef JAPAN -_023380F8: .word 0x0002864E -#else -_023380F8: .word 0x000286F2 -#endif - arm_func_end ov29_0233804C - - arm_func_start ov29_023380FC -ov29_023380FC: ; 0x023380FC - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov sb, r0 - ldr r0, [sb, #0xb4] - mov r6, #0 - ldrb r0, [r0, #6] - ldr r4, _023381BC ; =DIRECTIONS_XY - mov r8, r1 - mov r7, r6 - cmp r0, #0 - movne r6, #1 - mov r5, #0 -_02338128: - mov r1, r5, lsl #2 - add r0, r4, r5, lsl #2 - ldrsh ip, [sb, #4] - ldrsh r3, [r4, r1] - ldrsh r2, [sb, #6] - ldrsh r1, [r0, #2] - add r0, ip, r3 - add r1, r2, r1 - bl GetTile - ldr r0, [r0, #0xc] - cmp r0, #0 - beq _023381A0 - ldr r1, [r0] - cmp r1, #1 - bne _023381A0 - ldr r1, [r0, #0xb4] - cmp r6, #0 - ldrb r1, [r1, #6] - beq _0233818C - cmp r1, #0 - addeq r1, r7, #1 - moveq r1, r1, lsl #0x10 - streq r0, [r8, r7, lsl #2] - moveq r7, r1, asr #0x10 - b _023381A0 -_0233818C: - cmp r1, #0 - addne r1, r7, #1 - movne r1, r1, lsl #0x10 - strne r0, [r8, r7, lsl #2] - movne r7, r1, asr #0x10 -_023381A0: - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 - cmp r5, #8 - blt _02338128 - mov r0, r7 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_023381BC: .word DIRECTIONS_XY - arm_func_end ov29_023380FC - - arm_func_start ov29_023381C0 -ov29_023381C0: ; 0x023381C0 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r8, r0 - mov r7, r1 - mov r6, r2 - mov r5, #0 - ldr r4, _02338284 ; =DIRECTIONS_XY - b _02338274 -_023381DC: - mov r1, r5, lsl #2 - add r0, r4, r5, lsl #2 - ldrsh ip, [r8, #4] - ldrsh r3, [r4, r1] - ldrsh r2, [r8, #6] - ldrsh r1, [r0, #2] - add r0, ip, r3 - add r1, r2, r1 - bl GetTile - ldr sb, [r0, #0xc] - cmp sb, #0 - beq _02338268 - ldr r0, [sb] - cmp r0, #1 - bne _02338268 - mov r0, sb - mov r1, r7 - bl IqSkillIsEnabled - cmp r0, #0 - beq _02338268 - cmp r6, #0 - beq _02338250 - mov r0, sb - mov r1, r8 - bl ShouldTreatMonsterAsAlly - cmp r0, #0 - beq _02338268 - mov r0, sb - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_02338250: - mov r0, r8 - mov r1, sb - bl ShouldTreatMonsterAsAlly - cmp r0, #0 - movne r0, sb - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_02338268: - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 -_02338274: - cmp r5, #8 - blt _023381DC - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_02338284: .word DIRECTIONS_XY - arm_func_end ov29_023381C0 diff --git a/include/dg_camera.h b/include/dg_camera.h index 7477db2f..e942d381 100644 --- a/include/dg_camera.h +++ b/include/dg_camera.h @@ -8,5 +8,14 @@ bool8 EntityIsValid__022E32E8(struct entity *entity); // Checks if a monster is holding a certain item that isn't disabled by Klutz. bool8 ItemIsActive__022E330C(struct entity *entity, enum item_id item_id); s16 GetVisibilityRange(); +void ov29_022E335C(void); +void RevealWholeFloor(struct entity *user, struct entity *target); +void ov29_022E34B0(u8 param_1); +void ov29_022E34C8(void); +bool8 ov29_022E3534(struct display_data *display); +void ov29_022E3560(u8 param_1); +u8 ov29_022E3570(void); +bool8 DungeonScreenEffectActive(void); +void ov29_022E3590(struct entity *entity, s32 id, s32 param_3); #endif //PMDSKY_OVERLAY_29_022E32E8_H diff --git a/include/dg_effect.h b/include/dg_effect.h index e7973f63..3d556fe0 100644 --- a/include/dg_effect.h +++ b/include/dg_effect.h @@ -3,6 +3,30 @@ #include "dungeon_mode.h" +struct unk_0201C000 { + u16 field_0x0; + u16 field_0x2; + u16 field_0x4; + u16 field_0x6; + u16 field_0x8; + u16 field_0xa; +}; + +struct unk_022BF274 { + s32 field_0x0; + s32 field_0x4; + s32 field_0x8; + s16 field_0xc; + s16 field_0xe; + s16 field_0x10; + s16 field_0x12; + s8 field_0x14; + s32 field_0x18; + struct unk_0201C000 field_0x1c; + s32 field_0x28; +}; + +s32 PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 param_3, u8 param_4, s32 param_5, u8 param_6, s16 param_7, struct unk_0201C000 *param_8); // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__022E37B8(struct entity *entity); diff --git a/include/dungeon.h b/include/dungeon.h index acea9103..895bc93c 100644 --- a/include/dungeon.h +++ b/include/dungeon.h @@ -120,6 +120,33 @@ struct unk_022FBD24 { u32 unique_id_index; }; +struct unk_02337EE8 { + // 0x286B0: Initialized to 0xFF, then set to a copy of dungeon::group_id + enum dungeon_group_id group_id_copy; + // 0x286B1: Initialized to 0xFF, then set to a copy of dungeon::0x74B + u8 field_0x286b1; + struct floor_properties floor_properties; // 0x286B2: Properties about the current floor + // Spawn weights for items in different contexts. + // 0 = regular, 1 = Kecleon shop, 2 = monster house, 3 buried, + // 4 = bazaar, 5 = secret room + struct item_spawn_weights item_spawn_weights[6]; + // 0x2C932: Spawn weights for traps. + u16 trap_weights[25]; + // 0x2C964: List of spawn entries on this floor + // This is used during initialization, enemies are spawned using the copy at 0x3974 + struct monster_spawn_entry spawn_entries_master[16]; + // 0x2C9E4: The total number of spawn entries loaded or to be loaded? + u16 number_sprites_loaded; + // 0x2C9E6: Highest level among all the enemies that spawn on this floor + s16 highest_enemy_level; + // 0x2C9E8: ID of an item guaranteed to spawn on the floor, if applicable + // (e.g., certain mission types) + enum item_id guaranteed_item_id; + // 0x2C9EA: List of the indices in the complete monster spawn table for this floor that were + // chosen to spawn on it. It gets rerandomized at the start of each new floor. + u16 spawn_table_entries_chosen[16]; +}; + // Dungeon state struct dungeon { u8 field_0x0; // 0x0: Initialized to 0x0. @@ -176,9 +203,7 @@ struct dungeon { u8 field_0x1d; // 0x1E: Number of floors completed? (Guess). Initialized to 0. // If this is a floor tracker, odd it is not a u16 like the others. - u8 number_completed_floors; - // 0x1F: Turn counter, Speed Boost triggers every 250 turns, then the counter is reset. - u8 speed_boost_counter; + s16 number_completed_floors; // 0x20: Total amount of floors summed by all the previous dungeons in its group u16 number_preceding_floors; // 0x22: Total amount of floors passed including those in its group? (Guess) @@ -1498,30 +1523,7 @@ struct dungeon { // 0x1A21C: Data about the map, the camera and the touchscreen numbers struct display_data display_data; struct minimap_display_data minimap_display_data; // 0x1A264: Data used to display the minimap - // 0x286B0: Initialized to 0xFF, then set to a copy of dungeon::group_id - enum dungeon_group_id group_id_copy; - // 0x286B1: Initialized to 0xFF, then set to a copy of dungeon::0x74B - u8 field_0x286b1; - struct floor_properties floor_properties; // 0x286B2: Properties about the current floor - // Spawn weights for items in different contexts. - // 0 = regular, 1 = Kecleon shop, 2 = monster house, 3 buried, - // 4 = bazaar, 5 = secret room - struct item_spawn_weights item_spawn_weights[6]; - // 0x2C932: Spawn weights for traps. - u16 trap_weights[25]; - // 0x2C964: List of spawn entries on this floor - // This is used during initialization, enemies are spawned using the copy at 0x3974 - struct monster_spawn_entry spawn_entries_master[16]; - // 0x2C9E4: The total number of spawn entries loaded or to be loaded? - u16 number_sprites_loaded; - // 0x2C9E6: Highest level among all the enemies that spawn on this floor - s16 highest_enemy_level; - // 0x2C9E8: ID of an item guaranteed to spawn on the floor, if applicable - // (e.g., certain mission types) - enum item_id guaranteed_item_id; - // 0x2C9EA: List of the indices in the complete monster spawn table for this floor that were - // chosen to spawn on it. It gets rerandomized at the start of each new floor. - u16 spawn_table_entries_chosen[16]; + struct unk_02337EE8 field_0x286b0; u8 field_0x2ca0a; u8 field_0x2ca0b; // 0x2CA0C: Holds the name for the entity that caused the faint. The exact size is a guess. diff --git a/include/dungeon_map_access_1.h b/include/dungeon_map_access_1.h index 112dd880..1d5fb588 100644 --- a/include/dungeon_map_access_1.h +++ b/include/dungeon_map_access_1.h @@ -8,5 +8,8 @@ bool8 IsTileGround(struct tile *tile); // Returns flag tileset_property::is_water_tileset for the current tileset bool8 IsWaterTileset(); +void RemoveMonsterFromTile(struct entity *entity, s32 x, s32 y); +s16 ov29_02337EE8(void); +s16 GetRandomSpawnMonsterID(void); #endif //PMDSKY_DUNGEON_MAP_ACCESS_1_H diff --git a/include/overlay_29_0230F810.h b/include/overlay_29_0230F810.h index 4dd7e887..04bf48a5 100644 --- a/include/overlay_29_0230F810.h +++ b/include/overlay_29_0230F810.h @@ -5,6 +5,16 @@ #include "dungeon_mode.h" +void ov29_0230F140(struct entity *entity); +void ov29_0230F14C(struct entity *entity); +void ov29_0230F158(struct entity *entity); +void TryNonLeaderItemPickUp(struct entity *entity); +bool8 GetExclusiveItemWithEffectFromBag(struct entity *entity, enum exclusive_item_effect_id effect_id, struct item *out); +bool8 AuraBowIsActive(struct entity *entity); +void ov29_0230F728(struct entity *attacker, struct entity *defender, enum exclusive_item_effect_id effect_id, s32 flags); +u8 ExclusiveItemOffenseBoost(struct entity *entity, s32 idx); +u8 ExclusiveItemDefenseBoost(struct entity *entity, s32 idx); +s32 TeamMemberHasItemActive(struct entity **buf, enum item_id item_id); // Checks if a monster is holding a certain item that isn't disabled by Klutz. bool8 ItemIsActive__0230F810(struct entity *entity, enum item_id item_id); bool8 TeamMemberHasExclusiveItemEffectActive(enum exclusive_item_effect_id effect_id); diff --git a/include/overlay_29_02338350.h b/include/overlay_29_02338350.h index c99f46c6..12530b1e 100644 --- a/include/overlay_29_02338350.h +++ b/include/overlay_29_02338350.h @@ -3,6 +3,9 @@ #include "dungeon_mode.h" +s16 ov29_0233804C(void); +s32 ov29_023380FC(struct entity *entity, struct entity **targets); +struct entity* ov29_023381C0(struct entity *entity, enum iq_skill_id iq_skill, bool8 param_3); bool8 NearbyAllyIqSkillIsEnabled(struct entity *entity, enum iq_skill_id iq_skill); struct entity* FindAdjacentEnemy(struct entity *monster); bool8 IsAdjacentToEnemyIgnoreTreatment(struct entity *monster); diff --git a/main.lsf b/main.lsf index dcf2cff4..09aad59a 100644 --- a/main.lsf +++ b/main.lsf @@ -800,7 +800,6 @@ Overlay OVY_29 Object src/dungeon_util_2.o Object asm/overlay_29_022E34A8.o Object src/dg_camera.o - Object asm/overlay_29_022E335C.o Object src/dg_effect.o Object asm/overlay_29_022E37DC.o Object src/overlay_29_022E3F20.o @@ -987,7 +986,6 @@ Overlay OVY_29 Object src/dungeon_ai_items.o Object src/dungeon_ai_items_1.o Object asm/overlay_29_data_02353700.o - Object asm/overlay_29_0230F02C.o Object src/overlay_29_0230F810.o Object src/overlay_29_0230F8AC.o Object asm/overlay_29_0230FB30.o @@ -1204,7 +1202,6 @@ Overlay OVY_29 Object src/overlay_29_02337CA8.o Object asm/overlay_29_02337CCC.o Object src/dungeon_map_access_1.o - Object asm/overlay_29_02337EC0.o Object src/overlay_29_02338350.o Object src/overlay_29_0233836C.o Object src/overlay_29_023383a8_0.o diff --git a/src/dg_camera.c b/src/dg_camera.c index f5ca9ee8..82584e54 100644 --- a/src/dg_camera.c +++ b/src/dg_camera.c @@ -1,12 +1,41 @@ #include "dg_camera.h" +#include "dg_effect.h" #include "dungeon.h" #include "dungeon_items.h" +#include "dungeon_map_access.h" #include "dungeon_pokemon_attributes.h" #include "dungeon_util_static.h" +#include "overlay_29_02336F4C.h" +#include "overlay_29_0234B104.h" // file starts at 0x022e26b68 -extern struct dungeon *DUNGEON_PTR[]; +#ifdef JAPAN +#define REVEAL_WHOLE_FLOOR_MESSAGE 0x888 +#else +#define REVEAL_WHOLE_FLOOR_MESSAGE 0xB77 +#endif + +struct unk_0235354C { + u8 field_0x0; + u8 field_0x1; + u8 field_0x2; + u8 field_0x3; + void *field_0x4; +}; + +extern struct dungeon *DUNGEON_PTR[2]; + +extern const s32 ov29_0235110C[32]; +extern struct unk_0235354C ov29_0235354C; + +extern bool8 ov10_022BFD20(void); +extern void ov29_022E2C6C(void); +extern void DisplayUi(void); +extern void UpdateCamera(s32 param_1); +extern void UpdateMinimap(void); +extern bool8 ScreenEffectActive(s32 param_1); +extern s32 GetEffectAnimationWanOffset(s32 id); bool8 EntityIsValid__022E32E8(struct entity *entity) { @@ -32,3 +61,108 @@ s16 GetVisibilityRange() return visibility_range; } + +void ov29_022E335C(void) +{ + struct display_data *display; + struct monster *info; + struct entity *camera_target; + s32 max_hp; + bool8 ok; + + ok = FALSE; + camera_target = DUNGEON_PTR[0]->display_data.camera_target; + if (!DUNGEON_PTR[0]->display_data.unk_fade_to_black_tracker && !ov10_022BFD20() && + camera_target != NULL && camera_target->type == ENTITY_MONSTER) { + ok = TRUE; + } + if (!ok) { + ov29_022E2C6C(); + return; + } + + display = &DUNGEON_PTR[0]->display_data; + info = GetEntInfo(display->camera_target); + DisplayUi(); + display->floor_touch_screen = + DUNGEON_PTR[0]->floor + DUNGEON_PTR[0]->number_completed_floors; + max_hp = info->max_hp_stat + info->max_hp_boost; + if (max_hp > MAX_HP_LIMIT) + max_hp = MAX_HP_LIMIT; + display->leader_max_hp_touch_screen = max_hp; + display->leader_hp_touch_screen = info->hp; + display->leader_level_touch_screen = info->level; + display->field_0x44 = display->leader_max_hp_touch_screen / 8; +} + +void RevealWholeFloor(struct entity *user, struct entity *target) +{ + s32 x; + s32 y; + + DUNGEON_PTR[0]->display_data.luminous = TRUE; + for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { + for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { + GetTileSafe(x, y)->spawn_or_visibility_flags.visibility |= 1; + } + } + UpdateCamera(0); + UpdateTrapsVisibility(); + UpdateMinimap(); + LogMessageByIdWithPopupCheckUser(user, REVEAL_WHOLE_FLOOR_MESSAGE); +} + +void ov29_022E34B0(u8 param_1) +{ + DUNGEON_PTR[0]->display_data.field_0x30 = param_1; +} + +void ov29_022E34C8(void) +{ + struct dungeon *dungeon; + s32 intensity; + + dungeon = DUNGEON_PTR[0]; + intensity = dungeon->display_data.screen_shake_intensity; + if (intensity == 0) + return; + + if (intensity >= 0x1F) + intensity = 0x1F; + dungeon->display_data.screen_shake_offset = ov29_0235110C[intensity]; + DUNGEON_PTR[0]->display_data.screen_shake_intensity--; + if (DUNGEON_PTR[0]->display_data.screen_shake_intensity == 0) { + DUNGEON_PTR[0]->display_data.screen_shake_intensity = + DUNGEON_PTR[0]->display_data.screen_shake_intensity_reset; + } +} + +bool8 ov29_022E3534(struct display_data *display) +{ + if (display->field_0x34 == 0) { + if (display->luminous || display->natural_lighting) + return TRUE; + } + return FALSE; +} + +void ov29_022E3560(u8 param_1) +{ + ov29_0235354C.field_0x0 = param_1; +} + +u8 ov29_022E3570(void) +{ + return ov29_0235354C.field_0x0; +} + +bool8 DungeonScreenEffectActive(void) +{ + return ScreenEffectActive(0); +} + +void ov29_022E3590(struct entity *entity, s32 id, s32 param_3) +{ + PlayEffectAnimationEntity(entity, id, param_3, GetEffectAnimationWanOffset(id), + 2, 0, -1, NULL); +} diff --git a/src/dg_effect.c b/src/dg_effect.c index f544bf4b..d25f1286 100644 --- a/src/dg_effect.c +++ b/src/dg_effect.c @@ -1,5 +1,85 @@ #include "dg_effect.h" +#include "dungeon.h" #include "dungeon_util_static.h" +#include "overlay_29_022E9FC0.h" + +extern struct dungeon *DUNGEON_PTR[]; + +extern bool8 ShouldDisplayEntityAdvanced(struct entity *entity); +extern void AnimationDelayOrSomething(bool8 param_1); +extern void GetPixelOffsetFromSprite(struct position *offset, + struct animation_control *anim_ctrl, u32 idx); +extern void ov10_022BF274(struct unk_022BF274 *params); +extern s32 ov10_022BF2B4(struct unk_022BF274 *params, s32 param_2); +extern void InitOamAdjustmentInfo(struct unk_0201C000 *oam); +extern bool8 AnimationHasMoreFrames(s16 param_1); + +s32 PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 param_3, u8 param_4, + s32 param_5, u8 param_6, s16 param_7, + struct unk_0201C000 *param_8) +{ + struct position offset; + struct unk_022BF274 params; + struct monster *info; + s32 dy; + s32 px; + s32 py; + s32 handle; + s32 i; + + if (!EntityIsValid__022E37B8(entity)) + return -1; + + info = GetEntInfo(entity); + if (!ShouldDisplayEntityAdvanced(entity)) + return -1; + + if (param_6 == 0 && info->two_turn_move_invincible == 2) + return -1; + + if (param_5 != 0) + AnimationDelayOrSomething(param_5 == 2); + + GetPixelOffsetFromSprite(&offset, &entity->anim_ctrl, param_4); + if (offset.x == 0x63 || offset.y == 0x63) { + px = entity->pixel_pos.x; + py = entity->pixel_pos.y - info->field_0x188; + } else { + px = entity->pixel_pos.x + (offset.x << 8); + py = entity->pixel_pos.y + (offset.y << 8) - info->field_0x188; + } + dy = ((s32)entity->pixel_pos.y >> 8) - + DUNGEON_PTR[0]->display_data.camera_pixel_pos.y; + + ov10_022BF274(¶ms); + params.field_0x0 = id; + params.field_0x4 = 0; + if (param_7 < 0 || param_7 > 8) + params.field_0x8 = -1; + else + params.field_0x8 = param_7; + params.field_0xc = px >> 8; + params.field_0xe = py >> 8; + params.field_0x14 = -1; + params.field_0x10 = 0; + params.field_0x12 = 0; + params.field_0x18 = dy / 2 + 1; + if (param_8 == NULL) + InitOamAdjustmentInfo(¶ms.field_0x1c); + else + params.field_0x1c = *param_8; + + handle = ov10_022BF2B4(¶ms, 0); + if (param_3 == 0) + return handle; + + for (i = 0; i < 100; i++) { + if (!AnimationHasMoreFrames(handle)) + break; + AdvanceFrame(0x42); + } + return -1; +} // file starts at 0x022e35e4 diff --git a/src/dungeon_logic_2.c b/src/dungeon_logic_2.c index a6920a15..a88d97b4 100644 --- a/src/dungeon_logic_2.c +++ b/src/dungeon_logic_2.c @@ -1,4 +1,5 @@ #include "dungeon_logic_2.h" +#include "overlay_29_0230F810.h" #include "main_0205283C.h" #include "dungeon.h" #include "dungeon_pokemon_attributes_1.h" @@ -29,7 +30,6 @@ extern const s16 EXCLUSIVE_ITEM_EXP_BOOST; extern bool8 LeafGuardIsActive(struct entity *user, struct entity *target, bool8 log_message); extern bool8 ov29_02301A84(struct entity *user, struct entity *target, bool8 log_message); -extern bool8 GetExclusiveItemWithEffectFromBag(struct entity *, enum exclusive_item_effect_id effect_id, struct item *item); bool8 MonsterCanThrowItems(struct monster *monster) { diff --git a/src/dungeon_map_access_1.c b/src/dungeon_map_access_1.c index dfbb7969..fc42b8cb 100644 --- a/src/dungeon_map_access_1.c +++ b/src/dungeon_map_access_1.c @@ -1,10 +1,15 @@ #include "dungeon_map_access_1.h" +#include "dg_random.h" #include "dungeon.h" +#include "dungeon_map_access.h" #include "dungeon_util_static.h" +#include "main_0200224C.h" #include "secondary_terrain_types.h" #include "tileset.h" -extern struct dungeon *DUNGEON_PTR[]; +extern struct dungeon *DUNGEON_PTR; + +extern s32 GetMonsterIdFromSpawnEntry(struct monster_spawn_entry *entry); bool8 IsTileGround(struct tile *tile) { @@ -15,7 +20,7 @@ bool8 IsTileGround(struct tile *tile) is_ground = TRUE; } else if (GetTerrainType(tile) != TERRAIN_TYPE_SECONDARY || - SECONDARY_TERRAIN_TYPES[DUNGEON_PTR[0]->gen_info.tileset_id] == SECONDARY_TERRAIN_LAVA) + SECONDARY_TERRAIN_TYPES[DUNGEON_PTR->gen_info.tileset_id] == SECONDARY_TERRAIN_LAVA) { is_ground = TRUE; } @@ -24,5 +29,52 @@ bool8 IsTileGround(struct tile *tile) bool8 IsWaterTileset() { - return TILESET_PROPERTIES[DUNGEON_PTR[0]->gen_info.tileset_id].is_water_tileset; + return TILESET_PROPERTIES[DUNGEON_PTR->gen_info.tileset_id].is_water_tileset; +} + +void RemoveMonsterFromTile(struct entity *entity, s32 x, s32 y) +{ + struct tile *tile = GetTileSafe(x, y); + if (tile->monster == entity) + tile->monster = NULL; +} + +s16 ov29_02337EE8(void) +{ + struct dungeon *dungeon = DUNGEON_PTR; + struct unk_02337EE8 *p = &dungeon->field_0x286b0; + s16 ids[16]; + s16 i; + s16 count = 0; + for (i = 0; i < 16; i = (s16)(i + 1)) { + s32 id = GetMonsterIdFromSpawnEntry(&p->spawn_entries_master[i]); + if (id == 0) + break; + if (id != MONSTER_KECLEON && id != MONSTER_KECLEON_SECONDARY && + id != MONSTER_DECOY && id != MONSTER_STATUE) { + ids[count] = id; + count = (s16)(count + 1); + } + } + return ids[RandInt(count)]; +} + +s16 GetRandomSpawnMonsterID(void) +{ + struct dungeon *dungeon = DUNGEON_PTR; + struct unk_02337EE8 *p = &dungeon->field_0x286b0; + s16 ids[16]; + s16 i; + s16 count = 0; + for (i = 0; i < 16; i = (s16)(i + 1)) { + s32 id = GetMonsterIdFromSpawnEntry(&p->spawn_entries_master[i]); + if (id == 0) + break; + if (id != MONSTER_KECLEON && id != MONSTER_KECLEON_SECONDARY && + id != MONSTER_DECOY && id != MONSTER_STATUE && id != MONSTER_DITTO) { + ids[count] = id; + count = (s16)(count + 1); + } + } + return ids[DungeonRandInt(count)]; } diff --git a/src/dungeon_recruitment.c b/src/dungeon_recruitment.c index e6add580..09d2cc24 100644 --- a/src/dungeon_recruitment.c +++ b/src/dungeon_recruitment.c @@ -4,6 +4,7 @@ #include "dungeon_mode.h" #include "dungeon_pokemon_attributes_1.h" #include "dungeon_recruitment.h" +#include "dungeon_map_access_1.h" #include "dungeon_recruitment_2.h" #include "dg_random.h" #include "dungeon_visibility.h" @@ -66,7 +67,6 @@ s32 ov29_0234D7C0(s32 message_id, struct preprocessor_args *args, s32 param_3, void ov29_0234D8A0(s32 param_1); struct entity *ov29_0234EE10(struct entity *entity, char *name); bool8 DungeonModeSetupAndShowNameKeyboard(char *name, char *param_2, s32 param_3); -void RemoveMonsterFromTile(struct entity *entity, s32 x, s32 y); bool8 ov29_0230E5A8(struct entity *user, struct entity *target, s32 x, s32 y); s32 ov29_0230E5FC(struct team_member *member, s32 param_2); void ov29_0230E658(s32 message_id); diff --git a/src/move_orb_effects.c b/src/move_orb_effects.c index 90993d62..13c5ff4c 100644 --- a/src/move_orb_effects.c +++ b/src/move_orb_effects.c @@ -1,4 +1,5 @@ #include "dungeon_pokemon_attributes.h" +#include "overlay_29_0230F810.h" #include "dungeon_map_access.h" #include "dungeon_util_static.h" #include "dungeon_util.h" @@ -38,7 +39,6 @@ extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 extern void TryActivateSteadfast(struct entity *attacker, struct entity *defender); extern void TryActivateQuickFeet(struct entity *attacker ,struct entity *defender); extern s32 CalcStatusDuration(struct entity *entity, const s16 *turn_range, bool8 iq_skill_effects); -extern bool8 GetExclusiveItemWithEffectFromBag(struct entity *, enum exclusive_item_effect_id effect_id, struct item *item); extern struct preprocessor_args* GetMessageLogPreprocessorArgs(void); extern void SetPreprocessorArgsStringToName(struct preprocessor_args* preprocessor_args, s32 pos, struct monster* monster, u32 param_4, u8 name_type); extern int CalcSpeedStageWrapper(struct entity* entity); diff --git a/src/overlay_29_022E3F20.c b/src/overlay_29_022E3F20.c index 407d012a..c9d3f065 100644 --- a/src/overlay_29_022E3F20.c +++ b/src/overlay_29_022E3F20.c @@ -9,9 +9,6 @@ extern void PlaySeByIdIfShouldDisplayEntity(struct entity *entity, s32 se_id); extern s32 GetEffectAnimationWanOffset(s32 id); -extern void PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, - s32 c, s32 d, s32 e, s32 f); - extern const u64 STATUS_ICON_ARRAY_SLEEP[]; extern const u64 STATUS_ICON_ARRAY_BURN[]; extern const u64 STATUS_ICON_ARRAY_FREEZE[]; diff --git a/src/overlay_29_022E406C.c b/src/overlay_29_022E406C.c index 9489226f..cbdf812d 100644 --- a/src/overlay_29_022E406C.c +++ b/src/overlay_29_022E406C.c @@ -1,10 +1,8 @@ #include "overlay_29_022E406C.h" +#include "dg_effect.h" extern s32 GetEffectAnimationWanOffset(s32 id); -extern void PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, - s32 c, s32 d, s32 e, s32 f); - void PlayEffectAnimation0x171(struct entity *entity) { PlayEffectAnimationEntity(entity, 0x171, 0, GetEffectAnimationWanOffset(0x171), diff --git a/src/overlay_29_022E4338.c b/src/overlay_29_022E4338.c index 501970e8..316abaaa 100644 --- a/src/overlay_29_022E4338.c +++ b/src/overlay_29_022E4338.c @@ -1,9 +1,7 @@ #include "overlay_29_022E4338.h" +#include "dg_effect.h" extern s32 GetEffectAnimationWanOffset(s32 id); -extern void PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, - s32 c, s32 d, s32 e, s32 f); - void PlayEffectAnimationEntityStandard(struct entity *entity, s32 anim_id) { @@ -13,9 +11,6 @@ void PlayEffectAnimationEntityStandard(struct entity *entity, s32 anim_id) extern s32 GetEffectAnimationWanOffset(s32 id); -extern void PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, - s32 c, s32 d, s32 e, s32 f); - void ov29_022E4338(struct entity *entity) { PlayEffectAnimationEntity(entity, 0x1A9, 1, GetEffectAnimationWanOffset(0x1A9), diff --git a/src/overlay_29_022E45B8.c b/src/overlay_29_022E45B8.c index 86e11904..99cc319c 100644 --- a/src/overlay_29_022E45B8.c +++ b/src/overlay_29_022E45B8.c @@ -1,9 +1,7 @@ #include "overlay_29_022E45B8.h" +#include "dg_effect.h" extern s32 GetEffectAnimationWanOffset(s32 id); -extern void PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, - s32 c, s32 d, s32 e, s32 f); - extern void PlaySeByIdIfShouldDisplayEntity(struct entity *entity, s32 se_id); void ov29_022E45B8(struct entity *entity) diff --git a/src/overlay_29_022E4704.c b/src/overlay_29_022E4704.c index 7f42a749..ac9e0de3 100644 --- a/src/overlay_29_022E4704.c +++ b/src/overlay_29_022E4704.c @@ -1,12 +1,10 @@ #include "overlay_29_022E4704.h" +#include "dg_effect.h" extern bool8 MonsterIsType(struct entity *entity, enum type_id type_id); extern s32 GetEffectAnimationWanOffset(s32 id); -extern void PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, - s32 c, s32 d, s32 e, s32 f); - extern void PlaySeByIdIfShouldDisplayEntity(struct entity *entity, s32 se_id); void PlayInvisifySeIfShouldDisplayEntity(struct entity *entity) diff --git a/src/overlay_29_022E66C4.c b/src/overlay_29_022E66C4.c index e3b7656c..ebc8822a 100644 --- a/src/overlay_29_022E66C4.c +++ b/src/overlay_29_022E66C4.c @@ -1,10 +1,8 @@ #include "overlay_29_022E66C4.h" +#include "dg_effect.h" extern s32 GetEffectAnimationWanOffset(s32 id); -extern void PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, - s32 c, s32 d, s32 e, s32 f); - extern void PlayEffectAnimationPos(struct entity *entity, s32 effect_id, s32 a); void ov29_022E66C4(struct entity *entity) diff --git a/src/overlay_29_022EFA6C.c b/src/overlay_29_022EFA6C.c index 322c2250..8fcfb06e 100644 --- a/src/overlay_29_022EFA6C.c +++ b/src/overlay_29_022EFA6C.c @@ -1,9 +1,9 @@ #include "overlay_29_022EFA6C.h" +#include "overlay_29_0230F810.h" #include "dungeon.h" extern struct dungeon *DUNGEON_PTR[]; -extern s32 TeamMemberHasItemActive(struct entity **buf, enum item_id item_id); extern void BoostIQ(struct entity *entity, s16 iq, bool8 a); @@ -19,7 +19,7 @@ void TryActivateIqBooster(void) s32 n; s32 i; - iq = DUNGEON_PTR[0]->floor_properties.iq_booster_value; + iq = DUNGEON_PTR[0]->field_0x286b0.floor_properties.iq_booster_value; if (iq <= 0) { return; } diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index 8b44f15f..b16dab34 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -1,4 +1,7 @@ #include "overlay_29_02308FBC.h" +#include "dg_effect.h" +#include "overlay_29_0230F810.h" +#include "overlay_29_02338350.h" #include "common.h" #include "dg_object.h" #include "dg_random.h" @@ -87,8 +90,6 @@ extern bool8 IsEitherMonsterInvalid(struct entity *a, struct entity *b); extern void ResetDamageData(struct unk_02308FE0 *damage_data); extern void ov29_022E57D4(struct entity *entity); extern void ov29_022E5E84(struct entity *a, struct entity *b); -extern void ov29_0230F728(struct entity *attacker, struct entity *defender, enum exclusive_item_effect_id effect_id, s32 a); -extern s32 ov29_023380FC(struct entity *entity, struct entity **targets); extern struct unk_023535DC ov29_023535DC[]; extern s16 ARENA_TRAP_ACTIVATION_CHANCE; extern s16 CUTE_CHARM_INFATUATE_CHANCE; @@ -117,7 +118,6 @@ extern s32 GetIdleAnimationId(struct entity *entity); extern void HandleFaint(struct entity *fainted_entity, s32 damage_source, struct entity *killer); extern bool8 IsMonsterIdInNormalRangeVeneer(enum monster_id monster_id); extern void MoveMonsterToPos(struct entity* entity, s32 x_pos, s32 y_pos, bool8 reset_prev_pos_fields); -extern s32 PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, s32 c, s32 d, s32 e, s32 f); extern int PlayMissSfx__022E611C(); extern int PlayMissSfx__022E6150(); extern void RemoveHolderForItemInBag(struct item* item); diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c index 84b7c9fc..e27c4bbf 100644 --- a/src/overlay_29_0230BBAC.c +++ b/src/overlay_29_0230BBAC.c @@ -1,4 +1,5 @@ #include "overlay_29_0230BBAC.h" +#include "overlay_29_0230F810.h" #include "debug.h" #include "dg_random.h" #include "dungeon.h" @@ -34,13 +35,10 @@ extern struct dungeon *DUNGEON_PTR; extern u8 GetMonsterGenderVeneer(s16 monster_id); -extern u8 ExclusiveItemOffenseBoost(struct entity *entity, s32 idx); -extern u8 ExclusiveItemDefenseBoost(struct entity *entity, s32 idx); extern s32 FixedPoint64ToInt(struct fixed_point_64 *x); extern void PlayEffectAnimation0x1A9__022E6130(struct entity *entity); extern void PlayEffectAnimation0x1A9__022E617C(struct entity *entity); extern void PlayEffectAnimation0x18E(struct entity *entity); -extern bool8 AuraBowIsActive(struct entity *entity); extern bool8 FixedPoint64CmpLt(const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern void DivideFixedPoint64(struct fixed_point_64 *out, struct fixed_point_64 *a, struct fixed_point_64 *b); extern void ResetDamageCalcDiagnostics(void); diff --git a/src/overlay_29_0230F810.c b/src/overlay_29_0230F810.c index a567d975..84ad025d 100644 --- a/src/overlay_29_0230F810.c +++ b/src/overlay_29_0230F810.c @@ -1,11 +1,318 @@ #include "overlay_29_0230F810.h" #include "dungeon.h" #include "dungeon_ai_items_1.h" -#include "overlay_29_0230F8AC.h" - -extern struct dungeon *DUNGEON_PTR[]; +#include "dungeon_ai_targeting.h" #include "dungeon_items.h" #include "dungeon_pokemon_attributes.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_util_1.h" +#include "dungeon_util_2.h" +#include "dungeon_util_static.h" +#include "item_util.h" +#include "joined_at_checks.h" +#include "main_0200D81C.h" +#include "main_0200ECFC.h" +#include "main_0200EDC0.h" +#include "overlay_29_0230F8AC.h" +#include "overlay_29_022E1610.h" +#include "overlay_29_022EAC7C.h" +#include "overlay_29_022EC7E8.h" +#include "overlay_29_022F52BC.h" +#include "overlay_29_02344AF8.h" +#include "overlay_29_02348D00.h" +#include "overlay_29_0234B4BC.h" + +#ifdef JAPAN +#define MESSAGE_C5E 0x99D +#define MESSAGE_C5F 0x99E +#define MESSAGE_C60 0x99F +#define MESSAGE_C61 0x9A0 +#define MESSAGE_C62 0x9A1 +#define MESSAGE_C63 0x9A2 +#else +#define MESSAGE_C5E 0xC5E +#define MESSAGE_C5F 0xC5F +#define MESSAGE_C60 0xC60 +#define MESSAGE_C61 0xC61 +#define MESSAGE_C62 0xC62 +#define MESSAGE_C63 0xC63 +#endif + +extern struct dungeon *DUNGEON_PTR[]; + +extern struct bag_items *BAG_ITEMS_PTR_MIRROR; + +extern void RemoveGroundItem(struct position *pos, bool8 a); +extern bool8 GetExclusiveItemForMonsterFromBag(struct item *item, + enum exclusive_item_effect_id effect_id, + s16 monster_id, enum type_id type1, + enum type_id type2); +extern void UseThrowableItem(struct entity *entity); +extern void ov29_022F9EA0(struct entity *entity); +extern void ov29_02347040(void); +extern bool8 ov29_02345004(struct item *item); +extern s32 ov29_02348D3C(struct item *item); +extern bool8 ov29_02348DD8(struct entity *entity, struct item *item, bool8 a); +extern void ov29_02348ECC(struct item *item, s32 a); + +void ov29_0230F140(struct entity *entity) +{ + UseSingleUseItemSelf(entity); +} + +void ov29_0230F14C(struct entity *entity) +{ + UseThrowableItem(entity); +} + +void ov29_0230F158(struct entity *entity) +{ + TryNonLeaderItemPickUp(entity); +} + +void TryNonLeaderItemPickUp(struct entity *entity) +{ + s32 slot_ids[INVENTORY_SIZE + 1]; + struct item *slots[INVENTORY_SIZE + 1]; + struct monster *monster; + struct tile *tile; + struct entity *object; + struct item *item; + struct item *slot; + bool8 pick_up; + s32 count; + s32 best; + struct item *bag; + s32 best_quantity; + s32 item_id; + int i; + bool8 bag_enabled; + s32 quantity; + + monster = GetEntInfo(entity); + tile = GetTileAtEntity(entity); + object = tile->object; + if (object == NULL) + return; + if (IsFloorOver()) + return; + SubstitutePlaceholderStringTags(0, entity, 0); + if (monster->is_team_leader) + return; + if (monster->shopkeeper == SHOPKEEPER_MODE_SHOPKEEPER) + return; + if (IsExperienceLocked(monster)) + return; + if (monster->monster_behavior == BEHAVIOR_RESCUE_TARGET) + return; + + monster = GetEntInfo(entity); + pick_up = TRUE; + item = GetItemInfo(object); + if (monster->is_not_team_member && IsItemUnkMissionItem2(item)) + return; + if ((item->flags & ITEM_FLAG_IN_SHOP) + || (!monster->is_not_team_member && (tile->terrain_flags & TERRAIN_TYPE_SHOP))) + pick_up = FALSE; + if (!pick_up) + return; + + if (ShouldMonsterRunAwayAndShowEffect(entity, TRUE)) { + PrepareItemForPrinting__02345728(0, item); + SubstitutePlaceholderStringTags(0, entity, 0); + LogMessageByIdWithPopup(entity, MESSAGE_C5E); + return; + } + + if (!monster->is_not_team_member + && GetItemCategoryVeneer(item->id) == CATEGORY_POKE) { + if (monster->is_not_team_member) + PlaySeByIdIfNotSilence(0x1305); + else + PlaySeByIdIfNotSilence(0x1308); + if (IqSkillIsEnabled(entity, IQ_COIN_WATCHER)) + item->flags |= ITEM_FLAG_UNK_MONEY_QUANTITY; + AddMoneyCarried(GetMoneyQuantity(item)); + PrepareItemForPrinting__02345728(0, item); + RemoveGroundItem(&entity->pos, TRUE); + LogMessageByIdWithPopup(entity, MESSAGE_C5F); + return; + } + + bag_enabled = DUNGEON_PTR[0]->bag_enabled; + if (bag_enabled && !monster->is_not_team_member) { + bag = BAG_ITEMS_PTR_MIRROR->bag_items->bag_items; + for (best = 0; best < INVENTORY_SIZE; best++) { + slots[best] = &bag[best]; + slot_ids[best] = best; + } + slots[INVENTORY_SIZE] = &monster->held_item; + slot_ids[INVENTORY_SIZE] = -1; + count = INVENTORY_SIZE + 1; + } + else { + slots[0] = &monster->held_item; + slot_ids[0] = -1; + count = 1; + } + + item_id = item->id; + if (item_id < 0xB && !(item->flags & ITEM_FLAG_IN_SHOP)) { + best = -1; + best_quantity = -1; + for (i = 0; i < count; i++) { + if (!ItemExists(((const struct item **)slots)[i]->flags)) + continue; + if (!(slots[i]->flags & ITEM_FLAG_IN_SHOP) && item_id == slots[i]->id + && (item->flags & ITEM_FLAG_STICKY) + == (slots[i]->flags & ITEM_FLAG_STICKY)) { + if (slots[i]->quantity == 99) + continue; + if (best_quantity < slots[i]->quantity) { + best_quantity = slots[i]->quantity; + best = i; + } + } + } + if (best != -1) { + slot = slots[best]; + quantity = slot->quantity + item->quantity; + if (quantity >= 99) + quantity = 99; + slot->quantity = quantity; + if (ItemSticky(item->flags)) + slot->flags |= ITEM_FLAG_STICKY; + ov29_02347040(); + PrepareItemForPrinting__02345728(0, item); + RemoveGroundItem(&entity->pos, TRUE); + PlaySeByIdIfNotSilence(0x1304); + if (slot_ids[best] < 0) + LogMessageByIdWithPopup(entity, MESSAGE_C60); + else + LogMessageByIdWithPopup(entity, MESSAGE_C61); + return; + } + } + + if (bag_enabled && !monster->is_not_team_member) + count = GetCurrentBagCapacity(); + + for (i = 0; i < count; i++) { + if (!ItemExists(slots[i]->flags)) + break; + } + + if (ov29_02348DD8(entity, item, TRUE)) + return; + + if (i == count) { + PrepareItemForPrinting__02345728(0, item); + LogMessageByIdWithPopup(entity, MESSAGE_C62); + return; + } + + if (monster->is_not_team_member) + PlaySeByIdIfNotSilence(0x1305); + else + PlaySeByIdIfNotSilence(0x1304); + + if (slot_ids[i] < 0) { + monster->held_item = *item; + ov29_022F9EA0(entity); + PrepareItemForPrinting__02345728(0, item); + RemoveGroundItem(&entity->pos, TRUE); + LogMessageByIdWithPopup(entity, MESSAGE_C60); + return; + } + + quantity = ov29_02348D3C(item); + if (ov29_02345004(item)) { + SubstitutePlaceholderStringTags(0, entity, 0); + LogMessageByIdWithPopup(entity, MESSAGE_C63); + return; + } + PrepareItemForPrinting__02345728(0, item); + RemoveGroundItem(&entity->pos, TRUE); + LogMessageByIdWithPopup(entity, MESSAGE_C61); + ov29_02348ECC(item, quantity); +} + +bool8 GetExclusiveItemWithEffectFromBag(struct entity *entity, enum exclusive_item_effect_id effect_id, struct item *out) +{ + struct item item; + struct monster *monster; + + if (!EntityIsValid__0230F008(entity)) + return FALSE; + + monster = GetEntInfo(entity); + if (!GetExclusiveItemForMonsterFromBag(&item, effect_id, monster->apparent_id, + monster->types[0], monster->types[1])) + return FALSE; + + *out = item; + return TRUE; +} + +bool8 AuraBowIsActive(struct entity *entity) +{ + struct monster *monster; + + monster = GetEntInfo(entity); + if (AbilityIsActiveVeneer(entity, ABILITY_KLUTZ)) + return FALSE; + + if (!ItemExists(monster->held_item.flags) || !IsAuraBow(monster->held_item.id)) + return FALSE; + + return HasHeldItem(entity, (enum item_id)monster->held_item.id); +} + +void ov29_0230F728(struct entity *attacker, struct entity *defender, enum exclusive_item_effect_id effect_id, s32 flags) +{ + struct item item; + struct monster *attacker_info; + struct monster *defender_info; + + defender_info = GetEntInfo(defender); + attacker_info = GetEntInfo(attacker); + GetExclusiveItemForMonsterFromBag(&item, effect_id, defender_info->apparent_id, + defender_info->types[0], defender_info->types[1]); + attacker_info->exclusive_item_trigger_bitflags |= flags; + attacker_info->field_0x190 = item.id; +} + +u8 ExclusiveItemOffenseBoost(struct entity *entity, s32 idx) +{ + struct monster *monster = GetEntInfo(entity); + + return monster->exclusive_item_offense_boosts[idx]; +} + +u8 ExclusiveItemDefenseBoost(struct entity *entity, s32 idx) +{ + struct monster *monster = GetEntInfo(entity); + + return monster->exclusive_item_defense_boosts[idx]; +} + +s32 TeamMemberHasItemActive(struct entity **buf, enum item_id item_id) +{ + s16 i; + s16 count; + + count = 0; + for (i = 0; i < 4; i++) { + struct entity *member = DUNGEON_PTR[0]->monster_slot_ptrs[i]; + + if (EntityIsValid__0230F008(member) && ItemIsActive__0230F810(member, item_id)) { + buf[count] = member; + count++; + } + } + + return count; +} bool8 ItemIsActive__0230F810(struct entity *entity, enum item_id item_id) { diff --git a/src/overlay_29_0232CA14.c b/src/overlay_29_0232CA14.c index 744845c8..1af4ad76 100644 --- a/src/overlay_29_0232CA14.c +++ b/src/overlay_29_0232CA14.c @@ -1,7 +1,7 @@ #include "overlay_29_0232CA14.h" +#include "dg_camera.h" #include "move_orb_effects.h" -extern void RevealWholeFloor(struct entity *user, struct entity *target); extern void TryInflictPetrifiedStatus(struct entity *user, struct entity *target); extern void TryPounce(struct entity *user, struct entity *target, s32); extern void TryTrawl(struct entity *user, struct entity *target); diff --git a/src/overlay_29_02338350.c b/src/overlay_29_02338350.c index 4a957e6d..badaf8e5 100644 --- a/src/overlay_29_02338350.c +++ b/src/overlay_29_02338350.c @@ -1,9 +1,83 @@ #include "overlay_29_02338350.h" +#include "dg_random.h" +#include "dungeon.h" #include "dungeon_map_access.h" +#include "dungeon_pokemon_attributes_1.h" #include "dungeon_util.h" #include "dungeon_util_static.h" +#include "main_02001188.h" -extern struct entity *ov29_023381C0(struct entity *entity, enum iq_skill_id iq_skill, bool8 param_3); +extern struct dungeon *DUNGEON_PTR; + +extern bool8 ShouldTreatMonsterAsAlly(struct entity *monster, struct entity *other); + +s16 ov29_0233804C(void) +{ + s16 *ids = (s16 *)MemAlloc(0x2d8, 0x10); + s16 i; + s16 idx = DungeonRandRange(1, 0x16c); + s16 count = 0; + s16 chosen; + for (i = 0; i < 0x16c; i++) { + if (idx >= 0x16c) + idx = 0; + if (DUNGEON_PTR->field_0x286b0.item_spawn_weights[0].item_threshold[idx] != 0) + ids[count++] = idx; + idx++; + } + chosen = DungeonRandInt(count); + chosen = ids[chosen]; + MemFree(ids); + return chosen; +} + +s32 ov29_023380FC(struct entity *entity, struct entity **targets) +{ + s16 i; + bool8 is_not_team_member = FALSE; + s16 count = 0; + if (GetEntInfo(entity)->is_not_team_member) + is_not_team_member = TRUE; + + for (i = 0; i < NUM_DIRECTIONS; i++) { + struct entity *other = GetTile(entity->pos.x + DIRECTIONS_XY[i].x, + entity->pos.y + DIRECTIONS_XY[i].y)->monster; + if (other != NULL && GetEntityType(other) == ENTITY_MONSTER) { + bool8 other_not_team_member = GetEntInfo(other)->is_not_team_member; + if (is_not_team_member) { + if (!other_not_team_member) { + targets[count] = other; + count = (s16)(count + 1); + } + } + else if (other_not_team_member) { + targets[count] = other; + count = (s16)(count + 1); + } + } + } + return count; +} + +struct entity* ov29_023381C0(struct entity *entity, enum iq_skill_id iq_skill, bool8 param_3) +{ + s16 i; + for (i = 0; i < NUM_DIRECTIONS; i = (s16)(i + 1)) { + struct entity *other = GetTile(entity->pos.x + DIRECTIONS_XY[i].x, + entity->pos.y + DIRECTIONS_XY[i].y)->monster; + if (other != NULL && GetEntityType(other) == ENTITY_MONSTER && + IqSkillIsEnabled(other, iq_skill)) { + if (param_3) { + if (ShouldTreatMonsterAsAlly(other, entity)) + return other; + } + else if (ShouldTreatMonsterAsAlly(entity, other)) { + return other; + } + } + } + return NULL; +} bool8 NearbyAllyIqSkillIsEnabled(struct entity *entity, enum iq_skill_id iq_skill) { diff --git a/src/overlay_30_init.c b/src/overlay_30_init.c index a5fe97fe..990766f8 100644 --- a/src/overlay_30_init.c +++ b/src/overlay_30_init.c @@ -255,10 +255,10 @@ void WriteQuicksaveData(void *buffer, s32 size) ov30_02385CE0(&sp4, OVERLAY30_JP_STRING_1); WriteBitsToDataSerializer(&sp4, &DUNGEON_PTR->id, 0xAC); ov30_02385CE0(&sp4, OVERLAY30_JP_STRING_1); - ov30_02385D34(&sp4, DUNGEON_PTR->highest_enemy_level); + ov30_02385D34(&sp4, DUNGEON_PTR->field_0x286b0.highest_enemy_level); for(index = 0; index < 0x10; index++) { - ov30_02385D14(&sp4, DUNGEON_PTR->spawn_table_entries_chosen[index]); + ov30_02385D14(&sp4, DUNGEON_PTR->field_0x286b0.spawn_table_entries_chosen[index]); } ov30_02383C70(&sp4); @@ -806,11 +806,11 @@ void ov30_023842F4(void *buffer, s32 arg1) ReadBitsFromDataSerializer(&sp4, &DUNGEON_PTR->id, 0xAC); ov30_02385CF0(&sp4, OVERLAY30_JP_STRING_1); - DUNGEON_PTR->highest_enemy_level = ov30_02385EDC(&sp4); + DUNGEON_PTR->field_0x286b0.highest_enemy_level = ov30_02385EDC(&sp4); for(int var_r4 = 0; var_r4 < 0x10; var_r4++) { - DUNGEON_PTR->spawn_table_entries_chosen[var_r4] = ov30_02385EC4(&sp4); + DUNGEON_PTR->field_0x286b0.spawn_table_entries_chosen[var_r4] = ov30_02385EC4(&sp4); } ov30_02384400(&sp4); diff --git a/src/random_trap.c b/src/random_trap.c index 269bc6e7..99c51426 100644 --- a/src/random_trap.c +++ b/src/random_trap.c @@ -9,7 +9,7 @@ u8 GetRandomSpawnTrapId() { s32 rnd = DungeonRandInt(10000); for(s32 i = 0; i < TRAP_NONE; i++) { - u16 weight = DUNGEON_PTR[0]->trap_weights[i]; + u16 weight = DUNGEON_PTR[0]->field_0x286b0.trap_weights[i]; if(weight == 0) { continue; } diff --git a/src/spawn_1.c b/src/spawn_1.c index 5c4928c9..49815be2 100644 --- a/src/spawn_1.c +++ b/src/spawn_1.c @@ -15,7 +15,7 @@ s16 GetItemIdToSpawn(enum spawn_weight_type spawn_type) { s32 rnd = DungeonRandInt(10000); enum item_category category = CATEGORY_DUMMY; for(idx = 0; idx < 16; idx++) { - s16 threshold = DUNGEON_PTR->item_spawn_weights[spawn_type].category_threshold[idx]; + s16 threshold = DUNGEON_PTR->field_0x286b0.item_spawn_weights[spawn_type].category_threshold[idx]; if(threshold == 0) { continue; } @@ -32,7 +32,7 @@ s16 GetItemIdToSpawn(enum spawn_weight_type spawn_type) { rnd = DungeonRandInt(10000); for(idx = 0; idx < 0x16c; idx++) { - s16 threshold = DUNGEON_PTR->item_spawn_weights[spawn_type].item_threshold[idx]; + s16 threshold = DUNGEON_PTR->field_0x286b0.item_spawn_weights[spawn_type].item_threshold[idx]; if(threshold == 0) { continue; } @@ -41,7 +41,7 @@ s16 GetItemIdToSpawn(enum spawn_weight_type spawn_type) { continue; } - threshold = DUNGEON_PTR->item_spawn_weights[spawn_type].item_threshold[idx]; + threshold = DUNGEON_PTR->field_0x286b0.item_spawn_weights[spawn_type].item_threshold[idx]; if(threshold >= rnd) { return idx; } @@ -68,12 +68,12 @@ s32 GetRandomSecretRoomItem() { s32 CopySpawnEntriesMaster(struct monster_spawn_entry out[], s32 idx_out) { for(s32 i = 0; i < 16; i++) { - s32 monster_id = GetMonsterIdFromSpawnEntry(&(DUNGEON_PTR->spawn_entries_master[i])); + s32 monster_id = GetMonsterIdFromSpawnEntry(&(DUNGEON_PTR->field_0x286b0.spawn_entries_master[i])); if(monster_id == 0) { break; } - out[idx_out] = DUNGEON_PTR->spawn_entries_master[i]; + out[idx_out] = DUNGEON_PTR->field_0x286b0.spawn_entries_master[i]; idx_out++; } @@ -82,7 +82,7 @@ s32 CopySpawnEntriesMaster(struct monster_spawn_entry out[], s32 idx_out) { s32 MonsterSpawnListPartialCopy(struct monster_spawn_entry entry_out[], s32 idx_out) { for(s32 i = 0; i < 16; i++) { - s32 monster_id = GetMonsterIdFromSpawnEntry(&(DUNGEON_PTR->spawn_entries_master[i])); + s32 monster_id = GetMonsterIdFromSpawnEntry(&(DUNGEON_PTR->field_0x286b0.spawn_entries_master[i])); if(monster_id == 0) { break; } @@ -91,11 +91,11 @@ s32 MonsterSpawnListPartialCopy(struct monster_spawn_entry entry_out[], s32 idx_ continue; } - if(DUNGEON_PTR->spawn_entries_master[i].incremental_spawn_weight[0] == 0) { + if(DUNGEON_PTR->field_0x286b0.spawn_entries_master[i].incremental_spawn_weight[0] == 0) { continue; } - entry_out[idx_out] = DUNGEON_PTR->spawn_entries_master[i]; + entry_out[idx_out] = DUNGEON_PTR->field_0x286b0.spawn_entries_master[i]; idx_out++; } return idx_out; diff --git a/src/spawn_2.c b/src/spawn_2.c index ee31445f..25c3ab6c 100644 --- a/src/spawn_2.c +++ b/src/spawn_2.c @@ -11,7 +11,7 @@ extern s32 GetMonsterLevelFromSpawnEntry(struct monster_spawn_entry *); s32 IsOnMonsterSpawnList(s32 monster_id) { for(s32 i = 0; i < 16; i++) { s32 entity_monster_id = GetMonsterIdFromSpawnEntry( - &DUNGEON_PTR[0]->spawn_entries_master[i]); + &DUNGEON_PTR[0]->field_0x286b0.spawn_entries_master[i]); if(entity_monster_id == 0) { break; From 6f3ad6941c15e2bdfaf535885a3787f38d6db226 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Mon, 14 Sep 2026 03:48:53 -0700 Subject: [PATCH 27/34] Decompile 48 more callees; clear four asm files entirely Every function of four whole asm files now matches, so all four objects leave main.lsf and the .s/.inc files go: asm/overlay_29_023055B0.s 4 functions asm/overlay_29_02314810.s 9 functions asm/overlay_29_022E7EC4.s 25 functions asm/main_0202AB94.s 10 functions struct unk_0202AAA8 gains four members carved out of existing byte padding: a u32 at 0x0, the third menu kind's flag word plus its initial selected index at 0xFC/0x100, a u8 * at 0x160, and a signed s32 at 0x1A8. Offsets and sizeof are unchanged (0x1C8), proven by compiling one offsetof assertion per member with mwccarm and reading the folded constant back; the check carries a negative control that correctly fails, so "all as expected" is an outcome it could have missed. Nothing in the tree read any of the four offsets. struct struct_2 moves from include/overlay_31_02382820.h to include/window.h so a src/main_* file can reach it. CreateSimpleMenuInternal copies it whole (0x98 bytes), so its size is load-bearing. It is a pure move; the name is pre-existing and unchanged. window.h rather than main_0202AAA8.h because the latter drags main_0202AB40.h's prototypes into overlay_31_02382820.c, where they collide with that file's own declarations. Four data symbols declared `extern s32` from a call site whose parameter was void * are given their real types: _0209C85C and ov11_02322CC8 are WindowTemplate (each measures exactly 0x10 to the next symbol, and WindowTemplate is 16 bytes), _0209C86C and ov11_02322CF0 are struct unk_0202A5CC[] (8-byte records, matching the element counts the call sites pass). Each had exactly one user. The (s32) cast at overlay_11_02307334.c's call site goes with them -- field_0x1c is already a struct struct_2. Region arms, all message ids: overlay_29_0230558C.c gains a JPN_MSG_OFFSET block for five ids; move_orb_effects.c reuses its existing one and adds MESSAGE_ED0 / MESSAGE_ED1 for the two that shift by -0x2BE rather than the file's flat -0x2C0; overlay_29_02315118.c gains five named defines because it has no offset constant of its own. Every other region delta in these four files is a header-driven field displacement and needs nothing. Nine call-site-derived declarations across six files are replaced by an include of the owning header. Four declared void where the function returns bool8; two declared an s8 return where it is s32; three took an s8 parameter where it is s32. One was the fifth extern on a single physical line, which a line-oriented grep does not see. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds in all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_0202AB94.inc | 36 -- asm/include/overlay_29_022E7EC4.inc | 49 -- asm/include/overlay_29_023055B0.inc | 52 --- asm/include/overlay_29_02314810.inc | 31 -- asm/main_0202AB94.s | 687 ---------------------------- asm/overlay_29_022E7EC4.s | 657 -------------------------- asm/overlay_29_023055B0.s | 491 -------------------- asm/overlay_29_02314810.s | 524 --------------------- include/main_0202AAA8.h | 12 +- include/main_0202AB40.h | 6 + include/main_0202B4C4.h | 7 + include/move_orb_effects.h | 8 + include/overlay_29_022E869C.h | 50 ++ include/overlay_29_0230558C.h | 4 + include/overlay_29_02315118.h | 1 + include/overlay_31_02382820.h | 7 - include/spawn_2.h | 1 + include/window.h | 7 + main.lsf | 4 - src/main_0202AB40.c | 234 ++++++++++ src/main_0202B4C4.c | 198 +++++++- src/main_0203D538.c | 8 +- src/move_orb_effects.c | 175 ++++++- src/overlay_11_02307334.c | 11 +- src/overlay_29_022E869C.c | 324 +++++++++++++ src/overlay_29_0230558C.c | 268 +++++++++++ src/overlay_29_02315118.c | 80 ++++ src/overlay_29_0231CBC8.c | 2 +- src/overlay_29_023293E4.c | 2 +- src/overlay_29_0232DD78.c | 2 +- src/spawn_2.c | 21 + 31 files changed, 1395 insertions(+), 2564 deletions(-) delete mode 100644 asm/include/main_0202AB94.inc delete mode 100644 asm/include/overlay_29_022E7EC4.inc delete mode 100644 asm/include/overlay_29_023055B0.inc delete mode 100644 asm/include/overlay_29_02314810.inc delete mode 100644 asm/main_0202AB94.s delete mode 100644 asm/overlay_29_022E7EC4.s delete mode 100644 asm/overlay_29_023055B0.s delete mode 100644 asm/overlay_29_02314810.s diff --git a/asm/include/main_0202AB94.inc b/asm/include/main_0202AB94.inc deleted file mode 100644 index 8847c387..00000000 --- a/asm/include/main_0202AB94.inc +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once -.public CalcMenuHeightDiv8__02031AA4 -.public GetPageItemYOffset -.public GetSelectedMenuItemIdx -.public GetTotalNumMenuItems -.public GetWindowContents -.public GetWindowRectangle -.public InitWindowInput -.public IsEmptyString -.public IsMenuOptionActive -.public MemAlloc -.public NewWindowScreenCheck -.public PlayWindowInputSound -.public PreprocessStringFromId -.public SIMPLE_MENU_DEFAULT_WINDOW_PARAMS -.public sub_020263C8 -.public sub_020265A8 -.public sub_02027B1C -.public sub_0202810C -.public sub_0202812C -.public sub_0202830C -.public sub_02028948 -.public sub_0202A03C -.public sub_02031A5C -.public sub_02031C74 -.public sub_02031C84 -.public sub_02031C98 -.public sub_02032070 -.public sub_02032160 -.public sub_020323F8 -.public sub_0203250C -.public sub_02032684 -.public sub_02032984 -.public sub_02033758 -.public UpdateSimpleMenu -.public UpdateWindow diff --git a/asm/include/overlay_29_022E7EC4.inc b/asm/include/overlay_29_022E7EC4.inc deleted file mode 100644 index d3ca2476..00000000 --- a/asm/include/overlay_29_022E7EC4.inc +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once -.public DUNGEON_FRAMES_PASSED -.public DUNGEON_PTR -.public DungeonChangeTopScreenType -.public DungeonGetSpriteIndex -.public FreeDungeonControlsMenu -.public FreeTopScreen -.public GetIdleAnimationId -.public GetPlayerGender -.public GetTopScreenOption -.public InitDungeonControlsMenu -.public IsTeamStatsOnTopScreen -.public MemAlloc -.public MemFree -.public MemZero -.public ov10_022C1E50 -.public ov10_022C1E80 -.public ov10_022C21D8 -.public ov10_022C2278 -.public ov10_022C22A0 -.public ov29_022DC694 -.public ov29_022DC6D0 -.public ov29_022DC6DC -.public ov29_022DC6E8 -.public ov29_022DC728 -.public ov29_022DC738 -.public ov29_022DC76C -.public ov29_022DC778 -.public ov29_022DC77C -.public ov29_022E8708 -.public ov29_022E8CE8 -.public ov29_022E8F78 -.public ov29_022E8FCC -.public ov29_022E8FF8 -.public ov29_022E9008 -.public ov29_022E9014 -.public ov29_02339138 -.public ov29_02339D7C -.public ov29_0233A0E8 -.public ov29_0233A1BC -.public ov29_0234B4E0 -.public SetMinimapDataE447 -.public SetMinimapDataE448 -.public sub_02048384 -.public sub_020483B8 -.public sub_020483D8 -.public sub_02048400 -.public TOP_SCREEN_STATUS_PTR -.public UpdateMinimap diff --git a/asm/include/overlay_29_023055B0.inc b/asm/include/overlay_29_023055B0.inc deleted file mode 100644 index 634a9e3a..00000000 --- a/asm/include/overlay_29_023055B0.inc +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public CalcSpeedStageWrapper -.public ChangeMonsterAnimation -.public CheckVariousStatuses2__02301244 -.public DUNGEON_PTR -.public EndBlinkerClassStatus -.public EndBurnClassStatus -.public EndCringeClassStatus -.public EndCurseClassStatus -.public EndFrozenClassStatus -.public EndLeechSeedClassStatus -.public EndMiracleEyeStatus -.public EndMuzzledStatus -.public EndSleepClassStatus -.public EndSureShotClassStatus -.public EntityIsValid__0230558C -.public EntityIsValid__02305C04 -.public GetDirectionTowardsPosition -.public GetIdleAnimationId -.public GetLeader -.public GetTileAtEntity -.public GetTrapInfo -.public HasHeldItem -.public IqSkillIsEnabled -.public IsFloorOver -.public IsMonsterDrowsy -.public IsMonsterMuzzled -.public IsMonsterVisuallyImpaired -.public IsTeamMemberOnFirstTurnInFixedRoom -.public LogMessageByIdWithPopupCheckUser -.public LogMessageByIdWithPopupCheckUserTarget -.public MonsterHasAttackInterferingStatus -.public MonsterHasImmobilizingStatus -.public MonsterHasLeechSeedStatus -.public MonsterHasMiracleEyeStatus -.public MonsterHasNegativeStatus -.public MonsterHasNonvolatileNonsleepStatus -.public MonsterHasSkillInterferingStatus -.public MonsterHasWhifferStatus -.public ov29_022E2CA0 -.public ov29_022E3A58 -.public ov29_022E543C -.public ov29_022EA370 -.public ov29_02337D68 -.public ov29_02353318 -.public SubstitutePlaceholderStringTags -.public TryNonLeaderItemPickUp -.public TryTriggerMonsterHouse -.public TryTriggerTrap -.public UpdateStatusIconFlags -.public UpdateTrapsVisibility diff --git a/asm/include/overlay_29_02314810.inc b/asm/include/overlay_29_02314810.inc deleted file mode 100644 index 1048d25b..00000000 --- a/asm/include/overlay_29_02314810.inc +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public BoostSpeed -.public CalcSpeedStage -.public CalcSpeedStageWrapper -.public CalcStatusDuration -.public CONFUSED_TURN_RANGE -.public DungeonRandInt -.public DungeonRandOutcome__022EAB20 -.public EntityIsValid__023118B4 -.public EntityIsValid__02315118 -.public ExclusiveItemEffectIsActive__023147EC -.public GetExclusiveItemWithEffectFromBag -.public IsProtectedFromNegativeStatus -.public ItemIsActive__0231513C -.public LogMessageByIdWithPopupCheckUserTarget -.public LowerSpeed -.public ov10_022C4618 -.public ov29_022E41CC -.public ov29_022E543C -.public ov29_022E60E4 -.public ov29_02353318 -.public PlaySpeedDownEffect -.public PlaySpeedUpEffect -.public PrepareItemForPrinting__02345728 -.public SafeguardIsActive -.public SetPreprocessorArgsIdVal -.public SPEED_BOOST_TURN_RANGE -.public SPEED_LOWER_TURN_RANGE -.public SubstitutePlaceholderStringTags -.public UpdateStatusIconFlags diff --git a/asm/main_0202AB94.s b/asm/main_0202AB94.s deleted file mode 100644 index 9d1c2a5d..00000000 --- a/asm/main_0202AB94.s +++ /dev/null @@ -1,687 +0,0 @@ - .include "asm/macros.inc" - .include "main_0202AB94.inc" - - .text - - arm_func_start sub_0202AB94 -sub_0202AB94: ; 0x0202AB94 - stmdb sp!, {r4, lr} - mov r4, r1 - bl GetWindowContents - mov r1, r4 - add r0, r0, #4 - bl sub_02032684 - ldmia sp!, {r4, pc} - arm_func_end sub_0202AB94 - - arm_func_start GetSimpleMenuResult__0202AEA4 -GetSimpleMenuResult__0202AEA4: ; 0x0202ABB0 - stmdb sp!, {r4, lr} - bl GetWindowContents - ldrb r1, [r0, #0x1a0] - ldr r4, [r0, #0x198] - cmp r1, #0 - beq _0202ABF4 - ldrb r1, [r0, #0x1a1] - add r0, r0, #4 - cmp r1, #0 - beq _0202ABE0 - bl GetTotalNumMenuItems - b _0202ABE4 -_0202ABE0: - bl GetSelectedMenuItemIdx -_0202ABE4: - add r0, r0, r0, lsl #6 - add r0, r4, r0, lsl #2 - ldr r0, [r0, #0x100] - ldmia sp!, {r4, pc} -_0202ABF4: - mov r0, #0 - ldmia sp!, {r4, pc} - arm_func_end GetSimpleMenuResult__0202AEA4 - - arm_func_start UpdateParentMenu -UpdateParentMenu: ; 0x0202ABFC - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x30 - mov r6, r0 - ldr r4, [r6, #0xc] - ldr r0, [r4, #0x19c] - cmp r0, #7 - addls pc, pc, r0, lsl #2 - b _0202AF6C -_0202AC1C: ; jump table - b _0202AC3C ; case 0 - b _0202AC5C ; case 1 - b _0202AC78 ; case 2 - b _0202ACDC ; case 3 - b _0202AD3C ; case 4 - b _0202AEE8 ; case 5 - b _0202AEF8 ; case 6 - b _0202AF40 ; case 7 -_0202AC3C: - ldrsb r0, [r6, #0x10] - bl sub_0202810C - cmp r0, #0 - beq _0202AF6C - ldr r1, [r4, #0x1a8] - mov r0, #2 - str r1, [r4, #0x1ac] - str r0, [r4, #0x19c] -_0202AC5C: - ldr r0, [r4, #0x19c] - cmp r0, #1 - ldreq r1, [r4, #0x1a8] - moveq r0, #2 - streq r1, [r4, #0x1ac] - streq r0, [r4, #0x19c] - beq _0202AF6C -_0202AC78: - ldr r0, [r4, #0x1a8] - cmp r0, #0 - ble _0202ACD4 - ldr r0, [r4, #0x1ac] - mov r1, #0x4000000 - cmp r0, #0 - subgt r0, r0, #1 - strgt r0, [r4, #0x1ac] - ldr r0, [r4, #0x1ac] - cmp r0, #0 - add r0, r4, #4 - ble _0202ACD0 - bl sub_02031C74 - mov r1, #0 - strb r1, [r4, #0x1a0] - strb r1, [r4, #0x1a1] - str r1, [r4, #0x1a4] - sub r1, r1, #1 - mov r0, r6 - str r1, [r6, #0xb8] - bl sub_0202AF78 - b _0202AF6C -_0202ACD0: - bl sub_02031C84 -_0202ACD4: - mov r0, #3 - str r0, [r4, #0x19c] -_0202ACDC: - mov r0, r6 - bl sub_0202AF78 - ldr r0, [r4, #0xfc] - tst r0, #0x800000 - beq _0202AD18 - mov r0, #9 - str r0, [r4, #0x19c] - mov r1, #1 - mov r0, #0 - strb r1, [r4, #0x1a0] - strb r0, [r4, #0x1a1] - str r0, [r4, #0x1a4] - sub r0, r0, #4 - str r0, [r6, #0xb8] - b _0202AF6C -_0202AD18: - mov r1, #4 - mov r0, #0 - str r1, [r4, #0x19c] - strb r0, [r4, #0x1a0] - strb r0, [r4, #0x1a1] - str r0, [r4, #0x1a4] - sub r0, r0, #1 - str r0, [r6, #0xb8] - b _0202AF6C -_0202AD3C: - add r1, sp, #8 - add r2, sp, #0xc - add r0, r4, #4 - mov r3, #1 - bl sub_02031C98 - ldr r1, [sp, #8] - mov r5, r0 - cmp r1, #0 - bne _0202ADAC - ldr r0, [r4, #0xfc] - tst r0, #1 - beq _0202ADAC - mov r3, #0 - ldr r2, _0202AF74 ; =0x00000408 - add r1, sp, #0xc - str r3, [sp] - mov ip, #1 - add r0, r4, #4 - str ip, [sp, #4] - bl sub_02032160 - movs r1, r0 - bmi _0202ADAC - add r0, r4, #4 - bl sub_02032684 - ldr r0, [sp, #8] - mov r5, #1 - orr r0, r0, #1 - str r0, [sp, #8] -_0202ADAC: - ldr r0, [sp, #8] - cmp r0, #0 - bne _0202ADCC - add r1, sp, #8 - add r2, sp, #0xc - add r0, r4, #4 - bl sub_02033758 - orr r5, r5, r0 -_0202ADCC: - add r0, r4, #4 - bl GetSelectedMenuItemIdx - mov r2, r0 - ldr r1, [sp, #8] - add r0, r4, #4 - mov r3, #0 - bl sub_020323F8 - orrs r0, r5, r0 - beq _0202ADF8 - mov r0, r6 - bl sub_0202AF78 -_0202ADF8: - ldr r1, [sp, #8] - tst r1, #1 - beq _0202AE68 - add r0, r4, #4 - bl IsMenuOptionActive - cmp r0, #0 - beq _0202AE58 - ldr r0, [r4, #0xfc] - tst r0, #0x80000000 - bne _0202AE2C - add r0, r4, #4 - mov r1, #0 - bl PlayWindowInputSound -_0202AE2C: - mov r1, #1 - mov r0, #0 - strb r1, [r4, #0x1a0] - strb r0, [r4, #0x1a1] - ldr r1, [sp, #8] - sub r0, r0, #4 - str r1, [r4, #0x1a4] - str r0, [r6, #0xb8] - mov r0, #5 - str r0, [r4, #0x19c] - b _0202AED8 -_0202AE58: - add r0, r4, #4 - mov r1, #2 - bl PlayWindowInputSound - b _0202AED8 -_0202AE68: - tst r1, #2 - add r0, r4, #4 - beq _0202AEA4 - mov r1, #1 - bl PlayWindowInputSound - mov r0, #1 - strb r0, [r4, #0x1a0] - strb r0, [r4, #0x1a1] - ldr r1, [sp, #8] - sub r0, r0, #6 - str r1, [r4, #0x1a4] - str r0, [r6, #0xb8] - mov r0, #5 - str r0, [r4, #0x19c] - b _0202AED8 -_0202AEA4: - bl sub_0203250C - cmp r0, #0 - beq _0202AED8 - mov r1, #1 - mov r0, #0 - strb r1, [r4, #0x1a0] - strb r0, [r4, #0x1a1] - ldr r1, [sp, #8] - sub r0, r0, #4 - str r1, [r4, #0x1a4] - str r0, [r6, #0xb8] - mov r0, #5 - str r0, [r4, #0x19c] -_0202AED8: - ldrsb r0, [r6, #0x10] - add r1, r4, #4 - bl sub_02028948 - b _0202AF6C -_0202AEE8: - add r0, r4, #4 - bl sub_02032070 - cmp r0, #0 - bne _0202AF6C -_0202AEF8: - ldrb r0, [r4, #0x1a1] - cmp r0, #0 - bne _0202AF24 - ldr r0, [r4, #0xfc] - tst r0, #0x400000 - beq _0202AF38 - mov r0, r6 - bl sub_0202AF78 - mov r0, #9 - str r0, [r4, #0x19c] - b _0202AF6C -_0202AF24: - ldrb r0, [r4, #0x1b0] - cmp r0, #0 - movne r0, #9 - strne r0, [r4, #0x19c] - bne _0202AF6C -_0202AF38: - mov r0, #7 - str r0, [r4, #0x19c] -_0202AF40: - ldrsb r0, [r6, #0x10] - bl sub_0202812C - cmp r0, #0 - beq _0202AF6C - ldrb r0, [r4, #0x1a1] - cmp r0, #0 - mvnne r0, #4 - mvneq r0, #3 - str r0, [r6, #0xb8] - mov r0, #8 - str r0, [r4, #0x19c] -_0202AF6C: - add sp, sp, #0x30 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0202AF74: .word 0x00000408 - arm_func_end UpdateParentMenu - - arm_func_start sub_0202AF78 -sub_0202AF78: ; 0x0202AF78 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov sl, r0 - ldr r5, [sl, #0xc] - mov r7, #0 - ldr r0, [r5, #0xfc] - ldr r6, [r5, #0x198] - tst r0, #0x200 - ldrne r8, [r5, #0x160] - ldrsb r0, [sl, #0x10] - moveq r8, #0 - bl sub_02027B1C - mov fp, #1 - mov r4, r7 - b _0202B008 -_0202AFB0: - mov r1, r4 - cmp r8, #0 - beq _0202AFCC - ldrb r0, [r8] - add r8, r8, #1 - tst r0, #2 - movne r1, fp -_0202AFCC: - cmp r1, #0 - movne sb, #0x42 - moveq sb, #0x44 - mov r1, r7 - add r0, r5, #4 - bl GetPageItemYOffset - and r1, sb, #0xff - str r1, [sp] - mov r2, r0 - ldrsb r0, [sl, #0x10] - mov r1, #0xd - mov r3, r6 - bl sub_020263C8 - add r7, r7, #1 - add r6, r6, #0x104 -_0202B008: - mov r0, r6 - bl IsEmptyString - cmp r0, #0 - beq _0202AFB0 - ldrsb r1, [sl, #0x10] - add r0, r5, #4 - bl sub_0202A03C - ldrsb r0, [sl, #0x10] - bl UpdateWindow - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - arm_func_end sub_0202AF78 - - arm_func_start sub_0202B030 -sub_0202B030: ; 0x0202B030 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - bl GetWindowContents - mov r4, r0 - add r0, r4, #4 - bl IsMenuOptionActive - cmp r0, #0 - beq _0202B094 - ldr r0, [r4, #0xfc] - tst r0, #0x80000000 - bne _0202B068 - add r0, r4, #4 - mov r1, #0 - bl PlayWindowInputSound -_0202B068: - mov r2, #1 - mov r1, #0 - strb r2, [r4, #0x1a0] - strb r1, [r4, #0x1a1] - mov r0, r5 - sub r1, r1, #4 - str r2, [r4, #0x1a4] - bl sub_0202830C - mov r0, #6 - str r0, [r4, #0x19c] - ldmia sp!, {r3, r4, r5, pc} -_0202B094: - add r0, r4, #4 - mov r1, #2 - bl PlayWindowInputSound - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_0202B030 - - arm_func_start sub_0202B0A4 -sub_0202B0A4: ; 0x0202B0A4 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - bl GetWindowContents - mov r4, r0 - cmp r5, #0 - add r0, r4, #4 - mov r1, #0xb000000 - beq _0202B0D8 - bl sub_02031C74 - add r0, r4, #4 - mov r1, #0x10 - bl sub_02031C84 - ldmia sp!, {r3, r4, r5, pc} -_0202B0D8: - bl sub_02031C84 - add r0, r4, #4 - mov r1, #0x10 - bl sub_02031C74 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_0202B0A4 - - arm_func_start CreateSimpleMenuFromStringIds -CreateSimpleMenuFromStringIds: ; 0x0202B0EC - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov r7, r3 - mov sb, r1 - mov r8, r2 - mov sl, r0 - mov r1, r7 - mov r2, #0 - b _0202B114 -_0202B10C: - add r1, r1, #8 - add r2, r2, #1 -_0202B114: - ldrh r0, [r1] - cmp r0, #0 - bne _0202B10C - add r0, r2, #1 - add r0, r0, r0, lsl #6 - mov r0, r0, lsl #2 - mov r1, #8 - bl MemAlloc - mov r5, r0 - mov r6, r5 - mov r4, #0 - mov fp, #0x100 - b _0202B16C -_0202B148: - ldr r3, _0202B1A8 ; =0x0000C402 - mov r0, r6 - mov r1, fp - str r4, [sp] - bl PreprocessStringFromId - ldr r0, [r7, #4] - add r7, r7, #8 - str r0, [r6, #0x100] - add r6, r6, #0x104 -_0202B16C: - ldrh r2, [r7] - cmp r2, #0 - bne _0202B148 - mov r0, #0 - strb r0, [r6] - ldr r0, [r7, #4] - ldr r4, [sp, #0x28] - str r0, [r6, #0x100] - mov r0, sl - mov r1, sb - mov r2, r8 - mov r3, r5 - str r4, [sp] - bl CreateSimpleMenuInternal - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0202B1A8: .word 0x0000C402 - arm_func_end CreateSimpleMenuFromStringIds - - arm_func_start CreateSimpleMenu -CreateSimpleMenu: ; 0x0202B1AC - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #4 - mov r6, r3 - mov sb, r0 - mov r8, r1 - mov r7, r2 - mov r4, r6 - mov r5, #0 - b _0202B1D8 -_0202B1D0: - add r4, r4, #0x104 - add r5, r5, #1 -_0202B1D8: - mov r0, r4 - bl IsEmptyString - cmp r0, #0 - beq _0202B1D0 - add r0, r5, #1 - add r0, r0, r0, lsl #6 - mov r0, r0, lsl #2 - mov r1, #8 - bl MemAlloc - mov r4, r0 - mov r5, r4 - b _0202B234 -_0202B208: - mov sl, r6 - mov ip, r5 - add r6, r6, #0x104 - add r5, r5, #0x104 - mov lr, #0x10 -_0202B21C: - ldmia sl!, {r0, r1, r2, r3} - stmia ip!, {r0, r1, r2, r3} - subs lr, lr, #1 - bne _0202B21C - ldr r0, [sl] - str r0, [ip] -_0202B234: - mov r0, r6 - bl IsEmptyString - cmp r0, #0 - beq _0202B208 - mov ip, #0x10 -_0202B248: - ldmia r6!, {r0, r1, r2, r3} - stmia r5!, {r0, r1, r2, r3} - subs ip, ip, #1 - bne _0202B248 - ldr r0, [r6] - ldr r6, [sp, #0x28] - str r0, [r5] - mov r0, sb - mov r1, r8 - mov r2, r7 - mov r3, r4 - str r6, [sp] - bl CreateSimpleMenuInternal - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end CreateSimpleMenu - - arm_func_start CreateSimpleMenuInternal -CreateSimpleMenuInternal: ; 0x0202B284 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x2c - mov r6, r0 - mov sl, r1 - mov r0, #0x1b4 - mov r1, #8 - mov sb, r2 - mov r8, r3 - bl MemAlloc - tst sl, #0x20 - ldrne r7, [sb] - mov fp, #0 - moveq r7, #0 - cmp r6, #0 - str fp, [sp, #8] - mov r4, r0 - addne ip, sp, #0x1c - ldmneia r6, {r0, r1, r2, r3} - stmneia ip, {r0, r1, r2, r3} - ldrne r0, _0202B488 ; =UpdateSimpleMenu - mov r5, r8 - orr sl, sl, #0x8000 - strne r0, [sp, #0x1c] - bne _0202B2F8 - ldr r0, _0202B48C ; =SIMPLE_MENU_DEFAULT_WINDOW_PARAMS - add r6, sp, #0x1c - ldmia r0, {r0, r1, r2, r3} - stmia r6, {r0, r1, r2, r3} - orr sl, sl, #0x300000 -_0202B2F8: - ldrb r0, [sp, #0x22] - str r4, [sp, #0x28] - cmp r0, #0 - bne _0202B348 - mov r6, #0 - b _0202B324 -_0202B310: - mov r0, r5 - bl sub_020265A8 - cmp r0, r6 - movgt r6, r0 - add r5, r5, #0x104 -_0202B324: - mov r0, r5 - bl IsEmptyString - cmp r0, #0 - beq _0202B310 - mov r0, sl - mov r1, sb - add r2, r6, #0x10 - bl sub_02031A5C - strb r0, [sp, #0x22] -_0202B348: - mov r5, r8 - b _0202B36C -_0202B350: - ldr r0, [r5, #0x100] - add r5, r5, #0x104 - cmp r0, r7 - ldr r0, [sp, #8] - ldreq fp, [sp, #8] - add r0, r0, #1 - str r0, [sp, #8] -_0202B36C: - mov r0, r5 - bl IsEmptyString - cmp r0, #0 - beq _0202B350 - ldr r0, [sp, #0x50] - add r2, sp, #8 - cmp r0, #0 - ldrle r0, [sp, #8] - add r3, sp, #0x50 - strle r0, [sp, #0x50] - ldrb r0, [sp, #0x23] - cmp r0, #0 - mov r0, sl - bne _0202B3B4 - mov r1, sb - bl CalcMenuHeightDiv8__02031AA4 - strb r0, [sp, #0x23] - b _0202B3BC -_0202B3B4: - mov r1, sb - bl CalcMenuHeightDiv8__02031AA4 -_0202B3BC: - tst sl, #0x200000 - ldrneb r1, [sp, #0x20] - ldrneb r0, [sp, #0x22] - subne r0, r1, r0 - strneb r0, [sp, #0x20] - tst sl, #0x100000 - ldrneb r1, [sp, #0x21] - ldrneb r0, [sp, #0x23] - subne r0, r1, r0 - strneb r0, [sp, #0x21] - ldr r0, _0202B488 ; =UpdateSimpleMenu - cmp sb, #0 - str r0, [r4] - str sl, [r4, #0xfc] - beq _0202B418 - add r6, r4, #0x100 - mov r5, #9 -_0202B400: - ldmia sb!, {r0, r1, r2, r3} - stmia r6!, {r0, r1, r2, r3} - subs r5, r5, #1 - bne _0202B400 - ldmia sb, {r0, r1} - stmia r6, {r0, r1} -_0202B418: - str fp, [r4, #0x100] - str r8, [r4, #0x198] - mov r2, #0 - str r2, [r4, #0x19c] - strb r2, [r4, #0x1a0] - strb r2, [r4, #0x1a1] - str r2, [r4, #0x1a4] - str r2, [r4, #0x1ac] - str r2, [r4, #0x1b0] - add r0, sp, #0x1c - mov r1, #3 - strb r2, [sp, #0x24] - bl NewWindowScreenCheck - add r1, sp, #0xc - mov r6, r0 - bl GetWindowRectangle - ldr r0, [sp, #8] - add r3, sp, #0xc - str r0, [sp] - ldr r5, [sp, #0x50] - mov r1, sl - add r0, r4, #4 - add r2, r4, #0x100 - str r5, [sp, #4] - bl InitWindowInput - mov r0, r6 - add sp, sp, #0x2c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0202B488: .word UpdateSimpleMenu -_0202B48C: .word SIMPLE_MENU_DEFAULT_WINDOW_PARAMS - arm_func_end CreateSimpleMenuInternal - - arm_func_start ResumeSimpleMenu -ResumeSimpleMenu: ; 0x0202B490 - stmdb sp!, {r3, lr} - bl GetWindowContents - mov r1, #1 - str r1, [r0, #0x19c] - mov r1, #0 - strb r1, [r0, #0x1a0] - strb r1, [r0, #0x1a1] - ldr r1, [r0, #0xfc] - bic r1, r1, #0x800000 - str r1, [r0, #0xfc] - add r0, r0, #4 - bl sub_02032984 - ldmia sp!, {r3, pc} - arm_func_end ResumeSimpleMenu diff --git a/asm/overlay_29_022E7EC4.s b/asm/overlay_29_022E7EC4.s deleted file mode 100644 index 0d24373a..00000000 --- a/asm/overlay_29_022E7EC4.s +++ /dev/null @@ -1,657 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022E7EC4.inc" - - .text - - arm_func_start AllocTopScreenStatus -AllocTopScreenStatus: ; 0x022E7EC4 - stmdb sp!, {r3, lr} - mov r0, #0x230 - mov r1, #0 - bl MemAlloc - ldr r2, _022E7F40 ; =TOP_SCREEN_STATUS_PTR - mov r1, #0x230 - str r0, [r2] - bl MemZero - ldr r0, _022E7F40 ; =TOP_SCREEN_STATUS_PTR - mov r2, #0 - ldr r1, [r0] - strb r2, [r1] - ldr r1, [r0] - strb r2, [r1, #0x29] - ldr r1, [r0] - strb r2, [r1, #0x2c] - ldr r1, [r0] - strb r2, [r1, #0x2b] - ldr r1, [r0] - str r2, [r1, #4] - ldr r0, [r0] - strb r2, [r0, #0x228] - bl ov29_022E8708 - ldr r0, _022E7F40 ; =TOP_SCREEN_STATUS_PTR - mov r3, #2 - ldr r2, [r0] - mov r1, #0 - str r3, [r2, #4] - ldr r0, [r0] - strb r1, [r0, #0x229] - ldmia sp!, {r3, pc} - .align 2, 0 -_022E7F40: .word TOP_SCREEN_STATUS_PTR - arm_func_end AllocTopScreenStatus - - arm_func_start FreeTopScreenStatus -FreeTopScreenStatus: ; 0x022E7F44 - stmdb sp!, {r3, lr} - ldr r0, _022E7F78 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl FreeTopScreen - ldr r0, _022E7F78 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - bl MemFree - ldr r0, _022E7F78 ; =TOP_SCREEN_STATUS_PTR - mov r1, #0 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_022E7F78: .word TOP_SCREEN_STATUS_PTR - arm_func_end FreeTopScreenStatus - - arm_func_start ov29_022E7F7C -ov29_022E7F7C: ; 0x022E7F7C - ldr r0, _022E7F90 ; =TOP_SCREEN_STATUS_PTR - mov r1, #0 - ldr r0, [r0] - strb r1, [r0] - bx lr - .align 2, 0 -_022E7F90: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E7F7C - - arm_func_start ov29_022E7F94 -ov29_022E7F94: ; 0x022E7F94 - stmdb sp!, {r3, lr} - ldr r0, _022E8014 ; =TOP_SCREEN_STATUS_PTR - mov r3, #0 - ldr r2, [r0] - mov r1, #1 - strb r3, [r2, #0x228] - ldr r0, [r0] - strb r1, [r0] - bl ov29_02339138 - mov r0, #1 - mov r1, r0 - bl ov29_02339D7C - bl UpdateMinimap - mov r0, #0 - bl SetMinimapDataE447 - ldr r1, _022E8014 ; =TOP_SCREEN_STATUS_PTR - mov r0, #1 - ldr r1, [r1] - strb r0, [r1] - bl SetMinimapDataE448 - bl ov29_022E8104 - bl GetPlayerGender - cmp r0, #2 - ldr r0, _022E8014 ; =TOP_SCREEN_STATUS_PTR - moveq r1, #1 - ldr r0, [r0] - movne r1, #0 - and r1, r1, #0xff - add r0, r0, #0xb8 - bl ov29_022DC738 - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E8014: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E7F94 - - arm_func_start ov29_022E8018 -ov29_022E8018: ; 0x022E8018 - stmdb sp!, {r3, lr} - ldr r0, _022E8050 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x228] - cmp r0, #0 - beq _022E8048 - bl ov29_022DC76C - bl ov29_022DC778 - ldr r0, _022E8050 ; =TOP_SCREEN_STATUS_PTR - mov r1, #0 - ldr r0, [r0] - strb r1, [r0, #0x228] -_022E8048: - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E8050: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8018 - - arm_func_start ov29_022E8054 -ov29_022E8054: ; 0x022E8054 - stmdb sp!, {r3, lr} - ldrb r1, [r0, #0x10] - cmp r1, #0 - ldmeqia sp!, {r3, pc} - mov r1, #0 - strb r1, [r0, #0x10] - bl GetTopScreenOption - cmp r0, #3 - ldrne r0, _022E80CC ; =TOP_SCREEN_STATUS_PTR - movne r1, #0 - ldrne r0, [r0] - strneb r1, [r0] - ldmneia sp!, {r3, pc} - ldr r0, _022E80CC ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, #0 - ldmneia sp!, {r3, pc} - bl ov29_02339138 - mov r0, #0 - mov r1, #1 - bl ov29_0233A0E8 - mov r0, #1 - mov r1, #0 - bl ov29_02339D7C - ldr r0, _022E80CC ; =TOP_SCREEN_STATUS_PTR - mov r1, #1 - ldr r0, [r0] - strb r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_022E80CC: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8054 - - arm_func_start ov29_022E80D0 -ov29_022E80D0: ; 0x022E80D0 - stmdb sp!, {r3, lr} - bl ov29_022DC77C - ldr r1, _022E8100 ; =TOP_SCREEN_STATUS_PTR - mov r0, #0 - ldr r1, [r1] - strb r0, [r1] - bl SetMinimapDataE448 - mov r0, #1 - bl ov29_0233A1BC - bl ov29_02339138 - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E8100: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E80D0 - - arm_func_start ov29_022E8104 -ov29_022E8104: ; 0x022E8104 - stmdb sp!, {r3, lr} - ldr r0, _022E812C ; =TOP_SCREEN_STATUS_PTR - mov r2, #0 - ldr r1, [r0] - strb r2, [r1, #0x228] - ldr r0, [r0] - add r0, r0, #0xb8 - bl ov10_022C1E50 - bl ov29_022E8CE8 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E812C: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8104 - - arm_func_start InitializeTeamStats -InitializeTeamStats: ; 0x022E8130 - stmdb sp!, {r3, lr} - ldr r0, _022E818C ; =TOP_SCREEN_STATUS_PTR - mov r2, #0 - ldr r1, [r0] - strb r2, [r1, #0x228] - ldr r0, [r0] - strb r2, [r0, #0x229] - bl ov29_022E8104 - ldr r0, _022E818C ; =TOP_SCREEN_STATUS_PTR - mov r1, #1 - ldr r0, [r0] - strb r1, [r0, #0x24] - bl GetPlayerGender - cmp r0, #2 - ldr r0, _022E818C ; =TOP_SCREEN_STATUS_PTR - moveq r1, #1 - ldr r0, [r0] - movne r1, #0 - and r1, r1, #0xff - add r0, r0, #0xb8 - bl ov29_022DC694 - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E818C: .word TOP_SCREEN_STATUS_PTR - arm_func_end InitializeTeamStats - - arm_func_start UpdateTeamStatsWrapper -UpdateTeamStatsWrapper: ; 0x022E8190 - stmdb sp!, {r3, lr} - ldr r0, _022E81C4 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x228] - cmp r0, #0 - beq _022E81BC - bl ov29_022DC6D0 - ldr r0, _022E81C4 ; =TOP_SCREEN_STATUS_PTR - mov r1, #0 - ldr r0, [r0] - strb r1, [r0, #0x228] -_022E81BC: - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E81C4: .word TOP_SCREEN_STATUS_PTR - arm_func_end UpdateTeamStatsWrapper - - arm_func_start ov29_022E81C8 -ov29_022E81C8: ; 0x022E81C8 - stmdb sp!, {r4, lr} - mov r4, r0 - bl ov29_022DC6DC - ldrb r0, [r4, #0x10] - cmp r0, #0 - movne r0, #0 - strneb r0, [r4, #0x10] - ldmia sp!, {r4, pc} - arm_func_end ov29_022E81C8 - - arm_func_start FreeTeamStatsWrapper -FreeTeamStatsWrapper: ; 0x022E81E8 - stmdb sp!, {r3, lr} - bl ov29_022DC728 - mov r0, #1 - ldmia sp!, {r3, pc} - arm_func_end FreeTeamStatsWrapper - - arm_func_start ov29_022E81F8 -ov29_022E81F8: ; 0x022E81F8 - stmdb sp!, {r3, lr} - bl IsTeamStatsOnTopScreen - cmp r0, #0 - bne _022E8210 - bl ov29_022E8104 - ldmia sp!, {r3, pc} -_022E8210: - bl GetTopScreenOption - cmp r0, #1 - bne _022E8238 - ldr r0, _022E8240 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldrsh r0, [r0, #8] - cmp r0, #1 - beq _022E8238 - mov r0, #1 - bl DungeonChangeTopScreenType -_022E8238: - bl ov29_022E8CE8 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E8240: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E81F8 - - arm_func_start ov29_022E8244 -ov29_022E8244: ; 0x022E8244 - stmdb sp!, {r3, lr} - bl GetTopScreenOption - cmp r0, #4 - ldreq r0, _022E826C ; =TOP_SCREEN_STATUS_PTR - ldreq r0, [r0] - ldreqsh r0, [r0, #8] - cmpeq r0, #4 - ldmneia sp!, {r3, pc} - bl ov29_022E9008 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E826C: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8244 - - arm_func_start DisplayTeamStatsSprite -DisplayTeamStatsSprite: ; 0x022E8270 -#ifdef JAPAN -#define OV29_022E8270_OFFSET -0xA4 -#else -#define OV29_022E8270_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x1c - ldr r3, _022E83FC ; =TOP_SCREEN_STATUS_PTR - mov sl, r0 - ldr r3, [r3] - mov sb, r1 - mov fp, r2 - cmp r3, #0 - beq _022E83F4 - ldr r8, [sl, #0xb4] - bl GetIdleAnimationId - ldr r1, _022E8400 ; =DUNGEON_PTR - mov r4, r0 - ldr r1, [r1] - mov r5, #0 - add r1, r1, #0x1a000 - ldr r0, [r1, #0x22c + OV29_022E8270_OFFSET] - mov r6, r5 - cmp r0, sl - ldrsh r0, [sl, #0xa8] - mov r7, r5 - str r0, [sp, #0x18] - moveq r0, r5 - ldrneb r0, [r1, #0x245 + OV29_022E8270_OFFSET] - cmp r0, #0 - bne _022E82E4 - ldrb r0, [r8, #0xd8] - cmp r0, #2 - bne _022E82F0 -_022E82E4: - ldr r0, _022E8404 ; =0x00000229 - bl DungeonGetSpriteIndex - str r0, [sp, #0x18] -_022E82F0: - ldrb r0, [r8, #0xc4] - cmp r0, #1 - cmpne r0, #6 - beq _022E8364 - ldr r0, _022E8400 ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x78b] - cmp r0, #0 - beq _022E832C - bl ov29_0234B4E0 - cmp r0, #0 - addeq r0, r5, #2 - moveq r0, r0, lsl #0x10 - moveq r5, r0, asr #0x10 - beq _022E8354 -_022E832C: - ldrb r0, [sl, #0xaf] - cmp r0, #0 - cmpne r0, #7 - bne _022E8354 - ldr r0, [sl, #0xb4] -#ifdef JAPAN - ldr r0, [r0, #0x10c] -#else - ldr r0, [r0, #0x110] -#endif - cmp r0, #1 - addgt r0, r5, #1 - movgt r0, r0, lsl #0x10 - movgt r5, r0, asr #0x10 -_022E8354: - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 - b _022E8368 -_022E8364: - mov r5, #0 -_022E8368: -#ifdef JAPAN - ldrb r0, [r8, #0x10a] -#else - ldrb r0, [r8, #0x10b] -#endif - cmp r0, #2 - beq _022E83A4 - ldrb r1, [r8, #0xc4] - cmp r1, #6 - ldrneb r0, [r8, #0xbf] - cmpne r0, #4 - cmpne r1, #2 - bne _022E83A4 - ldr r0, _022E8408 ; =DUNGEON_FRAMES_PASSED - ldr r0, [r0] - and r0, r0, #2 - add r0, r6, r0 - mov r0, r0, lsl #0x10 - mov r6, r0, asr #0x10 -_022E83A4: - ldrb r0, [r8, #0xef] - cmp r0, #1 - ldreq r0, _022E8400 ; =DUNGEON_PTR - ldreq r0, [r0] - addeq r0, r0, #0x1a000 - ldreqb r0, [r0, #0x244 + OV29_022E8270_OFFSET] - cmpeq r0, #0 - moveq r7, #1 - cmp r4, #0xff - beq _022E83F4 - mov r0, #1 - stmia sp, {r0, sb, fp} - str r5, [sp, #0xc] - str r6, [sp, #0x10] - str r7, [sp, #0x14] - ldrsh r1, [r8, #4] - ldr r3, [r8, #0xb0] - ldr r0, [sp, #0x18] - mov r2, r4 - bl ov29_022DC6E8 -_022E83F4: - add sp, sp, #0x1c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022E83FC: .word TOP_SCREEN_STATUS_PTR -_022E8400: .word DUNGEON_PTR -_022E8404: .word 0x00000229 -_022E8408: .word DUNGEON_FRAMES_PASSED - arm_func_end DisplayTeamStatsSprite - - arm_func_start ov29_022E840C -ov29_022E840C: ; 0x022E840C - stmdb sp!, {lr} - sub sp, sp, #0x14 - ldr r0, _022E8478 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x29] - cmp r0, #0 - movne r0, #0 - bne _022E8470 - add r0, sp, #0 - bl ov10_022C22A0 - ldr r0, _022E8478 ; =TOP_SCREEN_STATUS_PTR - add r1, sp, #0 - ldr r0, [r0] - mov r2, #0 - add r0, r0, #0x80 - mov r3, #1 - bl ov10_022C1E80 - bl sub_02048400 - cmp r0, #0 - beq _022E8460 - bl sub_02048384 -_022E8460: - ldr r1, _022E8478 ; =TOP_SCREEN_STATUS_PTR - mov r0, #1 - ldr r1, [r1] - strb r0, [r1, #0x29] -_022E8470: - add sp, sp, #0x14 - ldmia sp!, {pc} - .align 2, 0 -_022E8478: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E840C - - arm_func_start ov29_022E847C -ov29_022E847C: ; 0x022E847C - stmdb sp!, {r3, lr} - ldrb r1, [r0, #0x10] - cmp r1, #0 - ldmeqia sp!, {r3, pc} - mov r1, #0 - strb r1, [r0, #0x10] - bl sub_020483B8 - ldr r0, _022E84AC ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C21D8 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E84AC: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E847C - - arm_func_start ov29_022E84B0 -ov29_022E84B0: ; 0x022E84B0 - stmdb sp!, {r3, lr} - ldr r0, _022E84FC ; =TOP_SCREEN_STATUS_PTR - ldr r1, [r0] - ldrb r0, [r1, #0x29] - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, pc} - add r0, r1, #0x80 - bl ov10_022C2278 - bl sub_02048400 - cmp r0, #0 - beq _022E84E4 - bl sub_020483D8 -_022E84E4: - ldr r0, _022E84FC ; =TOP_SCREEN_STATUS_PTR - mov r2, #0 - ldr r1, [r0] - mov r0, #1 - strb r2, [r1, #0x29] - ldmia sp!, {r3, pc} - .align 2, 0 -_022E84FC: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E84B0 - - arm_func_start InitDungeonControlsMenuWithBg -InitDungeonControlsMenuWithBg: ; 0x022E8500 - stmdb sp!, {lr} - sub sp, sp, #0x14 - add r0, sp, #0 - bl ov10_022C22A0 - ldr r0, _022E8548 ; =TOP_SCREEN_STATUS_PTR - add r1, sp, #0 - ldr r0, [r0] - mov r2, #0 - add r0, r0, #0x80 - mov r3, #1 - bl ov10_022C1E80 - ldr r0, _022E8548 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C21D8 - bl InitDungeonControlsMenu - add sp, sp, #0x14 - ldmia sp!, {pc} - .align 2, 0 -_022E8548: .word TOP_SCREEN_STATUS_PTR - arm_func_end InitDungeonControlsMenuWithBg - - arm_func_start ov29_022E854C -ov29_022E854C: ; 0x022E854C - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r0, [r4, #0x10] - cmp r0, #0 - ldmeqia sp!, {r4, pc} - add r0, r4, #0x10 - bl ov29_022E8F78 - ldr r0, _022E8584 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C21D8 - mov r0, #0 - strb r0, [r4, #0x10] - ldmia sp!, {r4, pc} - .align 2, 0 -_022E8584: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E854C - - arm_func_start FreeDungeonControlsMenuWithBg -FreeDungeonControlsMenuWithBg: ; 0x022E8588 - stmdb sp!, {r3, lr} - ldr r0, _022E85A4 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C2278 - bl FreeDungeonControlsMenu - ldmia sp!, {r3, pc} - .align 2, 0 -_022E85A4: .word TOP_SCREEN_STATUS_PTR - arm_func_end FreeDungeonControlsMenuWithBg - - arm_func_start ov29_022E85A8 -ov29_022E85A8: ; 0x022E85A8 - stmdb sp!, {lr} - sub sp, sp, #0x14 - add r0, sp, #0 - bl ov10_022C22A0 - ldr r0, _022E85F0 ; =TOP_SCREEN_STATUS_PTR - add r1, sp, #0 - ldr r0, [r0] - mov r2, #0 - add r0, r0, #0x80 - mov r3, #1 - bl ov10_022C1E80 - ldr r0, _022E85F0 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C21D8 - bl ov29_022E8FCC - add sp, sp, #0x14 - ldmia sp!, {pc} - .align 2, 0 -_022E85F0: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E85A8 - - arm_func_start ov29_022E85F4 -ov29_022E85F4: ; 0x022E85F4 - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r0, [r4, #0x10] - cmp r0, #0 - ldmeqia sp!, {r4, pc} - add r0, r4, #0x10 - bl ov29_022E9014 - ldr r0, _022E862C ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C21D8 - mov r0, #0 - strb r0, [r4, #0x10] - ldmia sp!, {r4, pc} - .align 2, 0 -_022E862C: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E85F4 - - arm_func_start ov29_022E8630 -ov29_022E8630: ; 0x022E8630 - stmdb sp!, {r3, lr} - ldr r0, _022E864C ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C2278 - bl ov29_022E8FF8 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E864C: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8630 - - arm_func_start ov29_022E8650 -ov29_022E8650: ; 0x022E8650 - stmdb sp!, {lr} - sub sp, sp, #0x14 - add r0, sp, #0 - bl ov10_022C22A0 - ldr r0, _022E8698 ; =TOP_SCREEN_STATUS_PTR - add r1, sp, #0 - ldr r0, [r0] - mov r2, #0 - add r0, r0, #0x80 - mov r3, #1 - bl ov10_022C1E80 - ldr r0, _022E8698 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C21D8 - mov r0, #1 - add sp, sp, #0x14 - ldmia sp!, {pc} - .align 2, 0 -_022E8698: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8650 diff --git a/asm/overlay_29_023055B0.s b/asm/overlay_29_023055B0.s deleted file mode 100644 index 8750c7a6..00000000 --- a/asm/overlay_29_023055B0.s +++ /dev/null @@ -1,491 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_023055B0.inc" - - .text - - arm_func_start ov29_023055B0 -ov29_023055B0: ; 0x023055B0 -#ifdef JAPAN -#define OV29_023055B0_OFFSET -4 -#else -#define OV29_023055B0_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r6, #0 - mov r5, #1 - ldr r4, _02305690 ; =DUNGEON_PTR - b _02305684 -_023055C4: - ldr r0, [r4] - add r0, r0, r6, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r7, [r0, #0xad4] -#else - ldr r7, [r0, #0xb78] -#endif - mov r0, r7 - bl EntityIsValid__0230558C - cmp r0, #0 - beq _02305680 - ldr r8, [r7, #0xb4] - ldrb r0, [r8, #7] - cmp r0, #0 - bne _02305680 - mov r0, r8 - bl IsTeamMemberOnFirstTurnInFixedRoom - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - add r0, r8, #0x100 - ldrsh r1, [r0, #0x7e + OV29_023055B0_OFFSET] - cmp r1, #0 - ldreqsh r0, [r0, #0x80 + OV29_023055B0_OFFSET] - cmpeq r0, #0 - beq _02305680 - ldrsh r0, [r7, #4] - cmp r1, r0 - addeq r0, r8, #0x100 - ldreqsh r1, [r0, #0x80 + OV29_023055B0_OFFSET] - ldreqsh r0, [r7, #6] - cmpeq r1, r0 - beq _02305680 - mov r0, r7 - mov r1, r5 - bl CheckVariousStatuses2__02301244 - cmp r0, #0 - bne _02305680 - add r1, r8, #0x7e + OV29_023055B0_OFFSET - add r0, r7, #4 - add r1, r1, #0x100 - bl GetDirectionTowardsPosition - mov sb, r0 - and r1, sb, #7 - mov r0, r7 - strb r1, [r8, #0x4c] - bl GetIdleAnimationId - mov r1, r0 - mov r0, r7 - mov r2, sb - bl ChangeMonsterAnimation -_02305680: - add r6, r6, #1 -_02305684: - cmp r6, #0x14 - blt _023055C4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_02305690: .word DUNGEON_PTR - arm_func_end ov29_023055B0 - - arm_func_start CheckNonLeaderTile -CheckNonLeaderTile: ; 0x02305694 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov sb, r0 - ldr r8, [sb, #0xb4] - bl EntityIsValid__0230558C - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r0, sb - bl GetTileAtEntity - mov r4, r0 - mov r0, sb - mov r1, #0xd - bl IqSkillIsEnabled - cmp r0, #0 - ldrneb r0, [r8, #0xef] - cmpne r0, #3 - beq _02305708 - mov r0, sb - mov r1, #0x6f - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0 - bne _023056F8 - mov r0, sb - mov r1, #0x10 - bl HasHeldItem -_023056F8: - cmp r0, #0 - bne _02305708 - add r0, sb, #4 - bl ov29_02337D68 -_02305708: - ldr r4, [r4, #0x10] - cmp r4, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - ldr r0, [r4] - cmp r0, #6 - addls pc, pc, r0, lsl #2 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_02305724: ; jump table - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 1 - b _02305740 ; case 2 - b _02305808 ; case 3 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 5 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 6 -_02305740: - mov r0, r4 - bl GetTrapInfo - ldrb r1, [r8, #6] - mov r6, #0 - mov r5, r0 - mov r7, r6 - cmp r1, #0 - bne _02305790 - mov r0, sb - mov r1, #0x13 - bl IqSkillIsEnabled - cmp r0, #0 - beq _02305790 - ldrb r0, [r4, #0x20] - cmp r0, #0 - bne _02305790 - mov r0, #1 - strb r0, [r4, #0x20] - bl UpdateTrapsVisibility - mov r7, #1 -_02305790: - ldrb r0, [r5, #1] - cmp r0, #0 - bne _023057B8 - ldrb r0, [r4, #0x20] - cmp r0, #0 - beq _023057E0 - ldrb r0, [r8, #6] - cmp r0, #0 - moveq r6, #1 - b _023057E0 -_023057B8: - cmp r0, #1 - bne _023057D0 - ldrb r0, [r8, #6] - cmp r0, #0 - movne r6, #1 - b _023057E0 -_023057D0: - cmp r0, #2 - ldreqb r0, [r8, #6] - cmpeq r0, #0 - moveq r6, #1 -_023057E0: - cmp r6, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - cmp r7, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r0, sb - add r1, sb, #4 - mov r2, #0 - mov r3, #1 - bl TryTriggerTrap - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_02305808: - mov r0, sb - bl TryNonLeaderItemPickUp - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - arm_func_end CheckNonLeaderTile - - arm_func_start ov29_02305814 -ov29_02305814: ; 0x02305814 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - bl EntityIsValid__0230558C - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r0, [r5, #0xb4] - ldrb r0, [r0, #6] - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, pc} - bl IsFloorOver - cmp r0, #0 - ldreq r0, _023058BC ; =DUNGEON_PTR - ldreq r0, [r0] - ldreqb r0, [r0, #0x793] - cmpeq r0, #0 - ldmneia sp!, {r3, r4, r5, pc} - mov r0, r5 - bl GetTileAtEntity - ldrh r0, [r0] - tst r0, #0x40 - ldmeqia sp!, {r3, r4, r5, pc} - bl GetLeader - ldr r1, _023058C0 ; =0x00000C82 - bl LogMessageByIdWithPopupCheckUser - ldr r1, _023058BC ; =DUNGEON_PTR - mov r0, r5 - ldr r2, [r1] - mov r3, #1 - mov r1, r4 - strb r3, [r2, #0x794] - bl TryTriggerMonsterHouse - mov r0, #0 - bl ov29_022E3A58 - add r0, r5, #4 - bl ov29_022E2CA0 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0x78 - mov r1, #0x39 - bl ov29_022EA370 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_023058BC: .word DUNGEON_PTR -#ifdef JAPAN -_023058C0: .word 0x000009C2 -#else -_023058C0: .word 0x00000C82 -#endif - arm_func_end ov29_02305814 - - arm_func_start EndNegativeStatusCondition -EndNegativeStatusCondition: ; 0x023058C4 -#ifdef JAPAN -#define END_NEGATIVE_STATUS_CONDITION_OFFSET -4 -#else -#define END_NEGATIVE_STATUS_CONDITION_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov r4, #0 - mov sb, r1 - mov sl, r0 - mov r0, sb - mov r8, r2 - mov r7, r3 - mov r5, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, r4 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sb - mov r1, r4 - ldr r6, [sb, #0xb4] - bl MonsterHasNegativeStatus - cmp r0, #0 - beq _02305AD8 - mov r0, sb - mov r4, #1 - bl IsMonsterDrowsy - cmp r0, #0 - beq _0230593C - mov r2, r5 - mov fp, r4 - mov r0, sl - mov r1, sb - mov r3, r2 - str fp, [sp] - bl EndSleepClassStatus -_0230593C: - mov r0, sb - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sb - bl MonsterHasNonvolatileNonsleepStatus - cmp r0, #0 - beq _0230596C - mov r0, sl - mov r1, sb - bl EndBurnClassStatus -_0230596C: - ldrb r0, [sp, #0x28] - cmp r0, #0 - mov r0, sb - beq _0230599C - bl MonsterHasImmobilizingStatus - cmp r0, #0 - beq _023059C0 - mov r0, sl - mov r1, sb - mov r2, #1 - bl EndFrozenClassStatus - b _023059C0 -_0230599C: - bl MonsterHasImmobilizingStatus - cmp r0, #0 - ldrneb r0, [r6, #0xc4] - cmpne r0, #3 - beq _023059C0 - mov r0, sl - mov r1, sb - mov r2, #1 - bl EndFrozenClassStatus -_023059C0: - mov r0, sb - bl MonsterHasAttackInterferingStatus - cmp r0, #0 - beq _023059DC - mov r0, sl - mov r1, sb - bl EndCringeClassStatus -_023059DC: - mov r0, sb - bl MonsterHasSkillInterferingStatus - cmp r0, #0 - beq _02305A00 - mov r0, sl - mov r1, sb - mov r2, #0 - mov r3, #1 - bl EndCurseClassStatus -_02305A00: - mov r0, sb - bl MonsterHasLeechSeedStatus - cmp r0, #0 - beq _02305A1C - mov r0, sl - mov r1, sb - bl EndLeechSeedClassStatus -_02305A1C: - mov r0, sb - bl MonsterHasWhifferStatus - cmp r0, #0 - beq _02305A38 - mov r0, sl - mov r1, sb - bl EndSureShotClassStatus -_02305A38: - mov r0, sb - mov r1, #0 - bl IsMonsterVisuallyImpaired - cmp r0, #0 - beq _02305A58 - mov r0, sl - mov r1, sb - bl EndBlinkerClassStatus -_02305A58: - mov r0, sb - bl IsMonsterMuzzled - cmp r0, #0 - beq _02305A74 - mov r0, sl - mov r1, sb - bl EndMuzzledStatus -_02305A74: - mov r0, sb - bl MonsterHasMiracleEyeStatus - cmp r0, #0 - beq _02305A90 - mov r0, sl - mov r1, sb - bl EndMiracleEyeStatus -_02305A90: -#ifdef JAPAN - ldrb r0, [r6, #0x105] -#else - ldrb r0, [r6, #0x106] -#endif - cmp r0, #0 - beq _02305AB4 - ldr r2, _02305BF0 ; =0x00000C83 - mov r3, #0 - mov r0, sl - mov r1, sb -#ifdef JAPAN - strb r3, [r6, #0x105] -#else - strb r3, [r6, #0x106] -#endif - bl LogMessageByIdWithPopupCheckUserTarget -_02305AB4: - ldrb r0, [r6, #0xfe] - cmp r0, #0 - beq _02305AD8 - ldr r2, _02305BF4 ; =0x00000C84 - mov r3, #0 - mov r0, sl - mov r1, sb - strb r3, [r6, #0xfe] - bl LogMessageByIdWithPopupCheckUserTarget -_02305AD8: - mov r0, sb - bl CalcSpeedStageWrapper - mov r2, #0 - mov fp, r0 - mov r1, r2 -_02305AEC: - add r0, r6, r2 - add r2, r2, #1 - strb r1, [r0, #0x119 + END_NEGATIVE_STATUS_CONDITION_OFFSET] - cmp r2, #5 - blt _02305AEC - mov r0, sb - bl CalcSpeedStageWrapper - cmp fp, r0 - beq _02305B40 - mov r0, #0 - mov r1, sb - mov r2, r0 - mov r4, #1 - bl SubstitutePlaceholderStringTags - ldr r1, [r6, #0x110 + END_NEGATIVE_STATUS_CONDITION_OFFSET] - ldr r0, _02305BF8 ; =ov29_02353318 - mov r1, r1, lsl #1 - ldrh r2, [r0, r1] - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_02305B40: - mov fp, #0 - mov r1, #1 - add r2, r6, #0x124 + END_NEGATIVE_STATUS_CONDITION_OFFSET - mov r0, fp - mov ip, r1 -_02305B54: - ldrb r6, [r2, fp, lsl #3] - add r3, r2, fp, lsl #3 - tst r6, #1 - movne r6, r1 - moveq r6, r0 - tst r6, #0xff - beq _02305B88 - ldrh r6, [r3, #2] - tst r6, #1 - bicne r6, r6, #1 - movne r4, ip - movne r5, ip - strneh r6, [r3, #2] -_02305B88: - add fp, fp, #1 - cmp fp, #4 - blt _02305B54 - cmp r4, #0 - beq _02305BC8 - cmp r8, #0 - beq _02305BAC - mov r0, sb - bl ov29_022E543C -_02305BAC: - cmp r5, #0 - beq _02305BE0 - ldr r2, _02305BFC ; =0x00000C85 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - b _02305BE0 -_02305BC8: - cmp r7, #0 - bne _02305BE0 - ldr r2, _02305C00 ; =0x00000C86 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_02305BE0: - mov r0, sb - bl UpdateStatusIconFlags - mov r0, r4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -#define END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET -0x2C0 -#else -#define END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET 0 -#endif -_02305BF0: .word 0x00000C83 + END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET -_02305BF4: .word 0x00000C84 + END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET -_02305BF8: .word ov29_02353318 -_02305BFC: .word 0x00000C85 + END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET -_02305C00: .word 0x00000C86 + END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET - arm_func_end EndNegativeStatusCondition diff --git a/asm/overlay_29_02314810.s b/asm/overlay_29_02314810.s deleted file mode 100644 index 4f48dd33..00000000 --- a/asm/overlay_29_02314810.s +++ /dev/null @@ -1,524 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02314810.inc" - - .text - - - arm_func_start TrySealMove -TrySealMove: ; 0x02314ABC - stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} - sub sp, sp, #0x14 - mov r5, #0 - movs r7, r1 - mov r8, r0 - mov r6, r2 - moveq r0, r5 - beq _02314C18 - mov r2, #1 - bl SafeguardIsActive - cmp r0, #0 - movne r0, r5 - bne _02314C18 - mov r0, r8 - mov r1, r7 - mov r2, #1 - bl IsProtectedFromNegativeStatus - cmp r0, #0 - movne r0, r5 - bne _02314C18 - ldr r0, [r7, #0xb4] - mov r4, r5 -#ifdef JAPAN - add ip, r0, #0x120 -#else - add ip, r0, #0x124 -#endif - mov lr, r4 - mov r2, r5 - mov r3, #1 - add r0, sp, #4 -_02314B28: - ldrb r1, [ip, lr, lsl #3] - add sb, ip, lr, lsl #3 - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - beq _02314B54 - ldrh r1, [sb, #2] - tst r1, #1 - streq sb, [r0, r4, lsl #2] - addeq r4, r4, #1 -_02314B54: - add lr, lr, #1 - cmp lr, #4 - blt _02314B28 - cmp r6, #0 - beq _02314B74 - cmp r4, #0 - moveq r0, #0 - beq _02314C18 -_02314B74: - cmp r4, #0 - beq _02314BE8 - ldr r3, _02314C20 ; =0x00000DBE - mov r5, #8 - mov r0, r8 - mov r1, r7 - mov r2, #1 - str r5, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - movne r0, #0 - bne _02314C18 - cmp r6, #0 - movne r0, #1 - bne _02314C18 - mov r0, r4 - bl DungeonRandInt - add r1, sp, #4 - ldr r2, [r1, r0, lsl #2] - mov r0, #0 - ldrh r1, [r2, #2] - orr r1, r1, #1 - strh r1, [r2, #2] - ldrh r1, [r2, #4] - bl SetPreprocessorArgsIdVal - mov r0, r8 - mov r1, r7 - mov r5, #1 - bl TryActivateQuickFeet -_02314BE8: - cmp r5, #0 - beq _02314C04 - ldr r2, _02314C24 ; =0x00000DE3 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _02314C14 -_02314C04: - ldr r2, _02314C28 ; =0x00000DE4 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_02314C14: - mov r0, #1 -_02314C18: - add sp, sp, #0x14 - ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -#ifdef JAPAN -_02314C20: .word 0x00000AFE -_02314C24: .word 0x00000B23 -_02314C28: .word 0x00000B24 -#else -_02314C20: .word 0x00000DBE -_02314C24: .word 0x00000DE3 -_02314C28: .word 0x00000DE4 -#endif - arm_func_end TrySealMove - - arm_func_start BoostOrLowerSpeed -BoostOrLowerSpeed: ; 0x02314C2C - stmdb sp!, {r3, r4, r5, lr} - mov r4, r1 - mov r5, r0 - mov r0, r4 - bl EntityIsValid__023118B4 - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0x32 - bl DungeonRandOutcome__022EAB20 - cmp r0, #0 - mov r2, #1 - mov r0, r5 - beq _02314C74 - mov r1, r4 - mov r3, r2 - bl LowerSpeed - b _02314C84 -_02314C74: - mov r1, r4 - mov r3, #0 - str r2, [sp] - bl BoostSpeed -_02314C84: - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end BoostOrLowerSpeed - - arm_func_start ResetHitChanceStat -ResetHitChanceStat: ; 0x02314C8C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r5, r1 - mov r6, r0 - mov r0, r5 - mov r8, r2 - mov r4, r3 - mov r7, #0 - bl EntityIsValid__023118B4 - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - ldr r0, [r5, #0xb4] - add r1, r0, r8, lsl #1 - ldrsh r0, [r1, #0x2c] - cmp r0, #0xa - movne r0, #0xa - movne r7, #1 - strneh r0, [r1, #0x2c] - cmp r7, #0 - beq _02314CE4 - mov r0, r5 - bl ov29_022E543C - b _02314CF4 -_02314CE4: - cmp r4, #0 - beq _02314CF4 - mov r0, r5 - bl ov29_022E543C -_02314CF4: - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - cmp r7, #0 - beq _02314D20 - mov r0, r6 - mov r1, r5 -#ifdef JAPAN - mov r2, #0xaa0 -#else - mov r2, #0xd60 -#endif - bl LogMessageByIdWithPopupCheckUserTarget - b _02314D30 -_02314D20: - ldr r2, _02314D3C ; =0x00000D61 - mov r0, r6 - mov r1, r5 - bl LogMessageByIdWithPopupCheckUserTarget -_02314D30: - mov r0, r5 - bl UpdateStatusIconFlags - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -#ifdef JAPAN -_02314D3C: .word 0x00000AA1 -#else -_02314D3C: .word 0x00000D61 -#endif - arm_func_end ResetHitChanceStat - - arm_func_start ExclusiveItemEffectIsActiveWithLogging -ExclusiveItemEffectIsActiveWithLogging: ; 0x02314D40 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #8 - mov r6, r1 - ldrb r1, [sp, #0x20] - mov r7, r0 - mov r0, r6 - mov r5, r2 - mov r4, r3 - bl ExclusiveItemEffectIsActive__023147EC - cmp r0, #0 - beq _02314DB8 - cmp r5, #0 - beq _02314DB0 - mov r0, #0 - mov r1, r6 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r1, [sp, #0x20] - add r2, sp, #0 - mov r0, r6 - bl GetExclusiveItemWithEffectFromBag - add r1, sp, #0 - mov r0, #1 - bl PrepareItemForPrinting__02345728 - mov r0, r7 - mov r1, r6 - mov r2, r4 - bl LogMessageByIdWithPopupCheckUserTarget -_02314DB0: - mov r0, #1 - b _02314DBC -_02314DB8: - mov r0, #0 -_02314DBC: - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ExclusiveItemEffectIsActiveWithLogging - - arm_func_start LogMessageWithTargetAndExclusiveItemName -LogMessageWithTargetAndExclusiveItemName: ; 0x02314DC4 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #8 - mov r7, r0 - mov r0, #0 - mov r5, r2 - mov r2, r0 - mov r6, r1 - mov r4, r3 - bl SubstitutePlaceholderStringTags - add r2, sp, #0 - mov r0, r6 - mov r1, r4 - bl GetExclusiveItemWithEffectFromBag - add r1, sp, #0 - mov r0, #1 - bl PrepareItemForPrinting__02345728 - mov r0, r7 - mov r1, r6 - mov r2, r5 - bl LogMessageByIdWithPopupCheckUserTarget - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end LogMessageWithTargetAndExclusiveItemName - - arm_func_start TryActivateQuickFeet -TryActivateQuickFeet: ; 0x02314E1C - stmdb sp!, {r3, r4, r5, lr} - mov r4, r1 - mov r5, r0 - mov r0, r4 - mov r1, #0x6d - bl AbilityIsActiveVeneer - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r3, #0 - mov r0, r5 - mov r1, r4 - mov r2, #1 - str r3, [sp] - bl BoostSpeed - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end TryActivateQuickFeet - - arm_func_start TryInflictTerrifiedStatus -TryInflictTerrifiedStatus: ; 0x02314E60 - stmdb sp!, {r3, r4, r5, lr} - ldr r2, _02314EB0 ; =ov10_022C4618 - mov r4, r1 - ldr ip, [r4, #0xb4] - mov r3, #1 - mov r5, r0 - ldrsh r1, [r2] -#ifdef JAPAN - strb r3, [ip, #0x103] - mov r0, r4 - strb r1, [ip, #0x104] -#else - strb r3, [ip, #0x104] - mov r0, r4 - strb r1, [ip, #0x105] -#endif - bl ov29_022E60E4 - mov r0, #0 - mov r1, r4 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _02314EB4 ; =0x00000DE5 - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02314EB0: .word ov10_022C4618 -#ifdef JAPAN -_02314EB4: .word 0x00000B25 -#else -_02314EB4: .word 0x00000DE5 -#endif - arm_func_end TryInflictTerrifiedStatus - - arm_func_start TryInflictGrudgeStatus -TryInflictGrudgeStatus: ; 0x02314EB8 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r7, r1 - ldr r5, [r7, #0xb4] - mov r8, r0 - mov r4, #0 - mov r6, r2 - mov r2, r4 - mov r0, #1 - bl SubstitutePlaceholderStringTags - ldrb r0, [r5, #0xfd] - cmp r0, #0 - beq _02314F04 - cmp r6, #0 - beq _02314F2C - ldr r2, _02314F34 ; =0x00000ED1 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _02314F2C -_02314F04: - mov r4, #1 - mov r0, r7 - strb r4, [r5, #0xfd] - bl UpdateStatusIconFlags - cmp r6, #0 - beq _02314F2C -#ifdef JAPAN - ldr r2, _0231640C ; =0x00000C12 - mov r0, r8 - mov r1, r7 -#else - mov r0, r8 - mov r1, r7 - mov r2, #0xed0 -#endif - bl LogMessageByIdWithPopupCheckUserTarget -_02314F2C: - mov r0, r4 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -#ifdef JAPAN -_02314F34: .word 0x00000C13 -_0231640C: .word 0x00000C12 -#else -_02314F34: .word 0x00000ED1 -#endif - arm_func_end TryInflictGrudgeStatus - - arm_func_start TryInflictConfusedStatus -TryInflictConfusedStatus: ; 0x02314F38 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r6, r1 - mov r7, r0 - mov r0, r6 - mov r5, r2 - mov r4, r3 - bl EntityIsValid__02315118 - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r7 - mov r1, r6 - mov r2, r5 - bl SafeguardIsActive - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r7 - mov r1, r6 - mov r2, r5 - bl IsProtectedFromNegativeStatus - cmp r0, #0 - mov r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - mov r1, r6 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r0, r6 - mov r1, #0x19 - bl ItemIsActive__0231513C - cmp r0, #0 - beq _02314FD8 - cmp r5, #0 - beq _02314FD0 - ldr r2, _02315100 ; =0x00000DAF - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget -_02314FD0: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_02314FD8: - mov ip, #2 - ldr r3, _02315104 ; =0x00000DBA - mov r0, r7 - mov r1, r6 - mov r2, r5 - str ip, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - cmp r7, r6 - beq _02315048 - cmp r7, #0 - moveq r0, #0 - beq _02315028 - ldr r0, [r7] - cmp r0, #1 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff -_02315028: - cmp r0, #0 - beq _02315048 - mov r0, r7 - mov r1, #0x53 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0 - bne _02315054 -_02315048: - mov r0, r6 - mov r1, #0x40 - bl AbilityIsActiveVeneer -_02315054: - cmp r0, #0 - beq _0231507C - cmp r5, #0 - beq _02315074 - ldr r2, _02315108 ; =0x00000DA7 - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget -_02315074: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_0231507C: - cmp r4, #0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r6 - bl ov29_022E41CC - ldr r4, [r6, #0xb4] - ldrb r0, [r4, #0xd0] - cmp r0, #2 - beq _023150E0 - ldr r1, _0231510C ; =CONFUSED_TURN_RANGE - mov r3, #2 - mov r0, r6 - mov r2, #1 - strb r3, [r4, #0xd0] - bl CalcStatusDuration - add r3, r0, #1 - ldr r2, _02315110 ; =0x00000CFE - mov r0, r7 - mov r1, r6 - strb r3, [r4, #0xd1] - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r7 - mov r1, r6 - bl TryActivateQuickFeet - b _023150F0 -_023150E0: - ldr r2, _02315114 ; =0x00000CFF - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget -_023150F0: - mov r0, r6 - bl UpdateStatusIconFlags - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -#ifdef JAPAN -#define TRY_INFLICT_CONFUSED_STATUS_OFFSET -0x2C0 -#else -#define TRY_INFLICT_CONFUSED_STATUS_OFFSET 0 -#endif -_02315100: .word 0x00000DAF + TRY_INFLICT_CONFUSED_STATUS_OFFSET -_02315104: .word 0x00000DBA + TRY_INFLICT_CONFUSED_STATUS_OFFSET -_02315108: .word 0x00000DA7 + TRY_INFLICT_CONFUSED_STATUS_OFFSET -_0231510C: .word CONFUSED_TURN_RANGE -_02315110: .word 0x00000CFE + TRY_INFLICT_CONFUSED_STATUS_OFFSET -_02315114: .word 0x00000CFF + TRY_INFLICT_CONFUSED_STATUS_OFFSET - arm_func_end TryInflictConfusedStatus diff --git a/include/main_0202AAA8.h b/include/main_0202AAA8.h index 32805a1e..4494ae45 100644 --- a/include/main_0202AAA8.h +++ b/include/main_0202AAA8.h @@ -5,7 +5,8 @@ #include "main_02028080.h" struct unk_0202AAA8 { - u8 field_0x0[8]; + u32 field_0x0; + u8 field_0x4[4]; u8 field_0x8; u8 field_0x9[0x17]; u16 field_0x20; @@ -13,16 +14,19 @@ struct unk_0202AAA8 { s32 field_0xA0; u8 field_0xA4[0x54]; u32 field_0xF8; - u8 field_0xFC[8]; + u32 field_0xFC; + s32 field_0x100; u32 field_0x104; - u8 field_0x108[0x90]; + u8 field_0x108[0x58]; + u8 *field_0x160; + u8 field_0x164[0x34]; void *field_0x198; s32 field_0x19C; u8 field_0x1A0; u8 field_0x1A1; u8 field_0x1A2[2]; s32 field_0x1A4; - u8 field_0x1A8[4]; + s32 field_0x1A8; s32 field_0x1AC; s32 field_0x1B0; u8 field_0x1B4[8]; diff --git a/include/main_0202AB40.h b/include/main_0202AB40.h index 2e56864c..b7eed59c 100644 --- a/include/main_0202AB40.h +++ b/include/main_0202AB40.h @@ -2,9 +2,15 @@ #define PMDSKY_MAIN_0202AB40_H #include "util.h" +#include "window.h" u32 IsParentMenuActive(s32 window_id); bool8 CheckParentMenuField0x1A0(s32 window_id); s32 GetWindowIdSelectedItemOnPage(s32 window_id); +void sub_0202AB94(s32 window_id, s32 a); +s32 GetSimpleMenuResult__0202AEA4(s32 window_id); +void UpdateParentMenu(struct Window *w); +void sub_0202AF78(struct Window *w); +void sub_0202B030(s32 window_id); #endif diff --git a/include/main_0202B4C4.h b/include/main_0202B4C4.h index 52894a38..43a2135b 100644 --- a/include/main_0202B4C4.h +++ b/include/main_0202B4C4.h @@ -2,7 +2,14 @@ #define PMDSKY_MAIN_0202B4C4_H #include "util.h" +#include "window.h" +#include "main_0202A66C.h" +void sub_0202B0A4(s32 window_id, s32 a); +s32 CreateSimpleMenuFromStringIds(WindowTemplate *params, u32 flags, struct struct_2 *cfg, struct unk_0202A5CC *items, s32 n); +s32 CreateSimpleMenu(WindowTemplate *params, u32 flags, struct struct_2 *cfg, struct unk_0202A75C *items, s32 n); +s32 CreateSimpleMenuInternal(WindowTemplate *params, u32 flags, struct struct_2 *cfg, struct unk_0202A75C *items, s32 n); +void ResumeSimpleMenu(s32 window_id); void CloseSimpleMenu(s32 window_id); u32 IsSimpleMenuActive(s32 window_id); bool8 CheckSimpleMenuField0x1A0(s32 window_id); diff --git a/include/move_orb_effects.h b/include/move_orb_effects.h index bddfa993..b99fcde1 100644 --- a/include/move_orb_effects.h +++ b/include/move_orb_effects.h @@ -39,5 +39,13 @@ bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusiv void BoostSpeed(struct entity *user, struct entity *target, s32 n_stages, s32 turns, bool8 log_failure); void BoostSpeedOneStage(struct entity *user, struct entity *target, s32 turns, bool8 log_failure); void LowerSpeed(struct entity *user, struct entity *target, s32 n_stages, bool8 log_failure); +bool8 TrySealMove(struct entity *user, struct entity *target, bool8 check_only); +bool8 BoostOrLowerSpeed(struct entity *user, struct entity *target); +void ResetHitChanceStat(struct entity *user, struct entity *target, s32 stat_idx, s32 play_effect_anyway); +bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); +void LogMessageWithTargetAndExclusiveItemName(struct entity *user, struct entity *target, s32 message_id, enum exclusive_item_effect_id effect_id); +bool8 TryActivateQuickFeet(struct entity *user, struct entity *target); +void TryInflictTerrifiedStatus(struct entity *user, struct entity *target); +bool8 TryInflictGrudgeStatus(struct entity *user, struct entity *target, bool8 log_message); #endif //PMDSKY_MOVE_ORB_EFFECTS_H diff --git a/include/overlay_29_022E869C.h b/include/overlay_29_022E869C.h index 412b49dc..1746c28b 100644 --- a/include/overlay_29_022E869C.h +++ b/include/overlay_29_022E869C.h @@ -1,10 +1,60 @@ #ifndef PMDSKY_OVERLAY_29_022E869C_H #define PMDSKY_OVERLAY_29_022E869C_H +#include "dungeon.h" #include "dungeon_mode.h" #include "item.h" #include "move.h" +struct unk_02353554 { + u8 field_0x0; + u8 field_0x1[3]; + s32 field_0x4; + s16 field_0x8; + u8 field_0xa[0x1a]; + u8 field_0x24; + u8 field_0x25[4]; + u8 field_0x29; + u8 field_0x2a; + u8 field_0x2b; + u8 field_0x2c; + u8 field_0x2d[0x53]; + u8 field_0x80[0x38]; + u8 field_0xb8[0x170]; + u8 field_0x228; + u8 field_0x229; + u8 field_0x22a[6]; +}; + +struct unk_022E8054 { + u8 field_0x0[0x10]; + u8 field_0x10; +}; + +void FreeTopScreenStatus(void); +void ov29_022E7F7C(void); +bool8 ov29_022E7F94(void); +bool8 ov29_022E8018(void); +void ov29_022E8054(struct unk_022E8054 *a); +bool8 ov29_022E80D0(void); +void ov29_022E8104(void); +bool8 InitializeTeamStats(void); +bool8 UpdateTeamStatsWrapper(void); +void ov29_022E81C8(struct unk_022E8054 *a); +bool8 FreeTeamStatsWrapper(void); +void ov29_022E81F8(void); +void ov29_022E8244(void); +void DisplayTeamStatsSprite(struct entity *entity, s16 a, s16 b); +bool8 ov29_022E840C(void); +void ov29_022E847C(struct unk_022E8054 *a); +bool8 ov29_022E84B0(void); +bool8 InitDungeonControlsMenuWithBg(void); +void ov29_022E854C(struct unk_022E8054 *a); +bool8 FreeDungeonControlsMenuWithBg(void); +bool8 ov29_022E85A8(void); +void ov29_022E85F4(struct unk_022E8054 *a); +bool8 ov29_022E8630(void); +bool8 ov29_022E8650(void); bool8 ov29_022E869C(void); #endif diff --git a/include/overlay_29_0230558C.h b/include/overlay_29_0230558C.h index ded7f1c6..db548c7c 100644 --- a/include/overlay_29_0230558C.h +++ b/include/overlay_29_0230558C.h @@ -5,5 +5,9 @@ // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__0230558C(struct entity *entity); +void ov29_023055B0(s32 a); +void CheckNonLeaderTile(struct entity *entity); +void ov29_02305814(struct entity *entity, bool8 a); +s32 EndNegativeStatusCondition(struct entity *user, struct entity *target, bool8 a, bool8 b, bool8 c); #endif //PMDSKY_OVERLAY_29_0230558C_H diff --git a/include/overlay_29_02315118.h b/include/overlay_29_02315118.h index 76ae5c43..1e482190 100644 --- a/include/overlay_29_02315118.h +++ b/include/overlay_29_02315118.h @@ -3,6 +3,7 @@ #include "dungeon_mode.h" +bool8 TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 log_failure, bool8 check_only); // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__02315118(struct entity *entity); // Checks if a monster is holding a certain item that isn't disabled by Klutz. diff --git a/include/overlay_31_02382820.h b/include/overlay_31_02382820.h index 1f66a7c3..f403cf85 100644 --- a/include/overlay_31_02382820.h +++ b/include/overlay_31_02382820.h @@ -34,13 +34,6 @@ void EntryOverlay31(void); void DrawDungeonMenuStatusWindow(s32 window_id); void DungeonMenuSwitch(s32 window_id); -struct struct_2 { - u32 b; // 0x0 - u8 PAD1[92]; - u8* c; // 0x60 - u8 PAD2[50]; -}; - struct struct_3 { s8 e[4]; // 0x0 u32 f; // 0x4 diff --git a/include/spawn_2.h b/include/spawn_2.h index 8868b47e..0f45a0c8 100644 --- a/include/spawn_2.h +++ b/include/spawn_2.h @@ -6,5 +6,6 @@ s32 GetMonsterIdToSpawn(s32 weight_type_idx); s32 GetMonsterLevelToSpawn(s32 monster_id); s32 IsOnMonsterSpawnList(s32 monster_id); +void AllocTopScreenStatus(void); #endif //PMDSKY_SPAWN_2_H diff --git a/include/window.h b/include/window.h index 61d470b5..b395a788 100644 --- a/include/window.h +++ b/include/window.h @@ -4,6 +4,13 @@ #include "enums.h" #include "util.h" +struct struct_2 { + u32 b; // 0x0 + u8 PAD1[92]; + u8* c; // 0x60 + u8 PAD2[50]; +}; + // Represents the state of a portrait to be displayed inside a window typedef struct { enum monster_id monster_id; // 0x0: The species id, or the set index inside kaomado.kao diff --git a/main.lsf b/main.lsf index 09aad59a..b80dfe2c 100644 --- a/main.lsf +++ b/main.lsf @@ -164,7 +164,6 @@ Static main Object asm/main_0202A690.o Object src/main_0202AAA8.o Object src/main_0202AB40.o - Object asm/main_0202AB94.o Object src/main_0202B4C4.o Object src/main_0202B558.o Object asm/main_0202B5C8.o @@ -824,7 +823,6 @@ Overlay OVY_29 Object src/random_trap.o Object src/spawn_1.o Object src/spawn_2.o - Object asm/overlay_29_022E7EC4.o Object src/overlay_29_022E869C.o Object asm/overlay_29_022E86A4.o Object src/position_util.o @@ -957,7 +955,6 @@ Overlay OVY_29 Object src/overlay_29_023047B8.o Object asm/overlay_29_023047DC.o Object src/overlay_29_0230558C.o - Object asm/overlay_29_023055B0.o Object src/overlay_29_02305C04.o Object asm/overlay_29_02305C3C.o Object src/overlay_29_023061A8.o @@ -996,7 +993,6 @@ Overlay OVY_29 Object src/overlay_29_02311BF8.o Object asm/overlay_29_02311C28.o Object src/move_orb_effects.o - Object asm/overlay_29_02314810.o Object src/overlay_29_02315118.o Object asm/overlay_29_0231516C.o Object src/dungeon_statuses.o diff --git a/src/main_0202AB40.c b/src/main_0202AB40.c index 68d766fa..e60ae2e6 100644 --- a/src/main_0202AB40.c +++ b/src/main_0202AB40.c @@ -1,6 +1,28 @@ #include "main_0202AB40.h" +#include "main_0202A66C.h" #include "main_0202AAA8.h" +#include "main_02027AF0.h" +#include "main_020282F4.h" +#include "main_0203258C.h" +#include "main_020327CC.h" #include "main_02032558.h" +#include "window.h" + +extern void sub_02032684(struct unk_02032558 *p, s32 a); +extern void sub_02031C74(struct unk_02032558 *p, u32 mask); +extern void sub_02031C84(struct unk_02032558 *p, u32 mask); +extern s32 sub_02031C98(struct unk_02032558 *p, u32 *buttons, s32 *state, s32 a); +extern s32 sub_02032160(struct unk_02032558 *p, s32 *state, s32 a, s32 b, s32 c, s32 d); +extern s32 sub_02033758(struct unk_02032558 *p, u32 *buttons, s32 *state); +extern s32 sub_020323F8(struct unk_02032558 *p, u32 buttons, s32 idx, s32 a); +extern bool8 IsMenuOptionActive(struct unk_02032558 *p); +extern s32 sub_02032070(struct unk_02032558 *p); +extern s32 sub_0203250C(struct unk_02032558 *p, u32 buttons); +extern void PlayWindowInputSound(struct unk_02032558 *p, s32 sound); +extern void sub_02028948(s32 window_id, struct unk_02032558 *p); +extern void sub_020263C8(s32 window_id, s32 a, s32 y, u8 *str, u8 colour); +extern s32 sub_020265A8(u8 *str); +extern void sub_0202A03C(struct unk_02032558 *p, s32 window_id); u32 IsParentMenuActive(s32 window_id) { @@ -21,3 +43,215 @@ s32 GetWindowIdSelectedItemOnPage(s32 window_id) { return GetSelectedItemOnPage(GetWindowContents(window_id) + 4); } + +void sub_0202AB94(s32 window_id, s32 a) +{ + sub_02032684(GetWindowContents(window_id) + 4, a); +} + +s32 GetSimpleMenuResult__0202AEA4(s32 window_id) +{ + struct unk_0202AAA8 *menu = GetWindowContents(window_id); + struct unk_0202A75C *items = menu->field_0x198; + s32 idx; + + if (menu->field_0x1A0 != 0) { + if (menu->field_0x1A1 != 0) { + idx = GetTotalNumMenuItems((void *)menu + 4); + } else { + idx = GetSelectedMenuItemIdx((void *)menu + 4); + } + return items[idx].field_0x100; + } + return 0; +} + +void UpdateParentMenu(struct Window *w) +{ + struct unk_0202AAA8 *menu; + u32 buttons; + s32 state[9]; + s32 changed; + s32 r; + + menu = (struct unk_0202AAA8 *)w->template.unk0C; + switch (menu->field_0x19C) { + case 0: + if (!sub_0202810C(w->id)) { + break; + } + menu->field_0x1AC = menu->field_0x1A8; + menu->field_0x19C = 2; + case 1: + if (menu->field_0x19C == 1) { + menu->field_0x1AC = menu->field_0x1A8; + menu->field_0x19C = 2; + break; + } + case 2: + if (menu->field_0x1A8 > 0) { + if (menu->field_0x1AC > 0) { + menu->field_0x1AC--; + } + if (menu->field_0x1AC > 0) { + sub_02031C74((void *)menu + 4, 0x4000000); + menu->field_0x1A0 = 0; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = 0; + w->unkB8 = -1; + sub_0202AF78(w); + break; + } + sub_02031C84((void *)menu + 4, 0x4000000); + } + menu->field_0x19C = 3; + case 3: + sub_0202AF78(w); + if (menu->field_0xFC & 0x800000) { + menu->field_0x19C = 9; + menu->field_0x1A0 = 1; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = 0; + w->unkB8 = -4; + break; + } + menu->field_0x19C = 4; + menu->field_0x1A0 = 0; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = 0; + w->unkB8 = -1; + break; + case 4: + changed = sub_02031C98((void *)menu + 4, &buttons, state, 1); + if (buttons == 0 && (menu->field_0xFC & 1)) { + r = sub_02032160((void *)menu + 4, state, 0x408, 0, 0, 1); + if (r >= 0) { + sub_02032684((void *)menu + 4, r); + changed = 1; + buttons |= 1; + } + } + if (buttons == 0) { + changed |= sub_02033758((void *)menu + 4, &buttons, state); + } + if ((changed | sub_020323F8((void *)menu + 4, buttons, + GetSelectedMenuItemIdx((void *)menu + 4), + 0)) != 0) { + sub_0202AF78(w); + } + if (buttons & 1) { + if (IsMenuOptionActive((void *)menu + 4)) { + if (!(menu->field_0xFC & 0x80000000)) { + PlayWindowInputSound((void *)menu + 4, 0); + } + menu->field_0x1A0 = 1; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = buttons; + w->unkB8 = -4; + menu->field_0x19C = 5; + } else { + PlayWindowInputSound((void *)menu + 4, 2); + } + } else if (buttons & 2) { + PlayWindowInputSound((void *)menu + 4, 1); + menu->field_0x1A0 = 1; + menu->field_0x1A1 = 1; + menu->field_0x1A4 = buttons; + w->unkB8 = -5; + menu->field_0x19C = 5; + } else if (sub_0203250C((void *)menu + 4, buttons)) { + menu->field_0x1A0 = 1; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = buttons; + w->unkB8 = -4; + menu->field_0x19C = 5; + } + sub_02028948(w->id, (void *)menu + 4); + break; + case 5: + if (sub_02032070((void *)menu + 4)) { + break; + } + case 6: + if (menu->field_0x1A1 == 0) { + if (menu->field_0xFC & 0x400000) { + sub_0202AF78(w); + menu->field_0x19C = 9; + break; + } + } else if (*(u8 *)&menu->field_0x1B0 != 0) { + menu->field_0x19C = 9; + break; + } + menu->field_0x19C = 7; + case 7: + if (!sub_0202812C(w->id)) { + break; + } + if (menu->field_0x1A1 != 0) { + w->unkB8 = -5; + } else { + w->unkB8 = -4; + } + menu->field_0x19C = 8; + break; + } +} + +void sub_0202AF78(struct Window *w) +{ + struct unk_0202AAA8 *menu; + struct unk_0202A75C *item; + s32 i; + u8 *p; + s32 highlight; + s32 colour; + + menu = (struct unk_0202AAA8 *)w->template.unk0C; + item = menu->field_0x198; + if (menu->field_0xFC & 0x200) { + p = menu->field_0x160; + } else { + p = NULL; + } + i = 0; + sub_02027B1C(w->id); + while (!IsEmptyString(item->field_0x0)) { + highlight = 0; + if (p != NULL) { + if (*p & 2) { + highlight = 1; + } + p++; + } + if (highlight) { + colour = 0x42; + } else { + colour = 0x44; + } + sub_020263C8(w->id, 13, GetPageItemYOffset((void *)menu + 4, i), + item->field_0x0, colour); + i++; + item++; + } + sub_0202A03C((void *)menu + 4, w->id); + UpdateWindow(w->id); +} + +void sub_0202B030(s32 window_id) +{ + struct unk_0202AAA8 *menu = GetWindowContents(window_id); + + if (IsMenuOptionActive((void *)menu + 4)) { + if (!(menu->field_0xFC & 0x80000000)) { + PlayWindowInputSound((void *)menu + 4, 0); + } + menu->field_0x1A0 = 1; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = 1; + sub_0202830C(window_id, -4); + menu->field_0x19C = 6; + } else { + PlayWindowInputSound((void *)menu + 4, 2); + } +} diff --git a/src/main_0202B4C4.c b/src/main_0202B4C4.c index dd953713..c872fe56 100644 --- a/src/main_0202B4C4.c +++ b/src/main_0202B4C4.c @@ -1,13 +1,197 @@ #include "main_0202B4C4.h" -#include "main_02032558.h" - -extern s32 GetCurrentPage(struct unk_02032558 *p); - -extern void *GetWindowContents(s32 window_id); - -extern s32 GetSelectedItemOnPage(struct unk_02032558 *p); +#include "main_0202A66C.h" #include "main_0202AAA8.h" #include "main_02001188.h" +#include "main_02027648.h" +#include "main_02028284.h" +#include "main_020282F4.h" +#include "main_02032558.h" +#include "window.h" + +extern s32 GetCurrentPage(struct unk_02032558 *p); +extern void *GetWindowContents(s32 window_id); +extern s32 GetSelectedItemOnPage(struct unk_02032558 *p); + +extern WindowTemplate SIMPLE_MENU_DEFAULT_WINDOW_PARAMS; + +extern void UpdateSimpleMenu(struct Window *w); +extern void sub_02031C74(struct unk_02032558 *p, u32 mask); +extern void sub_02031C84(struct unk_02032558 *p, u32 mask); +extern bool8 IsMenuOptionActive(struct unk_02032558 *p); +extern void PlayWindowInputSound(struct unk_02032558 *p, s32 sound); +extern void sub_02032984(struct unk_02032558 *p); +extern s32 sub_020265A8(u8 *str); +extern u8 sub_02031A5C(u32 flags, struct struct_2 *cfg, s32 width); +extern u8 CalcMenuHeightDiv8__02031AA4(u32 flags, struct struct_2 *cfg, s32 *count, s32 *n); +extern void InitWindowInput(struct unk_02032558 *p, u32 flags, struct struct_2 *cfg, + struct unk_02028284 *rect, s32 count, s32 n); +extern s32 PreprocessStringFromId(u8 *output, s32 output_size, s32 string_id, + s32 flags, void *args); + +void sub_0202B0A4(s32 window_id, s32 a) +{ + struct unk_0202AAA8 *menu = GetWindowContents(window_id); + + if (a != 0) { + sub_02031C74((void *)menu + 4, 0xB000000); + sub_02031C84((void *)menu + 4, 0x10); + } else { + sub_02031C84((void *)menu + 4, 0xB000000); + sub_02031C74((void *)menu + 4, 0x10); + } +} + +s32 CreateSimpleMenuFromStringIds(WindowTemplate *params, u32 flags, + struct struct_2 *cfg, + struct unk_0202A5CC *items, s32 n) +{ + struct unk_0202A5CC *p; + struct unk_0202A75C *buf; + struct unk_0202A75C *q; + s32 count; + + p = items; + count = 0; + while (p->field_0x0 != 0) { + p++; + count++; + } + + buf = MemAlloc((count + 1) * sizeof(struct unk_0202A75C), 8); + q = buf; + while (items->field_0x0 != 0) { + PreprocessStringFromId(q->field_0x0, 0x100, items->field_0x0, 0xC402, + NULL); + q->field_0x100 = items->field_0x4; + items++; + q++; + } + q->field_0x0[0] = 0; + q->field_0x100 = items->field_0x4; + return CreateSimpleMenuInternal(params, flags, cfg, buf, n); +} + +s32 CreateSimpleMenu(WindowTemplate *params, u32 flags, struct struct_2 *cfg, + struct unk_0202A75C *items, s32 n) +{ + struct unk_0202A75C *p; + struct unk_0202A75C *buf; + struct unk_0202A75C *q; + s32 count; + + p = items; + count = 0; + while (!IsEmptyString(p->field_0x0)) { + p++; + count++; + } + + buf = MemAlloc((count + 1) * sizeof(struct unk_0202A75C), 8); + q = buf; + while (!IsEmptyString(items->field_0x0)) { + *q++ = *items++; + } + *q = *items; + return CreateSimpleMenuInternal(params, flags, cfg, buf, n); +} + +s32 CreateSimpleMenuInternal(WindowTemplate *params, u32 flags, + struct struct_2 *cfg, struct unk_0202A75C *items, + s32 n) +{ + WindowTemplate tmpl; + struct unk_02028284 rect; + s32 count; + struct unk_0202AAA8 *menu; + struct unk_0202A75C *p; + s32 target; + s32 sel; + s32 width; + s32 item_width; + s32 window_id; + + menu = MemAlloc(0x1B4, 8); + if (flags & 0x20) { + target = cfg->b; + } else { + target = 0; + } + sel = 0; + count = 0; + p = items; + flags |= 0x8000; + if (params == NULL) { + tmpl = SIMPLE_MENU_DEFAULT_WINDOW_PARAMS; + flags |= 0x300000; + } else { + tmpl = *params; + tmpl.unk00 = (u32)UpdateSimpleMenu; + } + tmpl.unk0C = (u32)menu; + if (tmpl.width == 0) { + width = 0; + while (!IsEmptyString(p->field_0x0)) { + item_width = sub_020265A8(p->field_0x0); + if (item_width > width) { + width = item_width; + } + p++; + } + tmpl.width = sub_02031A5C(flags, cfg, width + 0x10); + } + p = items; + while (!IsEmptyString(p->field_0x0)) { + if (p->field_0x100 == target) { + sel = count; + } + p++; + count++; + } + if (n <= 0) { + n = count; + } + if (tmpl.height == 0) { + tmpl.height = CalcMenuHeightDiv8__02031AA4(flags, cfg, &count, &n); + } else { + CalcMenuHeightDiv8__02031AA4(flags, cfg, &count, &n); + } + if (flags & 0x200000) { + tmpl.x -= tmpl.width; + } + if (flags & 0x100000) { + tmpl.y -= tmpl.height; + } + menu->field_0x0 = (u32)UpdateSimpleMenu; + menu->field_0xFC = flags; + if (cfg != NULL) { + *(struct struct_2 *)&menu->field_0x100 = *cfg; + } + menu->field_0x100 = sel; + menu->field_0x198 = items; + menu->field_0x19C = 0; + menu->field_0x1A0 = 0; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = 0; + menu->field_0x1AC = 0; + menu->field_0x1B0 = 0; + tmpl.bg_id = 0; + window_id = NewWindowScreenCheck((s32)&tmpl, 3); + GetWindowRectangle(window_id, &rect); + InitWindowInput((void *)menu + 4, flags, + (struct struct_2 *)&menu->field_0x100, &rect, count, n); + return window_id; +} + +void ResumeSimpleMenu(s32 window_id) +{ + struct unk_0202AAA8 *menu = GetWindowContents(window_id); + + menu->field_0x19C = 1; + menu->field_0x1A0 = 0; + menu->field_0x1A1 = 0; + menu->field_0xFC &= ~0x800000; + sub_02032984((void *)menu + 4); +} void CloseSimpleMenu(s32 window_id) { diff --git a/src/main_0203D538.c b/src/main_0203D538.c index be3608eb..c54c75d9 100644 --- a/src/main_0203D538.c +++ b/src/main_0203D538.c @@ -69,10 +69,8 @@ struct unk_020AFE74 { extern struct unk_020AFE74 *MISSION_REWARD_STRUCT_MAIN_PTR; extern void MaybeGetColoredFormattedItemName(void*, struct item*, void*); -extern s8 CreateSimpleMenuFromStringIds(void*, s32, s32, void*, s32); extern void GetNameWithGender(char *dst, s16 monster_id, char color_id); extern void GetNameRaw(unsigned char *, s32); -extern s32 GetSimpleMenuResult__0202AEA4(s8); extern void InitPreprocessorArgs(struct preprocessor_args* args); extern bool8 IsMonsterIllegalForMissions(enum monster_id); extern void sub_02046BE8(s32 a, s32 b, struct preprocessor_args *c); @@ -108,8 +106,8 @@ extern void ov11_02310BDC(void); extern const u8 _0209C844[2]; extern const u16 _0209C846[4]; extern s32 _0209C850; -extern s32 _0209C85C; -extern s32 _0209C86C; +extern WindowTemplate _0209C85C; +extern struct unk_0202A5CC _0209C86C[]; extern s32 _0209C884; #ifdef JAPAN @@ -336,7 +334,7 @@ s32 sub_0203D538(void) break; case 16: if (sub_02046C78() != 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0 = CreateSimpleMenuFromStringIds(&_0209C85C, 0x300011, 0, &_0209C86C, 2); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0 = CreateSimpleMenuFromStringIds(&_0209C85C, 0x300011, 0, _0209C86C, 2); MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x11; } break; diff --git a/src/move_orb_effects.c b/src/move_orb_effects.c index 13c5ff4c..310ed1ab 100644 --- a/src/move_orb_effects.c +++ b/src/move_orb_effects.c @@ -14,6 +14,7 @@ #include "overlay_29_022E3F20.h" #include "overlay_29_0234B340.h" #include "dungeon_logic_2.h" +#include "dg_random.h" extern u8* AllocateTemp1024ByteBufferFromPool(void); extern void CopyStringFromId(u8* buf, u32 string_id); @@ -37,23 +38,30 @@ extern void PlaySpeedDownEffect(struct entity *entity); extern fx32_8 MultiplyByFixedPoint(fx32_8 x, fx32_8 mult_fp); extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 log_message); extern void TryActivateSteadfast(struct entity *attacker, struct entity *defender); -extern void TryActivateQuickFeet(struct entity *attacker ,struct entity *defender); extern s32 CalcStatusDuration(struct entity *entity, const s16 *turn_range, bool8 iq_skill_effects); extern struct preprocessor_args* GetMessageLogPreprocessorArgs(void); extern void SetPreprocessorArgsStringToName(struct preprocessor_args* preprocessor_args, s32 pos, struct monster* monster, u32 param_4, u8 name_type); extern int CalcSpeedStageWrapper(struct entity* entity); extern int CalcSpeedStage(struct entity *entity, s32 counter_weight); +extern void SetPreprocessorArgsIdVal(s32 pos, u32 val); +extern void ov29_022E543C(struct entity *entity); +extern void ov29_022E60E4(struct entity *entity); extern const s16 CRINGE_TURN_RANGE[]; extern const s16 PARALYSIS_TURN_RANGE[]; extern const s16 SPEED_LOWER_TURN_RANGE[]; extern const s16 SPEED_BOOST_TURN_RANGE[]; extern const u16 ov29_02353318[]; +extern const s16 ov10_022C4618; #ifdef JAPAN #define JPN_MSG_OFFSET -0x2C0 +#define MESSAGE_ED0 0xC12 +#define MESSAGE_ED1 0xC13 #else #define JPN_MSG_OFFSET 0 +#define MESSAGE_ED0 0xED0 +#define MESSAGE_ED1 0xED1 #endif // JAPAN void LowerOffensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 n_stages, bool8 check_is_protected_from_stat_drops, bool8 log_message_if_protected_from_stat_drops) @@ -793,4 +801,169 @@ void LowerSpeed(struct entity *user, struct entity *target, s32 n_stages, bool8 UpdateStatusIconFlags(target); } +bool8 TrySealMove(struct entity *user, struct entity *target, bool8 check_only) +{ + struct monster *entityInfo; + struct move *sealableMoves[MAX_MON_MOVES]; + s32 nSealable; + s32 i; + bool8 sealed = FALSE; + + if (target == NULL) + return FALSE; + + if (SafeguardIsActive(user, target, TRUE)) + return FALSE; + + if (IsProtectedFromNegativeStatus(user, target, TRUE)) + return FALSE; + + entityInfo = GetEntInfo(target); + nSealable = 0; + for (i = 0; i < MAX_MON_MOVES; i++) { + struct move *move = &entityInfo->moves.moves[i]; + if (MoveExists(move)) { + if (!(move->flags2 & MOVE_FLAG_SEALED)) { + sealableMoves[nSealable] = move; + nSealable++; + } + } + } + + if (check_only && nSealable == 0) + return FALSE; + + if (nSealable != 0) { + struct move *move; + + if (ExclusiveItemEffectIsActiveWithLogging(user, target, TRUE, 0xdbe + JPN_MSG_OFFSET, EXCLUSIVE_EFF_NO_MOVE_DISABLING)) + return FALSE; + + if (check_only) + return TRUE; + + move = sealableMoves[DungeonRandInt(nSealable)]; + move->flags2 |= MOVE_FLAG_SEALED; + SetPreprocessorArgsIdVal(0, move->id); + sealed = TRUE; + TryActivateQuickFeet(user, target); + } + + if (sealed) + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xde3 + JPN_MSG_OFFSET); + else + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xde4 + JPN_MSG_OFFSET); + + return TRUE; +} + +bool8 BoostOrLowerSpeed(struct entity *user, struct entity *target) +{ + if (!EntityIsValid__023118B4(target)) + return FALSE; + + if (DungeonRandOutcome__022EAB20(50)) + LowerSpeed(user, target, 1, TRUE); + else + BoostSpeed(user, target, 1, 0, TRUE); + + return TRUE; +} + +void ResetHitChanceStat(struct entity *user, struct entity *target, s32 stat_idx, s32 play_effect_anyway) +{ + struct monster *entityInfo; + bool8 changed = FALSE; + + if (!EntityIsValid__023118B4(target)) + return; + + entityInfo = GetEntInfo(target); + if (entityInfo->stat_modifiers.hit_chance_stages[stat_idx] != 10) { + entityInfo->stat_modifiers.hit_chance_stages[stat_idx] = 10; + changed = TRUE; + } + + if (changed) + ov29_022E543C(target); + else if (play_effect_anyway) + ov29_022E543C(target); + + SubstitutePlaceholderStringTags(0, target, 0); + if (changed) + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xd60 + JPN_MSG_OFFSET); + else + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xd61 + JPN_MSG_OFFSET); + + UpdateStatusIconFlags(target); +} + +bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id) +{ + struct item item; + + if (ExclusiveItemEffectIsActive__023147EC(target, effect_id)) { + if (should_log) { + SubstitutePlaceholderStringTags(0, target, 0); + GetExclusiveItemWithEffectFromBag(target, effect_id, &item); + PrepareItemForPrinting__02345728(1, &item); + LogMessageByIdWithPopupCheckUserTarget(user, target, message_id); + } + return TRUE; + } + + return FALSE; +} + +void LogMessageWithTargetAndExclusiveItemName(struct entity *user, struct entity *target, s32 message_id, enum exclusive_item_effect_id effect_id) +{ + struct item item; + + SubstitutePlaceholderStringTags(0, target, 0); + GetExclusiveItemWithEffectFromBag(target, effect_id, &item); + PrepareItemForPrinting__02345728(1, &item); + LogMessageByIdWithPopupCheckUserTarget(user, target, message_id); +} + +bool8 TryActivateQuickFeet(struct entity *user, struct entity *target) +{ + if (!AbilityIsActiveVeneer(target, ABILITY_QUICK_FEET)) + return FALSE; + + BoostSpeed(user, target, 1, 0, FALSE); + return TRUE; +} + +void TryInflictTerrifiedStatus(struct entity *user, struct entity *target) +{ + struct monster *entityInfo = GetEntInfo(target); + + entityInfo->terrified = 1; + entityInfo->terrified_turns = ov10_022C4618; + ov29_022E60E4(target); + SubstitutePlaceholderStringTags(0, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xde5 + JPN_MSG_OFFSET); +} + +bool8 TryInflictGrudgeStatus(struct entity *user, struct entity *target, bool8 log_message) +{ + bool8 inflicted = FALSE; + struct monster *entityInfo = GetEntInfo(target); + + SubstitutePlaceholderStringTags(1, target, 0); + if (entityInfo->grudge) { + if (log_message) + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_ED1); + } + else { + entityInfo->grudge = TRUE; + inflicted = TRUE; + UpdateStatusIconFlags(target); + if (log_message) + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_ED0); + } + + return inflicted; +} + // If Red's file boundaries are anything to go by, this file should end just before TryInflictConfusedStatus. diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index 7d42a34e..07214f94 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -100,7 +100,6 @@ extern void CreateMonsterSummaryFromTeamMember(struct monster_summary *monster_s extern s32 GetKeyboardStatus(); extern int PreprocessString(char* output, int output_size, const char* format, u16 flags, struct preprocessor_args* args); extern void ShowKeyboard(s32 mode, u8 *, s32, u8 *); -extern void sub_0202B030(s8); extern s32 sub_02037468(); extern void sub_0203909C(u8 *name); extern s32 sub_02039218(); @@ -190,17 +189,16 @@ extern s32 ov11_02322C88; extern s32 ov11_02322C98; extern s32 ov11_02322CA8; extern s32 ov11_02322CB8; -extern s32 ov11_02322CC8; +extern WindowTemplate ov11_02322CC8; extern struct unk_0202A5CC ov11_02322CD8[]; -extern s32 ov11_02322CF0; +extern struct unk_0202A5CC ov11_02322CF0[]; extern struct unk_0202A5CC ov11_02322D10[]; extern struct unk_0202A5CC ov11_02322D60[]; extern struct unk_0202A5CC ov11_02322D88[]; extern u8 ov11_02322DB0[]; -extern void CloseScrollBox(s8); extern void CloseTextBox2(s8);extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateSimpleMenuFromStringIds(void *, s32, s32, void *, s32); extern s8 CreateTextBox(void *, void *); +extern void CloseScrollBox(s8); extern void CloseTextBox2(s8);extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateTextBox(void *, void *); extern void GetPressedButtons(u32, u16 *); -extern s32 GetSimpleMenuResult__0202AEA4(s8); extern void InitPreprocessorArgs(struct preprocessor_args *); extern s32 IsScrollBoxActive(s8); extern void ShowDialogueBox(s8); extern void ShowStringIdInDialogueBox(s8, s32, s32, void *); extern void ov11_022DC504(void); extern u8 *strcpy(u8 *dest, const u8 *src); @@ -659,7 +657,8 @@ s32 ov11_02307334(void) } case 31: { ov11_02324D8C->field_0x1c.b = 1; - ov11_02324D8C->field_0xc = CreateSimpleMenuFromStringIds(&ov11_02322CC8, 0x33, (s32)&ov11_02324D8C->field_0x1c, &ov11_02322CF0, 3); + ov11_02324D8C->field_0xc = CreateSimpleMenuFromStringIds(&ov11_02322CC8, 0x33, &ov11_02324D8C->field_0x1c, + ov11_02322CF0, 3); ov11_02324D8C->field_0x0 = 0x20; break; } diff --git a/src/overlay_29_022E869C.c b/src/overlay_29_022E869C.c index 0bda856c..8ad87f88 100644 --- a/src/overlay_29_022E869C.c +++ b/src/overlay_29_022E869C.c @@ -1,4 +1,328 @@ #include "overlay_29_022E869C.h" +#include "main_02001188.h" +#include "main_020483B8.h" +#include "options.h" +#include "overlay_29_022DC684.h" +#include "overlay_29_022F7364.h" +#include "overlay_29_0233A218.h" + +extern struct unk_02353554 *TOP_SCREEN_STATUS_PTR; +extern struct dungeon *DUNGEON_PTR[]; +extern u32 DUNGEON_FRAMES_PASSED; + +extern void ov10_022C1E50(void *a); +extern void ov10_022C1E80(void *a, struct unk_022DC694 *b, s32 c, s32 d); +extern void ov10_022C21D8(void *a); +extern void ov10_022C2278(void *a); +extern void ov10_022C22A0(struct unk_022DC694 *p); + +extern void ov29_022E8CE8(void); +extern void ov29_022E8F78(u8 *a); +extern bool8 ov29_022E8FCC(void); +extern bool8 ov29_022E8FF8(void); +extern void ov29_022E9008(void); +extern void ov29_022E9014(u8 *a); +extern void ov29_02339138(void); +extern void ov29_02339D7C(s32 a, s32 b); +extern void ov29_0233A0E8(s32 a, s32 b); +extern void ov29_0233A1BC(s32 a); +extern u8 ov29_0234B4E0(void); + +extern s32 GetIdleAnimationId(struct entity *entity); +extern int GetPlayerGender(void); +extern void FreeTopScreen(void); +extern void DungeonChangeTopScreenType(s16 type); +extern bool8 InitDungeonControlsMenu(void); +extern bool8 FreeDungeonControlsMenu(void); +extern void sub_02048384(void); +extern void UpdateMinimap(void); + +void FreeTopScreenStatus(void) +{ + if (TOP_SCREEN_STATUS_PTR == NULL) { + return; + } + FreeTopScreen(); + MemFree(TOP_SCREEN_STATUS_PTR); + TOP_SCREEN_STATUS_PTR = NULL; +} + +void ov29_022E7F7C(void) +{ + TOP_SCREEN_STATUS_PTR->field_0x0 = 0; +} + +bool8 ov29_022E7F94(void) +{ + bool8 female; + + TOP_SCREEN_STATUS_PTR->field_0x228 = 0; + TOP_SCREEN_STATUS_PTR->field_0x0 = 1; + ov29_02339138(); + ov29_02339D7C(1, 1); + UpdateMinimap(); + SetMinimapDataE447(0); + TOP_SCREEN_STATUS_PTR->field_0x0 = 1; + SetMinimapDataE448(1); + ov29_022E8104(); + female = GetPlayerGender() == 2; + ov29_022DC738((s32) TOP_SCREEN_STATUS_PTR->field_0xb8, female); + return TRUE; +} + +bool8 ov29_022E8018(void) +{ + if (TOP_SCREEN_STATUS_PTR->field_0x228 != 0) { + ov29_022DC76C(); + ov29_022DC778(); + TOP_SCREEN_STATUS_PTR->field_0x228 = 0; + } + return TRUE; +} + +void ov29_022E8054(struct unk_022E8054 *a) +{ + if (a->field_0x10 == 0) { + return; + } + a->field_0x10 = 0; + if (GetTopScreenOption() != 3) { + TOP_SCREEN_STATUS_PTR->field_0x0 = 0; + return; + } + if (TOP_SCREEN_STATUS_PTR->field_0x0 != 0) { + return; + } + ov29_02339138(); + ov29_0233A0E8(0, 1); + ov29_02339D7C(1, 0); + TOP_SCREEN_STATUS_PTR->field_0x0 = 1; +} + +bool8 ov29_022E80D0(void) +{ + ov29_022DC77C(); + TOP_SCREEN_STATUS_PTR->field_0x0 = 0; + SetMinimapDataE448(0); + ov29_0233A1BC(1); + ov29_02339138(); + return TRUE; +} + +void ov29_022E8104(void) +{ + TOP_SCREEN_STATUS_PTR->field_0x228 = 0; + ov10_022C1E50(TOP_SCREEN_STATUS_PTR->field_0xb8); + ov29_022E8CE8(); +} + +bool8 InitializeTeamStats(void) +{ + bool8 female; + + TOP_SCREEN_STATUS_PTR->field_0x228 = 0; + TOP_SCREEN_STATUS_PTR->field_0x229 = 0; + ov29_022E8104(); + TOP_SCREEN_STATUS_PTR->field_0x24 = 1; + female = GetPlayerGender() == 2; + ov29_022DC694((s32) TOP_SCREEN_STATUS_PTR->field_0xb8, female); + return TRUE; +} + +bool8 UpdateTeamStatsWrapper(void) +{ + if (TOP_SCREEN_STATUS_PTR->field_0x228 != 0) { + ov29_022DC6D0(); + TOP_SCREEN_STATUS_PTR->field_0x228 = 0; + } + return TRUE; +} + +void ov29_022E81C8(struct unk_022E8054 *a) +{ + ov29_022DC6DC(); + if (a->field_0x10 != 0) { + a->field_0x10 = 0; + } +} + +bool8 FreeTeamStatsWrapper(void) +{ + ov29_022DC728(); + return TRUE; +} + +void ov29_022E81F8(void) +{ + if (!IsTeamStatsOnTopScreen()) { + ov29_022E8104(); + return; + } + if (GetTopScreenOption() == 1 && TOP_SCREEN_STATUS_PTR->field_0x8 != 1) { + DungeonChangeTopScreenType(1); + } + ov29_022E8CE8(); +} + +void ov29_022E8244(void) +{ + if (GetTopScreenOption() == 4 && TOP_SCREEN_STATUS_PTR->field_0x8 == 4) { + ov29_022E9008(); + } +} + +void DisplayTeamStatsSprite(struct entity *entity, s16 a, s16 b) +{ + s32 sprite; + s32 anim; + s16 c; + s16 d; + u8 e; + struct monster *monster; + + if (TOP_SCREEN_STATUS_PTR == NULL) { + return; + } + monster = entity->info; + anim = GetIdleAnimationId(entity); + c = 0; + d = 0; + e = 0; + sprite = (s16) entity->sprite_index; + if ((DUNGEON_PTR[0]->display_data.camera_target == entity + ? 0 : DUNGEON_PTR[0]->display_data.hallucinating) + || monster->curse_class_status.curse == 2) { + sprite = DungeonGetSpriteIndex(0x229); + } + if (monster->frozen_class_status.freeze != 1 && monster->frozen_class_status.freeze != 6) { + if (DUNGEON_PTR[0]->leader_running && ov29_0234B4E0() == 0) { + c += 2; + } + else if (entity->animation_group_id_mirror == 0 || entity->animation_group_id_mirror == 7) { + if (((struct monster *) entity->info)->speed_stage > 1) { + c += 1; + } + } + c += 1; + } + else { + c = 0; + } + if (monster->two_turn_move_invincible != 2 + && (monster->frozen_class_status.freeze == 6 || monster->burn_class_status.burn == 4 + || monster->frozen_class_status.freeze == 2)) { + d += DUNGEON_FRAMES_PASSED & 2; + } + if (monster->invisible_class_status.status == 1 + && DUNGEON_PTR[0]->display_data.can_see_traps == 0) { + e = 1; + } + if (anim == 0xff) { + return; + } + ov29_022DC6E8(sprite, monster->apparent_id, anim, monster->unique_id, 1, a, b, c, d, e); +} + +bool8 ov29_022E840C(void) +{ + struct unk_022DC694 s; + + if (TOP_SCREEN_STATUS_PTR->field_0x29 != 0) { + return FALSE; + } + ov10_022C22A0(&s); + ov10_022C1E80(TOP_SCREEN_STATUS_PTR->field_0x80, &s, 0, 1); + if (sub_02048400()) { + sub_02048384(); + } + TOP_SCREEN_STATUS_PTR->field_0x29 = 1; + return TRUE; +} + +void ov29_022E847C(struct unk_022E8054 *a) +{ + if (a->field_0x10 == 0) { + return; + } + a->field_0x10 = 0; + sub_020483B8(); + ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80); +} + +bool8 ov29_022E84B0(void) +{ + if (TOP_SCREEN_STATUS_PTR->field_0x29 == 0) { + return FALSE; + } + ov10_022C2278(TOP_SCREEN_STATUS_PTR->field_0x80); + if (sub_02048400()) { + sub_020483D8(); + } + TOP_SCREEN_STATUS_PTR->field_0x29 = 0; + return TRUE; +} + +bool8 InitDungeonControlsMenuWithBg(void) +{ + struct unk_022DC694 s; + + ov10_022C22A0(&s); + ov10_022C1E80(TOP_SCREEN_STATUS_PTR->field_0x80, &s, 0, 1); + ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80); + return InitDungeonControlsMenu(); +} + +void ov29_022E854C(struct unk_022E8054 *a) +{ + if (a->field_0x10 == 0) { + return; + } + ov29_022E8F78(&a->field_0x10); + ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80); + a->field_0x10 = 0; +} + +bool8 FreeDungeonControlsMenuWithBg(void) +{ + ov10_022C2278(TOP_SCREEN_STATUS_PTR->field_0x80); + return FreeDungeonControlsMenu(); +} + +bool8 ov29_022E85A8(void) +{ + struct unk_022DC694 s; + + ov10_022C22A0(&s); + ov10_022C1E80(TOP_SCREEN_STATUS_PTR->field_0x80, &s, 0, 1); + ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80); + return ov29_022E8FCC(); +} + +void ov29_022E85F4(struct unk_022E8054 *a) +{ + if (a->field_0x10 == 0) { + return; + } + ov29_022E9014(&a->field_0x10); + ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80); + a->field_0x10 = 0; +} + +bool8 ov29_022E8630(void) +{ + ov10_022C2278(TOP_SCREEN_STATUS_PTR->field_0x80); + return ov29_022E8FF8(); +} + +bool8 ov29_022E8650(void) +{ + struct unk_022DC694 s; + + ov10_022C22A0(&s); + ov10_022C1E80(TOP_SCREEN_STATUS_PTR->field_0x80, &s, 0, 1); + ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80); + return TRUE; +} bool8 ov29_022E869C(void) { diff --git a/src/overlay_29_0230558C.c b/src/overlay_29_0230558C.c index b7e8d553..f3b638e3 100644 --- a/src/overlay_29_0230558C.c +++ b/src/overlay_29_0230558C.c @@ -1,5 +1,53 @@ #include "overlay_29_0230558C.h" +#include "dg_uty.h" +#include "dungeon_capabilities.h" +#include "dungeon_items.h" +#include "dungeon_logic.h" +#include "dungeon_logic_7.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_util_1.h" +#include "dungeon_util_2.h" #include "dungeon_util_static.h" +#include "overlay_29_022E3F20.h" +#include "overlay_29_022EC7E8.h" +#include "overlay_29_022FFF28.h" +#include "overlay_29_02305C04.h" +#include "overlay_29_023061A8.h" +#include "overlay_29_02306728.h" +#include "overlay_29_0230F810.h" +#include "overlay_29_02336F4C.h" +#include "overlay_29_0234B104.h" +#include "overlay_29_0234B340.h" +#include "position_util.h" + +#ifdef JAPAN +#define JPN_MSG_OFFSET -0x2C0 +#else +#define JPN_MSG_OFFSET 0 +#endif + +extern struct dungeon *DUNGEON_PTR[]; +extern const u16 ov29_02353318[]; + +extern s32 GetIdleAnimationId(struct entity *entity); +extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); +extern void ov29_02337D68(struct position *pos); +extern struct trap *GetTrapInfo(struct entity *entity); +extern void TryTriggerTrap(struct entity *entity, struct position *pos, s32 a, s32 b); +extern void TryTriggerMonsterHouse(struct entity *entity, bool8 a); +extern void ov29_022E3A58(bool8 a); +extern bool8 ov29_022E2CA0(struct position *pos); +extern void ov29_022EA370(s32 a, s32 b); +extern void EndSleepClassStatus(struct entity *user, struct entity *target, bool8 a, bool8 b, bool8 c); +extern void EndFrozenClassStatus(struct entity *user, struct entity *target, bool8 log); +extern void EndCringeClassStatus(struct entity *user, struct entity *target); +extern void EndLeechSeedClassStatus(struct entity *user, struct entity *target); +extern void EndSureShotClassStatus(struct entity *user, struct entity *target); +extern void EndBlinkerClassStatus(struct entity *user, struct entity *target); +extern void EndMuzzledStatus(struct entity *user, struct entity *target); +extern void EndMiracleEyeStatus(struct entity *user, struct entity *target); +extern void ov29_022E543C(struct entity *entity); bool8 EntityIsValid__0230558C(struct entity *entity) { @@ -8,3 +56,223 @@ bool8 EntityIsValid__0230558C(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +void ov29_023055B0(s32 a) +{ + s32 i; + + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + struct entity *entity = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (EntityIsValid__0230558C(entity)) { + struct monster *monster = GetEntInfo(entity); + if (!monster->is_team_leader) { + if (IsTeamMemberOnFirstTurnInFixedRoom(monster)) + return; + + if (monster->target_pos.x != 0 || monster->target_pos.y != 0) { + if (monster->target_pos.x != entity->pos.x || + monster->target_pos.y != entity->pos.y) { + if (!CheckVariousStatuses2__02301244(entity, TRUE)) { + s32 direction = + GetDirectionTowardsPosition(&entity->pos, &monster->target_pos); + monster->action.direction = direction & DIRECTION_MASK; + ChangeMonsterAnimation(entity, GetIdleAnimationId(entity), direction); + } + } + } + } + } + } +} + +void CheckNonLeaderTile(struct entity *entity) +{ + struct monster *monster = GetEntInfo(entity); + struct tile *tile; + struct entity *object; + + if (!EntityIsValid__0230558C(entity)) + return; + + tile = GetTileAtEntity(entity); + if (IqSkillIsEnabled(entity, IQ_ABSOLUTE_MOVER) && + monster->invisible_class_status.status != STATUS_INVISIBLE_MOBILE) { + bool8 item_active; + if (AbilityIsActiveVeneer(entity, ABILITY_KLUTZ)) + item_active = FALSE; + else + item_active = HasHeldItem(entity, ITEM_MOBILE_SCARF); + + if (!item_active) + ov29_02337D68(&entity->pos); + } + + object = tile->object; + if (object == NULL) + return; + + switch (object->type) { + case ENTITY_NOTHING: + case ENTITY_MONSTER: + break; + case ENTITY_TRAP: { + struct trap *trap = GetTrapInfo(object); + bool8 trigger = FALSE; + bool8 revealed = FALSE; + + if (!monster->is_not_team_member && IqSkillIsEnabled(entity, IQ_TRAP_SEER) && + !object->is_visible) { + object->is_visible = TRUE; + UpdateTrapsVisibility(); + revealed = TRUE; + } + + if (trap->team == 0) { + if (object->is_visible && !monster->is_not_team_member) + trigger = TRUE; + } + else if (trap->team == 1) { + if (monster->is_not_team_member) + trigger = TRUE; + } + else if (trap->team == 2) { + if (!monster->is_not_team_member) + trigger = TRUE; + } + + if (trigger && !revealed) + TryTriggerTrap(entity, &entity->pos, FALSE, TRUE); + break; + } + case ENTITY_ITEM: + TryNonLeaderItemPickUp(entity); + break; + case ENTITY_HIDDEN_STAIRS: + case ENTITY_TEMPORARY: + break; + } +} + +void ov29_02305814(struct entity *entity, bool8 a) +{ + if (!EntityIsValid__0230558C(entity)) + return; + + if (GetEntInfo(entity)->is_not_team_member) + return; + + if (IsFloorOver() || DUNGEON_PTR[0]->monster_house_triggered) + return; + + if (!(GetTileAtEntity(entity)->terrain_flags & TERRAIN_TYPE_IN_MONSTER_HOUSE)) + return; + + LogMessageByIdWithPopupCheckUser(GetLeader(), 0xC82 + JPN_MSG_OFFSET); + DUNGEON_PTR[0]->monster_house_triggered_event = TRUE; + TryTriggerMonsterHouse(entity, a); + ov29_022E3A58(FALSE); + if (ov29_022E2CA0(&entity->pos)) + ov29_022EA370(0x78, 0x39); +} + +s32 EndNegativeStatusCondition(struct entity *user, struct entity *target, bool8 a, bool8 b, + bool8 c) +{ + struct monster *monster; + s32 result = FALSE; + s32 speed_stage; + s32 log_sealed = FALSE; + s32 i; + + if (!EntityIsValid__02305C04(target)) + return result; + + monster = GetEntInfo(target); + if (MonsterHasNegativeStatus(target, FALSE)) { + result = TRUE; + if (IsMonsterDrowsy(target)) + EndSleepClassStatus(user, target, FALSE, FALSE, TRUE); + + if (!EntityIsValid__02305C04(target)) + return FALSE; + + if (MonsterHasNonvolatileNonsleepStatus(target)) + EndBurnClassStatus(user, target); + + if (c) { + if (MonsterHasImmobilizingStatus(target)) + EndFrozenClassStatus(user, target, TRUE); + } + else if (MonsterHasImmobilizingStatus(target) && + monster->frozen_class_status.freeze != STATUS_FROZEN_WRAP) { + EndFrozenClassStatus(user, target, TRUE); + } + + if (MonsterHasAttackInterferingStatus(target)) + EndCringeClassStatus(user, target); + + if (MonsterHasSkillInterferingStatus(target)) + EndCurseClassStatus(user, target, 0, TRUE); + + if (MonsterHasLeechSeedStatus(target)) + EndLeechSeedClassStatus(user, target); + + if (MonsterHasWhifferStatus(target)) + EndSureShotClassStatus(user, target); + + if (IsMonsterVisuallyImpaired(target, FALSE)) + EndBlinkerClassStatus(user, target); + + if (IsMonsterMuzzled(target)) + EndMuzzledStatus(user, target); + + if (MonsterHasMiracleEyeStatus(target)) + EndMiracleEyeStatus(user, target); + + if (monster->perish_song_turns != 0) { + monster->perish_song_turns = 0; + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xC83 + JPN_MSG_OFFSET); + } + + if (monster->exposed) { + monster->exposed = FALSE; + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xC84 + JPN_MSG_OFFSET); + } + } + + speed_stage = CalcSpeedStageWrapper(target); + for (i = 0; i < NUM_SPEED_COUNTERS; i++) + monster->speed_down_counters[i] = 0; + + if (speed_stage != CalcSpeedStageWrapper(target)) { + result = TRUE; + SubstitutePlaceholderStringTags(0, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, + ov29_02353318[monster->speed_stage]); + } + + for (i = 0; i < MAX_MON_MOVES; i++) { + struct move *move = &monster->moves.moves[i]; + if (MoveExists(move)) { + if (move->flags2 & MOVE_FLAG_SEALED) { + result = TRUE; + log_sealed = TRUE; + move->flags2 &= ~MOVE_FLAG_SEALED; + } + } + } + + if (result) { + if (a) + ov29_022E543C(target); + + if (log_sealed) + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xC85 + JPN_MSG_OFFSET); + } + else if (!b) { + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xC86 + JPN_MSG_OFFSET); + } + + UpdateStatusIconFlags(target); + return result; +} diff --git a/src/overlay_29_02315118.c b/src/overlay_29_02315118.c index fb64ac0b..295acd91 100644 --- a/src/overlay_29_02315118.c +++ b/src/overlay_29_02315118.c @@ -2,6 +2,86 @@ #include "dungeon_items.h" #include "dungeon_pokemon_attributes.h" #include "dungeon_util_static.h" +#include "dungeon_logic_2.h" +#include "dungeon_util_2.h" +#include "move_orb_effects.h" +#include "overlay_29_022E3F20.h" +#include "overlay_29_022E41CC.h" +#include "overlay_29_0234B340.h" + +extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 log_message); +extern s32 CalcStatusDuration(struct entity *entity, const s16 *turn_range, bool8 iq_skill_effects); + +extern const s16 CONFUSED_TURN_RANGE[]; + +#ifdef JAPAN +#define MESSAGE_CFE 0xA3E +#define MESSAGE_CFF 0xA3F +#define MESSAGE_DA7 0xAE7 +#define MESSAGE_DAF 0xAEF +#define MESSAGE_DBA 0xAFA +#else +#define MESSAGE_CFE 0xCFE +#define MESSAGE_CFF 0xCFF +#define MESSAGE_DA7 0xDA7 +#define MESSAGE_DAF 0xDAF +#define MESSAGE_DBA 0xDBA +#endif + +bool8 TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 log_failure, bool8 check_only) +{ + struct monster *entityInfo; + bool8 ownTempo; + + if (!EntityIsValid__02315118(target)) + return FALSE; + + if (SafeguardIsActive(user, target, log_failure)) + return FALSE; + + if (IsProtectedFromNegativeStatus(user, target, log_failure)) + return FALSE; + + SubstitutePlaceholderStringTags(0, target, 0); + + if (ItemIsActive__0231513C(target, ITEM_PERSIM_BAND)) { + if (log_failure) + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_DAF); + return FALSE; + } + + if (ExclusiveItemEffectIsActiveWithLogging(user, target, log_failure, MESSAGE_DBA, EXCLUSIVE_EFF_NO_CONFUSION)) + return FALSE; + + if (user != target && (user == NULL ? FALSE : (bool8)(GetEntityType(user) == ENTITY_MONSTER)) && AbilityIsActiveVeneer(user, ABILITY_MOLD_BREAKER)) + ownTempo = FALSE; + else + ownTempo = AbilityIsActiveVeneer(target, ABILITY_OWN_TEMPO); + + if (ownTempo) { + if (log_failure) + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_DA7); + return FALSE; + } + + if (check_only) + return TRUE; + + ov29_022E41CC(target); + entityInfo = GetEntInfo(target); + if (entityInfo->cringe_class_status.cringe != STATUS_CRINGE_CONFUSED) { + entityInfo->cringe_class_status.cringe = STATUS_CRINGE_CONFUSED; + entityInfo->cringe_class_status.cringe_turns = CalcStatusDuration(target, CONFUSED_TURN_RANGE, TRUE) + 1; + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_CFE); + TryActivateQuickFeet(user, target); + } + else { + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_CFF); + } + + UpdateStatusIconFlags(target); + return TRUE; +} bool8 EntityIsValid__02315118(struct entity *entity) { diff --git a/src/overlay_29_0231CBC8.c b/src/overlay_29_0231CBC8.c index 282d1693..e3ad1ebd 100644 --- a/src/overlay_29_0231CBC8.c +++ b/src/overlay_29_0231CBC8.c @@ -1,4 +1,5 @@ #include "overlay_29_0231CBC8.h" +#include "overlay_29_02315118.h" #include "dungeon_util_static.h" #include "dungeon_capabilities_1.h" #include "dungeon_pokemon_attributes_1.h" @@ -43,7 +44,6 @@ extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s3 extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern void BoostIQ(struct entity *entity, s16 iq, bool8 a); extern void UpdateShopkeeperModeAfterAttack(struct entity *attacker, struct entity *defender); -extern void TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 a, bool8 b); extern void TryInflictInvisibleStatus(struct entity *user, struct entity *target); extern void TryInflictPetrifiedStatus(struct entity *user, struct entity *target); extern void TryInflictSleeplessStatus(struct entity *user, struct entity *target); diff --git a/src/overlay_29_023293E4.c b/src/overlay_29_023293E4.c index 396a1ed1..9ae9ae61 100644 --- a/src/overlay_29_023293E4.c +++ b/src/overlay_29_023293E4.c @@ -1,6 +1,6 @@ #include "overlay_29_023293E4.h" +#include "overlay_29_02315118.h" -extern void TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 displayMessage, bool8 onlyCheck); bool8 DoMoveConfuse(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id) { diff --git a/src/overlay_29_0232DD78.c b/src/overlay_29_0232DD78.c index df59eb83..f542bc34 100644 --- a/src/overlay_29_0232DD78.c +++ b/src/overlay_29_0232DD78.c @@ -1,8 +1,8 @@ #include "overlay_29_0232DD78.h" +#include "move_orb_effects.h" extern s32 DealDamage(struct entity *attacker, struct entity *defender, struct move *move, s32 damageMultiplier, enum item_id item_id); -extern void BoostOrLowerSpeed(struct entity *user, struct entity *target); bool8 DoMoveTrickRoom(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id) { diff --git a/src/spawn_2.c b/src/spawn_2.c index 25c3ab6c..8f9e970b 100644 --- a/src/spawn_2.c +++ b/src/spawn_2.c @@ -1,9 +1,15 @@ #include "dg_random.h" #include "dungeon.h" +#include "main_02001188.h" +#include "main_0200330C.h" +#include "overlay_29_022E869C.h" #include "overlay_29_022F73B4.h" #include "spawn_2.h" extern struct dungeon *DUNGEON_PTR[]; +extern struct unk_02353554 *TOP_SCREEN_STATUS_PTR; + +extern void ov29_022E8708(void); extern s32 GetMonsterIdFromSpawnEntry(struct monster_spawn_entry *); extern s32 GetMonsterLevelFromSpawnEntry(struct monster_spawn_entry *); @@ -58,3 +64,18 @@ s32 GetMonsterLevelToSpawn(s32 monster_id) { return 1; } + +void AllocTopScreenStatus(void) +{ + TOP_SCREEN_STATUS_PTR = MemAlloc(0x230, 0); + MemZero((u8 *) TOP_SCREEN_STATUS_PTR, 0x230); + TOP_SCREEN_STATUS_PTR->field_0x0 = 0; + TOP_SCREEN_STATUS_PTR->field_0x29 = 0; + TOP_SCREEN_STATUS_PTR->field_0x2c = 0; + TOP_SCREEN_STATUS_PTR->field_0x2b = 0; + TOP_SCREEN_STATUS_PTR->field_0x4 = 0; + TOP_SCREEN_STATUS_PTR->field_0x228 = 0; + ov29_022E8708(); + TOP_SCREEN_STATUS_PTR->field_0x4 = 2; + TOP_SCREEN_STATUS_PTR->field_0x229 = 0; +} From 637d196646a6354bfca9670ba9ff5a0c028a173b Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Mon, 14 Sep 2026 13:04:24 -0700 Subject: [PATCH 28/34] Decompile 86 more callees; clear three asm files, split a fourth asm/overlay_29_022E4BB4.s 26 functions cleared asm/overlay_29_0230D088.s 25 functions cleared asm/overlay_29_022EA008.s 13 functions cleared asm/main_02055894.s 22 of 23 split sub_020559D8 is at score 75 (0 structural rows, 11 register-colouring rows) and is NOT landed, so main_02055894.s splits: asm/main_020559D8.o holds that one function between src/main_02055770.o and src/main_02056294.o. Five struct ground_monster members are retyped, on load-width evidence from sub_02055E14: level, level_at_first_evo and level_at_second_evo are read ldrb though declared s8, and iq and max_hp are read ldrsh though declared u16. The reading validates itself -- id at 0x4 is read ldrsh and is already declared s16, and every member whose declaration is already correct reads exactly as declared. A cast at the read site cannot fix this: MWCC takes the load's width AND signedness from the declared member type alone. This deviates from pmdsky-debug's s8/u16, and it narrows ApplyGummiBoostsGroundMode's second parameter from u16 * to s16 * -- that function is still asm, so its prototype is now pinned by this reading rather than by its own body. struct dungeon's `u8 field_0x1c; u8 field_0x1d;` become one s16, forced by ldrsh/strlth at 0x1c. 0x1C is 4-aligned and 0x1E is already s16, so no padding appears and no offset moves. No other translation unit names either field. sub_0205B008's second parameter becomes struct ground_monster * instead of u32: it forwards the argument straight to sub_02055894, and both asm call sites load r1 with `ldr r1, [r0, #0x3c]`, a word out of a struct field. src/overlay_29_022E9FC0.c declares DUNGEON_PTR with a COMPLETE type, [2] rather than []. ov29_022EA008 scores 1025 under the incomplete form: it lets mwcc keep DUNGEON_PTR[0] live across a store the target reloads after. [] and [2] are compatible types, so no use site changes. struct unk_02353560 in that file grows from 5 to 0x10 bytes and struct unk_0237C850 is new; neither is named outside it. Twelve message ids in src/overlay_29_0230BBAC.c get an #ifdef JAPAN block. Every other region delta across the four files is a header-driven field displacement and needs nothing. Thirty-five pre-existing declarations across nineteen files are removed in favour of an include of the owning header, or corrected in place. Eleven of them disagreed with the definition: UnkMapRelatedFunc declared with an unsigned first parameter in four files where the switch dispatch is a signed range test, six declared with no prototype at all and the wrong return type, and one (sub_02055894) declared as taking a u32 where it takes a pointer. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds in all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_02055894.inc | 26 - asm/include/main_020559D8.inc | 2 + asm/include/overlay_29_022E4BB4.inc | 5 - asm/include/overlay_29_022EA008.inc | 36 -- asm/include/overlay_29_0230D088.inc | 37 -- asm/main_02055894.s | 794 -------------------------- asm/main_020559D8.s | 102 ++++ asm/overlay_29_022E4BB4.s | 825 --------------------------- asm/overlay_29_022EA008.s | 737 ------------------------ asm/overlay_29_0230D088.s | 845 ---------------------------- include/common.h | 10 +- include/dungeon.h | 3 +- include/main_02055770.h | 39 +- include/main_02056294.h | 21 + include/main_0205B008.h | 3 +- include/overlay_29_022E4B8C.h | 28 + include/overlay_29_022E9FC0.h | 15 + include/overlay_29_0230BBAC.h | 27 + main.lsf | 5 +- src/dungeon_recruitment.c | 1 - src/main_020114F8.c | 4 +- src/main_02055770.c | 70 +++ src/main_02056294.c | 276 +++++++++ src/main_0205B008.c | 3 +- src/overlay_11_02307334.c | 4 - src/overlay_29_022E4B8C.c | 244 ++++++++ src/overlay_29_022E9FC0.c | 419 +++++++++++++- src/overlay_29_022F0EDC.c | 3 - src/overlay_29_023000E4.c | 1 - src/overlay_29_02308FBC.c | 10 +- src/overlay_29_0230BBAC.c | 468 ++++++++++++++- src/overlay_29_02311010.c | 3 +- src/overlay_29_0231B194.c | 2 +- src/overlay_29_0231CBC8.c | 32 +- src/overlay_29_0231EDD8.c | 7 +- src/overlay_29_0232A04C.c | 12 +- src/overlay_29_0232CD90.c | 12 +- src/overlay_29_0234B104.c | 1 - src/overlay_29_0234BA54.c | 1 - src/overlay_31_02382820.c | 1 - 40 files changed, 1749 insertions(+), 3385 deletions(-) delete mode 100644 asm/include/main_02055894.inc create mode 100644 asm/include/main_020559D8.inc delete mode 100644 asm/include/overlay_29_022E4BB4.inc delete mode 100644 asm/include/overlay_29_022EA008.inc delete mode 100644 asm/include/overlay_29_0230D088.inc delete mode 100644 asm/main_02055894.s create mode 100644 asm/main_020559D8.s delete mode 100644 asm/overlay_29_022E4BB4.s delete mode 100644 asm/overlay_29_022EA008.s delete mode 100644 asm/overlay_29_0230D088.s diff --git a/asm/include/main_02055894.inc b/asm/include/main_02055894.inc deleted file mode 100644 index e63ab481..00000000 --- a/asm/include/main_02055894.inc +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once -.public _020A3350 -.public _022B5788 -.public Debug_Print0 -.public EnableAllLearnableIqSkills -.public GetBaseDefensiveStat -.public GetBaseHp -.public GetBaseOffensiveStat -.public GetItemMoveId16 -.public GetNameRaw -.public GetTeamMember -.public IsValidTeamMember -.public RecolorNameString -.public RecolorTeamMemberNameString -.public SetActiveTeam -.public SetPokemonJoined -.public StrcmpMonsterName -.public StrncpyName -.public StrncpySimple -.public sub_02052CF4 -.public sub_02053D1C -.public sub_02053F10 -.public sub_020564B0 -.public sub_02056554 -.public TEAM_MEMBER_TABLE_PTR -.public TryAddMonsterToActiveTeam diff --git a/asm/include/main_020559D8.inc b/asm/include/main_020559D8.inc new file mode 100644 index 00000000..6696f528 --- /dev/null +++ b/asm/include/main_020559D8.inc @@ -0,0 +1,2 @@ +#pragma once +.public TEAM_MEMBER_TABLE_PTR diff --git a/asm/include/overlay_29_022E4BB4.inc b/asm/include/overlay_29_022E4BB4.inc deleted file mode 100644 index 52f51bdd..00000000 --- a/asm/include/overlay_29_022E4BB4.inc +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -.public DUNGEON_PTR -.public GetEffectAnimationWanOffset -.public ov29_0230D618 -.public PlayEffectAnimationEntity diff --git a/asm/include/overlay_29_022EA008.inc b/asm/include/overlay_29_022EA008.inc deleted file mode 100644 index 56fb91ea..00000000 --- a/asm/include/overlay_29_022EA008.inc +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once -.public ChangeSimpleObjTexture -.public DUNGEON_BUTTON_INPUT -.public DUNGEON_FRAMES_PASSED -.public DUNGEON_PTR -.public DisplayMonstersAndItems -.public DisplayUi -.public FlashLeaderIcon -.public GetAlertBoxLoadingStatus -.public GetBottomScreenOption -.public GetTile -.public GetTopScreenOption -.public HandleTopScreenFades -.public InitWeirdMinimapMatrix -.public OBJ_GRAPHICS_CONTROLS_PTR -.public RenderWeather3D -.public UpdateCamera -.public UpdateMinimap -.public _s32_div_f -.public ov29_022DD8B4 -.public ov29_022DDEF8 -.public ov29_022DE11C -.public ov29_022DE134 -.public ov29_022DE638 -.public ov29_022E335C -.public ov29_022E8C10 -.public ov29_022ED800 -.public ov29_0230473C -.public ov29_02335F40 -.public ov29_02339FF4 -.public ov29_0233A248 -.public ov29_0234B1A4 -.public ov29_0234B854 -.public ov29_02353540 -.public ov29_02353560 -.public sub_02051E20 diff --git a/asm/include/overlay_29_0230D088.inc b/asm/include/overlay_29_0230D088.inc deleted file mode 100644 index d11911ac..00000000 --- a/asm/include/overlay_29_0230D088.inc +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public AdvanceFrame -.public ApplyDamageAndEffects -.public CalcTypeBasedDamageEffects -.public CreateTemporaryEntity -.public DUNGEON_PTR -.public DefenderAbilityIsActive__0230A940 -.public DungeonRandInt -.public EntityIsValid__02308FBC -.public FixedPoint64ToInt -.public GendersNotEqualNotGenderless -.public GenerateStandardItem -.public GetEquivItemIndex -.public GetItemAtIdx -.public GetTypeMatchup -.public IntToFixedPoint64 -.public IqSkillIsEnabled -.public IsMonster__0230A994 -.public LogMessageByIdWithPopupCheckUserTarget -.public MemZero -.public MonsterIsType -.public MultiplyByFixedPoint -.public MultiplyFixedPoint64 -.public POWER_PITCHER_DAMAGE_MULTIPLIER -.public PlayEffectAnimationEntity -.public PointCameraToMonster -.public ResetDamageData -.public RoundUpDiv256 -.public SetItemAcquired -.public SubstitutePlaceholderStringTags -.public TYPE_MATCHUP_COMBINATOR_TABLE -.public TerminateEffectWrapper -.public ov10_022BF964 -.public ov10_022C45B4 -.public ov29_02352894 -.public ov29_023535D4 diff --git a/asm/main_02055894.s b/asm/main_02055894.s deleted file mode 100644 index a5ccde4f..00000000 --- a/asm/main_02055894.s +++ /dev/null @@ -1,794 +0,0 @@ - .include "asm/macros.inc" - .include "main_02055894.inc" - - .text - - arm_func_start sub_02055894 -sub_02055894: ; 0x02055894 - ldr r1, _020558EC ; =TEAM_MEMBER_TABLE_PTR - mov r3, #0 - ldr r2, [r1] - ldr r1, _020558F0 ; =0x0000022B - b _020558DC -_020558A8: - cmp r2, r0 - bne _020558D4 - ldrb r0, [r2] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _020558E4 - mov r0, r3, lsl #0x10 - mov r0, r0, asr #0x10 - bx lr -_020558D4: - add r3, r3, #1 - add r2, r2, #0x44 -_020558DC: - cmp r3, r1 - blt _020558A8 -_020558E4: - mvn r0, #0 - bx lr - .align 2, 0 -_020558EC: .word TEAM_MEMBER_TABLE_PTR -_020558F0: .word 0x0000022B - arm_func_end sub_02055894 - - arm_func_start GetFirstMatchingMemberIdx -GetFirstMatchingMemberIdx: ; 0x020558F4 - stmdb sp!, {r4, lr} - ldr r1, _0205595C ; =TEAM_MEMBER_TABLE_PTR - mov r4, #5 - ldr r1, [r1] - mov r3, #0 - add lr, r1, #0x154 - mov ip, #1 - ldr r1, _02055960 ; =0x0000022B - b _0205594C -_02055918: - ldrb r2, [lr] - tst r2, #1 - movne r2, ip - moveq r2, r3 - tst r2, #0xff - beq _02055944 - ldrsh r2, [lr, #4] - cmp r2, r0 - moveq r0, r4, lsl #0x10 - moveq r0, r0, asr #0x10 - ldmeqia sp!, {r4, pc} -_02055944: - add r4, r4, #1 - add lr, lr, #0x44 -_0205594C: - cmp r4, r1 - blt _02055918 - mvn r0, #0 - ldmia sp!, {r4, pc} - .align 2, 0 -_0205595C: .word TEAM_MEMBER_TABLE_PTR -_02055960: .word 0x0000022B - arm_func_end GetFirstMatchingMemberIdx - - arm_func_start GetFirstEmptyMemberIdx -GetFirstEmptyMemberIdx: ; 0x02055964 - stmdb sp!, {r3, lr} - ldr r1, _020559CC ; =TEAM_MEMBER_TABLE_PTR - cmp r0, #0x214 - ldr r0, [r1] - ldreq lr, _020559D0 ; =0x0000022B - add r3, r0, #0x154 - ldrne r0, _020559D4 ; =_022B5788 - mov ip, #5 - ldrne lr, [r0] - mov r0, #0 - mov r1, #1 - b _020559BC -_02055994: - ldrb r2, [r3] - tst r2, #1 - movne r2, r1 - moveq r2, r0 - tst r2, #0xff - moveq r0, ip, lsl #0x10 - moveq r0, r0, asr #0x10 - ldmeqia sp!, {r3, pc} - add ip, ip, #1 - add r3, r3, #0x44 -_020559BC: - cmp ip, lr - blt _02055994 - mvn r0, #0 - ldmia sp!, {r3, pc} - .align 2, 0 -_020559CC: .word TEAM_MEMBER_TABLE_PTR -_020559D0: .word 0x0000022B -_020559D4: .word _022B5788 - arm_func_end GetFirstEmptyMemberIdx - - arm_func_start sub_020559D8 -sub_020559D8: ; 0x020559D8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - ldr r1, _02055B18 ; =TEAM_MEMBER_TABLE_PTR - mov r4, #0 - ldr lr, [r1] - mov r8, r0 - mov r2, r4 - mov r3, #1 - mvn r1, #0 -_020559F8: - ldrb r0, [lr] - add lr, lr, #0x44 - tst r0, #1 - movne r0, r3 - moveq r0, r2 - tst r0, #0xff - mov r0, r4, lsl #1 - strneh r4, [r8, r0] - add r4, r4, #1 - streqh r1, [r8, r0] - cmp r4, #5 - blt _020559F8 - mov r2, #0 - mov r3, #1 - ldr r0, _02055B1C ; =0x0000022B - b _02055B0C -_02055A38: - ldrb r1, [lr] - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - bne _02055AFC - mvn ip, #0 - mov r0, r4, lsl #1 - mov r7, lr - mov r6, r4 - strh ip, [r8, r0] - add lr, lr, #0x44 - add r4, r4, #1 - add sb, ip, #0x22c - b _02055AD4 -_02055A74: - ldrb r0, [lr] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _02055AC4 - mov r5, r7 - mov fp, lr - add r7, r7, #0x44 - mov sl, #4 -_02055A9C: - ldmia fp!, {r0, r1, r2, r3} - stmia r5!, {r0, r1, r2, r3} - subs sl, sl, #1 - bne _02055A9C - ldr r0, [fp] - str r0, [r5] - mov r0, r4, lsl #1 - strh r6, [r8, r0] - add r6, r6, #1 - b _02055ACC -_02055AC4: - mov r0, r4, lsl #1 - strh ip, [r8, r0] -_02055ACC: - add r4, r4, #1 - add lr, lr, #0x44 -_02055AD4: - cmp r4, sb - blt _02055A74 - mov r1, #0 - ldr r0, _02055B1C ; =0x0000022B - b _02055AF0 -_02055AE8: - strb r1, [r7], #0x44 - add r6, r6, #1 -_02055AF0: - cmp r6, r0 - blt _02055AE8 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_02055AFC: - mov r1, r4, lsl #1 - strh r4, [r8, r1] - add r4, r4, #1 - add lr, lr, #0x44 -_02055B0C: - cmp r4, r0 - blt _02055A38 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02055B18: .word TEAM_MEMBER_TABLE_PTR -_02055B1C: .word 0x0000022B - arm_func_end sub_020559D8 - - arm_func_start sub_02055B20 -sub_02055B20: ; 0x02055B20 - stmdb sp!, {r3, r4, r5, lr} - ldr r2, _02055B74 ; =TEAM_MEMBER_TABLE_PTR - mov r1, #0x44 - smulbb r4, r0, r1 - cmp r0, #5 - ldr r5, [r2] - movlt r0, #0 - ldmltia sp!, {r3, r4, r5, pc} - ldrb r1, [r5, r4] - tst r1, #1 - movne r1, #1 - moveq r1, #0 - tst r1, #0xff - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - bl sub_020564B0 - cmp r0, #0 - mov r0, #0 - streqb r0, [r5, r4] - moveq r0, #1 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02055B74: .word TEAM_MEMBER_TABLE_PTR - arm_func_end sub_02055B20 - - arm_func_start sub_02055B78 -sub_02055B78: ; 0x02055B78 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #0x58 - ldr r4, _02055CC4 ; =TEAM_MEMBER_TABLE_PTR - mov lr, #1 - mov r6, r1 - mov r7, r0 - mov ip, #0 - ldr r4, [r4] - mov r1, #0x44 - mov r0, r6 - mov r5, r3 - strb lr, [sp, #0x14] - strb r2, [sp, #0x16] - strb ip, [sp, #0x17] - strb lr, [sp, #0x15] - smlabb r4, r7, r1, r4 - bl GetBaseHp - strh r0, [sp, #0x1e] - mov r0, r6 - mov r1, #0 - bl GetBaseOffensiveStat - strb r0, [sp, #0x20] - mov r0, r6 - mov r1, #1 - bl GetBaseOffensiveStat - strb r0, [sp, #0x21] - mov r0, r6 - mov r1, #0 - bl GetBaseDefensiveStat - strb r0, [sp, #0x22] - mov r0, r6 - mov r1, #1 - bl GetBaseDefensiveStat - strb r0, [sp, #0x23] - mov r0, #0 - mov r2, #1 - strb r0, [sp, #0x1a] - strb r0, [sp, #0x1b] - add r0, sp, #0x28 - mov r1, r6 - strh r2, [sp, #0x1c] - bl EnableAllLearnableIqSkills - mov r2, #0 - add r0, sp, #0x36 - mov r1, r6 - strh r6, [sp, #0x18] - str r2, [sp, #0x24] - strb r2, [sp, #0x34] - bl sub_02053F10 - cmp r5, #0 - beq _02055C58 - add r0, sp, #0x4e - mov r1, r5 - mov r2, #0xa - bl StrncpySimple - b _02055C74 -_02055C58: - add r0, sp, #0 - mov r1, r6 - bl GetNameRaw - add r0, sp, #0x4e - add r1, sp, #0 - mov r2, #0xa - bl StrncpyName -_02055C74: - add r6, sp, #0x14 - mov r5, #4 -_02055C7C: - ldmia r6!, {r0, r1, r2, r3} - stmia r4!, {r0, r1, r2, r3} - subs r5, r5, #1 - bne _02055C7C - ldr r0, [r6] - cmp r7, #0 - str r0, [r4] - cmpne r7, #2 - mov r0, r7 - bne _02055CAC - bl TryAddMonsterToActiveTeam - b _02055CB0 -_02055CAC: - bl sub_02056554 -_02055CB0: - ldr r0, _02055CC8 ; =_020A3350 - mov r1, r7 - bl Debug_Print0 - add sp, sp, #0x58 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_02055CC4: .word TEAM_MEMBER_TABLE_PTR -_02055CC8: .word _020A3350 - arm_func_end sub_02055B78 - - arm_func_start sub_02055CCC -sub_02055CCC: ; 0x02055CCC - stmdb sp!, {r4, r5, r6, lr} - mov r5, r0 - ldrsh r0, [r5, #4] - bl GetFirstEmptyMemberIdx - mov r4, r0 - mvn r0, #0 - cmp r4, r0 - beq _02055D38 - ldr r1, _02055D40 ; =TEAM_MEMBER_TABLE_PTR - mov r0, #0x44 - ldr r1, [r1] - mov r6, r5 - smlabb lr, r4, r0, r1 - mov ip, #4 -_02055D04: - ldmia r6!, {r0, r1, r2, r3} - stmia lr!, {r0, r1, r2, r3} - subs ip, ip, #1 - bne _02055D04 - ldr r0, [r6] - str r0, [lr] - ldrsh r0, [r5, #4] - bl SetPokemonJoined - ldrsh r0, [r5, #4] - cmp r0, #0x214 - ldreq r1, _02055D44 ; =0x0000022B - ldreq r0, _02055D48 ; =_022B5788 - streq r1, [r0] -_02055D38: - mov r0, r4 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_02055D40: .word TEAM_MEMBER_TABLE_PTR -_02055D44: .word 0x0000022B -_02055D48: .word _022B5788 - arm_func_end sub_02055CCC - - arm_func_start sub_02055D4C -sub_02055D4C: ; 0x02055D4C - stmdb sp!, {r3, lr} - bl sub_02055CCC - mvn r1, #0 - cmp r0, r1 - moveq r0, #0 - ldmeqia sp!, {r3, pc} - ldr r2, _02055D78 ; =TEAM_MEMBER_TABLE_PTR - mov r1, #0x44 - ldr r2, [r2] - smlabb r0, r0, r1, r2 - ldmia sp!, {r3, pc} - .align 2, 0 -_02055D78: .word TEAM_MEMBER_TABLE_PTR - arm_func_end sub_02055D4C - - arm_func_start sub_02055D7C -sub_02055D7C: ; 0x02055D7C - stmdb sp!, {r3, r4, r5, lr} - mvn r2, #0 - mov r5, r1 - cmp r0, r2 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r2, _02055DCC ; =TEAM_MEMBER_TABLE_PTR - mov r1, #0x44 - ldr r2, [r2] - mov r4, r5 - smlabb lr, r0, r1, r2 - mov ip, #4 -_02055DA8: - ldmia r4!, {r0, r1, r2, r3} - stmia lr!, {r0, r1, r2, r3} - subs ip, ip, #1 - bne _02055DA8 - ldr r0, [r4] - str r0, [lr] - ldrsh r0, [r5, #4] - bl SetPokemonJoined - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02055DCC: .word TEAM_MEMBER_TABLE_PTR - arm_func_end sub_02055D7C - - arm_func_start sub_02055DD0 -sub_02055DD0: ; 0x02055DD0 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #0x4c - ldrb ip, [sp, #0x58] - mov r5, r0 - mov r4, r1 - mov lr, r2 - str r3, [sp] - add r0, sp, #8 - mov r1, r5 - mov r2, r4 - mov r3, lr - str ip, [sp, #4] - bl sub_02052CF4 - add r0, sp, #8 - bl sub_02055D4C - add sp, sp, #0x4c - ldmia sp!, {r4, r5, pc} - arm_func_end sub_02055DD0 - - arm_func_start sub_02055E14 -sub_02055E14: ; 0x02055E14 - stmdb sp!, {r4, r5, r6, lr} - mov r3, r1 - ldrb r1, [r3] - mov r4, r0 - add r0, r3, #0x14 - and r1, r1, #1 - strh r1, [r4] - ldrb r1, [r3, #1] - add r6, r4, #0x18 - add r5, r3, #0x22 - strb r1, [r4, #4] - ldrb r1, [r3, #2] - add lr, r4, #0x2a - mov ip, #0xc - strb r1, [r4, #5] - ldrb r1, [r3, #3] - strb r1, [r4, #6] - ldrsh r1, [r3, #4] - strh r1, [r4, #8] - ldrb r1, [r3, #6] - strb r1, [r4, #0xa] - ldrb r1, [r3, #7] - strb r1, [r4, #0xb] - ldrsh r1, [r3, #8] - strh r1, [r4, #0xc] - ldrsh r1, [r3, #0xa] - strh r1, [r4, #0xe] - ldrb r1, [r3, #0xc] - strb r1, [r4, #0x10] - ldrb r1, [r3, #0xd] - strb r1, [r4, #0x11] - ldrb r1, [r3, #0xe] - strb r1, [r4, #0x12] - ldrb r1, [r3, #0xf] - strb r1, [r4, #0x13] - ldmia r0, {r0, r1, r2} - stmia r6, {r0, r1, r2} - ldr r0, [r3, #0x10] - str r0, [r4, #0x14] - ldrb r0, [r3, #0x20] - strb r0, [r4, #0x24] -_02055EB8: - ldrh r0, [r5], #2 - subs ip, ip, #1 - strh r0, [lr], #2 - bne _02055EB8 - add r0, r4, #0x42 - add r1, r3, #0x3a - mov r2, #0xa - bl StrncpySimple - mov r2, #0 - mov r1, r2 -_02055EE0: - add r0, r4, r2 - add r2, r2, #1 - strb r1, [r0, #2] - cmp r2, #2 - blt _02055EE0 - strb r1, [r4, #0x25] - strh r1, [r4, #0x26] - strh r1, [r4, #0x28] - ldmia sp!, {r4, r5, r6, pc} - arm_func_end sub_02055E14 - - arm_func_start sub_02055F04 -sub_02055F04: ; 0x02055F04 - stmdb sp!, {r4, r5, r6, lr} - mov r3, r1 - ldrh r1, [r3] - mov ip, r0 - add r0, r3, #0x18 - and r1, r1, #1 - strb r1, [ip] - ldrb r1, [r3, #4] - add r6, ip, #0x14 - add r5, r3, #0x2a - strb r1, [ip, #1] - ldrb r1, [r3, #5] - add r4, ip, #0x22 - mov lr, #0xc - strb r1, [ip, #2] - ldrb r1, [r3, #6] - strb r1, [ip, #3] - ldrsh r1, [r3, #8] - strh r1, [ip, #4] - ldrb r1, [r3, #0xa] - strb r1, [ip, #6] - ldrb r1, [r3, #0xb] - strb r1, [ip, #7] - ldrsh r1, [r3, #0xc] - strh r1, [ip, #8] - ldrsh r1, [r3, #0xe] - strh r1, [ip, #0xa] - ldrb r1, [r3, #0x10] - strb r1, [ip, #0xc] - ldrb r1, [r3, #0x11] - strb r1, [ip, #0xd] - ldrb r1, [r3, #0x12] - strb r1, [ip, #0xe] - ldrb r1, [r3, #0x13] - strb r1, [ip, #0xf] - ldmia r0, {r0, r1, r2} - stmia r6, {r0, r1, r2} - ldr r0, [r3, #0x14] - str r0, [ip, #0x10] - ldrb r0, [r3, #0x24] - strb r0, [ip, #0x20] -_02055FA8: - ldrh r0, [r5], #2 - subs lr, lr, #1 - strh r0, [r4], #2 - bne _02055FA8 - add r0, ip, #0x3a - add r1, r3, #0x42 - mov r2, #0xa - bl StrncpySimple - ldmia sp!, {r4, r5, r6, pc} - arm_func_end sub_02055F04 - - arm_func_start sub_02055FCC -sub_02055FCC: ; 0x02055FCC - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - bl IsValidTeamMember - cmp r0, #0 - beq _02056068 - mov r0, r4 - bl GetItemMoveId16 - mov r4, r0 - mov r0, r5 - bl GetTeamMember - mov lr, #0 - mov r3, lr - mov ip, #1 - mov r2, #6 - b _02056040 -_0205600C: - smlabb r5, lr, r2, r0 - ldrb r1, [r5, #0x22] - tst r1, #1 - movne r1, ip - moveq r1, r3 - tst r1, #0xff - beq _02056034 - ldrh r1, [r5, #0x24] - cmp r4, r1 - beq _02056048 -_02056034: - add r1, lr, #1 - mov r1, r1, lsl #0x10 - mov lr, r1, asr #0x10 -_02056040: - cmp lr, #4 - blt _0205600C -_02056048: - cmp lr, #4 - blt _02056068 - ldrsh r1, [r0, #4] - mov r0, r4 - bl sub_02053D1C - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, pc} -_02056068: - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_02055FCC - - arm_func_start IsMonsterNotNicknamed -IsMonsterNotNicknamed: ; 0x02056070 - ldr ip, _02056080 ; =StrcmpMonsterName - ldrsh r1, [r0, #4] - add r0, r0, #0x3a - bx ip - .align 2, 0 -_02056080: .word StrcmpMonsterName - arm_func_end IsMonsterNotNicknamed - - arm_func_start GetRecoloredGroundMonsterName -GetRecoloredGroundMonsterName: ; 0x02056084 - ldr ip, _02056090 ; =RecolorNameString - add r1, r1, #0x3a - bx ip - .align 2, 0 -_02056090: .word RecolorNameString - arm_func_end GetRecoloredGroundMonsterName - - arm_func_start sub_02056094 -sub_02056094: ; 0x02056094 - ldr ip, _020560A0 ; =RecolorTeamMemberNameString - add r1, r1, #0x3a - bx ip - .align 2, 0 -_020560A0: .word RecolorTeamMemberNameString - arm_func_end sub_02056094 - - arm_func_start sub_020560A4 -sub_020560A4: ; 0x020560A4 - cmp r0, r1 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - bx lr - arm_func_end sub_020560A4 - - arm_func_start sub_020560B8 -sub_020560B8: ; 0x020560B8 - ldr ip, _020560C4 ; =SetActiveTeam - mov r0, #0 - bx ip - .align 2, 0 -_020560C4: .word SetActiveTeam - arm_func_end sub_020560B8 - - arm_func_start RemoveActiveMembersFromAllTeams -RemoveActiveMembersFromAllTeams: ; 0x020560C8 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov lr, #0 - ldr r7, _02056154 ; =TEAM_MEMBER_TABLE_PTR - mov r1, lr - mvn r0, #0 - mov r2, lr - mov r4, #0x68 - mov r6, #0x1a0 -_020560E8: - mul ip, lr, r6 - mov r3, r2 -_020560F0: - ldr r5, [r7] - add r5, ip, r5 - mla r5, r3, r4, r5 - add r5, r5, #0x9000 - strb r1, [r5, #0x36c] - ldr r5, [r7] - add r5, r5, lr, lsl #3 - add r5, r5, r3, lsl #1 - add r5, r5, #0x9800 - add r3, r3, #1 - strh r0, [r5, #0x56] - cmp r3, #4 - blt _020560F0 - ldr r3, [r7] - add r3, r3, lr, lsl #1 - add r3, r3, #0x9800 - strh r0, [r3, #0x50] - ldr r3, [r7] - add r3, r3, lr - add r3, r3, #0x9000 - add lr, lr, #1 - strb r1, [r3, #0x874] - cmp lr, #3 - blt _020560E8 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_02056154: .word TEAM_MEMBER_TABLE_PTR - arm_func_end RemoveActiveMembersFromAllTeams - - arm_func_start RemoveActiveMembersFromSpecialEpisodeTeam -RemoveActiveMembersFromSpecialEpisodeTeam: ; 0x02056158 - stmdb sp!, {r3, lr} - mov lr, #0 - ldr r3, _020561BC ; =TEAM_MEMBER_TABLE_PTR - mov r0, lr - mvn ip, #0 - mov r1, #0x68 -_02056170: - ldr r2, [r3] - mla r2, lr, r1, r2 - add r2, r2, #0x9000 - strb r0, [r2, #0x50c] - ldr r2, [r3] - add r2, r2, lr, lsl #1 - add r2, r2, #0x9800 - add lr, lr, #1 - strh ip, [r2, #0x5e] - cmp lr, #4 - blt _02056170 - ldr r2, _020561BC ; =TEAM_MEMBER_TABLE_PTR - ldr r1, [r2] - add r1, r1, #0x9800 - strh ip, [r1, #0x52] - ldr r1, [r2] - add r1, r1, #0x9000 - strb r0, [r1, #0x875] - ldmia sp!, {r3, pc} - .align 2, 0 -_020561BC: .word TEAM_MEMBER_TABLE_PTR - arm_func_end RemoveActiveMembersFromSpecialEpisodeTeam - - arm_func_start RemoveActiveMembersFromRescueTeam -RemoveActiveMembersFromRescueTeam: ; 0x020561C0 - stmdb sp!, {r3, lr} - mov lr, #0 - ldr r3, _02056224 ; =TEAM_MEMBER_TABLE_PTR - mov r0, lr - mvn ip, #0 - mov r1, #0x68 -_020561D8: - ldr r2, [r3] - mla r2, lr, r1, r2 - add r2, r2, #0x9000 - strb r0, [r2, #0x6ac] - ldr r2, [r3] - add r2, r2, lr, lsl #1 - add r2, r2, #0x9800 - add lr, lr, #1 - strh ip, [r2, #0x66] - cmp lr, #4 - blt _020561D8 - ldr r2, _02056224 ; =TEAM_MEMBER_TABLE_PTR - ldr r1, [r2] - add r1, r1, #0x9800 - strh ip, [r1, #0x54] - ldr r1, [r2] - add r1, r1, #0x9000 - strb r0, [r1, #0x876] - ldmia sp!, {r3, pc} - .align 2, 0 -_02056224: .word TEAM_MEMBER_TABLE_PTR - arm_func_end RemoveActiveMembersFromRescueTeam - - arm_func_start sub_02056228 -sub_02056228: ; 0x02056228 - ldr r1, _0205625C ; =0x000055AA - cmp r0, r1 - moveq r0, #1 - bxeq lr - ldr r1, _02056260 ; =0x00005AA5 - cmp r0, r1 - moveq r0, #1 - bxeq lr - cmp r0, #0 - movlt r0, #1 - movge r0, #0 - and r0, r0, #0xff - bx lr - .align 2, 0 -_0205625C: .word 0x000055AA -_02056260: .word 0x00005AA5 - arm_func_end sub_02056228 - - arm_func_start CheckTeamMemberIdx -CheckTeamMemberIdx: ; 0x02056264 - ldr r1, _0205628C ; =0x000055AA - cmp r0, r1 - moveq r0, #1 - bxeq lr - ldr r1, _02056290 ; =0x00005AA5 - cmp r0, r1 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - bx lr - .align 2, 0 -_0205628C: .word 0x000055AA -_02056290: .word 0x00005AA5 - arm_func_end CheckTeamMemberIdx diff --git a/asm/main_020559D8.s b/asm/main_020559D8.s new file mode 100644 index 00000000..b6e5250b --- /dev/null +++ b/asm/main_020559D8.s @@ -0,0 +1,102 @@ + .include "asm/macros.inc" + .include "main_020559D8.inc" + + .text + + arm_func_start sub_020559D8 +sub_020559D8: ; 0x020559D8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r1, _02055B18 ; =TEAM_MEMBER_TABLE_PTR + mov r4, #0 + ldr lr, [r1] + mov r8, r0 + mov r2, r4 + mov r3, #1 + mvn r1, #0 +_020559F8: + ldrb r0, [lr] + add lr, lr, #0x44 + tst r0, #1 + movne r0, r3 + moveq r0, r2 + tst r0, #0xff + mov r0, r4, lsl #1 + strneh r4, [r8, r0] + add r4, r4, #1 + streqh r1, [r8, r0] + cmp r4, #5 + blt _020559F8 + mov r2, #0 + mov r3, #1 + ldr r0, _02055B1C ; =0x0000022B + b _02055B0C +_02055A38: + ldrb r1, [lr] + tst r1, #1 + movne r1, r3 + moveq r1, r2 + tst r1, #0xff + bne _02055AFC + mvn ip, #0 + mov r0, r4, lsl #1 + mov r7, lr + mov r6, r4 + strh ip, [r8, r0] + add lr, lr, #0x44 + add r4, r4, #1 + add sb, ip, #0x22c + b _02055AD4 +_02055A74: + ldrb r0, [lr] + tst r0, #1 + movne r0, #1 + moveq r0, #0 + tst r0, #0xff + beq _02055AC4 + mov r5, r7 + mov fp, lr + add r7, r7, #0x44 + mov sl, #4 +_02055A9C: + ldmia fp!, {r0, r1, r2, r3} + stmia r5!, {r0, r1, r2, r3} + subs sl, sl, #1 + bne _02055A9C + ldr r0, [fp] + str r0, [r5] + mov r0, r4, lsl #1 + strh r6, [r8, r0] + add r6, r6, #1 + b _02055ACC +_02055AC4: + mov r0, r4, lsl #1 + strh ip, [r8, r0] +_02055ACC: + add r4, r4, #1 + add lr, lr, #0x44 +_02055AD4: + cmp r4, sb + blt _02055A74 + mov r1, #0 + ldr r0, _02055B1C ; =0x0000022B + b _02055AF0 +_02055AE8: + strb r1, [r7], #0x44 + add r6, r6, #1 +_02055AF0: + cmp r6, r0 + blt _02055AE8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_02055AFC: + mov r1, r4, lsl #1 + strh r4, [r8, r1] + add r4, r4, #1 + add lr, lr, #0x44 +_02055B0C: + cmp r4, r0 + blt _02055A38 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_02055B18: .word TEAM_MEMBER_TABLE_PTR +_02055B1C: .word 0x0000022B + arm_func_end sub_020559D8 diff --git a/asm/overlay_29_022E4BB4.s b/asm/overlay_29_022E4BB4.s deleted file mode 100644 index d23e2d50..00000000 --- a/asm/overlay_29_022E4BB4.s +++ /dev/null @@ -1,825 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022E4BB4.inc" - - .text - - arm_func_start ov29_022E4BB4 -ov29_022E4BB4: ; 0x022E4BB4 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - mov r0, #0x15 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x15 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end ov29_022E4BB4 - - arm_func_start PlayAttractHitEffect -PlayAttractHitEffect: ; 0x022E4C00 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - mov r0, #0xf - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0xf - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end PlayAttractHitEffect - - arm_func_start ov29_022E4C4C -ov29_022E4C4C: ; 0x022E4C4C - stmdb sp!, {r3, lr} - sub sp, sp, #0x10 - mov r1, #2 - mov ip, #0 - stmia sp, {r1, ip} - sub r1, ip, #1 - str r1, [sp, #8] - mov r1, #0x15 - mov r2, #1 - mov r3, #3 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r3, pc} - arm_func_end ov29_022E4C4C - - arm_func_start ov29_022E4C84 -ov29_022E4C84: ; 0x022E4C84 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E4CD0 ; =0x000001F7 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E4CD0 ; =0x000001F7 - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E4CD0: .word 0x000001F7 - arm_func_end ov29_022E4C84 - - arm_func_start ov29_022E4CD4 -ov29_022E4CD4: ; 0x022E4CD4 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E4D20 ; =0x000001F9 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E4D20 ; =0x000001F9 - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E4D20: .word 0x000001F9 - arm_func_end ov29_022E4CD4 - - arm_func_start ov29_022E4D24 -ov29_022E4D24: ; 0x022E4D24 - bx lr - arm_func_end ov29_022E4D24 - - arm_func_start PlayOffensiveStatDownEffect -PlayOffensiveStatDownEffect: ; 0x022E4D28 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - ldr r1, [sp, #0x1c] - mov r4, r0 - cmp r1, #0 - bne _022E4D80 - mov r0, #0x194 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x194 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - b _022E4DB8 -_022E4D80: - ldr r0, _022E4DC8 ; =0x00000193 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E4DC8 ; =0x00000193 - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity -_022E4DB8: - add sp, sp, #0x10 - ldmia sp!, {r4, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -_022E4DC8: .word 0x00000193 - arm_func_end PlayOffensiveStatDownEffect - - arm_func_start PlayDefensiveStatDownEffect -PlayDefensiveStatDownEffect: ; 0x022E4DCC - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - ldr r1, [sp, #0x1c] - mov r4, r0 - cmp r1, #0 - bne _022E4E24 - ldr r0, _022E4E6C ; =0x0000018F - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E4E6C ; =0x0000018F - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - b _022E4E5C -_022E4E24: - ldr r0, _022E4E70 ; =0x00000191 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E4E70 ; =0x00000191 - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity -_022E4E5C: - add sp, sp, #0x10 - ldmia sp!, {r4, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -_022E4E6C: .word 0x0000018F -_022E4E70: .word 0x00000191 - arm_func_end PlayDefensiveStatDownEffect - - arm_func_start PlayOffensiveStatUpEffect -PlayOffensiveStatUpEffect: ; 0x022E4E74 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - ldr r1, [sp, #0x1c] - mov r4, r0 - cmp r1, #0 - bne _022E4ECC - ldr r0, _022E4F14 ; =0x000001A9 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E4F14 ; =0x000001A9 - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - b _022E4F04 -_022E4ECC: - ldr r0, _022E4F18 ; =0x00000192 - bl GetEffectAnimationWanOffset - mov r2, r0 - mov ip, #0 - mov r1, #2 - stmia sp, {r1, ip} - sub r0, ip, #1 - str r0, [sp, #8] - and r3, r2, #0xff - mov r0, r4 - add r1, r1, #0x190 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity -_022E4F04: - add sp, sp, #0x10 - ldmia sp!, {r4, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -_022E4F14: .word 0x000001A9 -_022E4F18: .word 0x00000192 - arm_func_end PlayOffensiveStatUpEffect - - arm_func_start PlayDefensiveStatUpEffect -PlayDefensiveStatUpEffect: ; 0x022E4F1C - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - ldr r1, [sp, #0x1c] - mov r4, r0 - cmp r1, #0 - bne _022E4F74 - ldr r0, _022E4FBC ; =0x0000018E - bl GetEffectAnimationWanOffset - mov r2, r0 - mov ip, #0 - mov r1, #2 - stmia sp, {r1, ip} - sub r0, ip, #1 - str r0, [sp, #8] - and r3, r2, #0xff - mov r0, r4 - add r1, r1, #0x18c - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - b _022E4FAC -_022E4F74: - mov r0, #0x190 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x190 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity -_022E4FAC: - add sp, sp, #0x10 - ldmia sp!, {r4, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -_022E4FBC: .word 0x0000018E - arm_func_end PlayDefensiveStatUpEffect - - arm_func_start PlayOffensiveStatMultiplierUpEffect -PlayOffensiveStatMultiplierUpEffect: ; 0x022E4FC0 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - ldr r1, [sp, #0x1c] - mov r4, r0 - cmp r1, #0 - bne _022E5018 - ldr r0, _022E5060 ; =0x000001A9 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E5060 ; =0x000001A9 - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - b _022E5050 -_022E5018: - ldr r0, _022E5064 ; =0x00000192 - bl GetEffectAnimationWanOffset - mov r2, r0 - mov ip, #0 - mov r1, #2 - stmia sp, {r1, ip} - sub r0, ip, #1 - str r0, [sp, #8] - and r3, r2, #0xff - mov r0, r4 - add r1, r1, #0x190 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity -_022E5050: - add sp, sp, #0x10 - ldmia sp!, {r4, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -_022E5060: .word 0x000001A9 -_022E5064: .word 0x00000192 - arm_func_end PlayOffensiveStatMultiplierUpEffect - - arm_func_start PlayOffensiveStatMultiplierDownEffect -PlayOffensiveStatMultiplierDownEffect: ; 0x022E5068 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - ldr r1, [sp, #0x1c] - mov r4, r0 - cmp r1, #0 - bne _022E50C0 - mov r0, #0x194 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x194 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - b _022E50F8 -_022E50C0: - ldr r0, _022E5108 ; =0x00000193 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E5108 ; =0x00000193 - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity -_022E50F8: - add sp, sp, #0x10 - ldmia sp!, {r4, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -_022E5108: .word 0x00000193 - arm_func_end PlayOffensiveStatMultiplierDownEffect - - arm_func_start PlayDefensiveStatMultiplierUpEffect -PlayDefensiveStatMultiplierUpEffect: ; 0x022E510C - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - ldr r1, [sp, #0x1c] - mov r4, r0 - cmp r1, #0 - bne _022E5164 - ldr r0, _022E51AC ; =0x0000018E - bl GetEffectAnimationWanOffset - mov r2, r0 - mov ip, #0 - mov r1, #2 - stmia sp, {r1, ip} - sub r0, ip, #1 - str r0, [sp, #8] - and r3, r2, #0xff - mov r0, r4 - add r1, r1, #0x18c - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - b _022E519C -_022E5164: - mov r0, #0x190 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x190 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity -_022E519C: - add sp, sp, #0x10 - ldmia sp!, {r4, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -_022E51AC: .word 0x0000018E - arm_func_end PlayDefensiveStatMultiplierUpEffect - - arm_func_start PlayDefensiveStatMultiplierDownEffect -PlayDefensiveStatMultiplierDownEffect: ; 0x022E51B0 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - ldr r1, [sp, #0x1c] - mov r4, r0 - cmp r1, #0 - bne _022E5208 - ldr r0, _022E5250 ; =0x0000018F - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E5250 ; =0x0000018F - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - b _022E5240 -_022E5208: - ldr r0, _022E5254 ; =0x00000191 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E5254 ; =0x00000191 - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity -_022E5240: - add sp, sp, #0x10 - ldmia sp!, {r4, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -_022E5250: .word 0x0000018F -_022E5254: .word 0x00000191 - arm_func_end PlayDefensiveStatMultiplierDownEffect - - arm_func_start PlayHitChanceUpEffect -PlayHitChanceUpEffect: ; 0x022E5258 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - ldr r1, [sp, #0x1c] - mov r4, r0 - cmp r1, #0 - bne _022E52B0 - mov r0, #0x18c - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x18c - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - b _022E52E8 -_022E52B0: - mov r0, #0xd - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0xd - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity -_022E52E8: - add sp, sp, #0x10 - ldmia sp!, {r4, lr} - add sp, sp, #0x10 - bx lr - arm_func_end PlayHitChanceUpEffect - - arm_func_start PlayHitChanceDownEffect -PlayHitChanceDownEffect: ; 0x022E52F8 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - ldr r1, [sp, #0x1c] - mov r4, r0 - cmp r1, #0 - bne _022E5350 - ldr r0, _022E5398 ; =0x0000018D - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E5398 ; =0x0000018D - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - b _022E5388 -_022E5350: - mov r0, #0xe - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0xe - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity -_022E5388: - add sp, sp, #0x10 - ldmia sp!, {r4, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -_022E5398: .word 0x0000018D - arm_func_end PlayHitChanceDownEffect - - arm_func_start PlayExclamationPointEffect__022E5D4C -PlayExclamationPointEffect__022E5D4C: ; 0x022E539C - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E53E8 ; =0x00000143 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E53E8 ; =0x00000143 - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E53E8: .word 0x00000143 - arm_func_end PlayExclamationPointEffect__022E5D4C - - arm_func_start ov29_022E53EC -ov29_022E53EC: ; 0x022E53EC - bx lr - arm_func_end ov29_022E53EC - - arm_func_start ov29_022E53F0 -ov29_022E53F0: ; 0x022E53F0 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - mov r0, #0x19 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x19 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end ov29_022E53F0 - - arm_func_start ov29_022E543C -ov29_022E543C: ; 0x022E543C - stmdb sp!, {r3, lr} - sub sp, sp, #0x10 - mov r1, #2 - mov ip, #0 - stmia sp, {r1, ip} - sub r1, ip, #1 - str r1, [sp, #8] - mov r1, #0x15 - mov r2, #1 - mov r3, #3 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r3, pc} - arm_func_end ov29_022E543C - - arm_func_start ov29_022E5474 -ov29_022E5474: ; 0x022E5474 - bx lr - arm_func_end ov29_022E5474 - - arm_func_start ov29_022E5478 -ov29_022E5478: ; 0x022E5478 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - ldr r2, _022E5508 ; =DUNGEON_PTR - mov r4, r0 - ldr r2, [r2] - ldr r0, [r1, #8] - ldrb r1, [r2, #0x1c5] - cmp r1, #0 - beq _022E54A0 - bl ov29_0230D618 -_022E54A0: - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _022E54BC -_022E54AC: ; jump table - b _022E54BC ; case 0 - b _022E54C4 ; case 1 - b _022E54CC ; case 2 - b _022E54D4 ; case 3 -_022E54BC: - mov r1, #8 - b _022E54D8 -_022E54C4: - mov r1, #9 - b _022E54D8 -_022E54CC: - mov r1, #0xa - b _022E54D8 -_022E54D4: - mov r1, #0xb -_022E54D8: - mov ip, #0 - mov r2, #1 - str ip, [sp] - str r2, [sp, #4] - sub r0, r2, #2 - str r0, [sp, #8] - mov r0, r4 - mov r3, #3 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E5508: .word DUNGEON_PTR - arm_func_end ov29_022E5478 - - arm_func_start ov29_022E550C -ov29_022E550C: ; 0x022E550C - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E5558 ; =0x0000013E - bl GetEffectAnimationWanOffset - mov r2, r0 - mov ip, #0 - mov r1, #2 - stmia sp, {r1, ip} - sub r0, ip, #1 - str r0, [sp, #8] - and r3, r2, #0xff - mov r0, r4 - add r1, r1, #0x13c - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E5558: .word 0x0000013E - arm_func_end ov29_022E550C - - arm_func_start ov29_022E555C -ov29_022E555C: ; 0x022E555C - bx lr - arm_func_end ov29_022E555C - - arm_func_start ov29_022E5560 -ov29_022E5560: ; 0x022E5560 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r1 - cmp r2, #1 - bne _022E55B0 - mov r0, #0xf8 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0xf8 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - b _022E55E8 -_022E55B0: - mov r0, #0xf9 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0xf9 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity -_022E55E8: - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end ov29_022E5560 - - arm_func_start ov29_022E55F0 -ov29_022E55F0: ; 0x022E55F0 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r0, #0x2a - mov r4, r1 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x2a - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end ov29_022E55F0 diff --git a/asm/overlay_29_022EA008.s b/asm/overlay_29_022EA008.s deleted file mode 100644 index c73338d0..00000000 --- a/asm/overlay_29_022EA008.s +++ /dev/null @@ -1,737 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022EA008.inc" - - .text - - 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_0230D088.s b/asm/overlay_29_0230D088.s deleted file mode 100644 index e498351d..00000000 --- a/asm/overlay_29_0230D088.s +++ /dev/null @@ -1,845 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0230D088.inc" - - .text - - arm_func_start ov29_0230D088 -ov29_0230D088: ; 0x0230D088 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #0x1c - ldr r5, [sp, #0x2c] - ldr r4, [sp, #0x28] - mov lr, r0 - strb r2, [r5, #0xc] - cmp r4, #1 - strb r3, [r5, #0xd] - mov ip, r1 - str r2, [sp] - mov r2, ip - ldr r0, _0230D118 ; =0x000003E7 - movlt r4, #1 - cmp r4, r0 - movgt r4, r0 - add r0, sp, #0x14 - mov r1, lr - mov r3, r4 - str r5, [sp, #4] - mov ip, #0 - str ip, [sp, #8] - bl CalcTypeBasedDamageEffects - add r0, sp, #0xc - mov r1, r4 - bl IntToFixedPoint64 - add r0, sp, #0xc - add r2, sp, #0x14 - mov r1, r0 - bl MultiplyFixedPoint64 - add r0, sp, #0xc - bl FixedPoint64ToInt - str r0, [r5] - mov r0, #0 - str r0, [r5, #4] - add sp, sp, #0x1c - ldmia sp!, {r4, r5, pc} - .align 2, 0 -_0230D118: .word 0x000003E7 - arm_func_end ov29_0230D088 - - arm_func_start ApplyDamageAndEffectsWrapper -ApplyDamageAndEffectsWrapper: ; 0x0230D11C - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #0xdc - mov r7, r0 - add r0, sp, #0x10 - mov r6, r1 - mov r5, r2 - mov r4, r3 - bl ResetDamageData - add r0, sp, #0x24 - bl CreateTemporaryEntity - mov r3, #0 - mov r0, #2 - str r0, [sp, #0x18] - str r6, [sp, #0x10] - str r5, [sp, #0x14] - strb r3, [sp, #0x1c] - strb r3, [sp, #0x1e] - strb r3, [sp, #0x1f] - strb r3, [sp, #0x20] - stmia sp, {r3, r4} - str r3, [sp, #8] - mov r1, r7 - add r0, sp, #0x24 - add r2, sp, #0x10 - str r3, [sp, #0xc] - bl ApplyDamageAndEffects - add sp, sp, #0xdc - ldmia sp!, {r4, r5, r6, r7, pc} - arm_func_end ApplyDamageAndEffectsWrapper - - arm_func_start CalcRecoilDamageFixed -CalcRecoilDamageFixed: ; 0x0230D18C - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #0x1c - mov r7, r0 - mov r6, r1 - mov r5, r2 - mov r4, r3 - bl EntityIsValid__02308FBC - cmp r0, #0 - beq _0230D238 - ldr r0, [r7] - cmp r0, #1 - bne _0230D1F0 - ldr r0, [r7, #0xb4] - ldrsh r0, [r0, #0x10] - cmp r0, #0 - beq _0230D238 - mov r0, r7 - mov r1, #0x5c - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230D1F0 - mov r0, r6, lsl #8 - mov r1, #0x180 - bl MultiplyByFixedPoint - mov r6, r0, asr #8 -_0230D1F0: - ldrb r1, [sp, #0x34] - str r4, [sp] - ldrsh r0, [sp, #0x38] - str r1, [sp, #4] - mov r1, #3 - str r1, [sp, #8] - ldr r1, [sp, #0x3c] - str r0, [sp, #0xc] - ldr r0, [sp, #0x40] - str r1, [sp, #0x10] - ldr r4, [sp, #0x44] - str r0, [sp, #0x14] - mov r0, r7 - mov r1, r7 - mov r2, r6 - mov r3, r5 - str r4, [sp, #0x18] - bl CalcDamageFixed -_0230D238: - add sp, sp, #0x1c - ldmia sp!, {r4, r5, r6, r7, pc} - arm_func_end CalcRecoilDamageFixed - - arm_func_start CalcDamageFixed -CalcDamageFixed: ; 0x0230D240 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #0x2c - mov sl, r0 - add r0, sp, #0x18 - mov sb, r1 - mov r8, r2 - mov r7, r3 - ldr r6, [sp, #0x54] - bl ResetDamageData - mov r5, #0 - ldrb r0, [sp, #0x58] - ldr r1, [sp, #0x60] - mov r2, #2 - str r2, [sp, #0x20] - str r1, [sp, #0x1c] - strb r6, [sp, #0x24] - strb r5, [sp, #0x26] - strb r5, [sp, #0x27] - strb r0, [sp, #0x25] - cmp r6, #0 - beq _0230D2F8 - add r4, sp, #0x10 -_0230D298: - mov r2, r5, lsl #0x10 - mov r0, sl - mov r1, sb - mov r3, r6 - mov r2, r2, asr #0x10 - bl GetTypeMatchup - str r0, [r4, r5, lsl #2] - add r5, r5, #1 - cmp r5, #2 - blt _0230D298 - mov r0, sl - mov r1, sb - mov r2, #0x35 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230D2F8 - ldr r2, [sp, #0x10] - ldr r0, _0230D39C ; =TYPE_MATCHUP_COMBINATOR_TABLE - ldr r1, [sp, #0x14] - add r0, r0, r2, lsl #4 - ldr r0, [r0, r1, lsl #2] - cmp r0, #3 - movne r8, #0 -_0230D2F8: - ldrsh r1, [sp, #0x5c] - ldr r0, _0230D3A0 ; =0x00000256 - mov r8, r8, lsl #8 - cmp r1, r0 - bne _0230D334 - mov r0, sl - mov r1, #0x2f - bl IqSkillIsEnabled - cmp r0, #0 - beq _0230D334 - ldr r1, _0230D3A4 ; =POWER_PITCHER_DAMAGE_MULTIPLIER - mov r0, r8 - ldr r1, [r1] - bl MultiplyByFixedPoint - mov r8, r0 -_0230D334: - mov r0, r8 - bl RoundUpDiv256 - str r0, [sp, #0x18] - cmp r8, #0 - moveq r0, #1 - streqb r0, [sp, #0x28] - movne r0, #0 - strneb r0, [sp, #0x28] - ldrsh r1, [sp, #0x5c] - str r7, [sp] - ldr r0, [sp, #0x64] - str r1, [sp, #4] - str r0, [sp, #8] - ldr r4, [sp, #0x68] - add r2, sp, #0x18 - mov r0, sl - mov r1, sb - mov r3, #0 - str r4, [sp, #0xc] - bl ApplyDamageAndEffects - ldr r1, [sp, #0x50] - cmp r1, #0 - ldrneb r0, [sp, #0x28] - strneb r0, [r1] - add sp, sp, #0x2c - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_0230D39C: .word TYPE_MATCHUP_COMBINATOR_TABLE -_0230D3A0: .word 0x00000256 -_0230D3A4: .word POWER_PITCHER_DAMAGE_MULTIPLIER - arm_func_end CalcDamageFixed - - arm_func_start CalcDamageFixedNoCategory -CalcDamageFixedNoCategory: ; 0x0230D3A8 - stmdb sp!, {lr} - sub sp, sp, #0x1c - ldr lr, [sp, #0x20] - ldrb ip, [sp, #0x24] - str lr, [sp] - ldrsh lr, [sp, #0x28] - str ip, [sp, #4] - mov ip, #3 - str ip, [sp, #8] - ldr ip, [sp, #0x2c] - str lr, [sp, #0xc] - ldr lr, [sp, #0x30] - str ip, [sp, #0x10] - ldr ip, [sp, #0x34] - str lr, [sp, #0x14] - str ip, [sp, #0x18] - bl CalcDamageFixed - add sp, sp, #0x1c - ldmia sp!, {pc} - arm_func_end CalcDamageFixedNoCategory - - arm_func_start CalcDamageFixedWrapper -CalcDamageFixedWrapper: ; 0x0230D3F4 - stmdb sp!, {lr} - sub sp, sp, #0x1c - ldr ip, [sp, #0x20] - ldrb lr, [sp, #0x24] - str ip, [sp] - ldrb ip, [sp, #0x28] - str lr, [sp, #4] - ldrsh lr, [sp, #0x2c] - str ip, [sp, #8] - ldr ip, [sp, #0x30] - str lr, [sp, #0xc] - ldr lr, [sp, #0x34] - str ip, [sp, #0x10] - ldr ip, [sp, #0x38] - str lr, [sp, #0x14] - str ip, [sp, #0x18] - bl CalcDamageFixed - add sp, sp, #0x1c - ldmia sp!, {pc} - arm_func_end CalcDamageFixedWrapper - - arm_func_start UpdateShopkeeperModeAfterAttack -UpdateShopkeeperModeAfterAttack: ; 0x0230D440 - ldr r2, [r1, #0xb4] - ldrb r1, [r2, #9] - cmp r1, #0 - bxeq lr - ldr r1, [r0] - cmp r1, #1 - bxne lr - ldr r0, [r0, #0xb4] - ldrb r0, [r0, #6] - cmp r0, #0 - movne r0, #2 - strneb r0, [r2, #9] - moveq r0, #3 - streqb r0, [r2, #9] - bx lr - arm_func_end UpdateShopkeeperModeAfterAttack - - arm_func_start UpdateShopkeeperModeAfterTrap -UpdateShopkeeperModeAfterTrap: ; 0x0230D47C - ldr r2, [r0, #0xb4] - ldrb r0, [r2, #9] - cmp r0, #0 - bxeq lr - cmp r1, #0 - movne r0, #2 - strneb r0, [r2, #9] - moveq r0, #3 - streqb r0, [r2, #9] - bx lr - arm_func_end UpdateShopkeeperModeAfterTrap - - arm_func_start ov29_0230D4A4 -ov29_0230D4A4: ; 0x0230D4A4 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r6, r1 - mov r7, r0 - mov r0, r6 - mov r1, #0xe - mov r5, r2 - ldr r4, [r6, #0xb4] - bl MonsterIsType - cmp r0, #0 - beq _0230D4E8 - cmp r5, #1 - cmpne r5, #7 - bne _0230D4E8 - ldrb r0, [r4, #0xfe] - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} -_0230D4E8: - mov r4, #0 - b _0230D518 -_0230D4F0: - mov r2, r4, lsl #0x10 - mov r0, r7 - mov r1, r6 - mov r3, r5 - mov r2, r2, asr #0x10 - bl GetTypeMatchup - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - add r4, r4, #1 -_0230D518: - cmp r4, #2 - blt _0230D4F0 - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ov29_0230D4A4 - - arm_func_start ResetDamageCalcDiagnostics -ResetDamageCalcDiagnostics: ; 0x0230D528 - stmdb sp!, {r3, r4, r5, lr} - ldr r0, _0230D614 ; =DUNGEON_PTR - mov r1, #0x54 - ldr r4, [r0] - add r5, r4, #0x184 - mov r0, r5 - bl MemZero - mov r1, #0 - strb r1, [r4, #0x184] - str r1, [r5, #4] - strb r1, [r5, #8] - strb r1, [r5, #9] - mov r0, #0xa - strb r0, [r5, #0xa] - strb r0, [r5, #0xb] - mov r0, #1 - strh r0, [r5, #0xc] - strh r0, [r5, #0xe] - strh r1, [r5, #0x10] - strh r1, [r5, #0x14] - strh r1, [r5, #0x12] - strh r1, [r5, #0x16] - strh r1, [r5, #0x1c] - str r1, [r5, #0x20] - str r1, [r5, #0x28] - str r1, [r5, #0x2c] - strb r1, [r5, #0x30] - strb r1, [r5, #0x31] - strb r1, [r5, #0x36] - strb r1, [r5, #0x37] - strb r1, [r5, #0x34] - strb r1, [r5, #0x35] - strb r1, [r5, #0x38] - strb r1, [r5, #0x39] - strb r1, [r5, #0x3a] - strb r1, [r5, #0x3b] - strb r1, [r5, #0x3c] - strb r1, [r5, #0x3d] - strb r1, [r5, #0x3e] - strb r1, [r5, #0x40] - strb r1, [r5, #0x3f] - strb r1, [r5, #0x41] - strb r1, [r5, #0x42] - strb r1, [r5, #0x43] - strb r1, [r5, #0x44] - strb r1, [r5, #0x45] - strb r1, [r5, #0x46] - strb r1, [r5, #0x47] - strb r1, [r5, #0x48] - strb r1, [r5, #0x4b] - strb r1, [r5, #0x4c] - strb r1, [r5, #0x4d] - strb r1, [r5, #0x4e] - strb r1, [r5, #0x4f] - strb r1, [r5, #0x50] - strb r1, [r5, #0x51] - strb r1, [r5, #0x32] - strb r1, [r5, #0x33] - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230D614: .word DUNGEON_PTR - arm_func_end ResetDamageCalcDiagnostics - - arm_func_start ov29_0230D618 -ov29_0230D618: ; 0x0230D618 - ldr r1, _0230D624 ; =ov29_02352894 - ldr r0, [r1, r0, lsl #2] - bx lr - .align 2, 0 -_0230D624: .word ov29_02352894 - arm_func_end ov29_0230D618 - - arm_func_start ov29_0230D628 -ov29_0230D628: ; 0x0230D628 - stmdb sp!, {r3, lr} - ldr r1, _0230D650 ; =DUNGEON_PTR - ldr r1, [r1] - add r1, r1, #0x1a000 -#ifdef JAPAN - ldr r1, [r1, #0x188] -#else - ldr r1, [r1, #0x22c] -#endif - cmp r1, r0 - ldmneia sp!, {r3, pc} - mov r1, #1 - bl PointCameraToMonster - ldmia sp!, {r3, pc} - .align 2, 0 -_0230D650: .word DUNGEON_PTR - arm_func_end ov29_0230D628 - - arm_func_start IsEitherMonsterInvalid -IsEitherMonsterInvalid: ; 0x0230D654 - stmdb sp!, {r4, lr} - mov r4, r1 - bl EntityIsValid__02308FBC - cmp r0, #0 - beq _0230D678 - mov r0, r4 - bl EntityIsValid__02308FBC - cmp r0, #0 - bne _0230D680 -_0230D678: - mov r0, #1 - ldmia sp!, {r4, pc} -_0230D680: - mov r0, #0 - ldmia sp!, {r4, pc} - arm_func_end IsEitherMonsterInvalid - - arm_func_start ov29_0230D688 -ov29_0230D688: ; 0x0230D688 - stmdb sp!, {r4, lr} - sub sp, sp, #8 - mov r4, r0 - ldrh r3, [r4] - mov r1, #0x55 - mov r2, #2 - strh r3, [sp] - ldrh r3, [r4, #2] - strh r3, [sp, #2] - ldrh r3, [r4, #4] - strh r3, [sp, #4] - bl GenerateStandardItem - mov r0, r4 - bl SetItemAcquired - ldrb r0, [sp, #1] - strb r0, [r4, #1] - cmp r0, #0 - beq _0230D6FC - add r0, sp, #0 - bl GetEquivItemIndex - cmp r0, #0 - blt _0230D6FC - bl GetItemAtIdx - ldrh r1, [r4] - strh r1, [r0] - ldrh r1, [r4, #2] - strh r1, [r0, #2] - ldrh r1, [r4, #4] - strh r1, [r0, #4] -_0230D6FC: - add sp, sp, #8 - ldmia sp!, {r4, pc} - arm_func_end ov29_0230D688 - - arm_func_start ov29_0230D704 -ov29_0230D704: ; 0x0230D704 - mov r0, #0 - bx lr - arm_func_end ov29_0230D704 - - arm_func_start ov29_0230D70C -ov29_0230D70C: ; 0x0230D70C - stmdb sp!, {r3, lr} - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _0230D734 ; =ov10_022C45B4 - ldrsh r1, [r1] - cmp r0, r1 - movlt r0, #1 - movge r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - .align 2, 0 -_0230D734: .word ov10_022C45B4 - arm_func_end ov29_0230D70C - - arm_func_start ov29_0230D738 -ov29_0230D738: ; 0x0230D738 - stmdb sp!, {r3, lr} - cmp r2, #0 - bne _0230D760 - mov r0, #0x64 - bl DungeonRandInt - ldr r1, _0230D768 ; =ov10_022C45B4 - ldrsh r1, [r1] - cmp r0, r1 - movlt r0, #1 - ldmltia sp!, {r3, pc} -_0230D760: - mov r0, #0 - ldmia sp!, {r3, pc} - .align 2, 0 -_0230D768: .word ov10_022C45B4 - arm_func_end ov29_0230D738 - - arm_func_start ov29_0230D76C -ov29_0230D76C: ; 0x0230D76C - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - mov r4, r2 - bl IsMonster__0230A994 - cmp r0, #0 - beq _0230D798 - mov r0, r5 - bl IsMonster__0230A994 - cmp r0, #0 - bne _0230D7A0 -_0230D798: - mov r0, #0 - ldmia sp!, {r4, r5, r6, pc} -_0230D7A0: - ldr r0, [r6, #0xb4] - ldr r1, [r5, #0xb4] - ldrsh r0, [r0, #2] - ldrsh r1, [r1, #2] - bl GendersNotEqualNotGenderless - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, pc} - mov r0, r6 - mov r1, r5 - mov r2, r4 - bl ov29_0230D738 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end ov29_0230D76C - - arm_func_start ov29_0230D7D4 -ov29_0230D7D4: ; 0x0230D7D4 - stmdb sp!, {r3, r4, r5, lr} - sub sp, sp, #0x10 - ldr r2, _0230D870 ; =ov29_023535D4 - mvn r1, #0 - ldrsh r3, [r2] - mov r4, r0 - cmp r3, r1 - beq _0230D808 - ldrsh r0, [r2] - bl TerminateEffectWrapper - ldr r0, _0230D870 ; =ov29_023535D4 - mvn r1, #0 - strh r1, [r0] -_0230D808: - mov r2, #0 - mov r1, #1 - str r2, [sp] - stmib sp, {r1, r2} - mov r0, r4 - rsb r1, r1, #0x2b8 - mov r3, #3 - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 - mvn r0, #0 - cmp r5, r0 - beq _0230D868 - mov r4, #0x18 - b _0230D850 -_0230D848: - mov r0, r4 - bl AdvanceFrame -_0230D850: - mov r0, r5 - bl ov10_022BF964 - cmp r0, #0 - bne _0230D848 - mov r0, r5 - bl TerminateEffectWrapper -_0230D868: - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230D870: .word ov29_023535D4 - arm_func_end ov29_0230D7D4 - - arm_func_start SwapDefensiveStages -SwapDefensiveStages: ; 0x0230D874 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - ldr lr, [r5, #0xb4] - ldr ip, [r4, #0xb4] - ldrsh r3, [lr, #0x28] - ldrsh r1, [lr, #0x2a] - ldrsh r0, [ip, #0x28] - cmp r2, #0 - strh r0, [lr, #0x28] - ldrsh r0, [ip, #0x2a] - strh r0, [lr, #0x2a] - strh r3, [ip, #0x28] - strh r1, [ip, #0x2a] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _0230D8E4 ; =0x00000F2D - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_0230D8E4: .word 0x00002494 -#else -_0230D8E4: .word 0x00000F2D -#endif - arm_func_end SwapDefensiveStages - - arm_func_start SwapDefensiveMultipliers -SwapDefensiveMultipliers: ; 0x0230D8E8 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - ldr lr, [r5, #0xb4] - ldr ip, [r4, #0xb4] - ldr r3, [lr, #0x3c] - ldr r1, [lr, #0x40] - ldr r0, [ip, #0x3c] - cmp r2, #0 - str r0, [lr, #0x3c] - ldr r0, [ip, #0x40] - str r0, [lr, #0x40] - str r3, [ip, #0x3c] - str r1, [ip, #0x40] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _0230D958 ; =0x00000F2E - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_0230D958: .word 0x00002495 -#else -_0230D958: .word 0x00000F2E -#endif - arm_func_end SwapDefensiveMultipliers - - arm_func_start SwapOffensiveStages -SwapOffensiveStages: ; 0x0230D95C - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - ldr lr, [r5, #0xb4] - ldr ip, [r4, #0xb4] - ldrsh r3, [lr, #0x24] - ldrsh r1, [lr, #0x26] - ldrsh r0, [ip, #0x24] - cmp r2, #0 - strh r0, [lr, #0x24] - ldrsh r0, [ip, #0x26] - strh r0, [lr, #0x26] - strh r3, [ip, #0x24] - strh r1, [ip, #0x26] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _0230D9CC ; =0x00000F2B - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_0230D9CC: .word 0x00002492 -#else -_0230D9CC: .word 0x00000F2B -#endif - arm_func_end SwapOffensiveStages - - arm_func_start SwapOffensiveMultipliers -SwapOffensiveMultipliers: ; 0x0230D9D0 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - ldr lr, [r5, #0xb4] - ldr ip, [r4, #0xb4] - ldr r3, [lr, #0x34] - ldr r1, [lr, #0x38] - ldr r0, [ip, #0x34] - cmp r2, #0 - str r0, [lr, #0x34] - ldr r0, [ip, #0x38] - str r0, [lr, #0x38] - str r3, [ip, #0x34] - str r1, [ip, #0x38] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _0230DA40 ; =0x00000F2C - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_0230DA40: .word 0x00002493 -#else -_0230DA40: .word 0x00000F2C -#endif - arm_func_end SwapOffensiveMultipliers - - arm_func_start SwapHitChanceStages -SwapHitChanceStages: ; 0x0230DA44 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - ldr lr, [r5, #0xb4] - ldr ip, [r4, #0xb4] - ldrsh r3, [lr, #0x2c] - ldrsh r1, [lr, #0x2e] - ldrsh r0, [ip, #0x2c] - cmp r2, #0 - strh r0, [lr, #0x2c] - ldrsh r0, [ip, #0x2e] - strh r0, [lr, #0x2e] - strh r3, [ip, #0x2c] - strh r1, [ip, #0x2e] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _0230DAB4 ; =0x00000F2F - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_0230DAB4: .word 0x00002496 -#else -_0230DAB4: .word 0x00000F2F -#endif - arm_func_end SwapHitChanceStages - - arm_func_start SwapUserAtkAndDefModifiers -SwapUserAtkAndDefModifiers: ; 0x0230DAB8 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldr ip, [r5, #0xb4] - mov r4, r1 - ldrsh r1, [ip, #0x24] - ldr r3, [ip, #0x34] - ldr r0, [ip, #0x3c] - cmp r2, #0 - str r0, [ip, #0x34] - ldrsh r0, [ip, #0x28] - strh r0, [ip, #0x24] - str r3, [ip, #0x3c] - strh r1, [ip, #0x28] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags -#ifdef JAPAN - ldr r2, _0230F050 ; =0x00002497 - mov r0, r5 - mov r1, r4 -#else - mov r0, r5 - mov r1, r4 - mov r2, #0xf30 -#endif - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} -#ifdef JAPAN -_0230F050: .word 0x00002497 -#endif - arm_func_end SwapUserAtkAndDefModifiers diff --git a/include/common.h b/include/common.h index ad45953a..648215e2 100644 --- a/include/common.h +++ b/include/common.h @@ -32,14 +32,14 @@ struct ground_move { struct ground_monster { u8 is_valid; // 0x0: True if the entry is valid - s8 level; // 0x1: Monster level + u8 level; u8 joined_at; // 0x2 u8 joined_at_floor; // 0x3: See struct monster::joined_at_floor s16 id; // 0x4: Monster ID - s8 level_at_first_evo; // 0x6: Level upon first evolution, or 0 if not applicable - s8 level_at_second_evo; // 0x7: Level upon second evolution, or 0 if not applicable - u16 iq; // 0x8 - u16 max_hp; // 0xA + u8 level_at_first_evo; + u8 level_at_second_evo; + s16 iq; + s16 max_hp; u8 offensive_stats[2]; // 0xC: {atk, sp_atk} u8 defensive_stats[2]; // 0xE: {def, sp_def} s32 exp; // 0x10 diff --git a/include/dungeon.h b/include/dungeon.h index 895bc93c..45d268a9 100644 --- a/include/dungeon.h +++ b/include/dungeon.h @@ -199,8 +199,7 @@ struct dungeon { // a mission. dungeon::end_floor_no_death_check_flag gets set whenever this is changed. u32 successful_exit_tracker; // 0x1C: Increased once per frame until 0x64. Resets to 0 when the leader acts. - u8 field_0x1c; - u8 field_0x1d; + s16 field_0x1c; // 0x1E: Number of floors completed? (Guess). Initialized to 0. // If this is a floor tracker, odd it is not a u16 like the others. s16 number_completed_floors; diff --git a/include/main_02055770.h b/include/main_02055770.h index 0bcf2439..7548d87b 100644 --- a/include/main_02055770.h +++ b/include/main_02055770.h @@ -1,12 +1,49 @@ #ifndef PMDSKY_MAIN_02055770_H #define PMDSKY_MAIN_02055770_H -struct ground_monster; +#include "util.h" +#include "common.h" + +struct unk_02055E14_18 { + u32 field_0x0[3]; +}; + +struct unk_02055E14_2a { + u16 field_0x0[12]; +}; + +struct unk_02055E14 { + u16 field_0x0; + u8 field_0x2[2]; + u8 field_0x4; + u8 field_0x5; + u8 field_0x6; + u8 field_0x7; + s16 field_0x8; + u8 field_0xa; + u8 field_0xb; + s16 field_0xc; + s16 field_0xe; + u8 field_0x10[2]; + u8 field_0x12[2]; + s32 field_0x14; + struct unk_02055E14_18 field_0x18; + u8 field_0x24; + u8 field_0x25; + s16 field_0x26; + s16 field_0x28; + struct unk_02055E14_2a field_0x2a; + char field_0x42[10]; +}; + struct ground_monster* GetHero(void); struct ground_monster* GetPartner(void); struct ground_monster* GetMainCharacter1(void); struct ground_monster* GetMainCharacter2(void); struct ground_monster* GetMainCharacter3(void); +s16 sub_02055894(struct ground_monster *member); +s16 GetFirstMatchingMemberIdx(s16 monster_id); +s16 GetFirstEmptyMemberIdx(s16 monster_id); #endif diff --git a/include/main_02056294.h b/include/main_02056294.h index 845b5ae6..ce4f5021 100644 --- a/include/main_02056294.h +++ b/include/main_02056294.h @@ -1,9 +1,30 @@ #ifndef PMDSKY_MAIN_02056294_H #define PMDSKY_MAIN_02056294_H +#include "main_02055770.h" + #include "util.h" #include "common.h" +bool8 sub_02055B20(s16 idx); +void sub_02055B78(s16 idx, s16 monster_id, u8 joined_at, const char *name); +s16 sub_02055CCC(struct ground_monster *mon); +struct ground_monster* sub_02055D4C(struct ground_monster *mon); +void sub_02055D7C(s16 idx, struct ground_monster *mon); +struct ground_monster* sub_02055DD0(s16 monster_id, const char *name, u8 *joined, u16 *moves, u8 flag); +void sub_02055E14(struct unk_02055E14 *dst, struct ground_monster *mon); +void sub_02055F04(struct ground_monster *mon, struct unk_02055E14 *src); +bool8 sub_02055FCC(s16 member_idx, s16 item_id); +bool8 IsMonsterNotNicknamed(struct ground_monster *mon); +void GetRecoloredGroundMonsterName(char *dst, struct ground_monster *mon, s32 mode); +void sub_02056094(char *dst, struct ground_monster *mon, bool8 is_leader); +bool8 sub_020560A4(s32 a, s32 b); +void sub_020560B8(void); +void RemoveActiveMembersFromAllTeams(void); +void RemoveActiveMembersFromSpecialEpisodeTeam(void); +void RemoveActiveMembersFromRescueTeam(void); +bool8 sub_02056228(s32 idx); +bool8 CheckTeamMemberIdx(s32 idx); bool8 IsMonsterIdInNormalRange(s16 id); bool8 sub_020562B8(int a); void SetActiveTeam(enum team_id team); diff --git a/include/main_0205B008.h b/include/main_0205B008.h index afa43a32..bdab3869 100644 --- a/include/main_0205B008.h +++ b/include/main_0205B008.h @@ -1,9 +1,10 @@ #ifndef PMDSKY_MAIN_0205B008_H #define PMDSKY_MAIN_0205B008_H +#include "common.h" #include "dungeon_mode.h" -void sub_0205B008(struct monster_summary *monster_summary, u32 b); +void sub_0205B008(struct monster_summary *monster_summary, struct ground_monster *b); void sub_0205B028(struct monster_summary *monster_summary, s32 member_idx); void sub_0205B0A0(void *p1); diff --git a/include/overlay_29_022E4B8C.h b/include/overlay_29_022E4B8C.h index 557947bd..f596896f 100644 --- a/include/overlay_29_022E4B8C.h +++ b/include/overlay_29_022E4B8C.h @@ -4,8 +4,36 @@ #include "dungeon_mode.h" #include "item.h" #include "move.h" +#include "move_orb_effects.h" +#include "overlay_29_02308FBC.h" void ov29_022E4B8C(struct entity *entity); void ov29_022E4BA0(struct entity *entity); +void ov29_022E4BB4(struct entity *entity); +void PlayAttractHitEffect(struct entity *entity); +void ov29_022E4C4C(struct entity *entity); +void ov29_022E4C84(struct entity *entity); +void ov29_022E4CD4(struct entity *entity); +void ov29_022E4D24(void); +void PlayOffensiveStatDownEffect(struct entity *entity, struct StatIndex stat_index); +void PlayDefensiveStatDownEffect(struct entity *entity, struct StatIndex stat_index); +void PlayOffensiveStatUpEffect(struct entity *entity, struct StatIndex stat_index); +void PlayDefensiveStatUpEffect(struct entity *entity, struct StatIndex stat_index); +void PlayOffensiveStatMultiplierUpEffect(struct entity *entity, struct StatIndex stat_index); +void PlayOffensiveStatMultiplierDownEffect(struct entity *entity, struct StatIndex stat_index); +void PlayDefensiveStatMultiplierUpEffect(struct entity *entity, struct StatIndex stat_index); +void PlayDefensiveStatMultiplierDownEffect(struct entity *entity, struct StatIndex stat_index); +void PlayHitChanceUpEffect(struct entity *entity, struct StatIndex stat_index); +void PlayHitChanceDownEffect(struct entity *entity, struct StatIndex stat_index); +void PlayExclamationPointEffect__022E5D4C(struct entity *entity); +void ov29_022E53EC(void); +void ov29_022E53F0(struct entity *entity); +void ov29_022E543C(struct entity *entity); +void ov29_022E5474(void); +void ov29_022E5478(struct entity *entity, struct unk_02308FE0 *damage_data); +void ov29_022E550C(struct entity *entity); +void ov29_022E555C(void); +void ov29_022E5560(struct entity *a, struct entity *b, s32 c); +void ov29_022E55F0(struct entity *a, struct entity *b); #endif diff --git a/include/overlay_29_022E9FC0.h b/include/overlay_29_022E9FC0.h index 86d4fb99..ad2f1427 100644 --- a/include/overlay_29_022E9FC0.h +++ b/include/overlay_29_022E9FC0.h @@ -1,8 +1,23 @@ #ifndef PMDSKY_OVERLAY_29_022E9FC0_H #define PMDSKY_OVERLAY_29_022E9FC0_H +#include "dungeon_mode.h" + u8 ov29_022E9FC0(void); void ov29_022E9FD0(u8 value); void AdvanceFrame(u32 param_1); +void ov29_022EA008(void); +void ov29_022EA2A4(u32 param_1); +void ov29_022EA324(u32 param_1); +void ov29_022EA370(s32 a, s32 b); +void ov29_022EA3B4(s32 param_1); +void ov29_022EA3F8(void); +s32 ov29_022EA408(void); +void ov29_022EA418(u8 param_1); +void UnkMapRelatedFunc(s32 switch_case, u32 param_2); +void ov29_022EA62C(void); +void AnimateWaterShadows(void); +void DisplayAnimatedNumbers(s32 amount, struct entity *entity, bool8 display_sign, s32 number_color); +void ov29_022EA80C(void); #endif diff --git a/include/overlay_29_0230BBAC.h b/include/overlay_29_0230BBAC.h index 89b70f0a..7d70f9ee 100644 --- a/include/overlay_29_0230BBAC.h +++ b/include/overlay_29_0230BBAC.h @@ -3,10 +3,37 @@ #include "dungeon_mode.h" #include "enums.h" +#include "item.h" #include "overlay_29_02308FBC.h" void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id attack_type, s32 power, s32 crit_chance, struct unk_02308FE0 *damage_out, s32 damage_mult, enum move_id move_id, s32 a9); +void ov29_0230D088(struct entity *attacker, struct entity *defender, enum type_id attack_type, u8 category, s32 power, struct unk_02308FE0 *damage_out); +void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a3, s16 damage_source); +void CalcRecoilDamageFixed(struct entity *entity, s32 fixed_damage, s32 a3, bool8 *out_flag, s32 a5, enum type_id attack_type, s16 damage_source, s32 a8, s32 a9, s32 a10); +void CalcDamageFixed(struct entity *attacker, struct entity *defender, s32 fixed_damage, s32 a4, bool8 *out_flag, enum type_id attack_type, u8 category, s16 damage_source, s32 a9, s32 a10, s32 a11); +void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s16 fixed_damage, s32 a4, bool8 *out_flag, enum type_id attack_type, s16 damage_source, s32 a8, s32 a9, s32 a10); +void CalcDamageFixedWrapper(struct entity *attacker, struct entity *defender, s32 fixed_damage, s32 a4, bool8 *out_flag, enum type_id attack_type, u8 category, s16 damage_source, s32 a9, s32 a10, s32 a11); +void UpdateShopkeeperModeAfterAttack(struct entity *attacker, struct entity *defender); +void UpdateShopkeeperModeAfterTrap(struct entity *entity, bool8 is_enemy); +bool8 ov29_0230D4A4(struct entity *attacker, struct entity *defender, enum type_id attack_type); +void ResetDamageCalcDiagnostics(void); +s32 ov29_0230D618(s32 idx); +void ov29_0230D628(struct entity *entity); +bool8 IsEitherMonsterInvalid(struct entity *a, struct entity *b); +void ov29_0230D688(struct item *item); +bool8 ov29_0230D704(struct entity *attacker, struct entity *defender, s32 a3); +bool8 ov29_0230D70C(struct entity *attacker, struct entity *defender, s32 a3); +bool8 ov29_0230D738(struct entity *attacker, struct entity *defender, s32 a3); +bool8 ov29_0230D76C(struct entity *attacker, struct entity *defender, s32 a3); +void ov29_0230D7D4(struct entity *entity); +void SwapDefensiveStages(struct entity *user, struct entity *target, s32 log_message); +void SwapDefensiveMultipliers(struct entity *user, struct entity *target, s32 log_message); +void SwapOffensiveStages(struct entity *user, struct entity *target, s32 log_message); +void SwapOffensiveMultipliers(struct entity *user, struct entity *target, s32 log_message); +void SwapHitChanceStages(struct entity *user, struct entity *target, s32 log_message); +void SwapUserAtkAndDefModifiers(struct entity *user, struct entity *target, s32 log_message); + #endif diff --git a/main.lsf b/main.lsf index b80dfe2c..cca4afbf 100644 --- a/main.lsf +++ b/main.lsf @@ -296,7 +296,7 @@ Static main Object src/main_02055410.o Object src/main_0205567C.o Object src/main_02055770.o - Object asm/main_02055894.o + Object asm/main_020559D8.o Object src/main_02056294.o Object asm/main_020563BC.o Object src/main_020564B0.o @@ -812,7 +812,6 @@ Overlay OVY_29 Object src/overlay_29_022E4704.o Object asm/overlay_29_022E4868.o Object src/overlay_29_022E4B8C.o - Object asm/overlay_29_022E4BB4.o Object src/overlay_29_022E563C.o Object asm/overlay_29_022E5650.o Object src/overlay_29_022E66C4.o @@ -836,7 +835,6 @@ Overlay OVY_29 Object src/overlay_29_022E99F0.o Object asm/overlay_29_022E9A6C.o Object src/overlay_29_022E9FC0.o - Object asm/overlay_29_022EA008.o Object src/overlay_29_022EA968.o Object src/overlay_29_022EA9CC.o Object src/dg_random.o @@ -976,7 +974,6 @@ Overlay OVY_29 Object src/dungeon_damage.o Object asm/overlay_29_rodata_02352894.o Object src/overlay_29_0230BBAC.o - Object asm/overlay_29_0230D088.o Object src/dungeon_recruitment.o Object src/overlay_29_0230E578.o Object asm/overlay_29_0230E5A8.o diff --git a/src/dungeon_recruitment.c b/src/dungeon_recruitment.c index 09d2cc24..fe7070f6 100644 --- a/src/dungeon_recruitment.c +++ b/src/dungeon_recruitment.c @@ -81,7 +81,6 @@ extern bool8 IsLegendaryChallengeFloor(void); extern bool8 IsMonsterOnTeam(s16 monsterId, s32 checkType); extern void ov29_022E1B28(s32); extern void ov29_022E81F8(void); -extern s32 GetFirstEmptyMemberIdx(u32); extern const s16 FRIEND_BOW_FAST_FRIEND_BOOST; extern const s16 GOLDEN_MASK_RECRUIT_BOOST; diff --git a/src/main_020114F8.c b/src/main_020114F8.c index 02408063..d9d5b628 100644 --- a/src/main_020114F8.c +++ b/src/main_020114F8.c @@ -2,7 +2,7 @@ #include "main_02001188.h" #include "common.h" -extern void ApplyGummiBoostsGroundMode(s16 *monster_id, u16 *iq, u8 *offensive_stats, u8 *defensive_stats, s16 item_id, int a6, void *a7); +extern void ApplyGummiBoostsGroundMode(s16 *monster_id, s16 *iq, u8 *offensive_stats, u8 *defensive_stats, s16 item_id, int a6, void *a7); void SwapShopFreeDoublePointer(void** p) { @@ -22,6 +22,6 @@ void ApplyGummiBoostsToGroundMonster(struct ground_monster *monster, s16 item_id void ApplyGummiBoostsToTeamMember(struct team_member *member, s16 item_id, int a3, void *a4) { - ApplyGummiBoostsGroundMode((s16 *)&member->id, &member->iq, member->offensive_stats, + ApplyGummiBoostsGroundMode((s16 *)&member->id, (s16 *)&member->iq, member->offensive_stats, member->defensive_stats, item_id, a3, a4); } diff --git a/src/main_02055770.c b/src/main_02055770.c index 753529db..c1f134f9 100644 --- a/src/main_02055770.c +++ b/src/main_02055770.c @@ -1,9 +1,36 @@ #include "main_02055770.h" #include "common.h" #include "game_mode.h" +#include "debug.h" +#include "enums.h" +#include "item_util.h" +#include "main_020251AC.h" +#include "main_0204FDFC.h" +#include "main_0205283C.h" +#include "main_02055410.h" +#include "main_02056294.h" +#include "main_020564B0.h" +#include "main_02058E68.h" extern struct team_member_table *TEAM_MEMBER_TABLE_PTR; +extern s32 _022B5788; +extern u8 _020A3350[]; + +extern void sub_02052CF4(struct ground_monster *mon, s16 monster_id, const char *name, + u8 *joined, u16 *moves, u8 flag); +extern void sub_02053F10(struct ground_move *moves, s16 monster_id, s32 flag); +extern bool8 sub_02053D1C(u16 move_id, s16 monster_id); +extern bool8 IsValidTeamMember(s16 member_idx); +extern s16 TryAddMonsterToActiveTeam(s16 member_idx); +extern s16 sub_02056554(s16 member_idx); +extern void StrncpyName(char *dest, const char *src, u32 n); +extern void GetNameRaw(u8 *dest, s32 monster_id); +extern bool8 StrcmpMonsterName(const char *name, s16 monster_id); +extern void RecolorNameString(char *dst, const char *src, s32 mode); +extern void RecolorTeamMemberNameString(char *dst, const char *src, bool8 is_leader); +extern void sub_020559D8(s16 *idxs); + struct ground_monster* GetHero(void) { struct ground_monster *m = TEAM_MEMBER_TABLE_PTR->members; @@ -42,3 +69,46 @@ struct ground_monster* GetMainCharacter3(void) valid = (TEAM_MEMBER_TABLE_PTR->members[4].is_valid & 1) != 0; return valid ? &TEAM_MEMBER_TABLE_PTR->members[4] : NULL; } + +s16 sub_02055894(struct ground_monster *member) +{ + struct ground_monster *m = TEAM_MEMBER_TABLE_PTR->members; + s32 i; + for (i = 0; i < MAX_GROUND_TEAM_MEMBERS; i++, m++) { + if (m == member) { + bool8 valid = (m->is_valid & 1) != 0; + if (!valid) { + break; + } + return i; + } + } + return -1; +} + +s16 GetFirstMatchingMemberIdx(s16 monster_id) +{ + struct ground_monster *m = &TEAM_MEMBER_TABLE_PTR->members[5]; + s32 i; + for (i = 5; i < MAX_GROUND_TEAM_MEMBERS; i++, m++) { + bool8 valid = (m->is_valid & 1) != 0; + if (valid && m->id == monster_id) { + return i; + } + } + return -1; +} + +s16 GetFirstEmptyMemberIdx(s16 monster_id) +{ + struct ground_monster *m = &TEAM_MEMBER_TABLE_PTR->members[5]; + s32 limit = (monster_id == 0x214) ? MAX_GROUND_TEAM_MEMBERS : _022B5788; + s32 i; + for (i = 5; i < limit; i++, m++) { + bool8 valid = (m->is_valid & 1) != 0; + if (!valid) { + return i; + } + } + return -1; +} diff --git a/src/main_02056294.c b/src/main_02056294.c index 7659bec3..06a68e4d 100644 --- a/src/main_02056294.c +++ b/src/main_02056294.c @@ -1,5 +1,281 @@ #include "main_02056294.h" #include "common.h" +#include "main_02055770.h" + +extern struct team_member_table *TEAM_MEMBER_TABLE_PTR; +#include "debug.h" +#include "enums.h" +#include "item_util.h" +#include "main_020251AC.h" +#include "main_0204FDFC.h" +#include "main_0205283C.h" +#include "main_02055410.h" +#include "main_020564B0.h" +#include "main_02058E68.h" + +extern s32 _022B5788; +extern u8 _020A3350[]; + +extern void sub_02052CF4(struct ground_monster *mon, s16 monster_id, const char *name, + u8 *joined, u16 *moves, u8 flag); +extern void sub_02053F10(struct ground_move *moves, s16 monster_id, s32 flag); +extern bool8 sub_02053D1C(u16 move_id, s16 monster_id); +extern bool8 IsValidTeamMember(s16 member_idx); +extern s16 TryAddMonsterToActiveTeam(s16 member_idx); +extern s16 sub_02056554(s16 member_idx); +extern void StrncpyName(char *dest, const char *src, u32 n); +extern void GetNameRaw(u8 *dest, s32 monster_id); +extern bool8 StrcmpMonsterName(const char *name, s16 monster_id); +extern void RecolorNameString(char *dst, const char *src, s32 mode); +extern void RecolorTeamMemberNameString(char *dst, const char *src, bool8 is_leader); +extern void sub_020559D8(s16 *idxs); + +bool8 sub_02055B20(s16 idx) +{ + struct ground_monster *m = &TEAM_MEMBER_TABLE_PTR->members[idx]; + bool8 valid; + if (idx < 5) { + return FALSE; + } + valid = (m->is_valid & 1) != 0; + if (!valid) { + return FALSE; + } + if (sub_020564B0(idx)) { + return FALSE; + } + m->is_valid = FALSE; + return TRUE; +} + +void sub_02055B78(s16 idx, s16 monster_id, u8 joined_at, const char *name) +{ + u8 name_buf[20]; + struct ground_monster mon; + struct ground_monster *dst = &TEAM_MEMBER_TABLE_PTR->members[idx]; + mon.is_valid = TRUE; + mon.joined_at = joined_at; + mon.joined_at_floor = 0; + mon.level = 1; + mon.max_hp = GetBaseHp(monster_id); + mon.offensive_stats[0] = GetBaseOffensiveStat(monster_id, 0); + mon.offensive_stats[1] = GetBaseOffensiveStat(monster_id, 1); + mon.defensive_stats[0] = GetBaseDefensiveStat(monster_id, 0); + mon.defensive_stats[1] = GetBaseDefensiveStat(monster_id, 1); + mon.level_at_first_evo = 0; + mon.level_at_second_evo = 0; + mon.iq = 1; + EnableAllLearnableIqSkills(mon.iq_skill_flags, monster_id, 1); + mon.id = monster_id; + mon.exp = 0; + mon.tactic = 0; + sub_02053F10(mon.moves, monster_id, 0); + if (name != NULL) { + StrncpySimple((u8 *)mon.name, (const u8 *)name, 10); + } else { + GetNameRaw(name_buf, monster_id); + StrncpyName(mon.name, (const char *)name_buf, 10); + } + *dst = mon; + if (idx == 0 || idx == 2) { + TryAddMonsterToActiveTeam(idx); + } else { + sub_02056554(idx); + } + Debug_Print0(_020A3350, idx); +} + +s16 sub_02055CCC(struct ground_monster *mon) +{ + s16 idx = GetFirstEmptyMemberIdx(mon->id); + if (idx != -1) { + TEAM_MEMBER_TABLE_PTR->members[idx] = *mon; + SetPokemonJoined(mon->id); + if (mon->id == 0x214) { + _022B5788 = MAX_GROUND_TEAM_MEMBERS; + } + } + return idx; +} + +struct ground_monster* sub_02055D4C(struct ground_monster *mon) +{ + s16 idx = sub_02055CCC(mon); + if (idx == -1) { + return NULL; + } + return &TEAM_MEMBER_TABLE_PTR->members[idx]; +} + +void sub_02055D7C(s16 idx, struct ground_monster *mon) +{ + if (idx == -1) { + return; + } + TEAM_MEMBER_TABLE_PTR->members[idx] = *mon; + SetPokemonJoined(mon->id); +} + +struct ground_monster* sub_02055DD0(s16 monster_id, const char *name, u8 *joined, u16 *moves, u8 flag) +{ + struct ground_monster mon; + sub_02052CF4(&mon, monster_id, name, joined, moves, flag); + return sub_02055D4C(&mon); +} + +void sub_02055E14(struct unk_02055E14 *dst, struct ground_monster *mon) +{ + s32 i; + dst->field_0x0 = mon->is_valid & 1; + dst->field_0x4 = mon->level; + dst->field_0x5 = mon->joined_at; + dst->field_0x6 = mon->joined_at_floor; + dst->field_0x8 = mon->id; + dst->field_0xa = mon->level_at_first_evo; + dst->field_0xb = mon->level_at_second_evo; + dst->field_0xc = mon->iq; + dst->field_0xe = mon->max_hp; + dst->field_0x10[0] = mon->offensive_stats[0]; + dst->field_0x10[1] = mon->offensive_stats[1]; + dst->field_0x12[0] = mon->defensive_stats[0]; + dst->field_0x12[1] = mon->defensive_stats[1]; + dst->field_0x18 = *(struct unk_02055E14_18 *)mon->iq_skill_flags; + dst->field_0x14 = mon->exp; + dst->field_0x24 = mon->tactic; + dst->field_0x2a = *(struct unk_02055E14_2a *)mon->moves; + StrncpySimple((u8 *)dst->field_0x42, (const u8 *)mon->name, 10); + for (i = 0; i < 2; i++) { + dst->field_0x2[i] = 0; + } + dst->field_0x25 = 0; + dst->field_0x26 = 0; + dst->field_0x28 = 0; +} + +void sub_02055F04(struct ground_monster *mon, struct unk_02055E14 *src) +{ + mon->is_valid = src->field_0x0 & 1; + mon->level = src->field_0x4; + mon->joined_at = src->field_0x5; + mon->joined_at_floor = src->field_0x6; + mon->id = src->field_0x8; + mon->level_at_first_evo = src->field_0xa; + mon->level_at_second_evo = src->field_0xb; + mon->iq = src->field_0xc; + mon->max_hp = src->field_0xe; + mon->offensive_stats[0] = src->field_0x10[0]; + mon->offensive_stats[1] = src->field_0x10[1]; + mon->defensive_stats[0] = src->field_0x12[0]; + mon->defensive_stats[1] = src->field_0x12[1]; + *(struct unk_02055E14_18 *)mon->iq_skill_flags = src->field_0x18; + mon->exp = src->field_0x14; + mon->tactic = src->field_0x24; + *(struct unk_02055E14_2a *)mon->moves = src->field_0x2a; + StrncpySimple((u8 *)mon->name, (const u8 *)src->field_0x42, 10); +} + +bool8 sub_02055FCC(s16 member_idx, s16 item_id) +{ + struct ground_monster *mon; + u16 move_id; + s16 i; + if (IsValidTeamMember(member_idx)) { + move_id = GetItemMoveId16(item_id); + mon = GetTeamMember(member_idx); + for (i = 0; i < 4; i++) { + bool8 enabled = (mon->moves[i].flags0 & 1) != 0; + if (enabled && mon->moves[i].id == move_id) { + break; + } + } + if (i >= 4) { + if (sub_02053D1C(move_id, mon->id)) { + return TRUE; + } + } + } + return FALSE; +} + +bool8 IsMonsterNotNicknamed(struct ground_monster *mon) +{ + return StrcmpMonsterName(mon->name, mon->id); +} + +void GetRecoloredGroundMonsterName(char *dst, struct ground_monster *mon, s32 mode) +{ + RecolorNameString(dst, mon->name, mode); +} + +void sub_02056094(char *dst, struct ground_monster *mon, bool8 is_leader) +{ + RecolorTeamMemberNameString(dst, mon->name, is_leader); +} + +bool8 sub_020560A4(s32 a, s32 b) +{ + return a == b; +} + +void sub_020560B8(void) +{ + SetActiveTeam(TEAM_MAIN); +} + +void RemoveActiveMembersFromAllTeams(void) +{ + int i; + int t; + for (t = 0; t < 3; t++) { + for (i = 0; i < 4; i++) { + TEAM_MEMBER_TABLE_PTR->active_team_rosters[t][i].flags = 0; + TEAM_MEMBER_TABLE_PTR->active_team_roster_member_idxs[t][i] = -1; + } + (&TEAM_MEMBER_TABLE_PTR->number_active_team_members_main)[t] = -1; + (&TEAM_MEMBER_TABLE_PTR->field_0x9874)[t] = 0; + } +} + +void RemoveActiveMembersFromSpecialEpisodeTeam(void) +{ + int i; + for (i = 0; i < 4; i++) { + TEAM_MEMBER_TABLE_PTR->active_team_rosters[1][i].flags = 0; + TEAM_MEMBER_TABLE_PTR->active_team_roster_member_idxs[1][i] = -1; + } + TEAM_MEMBER_TABLE_PTR->number_active_team_members_se = -1; + TEAM_MEMBER_TABLE_PTR->field_0x9875 = 0; +} + +void RemoveActiveMembersFromRescueTeam(void) +{ + int i; + for (i = 0; i < 4; i++) { + TEAM_MEMBER_TABLE_PTR->active_team_rosters[2][i].flags = 0; + TEAM_MEMBER_TABLE_PTR->active_team_roster_member_idxs[2][i] = -1; + } + TEAM_MEMBER_TABLE_PTR->number_active_team_members_rescue = -1; + TEAM_MEMBER_TABLE_PTR->field_0x9876 = 0; +} + +bool8 sub_02056228(s32 idx) +{ + if (idx == 0x55AA) { + return TRUE; + } + if (idx == 0x5AA5) { + return TRUE; + } + return idx < 0; +} + +bool8 CheckTeamMemberIdx(s32 idx) +{ + if (idx == 0x55AA) { + return TRUE; + } + return idx == 0x5AA5; +} extern struct team_member_table *TEAM_MEMBER_TABLE_PTR; diff --git a/src/main_0205B008.c b/src/main_0205B008.c index 5e4fc2b3..8b0b133c 100644 --- a/src/main_0205B008.c +++ b/src/main_0205B008.c @@ -4,14 +4,13 @@ extern u8 _020A34D2; -extern s32 sub_02055894(u32 b); extern s32 GetActiveRosterIndex(s32 member_idx); extern void sub_02053224(struct team_member *team_member, s32 member_idx, s32 arg2); extern bool8 sub_020564B0(s32 member_idx); extern void CreateMonsterSummaryFromTeamMember(struct monster_summary *monster_summary, struct team_member *team_member, bool8 is_leader); extern void sub_0205B39C(void *p0, void *p1); -void sub_0205B008(struct monster_summary *monster_summary, u32 b) +void sub_0205B008(struct monster_summary *monster_summary, struct ground_monster *b) { sub_0205B028(monster_summary, sub_02055894(b)); } diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index 07214f94..9a27a10d 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -34,8 +34,6 @@ #include "main_0200330C.h" #include "main_020307A4.h" #include "main_0202A66C.h" -extern void sub_02056094(char *dst, struct ground_monster *ground_monster, - bool8 is_leader); struct unk_0202A690 { char *field_0x0; s32 field_0x4; }; struct unk_0230A044 { s32 field_0x0; s16 field_0x4; }; @@ -119,7 +117,6 @@ extern s32 sub_02041A18(void); extern s32 sub_02041B7C(void); extern void sub_020420F4(void); extern s32 sub_02053D1C(u16 move_id, s16 monster_id); -extern s32 sub_02055FCC(s16 a, s16 b); extern s32 sub_020586F0(s16 a, s16 b); extern s32 ov11_02309EE4(struct unk_02309EE4 *out, s32 mode); @@ -137,7 +134,6 @@ extern void ov11_02310BDC(void); #define OV11_023090DC_CONST_2 0xA3A #endif -extern s32 sub_02055894(struct ground_monster *member); extern bool8 sub_020564B0(int idx); extern s32 vsprintf(u8 *str, const u8 *format, va_list ap); extern s8 CreateDialogueBox(s8); diff --git a/src/overlay_29_022E4B8C.c b/src/overlay_29_022E4B8C.c index 535da8ae..1978ce09 100644 --- a/src/overlay_29_022E4B8C.c +++ b/src/overlay_29_022E4B8C.c @@ -1,4 +1,6 @@ #include "overlay_29_022E4B8C.h" +#include "dg_effect.h" +#include "dungeon.h" extern void PlaySeByIdIfShouldDisplayEntity(struct entity *entity, s32 se_id); @@ -11,3 +13,245 @@ void ov29_022E4BA0(struct entity *entity) { PlaySeByIdIfShouldDisplayEntity(entity, 0x30E); } + +extern s32 GetEffectAnimationWanOffset(s32 id); +extern struct dungeon *DUNGEON_PTR[]; +extern s32 ov29_0230D618(s32 a); + +void ov29_022E4BB4(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x15, 1, GetEffectAnimationWanOffset(0x15), + 2, 0, -1, 0); +} + +void PlayAttractHitEffect(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0xF, 1, GetEffectAnimationWanOffset(0xF), + 2, 0, -1, 0); +} + +void ov29_022E4C4C(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x15, 1, 3, 2, 0, -1, 0); +} + +void ov29_022E4C84(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x1F7, 1, GetEffectAnimationWanOffset(0x1F7), + 2, 0, -1, 0); +} + +void ov29_022E4CD4(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x1F9, 1, GetEffectAnimationWanOffset(0x1F9), + 2, 0, -1, 0); +} + +void ov29_022E4D24(void) +{ + +} + +void PlayOffensiveStatDownEffect(struct entity *entity, struct StatIndex stat_index) +{ + if (stat_index.id == 0) { + PlayEffectAnimationEntity(entity, 0x194, 1, GetEffectAnimationWanOffset(0x194), + 2, 0, -1, 0); + } + else { + PlayEffectAnimationEntity(entity, 0x193, 1, GetEffectAnimationWanOffset(0x193), + 2, 0, -1, 0); + } +} + +void PlayDefensiveStatDownEffect(struct entity *entity, struct StatIndex stat_index) +{ + if (stat_index.id == 0) { + PlayEffectAnimationEntity(entity, 0x18F, 1, GetEffectAnimationWanOffset(0x18F), + 2, 0, -1, 0); + } + else { + PlayEffectAnimationEntity(entity, 0x191, 1, GetEffectAnimationWanOffset(0x191), + 2, 0, -1, 0); + } +} + +void PlayOffensiveStatUpEffect(struct entity *entity, struct StatIndex stat_index) +{ + if (stat_index.id == 0) { + PlayEffectAnimationEntity(entity, 0x1A9, 1, GetEffectAnimationWanOffset(0x1A9), + 2, 0, -1, 0); + } + else { + PlayEffectAnimationEntity(entity, 0x192, 1, GetEffectAnimationWanOffset(0x192), + 2, 0, -1, 0); + } +} + +void PlayDefensiveStatUpEffect(struct entity *entity, struct StatIndex stat_index) +{ + if (stat_index.id == 0) { + PlayEffectAnimationEntity(entity, 0x18E, 1, GetEffectAnimationWanOffset(0x18E), + 2, 0, -1, 0); + } + else { + PlayEffectAnimationEntity(entity, 0x190, 1, GetEffectAnimationWanOffset(0x190), + 2, 0, -1, 0); + } +} + +void PlayOffensiveStatMultiplierUpEffect(struct entity *entity, struct StatIndex stat_index) +{ + if (stat_index.id == 0) { + PlayEffectAnimationEntity(entity, 0x1A9, 1, GetEffectAnimationWanOffset(0x1A9), + 2, 0, -1, 0); + } + else { + PlayEffectAnimationEntity(entity, 0x192, 1, GetEffectAnimationWanOffset(0x192), + 2, 0, -1, 0); + } +} + +void PlayOffensiveStatMultiplierDownEffect(struct entity *entity, struct StatIndex stat_index) +{ + if (stat_index.id == 0) { + PlayEffectAnimationEntity(entity, 0x194, 1, GetEffectAnimationWanOffset(0x194), + 2, 0, -1, 0); + } + else { + PlayEffectAnimationEntity(entity, 0x193, 1, GetEffectAnimationWanOffset(0x193), + 2, 0, -1, 0); + } +} + +void PlayDefensiveStatMultiplierUpEffect(struct entity *entity, struct StatIndex stat_index) +{ + if (stat_index.id == 0) { + PlayEffectAnimationEntity(entity, 0x18E, 1, GetEffectAnimationWanOffset(0x18E), + 2, 0, -1, 0); + } + else { + PlayEffectAnimationEntity(entity, 0x190, 1, GetEffectAnimationWanOffset(0x190), + 2, 0, -1, 0); + } +} + +void PlayDefensiveStatMultiplierDownEffect(struct entity *entity, struct StatIndex stat_index) +{ + if (stat_index.id == 0) { + PlayEffectAnimationEntity(entity, 0x18F, 1, GetEffectAnimationWanOffset(0x18F), + 2, 0, -1, 0); + } + else { + PlayEffectAnimationEntity(entity, 0x191, 1, GetEffectAnimationWanOffset(0x191), + 2, 0, -1, 0); + } +} + +void PlayHitChanceUpEffect(struct entity *entity, struct StatIndex stat_index) +{ + if (stat_index.id == 0) { + PlayEffectAnimationEntity(entity, 0x18C, 1, GetEffectAnimationWanOffset(0x18C), + 2, 0, -1, 0); + } + else { + PlayEffectAnimationEntity(entity, 0xD, 1, GetEffectAnimationWanOffset(0xD), + 2, 0, -1, 0); + } +} + +void PlayHitChanceDownEffect(struct entity *entity, struct StatIndex stat_index) +{ + if (stat_index.id == 0) { + PlayEffectAnimationEntity(entity, 0x18D, 1, GetEffectAnimationWanOffset(0x18D), + 2, 0, -1, 0); + } + else { + PlayEffectAnimationEntity(entity, 0xE, 1, GetEffectAnimationWanOffset(0xE), + 2, 0, -1, 0); + } +} + +void PlayExclamationPointEffect__022E5D4C(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x143, 1, GetEffectAnimationWanOffset(0x143), + 2, 0, -1, 0); +} + +void ov29_022E53EC(void) +{ + +} + +void ov29_022E53F0(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x19, 1, GetEffectAnimationWanOffset(0x19), + 2, 0, -1, 0); +} + +void ov29_022E543C(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x15, 1, 3, 2, 0, -1, 0); +} + +void ov29_022E5474(void) +{ + +} + +void ov29_022E5478(struct entity *entity, struct unk_02308FE0 *damage_data) +{ + s32 id; + s32 v = damage_data->field_0x8; + + if (DUNGEON_PTR[0]->last_damage_calc.fire_move_ability_drop_activated) { + v = ov29_0230D618(v); + } + + switch (v) { + default: + case 0: + id = 8; + break; + case 1: + id = 9; + break; + case 2: + id = 0xA; + break; + case 3: + id = 0xB; + break; + } + + PlayEffectAnimationEntity(entity, id, 1, 3, 0, 1, -1, 0); +} + +void ov29_022E550C(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x13E, 1, GetEffectAnimationWanOffset(0x13E), + 2, 0, -1, 0); +} + +void ov29_022E555C(void) +{ + +} + +void ov29_022E5560(struct entity *a, struct entity *b, s32 c) +{ + if (c == 1) { + PlayEffectAnimationEntity(b, 0xF8, 1, GetEffectAnimationWanOffset(0xF8), + 2, 0, -1, 0); + } + else { + PlayEffectAnimationEntity(b, 0xF9, 1, GetEffectAnimationWanOffset(0xF9), + 2, 0, -1, 0); + } +} + +void ov29_022E55F0(struct entity *a, struct entity *b) +{ + PlayEffectAnimationEntity(b, 0x2A, 1, GetEffectAnimationWanOffset(0x2A), + 2, 0, -1, 0); +} diff --git a/src/overlay_29_022E9FC0.c b/src/overlay_29_022E9FC0.c index 5f5f58d1..02dcc368 100644 --- a/src/overlay_29_022E9FC0.c +++ b/src/overlay_29_022E9FC0.c @@ -1,7 +1,11 @@ #include "overlay_29_022E9FC0.h" - -extern void ov29_022EA2A4(u32 param_1); -extern void ov29_022EA324(u32 param_1); +#include "dg_camera.h" +#include "dungeon.h" +#include "dungeon_map_access.h" +#include "dungeon_util_static.h" +#include "main_0201BCCC.h" +#include "options.h" +#include "overlay_29_0234B104.h" struct unk_02353560 { u8 field_0x0; @@ -9,9 +13,76 @@ struct unk_02353560 { u8 field_0x2; u8 field_0x3; u8 field_0x4; + u8 field_0x5; + u8 field_0x6; + u8 field_0x7; + s32 field_0x8; + s32 field_0xc; }; +struct unk_0237C850 { + u32 field_0x0; + s32 field_0x4; + s32 field_0x8; + u8 field_0xc; + u8 field_0xd; + u8 field_0xe; + u8 field_0xf; + s32 field_0x10; + u8 field_0x14; + u8 field_0x15; + u8 field_0x16; + u8 field_0x17; + u8 field_0x18; + u8 field_0x19; + u8 field_0x1a; + u8 field_0x1b; + s16 field_0x1c; + u16 field_0x1e; + s32 field_0x20; + u8 field_0x24; + u8 field_0x25; + u8 field_0x26; + u8 field_0x27; + struct entity *field_0x28; + u32 field_0x2c; + s32 field_0x30; + s32 field_0x34; +}; + +extern struct dungeon *DUNGEON_PTR[2]; extern struct unk_02353560 ov29_02353560; +extern struct unk_0237C850 DUNGEON_FRAMES_PASSED; +extern u16 DUNGEON_BUTTON_INPUT[8]; +extern u8 *ov29_02353540; +extern struct unk_0201BCCC *OBJ_GRAPHICS_CONTROLS_PTR; + +extern void ov29_022DDEF8(void); +extern void InitWeirdMinimapMatrix(void); +extern void ov29_022DE638(s32 param_1); +extern void ov29_02339FF4(s32 param_1); +extern void ov29_0233A248(s32 param_1); +extern void UpdateMinimap(void); +extern void ChangeSimpleObjTexture(struct unk_oam_sub *obj, u8 *texture, s16 param_3, + s32 param_4, u8 param_5, u8 param_6); +extern void ov29_02335F40(s16 param_1, s16 param_2, s32 param_3, s16 param_4, + u16 param_5, s16 param_6, u8 param_7); +extern void ov29_0234B854(void); +extern void HandleTopScreenFades(void); +extern void UpdateCamera(s32 param_1); +extern void sub_02051E20(s16 param_1, s16 param_2, s32 param_3, s32 param_4); +extern void ov29_0230473C(void); +extern void DisplayMonstersAndItems(void); +extern void RenderWeather3D(void); +extern void ov29_022E8C10(void); +extern void FlashLeaderIcon(s32 param_1); +extern void DisplayUi(void); +extern bool8 ov29_022DE11C(void); +extern s32 GetAlertBoxLoadingStatus(void); +extern void ov29_022DE134(s32 param_1, s32 param_2, struct rgba *param_3, u8 param_4); +extern void ov29_022ED800(struct dungeon_generation_info *param_1, u8 param_2, + struct display_data *param_3); +extern void ov29_022DD8B4(struct position *param_1); u8 ov29_022E9FC0(void) { @@ -32,3 +103,345 @@ void AdvanceFrame(u32 param_1) ov29_022EA324(param_1); } } + +void ov29_022EA008(void) +{ + struct dungeon *dungeon; + struct tile *tile; + u8 room; + + if (DUNGEON_PTR[0] == NULL) { + return; + } + if (ov29_02353560.field_0x3) { + ov29_0234B854(); + HandleTopScreenFades(); + if (DUNGEON_PTR[0] != NULL) { + UpdateCamera(1); + sub_02051E20(DUNGEON_PTR[0]->display_data.camera_pixel_pos.x, + DUNGEON_PTR[0]->display_data.camera_pixel_pos.y + - DUNGEON_PTR[0]->display_data.screen_shake_offset, + 1, 0); + if (DUNGEON_PTR[0]->display_data.team_menu_or_grid) { + DUNGEON_PTR[0]->display_data.field_0x20 = 2; + sub_02051E20(DUNGEON_PTR[0]->display_data.camera_pixel_pos.x, + DUNGEON_PTR[0]->display_data.camera_pixel_pos.y + - DUNGEON_PTR[0]->display_data.screen_shake_offset, + 0, 0); + } + else { + DUNGEON_PTR[0]->display_data.field_0x20 = 3; + sub_02051E20(0, 0, 0, 0); + } + } + ov29_0230473C(); + DisplayMonstersAndItems(); + ov29_022E335C(); + if (DUNGEON_PTR[0]->field_0x1c < 100) { + DUNGEON_PTR[0]->field_0x1c++; + } + if (DUNGEON_FRAMES_PASSED.field_0x4 == 0 || DUNGEON_FRAMES_PASSED.field_0x4 == 3 + || DUNGEON_FRAMES_PASSED.field_0x4 == 12) { + FlashLeaderIcon(0); + } + else if (GetTopScreenOption() == 3) { + FlashLeaderIcon(1); + } + AnimateWaterShadows(); + ov29_022EA80C(); + DisplayUi(); + if (ov29_02353560.field_0x0) { + if (DUNGEON_PTR[0]->display_data.field_0x2E) { + if (ov29_022DE11C()) { + DUNGEON_PTR[0]->display_data.field_0x2E = 0; + ov29_02353560.field_0xc = ov29_02353560.field_0x8; + } + } + else { + ov29_02353560.field_0xc--; + if (ov29_02353560.field_0xc <= 0) { + DUNGEON_PTR[0]->display_data.field_0x2E = 1; + } + } + } + if (DUNGEON_PTR[0]->display_data.field_0x2E && GetAlertBoxLoadingStatus() != 3) { + ov29_022DE134(0xA0, 0x20, DUNGEON_PTR[0]->color_table, + ov29_02353560.field_0x2); + } + tile = GetTile(DUNGEON_PTR[0]->display_data.camera_pos.x, + DUNGEON_PTR[0]->display_data.camera_pos.y); + if (tile != NULL) { + room = tile->room; + dungeon = DUNGEON_PTR[0]; + ov29_022ED800(dungeon != NULL ? &dungeon->gen_info : NULL, room, + &dungeon->display_data); + } + RenderWeather3D(); + ov29_022E8C10(); + ov29_022DD8B4(&DUNGEON_PTR[0]->display_data.camera_pixel_pos); + } + DUNGEON_FRAMES_PASSED.field_0x0++; +} + +void ov29_022EA2A4(u32 param_1) +{ + if (DUNGEON_PTR[0] == NULL) { + ov29_022DDEF8(); + return; + } + if (ov29_02353560.field_0x6) { + DUNGEON_FRAMES_PASSED.field_0x10++; + } + ov29_022DDEF8(); + DUNGEON_PTR[0]->display_data.field_0x2C = 0; + InitWeirdMinimapMatrix(); + if (ov29_02353560.field_0x6) { + DUNGEON_FRAMES_PASSED.field_0x10--; + } +} + +void ov29_022EA324(u32 param_1) +{ + if (ov29_02353560.field_0x6) { + DUNGEON_FRAMES_PASSED.field_0x10++; + } + ov29_022DDEF8(); + if (ov29_02353560.field_0x6) { + DUNGEON_FRAMES_PASSED.field_0x10--; + } +} + +void ov29_022EA370(s32 a, s32 b) +{ + while (a != 0) { + if (ov29_02353560.field_0x3) { + ov29_022EA2A4(b); + } + else { + ov29_022EA324(b); + } + a--; + } +} + +void ov29_022EA3B4(s32 param_1) +{ + do { + if (ov29_02353560.field_0x3) { + ov29_022EA2A4(param_1); + } + else { + ov29_022EA324(param_1); + } + } while (DUNGEON_BUTTON_INPUT[0] & 0xF0); +} + +void ov29_022EA3F8(void) +{ + ov29_022DE638(0x100); +} + +s32 ov29_022EA408(void) +{ + return DUNGEON_FRAMES_PASSED.field_0x4; +} + +void ov29_022EA418(u8 param_1) +{ + ov29_02353560.field_0x4 = param_1; +} + +void UnkMapRelatedFunc(s32 switch_case, u32 param_2) +{ + if (switch_case == DUNGEON_FRAMES_PASSED.field_0x4) { + return; + } + switch (switch_case) { + case 1: + if (ov29_02353560.field_0x3) { + ov29_0234B1A4(0); + } + break; + case 0: + if (ov29_02353560.field_0x3 && !ov29_02353560.field_0x4) { + UpdateMinimap(); + ov29_02339FF4(0); + } + break; + case 3: + if (ov29_02353560.field_0x3 && !ov29_02353560.field_0x4) { + ov29_02339FF4(1); + } + break; + case 6: + if (ov29_02353560.field_0x3) { + ov29_0234B1A4(0); + } + break; + case 7: + if (ov29_02353560.field_0x3) { + ov29_0234B1A4(0); + } + break; + case 2: + case 4: + if (ov29_02353560.field_0x3) { + ov29_0234B1A4(0); + if (GetBottomScreenOption()) { + ov29_0233A248(0); + } + } + break; + case 5: + if (ov29_02353560.field_0x3) { + ov29_0234B1A4(0); + ov29_0233A248(0); + } + break; + case 13: + if (ov29_02353560.field_0x3 && !ov29_02353560.field_0x4) { + UpdateMinimap(); + ov29_02339FF4(1); + } + switch_case = 0; + break; + case 8: + if (ov29_02353560.field_0x3) { + ov29_0234B1A4(0); + } + break; + case 9: + if (ov29_02353560.field_0x3) { + ov29_0234B1A4(0); + } + break; + case 11: + if (ov29_02353560.field_0x3) { + ov29_0234B1A4(0); + } + break; + case 999: + break; + } + DUNGEON_FRAMES_PASSED.field_0x4 = switch_case; +} + +void ov29_022EA62C(void) +{ + DUNGEON_FRAMES_PASSED.field_0x4 = 10; + ov29_0234B1A4(FALSE); +} + +void AnimateWaterShadows(void) +{ + s32 frame; + + DUNGEON_FRAMES_PASSED.field_0x8++; + if (DUNGEON_FRAMES_PASSED.field_0x8 < 0) { + DUNGEON_FRAMES_PASSED.field_0x8 = 0; + } + if (DUNGEON_FRAMES_PASSED.field_0x8 >= 12) { + DUNGEON_FRAMES_PASSED.field_0x8 = 0; + } + frame = DUNGEON_FRAMES_PASSED.field_0x8 / 4 * 3; + ChangeSimpleObjTexture(OBJ_GRAPHICS_CONTROLS_PTR->field_0x0, + ov29_02353540 + frame * 0x100, 0x1E8, 0x100, 0, 0xB); + ChangeSimpleObjTexture(OBJ_GRAPHICS_CONTROLS_PTR->field_0x0, + ov29_02353540 + (frame * 0x100 + 0x100), 0x1EA, 0x200, + 0, 0xB); +} + +void DisplayAnimatedNumbers(s32 amount, struct entity *entity, bool8 display_sign, + s32 number_color) +{ + s32 i; + + if (amount == 0) { + return; + } + if (DUNGEON_PTR[0]->display_data.blinded) { + return; + } + for (i = 0; i < 20; i++) { + if (DUNGEON_FRAMES_PASSED.field_0x1c == 0) { + break; + } + if (ov29_02353560.field_0x3) { + ov29_022EA2A4(0x29); + } + else { + ov29_022EA324(0x29); + } + } + DUNGEON_FRAMES_PASSED.field_0x20 = amount; + DUNGEON_FRAMES_PASSED.field_0x24 = display_sign; + DUNGEON_FRAMES_PASSED.field_0x1c = 60; + DUNGEON_FRAMES_PASSED.field_0x28 = entity; + DUNGEON_FRAMES_PASSED.field_0x2c = entity->spawn_genid; + DUNGEON_FRAMES_PASSED.field_0x30 = 0; + DUNGEON_FRAMES_PASSED.field_0x34 = 0; + if (number_color < 0) { + if (amount < -999) { + DUNGEON_FRAMES_PASSED.field_0x1e = 6; + } + else if (amount >= 0) { + DUNGEON_FRAMES_PASSED.field_0x1e = 10; + } + else { + DUNGEON_FRAMES_PASSED.field_0x1e = 3; + } + } + else { + DUNGEON_FRAMES_PASSED.field_0x1e = number_color; + } +} + +void ov29_022EA80C(void) +{ + const struct unk_0237C850 *cframes; + struct entity *entity; + struct monster *info; + bool8 valid; + s32 x; + s32 y; + s32 alpha; + + if (DUNGEON_FRAMES_PASSED.field_0x1c == 0) { + return; + } + if (DUNGEON_FRAMES_PASSED.field_0x28 == NULL) { + valid = FALSE; + } + else { + valid = GetEntityType(DUNGEON_FRAMES_PASSED.field_0x28) != ENTITY_NOTHING; + } + if (!valid) { + DUNGEON_FRAMES_PASSED.field_0x1c = 0; + return; + } + cframes = &DUNGEON_FRAMES_PASSED; + entity = cframes->field_0x28; + if (DUNGEON_FRAMES_PASSED.field_0x2c != entity->spawn_genid) { + DUNGEON_FRAMES_PASSED.field_0x1c = 0; + return; + } + DUNGEON_FRAMES_PASSED.field_0x1c--; + DUNGEON_FRAMES_PASSED.field_0x34 -= 0x2E; + info = GetEntInfo(entity); + x = info->pixel_pos.x + (DUNGEON_FRAMES_PASSED.field_0x30 >> 8) + - DUNGEON_PTR[0]->display_data.camera_pixel_pos.x; + y = info->pixel_pos.y + (DUNGEON_FRAMES_PASSED.field_0x34 >> 8) - 0x18 + - DUNGEON_PTR[0]->display_data.camera_pixel_pos.y; + if (x < -0x20 || y < -8) { + return; + } + if (x >= 0xFF || y >= 0xC0) { + return; + } + alpha = 0xFF; + if (DUNGEON_FRAMES_PASSED.field_0x1c < 0x1F) { + alpha = DUNGEON_FRAMES_PASSED.field_0x1c * 0xFF / 0x1F; + } + ov29_02335F40(x, y, 0xFF, alpha, DUNGEON_FRAMES_PASSED.field_0x1e, + DUNGEON_FRAMES_PASSED.field_0x20, DUNGEON_FRAMES_PASSED.field_0x24); +} diff --git a/src/overlay_29_022F0EDC.c b/src/overlay_29_022F0EDC.c index a260dc11..1caba7f9 100644 --- a/src/overlay_29_022F0EDC.c +++ b/src/overlay_29_022F0EDC.c @@ -74,7 +74,6 @@ extern s32 ShouldLeaderKeepRunning(); extern s32 StairsMenuAfterStep(); extern s32 TalkToTeamMemberInFront(); extern s32 TryPointCameraToMonster(); -extern void UnkMapRelatedFunc(u32, u32); extern s32 WaitUntilAlertBoxPauseIsOver(); extern s32 YesNoMenu(); extern s32 abs(); @@ -82,8 +81,6 @@ extern s32 ov29_022E0B44(); extern void ov29_022E0C2C(u32); extern s32 ov29_022E0C3C(); extern void ov29_022E81F8(void); -extern s32 ov29_022EA370(); -extern s32 ov29_022EA3B4(); extern s32 ov29_022EB944(); extern s32 ov29_022F0C1C(); extern s32 ov29_022F0C3C(); diff --git a/src/overlay_29_023000E4.c b/src/overlay_29_023000E4.c index 539dfe32..9ce05ec5 100644 --- a/src/overlay_29_023000E4.c +++ b/src/overlay_29_023000E4.c @@ -25,7 +25,6 @@ enum display_name_type GetMonsterDisplayNameType(struct monster *monster) { extern void GetNameWithGender(char *dst, s16 monster_id, char color_id); extern struct ground_monster *GetExplorerMazeMonster(u8 entry_number); -extern void GetRecoloredGroundMonsterName(char *dst, struct ground_monster *ground_monster, u8 unk); extern void GetRecoloredTeamMemberName(char *dst, struct team_member *team_member); void GetMonsterName(char *buffer, struct monster *target_info) { diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index b16dab34..4aef4509 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -65,6 +65,7 @@ #include "main_02056294.h" #include "overlay_29_022FBBEC.h" #include "special_move_types.h" +#include "overlay_29_0230BBAC.h" struct unk_023535DC { u8 field_0x0; @@ -85,8 +86,6 @@ struct unk_022C593C { }; extern const struct StatIndex ATK_STAT_IDX; -extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); -extern bool8 IsEitherMonsterInvalid(struct entity *a, struct entity *b); extern void ResetDamageData(struct unk_02308FE0 *damage_data); extern void ov29_022E57D4(struct entity *entity); extern void ov29_022E5E84(struct entity *a, struct entity *b); @@ -108,7 +107,6 @@ extern s16 ov10_022C4638; extern s16 ov10_022C467C; extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); extern void ChangeMonsterAnimationToIdle(struct entity* monster, enum direction_id direction); -extern void DisplayAnimatedNumbers(s32 amount, struct entity *entity, bool8 display_sign, s32 number_color); extern void EndInvisibleClassStatus(struct entity* user, struct entity* target, bool8 no_slip_message); extern int EndLeechSeedStatusForAllTargets(); extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity* user, struct entity* target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); @@ -126,7 +124,6 @@ extern void RestoreRandomMovePP(struct entity* user, struct entity* target, s32 extern void SubInitMonster(struct monster* monster, bool8 flag); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); -extern void UpdateShopkeeperModeAfterAttack(struct entity* attacker, struct entity* defender); extern s32 abs(s32 n); extern int ov10_022BDC68(); extern int TerminateEffectWrapper(); @@ -134,15 +131,10 @@ extern int ov10_022BF964(); extern int ov29_022E5478(); extern int ov29_022E550C(); extern void ov29_022E81F8(void); -extern void ov29_022EA370(s32 a, s32 b); extern int ov29_022F9AF4(); extern int ov29_02303E0C(); extern int ov29_02304830(); extern int ov29_02307C48(); -extern int ov29_0230D628(); -extern int ov29_0230D688(); -extern int ov29_0230D7D4(); - extern struct unk_023528A4 TYPE_DAMAGE_NEGATING_EXCLUSIVE_ITEM_EFFECTS[]; extern s16 SET_DAMAGE_STATUS_DAMAGE; extern s16 ov10_022C45C4; diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c index e27c4bbf..53c211a9 100644 --- a/src/overlay_29_0230BBAC.c +++ b/src/overlay_29_0230BBAC.c @@ -32,6 +32,14 @@ #include "overlay_29_0231E9F0.h" #include "dungeon_logic_2.h" #include "moves_3.h" +#include "main_0200330C.h" +#include "main_0200F14C.h" +#include "main_0200F370.h" +#include "main_020502B0.h" +#include "overlay_29_02344BE4.h" +#include "dg_effect.h" +#include "overlay_29_022E9FC0.h" +#include "dungeon_logic_3.h" extern struct dungeon *DUNGEON_PTR; extern u8 GetMonsterGenderVeneer(s16 monster_id); @@ -41,7 +49,6 @@ extern void PlayEffectAnimation0x1A9__022E617C(struct entity *entity); extern void PlayEffectAnimation0x18E(struct entity *entity); extern bool8 FixedPoint64CmpLt(const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern void DivideFixedPoint64(struct fixed_point_64 *out, struct fixed_point_64 *a, struct fixed_point_64 *b); -extern void ResetDamageCalcDiagnostics(void); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern void ResetDamageData(struct unk_02308FE0 *damage_data); extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); @@ -76,6 +83,14 @@ extern const struct fixed_point_64 DAMAGE_FORMULA_MIN_BASE; extern const struct fixed_point_64 DAMAGE_MULTIPLIER_0_5; extern const struct fixed_point_64 DAMAGE_MULTIPLIER_1_5; extern const struct fixed_point_64 DAMAGE_MULTIPLIER_2; +extern void CreateTemporaryEntity(struct entity *entity); +extern void PointCameraToMonster(struct entity *entity, bool8 update_minimap); +extern void TerminateEffectWrapper(s32 param_1); +extern bool8 ov10_022BF964(s32 param_1); +extern s16 ov10_022C45B4; +extern s16 ov29_023535D4; +extern const s32 ov29_02352894[4]; +extern const s32 TYPE_MATCHUP_COMBINATOR_TABLE[4][4]; #ifdef JAPAN #define MESSAGE_C53 0x992 @@ -93,6 +108,22 @@ extern const struct fixed_point_64 DAMAGE_MULTIPLIER_2; #define MESSAGE_DC1 0xDC1 #endif +#ifdef JAPAN +#define MESSAGE_F2B 0x2492 +#define MESSAGE_F2C 0x2493 +#define MESSAGE_F2D 0x2494 +#define MESSAGE_F2E 0x2495 +#define MESSAGE_F2F 0x2496 +#define MESSAGE_F30 0x2497 +#else +#define MESSAGE_F2B 0xF2B +#define MESSAGE_F2C 0xF2C +#define MESSAGE_F2D 0xF2D +#define MESSAGE_F2E 0xF2E +#define MESSAGE_F2F 0xF2F +#define MESSAGE_F30 0xF30 +#endif + void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id attack_type, s32 power, s32 crit_chance, struct unk_02308FE0 *damage_out, s32 damage_mult, enum move_id move_id, s32 a9) @@ -724,3 +755,438 @@ void CalcDamage(struct entity *attacker, struct entity *defender, enum type_id a } mon2->anger_point_flag = damage_out->field_0xe; } + +void ov29_0230D088(struct entity *attacker, struct entity *defender, enum type_id attack_type, + u8 category, s32 power, struct unk_02308FE0 *damage_out) +{ + struct fixed_point_64 fp2; + struct fixed_point_64 fp1; + s32 clamped; + + clamped = power; + if (clamped < 1) { + clamped = 1; + } + if (clamped > 999) { + clamped = 999; + } + damage_out->field_0xc = attack_type; + damage_out->field_0xd = category; + CalcTypeBasedDamageEffects(&fp2, attacker, defender, clamped, attack_type, damage_out, FALSE); + IntToFixedPoint64(&fp1, clamped); + MultiplyFixedPoint64(&fp1, &fp1, &fp2); + damage_out->field_0x0 = FixedPoint64ToInt(&fp1); + damage_out->field_0x4 = 0; +} + +void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a3, s16 damage_source) +{ + struct unk_02308FE0 damage_data; + struct entity temp; + + ResetDamageData(&damage_data); + CreateTemporaryEntity(&temp); + damage_data.field_0x0 = damage; + damage_data.field_0x4 = a3; + damage_data.field_0x8 = 2; + damage_data.field_0xc = 0; + damage_data.field_0xe = FALSE; + damage_data.field_0xf = FALSE; + damage_data.field_0x10 = FALSE; + ApplyDamageAndEffects(&temp, entity, &damage_data, 0, 0, damage_source, 0, 0); +} + +void CalcRecoilDamageFixed(struct entity *entity, s32 fixed_damage, s32 a3, bool8 *out_flag, + s32 a5, enum type_id attack_type, s16 damage_source, s32 a8, s32 a9, + s32 a10) +{ + if (!EntityIsValid__02308FBC(entity)) { + return; + } + if (entity->type == ENTITY_MONSTER) { + if (GetEntInfo(entity)->hp == 0) { + return; + } + if (AbilityIsActiveVeneer(entity, ABILITY_RECKLESS)) { + fixed_damage = MultiplyByFixedPoint(fixed_damage << 8, 0x180) >> 8; + } + } + CalcDamageFixed(entity, entity, fixed_damage, a3, out_flag, attack_type, 3, damage_source, + a8, a9, a10); +} + +void CalcDamageFixed(struct entity *attacker, struct entity *defender, s32 fixed_damage, s32 a4, + bool8 *out_flag, enum type_id attack_type, u8 category, s16 damage_source, + s32 a9, s32 a10, s32 a11) +{ + s32 matchups[2]; + struct unk_02308FE0 damage_data; + s32 i; + + ResetDamageData(&damage_data); + damage_data.field_0x8 = 2; + damage_data.field_0x4 = a9; + damage_data.field_0xc = attack_type; + damage_data.field_0xe = FALSE; + damage_data.field_0xf = FALSE; + damage_data.field_0xd = category; + if (attack_type != TYPE_NONE) { + for (i = 0; i < 2; i++) { + matchups[i] = GetTypeMatchup(attacker, defender, i, attack_type); + } +#ifdef JAPAN + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_WONDER_GUARD) +#else + if (DefenderAbilityIsActive__0230A940(attacker, defender, ABILITY_WONDER_GUARD, TRUE) +#endif + && TYPE_MATCHUP_COMBINATOR_TABLE[matchups[0]][matchups[1]] + != MATCHUP_SUPER_EFFECTIVE) { + fixed_damage = 0; + } + } + fixed_damage <<= 8; + if (damage_source == DAMAGE_SOURCE_THROWN_ITEM + && IqSkillIsEnabled(attacker, IQ_POWER_PITCHER)) { + fixed_damage = MultiplyByFixedPoint(fixed_damage, POWER_PITCHER_DAMAGE_MULTIPLIER); + } + damage_data.field_0x0 = RoundUpDiv256(fixed_damage); + if (fixed_damage == 0) { + damage_data.field_0x10 = TRUE; + } else { + damage_data.field_0x10 = FALSE; + } + ApplyDamageAndEffects(attacker, defender, &damage_data, 0, a4, damage_source, a10, a11); + if (out_flag != NULL) { + *out_flag = damage_data.field_0x10; + } +} + +void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s16 fixed_damage, + s32 a4, bool8 *out_flag, enum type_id attack_type, + s16 damage_source, s32 a8, s32 a9, s32 a10) +{ + CalcDamageFixed(attacker, defender, fixed_damage, a4, out_flag, attack_type, 3, + damage_source, a8, a9, a10); +} + +void CalcDamageFixedWrapper(struct entity *attacker, struct entity *defender, s32 fixed_damage, + s32 a4, bool8 *out_flag, enum type_id attack_type, u8 category, + s16 damage_source, s32 a9, s32 a10, s32 a11) +{ + CalcDamageFixed(attacker, defender, fixed_damage, a4, out_flag, attack_type, category, + damage_source, a9, a10, a11); +} + +void UpdateShopkeeperModeAfterAttack(struct entity *attacker, struct entity *defender) +{ + struct monster *defender_info = GetEntInfo(defender); + + if (defender_info->shopkeeper != SHOPKEEPER_MODE_NORMAL + && attacker->type == ENTITY_MONSTER) { + if (GetEntInfo(attacker)->is_not_team_member) { + defender_info->shopkeeper = SHOPKEEPER_MODE_ATTACK_ENEMIES; + } else { + defender_info->shopkeeper = SHOPKEEPER_MODE_ATTACK_TEAM; + } + } +} + +void UpdateShopkeeperModeAfterTrap(struct entity *entity, bool8 is_enemy) +{ + struct monster *info = GetEntInfo(entity); + + if (info->shopkeeper != SHOPKEEPER_MODE_NORMAL) { + if (is_enemy) { + info->shopkeeper = SHOPKEEPER_MODE_ATTACK_ENEMIES; + } else { + info->shopkeeper = SHOPKEEPER_MODE_ATTACK_TEAM; + } + } +} + +bool8 ov29_0230D4A4(struct entity *attacker, struct entity *defender, enum type_id attack_type) +{ + struct monster *info = GetEntInfo(defender); + s32 i; + + if (MonsterIsType(defender, TYPE_GHOST) + && (attack_type == TYPE_NORMAL || attack_type == TYPE_FIGHTING) && !info->exposed) { + return FALSE; + } + for (i = 0; i < 2; i++) { + if (GetTypeMatchup(attacker, defender, i, attack_type) == MATCHUP_IMMUNE) { + return FALSE; + } + } + return TRUE; +} + +void ResetDamageCalcDiagnostics(void) +{ + struct damage_calc_diag *diag = &DUNGEON_PTR->last_damage_calc; + + MemZero((u8 *)diag, sizeof(struct damage_calc_diag)); + diag->move_type = TYPE_NONE; + diag->move_category = 0; + diag->move_indiv_type_matchups[0] = MATCHUP_IMMUNE; + diag->move_indiv_type_matchups[1] = MATCHUP_IMMUNE; + diag->offensive_stat_stage = 10; + diag->defensive_stat_stage = 10; + diag->offensive_stat = 1; + diag->defensive_stat = 1; + diag->flash_fire_boost = 0; + diag->defense_calc = 0; + diag->offense_calc = 0; + diag->attacker_level = 0; + diag->damage_calc_flv = 0; + diag->damage_calc = 0; + diag->damage_calc_random_mult_pct = 0; + diag->static_damage_mult = 0; + diag->item_atk_modifier = 0; + diag->item_sp_atk_modifier = 0; + diag->item_def_modifier = 0; + diag->item_sp_def_modifier = 0; + diag->iq_skill_offense_modifier = 0; + diag->iq_skill_defense_modifier = 0; + diag->scope_lens_or_sharpshooter_activated = FALSE; + diag->patsy_band_activated = FALSE; + diag->half_physical_damage_activated = FALSE; + diag->half_special_damage_activated = FALSE; + diag->focus_energy_activated = FALSE; + diag->type_advantage_master_activated = FALSE; + diag->cloudy_drop_activated = FALSE; + diag->sunny_multiplier_activated = FALSE; + diag->rain_multiplier_activated = FALSE; + diag->fire_move_ability_drop_activated = FALSE; + diag->flash_fire_activated = FALSE; + diag->levitate_activated = FALSE; + diag->torrent_boost_activated = FALSE; + diag->overgrow_boost_activated = FALSE; + diag->swarm_boost_activated = FALSE; + diag->fire_move_ability_boost_activated = FALSE; + diag->scrappy_activated = FALSE; + diag->stab_boost_activated = FALSE; + diag->electric_move_dampened = FALSE; + diag->water_sport_drop_activated = FALSE; + diag->charge_boost_activated = FALSE; + diag->field_0x4f = 0; + diag->ghost_immunity_activated = FALSE; + diag->skull_bash_defense_boost_activated = FALSE; + diag->ability_offense_modifier = 0; + diag->ability_defense_modifier = 0; +} + +s32 ov29_0230D618(s32 idx) +{ + return ov29_02352894[idx]; +} + +void ov29_0230D628(struct entity *entity) +{ + if (DUNGEON_PTR->display_data.camera_target == entity) { + PointCameraToMonster(entity, TRUE); + } +} + +bool8 IsEitherMonsterInvalid(struct entity *a, struct entity *b) +{ + if (!EntityIsValid__02308FBC(a) || !EntityIsValid__02308FBC(b)) { + return TRUE; + } + return FALSE; +} + +void ov29_0230D688(struct item *item) +{ + struct item old_item; + s16 idx; + + old_item = *item; + GenerateStandardItem(item, ITEM_PLAIN_SEED, 2); + SetItemAcquired(item); + item->held_by = old_item.held_by; + if (item->held_by != 0) { + idx = GetEquivItemIndex(&old_item); + if (idx >= 0) { + *GetItemAtIdx(idx) = *item; + } + } +} + +bool8 ov29_0230D704(struct entity *attacker, struct entity *defender, s32 a3) +{ + return FALSE; +} + +bool8 ov29_0230D70C(struct entity *attacker, struct entity *defender, s32 a3) +{ + return DungeonRandInt(100) < ov10_022C45B4; +} + +bool8 ov29_0230D738(struct entity *attacker, struct entity *defender, s32 a3) +{ + if (a3 == 0 && DungeonRandInt(100) < ov10_022C45B4) { + return TRUE; + } + return FALSE; +} + +bool8 ov29_0230D76C(struct entity *attacker, struct entity *defender, s32 a3) +{ + if (!IsMonster__0230A994(attacker) || !IsMonster__0230A994(defender)) { + return FALSE; + } + if (!GendersNotEqualNotGenderless(GetEntInfo(attacker)->id, GetEntInfo(defender)->id)) { + return FALSE; + } + return ov29_0230D738(attacker, defender, a3); +} + +void ov29_0230D7D4(struct entity *entity) +{ + const s16 *prev; + s16 anim_id; + + prev = &ov29_023535D4; + if (*prev != -1) { + TerminateEffectWrapper(ov29_023535D4); + ov29_023535D4 = -1; + } + anim_id = PlayEffectAnimationEntity(entity, 0x2B7, 0, 3, 0, 1, 0, NULL); + if (anim_id != -1) { + while (ov10_022BF964(anim_id)) { + AdvanceFrame(0x18); + } + TerminateEffectWrapper(anim_id); + } +} + +void SwapDefensiveStages(struct entity *user, struct entity *target, s32 log_message) +{ + struct monster *user_info = GetEntInfo(user); + struct monster *target_info = GetEntInfo(target); + s16 def; + s16 sp_def; + + def = user_info->stat_modifiers.defensive_stages[0]; + sp_def = user_info->stat_modifiers.defensive_stages[1]; + user_info->stat_modifiers.defensive_stages[0] = + target_info->stat_modifiers.defensive_stages[0]; + user_info->stat_modifiers.defensive_stages[1] = + target_info->stat_modifiers.defensive_stages[1]; + target_info->stat_modifiers.defensive_stages[0] = def; + target_info->stat_modifiers.defensive_stages[1] = sp_def; + if (log_message) { + SubstitutePlaceholderStringTags(0, user, 0); + SubstitutePlaceholderStringTags(1, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_F2D); + } +} + +void SwapDefensiveMultipliers(struct entity *user, struct entity *target, s32 log_message) +{ + struct monster *user_info = GetEntInfo(user); + struct monster *target_info = GetEntInfo(target); + fx32_8 def; + fx32_8 sp_def; + + def = user_info->stat_modifiers.defensive_multipliers[0]; + sp_def = user_info->stat_modifiers.defensive_multipliers[1]; + user_info->stat_modifiers.defensive_multipliers[0] = + target_info->stat_modifiers.defensive_multipliers[0]; + user_info->stat_modifiers.defensive_multipliers[1] = + target_info->stat_modifiers.defensive_multipliers[1]; + target_info->stat_modifiers.defensive_multipliers[0] = def; + target_info->stat_modifiers.defensive_multipliers[1] = sp_def; + if (log_message) { + SubstitutePlaceholderStringTags(0, user, 0); + SubstitutePlaceholderStringTags(1, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_F2E); + } +} + +void SwapOffensiveStages(struct entity *user, struct entity *target, s32 log_message) +{ + struct monster *user_info = GetEntInfo(user); + struct monster *target_info = GetEntInfo(target); + s16 atk; + s16 sp_atk; + + atk = user_info->stat_modifiers.offensive_stages[0]; + sp_atk = user_info->stat_modifiers.offensive_stages[1]; + user_info->stat_modifiers.offensive_stages[0] = + target_info->stat_modifiers.offensive_stages[0]; + user_info->stat_modifiers.offensive_stages[1] = + target_info->stat_modifiers.offensive_stages[1]; + target_info->stat_modifiers.offensive_stages[0] = atk; + target_info->stat_modifiers.offensive_stages[1] = sp_atk; + if (log_message) { + SubstitutePlaceholderStringTags(0, user, 0); + SubstitutePlaceholderStringTags(1, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_F2B); + } +} + +void SwapOffensiveMultipliers(struct entity *user, struct entity *target, s32 log_message) +{ + struct monster *user_info = GetEntInfo(user); + struct monster *target_info = GetEntInfo(target); + fx32_8 atk; + fx32_8 sp_atk; + + atk = user_info->stat_modifiers.offensive_multipliers[0]; + sp_atk = user_info->stat_modifiers.offensive_multipliers[1]; + user_info->stat_modifiers.offensive_multipliers[0] = + target_info->stat_modifiers.offensive_multipliers[0]; + user_info->stat_modifiers.offensive_multipliers[1] = + target_info->stat_modifiers.offensive_multipliers[1]; + target_info->stat_modifiers.offensive_multipliers[0] = atk; + target_info->stat_modifiers.offensive_multipliers[1] = sp_atk; + if (log_message) { + SubstitutePlaceholderStringTags(0, user, 0); + SubstitutePlaceholderStringTags(1, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_F2C); + } +} + +void SwapHitChanceStages(struct entity *user, struct entity *target, s32 log_message) +{ + struct monster *user_info = GetEntInfo(user); + struct monster *target_info = GetEntInfo(target); + s16 accuracy; + s16 evasion; + + accuracy = user_info->stat_modifiers.hit_chance_stages[0]; + evasion = user_info->stat_modifiers.hit_chance_stages[1]; + user_info->stat_modifiers.hit_chance_stages[0] = + target_info->stat_modifiers.hit_chance_stages[0]; + user_info->stat_modifiers.hit_chance_stages[1] = + target_info->stat_modifiers.hit_chance_stages[1]; + target_info->stat_modifiers.hit_chance_stages[0] = accuracy; + target_info->stat_modifiers.hit_chance_stages[1] = evasion; + if (log_message) { + SubstitutePlaceholderStringTags(0, user, 0); + SubstitutePlaceholderStringTags(1, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_F2F); + } +} + +void SwapUserAtkAndDefModifiers(struct entity *user, struct entity *target, s32 log_message) +{ + struct monster *user_info = GetEntInfo(user); + fx32_8 atk_mult; + s16 atk; + + atk_mult = user_info->stat_modifiers.offensive_multipliers[0]; + atk = user_info->stat_modifiers.offensive_stages[0]; + user_info->stat_modifiers.offensive_multipliers[0] = + user_info->stat_modifiers.defensive_multipliers[0]; + user_info->stat_modifiers.offensive_stages[0] = + user_info->stat_modifiers.defensive_stages[0]; + user_info->stat_modifiers.defensive_multipliers[0] = atk_mult; + user_info->stat_modifiers.defensive_stages[0] = atk; + if (log_message) { + SubstitutePlaceholderStringTags(0, user, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_F30); + } +} diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index 5cebe33b..870edcac 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -30,6 +30,7 @@ #include "overlay_29_0234B104.h" #include "overlay_29_023350D8.h" #include "dungeon_logic_4.h" +#include "overlay_29_0230BBAC.h" extern s16 ov10_022C4BE4[20]; extern void ov29_0230FB30(struct entity *entity); @@ -61,8 +62,6 @@ extern void ov29_0230FB30(struct entity *entity); extern bool8 ov29_022E34A8_EU(struct entity *entity); #endif - -extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); diff --git a/src/overlay_29_0231B194.c b/src/overlay_29_0231B194.c index ea02ac4b..a79fcfb0 100644 --- a/src/overlay_29_0231B194.c +++ b/src/overlay_29_0231B194.c @@ -4,10 +4,10 @@ #include "dungeon_visibility.h" #include "overlay_29_0231B318.h" #include "overlay_29_0234B024.h" +#include "overlay_29_0230BBAC.h" extern struct dungeon *DUNGEON_PTR; extern const s16 ov10_022C4530; -extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); bool8 EntityIsValid__0231B194(struct entity *entity) diff --git a/src/overlay_29_0231CBC8.c b/src/overlay_29_0231CBC8.c index e3ad1ebd..b9e2a30e 100644 --- a/src/overlay_29_0231CBC8.c +++ b/src/overlay_29_0231CBC8.c @@ -17,6 +17,7 @@ #include "overlay_29_0234B340.h" #include "overlay_29_0230F8AC.h" #include "dungeon_logic_4.h" +#include "overlay_29_0230BBAC.h" #ifdef JAPAN #define MESSAGE_BE6 0x925 @@ -43,13 +44,10 @@ extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern void BoostIQ(struct entity *entity, s16 iq, bool8 a); -extern void UpdateShopkeeperModeAfterAttack(struct entity *attacker, struct entity *defender); extern void TryInflictInvisibleStatus(struct entity *user, struct entity *target); extern void TryInflictPetrifiedStatus(struct entity *user, struct entity *target); extern void TryInflictSleeplessStatus(struct entity *user, struct entity *target); extern s32 CalcStatusDuration(struct entity *entity, const s16 *turn_range, bool8 iq_skill_effects); - -extern void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s16 fixed_damage, s32 a, bool8 *flag, s32 b, s32 damage_source, s32 c, s32 d, s32 e); extern void DealDamageProjectile(struct entity *attacker, struct entity *defender, struct move *move, s16 power, s32 a, s32 b); extern void ApplyGummiBoostsDungeonMode(struct entity *user, struct entity *target, s32 type, s16 boost); extern void TryIncreaseBelly(struct entity *user, struct entity *target, s32 a, s32 b, s32 c); @@ -175,7 +173,7 @@ void ApplyItemEffect(char param_1, u8 param_2, u8 param_3, LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE7); if (param_1) { bool8 b; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4574, 1, &b, 0, + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4574, 1, &b, TYPE_NONE, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); EnemyEvolution(attacker); return; @@ -192,7 +190,7 @@ void ApplyItemEffect(char param_1, u8 param_2, u8 param_3, GetItemCategoryVeneer(item->id) == CATEGORY_LINK_BOX) { if (param_1) { bool8 b; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &b, 0, + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &b, TYPE_NONE, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); } else { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE8); @@ -242,10 +240,10 @@ void ApplyItemEffect(char param_1, u8 param_2, u8 param_3, break; } case ITEM_GEO_PEBBLE: - CalcDamageFixedNoCategory(attacker, defender, GEO_PEBBLE_DAMAGE, 1, NULL, 0, DAMAGE_SOURCE_THROWN_ROCK, 0, 0, 0); + CalcDamageFixedNoCategory(attacker, defender, GEO_PEBBLE_DAMAGE, 1, NULL, TYPE_NONE, DAMAGE_SOURCE_THROWN_ROCK, 0, 0, 0); break; case ITEM_GRAVELEROCK: - CalcDamageFixedNoCategory(attacker, defender, GRAVELEROCK_DAMAGE, 1, NULL, 0, DAMAGE_SOURCE_THROWN_ROCK, 0, 0, 0); + CalcDamageFixedNoCategory(attacker, defender, GRAVELEROCK_DAMAGE, 1, NULL, TYPE_NONE, DAMAGE_SOURCE_THROWN_ROCK, 0, 0, 0); break; case ITEM_GOLD_THORN: { struct move move; @@ -255,7 +253,7 @@ void ApplyItemEffect(char param_1, u8 param_2, u8 param_3, break; } case ITEM_RARE_FOSSIL: - CalcDamageFixedNoCategory(attacker, defender, RARE_FOSSIL_DAMAGE, 1, NULL, 0, DAMAGE_SOURCE_THROWN_ROCK, 0, 0, 0); + CalcDamageFixedNoCategory(attacker, defender, RARE_FOSSIL_DAMAGE, 1, NULL, TYPE_NONE, DAMAGE_SOURCE_THROWN_ROCK, 0, 0, 0); break; case ITEM_HEAL_SEED: EndNegativeStatusConditionWrapper(attacker, defender, TRUE, param_3); @@ -437,7 +435,7 @@ void ApplyItemEffect(char param_1, u8 param_2, u8 param_3, case ITEM_KEY: if (param_1) { bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); } else { @@ -460,7 +458,7 @@ case ITEM_MIX_ELIXIR: ApplyMixElixirEffect(attacker, defender); break; case ITEM_OREN_BERRY: - CalcDamageFixedNoCategory(attacker, defender, OREN_BERRY_DAMAGE, 1, NULL, 0, + CalcDamageFixedNoCategory(attacker, defender, OREN_BERRY_DAMAGE, 1, NULL, TYPE_NONE, DAMAGE_SOURCE_OREN_BERRY, 0, 0, 0); break; case ITEM_DOUGH_SEED: @@ -478,7 +476,7 @@ case ITEM_WANDER_GUMMI: case ITEM_PRIZE_TICKET: if (param_1) { bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); } else { SubstitutePlaceholderStringTags(0, defender, 0); @@ -488,7 +486,7 @@ case ITEM_PRIZE_TICKET: case ITEM_SILVER_TICKET: if (param_1) { bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); } else { SubstitutePlaceholderStringTags(0, defender, 0); @@ -498,7 +496,7 @@ case ITEM_SILVER_TICKET: case ITEM_GOLD_TICKET: if (param_1) { bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); } else { SubstitutePlaceholderStringTags(0, defender, 0); @@ -508,7 +506,7 @@ case ITEM_GOLD_TICKET: case ITEM_PRISM_TICKET: if (param_1) { bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); } else { SubstitutePlaceholderStringTags(0, defender, 0); @@ -518,7 +516,7 @@ case ITEM_PRISM_TICKET: case ITEM_SKY_GIFT: if (param_1) { bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); } else { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C76); @@ -559,7 +557,7 @@ case ITEM_GRACIDEA: case ITEM_QUESTION_STONE: if (param_1) { bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C44EC, 1, &flag, 0, + CalcDamageFixedNoCategory(attacker, defender, ov10_022C44EC, 1, &flag, TYPE_NONE, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); } else { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE8); @@ -569,7 +567,7 @@ case ITEM_GRACIDEA: default: if (param_1) { bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, 0, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); } else { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE8); diff --git a/src/overlay_29_0231EDD8.c b/src/overlay_29_0231EDD8.c index a5c229d8..28d58763 100644 --- a/src/overlay_29_0231EDD8.c +++ b/src/overlay_29_0231EDD8.c @@ -19,6 +19,7 @@ #include "overlay_29_0234B340.h" #include "position_util.h" #include "util.h" +#include "overlay_29_0230BBAC.h" #ifdef JAPAN #define MESSAGE_E45 0xB86 @@ -41,14 +42,12 @@ struct unk_022E9298 { extern struct dungeon *DUNGEON_PTR[]; extern const s16 HURL_DAMAGE; -extern void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s16 fixed_damage, s32 a, bool8 *flag, s32 b, s32 damage_source, s32 c, s32 d, s32 e); extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); extern void ChangeMonsterAnimationToIdle(struct entity *monster, s32 direction); extern void MoveMonsterToPos(struct entity *entity, s32 x_pos, s32 y_pos, bool8 reset_prev_pos_fields); extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern bool8 TwoTurnMoveForcedMiss(struct entity *target, struct move *move); extern void ov29_022E9298(struct position *pos, struct unk_022E9298 *bounds, bool8 a); -extern void ov29_022EA370(s32 a, s32 b); extern bool8 CannotMoveToTile(struct entity *entity, struct position *pos); extern void ov29_0232033C(struct entity *entity, struct position *pos); @@ -251,13 +250,13 @@ void TryHurl(struct entity *user, struct entity *target) InitMove(&move, MOVE_REGULAR_ATTACK); if (!TwoTurnMoveForcedMiss(occupant, &move)) - CalcDamageFixedNoCategory(user, occupant, HURL_DAMAGE, 0, NULL, 0, + CalcDamageFixedNoCategory(user, occupant, HURL_DAMAGE, 0, NULL, TYPE_NONE, DAMAGE_SOURCE_FLYING_MONSTER, 0, 0, 0); if (EntityIsValid__0231F570(occupant)) ChangeMonsterAnimationToIdle(occupant, GetEntInfo(occupant)->action.direction); } - CalcDamageFixedNoCategory(user, target, HURL_DAMAGE, 0, NULL, 0, + CalcDamageFixedNoCategory(user, target, HURL_DAMAGE, 0, NULL, TYPE_NONE, DAMAGE_SOURCE_KNOCKED_FLYING, 0, 0, 0); if (EntityIsValid__0231F570(target)) ChangeMonsterAnimationToIdle(target, GetEntInfo(target)->action.direction); diff --git a/src/overlay_29_0232A04C.c b/src/overlay_29_0232A04C.c index 48313a7b..b491aaf8 100644 --- a/src/overlay_29_0232A04C.c +++ b/src/overlay_29_0232A04C.c @@ -2,11 +2,9 @@ #include "moves_2.h" #include "main_0201514C.h" #include "dungeon_util_static.h" - -extern void CalcDamageFixedWrapper(struct entity *attacker, struct entity *defender, s32 fixed_damage, s32 a, bool8 *flag, s32 type, s32 category, s32 damage_source, s32 b, s32 c, s32 d); - -extern s32 GetDamageSourceWrapper(struct move *move, enum item_id item_id); +extern s16 GetDamageSourceWrapper(struct move *move, enum item_id item_id); #include "move_orb_effects.h" +#include "overlay_29_0230BBAC.h" extern const struct StatIndex ATK_STAT_IDX; @@ -30,9 +28,9 @@ bool8 DoMoveNightShade(struct entity* attacker, struct entity* defender, struct { bool8 flag = FALSE; s32 level = GetEntInfo(attacker)->level; - s32 type = GetMoveType(move); - s32 category = GetMoveCategory(move->id); - s32 source = GetDamageSourceWrapper(move, item_id); + enum type_id type = GetMoveType(move); + u8 category = GetMoveCategory(move->id); + s16 source = GetDamageSourceWrapper(move, item_id); CalcDamageFixedWrapper(attacker, defender, level, 1, &flag, type, category, source, 0, 1, 0); diff --git a/src/overlay_29_0232CD90.c b/src/overlay_29_0232CD90.c index 2545e10b..a0a5684d 100644 --- a/src/overlay_29_0232CD90.c +++ b/src/overlay_29_0232CD90.c @@ -1,10 +1,8 @@ #include "overlay_29_0232CD90.h" #include "moves_2.h" #include "main_0201514C.h" - -extern void CalcDamageFixedWrapper(struct entity *attacker, struct entity *defender, s32 fixed_damage, s32 a, bool8 *flag, s32 type, s32 category, s32 damage_source, s32 b, s32 c, s32 d); - -extern s32 GetDamageSourceWrapper(struct move *move, enum item_id item_id); +#include "overlay_29_0230BBAC.h" +extern s16 GetDamageSourceWrapper(struct move *move, enum item_id item_id); extern void TryInflictInvisibleStatus(struct entity *user, struct entity *target); @@ -18,9 +16,9 @@ bool8 DoMoveInvisify(struct entity* attacker, struct entity* defender, struct mo bool8 DoMoveOneShot(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id) { bool8 flag = FALSE; - s32 type = GetMoveType(move); - s32 category = GetMoveCategory(move->id); - s32 source = GetDamageSourceWrapper(move, item_id); + enum type_id type = GetMoveType(move); + u8 category = GetMoveCategory(move->id); + s16 source = GetDamageSourceWrapper(move, item_id); CalcDamageFixedWrapper(attacker, defender, 0x270F, 1, &flag, type, category, source, 0, 1, 0); diff --git a/src/overlay_29_0234B104.c b/src/overlay_29_0234B104.c index b005b311..ee83ef2b 100644 --- a/src/overlay_29_0234B104.c +++ b/src/overlay_29_0234B104.c @@ -8,7 +8,6 @@ extern void InitPreprocessorArgs(struct preprocessor_args *args); extern void LogMessage(struct entity *user, const char *message, bool8 show_popup); -extern void UnkMapRelatedFunc(u32 switch_case, u32 param_2); extern void WaitUntilAlertBoxTextIsLoaded(u32 param_1); extern int FullyCloseAlertBox(void); diff --git a/src/overlay_29_0234BA54.c b/src/overlay_29_0234BA54.c index a6d9423a..fdc1ea7f 100644 --- a/src/overlay_29_0234BA54.c +++ b/src/overlay_29_0234BA54.c @@ -6,7 +6,6 @@ extern struct message_log_info MESSAGE_LOG_INFO; extern u16 DUNGEON_BUTTON_INPUT[8]; extern void ov29_022E0B60(s32 a); -extern void UnkMapRelatedFunc(u32 switch_case, u32 param_2); extern void ov29_0233A248(s32 a); extern void sub_0204833C(void); extern s32 sub_02048360(void); diff --git a/src/overlay_31_02382820.c b/src/overlay_31_02382820.c index 7ba84da0..d8cd9ef1 100644 --- a/src/overlay_31_02382820.c +++ b/src/overlay_31_02382820.c @@ -52,7 +52,6 @@ extern struct struct_1* GetSimpleMenuResult__0202AEA4(s8); extern void CloseTextBox(s8); extern void CloseParentMenu(s8); -extern void UnkMapRelatedFunc(u32, u32); extern u32 GetLeaderActionId(void); extern void ov29_022E0C2C(u32); From 143395893fb7f14b4591b9e1610609c223be8ab2 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Mon, 14 Sep 2026 14:24:18 -0700 Subject: [PATCH 29/34] Decompile 119 more callees; clear four asm files entirely asm/main_0200F884.s 38 functions asm/main_0202F190.s 26 functions asm/overlay_29_022E5650.s 39 functions asm/overlay_29_023047DC.s 16 functions All four objects leave main.lsf and no new object is created. Four shared types change, each forced by a load the current declaration cannot produce, and each proven layout-preserving with the real compiler rather than asserted. struct monster's 0x19C..0x20F becomes `struct unk_02304D20 field_0x19c[4]` plus two s16, replacing 112 lines: a `struct position pos`, 110 u8 placeholders and `u16 walk_anim_frames_left`. Two functions index monster+0x19C with a stride of 0x1C (smulbb/smlabb against #0x1c) and a bound of 4, and element 0 aliases the old pos at 0x19C and walk_anim_frames_left at 0x1B4 (= element 0 + 0x18). Nothing in src/ reads either absorbed name through a struct monster *. struct entity's field_0xac and field_0xad become one s16: ov29_02304830 reads entity+0xAC with ldrsh, which no pair of u8 members can produce and no cast at the read site can fix. Neither name is used anywhere else. struct bag_items replaces fill2/fill3/fill4 with the members behind them -- two 1000-element arrays, four scalars and two 2-D struct bulk_item arrays -- so struct bulk_item moves above it as a member type. Offsets are read off the asm: the 0x300+0x8a and 0xb00+0x5a splits are forced by ARM addressing mode 3's 8-bit immediate, ldrsh vs ldrh fixes the signedness, cmp #0x3e8 fixes 1000, and lsl #5 / lsl #4 fix the two strides. sizeof stays 0x13B4 and every following member keeps its offset. GetCurrentKecleonShop1ItemByIndex and GetCurrentKecleonShop2ItemByIndex return struct bulk_item * as a consequence. window.h's portrait_params gains a `Point offset` in place of two u32 members, and Point moves above it. UpdatePortraitBox loads the pair with `add r1, r4, #0xc; ldm r1, {r1,r2}`, and mwcc emits ldm only when the base points exactly at the object; two separate member reads scored 860. Every object in the 25 translation units that reach window.h is byte-identical before and after. PlayEffectAnimationPixelPos was declared taking a struct entity * and returning void; it takes a struct pixel_position * and returns s32, so ov29_022E563C's own signature changes with it. Two declarations packed onto one physical line in src/overlay_11_02307334.c are removed, and two in src/overlay_29_0230558C.c are replaced by an include -- those four would have been hard errors the moment the new headers landed. SetAndPlayAnimationForAnimationControl's prototype here was derived from the call site and had three parameters wrong. Its prologue reads the first three stacked arguments as ldrb [sp,#0x18], ldr [sp,#0x1c], ldrb [sp,#0x20] and ldrb [sp,#0x24], so parameters 5, 7 and 8 are u8, not u32. That is what entity::field_0xaa turned on. Upstream made the member s8 in 8c39cbea and it stays s8 -- ov29_022DEA10 returns a slot index or -1, so the member is signed. Passing it through a u32 parameter forced a widening of a signed byte, i.e. ldrsb, where retail has ldrb; with the parameter declared u8 the conversion is s8 to u8 and mwcc folds it into the ldrb retail has. No cast anywhere, and overlay_30_init.c is untouched. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds in all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_0200F884.inc | 18 - asm/include/main_0202F190.inc | 38 - asm/include/overlay_29_022E5650.inc | 41 - asm/include/overlay_29_023047DC.inc | 46 - asm/main_0200F884.s | 1186 ------------------------ asm/main_0202F190.s | 912 ------------------- asm/overlay_29_022E5650.s | 1311 --------------------------- asm/overlay_29_023047DC.s | 1036 --------------------- include/dungeon_mode.h | 127 +-- include/item.h | 26 +- include/main_0200F874.h | 39 +- include/main_02010898.h | 4 +- include/main_02010BA4.h | 4 +- include/main_0202F180.h | 45 + include/main_0202FD3C.h | 35 + include/overlay_29_022E563C.h | 43 +- include/overlay_29_023047B8.h | 16 + include/window.h | 12 +- main.lsf | 4 - src/main_0200F874.c | 528 +++++++++++ src/main_02010898.c | 2 +- src/main_02010BA4.c | 2 +- src/main_0202F180.c | 352 +++++++ src/main_0202FD3C.c | 212 +++++ src/overlay_11_02307334.c | 2 +- src/overlay_29_022E563C.c | 502 +++++++++- src/overlay_29_023047B8.c | 566 ++++++++++++ src/overlay_29_0230558C.c | 3 +- src/overlay_29_0234BA54.c | 4 +- 29 files changed, 2381 insertions(+), 4735 deletions(-) delete mode 100644 asm/include/main_0200F884.inc delete mode 100644 asm/include/main_0202F190.inc delete mode 100644 asm/include/overlay_29_022E5650.inc delete mode 100644 asm/include/overlay_29_023047DC.inc delete mode 100644 asm/main_0200F884.s delete mode 100644 asm/main_0202F190.s delete mode 100644 asm/overlay_29_022E5650.s delete mode 100644 asm/overlay_29_023047DC.s diff --git a/asm/include/main_0200F884.inc b/asm/include/main_0200F884.inc deleted file mode 100644 index f245c24b..00000000 --- a/asm/include/main_0200F884.inc +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -.public AddMoneyCarried -.public AreItemsEquivalent -.public BAG_ITEMS_PTR_MIRROR -.public BulkItemToItem -.public GetCurrentBagCapacity -.public GetMoneyQuantity -.public GetRankStorageSize -.public IsItemInTimeDarkness -.public IsItemValidVeneer -.public IsThrownItem -.public IsTreasureBox -.public ItemZInit -.public MemAlloc -.public MemFree -.public RemoveEmptyItems -.public SetItemAcquired -.public SortItemList diff --git a/asm/include/main_0202F190.inc b/asm/include/main_0202F190.inc deleted file mode 100644 index 6a29746c..00000000 --- a/asm/include/main_0202F190.inc +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -.public _0209AF6C -.public AREA_NAME_BOX_DEFAULT_WINDOW_PARAMS -.public DeleteWindow -.public GetPressedButtons -.public GetWindowContents -.public InitPortraitParams -.public IsValidPortrait -.public LoadPortrait -.public MemAlloc -.public MemcpySimple -.public MemFree -.public NewWindowScreenCheck -.public PORTRAIT_BOX_DEFAULT_WINDOW_PARAMS -.public PreprocessString -.public PreprocessStringFromId -.public sub_0202613C -.public sub_02026184 -.public sub_02026194 -.public sub_020261A4 -.public sub_020261B4 -.public sub_020261C4 -.public sub_020261D4 -.public sub_020261E4 -.public sub_02026204 -.public sub_020265A8 -.public sub_02026E3C -.public sub_02027040 -.public sub_02027B1C -.public sub_02028080 -.public sub_0202810C -.public sub_0202811C -.public sub_0202812C -.public sub_0202836C -.public sub_02028770 -.public sub_02048240 -.public TEXT_BOX_DEFAULT_WINDOW_PARAMS -.public UpdateAreaNameBox diff --git a/asm/include/overlay_29_022E5650.inc b/asm/include/overlay_29_022E5650.inc deleted file mode 100644 index 8258ded7..00000000 --- a/asm/include/overlay_29_022E5650.inc +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -.public AdvanceFrame -.public AnimationHasMoreFrames -.public ChangeDungeonMusic -.public ChangeMonsterAnimation -.public DIRECTIONS_XY -.public DUNGEON_PTR -.public DungeonGoesUp -.public EntityIsValid__022E37B8 -.public FillPixelOffsetArrayFromSprite -.public GetEffectAnimationWanOffset -.public GetFloorType -.public GetLeader -.public InitOamAdjustmentInfo -.public IsCurrentFixedRoomBossFight -.public LogMessageByIdWithPopup -.public ov10_022BDC68 -.public ov10_022BEC08 -.public ov10_022BEC94 -.public ov10_022BF274 -.public ov10_022BF2B4 -.public ov10_022BF45C -.public ov29_022E2CA0 -.public ov29_022E6A00 -.public ov29_022E6C08 -.public ov29_022E6CE0 -.public ov29_022EA370 -.public ov29_02339148 -.public ov29_0234B1A4 -.public ov29_02351194 -.public ov29_0235119C -.public ov29_023511DC -.public ov29_0235122C -.public ov29_0235124C -.public PlayEffectAnimationEntity -.public PlayEffectAnimationPixelPos -.public PlayEffectAnimationPos -.public PlayMeByIdIfNot998 -.public PlaySeByIdIfNotSilence -.public ShouldDisplayEntityWrapper -.public SubstitutePlaceholderStringTags diff --git a/asm/include/overlay_29_023047DC.inc b/asm/include/overlay_29_023047DC.inc deleted file mode 100644 index fd4d508f..00000000 --- a/asm/include/overlay_29_023047DC.inc +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once -.public _s32_div_f -.public ActivateEndOfTurnEffects -.public ActivateTerrainEffects -.public AdvanceFrame -.public CheckLeaderTile -.public CheckNonLeaderTile -.public CheckVariousStatuses2__02301244 -.public CheckVariousStatuses__023016DC -.public DiscoverMinimap -.public DUNGEON_PTR -.public DungeonGetSpriteIndex -.public EnemyEvolution -.public EnsureCanStandCurrentTile -.public EntityIsValid__023047B8 -.public EntityIsValid__0230558C -.public GetDirectionTowardsPosition -.public GetShadowSize -.public GetSpeedOption -.public GetTileAtEntity -.public HandleShopTransaction -.public IncrementEntityPixelPosXY -.public IsFloorOver -.public IsFloorOver2 -.public IsWaterTileset -.public ov29_022E8104 -.public ov29_022EA370 -.public ov29_022EF9BC -.public ov29_02305814 -.public ov29_02307DD0 -.public ov29_02346888 -.public ov29_0234AD10 -.public ov29_0235173C -.public ov29_0235173E -.public ov29_02352808 -.public ov29_0237C9C1 -.public ov29_0237C9CC -.public Rand16Bit -.public SECONDARY_TERRAIN_TYPES -.public SetAndPlayAnimationForAnimationControl -.public SetSpriteIdForAnimationControl -.public ShouldDisplayEntityWrapper -.public sub_02053038 -.public TryForcedLoss -.public UpdateEntityPixelPos -.public WaitUntilAlertBoxTextIsLoaded diff --git a/asm/main_0200F884.s b/asm/main_0200F884.s deleted file mode 100644 index 367e04eb..00000000 --- a/asm/main_0200F884.s +++ /dev/null @@ -1,1186 +0,0 @@ - .include "asm/macros.inc" - .include "main_0200F884.inc" - - .text - - arm_func_start AddItemToBag -AddItemToBag: ; 0x0200F884 - stmdb sp!, {r4, r5, r6, lr} - ldr r2, _0200F90C ; =BAG_ITEMS_PTR_MIRROR - mov r6, r0 - ldr r0, [r2] - mov r5, r1 - ldr r4, [r0, #0x384] - bl GetCurrentBagCapacity - mov ip, #0 - mov r1, ip - mov r2, #1 - b _0200F8FC -_0200F8B0: - ldrb r3, [r4] - tst r3, #1 - movne r3, r2 - moveq r3, r1 - tst r3, #0xff - bne _0200F8F4 - ldrh r1, [r6] - mov r0, r6 - strh r1, [r4] - ldrh r1, [r6, #2] - strh r1, [r4, #2] - ldrh r1, [r6, #4] - strh r1, [r4, #4] - strb r5, [r4, #1] - bl SetItemAcquired - mov r0, #1 - ldmia sp!, {r4, r5, r6, pc} -_0200F8F4: - add ip, ip, #1 - add r4, r4, #6 -_0200F8FC: - cmp ip, r0 - blt _0200F8B0 - mov r0, #0 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0200F90C: .word BAG_ITEMS_PTR_MIRROR - arm_func_end AddItemToBag - - arm_func_start CleanStickyItemsInBag -CleanStickyItemsInBag: ; 0x0200F910 - ldr r0, _0200F93C ; =BAG_ITEMS_PTR_MIRROR - mov r2, #0 - ldr r0, [r0] - ldr r1, [r0, #0x384] -_0200F920: - ldrb r0, [r1] - add r2, r2, #1 - cmp r2, #0x32 - bic r0, r0, #8 - strb r0, [r1], #6 - blt _0200F920 - bx lr - .align 2, 0 -_0200F93C: .word BAG_ITEMS_PTR_MIRROR - arm_func_end CleanStickyItemsInBag - - arm_func_start CountStickyItemsInBag -CountStickyItemsInBag: ; 0x0200F940 - stmdb sp!, {r4, r5, r6, lr} - ldr r0, _0200F9B0 ; =BAG_ITEMS_PTR_MIRROR - mov lr, #0 - ldr r0, [r0] - mov r3, #1 - ldr ip, [r0, #0x384] - mov r4, lr - mov r2, lr - mov r0, lr - mov r1, r3 -_0200F968: - ldrb r5, [ip] - tst r5, #1 - movne r6, r3 - moveq r6, r2 - tst r6, #0xff - beq _0200F994 - tst r5, #8 - movne r5, r1 - moveq r5, r0 - tst r5, #0xff - addne lr, lr, #1 -_0200F994: - add r4, r4, #1 - cmp r4, #0x32 - add ip, ip, #6 - blt _0200F968 - mov r0, lr, lsl #0x10 - mov r0, r0, asr #0x10 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0200F9B0: .word BAG_ITEMS_PTR_MIRROR - arm_func_end CountStickyItemsInBag - - arm_func_start sub_0200F9B4 -sub_0200F9B4: ; 0x0200F9B4 - stmdb sp!, {r3, lr} - ldr r1, _0200FA08 ; =BAG_ITEMS_PTR_MIRROR - mov lr, #0 - ldr r1, [r1] - mov r2, lr - ldr ip, [r1, #0x384] - mov r3, #1 -_0200F9D0: - ldrb r1, [ip] - add lr, lr, #1 - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - ldrneb r1, [ip, #1] - cmpne r1, #0 - ldrneb r1, [r0, r1] - strneb r1, [ip, #1] - cmp lr, #0x32 - add ip, ip, #6 - blt _0200F9D0 - ldmia sp!, {r3, pc} - .align 2, 0 -_0200FA08: .word BAG_ITEMS_PTR_MIRROR - arm_func_end sub_0200F9B4 - - arm_func_start sub_0200FA0C -sub_0200FA0C: ; 0x0200FA0C - stmdb sp!, {r3, lr} - ldr r3, _0200FA64 ; =BAG_ITEMS_PTR_MIRROR - mov r2, #0x12c - ldr r3, [r3] - mov lr, #0 - mla ip, r1, r2, r3 - mov r2, lr - mov r3, #1 -_0200FA2C: - ldrb r1, [ip] - add lr, lr, #1 - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - ldrneb r1, [ip, #1] - cmpne r1, #0 - ldrneb r1, [r0, r1] - strneb r1, [ip, #1] - cmp lr, #0x32 - add ip, ip, #6 - blt _0200FA2C - ldmia sp!, {r3, pc} - .align 2, 0 -_0200FA64: .word BAG_ITEMS_PTR_MIRROR - arm_func_end sub_0200FA0C - - arm_func_start TransmuteHeldItemInBag -TransmuteHeldItemInBag: ; 0x0200FA68 - stmdb sp!, {r4, lr} - ldr r1, _0200FAE8 ; =BAG_ITEMS_PTR_MIRROR - mov r4, #0 - ldr r1, [r1] - mov r3, r4 - ldr lr, [r1, #0x384] - mov ip, #1 - b _0200FAD8 -_0200FA88: - ldrb r1, [lr] - tst r1, #1 - movne r1, ip - moveq r1, r3 - tst r1, #0xff - beq _0200FAD0 - ldrb r2, [lr, #1] - ldrb r1, [r0, #1] - cmp r2, r1 - bne _0200FAD0 - ldrh r1, [r0] - strh r1, [lr] - ldrh r1, [r0, #2] - strh r1, [lr, #2] - ldrh r1, [r0, #4] - mov r0, #1 - strh r1, [lr, #4] - ldmia sp!, {r4, pc} -_0200FAD0: - add r4, r4, #1 - add lr, lr, #6 -_0200FAD8: - cmp r4, #0x32 - blt _0200FA88 - mov r0, #0 - ldmia sp!, {r4, pc} - .align 2, 0 -_0200FAE8: .word BAG_ITEMS_PTR_MIRROR - arm_func_end TransmuteHeldItemInBag - - arm_func_start SetFlagsForHeldItemInBag -SetFlagsForHeldItemInBag: ; 0x0200FAEC - stmdb sp!, {r4, lr} - cmp r0, #0 - ldmeqia sp!, {r4, pc} - ldr r2, _0200FB50 ; =BAG_ITEMS_PTR_MIRROR - mov r4, #0 - ldr r2, [r2] - mov r3, r4 - ldr lr, [r2, #0x384] - mov ip, #1 -_0200FB10: - ldrb r2, [lr] - tst r2, #1 - movne r2, ip - moveq r2, r3 - tst r2, #0xff - beq _0200FB3C - ldrb r2, [lr, #1] - cmp r2, r0 - ldreqb r2, [lr] - orreq r2, r2, r1 - streqb r2, [lr] -_0200FB3C: - add r4, r4, #1 - cmp r4, #0x32 - add lr, lr, #6 - blt _0200FB10 - ldmia sp!, {r4, pc} - .align 2, 0 -_0200FB50: .word BAG_ITEMS_PTR_MIRROR - arm_func_end SetFlagsForHeldItemInBag - - arm_func_start RemoveHolderForItemInBag -RemoveHolderForItemInBag: ; 0x0200FB54 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - ldr r1, _0200FBDC ; =BAG_ITEMS_PTR_MIRROR - mov r6, r0 - ldr r0, [r1] - mov r5, #0 - mov sb, #1 - ldr r4, [r0, #0x384] - mov r8, r5 - mov r7, sb - b _0200FBCC -_0200FB7C: - ldrb r0, [r4] - tst r0, #1 - movne r0, sb - moveq r0, r8 - tst r0, #0xff - beq _0200FBC4 - mov r0, r4 - mov r1, r6 - mov r2, r7 - bl AreItemsEquivalent - cmp r0, #0 - beq _0200FBC4 - mov r0, #0 - strb r0, [r4, #1] - ldrb r1, [r6] - mov r0, #1 - strb r1, [r4] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_0200FBC4: - add r5, r5, #1 - add r4, r4, #6 -_0200FBCC: - cmp r5, #0x32 - blt _0200FB7C - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_0200FBDC: .word BAG_ITEMS_PTR_MIRROR - arm_func_end RemoveHolderForItemInBag - - arm_func_start SetHolderForItemInBag -SetHolderForItemInBag: ; 0x0200FBE0 - stmdb sp!, {r4, lr} - ldr ip, _0200FC20 ; =BAG_ITEMS_PTR_MIRROR - mov r3, #6 - ldr lr, [ip] - smulbb ip, r0, r3 - ldr lr, [lr, #0x384] - and r0, r2, #0xff - ldrb r3, [lr, ip] - add r4, lr, ip - bic r3, r3, #0x10 - strb r3, [lr, ip] - strb r2, [r1, #1] - strb r0, [r4, #1] - ldrb r0, [r1] - strb r0, [lr, ip] - ldmia sp!, {r4, pc} - .align 2, 0 -_0200FC20: .word BAG_ITEMS_PTR_MIRROR - arm_func_end SetHolderForItemInBag - - arm_func_start SortItemsInBag -SortItemsInBag: ; 0x0200FC24 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r4, #0 - ldr r7, _0200FCA8 ; =BAG_ITEMS_PTR_MIRROR - mov r8, r4 - mov sb, #1 - mov r6, #6 -_0200FC3C: - mul r1, r4, r6 - ldr r0, [r7] - ldr r2, [r0, #0x384] - ldrb r0, [r2, r1] - add r5, r2, r1 - tst r0, #1 - movne r0, sb - moveq r0, r8 - tst r0, #0xff - beq _0200FC84 - ldrsh r0, [r5, #4] - cmp r0, #0xb7 - bne _0200FC84 - mov r0, r5 - bl GetMoneyQuantity - bl AddMoneyCarried - mov r0, r5 - bl ItemZInit -_0200FC84: - add r4, r4, #1 - cmp r4, #0x32 - blt _0200FC3C - ldr r0, _0200FCA8 ; =BAG_ITEMS_PTR_MIRROR - mov r1, #0x32 - ldr r0, [r0] - ldr r0, [r0, #0x384] - bl SortItemList - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_0200FCA8: .word BAG_ITEMS_PTR_MIRROR - arm_func_end SortItemsInBag - - arm_func_start RemovePokeItemsInBag -RemovePokeItemsInBag: ; 0x0200FCAC - stmdb sp!, {r3, r4, r5, r6, r7, lr} - ldr r0, _0200FD34 ; =BAG_ITEMS_PTR_MIRROR - mov r5, #0 - ldr r0, [r0] - mov r6, r5 - ldr r4, [r0, #0x384] - mov r7, #1 -_0200FCC8: - ldrb r0, [r4] - tst r0, #1 - movne r0, r7 - moveq r0, r6 - tst r0, #0xff - beq _0200FD0C - ldrsh r0, [r4, #4] - cmp r0, #0xb7 - bne _0200FD0C - ldrb r1, [r4] - mov r0, r4 - bic r1, r1, #8 - strb r1, [r4] - bl GetMoneyQuantity - bl AddMoneyCarried - mov r0, r4 - bl ItemZInit -_0200FD0C: - add r5, r5, #1 - cmp r5, #0x32 - add r4, r4, #6 - blt _0200FCC8 - ldr r0, _0200FD34 ; =BAG_ITEMS_PTR_MIRROR - mov r1, #0x32 - ldr r0, [r0] - ldr r0, [r0, #0x384] - bl RemoveEmptyItems - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_0200FD34: .word BAG_ITEMS_PTR_MIRROR - arm_func_end RemovePokeItemsInBag - - arm_func_start sub_0200FD38 -sub_0200FD38: ; 0x0200FD38 - bx lr - arm_func_end sub_0200FD38 - - arm_func_start sub_0200FD3C -sub_0200FD3C: ; 0x0200FD3C - ldr ip, _0200FD44 ; =StorageZInit - bx ip - .align 2, 0 -_0200FD44: .word StorageZInit - arm_func_end sub_0200FD3C - - arm_func_start sub_0200FD48 -sub_0200FD48: ; 0x0200FD48 - ldr ip, _0200FD50 ; =GetRankStorageSize - bx ip - .align 2, 0 -_0200FD50: .word GetRankStorageSize - arm_func_end sub_0200FD48 - - arm_func_start IsStorageFull -IsStorageFull: ; 0x0200FD54 - stmdb sp!, {r4, lr} - bl GetRankStorageSize - mov r4, r0 - bl CountNbOfItemsInStorage - cmp r0, r4 - movge r0, #1 - movlt r0, #0 - and r0, r0, #0xff - ldmia sp!, {r4, pc} - arm_func_end IsStorageFull - - arm_func_start CountNbOfItemsInStorage -CountNbOfItemsInStorage: ; 0x0200FD78 - ldr r1, _0200FDAC ; =BAG_ITEMS_PTR_MIRROR - mov r0, #0 - ldr r3, [r1] - mov r2, r0 -_0200FD88: - add r1, r3, r2, lsl #1 - add r1, r1, #0x300 - ldrsh r1, [r1, #0x8a] - add r2, r2, #1 - cmp r1, #0 - addne r0, r0, #1 - cmp r2, #0x3e8 - blt _0200FD88 - bx lr - .align 2, 0 -_0200FDAC: .word BAG_ITEMS_PTR_MIRROR - arm_func_end CountNbOfItemsInStorage - - arm_func_start CountNbOfValidItemsInStorage -CountNbOfValidItemsInStorage: ; 0x0200FDB0 - stmdb sp!, {r4, r5, r6, lr} - mov r5, #0 - ldr r4, _0200FDFC ; =BAG_ITEMS_PTR_MIRROR - mov r6, r5 -_0200FDC0: - ldr r0, [r4] - add r0, r0, r6, lsl #1 - add r0, r0, #0x300 - ldrsh r1, [r0, #0x8a] - cmp r1, #0 - beq _0200FDE8 - ldrsh r0, [r0, #0x8a] - bl IsItemValidVeneer - cmp r0, #0 - addne r5, r5, #1 -_0200FDE8: - add r6, r6, #1 - cmp r6, #0x3e8 - blt _0200FDC0 - mov r0, r5 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0200FDFC: .word BAG_ITEMS_PTR_MIRROR - arm_func_end CountNbOfValidItemsInStorage - - arm_func_start CountNbOfValidItemsInTimeDarknessInStorage -CountNbOfValidItemsInTimeDarknessInStorage: ; 0x0200FE00 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r4, #0 - ldr r6, _0200FEA4 ; =BAG_ITEMS_PTR_MIRROR - mov r5, r4 -_0200FE10: - ldr r0, [r6] - add r0, r0, r5, lsl #1 - add r0, r0, #0x300 - ldrsh r7, [r0, #0x8a] - cmp r7, #0 - beq _0200FE90 - mov r0, r7 - bl IsItemValidVeneer - cmp r0, #0 - beq _0200FE90 - mov r0, r7 - bl IsItemInTimeDarkness - cmp r0, #0 - beq _0200FE90 - mov r0, r7 - bl IsTreasureBox - cmp r0, #0 - beq _0200FE8C - ldr r0, [r6] - add r0, r0, r5, lsl #1 - add r0, r0, #0xb00 - ldrsh r7, [r0, #0x5a] - mov r0, r7 - bl IsItemValidVeneer - cmp r0, #0 - beq _0200FE90 - mov r0, r7 - bl IsItemInTimeDarkness - cmp r0, #0 - addne r4, r4, #1 - b _0200FE90 -_0200FE8C: - add r4, r4, #1 -_0200FE90: - add r5, r5, #1 - cmp r5, #0x3e8 - blt _0200FE10 - mov r0, r4 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_0200FEA4: .word BAG_ITEMS_PTR_MIRROR - arm_func_end CountNbOfValidItemsInTimeDarknessInStorage - - arm_func_start CountNbItemsOfTypeInStorage -CountNbItemsOfTypeInStorage: ; 0x0200FEA8 - ldr r1, _0200FEE0 ; =BAG_ITEMS_PTR_MIRROR - mov r2, #0 - ldr ip, [r1] - mov r3, r2 -_0200FEB8: - add r1, ip, r3, lsl #1 - add r1, r1, #0x300 - ldrsh r1, [r1, #0x8a] - add r3, r3, #1 - cmp r0, r1 - addeq r2, r2, #1 - cmp r3, #0x3e8 - blt _0200FEB8 - mov r0, r2 - bx lr - .align 2, 0 -_0200FEE0: .word BAG_ITEMS_PTR_MIRROR - arm_func_end CountNbItemsOfTypeInStorage - - arm_func_start CountItemTypeInStorage -CountItemTypeInStorage: ; 0x0200FEE4 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r4, #0 - ldr r7, _0200FF4C ; =BAG_ITEMS_PTR_MIRROR - mov r6, r0 - mov r5, r4 -_0200FEF8: - ldr r1, [r7] - ldrsh r0, [r6] - add r1, r1, r5, lsl #1 - add r1, r1, #0x300 - ldrsh r1, [r1, #0x8a] - cmp r0, r1 - bne _0200FF38 - bl IsThrownItem - cmp r0, #0 - addeq r4, r4, #1 - beq _0200FF38 - ldr r0, [r7] - add r0, r0, r5, lsl #1 - add r0, r0, #0xb00 - ldrh r0, [r0, #0x5a] - add r4, r4, r0 -_0200FF38: - add r5, r5, #1 - cmp r5, #0x3e8 - blt _0200FEF8 - mov r0, r4 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_0200FF4C: .word BAG_ITEMS_PTR_MIRROR - arm_func_end CountItemTypeInStorage - - arm_func_start GetEquivBulkItemIdxInStorage -GetEquivBulkItemIdxInStorage: ; 0x0200FF50 - stmdb sp!, {r3, lr} - ldr r1, _0200FFA8 ; =BAG_ITEMS_PTR_MIRROR - mov ip, #0 - ldr lr, [r1] - b _0200FF98 -_0200FF64: - add r2, lr, ip, lsl #1 - add r1, r2, #0x300 - ldrsh r3, [r0] - ldrsh r1, [r1, #0x8a] - cmp r3, r1 - addeq r1, r2, #0xb00 - ldreqh r2, [r0, #2] - ldreqh r1, [r1, #0x5a] - cmpeq r2, r1 - moveq r0, ip, lsl #0x10 - moveq r0, r0, asr #0x10 - ldmeqia sp!, {r3, pc} - add ip, ip, #1 -_0200FF98: - cmp ip, #0x3e8 - blt _0200FF64 - mvn r0, #0 - ldmia sp!, {r3, pc} - .align 2, 0 -_0200FFA8: .word BAG_ITEMS_PTR_MIRROR - arm_func_end GetEquivBulkItemIdxInStorage - - arm_func_start ConvertStorageItemAtIdxToBulkItem -ConvertStorageItemAtIdxToBulkItem: ; 0x0200FFAC - ldr r3, _0200FFF0 ; =BAG_ITEMS_PTR_MIRROR - ldr r2, [r3] - add r2, r2, r0, lsl #1 - add r2, r2, #0x300 - ldrsh r2, [r2, #0x8a] - strh r2, [r1] - ldr r2, [r3] - add r0, r2, r0, lsl #1 - add r0, r0, #0xb00 - ldrh r0, [r0, #0x5a] - strh r0, [r1, #2] - ldrsh r0, [r1] - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - bx lr - .align 2, 0 -_0200FFF0: .word BAG_ITEMS_PTR_MIRROR - arm_func_end ConvertStorageItemAtIdxToBulkItem - - arm_func_start ConvertStorageItemAtIdxToItem -ConvertStorageItemAtIdxToItem: ; 0x0200FFF4 - ldr r3, _02010040 ; =BAG_ITEMS_PTR_MIRROR - mov ip, #0 - ldr r2, [r3] - add r2, r2, r0, lsl #1 - add r2, r2, #0x300 - ldrsh r2, [r2, #0x8a] - strh r2, [r1, #4] - ldr r2, [r3] - add r0, r2, r0, lsl #1 - add r0, r0, #0xb00 - ldrh r0, [r0, #0x5a] - strh r0, [r1, #2] - strb ip, [r1] - strb ip, [r1, #1] - ldrsh r0, [r1, #4] - cmp r0, #0 - movne ip, #1 - and r0, ip, #0xff - bx lr - .align 2, 0 -_02010040: .word BAG_ITEMS_PTR_MIRROR - arm_func_end ConvertStorageItemAtIdxToItem - - arm_func_start sub_02010044 -sub_02010044: ; 0x02010044 - ldr r1, _0201005C ; =BAG_ITEMS_PTR_MIRROR - ldr r1, [r1] - add r0, r1, r0, lsl #1 - add r0, r0, #0x300 - ldrsh r0, [r0, #0x8a] - bx lr - .align 2, 0 -_0201005C: .word BAG_ITEMS_PTR_MIRROR - arm_func_end sub_02010044 - - arm_func_start sub_02010060 -sub_02010060: ; 0x02010060 - ldr r1, _02010078 ; =BAG_ITEMS_PTR_MIRROR - ldr r1, [r1] - add r0, r1, r0, lsl #1 - add r0, r0, #0xb00 - ldrh r0, [r0, #0x5a] - bx lr - .align 2, 0 -_02010078: .word BAG_ITEMS_PTR_MIRROR - arm_func_end sub_02010060 - - arm_func_start MaybeUpdateStorage -MaybeUpdateStorage: ; 0x0201007C - stmdb sp!, {r3, lr} - ldr r1, _02010150 ; =BAG_ITEMS_PTR_MIRROR - mov r0, #0 - ldr r2, [r1] - b _02010144 -_02010090: - add r1, r2, r0, lsl #1 - add r1, r1, #0x300 - ldrsh r1, [r1, #0x8a] - cmp r1, #0 - bne _02010140 - mov r1, r0 - add r0, r0, #1 - ldr r3, _02010150 ; =BAG_ITEMS_PTR_MIRROR - b _020100FC -_020100B4: - ldr lr, [r3] - add r2, lr, r0, lsl #1 - add r2, r2, #0x300 - ldrsh ip, [r2, #0x8a] - cmp ip, #0 - beq _020100F8 - add r2, lr, r1, lsl #1 - add r2, r2, #0x300 - strh ip, [r2, #0x8a] - ldr lr, [r3] - add r2, lr, r0, lsl #1 - add r2, r2, #0xb00 - ldrh ip, [r2, #0x5a] - add r2, lr, r1, lsl #1 - add r2, r2, #0xb00 - strh ip, [r2, #0x5a] - add r1, r1, #1 -_020100F8: - add r0, r0, #1 -_020100FC: - cmp r0, #0x3e8 - blt _020100B4 - mov r3, #0 - ldr r2, _02010150 ; =BAG_ITEMS_PTR_MIRROR - b _02010134 -_02010110: - ldr r0, [r2] - add r0, r0, r1, lsl #1 - add r0, r0, #0x300 - strh r3, [r0, #0x8a] - ldr r0, [r2] - add r0, r0, r1, lsl #1 - add r0, r0, #0xb00 - strh r3, [r0, #0x5a] - add r1, r1, #1 -_02010134: - cmp r1, #0x3e8 - blt _02010110 - ldmia sp!, {r3, pc} -_02010140: - add r0, r0, #1 -_02010144: - cmp r0, #0x3e8 - blt _02010090 - ldmia sp!, {r3, pc} - .align 2, 0 -_02010150: .word BAG_ITEMS_PTR_MIRROR - arm_func_end MaybeUpdateStorage - - arm_func_start sub_02010154 -sub_02010154: ; 0x02010154 - stmdb sp!, {r3, lr} - ldr r2, _0201019C ; =BAG_ITEMS_PTR_MIRROR - ldr r1, [r2] - add r1, r1, r0, lsl #1 - add r1, r1, #0x300 - ldrsh r3, [r1, #0x8a] - cmp r3, #0 - moveq r0, #0 - ldmeqia sp!, {r3, pc} - mov r3, #0 - strh r3, [r1, #0x8a] - ldr r1, [r2] - add r0, r1, r0, lsl #1 - add r0, r0, #0xb00 - strh r3, [r0, #0x5a] - bl MaybeUpdateStorage - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_0201019C: .word BAG_ITEMS_PTR_MIRROR - arm_func_end sub_02010154 - - arm_func_start RemoveItemAtIdxInStorage -RemoveItemAtIdxInStorage: ; 0x020101A0 - ldr r2, _020101E0 ; =BAG_ITEMS_PTR_MIRROR - ldr r1, [r2] - add r1, r1, r0, lsl #1 - add r1, r1, #0x300 - ldrsh r3, [r1, #0x8a] - cmp r3, #0 - moveq r0, #0 - bxeq lr - mov r3, #0 - strh r3, [r1, #0x8a] - ldr r1, [r2] - add r0, r1, r0, lsl #1 - add r0, r0, #0xb00 - strh r3, [r0, #0x5a] - mov r0, #1 - bx lr - .align 2, 0 -_020101E0: .word BAG_ITEMS_PTR_MIRROR - arm_func_end RemoveItemAtIdxInStorage - - arm_func_start RemoveBulkItemInStorage -RemoveBulkItemInStorage: ; 0x020101E4 - stmdb sp!, {r4, lr} - ldr r1, _0201025C ; =BAG_ITEMS_PTR_MIRROR - mov lr, #0 - ldr r4, [r1] - b _0201024C -_020101F8: - add r3, r4, lr, lsl #1 - add r2, r3, #0x300 - ldrsh ip, [r0] - ldrsh r1, [r2, #0x8a] - cmp ip, r1 - addeq r1, r3, #0xb00 - ldreqh r3, [r0, #2] - ldreqh r1, [r1, #0x5a] - cmpeq r3, r1 - bne _02010248 - mov r1, #0 - ldr r0, _0201025C ; =BAG_ITEMS_PTR_MIRROR - strh r1, [r2, #0x8a] - ldr r0, [r0] - add r0, r0, lr, lsl #1 - add r0, r0, #0xb00 - strh r1, [r0, #0x5a] - bl MaybeUpdateStorage - mov r0, #1 - ldmia sp!, {r4, pc} -_02010248: - add lr, lr, #1 -_0201024C: - cmp lr, #0x3e8 - blt _020101F8 - mov r0, #0 - ldmia sp!, {r4, pc} - .align 2, 0 -_0201025C: .word BAG_ITEMS_PTR_MIRROR - arm_func_end RemoveBulkItemInStorage - - arm_func_start RemoveItemInStorage -RemoveItemInStorage: ; 0x02010260 - stmdb sp!, {r4, lr} - ldr r1, _020102D8 ; =BAG_ITEMS_PTR_MIRROR - mov lr, #0 - ldr r4, [r1] - b _020102C8 -_02010274: - add r3, r4, lr, lsl #1 - add r2, r3, #0x300 - ldrsh ip, [r0, #4] - ldrsh r1, [r2, #0x8a] - cmp ip, r1 - addeq r1, r3, #0xb00 - ldreqh r3, [r0, #2] - ldreqh r1, [r1, #0x5a] - cmpeq r3, r1 - bne _020102C4 - mov r1, #0 - ldr r0, _020102D8 ; =BAG_ITEMS_PTR_MIRROR - strh r1, [r2, #0x8a] - ldr r0, [r0] - add r0, r0, lr, lsl #1 - add r0, r0, #0xb00 - strh r1, [r0, #0x5a] - bl MaybeUpdateStorage - mov r0, #1 - ldmia sp!, {r4, pc} -_020102C4: - add lr, lr, #1 -_020102C8: - cmp lr, #0x3e8 - blt _02010274 - mov r0, #0 - ldmia sp!, {r4, pc} - .align 2, 0 -_020102D8: .word BAG_ITEMS_PTR_MIRROR - arm_func_end RemoveItemInStorage - - arm_func_start StorageZInit -StorageZInit: ; 0x020102DC - mov r3, #0 - ldr r1, _02010318 ; =BAG_ITEMS_PTR_MIRROR - mov r2, r3 -_020102E8: - ldr r0, [r1] - add r0, r0, r3, lsl #1 - add r0, r0, #0x300 - strh r2, [r0, #0x8a] - ldr r0, [r1] - add r0, r0, r3, lsl #1 - add r0, r0, #0xb00 - add r3, r3, #1 - strh r2, [r0, #0x5a] - cmp r3, #0x3e8 - blt _020102E8 - bx lr - .align 2, 0 -_02010318: .word BAG_ITEMS_PTR_MIRROR - arm_func_end StorageZInit - - arm_func_start AddBulkItemToStorage -AddBulkItemToStorage: ; 0x0201031C - stmdb sp!, {r3, r4, r5, lr} - sub sp, sp, #8 - mov r4, r0 - bl GetRankStorageSize - mov r5, r0 - add r0, sp, #0 - mov r1, r4 - bl BulkItemToItem - ldr r0, _020103A8 ; =BAG_ITEMS_PTR_MIRROR - mov ip, #0 - ldr r2, [r0] - b _02010394 -_0201034C: - add r0, r2, ip, lsl #1 - add r1, r0, #0x300 - ldrsh r0, [r1, #0x8a] - cmp r0, #0 - bne _02010390 - ldrsh r3, [r4] - ldr r2, _020103A8 ; =BAG_ITEMS_PTR_MIRROR - add r0, sp, #0 - strh r3, [r1, #0x8a] - ldr r1, [r2] - ldrh r2, [r4, #2] - add r1, r1, ip, lsl #1 - add r1, r1, #0xb00 - strh r2, [r1, #0x5a] - bl SetItemAcquired - mov r0, #1 - b _020103A0 -_02010390: - add ip, ip, #1 -_02010394: - cmp ip, r5 - blt _0201034C - mov r0, #0 -_020103A0: - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_020103A8: .word BAG_ITEMS_PTR_MIRROR - arm_func_end AddBulkItemToStorage - - arm_func_start AddItemToStorage -AddItemToStorage: ; 0x020103AC - stmdb sp!, {r4, lr} - mov r4, r0 - bl GetRankStorageSize - ldr r1, _02010420 ; =BAG_ITEMS_PTR_MIRROR - mov ip, #0 - ldr r3, [r1] - b _02010410 -_020103C8: - add r1, r3, ip, lsl #1 - add r1, r1, #0x300 - ldrsh r2, [r1, #0x8a] - cmp r2, #0 - bne _0201040C - ldrsh r3, [r4, #4] - ldr r2, _02010420 ; =BAG_ITEMS_PTR_MIRROR - mov r0, r4 - strh r3, [r1, #0x8a] - ldr r1, [r2] - ldrh r2, [r4, #2] - add r1, r1, ip, lsl #1 - add r1, r1, #0xb00 - strh r2, [r1, #0x5a] - bl SetItemAcquired - mov r0, #1 - ldmia sp!, {r4, pc} -_0201040C: - add ip, ip, #1 -_02010410: - cmp ip, r0 - blt _020103C8 - mov r0, #0 - ldmia sp!, {r4, pc} - .align 2, 0 -_02010420: .word BAG_ITEMS_PTR_MIRROR - arm_func_end AddItemToStorage - - arm_func_start SortItemsInStorage -SortItemsInStorage: ; 0x02010424 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov sb, r1 - mov r1, #6 - mov sl, r0 - mul r0, sb, r1 - mov r1, #0 - bl MemAlloc - mov r5, #6 - mov r7, r0 - mov r8, #0 - mov fp, #0x80 - ldr r6, _0201058C ; =BAG_ITEMS_PTR_MIRROR - mov r4, r5 - b _020104C8 -_0201045C: - ldr r0, [r6] - add r0, r0, r8, lsl #1 - add r0, r0, #0x300 - ldrsh r0, [r0, #0x8a] - cmp r0, #0 - beq _020104D0 - mla r0, r8, r5, r7 - bl ItemZInit - ldrb r0, [sl, r8] - mul r2, r8, r4 - cmp r0, #0 - movne r0, fp - moveq r0, #0 - orr r0, r0, #1 - strb r0, [r7, r2] - ldr r1, [r6] - add r0, r7, r2 - add r1, r1, r8, lsl #1 - add r1, r1, #0x300 - ldrsh r1, [r1, #0x8a] - strh r1, [r0, #4] - ldr r1, [r6] - add r1, r1, r8, lsl #1 - add r1, r1, #0xb00 - ldrh r1, [r1, #0x5a] - add r8, r8, #1 - strh r1, [r0, #2] -_020104C8: - cmp r8, sb - blt _0201045C -_020104D0: - mov r0, r7 - mov r1, r8 - bl SortItemList - mov r6, #0 - mov r1, r6 - mov r2, #1 - mov fp, #6 - ldr r0, _0201058C ; =BAG_ITEMS_PTR_MIRROR - b _0201053C -_020104F4: - mul r4, r6, fp - add r5, r7, r4 - ldr ip, [r0] - ldrsh r3, [r5, #4] - add ip, ip, r6, lsl #1 - add ip, ip, #0x300 - strh r3, [ip, #0x8a] - ldr ip, [r0] - ldrh r3, [r5, #2] - add r5, ip, r6, lsl #1 - add r5, r5, #0xb00 - strh r3, [r5, #0x5a] - ldrb r3, [r7, r4] - tst r3, #0x80 - movne r3, r2 - moveq r3, r1 - strb r3, [sl, r6] - add r6, r6, #1 -_0201053C: - cmp r6, r8 - blt _020104F4 - mov r2, #0 - ldr r1, _0201058C ; =BAG_ITEMS_PTR_MIRROR - b _02010578 -_02010550: - ldr r0, [r1] - add r0, r0, r6, lsl #1 - add r0, r0, #0x300 - strh r2, [r0, #0x8a] - ldr r0, [r1] - add r0, r0, r6, lsl #1 - add r0, r0, #0xb00 - strh r2, [r0, #0x5a] - strb r2, [sl, r6] - add r6, r6, #1 -_02010578: - cmp r6, sb - blt _02010550 - mov r0, r7 - bl MemFree - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0201058C: .word BAG_ITEMS_PTR_MIRROR - arm_func_end SortItemsInStorage - - arm_func_start sub_02010590 -sub_02010590: ; 0x02010590 - bx lr - arm_func_end sub_02010590 - - arm_func_start AllKecleonShopsZInit -AllKecleonShopsZInit: ; 0x02010594 - stmdb sp!, {r4, r5, r6, lr} - mov r2, #0 - ldr ip, _02010650 ; =BAG_ITEMS_PTR_MIRROR - mov r5, r2 - mov r0, r2 - mov r1, r2 -_020105AC: - mov r6, r1 -_020105B0: - ldr r3, [ip] - mov r4, r6, lsl #2 - add r3, r3, #0x330 - add r3, r3, #0x1000 - add r3, r3, r2, lsl #5 - add lr, r3, r6, lsl #2 - strh r5, [r3, r4] - add r6, r6, #1 - strh r5, [lr, #2] - cmp r6, #8 - blt _020105B0 - mov r6, r5 -_020105E0: - ldr r3, [ip] - mov lr, r6, lsl #2 - add r3, r3, #0x374 - add r3, r3, #0x1000 - add r3, r3, r2, lsl #4 - add r4, r3, r6, lsl #2 - strh r0, [r3, lr] - add r6, r6, #1 - strh r0, [r4, #2] - cmp r6, #4 - blt _020105E0 - add r2, r2, #1 - cmp r2, #2 - blt _020105AC - ldr r2, _02010650 ; =BAG_ITEMS_PTR_MIRROR - ldr r1, [r2] - add r1, r1, #0x1000 - str r0, [r1, #0x3a0] - ldr r1, [r2] - add r1, r1, #0x1300 - strh r0, [r1, #0xa4] - ldr r1, [r2] - add r1, r1, #0x1300 - strh r0, [r1, #0xa6] - ldr r1, [r2] - add r1, r1, #0x1300 - strh r0, [r1, #0xa8] - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_02010650: .word BAG_ITEMS_PTR_MIRROR - arm_func_end AllKecleonShopsZInit - - arm_func_start SpecialEpisodeKecleonShopZInit -SpecialEpisodeKecleonShopZInit: ; 0x02010654 - stmdb sp!, {r3, lr} - mov lr, #0 - ldr r2, _020106C0 ; =BAG_ITEMS_PTR_MIRROR - mov r0, lr -_02010664: - ldr r1, [r2] - mov r3, lr, lsl #2 - add r1, r1, #0x350 - add r1, r1, #0x1000 - add ip, r1, lr, lsl #2 - strh r0, [r1, r3] - add lr, lr, #1 - strh r0, [ip, #2] - cmp lr, #8 - blt _02010664 - ldr r2, _020106C0 ; =BAG_ITEMS_PTR_MIRROR - mov r3, #0 -_02010694: - ldr r1, [r2] - mov ip, r0, lsl #2 - add r1, r1, #0x384 - add r1, r1, #0x1000 - add lr, r1, r0, lsl #2 - strh r3, [r1, ip] - add r0, r0, #1 - strh r3, [lr, #2] - cmp r0, #4 - blt _02010694 - ldmia sp!, {r3, pc} - .align 2, 0 -_020106C0: .word BAG_ITEMS_PTR_MIRROR - arm_func_end SpecialEpisodeKecleonShopZInit - - arm_func_start SetActiveKecleonShop -SetActiveKecleonShop: ; 0x020106C4 - ldr r2, _02010708 ; =BAG_ITEMS_PTR_MIRROR - ldr r1, [r2] - add r1, r1, #0x1000 - strb r0, [r1, #0x32a] - ldr ip, [r2] - add r1, ip, #0x330 - add r1, r1, #0x1000 - add r3, r1, r0, lsl #5 - add r1, ip, #0x1000 - str r3, [r1, #0x32c] - ldr r2, [r2] - add r1, r2, #0x374 - add r1, r1, #0x1000 - add r1, r1, r0, lsl #4 - add r0, r2, #0x1000 - str r1, [r0, #0x370] - bx lr - .align 2, 0 -_02010708: .word BAG_ITEMS_PTR_MIRROR - arm_func_end SetActiveKecleonShop diff --git a/asm/main_0202F190.s b/asm/main_0202F190.s deleted file mode 100644 index 76730a1f..00000000 --- a/asm/main_0202F190.s +++ /dev/null @@ -1,912 +0,0 @@ - .include "asm/macros.inc" - .include "main_0202F190.inc" - - .text - - arm_func_start sub_0202F190 -sub_0202F190: ; 0x0202F190 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - mov r4, r2 - bl GetWindowContents - mov r1, r5 - mov r2, r4 - add r0, r0, #0xc - bl sub_02026184 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_0202F190 - - arm_func_start ShowStringIdInDialogueBox -ShowStringIdInDialogueBox: ; 0x0202F1B4 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r1 - mov r6, r2 - mov r5, r3 - bl GetWindowContents - mov r4, r0 - ldr r0, [r4, #4] - cmp r0, #2 - beq _0202F1EC - add r0, r4, #0xc - bl sub_0202613C - mov r0, #1 - str r0, [r4, #4] - b _0202F200 -_0202F1EC: - ldrb r0, [r4, #9] - cmp r0, #0 - beq _0202F200 - add r0, r4, #0x128 - bl sub_02048240 -_0202F200: - mov r0, #1 - strb r0, [r4, #8] - ldrb r0, [r4, #0xa] - mov r2, r6 - mov r3, r7 - strb r0, [r4, #9] - add r0, r4, #0x128 - mov r1, #0x400 - str r5, [sp] - bl PreprocessStringFromId - mov r1, r7 - add r0, r4, #0xc - add r2, r4, #0x128 - bl sub_02026194 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ShowStringIdInDialogueBox - - arm_func_start ShowStringInDialogueBox -ShowStringInDialogueBox: ; 0x0202F23C - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r1 - mov r6, r2 - mov r5, r3 - bl GetWindowContents - mov r4, r0 - ldr r0, [r4, #4] - cmp r0, #2 - beq _0202F274 - add r0, r4, #0xc - bl sub_0202613C - mov r0, #1 - str r0, [r4, #4] - b _0202F288 -_0202F274: - ldrb r0, [r4, #9] - cmp r0, #0 - beq _0202F288 - add r0, r4, #0x128 - bl sub_02048240 -_0202F288: - mov r0, #1 - strb r0, [r4, #8] - ldrb r0, [r4, #0xa] - mov r2, r6 - mov r3, r7 - strb r0, [r4, #9] - add r0, r4, #0x128 - mov r1, #0x400 - str r5, [sp] - bl PreprocessString - mov r1, r7 - add r0, r4, #0xc - add r2, r4, #0x128 - bl sub_02026194 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ShowStringInDialogueBox - - arm_func_start sub_0202F2C4 -sub_0202F2C4: ; 0x0202F2C4 - stmdb sp!, {r4, lr} - bl GetWindowContents - mov r4, r0 - ldr r0, [r4, #4] - cmp r0, #4 - addls pc, pc, r0, lsl #2 - b _0202F31C -_0202F2E0: ; jump table - b _0202F31C ; case 0 - b _0202F2F4 ; case 1 - b _0202F308 ; case 2 - ldmia sp!, {r4, pc} ; case 3 - ldmia sp!, {r4, pc} ; case 4 -_0202F2F4: - mov r0, #4 - str r0, [r4, #4] - mov r0, #1 - strb r0, [r4, #8] - ldmia sp!, {r4, pc} -_0202F308: - add r0, r4, #0xc - bl sub_020261A4 - mov r0, #1 - strb r0, [r4, #8] - ldmia sp!, {r4, pc} -_0202F31C: - add r0, r4, #0xc - bl sub_0202613C - mov r0, #0 - str r0, [r4, #4] - strb r0, [r4, #8] - ldmia sp!, {r4, pc} - arm_func_end sub_0202F2C4 - - arm_func_start sub_0202F334 -sub_0202F334: ; 0x0202F334 - stmdb sp!, {r4, lr} - bl GetWindowContents - mov r4, r0 - ldr r0, [r4, #4] - cmp r0, #4 - addls pc, pc, r0, lsl #2 - b _0202F38C -_0202F350: ; jump table - b _0202F38C ; case 0 - b _0202F364 ; case 1 - b _0202F378 ; case 2 - ldmia sp!, {r4, pc} ; case 3 - ldmia sp!, {r4, pc} ; case 4 -_0202F364: - mov r0, #4 - str r0, [r4, #4] - mov r0, #1 - strb r0, [r4, #8] - ldmia sp!, {r4, pc} -_0202F378: - mov r0, #3 - str r0, [r4, #4] - mov r0, #1 - strb r0, [r4, #8] - ldmia sp!, {r4, pc} -_0202F38C: - add r0, r4, #0xc - bl sub_0202613C - mov r0, #0 - str r0, [r4, #4] - strb r0, [r4, #8] - ldmia sp!, {r4, pc} - arm_func_end sub_0202F334 - - arm_func_start ShowDialogueBox -ShowDialogueBox: ; 0x0202F3A4 - stmdb sp!, {r4, lr} - bl GetWindowContents - mov r4, r0 - ldr r0, [r4, #4] - cmp r0, #4 - addls pc, pc, r0, lsl #2 - b _0202F3E0 -_0202F3C0: ; jump table - b _0202F3E0 ; case 0 - b _0202F3D4 ; case 1 - b _0202F3D4 ; case 2 - ldmia sp!, {r4, pc} ; case 3 - ldmia sp!, {r4, pc} ; case 4 -_0202F3D4: - add r0, r4, #0xc - bl sub_020261C4 - ldmia sp!, {r4, pc} -_0202F3E0: - add r0, r4, #0xc - bl sub_0202613C - mov r0, #0 - str r0, [r4, #4] - strb r0, [r4, #8] - ldmia sp!, {r4, pc} - arm_func_end ShowDialogueBox - - arm_func_start sub_0202F3F8 -sub_0202F3F8: ; 0x0202F3F8 - stmdb sp!, {r4, lr} - bl GetWindowContents - mov r4, r0 - ldr r0, [r4, #4] - cmp r0, #4 - addls pc, pc, r0, lsl #2 - b _0202F434 -_0202F414: ; jump table - b _0202F434 ; case 0 - b _0202F428 ; case 1 - b _0202F428 ; case 2 - ldmia sp!, {r4, pc} ; case 3 - ldmia sp!, {r4, pc} ; case 4 -_0202F428: - add r0, r4, #0xc - bl sub_020261B4 - ldmia sp!, {r4, pc} -_0202F434: - add r0, r4, #0xc - bl sub_0202613C - mov r0, #0 - str r0, [r4, #4] - strb r0, [r4, #8] - ldmia sp!, {r4, pc} - arm_func_end sub_0202F3F8 - - arm_func_start ReadStringFromDialogueBox -ReadStringFromDialogueBox: ; 0x0202F44C - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - mov r4, r2 - bl GetWindowContents - mov r1, r0 - mov r0, r5 - mov r2, r4 - add r1, r1, #0x128 - bl MemcpySimple - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ReadStringFromDialogueBox - - arm_func_start sub_0202F474 -sub_0202F474: ; 0x0202F474 - stmdb sp!, {r4, lr} - mov r4, r1 - bl GetWindowContents - strb r4, [r0, #0xa] - ldmia sp!, {r4, pc} - arm_func_end sub_0202F474 - - arm_func_start UpdateDialogueBox -UpdateDialogueBox: ; 0x0202F488 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldr r4, [r5, #0xc] - ldr r0, [r4, #4] - cmp r0, #4 - addls pc, pc, r0, lsl #2 - ldmia sp!, {r3, r4, r5, pc} -_0202F4A4: ; jump table - b _0202F4B8 ; case 0 - b _0202F4E4 ; case 1 - b _0202F504 ; case 2 - b _0202F568 ; case 3 - b _0202F57C ; case 4 -_0202F4B8: - add r0, r4, #0xc - bl sub_020261D4 - cmp r0, #0 - moveq r0, #0 - streqb r0, [r4, #8] - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #1 - str r0, [r4, #4] - strb r0, [r4, #8] - sub r0, r0, #2 - str r0, [r5, #0xb8] -_0202F4E4: - mov r0, #1 - strb r0, [r4, #8] - ldrsb r0, [r5, #0x10] - bl sub_0202810C - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #2 - str r0, [r4, #4] -_0202F504: - add r0, r4, #0xc - bl sub_02026204 - cmp r0, #0x10 - moveq r0, #3 - streq r0, [r4, #4] - moveq r0, #1 - streqb r0, [r4, #8] - ldmeqia sp!, {r3, r4, r5, pc} - ldrb r5, [r4, #8] - add r0, r4, #0xc - bl sub_020261E4 - strb r0, [r4, #8] - cmp r5, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldrb r0, [r4, #8] - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, pc} - ldrb r0, [r4, #9] - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - add r0, r4, #0x128 - bl sub_02048240 - mov r0, #0 - strb r0, [r4, #9] - ldmia sp!, {r3, r4, r5, pc} -_0202F568: - mov r0, #4 - str r0, [r4, #4] - mov r0, #1 - strb r0, [r4, #8] - ldmia sp!, {r3, r4, r5, pc} -_0202F57C: - ldrsb r0, [r5, #0x10] - bl sub_0202812C - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - add r0, r4, #0xc - bl sub_0202613C - mov r0, #0 - str r0, [r4, #4] - strb r0, [r4, #8] - sub r0, r0, #6 - str r0, [r5, #0xb8] - ldmia sp!, {r3, r4, r5, pc} - arm_func_end UpdateDialogueBox - - arm_func_start CreatePortraitBox -CreatePortraitBox: ; 0x0202F5AC - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #0x10 - mov r7, r0 - mov r4, r1 - mov r0, #0x380 - mov r1, #8 - mov r6, r2 - bl MemAlloc - ldr r1, _0202F648 ; =PORTRAIT_BOX_DEFAULT_WINDOW_PARAMS - mov r5, r0 - add ip, sp, #0 - ldmia r1, {r0, r1, r2, r3} - stmia ip, {r0, r1, r2, r3} - ldr r0, _0202F64C ; =UpdatePortraitBox - cmp r6, #0 - str r0, [sp] - mvnne r0, #3 - mvneq r0, #6 - strb r0, [sp, #9] - str r5, [sp, #0xc] - strb r7, [sp, #8] - add r0, sp, #0 - strb r6, [r5, #0x2a] - mov r1, #3 - bl NewWindowScreenCheck - strb r0, [r5] - mov r1, #0 - add r0, r5, #8 - str r1, [r5, #4] - bl InitPortraitParams - add r0, r5, #0x18 - bl InitPortraitParams - str r4, [r5, #0x2c] - mov r0, #0 - strb r0, [r5, #0x28] - strb r0, [r5, #0x29] - ldrsb r0, [r5] - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_0202F648: .word PORTRAIT_BOX_DEFAULT_WINDOW_PARAMS -_0202F64C: .word UpdatePortraitBox - arm_func_end CreatePortraitBox - - arm_func_start ClosePortraitBox -ClosePortraitBox: ; 0x0202F650 - stmdb sp!, {r4, lr} - mov r4, r0 - bl GetWindowContents - bl MemFree - mov r0, r4 - bl DeleteWindow - ldmia sp!, {r4, pc} - arm_func_end ClosePortraitBox - - arm_func_start PortraitBoxNeedsUpdate -PortraitBoxNeedsUpdate: ; 0x0202F66C - stmdb sp!, {r3, lr} - bl GetWindowContents - ldr r0, [r0, #4] - sub r0, r0, #1 - cmp r0, #1 - movls r0, #1 - movhi r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - arm_func_end PortraitBoxNeedsUpdate - - arm_func_start ShowPortraitInPortraitBox -ShowPortraitInPortraitBox: ; 0x0202F690 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - bl GetWindowContents - mov r4, r0 - ldr r0, [r4, #4] - cmp r0, #2 - cmpne r0, #3 - movne r0, #1 - strne r0, [r4, #4] - cmp r5, #0 - addne ip, r4, #0x18 - ldmneia r5, {r0, r1, r2, r3} - stmneia ip, {r0, r1, r2, r3} - bne _0202F6D0 - add r0, r4, #0x18 - bl InitPortraitParams -_0202F6D0: - mov r0, #1 - strb r0, [r4, #0x28] - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ShowPortraitInPortraitBox - - arm_func_start HidePortraitBox -HidePortraitBox: ; 0x0202F6DC - stmdb sp!, {r4, lr} - bl GetWindowContents - mov r4, r0 - mov r0, #0 - strb r0, [r4, #0x28] - add r0, r4, #0x18 - bl InitPortraitParams - ldr r0, [r4, #4] - cmp r0, #0 - movne r0, #1 - strneb r0, [r4, #0x29] - ldmia sp!, {r4, pc} - arm_func_end HidePortraitBox - - arm_func_start UpdatePortraitBox -UpdatePortraitBox: ; 0x0202F70C - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldr r4, [r5, #0xc] - ldr r0, [r4, #4] - cmp r0, #4 - addls pc, pc, r0, lsl #2 - ldmia sp!, {r3, r4, r5, pc} -_0202F728: ; jump table - b _0202F73C ; case 0 - b _0202F760 ; case 1 - b _0202F778 ; case 2 - b _0202F86C ; case 3 - b _0202F894 ; case 4 -_0202F73C: - ldrb r0, [r4, #0x28] - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r1, #0 - mov r0, #1 - strb r1, [r4, #0x28] - str r0, [r4, #4] - sub r0, r0, #2 - str r0, [r5, #0xb8] -_0202F760: - ldrsb r0, [r5, #0x10] - bl sub_0202811C - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #2 - str r0, [r4, #4] -_0202F778: - mov r0, #0 - strb r0, [r4, #0x28] - add r0, r4, #0x18 - add ip, r4, #8 - ldmia r0, {r0, r1, r2, r3} - stmia ip, {r0, r1, r2, r3} - ldrb r0, [r4, #0x29] - cmp r0, #0 - bne _0202F86C - mov r0, ip - bl IsValidPortrait - cmp r0, #0 - beq _0202F854 - add r0, r4, #8 - add r1, r4, #0x30 - bl LoadPortrait - cmp r0, #0 - beq _0202F824 - ldr r2, [r4, #0x2c] - ldrsb r0, [r5, #0x10] - add r1, r4, #0x30 - mov r2, r2, lsl #4 - bl sub_02027040 - ldrsb r0, [r5, #0x10] - ldr r2, [r4, #0x2c] - add r1, r4, #0x60 - bl sub_02026E3C - ldrb r0, [r4, #0x16] - strb r0, [r5, #0x11] - ldrb r0, [r4, #0x2a] - cmp r0, #0 - ldrsb r0, [r4] - beq _0202F808 - mvn r1, #3 - bl sub_02028080 - b _0202F810 -_0202F808: - mvn r1, #6 - bl sub_02028080 -_0202F810: - ldrsb r0, [r5, #0x10] - add r1, r4, #0xc - ldmia r1, {r1, r2} - bl sub_02028770 - b _0202F85C -_0202F824: - ldrsb r0, [r5, #0x10] - bl sub_0202836C - ldrsb r0, [r5, #0x10] - bl sub_02027B1C - ldrsb r0, [r4] - mov r1, #0 - bl sub_02028080 - add r1, r4, #0xc - ldrsb r0, [r5, #0x10] - ldmia r1, {r1, r2} - bl sub_02028770 - b _0202F85C -_0202F854: - mov r0, #1 - strb r0, [r4, #0x29] -_0202F85C: - mov r0, #3 - str r0, [r4, #4] - sub r0, r0, #4 - str r0, [r5, #0xb8] -_0202F86C: - ldrb r0, [r4, #0x28] - cmp r0, #0 - movne r0, #2 - strne r0, [r4, #4] - ldmneia sp!, {r3, r4, r5, pc} - ldrb r0, [r4, #0x29] - cmp r0, #0 - movne r0, #4 - strne r0, [r4, #4] - ldmia sp!, {r3, r4, r5, pc} -_0202F894: - ldrsb r0, [r5, #0x10] - bl sub_0202812C - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - add r0, r4, #8 - bl InitPortraitParams - mov r0, #0 - strb r0, [r4, #0x29] - str r0, [r4, #4] - sub r0, r0, #6 - str r0, [r5, #0xb8] - ldmia sp!, {r3, r4, r5, pc} - arm_func_end UpdatePortraitBox - - arm_func_start CreateTextBox -CreateTextBox: ; 0x0202F8C4 - stmdb sp!, {r4, lr} - mov r4, r1 - bl CreateTextBoxInternal - str r4, [r0, #4] - ldrsb r0, [r0] - ldmia sp!, {r4, pc} - arm_func_end CreateTextBox - - arm_func_start CreateTextBoxWithArg -CreateTextBoxWithArg: ; 0x0202F8DC - stmdb sp!, {r3, r4, r5, lr} - mov r4, r2 - mov r5, r1 - bl CreateTextBoxInternal - str r4, [r0, #0x14] - str r5, [r0, #8] - ldrsb r0, [r0] - ldmia sp!, {r3, r4, r5, pc} - arm_func_end CreateTextBoxWithArg - - arm_func_start CloseTextBox -CloseTextBox: ; 0x0202F8FC - stmdb sp!, {r4, lr} - mov r4, r0 - bl GetWindowContents - bl MemFree - mov r0, r4 - bl DeleteWindow - ldmia sp!, {r4, pc} - arm_func_end CloseTextBox - - arm_func_start CloseTextBox2 -CloseTextBox2: ; 0x0202F918 - stmdb sp!, {r4, lr} - mov r4, r0 - bl GetWindowContents - mov r0, r4 - bl sub_0202836C - mov r0, r4 - bl sub_02027B1C - mov r0, r4 - bl sub_0202F954 - mov r0, r4 - bl GetWindowContents - bl MemFree - mov r0, r4 - bl DeleteWindow - ldmia sp!, {r4, pc} - arm_func_end CloseTextBox2 - - arm_func_start sub_0202F954 -sub_0202F954: ; 0x0202F954 - stmdb sp!, {r3, lr} - bl GetWindowContents - ldr r1, [r0, #0x10] - cmp r1, #6 - addls pc, pc, r1, lsl #2 - b _0202F9AC -_0202F96C: ; jump table - b _0202F9AC ; case 0 - b _0202F988 ; case 1 - b _0202F994 ; case 2 - b _0202F9A0 ; case 3 - ldmia sp!, {r3, pc} ; case 4 - ldmia sp!, {r3, pc} ; case 5 - ldmia sp!, {r3, pc} ; case 6 -_0202F988: - mov r1, #5 - str r1, [r0, #0x10] - ldmia sp!, {r3, pc} -_0202F994: - mov r1, #3 - str r1, [r0, #0x10] - ldmia sp!, {r3, pc} -_0202F9A0: - mov r1, #4 - str r1, [r0, #0x10] - ldmia sp!, {r3, pc} -_0202F9AC: - mov r1, #0 - str r1, [r0, #0x10] - ldmia sp!, {r3, pc} - arm_func_end sub_0202F954 - - arm_func_start IsTextboxState3 -IsTextboxState3: ; 0x0202F9B8 - stmdb sp!, {r3, lr} - bl GetWindowContents - ldr r1, [r0, #0x10] - cmp r1, #3 - moveq r1, #2 - streq r1, [r0, #0x10] - moveq r0, #1 - movne r0, #0 - ldmia sp!, {r3, pc} - arm_func_end IsTextboxState3 - - arm_func_start CreateTextBoxInternal -CreateTextBoxInternal: ; 0x0202F9DC - stmdb sp!, {r3, r4, r5, lr} - sub sp, sp, #0x10 - mov r5, r0 - mov r0, #0x18 - mov r1, #8 - bl MemAlloc - mov r4, r0 - cmp r5, #0 - ldreq r0, _0202FA54 ; =TEXT_BOX_DEFAULT_WINDOW_PARAMS - add ip, sp, #0 - ldmeqia r0, {r0, r1, r2, r3} - ldmneia r5, {r0, r1, r2, r3} - stmia ip, {r0, r1, r2, r3} - ldr r1, _0202FA58 ; =UpdateTextBox - add r0, sp, #0 - str r1, [sp] - str r4, [sp, #0xc] - mov r1, #3 - bl NewWindowScreenCheck - strb r0, [r4] - mov r0, #0 - str r0, [r4, #4] - str r0, [r4, #8] - str r0, [r4, #0x14] - str r0, [r4, #0x10] - ldr r1, _0202FA58 ; =UpdateTextBox - mov r0, r4 - str r1, [r4, #0xc] - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0202FA54: .word TEXT_BOX_DEFAULT_WINDOW_PARAMS -_0202FA58: .word UpdateTextBox - arm_func_end CreateTextBoxInternal - - arm_func_start UpdateTextBox -UpdateTextBox: ; 0x0202FA5C - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldr r4, [r5, #0xc] - add r1, sp, #0 - mov r0, #0 - bl GetPressedButtons - ldr r0, [r4, #0x10] - cmp r0, #6 - addls pc, pc, r0, lsl #2 - ldmia sp!, {r3, r4, r5, pc} -_0202FA84: ; jump table - b _0202FAA0 ; case 0 - b _0202FAB0 ; case 1 - b _0202FAC8 ; case 2 - b _0202FB04 ; case 3 - b _0202FB50 ; case 4 - b _0202FB68 ; case 5 - b _0202FB88 ; case 6 -_0202FAA0: - mvn r0, #0 - str r0, [r5, #0xb8] - mov r0, #1 - str r0, [r4, #0x10] -_0202FAB0: - ldrsb r0, [r5, #0x10] - bl sub_0202810C - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #2 - str r0, [r4, #0x10] -_0202FAC8: - ldr r2, [r4, #8] - cmp r2, #0 - beq _0202FAE4 - ldrsb r0, [r5, #0x10] - ldr r1, [r4, #0x14] - blx r2 - b _0202FAF8 -_0202FAE4: - ldr r1, [r4, #4] - cmp r1, #0 - beq _0202FAF8 - ldrsb r0, [r5, #0x10] - blx r1 -_0202FAF8: - mov r0, #3 - str r0, [r4, #0x10] - ldmia sp!, {r3, r4, r5, pc} -_0202FB04: - ldrb r0, [r5, #8] - cmp r0, #1 - ldmeqia sp!, {r3, r4, r5, pc} - ldrh r0, [sp] - tst r0, #2 - ldrnesb r2, [r5, #9] - mvnne r1, #1 - cmpne r2, r1 - subne r0, r1, #3 - cmpne r2, r0 - subne r0, r1, #6 - cmpne r2, r0 - subne r0, r1, #7 - cmpne r2, r0 - movne r0, #4 - strne r0, [r4, #0x10] - ldr r0, [r4, #0x10] - cmp r0, #4 - ldmneia sp!, {r3, r4, r5, pc} -_0202FB50: - ldrsb r0, [r5, #0x10] - bl sub_0202836C - ldrsb r0, [r5, #0x10] - bl sub_02027B1C - mov r0, #5 - str r0, [r4, #0x10] -_0202FB68: - ldrsb r0, [r5, #0x10] - bl sub_0202812C - cmp r0, #0 - movne r0, #6 - strne r0, [r4, #0x10] - subne r0, r0, #0xc - strne r0, [r5, #0xb8] - ldmia sp!, {r3, r4, r5, pc} -_0202FB88: - mvn r0, #4 - str r0, [r5, #0xb8] - mov r0, #7 - str r0, [r4, #0x10] - ldmia sp!, {r3, r4, r5, pc} - arm_func_end UpdateTextBox - - arm_func_start IsTextBoxActive -IsTextBoxActive: ; 0x0202FB9C - stmdb sp!, {r3, lr} - bl GetWindowContents - ldr r0, [r0, #0x10] - cmp r0, #7 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - arm_func_end IsTextBoxActive - - arm_func_start CreateAreaNameBox -CreateAreaNameBox: ; 0x0202FBBC - stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} - sub sp, sp, #0x64 - mov r7, r0 - mov r6, r1 - mov r0, #0x1b4 - mov r1, #8 - mov r5, r2 - mov r8, r3 - bl MemAlloc - mov r4, r0 - str r8, [r4, #0xa4] - add r0, sp, #0x14 - str r8, [sp, #0x24] - str r0, [sp] - ldr r2, _0202FD2C ; =_0209AF6C - ldr r3, _0202FD30 ; =0x0000C402 - add r0, r4, #0xac - mov r1, #0x100 - bl PreprocessString - add r0, r4, #0xac - bl sub_020265A8 - mov ip, r0 - cmp r7, #0 - str ip, [r4, #0xa8] - addne lr, sp, #4 - ldmneia r7, {r0, r1, r2, r3} - stmneia lr, {r0, r1, r2, r3} - ldrne r0, _0202FD34 ; =UpdateAreaNameBox - strne r0, [sp, #4] - bne _0202FC48 - ldr r0, _0202FD38 ; =AREA_NAME_BOX_DEFAULT_WINDOW_PARAMS - add r7, sp, #4 - ldmia r0, {r0, r1, r2, r3} - stmia r7, {r0, r1, r2, r3} - orr r6, r6, #0x300000 -_0202FC48: - ldrb r0, [sp, #0xa] - str r4, [sp, #0x10] - cmp r0, #0 - addeq r1, ip, #7 - moveq r0, r1, asr #2 - addeq r0, r1, r0, lsr #29 - moveq r0, r0, asr #3 - streqb r0, [sp, #0xa] - ldrb r0, [sp, #0xb] - cmp r0, #0 - moveq r0, #2 - streqb r0, [sp, #0xb] - tst r6, #0x200000 - ldrneb r1, [sp, #8] - ldrneb r0, [sp, #0xa] - subne r0, r1, r0 - strneb r0, [sp, #8] - tst r6, #0x100000 - ldrneb r1, [sp, #9] - ldrneb r0, [sp, #0xb] - subne r0, r1, r0 - strneb r0, [sp, #9] - ldrb r1, [sp, #0xa] - ldr r0, [r4, #0xa8] - rsb r0, r0, r1, lsl #3 - add r0, r0, r0, lsr #31 - mov r0, r0, asr #1 - str r0, [r4, #0x1b0] - ldrb r0, [sp, #0xb] - mov r0, r0, lsl #3 - sub r0, r0, #0xc - add r0, r0, r0, lsr #31 - mov r0, r0, asr #1 - str r0, [r4, #0x1ac] - ldr r0, [r4, #0x1b0] - cmp r0, #0 - movlt r0, #0 - strlt r0, [r4, #0x1b0] - ldr r0, _0202FD34 ; =UpdateAreaNameBox - cmp r5, #0 - stmia r4, {r0, r6} - beq _0202FD10 - add r7, r4, #8 - mov r6, #9 -_0202FCF8: - ldmia r5!, {r0, r1, r2, r3} - stmia r7!, {r0, r1, r2, r3} - subs r6, r6, #1 - bne _0202FCF8 - ldmia r5, {r0, r1} - stmia r7, {r0, r1} -_0202FD10: - mov r2, #0 - add r0, sp, #4 - mov r1, #3 - str r2, [r4, #0xa0] - bl NewWindowScreenCheck - add sp, sp, #0x64 - ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} - .align 2, 0 -_0202FD2C: .word _0209AF6C -_0202FD30: .word 0x0000C402 -_0202FD34: .word UpdateAreaNameBox -_0202FD38: .word AREA_NAME_BOX_DEFAULT_WINDOW_PARAMS - arm_func_end CreateAreaNameBox diff --git a/asm/overlay_29_022E5650.s b/asm/overlay_29_022E5650.s deleted file mode 100644 index e800877d..00000000 --- a/asm/overlay_29_022E5650.s +++ /dev/null @@ -1,1311 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022E5650.inc" - - .text - - arm_func_start ov29_022E5650 -ov29_022E5650: ; 0x022E5650 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - ldr r0, _022E569C ; =0x00000167 - mov r4, r1 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E569C ; =0x00000167 - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E569C: .word 0x00000167 - arm_func_end ov29_022E5650 - - arm_func_start PlaySeByIdIfShouldDisplayEntity -PlaySeByIdIfShouldDisplayEntity: ; 0x022E56A0 - stmdb sp!, {r4, lr} - mov r4, r1 - cmp r0, #0 - bne _022E56BC - mov r0, r4 - bl PlaySeByIdIfNotSilence - ldmia sp!, {r4, pc} -_022E56BC: - bl ShouldDisplayEntityAdvanced - cmp r0, #0 - ldmeqia sp!, {r4, pc} - mov r0, r4 - bl PlaySeByIdIfNotSilence - ldmia sp!, {r4, pc} - arm_func_end PlaySeByIdIfShouldDisplayEntity - - arm_func_start ov29_022E56D4 -ov29_022E56D4: ; 0x022E56D4 - stmdb sp!, {r4, lr} - mov r4, r1 - bl ov29_022E2CA0 - cmp r0, #0 - ldmeqia sp!, {r4, pc} - mov r0, r4 - bl PlaySeByIdIfNotSilence - ldmia sp!, {r4, pc} - arm_func_end ov29_022E56D4 - - arm_func_start ov29_022E56F4 -ov29_022E56F4: ; 0x022E56F4 - stmdb sp!, {r4, lr} - mov r4, r1 - cmp r0, #0 - bne _022E5710 - mov r0, r4 - bl PlayMeByIdIfNot998 - ldmia sp!, {r4, pc} -_022E5710: - bl ShouldDisplayEntityAdvanced - cmp r0, #0 - ldmeqia sp!, {r4, pc} - mov r0, r4 - bl PlaySeByIdIfNotSilence - ldmia sp!, {r4, pc} - arm_func_end ov29_022E56F4 - - arm_func_start PlayItemThrowSfx -PlayItemThrowSfx: ; 0x022E5728 - stmdb sp!, {r3, lr} - cmp r1, #0 - bne _022E5740 - ldr r0, _022E5760 ; =0x0000130E - bl PlaySeByIdIfNotSilence - ldmia sp!, {r3, pc} -_022E5740: - cmp r1, #1 - bne _022E5754 - ldr r0, _022E5764 ; =0x0000130D - bl PlaySeByIdIfNotSilence - ldmia sp!, {r3, pc} -_022E5754: - ldr r0, _022E5768 ; =0x0000130C - bl PlaySeByIdIfNotSilence - ldmia sp!, {r3, pc} - .align 2, 0 -_022E5760: .word 0x0000130E -_022E5764: .word 0x0000130D -_022E5768: .word 0x0000130C - arm_func_end PlayItemThrowSfx - - arm_func_start PlayMissSfx__022E611C -PlayMissSfx__022E611C: ; 0x022E576C - stmdb sp!, {r3, lr} - ldr r0, [r1, #0xb4] - ldrb r0, [r0, #6] - cmp r0, #0 - beq _022E578C - ldr r0, _022E5798 ; =0x00001306 - bl PlaySeByIdIfNotSilence - ldmia sp!, {r3, pc} -_022E578C: - ldr r0, _022E579C ; =0x00001307 - bl PlaySeByIdIfNotSilence - ldmia sp!, {r3, pc} - .align 2, 0 -_022E5798: .word 0x00001306 -_022E579C: .word 0x00001307 - arm_func_end PlayMissSfx__022E611C - - arm_func_start PlayMissSfx__022E6150 -PlayMissSfx__022E6150: ; 0x022E57A0 - stmdb sp!, {r3, lr} - ldr r0, [r0, #0xb4] - ldrb r0, [r0, #6] - cmp r0, #0 - beq _022E57C0 - ldr r0, _022E57CC ; =0x00001306 - bl PlaySeByIdIfNotSilence - ldmia sp!, {r3, pc} -_022E57C0: - ldr r0, _022E57D0 ; =0x00001307 - bl PlaySeByIdIfNotSilence - ldmia sp!, {r3, pc} - .align 2, 0 -_022E57CC: .word 0x00001306 -_022E57D0: .word 0x00001307 - arm_func_end PlayMissSfx__022E6150 - - arm_func_start ov29_022E57D4 -ov29_022E57D4: ; 0x022E57D4 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E585C ; =0x0000025A - bl GetEffectAnimationWanOffset - mov r2, r0 - mov ip, #0 - mov r1, #2 - stmia sp, {r1, ip} - sub r0, ip, #1 - str r0, [sp, #8] - and r3, r2, #0xff - mov r0, r4 - add r1, r1, #0x258 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - ldr r0, _022E5860 ; =0x0000025B - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r1, #2 - str r1, [sp] - mov r2, #0 - str r2, [sp, #4] - sub r1, r2, #1 - str r1, [sp, #8] - str r2, [sp, #0xc] - ldr r1, _022E5860 ; =0x0000025B - mov r0, r4 - mov r2, #1 - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E585C: .word 0x0000025A -_022E5860: .word 0x0000025B - arm_func_end ov29_022E57D4 - - arm_func_start ov29_022E5864 -ov29_022E5864: ; 0x022E5864 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - mov r0, #0x16 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x16 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end ov29_022E5864 - - arm_func_start ov29_022E58B0 -ov29_022E58B0: ; 0x022E58B0 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov r4, r2 - mov sl, r0 - mov r5, r1 - cmp r4, #0x11 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, r5 - bl ov29_022E2CA0 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldrsh r0, [r5] - mov r2, #0x18 - add r1, sp, #0 - smulbb r0, r0, r2 - add r0, r0, #0xc - mov r0, r0, lsl #8 - mov r0, r0, asr #8 - strh r0, [sp] - ldrsh r3, [r5, #2] - mov r0, r4 - smulbb r2, r3, r2 - add r2, r2, #0x10 - mov r2, r2, lsl #8 - mov r2, r2, asr #8 - strh r2, [sp, #2] - bl ov10_022BEC08 - cmp r4, #4 - mov r6, r0 - cmpne r4, #0x18 - bne _022E5944 - mov r0, #0 - mov r1, #0x308 - bl PlaySeByIdIfShouldDisplayEntity - mov r0, #0x28 - mov r1, #0x33 - bl ov29_022EA370 - b _022E59C4 -_022E5944: - cmp r4, #8 - bne _022E59B8 - ldr sb, [sl, #0xb4] - mov r7, #0 - mov r0, r6, lsl #0x10 - ldrb r8, [sb, #0x4c] - mov r4, r0, asr #0x10 - mov r5, r7 - mov fp, #2 - b _022E59A4 -_022E596C: - sub r0, r8, #1 - and r8, r0, #7 - mov r0, sl - mov r1, r5 - mov r2, r8 - bl ChangeMonsterAnimation - mov r0, fp - mov r1, #0x33 - bl ov29_022EA370 - mov r0, r4 - bl AnimationHasMoreFrames - cmp r0, #0 - beq _022E59AC - add r7, r7, #2 -_022E59A4: - cmp r7, #0x3e8 - blt _022E596C -_022E59AC: - and r0, r8, #7 - strb r0, [sb, #0x4c] - b _022E59C4 -_022E59B8: - mov r0, #0x28 - mov r1, #0x33 - bl ov29_022EA370 -_022E59C4: - mov r0, r6, lsl #0x10 - mov r7, #0 - mov r4, r0, asr #0x10 - mov r5, #0x42 - b _022E59F4 -_022E59D8: - mov r0, r5 - bl AdvanceFrame - mov r0, r4 - bl AnimationHasMoreFrames - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - add r7, r7, #1 -_022E59F4: - cmp r7, #0x3e8 - blt _022E59D8 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - arm_func_end ov29_022E58B0 - - arm_func_start ov29_022E5A00 -ov29_022E5A00: ; 0x022E5A00 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x18 - mov r5, r0 - mov r4, r1 - bl ShouldDisplayEntityAdvanced - cmp r0, #0 - beq _022E5AD4 - ldrb r0, [r4] - ldr r1, [r5, #0xc] - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - movne r4, #0 - ldreqsh r4, [r4, #4] - mov r1, r1, asr #8 - ldr r0, _022E5ADC ; =DUNGEON_PTR - strh r1, [sp, #4] - ldr r2, [r5, #0x10] - ldr r1, [r0] - mov r0, r2, asr #8 - strh r0, [sp, #6] - ldr r0, _022E5AE0 ; =0x0001A226 - ldrsh r3, [sp, #6] - ldrsh r1, [r1, r0] - add r0, sp, #8 - add r2, r5, #0x2c - sub r1, r3, r1 - add r1, r1, r1, lsr #31 - mov r3, r1, asr #1 - mov r1, #4 - add r5, r3, #1 - bl FillPixelOffsetArrayFromSprite - add r1, sp, #4 - add r2, sp, #8 - mov r0, r4 - mov r3, #0 - str r5, [sp] - bl ov10_022BEC94 - mov r0, r0, lsl #0x10 - mov r6, #0 - mov r4, r0, asr #0x10 - mov r5, #0x42 - b _022E5ACC -_022E5AB0: - mov r0, r5 - bl AdvanceFrame - mov r0, r4 - bl AnimationHasMoreFrames - cmp r0, #0 - beq _022E5AD4 - add r6, r6, #1 -_022E5ACC: - cmp r6, #0x3e8 - blt _022E5AB0 -_022E5AD4: - add sp, sp, #0x18 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_022E5ADC: .word DUNGEON_PTR -#ifdef JAPAN -_022E5AE0: .word 0x0001A182 -#else -_022E5AE0: .word 0x0001A226 -#endif - arm_func_end ov29_022E5A00 - - arm_func_start ov29_022E5AE4 -ov29_022E5AE4: ; 0x022E5AE4 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x18 - mov r5, r0 - mov r4, r1 - bl ShouldDisplayEntityAdvanced - cmp r0, #0 - beq _022E5BC8 - ldrb r0, [r4] - ldr r1, [r5, #0xc] - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - movne r4, #0 - ldreqsh r4, [r4, #4] - mov r1, r1, asr #8 - ldr r0, _022E5BD0 ; =DUNGEON_PTR - strh r1, [sp, #4] - ldr r2, [r5, #0x10] - ldr r1, [r0] - mov r0, r2, asr #8 - strh r0, [sp, #6] - ldr r0, _022E5BD4 ; =0x0001A226 - ldrsh r3, [sp, #6] - ldrsh r1, [r1, r0] - add r0, sp, #8 - add r2, r5, #0x2c - sub r1, r3, r1 - add r1, r1, r1, lsr #31 - mov r1, r1, asr #1 - add r1, r1, #1 - mov r3, r1, lsl #0x10 - mov r1, #4 - mov r5, r3, asr #0x10 - bl FillPixelOffsetArrayFromSprite - add r1, sp, #4 - add r2, sp, #8 - mov r0, r4 - mov r3, #1 - str r5, [sp] - bl ov10_022BEC94 - mov r0, r0, lsl #0x10 - mov r6, #0 - mov r4, r0, asr #0x10 - mov r5, #0x42 - b _022E5BC0 -_022E5B9C: - mov r0, r5 - bl AdvanceFrame - mov r0, r4 - bl AnimationHasMoreFrames - cmp r0, #0 - beq _022E5BC8 - add r0, r6, #1 - mov r0, r0, lsl #0x10 - mov r6, r0, asr #0x10 -_022E5BC0: - cmp r6, #0x3e8 - blt _022E5B9C -_022E5BC8: - add sp, sp, #0x18 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_022E5BD0: .word DUNGEON_PTR -#ifdef JAPAN -_022E5BD4: .word 0x0001A182 -#else -_022E5BD4: .word 0x0001A226 -#endif - arm_func_end ov29_022E5AE4 - - arm_func_start ov29_022E5BD8 -ov29_022E5BD8: ; 0x022E5BD8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x40 - mov r5, r0 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _022E5D4C - ldr r1, [r5, #0xb4] - ldr r0, [r5, #0xc] - ldrb r4, [r1, #0x4c] - mov r1, r0, asr #8 - ldr r0, _022E5D58 ; =DUNGEON_PTR - strh r1, [sp, #0x10] - ldr r2, [r5, #0x10] - ldr r1, [r0] - mov r0, r2, asr #8 - strh r0, [sp, #0x12] - ldr r0, _022E5D5C ; =0x0001A226 - ldrsh r2, [sp, #0x12] - ldrsh r1, [r1, r0] - add r0, sp, #0x14 - sub r1, r2, r1 - add r1, r1, r1, lsr #31 - mov sl, r1, asr #1 - bl ov10_022BF274 - mov r5, #0 - ldrsh r3, [sp, #0x10] - ldrsh r2, [sp, #0x12] - ldr r6, _022E5D60 ; =0x00000165 - sub r1, r5, #1 - add r0, sp, #0x30 - str r6, [sp, #0x14] - str r5, [sp, #0x18] - str r4, [sp, #0x1c] - strh r3, [sp, #0x20] - strh r2, [sp, #0x22] - strh r5, [sp, #0x24] - strh r5, [sp, #0x26] - strb r1, [sp, #0x28] - str sl, [sp, #0x2c] - bl InitOamAdjustmentInfo - add r0, sp, #0x14 - mov r1, r5 - bl ov10_022BF2B4 - ldr r2, _022E5D64 ; =DIRECTIONS_XY - mov sb, r5 - add r1, r2, r4, lsl #2 - mov r3, r4, lsl #2 - ldrh r2, [r2, r3] - ldrh r1, [r1, #2] - mov r0, r0, lsl #0x10 - strh r2, [sp, #0xc] - strh r1, [sp, #0xe] - ldrsh r8, [sp, #0xc] - ldrsh r7, [sp, #0xe] - ldr r4, _022E5D58 ; =DUNGEON_PTR - ldr fp, _022E5D5C ; =0x0001A226 - mov r5, r0, asr #0x10 - mov r6, sb -_022E5CC0: - mov r0, r5 - add r1, sp, #0x10 - mov r2, r6 - mov r3, sl - str r6, [sp] - bl ov10_022BF45C - mov r0, #0x42 - bl AdvanceFrame - ldrsh r0, [sp, #0x12] - ldrsh r1, [sp, #0x10] - add sb, sb, #1 - add r0, r0, r7, lsl #2 - add r1, r1, r8, lsl #2 - strh r0, [sp, #0x12] - strh r1, [sp, #0x10] - ldr r0, [r4] - ldrsh r1, [sp, #0x12] - ldrsh r0, [r0, fp] - cmp sb, #6 - sub r0, r1, r0 - add r0, r0, r0, lsr #31 - mov sl, r0, asr #1 - blt _022E5CC0 - bl ov10_022BDC68 - ldrsh r2, [sp, #0x10] - ldrsh r1, [sp, #0x12] - add r0, sp, #4 - mov r4, r2, lsl #8 - mov r3, r1, lsl #8 - mov r1, #0x1a0 - mov r2, #1 - str r4, [sp, #4] - str r3, [sp, #8] - bl PlayEffectAnimationPixelPos - b _022E5D50 -_022E5D4C: - mvn r0, #0 -_022E5D50: - add sp, sp, #0x40 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022E5D58: .word DUNGEON_PTR -#ifdef JAPAN -_022E5D5C: .word 0x0001A182 -#else -_022E5D5C: .word 0x0001A226 -#endif -_022E5D60: .word 0x00000165 -_022E5D64: .word DIRECTIONS_XY - arm_func_end ov29_022E5BD8 - - arm_func_start PlayStairsSfx -PlayStairsSfx: ; 0x022E5D68 - stmdb sp!, {r4, lr} - mov r4, #0x3f00 - bl GetFloorType - cmp r0, #0 - beq _022E5D88 - cmp r0, #1 - cmpne r0, #2 - beq _022E5DA4 -_022E5D88: - ldr r0, _022E5DB0 ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x748] - bl DungeonGoesUp - cmp r0, #0 - ldrne r4, _022E5DB4 ; =0x0000130A - ldreq r4, _022E5DB8 ; =0x00001309 -_022E5DA4: - mov r0, r4 - bl PlaySeByIdIfNotSilence - ldmia sp!, {r4, pc} - .align 2, 0 -_022E5DB0: .word DUNGEON_PTR -_022E5DB4: .word 0x0000130A -_022E5DB8: .word 0x00001309 - arm_func_end PlayStairsSfx - - arm_func_start ov29_022E5DBC -ov29_022E5DBC: ; 0x022E5DBC - stmdb sp!, {r3, r4, r5, lr} - mov r4, r1 - mov r5, r0 - cmp r4, #3 - bne _022E5DD8 - mov r0, #0 - bl ChangeDungeonMusic -_022E5DD8: - cmp r5, #4 - beq _022E5E10 - cmp r4, #3 - bne _022E5DFC - ldr r0, _022E5E7C ; =ov29_0235119C - mov r1, r4, lsl #1 - ldrh r0, [r0, r1] - bl PlaySeByIdIfNotSilence - b _022E5E3C -_022E5DFC: - ldr r0, _022E5E7C ; =ov29_0235119C - mov r1, r4, lsl #1 - ldrh r0, [r0, r1] - bl PlayMeByIdIfNot998 - b _022E5E3C -_022E5E10: - cmp r4, #3 - bne _022E5E2C - ldr r0, _022E5E80 ; =ov29_02351194 - mov r1, r4, lsl #1 - ldrh r0, [r0, r1] - bl PlaySeByIdIfNotSilence - b _022E5E3C -_022E5E2C: - ldr r0, _022E5E7C ; =ov29_0235119C - mov r1, r4, lsl #1 - ldrh r0, [r0, r1] - bl PlayMeByIdIfNot998 -_022E5E3C: - mov r0, r5 - mov r1, r4 - mov r2, #0x80 - bl ov29_022E6A00 - mov r4, #0x46 - b _022E5E5C -_022E5E54: - mov r0, r4 - bl AdvanceFrame -_022E5E5C: - bl ov29_022E6C08 - cmp r0, #0 - bne _022E5E54 - bl ov29_022E6CE0 - bl ov29_02339148 - mov r0, #1 - bl ov29_0234B1A4 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_022E5E7C: .word ov29_0235119C -_022E5E80: .word ov29_02351194 - arm_func_end ov29_022E5DBC - - arm_func_start ov29_022E5E84 -ov29_022E5E84: ; 0x022E5E84 - stmdb sp!, {r4, r5, r6, lr} - mov r1, #8 - mov r2, r1 - mov r6, r0 - bl ChangeMonsterAnimation - mov r5, #0 - mov r4, #0x51 - b _022E5EC4 -_022E5EA4: - mov r0, r4 - bl AdvanceFrame - ldr r0, [r6, #0x58] - tst r0, #3 - ldreqb r0, [r6, #0xaf] - cmpeq r0, #8 - ldmneia sp!, {r4, r5, r6, pc} - add r5, r5, #1 -_022E5EC4: - cmp r5, #0x64 - blt _022E5EA4 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end ov29_022E5E84 - - arm_func_start ShouldDisplayEntityAdvanced -ShouldDisplayEntityAdvanced: ; 0x022E5ED0 - stmdb sp!, {r3, lr} - ldrb r1, [r0, #0x20] - cmp r1, #0 - moveq r0, #0 - ldmeqia sp!, {r3, pc} - ldr r1, _022E5F1C ; =DUNGEON_PTR - ldr r1, [r1] - add r1, r1, #0x1a000 -#ifdef JAPAN - ldrb r2, [r1, #0x19a] - cmp r2, #0 - beq _022E5F14 - ldr r1, [r1, #0x188] -#else - ldrb r2, [r1, #0x23e] - cmp r2, #0 - beq _022E5F14 - ldr r1, [r1, #0x22c] -#endif - cmp r1, r0 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} -_022E5F14: - bl ShouldDisplayEntityWrapper - ldmia sp!, {r3, pc} - .align 2, 0 -_022E5F1C: .word DUNGEON_PTR - arm_func_end ShouldDisplayEntityAdvanced - - arm_func_start ov29_022E5F20 -ov29_022E5F20: ; 0x022E5F20 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x10 - ldr r0, _022E5FDC ; =0x00000199 - mov r8, #0 - ldr fp, _022E5FE0 ; =DUNGEON_PTR - rsb r4, r0, #0x198 - mov r7, r8 - mov r6, #2 - mov r5, r8 -_022E5F44: - ldr r0, [fp] - add r0, r0, r8, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr sb, [r0, #0xad4] -#else - ldr sb, [r0, #0xb78] -#endif - mov r0, sb - bl EntityIsValid__022E37B8 - cmp r0, #0 - ldrne sl, [sb, #0xb4] - ldrneb r0, [sl, #0xfc] - cmpne r0, #0 - beq _022E5FC8 - ldr r0, _022E5FDC ; =0x00000199 - strb r7, [sl, #0xfc] - bl GetEffectAnimationWanOffset - str r6, [sp] - str r5, [sp, #4] - str r4, [sp, #8] - and r3, r0, #0xff - ldr r1, _022E5FDC ; =0x00000199 - str r5, [sp, #0xc] - mov r0, sb - mov r2, r5 - bl PlayEffectAnimationEntity - ldrb r0, [sl, #6] - cmp r0, #0 - bne _022E5FC8 - mov r0, #0 - mov r1, sb - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r1, _022E5FE4 ; =0x00000B92 - mov r0, sb - bl LogMessageByIdWithPopup -_022E5FC8: - add r8, r8, #1 - cmp r8, #0x14 - blt _022E5F44 - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022E5FDC: .word 0x00000199 -_022E5FE0: .word DUNGEON_PTR -#ifdef JAPAN -_022E5FE4: .word 0x000008A4 -#else -_022E5FE4: .word 0x00000B92 -#endif - arm_func_end ov29_022E5F20 - - arm_func_start ov29_022E5FE8 -ov29_022E5FE8: ; 0x022E5FE8 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #0x10 - ldr r2, _022E60D4 ; =DUNGEON_PTR - mov r6, r0 - ldr r0, [r2] - mov r5, r1 - add r0, r0, #0x1a000 -#ifdef JAPAN - ldr r4, [r0, #0x188] -#else - ldr r4, [r0, #0x22c] -#endif - cmp r4, #0 - bne _022E6018 - bl GetLeader - mov r4, r0 -_022E6018: - ldr r0, _022E60D8 ; =ov29_023511DC - mov r1, r6, lsl #1 - ldrh r1, [r0, r1] - cmp r1, #0x3f00 - beq _022E6034 - mov r0, r4 - bl PlaySeByIdIfShouldDisplayEntity -_022E6034: - ldr r0, _022E60DC ; =ov29_0235122C - ldr r7, [r0, r6, lsl #2] - cmp r7, #0 - blt _022E60CC - cmp r5, #0 - beq _022E6090 - bl IsCurrentFixedRoomBossFight - cmp r0, #0 - bne _022E6090 - mov r0, r7 - bl GetEffectAnimationWanOffset - mov r3, r0 - mov r0, #2 - mov r2, #0 - stmia sp, {r0, r2} - sub r0, r2, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, r7 - and r3, r3, #0xff - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - b _022E60CC -_022E6090: - ldr r0, _022E60E0 ; =ov29_0235124C - ldr r5, [r0, r6, lsl #2] - mov r0, r5 - bl GetEffectAnimationWanOffset - mov r3, r0 - mov r0, #2 - mov r2, #0 - stmia sp, {r0, r2} - sub r0, r2, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, r5 - and r3, r3, #0xff - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity -_022E60CC: - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_022E60D4: .word DUNGEON_PTR -_022E60D8: .word ov29_023511DC -_022E60DC: .word ov29_0235122C -_022E60E0: .word ov29_0235124C - arm_func_end ov29_022E5FE8 - - arm_func_start ov29_022E60E4 -ov29_022E60E4: ; 0x022E60E4 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - mov r0, #0x29 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x29 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end ov29_022E60E4 - - arm_func_start PlayEffectAnimation0x1A9__022E6130 -PlayEffectAnimation0x1A9__022E6130: ; 0x022E6130 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E6178 ; =0x000001A9 - bl GetEffectAnimationWanOffset - mov r3, r0 - mov r0, #2 - mov r2, #0 - stmia sp, {r0, r2} - sub r0, r2, #1 - str r0, [sp, #8] - ldr r1, _022E6178 ; =0x000001A9 - mov r0, r4 - and r3, r3, #0xff - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E6178: .word 0x000001A9 - arm_func_end PlayEffectAnimation0x1A9__022E6130 - - arm_func_start PlayEffectAnimation0x1A9__022E617C -PlayEffectAnimation0x1A9__022E617C: ; 0x022E617C - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E61C4 ; =0x000001A9 - bl GetEffectAnimationWanOffset - mov r3, r0 - mov r0, #2 - mov r2, #0 - stmia sp, {r0, r2} - sub r0, r2, #1 - str r0, [sp, #8] - ldr r1, _022E61C4 ; =0x000001A9 - mov r0, r4 - and r3, r3, #0xff - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E61C4: .word 0x000001A9 - arm_func_end PlayEffectAnimation0x1A9__022E617C - - arm_func_start PlayEffectAnimation0x1A9__022E61C8 -PlayEffectAnimation0x1A9__022E61C8: ; 0x022E61C8 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E6210 ; =0x000001A9 - bl GetEffectAnimationWanOffset - mov r3, r0 - mov r0, #2 - mov r2, #0 - stmia sp, {r0, r2} - sub r0, r2, #1 - str r0, [sp, #8] - ldr r1, _022E6210 ; =0x000001A9 - mov r0, r4 - and r3, r3, #0xff - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E6210: .word 0x000001A9 - arm_func_end PlayEffectAnimation0x1A9__022E61C8 - - arm_func_start PlayEffectAnimation0x1A9__022E6214 -PlayEffectAnimation0x1A9__022E6214: ; 0x022E6214 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E625C ; =0x000001A9 - bl GetEffectAnimationWanOffset - mov r3, r0 - mov r0, #2 - mov r2, #0 - stmia sp, {r0, r2} - sub r0, r2, #1 - str r0, [sp, #8] - ldr r1, _022E625C ; =0x000001A9 - mov r0, r4 - and r3, r3, #0xff - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E625C: .word 0x000001A9 - arm_func_end PlayEffectAnimation0x1A9__022E6214 - - arm_func_start ov29_022E6260 -ov29_022E6260: ; 0x022E6260 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - mov r0, #0x1a8 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov r2, #0 - stmia sp, {r0, r2} - sub r0, r2, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x1a8 - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end ov29_022E6260 - - arm_func_start PlayEffectAnimation0x29 -PlayEffectAnimation0x29: ; 0x022E62A8 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - mov r0, #0x29 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov r2, #0 - stmia sp, {r0, r2} - sub r0, r2, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x29 - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end PlayEffectAnimation0x29 - - arm_func_start ov29_022E62F0 -ov29_022E62F0: ; 0x022E62F0 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - mov r0, #0x48 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov r2, #0 - stmia sp, {r0, r2} - sub r0, r2, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x48 - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end ov29_022E62F0 - - arm_func_start ov29_022E6338 -ov29_022E6338: ; 0x022E6338 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E6384 ; =0x000001A6 - bl GetEffectAnimationWanOffset - mov r2, r0 - mov ip, #0 - mov r1, #2 - stmia sp, {r1, ip} - sub r0, ip, #1 - str r0, [sp, #8] - and r3, r2, #0xff - mov r0, r4 - add r1, r1, #0x1a4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E6384: .word 0x000001A6 - arm_func_end ov29_022E6338 - - arm_func_start ov29_022E6388 -ov29_022E6388: ; 0x022E6388 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E63D4 ; =0x00000297 - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E63D4 ; =0x00000297 - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E63D4: .word 0x00000297 - arm_func_end ov29_022E6388 - - arm_func_start PlayEffectAnimation0x18E -PlayEffectAnimation0x18E: ; 0x022E63D8 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E6420 ; =0x0000018E - bl GetEffectAnimationWanOffset - mov r3, r0 - mov r2, #0 - mov r1, #2 - stmia sp, {r1, r2} - sub r0, r2, #1 - str r0, [sp, #8] - mov r0, r4 - add r1, r1, #0x18c - and r3, r3, #0xff - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E6420: .word 0x0000018E - arm_func_end PlayEffectAnimation0x18E - - arm_func_start ov29_022E6424 -ov29_022E6424: ; 0x022E6424 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - mov r0, #0x1b0 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x1b0 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - mov r0, #0xa - mov r1, #0x42 - bl ov29_022EA370 - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end ov29_022E6424 - - arm_func_start ov29_022E647C -ov29_022E647C: ; 0x022E647C - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - mov r0, #0x1a8 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov r2, #0 - stmia sp, {r0, r2} - sub r0, r2, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #0x1a8 - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end ov29_022E647C - - arm_func_start PlayEffectAnimation0x1A9__022E64C4 -PlayEffectAnimation0x1A9__022E64C4: ; 0x022E64C4 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E650C ; =0x000001A9 - bl GetEffectAnimationWanOffset - mov r3, r0 - mov r0, #2 - mov r2, #0 - stmia sp, {r0, r2} - sub r0, r2, #1 - str r0, [sp, #8] - ldr r1, _022E650C ; =0x000001A9 - mov r0, r4 - and r3, r3, #0xff - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E650C: .word 0x000001A9 - arm_func_end PlayEffectAnimation0x1A9__022E64C4 - - arm_func_start PlayEffectAnimation0x1A9__022E6510 -PlayEffectAnimation0x1A9__022E6510: ; 0x022E6510 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E6558 ; =0x000001A9 - bl GetEffectAnimationWanOffset - mov r3, r0 - mov r0, #2 - mov r2, #0 - stmia sp, {r0, r2} - sub r0, r2, #1 - str r0, [sp, #8] - ldr r1, _022E6558 ; =0x000001A9 - mov r0, r4 - and r3, r3, #0xff - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E6558: .word 0x000001A9 - arm_func_end PlayEffectAnimation0x1A9__022E6510 - - arm_func_start ov29_022E655C -ov29_022E655C: ; 0x022E655C - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E65A4 ; =0x000001AB - bl GetEffectAnimationWanOffset - mov r3, r0 - mov r0, #2 - mov r2, #0 - stmia sp, {r0, r2} - sub r0, r2, #1 - str r0, [sp, #8] - ldr r1, _022E65A4 ; =0x000001AB - mov r0, r4 - and r3, r3, #0xff - str r2, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E65A4: .word 0x000001AB - arm_func_end ov29_022E655C - - arm_func_start ov29_022E65A8 -ov29_022E65A8: ; 0x022E65A8 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - mov r0, #4 - bl GetEffectAnimationWanOffset - mov r1, r0 - and r3, r1, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - mov r0, r4 - mov r1, #4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - arm_func_end ov29_022E65A8 - - arm_func_start ov29_022E65F4 -ov29_022E65F4: ; 0x022E65F4 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E6640 ; =0x0000011E - bl GetEffectAnimationWanOffset - mov r2, r0 - mov ip, #0 - mov r1, #2 - stmia sp, {r1, ip} - sub r0, ip, #1 - str r0, [sp, #8] - and r3, r2, #0xff - mov r0, r4 - add r1, r1, #0x11c - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E6640: .word 0x0000011E - arm_func_end ov29_022E65F4 - - arm_func_start ov29_022E6644 -ov29_022E6644: ; 0x022E6644 - stmdb sp!, {r4, lr} - sub sp, sp, #0x10 - mov r4, r0 - ldr r0, _022E6690 ; =0x0000011D - bl GetEffectAnimationWanOffset - mov r2, r0 - and r3, r2, #0xff - mov r0, #2 - mov ip, #0 - stmia sp, {r0, ip} - sub r0, ip, #1 - str r0, [sp, #8] - ldr r1, _022E6690 ; =0x0000011D - mov r0, r4 - mov r2, #1 - str ip, [sp, #0xc] - bl PlayEffectAnimationEntity - add sp, sp, #0x10 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E6690: .word 0x0000011D - arm_func_end ov29_022E6644 - - arm_func_start PlayKeyDoorUnlockEffect -PlayKeyDoorUnlockEffect: ; 0x022E6694 - stmdb sp!, {r4, lr} - mov r4, r1 - ldr r1, _022E66C0 ; =0x0000019E - mov r2, #1 - bl PlayEffectAnimationPos - cmp r4, #0 - ldmeqia sp!, {r4, pc} - mov r0, #0 - mov r1, #9 - bl ov29_022E56F4 - ldmia sp!, {r4, pc} - .align 2, 0 -_022E66C0: .word 0x0000019E - arm_func_end PlayKeyDoorUnlockEffect diff --git a/asm/overlay_29_023047DC.s b/asm/overlay_29_023047DC.s deleted file mode 100644 index 9a8cd796..00000000 --- a/asm/overlay_29_023047DC.s +++ /dev/null @@ -1,1036 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_023047DC.inc" - - .text - - arm_func_start ov29_023047DC -ov29_023047DC: ; 0x023047DC - stmdb sp!, {r4, r5, r6, lr} - ldr r4, _0230482C ; =DUNGEON_PTR - mov r5, #0 -_023047E8: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r6, [r0, #0xad4] -#else - ldr r6, [r0, #0xb78] -#endif - mov r0, r6 - bl EntityIsValid__023047B8 - cmp r0, #0 - beq _0230481C - mov r0, r6 - bl GetIdleAnimationId - mov r1, r0 - mov r0, r6 - bl ov29_02304830 -_0230481C: - add r5, r5, #1 - cmp r5, #0x14 - blt _023047E8 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0230482C: .word DUNGEON_PTR - arm_func_end ov29_023047DC - - arm_func_start ov29_02304830 -ov29_02304830: ; 0x02304830 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x10 - ldr r2, _0230494C ; =DUNGEON_PTR - mov r5, r0 - ldr r0, [r2] - ldr r4, [r5, #0xb4] - add r0, r0, #0x1a000 -#ifdef JAPAN - ldr r2, [r0, #0x188] - ldrb r3, [r0, #0x1a1] -#else - ldr r2, [r0, #0x22c] - ldrb r3, [r0, #0x245] -#endif - cmp r5, r2 - mov r2, #0 - strb r2, [r5, #0x28] - strb r1, [r5, #0xaf] - and r0, r1, #0xff - strb r0, [r5, #0xae] - ldrb r0, [r4, #0x4c] - moveq r3, #0 - strb r0, [r5, #0xb1] - strb r0, [r5, #0xb0] - strb r2, [r5, #0xb3] - ldrb r0, [r4, #0xd8] - ldrsh r6, [r5, #0xac] - cmp r0, #2 - beq _023048E0 - cmp r3, #0 - bne _023048E0 - ldrsh r1, [r5, #0xa8] - add r0, r5, #0x2c - bl SetSpriteIdForAnimationControl - bl Rand16Bit - ldrb r1, [r5, #0xaa] - and r0, r0, #3 - mov r3, r6, lsl #0x10 - str r1, [sp] - str r0, [sp, #4] - mov r0, #0 - str r0, [sp, #8] - str r0, [sp, #0xc] - ldrb r1, [r5, #0xae] - ldrb r2, [r5, #0xb0] - add r0, r5, #0x2c - mov r3, r3, asr #0x10 - bl SetAndPlayAnimationForAnimationControl - b _0230492C -_023048E0: - ldr r0, _02304950 ; =0x00000229 - bl DungeonGetSpriteIndex - mov r1, r0 - add r0, r5, #0x2c - bl SetSpriteIdForAnimationControl - bl Rand16Bit - mov r1, r6, lsl #0x10 - mov r3, r1, asr #0x10 - ldrb r2, [r5, #0xaa] - and r1, r0, #3 - mov r0, #0 - str r2, [sp] - str r1, [sp, #4] - str r0, [sp, #8] - str r0, [sp, #0xc] - add r0, r5, #0x2c - ldrb r1, [r5, #0xae] - ldrb r2, [r5, #0xb0] - bl SetAndPlayAnimationForAnimationControl -_0230492C: - mov r0, #0 - strb r0, [r5, #0xb2] - ldrb r0, [r4, #6] - cmp r0, #0 - bne _02304944 - bl ov29_022E8104 -_02304944: - add sp, sp, #0x10 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0230494C: .word DUNGEON_PTR -_02304950: .word 0x00000229 - arm_func_end ov29_02304830 - - arm_func_start ov29_02304954 -ov29_02304954: ; 0x02304954 - stmdb sp!, {r4, r5, r6, lr} - ldr r4, _023049A4 ; =DUNGEON_PTR - mov r5, #0 -_02304960: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r6, [r0, #0xad4] -#else - ldr r6, [r0, #0xb78] -#endif - mov r0, r6 - bl EntityIsValid__023047B8 - cmp r0, #0 - beq _02304994 - mov r0, r6 - bl GetIdleAnimationId - mov r1, r0 - mov r0, r6 - bl ov29_02304830 -_02304994: - add r5, r5, #1 - cmp r5, #0x14 - blt _02304960 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_023049A4: .word DUNGEON_PTR - arm_func_end ov29_02304954 - - arm_func_start ChangeMonsterAnimation -ChangeMonsterAnimation: ; 0x023049A8 - ldr r3, [r0] - cmp r3, #1 - bxne lr - mov r3, #0 - strb r3, [r0, #0x28] - strb r1, [r0, #0xae] - cmp r2, #0 - bxlt lr - cmp r2, #8 - strltb r2, [r0, #0xb0] - bx lr - arm_func_end ChangeMonsterAnimation - - arm_func_start ov29_023049D4 -ov29_023049D4: ; 0x023049D4 - stmdb sp!, {r3, lr} - ldr r3, [r0] - cmp r3, #1 - ldmneia sp!, {r3, pc} - ldrb r3, [r0, #0xaf] - cmp r3, r1 - ldreqb r3, [r0, #0xb1] - cmpeq r3, r2 - ldmeqia sp!, {r3, pc} - bl ChangeMonsterAnimation - ldmia sp!, {r3, pc} - arm_func_end ov29_023049D4 - - arm_func_start MakeMonsterIdleInDirectionIfValid -MakeMonsterIdleInDirectionIfValid: ; 0x02304A00 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldr r2, [r5] - mov r4, r1 - cmp r2, #1 - ldmneia sp!, {r3, r4, r5, pc} - bl GetIdleAnimationId - strb r0, [r5, #0xae] - mov r0, #0 - strb r0, [r5, #0x28] - cmp r4, #0 - ldmltia sp!, {r3, r4, r5, pc} - cmp r4, #8 - ldrlt r0, [r5, #0xb4] - andlt r1, r4, #7 - strltb r1, [r0, #0x4c] - strltb r1, [r5, #0xb0] - ldmia sp!, {r3, r4, r5, pc} - arm_func_end MakeMonsterIdleInDirectionIfValid - - arm_func_start ChangeMonsterAnimationToIdle -ChangeMonsterAnimationToIdle: ; 0x02304A48 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldr r2, [r5] - mov r4, r1 - cmp r2, #1 - ldmneia sp!, {r3, r4, r5, pc} - bl GetIdleAnimationId - strb r0, [r5, #0xae] - mov r0, #0 - strb r0, [r5, #0x28] - cmp r4, #0 - ldmltia sp!, {r3, r4, r5, pc} - cmp r4, #8 - strltb r4, [r5, #0xb0] - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ChangeMonsterAnimationToIdle - - arm_func_start ChangeMonsterAnimationToHurt -ChangeMonsterAnimationToHurt: ; 0x02304A84 - ldr r2, [r0] - cmp r2, #1 - bxne lr - mov r2, #6 - strb r2, [r0, #0xae] - mov r2, #0 - strb r2, [r0, #0x28] - cmp r1, #0 - bxlt lr - cmp r1, #8 - strltb r1, [r0, #0xb0] - bx lr - arm_func_end ChangeMonsterAnimationToHurt - - arm_func_start GetIdleAnimationId -GetIdleAnimationId: ; 0x02304AB4 - ldr r1, [r0, #0xb4] - ldrb r0, [r1, #0xbd] - cmp r0, #1 - cmpne r0, #5 - cmpne r0, #3 - bne _02304AE8 - ldrsh r0, [r1, #4] - cmp r0, #0xb9 - ldreqb r0, [r1, #0xbe] - cmpeq r0, #0x7f - moveq r0, #7 - movne r0, #5 - bx lr -_02304AE8: - ldrb r0, [r1, #0xd2] - cmp r0, #1 - moveq r0, #0xb - movne r0, #7 - bx lr - arm_func_end GetIdleAnimationId - - arm_func_start MakeMonsterIdleInDirection -MakeMonsterIdleInDirection: ; 0x02304AFC - ldr r2, [r0, #0xb4] - and r1, r1, #7 - ldr ip, _02304B10 ; =ChangeMonsterAnimationToIdle - strb r1, [r2, #0x4c] - bx ip - .align 2, 0 -_02304B10: .word ChangeMonsterAnimationToIdle - arm_func_end MakeMonsterIdleInDirection - - arm_func_start ov29_02304B14 -ov29_02304B14: ; 0x02304B14 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r0 - bl EntityIsValid__023047B8 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - ldr r6, [r7, #0xb4] - mov r5, #0 - mov r4, #0x21 - b _02304B58 -_02304B38: - mov r0, r4 - bl AdvanceFrame - ldrsh r0, [r6, #4] - ldrb r1, [r7, #0xaf] - bl sub_02053038 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - add r5, r5, #1 -_02304B58: - cmp r5, #0x64 - blt _02304B38 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ov29_02304B14 - - arm_func_start DetermineAllMonsterShadow -DetermineAllMonsterShadow: ; 0x02304B64 - stmdb sp!, {r4, r5, r6, lr} - ldr r4, _02304BA8 ; =DUNGEON_PTR - mov r5, #0 -_02304B70: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r6, [r0, #0xad4] -#else - ldr r6, [r0, #0xb78] -#endif - mov r0, r6 - bl EntityIsValid__023047B8 - cmp r0, #0 - beq _02304B98 - mov r0, r6 - bl DetermineMonsterShadow -_02304B98: - add r5, r5, #1 - cmp r5, #0x14 - blt _02304B70 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_02304BA8: .word DUNGEON_PTR - arm_func_end DetermineAllMonsterShadow - - arm_func_start DetermineMonsterShadow -DetermineMonsterShadow: ; 0x02304BAC - stmdb sp!, {r4, r5, r6, lr} - mov r4, r0 - bl GetTileAtEntity - ldrh r1, [r0] - ldr r5, [r4, #0xb4] - ldrsh r0, [r5, #4] - and r6, r1, #3 - bl GetShadowSize - mov r4, r0 - cmp r6, #3 - moveq r0, #6 - ldmeqia sp!, {r4, r5, r6, pc} - cmp r6, #1 - bne _02304BF8 - bl IsWaterTileset - cmp r0, #0 - ldrne r0, _02304C30 ; =ov29_02352808 - ldrneb r4, [r0, r4] - b _02304C24 -_02304BF8: - cmp r6, #2 - bne _02304C24 - ldr r0, _02304C34 ; =DUNGEON_PTR - ldr r1, _02304C38 ; =SECONDARY_TERRAIN_TYPES - ldr r0, [r0] - add r0, r0, #0x4000 -#ifdef JAPAN - ldrsh r0, [r0, #0x30] -#else - ldrsh r0, [r0, #0xd4] -#endif - ldrb r0, [r1, r0] - cmp r0, #1 - ldrne r0, _02304C30 ; =ov29_02352808 - ldrneb r4, [r0, r4] -_02304C24: - mov r0, r4 -#ifdef JAPAN - strb r4, [r5, #0x21c] -#else - strb r4, [r5, #0x220] -#endif - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_02304C30: .word ov29_02352808 -_02304C34: .word DUNGEON_PTR -_02304C38: .word SECONDARY_TERRAIN_TYPES - arm_func_end DetermineMonsterShadow - - arm_func_start ov29_02304C3C -ov29_02304C3C: ; 0x02304C3C - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov r4, r0 - mov sl, r1 - bl EntityIsValid__023047B8 - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - ldr r0, [r4] - cmp r0, #1 - ldmneia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - ldr r1, [r4, #0xb4] - mov r0, r4 - ldrb r7, [r1, #0x4c] - mov r8, r7 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - mov sb, #0 - mov r6, #2 - mov r5, #0x43 - b _02304CC0 -_02304C8C: - mov r0, r4 - mov r1, r8 - bl ChangeMonsterAnimationToIdle - mov r0, r6 - mov r1, r5 - bl ov29_022EA370 - add r0, r8, #1 - mov r0, r0, lsl #0x10 - mov r1, r0, asr #0x10 - add r0, sb, #1 - mov r0, r0, lsl #0x10 - and r8, r1, #7 - mov sb, r0, asr #0x10 -_02304CC0: - cmp sb, sl, lsl #3 - blt _02304C8C - mov r6, #2 - mov r5, #0x43 - b _02304CFC -_02304CD4: - mov r0, r4 - mov r1, r8 - bl ChangeMonsterAnimationToIdle - mov r0, r6 - mov r1, r5 - bl ov29_022EA370 - add r0, r8, #1 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - and r8, r0, #7 -_02304CFC: - cmp r8, r7 - bne _02304CD4 - mov r0, r4 - mov r1, r8 - bl ChangeMonsterAnimationToIdle - mov r0, #2 - mov r1, #0x43 - bl ov29_022EA370 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end ov29_02304C3C - - arm_func_start ov29_02304D20 -ov29_02304D20: ; 0x02304D20 -#ifdef JAPAN -#define OV29_02304D20_OFFSET -4 -#else -#define OV29_02304D20_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov r6, r0 - ldr sb, [r6, #0xb4] - mov r5, r1 - add r0, sb, #0x200 - ldrsh r0, [r0, #0xc + OV29_02304D20_OFFSET] - mov r4, r2 - cmp r0, #4 - movge r0, #0 - strgeh r0, [sb, #0x4a] - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - bl GetSpeedOption - cmp r0, #0 - movne r1, #2 - ldr r2, _02304FD4 ; =ov29_0237C9CC - moveq r1, #1 - str r1, [r2] - add r0, sb, #0x200 - ldrsh r3, [r0, #0xc + OV29_02304D20_OFFSET] - mov r1, #0x1c - add r0, sb, #0x19c + OV29_02304D20_OFFSET - smulbb sl, r3, r1 - add r7, r0, sl - mov r1, #0 - strb r1, [r7, #0x1a] - str r5, [r7, #0xc] - ldrsh r8, [r6, #4] - mov r3, r5, lsl #2 - ldr r1, _02304FD8 ; =ov29_0235173C - strh r8, [r0, sl] - ldrsh r5, [r6, #6] - ldr r0, _02304FDC ; =ov29_0235173E - ldrsh r1, [r1, r3] - strh r5, [r7, #2] - ldrsh r5, [r4] - ldrsh r0, [r0, r3] - str r5, [r7, #4] - ldrsh r3, [r4, #2] - str r3, [r7, #8] - ldr r3, [r2] - mul r1, r3, r1 - str r1, [r7, #0x10] - ldr r1, [r2] - mul r0, r1, r0 - str r0, [r7, #0x14] - bl GetSpeedOption - cmp r0, #0 - movne r1, #2 - ldr r5, _02304FD4 ; =ov29_0237C9CC - moveq r1, #1 - add r0, sb, #0x200 - str r1, [r5] - ldrsh r1, [r0, #0xc + OV29_02304D20_OFFSET] - add r1, r1, #1 - strh r1, [r0, #0xc + OV29_02304D20_OFFSET] - ldrsh r0, [r0, #0xc + OV29_02304D20_OFFSET] - cmp r0, #2 - bne _02304E6C - ldr r1, [r5] - mov r0, #0x18 - mov r1, r1, lsl #1 - bl _s32_div_f - add r1, sb, #0x100 - strh r0, [r1, #0xb4 + OV29_02304D20_OFFSET] - ldr r0, [sb, #0x1ac + OV29_02304D20_OFFSET] - mov r1, r5 - mov r0, r0, lsl #1 - str r0, [sb, #0x1ac + OV29_02304D20_OFFSET] - ldr r2, [sb, #0x1b0 + OV29_02304D20_OFFSET] - mov r0, #0x18 - mov r2, r2, lsl #1 - str r2, [sb, #0x1b0 + OV29_02304D20_OFFSET] - ldr r1, [r1] - mov r1, r1, lsl #1 - bl _s32_div_f - strh r0, [r7, #0x18] - ldr r0, [r7, #0x10] - mov r0, r0, lsl #1 - str r0, [r7, #0x10] - ldr r0, [r7, #0x14] - mov r0, r0, lsl #1 - str r0, [r7, #0x14] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_02304E6C: - cmp r0, #3 - bne _02304F14 - mov r6, #0 - mov r4, #0x18 - mov sl, #0x1c -_02304E80: - mla r8, r6, sl, sb - ldr r1, [r5] - mov r0, r4 - add r1, r1, r1, lsl #1 - bl _s32_div_f - add r1, r8, #0x100 - strh r0, [r1, #0xb4 + OV29_02304D20_OFFSET] - ldr r0, [r8, #0x1ac + OV29_02304D20_OFFSET] - add r6, r6, #1 - add r0, r0, r0, lsl #1 - str r0, [r8, #0x1ac + OV29_02304D20_OFFSET] - ldr r0, [r8, #0x1b0 + OV29_02304D20_OFFSET] - cmp r6, #2 - add r0, r0, r0, lsl #1 - str r0, [r8, #0x1b0 + OV29_02304D20_OFFSET] - ldr r0, [r8, #0x1ac + OV29_02304D20_OFFSET] - add r0, r0, r0, lsr #31 - mov r0, r0, asr #1 - str r0, [r8, #0x1ac + OV29_02304D20_OFFSET] - ldr r0, [r8, #0x1b0 + OV29_02304D20_OFFSET] - add r0, r0, r0, lsr #31 - mov r0, r0, asr #1 - str r0, [r8, #0x1b0 + OV29_02304D20_OFFSET] - blt _02304E80 - ldr r1, _02304FD4 ; =ov29_0237C9CC - mov r0, #0x18 - ldr r1, [r1] - add r1, r1, r1, lsl #1 - bl _s32_div_f - strh r0, [r7, #0x18] - ldr r0, [r7, #0x10] - add r0, r0, r0, lsl #1 - str r0, [r7, #0x10] - ldr r0, [r7, #0x14] - add r0, r0, r0, lsl #1 - str r0, [r7, #0x14] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_02304F14: - cmp r0, #4 - bne _02304FC0 - mov r8, #0 - mov r6, #0x18 - mov fp, #3 - mov r4, #0x1c -_02304F2C: - mla sl, r8, r4, sb - ldr r1, [r5] - mov r0, r6 - mov r1, r1, lsl #2 - bl _s32_div_f - add r1, sl, #0x100 - strh r0, [r1, #0xb4 + OV29_02304D20_OFFSET] - ldr r0, [sl, #0x1ac + OV29_02304D20_OFFSET] - mov r1, fp - mov r0, r0, lsl #2 - str r0, [sl, #0x1ac + OV29_02304D20_OFFSET] - ldr r0, [sl, #0x1b0 + OV29_02304D20_OFFSET] - mov r0, r0, lsl #2 - str r0, [sl, #0x1b0 + OV29_02304D20_OFFSET] - ldr r0, [sl, #0x1ac + OV29_02304D20_OFFSET] - bl _s32_div_f - str r0, [sl, #0x1ac + OV29_02304D20_OFFSET] - ldr r0, [sl, #0x1b0 + OV29_02304D20_OFFSET] - mov r1, #3 - bl _s32_div_f - add r8, r8, #1 - str r0, [sl, #0x1b0 + OV29_02304D20_OFFSET] - cmp r8, #3 - blt _02304F2C - ldr r1, _02304FD4 ; =ov29_0237C9CC - mov r0, #0x18 - ldr r1, [r1] - mov r1, r1, lsl #2 - bl _s32_div_f - strh r0, [r7, #0x18] - ldr r0, [r7, #0x10] - mov r0, r0, lsl #2 - str r0, [r7, #0x10] - ldr r0, [r7, #0x14] - mov r0, r0, lsl #2 - str r0, [r7, #0x14] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_02304FC0: - ldr r1, [r5] - mov r0, #0x18 - bl _s32_div_f - strh r0, [r7, #0x18] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02304FD4: .word ov29_0237C9CC -_02304FD8: .word ov29_0235173C -_02304FDC: .word ov29_0235173E - arm_func_end ov29_02304D20 - - arm_func_start DisplayActions -DisplayActions: ; 0x02304FE0 -#ifdef JAPAN -#define DISPLAY_ACTIONS_OFFSET -4 -#define DISPLAY_ACTIONS_OFFSET_2 -0xA4 -#else -#define DISPLAY_ACTIONS_OFFSET 0 -#define DISPLAY_ACTIONS_OFFSET_2 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x14 - ldr r1, _02305580 ; =ov29_0237C9C1 - mov r6, #0 - mov sl, r0 - mov r7, r6 - strb r6, [r1] - bl GetSpeedOption - cmp r0, #0 - mov r5, #0 - movne r1, #2 - ldr r0, _02305584 ; =ov29_0237C9CC - moveq r1, #1 - str r1, [r0] - mov r4, r5 - mov fp, r5 -_02305020: - ldr r0, _02305588 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 - ldr r8, [r0, #0xb78 + DISPLAY_ACTIONS_OFFSET_2] - mov r0, r8 - bl EntityIsValid__0230558C - cmp r0, #0 - beq _02305160 - ldr sb, [r8, #0xb4] - add r0, sb, #0x200 - ldrsh r0, [r0, #0xc + DISPLAY_ACTIONS_OFFSET] - cmp r0, #0 - bne _023050EC - ldrb r0, [sb, #0x151 + DISPLAY_ACTIONS_OFFSET] - cmp r0, #0 - beq _02305160 - strb r4, [sb, #0x151 + DISPLAY_ACTIONS_OFFSET] - add r0, sb, #0x100 - ldrsh r1, [r0, #0x7e + DISPLAY_ACTIONS_OFFSET] - cmp r1, #0 - ldreqsh r0, [r0, #0x80 + DISPLAY_ACTIONS_OFFSET] - cmpeq r0, #0 - beq _02305160 - ldrsh r0, [r8, #4] - cmp r1, r0 - addeq r0, sb, #0x100 - ldreqsh r1, [r0, #0x80 + DISPLAY_ACTIONS_OFFSET] - ldreqsh r0, [r8, #6] - cmpeq r1, r0 - beq _02305160 - mov r0, r8 - mov r1, #1 - bl CheckVariousStatuses2__02301244 - cmp r0, #0 - beq _023050C0 - mov r0, r8 - bl CheckVariousStatuses__023016DC - cmp r0, #0 - bne _02305160 -_023050C0: - add r0, r8, #4 - add r1, sb, #0x7e + DISPLAY_ACTIONS_OFFSET - add r1, r1, #0x100 - bl GetDirectionTowardsPosition - mov r1, r0 - ldrb r0, [sb, #0x4c] - cmp r1, r0 - beq _02305160 - mov r0, r8 - bl ChangeMonsterAnimationToIdle - b _02305160 -_023050EC: - ldrh r2, [sb] - mov r0, r8 - add r1, sp, #0xc - orr r2, r2, #0x2000 - strh r2, [sb] - ldr r3, [sb, #0x1a0 + DISPLAY_ACTIONS_OFFSET] - mov r2, #0x18 - mul r2, r3, r2 - add r2, r2, #0xc - mov r2, r2, lsl #8 - str r2, [sp, #0xc] - ldr r3, [sb, #0x1a4 + DISPLAY_ACTIONS_OFFSET] - mov r2, #0x18 - mul r2, r3, r2 - add r2, r2, #0x10 - mov r2, r2, lsl #8 - str r2, [sp, #0x10] - bl UpdateEntityPixelPos - ldr r2, [sb, #0x1a8 + DISPLAY_ACTIONS_OFFSET] - mov r0, r8 - mov r1, #0 - bl ov29_023049D4 - add r0, sb, #0x200 - strh fp, [r0, #0xe + DISPLAY_ACTIONS_OFFSET] - mov r0, r8 - mov r6, #1 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - movne r7, r6 -_02305160: - add r5, r5, #1 - cmp r5, #0x14 - blt _02305020 - cmp r6, #0 - moveq r0, #0 - beq _02305578 - ldr r0, _02305588 ; =DUNGEON_PTR - ldr r1, [r0] - ldr r6, [r1, #0xc4] - str sl, [r1, #0xc4] - ldr r0, [r0] - ldrb r0, [r0, #0x78b] - cmp r0, #0 - bne _0230532C - cmp r7, #0 - beq _0230532C - mov r0, #0x35 - bl WaitUntilAlertBoxTextIsLoaded - mov r5, #0 - b _02305314 -_023051B0: - mov r0, #7 - bl AdvanceFrame - mov sl, #0 - ldr r4, _02305588 ; =DUNGEON_PTR - mov fp, sl -_023051C4: - ldr r0, [r4] - add r0, r0, sl, lsl #2 - add r0, r0, #0x12000 - ldr r7, [r0, #0xb78 + DISPLAY_ACTIONS_OFFSET_2] - mov r0, r7 - bl EntityIsValid__0230558C - cmp r0, #0 - beq _02305304 - ldr sb, [r7, #0xb4] - add r0, sb, #0x200 - ldrsh r2, [r0, #0xe + DISPLAY_ACTIONS_OFFSET] - ldrsh r1, [r0, #0xc + DISPLAY_ACTIONS_OFFSET] - add r3, sb, #0x19c + DISPLAY_ACTIONS_OFFSET - mov r0, #0x1c - smlabb r8, r2, r0, r3 - cmp r1, #0 - beq _02305304 - mov r0, r7 - ldr r1, [r8, #0x10] - ldr r2, [r8, #0x14] - bl IncrementEntityPixelPosXY - ldrb r0, [sb, #7] - cmp r0, #0 - beq _02305258 - ldr r0, [r4] - add r0, r0, #0x100 - ldrsh r1, [r0, #0xdc] - cmp r1, #0 - blt _02305258 - ldr r1, [r7, #0xc] - mov r1, r1, asr #8 - strh r1, [r0, #0xdc] - ldr r1, [r7, #0x10] - ldr r0, [r4] - mov r1, r1, asr #8 - add r0, r0, #0x100 - strh r1, [r0, #0xde] -_02305258: - ldrsh r0, [r8, #0x18] - sub r0, r0, #1 - strh r0, [r8, #0x18] - ldrsh r0, [r8, #0x18] - cmp r0, #0 - bne _02305304 - add r2, sb, #0x200 - ldrsh r0, [r2, #0xe + DISPLAY_ACTIONS_OFFSET] - add r0, r0, #1 - strh r0, [r2, #0xe + DISPLAY_ACTIONS_OFFSET] - ldrsh r1, [r2, #0xe + DISPLAY_ACTIONS_OFFSET] - ldrsh r0, [r2, #0xc + DISPLAY_ACTIONS_OFFSET] - cmp r1, r0 - streqh fp, [r2, #0xc + DISPLAY_ACTIONS_OFFSET] - beq _02305304 - mov r0, #0x1c - smlabb r0, r1, r0, sb - ldr r3, [r0, #0x1a0 + DISPLAY_ACTIONS_OFFSET] - mov r1, #0x18 - mul r1, r3, r1 - add r1, r1, #0xc - mov r1, r1, lsl #8 - str r1, [sp, #4] - ldrsh r3, [r2, #0xe + DISPLAY_ACTIONS_OFFSET] - mov r2, #0x1c - mov r0, r7 - smlabb r2, r3, r2, sb - ldr r3, [r2, #0x1a4 + DISPLAY_ACTIONS_OFFSET] - mov r2, #0x18 - mul r2, r3, r2 - add r2, r2, #0x10 - mov r2, r2, lsl #8 - add r1, sp, #4 - str r2, [sp, #8] - bl UpdateEntityPixelPos - add r2, sb, #0x200 - ldrsh r3, [r2, #0xe + DISPLAY_ACTIONS_OFFSET] - mov r2, #0x1c - mov r0, r7 - smlabb r2, r3, r2, sb - ldr r2, [r2, #0x1a8 + DISPLAY_ACTIONS_OFFSET] - mov r1, #0 - bl ov29_023049D4 -_02305304: - add sl, sl, #1 - cmp sl, #0x14 - blt _023051C4 - add r5, r5, #1 -_02305314: - ldr r1, _02305584 ; =ov29_0237C9CC - mov r0, #0x18 - ldr r1, [r1] - bl _s32_div_f - cmp r5, r0 - blt _023051B0 -_0230532C: - mov r7, #0 - ldr r8, _02305588 ; =DUNGEON_PTR - mov r4, r7 -_02305338: - ldr r0, [r8] - add r0, r0, r7, lsl #2 - add r0, r0, #0x12000 - ldr r5, [r0, #0xb78 + DISPLAY_ACTIONS_OFFSET_2] - mov r0, r5 - bl EntityIsValid__0230558C - cmp r0, #0 - beq _0230537C - ldr r1, [r5, #0xb4] - add r0, r1, #0x200 - strh r4, [r0, #0xc + DISPLAY_ACTIONS_OFFSET] - ldrh r0, [r1] - tst r0, #0x2000 - beq _0230537C - mov r0, r5 - mov r1, r4 - bl UpdateEntityPixelPos -_0230537C: - add r7, r7, #1 - cmp r7, #0x14 - blt _02305338 - bl ov29_02307DD0 - mov r8, #0 -_02305390: - mov sl, #0 - mov fp, sl - mov r7, #1 - ldr r5, _02305588 ; =DUNGEON_PTR - ldr r4, _02305580 ; =ov29_0237C9C1 - b _02305530 -_023053A8: - ldr r0, [r5] - add r0, r0, sl, lsl #2 - add r0, r0, #0x12000 - ldr sb, [r0, #0xb78 + DISPLAY_ACTIONS_OFFSET_2] - mov r0, sb - bl EntityIsValid__0230558C - cmp r0, #0 - beq _0230552C - bl IsFloorOver - cmp r0, #0 - bne _02305538 - ldr r0, [sb, #0xb4] - cmp r8, #0 - ldrb r1, [r0, #7] - bne _023053F0 - cmp r1, #0 - beq _0230552C - b _023053F8 -_023053F0: - cmp r1, #0 - bne _0230552C -_023053F8: - ldrh r3, [sb, #4] - ldrh r2, [sb, #6] - ldrh r1, [r0] - strh r3, [sp] - strh r2, [sp, #2] - tst r1, #0x2000 - bne _02305430 - mov r0, sb - bl ov29_0234AD10 - mov r0, sb - bl EntityIsValid__0230558C - cmp r0, #0 - beq _0230552C - b _023054E4 -_02305430: - bic r1, r1, #0x2000 - strh r1, [r0] - ldrb r0, [r0, #7] - cmp r0, #0 - beq _0230545C - add r0, sb, #4 - bl DiscoverMinimap - mov r0, fp - bl HandleShopTransaction - bl CheckLeaderTile - b _0230547C -_0230545C: - mov r0, sb - bl ov29_0234AD10 - mov r0, sb - bl EntityIsValid__0230558C - cmp r0, #0 - beq _0230552C - mov r0, sb - bl CheckNonLeaderTile -_0230547C: - mov r0, sb - bl EntityIsValid__0230558C - cmp r0, #0 - beq _0230552C - bl IsFloorOver - cmp r0, #0 - bne _02305538 - mov r0, #0 - bl TryForcedLoss - mov r0, sb - bl ActivateEndOfTurnEffects - mov r0, sb - bl EntityIsValid__0230558C - cmp r0, #0 - beq _0230552C - bl IsFloorOver - cmp r0, #0 - bne _02305538 - mov r0, sb - bl EnemyEvolution - bl ov29_02346888 - ldr r1, [r5] - mov r0, sb - add r1, r1, #0x4000 - ldrb r1, [r1, #0xc4 + DISPLAY_ACTIONS_OFFSET_2] - bl ov29_02305814 -_023054E4: - mov r0, sb - bl EntityIsValid__0230558C - cmp r0, #0 - beq _0230552C - bl IsFloorOver - cmp r0, #0 - bne _02305538 - ldrsh r1, [sp] - ldrsh r0, [sb, #4] - cmp r1, r0 - ldreqsh r1, [sp, #2] - ldreqsh r0, [sb, #6] - cmpeq r1, r0 - mov r0, sb - strneb r7, [r4] - bl ActivateTerrainEffects - mov r0, sb - bl EnsureCanStandCurrentTile -_0230552C: - add sl, sl, #1 -_02305530: - cmp sl, #0x14 - blt _023053A8 -_02305538: - add r8, r8, #1 - cmp r8, #2 - blt _02305390 - bl IsFloorOver2 - bl IsFloorOver - cmp r0, #0 - ldrne r1, _02305588 ; =DUNGEON_PTR - movne r0, #1 - ldrne r1, [r1] - strne r6, [r1, #0xc4] - bne _02305578 - bl ov29_022EF9BC - ldr r1, _02305588 ; =DUNGEON_PTR - mov r0, #1 - ldr r1, [r1] - str r6, [r1, #0xc4] -_02305578: - add sp, sp, #0x14 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02305580: .word ov29_0237C9C1 -_02305584: .word ov29_0237C9CC -_02305588: .word DUNGEON_PTR - arm_func_end DisplayActions diff --git a/include/dungeon_mode.h b/include/dungeon_mode.h index 5ff77a97..535b90f5 100644 --- a/include/dungeon_mode.h +++ b/include/dungeon_mode.h @@ -253,6 +253,18 @@ struct ai_target }; // Monster info +struct unk_02304D20 { + struct position pos; + s32 field_0x4; + s32 field_0x8; + s32 field_0xc; + s32 field_0x10; + s32 field_0x14; + s16 field_0x18; + u8 field_0x1a; + u8 field_0x1b; +}; + struct monster { // 0x0: flags: 2-byte bitfield u16 flags; @@ -526,118 +538,9 @@ struct monster { u8 field_0x199; u8 field_0x19a; u8 field_0x19b; - struct position pos; // 0x19C: Mirror of the position on the entity struct - u8 field_0x1a0; - u8 field_0x1a1; - u8 field_0x1a2; - u8 field_0x1a3; - u8 field_0x1a4; - u8 field_0x1a5; - u8 field_0x1a6; - u8 field_0x1a7; - u8 field_0x1a8; - u8 field_0x1a9; - u8 field_0x1aa; - u8 field_0x1ab; - u8 field_0x1ac; - u8 field_0x1ad; - u8 field_0x1ae; - u8 field_0x1af; - u8 field_0x1b0; - u8 field_0x1b1; - u8 field_0x1b2; - u8 field_0x1b3; - u16 walk_anim_frames_left; // 0x1B4: Number of frames left in walking animation? - u8 field_0x1b6; - u8 field_0x1b7; - u8 field_0x1b8; - u8 field_0x1b9; - u8 field_0x1ba; - u8 field_0x1bb; - u8 field_0x1bc; - u8 field_0x1bd; - u8 field_0x1be; - u8 field_0x1bf; - u8 field_0x1c0; - u8 field_0x1c1; - u8 field_0x1c2; - u8 field_0x1c3; - u8 field_0x1c4; - u8 field_0x1c5; - u8 field_0x1c6; - u8 field_0x1c7; - u8 field_0x1c8; - u8 field_0x1c9; - u8 field_0x1ca; - u8 field_0x1cb; - u8 field_0x1cc; - u8 field_0x1cd; - u8 field_0x1ce; - u8 field_0x1cf; - u8 field_0x1d0; - u8 field_0x1d1; - u8 field_0x1d2; - u8 field_0x1d3; - u8 field_0x1d4; - u8 field_0x1d5; - u8 field_0x1d6; - u8 field_0x1d7; - u8 field_0x1d8; - u8 field_0x1d9; - u8 field_0x1da; - u8 field_0x1db; - u8 field_0x1dc; - u8 field_0x1dd; - u8 field_0x1de; - u8 field_0x1df; - u8 field_0x1e0; - u8 field_0x1e1; - u8 field_0x1e2; - u8 field_0x1e3; - u8 field_0x1e4; - u8 field_0x1e5; - u8 field_0x1e6; - u8 field_0x1e7; - u8 field_0x1e8; - u8 field_0x1e9; - u8 field_0x1ea; - u8 field_0x1eb; - u8 field_0x1ec; - u8 field_0x1ed; - u8 field_0x1ee; - u8 field_0x1ef; - u8 field_0x1f0; - u8 field_0x1f1; - u8 field_0x1f2; - u8 field_0x1f3; - u8 field_0x1f4; - u8 field_0x1f5; - u8 field_0x1f6; - u8 field_0x1f7; - u8 field_0x1f8; - u8 field_0x1f9; - u8 field_0x1fa; - u8 field_0x1fb; - u8 field_0x1fc; - u8 field_0x1fd; - u8 field_0x1fe; - u8 field_0x1ff; - u8 field_0x200; - u8 field_0x201; - u8 field_0x202; - u8 field_0x203; - u8 field_0x204; - u8 field_0x205; - u8 field_0x206; - u8 field_0x207; - u8 field_0x208; - u8 field_0x209; - u8 field_0x20a; - u8 field_0x20b; - u8 field_0x20c; - u8 field_0x20d; - u8 field_0x20e; - u8 field_0x20f; + struct unk_02304D20 field_0x19c[4]; + s16 field_0x20c; + s16 field_0x20e; s16 hp_fractional; // 0x210: 200 * fractional_part(HP) // 0x212: When a Pokémon can pass through walls in a hallway, this counts up to 200 before the Pokémon turns in a random direction. s16 mobile_turn_timer; diff --git a/include/item.h b/include/item.h index f1397120..0c4ced18 100644 --- a/include/item.h +++ b/include/item.h @@ -1647,6 +1647,12 @@ struct bag_items_inner { #define RESCUE_INVENTORY_INDEX 2 #define NUM_INVENTORIES 3 +struct bulk_item +{ + /* 0x0 */ s16 id; + /* 0x2 */ u16 quantity; +}; + struct bag_items { // Indexes: // 0x0 - Main, default @@ -1655,11 +1661,15 @@ struct bag_items { /* 0x0 */ struct bag_items_inner inventories[NUM_INVENTORIES]; /* 0x384 */ struct bag_items_inner *bag_items; /* 0x388 */ u8 active_inventory_idx; - u8 fill2[0xFA3]; - u32 *field_0x132C; - u8 fill3[0x40]; - u32 *field_0x1370; - u8 fill4[0x1E]; + u8 field_0x389; + s16 field_0x38A[1000]; + u16 field_0xB5A[1000]; + u8 field_0x132A; + u8 field_0x132B; + struct bulk_item *field_0x132C; + struct bulk_item field_0x1330[2][8]; + struct bulk_item *field_0x1370; + struct bulk_item field_0x1374[2][4]; u32 maybeMoney[NUM_INVENTORIES]; // indexed with an u8, uses same indexes as Inventory u32 field_0x13A0; s16 field_0x13A4; @@ -1671,12 +1681,6 @@ struct bag_items { s16 field_0x13B2; }; -struct bulk_item -{ - /* 0x0 */ s16 id; - /* 0x2 */ u16 quantity; -}; - struct item_data { /* 0x0 */ u16 buy_price; diff --git a/include/main_0200F874.h b/include/main_0200F874.h index 9f0f759f..2e349c3e 100644 --- a/include/main_0200F874.h +++ b/include/main_0200F874.h @@ -3,8 +3,45 @@ #include "item.h" -u32 AddItemToBag(struct item *item, u32 flag); u32 AddItemToBagNoHeld(struct item *item); +u32 AddItemToBag(struct item *item, u32 flag); +void CleanStickyItemsInBag(void); +s16 CountStickyItemsInBag(void); +void sub_0200F9B4(u8 *a); +void sub_0200FA0C(u8 *a, s32 b); +u32 TransmuteHeldItemInBag(struct item *item); +void SetFlagsForHeldItemInBag(s32 held_by, u32 flags); +bool8 RemoveHolderForItemInBag(struct item *item); +void SetHolderForItemInBag(s16 index, struct item *item, u8 held_by); +void SortItemsInBag(void); +void RemovePokeItemsInBag(void); +void sub_0200FD38(void); +void sub_0200FD3C(void); +s32 sub_0200FD48(void); +bool8 IsStorageFull(void); +s32 CountNbOfItemsInStorage(void); +u32 CountNbOfValidItemsInStorage(void); +u32 CountNbOfValidItemsInTimeDarknessInStorage(void); +u32 CountNbItemsOfTypeInStorage(s16 id); +u32 CountItemTypeInStorage(struct bulk_item *bulk_item); +s16 GetEquivBulkItemIdxInStorage(struct bulk_item *bulk_item); +bool8 ConvertStorageItemAtIdxToBulkItem(s32 idx, struct bulk_item *bulk_item); +bool8 ConvertStorageItemAtIdxToItem(s32 idx, struct item *item); +s16 sub_02010044(s32 a); +u16 sub_02010060(s32 a); +void MaybeUpdateStorage(void); +bool8 sub_02010154(s32 a); +bool8 RemoveItemAtIdxInStorage(s32 idx); +bool8 RemoveBulkItemInStorage(struct bulk_item *bulk_item); +bool8 RemoveItemInStorage(struct item *item); +void StorageZInit(void); +bool8 AddBulkItemToStorage(struct bulk_item *bulk_item); +bool8 AddItemToStorage(struct item *item); +void SortItemsInStorage(u8 *selected, s32 count); +void sub_02010590(void); +void AllKecleonShopsZInit(void); +void SpecialEpisodeKecleonShopZInit(void); +void SetActiveKecleonShop(s32 idx); #endif diff --git a/include/main_02010898.h b/include/main_02010898.h index 3acd33b3..5e80a01f 100644 --- a/include/main_02010898.h +++ b/include/main_02010898.h @@ -1,6 +1,8 @@ #ifndef PMDSKY_MAIN_02010898_H #define PMDSKY_MAIN_02010898_H -u32* GetCurrentKecleonShop1ItemByIndex(s32 idx); +#include "item.h" + +struct bulk_item* GetCurrentKecleonShop1ItemByIndex(s32 idx); #endif diff --git a/include/main_02010BA4.h b/include/main_02010BA4.h index 6c1e8704..d69523e8 100644 --- a/include/main_02010BA4.h +++ b/include/main_02010BA4.h @@ -1,6 +1,8 @@ #ifndef PMDSKY_MAIN_02010BA4_H #define PMDSKY_MAIN_02010BA4_H -u32* GetCurrentKecleonShop2ItemByIndex(s32 idx); +#include "item.h" + +struct bulk_item* GetCurrentKecleonShop2ItemByIndex(s32 idx); #endif diff --git a/include/main_0202F180.h b/include/main_0202F180.h index f9486c5b..cd273cc5 100644 --- a/include/main_0202F180.h +++ b/include/main_0202F180.h @@ -2,7 +2,52 @@ #define PMDSKY_MAIN_0202F180_H #include "util.h" +#include "window.h" +#include "main_0200C4FC.h" +#include "main_0202613C.h" + +struct unk_0202F190 { + u8 field_0x0[4]; + s32 field_0x4; + u8 field_0x8; + u8 field_0x9; + u8 field_0xA; + u8 field_0xB; + struct unk_02026130 field_0xC; + char field_0x128[0x400]; +}; + +struct unk_0202F5AC { + s8 field_0x0; + u8 field_0x1[3]; + s32 field_0x4; + portrait_params field_0x8; + portrait_params field_0x18; + u8 field_0x28; + u8 field_0x29; + u8 field_0x2A; + u8 field_0x2B; + s32 field_0x2C; + u8 field_0x30[0x30]; + u8 field_0x60[0x320]; +}; bool8 IsDialogueBoxActive(s32 window_id); +void sub_0202F190(s32 window_id, s32 a, s32 b); +void ShowStringIdInDialogueBox(s32 window_id, u32 flags, s32 string_id, struct preprocessor_args *args); +void ShowStringInDialogueBox(s32 window_id, u32 flags, const char *string, struct preprocessor_args *args); +void sub_0202F2C4(s32 window_id); +void sub_0202F334(s32 window_id); +void ShowDialogueBox(s32 window_id); +void sub_0202F3F8(s32 window_id); +void ReadStringFromDialogueBox(s32 window_id, char *dest, s32 n); +void sub_0202F474(s32 window_id, s32 a); +void UpdateDialogueBox(struct Window *w); +s8 CreatePortraitBox(s32 bg_id, s32 a, s32 b); +void ClosePortraitBox(s32 window_id); +bool8 PortraitBoxNeedsUpdate(s32 window_id); +void ShowPortraitInPortraitBox(s32 window_id, portrait_params *p); +void HidePortraitBox(s32 window_id); +void UpdatePortraitBox(struct Window *w); #endif diff --git a/include/main_0202FD3C.h b/include/main_0202FD3C.h index 0bf53d59..12e1d380 100644 --- a/include/main_0202FD3C.h +++ b/include/main_0202FD3C.h @@ -1,6 +1,41 @@ #ifndef PMDSKY_MAIN_0202FD3C_H #define PMDSKY_MAIN_0202FD3C_H +#include "util.h" +#include "window.h" + +struct unk_0202F8C4 { + s8 field_0x0; + u8 field_0x1[3]; + void (*field_0x4)(s32 window_id); + void (*field_0x8)(s32 window_id, void *arg); + void (*field_0xC)(struct Window *w); + s32 field_0x10; + void *field_0x14; +}; + +struct unk_0202FBBC { + void (*field_0x0)(struct Window *w); + u32 field_0x4; + struct struct_2 field_0x8; + s32 field_0xA0; + s32 field_0xA4; + s32 field_0xA8; + char field_0xAC[0x100]; + s32 field_0x1AC; + s32 field_0x1B0; +}; + +s8 CreateTextBox(WindowTemplate *params, void (*cb)(s32 window_id)); +s8 CreateTextBoxWithArg(WindowTemplate *params, void (*cb)(s32 window_id, void *arg), void *arg); +void CloseTextBox(s32 window_id); +void CloseTextBox2(s32 window_id); +void sub_0202F954(s32 window_id); +s32 IsTextboxState3(s32 window_id); +struct unk_0202F8C4* CreateTextBoxInternal(WindowTemplate *params); +void UpdateTextBox(struct Window *w); +bool8 IsTextBoxActive(s32 window_id); +s32 CreateAreaNameBox(WindowTemplate *params, u32 flags, struct struct_2 *cfg, s32 a); void SetAreaNameBoxState3(s32 window_id); #endif diff --git a/include/overlay_29_022E563C.h b/include/overlay_29_022E563C.h index ec985ecf..b50148a9 100644 --- a/include/overlay_29_022E563C.h +++ b/include/overlay_29_022E563C.h @@ -2,9 +2,50 @@ #define PMDSKY_OVERLAY_29_022E563C_H #include "dungeon_mode.h" +#include "enums.h" #include "item.h" #include "move.h" -void ov29_022E563C(struct entity *entity); +void ov29_022E563C(struct pixel_position *pixel_pos); + +void ov29_022E5650(struct entity *a, struct entity *b); +void PlaySeByIdIfShouldDisplayEntity(struct entity *entity, s32 se_id); +void ov29_022E56D4(struct position *pos, s32 se_id); +void ov29_022E56F4(struct entity *entity, s32 id); +void PlayItemThrowSfx(struct entity *entity, enum item_category category); +void PlayMissSfx__022E611C(struct entity *attacker, struct entity *defender); +void PlayMissSfx__022E6150(struct entity *entity); +void ov29_022E57D4(struct entity *entity); +void ov29_022E5864(struct entity *entity); +void ov29_022E58B0(struct entity *entity, struct position *pos, s32 trap_id); +void ov29_022E5A00(struct entity *entity, struct item *item); +void ov29_022E5AE4(struct entity *entity, struct item *item); +s32 ov29_022E5BD8(struct entity *entity); +void PlayStairsSfx(void); +void ov29_022E5DBC(s32 param_1, s32 param_2); +void ov29_022E5E84(struct entity *a, struct entity *b); +bool8 ShouldDisplayEntityAdvanced(struct entity *entity); +void ov29_022E5F20(void); +void ov29_022E5FE8(enum weather_id weather, bool8 param_2); +void ov29_022E60E4(struct entity *entity); +void PlayEffectAnimation0x1A9__022E6130(struct entity *entity); +void PlayEffectAnimation0x1A9__022E617C(struct entity *entity); +void PlayEffectAnimation0x1A9__022E61C8(struct entity *entity); +void PlayEffectAnimation0x1A9__022E6214(struct entity *entity); +void ov29_022E6260(struct entity *entity); +void PlayEffectAnimation0x29(struct entity *entity); +void ov29_022E62F0(struct entity *entity); +void ov29_022E6338(struct entity *entity); +void ov29_022E6388(struct entity *entity); +void PlayEffectAnimation0x18E(struct entity *entity); +void ov29_022E6424(struct entity *entity); +void ov29_022E647C(struct entity *entity); +void PlayEffectAnimation0x1A9__022E64C4(struct entity *entity); +void PlayEffectAnimation0x1A9__022E6510(struct entity *entity); +void ov29_022E655C(struct entity *entity); +void ov29_022E65A8(struct entity *entity); +void ov29_022E65F4(struct entity *entity); +void ov29_022E6644(struct entity *entity); +void PlayKeyDoorUnlockEffect(struct position *pos, bool8 param_2); #endif diff --git a/include/overlay_29_023047B8.h b/include/overlay_29_023047B8.h index 2836bee4..447036ae 100644 --- a/include/overlay_29_023047B8.h +++ b/include/overlay_29_023047B8.h @@ -5,5 +5,21 @@ // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__023047B8(struct entity *entity); +void ov29_023047DC(void); +void ov29_02304830(struct entity *entity, s32 animation_group_id); +void ov29_02304954(void); +void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); +void ov29_023049D4(struct entity *entity, s32 animation_id, s32 direction); +void MakeMonsterIdleInDirectionIfValid(struct entity *entity, s32 direction); +void ChangeMonsterAnimationToIdle(struct entity *entity, s32 direction); +void ChangeMonsterAnimationToHurt(struct entity *entity, s32 direction); +s32 GetIdleAnimationId(struct entity *entity); +void MakeMonsterIdleInDirection(struct entity *entity, s32 direction); +void ov29_02304B14(struct entity *entity); +void DetermineAllMonsterShadow(void); +s32 DetermineMonsterShadow(struct entity *entity); +void ov29_02304C3C(struct entity *entity, s32 a); +void ov29_02304D20(struct entity *entity, s32 b, struct position *c); +bool8 DisplayActions(struct entity *a); #endif //PMDSKY_OVERLAY_29_023047B8_H diff --git a/include/window.h b/include/window.h index b395a788..773bfb82 100644 --- a/include/window.h +++ b/include/window.h @@ -11,24 +11,24 @@ struct struct_2 { u8 PAD2[50]; }; +typedef struct { + s32 x; + s32 y; +} Point; + // Represents the state of a portrait to be displayed inside a window typedef struct { enum monster_id monster_id; // 0x0: The species id, or the set index inside kaomado.kao // 0x2: Index of the emote in the species set of portraits u8 portrait_emotion; u8 layout_idx; // 0x3: Represents the current layout to display the portrait - u32 offset_x; // 0x4: Tile offset (x / 8) in the X axis to draw the portrait - u32 offset_y; // 0x8: Tile offset (y / 8) in the Y axis to draw the portrait + Point offset; bool8 try_flip; // 0xC: Whether to try to get a flipped portrait from kaomado.kao bool8 has_flip; // 0xD: Whether the specified emote has a flipped variant bool8 hw_flip; // 0xE: Whether the portrait should be flipped using the hardware bool8 allow_default; // 0xF: If true, try using emote index 0 if the desired emote can't be found } portrait_params; -typedef struct { - s32 x; - s32 y; -} Point; typedef struct { u32 state; diff --git a/main.lsf b/main.lsf index cca4afbf..85ccfca9 100644 --- a/main.lsf +++ b/main.lsf @@ -81,7 +81,6 @@ Static main Object src/main_0200F798.o Object asm/main_0200F7A8.o Object src/main_0200F874.o - Object asm/main_0200F884.o Object src/main_0201070C.o Object src/main_0201077C.o Object src/main_020107AC.o @@ -181,7 +180,6 @@ Static main Object src/main_0202D0D8.o Object asm/main_0202D0EC.o Object src/main_0202F180.o - Object asm/main_0202F190.o Object src/main_0202FD3C.o Object asm/main_0202FD50.o Object src/main_020307A4.o @@ -813,7 +811,6 @@ Overlay OVY_29 Object asm/overlay_29_022E4868.o Object src/overlay_29_022E4B8C.o Object src/overlay_29_022E563C.o - Object asm/overlay_29_022E5650.o Object src/overlay_29_022E66C4.o Object src/overlay_29_022E6770.o Object asm/overlay_29_022E6798.o @@ -951,7 +948,6 @@ Overlay OVY_29 Object src/overlay_29_02302A38.o Object asm/overlay_29_02302A5C.o Object src/overlay_29_023047B8.o - Object asm/overlay_29_023047DC.o Object src/overlay_29_0230558C.o Object src/overlay_29_02305C04.o Object asm/overlay_29_02305C3C.o diff --git a/src/main_0200F874.c b/src/main_0200F874.c index 84dfe6c7..8ed02044 100644 --- a/src/main_0200F874.c +++ b/src/main_0200F874.c @@ -1,6 +1,534 @@ #include "main_0200F874.h" +#include "item_util.h" +#include "item_util_1.h" +#include "item_util_4.h" +#include "main_0200D81C.h" +#include "main_0200ECFC.h" +#include "main_0200EDC0.h" +#include "main_02001188.h" +#include "main_020502B0.h" + +extern struct bag_items *BAG_ITEMS_PTR_MIRROR; + +extern void SortItemList(struct item *items, s32 count); +extern void RemoveEmptyItems(struct item *items, s32 count); +extern s32 GetRankStorageSize(void); u32 AddItemToBagNoHeld(struct item *item) { return AddItemToBag(item, 0); } + +u32 AddItemToBag(struct item *item, u32 flag) +{ + struct item *bag = BAG_ITEMS_PTR_MIRROR->bag_items->bag_items; + s32 capacity = GetCurrentBagCapacity(); + s32 i; + + for (i = 0; i < capacity; i++, bag++) { + bool8 exists = (bag->flags & ITEM_FLAG_EXISTS) != 0; + + if (!exists) { + *bag = *item; + bag->held_by = flag; + SetItemAcquired(item); + return TRUE; + } + } + return FALSE; +} + +void CleanStickyItemsInBag(void) +{ + struct item *item = BAG_ITEMS_PTR_MIRROR->bag_items->bag_items; + s32 i; + + for (i = 0; i < INVENTORY_SIZE; i++, item++) { + item->flags &= ~ITEM_FLAG_STICKY; + } +} + +s16 CountStickyItemsInBag(void) +{ + struct item *item = BAG_ITEMS_PTR_MIRROR->bag_items->bag_items; + s32 count = 0; + s32 i; + + for (i = 0; i < INVENTORY_SIZE; i++, item++) { + bool8 exists = (item->flags & ITEM_FLAG_EXISTS) != 0; + + if (exists) { + bool8 sticky = (item->flags & ITEM_FLAG_STICKY) != 0; + + if (sticky) { + count++; + } + } + } + return count; +} + +void sub_0200F9B4(u8 *a) +{ + struct item *item = BAG_ITEMS_PTR_MIRROR->bag_items->bag_items; + s32 i; + + for (i = 0; i < INVENTORY_SIZE; i++, item++) { + bool8 exists = (item->flags & ITEM_FLAG_EXISTS) != 0; + + if (exists && item->held_by != 0) { + item->held_by = a[item->held_by]; + } + } +} + +void sub_0200FA0C(u8 *a, s32 b) +{ + struct item *item = BAG_ITEMS_PTR_MIRROR->inventories[b].bag_items; + s32 i; + + for (i = 0; i < INVENTORY_SIZE; i++, item++) { + bool8 exists = (item->flags & ITEM_FLAG_EXISTS) != 0; + + if (exists && item->held_by != 0) { + item->held_by = a[item->held_by]; + } + } +} + +u32 TransmuteHeldItemInBag(struct item *item) +{ + struct item *bag = BAG_ITEMS_PTR_MIRROR->bag_items->bag_items; + s32 i; + + for (i = 0; i < INVENTORY_SIZE; i++, bag++) { + bool8 exists = (bag->flags & ITEM_FLAG_EXISTS) != 0; + + if (exists && bag->held_by == item->held_by) { + *bag = *item; + return TRUE; + } + } + return FALSE; +} + +void SetFlagsForHeldItemInBag(s32 held_by, u32 flags) +{ + struct item *item; + s32 i; + + if (held_by == 0) { + return; + } + item = BAG_ITEMS_PTR_MIRROR->bag_items->bag_items; + for (i = 0; i < INVENTORY_SIZE; i++, item++) { + bool8 exists = (item->flags & ITEM_FLAG_EXISTS) != 0; + + if (exists && item->held_by == held_by) { + item->flags |= flags; + } + } +} + +bool8 RemoveHolderForItemInBag(struct item *item) +{ + struct item *bag = BAG_ITEMS_PTR_MIRROR->bag_items->bag_items; + s32 i; + + for (i = 0; i < INVENTORY_SIZE; i++, bag++) { + bool8 exists = (bag->flags & ITEM_FLAG_EXISTS) != 0; + + if (exists && AreItemsEquivalent(bag, item, 1)) { + bag->held_by = 0; + bag->flags = item->flags; + return TRUE; + } + } + return FALSE; +} + +void SetHolderForItemInBag(s16 index, struct item *item, u8 held_by) +{ + struct item *slot = &BAG_ITEMS_PTR_MIRROR->bag_items->bag_items[index]; + + slot->flags &= ~ITEM_FLAG_SET; + item->held_by = held_by; + slot->held_by = item->held_by; + slot->flags = item->flags; +} + +void SortItemsInBag(void) +{ + s32 i; + + for (i = 0; i < INVENTORY_SIZE; i++) { + struct item *item = &BAG_ITEMS_PTR_MIRROR->bag_items->bag_items[i]; + bool8 exists = (item->flags & ITEM_FLAG_EXISTS) != 0; + + if (exists && item->id == ITEM_POKE) { + AddMoneyCarried(GetMoneyQuantity(item)); + ItemZInit(item); + } + } + SortItemList(BAG_ITEMS_PTR_MIRROR->bag_items->bag_items, INVENTORY_SIZE); +} + +void RemovePokeItemsInBag(void) +{ + struct item *item = BAG_ITEMS_PTR_MIRROR->bag_items->bag_items; + s32 i; + + for (i = 0; i < INVENTORY_SIZE; i++, item++) { + bool8 exists = (item->flags & ITEM_FLAG_EXISTS) != 0; + + if (exists && item->id == ITEM_POKE) { + item->flags &= ~ITEM_FLAG_STICKY; + AddMoneyCarried(GetMoneyQuantity(item)); + ItemZInit(item); + } + } + RemoveEmptyItems(BAG_ITEMS_PTR_MIRROR->bag_items->bag_items, INVENTORY_SIZE); +} + +void sub_0200FD38(void) +{ +} + +void sub_0200FD3C(void) +{ + StorageZInit(); +} + +s32 sub_0200FD48(void) +{ + return GetRankStorageSize(); +} + +bool8 IsStorageFull(void) +{ + s32 size = GetRankStorageSize(); + + return CountNbOfItemsInStorage() >= size; +} + +s32 CountNbOfItemsInStorage(void) +{ + s32 count = 0; + s32 i; + + for (i = 0; i < 1000; i++) { + if (BAG_ITEMS_PTR_MIRROR->field_0x38A[i] != 0) { + count++; + } + } + return count; +} + +u32 CountNbOfValidItemsInStorage(void) +{ + s32 count = 0; + s32 i; + + for (i = 0; i < 1000; i++) { + if (((const struct bag_items *)BAG_ITEMS_PTR_MIRROR)->field_0x38A[i] != 0 && + IsItemValidVeneer(BAG_ITEMS_PTR_MIRROR->field_0x38A[i])) { + count++; + } + } + return count; +} + +u32 CountNbOfValidItemsInTimeDarknessInStorage(void) +{ + s32 count = 0; + s32 i; + + for (i = 0; i < 1000; i++) { + s16 id = BAG_ITEMS_PTR_MIRROR->field_0x38A[i]; + + if (id != 0 && IsItemValidVeneer(id) && IsItemInTimeDarkness(id)) { + if (IsTreasureBox(id)) { + id = (s16)BAG_ITEMS_PTR_MIRROR->field_0xB5A[i]; + if (IsItemValidVeneer(id) && IsItemInTimeDarkness(id)) { + count++; + } + } else { + count++; + } + } + } + return count; +} + +u32 CountNbItemsOfTypeInStorage(s16 id) +{ + s32 count = 0; + s32 i; + + for (i = 0; i < 1000; i++) { + if (id == BAG_ITEMS_PTR_MIRROR->field_0x38A[i]) { + count++; + } + } + return count; +} + +u32 CountItemTypeInStorage(struct bulk_item *bulk_item) +{ + s32 count = 0; + s32 i; + + for (i = 0; i < 1000; i++) { + if (bulk_item->id == BAG_ITEMS_PTR_MIRROR->field_0x38A[i]) { + if (IsThrownItem(bulk_item->id)) { + count += BAG_ITEMS_PTR_MIRROR->field_0xB5A[i]; + } else { + count++; + } + } + } + return count; +} + +s16 GetEquivBulkItemIdxInStorage(struct bulk_item *bulk_item) +{ + s32 i; + + for (i = 0; i < 1000; i++) { + if (bulk_item->id == BAG_ITEMS_PTR_MIRROR->field_0x38A[i] && + bulk_item->quantity == BAG_ITEMS_PTR_MIRROR->field_0xB5A[i]) { + return i; + } + } + return -1; +} + +bool8 ConvertStorageItemAtIdxToBulkItem(s32 idx, struct bulk_item *bulk_item) +{ + bulk_item->id = BAG_ITEMS_PTR_MIRROR->field_0x38A[idx]; + bulk_item->quantity = BAG_ITEMS_PTR_MIRROR->field_0xB5A[idx]; + return bulk_item->id != 0; +} + +bool8 ConvertStorageItemAtIdxToItem(s32 idx, struct item *item) +{ + item->id = BAG_ITEMS_PTR_MIRROR->field_0x38A[idx]; + item->quantity = BAG_ITEMS_PTR_MIRROR->field_0xB5A[idx]; + item->flags = 0; + item->held_by = 0; + return item->id != 0; +} + +s16 sub_02010044(s32 a) +{ + return BAG_ITEMS_PTR_MIRROR->field_0x38A[a]; +} + +u16 sub_02010060(s32 a) +{ + return BAG_ITEMS_PTR_MIRROR->field_0xB5A[a]; +} + +void MaybeUpdateStorage(void) +{ + s32 i; + s32 j; + + for (i = 0; i < 1000; i++) { + if (BAG_ITEMS_PTR_MIRROR->field_0x38A[i] == 0) { + j = i; + for (i = i + 1; i < 1000; i++) { + if (BAG_ITEMS_PTR_MIRROR->field_0x38A[i] != 0) { + BAG_ITEMS_PTR_MIRROR->field_0x38A[j] = BAG_ITEMS_PTR_MIRROR->field_0x38A[i]; + BAG_ITEMS_PTR_MIRROR->field_0xB5A[j] = BAG_ITEMS_PTR_MIRROR->field_0xB5A[i]; + j++; + } + } + for (; j < 1000; j++) { + BAG_ITEMS_PTR_MIRROR->field_0x38A[j] = 0; + BAG_ITEMS_PTR_MIRROR->field_0xB5A[j] = 0; + } + return; + } + } +} + +bool8 sub_02010154(s32 a) +{ + if (BAG_ITEMS_PTR_MIRROR->field_0x38A[a] == 0) { + return FALSE; + } + BAG_ITEMS_PTR_MIRROR->field_0x38A[a] = 0; + BAG_ITEMS_PTR_MIRROR->field_0xB5A[a] = 0; + MaybeUpdateStorage(); + return TRUE; +} + +bool8 RemoveItemAtIdxInStorage(s32 idx) +{ + if (BAG_ITEMS_PTR_MIRROR->field_0x38A[idx] == 0) { + return FALSE; + } + BAG_ITEMS_PTR_MIRROR->field_0x38A[idx] = 0; + BAG_ITEMS_PTR_MIRROR->field_0xB5A[idx] = 0; + return TRUE; +} + +bool8 RemoveBulkItemInStorage(struct bulk_item *bulk_item) +{ + s32 i; + + for (i = 0; i < 1000; i++) { + if (bulk_item->id == BAG_ITEMS_PTR_MIRROR->field_0x38A[i] && + bulk_item->quantity == BAG_ITEMS_PTR_MIRROR->field_0xB5A[i]) { + BAG_ITEMS_PTR_MIRROR->field_0x38A[i] = 0; + BAG_ITEMS_PTR_MIRROR->field_0xB5A[i] = 0; + MaybeUpdateStorage(); + return TRUE; + } + } + return FALSE; +} + +bool8 RemoveItemInStorage(struct item *item) +{ + s32 i; + + for (i = 0; i < 1000; i++) { + if (item->id == BAG_ITEMS_PTR_MIRROR->field_0x38A[i] && + item->quantity == BAG_ITEMS_PTR_MIRROR->field_0xB5A[i]) { + BAG_ITEMS_PTR_MIRROR->field_0x38A[i] = 0; + BAG_ITEMS_PTR_MIRROR->field_0xB5A[i] = 0; + MaybeUpdateStorage(); + return TRUE; + } + } + return FALSE; +} + +void StorageZInit(void) +{ + s32 i; + + for (i = 0; i < 1000; i++) { + BAG_ITEMS_PTR_MIRROR->field_0x38A[i] = 0; + BAG_ITEMS_PTR_MIRROR->field_0xB5A[i] = 0; + } +} + +bool8 AddBulkItemToStorage(struct bulk_item *bulk_item) +{ + struct item item; + s32 size = GetRankStorageSize(); + s32 i; + + BulkItemToItem(&item, bulk_item); + for (i = 0; i < size; i++) { + if (BAG_ITEMS_PTR_MIRROR->field_0x38A[i] == 0) { + BAG_ITEMS_PTR_MIRROR->field_0x38A[i] = bulk_item->id; + BAG_ITEMS_PTR_MIRROR->field_0xB5A[i] = bulk_item->quantity; + SetItemAcquired(&item); + return TRUE; + } + } + return FALSE; +} + +bool8 AddItemToStorage(struct item *item) +{ + s32 size = GetRankStorageSize(); + s32 i; + + for (i = 0; i < size; i++) { + if (BAG_ITEMS_PTR_MIRROR->field_0x38A[i] == 0) { + BAG_ITEMS_PTR_MIRROR->field_0x38A[i] = item->id; + BAG_ITEMS_PTR_MIRROR->field_0xB5A[i] = item->quantity; + SetItemAcquired(item); + return TRUE; + } + } + return FALSE; +} + +void SortItemsInStorage(u8 *selected, s32 count) +{ + struct item *items = MemAlloc(count * sizeof(struct item), 0); + int i; + int j; + + for (i = 0; i < count; i++) { + if (BAG_ITEMS_PTR_MIRROR->field_0x38A[i] == 0) { + break; + } + ItemZInit(&items[i]); + items[i].flags = (selected[i] != 0 ? ITEM_FLAG_UNK_MISSION_ITEM_2 : 0) | ITEM_FLAG_EXISTS; + items[i].id = BAG_ITEMS_PTR_MIRROR->field_0x38A[i]; + items[i].quantity = BAG_ITEMS_PTR_MIRROR->field_0xB5A[i]; + } + SortItemList(items, i); + for (j = 0; j < i; j++) { + BAG_ITEMS_PTR_MIRROR->field_0x38A[j] = items[j].id; + BAG_ITEMS_PTR_MIRROR->field_0xB5A[j] = items[j].quantity; + selected[j] = (items[j].flags & ITEM_FLAG_UNK_MISSION_ITEM_2) != 0; + } + for (; j < count; j++) { + BAG_ITEMS_PTR_MIRROR->field_0x38A[j] = 0; + BAG_ITEMS_PTR_MIRROR->field_0xB5A[j] = 0; + selected[j] = 0; + } + MemFree(items); +} + +void sub_02010590(void) +{ +} + +void AllKecleonShopsZInit(void) +{ + s32 i; + s32 j; + + for (i = 0; i < 2; i++) { + for (j = 0; j < 8; j++) { + struct bulk_item *slot = &BAG_ITEMS_PTR_MIRROR->field_0x1330[i][j]; + + slot->id = 0; + slot->quantity = 0; + } + for (j = 0; j < 4; j++) { + struct bulk_item *slot = &BAG_ITEMS_PTR_MIRROR->field_0x1374[i][j]; + + slot->id = 0; + slot->quantity = 0; + } + } + BAG_ITEMS_PTR_MIRROR->field_0x13A0 = 0; + BAG_ITEMS_PTR_MIRROR->field_0x13A4 = 0; + BAG_ITEMS_PTR_MIRROR->field_0x13A6 = 0; + BAG_ITEMS_PTR_MIRROR->field_0x13A8 = 0; +} + +void SpecialEpisodeKecleonShopZInit(void) +{ + s32 i; + + for (i = 0; i < 8; i++) { + struct bulk_item *slot = &BAG_ITEMS_PTR_MIRROR->field_0x1330[1][i]; + + slot->id = 0; + slot->quantity = 0; + } + for (i = 0; i < 4; i++) { + struct bulk_item *slot = &BAG_ITEMS_PTR_MIRROR->field_0x1374[1][i]; + + slot->id = 0; + slot->quantity = 0; + } +} + +void SetActiveKecleonShop(s32 idx) +{ + BAG_ITEMS_PTR_MIRROR->field_0x132A = idx; + BAG_ITEMS_PTR_MIRROR->field_0x132C = BAG_ITEMS_PTR_MIRROR->field_0x1330[idx]; + BAG_ITEMS_PTR_MIRROR->field_0x1370 = BAG_ITEMS_PTR_MIRROR->field_0x1374[idx]; +} diff --git a/src/main_02010898.c b/src/main_02010898.c index 104bcedf..857e3c54 100644 --- a/src/main_02010898.c +++ b/src/main_02010898.c @@ -3,7 +3,7 @@ extern struct bag_items *BAG_ITEMS_PTR_MIRROR; -u32* GetCurrentKecleonShop1ItemByIndex(s32 idx) +struct bulk_item* GetCurrentKecleonShop1ItemByIndex(s32 idx) { return &BAG_ITEMS_PTR_MIRROR->field_0x132C[idx]; } diff --git a/src/main_02010BA4.c b/src/main_02010BA4.c index 9fa90422..2b2143b2 100644 --- a/src/main_02010BA4.c +++ b/src/main_02010BA4.c @@ -3,7 +3,7 @@ extern struct bag_items *BAG_ITEMS_PTR_MIRROR; -u32* GetCurrentKecleonShop2ItemByIndex(s32 idx) +struct bulk_item* GetCurrentKecleonShop2ItemByIndex(s32 idx) { return &BAG_ITEMS_PTR_MIRROR->field_0x1370[idx]; } diff --git a/src/main_0202F180.c b/src/main_0202F180.c index f0855c03..84d71360 100644 --- a/src/main_0202F180.c +++ b/src/main_0202F180.c @@ -1,5 +1,31 @@ #include "main_0202F180.h" #include "main_0202AAA8.h" +#include "main_0200330C.h" +#include "main_02001188.h" +#include "main_02027648.h" +#include "main_02027AF0.h" +#include "main_02028080.h" + +extern void sub_02026184(struct unk_02026130 *p, s32 a, s32 b); +extern void sub_02026194(struct unk_02026130 *p, u32 flags, char *string); +extern void sub_020261A4(struct unk_02026130 *p); +extern void sub_020261B4(struct unk_02026130 *p); +extern void sub_020261C4(struct unk_02026130 *p); +extern s32 sub_020261D4(struct unk_02026130 *p); +extern s32 sub_020261E4(struct unk_02026130 *p); +extern s32 sub_02026204(struct unk_02026130 *p); +extern void sub_02048240(char *str); +extern s32 PreprocessString(char *output, s32 size, const char *format, u32 flags, + struct preprocessor_args *args); +extern s32 PreprocessStringFromId(char *output, s32 size, s32 string_id, u32 flags, + struct preprocessor_args *args); +extern void InitPortraitParams(portrait_params *p); +extern bool8 IsValidPortrait(portrait_params *p); +extern bool8 LoadPortrait(portrait_params *p, void *buf); +extern void sub_02027040(s32 window_id, void *buf, u32 a); +extern void sub_02026E3C(s32 window_id, void *buf, u32 a); +extern void sub_02028770(s32 window_id, Point pos); +extern WindowTemplate PORTRAIT_BOX_DEFAULT_WINDOW_PARAMS; bool8 IsDialogueBoxActive(s32 window_id) { @@ -7,3 +33,329 @@ bool8 IsDialogueBoxActive(s32 window_id) return w->field_0x8; } + +void sub_0202F190(s32 window_id, s32 a, s32 b) +{ + struct unk_0202F190 *box = GetWindowContents(window_id); + + sub_02026184(&box->field_0xC, a, b); +} + +void ShowStringIdInDialogueBox(s32 window_id, u32 flags, s32 string_id, + struct preprocessor_args *args) +{ + struct unk_0202F190 *box = GetWindowContents(window_id); + + if (box->field_0x4 != 2) { + sub_0202613C(&box->field_0xC); + box->field_0x4 = 1; + } else if (box->field_0x9 != 0) { + sub_02048240(box->field_0x128); + } + box->field_0x8 = 1; + box->field_0x9 = box->field_0xA; + PreprocessStringFromId(box->field_0x128, 0x400, string_id, flags, args); + sub_02026194(&box->field_0xC, flags, box->field_0x128); +} + +void ShowStringInDialogueBox(s32 window_id, u32 flags, const char *string, + struct preprocessor_args *args) +{ + struct unk_0202F190 *box = GetWindowContents(window_id); + + if (box->field_0x4 != 2) { + sub_0202613C(&box->field_0xC); + box->field_0x4 = 1; + } else if (box->field_0x9 != 0) { + sub_02048240(box->field_0x128); + } + box->field_0x8 = 1; + box->field_0x9 = box->field_0xA; + PreprocessString(box->field_0x128, 0x400, string, flags, args); + sub_02026194(&box->field_0xC, flags, box->field_0x128); +} + +void sub_0202F2C4(s32 window_id) +{ + struct unk_0202F190 *box = GetWindowContents(window_id); + + switch (box->field_0x4) { + case 1: + box->field_0x4 = 4; + box->field_0x8 = 1; + break; + case 2: + sub_020261A4(&box->field_0xC); + box->field_0x8 = 1; + break; + case 3: + case 4: + break; + default: + sub_0202613C(&box->field_0xC); + box->field_0x4 = 0; + box->field_0x8 = 0; + break; + } +} + +void sub_0202F334(s32 window_id) +{ + struct unk_0202F190 *box = GetWindowContents(window_id); + + switch (box->field_0x4) { + case 1: + box->field_0x4 = 4; + box->field_0x8 = 1; + break; + case 2: + box->field_0x4 = 3; + box->field_0x8 = 1; + break; + case 3: + case 4: + break; + default: + sub_0202613C(&box->field_0xC); + box->field_0x4 = 0; + box->field_0x8 = 0; + break; + } +} + +void ShowDialogueBox(s32 window_id) +{ + struct unk_0202F190 *box = GetWindowContents(window_id); + + switch (box->field_0x4) { + case 1: + case 2: + sub_020261C4(&box->field_0xC); + break; + case 3: + case 4: + break; + default: + sub_0202613C(&box->field_0xC); + box->field_0x4 = 0; + box->field_0x8 = 0; + break; + } +} + +void sub_0202F3F8(s32 window_id) +{ + struct unk_0202F190 *box = GetWindowContents(window_id); + + switch (box->field_0x4) { + case 1: + case 2: + sub_020261B4(&box->field_0xC); + break; + case 3: + case 4: + break; + default: + sub_0202613C(&box->field_0xC); + box->field_0x4 = 0; + box->field_0x8 = 0; + break; + } +} + +void ReadStringFromDialogueBox(s32 window_id, char *dest, s32 n) +{ + struct unk_0202F190 *box = GetWindowContents(window_id); + + MemcpySimple((u8 *)dest, (u8 *)box->field_0x128, n); +} + +void sub_0202F474(s32 window_id, s32 a) +{ + struct unk_0202F190 *box = GetWindowContents(window_id); + + box->field_0xA = a; +} + +void UpdateDialogueBox(struct Window *w) +{ + struct unk_0202F190 *box = (struct unk_0202F190 *)w->template.unk0C; + u8 was_busy; + + switch (box->field_0x4) { + case 0: + if (!sub_020261D4(&box->field_0xC)) { + box->field_0x8 = 0; + return; + } + box->field_0x4 = 1; + box->field_0x8 = 1; + w->unkB8 = -1; + case 1: + box->field_0x8 = 1; + if (!sub_0202810C(w->id)) { + return; + } + box->field_0x4 = 2; + case 2: + if (sub_02026204(&box->field_0xC) == 0x10) { + box->field_0x4 = 3; + box->field_0x8 = 1; + return; + } + was_busy = box->field_0x8; + box->field_0x8 = sub_020261E4(&box->field_0xC); + if (was_busy == 0) { + return; + } + if (box->field_0x8 != 0) { + return; + } + if (box->field_0x9 == 0) { + return; + } + sub_02048240(box->field_0x128); + box->field_0x9 = 0; + return; + case 3: + box->field_0x4 = 4; + box->field_0x8 = 1; + return; + case 4: + if (sub_0202812C(w->id)) { + sub_0202613C(&box->field_0xC); + box->field_0x4 = 0; + box->field_0x8 = 0; + w->unkB8 = -6; + } + return; + } +} + +s8 CreatePortraitBox(s32 bg_id, s32 a, s32 b) +{ + WindowTemplate tmpl; + struct unk_0202F5AC *box; + + box = MemAlloc(0x380, 8); + tmpl = PORTRAIT_BOX_DEFAULT_WINDOW_PARAMS; + tmpl.unk00 = (u32)UpdatePortraitBox; + tmpl.unk0C = (u32)box; + tmpl.bg_id = bg_id; + tmpl.unk09 = b != 0 ? -4 : -7; + box->field_0x2A = b; + box->field_0x0 = NewWindowScreenCheck((s32)&tmpl, 3); + box->field_0x4 = 0; + InitPortraitParams(&box->field_0x8); + InitPortraitParams(&box->field_0x18); + box->field_0x2C = a; + box->field_0x28 = 0; + box->field_0x29 = 0; + return box->field_0x0; +} + +void ClosePortraitBox(s32 window_id) +{ + MemFree(GetWindowContents(window_id)); + DeleteWindow(window_id); +} + +bool8 PortraitBoxNeedsUpdate(s32 window_id) +{ + struct unk_0202F5AC *box = GetWindowContents(window_id); + + if (box->field_0x4 == 1 || box->field_0x4 == 2) { + return TRUE; + } + return FALSE; +} + +void ShowPortraitInPortraitBox(s32 window_id, portrait_params *p) +{ + struct unk_0202F5AC *box = GetWindowContents(window_id); + + if (box->field_0x4 != 2 && box->field_0x4 != 3) { + box->field_0x4 = 1; + } + if (p != NULL) { + box->field_0x18 = *p; + } else { + InitPortraitParams(&box->field_0x18); + } + box->field_0x28 = 1; +} + +void HidePortraitBox(s32 window_id) +{ + struct unk_0202F5AC *box = GetWindowContents(window_id); + + box->field_0x28 = 0; + InitPortraitParams(&box->field_0x18); + if (box->field_0x4 != 0) { + box->field_0x29 = 1; + } +} + +void UpdatePortraitBox(struct Window *w) +{ + struct unk_0202F5AC *box = (struct unk_0202F5AC *)w->template.unk0C; + + switch (box->field_0x4) { + case 0: + if (box->field_0x28 == 0) { + return; + } + box->field_0x28 = 0; + box->field_0x4 = 1; + w->unkB8 = -1; + case 1: + if (!sub_0202811C(w->id)) { + return; + } + box->field_0x4 = 2; + case 2: + box->field_0x28 = 0; + box->field_0x8 = box->field_0x18; + if (box->field_0x29 == 0) { + if (IsValidPortrait(&box->field_0x8)) { + if (LoadPortrait(&box->field_0x8, box->field_0x30)) { + sub_02027040(w->id, box->field_0x30, box->field_0x2C << 4); + sub_02026E3C(w->id, box->field_0x60, box->field_0x2C); + w->unk11 = box->field_0x8.hw_flip; + if (box->field_0x2A != 0) { + sub_02028080(box->field_0x0, -4); + } else { + sub_02028080(box->field_0x0, -7); + } + sub_02028770(w->id, box->field_0x8.offset); + } else { + sub_0202836C(w->id); + sub_02027B1C(w->id); + sub_02028080(box->field_0x0, 0); + sub_02028770(w->id, box->field_0x8.offset); + } + } else { + box->field_0x29 = 1; + } + box->field_0x4 = 3; + w->unkB8 = -1; + } + case 3: + if (box->field_0x28 != 0) { + box->field_0x4 = 2; + return; + } + if (box->field_0x29 != 0) { + box->field_0x4 = 4; + } + return; + case 4: + if (sub_0202812C(w->id)) { + InitPortraitParams(&box->field_0x8); + box->field_0x29 = 0; + box->field_0x4 = 0; + w->unkB8 = -6; + } + return; + } +} diff --git a/src/main_0202FD3C.c b/src/main_0202FD3C.c index 27ed86f5..d5ef3074 100644 --- a/src/main_0202FD3C.c +++ b/src/main_0202FD3C.c @@ -1,5 +1,217 @@ #include "main_0202FD3C.h" #include "main_0202AAA8.h" +#include "main_0200C4FC.h" +#include "main_02001188.h" +#include "main_02027648.h" +#include "main_02027AF0.h" +#include "main_02028080.h" + +extern void GetPressedButtons(u32 a, u16 *out); +extern s32 PreprocessString(char *output, s32 size, const char *format, u32 flags, + struct preprocessor_args *args); +extern s32 sub_020265A8(char *str); +extern void UpdateAreaNameBox(struct Window *w); +extern WindowTemplate TEXT_BOX_DEFAULT_WINDOW_PARAMS; +extern WindowTemplate AREA_NAME_BOX_DEFAULT_WINDOW_PARAMS; +extern char _0209AF6C[]; + +s8 CreateTextBox(WindowTemplate *params, void (*cb)(s32 window_id)) +{ + struct unk_0202F8C4 *box = CreateTextBoxInternal(params); + + box->field_0x4 = cb; + return box->field_0x0; +} + +s8 CreateTextBoxWithArg(WindowTemplate *params, + void (*cb)(s32 window_id, void *arg), void *arg) +{ + struct unk_0202F8C4 *box = CreateTextBoxInternal(params); + + box->field_0x14 = arg; + box->field_0x8 = cb; + return box->field_0x0; +} + +void CloseTextBox(s32 window_id) +{ + MemFree(GetWindowContents(window_id)); + DeleteWindow(window_id); +} + +void CloseTextBox2(s32 window_id) +{ + GetWindowContents(window_id); + sub_0202836C(window_id); + sub_02027B1C(window_id); + sub_0202F954(window_id); + MemFree(GetWindowContents(window_id)); + DeleteWindow(window_id); +} + +void sub_0202F954(s32 window_id) +{ + struct unk_0202F8C4 *box = GetWindowContents(window_id); + + switch (box->field_0x10) { + case 1: + box->field_0x10 = 5; + break; + case 2: + box->field_0x10 = 3; + break; + case 3: + box->field_0x10 = 4; + break; + case 4: + case 5: + case 6: + break; + default: + box->field_0x10 = 0; + break; + } +} + +s32 IsTextboxState3(s32 window_id) +{ + struct unk_0202F8C4 *box = GetWindowContents(window_id); + + if (box->field_0x10 == 3) { + box->field_0x10 = 2; + return TRUE; + } + return FALSE; +} + +struct unk_0202F8C4* CreateTextBoxInternal(WindowTemplate *params) +{ + WindowTemplate tmpl; + struct unk_0202F8C4 *box; + + box = MemAlloc(0x18, 8); + if (params == NULL) { + tmpl = TEXT_BOX_DEFAULT_WINDOW_PARAMS; + } else { + tmpl = *params; + } + tmpl.unk00 = (u32)UpdateTextBox; + tmpl.unk0C = (u32)box; + box->field_0x0 = NewWindowScreenCheck((s32)&tmpl, 3); + box->field_0x4 = NULL; + box->field_0x8 = NULL; + box->field_0x14 = NULL; + box->field_0x10 = 0; + box->field_0xC = UpdateTextBox; + return box; +} + +void UpdateTextBox(struct Window *w) +{ + struct unk_0202F8C4 *box = (struct unk_0202F8C4 *)w->template.unk0C; + u16 buttons; + + GetPressedButtons(0, &buttons); + switch (box->field_0x10) { + case 0: + w->unkB8 = -1; + box->field_0x10 = 1; + case 1: + if (!sub_0202810C(w->id)) { + return; + } + box->field_0x10 = 2; + case 2: + if (box->field_0x8 != NULL) { + box->field_0x8(w->id, box->field_0x14); + } else if (box->field_0x4 != NULL) { + box->field_0x4(w->id); + } + box->field_0x10 = 3; + return; + case 3: + if (w->template.bg_id == 1) { + return; + } + if ((buttons & 2) && w->template.unk09 != -2 && + w->template.unk09 != -5 && w->template.unk09 != -8 && + w->template.unk09 != -9) { + box->field_0x10 = 4; + } + if (box->field_0x10 != 4) { + return; + } + case 4: + sub_0202836C(w->id); + sub_02027B1C(w->id); + box->field_0x10 = 5; + case 5: + if (sub_0202812C(w->id)) { + box->field_0x10 = 6; + w->unkB8 = -6; + } + return; + case 6: + w->unkB8 = -5; + box->field_0x10 = 7; + return; + } +} + +bool8 IsTextBoxActive(s32 window_id) +{ + struct unk_0202F8C4 *box = GetWindowContents(window_id); + + return box->field_0x10 != 7; +} + +s32 CreateAreaNameBox(WindowTemplate *params, u32 flags, struct struct_2 *cfg, + s32 a) +{ + WindowTemplate tmpl; + struct preprocessor_args args; + struct unk_0202FBBC *box; + s32 width; + + box = MemAlloc(0x1B4, 8); + box->field_0xA4 = a; + args.id_vals[0] = a; + PreprocessString(box->field_0xAC, 0x100, _0209AF6C, 0xC402, &args); + width = sub_020265A8(box->field_0xAC); + box->field_0xA8 = width; + if (params == NULL) { + tmpl = AREA_NAME_BOX_DEFAULT_WINDOW_PARAMS; + flags |= 0x300000; + } else { + tmpl = *params; + tmpl.unk00 = (u32)UpdateAreaNameBox; + } + tmpl.unk0C = (u32)box; + if (tmpl.width == 0) { + tmpl.width = (width + 7) / 8; + } + if (tmpl.height == 0) { + tmpl.height = 2; + } + if (flags & 0x200000) { + tmpl.x -= tmpl.width; + } + if (flags & 0x100000) { + tmpl.y -= tmpl.height; + } + box->field_0x1B0 = (tmpl.width * 8 - box->field_0xA8) / 2; + box->field_0x1AC = (tmpl.height * 8 - 12) / 2; + if (box->field_0x1B0 < 0) { + box->field_0x1B0 = 0; + } + box->field_0x0 = UpdateAreaNameBox; + box->field_0x4 = flags; + if (cfg != NULL) { + box->field_0x8 = *cfg; + } + box->field_0xA0 = 0; + return NewWindowScreenCheck((s32)&tmpl, 3); +} void SetAreaNameBoxState3(s32 window_id) { diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index 9a27a10d..3ee9492b 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -196,7 +196,7 @@ extern u8 ov11_02322DB0[]; extern void CloseScrollBox(s8); extern void CloseTextBox2(s8);extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateTextBox(void *, void *); extern void GetPressedButtons(u32, u16 *); extern void InitPreprocessorArgs(struct preprocessor_args *); -extern s32 IsScrollBoxActive(s8); extern void ShowDialogueBox(s8); extern void ShowStringIdInDialogueBox(s8, s32, s32, void *); extern void ov11_022DC504(void); +extern s32 IsScrollBoxActive(s8); extern void ov11_022DC504(void); extern u8 *strcpy(u8 *dest, const u8 *src); extern s8 CreateInventoryMenuOuter(s32, s32, s32, void *, void *, void *, u8); diff --git a/src/overlay_29_022E563C.c b/src/overlay_29_022E563C.c index 74bb5178..baa2c707 100644 --- a/src/overlay_29_022E563C.c +++ b/src/overlay_29_022E563C.c @@ -1,8 +1,504 @@ #include "overlay_29_022E563C.h" +#include "dg_effect.h" +#include "dungeon.h" +#include "dungeon_util_static.h" +#include "dungeon_util.h" +#include "dungeon_util_2.h" +#include "dg_uty.h" +#include "run_dungeon_1.h" +#include "dungeon_recruitment_2.h" +#include "overlay_29_022E272C.h" +#include "overlay_29_022E9FC0.h" +#include "overlay_29_022EAC7C.h" +#include "overlay_29_022EAE14.h" +#include "overlay_29_0234B104.h" +#include "overlay_29_0234B4BC.h" -extern void PlayEffectAnimationPixelPos(struct entity *entity, s32 effect_id, s32 a); +#ifdef JAPAN +#define MESSAGE_B92 0x8A4 +#else +#define MESSAGE_B92 0xB92 +#endif -void ov29_022E563C(struct entity *entity) +extern s32 GetEffectAnimationWanOffset(s32 id); +extern struct dungeon *DUNGEON_PTR[]; + +extern bool8 ov29_022E2CA0(struct position *pos); +extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); +extern bool8 AnimationHasMoreFrames(s16 param_1); +extern void FillPixelOffsetArrayFromSprite(struct position *offsets, u8 count, + struct animation_control *anim_ctrl); +extern void InitOamAdjustmentInfo(struct unk_0201C000 *oam); +extern s32 PlayEffectAnimationPixelPos(struct pixel_position *pixel_pos, s32 effect_id, + s32 param_3); +extern void PlayEffectAnimationPos(struct position *pos, s32 effect_id, s32 param_3); +extern u32 GetFloorType(void); + +extern s32 ov10_022BDC68(void); +extern s32 ov10_022BEC08(s32 trap_id, struct position *pos); +extern s32 ov10_022BEC94(s32 item_id, struct position *pos, struct position *offsets, + s32 param_4, s32 param_5); +extern void ov10_022BF274(struct unk_022BF274 *params); +extern s32 ov10_022BF2B4(struct unk_022BF274 *params, s32 param_2); +extern void ov10_022BF45C(s16 handle, struct position *pos, struct position *param_3, + s32 param_4, s32 param_5); + +extern void ov29_022E6A00(s32 param_1, s32 param_2, s32 param_3); +extern bool8 ov29_022E6C08(void); +extern void ov29_022E6CE0(void); +extern void ov29_02339148(void); + +extern const u16 ov29_02351194[4]; +extern const u16 ov29_0235119C[4]; +extern const u16 ov29_023511DC[8]; +extern const s32 ov29_0235122C[8]; +extern const s32 ov29_0235124C[8]; + +void ov29_022E563C(struct pixel_position *pixel_pos) { - PlayEffectAnimationPixelPos(entity, 0x90, 1); + PlayEffectAnimationPixelPos(pixel_pos, 0x90, 1); +} + +void ov29_022E5650(struct entity *a, struct entity *b) +{ + PlayEffectAnimationEntity(b, 0x167, 1, GetEffectAnimationWanOffset(0x167), 2, 0, -1, 0); +} + +void PlaySeByIdIfShouldDisplayEntity(struct entity *entity, s32 se_id) +{ + if (entity == NULL) { + PlaySeByIdIfNotSilence(se_id); + return; + } + if (!ShouldDisplayEntityAdvanced(entity)) + return; + PlaySeByIdIfNotSilence(se_id); +} + +void ov29_022E56D4(struct position *pos, s32 se_id) +{ + if (!ov29_022E2CA0(pos)) + return; + PlaySeByIdIfNotSilence(se_id); +} + +void ov29_022E56F4(struct entity *entity, s32 id) +{ + if (entity == NULL) { + PlayMeByIdIfNot998(id); + return; + } + if (!ShouldDisplayEntityAdvanced(entity)) + return; + PlaySeByIdIfNotSilence(id); +} + +void PlayItemThrowSfx(struct entity *entity, enum item_category category) +{ + if (category == CATEGORY_THROWN_LINE) { + PlaySeByIdIfNotSilence(0x130E); + return; + } + if (category == CATEGORY_THROWN_ARC) { + PlaySeByIdIfNotSilence(0x130D); + return; + } + PlaySeByIdIfNotSilence(0x130C); +} + +void PlayMissSfx__022E611C(struct entity *attacker, struct entity *defender) +{ + if (GetEntInfo(defender)->is_not_team_member) + PlaySeByIdIfNotSilence(0x1306); + else + PlaySeByIdIfNotSilence(0x1307); +} + +void PlayMissSfx__022E6150(struct entity *entity) +{ + if (GetEntInfo(entity)->is_not_team_member) + PlaySeByIdIfNotSilence(0x1306); + else + PlaySeByIdIfNotSilence(0x1307); +} + +void ov29_022E57D4(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x25A, 1, GetEffectAnimationWanOffset(0x25A), 2, 0, -1, 0); + PlayEffectAnimationEntity(entity, 0x25B, 1, GetEffectAnimationWanOffset(0x25B), 2, 0, -1, 0); +} + +void ov29_022E5864(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x16, 1, GetEffectAnimationWanOffset(0x16), 2, 0, -1, 0); +} + +void ov29_022E58B0(struct entity *entity, struct position *pos, s32 trap_id) +{ + struct position p; + struct monster *info; + s32 handle; + s32 i; + s32 direction; + + if (trap_id == 0x11) + return; + if (!ov29_022E2CA0(pos)) + return; + + p.x = (pos->x * 24 + 12) << 8 >> 8; + p.y = (pos->y * 24 + 16) << 8 >> 8; + handle = ov10_022BEC08(trap_id, &p); + + if (trap_id == 4 || trap_id == 0x18) { + PlaySeByIdIfShouldDisplayEntity(NULL, 0x308); + ov29_022EA370(0x28, 0x33); + } else if (trap_id == 8) { + info = GetEntInfo(entity); + direction = info->action.direction; + for (i = 0; i < 1000; i += 2) { + direction = (direction - 1) & 7; + ChangeMonsterAnimation(entity, 0, direction); + ov29_022EA370(2, 0x33); + if (!AnimationHasMoreFrames(handle)) + break; + } + info->action.direction = direction & 7; + } else { + ov29_022EA370(0x28, 0x33); + } + + for (i = 0; i < 1000; i++) { + AdvanceFrame(0x42); + if (!AnimationHasMoreFrames(handle)) + return; + } +} + +void ov29_022E5A00(struct entity *entity, struct item *item) +{ + struct position offsets[4]; + struct position pos; + s32 item_id; + s32 dy; + s32 handle; + s32 i; + + if (!ShouldDisplayEntityAdvanced(entity)) + return; + + if (ItemSticky(item->flags)) + item_id = 0; + else + item_id = item->id; + + pos.x = (s32)entity->pixel_pos.x >> 8; + pos.y = (s32)entity->pixel_pos.y >> 8; + dy = (pos.y - DUNGEON_PTR[0]->display_data.camera_pixel_pos.y) / 2 + 1; + FillPixelOffsetArrayFromSprite(offsets, 4, &entity->anim_ctrl); + handle = ov10_022BEC94(item_id, &pos, offsets, 0, dy); + + for (i = 0; i < 1000; i++) { + AdvanceFrame(0x42); + if (!AnimationHasMoreFrames(handle)) + return; + } +} + +void ov29_022E5AE4(struct entity *entity, struct item *item) +{ + struct position offsets[4]; + struct position pos; + s32 item_id; + s16 dy; + s32 handle; + s16 i; + + if (!ShouldDisplayEntityAdvanced(entity)) + return; + + if (ItemSticky(item->flags)) + item_id = 0; + else + item_id = item->id; + + pos.x = (s32)entity->pixel_pos.x >> 8; + pos.y = (s32)entity->pixel_pos.y >> 8; + dy = (pos.y - DUNGEON_PTR[0]->display_data.camera_pixel_pos.y) / 2 + 1; + FillPixelOffsetArrayFromSprite(offsets, 4, &entity->anim_ctrl); + handle = ov10_022BEC94(item_id, &pos, offsets, 1, dy); + + for (i = 0; i < 1000; i++) { + AdvanceFrame(0x42); + if (!AnimationHasMoreFrames(handle)) + return; + } +} + +s32 ov29_022E5BD8(struct entity *entity) +{ + struct unk_022BF274 params; + struct position pos; + struct position dir; + struct pixel_position pixel_pos; + s32 handle; + s32 i; + s32 dy; + u8 direction; + s32 result; + + if (ShouldDisplayEntityWrapper(entity)) { + direction = GetEntInfo(entity)->action.direction; + pos.x = (s32)entity->pixel_pos.x >> 8; + pos.y = (s32)entity->pixel_pos.y >> 8; + dy = (pos.y - DUNGEON_PTR[0]->display_data.camera_pixel_pos.y) / 2; + + ov10_022BF274(¶ms); + params.field_0x0 = 0x165; + params.field_0x4 = 0; + params.field_0x8 = direction; + params.field_0xc = pos.x; + params.field_0xe = pos.y; + params.field_0x10 = 0; + params.field_0x12 = 0; + params.field_0x14 = -1; + params.field_0x18 = dy; + InitOamAdjustmentInfo(¶ms.field_0x1c); + handle = ov10_022BF2B4(¶ms, 0); + + dir = DIRECTIONS_XY[direction]; + for (i = 0; i < 6; i++) { + ov10_022BF45C(handle, &pos, NULL, dy, 0); + AdvanceFrame(0x42); + pos.x += dir.x * 4; + pos.y += dir.y * 4; + dy = (pos.y - DUNGEON_PTR[0]->display_data.camera_pixel_pos.y) / 2; + } + ov10_022BDC68(); + pixel_pos.x = pos.x << 8; + pixel_pos.y = pos.y << 8; + result = PlayEffectAnimationPixelPos(&pixel_pos, 0x1A0, 1); + } else { + result = -1; + } + return result; +} + +void PlayStairsSfx(void) +{ + s32 se_id = 0x3F00; + + switch (GetFloorType()) { + case 1: + case 2: + break; + case 0: + default: + if (DungeonGoesUp(DUNGEON_PTR[0]->id)) + se_id = 0x130A; + else + se_id = 0x1309; + break; + } + PlaySeByIdIfNotSilence(se_id); +} + +void ov29_022E5DBC(s32 param_1, s32 param_2) +{ + if (param_2 == 3) + ChangeDungeonMusic(MUSIC_NONE_0x0); + + if (param_1 != 4) { + if (param_2 == 3) + PlaySeByIdIfNotSilence(ov29_0235119C[param_2]); + else + PlayMeByIdIfNot998(ov29_0235119C[param_2]); + } else { + if (param_2 == 3) + PlaySeByIdIfNotSilence(ov29_02351194[param_2]); + else + PlayMeByIdIfNot998(ov29_0235119C[param_2]); + } + + ov29_022E6A00(param_1, param_2, 0x80); + while (ov29_022E6C08()) + AdvanceFrame(0x46); + ov29_022E6CE0(); + ov29_02339148(); + ov29_0234B1A4(1); +} + +void ov29_022E5E84(struct entity *a, struct entity *b) +{ + s32 i; + + ChangeMonsterAnimation(a, 8, 8); + for (i = 0; i < 100; i++) { + AdvanceFrame(0x51); + if ((a->anim_ctrl.anim_frame_flag_sum & 3) != 0 || a->animation_group_id_mirror != 8) + return; + } +} + +bool8 ShouldDisplayEntityAdvanced(struct entity *entity) +{ + if (!entity->is_visible) + return FALSE; + if (DUNGEON_PTR[0]->display_data.blinded) + return DUNGEON_PTR[0]->display_data.camera_target == entity; + return ShouldDisplayEntityWrapper(entity); +} + +void ov29_022E5F20(void) +{ + s32 i; + struct entity *entity; + struct monster *info; + + for (i = 0; i < 20; i++) { + entity = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (EntityIsValid__022E37B8(entity) && GetEntInfo(entity)->pickup_flag) { + info = GetEntInfo(entity); + info->pickup_flag = FALSE; + PlayEffectAnimationEntity(entity, 0x199, 0, GetEffectAnimationWanOffset(0x199), 2, + 0, -1, 0); + if (!info->is_not_team_member) { + SubstitutePlaceholderStringTags(0, entity, 0); + LogMessageByIdWithPopup(entity, MESSAGE_B92); + } + } + } +} + +void ov29_022E5FE8(enum weather_id weather, bool8 param_2) +{ + struct entity *entity; + s32 se_id; + s32 effect_id; + s32 alt_effect_id; + + entity = DUNGEON_PTR[0]->display_data.camera_target; + if (entity == NULL) + entity = GetLeader(); + + se_id = ov29_023511DC[weather]; + if (se_id != 0x3F00) + PlaySeByIdIfShouldDisplayEntity(entity, se_id); + + effect_id = ov29_0235122C[weather]; + if (effect_id < 0) + return; + + if (param_2 && !IsCurrentFixedRoomBossFight()) { + PlayEffectAnimationEntity(entity, effect_id, 0, GetEffectAnimationWanOffset(effect_id), + 2, 0, -1, 0); + } else { + alt_effect_id = ov29_0235124C[weather]; + PlayEffectAnimationEntity(entity, alt_effect_id, 0, + GetEffectAnimationWanOffset(alt_effect_id), 2, 0, -1, 0); + } +} + +void ov29_022E60E4(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x29, 1, GetEffectAnimationWanOffset(0x29), 2, 0, -1, 0); +} + +void PlayEffectAnimation0x1A9__022E6130(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x1A9, 0, GetEffectAnimationWanOffset(0x1A9), 2, 0, -1, 0); +} + +void PlayEffectAnimation0x1A9__022E617C(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x1A9, 0, GetEffectAnimationWanOffset(0x1A9), 2, 0, -1, 0); +} + +void PlayEffectAnimation0x1A9__022E61C8(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x1A9, 0, GetEffectAnimationWanOffset(0x1A9), 2, 0, -1, 0); +} + +void PlayEffectAnimation0x1A9__022E6214(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x1A9, 0, GetEffectAnimationWanOffset(0x1A9), 2, 0, -1, 0); +} + +void ov29_022E6260(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x1A8, 0, GetEffectAnimationWanOffset(0x1A8), 2, 0, -1, 0); +} + +void PlayEffectAnimation0x29(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x29, 0, GetEffectAnimationWanOffset(0x29), 2, 0, -1, 0); +} + +void ov29_022E62F0(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x48, 0, GetEffectAnimationWanOffset(0x48), 2, 0, -1, 0); +} + +void ov29_022E6338(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x1A6, 1, GetEffectAnimationWanOffset(0x1A6), 2, 0, -1, 0); +} + +void ov29_022E6388(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x297, 1, GetEffectAnimationWanOffset(0x297), 2, 0, -1, 0); +} + +void PlayEffectAnimation0x18E(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x18E, 0, GetEffectAnimationWanOffset(0x18E), 2, 0, -1, 0); +} + +void ov29_022E6424(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x1B0, 1, GetEffectAnimationWanOffset(0x1B0), 2, 0, -1, 0); + ov29_022EA370(10, 0x42); +} + +void ov29_022E647C(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x1A8, 0, GetEffectAnimationWanOffset(0x1A8), 2, 0, -1, 0); +} + +void PlayEffectAnimation0x1A9__022E64C4(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x1A9, 0, GetEffectAnimationWanOffset(0x1A9), 2, 0, -1, 0); +} + +void PlayEffectAnimation0x1A9__022E6510(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x1A9, 0, GetEffectAnimationWanOffset(0x1A9), 2, 0, -1, 0); +} + +void ov29_022E655C(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x1AB, 0, GetEffectAnimationWanOffset(0x1AB), 2, 0, -1, 0); +} + +void ov29_022E65A8(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 4, 1, GetEffectAnimationWanOffset(4), 2, 0, -1, 0); +} + +void ov29_022E65F4(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x11E, 1, GetEffectAnimationWanOffset(0x11E), 2, 0, -1, 0); +} + +void ov29_022E6644(struct entity *entity) +{ + PlayEffectAnimationEntity(entity, 0x11D, 1, GetEffectAnimationWanOffset(0x11D), 2, 0, -1, 0); +} + +void PlayKeyDoorUnlockEffect(struct position *pos, bool8 param_2) +{ + PlayEffectAnimationPos(pos, 0x19E, 1); + if (!param_2) + return; + ov29_022E56F4(NULL, 9); } diff --git a/src/overlay_29_023047B8.c b/src/overlay_29_023047B8.c index ea79e79e..2dec1cdb 100644 --- a/src/overlay_29_023047B8.c +++ b/src/overlay_29_023047B8.c @@ -1,5 +1,48 @@ #include "overlay_29_023047B8.h" #include "dungeon_util_static.h" +#include "dg_object.h" +#include "dungeon_capabilities.h" +#include "dungeon_capabilities_1.h" +#include "dungeon_map_access_1.h" +#include "dungeon_util_1.h" +#include "main_0200224C.h" +#include "main_0205283C.h" +#include "options.h" +#include "overlay_29_022E272C.h" +#include "overlay_29_022E869C.h" +#include "overlay_29_022E9FC0.h" +#include "overlay_29_022EC7E8.h" +#include "overlay_29_022F7364.h" +#include "overlay_29_0230558C.h" +#include "overlay_29_02311010.h" +#include "position_util.h" +#include "secondary_terrain_types.h" + +extern struct dungeon *DUNGEON_PTR[2]; +extern const u8 ov29_02352808[4]; +extern const s16 ov29_0235173C[]; +extern const s16 ov29_0235173E[]; +extern s32 ov29_0237C9CC; +extern u8 ov29_0237C9C1; +extern bool8 sub_02053038(s16 monster_id, s32 animation_group_id); +extern void WaitUntilAlertBoxTextIsLoaded(u32 message_id); +extern void ov29_02307DD0(void); +extern void ov29_0234AD10(struct entity *entity); +extern void HandleShopTransaction(s32 a); +extern void ov29_02346888(void); +extern void ActivateTerrainEffects(struct entity *entity); +extern void ov29_022EF9BC(void); +extern void EnsureCanStandCurrentTile(struct entity *entity); +extern void EnemyEvolution(struct entity *entity); +extern void CheckLeaderTile(void); +extern void IsFloorOver2(void); +extern void TryForcedLoss(bool8 a); +extern void DiscoverMinimap(struct position *pos); +extern void SetSpriteIdForAnimationControl(struct animation_control *anim, s16 sprite_id); +extern void SetAndPlayAnimationForAnimationControl(struct animation_control *anim, + s32 animation_group_id, + s32 animation_id, s16 a, u8 b, + u32 c, u8 d, u8 e); bool8 EntityIsValid__023047B8(struct entity *entity) { @@ -8,3 +51,526 @@ bool8 EntityIsValid__023047B8(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +void ov29_023047DC(void) +{ + s32 i; + + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + struct entity *entity = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (EntityIsValid__023047B8(entity)) + ov29_02304830(entity, GetIdleAnimationId(entity)); + } +} + +void ov29_02304830(struct entity *entity, s32 animation_group_id) +{ + struct monster *monster = entity->info; + s32 hallucinating; + s32 a; + + hallucinating = DUNGEON_PTR[0]->display_data.hallucinating; + if (entity == DUNGEON_PTR[0]->display_data.camera_target) + hallucinating = 0; + + entity->field_0x28 = 0; + entity->animation_group_id = entity->animation_group_id_mirror = animation_group_id; + entity->animation_id = entity->animation_id_mirror0 = monster->action.direction; + entity->field_0xb3 = 0; + a = entity->field_0xac; + if (monster->curse_class_status.curse != 2 && !hallucinating) { + SetSpriteIdForAnimationControl(&entity->anim_ctrl, entity->sprite_index); + SetAndPlayAnimationForAnimationControl( + &entity->anim_ctrl, entity->animation_group_id, entity->animation_id, a, + entity->field_0xaa, Rand16Bit() & 3, 0, 0); + } + else { + SetSpriteIdForAnimationControl(&entity->anim_ctrl, DungeonGetSpriteIndex(0x229)); + SetAndPlayAnimationForAnimationControl( + &entity->anim_ctrl, entity->animation_group_id, entity->animation_id, a, + entity->field_0xaa, Rand16Bit() & 3, 0, 0); + } + entity->field_0xb2 = 0; + if (!monster->is_not_team_member) + ov29_022E8104(); +} + +void ov29_02304954(void) +{ + s32 i; + + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + struct entity *entity = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (EntityIsValid__023047B8(entity)) + ov29_02304830(entity, GetIdleAnimationId(entity)); + } +} + +void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction) +{ + if (entity->type != ENTITY_MONSTER) + return; + + entity->field_0x28 = 0; + entity->animation_group_id = animation_id; + if (direction < 0) + return; + + if (direction < NUM_DIRECTIONS) + entity->animation_id = direction; +} + +void ov29_023049D4(struct entity *entity, s32 animation_id, s32 direction) +{ + if (entity->type != ENTITY_MONSTER) + return; + + if (entity->animation_group_id_mirror == animation_id && + entity->animation_id_mirror0 == direction) + return; + + ChangeMonsterAnimation(entity, animation_id, direction); +} + +void MakeMonsterIdleInDirectionIfValid(struct entity *entity, s32 direction) +{ + struct monster *monster; + + if (entity->type != ENTITY_MONSTER) + return; + + entity->animation_group_id = GetIdleAnimationId(entity); + entity->field_0x28 = 0; + if (direction < 0) + return; + + if (direction < NUM_DIRECTIONS) { + monster = entity->info; + monster->action.direction = direction & DIRECTION_MASK; + entity->animation_id = direction & DIRECTION_MASK; + } +} + +void ChangeMonsterAnimationToIdle(struct entity *entity, s32 direction) +{ + if (entity->type != ENTITY_MONSTER) + return; + + entity->animation_group_id = GetIdleAnimationId(entity); + entity->field_0x28 = 0; + if (direction < 0) + return; + + if (direction < NUM_DIRECTIONS) + entity->animation_id = direction; +} + +void ChangeMonsterAnimationToHurt(struct entity *entity, s32 direction) +{ + if (entity->type != ENTITY_MONSTER) + return; + + entity->animation_group_id = 6; + entity->field_0x28 = 0; + if (direction < 0) + return; + + if (direction < NUM_DIRECTIONS) + entity->animation_id = direction; +} + +s32 GetIdleAnimationId(struct entity *entity) +{ + struct monster *monster = entity->info; + + if (monster->sleep_class_status.sleep == STATUS_SLEEP_SLEEP || + monster->sleep_class_status.sleep == STATUS_SLEEP_NAPPING || + monster->sleep_class_status.sleep == STATUS_SLEEP_NIGHTMARE) { + if (monster->apparent_id == 0xb9 && + monster->sleep_class_status.sleep_turns == 0x7f) + return 7; + + return 5; + } + + if (monster->bide_class_status.bide == STATUS_TWO_TURN_BIDE) + return 0xb; + + return 7; +} + +void MakeMonsterIdleInDirection(struct entity *entity, s32 direction) +{ + struct monster *monster = entity->info; + + monster->action.direction = direction & DIRECTION_MASK; + ChangeMonsterAnimationToIdle(entity, direction & DIRECTION_MASK); +} + +void ov29_02304B14(struct entity *entity) +{ + s32 i; + struct monster *monster; + + if (!EntityIsValid__023047B8(entity)) + return; + + monster = entity->info; + for (i = 0; i < 100; i++) { + AdvanceFrame(0x21); + if (!sub_02053038(monster->apparent_id, entity->animation_group_id_mirror)) + return; + } +} + +void DetermineAllMonsterShadow(void) +{ + s32 i; + + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + struct entity *entity = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (EntityIsValid__023047B8(entity)) + DetermineMonsterShadow(entity); + } +} + +s32 DetermineMonsterShadow(struct entity *entity) +{ + s32 terrain_type; + s32 shadow_size; + struct monster *monster; + + terrain_type = GetTerrainType(GetTileAtEntity(entity)); + monster = entity->info; + shadow_size = GetShadowSize(monster->apparent_id); + if (terrain_type == TERRAIN_TYPE_CHASM) + return 6; + + if (terrain_type == TERRAIN_TYPE_NORMAL) { + if (IsWaterTileset()) + shadow_size = ov29_02352808[shadow_size]; + } + else if (terrain_type == TERRAIN_TYPE_SECONDARY) { + if (SECONDARY_TERRAIN_TYPES[DUNGEON_PTR[0]->gen_info.tileset_id] != + SECONDARY_TERRAIN_LAVA) + shadow_size = ov29_02352808[shadow_size]; + } + + monster->water_shadow_ripple_tracker = shadow_size; + return shadow_size; +} + +void ov29_02304C3C(struct entity *entity, s32 a) +{ + struct monster *monster; + s16 start_direction; + s16 direction; + s16 i; + + if (!EntityIsValid__023047B8(entity)) + return; + + if (entity->type != ENTITY_MONSTER) + return; + + monster = entity->info; + start_direction = monster->action.direction; + direction = start_direction; + if (!ShouldDisplayEntityWrapper(entity)) + return; + + for (i = 0; i < a * NUM_DIRECTIONS; i++) { + ChangeMonsterAnimationToIdle(entity, direction); + ov29_022EA370(2, 0x43); + direction++; + direction &= DIRECTION_MASK; + } + + while (direction != start_direction) { + ChangeMonsterAnimationToIdle(entity, direction); + ov29_022EA370(2, 0x43); + direction++; + direction &= DIRECTION_MASK; + } + + ChangeMonsterAnimationToIdle(entity, direction); + ov29_022EA370(2, 0x43); +} + +void ov29_02304D20(struct entity *entity, s32 b, struct position *c) +{ + struct unk_02304D20 *e; + s32 i; + struct monster *monster = entity->info; + + if (monster->field_0x20c >= 4) { + monster->action.action_id = ACTION_NOTHING; + return; + } + + ov29_0237C9CC = GetSpeedOption() ? 2 : 1; + e = &monster->field_0x19c[monster->field_0x20c]; + e->field_0x1a = 0; + e->field_0xc = b; + e->pos.x = entity->pos.x; + e->pos.y = entity->pos.y; + e->field_0x4 = c->x; + e->field_0x8 = c->y; + e->field_0x10 = ov29_0237C9CC * ov29_0235173C[b * 2]; + e->field_0x14 = ov29_0237C9CC * ov29_0235173E[b * 2]; + ov29_0237C9CC = GetSpeedOption() ? 2 : 1; + monster->field_0x20c++; + if (monster->field_0x20c == 2) { + s32 k; + + for (k = 0; k < 1; k++) { + monster->field_0x19c[k].field_0x18 = 0x18 / (ov29_0237C9CC * 2); + monster->field_0x19c[k].field_0x10 *= 2; + monster->field_0x19c[k].field_0x14 *= 2; + } + e->field_0x18 = 0x18 / (ov29_0237C9CC * 2); + e->field_0x10 *= 2; + e->field_0x14 *= 2; + } + else if (monster->field_0x20c == 3) { + s32 k; + + for (k = 0; k < 2; k++) { + monster->field_0x19c[k].field_0x18 = 0x18 / (ov29_0237C9CC * 3); + monster->field_0x19c[k].field_0x10 *= 3; + monster->field_0x19c[k].field_0x14 *= 3; + monster->field_0x19c[k].field_0x10 /= 2; + monster->field_0x19c[k].field_0x14 /= 2; + } + e->field_0x18 = 0x18 / (ov29_0237C9CC * 3); + e->field_0x10 *= 3; + e->field_0x14 *= 3; + } + else if (monster->field_0x20c == 4) { + for (i = 0; i < 3; i++) { + monster->field_0x19c[i].field_0x18 = 0x18 / (ov29_0237C9CC * 4); + monster->field_0x19c[i].field_0x10 *= 4; + monster->field_0x19c[i].field_0x14 *= 4; + monster->field_0x19c[i].field_0x10 /= 3; + monster->field_0x19c[i].field_0x14 /= 3; + } + e->field_0x18 = 0x18 / (ov29_0237C9CC * 4); + e->field_0x10 *= 4; + e->field_0x14 *= 4; + } + else { + e->field_0x18 = 0x18 / ov29_0237C9CC; + } +} + +bool8 DisplayActions(struct entity *a) +{ + s32 i; + bool8 moved; + bool8 display; + s32 frame; + struct entity *prev_active; + struct entity *entity; + struct unk_02304D20 *e; + struct monster *monster; + s32 pass; + struct pixel_position pixel_pos; + struct pixel_position pixel_pos2; + struct position prev_pos; + + ov29_0237C9C1 = FALSE; + moved = FALSE; + display = FALSE; + ov29_0237C9CC = GetSpeedOption() ? 2 : 1; + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + struct entity *entity = DUNGEON_PTR[0]->active_monster_ptrs[i]; + struct monster *monster; + + if (!EntityIsValid__0230558C(entity)) + continue; + + monster = entity->info; + if (monster->field_0x20c == 0) { + s32 direction; + + if (!monster->waiting) + continue; + + monster->waiting = FALSE; + if (monster->target_pos.x == 0 && monster->target_pos.y == 0) + continue; + + if (monster->target_pos.x == entity->pos.x && + monster->target_pos.y == entity->pos.y) + continue; + + if (CheckVariousStatuses2__02301244(entity, TRUE) && + CheckVariousStatuses__023016DC(entity)) + continue; + + direction = GetDirectionTowardsPosition(&entity->pos, &monster->target_pos); + if (direction == monster->action.direction) + continue; + + ChangeMonsterAnimationToIdle(entity, direction); + } + else { + monster->flags |= 0x2000; + pixel_pos.x = ((monster->field_0x19c[0].field_0x4 * 0x18) + 0xc) << 8; + pixel_pos.y = ((monster->field_0x19c[0].field_0x8 * 0x18) + 0x10) << 8; + UpdateEntityPixelPos(entity, &pixel_pos); + ov29_023049D4(entity, 0, monster->field_0x19c[0].field_0xc); + monster->field_0x20e = 0; + moved = TRUE; + if (ShouldDisplayEntityWrapper(entity)) + display = TRUE; + } + } + + if (!moved) + return FALSE; + + prev_active = DUNGEON_PTR[0]->current_active_entity; + DUNGEON_PTR[0]->current_active_entity = a; + if (!DUNGEON_PTR[0]->leader_running && display) { + WaitUntilAlertBoxTextIsLoaded(0x35); + for (frame = 0; frame < 0x18 / ov29_0237C9CC; frame++) { + s32 j; + + AdvanceFrame(7); + for (j = 0; j < DUNGEON_MAX_POKEMON; j++) { + entity = DUNGEON_PTR[0]->active_monster_ptrs[j]; + + if (!EntityIsValid__0230558C(entity)) + continue; + + monster = entity->info; + e = &monster->field_0x19c[monster->field_0x20e]; + if (monster->field_0x20c == 0) + continue; + + IncrementEntityPixelPosXY(entity, e->field_0x10, e->field_0x14); + if (monster->is_team_leader && DUNGEON_PTR[0]->field_0x1dc.x >= 0) { + DUNGEON_PTR[0]->field_0x1dc.x = (s32)entity->pixel_pos.x >> 8; + DUNGEON_PTR[0]->field_0x1dc.y = (s32)entity->pixel_pos.y >> 8; + } + + e->field_0x18--; + if (e->field_0x18 != 0) + continue; + + monster->field_0x20e++; + if (monster->field_0x20e == monster->field_0x20c) { + monster->field_0x20c = 0; + continue; + } + + pixel_pos2.x = + ((monster->field_0x19c[monster->field_0x20e].field_0x4 * 0x18) + 0xc) << 8; + pixel_pos2.y = + ((monster->field_0x19c[monster->field_0x20e].field_0x8 * 0x18) + 0x10) << 8; + UpdateEntityPixelPos(entity, &pixel_pos2); + ov29_023049D4(entity, 0, + monster->field_0x19c[monster->field_0x20e].field_0xc); + } + } + } + + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + struct entity *entity = DUNGEON_PTR[0]->active_monster_ptrs[i]; + struct monster *monster; + + if (!EntityIsValid__0230558C(entity)) + continue; + + monster = entity->info; + monster->field_0x20c = 0; + if (monster->flags & 0x2000) + UpdateEntityPixelPos(entity, NULL); + } + + ov29_02307DD0(); + for (pass = 0; pass < 2; pass++) { + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + struct entity *entity = DUNGEON_PTR[0]->active_monster_ptrs[i]; + struct monster *monster; + + if (!EntityIsValid__0230558C(entity)) + continue; + + if (IsFloorOver()) + break; + + monster = entity->info; + if (pass == 0) { + if (!monster->is_team_leader) + continue; + } + else if (monster->is_team_leader) { + continue; + } + + prev_pos = entity->pos; + if (!(monster->flags & 0x2000)) { + ov29_0234AD10(entity); + if (!EntityIsValid__0230558C(entity)) + continue; + } + else { + monster->flags &= ~0x2000; + if (monster->is_team_leader) { + DiscoverMinimap(&entity->pos); + HandleShopTransaction(0); + CheckLeaderTile(); + } + else { + ov29_0234AD10(entity); + if (!EntityIsValid__0230558C(entity)) + continue; + + CheckNonLeaderTile(entity); + } + + if (!EntityIsValid__0230558C(entity)) + continue; + + if (IsFloorOver()) + break; + + TryForcedLoss(FALSE); + ActivateEndOfTurnEffects(entity); + if (!EntityIsValid__0230558C(entity)) + continue; + + if (IsFloorOver()) + break; + + EnemyEvolution(entity); + ov29_02346888(); + ov29_02305814(entity, DUNGEON_PTR[0]->gen_info.force_create_monster_house); + } + + if (!EntityIsValid__0230558C(entity)) + continue; + + if (IsFloorOver()) + break; + + if (prev_pos.x != entity->pos.x || prev_pos.y != entity->pos.y) + ov29_0237C9C1 = TRUE; + + ActivateTerrainEffects(entity); + EnsureCanStandCurrentTile(entity); + } + } + + IsFloorOver2(); + if (IsFloorOver()) { + DUNGEON_PTR[0]->current_active_entity = prev_active; + return TRUE; + } + + ov29_022EF9BC(); + DUNGEON_PTR[0]->current_active_entity = prev_active; + return TRUE; +} diff --git a/src/overlay_29_0230558C.c b/src/overlay_29_0230558C.c index f3b638e3..d6437e22 100644 --- a/src/overlay_29_0230558C.c +++ b/src/overlay_29_0230558C.c @@ -1,4 +1,5 @@ #include "overlay_29_0230558C.h" +#include "overlay_29_023047B8.h" #include "dg_uty.h" #include "dungeon_capabilities.h" #include "dungeon_items.h" @@ -30,8 +31,6 @@ extern struct dungeon *DUNGEON_PTR[]; extern const u16 ov29_02353318[]; -extern s32 GetIdleAnimationId(struct entity *entity); -extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); extern void ov29_02337D68(struct position *pos); extern struct trap *GetTrapInfo(struct entity *entity); extern void TryTriggerTrap(struct entity *entity, struct position *pos, s32 a, s32 b); diff --git a/src/overlay_29_0234BA54.c b/src/overlay_29_0234BA54.c index fdc1ea7f..e4568a3a 100644 --- a/src/overlay_29_0234BA54.c +++ b/src/overlay_29_0234BA54.c @@ -49,8 +49,8 @@ void InitPortraitDungeon(portrait_params *portrait, enum monster_id monster_id, portrait->monster_id = monster_id; portrait->portrait_emotion = emotion; portrait->layout_idx = 0; - portrait->offset_x = 2; - portrait->offset_y = 9; + portrait->offset.x = 2; + portrait->offset.y = 9; portrait->try_flip = FALSE; portrait->has_flip = FALSE; portrait->hw_flip = FALSE; From c482e2dfdb28c68bae2a1f8633af34c054ffc6d1 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Tue, 15 Sep 2026 02:48:48 -0700 Subject: [PATCH 30/34] Decompile 59 more callees; clear five asm files entirely asm/main_020504BC.s 28 functions cleared asm/main_0200D1F0.s 11 functions cleared asm/main_02052060.s 10 functions cleared asm/overlay_29_02320788.s 8 functions cleared asm/main_020559D8.s 1 function cleared asm/overlay_29_022E34A8.s 1 of 9 remainder -> overlay_29_022E2B68.s sub_02050CF8 and sub_02050D84 are in translation units of their own, src/main_02050CF8.c and src/main_02050D84.c, and that is load-bearing rather than tidiness. Both call BitstreamDebug, which is four bytes -- an empty body -- and is one of the other 26 functions of the same asm file. Compiled beside it at -O4,s, mwcc inlines the call away and each function comes out two instructions short; the ROM then shifts and 33 of 37 sbins stop matching. Retail emits a real bl there, so retail compiled these two apart from BitstreamDebug. Separate objects reproduce that, and the pool -- five words and the predicated ldrne/ldreq pair -- was never the problem. asm/main_bss_022AB0AC.s declares a second global at 0x022AB918. Two objects of different size share that address: the record TEAM_NAME (0x14 bytes, 0x10 under JAPAN) and _022AB918, its leading name buffer (0xC, 8 under JAPAN). Four functions load both, which needs two distinct (symbol, addend) pool keys; one symbol gives one word and leaves them four bytes short. No .space is added and no later symbol moves, so the bss layout and the ROM are untouched -- confirmed by building that one-line change alone against the previous commit. ov29_022E34A8_EU exists only in the EUROPE build, so its definition and its prototype both carry #ifdef EUROPE; its single call site was already inside one. Note that extracting it left an orphan #endif in the remainder file, because it was the first function in its .s and sat inside a region conditional -- the tool takes the opening directive with the function and leaves the closing one behind. struct bag_items loses fill2/fill3/fill4 for the members behind them, so struct bulk_item moves above it and two accessors return struct bulk_item *. struct unk_020517F4 splits u8[8] into u8[4] + s32, forced by a 32-bit load at offset 4. struct bitstream::ptr becomes u8 * -- CopyBitsTo and CopyBitsFrom read it with ldrb, and char * under -char signed emits ldrsb. sub_02051FF0 and LoadFileFromRom take a const char * path, not a u32 id; src/ground_bg.c already declared the latter correctly. Seventeen call-site-derived declarations are removed in favour of an include of the owning header. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds in all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_0200D1F0.inc | 28 - asm/include/main_020504BC.inc | 18 - asm/include/main_02052060.inc | 26 - asm/include/main_020559D8.inc | 2 - ...9_022E34A8.inc => overlay_29_022E2B68.inc} | 2 - asm/include/overlay_29_02320788.inc | 47 - asm/main_0200D1F0.s | 556 ----------- asm/main_020504BC.s | 881 ------------------ asm/main_02052060.s | 556 ----------- asm/main_020559D8.s | 102 -- asm/main_bss_022AB0AC.s | 2 + ...ay_29_022E34A8.s => overlay_29_022E2B68.s} | 28 +- asm/overlay_29_02320788.s | 830 ----------------- include/dungeon_util_2.h | 3 + include/item.h | 11 + include/item_util_4.h | 14 + include/main_0200D81C.h | 2 + include/main_020504A4.h | 24 + include/main_02050CF8.h | 8 + include/main_02050D84.h | 8 + include/main_020517D4.h | 3 +- include/main_02051FF0.h | 3 +- include/main_020526EC.h | 29 + include/main_02055770.h | 1 + include/monster_data.h | 17 +- include/number_util.h | 10 + include/overlay_29_0230BBAC.h | 2 +- include/overlay_29_02320764.h | 13 + include/save.h | 2 +- main.lsf | 9 +- src/dungeon_recruitment.c | 2 +- src/dungeon_util_2.c | 9 + src/item_util_4.c | 236 ++++- src/main_0200D81C.c | 79 ++ src/main_0203D538.c | 3 +- src/main_020504A4.c | 360 +++++++ src/main_02050CF8.c | 40 + src/main_02050D84.c | 41 + src/main_02051FF0.c | 119 ++- src/main_020526EC.c | 282 +++++- src/main_020527A8.c | 4 +- src/main_0205283C.c | 42 +- src/main_02052B28.c | 8 +- src/main_02055770.c | 38 + src/number_util.c | 37 + src/overlay_29_023047B8.c | 2 +- src/overlay_29_0230A9DC.c | 4 +- src/overlay_29_0230BBAC.c | 2 +- src/overlay_29_02311010.c | 4 +- src/overlay_29_0231CBC8.c | 2 +- src/overlay_29_0231EDD8.c | 2 +- src/overlay_29_02320764.c | 429 +++++++++ src/overlay_29_02321238.c | 2 +- src/overlay_29_02321274.c | 2 +- src/overlay_29_023296F8.c | 2 +- src/overlay_29_0232C560.c | 2 +- 56 files changed, 1852 insertions(+), 3138 deletions(-) delete mode 100644 asm/include/main_0200D1F0.inc delete mode 100644 asm/include/main_020504BC.inc delete mode 100644 asm/include/main_02052060.inc delete mode 100644 asm/include/main_020559D8.inc rename asm/include/{overlay_29_022E34A8.inc => overlay_29_022E2B68.inc} (90%) delete mode 100644 asm/include/overlay_29_02320788.inc delete mode 100644 asm/main_0200D1F0.s delete mode 100644 asm/main_020504BC.s delete mode 100644 asm/main_02052060.s delete mode 100644 asm/main_020559D8.s rename asm/{overlay_29_022E34A8.s => overlay_29_022E2B68.s} (95%) delete mode 100644 asm/overlay_29_02320788.s create mode 100644 include/main_02050CF8.h create mode 100644 include/main_02050D84.h create mode 100644 src/main_02050CF8.c create mode 100644 src/main_02050D84.c diff --git a/asm/include/main_0200D1F0.inc b/asm/include/main_0200D1F0.inc deleted file mode 100644 index 117e881e..00000000 --- a/asm/include/main_0200D1F0.inc +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once -.public _02094D0C -.public _02097F34 -.public _02097F50 -.public _02097F58 -.public _02097F68 -.public _02097F6C -.public _02097F7C -.public _02097F90 -.public _02097F9C -.public _02097FAC -.public _02097FB8 -.public _02097FC4 -.public _02097FE4 -.public BAG_ITEMS_PTR_MIRROR -.public GetDisplayedBuyPrice -.public GetDisplayedSellPrice -.public GetItemActionName -.public GetItemCategory -.public GetItemName -.public GetItemPaletteId -.public GetMoneyQuantity -.public InitItem -.public MoneyQuantityToString__02023B30 -.public strcpy -.public strncpy -.public sub_0200EB64 -.public vsprintf diff --git a/asm/include/main_020504BC.inc b/asm/include/main_020504BC.inc deleted file mode 100644 index 2122160b..00000000 --- a/asm/include/main_020504BC.inc +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -.public ADVENTURE_LOG_PTR -.public ARM9_UNKNOWN_DATA__NA_209E6BC -.public CONVERSION2_TYPE_TABLE -.public ComputeSpecialCounters -.public Copy16BitsFrom -.public Copy16BitsTo -.public CopyNStringFromId -.public GetRankUpEntry -.public GetResolvedPerformanceProgressFlag -.public GetStringFromFileVeneer -.public MemZero -.public StrncpyName -.public StrncpySimpleNoPad -.public StrncpySimpleNoPadSafe -.public TEAM_NAME -.public _0209E6BD -.public _022AB924 diff --git a/asm/include/main_02052060.inc b/asm/include/main_02052060.inc deleted file mode 100644 index 3a39cc40..00000000 --- a/asm/include/main_02052060.inc +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once -.public _020A31B8 -.public _020A31D4 -.public _020A31E4 -.public _020A31F4 -.public _020A31FC -.public _020A45C8_JP -.public _020B09B0 -.public _020B09C0 -.public _s32_div_f -.public ARM9_UNKNOWN_PTR__NA_20A2C84 -.public CopyColorToPaletteDataRgba -.public GetBaseForm -.public LoadFileFromRom -.public LoadM2nAndN2m -.public MarkPaletteDataAsNeedingUpdate -.public MemFree -.public MONSTER_DATA_TABLE_PTR -.public StringFromId -.public strncpy -.public sub_02051804 -.public sub_02051D8C -.public sub_02051E60 -.public sub_02051FF0 -.public UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE -.public vsprintf diff --git a/asm/include/main_020559D8.inc b/asm/include/main_020559D8.inc deleted file mode 100644 index 6696f528..00000000 --- a/asm/include/main_020559D8.inc +++ /dev/null @@ -1,2 +0,0 @@ -#pragma once -.public TEAM_MEMBER_TABLE_PTR diff --git a/asm/include/overlay_29_022E34A8.inc b/asm/include/overlay_29_022E2B68.inc similarity index 90% rename from asm/include/overlay_29_022E34A8.inc rename to asm/include/overlay_29_022E2B68.inc index d15ff07c..06f56aea 100644 --- a/asm/include/overlay_29_022E34A8.inc +++ b/asm/include/overlay_29_022E2B68.inc @@ -2,9 +2,7 @@ .public CanSeeInvisibleMonsters .public DUNGEON_PTR .public DrawMinimapTile -.public EntityIsValid__022E1A1C .public EntityIsValid__022E32E8 -.public GetForcedLossReason .public HasDropeyeStatus .public IsBlinded .public IsPositionActuallyInSight diff --git a/asm/include/overlay_29_02320788.inc b/asm/include/overlay_29_02320788.inc deleted file mode 100644 index 53f62fca..00000000 --- a/asm/include/overlay_29_02320788.inc +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public ActivateTerrainEffects -.public AdvanceFrame -.public AreTileJumpsAllowed -.public CalcDamageFixedNoCategory -.public CannotStandOnTile -.public CannotStandOnTileNoMonsterCheck -.public ChangeMonsterAnimationToIdle -.public DetermineTileWalkableNeighbors -.public DiscoverMinimap -.public DUNGEON_FRAMES_PASSED -.public DUNGEON_PTR -.public EntityIsValid__02320764 -.public ExclusiveItemEffectIsActiveWithLogging -.public EXPLOSION_FIXED_DAMAGES -.public FindClosestUnoccupiedTileWithin2 -.public FindUnoccupiedTileWithin3 -.public GetApparentWeather -.public GetLeader -.public GetRandomTile -.public GetTileSafe -.public HandleShopTransaction -.public InitMove -.public IsFloorOver -.public LogMessageByIdWithPopupCheckUserTarget -.public MonsterIsType -.public MoveMonsterToPos -.public ov29_022E5560 -.public ov29_022E55F0 -.public ov29_022E5650 -.public ov29_022F42F8 -.public ov29_02305814 -.public ov29_02321238 -.public ov29_02336694 -.public ov29_023529B8 -.public RemoveGroundItem -.public ShouldDisplayEntityWrapper -.public sub_01FFB62C -.public SubstitutePlaceholderStringTags -.public TryEndPetrifiedOrSleepStatus -.public TryInflictPetrifiedStatus -.public TwoTurnMoveForcedMiss -.public UpdateCamera -.public UpdateEntityPixelPos -.public UpdateMinimap -.public UpdateTrapsVisibility diff --git a/asm/main_0200D1F0.s b/asm/main_0200D1F0.s deleted file mode 100644 index 673c51ab..00000000 --- a/asm/main_0200D1F0.s +++ /dev/null @@ -1,556 +0,0 @@ - .include "asm/macros.inc" - .include "main_0200D1F0.inc" - - .text - - arm_func_start sub_0200D1F0 -sub_0200D1F0: ; 0x0200D1F0 - ldr ip, _0200D1F8 ; =sub_0200EB64 - bx ip - .align 2, 0 -_0200D1F8: .word sub_0200EB64 - arm_func_end sub_0200D1F0 - - arm_func_start sub_0200D1FC -sub_0200D1FC: ; 0x0200D1FC - ldr ip, _0200D204 ; =GetItemPaletteId - bx ip - .align 2, 0 -_0200D204: .word GetItemPaletteId - arm_func_end sub_0200D1FC - - arm_func_start sub_0200D208 -sub_0200D208: ; 0x0200D208 - ldr ip, _0200D210 ; =GetItemActionName - bx ip - .align 2, 0 -_0200D210: .word GetItemActionName - arm_func_end sub_0200D208 - - arm_func_start sub_0200D214 -sub_0200D214: ; 0x0200D214 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x58 - mov r5, r1 - mov r6, r0 - mov r0, r5 - mov r4, r2 - bl GetItemName - mov r1, r0 - add r0, sp, #6 - mov r2, #0x50 - bl strncpy - mov r2, #0 - mov r1, r5 - add r0, sp, #0 - mov r3, r2 - bl InitItem - mov r1, #1 - strh r1, [sp, #2] - mov r0, r6 - mov r3, r4 - add r1, sp, #6 - add r2, sp, #0 - bl sub_0200D688 - add sp, sp, #0x58 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end sub_0200D214 - - arm_func_start FindItemInInventory -FindItemInInventory: ; 0x0200D278 - stmdb sp!, {r4, r5, r6, lr} - ldr r1, _0200D30C ; =BAG_ITEMS_PTR_MIRROR - mov r5, #0 - ldr r6, [r1] - mov r3, r5 - mov ip, #1 - mov r1, #6 - b _0200D2D0 -_0200D298: - mul lr, r5, r1 - ldr r4, [r6, #0x384] - ldrb r2, [r4, lr] - add r4, r4, lr - tst r2, #1 - movne r2, ip - moveq r2, r3 - tst r2, #0xff - beq _0200D2CC - ldrsh r2, [r4, #4] - cmp r0, r2 - moveq r0, r5 - ldmeqia sp!, {r4, r5, r6, pc} -_0200D2CC: - add r5, r5, #1 -_0200D2D0: - cmp r5, #0x32 - blt _0200D298 - mov r2, #0 - b _0200D2FC -_0200D2E0: - add r1, r6, r2, lsl #1 - add r1, r1, #0x300 - ldrsh r1, [r1, #0x8a] - cmp r0, r1 - addeq r0, r2, #0x8000 - ldmeqia sp!, {r4, r5, r6, pc} - add r2, r2, #1 -_0200D2FC: - cmp r2, #0x3e8 - blt _0200D2E0 - mvn r0, #0 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0200D30C: .word BAG_ITEMS_PTR_MIRROR - arm_func_end FindItemInInventory - - arm_func_start MaybeGetFormattedItemName -MaybeGetFormattedItemName: ; 0x0200D310 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0xa0 - mov sb, r1 - mov sl, r0 - ldrsh r0, [sb, #4] - mov r8, r2 - mov r7, r3 - mov r4, #0 - bl GetItemCategory - mov r5, r4 - mov r6, r0 - cmp r8, #0 - ldrneb r0, [r8, #8] - mov fp, r5 - cmpne r0, #0 - ldrsh r0, [sb, #4] - movne r4, #1 - bl GetItemName - mov r2, r0 - cmp r6, #0 - bne _0200D3B4 - cmp r4, #0 - add r0, sp, #0x50 - beq _0200D394 - cmp r7, #0 - ldrh r3, [sb, #2] - beq _0200D388 - ldr r1, _0200D60C ; =_02097F34 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D388: - ldr r1, _0200D610 ; =_02097F50 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D394: - cmp r7, #0 - beq _0200D3A8 - ldr r1, _0200D614 ; =_02097F58 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D3A8: - ldr r1, _0200D618 ; =_02097F68 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D3B4: - cmp r6, #1 - bne _0200D40C - cmp r4, #0 - add r0, sp, #0x50 - beq _0200D3EC - cmp r7, #0 - ldrh r3, [sb, #2] - beq _0200D3E0 - ldr r1, _0200D60C ; =_02097F34 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D3E0: - ldr r1, _0200D610 ; =_02097F50 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D3EC: - cmp r7, #0 - beq _0200D400 - ldr r1, _0200D614 ; =_02097F58 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D400: - ldr r1, _0200D618 ; =_02097F68 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D40C: - add r0, r6, #0xf4 - and r0, r0, #0xff - cmp r0, #2 - bhi _0200D440 - cmp r7, #0 - add r0, sp, #0x50 - beq _0200D434 - ldr r1, _0200D61C ; =_02097F6C - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D434: - mov r1, r2 - bl strcpy - b _0200D4F8 -_0200D440: - ldrsh r0, [sb, #4] - cmp r0, #0xb7 - bne _0200D4AC - mov r0, sb - bl GetMoneyQuantity - mov r1, r0 - add r0, sp, #0 - bl MoneyQuantityToString__02023B30 - cmp r7, #0 - add r0, sp, #0x50 - add r2, sp, #0 - beq _0200D47C - ldr r1, _0200D620 ; =_02097F7C - bl SprintfStatic__0200D634 - b _0200D484 -_0200D47C: - ldr r1, _0200D624 ; =_02097F90 - bl SprintfStatic__0200D634 -_0200D484: - cmp r7, #0 - add r0, sp, #0x50 - add r2, sp, #0 - beq _0200D4A0 - ldr r1, _0200D620 ; =_02097F7C - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D4A0: - ldr r1, _0200D624 ; =_02097F90 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D4AC: - cmp r6, #0xf - add r0, sp, #0x50 - bne _0200D4D8 - cmp r7, #0 - beq _0200D4CC - ldr r1, _0200D628 ; =_02097F9C - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D4CC: - mov r1, r2 - bl strcpy - b _0200D4F8 -_0200D4D8: - cmp r7, #0 - beq _0200D4EC - ldr r1, _0200D614 ; =_02097F58 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D4EC: - mov r1, r2 - mov r2, #0x50 - bl strncpy -_0200D4F8: - ldrb r0, [sb] - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _0200D538 - ldr r1, _0200D62C ; =_02097FAC - add r2, sp, #0x50 - mov r0, sl - bl SprintfStatic__0200D634 - add r0, sp, #0x50 - mov r1, sl - mov r2, #0x50 - bl strncpy - mov fp, #1 - b _0200D564 -_0200D538: - ldrb r0, [sp, #0xc8] - cmp r0, #0 - beq _0200D564 - ldr r1, _0200D630 ; =_02097FB8 - add r2, sp, #0x50 - mov r0, sl - bl SprintfStatic__0200D634 - add r0, sp, #0x50 - mov r1, sl - mov r2, #0x50 - bl strncpy -_0200D564: - cmp r8, #0 - bne _0200D580 - add r1, sp, #0x50 - mov r0, sl - mov r2, #0x50 - bl strncpy - b _0200D600 -_0200D580: - ldrb r0, [r8, #4] - cmp r0, #0 - beq _0200D5AC - ldrb r0, [sb] - tst r0, #0x10 - beq _0200D5AC - cmp fp, #0 - movne r0, #0x35 - strneb r0, [sp, #0x54] - moveq r0, #0x32 - streqb r0, [sp, #0x54] -_0200D5AC: - ldr r0, [r8] - add r1, sp, #0x50 - cmp r0, #1 - cmpne r0, #3 - bne _0200D5F0 - ldrb r0, [sb] - tst r0, #2 - mov r0, sl - beq _0200D5E4 - mov r2, sb - mov r3, r8 - bl sub_0200D688 - mov r5, #1 - b _0200D600 -_0200D5E4: - mov r2, #0x50 - bl strncpy - b _0200D600 -_0200D5F0: - mov r0, sl - mov r2, sb - mov r3, r8 - bl sub_0200D688 -_0200D600: - mov r0, r5 - add sp, sp, #0xa0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0200D60C: .word _02097F34 -_0200D610: .word _02097F50 -_0200D614: .word _02097F58 -_0200D618: .word _02097F68 -_0200D61C: .word _02097F6C -_0200D620: .word _02097F7C -_0200D624: .word _02097F90 -_0200D628: .word _02097F9C -_0200D62C: .word _02097FAC -_0200D630: .word _02097FB8 - arm_func_end MaybeGetFormattedItemName - - arm_func_start SprintfStatic__0200D634 -SprintfStatic__0200D634: ; 0x0200D634 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3, lr} - add r2, sp, #0xc - bic r2, r2, #3 - ldr r1, [sp, #0xc] - add r2, r2, #4 - bl vsprintf - ldmia sp!, {r3, lr} - add sp, sp, #0x10 - bx lr - arm_func_end SprintfStatic__0200D634 - - arm_func_start MaybeGetUncoloredFormattedItemName -MaybeGetUncoloredFormattedItemName: ; 0x0200D65C - stmdb sp!, {r3, lr} - mov r3, #0 - str r3, [sp] - bl MaybeGetFormattedItemName - ldmia sp!, {r3, pc} - arm_func_end MaybeGetUncoloredFormattedItemName - - arm_func_start MaybeGetColoredFormattedItemName -MaybeGetColoredFormattedItemName: ; 0x0200D670 - stmdb sp!, {r3, lr} - mov ip, #0 - mov r3, #1 - str ip, [sp] - bl MaybeGetFormattedItemName - ldmia sp!, {r3, pc} - arm_func_end MaybeGetColoredFormattedItemName - - arm_func_start sub_0200D688 -sub_0200D688: ; 0x0200D688 - stmdb sp!, {r3, r4, r5, r6, lr} - sub sp, sp, #0x2c - movs r4, r3 - mov r6, r0 - mov r5, r1 - bne _0200D6AC - mov r2, #0x50 - bl strncpy - b _0200D75C -_0200D6AC: - ldr r0, [r4] - cmp r0, #4 - addls pc, pc, r0, lsl #2 - b _0200D6E8 -_0200D6BC: ; jump table - b _0200D6E8 ; case 0 - b _0200D6D0 ; case 1 - b _0200D6D0 ; case 2 - b _0200D6DC ; case 3 - b _0200D6DC ; case 4 -_0200D6D0: - mov r0, r2 - bl GetDisplayedBuyPrice - b _0200D6EC -_0200D6DC: - mov r0, r2 - bl GetDisplayedSellPrice - b _0200D6EC -_0200D6E8: - mov r0, #0 -_0200D6EC: - cmp r0, #0 - bne _0200D708 - mov r0, r6 - mov r1, r5 - mov r2, #0x50 - bl strncpy - b _0200D75C -_0200D708: - ldrsh r1, [r4, #6] - cmp r1, #0 - add r1, sp, #4 - beq _0200D740 - mov r2, #1 - bl sub_0200D76C - add r0, sp, #4 - str r0, [sp] - ldrsh r3, [r4, #6] - ldr r1, _0200D764 ; =_02097FC4 - mov r0, r6 - mov r2, r5 - bl SprintfStatic__0200D634 - b _0200D75C -_0200D740: - mov r2, #0 - bl sub_0200D76C - ldr r1, _0200D768 ; =_02097FE4 - add r3, sp, #4 - mov r0, r6 - mov r2, r5 - bl SprintfStatic__0200D634 -_0200D75C: - add sp, sp, #0x2c - ldmia sp!, {r3, r4, r5, r6, pc} - .align 2, 0 -_0200D764: .word _02097FC4 -_0200D768: .word _02097FE4 - arm_func_end sub_0200D688 - - arm_func_start sub_0200D76C -sub_0200D76C: ; 0x0200D76C -#ifdef JAPAN - stmdb sp!, {r4, r5, r6, lr} - ldr r3, _0200D814 ; =BAG_ITEMS_PTR_MIRROR - mov lr, #0 - ldr r4, [r3, #4] - mov ip, lr - mov r3, lr -_0200D784: - ldr r5, _0200D818 ; =_02094D0C - mov r6, #0 - ldr r5, [r5, r3, lsl #2] - b _0200D79C -_0200D794: - sub r0, r0, r5 - add r6, r6, #1 -_0200D79C: - cmp r0, r5 - bge _0200D794 - cmp r6, #9 - movgt r6, #9 - cmp r6, #0 - beq _0200D7D8 - ldrb r5, [r4, r6, lsl #1] - add r6, r4, r6, lsl #1 - add ip, ip, #1 - strb r5, [r1] - ldrb r5, [r6, #1] - mov lr, #1 - strb r5, [r1, #1] - add r1, r1, #2 - b _0200D80C -_0200D7D8: - cmp lr, #0 - beq _0200D800 - ldrb r5, [r4, r6, lsl #1] - add r6, r4, r6, lsl #1 - add ip, ip, #1 - strb r5, [r1] - ldrb r5, [r6, #1] - strb r5, [r1, #1] - add r1, r1, #2 - b _0200D80C -_0200D800: - cmp r2, #0 - movne r5, #0x7f - strneb r5, [r1], #1 -_0200D80C: - add r3, r3, #1 - cmp r3, #5 - blt _0200D784 - ldr r2, _0200D814 ; =BAG_ITEMS_PTR_MIRROR - mov r3, #0 - ldr r2, [r2, #4] - ldrb r4, [r2, r0, lsl #1] - add r2, r2, r0, lsl #1 - add r0, ip, #1 - strb r4, [r1] - ldrb r2, [r2, #1] - strb r2, [r1, #1] - strb r3, [r1, #2] - ldmia sp!, {r4, r5, r6, pc} -#else - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - ldr r3, _0200D814 ; =BAG_ITEMS_PTR_MIRROR - mov ip, #0 - ldr lr, [r3, #4] - ldr r8, _0200D818 ; =_02094D0C - mov r3, ip - mov sl, ip - mov r7, #9 - mov r4, #0x7f - mov r6, #1 - mov sb, ip -_0200D798: - mov r5, sb - ldr fp, [r8, sl, lsl #2] - b _0200D7AC -_0200D7A4: - sub r0, r0, fp - add r5, r5, #1 -_0200D7AC: - cmp r0, fp - bge _0200D7A4 - cmp r5, #9 - movgt r5, r7 - cmp r5, #0 - ldrneb r5, [lr, r5] - movne ip, r6 - addne r3, r3, #1 - strneb r5, [r1], #1 - bne _0200D7F0 - cmp ip, #0 - ldrneb r5, [lr, r5] - addne r3, r3, #1 - strneb r5, [r1], #1 - bne _0200D7F0 - cmp r2, #0 - strneb r4, [r1], #1 -_0200D7F0: - add sl, sl, #1 - cmp sl, #5 - blt _0200D798 - ldrb ip, [lr, r0] - mov r2, #0 - add r0, r3, #1 - strb ip, [r1] - strb r2, [r1, #1] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -#endif - .align 2, 0 -_0200D814: .word BAG_ITEMS_PTR_MIRROR -_0200D818: .word _02094D0C - arm_func_end sub_0200D76C diff --git a/asm/main_020504BC.s b/asm/main_020504BC.s deleted file mode 100644 index f457bbaf..00000000 --- a/asm/main_020504BC.s +++ /dev/null @@ -1,881 +0,0 @@ - .include "asm/macros.inc" - .include "main_020504BC.inc" - - .text - - arm_func_start SetSentryDutyGamePoints -SetSentryDutyGamePoints: ; 0x020504BC - stmdb sp!, {r3, lr} - ldr r1, _02050548 ; =ADVENTURE_LOG_PTR - mov lr, #0 - ldr r2, [r1] - b _020504EC -_020504D0: - add r1, r2, lr, lsl #2 - ldr r1, [r1, #0x264] - cmp r0, r1 - bhi _020504F4 - add r1, lr, #1 - mov r1, r1, lsl #0x10 - mov lr, r1, asr #0x10 -_020504EC: - cmp lr, #5 - blt _020504D0 -_020504F4: - cmp lr, #5 - mvnge r0, #0 - ldmgeia sp!, {r3, pc} - mov ip, #4 - ldr r2, _02050548 ; =ADVENTURE_LOG_PTR - b _02050528 -_0205050C: - ldr r3, [r2] - sub r1, ip, #1 - add ip, r3, ip, lsl #2 - ldr r3, [ip, #0x260] - mov r1, r1, lsl #0x10 - str r3, [ip, #0x264] - mov ip, r1, asr #0x10 -_02050528: - cmp ip, lr - bgt _0205050C - ldr r1, _02050548 ; =ADVENTURE_LOG_PTR - ldr r1, [r1] - add r1, r1, lr, lsl #2 - str r0, [r1, #0x264] - mov r0, lr - ldmia sp!, {r3, pc} - .align 2, 0 -_02050548: .word ADVENTURE_LOG_PTR - arm_func_end SetSentryDutyGamePoints - - arm_func_start CopyLogTo -CopyLogTo: ; 0x0205054C - stmdb sp!, {r4, lr} - mov r4, r0 - bl ComputeSpecialCounters - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x14 - add r1, r1, #0x10 - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x14 - add r1, r1, #0x14 - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x14 - add r1, r1, #0x18 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x80 - ldr r1, [r1] - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0xe - ldr r1, [r1] - add r1, r1, #0x2c - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0xe - ldr r1, [r1] - add r1, r1, #0x30 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #9 - ldr r1, [r1] - add r1, r1, #0x34 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x28 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x24 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x1c - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x38 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x3c - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x40 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x4a0 - ldr r1, [r1] - add r1, r1, #0x44 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x4a0 - ldr r1, [r1] - add r1, r1, #0xd8 - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x220 - add r1, r1, #0x16c - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x580 - add r1, r1, #0x1b0 - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x20 - add r1, r1, #0x260 - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0xa0 - add r1, r1, #0x264 - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - add r1, r1, #0x278 - bl Copy16BitsTo - ldmia sp!, {r4, pc} - .align 2, 0 -_02050734: .word ADVENTURE_LOG_PTR - arm_func_end CopyLogTo - - arm_func_start CopyLogFrom -CopyLogFrom: ; 0x02050738 - stmdb sp!, {r4, lr} - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - mov r4, r0 - add r1, r1, #0x10 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x14 - add r1, r1, #0x14 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x14 - add r1, r1, #0x18 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x80 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0xe - add r1, r1, #0x2c - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0xe - ldr r1, [r1] - add r1, r1, #0x30 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #9 - ldr r1, [r1] - add r1, r1, #0x34 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x28 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x24 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x1c - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x38 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x3c - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x40 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x4a0 - ldr r1, [r1] - add r1, r1, #0x44 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x4a0 - ldr r1, [r1] - add r1, r1, #0xd8 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x220 - add r1, r1, #0x16c - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x580 - add r1, r1, #0x1b0 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x20 - add r1, r1, #0x260 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0xa0 - add r1, r1, #0x264 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - add r1, r1, #0x278 - bl Copy16BitsFrom - ldmia sp!, {r4, pc} - .align 2, 0 -_02050918: .word ADVENTURE_LOG_PTR - arm_func_end CopyLogFrom - - arm_func_start GetAbilityString -GetAbilityString: ; 0x0205091C -#if defined(EUROPE) - add r1, r1, #0x5e0 - add r1, r1, #0x3000 -#elif defined(JAPAN) - add r1, r1, #0x81 - add r1, r1, #0x4800 -#else - add r1, r1, #0xde - add r1, r1, #0x3500 -#endif - mov r1, r1, lsl #0x10 - ldr ip, _02050938 ; =CopyNStringFromId - mov r1, r1, lsr #0x10 - mov r2, #0x50 - bx ip - .align 2, 0 -_02050938: .word CopyNStringFromId - arm_func_end GetAbilityString - - arm_func_start GetAbilityDescStringId -GetAbilityDescStringId: ; 0x0205093C -#if defined(EUROPE) - add r0, r0, #0x25c - add r0, r0, #0x3400 -#elif defined(JAPAN) - add r0, r0, #0xfd - add r0, r0, #0x4800 -#else - add r0, r0, #0x5a - add r0, r0, #0x3600 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bx lr - arm_func_end GetAbilityDescStringId - - arm_func_start GetTypeStringId -GetTypeStringId: ; 0x02050950 -#if defined(EUROPE) - add r0, r0, #0xcd - add r0, r0, #0x3500 -#elif defined(JAPAN) - add r0, r0, #0x6e - add r0, r0, #0x4800 -#else - add r0, r0, #0xcb - add r0, r0, #0x3500 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bx lr - arm_func_end GetTypeStringId - - arm_func_start GetConversion2ConvertToType -GetConversion2ConvertToType: ; 0x02050964 - ldr r1, _02050970 ; =CONVERSION2_TYPE_TABLE - ldrb r0, [r1, r0] - bx lr - .align 2, 0 -_02050970: .word CONVERSION2_TYPE_TABLE - arm_func_end GetConversion2ConvertToType - - arm_func_start InitBitstreamForWrite -InitBitstreamForWrite: ; 0x02050974 - str r1, [r0] - mov r3, #0 - str r3, [r0, #8] - str r3, [r0, #0xc] - add r1, r1, r2 - str r1, [r0, #4] - bx lr - arm_func_end InitBitstreamForWrite - - arm_func_start InitBitstreamForRead -InitBitstreamForRead: ; 0x02050990 - str r1, [r0] - mov r3, #0 - str r3, [r0, #8] - str r3, [r0, #0xc] - add r3, r1, r2 - str r3, [r0, #4] - mov r0, r1 - ldr ip, _020509B8 ; =MemZero - mov r1, r2 - bx ip - .align 2, 0 -_020509B8: .word MemZero - arm_func_end InitBitstreamForRead - - arm_func_start BitstreamDebug -BitstreamDebug: ; 0x020509BC - bx lr - arm_func_end BitstreamDebug - - arm_func_start CopyBitsTo -CopyBitsTo: ; 0x020509C0 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov ip, #0 - mov r3, #1 - mov r5, ip - mov r4, ip - b _02050A34 -_020509D8: - ldrb r6, [r1] - sub r2, r2, #1 - tst r6, r3, lsl ip - ldrne r7, [r0] - ldrne lr, [r0, #8] - ldrneb r6, [r7] - add ip, ip, #1 - orrne r6, r6, r3, lsl lr - strneb r6, [r7] - ldr lr, [r0, #8] - cmp ip, #8 - add lr, lr, #1 - moveq ip, r5 - addeq r1, r1, #1 - str lr, [r0, #8] - cmp lr, #8 - ldreq lr, [r0] - addeq lr, lr, #1 - streq lr, [r0] - streq r4, [r0, #8] - ldr lr, [r0, #0xc] - add lr, lr, #1 - str lr, [r0, #0xc] -_02050A34: - cmp r2, #0 - bne _020509D8 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end CopyBitsTo - - arm_func_start CopyBitsFrom -CopyBitsFrom: ; 0x02050A40 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov lr, #0 - mov ip, lr - mov r3, #1 - mov r6, lr - mov r5, lr - b _02050AC0 -_02050A5C: - cmp lr, #0 - streqb ip, [r1] - ldr r7, [r0] - ldr r4, [r0, #8] - ldrb r7, [r7] - sub r2, r2, #1 - tst r7, r3, lsl r4 - ldrneb r4, [r1] - orrne r4, r4, r3, lsl lr - strneb r4, [r1] - ldr r4, [r0, #8] - add lr, lr, #1 - cmp lr, #8 - add r4, r4, #1 - moveq lr, r6 - addeq r1, r1, #1 - str r4, [r0, #8] - cmp r4, #8 - ldreq r4, [r0] - addeq r4, r4, #1 - streq r4, [r0] - streq r5, [r0, #8] - ldr r4, [r0, #0xc] - add r4, r4, #1 - str r4, [r0, #0xc] -_02050AC0: - cmp r2, #0 - bne _02050A5C - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end CopyBitsFrom - - arm_func_start StoreDefaultTeamData -StoreDefaultTeamData: ; 0x02050ACC - stmdb sp!, {lr} - sub sp, sp, #0x14 -#ifdef JAPAN - ldr r1, _02050E54 ; =0x000004C5 - add r0, sp, #0 -#else - add r0, sp, #0 - mov r1, #0x234 -#endif - bl GetStringFromFileVeneer - ldr r0, _02050B08 ; =TEAM_NAME - add r1, sp, #0 -#ifdef JAPAN - mov r2, #5 -#else - mov r2, #0xa -#endif - bl StrncpyName - ldr r0, _02050B0C ; =TEAM_NAME - mov r1, #0 -#ifdef JAPAN - str r1, [r0, #8] - strb r1, [r0, #0xc] -#else - str r1, [r0, #0xc] - strb r1, [r0, #0x10] -#endif - add sp, sp, #0x14 - ldmia sp!, {pc} - .align 2, 0 -#ifdef JAPAN -_02050E54: .word 0x000004C5 -#endif -_02050B08: .word TEAM_NAME -_02050B0C: .word TEAM_NAME - arm_func_end StoreDefaultTeamData - - arm_func_start GetMainTeamNameWithCheck -GetMainTeamNameWithCheck: ; 0x02050B10 - stmdb sp!, {r4, lr} - sub sp, sp, #0x40 - mov r4, r0 - mov r0, #1 - bl GetResolvedPerformanceProgressFlag - cmp r0, #0 - ldrne r0, _02050B70 ; =TEAM_NAME - ldrneb r0, [r0] - cmpne r0, #0 - beq _02050B4C - ldr r1, _02050B74 ; =TEAM_NAME - mov r0, r4 -#ifdef JAPAN - mov r2, #5 -#else - mov r2, #0xa -#endif - bl StrncpySimpleNoPad - b _02050B68 -_02050B4C: - ldr r1, _02050B78 ; =0x00000237 - add r0, sp, #0 - bl GetStringFromFileVeneer - add r1, sp, #0 - mov r0, r4 -#ifdef JAPAN - mov r2, #5 -#else - mov r2, #0xa -#endif - bl StrncpyName -_02050B68: - add sp, sp, #0x40 - ldmia sp!, {r4, pc} - .align 2, 0 -_02050B70: .word TEAM_NAME -_02050B74: .word TEAM_NAME -#ifdef JAPAN -_02050B78: .word 0x000004C8 -#else -_02050B78: .word 0x00000237 -#endif - arm_func_end GetMainTeamNameWithCheck - - arm_func_start GetMainTeamName -GetMainTeamName: ; 0x02050B7C - ldr ip, _02050B8C ; =StrncpySimpleNoPadSafe - ldr r1, _02050B90 ; =TEAM_NAME -#ifdef JAPAN - mov r2, #5 -#else - mov r2, #0xa -#endif - bx ip - .align 2, 0 -_02050B8C: .word StrncpySimpleNoPadSafe -_02050B90: .word TEAM_NAME - arm_func_end GetMainTeamName - - arm_func_start SetMainTeamName -SetMainTeamName: ; 0x02050B94 - ldr r1, _02050BB4 ; =TEAM_NAME - mov r3, #0 -_02050B9C: - ldrb r2, [r0], #1 - strb r2, [r1, r3] - add r3, r3, #1 -#ifdef JAPAN - cmp r3, #5 -#else - cmp r3, #0xa -#endif - blt _02050B9C - bx lr - .align 2, 0 -_02050BB4: .word TEAM_NAME - arm_func_end SetMainTeamName - - arm_func_start GetRankupPoints -GetRankupPoints: ; 0x02050BB8 - stmdb sp!, {r4, lr} - bl GetRank - mov r4, r0 - mov r0, #0x16 - bl GetResolvedPerformanceProgressFlag - cmp r0, #0 - beq _02050BE4 - cmp r4, #0xc - bne _02050BF0 - mov r0, #0 - ldmia sp!, {r4, pc} -_02050BE4: - cmp r4, #8 - movhs r0, #0 - ldmhsia sp!, {r4, pc} -_02050BF0: - mov r0, r4 - bl GetRankUpEntry - ldr r1, _02050C0C ; =TEAM_NAME - ldr r2, [r0, #4] -#ifdef JAPAN - ldr r0, [r1, #8] -#else - ldr r0, [r1, #0xc] -#endif - sub r0, r2, r0 - ldmia sp!, {r4, pc} - .align 2, 0 -_02050C0C: .word TEAM_NAME - arm_func_end GetRankupPoints - - arm_func_start sub_02050C10 -sub_02050C10: ; 0x02050C10 -#ifdef JAPAN -#define SUB_02050C10_OFFSET #8 -#else -#define SUB_02050C10_OFFSET #0xc -#endif - stmdb sp!, {r3, lr} - ldr r1, _02050C6C ; =TEAM_NAME - ldr r2, [r1, SUB_02050C10_OFFSET] - add r2, r2, r0 - mov r0, #0x16 - str r2, [r1, SUB_02050C10_OFFSET] - bl GetResolvedPerformanceProgressFlag - cmp r0, #0 - beq _02050C4C - ldr r0, _02050C6C ; =TEAM_NAME - ldr r1, _02050C70 ; =0x05F5E0FF - ldr r2, [r0, SUB_02050C10_OFFSET] - cmp r2, r1 - strgt r1, [r0, SUB_02050C10_OFFSET] - ldmia sp!, {r3, pc} -_02050C4C: - mov r0, #7 - bl GetRankUpEntry - ldr r1, _02050C6C ; =TEAM_NAME - ldr r2, [r0, #4] - ldr r0, [r1, SUB_02050C10_OFFSET] - cmp r0, r2 - strgt r2, [r1, SUB_02050C10_OFFSET] - ldmia sp!, {r3, pc} - .align 2, 0 -_02050C6C: .word TEAM_NAME -_02050C70: .word 0x05F5E0FF - arm_func_end sub_02050C10 - - arm_func_start GetRank -GetRank: ; 0x02050C74 - stmdb sp!, {r3, r4, r5, lr} - mov r5, #0 - ldr r4, _02050CCC ; =TEAM_NAME - b _02050CA4 -_02050C84: - mov r0, r5 - bl GetRankUpEntry -#ifdef JAPAN - ldr r1, [r4, #8] -#else - ldr r1, [r4, #0xc] -#endif - ldr r0, [r0, #4] - cmp r1, r0 - blt _02050CAC - add r0, r5, #1 - and r5, r0, #0xff -_02050CA4: - cmp r5, #0xc - blo _02050C84 -_02050CAC: - mov r0, #0x16 - bl GetResolvedPerformanceProgressFlag - cmp r0, #0 - bne _02050CC4 - cmp r5, #8 - movhi r5, #8 -_02050CC4: - mov r0, r5 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02050CCC: .word TEAM_NAME - arm_func_end GetRank - - arm_func_start sub_02050CD0 -sub_02050CD0: ; 0x02050CD0 - stmdb sp!, {r3, lr} - bl GetRank - cmp r0, #8 - movhi r0, #8 - ldmia sp!, {r3, pc} - arm_func_end sub_02050CD0 - - arm_func_start GetRankStorageSize -GetRankStorageSize: ; 0x02050CE4 - stmdb sp!, {r3, lr} - bl GetRank - bl GetRankUpEntry - ldr r0, [r0, #8] - ldmia sp!, {r3, pc} - arm_func_end GetRankStorageSize - - arm_func_start sub_02050CF8 -sub_02050CF8: ; 0x02050CF8 - stmdb sp!, {r3, lr} - sub sp, sp, #0x10 - mov r3, r0 - mov r2, r1 - add r0, sp, #0 - mov r1, r3 - bl InitBitstreamForRead - ldr r1, _02050D70 ; =TEAM_NAME - add r0, sp, #0 -#ifdef JAPAN - mov r2, #0x28 -#else - mov r2, #0x50 -#endif - bl CopyBitsTo - ldr r1, _02050D74 ; =_022AB924 - add r0, sp, #0 - mov r2, #0x20 - bl CopyBitsTo - mov r0, #1 - bl GetResolvedPerformanceProgressFlag - ldr r1, _02050D78 ; =TEAM_NAME - tst r0, #0xff -#ifdef JAPAN - strb r0, [r1, #0xc] -#else - strb r0, [r1, #0x10] -#endif - ldrne r1, _02050D7C ; =ARM9_UNKNOWN_DATA__NA_209E6BC - add r0, sp, #0 - ldreq r1, _02050D80 ; =_0209E6BD - mov r2, #1 - bl CopyBitsTo - add r0, sp, #0 - bl BitstreamDebug - ldr r0, [sp, #8] - add sp, sp, #0x10 - ldmia sp!, {r3, pc} - .align 2, 0 -_02050D70: .word TEAM_NAME -_02050D74: .word _022AB924 -_02050D78: .word TEAM_NAME -_02050D7C: .word ARM9_UNKNOWN_DATA__NA_209E6BC -_02050D80: .word _0209E6BD - arm_func_end sub_02050CF8 - - arm_func_start sub_02050D84 -sub_02050D84: ; 0x02050D84 - stmdb sp!, {lr} - sub sp, sp, #0x14 - mov r3, r0 - mov r2, r1 - add r0, sp, #4 - mov r1, r3 - bl InitBitstreamForWrite - ldr r1, _02050DFC ; =TEAM_NAME - add r0, sp, #4 -#ifdef JAPAN - mov r2, #0x28 -#else - mov r2, #0x50 -#endif - bl CopyBitsFrom - ldr r1, _02050E00 ; =_022AB924 - add r0, sp, #4 - mov r2, #0x20 - bl CopyBitsFrom - add r0, sp, #4 - add r1, sp, #0 - mov r2, #1 - bl CopyBitsFrom - ldrb r0, [sp] - ldr r1, _02050E04 ; =TEAM_NAME - tst r0, #1 - movne r2, #1 - moveq r2, #0 - add r0, sp, #4 -#ifdef JAPAN - strb r2, [r1, #0xc] -#else - strb r2, [r1, #0x10] -#endif - bl BitstreamDebug - ldr r0, [sp, #0xc] - add sp, sp, #0x14 - ldmia sp!, {pc} - .align 2, 0 -_02050DFC: .word TEAM_NAME -_02050E00: .word _022AB924 -_02050E04: .word TEAM_NAME - arm_func_end sub_02050D84 - - arm_func_start ResetPlayTimer -ResetPlayTimer: ; 0x02050E08 - mov r1, #0 - strb r1, [r0, #4] - str r1, [r0] - bx lr - arm_func_end ResetPlayTimer - - arm_func_start PlayTimerTick -PlayTimerTick: ; 0x02050E18 - ldrb r1, [r0, #4] - add r2, r1, #1 - and r1, r2, #0xff - strb r2, [r0, #4] - cmp r1, #0x3c - bxlo lr - mov r1, #0 - strb r1, [r0, #4] - ldr r2, [r0] - ldr r1, _02050E50 ; =0x022550FF - cmp r2, r1 - addlo r1, r2, #1 - strlo r1, [r0] - bx lr - .align 2, 0 -_02050E50: .word 0x022550FF - arm_func_end PlayTimerTick - - arm_func_start GetPlayTimeSeconds -GetPlayTimeSeconds: ; 0x02050E54 - ldr r0, [r0] - bx lr - arm_func_end GetPlayTimeSeconds - - arm_func_start sub_02050E5C -sub_02050E5C: ; 0x02050E5C - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - mov r0, r4 - add r1, r5, #4 - mov r2, #6 - bl CopyBitsTo - mov r0, r4 - mov r1, r5 - mov r2, #0x20 - bl CopyBitsTo - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_02050E5C - - arm_func_start sub_02050E8C -sub_02050E8C: ; 0x02050E8C - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - mov r0, r4 - add r1, r5, #4 - mov r2, #6 - bl CopyBitsFrom - mov r0, r4 - mov r1, r5 - mov r2, #0x20 - bl CopyBitsFrom - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_02050E8C diff --git a/asm/main_02052060.s b/asm/main_02052060.s deleted file mode 100644 index c1d08090..00000000 --- a/asm/main_02052060.s +++ /dev/null @@ -1,556 +0,0 @@ - .include "asm/macros.inc" - .include "main_02052060.inc" - - .text - - arm_func_start sub_02052060 -sub_02052060: ; 0x02052060 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x2c - ldr r4, _020522E4 ; =_020B09B0 - mov sl, r1 - ldr r7, [sp, #0x54] - ldr r4, [r4] - mov r1, #0x30 - mla r4, r7, r1, r4 - ldr fp, [sp, #0x50] - mov r1, #0x18 - mla r4, fp, r1, r4 - mov sb, r2 - add r1, sp, #0x28 - mov r2, #0xf - mov r8, r3 - ldr r5, [r4, #0x10] - bl sub_02051FF0 - mov r3, r0 - ldr r4, [sp, #0x28] - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - ldr r0, _020522E4 ; =_020B09B0 - ldr r2, [r4, #8] - ldr r0, [r0] - add r1, r5, sl - add r2, r4, r2 - add r0, r0, #0x60 - bl sub_02051804 - mov r0, #1 - str r0, [sp] - mov r1, #0 - ldr r0, _020522E4 ; =_020B09B0 - str r1, [sp, #4] - ldr r0, [r0] - mov r2, r4 - mov r3, r1 - add r0, r0, #0x60 - bl sub_02051804 - ldr r1, [sp, #0x28] - rsb r0, sb, #0x20 - mov r0, r0, lsl #0x10 - ldr r1, [r1, #0x10] - str r0, [sp, #0x18] - add r0, r4, r1 - str r0, [sp, #0xc] - mov r5, #0 - b _020521CC -_02052120: - mov r6, #0 - mov r0, r6 - str r0, [sp, #8] - ldr r0, [sp, #0xc] - mov r1, sb, lsl #0x10 - add r0, r0, sb, lsl #6 - str r0, [sp, #0x10] - mov r0, r1, asr #0x10 - str r0, [sp, #0x14] -_02052144: - ldr r0, [sp, #0x10] - mov r1, r6, lsl #1 - ldrh r1, [r1, r0] - ldr r2, _020522E8 ; =0x00000FFF - mov r0, r6, lsl #0x10 - and r2, r1, r2 - mov r2, r2, lsl #0x10 - mov r1, r1, lsl #4 - mov r2, r2, lsr #0x10 - add r1, r8, r1, lsr #16 - add r2, r2, sl, lsr #5 - mov r1, r1, lsl #0x1c - mov r2, r2, lsl #0x10 - mov r1, r1, lsr #0x10 - orr r1, r1, r2, lsr #16 - mov r1, r1, lsl #0x10 - mov r2, r1, lsr #0x10 - ldr r1, [sp, #0x14] - mov r0, r0, asr #0x10 - str r7, [sp] - mov r3, fp - bl sub_02051D8C - ldr r0, [sp, #8] - add r6, r6, #1 - add r0, r0, #1 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - str r0, [sp, #8] - cmp r0, #0x20 - blo _02052144 - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, lsr #0x10 - add sb, sb, #1 -_020521CC: - ldr r0, [sp, #0x18] - cmp r5, r0, lsr #16 - blo _02052120 - mov r0, fp - mov r1, r7 - bl sub_02051E60 - ldr r0, [sp, #0x28] - ldr r3, _020522EC ; =ARM9_UNKNOWN_PTR__NA_20A2C84 - ldr r0, [r0] - add r2, sp, #0x1c - add r5, r4, r0 - mov r4, #0 - mov r1, #4 -_02052200: - ldrb r0, [r3], #1 - subs r1, r1, #1 - strb r0, [r2], #1 - bne _02052200 - mov r0, #0x28 - mul r6, r7, r0 - b _020522B0 -_0205221C: - add r3, sp, #0x1c - add r2, sp, #0x20 - mov r1, #4 -_02052228: - ldrb r0, [r3], #1 - subs r1, r1, #1 - strb r0, [r2], #1 - bne _02052228 - ldrb r0, [r5] - add r3, sp, #0x20 - add r2, sp, #0x24 - strb r0, [sp, #0x20] - ldrb r0, [r5, #1] - mov r1, #4 - strb r0, [sp, #0x21] - ldrb r0, [r5, #2] - strb r0, [sp, #0x22] - ldrb r0, [r5, #3] - strb r0, [sp, #0x23] -_02052264: - ldrb r0, [r3], #1 - subs r1, r1, #1 - strb r0, [r2], #1 - bne _02052264 - add r0, r4, r8, lsl #4 - cmp r0, #0x100 - bge _020522C8 - ldr r1, _020522E4 ; =_020B09B0 - mov r0, r0, lsl #0x10 - ldr r1, [r1] - mov r0, r0, asr #0x10 - add r3, r1, #0x1cc - mov r1, r0, lsl #0x10 - add r2, sp, #0x24 - add r0, r3, r6 - mov r1, r1, lsr #0x10 - bl CopyColorToPaletteDataRgba - add r4, r4, #1 - add r5, r5, #4 -_020522B0: - ldr r0, [sp, #0x28] - ldr r1, [r0, #4] - mov r0, r1, asr #1 - add r0, r1, r0, lsr #30 - cmp r4, r0, asr #2 - blt _0205221C -_020522C8: - ldr r0, _020522E4 ; =_020B09B0 - ldr r0, [r0] - add r0, r0, #0x1cc - add r0, r0, r6 - bl MarkPaletteDataAsNeedingUpdate - add sp, sp, #0x2c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_020522E4: .word _020B09B0 -_020522E8: .word 0x00000FFF -_020522EC: .word ARM9_UNKNOWN_PTR__NA_20A2C84 - arm_func_end sub_02052060 - - arm_func_start sub_020522F0 -sub_020522F0: ; 0x020522F0 - stmdb sp!, {r4, lr} - mov r4, r1 - bl sub_02051FF0 - str r0, [r4, #8] - ldr r1, [r4] - ldr r0, [r1, #8] - add r0, r1, r0 - str r0, [r4, #4] - ldr r0, [r4] - ldr r0, [r0, #0x10] - add r0, r1, r0 - str r0, [r4, #0xc] - ldr r0, [r4] - ldr r0, [r0] - add r0, r1, r0 - str r0, [r4, #0x10] - ldmia sp!, {r4, pc} - arm_func_end sub_020522F0 - - arm_func_start sub_02052334 -sub_02052334: ; 0x02052334 - stmdb sp!, {r4, lr} - mov r4, r0 - ldr r0, [r4] - cmp r0, #0 - ldmeqia sp!, {r4, pc} - bl MemFree - mov r0, #0 - str r0, [r4] - ldmia sp!, {r4, pc} - arm_func_end sub_02052334 - - arm_func_start LoadMonsterMd -LoadMonsterMd: ; 0x02052358 - stmdb sp!, {r3, lr} - ldr r0, _02052388 ; =_020B09C0 - ldr r1, _0205238C ; =_020A31B8 - mov r2, #0 - bl LoadFileFromRom - bl LoadM2nAndN2m - ldr r0, _02052390 ; =MONSTER_DATA_TABLE_PTR - ldr r1, [r0, #0xc] -#ifdef EUROPE - str r1, [r0, #8] -#else - str r1, [r0, #4] -#endif - add r1, r1, #8 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_02052388: .word _020B09C0 -_0205238C: .word _020A31B8 -_02052390: .word MONSTER_DATA_TABLE_PTR - arm_func_end LoadMonsterMd - - arm_func_start GetNameRaw -GetNameRaw: ; 0x02052394 - stmdb sp!, {r4, lr} - mov r4, r0 - mov r0, r1 - mov r1, #0x258 - bl _s32_div_f -#if defined(EUROPE) - add r0, r1, #0x21 - add r0, r0, #0x2200 -#elif defined(JAPAN) - add r0, r1, #0x590 - add r0, r0, #0x1000 -#else - add r0, r1, #0x1f - add r0, r0, #0x2200 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bl StringFromId - mov r1, r0 - mov r0, r4 - mov r2, #0x14 - bl strncpy - ldmia sp!, {r4, pc} - arm_func_end GetNameRaw - - arm_func_start GetName -GetName: ; 0x020523D0 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r0, r1 - mov r1, #0x258 - mov r4, r2 - bl _s32_div_f -#if defined(EUROPE) - add r0, r1, #0x21 - add r0, r0, #0x2200 -#elif defined(JAPAN) - add r0, r1, #0x590 - add r0, r0, #0x1000 -#else - add r0, r1, #0x1f - add r0, r0, #0x2200 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bl StringFromId - mov r3, r0 - mov r0, r5 - mov r2, r4 - ldr r1, _02052414 ; =_020A31D4 - bl SprintfStatic__02052418 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02052414: .word _020A31D4 - arm_func_end GetName - - arm_func_start SprintfStatic__02052418 -SprintfStatic__02052418: ; 0x02052418 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3, lr} - add r2, sp, #0xc - bic r2, r2, #3 - ldr r1, [sp, #0xc] - add r2, r2, #4 - bl vsprintf - ldmia sp!, {r3, lr} - add sp, sp, #0x10 - bx lr - arm_func_end SprintfStatic__02052418 - - arm_func_start GetNameWithGender -GetNameWithGender: ; 0x02052440 -#ifdef JAPAN - stmdb sp!, {r4, r5, r6, lr} -#else - stmdb sp!, {r3, r4, r5, r6, lr} - sub sp, sp, #4 -#endif - mov r5, r1 - mov r6, r0 - mov r0, r5 - mov r1, #0x258 - mov r4, r2 - bl _s32_div_f -#if defined(EUROPE) - add r0, r1, #0x21 - add r0, r0, #0x2200 -#elif defined(JAPAN) - add r0, r1, #0x590 - add r0, r0, #0x1000 -#else - add r0, r1, #0x1f - add r0, r0, #0x2200 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bl StringFromId - ldr r2, _020524F4 ; =MONSTER_DATA_TABLE_PTR - mov r1, #0x44 - ldr r2, [r2] - mov r3, r0 - smlabb r0, r5, r1, r2 - ldrb r0, [r0, #0x12] - cmp r0, #3 - cmpne r5, #0x1d - cmpne r5, #0x20 - bne _020524B0 - ldr r1, _020524F8 ; =_020A31D4 - mov r0, r6 - mov r2, r4 - bl SprintfStatic__02052418 -#ifdef JAPAN - ldmia sp!, {r4, r5, r6, pc} -#else - b _020524EC -#endif -_020524B0: - cmp r0, #2 - bne _020524D4 - ldr r1, _020524FC ; =_020A31E4 -#ifdef JAPAN - mov r0, r6 - mov r2, r4 - bl SprintfStatic__02052418 - ldmia sp!, {r4, r5, r6, pc} -_020524D4: - ldr r1, _02052838_JP ; =_020A45C8_JP - mov r0, r6 - mov r2, r4 - bl SprintfStatic__02052418 - ldmia sp!, {r4, r5, r6, pc} -#else - mov r5, #0xbe - mov r0, r6 - mov r2, r4 - str r5, [sp] - bl SprintfStatic__02052418 - b _020524EC -_020524D4: - ldr r1, _020524FC ; =_020A31E4 - mov r5, #0xbd - mov r0, r6 - mov r2, r4 - str r5, [sp] - bl SprintfStatic__02052418 -_020524EC: - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, pc} -#endif - .align 2, 0 -_020524F4: .word MONSTER_DATA_TABLE_PTR -_020524F8: .word _020A31D4 -_020524FC: .word _020A31E4 -#ifdef JAPAN -_02052838_JP: .word _020A45C8_JP -#endif - arm_func_end GetNameWithGender - - arm_func_start GetSpeciesString -GetSpeciesString: ; 0x02052500 - stmdb sp!, {r3, r4, r5, lr} - mov r4, r1 - mov r5, r0 - mov r0, r4 - bl GetBaseForm - cmp r0, #0xc9 - bne _02052684 - cmp r4, #0xca - moveq r4, #1 - beq _02052660 - cmp r4, #0xcb - moveq r4, #2 - beq _02052660 - cmp r4, #0xcc - moveq r4, #3 - beq _02052660 - cmp r4, #0xcd - moveq r4, #4 - beq _02052660 - cmp r4, #0xce - moveq r4, #5 - beq _02052660 - cmp r4, #0xcf - moveq r4, #6 - beq _02052660 - cmp r4, #0xd0 - moveq r4, #7 - beq _02052660 - cmp r4, #0xd1 - moveq r4, #8 - beq _02052660 - cmp r4, #0xd2 - moveq r4, #9 - beq _02052660 - cmp r4, #0xd3 - moveq r4, #0xa - beq _02052660 - cmp r4, #0xd4 - moveq r4, #0xb - beq _02052660 - cmp r4, #0xd5 - moveq r4, #0xc - beq _02052660 - cmp r4, #0xd6 - moveq r4, #0xd - beq _02052660 - cmp r4, #0xd7 - moveq r4, #0xe - beq _02052660 - cmp r4, #0xd8 - moveq r4, #0xf - beq _02052660 - cmp r4, #0xd9 - moveq r4, #0x10 - beq _02052660 - cmp r4, #0xda - moveq r4, #0x11 - beq _02052660 - cmp r4, #0xdb - moveq r4, #0x12 - beq _02052660 - cmp r4, #0xdc - moveq r4, #0x13 - beq _02052660 - cmp r4, #0xdd - moveq r4, #0x14 - beq _02052660 - cmp r4, #0xde - moveq r4, #0x15 - beq _02052660 - cmp r4, #0xdf - moveq r4, #0x16 - beq _02052660 - cmp r4, #0xe0 - moveq r4, #0x17 - beq _02052660 - cmp r4, #0xe1 - moveq r4, #0x18 - beq _02052660 - cmp r4, #0xe2 - moveq r4, #0x19 - beq _02052660 - cmp r4, #0xe3 - moveq r4, #0x1a - beq _02052660 - cmp r4, #0xe4 - moveq r4, #0x1b - movne r4, #0 -_02052660: - ldr r0, _020526B8 ; =0x000022E8 - bl StringFromId - ldr r1, _020526BC ; =UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE - mov r2, r0 - ldr r3, [r1, r4, lsl #2] - ldr r1, _020526C0 ; =_020A31F4 - mov r0, r5 - bl SprintfStatic__02052418 - ldmia sp!, {r3, r4, r5, pc} -_02052684: - mov r0, r4 - mov r1, #0x258 - bl _s32_div_f -#if defined(EUROPE) - add r0, r1, #0x21 - add r0, r0, #0x2200 -#elif defined(JAPAN) - add r0, r1, #0x590 - add r0, r0, #0x1000 -#else - add r0, r1, #0x1f - add r0, r0, #0x2200 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bl StringFromId - mov r2, r0 - ldr r1, _020526C4 ; =_020A31FC - mov r0, r5 - bl SprintfStatic__02052418 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#if defined(EUROPE) -_020526B8: .word 0x000022EA -#elif defined(JAPAN) -_020526B8: .word 0x00001659 -#else -_020526B8: .word 0x000022E8 -#endif -_020526BC: .word UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE -_020526C0: .word _020A31F4 -_020526C4: .word _020A31FC - arm_func_end GetSpeciesString - - arm_func_start GetNameString -GetNameString: ; 0x020526C8 - stmdb sp!, {r3, lr} - mov r1, #0x258 - bl _s32_div_f -#if defined(EUROPE) - add r0, r1, #0x21 - add r0, r0, #0x2200 -#elif defined(JAPAN) - add r0, r1, #0x590 - add r0, r0, #0x1000 -#else - add r0, r1, #0x1f - add r0, r0, #0x2200 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bl StringFromId - ldmia sp!, {r3, pc} - arm_func_end GetNameString diff --git a/asm/main_020559D8.s b/asm/main_020559D8.s deleted file mode 100644 index b6e5250b..00000000 --- a/asm/main_020559D8.s +++ /dev/null @@ -1,102 +0,0 @@ - .include "asm/macros.inc" - .include "main_020559D8.inc" - - .text - - arm_func_start sub_020559D8 -sub_020559D8: ; 0x020559D8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - ldr r1, _02055B18 ; =TEAM_MEMBER_TABLE_PTR - mov r4, #0 - ldr lr, [r1] - mov r8, r0 - mov r2, r4 - mov r3, #1 - mvn r1, #0 -_020559F8: - ldrb r0, [lr] - add lr, lr, #0x44 - tst r0, #1 - movne r0, r3 - moveq r0, r2 - tst r0, #0xff - mov r0, r4, lsl #1 - strneh r4, [r8, r0] - add r4, r4, #1 - streqh r1, [r8, r0] - cmp r4, #5 - blt _020559F8 - mov r2, #0 - mov r3, #1 - ldr r0, _02055B1C ; =0x0000022B - b _02055B0C -_02055A38: - ldrb r1, [lr] - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - bne _02055AFC - mvn ip, #0 - mov r0, r4, lsl #1 - mov r7, lr - mov r6, r4 - strh ip, [r8, r0] - add lr, lr, #0x44 - add r4, r4, #1 - add sb, ip, #0x22c - b _02055AD4 -_02055A74: - ldrb r0, [lr] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _02055AC4 - mov r5, r7 - mov fp, lr - add r7, r7, #0x44 - mov sl, #4 -_02055A9C: - ldmia fp!, {r0, r1, r2, r3} - stmia r5!, {r0, r1, r2, r3} - subs sl, sl, #1 - bne _02055A9C - ldr r0, [fp] - str r0, [r5] - mov r0, r4, lsl #1 - strh r6, [r8, r0] - add r6, r6, #1 - b _02055ACC -_02055AC4: - mov r0, r4, lsl #1 - strh ip, [r8, r0] -_02055ACC: - add r4, r4, #1 - add lr, lr, #0x44 -_02055AD4: - cmp r4, sb - blt _02055A74 - mov r1, #0 - ldr r0, _02055B1C ; =0x0000022B - b _02055AF0 -_02055AE8: - strb r1, [r7], #0x44 - add r6, r6, #1 -_02055AF0: - cmp r6, r0 - blt _02055AE8 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_02055AFC: - mov r1, r4, lsl #1 - strh r4, [r8, r1] - add r4, r4, #1 - add lr, lr, #0x44 -_02055B0C: - cmp r4, r0 - blt _02055A38 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02055B18: .word TEAM_MEMBER_TABLE_PTR -_02055B1C: .word 0x0000022B - arm_func_end sub_020559D8 diff --git a/asm/main_bss_022AB0AC.s b/asm/main_bss_022AB0AC.s index 91914a2e..e1878337 100644 --- a/asm/main_bss_022AB0AC.s +++ b/asm/main_bss_022AB0AC.s @@ -34,6 +34,8 @@ _022AB69C: .space 0x27C .global TEAM_NAME TEAM_NAME: + .global _022AB918 +_022AB918: #ifdef JAPAN .space 0x8 #else diff --git a/asm/overlay_29_022E34A8.s b/asm/overlay_29_022E2B68.s similarity index 95% rename from asm/overlay_29_022E34A8.s rename to asm/overlay_29_022E2B68.s index c1468a67..785eadd6 100644 --- a/asm/overlay_29_022E34A8.s +++ b/asm/overlay_29_022E2B68.s @@ -1,34 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_022E34A8.inc" + .include "overlay_29_022E2B68.inc" .text -#ifdef EUROPE - arm_func_start ov29_022E34A8_EU -ov29_022E34A8_EU: ; 0x022E34A8 - stmdb sp!, {r3, lr} - bl EntityIsValid__022E1A1C - cmp r0, #0 - beq _022E34DC - ldr r0, _022E34E8 ; =0x02354138 - ldr r0, [r0] - ldrb r0, [r0, #8] - cmp r0, #0 - bne _022E34DC - bl GetForcedLossReason - cmp r0, #1 - movne r0, #1 - bne _022E34E0 -_022E34DC: - mov r0, #0 -_022E34E0: - and r0, r0, #0xff - ldmia sp!, {r3, pc} - .align 2, 0 -_022E34E8: .word 0x02354138 - arm_func_end ov29_022E34A8_EU -#endif - arm_func_start ov29_022E2B68 ov29_022E2B68: ; 0x022E2B68 #ifdef JAPAN diff --git a/asm/overlay_29_02320788.s b/asm/overlay_29_02320788.s deleted file mode 100644 index 45de46e4..00000000 --- a/asm/overlay_29_02320788.s +++ /dev/null @@ -1,830 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02320788.inc" - - .text - - arm_func_start TryAftermathExplosion -TryAftermathExplosion: ; 0x02320788 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x10 - mov sl, r0 - ldr r0, [sp, #0x38] - mov sb, r1 - str r0, [sp, #0x38] - str r2, [sp, #4] - mov r8, r3 - ldr fp, [sp, #0x3c] - mov r5, #0 - mov r7, #0x15 - ldr r4, _02320A8C ; =DUNGEON_PTR - b _023207F4 -_023207BC: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r6, [r0, #0xad4] -#else - ldr r6, [r0, #0xb78] -#endif - mov r0, r6 - bl EntityIsValid__02320764 - cmp r0, #0 - beq _023207F0 - mov r0, r6 - mov r1, r7 - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _023207FC -_023207F0: - add r5, r5, #1 -_023207F4: - cmp r5, #0x14 - blt _023207BC -_023207FC: - cmp r5, #0x14 - beq _02320834 - mov r0, sl - mov r1, sb - bl ov29_022E55F0 - mov r0, #0 - mov r1, sb - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _02320A90 ; =0x00000BFC - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - b _02320A84 -_02320834: - mov r0, sb - bl GetApparentWeather - cmp r0, #4 - bne _02320858 - ldr r2, _02320A90 ; =0x00000BFC - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - b _02320A84 -_02320858: - mov r0, sl - mov r1, sb - mov r2, r8 - bl ov29_022E5560 - mov r0, #0 - mov r1, sb - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _02320A94 ; =0x00000BFB - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - ldr r0, _02320A98 ; =ov29_023529B8 - mov r6, #0 - ldr r4, [r0, r8, lsl #2] - mov r7, r6 - b _023209EC -_0232089C: - ldr r0, [sp, #4] - ldrsh r0, [r0] - add r0, r1, r0 - strh r0, [sp, #0xc] - ldr r0, [sp, #4] - ldrsh r2, [r4, #2] - ldrsh r1, [r0, #2] - ldrsh r0, [sp, #0xc] - add r1, r2, r1 - strh r1, [sp, #0xe] - cmp r0, #0 - ldrgesh r1, [sp, #0xe] - cmpge r1, #0 - blt _023209E8 - cmp r0, #0x38 - cmplt r1, #0x20 - bge _023209E8 - bl GetTileSafe - ldrsh r1, [sp, #0xc] - mov r5, r0 - cmp r1, #1 - ldrgesh r0, [sp, #0xe] - cmpge r0, #1 - blt _02320974 - cmp r1, #0x37 - cmplt r0, #0x1f - bge _02320974 - ldrh r0, [r5] - tst r0, #3 - bne _02320974 - ldrh r0, [r5] - tst r0, #0x10 - bne _02320974 - bic r0, r0, #3 - strh r0, [r5] - ldrh r0, [r5] - mvn r7, #0 - str r7, [sp, #8] - orr r0, r0, #1 - strh r0, [r5] -_0232093C: - ldr r6, [sp, #8] -_02320940: - ldrsh r0, [sp, #0xc] - ldrsh r1, [sp, #0xe] - add r0, r0, r6 - add r1, r1, r7 - bl ov29_02336694 - add r6, r6, #1 - cmp r6, #1 - ble _02320940 - add r7, r7, #1 - cmp r7, #1 - ble _0232093C - mov r6, #1 - mov r7, r6 -_02320974: - ldr r0, [r5, #0x10] - cmp r0, #0 - beq _023209A4 - cmp r0, sb - beq _023209A0 - ldr r0, [r0] - cmp r0, #3 - bne _023209A0 - add r0, sp, #0xc - mov r1, #0 - bl RemoveGroundItem -_023209A0: - mov r6, #1 -_023209A4: - ldr r1, [r5, #0xc] - cmp r1, #0 - cmpne r1, sb - beq _023209E8 - ldr r0, [r1] - cmp r0, #1 - bne _023209E8 - ldr r2, _02320A9C ; =EXPLOSION_FIXED_DAMAGES - mov r0, sl - ldr r5, [r2, r8, lsl #2] - ldr r2, [sp, #0x38] - mov r3, fp - str r5, [sp] - bl CalcAftermathExplosionDamage - bl IsFloorOver - cmp r0, #0 - bne _023209F8 -_023209E8: - add r4, r4, #4 -_023209EC: - ldrsh r1, [r4] - cmp r1, #0x63 - bne _0232089C -_023209F8: - bl IsFloorOver - cmp r0, #0 - bne _02320A84 - ldr r0, [sb] - cmp r0, #1 - bne _02320A3C - ldr r0, _02320AA0 ; =0x0000026F - cmp fp, r0 - beq _02320A3C - ldr r1, _02320A9C ; =EXPLOSION_FIXED_DAMAGES - ldr r2, [sp, #0x38] - ldr r4, [r1, r8, lsl #2] - mov r0, sl - mov r1, sb - mov r3, fp - str r4, [sp] - bl CalcAftermathExplosionDamage -_02320A3C: - cmp r6, #0 - beq _02320A84 - cmp r7, #0 - beq _02320A7C - mov r6, #0 - mov r4, r6 -_02320A54: - mov r5, r4 -_02320A58: - mov r0, r5 - mov r1, r6 - bl DetermineTileWalkableNeighbors - add r5, r5, #1 - cmp r5, #0x38 - blt _02320A58 - add r6, r6, #1 - cmp r6, #0x20 - blt _02320A54 -_02320A7C: - bl UpdateMinimap - bl UpdateTrapsVisibility -_02320A84: - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02320A8C: .word DUNGEON_PTR -#ifdef JAPAN -_02320A90: .word 0x0000093B -_02320A94: .word 0x0000093A -#else -_02320A90: .word 0x00000BFC -_02320A94: .word 0x00000BFB -#endif -_02320A98: .word ov29_023529B8 -_02320A9C: .word EXPLOSION_FIXED_DAMAGES -_02320AA0: .word 0x0000026F - arm_func_end TryAftermathExplosion - - arm_func_start CalcExplosionDamage -CalcExplosionDamage: ; 0x02320AA4 - stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} - sub sp, sp, #0x24 - mov r7, r1 - mov r8, r0 - mov r0, r7 - mov r6, r2 - mov r5, r3 - bl EntityIsValid__02320764 - cmp r0, #0 - beq _02320BC0 - ldr r1, _02320BC8 ; =0x00000163 - add r0, sp, #0x1a - ldr r4, [r7, #0xb4] - bl InitMove - add r1, sp, #0x1a - mov r0, r7 - bl TwoTurnMoveForcedMiss - cmp r0, #0 - bne _02320BC0 - ldrb r0, [r4, #6] - mov r1, #2 - cmp r0, #0 - bne _02320B2C - ldrsh r2, [r4, #0x10] - mov r0, r7 - add r2, r2, r2, lsr #31 - mov r4, r2, asr #1 - bl MonsterIsType - cmp r0, #0 - addne r0, r4, r4, lsr #31 - movne r4, r0, asr #1 - cmp r4, #1 - movlt r4, #1 - b _02320B44 -_02320B2C: - mov r0, r7 - ldr r4, [sp, #0x40] - bl MonsterIsType - cmp r0, #0 - addne r0, r4, r4, lsr #31 - movne r4, r0, asr #1 -_02320B44: - mov ip, #7 - mov r0, r8 - mov r1, r7 - mov r2, #1 -#ifdef JAPAN - mov r3, #0xb00 -#else - mov r3, #0xdc0 -#endif - str ip, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - movne r4, #1 - bne _02320B94 - mov r2, #1 - mov ip, #6 - mov r0, r8 - mov r1, r7 -#ifdef JAPAN - rsb r3, r2, #0xb00 -#else - rsb r3, r2, #0xdc0 -#endif - str ip, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - addne r0, r4, r4, lsr #31 - movne r4, r0, asr #1 -_02320B94: - add r0, sp, #0x18 - stmia sp, {r0, r6} - mov r3, #0 - str r5, [sp, #8] - str r3, [sp, #0xc] - str r3, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r2, r4 - str r3, [sp, #0x14] - bl CalcDamageFixedNoCategory -_02320BC0: - add sp, sp, #0x24 - ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} - .align 2, 0 -_02320BC8: .word 0x00000163 - arm_func_end CalcExplosionDamage - - arm_func_start CalcAftermathExplosionDamage -CalcAftermathExplosionDamage: ; 0x02320BCC - stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} - sub sp, sp, #0x24 - mov r8, r1 - mov sb, r0 - mov r0, r8 - mov r7, r2 - mov r6, r3 - bl EntityIsValid__02320764 - cmp r0, #0 - beq _02320CFC - ldr r1, _02320D04 ; =0x00000163 - add r0, sp, #0x1a - ldr r5, [r8, #0xb4] - bl InitMove - add r1, sp, #0x1a - mov r0, r8 - bl TwoTurnMoveForcedMiss - cmp r0, #0 - bne _02320CFC - ldrb r0, [r5, #6] - mov r1, #2 - cmp r0, #0 - bne _02320C54 - ldrsh r2, [r5, #0x10] - mov r0, r8 - add r2, r2, r2, lsr #31 - mov r4, r2, asr #1 - bl MonsterIsType - cmp r0, #0 - addne r0, r4, r4, lsr #31 - movne r4, r0, asr #1 - cmp r4, #1 - movlt r4, #1 - b _02320C6C -_02320C54: - mov r0, r8 - ldr r4, [sp, #0x40] - bl MonsterIsType - cmp r0, #0 - addne r0, r4, r4, lsr #31 - movne r4, r0, asr #1 -_02320C6C: - mov ip, #7 - mov r0, sb - mov r1, r8 - mov r2, #1 -#ifdef JAPAN - mov r3, #0xb00 -#else - mov r3, #0xdc0 -#endif - str ip, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - movne r4, #1 - bne _02320CBC - mov r2, #1 - mov ip, #6 - mov r0, sb - mov r1, r8 -#ifdef JAPAN - rsb r3, r2, #0xb00 -#else - rsb r3, r2, #0xdc0 -#endif - str ip, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - addne r0, r4, r4, lsr #31 - movne r4, r0, asr #1 -_02320CBC: - ldrsh r0, [r5, #0x10] - mov r3, #0 - mov r1, r8 - cmp r4, r0 - subge r4, r0, #1 - add r0, sp, #0x18 - stmia sp, {r0, r7} - str r6, [sp, #8] - cmp r4, #0 - movlt r4, #0 - str r3, [sp, #0xc] - str r3, [sp, #0x10] - mov r0, sb - mov r2, r4 - str r3, [sp, #0x14] - bl CalcDamageFixedNoCategory -_02320CFC: - add sp, sp, #0x24 - ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_02320D04: .word 0x00000163 - arm_func_end CalcAftermathExplosionDamage - - arm_func_start TryWarp -TryWarp: ; 0x02320D08 - -#ifdef JAPAN -#define TRY_WARP_OFFSET -0xA4 -#else -#define TRY_WARP_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov r4, #0 - mov sb, r0 - mov r8, r1 - mov r7, r2 - mov r0, r4 - mov r2, r4 - mov r6, r3 - ldr r5, [r8, #0xb4] - bl SubstitutePlaceholderStringTags - cmp sb, r8 - beq _02320D78 - cmp sb, #0 - moveq r0, r4 - beq _02320D58 - ldr r0, [sb] - cmp r0, #1 - moveq r0, #1 - movne r0, r4 - and r0, r0, #0xff -_02320D58: - cmp r0, #0 - beq _02320D78 - mov r0, sb - mov r1, #0x53 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0 - bne _02320D84 -_02320D78: - mov r0, r8 - mov r1, #0xe - bl AbilityIsActiveVeneer -_02320D84: - cmp r0, #0 - beq _02320DA0 - ldr r2, _023210E8 ; =0x00000E74 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_02320DA0: - ldr r0, _023210EC ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x4000 - ldrb r0, [r0, #0xda + TRY_WARP_OFFSET] - bl AreTileJumpsAllowed - cmp r0, #0 - bne _02320DD0 - ldr r2, _023210F0 ; =0x00000E72 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_02320DD0: - cmp r7, #1 - bne _02320E20 - ldr r0, _023210EC ; =DUNGEON_PTR - ldrsh r1, [r8, #4] - ldr r0, [r0] - add r0, r0, #0xcc00 - ldrsh r2, [r0, #0xe4 + TRY_WARP_OFFSET] - cmp r2, r1 - ldreqsh r1, [r0, #0xe6 + TRY_WARP_OFFSET] - ldreqsh r0, [r8, #6] - cmpeq r1, r0 - bne _02320E20 - ldr r2, _023210F4 ; =0x00000E73 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, sb - mov r1, r8 - bl TryInflictPetrifiedStatus - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_02320E20: - ldr r2, _023210F8 ; =0x00000E71 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r8 - mov r1, r8 - bl TryEndPetrifiedOrSleepStatus - mov r0, sb - mov r1, r8 - bl ov29_022E5650 - mov r0, r8 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02320EA4 - ldrb sl, [r5, #0x4c] - ldr fp, _023210FC ; =DUNGEON_FRAMES_PASSED -_02320E60: - ldr r0, [r8, #0x1c] - add r0, r0, #0x800 - str r0, [r8, #0x1c] - cmp r0, #0xa000 - bge _02320EA4 - ldr r0, [fp] - tst r0, #3 - bne _02320E98 - add r0, sl, #1 - and sl, r0, #7 - mov r0, r8 - mov r1, sl - strb sl, [r5, #0x4c] - bl ChangeMonsterAnimationToIdle -_02320E98: - mov r0, #0x22 - bl AdvanceFrame - b _02320E60 -_02320EA4: - cmp r7, #5 - addls pc, pc, r7, lsl #2 - b _02320EC8 -_02320EB0: ; jump table - b _02320EC8 ; case 0 - b _02320EF4 ; case 1 - b _02320F30 ; case 2 - b _02320F60 ; case 3 - b _02320F74 ; case 4 - b _02320FB0 ; case 5 -_02320EC8: - add r0, sp, #0 - mov r1, #1 - bl GetRandomTile - cmp r0, #0 - bne _02321008 - ldrh r0, [r8, #4] - mov r4, #1 - strh r0, [sp] - ldrh r0, [r8, #6] - strh r0, [sp, #2] - b _02321008 -_02320EF4: - ldr r1, _023210EC ; =DUNGEON_PTR - add r0, sp, #0 - ldr r1, [r1] - mov r2, #0 -#ifdef JAPAN - add r1, r1, #0xc40 - add r1, r1, #0xc000 -#else - add r1, r1, #0xe4 - add r1, r1, #0xcc00 -#endif - bl FindClosestUnoccupiedTileWithin2 - cmp r0, #0 - bne _02321008 - ldrh r0, [r8, #4] - mov r4, #1 - strh r0, [sp] - ldrh r0, [r8, #6] - strh r0, [sp, #2] - b _02321008 -_02320F30: - add r0, sp, #0 - mov r1, r6 - mov r2, #0 - bl FindClosestUnoccupiedTileWithin2 - cmp r0, #0 - bne _02321008 - ldrh r0, [r8, #4] - mov r4, #1 - strh r0, [sp] - ldrh r0, [r8, #6] - strh r0, [sp, #2] - b _02321008 -_02320F60: - ldrh r0, [r6] - strh r0, [sp] - ldrh r0, [r6, #2] - strh r0, [sp, #2] - b _02321008 -_02320F74: - ldr r1, _023210EC ; =DUNGEON_PTR - add r0, sp, #0 - ldr r1, [r1] - mov r2, #1 -#ifdef JAPAN - add r1, r1, #0xc40 - add r1, r1, #0xc000 -#else - add r1, r1, #0xe4 - add r1, r1, #0xcc00 -#endif - bl FindUnoccupiedTileWithin3 - cmp r0, #0 - bne _02321008 - ldrh r0, [r8, #4] - mov r4, #1 - strh r0, [sp] - ldrh r0, [r8, #6] - strh r0, [sp, #2] - b _02321008 -_02320FB0: - ldrb r0, [r5, #6] - cmp r0, #0 - ldreqb r0, [r5, #7] - cmpeq r0, #0 - bne _02320FE4 - bl GetLeader - mov r1, r0 - add r0, sp, #0 - add r1, r1, #4 - mov r2, #0 - bl FindClosestUnoccupiedTileWithin2 - cmp r0, #0 - bne _02321008 -_02320FE4: - add r0, sp, #0 - mov r1, #1 - bl GetRandomTile - cmp r0, #0 - ldreqh r0, [r8, #4] - moveq r4, #1 - streqh r0, [sp] - ldreqh r0, [r8, #6] - streqh r0, [sp, #2] -_02321008: - ldrsh r1, [sp] - ldrsh r2, [sp, #2] - mov r0, r8 - mov r3, #1 - bl MoveMonsterToPos - mov r0, r8 - mov r1, #0 - bl UpdateEntityPixelPos - mov r0, r8 - bl sub_01FFB62C - mov r0, #1 - bl UpdateCamera - mov r0, r8 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _023210A0 - ldrb sl, [r5, #0x4c] - mov r0, #0xa000 - ldr r6, _023210FC ; =DUNGEON_FRAMES_PASSED - str r0, [r8, #0x1c] - mov fp, #0x22 -_0232105C: - ldr r0, [r8, #0x1c] - sub r0, r0, #0x400 - str r0, [r8, #0x1c] - cmp r0, #0 - ble _023210A0 - ldr r0, [r6] - tst r0, #3 - bne _02321094 - add r0, sl, #1 - and sl, r0, #7 - mov r0, r8 - mov r1, sl - strb sl, [r5, #0x4c] - bl ChangeMonsterAnimationToIdle -_02321094: - mov r0, fp - bl AdvanceFrame - b _0232105C -_023210A0: - mov r1, #0 - mov r0, #0x22 - str r1, [r8, #0x1c] - bl AdvanceFrame - cmp r4, #0 - beq _023210C8 - ldr r2, _02321100 ; =0x00000E75 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget -_023210C8: - cmp r7, #1 - bne _023210DC - mov r0, sb - mov r1, r8 - bl TryInflictPetrifiedStatus -_023210DC: - mov r0, r8 - bl ov29_02321238 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -#define TRY_WARP_DATA_OFFSET -0x2BE -#else -#define TRY_WARP_DATA_OFFSET 0 -#endif -_023210E8: .word 0x00000E74 + TRY_WARP_DATA_OFFSET -_023210EC: .word DUNGEON_PTR -_023210F0: .word 0x00000E72 + TRY_WARP_DATA_OFFSET -_023210F4: .word 0x00000E73 + TRY_WARP_DATA_OFFSET -_023210F8: .word 0x00000E71 + TRY_WARP_DATA_OFFSET -_023210FC: .word DUNGEON_FRAMES_PASSED -_02321100: .word 0x00000E75 + TRY_WARP_DATA_OFFSET - arm_func_end TryWarp - - arm_func_start EnsureCanStandCurrentTile -EnsureCanStandCurrentTile: ; 0x02321104 - stmdb sp!, {r4, lr} - mov r4, r0 - add r1, r4, #4 - bl CannotStandOnTile - cmp r0, #0 - ldmeqia sp!, {r4, pc} - mov r0, r4 - mov r1, r4 - mov r2, #5 - mov r3, #0 - bl TryWarp - ldmia sp!, {r4, pc} - arm_func_end EnsureCanStandCurrentTile - - arm_func_start ov29_02321134 -ov29_02321134: ; 0x02321134 - stmdb sp!, {r4, lr} - mov r4, r0 - add r1, r4, #4 - bl CannotStandOnTileNoMonsterCheck - cmp r0, #0 - ldmeqia sp!, {r4, pc} - mov r0, r4 - mov r1, r4 - mov r2, #5 - mov r3, #0 - bl TryWarp - ldmia sp!, {r4, pc} - arm_func_end ov29_02321134 - - arm_func_start ov29_02321164 -ov29_02321164: ; 0x02321164 - stmdb sp!, {r3, r4, r5, lr} - mov r4, r1 - mov r5, r0 - mov r0, r4 - add r1, r4, #4 - bl CannotStandOnTile - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, r5 - mov r1, r4 - mov r2, #5 - mov r3, #0 - bl TryWarp - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ov29_02321164 - - arm_func_start ov29_0232119C -ov29_0232119C: ; 0x0232119C - stmdb sp!, {r3, r4, r5, lr} - movs r4, r0 - mov r5, r2 - moveq r0, #0 - beq _023211C4 - ldr r0, [r4] - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff -_023211C4: - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - cmp r1, #0 - beq _023211E0 - mov r0, r4 - mov r1, #8 - bl ChangeMonsterAnimationToIdle -_023211E0: - ldr r0, [r4, #0xb4] - ldrb r0, [r0, #7] - cmp r0, #0 - beq _02321210 - cmp r5, #0 - beq _02321200 - mov r0, r4 - bl ov29_022F42F8 -_02321200: - add r0, r4, #4 - bl DiscoverMinimap - mov r0, #0 - bl HandleShopTransaction -_02321210: - mov r0, r4 - bl ActivateTerrainEffects - ldr r1, _02321234 ; =DUNGEON_PTR - mov r0, r4 - ldr r1, [r1] - add r1, r1, #0x4000 -#ifdef JAPAN - ldrb r1, [r1, #0x20] -#else - ldrb r1, [r1, #0xc4] -#endif - bl ov29_02305814 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02321234: .word DUNGEON_PTR - arm_func_end ov29_0232119C diff --git a/include/dungeon_util_2.h b/include/dungeon_util_2.h index d5615404..33ca13f0 100644 --- a/include/dungeon_util_2.h +++ b/include/dungeon_util_2.h @@ -9,5 +9,8 @@ void PopulateActiveMonsterPtrs(void); s32 GetTeamMemberIndex(struct entity *entity); void GetMonsterOrTrapName(char *buf, struct entity *entity, u32 param_3); void SubstitutePlaceholderStringTags(s32 pos, struct entity* entity, u32 param_3); +#ifdef EUROPE +bool8 ov29_022E34A8_EU(struct entity *entity); +#endif #endif //PMDSKY_DUNGEON_UTIL_2_H diff --git a/include/item.h b/include/item.h index 0c4ced18..44879e24 100644 --- a/include/item.h +++ b/include/item.h @@ -1653,6 +1653,17 @@ struct bulk_item /* 0x2 */ u16 quantity; }; +struct unk_0209C850 { + s32 field_0x0; + u8 field_0x4; + u8 field_0x5; + s16 field_0x6; + u8 field_0x8; + u8 field_0x9; + u8 field_0xa; + u8 field_0xb; +}; + struct bag_items { // Indexes: // 0x0 - Main, default diff --git a/include/item_util_4.h b/include/item_util_4.h index a3d855c8..c254e442 100644 --- a/include/item_util_4.h +++ b/include/item_util_4.h @@ -21,5 +21,19 @@ s32 GetDisplayedSellPrice(struct item* item); s32 GetActualBuyPrice(struct item* item); s32 GetActualSellPrice(struct item* item); +s32 sub_0200D1F0(s16 a); +u8 sub_0200D1FC(s16 item_id); +u8 sub_0200D208(s16 item_id); +void sub_0200D214(u8* buf, s16 item_id, struct unk_0209C850* a); +s32 FindItemInInventory(s16 item_id); +bool8 MaybeGetFormattedItemName(u8* buf, struct item* item, struct unk_0209C850* a, + bool8 colored, bool8 forceBrackets); +void SprintfStatic__0200D634(u8* buf, const char* fmt, ...); +bool8 MaybeGetUncoloredFormattedItemName(u8* buf, struct item* item, + struct unk_0209C850* a); +bool8 MaybeGetColoredFormattedItemName(u8* buf, struct item* item, + struct unk_0209C850* a); +void sub_0200D688(u8* buf, u8* name, struct item* item, struct unk_0209C850* a); + #endif //PMDSKY_ITEM_UTIL_4_H diff --git a/include/main_0200D81C.h b/include/main_0200D81C.h index f3e5ff55..fef15188 100644 --- a/include/main_0200D81C.h +++ b/include/main_0200D81C.h @@ -8,4 +8,6 @@ bool8 AreItemsEquivalent(struct item* item1, struct item* item2, s32 bitmask); void sub_0200D894(struct item* item); s32 GetMoneyQuantity(struct item* item); +s32 sub_0200D76C(s32 value, u8* buf, bool8 pad); + #endif //PMDSKY_MAIN_0200D81C_H diff --git a/include/main_020504A4.h b/include/main_020504A4.h index d71a8230..bbb93859 100644 --- a/include/main_020504A4.h +++ b/include/main_020504A4.h @@ -2,6 +2,30 @@ #define PMDSKY_MAIN_020504A4_H #include "adventure_log.h" +#include "util.h" +#include "save.h" u32 GetSentryDutyGamePoints(s32 index); +s32 SetSentryDutyGamePoints(u32 points); +void CopyLogTo(struct bitstream *stream); +void CopyLogFrom(struct bitstream *stream); +void GetAbilityString(char *buf, s32 ability_id); +u16 GetAbilityDescStringId(s32 ability_id); +u16 GetTypeStringId(s32 type_id); +u8 GetConversion2ConvertToType(s32 type_id); +void InitBitstreamForWrite(struct bitstream *stream, void *buf, s32 len); +void InitBitstreamForRead(struct bitstream *stream, void *buf, s32 len); +void BitstreamDebug(struct bitstream *stream); +void CopyBitsTo(struct bitstream *stream, void *buf_write, s32 nbits); +void CopyBitsFrom(struct bitstream *stream, void *buf_read, s32 nbits); +void StoreDefaultTeamData(void); +void GetMainTeamNameWithCheck(u8 *buf); +void GetMainTeamName(u8 *buf); +void SetMainTeamName(const u8 *name); +s32 GetRankupPoints(void); +void sub_02050C10(s32 points); +u8 GetRank(void); +u8 sub_02050CD0(void); +s32 GetRankStorageSize(void); + #endif diff --git a/include/main_02050CF8.h b/include/main_02050CF8.h new file mode 100644 index 00000000..a85a9d73 --- /dev/null +++ b/include/main_02050CF8.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_MAIN_02050CF8_H +#define PMDSKY_MAIN_02050CF8_H + +#include "util.h" + +s32 sub_02050CF8(void *buf, s32 len); + +#endif //PMDSKY_MAIN_02050CF8_H diff --git a/include/main_02050D84.h b/include/main_02050D84.h new file mode 100644 index 00000000..45d89a95 --- /dev/null +++ b/include/main_02050D84.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_MAIN_02050D84_H +#define PMDSKY_MAIN_02050D84_H + +#include "util.h" + +s32 sub_02050D84(void *buf, s32 len); + +#endif //PMDSKY_MAIN_02050D84_H diff --git a/include/main_020517D4.h b/include/main_020517D4.h index 8a2c33d2..caa97757 100644 --- a/include/main_020517D4.h +++ b/include/main_020517D4.h @@ -5,7 +5,8 @@ u32 GetBagCapacity(s32 scenario_balance); u32 GetBagCapacitySpecialEpisode(s32 se_type); struct unk_020517F4 { - u8 field_0x0[8]; + u8 field_0x0[4]; + s32 field_0x4; s32 field_0x8; s16 field_0xc; u8 field_0xe[2]; diff --git a/include/main_02051FF0.h b/include/main_02051FF0.h index a3cab832..a93af8c1 100644 --- a/include/main_02051FF0.h +++ b/include/main_02051FF0.h @@ -1,6 +1,7 @@ #ifndef PMDSKY_MAIN_02051FF0_H #define PMDSKY_MAIN_02051FF0_H -s32 sub_02051FF0(u32 fileId, void **outPtr, s32 param2); +s32 sub_02051FF0(const char *path, void **outPtr, s32 param2); +void sub_02052060(const char *path, u32 a1, s32 a2, s32 a3, s32 a4, s32 a5); #endif //PMDSKY_MAIN_02051FF0_H diff --git a/include/main_020526EC.h b/include/main_020526EC.h index 84b57784..138754e6 100644 --- a/include/main_020526EC.h +++ b/include/main_020526EC.h @@ -1,6 +1,35 @@ #ifndef PMDSKY_MAIN_020526EC_H #define PMDSKY_MAIN_020526EC_H +#include "enums.h" +#include + +struct unk_02052060 { + u32 field_0x0; + s32 field_0x4; + u32 field_0x8; + u32 field_0xc; + u32 field_0x10; +}; + +struct unk_020522F0 { + struct unk_02052060 *field_0x0; + u8 *field_0x4; + s32 field_0x8; + u8 *field_0xc; + u8 *field_0x10; +}; + + +void sub_020522F0(const char *path, struct unk_020522F0 *state, s32 param2); +void sub_02052334(struct unk_020522F0 *state); +void LoadMonsterMd(void); +void GetNameRaw(u8 *dest, s32 monster_id); +void GetName(char *dest, enum monster_id monster_id, char color_id); +void SprintfStatic__02052418(char *dest, const char *format, ...); +void GetNameWithGender(char *dest, s16 monster_id, char color_id); +void GetSpeciesString(char *dest, s16 monster_id); +const u8* GetNameString(enum monster_id monster_id); u16 GetSpriteIndex__020526EC(s16 monster_id); u16 GetSpriteIndex__02052708(s16 monster_id); u16 GetSpriteIndex__02052724(s16 monster_id); diff --git a/include/main_02055770.h b/include/main_02055770.h index 7548d87b..c10d6831 100644 --- a/include/main_02055770.h +++ b/include/main_02055770.h @@ -45,5 +45,6 @@ struct ground_monster* GetMainCharacter3(void); s16 sub_02055894(struct ground_monster *member); s16 GetFirstMatchingMemberIdx(s16 monster_id); s16 GetFirstEmptyMemberIdx(s16 monster_id); +void sub_020559D8(s16 *idxs); #endif diff --git a/include/monster_data.h b/include/monster_data.h index b4a7ce15..5b1ebf72 100644 --- a/include/monster_data.h +++ b/include/monster_data.h @@ -2,8 +2,7 @@ #define PMDSKY_MONSTER_DATA_TABLE_PTR_H #include "enums.h" - -extern struct monster_data_table *MONSTER_DATA_TABLE_PTR; +#include struct monster_evolution_parameters { s16 pre_evolution_idx; // 0x8: The pre-evolution of the monster. @@ -65,4 +64,18 @@ struct monster_file_contents { struct monster_data_table table; // 0x8: The main contents of the data table. }; +struct unk_020B09B4 { + struct monster_data_table *field_0x0; +#ifdef EUROPE + void *field_0x4; + struct monster_file_contents *field_0x8; +#else + struct monster_file_contents *field_0x4; + void *field_0x8; +#endif + struct iovec field_0xc; +}; + +extern struct unk_020B09B4 MONSTER_DATA_TABLE_PTR; + #endif //PMDSKY_MONSTER_DATA_TABLE_PTR_H diff --git a/include/number_util.h b/include/number_util.h index 50c21c21..f6b9606f 100644 --- a/include/number_util.h +++ b/include/number_util.h @@ -4,6 +4,16 @@ #include "util.h" #include "save.h" +struct unk_022AB694 { + u32 field_0x0; + u8 field_0x4; +}; + +void ResetPlayTimer(struct unk_022AB694 *timer); +void PlayTimerTick(struct unk_022AB694 *timer); +s32 GetPlayTimeSeconds(struct unk_022AB694 *timer); +void sub_02050E5C(struct unk_022AB694 *timer, struct bitstream *stream); +void sub_02050E8C(struct unk_022AB694 *timer, struct bitstream *stream); struct fixed_point sub_02050EBC(struct fixed_point a, struct fixed_point b); struct fixed_point SubFixedPoint(struct fixed_point a, struct fixed_point b); struct fixed_point sub_02050F78(struct fixed_point a, struct fixed_point b); diff --git a/include/overlay_29_0230BBAC.h b/include/overlay_29_0230BBAC.h index 7d70f9ee..2d4ebce0 100644 --- a/include/overlay_29_0230BBAC.h +++ b/include/overlay_29_0230BBAC.h @@ -14,7 +14,7 @@ void ov29_0230D088(struct entity *attacker, struct entity *defender, enum type_i void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a3, s16 damage_source); void CalcRecoilDamageFixed(struct entity *entity, s32 fixed_damage, s32 a3, bool8 *out_flag, s32 a5, enum type_id attack_type, s16 damage_source, s32 a8, s32 a9, s32 a10); void CalcDamageFixed(struct entity *attacker, struct entity *defender, s32 fixed_damage, s32 a4, bool8 *out_flag, enum type_id attack_type, u8 category, s16 damage_source, s32 a9, s32 a10, s32 a11); -void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s16 fixed_damage, s32 a4, bool8 *out_flag, enum type_id attack_type, s16 damage_source, s32 a8, s32 a9, s32 a10); +void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s32 fixed_damage, s32 a4, bool8 *out_flag, enum type_id attack_type, s16 damage_source, s32 a8, s32 a9, s32 a10); void CalcDamageFixedWrapper(struct entity *attacker, struct entity *defender, s32 fixed_damage, s32 a4, bool8 *out_flag, enum type_id attack_type, u8 category, s16 damage_source, s32 a9, s32 a10, s32 a11); void UpdateShopkeeperModeAfterAttack(struct entity *attacker, struct entity *defender); void UpdateShopkeeperModeAfterTrap(struct entity *entity, bool8 is_enemy); diff --git a/include/overlay_29_02320764.h b/include/overlay_29_02320764.h index d00913f5..4af69a0c 100644 --- a/include/overlay_29_02320764.h +++ b/include/overlay_29_02320764.h @@ -5,5 +5,18 @@ // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__02320764(struct entity *entity); +void TryAftermathExplosion(struct entity *attacker, struct entity *defender, + struct position *pos, s32 idx, enum type_id attack_type, + s16 damage_source); +void CalcExplosionDamage(struct entity *attacker, struct entity *defender, + enum type_id attack_type, s16 damage_source, s32 fixed_damage); +void CalcAftermathExplosionDamage(struct entity *attacker, struct entity *defender, + enum type_id attack_type, s16 damage_source, s32 fixed_damage); +void TryWarp(struct entity *user, struct entity *target, s32 warp_type, + struct position *pos); +void EnsureCanStandCurrentTile(struct entity *entity); +void ov29_02321134(struct entity *entity); +void ov29_02321164(struct entity *a, struct entity *b); +void ov29_0232119C(struct entity *entity, s32 a, s32 b); #endif //PMDSKY_OVERLAY_29_02320764_H diff --git a/include/save.h b/include/save.h index 4ff59a4b..8f23fa4e 100644 --- a/include/save.h +++ b/include/save.h @@ -2,7 +2,7 @@ #define PMDSKY_SAVE_H struct bitstream { - char* ptr; // Current byte + u8* ptr; u32 end; // End of the region the bitstream can read from / write to. Doesn't seem to do anything with this information? u32 bit_idx; // Bit position in current byte u32 bit_count; // Total bits this stream has used diff --git a/main.lsf b/main.lsf index 85ccfca9..385cf283 100644 --- a/main.lsf +++ b/main.lsf @@ -65,7 +65,6 @@ Static main Object src/main_0200CA54.o Object src/item_util.o Object src/item_util_4.o - Object asm/main_0200D1F0.o Object src/main_0200D81C.o Object asm/main_0200D8E4.o Object src/item_util_1.o @@ -263,7 +262,8 @@ Static main Object src/main_020503CC.o Object asm/main_02050420.o Object src/main_020504A4.o - Object asm/main_020504BC.o + Object src/main_02050CF8.o + Object src/main_02050D84.o Object src/number_util.o Object src/dungeon_recruitment_2.o Object src/main_020514CC.o @@ -279,7 +279,6 @@ Static main Object src/main_020517D4.o Object asm/main_02051804.o Object src/main_02051FF0.o - Object asm/main_02052060.o Object src/main_020526EC.o Object src/get_category_string.o Object src/main_020527A8.o @@ -294,7 +293,6 @@ Static main Object src/main_02055410.o Object src/main_0205567C.o Object src/main_02055770.o - Object asm/main_020559D8.o Object src/main_02056294.o Object asm/main_020563BC.o Object src/main_020564B0.o @@ -795,7 +793,7 @@ Overlay OVY_29 Object src/overlay_29_022E272C.o Object src/dungeon_visibility.o Object src/dungeon_util_2.o - Object asm/overlay_29_022E34A8.o + Object asm/overlay_29_022E2B68.o Object src/dg_camera.o Object src/dg_effect.o Object asm/overlay_29_022E37DC.o @@ -1024,7 +1022,6 @@ Overlay OVY_29 Object src/overlay_29_0232017C.o Object asm/overlay_29_023201A0.o Object src/overlay_29_02320764.o - Object asm/overlay_29_02320788.o Object src/overlay_29_02321238.o Object src/overlay_29_02321274.o Object asm/overlay_29_02321288.o diff --git a/src/dungeon_recruitment.c b/src/dungeon_recruitment.c index fe7070f6..bc0ff6b1 100644 --- a/src/dungeon_recruitment.c +++ b/src/dungeon_recruitment.c @@ -28,6 +28,7 @@ #include "position_util.h" #include "overlay_29_0234B104.h" #include "main_02056294.h" +#include "overlay_29_02320764.h" struct unk_0230E064 { s16 field_0x0; @@ -59,7 +60,6 @@ void ov29_0234D630(void); void ov29_0234D838(void); const u8 *GetNameString(enum monster_id monster_id); void StrncpyName(char *dest, const char *src, u32 n); -void EnsureCanStandCurrentTile(struct entity *entity); void ov29_02305F60(struct entity *user, struct entity *target); void ChangeMonsterAnimationToIdle(struct entity *monster, s32 direction); s32 ov29_0234D7C0(s32 message_id, struct preprocessor_args *args, s32 param_3, diff --git a/src/dungeon_util_2.c b/src/dungeon_util_2.c index 06609577..1fcf3c73 100644 --- a/src/dungeon_util_2.c +++ b/src/dungeon_util_2.c @@ -1,4 +1,5 @@ #include "dungeon_util_2.h" +#include "overlay_29_022ED01C.h" #include "dungeon_pokemon_attributes_1.h" #include "dungeon_range.h" #include "dungeon.h" @@ -108,3 +109,11 @@ void SubstitutePlaceholderStringTags(s32 pos, struct entity* entity, u32 param_3 break; } } + +#ifdef EUROPE +bool8 ov29_022E34A8_EU(struct entity *entity) +{ + return EntityIsValid__022E1A1C(entity) && !DUNGEON_PTR->end_floor_no_death_check_flag && + GetForcedLossReason() != FORCED_LOSS_PARTNER_FAINTED; +} +#endif diff --git a/src/item_util_4.c b/src/item_util_4.c index 9ecb5e24..c737b807 100644 --- a/src/item_util_4.c +++ b/src/item_util_4.c @@ -3,13 +3,14 @@ #include "item.h" #include "item_util.h" #include "item_util_1.h" +#include "main_0200D81C.h" +#include extern s16 RandRangeSafe(s32, s32); extern s16 _020A18BC[10]; extern void ItemZInit(); extern u16 GetItemBuyPrice(s16); extern u16 GetItemSellPrice(s16); -extern s32 GetMoneyQuantity(struct item*); extern bool8 IsShoppableItem(s16); extern bool8 IsThrownItem(s16); @@ -250,3 +251,236 @@ s32 GetActualSellPrice(struct item* item) } return GetItemSellPrice(item->id); } + +extern u8* strcpy(u8*, u8*); +extern u8* strncpy(u8* dest, u8* src, u32 n); +extern s32 vsprintf(u8* str, const u8* format, va_list ap); +extern struct bag_items* BAG_ITEMS_PTR_MIRROR; +extern s32 sub_0200EB64(s16 a); +extern void MoneyQuantityToString__02023B30(u8* buf, s32 quantity); +extern const char _02097F34; +extern const char _02097F50; +extern const char _02097F58; +extern const char _02097F68; +extern const char _02097F6C; +extern const char _02097F7C; +extern const char _02097F90; +extern const char _02097F9C; +extern const char _02097FAC; +extern const char _02097FB8; +extern const char _02097FC4; +extern const char _02097FE4; + +s32 sub_0200D1F0(s16 a) +{ + return sub_0200EB64(a); +} + +u8 sub_0200D1FC(s16 item_id) +{ + return GetItemPaletteId(item_id); +} + +u8 sub_0200D208(s16 item_id) +{ + return GetItemActionName(item_id); +} + +void sub_0200D214(u8 *buf, s16 item_id, struct unk_0209C850 *a) +{ + struct item item; + u8 name[0x50]; + + strncpy(name, GetItemName(item_id), 0x50); + InitItem(&item, item_id, 0, 0); + item.quantity = 1; + sub_0200D688(buf, name, &item, a); +} + +s32 FindItemInInventory(s16 item_id) +{ + s32 i; + s32 j; + struct bag_items *bag; + + bag = BAG_ITEMS_PTR_MIRROR; + for (i = 0; i < INVENTORY_SIZE; i++) { + if (ItemExists(bag->bag_items->bag_items[i].flags)) { + if (item_id == bag->bag_items->bag_items[i].id) { + return i; + } + } + } + for (j = 0; j < 1000; j++) { + if (item_id == bag->field_0x38A[j]) { + return j + 0x8000; + } + } + return -1; +} + +bool8 MaybeGetFormattedItemName(u8 *buf, struct item *item, + struct unk_0209C850 *a, bool8 colored, + bool8 forceBrackets) +{ + u8 name[0x50]; + u8 money[0x50]; + u8 *raw_name; + bool8 sticky; + bool8 brackets; + bool8 ret; + enum item_category category; + + brackets = FALSE; + category = GetItemCategory(item->id); + ret = FALSE; + sticky = FALSE; + if (a != NULL && a->field_0x8 != 0) { + brackets = TRUE; + } + raw_name = GetItemName(item->id); + if (category == CATEGORY_THROWN_LINE) { + if (brackets) { + if (colored) { + SprintfStatic__0200D634(name, &_02097F34, raw_name, item->quantity); + } else { + SprintfStatic__0200D634(name, &_02097F50, raw_name, item->quantity); + } + } else { + if (colored) { + SprintfStatic__0200D634(name, &_02097F58, raw_name); + } else { + SprintfStatic__0200D634(name, &_02097F68, raw_name); + } + } + } else if (category == CATEGORY_THROWN_ARC) { + if (brackets) { + if (colored) { + SprintfStatic__0200D634(name, &_02097F34, raw_name, item->quantity); + } else { + SprintfStatic__0200D634(name, &_02097F50, raw_name, item->quantity); + } + } else { + if (colored) { + SprintfStatic__0200D634(name, &_02097F58, raw_name); + } else { + SprintfStatic__0200D634(name, &_02097F68, raw_name); + } + } + } else if ((u8) (category + 0xF4) <= 2) { + if (colored) { + SprintfStatic__0200D634(name, &_02097F6C, raw_name); + } else { + strcpy(name, raw_name); + } + } else if (item->id == ITEM_POKE) { + MoneyQuantityToString__02023B30(money, GetMoneyQuantity(item)); + if (colored) { + SprintfStatic__0200D634(name, &_02097F7C, money); + } else { + SprintfStatic__0200D634(name, &_02097F90, money); + } + if (colored) { + SprintfStatic__0200D634(name, &_02097F7C, money); + } else { + SprintfStatic__0200D634(name, &_02097F90, money); + } + } else if (category == CATEGORY_EXCLUSIVE_ITEMS) { + if (colored) { + SprintfStatic__0200D634(name, &_02097F9C, raw_name); + } else { + strcpy(name, raw_name); + } + } else { + if (colored) { + SprintfStatic__0200D634(name, &_02097F58, raw_name); + } else { + strncpy(name, raw_name, 0x50); + } + } + if (ItemSticky(item->flags)) { + SprintfStatic__0200D634(buf, &_02097FAC, name); + strncpy(name, buf, 0x50); + sticky = TRUE; + } else if (forceBrackets) { + SprintfStatic__0200D634(buf, &_02097FB8, name); + strncpy(name, buf, 0x50); + } + if (a == NULL) { + strncpy(buf, name, 0x50); + } else { + if (a->field_0x4 != 0 && (item->flags & ITEM_FLAG_SET)) { + if (sticky) { + name[4] = '5'; + } else { + name[4] = '2'; + } + } + if (a->field_0x0 == 1 || a->field_0x0 == 3) { + if (item->flags & ITEM_FLAG_IN_SHOP) { + sub_0200D688(buf, name, item, a); + ret = TRUE; + } else { + strncpy(buf, name, 0x50); + } + } else { + sub_0200D688(buf, name, item, a); + } + } + return ret; +} + +void SprintfStatic__0200D634(u8 *buf, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vsprintf(buf, fmt, args); +} + +bool8 MaybeGetUncoloredFormattedItemName(u8 *buf, struct item *item, + struct unk_0209C850 *a) +{ + return MaybeGetFormattedItemName(buf, item, a, FALSE, FALSE); +} + +bool8 MaybeGetColoredFormattedItemName(u8 *buf, struct item *item, + struct unk_0209C850 *a) +{ + return MaybeGetFormattedItemName(buf, item, a, TRUE, FALSE); +} + +void sub_0200D688(u8 *buf, u8 *name, struct item *item, + struct unk_0209C850 *a) +{ + s32 price; + u8 numbuf[40]; + + if (a == NULL) { + strncpy(buf, name, 0x50); + return; + } + switch (a->field_0x0) { + case 1: + case 2: + price = GetDisplayedBuyPrice(item); + break; + case 3: + case 4: + price = GetDisplayedSellPrice(item); + break; + default: + price = 0; + break; + } + if (price == 0) { + strncpy(buf, name, 0x50); + return; + } + if (a->field_0x6 != 0) { + sub_0200D76C(price, numbuf, TRUE); + SprintfStatic__0200D634(buf, &_02097FC4, name, a->field_0x6, numbuf); + } else { + sub_0200D76C(price, numbuf, FALSE); + SprintfStatic__0200D634(buf, &_02097FE4, name, numbuf); + } +} diff --git a/src/main_0200D81C.c b/src/main_0200D81C.c index 3b8be333..34b466a8 100644 --- a/src/main_0200D81C.c +++ b/src/main_0200D81C.c @@ -1,8 +1,87 @@ #include "main_0200D81C.h" +extern u8* BAG_ITEMS_PTR_MIRROR[]; +extern s32 _02094D0C[]; + extern s32 MultiplyByFixedPoint(s32, s32); extern s32 MONEY_QUANTITY_TABLE[]; +s32 sub_0200D76C(s32 value, u8 *buf, bool8 pad) +{ +#ifdef JAPAN + s32 i; + s32 count; + int digit; + s32 seen; + const u8 *tail; + + seen = 0; + count = 0; + for (i = 0; i < 5; i++) { + digit = 0; + while (value >= _02094D0C[i]) { + value -= _02094D0C[i]; + digit++; + } + if (digit > 9) { + digit = 9; + } + if (digit != 0) { + seen = 1; + count++; + buf[0] = BAG_ITEMS_PTR_MIRROR[1][digit * 2]; + buf[1] = BAG_ITEMS_PTR_MIRROR[1][digit * 2 + 1]; + buf += 2; + } else if (seen) { + count++; + buf[0] = BAG_ITEMS_PTR_MIRROR[1][digit * 2]; + buf[1] = BAG_ITEMS_PTR_MIRROR[1][digit * 2 + 1]; + buf += 2; + } else if (pad) { + *buf++ = 0x7F; + } + } + tail = ((const u8 **)BAG_ITEMS_PTR_MIRROR)[1]; + buf[0] = tail[value * 2]; + buf[1] = tail[value * 2 + 1]; + buf[2] = 0; + return count + 1; +#else + s32 count; + s32 i; + s32 seen; + int digit; + u8 *digits; + + digits = BAG_ITEMS_PTR_MIRROR[1]; + seen = 0; + count = 0; + for (i = 0; i < 5; i++) { + digit = 0; + while (value >= _02094D0C[i]) { + value -= _02094D0C[i]; + digit++; + } + if (digit > 9) { + digit = 9; + } + if (digit != 0) { + seen = 1; + count++; + *buf++ = digits[digit]; + } else if (seen) { + count++; + *buf++ = digits[digit]; + } else if (pad) { + *buf++ = 0x7F; + } + } + buf[0] = digits[value]; + buf[1] = 0; + return count + 1; +#endif +} + void ItemZInit(struct item* item) { item->id = 0; diff --git a/src/main_0203D538.c b/src/main_0203D538.c index c54c75d9..e9e10725 100644 --- a/src/main_0203D538.c +++ b/src/main_0203D538.c @@ -68,7 +68,6 @@ struct unk_020AFE74 { extern struct unk_020AFE74 *MISSION_REWARD_STRUCT_MAIN_PTR; -extern void MaybeGetColoredFormattedItemName(void*, struct item*, void*); extern void GetNameWithGender(char *dst, s16 monster_id, char color_id); extern void GetNameRaw(unsigned char *, s32); extern void InitPreprocessorArgs(struct preprocessor_args* args); @@ -105,7 +104,7 @@ extern void ov11_02310BDC(void); extern const u8 _0209C844[2]; extern const u16 _0209C846[4]; -extern s32 _0209C850; +extern struct unk_0209C850 _0209C850; extern WindowTemplate _0209C85C; extern struct unk_0202A5CC _0209C86C[]; extern s32 _0209C884; diff --git a/src/main_020504A4.c b/src/main_020504A4.c index c0f52d85..35112c1d 100644 --- a/src/main_020504A4.c +++ b/src/main_020504A4.c @@ -1,7 +1,367 @@ #include "main_020504A4.h" #include "adventure_log.h" +#include "main_0200330C.h" +#include "main_0202593C.h" +#include "main_020251AC.h" +#include "main_020517D4.h" +#include "progression.h" + +struct unk_022AB918 { +#ifdef JAPAN + u8 field_0x0[8]; +#else + u8 field_0x0[0xc]; +#endif + s32 field_0xc; + u8 field_0x10; +}; + +extern struct unk_022AB918 TEAM_NAME; +#ifdef JAPAN +extern u8 _022AB918[8]; +#else +extern u8 _022AB918[0xc]; +#endif +extern s32 _022AB924; +extern u8 CONVERSION2_TYPE_TABLE[]; + +extern void StrncpyName(char *dest, const char *src, u32 n); +extern void ComputeSpecialCounters(void); +extern void Copy16BitsTo(struct bitstream *stream, void *buf_write); +extern void Copy16BitsFrom(struct bitstream *stream, void *buf_read); u32 GetSentryDutyGamePoints(s32 index) { return ADVENTURE_LOG_PTR->sentry_duty_game_points[index]; } + +s32 SetSentryDutyGamePoints(u32 points) +{ + s16 i; + s16 j; + + for (i = 0; i < 5; i++) + { + if (points > ADVENTURE_LOG_PTR->sentry_duty_game_points[i]) + { + break; + } + } + if (i >= 5) + { + return -1; + } + for (j = 4; j > i; j--) + { + ADVENTURE_LOG_PTR->sentry_duty_game_points[j] = ADVENTURE_LOG_PTR->sentry_duty_game_points[j - 1]; + } + ADVENTURE_LOG_PTR->sentry_duty_game_points[i] = points; + return i; +} + +void CopyLogTo(struct bitstream *stream) +{ + ComputeSpecialCounters(); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_dungeons_cleared, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_friend_rescues, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_evolutions, 0x14); + CopyBitsTo(stream, ADVENTURE_LOG_PTR->completion_flags, 0x80); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->pokemon_joined_counter, 0xe); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->pokemon_battled_counter, 0xe); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->moves_learned_counter, 9); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_victories_on_one_floor, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_faints, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_eggs_hatched, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_big_treasure_wins, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_recycled, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_gifts_sent, 0x14); + CopyBitsTo(stream, ADVENTURE_LOG_PTR->pokemon_joined_flags, 0x4a0); + CopyBitsTo(stream, ADVENTURE_LOG_PTR->pokemon_battled_flags, 0x4a0); + CopyBitsTo(stream, ADVENTURE_LOG_PTR->moves_learned_flags, 0x220); + CopyBitsTo(stream, ADVENTURE_LOG_PTR->items_acquired_flags, 0x580); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->special_challenge_flags, 0x20); + CopyBitsTo(stream, ADVENTURE_LOG_PTR->sentry_duty_game_points, 0xa0); + Copy16BitsTo(stream, &ADVENTURE_LOG_PTR->current_floor); +} + +void CopyLogFrom(struct bitstream *stream) +{ + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_dungeons_cleared, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_friend_rescues, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_evolutions, 0x14); + CopyBitsFrom(stream, ADVENTURE_LOG_PTR->completion_flags, 0x80); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->pokemon_joined_counter, 0xe); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->pokemon_battled_counter, 0xe); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->moves_learned_counter, 9); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_victories_on_one_floor, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_faints, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_eggs_hatched, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_big_treasure_wins, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_recycled, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_gifts_sent, 0x14); + CopyBitsFrom(stream, ADVENTURE_LOG_PTR->pokemon_joined_flags, 0x4a0); + CopyBitsFrom(stream, ADVENTURE_LOG_PTR->pokemon_battled_flags, 0x4a0); + CopyBitsFrom(stream, ADVENTURE_LOG_PTR->moves_learned_flags, 0x220); + CopyBitsFrom(stream, ADVENTURE_LOG_PTR->items_acquired_flags, 0x580); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->special_challenge_flags, 0x20); + CopyBitsFrom(stream, ADVENTURE_LOG_PTR->sentry_duty_game_points, 0xa0); + Copy16BitsFrom(stream, &ADVENTURE_LOG_PTR->current_floor); +} + +void GetAbilityString(char *buf, s32 ability_id) +{ +#if defined(EUROPE) + CopyNStringFromId(buf, (u16)(ability_id + 0x35e0), 0x50); +#elif defined(JAPAN) + CopyNStringFromId(buf, (u16)(ability_id + 0x4881), 0x50); +#else + CopyNStringFromId(buf, (u16)(ability_id + 0x35de), 0x50); +#endif +} + +u16 GetAbilityDescStringId(s32 ability_id) +{ +#if defined(EUROPE) + return ability_id + 0x365c; +#elif defined(JAPAN) + return ability_id + 0x48fd; +#else + return ability_id + 0x365a; +#endif +} + +u16 GetTypeStringId(s32 type_id) +{ +#if defined(EUROPE) + return type_id + 0x35cd; +#elif defined(JAPAN) + return type_id + 0x486e; +#else + return type_id + 0x35cb; +#endif +} + +u8 GetConversion2ConvertToType(s32 type_id) +{ + return CONVERSION2_TYPE_TABLE[type_id]; +} + +void InitBitstreamForWrite(struct bitstream *stream, void *buf, s32 len) +{ + stream->ptr = buf; + stream->bit_idx = 0; + stream->bit_count = 0; + stream->end = (u32)buf + len; +} + +void InitBitstreamForRead(struct bitstream *stream, void *buf, s32 len) +{ + stream->ptr = buf; + stream->bit_idx = 0; + stream->bit_count = 0; + stream->end = (u32)buf + len; + MemZero(buf, len); +} + +void BitstreamDebug(struct bitstream *stream) +{ +} + +void CopyBitsTo(struct bitstream *stream, void *buf_write, s32 nbits) +{ + u8 *src = buf_write; + s32 bit = 0; + + while (nbits != 0) + { + nbits--; + if (*src & (1 << bit)) + { + *stream->ptr |= 1 << stream->bit_idx; + } + bit++; + if (bit == 8) + { + bit = 0; + src++; + } + stream->bit_idx++; + if (stream->bit_idx == 8) + { + stream->ptr++; + stream->bit_idx = 0; + } + stream->bit_count++; + } +} + +void CopyBitsFrom(struct bitstream *stream, void *buf_read, s32 nbits) +{ + u8 *dest = buf_read; + s32 bit = 0; + + while (nbits != 0) + { + if (bit == 0) + { + *dest = 0; + } + nbits--; + if (*stream->ptr & (1 << stream->bit_idx)) + { + *dest |= 1 << bit; + } + bit++; + if (bit == 8) + { + bit = 0; + dest++; + } + stream->bit_idx++; + if (stream->bit_idx == 8) + { + stream->ptr++; + stream->bit_idx = 0; + } + stream->bit_count++; + } +} + +void StoreDefaultTeamData(void) +{ + u8 buf[0x14]; + +#ifdef JAPAN + GetStringFromFileVeneer(buf, 0x4c5); + StrncpyName((char *)_022AB918, (const char *)buf, 5); +#else + GetStringFromFileVeneer(buf, 0x234); + StrncpyName((char *)_022AB918, (const char *)buf, 0xa); +#endif + TEAM_NAME.field_0xc = 0; + TEAM_NAME.field_0x10 = 0; +} + +void GetMainTeamNameWithCheck(u8 *buf) +{ + u8 name[0x40]; + + if (GetResolvedPerformanceProgressFlag(1) && TEAM_NAME.field_0x0[0] != 0) + { +#ifdef JAPAN + StrncpySimpleNoPad(buf, _022AB918, 5); +#else + StrncpySimpleNoPad(buf, _022AB918, 0xa); +#endif + } + else + { +#ifdef JAPAN + GetStringFromFileVeneer(name, 0x4c8); + StrncpyName((char *)buf, (const char *)name, 5); +#else + GetStringFromFileVeneer(name, 0x237); + StrncpyName((char *)buf, (const char *)name, 0xa); +#endif + } +} + +void GetMainTeamName(u8 *buf) +{ +#ifdef JAPAN + StrncpySimpleNoPadSafe(buf, TEAM_NAME.field_0x0, 5); +#else + StrncpySimpleNoPadSafe(buf, TEAM_NAME.field_0x0, 0xa); +#endif +} + +void SetMainTeamName(const u8 *name) +{ + s32 i; + +#ifdef JAPAN + for (i = 0; i < 5; i++) +#else + for (i = 0; i < 0xa; i++) +#endif + { + TEAM_NAME.field_0x0[i] = *name++; + } +} + +s32 GetRankupPoints(void) +{ + u8 rank = GetRank(); + + if (GetResolvedPerformanceProgressFlag(0x16)) + { + if (rank == 0xc) + { + return 0; + } + } + else if (rank >= 8) + { + return 0; + } + return GetRankUpEntry(rank)->field_0x4 - TEAM_NAME.field_0xc; +} + +void sub_02050C10(s32 points) +{ + TEAM_NAME.field_0xc += points; + if (GetResolvedPerformanceProgressFlag(0x16)) + { + if (TEAM_NAME.field_0xc > 99999999) + { + TEAM_NAME.field_0xc = 99999999; + } + } + else + { + s32 max = GetRankUpEntry(7)->field_0x4; + + if (TEAM_NAME.field_0xc > max) + { + TEAM_NAME.field_0xc = max; + } + } +} + +u8 GetRank(void) +{ + u8 rank = 0; + + while (rank < 0xc) + { + if (TEAM_NAME.field_0xc < GetRankUpEntry(rank)->field_0x4) + { + break; + } + rank++; + } + if (!GetResolvedPerformanceProgressFlag(0x16)) + { + if (rank > 8) + { + rank = 8; + } + } + return rank; +} + +u8 sub_02050CD0(void) +{ + u8 rank = GetRank(); + + if (rank > 8) + { + rank = 8; + } + return rank; +} + +s32 GetRankStorageSize(void) +{ + return GetRankUpEntry(GetRank())->field_0x8; +} diff --git a/src/main_02050CF8.c b/src/main_02050CF8.c new file mode 100644 index 00000000..caff01d6 --- /dev/null +++ b/src/main_02050CF8.c @@ -0,0 +1,40 @@ +#include "main_02050CF8.h" +#include "main_020504A4.h" +#include "progression.h" + +struct unk_022AB918 { +#ifdef JAPAN + u8 field_0x0[8]; +#else + u8 field_0x0[0xc]; +#endif + s32 field_0xc; + u8 field_0x10; +}; + +extern struct unk_022AB918 TEAM_NAME; +#ifdef JAPAN +extern u8 _022AB918[8]; +#else +extern u8 _022AB918[0xc]; +#endif +extern s32 _022AB924; +extern u8 ARM9_UNKNOWN_DATA__NA_209E6BC; +extern u8 _0209E6BD; + +s32 sub_02050CF8(void *buf, s32 len) +{ + struct bitstream stream; + + InitBitstreamForRead(&stream, buf, len); +#ifdef JAPAN + CopyBitsTo(&stream, _022AB918, 0x28); +#else + CopyBitsTo(&stream, _022AB918, 0x50); +#endif + CopyBitsTo(&stream, &_022AB924, 0x20); + TEAM_NAME.field_0x10 = GetResolvedPerformanceProgressFlag(1); + CopyBitsTo(&stream, TEAM_NAME.field_0x10 ? &ARM9_UNKNOWN_DATA__NA_209E6BC : &_0209E6BD, 1); + BitstreamDebug(&stream); + return stream.bit_idx; +} diff --git a/src/main_02050D84.c b/src/main_02050D84.c new file mode 100644 index 00000000..8d4b157b --- /dev/null +++ b/src/main_02050D84.c @@ -0,0 +1,41 @@ +#include "main_02050D84.h" +#include "main_020504A4.h" +#include "progression.h" + +struct unk_022AB918 { +#ifdef JAPAN + u8 field_0x0[8]; +#else + u8 field_0x0[0xc]; +#endif + s32 field_0xc; + u8 field_0x10; +}; + +extern struct unk_022AB918 TEAM_NAME; +#ifdef JAPAN +extern u8 _022AB918[8]; +#else +extern u8 _022AB918[0xc]; +#endif +extern s32 _022AB924; +extern u8 ARM9_UNKNOWN_DATA__NA_209E6BC; +extern u8 _0209E6BD; + +s32 sub_02050D84(void *buf, s32 len) +{ + u8 value; + struct bitstream stream; + + InitBitstreamForWrite(&stream, buf, len); +#ifdef JAPAN + CopyBitsFrom(&stream, _022AB918, 0x28); +#else + CopyBitsFrom(&stream, _022AB918, 0x50); +#endif + CopyBitsFrom(&stream, &_022AB924, 0x20); + CopyBitsFrom(&stream, &value, 1); + TEAM_NAME.field_0x10 = (value & 1) != FALSE; + BitstreamDebug(&stream); + return stream.bit_idx; +} diff --git a/src/main_02051FF0.c b/src/main_02051FF0.c index 68db72e8..e143e1be 100644 --- a/src/main_02051FF0.c +++ b/src/main_02051FF0.c @@ -1,16 +1,65 @@ #include "main_02051FF0.h" +#include "main_020526EC.h" #include "main_02008BD4.h" #include "main_02001188.h" +#include "main_0202593C.h" +#include "monster_data.h" +#include "ground_bg.h" +#include -extern void LoadFileFromRom(struct iovec *handle, u32 fileId, s32 param2); +extern void LoadFileFromRom(struct iovec *iov, const char *filepath, u32 flags); extern s32 GetAtSize(void *data); extern void DecompressAtNormalVeneer(void *dest, u32 size, void *src); +extern void LoadM2nAndN2m(void); +extern s16 GetBaseForm(s16 id); +extern u8 *strncpy(u8 *dst, const u8 *src, u32 n); +extern s32 vsprintf(u8 *str, const u8 *format, va_list ap); -s32 sub_02051FF0(u32 fileId, void **outPtr, s32 param2) +extern const char _020A31B8[]; +extern const char _020A31D4[]; +extern const char _020A31E4[]; +extern const char _020A31F4[]; +extern const char _020A31FC[]; +#ifdef JAPAN +extern const char _020A45C8_JP[]; +#endif +extern const char *const UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE[28]; +extern const RGB_Array ARM9_UNKNOWN_PTR__NA_20A2C84; + +struct unk_020B09B0_sub { + u8 field_0x0[0x10]; + u32 field_0x10; + u8 field_0x14[4]; +}; + +struct unk_020B09B0_job { + s32 field_0x0; + void *field_0x4; + s32 field_0x8; + s32 field_0xc; + s32 field_0x10; +}; + +struct unk_020B09B0 { + struct unk_020B09B0_sub field_0x0[2][2]; + struct unk_020B09B0_job field_0x60[16]; + s16 field_0x1a0; + u8 field_0x1a2[0x1cc - 0x1a2]; + struct UnkStruct_2324CBC_Sub98 field_0x1cc[2]; +}; + +extern struct unk_020B09B0 *_020B09B0; + +extern void sub_02051804(struct unk_020B09B0_job *jobs, u32 a, const void *b, + s32 c, s32 d, u32 e); +extern void sub_02051D8C(s16 a, s32 b, u16 c, s32 d, s32 e); +extern void sub_02051E60(s32 a, s32 b); + +s32 sub_02051FF0(const char *path, void **outPtr, s32 param2) { struct iovec handle; - LoadFileFromRom(&handle, fileId, param2); + LoadFileFromRom(&handle, path, param2); s32 size = GetAtSize(handle.iov_base); @@ -28,3 +77,67 @@ s32 sub_02051FF0(u32 fileId, void **outPtr, s32 param2) return size; } + +void sub_02052060(const char *path, u32 a1, s32 a2, s32 a3, s32 a4, s32 a5) +{ + struct unk_02052060 *hdr; + RGB_Array rgb; + RGB_Array tmp; + RGB_Array color; + s32 sy; + u32 row; + u8 *map; + u16 n; + u16 limit; + u8 *data; + s32 size; + u16 i; + s32 k; + s32 x; + s32 y; + u32 dst; + const u8 *src; + + dst = _020B09B0->field_0x0[a5][a4].field_0x10; + size = sub_02051FF0(path, (void **)&hdr, 0xF); + data = (u8 *)hdr; + sub_02051804(_020B09B0->field_0x60, dst + a1, data + hdr->field_0x8, size, 0, 0); + sub_02051804(_020B09B0->field_0x60, 0, data, 0, 1, 0); + + map = data + hdr->field_0x10; + limit = 0x20 - a2; + y = a2; + for (i = 0; i < limit; i++, y++) { + row = (u32)(map + y * 64); + sy = (s16)y; + x = 0; + for (n = 0; n < 0x20; n++) { + u32 v = *(u16 *)((x << 1) + row); + v = (u16)((u16)(v & 0xFFF) + (a1 >> 5)) | + (u16)((a3 + ((v << 4) >> 16)) << 12); + sub_02051D8C(x, sy, v, + a4, a5); + x++; + } + } + sub_02051E60(a4, a5); + + src = data + hdr->field_0x0; + k = 0; + color = ARM9_UNKNOWN_PTR__NA_20A2C84; + for (; k < hdr->field_0x4 / 4; k++, src += 4) { + s32 id; + + tmp = color; + tmp.c[0] = src[0]; + tmp.c[1] = src[1]; + tmp.c[2] = src[2]; + tmp.c[3] = src[3]; + rgb = tmp; + id = k + a3 * 16; + if (id >= 0x100) + break; + CopyColorToPaletteDataRgba(&_020B09B0->field_0x1cc[a5], (u16)(s16)id, &rgb); + } + MarkPaletteDataAsNeedingUpdate(&_020B09B0->field_0x1cc[a5]); +} diff --git a/src/main_020526EC.c b/src/main_020526EC.c index d6a4f347..178210bd 100644 --- a/src/main_020526EC.c +++ b/src/main_020526EC.c @@ -1,22 +1,296 @@ #include "main_020526EC.h" +#include "main_02051FF0.h" +#include "main_02008BD4.h" +#include "main_02001188.h" +#include "main_0202593C.h" #include "monster_data.h" +#include "ground_bg.h" +#include + +extern void LoadFileFromRom(struct iovec *iov, const char *filepath, u32 flags); +extern s32 GetAtSize(void *data); +extern void DecompressAtNormalVeneer(void *dest, u32 size, void *src); +extern void LoadM2nAndN2m(void); +extern s16 GetBaseForm(s16 id); +extern u8 *strncpy(u8 *dst, const u8 *src, u32 n); +extern s32 vsprintf(u8 *str, const u8 *format, va_list ap); + +extern const char _020A31B8[]; +extern const char _020A31D4[]; +extern const char _020A31E4[]; +extern const char _020A31F4[]; +extern const char _020A31FC[]; +#ifdef JAPAN +extern const char _020A45C8_JP[]; +#endif +extern const char *const UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE[28]; +extern const RGB_Array ARM9_UNKNOWN_PTR__NA_20A2C84; + +struct unk_020B09B0_sub { + u8 field_0x0[0x10]; + u32 field_0x10; + u8 field_0x14[4]; +}; + +struct unk_020B09B0_job { + s32 field_0x0; + void *field_0x4; + s32 field_0x8; + s32 field_0xc; + s32 field_0x10; +}; + +struct unk_020B09B0 { + struct unk_020B09B0_sub field_0x0[2][2]; + struct unk_020B09B0_job field_0x60[16]; + s16 field_0x1a0; + u8 field_0x1a2[0x1cc - 0x1a2]; + struct UnkStruct_2324CBC_Sub98 field_0x1cc[2]; +}; + +extern struct unk_020B09B0 *_020B09B0; + +extern void sub_02051804(struct unk_020B09B0_job *jobs, u32 a, const void *b, + s32 c, s32 d, u32 e); +extern void sub_02051D8C(s16 a, s16 b, u16 c, s32 d, s32 e); +extern void sub_02051E60(s32 a, s32 b); + +void sub_020522F0(const char *path, struct unk_020522F0 *state, s32 param2) +{ + u8 *data; + + state->field_0x8 = sub_02051FF0(path, (void **)&state->field_0x0, param2); + data = (u8 *)state->field_0x0; + state->field_0x4 = data + state->field_0x0->field_0x8; + state->field_0xc = data + state->field_0x0->field_0x10; + state->field_0x10 = data + state->field_0x0->field_0x0; +} + +void sub_02052334(struct unk_020522F0 *state) +{ + if (state->field_0x0 != NULL) { + MemFree(state->field_0x0); + state->field_0x0 = NULL; + } +} + +void LoadMonsterMd(void) +{ + LoadFileFromRom(&MONSTER_DATA_TABLE_PTR.field_0xc, _020A31B8, 0); + LoadM2nAndN2m(); +#ifdef EUROPE + MONSTER_DATA_TABLE_PTR.field_0x8 = MONSTER_DATA_TABLE_PTR.field_0xc.iov_base; + MONSTER_DATA_TABLE_PTR.field_0x0 = &MONSTER_DATA_TABLE_PTR.field_0x8->table; +#else + MONSTER_DATA_TABLE_PTR.field_0x4 = MONSTER_DATA_TABLE_PTR.field_0xc.iov_base; + MONSTER_DATA_TABLE_PTR.field_0x0 = &MONSTER_DATA_TABLE_PTR.field_0x4->table; +#endif +} + +void GetNameRaw(u8 *dest, s32 monster_id) +{ +#ifdef EUROPE + strncpy(dest, StringFromId((u16)(monster_id % 600 + 0x2221)), 20); +#elif JAPAN + strncpy(dest, StringFromId((u16)(monster_id % 600 + 0x1590)), 20); +#else + strncpy(dest, StringFromId((u16)(monster_id % 600 + 0x221F)), 20); +#endif +} + +void GetName(char *dest, enum monster_id monster_id, char color_id) +{ +#ifdef EUROPE + SprintfStatic__02052418(dest, _020A31D4, color_id, + StringFromId((u16)(monster_id % 600 + 0x2221))); +#elif JAPAN + SprintfStatic__02052418(dest, _020A31D4, color_id, + StringFromId((u16)(monster_id % 600 + 0x1590))); +#else + SprintfStatic__02052418(dest, _020A31D4, color_id, + StringFromId((u16)(monster_id % 600 + 0x221F))); +#endif +} + +void SprintfStatic__02052418(char *dest, const char *format, ...) +{ + va_list args; + va_start(args, format); + vsprintf(dest, format, args); +} + +void GetNameWithGender(char *dest, s16 monster_id, char color_id) +{ +#ifdef EUROPE + u8 *name = StringFromId((u16)(monster_id % 600 + 0x2221)); +#elif JAPAN + u8 *name = StringFromId((u16)(monster_id % 600 + 0x1590)); +#else + u8 *name = StringFromId((u16)(monster_id % 600 + 0x221F)); +#endif + + if (MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].gender == 3 || + monster_id == MONSTER_NIDORAN_F || monster_id == MONSTER_NIDORAN_M) { + SprintfStatic__02052418(dest, _020A31D4, color_id, name); + } +#ifdef JAPAN + else if (MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].gender == 2) { + SprintfStatic__02052418(dest, _020A31E4, color_id, name); + } + else { + SprintfStatic__02052418(dest, _020A45C8_JP, color_id, name); + } +#else + else if (MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].gender == 2) { + SprintfStatic__02052418(dest, _020A31E4, color_id, name, 0xBE); + } + else { + SprintfStatic__02052418(dest, _020A31E4, color_id, name, 0xBD); + } +#endif +} + +void GetSpeciesString(char *dest, s16 monster_id) +{ + s32 idx; + + if (GetBaseForm(monster_id) == MONSTER_UNOWN_A) { + if (monster_id == MONSTER_UNOWN_B) { + idx = 1; + } + else if (monster_id == MONSTER_UNOWN_C) { + idx = 2; + } + else if (monster_id == MONSTER_UNOWN_D) { + idx = 3; + } + else if (monster_id == MONSTER_UNOWN_E) { + idx = 4; + } + else if (monster_id == MONSTER_UNOWN_F) { + idx = 5; + } + else if (monster_id == MONSTER_UNOWN_G) { + idx = 6; + } + else if (monster_id == MONSTER_UNOWN_H) { + idx = 7; + } + else if (monster_id == MONSTER_UNOWN_I) { + idx = 8; + } + else if (monster_id == MONSTER_UNOWN_J) { + idx = 9; + } + else if (monster_id == MONSTER_UNOWN_K) { + idx = 10; + } + else if (monster_id == MONSTER_UNOWN_L) { + idx = 11; + } + else if (monster_id == MONSTER_UNOWN_M) { + idx = 12; + } + else if (monster_id == MONSTER_UNOWN_N) { + idx = 13; + } + else if (monster_id == MONSTER_UNOWN_O) { + idx = 14; + } + else if (monster_id == MONSTER_UNOWN_P) { + idx = 15; + } + else if (monster_id == MONSTER_UNOWN_Q) { + idx = 16; + } + else if (monster_id == MONSTER_UNOWN_R) { + idx = 17; + } + else if (monster_id == MONSTER_UNOWN_S) { + idx = 18; + } + else if (monster_id == MONSTER_UNOWN_T) { + idx = 19; + } + else if (monster_id == MONSTER_UNOWN_U) { + idx = 20; + } + else if (monster_id == MONSTER_UNOWN_V) { + idx = 21; + } + else if (monster_id == MONSTER_UNOWN_W) { + idx = 22; + } + else if (monster_id == MONSTER_UNOWN_X) { + idx = 23; + } + else if (monster_id == MONSTER_UNOWN_Y) { + idx = 24; + } + else if (monster_id == MONSTER_UNOWN_Z) { + idx = 25; + } + else if (monster_id == MONSTER_UNOWN_EXCLAMATION) { + idx = 26; + } + else if (monster_id == MONSTER_UNOWN_QUESTION) { + idx = 27; + } + else { + idx = 0; + } +#ifdef EUROPE + SprintfStatic__02052418(dest, _020A31F4, StringFromId(0x22EA), + UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE[idx]); +#elif JAPAN + SprintfStatic__02052418(dest, _020A31F4, StringFromId(0x1659), + UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE[idx]); +#else + SprintfStatic__02052418(dest, _020A31F4, StringFromId(0x22E8), + UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE[idx]); +#endif + } + else { +#ifdef EUROPE + SprintfStatic__02052418(dest, _020A31FC, + StringFromId((u16)(monster_id % 600 + 0x2221))); +#elif JAPAN + SprintfStatic__02052418(dest, _020A31FC, + StringFromId((u16)(monster_id % 600 + 0x1590))); +#else + SprintfStatic__02052418(dest, _020A31FC, + StringFromId((u16)(monster_id % 600 + 0x221F))); +#endif + } +} + +const u8* GetNameString(enum monster_id monster_id) +{ +#ifdef EUROPE + return StringFromId((u16)(monster_id % 600 + 0x2221)); +#elif JAPAN + return StringFromId((u16)(monster_id % 600 + 0x1590)); +#else + return StringFromId((u16)(monster_id % 600 + 0x221F)); +#endif +} u16 GetSpriteIndex__020526EC(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].sprite_index; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].sprite_index; } u16 GetSpriteIndex__02052708(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].sprite_index; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].sprite_index; } u16 GetSpriteIndex__02052724(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].sprite_index; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].sprite_index; } s16 GetDexNumber(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].pokedex_number; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].pokedex_number; } diff --git a/src/main_020527A8.c b/src/main_020527A8.c index 0dbcaf9b..8cafb59e 100644 --- a/src/main_020527A8.c +++ b/src/main_020527A8.c @@ -3,12 +3,12 @@ u8 GetMonsterGender(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].gender; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].gender; } u8 GetBodySize(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].body_size; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].body_size; } u8 GetSpriteSize(s16 monster_id) diff --git a/src/main_0205283C.c b/src/main_0205283C.c index 46a8082f..4e74a08e 100644 --- a/src/main_0205283C.c +++ b/src/main_0205283C.c @@ -3,108 +3,108 @@ u8 GetShadowSize(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].shadow_size; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].shadow_size; } s16 GetSpeedStatus(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].base_movement_speed; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].base_movement_speed; } enum mobility_type GetMobilityType(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].movement_type; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].movement_type; } u8 GetRegenSpeed(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].hp_regeneration << 1; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].hp_regeneration << 1; } bool8 GetCanMoveFlag(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].flags & 0b00010000 ? TRUE : FALSE; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].flags & 0b00010000 ? TRUE : FALSE; } u8 GetChanceAsleep(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].spawn_asleep_chance; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].spawn_asleep_chance; } u16 GetWeightMultiplier(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].weight; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].weight; } u16 GetSize(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].size; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].size; } u16 GetBaseHp(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].base_hp; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].base_hp; } bool8 CanThrowItems(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].flags & 0b00100000 ? TRUE : FALSE; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].flags & 0b00100000 ? TRUE : FALSE; } bool8 CanEvolve(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].flags & 0b01000000 ? TRUE : FALSE; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].flags & 0b01000000 ? TRUE : FALSE; } s16 GetMonsterPreEvolution(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].evolution_param.pre_evolution_idx; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].evolution_param.pre_evolution_idx; } u8 GetBaseOffensiveStat(s16 monster_id, u8 stat_idx) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].base_atk[stat_idx]; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].base_atk[stat_idx]; } u8 GetBaseDefensiveStat(s16 monster_id, u8 stat_idx) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].base_def[stat_idx]; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].base_def[stat_idx]; } enum type_id GetType(s16 monster_id, u8 type_idx) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].types[type_idx]; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].types[type_idx]; } enum ability_id GetAbility(s16 monster_id, u8 ability_idx) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].abilities[ability_idx]; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].abilities[ability_idx]; } s16 GetRecruitRate2(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].recruit_rate_2; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].recruit_rate_2; } s16 GetRecruitRate1(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].recruit_rate_1; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].recruit_rate_1; } s32 GetExp(s16 monster_id, s32 level) { - s16 exp_yield = MONSTER_DATA_TABLE_PTR->entries[monster_id].exp_yield; + s16 exp_yield = MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].exp_yield; return exp_yield + exp_yield * (level - 1) / 10; } void GetEvoParameters(struct monster_evolution_parameters *evo_params, s16 monster_id) { - *evo_params = MONSTER_DATA_TABLE_PTR->entries[monster_id].evolution_param; + *evo_params = MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].evolution_param; } void GetTreasureBoxChances(s16 monster_id, s16 *chances) { s16 i; for (i = 0; i < 4; i++) - chances[i] = (&MONSTER_DATA_TABLE_PTR->entries[monster_id].unk_0x3c)[i]; + chances[i] = (&MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].unk_0x3c)[i]; } diff --git a/src/main_02052B28.c b/src/main_02052B28.c index 1858267d..f2c5a0a4 100644 --- a/src/main_02052B28.c +++ b/src/main_02052B28.c @@ -3,20 +3,20 @@ s32 GetIqGroup(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].iq_group; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].iq_group; } u8 GetSpawnThreshold(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].spawn_threshold; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].spawn_threshold; } bool8 NeedsItemToSpawn(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].flags & 0b10000000 ? TRUE : FALSE; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].flags & 0b10000000 ? TRUE : FALSE; } s16 GetExclusiveItem(s16 monster_id, s32 item_index) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].exclusive_item[item_index % 4]; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].exclusive_item[item_index % 4]; } diff --git a/src/main_02055770.c b/src/main_02055770.c index c1f134f9..5798e845 100644 --- a/src/main_02055770.c +++ b/src/main_02055770.c @@ -112,3 +112,41 @@ s16 GetFirstEmptyMemberIdx(s16 monster_id) } return -1; } + +void sub_020559D8(s16 *idxs) +{ + struct ground_monster *m = TEAM_MEMBER_TABLE_PTR->members; + s32 i; + struct ground_monster *dst; + s32 j; + for (i = 0; i < 5; i++, m++) { + bool8 valid = (m->is_valid & 1) != 0; + if (valid) { + idxs[i] = i; + } else { + idxs[i] = -1; + } + } + for (; i < MAX_GROUND_TEAM_MEMBERS; i++, m++) { + bool8 valid = (m->is_valid & 1) != 0; + if (!valid) { + idxs[i] = -1; + dst = m; + j = i; + for (m++, i++; i < MAX_GROUND_TEAM_MEMBERS; i++, m++) { + bool8 v = (m->is_valid & 1) != 0; + if (v) { + *dst++ = *m; + idxs[i] = j++; + } else { + idxs[i] = -1; + } + } + for (; j < MAX_GROUND_TEAM_MEMBERS; j++) { + dst++->is_valid = 0; + } + return; + } + idxs[i] = i; + } +} diff --git a/src/number_util.c b/src/number_util.c index fb5909e2..fcfa194d 100644 --- a/src/number_util.c +++ b/src/number_util.c @@ -1,4 +1,41 @@ #include "number_util.h" +#include "main_020504A4.h" + +void ResetPlayTimer(struct unk_022AB694 *timer) +{ + timer->field_0x4 = 0; + timer->field_0x0 = 0; +} + +void PlayTimerTick(struct unk_022AB694 *timer) +{ + if (++timer->field_0x4 < 60) + { + return; + } + timer->field_0x4 = 0; + if (timer->field_0x0 < 0x22550ff) + { + timer->field_0x0++; + } +} + +s32 GetPlayTimeSeconds(struct unk_022AB694 *timer) +{ + return timer->field_0x0; +} + +void sub_02050E5C(struct unk_022AB694 *timer, struct bitstream *stream) +{ + CopyBitsTo(stream, &timer->field_0x4, 6); + CopyBitsTo(stream, &timer->field_0x0, 0x20); +} + +void sub_02050E8C(struct unk_022AB694 *timer, struct bitstream *stream) +{ + CopyBitsFrom(stream, &timer->field_0x4, 6); + CopyBitsFrom(stream, &timer->field_0x0, 0x20); +} extern void CopyBitsTo(struct bitstream *stream, void *buf_write, s32 nbits); extern void CopyBitsFrom(struct bitstream *stream, void *buf_read, s32 nbits); diff --git a/src/overlay_29_023047B8.c b/src/overlay_29_023047B8.c index 2dec1cdb..ab833af6 100644 --- a/src/overlay_29_023047B8.c +++ b/src/overlay_29_023047B8.c @@ -17,6 +17,7 @@ #include "overlay_29_02311010.h" #include "position_util.h" #include "secondary_terrain_types.h" +#include "overlay_29_02320764.h" extern struct dungeon *DUNGEON_PTR[2]; extern const u8 ov29_02352808[4]; @@ -32,7 +33,6 @@ extern void HandleShopTransaction(s32 a); extern void ov29_02346888(void); extern void ActivateTerrainEffects(struct entity *entity); extern void ov29_022EF9BC(void); -extern void EnsureCanStandCurrentTile(struct entity *entity); extern void EnemyEvolution(struct entity *entity); extern void CheckLeaderTile(void); extern void IsFloorOver2(void); diff --git a/src/overlay_29_0230A9DC.c b/src/overlay_29_0230A9DC.c index 2cc3b176..975eadc4 100644 --- a/src/overlay_29_0230A9DC.c +++ b/src/overlay_29_0230A9DC.c @@ -6,8 +6,8 @@ #include "overlay_29_0230A994.h" #include "enums.h" +#include "overlay_29_02320764.h" extern bool8 DungeonRandOutcome__022EAB20(s32 percentChance); -extern void TryAftermathExplosion(struct entity *attacker, struct entity *defender, struct position *pos, s32 radius, s32 a, s32 damage_source); extern const s16 AFTERMATH_CHANCE; bool8 ItemIsActive__0230A9DC(struct entity *entity, enum item_id item_id) { @@ -26,7 +26,7 @@ bool8 AftermathCheck(struct entity *attacker, struct entity *defender, s32 damag #endif && DungeonRandOutcome__022EAB20(AFTERMATH_CHANCE) && damage_source != DAMAGE_SOURCE_EXPLOSION) { - TryAftermathExplosion(attacker, defender, &defender->pos, 1, 0, DAMAGE_SOURCE_EXPLOSION); + TryAftermathExplosion(attacker, defender, &defender->pos, 1, TYPE_NONE, DAMAGE_SOURCE_EXPLOSION); return TRUE; } return FALSE; diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c index 53c211a9..764b6e3e 100644 --- a/src/overlay_29_0230BBAC.c +++ b/src/overlay_29_0230BBAC.c @@ -861,7 +861,7 @@ void CalcDamageFixed(struct entity *attacker, struct entity *defender, s32 fixed } } -void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s16 fixed_damage, +void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s32 fixed_damage, s32 a4, bool8 *out_flag, enum type_id attack_type, s16 damage_source, s32 a8, s32 a9, s32 a10) { diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index 870edcac..82a354fc 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -31,6 +31,7 @@ #include "overlay_29_023350D8.h" #include "dungeon_logic_4.h" #include "overlay_29_0230BBAC.h" +#include "overlay_29_02320764.h" extern s16 ov10_022C4BE4[20]; extern void ov29_0230FB30(struct entity *entity); @@ -60,17 +61,14 @@ extern void ov29_0230FB30(struct entity *entity); #ifdef EUROPE -extern bool8 ov29_022E34A8_EU(struct entity *entity); #endif extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); -extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern void ov29_022EA370(s32 a, s32 b); extern s32 ov29_022F2FE4(); -extern void EnsureCanStandCurrentTile(struct entity *entity); extern void ov29_022E543C(struct entity *entity); extern void ov29_022E53F0(struct entity *entity); extern void ov29_022F42F8(struct entity *entity); diff --git a/src/overlay_29_0231CBC8.c b/src/overlay_29_0231CBC8.c index b9e2a30e..139e2a61 100644 --- a/src/overlay_29_0231CBC8.c +++ b/src/overlay_29_0231CBC8.c @@ -18,6 +18,7 @@ #include "overlay_29_0230F8AC.h" #include "dungeon_logic_4.h" #include "overlay_29_0230BBAC.h" +#include "overlay_29_02320764.h" #ifdef JAPAN #define MESSAGE_BE6 0x925 @@ -42,7 +43,6 @@ #endif extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); -extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern void BoostIQ(struct entity *entity, s16 iq, bool8 a); extern void TryInflictInvisibleStatus(struct entity *user, struct entity *target); extern void TryInflictPetrifiedStatus(struct entity *user, struct entity *target); diff --git a/src/overlay_29_0231EDD8.c b/src/overlay_29_0231EDD8.c index 28d58763..c24d0808 100644 --- a/src/overlay_29_0231EDD8.c +++ b/src/overlay_29_0231EDD8.c @@ -20,6 +20,7 @@ #include "position_util.h" #include "util.h" #include "overlay_29_0230BBAC.h" +#include "overlay_29_02320764.h" #ifdef JAPAN #define MESSAGE_E45 0xB86 @@ -45,7 +46,6 @@ extern const s16 HURL_DAMAGE; extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); extern void ChangeMonsterAnimationToIdle(struct entity *monster, s32 direction); extern void MoveMonsterToPos(struct entity *entity, s32 x_pos, s32 y_pos, bool8 reset_prev_pos_fields); -extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern bool8 TwoTurnMoveForcedMiss(struct entity *target, struct move *move); extern void ov29_022E9298(struct position *pos, struct unk_022E9298 *bounds, bool8 a); extern bool8 CannotMoveToTile(struct entity *entity, struct position *pos); diff --git a/src/overlay_29_02320764.c b/src/overlay_29_02320764.c index b7e16cff..96799d40 100644 --- a/src/overlay_29_02320764.c +++ b/src/overlay_29_02320764.c @@ -1,5 +1,74 @@ #include "overlay_29_02320764.h" +#include "dg_object.h" +#include "dg_uty.h" +#include "dungeon.h" +#include "dungeon_ai_movement.h" +#include "dungeon_logic_3.h" +#include "dungeon_map_access.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_util_2.h" #include "dungeon_util_static.h" +#include "move_orb_effects.h" +#include "moves_1.h" +#include "weather.h" +#include "overlay_29_022E272C.h" +#include "overlay_29_022E4B8C.h" +#include "overlay_29_022E563C.h" +#include "overlay_29_022E99F0.h" +#include "overlay_29_022E9FC0.h" +#include "overlay_29_022EC7E8.h" +#include "overlay_29_0230558C.h" +#include "overlay_29_0230BBAC.h" +#include "overlay_29_023047B8.h" +#include "overlay_29_02321238.h" +#include "overlay_29_02336F4C.h" +#include "overlay_29_0234B340.h" +#include "overlay_29_02344088.h" + +#ifdef JAPAN +#define MESSAGE_BFB 0x93A +#define MESSAGE_BFC 0x93B +#define MESSAGE_DBF 0xAFF +#define MESSAGE_DC0 0xB00 +#define MESSAGE_E71 0xBB3 +#define MESSAGE_E72 0xBB4 +#define MESSAGE_E73 0xBB5 +#define MESSAGE_E74 0xBB6 +#define MESSAGE_E75 0xBB7 +#else +#define MESSAGE_BFB 0xBFB +#define MESSAGE_BFC 0xBFC +#define MESSAGE_DBF 0xDBF +#define MESSAGE_DC0 0xDC0 +#define MESSAGE_E71 0xE71 +#define MESSAGE_E72 0xE72 +#define MESSAGE_E73 0xE73 +#define MESSAGE_E74 0xE74 +#define MESSAGE_E75 0xE75 +#endif + +extern struct dungeon *DUNGEON_PTR[]; +extern u32 DUNGEON_FRAMES_PASSED; +extern struct position *ov29_023529B8[]; +extern s32 EXPLOSION_FIXED_DAMAGES[]; + +extern void RemoveGroundItem(struct position *pos, bool8 a); +extern void ov29_02336694(s32 x, s32 y); +extern void DetermineTileWalkableNeighbors(s32 x, s32 y); +extern void UpdateMinimap(void); +extern bool8 TwoTurnMoveForcedMiss(struct entity *target, struct move *move); +extern void TryInflictPetrifiedStatus(struct entity *user, struct entity *target); +extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); +extern bool8 GetRandomTile(struct position *out, bool8 a); +extern void MoveMonsterToPos(struct entity *entity, s32 x_pos, s32 y_pos, + bool8 reset_prev_pos_fields); +extern void UpdateCamera(s32 a); +extern bool8 CannotStandOnTile(struct entity *entity, struct position *pos); +extern bool8 CannotStandOnTileNoMonsterCheck(struct entity *entity, struct position *pos); +extern void ov29_022F42F8(struct entity *entity); +extern void DiscoverMinimap(struct position *pos); +extern void HandleShopTransaction(s32 a); +extern void ActivateTerrainEffects(struct entity *entity); bool8 EntityIsValid__02320764(struct entity *entity) { @@ -8,3 +77,363 @@ bool8 EntityIsValid__02320764(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +void TryAftermathExplosion(struct entity *attacker, struct entity *defender, + struct position *pos, s32 idx, enum type_id attack_type, + s16 damage_source) +{ + struct position tile_pos; + struct position *p; + struct tile *tile; + s32 i; + s32 dx; + s32 dy; + s32 x; + s32 y; + bool8 flag_a; + bool8 flag_b; + + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + struct entity *mon = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (EntityIsValid__02320764(mon) && AbilityIsActiveVeneer(mon, ABILITY_DAMP)) + break; + } + + if (i != DUNGEON_MAX_POKEMON) { + ov29_022E55F0(attacker, defender); + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BFC); + return; + } + + if (GetApparentWeather(defender) == WEATHER_RAIN) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BFC); + return; + } + + ov29_022E5560(attacker, defender, idx); + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BFB); + + flag_a = FALSE; + flag_b = FALSE; + for (p = ov29_023529B8[idx]; p->x != 0x63; p++) { + tile_pos.x = p->x + pos->x; + tile_pos.y = p->y + pos->y; + if (tile_pos.x < 0 || tile_pos.y < 0) + continue; + if (tile_pos.x >= DUNGEON_MAX_SIZE_X || tile_pos.y >= DUNGEON_MAX_SIZE_Y) + continue; + + tile = GetTileSafe(tile_pos.x, tile_pos.y); + if (tile_pos.x >= 1 && tile_pos.y >= 1 && tile_pos.x < DUNGEON_MAX_SIZE_X - 1 + && tile_pos.y < DUNGEON_MAX_SIZE_Y - 1) { + if (GetTerrainType(tile) == TERRAIN_TYPE_WALL + && !(tile->terrain_flags & TERRAIN_TYPE_IMPASSABLE_WALL)) { + tile->terrain_flags &= ~(TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + tile->terrain_flags |= TERRAIN_TYPE_NORMAL; + for (dy = -1; dy <= 1; dy++) { + for (dx = -1; dx <= 1; dx++) { + ov29_02336694(tile_pos.x + dx, tile_pos.y + dy); + } + } + flag_a = TRUE; + flag_b = TRUE; + } + } + + if (tile->object != NULL) { + if (tile->object != defender && GetEntityType(tile->object) == ENTITY_ITEM) + RemoveGroundItem(&tile_pos, FALSE); + flag_a = TRUE; + } + + if (tile->monster != NULL && tile->monster != defender + && GetEntityType(tile->monster) == ENTITY_MONSTER) { + CalcAftermathExplosionDamage(attacker, tile->monster, attack_type, damage_source, + EXPLOSION_FIXED_DAMAGES[idx]); + if (IsFloorOver()) + break; + } + } + + if (IsFloorOver()) + return; + + if (GetEntityType(defender) == ENTITY_MONSTER + && damage_source != DAMAGE_SOURCE_EXPLOSION) { + CalcAftermathExplosionDamage(attacker, defender, attack_type, damage_source, + EXPLOSION_FIXED_DAMAGES[idx]); + } + + if (flag_a) { + if (flag_b) { + for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { + for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { + DetermineTileWalkableNeighbors(x, y); + } + } + } + UpdateMinimap(); + UpdateTrapsVisibility(); + } +} + +void CalcExplosionDamage(struct entity *attacker, struct entity *defender, + enum type_id attack_type, s16 damage_source, s32 fixed_damage) +{ + struct monster *info; + struct move move; + bool8 flag; + s32 damage; + + if (!EntityIsValid__02320764(defender)) + return; + + info = GetEntInfo(defender); + InitMove(&move, MOVE_REGULAR_ATTACK); + if (TwoTurnMoveForcedMiss(defender, &move)) + return; + + if (!info->is_not_team_member) { + damage = info->hp / 2; + if (MonsterIsType(defender, TYPE_FIRE)) + damage /= 2; + if (damage < 1) + damage = 1; + } else { + damage = fixed_damage; + if (MonsterIsType(defender, TYPE_FIRE)) + damage /= 2; + } + + if (ExclusiveItemEffectIsActiveWithLogging(attacker, defender, TRUE, MESSAGE_DC0, + EXCLUSIVE_EFF_NO_EXPLOSION_DAMAGE)) { + damage = 1; + } else if (ExclusiveItemEffectIsActiveWithLogging(attacker, defender, TRUE, MESSAGE_DBF, + EXCLUSIVE_EFF_HALVED_EXPLOSION_DAMAGE)) { + damage /= 2; + } + + CalcDamageFixedNoCategory(attacker, defender, damage, 0, &flag, attack_type, + damage_source, 0, 0, 0); +} + +void CalcAftermathExplosionDamage(struct entity *attacker, struct entity *defender, + enum type_id attack_type, s16 damage_source, s32 fixed_damage) +{ + struct monster *info; + struct move move; + bool8 flag; + s32 damage; + + if (!EntityIsValid__02320764(defender)) + return; + + info = GetEntInfo(defender); + InitMove(&move, MOVE_REGULAR_ATTACK); + if (TwoTurnMoveForcedMiss(defender, &move)) + return; + + if (!info->is_not_team_member) { + damage = info->hp / 2; + if (MonsterIsType(defender, TYPE_FIRE)) + damage /= 2; + if (damage < 1) + damage = 1; + } else { + damage = fixed_damage; + if (MonsterIsType(defender, TYPE_FIRE)) + damage /= 2; + } + + if (ExclusiveItemEffectIsActiveWithLogging(attacker, defender, TRUE, MESSAGE_DC0, + EXCLUSIVE_EFF_NO_EXPLOSION_DAMAGE)) { + damage = 1; + } else if (ExclusiveItemEffectIsActiveWithLogging(attacker, defender, TRUE, MESSAGE_DBF, + EXCLUSIVE_EFF_HALVED_EXPLOSION_DAMAGE)) { + damage /= 2; + } + + if (damage >= info->hp) + damage = info->hp - 1; + if (damage < 0) + damage = 0; + + CalcDamageFixedNoCategory(attacker, defender, damage, 0, &flag, attack_type, + damage_source, 0, 0, 0); +} + +void TryWarp(struct entity *user, struct entity *target, s32 warp_type, + struct position *pos) +{ + struct position p; + struct monster *info; + bool8 flag; + bool8 blocked; + s32 direction; + + flag = FALSE; + info = GetEntInfo(target); + SubstitutePlaceholderStringTags(0, target, 0); + + if (user != target + && (user == NULL ? FALSE : (bool8)(GetEntityType(user) == ENTITY_MONSTER)) + && AbilityIsActiveVeneer(user, ABILITY_MOLD_BREAKER)) + blocked = FALSE; + else + blocked = AbilityIsActiveVeneer(target, ABILITY_SUCTION_CUPS); + + if (blocked) { + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E74); + return; + } + + if (!AreTileJumpsAllowed(DUNGEON_PTR[0]->gen_info.fixed_room_id)) { + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E72); + return; + } + + if (warp_type == 1 && DUNGEON_PTR[0]->gen_info.stairs_pos.x == target->pos.x + && DUNGEON_PTR[0]->gen_info.stairs_pos.y == target->pos.y) { + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E73); + TryInflictPetrifiedStatus(user, target); + return; + } + + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E71); + TryEndPetrifiedOrSleepStatus(target, target); + ov29_022E5650(user, target); + + if (ShouldDisplayEntityWrapper(target)) { + direction = info->action.direction; + while (TRUE) { + target->elevation += 0x800; + if (target->elevation >= 0xA000) + break; + if ((DUNGEON_FRAMES_PASSED & 3) == 0) { + direction = (direction + 1) & 7; + info->action.direction = direction; + ChangeMonsterAnimationToIdle(target, direction); + } + AdvanceFrame(0x22); + } + } + + switch (warp_type) { + default: + if (!GetRandomTile(&p, TRUE)) { + flag = TRUE; + p = target->pos; + } + break; + case 1: + if (!FindClosestUnoccupiedTileWithin2(&p, &DUNGEON_PTR[0]->gen_info.stairs_pos, + FALSE)) { + flag = TRUE; + p = target->pos; + } + break; + case 2: + if (!FindClosestUnoccupiedTileWithin2(&p, pos, FALSE)) { + flag = TRUE; + p = target->pos; + } + break; + case 3: + p = *pos; + break; + case 4: + if (!FindUnoccupiedTileWithin3(&p, &DUNGEON_PTR[0]->gen_info.stairs_pos, TRUE)) { + flag = TRUE; + p = target->pos; + } + break; + case 5: + if (!info->is_not_team_member && !info->is_team_leader) { + if (FindClosestUnoccupiedTileWithin2(&p, &GetLeader()->pos, FALSE)) + break; + } + if (!GetRandomTile(&p, TRUE)) { + flag = TRUE; + p = target->pos; + } + break; + } + + MoveMonsterToPos(target, p.x, p.y, TRUE); + UpdateEntityPixelPos(target, NULL); + sub_01FFB62C(target); + UpdateCamera(1); + + if (ShouldDisplayEntityWrapper(target)) { + direction = info->action.direction; + target->elevation = 0xA000; + while (TRUE) { + target->elevation -= 0x400; + if (target->elevation <= 0) + break; + if ((DUNGEON_FRAMES_PASSED & 3) == 0) { + direction = (direction + 1) & 7; + info->action.direction = direction; + ChangeMonsterAnimationToIdle(target, direction); + } + AdvanceFrame(0x22); + } + } + + target->elevation = 0; + AdvanceFrame(0x22); + + if (flag) + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E75); + + if (warp_type == 1) + TryInflictPetrifiedStatus(user, target); + + ov29_02321238(target); +} + +void EnsureCanStandCurrentTile(struct entity *entity) +{ + if (CannotStandOnTile(entity, &entity->pos)) + TryWarp(entity, entity, 5, NULL); +} + +void ov29_02321134(struct entity *entity) +{ + if (CannotStandOnTileNoMonsterCheck(entity, &entity->pos)) + TryWarp(entity, entity, 5, NULL); +} + +void ov29_02321164(struct entity *a, struct entity *b) +{ + if (CannotStandOnTile(b, &b->pos)) + TryWarp(a, b, 5, NULL); +} + +void ov29_0232119C(struct entity *entity, s32 a, s32 b) +{ + bool8 valid; + + if (entity == NULL) + valid = FALSE; + else + valid = GetEntityType(entity) != ENTITY_NOTHING; + + if (!valid) + return; + + if (a) + ChangeMonsterAnimationToIdle(entity, 8); + + if (GetEntInfo(entity)->is_team_leader) { + if (b) + ov29_022F42F8(entity); + DiscoverMinimap(&entity->pos); + HandleShopTransaction(0); + } + + ActivateTerrainEffects(entity); + ov29_02305814(entity, DUNGEON_PTR[0]->gen_info.force_create_monster_house); +} diff --git a/src/overlay_29_02321238.c b/src/overlay_29_02321238.c index e124a024..ac0ed258 100644 --- a/src/overlay_29_02321238.c +++ b/src/overlay_29_02321238.c @@ -1,6 +1,6 @@ #include "overlay_29_02321238.h" +#include "overlay_29_02320764.h" -extern void ov29_0232119C(struct entity *entity, s32 a, s32 b); void ov29_02321238(struct entity *entity) { diff --git a/src/overlay_29_02321274.c b/src/overlay_29_02321274.c index 52dd5fb8..434dc0d8 100644 --- a/src/overlay_29_02321274.c +++ b/src/overlay_29_02321274.c @@ -1,6 +1,6 @@ #include "overlay_29_02321274.h" +#include "overlay_29_02320764.h" -extern void ov29_0232119C(struct entity *entity, s32 a, s32 b); void ov29_02321274(struct entity *entity) { diff --git a/src/overlay_29_023296F8.c b/src/overlay_29_023296F8.c index 764762d2..c42bf013 100644 --- a/src/overlay_29_023296F8.c +++ b/src/overlay_29_023296F8.c @@ -1,5 +1,6 @@ #include "overlay_29_023296F8.h" #include "move_orb_effects.h" +#include "overlay_29_02320764.h" extern const struct StatIndex ATK_STAT_IDX; @@ -12,7 +13,6 @@ bool8 DoMoveBoostDefense2(struct entity* attacker, struct entity* defender, stru return TRUE; } -extern void TryWarp(struct entity *user, struct entity *target, s32, s32); bool8 DoMoveWarp(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id) { diff --git a/src/overlay_29_0232C560.c b/src/overlay_29_0232C560.c index 9be1fd93..ee51bb4c 100644 --- a/src/overlay_29_0232C560.c +++ b/src/overlay_29_0232C560.c @@ -1,6 +1,6 @@ #include "overlay_29_0232C560.h" +#include "overlay_29_02320764.h" -extern void TryWarp(struct entity *user, struct entity *target, s32, s32); bool8 DoMoveStayAway(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id) { From d27a73870ec66fc650c90f4923adc403d91b6571 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Tue, 15 Sep 2026 20:18:01 -0700 Subject: [PATCH 31/34] Decompile 28 more callees; clear 21 asm files entirely Clears asm/main_02003DB8.s, main_0200BC60.s, main_020276C0.s, main_020278C4.s, main_02048C5C.s, main_0204FA70.s, main_0205A340.s, main_0205B39C.s, main_0205B478.s and twelve overlay_29 files, with their .inc headers and main.lsf entries. sub_02048C5C lands in its own translation unit (extract_function.py -nm) rather than merging into src/main_02048BB4.c: at -O4,s MWCC inlines ReadStringSave when its body is visible in the same TU, which made the function 16 bytes too long and shifted every overlay anchored below it. Shared types corrected from the asm rather than from a guess: - dungeon.h: four u8 field_0x2cb0c..f -> one u32 field_0x2cb0c (retail emits ldr/str, not ldrb/strb) - window.h: struct unk_022A7A6C extended past 0xC; WindowBlock::unk24 u32 -> void * - main_02029A50.h: unkStruct_02029A50 gains u8 unk26 - dg_random.h includes dungeon_mode.h; struct unk_022E9298 moved verbatim into dungeon_range.h - sub_0205B0A0 retyped (void *) -> (s32) 26 stale call-site externs across 20 files replaced with includes. Several disagreed with the definition: sub_0205B39C was declared void(void*,void*) where it is u8*(const s8*,s32), and three files declared CalcStatusDuration with s32* where it takes const s16*. asm/main_bss_020B3380.s gains a zero-length alias _022AAE74_2 at the same address as _022AAE74. MWCC keys literal-pool entries on (symbol, addend) and dedups, so the two identical .word entries the target holds require two distinct C symbols; .space is untouched, so the layout is unchanged. Authored by Claude (Opus 5) under human direction. Every landed function was byte-compared against the assembly it replaced at object level before building (build-tools/landcheck.sh), then confirmed by matching builds in all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_02003DB8.inc | 18 -- asm/include/main_0200BC60.inc | 3 - asm/include/main_020276C0.inc | 12 -- asm/include/main_020278C4.inc | 5 - asm/include/main_0204FA70.inc | 2 - asm/include/main_0205A340.inc | 9 - asm/include/main_0205B39C.inc | 6 - asm/include/main_0205B478.inc | 5 - asm/include/overlay_29_022E9298.inc | 4 - asm/include/overlay_29_022E9488.inc | 9 - asm/include/overlay_29_022EAB50.inc | 5 - asm/include/overlay_29_022F740C.inc | 13 -- asm/include/overlay_29_022FF3F4.inc | 7 - asm/include/overlay_29_02301940.inc | 5 - asm/include/overlay_29_023026FC.inc | 21 --- asm/include/overlay_29_02307F4C.inc | 15 -- asm/include/overlay_29_0230ABF0.inc | 2 - asm/include/overlay_29_0230FB30.inc | 6 - asm/include/overlay_29_0231EA40.inc | 20 -- asm/include/overlay_29_0232C310.inc | 12 -- asm/main_02003DB8.s | 93 ---------- asm/main_0200BC60.s | 72 -------- asm/main_020276C0.s | 138 -------------- asm/main_020278C4.s | 123 ------------- asm/main_0204FA70.s | 89 --------- asm/main_0205A340.s | 77 -------- asm/main_0205B39C.s | 57 ------ asm/main_0205B478.s | 66 ------- asm/overlay_29_022E9298.s | 64 ------- asm/overlay_29_022E9488.s | 76 -------- asm/overlay_29_022EAB50.s | 56 ------ asm/overlay_29_022F740C.s | 152 --------------- asm/overlay_29_022FF3F4.s | 186 ------------------- asm/overlay_29_02301940.s | 79 -------- asm/overlay_29_023026FC.s | 243 ------------------------ asm/overlay_29_02307F4C.s | 243 ------------------------ asm/overlay_29_0230ABF0.s | 42 ----- asm/overlay_29_0230FB30.s | 37 ---- asm/overlay_29_0231EA40.s | 274 ---------------------------- asm/overlay_29_0232C310.s | 165 ----------------- include/dg_random.h | 2 + include/dungeon.h | 5 +- include/dungeon_range.h | 8 + include/dungeon_range_2.h | 1 + include/main_02003D2C.h | 2 + include/main_0200BC54.h | 12 +- include/main_02027648.h | 18 ++ include/main_020278A8.h | 2 + include/main_02029A50.h | 1 + include/main_0204FA24.h | 1 + include/main_0205A288.h | 3 + include/main_0205B354.h | 1 + include/main_0205B440.h | 13 ++ include/overlay_29_022F73B4.h | 2 + include/overlay_29_023018AC.h | 2 + include/overlay_29_023026CC.h | 1 + include/overlay_29_02307EF8.h | 1 + include/overlay_29_0230AB58.h | 2 + include/overlay_29_0230F8AC.h | 1 + include/overlay_29_0231E9F0.h | 1 + include/overlay_29_0232C300.h | 3 + include/status_checks.h | 1 + include/window.h | 7 +- main.lsf | 20 -- src/dg_random.c | 32 ++++ src/dungeon_range.c | 21 +++ src/dungeon_range_2.c | 39 ++++ src/main_02003D2C.c | 61 +++++++ src/main_0200BC54.c | 47 +++++ src/main_02027648.c | 85 +++++++++ src/main_020278A8.c | 84 +++++++++ src/main_0204FA24.c | 36 ++++ src/main_0205A288.c | 49 ++++- src/main_0205B354.c | 42 +++++ src/main_0205B440.c | 30 +++ src/overlay_29_022F73B4.c | 69 +++++++ src/overlay_29_023018AC.c | 45 +++++ src/overlay_29_023026CC.c | 149 +++++++++++++++ src/overlay_29_02307EF8.c | 155 ++++++++++++++++ src/overlay_29_0230AB58.c | 25 +++ src/overlay_29_0230F8AC.c | 34 ++++ src/overlay_29_0231E9F0.c | 147 +++++++++++++++ src/overlay_29_0232C300.c | 88 +++++++++ src/status_checks.c | 100 ++++++++++ 84 files changed, 1415 insertions(+), 2544 deletions(-) delete mode 100644 asm/include/main_02003DB8.inc delete mode 100644 asm/include/main_0200BC60.inc delete mode 100644 asm/include/main_020276C0.inc delete mode 100644 asm/include/main_020278C4.inc delete mode 100644 asm/include/main_0204FA70.inc delete mode 100644 asm/include/main_0205A340.inc delete mode 100644 asm/include/main_0205B39C.inc delete mode 100644 asm/include/main_0205B478.inc delete mode 100644 asm/include/overlay_29_022E9298.inc delete mode 100644 asm/include/overlay_29_022E9488.inc delete mode 100644 asm/include/overlay_29_022EAB50.inc delete mode 100644 asm/include/overlay_29_022F740C.inc delete mode 100644 asm/include/overlay_29_022FF3F4.inc delete mode 100644 asm/include/overlay_29_02301940.inc delete mode 100644 asm/include/overlay_29_023026FC.inc delete mode 100644 asm/include/overlay_29_02307F4C.inc delete mode 100644 asm/include/overlay_29_0230ABF0.inc delete mode 100644 asm/include/overlay_29_0230FB30.inc delete mode 100644 asm/include/overlay_29_0231EA40.inc delete mode 100644 asm/include/overlay_29_0232C310.inc delete mode 100644 asm/main_02003DB8.s delete mode 100644 asm/main_0200BC60.s delete mode 100644 asm/main_020276C0.s delete mode 100644 asm/main_020278C4.s delete mode 100644 asm/main_0204FA70.s delete mode 100644 asm/main_0205A340.s delete mode 100644 asm/main_0205B39C.s delete mode 100644 asm/main_0205B478.s delete mode 100644 asm/overlay_29_022E9298.s delete mode 100644 asm/overlay_29_022E9488.s delete mode 100644 asm/overlay_29_022EAB50.s delete mode 100644 asm/overlay_29_022F740C.s delete mode 100644 asm/overlay_29_022FF3F4.s delete mode 100644 asm/overlay_29_02301940.s delete mode 100644 asm/overlay_29_023026FC.s delete mode 100644 asm/overlay_29_02307F4C.s delete mode 100644 asm/overlay_29_0230ABF0.s delete mode 100644 asm/overlay_29_0230FB30.s delete mode 100644 asm/overlay_29_0231EA40.s delete mode 100644 asm/overlay_29_0232C310.s diff --git a/asm/include/main_02003DB8.inc b/asm/include/main_02003DB8.inc deleted file mode 100644 index 3bbf8c7f..00000000 --- a/asm/include/main_02003DB8.inc +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -.public _02092540 -.public _020AEF7C -.public _020AF050 -.public _020AF078 -.public Card_TerminateForPulledOut -.public Debug_Print0 -.public OS_SleepThread -.public OS_WaitIrq -.public sub_02002448 -.public sub_02002580 -.public sub_020025F8 -.public sub_02002824 -.public sub_020029B8 -.public sub_020081C8 -.public sub_020081F0 -.public sub_0200B76C -.public sub_020184A8 diff --git a/asm/include/main_0200BC60.inc b/asm/include/main_0200BC60.inc deleted file mode 100644 index 6fdfbd24..00000000 --- a/asm/include/main_0200BC60.inc +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once -.public sub_0200B928 -.public UpdateFadeStatus diff --git a/asm/include/main_020276C0.inc b/asm/include/main_020276C0.inc deleted file mode 100644 index dfc155e7..00000000 --- a/asm/include/main_020276C0.inc +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -.public _022A7A6C -.public _022A7A74 -.public _022A7B1C -.public GetPaletteBaseAddress__020278A8 -.public InitRender3dElement64 -.public InitWindowTrailer -.public MemAlloc -.public sub_020278C4 -.public sub_02027B1C -.public sub_02029A50 -.public WINDOW_LIST diff --git a/asm/include/main_020278C4.inc b/asm/include/main_020278C4.inc deleted file mode 100644 index 87a9aeb5..00000000 --- a/asm/include/main_020278C4.inc +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -.public _022A7A6C -.public _022A8990 -.public _022A8991 -.public WINDOW_LIST diff --git a/asm/include/main_0204FA70.inc b/asm/include/main_0204FA70.inc deleted file mode 100644 index d6d4130b..00000000 --- a/asm/include/main_0204FA70.inc +++ /dev/null @@ -1,2 +0,0 @@ -#pragma once -.public ADVENTURE_LOG_PTR diff --git a/asm/include/main_0205A340.inc b/asm/include/main_0205A340.inc deleted file mode 100644 index a148f4f0..00000000 --- a/asm/include/main_0205A340.inc +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -.public GetLvlUpEntry -.public GetNameString -.public StrcpyName -.public StrncmpSimple -.public StrncpyName -.public sub_02025304_JP -.public sub_02055CCC -.public sub_02055D7C diff --git a/asm/include/main_0205B39C.inc b/asm/include/main_0205B39C.inc deleted file mode 100644 index 891a82e0..00000000 --- a/asm/include/main_0205B39C.inc +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once -.public _020A353C -.public _020A3544 -.public _020A354C -.public AllocateTemp1024ByteBufferFromPool -.public strcat diff --git a/asm/include/main_0205B478.inc b/asm/include/main_0205B478.inc deleted file mode 100644 index 0eacbd29..00000000 --- a/asm/include/main_0205B478.inc +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -.public _020B0A54 -.public _022B57BC -.public MemsetSimple -.public sub_0204A198 diff --git a/asm/include/overlay_29_022E9298.inc b/asm/include/overlay_29_022E9298.inc deleted file mode 100644 index 50cf22d5..00000000 --- a/asm/include/overlay_29_022E9298.inc +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once -.public DUNGEON_PTR -.public GetTile -.public GetVisibilityRange diff --git a/asm/include/overlay_29_022E9488.inc b/asm/include/overlay_29_022E9488.inc deleted file mode 100644 index 074346e8..00000000 --- a/asm/include/overlay_29_022E9488.inc +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -.public AddSimpleObjToOam -.public DUNGEON_PTR -.public OBJ_GRAPHICS_CONTROLS_PTR -.public ov29_0237C888 -.public ov29_0237C88A -.public ov29_0237C88E -.public ov29_0237C890 -.public ov29_0237C892 diff --git a/asm/include/overlay_29_022EAB50.inc b/asm/include/overlay_29_022EAB50.inc deleted file mode 100644 index 72aedf28..00000000 --- a/asm/include/overlay_29_022EAB50.inc +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public DungeonRandRange -.public IqSkillIsEnabled -.public RoundUpDiv256 diff --git a/asm/include/overlay_29_022F740C.inc b/asm/include/overlay_29_022F740C.inc deleted file mode 100644 index 6b959c27..00000000 --- a/asm/include/overlay_29_022F740C.inc +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once -.public DirectoryFileMngr_GetDirectoryFileSize -.public DUNGEON_PTR -.public GendersEqualNotGenderless -.public GetMonsterGender -.public GetSpriteFileSize -.public GetSpriteIndex__020526EC -.public IsShaymin -.public LoadWanTableEntryFromPack -.public LoadWanTableEntryFromPackUseProvidedMemory -.public MemAlloc -.public ov29_0237C9B0 -.public WAN_TABLE diff --git a/asm/include/overlay_29_022FF3F4.inc b/asm/include/overlay_29_022FF3F4.inc deleted file mode 100644 index 3219ac80..00000000 --- a/asm/include/overlay_29_022FF3F4.inc +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once -.public EndTwoTurnMove -.public IsChargingTwoTurnMove -.public LogMessageByIdWithPopupCheckUser -.public SetActionUseMovePlayer -.public SetMonsterActionFields -.public SubstitutePlaceholderStringTags diff --git a/asm/include/overlay_29_02301940.inc b/asm/include/overlay_29_02301940.inc deleted file mode 100644 index c870c709..00000000 --- a/asm/include/overlay_29_02301940.inc +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -.public DefenderAbilityIsActive__02301A0C -.public GetApparentWeather -.public LogMessageByIdWithPopupCheckUserTarget -.public SubstitutePlaceholderStringTags diff --git a/asm/include/overlay_29_023026FC.inc b/asm/include/overlay_29_023026FC.inc deleted file mode 100644 index 5fc6af39..00000000 --- a/asm/include/overlay_29_023026FC.inc +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once -.public AllocateTemp1024ByteBufferFromPool -.public CreateTemporaryEntity -.public DUNGEON_PTR -.public DungeonGetSpriteIndex -.public DungeonRandInt -.public EntityIsValid__02302A38 -.public EvolveMonster -.public GetEvolutions -.public GetForcedLossReason -.public GetMessageLogPreprocessorArgs -.public GetUnlockedTacticFlags -.public IsExpEnabledInDungeon -.public IsOnMonsterSpawnList -.public LevelUp -.public LogMessageByIdWithPopup -.public ov29_02302C04 -.public ov29_02302CC8 -.public ov29_023527F8 -.public SetMessageLogPreprocessorArgsNumberVal -.public SetPreprocessorArgsStringToName diff --git a/asm/include/overlay_29_02307F4C.inc b/asm/include/overlay_29_02307F4C.inc deleted file mode 100644 index 6e6feca0..00000000 --- a/asm/include/overlay_29_02307F4C.inc +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once -.public AdvanceFrame -.public AnimationDelayOrSomething -.public DUNGEON_PTR -.public DungeonRandInt -.public DungeonRandRange -.public EntityIsValid__02307EF8 -.public GetMonsterIdToSpawn -.public GetTileAtEntity -.public GetTileSafe -.public MewSpawnCheck -.public MONSTER_HOUSE_MAX_MONSTER_SPAWNS -.public MultiplyByFixedPoint -.public ov10_022C4560 -.public SpawnMonster diff --git a/asm/include/overlay_29_0230ABF0.inc b/asm/include/overlay_29_0230ABF0.inc deleted file mode 100644 index b71568ee..00000000 --- a/asm/include/overlay_29_0230ABF0.inc +++ /dev/null @@ -1,2 +0,0 @@ -#pragma once -.public ExclusiveItemEffectIsActive__0230A9B8 diff --git a/asm/include/overlay_29_0230FB30.inc b/asm/include/overlay_29_0230FB30.inc deleted file mode 100644 index 196190d1..00000000 --- a/asm/include/overlay_29_0230FB30.inc +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once -.public LogMessageByIdWithPopupCheckUser -.public SubstitutePlaceholderStringTags -.public ov29_02344B9C -.public ov29_02347184 -.public ov29_023529A8 diff --git a/asm/include/overlay_29_0231EA40.inc b/asm/include/overlay_29_0231EA40.inc deleted file mode 100644 index e6b0a432..00000000 --- a/asm/include/overlay_29_0231EA40.inc +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once -.public DUNGEON_PTR -.public DetermineAllMonsterShadow -.public DetermineTileWalkableNeighbors -.public EnsureCanStandCurrentTile -.public EntityIsValid__0231EDD8 -.public FloorSecondaryTerrainIsChasm -.public GetTile -.public GetTileSafe -.public IsFullFloorFixedRoom -.public LogMessageByIdWithPopupCheckUser -.public StairsAlwaysReachable -.public UpdateMinimap -.public UpdateTrapsVisibility -.public ov29_022EA370 -.public ActivateTerrainEffects -.public ov29_02305814 -.public ov29_0233665C -.public ov29_0233785C -.public ov29_0233FB1C diff --git a/asm/include/overlay_29_0232C310.inc b/asm/include/overlay_29_0232C310.inc deleted file mode 100644 index 2a6fcbd9..00000000 --- a/asm/include/overlay_29_0232C310.inc +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -.public AddHeldItemToBag -.public DealDamage -.public DefenderAbilityIsActiveMoveEffects__0232BDD0 -.public DungeonRandOutcomeUserTargetInteraction -.public EntityIsValidMoveEffects__0232C500 -.public IsBagFull -.public ItemZInit -.public LogMessageByIdWithPopupCheckUserTarget -.public ov29_022F9EA0 -.public RemoveEquivItem -.public SubstitutePlaceholderStringTags diff --git a/asm/main_02003DB8.s b/asm/main_02003DB8.s deleted file mode 100644 index 26d66c22..00000000 --- a/asm/main_02003DB8.s +++ /dev/null @@ -1,93 +0,0 @@ - .include "asm/macros.inc" - .include "main_02003DB8.inc" - - .text - - arm_func_start HaltProcessDisp -HaltProcessDisp: ; 0x02003DB8 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r4, r0 - bl sub_02002580 - ldr r1, _02003EBC ; =_020AF078 - cmp r0, r1 - moveq r1, #1 - movne r1, #0 - ldr r0, _02003EC0 ; =_020AEF7C - and r2, r1, #0xff - ldrb r1, [r0, #0xf] - cmp r1, #0 - bne _02003E28 - mov r1, #1 - strb r1, [r0, #0xf] - cmp r2, #0 - beq _02003E24 - mov r6, #0 - ldr r5, _02003EC4 ; =_020AF050 - b _02003E14 -_02003E04: - mov r0, r6 - bl OS_SleepThread - mov r0, r5 - bl sub_020029B8 -_02003E14: - bl sub_020081F0 - cmp r0, #0 - beq _02003E04 - b _02003E28 -_02003E24: - bl sub_020081C8 -_02003E28: - mov r0, #1 - bl sub_02002824 - bl sub_020184A8 - ldr r0, _02003EC8 ; =_02092540 - mov r1, r4 - bl Debug_Print0 - cmp r4, #2 - bne _02003E9C - mov r0, #1 - bl sub_0200B76C - mov r7, #0 - mov r6, #1 - ldr r5, _02003EC0 ; =_020AEF7C - b _02003E7C -_02003E60: - ldrb r0, [r5, #0xd] - cmp r0, #0 - bne _02003E84 - mov r0, r6 - mov r1, r6 - bl OS_WaitIrq - add r7, r7, #1 -_02003E7C: - cmp r7, #0x12c - blt _02003E60 -_02003E84: - ldr r0, _02003EC0 ; =_020AEF7C - ldrb r0, [r0, #0xd] - cmp r0, #0 - bne _02003E9C - mov r0, #0 - bl sub_02002448 -_02003E9C: - cmp r4, #1 - beq _02003EAC - mov r0, #0 - bl sub_0200B76C -_02003EAC: - bl Card_TerminateForPulledOut - mov r0, #0 - bl sub_020025F8 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_02003EBC: .word _020AF078 -_02003EC0: .word _020AEF7C -_02003EC4: .word _020AF050 -_02003EC8: .word _02092540 - arm_func_end HaltProcessDisp - - arm_func_start sub_02003ECC -sub_02003ECC: ; 0x02003ECC - bx lr - arm_func_end sub_02003ECC - diff --git a/asm/main_0200BC60.s b/asm/main_0200BC60.s deleted file mode 100644 index 9f2ca797..00000000 --- a/asm/main_0200BC60.s +++ /dev/null @@ -1,72 +0,0 @@ - .include "asm/macros.inc" - .include "main_0200BC60.inc" - - .text - - arm_func_start sub_0200BC60 -sub_0200BC60: ; 0x0200BC60 - stmdb sp!, {r4, lr} - str r1, [r0] - add r4, r0, #0x16 - mov lr, #4 -_0200BC70: - ldrb ip, [r3], #1 - subs lr, lr, #1 - strb ip, [r4], #1 - bne _0200BC70 - cmp r1, #3 - cmpne r1, #5 - cmpne r1, #7 - cmpne r1, #9 - cmpne r1, #0xb - bne _0200BCA4 - mov r1, #2 - bl UpdateFadeStatus - ldmia sp!, {r4, pc} -_0200BCA4: - mov r1, r2 - bl sub_0200B928 - ldmia sp!, {r4, pc} - arm_func_end sub_0200BC60 - - arm_func_start sub_0200BCB0 -sub_0200BCB0: ; 0x0200BCB0 - stmdb sp!, {r4, lr} - str r1, [r0] - add r4, r0, #0x16 - mov lr, #4 -_0200BCC0: - ldrb ip, [r3], #1 - subs lr, lr, #1 - strb ip, [r4], #1 - bne _0200BCC0 - cmp r1, #1 - bne _0200BCE4 - mov r1, #1 - bl UpdateFadeStatus - ldmia sp!, {r4, pc} -_0200BCE4: - cmp r1, #3 - cmpne r1, #5 - cmpne r1, #7 - cmpne r1, #9 - cmpne r1, #0xb - bne _0200BD08 - mov r1, r2 - bl sub_0200B928 - ldmia sp!, {r4, pc} -_0200BD08: - mov r1, #2 - bl UpdateFadeStatus - ldmia sp!, {r4, pc} - arm_func_end sub_0200BCB0 - - arm_func_start sub_0200BD14 -sub_0200BD14: ; 0x0200BD14 - ldr r0, [r0, #4] - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - bx lr - arm_func_end sub_0200BD14 diff --git a/asm/main_020276C0.s b/asm/main_020276C0.s deleted file mode 100644 index 8f052db2..00000000 --- a/asm/main_020276C0.s +++ /dev/null @@ -1,138 +0,0 @@ - .include "asm/macros.inc" - .include "main_020276C0.inc" - - .text - - arm_func_start NewWindow -NewWindow: ; 0x020276C0 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r0 - mov r7, r1 - ldr r5, _02027898 ; =WINDOW_LIST - ldr r6, _0202789C ; =_022A7B1C - mov r4, #0 - b _020276FC -_020276DC: - ldrsb r0, [r5, #0xb6] - cmp r0, #0 - beq _02027704 - add r0, r4, #1 - mov r0, r0, lsl #0x18 - mov r4, r0, asr #0x18 - add r5, r5, #0xe0 -#ifdef JAPAN - add r6, r6, #0x2c -#else - add r6, r6, #0x30 -#endif -_020276FC: - cmp r4, #0x14 - blt _020276DC -_02027704: - ldmia r8, {r0, r1, r2, r3} - stmia r5, {r0, r1, r2, r3} - ldrb r0, [r8, #6] - mov r1, #8 - mov r0, r0, lsl #3 - sub r0, r0, #8 - str r0, [r5, #0x20] - ldrb r0, [r5, #6] - ldrb r2, [r5, #7] - mov r0, r0, lsl #6 - mul r0, r2, r0 - bl MemAlloc - str r0, [r5, #0x14] - ldrb r0, [r5, #8] - ldr lr, _020278A0 ; =_022A7A74 - ldrb r3, [r5, #6] - mov r8, r0, lsl #1 - ldrh r0, [lr, r8] - ldrb r2, [r5, #7] - mvn r1, #8 - mla ip, r3, r2, r0 - strh r0, [r5, #0x12] - ldrsb r2, [r5, #9] - strh ip, [lr, r8] - cmp r2, r1 - orreq r1, r0, #0x1000 - streqh r1, [r5, #0x30] - strneh r0, [r5, #0x30] - ldrb r1, [r5, #8] - cmp r1, #0 - moveq r1, #0x6000000 - movne r1, #0x6200000 - add r0, r1, r0, lsl #6 - str r0, [r5, #0x18] - str r0, [r5, #0x28] - ldrb r3, [r5, #6] - ldrb r2, [r5, #7] - mov r1, #0 - mov r0, r4 - smulbb r2, r3, r2 - mov r2, r2, lsl #6 - str r2, [r5, #0x1c] - strb r1, [r5, #0x11] - bl sub_02027B1C - strb r4, [r5, #0x10] - mov r0, #1 - strb r0, [r5, #0xb6] - strb r0, [r5, #0xb7] - mov r0, r4 - strb r7, [r5, #0xb4] - bl sub_020278C4 - mvn r1, #0 - add r0, r5, #0x34 - str r1, [r5, #0xb8] - bl InitRender3dElement64 - mov r1, #2 - strb r1, [r5, #0x70] - mov r0, #9 - strh r0, [r5, #0x5e] - strb r1, [r5, #0x72] - mov r0, #0x20 - strb r0, [r5, #0x60] - strb r0, [r5, #0x61] - strb r0, [r5, #0x62] - mov r1, #0x90 - add r0, r5, #0x74 - strb r1, [r5, #0x63] - bl InitRender3dElement64 - ldr r0, _020278A4 ; =_022A7A6C - mov r1, #0 - ldrh r3, [r0, #0x48] - mov r2, #0x18 - strh r3, [r5, #0x88] - strh r1, [r5, #0x8a] - strh r1, [r5, #0x8c] - strh r2, [r5, #0x8e] - strh r2, [r5, #0x90] - ldr r2, [r0, #0x54] - str r2, [r5, #0x94] - ldrsh r0, [r0, #0x58] - bl GetPaletteBaseAddress__020278A8 - str r0, [r5, #0x98] - mov r0, #6 - strb r0, [r5, #0xb0] - mov r0, #0xa - strh r0, [r5, #0x9e] - mov r1, #0 - strh r1, [r5, #0x74] - strh r1, [r5, #0x76] - strh r1, [r5, #0x78] - add r0, r5, #0xbc - strh r1, [r5, #0x7a] - bl InitWindowTrailer - mov r0, #0 - strb r0, [r6] - add r0, r6, #4 - bl sub_02029A50 - ldrb r1, [r5, #8] - mov r0, r4 - strb r1, [r6, #0x2a] - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_02027898: .word WINDOW_LIST -_0202789C: .word _022A7B1C -_020278A0: .word _022A7A74 -_020278A4: .word _022A7A6C - arm_func_end NewWindow diff --git a/asm/main_020278C4.s b/asm/main_020278C4.s deleted file mode 100644 index 6e82cb5f..00000000 --- a/asm/main_020278C4.s +++ /dev/null @@ -1,123 +0,0 @@ - .include "asm/macros.inc" - .include "main_020278C4.inc" - - .text - - arm_func_start sub_020278C4 -sub_020278C4: ; 0x020278C4 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r1, #0xe0 - mul r2, r0, r1 - ldr ip, _02027964 ; =_022A7A6C - ldr r4, _02027968 ; =_022A8990 -#ifdef JAPAN - ldrsb r3, [ip, #1] -#else - ldrsb r3, [ip, #3] -#endif - mvn r1, #1 - ldrsb r8, [r4, r2] - cmp r3, r1 - ldreq r1, _0202796C ; =_022A8991 - mov r7, r3 -#ifdef JAPAN - streqb r0, [ip, #1] -#else - streqb r0, [ip, #3] -#endif - streqb r3, [r1, r2] - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - mov ip, r1 - ldr r5, _02027970 ; =WINDOW_LIST - mov lr, #0xe0 - b _02027924 -_0202790C: - mla r6, r7, lr, r5 - ldrsb r4, [r6, #0xb4] - cmp r4, r8 - blt _0202792C - mov r1, r7 - ldrsb r7, [r6, #0xb5] -_02027924: - cmp r7, ip - bne _0202790C -_0202792C: - mvn ip, #1 - cmp r1, ip - ldreq ip, _0202796C ; =_022A8991 - ldreq r1, _02027964 ; =_022A7A6C - streqb r3, [ip, r2] -#ifdef JAPAN - streqb r0, [r1, #1] -#else - streqb r0, [r1, #3] -#endif - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - mov r3, #0xe0 - mul r3, r1, r3 - ldr ip, _0202796C ; =_022A8991 - ldrsb r1, [ip, r3] - strb r0, [ip, r3] - strb r1, [ip, r2] - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_02027964: .word _022A7A6C -_02027968: .word _022A8990 -_0202796C: .word _022A8991 -_02027970: .word WINDOW_LIST - arm_func_end sub_020278C4 - - arm_func_start sub_02027974 -sub_02027974: ; 0x02027974 - stmdb sp!, {r3, r4, r5, lr} - ldr r1, _020279FC ; =_022A7A6C - mvn r5, #1 -#ifdef JAPAN - ldrsb r4, [r1, #1] -#else - ldrsb r4, [r1, #3] -#endif - mov r1, r5 - ldr ip, _02027A00 ; =WINDOW_LIST - mov r2, #0xe0 - b _020279AC -_02027994: - mla lr, r4, r2, ip - ldrsb r3, [lr, #0x10] - cmp r0, r3 - beq _020279B4 - mov r5, r4 - ldrsb r4, [lr, #0xb5] -_020279AC: - cmp r4, r1 - bne _02027994 -_020279B4: - mvn ip, #1 - cmp r5, ip - bne _020279DC - mov r1, #0xe0 - mul r2, r0, r1 - ldr r3, _02027A04 ; =_022A8991 - ldr r0, _020279FC ; =_022A7A6C - ldrsb r1, [r3, r2] -#ifdef JAPAN - strb r1, [r0, #1] -#else - strb r1, [r0, #3] -#endif - b _020279F4 -_020279DC: - mov r0, #0xe0 - mul r2, r4, r0 - ldr r3, _02027A04 ; =_022A8991 - mul r0, r5, r0 - ldrsb r1, [r3, r2] - strb r1, [r3, r0] -_020279F4: - strb ip, [r3, r2] - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_020279FC: .word _022A7A6C -_02027A00: .word WINDOW_LIST -_02027A04: .word _022A8991 - arm_func_end sub_02027974 diff --git a/asm/main_0204FA70.s b/asm/main_0204FA70.s deleted file mode 100644 index dcdd5c10..00000000 --- a/asm/main_0204FA70.s +++ /dev/null @@ -1,89 +0,0 @@ - .include "asm/macros.inc" - .include "main_0204FA70.inc" - - .text - - arm_func_start ClearAdventureLogStruct -ClearAdventureLogStruct: ; 0x0204FA70 - mov r3, #0 - ldr r1, _0204FB98 ; =ADVENTURE_LOG_PTR - mov r0, r3 -_0204FA7C: - ldr r2, [r1] - str r0, [r2, r3, lsl #2] - add r3, r3, #1 - cmp r3, #4 - blt _0204FA7C - ldr r1, _0204FB98 ; =ADVENTURE_LOG_PTR - mov r3, #0 - ldr r2, [r1] - str r0, [r2, #0x2c] - ldr r2, [r1] - str r0, [r2, #0x30] - ldr r2, [r1] - str r0, [r2, #0x34] - ldr r2, [r1] - str r0, [r2, #0x28] - ldr r2, [r1] - str r0, [r2, #0x10] - ldr r2, [r1] - str r0, [r2, #0x14] - ldr r2, [r1] - str r0, [r2, #0x18] - ldr r2, [r1] - str r0, [r2, #0x1c] - ldr r2, [r1] - str r0, [r2, #0x20] - ldr r2, [r1] - str r0, [r2, #0x24] - ldr r2, [r1] - str r0, [r2, #0x38] - ldr r2, [r1] - str r0, [r2, #0x3c] - ldr r2, [r1] - str r0, [r2, #0x40] -_0204FB00: - ldr r2, [r1] - add r2, r2, r0, lsl #2 - str r3, [r2, #0x44] - ldr r2, [r1] - add r2, r2, r0, lsl #2 - add r0, r0, #1 - str r3, [r2, #0xd8] - cmp r0, #0x25 - blt _0204FB00 - ldr r0, _0204FB98 ; =ADVENTURE_LOG_PTR - mov r2, #0 -_0204FB2C: - ldr r1, [r0] - add r1, r1, r3, lsl #2 - add r3, r3, #1 - str r2, [r1, #0x16c] - cmp r3, #0x11 - blt _0204FB2C - ldr r0, _0204FB98 ; =ADVENTURE_LOG_PTR - mov ip, #0 -_0204FB4C: - ldr r1, [r0] - add r1, r1, r2, lsl #2 - add r2, r2, #1 - str ip, [r1, #0x1b0] - cmp r2, #0x2c - blt _0204FB4C - ldr r1, _0204FB98 ; =ADVENTURE_LOG_PTR - ldr r0, [r1] - str ip, [r0, #0x260] - mov r0, #0x3e8 -_0204FB74: - rsb r2, ip, #5 - mul r3, r2, r0 - ldr r2, [r1] - add r2, r2, ip, lsl #2 - add ip, ip, #1 - str r3, [r2, #0x264] - cmp ip, #5 - blt _0204FB74 - bx lr - .align 2, 0 -_0204FB98: .word ADVENTURE_LOG_PTR - arm_func_end ClearAdventureLogStruct diff --git a/asm/main_0205A340.s b/asm/main_0205A340.s deleted file mode 100644 index 3e4e98c2..00000000 --- a/asm/main_0205A340.s +++ /dev/null @@ -1,77 +0,0 @@ - .include "asm/macros.inc" - .include "main_0205A340.inc" - - .text - - arm_func_start sub_0205A340 -sub_0205A340: ; 0x0205A340 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x90 - add ip, sp, #0x4c - mov r6, r0 - mov lr, r1 - mov r5, r2 - mov r4, #4 -_0205A35C: - ldmia lr!, {r0, r1, r2, r3} - stmia ip!, {r0, r1, r2, r3} - subs r4, r4, #1 - bne _0205A35C - ldr r1, [lr] - add r0, sp, #0x40 - str r1, [ip] - ldrb r2, [sp, #0x4d] - mov r1, r5 - ldrsh r4, [sp, #0x50] - bl GetLvlUpEntry - ldrb r0, [sp, #0x52] - ldr r1, [sp, #0x40] - strh r5, [sp, #0x50] - cmp r0, #0 - ldreqb r0, [sp, #0x4d] - str r1, [sp, #0x5c] - streqb r0, [sp, #0x52] - beq _0205A3B8 - ldrb r0, [sp, #0x53] - cmp r0, #0 - ldreqb r0, [sp, #0x4d] - streqb r0, [sp, #0x53] -_0205A3B8: - mov r0, r4 - bl GetNameString - mov r1, r0 - add r0, sp, #0 -#ifdef JAPAN - bl sub_02025304_JP -#else - bl StrcpyName -#endif - add r0, sp, #0 - add r1, sp, #0x86 - mov r2, #0xa - bl StrncmpSimple - cmp r0, #0 - bne _0205A3FC - mov r0, r5 - bl GetNameString - mov r1, r0 - add r0, sp, #0x86 - mov r2, #0xa - bl StrncpyName -_0205A3FC: - ldrsh r0, [r6] - mvn r1, #0 - cmp r0, r1 - beq _0205A418 - add r1, sp, #0x4c - bl sub_02055D7C - b _0205A424 -_0205A418: - add r0, sp, #0x4c - bl sub_02055CCC - strh r0, [r6] -_0205A424: - ldrsh r0, [r6] - add sp, sp, #0x90 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end sub_0205A340 diff --git a/asm/main_0205B39C.s b/asm/main_0205B39C.s deleted file mode 100644 index b1ab9cbc..00000000 --- a/asm/main_0205B39C.s +++ /dev/null @@ -1,57 +0,0 @@ - .include "asm/macros.inc" - .include "main_0205B39C.inc" - - .text - - arm_func_start sub_0205B39C -sub_0205B39C: ; 0x0205B39C - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r4, r0 - mov r5, r1 - bl AllocateTemp1024ByteBufferFromPool - mov r7, r0 - b _0205B3C0 -_0205B3B4: - cmp r5, r0 - bge _0205B3CC - add r4, r4, #2 -_0205B3C0: - ldrsb r0, [r4] - cmp r0, #0 - bge _0205B3B4 -_0205B3CC: - mov r6, #0 - strb r6, [r7] - ldrsb r0, [r4, #1] - cmp r0, #0 - beq _0205B420 - ldr r5, _0205B434 ; =_020A353C - b _0205B3F8 -_0205B3E8: - mov r0, r7 - mov r1, r5 - bl strcat - add r6, r6, #1 -_0205B3F8: - ldrsb r1, [r4, #1] - add r0, r1, r1, lsr #31 - cmp r6, r0, asr #1 - blt _0205B3E8 - tst r1, #1 - beq _0205B42C - ldr r1, _0205B438 ; =_020A3544 - mov r0, r7 - bl strcat - b _0205B42C -_0205B420: - ldr r1, _0205B43C ; =_020A354C - mov r0, r7 - bl strcat -_0205B42C: - mov r0, r7 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_0205B434: .word _020A353C -_0205B438: .word _020A3544 -_0205B43C: .word _020A354C - arm_func_end sub_0205B39C diff --git a/asm/main_0205B478.s b/asm/main_0205B478.s deleted file mode 100644 index 64af1f8e..00000000 --- a/asm/main_0205B478.s +++ /dev/null @@ -1,66 +0,0 @@ - .include "asm/macros.inc" - .include "main_0205B478.inc" - - .text - - arm_func_start sub_0205B478 -sub_0205B478: ; 0x0205B478 - stmdb sp!, {r3, lr} - sub sp, sp, #8 - add r0, sp, #0 - bl sub_0204A198 - ldrb r1, [sp, #3] - ldr r0, _0205B54C ; =_020B0A54 - ldrb r2, [sp, #2] - mov r1, r1, lsl #0x10 - ldrb r3, [sp, #4] - orr r1, r1, r2, lsl #24 - ldrb r2, [sp, #5] - orr r1, r1, r3, lsl #8 - ldr r0, [r0] - orr ip, r2, r1 - ldr r3, _0205B550 ; =_022B57BC - mov r1, #0 - mov r2, #0x1600 - str ip, [r3] - bl MemsetSimple - ldr r0, _0205B54C ; =_020B0A54 - mov r1, #0 - ldr r0, [r0, #8] - mov r2, #0x4c - bl MemsetSimple - mov lr, #0 - ldr r2, _0205B54C ; =_020B0A54 - mov r0, lr - mov r1, #0xb0 -_0205B4E8: - mul ip, lr, r1 - ldr r3, [r2] - add lr, lr, #1 - strb r0, [r3, ip] - ldr r3, [r2] - cmp lr, #0x20 - add r3, r3, ip - strh r0, [r3, #0xa2] - blt _0205B4E8 - ldr r1, _0205B54C ; =_020B0A54 - mov ip, #0 - ldr r2, [r1, #4] - mvn r3, #0 - str r0, [r2] -_0205B520: - ldr r2, [r1, #4] - add r2, r2, r0, lsl #3 - str ip, [r2, #4] - ldr r2, [r1, #4] - add r2, r2, r0, lsl #3 - add r0, r0, #1 - str r3, [r2, #8] - cmp r0, #0x20 - blt _0205B520 - add sp, sp, #8 - ldmia sp!, {r3, pc} - .align 2, 0 -_0205B54C: .word _020B0A54 -_0205B550: .word _022B57BC - arm_func_end sub_0205B478 diff --git a/asm/overlay_29_022E9298.s b/asm/overlay_29_022E9298.s deleted file mode 100644 index ae084564..00000000 --- a/asm/overlay_29_022E9298.s +++ /dev/null @@ -1,64 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022E9298.inc" - - .text - - arm_func_start ov29_022E9298 -ov29_022E9298: ; 0x022E9298 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r5, r0 - mov r4, r1 - ldrsh r0, [r5] - ldrsh r1, [r5, #2] - mov r7, r2 - bl GetTile - mov r6, r0 - bl GetVisibilityRange - cmp r7, #0 - ldrb r2, [r6, #7] - bne _022E92D0 - cmp r2, #0xff - bne _022E930C -_022E92D0: - ldrsh r1, [r5] - sub r1, r1, r0 - str r1, [r4] - ldrsh r1, [r5] - add r1, r1, r0 - add r1, r1, #1 - str r1, [r4, #8] - ldrsh r1, [r5, #2] - sub r1, r1, r0 - str r1, [r4, #4] - ldrsh r1, [r5, #2] - add r0, r1, r0 - add r0, r0, #1 - str r0, [r4, #0xc] - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022E930C: - ldr r0, _022E9358 ; =DUNGEON_PTR - mov r1, #0x1c - ldr r0, [r0] -#ifdef JAPAN - add r0, r0, #0x244 -#else - add r0, r0, #0x2e8 -#endif - add r0, r0, #0xec00 - mla r1, r2, r1, r0 - ldrsh r0, [r1, #2] - sub r0, r0, #1 - str r0, [r4] - ldrsh r0, [r1, #6] - add r0, r0, #2 - str r0, [r4, #8] - ldrsh r0, [r1, #4] - sub r0, r0, #1 - str r0, [r4, #4] - ldrsh r0, [r1, #8] - add r0, r0, #2 - str r0, [r4, #0xc] - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_022E9358: .word DUNGEON_PTR - arm_func_end ov29_022E9298 diff --git a/asm/overlay_29_022E9488.s b/asm/overlay_29_022E9488.s deleted file mode 100644 index 8d6a138b..00000000 --- a/asm/overlay_29_022E9488.s +++ /dev/null @@ -1,76 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022E9488.inc" - - .text - - arm_func_start DisplayThrownItemShadow -DisplayThrownItemShadow: ; 0x022E9488 - stmdb sp!, {r3, r4, r5, lr} - ldr ip, _022E955C ; =DUNGEON_PTR - ldr r3, _022E9560 ; =0x0001A224 - ldr r4, [ip] - add ip, r3, #2 - ldrsh r3, [r4, r3] - ldrsh r4, [r4, ip] - mvn lr, #0xf - sub r3, r0, r3 - sub r0, r1, r4 - cmp r3, lr - cmpge r0, lr - blt _022E9554 - rsb r1, lr, #0xff - cmp r3, r1 - cmplt r0, #0xd0 - bge _022E9554 - mov r1, #0xc - mul ip, r2, r1 - ldr r4, _022E9564 ; =ov29_0237C88A - ldr r5, _022E9568 ; =ov29_0237C890 - ldrh r2, [r4, ip] - sub r1, r1, #0x20c - ldrsh r5, [r5, ip] - and r1, r2, r1 - strh r1, [r4, ip] - add r1, r3, r5 - ldrh r2, [r4, ip] - and r1, r1, lr, lsr #23 - ldr r3, _022E956C ; =ov29_0237C88E - orr r1, r2, r1 - strh r1, [r4, ip] - ldr r1, _022E9570 ; =ov29_0237C892 - ldrh r4, [r3, ip] - ldrsh lr, [r1, ip] - ldr r1, _022E9574 ; =0xFFFF000F - ldr r2, _022E9578 ; =OBJ_GRAPHICS_CONTROLS_PTR - and r1, r4, r1 - strh r1, [r3, ip] - add r0, r0, lr - ldr r1, _022E957C ; =ov29_0237C888 - mov lr, r0, lsl #0x14 - ldrh r4, [r3, ip] - ldr r0, [r2] - add r1, r1, ip - orr r4, r4, lr, lsr #16 - mov r2, #0 - strh r4, [r3, ip] - bl AddSimpleObjToOam - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_022E9554: - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_022E955C: .word DUNGEON_PTR -#ifdef JAPAN -_022E9560: .word 0x0001A180 -#else -_022E9560: .word 0x0001A224 -#endif -_022E9564: .word ov29_0237C88A -_022E9568: .word ov29_0237C890 -_022E956C: .word ov29_0237C88E -_022E9570: .word ov29_0237C892 -_022E9574: .word 0xFFFF000F -_022E9578: .word OBJ_GRAPHICS_CONTROLS_PTR -_022E957C: .word ov29_0237C888 - arm_func_end DisplayThrownItemShadow diff --git a/asm/overlay_29_022EAB50.s b/asm/overlay_29_022EAB50.s deleted file mode 100644 index c183b341..00000000 --- a/asm/overlay_29_022EAB50.s +++ /dev/null @@ -1,56 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022EAB50.inc" - - .text - - arm_func_start CalcStatusDuration -CalcStatusDuration: ; 0x022EAB80 - stmdb sp!, {r4, r5, r6, lr} - mov r4, r0 - ldrsh r0, [r1] - ldrsh r1, [r1, #2] - mov r6, r2 - bl DungeonRandRange - mov r5, r0 - cmp r4, #0 - moveq r0, #0 - beq _022EABBC - ldr r0, [r4] - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff -_022EABBC: - cmp r0, #0 - beq _022EAC24 - ldr r0, [r4] - cmp r0, #1 - bne _022EAC24 - cmp r6, #0 - beq _022EAC24 - mov r0, r4 - mov r1, #0x12 - bl IqSkillIsEnabled - cmp r0, #0 - cmpne r5, #0x7f - beq _022EAC04 - mov r0, r5, lsl #8 - add r0, r0, r0, lsr #31 - mov r0, r0, asr #1 - bl RoundUpDiv256 - mov r5, r0 -_022EAC04: - mov r0, r4 - mov r1, #0x14 - bl AbilityIsActiveVeneer - cmp r0, #0 - cmpne r5, #0x7f - beq _022EAC24 - cmp r5, #5 - movge r5, #5 -_022EAC24: - cmp r5, #1 - movlt r5, #1 - mov r0, r5 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end CalcStatusDuration diff --git a/asm/overlay_29_022F740C.s b/asm/overlay_29_022F740C.s deleted file mode 100644 index c1facba1..00000000 --- a/asm/overlay_29_022F740C.s +++ /dev/null @@ -1,152 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022F740C.inc" - - .text - - arm_func_start StoreSpriteFileIndexBothGenders -StoreSpriteFileIndexBothGenders: ; 0x022F740C - stmdb sp!, {r3, r4, r5, r6, r7, lr} - ldr r2, _022F74D0 ; =DUNGEON_PTR - mov r7, r0 - ldr r2, [r2] - mov r6, r1 -#ifdef JAPAN - add r1, r2, #0x870 - add r5, r1, #0x19000 -#else - add r1, r2, #0x114 - add r5, r1, #0x19800 -#endif - bl GetSpriteIndex__020526EC - mov r4, r0 - mov r1, r7, lsl #1 - mov r0, r7 - strh r6, [r5, r1] - bl GetMonsterGender - cmp r0, #3 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - cmp r7, #0x258 - bge _022F7490 - add r6, r7, #0x258 - mov r1, r6, lsl #0x10 - mov r0, r7 - mov r1, r1, asr #0x10 - bl GendersEqualNotGenderless - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r6, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetSpriteIndex__020526EC - cmp r4, r0 - moveq r0, r7, lsl #1 - ldreqsh r1, [r5, r0] - moveq r0, r6, lsl #1 - streqh r1, [r5, r0] - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022F7490: - sub r6, r7, #0x258 - mov r1, r6, lsl #0x10 - mov r0, r7 - mov r1, r1, asr #0x10 - bl GendersEqualNotGenderless - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r6, lsl #0x10 - mov r0, r0, asr #0x10 - bl GetSpriteIndex__020526EC - cmp r4, r0 - moveq r0, r7, lsl #1 - ldreqsh r1, [r5, r0] - moveq r0, r6, lsl #1 - streqh r1, [r5, r0] - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_022F74D0: .word DUNGEON_PTR - arm_func_end StoreSpriteFileIndexBothGenders - - arm_func_start LoadMonsterSpriteInner -LoadMonsterSpriteInner: ; 0x022F74D4 - stmdb sp!, {r3, r4, r5, r6, lr} - sub sp, sp, #4 - ldr r1, _022F75C4 ; =DUNGEON_PTR - mov r6, r0 -#ifdef JAPAN - ldr r1, [r1] - add r1, r1, r6, lsl #1 - add r1, r1, #0x19800 - ldrsh r1, [r1, #0x70] -#else - ldr r2, [r1] - ldr r1, _022F75C8 ; =0x00019914 - add r2, r2, r6, lsl #1 - ldrsh r1, [r2, r1] -#endif - cmp r1, #0 - bne _022F75BC - bl GetSpriteIndex__020526EC - mov r4, r0 - mov r0, r6 - bl IsShaymin - cmp r0, #0 - beq _022F756C - mov r0, r6 - bl IsShaymin - cmp r0, #0 - mov r0, r6 - movne r5, #0 - bl GetSpriteFileSize - mov r1, #0 - bl MemAlloc - ldr r2, _022F75CC ; =ov29_0237C9B0 - mov r1, #1 - str r0, [r2, r5, lsl #2] - str r1, [sp] - ldr r0, _022F75D0 ; =WAN_TABLE - ldr r3, [r2, r5, lsl #2] - ldr r0, [r0] - mov r2, r4 - mov r1, #0 - bl LoadWanTableEntryFromPackUseProvidedMemory - mov r1, r0 - mov r0, r6 - bl StoreSpriteFileIndexBothGenders - b _022F7598 -_022F756C: - mov r1, #1 - ldr r0, _022F75D0 ; =WAN_TABLE - str r1, [sp] - mov r1, #0 - ldr r0, [r0] - mov r2, r4 - mov r3, r1 - bl LoadWanTableEntryFromPack - mov r1, r0 - mov r0, r6 - bl StoreSpriteFileIndexBothGenders -_022F7598: - mov r1, r4 - mov r0, #0 - bl DirectoryFileMngr_GetDirectoryFileSize - ldr r1, _022F75C4 ; =DUNGEON_PTR - ldr r1, [r1] - add r1, r1, #0x2c000 -#ifdef JAPAN - ldr r2, [r1, #0xa68] - add r0, r2, r0 - str r0, [r1, #0xa68] -#else - ldr r2, [r1, #0xb0c] - add r0, r2, r0 - str r0, [r1, #0xb0c] -#endif -_022F75BC: - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, pc} - .align 2, 0 -_022F75C4: .word DUNGEON_PTR -#ifndef JAPAN -_022F75C8: .word 0x00019914 -#endif -_022F75CC: .word ov29_0237C9B0 -_022F75D0: .word WAN_TABLE - arm_func_end LoadMonsterSpriteInner diff --git a/asm/overlay_29_022FF3F4.s b/asm/overlay_29_022FF3F4.s deleted file mode 100644 index 23d7fee4..00000000 --- a/asm/overlay_29_022FF3F4.s +++ /dev/null @@ -1,186 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022FF3F4.inc" - - .text - - arm_func_start HasStatusThatPreventsLeaderActing -HasStatusThatPreventsLeaderActing: ; 0x022FF3F4 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r7, r0 - mov r4, #0 - ldr r6, [r7, #0xb4] - mov r0, r4 - mov r1, r7 - mov r2, r4 - bl SubstitutePlaceholderStringTags - add r0, r6, #0x4a - mov r1, #1 - bl SetMonsterActionFields - ldrb r0, [r6, #0xbd] - cmp r0, #1 - cmpne r0, #3 - cmpne r0, #5 - bne _022FF448 - ldr r1, _022FF60C ; =0x00000C2E - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF448: - ldrb r0, [r6, #0xc4] - cmp r0, #6 - addls pc, pc, r0, lsl #2 - b _022FF4B8 -_022FF458: ; jump table - b _022FF4B8 ; case 0 - b _022FF474 ; case 1 - b _022FF4B8 ; case 2 - b _022FF488 ; case 3 - b _022FF49C ; case 4 - b _022FF4B8 ; case 5 - b _022FF4B0 ; case 6 -_022FF474: - ldr r1, _022FF610 ; =0x00000C28 - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF488: - ldr r1, _022FF614 ; =0x00000C29 - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF49C: - ldr r1, _022FF618 ; =0x00000C2A - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF4B0: - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF4B8: - ldrb r0, [r6, #0xd0] - cmp r0, #8 - addls pc, pc, r0, lsl #2 - b _022FF51C -_022FF4C8: ; jump table - b _022FF51C ; case 0 - b _022FF51C ; case 1 - b _022FF4EC ; case 2 - b _022FF4F4 ; case 3 - b _022FF51C ; case 4 - b _022FF51C ; case 5 - b _022FF51C ; case 6 - b _022FF508 ; case 7 - b _022FF51C ; case 8 -_022FF4EC: - mov r4, #1 - b _022FF51C -_022FF4F4: - ldr r1, _022FF61C ; =0x00000C2B - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF508: - ldr r1, _022FF620 ; =0x00000C2C - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF51C: - ldrb r0, [r6, #0xd2] - cmp r0, #1 - bne _022FF53C - ldr r1, _022FF624 ; =0x00000C2D - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF53C: - cmp r0, #0 - cmpne r0, #0xb - cmpne r0, #0xc - beq _022FF604 - cmp r4, #0 - beq _022FF564 - ldr r1, _022FF628 ; =0x00000C2F - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - b _022FF5FC -_022FF564: - mov r5, #0 -#ifdef JAPAN - add r4, r6, #0x120 -#else - add r4, r6, #0x124 -#endif - mov r8, r5 - mov sb, #1 - b _022FF5F4 -_022FF578: - ldrb r0, [r4, r5, lsl #3] - mov r1, r5, lsl #3 - tst r0, #1 - movne r0, sb - moveq r0, r8 - tst r0, #0xff - beq _022FF5F0 - mov r0, r7 - add r1, r4, r1 - bl IsChargingTwoTurnMove - cmp r0, #0 - beq _022FF5F0 - ldrb r0, [r6, #0xd4] - cmp r0, r5 - bne _022FF5F0 - b _022FF5CC -_022FF5B8: - add r0, r6, r5, lsl #3 -#ifdef JAPAN - ldrb r0, [r0, #0x120] -#else - ldrb r0, [r0, #0x124] -#endif - tst r0, #2 - beq _022FF5D4 - sub r5, r5, #1 -_022FF5CC: - cmp r5, #0 - bgt _022FF5B8 -_022FF5D4: - ldrb r1, [r6, #0x4e] - mov r2, r5, lsl #0x10 - add r0, r6, #0x4a - mov r2, r2, asr #0x10 - bl SetActionUseMovePlayer - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF5F0: - add r5, r5, #1 -_022FF5F4: - cmp r5, #4 - blt _022FF578 -_022FF5FC: - mov r0, r7 - bl EndTwoTurnMove -_022FF604: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -#ifdef JAPAN -#define OV29_022FF3F4_OFFSET -0x2C1 -#else -#define OV29_022FF3F4_OFFSET 0 -#endif -_022FF60C: .word 0x00000C2E + OV29_022FF3F4_OFFSET -_022FF610: .word 0x00000C28 + OV29_022FF3F4_OFFSET -_022FF614: .word 0x00000C29 + OV29_022FF3F4_OFFSET -_022FF618: .word 0x00000C2A + OV29_022FF3F4_OFFSET -_022FF61C: .word 0x00000C2B + OV29_022FF3F4_OFFSET -_022FF620: .word 0x00000C2C + OV29_022FF3F4_OFFSET -_022FF624: .word 0x00000C2D + OV29_022FF3F4_OFFSET -_022FF628: .word 0x00000C2F + OV29_022FF3F4_OFFSET - arm_func_end HasStatusThatPreventsLeaderActing diff --git a/asm/overlay_29_02301940.s b/asm/overlay_29_02301940.s deleted file mode 100644 index e27077c6..00000000 --- a/asm/overlay_29_02301940.s +++ /dev/null @@ -1,79 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02301940.inc" - - .text - - arm_func_start SafeguardIsActive -SafeguardIsActive: ; 0x02301940 - stmdb sp!, {r3, r4, r5, lr} - mov r4, r1 - ldr r3, [r4, #0xb4] - mov r5, r0 - ldrb r0, [r3, #0xd5] - cmp r0, #2 - bne _02301988 - cmp r2, #0 - beq _02301980 - mov r0, #0 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _02301990 ; =0x00000C36 - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget -_02301980: - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_02301988: - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -_02301990: .word 0x00000975 -#else -_02301990: .word 0x00000C36 -#endif - arm_func_end SafeguardIsActive - - arm_func_start LeafGuardIsActive -LeafGuardIsActive: ; 0x02301994 - stmdb sp!, {r4, r5, r6, lr} - mov r5, r1 - mov r6, r0 - mov r0, r5 - mov r4, r2 - bl GetApparentWeather - cmp r0, #1 - bne _02301A00 - mov r0, r6 - mov r1, r5 - mov r2, #0x7b -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__02301A0C - cmp r0, #0 - beq _02301A00 - cmp r4, #0 - beq _023019F8 - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _02301A08 ; =0x00000C37 - mov r0, r6 - mov r1, r5 - bl LogMessageByIdWithPopupCheckUserTarget -_023019F8: - mov r0, #1 - ldmia sp!, {r4, r5, r6, pc} -_02301A00: - mov r0, #0 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -#ifdef JAPAN -_02301A08: .word 0x00000976 -#else -_02301A08: .word 0x00000C37 -#endif - arm_func_end LeafGuardIsActive diff --git a/asm/overlay_29_023026FC.s b/asm/overlay_29_023026FC.s deleted file mode 100644 index 97929603..00000000 --- a/asm/overlay_29_023026FC.s +++ /dev/null @@ -1,243 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_023026FC.inc" - - .text - - arm_func_start EnemyEvolution -EnemyEvolution: ; 0x023026FC -#ifdef JAPAN -#define ENEMY_EVOLUTION_OFFSET -4 -#else -#define ENEMY_EVOLUTION_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x168 - mov sl, r0 - bl AllocateTemp1024ByteBufferFromPool - ldr r0, _02302A28 ; =DUNGEON_PTR - ldr r2, [r0] - ldrb r1, [r2, #0xf] - ldrb r0, [r2, #0x748] - cmp r1, #0 - str r0, [sp, #8] - beq _02302A20 - mov r0, #0 - strb r0, [r2, #0xf] - bl GetForcedLossReason - cmp r0, #0 - bne _02302A20 - mov r0, sl - bl EntityIsValid__02302A38 - cmp r0, #0 - bne _02302758 - add r0, sp, #0xb0 - bl CreateTemporaryEntity - add sl, sp, #0xb0 -_02302758: - ldr r0, _02302A2C ; =ov29_023527F8 - mov r4, #0 - ldr r3, [r0] - ldr r2, [r0, #4] - ldr r1, [r0, #8] - ldr r0, [r0, #0xc] - str r3, [sp, #0x14] - str r2, [sp, #0x18] - str r1, [sp, #0xc] - str r0, [sp, #0x10] -_02302780: - ldr r0, _02302A28 ; =DUNGEON_PTR - ldr r3, [sp, #0x14] - ldr r0, [r0] - ldr r2, [sp, #0x18] - add r0, r0, r4, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r5, [r0, #0xad4] -#else - ldr r5, [r0, #0xb78] -#endif - ldr r1, [sp, #0xc] - ldr r0, [sp, #0x10] - mov r6, #0 - str r6, [sp, #4] - str r3, [sp, #0x24] - str r2, [sp, #0x28] - str r1, [sp, #0x1c] - str r0, [sp, #0x20] - cmp r5, #0 - beq _02302A14 - mov r0, r5 - bl EntityIsValid__02302A38 - cmp r0, #0 - ldrne sb, [r5, #0xb4] - ldrnesh r0, [sb, #0x10] - cmpne r0, #0 - beq _02302A14 - ldrb r0, [sb, #0x102] - cmp r0, #0 - movne r0, r6 - strneb r0, [sb, #0x102] - bne _02302A08 - ldr fp, [sb, #0x214 + ENEMY_EVOLUTION_OFFSET] - cmp fp, #0 - beq _023028C4 - ldrb r0, [sb, #7] - cmp r0, #0 - beq _02302818 - ldrb r1, [sb, #0xa] - add r0, sp, #0x54 - bl GetUnlockedTacticFlags -_02302818: - ldrsh r2, [sb, #0x12] - ldrsh r0, [sb, #0x16] - ldrb r7, [sb, #0x1a] - ldr r1, _02302A30 ; =0x000003E7 - add r0, r2, r0 - ldrb r3, [sb, #0x1b] - ldrb r2, [sb, #0x1c] - str r0, [sp, #4] - cmp r0, r1 - strgt r1, [sp, #4] - ldrb r1, [sb, #0x1d] - ldrb r0, [sb, #0xa] - str r7, [sp, #0x24] - str r3, [sp, #0x28] - str r2, [sp, #0x1c] - str r1, [sp, #0x20] - cmp r0, #0x64 - beq _023028C4 - ldr r0, [sp, #8] - bl IsExpEnabledInDungeon - cmp r0, #0 - beq _023028C4 - ldr r0, [sb, #0x20] - mov r1, fp - add r2, r0, fp - mov r0, #0 - str r2, [sb, #0x20] - bl SetMessageLogPreprocessorArgsNumberVal - bl GetMessageLogPreprocessorArgs - mov r1, #0 - str r1, [sp] - mov r2, sb - mov r3, r1 - bl SetPreprocessorArgsStringToName - mov r0, sl - ldr r1, _02302A34 ; =0x00000F1F - bl LogMessageByIdWithPopup - mov r0, sl - mov r1, r5 - mov r2, #1 - mov r3, r2 - bl LevelUp - orr r6, r6, r0 -_023028C4: - ldrb r0, [sb, #0x153 + ENEMY_EVOLUTION_OFFSET] - cmp r0, #0 - beq _02302968 - ldrsh r0, [sb, #2] - mov r2, #0 - add r1, sp, #0x2c - mov r3, r2 - bl GetEvolutions - movs r6, r0 - beq _02302964 - bl DungeonRandInt - mov r8, r0 - mov r7, #0 - b _0230293C -_023028FC: - mov r1, r8, lsl #1 - add r0, sp, #0x2c - ldrsh r0, [r0, r1] - bl IsOnMonsterSpawnList - cmp r0, #0 - beq _0230292C - mov r1, r8, lsl #1 - add r0, sp, #0x2c - ldrsh r0, [r0, r1] - bl DungeonGetSpriteIndex - cmp r0, #0 - bne _02302944 -_0230292C: - add r8, r8, #1 - cmp r8, r6 - movge r8, #0 - add r7, r7, #1 -_0230293C: - cmp r7, r6 - blt _023028FC -_02302944: - cmp r7, r6 - bge _02302964 - add r0, sp, #0x2c - mov r1, r8, lsl #1 - ldrsh r2, [r0, r1] - mov r0, sl - mov r1, r5 - bl EvolveMonster -_02302964: - mov r6, #0 -_02302968: - cmp r6, #0 - beq _023029EC - ldrb r0, [sb, #6] - cmp r0, #0 - bne _023029EC - ldrsh r2, [sb, #0x12] - ldrsh r1, [sb, #0x16] - ldr r0, _02302A30 ; =0x000003E7 - ldr r3, [sp, #0x28] - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - ldr r0, [sp, #4] - sub r0, r1, r0 - str r0, [sp, #0x84] - ldrb r2, [sb, #0x1a] - ldr r1, [sp, #0x24] - ldr r0, [sp, #0x1c] - sub r1, r2, r1 - str r1, [sp, #0x88] - ldrb r1, [sb, #0x1c] - ldr r2, [sp, #0x20] - sub r0, r1, r0 - str r0, [sp, #0x8c] - ldrb r6, [sb, #0x1b] - add r1, sp, #0x60 - mov r0, r5 - sub r3, r6, r3 - str r3, [sp, #0x90] - ldrb r3, [sb, #0x1d] - sub r2, r3, r2 - str r2, [sp, #0x94] - bl ov29_02302CC8 -_023029EC: - cmp fp, #0 - beq _02302A08 - add r2, sp, #0x54 - mov r0, sl - mov r1, r5 - mov r3, #1 - bl ov29_02302C04 -_02302A08: - mov r0, #0 - str r0, [sb, #0x214 + ENEMY_EVOLUTION_OFFSET] - strb r0, [sb, #0x153 + ENEMY_EVOLUTION_OFFSET] -_02302A14: - add r4, r4, #1 - cmp r4, #0x14 - blt _02302780 -_02302A20: - add sp, sp, #0x168 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02302A28: .word DUNGEON_PTR -_02302A2C: .word ov29_023527F8 -_02302A30: .word 0x000003E7 -#ifdef JAPAN -_02302A34: .word 0x00002486 -#else -_02302A34: .word 0x00000F1F -#endif - arm_func_end EnemyEvolution diff --git a/asm/overlay_29_02307F4C.s b/asm/overlay_29_02307F4C.s deleted file mode 100644 index 869ae53a..00000000 --- a/asm/overlay_29_02307F4C.s +++ /dev/null @@ -1,243 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02307F4C.inc" - - .text - - arm_func_start TryTriggerMonsterHouse -TryTriggerMonsterHouse: ; 0x02307F4C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x1a0 - mov r4, r0 - mov r5, r1 - bl EntityIsValid__02307EF8 - cmp r0, #0 - beq _02308268 - ldr r0, [r4, #0xb4] - ldrb r0, [r0, #6] - cmp r0, #0 - bne _02308268 - mov r0, r4 - bl GetTileAtEntity - ldrh r0, [r0] - tst r0, #0x40 - beq _02308268 - ldr r0, _02308270 ; =DUNGEON_PTR - ldr r2, [r0] - ldrb r1, [r2, #0x793] - cmp r1, #0 - bne _02308268 - mov r1, #1 - strb r1, [r2, #0x793] - ldr r1, [r0] - add r0, r1, #0x4000 -#ifdef JAPAN - ldrb r2, [r0, #0x25] - cmp r2, #0xff - beq _02308268 - add r0, r1, #0x244 -#else - ldrb r2, [r0, #0xc9] - cmp r2, #0xff - beq _02308268 - add r0, r1, #0x2e8 -#endif - add r1, r0, #0xec00 - mov r0, #0x1c - mla r1, r2, r0, r1 - cmp r5, #0 - mov r5, #0 - beq _02308064 - ldrsh r0, [r4, #6] - add r7, sp, #0x10 - sub sb, r0, #4 - b _02308050 -_02307FE8: - ldrsh r0, [r4, #4] - sub r8, r0, #4 - mov r0, sb, lsl #0x10 - mov r6, r0, asr #0x10 - b _0230803C -_02307FFC: - mov r0, r8 - mov r1, sb - bl GetTileSafe - ldr r1, [r0, #0xc] - cmp r1, #0 - ldreqh r0, [r0] - andeq r0, r0, #3 - cmpeq r0, #1 - bne _02308038 - cmp r5, #0x64 - movlt r1, r5, lsl #2 - addlt r0, r7, r5, lsl #2 - strlth r8, [r7, r1] - strlth r6, [r0, #2] - addlt r5, r5, #1 -_02308038: - add r8, r8, #1 -_0230803C: - ldrsh r0, [r4, #4] - add r0, r0, #4 - cmp r8, r0 - ble _02307FFC - add sb, sb, #1 -_02308050: - ldrsh r0, [r4, #6] - add r0, r0, #4 - cmp sb, r0 - ble _02307FE8 - b _02308124 -_02308064: - ldrsh r2, [r4, #4] - ldrsh r0, [r1, #2] - add fp, sp, #0x10 - sub r7, r2, #4 - cmp r7, r0 - movle r7, r0 - add r8, r2, #5 - ldrsh r2, [r4, #6] - ldrsh r0, [r1, #6] - sub sb, r2, #4 - cmp r8, r0 - movge r8, r0 - ldrsh r0, [r1, #4] - add sl, r2, #5 - cmp sb, r0 - movle sb, r0 - ldrsh r0, [r1, #8] - cmp sl, r0 - movge sl, r0 - b _0230811C -_023080B4: - mov r0, sb, lsl #0x10 - mov r6, r7 - mov r4, r0, asr #0x10 - b _02308110 -_023080C4: - mov r0, r6 - mov r1, sb - bl GetTileSafe - ldr r1, [r0, #0xc] - cmp r1, #0 - ldreqh r1, [r0] - andeq r1, r1, #3 - cmpeq r1, #1 - bne _0230810C - ldrh r0, [r0] - tst r0, #0x40 - beq _0230810C - cmp r5, #0x64 - movlt r1, r5, lsl #2 - addlt r0, fp, r5, lsl #2 - strlth r6, [fp, r1] - strlth r4, [r0, #2] - addlt r5, r5, #1 -_0230810C: - add r6, r6, #1 -_02308110: - cmp r6, r8 - blt _023080C4 - add sb, sb, #1 -_0230811C: - cmp sb, sl - blt _023080B4 -_02308124: - ldr r0, _02308274 ; =ov10_022C4560 - ldr r1, _02308278 ; =MONSTER_HOUSE_MAX_MONSTER_SPAWNS - ldrsh r0, [r0] - ldrsh r1, [r1] - bl DungeonRandRange - mov r6, r0 - cmp r6, r5 - movge r6, r5 - mov r8, #0 - b _02308258 -_0230814C: - mov r0, r5 - bl DungeonRandInt - mov r3, #0 - mov r4, r0 - add r2, sp, #0x10 - mov r0, r3 - b _02308188 -_02308168: - mov r1, r4, lsl #2 - ldrsh r1, [r2, r1] - cmp r1, #0 - bne _02308190 - add r4, r4, #1 - cmp r4, r5 - movge r4, r0 - add r3, r3, #1 -_02308188: - cmp r3, r5 - blt _02308168 -_02308190: - add r0, sp, #0x10 - mov r1, r4, lsl #2 - ldrsh r7, [r0, r1] - cmp r7, #0 - beq _02308260 - mov r0, #1 - bl GetMonsterIdToSpawn - add r1, sp, #0x10 - mov r3, #0 - strh r0, [sp] - add r0, r1, r4, lsl #2 - ldrsh r2, [r0, #2] - mov r1, #1 - ldrsh r0, [sp] - strh r3, [sp, #8] - strb r3, [sp, #2] - str r3, [sp, #4] - strb r1, [sp, #0xe] - strh r7, [sp, #0xa] - strh r2, [sp, #0xc] - bl MewSpawnCheck - cmp r0, #0 - beq _02308254 - add r0, sp, #0 - mov r1, #0 - bl SpawnMonster - mov r4, r0 - bl EntityIsValid__02307EF8 - cmp r0, #0 - beq _02308254 - mov r0, #0xc800 - str r0, [r4, #0x1c] - mov sl, #0 - mov sb, #0xaa - mov r7, #0x57 - b _02308244 -_02308220: - ldr r0, [r4, #0x1c] - mov r1, sb - bl MultiplyByFixedPoint - str r0, [r4, #0x1c] - cmp r0, #0x100 - blt _0230824C - mov r0, r7 - bl AdvanceFrame - add sl, sl, #1 -_02308244: - cmp sl, #0x64 - blt _02308220 -_0230824C: - mov r0, #0 - str r0, [r4, #0x1c] -_02308254: - add r8, r8, #1 -_02308258: - cmp r8, r6 - blt _0230814C -_02308260: - mov r0, #1 - bl AnimationDelayOrSomething -_02308268: - add sp, sp, #0x1a0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02308270: .word DUNGEON_PTR -_02308274: .word ov10_022C4560 -_02308278: .word MONSTER_HOUSE_MAX_MONSTER_SPAWNS - arm_func_end TryTriggerMonsterHouse diff --git a/asm/overlay_29_0230ABF0.s b/asm/overlay_29_0230ABF0.s deleted file mode 100644 index a96cbf4c..00000000 --- a/asm/overlay_29_0230ABF0.s +++ /dev/null @@ -1,42 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0230ABF0.inc" - - .text - - arm_func_start IsTypeIneffectiveAgainstGhost -IsTypeIneffectiveAgainstGhost: ; 0x0230ABF0 - cmp r0, #1 - cmpne r0, #7 - moveq r0, #1 - movne r0, #0 - bx lr - arm_func_end IsTypeIneffectiveAgainstGhost - - arm_func_start GhostImmunityIsActive -GhostImmunityIsActive: ; 0x0230AC04 - stmdb sp!, {r3, lr} - ldr r3, [r1, #0xb4] - add r1, r3, r2 - ldrb r1, [r1, #0x5e] - cmp r1, #0xe - bne _0230AC50 - ldrb r1, [r3, #0xfe] - cmp r1, #0 - bne _0230AC38 - mov r1, #0x45 - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _0230AC40 -_0230AC38: - mov r0, #1 - b _0230AC44 -_0230AC40: - mov r0, #0 -_0230AC44: - cmp r0, #0 - moveq r0, #1 - ldmeqia sp!, {r3, pc} -_0230AC50: - mov r0, #0 - ldmia sp!, {r3, pc} - arm_func_end GhostImmunityIsActive diff --git a/asm/overlay_29_0230FB30.s b/asm/overlay_29_0230FB30.s deleted file mode 100644 index 81fcd045..00000000 --- a/asm/overlay_29_0230FB30.s +++ /dev/null @@ -1,37 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0230FB30.inc" - - .text - - arm_func_start ov29_0230FB30 -ov29_0230FB30: ; 0x0230FB30 - stmdb sp!, {r3, r4, r5, lr} - ldr r1, _0230FB88 ; =ov29_023529A8 - mov r5, r0 - ldrh r2, [r1] - add r0, sp, #0 - strh r2, [sp] - ldrh r1, [r1, #2] - strh r1, [sp, #2] - bl ov29_02347184 - movs r4, r0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r4 - mov r0, #0 - bl ov29_02344B9C - ldr r1, _0230FB8C ; =0x00000F62 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230FB88: .word ov29_023529A8 -#ifdef JAPAN -_0230FB8C: .word 0x000009B6 -#else -_0230FB8C: .word 0x00000F62 -#endif - arm_func_end ov29_0230FB30 diff --git a/asm/overlay_29_0231EA40.s b/asm/overlay_29_0231EA40.s deleted file mode 100644 index c7cf07e0..00000000 --- a/asm/overlay_29_0231EA40.s +++ /dev/null @@ -1,274 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0231EA40.inc" - - .text - - arm_func_start MakeFloorOneRoom -MakeFloorOneRoom: ; 0x0231EA40 -#ifdef JAPAN -#define OV29_0231EA40_OFFSET -0xA4 -#else -#define OV29_0231EA40_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov sl, r0 - bl IsFullFloorFixedRoom - cmp r0, #0 - bne _0231EA80 - ldr r0, _0231EDC8 ; =DUNGEON_PTR - ldr r0, [r0] - add r1, r0, #0x4000 - ldrsh r0, [r1, #0xd4 + OV29_0231EA40_OFFSET] - sub r2, r0, #0x1a - mov r2, r2, lsl #0x10 - mov r2, r2, asr #0x10 - mov r2, r2, lsl #0x10 - mov r2, r2, lsr #0x10 - cmp r2, #1 - bhi _0231EA90 -_0231EA80: - ldr r1, _0231EDCC ; =0x00000E01 - mov r0, sl - bl LogMessageByIdWithPopupCheckUser - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0231EA90: - ldrb r2, [r1, #0xc4 + OV29_0231EA40_OFFSET] - cmp r2, #0 - beq _0231EAAC - ldr r1, _0231EDD0 ; =0x00000DFF - mov r0, sl - bl LogMessageByIdWithPopupCheckUser - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0231EAAC: - ldrb r1, [r1, #0xc7 + OV29_0231EA40_OFFSET] - cmp r1, #0 - beq _0231EAC8 - mov r0, sl -#ifdef JAPAN - mov r1, #0xb40 -#else - mov r1, #0xe00 -#endif - bl LogMessageByIdWithPopupCheckUser - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_0231EAC8: - bl FloorSecondaryTerrainIsChasm - cmp r0, #0 - movne r7, #3 - moveq r7, #2 - mov r6, #0 - mov sb, #1 -_0231EAE0: - ldr fp, _0231EDC8 ; =DUNGEON_PTR - mov r5, #1 - mov r4, #0 -_0231EAEC: - mov r0, sb - mov r1, r5 - mov r8, #0 - bl GetTileSafe - ldrh r1, [r0] - bic r1, r1, #0x400 - strh r1, [r0] - strb r4, [r0, #7] - ldrh r1, [r0] - tst r1, #0x10 - bne _0231EBCC - tst r1, #0x100 - bne _0231EBCC - ldrh r1, [r0, #2] - orr r1, r1, #3 - strh r1, [r0, #2] - ldrh r1, [r0] - bic r1, r1, #8 - strh r1, [r0] - ldrh r1, [r0] - tst r1, #0x40 - ldrh r1, [r0] - movne r6, #1 - and r2, r1, #3 - cmp r2, #2 - cmpne r2, #3 - beq _0231EBCC - cmp sb, #1 - cmpne r5, #1 - cmpne sb, #0x36 - cmpne r5, #0x1e - bne _0231EB84 - ldr r1, [r0, #0x10] - cmp r1, #0 - ldreq r1, [fp] - ldreqb r1, [r1, #0x78f] - cmpeq r1, #0 - moveq r8, #1 -_0231EB84: - cmp r8, #0 - beq _0231EBA8 - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, r7 - strh r1, [r0] - b _0231EBCC -_0231EBA8: - cmp r2, #1 - beq _0231EBCC - ldrh r1, [r0] - bic r1, r1, #3 - strh r1, [r0] - ldrh r1, [r0] - orr r1, r1, #1 - orr r1, r1, #0x400 - strh r1, [r0] -_0231EBCC: - add r5, r5, #1 - cmp r5, #0x1f - blt _0231EAEC - add sb, sb, #1 - cmp sb, #0x37 - blt _0231EAE0 - ldr r0, _0231EDC8 ; =DUNGEON_PTR - mov r2, #1 - ldr r0, [r0] - add r1, r0, #0xcc00 - ldrsh r0, [r1, #0xe4 + OV29_0231EA40_OFFSET] - ldrsh r1, [r1, #0xe6 + OV29_0231EA40_OFFSET] - bl StairsAlwaysReachable - cmp r0, #0 - beq _0231EC64 - mov r5, #0 - mov r4, r5 -_0231EC10: - mov r8, r4 -_0231EC14: - mov r0, r5 - mov r1, r8 - bl GetTileSafe - ldrh r1, [r0] - tst r1, #0x100 - bne _0231EC4C - tst r1, #0x400 - beq _0231EC4C - tst r1, #0x8000 - bicne r1, r1, #3 - strneh r1, [r0] - ldrneh r1, [r0] - orrne r1, r1, r7 - strneh r1, [r0] -_0231EC4C: - add r8, r8, #1 - cmp r8, #0x20 - blt _0231EC14 - add r5, r5, #1 - cmp r5, #0x38 - blt _0231EC10 -_0231EC64: - cmp r6, #0 - ldrne r0, _0231EDC8 ; =DUNGEON_PTR - mov r5, #0 - ldrne r0, [r0] - movne r1, #0 - addne r0, r0, #0x4000 - strneb r1, [r0, #0xc9 + OV29_0231EA40_OFFSET] - mov r4, r5 -_0231EC84: - mov r7, r4 -_0231EC88: - cmp r6, #0 - beq _0231ECA8 - mov r0, r5 - mov r1, r7 - bl GetTileSafe - ldrh r1, [r0] - orr r1, r1, #0x40 - strh r1, [r0] -_0231ECA8: - mov r0, r5 - mov r1, r7 - bl DetermineTileWalkableNeighbors - add r7, r7, #1 - cmp r7, #0x20 - blt _0231EC88 - add r5, r5, #1 - cmp r5, #0x38 - blt _0231EC84 - ldr r4, _0231EDC8 ; =DUNGEON_PTR - mov r5, #0 -_0231ECD4: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 - ldr r6, [r0, #0xb78 + OV29_0231EA40_OFFSET] - mov r0, r6 - bl EntityIsValid__0231EDD8 - cmp r0, #0 - beq _0231ED08 - ldrsh r0, [r6, #4] - ldrsh r1, [r6, #6] - bl GetTile - ldrb r0, [r0, #7] - strb r0, [r6, #0x25] -_0231ED08: - add r5, r5, #1 - cmp r5, #0x14 - blt _0231ECD4 - bl ov29_0233FB1C - bl ov29_0233785C - bl ov29_0233665C - bl DetermineAllMonsterShadow - bl UpdateMinimap - bl UpdateTrapsVisibility - ldr r1, _0231EDD4 ; =0x00000DFE - mov r0, sl - bl LogMessageByIdWithPopupCheckUser - mov r0, #0x28 - mov r1, #0x2b - bl ov29_022EA370 - mov r0, sl - mov r1, #1 - bl ov29_02305814 - ldr r4, _0231EDC8 ; =DUNGEON_PTR - mov r6, #0 -_0231ED58: - ldr r0, [r4] - add r0, r0, r6, lsl #2 - add r0, r0, #0x12000 - ldr r5, [r0, #0xb78 + OV29_0231EA40_OFFSET] - mov r0, r5 - bl EntityIsValid__0231EDD8 - cmp r0, #0 - beq _0231ED98 - mov r0, r5 - bl ActivateTerrainEffects - mov r0, r5 - bl EntityIsValid__0231EDD8 - cmp r0, #0 - beq _0231ED98 - mov r0, r5 - bl EnsureCanStandCurrentTile -_0231ED98: - add r6, r6, #1 - cmp r6, #0x14 - blt _0231ED58 - ldr r0, _0231EDC8 ; =DUNGEON_PTR - mov r3, #1 - ldr r1, [r0] - mov r0, #0x14 - add r2, r1, #0x4000 - mov r1, #0x2b - strb r3, [r2, #0xc4 + OV29_0231EA40_OFFSET] - bl ov29_022EA370 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0231EDC8: .word DUNGEON_PTR -#ifdef JAPAN -_0231EDCC: .word 0x00000B41 -_0231EDD0: .word 0x00000B3F -_0231EDD4: .word 0x00000B3E -#else -_0231EDCC: .word 0x00000E01 -_0231EDD0: .word 0x00000DFF -_0231EDD4: .word 0x00000DFE -#endif - arm_func_end MakeFloorOneRoom diff --git a/asm/overlay_29_0232C310.s b/asm/overlay_29_0232C310.s deleted file mode 100644 index 99e695d4..00000000 --- a/asm/overlay_29_0232C310.s +++ /dev/null @@ -1,165 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0232C310.inc" - - .text - - arm_func_start DoMoveTakeaway -DoMoveTakeaway: ; 0x0232C310 - stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} - sub sp, sp, #4 - str r3, [sp] - mov r3, #0x100 - mov r8, r0 - mov r7, r1 - mov r4, #0 - bl DealDamage - cmp r0, #0 - beq _0232C4DC - mov r2, r4 - mov r0, r8 - mov r1, r7 - mov r4, #1 - bl DungeonRandOutcomeUserTargetInteraction - cmp r0, #0 - beq _0232C4BC - mov r0, #0 - mov r1, r8 - mov r2, r0 - ldr r5, [r8, #0xb4] - ldr r6, [r7, #0xb4] - bl SubstitutePlaceholderStringTags - mov r1, r7 - mov r0, r4 - mov r2, #0 - bl SubstitutePlaceholderStringTags - mov r0, r8 - mov r1, r7 - mov r2, #0x2c -#ifndef JAPAN - mov r3, r4 -#endif - bl DefenderAbilityIsActiveMoveEffects__0232BDD0 - cmp r0, #0 - beq _0232C3B0 -#ifdef JAPAN - mov r0, r8 - mov r1, r7 - mov r2, #0xc40 -#else - ldr r2, _0232C4E8 ; =0x00000EFE - mov r0, r8 - mov r1, r7 -#endif - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r4 - b _0232C4E0 -_0232C3B0: - ldrb r0, [r5, #0x62] - tst r0, #1 - movne r0, r4 - moveq r0, #0 - tst r0, #0xff - beq _0232C3E0 - ldr r2, _0232C4EC ; =0x00000EFA - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, #1 - b _0232C4E0 -_0232C3E0: - ldrb r0, [r6, #0x62] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - bne _0232C410 - ldr r2, _0232C4F0 ; =0x00000EFB - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, #1 - b _0232C4E0 -_0232C410: - ldrb r0, [r5, #6] - cmp r0, #0 - bne _0232C440 - bl IsBagFull - cmp r0, #0 - beq _0232C440 - ldr r2, _0232C4F4 ; =0x00000EFC - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, #1 - b _0232C4E0 -_0232C440: - ldrh r0, [r6, #0x62] - strh r0, [r5, #0x62] - ldrh r0, [r6, #0x64] - strh r0, [r5, #0x64] - ldrh r0, [r6, #0x66] - strh r0, [r5, #0x66] - ldrb r0, [r5, #6] - cmp r0, #0 - bne _0232C46C - mov r0, r5 - bl AddHeldItemToBag -_0232C46C: - ldrb r0, [r6, #6] - cmp r0, #0 - bne _0232C480 - add r0, r6, #0x62 - bl RemoveEquivItem -_0232C480: - add r0, r6, #0x62 - bl ItemZInit - mov r0, r8 - bl ov29_022F9EA0 - mov r0, r7 - bl ov29_022F9EA0 -#ifdef JAPAN - ldrb r0, [r5, #0x107] -#else - ldrb r0, [r5, #0x108] -#endif - ldr r2, _0232C4F8 ; =0x00000EF9 - mov r1, r7 - cmp r0, #1 - movlo r0, #1 -#ifdef JAPAN - strlob r0, [r5, #0x107] -#else - strlob r0, [r5, #0x108] -#endif - mov r0, r8 - bl LogMessageByIdWithPopupCheckUserTarget - b _0232C4DC -_0232C4BC: - mov r0, r7 - bl EntityIsValidMoveEffects__0232C500 - cmp r0, #0 - beq _0232C4DC - ldr r2, _0232C4FC ; =0x00000EFD - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_0232C4DC: - mov r0, r4 -_0232C4E0: - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} - .align 2, 0 -#ifdef JAPAN -#define DO_MOVE_TAKEAWAY_OFFSET -0x2BE -#else -#define DO_MOVE_TAKEAWAY_OFFSET 0 -#endif -#ifndef JAPAN -_0232C4E8: .word 0x00000EFE -#endif -_0232C4EC: .word 0x00000EFA + DO_MOVE_TAKEAWAY_OFFSET -_0232C4F0: .word 0x00000EFB + DO_MOVE_TAKEAWAY_OFFSET -_0232C4F4: .word 0x00000EFC + DO_MOVE_TAKEAWAY_OFFSET -_0232C4F8: .word 0x00000EF9 + DO_MOVE_TAKEAWAY_OFFSET -_0232C4FC: .word 0x00000EFD + DO_MOVE_TAKEAWAY_OFFSET - arm_func_end DoMoveTakeaway diff --git a/include/dg_random.h b/include/dg_random.h index ac3acb46..ac9b7189 100644 --- a/include/dg_random.h +++ b/include/dg_random.h @@ -2,6 +2,7 @@ #define PMDSKY_DG_RANDOM_H #include "util.h" +#include "dungeon_mode.h" typedef struct prng_state { bool8 use_secondary; @@ -29,5 +30,6 @@ bool8 DungeonRandOutcome__022EAB20(s32 percentChance); // percentChance: success percentage (100*p) // return: true with probability p, false with probability (1-p) bool8 DungeonRandOutcome__022EAB50(s32 percentChance); +s32 CalcStatusDuration(struct entity *entity, const s16 *turn_range, bool8 iq_skill_effects); #endif //PMDSKY_DG_RANDOM_H diff --git a/include/dungeon.h b/include/dungeon.h index 45d268a9..b743b6a5 100644 --- a/include/dungeon.h +++ b/include/dungeon.h @@ -1640,10 +1640,7 @@ struct dungeon { u8 field_0x2cb09; u8 field_0x2cb0a; u8 field_0x2cb0b; - u8 field_0x2cb0c; - u8 field_0x2cb0d; - u8 field_0x2cb0e; - u8 field_0x2cb0f; + u32 field_0x2cb0c; // 0x2CB10: Somehow related to display_data::hallucinating and seems to maybe control // the sleeping animations when the camera is pointed away from a hallucinating monster? // Initialized to 0x1. diff --git a/include/dungeon_range.h b/include/dungeon_range.h index 007c2a3a..0584bc85 100644 --- a/include/dungeon_range.h +++ b/include/dungeon_range.h @@ -3,6 +3,13 @@ #include "dungeon_mode.h" +struct unk_022E9298 { + s32 field_0x0; + s32 field_0x4; + s32 field_0x8; + s32 field_0xc; +}; + // Checks if a given target position is in sight from a given origin position. // If the origin position is on a hallway or r2 is true, checks if both positions are within tiles of each other. // If the origin position is on a room, checks that the target position is within the boundaries of said room. @@ -14,5 +21,6 @@ bool8 IsPositionActuallyInSight(struct position *origin, struct position *target // Checks if a given target position is in sight from a given origin position. // There's multiple factors that affect this check, but generally, it's true if both positions are in the same room (by checking if the target position is within the boundaries of the room where the origin position is) or within 2 tiles of each other. bool8 IsPositionInSight(struct position *origin, struct position *target, bool8 user_has_dropeye); +void ov29_022E9298(struct position *pos, struct unk_022E9298 *bounds, bool8 a); #endif //PMDSKY_DUNGEON_RANGE_H diff --git a/include/dungeon_range_2.h b/include/dungeon_range_2.h index 32a134fc..1d3897d4 100644 --- a/include/dungeon_range_2.h +++ b/include/dungeon_range_2.h @@ -5,5 +5,6 @@ // Checks if a given target position is within two tiles of a given origin position. bool8 IsPositionWithinTwoTiles(struct position *origin, struct position *target); +bool8 DisplayThrownItemShadow(s32 x, s32 y, u8 index); #endif //PMDSKY_DUNGEON_RANGE_2_H diff --git a/include/main_02003D2C.h b/include/main_02003D2C.h index 655aa286..5212e98e 100644 --- a/include/main_02003D2C.h +++ b/include/main_02003D2C.h @@ -11,5 +11,7 @@ void CardPullOut(void); // Sets some global flag that maybe indicates a save error? // This function prints the debug string "card backup error". void CardBackupError(void); +void HaltProcessDisp(s32 a); +void sub_02003ECC(void); #endif //PMDSKY_MAIN_02003D2C_H diff --git a/include/main_0200BC54.h b/include/main_0200BC54.h index 01daf222..33b0fde5 100644 --- a/include/main_0200BC54.h +++ b/include/main_0200BC54.h @@ -14,11 +14,8 @@ enum fade_status { // State of the screen fade in all other modes except dungeon mode struct screen_fade { - u8 field0_0x0; - u8 field1_0x1; - u8 field2_0x2; - u8 field3_0x3; - enum fade_status status; // 0x4 + s32 field_0x0; + s32 status; s32 remaining_frames; // 0x8 // 0xC: Initial duration of the fade in frames s32 duration; @@ -29,8 +26,13 @@ struct screen_fade { // 0x14: Current brightness of the fade. Positive numbers turn the screen white, negative to // black s16 delta_brightness; + u8 field_0x16[4]; + u8 field_0x1a[0x2A]; }; bool8 HandleFadesVeneer(struct screen_fade *fstruct); +void sub_0200BC60(struct screen_fade *fstruct, s32 a, s32 b, u8 *c); +void sub_0200BCB0(struct screen_fade *fstruct, s32 a, s32 b, u8 *c); +bool8 sub_0200BD14(struct screen_fade *fstruct); #endif //PMDSKY_MAIN_0200BC54_H diff --git a/include/main_02027648.h b/include/main_02027648.h index cb515318..67fc96c7 100644 --- a/include/main_02027648.h +++ b/include/main_02027648.h @@ -1,7 +1,25 @@ #ifndef PMDSKY_MAIN_02027648_H #define PMDSKY_MAIN_02027648_H +#include "util.h" +#include "window.h" +#include "main_02029A50.h" + +struct unk_022A7B1C { + u8 field_0x0; + unkStruct_02029A50 field_0x4; +#ifndef JAPAN + s8 field_0x2c; +#endif +}; + +extern struct unk_022A7B1C _022A7B1C[20]; + +void InitRender3dElement64(WindowBlock *elem); +void InitWindowTrailer(CursorParams *params); + u32 sub_02027624(s32 window_id); s32 NewWindowScreenCheck(s32 a, s32 b); +s32 NewWindow(s32 a, s32 b); #endif diff --git a/include/main_020278A8.h b/include/main_020278A8.h index f2b73bf1..e5eea424 100644 --- a/include/main_020278A8.h +++ b/include/main_020278A8.h @@ -2,5 +2,7 @@ #define PMDSKY_MAIN_020278A8_H u16* GetPaletteBaseAddress__020278A8(s32 a, s32 b); +void sub_020278C4(s32 window_id); +void sub_02027974(s32 window_id); #endif diff --git a/include/main_02029A50.h b/include/main_02029A50.h index 511907a4..6eea7c79 100644 --- a/include/main_02029A50.h +++ b/include/main_02029A50.h @@ -6,6 +6,7 @@ typedef struct { int unk4; char pad[0x1C]; short unk24; + u8 unk26; } unkStruct_02029A50; void sub_02029A50(unkStruct_02029A50 *arg0); diff --git a/include/main_0204FA24.h b/include/main_0204FA24.h index fafba261..a1e0923d 100644 --- a/include/main_0204FA24.h +++ b/include/main_0204FA24.h @@ -5,5 +5,6 @@ void SetAdventureLogStructLocation(void); void SetAdventureLogDungeonFloor(struct dungeon_floor_pair* floor); struct dungeon_floor_pair* GetAdventureLogDungeonFloor(void); +void ClearAdventureLogStruct(void); #endif diff --git a/include/main_0205A288.h b/include/main_0205A288.h index f6ae7c45..5f9be5ab 100644 --- a/include/main_0205A288.h +++ b/include/main_0205A288.h @@ -4,6 +4,9 @@ #include "enums.h" #include "util.h" +struct ground_monster; + bool8 HandleShedinjaEvolution(s16 *member_idx, enum monster_id monster_id); +s16 sub_0205A340(s16 *member_idx, struct ground_monster *src, enum monster_id monster_id); #endif //PMDSKY_MAIN_0205A288_H diff --git a/include/main_0205B354.h b/include/main_0205B354.h index 35eb51f1..58b061b2 100644 --- a/include/main_0205B354.h +++ b/include/main_0205B354.h @@ -11,5 +11,6 @@ struct unkStruct_0205B354 { }; bool8 sub_0205B354(struct unkStruct_0205B354 *ptr); +u8* sub_0205B39C(const s8 *table, s32 value); #endif //PMDSKY_MAIN_0205B354_H diff --git a/include/main_0205B440.h b/include/main_0205B440.h index 707be747..d5114a12 100644 --- a/include/main_0205B440.h +++ b/include/main_0205B440.h @@ -1,7 +1,20 @@ #ifndef PMDSKY_MAIN_0205B440_H #define PMDSKY_MAIN_0205B440_H +#include "util.h" + +struct unk_022B580C_entry { + u32 field_0x0; + s32 field_0x4; +}; + +struct unk_022B580C { + u32 field_0x0; + struct unk_022B580C_entry field_0x4[32]; +}; + u8* sub_0205B440(void); void sub_0205B44C(void); +void sub_0205B478(void); #endif //PMDSKY_MAIN_0205B440_H diff --git a/include/overlay_29_022F73B4.h b/include/overlay_29_022F73B4.h index 8387e9da..2ffccb19 100644 --- a/include/overlay_29_022F73B4.h +++ b/include/overlay_29_022F73B4.h @@ -5,5 +5,7 @@ bool32 FloorNumberIsEven(); s16 GetKecleonIdToSpawnByFloor(); +void StoreSpriteFileIndexBothGenders(s16 monster_id, s16 file_id); +void LoadMonsterSpriteInner(s16 monster_id); #endif //PMDSKY_OVERLAY_29_022F73B4_H diff --git a/include/overlay_29_023018AC.h b/include/overlay_29_023018AC.h index 6467a3ec..dd486d3d 100644 --- a/include/overlay_29_023018AC.h +++ b/include/overlay_29_023018AC.h @@ -5,5 +5,7 @@ #include "targeting.h" enum monster_treatment GetTreatmentBetweenMonstersIgnoreStatus(struct entity *entity1, struct entity *entity2); +bool8 SafeguardIsActive(struct entity *user, struct entity *target, bool8 log_message); +bool8 LeafGuardIsActive(struct entity *user, struct entity *target, bool8 log_message); #endif //PMDSKY_OVERLAY_29_023018AC_H diff --git a/include/overlay_29_023026CC.h b/include/overlay_29_023026CC.h index a7031201..ae8a13bc 100644 --- a/include/overlay_29_023026CC.h +++ b/include/overlay_29_023026CC.h @@ -5,5 +5,6 @@ // Checks if a monster is holding a certain item that isn't disabled by Klutz. bool8 ItemIsActive__023026CC(struct entity *entity, enum item_id item_id); +void EnemyEvolution(struct entity *entity); #endif //PMDSKY_OVERLAY_29_023026CC_H diff --git a/include/overlay_29_02307EF8.h b/include/overlay_29_02307EF8.h index ed8ad50a..bcc129a2 100644 --- a/include/overlay_29_02307EF8.h +++ b/include/overlay_29_02307EF8.h @@ -7,5 +7,6 @@ bool8 EntityIsValid__02307EF8(struct entity *entity); // Checks if a monster is holding a certain item that isn't disabled by Klutz. bool8 ItemIsActive__02307F1C(struct entity *entity, enum item_id item_id); +void TryTriggerMonsterHouse(struct entity *entity, bool8 a); #endif //PMDSKY_OVERLAY_29_02307EF8_H diff --git a/include/overlay_29_0230AB58.h b/include/overlay_29_0230AB58.h index fdac063e..47fabc8a 100644 --- a/include/overlay_29_0230AB58.h +++ b/include/overlay_29_0230AB58.h @@ -6,5 +6,7 @@ // Checks whether Scrappy should activate. // Scrappy activates when the ability is active on the attacker, the move type is Normal or Fighting, and the defender is a Ghost type. bool8 ScrappyShouldActivate(struct entity *attacker, struct entity *defender, enum type_id attack_type); +bool8 IsTypeIneffectiveAgainstGhost(enum type_id type); +bool8 GhostImmunityIsActive(struct entity *attacker, struct entity *defender, s16 target_type_idx); #endif //PMDSKY_OVERLAY_29_0230AB58_H diff --git a/include/overlay_29_0230F8AC.h b/include/overlay_29_0230F8AC.h index 6a56c3dc..315cd387 100644 --- a/include/overlay_29_0230F8AC.h +++ b/include/overlay_29_0230F8AC.h @@ -10,5 +10,6 @@ u8 FindDirectionOfAdjacentMonsterWithItem(struct entity *entity, enum item_id it bool8 IsMonster__0230F980(struct entity *entity); void ov29_0230F9A4(struct entity *entity, struct item *item); void TrySpawnEnemyItemDrop(struct entity *attacker, struct entity *defender); +void ov29_0230FB30(struct entity *entity); #endif //PMDSKY_OVERLAY_29_0230F8AC_H diff --git a/include/overlay_29_0231E9F0.h b/include/overlay_29_0231E9F0.h index cce9dafb..c85793fd 100644 --- a/include/overlay_29_0231E9F0.h +++ b/include/overlay_29_0231E9F0.h @@ -11,5 +11,6 @@ s16 GetMaxPpWrapper(struct move *move); void InitMoveWrapper(struct entity *entity, struct move *move, enum move_id move_id); int MoveIsNotPhysical(enum move_id move_id); bool8 CategoryIsNotPhysical(s32 category); +void MakeFloorOneRoom(struct entity *user, struct entity *target); #endif //PMDSKY_OVERLAY_29_0231E9F0_H diff --git a/include/overlay_29_0232C300.h b/include/overlay_29_0232C300.h index df056d05..ac726237 100644 --- a/include/overlay_29_0232C300.h +++ b/include/overlay_29_0232C300.h @@ -1,10 +1,13 @@ #ifndef PMDSKY_OVERLAY_29_0232C300_H #define PMDSKY_OVERLAY_29_0232C300_H +#include "util.h" + #include "dungeon_mode.h" #include "item.h" #include "move.h" bool8 DoMoveSeeTrap(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id); +bool8 DoMoveTakeaway(struct entity *attacker, struct entity *defender, struct move *move, enum item_id item_id); #endif diff --git a/include/status_checks.h b/include/status_checks.h index f7911e2e..1802dab1 100644 --- a/include/status_checks.h +++ b/include/status_checks.h @@ -5,5 +5,6 @@ // Returns true if the monster has any status problem that prevents it from acting bool8 HasStatusThatPreventsActing(struct entity *monster); +bool8 HasStatusThatPreventsLeaderActing(struct entity *monster); #endif //PMDSKY_STATUS_CHECKS_H diff --git a/include/window.h b/include/window.h index 773bfb82..1511b412 100644 --- a/include/window.h +++ b/include/window.h @@ -67,7 +67,7 @@ typedef struct { u16 unk1C; u16 padding_1E; u32 unk20; - u32 unk24; + void *unk24; u16 padding_28; u16 unk2A; u8 unk2C; @@ -118,6 +118,11 @@ struct unk_022A7A6C { u8 field_0x0[8]; u16 field_0x8; u16 field_0xA; + u8 field_0xC[0x3C]; + u16 field_0x48; + u8 field_0x4A[0xA]; + u32 field_0x54; + s16 field_0x58; }; extern struct unk_022A7A6C _022A7A6C; diff --git a/main.lsf b/main.lsf index 385cf283..bb676c4f 100644 --- a/main.lsf +++ b/main.lsf @@ -32,7 +32,6 @@ Static main Object src/main_0200383C.o Object asm/main_020038D8.o Object src/main_02003D2C.o - Object asm/main_02003DB8.o Object src/main_02003ED0.o Object asm/main_rodata_02092580.o Object asm/main_rodata_020925A0.o @@ -54,7 +53,6 @@ Static main Object src/main_0200B330.o Object asm/main_0200B33C.o Object src/main_0200BC54.o - Object asm/main_0200BC60.o Object src/main_0200BD2C.o Object asm/main_0200BD50.o Object src/debug.o @@ -141,9 +139,7 @@ Static main Object asm/main_0202676C.o Object src/main_020275F8.o Object src/main_02027648.o - Object asm/main_020276C0.o Object src/main_020278A8.o - Object asm/main_020278C4.o Object src/main_02027A80.o Object src/main_02027AF0.o Object asm/main_02027B88.o @@ -252,7 +248,6 @@ Static main Object asm/main_0204F0A0.o Object src/main_0204F9B8.o Object src/main_0204FA24.o - Object asm/main_0204FA70.o Object src/main_0204FB9C.o Object src/main_0204FD3C.o Object src/main_0204FDFC.o @@ -315,15 +310,12 @@ Static main Object src/main_02059A74.o Object asm/main_02059B18.o Object src/main_0205A288.o - Object asm/main_0205A340.o Object src/main_0205A430.o Object asm/main_0205A4B4.o Object src/main_0205B008.o Object asm/main_0205B0B8.o Object src/main_0205B354.o - Object asm/main_0205B39C.o Object src/main_0205B440.o - Object asm/main_0205B478.o Object src/main_0205B554.o Object asm/main_0205B5A8.o Object src/main_0205B690.o @@ -822,9 +814,7 @@ Overlay OVY_29 Object src/position_util.o Object asm/overlay_29_rodata_02351628.o Object src/dungeon_range.o - Object asm/overlay_29_022E9298.o Object src/dungeon_range_2.o - Object asm/overlay_29_022E9488.o Object src/dg_uty.o Object asm/overlay_29_022E9628.o Object src/overlay_29_022E99F0.o @@ -833,7 +823,6 @@ Overlay OVY_29 Object src/overlay_29_022EA968.o Object src/overlay_29_022EA9CC.o Object src/dg_random.o - Object asm/overlay_29_022EAB50.o Object src/overlay_29_022EAC34.o Object src/overlay_29_022EAC7C.o Object asm/overlay_29_022EAD68.o @@ -884,7 +873,6 @@ Overlay OVY_29 Object asm/overlay_29_022F62CC.o Object src/overlay_29_022F7364.o Object src/overlay_29_022F73B4.o - Object asm/overlay_29_022F740C.o Object src/overlay_29_022F7654.o Object asm/overlay_29_022F7768.o Object src/dungeon_misc.o @@ -910,7 +898,6 @@ Overlay OVY_29 Object src/overlay_29_022FED98.o Object asm/overlay_29_022FEDBC.o Object src/status_checks.o - Object asm/overlay_29_022FF3F4.o Object src/dungeon_mobility.o Object asm/overlay_29_022FF6C4.o Object src/overlay_29_022FF898.o @@ -933,7 +920,6 @@ Overlay OVY_29 Object src/dungeon_ai_targeting_1.o Object asm/overlay_29_rodata_023527C0.o Object src/overlay_29_023018AC.o - Object asm/overlay_29_02301940.o Object src/overlay_29_02301A60.o Object asm/overlay_29_02301A84.o Object src/dungeon_pokemon_attributes.o @@ -942,7 +928,6 @@ Overlay OVY_29 Object src/dungeon_logic_5.o Object src/dungeon_logic_2.o Object src/overlay_29_023026CC.o - Object asm/overlay_29_023026FC.o Object src/overlay_29_02302A38.o Object asm/overlay_29_02302A5C.o Object src/overlay_29_023047B8.o @@ -954,7 +939,6 @@ Overlay OVY_29 Object src/overlay_29_02306728.o Object asm/overlay_29_023068C4.o Object src/overlay_29_02307EF8.o - Object asm/overlay_29_02307F4C.o Object src/dungeon_ai_leader.o Object src/dungeon_ai.o Object asm/overlay_29_023085DC.o @@ -963,7 +947,6 @@ Overlay OVY_29 Object src/overlay_29_0230A9DC.o Object asm/overlay_29_0230AA8C.o Object src/overlay_29_0230AB58.o - Object asm/overlay_29_0230ABF0.o Object src/type_effectiveness.o Object src/dungeon_damage.o Object asm/overlay_29_rodata_02352894.o @@ -976,7 +959,6 @@ Overlay OVY_29 Object asm/overlay_29_data_02353700.o Object src/overlay_29_0230F810.o Object src/overlay_29_0230F8AC.o - Object asm/overlay_29_0230FB30.o Object src/overlay_29_02311010.o Object asm/overlay_29_02311088.o Object src/overlay_29_023118B4.o @@ -1013,7 +995,6 @@ Overlay OVY_29 Object asm/overlay_29_0231CBEC.o Object src/dungeon_ai_item_weight.o Object src/overlay_29_0231E9F0.o - Object asm/overlay_29_0231EA40.o Object src/overlay_29_0231EDD8.o Object src/overlay_29_0231F570.o Object asm/overlay_29_0231F594.o @@ -1129,7 +1110,6 @@ Overlay OVY_29 Object src/overlay_29_0232BF78.o Object asm/overlay_29_0232BF88.o Object src/overlay_29_0232C300.o - Object asm/overlay_29_0232C310.o Object src/overlay_29_0232C500.o Object src/overlay_29_0232C560.o Object asm/overlay_29_0232C578.o diff --git a/src/dg_random.c b/src/dg_random.c index 1cebc260..97b412d3 100644 --- a/src/dg_random.c +++ b/src/dg_random.c @@ -1,4 +1,8 @@ #include "dg_random.h" +#include "dungeon_util_static.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_pokemon_attributes_1.h" +#include "main_02001894.h" extern prng_state DUNGEON_PRNG_STATE; extern u32 DUNGEON_PRNG_STATE_SECONDARY_VALUES[]; @@ -80,3 +84,31 @@ bool8 DungeonRandOutcome__022EAB50(s32 percentChance) } return FALSE; } + +s32 CalcStatusDuration(struct entity *entity, const s16 *turn_range, bool8 iq_skill_effects) +{ + bool8 valid; + s32 duration = DungeonRandRange(turn_range[0], turn_range[1]); + + if (entity == NULL) + valid = FALSE; + else + valid = GetEntityType(entity) != ENTITY_NOTHING; + + if (valid && GetEntityType(entity) == ENTITY_MONSTER && iq_skill_effects) + { + if (IqSkillIsEnabled(entity, IQ_SELF_CURER) && duration != 127) + duration = RoundUpDiv256(duration * 256 / 2); + + if (AbilityIsActiveVeneer(entity, ABILITY_NATURAL_CURE) && duration != 127) + { + if (duration >= 5) + duration = 5; + } + } + + if (duration < 1) + duration = 1; + + return duration; +} diff --git a/src/dungeon_range.c b/src/dungeon_range.c index b5195a59..58d09b58 100644 --- a/src/dungeon_range.c +++ b/src/dungeon_range.c @@ -56,3 +56,24 @@ bool8 IsPositionInSight(struct position *origin, struct position *target, bool8 return TRUE; } + +void ov29_022E9298(struct position *pos, struct unk_022E9298 *bounds, bool8 a) +{ + struct tile *tile = GetTile(pos->x, pos->y); + s16 visibility = GetVisibilityRange(); + u8 origin_room = tile->room; + + if (a || origin_room == CORRIDOR_ROOM) { + bounds->field_0x0 = pos->x - visibility; + bounds->field_0x8 = pos->x + visibility + 1; + bounds->field_0x4 = pos->y - visibility; + bounds->field_0xc = pos->y + visibility + 1; + } + else { + struct room_data *room = &DUNGEON_PTR[0]->room_data[origin_room]; + bounds->field_0x0 = room->bottom_right_corner.x - 1; + bounds->field_0x8 = room->top_left_corner.x + 2; + bounds->field_0x4 = room->bottom_right_corner.y - 1; + bounds->field_0xc = room->top_left_corner.y + 2; + } +} diff --git a/src/dungeon_range_2.c b/src/dungeon_range_2.c index cc276288..85c55ef4 100644 --- a/src/dungeon_range_2.c +++ b/src/dungeon_range_2.c @@ -1,8 +1,24 @@ #include "dungeon_range_2.h" #include "dungeon.h" #include "dungeon_map_access.h" +#include "main_0201BCCC.h" #include "MSL_C/stdlib.h" +struct unk_0237C888 { + u16 field_0x0; + u16 field_0x2; + u16 field_0x4; + u16 field_0x6; + s16 field_0x8; + s16 field_0xa; +}; + +extern struct dungeon *DUNGEON_PTR[]; +extern struct unk_0201BCCC *OBJ_GRAPHICS_CONTROLS_PTR; +extern struct unk_0237C888 ov29_0237C888[2][6]; + +extern s32 AddSimpleObjToOam(void *controls, void *oam_data, s32 x); + bool8 IsPositionWithinTwoTiles(struct position *origin, struct position *target) { s32 i; @@ -67,3 +83,26 @@ bool8 IsPositionWithinTwoTiles(struct position *origin, struct position *target) } return FALSE; } + +bool8 DisplayThrownItemShadow(s32 x, s32 y, u8 index) +{ + struct dungeon *dungeon = DUNGEON_PTR[0]; + s32 dx = x - dungeon->display_data.camera_pixel_pos.x; + s32 dy = y - dungeon->display_data.camera_pixel_pos.y; + + if (dx >= -16 && dy >= -16 && dx < 271 && dy < 208) + { + s32 sx; + s32 sy; + + sx = dx + ov29_0237C888[0][index].field_0x8; + ov29_0237C888[0][index].field_0x2 &= ~0x1FF; + ov29_0237C888[0][index].field_0x2 |= sx & 0x1FF; + sy = dy + ov29_0237C888[0][index].field_0xa; + ov29_0237C888[0][index].field_0x6 &= ~0xFFF0; + ov29_0237C888[0][index].field_0x6 |= (sy & 0xFFF) << 4; + AddSimpleObjToOam(OBJ_GRAPHICS_CONTROLS_PTR, &ov29_0237C888[0][index], 0); + return TRUE; + } + return FALSE; +} \ No newline at end of file diff --git a/src/main_02003D2C.c b/src/main_02003D2C.c index 58891bbc..dae35249 100644 --- a/src/main_02003D2C.c +++ b/src/main_02003D2C.c @@ -1,5 +1,11 @@ #include "main_02003D2C.h" #include +#include "main_0200238C.h" +#include "main_020027E8.h" + +extern u8 _02092540[]; +extern u8 _020AF050[]; +extern struct unk_020027E8 _020AF078; extern u8 _0209251C[]; extern u8 _02092508[]; @@ -33,3 +39,58 @@ void CardBackupError(void) Debug_Print0(_0209252C); _020AEF7C[0xc]=1; } + + +void OS_WaitIrq(BOOL clear, s32 irq); +struct unk_020027E8 *sub_02002580(void); +void sub_020029B8(void *a); +void sub_020081C8(void); +bool8 sub_020081F0(void); +void sub_0200B76C(s32 a); +void sub_020184A8(void); +void Card_TerminateForPulledOut(void); + +void HaltProcessDisp(s32 a) +{ + u8 is_main; + s32 i; + + is_main = sub_02002580() == &_020AF078; + if (_020AEF7C[0xf] == 0) { + _020AEF7C[0xf] = 1; + if (is_main) { + while (!sub_020081F0()) { + OS_SleepThread(NULL); + sub_020029B8(_020AF050); + } + } else { + sub_020081C8(); + } + } + + sub_02002824(1); + sub_020184A8(); + Debug_Print0(_02092540, a); + + if (a == 2) { + sub_0200B76C(1); + for (i = 0; i < 300; i++) { + if (_020AEF7C[0xd] != 0) { + break; + } + OS_WaitIrq(TRUE, 1); + } + if (_020AEF7C[0xd] == 0) { + sub_02002448(0); + } + } + + if (a != 1) { + sub_0200B76C(0); + } + Card_TerminateForPulledOut(); + sub_020025F8(0); +} +void sub_02003ECC(void) +{ +} \ No newline at end of file diff --git a/src/main_0200BC54.c b/src/main_0200BC54.c index fb30704a..da699f60 100644 --- a/src/main_0200BC54.c +++ b/src/main_0200BC54.c @@ -1,8 +1,55 @@ #include "main_0200BC54.h" extern bool8 HandleFades(struct screen_fade *fstruct); +extern void UpdateFadeStatus(struct screen_fade *fstruct, s32 a, s32 b); +extern void sub_0200B928(struct screen_fade *fstruct, s32 a); bool8 HandleFadesVeneer(struct screen_fade *fstruct) { HandleFades(fstruct); } + +void sub_0200BC60(struct screen_fade *fstruct, s32 a, s32 b, u8 *c) +{ + u8 *dst; + u32 n; + + fstruct->field_0x0 = a; + dst = fstruct->field_0x16; + n = 4; + do { + *dst++ = *c++; + } while (--n != 0); + + if (a == 3 || a == 5 || a == 7 || a == 9 || a == 11) { + UpdateFadeStatus(fstruct, 2, b); + } else { + sub_0200B928(fstruct, b); + } +} + +void sub_0200BCB0(struct screen_fade *fstruct, s32 a, s32 b, u8 *c) +{ + u8 *dst; + u32 n; + + fstruct->field_0x0 = a; + dst = fstruct->field_0x16; + n = 4; + do { + *dst++ = *c++; + } while (--n != 0); + + if (a == 1) { + UpdateFadeStatus(fstruct, 1, b); + } else if (a == 3 || a == 5 || a == 7 || a == 9 || a == 11) { + sub_0200B928(fstruct, b); + } else { + UpdateFadeStatus(fstruct, 2, b); + } +} + +bool8 sub_0200BD14(struct screen_fade *fstruct) +{ + return fstruct->status != 0; +} diff --git a/src/main_02027648.c b/src/main_02027648.c index 264767c1..56904553 100644 --- a/src/main_02027648.c +++ b/src/main_02027648.c @@ -1,4 +1,8 @@ #include "main_02027648.h" +#include "main_02001188.h" +#include "main_02027AF0.h" +#include "main_020278A8.h" +#include "main_02029A50.h" #include "window.h" u32 sub_02027624(s32 window_id) @@ -36,3 +40,84 @@ s32 NewWindowScreenCheck(s32 a, s32 b) } return NewWindow(a, b); } + +s32 NewWindow(s32 a, s32 b) +{ + s8 i; + Window *w; + struct unk_022A7B1C *p; + WindowTemplate *tmpl; + u16 tile; + s32 bg; + s32 n; + u32 vbase; + u8 *vram; + + tmpl = (WindowTemplate *)a; + w = WINDOW_LIST; + p = _022A7B1C; + for (i = 0; i < 20; i++, w++, p++) { + if (w->is_active == 0) { + break; + } + } + + w->template = *tmpl; + w->row_stride = (tmpl->width * 8) - 8; + w->pixel_buffer = MemAlloc(w->template.height * (w->template.width * 64), 8); + + bg = w->template.bg_id; + tile = _022A7A74[bg]; + n = w->template.width * w->template.height + tile; + w->base_tile = tile; + _022A7A74[bg] = n; + if (w->template.unk09 == -9) { + w->unk30 = tile | 0x1000; + } else { + w->unk30 = tile; + } + if (w->template.bg_id == 0) { + vbase = 0x6000000; + } else { + vbase = 0x6200000; + } + vram = (u8 *)(vbase + (tile << 6)); + w->vram_base = vram; + w->active_vram_dest = vram; + w->transfer_length = (w->template.width * w->template.height) << 6; + w->unk11 = 0; + sub_02027B1C(i); + w->id = i; + w->is_active = 1; + w->unkB7 = 1; + w->unkB4 = b; + sub_020278C4(i); + w->unkB8 = -1; + InitRender3dElement64(&w->render_elem_1); + w->render_elem_1.unk3C = 2; + w->render_elem_1.unk2A = 9; + w->render_elem_1.unk3E = 2; + w->render_elem_1.unk2C = 0x20; + w->render_elem_1.unk2D = 0x20; + w->render_elem_1.unk2E = 0x20; + w->render_elem_1.unk2F = 0x90; + InitRender3dElement64(&w->render_elem_2); + w->render_elem_2.unk14 = _022A7A6C.field_0x48; + w->render_elem_2.unk16 = 0; + w->render_elem_2.unk18 = 0; + w->render_elem_2.unk1A = 0x18; + w->render_elem_2.unk1C = 0x18; + w->render_elem_2.unk20 = _022A7A6C.field_0x54; + w->render_elem_2.unk24 = GetPaletteBaseAddress__020278A8(_022A7A6C.field_0x58, 0); + w->render_elem_2.unk3C = 6; + w->render_elem_2.unk2A = 0xA; + w->render_elem_2.unk00 = 0; + w->render_elem_2.unk02 = 0; + w->render_elem_2.unk04 = 0; + w->render_elem_2.unk06 = 0; + InitWindowTrailer(&w->cursor_params); + p->field_0x0 = 0; + sub_02029A50(&p->field_0x4); + p->field_0x4.unk26 = w->template.bg_id; + return i; +} diff --git a/src/main_020278A8.c b/src/main_020278A8.c index d3d2d790..2d7c23cb 100644 --- a/src/main_020278A8.c +++ b/src/main_020278A8.c @@ -7,3 +7,87 @@ u16* GetPaletteBaseAddress__020278A8(s32 a, s32 b) { return &(*(u16 **)(_020AFC70 + 0xE0))[(a << 8) + b]; } + +void sub_020278C4(s32 window_id) +{ + s8 cur; + s8 prev; + s8 prio; + s8 head; + + prev = -2; +#ifdef JAPAN + head = (s8)_022A7A6C.field_0x0[1]; +#else + head = (s8)_022A7A6C.field_0x0[3]; +#endif + prio = (s8)WINDOW_LIST[window_id].unkB4; + cur = head; + + if (head == -2) { +#ifdef JAPAN + _022A7A6C.field_0x0[1] = window_id; +#else + _022A7A6C.field_0x0[3] = window_id; +#endif + WINDOW_LIST[window_id].next_window_id = head; + return; + } + + while (cur != -2) { + if ((s8)WINDOW_LIST[cur].unkB4 < prio) { + break; + } + prev = cur; + cur = WINDOW_LIST[cur].next_window_id; + } + + if (prev == -2) { +#ifdef JAPAN + WINDOW_LIST[window_id].next_window_id = (s8)_022A7A6C.field_0x0[1]; + _022A7A6C.field_0x0[1] = window_id; +#else + WINDOW_LIST[window_id].next_window_id = (s8)_022A7A6C.field_0x0[3]; + _022A7A6C.field_0x0[3] = window_id; +#endif + return; + } + + cur = WINDOW_LIST[prev].next_window_id; + WINDOW_LIST[prev].next_window_id = window_id; + WINDOW_LIST[window_id].next_window_id = cur; +} + +void sub_02027974(s32 window_id) +{ + s8 cur; + s8 prev; + + prev = -2; +#ifdef JAPAN + cur = (s8)_022A7A6C.field_0x0[1]; +#else + cur = (s8)_022A7A6C.field_0x0[3]; +#endif + + while (cur != -2) { + if (window_id == WINDOW_LIST[cur].id) { + break; + } + prev = cur; + cur = WINDOW_LIST[cur].next_window_id; + } + + if (prev == -2) { +#ifdef JAPAN + _022A7A6C.field_0x0[1] = WINDOW_LIST[window_id].next_window_id; +#else + _022A7A6C.field_0x0[3] = WINDOW_LIST[window_id].next_window_id; +#endif + WINDOW_LIST[window_id].next_window_id = -2; + } + else { + WINDOW_LIST[prev].next_window_id = WINDOW_LIST[cur].next_window_id; + WINDOW_LIST[cur].next_window_id = -2; + } +} diff --git a/src/main_0204FA24.c b/src/main_0204FA24.c index 6fcef6e9..56d31f1b 100644 --- a/src/main_0204FA24.c +++ b/src/main_0204FA24.c @@ -15,3 +15,39 @@ struct dungeon_floor_pair* GetAdventureLogDungeonFloor(void) { return &ADVENTURE_LOG_PTR->current_floor; } + +void ClearAdventureLogStruct(void) +{ + s32 i; + + for (i = 0; i < 4; i++) { + ADVENTURE_LOG_PTR->completion_flags[i] = 0; + } + ADVENTURE_LOG_PTR->pokemon_joined_counter = 0; + ADVENTURE_LOG_PTR->pokemon_battled_counter = 0; + ADVENTURE_LOG_PTR->moves_learned_counter = 0; + ADVENTURE_LOG_PTR->nb_victories_on_one_floor = 0; + ADVENTURE_LOG_PTR->nb_dungeons_cleared = 0; + ADVENTURE_LOG_PTR->nb_friend_rescues = 0; + ADVENTURE_LOG_PTR->nb_evolutions = 0; + ADVENTURE_LOG_PTR->nb_eggs_hatched = 0; + ADVENTURE_LOG_PTR->successful_steals = 0; + ADVENTURE_LOG_PTR->nb_faints = 0; + ADVENTURE_LOG_PTR->nb_big_treasure_wins = 0; + ADVENTURE_LOG_PTR->nb_recycled = 0; + ADVENTURE_LOG_PTR->nb_gifts_sent = 0; + for (i = 0; i < 37; i++) { + ADVENTURE_LOG_PTR->pokemon_joined_flags[i] = 0; + ADVENTURE_LOG_PTR->pokemon_battled_flags[i] = 0; + } + for (i = 0; i < 17; i++) { + ADVENTURE_LOG_PTR->moves_learned_flags[i] = 0; + } + for (i = 0; i < 44; i++) { + ADVENTURE_LOG_PTR->items_acquired_flags[i] = 0; + } + ADVENTURE_LOG_PTR->special_challenge_flags = 0; + for (i = 0; i < 5; i++) { + ADVENTURE_LOG_PTR->sentry_duty_game_points[i] = (5 - i) * 1000; + } +} diff --git a/src/main_0205A288.c b/src/main_0205A288.c index 30e7f21d..ffc91441 100644 --- a/src/main_0205A288.c +++ b/src/main_0205A288.c @@ -1,11 +1,21 @@ #include "main_0205A288.h" #include "common.h" +#include "main_0204FDFC.h" +#include "main_020251AC.h" +#include "main_020526EC.h" #include "main_02055410.h" +#include "main_02056294.h" -extern void sub_0205A340(s16 *ptr, struct ground_monster *data, s32 monster_id); -extern const u8* GetNameString(enum monster_id monster_id); +struct unk_0205379C { + s32 field_0x0; + s32 field_0x4; + s32 field_0x8; +}; + +extern void GetLvlUpEntry(struct unk_0205379C *entry, s32 monster_id, s32 level); +extern void StrcpyName(const unsigned char *dest, const unsigned char *src); +extern void sub_02025304_JP(const unsigned char *dest, const unsigned char *src); extern void StrncpyName(char *dest, const char *src, u32 n); -extern void SetPokemonJoined(enum monster_id monster_id); bool8 HandleShedinjaEvolution(s16 *member_idx, enum monster_id monster_id) { @@ -27,3 +37,36 @@ bool8 HandleShedinjaEvolution(s16 *member_idx, enum monster_id monster_id) return TRUE; } + +s16 sub_0205A340(s16 *member_idx, struct ground_monster *src, enum monster_id monster_id) +{ + struct ground_monster mon; + struct unk_0205379C entry; + u8 name_buf[64]; + s16 old_id; + + mon = *src; + old_id = mon.id; + GetLvlUpEntry(&entry, monster_id, mon.level); + mon.id = monster_id; + mon.exp = entry.field_0x0; + if (mon.level_at_first_evo == 0) { + mon.level_at_first_evo = mon.level; + } else if (mon.level_at_second_evo == 0) { + mon.level_at_second_evo = mon.level; + } +#ifdef JAPAN + sub_02025304_JP(name_buf, GetNameString((enum monster_id)old_id)); +#else + StrcpyName(name_buf, GetNameString((enum monster_id)old_id)); +#endif + if (StrncmpSimple(name_buf, (const unsigned char *)mon.name, 10) == 0) { + StrncpyName(mon.name, (const char *)GetNameString(monster_id), 10); + } + if (*member_idx != -1) { + sub_02055D7C(*member_idx, &mon); + } else { + *member_idx = sub_02055CCC(&mon); + } + return *member_idx; +} diff --git a/src/main_0205B354.c b/src/main_0205B354.c index a7236494..095e948c 100644 --- a/src/main_0205B354.c +++ b/src/main_0205B354.c @@ -1,4 +1,10 @@ #include "main_0205B354.h" +#include "main_0202593C.h" +#include "main_020897AC.h" + +extern const char _020A353C[]; +extern const char _020A3544[]; +extern const char _020A354C[]; bool8 sub_0205B354(struct unkStruct_0205B354 *ptr) { @@ -17,3 +23,39 @@ bool8 sub_0205B354(struct unkStruct_0205B354 *ptr) return FALSE; } + +u8 *sub_0205B39C(const s8 *table, s32 value) +{ + s32 count; + u8 *buf; + + buf = AllocateTemp1024ByteBufferFromPool(); + while (table[0] >= 0) + { + if (value >= table[0]) + { + break; + } + table += 2; + } + + count = 0; + buf[0] = 0; + if (table[1] != 0) + { + while (count < table[1] / 2) + { + strcat(buf, _020A353C); + count++; + } + if (table[1] & 1) + { + strcat(buf, _020A3544); + } + } + else + { + strcat(buf, _020A354C); + } + return buf; +} diff --git a/src/main_0205B440.c b/src/main_0205B440.c index 7c75f8f0..d483892d 100644 --- a/src/main_0205B440.c +++ b/src/main_0205B440.c @@ -1,4 +1,5 @@ #include "main_0205B440.h" +#include "main_0200330C.h" #include "main_0205B690.h" extern union unkStruct_020B0A54_union _020B0A54; @@ -8,6 +9,10 @@ extern void _022B5910(void); extern void _022B57C0(void); extern void _022B580C(void); +extern u32 _022B57BC; + +extern void sub_0204A198(u8 *macAddr); + u8* sub_0205B440(void) { return &_020A3550; @@ -19,3 +24,28 @@ void sub_0205B44C(void) _020B0A54.fp[2] = _022B57C0; _020B0A54.fp[1] = _022B580C; } + +void sub_0205B478(void) +{ + u8 macAddr[6]; + s32 i; + + sub_0204A198(macAddr); + _022B57BC = (macAddr[2] << 24) | (macAddr[3] << 16) | (macAddr[4] << 8) | macAddr[5]; + MemsetSimple((u8 *) _020B0A54.struct0, 0, 0x1600); + MemsetSimple((u8 *) _020B0A54.struct1.unk8.unk8, 0, 0x4C); + + for (i = 0; i < 32; i++) + { + _020B0A54.struct0[i].unk0 = 0; + _020B0A54.struct0[i].unkA2 = 0; + } + + ((struct unk_022B580C *) _020B0A54.struct1.unk4)->field_0x0 = 0; + + for (i = 0; i < 32; i++) + { + ((struct unk_022B580C *) _020B0A54.struct1.unk4)->field_0x4[i].field_0x0 = 0; + ((struct unk_022B580C *) _020B0A54.struct1.unk4)->field_0x4[i].field_0x4 = -1; + } +} diff --git a/src/overlay_29_022F73B4.c b/src/overlay_29_022F73B4.c index d2e69af2..de49308d 100644 --- a/src/overlay_29_022F73B4.c +++ b/src/overlay_29_022F73B4.c @@ -2,8 +2,24 @@ #include "dungeon.h" #include "util.h" #include "enums.h" +#include "wan.h" +#include "main_02001188.h" +#include "main_020526EC.h" +#include "main_020527A8.h" +#include "main_02054AA4.h" +#include "main_02054DC4.h" extern struct dungeon *DUNGEON_PTR[]; +extern struct wan_table *WAN_TABLE; +extern void *ov29_0237C9B0[2]; +extern s16 LoadWanTableEntryFromPack(struct wan_table *wan_table, u16 pack_id, + u16 file_index, u32 malloc_flags, + bool8 compressed); +extern s16 LoadWanTableEntryFromPackUseProvidedMemory(struct wan_table *wan_table, + u16 pack_id, u16 file_index, + void *buf, bool8 compressed); +extern u32 DirectoryFileMngr_GetDirectoryFileSize(enum pack_file_id pack_id, + u32 file_index); bool32 FloorNumberIsEven() { struct dungeon *dungeon = DUNGEON_PTR[0]; @@ -16,3 +32,56 @@ s16 GetKecleonIdToSpawnByFloor() if (!FloorNumberIsEven()) return MONSTER_KECLEON; else return MONSTER_KECLEON_SECONDARY; } + +void StoreSpriteFileIndexBothGenders(s16 monster_id, s16 file_id) +{ + s16 *sprite_indexes = (s16 *)DUNGEON_PTR[0]->sprite_indexes; + u16 sprite_index = GetSpriteIndex__020526EC(monster_id); + + sprite_indexes[monster_id] = file_id; + if (GetMonsterGender(monster_id) == 3) + return; + + if (monster_id < MONSTER_GENDER_ID_OFFSET) { + s32 other_id = monster_id + MONSTER_GENDER_ID_OFFSET; + if (GendersEqualNotGenderless(monster_id, other_id)) + return; + if (sprite_index == GetSpriteIndex__020526EC(other_id)) + sprite_indexes[other_id] = sprite_indexes[monster_id]; + } else { + s32 other_id = monster_id - MONSTER_GENDER_ID_OFFSET; + if (GendersEqualNotGenderless(monster_id, other_id)) + return; + if (sprite_index == GetSpriteIndex__020526EC(other_id)) + sprite_indexes[other_id] = sprite_indexes[monster_id]; + } +} + +void LoadMonsterSpriteInner(s16 monster_id) +{ + struct dungeon *dungeon = DUNGEON_PTR[0]; + u16 sprite_index; + s32 slot; + + if (((s16 *)dungeon->sprite_indexes)[monster_id] != 0) + return; + + sprite_index = GetSpriteIndex__020526EC(monster_id); + if (IsShaymin(monster_id)) { + if (IsShaymin(monster_id)) + slot = 0; + ov29_0237C9B0[slot] = MemAlloc(GetSpriteFileSize(monster_id), 0); + StoreSpriteFileIndexBothGenders( + monster_id, + LoadWanTableEntryFromPackUseProvidedMemory(WAN_TABLE, PACK_ARCHIVE_MONSTER, + sprite_index, + ov29_0237C9B0[slot], TRUE)); + } else { + StoreSpriteFileIndexBothGenders( + monster_id, + LoadWanTableEntryFromPack(WAN_TABLE, PACK_ARCHIVE_MONSTER, + sprite_index, 0, TRUE)); + } + DUNGEON_PTR[0]->field_0x2cb0c += + DirectoryFileMngr_GetDirectoryFileSize(PACK_ARCHIVE_MONSTER, sprite_index); +} diff --git a/src/overlay_29_023018AC.c b/src/overlay_29_023018AC.c index 7f455f22..e90fa525 100644 --- a/src/overlay_29_023018AC.c +++ b/src/overlay_29_023018AC.c @@ -1,6 +1,18 @@ #include "overlay_29_023018AC.h" #include "dungeon_util_static.h" #include "joined_at_checks.h" +#include "dungeon_util_2.h" +#include "weather.h" +#include "overlay_29_02301A60.h" +#include "overlay_29_0234B340.h" + +#ifdef JAPAN +#define MESSAGE_C36 0x975 +#define MESSAGE_C37 0x976 +#else +#define MESSAGE_C36 0xC36 +#define MESSAGE_C37 0xC37 +#endif enum monster_treatment GetTreatmentBetweenMonstersIgnoreStatus(struct entity *entity1, struct entity *entity2) { @@ -40,3 +52,36 @@ enum monster_treatment GetTreatmentBetweenMonstersIgnoreStatus(struct entity *en return TREATMENT_TREAT_AS_ALLY; #endif } + +bool8 SafeguardIsActive(struct entity *user, struct entity *target, bool8 log_message) +{ + if (GetEntInfo(target)->reflect_class_status.reflect == STATUS_REFLECT_SAFEGUARD) + { + if (log_message) + { + SubstitutePlaceholderStringTags(0, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_C36); + } + return TRUE; + } + return FALSE; +} + +bool8 LeafGuardIsActive(struct entity *user, struct entity *target, bool8 log_message) +{ + if (GetApparentWeather(target) == WEATHER_SUNNY && +#ifdef JAPAN + DefenderAbilityIsActive__02301A0C(user, target, ABILITY_LEAF_GUARD)) +#else + DefenderAbilityIsActive__02301A0C(user, target, ABILITY_LEAF_GUARD, TRUE)) +#endif + { + if (log_message) + { + SubstitutePlaceholderStringTags(0, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_C37); + } + return TRUE; + } + return FALSE; +} diff --git a/src/overlay_29_023026CC.c b/src/overlay_29_023026CC.c index e9117d32..2607ff05 100644 --- a/src/overlay_29_023026CC.c +++ b/src/overlay_29_023026CC.c @@ -1,6 +1,39 @@ #include "overlay_29_023026CC.h" +#include "dg_random.h" +#include "dungeon.h" #include "dungeon_items.h" #include "dungeon_pokemon_attributes.h" +#include "enums.h" +#include "main_0200C4FC.h" +#include "main_0202593C.h" +#include "main_02058C3C.h" +#include "overlay_29_022ED01C.h" +#include "overlay_29_022F7364.h" +#include "overlay_29_02302A38.h" +#include "overlay_29_0234B024.h" +#include "overlay_29_0234B4BC.h" +#include "spawn_2.h" + +struct unk_023527F8 { + s32 field_0x0; + s32 field_0x4; +}; + +extern struct dungeon *DUNGEON_PTR[]; + +extern const struct unk_023527F8 ov29_023527F8[2]; + +extern void CreateTemporaryEntity(struct entity *entity); +extern void SetPreprocessorArgsStringToName(struct preprocessor_args *preprocessor_args, + s32 pos, struct monster *monster, + u32 param_4, u8 name_type); +extern bool8 IsExpEnabledInDungeon(s32 dungeon_id); +extern bool8 LevelUp(struct entity *user, struct entity *target, bool8 a, bool8 b); +extern s32 GetEvolutions(s16 monster_id, s16 *out, bool8 a, bool8 b); +extern void EvolveMonster(struct entity *user, struct entity *target, s16 evolution_id); +extern void ov29_02302CC8(struct entity *entity, struct preprocessor_args *args); +extern void ov29_02302C04(struct entity *user, struct entity *target, u8 *tactic_flags, + bool8 a); bool8 ItemIsActive__023026CC(struct entity *entity, enum item_id item_id) { @@ -9,3 +42,119 @@ bool8 ItemIsActive__023026CC(struct entity *entity, enum item_id item_id) return HasHeldItem(entity, item_id); } + +#ifdef JAPAN +#define MESSAGE_F1F 0x2486 +#else +#define MESSAGE_F1F 0xF1F +#endif + +void EnemyEvolution(struct entity *entity) +{ + struct entity temp; + struct preprocessor_args args; + u8 tactic_flags[12]; + s16 evolutions[DUNGEON_MAX_POKEMON]; + struct unk_023527F8 old_offensive; + struct unk_023527F8 old_defensive; + s32 dungeon_id; + s32 old_hp; + struct dungeon *dungeon; + s32 i; + struct entity *target; + s32 leveled_up; + s32 n; + s32 k; + s32 j; + struct monster *monster; + u32 exp_gain; + + AllocateTemp1024ByteBufferFromPool(); + dungeon = DUNGEON_PTR[0]; + dungeon_id = dungeon->id; + if (!dungeon->should_enemy_evolve) + return; + dungeon->should_enemy_evolve = FALSE; + if (GetForcedLossReason() != FORCED_LOSS_NONE) + return; + if (!EntityIsValid__02302A38(entity)) { + CreateTemporaryEntity(&temp); + entity = &temp; + } + + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + leveled_up = FALSE; + target = DUNGEON_PTR[0]->active_monster_ptrs[i]; + old_offensive = ov29_023527F8[0]; + old_defensive = ov29_023527F8[1]; + old_hp = 0; + if (target == NULL) + continue; + if (!EntityIsValid__02302A38(target)) + continue; + monster = (struct monster *) target->info; + if (monster->hp == 0) + continue; + + if (monster->field_0x102) { + monster->field_0x102 = 0; + } else { + exp_gain = monster->unk_exp_tracker; + if (exp_gain != 0) { + if (monster->is_team_leader) + GetUnlockedTacticFlags(tactic_flags, monster->level); + old_hp = monster->max_hp_stat + monster->max_hp_boost; + if (old_hp > 999) + old_hp = 999; + old_offensive.field_0x0 = monster->offensive_stats[0]; + old_offensive.field_0x4 = monster->offensive_stats[1]; + old_defensive.field_0x0 = monster->defensive_stats[0]; + old_defensive.field_0x4 = monster->defensive_stats[1]; + if (monster->level != 100 && IsExpEnabledInDungeon(dungeon_id)) { + monster->exp += exp_gain; + SetMessageLogPreprocessorArgsNumberVal(0, exp_gain); + SetPreprocessorArgsStringToName(GetMessageLogPreprocessorArgs(), 0, + monster, 0, 0); + LogMessageByIdWithPopup(entity, MESSAGE_F1F); + leveled_up |= LevelUp(entity, target, TRUE, TRUE); + } + } + + if (monster->should_evolve) { + n = GetEvolutions(monster->id, evolutions, FALSE, FALSE); + if (n != 0) { + j = DungeonRandInt(n); + for (k = 0; k < n; k++) { + if (IsOnMonsterSpawnList(evolutions[j]) && + DungeonGetSpriteIndex(evolutions[j]) != 0) + break; + j++; + if (j >= n) + j = 0; + } + if (k < n) + EvolveMonster(entity, target, evolutions[j]); + } + leveled_up = FALSE; + } + + if (leveled_up && !monster->is_not_team_member) { + s32 new_hp = monster->max_hp_stat + monster->max_hp_boost; + if (new_hp > 999) + new_hp = 999; + args.number_vals[0] = new_hp - old_hp; + args.number_vals[1] = monster->offensive_stats[0] - old_offensive.field_0x0; + args.number_vals[2] = monster->defensive_stats[0] - old_defensive.field_0x0; + args.number_vals[3] = monster->offensive_stats[1] - old_offensive.field_0x4; + args.number_vals[4] = monster->defensive_stats[1] - old_defensive.field_0x4; + ov29_02302CC8(target, &args); + } + + if (exp_gain != 0) + ov29_02302C04(entity, target, tactic_flags, TRUE); + } + + monster->unk_exp_tracker = 0; + monster->should_evolve = FALSE; + } +} \ No newline at end of file diff --git a/src/overlay_29_02307EF8.c b/src/overlay_29_02307EF8.c index e8c482e9..e4be8743 100644 --- a/src/overlay_29_02307EF8.c +++ b/src/overlay_29_02307EF8.c @@ -1,7 +1,33 @@ #include "overlay_29_02307EF8.h" +#include "dg_random.h" #include "dungeon_items.h" +#include "dungeon_map_access.h" #include "dungeon_pokemon_attributes.h" +#include "dungeon_util_1.h" #include "dungeon_util_static.h" +#include "main_02001A54.h" +#include "overlay_29_022E9FC0.h" +#include "spawn_2.h" + +struct unk_022FD084 { + s16 field_0x0; + u8 field_0x2; + u8 field_0x3; + s32 field_0x4; + s16 field_0x8; + s16 field_0xa; + s16 field_0xc; + bool8 field_0xe; + u8 field_0xf; +}; + +extern struct dungeon *DUNGEON_PTR[2]; +extern const s16 ov10_022C4560; +extern const s16 MONSTER_HOUSE_MAX_MONSTER_SPAWNS; + +extern bool8 MewSpawnCheck(s32 monster_id, bool8 a); +extern struct entity *SpawnMonster(struct unk_022FD084 *data, bool8 a); +extern void AnimationDelayOrSomething(bool8 param_1); bool8 EntityIsValid__02307EF8(struct entity *entity) { @@ -18,3 +44,132 @@ bool8 ItemIsActive__02307F1C(struct entity *entity, enum item_id item_id) return HasHeldItem(entity, item_id); } + +void TryTriggerMonsterHouse(struct entity *entity, bool8 a) +{ + struct unk_022FD084 data; + struct position positions[100]; + struct room_data *room; + struct tile *tile; + struct entity *spawned; + s32 count; + s32 idx; + s32 n_spawns; + s32 spawn_x; + s32 i; + s32 j; + s32 scan_x; + s32 x; + s32 y; + s32 scan_y; + s32 x_min; + s32 x_max; + s32 y_min; + s32 y_max; + + if (!EntityIsValid__02307EF8(entity)) + return; + + if (GetEntInfo(entity)->is_not_team_member) + return; + + if (!(GetTileAtEntity(entity)->terrain_flags & TERRAIN_TYPE_IN_MONSTER_HOUSE)) + return; + + if (DUNGEON_PTR[0]->monster_house_triggered) + return; + + DUNGEON_PTR[0]->monster_house_triggered = TRUE; + if (DUNGEON_PTR[0]->gen_info.monster_house_room == 0xFF) + return; + + room = &DUNGEON_PTR[0]->room_data[DUNGEON_PTR[0]->gen_info.monster_house_room]; + count = 0; + + if (a) { + for (y = entity->pos.y - 4; y <= entity->pos.y + 4; y++) { + for (x = entity->pos.x - 4; x <= entity->pos.x + 4; x++) { + tile = GetTileSafe(x, y); + if (tile->monster == NULL && GetTerrainType(tile) == TERRAIN_TYPE_NORMAL) { + if (count < 100) { + positions[count].x = x; + positions[count].y = y; + count++; + } + } + } + } + } + else { + x_min = entity->pos.x - 4; + if (x_min <= room->bottom_right_corner.x) + x_min = room->bottom_right_corner.x; + x_max = entity->pos.x + 5; + if (x_max >= room->top_left_corner.x) + x_max = room->top_left_corner.x; + y_min = entity->pos.y - 4; + if (y_min <= room->bottom_right_corner.y) + y_min = room->bottom_right_corner.y; + y_max = entity->pos.y + 5; + if (y_max >= room->top_left_corner.y) + y_max = room->top_left_corner.y; + + for (scan_y = y_min; scan_y < y_max; scan_y++) { + for (scan_x = x_min; scan_x < x_max; scan_x++) { + tile = GetTileSafe(scan_x, scan_y); + if (tile->monster == NULL && GetTerrainType(tile) == TERRAIN_TYPE_NORMAL + && tile->terrain_flags & TERRAIN_TYPE_IN_MONSTER_HOUSE) { + if (count < 100) { + positions[count].x = scan_x; + positions[count].y = scan_y; + count++; + } + } + } + } + } + + n_spawns = DungeonRandRange(ov10_022C4560, MONSTER_HOUSE_MAX_MONSTER_SPAWNS); + if (n_spawns >= count) + n_spawns = count; + + for (i = 0; i < n_spawns; i++) { + idx = DungeonRandInt(count); + for (j = 0; j < count; j++) { + if (positions[idx].x != 0) + break; + idx++; + if (idx >= count) + idx = 0; + } + + spawn_x = positions[idx].x; + if (spawn_x == 0) + break; + + data.field_0x0 = GetMonsterIdToSpawn(1); + data.field_0x8 = 0; + data.field_0x2 = 0; + data.field_0x4 = 0; + data.field_0xe = TRUE; + data.field_0xa = spawn_x; + data.field_0xc = positions[idx].y; + if (!MewSpawnCheck(data.field_0x0, TRUE)) + continue; + + spawned = SpawnMonster(&data, FALSE); + if (!EntityIsValid__02307EF8(spawned)) + continue; + + spawned->elevation = 0xC800; + for (j = 0; j < 100; j++) { + spawned->elevation = MultiplyByFixedPoint(spawned->elevation, 0xAA); + if (spawned->elevation < 0x100) + break; + AdvanceFrame(0x57); + } + spawned->elevation = 0; + } + + AnimationDelayOrSomething(TRUE); +} diff --git a/src/overlay_29_0230AB58.c b/src/overlay_29_0230AB58.c index b6237b38..a88d131b 100644 --- a/src/overlay_29_0230AB58.c +++ b/src/overlay_29_0230AB58.c @@ -2,6 +2,7 @@ #include "dungeon.h" #include "dungeon_pokemon_attributes.h" #include "dungeon_util_static.h" +#include "overlay_29_0230A994.h" extern struct dungeon *DUNGEON_PTR[]; @@ -26,3 +27,27 @@ bool8 ScrappyShouldActivate(struct entity *attacker, struct entity *defender, en } return FALSE; } + +bool8 IsTypeIneffectiveAgainstGhost(enum type_id type) +{ + if (type == TYPE_NORMAL || type == TYPE_FIGHTING) + return TRUE; + return FALSE; +} + +bool8 GhostImmunityIsActive(struct entity *attacker, struct entity *defender, s16 target_type_idx) +{ + struct monster *defender_monster = GetEntInfo(defender); + if (defender_monster->types[target_type_idx] == TYPE_GHOST) + { + bool8 ghost_immunity_disabled; + if (defender_monster->exposed || ExclusiveItemEffectIsActive__0230A9B8(attacker, EXCLUSIVE_EFF_SCRAPPY)) + ghost_immunity_disabled = TRUE; + else + ghost_immunity_disabled = FALSE; + + if (!ghost_immunity_disabled) + return TRUE; + } + return FALSE; +} diff --git a/src/overlay_29_0230F8AC.c b/src/overlay_29_0230F8AC.c index 2cc6dcae..42e976bf 100644 --- a/src/overlay_29_0230F8AC.c +++ b/src/overlay_29_0230F8AC.c @@ -11,6 +11,18 @@ #include "dungeon_recruitment_2.h" #include "overlay_29_02344BE4.h" #include "overlay_29_02345A3C.h" +#include "dungeon_util_2.h" +#include "overlay_29_02344B9C.h" +#include "overlay_29_0234B104.h" + +#ifdef JAPAN +#define MESSAGE_F62 0x9B6 +#else +#define MESSAGE_F62 0xF62 +#endif + +extern const struct unk_023529A8 ov29_023529A8; +extern s32 ov29_02347184(const s16 *item_ids); extern struct dungeon *DUNGEON_PTR; extern const s16 ov10_022C4650; @@ -100,3 +112,25 @@ void TrySpawnEnemyItemDrop(struct entity *attacker, struct entity *defender) } } } + +struct unk_023529A8 { + s16 field_0x0[2]; +}; + + + +void ov29_0230FB30(struct entity *entity) +{ + struct unk_023529A8 item_ids; + s32 item_id; + + item_ids = ov29_023529A8; + + item_id = ov29_02347184(item_ids.field_0x0); + if (item_id == 0) + return; + + SubstitutePlaceholderStringTags(0, entity, 0); + ov29_02344B9C(0, item_id); + LogMessageByIdWithPopupCheckUser(entity, MESSAGE_F62); +} \ No newline at end of file diff --git a/src/overlay_29_0231E9F0.c b/src/overlay_29_0231E9F0.c index 39282646..ae277a45 100644 --- a/src/overlay_29_0231E9F0.c +++ b/src/overlay_29_0231E9F0.c @@ -2,6 +2,40 @@ #include "moves.h" #include "moves_1.h" #include "main_0201514C.h" +#include "dungeon.h" +#include "dungeon_map_access.h" +#include "dungeon_util_static.h" +#include "fixed_room_data_1.h" +#include "overlay_29_0230558C.h" +#include "overlay_29_02320764.h" +#include "overlay_29_022E9FC0.h" +#include "overlay_29_023047B8.h" +#include "overlay_29_0231EDD8.h" +#include "overlay_29_02336F4C.h" +#include "overlay_29_0234B104.h" + +extern struct dungeon *DUNGEON_PTR[]; + +extern bool8 FloorSecondaryTerrainIsChasm(s32 tileset_id); +extern bool8 StairsAlwaysReachable(s32 x, s32 y, bool8 a); +extern void DetermineTileWalkableNeighbors(s32 x, s32 y); +extern void ActivateTerrainEffects(struct entity *entity); +extern void UpdateMinimap(void); +extern void ov29_0233FB1C(void); +extern void ov29_0233785C(void); +extern void ov29_0233665C(void); + +#ifdef JAPAN +#define MESSAGE_DFE 0xB3E +#define MESSAGE_DFF 0xB3F +#define MESSAGE_E00 0xB40 +#define MESSAGE_E01 0xB41 +#else +#define MESSAGE_DFE 0xDFE +#define MESSAGE_DFF 0xDFF +#define MESSAGE_E00 0xE00 +#define MESSAGE_E01 0xE01 +#endif s16 GetMaxPpWrapper(struct move *move) { @@ -34,3 +68,116 @@ bool8 CategoryIsNotPhysical(s32 category) } return TRUE; } + +void MakeFloorOneRoom(struct entity *user, struct entity *target) +{ + struct tile *tile; + s32 terrain; + s32 y; + s32 i; + struct entity *monster; + bool8 monster_house; + s32 secondary_terrain; + bool8 make_secondary; + s32 x; + struct entity *mon; + s32 j; + + if (IsFullFloorFixedRoom() || + DUNGEON_PTR[0]->gen_info.tileset_id == 26 || + DUNGEON_PTR[0]->gen_info.tileset_id == 27) { + LogMessageByIdWithPopupCheckUser(user, MESSAGE_E01); + return; + } + if (DUNGEON_PTR[0]->gen_info.force_create_monster_house) { + LogMessageByIdWithPopupCheckUser(user, MESSAGE_DFF); + return; + } + if (DUNGEON_PTR[0]->gen_info.unk_one_room_flag) { + LogMessageByIdWithPopupCheckUser(user, MESSAGE_E00); + return; + } + if (FloorSecondaryTerrainIsChasm(DUNGEON_PTR[0]->gen_info.tileset_id)) + secondary_terrain = TERRAIN_TYPE_CHASM; + else + secondary_terrain = TERRAIN_TYPE_SECONDARY; + monster_house = FALSE; + for (x = 1; x < DUNGEON_MAX_SIZE_X - 1; x++) { + for (y = 1; y < DUNGEON_MAX_SIZE_Y - 1; y++) { + make_secondary = FALSE; + tile = GetTileSafe(x, y); + tile->terrain_flags &= ~0x400; + tile->room = 0; + if (tile->terrain_flags & TERRAIN_TYPE_IMPASSABLE_WALL) + continue; + if (tile->terrain_flags & TERRAIN_TYPE_UNBREAKABLE) + continue; + tile->spawn_or_visibility_flags.visibility |= 3; + tile->terrain_flags &= ~TERRAIN_TYPE_NATURAL_JUNCTION; + if (tile->terrain_flags & TERRAIN_TYPE_IN_MONSTER_HOUSE) + monster_house = TRUE; + terrain = GetTerrainType(tile); + if (terrain == TERRAIN_TYPE_SECONDARY || terrain == TERRAIN_TYPE_CHASM) + continue; + if (x == 1 || y == 1 || x == DUNGEON_MAX_SIZE_X - 2 || + y == DUNGEON_MAX_SIZE_Y - 2) { + if (tile->object == NULL && !DUNGEON_PTR[0]->drought_orb_flag) + make_secondary = TRUE; + } + if (make_secondary) { + tile->terrain_flags &= ~(TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + tile->terrain_flags |= secondary_terrain; + } else if (terrain != TERRAIN_TYPE_NORMAL) { + tile->terrain_flags &= ~(TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + tile->terrain_flags |= TERRAIN_TYPE_NORMAL; + tile->terrain_flags |= 0x400; + } + } + } + if (StairsAlwaysReachable(DUNGEON_PTR[0]->gen_info.stairs_pos.x, + DUNGEON_PTR[0]->gen_info.stairs_pos.y, TRUE)) { + for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { + for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { + tile = GetTileSafe(x, y); + if (!(tile->terrain_flags & TERRAIN_TYPE_UNBREAKABLE) && + (tile->terrain_flags & 0x400) && (tile->terrain_flags & 0x8000)) { + tile->terrain_flags &= ~(TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + tile->terrain_flags |= secondary_terrain; + } + } + } + } + if (monster_house) + DUNGEON_PTR[0]->gen_info.monster_house_room = 0; + for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { + for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { + if (monster_house) + GetTileSafe(x, y)->terrain_flags |= TERRAIN_TYPE_IN_MONSTER_HOUSE; + DetermineTileWalkableNeighbors(x, y); + } + } + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + monster = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (EntityIsValid__0231EDD8(monster)) + monster->room_idx = GetTile(monster->pos.x, monster->pos.y)->room; + } + ov29_0233FB1C(); + ov29_0233785C(); + ov29_0233665C(); + DetermineAllMonsterShadow(); + UpdateMinimap(); + UpdateTrapsVisibility(); + LogMessageByIdWithPopupCheckUser(user, MESSAGE_DFE); + ov29_022EA370(0x28, 0x2B); + ov29_02305814(user, TRUE); + for (j = 0; j < DUNGEON_MAX_POKEMON; j++) { + mon = DUNGEON_PTR[0]->active_monster_ptrs[j]; + if (EntityIsValid__0231EDD8(mon)) { + ActivateTerrainEffects(mon); + if (EntityIsValid__0231EDD8(mon)) + EnsureCanStandCurrentTile(mon); + } + } + DUNGEON_PTR[0]->gen_info.force_create_monster_house = TRUE; + ov29_022EA370(0x14, 0x2B); +} diff --git a/src/overlay_29_0232C300.c b/src/overlay_29_0232C300.c index 5696a695..33ed6cfb 100644 --- a/src/overlay_29_0232C300.c +++ b/src/overlay_29_0232C300.c @@ -1,4 +1,21 @@ #include "overlay_29_0232C300.h" +#include "dungeon_util_2.h" +#include "dungeon_util_static.h" +#include "main_0200D81C.h" +#include "main_0200EDC0.h" +#include "overlay_29_0232C500.h" +#include "overlay_29_0234B340.h" + +extern s32 DealDamage(struct entity *attacker, struct entity *defender, struct move *move, s32 damageMultiplier, enum item_id item_id); +extern bool8 DungeonRandOutcomeUserTargetInteraction(struct entity *user, struct entity *target, s16 chance); +#ifdef JAPAN +extern bool8 DefenderAbilityIsActiveMoveEffects__0232BDD0(struct entity *attacker, struct entity *defender, enum ability_id ability_id); +#else +extern bool8 DefenderAbilityIsActiveMoveEffects__0232BDD0(struct entity *attacker, struct entity *defender, enum ability_id ability_id, bool8 attacker_ability_enabled); +#endif +extern bool8 AddHeldItemToBag(struct monster *monster); +extern bool8 RemoveEquivItem(struct item *item); +extern void ov29_022F9EA0(struct entity *entity); extern void RevealTrapsNearby(struct entity *user, struct entity *target); @@ -8,3 +25,74 @@ bool8 DoMoveSeeTrap(struct entity* attacker, struct entity* defender, struct mov return TRUE; } + +#ifdef JAPAN +#define DO_MOVE_TAKEAWAY_OFFSET -0x2BE +#else +#define DO_MOVE_TAKEAWAY_OFFSET 0 +#endif + +bool8 DoMoveTakeaway(struct entity *attacker, struct entity *defender, struct move *move, enum item_id item_id) +{ + bool8 result = FALSE; + + if (DealDamage(attacker, defender, move, 0x100, item_id) != 0) { + result = TRUE; + if (DungeonRandOutcomeUserTargetInteraction(attacker, defender, 0)) { + struct monster *attacker_info = GetEntInfo(attacker); + struct monster *defender_info = GetEntInfo(defender); + + SubstitutePlaceholderStringTags(0, attacker, 0); + SubstitutePlaceholderStringTags(1, defender, 0); + +#ifdef JAPAN + if (DefenderAbilityIsActiveMoveEffects__0232BDD0(attacker, defender, ABILITY_STICKY_HOLD)) { +#else + if (DefenderAbilityIsActiveMoveEffects__0232BDD0(attacker, defender, ABILITY_STICKY_HOLD, TRUE)) { +#endif + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xEFE + DO_MOVE_TAKEAWAY_OFFSET); + return TRUE; + } + + if (ItemExists(attacker_info->held_item.flags)) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xEFA + DO_MOVE_TAKEAWAY_OFFSET); + return TRUE; + } + + if (!ItemExists(defender_info->held_item.flags)) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xEFB + DO_MOVE_TAKEAWAY_OFFSET); + return TRUE; + } + + if (!attacker_info->is_not_team_member && IsBagFull()) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xEFC + DO_MOVE_TAKEAWAY_OFFSET); + return TRUE; + } + + attacker_info->held_item = defender_info->held_item; + + if (!attacker_info->is_not_team_member) { + AddHeldItemToBag(attacker_info); + } + + if (!defender_info->is_not_team_member) { + RemoveEquivItem(&defender_info->held_item); + } + + ItemZInit(&defender_info->held_item); + + ov29_022F9EA0(attacker); + ov29_022F9EA0(defender); + + if (attacker_info->exp_yield < 1) { + attacker_info->exp_yield = 1; + } + + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xEF9 + DO_MOVE_TAKEAWAY_OFFSET); + } else if (EntityIsValidMoveEffects__0232C500(defender)) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, 0xEFD + DO_MOVE_TAKEAWAY_OFFSET); + } + } + + return result; +} \ No newline at end of file diff --git a/src/status_checks.c b/src/status_checks.c index 24fa22ea..c9e6fab4 100644 --- a/src/status_checks.c +++ b/src/status_checks.c @@ -1,11 +1,13 @@ #include "status_checks.h" #include "dg_random.h" #include "dungeon_action.h" +#include "dungeon_move.h" #include "dungeon_ai_itcm.h" #include "dungeon_capabilities_3.h" #include "dungeon_statuses.h" #include "dungeon_util_static.h" #include "dungeon_util_2.h" +#include "overlay_29_022EBC50.h" #include "overlay_29_0234B104.h" #ifdef JAPAN @@ -20,7 +22,10 @@ #define PAUSED_MESSAGE (0xC2B + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) #define INFATUATED_MESSAGE (0xC2C + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) #define BIDE_MESSAGE (0xC2D + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) +#define ASLEEP_MESSAGE (0xC2E + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) +#define CONFUSED_MESSAGE (0xC2F + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) +extern void EndTwoTurnMove(struct entity *entity); bool8 HasStatusThatPreventsActing(struct entity *monster) { @@ -108,3 +113,98 @@ bool8 HasStatusThatPreventsActing(struct entity *monster) return FALSE; } + +bool8 HasStatusThatPreventsLeaderActing(struct entity *monster) +{ + struct monster *pokemon_info = GetEntInfo(monster); + struct move *move; + bool8 confused = FALSE; + s32 i; + + SubstitutePlaceholderStringTags(0, monster, 0); + SetMonsterActionFields(&pokemon_info->action, ACTION_PASS_TURN); + + switch (pokemon_info->sleep_class_status.sleep) + { + case STATUS_SLEEP_SLEEP: + case STATUS_SLEEP_NIGHTMARE: + case STATUS_SLEEP_NAPPING: + LogMessageByIdWithPopupCheckUser(monster, ASLEEP_MESSAGE); + return TRUE; + } + + switch (pokemon_info->frozen_class_status.freeze) + { + case STATUS_FROZEN_FROZEN: + LogMessageByIdWithPopupCheckUser(monster, FROZEN_MESSAGE); + return TRUE; + case STATUS_FROZEN_WRAP: + LogMessageByIdWithPopupCheckUser(monster, WRAPPED_AROUND_MESSAGE); + return TRUE; + case STATUS_FROZEN_WRAPPED: + LogMessageByIdWithPopupCheckUser(monster, WRAPPED_BY_MESSAGE); + return TRUE; + case STATUS_FROZEN_PETRIFIED: + return TRUE; + } + + switch (pokemon_info->cringe_class_status.cringe) + { + case STATUS_CRINGE_CONFUSED: + confused = TRUE; + break; + case STATUS_CRINGE_PAUSED: + LogMessageByIdWithPopupCheckUser(monster, PAUSED_MESSAGE); + return TRUE; + case STATUS_CRINGE_INFATUATED: + LogMessageByIdWithPopupCheckUser(monster, INFATUATED_MESSAGE); + return TRUE; + case 8: + break; + } + + if (pokemon_info->bide_class_status.bide == STATUS_TWO_TURN_BIDE) + { + LogMessageByIdWithPopupCheckUser(monster, BIDE_MESSAGE); + return TRUE; + } + + if (pokemon_info->bide_class_status.bide != STATUS_TWO_TURN_NONE && + pokemon_info->bide_class_status.bide != STATUS_TWO_TURN_CHARGING && + pokemon_info->bide_class_status.bide != STATUS_TWO_TURN_ENRAGED) + { + if (confused) + { + LogMessageByIdWithPopupCheckUser(monster, CONFUSED_MESSAGE); + } + else + { + for (i = 0; i < MAX_MON_MOVES; i++) + { + move = &pokemon_info->moves.moves[i]; + if (MoveExists(move) && + IsChargingTwoTurnMove(monster, move) && + pokemon_info->bide_class_status.bide_move_slot == i) + { + while (i > 0) + { + if (!(pokemon_info->moves.moves[i].flags0 & + MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) + { + break; + } + i--; + } + SetActionUseMovePlayer(&pokemon_info->action, + pokemon_info->action.action_parameters[0].action_use_idx, + i); + return TRUE; + } + } + } + + EndTwoTurnMove(monster); + } + + return FALSE; +} From 457a2aaf17583f10a13012afeaa60db948078860 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Fri, 18 Sep 2026 23:00:31 -0700 Subject: [PATCH 32/34] Decompile 8 more functions; clear four asm files entirely Clears asm/main_02048B74.s, asm/overlay_29_022DC314.s, asm/overlay_29_022E9628.s and asm/overlay_29_023456BC.s, with their .inc headers and main.lsf entries. New translation units, both created with extract_function.py -nm rather than merged, to keep a small callee out of the same TU: - src/overlay_29_022E9628.c (GetRandomTile, FindNearbyUnoccupiedTile). A backward merge would have landed these beside GetLeader in src/dg_uty.c, where -O4,s can inline it; and dg_uty.c declares DUNGEON_PTR as the INCOMPLETE array form, while these two were scored against the complete [2] form. The two spellings are not interchangeable (see MATCHING_TIPS, "DUNGEON_PTR: the lever is the COMPLETENESS of the declared type"), so the file keeps [2] and src/overlay_29_023456BC.c keeps [] deliberately. - src/overlay_29_023456BC.c (RemoveGroundItem, DisplayItem). Same reason: src/overlay_29_02345698.c holds the three-instruction EntityIsValid__02345698, which both of these call. Backward merges where that was safe: - sub_02048B74 -> src/main_02048B48.c - ov29_022DC314 / ov29_022DC33C / ov29_022DC544 -> src/poly_text.c, which already owns the buffer type ov29_022DC33C takes. DECLARATION CHANGES, all measured byte-neutral rather than argued. Each file below was compiled before and after with the real build flags (-W all -W pedantic -W error) and produced a byte-identical object: - src/main_02048BB4.c: _020AFF38 scalar -> incomplete array, and its five accesses. The array form is what sub_02048B74 matches under; the two TUs that declare the symbol now agree. - src/overlay_29_022E99F0.c + include/overlay_29_022E99F0.h: the three FindNearby* wrappers retyped struct position* -> bool32, and the three DISPLACEMENTS_* externs const s32[] -> const struct position[]. The asm indexes them with lsl #2 and then reads two signed halfwords four bytes apart, which const s32* cannot produce, and the rodata decodes as {s16 x, s16 y} pairs. The return retype is safe because all four call sites already use the result as a boolean and none takes it as a pointer; FindFarthestUnoccupiedTileWithin2 has no C caller at all. bool32 rather than bool8 because the wrappers tail-return r0. - src/overlay_29_022DC61C.c: five stale externs replaced by an include of poly_text.h, and ov29_023538B4 retyped from u8[0x1963C] to the real struct. - src/dungeon_projectile_throw.c, src/main_020483B8.c, src/overlay_29_0230F810.c, src/overlay_29_02320764.c: stale externs replaced by includes. include/poly_text.h carried three defects, all fixed. This header is already landed and matching, and src/poly_text.c decompiles two sibling functions against it, so the layout is backed by matching code: - s16 unk17704[0xf92] ran 0x17704 -> 0x19628 and SWALLOWED the 350-element array at 0x18304. Split to [0x600], ending exactly at 0x18304, followed by struct unk_ov29_022DC240_18304_t unk18304[350]. The siblings corroborate independently: ov29_022DC240 sets unk8 = 0x40 and unka = 0x18, and ov29_022DC2B8 zeroes unk17704[i] for i < unk8 * unka = 0x600. - s16 unk19628 -> u16; the target loads it with ldrh. - `} unk1962a;` was a file-scope tentative definition inside a header, which MWCC emits as a DEFINED symbol, so a second includer collides. Deleting it is NOT object-neutral (1000 -> 928 bytes); it is MOVED into src/poly_text.c, which is object-neutral and was verified as such. ov29_022DC33C reads an uninitialised local, and that is a property of the ROM: the target does `ldrh r3, [sp]` before anything stores to that slot. -W error rejects the direct spelling, and neither a one-member struct nor a one-element array suppresses it. Reading and writing through a pointer local satisfies the diagnostic and emits nothing; landcheck confirms 130/130 words byte-identical. include/overlay_29_022E99F0.h gains #include "dungeon_mode.h". The bug was latent, not introduced: the header named struct position without defining it and compiled only because its struct position* RETURN type introduced the tag at file scope. Retyping the return to bool32 removed that, and every parameter list then declared its own scoped type. Authored by Claude (Opus 5) under human direction. Every function was byte-compared against the assembly it replaced with build-tools/landcheck.sh before any build, and every edit to an already-landed file was proved byte-neutral by an object diff. Confirmed by matching builds in all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_02048B74.inc | 5 - asm/include/overlay_29_022DC314.inc | 18 -- asm/include/overlay_29_022E9628.inc | 8 - asm/include/overlay_29_023456BC.inc | 17 -- asm/main_02048B74.s | 25 --- asm/overlay_29_022DC314.s | 216 --------------------- asm/overlay_29_022E9628.s | 290 ---------------------------- asm/overlay_29_023456BC.s | 262 ------------------------- include/main_02048B48.h | 1 + include/overlay_29_022E9628.h | 9 + include/overlay_29_022E99F0.h | 7 +- include/overlay_29_023456BC.h | 9 + include/poly_text.h | 21 +- main.lsf | 6 +- src/dungeon_projectile_throw.c | 2 +- src/main_020483B8.c | 3 +- src/main_02048B48.c | 16 ++ src/main_02048BB4.c | 12 +- src/overlay_29_022DC61C.c | 20 +- src/overlay_29_022E9628.c | 171 ++++++++++++++++ src/overlay_29_022E99F0.c | 15 +- src/overlay_29_0230F810.c | 2 +- src/overlay_29_02320764.c | 4 +- src/overlay_29_023456BC.c | 138 +++++++++++++ src/poly_text.c | 150 ++++++++++++++ 25 files changed, 543 insertions(+), 884 deletions(-) delete mode 100644 asm/include/main_02048B74.inc delete mode 100644 asm/include/overlay_29_022DC314.inc delete mode 100644 asm/include/overlay_29_022E9628.inc delete mode 100644 asm/include/overlay_29_023456BC.inc delete mode 100644 asm/main_02048B74.s delete mode 100644 asm/overlay_29_022DC314.s delete mode 100644 asm/overlay_29_022E9628.s delete mode 100644 asm/overlay_29_023456BC.s create mode 100644 include/overlay_29_022E9628.h create mode 100644 include/overlay_29_023456BC.h create mode 100644 src/overlay_29_022E9628.c create mode 100644 src/overlay_29_023456BC.c diff --git a/asm/include/main_02048B74.inc b/asm/include/main_02048B74.inc deleted file mode 100644 index 68c984d2..00000000 --- a/asm/include/main_02048B74.inc +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -.public _0209CD4C -.public _020AFF38 -.public _022AAE70 -.public Debug_Print0 diff --git a/asm/include/overlay_29_022DC314.inc b/asm/include/overlay_29_022DC314.inc deleted file mode 100644 index dd3a5e13..00000000 --- a/asm/include/overlay_29_022DC314.inc +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -.public _020AFC70 -.public Debug_Print0 -.public LoadFileFromRom -.public ov29_0234FD04 -.public ov29_0234FD14 -.public ov29_0234FD48 -.public ov29_0234FD4C -.public ov29_0234FD50 -.public ov29_0234FD54 -.public ov29_023534E8 -.public ov29_02353880 -.public Render3dSetPaletteBase -.public Render3dSetTextureParams -.public Render3dTextureNoSetup -.public sub_02008BF4 -.public sub_0201E050 -.public sub_0201E380 diff --git a/asm/include/overlay_29_022E9628.inc b/asm/include/overlay_29_022E9628.inc deleted file mode 100644 index 64b78000..00000000 --- a/asm/include/overlay_29_022E9628.inc +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once -.public abs -.public DUNGEON_PTR -.public DungeonRandInt -.public GetLeader -.public GetTile -.public MemAlloc -.public MemFree diff --git a/asm/include/overlay_29_023456BC.inc b/asm/include/overlay_29_023456BC.inc deleted file mode 100644 index 85d361ab..00000000 --- a/asm/include/overlay_29_023456BC.inc +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -.public AddSimpleObjToOam -.public DUNGEON_PTR -.public EntityIsValid__02345698 -.public GetActualBuyPrice -.public GetActualSellPrice -.public GetItemInfo -.public GetItemSpriteId -.public GetTile -.public GetTileSafe -.public IsShoppableItem -.public OBJ_GRAPHICS_CONTROLS_PTR -.public ShouldDisplayEntityWrapper -.public ov29_023537B4 -.public ov29_023537BC -.public ov29_0237C864 -.public sub_0200D1FC diff --git a/asm/main_02048B74.s b/asm/main_02048B74.s deleted file mode 100644 index 31953bea..00000000 --- a/asm/main_02048B74.s +++ /dev/null @@ -1,25 +0,0 @@ - .include "asm/macros.inc" - .include "main_02048B74.inc" - - .text - - arm_func_start sub_02048B74 -sub_02048B74: ; 0x02048B74 - stmdb sp!, {r3, lr} - ldr r1, _02048BA8 ; =_020AFF38 - ldr r0, _02048BAC ; =_0209CD4C - ldr r1, [r1, #4] - mov r2, #0 - bl Debug_Print0 - mov r3, #0 - ldr r1, _02048BA8 ; =_020AFF38 - ldr r0, _02048BB0 ; =_022AAE70 - sub r2, r3, #1 - str r3, [r1, #4] - str r2, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_02048BA8: .word _020AFF38 -_02048BAC: .word _0209CD4C -_02048BB0: .word _022AAE70 - arm_func_end sub_02048B74 diff --git a/asm/overlay_29_022DC314.s b/asm/overlay_29_022DC314.s deleted file mode 100644 index 4f8433a2..00000000 --- a/asm/overlay_29_022DC314.s +++ /dev/null @@ -1,216 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022DC314.inc" - - .text - - arm_func_start ov29_022DC314 -ov29_022DC314: ; 0x022DC314 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldr r0, _022DC338 ; =ov29_0234FD14 - mov r4, r1 - bl Debug_Print0 - mov r0, r5 - mov r1, r4 - bl sub_02008BF4 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_022DC338: .word ov29_0234FD14 - arm_func_end ov29_022DC314 - - arm_func_start ov29_022DC33C -ov29_022DC33C: ; 0x022DC33C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - ldr r1, _022DC52C ; =0x00019628 - mov r6, r0 - ldrh r0, [r6, r1] - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldr r2, _022DC530 ; =ov29_02353880 - mov r1, #0 - ldrh r4, [r2, #0x14] - ldrh r3, [sp] - mov r0, #0x1000 - bic r4, r4, #0x700 - bic r3, r3, #0x700 - orr r4, r4, #0x200 - orr r3, r3, #0x200 - strh r4, [r2, #0x14] - strh r3, [sp] - ldrh r5, [r2, #0x14] - ldrh r4, [sp] - ldr r3, _022DC534 ; =_020AFC70 - bic r5, r5, #7 - bic r4, r4, #7 - orr r5, r5, #5 - orr r4, r4, #5 - strh r5, [r2, #0x14] - ldrh r5, [r2, #0x14] - strh r4, [sp] - ldrh r4, [sp] - ldr r7, _022DC538 ; =0x00007FFF - bic r5, r5, #0x38 - orr r8, r5, #0x28 - bic r4, r4, #0x38 - mov r5, #0x1f - orr r4, r4, #0x28 - ldr r3, [r3] - strh r1, [r2, #0x16] - strh r1, [r2, #0x18] - strh r1, [r2, #0x1a] - strh r1, [r2, #0x1c] - strh r0, [r2, #0x1e] - strh r0, [r2, #0x20] - strh r1, [r2, #0xc] - strh r1, [r2, #0xe] - strh r1, [r2, #0x10] - strh r1, [r2, #0x12] - strh r1, [r2, #0x24] - str r1, [r2, #4] - str r1, [r2, #8] - strb r1, [r2, #0x26] - strh r1, [r2, #2] - strh r8, [r2, #0x14] - strh r7, [r2, #0x22] - strb r5, [r2, #0x27] - strh r4, [sp] - ldr r4, [r3, #0xe0] - add r0, sp, #0 - mov r1, #0x1b000 - bl Render3dSetTextureParams - add r0, sp, #0 - add r1, r4, #0x3c00 - bl Render3dSetPaletteBase - ldr r0, _022DC53C ; =0x00018304 - mov r5, #0 - ldr r4, _022DC530 ; =ov29_02353880 - add fp, r0, #2 - add r7, r0, #4 - add r8, r0, #6 - add sb, r0, #8 - add sl, r0, #0xa - b _022DC518 -_022DC454: - mov r0, #0xe - smlabb r3, r5, r0, r6 - add r0, r3, #0x18000 - ldrb r1, [r0, #0x311] - cmp r1, #0 - beq _022DC50C - ldrb r2, [r0, #0x310] - ldr r0, _022DC53C ; =0x00018304 - ldrsh r1, [r3, r0] - ldrh r0, [r4, #0x14] - and ip, r2, #3 - strh r1, [r4, #0x16] - bic r0, r0, #0x700 - orr r1, r0, #0x200 - ldr r0, _022DC540 ; =ov29_0234FD04 - ldrsh lr, [r3, fp] - ldrb r2, [r0, ip, lsl #2] - add ip, r0, ip, lsl #2 - strh lr, [r4, #0x18] - and r0, r2, #0xf8 - ldrsh r2, [r3, r7] - ldrb lr, [ip, #2] - ldrb ip, [ip, #1] - strh r2, [r4, #0xc] - and r2, lr, #0xf8 - and ip, ip, #0xf8 - mov r2, r2, lsl #0x17 - mov ip, ip, lsl #2 - orr r2, ip, r2, lsr #16 - ldrsh ip, [r3, r8] - orr r2, r2, r0, asr #3 - mov r0, r4 - strh ip, [r4, #0xe] - ldrsh ip, [r3, sb] - strh ip, [r4, #0x10] - ldrsh r3, [r3, sl] - strh r1, [r4, #0x14] - mov r1, #0 - strh r1, [r4, #2] - mov r1, #0x1f - strb r1, [r4, #0x27] - mov r1, #3 - strh r3, [r4, #0x12] - strh r2, [r4, #0x22] - strh r1, [r4] - bl Render3dTextureNoSetup -_022DC50C: - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 -_022DC518: - ldr r0, _022DC52C ; =0x00019628 - ldrh r0, [r6, r0] - cmp r5, r0 - blt _022DC454 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022DC52C: .word 0x00019628 -_022DC530: .word ov29_02353880 -_022DC534: .word _020AFC70 -_022DC538: .word 0x00007FFF -_022DC53C: .word 0x00018304 -_022DC540: .word ov29_0234FD04 - arm_func_end ov29_022DC33C - - arm_func_start ov29_022DC544 -ov29_022DC544: ; 0x022DC544 - stmdb sp!, {r4, lr} - sub sp, sp, #8 - ldr r1, _022DC604 ; =ov29_023534E8 - mov r2, #0x300 - ldr r1, [r1, r0, lsl #2] - add r0, sp, #0 - bl LoadFileFromRom - ldr r4, [sp] - ldr r2, [sp, #4] - mov r0, r4 - mov r1, #0x1b000 - mov r3, #0 - bl sub_0201E050 - mov r1, #0 - mov r0, r4 - mov r2, r1 - mov r3, #2 - bl sub_0201E050 - ldr r0, _022DC608 ; =_020AFC70 - ldr r1, _022DC60C ; =ov29_0234FD48 - ldr r0, [r0] - mov r2, #0x1e - add r0, r0, #0xcc - mov r3, #0 - bl sub_0201E380 - ldr r0, _022DC608 ; =_020AFC70 - ldr r1, _022DC610 ; =ov29_0234FD4C - ldr r0, [r0] - mov r2, #0x1e - add r0, r0, #0xcc - mov r3, #1 - bl sub_0201E380 - ldr r0, _022DC608 ; =_020AFC70 - ldr r1, _022DC614 ; =ov29_0234FD50 - ldr r0, [r0] - mov r2, #0x1e - add r0, r0, #0xcc - mov r3, #2 - bl sub_0201E380 - ldr r0, _022DC608 ; =_020AFC70 - ldr r1, _022DC618 ; =ov29_0234FD54 - ldr r0, [r0] - mov r2, #0x1e - add r0, r0, #0xcc - mov r3, #3 - bl sub_0201E380 - add sp, sp, #8 - ldmia sp!, {r4, pc} - .align 2, 0 -_022DC604: .word ov29_023534E8 -_022DC608: .word _020AFC70 -_022DC60C: .word ov29_0234FD48 -_022DC610: .word ov29_0234FD4C -_022DC614: .word ov29_0234FD50 -_022DC618: .word ov29_0234FD54 - arm_func_end ov29_022DC544 diff --git a/asm/overlay_29_022E9628.s b/asm/overlay_29_022E9628.s deleted file mode 100644 index 25a19ac5..00000000 --- a/asm/overlay_29_022E9628.s +++ /dev/null @@ -1,290 +0,0 @@ - .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_023456BC.s b/asm/overlay_29_023456BC.s deleted file mode 100644 index 4a571746..00000000 --- a/asm/overlay_29_023456BC.s +++ /dev/null @@ -1,262 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_023456BC.inc" - - .text - - arm_func_start RemoveGroundItem -RemoveGroundItem: ; 0x023456BC - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r2, r0 - mov r7, r1 - ldrsh r0, [r2] - ldrsh r1, [r2, #2] - bl GetTileSafe - mov r5, r0 - ldr r6, [r5, #0x10] - cmp r6, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - ldr r0, [r6] - cmp r0, #3 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r6 - bl GetItemInfo - ldrh r1, [r5] - mov r4, r0 - tst r1, #0x20 - beq _02345770 - ldrsh r0, [r4, #4] - bl IsShoppableItem - cmp r0, #0 - beq _02345770 - ldrb r0, [r4] - tst r0, #2 - beq _02345754 - cmp r7, #0 - beq _02345770 - mov r0, r4 - bl GetActualBuyPrice - ldr r1, _023457C4 ; =DUNGEON_PTR - ldr r2, [r1] - ldr r1, [r2, #0x7bc] - sub r0, r1, r0 - str r0, [r2, #0x7bc] - b _02345770 -_02345754: - mov r0, r4 - bl GetActualSellPrice - ldr r1, _023457C4 ; =DUNGEON_PTR - ldr r2, [r1] - ldr r1, [r2, #0x7c0] - sub r0, r1, r0 - str r0, [r2, #0x7c0] -_02345770: - mov r4, #0 - str r4, [r5, #0x10] - ldr r5, _023457C4 ; =DUNGEON_PTR - mov r7, r4 - str r4, [r6] -_02345784: - ldr r0, [r5] - add r0, r0, r7, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r0, [r0, #0xb24] -#else - ldr r0, [r0, #0xbc8] -#endif - bl EntityIsValid__02345698 - cmp r0, #0 - addne r4, r7, #1 - add r7, r7, #1 - cmp r7, #0x40 - blt _02345784 - ldr r1, _023457C4 ; =DUNGEON_PTR - mov r0, #1 - ldr r1, [r1] - add r1, r1, #0x3f00 -#ifdef JAPAN - strh r4, [r1, #0x1c] -#else - strh r4, [r1, #0xc0] -#endif - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_023457C4: .word DUNGEON_PTR - arm_func_end RemoveGroundItem - - arm_func_start DisplayItem -DisplayItem: ; 0x023457C8 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov r7, r0 - mov r6, r1 - mov r8, r2 - mov r5, r3 - mov r4, #0 - bl EntityIsValid__02345698 - cmp r0, #0 - moveq r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - cmp r8, #0 - beq _02345830 - ldrsh r0, [r7, #4] - ldrsh r1, [r7, #6] - bl GetTile - ldrh r0, [r0] - ands r0, r0, #3 - moveq r0, r4 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - cmp r0, #2 - moveq r4, #1 - mov r0, r7 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} -_02345830: - ldr r0, _02345A20 ; =DUNGEON_PTR - ldr r3, _02345A24 ; =0x0001A224 - ldr r2, [r0] - add r0, r3, #2 - ldrsh r1, [r2, r0] - add r0, r2, #0x1a000 - ldr sl, [r7, #0x10] - ldr sb, [r7, #0x1c] -#ifdef JAPAN - ldr r0, [r0, #0x18c] -#else - ldr r0, [r0, #0x230] -#endif - rsb r8, r1, sl, asr #8 - add r8, r0, r8 - sub sb, sl, sb - ldrsh r3, [r2, r3] - rsb sb, r1, sb, asr #8 - add r8, r8, #8 - add r1, r8, r8, lsr #31 - ldr r8, [r7, #0xc] - mvn r2, #0x1f - rsb r8, r3, r8, asr #8 - add sb, r0, sb - cmp r8, r2 - mov sl, r1, asr #1 - cmpge sb, r2 - blt _02345A18 - rsb r0, r2, #0xff - cmp r8, r0 - cmple sb, #0xe0 - bgt _02345A18 - ldr r0, _02345A28 ; =ov29_0237C864 - cmp r6, #0 - ldrh r1, [r0, #2] - bic r1, r1, #0x3e00 - strh r1, [r0, #2] - beq _023458D8 - ldrh r1, [r0, #4] - mov r6, #0x17 - bic r1, r1, #0xf000 - strh r1, [r0, #4] - ldrh r1, [r0, #4] - orr r1, r1, #0xa000 - strh r1, [r0, #4] - b _02345958 -_023458D8: - ldr r0, [r7, #0xb4] - ldrsh r0, [r0, #4] - bl GetItemSpriteId - mov r6, r0 - cmp r5, #0xff - beq _0234592C - cmp r6, #0 - cmpne r6, #0x3b - bne _0234592C - ldr r0, _02345A28 ; =ov29_0237C864 - ldr r1, _02345A2C ; =ov29_023537BC - ldrh r2, [r0, #2] - ldrb r1, [r1, r5] - ldr r3, _02345A30 ; =ov29_023537B4 - bic r2, r2, #0x3e00 - strh r2, [r0, #2] - ldrh r2, [r0, #2] - mov r1, r1, lsl #0x1e - ldrb r6, [r3, r5] - orr r1, r2, r1, lsr #18 - strh r1, [r0, #2] -_0234592C: - ldr r0, [r7, #0xb4] - ldrsh r0, [r0, #4] - bl sub_0200D1FC - ldr r1, _02345A28 ; =ov29_0237C864 - mov r0, r0, lsl #0x1c - ldrh r2, [r1, #4] - bic r2, r2, #0xf000 - strh r2, [r1, #4] - ldrh r2, [r1, #4] - orr r0, r2, r0, lsr #16 - strh r0, [r1, #4] -_02345958: - ldr r1, _02345A28 ; =ov29_0237C864 - mov r2, r6, lsl #1 - ldrh r5, [r1, #6] - ldr r0, _02345A34 ; =0xFFFF000F - add r3, r2, #0x110 - and r2, r5, r0 - strh r2, [r1, #6] - ldrh r6, [r1, #6] - mov r5, sb, lsl #0x14 - ldrb r2, [sp, #0x20] - orr r5, r6, r5, lsr #16 - strh r5, [r1, #6] - ldrh r6, [r1, #2] - cmp r2, #0 - and r5, r8, r0, lsr #23 - and r6, r6, r0, asr #7 - strh r6, [r1, #2] - ldrh r6, [r1, #2] - mov r4, r4, lsl #0x1e - and r3, r3, r0, lsr #22 - orr r2, r6, r5 - strh r2, [r1, #2] - ldrh r2, [r1] - moveq sl, #1 - bic r2, r2, #0xc00 - strh r2, [r1] - ldrh r2, [r1] - orr r2, r2, r4, lsr #20 - strh r2, [r1] - ldrh r2, [r1, #4] - bic r2, r2, #0xc00 - strh r2, [r1, #4] - ldrh r2, [r1, #4] - orr r2, r2, #0xc00 - strh r2, [r1, #4] - ldrh r2, [r1, #4] - and r0, r2, r0, asr #6 - strh r0, [r1, #4] - ldrh r0, [r1, #4] - mov r2, sl - orr r0, r0, r3 - strh r0, [r1, #4] - ldr r0, _02345A38 ; =OBJ_GRAPHICS_CONTROLS_PTR - ldr r1, _02345A28 ; =ov29_0237C864 - ldr r0, [r0] - bl AddSimpleObjToOam - mov r0, #1 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} -_02345A18: - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_02345A20: .word DUNGEON_PTR -#ifdef JAPAN -_02345A24: .word 0x0001A180 -#else -_02345A24: .word 0x0001A224 -#endif -_02345A28: .word ov29_0237C864 -_02345A2C: .word ov29_023537BC -_02345A30: .word ov29_023537B4 -_02345A34: .word 0xFFFF000F -_02345A38: .word OBJ_GRAPHICS_CONTROLS_PTR - arm_func_end DisplayItem diff --git a/include/main_02048B48.h b/include/main_02048B48.h index 4a4427c8..733c7085 100644 --- a/include/main_02048B48.h +++ b/include/main_02048B48.h @@ -2,5 +2,6 @@ #define PMDSKY_MAIN_02048B48_H void sub_02048B48(void); +void sub_02048B74(void); #endif diff --git a/include/overlay_29_022E9628.h b/include/overlay_29_022E9628.h new file mode 100644 index 00000000..f0f5fc81 --- /dev/null +++ b/include/overlay_29_022E9628.h @@ -0,0 +1,9 @@ +#ifndef PMDSKY_OVERLAY_29_022E9628_H +#define PMDSKY_OVERLAY_29_022E9628_H + +#include "dungeon_mode.h" + +bool8 GetRandomTile(struct position *out, bool8 avoid_visited); +bool32 FindNearbyUnoccupiedTile(struct position *out, struct position *origin, const struct position *displacements, s32 count, bool8 avoid_stairs); + +#endif //PMDSKY_OVERLAY_29_022E9628_H diff --git a/include/overlay_29_022E99F0.h b/include/overlay_29_022E99F0.h index c7c5c60f..c70122df 100644 --- a/include/overlay_29_022E99F0.h +++ b/include/overlay_29_022E99F0.h @@ -2,10 +2,11 @@ #define PMDSKY_OVERLAY_29_022E99F0_H #include "util.h" +#include "dungeon_mode.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); +bool32 FindClosestUnoccupiedTileWithin2(struct position* out, struct position* origin, bool8 a); +bool32 FindFarthestUnoccupiedTileWithin2(struct position* out, struct position* origin, bool8 a); +bool32 FindUnoccupiedTileWithin3(struct position* out, struct position* origin, bool8 a); u8 TickStatusTurnCounter(u8 *counter); #endif diff --git a/include/overlay_29_023456BC.h b/include/overlay_29_023456BC.h new file mode 100644 index 00000000..01063ed3 --- /dev/null +++ b/include/overlay_29_023456BC.h @@ -0,0 +1,9 @@ +#ifndef PMDSKY_OVERLAY_29_023456BC_H +#define PMDSKY_OVERLAY_29_023456BC_H + +#include "dungeon_mode.h" + +bool8 RemoveGroundItem(struct position *pos, bool8 a); +bool8 DisplayItem(struct entity *entity, bool8 a, bool8 b, u8 c, bool8 d); + +#endif //PMDSKY_OVERLAY_29_023456BC_H diff --git a/include/poly_text.h b/include/poly_text.h index 55ead95a..fb3990de 100644 --- a/include/poly_text.h +++ b/include/poly_text.h @@ -10,17 +10,32 @@ struct unk_ov29_022DC240_1962a_t { s16 unka; s16 unkc; s16 unke; -} unk1962a; +}; + +struct unk_ov29_022DC240_18304_t { + s16 unk0; + s16 unk2; + s16 unk4; + s16 unk6; + s16 unk8; + s16 unka; + u8 unkc; + u8 unkd; +}; struct unk_ov29_022DC240_t { s8 unk0[0x17704]; - s16 unk17704[0xf92]; - s16 unk19628; + s16 unk17704[0x600]; + struct unk_ov29_022DC240_18304_t unk18304[350]; + u16 unk19628; struct unk_ov29_022DC240_1962a_t unk1962a; s16 unk1963a; }; void ov29_022DC240(struct unk_ov29_022DC240_t *param0); void ov29_022DC2B8(struct unk_ov29_022DC240_t *param0); +void ov29_022DC314(void *a, const u8 *b); +void ov29_022DC33C(u8 *p); +void ov29_022DC544(s32 a); #endif //PMDSKY_OVERLAY_29_022DC240_H diff --git a/main.lsf b/main.lsf index bb676c4f..8dd27efe 100644 --- a/main.lsf +++ b/main.lsf @@ -216,7 +216,6 @@ Static main Object src/main_02048758.o Object asm/main_02048764.o Object src/main_02048B48.o - Object asm/main_02048B74.o Object src/main_02048BB4.o Object src/main_02048C5C.o Object src/main_02048CB8.o @@ -765,7 +764,6 @@ Overlay OVY_29 Object asm/overlay_29_data_023534E0.o Object asm/overlay_29_bss_02353860.o Object src/poly_text.o - Object asm/overlay_29_022DC314.o Object src/overlay_29_022DC61C.o Object src/overlay_29_022DC684.o Object asm/overlay_29_022DC7E4.o @@ -816,7 +814,7 @@ Overlay OVY_29 Object src/dungeon_range.o Object src/dungeon_range_2.o Object src/dg_uty.o - Object asm/overlay_29_022E9628.o + Object src/overlay_29_022E9628.o Object src/overlay_29_022E99F0.o Object asm/overlay_29_022E9A6C.o Object src/overlay_29_022E9FC0.o @@ -1203,7 +1201,7 @@ Overlay OVY_29 Object src/overlay_29_02344BE4.o Object asm/overlay_29_02344BF8.o Object src/overlay_29_02345698.o - Object asm/overlay_29_023456BC.o + Object src/overlay_29_023456BC.o Object src/overlay_29_02345A3C.o Object asm/overlay_29_02345AD8.o Object src/dungeon_items.o diff --git a/src/dungeon_projectile_throw.c b/src/dungeon_projectile_throw.c index 5a2d5544..bb7e2f0c 100644 --- a/src/dungeon_projectile_throw.c +++ b/src/dungeon_projectile_throw.c @@ -14,6 +14,7 @@ #include "dungeon_util_2.h" #include "overlay_29_022E9FC0.h" #include "overlay_29_0234B340.h" +#include "overlay_29_023456BC.h" #ifdef JAPAN #define CURVED_PROJECTILE_LOG_MESSAGE_1 0x920 @@ -31,7 +32,6 @@ extern bool8 ov29_022E2CA0(struct position *pos); extern void ov29_0234B4CC(bool8 val); extern s32 SinAbs4096(s32 x); extern bool8 DisplayThrownItemShadow(s32 x, s32 y, u8 index); -extern bool8 DisplayItem(struct entity *item, bool8 hallucinate, u8 on_floor, u8 dir, u8 priority); extern bool8 TwoTurnMoveForcedMiss(struct entity *target, struct move *move); extern bool8 DoesProjectileHitTarget(struct entity *user, struct entity *target); extern void ChangeMonsterAnimationToHurt(struct entity *monster, u32 direction); diff --git a/src/main_020483B8.c b/src/main_020483B8.c index 709ac865..ff0c18ab 100644 --- a/src/main_020483B8.c +++ b/src/main_020483B8.c @@ -1,5 +1,6 @@ #include "main_020483B8.h" #include "script_variable.h" +#include "main_02048B48.h" extern struct unk_020AFEF4 *_020AFEF4; @@ -7,8 +8,6 @@ extern void sub_020476EC(s16 a); extern bool8 sub_0204771C(void); -extern void sub_02048B74(void); - extern void sub_02048B48(void); extern void sub_0206637C(void); diff --git a/src/main_02048B48.c b/src/main_02048B48.c index 33856ec4..cc5c9f22 100644 --- a/src/main_02048B48.c +++ b/src/main_02048B48.c @@ -1,4 +1,13 @@ #include "main_02048B48.h" +#include "main_02048BB4.h" + +extern struct unk_020AFF38 _020AFF38[]; + +extern const char _0209CD4C[]; + +extern s32 _022AAE70; + +extern void Debug_Print0(const char *fmt, s32 a, s32 b); extern void InitOptions(void); @@ -30,3 +39,10 @@ void sub_02048B48(void) sub_0205C75C(); ClearCroagunkItems(); } + +void sub_02048B74(void) +{ + Debug_Print0(_0209CD4C, _020AFF38[0].field_0x4, 0); + _020AFF38[0].field_0x4 = 0; + _022AAE70 = -1; +} diff --git a/src/main_02048BB4.c b/src/main_02048BB4.c index fb8795ef..a7ea14f2 100644 --- a/src/main_02048BB4.c +++ b/src/main_02048BB4.c @@ -8,7 +8,7 @@ extern void Debug_Print0(const char *fmt, s32 a, s32 b); extern s32 strncmp(const char *a, const char *b, s32 n); -extern struct unk_020AFF38 _020AFF38; +extern struct unk_020AFF38 _020AFF38[]; extern char *strncpy(char *d, const char *s, s32 n); @@ -16,23 +16,23 @@ extern char *ReadStringSave(char *dst); char * ReadStringSave(char *dst) { - return strncpy(dst, _020AFF38.field_0x0, 0x20); + return strncpy(dst, _020AFF38[0].field_0x0, 0x20); } bool8 CheckStringSave(const char *s) { - return strncmp(s, _020AFF38.field_0x0, 0x20) == 0; + return strncmp(s, _020AFF38[0].field_0x0, 0x20) == 0; } s32 sub_02048BFC(void) { - return _020AFF38.field_0x4; + return _020AFF38[0].field_0x4; } void sub_02048C0C(s32 v) { - Debug_Print0(_0209CD4C, _020AFF38.field_0x4, v); - _020AFF38.field_0x4 = v; + Debug_Print0(_0209CD4C, _020AFF38[0].field_0x4, v); + _020AFF38[0].field_0x4 = v; } s32 sub_02048C3C(void) diff --git a/src/overlay_29_022DC61C.c b/src/overlay_29_022DC61C.c index a87a79c2..9c303fa6 100644 --- a/src/overlay_29_022DC61C.c +++ b/src/overlay_29_022DC61C.c @@ -1,31 +1,25 @@ #include "overlay_29_022DC61C.h" #include "main_0200330C.h" +#include "poly_text.h" -extern void ov29_022DC2B8(u8 *p); -extern void ov29_022DC33C(u8 *p); - -extern u8 ov29_023538B4[0x0001963C]; +extern struct unk_ov29_022DC240_t ov29_023538B4; extern u8 *ov29_023534E0; -extern void ov29_022DC544(s32); -extern void ov29_022DC240(u8*); -extern void ov29_022DC314(u8*, u8*); - void ov29_022DC61C() { - MemZero(ov29_023538B4, sizeof(ov29_023538B4)); + MemZero((u8 *)&ov29_023538B4, sizeof(ov29_023538B4)); ov29_022DC544(0); - ov29_022DC240(ov29_023538B4); - ov29_022DC314(ov29_023538B4, ov29_023534E0); + ov29_022DC240(&ov29_023538B4); + ov29_022DC314(&ov29_023538B4, ov29_023534E0); } void ov29_022DC65C(void) { - ov29_022DC2B8(ov29_023538B4); + ov29_022DC2B8(&ov29_023538B4); } void ov29_022DC670(void) { - ov29_022DC33C(ov29_023538B4); + ov29_022DC33C((u8 *)&ov29_023538B4); } diff --git a/src/overlay_29_022E9628.c b/src/overlay_29_022E9628.c new file mode 100644 index 00000000..04d8762a --- /dev/null +++ b/src/overlay_29_022E9628.c @@ -0,0 +1,171 @@ +#include "overlay_29_022E9628.h" +#include "dungeon.h" +#include "dungeon_map_access.h" +#include "dungeon_util_static.h" +#include "dg_uty.h" +#include "dg_random.h" +#include "main_02001188.h" +#include "MSL_C/stdlib.h" + +extern struct dungeon *DUNGEON_PTR[2]; + +bool8 GetRandomTile(struct position *out, bool8 avoid_visited) +{ + struct entity *leader; + s32 count; + s32 i; + s32 j; + s32 y; + s32 attempt; + s32 x; + s32 y_start; + s32 ok; + s32 leader_x; + s32 leader_y; + u8 tiles[DUNGEON_MAX_SIZE_X * DUNGEON_MAX_SIZE_Y][2]; + + leader = GetLeader(); + count = 0; + + for (attempt = 0; attempt < 3; attempt++) { + struct position leader_pos; + + x = DungeonRandInt(DUNGEON_MAX_SIZE_X); + y_start = DungeonRandInt(DUNGEON_MAX_SIZE_Y); + leader_pos = leader->pos; + leader_x = leader_pos.x; + leader_y = leader_pos.y; + + for (i = 0; i < DUNGEON_MAX_SIZE_X; i++) { + y = y_start; + if (count >= DUNGEON_MAX_SIZE_X * DUNGEON_MAX_SIZE_Y) + break; + + for (j = 0; j < DUNGEON_MAX_SIZE_Y; j++) { + struct tile *tile; + + ok = FALSE; + tile = GetTile(x, y); + if (count >= DUNGEON_MAX_SIZE_X * DUNGEON_MAX_SIZE_Y) + break; + + if (avoid_visited && (tile->terrain_flags & 0x800)) + continue; + + if (attempt == 0) { + if (GetTerrainType(tile) == TERRAIN_TYPE_NORMAL + && tile->room != 0xFF && tile->object == NULL + && tile->monster == NULL + && (abs(leader_x - x) >= 6 || abs(leader_y - y) >= 6)) { + ok = TRUE; + } + } else if (attempt == 1) { + if (GetTerrainType(tile) == TERRAIN_TYPE_NORMAL + && tile->room != 0xFF && tile->object == NULL + && tile->monster == NULL) { + ok = TRUE; + } + } else { + if (GetTerrainType(tile) == TERRAIN_TYPE_NORMAL + && tile->object == NULL && tile->monster == NULL) { + ok = TRUE; + } + } + + if (ok) { + tiles[count][0] = x; + tiles[count][1] = y; + count++; + } + + y++; + if (y >= DUNGEON_MAX_SIZE_Y) + y = 0; + } + + x++; + if (x >= DUNGEON_MAX_SIZE_X) + x = 0; + } + + if (count != 0) { + s32 pick = DungeonRandInt(count); + out->x = tiles[pick][0]; + out->y = tiles[pick][1]; + return TRUE; + } + } + + return FALSE; +} + +bool32 FindNearbyUnoccupiedTile(struct position *out, struct position *origin, + const struct position *displacements, s32 count, + bool8 avoid_stairs) +{ + s16 *order; + bool8 found; + s32 i; + + found = FALSE; + order = MemAlloc((count + 1) * sizeof(s16), 0); + + for (i = 0; i < count; i++) + order[i] = i; + + if (avoid_stairs) { + s16 rounds; + s32 last; + s32 j; + s32 r; + + rounds = DungeonRandInt(4) + 1; + last = count - 1; + for (r = 0; r < rounds; r = (s16)(r + 1)) { + for (j = 0; j < last; j = (s16)(j + 1)) { + s16 k = DungeonRandInt(count); + s16 tmp = order[j]; + order[j] = order[k]; + order[k] = tmp; + } + } + } + + for (i = 0; i < count; i++) { + s32 idx = order[i]; + s32 dx = displacements[idx].x; + s32 x; + s32 y; + struct tile *tile; + u16 flags; + + if (dx == 0x63) + break; + + x = origin->x + dx; + y = origin->y + displacements[idx].y; + tile = GetTile(x, y); + flags = tile->terrain_flags; + if (flags & 0x800) + continue; + + if (avoid_stairs) { + if (tile->room == 0xFF) + continue; + if (DUNGEON_PTR[0]->gen_info.stairs_pos.x == x + && DUNGEON_PTR[0]->gen_info.stairs_pos.y == y) + continue; + } + + if ((flags & 3) == TERRAIN_TYPE_NORMAL && tile->object == NULL + && tile->monster == NULL) { + out->x = x; + out->y = y; + found = TRUE; + break; + } + } + + MemFree(order); + return found; +} diff --git a/src/overlay_29_022E99F0.c b/src/overlay_29_022E99F0.c index fd8d57ab..c078d009 100644 --- a/src/overlay_29_022E99F0.c +++ b/src/overlay_29_022E99F0.c @@ -1,25 +1,24 @@ #include "overlay_29_022E99F0.h" #include "dungeon_mode.h" +#include "overlay_29_022E9628.h" -extern struct position *FindNearbyUnoccupiedTile(struct position *out, struct position *origin, const s32 *displacements, s32 count, bool8 a); +extern const struct position DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST[]; -extern const s32 DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST[]; +extern const struct position DISPLACEMENTS_WITHIN_2_LARGEST_FIRST[]; -extern const s32 DISPLACEMENTS_WITHIN_2_LARGEST_FIRST[]; +extern const struct position DISPLACEMENTS_WITHIN_3[]; -extern const s32 DISPLACEMENTS_WITHIN_3[]; - -struct position* FindClosestUnoccupiedTileWithin2(struct position* out, struct position* origin, bool8 a) +bool32 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) +bool32 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) +bool32 FindUnoccupiedTileWithin3(struct position* out, struct position* origin, bool8 a) { return FindNearbyUnoccupiedTile(out, origin, DISPLACEMENTS_WITHIN_3, 0x31, a); } diff --git a/src/overlay_29_0230F810.c b/src/overlay_29_0230F810.c index 84ad025d..b20226a8 100644 --- a/src/overlay_29_0230F810.c +++ b/src/overlay_29_0230F810.c @@ -21,6 +21,7 @@ #include "overlay_29_02344AF8.h" #include "overlay_29_02348D00.h" #include "overlay_29_0234B4BC.h" +#include "overlay_29_023456BC.h" #ifdef JAPAN #define MESSAGE_C5E 0x99D @@ -42,7 +43,6 @@ extern struct dungeon *DUNGEON_PTR[]; extern struct bag_items *BAG_ITEMS_PTR_MIRROR; -extern void RemoveGroundItem(struct position *pos, bool8 a); extern bool8 GetExclusiveItemForMonsterFromBag(struct item *item, enum exclusive_item_effect_id effect_id, s16 monster_id, enum type_id type1, diff --git a/src/overlay_29_02320764.c b/src/overlay_29_02320764.c index 96799d40..1a0f31f2 100644 --- a/src/overlay_29_02320764.c +++ b/src/overlay_29_02320764.c @@ -24,6 +24,8 @@ #include "overlay_29_02336F4C.h" #include "overlay_29_0234B340.h" #include "overlay_29_02344088.h" +#include "overlay_29_022E9628.h" +#include "overlay_29_023456BC.h" #ifdef JAPAN #define MESSAGE_BFB 0x93A @@ -52,14 +54,12 @@ extern u32 DUNGEON_FRAMES_PASSED; extern struct position *ov29_023529B8[]; extern s32 EXPLOSION_FIXED_DAMAGES[]; -extern void RemoveGroundItem(struct position *pos, bool8 a); extern void ov29_02336694(s32 x, s32 y); extern void DetermineTileWalkableNeighbors(s32 x, s32 y); extern void UpdateMinimap(void); extern bool8 TwoTurnMoveForcedMiss(struct entity *target, struct move *move); extern void TryInflictPetrifiedStatus(struct entity *user, struct entity *target); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); -extern bool8 GetRandomTile(struct position *out, bool8 a); extern void MoveMonsterToPos(struct entity *entity, s32 x_pos, s32 y_pos, bool8 reset_prev_pos_fields); extern void UpdateCamera(s32 a); diff --git a/src/overlay_29_023456BC.c b/src/overlay_29_023456BC.c new file mode 100644 index 00000000..d08dc4d1 --- /dev/null +++ b/src/overlay_29_023456BC.c @@ -0,0 +1,138 @@ +#include "overlay_29_023456BC.h" +#include "dungeon.h" +#include "dungeon_map_access.h" +#include "dungeon_util_static.h" +#include "item_util_1.h" +#include "item_util_4.h" +#include "main_0201BCCC.h" +#include "overlay_29_022E1610.h" +#include "overlay_29_022E272C.h" +#include "overlay_29_02345698.h" + +struct unk_0237C864 { + u16 field_0x0; + u16 field_0x2; + u16 field_0x4; + u16 field_0x6; + u8 field_0x8[0x1c]; +}; + +extern struct dungeon *DUNGEON_PTR[]; + +extern struct unk_0201BCCC *OBJ_GRAPHICS_CONTROLS_PTR; + +extern struct unk_0237C864 ov29_0237C864; + +extern u8 ov29_023537B4[8]; + +extern u8 ov29_023537BC[8]; + +extern s32 AddSimpleObjToOam(void *controls, void *oam_data, s32 x); + +bool8 RemoveGroundItem(struct position *pos, bool8 a) +{ + struct item *item; + s32 i; + s32 count; + struct tile *tile; + struct entity *object; + + tile = GetTileSafe(pos->x, pos->y); + object = tile->object; + if (object == NULL) + return FALSE; + if (object->type != ENTITY_ITEM) + return FALSE; + item = GetItemInfo(object); + if (tile->terrain_flags & TERRAIN_TYPE_SHOP) { + if (IsShoppableItem(item->id)) { + if (item->flags & ITEM_FLAG_IN_SHOP) { + if (a) + DUNGEON_PTR[0]->poke_buy_kecleon_shop -= GetActualBuyPrice(item); + } + else { + DUNGEON_PTR[0]->poke_sold_kecleon_shop -= GetActualSellPrice(item); + } + } + } + tile->object = NULL; + object->type = ENTITY_NOTHING; + count = 0; + for (i = 0; i < 64; i++) { + if (EntityIsValid__02345698(DUNGEON_PTR[0]->item_ptrs[i])) + count = i + 1; + } + DUNGEON_PTR[0]->n_items = count; + return TRUE; +} + +bool8 DisplayItem(struct entity *entity, bool8 a, bool8 b, u8 c, bool8 d) +{ + struct dungeon *dungeon; + s32 terrain; + s32 pal; + s32 cam_y; + s32 shake; + s32 pixel_y; + s32 ground; + s32 x; + s32 y; + s32 mode; + s32 prio; + s32 sprite; + + mode = 0; + if (!EntityIsValid__02345698(entity)) + return FALSE; + if (b) { + terrain = GetTerrainType(GetTile(entity->pos.x, entity->pos.y)); + if (terrain == TERRAIN_TYPE_WALL) + return FALSE; + if (terrain == TERRAIN_TYPE_SECONDARY) + mode = 1; + if (!ShouldDisplayEntityWrapper(entity)) + return FALSE; + } + dungeon = DUNGEON_PTR[0]; + x = ((s32)entity->pixel_pos.x >> 8) - dungeon->display_data.camera_pixel_pos.x; + cam_y = dungeon->display_data.camera_pixel_pos.y; + shake = dungeon->display_data.screen_shake_offset; + pixel_y = entity->pixel_pos.y; + ground = ((pixel_y >> 8) - cam_y) + shake; + y = (((pixel_y - entity->elevation) >> 8) - cam_y) + shake; + prio = (ground + 8) / 2; + if (x >= -32 && y >= -32 && x <= 287 && y <= 224) { + ov29_0237C864.field_0x2 &= ~0x3E00; + if (a) { + ov29_0237C864.field_0x4 &= ~0xF000; + ov29_0237C864.field_0x4 |= 0xA000; + sprite = 0x17; + } + else { + sprite = GetItemSpriteId(((struct item *)entity->info)->id); + if (c != 0xFF && (sprite == 0 || sprite == 0x3B)) { + sprite = ov29_023537B4[c]; + ov29_0237C864.field_0x2 &= ~0x3E00; + ov29_0237C864.field_0x2 |= (ov29_023537BC[c] & 3) << 12; + } + pal = sub_0200D1FC(((struct item *)entity->info)->id); + ov29_0237C864.field_0x4 &= ~0xF000; + ov29_0237C864.field_0x4 |= (pal & 0xF) << 12; + } + ov29_0237C864.field_0x6 &= ~0xFFF0; + ov29_0237C864.field_0x6 |= (y & 0xFFF) << 4; + ov29_0237C864.field_0x2 &= ~0x1FF; + ov29_0237C864.field_0x2 |= x & 0x1FF; + ov29_0237C864.field_0x0 &= ~0xC00; + ov29_0237C864.field_0x0 |= (mode & 3) << 10; + ov29_0237C864.field_0x4 &= ~0xC00; + ov29_0237C864.field_0x4 |= 0xC00; + ov29_0237C864.field_0x4 &= ~0x3FF; + ov29_0237C864.field_0x4 |= (sprite * 2 + 0x110) & 0x3FF; + if (!d) + prio = 1; + AddSimpleObjToOam(OBJ_GRAPHICS_CONTROLS_PTR, &ov29_0237C864, prio); + return TRUE; + } + return FALSE; +} diff --git a/src/poly_text.c b/src/poly_text.c index bf9a0168..28b2c260 100644 --- a/src/poly_text.c +++ b/src/poly_text.c @@ -1,4 +1,62 @@ #include "poly_text.h" +#include "debug.h" +#include "file.h" +#include "main_0201E380.h" + +struct unk_ov29_022DC240_1962a_t unk1962a; + +extern u8 *_020AFC70; + +struct unk_02353880 { + u16 field_0x0; + u16 field_0x2; + u32 field_0x4; + u32 field_0x8; + s16 field_0xc; + s16 field_0xe; + s16 field_0x10; + s16 field_0x12; + u16 field_0x14; + s16 field_0x16; + s16 field_0x18; + s16 field_0x1a; + s16 field_0x1c; + s16 field_0x1e; + s16 field_0x20; + u16 field_0x22; + u16 field_0x24; + u8 field_0x26; + u8 field_0x27; + u8 field_0x28[0xc]; +}; + +extern struct unk_02353880 ov29_02353880; + +extern const u8 ov29_0234FD14[]; + +extern const u8 ov29_0234FD04[][4]; + +extern u32 ov29_0234FD48[]; + +extern u32 ov29_0234FD4C[]; + +extern u32 ov29_0234FD50[]; + +extern u32 ov29_0234FD54[]; + +extern const char *ov29_023534E8[]; + +extern void LoadFileFromRom(struct iovec *iov, const char *filepath, u32 flags); + +extern void sub_02008BF4(void *a, const u8 *b); + +extern void sub_0201E050(void *src, u32 dst, u32 len, u32 d); + +extern void Render3dSetTextureParams(void *params, u32 a); + +extern void Render3dSetPaletteBase(void *params, u32 base); + +extern void Render3dTextureNoSetup(void *elem); extern void MemZero(void* ptr, u32 len); @@ -22,3 +80,95 @@ void ov29_022DC2B8(struct unk_ov29_022DC240_t *param0) { (param0->unk17704)[i] = 0; } } + +void ov29_022DC314(void* a, const u8* b) +{ + Debug_Print0(ov29_0234FD14, b); + sub_02008BF4(a, b); +} + +void ov29_022DC33C(u8* p) +{ + struct unk_ov29_022DC240_t* d = (struct unk_ov29_022DC240_t*)p; + struct unk_02353880* g; + struct unk_ov29_022DC240_t* q; + u16 params; + u16 *pp; + u32 vram; + s16 i; + u16 col; + u8 c; + + if (d->unk19628 == 0) { + return; + } + + { + struct unk_02353880* const e = &ov29_02353880; + e->field_0x14 = (e->field_0x14 & ~0x700) | 0x200; + pp = ¶ms; + *pp = (*pp & ~0x700) | 0x200; + e->field_0x14 = (e->field_0x14 & ~0x7) | 0x5; + *pp = (*pp & ~0x7) | 0x5; + e->field_0x16 = 0; + e->field_0x18 = 0; + e->field_0x1a = 0; + e->field_0x1c = 0; + e->field_0x1e = 0x1000; + e->field_0x20 = 0x1000; + e->field_0xc = 0; + e->field_0xe = 0; + e->field_0x10 = 0; + e->field_0x12 = 0; + e->field_0x24 = 0; + e->field_0x4 = 0; + e->field_0x8 = 0; + e->field_0x26 = 0; + e->field_0x2 = 0; + e->field_0x14 = (e->field_0x14 & ~0x38) | 0x28; + e->field_0x22 = 0x7fff; + e->field_0x27 = 0x1f; + *pp = (*pp & ~0x38) | 0x28; + vram = *(u32*)(_020AFC70 + 0xe0); + } + + Render3dSetTextureParams(¶ms, 0x1b000); + Render3dSetPaletteBase(¶ms, vram + 0x3c00); + + for (i = 0, g = &ov29_02353880; i < d->unk19628; i++) { + q = (struct unk_ov29_022DC240_t*)&((struct unk_ov29_022DC240_18304_t*)p)[i]; + if (q->unk18304[0].unkd != 0) { + c = q->unk18304[0].unkc & 3; + g->field_0x16 = q->unk18304[0].unk0; + g->field_0x18 = q->unk18304[0].unk2; + col = (u16)((ov29_0234FD04[c][2] & 0xf8) << 7) | ((ov29_0234FD04[c][1] & 0xf8) << 2) | ((ov29_0234FD04[c][0] & 0xf8) >> 3); + g->field_0xc = q->unk18304[0].unk4; + g->field_0xe = q->unk18304[0].unk6; + g->field_0x10 = q->unk18304[0].unk8; + g->field_0x12 = q->unk18304[0].unka; + g->field_0x14 = (g->field_0x14 & ~0x700) | 0x200; + g->field_0x2 = 0; + g->field_0x27 = 0x1f; + g->field_0x22 = col; + g->field_0x0 = 3; + Render3dTextureNoSetup(g); + } + } +} + +void ov29_022DC544(s32 a) +{ + struct iovec iov; + void* base; + u32 len; + + LoadFileFromRom(&iov, ov29_023534E8[a], 0x300); + base = iov.iov_base; + len = iov.iov_len; + sub_0201E050(base, 0x1b000, len, 0); + sub_0201E050(base, 0, 0, 2); + sub_0201E380((struct unk_0201E380*)(_020AFC70 + 0xcc), ov29_0234FD48, 0x1e, 0); + sub_0201E380((struct unk_0201E380*)(_020AFC70 + 0xcc), ov29_0234FD4C, 0x1e, 1); + sub_0201E380((struct unk_0201E380*)(_020AFC70 + 0xcc), ov29_0234FD50, 0x1e, 2); + sub_0201E380((struct unk_0201E380*)(_020AFC70 + 0xcc), ov29_0234FD54, 0x1e, 3); +} From 222afee8cba8ce95b9245c8929cb56cc1cf022b6 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sat, 19 Sep 2026 01:42:07 -0700 Subject: [PATCH 33/34] Rename three padding members to the documented field_0x form struct unk_022C593C and struct unk_023535DC in src/overlay_29_02308FBC.c were introduced by this branch with padding members named filler, filler1 and filler2. That spelling has no precedent in the tree: the only filler-style names at a3d64122 are fillerForNow / fillerForNow2 in include/ground_bg.h, against 2515 uses of the field_0x form CLAUDE.md prescribes for the members of a placeholder struct. Renamed to their offsets - field_0x2[10], field_0x1[3] and field_0xc[4]. The members are padding, are referenced nowhere in the tree, and neither their types nor their order changed, so no layout can move. Authored by Claude (Opus 5) under human direction. Proved byte-neutral rather than argued: src/overlay_29_02308FBC.o, compiled in the build image with the real flags including -W all -W pedantic -W error, is byte-identical before and after the rename in NORTH_AMERICA, EUROPE and JAPAN (19408 / 19552 / 19312 bytes respectively - the regions do compile this file differently, they are just insensitive to an identifier rename). A three-region ROM build of this working tree additionally reached build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- src/overlay_29_02308FBC.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index 4aef4509..8307ddad 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -69,10 +69,10 @@ struct unk_023535DC { u8 field_0x0; - u8 filler1[3]; + u8 field_0x1[3]; s32 field_0x4; bool8 (*field_0x8)(struct entity *attacker, struct entity *defender, s32 a); - u8 filler2[4]; + u8 field_0xc[4]; }; struct unk_023528A4 { @@ -82,7 +82,7 @@ struct unk_023528A4 { struct unk_022C593C { s16 field_0x0; - u8 filler[10]; + u8 field_0x2[10]; }; extern const struct StatIndex ATK_STAT_IDX; From 7487d6f73df8f5b8b1b1bc20c949ec53b4abbfb9 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 20 Sep 2026 00:59:34 -0700 Subject: [PATCH 34/34] Address PR #300 review: restore field comments, de-duplicate a forward declaration, fix case indentation Six review comments from AnonymousRandomPerson on pret/pmd-sky#300. Comments restored, in include/common.h (struct ground_monster's level, level_at_first_evo, level_at_second_evo, iq and max_hp) and in include/ground_bg.h (BmaHeader's numLayers, hasDataLayer, hasCollision). These were not removed deliberately: each line was rewritten for a type correction and its trailing comment went with it. Every one of those retypes is the same character width as what it replaced, so the original column alignment is restored verbatim. struct team_member keeps u8 flags, with the labelled bitfield preserved as a comment in the form struct item already uses for the same situation. struct ground_monster; is no longer forward-declared anywhere. All three headers that carried it - main_02055410.h, main_02056914.h and main_0205A288.h - now include common.h instead. main_02056914.h previously had no includes at all, so this makes it self-contained as well. Case indentation in src/main_0203D538.c and src/overlay_29_0231CBC8.c. The defect was wider than the two labels the review pointed at: whole regions were de-indented, consistent with a splice artifact. overlay_29_0231CBC8.c's switch ran at column 8, then 4, then 0, then 4; main_0203D538.c had two contiguous blocks short by 4 and by 8. Re-indented by brace depth, so every switch in both files is now internally consistent with its own earlier cases. The comments in this commit were added under build-tools/precommit.py's --allow-comments override, which exists for exactly this case: they were requested by the upstream maintainer in review, not authored here. Authored by Claude (Opus 5) under human direction. Proved byte-neutral rather than argued, because two of these changes could in principle move codegen: the eight translation units reaching any of the three edited headers, and the two re-indented files, each compiled in the build image with the real flags (including -W all -W pedantic -W error) before and after. All 30 objects are byte-identical across NORTH_AMERICA, EUROPE and JAPAN. Co-Authored-By: Claude Opus 5 --- include/common.h | 13 +- include/ground_bg.h | 6 +- include/main_02055410.h | 3 +- include/main_02056914.h | 2 +- include/main_0205A288.h | 3 +- src/main_0203D538.c | 1200 ++++++++++++++++++------------------- src/overlay_29_0231CBC8.c | 492 +++++++-------- 7 files changed, 860 insertions(+), 859 deletions(-) diff --git a/include/common.h b/include/common.h index 648215e2..dd9111b9 100644 --- a/include/common.h +++ b/include/common.h @@ -32,14 +32,14 @@ struct ground_move { struct ground_monster { u8 is_valid; // 0x0: True if the entry is valid - u8 level; + u8 level; // 0x1: Monster level u8 joined_at; // 0x2 u8 joined_at_floor; // 0x3: See struct monster::joined_at_floor s16 id; // 0x4: Monster ID - u8 level_at_first_evo; - u8 level_at_second_evo; - s16 iq; - s16 max_hp; + u8 level_at_first_evo; // 0x6: Level upon first evolution, or 0 if not applicable + u8 level_at_second_evo; // 0x7: Level upon second evolution, or 0 if not applicable + s16 iq; // 0x8 + s16 max_hp; // 0xA u8 offensive_stats[2]; // 0xC: {atk, sp_atk} u8 defensive_stats[2]; // 0xE: {def, sp_def} s32 exp; // 0x10 @@ -54,7 +54,10 @@ struct ground_monster { // Stores information about active team members, including those from special episodes. // A lot of the fields seem to be analogous to fields on struct monster. struct team_member { + // 0x0: flags: 1-byte bitfield u8 flags; + // u8 f_is_valid : 1; + // u8 flags_unk1 : 7; u8 is_leader; // 0x1 u8 level; // 0x2 diff --git a/include/ground_bg.h b/include/ground_bg.h index 4e66f953..6549ae8b 100644 --- a/include/ground_bg.h +++ b/include/ground_bg.h @@ -177,9 +177,9 @@ typedef struct BmaHeader u8 mapWidthChunks; u8 mapHeightChunks; - s16 numLayers; - s16 hasDataLayer; - s16 hasCollision; + s16 numLayers; // Number of layers in this map. Must match BPC layer size. Allowed values are only 1 or 2. + s16 hasDataLayer; // Seems to be a boolean flag (0 or 1). If >0, the Unknown Data Layer exists. + s16 hasCollision; // Number of Collision layers. 0, 1 or 2. } BmaHeader; typedef struct BplHeader diff --git a/include/main_02055410.h b/include/main_02055410.h index 0bcda1b6..2e740290 100644 --- a/include/main_02055410.h +++ b/include/main_02055410.h @@ -1,10 +1,9 @@ #ifndef PMDSKY_MAIN_02055410_H #define PMDSKY_MAIN_02055410_H +#include "common.h" #include "util.h" -struct ground_monster; - bool8 sub_02055410(int idx); bool8 sub_02055474(int idx); bool8 sub_020554D8(int idx); diff --git a/include/main_02056914.h b/include/main_02056914.h index 3bc8fdcb..63e2928b 100644 --- a/include/main_02056914.h +++ b/include/main_02056914.h @@ -1,7 +1,7 @@ #ifndef PMDSKY_MAIN_02056914_H #define PMDSKY_MAIN_02056914_H -struct ground_monster; +#include "common.h" struct ground_monster* sub_02056914(void); diff --git a/include/main_0205A288.h b/include/main_0205A288.h index 5f9be5ab..b08e8165 100644 --- a/include/main_0205A288.h +++ b/include/main_0205A288.h @@ -1,11 +1,10 @@ #ifndef PMDSKY_MAIN_0205A288_H #define PMDSKY_MAIN_0205A288_H +#include "common.h" #include "enums.h" #include "util.h" -struct ground_monster; - bool8 HandleShedinjaEvolution(s16 *member_idx, enum monster_id monster_id); s16 sub_0205A340(s16 *member_idx, struct ground_monster *src, enum monster_id monster_id); diff --git a/src/main_0203D538.c b/src/main_0203D538.c index e9e10725..a176e854 100644 --- a/src/main_0203D538.c +++ b/src/main_0203D538.c @@ -289,616 +289,616 @@ s32 sub_0203D538(void) } break; } - case 12: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x18 > 1) { - ApplyLevelUpBoostsToGroundMonster(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8, (s16)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x18, 1); - } - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.flag_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38; - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { - sub_02046BE8(0x101C, (0x27A + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - sub_0203F00C(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xd; - } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 4) { - sub_02046BE8(0x101C, (u16)(LoadScriptVariableValue(0, 0x69) + (0x27B + SUB_0203D538_OFFSET)), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - sub_0203F00C(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xd; - } else { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xf; - } - break; - case 13: - if (sub_02046C78() != 0) { - MissionRewardCloseAllBoxes(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xe; - } - break; - case 14: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xf; - } - break; - case 15: - GetNameWithGender(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x2b5, MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38, 0x4e); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x2b5; - sub_02046BE8(0x100C, (0x2A6 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); -#ifdef JAPAN - StrcpySimple((unsigned char *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a1, (const unsigned char *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8->name); -#else - StrncpySimple((unsigned char *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a1, (const unsigned char *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8->name, 10); -#endif - MemcpySimple((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8->name, 10); - StrncpySimpleNoPadSafe((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5, (const u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 10); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x10; - break; - case 16: - if (sub_02046C78() != 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0 = CreateSimpleMenuFromStringIds(&_0209C85C, 0x300011, 0, _0209C86C, 2); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x11; - } - break; - case 17: - if (IsSimpleMenuActive(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0) == 0) { - s32 result = GetSimpleMenuResult__0202B870(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0); - CloseSimpleMenu(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0 = -2; - sub_02046D20(); - switch (result) { - case 0: - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x12; - break; - case 1: - default: - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x20; - break; + case 12: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x18 > 1) { + ApplyLevelUpBoostsToGroundMonster(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8, (s16)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x18, 1); } - } - break; - case 18: - ov11_0230D92C(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x13; - break; - case 19: - if (ov11_0230D220() == 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x14; - } - break; - case 20: - ShowKeyboard(2, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 0, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a1); - ov11_02310BDC(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x15; - break; - case 21: - if (ov11_0230D220() == 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x16; - } - break; - case 22: - if (GetKeyboardStatus() == 3) { - MemcpySimple((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, (u8 *)GetKeyboardStringResult(), 10); - StrncpySimpleNoPadSafe((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5, (const u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 10); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x17; - } - break; - case 23: - if (sub_02037468() != 0) { - ov11_0230D92C(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x18; - } - break; - case 24: - if (ov11_0230D220() == 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x19; - } - break; - case 25: - ov11_0230D92C(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1a; - break; - case 26: - if (ov11_0230D220() == 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1b; - } - break; - case 27: - sub_0203909C((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1c; - break; - case 28: - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3bc = sub_0203931C(); - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3bc >= 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1d; - } - break; - case 29: - if (sub_02039218() != 0) { - switch (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3bc) { - case 0: - MemcpySimple((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8->name, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 10); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x20; - break; - case 1: - default: - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x12; - break; - } - } - break; - case 32: - { - s32 v10; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.flag_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38 | 0x80000; - StrncpySimpleNoPadSafe((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 10); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.flag_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38; if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { - v10 = (0x283 + SUB_0203D538_OFFSET); + sub_02046BE8(0x101C, (0x27A + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + sub_0203F00C(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xd; + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 4) { + sub_02046BE8(0x101C, (u16)(LoadScriptVariableValue(0, 0x69) + (0x27B + SUB_0203D538_OFFSET)), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + sub_0203F00C(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xd; } else { - v10 = (0x281 + SUB_0203D538_OFFSET); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xf; } - sub_02017C50(5); - sub_02046BE8(0x101C, v10, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x21; - } - break; - case 33: - if (sub_02046C78()) { - MissionRewardCloseAllBoxes(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x22; - } - break; - case 34: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x29; - } - break; - case 30: - sub_02046D20(); - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2 || MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 3) { - ov11_023061E4(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x40, 1); - } else { - ov11_023061CC(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x40); - } - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1f; - break; - case 31: - { - s32 v10; - struct ground_monster *v11; - v10 = ov11_02306C9C(); - switch (v10) { - case 3: - case 4: - v11 = ov11_02306C64(); - if (v11 == 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x23; - } else { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8 = v11; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xc; - } - break; + break; + case 13: + if (sub_02046C78() != 0) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xe; } - } - break; - case 35: - GetNameRaw((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; - sub_02046BE8(0x101C, (0x284 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x24; - break; - case 36: - if (sub_02046C78()) { - MissionRewardCloseAllBoxes(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x25; - } - break; - case 37: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x26; - } - break; - case 38: - sub_02017C50(4); - AddMoneyCarried(1000); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 1000; - sub_02046BE8(0x101C, (0x285 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x27; - break; - case 39: - if (sub_02046C78()) { - MissionRewardCloseAllBoxes(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x28; - } - break; - case 40: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x29; - } - break; - case 41: - { - s32 v10; - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10 >= MISSION_REWARD_STRUCT_MAIN_PTR->field_0x20) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3a; - break; + break; + case 14: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xf; } - v5.id = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].id; - v5.flags = 0; - if (IsStorableItem(v5.id)) { - if (IsThrownItem(v5.id) || (v5.id >= ITEM_GORGEOUS_BOX_1 && v5.id <= ITEM_SINISTER_BOX_3)) { - v5.quantity = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].quantity; - } else { - v5.quantity = 0; - } - v5.flags = 1; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10] = v5; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[0] = v5.id; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 0; - MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, &v5, &_0209C850); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.flag_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x14; - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 != 0) { - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { - v10 = (0x296 + SUB_0203D538_OFFSET); - sub_0203F00C(); - } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 3) { - v10 = (0x297 + SUB_0203D538_OFFSET); - sub_0203F00C(); - } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 4) { - v10 = (0x298 + SUB_0203D538_OFFSET); - sub_0203F00C(); - } else { - v10 = (0x295 + SUB_0203D538_OFFSET); - } - sub_02046BE8(0x101C, v10, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2a; - } else { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2c; - } - } else { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x33; - } - } - break; - case 42: - if (sub_02046C78()) { - MissionRewardCloseAllBoxes(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2b; - } - break; - case 43: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2c; - } - break; - case 44: - if (AddItemToStorage(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10])) { - if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 2) == 0) { - sub_02017C50(4); - } - if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 4) == 0) { - sub_02046BE8(0x1c, (0x273 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2e; - } else if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 8) != 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x30; - } else { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x33; - } - } else { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x34; - } - break; -case 52: - v4.id = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].id; - v4.quantity = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].quantity; - v4.flags = 0; - sub_02046D20(); - InitUnkStorageStruct0x410(&v4, (MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 1) == 0); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x35; - break; -case 53: - switch (sub_02046028()) { - case 4: - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2d; - break; - case 2: - sub_02045FD0(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x36; - break; - case 3: - sub_02045FD0(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x38; - break; - } - break; -case 54: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x37; - } - break; -case 55: - if (AddItemToStorage(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10])) { - if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 2) == 0) { - sub_02017C50(4); - } - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].id; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 0; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[2] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xdc; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[2] = 0; - v3.id = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde.id; - v3.quantity = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde.quantity; - v3.flags = 0; - MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10], &_0209C850); - MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x138, &v3, &_0209C850); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[2] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x138; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; - sub_02046BE8(0x101C, (0x275 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2e; - } else { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x34; - } - break; -case 56: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x39; - } - break; -case 57: - if (AddItemToStorage(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10])) { - if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 2) == 0) { - sub_02017C50(4); - } - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].id; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 0; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[2] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xdc; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[2] = 0; - MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10], &_0209C850); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; - sub_02046BE8(0x101C, (0x277 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2e; - } else { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x34; - } - break; -case 45: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { - sub_02046BE8(0x101C, (0x286 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - sub_02045FD0(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2e; - } - break; -case 46: - if (sub_02046C78()) { - MissionRewardCloseAllBoxes(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2f; - } - break; -case 47: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x33; - } - break; -case 48: + break; + case 15: + GetNameWithGender(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x2b5, MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38, 0x4e); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x2b5; + sub_02046BE8(0x100C, (0x2A6 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); #ifdef JAPAN - sub_02046BE8(0x101C, 0x2FEC, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); -#else - sub_02046BE8(0x101C, 0x2CC, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); -#endif - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x31; - break; -case 49: - if (sub_02046C78()) { - MissionRewardCloseAllBoxes(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x32; - } - break; -case 50: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x33; - } - break; -case 51: - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10++; - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10 < 3) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x29; - } else { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3a; - } - break; -case 58: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x36 == 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x40; - break; - } - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 != 0) { - s32 v10; - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { - v10 = (0x292 + SUB_0203D538_OFFSET); - sub_0203F00C(); - } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 3) { - v10 = (0x293 + SUB_0203D538_OFFSET); - sub_0203F00C(); - } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 4) { - v10 = (0x294 + SUB_0203D538_OFFSET); - sub_0203F00C(); - } else { - v10 = (0x291 + SUB_0203D538_OFFSET); - } - sub_02046BE8(0x101c, v10, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3b; - } else { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3d; - } - break; -case 59: - if (sub_02046C78() != 0) { - MissionRewardCloseAllBoxes(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3c; - } - break; -case 60: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3d; - } - break; -case 61: - sub_02017C50(5); - SetEggSpecies(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38); - SetEggHatchTimer((u16)(RandIntSafe(4) + 6)); - sub_02046BE8(0x101c, (0x272 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3e; - break; -case 62: - if (sub_02046C78() != 0) { - MissionRewardCloseAllBoxes(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3f; - } - break; -case 63: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x40; - } - break; -case 64: - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3c == 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; - break; - } - InitPreprocessorArgs(&v7); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0xc = GetRank(); - sub_02050C10(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3c); - sub_02017C50(4); - v7.number_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3c; - sub_02046BE8(0x101c, (0x2a1 + SUB_0203D538_OFFSET), &v7); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x41; - break; -case 65: - if (sub_02046C78() != 0) { - if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0xc != GetRank()) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x42; - } else { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; - } - } - break; -case 66: - sub_02017C50(2); - InitPreprocessorArgs(&v8); - v8.id_vals[2] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xc; - v8.id_vals[3] = GetRank(); - sub_02046BE8(0x101c, (0x2a2 + SUB_0203D538_OFFSET), &v8); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x43; - break; -case 67: - if (sub_02046C78() != 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x44; - } - break; -case 68: - InitPreprocessorArgs(&v9); - v9.number_vals[0] = GetRankUpEntry(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xc)->field_0x8; - v9.number_vals[1] = GetRankUpEntry(GetRank())->field_0x8; - if (v9.number_vals[0] == v9.number_vals[1]) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x46; - break; - } - sub_02046BE8(0x101c, (0x2a3 + SUB_0203D538_OFFSET), &v9); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x45; - break; -case 69: - if (sub_02046C78() != 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x46; - } - break; -case 70: { - struct unk_020AFE74 *p; - s16 v; - p = MISSION_REWARD_STRUCT_MAIN_PTR; - v = GetRankUpEntry(GetRank())->field_0xc; - p->field_0x84.id = v; - if (v == 0) { - sub_02046D20(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; - } else if (IsStorableItem(v)) { - p->field_0x84.quantity = IsThrownItem(p->field_0x84.id) != 0; - p->field_0x84.flags = ITEM_FLAG_EXISTS; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[0] = p->field_0x84.id; - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 0; - sub_02017C50(4); - sub_02046BE8(0x101c, (0x2a4 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x47; - } else { - sub_02046D20(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; - } - break; -} -case 71: - if (sub_02046C78()) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x48; - } - break; -case 72: - if (!AddItemToStorage(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x84)) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x49; - } else { - sub_02046D20(); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; - } - break; -case 73: - v2.id = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x84.id; - v2.quantity = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x84.quantity; - v2.flags = 0; - sub_02046D20(); - InitUnkStorageStruct0x410(&v2, (MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 1) == 0); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4a; - break; -case 74: { - s32 v10; - v10 = sub_02046028(); -#ifndef JAPAN - if (v10 == 1) { - break; - } - sub_02045FD0(&v1); - if (v1.id == 0) { - v1 = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x84; - } -#endif - switch (v10) { - case 4: -#ifndef JAPAN - MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, &v1, &_0209C850); + StrcpySimple((unsigned char *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a1, (const unsigned char *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8->name); + #else + StrncpySimple((unsigned char *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a1, (const unsigned char *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8->name, 10); + #endif + MemcpySimple((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8->name, 10); + StrncpySimpleNoPadSafe((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5, (const u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 10); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x10; + break; + case 16: + if (sub_02046C78() != 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0 = CreateSimpleMenuFromStringIds(&_0209C85C, 0x300011, 0, _0209C86C, 2); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x11; + } + break; + case 17: + if (IsSimpleMenuActive(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0) == 0) { + s32 result = GetSimpleMenuResult__0202B870(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0); + CloseSimpleMenu(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0 = -2; + sub_02046D20(); + switch (result) { + case 0: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x12; + break; + case 1: + default: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x20; + break; + } + } + break; + case 18: + ov11_0230D92C(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x13; + break; + case 19: + if (ov11_0230D220() == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x14; + } + break; + case 20: + ShowKeyboard(2, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 0, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a1); + ov11_02310BDC(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x15; + break; + case 21: + if (ov11_0230D220() == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x16; + } + break; + case 22: + if (GetKeyboardStatus() == 3) { + MemcpySimple((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, (u8 *)GetKeyboardStringResult(), 10); + StrncpySimpleNoPadSafe((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5, (const u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 10); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x17; + } + break; + case 23: + if (sub_02037468() != 0) { + ov11_0230D92C(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x18; + } + break; + case 24: + if (ov11_0230D220() == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x19; + } + break; + case 25: + ov11_0230D92C(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1a; + break; + case 26: + if (ov11_0230D220() == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1b; + } + break; + case 27: + sub_0203909C((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1c; + break; + case 28: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3bc = sub_0203931C(); + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3bc >= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1d; + } + break; + case 29: + if (sub_02039218() != 0) { + switch (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3bc) { + case 0: + MemcpySimple((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8->name, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 10); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x20; + break; + case 1: + default: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x12; + break; + } + } + break; + case 32: + { + s32 v10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.flag_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38 | 0x80000; + StrncpySimpleNoPadSafe((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5, (u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1ab, 10); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1b5; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { + v10 = (0x283 + SUB_0203D538_OFFSET); + } else { + v10 = (0x281 + SUB_0203D538_OFFSET); + } + sub_02017C50(5); + sub_02046BE8(0x101C, v10, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x21; + } + break; + case 33: + if (sub_02046C78()) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x22; + } + break; + case 34: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x29; + } + break; + case 30: + sub_02046D20(); + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2 || MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 3) { + ov11_023061E4(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x40, 1); + } else { + ov11_023061CC(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x40); + } + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x1f; + break; + case 31: + { + s32 v10; + struct ground_monster *v11; + v10 = ov11_02306C9C(); + switch (v10) { + case 3: + case 4: + v11 = ov11_02306C64(); + if (v11 == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x23; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3b8 = v11; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0xc; + } + break; + } + } + break; + case 35: + GetNameRaw((u8 *)MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38); MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; -#endif - sub_02046BE8(0x101c, (0x286 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4b; + sub_02046BE8(0x101C, (0x284 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x24; break; - case 2: - case 3: - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x48; + case 36: + if (sub_02046C78()) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x25; + } break; - } - break; -} -case 75: - if (sub_02046C78()) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; - } - break; -case 76: - return 1; + case 37: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x26; + } + break; + case 38: + sub_02017C50(4); + AddMoneyCarried(1000); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 1000; + sub_02046BE8(0x101C, (0x285 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x27; + break; + case 39: + if (sub_02046C78()) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x28; + } + break; + case 40: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x29; + } + break; + case 41: + { + s32 v10; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10 >= MISSION_REWARD_STRUCT_MAIN_PTR->field_0x20) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3a; + break; + } + v5.id = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].id; + v5.flags = 0; + if (IsStorableItem(v5.id)) { + if (IsThrownItem(v5.id) || (v5.id >= ITEM_GORGEOUS_BOX_1 && v5.id <= ITEM_SINISTER_BOX_3)) { + v5.quantity = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].quantity; + } else { + v5.quantity = 0; + } + v5.flags = 1; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10] = v5; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[0] = v5.id; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 0; + MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, &v5, &_0209C850); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.flag_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x14; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 != 0) { + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { + v10 = (0x296 + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 3) { + v10 = (0x297 + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 4) { + v10 = (0x298 + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else { + v10 = (0x295 + SUB_0203D538_OFFSET); + } + sub_02046BE8(0x101C, v10, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2a; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2c; + } + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x33; + } + } + break; + case 42: + if (sub_02046C78()) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2b; + } + break; + case 43: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2c; + } + break; + case 44: + if (AddItemToStorage(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10])) { + if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 2) == 0) { + sub_02017C50(4); + } + if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 4) == 0) { + sub_02046BE8(0x1c, (0x273 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2e; + } else if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 8) != 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x30; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x33; + } + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x34; + } + break; + case 52: + v4.id = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].id; + v4.quantity = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].quantity; + v4.flags = 0; + sub_02046D20(); + InitUnkStorageStruct0x410(&v4, (MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 1) == 0); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x35; + break; + case 53: + switch (sub_02046028()) { + case 4: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2d; + break; + case 2: + sub_02045FD0(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x36; + break; + case 3: + sub_02045FD0(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x38; + break; + } + break; + case 54: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x37; + } + break; + case 55: + if (AddItemToStorage(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10])) { + if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 2) == 0) { + sub_02017C50(4); + } + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].id; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 0; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[2] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xdc; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[2] = 0; + v3.id = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde.id; + v3.quantity = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde.quantity; + v3.flags = 0; + MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10], &_0209C850); + MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x138, &v3, &_0209C850); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[2] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x138; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; + sub_02046BE8(0x101C, (0x275 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2e; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x34; + } + break; + case 56: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x39; + } + break; + case 57: + if (AddItemToStorage(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10])) { + if ((MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 2) == 0) { + sub_02017C50(4); + } + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10].id; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 0; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[2] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xdc; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[2] = 0; + MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x24[MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10], &_0209C850); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; + sub_02046BE8(0x101C, (0x277 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2e; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x34; + } + break; + case 45: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + sub_02046BE8(0x101C, (0x286 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + sub_02045FD0(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0xde); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2e; + } + break; + case 46: + if (sub_02046C78()) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x2f; + } + break; + case 47: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x33; + } + break; + case 48: + #ifdef JAPAN + sub_02046BE8(0x101C, 0x2FEC, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + #else + sub_02046BE8(0x101C, 0x2CC, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + #endif + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x31; + break; + case 49: + if (sub_02046C78()) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x32; + } + break; + case 50: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x33; + } + break; + case 51: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10++; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x10 < 3) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x29; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3a; + } + break; + case 58: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x36 == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x40; + break; + } + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 != 0) { + s32 v10; + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 2) { + v10 = (0x292 + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 3) { + v10 = (0x293 + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8 == 4) { + v10 = (0x294 + SUB_0203D538_OFFSET); + sub_0203F00C(); + } else { + v10 = (0x291 + SUB_0203D538_OFFSET); + } + sub_02046BE8(0x101c, v10, &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3b; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3d; + } + break; + case 59: + if (sub_02046C78() != 0) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3c; + } + break; + case 60: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3d; + } + break; + case 61: + sub_02017C50(5); + SetEggSpecies(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x38); + SetEggHatchTimer((u16)(RandIntSafe(4) + 6)); + sub_02046BE8(0x101c, (0x272 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3e; + break; + case 62: + if (sub_02046C78() != 0) { + MissionRewardCloseAllBoxes(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188 = 10; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x3f; + } + break; + case 63: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x188-- <= 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x40; + } + break; + case 64: + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3c == 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; + break; + } + InitPreprocessorArgs(&v7); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0xc = GetRank(); + sub_02050C10(MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3c); + sub_02017C50(4); + v7.number_vals[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x3c; + sub_02046BE8(0x101c, (0x2a1 + SUB_0203D538_OFFSET), &v7); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x41; + break; + case 65: + if (sub_02046C78() != 0) { + if (MISSION_REWARD_STRUCT_MAIN_PTR->field_0xc != GetRank()) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x42; + } else { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; + } + } + break; + case 66: + sub_02017C50(2); + InitPreprocessorArgs(&v8); + v8.id_vals[2] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xc; + v8.id_vals[3] = GetRank(); + sub_02046BE8(0x101c, (0x2a2 + SUB_0203D538_OFFSET), &v8); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x43; + break; + case 67: + if (sub_02046C78() != 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x44; + } + break; + case 68: + InitPreprocessorArgs(&v9); + v9.number_vals[0] = GetRankUpEntry(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xc)->field_0x8; + v9.number_vals[1] = GetRankUpEntry(GetRank())->field_0x8; + if (v9.number_vals[0] == v9.number_vals[1]) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x46; + break; + } + sub_02046BE8(0x101c, (0x2a3 + SUB_0203D538_OFFSET), &v9); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x45; + break; + case 69: + if (sub_02046C78() != 0) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x46; + } + break; + case 70: { + struct unk_020AFE74 *p; + s16 v; + p = MISSION_REWARD_STRUCT_MAIN_PTR; + v = GetRankUpEntry(GetRank())->field_0xc; + p->field_0x84.id = v; + if (v == 0) { + sub_02046D20(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; + } else if (IsStorableItem(v)) { + p->field_0x84.quantity = IsThrownItem(p->field_0x84.id) != 0; + p->field_0x84.flags = ITEM_FLAG_EXISTS; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.id_vals[0] = p->field_0x84.id; + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.number_vals[0] = 0; + sub_02017C50(4); + sub_02046BE8(0x101c, (0x2a4 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x47; + } else { + sub_02046D20(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; + } + break; + } + case 71: + if (sub_02046C78()) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x48; + } + break; + case 72: + if (!AddItemToStorage(&MISSION_REWARD_STRUCT_MAIN_PTR->field_0x84)) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x49; + } else { + sub_02046D20(); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; + } + break; + case 73: + v2.id = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x84.id; + v2.quantity = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x84.quantity; + v2.flags = 0; + sub_02046D20(); + InitUnkStorageStruct0x410(&v2, (MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe4 & 1) == 0); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4a; + break; + case 74: { + s32 v10; + v10 = sub_02046028(); + #ifndef JAPAN + if (v10 == 1) { + break; + } + sub_02045FD0(&v1); + if (v1.id == 0) { + v1 = MISSION_REWARD_STRUCT_MAIN_PTR->field_0x84; + } + #endif + switch (v10) { + case 4: + #ifndef JAPAN + MaybeGetColoredFormattedItemName(MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8, &v1, &_0209C850); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c.strings[0] = MISSION_REWARD_STRUCT_MAIN_PTR->field_0xe8; + #endif + sub_02046BE8(0x101c, (0x286 + SUB_0203D538_OFFSET), &MISSION_REWARD_STRUCT_MAIN_PTR->field_0x8c); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4b; + break; + case 2: + case 3: + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x48; + break; + } + break; + } + case 75: + if (sub_02046C78()) { + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x4c; + } + break; + case 76: + return 1; } return 0; } diff --git a/src/overlay_29_0231CBC8.c b/src/overlay_29_0231CBC8.c index 139e2a61..3c633329 100644 --- a/src/overlay_29_0231CBC8.c +++ b/src/overlay_29_0231CBC8.c @@ -321,258 +321,258 @@ void ApplyItemEffect(char param_1, u8 param_2, u8 param_3, case ITEM_BLAST_SEED: ApplyBlastSeedEffect(attacker, defender, param_1); break; - case ITEM_MAX_ELIXIR: - RestoreAllMovePP(attacker, defender, 999, 0); - break; - case ITEM_PROTEIN: - ApplyProteinEffect(attacker, defender, PROTEIN_STAT_BOOST); - break; - case ITEM_CALCIUM: - ApplyCalciumEffect(attacker, defender, CALCIUM_STAT_BOOST); - break; - case ITEM_IRON: - ApplyIronEffect(attacker, defender, IRON_STAT_BOOST); - break; - case ITEM_ZINC: - ApplyZincEffect(attacker, defender, ZINC_STAT_BOOST); - break; - case ITEM_GABITE_SCALE: - EndNegativeStatusConditionWrapper(attacker, defender, TRUE, FALSE); - break; - case ITEM_GOLDEN_SEED: - LevelUpItemEffect(attacker, defender, 5, 1, 1); - break; - case ITEM_VILE_SEED: - ApplyVileSeedEffect(attacker, defender); - break; - case ITEM_PURE_SEED: - TryWarp(attacker, defender, 4, 0); - break; - case ITEM_VIOLENT_SEED: - ApplyViolentSeedEffect(attacker, defender); - break; - case ITEM_VANISH_SEED: - TryInflictInvisibleStatus(attacker, defender); - break; - case ITEM_NECTAR: - BoostIQ(defender, 10, FALSE); - break; - case ITEM_APPLE: - TryIncreaseBelly(attacker, defender, 50, 5, 1); - break; - case ITEM_BIG_APPLE: - TryIncreaseBelly(attacker, defender, 100, 10, 1); - break; - case ITEM_HUGE_APPLE: - TryIncreaseBelly(attacker, defender, 999, 10, 1); - break; - case ITEM_GRIMY_FOOD: - ApplyGrimyFoodEffect(attacker, defender); - break; - case ITEM_WHITE_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_NORMAL, GUMMI_STAT_BOOST); - break; - case ITEM_RED_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_FIRE, GUMMI_STAT_BOOST); - break; - case ITEM_BLUE_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_WATER, GUMMI_STAT_BOOST); - break; - case ITEM_GRASS_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_GRASS, GUMMI_STAT_BOOST); - break; - case ITEM_YELLOW_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_ELECTRIC, GUMMI_STAT_BOOST); - break; - case ITEM_CLEAR_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_ICE, GUMMI_STAT_BOOST); - break; - case ITEM_ORANGE_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_FIGHTING, GUMMI_STAT_BOOST); - break; - case ITEM_PINK_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_POISON, GUMMI_STAT_BOOST); - break; - case ITEM_BROWN_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_GROUND, GUMMI_STAT_BOOST); - break; - case ITEM_SKY_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_FLYING, GUMMI_STAT_BOOST); - break; - case ITEM_GOLD_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_PSYCHIC, GUMMI_STAT_BOOST); - break; - case ITEM_GREEN_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_BUG, GUMMI_STAT_BOOST); - break; - case ITEM_GRAY_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_ROCK, GUMMI_STAT_BOOST); - break; - case ITEM_PURPLE_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_GHOST, GUMMI_STAT_BOOST); - break; - case ITEM_ROYAL_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_DRAGON, GUMMI_STAT_BOOST); - break; - case ITEM_BLACK_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_DARK, GUMMI_STAT_BOOST); - break; - case ITEM_SILVER_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_STEEL, GUMMI_STAT_BOOST); - break; - case ITEM_WONDER_GUMMI: - ApplyGummiBoostsDungeonMode(attacker, defender, 0xFF, WONDER_GUMMI_STAT_BOOST); - break; - case ITEM_UNNAMED_0x71: - TryIncreaseBelly(attacker, defender, 50, 5, 1); - break; - case ITEM_UNNAMED_0x72: - TryIncreaseBelly(attacker, defender, 10, 0, 1); - break; - case ITEM_GOLDEN_APPLE: - TryIncreaseBelly(attacker, defender, 999, 50, 1); - break; - case ITEM_KEY: + case ITEM_MAX_ELIXIR: + RestoreAllMovePP(attacker, defender, 999, 0); + break; + case ITEM_PROTEIN: + ApplyProteinEffect(attacker, defender, PROTEIN_STAT_BOOST); + break; + case ITEM_CALCIUM: + ApplyCalciumEffect(attacker, defender, CALCIUM_STAT_BOOST); + break; + case ITEM_IRON: + ApplyIronEffect(attacker, defender, IRON_STAT_BOOST); + break; + case ITEM_ZINC: + ApplyZincEffect(attacker, defender, ZINC_STAT_BOOST); + break; + case ITEM_GABITE_SCALE: + EndNegativeStatusConditionWrapper(attacker, defender, TRUE, FALSE); + break; + case ITEM_GOLDEN_SEED: + LevelUpItemEffect(attacker, defender, 5, 1, 1); + break; + case ITEM_VILE_SEED: + ApplyVileSeedEffect(attacker, defender); + break; + case ITEM_PURE_SEED: + TryWarp(attacker, defender, 4, 0); + break; + case ITEM_VIOLENT_SEED: + ApplyViolentSeedEffect(attacker, defender); + break; + case ITEM_VANISH_SEED: + TryInflictInvisibleStatus(attacker, defender); + break; + case ITEM_NECTAR: + BoostIQ(defender, 10, FALSE); + break; + case ITEM_APPLE: + TryIncreaseBelly(attacker, defender, 50, 5, 1); + break; + case ITEM_BIG_APPLE: + TryIncreaseBelly(attacker, defender, 100, 10, 1); + break; + case ITEM_HUGE_APPLE: + TryIncreaseBelly(attacker, defender, 999, 10, 1); + break; + case ITEM_GRIMY_FOOD: + ApplyGrimyFoodEffect(attacker, defender); + break; + case ITEM_WHITE_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_NORMAL, GUMMI_STAT_BOOST); + break; + case ITEM_RED_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_FIRE, GUMMI_STAT_BOOST); + break; + case ITEM_BLUE_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_WATER, GUMMI_STAT_BOOST); + break; + case ITEM_GRASS_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_GRASS, GUMMI_STAT_BOOST); + break; + case ITEM_YELLOW_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_ELECTRIC, GUMMI_STAT_BOOST); + break; + case ITEM_CLEAR_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_ICE, GUMMI_STAT_BOOST); + break; + case ITEM_ORANGE_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_FIGHTING, GUMMI_STAT_BOOST); + break; + case ITEM_PINK_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_POISON, GUMMI_STAT_BOOST); + break; + case ITEM_BROWN_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_GROUND, GUMMI_STAT_BOOST); + break; + case ITEM_SKY_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_FLYING, GUMMI_STAT_BOOST); + break; + case ITEM_GOLD_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_PSYCHIC, GUMMI_STAT_BOOST); + break; + case ITEM_GREEN_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_BUG, GUMMI_STAT_BOOST); + break; + case ITEM_GRAY_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_ROCK, GUMMI_STAT_BOOST); + break; + case ITEM_PURPLE_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_GHOST, GUMMI_STAT_BOOST); + break; + case ITEM_ROYAL_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_DRAGON, GUMMI_STAT_BOOST); + break; + case ITEM_BLACK_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_DARK, GUMMI_STAT_BOOST); + break; + case ITEM_SILVER_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, TYPE_STEEL, GUMMI_STAT_BOOST); + break; + case ITEM_WONDER_GUMMI: + ApplyGummiBoostsDungeonMode(attacker, defender, 0xFF, WONDER_GUMMI_STAT_BOOST); + break; + case ITEM_UNNAMED_0x71: + TryIncreaseBelly(attacker, defender, 50, 5, 1); + break; + case ITEM_UNNAMED_0x72: + TryIncreaseBelly(attacker, defender, 10, 0, 1); + break; + case ITEM_GOLDEN_APPLE: + TryIncreaseBelly(attacker, defender, 999, 50, 1); + break; + case ITEM_KEY: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } + else { + ApplyKeyEffect(attacker); + } + break; + case ITEM_DROPEYE_SEED: + TryInflictDropeyeStatus(attacker, defender); + break; + case ITEM_SLIP_SEED: + if (!TryInflictSlipStatus(attacker, defender)) { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C75); + } + break; + case ITEM_VIA_SEED: + ApplyViaSeedEffect(attacker, defender); + break; + case ITEM_MIX_ELIXIR: + ApplyMixElixirEffect(attacker, defender); + break; + case ITEM_OREN_BERRY: + CalcDamageFixedNoCategory(attacker, defender, OREN_BERRY_DAMAGE, 1, NULL, TYPE_NONE, + DAMAGE_SOURCE_OREN_BERRY, 0, 0, 0); + break; + case ITEM_DOUGH_SEED: + ApplyDoughSeedEffect(attacker, defender); + break; + case ITEM_GRAVELYROCK: + ApplyGravelyrockEffect(attacker, defender); + break; + case ITEM_GONE_PEBBLE: + ApplyGonePebbleEffect(attacker, defender); + break; + case ITEM_WANDER_GUMMI: + TryInflictBlinkerStatus(attacker, defender, 0, 0); + break; + case ITEM_PRIZE_TICKET: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); + } + break; + case ITEM_SILVER_TICKET: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); + } + break; + case ITEM_GOLD_TICKET: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); + } + break; + case ITEM_PRISM_TICKET: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); + } + break; + case ITEM_SKY_GIFT: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, + DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } else { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C76); + } + break; + case ITEM_GRACIDEA: + ApplyGracideaEffect(attacker, defender); + break; + case ITEM_UNNAMED_0x16B: + break; + case ITEM_A_STONE: + case ITEM_B_STONE: + case ITEM_C_STONE: + case ITEM_D_STONE: + case ITEM_E_STONE: + case ITEM_F_STONE: + case ITEM_G_STONE: + case ITEM_H_STONE: + case ITEM_I_STONE: + case ITEM_J_STONE: + case ITEM_K_STONE: + case ITEM_L_STONE: + case ITEM_M_STONE: + case ITEM_N_STONE: + case ITEM_O_STONE: + case ITEM_P_STONE: + case ITEM_Q_STONE: + case ITEM_R_STONE: + case ITEM_S_STONE: + case ITEM_T_STONE: + case ITEM_U_STONE: + case ITEM_V_STONE: + case ITEM_W_STONE: + case ITEM_X_STONE: + case ITEM_Y_STONE: + case ITEM_Z_STONE: + case ITEM_EXCLAMATION_STONE: + case ITEM_QUESTION_STONE: if (param_1) { bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, + CalcDamageFixedNoCategory(attacker, defender, ov10_022C44EC, 1, &flag, TYPE_NONE, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); - } - else { - ApplyKeyEffect(attacker); - } - break; - case ITEM_DROPEYE_SEED: - TryInflictDropeyeStatus(attacker, defender); - break; -case ITEM_SLIP_SEED: - if (!TryInflictSlipStatus(attacker, defender)) { - SubstitutePlaceholderStringTags(0, defender, 0); - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C75); - } - break; -case ITEM_VIA_SEED: - ApplyViaSeedEffect(attacker, defender); - break; -case ITEM_MIX_ELIXIR: - ApplyMixElixirEffect(attacker, defender); - break; -case ITEM_OREN_BERRY: - CalcDamageFixedNoCategory(attacker, defender, OREN_BERRY_DAMAGE, 1, NULL, TYPE_NONE, - DAMAGE_SOURCE_OREN_BERRY, 0, 0, 0); - break; -case ITEM_DOUGH_SEED: - ApplyDoughSeedEffect(attacker, defender); - break; -case ITEM_GRAVELYROCK: - ApplyGravelyrockEffect(attacker, defender); - break; -case ITEM_GONE_PEBBLE: - ApplyGonePebbleEffect(attacker, defender); - break; -case ITEM_WANDER_GUMMI: - TryInflictBlinkerStatus(attacker, defender, 0, 0); - break; -case ITEM_PRIZE_TICKET: - if (param_1) { - bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, - DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); - } else { - SubstitutePlaceholderStringTags(0, defender, 0); - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); - } - break; -case ITEM_SILVER_TICKET: - if (param_1) { - bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, - DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); - } else { - SubstitutePlaceholderStringTags(0, defender, 0); - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); - } - break; -case ITEM_GOLD_TICKET: - if (param_1) { - bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, - DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); - } else { - SubstitutePlaceholderStringTags(0, defender, 0); - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); - } - break; -case ITEM_PRISM_TICKET: - if (param_1) { - bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, - DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); - } else { - SubstitutePlaceholderStringTags(0, defender, 0); - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C67); - } - break; -case ITEM_SKY_GIFT: - if (param_1) { - bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, - DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); - } else { - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_C76); - } - break; -case ITEM_GRACIDEA: - ApplyGracideaEffect(attacker, defender); - break; - case ITEM_UNNAMED_0x16B: - break; - case ITEM_A_STONE: - case ITEM_B_STONE: - case ITEM_C_STONE: - case ITEM_D_STONE: - case ITEM_E_STONE: - case ITEM_F_STONE: - case ITEM_G_STONE: - case ITEM_H_STONE: - case ITEM_I_STONE: - case ITEM_J_STONE: - case ITEM_K_STONE: - case ITEM_L_STONE: - case ITEM_M_STONE: - case ITEM_N_STONE: - case ITEM_O_STONE: - case ITEM_P_STONE: - case ITEM_Q_STONE: - case ITEM_R_STONE: - case ITEM_S_STONE: - case ITEM_T_STONE: - case ITEM_U_STONE: - case ITEM_V_STONE: - case ITEM_W_STONE: - case ITEM_X_STONE: - case ITEM_Y_STONE: - case ITEM_Z_STONE: - case ITEM_EXCLAMATION_STONE: - case ITEM_QUESTION_STONE: - if (param_1) { - bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C44EC, 1, &flag, TYPE_NONE, - DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); - } else { - LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE8); - } - break; - case ITEM_NOTHING: - default: - if (param_1) { - bool8 flag; - CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); - } - else { + } else { LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE8); } break; + case ITEM_NOTHING: + default: + if (param_1) { + bool8 flag; + CalcDamageFixedNoCategory(attacker, defender, ov10_022C4558, 1, &flag, TYPE_NONE, DAMAGE_SOURCE_THROWN_ITEM, 0, 0, 0); + } + else { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BE8); + } + break; } }