From 445f0a84e2f2ae5dbca2afdfdc580ced104be44e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 11 Nov 2024 21:01:00 +0100 Subject: [PATCH] GenerateKecleonShop --- asm/code_804AFAC.s | 673 ---------------------------------- include/structs/map.h | 1 + include/structs/str_dungeon.h | 12 +- src/code_804AFAC_1.c | 269 +++++++++++++- src/trap_1.c | 14 +- 5 files changed, 272 insertions(+), 697 deletions(-) diff --git a/asm/code_804AFAC.s b/asm/code_804AFAC.s index 21d398fff..f8802bda4 100644 --- a/asm/code_804AFAC.s +++ b/asm/code_804AFAC.s @@ -6,679 +6,6 @@ .text - thumb_func_start sub_804E9DC -sub_804E9DC: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - movs r5, 0 - movs r0, 0x3 - mov r8, r0 - movs r7, 0x8 - ldr r3, _0804EAF0 - mov r9, r3 -_0804E9F2: - movs r4, 0 - adds r6, r5, 0x1 - mov r10, r6 -_0804E9F8: - adds r0, r5, 0 - adds r1, r4, 0 - bl GetTile - ldrh r1, [r0] - mov r0, r8 - ands r0, r1 - adds r6, r4, 0x1 - cmp r0, 0x1 - beq _0804EA0E - b _0804EB0E -_0804EA0E: - adds r0, r5, 0 - adds r1, r4, 0 - bl GetTile - ldrb r0, [r0, 0x9] - cmp r0, 0xFF - bne _0804EAF4 - cmp r5, 0 - ble _0804EA4E - subs r0, r5, 0x1 - adds r1, r4, 0 - bl GetTileSafe - adds r2, r0, 0 - ldrb r0, [r2, 0x9] - cmp r0, 0xFF - beq _0804EA4E - ldrh r0, [r2] - adds r1, r0, 0 - orrs r1, r7 - movs r3, 0 - strh r1, [r2] - adds r0, r1, 0 - mov r6, r8 - ands r0, r6 - cmp r0, 0x2 - bne _0804EA4E - mov r0, r9 - ands r1, r0 - movs r0, 0x1 - orrs r1, r0 - strh r1, [r2] -_0804EA4E: - cmp r4, 0 - ble _0804EA82 - subs r1, r4, 0x1 - adds r0, r5, 0 - bl GetTileSafe - adds r2, r0, 0 - ldrb r0, [r2, 0x9] - cmp r0, 0xFF - beq _0804EA82 - ldrh r0, [r2] - adds r1, r0, 0 - orrs r1, r7 - movs r3, 0 - orrs r1, r7 - strh r1, [r2] - adds r0, r1, 0 - mov r6, r8 - ands r0, r6 - cmp r0, 0x2 - bne _0804EA82 - mov r0, r9 - ands r1, r0 - movs r0, 0x1 - orrs r1, r0 - strh r1, [r2] -_0804EA82: - adds r6, r4, 0x1 - cmp r4, 0x1E - bgt _0804EABA - adds r0, r5, 0 - adds r1, r6, 0 - bl GetTileSafe - adds r2, r0, 0 - ldrb r0, [r2, 0x9] - cmp r0, 0xFF - beq _0804EABA - ldrh r0, [r2] - adds r1, r0, 0 - orrs r1, r7 - movs r3, 0 - mov r12, r3 - orrs r1, r7 - strh r1, [r2] - adds r0, r1, 0 - mov r3, r8 - ands r0, r3 - cmp r0, 0x2 - bne _0804EABA - mov r0, r9 - ands r1, r0 - movs r0, 0x1 - orrs r1, r0 - strh r1, [r2] -_0804EABA: - cmp r5, 0x36 - bgt _0804EB0E - mov r0, r10 - adds r1, r4, 0 - bl GetTileSafe - adds r2, r0, 0 - ldrb r0, [r2, 0x9] - cmp r0, 0xFF - beq _0804EB0E - ldrh r0, [r2] - adds r1, r0, 0 - orrs r1, r7 - movs r3, 0 - orrs r1, r7 - strh r1, [r2] - adds r0, r1, 0 - mov r4, r8 - ands r0, r4 - cmp r0, 0x2 - bne _0804EB0E - mov r0, r9 - ands r1, r0 - movs r0, 0x1 - orrs r1, r0 - strh r1, [r2] - b _0804EB0E - .align 2, 0 -_0804EAF0: .4byte 0x0000fffc -_0804EAF4: - adds r0, r5, 0 - adds r1, r4, 0 - bl GetTile - ldrb r0, [r0, 0x9] - cmp r0, 0xFE - bne _0804EB0E - adds r0, r5, 0 - adds r1, r4, 0 - bl GetTileSafe - movs r1, 0xFF - strb r1, [r0, 0x9] -_0804EB0E: - adds r4, r6, 0 - cmp r4, 0x1F - bgt _0804EB16 - b _0804E9F8 -_0804EB16: - mov r5, r10 - cmp r5, 0x37 - bgt _0804EB1E - b _0804E9F2 -_0804EB1E: - bl sub_804EB30 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_804E9DC - - thumb_func_start sub_804EB30 -sub_804EB30: - push {r4-r7,lr} - ldr r0, _0804EBB4 - ldr r6, [r0] - movs r2, 0 - movs r1, 0x1F - ldr r3, _0804EBB8 - adds r0, r6, r3 -_0804EB3E: - strh r2, [r0] - subs r0, 0x2 - subs r1, 0x1 - cmp r1, 0 - bge _0804EB3E - movs r5, 0 -_0804EB4A: - movs r4, 0 - adds r7, r5, 0x1 -_0804EB4E: - adds r0, r5, 0 - adds r1, r4, 0 - bl GetTile - ldrh r1, [r0] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _0804EBA2 - adds r0, r5, 0 - adds r1, r4, 0 - bl GetTile - ldrb r3, [r0, 0x9] - cmp r3, 0x1F - bhi _0804EBA2 - lsls r0, r3, 1 - ldr r2, _0804EBBC - adds r1, r6, r2 - adds r2, r1, r0 - movs r1, 0 - ldrsh r0, [r2, r1] - cmp r0, 0x1F - bgt _0804EBA2 - lsls r0, 2 - lsls r1, r3, 7 - adds r0, r1 - adds r0, r6, r0 - ldr r3, _0804EBC0 - adds r0, r3 - strh r5, [r0] - movs r3, 0 - ldrsh r0, [r2, r3] - lsls r0, 2 - adds r0, r1 - adds r0, r6, r0 - ldr r1, _0804EBC4 - adds r0, r1 - strh r4, [r0] - ldrh r0, [r2] - adds r0, 0x1 - strh r0, [r2] -_0804EBA2: - adds r4, 0x1 - cmp r4, 0x1F - ble _0804EB4E - adds r5, r7, 0 - cmp r5, 0x37 - ble _0804EB4A - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0804EBB4: .4byte gDungeon -_0804EBB8: .4byte 0x00010882 -_0804EBBC: .4byte 0x00010844 -_0804EBC0: .4byte 0x00010884 -_0804EBC4: .4byte 0x00010886 - thumb_func_end sub_804EB30 - - thumb_func_start GenerateKecleonShop -GenerateKecleonShop: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x58 - str r0, [sp, 0x40] - str r1, [sp, 0x44] - mov r10, r2 - adds r4, r3, 0 - ldr r0, _0804EE90 - ldr r0, [r0] - mov r8, r0 - ldr r1, _0804EE94 - ldr r0, _0804EE98 - strh r0, [r1] - movs r0, 0x1 - negs r0, r0 - strh r0, [r1, 0x2] - ldr r0, _0804EE9C - ldrb r0, [r0] - cmp r0, 0 - beq _0804EBF8 - b _0804EED4 -_0804EBF8: - bl sub_8043D10 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x2 - bne _0804EC06 - b _0804EED4 -_0804EC06: - cmp r4, 0 - bne _0804EC0C - b _0804EED4 -_0804EC0C: - movs r0, 0x64 - bl DungeonRandInt - cmp r4, r0 - bgt _0804EC18 - b _0804EED4 -_0804EC18: - movs r5, 0 - add r7, sp, 0x20 - adds r1, r7, 0 - mov r0, sp -_0804EC20: - strh r5, [r0] - strh r5, [r1] - adds r1, 0x2 - adds r0, 0x2 - adds r5, 0x1 - cmp r5, 0xE - ble _0804EC20 - movs r5, 0xC7 -_0804EC30: - movs r0, 0xF - bl DungeonRandInt - adds r4, r0, 0 - movs r0, 0xF - bl DungeonRandInt - lsls r4, 1 - mov r1, sp - adds r2, r1, r4 - movs r4, 0 - ldrsh r3, [r2, r4] - lsls r0, 1 - adds r1, r0 - ldrh r0, [r1] - strh r0, [r2] - strh r3, [r1] - subs r5, 0x1 - cmp r5, 0 - bge _0804EC30 - adds r6, r7, 0 - movs r5, 0xC7 -_0804EC5C: - movs r0, 0xF - bl DungeonRandInt - adds r4, r0, 0 - movs r0, 0xF - bl DungeonRandInt - lsls r4, 1 - adds r4, r6, r4 - movs r1, 0 - ldrsh r2, [r4, r1] - lsls r0, 1 - adds r0, r6, r0 - ldrh r1, [r0] - strh r1, [r4] - strh r2, [r0] - subs r5, 0x1 - cmp r5, 0 - bge _0804EC5C - movs r5, 0 -_0804EC84: - lsls r0, r5, 1 - add r0, sp - movs r3, 0 - ldrsh r2, [r0, r3] - mov r9, r2 - ldr r4, [sp, 0x44] - cmp r9, r4 - blt _0804EC96 - b _0804EECC -_0804EC96: - movs r4, 0 -_0804EC98: - lsls r0, r4, 1 - adds r0, r7, r0 - movs r2, 0 - ldrsh r1, [r0, r2] - cmp r1, r10 - blt _0804ECA6 - b _0804EEC4 -_0804ECA6: - lsls r1, 5 - mov r3, r9 - lsls r2, r3, 4 - subs r0, r2, r3 - lsls r0, 5 - ldr r3, [sp, 0x40] - adds r0, r3 - adds r3, r1, r0 - ldrb r0, [r3, 0x8] - str r1, [sp, 0x4C] - str r2, [sp, 0x48] - cmp r0, 0 - beq _0804ECC2 - b _0804EEC4 -_0804ECC2: - ldrb r0, [r3, 0x11] - cmp r0, 0 - beq _0804ECCA - b _0804EEC4 -_0804ECCA: - ldrb r0, [r3, 0x12] - cmp r0, 0 - beq _0804ECD2 - b _0804EEC4 -_0804ECD2: - ldrb r0, [r3, 0xB] - cmp r0, 0 - bne _0804ECDA - b _0804EEC4 -_0804ECDA: - ldrb r0, [r3, 0xA] - cmp r0, 0 - bne _0804ECE2 - b _0804EEC4 -_0804ECE2: - ldrb r0, [r3, 0x9] - cmp r0, 0 - beq _0804ECEA - b _0804EEC4 -_0804ECEA: - ldrb r0, [r3, 0x10] - cmp r0, 0 - beq _0804ECF2 - b _0804EEC4 -_0804ECF2: - ldrb r0, [r3, 0x1D] - cmp r0, 0 - beq _0804ECFA - b _0804EEC4 -_0804ECFA: - movs r0, 0x4 - ldrsh r1, [r3, r0] - movs r2, 0 - ldrsh r0, [r3, r2] - subs r1, r0 - cmp r1, 0 - bge _0804ED0A - negs r1, r1 -_0804ED0A: - cmp r1, 0x4 - bgt _0804ED10 - b _0804EEC4 -_0804ED10: - movs r0, 0x6 - ldrsh r1, [r3, r0] - movs r2, 0x2 - ldrsh r0, [r3, r2] - subs r1, r0 - cmp r1, 0 - bge _0804ED20 - negs r1, r1 -_0804ED20: - cmp r1, 0x3 - bgt _0804ED26 - b _0804EEC4 -_0804ED26: - ldr r1, _0804EEA0 - movs r0, 0x1 - strb r0, [r1] - movs r0, 0x1 - strb r0, [r3, 0xC] - ldr r2, _0804EEA4 - movs r4, 0 - ldrsh r0, [r3, r4] - adds r0, 0x1 - str r0, [r2] - movs r7, 0x4 - ldrsh r0, [r3, r7] - subs r0, 0x1 - str r0, [r2, 0x8] - movs r0, 0x2 - ldrsh r1, [r3, r0] - adds r1, 0x1 - str r1, [r2, 0x4] - movs r4, 0x6 - ldrsh r3, [r3, r4] - subs r0, r3, 0x1 - str r0, [r2, 0xC] - subs r0, r1 - mov r10, r2 - cmp r0, 0x2 - bgt _0804ED5C - str r3, [r2, 0xC] -_0804ED5C: - ldr r0, _0804EEA8 - add r0, r8 - ldr r1, _0804EEAC - str r1, [r0] - ldr r0, _0804EEB0 - add r0, r8 - str r1, [r0] - ldr r0, _0804EEB4 - add r0, r8 - ldr r1, _0804EEB8 - str r1, [r0] - ldr r0, _0804EEBC - add r0, r8 - str r1, [r0] - mov r7, r10 - ldr r5, [r7] - ldr r0, [r7, 0x8] - cmp r5, r0 - bge _0804EDFA - mov r3, r10 -_0804ED84: - ldr r4, [r3, 0x4] - ldr r0, [r3, 0xC] - adds r1, r5, 0x1 - str r1, [sp, 0x54] - cmp r4, r0 - bge _0804EDF0 - ldr r6, _0804EEA8 - add r6, r8 - ldr r2, _0804EEA4 - mov r10, r2 -_0804ED98: - adds r0, r5, 0 - adds r1, r4, 0 - str r3, [sp, 0x50] - bl GetTileSafe - ldrh r2, [r0] - movs r1, 0x20 - orrs r1, r2 - strh r1, [r0] - ldrh r2, [r0, 0x4] - ldr r7, _0804EEC0 - adds r1, r7, 0 - ands r2, r1 - adds r7, 0x7 - adds r1, r7, 0 - ands r2, r1 - strh r2, [r0, 0x4] - ldr r0, [r6] - ldr r3, [sp, 0x50] - cmp r0, r5 - ble _0804EDC4 - str r5, [r6] -_0804EDC4: - ldr r1, _0804EEB0 - add r1, r8 - ldr r0, [r1] - cmp r0, r4 - ble _0804EDD0 - str r4, [r1] -_0804EDD0: - ldr r1, _0804EEB4 - add r1, r8 - ldr r0, [r1] - cmp r0, r5 - bge _0804EDDC - str r5, [r1] -_0804EDDC: - ldr r1, _0804EEBC - add r1, r8 - ldr r0, [r1] - cmp r0, r4 - bge _0804EDE8 - str r4, [r1] -_0804EDE8: - adds r4, 0x1 - ldr r0, [r3, 0xC] - cmp r4, r0 - blt _0804ED98 -_0804EDF0: - ldr r5, [sp, 0x54] - mov r1, r10 - ldr r0, [r1, 0x8] - cmp r5, r0 - blt _0804ED84 -_0804EDFA: - ldr r3, [sp, 0x4C] - ldr r2, [sp, 0x48] - mov r4, r9 - subs r0, r2, r4 - lsls r0, 5 - ldr r7, [sp, 0x40] - adds r1, r0, r7 - adds r0, r3, r1 - movs r4, 0 - ldrsh r5, [r0, r4] - movs r7, 0x4 - ldrsh r0, [r0, r7] - cmp r5, r0 - bge _0804EE6C - mov r8, r1 -_0804EE18: - mov r1, r9 - subs r0, r2, r1 - lsls r0, 5 - ldr r2, [sp, 0x40] - adds r0, r2 - adds r0, r3, r0 - movs r3, 0x2 - ldrsh r4, [r0, r3] - movs r7, 0x6 - ldrsh r0, [r0, r7] - adds r1, r5, 0x1 - str r1, [sp, 0x54] - cmp r4, r0 - bge _0804EE52 - ldr r6, [sp, 0x4C] - add r6, r8 -_0804EE38: - adds r0, r5, 0 - adds r1, r4, 0 - bl GetTileSafe - ldrh r2, [r0, 0x4] - movs r1, 0x10 - orrs r1, r2 - strh r1, [r0, 0x4] - adds r4, 0x1 - movs r2, 0x6 - ldrsh r0, [r6, r2] - cmp r4, r0 - blt _0804EE38 -_0804EE52: - ldr r5, [sp, 0x54] - ldr r3, [sp, 0x4C] - ldr r2, [sp, 0x48] - mov r4, r9 - subs r0, r2, r4 - lsls r0, 5 - ldr r7, [sp, 0x40] - adds r0, r7 - adds r0, r3, r0 - movs r1, 0x4 - ldrsh r0, [r0, r1] - cmp r5, r0 - blt _0804EE18 -_0804EE6C: - ldr r2, _0804EEA4 - ldr r0, [r2] - ldr r1, [r2, 0x8] - adds r0, r1 - lsrs r1, r0, 31 - adds r0, r1 - asrs r5, r0, 1 - ldr r0, [r2, 0x4] - ldr r1, [r2, 0xC] - adds r0, r1 - lsrs r1, r0, 31 - adds r0, r1 - asrs r4, r0, 1 - ldr r0, _0804EE94 - strh r5, [r0] - strh r4, [r0, 0x2] - b _0804EED4 - .align 2, 0 -_0804EE90: .4byte gDungeon -_0804EE94: .4byte gUnknown_202F1D8 -_0804EE98: .4byte 0x0000ffff -_0804EE9C: .4byte gUnknown_202F1AB -_0804EEA0: .4byte gUnknown_202F1AA -_0804EEA4: .4byte gUnknown_202F1B8 -_0804EEA8: .4byte 0x0000e240 -_0804EEAC: .4byte 0x0000270f -_0804EEB0: .4byte 0x0000e244 -_0804EEB4: .4byte 0x0000e248 -_0804EEB8: .4byte 0xffffd8f1 -_0804EEBC: .4byte 0x0000e24c -_0804EEC0: .4byte 0x0000fff7 -_0804EEC4: - adds r4, 0x1 - cmp r4, 0xE - bgt _0804EECC - b _0804EC98 -_0804EECC: - adds r5, 0x1 - cmp r5, 0xE - bgt _0804EED4 - b _0804EC84 -_0804EED4: - add sp, 0x58 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end GenerateKecleonShop - thumb_func_start GenerateMonsterHouse GenerateMonsterHouse: push {r4-r7,lr} diff --git a/include/structs/map.h b/include/structs/map.h index 7e8e22a16..1f0c4c92c 100644 --- a/include/structs/map.h +++ b/include/structs/map.h @@ -5,6 +5,7 @@ #include "structs/str_position.h" #define MAX_ROOM_COUNT 32 // Empirical max, not sure if the code supports any more. +#define ROOM_0xFE 0xFE // Anchor? #define CORRIDOR_ROOM 0xFF enum TerrainType diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index 3a10faf66..93871dfb8 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -230,6 +230,15 @@ struct MessageLogString u8 str[MESSAGE_LOG_BUFFER_SIZE]; }; +#define DEFAULT_MAX_POSITION 9999 +struct MinMaxPosition +{ + s32 minX; + s32 minY; + s32 maxX; + s32 maxY; +}; + // size: 0x1CEDC typedef struct Dungeon { @@ -350,8 +359,7 @@ typedef struct Dungeon Position unkE218; Position unkE21C; // stair location? Position unkE220[8]; - u32 unkE240; - u8 fillE244[0xE250 - 0xE244]; + struct MinMaxPosition kecleonShopPos; u32 unkE250; u8 fillE254[0xE260 - 0xE254]; u32 unkE260; diff --git a/src/code_804AFAC_1.c b/src/code_804AFAC_1.c index 5e70d51bc..d0bdbed76 100644 --- a/src/code_804AFAC_1.c +++ b/src/code_804AFAC_1.c @@ -10,7 +10,7 @@ extern const u8 gUnknown_80F6DCC[]; extern struct FileArchive gDungeonFileArchive; -extern u8 gUnknown_202F1AA; +extern bool8 gUnknown_202F1AA; extern u8 gUnknown_202F1AB; extern u8 gUnknown_202F1AC; extern u8 gUnknown_202F1A8; @@ -25,15 +25,7 @@ extern s32 gUnknown_202F1D0; extern s32 gUnknown_202F1CC; extern Position gUnknown_202F1D8; -struct UnkStruct_202F1B8 -{ - s32 unk0; - s32 unk4; - s32 unk8; - s32 unkC; -}; - -extern struct UnkStruct_202F1B8 gUnknown_202F1B8; +extern struct MinMaxPosition gUnknown_202F1B8; extern void sub_804FD30(void); extern void sub_804FD30(void); @@ -42,7 +34,8 @@ extern void sub_804FCCC(void); extern void GenerateOneRoomMonsterHouseFloor(void); extern void sub_804FBE8(void); extern void sub_804FC74(void); -extern void sub_804E9DC(void); +void sub_804EB30(void); +void sub_804E9DC(void); extern void GenerateTwoRoomsWithMonsterHouseFloor(void); extern u8 sub_8043D10(); extern bool8 sub_8050C30(s32 a0, s32 a1, u8 a2); @@ -107,7 +100,7 @@ void sub_804AFAC(void) UnkDungeonGlobal_unk1C574 *unkPtr = &gDungeon->unk1C574; gDungeon->unk13568 = OpenFileAndGetFileDataPtr(gUnknown_80F6DCC, &gDungeonFileArchive); - gUnknown_202F1AA = 0; + gUnknown_202F1AA = FALSE; gUnknown_202F1AB = 0; gUnknown_202F1AC = 0; gUnknown_202F1A8 = (gDungeonWaterType[gDungeon->tileset] == DUNGEON_WATER_TYPE_WATER); @@ -1015,7 +1008,7 @@ struct GridCell bool8 hasSecondaryStructure; bool8 isRoom; bool8 isConnected; - bool8 unk12; + bool8 isKecleonShop; bool8 unk13; bool8 isMonsterHouse; bool8 unk15; @@ -2052,7 +2045,7 @@ void InitDungeonGrid(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gri grid[x][y].isConnected = FALSE; grid[x][y].unk15 = FALSE; grid[x][y].isMonsterHouse = FALSE; - grid[x][y].unk12 = FALSE; + grid[x][y].isKecleonShop = FALSE; grid[x][y].connectedToRight = FALSE; grid[x][y].connectedToLeft = FALSE; grid[x][y].connectedToBottom = FALSE; @@ -2317,7 +2310,7 @@ void CreateRoomsAndAnchors(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s SetTerrainNormal(GetTileSafe(pt_x, pt_y)); // Set the room index to 0xFE for anchor - GetTileSafe(pt_x, pt_y)->room = 0xFE; + GetTileSafe(pt_x, pt_y)->room = ROOM_0xFE; } } } @@ -3526,4 +3519,250 @@ void SetTerrainObstacleChecked(Tile *tile, bool8 useSecondaryTerrain, u8 roomInd } } +void sub_804E9DC(void) +{ + s32 x, y; + + for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { + for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { + if (GetTerrainType(GetTile(x, y)) != TERRAIN_TYPE_NORMAL) + continue; + + if (GetTile(x, y)->room == CORRIDOR_ROOM) { + if (x > 0) { + Tile *tile = GetTileSafe(x - 1, y); + if (tile->room != CORRIDOR_ROOM) { + tile->terrainType |= TERRAIN_TYPE_NATURAL_JUNCTION; + + if (GetTerrainType(tile) == TERRAIN_TYPE_SECONDARY) { + SetTerrainType(tile, TERRAIN_TYPE_NORMAL); + } + } + } + if (y > 0) { + Tile *tile = GetTileSafe(x, y - 1); + if (tile->room != CORRIDOR_ROOM) { + // Yes, these |= have to be duplicated in order to match. Either it's an error and they wanted to use a different flag, or just copy-pasted it twice. + tile->terrainType |= TERRAIN_TYPE_NATURAL_JUNCTION; + tile->terrainType |= TERRAIN_TYPE_NATURAL_JUNCTION; + if (GetTerrainType(tile) == TERRAIN_TYPE_SECONDARY) { + SetTerrainType(tile, TERRAIN_TYPE_NORMAL); + } + } + } + if (y < DUNGEON_MAX_SIZE_Y - 1) { + Tile *tile = GetTileSafe(x, y + 1); + if (tile->room != CORRIDOR_ROOM) { + tile->terrainType |= TERRAIN_TYPE_NATURAL_JUNCTION; + tile->terrainType |= TERRAIN_TYPE_NATURAL_JUNCTION; + if (GetTerrainType(tile) == TERRAIN_TYPE_SECONDARY) { + SetTerrainType(tile, TERRAIN_TYPE_NORMAL); + } + } + } + if (x < DUNGEON_MAX_SIZE_X - 1) { + Tile *tile = GetTileSafe(x + 1, y); + if (tile->room != CORRIDOR_ROOM) { + tile->terrainType |= TERRAIN_TYPE_NATURAL_JUNCTION; + tile->terrainType |= TERRAIN_TYPE_NATURAL_JUNCTION; + if (GetTerrainType(tile) == TERRAIN_TYPE_SECONDARY) { + SetTerrainType(tile, TERRAIN_TYPE_NORMAL); + } + } + } + } + else if (GetTile(x, y)->room == ROOM_0xFE) { + GetTileSafe(x, y)->room = CORRIDOR_ROOM; + } + } + } + sub_804EB30(); +} + +void sub_804EB30(void) +{ + s32 i; + s32 x, y; + Dungeon *dungeon = gDungeon; + + for (i = 0; i < MAX_ROOM_COUNT; i++) { + dungeon->naturalJunctionListCounts[i] = 0; + } + + for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { + for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { + if (GetTile(x, y)->terrainType & TERRAIN_TYPE_NATURAL_JUNCTION) { + u32 roomIndex = GetTile(x, y)->room; + if (roomIndex < MAX_ROOM_COUNT && dungeon->naturalJunctionListCounts[roomIndex] < MAX_ROOM_COUNT) { + dungeon->naturalJunctionList[roomIndex][dungeon->naturalJunctionListCounts[roomIndex]].x = x; + dungeon->naturalJunctionList[roomIndex][dungeon->naturalJunctionListCounts[roomIndex]].y = y; + dungeon->naturalJunctionListCounts[roomIndex]++; + } + } + } + } +} + +/* + * GenerateKecleonShop - Potentially generate a kecleon shop on the floor. + * + * To spawn a kecleon shop, the floor cannot have a monster house, must not be a rescue floor, and must roll + * the percentage chance of kecleon_chance. + * + * Grid cells indices are shuffled, then each is checked to meet the conditions to spawn a kecleon shop in that cell: + * The room must be valid, connected, have no other special features, and have dimensions of at least 5x4. + * + * Once the first room (if any) is found that meets these conditions, the room is assigned as a kecleon shop. + * The kecleon shop will occupy the whole room interior, with a one tile margin from the room walls. + * Kecleon shop tiles restrict monster and stair spawns. + */ +void GenerateKecleonShop(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 chance) +{ + s16 listX[GRID_CELL_LEN]; + s16 listY[GRID_CELL_LEN]; + s32 x, y; + s32 i, j; + Dungeon *dungeon = gDungeon; + + gUnknown_202F1D8.x = -1; + gUnknown_202F1D8.y = -1; + + if (gUnknown_202F1AB || sub_8043D10() == 2 || chance == 0) + return; + if (chance <= DungeonRandInt(100)) + return; + + // All possible grid cells + for (i = 0; i < GRID_CELL_LEN; i++) { + listX[i] = i; + listY[i] = i; + } + + // Shuffle x indices + for (i = 0; i < 200; i++) { + s32 temp; + s32 a = DungeonRandInt(GRID_CELL_LEN); + s32 b = DungeonRandInt(GRID_CELL_LEN); + + SWAP(listX[a], listX[b], temp); + } + + // Shuffle y indices + for (i = 0; i < 200; i++) { + s32 temp; + s32 a = DungeonRandInt(GRID_CELL_LEN); + s32 b = DungeonRandInt(GRID_CELL_LEN); + + SWAP(listY[a], listY[b], temp); + } + + for (i = 0; i < GRID_CELL_LEN; i++) { + x = listX[i]; + if (x >= gridSizeX) + continue; + + for (j = 0; j < GRID_CELL_LEN; j++) { + s32 curX, curY; + + y = listY[j]; + if (y >= gridSizeY) + continue; + + // We've identified a random in-bounds grid cell + // To support a kecleon shop it must be: + // - valid + // - not a merged room + // - connected + // - a room + // - have no other special features (mazes/secondary structures) + // - have dimensions of at least 5x4 + if (grid[x][y].isInvalid) + continue; + if (grid[x][y].hasBeenMerged) + continue; + if (grid[x][y].isMerged) + continue; + if (!grid[x][y].isConnected) + continue; + if (!grid[x][y].isRoom) + continue; + if (grid[x][y].hasSecondaryStructure) + continue; + if (grid[x][y].isMazeRoom) + continue; + if (grid[x][y].flagSecondaryStructure) + continue; + + if (abs(grid[x][y].end.x - grid[x][y].start.x) < 5 || abs(grid[x][y].end.y - grid[x][y].start.y) < 4) + continue; + + // This room can be a kecleon shop + gUnknown_202F1AA = TRUE; + grid[x][y].isKecleonShop = TRUE; + + // Make the shop span the whole room + gUnknown_202F1B8.minX = grid[x][y].start.x + 1; + gUnknown_202F1B8.maxX = grid[x][y].end.x - 1; + gUnknown_202F1B8.minY = grid[x][y].start.y + 1; + gUnknown_202F1B8.maxY = grid[x][y].end.y - 1; + + if (gUnknown_202F1B8.maxY - gUnknown_202F1B8.minY < 3) { + // This should never happen? + gUnknown_202F1B8.maxY++; + } + + // Set to values that guarantee they'll be replaced later + dungeon->kecleonShopPos.minX = DEFAULT_MAX_POSITION; + dungeon->kecleonShopPos.minY = DEFAULT_MAX_POSITION; + dungeon->kecleonShopPos.maxX = -DEFAULT_MAX_POSITION; + dungeon->kecleonShopPos.maxY = -DEFAULT_MAX_POSITION; + + // Generate the actual shop on the interior, leaving + // a 1-tile border from the room walls + for (curX = gUnknown_202F1B8.minX; curX < gUnknown_202F1B8.maxX; curX++) { + for (curY = gUnknown_202F1B8.minY; curY < gUnknown_202F1B8.maxY; curY++) { + Tile *tile = GetTileSafe(curX, curY); + + tile->terrainType |= TERRAIN_TYPE_SHOP; + + // Restrict monsters and stairs from spawning here + tile->unk4 &= ~(0x8); + tile->unk4 &= ~(0x1); + + // Ensure the borders are assigned properly + if (dungeon->kecleonShopPos.minX > curX) { + dungeon->kecleonShopPos.minX = curX; + } + + if (dungeon->kecleonShopPos.minY > curY) { + dungeon->kecleonShopPos.minY = curY; + } + + if (dungeon->kecleonShopPos.maxX < curX) { + dungeon->kecleonShopPos.maxX = curX; + } + + if (dungeon->kecleonShopPos.maxY < curY) { + dungeon->kecleonShopPos.maxY = curY; + } + } + } + + // Sets an unknown spawn flag for all tiles in the room + for (curX = grid[x][y].start.x; curX < grid[x][y].end.x; curX++) { + for (curY = grid[x][y].start.y; curY < grid[x][y].end.y; curY++) { + GetTileSafe(curX, curY)->unk4 |= 0x10; + } + } + + curX = (gUnknown_202F1B8.minX + gUnknown_202F1B8.maxX) / 2; + curY = (gUnknown_202F1B8.minY + gUnknown_202F1B8.maxY) / 2; + gUnknown_202F1D8.x = curX; + gUnknown_202F1D8.y = curY; + + return; + } + } +} + // diff --git a/src/trap_1.c b/src/trap_1.c index 26f7f947b..04c7e0134 100644 --- a/src/trap_1.c +++ b/src/trap_1.c @@ -17,7 +17,7 @@ extern u8 gYayoiSan[]; extern void sub_8082FA8(unkStruct_8094924 *, void *, s32); void SaveTile(unkStruct_8094924 *r0, Tile *tile); -void sub_80830F8(void * , u32*); +void sub_80830F8(void * , void*); void sub_808312C(void *, u32 *); void SaveDungeonWeather(unkStruct_8094924 *r0, Weather *weather); void sub_8083078(void *, u32); @@ -87,8 +87,8 @@ u8 sub_8083188(unkStruct_8094924 *r0); s16 sub_8083170(unkStruct_8094924 *r0); void sub_80831F8(unkStruct_8094924 *r0, Position *); void RestoreDungeonWeather(unkStruct_8094924 *r0, Weather *); -void sub_8083220(unkStruct_8094924 *r0, u32 *); -void sub_8083260(unkStruct_8094924 *r0, u32 *); +void sub_8083220(unkStruct_8094924 *r0, void *); +void sub_8083260(unkStruct_8094924 *r0, void *); void RestoreTile(unkStruct_8094924 *r0, Tile *); extern u16 sub_8083158(unkStruct_8094924 *param_1); void sub_80820A8(unkStruct_8094924 *r0, Item *); @@ -513,7 +513,7 @@ void sub_8081454(unkStruct_8094924 *param_1) { SavePosition(param_1,&gDungeon->unkE220[iVar4]); } - sub_80830F8(param_1,&gDungeon->unkE240); + sub_80830F8(param_1,&gDungeon->kecleonShopPos); sub_80830F8(param_1,&gDungeon->unkE250); sub_808312C(param_1,&gDungeon->unkE260); @@ -846,9 +846,9 @@ void sub_8081C7C(unkStruct_8094924 *r0) { sub_80831F8(r0,&gDungeon->unkE220[iVar7]); } - sub_8083220(r0,&gDungeon->unkE240); - sub_8083220(r0,&gDungeon->unkE240 + 0x4); - sub_8083260(r0,&gDungeon->unkE240 + 0x8); + sub_8083220(r0,&gDungeon->kecleonShopPos); + sub_8083220(r0,&gDungeon->unkE250); + sub_8083260(r0,&gDungeon->unkE260); for(y = 0; y < 8; y++)