total-carnage/SHAWN.BAK

927 lines
16 KiB
Plaintext
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.

**************************************************************
*
* INITIATED: JUNE 27,1991
* MODIFIED: !
* SOFTWARE: SHAWN LIPTAK
*
* COPYRIGHT (C) 1991 WILLIAMS ELECTRONICS GAMES, INC.
*
**************************************************************
.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"
;sound headers used
;symbols externally defined
.ref ANI,FRANIM,BEGINOBJ,BEGINOBJ2,PLYRPRCS
.ref BOOM3,STATUS
;symbols defined in this file
;uninitialized ram definitions
.text
********************************
* Mortar weapon
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 morttnk3_t,a8
; CREATE 0,morttnk
; movi morttnk4_t,a8
; CREATE 0,morttnk
CREATE 0,jumper_maker
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
morttnk3_t
.word 50,50,158,DMAWNZ,CLSENMY
.long MTNK6
morttnk4_t
.word 350,50,158,DMAWNZ,CLSENMY
.long MTNK6
********************************
* Slime pool
WORDPD slimex,0
WORDPD slimey,1
SUBR POND
movi DMAWNZ+M_NOCOL,a0
move a0,*a8(OFLAGS) ;Collisions off
movi CLSNEUT,a0
move a0,*a8(OID)
; callr obj_get
sp100 movi >ff,a0
callr rnd
calla PRCSLP ;SLEEP some
movk 3,a0
callr rnd
jruc sp600 ;DEBUG
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
CREATE 0,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 movk 7,a0
callr rnd
jrz sp600 ;13% do circle
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
PUSH a10
movi goob_l,a10
CREATE 0,mortar_relsrc
PULL a10
jruc sp800
sp600 movi slimepat2_t,a9 ;>Circle pattern
movk 3,a11
sp610 movk 16,a10
sp620 PUSH a10
movi goob_l,a10
CREATE 0,mortar_relsrc
PULL a10
addk 32,a9
dsj a10,sp620
SLEEP 20
dsj a11,sp610
sp800 move @WORLDTLY+16,a0
move *a8(OYPOS),a1
addi 250,a1
cmp a0,a1
jrgt sp100 ;Continue till scroll off bottom
move a8,a0
calla DELOBJ
DIE
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
goob_l .long slimeburst_l
LW GOOB1,2
LW GOOB2,4
LW GOOB3,4
LW GOOB4,6
LW GOOB5,8
LW GOOB6,12
LW GOOB7,4
LW GOOB8,4
LW GOOB7,4
LW GOOB6,12
LW GOOB5,8
LW GOOB4,6
LW GOOB3,4
LW GOOB2,2
LW GOOB1,2
.long 0
.long slimesplat_l
slimesplat_l
LW GOOB9,10
.long 0
slimeburst_l
LW GOOB9,10
.long 0
********************************
* Eye
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 0,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 0,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 0,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
addi 250,a1
cmp a0,a1
jrgt e100 ;Continue till scroll off bottom
move a8,a0
calla DELOBJ
DIE
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 I7,14
LW I8,12
LW I9,8
LW I10,4
LW I11,2
LW I12,1
.long 0
.long eyesplat_l
eyesplat_l
LW GOOB9,10
.long 0
eyeburst_l
LW GOOB9,10
.long 0
********************************
* Mortar tank
SUBRP morttnk
callr obj_get
movi -1,a11
mt100 movi >ff,a0
callr rnd
movk 5,a0 ;DEBUG
calla PRCSLP
movk 1,a10 ;#Shots in pattern
movi mortpat_t,a9
mt200 PUSH a10
movi mortar_l,a10
CREATE 0,mortar_atp
PULL a10
addk 32,a9
; SLEEP 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
LW BALL1,2
.long 0
.long BOOM3 ;*FRANIM
; .long 0
********************************
* Jumping object
SUBRP jumper_maker
movi -1,a11
jm100 movi >1f,a0
callr rnd
movi 60*3,a0
calla PRCSLP
movk 1,a10 ;#Shots in pattern
movi jumppat_t,a9
jm200
PUSH a10
movi jump_l,a10
CREATE 0,jumper
PULL a10
addk 32,a9
dsj a10,jm200
dsj a11,jm100
DIE
jumppat_t
.word 0,0, -30,-20, 30,20, -30,20, 30,-20
jump_l .long FIEND1 ;Pallette
.long jumpstrt_l ;*FRANIM
LW FJUMP6C,82
.long 0
.long jumpland_l ;*FRANIM
jumpstrt_l
LW FJUMP6A,10
LW FJUMP6B,10
.long 0
jumpland_l
LW FJUMP6B,10
LW FJUMP6A,10
.long 0
.if 0
jump_l .long jumpstrt_l ;*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
LW BALL1,2
.long 0
.long jumpland_l ;*FRANIM
jumpstrt_l
LW GOOB9,10
.long 0
jumpland_l
LW GOOB9,10
.long 0
.endif
********************************
* Mortar shot (Process)
APTRPD msobj_p ,0 ;*Mortar shadow object
WORDPD mpos ,2 ;Mortar pos in arc
WORDPD msinea ,3 ;Sine add per tick
MZ .set 159
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
jrz 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
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,a5
abs a5
cmp a5,a11 ;Use max
jrhs ms30
move a5,a11
ms30
srl 6,a11 ;/64
move a11,a3
srl 2,a3
sub a3,a11 ;Sub .25 = /96
cmpi 25000,a11
jrhs ms60
movi 25000,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
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,a5,a6,a7
clr a6
clr a7
calla BEGINOBJ2 ;Get shot obj
move *a9,a9,L ;Get *FRANIM list
jrz ms250
movk 1,a1
JSRP FRANIM ;Fire sequence
ms250 mmfm a12,a0,a1,a3,a4,a5,a6,a7
movi SHADW,a2
subk 1,a3
move a8,a9
calla BEGINOBJ2 ;Get shadow obj
move a8,*a13(msobj_p),L
move a9,a8
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(OIMG),a1,L
move *a8(OSIZE),a2,L
move *a8(OFLAGS),a4
calla GANIOF
sra 16,a6 ;AniOf X
sra 16,a7 ;Y
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
addi MZ,a0
move a0,*a8(OZPOS)
SLEEP 1
dsj a10,ms350
ms400 move *a9+,a1,L ;Get *Img
jrnz ms300
move *a13(msobj_p),a0,L ;Kill shadow
calla DELOBJ
movi DMAWNZ,a0
move a0,*a8(OFLAGS) ;Collisions ON
movi CLSENMY+TYPLAYR+SUBFLM,a0
move a0,*a8(OID) ;Flame death
move *a9+,a9,L ;Get *FRANIM list
jrz ms880
movk 1,a1
JSRP FRANIM ;Explode
ms880 move a8,a0
calla DELOBJ
ms900 DIE
********************************
* Jumping object (Process)
APTRPD jsobj_p ,0 ;*Jumper shadow object
WORDPD jpos ,2 ;Jumper pos in arc
WORDPD jsinea ,3 ;Sine add per tick
APTRPD jobjt_p ,4 ;*Jumper object_t
WORDPD jx ,6 ;X pos
WORDPD jy ,7 ;Y pos
JZ .set 159
SUBRP jumper ;A9=*DestXY offset_t, A10=*Obj_t
movk 1,a0
move a0,*a13(jsinea)
move a10,*a13(jobjt_p),L
clr a8
jlp movk 1,a0 ;FIX!
callr rnd
move a0,a11 ;Player 0/1
move @PLYRPRCS,a2,L
move @STATUS,a3
; jrz j900 ;Demo?
btst 0,a11
jrz ja20
btst 1,a3 ;P2 valid?
jrnz ja30
ja20 btst 0,a3 ;P1 valid?
jrnz ja40
ja30 move @PLYRPRCS+32,a2,L
ja40 move *a2(LEG_PTR),a2,L
move *a2(OXPOS),a6
; jrz j900
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^
move a8,a8 ;Have an object?
jrnz j60
movi >ff,a0 ;>Start off screen
callr rnd
move @WORLDTLY+16,a1
add a0,a1
move @WORLDTLX+16,a0
subk 30,a0
; move *a9+,a3
; add a3,a6 ;+X offset
; move *a9+,a3
; add a3,a7 ;+Y offset
jruc j100
j60 move *a13(jx),a0 ;Get XY
move *a13(jy),a1
j100
move a0,a6 ;DEBUG
addi 50,a6
move 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 ;A11=Distance
move a7,a2
abs a2
cmp a2,a11 ;Use max
jrhs j120
move a2,a11
j120
srl 6,a11 ;/64
move a11,a2
srl 2,a2
sub a2,a11 ;Sub .25 = /96
cmpi 25000,a11
jrhs j140
movi 25000,a11 ;Minimum
j140 sra 1,a6 ;>Scale down to A11
sra 1,a7
move a6,a2
abs a2
cmp a11,a2 ;A6&A7 < A11
jrgt j140
move a7,a2
abs a2
cmp a11,a2
jrgt j140
move a6,a4 ;>Fine scale up to A11
move a7,a5
sra 4,a4 ;/16
sra 4,a5
jrnz j150
move a4,a4
jrz j200 ;Both 0 then skip
j150 add a4,a6
add a5,a7
move a6,a2
abs a2
cmp a11,a2
jrgt j200
move a7,a2
abs a2
cmp a11,a2
jrle j150
j200 move a8,a8
jrz j220 ;No object?
move *a13(jobjt_p),a10,L ;Get start of table
addk 32,a10
move *a10+,a9,L ;Get *FRANIM list
jrz j210
mmtm a12,a0,a1,a6,a7 ;Save XY&Vel
movk 1,a1
JSRP FRANIM ;Jump sequence
mmfm a12,a0,a1,a6,a7
j210 movi 100,a3 ;Z
movi DMAWNZ+M_NOCOLL,a4 ;No collisions
movi CLSDEAD,a5
jruc j260
j220 movi 100,a3 ;Z
movi DMAWNZ+M_NOCOLL,a4 ;No collisions
movi CLSDEAD,a5
move *a10+,a2,L ;Get *1st obj with Pallette
mmtm a12,a0,a1,a3,a4,a5,a6,a7
clr a6
clr a7
calla BEGINOBJ2 ;Get shot obj
move *a10+,a9,L ;Get *FRANIM list
jrz j250
movk 1,a1
JSRP FRANIM ;Jump sequence
j250 mmfm a12,a0,a1,a3,a4,a5,a6,a7
j260 movi SHAD1,a2
subk 1,a3
move a8,a9
calla BEGINOBJ2 ;Get shadow obj
move a8,*a13(jsobj_p),L
move a9,a8
move a10,a9
clr a0
move a0,*a13(jpos)
jruc j400
j300 movi DMAWNZ+M_NOCOLL,a4 ;No collisions
calla ANI ;New frame
move *a9+,a10 ;Get #ticks for frame
j350 move *a13(jsobj_p),a5,L
move *a5(OIMG),a1,L
move *a5(OSIZE),a2,L
move *a5(OFLAGS),a4
calla GANIOF
move *a13(jpos),a0 ;New height
move *a13(jsinea),a1
add a1,a0
cmpi 82,a0 ;Max table range
jrlo j370
clr a0
j370 move a0,*a13(jpos)
callr sine_get
srl 6,a0 ;/64
move *a5(OYPOS),a2
sub a0,a2
addi MZ,a0
move a0,*a8(OZPOS)
move a8,a0
move *a5(OXPOS),a3
sll 16,a2
sll 16,a3
add a6,a3 ;Add Anim pt
add a7,a2
move *a8(OFLAGS),a4
calla GANISAG
SLEEP 1
dsj a10,j350
j400 move *a9+,a1,L ;Get *Img
jrnz j300
move *a13(jsobj_p),a0,L ;Kill shadow
move *a0(OIMG),a1,L
move *a0(OSIZE),a2,L
move *a0(OFLAGS),a4
calla GANIOF
sra 16,a6
sra 16,a7
move *a0(OXPOS),a1
add a6,a1
move a1,*a13(jx) ;Save XY
move *a0(OYPOS),a1
add a7,a1
move a1,*a13(jy)
calla DELOBJ
movi DMAWNZ,a0
move a0,*a8(OFLAGS) ;Collisions ON
movi CLSENMY+TYPLAYR+SUBFLM,a0
move a0,*a8(OID) ;Flame death
move *a9+,a9,L ;Get *FRANIM list
jrz j880
movk 1,a1
JSRP FRANIM ;Land
j880 calla SCRTST
jreq jlp
move a8,a0
calla DELOBJ
j900 DIE
********************************
* 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
SUBRP rnd ;A0=Mask
PUSH a2
move @RAND,a1,L
rl a1,a1
rl a0,a1
move @HCOUNT,a2
rl a2,a1
xor a2,a1
move a1,@RAND,L
PULL a2
and a1,a0 ;A0=Rnd #
rets ;Pass CC
********************************
* Get sine
SUBRP 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
.end