mirror of
https://github.com/thornAvery/jep-hack.git
synced 2025-10-23 15:27:59 +13:00

This adds Rock Climb functionality to Strong Arm and Dive functionality to Water Sport, as discussed in the server. HMs have been added, but we need 16bit Items to add Wind Ride, and I haven't finished their functionality.
The Rock Climb tile is a bit terrible, it's not easy to notice. Maybe change so that it works well with yellow or another colour?
This does not build due to issues with effect_commands.asm, but since Zeta is meant to be working on the mapping and Water Sport anyway, it seems to be up his alley.
I ported over much of the underwater assets Rangi was using as they looked very pretty. I imagine it'll be fun to utilise going forward. May as well, right?
I shall now lay down in a dark room.
Review: c21561ea71 (diff-5508f3b794fc68821ba35e94b6a293b2aaaa16c02a1b34fac70d03fd2f74c4b2R113)
447 lines
6.8 KiB
NASM
447 lines
6.8 KiB
NASM
HandleNewMap:
|
|
; call ClearUnusedMapBuffer
|
|
call ResetMapBufferEventFlags
|
|
call ResetFlashIfOutOfCave
|
|
call GetCurrentMapSceneID
|
|
call ResetBikeFlags
|
|
call ResetDiveMap
|
|
call ResetMapLockedIDs
|
|
ld a, MAPCALLBACK_NEWMAP
|
|
call RunMapCallback
|
|
HandleContinueMap:
|
|
farcall ClearCmdQueue
|
|
ld a, MAPCALLBACK_CMDQUEUE
|
|
call RunMapCallback
|
|
call GetMapTimeOfDay
|
|
ld [wMapTimeOfDay], a
|
|
ret
|
|
|
|
ResetMapLockedIDs:
|
|
ld e, NUM_MAP_LOCKED_MON_IDS
|
|
.mon_loop
|
|
ld a, LOCKED_MON_ID_MAP_1 - 1
|
|
add a, e
|
|
ld l, a
|
|
xor a
|
|
call LockPokemonID
|
|
dec e
|
|
jr nz, .mon_loop
|
|
ret
|
|
|
|
EnterMapConnection:
|
|
; Return carry if a connection has been entered.
|
|
ld a, [wPlayerStepDirection]
|
|
and a ; DOWN
|
|
jp z, .south
|
|
cp UP
|
|
jp z, .north
|
|
cp LEFT
|
|
jp z, .west
|
|
cp RIGHT
|
|
jp z, .east
|
|
ret
|
|
|
|
.west
|
|
ld a, [wWestConnectedMapGroup]
|
|
ld [wMapGroup], a
|
|
ld a, [wWestConnectedMapNumber]
|
|
ld [wMapNumber], a
|
|
ld a, [wWestConnectionStripXOffset]
|
|
ld [wXCoord], a
|
|
ld a, [wWestConnectionStripYOffset]
|
|
ld hl, wYCoord
|
|
add [hl]
|
|
ld [hl], a
|
|
ld c, a
|
|
ld hl, wWestConnectionWindow
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
srl c
|
|
jr z, .skip_to_load
|
|
ld a, [wWestConnectedMapWidth]
|
|
add 6
|
|
ld e, a
|
|
ld d, 0
|
|
|
|
.loop
|
|
add hl, de
|
|
dec c
|
|
jr nz, .loop
|
|
|
|
.skip_to_load
|
|
ld a, l
|
|
ld [wOverworldMapAnchor], a
|
|
ld a, h
|
|
ld [wOverworldMapAnchor + 1], a
|
|
jp .done
|
|
|
|
.east
|
|
ld a, [wEastConnectedMapGroup]
|
|
ld [wMapGroup], a
|
|
ld a, [wEastConnectedMapNumber]
|
|
ld [wMapNumber], a
|
|
ld a, [wEastConnectionStripXOffset]
|
|
ld [wXCoord], a
|
|
ld a, [wEastConnectionStripYOffset]
|
|
ld hl, wYCoord
|
|
add [hl]
|
|
ld [hl], a
|
|
ld c, a
|
|
ld hl, wEastConnectionWindow
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
srl c
|
|
jr z, .skip_to_load2
|
|
ld a, [wEastConnectedMapWidth]
|
|
add 6
|
|
ld e, a
|
|
ld d, 0
|
|
|
|
.loop2
|
|
add hl, de
|
|
dec c
|
|
jr nz, .loop2
|
|
|
|
.skip_to_load2
|
|
ld a, l
|
|
ld [wOverworldMapAnchor], a
|
|
ld a, h
|
|
ld [wOverworldMapAnchor + 1], a
|
|
jp .done
|
|
|
|
.north
|
|
ld a, [wNorthConnectedMapGroup]
|
|
ld [wMapGroup], a
|
|
ld a, [wNorthConnectedMapNumber]
|
|
ld [wMapNumber], a
|
|
ld a, [wNorthConnectionStripYOffset]
|
|
ld [wYCoord], a
|
|
ld a, [wNorthConnectionStripXOffset]
|
|
ld hl, wXCoord
|
|
add [hl]
|
|
ld [hl], a
|
|
ld c, a
|
|
ld hl, wNorthConnectionWindow
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
ld b, 0
|
|
srl c
|
|
add hl, bc
|
|
ld a, l
|
|
ld [wOverworldMapAnchor], a
|
|
ld a, h
|
|
ld [wOverworldMapAnchor + 1], a
|
|
jp .done
|
|
|
|
.south
|
|
ld a, [wSouthConnectedMapGroup]
|
|
ld [wMapGroup], a
|
|
ld a, [wSouthConnectedMapNumber]
|
|
ld [wMapNumber], a
|
|
ld a, [wSouthConnectionStripYOffset]
|
|
ld [wYCoord], a
|
|
ld a, [wSouthConnectionStripXOffset]
|
|
ld hl, wXCoord
|
|
add [hl]
|
|
ld [hl], a
|
|
ld c, a
|
|
ld hl, wSouthConnectionWindow
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
ld b, 0
|
|
srl c
|
|
add hl, bc
|
|
ld a, l
|
|
ld [wOverworldMapAnchor], a
|
|
ld a, h
|
|
ld [wOverworldMapAnchor + 1], a
|
|
.done
|
|
scf
|
|
ret
|
|
|
|
EnterMapWarp:
|
|
call .SaveDigWarp
|
|
call .SetSpawn
|
|
ld a, [wNextWarp]
|
|
ld [wWarpNumber], a
|
|
ld a, [wNextMapGroup]
|
|
ld [wMapGroup], a
|
|
ld a, [wNextMapNumber]
|
|
ld [wMapNumber], a
|
|
ret
|
|
|
|
.SaveDigWarp:
|
|
call GetMapEnvironment
|
|
call CheckOutdoorMap
|
|
ret nz
|
|
ld a, [wNextMapGroup]
|
|
ld b, a
|
|
ld a, [wNextMapNumber]
|
|
ld c, a
|
|
call GetAnyMapEnvironment
|
|
call CheckIndoorMap
|
|
ret nz
|
|
|
|
; MOUNT_MOON_SQUARE and TIN_TOWER_ROOF are outdoor maps within indoor maps.
|
|
; Dig and Escape Rope should not take you to them.
|
|
ld a, [wPrevMapGroup]
|
|
cp GROUP_MOUNT_MOON_SQUARE
|
|
jr nz, .not_mt_moon_square_or_tin_tower_roof
|
|
assert GROUP_MOUNT_MOON_SQUARE == GROUP_TIN_TOWER_ROOF
|
|
ld a, [wPrevMapNumber]
|
|
cp MAP_MOUNT_MOON_SQUARE
|
|
ret z
|
|
cp MAP_TIN_TOWER_ROOF
|
|
ret z
|
|
.not_mt_moon_square_or_tin_tower_roof
|
|
|
|
ld a, [wPrevWarp]
|
|
ld [wDigWarpNumber], a
|
|
ld a, [wPrevMapGroup]
|
|
ld [wDigMapGroup], a
|
|
ld a, [wPrevMapNumber]
|
|
ld [wDigMapNumber], a
|
|
ret
|
|
|
|
.SetSpawn:
|
|
call GetMapEnvironment
|
|
call CheckOutdoorMap
|
|
ret nz
|
|
ld a, [wNextMapGroup]
|
|
ld b, a
|
|
ld a, [wNextMapNumber]
|
|
ld c, a
|
|
call GetAnyMapEnvironment
|
|
call CheckIndoorMap
|
|
ret nz
|
|
ld a, [wNextMapGroup]
|
|
ld b, a
|
|
ld a, [wNextMapNumber]
|
|
ld c, a
|
|
|
|
; Respawn in Pokémon Centers.
|
|
call GetAnyMapTileset
|
|
ld a, c
|
|
cp TILESET_POKECENTER
|
|
jr z, .pokecenter_pokecom
|
|
cp TILESET_POKECOM_CENTER
|
|
jr z, .pokecenter_pokecom
|
|
ret
|
|
.pokecenter_pokecom
|
|
|
|
ld a, [wPrevMapGroup]
|
|
ld [wLastSpawnMapGroup], a
|
|
ld a, [wPrevMapNumber]
|
|
ld [wLastSpawnMapNumber], a
|
|
ret
|
|
|
|
LoadMapTimeOfDay:
|
|
ld hl, wVramState
|
|
res 6, [hl]
|
|
ld a, $1
|
|
ld [wSpriteUpdatesEnabled], a
|
|
farcall ReplaceTimeOfDayPals
|
|
farcall UpdateTimeOfDayPal
|
|
call OverworldTextModeSwitch
|
|
call .ClearBGMap
|
|
call .PushAttrmap
|
|
ret
|
|
|
|
.ClearBGMap:
|
|
ld a, HIGH(vBGMap0)
|
|
ld [wBGMapAnchor + 1], a
|
|
xor a ; LOW(vBGMap0)
|
|
ld [wBGMapAnchor], a
|
|
ldh [hSCY], a
|
|
ldh [hSCX], a
|
|
farcall ApplyBGMapAnchorToObjects
|
|
|
|
ldh a, [rVBK]
|
|
push af
|
|
ld a, $1
|
|
ldh [rVBK], a
|
|
|
|
xor a
|
|
ld bc, vBGMap1 - vBGMap0
|
|
hlbgcoord 0, 0
|
|
call ByteFill
|
|
|
|
pop af
|
|
ldh [rVBK], a
|
|
|
|
ld a, "■"
|
|
ld bc, vBGMap1 - vBGMap0
|
|
hlbgcoord 0, 0
|
|
call ByteFill
|
|
ret
|
|
|
|
.PushAttrmap:
|
|
decoord 0, 0
|
|
call .copy
|
|
ldh a, [hCGB]
|
|
and a
|
|
ret z
|
|
|
|
decoord 0, 0, wAttrmap
|
|
ld a, $1
|
|
ldh [rVBK], a
|
|
.copy
|
|
hlbgcoord 0, 0
|
|
ld c, SCREEN_WIDTH
|
|
ld b, SCREEN_HEIGHT
|
|
.row
|
|
push bc
|
|
.column
|
|
ld a, [de]
|
|
inc de
|
|
ld [hli], a
|
|
dec c
|
|
jr nz, .column
|
|
ld bc, BG_MAP_WIDTH - SCREEN_WIDTH
|
|
add hl, bc
|
|
pop bc
|
|
dec b
|
|
jr nz, .row
|
|
ld a, $0
|
|
ldh [rVBK], a
|
|
ret
|
|
|
|
LoadMapGraphics:
|
|
call LoadMapTileset
|
|
call LoadTilesetGFX
|
|
xor a
|
|
ldh [hMapAnims], a
|
|
xor a
|
|
ldh [hTileAnimFrame], a
|
|
farcall RefreshSprites
|
|
call LoadFontsExtra
|
|
farcall LoadOverworldFont
|
|
ret
|
|
|
|
LoadMapPalettes:
|
|
ld b, SCGB_MAPPALS
|
|
jp GetSGBLayout
|
|
|
|
RefreshMapSprites:
|
|
call ClearSprites
|
|
farcall InitMapNameSign
|
|
call GetMovementPermissions
|
|
farcall RefreshPlayerSprite
|
|
farcall CheckUpdatePlayerSprite
|
|
ld hl, wPlayerSpriteSetupFlags
|
|
bit PLAYERSPRITESETUP_SKIP_RELOAD_GFX_F, [hl]
|
|
jr nz, .skip
|
|
ld hl, wVramState
|
|
set 0, [hl]
|
|
call SafeUpdateSprites
|
|
.skip
|
|
ld a, [wPlayerSpriteSetupFlags]
|
|
and (1 << PLAYERSPRITESETUP_FEMALE_TO_MALE_F) | (1 << 3) | (1 << 4)
|
|
ld [wPlayerSpriteSetupFlags], a
|
|
ret
|
|
|
|
CheckMovingOffEdgeOfMap::
|
|
ld a, [wPlayerStepDirection]
|
|
cp STANDING
|
|
ret z
|
|
and a ; DOWN
|
|
jr z, .down
|
|
cp UP
|
|
jr z, .up
|
|
cp LEFT
|
|
jr z, .left
|
|
cp RIGHT
|
|
jr z, .right
|
|
and a
|
|
ret
|
|
|
|
.down
|
|
ld a, [wPlayerMapY]
|
|
sub 4
|
|
ld b, a
|
|
ld a, [wMapHeight]
|
|
add a
|
|
cp b
|
|
jr z, .ok
|
|
and a
|
|
ret
|
|
|
|
.up
|
|
ld a, [wPlayerMapY]
|
|
sub 4
|
|
cp -1
|
|
jr z, .ok
|
|
and a
|
|
ret
|
|
|
|
.left
|
|
ld a, [wPlayerMapX]
|
|
sub 4
|
|
cp -1
|
|
jr z, .ok
|
|
and a
|
|
ret
|
|
|
|
.right
|
|
ld a, [wPlayerMapX]
|
|
sub 4
|
|
ld b, a
|
|
ld a, [wMapWidth]
|
|
add a
|
|
cp b
|
|
jr z, .ok
|
|
and a
|
|
ret
|
|
|
|
.ok
|
|
scf
|
|
ret
|
|
|
|
GetMapScreenCoords::
|
|
ld hl, wOverworldMapBlocks
|
|
ld a, [wXCoord]
|
|
bit 0, a
|
|
jr nz, .odd_x
|
|
; even x
|
|
srl a
|
|
add 1
|
|
jr .got_block_x
|
|
.odd_x
|
|
add 1
|
|
srl a
|
|
.got_block_x
|
|
ld c, a
|
|
ld b, 0
|
|
add hl, bc
|
|
ld a, [wMapWidth]
|
|
add MAP_CONNECTION_PADDING_WIDTH * 2
|
|
ld c, a
|
|
ld b, 0
|
|
ld a, [wYCoord]
|
|
bit 0, a
|
|
jr nz, .odd_y
|
|
; even y
|
|
srl a
|
|
add 1
|
|
jr .got_block_y
|
|
.odd_y
|
|
add 1
|
|
srl a
|
|
.got_block_y
|
|
call AddNTimes
|
|
ld a, l
|
|
ld [wOverworldMapAnchor], a
|
|
ld a, h
|
|
ld [wOverworldMapAnchor + 1], a
|
|
ld a, [wYCoord]
|
|
and 1
|
|
ld [wPlayerMetatileY], a
|
|
ld a, [wXCoord]
|
|
and 1
|
|
ld [wPlayerMetatileX], a
|
|
ret
|