AbePralle-FGB/Source/Cinema.asm

1694 lines
38 KiB
NASM

;------------------------------------------------------------------------
; Cinema.asm
; 1-5-2000 by Martin Casado
; 4.27.2000 by Abe Pralle
;
; Description: Routines to handle drawing and minipulating cinema
; tiles and sprites
;
; Contents:
; LoadCinemaBG
; LoadCinemaSprite
; LoadCinemaTextBox
;------------------------------------------------------------------------
INCLUDE "Source/Defs.inc"
FIRST_TEXTBOX_TILE EQU 136
SECTION "Cinema",ROM0
;---------------------------------------------------------------------
; Routine: LoadCinemaBG
; Arguments: a - bank containing data
; hl - addr of .bg data to load
; Alters: af
; Description: Uses DMA to load in new tile patterns, then loads
; in tile layout data into tileShadowBuffer and
; attributeShadowBuffer
;---------------------------------------------------------------------
LoadCinemaBG::
push bc
push de
push hl
ld de,$9000
call LoadTileDefs
ld a,[hl+]
ld [mapWidth],a
ld b,a
ld a,1
.findPitch
rlca
cp b
jr c,.findPitch
ld [mapPitch],a
ld a,[hl+]
ld [mapHeight],a
call SetupMapVarsFromWidthPitchAndHeight
push hl
ld hl,mapMaxLeft
inc [hl]
ld hl,mapMaxTop
inc [hl]
pop hl
;load tile indices
ld a,TILESHADOWBANK
ld [$ff70],a
call CinemaCommonClearBank
ld de,tileShadowBuffer
ld a,[mapHeight]
ld b,a
.tileIndexOuter
ld a,[mapWidth]
ld c,a
.tileIndexInner
ld a,[hl+]
ld [de],a
inc de
dec c
jr nz,.tileIndexInner
;skip remaining pitch
call CinemaCommonSkipPitch
dec b
jr nz,.tileIndexOuter
;load tile attributes (packed 2:1 per byte)
ld a,ATTRSHADOWBANK
ld [$ff70],a
call CinemaCommonClearBank
ld de,attributeShadowBuffer
ld a,[mapHeight]
ld b,a
.tileAttrOuter
ld a,[mapWidth]
srl a
ld c,a
.tileAttrInner
ld a,[hl+]
push af
swap a
and %00001111
ld [de],a
inc de
pop af
and %00001111
ld [de],a
inc de
dec c
jr nz,.tileAttrInner
;skip remaining pitch
call CinemaCommonSkipPitch
dec b
jr nz,.tileAttrOuter
ld a,0
call LoadCinemaPalette
.done
ld a,OBJROM
call SetActiveROM
call PrepareForInitialMapDraw
;call VWait
ld a,1 ;necessary though I'm not sure why!!
call Delay
pop hl
pop de
pop bc
ret
CinemaCommonClearBank:
push hl
ld hl,map
.clearBankLoop
xor a
ld [hl+],a
ld a,h
cp $e0
jr c,.clearBankLoop
pop hl
ret
CinemaCommonSkipPitch:
push hl
ld a,[mapSkip]
ld l,a
ld h,0
add hl,de
ld d,h
ld e,l
pop hl
ret
;---------------------------------------------------------------------
; Routine: LoadCinemaSprite
; Arguments: a - bank containing data
; hl - addr of .sp data to load
; Alters: af
; Description: Uses DMA to load in new sprite patterns, then loads
; in metasprite layout data into spriteOAMBuffer
;---------------------------------------------------------------------
LoadCinemaSprite::
push bc
push de
push hl
ld de,$8000
call LoadTileDefs
;switch to 8x16 sprites
ld a,[$ff40]
or %00000100
ld [$ff40],a
;load oam definitions
inc hl ;discard width, pitch, and height
inc hl
inc hl
ld a,[hl+] ;num sprites
ld c,a
.loadSprite
call AllocateSprite
cp $ff
jr z,.noSpritesLeft
ld d,((spriteOAMBuffer>>8) & $ff)
ld e,a
ld a,[hl+] ;y position
ld [de],a
inc de
ld a,[hl+] ;x position
ld [de],a
inc de
ld a,[hl+] ;tile index
ld [de],a
inc de
ld a,[hl+] ;attributes
ld [de],a
dec c
jr nz,.loadSprite
jr .loadPalette
.noSpritesLeft
inc hl
inc hl
inc hl
inc hl
dec c
jr nz,.noSpritesLeft
.loadPalette
ld a,64
call LoadCinemaPalette
.done
ld a,OBJROM
call SetActiveROM
;necessary (for loadbg) though I'm not sure why!!
call VWait
;ld a,1
;call Delay
pop hl
pop de
pop bc
ret
;---------------------------------------------------------------------
; Routine: LoadTileDefs
; Arguments: a - bank containing data
; de - starting location to load tile patterns into,
; e.g. $9000 for backgrounds or $8000 for sprites.
; hl - addr of .bg or .sp data to load
; Alters: af, hl
; Description: Does some setup work for either Cinema backgrounds OR
; Cinema sprites then uses DMA to load in new tile or
; sprite patterns
;---------------------------------------------------------------------
LoadTileDefs:
push bc
push de
call SetActiveROM
ld a,1
ld [displayType],a
;replace HBlank handler if default one
ld a,[hblankVector+1]
cp (OnHBlank & $ff)
jr nz,.afterInstallHandler
ld a,[hblankVector+2]
cp ((OnHBlank>>8) & $ff)
jr nz,.afterInstallHandler
.replaceHandler
push hl
ld hl,CinemaOnHBlank
call InstallHBlankHandler
pop hl
.afterInstallHandler
;xor a
;ld [levelCheckSkip],a
;ld [levelCheckSkip+1],a
;ensure VBlank interrupt is enabled and interrupts are enabled
ldio a,[$ffff]
or %11
ldio [$ffff],a
ei
;turn LCD on
ld a,[$ff40]
or a,%11000011
ld [$ff40], a ;lcdc control
;indicate we've settled in
xor a
ld [amChangingMap],a
ld a,[hl+] ;bank zero tiles exist?
or a
jr z,.checkBank1Tiles
ld a,[hl+] ;number of bank zero tiles
ld b,a
call .copyTilesToMapRAM ;copy to buffer to ensure alignment
xor a
call .loadTiles
.checkBank1Tiles
ld a,[hl+] ;bank one tiles exist?
or a
jr z,.loadLayout
ld a,[hl+] ;number of bank one tiles
ld b,a
call .copyTilesToMapRAM ;copy to buffer to ensure alignment
ld a,1
call .loadTiles
.loadLayout
;switch back to VRAM bank 0
xor a
ld [$ff4f],a
pop de
pop bc
ret
.copyTilesToMapRAM
push de
push bc
ld a,MAPBANK
ld [$ff70],a
ld de,map
.copyTilesOuter
ld c,16
.copyTilesInner
ld a,[hl+]
ld [de],a
inc de
dec c
jr nz,.copyTilesInner
dec b
jr nz,.copyTilesOuter
pop bc
pop de
ret
.loadTiles
;load sets of 64 tiles and then leftover
push bc
push de
push hl
push af ;save bank
ld hl,map
.continueLoadTiles
ld a,b
or a ;zero equivalent to 256 in this case
jr z,.gt_64_bank
cp 65 ;<=64 tiles left?
jr nc,.gt_64_bank
ld c,b ;# of tiles IS # of sets of 16
jr .got_loadsize
.gt_64_bank
ld c,64 ;load 64 tiles
.got_loadsize
pop af ;retrieve bank
push af ;save bank again
call DMALoad
;push bc
;push de
;push hl
;call GetInput
;pop hl
;pop de
;pop bc
;subtract from count tiles we took care of
ld a,b
sub c
jr z,.loadTilesDone
ld b,a
;advance source
push de
ld de,1024
add hl,de
pop de
;advance destination
push hl
ld hl,1024
add hl,de
ld d,h
ld e,l
pop hl
;if >= $9800 then wrap to $8800
ld a,d
cp $98
jr c,.continueLoadTiles
sub $10
ld d,a
jr .continueLoadTiles
.loadTilesDone
pop af
pop hl
pop de
pop bc
ret
;---------------------------------------------------------------------
; Routine: LoadCinemaPalette
; Arguments: a - byte offset to load into (e.g. 0 for tile
; palette, 64 for sprite palette, 56 for text box
; palette)
; (32-63)
; hl - addr of palette data to load (expecting
; spec, lobyte, hibyte triplets)
; Alters: af, hl
; Description: Loads the specified palette into GamePalette using
; the spec byte to calculate where to store
;---------------------------------------------------------------------
LoadCinemaPalette:
push bc
push de
ld b,a ;b is offset for bg or sprite palette
ld a,FADEBANK
ld [$ff70],a
;load palette into [gamePalette]
ld a,[hl+] ;num colors
ld c,a
.loadPalette
ld d,((gamePalette>>8) & $ff)
ld a,[hl+] ;read spec & determine correct pos
and 63
add b
add (gamePalette & $ff)
ld e,a
ld a,[hl+] ;low byte of color
ld [de],a
inc de
ld a,[hl+] ;high byte of color
ld [de],a
inc de
dec c
jr nz,.loadPalette
pop de
pop hl
ret
;---------------------------------------------------------------------
; Routine: LoadCinemaTextBox
; Arguments: a - bank containing data
; hl - addr of .bg data to load
; Alters: af
; Description: Loads in normal BG file with the following
; alterations:
; - tile map size should be 20x6
; - loads tile defs to $8880 e.g. 136-255 (overwriting
; font)
; - adds 136 to each tile index
; - loads the tile map to $9c00
; - palette is loaded to gamePalette colors 28-31
; regardless
; - of original index values
;---------------------------------------------------------------------
LoadCinemaTextBox::
push bc
push de
push hl
ld de,$8880
call LoadTileDefs
ld a,[hl+] ;discard tile width (should be 20)
ld a,[hl+] ;discard tile height (should be 6)
;load tile indices
ld de,backBuffer
ld b,6 ;height loop
.tileIndexOuter
ld c,20 ;width loop
.tileIndexInner
ld a,[hl+]
add a,FIRST_TEXTBOX_TILE
ld [de],a
inc de
dec c
jr nz,.tileIndexInner
;skip remaining pitch (32-20 = 12)
push hl
ld hl,12
add hl,de
ld d,h
ld e,l
pop hl
dec b
jr nz,.tileIndexOuter
;load tile attributes (packed 2:1 per byte)
ld de,attributeBuffer
ld b,6 ;height loop
.tileAttrOuter
ld c,10 ;width loop (20 tiles / 2 attr per tile)
.tileAttrInner
ld a,[hl+]
push af
swap a
and %00001111
or %00000111 ;make palette 7
ld [de],a
inc de
pop af
and %00001111
or %00000111 ;make palette 7
ld [de],a
inc de
dec c
jr nz,.tileAttrInner
;skip remaining pitch (32-20 = 12)
push hl
ld hl,12
add hl,de
ld d,h
ld e,l
pop hl
dec b
jr nz,.tileAttrOuter
ld a,56 ;load palette 0 as palette 7 (colors 0-3 to 28-31)
call LoadCinemaPalette
.done
ld a,OBJROM
call SetActiveROM
call GfxBlitBackBufferToWindow
;necessary (for loadbg) though I'm not sure why!!
call VWait
;ld a,1 ;necessary (for loadbg) though I'm not sure why!!
;call Delay
pop hl
pop de
pop bc
ret
;---------------------------------------------------------------------
; Routine: CinemaBlitRect
; Arguments: bc - tile width, height to copy
; de - dest tile (i,j) to blit to
; hl - source tile (i,j) to blit from
; Alters: af
; Description: Copies tiles from the tileShadowBuffer and the
; attributeShadowBuffer from one place to another
;---------------------------------------------------------------------
CinemaBlitRect::
push bc
push de
push hl
;get destination address (tileShadowBuffer + j*pitch + i)
push hl
ld h,d
ld l,e
call ConvertXYToLocHL
ld d,h
ld e,l
pop hl
;get start address
call ConvertXYToLocHL
;blit the tile indices
ld a,TILESHADOWBANK
ld [$ff70],a
call .blitSubroutine
;switch to attributes and copy those too
ld a,ATTRSHADOWBANK
ld [$ff70],a
call .blitSubroutine
pop hl
pop de
pop bc
ret
.blitSubroutine
;hl source, de dest, bc width & height
push bc
push de
push hl
.outer ;copy a row
push bc ;save width & height
push hl ;save source start
push de ;save dest start
.inner ;copy a byte
ld a,[hl+]
ld [de],a
inc de
dec b
jr nz,.inner
pop de ;retrieve dest start & add pitch to it
ld h,0
ld a,[mapPitch]
ld l,a
add hl,de
ld d,h
ld e,l
pop hl ;retrieve source start & add pitch to it
push de
ld d,0
ld e,a ;a set above
add hl,de
pop de
pop bc ;retrieve width & height
dec c ;one more row taken care of
jr nz,.outer
pop hl
pop de
pop bc
ret
;---------------------------------------------------------------------
; Routine: CinemaSpotAnimationRandomHorizontalFrames
; Arguments: a - number of possible frames
; bc - metatile width, height to copy
; de - dest metatile (i,j) to blit to
; hl - corner of first source metatile (i,j) blit from
; Alters: af
; Description: Picks a new random frame and blits it to the image.
;---------------------------------------------------------------------
CinemaSpotAnimationRandomHorizontalFrames::
push bc
push hl
;pick a random frame
dec a
call GetRandomNumZeroToN
;scoot source over by (numframe * width of one frame)
push bc
ld c,a
xor a
.timesWidth
add b
dec c
jr nz,.timesWidth
add h
ld h,a
pop bc
call CinemaBlitRect
pop hl
pop bc
ret
;---------------------------------------------------------------------
; Routine: CinemaSpotAnimationRandomVerticalFrames
; Arguments: a - number of possible frames
; bc - metatile width, height to copy
; de - dest metatile (i,j) to blit to
; hl - corner of first source metatile (i,j) blit from
; Alters: af
; Description: Picks a new random frame and blits it to the image.
;---------------------------------------------------------------------
CinemaSpotAnimationRandomVerticalFrames::
push bc
push hl
;pick a random frame
dec a
call GetRandomNumZeroToN
;scoot source down by (numframe * height of one frame)
push bc
ld b,a
xor a
.timesWidth
add c
dec b
jr nz,.timesWidth
add l
ld l,a
pop bc
call CinemaBlitRect
pop hl
pop bc
ret
;---------------------------------------------------------------------
; Routines: StdWaitDialog
; StdWaitDialogNoClear
; Arguments: a - desired next state after dialog
; Alters: af,hl
;---------------------------------------------------------------------
StdWaitDialogNoClear::
push hl
ld hl,dialogSettings
set DLG_NOCLEAR_BIT,[hl]
pop hl
StdWaitDialog::
ld a,h
ldio [mapState+1],a
ld a,l
ldio [mapState],a
call SaveIdle
ret
;---------------------------------------------------------------------
SECTION "CharacterAnimationCode",ROMX
;---------------------------------------------------------------------
;---------------------------------------------------------------------
; Routines: AnimateSkippy
; AnimateFlour
; AnimateFlourDriving
; AnimateBA
; AnimateBS
; AnimateHaiku
; AnimateBRAINIAC
; Arguments: d - duration (roughly d*100 60ths or d*1.6 sec)
;---------------------------------------------------------------------
AnimateSkippy::
ld b,d
.skippyEyes
ld c,10
.skippyTalk
push bc
ld a,5
call Delay
ld a,b
cp 3
ld a,3
jr nc,.animateSkippyMouth
ld a,1
.animateSkippyMouth
;animate mouth
ld bc,$0402
ld de,$0609
ld hl,$1400
call CinemaSpotAnimationRandomHorizontalFrames
pop bc
dec c
jr nz,.skippyTalk
;animate eyes
push bc
ld a,5
ld bc,$0403
ld de,$0606
ld hl,$1402
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec b
jr nz,.skippyEyes
;open eyes at end
ld a,1
ld bc,$0403
ld de,$0606
ld hl,$1402
call CinemaSpotAnimationRandomVerticalFrames
ld a,10
call Delay
ret
AnimateFlour::
ld b,d
.flourEyes
ld c,10
.flourTalk
push bc
ld a,5
call Delay
ld a,b
cp 1
ld a,4
jr nz,.animateFlourMouth
ld a,1
.animateFlourMouth
;animate mouth
ld bc,$0502
ld de,$0906
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec c
jr nz,.flourTalk
;animate eyes
push bc
ld a,3
ld bc,$0603
ld de,$0903
ld hl,$1900
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec b
jr nz,.flourEyes
;open eyes at end
ld a,1
ld bc,$0603
ld de,$0903
ld hl,$1900
call CinemaSpotAnimationRandomVerticalFrames
ld a,10
call Delay
ret
AnimateFlourDriving::
ld b,1
.flourEyes
ld a,d ;c=d*10
rlca
rlca
rlca
add d
add d
ld c,a
.flourTalk
push bc
ld a,5
call Delay
ld a,c
cp 1
ld a,6
jr nz,.animateFlourMouth
ld a,1
.animateFlourMouth
;animate mouth
ld bc,$0604
ld de,$0703
ld hl,$1400
call CinemaSpotAnimationRandomHorizontalFrames
pop bc
dec c
jr nz,.flourTalk
dec b
jr nz,.flourEyes
;open eyes at end
ld a,1
ld bc,$0604
ld de,$0703
ld hl,$1400
call CinemaSpotAnimationRandomHorizontalFrames
ld a,10
call Delay
ret
AnimateBA::
ld b,1
ld a,d ;c=d*10
rlca
rlca
rlca
add d
add d
ld c,a
.baEyes
push bc
ld a,5
call Delay
ld a,c
cp 1
ld a,3
jr nz,.animateFrames
ld a,1
.animateFrames
;animate mouth
ld bc,$0702
ld de,$0604
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec c
jr nz,.baEyes
;open eyes at end
ld a,1
ld bc,$0702
ld de,$0604
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
ld a,10
call Delay
ret
AnimateBS::
ld b,1
ld a,d ;c=d*10
rlca
rlca
rlca
add d
add d
ld c,a
.bsEyes
push bc
ld a,5
call Delay
ld a,c
cp 1
ld a,3
jr nz,.animateFrames
ld a,1
.animateFrames
;animate mouth
ld bc,$0401
ld de,$0604
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec c
jr nz,.bsEyes
;open eyes at end
ld a,1
ld bc,$0401
ld de,$0604
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
ld a,10
call Delay
ret
AnimateHaiku::
ld b,21
.haikuHand
ld c,2
.haikuTalk
push bc
ld a,5
call Delay
ld a,b
cp 1
ld a,4
jr nz,.animateHaikuMouth
ld a,1
.animateHaikuMouth
;animate mouth
ld bc,$0404
ld de,$0605
ld hl,$1408
call CinemaSpotAnimationRandomHorizontalFrames
pop bc
dec c
jr nz,.haikuTalk
;animate hand
push bc
ld a,21
sub b ;frame of hand (1-21)
cp 6
jr c,.handFrameSet ;1st line 0-5
sub 6
cp 6
jr c,.handFrameSet ;2nd line 0-5
sub 5
cp 3
jr c,.handFrameSet ;2nd line 1-2
sub 3
cp 6
jr c,.handFrameSet ;3rd line 0-5
xor a ;final, done
.handFrameSet
;times six
rlca ;times 2
ld b,a ;b = a*2
rlca ;times 2 again (a0 * 4)
add b ;a*6 = a*2 + a*4
add 20
ld h,a
ld l,0
ld bc,$0608
ld de,$0e04
call CinemaBlitRect
pop bc
dec b
jr nz,.haikuHand
ld a,40
call Delay
ret
AnimateBRAINIAC::
ld b,d
.brainiacEyes
ld c,10
.brainiacTalk
push bc
ld a,5
call Delay
ld a,b
cp 1
ld a,2
jr nz,.animate
ld a,1
.animate
;animate mouth
ld bc,$0402
ld de,$0908
ld hl,$1400
call CinemaSpotAnimationRandomHorizontalFrames
pop bc
dec c
jr nz,.brainiacTalk
;animate eyes
push bc
ld a,4
ld bc,$0702
ld de,$0604
ld hl,$1402
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec b
jr nz,.brainiacEyes
ret
AnimateLadyFlower::
ld b,d
.eyes
ld c,10
.talk
push bc
ld a,5
.animateBeeLoop
call .animateBee
dec a
jr nz,.animateBeeLoop
ld a,b
cp 1
ld a,2
jr nz,.animate
ld a,1
.animate
;animate mouth
ld bc,$0101
ld de,$0a06
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec c
jr nz,.talk
;animate eyes
push bc
ld a,3
ld bc,$0302
ld de,$0904
ld hl,$1500
call CinemaSpotAnimationRandomVerticalFrames
;animate bg flowers
ld a,2
ld bc,$0302
ld de,$0008
ld hl,$1406
call CinemaSpotAnimationRandomVerticalFrames
ld a,2
ld bc,$0202
ld de,$0508
ld hl,$140a
call CinemaSpotAnimationRandomHorizontalFrames
ld a,2
ld bc,$0201
ld de,$020a
ld hl,$140c
call CinemaSpotAnimationRandomHorizontalFrames
ld a,2
ld bc,$0202
ld de,$0f0a
ld hl,$140d
call CinemaSpotAnimationRandomHorizontalFrames
ld a,2
ld bc,$0202
ld de,$1208
ld hl,$140f
call CinemaSpotAnimationRandomHorizontalFrames
pop bc
dec b
jr nz,.eyes
ret
VAR_BEEPOS EQU 0
.animateBee
push af
push bc
push hl
ld a,1
call Delay
;bee y position
ld a,[levelVars + VAR_BEEPOS]
add 2
ld [levelVars + VAR_BEEPOS],a
cp 128
jr c,.beeDirectionChosen
ld b,a ;a = 255 - a
ld a,255
sub b
.beeDirectionChosen
sub 64
rlca ;get sign bit in bit 7
sra a
sra a
sra a
sra a
;adjust y coord
ld hl,spriteOAMBuffer
add 40
ld [hl],a
ld hl,spriteOAMBuffer+4
ld [hl],a
;adjust animation frame
ldio a,[updateTimer]
rlca
rlca
and %100
ld hl,spriteOAMBuffer + 2
ld [hl],a
inc a
inc a
ld hl,spriteOAMBuffer + 6
ld [hl],a
pop hl
pop bc
pop af
ret
AnimateLadyFlowerDistress::
ld a,d
and %10000000
ld b,a
ld a,d ;c=d*8
and %01111111
rlca
rlca
rlca
ld c,a
.ladyFace
push bc
bit 7,b
jr z,.afterJiggle
ld a,%111
call GetRandomNumMask
or a
jr nz,.afterJiggle
ld a,15
ldio [jiggleDuration],a
.afterJiggle
ld a,8
call Delay
ld a,c
cp 1
ld a,4
jr nz,.animateFrames
ld a,1
.animateFrames
;animate mouth
ld bc,$0506
ld de,$0702
ld hl,$1500
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec c
jr nz,.ladyFace
;open eyes at end
ld a,1
ld bc,$0506
ld de,$0702
ld hl,$1500
call CinemaSpotAnimationRandomVerticalFrames
ld a,10
call Delay
ret
AnimateLadyFlowerRamp::
ld b,d
.ladyEyes
ld c,10
.ladyTalk
push bc
ld a,5
call Delay
ld a,b
cp 2
ld a,2
jr nc,.animateLadyMouth
ld a,1
.animateLadyMouth
;animate mouth
ld bc,$0202
ld de,$0806
ld hl,$250c
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec c
jr nz,.ladyTalk
;animate eyes
push bc
ld a,4
ld bc,$0403
ld de,$0703
ld hl,$2500
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec b
jr nz,.ladyEyes
;open eyes at end
ld a,1
ld bc,$0403
ld de,$0703
ld hl,$2500
call CinemaSpotAnimationRandomVerticalFrames
ld a,10
call Delay
ret
AnimateCaptainRamp::
ld b,d
.flourEyes
ld c,10
.flourTalk
push bc
ld a,5
call Delay
ld a,b
cp 2
ld a,4
jr nc,.animateFlour
ld a,1
.animateFlour
;animate mouth
ld bc,$0402
ld de,$1312
ld hl,$2009
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec c
jr nz,.flourTalk
;animate eyes
push bc
ld a,3
ld bc,$0503
ld de,$130f
ld hl,$2000
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec b
jr nz,.flourEyes
;open eyes at end
ld a,1
ld bc,$0503
ld de,$130f
ld hl,$2000
call CinemaSpotAnimationRandomVerticalFrames
ld a,10
call Delay
ret
AnimateCaptainGunpoint::
ld a,d
rlca ;frames *8
rlca
ld b,a
.flourEyes
ld c,3
.flourTalk
push bc
ld a,5
call Delay
ld a,b
cp 8
ld a,2
jr nc,.animateFlour
ld a,1
.animateFlour
;animate mouth
ld bc,$0402
ld de,$0c06
ld hl,$1402
call CinemaSpotAnimationRandomHorizontalFrames
pop bc
dec c
jr nz,.flourTalk
;animate eyes
push bc
ld a,2
ld bc,$0602
ld de,$0b04
ld hl,$1400
call CinemaSpotAnimationRandomHorizontalFrames
pop bc
dec b
jr nz,.flourEyes
;open eyes at end
ld a,1
ld bc,$0602
ld de,$0b04
ld hl,$1400
call CinemaSpotAnimationRandomHorizontalFrames
ld a,10
call Delay
ret
AnimatePreacher::
ld b,1
ld a,d ;c=d*10
rlca
rlca
rlca
add d
add d
ld c,a
.preacherEyes
push bc
ld a,5
call Delay
ld a,c
cp 1
ld a,2
jr nz,.animateFrames
ld a,1
.animateFrames
;animate mouth
ld bc,$0302
ld de,$0906
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec c
jr nz,.preacherEyes
;open eyes at end
ld a,1
ld bc,$0302
ld de,$0906
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
ld a,10
call Delay
ret
AnimateCaptainAtWedding::
ld b,1
ld a,d ;c=d*10
rlca
rlca
rlca
add d
add d
ld c,a
.captainEyes
push bc
ld a,5
call Delay
ld a,c
cp 1
ld a,4
jr nz,.animateFrames
ld a,1
.animateFrames
;animate mouth
ld bc,$0404
ld de,$0505
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec c
jr nz,.captainEyes
;open eyes at end
ld a,1
ld bc,$0404
ld de,$0505
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
ld a,10
call Delay
ret
AnimateLadyAtWedding::
ld b,d
.ladyEyes
ld c,10
.ladyTalk
push bc
ld a,5
call Delay
ld a,b
cp 2
ld a,2
jr nc,.animateLadyMouth
ld a,1
.animateLadyMouth
;animate mouth
ld bc,$0202
ld de,$0b05
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec c
jr nz,.ladyTalk
;animate eyes
push bc
ld a,2
ld bc,$0402
ld de,$0a03
ld hl,$1404
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec b
jr nz,.ladyEyes
;open eyes at end
ld a,1
ld bc,$0402
ld de,$0a03
ld hl,$1404
call CinemaSpotAnimationRandomVerticalFrames
ld a,10
call Delay
ret
AnimateGyroAtWedding::
ld b,d
sla b ;b*=4
sla b
.gyroEyes
ld c,4
.gyroTalk
push bc
ld a,3
call Delay
ld a,b
cp 8
ld a,2
jr nc,.animateGyroMouth
ld a,1
.animateGyroMouth
;animate mouth
ld bc,$0a05
ld de,$0606
ld hl,$1800
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec c
jr nz,.gyroTalk
;animate eyes
push bc
ld a,4
ld bc,$0402
ld de,$0604
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec b
jr nz,.gyroEyes
;open eyes at end
ld a,1
ld bc,$0402
ld de,$0604
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
ld a,10
call Delay
ret
AnimateGyroOnScreen::
ld b,d
sla b ;b*=4
sla b
.gyroEyes
ld c,4
.gyroTalk
push bc
ld a,3
call Delay
ld a,b
cp 8
ld a,2
jr nc,.animateGyroMouth
ld a,1
.animateGyroMouth
;animate mouth
ld bc,$0903
ld de,$0607
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec c
jr nz,.gyroTalk
;animate eyes
push bc
ld a,3
ld bc,$0301
ld de,$0705
ld hl,$1406
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec b
jr nz,.gyroEyes
;open eyes at end
ld a,1
ld bc,$0301
ld de,$0705
ld hl,$1406
call CinemaSpotAnimationRandomVerticalFrames
ld a,10
call Delay
ret
AnimateBSDriving::
ld b,1
ld a,d ;c=d*10
rlca
rlca
rlca
add d
add d
ld c,a
.bsEyes
push bc
ld a,5
call Delay
ld a,c
cp 1
ld a,3
jr nz,.animateFrames
ld a,1
.animateFrames
;animate mouth
ld bc,$0402
ld de,$0803
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
pop bc
dec c
jr nz,.bsEyes
;open eyes at end
ld a,1
ld bc,$0402
ld de,$0803
ld hl,$1400
call CinemaSpotAnimationRandomVerticalFrames
ld a,10
call Delay
ret
;***WARNING*** Not HOME Section