AbePralle-FGB/Source/Levels/L0115.asm

865 lines
22 KiB
NASM

; L0115.asm BS sneaks in the crouton base
; Generated 07.09.2000 by mlevel
; Modified 07.09.2000 by Abe Pralle
INCLUDE "Source/Defs.inc"
INCLUDE "Source/Levels.inc"
;---------------------------------------------------------------------
SECTION "Level0115Section",ROMX
;---------------------------------------------------------------------
L0115_Contents::
DW L0115_Load
DW L0115_Init
DW L0115_Check
DW L0115_Map
dialog:
brainiac_detectIntruder_gtx:
INCBIN "Data/Dialog/IntroBS/brainiac_detectIntruder.gtx"
bs_segashuating_gtx:
INCBIN "Data/Dialog/IntroBS/bs_segashuating.gtx"
brainiac_bringIt_gtx:
INCBIN "Data/Dialog/IntroBS/brainiac_bringIt.gtx"
monitor_onlyCroutons_gtx:
INCBIN "Data/Dialog/IntroBS/monitor_onlyCroutons.gtx"
bs_idea_gtx:
INCBIN "Data/Dialog/IntroBS/bs_idea.gtx"
bs_presto_gtx:
INCBIN "Data/Dialog/IntroBS/bs_presto.gtx"
bs_hangin1_gtx:
INCBIN "Data/Dialog/IntroBS/bs_hangin1.gtx"
grunt_hangin2_gtx:
INCBIN "Data/Dialog/IntroBS/grunt_hangin2.gtx"
bs_hangin3_gtx:
INCBIN "Data/Dialog/IntroBS/bs_hangin3.gtx"
grunt_hangin4_gtx:
INCBIN "Data/Dialog/IntroBS/grunt_hangin4.gtx"
bs_hangin5_gtx:
INCBIN "Data/Dialog/IntroBS/bs_hangin5.gtx"
monitor_openDoor_gtx:
INCBIN "Data/Dialog/IntroBS/monitor_openDoor.gtx"
brainiac_wait_gtx:
INCBIN "Data/Dialog/IntroBS/brainiac_wait.gtx"
monitor_sorry_gtx:
INCBIN "Data/Dialog/IntroBS/monitor_sorry.gtx"
brainiac_justClose_gtx:
INCBIN "Data/Dialog/IntroBS/brainiac_justClose.gtx"
monitor_oneSecond_gtx:
INCBIN "Data/Dialog/IntroBS/monitor_oneSecond.gtx"
brainiac_idiotz_gtx:
INCBIN "Data/Dialog/IntroBS/brainiac_idiotz.gtx"
;---------------------------------------------------------------------
; Load
;---------------------------------------------------------------------
L0115_Load:
DW ((L0115_LoadFinished - L0115_Load2)) ;size
L0115_Load2:
call ParseMap
ret
L0115_LoadFinished:
;---------------------------------------------------------------------
; Map
;---------------------------------------------------------------------
L0115_Map:
INCBIN "Data/Levels/L0115_intro_bs2.lvl"
;---------------------------------------------------------------------
; Init
;---------------------------------------------------------------------
STATE_DETECT1 EQU 0
STATE_DETECT2 EQU 1
STATE_DETECT3 EQU 2
STATE_PRESTO EQU 3
STATE_HANGIN2 EQU 4
STATE_HANGIN3 EQU 5
STATE_HANGIN4 EQU 6
STATE_HANGIN5 EQU 7
STATE_MONITOR1 EQU 8
STATE_WAIT_ALLBRAINIAC EQU 9
STATE_MONITOR2 EQU 10
STATE_MONITOR3 EQU 11
STATE_MONITOR4 EQU 12
STATE_MONITOR5 EQU 13
STATE_NORMAL EQU 14
STATE_WAIT_DIALOG EQU 15
VAR_MONITOR_WARNING EQU 0
VAR_STATIC EQU 1
VAR_SPEAKINGHERO EQU 2
VAR_GRUNT_TILE EQU 3
VAR_COSTUME_DIALOG EQU 4
VAR_BS_TILE EQU 5
VAR_NUMMONITORS EQU 6
VAR_MONITORS EQU 7 ;7-26, 20 monitors
VAR_HANGIN_DIALOG EQU 27
VAR_COSTUME_HERO EQU 28
STATICINDEX EQU 34
BGBRAINIACINDEX EQU 31
GOBLININDEX EQU 46
GRUNTINDEX EQU 44
GUARDINDEX EQU 45
BRAINIACINDEX EQU 49
DETECTZONE EQU 11
PAINTZONE EQU 10 ;8
HANGINZONE1 EQU 5
HANGINZONE2 EQU 8 ;5
MONITORZONE EQU 9
L0115_Init:
DW ((L0115_InitFinished - L0115_Init2)) ;size
L0115_Init2:
call SetPressBDialog
ld a,BANK(dialog)
ld [dialogBank],a
ld a,BANK(bs_gbm)
ld hl,bs_gbm
call InitMusic
xor a
ld [levelVars + VAR_MONITOR_WARNING],a
ld [levelVars + VAR_COSTUME_DIALOG],a
ld [levelVars + VAR_HANGIN_DIALOG],a
;save BS's current tile for later
call SetSpeakerToFirstHero
call GetFGMapping
ld [levelVars+VAR_BS_TILE],a
ld a,20
ld [levelVars + VAR_NUMMONITORS],a
xor a
ld c,20
ld hl,levelVars + VAR_MONITORS
.clearMonitors
ld [hl+],a
dec c
jr nz,.clearMonitors
;ld a,$ff
;ld [levelVars + VAR_BS_TILE],a
ld a,[bgTileMap+STATICINDEX]
ld [levelVars+VAR_STATIC],a
ld a,TILEINDEXBANK
ldio [$ff70],a
ld a,[fgTileMap+GRUNTINDEX]
ld [levelVars+VAR_GRUNT_TILE],a
ldio a,[mapState]
cp STATE_NORMAL
ret nz
;open doors
;open the security door
;ld a,MAPBANK
;ldio [$ff70],a
;xor a
;ld hl,$d189
;ld [hl+],a
;ld [hl],a
;open the outer door
ld a,MAPBANK
ldio [$ff70],a
xor a
ld hl,$d049
ld [hl+],a
ld [hl],a
;mark certain dialogs as having happened
ld a,1
ld [levelVars + VAR_COSTUME_DIALOG],a
ld [levelVars + VAR_HANGIN_DIALOG],a
ret
L0115_InitFinished:
;---------------------------------------------------------------------
; Check
;---------------------------------------------------------------------
L0115_Check:
DW ((L0115_CheckFinished - L0115_Check2)) ;size
L0115_Check2:
call SetSkipStackPos
call CheckSkip
call ((.animateStatic-L0115_Check2)+levelCheckRAM)
call ((.checkBSAttack-L0115_Check2)+levelCheckRAM)
call ((.checkPaintRoom-L0115_Check2)+levelCheckRAM)
call ((.checkHangin-L0115_Check2)+levelCheckRAM)
call ((.adjustCameraInMonitorRoom-L0115_Check2)+levelCheckRAM)
call ((.checkMonitorWarn-L0115_Check2)+levelCheckRAM)
VECTORTOSTATE ((.stateTable-L0115_Check2)+levelCheckRAM)
.stateTable
DW ((.checkDetect1-L0115_Check2)+levelCheckRAM)
DW ((.checkDetect2-L0115_Check2)+levelCheckRAM)
DW ((.checkDetect3-L0115_Check2)+levelCheckRAM)
DW ((.checkPresto-L0115_Check2)+levelCheckRAM)
DW ((.checkHangin2-L0115_Check2)+levelCheckRAM)
DW ((.checkHangin3-L0115_Check2)+levelCheckRAM)
DW ((.checkHangin4-L0115_Check2)+levelCheckRAM)
DW ((.checkHangin5-L0115_Check2)+levelCheckRAM)
DW ((.checkMonitor1-L0115_Check2)+levelCheckRAM)
DW ((.checkWaitAllBRAINIAC-L0115_Check2)+levelCheckRAM)
DW ((.checkMonitor2-L0115_Check2)+levelCheckRAM)
DW ((.checkMonitor3-L0115_Check2)+levelCheckRAM)
DW ((.checkMonitor4-L0115_Check2)+levelCheckRAM)
DW ((.checkMonitor5-L0115_Check2)+levelCheckRAM)
DW ((.checkNormal-L0115_Check2)+levelCheckRAM)
DW ((.checkWaitDialog-L0115_Check2)+levelCheckRAM)
.checkDetect1
ld a,1
ld hl,((.checkDetect1_hero-L0115_Check2)+levelCheckRAM)
jp CheckEachHero
.checkDetect1_hero
ld c,a
call GetFirst
call GetCurZone
cp DETECTZONE
ld a,0
ret nz
ld a,c
ld [levelVars + VAR_SPEAKINGHERO],a
call SetSpeakerFromHeroIndex
call MakeIdle
ld hl,$d85d
call ((.monitorToStatic-L0115_Check2)+levelCheckRAM)
ld c,8
.waitStatic
ld de,((.skipDetect - L0115_Check2) + levelCheckRAM)
call SetDialogSkip
ld a,1
call Delay
call ((.animateStatic-L0115_Check2)+levelCheckRAM)
ld a,1
call Delay
dec c
jr nz,.waitStatic
ld hl,$d85d
call ((.monitorToBRAINIAC-L0115_Check2)+levelCheckRAM)
call ((.setupBRAINIAC-L0115_Check2)+levelCheckRAM)
DIALOGTOP brainiac_detectIntruder_gtx
WAITDIALOG STATE_DETECT2
ld a,1
ret
.checkDetect2
ld a,[levelVars + VAR_SPEAKINGHERO]
ld c,a
DIALOGBOTTOM bs_segashuating_gtx
WAITDIALOG STATE_DETECT3
ret
.checkDetect3
call ((.setupBRAINIAC-L0115_Check2)+levelCheckRAM)
DIALOGTOP brainiac_bringIt_gtx
call MakeNonIdle
WAITDIALOG STATE_MONITOR1
ret
.checkPaintRoom
ldio a,[mapState]
cp STATE_PRESTO
ret z
xor a
ld hl,((.checkPaintRoom_hero-L0115_Check2)+levelCheckRAM)
jp CheckEachHero
.checkPaintRoom_hero
ld c,a
call GetFirst
call GetCurZone
cp PAINTZONE
ld a,0
ret nz
;only if hero's attack delay is zero
call GetAttackDelay
or a
ld a,0
ret nz
;possible for costume?
ld a,[levelVars + VAR_GRUNT_TILE]
inc a
ret z ;returns if $ff (no tile)
;already talked about costume?
ld a,c
ld [levelVars + VAR_COSTUME_HERO],a
ld a,[levelVars + VAR_COSTUME_DIALOG]
or a
jr nz,.checkPresto
call SetSpeakerFromHeroIndex
ld de,((.skipCostume-L0115_Check2)+levelCheckRAM)
call SetDialogSkip
call MakeIdle
DIALOGBOTTOM bs_idea_gtx
WAITDIALOGNOCLEAR STATE_PRESTO
ld a,1
ret
.checkPresto
call ((.useCostume-L0115_Check2)+levelCheckRAM)
ld a,[levelVars + VAR_COSTUME_DIALOG]
or a
ret nz
ld a,[levelVars + VAR_COSTUME_HERO]
ld c,a
call SetSpeakerFromHeroIndex
call ((.clearSkipAfterDialog-L0115_Check2)+levelCheckRAM)
DIALOGBOTTOM bs_presto_gtx
call MakeNonIdle
WAITDIALOG STATE_MONITOR1
ld a,1
ld [levelVars + VAR_COSTUME_DIALOG],a
ret
.checkHangin
ld a,[levelVars + VAR_HANGIN_DIALOG]
or a
ret nz
;jr z,.okayToHang
;ld a,STATE_MONITOR1
;ldio [mapState],a
;ret
;.okayToHang
ld a,1
ld hl,((.checkHangin_hero-L0115_Check2)+levelCheckRAM)
jp CheckEachHero
.checkHangin_hero
ld c,a
call GetFirst
call GetCurZone
cp HANGINZONE1
jr z,.checkCostume
cp HANGINZONE2
ld a,0
ret nz
.checkCostume
call SetSpeakerFromHeroIndex
ld a,TILEINDEXBANK
ldio [$ff70],a
ld h,((fgTileMap>>8) & $ff)
ld l,c
ld a,[levelVars + VAR_GRUNT_TILE]
cp [hl]
ld a,0
ret nz ;not in costume!
;make sure there's some grunts to talk to
push bc
push de
ld c,GRUNTINDEX
call GetFirst
pop de
pop bc
or a
ret z ;no grunts
ld a,1
ld [levelVars + VAR_HANGIN_DIALOG],a
ld de,((.skipHangin-L0115_Check2)+levelCheckRAM)
call SetDialogSkip
call MakeIdle
ld a,c
ld [levelVars + VAR_SPEAKINGHERO],a
call SetSpeakerFromHeroIndex
DIALOGBOTTOM bs_hangin1_gtx
WAITDIALOG STATE_HANGIN2
ld a,1
ret
.checkHangin2
ld c,GRUNTINDEX
DIALOGTOP grunt_hangin2_gtx
WAITDIALOG STATE_HANGIN3
ret
.checkHangin3
ld a,[levelVars + VAR_SPEAKINGHERO]
ld c,a
call SetSpeakerFromHeroIndex
DIALOGBOTTOM bs_hangin3_gtx
WAITDIALOG STATE_HANGIN4
ret
.checkHangin4
ld c,GRUNTINDEX
DIALOGTOP grunt_hangin4_gtx
WAITDIALOG STATE_HANGIN5
ret
.checkHangin5
call ((.clearSkipAfterDialog-L0115_Check2)+levelCheckRAM)
call MakeNonIdle
ld a,[levelVars + VAR_SPEAKINGHERO]
ld c,a
call SetSpeakerFromHeroIndex
DIALOGBOTTOM bs_hangin5_gtx
WAITDIALOG STATE_MONITOR1
ret
.checkMonitor1
ld a,1
ld hl,((.checkMonitor1_hero-L0115_Check2)+levelCheckRAM)
jp CheckEachHero
.checkMonitor1_hero
or a
ret z
ld c,a
;hero in costume?
call GetFGMapping
ld hl,levelVars + VAR_GRUNT_TILE
cp [hl]
ld a,0
ret nz ;not yet!
call GetFirst
call GetCurZone
cp MONITORZONE
ld a,0
ret nz
call SetSpeakerFromHeroIndex
call MakeIdle
ld a,1 ;make sure the warning won't happen
ld [levelVars + VAR_MONITOR_WARNING],a
ld c,GUARDINDEX
DIALOGTOP monitor_openDoor_gtx
WAITDIALOG STATE_WAIT_ALLBRAINIAC
ld a,MAPBANK
ldio [$ff70],a
;open the outer door
xor a
ld hl,$d049
ld [hl+],a
ld [hl],a
ld de,((.skipMonitor-L0115_Check2)+levelCheckRAM)
call SetDialogSkip
ld a,1
ret
.checkWaitAllBRAINIAC
ld a,[levelVars + VAR_NUMMONITORS]
or a
jr z,.brainiacTalks
;animate monitors from normal to static to BRAINIAC
dec a ;pick a monitor at random
call GetRandomNumZeroToN
inc a
ld c,a
ld de,0
ld hl,levelVars + VAR_MONITORS
;find monitor state data
.findActiveMonitor
ld a,[hl+]
inc e
cp 5
jr nc,.findActiveMonitor ;skip if this one finished
dec c
jr nz,.findActiveMonitor
dec hl
dec e
inc [hl]
inc a
ld c,a ;save monitor state
sla e ;de *= 2 (offset)
rl d
ld hl,((.monitorLocations-L0115_Check2)+levelCheckRAM)
add hl,de ;hl = monitor location table
ld a,[hl+]
ld h,[hl]
ld l,a ;hl is monitor location
ld a,c
cp 5
jr nc,.changeToFace
;change to static
call ((.monitorToStatic-L0115_Check2)+levelCheckRAM)
ret
.changeToFace
call ((.monitorToBRAINIAC-L0115_Check2)+levelCheckRAM)
ld hl,levelVars + VAR_NUMMONITORS
dec [hl]
ret
.brainiacTalks
call ((.setupBRAINIAC-L0115_Check2)+levelCheckRAM)
DIALOGTOP brainiac_wait_gtx
WAITDIALOG STATE_MONITOR2
ret
.resetHero
or a
ret z
ld c,a
call GetFirst
ld a,10
call SetAttackDelay
ld b,METHOD_DRAW
call CallMethod
ret
.checkMonitor2
call ((.openSecurityDoor-L0115_Check2)+levelCheckRAM)
ld c,GUARDINDEX
DIALOGTOP monitor_sorry_gtx
WAITDIALOGNOCLEAR STATE_MONITOR3
ret
.checkMonitor3
call ((.setupBRAINIAC-L0115_Check2)+levelCheckRAM)
DIALOGTOP brainiac_justClose_gtx
WAITDIALOGNOCLEAR STATE_MONITOR4
ret
.checkMonitor4
ld c,GUARDINDEX
DIALOGTOP monitor_oneSecond_gtx
WAITDIALOGNOCLEAR STATE_MONITOR5
ret
.checkMonitor5
call ((.setupBRAINIAC-L0115_Check2)+levelCheckRAM)
set DLG_CLEARSKIP_BIT,[hl]
DIALOGTOP brainiac_idiotz_gtx
call MakeNonIdle
WAITDIALOG STATE_NORMAL
ret
.checkNormal
ret
.checkWaitDialog
STDWAITDIALOG
ret
;----support routines-------------------------------------------------
.clearSkipAfterDialog
ld hl,dialogSettings
set DLG_CLEARSKIP_BIT,[hl]
ret
.skipDetect
call ClearDialog
call MakeNonIdle
ld hl,$d85d
call ((.monitorToBRAINIAC-L0115_Check2)+levelCheckRAM)
ld a,STATE_MONITOR1
ldio [mapState],a
ld a,1
ret
.useCostume
ld a,[levelVars + VAR_COSTUME_HERO]
ld c,a
ld a,[levelVars + VAR_GRUNT_TILE] ;use the grunt's tile
call SetFGMapping
call GetFirst
ld a,0
call SetAttackDelay
ld b,METHOD_DRAW
call CallMethod
ld a,GROUP_MONSTERA ;hero is one of the boys now
call SetGroup
ret
.skipCostume
call ClearDialog
call MakeNonIdle
call ((.useCostume-L0115_Check2)+levelCheckRAM)
ld a,1
ld [levelVars + VAR_COSTUME_DIALOG],a
ld a,STATE_MONITOR1
ldio [mapState],a
ret
.skipHangin
call ClearDialog
call MakeNonIdle
ld a,STATE_MONITOR1
ldio [mapState],a
ret
.skipMonitor
call ClearDialog
call MakeNonIdle
ld a,STATE_NORMAL
ldio [mapState],a
call ((.openSecurityDoor-L0115_Check2)+levelCheckRAM)
;set all monitors to brainiac
ld c,20
ld hl,((.monitorLocations-L0115_Check2)+levelCheckRAM)
.setAllMonitorsLoop
ld a,[hl+]
push hl
ld h,[hl]
ld l,a
call ((.monitorToBRAINIAC-L0115_Check2)+levelCheckRAM)
pop hl
inc hl
dec c
jr nz,.setAllMonitorsLoop
ret
.openSecurityDoor
ld a,[hero0_index]
call ((.resetHero-L0115_Check2)+levelCheckRAM)
ld a,[hero1_index]
call ((.resetHero-L0115_Check2)+levelCheckRAM)
call ((.checkBSAttack-L0115_Check2)+levelCheckRAM)
;open the security door
ld a,MAPBANK
ldio [$ff70],a
xor a
ld hl,$d189
ld [hl+],a
ld [hl],a
;ld a,$ff
;ld [levelVars + VAR_GRUNT_TILE],a ;no more changing
ret
.setupBRAINIAC
ld hl,dialogSettings
set DLG_BRAINIAC_BIT,[hl]
ld c,BRAINIACINDEX
ret
.checkMonitorWarn
ld a,[levelVars + VAR_MONITOR_WARNING]
or a
ret nz
ld a,1
ld hl,((.checkMonitorWarn_hero-L0115_Check2)+levelCheckRAM)
jp CheckEachHero
.checkMonitorWarn_hero
ld c,a
call GetFirst
call GetCurZone
cp MONITORZONE
ld a,0
ret nz
;no warning if I'm in crouton disguise
call GetFGMapping
ld hl,levelVars + VAR_GRUNT_TILE
cp [hl]
ld a,0
ret z
ld a,1
ld [levelVars + VAR_MONITOR_WARNING],a
ld de,((.skipMonitorWarn-L0115_Check2)+levelCheckRAM)
call SetDialogSkip
call ((.clearSkipAfterDialog-L0115_Check2)+levelCheckRAM)
ld c,GUARDINDEX
DIALOGTOP monitor_onlyCroutons_gtx
WAITDIALOG STATE_MONITOR1
ld a,1
ret
.skipMonitorWarn
call ClearDialog
call MakeNonIdle
ld a,STATE_MONITOR1
ldio [mapState],a
ret
.monitorLocations
DW $d082
DW $d084
DW $d086
DW $d08c
DW $d08e
DW $d090
DW $d102
DW $d182
DW $d202
DW $d282
DW $d110
DW $d190
DW $d210
DW $d290
DW $d302
DW $d304
DW $d306
DW $d30c
DW $d30e
DW $d310 ;20 total (does not include entrance)
.adjustCameraInMonitorRoom
call GetMyHero
ld c,a
call GetFirst
call GetCurZone
cp 7
jr z,.adjustCamera
cp 9
ret nz
.adjustCamera
ld a,1
ld [camera_i],a
ld [camera_j],a
ret
.monitorToStatic
push bc
push de
push hl
;push hl
;ld hl,((.staticSound-L0115_Check2)+levelCheckRAM)
;call PlaySound
;pop hl
ld de,$2901
jr .monitorCommon
.monitorToBRAINIAC
push bc
push de
push hl
ld de,$2903
.monitorCommon
call ConvertLocHLToXY
push de
push hl
pop de
pop hl
ld bc,$0202
call BlitMap
pop hl
pop de
pop bc
ret
.animateStatic
ld a,[levelVars+VAR_STATIC]
ld b,a
ldio a,[updateTimer]
rrca
and %00000010
add b
ld hl,bgTileMap+STATICINDEX
ld [hl+],a
inc a
ld [hl+],a
ret
.checkBSAttack
;sets BS's group back to hero and get rid of his disguise
;if he attacks
ld a,[hero0_index]
call ((.groupToHero-L0115_Check2)+levelCheckRAM)
ld a,[hero1_index]
call ((.groupToHero-L0115_Check2)+levelCheckRAM)
ret
.groupToHero
or a
ret z
ld c,a
call GetFirst
call GetAttackDelay
or a
ret z
;have a copy of BS's original tile?
ld a,[levelVars + VAR_BS_TILE]
cp $ff
ret z
ld a,[levelVars + VAR_BS_TILE]
call SetFGMapping
ld b,METHOD_DRAW
call CallMethod
ld a,GROUP_HERO
call SetGroup
ld a,TILEINDEXBANK
ret
;.staticSound
;DB 4,$00,$f0,$20,$c0
L0115_CheckFinished:
PRINTT "0115 Script Sizes (Load/Init/Check) (of $500): "
PRINTV (L0115_LoadFinished - L0115_Load2)
PRINTT " / "
PRINTV (L0115_InitFinished - L0115_Init2)
PRINTT " / "
PRINTV (L0115_CheckFinished - L0115_Check2)
PRINTT "\n"