Prev: BB98 Up: Map Next: BCEE
BCAA: Select tile set
This turns a map position (from map_position), adds on the given (x,y) offset and turns that resulting coordinate into a tile set pointer.
Used by the routine at restore_tiles.
Input
H X shift.
L Y shift.
Output
A Preserved.
BC Pointer to tile set.
select_tile_set BCAA EX AF,AF' Preserve A during this routine
BCAB LD A,($68A0) Fetch the global current room index
BCAE AND A Is it room_0_OUTDOORS?
BCAF JR Z,sts_exterior Jump if so
sts_interior BCB1 LD BC,$9768 Otherwise point BC at interior_tiles[0]
BCB4 EX AF,AF' Restore A
BCB5 RET Return
Convert map position to an index into map_buf: a 7x5 array of supertile indices.
Compute row offset
sts_exterior BCB6 LD A,($81BC) Get the map position's Y component and isolate its low-order bits
BCB9 AND $03
BCBB ADD A,L Add on the Y shift from L
BCBC RRA Divide by two (rotate right by two then clear the rotated-out bits)
BCBD RRA
BCBE AND $3F
BCC0 LD L,A Multiply by 7 (columns per row of supertiles)
BCC1 ADD A,A
BCC2 ADD A,A
BCC3 ADD A,A
BCC4 SUB L
BCC5 LD L,A Save for later
Compute column offset
BCC6 LD A,($81BB) Get the map position's X component and isolate its low-order bits
BCC9 AND $03
BCCB ADD A,H Add on the X shift from H
BCCC RRA Divide by two (rotate right by two then clear the rotated-out bits)
BCCD RRA
BCCE AND $3F
Combine offsets
BCD0 ADD A,L Combine the row and column offsets
BCD1 LD HL,$FF58 Point HL at map_buf (a 7x5 cut-down copy of the main map which holds supertile indices)
BCD4 ADD A,L Add offset (quick version since the values can't overflow)
BCD5 LD L,A
BCD6 LD A,(HL) Fetch the supertile index from map_buf
BCD7 LD BC,$8590 Point BC at exterior_tiles[0]
Choose the tile index for the current supertile:
For supertile Use tile indices
44 and lower 0..249
45..138 and 204..218 145..400
139..203 365..570
BCDA CP $2D Is the supertile index < 45?
BCDC JR C,sts_exit Jump if so
BCDE LD BC,$8A18 Point BC at exterior_tiles[145]
BCE1 CP $8B Is the supertile index < 139?
BCE3 JR C,sts_exit Jump if so
BCE5 CP $CC Is the supertile index >= 204?
BCE7 JR NC,sts_exit Jump if so
BCE9 LD BC,$90F8 Point BC at exterior_tiles[145 + 220]
sts_exit BCEC EX AF,AF' Restore A
BCED RET Return
Prev: BB98 Up: Map Next: BCEE