total-carnage/SHAWN.ASM

3621 lines
60 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

**************************************************************
*
* Software: Shawn Liptak
* Initiated: June 27,1991
*
* Modified: !
*
* COPYRIGHT (C) 1991 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 12/19/91 23:04
**************************************************************
.FILE 'SHAWN.ASM'
.TITLE 'TOTAL CARNAGE GAME PROGRAM'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
.include "mproc.equ"
.include "disp.equ"
.include "\video\sys\sys.inc"
.include "\video\sys\gsp.inc"
.include "game.equ"
.include "imgtbl.glo"
.include "shawn.hdr"
.include "shawn.tbl"
;sound headers used
.ref ALTEXP1,EXP1L,SQUISH
.ref AGLSEXP,GLSEXP,NOWAY
mslexpsnd .word >f480,20,>8048,0 ;Missile explosion
walksnd .word >f4E0,10,>812E,0 ;Spidermom walk
flingsnd .word >f38e,>18,>8080,0 ;Spider fling snd
crashsnd .word >fcf5,68,>8038,0 ;Car crash explosion
;symbols externally defined
.ref WAVE,PCNT,TINGSND
.ref ANI,FRANIM,FRANIMQ,BEGINOBJ,BEGINOBJ2,PLYRPRCS,CK_GOOB
.ref XBOOM2,BOOM3,STATUS,EXP3,SKIPR_DN
.ref GET_WVADDR,RANDPER,SLOW_DWN,RANGRAND
.ref FIEND,getcloseplyr,FLASHME,DO_PUNISH
.ref SKIPR_CNT,EXPCNT
.ref OUT_FLG
.ref SCRADD2,P1DATA,P2DATA
.ref CHUNK_OBJ,PCTOT
.ref INHERE
.ref GETFPAL
.ref HULK_CNT,SHULK
.ref BLUEEXP,FIREEXP
.ref SHAKER,SBSND,SBOMB,bombn_killp,PLYROBJS
.ref HALT,FB_FADEIN,FB_FADEOUT,FADEIN,FADEOUT,PAL_TOWHT,PAL_FMWHT
.ref COLCYC,CYCLEON
.ref RNDRNGS
.ref CLNPAL
.ref digit_t,WTIMER0
.ref SKGHXT,SHXT
;symbols defined in this file
.def CIRCL_FLG,LOTS_FLAG
.def WINNER,WVBONUS,LOSER
.def NEUTRONB,bombnon
.def DONT_WARP
;uninitialized ram definitions
.bss CIRCL_FLG ,16
.bss bombnpalmem1 ,5*16*2 ;Cycle mem
.bss bombnpalmem2 ,5*16*2 ;^
.bss bombnon ,16 ;!0=Neutron bomb active
.bss IN_BOMB ,16 ;FLAG FOR BMB IN PROGRESS
.bss LOTS_FLAG ,16 ;FLAG FOR BARRAGE OF BMBS
.bss DONT_WARP,16
.text
********************************
* Start a spider baby (Process)
* A9=[Y,X] spot to spawn from
* A10=Direction (1-8)
SUBR GSKIPR
MOVE A10,A0
SLL 5,A0
ADDI SKGHXT,A0
MOVE *A0,A4,L
MOVE *A4+,A2,W
MOVE A2,B0
MOVE *A4+,A2,W
MOVE A2,B1
CALLA RANGRAND
SLL 16,A0
ADD A9,A0
MOVE A0,A1
MOVE *A4+,A2,W
MOVE A2,B0
MOVE *A4+,A2,W
MOVE A2,B1
CALLA RANGRAND
MOVX A9,A2
ADD A0,A2
SLL 16,A2
MOVE A2,A0 ;NEED A0=[X,0000],A1=[Y,0000]
jruc spidb_start
********************************
* Start a spider baby (Process)
* A8=1-4 for grunt # for this release
* A9=[Y,X] spot to spawn from
* A10=Direction (1-8)
SUBR ASKIPR
MOVE A10,A0
SLL 5,A0
ADDI SHXT,A0
MOVE *A0,A4,L
SLL 6,A8
ADD A8,A4
MOVE *A4+,A1,L ;GET Y FIRST
ADD A9,A1
SLL 16,A9
MOVE *A4,A0,L
ADD A9,A0 ;NEED A0=[X,0000],A1=[Y,0000]
jruc spidb_start
********************************
* Send bingo obj to scoreboard
SUBR DOBINGO
move *a10(PNUM),a10
subk 1,a10
move *a8(OXVAL),a0,L
move *a8(OYVAL),a1,L
movi BINGO,a2 ;*IMG
movi DMAWNZ|M_NOCOLL,a4
movi CLSDEAD,a5
clr a6
clr a7
movi 460,a3 ;Z
calla BEGINOBJ2 ;No world added in
calla CYCLEON
SLEEP 90
clr a11
jauc INHERE
SUBR DODUD
move *a10(PNUM),a10
subk 1,a10
move *a8(OXVAL),a0,L
move *a8(OYVAL),a1,L
movi DUD,a2 ;*IMG
movi DMAWNZ|M_NOCOLL,a4
movi CLSDEAD,a5
clr a6
clr a7
movi 500,a3 ;Z
calla BEGINOBJ2 ;No world added in
calla CYCLEON
SLEEP 90
movi NOWAY,a0
calla ONESND
jauc DELOBJDIE
********************************
* Enemy spawner for testing
; SUBR DO_SHAWN
;
; movi eyemaker_t,a8
; CREATE 0,eye
; movi morttnk_t,a8
; CREATE 0,morttnk
; movi morttnk2_t,a8
; CREATE 0,morttnk
; movi spitter_t,a8
; CREATE 0,spitter
; movi msltnk_t,a8
; CREATE 0,msltnk
; CREATE0 mslstrike
; DIE
;eyemaker_t
; .word 200,90,50,DMAWNZ,CLSENMY
; .long PDOME
;morttnk_t
; .word 30,150,158,DMAWNZ,CLSENMY
; .long MTNK6
;morttnk2_t
; .word 370,150,158,DMAWNZ,CLSENMY
; .long MTNK6
;spitter_t
; .word 50,100,158,DMAWNZ,CLSENMY
; .long SPITR1
;msltnk_t
; .word 30,150,158,DMAWNZ,CLSENMY
; .long MTNK6
********************************
* Slime pool (Process)
WORDPD slimex,0
WORDPD slimey,1
SUBR POND
movi DMAWNZ+M_NOCOLL,a0
move a0,*a8(OFLAGS) ;Collisions off
movi CLSDEAD,a0
move a0,*a8(OID)
movi 50,a0
move a0,*a8(OZPOS)
sp100 SLEEPK 1
MOVE @HALT,A0
jrnz sp100
movi >ff,a0
callr rnd
addk 20,a0
calla PRCSLP ;SLEEP some
movk 3,a0
callr rnd
btst 1,a0 ;Rnd mode
jrnz sp500
move a0,a11 ;>At player 0-1
movi slimepat_t,a9
movk 7,a0
callr rnd
addk 1,a0
move a0,a10 ;Loop 1-8
sp200 PUSH a10
movi goob_l,a10
callr bloop_snd
CREATE shawnpid,mortar_atp
PULL a10
addk 32,a9 ;Next slot
movk >1f,a0
callr rnd
jrz sp300
calla PRCSLP ;SLEEP 0-31
sp300 dsj a10,sp200
jruc sp800
sp500
move @HULK_CNT,a0 ;If hulk_cnt+aircnt too many don't do circle!
subk 12,a0
jrge sp550
move @CIRCL_FLG,a0
jrnz sp550
movk 1,a0
callr rnd
jrz sp600 ;50% do circle
sp550 move a13,a9 ;>Random shot
addi slimex,a9
movi >ff,a0
callr rnd
subi >7f,a0
move a0,*a9 ;X
movi >7f,a0
callr rnd
subi >3f,a0
move a0,*a9(16) ;Y
movi goob_l,a10
CREATE shawnpid,mortar_relsrc
callr bloop_snd
jruc sp800
sp600 movi slimepat2_t-512,a9 ;>Circle pattern
movk 1,a0
move a0,@CIRCL_FLG
sp605 movk 3,a0
callr rnd
jrz sp605
sll 9,a0 ;*512
add a0,a9
movi bubl1snd,a0
calla ONESND
movk 2,a11
sp610 movk 16,a10
sp620 PUSH a10
movi goob_l,a10
CREATE shawnpid,mortar_relsrc
PULL a10
addk 32,a9
dsj a10,sp620
SLEEP 40
movi bubl2snd,a0
calla ONESND
dsj a11,sp610
SLEEP 60*3 ;Wait a while
movi bubl1snd,a0
calla ONESND
SLEEP 60*5 ;Wait a while
clr a0
move a0,@CIRCL_FLG
sp800 move @SCRNTL,a2,L ;Get screen top left
move @SCRNLR,a3,L ;Get screen lower rgt
movi [40,40],a1
subxy a1,a2
addxy a1,a3
calla SCRTSTG
jrz sp100 ;Continue till scroll off bottom
jauc DELOBJDIE
slimepat_t
.word 0,0, -30,-20, 30,20, -30,20, 30,-20, -40,0, 40,0, 0,0
slimepat2_t
.word 0,-80,30,-74,56,-56,74,-30
.word 80,0,74,30,56,56,30,74
.word 0,80,-30,74,-56,56,-74,30
.word -80,0,-74,-30,-56,-56,-30,-74
.word 0,-60,23,-55,42,-42,55,-23
.word 60,0,55,23,42,42,23,55
.word 0,60,-23,55,-42,42,-55,23
.word -60,0,-55,-23,-42,-42,-23,-55
.word 0,-40,15,-37,28,-28,37,-15
.word 40,0,37,15,28,28,15,37
.word 0,40,-15,37,-28,28,-37,15
.word -40,0,-37,-15,-28,-28,-15,-37
.word 0,-30,11,-28,21,-21,28,-11
.word 30,0,28,11,21,21,11,28
.word 0,30,-11,28,-21,21,-28,11
.word -30,0,-28,-11,-21,-21,-11,-28
goob_l .long slimeburst_l
LW GOOB1,4
LW GOOB2,4
LW GOOB3,5
LW GOOB4,6
LW GOOB5,7
LW GOOB6,8
LW GOOB7,6
LW GOOB8,4
LW GOOB7,4
LW GOOB6,8
LW GOOB5,8
LW GOOB4,6
LW GOOB3,5
LW GOOB2,4
LWL0 GOOB1,3
.word DMAWNZ+M_NOCOLL
.long slimesplat_l
slimeburst_l
LW GBLOB1,10
LW GBLOB2,10
LW GBLOB3,10
LWL0 GBLOB4,10
slimesplat_l
LW GOOB9,10
LWL0 GOOB10,10
********************************
* Make slime pool sound
SUBRP bloop_snd
move @HCOUNT,a0
sll 32-2,a0
srl 32-2-5,a0
addi bloop_t,a0
move *a0,a0,L
movk 2,a1 ;repeat it
jauc SNDLD
bloop_t .long blp1snd,blp2snd,blp3snd,blp4snd
bubl1snd .word >f5e5,20,>8131,0 ;Blood bubbling
bubl2snd .word >f0e5,20,>8130,0 ;^
blp1snd .word >f575,20,>8134,0 ;Bloop snd
blp2snd .word >f575,20,>8136,0 ;
blp3snd .word >f575,20,>8138,0 ;
blp4snd .word >f575,20,>813a,0 ;
********************************
* Eye (Process)
WORDPD eyex,0
WORDPD eyey,1
SUBRP eye
callr obj_get
e100 movi >7f,a0
callr rnd
calla PRCSLP ;SLEEP some
movk 3,a0
callr rnd
btst 1,a0 ;Rnd mode
jrnz e500
move a0,a11 ;>At player 0-1
movi eyepat_t,a9
movk >f,a0
callr rnd
addk 1,a0
move a0,a10 ;Loop 1-16
e200 PUSH a10
movi eye_l,a10
CREATE shawnpid,mortar_atpnoa
movk 5,a1
move a1,*a0(msinea)
PULL a10
addk 32,a9 ;Next slot
movk >f,a0
callr rnd
jrz e300
calla PRCSLP ;SLEEP 0-31
e300 dsj a10,e200
jruc e800
e500 movk 7,a0
callr rnd
jrz e600 ;13% do circle
move a13,a9 ;>Random shot
addi eyex,a9
movi >ff,a0
callr rnd
subi >7f,a0
move a0,*a9 ;X
movi >7f,a0
callr rnd
subi >3f,a0
move a0,*a9(16) ;Y
PUSH a10
movi eye_l,a10
CREATE shawnpid,mortar_relsrcnoa
movk 5,a1
move a1,*a0(msinea)
PULL a10
jruc e800
e600 movi eyepat2_t,a9 ;>Circle pattern
movk 16,a10
e620 PUSH a10
movi eye_l,a10
CREATE shawnpid,mortar_relsrcnoa
movk 5,a1
move a1,*a0(msinea)
PULL a10
addk 32,a9
dsj a10,e620
e800 move @WORLDTLY+16,a0
move *a8(OYPOS),a1
subi 250,a1
cmp a0,a1
jrlt e100 ;Continue till scroll off bottom
jauc DELOBJDIE
eyepat_t
.word 0,0, -30,-20, 30,20, -30,20, 30,-20, -40,0, 40,0, 0,0
eyepat2_t
.word 0,-80, 31,-74, 57,-57, 74,-31, 80,0, 74,31, 57,57, 31,74
.word 0,80, -31,74, -57,57, -74,31, -80,0, -74,-31, -57,-57, -31,-74
eye_l .long eyeburst_l
LW I1,1
LW I2,2
LW I3,4
LW I4,8
LW I5,12
LW I6,14
LW I6,14
LW I5,12
LW I4,8
LW I3,4
LW I2,2
LWL0 I1,1
.word DMAWNZ+M_NOCOLL
.long eyesplat_l
eyeburst_l
LWL0 GOOB9,10
eyesplat_l
LWL0 GOOB9,10
;ARE WE USING THIS STUFF?
********************************
* Mortar tank (Process)
SUBRP morttnk
callr obj_get
movi -1,a11
mt100 movi >ff,a0
callr rnd
; movk 7,a0 ;DEBUG
calla PRCSLP
movk 5,a10 ;#Shots in pattern
movi mortpat_t,a9
mt200 PUSH a10
movi mortar_l,a10
CREATE shawnpid,mortar_atp
PULL a10
addk 32,a9
; SLEEPK 1
dsj a10,mt200
dsj a11,mt100
DIE
mortpat_t
.word 0,0, -30,-20, 30,20, -30,20, 30,-20
mortar_l
.long 0 ;*FRANIM
LW BALL1,2 ;82 Ticks
LW BALL2,3
LW BALL3,4
LW BALL4,6
LW BALL5,9
LW BALL6,11
LW BALL7,12
LW BALL6,11
LW BALL5,9
LW BALL4,6
LW BALL3,4
LW BALL2,3
LWL0 BALL1,2
.word DMAWNZ
.long BOOM3 ;*FRANIM
********************************
* Hovering spitter (Process)
; SUBRP spitter ;A8=*Data_t
;
; callr obj_get
;
;spi100 SLEEPK 1
; calla getcloseplyr
; jrz spi100
; movi >800,a3
; callr seekob_vel
; move *a8(OXVEL),a0,L
; move a0,a1
; sra 6,a1
; sub a1,a0 ;-Drag
; add a6,a0 ;+Vel
; move a0,*a8(OXVEL),L
; move *a8(OYVEL),a0,L
; move a0,a1
; sra 6,a1
; sub a1,a0 ;-Drag
; add a7,a0 ;+Vel
; move a0,*a8(OYVEL),L
;
; movi >ff,a0
; callr rnd
; jrnz spi150
; CREATE shawnpid,missile_fire OLD!
;
;spi150 movi >ff,a0
; callr rnd
; jruc spi800 ;DEBUG
; jrnz spi800
; movk 5,a10 ;#Shots in pattern
; movi spitpat_t,a9
;spi200 PUSH a10
; movi spitter_l,a10
; CREATE shawnpid,mortar_atp
; PULL a10
; addk 32,a9
; dsj a10,spi200
;spi800 jruc spi100
; DIE
;
;
;spitpat_t
; .word 0,0, -30,-20, 30,20, -30,20, 30,-20
;
;spitter_l
; .long 0 ;*FRANIM
; LW TEST1,2 ;82 Ticks
; LW TEST2,3
; LW TEST3,4
; LW TEST4,6
; LW TEST5,9
; LW TEST6,11
; LW TEST7,12
; LW TEST6,11
; LW TEST5,9
; LW TEST4,6
; LW TEST3,4
; LW TEST2,3
; LWL0 TEST1,2
; .word DMAWNZ
; .long BOOM3 ;*FRANIM
********************************
* Mortar shot (Process)
APTRPD msobj_p ,0 ;*Mortar shadow object
WORDPD mpos ,2 ;Mortar pos in arc
WORDPD msinea ,3 ;Sine add per tick
LONGPD MYLIST ,4 ;*FRANIM for player death
LONGPD MYSND ,6 ;*Sound for ^
WORDPD FXOR ,9 ;Player 0 or 1
MZ .set 158
SUBRP mortar_relsrc ;A8=*Src Obj, A9=*SrcXY offset_t, A10=*Obj_t
movk 1,a0
move a0,*a13(msinea)
SUBRP mortar_relsrcnoa ;^
move *a8(OXPOS),a6 ;Get X
move *a8(OSIZEX),a3
srl 1,a3
add a3,a6
move *a8(OYPOS),a7 ;Get Y
move *a8(OSIZEY),a3
srl 1,a3
add a3,a7
jruc mortar_shot
SUBRP mortar_atp ;A8=*Src Obj, A9=*DestXY offset_t, A10=*Obj_t
;A11=0-1 (P1-P2)
movk 1,a0
move a0,*a13(msinea)
SUBRP mortar_atpnoa ;^
move @PLYRPRCS,a2,L
move @STATUS,a3
jrz ms900 ;Demo?
btst 0,a11
jrz ma20
btst 1,a3 ;P2 valid?
jrnz ma30
ma20 btst 0,a3 ;P1 valid?
jrnz ma40
ma30 move @PLYRPRCS+32,a2,L
ma40 move *a2(LEG_PTR),a2,L
move *a2(OXPOS),a6
cmpi >1a00,a6 ;Off screen?
jrge ms900
addk 10,a6
move *a2(OYPOS),a7
addk 16,a7
movk 7,a0
callr rnd
subk 3,a0
add a0,a6 ;X offset -3 to 4
movk 7,a0
callr rnd
subk 3,a0
add a0,a7 ;Y^
SUBRP mortar_shot ;A8=*Src Obj, A9=*XY offset_t, A10=*Obj_t
clr a0
move a0,*a13(FXOR) ;Player 0
movi gslime_l,a0 ;Green slimed franim
move a0,*a13(MYLIST),L
movi EXP3,a0 ;Soft explosion
move a0,*a13(MYSND),L
move *a8(OXPOS),a0 ;Get X
move *a8(OSIZEX),a3
srl 1,a3
add a3,a0 ;Center X
move *a8(OYPOS),a1 ;Get Y
move *a8(OSIZEY),a3
srl 1,a3
add a3,a1 ;Center Y
sll 16,a0
sll 16,a1
move *a9+,a3
add a3,a6 ;+X offset
sll 16,a6
sub a0,a6 ;DestX-SrcX
move *a9+,a3
add a3,a7 ;+Y offset
sll 16,a7
sub a1,a7 ;DestY-SrcY
move a6,a11
abs a11 ;A11=Distance
move a7,a2
abs a2
cmp a2,a11 ;Use max
jrhs ms30
move a2,a11
ms30
srl 6,a11 ;/64
move a11,a3
srl 2,a3
sub a3,a11 ;Sub .25 = /96
cmpi 14000,a11
jrhs ms60
movi 14000,a11 ;Minimum
ms60 sra 1,a6 ;>Scale down to A11
sra 1,a7
move a6,a2
abs a2
cmp a11,a2 ;A6&A7 < A11
jrgt ms60
move a7,a2
abs a2
cmp a11,a2
jrgt ms60
move a6,a4 ;>Fine scale up to A11
move a7,a5
sra 4,a4 ;/16
sra 4,a5
jrnz ms150
move a4,a4
jrz ms200 ;Both 0 then skip
ms150 add a4,a6
add a5,a7
move a6,a2
abs a2
cmp a11,a2
jrgt ms200
move a7,a2
abs a2
cmp a11,a2
jrle ms150
ms200 move *a8(OZPOS),a3
addk 2,a3
movi DMAWNZ+M_NOCOLL,a4 ;No collisions
movi CLSDEAD,a5
move a10,a9
addk 32,a10
move *a10,a2,L ;Get *1st obj
mmtm a12,a0,a1,a3,a4,a6,a7
clr a6
clr a7
calla BEGINOBJ2 ;Get shot obj
move *a9,a9,L ;Get *FRANIM list
jrz ms250
JSRP FRANIMQ ;Fire sequence
ms250 mmfm a12,a0,a1,a3,a4,a6,a7
movi SHADW,a2
subk 1,a3
movi CLSENMY+TYPGOO,a5
move a8,a9
calla BEGINOBJ2 ;Get shadow obj
move a8,*a13(msobj_p),L
move a9,a8
move a5,*a8(OID)
move a10,a9
clr a0
move a0,*a13(mpos)
jruc ms400
ms300 movi DMAWNZ+M_NOCOLL,a4 ;No collisions
calla ANI ;New frame
move *a9+,a10 ;Get #ticks for frame
ms350 move a8,a0
callr GANIOFQ
move *a13(msobj_p),a5,L
move *a5(OXPOS),a1
sub a6,a1
move a1,*a8(OXPOS) ;Set shot X
move *a13(mpos),a0 ;New height
move *a13(msinea),a1
add a1,a0
cmpi 82,a0 ;Max table range
jrlo ms370
clr a0
ms370 move a0,*a13(mpos)
callr sine_get
srl 5,a0 ;/32
move *a5(OYPOS),a1
sub a0,a1
sub a7,a1
move a1,*a8(OYPOS) ;Set shot Y
move a0,a1
addi MZ+130,a0
move a0,*a8(OZPOS)
subk 10,a1
jrhi ms380
calla CK_GOOB
ms380 SLEEPK 1
dsj a10,ms350
ms400 move *a9+,a1,L ;Get *Img
jrnz ms300
move *a13(msobj_p),a0,L ;Kill shadow
clr a10 ;A10=Dir 0-3 (UPL,UPR,DNL,DNR)
move *a0(OXVEL+16),a1
jrn ms500
addk 1,a10
ms500 move *a0(OYVEL+16),a1
jrn ms520
addk 2,a10
ms520
calla DELOBJ
movi 36,a0 ;21
move a0,*a8(OZPOS)
move *a9+,a0 ;Get OFLAGS
move a0,*a8(OFLAGS)
movi CLSDEAD,a0
move a0,*a8(OID)
move *a9+,a9,L ;Get *FRANIM list
jrz ms880
JSRP FRANIMQ ;Explode
move *a8(OYPOS),a9 ;A9=[Y,X] Spot to spawn from
subk 26,a9
sll 16,a9
move *a8(OXPOS),a0
addk 12,a0
movx a0,a9
clr a11
CREATE HULKPID,SHULK ;Start one hulk
SLEEP 2EH
ms880 calla DELOBJA8
ms900 DIE
gslime_l
LW GSLMD1,NEWPALET+5
.long GOOBP
LW GSLMD2,5
LW GSLMD3,5
LW GSLMD4,15
LW GSLMD3,4
LW GSLMD2,4
LWL0 GSLMD1,4
********************************
* Spider mom insect (Process)
APTRPD smsobj_p,0 ;*Shadow object
WORDPD smpos ,2 ;Pos in arc
WORDPD smFREE ,3 ;
APTRPD smobjt_p,4 ;*Jumper object_t
WORDPD smx ,6 ;X pos
WORDPD smy ,7 ;Y pos
; WORDPD smdis ,8 ;Distance to jump
WORDPD smseekx ,9 ;X pos to seek
WORDPD smseeky ,10 ;Y pos to seek
WORDPD smseekt ,11 ;Time to seek
; WORDPD smseekr ,12 ;!0=Need random seek
WORDPD smvhitsl,13 ;# Velocity hits left (0-1)
WORDPD smhit ,14 ;!0=Hit by shot
WORDPD ABSRB,16 ;# hits taken 0-?
SPDMZ .equ 155
SPDMPTS .equ >50 ;BCD
SUBR spidmom_start ;A8=X, A9=Y
movk 3,a0
callr rnd
addk 6,a0
sll 14,a0
move a0,a7
move a8,a0
move a9,a1
sll 16,a0
sll 16,a1
movi SPYDERA1,a2
movi SPDMZ,a3 ;Z
movi DMAWNZ,a4
movi CLSENMY+TYPSL+SUBSM,a5
clr a6
calla BEGINOBJ2
; move @SKIPR_CNT,a0
; addk 1,a0
; move a0,@SKIPR_CNT
; movi SKIPR,a2
; calla GET_WVADDR
; move *a0(16),a1 ;Dec wave ram cnt
; subk 1,a1
; move a1,*a0(16)
; jrnz sm70
; movk 1,a1
; move a1,@SKIPR_DN
sm70
; move *a0(32),a1 ;Get difficulty level
; move a1,*a13(LEVEL)
clr a0
move a0,*a13(ABSRB)
sm100
movi walksnd,a0
calla ONESND
movi spidm_l,a9
jruc sm400
sm300 move *a8(OFLAGS),a4
calla ANI ;New frame
move *a9+,a10 ;Get #ticks for frame
sm350
SLEEPK 1
dsj a10,sm350
sm400 move *a9+,a1,L ;Get *Img
jrnz sm300
movk 1,a0
callr rnd
jrnz sm600
move a9,a5
move a8,a6
move *a6(OXPOS),a8
addk 28,a8
move *a6(OYPOS),a9
addk 2,a9
movi >ff,a0
callr rnd
addi 60,a0
move a0,a10
CREATE shawnpid,spidb_egg
move a6,a8
move a5,a9
sm600
sm880 move @WORLDTLY+16,a0
move *a8(OYPOS),a1
addi 250,a0
cmp a0,a1
jrlo sm100
jauc DELOBJDIE
spidm_l
LW SPYDERA1,2
LW SPYDERA2,2
LW SPYDERA3,2
LW SPYDERA4,2
LW SPYDERA5,2
LW SPYDERA6,2
LW SPYDERA1,2
LW SPYDERA2,2
LW SPYDERA3,2
LW SPYDERA4,2
LW SPYDERA5,2
LWL0 SPYDERA6,2
spidmmpat_t ;Missiles!
.word 10,10, 0,0, 20,0, 0,20, 20,20
********************************
* Spider babies (Process)
APTRPD sbsobj_p,0 ;*Jumper shadow object
WORDPD sbpos ,2 ;Jumper pos in arc
WORDPD sbhatch ,3 ;CntDn to hatch
APTRPD sbobjt_p,4 ;*Jumper object_t
WORDPD sbx ,6 ;X pos
WORDPD sby ,7 ;Y pos
WORDPD sbdis ,8 ;Distance to jump
WORDPD sbseekx ,9 ;X pos to seek
WORDPD sbseeky ,10 ;Y pos to seek
WORDPD sbseekt ,11 ;Time to seek
WORDPD sbseekr ,12 ;!0=Need random seek
WORDPD sbvhitsl,13 ;# Velocity hits left (0-1)
WORDPD sbhit ,14 ;!0=Hit by shot
WORDPD ABSRB,16 ;# hits taken 0-?
SPDBZ .equ 150
SPDBPTS .equ >10
SUBRP spidb_shootegg ;A8=*SpidMom obj, A10=Hatch time
move a10,*a13(sbhatch) ;Hatch time
clr a2
move a2,*a13(sbseekt) ;# Hops
move a2,*a13(sbseekr) ;Random off
movk 5,a0 ;>Speed
callr rndrng0
addk 1,a0
sll 13,a0 ;*>200
move a0,a11
movk 25,a0 ;>Random origin
callr rndrng0
subk 12,a0
move a0,a4
movk 21,a0
callr rndrng0
subk 5,a0
move a0,a5
move *a8(OXPOS),a0
addi 35,a0
move a0,a6
add a4,a0
sll 3,a4 ;*8
add a4,a6
move *a8(OYPOS),a1
addk 25,a1
move a1,a7
add a5,a1
sll 3,a5 ;*8
add a5,a7
sll 16,a0
sll 16,a1
sll 16,a6
sll 16,a7
sub a0,a6 ;DestX-SrcX
sub a1,a7 ;DestY-SrcY
sbs240 sra 1,a6 ;>Scale down to A11
sra 1,a7
move a6,a2
abs a2
cmp a11,a2 ;A6&A7 < A11
jrgt sbs240
move a7,a2
abs a2
cmp a11,a2
jrgt sbs240
movi SPYDEREGG1,a2
movi 73,a3 ;Z
movi DMAWNZ+M_NOCOLL,a4
movi CLSNEUT+TYPICON+SUBSEGG,a5
PUSH a0,a1,a4,a6,a7
clr a6
clr a7
calla BEGINOBJ2
PULL a0,a1,a4,a6,a7
movi SPYDEREGG1A,a2
movi 72,a3 ;Z
movi CLSDEAD,a5
move a8,a9
calla BEGINOBJ2 ;Get shadow obj
move a8,*a13(sbsobj_p),L
move a9,a8
movk 3,a0
callr rnd
movi -9,a11
add a0,a11
sbs300 movi spidbegg_l,a9
clr a0
move a0,*a13(sbpos)
jruc sbs400
sbs330 move *a8(OFLAGS),a4
calla ANI ;New frame
move *a9+,a10 ;Get #ticks for frame
sbs350 move *a13(sbsobj_p),a5,L
move a5,a0
callr GANIOFQ
move *a13(sbpos),a0 ;New height
addk 2,a0
cmpi 82,a0 ;Max table range
jrlo sbs370
clr a0
sbs370 move a0,*a13(sbpos)
callr sine_get
srl a11,a0 ;Divide it (2s comp)
move a0,a1
move *a5(OYPOS),a2
sub a0,a2
addi SPDBZ,a0
move a0,*a8(OZPOS)
move a8,a0
move *a5(OXPOS),a3
add a6,a3 ;Add Anim pt
add a7,a2
; subk 8,a2 ;Fix Y
; subk 6,a3 ;Fix X
sll 16,a2
sll 16,a3
movi DMAWNZ+M_NOCOLL,a4
subk 8,a1
jrgt sbs380
subi M_NOCOLL,a4
sbs380 calla GANISAG
SLEEPK 1
dsj a10,sbs350
sbs400 move *a9+,a1,L ;Get *Img
jrnz sbs330
movi spidbeggl_l,a9
JSRP FRANIMQ ;Land
subk 1,a11 ;Increase divisor
cmpi -10,a11 ;Min
jrgt sbs300
; jrle sbs500
; movk 3,a0
; callr rnd
; jrnz sbs300
sbs500 move *a13(sbsobj_p),a0,L ;Kill shadow
calla DELOBJ
jruc spidbaby2
spidbegg_l
LW SPYDEREGG,2
LW SPYDEREGG2,36
LWL0 SPYDEREGG,3
spidbeggl_l
LW SPYDEREGG3,4
LWL0 SPYDEREGG1,2
SUBR STRT_EGG ;FROM BACKGROUND DRIVER
MOVE @WAVE,A0
SLL 5,A0
ADDI LENGTH-24*32,A0
MOVE *A0,A0,L
CLR A1
MOVX A0,A1
SRL 16,A0
MOVE A0,B0
MOVE A1,B1
CALLA RANGRAND
move a0,*a13(sbhatch) ;Hatch time
MOVE *A8(OYVAL),A9,L
MOVE A8,A0
MOVE *A8(OXVAL),A8,L
CALLA DELOBJ ;DELETE FAKE BAKGND EGG
clr a2
move a2,*a13(sbseekt) ;# Hops
move a2,*a13(sbseekr) ;Random off
jruc spidbaby
LENGTH
;1ST ENTRY IS FOR WAVE 24
;MINIMUM TIME, MAX TIME TO DELAY HATCH
.long [8*60,12*60],[8*60,12*60],[3*60,17*60],[4*60,70*60]
.long [4*60,120*60],[8*60,46*60],[8*60,100*60],[4*60,20*60]
.long [4*60,120*60],[8*60,46*60],[8*60,100*60],[6*60,30*60]
.long [6*60,30*60],[4*60,17*60],[3*60,30*60],[3*60,30*60]
.long [6*60,50*60],[8*60,46*60],[3*60,10*60],[4*60,20*60]
.long 0
SUBRP spidb_egg ;A8=X, A9=Y, A10=Hatch time
sll 16,a8
sll 16,a9
clr a2
move a2,*a13(sbseekt) ;# Hops
move a2,*a13(sbseekr) ;Random off
move a10,*a13(sbhatch) ;Hatch time
jruc spidbaby
SUBRP spidb_start ;A0=XL, A1=YL, A10=Dir 1-8
addi [20,0],a1 ;Offset
move a0,a8
move a1,a9
move a0,a2
move a1,a3
srl 16,a2
srl 16,a3
movi 1000,a4 ;Dist
subk 1,a10 ;0-7
srl 2,a10 ;0-1
jrnc sb30
jrz sb20
neg a4
sb20 add a4,a2 ;+X
jruc sb50
sb30 jrnz sb40
neg a4
sb40 add a4,a3 ;+Y
sb50 move a2,*a13(sbseekx) ;Seek straight onto screen
move a3,*a13(sbseeky)
movk 6,a2
move a2,*a13(sbseekt) ;# Hops
move a2,*a13(sbseekr) ;Random on
movk 20,a0
callr rndrng0
move a0,*a13(sbhatch) ;Already hatched
movi SKIPR,a2
calla GET_WVADDR
; move *a0(32),a1 ;Get difficulty level
; move a1,*a13(LEVEL)
move *a0(16),a1 ;Dec wave ram cnt
subk 1,a1
move a1,*a0(16)
jrgt sb70
movk 1,a1
move a1,@SKIPR_DN
sb70
SUBRP spidbaby ;A8=XL, A9=YL
move a8,a0
move a9,a1
movi SPYDEREGG1,a2
movi 72,a3 ;Z
movi DMAWNZ,a4
movi CLSNEUT+TYPICON+SUBSEGG,a5
clr a6
clr a7
calla BEGINOBJ2
SUBRP spidbaby2
clr a0
move a0,*a13(sbsobj_p),L
move a0,*a13(ABSRB)
move a0,*a13(sbhit)
move *a8(OXPOS),a1
move a1,*a13(sbx) ;Save XY
move *a8(OYPOS),a1
move a1,*a13(sby)
move *a13(sbhatch),a11
sb100 SLEEPK 1
cmpi 120,a11
jrgt sb120
movk 3,a0
callr rnd
jrnz sb120
movk 2,a0
callr rndrng0
subk 1,a0 ;-1 to 1
move *a13(sbx),a1
add a0,a1
move a1,*a8(OXPOS)
movk 2,a0
callr rndrng0
subk 1,a0 ;-1 to 1
move *a13(sby),a1
add a0,a1
move a1,*a8(OYPOS)
sb120 subk 1,a11
jrgt sb100
move a8,a0
callr GANIOFQ
move *a8(OXPOS),a1
add a6,a1
move a1,*a13(sbx) ;Save XY
move *a8(OYPOS),a1
add a7,a1
move a1,*a13(sby)
movi spidbh_l,a9 ;>Hatch baby
JSRP FRANIMQ
movi CLSENMY+TYPSL,a5
move a5,*a8(OID)
movk 7,a0
callr rnd
addk 5,a0
sll 9,a0 ;*>200
move a0,*a13(sbdis)
movi spidb_l,a10
move a10,*a13(sbobjt_p),L
move @SKIPR_CNT,a0
addk 1,a0
move a0,@SKIPR_CNT
sb150 SLEEPK 1
move *a13(sbseekt),a0
jrz sb160
move *a13(sbseekx),a6
move *a13(sbseeky),a7
subk 1,a0
move a0,*a13(sbseekt)
jruc sb230
sb160 move *a13(sbseekr),a0
jrz sb190
clr a0 ;>Go random after straight
move a0,*a13(sbseekr) ;Off
movk 1,a0
callr rnd
addk 1,a0
move a0,*a13(sbseekt) ;# Hops 1-2
move *a13(sbx),a6
move *a13(sbseekx),a2
sub a6,a2
sra 5,a2 ;Clr 5 LBits
sll 5,a2
jrz sb170
movk 7,a0
callr rnd
neg a0
sra a0,a2 ;Scale down X
add a2,a6
jruc sb172
sb170 movi 80,a2
movi >ff,a0
callr rnd
subi >7f,a0
jrnn sb171
neg a2
sb171 add a2,a0
add a0,a6 ;X+/-(80 to 208)
sb172 move *a13(sby),a7
move *a13(sbseeky),a2
sub a7,a2
sra 5,a2
sll 5,a2
jrz sb180
movk 7,a0
callr rnd
neg a0
sra a0,a2 ;Scale down Y
add a2,a7
jruc sb185
sb180 movi 60,a2
movi >7f,a0
callr rnd
subi >3f,a0
jrnn sb182
neg a2
sb182 add a2,a0
add a0,a7 ;Y+/-(60 to 124)
sb185 move a6,*a13(sbseekx)
move a7,*a13(sbseeky)
jruc sb230
sb190 calla getcloseplyr ;>Go for player
jrz sb150
move *a0(OXPOS),a6
addk 10,a6
move *a0(OYPOS),a7
addk 16,a7
movk >f,a0
callr rnd
subk 7,a0
add a0,a6 ;X offset -7 to 8
movk >f,a0
callr rnd
subk 7,a0
add a0,a7 ;Y^
sb230 move *a13(sbx),a0 ;Get XY
move *a13(sby),a1
sll 16,a0
sll 16,a1
sll 16,a6
sll 16,a7
sub a0,a6 ;DestX-SrcX
sub a1,a7 ;DestY-SrcY
move *a13(sbdis),a11
sll 4,a11 ;*16
move *a13(sbhit),a2 ;Hit?
jrz sb240
srl 2,a11 ;1/4 jump
sb240 sra 1,a6 ;>Scale down to A11
sra 1,a7
move a6,a2
abs a2
cmp a11,a2 ;A6&A7 < A11
jrgt sb240
move a7,a2
abs a2
cmp a11,a2
jrgt sb240
move a7,a2
sra 2,a2
sub a2,a7 ;YV*.75
move *a13(sbobjt_p),a10,L ;Get start of table
move *a10+,a9,L ;Get *FRANIM list
jrz sb250
mmtm a12,a0,a1,a6,a7 ;Save XY&Vel
JSRP FRANIMQ ;Jump sequence
mmfm a12,a0,a1,a6,a7
sb250
movi ARACSHAD,a2
movi 75,a3 ;Z
movi DMAWNZ+M_NOCOLL,a4 ;No collisions
movi CLSDEAD,a5
move a8,a9
calla BEGINOBJ2 ;Get shadow obj
move a8,*a13(sbsobj_p),L
move a9,a8
movk 1,a0
move a0,*a13(sbvhitsl) ;Can take 1 vel hits
move a10,a9
clr a0
move a0,*a13(sbpos)
jruc sb400
sb300 move *a8(OFLAGS),a4
calla ANI ;New frame
move *a9+,a10 ;Get #ticks for frame
sb350 move *a13(sbsobj_p),a5,L
move *a13(sbvhitsl),a0 ;Hits left?
jrnz sb365
move *a5(OXPOS),a2 ;>Chk if close to screen edge
move @WORLDTLX+16,a1
sub a1,a2
subk 10,a2 ;Offset
jrlo sb360
cmpi 300,a2 ;Width
jrhi sb360
move *a5(OYPOS),a2
move @WORLDTLY+16,a1
sub a1,a2
subi 50,a2 ;Offset
jrlo sb360
cmpi 195,a2 ;Hgt
jrls sb365
sb360 clr a1
move a1,*a5(OXVEL),L
move a1,*a5(OYVEL),L
sb365 move a5,a0
callr GANIOFQ
move *a13(sbpos),a0 ;New height
addk 2,a0
cmpi 82,a0 ;Max table range
jrlo sb370
clr a0
sb370 move a0,*a13(sbpos)
callr sine_get
srl 8,a0 ;/256
move *a5(OYPOS),a2
sub a0,a2
addi SPDBZ,a0
move a0,*a8(OZPOS)
move a8,a0
move *a5(OXPOS),a3
add a6,a3 ;Add Anim pt
add a7,a2
sll 16,a2
sll 16,a3
move *a8(OFLAGS),a4
calla GANISAG
SLEEPK 1
dsj a10,sb350
sb400 move *a9+,a1,L ;Get *Img
jrnz sb300
sb600 move *a13(sbsobj_p),a0,L ;Kill shadow
callr GANIOFQ
move *a0(OXPOS),a1
add a6,a1
move a1,*a13(sbx) ;Save XY
move *a0(OYPOS),a1
add a7,a1
move a1,*a13(sby)
calla DELOBJ
clr a0
move a0,*a13(sbsobj_p),L
move a0,*a13(sbhit) ;Clr hit
move *a9+,a9,L ;Get *FRANIM list
jrz sb880
JSRP FRANIMQ ;Land
sb880
; calla SCRTST
; jreq sb150
jruc sb150 ;DEBUG
; jauc DELOBJDIE
spidbh_l
LW HATCH1,6
LW HATCH2,6
LW HATCH3,6
LW HATCH4,6
LWL0 SPYDERB1,1
spidb_l
.long spidbj_l
LWL0 SPYDERB3,41
.long spidbl_l
spidbj_l
LW SPYDERB1,4
LW SPYDERB2,4
LWL0 SPYDERB1,4
spidbl_l
LWL0 SPYDERB1,1
NOTINUSE
skipper_l
.long 0
LW SKIP1,4
LW SKIP2,4
LW SKIP3,4
LW SKIP4,4
LW SKIP5,4
LW SKIP1,4
LW SKIP2,4
LW SKIP3,4
LW SKIP4,4
LWL0 SKIP5,5
.long skipperl_l
LW SKIP1,1
LW SKIP2,1
LW SKIP3,1
LW SKIP4,1
LWL0 SKIP5,1
.endif
********************************
* Launch small neutron bomb
SUBR SPAWN_SNEUT
move @HALT,a0
jrnz spret
movi 700,a0
calla RANDPER
jrnc spret
move @WORLDTLX+16,a8
movi 300,a0
callr rndrng0
addi 50,a0
add a0,a8
move @WORLDTLY+16,a9
movi 180,a0
callr rndrng0
addi 70,a0
add a0,a9
CREATE NEUTPID,bomb_smneutron
spret rets
********************************
* Launch lots of small neutron bombs
SUBR SPAWN_SNEUT2
move @HALT,a0
jrnz spret
movi 190,a0 ;150
calla RANDPER
jrc spret
MOVE @LOTS_FLAG,A0
JRNZ SN100
;TURN ON COLOR CYCLE
MOVK 1,A0
MOVE A0,@LOTS_FLAG
;THIS FLAG WILL STOP THE WHOOPS PROC AND THE COLOR CYCLE PROC FROM STARTING!
CREATE NEUTPID,BMB_CYCS
SN100
move @WORLDTLX+16,a8
movi 300,a0
callr rndrng0
addi 50,a0
add a0,a8
move @WORLDTLY+16,a9
movi 180,a0
callr rndrng0
addi 70,a0
add a0,a9
CREATE NEUTPID,bomb_smneutron2
rets
BMB_CYCS
;START 1 OVERALL COLOR CYCLER FOR ALL BOMBS
movi NEUTRONP,a8 ;>Cycle red zone
movi bombnpalmem1,a9 ;*ram
movi [17,22],a10
movk 6,a11 ;Rate
CREATE CYCPID,COLCYC ;>Cycle green/blue lights
MOVE A0,*A13(PDATA),L
movi bombnpalmem2,a9
movi [22,25],a10
movk 5,a11
CREATE CYCPID,COLCYC
MOVE A0,*A13(PDATA+32),L
BMB100 SLEEP 120
MOVE @LOTS_FLAG,A0
JRNZ BMB100
;WAVE OF BOMBS OVER!
MOVE *A13(PDATA),A0,L
CALLA KILL
MOVE *A13(PDATA+32),A0,L
CALLA KILL
DIE
********************************
* Neutron bomb data
APTRPD bnsobj_p,0 ;*Bomb shadow object
WORDPD bnpos ,2 ;Bomb pos in arc
APTRPD bncyc1_p,3 ;*Bomb cycle process 1
APTRPD bncyc2_p,5 ;^2
WORDPD bnx ,7 ;X pos
WORDPD bny ,8 ;Y pos
APTRPD keepwhp ,9 ;*Whoop snd proc
BOMBNZ .equ 75
********************************
* Lots of Small neutron bomb (Process)
SUBR bomb_smneutron2 ;A8=X dest, A9=Y dest
movi SNEUT2,a2
JRUC BMB001
********************************
* Small neutron bomb (Process)
SUBR bomb_smneutron ;A8=X dest, A9=Y dest
movi SNEUT,a2
BMB001 clr a0
move a0,*a13(keepwhp),L ;Zero whoop sound proc
move a0,*a13(bncyc1_p),L
move a0,*a13(bncyc2_p),L
calla GET_WVADDR
move *a0(16),a1 ;Dec wave ram cnt for this sneut
dec a1
move a1,*a0(16)
jrnz bsn60
MOVE A1,@LOTS_FLAG ;TABLE RAN OUT OF NEUTRONS TO RELEASE
bsn60 move a8,a6
move a9,a7
move @WORLDTLX+16,a0
addi 200,a0
movi 400,a2
cmp a0,a8
jrgt bsn70
neg a2
bsn70 sub a2,a0
move @WORLDTLY+16,a1
addi 128,a1
sll 16,a0
sll 16,a1
sll 16,a6
sll 16,a7
sub a0,a6 ;DestX-SrcX
sub a1,a7 ;DestY-SrcY
move a6,a11
abs a11
srl 6,a11 ;/64
move a11,a3
srl 3,a3
sub a3,a11 ;Sub .125 = /73
bsn200 sra 1,a6 ;>Scale down to A11
sra 1,a7
move a6,a2
abs a2
cmp a11,a2 ;A6&A7 < A11
jrgt bsn200
move a7,a2
abs a2
cmp a11,a2
jrgt bsn200
movi SMNEUTB,a2
movi BOMBNZ,a3
movi DMAWNZ+M_NOCOLL,a4
movi CLSNEUT+TYPICON+SUBBOMBSN,a5
PUSH a0,a1,a6,a7
clr a6
clr a7
calla BEGINOBJ2
PULL a0,a1,a6,a7
movi SMNEUTSHAD,a2
subk 1,a3
; movi DMACNZ+M_NOCOLL,a4
; movi CLSDEAD,a5 ;SHADOW ID TO KILL
movi CLSNEUT+TYPICON+SUBBOMBSN,a5
PUSH a8
calla BEGINOBJ2 ;Get shadow obj
move a8,*a13(bnsobj_p),L
MOVE @LOTS_FLAG,A0
JRNZ BC100
callr bombn_cycon
BC100
PULL a8
movi -4,a11
bsn300 movi bombsn_l,a9
clr a0
move a0,*a13(bnpos)
jruc bsn400
bsn330 move *a8(OFLAGS),a4
calla ANI ;New frame
move *a9+,a10 ;Get #ticks for frame
bsn350 move *a13(bnsobj_p),a5,L
move a5,a0
callr GANIOFQ
move *a13(bnpos),a0 ;New height
addk 1,a0
cmpi 82,a0 ;Max table range
jrlo bsn370
clr a0
bsn370 move a0,*a13(bnpos)
callr sine_get
srl a11,a0 ;Divide it (2s comp)
move a0,a1
move *a5(OYPOS),a2
sub a0,a2
addi BOMBNZ+80,a0
move a0,*a8(OZPOS)
move a8,a0
move *a5(OXPOS),a3
add a6,a3 ;Add Anim pt
add a7,a2
; subk 8,a2 ;Fix Y
; subk 6,a3 ;Fix X
sll 16,a2
sll 16,a3
movi DMAWNZ+M_NOCOLL,a4
subk 8,a1
jrgt bsn380
subi M_NOCOLL,a4
bsn380 calla GANISAG
bsn385 SLEEPK 1
move @HALT,a0
jrnz bsn385
dsj a10,bsn350
bsn400 move *a9+,a1,L ;Get *Img
jrnz bsn330
movi BNCSND,a0
calla ONESND
move *a13(bnsobj_p),a9,L ;Vel /2
move *a9(OXVEL),a1,L
sra 2,a1
move a1,*a9(OXVEL),L
move *a9(OYVEL),a1,L
sra 2,a1
move a1,*a9(OYVEL),L
subk 2,a11 ;Increase divisor
cmpi -10,a11 ;Min
jrgt bsn300
clr a1
move a1,*a9(OXVEL),L
move a1,*a9(OYVEL),L
move *a8(OXPOS),a1 ;>Save pos
move a1,*a13(bnx)
move *a8(OYPOS),a1
move a1,*a13(bny)
move @LOTS_FLAG,a0
jrnz bsn490
move a13,a11
CREATE FUTUREPID,whoops
move a0,*a13(keepwhp),L ;keep for killing later
bsn490 movi 180,a11
move @STATUS,a0
subk 3,a0
jreq bsn500
movi 220,a11 ;Easier for 1 player!
bsn500 SLEEPK 1
cmpi 90,a11
jrgt bsn530
movk 4,a0
callr rndrng0
subk 2,a0 ;-2 to 2
move *a13(bnx),a1
add a0,a1
move a1,*a8(OXPOS)
addk 3,a1
move a1,*a9(OXPOS)
movk 4,a0
callr rndrng0
subk 2,a0 ;-2 to 2
move *a13(bny),a1
add a0,a1
move a1,*a8(OYPOS)
addk 9,a1
move a1,*a9(OYPOS)
bsn530 move @STATUS,a0
jrz bsn540
calla SCRTST
jrz bsn550
bsn540 calla DELOBJA8
callr bombn_cleanup
jruc bsn900
bsn550 subk 1,a11
jrgt bsn500
MOVE @PLYRPRCS,A0,L
JRZ TAG01
MOVE *A0(DELYDET),A0
JRZ TAG02 ;BR=YES SOMEONE TO KILL
TAG01 MOVE @PLYRPRCS+32,A0,L
JRZ bsn555 ;NO ONE WOULD DIE ANYWAY! DON'T BLOW
MOVE *A0(DELYDET),A0
JRZ TAG02
bsn555
movi DISSND,a0 ;DO DISARM SOUND IF NOT BLOWING
calla ONESND
JRUC bsn540
TAG02
movi DMAWNZ+M_NOCOLL,a0 ;>Detonate!
move a0,*a8(OFLAGS)
MOVE @IN_BOMB,A0
JRNZ bsn540 ;in process of exploding!
movk 30,a10
calla SHAKER
CREATE0 SBSND
move @PLYROBJS+32,a2,L
move @PLYROBJS,a9,L
jrz bsn750
move a2,a2
jrz bsn760
movk 1,a0 ;>Give random player the smartbomb pts
callr rnd
jrz bsn760
bsn750 move a2,a9
bsn760 CREATE0 SBOMB
movi LORDPID,a0
movi -1,a1
calla EXISTP
jrz bsn770
movi 200,a1
move a1,*a0(PTIME) ;No enemies for 120 ticks
bsn770
CREATE0 bombn_2
CLR A0
MOVE A0,*A13(PROCID)
MOVE A0,*A8(OID)
movi RDBOOM,a0 ;Make sure blood pal is allocated
calla GETFPAL
movi CYCPID,a0 ;Delay cyclers
movi 260,a2
calla KOP_1C
movi POWPID,a0 ;Delay cyclers
movi 260,a2
calla KOP_1C
callr bombn_cleanup
move *a8(OYPOS),a0
addk 30,a0
move a0,*a8(OYPOS) ;New pos for explosion
movi XBOOM2,a9 ;>Explode
JSRP FRANIMQ
calla DELOBJA8
SLEEP 90
movi bombnpal_t,a0
movk 1,a1
calla PAL_FMWHT
bsn900 DIE
bombsn_l
LWL0 SMNEUTB,82
********************************
* Warning sound (process)
* A11=*Process that created
whoops movk 25,a10
wp1 SLEEPK 8
movi WARNING,a0
calla ONESND
dsj a10,wp1
move a10,*a11(keepwhp),L ;So cleanup doesn't try to kill
DIE
whoops2 movi 75,a10
whp1 SLEEPK 6
movi WARNING2,a0
calla ONESND
dsj a10,whp1
whp2 SLEEPK 3
movi WARNING2,a0
calla ONESND
jruc whp2
BNCSND .WORD >F865,05,>80D4,0 ;NEUTRON BNC SND
WARNING .WORD >F87E,>8,>80D6,0 ;WARNING WHISTLE
WARNING2 .WORD >F3EE,>5,>80AC,0 ;WARNING WHISTLE FOR BIG BOMB
DISSND .WORD >F3EE,>18,>80B0,0 ;KEY MELODY TYPE SND
BAMSND .WORD >F3EE,>1,>8081,0 ;BOOM
BAMSND2 .WORD >F3EE,>1,>8082,0 ;BOOM2
********************************
* Player touches small neutron bomb
SUBR bombsmn_touch ;A0=*Player obj, A8=*NBomb obj
PUSH a1,a2,a3,a4,a5,a6,a7,a9,a10,a11
movk 1,a3
move a3,@OUT_FLG ;Stop scan
move *a0(OPLINK),a10,L
move *a10(PNUM),a10
movi P1DATA,a2
subk 1,a10
jrz bsnt5 ;P1?
movi P2DATA,a2
bsnt5 move *a2(TWPNS),a0
subk 1,a0
move a0,*a2(TWPNS)
movi DEARM,a1 ;300 pts per disarm
calla SCRADD2
movi DISSND,a0
calla ONESND
PUSH a13
move *a8(OPLINK),a13,L
callr bombn_cleanup
move a13,a9
PULL a13
movi 300,a0
move a0,*a8(OZPOS)
movi DMAWNZ+M_NOCOLL,a0
move a0,*a8(OFLAGS)
CLR A0
MOVE A0,*A8(OID)
MOVE A9,A0
movi FUTUREPID,a1
movi bombsmn_disarm,a7
calla XFERPROC
PULL a1,a2,a3,a4,a5,a6,a7,a9,a10,a11
rets
********************************
*A8=*ICON IMG
*A10=PLYR # 0/1
SUBRP bombsmn_disarm
calla CYCLEON
movi bndis_l,a9
JSRP FRANIMQ
clr a11 ;Not a key
jauc INHERE
bndis_l LWL DISARM,NEWPALET+90,PPLP
.long 0
********************************
* Neutron bomb (Process)
SUBR bomb_neutron ;A8=Dir (0-L,1-R)
move @bombnon,a0
jrnz bn900 ;NBomb already active?
addk 1,a0
move a0,@bombnon
clr a0
move a0,*a13(keepwhp),L ;Zero whoop sound proc
move a0,*a13(bncyc1_p),L
move a0,*a13(bncyc2_p),L
movk 5,a0
callr rndrng0
subi 10,a0
move a0,a6 ;X dest offset
movk 21,a0
callr rndrng0
subk 10,a0
move a0,a7 ;Y dest offset
move @WORLDTLX+16,a0
addi 200,a0
movi 360,a2
btst 0,a8
jrz bn70
neg a2
neg a6
bn70 add a0,a6
sub a2,a0
move @WORLDTLY+16,a1
addi 110,a1
add a1,a7
sll 16,a0
sll 16,a1
sll 16,a6
sll 16,a7
sub a0,a6 ;DestX-SrcX
sub a1,a7 ;DestY-SrcY
move a6,a11
abs a11
srl 6,a11 ;/64
move a11,a3
srl 2,a3
sub a3,a11 ;Sub .25 = /96
bn200 sra 1,a6 ;>Scale down to A11
sra 1,a7
move a6,a2
abs a2
cmp a11,a2 ;A6&A7 < A11
jrgt bn200
move a7,a2
abs a2
cmp a11,a2
jrgt bn200
movi NEUTRONB,a2
movi BOMBNZ,a3
movi DMAWNZ+M_NOCOLL,a4
movi CLSNEUT+TYPTRUNK,a5
PUSH a0,a1,a6,a7
clr a6
clr a7
calla BEGINOBJ2
PULL a0,a1,a6,a7
movi NEUTSHAD,a2
subk 1,a3
; movi DMACNZ+M_NOCOLL,a4
movi CLSDEAD,a5
movi DMAWNZ+M_NOCOLL,a4
PUSH a8
calla BEGINOBJ2 ;Get shadow obj
move a8,*a13(bnsobj_p),L
callr bombn_cycon
PULL a8
CREATE BOMBNPID,bombn_togoid
movi -4,a11
bn300 movi bombn_l,a9
clr a0
move a0,*a13(bnpos)
jruc bn400
bn330 move *a8(OFLAGS),a4
calla ANI ;New frame
move *a9+,a10 ;Get #ticks for frame
bn350 move *a13(bnsobj_p),a5,L
move a5,a0
callr GANIOFQ
move *a13(bnpos),a0 ;New height
addk 1,a0
cmpi 82,a0 ;Max table range
jrlo bn370
clr a0
bn370 move a0,*a13(bnpos)
callr sine_get
srl a11,a0 ;Divide it (2s comp)
move a0,a1
move *a5(OYPOS),a2
sub a0,a2
addi BOMBNZ+80,a0
move a0,*a8(OZPOS)
move a8,a0
move *a5(OXPOS),a3
add a6,a3 ;Add Anim pt
add a7,a2
; subk 8,a2 ;Fix Y
; subk 6,a3 ;Fix X
sll 16,a2
sll 16,a3
movi DMAWNZ+M_NOCOLL,a4
subk 8,a1
jrgt bn380
subi M_NOCOLL,a4
bn380 calla GANISAG
bn385 SLEEPK 1
move @HALT,a0
jrnz bn385
dsj a10,bn350
bn400 move *a9+,a1,L ;Get *Img
jrnz bn330
movi BNCSND,a0
calla ONESND
move *a13(bnsobj_p),a0,L ;Vel /2
move *a0(OXVEL),a1,L
sra 2,a1
move a1,*a0(OXVEL),L
move *a0(OYVEL),a1,L
sra 2,a1
move a1,*a0(OYVEL),L
subk 2,a11 ;Increase divisor
cmpi -10,a11 ;Min
jrgt bn300
clr a1
move a1,*a0(OXVEL),L
move a1,*a0(OYVEL),L
CREATE FUTUREPID,whoops2
move a0,*a13(keepwhp),L ;Keep for killing later
.REF LEAVE
CREATE FUTUREPID,LEAVE
JSRP bombn_cntdn
jrnz bn600 ;Explode?
calla DELOBJA8
callr bombn_cleanup
jruc bn900
bn600 clr a0 ;Smart bomb won't try to affect me
move a0,*a8(OID)
movk 30,a10 ;>Detonate!
calla SHAKER
CREATE0 SBSND
move @PLYROBJS+32,a2,L
move @PLYROBJS,a9,L
jrz bn750
move a2,a2
jrz bn760
movk 1,a0 ;>Give random player the smartbomb pts
callr rnd
jrz bn760
bn750 move a2,a9
bn760 CREATE0 SBOMB
CREATE0 bombn_2
movi RDBOOM,a0 ;Make sure blood pal is allocated
calla GETFPAL
movi CYCPID,a0 ;Delay cyclers
movi 260,a2
calla KOP_1C
movi POWPID,a0 ;Delay cyclers
movi 260,a2
calla KOP_1C
callr bombn_cleanup
move *a8(OYPOS),a0
addk 30,a0
move a0,*a8(OYPOS) ;New pos for explosion
movi XBOOM2,a9 ;>Explode
JSRP FRANIMQ
calla DELOBJA8
SLEEP 125
movi bombnpal_t,a0
movk 1,a1
calla PAL_FMWHT
bn900 DIE
bombn_l
LWL0 NEUTRONB,82
bombnpal_t .long SCOREPAL,0
; .long nup1,nup2,ONUP1,0
********************************
* Start neutbomb color cyclers
SUBRP bombn_cycon
movi NEUTRONP,a8 ;>Cycle red zone
movi bombnpalmem1,a9 ;*ram
movi [17,22],a10
movk 6,a11 ;Rate
CREATE CYCPID,COLCYC ;>Cycle green/blue lights
move a0,*a13(bncyc1_p),L
movi bombnpalmem2,a9
movi [22,25],a10
movk 5,a11
CREATE CYCPID,COLCYC
move a0,*a13(bncyc2_p),L
rets
********************************
* Toggle neutbomb between blade & trunk (Process)
SUBRP bombn_togoid
movi CLSPLYR|TYPHLPR|SUBLAY,a0
move a0,*a8(OID)
SLEEPK 1
movi CLSNEUT+TYPTRUNK,a0
move a0,*a8(OID)
SLEEPK 7
jruc bombn_togoid
********************************
* Neutron bomb counts down
SUBRP bombn_cntdn ;A8=*Bomb obj
move a8,-*a12,L
move *a8(OXPOS),a0
addk 11,a0
move *a8(OYPOS),a1
addk 5,a1
sll 16,a0
sll 16,a1
movi WTIMER0,a2
movi BOMBNZ+80,a3
movi DMAWNZ+M_NOCOLL,a4
movi CLSDEAD,a5
clr a6
clr a7
PUSH a0,a1
calla BEGINOBJ2 ;Get digit 1
move a8,a9
PULL a0,a1
addi >70000,a0 ;Next X
calla BEGINOBJ2 ;Get digit 2
movi digit_t+10*32,a11
move -*a11,a1,L
jruc bnc150
bnc100 move -*a10,a1,L ;Get * next digit 1 img
jrnz bnc200
movk 1,a2
move -*a11,a1,L
jrz bnc800
bnc150 move a8,a6
move a9,a8
move *a8(OFLAGS),a4
calla ANI ;New frame
move a6,a8
movi digit_t+10*32,a10
move -*a10,a1,L
bnc200 move *a8(OFLAGS),a4
calla ANI ;New frame
SLEEPK 6
move @STATUS,a0
jrz bnc400
calla SCRTST
jrz bnc100
bnc400 clr a2
movi DISSND,a0
calla ONESND
bnc800 calla DELOBJA8
move a9,a0
calla DELOBJ
move *a12+,a8,L
clr a0
move a0,@SLOW_DWN
move a2,a0 ;>A0=Explode (!0=Yes)
RETP ;Pass CC
; .long 0
;digit_t .long WTIMER0,WTIMER1,WTIMER2,WTIMER3,WTIMER4
; .long WTIMER5,WTIMER6,WTIMER7,WTIMER8,WTIMER9
********************************
* Neutron blow up stuff
SUBRP bombn_2
movk 1,a0
move a0,@DONT_WARP
CREATE0 warp_delay
CREATE0 bombn_reset
SLEEPK 3
calla CLNPAL
CREATE FUTUREPID,bombn_expsnd
movi bombnpal_t,a0
movk 1,a1
calla PAL_TOWHT
SLEEPK 16
move @PLYRPRCS,a0,L ;>Kill both players
jrz bnp50
move *a0(DELYDET),a1
jrnz bnp50
calla bombn_killp
bnp50 move @PLYRPRCS+32,a0,L
jrz bnp60
move *a0(DELYDET),a1
jrnz bnp60
calla bombn_killp
bnp60 DIE
SUBRP warp_delay
SLEEP 5*60
clr a0
move a0,@DONT_WARP
DIE
SUBRP bombn_reset
MOVK 1,A0
MOVE A0,@IN_BOMB ;YES, WE ARE IN EXPLOSION
SLEEP 2*60
MOVI NEUTPID,A0
CALLA KIL1C
movi CLSNEUT+TYPICON+SUBBOMBSN,a0
CALLA KILOBJN ;KILL SHADOWS ALSO
SLEEP 3*60
CLR A0
MOVE A0,@IN_BOMB
DIE
********************************
* Neutron explosion sound (Process)
SUBRP bombn_expsnd
movk 15,a10
bnes1 movi BAMSND,a9
movk 7,a0
callr rndrng0
addk 3,a0
btst 0,a0
jrz bnes2
movi BAMSND2,a9
bnes2 calla PRCSLP
move a9,a0
calla ONESND
dsj a10,bnes1
DIE
********************************
* Cleanup neutbomb stuff
SUBRP bombn_cleanup
move *a13(sbsobj_p),a0,L ;Kill shadow
;TEST
; MOVE *A0(OIMG),A1,L
; CMPI SMNEUTSHAD,a1
; JRZ BC05
; LOCKUP
; EINT
;BC05
calla DELOBJ
movi BOMBNPID,a0
calla KIL1C
move *a13(bncyc1_p),a0,L
JRZ BC10
calla KILL
BC10 move *a13(bncyc2_p),a0,L
JRZ BC20
calla KILL
BC20 move *a13(keepwhp),a0,L ;Whoop snd proc on yet?
jrz bncu2
calla KILL
bncu2 clr a0
move a0,@bombnon
rets
********************************
* Player grabs spider egg
SUBR spidegg_touch ;A0=*Player obj, A8=*Egg obj
PUSH a1,a2,a3,a4,a5,a6,a7,a9,a10,a11
movk 1,a3
move a3,@OUT_FLG ;Stop scan
move a0,a11 ;Pass to process
move *a0(OPLINK),a10,L
move *a10(PNUM),a10
movi P1DATA,a2
subk 1,a10
jrz set5 ;P1?
movi P2DATA,a2
set5 move *a2(TWPNS),a0
subk 1,a0
move a0,*a2(TWPNS)
movi EGGPT,a1 ;50 pts per egg
calla SCRADD2
move *a8(OPLINK),a9,L
move *a9(sbsobj_p),a0,L ;Kill shadow
jrz set20
calla DELOBJ
set20
movi 300,a0
move a0,*a8(OZPOS)
movi DMAWNZ+M_NOCOLL,a0
move a0,*a8(OFLAGS)
move a9,a0
movi FUTUREPID,a1
movi spidegg_die,a7
calla XFERPROC
PULL a1,a2,a3,a4,a5,a6,a7,a9,a10,a11
rets
SUBRP spidegg_die ;A10=Plyr # 0-1
move @PCNT,a0
sll 32-2,a0
srl 32-2-5,a0
addi sed_l,a0
move *a0,a0,L
calla ONESND
calla CYCLEON
movi eggb_l,a9
JSRP FRANIMQ
clr a11
jauc INHERE ;FLY OFF TO SCOREBOARD
sed_l .long EGG1,EGG2,EGG3,EGG4
EGG1 .word >F395,08,>8092,0
EGG2 .word >F395,08,>8093,0
EGG3 .word >F395,08,>8094,0
EGG4 .word >F395,08,>8095,0
eggb_l LWL EGGBON,NEWPALET+2,PPLP
.long 0
********************************
* Shawn type hit by bullet
SUBR slt_hit ;A0=*Bullet obj, A8=*Shawn type obj
PUSH a1,a2,a3,a4,a5,a6,a7,a9,a10,a11
movk 1,a3
move a3,@OUT_FLG ;Stop scan
move a0,a11 ;A11=*Bullet obj
movb *a8(OID),a2 ;Missile?
cmpi SUBMSL,a2
jrz missile_hit
movi >3f3f0000,a9 ;Flash color
CREATE0 FLASHME
subk SUBSM,a2
jrz spidm_hit
;>Spider
movk 3,a0 ;>Random death 12.5%
callr rnd
jrz slt_hitdie
move a11,a0
movi 100,a3 ;Max absorb
calla DO_PUNISH
jrge slt_hitdie
move *a8(OPLINK),a1,L
movk 1,a0
move a0,*a1(sbhit) ;Set hit
clr a0
move a0,*a1(sbseekr) ;No random
move a0,*a1(sbseekt) ;No straight jump
move *a1(sbsobj_p),a8,L
jrz sh300
move *a1(sbvhitsl),a0 ;Hits left?
jrz sh300
subk 1,a0
move a0,*a1(sbvhitsl)
move *a11(OXVEL),a0,L
move *a11(OYVEL),a1,L
move *a8(OXVEL),a2,L ;Add in bullet XYV
add a0,a2
move a2,*a8(OXVEL),L
move *a8(OYVEL),a2,L
add a1,a2
move a2,*a8(OYVEL),L
movi flingsnd,a0
calla ONESND
sh300 PULL a1,a2,a3,a4,a5,a6,a7,a9,a10,a11
rets
SUBRP missile_hit
move *a8(OPLINK),a1,L
move *a1(PDATA),a0
subk 1,a0
jrle slt_hitdie ;Dead?
move a0,*a1(PDATA)
movi >9090000,a9 ;Flash color
CREATE0 FLASHME
jruc sh300
SUBRP spidm_hit
move a11,a0
movi 450,a3 ;Spid mom absorb
calla DO_PUNISH
jrlt sh300
move @WORLDTLY+16,a0 ;Check for Y low enuff on scrn
move *a8(OYPOS),a1
addi 105,a0
cmp a0,a1
jrlo sh300
;okay to kill mom
********************************
* Shawn type absorbed max hits
SUBRP slt_hitdie ;A8=*Shawn type obj, A11=*Bullet obj
clr a5
move *a11(OPLINK),a10,L
movi P1DATA,a2
move *a10(MYPLYR),a0 ;Player #
subk 1,a0
jrz slt_scoredie
movi P2DATA,a2
jruc slt_scoredie
********************************
* Shawn type hit by Rings, bomb cloud or blade
SUBR slt_ringhit ;A0=*Killer obj, A8=*Shawn type obj
PUSH a1,a2,a3,a4,a5,a6,a7,a9,a10,a11
move *a0(OPLINK),a10,L
clr a5
movb *a8(OID),a2 ;Missile?
subk SUBMSL,a2
jrne srh50
movi missile_shrapexp,a5
srh50 move *a10(PNUM),a0
jruc slbbh
SUBR slt_bbhit ;A0=*Killer obj, A8=*Shawn type obj
PUSH a1,a2,a3,a4,a5,a6,a7,a9,a10,a11
move *a0(OPLINK),a10,L
move *a10(MYPLYR),a0
clr a5
slbbh movk 1,a3
move a3,@OUT_FLG ;Stop scan
movi P1DATA,a2
subk 1,a0
jrz slt_scoredie ;P1?
subk 1,a0
jrnz slt_die ;P2?
movi P2DATA,a2
SUBRP slt_scoredie ;A2=*PxDATA, A5=*Diff expprc or 0, A8=*Shawn type obj
;Must save regs before call!
movb *a8(OID),a1
sll 32-4,a1
srl 32-7,a1 ;*8
addi sltscore_t,a1
movb *a1,a1 ;Get score
calla SCRADD2 ;Score it!
SUBRP slt_die ;A5=^, A8=*Shawn type obj
;Must save regs before call!
move *a8(OPLINK),a9,L ;A9=*OPLINK
movb *a8(OID),a1
sll 32-4,a1
srl 32-9,a1 ;*32
addi sltdie_t,a1
move *a1,a6,L
exgpc a6 ;Do cleanup! Passes A6,A8,A9
;Returns A7
move a5,a5
jrz sltd5
move a5,a7 ;Set new explosion process
sltd5 move a9,a0
movi FUTUREPID,a1
calla XFERPROC
move *a8(OFLAGS),a0
ori M_NOCOLL,a0
move a0,*a8(OFLAGS)
movi CLSDEAD,a0
move a0,*a8(OID)
PULL a1,a2,a3,a4,a5,a6,a7,a9,a10,a11
rets
sltscore_t
.byte SPDBPTS,SPDMPTS,1,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0
sltdie_t
.long spidb_die,spidm_die,missile_die,0
.long 0,0,0,0
.long 0,0,0,0
.long 0,0,0,0
SUBRP spidb_die
move @SKIPR_CNT,a0
subk 1,a0
move a0,@SKIPR_CNT
move *a9(sbsobj_p),a0,L
jrz sbdx
calla DELOBJ
sbdx movi spidb_exp,a7
exgpc a6
SUBRP spidm_die
movi spidm_exp,a7
exgpc a6
SUBRP missile_die
movi missile_exp,a7
exgpc a6
********************************
* Explosion code
SUBRP missile_shrapexp
CREATE0 missile_shrapoff
movk 10,a1
move a1,*a0(PTIME)
clr a0
move a0,*a8(OXVEL),L
move a0,*a8(OYVEL),L
movi DMAWNZ,a4
move a4,*a8(OFLAGS)
movi CLSENMY|TYPLAYR|SUBFLM,a5 ;Flames plyr
move a5,*a8(OID)
movi SHRAPPID,a0 ;So smartbomb will kill proc
move a0,*a13(PROCID)
movi xpldp_l,a9
jruc me50
SUBRP missile_shrapoff
movi DMAWNZ+M_NOCOLL,a0
move a0,*a8(OFLAGS)
DIE
SUBRP missile_exp
movi cldbyell_l,a9
me50 movi mslexpsnd,a0
calla ONESND
move *a8(OYPOS),a0
addk 25,a0
move a0,*a8(OYPOS)
movi 168,a0
move a0,*a8(OZPOS)
jauc FRQDELDIE
xpldp_l LWL XPLD1,NEWPALET|4,PURPPAL
LW XPLD2,4
LW XPLD3,4
LW XPLD4,4
LW XPLD5,4
LW XPLD6,4
LW XPLD7,3
LW XPLD8,3
LW XPLD9,3
LWL0 XPLD10,3
cldbyell_l
LWL CLDB1,NEWPALET|2,YELLPAL
LW CLDB2,3
LW CLDB3,3
LW CLDB4,3
LW CLD5,3
LW CLD6,3
LW CLD7,3
LW CLD8,3
LW CLD9,3
LW CLD10,2
LWL0 CLD11,2
SUBRP spidm_exp
SLEEPK 2 ;Makes sure FLASHME is gone!
movi GLSEXP,a0
calla ONESND
movk 7,a0 ;Shoot 7-14 eggs
callr rnd
addk 7,a0
move a0,a4
sme20 movi >3ff,a0
callr rnd
move a0,a10
addi 60,a10
CREATE shawnpid,spidb_shootegg
dsj a4,sme20
move @PCTOT,a0
subk 20,a0
jrgt sme200
clr a9 ;A9=XVel
movi >10000,a10 ;A10=YVel
movi spidmomch_t,a11
CREATE CMAN,CHUNK_OBJ
move a9,*a0(PDATA) ;no pal change
SLEEPK 2
movi AGLSEXP,a0
calla ONESND
movi crashsnd,a0
calla ONESND
jauc DELOBJDIE
sme200 movi BLUEEXP,a9
jauc FRQDELDIE
spidmomch_t
.long SCHUNK1,spidcnk1_l,spidcnk2_l,spidcnk3_l,spidcnk4_l
.long spideggp1_l,spideggp2_l,spideggp3_l,spideggp4_l
.long BLUEEXP,BLUEEXP,BLUEEXP,FIREEXP,FIREEXP,FIREEXP,0
spidcnk1_l
LW SCHUNK6,7
spidcnk2_l
LW SCHUNK6,7
spidcnk3_l
LW SCHUNK6,7
spidcnk4_l
LW SCHUNK6,1
LW SCHUNK5,4
LW SCHUNK4,4
LW SCHUNK3,4
LW SCHUNK2,5
LW SCHUNK1,5
LWW SCHUNK2,FLIPBITS|4,M_FLIPH
LW SCHUNK3,4
LW SCHUNK4,4
LW SCHUNK5,4
LWL0 SCHUNK6,4
spideggp1_l
LW SEGG6,8
spideggp2_l
LW SEGG6,8
spideggp3_l
LW SEGG6,7
spideggp4_l
LW SEGG6,4
LW SEGG5,4
LW SEGG4,4
LW SEGG3,4
LW SEGG2,5
LW SEGG1,4
LWW SEGG2,FLIPBITS|4,M_FLIPH
LW SEGG3,5
LW SEGG4,4
LW SEGG5,4
LWL0 SEGG6,4
NOTINUSE
spidleg_l
LW SLEG7,2
LW SLEG6,2
LW SLEG5,2
LW SLEG4,2
LW SLEG3,2
LW SLEG2,2
LW SLEG1,2
LW SLEG2,FLIPBITS|5
.word M_FLIPH
LW SLEG3,2
LW SLEG4,2
LW SLEG5,2
LW SLEG6,2
LWL0 SLEG7,2
.endif
SUBRP spidb_exp
movi ALTEXP1,a0
move @PCNT,a1
btst 0,a1
jrz sbe10
movi SQUISH,a0 ;EXP1L,A0
sbe10 calla ONESND
SLEEPK 2 ;Makes sure FLASHME is gone!
movi spidbexp_l,a9
jauc FRQDELDIE
spidbexp_l
LW SDEATH1,4
LW SDEATH2,4
LW SDEATH3,5
LW SDEATH4,5
LW SDEATH5,5
LWL0 SDEATH6,4
********************************
* Smart bomb shawn type objects
SUBR slt_smartbomb ;A8=*Shawn type obj to smart bomb
;A9=*P1DATA or P2DATA for score update
PUSH a1,a2,a3,a4,a5,a6,a7,a9,a10,a11
clr a0
move a0,*a8(OXVEL),L
move a0,*a8(OYVEL),L
move a9,a2
movi slt_smrtbexp,a5 ;Overide explosions
jruc slt_scoredie
SUBRP slt_smrtbexp
move *a8(OYPOS),a0
addi 35,a0
move a0,*a8(OYPOS)
movi 300,a0
move a0,*a8(OZPOS)
move @EXPCNT,a0 ;# explosions
cmpi 23,a0 ;Max
jrhs ssbe5
addk 1,a0
move a0,@EXPCNT
movi XBOOM2,a9
jauc FRQDELDIE
ssbe5 jauc DELOBJDIE
********************************
* Missile tank (Process)
SUBRP msltnk
callr obj_get
mst100 movi >ff,a0
callr rnd
; movk 7,a0 ;DEBUG
calla PRCSLP
movk 5,a11 ;#Shots in pattern
clr a10
mst200
movi mtmpat_t,a9
CREATE shawnpid,rocket_fire
addk 32,a9
addk 1,a10
; SLEEPK 1
dsj a11,mst200
jruc mst100
DIE
mtmpat_t ;Missiles!
.word 10,10, 0,0, 20,0, 0,20, 20,20
********************************
* Missile strike from off screen (Process)
SUBRP mslstrike
DIE
mss100 movi >ff,a0
callr rnd
calla PRCSLP
movk 20,a11 ;#Shots in pattern
clr a2
move @WORLDTLY+16,a9
mss200
move @WORLDTLX+16,a8
add a2,a8
movk 16,a10
CREATE shawnpid,rocket_firexy
move @WORLDTLX+16,a8
addi 400,a8
sub a2,a8
movk 16,a10
CREATE shawnpid,rocket_firexy
addk 20,a2
move a2,a8
SLEEPK 3
move a8,a2
dsj a11,mss200
jruc mss100
DIE
********************************
* Missile, player seeking (Process)
WORDPD missfuel,0 ;Fuel 0-?
SUBRP missile_fire ;A8=*Src obj, A9=*Offset_t, A10=Dir 0-31
movi 200,a0
move a0,*a13(missfuel)
move *a8(OXPOS),a0
move *a8(OYPOS),a1
move *a9+,a2 ;+X offset
add a2,a0
move *a9+,a2 ;+Y offset
add a2,a1
sll 16,a0
sll 16,a1
movi MSL1,a2 ;Image
move *a8(OZPOS),a3
addk 1,a3
movi DMAWNZ,a4
movi CLSENMY+TYPSL+SUBMSL,a5
clr a6
clr a7
calla BEGINOBJ2
jruc mif300
mif200 SLEEPK 1
calla getcloseplyr
jrz mif700
callr seekob_dir32
sub a10,a0 ;A0=Difference
jreq mif500
move a0,a1
abs a0
subk 16,a0
jrle mif250
neg a1
mif250 move a1,a1
jrnn mif260
subk 2,a10 ;-1
mif260 addk 1,a10 ;+1
mif300 ANDK >1f,a10 ;Make 0-31
move a10,a0 ;>New image
sll 4,a0 ;*16
move a0,a1 ;*3
add a1,a0
add a1,a0
addi missileimg_t,a0
move *a0+,a1,L
move *a0,a4
calla ANI ;New frame
mif500 move a10,a0
sll 4,a0 ;*16
addi missilev_t,a0
move *a0(8*16),a6 ;XV
move *a0,a7 ;YV
move *a8(OXVEL),a0,L
move a0,a1
sra 7,a1
sub a1,a0 ;-Drag
add a6,a0 ;+Vel
move a0,*a8(OXVEL),L
move *a8(OYVEL),a0,L
move a0,a1
sra 7,a1
sub a1,a0 ;-Drag
add a7,a0 ;+Vel
move a0,*a8(OYVEL),L
mif700 move *a13(missfuel),a0
subk 1,a0
move a0,*a13(missfuel)
jrgt mif200
movi BOOM3,a9 ;Out of fuel!
jauc FRQDELDIE
missileimg_t
LW MSL9,DMAWNZ
LW MSL8,DMAWNZ+M_FLIPH
LW MSL7,DMAWNZ+M_FLIPH
LW MSL6,DMAWNZ+M_FLIPH
LW MSL5,DMAWNZ+M_FLIPH
LW MSL4,DMAWNZ+M_FLIPH
LW MSL3,DMAWNZ+M_FLIPH
LW MSL2,DMAWNZ+M_FLIPH
LW MSL1,DMAWNZ+M_FLIPH
LW MSL2,DMAWNZ+M_FLIPV+M_FLIPH
LW MSL3,DMAWNZ+M_FLIPV+M_FLIPH
LW MSL4,DMAWNZ+M_FLIPV+M_FLIPH
LW MSL5,DMAWNZ+M_FLIPV+M_FLIPH
LW MSL6,DMAWNZ+M_FLIPV+M_FLIPH
LW MSL7,DMAWNZ+M_FLIPV+M_FLIPH
LW MSL8,DMAWNZ+M_FLIPV+M_FLIPH
LW MSL9,DMAWNZ+M_FLIPV
LW MSL8,DMAWNZ+M_FLIPV
LW MSL7,DMAWNZ+M_FLIPV
LW MSL6,DMAWNZ+M_FLIPV
LW MSL5,DMAWNZ+M_FLIPV
LW MSL4,DMAWNZ+M_FLIPV
LW MSL3,DMAWNZ+M_FLIPV
LW MSL2,DMAWNZ+M_FLIPV
LW MSL1,DMAWNZ
LW MSL2,DMAWNZ
LW MSL3,DMAWNZ
LW MSL4,DMAWNZ
LW MSL5,DMAWNZ
LW MSL6,DMAWNZ
LW MSL7,DMAWNZ
LW MSL8,DMAWNZ
missilev_t
.word -4000,-3923,-3696,-3326,-2828,-2222,-1531,-780 ;Y
.word 0,780,1530,2222,2828,3326,3695,3923 ;X
.word 4000,3923,3695,3326,2828,2222,1530,780
.word 0,-780,-1530,-2222,-2828,-3326,-3695,-3923
.word -4000,-3923,-3696,-3326,-2828,-2222,-1531,-780
********************************
* Rocket, arcs toward player (Process)
WORDPD rockfuel,0 ;Fuel 0-?
SUBRP rocket_firexy ;A8.W=XPos, A9.W=YPos, A10=Dir 0-31
move a8,a0
move a9,a1
movi 160,a3
movk 1,a11
jruc rof100
SUBRP rocket_fire ;A8=*Src obj, A9=*Offset_t, A10=Dir 0-31
clr a11
move *a8(OXPOS),a0
move *a8(OYPOS),a1
move *a9+,a2 ;+X offset
add a2,a0
move *a9+,a2 ;+Y offset
add a2,a1
move *a8(OZPOS),a3
addk 1,a3
rof100 sll 16,a0
sll 16,a1
movi MSL1,a2 ;Image
movi DMAWNZ,a4
movi CLSENMY+TYPSL+SUBMSL,a5
clr a6
clr a7
calla BEGINOBJ2
movi 100,a0
move a0,*a13(rockfuel)
jruc rof300
rof200 SLEEPK 1
move a11,a11
jrnz rof500
move *a13(rockfuel),a0
cmpi 90,a0
jrlt rof500
calla getcloseplyr
jrz rof700
callr seekob_dir32
sub a10,a0 ;A0=Difference
jreq rof500
move a0,a1
abs a0
subk 16,a0
jrle rof250
neg a1
rof250 move a1,a1
jrnn rof260
subk 2,a10 ;-1
rof260 addk 1,a10 ;+1
rof300 ANDK >1f,a10 ;Make 0-31
move a10,a0
sll 4,a0 ;*16
move a0,a1 ;*3
add a1,a0
add a1,a0
addi missileimg_t,a0
move *a0+,a1,L
move *a0,a4
calla ANI ;New frame
rof500 move a10,a0
sll 4,a0 ;*16
addi missilev_t,a0
move *a0(8*16),a6 ;XV
move *a0,a7 ;YV
sll 1,a6
sll 1,a7
move *a8(OXVEL),a0,L
move a0,a1
sra 7,a1
sub a1,a0 ;-Drag
add a6,a0 ;+Vel
move a0,*a8(OXVEL),L
move *a8(OYVEL),a0,L
move a0,a1
sra 7,a1
sub a1,a0 ;-Drag
add a7,a0 ;+Vel
move a0,*a8(OYVEL),L
rof700 move *a13(rockfuel),a0
subk 1,a0
move a0,*a13(rockfuel)
jrgt rof200
movi BOOM3,a9 ;Out of fuel!
jauc FRQDELDIE
********************************
* Get an object
SUBRP obj_get ;A8=*Data
move *a8+,a0 ;Get X
move *a8+,a1 ;Get Y
sll 16,a0
sll 16,a1
move *a8+,a3 ;Get Z
move *a8+,a4 ;Flags
move *a8+,a5 ;ID
move *a8+,a2,L ;*Img
clr a6
clr a7
calla BEGINOBJ
rets ;>A8=*Object
********************************
* Get random # with mask
* Preserves Regs 2-13
SUBRP rnd ;A0=Mask, A1/B0=Trashed!
move @RAND,a1,L
rl a1,a1
move @HCOUNT,a14
rl a14,a1
add sp,a1
move a1,@RAND,L
and a1,a0 ;A0=Rnd #
rets ;Pass CC
********************************
* Quickly produce a random # in range 0-X
* A0=X
* Preserves Regs 2-13
* >A0 = RANDOM # (0 to A0)
SUBRP rndrng0 ;A0=X
move @RAND,a1,L
rl a1,a1
move @HCOUNT,a14
rl a14,a1
add sp,a1
move a1,@RAND,L
addk 1,a0
mpyu a1,a0 ;Condition codes not valid!
rets
********************************
* Test random # function for randomness
NOTINUSE
.bss test,16*256
SUBR test_rnd
tr10 clr a0
movi test,a1
movi 256/2,a2
tr20 move a0,*a1+,L
dsj a2,tr20
movi test,a3
tr50 clr a0
movi 7,a1
calla RNDRNG
sll 4,a0 ;*16
add a3,a0
move *a0,a1
addk 1,a1
jrz trx
move a1,*a0
jruc tr50
trx jrz trx
jruc tr10
rets
.endif
********************************
* Get velocity to move towards an object
SUBRP seekob_vel ;A0=*Dest obj, A3=Vel, A8=*Src obj
PUSH a0
move *a0(OXPOS),a6 ;Get X
move *a0(OSIZEX),a2
srl 1,a2
add a2,a6 ;Center X
move *a0(OYPOS),a7 ;Get Y
move *a0(OSIZEY),a2
srl 1,a2
add a2,a7 ;Center Y
sll 16,a6
sll 16,a7
move *a8(OXPOS),a0 ;Get X
move *a8(OSIZEX),a2
srl 1,a2
add a2,a0 ;Center X
move *a8(OYPOS),a1 ;Get Y
move *a8(OSIZEY),a2
srl 1,a2
add a2,a1 ;Center Y
sll 16,a0
sll 16,a1
sub a0,a6 ;DestX-SrcX
sub a1,a7 ;DestY-SrcY
sov60 sra 1,a6 ;>Scale down to A3
sra 1,a7
move a6,a2
abs a2
cmp a3,a2 ;A6&A7 < A3
jrgt sov60
move a7,a2
abs a2
cmp a3,a2
jrgt sov60
move a6,a4 ;>Fine scale up to A3
move a7,a5
sra 4,a4 ;/16
sra 4,a5
jrnz sov150
move a4,a4
jrz sov200 ;Both 0 then skip
sov150 add a4,a6
add a5,a7
move a6,a2
abs a2
cmp a3,a2
jrgt sov200
move a7,a2
abs a2
cmp a3,a2
jrle sov150
sov200
PULL a0
rets ;>A6=XV, A7=YV
********************************
* Get dir to face an object
SUBRP seekob_dir32 ;A0=*Dest obj, A8=*Src obj
move *a0(OXPOS),a6 ;Get DX
move *a0(OSIZEX),a2
srl 1,a2
add a2,a6 ;Center X
move *a0(OYPOS),a7 ;Get DY
move *a0(OSIZEY),a2
srl 1,a2
add a2,a7 ;Center Y
move *a8(OXPOS),a0 ;Get SX
move *a8(OSIZEX),a2
srl 1,a2
add a2,a0 ;Center X
move *a8(OYPOS),a1 ;Get SY
move *a8(OSIZEY),a2
srl 1,a2
add a2,a1 ;Center Y
clr a2 ;Octant 0-1
sub a6,a0 ;A0=SrcX-DestX
jrnn sod100
abs a0
sub a7,a1 ;A1=SrcY-DestY
jrnn sod200
movk 8,a2 ;Oct 2-3
abs a1
jruc sod160
sod100 movk 16,a2 ;Oct 4-5
sub a7,a1 ;A1=SrcY-DestX
abs a1
jrnn sod200
movk 16+8,a2 ;Oct 6-7
sod160 SWAP a0,a1
sod200 cmp a1,a0 ;>Cmp slope
jrhs sod300
move a0,a3
sll 2,a0 ;Smaller*4
jruc sod250
sod220 addk 1,a2 ;Next 1/4 oct
sub a3,a0 ;-1/4
sod250 cmp a1,a0
jrhi sod220
jruc sod400
sod300 addk 7,a2 ;End of next octant
move a1,a3
sll 2,a1 ;Smaller*4
jruc sod350
sod320 subk 1,a2 ;Next 1/4 oct
sub a3,a1 ;-1/4
sod350 cmp a0,a1
jrhi sod320
sod400 movk >1f,a0
and a2,a0
rets ;>A0=Dir 0-31
********************************
* Get sine
SUBR sine_get ;A0=0-81 (PI-Half circle)
cmpi 41,a0 ;Max table range
jrlo sin10
neg a0
addi 81,a0 ;-Table range
jrnn sin10
clr a0
sin10 sll 4,a0 ;*16
addi sine_t,a0
move *a0,a0
zext a0 ;>A0=Sin 0-4096
rets
sine_t .word 0,158,317,475,633,789,944,1098
.word 1251,1401,1549,1695,1838,1979,2117,2251
.word 2382,2510,2633,2753,2869,2980,3087,3189
.word 3286,3379,3466,3548,3625,3696,3762,3822
.word 3876,3925,3967,4004,4035,4059,4078,4090
.word 4096
********************************
* Get animation offset
* A0=*Obj
*
* Rets: A6=X Anim offset
* A7=Y Anim offset
* Trash A1,A2
GANIOFQA8
move a8,a0
GANIOFQ
move *a0(OIMG),a7,L
addk IANIOFF,a7
move *a7+,a6 ;X
move *a7+,a7 ;Y
move *a0(OFLAGS),a2
btst B_FLIPH,a2
jrz gani1
move *a0(OSIZEX),a1
subk 1,a1
neg a6
add a1,a6 ;Sub ths-1 for hflip
gani1 btst B_FLIPV,a2
jrz gani2
move *a0(OSIZEY),a1
subk 1,a1
neg a7
add a1,a7 ;Sub tvs-1 for vflip
gani2 rets
.end