TypeOfSplat: dc.w 0
BRIGHTY: dc.l 0

BRIGHTENPOINTS:

 tst.b LIGHTING
 bne.s .dolight
 rts
.dolight:

; 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 ZoneBorderPts,a4
 
 lea ToListOfGraph(a0),a1
BRIGHTPTS:
 move.w (a1),d4
 blt brightall

 move.l ZoneAdds,a0
 move.l (a0,d4.w*4),a0
 add.l LEVELDATA,a0
 
 add.w #8,a1
 moveq #9,d7
 
 muls #20,d4
 
 lea (a4,d4.w),a5
 move.l #CurrentPointBrights,a2
 lea (a2,d4.w*4),a2
 
; Do a room.

ROOMPTLOP
 move.w (a5)+,d4
 blt BRIGHTPTS
 
 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 d6,d5

 move.l BRIGHTY,d4
 cmp.l ToZoneFloor(a0),d4
 bgt .noBRIGHT1
 cmp.l ToZoneRoof(a0),d4
 blt .noBRIGHT1

 move.w d5,d6
 move.l ToZoneRoof(a0),d4 
 sub.l BRIGHTY,d4
 bgt.s .noBRIGHT2
 neg.l d4
 asr.l #7,d4
 add.w d4,d6

 asr.w #5,d6
 add.w d0,d6
 
 bge.s .noBRIGHT2
 tst.w 2(a2)
 bge.s .okbr2
 neg.w 2(a2)
.okbr2:

 add.w 2(a2),d6
 cmp.w #300,d6
 bge.s .notoobr2
 move.w #300,d6
.notoobr2:
 move.w d6,2(a2)
 
.noBRIGHT2

 move.w d5,d6
 move.l ToZoneFloor(a0),d4
 sub.l BRIGHTY,d4
 blt.s .noBRIGHT1
 asr.l #7,d4
 add.w d4,d6

 asr.w #5,d6
 add.w d0,d6
 
 bge.s .noBRIGHT1 
 tst.w (a2)
 bge.s .okbr1
 neg.w (a2)
.okbr1:

 add.w (a2),d6
 cmp.w #300,d6
 bge.s .notoobr1
 move.w #300,d6
.notoobr1:
 move.w d6,(a2)


.noBRIGHT1

 move.l BRIGHTY,d4
 cmp.l ToUpperFloor(a0),d4
 bgt .noBRIGHT4
 cmp.l ToUpperRoof(a0),d4
 blt .noBRIGHT4

 move.w d5,d6
 move.l ToUpperFloor(a0),d4
 sub.l BRIGHTY,d4
 blt.s .noBRIGHT3
 asr.l #7,d4
 add.w d4,d6

 asr.w #5,d6
 add.w d0,d6
 
 bge.s .noBRIGHT3
 tst.w 4(a2)
 bge.s .okbr3
 neg.w 4(a2)
.okbr3:

 add.w 4(a2),d6
 cmp.w #300,d6
 bge.s .notoobr3
 move.w #300,d6
.notoobr3:
 move.w d6,4(a2)


.noBRIGHT3


 move.w d5,d6
 move.l ToUpperRoof(a0),d4
 sub.l BRIGHTY,d4
 bgt.s .noBRIGHT4
 neg.l d4
 asr.l #7,d4
 add.w d4,d6

 asr.w #5,d6
 add.w d0,d6
 
 bge.s .noBRIGHT4
 tst.w 6(a2)
 bge.s .okbr4
 neg.w 6(a2)
.okbr4:

 add.w 6(a2),d6
 cmp.w #300,d6
 bge.s .notoobr4
 move.w #300,d6
.notoobr4:
 move.w d6,6(a2)

.noBRIGHT4

 addq #8,a2
 
 dbra d7,ROOMPTLOP
 
 bra BRIGHTPTS

brightall:

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


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

 tst.b LIGHTING
 bne.s .dolight
 rts
.dolight:

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

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

 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 ZoneBorderPts,a4
 
 lea ToListOfGraph(a0),a1
  
BRIGHTPTSA:
 move.w (a1),d4
 blt brightallA
 move.l ZoneAdds,a0
 move.l (a0,d4.w*4),a0
 add.l LEVELDATA,a0
 
 add.w #8,a1
 moveq #9,d3
 
 muls #20,d4
 
 lea (a4,d4.w),a5
 move.l #CurrentPointBrights,a2
 lea (a2,d4.w*4),a2

ROOMPTLOPA
 move.w (a5)+,d4
 blt BRIGHTPTSA
 move.w 2(a3,d4.w*4),d5
 move.w (a3,d4.w*4),d4

 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 (a6),d0
 move.w 2048(a6),d1
 muls d7,d1
 muls d6,d0
 add.l d0,d1
 ble BEHINDPT
 move.l d1,d5
 neg.l d5
 add.l #30*65536,d5
 bge.s .okkkkk
 moveq #0,d5
.okkkkk
 
 move.w (a6),d0
 move.w 2048(a6),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 #2,d7
 swap d7

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

 add.w d7,d5
 add.w d4,d5

 move.l BRIGHTY,d4
 cmp.l ToZoneFloor(a0),d4
 bgt .noBRIGHT1
 cmp.l ToZoneRoof(a0),d4
 blt .noBRIGHT1

 move.w d5,d6
 move.l ToZoneRoof(a0),d4
 sub.l BRIGHTY,d4
 bgt.s .noBRIGHT2
 neg.l d4
 asr.l #7,d4
 add.w d4,d6

 asr.w #5,d6
 add.w d0,d6
 
 bge.s .noBRIGHT2
 tst.w 2(a2)
 bge.s .okbr2
 neg.w 2(a2)
.okbr2:
 add.w 2(a2),d6
 cmp.w #300,d6
 bge.s .notoobr2
 move.w #300,d6
.notoobr2:
 move.w d6,2(a2)
.noBRIGHT2


 move.w d5,d6
 move.l ToZoneFloor(a0),d4
 sub.l BRIGHTY,d4
 blt.s .noBRIGHT1
 asr.l #7,d4
 add.w d4,d6

 asr.w #5,d6
 add.w d0,d6
 
 bge.s .noBRIGHT1 
 tst.w (a2)
 bge.s .okbr1
 neg.w (a2)
.okbr1:
 add.w (a2),d6
 cmp.w #300,d6
 bge.s .notoobr1
 move.w #300,d6
.notoobr1:
 move.w d6,(a2)
.noBRIGHT1

 move.l BRIGHTY,d4
 cmp.l ToUpperFloor(a0),d4
 bgt .noBRIGHT4
 cmp.l ToUpperRoof(a0),d4
 blt .noBRIGHT4

 move.w d5,d6
 move.l ToUpperFloor(a0),d4
 sub.l BRIGHTY,d4
 blt.s .noBRIGHT3
 
 asr.l #7,d4
 add.w d4,d6

 asr.w #5,d6
 add.w d0,d6
 
 bge.s .noBRIGHT3
 tst.w 4(a2)
 bge.s .okbr3
 neg.w 4(a2)
.okbr3:
 add.w 4(a2),d6
 cmp.w #300,d6
 bge.s .notoobr3
 move.w #300,d6
.notoobr3:
 move.w d6,4(a2)
.noBRIGHT3


 move.w d5,d6
 move.l ToUpperRoof(a0),d4
 sub.l BRIGHTY,d4
 bgt.s .noBRIGHT4
 neg.l d4
 asr.l #7,d4
 add.w d4,d6

 asr.w #5,d6
 add.w d0,d6
 
 bge.s .noBRIGHT4
 tst.w 6(a2)
 bge.s .okbr4
 neg.w 6(a2)
.okbr4:
 add.w 6(a2),d6
 cmp.w #300,d6
 bge.s .notoobr4
 move.w #300,d6
.notoobr4:
 move.w d6,6(a2)
.noBRIGHT4

 addq #8,a2
 
 dbra d3,ROOMPTLOPA
 
 bra BRIGHTPTS

BEHINDPT:
 movem.l (a7)+,d0/d1/d2/d3/d4/d5
 addq #8,a2
 
 dbra d7,ROOMPTLOPA

 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,shotpower(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)

 move.b #2,16(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
 move.w d0,4(a5)
 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 TypeOfSplat,shotsize(a5)
; move.w #40,shotgrav(a5)
 move.w #0,shotflags(a5)
 move.w #0,shotlife(a5)
 clr.b shotstatus(a5)
 move.b ObjInTop(a0),ObjInTop(a5)
 st worry(a5)
 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 PulseANIM1
 dc.l PulseANIM2
 dc.l PulseANIM3
 dc.l PulseANIM4
 dc.l PulseANIM5
 dc.l FlickerANIM
 dc.l FireFlickerANIM
 dc.l -1

BrightAnimStarts:
 dc.l PulseANIM1
 dc.l PulseANIM2
 dc.l PulseANIM3
 dc.l PulseANIM4
 dc.l PulseANIM5
 dc.l FlickerANIM
 dc.l FireFlickerANIM

PulseANIM1:
 dc.w 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
 dc.w 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
 dc.w 999

PulseANIM2:
 dc.w 9,10,11,12,13,14,15,16,17,18,19,20
 dc.w 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
 dc.w 1,2,3,4,5,6,7,8
 dc.w 999

PulseANIM3:
 dc.w 17,18,19,20
 dc.w 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
 dc.w 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
 dc.w 999


PulseANIM4:
 
 dc.w 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
 dc.w 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,20,19,18,17

 dc.w 999

PulseANIM5:
 
 dc.w 8,7,6,5,4,3,2,1
 dc.w 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,20,19,18,17,16,15,14,13,12,11,10,9
 dc.w 999


FlickerANIM:
 dcb.w 20,20
 dc.w 1
 dcb.w 30,20
 dc.w 1
 dcb.w 5,20
 dc.w 1
 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

TimeToNoise: dc.w 0

ODDEVEN: dc.w 0

BACKSFX:

 move.w TempFrames,d0
 sub.w d0,TimeToNoise
 bgt .nosfx
 
 jsr GetRand
 lsr.w #3,d0
 and.w #127,d0
 add.w #100,d0
 move.w d0,TimeToNoise

 move.l Roompt,a0
 
 add.w ODDEVEN,a0
 
 move.w #2,d0
 sub.w ODDEVEN,d0
 move.w d0,ODDEVEN
 
 move.w ToBackSFX(a0),d1	; mask for sfx
 beq .nosfx
 
 jsr GetRand
 lsr.w #3,d0
 
.notfound
 addq #1,d0
 and.w #15,d0
 btst d0,d1
 beq.s .notfound
 
 move.l LINKFILE,a0
 add.l #BackSFX,a0
 move.w (a0,d0.w*2),Samplenum
 move.w #$fff0,IDNUM
 st.b notifplaying
 move.l #0,Noisex
 move.b #0,Echo
 jsr GetRand
 and.w #15,d0
 add.w #32,d0
 move.w d0,Noisevol
 
 jsr MakeSomeNoise
 
.nosfx:

 rts

objmoveanim:

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

 cmp.b #'n',mors
 bne.s .okp2
 move.w #-5,PLR2_Zone
.okp2:

 move.w #0,PLAYERONENOISEVOL
 move.w #0,PLAYERTWONOISEVOL

 move.l #BOREDOMSPACE,BOREDOMPTR

 bsr BACKSFX

 bsr Player1Shot
 bsr Player2Shot
 bsr Player3Shot
; bsr SwitchRoutine
 bsr ObjectHandler
 bsr DoorRoutine

 
 move.w #0,PLR1_FloorSpd
 move.w #0,PLR2_FloorSpd
 move.w #0,PLR3_FloorSpd
 
 bsr LiftRoutine
 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
PLR3_stoodonlift: dc.b 0
liftattop: dc.b 0
liftatbot: dc.b 0


DoorLocks: dc.w 0
LiftLocks: dc.w 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

FLOORMOVESPD: dc.w 0

 even
LiftRoutine:

 move.w #-1,ThisDoor
 move.l LiftData,a0
 move.l #liftheighttab,a6
 
doalift:
 add.w #1,ThisDoor
 move.w (a0)+,d0	; bottom of lift movement
 cmp.w #999,d0
 bne notallliftsdone
 move.w #999,(a6)
 
 move.w #0,LiftLocks
 
 bsr DoWaterAnims
 
 rts
 
notallliftsdone:
 move.w (a0)+,d1	; top of lift movement.
 
 move.w (a0)+,OPENINGSPEED
 neg.w OPENINGSPEED
 move.w (a0)+,CLOSINGSPEED
 move.w (a0)+,STAYOPENFOR
 move.w (a0)+,OPENINGSFX
 move.w (a0)+,CLOSINGSFX
 move.w (a0)+,OPENSFX
 move.w (a0)+,CLOSEDSFX
 subq.w #1,OPENINGSFX
 subq.w #1,CLOSINGSFX
 subq.w #1,OPENSFX
 subq.w #1,CLOSEDSFX
 move.w (a0)+,d2
 move.w (a0)+,d3
 sub.w THISPLRxoff,d2
 sub.w THISPLRzoff,d3
 move.w cosval,d4
 move.w sinval,d5

 muls d2,d4
 muls d3,d5
 sub.l d5,d4
 add.l d4,d4
 swap d4
 move.w d4,Noisex

 move.w sinval,d4
 move.w cosval,d5

 muls d2,d4
 muls d3,d5
 sub.l d5,d4
 add.l d4,d4
 swap d4
 move.w d4,Noisez
   
 move.w (a0),d3
 move.w d3,(a6)+
 move.w 2(a0),d2

 move.w 8(a0),d7
 move.l ZoneAdds,a1
 move.l (a1,d7.w*4),a1
 add.l LEVELDATA,a1
 move.b ToEcho(a1),Echo
 
 move.w d2,d7	; speed of movement.

 move.w d2,FLOORMOVESPD
 
 muls TempFrames,d2
 add.w d2,d3
 move.w d7,d2
 cmp.w d3,d0
 sle.s liftatbot
 bgt.s .nolower
 
 tst.w d2
 beq.s .nonoise3
 move.w #50,Noisevol
 move.w CLOSEDSFX,Samplenum
 blt.s .nonoise3
 move.b #1,chanpick
 clr.b notifplaying
 move.w #$fffd,IDNUM
 movem.l a0/a3/d0/d1/d2/d3/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a3/d0/d1/d2/d3/d6/d7
.nonoise3:
  
 moveq #0,d2
 move.w d0,d3
.nolower:

 cmp.w d3,d1
 sge.s liftattop
 blt.s .noraise

 tst.w d2
 beq.s .nonoise
 move.w #0,(a6)
 move.w #50,Noisevol
 move.w OPENSFX,Samplenum
 blt.s .nonoise
 move.b #1,chanpick
 clr.b notifplaying
 move.w #$fffd,IDNUM
 movem.l a0/a3/d0/d1/d2/d3/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a3/d0/d1/d2/d3/d6/d7
.nonoise

 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
 bne.s .nosetfloorspd1
 
 move.w FLOORMOVESPD,PLR1_FloorSpd
 
.nosetfloorspd1:
 
 move.l PLR2_Roompt,a3
 cmp.w (a3),d5
 seq.s PLR2_stoodonlift
 bne.s .nosetfloorspd2
 
 move.w FLOORMOVESPD,PLR2_FloorSpd
 
.nosetfloorspd2:

 move.l PLR3_Roompt,a3
 cmp.w (a3),d5
 seq.s PLR3_stoodonlift
 bne.s .nosetfloorspd3
 
 move.w FLOORMOVESPD,PLR3_FloorSpd
 
.nosetfloorspd3:

 
 move.w (a0)+,d2	; conditions
; and.w Conditions,d2
; cmp.w -2(a0),d2
 move.w ThisDoor,d2
 move.w LiftLocks,d5
 btst d2,d5
 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 #50,Noisevol
 move.w ACTIONNOISE,Samplenum
 blt.s .nothinghit
 move.b #1,chanpick
 st notifplaying
 move.w #$fffe,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:
 move.w CLOSINGSFX,ACTIONNOISE
 cmp.b #1,d5
 blt.s lift0
 beq.s lift1
 cmp.b #3,d5
 blt lift2
 beq lift3

lift0:

 moveq #0,d1
 tst.b p1_spctap
 beq.s .noplr1
 move.w #%100000000,d1
 move.w CLOSINGSPEED,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 CLOSINGSPEED,d7
 tst.b PLR2_stoodonlift
 beq.s .noplr2
 move.w #$8000,d1
 bra backfromlift
 
.noplr2:

 tst.b p3_spctap
 beq.s .noplr3
 or.w #%100000000000,d1
 move.w CLOSINGSPEED,d7
 tst.b PLR3_stoodonlift
 beq.s .noplr3
 move.w #$8000,d1
 bra backfromlift
 
.noplr3:
 bra backfromlift

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

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

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

rlift0:

 moveq #0,d1
 tst.b p1_spctap
 beq.s .noplr1
 move.w #%100000000,d1
 move.w OPENINGSPEED,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 OPENINGSPEED,d7
 tst.b PLR2_stoodonlift
 beq.s .noplr2
 move.w #$8000,d1
 bra backfromlift
 
.noplr2:

 tst.b p3_spctap
 beq.s .noplr3
 or.w #%100000000000,d1
 move.w OPENINGSPEED,d7
 tst.b PLR3_stoodonlift
 beq.s .noplr2
 move.w #$8000,d1
 bra backfromlift
 
.noplr3:


 bra backfromlift

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

rlift2:
 move.w #$8000,d1
 move.w OPENINGSPEED,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 
ThisDoor: dc.w 0
OPENINGSPEED: dc.w 0
CLOSINGSPEED: dc.w 0
STAYOPENFOR: dc.w 0
OPENINGSFX: dc.w 0
CLOSINGSFX: dc.w 0
OPENSFX: dc.w 0
CLOSEDSFX: dc.w 0
 
 even 
 DoorRoutine:

 move.l #doorheighttab,a6
 move.l DoorData,a0
 move.w #-1,ThisDoor
 
doadoor:
 
 add.w #1,ThisDoor
 move.w (a0)+,d0	; bottom of door movement
 cmp.w #999,d0
 bne notalldoorsdone
 move.w #999,(a6)
 move.w #0,DoorLocks
 rts
notalldoorsdone:
 move.w (a0)+,d1	; top of door movement.
 
 move.w (a0)+,OPENINGSPEED
 neg.w OPENINGSPEED
 move.w (a0)+,CLOSINGSPEED
 move.w (a0)+,STAYOPENFOR
 move.w (a0)+,OPENINGSFX
 move.w (a0)+,CLOSINGSFX
 move.w (a0)+,OPENSFX
 move.w (a0)+,CLOSEDSFX
 subq.w #1,OPENINGSFX
 subq.w #1,CLOSINGSFX
 subq.w #1,OPENSFX
 subq.w #1,CLOSEDSFX
 move.w (a0)+,d2
 move.w (a0)+,d3
 sub.w p1_xoff,d2
 sub.w p1_zoff,d3
 move.w cosval,d4
 move.w sinval,d5

 muls d2,d4
 muls d3,d5
 sub.l d5,d4
 add.l d4,d4
 swap d4
 move.w d4,Noisex

 move.w sinval,d4
 move.w cosval,d5

 muls d2,d4
 muls d3,d5
 sub.l d5,d4
 add.l d4,d4
 swap d4
 move.w d4,Noisez
 
 move.w (a0),d3
 move.w 2(a0),d2
 
 move.w 8(a0),d7
 move.l ZoneAdds,a1
 move.l (a1,d7.w*4),a1
 add.l LEVELDATA,a1
 move.b ToEcho(a1),Echo
 
 muls TempFrames,d2
 add.w d2,d3
 move.w 2(a0),d2
 cmp.w d3,d0
 sle.s doorclosed
 bgt.s nolower
 
 tst.w d2
 beq.s .nonoise
 move.w #50,Noisevol
 move.w CLOSEDSFX,Samplenum
 blt.s .nonoise
 move.b #1,chanpick
 clr.b notifplaying
 move.w #$fffd,IDNUM
 movem.l a0/a3/d0/d1/d2/d3/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a3/d0/d1/d2/d3/d6/d7
.nonoise 
 
 moveq #0,d2
 move.w d3,d0
 
nolower:

 cmp.w d3,d1
 sge.s dooropen
 blt.s noraise
 
 
 tst.w d2
 beq.s .nonoise
 move.w #0,(a6)
 move.w #50,Noisevol
 move.w OPENSFX,Samplenum
 blt.s .nonoise
 move.b #1,chanpick
 clr.b notifplaying
 move.w #$fffd,IDNUM
 movem.l a0/a3/d0/d1/d2/d3/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a3/d0/d1/d2/d3/d6/d7
.nonoise
 
 move.w d1,d3
 moveq #0,d2
noraise:

NOTMOVING:

 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 PLR2_Zone,d5
 beq.s .gobackup
 cmp.w PLR3_Zone,d5
 beq.s .gobackup
 cmp.w PLR1_Zone,d5
 bne.s NotGoBackUp
.gobackup: 
 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
 move.w ThisDoor,d2
 move.w DoorLocks,d5
 btst d2,d5
 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 #50,Noisevol
 move.w ACTIONNOISE,Samplenum
 blt.s nothinghit
 move.b #1,chanpick
 clr.b notifplaying
 move.w #$fffd,IDNUM
 movem.l a0/a3/d0/d1/d2/d3/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a3/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,24(a1)
 bra.s doorwalls
 
nomoredoorwalls 
 addq #2,a6
 bra doadoor

 rts

ACTIONNOISE: dc.w 0
 
tstdoortoopen:
 move.w OPENINGSFX,ACTIONNOISE
 
 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:
 tst.b p3_spctap
 beq.s .noplr3
 or.w #%100000000000,d1
.noplr3:
 move.w OPENINGSPEED,d7
 bra backfromtst

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

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

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

door4:
 move.w #$8000,d1
 move.w OPENINGSPEED,d7
 bra backfromtst
 
door5:
 move.w #$0,d1
 bra backfromtst
 
tstdoortoclose:
 move.w TempFrames,d1
 add.w (a6),d1
 move.w d1,(a6)
 cmp.w STAYOPENFOR,d1
 bge.s .oktoclose
 move.w #1,d4
 
.oktoclose:

 move.w CLOSINGSFX,ACTIONNOISE
 tst.w d4
 beq.s dclose0
 bra.s dclose1

dclose0:
 move.w CLOSINGSPEED,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.w #$fffc,IDNUM
 movem.l a0/a3/d0/d1/d2/d3/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a3/d0/d1/d2/d3/d6/d7

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.w #$fffc,IDNUM
 movem.l a0/a3/d0/d1/d2/d3/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a3/d0/d1/d2/d3/d6/d7
 
.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.w #$fffc,IDNUM
 movem.l a0/a3/d0/d1/d2/d3/d6/d7,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,a0/a3/d0/d1/d2/d3/d6/d7
 
 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

PLR3_GunFrame: 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 
PLR3_ObsInLine:
 ds.b 400 
PLR2_ObsInLine:
 ds.b 400 
 
rotcount:
 dc.w 0
 
shotvels: ds.l 20

 include "MULTIPLAYERSHOOT.s"
 
PLR1_GunFrame: dc.w 0
PLR2_GunFrame: dc.w 0
NUMZONES: dc.w 0

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

ObjectHandler:

 move.l #ObjWork,WORKPTR
 move.l #DAMAGED,DAMAGEPTR

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

 move.b 16(a0),d0
 cmp.b #1,d0
 blt JUMPALIEN
 beq JUMPOBJECT
 cmp.b #2,d0
 beq JUMPBULLET

doneobj:

dontworryyourprettyhead:
 adda.w #64,a0
 add.l #8,WORKPTR
 add.l #2,DAMAGEPTR
 add.l #8,BOREDOMPTR
 bra Objectloop

doneallobj:
 rts

JUMPALIEN
 tst.w 12(a0)
 blt.s .dontworry
 
 tst.b numlives(a0)
 beq.s .nolock
 move.l DoorsHeld(a0),d0
 or.l d0,DoorLocks
.nolock
 
 tst.b worry(a0)
 beq .dontworry
 jsr ItsAnAlien
 
 tst.w 12-64(a0)
 blt.s .notanaux
 move.w 12(a0),12-64(a0)
 move.w 12(a0),GraphicRoom-64(a0)
.notanaux:
 
.dontworry
 bra doneobj
 
JUMPOBJECT
 tst.w 12(a0)
 blt.s .dontworry
 jsr ItsAnObject
.dontworry
 bra doneobj
JUMPBULLET:
 jsr ItsABullet
 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.w (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/Multialiencontrol.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.w (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.w (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
 
 
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.w (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.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
BRIGHTNESS: dc.w 0

ItsABullet:

 move.b #0,timeout
 move.w 12(a0),d0
 move.w d0,GraphicRoom(a0)
 blt doneshot

 moveq #0,d1
 move.b shotsize(a0),d1
 muls #B_BulStatLen,d1
 move.l LINKFILE,a6
 lea BulletAnimData(a6),a6
 add.l d1,a6
 
 tst.b shotstatus(a0)
 bne.s noworrylife
 
; a6 points at bullet data.
 
 move.w shotlife(a0),d2
 blt.s infinite
 
 move.l B_LifeTime(a6),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

 
 tst.b shotstatus(a0)
 beq notpopping

 lea B_StartOfPop(a6),a1
 moveq #0,d1
 move.b shotanim(a0),d1

 move.w d1,d2
 add.w d1,d1
 add.w d2,d1
 add.w d1,d1
 
 move.l #0,8(a0)
 
 cmp.l #1,B_ImpactGraphicType(a6)
 blt.s .bitmapgraph
 beq.s .glaregraph
.additivegraph:
 move.b (a1,d1.w),9(a0)
 move.b 1(a1,d1.w),11(a0)
 move.b #6,10(a0)
 move.w 2(a1,d1.w),6(a0)
 move.b 5(a1,d1.w),BRIGHTNESS

 bra.s .donegraph
.bitmapgraph:
 move.b (a1,d1.w),9(a0)
 move.b 1(a1,d1.w),11(a0)
 move.w 2(a1,d1.w),6(a0)
 move.b 5(a1,d1.w),BRIGHTNESS

 bra.s .donegraph
.glaregraph:
 move.b (a1,d1.w),d0
 ext.w d0
 neg.w d0
 move.w d0,8(a0)
 move.b 1(a1,d1.w),11(a0)
 move.w 2(a1,d1.w),6(a0)
 move.b 5(a1,d1.w),BRIGHTNESS

.donegraph:

 addq #1,d2
 cmp.w B_PopFrames+2(a6),d2
 ble.s notdonepopping

 move.w #-1,12(a0)
 move.w #-1,GraphicRoom(a0)
 clr.b shotstatus(a0)
 move.b #0,shotanim(a0)
 rts
notdonepopping:

 move.b d2,shotanim(a0)
 moveq #0,d0
 move.b BRIGHTNESS,d0
 beq.s .nobright
 neg.w d0
 move.w (a0),d2
 move.l ObjectPoints,a2
 move.w (a2,d2.w*8),d1
 move.w 4(a2,d2.w*8),d2
 move.w 4(a0),d3
 ext.l d3
 asl.l #7,d3
 move.l d3,BRIGHTY
 move.w 12(a0),d3
 jsr BRIGHTENPOINTS
.nobright
 rts

BLOODYGREATBOMB: dc.w 0

notpopping:

 move.b shotsize(a0),BLOODYGREATBOMB

 lea B_StartOfAnim(a6),a1
 moveq #0,d1
 move.b shotanim(a0),d1

 add.w d1,d1
 move.w d1,d2
 add.w d1,d1
 add.w d2,d1

 move.l #0,8(a0)
 
 cmp.l #1,B_GraphType(a6)
 blt.s .bitmapgraph
 beq.s .glaregraph
.additivegraph:
 move.b (a1,d1.w),9(a0)
 move.b 1(a1,d1.w),11(a0)
 move.b #6,10(a0)
 move.w 2(a1,d1.w),6(a0)
 move.b 5(a1,d1.w),BRIGHTNESS

 bra.s .donegraph
.bitmapgraph:
 move.b (a1,d1.w),9(a0)
 move.b 1(a1,d1.w),11(a0)
 move.w 2(a1,d1.w),6(a0)
 move.b 5(a1,d1.w),BRIGHTNESS

 bra.s .donegraph
.glaregraph:
 move.b (a1,d1.w),d0
 ext.w d0
 neg.w d0
 move.w d0,8(a0)
 move.b 1(a1,d1.w),11(a0)
 move.w 2(a1,d1.w),6(a0)
 move.b 5(a1,d1.w),BRIGHTNESS

.donegraph:

 addq #1,d2
 cmp.w B_AnimFrames+2(a6),d2
 ble.s notdoneanim

 move.w #0,d2

notdoneanim:
 
 move.b d2,shotanim(a0)

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

******************************** 
 move.l objroom,a3
 move.b ToEcho(a3),Echo
 
 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)
 
 tst.l B_Gravity(a6)
 beq .nohitroof
 
; 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)
 
 move.l B_ImpactSFX(a6),d0
 subq.l #1,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 #200,Noisevol
 move.w d0,Samplenum
 move.w d1,IDNUM
 movem.l d0-d7/a0-a6,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,d0-d7/a0-a6
 
.nohitnoise:

 move.l B_ExplosiveForce(a6),d0
 beq.s .noexplosion
 
 move.w newx,Viewerx
 move.w newz,Viewerz
 
 move.w 4(a0),Viewery
 move.b ObjInTop(a0),ViewerTop
 
 movem.l d0-d7/a0-a6,-(a7)
 bsr ComputeBlast
 movem.l (a7)+,d0-d7/a0-a6
 
.noexplosion:

.nohitroof:

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

 tst.l B_BounceOffFloors(a6)
 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
 tst.l B_Gravity(a6)
 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)
 move.l B_ImpactSFX(a6),d0
 subq.l #1,d0
 blt.s .nohitnoise2

 move.l #ObjRotated,a1
 move.w (a0),d1
 move.l (a1,d1.w*8),Noisex
 move.w #200,Noisevol
 move.w d0,Samplenum
 move.w d1,IDNUM
 movem.l d0-d7/a0-a6,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,d0-d7/a0-a6
.nohitnoise2:
 moveq #0,d0
 move.l B_ExplosiveForce(a6),d0
 beq.s .noexplosion2
 
 move.w 4(a0),Viewery
 move.w newx,Viewerx
 move.w newz,Viewerz
 move.b ObjInTop(a0),ViewerTop
 movem.l d0-d7/a0-a6,-(a7)
 bsr ComputeBlast
 movem.l (a7)+,d0-d7/a0-a6
 
.noexplosion2:
.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.l B_Gravity(a6),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)
 tst.l B_BounceOffWalls(a6)
 sne.s wallbounce
 seq.s exitfirst

 clr.b MOVING

 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:
 st MOVING
 movem.l d0/d7/a0/a1/a2/a4/a5/a6,-(a7)
 jsr MoveObject
 
 moveq #0,d0
 move.b BRIGHTNESS,d0
 beq.s .nobright
 neg.w d0
 move.w newx,d1
 move.w newz,d2
 move.l newy,BRIGHTY
 move.l objroom,a0
 move.w (a0),d3
 jsr BRIGHTENPOINTS

.nobright:
 
 movem.l (a7)+,d0/d7/a0/a1/a2/a4/a5/a6
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

 tst.l B_Gravity(a6)
 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)

 move.l B_ImpactSFX(a6),d0
 subq.l #1,d0
 blt.s .nohitnoise

 move.l #ObjRotated,a1
 move.w (a0),d1
 move.l (a1,d1.w*8),Noisex
 move.w #200,Noisevol
 move.w d0,Samplenum
 move.w d1,IDNUM
 movem.l d0-d7/a0-a6,-(a7)
 jsr MakeSomeNoise
 movem.l (a7)+,d0-d7/a0-a6

.nohitnoise:

 move.l B_ExplosiveForce(a6),d0
 beq.s .noexplosion
 
 move.w newx,Viewerx
 move.w newz,Viewerz
 move.w 4(a0),Viewery
 move.b ObjInTop(a0),ViewerTop
 movem.l d0-d7/a0-a6,-(a7)
 bsr ComputeBlast
 movem.l (a7)+,d0-d7/a0-a6
 
.noexplosion:


; 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 #80,d0
 muls d0,d0
 move.l d0,sqrnum

.checkloop:
 tst.w (a3)
 blt .checkedall
 tst.w 12(a3)
 blt .notanasty

 move.b ObjInTop(a0),d1
 move.b ObjInTop(a3),d2
 eor.b d2,d1
 bne .notanasty

 moveq #0,d1
 move.b 16(a3),d1
 
 move.l EnemyFlags(a0),d7
 btst d1,d7
 beq .notanasty
 
 cmp.b #1,d1
 bne.s .notanobj
 
 move.l LINKFILE,a4
 add.l #ObjectStats,a4
 move.b TypeOfThing(a3),d1
 muls #ObjectStatLen,d1
 cmp.w #2,O_Behaviour(a4,d1.w)
 bne .notanasty
 
.notanobj:
 
 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

 tst.b MOVING
 beq.s .ignoreheight

 cmp.w #50,d2
 bgt .notanasty
 
.ignoreheight:
 
 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
 
 move.w #80,d7
 cmp.b #1,16(a3)
 ble.s .okbig

 move.w #40,d7

.okbig:
 
 cmp.w d7,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)
 
 move.l B_ImpactSFX(a6),d0
 subq.l #1,d0
 blt.s .nohitnoise3

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

doneshot:

 rts
 
MOVING: dc.w 0
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

**************************************** 
 ifeq CHEESEY
 
putinbackdrop:

 move.l a0,-(a7)

 move.w tmpangpos,d5
 and.w #4095,d5
 muls #648,d5
 divs #4096,d5
 muls #240,d5

; CACHE_ON d1

 tst.b FULLSCR
 bne BIGBACK


 move.l FASTBUFFER,a0
 move.l BackPicture,a5
 move.l a5,a3
 add.l #155520,a3
 add.l #240,a5
; move.l #EndBackPicture,a3
; move.l #BackPicture+240,a5
 move.l BackPicture,a1
; lea.l BackPicture,a1
 add.l d5,a1
 add.w #240,a1
 
 move.w MIDDLEY,d7
 
 move.w d7,d6
 move.w d6,d5
 asr.w #1,d5
 add.w d5,d6
 sub.w d6,a1
 sub.w d6,a5 
 
 asr.w #2,d7
 
 move.w #240,d1
 move.w #240,d2
 move.w #480,d5
 move.w #191,d4
 
horline:
 move.w d7,d3
 move.l a0,a2
 move.l a1,a4
vertline:
 move.w (a4)+,d0
 move.b d0,(a2)
 move.b (a4)+,d0
 move.b d0,320(a2)
 addq #1,a4
 move.b (a4)+,d0
 move.b d0,320*2(a2)
 move.b (a4)+,d0
 move.b d0,320*3(a2)
 
 adda.w #320*4,a2
 dbra d3,vertline
 
 add.w d1,a1
 cmp.l a1,a3
 bgt.s .noend
 move.l a5,a1
.noend
 
 exg d1,d2
 exg d2,d5
 
 addq.w #1,a0
 
 dbra d4,horline
 
 move.l (a7)+,a0
 rts


BIGBACK:


 move.l FASTBUFFER,a0
 move.l BackPicture,a5
 move.l a5,a3
 add.l #155520,a3
 add.l #240,a5
; move.l #EndBackPicture,a3
; move.l #BackPicture+240,a5
 move.l BackPicture,a1
 add.l d5,a1
 add.w #240,a1
 
 move.w MIDDLEY,d7
 
 move.w d7,d6
 sub.w d6,a1
 sub.w d6,a5 
 
 asr.w #2,d7
 move.w #287,d4


.horline:
 move.w d7,d3
 move.l a0,a2
 move.l a1,a4
.vertline:
 move.l (a4)+,d0
 move.b d0,320*3(a2)
 swap d0
 move.b d0,320(a2)
 lsr.l #8,d0
 move.b d0,(a2)
 swap d0
 move.b d0,320*2(a2)

 adda.w #320*4,a2
 dbra d3,.vertline
 
 add.w #240,a1
 cmp.l a1,a3
 bgt.s .noend
 move.l a5,a1
.noend
 
 addq.w #1,a0
 
 dbra d4,.horline
 
 move.l (a7)+,a0
 rts
****************************************
 endc

 ifne CHEESEY 
 
putinbackdrop:

 move.l a0,-(a7)

 move.w tmpangpos,d5
 and.w #4095,d5
 muls #648,d5
 divs #4096,d5
 
;xoffset of backdrop

; CACHE_ON d1

 tst.b FULLSCR
 bne BIGBACK


 move.l FASTBUFFER,a0
 add.l d5,a1
 add.w #240,a1
 
 move.w MIDDLEY,d7
 
 move.w d7,d6
 move.w d6,d5
 asr.w #1,d5
 add.w d5,d6
 sub.w d6,a1
 sub.w d6,a5 
 
 asr.w #2,d7
 
 move.w #240,d1
 move.w #240,d2
 move.w #480,d5
 move.w #(192/8)-1,d4
 
 moveq #0,d0
 
horline:
 move.w d7,d3
 move.l a0,a2
 move.l a1,a4
vertline:
 move.l d0,(a2)
 move.l d0,320(a2)
 move.l d0,320*2(a2)
 move.l d0,320*3(a2)
 move.l d0,4(a2)
 move.l d0,4+320(a2)
 move.l d0,4+(320*2)(a2)
 move.l d0,4+(320*3)(a2)
 adda.w #320*4,a2
 dbra d3,vertline
 
 addq.w #8,a0
 
 dbra d4,horline
 
 move.l (a7)+,a0
 rts


BIGBACK:


 move.l FASTBUFFER,a0
 add.l d5,a1
 add.w #240,a1
 
 move.w MIDDLEY,d7
 
 move.w d7,d6
 sub.w d6,a1
 sub.w d6,a5 
 
 asr.w #2,d7
 move.w #(288/8)-1,d4
 move.l #0,d0

.horline:
 move.w d7,d3
 move.l a0,a2
 move.l a1,a4
.vertline:

 move.l d0,320*0(a2)
 move.l d0,320*1(a2)
 move.l d0,320*2(a2)
 move.l d0,320*3(a2)
 move.l d0,4+320*0(a2)
 move.l d0,4+320*1(a2)
 move.l d0,4+320*2(a2)
 move.l d0,4+320*3(a2)


 adda.w #320*4,a2
 dbra d3,.vertline
 
 addq #8,a0
 
 dbra d4,.horline
 
 move.l (a7)+,a0
 rts
 
 endc
 
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

 ext.l d6

 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
 cmp.b #1,d1
 beq.s HitObjLoop
 blt.s .checkalien
 cmp.b #3,d1
 beq.s HitObjLoop
 bgt.s .checkalien
 
; check bullet
 moveq #0,d7
 move.b shotsize(a2),d7
 move.l LINKFILE,a3
 muls #B_BulStatLen,d7
 add.l #BulletAnimData,a3
 add.l d7,a3
 tst.l B_Gravity(a3)
 beq.s HitObjLoop
 bra.s .okblast

.checkalien
 tst.b numlives(a2)
 beq.s HitObjLoop
 
.okblast:
 

 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
 move.w #1,d4
 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
 move.w d3,d7
 
 cmp.w #256,d7
 bge.s .okd
 move.w #256,d7
.okd:
 
 asr.w #3,d3
 
 
 sub.w #4,d3
 bge.s OkItsnotzero
 moveq #0,d3
OkItsnotzero:

 cmp.w #64,d3
 bgt HitObjLoop
 neg.w d3
 add.w #64,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
 muls.l d6,d0
 muls.l d6,d1
; asl.l #2,d0
; asl.l #2,d1
 divs d7,d0
 divs d7,d1
 
 move.b 16(a2),d2
 cmp.b #2,d2
 bne.s .impactalien

 add.w d0,shotxvel(a2)
 add.w d1,shotzvel(a2)
 
 move.l d6,d1
 asl.l #8,d1
 asl.l #4,d1
 divs d7,d1
 
 neg.w d1
 cmp.w #-8*256,d1
 bge.s .okbl
 move.w #-8*256,d1
.okbl

 add.w d1,shotyvel(a2)
 
 bra.s .impactedbul
.impactalien: 
 
 move.w d0,ImpactX(a2)
 move.w d1,ImpactZ(a2)
 
 
 move.l d6,d1
 asl.l #4,d1
 divs d7,d1
 
 
; move.w 4(a2),d0
; sub.w 4(a0),d0	;dy
; bge.s .above
 neg.w d1
;.above
 cmp.w #-8,d1
 bge.s .okbl2
 move.w #-8,d1
.okbl2

 move.w d1,ImpactY(a2)
 
.impactedbul:
 
 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
 st.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 #2,d6
radiusloop:
 move.w #1,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.b #2,16(a3)

 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 #0,shotanim(a3)
; sub.b d5,shotanim(a3)
 st shotstatus(a3)
 move.b StoodInTop,ObjInTop(a3)
 move.b BLOODYGREATBOMB,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
 sub.w #1,NUMTOCHECK
 blt.s .nomore
 
 dbra d7,DOFLAMES
 add.w #2,d5
 dbra d6,radiusloop
 
.nomore:
 
 rts

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

