diff options
-rw-r--r-- | asm/field_control_avatar.s | 12 | ||||
-rw-r--r-- | asm/field_specials.s | 19 | ||||
-rw-r--r-- | asm/itemfinder.s | 1347 | ||||
-rw-r--r-- | baserom.ips | bin | 2012420 -> 2011595 bytes | |||
-rw-r--r-- | data/itemfinder.s | 11 | ||||
-rw-r--r-- | data/itemfinder/spr_tiles.png | bin | 0 -> 279 bytes | |||
-rw-r--r-- | data/map_event_scripts.inc | 147 | ||||
-rw-r--r-- | data/maps/CeladonCity_GameCorner/scripts.inc | 10 | ||||
-rw-r--r-- | data/maps/CeladonCity_GameCorner_PrizeRoom/scripts.inc | 6 | ||||
-rw-r--r-- | data/maps/CeladonCity_Restaurant/scripts.inc | 4 | ||||
-rw-r--r-- | data/specials.inc | 4 | ||||
-rw-r--r-- | data/strings.s | 6 | ||||
-rw-r--r-- | include/constants/flags.h | 2 | ||||
-rw-r--r-- | include/event_scripts.h | 2 | ||||
-rw-r--r-- | include/field_specials.h | 9 | ||||
-rw-r--r-- | include/fieldmap.h | 2 | ||||
-rw-r--r-- | include/global.fieldmap.h | 36 | ||||
-rw-r--r-- | include/itemfinder.h | 2 | ||||
-rw-r--r-- | include/strings.h | 5 | ||||
-rw-r--r-- | ld_script.txt | 4 | ||||
-rw-r--r-- | src/fieldmap.c | 2 | ||||
-rw-r--r-- | src/item_use.c | 2 | ||||
-rw-r--r-- | src/itemfinder.c | 659 |
23 files changed, 861 insertions, 1430 deletions
diff --git a/asm/field_control_avatar.s b/asm/field_control_avatar.s index 2eee6da2f..c1825ba58 100644 --- a/asm/field_control_avatar.s +++ b/asm/field_control_avatar.s @@ -1152,24 +1152,24 @@ _0806D174: _0806D17A: ldr r0, [r5, 0x8] movs r1, 0x3 - bl sub_80CC44C + bl GetHiddenItemAttr lsls r0, 16 lsrs r0, 16 cmp r0, 0x1 beq _0806D164 ldr r0, [r5, 0x8] movs r1, 0 - bl sub_80CC44C + bl GetHiddenItemAttr ldr r1, _0806D1C4 @ =gSpecialVar_0x8005 strh r0, [r1] ldr r0, [r5, 0x8] movs r1, 0x1 - bl sub_80CC44C + bl GetHiddenItemAttr ldr r4, _0806D1C8 @ =gSpecialVar_0x8004 strh r0, [r4] ldr r0, [r5, 0x8] movs r1, 0x2 - bl sub_80CC44C + bl GetHiddenItemAttr ldr r1, _0806D1CC @ =gSpecialVar_0x8006 strh r0, [r1] ldrh r0, [r4] @@ -1180,14 +1180,14 @@ _0806D17A: beq _0806D164 ldr r0, _0806D1D0 @ =gSpecialVar_Facing strh r6, [r0] - ldr r0, _0806D1D4 @ =gUnknown_81A6843 + ldr r0, _0806D1D4 @ =EventScript_PickUpHiddenItem b _0806D1E6 .align 2, 0 _0806D1C4: .4byte gSpecialVar_0x8005 _0806D1C8: .4byte gSpecialVar_0x8004 _0806D1CC: .4byte gSpecialVar_0x8006 _0806D1D0: .4byte gSpecialVar_Facing -_0806D1D4: .4byte gUnknown_81A6843 +_0806D1D4: .4byte EventScript_PickUpHiddenItem _0806D1D8: cmp r2, 0xFF beq _0806D1E0 diff --git a/asm/field_specials.s b/asm/field_specials.s index 4c37e0638..8d91064e8 100644 --- a/asm/field_specials.s +++ b/asm/field_specials.s @@ -185,8 +185,8 @@ sub_80CA74C: @ 80CA74C _080CA754: .4byte gBattleOutcome thumb_func_end sub_80CA74C - thumb_func_start sub_80CA758 -sub_80CA758: @ 80CA758 + thumb_func_start Special_SetHiddenItemFlag +Special_SetHiddenItemFlag: @ 80CA758 push {lr} ldr r0, _080CA768 @ =gSpecialVar_0x8004 ldrh r0, [r0] @@ -195,7 +195,7 @@ sub_80CA758: @ 80CA758 bx r0 .align 2, 0 _080CA768: .4byte gSpecialVar_0x8004 - thumb_func_end sub_80CA758 + thumb_func_end Special_SetHiddenItemFlag thumb_func_start sub_80CA76C sub_80CA76C: @ 80CA76C @@ -1566,8 +1566,9 @@ _080CB1D2: bx r1 thumb_func_end sub_80CB198 - thumb_func_start sub_80CB1D8 -sub_80CB1D8: @ 80CB1D8 + thumb_func_start Special_CheckAddCoins +Special_CheckAddCoins: @ 80CB1D8 +@ addcoins but it's a dry run push {lr} ldr r0, _080CB1F0 @ =gSpecialVar_Result ldrh r1, [r0] @@ -1588,7 +1589,7 @@ _080CB1FC: _080CB1FE: pop {r1} bx r1 - thumb_func_end sub_80CB1D8 + thumb_func_end Special_CheckAddCoins thumb_func_start sub_80CB204 sub_80CB204: @ 80CB204 @@ -3942,8 +3943,8 @@ _080CC444: .4byte gSpecialVar_0x8004 _080CC448: .4byte gSpecialVar_0x8006 thumb_func_end sub_80CC3CC - thumb_func_start sub_80CC44C -sub_80CC44C: @ 80CC44C + thumb_func_start GetHiddenItemAttr +GetHiddenItemAttr: @ 80CC44C push {lr} lsls r1, 24 lsrs r1, 24 @@ -3980,7 +3981,7 @@ _080CC484: _080CC486: pop {r1} bx r1 - thumb_func_end sub_80CC44C + thumb_func_end GetHiddenItemAttr thumb_func_start sub_80CC48C sub_80CC48C: @ 80CC48C diff --git a/asm/itemfinder.s b/asm/itemfinder.s deleted file mode 100644 index 8a2dec9de..000000000 --- a/asm/itemfinder.s +++ /dev/null @@ -1,1347 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_813EC8C -sub_813EC8C: @ 813EC8C - push {r4-r7,lr} - lsls r0, 24 - lsrs r4, r0, 24 - movs r2, 0 - ldr r7, _0813ECE0 @ =gMapHeader - lsls r1, r4, 2 - adds r0, r1, r4 - lsls r3, r0, 3 - ldr r5, _0813ECE4 @ =gTasks+0x8 - adds r6, r1, 0 - movs r1, 0 -_0813ECA2: - lsls r0, r2, 1 - adds r0, r3 - adds r0, r5 - strh r1, [r0] - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0xF - bls _0813ECA2 - ldr r0, [r7, 0x4] - adds r1, r4, 0 - bl sub_813EE14 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _0813ECFC - bl sub_813F3EC - ldr r0, _0813ECE8 @ =gTasks - adds r1, r6, r4 - lsls r1, 3 - adds r1, r0 - movs r2, 0x14 - ldrsh r0, [r1, r2] - cmp r0, 0x1 - bne _0813ECF0 - ldr r0, _0813ECEC @ =sub_813EDB0 - str r0, [r1] - b _0813ED08 - .align 2, 0 -_0813ECE0: .4byte gMapHeader -_0813ECE4: .4byte gTasks+0x8 -_0813ECE8: .4byte gTasks -_0813ECEC: .4byte sub_813EDB0 -_0813ECF0: - ldr r0, _0813ECF8 @ =sub_813ED3C - str r0, [r1] - b _0813ED08 - .align 2, 0 -_0813ECF8: .4byte sub_813ED3C -_0813ECFC: - ldr r2, _0813ED10 @ =gUnknown_8416513 - ldr r3, _0813ED14 @ =sub_813ED18 - adds r0, r4, 0 - movs r1, 0x2 - bl DisplayItemMessageOnField -_0813ED08: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0813ED10: .4byte gUnknown_8416513 -_0813ED14: .4byte sub_813ED18 - thumb_func_end sub_813EC8C - - thumb_func_start sub_813ED18 -sub_813ED18: @ 813ED18 - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - movs r0, 0 - movs r1, 0x1 - bl ClearDialogWindowAndFrame - bl sub_80696C0 - bl ScriptContext2_Disable - adds r0, r4, 0 - bl DestroyTask - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_813ED18 - - thumb_func_start sub_813ED3C -sub_813ED3C: @ 813ED3C - push {r4-r7,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 2 - adds r1, r0 - lsls r6, r1, 3 - ldr r7, _0813ED80 @ =gTasks+0x8 - adds r4, r6, r7 - movs r1, 0x6 - ldrsh r0, [r4, r1] - movs r1, 0x19 - bl __modsi3 - lsls r0, 16 - cmp r0, 0 - bne _0813EDA2 - movs r2, 0 - ldrsh r0, [r4, r2] - movs r2, 0x2 - ldrsh r1, [r4, r2] - bl GetPlayerDirectionTowardsHiddenItem - lsls r0, 24 - lsrs r5, r0, 24 - movs r1, 0x8 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _0813ED88 - adds r0, r7, 0 - subs r0, 0x8 - adds r0, r6, r0 - ldr r1, _0813ED84 @ =sub_813F364 - str r1, [r0] - b _0813EDA8 - .align 2, 0 -_0813ED80: .4byte gTasks+0x8 -_0813ED84: .4byte sub_813F364 -_0813ED88: - movs r0, 0x41 - bl PlaySE - ldrb r0, [r4, 0xA] - adds r1, r5, 0 - bl sub_813F40C - ldrh r0, [r4, 0xA] - adds r0, 0x1 - strh r0, [r4, 0xA] - ldrh r0, [r4, 0x8] - subs r0, 0x1 - strh r0, [r4, 0x8] -_0813EDA2: - ldrh r0, [r4, 0x6] - adds r0, 0x1 - strh r0, [r4, 0x6] -_0813EDA8: - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_813ED3C - - thumb_func_start sub_813EDB0 -sub_813EDB0: @ 813EDB0 - push {r4-r6,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 2 - adds r1, r0 - lsls r5, r1, 3 - ldr r6, _0813EDE4 @ =gTasks+0x8 - adds r4, r5, r6 - movs r1, 0x6 - ldrsh r0, [r4, r1] - movs r1, 0x19 - bl __modsi3 - lsls r0, 16 - cmp r0, 0 - bne _0813EE08 - movs r1, 0x8 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _0813EDEC - adds r0, r6, 0 - subs r0, 0x8 - adds r0, r5, r0 - ldr r1, _0813EDE8 @ =sub_813F3A8 - str r1, [r0] - b _0813EE0E - .align 2, 0 -_0813EDE4: .4byte gTasks+0x8 -_0813EDE8: .4byte sub_813F3A8 -_0813EDEC: - movs r0, 0x41 - bl PlaySE - bl sub_813F5AC - lsls r0, 24 - lsrs r0, 24 - strh r0, [r4, 0xE] - ldrh r0, [r4, 0xA] - adds r0, 0x1 - strh r0, [r4, 0xA] - ldrh r0, [r4, 0x8] - subs r0, 0x1 - strh r0, [r4, 0x8] -_0813EE08: - ldrh r0, [r4, 0x6] - adds r0, 0x1 - strh r0, [r4, 0x6] -_0813EE0E: - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end sub_813EDB0 - - thumb_func_start sub_813EE14 -sub_813EE14: @ 813EE14 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - mov r8, r0 - lsls r1, 24 - lsrs r1, 24 - mov r9, r1 - mov r4, sp - adds r4, 0x2 - mov r0, sp - adds r1, r4, 0 - bl PlayerGetDestCoords - ldr r1, _0813EEC8 @ =gTasks - mov r2, r9 - lsls r0, r2, 2 - add r0, r9 - lsls r0, 3 - adds r0, r1 - movs r1, 0 - strh r1, [r0, 0xC] - movs r3, 0 - mov r0, r8 - ldrb r0, [r0, 0x3] - cmp r3, r0 - bge _0813EF04 -_0813EE4E: - lsls r3, 16 - asrs r1, r3, 16 - mov r0, r8 - ldr r2, [r0, 0x10] - lsls r0, r1, 1 - adds r0, r1 - lsls r7, r0, 2 - adds r1, r7, r2 - ldrb r0, [r1, 0x5] - mov r10, r3 - cmp r0, 0x7 - bne _0813EEF2 - ldr r0, [r1, 0x8] - movs r1, 0x1 - bl sub_80CC44C - lsls r0, 16 - lsrs r0, 16 - bl FlagGet - lsls r0, 24 - cmp r0, 0 - bne _0813EEF2 - mov r1, r8 - ldr r2, [r1, 0x10] - adds r2, r7, r2 - ldrh r0, [r2] - adds r0, 0x7 - mov r1, sp - ldrh r1, [r1] - subs r0, r1 - lsls r0, 16 - lsrs r5, r0, 16 - ldrh r0, [r2, 0x2] - adds r0, 0x7 - mov r3, sp - ldrh r1, [r3, 0x2] - subs r0, r1 - lsls r0, 16 - lsrs r4, r0, 16 - adds r6, r4, 0 - ldr r0, [r2, 0x8] - movs r1, 0x3 - bl sub_80CC44C - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - bne _0813EECC - cmp r5, 0 - bne _0813EEF2 - cmp r4, 0 - bne _0813EEF2 - mov r1, r8 - ldr r0, [r1, 0x10] - adds r0, r7, r0 - ldr r1, [r0, 0x8] - mov r0, r9 - bl sub_813EF40 - b _0813EF2E - .align 2, 0 -_0813EEC8: .4byte gTasks -_0813EECC: - lsls r0, r5, 16 - asrs r1, r0, 16 - movs r2, 0xE0 - lsls r2, 11 - adds r0, r2 - lsrs r0, 16 - cmp r0, 0xE - bhi _0813EEF2 - lsls r0, r6, 16 - asrs r2, r0, 16 - movs r3, 0x5 - negs r3, r3 - cmp r2, r3 - blt _0813EEF2 - cmp r2, 0x5 - bgt _0813EEF2 - mov r0, r9 - bl sub_813F220 -_0813EEF2: - movs r0, 0x80 - lsls r0, 9 - add r0, r10 - lsrs r3, r0, 16 - asrs r0, 16 - mov r1, r8 - ldrb r1, [r1, 0x3] - cmp r0, r1 - blt _0813EE4E -_0813EF04: - mov r0, r9 - bl sub_813F108 - ldr r0, _0813EF24 @ =gTasks - mov r2, r9 - lsls r1, r2, 2 - add r1, r9 - lsls r1, 3 - adds r1, r0 - movs r3, 0xC - ldrsh r0, [r1, r3] - cmp r0, 0x1 - beq _0813EF28 - movs r0, 0 - b _0813EF30 - .align 2, 0 -_0813EF24: .4byte gTasks -_0813EF28: - mov r0, r9 - bl sub_813EF9C -_0813EF2E: - movs r0, 0x1 -_0813EF30: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_813EE14 - - thumb_func_start sub_813EF40 -sub_813EF40: @ 813EF40 - push {r4,r5,lr} - adds r5, r1, 0 - lsls r0, 24 - lsrs r0, 24 - lsls r4, r0, 2 - adds r4, r0 - lsls r4, 3 - ldr r0, _0813EF8C @ =gTasks+0x8 - adds r4, r0 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_80CC44C - ldr r1, _0813EF90 @ =gSpecialVar_0x8004 - strh r0, [r1] - adds r0, r5, 0 - movs r1, 0 - bl sub_80CC44C - ldr r1, _0813EF94 @ =gSpecialVar_0x8005 - strh r0, [r1] - ldr r0, _0813EF98 @ =gSpecialVar_0x8006 - movs r5, 0x1 - strh r5, [r0] - ldrh r1, [r1] - movs r0, 0 - bl TV_PrintIntToStringVar - strh r5, [r4, 0x4] - movs r0, 0 - strh r0, [r4] - strh r0, [r4, 0x2] - movs r0, 0x3 - strh r0, [r4, 0x8] - strh r5, [r4, 0xC] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0813EF8C: .4byte gTasks+0x8 -_0813EF90: .4byte gSpecialVar_0x8004 -_0813EF94: .4byte gSpecialVar_0x8005 -_0813EF98: .4byte gSpecialVar_0x8006 - thumb_func_end sub_813EF40 - - thumb_func_start sub_813EF9C -sub_813EF9C: @ 813EF9C - push {r4,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - ldr r0, _0813EFEC @ =gTasks+0x8 - adds r1, r0 - ldrh r3, [r1, 0x2] - ldrh r2, [r1] - movs r4, 0 - ldrsh r0, [r1, r4] - cmp r0, 0 - bne _0813EFBC - cmp r3, 0 - beq _0813EFF8 -_0813EFBC: - movs r4, 0 - ldrsh r0, [r1, r4] - cmp r0, 0 - bge _0813EFCA - negs r0, r0 - lsls r0, 16 - lsrs r2, r0, 16 -_0813EFCA: - movs r4, 0x2 - ldrsh r0, [r1, r4] - cmp r0, 0 - bge _0813EFD8 - negs r0, r0 - lsls r0, 16 - lsrs r3, r0, 16 -_0813EFD8: - lsls r0, r2, 16 - asrs r2, r0, 16 - lsls r0, r3, 16 - asrs r0, 16 - cmp r2, r0 - ble _0813EFF0 - cmp r2, 0x3 - ble _0813EFF8 - movs r0, 0x2 - b _0813EFFA - .align 2, 0 -_0813EFEC: .4byte gTasks+0x8 -_0813EFF0: - cmp r0, 0x3 - ble _0813EFF8 - movs r0, 0x2 - b _0813EFFA -_0813EFF8: - movs r0, 0x4 -_0813EFFA: - strh r0, [r1, 0x8] - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_813EF9C - - thumb_func_start sub_813F004 -sub_813F004: @ 813F004 - push {r4,r5,lr} - lsls r1, 16 - lsrs r1, 16 - lsls r2, 16 - lsrs r2, 16 - ldrb r5, [r0, 0x3] - ldr r4, [r0, 0x10] - movs r3, 0 - cmp r3, r5 - bge _0813F066 - lsls r0, r1, 16 - asrs r1, r0, 16 - lsls r0, r2, 16 - asrs r2, r0, 16 -_0813F020: - ldrb r0, [r4, 0x5] - cmp r0, 0x7 - bne _0813F05E - ldrh r0, [r4] - cmp r1, r0 - bne _0813F05E - ldrh r0, [r4, 0x2] - cmp r2, r0 - bne _0813F05E - ldr r0, [r4, 0x8] - movs r1, 0x1 - bl sub_80CC44C - lsls r0, 16 - lsrs r5, r0, 16 - ldr r0, [r4, 0x8] - movs r1, 0x3 - bl sub_80CC44C - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - beq _0813F066 - adds r0, r5, 0 - bl FlagGet - lsls r0, 24 - cmp r0, 0 - bne _0813F066 - movs r0, 0x1 - b _0813F068 -_0813F05E: - adds r4, 0xC - adds r3, 0x1 - cmp r3, r5 - blt _0813F020 -_0813F066: - movs r0, 0 -_0813F068: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_813F004 - - thumb_func_start sub_813F070 -sub_813F070: @ 813F070 - push {r4-r6,lr} - adds r4, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - bl mapconnection_get_mapheader - adds r3, r0, 0 - ldrb r0, [r4] - cmp r0, 0x2 - beq _0813F098 - cmp r0, 0x2 - bgt _0813F08E - cmp r0, 0x1 - beq _0813F0AC - b _0813F0EC -_0813F08E: - cmp r0, 0x3 - beq _0813F0C4 - cmp r0, 0x4 - beq _0813F0CE - b _0813F0EC -_0813F098: - ldr r0, [r4, 0x4] - adds r0, 0x7 - subs r0, r5, r0 - lsls r0, 16 - lsrs r1, r0, 16 - ldr r0, [r3] - ldr r0, [r0, 0x4] - subs r0, 0x7 - adds r0, r6 - b _0813F0E2 -_0813F0AC: - ldr r0, [r4, 0x4] - adds r0, 0x7 - subs r0, r5, r0 - lsls r0, 16 - lsrs r1, r0, 16 - ldr r0, _0813F0C0 @ =gMapHeader - ldr r0, [r0] - ldr r0, [r0, 0x4] - b _0813F0DE - .align 2, 0 -_0813F0C0: .4byte gMapHeader -_0813F0C4: - ldr r0, [r3] - ldr r0, [r0] - subs r0, 0x7 - adds r0, r5 - b _0813F0D8 -_0813F0CE: - ldr r0, _0813F0E8 @ =gMapHeader - ldr r0, [r0] - ldr r0, [r0] - adds r0, 0x7 - subs r0, r5, r0 -_0813F0D8: - lsls r0, 16 - lsrs r1, r0, 16 - ldr r0, [r4, 0x4] -_0813F0DE: - adds r0, 0x7 - subs r0, r6, r0 -_0813F0E2: - lsls r0, 16 - lsrs r2, r0, 16 - b _0813F0F0 - .align 2, 0 -_0813F0E8: .4byte gMapHeader -_0813F0EC: - movs r0, 0 - b _0813F102 -_0813F0F0: - ldr r0, [r3, 0x4] - lsls r1, 16 - asrs r1, 16 - lsls r2, 16 - asrs r2, 16 - bl sub_813F004 - lsls r0, 24 - lsrs r0, 24 -_0813F102: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_813F070 - - thumb_func_start sub_813F108 -sub_813F108: @ 813F108 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x14 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x4] - ldr r0, _0813F21C @ =gMapHeader - ldr r1, [r0] - ldr r0, [r1] - adds r0, 0x7 - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x8] - ldr r0, [r1, 0x4] - adds r0, 0x7 - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0xC] - mov r4, sp - adds r4, 0x2 - mov r0, sp - adds r1, r4, 0 - bl PlayerGetDestCoords - mov r0, sp - ldrh r0, [r0] - subs r0, 0x7 - lsls r0, 16 - lsrs r3, r0, 16 - asrs r0, 16 - mov r1, sp - movs r2, 0 - ldrsh r1, [r1, r2] - adds r1, 0x7 - cmp r0, r1 - bgt _0813F20C -_0813F156: - mov r5, sp - ldrh r0, [r5, 0x2] - subs r0, 0x5 - lsls r0, 16 - lsrs r4, r0, 16 - lsls r2, r4, 16 - asrs r1, r2, 16 - movs r6, 0x2 - ldrsh r0, [r5, r6] - adds r0, 0x5 - lsls r3, 16 - mov r8, r3 - cmp r1, r0 - bgt _0813F1F6 - movs r0, 0x7 - str r0, [sp, 0x10] - mov r1, r8 - asrs r1, 16 - mov r9, r1 - mov r10, r0 -_0813F17E: - ldr r3, [sp, 0x10] - cmp r3, r9 - bgt _0813F1A0 - ldr r5, [sp, 0x8] - lsls r0, r5, 16 - asrs r0, 16 - cmp r9, r0 - bge _0813F1A0 - asrs r1, r2, 16 - cmp r10, r1 - bgt _0813F1A0 - ldr r6, [sp, 0xC] - lsls r0, r6, 16 - asrs r0, 16 - lsls r7, r4, 16 - cmp r1, r0 - blt _0813F1DE -_0813F1A0: - mov r0, r8 - asrs r5, r0, 16 - lsls r4, 16 - asrs r6, r4, 16 - adds r0, r5, 0 - adds r1, r6, 0 - bl sub_805973C - adds r7, r4, 0 - cmp r0, 0 - beq _0813F1DE - adds r1, r5, 0 - adds r2, r6, 0 - bl sub_813F070 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _0813F1DE - mov r0, sp - ldrh r1, [r0] - subs r1, r5, r1 - lsls r1, 16 - asrs r1, 16 - ldrh r2, [r0, 0x2] - subs r2, r6, r2 - lsls r2, 16 - asrs r2, 16 - ldr r0, [sp, 0x4] - bl sub_813F220 -_0813F1DE: - movs r1, 0x80 - lsls r1, 9 - adds r0, r7, r1 - lsrs r4, r0, 16 - lsls r2, r4, 16 - asrs r1, r2, 16 - mov r3, sp - movs r5, 0x2 - ldrsh r0, [r3, r5] - adds r0, 0x5 - cmp r1, r0 - ble _0813F17E -_0813F1F6: - movs r1, 0x80 - lsls r1, 9 - add r1, r8 - lsrs r3, r1, 16 - asrs r1, 16 - mov r0, sp - movs r6, 0 - ldrsh r0, [r0, r6] - adds r0, 0x7 - cmp r1, r0 - ble _0813F156 -_0813F20C: - add sp, 0x14 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0813F21C: .4byte gMapHeader - thumb_func_end sub_813F108 - - thumb_func_start sub_813F220 -sub_813F220: @ 813F220 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 16 - lsrs r7, r1, 16 - lsls r2, 16 - lsrs r2, 16 - mov r12, r2 - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - ldr r0, _0813F254 @ =gTasks+0x8 - adds r3, r1, r0 - movs r1, 0x4 - ldrsh r0, [r3, r1] - cmp r0, 0 - bne _0813F258 - strh r7, [r3] - mov r0, r12 - strh r0, [r3, 0x2] - movs r0, 0x1 - strh r0, [r3, 0x4] - b _0813F2E2 - .align 2, 0 -_0813F254: .4byte gTasks+0x8 -_0813F258: - movs r1, 0 - ldrsh r0, [r3, r1] - cmp r0, 0 - bge _0813F268 - negs r0, r0 - lsls r0, 16 - lsrs r4, r0, 16 - b _0813F26A -_0813F268: - ldrh r4, [r3] -_0813F26A: - movs r1, 0x2 - ldrsh r0, [r3, r1] - ldrh r1, [r3, 0x2] - mov r9, r1 - cmp r0, 0 - bge _0813F27E - negs r0, r0 - lsls r0, 16 - lsrs r2, r0, 16 - b _0813F280 -_0813F27E: - ldrh r2, [r3, 0x2] -_0813F280: - lsls r1, r7, 16 - asrs r0, r1, 16 - cmp r0, 0 - bge _0813F290 - negs r0, r0 - lsls r0, 16 - lsrs r6, r0, 16 - b _0813F292 -_0813F290: - lsrs r6, r1, 16 -_0813F292: - mov r1, r12 - lsls r0, r1, 16 - asrs r1, r0, 16 - mov r8, r0 - cmp r1, 0 - bge _0813F2A4 - negs r0, r1 - lsls r0, 16 - b _0813F2A6 -_0813F2A4: - mov r0, r8 -_0813F2A6: - lsrs r5, r0, 16 - lsls r0, r4, 16 - asrs r0, 16 - lsls r1, r2, 16 - asrs r2, r1, 16 - adds r4, r0, r2 - lsls r0, r6, 16 - asrs r0, 16 - lsls r1, r5, 16 - asrs r1, 16 - adds r0, r1 - cmp r4, r0 - ble _0813F2C8 - strh r7, [r3] - mov r1, r12 - strh r1, [r3, 0x2] - b _0813F2E2 -_0813F2C8: - cmp r4, r0 - bne _0813F2E2 - cmp r2, r1 - bgt _0813F2DC - cmp r2, r1 - bne _0813F2E2 - mov r1, r9 - lsls r0, r1, 16 - cmp r0, r8 - bge _0813F2E2 -_0813F2DC: - strh r7, [r3] - mov r0, r12 - strh r0, [r3, 0x2] -_0813F2E2: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_813F220 - - thumb_func_start GetPlayerDirectionTowardsHiddenItem -GetPlayerDirectionTowardsHiddenItem: @ 813F2F0 - push {r4,r5,lr} - lsls r0, 16 - lsls r1, 16 - lsrs r1, 16 - lsrs r2, r0, 16 - cmp r0, 0 - bne _0813F302 - cmp r1, 0 - beq _0813F35C -_0813F302: - lsls r0, r2, 16 - asrs r2, r0, 16 - adds r5, r0, 0 - cmp r2, 0 - bge _0813F314 - negs r0, r2 - lsls r0, 16 - lsrs r4, r0, 16 - b _0813F316 -_0813F314: - lsrs r4, r5, 16 -_0813F316: - lsls r0, r1, 16 - asrs r2, r0, 16 - adds r1, r0, 0 - cmp r2, 0 - bge _0813F328 - negs r0, r2 - lsls r0, 16 - lsrs r3, r0, 16 - b _0813F32A -_0813F328: - lsrs r3, r1, 16 -_0813F32A: - lsls r0, r4, 16 - asrs r2, r0, 16 - lsls r0, r3, 16 - asrs r0, 16 - cmp r2, r0 - ble _0813F342 - cmp r5, 0 - bge _0813F33E - movs r0, 0x4 - b _0813F35E -_0813F33E: - movs r0, 0x2 - b _0813F35E -_0813F342: - cmp r2, r0 - bge _0813F34C - cmp r1, 0 - blt _0813F354 - b _0813F358 -_0813F34C: - cmp r2, r0 - bne _0813F35C - cmp r1, 0 - bge _0813F358 -_0813F354: - movs r0, 0x1 - b _0813F35E -_0813F358: - movs r0, 0x3 - b _0813F35E -_0813F35C: - movs r0, 0 -_0813F35E: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end GetPlayerDirectionTowardsHiddenItem - - thumb_func_start sub_813F364 -sub_813F364: @ 813F364 - push {lr} - lsls r0, 24 - lsrs r0, 24 - ldr r2, _0813F378 @ =gUnknown_8416476 - ldr r3, _0813F37C @ =sub_813F380 - movs r1, 0x2 - bl DisplayItemMessageOnField - pop {r0} - bx r0 - .align 2, 0 -_0813F378: .4byte gUnknown_8416476 -_0813F37C: .4byte sub_813F380 - thumb_func_end sub_813F364 - - thumb_func_start sub_813F380 -sub_813F380: @ 813F380 - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - bl sub_813F3FC - movs r0, 0 - movs r1, 0x1 - bl ClearDialogWindowAndFrame - bl sub_80696C0 - bl ScriptContext2_Disable - adds r0, r4, 0 - bl DestroyTask - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_813F380 - - thumb_func_start sub_813F3A8 -sub_813F3A8: @ 813F3A8 - push {lr} - lsls r0, 24 - lsrs r0, 24 - ldr r2, _0813F3BC @ =gUnknown_84164BE - ldr r3, _0813F3C0 @ =sub_813F3C4 - movs r1, 0x2 - bl DisplayItemMessageOnField - pop {r0} - bx r0 - .align 2, 0 -_0813F3BC: .4byte gUnknown_84164BE -_0813F3C0: .4byte sub_813F3C4 - thumb_func_end sub_813F3A8 - - thumb_func_start sub_813F3C4 -sub_813F3C4: @ 813F3C4 - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - bl sub_813F3FC - adds r0, r4, 0 - bl DestroyTask - ldr r0, _0813F3E8 @ =gUnknown_81A8D49 - bl ScriptContext1_SetupScript - bl ScriptContext2_Enable - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0813F3E8: .4byte gUnknown_81A8D49 - thumb_func_end sub_813F3C4 - - thumb_func_start sub_813F3EC -sub_813F3EC: @ 813F3EC - push {lr} - ldr r0, _0813F3F8 @ =gUnknown_84647FC - bl LoadSpriteSheet - pop {r0} - bx r0 - .align 2, 0 -_0813F3F8: .4byte gUnknown_84647FC - thumb_func_end sub_813F3EC - - thumb_func_start sub_813F3FC -sub_813F3FC: @ 813F3FC - push {lr} - movs r0, 0xFA - lsls r0, 3 - bl FreeSpriteTilesByTag - pop {r0} - bx r0 - thumb_func_end sub_813F3FC - - thumb_func_start sub_813F40C -sub_813F40C: @ 813F40C - push {r4-r7,lr} - adds r5, r0, 0 - lsls r5, 24 - lsrs r5, 24 - lsls r1, 24 - lsrs r7, r1, 24 - ldr r0, _0813F464 @ =gUnknown_84647E4 - movs r1, 0x78 - movs r2, 0x4C - movs r3, 0 - bl CreateSprite - lsls r0, 24 - lsrs r6, r0, 24 - ldr r0, _0813F468 @ =gSprites - lsls r4, r6, 4 - adds r4, r6 - lsls r4, 2 - adds r4, r0 - ldrb r1, [r4, 0x5] - movs r0, 0xF - ands r0, r1 - strb r0, [r4, 0x5] - adds r0, r4, 0 - adds r1, r5, 0 - bl StartSpriteAnim - movs r0, 0 - strh r5, [r4, 0x3C] - strh r0, [r4, 0x2E] - strh r0, [r4, 0x34] - strh r0, [r4, 0x36] - movs r0, 0x78 - strh r0, [r4, 0x38] - movs r0, 0x4C - strh r0, [r4, 0x3A] - cmp r7, 0x4 - bhi _0813F53E - lsls r0, r7, 2 - ldr r1, _0813F46C @ =_0813F470 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0813F464: .4byte gUnknown_84647E4 -_0813F468: .4byte gSprites -_0813F46C: .4byte _0813F470 - .align 2, 0 -_0813F470: - .4byte _0813F484 - .4byte _0813F4C8 - .4byte _0813F4EC - .4byte _0813F50C - .4byte _0813F52C -_0813F484: - bl GetPlayerFacingDirection - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x2 - beq _0813F4C8 - cmp r0, 0x2 - bgt _0813F49A - cmp r0, 0x1 - beq _0813F50C - b _0813F53E -_0813F49A: - cmp r0, 0x3 - beq _0813F4A4 - cmp r0, 0x4 - beq _0813F4EC - b _0813F53E -_0813F4A4: - ldr r1, _0813F4C0 @ =gSprites - lsls r0, r6, 4 - adds r0, r6 - lsls r0, 2 - adds r0, r1 - movs r2, 0 - ldr r1, _0813F4C4 @ =0x0000ff9c - strh r1, [r0, 0x30] - strh r2, [r0, 0x32] - movs r1, 0 - bl StartSpriteAffineAnim - b _0813F53E - .align 2, 0 -_0813F4C0: .4byte gSprites -_0813F4C4: .4byte 0x0000ff9c -_0813F4C8: - ldr r1, _0813F4E4 @ =gSprites - lsls r0, r6, 4 - adds r0, r6 - lsls r0, 2 - adds r0, r1 - movs r1, 0 - strh r1, [r0, 0x30] - ldr r1, _0813F4E8 @ =0x0000ff9c - strh r1, [r0, 0x32] - movs r1, 0x3 - bl StartSpriteAffineAnim - b _0813F53E - .align 2, 0 -_0813F4E4: .4byte gSprites -_0813F4E8: .4byte 0x0000ff9c -_0813F4EC: - ldr r1, _0813F508 @ =gSprites - lsls r0, r6, 4 - adds r0, r6 - lsls r0, 2 - adds r0, r1 - movs r2, 0 - movs r1, 0x64 - strh r1, [r0, 0x30] - strh r2, [r0, 0x32] - movs r1, 0x2 - bl StartSpriteAffineAnim - b _0813F53E - .align 2, 0 -_0813F508: .4byte gSprites -_0813F50C: - ldr r1, _0813F528 @ =gSprites - lsls r0, r6, 4 - adds r0, r6 - lsls r0, 2 - adds r0, r1 - movs r1, 0 - strh r1, [r0, 0x30] - movs r1, 0x64 - strh r1, [r0, 0x32] - movs r1, 0x1 - bl StartSpriteAffineAnim - b _0813F53E - .align 2, 0 -_0813F528: .4byte gSprites -_0813F52C: - ldr r1, _0813F544 @ =gSprites - lsls r0, r6, 4 - adds r0, r6 - lsls r0, 2 - adds r0, r1 - movs r2, 0 - ldr r1, _0813F548 @ =0x0000ff9c - strh r1, [r0, 0x30] - strh r2, [r0, 0x32] -_0813F53E: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0813F544: .4byte gSprites -_0813F548: .4byte 0x0000ff9c - thumb_func_end sub_813F40C - - thumb_func_start sub_813F54C -sub_813F54C: @ 813F54C - push {lr} - adds r2, r0, 0 - ldrh r0, [r2, 0x30] - ldrh r1, [r2, 0x34] - adds r0, r1 - strh r0, [r2, 0x34] - ldrh r1, [r2, 0x32] - ldrh r3, [r2, 0x36] - adds r1, r3 - strh r1, [r2, 0x36] - lsls r0, 16 - asrs r0, 24 - ldrh r3, [r2, 0x38] - adds r0, r3 - strh r0, [r2, 0x20] - lsls r1, 16 - asrs r1, 24 - ldrh r3, [r2, 0x3A] - adds r1, r3 - strh r1, [r2, 0x22] - subs r0, 0x69 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1B - bhi _0813F58A - lsls r0, r1, 16 - asrs r0, 16 - cmp r0, 0x3C - ble _0813F58A - cmp r0, 0x58 - ble _0813F58E -_0813F58A: - ldr r0, _0813F594 @ =sub_813F598 - str r0, [r2, 0x1C] -_0813F58E: - pop {r0} - bx r0 - .align 2, 0 -_0813F594: .4byte sub_813F598 - thumb_func_end sub_813F54C - - thumb_func_start sub_813F598 -sub_813F598: @ 813F598 - push {r4,lr} - adds r4, r0, 0 - bl FreeSpriteOamMatrix - adds r0, r4, 0 - bl DestroySprite - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_813F598 - - thumb_func_start sub_813F5AC -sub_813F5AC: @ 813F5AC - push {r4,r5,lr} - ldr r0, _0813F604 @ =gUnknown_84647E4 - movs r1, 0x78 - movs r2, 0x4C - movs r3, 0 - bl CreateSprite - adds r5, r0, 0 - lsls r5, 24 - lsrs r5, 24 - ldr r2, _0813F608 @ =gSprites - lsls r1, r5, 4 - adds r1, r5 - lsls r1, 2 - adds r4, r1, r2 - ldrb r3, [r4, 0x5] - movs r0, 0xF - ands r0, r3 - strb r0, [r4, 0x5] - adds r2, 0x1C - adds r1, r2 - ldr r0, _0813F60C @ =sub_813F614 - str r0, [r1] - adds r0, r4, 0 - movs r1, 0x4 - bl StartSpriteAnim - movs r1, 0 - strh r1, [r4, 0x3C] - strh r1, [r4, 0x2E] - strh r1, [r4, 0x34] - strh r1, [r4, 0x36] - movs r0, 0x78 - strh r0, [r4, 0x38] - movs r0, 0x4C - strh r0, [r4, 0x3A] - strh r1, [r4, 0x30] - ldr r0, _0813F610 @ =0x0000ff9c - strh r0, [r4, 0x32] - adds r0, r5, 0 - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_0813F604: .4byte gUnknown_84647E4 -_0813F608: .4byte gSprites -_0813F60C: .4byte sub_813F614 -_0813F610: .4byte 0x0000ff9c - thumb_func_end sub_813F5AC - - thumb_func_start sub_813F614 -sub_813F614: @ 813F614 - push {lr} - adds r2, r0, 0 - ldrh r0, [r2, 0x30] - ldrh r1, [r2, 0x34] - adds r0, r1 - strh r0, [r2, 0x34] - ldrh r1, [r2, 0x32] - ldrh r3, [r2, 0x36] - adds r1, r3 - strh r1, [r2, 0x36] - lsls r0, 16 - asrs r0, 24 - ldrh r3, [r2, 0x38] - adds r0, r3 - strh r0, [r2, 0x20] - lsls r1, 16 - asrs r1, 24 - ldrh r3, [r2, 0x3A] - adds r1, r3 - strh r1, [r2, 0x22] - subs r0, 0x69 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1B - bhi _0813F652 - lsls r0, r1, 16 - asrs r0, 16 - cmp r0, 0x3C - ble _0813F652 - cmp r0, 0x58 - ble _0813F656 -_0813F652: - ldr r0, _0813F65C @ =sub_813F660 - str r0, [r2, 0x1C] -_0813F656: - pop {r0} - bx r0 - .align 2, 0 -_0813F65C: .4byte sub_813F660 - thumb_func_end sub_813F614 - - thumb_func_start sub_813F660 -sub_813F660: @ 813F660 - push {lr} - bl DestroySprite - pop {r0} - bx r0 - thumb_func_end sub_813F660 - - .align 2, 0 @ Don't pad with nop. diff --git a/baserom.ips b/baserom.ips Binary files differindex e4c815c03..03cb2d9ad 100644 --- a/baserom.ips +++ b/baserom.ips diff --git a/data/itemfinder.s b/data/itemfinder.s deleted file mode 100644 index 88e9910f4..000000000 --- a/data/itemfinder.s +++ /dev/null @@ -1,11 +0,0 @@ - .section .rodata - .align 2 - -gUnknown_84644D0:: @ 84644D0 - .incbin "baserom.gba", 0x4644D0, 0x314 - -gUnknown_84647E4:: @ 84647E4 - .incbin "baserom.gba", 0x4647E4, 0x18 - -gUnknown_84647FC:: @ 84647FC - .incbin "baserom.gba", 0x4647FC, 0x8 diff --git a/data/itemfinder/spr_tiles.png b/data/itemfinder/spr_tiles.png Binary files differnew file mode 100644 index 000000000..4171f37b4 --- /dev/null +++ b/data/itemfinder/spr_tiles.png diff --git a/data/map_event_scripts.inc b/data/map_event_scripts.inc index 899ed20e6..233b73349 100644 --- a/data/map_event_scripts.inc +++ b/data/map_event_scripts.inc @@ -1576,27 +1576,23 @@ EventScript_1A661D:: @ 81A661D waitmessage applymovement VAR_LAST_TALKED, Movement_1A666C waitmovement 0 - loadword 0, Text_1A5511 - callstd 4 + msgbox Text_1A5511 return EventScript_1A6636:: @ 81A6636 checkflag 2114 goto_if_eq EventScript_1A661D - loadword 0, Text_1A552B - callstd 4 + msgbox Text_1A552B setflag 2114 message Text_1BCCCA waitmessage applymovement VAR_LAST_TALKED, Movement_1A666C waitmovement 0 - loadword 0, Text_1A5511 - callstd 4 + msgbox Text_1A5511 return EventScript_1A6663:: @ 81A6663 - loadword 0, Text_1A5511 - callstd 4 + msgbox Text_1A5511 return Movement_1A666C:: @ 81A666C @@ -1681,8 +1677,7 @@ EventScript_1A6749:: @ 81A6749 message Text_1A51F6 waitfanfare waitmessage - loadword 0, gUnknown_81A5218 - callstd 4 + msgbox gUnknown_81A5218 setvar VAR_RESULT, 1 return @@ -1717,8 +1712,7 @@ EventScript_1A6795:: @ 81A6795 message Text_1A52F0 waitfanfare waitmessage - loadword 0, gUnknown_81A532F - callstd 4 + msgbox gUnknown_81A532F setvar VAR_RESULT, 1 return @@ -1755,8 +1749,7 @@ EventScript_1A67EE:: @ 81A67EE call_if 1, EventScript_1A6827 waitfanfare waitmessage - loadword 0, gUnknown_81A5218 - callstd 4 + msgbox gUnknown_81A5218 return EventScript_1A6821:: @ 81A6821 @@ -1768,15 +1761,100 @@ EventScript_1A6827:: @ 81A6827 return EventScript_1A682D:: @ 81A682D - loadword 0, Text_1A51F6 - callstd 4 - loadword 0, gUnknown_81A5242 - callstd 4 + msgbox Text_1A51F6 + msgbox gUnknown_81A5242 setvar VAR_RESULT, 0 return -gUnknown_81A6843:: @ 81A6843 - .incbin "baserom.gba", 0x1A6843, 0x112 +EventScript_PickUpHiddenItem:: @ 81A6843 + lockall + textcolor 3 + waitse + compare_var_to_value VAR_0x8005, 0 + goto_if_eq EventScript_PickUpHiddenCoins + call EventScript_GiveItem + compare_var_to_value VAR_0x8007, 1 + goto_if_eq EventScript_ItemInPocketMessage + compare_var_to_value VAR_0x8007, 0 + goto_if_eq EventScript_BagIsFullMessage + end + +EventScript_GiveItem:: + additem VAR_0x8005, VAR_0x8006 + copyvar VAR_0x8007, VAR_RESULT + getitemname 1, VAR_0x8005 + checkitemtype VAR_0x8005 + call EventScript_1A66BC + return + +EventScript_ItemInPocketMessage:: + compare_var_to_value VAR_0x8006, 1 + call_if 1, EventScript_FoundSingleItemMessage + compare_var_to_value VAR_0x8006, 1 + call_if 5, EventScript_FoundMultipleItemsMessage + waitfanfare + waitmessage + msgbox gUnknown_81A5218 + special Special_SetHiddenItemFlag + releaseall + end + +EventScript_FoundSingleItemMessage:: + message Text_1A5231 + return + +EventScript_FoundCoinsMessage:: + getnumberstring 0, VAR_0x8006 + message Text_1A525C + return + +EventScript_FoundMultipleItemsMessage:: + getnumberstring 0, VAR_0x8006 + message Text_1A52DD + return + +EventScript_BagIsFullMessage:: + msgbox Text_1A5231 + msgbox gUnknown_81A5242 + setvar VAR_RESULT, 0 + releaseall + end + +EventScript_PickUpHiddenCoins:: + checkflag FLAG_GOT_COIN_CASE + goto_if 0, EventScript_HiddenCoinsButNoCoinCase + checkcoins VAR_RESULT + specialvar VAR_RESULT, Special_CheckAddCoins + compare_var_to_value VAR_RESULT, 0 + goto_if_eq EventScript_HiddenCoinsButTheCoinCaseIsFull + givecoins VAR_0x8006 + getstdstring 1, 0x17 + call EventScript_1A6764 + call EventScript_FoundCoinsMessage + waitfanfare + waitmessage + msgbox Text_1A526C + special Special_SetHiddenItemFlag + releaseall + end + +EventScript_HiddenCoinsButTheCoinCaseIsFull:: + getnumberstring 0, VAR_0x8006 + getstdstring 1, 0x17 + msgbox Text_1A525C + msgbox Text_1A5294 + setvar VAR_RESULT, 0 + releaseall + end + +EventScript_HiddenCoinsButNoCoinCase:: + getnumberstring 0, VAR_0x8006 + getstdstring 1, 0x17 + msgbox Text_1A525C + msgbox Text_1A52B4 + setvar VAR_RESULT, 0 + releaseall + end gUnknown_81A6955:: @ 81A6955 .incbin "baserom.gba", 0x1A6955, 0x173 @@ -2275,8 +2353,33 @@ ViridianCity_PokemonCenter_2F_EventScript_1A8D02:: @ 81A8D02 VermilionCity_PokemonCenter_1F_EventScript_1A8D08:: @ 81A8D08 .incbin "baserom.gba", 0x1A8D08, 0x41 -gUnknown_81A8D49:: @ 81A8D49 - .incbin "baserom.gba", 0x1A8D49, 0x4E +EventScript_ItemfinderDigUpUnderfootItem:: @ 81A8D49 + lockall + textcolor 3 + waitse + call EventScript_GiveItem + compare_var_to_value VAR_0x8007, 1 + goto_if_eq EventScript_DigUpItemPutInPocket + compare_var_to_value VAR_0x8007, 0 + goto_if_eq EventScript_DigUpItemBagIsFull + end + +EventScript_DigUpItemPutInPocket:: + message Text_1A5700 + waitfanfare + waitmessage + delay 60 + msgbox gUnknown_81A5218 + special Special_SetHiddenItemFlag + releaseall + end + +EventScript_DigUpItemBagIsFull:: + msgbox Text_1A5700 + msgbox gUnknown_81A5242 + setvar VAR_RESULT, 0 + releaseall + end gUnknown_81A8D97:: @ 81A8D97 .incbin "baserom.gba", 0x1A8D97, 0x41 diff --git a/data/maps/CeladonCity_GameCorner/scripts.inc b/data/maps/CeladonCity_GameCorner/scripts.inc index dca647299..9115b2812 100644 --- a/data/maps/CeladonCity_GameCorner/scripts.inc +++ b/data/maps/CeladonCity_GameCorner/scripts.inc @@ -39,7 +39,7 @@ CeladonCity_GameCorner_EventScript_16C68D:: @ 816C68D end EventScript_16C6E6:: @ 816C6E6 - checkflag FLAG_0x243 + checkflag FLAG_GOT_COIN_CASE goto_if 0, EventScript_16C790 compare_var_to_value VAR_0x8009, 0 goto_if_eq EventScript_16C734 @@ -134,7 +134,7 @@ CeladonCity_GameCorner_EventScript_16C7E7:: @ 816C7E7 checkflag FLAG_0x26E goto_if_eq EventScript_16C849 msgbox gUnknown_8196AF3 - checkflag FLAG_0x243 + checkflag FLAG_GOT_COIN_CASE goto_if 0, EventScript_16C839 checkcoins VAR_0x4001 compare_var_to_value VAR_0x4001, 9990 @@ -198,7 +198,7 @@ CeladonCity_GameCorner_EventScript_16C89E:: @ 816C89E checkflag FLAG_0x26F goto_if_eq EventScript_16C8F0 msgbox gUnknown_8196D2B - checkflag FLAG_0x243 + checkflag FLAG_GOT_COIN_CASE goto_if 0, EventScript_16C839 checkcoins VAR_0x4001 compare_var_to_value VAR_0x4001, 9980 @@ -228,7 +228,7 @@ CeladonCity_GameCorner_EventScript_16C8FE:: @ 816C8FE checkflag FLAG_0x270 goto_if_eq EventScript_16C950 msgbox gUnknown_8196DB7 - checkflag FLAG_0x243 + checkflag FLAG_GOT_COIN_CASE goto_if 0, EventScript_16C839 checkcoins VAR_0x4001 compare_var_to_value VAR_0x4001, 9980 @@ -263,7 +263,7 @@ EventScript_16C96A:: @ 816C96A end EventScript_16C96C:: @ 816C96C - checkflag FLAG_0x243 + checkflag FLAG_GOT_COIN_CASE goto_if 0, EventScript_16CAA0 msgbox gUnknown_8196F46, MSGBOX_YESNO compare_var_to_value VAR_RESULT, 0 diff --git a/data/maps/CeladonCity_GameCorner_PrizeRoom/scripts.inc b/data/maps/CeladonCity_GameCorner_PrizeRoom/scripts.inc index 911847541..4a60c9814 100644 --- a/data/maps/CeladonCity_GameCorner_PrizeRoom/scripts.inc +++ b/data/maps/CeladonCity_GameCorner_PrizeRoom/scripts.inc @@ -12,7 +12,7 @@ CeladonCity_GameCorner_PrizeRoom_EventScript_16CB7F:: @ 816CB7F CeladonCity_GameCorner_PrizeRoom_EventScript_16CB88:: @ 816CB88 lock faceplayer - checkflag FLAG_0x243 + checkflag FLAG_GOT_COIN_CASE goto_if 0, EventScript_16CD99 special sub_8110AB4 compare_var_to_value VAR_RESULT, 2 @@ -191,7 +191,7 @@ EventScript_16CE12:: @ 816CE12 CeladonCity_GameCorner_PrizeRoom_EventScript_16CE1D:: @ 816CE1D lock faceplayer - checkflag FLAG_0x243 + checkflag FLAG_GOT_COIN_CASE goto_if 0, EventScript_16CD99 special sub_8110AB4 compare_var_to_value VAR_RESULT, 2 @@ -289,7 +289,7 @@ EventScript_16CF79:: @ 816CF79 CeladonCity_GameCorner_PrizeRoom_EventScript_16CF88:: @ 816CF88 lock faceplayer - checkflag FLAG_0x243 + checkflag FLAG_GOT_COIN_CASE goto_if 0, EventScript_16CD99 special sub_8110AB4 compare_var_to_value VAR_RESULT, 2 diff --git a/data/maps/CeladonCity_Restaurant/scripts.inc b/data/maps/CeladonCity_Restaurant/scripts.inc index e52d88636..379d07271 100644 --- a/data/maps/CeladonCity_Restaurant/scripts.inc +++ b/data/maps/CeladonCity_Restaurant/scripts.inc @@ -12,7 +12,7 @@ CeladonCity_Restaurant_EventScript_16D1F4:: @ 816D1F4 CeladonCity_Restaurant_EventScript_16D1FD:: @ 816D1FD lock faceplayer - checkflag FLAG_0x243 + checkflag FLAG_GOT_COIN_CASE goto_if_eq EventScript_16D24B msgbox gUnknown_81979C1 checkitemspace ITEM_COIN_CASE, 1 @@ -20,7 +20,7 @@ CeladonCity_Restaurant_EventScript_16D1FD:: @ 816D1FD goto_if_eq EventScript_16D241 additem ITEM_COIN_CASE, 1 giveitemfanfaremsg gUnknown_8197A38, ITEM_COIN_CASE - setflag FLAG_0x243 + setflag FLAG_GOT_COIN_CASE release end diff --git a/data/specials.inc b/data/specials.inc index 5905d825f..c99d484d4 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -159,7 +159,7 @@ gSpecials:: @ 815FD60 def_special sub_80CA6BC def_special sub_80CA6DC def_special sub_80CA714 - def_special sub_80CA758 + def_special Special_SetHiddenItemFlag def_special nullsub_75 def_special nullsub_75 def_special Overworld_PlaySpecialMapMusic @@ -359,7 +359,7 @@ gSpecials:: @ 815FD60 def_special sub_80CADEC def_special sub_805D1A8 def_special sub_80CB0A8 - def_special sub_80CB1D8 + def_special Special_CheckAddCoins def_special GetDaycarePokemonCount def_special sub_80CB63C def_special sub_80CBD80 diff --git a/data/strings.s b/data/strings.s index 05bd47c88..98b137425 100644 --- a/data/strings.s +++ b/data/strings.s @@ -582,13 +582,13 @@ gUnknown_8416425:: @ 8416425 gUnknown_8416451:: @ 8416451 .string "You can't dismount your BIKE here.{PAUSE_UNTIL_PRESS}$" -gUnknown_8416476:: @ 8416476 +gText_ItemfinderResponding:: @ 8416476 .string "Huh?\nThe ITEMFINDER's responding!\pThere's an item buried around here!{PAUSE_UNTIL_PRESS}$" -gUnknown_84164BE:: @ 84164BE +gText_ItemfinderShakingWildly:: @ 84164BE .string "Oh!\nThe ITEMFINDER's shaking wildly!\pThere's an item buried underfoot!\p‥ ‥ ‥ ‥ ‥ ‥{PAUSE_UNTIL_PRESS}$" -gUnknown_8416513:: @ 8416513 +gText_NopeTheresNoResponse:: @ 8416513 .string "‥ ‥ ‥ ‥Nope!\nThere's no response.{PAUSE_UNTIL_PRESS}$" gUnknown_8416537:: @ 8416537 diff --git a/include/constants/flags.h b/include/constants/flags.h index de9a98b43..7f4655d4e 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -668,7 +668,7 @@ #define FLAG_0x240 0x240 #define FLAG_0x241 0x241 #define FLAG_0x242 0x242 -#define FLAG_0x243 0x243 +#define FLAG_GOT_COIN_CASE 0x243 #define FLAG_0x244 0x244 #define FLAG_0x245 0x245 #define FLAG_0x246 0x246 diff --git a/include/event_scripts.h b/include/event_scripts.h index 91612c06b..310335196 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -1153,4 +1153,6 @@ extern const u8 EventScript_SafariRetire[]; extern const u8 EventScript_SafariWarpOut[]; extern const u8 EventScript_SafariOutOfBalls[]; +extern const u8 EventScript_ItemfinderDigUpUnderfootItem[]; + #endif //GUARD_EVENT_SCRIPTS_H diff --git a/include/field_specials.h b/include/field_specials.h index 9a85a8b49..b48dd34a5 100644 --- a/include/field_specials.h +++ b/include/field_specials.h @@ -3,6 +3,14 @@ #include "global.h" +enum HiddenItemAttr +{ + HIDDEN_ITEM_ID = 0, + HIDDEN_ITEM_FLAG, + HIDDEN_ITEM_QUANTITY, + HIDDEN_ITEM_UNDERFOOT +}; + u8 GetLeadMonIndex(void); u8 CountDigits(u16 number); void TV_PrintIntToStringVar(u8, int); @@ -14,5 +22,6 @@ u8 ContextNpcGetTextColor(void); void set_unknown_box_id(u8); u16 get_unknown_box_id(void); bool8 sub_80CC7B4(void); +u16 GetHiddenItemAttr(struct HiddenItemStruct hiddenItem, u8 attr); #endif // GUARD_FIELD_SPECIALS_H diff --git a/include/fieldmap.h b/include/fieldmap.h index 9903962a1..7bedb1d94 100644 --- a/include/fieldmap.h +++ b/include/fieldmap.h @@ -23,5 +23,7 @@ bool8 MapGridIsImpassableAt(s32, s32); s32 GetMapBorderIdAt(s32, s32); bool32 CanCameraMoveInDirection(s32); u32 GetBehaviorByMetatileIdAndMapData(struct MapData *mapData, u16 metatile, u8 attr); +const struct MapHeader * mapconnection_get_mapheader(struct MapConnection * connection); +struct MapConnection * GetMapConnectionAtPos(s16 x, s16 y); #endif //GUARD_FIELDMAP_H diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 3623737ea..bf142d265 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -120,26 +120,34 @@ struct CoordEvent u8 *script; }; +struct HiddenItemStruct +{ + u32 itemId:16; + u32 hiddenItemId:8; // flag offset to determine flag lookup + u32 quantity:7; + u32 isUnderfoot:1; +}; + +union BgUnion +{ // carried over from diego's FR/LG work, seems to be the same struct + // in gen 3, "kind" (0x3 in BgEvent struct) determines the method to read the union. + u8 *script; + + // hidden item type probably + struct HiddenItemStruct hiddenItem; + + // secret base type + u32 secretBaseId; + +}; + struct BgEvent { u16 x, y; u8 unk4; u8 kind; // 0x2 padding for the union beginning. - union { // carried over from diego's FR/LG work, seems to be the same struct - // in gen 3, "kind" (0x3 in BgEvent struct) determines the method to read the union. - u8 *script; - - // hidden item type probably - struct { - u8 filler6[0x2]; - u16 hiddenItemId; // flag offset to determine flag lookup - } hiddenItem; - - // secret base type - u32 secretBaseId; - - } bgUnion; + union BgUnion bgUnion; }; struct MapEvents diff --git a/include/itemfinder.h b/include/itemfinder.h index 2b882b144..de63e9362 100644 --- a/include/itemfinder.h +++ b/include/itemfinder.h @@ -1,6 +1,6 @@ #ifndef GUARD_ITEMFINDER_H #define GUARD_ITEMFINDER_H -void sub_813EC8C(u8 taskId); +void ItemUseOnFieldCB_Itemfinder(u8 taskId); #endif //GUARD_ITEMFINDER_H diff --git a/include/strings.h b/include/strings.h index b0221b8e9..9ddce6044 100644 --- a/include/strings.h +++ b/include/strings.h @@ -324,4 +324,9 @@ extern const u8 gText_ThrowAwayStrVar2OfThisItemQM[]; extern const u8 gText_BerryPouch[]; extern const u8 gText_TheBerryPouchWillBePutAway[]; +// itemfinder +extern const u8 gText_ItemfinderResponding[]; +extern const u8 gText_ItemfinderShakingWildly[]; +extern const u8 gText_NopeTheresNoResponse[]; + #endif //GUARD_STRINGS_H diff --git a/ld_script.txt b/ld_script.txt index a61f88d14..03c79232b 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -252,7 +252,7 @@ SECTIONS { asm/wild_pokemon_area.o(.text); src/dynamic_placeholder_text_util.o(.text); src/berry_pouch.o(.text); - asm/itemfinder.o(.text); + src/itemfinder.o(.text); src/buy_menu_helpers.o(.text); src/slot_machine.o(.text); src/roamer.o(.text); @@ -467,7 +467,7 @@ SECTIONS { data/wild_pokemon_area.o(.rodata); src/dynamic_placeholder_text_util.o(.rodata); src/berry_pouch.o(.rodata); - data/itemfinder.o(.rodata); + src/itemfinder.o(.rodata); src/buy_menu_helpers.o(.rodata); src/slot_machine.o(.rodata); src/roamer.o(.rodata); diff --git a/src/fieldmap.c b/src/fieldmap.c index 2683eaf62..000b8105b 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -833,7 +833,7 @@ s32 sub_80596FC(struct MapConnection *connection, s32 x, s32 y) return FALSE; } -struct MapConnection *sub_805973C(s16 x, s16 y) +struct MapConnection *GetMapConnectionAtPos(s16 x, s16 y) { s32 count; struct MapConnection *connection; diff --git a/src/item_use.c b/src/item_use.c index 5fa9390c1..c472960bd 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -274,7 +274,7 @@ void ItemUseOnFieldCB_Rod(u8 taskId) void ItemUseOutOfBattle_Itemfinder(u8 taskId) { IncrementGameStat(GAME_STAT_USED_ITEMFINDER); - sItemUseOnFieldCB = sub_813EC8C; + sItemUseOnFieldCB = ItemUseOnFieldCB_Itemfinder; sub_80A103C(taskId); } diff --git a/src/itemfinder.c b/src/itemfinder.c new file mode 100644 index 000000000..4e723ac03 --- /dev/null +++ b/src/itemfinder.c @@ -0,0 +1,659 @@ +#include "global.h" +#include "task.h" +#include "new_menu_helpers.h" +#include "strings.h" +#include "event_scripts.h" +#include "map_obj_lock.h" +#include "script.h" +#include "sound.h" +#include "event_data.h" +#include "field_player_avatar.h" +#include "field_specials.h" +#include "fieldmap.h" +#include "itemfinder.h" +#include "constants/songs.h" + +static void Task_NoResponse_CleanUp(u8 taskId); +static void Task_ItemfinderResponseSoundsAndAnims(u8 taskId); +static void Task_ItemfinderUnderfootSoundsAndAnims(u8 taskId); +static bool8 HiddenItemIsWithinRangeOfPlayer(struct MapEvents * events, u8 taskId); +static void SetUnderfootHiddenItem(u8 taskId, struct HiddenItemStruct hiddenItem); +static void SetNormalHiddenItem(u8 taskId); +static void FindHiddenItemsInConnectedMaps(u8 taskId); +static void RegisterHiddenItemRelativeCoordsIfCloser(u8 taskId, s16 dx, s16 dy); +static u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY); +static void Task_ItemfinderResponsePrintMessage(u8 taskId); +static void Task_ItemfinderResponseCleanUp(u8 taskId); +static void Task_ItemfinderUnderfootPrintMessage(u8 taskId); +static void Task_ItemfinderUnderfootDigUpItem(u8 taskId); +static void DestroyArrowAndStarTiles(void); +static void LoadArrowAndStarTiles(void); +static void CreateArrowSprite(u8 animNum, u8 direction); +static void SpriteCallback_Arrow(struct Sprite * sprite); +static void SpriteCallback_DestroyArrow(struct Sprite * sprite); +static u8 CreateStarSprite(void); +static void SpriteCallback_Star(struct Sprite * sprite); +static void SpriteCallback_DestroyStar(struct Sprite * sprite); + +#define ARROW_TILE_TAG 2000 + +static const u16 sArrowAndStarSpriteTiles[] = INCBIN_U16("data/itemfinder/spr_tiles.4bpp"); + +static const union AnimCmd sArrowAnim0[] = { + ANIMCMD_FRAME( 0, 10), + ANIMCMD_END +}; + +static const union AnimCmd sArrowAnim1[] = { + ANIMCMD_FRAME( 4, 10), + ANIMCMD_END +}; + +static const union AnimCmd sArrowAnim2[] = { + ANIMCMD_FRAME( 8, 10), + ANIMCMD_END +}; + +static const union AnimCmd sArrowAnim3[] = { + ANIMCMD_FRAME(12, 10), + ANIMCMD_END +}; + +static const union AnimCmd sStarAnim[] = { + ANIMCMD_FRAME(16, 10), + ANIMCMD_END +}; + +static const union AnimCmd *const sArrowAndStarSpriteAnimTable[] = { + sArrowAnim0, + sArrowAnim1, + sArrowAnim2, + sArrowAnim3, + sStarAnim +}; + +static const struct OamData sArrowAndStarSpriteOamData = { + .affineMode = ST_OAM_AFFINE_NORMAL, + .shape = ST_OAM_SQUARE, + .size = ST_OAM_SIZE_1 +}; + +static const union AffineAnimCmd sAffineAnim_Left[] = { + AFFINEANIMCMD_FRAME(0, 0, 0x00, 1), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sAffineAnim_Down[] = { + AFFINEANIMCMD_FRAME(0, 0, 0x40, 1), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sAffineAnim_Right[] = { + AFFINEANIMCMD_FRAME(0, 0, 0x80, 1), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sAffineAnim_Up[] = { + AFFINEANIMCMD_FRAME(0, 0, 0xc0, 1), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const sArrowAndStarSpriteAffineAnimTable[] = { + sAffineAnim_Left, + sAffineAnim_Down, + sAffineAnim_Right, + sAffineAnim_Up +}; + +static const struct SpriteTemplate gUnknown_84647E4 = { + .tileTag = ARROW_TILE_TAG, + .paletteTag = 0xFFFF, + .oam = &sArrowAndStarSpriteOamData, + .anims = sArrowAndStarSpriteAnimTable, + .affineAnims = sArrowAndStarSpriteAffineAnimTable, + .callback = SpriteCallback_Arrow +}; + +static const struct SpriteSheet sArrowAndStarSpriteSheet = { + .data = sArrowAndStarSpriteTiles, + .size = sizeof(sArrowAndStarSpriteTiles), + .tag = ARROW_TILE_TAG +}; + +#define tItemX data[0] +#define tItemY data[1] +#define tHiddenItemFound data[2] +#define tDingTimer data[3] +#define tNumDingsRemaining data[4] +#define tDingNum data[5] +#define tUnderfoot data[6] +#define tStartSpriteId data[7] + +void ItemUseOnFieldCB_Itemfinder(u8 taskId) +{ + u8 i; + for (i = 0; i < 16; i++) + gTasks[taskId].data[i] = 0; + if (HiddenItemIsWithinRangeOfPlayer(gMapHeader.events, taskId) == TRUE) + { + LoadArrowAndStarTiles(); + if (gTasks[taskId].tUnderfoot == TRUE) + gTasks[taskId].func = Task_ItemfinderUnderfootSoundsAndAnims; + else + gTasks[taskId].func = Task_ItemfinderResponseSoundsAndAnims; + } + else + { + DisplayItemMessageOnField(taskId, 2, gText_NopeTheresNoResponse, Task_NoResponse_CleanUp); + } +} + +static void Task_NoResponse_CleanUp(u8 taskId) +{ + ClearDialogWindowAndFrame(0, TRUE); + sub_80696C0(); + ScriptContext2_Disable(); + DestroyTask(taskId); +} + +static void Task_ItemfinderResponseSoundsAndAnims(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u8 direction; + if (tDingTimer % 25 == 0) + { + direction = GetPlayerDirectionTowardsHiddenItem(tItemX, tItemY); + if (tNumDingsRemaining == 0) + { + gTasks[taskId].func = Task_ItemfinderResponsePrintMessage; + return; + } + else + { + PlaySE(SE_TOY_F); + CreateArrowSprite(tDingNum, direction); + tDingNum++; + tNumDingsRemaining--; + } + } + tDingTimer++; +} + +static void Task_ItemfinderUnderfootSoundsAndAnims(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + if (tDingTimer % 25 == 0) + { + if (tNumDingsRemaining == 0) + { + gTasks[taskId].func = Task_ItemfinderUnderfootPrintMessage; + return; + } + else + { + PlaySE(SE_TOY_F); + tStartSpriteId = CreateStarSprite(); + tDingNum++; + tNumDingsRemaining--; + } + } + tDingTimer++; +} + +static bool8 HiddenItemIsWithinRangeOfPlayer(struct MapEvents * events, u8 taskId) +{ + s16 x, y, i, dx, dy; + PlayerGetDestCoords(&x, &y); + gTasks[taskId].tHiddenItemFound = FALSE; + for (i = 0; i < events->bgEventCount; i++) + { + if (events->bgEvents[i].kind == 7 && !FlagGet(GetHiddenItemAttr(events->bgEvents[i].bgUnion.hiddenItem, HIDDEN_ITEM_FLAG))) + { + dx = events->bgEvents[i].x + 7 - x; + dy = events->bgEvents[i].y + 7 - y; + if (GetHiddenItemAttr(events->bgEvents[i].bgUnion.hiddenItem, HIDDEN_ITEM_UNDERFOOT) == TRUE) + { + if (dx == 0 && dy == 0) + { + SetUnderfootHiddenItem(taskId, events->bgEvents[i].bgUnion.hiddenItem); + return TRUE; + } + } + else if ( + dx >= -7 + && dx <= 7 + && dy >= -5 + && dy <= 5 + ) + { + RegisterHiddenItemRelativeCoordsIfCloser(taskId, dx, dy); + } + } + } + FindHiddenItemsInConnectedMaps(taskId); + if (gTasks[taskId].tHiddenItemFound == TRUE) + { + SetNormalHiddenItem(taskId); + return TRUE; + } + return FALSE; +} + +static void SetUnderfootHiddenItem(u8 taskId, struct HiddenItemStruct hiddenItem) +{ + s16 *data = gTasks[taskId].data; + gSpecialVar_0x8004 = GetHiddenItemAttr(hiddenItem, HIDDEN_ITEM_FLAG); + gSpecialVar_0x8005 = GetHiddenItemAttr(hiddenItem, HIDDEN_ITEM_ID); + gSpecialVar_0x8006 = 1; + TV_PrintIntToStringVar(0, gSpecialVar_0x8005); + tHiddenItemFound = TRUE; + tItemX = 0; + tItemY = 0; + tNumDingsRemaining = 3; + tUnderfoot = TRUE; +} + +static void SetNormalHiddenItem(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s16 absY = tItemY; + s16 absX = tItemX; + + // The strength of the response increases inversely with distance to the item. + if (tItemX == 0 && tItemY == 0) + tNumDingsRemaining = 4; + else + { + if (tItemX < 0) + absX = tItemX * -1; + if (tItemY < 0) + absY = tItemY * -1; + if (absX > absY) + { + if (absX > 3) + tNumDingsRemaining = 2; + else + tNumDingsRemaining = 4; + } + else + { + if (absY > 3) + tNumDingsRemaining = 2; + else + tNumDingsRemaining = 4; + } + } +} + +static bool8 HiddenItemAtPos(struct MapEvents * events, s16 x, s16 y) +{ + u8 bgEventCount = events->bgEventCount; + struct BgEvent * bgEvents = events->bgEvents; + u16 eventFlag; + int i; + + for (i = 0; i < bgEventCount; i++) + { + if ( + bgEvents[i].kind == 7 + && x == bgEvents[i].x + && y == bgEvents[i].y + ) + { + eventFlag = GetHiddenItemAttr(bgEvents[i].bgUnion.hiddenItem, HIDDEN_ITEM_FLAG); + if (GetHiddenItemAttr(bgEvents[i].bgUnion.hiddenItem, HIDDEN_ITEM_UNDERFOOT) != TRUE && !FlagGet(eventFlag)) + return TRUE; + else + return FALSE; + } + } + return FALSE; +} + +static bool8 HiddenItemInConnectedMapAtPos(struct MapConnection * connection, s32 x, s32 y) +{ + const struct MapHeader * mapHeader; + u16 localX, localY; + u32 localOffset; + s32 localLength; + + mapHeader = mapconnection_get_mapheader(connection); + + switch (connection->direction) + { + // same weird temp variable behavior seen in HiddenItemAtPos + case 2: + localOffset = connection->offset + 7; + localX = x - localOffset; + localLength = mapHeader->mapData->height - 7; + localY = localLength + y; // additions are reversed for some reason + break; + case 1: + localOffset = connection->offset + 7; + localX = x - localOffset; + localLength = gMapHeader.mapData->height + 7; + localY = y - localLength; + break; + case 3: + localLength = mapHeader->mapData->width - 7; + localX = localLength + x; // additions are reversed for some reason + localOffset = connection->offset + 7; + localY = y - localOffset; + break; + case 4: + localLength = gMapHeader.mapData->width + 7; + localX = x - localLength; + localOffset = connection->offset + 7; + localY = y - localOffset; + break; + default: + return FALSE; + } + return HiddenItemAtPos(mapHeader->events, localX, localY); +} + +static void FindHiddenItemsInConnectedMaps(u8 taskId) +{ + s16 x, y; + s16 curX, curY; + s16 width = gMapHeader.mapData->width + 7; + s16 height = gMapHeader.mapData->height + 7; + + s16 var1 = 7; + s16 var2 = 7; + + PlayerGetDestCoords(&x, &y); + + for (curX = x - 7; curX <= x + 7; curX++) + { + for (curY = y - 5; curY <= y + 5; curY++) + { + if (var1 > curX + || curX >= width + || var2 > curY + || curY >= height) + { + struct MapConnection * conn = GetMapConnectionAtPos(curX, curY); + if (conn != NULL && HiddenItemInConnectedMapAtPos(conn, curX, curY) == TRUE) + RegisterHiddenItemRelativeCoordsIfCloser(taskId, curX - x, curY - y); + } + } + } +} + +static void RegisterHiddenItemRelativeCoordsIfCloser(u8 taskId, s16 dx, s16 dy) +{ + s16 *data = gTasks[taskId].data; + s16 dx2, dy2, dx3, dy3; + + if (tHiddenItemFound == FALSE) + { + tItemX = dx; + tItemY = dy; + tHiddenItemFound = TRUE; + } + else + { + // tItemX and tItemY contain the player's coordinates. + // dx and dy contain the item's coordinates. + if (tItemX < 0) + dx2 = tItemX * -1; // item is to the left + else + dx2 = tItemX; // item is to the right + + if (tItemY < 0) + dy2 = tItemY * -1; // item is to the north + else + dy2 = tItemY; // item is to the south + + if (dx < 0) + dx3 = dx * -1; + else + dx3 = dx; + + if (dy < 0) + dy3 = dy * -1; + else + dy3 = dy; + + if (dx2 + dy2 > dx3 + dy3) + { + tItemX = dx; + tItemY = dy; + } + else + { + if (dx2 + dy2 == dx3 + dy3 && (dy2 > dy3 || (dy2 == dy3 && tItemY < dy))) + { + tItemX = dx; + tItemY = dy; + } + } + } +} + +static u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY) +{ + s16 abX, abY; + + if (itemX == 0 && itemY == 0) + return DIR_NONE; // player is standing on the item. + + // get absolute X distance. + if (itemX < 0) + abX = itemX * -1; + else + abX = itemX; + + // get absolute Y distance. + if (itemY < 0) + abY = itemY * -1; + else + abY = itemY; + + if (abX > abY) + { + if (itemX < 0) + return DIR_EAST; + else + return DIR_NORTH; + } + else + { + if (abX < abY) + { + if (itemY < 0) + return DIR_SOUTH; + else + return DIR_WEST; + } + if (abX == abY) + { + if (itemY < 0) + return DIR_SOUTH; + else + return DIR_WEST; + } + return DIR_NONE; // should never get here. return something so it doesnt crash. + } +} + +static void Task_ItemfinderResponsePrintMessage(u8 taskId) +{ + DisplayItemMessageOnField(taskId, 2, gText_ItemfinderResponding, Task_ItemfinderResponseCleanUp); +} + +static void Task_ItemfinderResponseCleanUp(u8 taskId) +{ + DestroyArrowAndStarTiles(); + ClearDialogWindowAndFrame(0, TRUE); + sub_80696C0(); + ScriptContext2_Disable(); + DestroyTask(taskId); +} + +static void Task_ItemfinderUnderfootPrintMessage(u8 taskId) +{ + DisplayItemMessageOnField(taskId, 2, gText_ItemfinderShakingWildly, Task_ItemfinderUnderfootDigUpItem); +} + +static void Task_ItemfinderUnderfootDigUpItem(u8 taskId) +{ + DestroyArrowAndStarTiles(); + DestroyTask(taskId); + ScriptContext1_SetupScript(EventScript_ItemfinderDigUpUnderfootItem); + ScriptContext2_Enable(); +} + +#undef tStartSpriteId +#undef tUnderfoot +#undef tDingNum +#undef tNumDingsRemaining +#undef tDingTimer +#undef tHiddenItemFound +#undef tItemY +#undef tItemX + +#define spData0 data[0] +#define spDeltaX data[1] +#define spDeltaY data[2] +#define spCurX data[3] +#define spCurY data[4] +#define spCenterX data[5] +#define spCenterY data[6] +#define spAnimNum data[7] + +static void LoadArrowAndStarTiles(void) +{ + LoadSpriteSheet(&sArrowAndStarSpriteSheet); +} + +static void DestroyArrowAndStarTiles(void) +{ + FreeSpriteTilesByTag(ARROW_TILE_TAG); +} + +static void CreateArrowSprite(u8 animNum, u8 direction) +{ + u8 spriteId = CreateSprite(&gUnknown_84647E4, 120, 76, 0); + gSprites[spriteId].oam.paletteNum = 0; + StartSpriteAnim(&gSprites[spriteId], animNum); + gSprites[spriteId].spAnimNum = animNum; + gSprites[spriteId].spData0 = 0; + gSprites[spriteId].spCurX = 0; + gSprites[spriteId].spCurY = 0; + gSprites[spriteId].spCenterX = 120; + gSprites[spriteId].spCenterY = 76; + switch (direction) + { + case DIR_NONE: + switch (GetPlayerFacingDirection()) + { + case DIR_WEST: + gSprites[spriteId].spDeltaX = -100; + gSprites[spriteId].spDeltaY = 0; + StartSpriteAffineAnim(&gSprites[spriteId], 0); + break; + case DIR_NORTH: + gSprites[spriteId].spDeltaX = 0; + gSprites[spriteId].spDeltaY = -100; + StartSpriteAffineAnim(&gSprites[spriteId], 3); + break; + case DIR_EAST: + gSprites[spriteId].spDeltaX = 100; + gSprites[spriteId].spDeltaY = 0; + StartSpriteAffineAnim(&gSprites[spriteId], 2); + break; + case DIR_SOUTH: + gSprites[spriteId].spDeltaX = 0; + gSprites[spriteId].spDeltaY = 100; + StartSpriteAffineAnim(&gSprites[spriteId], 1); + break; + } + break; + case DIR_SOUTH: + gSprites[spriteId].spDeltaX = 0; + gSprites[spriteId].spDeltaY = -100; + StartSpriteAffineAnim(&gSprites[spriteId], 3); + break; + case DIR_NORTH: + gSprites[spriteId].spDeltaX = 100; + gSprites[spriteId].spDeltaY = 0; + StartSpriteAffineAnim(&gSprites[spriteId], 2); + break; + case DIR_WEST: + gSprites[spriteId].spDeltaX = 0; + gSprites[spriteId].spDeltaY = 100; + StartSpriteAffineAnim(&gSprites[spriteId], 1); + break; + case DIR_EAST: + gSprites[spriteId].spDeltaX = -100; + gSprites[spriteId].spDeltaY = 0; + break; + } +} + +static void SpriteCallback_Arrow(struct Sprite * sprite) +{ + s16 x, y; + sprite->spCurX += sprite->spDeltaX; + sprite->spCurY += sprite->spDeltaY; + sprite->pos1.x = sprite->spCenterX + (sprite->spCurX >> 8); + sprite->pos1.y = sprite->spCenterY + (sprite->spCurY >> 8); + if (sprite->pos1.x <= 104 + || sprite->pos1.x > 132 + || sprite->pos1.y <= 60 + || sprite->pos1.y > 88) + sprite->callback = SpriteCallback_DestroyArrow; +} + +static void SpriteCallback_DestroyArrow(struct Sprite * sprite) +{ + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); +} + +static u8 CreateStarSprite(void) +{ + u8 spriteId = CreateSprite(&gUnknown_84647E4, 120, 76, 0); + gSprites[spriteId].oam.paletteNum = 0; + gSprites[spriteId].callback = SpriteCallback_Star; + StartSpriteAnim(&gSprites[spriteId], 4); + gSprites[spriteId].spAnimNum = 0; + gSprites[spriteId].spData0 = 0; + gSprites[spriteId].spCurX = 0; + gSprites[spriteId].spCurY = 0; + gSprites[spriteId].spCenterX = 120; + gSprites[spriteId].spCenterY = 76; + gSprites[spriteId].spDeltaX = 0; + gSprites[spriteId].spDeltaY = -100; + return spriteId; +} + +static void SpriteCallback_Star(struct Sprite * sprite) +{ + s16 x, y; + sprite->spCurX += sprite->spDeltaX; + sprite->spCurY += sprite->spDeltaY; + sprite->pos1.x = sprite->spCenterX + (sprite->spCurX >> 8); + sprite->pos1.y = sprite->spCenterY + (sprite->spCurY >> 8); + if (sprite->pos1.x <= 104 + || sprite->pos1.x > 132 + || sprite->pos1.y <= 60 + || sprite->pos1.y > 88) + sprite->callback = SpriteCallback_DestroyStar; +} + +static void SpriteCallback_DestroyStar(struct Sprite * sprite) +{ + DestroySprite(sprite); +} + +#undef spAnimNum +#undef spCenterY +#undef spCenterX +#undef spCurY +#undef spCurX +#undef spDeltaY +#undef spDeltaX +#undef spData0 |