summaryrefslogtreecommitdiff
path: root/engine/overworld/overworld.asm
diff options
context:
space:
mode:
authorDaniel Harding <33dannye@gmail.com>2020-05-16 21:42:24 -0500
committerGitHub <noreply@github.com>2020-05-16 21:42:24 -0500
commit8a924f1f783572ff395f617f99546b4c949c8b04 (patch)
tree1b6c7de331cb983256651b11b8adf413a3a434f1 /engine/overworld/overworld.asm
parent88d7e9a34a8b610b358cec1ccc6660634ca9ce80 (diff)
parented94962edf1668aba3f60938e8a5ba8040e2a59c (diff)
Merge pull request #30 from entrpntr/spring-cleaning
Spring Cleaning
Diffstat (limited to 'engine/overworld/overworld.asm')
-rw-r--r--engine/overworld/overworld.asm494
1 files changed, 494 insertions, 0 deletions
diff --git a/engine/overworld/overworld.asm b/engine/overworld/overworld.asm
new file mode 100644
index 00000000..05b15ea9
--- /dev/null
+++ b/engine/overworld/overworld.asm
@@ -0,0 +1,494 @@
+_ReplaceChrisSprite::
+ call GetChrisSprite
+ ld a, [wUsedSprites]
+ ld c, a
+ ld a, [wUsedSprites + 1]
+ ld b, a
+ call GetUsedSprite
+ ret
+
+_RefreshSprites::
+ ld hl, wSpriteFlags
+ ld a, [hl]
+ push af
+ res 7, [hl]
+ set 6, [hl]
+ call LoadUsedSpritesGFX
+ pop af
+ ld [wSpriteFlags], a
+ ret
+
+_ClearSprites::
+ ld hl, wSpriteFlags
+ ld a, [hl]
+ push af
+ set 7, [hl]
+ res 6, [hl]
+ call LoadUsedSpritesGFX
+ pop af
+ ld [wSpriteFlags], a
+ ret
+
+RefreshSprites::
+ call .Refresh
+ call LoadUsedSpritesGFX
+ ret
+
+.Refresh:
+ xor a
+ ld bc, SPRITE_GFX_LIST_CAPACITY * 2
+ ld hl, wUsedSprites
+ call ByteFill
+ call GetChrisSprite
+ call AddMapSprites
+ ret
+
+GetChrisSprite:
+ ld a, [wPlayerState]
+ ld c, a
+; Get Chris's sprite.
+ ld hl, ChrisStateSprites
+.loop
+ ld a, [hli]
+ cp c
+ jr z, .good
+ inc hl
+ cp -1
+ jr nz, .loop
+
+; Any player state not in the array defaults to Chris's sprite.
+ xor a ; ld a, PLAYER_NORMAL
+ ld [wPlayerState], a
+ ld a, SPRITE_CHRIS
+ jr .finish
+
+.good
+ ld a, [hl]
+
+.finish
+ ld [wUsedSprites + 0], a
+ ld [wPlayerSprite], a
+ ld [wPlayerObjectSprite], a
+ ret
+
+INCLUDE "data/sprites/player_sprites.asm"
+
+AddMapSprites:
+ call GetMapEnvironment
+ call CheckOutdoorMap
+ jr z, .outdoor
+ call AddIndoorSprites
+ ret
+
+.outdoor
+ call AddOutdoorSprites
+ ret
+
+AddIndoorSprites:
+ ld hl, wMap2ObjectSprite
+ ld a, 2
+.loop
+ push af
+ ld a, [hl]
+ call AddSpriteGFX
+ ld de, MAPOBJECT_LENGTH
+ add hl, de
+ pop af
+ inc a
+ cp NUM_OBJECTS
+ jr nz, .loop
+ ret
+
+AddOutdoorSprites:
+ ld a, [wMapGroup]
+ dec a
+ ld c, a
+ ld b, 0
+ ld hl, OutdoorSprites
+ add hl, bc
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld c, MAX_OUTDOOR_SPRITES
+.loop
+ push bc
+ ld a, [hli]
+ call AddSpriteGFX
+ pop bc
+ dec c
+ jr nz, .loop
+
+ ld a, [wUnusedD05A]
+ ld c, a
+ ret
+
+AddSpriteGFX:
+ and a
+ ret z
+ ld c, a
+ call _DoesSpriteHaveFacings
+ jr nc, .nope
+ ld de, wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 2) * 2
+ ld b, 2
+ call .Loop
+ jr nc, .ok
+.nope
+ ld de, wUsedSprites + 2
+ ld b, SPRITE_GFX_LIST_CAPACITY - 3
+ call .Loop
+ jr .ok
+.ok:
+ ret
+
+.Loop:
+ ld a, [de]
+ and a
+ jr z, .new
+ cp c
+ jr z, .exists
+ inc de
+ inc de
+ dec b
+ jr nz, .Loop
+ scf
+ ret
+.new:
+ ld a, c
+ ld [de], a
+ xor a
+ ret
+.exists:
+ xor a
+ ret
+
+LoadUsedSpritesGFX:
+ ld a, MAPCALLBACK_SPRITES
+ call RunMapCallback
+ call GetUsedSprites
+ ret c
+
+ call _LoadMiscTiles
+ call LoadMiscTiles
+ ret
+
+GetUsedSprites:
+ xor a
+ ldh [hUsedSpriteTile], a
+ ld hl, wUsedSprites
+ ld a, SPRITE_GFX_LIST_CAPACITY - 2
+
+.loop
+ push af
+ ld a, [hli]
+ ldh [hUsedSpriteIndex], a
+ and a
+ jr z, .dont_set
+
+ call GetSprite
+ push hl
+ push bc
+ ldh a, [hUsedSpriteTile]
+ call CopyToVram
+ pop bc
+ pop hl
+ ldh a, [hUsedSpriteTile]
+ ld [hl], a
+ add c
+ ldh [hUsedSpriteTile], a
+ cp $80
+ jr nc, .done
+
+.dont_set
+ inc hl
+ pop af
+ dec a
+ jr nz, .loop
+
+ xor a
+ ret
+
+.done
+ pop af
+ scf
+ ret
+
+_LoadMiscTiles:
+ ld a, [wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 2) * 2]
+ and a
+ jr z, .asm_14274
+
+ call GetSprite
+ ld hl, vTiles0 tile $78
+ call Get2bpp
+
+.asm_14274
+ ld a, $78
+ ld [wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 2) * 2 + 1], a
+ ld a, [wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 1) * 2]
+ and a
+ jr z, .asm_14288
+
+ call GetSprite
+ ld hl, vTiles0 tile $7c
+ call Get2bpp
+
+.asm_14288
+ ld a, $7c
+ ld [wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 1) * 2 + 1], a
+ ret
+
+LoadMiscTiles:
+ ld a, [wSpriteFlags]
+ bit 6, a
+ ret nz
+
+ ld c, EMOTE_SHADOW
+ farcall LoadEmote
+ call GetMapEnvironment
+ call CheckOutdoorMap
+ ld c, EMOTE_GRASS_RUSTLE
+ jr z, .outdoor
+ ld c, EMOTE_BOULDER_DUST
+.outdoor
+ farcall LoadEmote
+ ret
+
+GetSprite:
+ call GetMonSprite
+ ret c
+
+ push hl
+ ld hl, OverworldSprites + SPRITEDATA_ADDR
+ dec a
+ ld c, a
+ ld b, 0
+ ld a, NUM_SPRITEDATA_FIELDS
+ call AddNTimes
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ swap a
+ ld c, a
+ ld b, [hl]
+ pop hl
+ ret
+
+GetMonSprite:
+; Return carry if a monster sprite was loaded.
+
+ cp SPRITE_POKEMON
+ jr c, .Normal
+ cp SPRITE_DAY_CARE_MON_1
+ jr z, .BreedMon1
+ cp SPRITE_DAY_CARE_MON_2
+ jr z, .BreedMon2
+ cp SPRITE_VARS
+ jr nc, .Variable
+ jr .Icon
+
+.Normal:
+ and a
+ ret
+
+.Icon:
+ push hl
+ sub SPRITE_POKEMON
+ ld e, a
+ ld d, 0
+ ld hl, SpriteMons
+ add hl, de
+ ld a, [hl]
+ pop hl
+ jr .Mon
+
+.BreedMon1
+ ld a, [wBreedMon1Species]
+ jr .Mon
+
+.BreedMon2
+ ld a, [wBreedMon2Species]
+
+.Mon:
+ ld e, a
+ and a
+ jr z, .NoBreedmon
+
+ push hl
+ farcall LoadOverworldMonIcon
+ pop hl
+
+ scf
+ ret
+
+.Variable:
+ push hl
+ sub SPRITE_VARS
+ ld e, a
+ ld d, 0
+ ld hl, wVariableSprites
+ add hl, de
+ ld a, [hl]
+ pop hl
+ and a
+ jp nz, GetMonSprite
+
+.NoBreedmon:
+ ld a, 1
+ and a
+ ret
+
+_DoesSpriteHaveFacings::
+; Checks to see whether we can apply a facing to a sprite.
+; Returns carry unless the sprite is a Pokemon or a Still Sprite.
+ cp SPRITE_POKEMON
+ jr nc, .only_down
+
+ push hl
+ push bc
+ ld hl, OverworldSprites + SPRITEDATA_TYPE
+ dec a
+ ld c, a
+ ld b, 0
+ ld a, NUM_SPRITEDATA_FIELDS
+ call AddNTimes
+ ld a, [hl]
+ pop bc
+ pop hl
+ cp STILL_SPRITE
+ jr nz, .only_down
+ scf
+ ret
+
+.only_down
+ and a
+ ret
+
+_GetSpritePalette::
+ ld a, c
+ call GetMonSprite
+ jr c, .is_pokemon
+
+ ld hl, OverworldSprites + SPRITEDATA_PALETTE
+ dec a
+ ld c, a
+ ld b, 0
+ ld a, NUM_SPRITEDATA_FIELDS
+ call AddNTimes
+ ld c, [hl]
+ ret
+
+.is_pokemon
+ xor a
+ ld c, a
+ ret
+
+CopyToVram:
+ ld l, a
+ ld h, 0
+rept 4
+ add hl, hl
+endr
+ ld a, l
+ add LOW(vTiles0)
+ ld l, a
+ ld a, h
+ adc HIGH(vTiles0)
+ ld h, a
+ push hl
+ push de
+ push bc
+ ld a, [wSpriteFlags]
+ bit 7, a
+ jr nz, .skip
+ call Get2bpp
+
+.skip:
+ pop bc
+ ld l, c
+ ld h, 0
+rept 4
+ add hl, hl
+endr
+ pop de
+ add hl, de
+ ld e, l
+ ld d, h
+ pop hl
+ ld a, h
+ add HIGH(vTiles1 - vTiles0)
+ ld h, a
+ ldh a, [hUsedSpriteIndex]
+ call _DoesSpriteHaveFacings
+ jr c, .done
+
+ ld a, [wSpriteFlags]
+ bit 6, a
+ jr nz, .done
+
+ call Get2bpp
+
+.done:
+ ret
+
+Unreferenced_Function1438a:
+ ld a, c
+ jr GetUsedSprite
+
+ ld a, c
+ ld b, 0
+ jr GetUsedSprite
+
+ ld a, c
+ ld b, SPRITE_GFX_LIST_CAPACITY
+ jr GetUsedSprite
+
+GetUsedSprite:
+ push bc
+ ld a, c
+ ldh [hUsedSpriteIndex], a
+ call GetSprite
+ pop af
+ call CopyToVram
+ ret
+
+LoadEmote::
+; Get the address of the pointer to emote c.
+ ld a, c
+ ld bc, 6 ; sizeof(emote)
+ ld hl, Emotes
+ call AddNTimes
+; Load the emote address into de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+; load the length of the emote (in tiles) into c
+ inc hl
+ ld c, [hl]
+ swap c
+; load the emote pointer bank into b
+ inc hl
+ ld b, [hl]
+; load the VRAM destination into hl
+ inc hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+; if the emote has a length of 0, do not proceed (error handling)
+ ld a, c
+ and a
+ ret z
+ call Get2bpp
+ ret
+
+INCLUDE "data/sprites/emotes.asm"
+
+INCLUDE "gfx/emotes.asm"
+
+INCLUDE "data/sprites/sprite_mons.asm"
+
+INCLUDE "data/maps/outdoor_sprites.asm"
+
+INCLUDE "data/sprites/sprites.asm"