diff --git a/asm/include/overlay_29_022ECDE4.inc b/asm/include/overlay_29_022ECDE4.inc index 66008d2d..7deda93d 100644 --- a/asm/include/overlay_29_022ECDE4.inc +++ b/asm/include/overlay_29_022ECDE4.inc @@ -14,7 +14,7 @@ .public LoadWteFromFileDirectory .public memset .public MemZero -.public ov29_022E7A30 +.public GetRandomTrapId .public ov29_02352690 .public ov29_02352698 .public ov29_023526A0 diff --git a/asm/include/overlay_29_022EDCBC.inc b/asm/include/overlay_29_022EDCBC.inc index 358e3bb5..f9f9baa6 100644 --- a/asm/include/overlay_29_022EDCBC.inc +++ b/asm/include/overlay_29_022EDCBC.inc @@ -20,7 +20,7 @@ .public LogMessageByIdWithPopupCheckUserUnknown .public ov29_022E2CA0 .public ov29_022E58B0 -.public ov29_022E7A30 +.public GetRandomTrapId .public ov29_022F9840 .public PlaySeByIdIfShouldDisplayEntity .public SpawnTrap diff --git a/asm/include/overlay_29_022EE36C.inc b/asm/include/overlay_29_022EE36C.inc index 48f39bc2..decdf106 100644 --- a/asm/include/overlay_29_022EE36C.inc +++ b/asm/include/overlay_29_022EE36C.inc @@ -20,7 +20,7 @@ .public GetItemInfo .public GetKecleonIdToSpawnByFloor .public GetMonsterIdToSpawn -.public GetRandomTrapId +.public GetSanitizedRandomTrapId .public GetTile .public GetTrapInfo .public GetVisibilityRange diff --git a/asm/overlay_29_022E37DC.s b/asm/overlay_29_022E37DC.s index d3545498..c34a9990 100644 --- a/asm/overlay_29_022E37DC.s +++ b/asm/overlay_29_022E37DC.s @@ -5330,76 +5330,3 @@ _022E7A24: .word 0xFFFF8AD0 _022E7A28: .word 0x000286D2 + LOAD_MAPPA_FILE_ATTRIBUTES_OFFSET _022E7A2C: .word 0x000286F2 + LOAD_MAPPA_FILE_ATTRIBUTES_OFFSET arm_func_end LoadMappaFileAttributes - - arm_func_start ov29_022E7A30 -ov29_022E7A30: ; 0x022E7A30 - stmdb sp!, {r3, lr} - ldr r0, _022E7A80 ; =0x00002710 - bl DungeonRandInt - ldr r1, _022E7A84 ; =DUNGEON_PTR -#ifdef JAPAN - mov r2, #0 - ldr r3, [r1] - b _022E90E0 -_022E7A50: - add r1, r3, r2, lsl #1 - add r1, r1, #0x2c800 - ldrh r1, [r1, #0x8e] - cmp r1, #0 - beq _022E90DC - cmp r1, r0 - andge r0, r2, #0xff - ldmgeia sp!, {r3, pc} -_022E90DC: - add r2, r2, #1 -_022E90E0: - cmp r2, #0x19 -#else - mov r3, #0 - ldr ip, [r1] - ldr r1, _022E7A88 ; =0x0002C932 - b _022E7A70 -_022E7A50: - add r2, ip, r3, lsl #1 - ldrh r2, [r2, r1] - cmp r2, #0 - beq _022E7A6C - cmp r2, r0 - andge r0, r3, #0xff - ldmgeia sp!, {r3, pc} -_022E7A6C: - add r3, r3, #1 -_022E7A70: - cmp r3, #0x19 -#endif - blt _022E7A50 - mov r0, #0x10 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E7A80: .word 0x00002710 -_022E7A84: .word DUNGEON_PTR -#ifndef JAPAN -_022E7A88: .word 0x0002C932 -#endif - arm_func_end ov29_022E7A30 - - arm_func_start GetRandomTrapId -GetRandomTrapId: ; 0x022E7A8C - stmdb sp!, {r4, lr} - mov r4, #0 - b _022E7AB0 -_022E7A98: - bl ov29_022E7A30 - cmp r0, #0 - cmpne r0, #0x17 - cmpne r0, #0x11 - bne _022E7AB8 - add r4, r4, #1 -_022E7AB0: - cmp r4, #0x1e - blt _022E7A98 -_022E7AB8: - cmp r4, #0x1e - moveq r0, #0x10 - ldmia sp!, {r4, pc} - arm_func_end GetRandomTrapId diff --git a/asm/overlay_29_022ECDE4.s b/asm/overlay_29_022ECDE4.s index 22b269ca..debc3d83 100644 --- a/asm/overlay_29_022ECDE4.s +++ b/asm/overlay_29_022ECDE4.s @@ -852,7 +852,7 @@ _022ED8C4: tst r0, #0x40 movne r0, r4 bne _022ED8FC - bl ov29_022E7A30 + bl GetRandomTrapId _022ED8FC: cmp r0, #0x11 mov r1, r6 diff --git a/asm/overlay_29_022EDCBC.s b/asm/overlay_29_022EDCBC.s index e36a7b9f..a804eb77 100644 --- a/asm/overlay_29_022EDCBC.s +++ b/asm/overlay_29_022EDCBC.s @@ -19,7 +19,7 @@ TrySpawnTrap: ; 0x022EDCBC mov sb, #0 b _022EDD04 _022EDCF0: - bl ov29_022E7A30 + bl GetRandomTrapId mov r7, r0 cmp r7, #0x11 bne _022EDD0C diff --git a/asm/overlay_29_022EE36C.s b/asm/overlay_29_022EE36C.s index 6f22bebc..ac880f07 100644 --- a/asm/overlay_29_022EE36C.s +++ b/asm/overlay_29_022EE36C.s @@ -1066,7 +1066,7 @@ ApplyRandomTrapEffect: ; 0x022EEF40 str r3, [sp, #0x10 + APPLY_RANDOM_TRAP_EFFECT_OFFSET] ldr r8, [sp, #0x88] beq _022EF064 - bl GetRandomTrapId + bl GetSanitizedRandomTrapId ldr r1, _022EF06C ; =ov10_022C4B18 mov r4, r0 ldrb r0, [r1, r4] diff --git a/include/random_trap.h b/include/random_trap.h new file mode 100644 index 00000000..eaacd3f6 --- /dev/null +++ b/include/random_trap.h @@ -0,0 +1,7 @@ +#ifndef PMDSKY_RANDOM_TRAP_H +#define PMDSKY_RANDOM_TRAP_H + +u8 GetRandomTrapId(); +s32 GetSanitizedRandomTrapId(); + +#endif //PMDSKY_RANDOM_TRAP_H diff --git a/main.lsf b/main.lsf index c8602b4d..d8227c26 100644 --- a/main.lsf +++ b/main.lsf @@ -506,6 +506,7 @@ Overlay OVY_29 Object asm/overlay_29_022E335C.o Object src/dg_effect.o Object asm/overlay_29_022E37DC.o + Object src/random_trap.o Object src/spawn_1.o Object src/spawn_2.o Object asm/overlay_29_022E7EC4.o diff --git a/src/random_trap.c b/src/random_trap.c new file mode 100644 index 00000000..745f0701 --- /dev/null +++ b/src/random_trap.c @@ -0,0 +1,40 @@ +#include "dg_random.h" +#include "dungeon.h" +#include "enums.h" +#include "random_trap.h" + +extern struct dungeon *DUNGEON_PTR[]; + +u8 GetRandomTrapId() { + s32 rnd = DungeonRandInt(10000); + + for(s32 i = 0; i < TRAP_NONE; i++) { + u16 weight = DUNGEON_PTR[0]->trap_weights[i]; + if(weight == 0) { + continue; + } + + if(weight >= rnd) { + return i; + } + } + + return TRAP_CHESTNUT_TRAP; +} + +s32 GetSanitizedRandomTrapId() { + s32 trap_id; + s32 i; + for(i = 0; i < 30; i++) { + trap_id = GetRandomTrapId(); + if(trap_id != TRAP_NULL_TRAP && trap_id != TRAP_RANDOM_TRAP && trap_id != TRAP_WONDER_TILE) { + break; + } + } + + if(i == TRAP_0x1E) { + return TRAP_CHESTNUT_TRAP; + } + + return trap_id; +}