summaryrefslogtreecommitdiff
path: root/src/engine/scenes.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/scenes.asm')
-rw-r--r--src/engine/scenes.asm528
1 files changed, 528 insertions, 0 deletions
diff --git a/src/engine/scenes.asm b/src/engine/scenes.asm
new file mode 100644
index 0000000..f7c7b42
--- /dev/null
+++ b/src/engine/scenes.asm
@@ -0,0 +1,528 @@
+; input:
+; a = scene ID (SCENE_* constant)
+; b = base X position of scene in tiles
+; c = base Y position of scene in tiles
+_LoadScene:
+ push hl
+ push bc
+ push de
+ ld e, a
+ ld a, [wCurTilemap]
+ push af
+ ld a, [wd291]
+ push af
+ ld a, e
+ push bc
+ push af
+ ld a, b
+ add a
+ add a
+ add a
+ add $08
+ ld [wSceneBaseX], a
+ ld a, c
+ add a
+ add a
+ add a
+ add $10
+ ld [wSceneBaseY], a
+ pop af
+ add a
+ ld c, a
+ ld b, 0
+ ld hl, ScenePointers
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [hli]
+ ld [wSceneSGBPacketPtr], a
+ ld a, [hli]
+ ld [wSceneSGBPacketPtr + 1], a
+ ld a, [hli]
+ ld [wSceneSGBRoutinePtr], a
+ ld a, [hli]
+ ld [wSceneSGBRoutinePtr + 1], a
+ call LoadScene_LoadCompressedSGBPacket
+ ld a, %11100100
+ ld [wBGP], a
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ ld a, [hli]
+ jr nz, .not_cgb_1
+ ld a, [hl]
+.not_cgb_1
+ inc hl
+ push af ; palette
+ xor a
+ ld [wd4ca], a
+ ld a, [hli]
+ ld [wd4cb], a ; palette offset
+ ld [wd291], a ; palette offset
+ pop af ; palette
+ farcall SetBGPAndLoadedPal ; load palette
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ ld a, [hli]
+ jr nz, .not_cgb_2
+ ld a, [hl]
+.not_cgb_2
+ inc hl
+ ld [wCurTilemap], a
+ pop bc
+ push bc
+ farcall LoadTilemap_ToVRAM
+ pop bc ; base x,y
+ call LoadScene_LoadSGBPacket
+ ld a, [hli]
+ ld [wd4ca], a ; tile offset
+ ld a, [hli]
+ ld [wd4cb], a ; vram0 or vram1
+ farcall LoadTilesetGfx
+.next_sprite
+ ld a, [hli]
+ or a
+ jr z, .done ; no sprite
+ ld [wSceneSprite], a
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ ld a, [hli]
+ jr nz, .not_cgb_3
+ ld a, [hl]
+.not_cgb_3
+ inc hl
+ push af ; sprite palette
+ xor a
+ ld [wd4ca], a
+ ld a, [hli]
+ ld [wd4cb], a ; palette offset
+ pop af ; sprite palette
+ farcall LoadPaletteData
+.next_animation
+ ld a, [hli]
+ or a
+ jr z, .next_sprite
+ dec hl
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ ld a, [hli]
+ jr nz, .not_cgb_4
+ ld a, [hl]
+.not_cgb_4
+ inc hl
+ ld [wSceneSpriteAnimation], a
+ ld a, [wSceneSprite]
+ farcall CreateSpriteAndAnimBufferEntry
+ ld a, [wWhichSprite]
+ ld [wSceneSpriteIndex], a
+ push hl
+ ld c, SPRITE_ANIM_COORD_X
+ call GetSpriteAnimBufferProperty
+ ld e, l
+ ld d, h
+ pop hl
+ ld a, [wSceneBaseX]
+ add [hl]
+ ld [de], a
+ inc hl
+ inc de
+ ld a, [wSceneBaseY]
+ add [hl]
+ ld [de], a
+ inc hl
+ ld a, [wSceneSpriteAnimation]
+ cp $ff
+ jr z, .no_animation
+ farcall StartSpriteAnimation
+.no_animation
+ jr .next_animation
+.done
+ pop af
+ ld [wd291], a
+ pop af
+ ld [wCurTilemap], a
+ pop de
+ pop bc
+ pop hl
+ ret
+
+INCLUDE "data/scenes.asm"
+
+LoadScene_LoadCompressedSGBPacket:
+ ld a, [wConsole]
+ cp CONSOLE_SGB
+ ret nz
+ push hl
+ ld hl, wSceneSGBPacketPtr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ or h
+ jr z, .skip
+ farcall Func_703cb
+.skip
+ pop hl
+ ret
+
+LoadScene_LoadSGBPacket:
+ ld a, [wConsole]
+ cp CONSOLE_SGB
+ ret nz
+ push hl
+ push bc
+ push de
+ ld hl, wSceneSGBPacketPtr
+ ld a, [hli]
+ or [hl]
+ jr z, .done
+ ld hl, wSceneSGBRoutinePtr + 1
+ ld a, [hld]
+ or [hl]
+ jr z, .use_default
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call CallHL2
+ jr .done
+.use_default
+ ld l, %001010 ; outside, border, inside palette numbers
+ ld a, [wBGMapWidth]
+ ld d, a
+ ld a, [wBGMapHeight]
+ ld e, a
+ farcall Func_70498
+.done
+ pop de
+ pop bc
+ pop hl
+ ret
+
+LoadScene_SetGameBoyPrinterAttrBlk:
+ push hl
+ push bc
+ push de
+ ld hl, SGBPacket_GameBoyPrinter
+ call SendSGB
+ pop de
+ pop bc
+ pop hl
+ ret
+
+SGBPacket_GameBoyPrinter:
+ sgb ATTR_BLK, 1
+ db 1 ; number of data sets
+ db ATTR_BLK_CTRL_OUTSIDE | ATTR_BLK_CTRL_LINE | ATTR_BLK_CTRL_INSIDE
+ db %101111 ; Color Palette Designation
+ db 11 ; x1
+ db 0 ; y1
+ db 16 ; x2
+ db 9 ; y2
+ ds 6 ; data set 2
+ ds 2 ; data set 3
+
+LoadScene_SetCardPopAttrBlk:
+ push hl
+ push bc
+ push de
+ ld hl, SGBPacket_CardPop
+ call SendSGB
+ pop de
+ pop bc
+ pop hl
+ ret
+
+SGBPacket_CardPop:
+ sgb ATTR_BLK, 1
+ db 1 ; number of data sets
+ db ATTR_BLK_CTRL_OUTSIDE | ATTR_BLK_CTRL_LINE | ATTR_BLK_CTRL_INSIDE
+ db %101111 ; Color Palette Designation
+ db 0 ; x1
+ db 0 ; y1
+ db 19 ; x2
+ db 4 ; y3
+ ds 6 ; data set 2
+ ds 2 ; data set 3
+
+Func_12fc6:
+ ld a, [wd291]
+ push af
+ push de
+ push bc
+ lb de, $d0, $07
+ ld a, [wCurTilemap]
+ cp TILEMAP_PLAYER
+ jr z, .asm_12fd9
+ lb de, $a0, $06
+.asm_12fd9
+ ld a, e
+ ld [wd291], a
+ farcall LoadTilemap_ToVRAM
+ ld a, [wd61e]
+ add a
+ add a
+ ld c, a
+ ld b, $00
+ ld hl, PortraitGfxData
+ add hl, bc
+ ld a, [hli]
+ push hl
+ ld [wCurTileset], a
+ ld a, d
+ ld [wd4ca], a
+ xor a
+ ld [wd4cb], a
+ farcall LoadTilesetGfx
+ pop hl
+ xor a
+ ld [wd4ca], a
+ ld a, [wd291]
+ ld [wd4cb], a
+ ld a, [hli]
+ push hl
+ farcall SetBGPAndLoadedPal
+ pop hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop bc
+ farcall SendSGBPortraitPalettes
+ pop de
+ pop af
+ ld [wd291], a
+ ret
+
+PortraitGfxData:
+ db TILESET_PLAYER, PALETTE_119
+ dw SGBData_PlayerPortraitPals
+
+ db TILESET_PLAYER, PALETTE_119
+ dw SGBData_PlayerPortraitPals
+
+ db TILESET_RONALD, PALETTE_121
+ dw SGBData_RonaldPortraitPals
+
+ db TILESET_SAM, PALETTE_122
+ dw SGBData_SamPortraitPals
+
+ db TILESET_IMAKUNI, PALETTE_123
+ dw SGBData_ImakuniPortraitPals
+
+ db TILESET_NIKKI, PALETTE_124
+ dw SGBData_NikkiPortraitPals
+
+ db TILESET_RICK, PALETTE_125
+ dw SGBData_RickPortraitPals
+
+ db TILESET_KEN, PALETTE_126
+ dw SGBData_KenPortraitPals
+
+ db TILESET_AMY, PALETTE_127
+ dw SGBData_AmyPortraitPals
+
+ db TILESET_ISAAC, PALETTE_128
+ dw SGBData_IsaacPortraitPals
+
+ db TILESET_MITCH, PALETTE_129
+ dw SGBData_MitchPortraitPals
+
+ db TILESET_GENE, PALETTE_130
+ dw SGBData_GenePortraitPals
+
+ db TILESET_MURRAY, PALETTE_131
+ dw SGBData_MurrayPortraitPals
+
+ db TILESET_COURTNEY, PALETTE_132
+ dw SGBData_CourtneyPortraitPals
+
+ db TILESET_STEVE, PALETTE_133
+ dw SGBData_StevePortraitPals
+
+ db TILESET_JACK, PALETTE_134
+ dw SGBData_JackPortraitPals
+
+ db TILESET_ROD, PALETTE_135
+ dw SGBData_RodPortraitPals
+
+ db TILESET_JOSEPH, PALETTE_136
+ dw SGBData_JosephPortraitPals
+
+ db TILESET_DAVID, PALETTE_137
+ dw SGBData_DavidPortraitPals
+
+ db TILESET_ERIK, PALETTE_138
+ dw SGBData_ErikPortraitPals
+
+ db TILESET_JOHN, PALETTE_139
+ dw SGBData_JohnPortraitPals
+
+ db TILESET_ADAM, PALETTE_140
+ dw SGBData_AdamPortraitPals
+
+ db TILESET_JONATHAN, PALETTE_141
+ dw SGBData_JonathanPortraitPals
+
+ db TILESET_JOSHUA, PALETTE_142
+ dw SGBData_JoshuaPortraitPals
+
+ db TILESET_NICHOLAS, PALETTE_143
+ dw SGBData_NicholasPortraitPals
+
+ db TILESET_BRANDON, PALETTE_144
+ dw SGBData_BrandonPortraitPals
+
+ db TILESET_MATTHEW, PALETTE_145
+ dw SGBData_MatthewPortraitPals
+
+ db TILESET_RYAN, PALETTE_146
+ dw SGBData_RyanPortraitPals
+
+ db TILESET_ANDREW, PALETTE_147
+ dw SGBData_AndrewPortraitPals
+
+ db TILESET_CHRIS, PALETTE_148
+ dw SGBData_ChrisPortraitPals
+
+ db TILESET_MICHAEL, PALETTE_149
+ dw SGBData_MichaelPortraitPals
+
+ db TILESET_DANIEL, PALETTE_150
+ dw SGBData_DanielPortraitPals
+
+ db TILESET_ROBERT, PALETTE_151
+ dw SGBData_RobertPortraitPals
+
+ db TILESET_BRITTANY, PALETTE_152
+ dw SGBData_BrittanyPortraitPals
+
+ db TILESET_KRISTIN, PALETTE_153
+ dw SGBData_KristinPortraitPals
+
+ db TILESET_HEATHER, PALETTE_154
+ dw SGBData_HeatherPortraitPals
+
+ db TILESET_SARA, PALETTE_155
+ dw SGBData_SaraPortraitPals
+
+ db TILESET_AMANDA, PALETTE_156
+ dw SGBData_AmandaPortraitPals
+
+ db TILESET_JENNIFER, PALETTE_157
+ dw SGBData_JenniferPortraitPals
+
+ db TILESET_JESSICA, PALETTE_158
+ dw SGBData_JessicaPortraitPals
+
+ db TILESET_STEPHANIE, PALETTE_159
+ dw SGBData_StephaniePortraitPals
+
+ db TILESET_AARON, PALETTE_160
+ dw SGBData_AaronPortraitPals
+
+ db TILESET_PLAYER, PALETTE_120
+ dw SGBData_LinkOpponentPortraitPals
+
+LoadBoosterGfx:
+ push hl
+ push bc
+ push de
+ ld e, a
+ ld a, [wCurTilemap]
+ push af
+ push bc
+ ld a, e
+ call _LoadScene
+ call FlushAllPalettes
+ call SetBoosterLogoOAM
+ pop bc
+ pop af
+ ld [wCurTilemap], a
+ pop de
+ pop bc
+ pop hl
+ ret
+
+SetBoosterLogoOAM:
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ ret nz
+ push hl
+ push bc
+ push de
+ push bc
+ xor a
+ ld [wd4cb], a
+ ld [wd4ca], a
+ ld a, SPRITE_BOOSTER_PACK_OAM
+ farcall Func_8025b
+ pop bc
+ call ZeroObjectPositions
+ ld hl, BoosterLogoOAM
+ ld c, [hl]
+ inc hl
+.oam_loop
+ push bc
+ ldh a, [hSCX]
+ ld d, a
+ ldh a, [hSCY]
+ ld e, a
+ ld a, [wSceneBaseY]
+ sub e
+ add [hl]
+ ld e, a
+ inc hl
+ ld a, [wSceneBaseX]
+ sub d
+ add [hl]
+ ld d, a
+ inc hl
+ ld a, [wd61f]
+ add [hl]
+ ld c, a
+ inc hl
+ ld b, [hl]
+ inc hl
+ call SetOneObjectAttributes
+ pop bc
+ dec c
+ jr nz, .oam_loop
+ ld hl, wVBlankOAMCopyToggle
+ inc [hl]
+ pop de
+ pop bc
+ pop hl
+ ret
+
+BoosterLogoOAM:
+ db $20
+ db $00, $00, $00, $00
+ db $00, $08, $01, $00
+ db $00, $10, $02, $00
+ db $00, $18, $03, $00
+ db $00, $20, $04, $00
+ db $00, $28, $05, $00
+ db $00, $30, $06, $00
+ db $00, $38, $07, $00
+ db $08, $00, $10, $00
+ db $08, $08, $11, $00
+ db $08, $10, $12, $00
+ db $08, $18, $13, $00
+ db $08, $20, $14, $00
+ db $08, $28, $15, $00
+ db $08, $30, $16, $00
+ db $08, $38, $17, $00
+ db $10, $00, $08, $00
+ db $10, $08, $09, $00
+ db $10, $10, $0a, $00
+ db $10, $18, $0b, $00
+ db $10, $20, $0c, $00
+ db $10, $28, $0d, $00
+ db $10, $30, $0e, $00
+ db $10, $38, $0f, $00
+ db $18, $00, $18, $00
+ db $18, $08, $19, $00
+ db $18, $10, $1a, $00
+ db $18, $18, $1b, $00
+ db $18, $20, $1c, $00
+ db $18, $28, $1d, $00
+ db $18, $30, $1e, $00
+ db $18, $38, $1f, $00