Prince-of-Persia-Apple-II/01 POP Source/Source/SUBS.S

1767 lines
22 KiB
ArmAsm
Executable File

* subs
DemoDisk = 0
EditorDisk = 0
CheckTimer = 0
org = $e000
tr on
lst off
*-------------------------------
*
* S U B S
*
*-------------------------------
org org
jmp ADDTORCHES
jmp DOFLASHON
jmp PAGEFLIP
jmp DEMO
jmp SHOWTIME
jmp DOFLASHOFF
jmp LRCLSE
jmp potioneffect
jmp checkalert
jmp reflection
jmp ADDSLICERS
jmp PAUSE
jmp bonesrise
jmp DEADENEMY
jmp PLAYCUT
jmp ADDLOWERSOUND
jmp REMOVEOBJ
jmp ADDFALL
jmp SETINITIALS
jmp STARTKID
jmp STARTKID1
jmp GRAVITY
jmp INITIALGUARDS
jmp MIRAPPEAR
jmp CRUMBLE
*-------------------------------
lst
put eq
lst
put gameeq
lst
put seqdata
lst
put movedata
lst
put soundnames
lst off
*-------------------------------
dum $f0
]Xcount ds 1
]Xend ds 1
tempstate ds 1
dend
POPside1 = $a9
POPside2 = $ad
* Message #s
LevelMsg = 1
ContMsg = 2
TimeMsg = 3
timemsgtimer = 20
mirscrn = 4
mirx = 4
miry = 0 ;also in topctrl, auto
*-------------------------------
do CheckTimer
min = 180
else
min = 1090 ;# frames per "minute"
fin ;actual frame rate approx. 11 fps)
sec = min/60
t = 60 ;game time limit
*-------------------------------
ALTZPon = $c009
ALTZPoff = $c008
RAMWRTaux = $c005
RAMWRTmain = $c004
RAMRDaux = $c003
RAMRDmain = $c002
*-------------------------------
SceneCount ds 2
*-------------------------------
* Level 13 only: When you enter, trigger loose floors on
* screen above
*-------------------------------
]rts rts
CRUMBLE
lda level
cmp #13
bne ]rts
lda VisScrn
cmp #23
beq :1
cmp #16
bne ]rts
;Trigger blocks 2-7 on bottom row of scrn above
:1 lda scrnAbove
sta tempscrn
lda #2
sta tempblocky
ldx #7
:loop stx tempblockx
jsr :trigloose
ldx tempblockx
dex
cpx #2
bcs :loop
]rts rts
:trigloose
jsr rdblock1
cmp #loose
bne ]rts
jsr rnd
and #$0f
eor #$ff
clc
adc #1
jmp breakloose1
*-------------------------------
* Add all flasks & torches on VisScrn to trans list
* & swords
*-------------------------------
ADDTORCHES
lda VisScrn
jsr calcblue
ldy #29
:loop lda (BlueType),y
and #idmask
cmp #torch
bne :c1
tya
pha
lda VisScrn
jsr trigtorch
pla
tay
bpl :cont
:c1 cmp #flask
bne :c2
tya
pha
lda VisScrn
jsr trigflask
pla
tay
bpl :cont
:c2 cmp #sword
bne :cont
tya
pha
lda VisScrn
jsr trigsword
pla
tay
:cont dey
bpl :loop
]rts rts
*-------------------------------
*
* In: A = length of pause (1-256)
*
*-------------------------------
PAUSE
:outer pha
ldx #0
:loop dex
bne :loop
pla
sec
sbc #1
bne :outer
]rts rts
*-------------------------------
*
* F L A S H
*
* Has a traumatic incident occured this frame?
* If so, do lightning flash
*
*-------------------------------
DOFLASHON
jsr lrclse
jsr vblank
lda $c054
lda $c056 ;show lores
rts
*-------------------------------
DOFLASHOFF
jsr vblank
lda PAGE
bne :1
lda $c055
:1 lda $c057 ;show hires
rts
*-------------------------------
*
* Clear lo-res screen only if we need to
*
* In: A = byte value
*
*------------------------------
LRCLSE
cmp scrncolor ;last scrncolor
beq ]rts
jmp lrcls
*-------------------------------
* Add all slicers on CharBlockY to trans list
*-------------------------------
slicetimer = 15 ;from mover
slicersync = 3 ;# frames out of sync
ADDSLICERS
lda #slicetimer
sta tempstate
lda CharScrn
jsr calcblue
ldy CharBlockY
cpy #3
bcs ]rts
lda Mult10,y
tay
clc
adc #10
sta :sm+1
:loop
lda (BlueType),y
and #idmask
cmp #slicer
bne :cont
lda (BlueSpec),y
tax
and #$7f
beq :ok
cmp #slicerRet
bcc :cont ;in mid-slice--leave it alone
:ok txa
and #$80 ;get hibit
ora tempstate
jsr trigslicer ;trigger slicer
jsr getnextstate
:cont iny
:sm cpy #0
bcc :loop
]rts rts
getnextstate
lda tempstate
sec
sbc #slicersync
cmp #slicerRet
bcs :ok
clc
adc #slicetimer+1-slicerRet
:ok sta tempstate
]rts rts
*-------------------------------
*
* Special animation lists for princess's room
*
*-------------------------------
ptorchx db 13,25,-1
ptorchoff db 0,6
ptorchy db 113,113
ptorchstate db 1,6
ptorchcount ds 1
psandcount ds 1
pstarcount ds 4
*-------------------------------
*
* Burn torches (Princess's room)
*
*-------------------------------
pburn
ldx ptorchcount ;last torch burned
inx
lda ptorchx,x
bpl :ok
ldx #0
:ok stx ptorchcount
lda ptorchx,x
sta XCO
lda ptorchoff,x
sta OFFSET
lda ptorchy,x
sta YCO
lda ptorchstate,x
jsr getflameframe
sta ptorchstate,x
tax
jsr psetupflame
jmp lay ;<---DIRECT HIRES CALL
*-------------------------------
*
* Flow sand
*
*-------------------------------
pflow
ldx psandcount
bmi ]rts ;no hourglass yet
inx
cpx #3
bcc :ok
ldx #0
:ok stx psandcount
ldy GlassState
jmp flow ;<---Contains direct hires call
*-------------------------------
*
* Twinkle stars
*
*-------------------------------
pstars
ldx #3
:loop lda pstarcount,x
beq :ok
dec pstarcount,x
bne :ok
txa
pha
jsr twinkle ;turn it off
pla
tax
:ok dex
bpl :loop
* New twinkle?
jsr rnd
cmp #10
bcs ]rts
jsr rnd
and #3
clc
adc #5 ;A = rnd length of twinkle (5-8)
pha
jsr rnd
jsr rnd
and #3
tax ;X = rnd star # (0-3)
pla
sta pstarcount,x
jmp twinkle ;<---Contains direct hires call
*-------------------------------
*
* P A G E F L I P
*
*-------------------------------
PAGEFLIP
jsr normspeed ;IIGS
lda PAGE
bne :1
lda #$20
sta PAGE
lda $C054 ;show page 1
:3 lda $C057 ;hires on
lda $C050 ;text off
lda vibes
beq :rts
lda $c05e
]rts rts
:rts lda $c05f
rts
:1 lda #0
sta PAGE
lda $C055 ;show page 2
jmp :3
*-------------------------------
*
* Play pre-recorded "princess" scenes
*
* In: A = scene #
*
*-------------------------------
AddrL db #PlayCut0,#PlayCut1,#PlayCut2,#PlayCut3
db #PlayCut4,#PlayCut5,#PlayCut6,#PlayCut7
db #PlayCut8
AddrH db #>PlayCut0,#>PlayCut1,#>PlayCut2,#>PlayCut3
db #>PlayCut4,#>PlayCut5,#>PlayCut6,#>PlayCut7
db #>PlayCut8
PLAYCUT
pha
jsr initit
pla
tax
do 0 ;temp
jmp PlayCut4
fin
lda AddrL,x
sta :sm+1
lda AddrH,x
sta :sm+2
:sm jsr $FFFF ;self-mod
lda #1
sta SPEED
]rts rts
*-------------------------------
do DemoDisk
PlayCut8
PlayCut4
PlayCut7
brk
else
*-------------------------------
* Cut #8: Princess sends out mouse
*-------------------------------
PlayCut8
jsr getglass
jsr addglass
jsr startP8
jsr SaveShad
jsr startM8
jsr SaveKid
lda #20
jsr play
lda #Mleave
jsr mjumpseq
lda #20
jsr play
lda #Prise
jsr pjumpseq
lda #20
jsr play
lda #0
sta KidPosn ;mouse disappears
ldx #50
lda #s_Heartbeat
jmp PlaySongX
*-------------------------------
* Cut #4: Mouse returns to princess
*-------------------------------
PlayCut4
jsr getglass
jsr addglass
jsr startP4
jsr SaveShad
jsr startM4
jsr SaveKid
lda #5
jsr play
lda #Pcrouch
jsr pjumpseq
lda #9
jsr play
lda #Mraise
jsr mjumpseq
lda #58
jmp play
*-------------------------------
* Happy ending
*-------------------------------
PlayCut7
lda #8
sta SPEED
lda #1
sta soundon
sta musicon ;they must listen!!
jsr startP7
jsr SaveShad
lda #8
jsr play
jsr startK7
jsr SaveKid
lda #8
jsr play
lda #Pembrace
jsr pjumpseq
lda #5
jsr play
lda #runstop
jsr vjumpseq
lda #2
jsr play
lda #0
sta KidPosn ;kid disappears on frame 8 of embrace
lda #9
jsr play
lda #s_Embrace
jsr PlaySong
jsr startM7
jsr SaveKid ;mouse runs in
lda #12
jsr play
lda #Mclimb
jsr mjumpseq
lda #30
jmp play
fin
*-------------------------------
* Tragic ending
*-------------------------------
PlayCut6
lda #22
sta SPEED
ldx #8 ;empty hourglass
jsr addglass
lda #2
jsr play
lda #s_Tragic
jsr PlaySong
lda #100
jmp play
*-------------------------------
* Princess cut #5
*-------------------------------
PlayCut5
jsr getglass
cpx #7
bcs Ominous ;sand is almost out--go for it
jmp PlayCut1
Ominous
jsr getglass
jsr addglass
jsr startP5
jsr SaveShad
lda #2
jsr play
ldx #50
lda #s_Heartbeat
jsr PlaySongX
lda #Palert
jsr pjumpseq ;princess hears something...
lda #12
jsr play
ldx #20
lda #s_Danger
jmp PlaySongX
*-------------------------------
* Princess cut #2 (lying down)
*-------------------------------
PlayCut2
jsr getglass
jsr addglass
jsr startP2
jsr SaveShad
lda #2
jsr play
ldx #50
lda #s_Heartbeat
jsr PlaySongX
]rts rts
*-------------------------------
* Princess cut #1 (standing)
*-------------------------------
PlayCut1
PlayCut3
jsr getglass
jsr addglass
jsr startP1
jsr SaveShad
lda #2
jsr play
ldx #50
lda #s_Timer
jmp PlaySongX
*-------------------------------
* Opening titles scene
*-------------------------------
PlayCut0
jsr startV0
jsr SaveKid
jsr startP0 ;put chars in starting posn
jsr SaveShad
lda #2
jsr play ;animate 2 frames
lda #s_Princess
ldx #8
jsr PlaySongI
lda #5
jsr play
lda #Palert
jsr pjumpseq ;princess hears something...
lda #9
jsr play
lda #s_Squeek
ldx #0
jsr PlaySongI ;door squeaks...
lda #7
sta SPEED
lda #5
jsr play
lda #Vapproach
jsr vjumpseq
lda #6
jsr play
lda #Vstop
jsr vjumpseq
lda #4
jsr play ;vizier enters
lda #s_Vizier
ldx #12
jsr PlaySongI
lda #4
jsr play
lda #Vapproach
jsr vjumpseq
lda #30
jsr play
lda #Vstop
jsr vjumpseq
lda #4
jsr play ;stops in front of princess
lda #s_Buildup
ldx #25
jsr PlaySongI
lda #Vraise ;raises arms
jsr vjumpseq
lda #1
jsr play
lda #Pback
jsr pjumpseq
lda #13
jsr play
ldx #0
jsr addglass1 ;hourglass appears
lda #5
sta lightning
lda #$ff
sta lightcolor
lda #12
sta SPEED
lda #5
jsr play
lda #0
sta psandcount ;sand starts flowing
lda #s_Magic
ldx #8
jsr PlaySongI
lda #7
sta SPEED
lda #Vexit
jsr vjumpseq
lda #17
jsr play
ldx #1
jsr addglass1 ;glass starts to fill
lda #12
jsr play
lda #Pslump
jsr pjumpseq
lda #28
jsr play
lda #12
sta SPEED
lda #s_StTimer
ldx #20
jmp PlaySongI
*-------------------------------
* Add hourglass to scene
* In: X = state
*-------------------------------
addglass
lda #0
sta psandcount ;start sand flowing
addglass1
stx GlassState
lda #2
sta redrawglass
]rts rts
*-------------------------------
* In: A = song #
* X = # cycles to play if sound is off
*-------------------------------
PlaySongX
tay
lda soundon
and musicon
bne :1
txa
jmp play
:1 tya ;falls thru to PlaySong
*-------------------------------
*
* Play Song (Princess's room)
*
* Button press ends song
*
* In: A = song #
*
*-------------------------------
PlaySong
jsr minit
jsr swpage
:loop lda #1
jsr strobe
lda $c061
ora $c062
ora keypress
bmi :interrupt
jsr pburn
jsr pstars
jsr pflow
jsr mplay
cmp #0
bne :loop
:interrupt
jmp swpage
*-------------------------------
*
* Play Song (Princess's room--Interruptible)
*
* Key or button press starts a new game
*
* In: A = song #
* X = # cycles to play if sound is off
*
*-------------------------------
PlaySongI
tay
lda soundon
and musicon
bne :1
txa
beq ]rts
jmp play
:1 tya
jsr minit
jsr swpage
:loop jsr musickeys
cmp #$80
bcs :interrupt
jsr pburn
jsr pstars
jsr pflow
jsr mplay
cmp #0
bne :loop
jmp swpage
:interrupt
jmp dostartgame
*-------------------------------
* Switch hires pages for duration of song
swpage
lda PAGE
eor #$20
sta PAGE
]rts rts
*-------------------------------
flashon
lda lightning
beq ]rts
lda lightcolor
jmp doflashon
flashoff
lda lightning
beq ]rts
dec lightning
jmp doflashoff
*-------------------------------
*
* Playback loop (simplified version of main loop in TOPCTRL)
*
* In: A = sequence length (# of frames)
*
*-------------------------------
play
sta SceneCount
playloop
jsr rnd
lda SPEED
jsr pause
jsr strobe ;strobe kbd & jstk
lda level
bne :notdemo
jsr demokeys
bpl :cont
lda #1
jmp dostartgame ;interrupted--start a new game
:notdemo lda $c061
ora $c062
ora keypress
bmi ]rts ;key or button to end scene
:cont jsr NextFrame ;Determine what next frame should look like
jsr flashon
jsr FrameAdv ;Update hidden page to reflect new reality
;& show it
jsr flashoff
lda soundon
beq :1
jsr playback ;play back sound fx
jsr zerosound
:1
; jsr songcues
dec SceneCount
bne playloop
rts
*-------------------------------
NextFrame
jsr DoKid ;kid/vizier/mouse
jsr DoShad ;always princess
]rts rts
*-------------------------------
FrameAdv
jsr DoFast
jsr vblank
jmp PageFlip
*-------------------------------
DoKid
jsr LoadKid
lda CharPosn
beq ]rts
jsr ctrlkidchar
jsr animchar ;Get next frame from sequence table
jsr SaveKid ;Save all changes to char data
]rts rts
*-------------------------------
DoShad
jsr LoadShadwOp
lda CharPosn
beq ]rts
jsr ctrlshadchar
jsr animchar
jmp SaveShad
*-------------------------------
ctrlkidchar
rts
ctrlshadchar
rts
*-------------------------------
DoFast
* Set up image lists
jsr zerolsts
lda redrawglass
beq :3
dec redrawglass
ldx GlassState
jsr drawglass ;hourglass
:3
jsr LoadKid ;can be kid or vizier
lda CharPosn
beq :1
jsr setupchar
lda #30
sta FCharIndex
jsr addkidobj
:1
jsr LoadShad ;always princess
lda CharPosn
beq :2
jsr setupchar
lda #30
sta FCharIndex
jsr addkidobj
jsr pmask ;kludge to mask face & hair
:2
jsr fast ;get char/objs into mid table
jsr drawpost ;big white post
* Draw to screen
jsr pburn
jsr pburn ;first put down 2 torch flames
jsr pstars ;& twinkle stars
jsr drawall ;...then draw the rest
jmp pflow ;& flow sand
]rts rts
*-------------------------------
*
* Jumpseq for princess & vizier
*
* In: A = sequence #
*
*-------------------------------
pjumpseq
pha
jsr LoadShad
pla
jsr jumpseq
jmp SaveShad
kjumpseq
mjumpseq
vjumpseq
pha
jsr LoadKid
pla
jsr jumpseq
jmp SaveKid
*-------------------------------
*
* Put characters in starting position for scene
*
*-------------------------------
floorY = 151
* mouse runs to princess
startM8
jsr startM4
lda #144
sta CharX
lda #Mstop
jsr jumpseq
jmp animchar
startM4
lda #24
sta CharID
lda #199
sta CharX
lda #floorY+1
sta CharY
lda #-1
sta CharFace
lda #Mscurry
jsr jumpseq
jmp animchar
* princess w/mouse
startP8
jsr startP0
lda #130
sta CharX
lda #floorY+3
sta CharY
lda #Pstroke
jsr jumpseq
jmp animchar
startP4
jsr startP1
lda #142
sta CharX
lda #floorY+3
sta CharY
lda #Pstand
jsr jumpseq
jmp animchar
startP5
jsr startP0
lda #160
sta CharX
rts
startP2
jsr startP0
lda #89
sta CharX
lda #floorY
sta CharY
lda #Plie
jsr jumpseq
jmp animchar
startP1
jsr startP0
lda #0
sta CharFace
rts
startP7
jsr startP0
lda #136
sta CharX
lda #floorY-2
sta CharY
lda #Pwaiting
ldx #1
cpx purpleflag
beq :ok
lda #120 ;crash (copy protect)
:ok jsr jumpseq
jmp animchar
startM7
jsr startM4
lda #floorY-2
sta CharY
rts
startP0
lda #5
sta CharID
lda #120
sta CharX
lda #floorY
sta CharY
lda #-1
sta CharFace
lda #Pstand
jsr jumpseq
jmp animchar
startV0
lda #6
sta CharID
lda #197
sta CharX
lda #floorY
sta CharY
lda #-1
sta CharFace
lda #Vstand
jsr jumpseq
jmp animchar
startK7
lda #0
sta CharID
lda #198
sta CharX
lda #floorY-2
sta CharY
lda #-1
sta CharFace
lda #startrun
jsr jumpseq
jmp animchar
*-------------------------------
* Demo commands
*-------------------------------
EndProg = -2
EndDemo = -1
Ctr = 0
Fwd = 1
Back = 2
Up = 3
Down = 4
Upfwd = 5
Press = 6
Release = 7
*-------------------------------
DemoProg1 ;up to fight w/1st guard
db 0,Ctr
db 1,Fwd
db 13,Ctr
db 30,Fwd ;start running...
db 37,Upfwd ;jump 1st pit
db 47,Ctr
db 48,Fwd ;& keep running
d1 = 65
db d1,Ctr ;stop
db d1+8,Back ;look back...
db d1+10,Ctr
db d1+34,Back
db d1+35,Ctr
d2 = 115
db d2,Upfwd ;jump 2nd pit
db d2+13,Press ;& grab ledge
db d2+21,Up
db d2+42,Release
db d2+43,Ctr
db d2+44,Fwd
db d2+58,Down
db d2+62,Ctr
db d2+63,Fwd
db d2+73,Ctr
d3 = 193
db d3,Fwd
db d3+12,Ctr
db d3+40,EndDemo
*-------------------------------
*
* D E M O
*
* Controls kid's movements during self-running demo
*
* (Called from PLAYERCTRL)
*
*-------------------------------
DEMO
lda #DemoProg1
ldx #>DemoProg1
jmp AutoPlayback
*-------------------------------
*
* Init princess cut
*
*-------------------------------
initit
lda #" "
sta scrncolor ;?
lda #0
sta vibes
sta redrawglass
sta KidPosn
sta ShadPosn
sta ptorchcount
ldx #3
:loop sta pstarcount,x
dex
bpl :loop
lda #-1 ;no hourglass yet
sta psandcount
lda #12
sta SPEED
jsr zeropeels
jsr zerored
jsr zerosound
]rts rts
*-------------------------------
*
* Get hourglass state (based on time left)
*
* In: FrameCount
* Out: X = glass state
*
*-------------------------------
getglass
jsr getminleft
ldx #7
lda MinLeft
cmp #6
bcc :got
dex
cmp #$11
bcc :got
dex
cmp #$21
bcc :got
dex
cmp #$41
bcc :got
dex
:got
]rts rts
*-------------------------------
*
* Show time if requested
* (& constant time display during final minute)
*
* In: timerequest (0 = no, 1-2 = auto, 3 = from kbd,)
* 4 = Vizier dead)
*
*-------------------------------
SHOWTIME
lda timerequest
beq ]rts
lda KidLife
bpl ]rts
jsr getminleft
lda MinLeft
cmp #2
bcs :normal
lda SecLeft
beq :timeup
* Countdown during final minute
lda level
cmp #14
bcs :normal
bcc :showsec ;stop countdown when clock stops
:timeup
lda timerequest
cmp #3
bcc ]rts ;Once t=0, show time only on kbd request
:normal
lda msgtimer
bne ]rts ;wait till other msgs are gone
lda #TimeMsg
sta message
lda #timemsgtimer
ldx timerequest
cpx #4
bcc :norm
:delay lda #timemsgtimer+5 ;delay 5 cycles
:norm sta msgtimer
lda #0
sta timerequest
]rts rts
:showsec
lda SecLeft
cmp #2
bcc :nomsg
lda message
cmp #TimeMsg
beq :2
lda msgtimer
bne ]rts
lda #TimeMsg
sta message
:2 lda #1
sta timerequest
lda #1
sta msgtimer
rts
:nomsg lda #0
sta timerequest
sta msgtimer
rts
*-------------------------------
* Add lowering-gate sound (only when gate is visible)
* In: A = state
*-------------------------------
ADDLOWERSOUND
lsr
bcc ]rts ;alt frames
lda level
cmp #3
bne :n
lda trscrn
cmp #2 ;Exception: Level 3, screen 2
beq :y
:n lda trscrn
cmp scrnLeft
bne :1
ldy trloc
cpy #9
beq :y
cpy #19
beq :y
cpy #29
beq :y ;visible to left
]rts rts
:1 cmp VisScrn
bne ]rts
ldy trloc
cpy #9
beq ]rts
cpy #19
beq ]rts
cpy #29
beq ]rts
:y lda #LoweringGate
jmp addsound
*-------------------------------
*
* Remove object
*
* In: A = lastpotion
*
*-------------------------------
REMOVEOBJ
sta lastpotion
ldx #1
stx clrbtn
lda #floor
sta (BlueType),y ;remove object
lda #0
sta (BlueSpec),y
lda #35 ;TEMP
sta height
lda #2
clc
jsr markwipe
jmp markred
*-------------------------------
*
* S E T I N I T I A L S
*
* Set initial states of gadgets
*
*-------------------------------
SETINITIALS
lda INFO ;number of screens +1
sec
sbc #1
sta SCRNUM
:loop jsr DoScrn ;for every screen
dec SCRNUM
bne :loop
rts
*-------------------------------
DoScrn
lda SCRNUM
jsr calcblue
ldy #29
:loop jsr getinitobj
bcc :skip
sta (BlueSpec),y
:skip dey
bpl :loop
rts
*-------------------------------
*
* S T A R T K I D
*
* Put kid in his starting position for this level
*
*-------------------------------
STARTKID
lda level
cmp #3
bne :nomile
* Level 3 milestone?
:special3
lda milestone ;set to 1 when he gets past 1st gate
beq :nomile
lda #-1
sta KidStartFace
lda #2
sta KidStartScrn
lda #6
sta KidStartBlock ;put him just inside 1st gate...
lda #7
ldx #4
ldy #0
jsr rdblock
lda #space
sta (BlueType),y ;remove loose floor...
;& continue
:nomile
lda KidStartScrn ;in INFO
sta CharScrn
lda KidStartBlock
jsr unindex ;return A = blockx, X = blocky
sta CharBlockX
stx CharBlockY
lda CharBlockX
jsr getblockej
clc
adc #angle+7
sta CharX ;put kid on starting block
lda KidStartFace
eor #$ff
sta CharFace
lda origstrength
ldx level
bne :notdemo
lda #4
:notdemo sta MaxKidStr
sta KidStrength
do EditorDisk
jmp :normal
fin
lda level
cmp #1
beq :special1
cmp #13
beq :special13
bne :normal
* Special start for Level 1
:special1
lda #5 ;scrn
ldx #2 ;blockx
ldy #0 ;blocky
jsr rdblock
jsr pushpp ;slam gate shut
lda #stepfall
jsr jumpseq
jmp STARTKID1
* & for level 13
:special13
lda #running
jsr jumpseq
jmp STARTKID1
* Normal start
:normal lda #turn
jsr jumpseq ;start in standing posn
STARTKID1
ldx CharBlockY
lda FloorY+1,x
sta CharY
lda #-1
sta CharLife ;ff = alive
lda #0 ;kid
sta CharID
lda #0
sta CharXVel
sta CharYVel
sta waitingtojump
sta weightless
sta invert
sta jarabove
sta droppedout
sta CharSword
sta offguard
:done jsr animchar ;get next frame
* WTLESS level only--kid falls into screen
lda level
cmp #7 ;WTLESS level
bne :notsp
lda yellowflag ;should be -
bmi :yelok
lda #$40
sta timebomb ;2nd level copy protection
:yelok
lda CharScrn
cmp #17
bne :notsp
lda #3 ;down
jsr cut
:notsp
jmp SaveKid ;save KidVars
]rts rts
*-------------------------------
*
* G R A V I T Y
*
*-------------------------------
TermVelocity = 33
AccelGravity = 3
WtlessTermVel = 4
WtlessGravity = 1
GRAVITY
lda CharAction
cmp #4
bne ]rts
lda weightless
bne :wtless
lda CharYVel
clc
adc #AccelGravity
cmp #TermVelocity
bcc :ok
lda #TermVelocity
:ok sta CharYVel
]rts rts
:wtless lda CharYVel
clc
adc #WtlessGravity
cmp #WtlessTermVel
bcc :ok
lda #WtlessTermVel
bcs :ok
*-------------------------------
*
* Add falling velocity
*
*-------------------------------
ADDFALL
lda CharYVel
clc
adc CharY
sta CharY
* X-vel
lda CharAction
cmp #4 ;freefall?
bne ]rts
lda CharXVel
jsr addcharx
sta CharX
jmp rereadblocks
*-------------------------------
*
* Set initial guard posns for entire level (call once)
*
*-------------------------------
INITIALGUARDS
ldy #24 ;screen #
:loop
lda GdStartBlock-1,y
cmp #30
bcs :nogd
jsr unindex ;A = blockx
jsr getblockej
clc
adc #angle+7
sta GdStartX-1,y
lda #0
sta GdStartSeqH-1,y
:nogd dey
bne :loop
]rts rts
*-------------------------------
*
* Newly dead enemy--play music (or whatever)
*
* In: Char vars
*
*-------------------------------
DEADENEMY
lda level
beq :demo
cmp #13
beq :wingame
lda CharID
cmp #1
beq ]rts ;shadow
lda #s_Vict
ldx #25
jsr cuesong
]rts rts
:demo lda #1
sta milestone ;start demo, part 2
lda #0
sta PreRecPtr
sta PlayCount
rts
:wingame lda #s_Upstairs
ldx #25
jsr cuesong
lda #$ff ;white
sta lightcolor
lda #10
sta lightning
lda #1
sta exitopen
lda #4
sta timerequest
lda #24
ldx #0
ldy #0
jsr rdblock
jmp pushpp ;open exit
*-------------------------------
* Mirror appears (called by MOVER when exit opened)
*-------------------------------
MIRAPPEAR
do DemoDisk
rts
else
lda level
cmp #4
bne ]rts
lda #mirscrn
ldx #mirx
ldy #miry
jsr rdblock
lda #mirror
sta (BlueType),y
rts
fin
*-------------------------------
lst
ds 1
usr $a9,20,$400,*-org
lst off