diff options
Diffstat (limited to 'engine')
-rw-r--r-- | engine/events/checkforhiddenitems.asm | 83 | ||||
-rw-r--r-- | engine/events/itemfinder.asm | 50 |
2 files changed, 133 insertions, 0 deletions
diff --git a/engine/events/checkforhiddenitems.asm b/engine/events/checkforhiddenitems.asm new file mode 100644 index 00000000..c71bd290 --- /dev/null +++ b/engine/events/checkforhiddenitems.asm @@ -0,0 +1,83 @@ +CheckForHiddenItems: +; Checks to see if there are hidden items on the screen that have not yet been found. If it finds one, returns carry. + call GetMapScriptsBank + ld [wBuffer1], a +; Get the coordinate of the bottom right corner of the screen, and load it in wBuffer3/wBuffer4. + ld a, [wXCoord] + add SCREEN_WIDTH / 4 + ld [wBuffer4], a + ld a, [wYCoord] + add SCREEN_HEIGHT / 4 + ld [wBuffer3], a +; Get the pointer for the first bg_event in the map... + ld hl, wCurMapBGEventsPointer + ld a, [hli] + ld h, [hl] + ld l, a +; ... before even checking to see if there are any BG events on this map. + ld a, [wCurMapBGEventCount] + and a + jr z, .nobgeventitems +; For i = 1:wCurMapBGEventCount... +.loop +; Store the counter in wBuffer2, and store the bg_event pointer in the stack. + ld [wBuffer2], a + push hl +; Get the Y coordinate of the BG event. + call .GetFarByte + ld e, a +; Is the Y coordinate of the BG event on the screen? If not, go to the next BG event. + ld a, [wBuffer3] + sub e + jr c, .next + cp SCREEN_HEIGHT / 2 + jr nc, .next +; Is the X coordinate of the BG event on the screen? If not, go to the next BG event. + call .GetFarByte + ld d, a + ld a, [wBuffer4] + sub d + jr c, .next + cp SCREEN_WIDTH / 2 + jr nc, .next +; Is this BG event a hidden item? If not, go to the next BG event. + call .GetFarByte + cp BGEVENT_ITEM + jr nz, .next +; Has this item already been found? If not, set off the Itemfinder. + ld a, [wBuffer1] + call GetFarHalfword + ld a, [wBuffer1] + call GetFarHalfword + ld d, h + ld e, l + ld b, CHECK_FLAG + call EventFlagAction + ld a, c + and a + jr z, .itemnearby + +.next +; Restore the bg_event pointer and increment it by the length of a bg_event. + pop hl + ld bc, BG_EVENT_SIZE + add hl, bc +; Restore the BG event counter and decrement it. If it hits zero, there are no hidden items in range. + ld a, [wBuffer2] + dec a + jr nz, .loop + +.nobgeventitems + xor a + ret + +.itemnearby + pop hl + scf + ret + +.GetFarByte: + ld a, [wBuffer1] + call GetFarByte + inc hl + ret diff --git a/engine/events/itemfinder.asm b/engine/events/itemfinder.asm new file mode 100644 index 00000000..3665187c --- /dev/null +++ b/engine/events/itemfinder.asm @@ -0,0 +1,50 @@ +ItemFinder: + farcall CheckForHiddenItems + jr c, .found_something + ld hl, .Script_FoundNothing + jr .resume + +.found_something + ld hl, .Script_FoundSomething + +.resume + call QueueScript + ld a, $1 + ld [wItemEffectSucceeded], a + ret + +.ItemfinderSound: + ld c, 4 +.sfx_loop + push bc + ld de, SFX_SECOND_PART_OF_ITEMFINDER + call WaitPlaySFX + ld de, SFX_TRANSACTION + call WaitPlaySFX + pop bc + dec c + jr nz, .sfx_loop + ret + +.Script_FoundSomething: + reloadmappart + special UpdateTimePals + callasm .ItemfinderSound + writetext .ItemfinderItemNearbyText + closetext + end + +.Script_FoundNothing: + reloadmappart + special UpdateTimePals + writetext .ItemfinderNopeText + closetext + end + +.ItemfinderItemNearbyText: + text_far _ItemfinderItemNearbyText + text_end + +.ItemfinderNopeText: + text_far _ItemfinderNopeText + text_end |