3621 lines
60 KiB
NASM
3621 lines
60 KiB
NASM
**************************************************************
|
||
*
|
||
* 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
|
||
|