diff --git a/engine/board/disabled_spaces.asm b/engine/board/disabled_spaces.asm new file mode 100755 index 000000000..a9ff7ea97 --- /dev/null +++ b/engine/board/disabled_spaces.asm @@ -0,0 +1,418 @@ +BackupDisabledSpace: +; unlike map objects which are backed up when leaving a map, +; a disabled space is backed up immediately when it is disabled. + ld a, [wCurSpace] + push af + + ld hl, wMapGroup + ld d, [hl] + inc hl ; wMapNumber + ld e, [hl] + + ld a, BANK(wDisabledSpacesBackups) + ld [rSVBK], a + + ld hl, wMap1DisabledSpacesBackup + ld bc, wMap2DisabledSpacesBackup - wMap1DisabledSpacesBackup - 2 +.loop + ld a, [hl] + cp GROUP_N_A + jr z, .found_available_entry + and a ; cp $00 (terminator found at wDisabledSpacesBackupsEnd, no more room) + jr z, .done_pop_af + cp d ; wMapDisabledSpacesMapGroup == wMapGroup? + jr nz, .next + inc hl + ld a, [hl] + cp e ; wMapDisabledSpacesMapNumber == wMapNumber? + jr nz, .next2 + inc hl + jr .found_matching_entry +.next + inc hl +.next2 + inc hl + add hl, bc + jr .loop + +.found_available_entry + ld [hl], d ; wMapGroup + inc hl + ld [hl], e ; wMapNumber + inc hl +.found_matching_entry +; mark the space at wCurSpace as disabled in the entry with + pop af + ld e, a + ld d, 0 + ld b, SET_FLAG + call FlagAction + jr .done + +.done_pop_af + pop af +.done + ld a, 1 + ld [rSVBK], a + ret + +LoadDisabledSpaces: +; map setup command (called after the map setup command LoadBlockData) +; load blocks with disabled spaces in the active map, and in each of its connected maps. +; for connected maps, only blocks that are in visible range from the active map, +; i.e. those that appear in wOverworldMapBlocks while in the active map. + ld hl, wMapGroup + ld d, [hl] + inc hl + ld e, [hl] ; wMapNumber + xor a ; active map + ld [wTempByteValue], a + call _LoadDisabledSpaces + + ld hl, wNorthConnectedMapGroup + ld a, [hli] + cp GROUP_N_A + jr z, .south + ld d, a ; wNorthConnectedMapGroup + ld e, [hl] ; wNorthConnectedMapNumber + ld a, 1 ; north connected map + ld [wTempByteValue], a + call _LoadDisabledSpaces +.south + + ld hl, wSouthConnectedMapGroup + ld a, [hli] + cp GROUP_N_A + jr z, .west + ld d, a ; wSouthConnectedMapGroup + ld e, [hl] ; wSouthConnectedMapNumber + ld a, 2 ; south connected map + ld [wTempByteValue], a + call _LoadDisabledSpaces +.west + + ld hl, wWestConnectedMapGroup + ld a, [hli] + cp GROUP_N_A + jr z, .east + ld d, a ; wWestConnectedMapGroup + ld e, [hl] ; wWestConnectedMapNumber + ld a, 3 ; west connected map + ld [wTempByteValue], a + call _LoadDisabledSpaces +.east + + ld hl, wEastConnectedMapGroup + ld a, [hli] + cp GROUP_N_A + jr z, .done + ld d, a ; wEastConnectedMapGroup + ld e, [hl] ; wEastConnectedMapNumber + ld a, 4 ; east connected map + ld [wTempByteValue], a + call _LoadDisabledSpaces +.done + ret + +_LoadDisabledSpaces: + ld a, BANK(wDisabledSpacesBackups) + ld [rSVBK], a + + ld hl, wMap1DisabledSpacesBackup + ld bc, wMap2DisabledSpacesBackup - wMap1DisabledSpacesBackup - 2 +.find_loop + ld a, [hl] + cp GROUP_N_A + jr z, .no_match + and a ; cp $00 (terminator found at wDisabledSpacesBackupsEnd) + jr z, .no_match + cp d + jr nz, .next + inc hl + ld a, [hl] + cp e + jr nz, .next2 + inc hl + jr .found_matching_entry +.next + inc hl +.next2 + inc hl + add hl, bc + jr .find_loop + +.found_matching_entry +; temporarily load wMapScriptsBank, wMapSpacesPointer for this map, +; so that we can later can call LoadTempSpaceData in the context of this map. + ld a, 1 + ld [rSVBK], a + ld a, [wMapGroup] + push af + ld a, [wMapNumber] + push af + ld a, d + ld [wMapGroup], a + ld a, e + ld [wMapNumber], a + push hl + call CopyMapPartialAndAttributesPartial + pop hl + ld a, BANK(wDisabledSpacesBackups) + ld [rSVBK], a + +; loop through all MAX_SPACES_PER_MAP flags and call .ApplyDisabledSpace in the disabled spaces. + xor a +.apply_loop_2 + ld e, [hl] + inc hl +.apply_loop_1 + srl e + call c, .ApplyDisabledSpace + inc a + cp MAX_SPACES_PER_MAP + jr z, .done ; return when all MAX_SPACES_PER_MAP flags checked + ld d, a + and %111 + ld a, d + jr z, .apply_loop_2 ; jump if done with current batch of 8 flags + jr .apply_loop_1 + +.done + ld a, 1 + ld [rSVBK], a +; restore active map attributes + pop af + ld [wMapNumber], a + pop af + ld [wMapGroup], a + call CopyMapPartialAndAttributesPartial + ret + +.no_match + ld a, 1 + ld [rSVBK], a + ret + +.ApplyDisabledSpace: + push af + push de + push hl + ld e, a + ld a, 1 + ld [rSVBK], a + ld a, e ; a = space to apply as disabled + call LoadTempSpaceData + ld hl, .return + push hl + jumptable .Jumptable, wTempByteValue +.return + jr nc, .connected_block_not_in_range + ld a, [hl] + and UNIQUE_SPACE_METATILES_MASK + add FIRST_GREY_SPACE_METATILE + ld [hl], a +.connected_block_not_in_range + ld a, BANK(wDisabledSpacesBackups) + ld [rSVBK], a + pop hl + pop de + pop af + ret + +.Jumptable: + dw .ActiveMap + dw .NorthConnectedMap + dw .SouthConnectedMap + dw .WestConnectedMap + dw .EastConnectedMap + +.ActiveMap: + ld a, [wTempSpaceXCoord] + add 4 + ld d, a + ld a, [wTempSpaceYCoord] + add 4 + ld e, a + call GetBlockLocation + scf + ret + +.NorthConnectedMap: + ld a, [wTempSpaceXCoord] + ld d, a + ld a, [wTempSpaceYCoord] + ld e, a + call GetNorthConnectedBlockLocation + ret + +.SouthConnectedMap: + ld a, [wTempSpaceXCoord] + ld d, a + ld a, [wTempSpaceYCoord] + ld e, a + call GetSouthConnectedBlockLocation + ret + +.WestConnectedMap: + ld a, [wTempSpaceXCoord] + ld d, a + ld a, [wTempSpaceYCoord] + ld e, a + call GetWestConnectedBlockLocation + ret + +.EastConnectedMap: + ld a, [wTempSpaceXCoord] + ld d, a + ld a, [wTempSpaceYCoord] + ld e, a + call GetEastConnectedBlockLocation + ret + +GetSouthConnectedBlockLocation: +; ycoord / 2 <= 2 + ld a, e + srl a + cp 3 + ret nc +; [wSouthConnectionStripLocation] + ld hl, wSouthConnectionStripLocation + ld a, [hli] + ld h, [hl] + ld l, a +; + (xcoord / 2) + srl d + ld b, 0 + ld c, d + add hl, bc +; + ([wMapWidth] + 6) * ycoord / 2 + ld a, [wMapWidth] + add 6 + ld c, a + ld b, 0 + srl e + ld a, e + and a + jr z, .done +.loop + add hl, bc + dec a + jr nz, .loop +.done + scf + ret ; c + +GetNorthConnectedBlockLocation: +; wNorthConnectedMapHeight >= 3 +; ycoord / 2 >= ([wNorthConnectedMapHeight] - 3) + ld a, [wNorthConnectedMapHeight] + sub 3 + jr c, .nope + ld c, a + ld a, e + srl a + sub c + jr c, .nope + ld e, a ; e = ycoord / 2 - ([wNorthConnectedMapHeight] - 3) +; [wNorthConnectionStripLocation] + ld hl, wNorthConnectionStripLocation + ld a, [hli] + ld h, [hl] + ld l, a +; + (xcoord / 2) + srl d + ld b, 0 + ld c, d + add hl, bc +; + ([wMapWidth] + 6) * {ycoord / 2 - ([wNorthConnectedMapHeight] - 3)} --> + ([wMapWidth] + 6) * e + ld a, [wMapWidth] + add 6 + ld c, a + ld b, 0 + ld a, e + and a + jr z, .done +.loop + add hl, bc + dec a + jr nz, .loop +.done + scf + ret ; c +.nope + xor a + ret ; nc + +GetEastConnectedBlockLocation: +; xcoord / 2 <= 2 + ld a, d + srl a + cp 3 + ret nc +; [wEastConnectionStripLocation] + ld hl, wEastConnectionStripLocation + ld a, [hli] + ld h, [hl] + ld l, a +; + (xcoord / 2) + srl d + ld b, 0 + ld c, d + add hl, bc +; + ([wMapWidth] + 6) * ycoord / 2 + ld a, [wMapWidth] + add 6 + ld c, a + ld b, 0 + srl e + ld a, e + and a + jr z, .done +.loop + add hl, bc + dec a + jr nz, .loop +.done + scf + ret ; c + +GetWestConnectedBlockLocation: +; wWestConnectedMapWidth >= 3 +; xcoord / 2 >= ([wWestConnectedMapWidth] - 3) + ld a, [wWestConnectedMapWidth] + sub 3 + jr c, .nope + ld c, a + ld a, d + srl a + sub c + jr c, .nope + ld d, a ; d = xcoord / 2 - ([wWestConnectedMapWidth] - 3) +; [wWestConnectionStripLocation] + ld hl, wWestConnectionStripLocation + ld a, [hli] + ld h, [hl] + ld l, a +; + xcoord / 2 - ([wWestConnectedMapWidth] - 3) --> + d + ld c, d + ld b, 0 + add hl, bc +; + ([wMapWidth] + 6) * ycoord / 2 + ld a, [wMapWidth] + add 6 + ld c, a + ld b, 0 + srl e + ld a, e + and a + jr z, .done +.loop + add hl, bc + dec a + jr nz, .loop +.done + scf + ret ; c +.nope + xor a + ret ; nc diff --git a/engine/board/spaces.asm b/engine/board/spaces.asm index 4fb44f22f..8bac43304 100755 --- a/engine/board/spaces.asm +++ b/engine/board/spaces.asm @@ -313,273 +313,4 @@ UnionSpaceScript:: call LoadCurSpaceData ret -BackupDisabledSpace:: -; unlike map objects which are backed up when leaving a map, -; a disabled space is backed up immediately when it is disabled. - ld a, [wCurSpace] - push af - - ld hl, wMapGroup - ld d, [hl] - inc hl ; wMapNumber - ld e, [hl] - - ld a, BANK(wDisabledSpacesBackups) - ld [rSVBK], a - - ld hl, wMap1DisabledSpacesBackup - ld bc, wMap2DisabledSpacesBackup - wMap1DisabledSpacesBackup - 2 -.loop - ld a, [hl] - cp GROUP_N_A - jr z, .found_available_entry - and a ; cp $00 (terminator found at wDisabledSpacesBackupsEnd, no more room) - jr z, .done_pop_af - cp d ; wMapDisabledSpacesMapGroup == wMapGroup? - jr nz, .next - inc hl - ld a, [hl] - cp e ; wMapDisabledSpacesMapNumber == wMapNumber? - jr nz, .next2 - inc hl - jr .found_matching_entry -.next - inc hl -.next2 - inc hl - add hl, bc - jr .loop - -.found_available_entry - ld [hl], d ; wMapGroup - inc hl - ld [hl], e ; wMapNumber - inc hl -.found_matching_entry -; mark the space at wCurSpace as disabled in the entry with - pop af - ld e, a - ld d, 0 - ld b, SET_FLAG - call FlagAction - jr .done - -.done_pop_af - pop af -.done - ld a, 1 - ld [rSVBK], a - ret - -LoadDisabledSpaces: -; map setup command (called after the map setup command LoadBlockData) -; load blocks with disabled spaces in the active map, and in each of its connected maps. -; for connected maps, only blocks that are in visible range from the active map, -; i.e. those that appear in wOverworldMapBlocks while in the active map. - ld hl, wMapGroup - ld d, [hl] - inc hl - ld e, [hl] ; wMapNumber - xor a ; active map - ld [wTempByteValue], a - call _LoadDisabledSpaces - - ld hl, wNorthConnectedMapGroup - ld a, [hli] - cp GROUP_N_A - jr z, .south - ld d, a ; wNorthConnectedMapGroup - ld e, [hl] ; wNorthConnectedMapNumber - ld a, 1 ; north connected map - ld [wTempByteValue], a - call _LoadDisabledSpaces -.south - - ld hl, wSouthConnectedMapGroup - ld a, [hli] - cp GROUP_N_A - jr z, .west - ld d, a ; wSouthConnectedMapGroup - ld e, [hl] ; wSouthConnectedMapNumber - ld a, 2 ; south connected map - ld [wTempByteValue], a - call _LoadDisabledSpaces -.west - - ld hl, wWestConnectedMapGroup - ld a, [hli] - cp GROUP_N_A - jr z, .east - ld d, a ; wWestConnectedMapGroup - ld e, [hl] ; wWestConnectedMapNumber - ld a, 3 ; west connected map - ld [wTempByteValue], a - call _LoadDisabledSpaces -.east - - ld hl, wEastConnectedMapGroup - ld a, [hli] - cp GROUP_N_A - jr z, .done - ld d, a ; wEastConnectedMapGroup - ld e, [hl] ; wEastConnectedMapNumber - ld a, 4 ; east connected map - ld [wTempByteValue], a - call _LoadDisabledSpaces -.done - ret - -_LoadDisabledSpaces: - ld a, BANK(wDisabledSpacesBackups) - ld [rSVBK], a - - ld hl, wMap1DisabledSpacesBackup - ld bc, wMap2DisabledSpacesBackup - wMap1DisabledSpacesBackup - 2 -.find_loop - ld a, [hl] - cp GROUP_N_A - jr z, .no_match - and a ; cp $00 (terminator found at wDisabledSpacesBackupsEnd) - jr z, .no_match - cp d - jr nz, .next - inc hl - ld a, [hl] - cp e - jr nz, .next2 - inc hl - jr .found_matching_entry -.next - inc hl -.next2 - inc hl - add hl, bc - jr .find_loop - -.found_matching_entry -; temporarily load wMapScriptsBank, wMapSpacesPointer for this map, -; so that we can later can call LoadTempSpaceData in the context of this map. - ld a, 1 - ld [rSVBK], a - ld a, [wMapGroup] - push af - ld a, [wMapNumber] - push af - ld a, d - ld [wMapGroup], a - ld a, e - ld [wMapNumber], a - push hl - call CopyMapPartialAndAttributesPartial - pop hl - ld a, BANK(wDisabledSpacesBackups) - ld [rSVBK], a - -; loop through all MAX_SPACES_PER_MAP flags and call .ApplyDisabledSpace in the disabled spaces. - xor a -.apply_loop_2 - ld e, [hl] - inc hl -.apply_loop_1 - srl e - call c, .ApplyDisabledSpace - inc a - cp MAX_SPACES_PER_MAP - jr z, .done ; return when all MAX_SPACES_PER_MAP flags checked - ld d, a - and %111 - ld a, d - jr z, .apply_loop_2 ; jump if done with current batch of 8 flags - jr .apply_loop_1 - -.done - ld a, 1 - ld [rSVBK], a -; restore active map attributes - pop af - ld [wMapNumber], a - pop af - ld [wMapGroup], a - call CopyMapPartialAndAttributesPartial - ret - -.no_match - ld a, 1 - ld [rSVBK], a - ret - -.ApplyDisabledSpace: - push af - push de - push hl - ld e, a - ld a, 1 - ld [rSVBK], a - ld a, e ; a = space to apply as disabled - call LoadTempSpaceData - ld hl, .return - push hl - jumptable .Jumptable, wTempByteValue -.return - jr nc, .connected_block_not_in_range - ld a, [hl] - and UNIQUE_SPACE_METATILES_MASK - add FIRST_GREY_SPACE_METATILE - ld [hl], a -.connected_block_not_in_range - ld a, BANK(wDisabledSpacesBackups) - ld [rSVBK], a - pop hl - pop de - pop af - ret - -.Jumptable: - dw .ActiveMap - dw .NorthConnectedMap - dw .SouthConnectedMap - dw .WestConnectedMap - dw .EastConnectedMap - -.ActiveMap: - ld a, [wTempSpaceXCoord] - add 4 - ld d, a - ld a, [wTempSpaceYCoord] - add 4 - ld e, a - call GetBlockLocation - scf - ret - -.NorthConnectedMap: - ld a, [wTempSpaceXCoord] - ld d, a - ld a, [wTempSpaceYCoord] - ld e, a - call GetNorthConnectedBlockLocation - ret - -.SouthConnectedMap: - ld a, [wTempSpaceXCoord] - ld d, a - ld a, [wTempSpaceYCoord] - ld e, a - call GetSouthConnectedBlockLocation - ret - -.WestConnectedMap: - ld a, [wTempSpaceXCoord] - ld d, a - ld a, [wTempSpaceYCoord] - ld e, a - call GetWestConnectedBlockLocation - ret - -.EastConnectedMap: - ld a, [wTempSpaceXCoord] - ld d, a - ld a, [wTempSpaceYCoord] - ld e, a - call GetEastConnectedBlockLocation - ret +INCLUDE "engine/board/disabled_spaces.asm" diff --git a/home/map.asm b/home/map.asm index 38f6d76f8..4d2cefb84 100644 --- a/home/map.asm +++ b/home/map.asm @@ -1992,154 +1992,6 @@ GetBlockLocation:: add hl, bc ret -GetSouthConnectedBlockLocation:: -; ycoord / 2 <= 2 - ld a, e - srl a - cp 3 - ret nc -; [wSouthConnectionStripLocation] - ld hl, wSouthConnectionStripLocation - ld a, [hli] - ld h, [hl] - ld l, a -; + (xcoord / 2) - srl d - ld b, 0 - ld c, d - add hl, bc -; + ([wMapWidth] + 6) * ycoord / 2 - ld a, [wMapWidth] - add 6 - ld c, a - ld b, 0 - srl e - ld a, e - and a - jr z, .done -.loop - add hl, bc - dec a - jr nz, .loop -.done - scf - ret ; c - -GetNorthConnectedBlockLocation:: -; wNorthConnectedMapHeight >= 3 -; ycoord / 2 >= ([wNorthConnectedMapHeight] - 3) - ld a, [wNorthConnectedMapHeight] - sub 3 - jr c, .nope - ld c, a - ld a, e - srl a - sub c - jr c, .nope - ld e, a ; e = ycoord / 2 - ([wNorthConnectedMapHeight] - 3) -; [wNorthConnectionStripLocation] - ld hl, wNorthConnectionStripLocation - ld a, [hli] - ld h, [hl] - ld l, a -; + (xcoord / 2) - srl d - ld b, 0 - ld c, d - add hl, bc -; + ([wMapWidth] + 6) * {ycoord / 2 - ([wNorthConnectedMapHeight] - 3)} --> + ([wMapWidth] + 6) * e - ld a, [wMapWidth] - add 6 - ld c, a - ld b, 0 - ld a, e - and a - jr z, .done -.loop - add hl, bc - dec a - jr nz, .loop -.done - scf - ret ; c -.nope - xor a - ret ; nc - -GetEastConnectedBlockLocation:: -; xcoord / 2 <= 2 - ld a, d - srl a - cp 3 - ret nc -; [wEastConnectionStripLocation] - ld hl, wEastConnectionStripLocation - ld a, [hli] - ld h, [hl] - ld l, a -; + (xcoord / 2) - srl d - ld b, 0 - ld c, d - add hl, bc -; + ([wMapWidth] + 6) * ycoord / 2 - ld a, [wMapWidth] - add 6 - ld c, a - ld b, 0 - srl e - ld a, e - and a - jr z, .done -.loop - add hl, bc - dec a - jr nz, .loop -.done - scf - ret ; c - -GetWestConnectedBlockLocation:: -; wWestConnectedMapWidth >= 3 -; xcoord / 2 >= ([wWestConnectedMapWidth] - 3) - ld a, [wWestConnectedMapWidth] - sub 3 - jr c, .nope - ld c, a - ld a, d - srl a - sub c - jr c, .nope - ld d, a ; d = xcoord / 2 - ([wWestConnectedMapWidth] - 3) -; [wWestConnectionStripLocation] - ld hl, wWestConnectionStripLocation - ld a, [hli] - ld h, [hl] - ld l, a -; + xcoord / 2 - ([wWestConnectedMapWidth] - 3) --> + d - ld c, d - ld b, 0 - add hl, bc -; + ([wMapWidth] + 6) * ycoord / 2 - ld a, [wMapWidth] - add 6 - ld c, a - ld b, 0 - srl e - ld a, e - and a - jr z, .done -.loop - add hl, bc - dec a - jr nz, .loop -.done - scf - ret ; c -.nope - xor a - ret ; nc - CheckAndApplyAnchorPoint:: ; c = [wCurMapAnchorEventCount] (non-0) ; d = [wXCoord]