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

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

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

 move.l ZoneAdds,a0
 move.l (a0,d0.w*4),a0
 add.l LEVELDATA,a0
 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


ExplodeIntoBits:
 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.l ObjectPoints,a2
 move.w (a5),d3
 lea (a2,d3.w*8),a2
 move.w newx,(a2)
 move.w newz,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)
 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)
 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

Robotanimpos:
 dc.w 0
Robotarmpos
 dc.w 0
clump: dc.w 0

RobotWalk:
 move.l #RobotPts+2,a0
 move.l #Robotanim,a1
 move.w Robotanimpos(pc),d0

 clr.b clump
 adda.w d0,a1
 
 move.w #(38*3)-1,d0
putinpts:
 move.w (a1)+,(a0)+
 dbra d0,putinpts


 move.l #RightArm,a0
 move.l #Armanim,a1
 move.w Robotarmpos(pc),d0
 adda.w d0,a1
 move.w #(14*3)-1,d0
putinpts2:
 move.w (a1)+,(a0)+
 dbra d0,putinpts2
 
 move.l #Robot_MainBody,a0
 move.l #BodyPlace+2,a1
 move.w (a0)+,d0
 move.w RobotPts+4+14*6,d1
 add.w RobotPts+4+22*6,d1
 asr.w #1,d1
 
putinheights:
 move.w (a0)+,d2
 add.w d1,d2
 move.w d2,(a1)
 addq #6,a1
 dbra d0,putinheights
 
 move.w visxpos,d0
 add.w visxdir,d0
 cmp.w #24,d0
 blt.s okvisr
 move.w #-4,visxdir
okvisr
 cmp.w #-24,d0
 bgt.s okvisl
 move.w #4,visxdir
okvisl:
 move.w d0,visxpos
 
 move.l #VISOR,a0
 add.w #64,d0
 move.b d0,6(a0)
 move.b d0,18(a0)
 move.b d0,22(a0)
 add.b #63,d0
 move.b d0,10(a0)
 move.b d0,14(a0)
 
 rts

visxpos: dc.w 0
visxdir: dc.w 4

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

 bsr Player1Shot
 bsr Player2Shot
 bsr SwitchRoutine
 bsr DoorRoutine
 bsr LiftRoutine
 bsr ObjectHandler
 bsr RobotWalk
 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

 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)
 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:
 tst.b p1_spctap
 bne.s SpaceIsPressed
 rts
SpaceIsPressed:
 move.l SwitchData,a0
 move.w #7,d0
 move.l Points,a1
 move.w PLR1_xoff,d1
 move.w PLR1_zoff,d2
CheckSwitches:
 move.w (a0),d3
 blt NotCloseEnough
 move.w 2(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 4(a0),a3
 add.l LEVELGRAPHICS,a3
 move.w 2(a3),d3
 and.w #%1111000000111111,d3
 not.b 8(a0)
 beq.s switchoff
 or.w #32*64,d3
switchoff: 
 move.w d3,2(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:
 adda.w #12,a0
 dbra d0,CheckSwitches
 rts

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

PLR1_clicked: dc.b 0
PLR2_clicked: dc.b 0
popping: ds.l 5*4
targetydiff: dc.l 0
PLR1_TimeToShoot: dc.w 0
PLR2_TimeToShoot: dc.w 0

Player1Shot:

 tst.w PLR1_TimeToShoot
 beq.s okcanfire
 
 move.w TempFrames,d0
 sub.w d0,PLR1_TimeToShoot
 bge PLR1_nofire
 move.w #0,PLR1_TimeToShoot
 bra PLR1_nofire
 
okcanfire:


 lea PLR1_GunData,a6
 moveq #0,d0
 move.b p1_gunselected,d0
 move.b d0,tempgun
 lsl.w #2,d0
 lea (a6,d0.w*8),a6
 move.w 14(a6),BulletSpd
 
 tst.w 12(a6)
 beq.s .itsaclick

 tst.b p1_fire
 beq PLR1_nofire
 bra .itsahold

.itsaclick:
 tst.b p1_clicked
 beq PLR1_nofire

.itsahold:

 move.w PLR1_angpos,d0
 move.l #SineTable,a0
 lea (a0,d0.w),a0
 move.w (a0),tempxdir
 move.w 2048(a0),tempzdir
 move.w PLR1_xoff,tempxoff
 move.w PLR1_zoff,tempzoff
 move.l PLR1_yoff,tempyoff
 move.b PLR1_StoodInTop,tempStoodInTop
 move.l PLR1_Roompt,tempRoompt
 move.l #%110111000001,d7
 move.w #-1,d0
 move.l #0,targetydiff
 move.l #$7fff,d1

 move.l ZoneAdds,a3

 move.l #PLR1_ObsInLine,a1
 move.l ObjectData,a0
 move.l #PLR1_ObjDists,a2
findclosestinline
 tst.w (a0)
 blt outofline
 tst.b (a1)+
 beq.s notlinedup
 btst #0,17(a0)
 beq.s notlinedup
 tst.w 12(a0)
 blt.s notlinedup
 move.b 16(a0),d6
 btst d6,d7
 beq.s notlinedup
 tst.b numlives(a0)
 beq.s notlinedup
 move.w (a0),d5
 move.w (a2,d5.w*2),d6
 move.w 4(a0),d2
 ext.l d2
 asl.l #7,d2
 sub.l PLR1_yoff,d2
 move.l d2,d3
 bge.s .oknotneg
 neg.l d2
.oknotneg:
 divs #40,d2
 cmp.w d6,d2
 bgt.s notlinedup
 
 cmp.w d6,d1
 blt.s notlinedup
 move.w d6,d1
 
; We have a closer enemy lined up.
 move.l d3,targetydiff 
 move.w d5,d0

notlinedup:
 add.w #64,a0
 bra findclosestinline

outofline:

 move.w #0,bulyspd
 tst.w d0
 blt nothingtoshoot
 
 move.l targetydiff,d5
 sub.l PLR1_height,d5
 add.l #18*256,d5
 move.w d1,closedist
 move.w BulletSpd,d2
 asr.w d2,d1
 tst.w d1
 bgt.s okdistthing
 moveq #1,d1
okdistthing
 divs d1,d5
 move.w d5,bulyspd

 tst.b 5(a6)
 beq pressedfire

 move.w (a6),d2
 moveq #0,d1
 move.b 2(a6),d1
 cmp.w d1,d2
 bge.s .okcanshoot
 
 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.b #12,Samplenum+1
 clr.b notifplaying
 move.b #$fb,IDNUM
 jsr MakeSomeNoise
 
 rts

.okcanshoot:

 move.w 8(a6),PLR1_TimeToShoot

 move.b #2,PLR1_GunFrame
 sub.w d1,d2
 move.w d2,(a6)

; Just blow it up.

 move.l PlayerShotData,a0
 move.w #19,d1
.findonefree
 move.w 12(a0),d2
 blt.s .foundonefree
 adda.w #64,a0
 dbra d1,.findonefree

 rts

.foundonefree:

 move.l ObjectPoints,a1
 move.w (a0),d2
 move.l (a1,d0.w*8),(a1,d2.w*8)
 move.l 4(a1,d0.w*8),4(a1,d2.w*8)
 move.b #1,shotstatus(a0)
 move.w #0,shotgrav(a0)
 move.b p1_gunselected,shotsize(a0)
 move.b #0,shotanim(a0)
 
 move.l ObjectData,a1
 asl.w #6,d0
 adda.w d0,a1
 move.w 4(a1),d1
 ext.l d1
 asl.l #7,d1
 move.l d1,accypos(a0)
 move.w 12(a1),12(a0)
 st worry(a0)
 move.w 4(a1),4(a0)
 
 move.b 6(a6),d0
 add.b d0,damagetaken(a1)

 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.b 3(a6),Samplenum+1
 move.b #2,chanpick
 clr.b notifplaying
 movem.l a0/d5/d6/d7,-(a7)
 move.b #$fb,IDNUM
 jsr MakeSomeNoise
 movem.l (a7)+,a0/d5/d6/d7
 rts
 
nothingtoshoot:

 tst.b 5(a6)
 beq pressedfire
 
 move.w (a6),d0
 moveq #0,d1
 move.b 2(a6),d1
 cmp.w d1,d0
 bge.s .okcanshoot
 
 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.b #12,Samplenum+1
 clr.b notifplaying
 move.b #$fb,IDNUM
 jsr MakeSomeNoise
 
 rts

.okcanshoot:
 move.w 8(a6),PLR1_TimeToShoot
 sub.w d1,d0
 move.w d0,(a6)
 move.b #2,PLR1_GunFrame

 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.b 3(a6),Samplenum+1
 move.b #2,chanpick
 clr.b notifplaying
 movem.l a0/d5/d6/d7,-(a7)
 move.b #$fb,IDNUM
 jsr MakeSomeNoise
 movem.l (a7)+,a0/d5/d6/d7
 rts
 
PLR1_nofire:

 rts

BulletSpd: dc.w 0

*******************************************************

Player2Shot:

 tst.w PLR2_TimeToShoot
 beq.s okcanfire2
 
 move.w TempFrames,d0
 sub.w d0,PLR2_TimeToShoot
 bge PLR2_nofire
 move.w #0,PLR2_TimeToShoot
 bra PLR2_nofire
 
okcanfire2:

 lea PLR2_GunData,a6
 moveq #0,d0
 move.b p2_gunselected,d0
 move.b d0,tempgun
 lsl.w #2,d0
 lea (a6,d0.w*8),a6
 move.w 14(a6),BulletSpd

 tst.w 12(a6)
 beq.s .itsaclick

 tst.b p2_fire
 beq PLR2_nofire
 bra .itsahold

.itsaclick:
 tst.b p2_clicked
 beq PLR2_nofire

.itsahold:

 move.w PLR2_angpos,d0
 move.l #SineTable,a0
 lea (a0,d0.w),a0
 move.w (a0),tempxdir
 move.w 2048(a0),tempzdir
 move.w PLR2_xoff,tempxoff
 move.w PLR2_zoff,tempzoff
 move.l PLR2_yoff,tempyoff
 move.b PLR2_StoodInTop,tempStoodInTop
 move.l PLR2_Roompt,tempRoompt
 move.l #%010111100001,d7
 move.w #-1,d0
 move.l #0,targetydiff
 move.l #$7fff,d1

 move.l ZoneAdds,a3

 move.l #PLR2_ObsInLine,a1
 move.l ObjectData,a0
 move.l #PLR2_ObjDists,a2
findclosestinline2
 tst.w (a0)
 blt outofline2
 tst.b (a1)+
 beq.s notlinedup2
 btst #1,17(a0)
 beq.s notlinedup2
 tst.w 12(a0)
 blt.s notlinedup2
 move.b 16(a0),d6
 btst d6,d7
 beq.s notlinedup2
 tst.b numlives(a0)
 beq.s notlinedup2
 move.w (a0),d5
 move.w (a2,d5.w*2),d6
 move.w 4(a0),d2
 ext.l d2
 asl.l #7,d2
 sub.l PLR2_yoff,d2
 move.l d2,d3
 bge.s .oknotneg
 neg.l d2
.oknotneg:
 divs #40,d2
 cmp.w d6,d2
 bgt.s notlinedup2
 
 cmp.w d6,d1
 blt.s notlinedup2
 move.w d6,d1
 
; We have a closer enemy lined up.
 move.l d3,targetydiff 
 move.w d5,d0

notlinedup2:
 add.w #64,a0
 bra findclosestinline2

outofline2:

 move.w #0,bulyspd
 tst.w d0
 blt nothingtoshoot2
 
 move.l targetydiff,d5
 sub.l PLR2_height,d5
 add.l #18*256,d5
 move.w d1,closedist
 
 move.w BulletSpd,d2
 asr.w d2,d1
 tst.w d1
 bgt.s okdistthing2
 moveq #1,d1
okdistthing2
 divs d1,d5
 move.w d5,bulyspd

 tst.b 5(a6)
 beq pressedfire2

 move.w (a6),d2
 moveq #0,d1
 move.b 2(a6),d1
 cmp.w d1,d2
 bge.s .okcanshoot
 
 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.b #12,Samplenum+1
 clr.b notifplaying
 move.b #$fb,IDNUM
 jsr MakeSomeNoise
 
 rts

.okcanshoot:

 move.w 8(a6),PLR2_TimeToShoot

 move.b #2,PLR2_GunFrame
 sub.w d1,d2
 move.w d2,(a6)

; Just blow it up.

 move.l PlayerShotData,a0
 move.w #19,d1
.findonefree
 move.w 12(a0),d2
 blt.s .foundonefree
 adda.w #64,a0
 dbra d1,.findonefree

 rts

.foundonefree:

 move.l ObjectPoints,a1
 move.w (a0),d2
 move.l (a1,d0.w*8),(a1,d2.w*8)
 move.l 4(a1,d0.w*8),4(a1,d2.w*8)
 move.b #1,shotstatus(a0)
 move.w #0,shotgrav(a0)
 move.b p2_gunselected,shotsize(a0)
 move.b #0,shotanim(a0)
 
 move.l ObjectData,a1
 asl.w #6,d0
 adda.w d0,a1
 move.w 4(a1),d1
 ext.l d1
 asl.l #7,d1
 move.l d1,accypos(a0)
 move.w 12(a1),12(a0)
 st worry(a0)
 move.w 4(a1),4(a0)
 
 move.b 6(a6),d0
 add.b d0,damagetaken(a1)

 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.b 3(a6),Samplenum+1
 move.b #2,chanpick
 clr.b notifplaying
 movem.l a0/d5/d6/d7,-(a7)
 move.b #$fb,IDNUM
 jsr MakeSomeNoise
 movem.l (a7)+,a0/d5/d6/d7
 rts
 
nothingtoshoot2:

 tst.b 5(a6)
 beq pressedfire2
 
 move.w (a6),d0
 moveq #0,d1
 move.b 2(a6),d1
 cmp.w d1,d0
 bge.s .okcanshoot
 
 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.b #12,Samplenum+1
 clr.b notifplaying
 move.b #$fb,IDNUM
 jsr MakeSomeNoise
 
 rts

.okcanshoot:
 move.w 8(a6),PLR2_TimeToShoot
 sub.w d1,d0
 move.w d0,(a6)
 move.b #2,PLR2_GunFrame

 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.b 3(a6),Samplenum+1
 move.b #2,chanpick
 clr.b notifplaying
 movem.l a0/d5/d6/d7,-(a7)
 move.b #$fb,IDNUM
 jsr MakeSomeNoise
 movem.l (a7)+,a0/d5/d6/d7
 rts
 
PLR2_nofire:


 rts
 
tempyoff: dc.l 0
tempStoodInTop: dc.w 0
tempangpos: dc.w 0
tempxdir: dc.w 0
tempzdir: dc.w 0
tempgun: dc.w 0
tstfire: dc.w 0
pressedfire:

 move.w #256,d6
 move.w #256,d5
 
 move.w (a6),d0
 moveq #0,d1
 move.b 2(a6),d1
 cmp.w d1,d0
 bge.s okcanshoot
 
 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.b #12,Samplenum+1
 clr.b notifplaying
 move.b #$fb,IDNUM
 jsr MakeSomeNoise
 
 rts

okcanshoot:
 move.w 8(a6),PLR1_TimeToShoot
 sub.w d1,d0
 move.w d0,(a6)
 move.b #2,PLR1_GunFrame
 move.l PLR1_Obj,a2
 bra firefive
 
pressedfire2:

 move.w #256,d6
 move.w #256,d5
 
 move.w (a6),d0
 moveq #0,d1
 move.b 2(a6),d1
 cmp.w d1,d0
 bge.s okcanshoot2

 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.b #12,Samplenum+1
 clr.b notifplaying
 move.b #$fb,IDNUM
 jsr MakeSomeNoise
 
 rts

okcanshoot2:
 move.w 8(a6),PLR2_TimeToShoot
 sub.w d1,d0
 move.w d0,(a6)
 move.b #2,PLR2_GunFrame
 move.l PLR2_Obj,a2

firefive:

 move.l PlayerShotData,a0
 move.w #19,d1
.findonefree
 move.w 12(a0),d0
 blt.s .foundonefree
 adda.w #64,a0
 dbra d1,.findonefree

 rts

.foundonefree:

 move.w 16(a6),shotgrav(a0)
 move.w 18(a6),shotflags(a0)
 move.w 20(a6),d0
 add.w d0,bulyspd

 move.w (a2),d0
 move.l #ObjRotated,a2
 move.l (a2,d0.w*8),Noisex
 move.w #50,Noisevol
 move.b 3(a6),Samplenum+1
 move.b #2,chanpick
 clr.b notifplaying
 move.b tempgun,shotsize(a0)
 move.b 6(a6),shotpower(a0)
 movem.l a0/d5/d6/d7,-(a7)
 move.b #$fb,IDNUM
 jsr MakeSomeNoise
 movem.l (a7)+,a0/d5/d6/d7

 move.l ObjectPoints,a1
 move.w (a0),d1
 lea (a1,d1.w*8),a1
 move.w tempxoff,(a1)
 move.w tempzoff,4(a1)
 move.w tempxdir,d0
 ext.l d0
 
 move.w BulletSpd,d1
 asl.l d1,d0
 move.l d0,shotxvel(a0)
 move.w tempzdir,d0
 ext.l d0
 asl.l d1,d0
 move.l d0,shotzvel(a0)
 move.w bulyspd,shotyvel(a0)
 move.b tempStoodInTop,ObjInTop(a0)
 move.w #0,shotlife(a0)
 move.l d7,EnemyFlags(a0)
 move.l tempRoompt,a2
 move.w (a2),12(a0)
 move.l tempyoff,d0
 add.l #20*128,d0
 move.l d0,accypos(a0)
 st worry(a0)
 asr.l #7,d0
 move.w d0,4(a0)
 
 add.w d6,tempangpos
 neg.w d6
 neg.w d5
 add.w d5,d6
 
 rts
 
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
 tst.b worry(a0)
 beq.s dontworryyourprettyhead

 cmp.b #0,16(a0)
 bne.s notnasty
 bsr ItsANasty
notnasty:
 cmp.b #1,16(a0)
 bne.s notmedi
 bsr ItsAMediKit
notmedi:
 cmp.b #2,16(a0)
 bne.s notbullet
 bsr ItsABullet
notbullet:
 cmp.b #3,16(a0)
 bne.s notbiggun
 bsr ItsABigGun
notbiggun:
 cmp.b #4,16(a0)
 bne.s notkey
 bsr ItsAKey
notkey:

; FIVE IS PLAYER 1

 cmp.b #6,16(a0)
 bne.s notRobot
 bsr ItsARobot
notRobot:
 cmp.b #7,16(a0)
 bne.s notBigNasty
 bsr ItsABigNasty
notBigNasty:
 cmp.b #8,16(a0)
 bne.s notFlyingNasty
 bsr ItsAFlyingNasty
notFlyingNasty:
 cmp.b #9,16(a0)
 bne.s notAmmoClip
 bsr ItsAnAmmoClip
notAmmoClip
 cmp.b #10,16(a0)
 bne.s notBarrel
 bsr ItsABarrel
notBarrel

; ELEVEN IS PLAYER 2

dontworryyourprettyhead:
 adda.w #64,a0
 bra Objectloop

doneallobj:
 rts
 
 include "ab3:source/AI.s"

ItsABarrel:

 clr.b worry(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 #12+8,d0
 bne.s .notdone
 
 move.w #-1,12(a0)
 rts
 
.notdone:
 move.w d0,10(a0)
 rts

notexploding:

 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)
 
 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 #200,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 #8,10(a0)
 move.w #$1010,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:

 rts

ItsAMarine:

 move.w #15,Aggression
 move.w #0,Movement
 move.w #30,Cooperation
 move.b #0,Ident
 move.l #%1,enemies
 move.l #%10100000,friends
 st Armed
 bsr AIControl

 move.l objroom,a2
 move.w 10(a2),2(a0)
 move.l 2(a2),d0
 sub.l #6400,d0
 asr.l #7,d0
 move.w d0,4(a0)

 move.l #0,8(a0)

 rts

 include "ab3:source/aliencontrol.s"

nextCPt: dc.w 0

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

ItsAMediKit:

 clr.b worry(a0)

HealFactor EQU 18
 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 #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
 bsr CheckHit
 tst.b hitwall
 beq.s .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 HealFactor(a0),d0
 add.w d0,PLR1_energy

.NotPickedUp:

.NotSameZone:

MEDIPLR2

 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
 bsr CheckHit
 tst.b hitwall
 beq.s .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 HealFactor(a0),d0
 add.w d0,PLR2_energy

.NotPickedUp:

.NotSameZone:


 rts

ItsAnAmmoClip:

 clr.b worry(a0)

AmmoType EQU 18
 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 #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
 bsr CheckHit
 tst.b hitwall
 beq.s .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 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
 bsr CheckHit
 tst.b hitwall
 beq.s .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 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:

 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
 bsr CheckHit
 tst.b hitwall
 beq.s .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
 lsl.w #2,d0
 move.l #PLR1_GunData+32,a1
 st 7(a1,d0.w*8)
 
 move.w #-1,12(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
 bsr CheckHit
 tst.b hitwall
 beq.s .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
 lsl.w #2,d0
 move.l #PLR2_GunData+32,a1
 st 7(a1,d0.w*8)
 
 move.w #-1,12(a0)

.NotPickedUp:

.NotSameZone:


 rts

ItsAKey:

 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
 bsr 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.b 17(a0),d0
 or.b d0,Conditions+1

 move.l #PanelKeys,a1
 move.l #Panel+40*8*11+22,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

 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 30*256+30
 dc.w 1,2
 dc.w 0
 dc.w 30*256+30
 dc.w 1,17
 dc.w 0
 dc.w 30*256+30
 dc.w 1,18
 dc.w 0
 dc.w 30*256+30
 dc.w 1,19
 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

Bul2Anim:
 dc.b 25,25
 dc.w 2,0
 dc.w 0
 dc.b 25,25
 dc.w 2,1
 dc.w 0
 dc.b 25,25
 dc.w 2,2
 dc.w 0
 dc.b 25,25
 dc.w 2,3
 dc.w 0
 dc.b 25,25
 dc.w 2,4
 dc.w 0
 dc.b 25,25
 dc.w 2,5
 dc.w 0
 dc.b 25,25
 dc.w 2,6
 dc.w 0
 dc.b 25,25
 dc.w 2,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

RockPop:
 dc.b 64,64
 dc.w 8,0+8
 dc.w 0
 dc.b 72,72
 dc.w 8,1+8
 dc.w 0
 dc.b 80,80
 dc.w 8,2+8
 dc.w 0
 dc.b 88,88
 dc.w 8,3+8
 dc.w 0
 dc.b 96,96
 dc.w 8,4+8
 dc.w 0
 dc.b 104,104
 dc.w 8,5+8
 dc.w 0
 dc.b 112,112
 dc.w 8,6+8
 dc.w 0
 dc.b 120,120
 dc.w 8,7+8
 dc.w 0
 dc.b 120,120
 dc.w 8,8+8
 dc.w 0
 dc.b 120,120
 dc.w 8,9+8
 dc.w 0
 dc.b 120,120
 dc.w 8,10+8
 dc.w 0
 dc.b 120,120
 dc.w 8,11+8
 dc.w 0
 dc.l -1

FlameAnim:
val SET 5
 REPT 6
 dc.b val,val
 dc.w 1,2
 dc.w 0
 dc.b val+3,val+3
 dc.w 1,17
 dc.w 0
 dc.b val+6,val+6
 dc.w 1,18
 dc.w 0
 dc.b val+9,val+9
 dc.w 1,19
 dc.w 0
val SET val+12
 ENDR
 dc.l -1

FlamePop:
 dc.b 40,40
 dc.w 1,12
 dc.w -8
 dc.b 40,40
 dc.w 1,13
 dc.w -8
 dc.b 40,40
 dc.w 1,14
 dc.w -8
 dc.b 40,40
 dc.w 1,15
 dc.w -8
 dc.b 40,40
 dc.w 1,16
 dc.w -8
 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 $808
 dc.w $1010
 dc.w $1010
 dc.w $0808
 dc.w $0808
 dc.w 0,0,0,0,0
;10 
 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
;30
 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
;50
 dc.w $0808,$0808,$0808,$0808

HitNoises:
 dc.l -1,-1
 dc.w 15,200
 dc.l -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.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,200,0,100,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 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 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
 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 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 #BulletSizes,a1
 move.w (a1,d1.w*2),14(a0)
 move.l #BulletTypes,a1
 lea (a1,d1.w*8),a1 
 moveq #0,d1
 move.b shotanim(a0),d1
 
 tst.b shotstatus(a0)
 beq.s notpopping

 move.l 4(a1),a2
 move.w (a2,d1.w*8),d2
 bge.s notdonepopping
 move.w #-1,12(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:

 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 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(pc),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)
 move.l d4,newy
 asr.l #7,d4
 move.w d4,4(a0)


 move.l ZoneAdds,a2
 move.l (a2,d0.w*4),d0
 add.l LEVELDATA,d0
 move.l d0,objroom
 move.b ObjInTop(a0),StoodInTop
 move.w #%0000010000000000,wallflags
 move.l #0,StepUpVal
 move.l #$1000000,StepDownVal
 move.l #10*128,thingheight
 movem.l d0/d7/a0/a1/a2/a4/a5,-(a7)
 jsr MoveObject
 movem.l (a7)+,d0/d7/a0/a1/a2/a4/a5
 move.b StoodInTop,ObjInTop(a0)
  
 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
 bsr ComputeBlast
 
.noexplosion:

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

; bra doneshot

; rts
 
.nothitwall:

 tst.b timeout
 bne .hitsomething

lab:

 move.l objroom,a3
 
 tst.b ObjInTop(a0)
 beq.s .notintop
 adda.w #8,a3
.notintop:
 
 move.l 6(a3),d0
 cmp.l accypos(a0),d0
 blt .nohitroof 
 
 btst #0,shotflags+1(a0)
 beq.s .nobounce
 
 neg.w shotyvel(a0)
 bra.s .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
 bsr ComputeBlast
 
.noexplosion:

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

.nohitroof:
 move.l 2(a3),d0
 sub.l accypos(a0),d0
 cmp.l #5*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)
 bra.s .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 newx,Viewerx
 move.w newz,Viewerz
 bsr ComputeBlast
 
.noexplosion2:
 movem.l (a7)+,d0-d7/a0-a6
.nohitfloor:

 move.l objroom,a3
 move.w (a3),12(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
 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
 move.b 16(a3),d1
 move.l EnemyFlags(a0),d7
 btst d1,d7
 beq .notanasty
 tst.b numlives(a3)
 beq .notanasty
 
 move.w 4(a3),d1
 move.w 4(a0),d2
 sub.w d1,d2
 cmp.w #12+40,d2
 bgt .notanasty
 cmp.w #-12-40,d2
 blt .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 #50,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 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
 
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
 bra allbars
 cnop 0,32
allbars:
 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,allbars
 
 move.l (a7)+,a0
 rts

ComputeBlast:

 move.l #%110111100001,d7	; possible targets
 
 move.w d0,d6
 move.w d0,d1
 ext.l d6
 asl.l #4,d6

 move.w 12(a0),d0
 neg.w d1
 asr.w #5,d1
 bsr Flash
 move.l ZoneAdds,a2
 move.l (a2,d0.w*4),a2
 add.l LEVELDATA,a2
 move.l a2,FromRoom

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

HitObjLoop:
 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
 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
 jsr CanItBeSeen
 tst.b CanSee
 beq.s 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 d2,d3
 asr.l #6,d3
 tst.w d3
 bne.s OkItsnotzero
 moveq #1,d3
OkItsnotzero:

 cmp.l #32767,d3
 bgt HitObjLoop
 
 move.l d6,d5
 divs d3,d5
 cmp.w #50,d5
 blt.s okdamage
 move.w #50,d5
okdamage:
 add.b d5,damagetaken(a2)
 ext.l d0
 asl.l #5,d0
 ext.l d1
 asl.l #5,d1
 divs d3,d0
 divs d3,d1
 move.w d0,ImpactX(a2)
 move.w d1,ImpactZ(a2)
 
 bra HitObjLoop 
 
CheckedEmAll:
 rts







