Routines |
Prev: D026 | Up: Map | Next: DBEB |
This iterates over itemstructs, testing to see if each item is within the range (-1..22, 0..15) of the current map position. If it is it sets the flags itemstruct_ROOM_FLAG_NEARBY_6 and itemstruct_ROOM_FLAG_NEARBY_7 on the item, otherwise it clears both of those flags.
This is similar to is_item_discoverable_interior in that it iterates over all item_structs.
Used by the routines at setup_movable_items and main_loop.
|
||||
mark_nearby_items | DB9E | LD A,($68A0) | Get the global current room index | |
DBA1 | CP $FF | Is it room_NONE? | ||
DBA3 | JR NZ,mni_room_set | Jump if not | ||
DBA5 | XOR A | Otherwise set it to room_0_OUTDOORS | ||
mni_room_set | DBA6 | LD C,A | Preload the room index into C | |
DBA7 | LD DE,($81BB) | Point DE at the map position | ||
DBAB | LD B,$10 | Set B for 16 iterations (item__LIMIT) | ||
DBAD | LD HL,$76C9 | Point HL at the first item_struct's room member | ||
Start loop
|
||||
mni_loop | DBB0 | PUSH HL | Preserve item_struct pointer | |
Compare room
|
||||
DBB1 | LD A,(HL) | Load the room index and flags | ||
DBB2 | AND $3F | Extract the room index | ||
DBB4 | CP C | Same room? | ||
DBB5 | JR NZ,mni_reset | Jump if not | ||
Is the item's X coordinate within (-1..22) of the map's X position?
|
||||
DBB7 | INC HL | Advance HL to itemstruct.iso_pos.x | ||
DBB8 | INC HL | |||
DBB9 | INC HL | |||
DBBA | INC HL | |||
DBBB | LD A,E | Copy map X position into A | ||
DBBC | DEC A | Reduce it by 2 | ||
DBBD | DEC A | |||
DBBE | CP (HL) | Compare it to itemstruct.iso_pos.x | ||
DBBF | JR Z,mni_chk_x_hi | Jump if equal (continuing test) | ||
DBC1 | JR NC,mni_reset | Reset if under lower bound | ||
mni_chk_x_hi | DBC3 | ADD A,$19 | Add 25 to make (map X position + 23) | |
DBC5 | CP (HL) | Compare to X value in itemstruct | ||
DBC6 | JR C,mni_reset | Reset if over upper bound | ||
Is the item's Y coordinate within (0..15) of the map's Y position?
|
||||
DBC8 | LD A,D | Copy map Y position into A | ||
DBC9 | INC HL | Advance HL to itemstruct.iso_pos.y | ||
DBCA | DEC A | Reduce it by 1 | ||
DBCB | CP (HL) | Compare it to itemstruct.iso_pos.y | ||
DBCC | JR Z,mni_chk_y_hi | Jump if equal (continuing test) | ||
DBCE | JR NC,mni_reset | Reset if under lower bound | ||
mni_chk_y_hi | DBD0 | ADD A,$11 | Add 17 to make (map Y position + 16) | |
DBD2 | CP (HL) | Compare to Y value in itemstruct | ||
DBD3 | JR C,mni_reset | Reset if over upper bound | ||
mni_set | DBD5 | POP HL | Restore itemstruct pointer | |
DBD6 | SET 7,(HL) | Set itemstruct_ROOM_FLAG_NEARBY_6 and itemstruct_ROOM_FLAG_NEARBY_7 | ||
DBD8 | SET 6,(HL) | |||
DBDA | JR mni_advance | Jump to next iteration | ||
mni_reset | DBDC | POP HL | Restore itemstruct pointer | |
DBDD | RES 7,(HL) | Clear itemstruct_ROOM_FLAG_NEARBY_6 and itemstruct_ROOM_FLAG_NEARBY_7 | ||
DBDF | RES 6,(HL) | |||
mni_advance | DBE1 | LD A,$07 | Advance HL by stride | |
DBE3 | ADD A,L | |||
DBE4 | LD L,A | |||
DBE5 | JR NC,mni_next | |||
DBE7 | INC H | |||
mni_next | DBE8 | DJNZ mni_loop | ...loop | |
DBEA | RET | Return |
Prev: D026 | Up: Map | Next: DBEB |