BRIGHTENPOINTS:
; d0=brightness value
; d1=XPOS
; d2=ZPOS
; d3=ROOMNUMBER

 tst.w d0
 bgt DARKENPOINTS

 movem.l d0-d7/a0-a6,-(a7)

 move.l ZoneAdds,a0
 move.l (a0,d3.w*4),a0
 add.l LEVELDATA,a0
 move.l #CurrentPointBrights,a2
 move.l Points,a3
 
 move.l a0,a1
 add.w ToZonePts(a0),a1
BRIGHTPTS:
 move.w (a1)+,d4
 blt.s brightall
 move.w (a3,d4.w*4),d5
 move.w 2(a3,d4.w*4),d6
 sub.w d1,d5
 bgt.s .okpos1
 neg.w d5
.okpos1
 
 sub.w d2,d6
 bgt.s .okpos2
 neg.w d6
.okpos2

 add.w d5,d6
 asr.w #5,d6
 add.w d0,d6
 bge.s BRIGHTPTS
 
 add.w d6,(a2,d4.w*4)
 add.w d6,2(a2,d4.w*4)
 bra.s BRIGHTPTS

brightall:

 movem.l (a7)+,d0-d7/a0-a6
 rts


BRIGHTENPOINTSANGLE:
; d0=brightness value
; d1=XPOS
; d2=ZPOS
; d3=ROOMNUMBER
; d4=ANGLE

 movem.l d0-d7/a0-a6,-(a7)

 move.l #SineTable,a0
 lea (a0,d4.w),a4

 move.l ZoneAdds,a0
 move.l (a0,d3.w*4),a0
 add.l LEVELDATA,a0
 move.l #CurrentPointBrights,a2
 move.l Points,a3
 
 move.l a0,a1
 add.w ToZonePts(a0),a1
BRIGHTPTSA:
 move.w (a1)+,d3
 blt brightallA
 move.w (a3,d3.w*4),d4
 move.w 2(a3,d3.w*4),d5

 sub.w d1,d4
 move.w d4,d6
 bgt.s .okpos1
 neg.w d4
.okpos1
 
 sub.w d2,d5
 move.w d5,d7
 bgt.s .okpos2
 neg.w d5
.okpos2

 movem.l d0/d1/d2/d3/d4/d5,-(a7)
 
 move.w (a4),d0
 move.w 2048(a4),d1
 muls d7,d1
 muls d6,d0
 add.l d0,d1
 ble.s BEHINDPT
 move.l d1,d5
 neg.l d5
 add.l #30*65536,d5
 bge.s .okkkkk
 moveq #0,d5
.okkkkk
 
 move.w (a4),d0
 move.w 2048(a4),d1
; ext.l d0
; ext.l d1
; asl.l #6,d1
; asl.l #6,d0
; swap d0
; swap d1
; neg.w d0
; neg.w d1
; add.w d6,d0
; add.w d7,d1
 
 muls d0,d7
 muls d1,d6
 sub.l d6,d7
 bgt.s .okkk
 neg.l d7
.okkk
 
 add.l d5,d7
 asl.l #4,d7
 swap d7

 movem.l (a7)+,d0/d1/d2/d3/d4/d5

 add.w d7,d5
 add.w d4,d5
 asr.w #7,d5
 add.w d0,d5
 bge BRIGHTPTSA
 
 add.w d5,(a2,d3.w*4)
 add.w d5,2(a2,d3.w*4)
 bra BRIGHTPTSA

BEHINDPT:
 movem.l (a7)+,d0/d1/d2/d3/d4/d5
 bra BRIGHTPTSA 

brightallA:

 movem.l (a7)+,d0-d7/a0-a6
 rts
 
DARKENPOINTS
 movem.l d0-d7/a0-a6,-(a7)

 move.l ZoneAdds,a0
 move.l (a0,d3.w*4),a0
 add.l LEVELDATA,a0
 move.l #CurrentPointBrights,a2
 move.l Points,a3
 
 move.l a0,a1
 add.w ToZonePts(a0),a1
DARKPTS:
 move.w (a1)+,d4
 blt.s DARKall
 move.w (a3,d4.w*4),d5
 move.w 2(a3,d4.w*4),d6
 sub.w d1,d5
 bgt.s .okpos1
 neg.w d5
.okpos1
 
 sub.w d2,d6
 bgt.s .okpos2
 neg.w d6
.okpos2

 add.w d5,d6
 asr.w #5,d6
 add.w d0,d6
 ble.s DARKPTS
 
 add.w d6,(a2,d4.w*4)
 add.w d6,2(a2,d4.w*4)
 bra.s DARKPTS

DARKall:

 movem.l (a7)+,d0-d7/a0-a6
 rts
 
Flash:

; D0=number of a zone, D1=brightness change

 cmp.w #-20,d1
 bgt.s .okflash
 move.w #-20,d1
.okflash:

 movem.l d0/a0/a1,-(a7)

 move.l #CurrentPointBrights,a1

 move.l ZoneAdds,a0
 move.l (a0,d0.w*4),a0
 add.l LEVELDATA,a0
 
 move.l a0,-(a7)
 
 add.w ToZonePts(a0),a0
flashpts:
 move.w (a0)+,d2
 blt.s flashedall
 add.w d1,(a1,d2.w*4)
 add.w d1,2(a1,d2.w*4)
 bra flashpts

flashedall:
 move.l (a7)+,a0

 move.l #ZoneBrightTable,a1
 add.w d1,(a1,d0.w*4)
 add.w d1,2(a1,d0.w*4)

 add.l #ToListOfGraph,a0

doemall:
 move.w (a0),d0
 blt.s doneemall
 add.w d1,(a1,d0.w*4)
 add.w d1,2(a1,d0.w*4)
 addq #8,a0
 bra.s doemall

doneemall:
 movem.l (a7)+,d0/a0/a1

 rts

prot2: dc.w 0

radius: dc.w 0

ExplodeIntoBits:

 move.w d3,radius

 cmp.w #7,d2
 ble.s .oksplut
 move.w #7,d2
.oksplut:

 move.l NastyShotData,a5
 move.w #19,d1
.findeight
 move.w 12(a5),d0
 blt.s .gotonehere
 adda.w #64,a5
 dbra d1,.findeight
 rts
 
.gotonehere
 
 move.b #0,damagetaken(a5)
 move.b #0,numlives(a5)

 move.l ObjectPoints,a2
 move.w (a5),d3
 lea (a2,d3.w*8),a2
; jsr GetRand
; lsr.w #4,d0
; move.w radius,d1
; and.w d1,d0
; asr.w #1,d1
; sub.w d1,d0
 move.w newx,d0
 move.w d0,(a2)
; jsr GetRand
; lsr.w #4,d0
; move.w radius,d1
; and.w d1,d0
; asr.w #1,d1
; sub.w d1,d0
 move.w newz,d0
 move.w d0,4(a2)

 jsr GetRand
 and.w #8190,d0
 move.l #SineTable,a2
 adda.w d0,a2
 move.w (a2),d3
 move.w 2048(a2),d4
 Jsr GetRand
 and.w #3,d0
 add.w #1,d0
 ext.l d3
 ext.l d4
 asl.l d0,d3
 asl.l d0,d4
 move.l ImpactX(a0),d0
 swap d4
 asr.w #1,d0
 add.w d0,d4
 swap d0
 move.w d4,shotzvel(a5)
 swap d3
 asr.w #1,d0
 add.w d0,d3
 move.w d3,shotxvel(a5)
 jsr GetRand
 and.w #1023,d0
 add.w #2*128,d0
 neg.w d0
 move.w d0,shotyvel(a5)
 move.l #0,EnemyFlags(a5)
 move.w 12(a0),12(a5)
 
; jsr GetRand
; lsr.w #4,d0
; move.w radius,d1
; and.w d1,d0
; asr.w #1,d1
; sub.w d1,d0
 move.w 4(a0),d0
 add.w #6,d0
 ext.l d0
 asl.l #7,d0
 
 move.l d0,accypos(a5)
 move.w d2,d0
 and.w #3,d0
 add.w #50,d0
 move.b d0,shotsize(a5)
 move.w #40,shotgrav(a5)
 move.w #0,shotflags(a5)
 move.w #-1,shotlife(a5)
 move.b #2,16(a5)
 clr.b shotstatus(a5)
 move.b ObjInTop(a0),ObjInTop(a5)
 st worry(a0)
 adda.w #64,a5
 sub.w #1,d2
 blt.s .gotemall
 dbra d1,.findeight

.gotemall
 
 rts

brightanim:

 move.l #BrightAnimTable,a1
 move.l #BrightAnimPtrs,a3
 move.l #BrightAnimStarts,a4
dobrightanims
 move.l (a3),d0
 blt nomoreanims
 move.l d0,a2
 move.w (a2)+,d0
 cmp.w #999,d0
 bne.s itsabright
 move.l (a4),a2
 move.w (a2)+,d0
itsabright:
 move.l a2,(a3)+
 addq #4,a4
 move.w d0,(a1)+
 bra.s dobrightanims

nomoreanims:
 rts
 
BrightAnimTable: ds.w 20
BrightAnimPtrs:
 dc.l PulseANIM
 dc.l FlickerANIM
 dc.l FireFlickerANIM
 dc.l -1

BrightAnimStarts:
 dc.l PulseANIM
 dc.l FlickerANIM
 dc.l FireFlickerANIM

PulseANIM:
 dc.w -10,-10,-9,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10
 dc.w 10,9,8,7,6,5,4,3,2,1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9
 dc.w 999

FlickerANIM:
 dcb.w 20,10
 dc.w -10
 dcb.w 30,10
 dc.w -10
 dcb.w 5,10
 dc.w -10
 dc.w 999
 
FireFlickerANIM:
 dc.w -10,-9,-6,-10,-6,-5,-5,-7,-5,-10,-9,-8,-7,-5,-5,-5,-5
 dc.w -5,-5,-5,-5,-6,-7,-8,-9,-5,-10,-9,-10,-6,-5,-5,-5,-5,-5
 dc.w -5,-5
 dc.w 999

realtab:
 dc.l prot1-78935450
 dc.l prot2-78935450
 dc.l prot3-78935450
 dc.l prot4-78935450
 dc.l prot5-78935450
 dc.l prot6-78935450
 dc.l prot7-78935450
 dc.l prot8-78935450
 dc.l prot9-78935450
 dc.l protA-78935450

objvels: ds.l 8

FramesToDraw: dc.w 0
TempFrames: dc.w 0

objmoveanim:

 move.l PLR1_Roompt,a0
 move.w (a0),PLR1_Zone
 move.l PLR2_Roompt,a0
 move.w (a0),PLR2_Zone

 move.w #0,PLAYERNOISEVOL

 bsr Player1Shot
 bsr Player2Shot
 bsr SwitchRoutine
 bsr DoorRoutine
 bsr LiftRoutine
 bsr ObjectHandler
 bsr brightanim
 
 subq.w #1,animtimer
 bgt.s notzero
 move.w #2,animtimer
 move.l otherrip,d0
 move.l RipTear,otherrip
 move.l d0,RipTear
notzero:

 rts
 
******************************

tstdir: dc.w 0

liftheighttab: ds.w 40
doorheighttab: ds.w 40
PLR1_stoodonlift: dc.b 0
PLR2_stoodonlift: dc.b 0
liftattop: dc.b 0
liftatbot: dc.b 0
ZoneBrightTable:
 ds.l 300

DoWaterAnims:

 move.w #20,d0
wateranimlop:
 move.l (a0)+,d1
 move.l (a0)+,d2
 move.l (a0),d3
 move.w 4(a0),d4
 move.w d4,d5
 muls TempFrames,d5
 add.l d5,d3
 cmp.l d1,d3
 bgt.s waternotattop
 
 move.l d1,d3
 move.w #128,d4
 bra waterdone
 
waternotattop:

 cmp.l d2,d3
 blt.s waterdone
 
 move.l d2,d3
 move.w #-128,d4

waterdone:
 
 move.l d3,(a0)+
 move.w d4,(a0)+
 move.l d3,d1
morezones:
 move.w (a0)+,d2
 bge.s okzone
 
 
 dbra d0,wateranimlop
 rts

okzone:

 move.l (a0)+,a1
 add.l LEVELGRAPHICS,a1
 move.l d1,d3
 asr.l #6,d3
 move.w d3,2(a1)
 move.l ZoneAdds,a1
 move.l (a1,d2.w*4),a1
 add.l LEVELDATA,a1
 move.l d1,ToZoneWater(a1)

 bra.s morezones

 rts

 even
LiftRoutine:

 move.l LiftData,a0
 move.l #liftheighttab,a6
 
doalift:
 
 move.w (a0)+,d0	; bottom of lift movement
 cmp.w #999,d0
 bne notallliftsdone
 move.w #999,(a6)
 
 bsr DoWaterAnims
 
 rts
 
notallliftsdone:
 move.w (a0)+,d1	; top of lift movement.
 
 move.w (a0),d3
 move.w d3,(a6)+
 move.w 2(a0),d2
 move.w d2,d7
 muls TempFrames,d2
 add.w d2,d3
 move.w 2(a0),d2
 cmp.w d3,d0
 sle.s liftatbot
 bgt.s .nolower
 moveq #0,d2
 move.w d0,d3
.nolower:

 cmp.w d3,d1
 sge.s liftattop
 blt.s .noraise
 moveq #0,d2
 move.w d1,d3
.noraise:

 sub.w d3,d0
 cmp.w #15*16,d0
 slt d6

 move.w d3,(a0)+
 move.l a0,a5
 move.w d2,(a0)+
 move.w d2,d7
 
 move.l (a0)+,a1
 add.l LEVELGRAPHICS,a1
 asr.w #2,d3
 move.w d3,d0
 asl.w #2,d0
 move.w d0,2(a1)
 move.w d3,d0
 muls #256,d3
 move.w (a0)+,d5
 move.l ZoneAdds,a1
 move.l (a1,d5.w*4),a1
 add.l LEVELDATA,a1
 move.w (a1),d5
 move.l PLR1_Roompt,a3
 move.l d3,2(a1)
 neg.w d0
 
 cmp.w (a3),d5
 seq.s PLR1_stoodonlift
 move.l PLR2_Roompt,a3
 cmp.w (a3),d5
 seq.s PLR2_stoodonlift
 
 move.w (a0)+,d2	; conditions
 and.w Conditions,d2
 cmp.w -2(a0),d2
 beq.s .satisfied 
 
 move.w (a0)+,d5
 
.dothesimplething:
 move.l FloorLines,a3
.simplecheck:
 move.w (a0)+,d5
 blt nomoreliftwalls
 asl.w #4,d5
 lea (a3,d5.w),a4
 move.w #0,14(a4)
 move.l (a0)+,a1
 add.l LEVELGRAPHICS,a1
 move.l (a0)+,a2
 adda.w d0,a2
 move.l a2,10(a1)
 move.l d3,20(a1)
 bra.s .simplecheck
 bra nomoreliftwalls 
 
.satisfied:

 move.l FloorLines,a3
 moveq #0,d4
 moveq #0,d5
 move.b (a0)+,d4
 move.b (a0)+,d5
 tst.b liftattop
 bne tstliftlower
 tst.b liftatbot
 bne tstliftraise
 move.w #0,d1
 
backfromlift

 and.w #255,d0

liftwalls:
 move.w (a0)+,d5
 blt nomoreliftwalls

 asl.w #4,d5
 lea (a3,d5.w),a4
 move.w 14(a4),d4
 move.w #$8000,14(a4)
 and.w d1,d4
 beq.s .nothinghit
 move.w d7,(a5)
 move.w #0,Noisex
 move.w #0,Noisez
 move.w #50,Noisevol
 move.w #5,Samplenum
 move.b #1,chanpick
 st notifplaying
 move.b #$fe,IDNUM
 movem.l a0/a3/a4/d0/d1/d2/d3/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a3/a4/d0/d1/d2/d3/d6/d7
.nothinghit:
 move.l (a0)+,a1
 add.l LEVELGRAPHICS,a1
 move.l (a0)+,a2
 adda.w d0,a2
 move.l a2,10(a1)
 move.l d3,20(a1)
 bra liftwalls
 
nomoreliftwalls 
 bra doalift

 rts
 
tstliftlower:
 cmp.b #1,d5
 blt.s lift0
 beq.s lift1
 cmp.b #3,d5
 blt.s lift2
 beq.s lift3

lift0:

 moveq #0,d1
 tst.b p1_spctap
 beq.s .noplr1
 move.w #%100000000,d1
 move.w #4,d7
 tst.b PLR1_stoodonlift
 beq.s .noplr1
 move.w #$8000,d1
 bra backfromlift
 
.noplr1:
 tst.b p2_spctap
 beq.s .noplr2
 or.w #%100000000000,d1
 move.w #4,d7
 tst.b PLR2_stoodonlift
 beq.s .noplr2
 move.w #$8000,d1
 bra backfromlift
 
.noplr2:
 bra backfromlift

lift1:
 move.w #4,d7
 tst.b PLR1_stoodonlift
 bne.s lift1b
 tst.b PLR2_stoodonlift
 bne.s lift1b
 move.w #%100100000000,d1
 bra backfromlift
lift1b:
 move.w #$8000,d1
 bra backfromlift
 
lift2:
 move.w #$8000,d1
 move.w #4,d7
 bra backfromlift

lift3:
 move.w #$0,d1
 bra backfromlift

tstliftraise:
 cmp.b #1,d4
 blt.s rlift0
 beq.s rlift1
 cmp.b #3,d4
 blt.s rlift2
 beq.s rlift3

rlift0:

 moveq #0,d1
 tst.b p1_spctap
 beq.s .noplr1
 move.w #%100000000,d1
 move.w #-4,d7
 tst.b PLR1_stoodonlift
 beq.s .noplr1
 move.w #$8000,d1
 bra backfromlift
 
.noplr1:
 tst.b p2_spctap
 beq.s .noplr2
 or.w #%100000000000,d1
 move.w #-4,d7
 tst.b PLR2_stoodonlift
 beq.s .noplr2
 move.w #$8000,d1
 bra backfromlift
 
.noplr2:

 bra backfromlift

rlift1:
 move.w #-4,d7
 tst.b PLR1_stoodonlift
 bne.s rlift1b
 tst.b PLR2_stoodonlift
 bne.s rlift1b
 move.w #%100100000000,d1
 bra backfromlift
rlift1b:
 move.w #$8000,d1
 bra backfromlift

rlift2:
 move.w #$8000,d1
 move.w #-4,d7
 bra backfromlift

rlift3:
 move.w #$0,d1
 bra backfromlift


animtimer: dc.w 2
 
 
doordir: dc.w -1
doorpos: dc.w -9
dooropen: dc.b 0
doorclosed: dc.b 0 
 
 even 
DoorRoutine:

 move.l #doorheighttab,a6
 move.l DoorData,a0
 
doadoor:
 
 move.w (a0)+,d0	; bottom of door movement
 cmp.w #999,d0
 bne notalldoorsdone
 move.w #999,(a6)+
 rts
notalldoorsdone:
 move.w (a0)+,d1	; top of door movement.
 
 move.w (a0),d3
 move.w d3,(a6)+
 move.w 2(a0),d2
 muls TempFrames,d2
 add.w d2,d3
 move.w 2(a0),d2
 cmp.w d3,d0
 sle.s doorclosed
 bgt.s nolower
 moveq #0,d2
nolower:

 cmp.w d3,d1
 sge.s dooropen
 blt.s noraise
 moveq #0,d2
 move.w d1,d3
noraise:

 sub.w d3,d0
 cmp.w #15*16,d0
 sge d6

 move.w d3,(a0)+
 move.l a0,a5
 move.w d2,(a0)+
 move.w d2,d7
 
 move.l (a0)+,a1
 add.l LEVELGRAPHICS,a1
 asr.w #2,d3
 move.w d3,d0
 asl.w #2,d0
 move.w d0,2(a1)
 move.w d3,d0
 muls #256,d3
 move.l ZoneAdds,a1
 move.w (a0)+,d5
 
 
 move.l (a1,d5.w*4),a1
 add.l LEVELDATA,a1
 move.l d3,6(a1)
 neg.w d0
 and.w #255,d0
; add.w #64,d0

 cmp.w PLR1_Zone,d5
 bne.s NotGoBackUp
 tst.b dooropen
 bne.s NotGoBackUp
 tst.w d2
 blt.s NotGoBackUp
 move.w #-16,d7
 move.w #$8000,d1
 move.w (a0)+,d2
 move.w (a0)+,d5
 bra backfromtst
NotGoBackUp:

 move.w (a0)+,d2	; conditions
 and.w Conditions,d2

 cmp.w -2(a0),d2
 beq.s satisfied 

 move.w (a0)+,d5

dothesimplething:
 move.l FloorLines,a3
simplecheck:
 move.w (a0)+,d5
 blt nomoredoorwalls
 asl.w #4,d5
 lea (a3,d5.w),a4
 move.w #0,14(a4)
 move.l (a0)+,a1
 add.l LEVELGRAPHICS,a1
 move.l (a0)+,a2
 adda.w d0,a2
 move.l a2,10(a1)
 move.l d3,24(a1)
 bra.s simplecheck
 bra nomoredoorwalls 
 
 
satisfied:
 
 moveq #0,d4
 moveq #0,d5
 move.b (a0)+,d5
 move.b (a0)+,d4
 tst.b dooropen
 bne tstdoortoclose
 tst.b doorclosed
 bne tstdoortoopen
 move.w #$0,d1

backfromtst:
 
 move.l FloorLines,a3

doorwalls:
 move.w (a0)+,d5
 blt.s nomoredoorwalls
 asl.w #4,d5
 lea (a3,d5.w),a4
 move.w 14(a4),d4
 move.w #$8000,14(a4)
 and.w d1,d4
 beq.s nothinghit
 move.w d7,(a5)
 move.w #0,Noisex
 move.w #0,Noisez
 move.w #50,Noisevol
 move.w #5,Samplenum
 move.b #1,chanpick
 clr.b notifplaying
 move.b #$fd,IDNUM
 movem.l a0/a3/d0/d1/d2/d3/d6,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a3/d0/d1/d2/d3/d6
nothinghit:
 move.l (a0)+,a1
 add.l LEVELGRAPHICS,a1
 move.l (a0)+,a2
 adda.w d0,a2
 move.l a2,10(a1)
 move.l d3,24(a1)
 bra.s doorwalls
 
nomoredoorwalls 
 bra doadoor

 rts
 
tstdoortoopen:
 cmp.w #1,d5
 blt.s door0
 beq.s door1
 cmp.w #3,d5
 blt.s door2
 beq.s door3
 cmp.w #5,d5
 blt.s door4
 beq.s door5
 
door0:

 move.w #$0,d1
 tst.b p1_spctap
 beq.s .noplr1
 move.w #%100000000,d1
.noplr1:
 tst.b p2_spctap
 beq.s .noplr2
 or.w #%100000000000,d1
.noplr2:
 move.w #-16,d7
 bra backfromtst

door1:
 move.w #%100100000000,d1
 move.w #-16,d7
 bra backfromtst

door2:
 move.w #%10000000000,d1
 move.w #-16,d7
 bra backfromtst

door3:
 move.w #%1000000000,d1
 move.w #-16,d7
 bra backfromtst

door4:
 move.w #$8000,d1
 move.w #-16,d7
 bra backfromtst
 
door5:
 move.w #$0,d1
 bra backfromtst
 
tstdoortoclose:
 tst.w d4
 beq.s dclose0
 bra.s dclose1

dclose0:
 move.w #4,d7
 move.w #$8000,d1
 bra backfromtst

dclose1:
 move.w #$0,d1
 bra backfromtst
 
SwitchRoutine:

 move.l SwitchData,a0
 move.w #7,d0
 move.l Points,a1
CheckSwitches

 tst.b p1_spctap
 bne p1_SpaceIsPressed
backtop2
 tst.b p2_spctap
 bne p2_SpaceIsPressed
backtoend

 tst.b 2(a0)
 beq nobutt

 tst.b 10(a0)
 beq nobutt
 
 move.w TempFrames,d1
 add.w d1,d1
 add.w d1,d1
 sub.b d1,3(a0)
 bne nobutt
 
 move.b #0,10(a0)
 move.l 6(a0),a3
 add.l LEVELGRAPHICS,a3
 move.w #11,4(a3)
 move.w (a3),d3
 and.w #%00000111100,d3
 move.w d3,(a3)
 move.w #7,d3
 sub.w d0,d3
 addq #4,d3
 move.w Conditions,d4
 bclr d3,d4
 move.w d4,Conditions
 move.w #0,Noisex
 move.w #0,Noisez
 move.w #50,Noisevol
 move.w #10,Samplenum
 move.b #1,chanpick
 st notifplaying
 move.b #$fc,IDNUM
 movem.l a0/a3/d0/d1/d2/d3/d6,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a3/d0/d1/d2/d3/d6

nobutt:

 adda.w #14,a0
 dbra d0,CheckSwitches
 rts

p1_SpaceIsPressed:
 move.w p1_xoff,d1
 move.w p1_zoff,d2
 move.w (a0),d3
 blt .NotCloseEnough
 move.w 4(a0),d3
 lea (a1,d3.w*4),a2
 move.w (a2),d3
 add.w 4(a2),d3
 asr.w #1,d3
 move.w 2(a2),d4
 add.w 6(a2),d4
 asr.w #1,d4
 sub.w d1,d3
 muls d3,d3
 sub.w d2,d4
 muls d4,d4
 add.l d3,d4
 cmp.l #60*60,d4
 bge .NotCloseEnough
 move.l 6(a0),a3
 add.l LEVELGRAPHICS,a3
 move.w #11,4(a3)
 move.w (a3),d3
 and.w #%00000111100,d3
 not.b 10(a0)
 beq.s .switchoff
 or.w #2,d3
.switchoff: 
 move.w d3,(a3)
 move.w #7,d3
 sub.w d0,d3
 addq #4,d3
 move.w Conditions,d4
 bchg d3,d4
 move.w d4,Conditions
 move.b #0,3(a0)
 move.w #0,Noisex
 move.w #0,Noisez
 move.w #50,Noisevol
 move.w #10,Samplenum
 move.b #1,chanpick
 st notifplaying
 move.b #$fc,IDNUM
 movem.l a0/a3/d0/d1/d2/d3/d6,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a3/d0/d1/d2/d3/d6
 
.NotCloseEnough:
 bra backtop2

p2_SpaceIsPressed:
 move.w p2_xoff,d1
 move.w p2_zoff,d2
 move.w (a0),d3
 blt .NotCloseEnough
 move.w 4(a0),d3
 lea (a1,d3.w*4),a2
 move.w (a2),d3
 add.w 4(a2),d3
 asr.w #1,d3
 move.w 2(a2),d4
 add.w 6(a2),d4
 asr.w #1,d4
 sub.w d1,d3
 muls d3,d3
 sub.w d2,d4
 muls d4,d4
 add.l d3,d4
 cmp.l #60*60,d4
 bge .NotCloseEnough
 move.l 6(a0),a3
 add.l LEVELGRAPHICS,a3
 move.w #11,4(a3)
 move.w (a3),d3
 and.w #%00000111100,d3
 not.b 10(a0)
 beq.s .switchoff
 or.w #2,d3
.switchoff: 
 move.w d3,(a3)
 move.w #7,d3
 sub.w d0,d3
 addq #4,d3
 move.w Conditions,d4
 bchg d3,d4
 move.w d4,Conditions
 movem.l a0/a1/d0,-(a7)
 move.w #0,Noisex
 move.w #0,Noisez
 move.w #50,Noisevol
 move.w #10,Samplenum
 move.b #1,chanpick
 st notifplaying
 move.b #$fc,IDNUM
 movem.l a0/a3/d0/d1/d2/d3/d6,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a3/d0/d1/d2/d3/d6
 
 movem.l (a7)+,a0/a1/d0
 
.NotCloseEnough:
 bra backtoend

prot1: dc.w 0
  
tempGotBigGun: dc.w 0 
tempGunDamage: dc.w 0
tempGunNoise: dc.w 1
tempxoff: dc.w 0
tempzoff: dc.w 0
tempRoompt: dc.l 0

PLR1_GotBigGun: dc.w 0
PLR1_GunDamage: dc.w 0
PLR1_GunNoise: dc.w 0
PLR2_GotBigGun: dc.w 0
PLR2_GunDamage: dc.w 0
PLR2_GunNoise: dc.w 0
bulyspd: dc.w 0 
closedist: dc.w 0
 
PLR1_ObsInLine:
 ds.b 400 
PLR2_ObsInLine:
 ds.b 400 
 
rotcount:
 dc.w 0
 
shotvels: ds.l 20

 include "PLAYERSHOOT.s"
 
PLR1_GunFrame: dc.w 0
PLR2_GunFrame: dc.w 0

duh: dc.w 0
double: dc.w 0
ivescreamed: dc.w 0

ObjectHandler:

 move.l ObjectData,a0
Objectloop:
 tst.w (a0)
 blt doneallobj
 move.w 12(a0),GraphicRoom(a0)
 tst.b worry(a0)
 beq dontworryyourprettyhead

 move.b 16(a0),d0
 blt.s doneobj
 beq JUMPNASTY
 cmp.b #2,d0
 blt JUMPMEDI
 beq JUMPBULLET
 cmp.b #4,d0
 blt JUMPGUN
 beq JUMPKEY
 cmp.b #6,d0
 blt doneobj
 beq JUMPROBOT
 cmp.b #8,d0
 blt doneobj
 beq JUMPFLYINGNASTY
 cmp.b #10,d0
 blt JUMPAMMO
 beq JUMPBARREL
 cmp.b #12,d0
 blt doneobj
 beq JUMPMARINE
 cmp.b #14,d0
 blt JUMPWORM
 beq JUMPWELLHARD
 cmp.b #16,d0
 beq JUMPTREE
 cmp.b #18,d0
 blt JUMPEYEBALL
 beq JUMPTOUGHMARINE
 cmp.b #20,d0
 blt JUMPFLAMEMARINE
 beq JUMPGASPIPE

doneobj:

dontworryyourprettyhead:
 adda.w #64,a0
 bra Objectloop

doneallobj:
 rts

JUMPNASTY: 
 jsr ItsANasty
 bra doneobj
JUMPMEDI:
 jsr ItsAMediKit
 bra doneobj
JUMPBULLET
 jsr ItsABullet
 bra doneobj
JUMPGUN
 jsr ItsABigGun
 bra doneobj
JUMPKEY
 jsr ItsAKey
 bra doneobj

; FIVE IS PLAYER 1
JUMPROBOT
 jsr ItsARobot
 bra doneobj
 
 jsr ItsABigNasty
 bra doneobj
 
JUMPFLYINGNASTY
 jsr ItsAFlyingNasty
 bra doneobj
JUMPAMMO
 jsr ItsAnAmmoClip
 bra doneobj
JUMPBARREL
 jsr ItsABarrel
 bra doneobj

; ELEVEN IS PLAYER 2

JUMPMARINE
 jsr ItsAMutantMarine
 bra doneobj
JUMPWORM
 jsr ItsAHalfWorm
 bra doneobj
JUMPWELLHARD
 jsr ItsABigRedThing
 bra doneobj
JUMPTREE:
 jsr ItsATree
 bra doneobj
JUMPEYEBALL
 jsr ItsAEyeBall
 bra doneobj
JUMPTOUGHMARINE:
 jsr ItsAToughMarine
 bra doneobj
JUMPFLAMEMARINE:
 jsr ItsAFlameMarine
 bra doneobj
JUMPGASPIPE:
 jsr ItsAGasPipe
 bra doneobj


ItsAGasPipe:

 clr.b worry(a0)
 
 move.w TempFrames,d0
 tst.w ThirdTimer(a0)
 ble.s maybeflame

 sub.w d0,ThirdTimer(a0)
 move.w #5,SecTimer(a0)
 move.w #10,FourthTimer(a0)
 rts

maybeflame:

 sub.w d0,FourthTimer(a0)
 blt.s yesflame
 rts

yesflame:
 move.w #10,FourthTimer(a0)
 sub.w #1,SecTimer(a0)
 bgt.s notdoneflame

 move.w ObjTimer(a0),ThirdTimer(a0)

notdoneflame:

 cmp.w #4,SecTimer(a0)
 bne.s .nowhoosh

 movem.l d0-d7/a0-a6,-(a7)
 move.l #ObjRotated,a1
 move.w (a0),d0
 lea (a1,d0.w*8),a1
 move.l (a1),Noisex
 move.w #200,Noisevol
 move.w #22,Samplenum
 move.b #1,chanpick
 clr.b notifplaying
 move.b 1(a0),IDNUM
 jsr MakeSomeNoise
 movem.l (a7)+,d0-d7/a0-a6

.nowhoosh:

; Gas pipe: facing direction is given by
; leved (perpendicular to wall) so
; just continuously spray out flame!
 move.l NastyShotData,a5
 move.w #19,d1
.findonefree
 move.w 12(a5),d0
 blt.s .foundonefree
 adda.w #64,a5
 dbra d1,.findonefree

 rts

.foundonefree:

 move.b #2,16(a5)
 move.w 12(a0),12(a5)
 move.w 4(a0),d0
 sub.w #80,d0
 move.w d0,4(a5)
 ext.l d0
 asl.l #7,d0
 move.l d0,accypos(a5)
 clr.b shotstatus(a5)
 move.w #0,shotyvel(a5)
 move.w (a0),d0
 move.w (a5),d1
 move.l ObjectPoints,a1
 move.l (a1,d0.w*8),(a1,d1.w*8)
 move.l 4(a1,d0.w*8),4(a1,d1.w*8)
 move.b #3,shotsize(a5)
 move.w #0,shotflags(a5)
 move.w #0,shotgrav(a5)
 move.b #7,shotpower(a5)
 move.l #%100000100000,EnemyFlags(a5)
 move.w #0,shotanim(a5)
 move.w #0,shotlife(a5)
 move.l #SineTable,a1
 move.w Facing(a0),d0
 move.w (a1,d0.w),d1
 adda.w #2048,a1
 move.w (a1,d0.w),d2
 ext.l d1
 ext.l d2
 asl.l #4,d1
 asl.l #4,d2
 swap d1
 swap d2
 move.w d1,shotxvel(a5)
 move.w d2,shotzvel(a5)
 st worry(a5)
 
 rts
 
; include "ab3:source/AI.s"

ItsABarrel:

 clr.b worry(a0)
 move.w 12(a0),GraphicRoom(a0)

 cmp.w #8,8(a0)
 bne.s notexploding

 add.w #$404,6(a0)

 move.w 10(a0),d0
 add.w #1,d0
 cmp.w #8,d0
 bne.s .notdone
 
 move.w #-1,12(a0)
 move.w #-1,GraphicRoom(a0)
 rts
 
.notdone:
 move.w d0,10(a0)
 rts

notexploding:

 move.w #$1f1f,14(a0)

 move.w 12(a0),d0
 move.l ZoneAdds,a1
 move.l (a1,d0.w*4),a1
 add.l LEVELDATA,a1
 move.l ToZoneFloor(a1),d0
 tst.b ObjInTop(a0)
 beq.s .okinbot
 move.l ToUpperFloor(a1),d0
.okinbot:
 asr.l #7,d0
 sub.w #60,d0
 move.w d0,4(a0)
 
 moveq #0,d2
 move.b damagetaken(a0),d2
 beq.s nodamage
 move.b #0,damagetaken(a0)
 sub.b d2,numlives(a0)
 bgt.s nodamage
 move.b #0,numlives(a0)

 movem.l d0-d7/a0-a6,-(a7)
 
 move.w (a0),d0
 move.l ObjectPoints,a1
 move.w (a1,d0.w*8),Viewerx
 move.w 4(a1,d0.w*8),Viewerz
 move.w #40,d0
 jsr ComputeBlast
 
 move.w (a0),d0
 move.l #ObjRotated,a1
 move.l (a1,d0.w*8),Noisex
 move.w #300,Noisevol
 move.w #15,Samplenum
 jsr MakeSomeNoise
 
 movem.l (a7)+,d0-d7/a0-a6
 move.w #8,8(a0)
 move.w #0,10(a0)
 move.w #$2020,14(a0)
 move.w #-30,2(a0)
 
 rts
 
nodamage:

 move.w (a0),d0
 move.l ObjectPoints,a1
 move.w (a1,d0.w*8),Viewerx
 move.w 4(a1,d0.w*8),Viewerz
 move.b ObjInTop(a0),ViewerTop
 move.b PLR1_StoodInTop,TargetTop
 move.l PLR1_Roompt,ToRoom
 
 move.w 12(a0),d0
 move.l ZoneAdds,a1
 move.l (a1,d0.w*4),a1
 add.l LEVELDATA,a1
 move.l a1,FromRoom
  
 move.w PLR1_xoff,Targetx
 move.w PLR1_zoff,Targetz
 move.l PLR1_yoff,d0
 asr.l #7,d0
 move.w d0,Targety
 move.w 4(a0),Viewery
 jsr CanItBeSeen
 
 clr.b 17(a0)
 tst.b CanSee
 beq .noseeplr1
 move.b #1,17(a0)
 
.noseeplr1:

 move.b PLR2_StoodInTop,TargetTop
 move.l PLR2_Roompt,ToRoom
 move.w PLR2_xoff,Targetx
 move.w PLR2_zoff,Targetz
 move.l PLR2_yoff,d0
 asr.l #7,d0
 move.w d0,Targety
 move.w 4(a0),Viewery
 jsr CanItBeSeen
 
 tst.b CanSee
 beq .noseeplr2
 or.b #2,17(a0)
 
.noseeplr2:


 rts

 include "ab3:source_4000/aliencontrol.s"

nextCPt: dc.w 0

RipTear: dc.l 256*17*65536
otherrip: dc.l 256*18*65536

ItsAMediKit:

 clr.b worry(a0)
 move.w 12(a0),GraphicRoom(a0)

 move.w 12(a0),d0
 move.l ZoneAdds,a1
 move.l (a1,d0.w*4),a1
 add.l LEVELDATA,a1
 move.l ToZoneFloor(a1),d0
 tst.b ObjInTop(a0)
 beq.s .okinbot
 move.l ToUpperFloor(a1),d0
.okinbot:
 asr.l #7,d0
 sub.w #32,d0
 move.w d0,4(a0)


HealFactor EQU 18


 cmp.w #127,PLR1_energy
 bge .NotSameZone

 move.b PLR1_StoodInTop,d0
 move.b ObjInTop(a0),d1
 eor.b d1,d0
 bne .NotSameZone
 
 move.w PLR1_xoff,oldx
 move.w PLR1_zoff,oldz
 move.w PLR1_Zone,d7
 
 cmp.w 12(a0),d7
 bne .NotSameZone
 move.w (a0),d0
 move.l ObjectPoints,a1
 move.w (a1,d0.w*8),newx
 move.w 4(a1,d0.w*8),newz
 move.l #100*100,d2
 jsr CheckHit
 tst.b hitwall
 beq .NotPickedUp

 move.l PLR1_Obj,a2
 move.w (a2),d0
 move.l #ObjRotated,a2
 move.l (a2,d0.w*8),Noisex
 move.w #50,Noisevol
 move.w #4,Samplenum
 move.b #2,chanpick
 clr.b notifplaying
 move.b 1(a0),IDNUM
 movem.l a0/a1/d2/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a1/d2/d6/d7
 
 move.w #-1,12(a0)
 move.w #-1,GraphicRoom(a0)
 move.w HealFactor(a0),d0
 add.w PLR1_energy,d0
 cmp.w #127,d0
 ble.s .okokokokokok
 move.w #127,d0
.okokokokokok:
 move.w d0,PLR1_energy

.NotPickedUp:

.NotSameZone:

MEDIPLR2

 cmp.w #127,PLR2_energy
 bge .NotSameZone

 move.b PLR2_StoodInTop,d0
 move.b ObjInTop(a0),d1
 eor.b d1,d0
 bne .NotSameZone
 
 move.w PLR2_xoff,oldx
 move.w PLR2_zoff,oldz
 move.w PLR2_Zone,d7
 move.w 12(a0),d0
 
 cmp.w 12(a0),d7
 bne .NotSameZone
 move.w (a0),d0
 move.l ObjectPoints,a1
 move.w (a1,d0.w*8),newx
 move.w 4(a1,d0.w*8),newz
 move.l #100*100,d2
 jsr CheckHit
 tst.b hitwall
 beq .NotPickedUp

 move.l PLR2_Obj,a2
 move.w (a2),d0
 move.l #ObjRotated,a2
 move.l (a2,d0.w*8),Noisex
 move.w #50,Noisevol
 move.w #4,Samplenum
 move.b #2,chanpick
 clr.b notifplaying
 move.b 1(a0),IDNUM
 movem.l a0/a1/d2/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a1/d2/d6/d7
 
 move.w #-1,12(a0)
 move.w #-1,GraphicRoom(a0)
 move.w HealFactor(a0),d0
 add.w PLR2_energy,d0
 cmp.w #127,d0
 ble.s .okokokokokok
 move.w #127,d0
.okokokokokok:
 move.w d0,PLR2_energy

.NotPickedUp:

.NotSameZone:


 rts
 
AMGR:
 dc.w 3,4,5,0,29,0,0,28

ItsAnAmmoClip:

 move.w #$0f0f,14(a0)
 clr.b worry(a0)
 move.w 12(a0),GraphicRoom(a0)

AmmoType EQU 18
 move.w AmmoType(a0),d0
 move.w AMGR(pc,d0.w*2),10(a0)

 move.b PLR1_StoodInTop,d0
 move.b ObjInTop(a0),d1
 eor.b d1,d0
 bne .NotSameZone
 move.w PLR1_xoff,oldx
 move.w PLR1_zoff,oldz
 move.w PLR1_Zone,d7
 move.w 12(a0),d0
 move.l ZoneAdds,a1
 move.l (a1,d0.w*4),a1
 add.l LEVELDATA,a1
 move.l ToZoneFloor(a1),d0
 tst.b ObjInTop(a0)
 beq.s .okinbot
 move.l ToUpperFloor(a1),d0
.okinbot:
  asr.l #7,d0
 sub.w #32,d0
 move.w d0,4(a0)
 
 cmp.w 12(a0),d7
 bne .NotSameZone
 move.w (a0),d0
 move.l ObjectPoints,a1
 move.w (a1,d0.w*8),newx
 move.w 4(a1,d0.w*8),newz
 move.l #100*100,d2
 jsr CheckHit
 tst.b hitwall
 beq .NotPickedUp

 move.w AmmoType(a0),d0
 lea PLR1_GunData,a6
 lsl.w #2,d0
 lea (a6,d0.w*8),a6
 cmp.w #80*8,(a6)
 bge .NotPickedUp

 move.l PLR1_Obj,a2
 move.w (a2),d0
 move.l #ObjRotated,a2
 move.l (a2,d0.w*8),Noisex
 move.w #50,Noisevol
 move.w #11,Samplenum
 clr.b notifplaying
 move.b 1(a0),IDNUM
 movem.l a0/a1/d2/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a1/d2/d6/d7
 
 move.w #-1,12(a0)
 move.w #-1,GraphicRoom(a0)
 move.w AmmoType(a0),d0
 lea PLR1_GunData,a6
 lsl.w #2,d0
 lea (a6,d0.w*8),a6
 moveq #0,d0
 move.b 4(a6),d0
 asl.w #3,d0
 move.w (a6),d1
 add.w d0,d1
 move.w d1,(a6)

.NotPickedUp:

.NotSameZone:

AMMOPLR2:

 move.b PLR2_StoodInTop,d0
 move.b ObjInTop(a0),d1
 eor.b d1,d0
 bne .NotSameZone
 move.w PLR2_xoff,oldx
 move.w PLR2_zoff,oldz
 move.w PLR2_Zone,d7
 move.w 12(a0),d0
 move.l ZoneAdds,a1
 move.l (a1,d0.w*4),a1
 add.l LEVELDATA,a1
 move.l ToZoneFloor(a1),d0
 tst.b ObjInTop(a0)
 beq.s .okinbot
 move.l ToUpperFloor(a1),d0
.okinbot:
  asr.l #7,d0
 sub.w #16,d0
 move.w d0,4(a0)
 
 cmp.w 12(a0),d7
 bne .NotSameZone
 move.w (a0),d0
 move.l ObjectPoints,a1
 move.w (a1,d0.w*8),newx
 move.w 4(a1,d0.w*8),newz
 move.l #100*100,d2
 jsr CheckHit
 tst.b hitwall
 beq .NotPickedUp

 move.w AmmoType(a0),d0
 lea PLR2_GunData,a6
 lsl.w #2,d0
 lea (a6,d0.w*8),a6
 cmp.w #80*8,(a6)
 bge .NotPickedUp


 move.l PLR2_Obj,a2
 move.w (a2),d0
 move.l #ObjRotated,a2
 move.l (a2,d0.w*8),Noisex
 move.w #50,Noisevol
 move.w #11,Samplenum
 clr.b notifplaying
 move.b 1(a0),IDNUM
 movem.l a0/a1/d2/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a1/d2/d6/d7
 
 move.w #-1,12(a0)
 move.w #-1,GraphicRoom(a0)
 move.w AmmoType(a0),d0
 lea PLR2_GunData,a6
 lsl.w #2,d0
 lea (a6,d0.w*8),a6
 moveq #0,d0
 move.b 4(a6),d0
 asl.w #3,d0
 move.w (a6),d1
 add.w d0,d1
 move.w d1,(a6)

.NotPickedUp:

.NotSameZone:


 rts
 

ItsABigGun:
 move.w 12(a0),GraphicRoom(a0)

 clr.b worry(a0)

 move.b PLR1_StoodInTop,d0
 move.b ObjInTop(a0),d1
 eor.b d1,d0
 bne .NotSameZone
 move.w PLR1_xoff,oldx
 move.w PLR1_zoff,oldz
 move.w PLR1_Zone,d7
 move.w 12(a0),d0
 move.l ZoneAdds,a1
 move.l (a1,d0.w*4),a1
 add.l LEVELDATA,a1
 move.l ToZoneFloor(a1),d0
 tst.b ObjInTop(a0)
 beq.s .okinbot
 move.l ToUpperFloor(a1),d0
.okinbot:
  asr.l #7,d0
; add.w #16,d0
 moveq #0,d1
 move.b 7(a0),d1
 sub.w d1,d0
 
 move.w d0,4(a0)
 cmp.w 12(a0),d7
 bne .NotSameZone
 move.w (a0),d0
 move.l ObjectPoints,a1
 move.w (a1,d0.w*8),newx
 move.w 4(a1,d0.w*8),newz
 move.l #100*100,d2
 jsr CheckHit
 tst.b hitwall
 beq .NotPickedUp

 move.l PLR1_Obj,a2
 move.w (a2),d0
 move.l #ObjRotated,a2
 move.l (a2,d0.w*8),Noisex
 move.w #50,Noisevol
 move.w #4,Samplenum
 move.b #2,chanpick
 clr.b notifplaying
 move.b 1(a0),IDNUM
 movem.l a0/a1/d2/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a1/d2/d6/d7
 
 move.l #Cheese,FacesPtr
 move.w #4,Cheese
 move.w #-1,FacesCounter
 moveq #0,d0
 move.b 17(a0),d0
 move.l #PLR1_GunData+32,a1
 move.l #AmmoInGuns,a2
 move.w d0,d1
 lsl.w #2,d0
 st 7(a1,d0.w*8)
 move.w (a2,d1.w*2),d1
 add.w d1,(a1,d0.w*8)

 
 move.w #-1,12(a0)
 move.w #-1,GraphicRoom(a0)

.NotPickedUp:

.NotSameZone:

GUNPLR2:

 move.b PLR2_StoodInTop,d0
 move.b ObjInTop(a0),d1
 eor.b d1,d0
 bne .NotSameZone
 move.w PLR2_xoff,oldx
 move.w PLR2_zoff,oldz
 move.w PLR2_Zone,d7
 move.w 12(a0),d0
 move.l ZoneAdds,a1
 move.l (a1,d0.w*4),a1
 add.l LEVELDATA,a1
 move.l ToZoneFloor(a1),d0
 tst.b ObjInTop(a0)
 beq.s .okinbot
 move.l ToUpperFloor(a1),d0
.okinbot:
  asr.l #7,d0
; add.w #16,d0
 moveq #0,d1
 move.b 7(a0),d1
 sub.w d1,d0
 
 move.w d0,4(a0)
 cmp.w 12(a0),d7
 bne .NotSameZone
 move.w (a0),d0
 move.l ObjectPoints,a1
 move.w (a1,d0.w*8),newx
 move.w 4(a1,d0.w*8),newz
 move.l #100*100,d2
 jsr CheckHit
 tst.b hitwall
 beq .NotPickedUp

 move.l PLR2_Obj,a2
 move.w (a2),d0
 move.l #ObjRotated,a2
 move.l (a2,d0.w*8),Noisex
 move.w #50,Noisevol
 move.w #4,Samplenum
 move.b #2,chanpick
 clr.b notifplaying
 move.b 1(a0),IDNUM
 movem.l a0/a1/d2/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a1/d2/d6/d7
 
 move.l #Cheese,FacesPtr
 move.w #4,Cheese
 move.w #-1,FacesCounter
 moveq #0,d0
 move.b 17(a0),d0
 move.l #PLR2_GunData+32,a1
 move.l #AmmoInGuns,a2
 move.w d0,d1
 lsl.w #2,d0
 st 7(a1,d0.w*8)
 move.w (a2,d1.w*2),d1
 add.w d1,(a1,d0.w*8)
 
 
 move.w #-1,12(a0)
 move.w #-1,GraphicRoom(a0)

.NotPickedUp:

.NotSameZone:


 rts
 
OFFSETTOGRAPH:
 dc.l (40*8)*43+10
 dc.l (40*8)*11+12
 dc.l (40*8)*11+22
 dc.l (40*8)*43+24

AmmoInGuns:
 dc.w 0
 dc.w 5
 dc.w 1
 dc.w 0
 dc.w 1
 dc.w 0
 dc.w 0
 dc.w 5

ItsAKey:

 move.w #$0f0f,14(a0)
 
 tst.b NASTY
 bne .yesnas
 move.w #-1,12(a0)
 rts
.yesnas:

 move.w 12(a0),GraphicRoom(a0)
 clr.b worry(a0)

 move.b PLR1_StoodInTop,d0
 move.b ObjInTop(a0),d1
 eor.b d1,d0
 bne .NotSameZone

 move.w PLR1_xoff,oldx
 move.w PLR1_zoff,oldz
 move.w PLR1_Zone,d7
 move.w 12(a0),d0
 move.l ZoneAdds,a1
 move.l (a1,d0.w*4),a1
 add.l LEVELDATA,a1
 move.l 2(a1),d0
 asr.l #7,d0
 sub.w #16,d0
 move.w d0,4(a0)
 cmp.w 12(a0),d7
 bne .NotSameZone
 move.w (a0),d0
 move.l ObjectPoints,a1
 move.w (a1,d0.w*8),newx
 move.w 4(a1,d0.w*8),newz
 move.l #100*100,d2
 jsr CheckHit
 tst.b hitwall
 beq .NotPickedUp

 move.w #0,Noisex
 move.w #0,Noisez
 move.w #50,Noisevol
 move.w #4,Samplenum
 move.b #2,chanpick
 clr.b notifplaying
 move.b 1(a0),IDNUM
 movem.l a0/a1/d2/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a1/d2/d6/d7
 
 move.w #-1,12(a0)
 move.w #-1,GraphicRoom(a0)
 move.b 17(a0),d0
 or.b d0,Conditions+1

 move.l Panel,a2
 moveq #0,d1
 lsr.b #1,d0
 bcs.s .done
 addq #1,d1
 lsr.b #1,d0
 bcs.s .done
 addq #1,d1
 lsr.b #1,d0
 bcs.s .done
 addq #1,d1 
.done

 move.l #OFFSETTOGRAPH,a1
 add.l (a1,d1.w*4),a2
 move.l #PanelKeys,a1

 muls #6*22*8,d1

 adda.w d1,a1

 move.w #22*8-1,d0	;lines
.lines:

 move.l (a1)+,d1
 or.l d1,(a2)
 move.w (a1)+,d1
 or.w d1,4(a2)
 adda.w #40,a2

 dbra d0,.lines
 

.NotPickedUp:

.NotSameZone:

 rts

Conditions: dc.l 0
 
; Format of animations:
; Size (-1 = and of anim) (w)
; Address of Frame. (l)
; height offset (w)
 
Bul1Anim:
 dc.w 20*256+15
 dc.w 6,8
 dc.w 0
 dc.w 17*256+17
 dc.w 6,9
 dc.w 0
 dc.w 15*256+20
 dc.w 6,10
 dc.w 0
 dc.w 17*256+17
 dc.w 6,11
 dc.w 0
 dc.l -1

Bul1Pop
 dc.b 25,25
 dc.w 1,6
 dc.w 0
 dc.b 25,25
 dc.w 1,7
 dc.w -4
 dc.b 25,25
 dc.w 1,8
 dc.w -4
 dc.b 25,25
 dc.w 1,9
 dc.w -4
 dc.b 25,25
 dc.w 1,10
 dc.w -4
 dc.b 25,25
 dc.w 1,11
 dc.w -4
 dc.b 25,25
 dc.w 1,12
 dc.w -4
 dc.b 25,25
 dc.w 1,13
 dc.w -4
 dc.b 25,25
 dc.w 1,14
 dc.w -4
 dc.b 25,25
 dc.w 1,15
 dc.w -4
 dc.b 25,25
 dc.w 1,16
 dc.w -4
 dc.l -1
 
Bul3Anim:
 dc.b 25,25
 dc.w 0,12
 dc.w 0
 dc.b 25,25
 dc.w 0,13
 dc.w 0
 dc.b 25,25
 dc.w 0,14
 dc.w 0
 dc.b 25,25
 dc.w 0,15
 dc.w 0
 dc.l -1

Bul3Pop:
 dc.l -1
 
Bul4Anim:
 dc.b 25,25
 dc.w 6,4
 dc.w 0
 dc.b 25,25
 dc.w 6,5
 dc.w 0
 dc.b 25,25
 dc.w 6,6
 dc.w 0
 dc.b 25,25
 dc.w 6,7
 dc.w 0
 dc.l -1
 
Bul4Pop:
 dc.b 20,20
 dc.w 6,4
 dc.w 0
 dc.b 15,15
 dc.w 6,5
 dc.w 0
 dc.b 10,10
 dc.w 6,6
 dc.w 0
 dc.b 5,5
 dc.w 6,7
 dc.w 0
 dc.l -1

Bul5Anim:
 dc.b 10,10
 dc.w 6,4
 dc.w 0
 dc.b 10,10
 dc.w 6,5
 dc.w 0
 dc.b 10,10
 dc.w 6,6
 dc.w 0
 dc.b 10,10
 dc.w 6,7
 dc.w 0
 dc.l -1
 
Bul5Pop:
 dc.b 8,8
 dc.w 6,4
 dc.w 0
 dc.b 6,6
 dc.w 6,5
 dc.w 0
 dc.b 4,4
 dc.w 6,6
 dc.w 0
 dc.l -1
 
grenAnim:
 dc.b 25,25
 dc.w 1,21
 dc.w 0
 dc.b 25,25
 dc.w 1,22
 dc.w 0
 dc.b 25,25
 dc.w 1,23
 dc.w 0
 dc.b 25,25
 dc.w 1,24
 dc.w 0
 dc.l -1

Bul2Anim:
 dc.b 25,25
 dc.w -18,4
 dc.w 0
 dc.b 25,25
 dc.w -18,5
 dc.w 0
 dc.b 25,25
 dc.w -18,6
 dc.w 0
 dc.b 25,25
 dc.w -18,7
 dc.w 0
 dc.b 25,25
 dc.w -18,4
 dc.w 0
 dc.b 25,25
 dc.w -18,5
 dc.w 0
 dc.b 25,25
 dc.w -18,6
 dc.w 0
 dc.b 25,25
 dc.w -18,7
 dc.w 0
 dc.w -1
 

Bul2Pop:
 dc.b 25,25
 dc.w 2,8
 dc.w -4
 dc.b 29,29
 dc.w 2,9
 dc.w -4
 dc.b 33,33
 dc.w 2,10
 dc.w -4
 dc.b 37,37
 dc.w 2,11
 dc.w -4
 dc.b 41,41
 dc.w 2,12
 dc.w -4
 dc.b 45,45
 dc.w 2,13
 dc.w -4
 dc.b 49,49
 dc.w 2,14
 dc.w -4
 dc.b 53,53
 dc.w 2,15
 dc.w -4
 dc.b 57,57
 dc.w 2,16
 dc.w -4
 dc.b 61,61
 dc.w 2,17
 dc.w -4
 dc.b 65,65
 dc.w 2,18
 dc.w -4
 dc.b 69,69
 dc.w 2,19
 dc.w -4
 dc.w -1
 
RockAnim:
 dc.b 16,16
 dc.w 6,0
 dc.w 0
 dc.b 16,16
 dc.w 6,1
 dc.w 0
 dc.b 16,16
 dc.w 6,2
 dc.w 0
 dc.b 16,16
 dc.w 6,3
 dc.w 0  
 dc.l -1

val SET 100

RockPop:
 dc.b val,val
 dc.w 8,0
 dc.w -4
val SET val+10 
 dc.b val,val
 dc.w 8,1
 dc.w 0
val SET val+10 
 dc.b val,val
 dc.w 8,2
 dc.w -4
val SET val+10 
 dc.b val,val
 dc.w 8,3
 dc.w -4
val SET val+10 
 dc.b val,val
 dc.w 8,4
 dc.w -4
val SET val+10 
 dc.b val,val
 dc.w 8,4
 dc.w -4
val SET val+10 
 dc.b val,val
 dc.w 8,5
 dc.w -4
val SET val+10 
 dc.b val,val
 dc.w 8,5
 dc.w -4
val SET val+10 
 dc.b val,val
 dc.w 8,6
 dc.w -4
val SET val+10 
 dc.b val,val
 dc.w 8,6
 dc.w -4
val SET val+10 
 dc.b val,val
 dc.w 8,7
 dc.w -4
val SET val+10 
 dc.b val,val
 dc.w 8,7
 dc.w -4
val SET val+10 
 dc.b val,val
 dc.w 8,8
 dc.w -4
val SET val+10 
 dc.b val,val
 dc.w 8,8
 dc.w -4
 dc.l -1


val SET 5

FlameAnim:

 dc.b val,val
 dc.w 8,0
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,1
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,2
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,3
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,4
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,4
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,5
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,5
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,5
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,6
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,6
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,6
 dc.w 0
val SET val+6 
 dc.b val,val
 dc.w 8,7
 dc.w 0
val SET val+8 
 dc.b val,val
 dc.w 8,7
 dc.w 0
val SET val+8 
 dc.b val,val
 dc.w 8,7
 dc.w 0
val SET val+8 
 dc.b val,val
 dc.w 8,7
 dc.w 0
val SET val+8 
 dc.b val,val
 dc.w 8,8
 dc.w 0
val SET val+8 
 dc.b val,val
 dc.w 8,8
 dc.w 0
val SET val+8 
 dc.b val,val
 dc.w 8,8
 dc.w 0

 dc.l -1
 
FlamePop:
val SET 4*35
 dc.b val,val
 dc.w 8,7
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,7
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,7
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,8
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,8
 dc.w 0
val SET val+4 
 dc.b val,val
 dc.w 8,8
 dc.w 0

 dc.l -1

Explode1Anim: 
 dc.b 25,25
 dc.w 0,16
 dc.w 0
 dc.b 25,25
 dc.w 0,17
 dc.w 0
 dc.b 25,25
 dc.w 0,18
 dc.w 0
 dc.b 25,25
 dc.w 0,19
 dc.w 0
 dc.l -1
 
Explode1Pop:
 dc.b 20,20
 dc.w 0,16
 dc.w 1
 dc.b 20,20
 dc.w 0,16
 dc.w 1
 dc.b 20,20
 dc.w 0,16
 dc.w 1
 dc.b 20,20
 dc.w 0,16
 dc.w 1
 dc.b 20,20
 dc.w 0,16
 dc.w 1
 dc.b 20,20
 dc.w 0,16
 dc.w 1
 dc.b 20,20
 dc.w 0,16
 dc.w 1
 dc.b 20,20
 dc.w 0,16
 dc.w 1
 
 dc.b 17,17
 dc.w 0,16
 dc.w 1
 
 dc.b 13,13
 dc.w 0,16
 dc.w 1
 
 dc.b 9,9
 dc.w 0,16
 dc.w 1
 
 dc.l -1

Explode2Anim: 
 dc.b 20,20
 dc.w 0,20
 dc.w 0
 dc.b 20,20
 dc.w 0,21
 dc.w 0
 dc.b 20,20
 dc.w 0,22
 dc.w 0
 dc.b 20,20
 dc.w 0,23
 dc.w 0
 dc.l -1
 
Explode2Pop:
 dc.b 20,20
 dc.w 0,20
 dc.w 1
 dc.b 20,20
 dc.w 0,20
 dc.w 1
 dc.b 20,20
 dc.w 0,20
 dc.w 1
 dc.b 20,20
 dc.w 0,20
 dc.w 1
 dc.b 20,20
 dc.w 0,20
 dc.w 1
 dc.b 20,20
 dc.w 0,20
 dc.w 1
 dc.b 20,20
 dc.w 0,20
 dc.w 1
 dc.b 20,20
 dc.w 0,20
 dc.w 1
 
 dc.b 17,17
 dc.w 0,20
 dc.w 1
 
 dc.b 13,13
 dc.w 0,20
 dc.w 1
 
 dc.b 9,9
 dc.w 0,20
 dc.w 1
 
 dc.l -1


Explode3Anim: 
 dc.b 20,20
 dc.w 0,24
 dc.w 0
 dc.b 20,20
 dc.w 0,25
 dc.w 0
 dc.b 20,20
 dc.w 0,26
 dc.w 0
 dc.b 20,20
 dc.w 0,27
 dc.w 0
 dc.l -1
 
Explode3Pop:
 
 dc.b 17,17
 dc.w 0,24
 dc.w 1
 dc.b 17,17
 dc.w 0,24
 dc.w 1
 dc.b 17,17
 dc.w 0,24
 dc.w 1
 dc.b 17,17
 dc.w 0,24
 dc.w 1
 dc.b 17,17
 dc.w 0,24
 dc.w 1
 dc.b 17,17
 dc.w 0,24
 dc.w 1
 dc.b 17,17
 dc.w 0,24
 dc.w 1
 dc.b 17,17
 dc.w 0,24
 dc.w 1
 
 dc.b 13,13
 dc.w 0,24
 dc.w 1
 
 dc.b 9,9
 dc.w 0,24
 dc.w 1
 
  dc.l -1

Explode4Anim: 
 dc.b 30,30
 dc.w 0,28
 dc.w 0
 dc.b 30,30
 dc.w 0,29
 dc.w 0
 dc.b 30,30
 dc.w 0,30
 dc.w 0
 dc.b 30,30
 dc.w 0,31
 dc.w 0
 dc.l -1
 
Explode4Pop:
 
 dc.b 20,20
 dc.w 0,28
 dc.w 0
 dc.b 20,20
 dc.w 0,28
 dc.w 1
 dc.b 20,20
 dc.w 0,28
 dc.w 1
 dc.b 20,20
 dc.w 0,28
 dc.w 1
 dc.b 20,20
 dc.w 0,28
 dc.w 1
 dc.b 20,20
 dc.w 0,28
 dc.w 1
 dc.b 20,20
 dc.w 0,28
 dc.w 1
 dc.b 20,20
 dc.w 0,28
 dc.w 1
 
 dc.b 17,17
 dc.w 0,28
 dc.w 1
 
 dc.b 13,13
 dc.w 0,28
 dc.w 1
 
 dc.b 9,9
 dc.w 0,28
 dc.w 1
 
 dc.l -1
  
BulletSizes:
 dc.w $0f0f,$707
 dc.w $0f0f,$f0f
 dc.w $0f0f,$1f1f
 dc.w $1f1f,$1f1f
 dc.w $0707,$1f1f
 dc.w $0f0f,$0f0f
 dc.w $0f0f,$0f0f
 dc.w $707,$707
 dc.w 0,0,0,0
;10 
 dc.w 0,0,0,0,0,0,0,0,0,0
 dc.w 0,0,0,0,0,0,0,0,0,0
;20
 dc.w 0,0,0,0,0,0,0,0,0,0
 dc.w 0,0,0,0,0,0,0,0,0,0
;30
 dc.w 0,0,0,0,0,0,0,0,0,0
 dc.w 0,0,0,0,0,0,0,0,0,0
;40
 dc.w 0,0,0,0,0,0,0,0,0,0
 dc.w 0,0,0,0,0,0,0,0,0,0
;50
 dc.w $0707,$0707,$0707,$0707
 dc.w $0707,$0707,$0707,$0707

HitNoises:
 dc.l -1,-1
 dc.w 15,200
 dc.l -1
 dc.w 15,200
 dc.l -1,-1,-1,-1,-1
 dc.l -1,-1,-1,-1,-1,-1,-1,-1,-1,-1
 dc.l -1,-1,-1,-1,-1,-1,-1,-1,-1,-1
 dc.l -1,-1,-1,-1,-1,-1,-1,-1,-1,-1
 dc.l -1,-1,-1,-1,-1,-1,-1,-1,-1,-1
 
 dc.w 13,50,13,50,13,50,13,50
 
ExplosiveForce:
 dc.w 0,0,64,0,40,0,0,0,0,0
 dc.w 0,0,0,0,0,0,0,0,0,0
 dc.w 0,0,0,0,0,0,0,0,0,0
 dc.w 0,0,0,0,0,0,0,0,0,0
 dc.w 0,0,0,0,0,0,0,0,0,0
 dc.w 0,0,0,0
  
BulletTypes:
 dc.l Bul1Anim,Bul1Pop
 dc.l Bul2Anim,Bul2Pop
 dc.l RockAnim,RockPop
 dc.l FlameAnim,FlamePop
 dc.l grenAnim,RockPop
 dc.l Bul4Anim,Bul4Pop
 dc.l Bul5Anim,Bul5Pop
 dc.l Bul1Anim,Bul1Pop
 dc.l 0,0
 dc.l 0,0
 
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 dc.l 0,0
 
 dc.l Explode1Anim,Explode1Pop
 dc.l Explode2Anim,Explode2Pop
 dc.l Explode3Anim,Explode3Pop
 dc.l Explode4Anim,Explode4Pop
 
tsta: dc.l 0
timeout: dc.w 0

ItsABullet:

 move.b #0,timeout
 move.w 12(a0),d0
 move.w d0,GraphicRoom(a0)
 blt doneshot
 
 tst.b shotstatus(a0)
 bne.s noworrylife
 
 moveq #0,d1
 move.w shotlife(a0),d2
 blt.s infinite
 move.b shotsize(a0),d1
 move.l #PLR1_GunData,a1
 lsl.w #2,d1
 move.w 10(a1,d1.w*8),d1
 blt.s infinite
 
 cmp.w d2,d1
 bge.s notdone
 
 st timeout
 bra.s infinite 
 
notdone:

 move.w TempFrames,d2
 add.w d2,shotlife(a0)
 
infinite:
 
noworrylife:
 
 move.w #0,extlen
 move.b #$ff,awayfromwall

 moveq #0,d1
 move.b shotsize(a0),d1
 move.l #BulletTypes,a1
 lea (a1,d1.w*8),a1 
 
 tst.b shotstatus(a0)
 beq.s notpopping

 moveq #0,d1
 move.b shotsize(a0),d1
 move.l #BulletSizes,a2
 move.w 2(a2,d1.w*4),14(a0)

 moveq #0,d1
 move.b shotanim(a0),d1

 move.l 4(a1),a2
 move.w (a2,d1.w*8),d2
 cmp.w #-1,d2
 bne.s notdonepopping
 move.w #-1,12(a0)
 move.w #-1,GraphicRoom(a0)
 clr.b shotstatus(a0)
 move.b #0,shotanim(a0)
 rts
notdonepopping:

 add.b #1,shotanim(a0)
 move.w d2,6(a0)
 move.l 2(a2,d1.w*8),8(a0)
 move.w 6(a2,d1.w*8),d3
 add.w d3,4(a0)
 ext.l d3
 asl.l #7,d3
 add.l d3,accypos(a0)
 rts

notpopping:

 moveq #0,d1
 move.b shotsize(a0),d1
 move.l #BulletSizes,a2
 move.w (a2,d1.w*4),14(a0)

 moveq #0,d1
 move.b shotanim(a0),d1

 move.l (a1),a2
 add.b #1,shotanim(a0)
 move.w (a2,d1.w*8),d2
 bge.s notdoneanim

 move.b #0,shotanim(a0)
 move.w #0,d1

notdoneanim:

 move.w (a2,d1.w*8),6(a0)
 move.l 2(a2,d1.w*8),8(a0)
 move.w 6(a2,d1.w*8),d3
 ext.l d3
 asl.l #7,d3
 add.l d3,accypos(a0)

 move.l ZoneAdds,a2
 move.l (a2,d0.w*4),d0
 add.l LEVELDATA,d0
 move.l d0,objroom

******************************** 
 move.l objroom,a3
 
 tst.b ObjInTop(a0)
 beq.s .notintop
 adda.w #8,a3
.notintop:
 
 move.l 6(a3),d0
 sub.l accypos(a0),d0
 cmp.l #10*128,d0
 blt .nohitroof 
 
 btst #0,shotflags+1(a0)
 beq.s .nobounce
 
 neg.w shotyvel(a0)
 
 move.l 6(a3),d0
 add.l #10*128,d0
 move.l d0,accypos(a0)
 
 btst #1,shotflags+1(a0)
 beq .nohitroof
 
 move.l shotxvel(a0),d0
 asr.l #1,d0
 move.l d0,shotxvel(a0)
 move.l shotzvel(a0),d0
 asr.l #1,d0
 move.l d0,shotzvel(a0) 
 
 bra .nohitroof

.nobounce: 
 
 move.b #0,shotanim(a0)
 move.b #1,shotstatus(a0)
 
 movem.l d0-d7/a0-a6,-(a7)
 move.l #HitNoises,a2
 moveq #0,d0
 move.b shotsize(a0),d0
 move.l (a2,d0.w*4),d0
 blt.s .nohitnoise

 move.l #ObjRotated,a1
 move.w (a0),d1
 move.l (a1,d1.w*8),Noisex
 move.w d0,Noisevol
 swap d0
 move.w d0,Samplenum
 move.b d1,IDNUM
 jsr MakeSomeNoise
 
.nohitnoise:

 moveq #0,d0
 move.l #ExplosiveForce,a2
 move.b shotsize(a0),d0
 move.w (a2,d0.w*2),d0
 beq.s .noexplosion
 
 move.w newx,Viewerx
 move.w newz,Viewerz
 
 move.w 4(a0),Viewery
 move.b ObjInTop(a0),ViewerTop
 
 bsr ComputeBlast
 
.noexplosion:

 movem.l (a7)+,d0-d7/a0-a6

.nohitroof:
 move.l 2(a3),d0
 sub.l accypos(a0),d0
 cmp.l #10*128,d0
 bgt .nohitfloor 

 btst #0,shotflags+1(a0)
 beq.s .nobounceup
 
 tst.w shotyvel(a0)
 blt .nohitfloor
 
 moveq #0,d0
 move.w shotyvel(a0),d0
 asr.w #1,d0
 neg.w d0
 move.w d0,shotyvel(a0)
 
 move.l 2(a3),d0
 sub.l #10*128,d0
 move.l d0,accypos(a0)

 btst #1,shotflags+1(a0)
 beq .nohitfloor
 
 move.l shotxvel(a0),d0
 asr.l #1,d0
 move.l d0,shotxvel(a0)
 move.l shotzvel(a0),d0
 asr.l #1,d0
 move.l d0,shotzvel(a0) 
 
 
 bra .nohitfloor
.nobounceup: 


 move.b #0,shotanim(a0)
 move.b #1,shotstatus(a0)
 movem.l d0-d7/a0-a6,-(a7)
 move.l #HitNoises,a2
 moveq #0,d0
 move.b shotsize(a0),d0
 move.l (a2,d0.w*4),d0
 blt.s .nohitnoise2

 move.l #ObjRotated,a1
 move.w (a0),d1
 move.l (a1,d1.w*8),Noisex
 move.w d0,Noisevol
 swap d0
 move.w d0,Samplenum
 move.b d1,IDNUM
 jsr MakeSomeNoise
.nohitnoise2:
 moveq #0,d0
 move.l #ExplosiveForce,a2
 move.b shotsize(a0),d0
 move.w (a2,d0.w*2),d0
 beq.s .noexplosion2
 
 move.w 4(a0),Viewery
 move.w newx,Viewerx
 move.w newz,Viewerz
 move.b ObjInTop(a0),ViewerTop
 bsr ComputeBlast
 
.noexplosion2:
 movem.l (a7)+,d0-d7/a0-a6
.nohitfloor:
******************** 
 

 
 move.l ObjectPoints,a1
 move.w (a0),d1
 lea (a1,d1.w*8),a1
 move.l (a1),d2
 move.l d2,oldx
 move.l shotxvel(a0),d3
 move.w d3,d4
 swap d3
 move.w TempFrames,d5
 muls d5,d3
 mulu d5,d4
 swap d3
 clr.w d3
 add.l d4,d3
 add.l d3,d2
 move.l d2,newx
 move.l 4(a1),d2
 move.l d2,oldz
 move.l shotzvel(a0),d3
 move.w d3,d4
 swap d3
 muls d5,d3
 mulu d5,d4
 swap d3
 clr.w d3
 add.l d4,d3
 add.l d3,d2
 move.l d2,newz
 move.l accypos(a0),oldy 

 move.w shotyvel(a0),d3
 muls TempFrames,d3
 move.w shotgrav(a0),d5
 beq.s nograv
 muls TempFrames,d5
 add.l d5,d3
 move.w shotyvel(a0),d6
 ext.l d6
 add.l d5,d6
 cmp.l #10*256,d6
 blt.s okgrav
 move.l #10*256,d6
 okgrav:
 move.w d6,shotyvel(a0)
nograv:
 move.l accypos(a0),d4 
 add.l d3,d4
 
 move.l d4,accypos(a0)
 sub.l #5*128,d4
 move.l d4,newy
 add.l #5*128,d4
 asr.l #7,d4
 move.w d4,4(a0)
 btst #0,shotflags+1(a0)
 sne.s wallbounce
 seq.s exitfirst

 clr.b hitwall
 move.b ObjInTop(a0),StoodInTop
 move.w #%0000010000000000,wallflags
 move.l #0,StepUpVal
 move.l #$1000000,StepDownVal
 move.l #10*128,thingheight
 move.w oldx,d0
 cmp.w newx,d0
 bne.s lalal
 move.w oldz,d0
 cmp.w newz,d0
 beq.s nomovebul
 move.w #1,walllength
 
lalal:
 movem.l d0/d7/a0/a1/a2/a4/a5,-(a7)
 jsr MoveObject
 
 move.w #-15,d0
 move.w newx,d1
 move.w newz,d2
 move.l objroom,a0
 move.w (a0),d3
 jsr BRIGHTENPOINTS
 
 movem.l (a7)+,d0/d7/a0/a1/a2/a4/a5
nomovebul:
 move.b StoodInTop,ObjInTop(a0)
  
 tst.b wallbounce
 beq.s .notabouncything
 
 tst.b hitwall
 beq .nothitwall

; we have hit a wall....

 move.w shotzvel(a0),d0
 muls wallxsize,d0
 move.w shotxvel(a0),d1
 muls wallzsize,d1
 sub.l d1,d0
 divs walllength,d0
 
 move.w shotxvel(a0),d1
 move.w wallzsize,d2
 add.w d2,d2
 muls d0,d2
 divs walllength,d2
 add.w d2,d1
 move.w d1,shotxvel(a0)
 
 move.w shotzvel(a0),d1
 move.w wallxsize,d2
 add.w d2,d2
 muls d0,d2
 divs walllength,d2
 sub.w d2,d1
 move.w d1,shotzvel(a0)
 
 btst #1,shotflags+1(a0)
 beq .nothitwall
 
 move.l shotxvel(a0),d0
 asr.l #1,d0
 move.l d0,shotxvel(a0)
 move.l shotzvel(a0),d0
 asr.l #1,d0
 move.l d0,shotzvel(a0) 
  
 
 bra .nothitwall

.notabouncything:
  
 tst.b hitwall
 beq .nothitwall
 
 move.l wallhitheight,d4
 move.l d4,accypos(a0)
 asr.l #7,d4
 move.w d4,4(a0)
 
.hitsomething
 clr.b timeout
 move.b #0,shotanim(a0)
 move.b #1,shotstatus(a0)

 movem.l d0-d7/a0-a6,-(a7)
 move.l #HitNoises,a2
 moveq #0,d0
 move.b shotsize(a0),d0
 move.l (a2,d0.w*4),d0
 blt.s .nohitnoise

 move.l #ObjRotated,a1
 move.w (a0),d1
 move.l (a1,d1.w*8),Noisex
 move.w d0,Noisevol
 swap d0
 move.w d0,Samplenum
 move.b d1,IDNUM
 jsr MakeSomeNoise

.nohitnoise:

 moveq #0,d0
 move.l #ExplosiveForce,a2
 move.b shotsize(a0),d0
 move.w (a2,d0.w*2),d0
 beq.s .noexplosion
 
 move.w newx,Viewerx
 move.w newz,Viewerz
 move.w 4(a0),Viewery
 move.b ObjInTop(a0),ViewerTop
 bsr ComputeBlast
 
.noexplosion:

 movem.l (a7)+,d0-d7/a0-a6

; bra doneshot

; rts
 
.nothitwall:

 tst.b timeout
 bne .hitsomething

lab:


 move.l objroom,a3
 move.w (a3),12(a0)
 move.w (a3),GraphicRoom(a0)
 move.l newx,(a1)
 move.l newz,4(a1)
************ 
* Check if hit a nasty

 tst.l EnemyFlags(a0)
 bne.s notasplut
 rts
notasplut:

 move.l ObjectData,a3
 move.l ObjectPoints,a1
 move.w newx,d2
 sub.w oldx,d2
 move.w d2,xdiff
 move.w newz,d1
 sub.w oldz,d1
 move.w d1,zdiff
 move.w d1,d3
 move.w d2,d4
 muls d2,d2
 muls d1,d1
 move.l #1,d0
 add.l d1,d2
 beq .oksqr

 move.w #31,d0
.findhigh
 btst d0,d2
 bne .foundhigh
 dbra d0,.findhigh
.foundhigh
 asr.w #1,d0
 clr.l d3
 bset d0,d3
 move.l d3,d0

 move.w d0,d1
 muls d1,d1	; x*x
 sub.l d2,d1	; x*x-a
 asr.l #1,d1	; (x*x-a)/2
 divs d0,d1	; (x*x-a)/2x
 sub.w d1,d0	; second approx
 bgt .stillnot0
 move.w #1,d0
.stillnot0

 move.w d0,d1
 muls d1,d1
 sub.l d2,d1
 asr.l #1,d1
 divs d0,d1
 sub.w d1,d0	; second approx
 bgt .stillnot02
 move.w #1,d0
.stillnot02

 move.w d0,d1
 muls d1,d1
 sub.l d2,d1
 asr.l #1,d1
 divs d0,d1
 sub.w d1,d0	; second approx
 bgt .stillnot03
 move.w #1,d0
.stillnot03
 
.oksqr
 move.w d0,Range
 add.w #40,d0
 muls d0,d0
 move.l d0,sqrnum

.checkloop:
 tst.w (a3)
 blt .checkedall
 tst.w 12(a3)
 blt .notanasty
 moveq #0,d1
 move.b 16(a3),d1
 move.l EnemyFlags(a0),d7
 btst d1,d7
 beq .notanasty
 tst.b numlives(a3)
 beq .notanasty
 
 move.l #ColBoxTable,a6
 lea (a6,d1.w*8),a6
 
 move.w 4(a3),d1
 move.w 4(a0),d2
 sub.w d1,d2
 bge .okh
 neg.w d2
.okh:
 
 cmp.w 2(a6),d2
 bgt .notanasty
 
 move.w (a3),d1
 move.w (a1,d1.w*8),d2
 move.w d2,d4
 move.w 4(a1,d1.w*8),d3
 move.w d3,d5
 sub.w newx,d4
 sub.w oldx,d2
 move.w d2,d6
 sub.w newz,d5
 sub.w oldz,d3
 move.w d3,d7
 muls zdiff,d6
 muls xdiff,d7
 sub.l d7,d6
 bgt.s .pos
 neg.l d6
.pos:
 divs Range,d6
 cmp.w (a6),d6
 bgt .stillgoing
 
 muls d2,d2
 muls d3,d3
 add.l d3,d2
 cmp.l sqrnum,d2
 bgt .stillgoing
 muls d4,d4
 muls d5,d5
 add.l d5,d4
 cmp.l sqrnum,d4
 bgt .stillgoing
 
 move.b shotpower(a0),d6
 add.b d6,damagetaken(a3)
 move.w shotxvel(a0),ImpactX(a3)
 move.w shotzvel(a0),ImpactZ(a3)
 move.b #0,shotanim(a0)
 move.b #1,shotstatus(a0)
 
 movem.l d0-d7/a0-a6,-(a7)
 move.l #HitNoises,a2
 moveq #0,d0
 move.b shotsize(a0),d0
 move.l (a2,d0.w*4),d0
 blt.s .nohitnoise3

 move.l #ObjRotated,a1
 move.w (a0),d1
 move.l (a1,d1.w*8),Noisex
 move.w d0,Noisevol
 swap d0
 move.w d0,Samplenum
 move.b d1,IDNUM
 jsr MakeSomeNoise
.nohitnoise3:
 moveq #0,d0
 move.l #ExplosiveForce,a2
 move.b shotsize(a0),d0
 move.w (a2,d0.w*2),d0
 beq.s .noexplosion3
 
 move.w 4(a0),Viewery
 move.w newx,Viewerx
 move.w newz,Viewerz
 bsr ComputeBlast
 
.noexplosion3:
 movem.l (a7)+,d0-d7/a0-a6
 
 
 bra .hitnasty
.stillgoing:
.notanasty:
 add.w #64,a3
 bra .checkloop
.hitnasty:
.checkedall

doneshot:

 rts
 
tmpnewx: dc.l 0
tmpnewz: dc.l 0
hithit: dc.l 0
sqrnum: dc.l 0
tmpangpos: dc.l 0
allbars: dc.l 0
backrout: ds.b 800
NUMTOCHECK: dc.w 0 
 
MAKEBACKROUT:
 move.l #backrout+256,d0
 clr.b d0
 move.l d0,allbars
 move.l d0,a1
 move.l #fromback,a0
 move.w #400,d0
putinback:
 move.b (a0)+,(a1)+
 dbra d0,putinback
 rts
 
putinbackdrop:

 move.l a0,-(a7)

 move.w tmpangpos,d5
 and.w #8191,d5
 muls #432,d5
 divs #8192,d5
 muls #38*2,d5

; CACHE_ON d1

 move.l frompt,a0
 adda.w #104*4,a0
 move.l #EndBackPicture,a3
 lea.l BackPicture,a1
 add.l d5,a1
 move.w #2,d4
 
 move.l allbars(pc),a2
 jmp (a2)
 
fromback:
 move.w #31,d3
onebar:
vertline:	
val SET 0

 REPT 19
 move.l (a1)+,d0
 move.w d0,val+104*4(a0)
 swap d0
 move.w d0,val(a0)
val SET val+104*8
 ENDR
 
 cmp.l a3,a1
 blt.s notoffrightend
 move.l #BackPicture,a1
notoffrightend:
 
 addq #4,a0
 dbra d3,onebar
 addq #4,a0
 dbra d4,fromback
 
 move.l (a7)+,a0
 rts
 
MaxDamage: dc.w 0

ComputeBlast:

 clr.w doneflames
 
 move.w d0,d6
 move.w d0,MaxDamage
 
 move.w d0,d1
 ext.l d6
 neg.w d1
 move.w 12(a0),d0
 jsr Flash

 move.l ZoneAdds,a2
 move.l (a2,d0.w*4),a2
 add.l LEVELDATA,a2
 move.l a2,MiddleRoom

 move.l ObjectData,a2
 suba.w #64,a2
 move.l #TESTAB,a6

 move.l a0,-(a7)
 
HitObjLoop:
 move.l MiddleRoom,FromRoom
 add.w #64,a2
 move.w (a2),d0
 blt CheckedEmAll
 tst.w 12(a2)
 blt.s HitObjLoop
 moveq #0,d1
 move.b 16(a2),d1
 move.l #%1111111111110111100001,d7	; possible targets
 btst d1,d7
 beq.s HitObjLoop

 move.w 12(a2),d1
 move.l ZoneAdds,a3
 move.l (a3,d1.w*4),a3
 add.l LEVELDATA,a3
 move.l a3,ToRoom
 move.l ObjectPoints,a3
 move.w (a3,d0.w*8),Targetx
 move.w 4(a3,d0.w*8),Targetz
 move.w 4(a2),Targety
 move.b ObjInTop(a2),TargetTop
 jsr CanItBeSeen
 tst.b CanSee
 beq HitObjLoop
 
 move.w Targetx,d0
 sub.w Viewerx,d0
 move.w d0,d2
 move.w Targetz,d1
 sub.w Viewerz,d1
 move.w d1,d3
 muls d2,d2
 muls d3,d3
 add.l d3,d2 
 beq .oksqr
 move.w #31,d4
.findhigh
 btst d4,d2
 dbne d4,.findhigh
.foundhigh
 asr.w #1,d4
 clr.l d3
 bset d4,d3
 move.l d3,d4

 move.w d4,d3
 muls d3,d3	; x*x
 sub.l d2,d3	; x*x-a
 asr.l #1,d3	; (x*x-a)/2
 divs d4,d3	; (x*x-a)/2x
 sub.w d3,d4	; second approx
 bgt .stillnot0
 move.w #1,d4
.stillnot0

 move.w d4,d3
 muls d1,d3
 sub.l d2,d3
 asr.l #1,d3
 divs d4,d3
 sub.w d3,d4	; second approx
 bgt .stillnot02
 move.w #1,d4
.stillnot02

 move.w d4,d3
 muls d3,d3
 sub.l d2,d3
 asr.l #1,d3
 divs d4,d3
 sub.w d3,d4	; second approx
 bgt .stillnot03
 move.w #1,d4
.stillnot03
 
.oksqr
 
 
 move.w d4,d3
 asr.w #3,d3
 
 sub.w #4,d3
 bge.s OkItsnotzero
 moveq #0,d3
OkItsnotzero:

 cmp.w #31,d3
 bgt HitObjLoop
 neg.w d3
 add.w 32,d3
 
 move.w d6,d5
 muls d3,d5
 asr.l #5,d5
 cmp.w MaxDamage,d5
 blt.s okdamage
 move.w MaxDamage,d5
okdamage:
 add.b d5,damagetaken(a2)
 ext.l d0
 ext.l d1
 asl.l #4,d0
 asl.l #4,d1
 divs d3,d0
 divs d3,d1
 move.w d0,ImpactX(a2)
 move.w d1,ImpactZ(a2)
 
 bra HitObjLoop 
 
CheckedEmAll:

; Now put in the flames!
 move.l (a7)+,a0

 move.w (a0),d0
 move.l ObjectPoints,a2
 move.w (a2,d0.w*8),d1
 move.w 4(a2,d0.w*8),d2
 
 move.w d1,middlex
 move.w d2,middlez

 move.w #9,d7
 
 clr.b exitfirst
 clr.b wallbounce
 move.w 12(a0),d0
 move.l ZoneAdds,a3
 move.l (a3,d0.w*4),a3
 add.l LEVELDATA,a3
 move.l a3,MiddleRoom
 
 move.l PlayerShotData,a3
 move.w 4(a0),d0
 ext.l d0
 asl.l #7,d0
 move.l d0,oldy
 
 moveq #2,d5
 move.w #19,NUMTOCHECK
 
 move.w #3,d6
radiusloop:
 move.w #2,d7
 
DOFLAMES:

 move.w NUMTOCHECK,d1
.findonefree
 move.w 12(a3),d2
 blt.s .foundonefree
 adda.w #64,a3
 dbra d1,.findonefree
 rts
.foundonefree

 move.w d1,NUMTOCHECK

 add.w #1,doneflames
 move.w middlex,d1
 move.w middlez,d2
 move.w d1,oldx
 move.w d2,oldz
 move.b ObjInTop(a0),StoodInTop
 
 jsr GetRand
 ext.w d0
 muls d5,d0
 asr.w #1,d0
 bne.s .xnz
 moveq #2,d0
.xnz:
 add.w d0,d1
 jsr GetRand
 ext.w d0
 muls d5,d0
 asr.w #1,d0
 bne.s .znz
 moveq #2,d0
.znz: 
 add.w d0,d2
 move.l oldy,d3
 jsr GetRand
 muls d5,d0
 asr.l #3,d0
 add.l d0,d3
 move.l d3,newy
 
 move.w d1,newx
 move.w d2,newz
 move.l MiddleRoom,objroom
 

 movem.l d5/d6/a0/a1/a3/d7/a6,-(a7)
 move.w #80,extlen
 move.b #1,awayfromwall
 jsr MoveObject
 movem.l (a7)+,d5/d6/a0/a1/a3/d7/a6
 
 move.l objroom,a2
 move.w (a2),12(a3)

 move.l newy,d0

 move.l ToZoneFloor(a2),d1
 move.l ToZoneRoof(a2),d2
 tst.b ObjInTop(a0)
 beq.s .okinbot
 move.l ToUpperFloor(a2),d1
 move.l ToUpperRoof(a2),d2
.okinbot:

 cmp.l d0,d1
 bgt.s .abovefloor
 move.l d1,d0
.abovefloor: 

 cmp.l d0,d2
 blt.s .belowroof
 move.l d2,d0
.belowroof:
 
 move.l d0,accypos(a3)
 asr.l #7,d0
 move.w d0,4(a3)
 move.b #2,16(a3)
 move.b #5,shotanim(a3)
 sub.b d5,shotanim(a3)
 st shotstatus(a3)
 move.b StoodInTop,ObjInTop(a3)
 move.b #2,shotsize(a3)
 st worry(a3)
 move.w (a3),d0
 move.l ObjectPoints,a2
 move.w newx,(a2,d0.w*8)
 move.w newz,4(a2,d0.w*8)
 
 adda.w #64,a3
 
 dbra d7,DOFLAMES
 add.w #1,d5
 dbra d6,radiusloop
 
 rts

MiddleRoom: dc.l 0
middlex: dc.w 0
middlez: dc.w 0
doneflames: dc.w 0

TESTAB: ds.l 200