AbePralle-FGB/Source/Levels/L0013.asm

771 lines
19 KiB
NASM

; L0013.asm - first map, ba lands on the moon
; Generated 07.09.2000 by mlevel
; Modified 07.09.2000 by Abe Pralle
INCLUDE "Source/Defs.inc"
INCLUDE "Source/Levels.inc"
DROPSPEED1 EQU $ff00 ;normal
DROPSPEED2 EQU $0001
;DROPSPEED1 EQU $fc00 ;fast
;DROPSPEED2 EQU $0004
;---------------------------------------------------------------------
SECTION "Level0013Section",ROMX
;---------------------------------------------------------------------
L0013_Contents::
DW L0013_Load
DW L0013_Init
DW L0013_Check
DW L0013_Map
;---------------------------------------------------------------------
; Load
;---------------------------------------------------------------------
L0013_Load:
DW ((L0013_LoadFinished - L0013_Load2)) ;size
L0013_Load2:
call ParseMap
;load in tiles used for sprite ships
;bg tiles 1153-1242 to Bank 0 100-189
ldio a,[curROMBank]
push af
ld a,BANK(BGTiles1024)
call SetActiveROM
xor a ;bank 0
ld c,90 ;number of tiles to copy
ld de,$8000+1600
ld hl,BGTiles1024 + 129*16
call VMemCopy
pop af
call SetActiveROM
ret
L0013_LoadFinished:
;---------------------------------------------------------------------
; Map
;---------------------------------------------------------------------
L0013_Map:
INCBIN "Data/Levels/L0013_intro_ba1.lvl"
;---------------------------------------------------------------------
; Init
;---------------------------------------------------------------------
ORIGINALTILE EQU 0
VAR_HERO0_INDEX EQU 1
VAR_HERO1_INDEX EQU 2
HULKINDEX EQU 73
GRUNTINDEX EQU 74
B12PURPLEINDEX EQU 75
B12GREYINDEX EQU 76
B12YELLOWINDEX EQU 77
STATE_INITIALDRAW EQU 0
STATE_B12DROP_INIT EQU 1
STATE_B12DROP EQU 2
STATE_CROUTONDROP_INIT EQU 3
STATE_CROUTONDROP EQU 4
STATE_NORMAL EQU 5
L0013_Init:
DW ((L0013_InitFinished - L0013_Init2)) ;size
L0013_Init2:
ld a,BANK(moon_base_ba_gbm)
ld hl,moon_base_ba_gbm
call InitMusic
ld hl,$0013
call SetJoinMap
ld hl,$0013
call SetRespawnMap
ld a,$13
ld [respawnMap],a
ld [joinMap],a
ld a,$00
ld [respawnMap+1],a
ld [joinMap+1],a
;get rid of existing monsters
ld a,HULKINDEX
call DeleteObjectsOfClassIndex
ld a,GRUNTINDEX
call DeleteObjectsOfClassIndex
ld a,B12PURPLEINDEX
call DeleteObjectsOfClassIndex
ld a,B12GREYINDEX
call DeleteObjectsOfClassIndex
ld a,B12YELLOWINDEX
call DeleteObjectsOfClassIndex
ld a,[bgTileMap+48]
ld [levelVars+ORIGINALTILE],a
ld bc,((GROUP_MONSTERB<<8) | GROUP_HERO)
ld a,1 ;make soldiers friends with hero
call SetFOF
ldio a,[mapState]
cp STATE_NORMAL
jr z,.afterRemoveHeroes
cp STATE_CROUTONDROP_INIT
jr z,.removeHeroes
cp STATE_CROUTONDROP
jr z,.removeHeroes
xor a
ld [canJoinMap],a
.removeHeroes
;remove heroes
ld a,[hero0_index]
call ((.heroInvisible - L0013_Init2) + levelCheckRAM)
ld a,[hero1_index]
call ((.heroInvisible - L0013_Init2) + levelCheckRAM)
ld a,1
ld [heroesIdle],a
.afterRemoveHeroes
ret
.heroInvisible
or a
ret z
ld c,a
call GetFirst
call GetFacing
ld c,a
call RemoveFromMap
ret
L0013_InitFinished:
;---------------------------------------------------------------------
; Check
;---------------------------------------------------------------------
CROUTON_DROPY EQU 22
L0013_Check:
DW ((L0013_CheckFinished - L0013_Check2)) ;size
L0013_Check2:
;animate the radar tower (index 48-53) based on timer/8
ldio a,[updateTimer]
rrca ;(t/8)*6 == t/4*3
and %00000110
ld b,a
add b
add b
ld b,a
ld a,[levelVars+ORIGINALTILE]
add b
ld hl,bgTileMap + 48
ld c,6
.animateTower
ld [hl+],a
inc a
dec c
jr nz,.animateTower
ldio a,[mapState]
cp STATE_INITIALDRAW
jr nz,.checkB12DropInit
ld a,STATE_B12DROP_INIT
ldio [mapState],a
ret
.checkB12DropInit
cp STATE_B12DROP_INIT
jr nz,.checkB12Drop
;ld a,STATE_NORMAL
;ldio [mapState],a
;ret
;----b12 drop init--------------------------------------------
;set up mask table
call ((.clearMask - L0013_Check2) + levelCheckRAM)
call ((.createB12Ship - L0013_Check2) + levelCheckRAM)
call ((.fadeOut - L0013_Check2) + levelCheckRAM)
ld a,STATE_B12DROP
ldio [mapState],a
ret
.checkB12Drop
cp STATE_B12DROP
jr z,.inB12Drop
jp ((.checkCroutonDropInit-L0013_Check2)+levelCheckRAM)
.inB12Drop
;b12 dropship
ld bc,DROPSPEED1
ld hl,$cdc0
call ScrollMetaSprite
call ((.animateB12Thrusters - L0013_Check2) + levelCheckRAM)
;remove ship if nose sprite is 192
;get the x position of the first sprite on third row
ld a,[$cdc0 + 16 + 1]
ld l,a
ld h,((spriteOAMBuffer>>8) & $ff)
inc hl
ld a,[hl]
cp 192
jr nz,.afterRemoveShip
ld hl,$cdc0
call FreeMetaSprite
ld a,STATE_CROUTONDROP_INIT
ldio [mapState],a
ld hl,((.shipFadeSound - L0013_Check2) + levelCheckRAM)
call PlaySound
call ((.fadeIn - L0013_Check2) + levelCheckRAM)
ld a,30
ldio [mapState+1],a ;delay until next ship
ret
.afterRemoveShip
;drop soldiers when ship is at specific pixel positions
cp 48
jr nz,.checkSoldierDrop2
ld c,B12YELLOWINDEX
ld hl,$d0ca
push hl
ld hl,$d0ea
push hl
ld hl,$d10a
push hl
jp ((.createSoldiers - L0013_Check2) + levelCheckRAM)
.checkSoldierDrop2
cp 40
jr nz,.checkSoldierDrop3
ld c,B12YELLOWINDEX
ld hl,$d0c9
push hl
ld hl,$d0e9
push hl
ld hl,$d109
push hl
jp ((.createSoldiers - L0013_Check2) + levelCheckRAM)
.checkSoldierDrop3
cp 32
jr nz,.checkSoldierDrop4
ld c,B12PURPLEINDEX
ld hl,$d0c8
push hl
ld hl,$d0e8
push hl
ld hl,$d108
push hl
jp ((.createSoldiers - L0013_Check2) + levelCheckRAM)
.checkSoldierDrop4
cp 24
jr nz,.checkSoldierDrop5
ld c,B12PURPLEINDEX
ld hl,$d0c7
push hl
ld hl,$d0e7
push hl
ld hl,$d107
push hl
jp ((.createSoldiers - L0013_Check2) + levelCheckRAM)
.checkSoldierDrop5
cp 16
jr nz,.checkSoldierDrop6
;make heroes visible
ld a,[hero0_index]
call ((.heroVisible - L0013_Check2) + levelCheckRAM)
ld a,[hero1_index]
call ((.heroVisible - L0013_Check2) + levelCheckRAM)
ret
.heroVisible
or a
ret z
ld c,a
call GetFirst
ld b,METHOD_DRAW
call CallMethod
ret
;ld c,B12PURPLEINDEX
;ld hl,$d0c6
;push hl
;ld hl,$d0e6
;push hl
;ld hl,$d106
;push hl
;jp ((.createSoldiers - L0013_Check2) + levelCheckRAM)
.checkSoldierDrop6
ret
.checkCroutonDropInit
cp STATE_CROUTONDROP_INIT
jr nz,.checkCroutonDrop
;crouton drop init
ld hl,mapState+1
ld a,[hl]
or a
jr z,.afterDelay
dec [hl]
ret
.afterDelay
;set up mask table
call ((.clearMask - L0013_Check2) + levelCheckRAM)
call ((.createCroutonShip - L0013_Check2)+levelCheckRAM)
ld hl,((.croutonShipApproachSound - L0013_Check2) + levelCheckRAM)
call PlaySound
call ((.fadeOut - L0013_Check2) + levelCheckRAM)
ld a,STATE_CROUTONDROP
ldio [mapState],a
ret
.checkCroutonDrop
cp STATE_CROUTONDROP
jr z,.inCroutonDrop
ld a,1 ;can join now
ld [canJoinMap],a
jp ((.checkNormal - L0013_Check2)+levelCheckRAM)
.inCroutonDrop
;crouton dropship
ld bc,DROPSPEED2
ld hl,$cdc0
call ScrollMetaSprite
call ((.animateCroutonThrusters-L0013_Check2)+levelCheckRAM)
;remove ship if top sprite is 161
;get the y position of the first sprite
ld a,[$cdc0 + 1]
ld l,a
ld h,((spriteOAMBuffer>>8) & $ff)
ld a,[hl]
cp 162
jr nz,.afterRemoveCroutonShip
ld hl,$cdc0
call FreeMetaSprite
ld a,STATE_NORMAL
ldio [mapState],a
ld hl,((.croutonShipFadeSound - L0013_Check2) + levelCheckRAM)
call PlaySound
call ((.fadeIn - L0013_Check2) + levelCheckRAM)
ld hl,musicEnabled ;enable track 4
set 3,[hl]
;everybody start fighting
ld bc,classDoNothing
ld de,classB12Soldier
call ChangeClass
ld bc,classDoNothing2
ld de,classCroutonGrunt
call ChangeClass
ld bc,classDoNothing3
ld de,classCroutonHulk
call ChangeClass
;let the heroes move
xor a
ld [heroesIdle],a
ld a,STATE_NORMAL
ldio [mapState],a
ret
.afterRemoveCroutonShip
;place croutons under ship based on y position
cp CROUTON_DROPY
jr nz,.placeCroutons2
ld hl,$d06e
jp ((.placeCroutonSingleRow-L0013_Check2)+levelCheckRAM)
.placeCroutons2
cp CROUTON_DROPY + 8*1
jr nz,.placeCroutons3
ld hl,$d08e
jp ((.placeCroutonSingleRow-L0013_Check2)+levelCheckRAM)
.placeCroutons3
cp CROUTON_DROPY + 8*2
jr nz,.placeCroutons4
ld hl,$d0ae
jp ((.placeCroutonDoubleRow-L0013_Check2)+levelCheckRAM)
.placeCroutons4
cp CROUTON_DROPY + 8*4
jr nz,.placeCroutons5
ld hl,$d0ee
jp ((.placeCroutonSingleRow-L0013_Check2)+levelCheckRAM)
.placeCroutons5
cp CROUTON_DROPY + 8*5
jr nz,.placeCroutons6
ld hl,$d10e
jp ((.placeCroutonDoubleRow-L0013_Check2)+levelCheckRAM)
.placeCroutons6
cp CROUTON_DROPY + 8*7
jr nz,.placeCroutons7
ld hl,$d14e
jp ((.placeCroutonSingleRow-L0013_Check2)+levelCheckRAM)
.placeCroutons7
cp CROUTON_DROPY + 8*8
jr nz,.placeCroutons8
ld hl,$d16e
jp ((.placeCroutonDoubleRow-L0013_Check2)+levelCheckRAM)
.placeCroutons8
cp CROUTON_DROPY + 8*10
jr nz,.placeCroutons9
ld hl,$d1ae
jp ((.placeCroutonSingleRow-L0013_Check2)+levelCheckRAM)
.placeCroutons9
cp CROUTON_DROPY + 8*11
ret nz
ld hl,$d1ce
jp ((.placeCroutonSingleRow-L0013_Check2)+levelCheckRAM)
.checkNormal
ret
.createSoldiers
push bc
ld bc,classDoNothing
ld de,classB12Soldier
call ChangeClass
pop bc
ld b,3
.createSoldiersLoop
pop hl
push bc
call CreateObject
ld b,METHOD_INIT
call CallMethod
ld a,DIR_EAST
call SetFacing
ld b,METHOD_DRAW
call CallMethod
pop bc
dec b
jr nz,.createSoldiersLoop
ld bc,classB12Soldier
ld de,classDoNothing
call ChangeClass
ret
.clearMask
ld hl,$cdc0
ld c,49
ld a,1
.clearMaskLoop
ld [hl+],a
dec c
jr nz,.clearMaskLoop
ret
.createB12Ship
;clear spots in the mask
xor a
ld [$cdc0 + 0 + 1],a
ld [$cdc0 + 1 + 1],a
ld [$cdc0 + 7 + 1],a
ld [$cdc0 + 1*8+0 + 1],a
ld [$cdc0 + 1*8+7 + 1],a
ld [$cdc0 + 4*8+0 + 1],a
ld [$cdc0 + 4*8+7 + 1],a
ld [$cdc0 + 5*8+0 + 1],a
ld [$cdc0 + 5*8+1 + 1],a
ld [$cdc0 + 5*8+7 + 1],a
ld a,192 ;190
ld [metaSprite_x],a
ld a,44
ld [metaSprite_y],a
ld bc,$0806 ;width and height of metasprite
ld d,100 ;starts at pattern #100
ld e,5 ;default attributes (palette)
ld hl,$cdc0
call CreateMetaSpriteUsingMask
ld hl,musicEnabled ;disable track 4
res 3,[hl]
ld hl,((.shipApproachSound - L0013_Check2) + levelCheckRAM)
call PlaySound
ret
.animateB12Thrusters
;animate thrusters by setting or clearing +128 to each
;thruster sprite's y position
ld hl,$cdc0 + 6 + 1
push hl
ld hl,$cdc0 + 8 + 6 + 1
push hl
ld hl,$cdc0 + 8*4 + 6 + 1
push hl
ld hl,$cdc0 + 8*5 + 6 + 1
push hl
ld b,0
ld a,[updateTimer]
bit 0,a
jr nz,.afterSetMask
ld b,%10000000
.afterSetMask
ld c,4
.thrusterChangeLoop
pop hl
ld l,[hl]
ld h,((spriteOAMBuffer>>8) & $ff)
ld a,[hl]
and %01111111
or b
ld [hl],a
dec c
jr nz,.thrusterChangeLoop
ret
.createCroutonShip
;clear spots in the mask
xor a
ld [$cdc0 + 5*6+1 + 1],a
ld [$cdc0 + 5*6+4 + 1],a
ld [$cdc0 + 6*6+1 + 1],a
ld [$cdc0 + 6*6+2 + 1],a
ld [$cdc0 + 6*6+3 + 1],a
ld [$cdc0 + 6*6+4 + 1],a
ld a,104
ld [metaSprite_x],a
ld a,166
ld [metaSprite_y],a
ld bc,$0607 ;width and height of metasprite
ld d,$94 ;initial pattern number
ld e,6 ;default attributes (palette)
ld hl,$cdc0
call CreateMetaSpriteUsingMask
ret
.animateCroutonThrusters
;animate thrusters by setting or clearing +128 to each
;thruster sprite's y position
ld hl,$cdc0 + 1
push hl
ld hl,$cdc0 + 5 + 1
push hl
ld b,0
ld a,[updateTimer]
bit 0,a
jr nz,.afterSetCroutonMask
ld b,80
.afterSetCroutonMask
ld c,2
.croutonThrusterChangeLoop
pop hl
ld l,[hl]
ld h,((spriteOAMBuffer>>8) & $ff)
inc hl ;to sprite x pos
ld a,[hl]
cp 160
jr c,.xposOriginal
sub 80
.xposOriginal
add b
ld [hl],a
dec c
jr nz,.croutonThrusterChangeLoop
ret
.placeCroutonSingleRow
ld b,2
ld c,GRUNTINDEX
push hl
inc hl
push hl
jr .createCroutons
.placeCroutonDoubleRow
push hl
ld bc,((.drowRetAddr-L0013_Check2)+levelCheckRAM)
push bc
jr .placeCroutonSingleRow
.drowRetAddr
pop hl
push hl
ld bc,32
add hl,bc
ld bc,((.drowRetAddr2-L0013_Check2)+levelCheckRAM)
push bc
jr .placeCroutonSingleRow
.drowRetAddr2
pop hl
ld bc,((.afterCreateHulk-L0013_Check2)+levelCheckRAM)
push bc
inc hl
inc hl
push hl
ld bc,classDoNothing3
ld de,classCroutonHulk
call ChangeClass
ld b,1
ld c,HULKINDEX
jr .createCroutons
.afterCreateHulk
ld bc,classCroutonHulk
ld de,classDoNothing3
call ChangeClass
ret
.createCroutons
push bc
ld bc,classDoNothing2
ld de,classCroutonGrunt
call ChangeClass
pop bc
pop hl
push bc
call CreateObject
ld b,METHOD_INIT
call CallMethod
ld a,DIR_WEST
call SetFacing
ld b,METHOD_DRAW
call CallMethod
pop bc
dec b
jr nz,.createCroutons
ld bc,classCroutonGrunt
ld de,classDoNothing2
call ChangeClass
ret
.fadeOut
ld a,FADEBANK
ld [$ff70],a
;set final bg palette to be all white w/black bg
ld hl,gamePalette
ld de,fadeFinalPalette
call FadeCommonCopyPalette
ld hl,fadeFinalPalette
call ((.setPaletteToWhiteBlackBG-L0013_Check2)+levelCheckRAM)
;set cur palette to be copy of current game palette
ld hl,gamePalette
ld de,fadeCurPalette
call FadeCommonCopyPalette
ld a,120
call FadeInit
ret
.fadeIn
ld a,FADEBANK
ld [$ff70],a
;set cur palette to be all white w black bg
ld hl,gamePalette
ld de,fadeCurPalette
call FadeCommonCopyPalette
ld hl,fadeCurPalette
call ((.setPaletteToWhiteBlackBG-L0013_Check2)+levelCheckRAM)
;set final palette to be copy of current game palette
ld hl,gamePalette
ld de,fadeFinalPalette
call FadeCommonCopyPalette
ld a,30
call FadeInit
ret
.setPaletteToWhiteBlackBG
ld c,8
.setBlackLoop
ld a,$ff
ld [hl+],a
ld a,$7f
ld [hl+],a
ld b,3
.setWhiteLoop
ld a,$b5
ld [hl+],a
ld a,$56
ld [hl+],a
dec b
jr nz,.setWhiteLoop
dec c
jr nz,.setBlackLoop
ret
.shipApproachSound
DB 4,$00,$0f,$81,$80
.shipFadeSound
DB 4,$00,$f7,$81,$80
.croutonShipApproachSound
DB 4,$00,$0f,$82,$80
.croutonShipFadeSound
DB 4,$00,$f7,$82,$80
L0013_CheckFinished:
PRINT "0013 Script Sizes (Load/Init/Check) (of $500): "
PRINT (L0013_LoadFinished - L0013_Load2)
PRINT " / "
PRINT (L0013_InitFinished - L0013_Init2)
PRINT " / "
PRINT (L0013_CheckFinished - L0013_Check2)
PRINT "\n"