5498 lines
99 KiB
NASM
5498 lines
99 KiB
NASM
**************************************************************
|
||
*
|
||
* Orcus software: Eugene Jarvis, Shawn Liptak
|
||
* Initiated: 7/12/91 from RBOSS SMASH TV
|
||
*
|
||
* Modified: Shawn Liptak, 9/25/91 -Started big fix
|
||
* Shawn Liptak, 11/7/91 -Done??
|
||
*
|
||
*
|
||
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
|
||
*
|
||
*.Last mod - 1/13/92 19:04
|
||
**************************************************************
|
||
.TITLE 'Orcus'
|
||
.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 "audit.equ"
|
||
.include "shawn.hdr" ;My macros
|
||
.include "orcus.tbl"
|
||
|
||
;Symbols externally defined
|
||
|
||
.ref SUCIDE,GANIOF,BEGINOBJ2,GAMSTATE
|
||
.ref PLYROBJS,PLYRPRCS,P1DATA,P2DATA,WAVE,STATUS
|
||
.ref FLASHME,KILALL,KILL
|
||
.ref SCRADD2,BONE,HEXTOASC
|
||
.ref FRANIM,FRANIMQ,GETFPAL,HALT
|
||
.ref RD15FONT,WRLD,STRCNRMO,STRLNRMO
|
||
.ref CYCLE_TABLE,START_PJ,DOIT
|
||
.ref FLMUP1,FLMUP2,FLMUP3,FLMUP4,FLMUP5
|
||
.ref RNDRNGS,RNDRNG
|
||
.ref NOSHOOT,FLMUP6
|
||
.ref RUN_AWAY
|
||
.ref BLUEEXP,FIREEXP,XBOOM2,BOOM3,BURST
|
||
.ref ONESND,ONESNDOVR
|
||
.ref SHAKER,OUT_FLG
|
||
.ref getcloseplyr
|
||
.ref YZSORT
|
||
.ref LIMO,TRY_RCK,PCNT,ICONS_DN
|
||
.ref aud_addnumplyrs
|
||
.ref ABOOBJUMP
|
||
|
||
;Symbols defined in this file
|
||
|
||
.def bossd_t
|
||
.def ORCHINT ;Image
|
||
.DEF bloflg
|
||
|
||
;Sound headers
|
||
|
||
.ref LOVEIT
|
||
|
||
musicsnd .word >f3fe,10,>8009,0 ;Boss music
|
||
gscottsnd .word >f9f7,16,>814b,0 ;Great scott
|
||
landsnd .word >fc88,30,>8030,0 ;Land from a jump
|
||
laughsnd .word >f194,30,>80f2,0 ;When plyr dies
|
||
exp1snd .word >fc80,7,>803e,0 ;Explosion
|
||
exp2snd .word >fd80,10,>80d9,0 ;^
|
||
;pain1snd .word >f985,20,>80f6,0 ;
|
||
;pain2snd .word >f985,20,>80f9,0 ;
|
||
groansnd .word >f985,20,>8113,0 ;Groan
|
||
groanlndsnd .word >f185,20,>8113,0 ;^ interruptable
|
||
oofsnd .word >f985,20,>8114,0 ;Oof
|
||
yowl1snd .word >f985,30,>8115,0 ;
|
||
yowl2snd .word >f985,30,>8116,0 ;
|
||
roarsnd .word >f990,40,>8117,0 ;Roar
|
||
roarlongsnd .word >f990,120,>8117,0 ;Roar
|
||
houchsnd .word >f985,20,>8120,0 ;
|
||
hyowlsnd .word >f985,20,>8122,0 ;
|
||
stvpainsnd .word >f985,30,>8123,0 ;
|
||
bubl1snd .word >f5e5,20,>8131,0 ;Blood bubbling
|
||
bubl2snd .word >f0e5,20,>8130,0 ;^
|
||
|
||
myeyesnd .word >f9e0,110,>8118,0 ;
|
||
myarmsnd .word >f9e0,120,>8119,0 ;
|
||
myheadsnd .word >f9e0,70,>8121,0 ;
|
||
|
||
msllnchsnd .word >f290,10,>80b9,0 ;Missile launch
|
||
;msllnchsnd .word >f290,10,>80b6,0 ;Missile launch
|
||
mslexpsnd .word >f470,10,>8048,0 ;Missile explosion
|
||
tungsnd .word >f290,10,>80b6,0 ;Tongue launch
|
||
youwillsnd .word >f9f7,32,>8153,0 ;
|
||
|
||
|
||
;Process subtypes
|
||
|
||
SUBLGUN .equ 1 ;Left gun controller
|
||
SUBRGUN .equ 2 ;Right gun controller
|
||
SUBTHRST .equ 3 ;Thrust
|
||
SUBNOSEF .equ 4 ;Nose flamers
|
||
SUBANI .equ 5 ;Eye/mouth animation
|
||
SUBWEAPON .equ 9 ;Missile/tongue launcher
|
||
SUBBOSSHALT .equ >80 ;Halts boss processes
|
||
|
||
ZACC .equ >1000 ;z accel constant
|
||
|
||
;Ram allocation for orcus
|
||
.bss bossram,0
|
||
.bss bossjmphi,16 ;!0=In high jump (Must preceed bossd_t)
|
||
.bss bossd_t,25*16*4 ;Boss object data structure
|
||
|
||
.bss bossxv,32 ;XV
|
||
.bss bossyv,32 ;YV
|
||
.bss bosszv,32 ;Z velocity
|
||
.bss bossz,32 ;Z pos (height)
|
||
|
||
.bss hdani_p,32 ;*Head animation process or 0
|
||
.bss iani_p,32 ;*Eye animation process or 0
|
||
.bss mani_p,32 ;*Mouth animation process or 0
|
||
.bss armani_p,32 ;*Arm animation process or 0
|
||
|
||
;*Must stay in order!!!
|
||
;ARMSTAT .equ 0
|
||
GUNDIR .equ >10
|
||
GUNMODE .equ >20
|
||
GUNSWP .equ >30
|
||
GUNNUM .equ >40
|
||
GUNBLOW .equ >50
|
||
|
||
.bss larmdata,0 ;
|
||
.bss larmstat,16 ;LArm status:-=Gone, 0=OK, 1=On fire
|
||
; 2=Exploding, 3=Stump
|
||
.bss lgundir,16 ;LGun direction 0-5
|
||
.bss lgunmode,16 ;LGun shooting mode 0-7
|
||
.bss lgswflg,16 ;LGun sweep direction flag 0=Down, !0=Up
|
||
.bss lgunnum,16 ;Gun # (0)
|
||
.bss lgunblow,16 ;LGun ready to blow: 0=No, !0=Yes
|
||
.bss rarmdata,0 ;
|
||
.bss rarmstat,16 ;RArm same as ^
|
||
.bss rgundir,16 ;^
|
||
.bss rgunmode,16 ;^
|
||
.bss rgswflg,16 ;^
|
||
.bss rgunnum,16 ;Gun # (1)
|
||
.bss rgunblow,16 ;^
|
||
|
||
.bss hdstat,16 ;!0=Head blown off
|
||
.bss shldrstat,16 ;!0=Shoulders blow off and # hits for big blow
|
||
.bss leyestat,16 ;!0=L eye blown out
|
||
.bss reyestat,16 ;!0=R eye blown out
|
||
.bss bodystat,16 ;!0=Everything blown out
|
||
|
||
.bss bossmode,16 ;Boss mode, -=Firing, 0=Stationary, +=Hopping
|
||
.bss bmtimer,16 ;Boss mode timer
|
||
.bss bloflg,16 ;-=Blow on; 0=No blow, +=Blow on but weapons OK
|
||
.bss bflmrstat,16 ;!0=Flamer on
|
||
.bss bossramend,0
|
||
|
||
BOSSJMPHI .set -16 ;Offset from bossd_t
|
||
|
||
;Boss data struct
|
||
|
||
BOOBJ .set >0 ;*Parts obj
|
||
BODAMR .set >20 ;Damage resistance (0-?)
|
||
BOAFRM .set >28 ;Current animation frame
|
||
BODAM .set >30 ;Damage
|
||
*>040=IMAGE 1 ETC.
|
||
|
||
AX .equ 43 ;Ani point offsets
|
||
AY .equ -84
|
||
|
||
|
||
.bss bombtotal,16 ;Total bombs at start of boss
|
||
|
||
|
||
********************************
|
||
* Orcus boss monster (Process)
|
||
|
||
SUBR BOSS
|
||
|
||
; movi musicsnd,a0
|
||
; calla ONESND
|
||
movi roarlongsnd,a0
|
||
calla ONESNDOVR
|
||
|
||
SLEEPK 30
|
||
clr a0 ;>Clear out boss variables
|
||
movi bossram,a1
|
||
bossclr move a0,*a1+
|
||
cmpi bossramend,a1
|
||
jrlo bossclr
|
||
|
||
move @GAMSTATE,a0
|
||
cmpi INAMODE,a0
|
||
jreq bi100
|
||
|
||
movk AUDBOSS1,a0
|
||
calla aud_addnumplyrs
|
||
|
||
bi100 move @P1DATA+BMBSUSED,a0
|
||
move @P2DATA+BMBSUSED,a1
|
||
add a0,a1
|
||
move a1,@bombtotal ;For bomb message
|
||
|
||
movk 1,a0
|
||
move a0,@lgundir ;Init LR gun angles down
|
||
move a0,@rgundir
|
||
move a0,@rarmdata+GUNNUM
|
||
|
||
move @WORLDTLX+16,a0 ;Get starting coord
|
||
addi 200,a0
|
||
sll 16,a0
|
||
move @WORLDTLY+16,a1
|
||
subi 150,a1 ;Y Off screen
|
||
sll 16,a1
|
||
clr a11 ;Damage level
|
||
callr boss_init ;Initialize
|
||
|
||
movi bossd_t,a8 ;A8=*Boss data struct
|
||
|
||
CREATE BOSSPID,cycle_eye
|
||
CREATE BOSSPID|SUBNOSEF,nose_flamers
|
||
movi larmdata,a11
|
||
CREATE BOSSPID|SUBLGUN,gun
|
||
movi rarmdata,a11
|
||
CREATE BOSSPID|SUBRGUN,gun
|
||
CREATE BOSSPID|SUBWEAPON,weapon_launcher
|
||
CREATE BOSSPID|SUBBOSSHALT,boss_halter
|
||
|
||
callr bossjump_center
|
||
movi 60*15,a2 ;No blows for awhile
|
||
;TURMELL
|
||
; movi 60*17,a2 ;No blows for awhile
|
||
callr set_bloflg
|
||
SLEEPK 2
|
||
CREATE0 gscott_snd
|
||
movi 60*3,a0
|
||
jruc b30
|
||
|
||
;** A8 Must not be trashed!!
|
||
bosslp
|
||
move @PCNT,a0
|
||
sll 32-6,a0
|
||
jrnz bl15
|
||
movi >8140,a1
|
||
move @PLYRPRCS,a0,L
|
||
jrz bl10
|
||
move *a0(LEG_PRC),a0,L
|
||
move a1,*a0(SHOECNT) ;Always with shoes
|
||
bl10 move @PLYRPRCS+32,a0,L
|
||
jrz bl15
|
||
move *a0(LEG_PRC),a0,L
|
||
move a1,*a0(SHOECNT)
|
||
|
||
bl15 move @bossmode,a0
|
||
jrnz b50
|
||
|
||
move @bmtimer,a0 ;>Boss main loop
|
||
subk 1,a0
|
||
move a0,@bmtimer
|
||
jrge b50 ;Same mode?
|
||
|
||
movk >f,a0 ;>New Mode
|
||
callr rnd
|
||
sll 3,a0 ;*8
|
||
addi bossmode_t,a0
|
||
movb *a0,a0
|
||
move a0,@bossmode
|
||
movi 220,a0
|
||
callr rndrng0
|
||
addi 60,a0
|
||
b30 move a0,@bmtimer ;Set new time
|
||
|
||
|
||
b50 move @bodystat,a0
|
||
jrnz b1000 ;Totally blown?
|
||
|
||
move @HALT,a0
|
||
jrz b100 ;No halt?
|
||
clr a0
|
||
move a0,@bossxv,L
|
||
move a0,@bossyv,L
|
||
move a0,@bosszv,L
|
||
jruc b1300
|
||
|
||
|
||
|
||
b100 move @iani_p,a0,L ;>Big eyes
|
||
jrnz b200 ;Animating?
|
||
|
||
movi eyequad_t,a9 ;>Follow player
|
||
clr a0 ;X offset
|
||
movi 80,a1 ;Y offset
|
||
callr bossseekp_ani32
|
||
callr aniboss
|
||
|
||
|
||
|
||
b200 move @hdstat,a0 ;>Little head
|
||
jrnz b400 ;Head blown?
|
||
move @hdani_p,a0,L
|
||
jrnz b400 ;Animating?
|
||
|
||
move @PLYRPRCS,a0,L
|
||
jrz b220
|
||
move *a0(DEAD),a0
|
||
jrnz b260 ;P1 dead?
|
||
b220 move @PLYRPRCS+32,a0,L
|
||
jrz b300
|
||
move *a0(DEAD),a0
|
||
jrz b300 ;P2 alive?
|
||
b260 move a8,a6
|
||
movi grinner,a8 ;Smile
|
||
movi hdani_p,a11
|
||
CREATE BOSSPID|SUBANI,aniseqq
|
||
move a6,a8
|
||
movi laughsnd,a0
|
||
calla ONESND
|
||
|
||
b300
|
||
movi hdquad_t,a9 ;>Follow player
|
||
clr a0 ;X offset
|
||
movi 80,a1 ;Y offset
|
||
callr bossseekp_ani32
|
||
callr aniboss
|
||
|
||
|
||
|
||
b400 move @mani_p,a0,L ;>Mouth and tongue
|
||
jrnz b450
|
||
movk 2,a0 ;33%
|
||
callr rndrng0
|
||
move a0,a0
|
||
jrnz b450
|
||
movi mouthrnd_t,a1
|
||
movi mani_p,a2
|
||
callr ani_rnd
|
||
|
||
|
||
|
||
b450 movi 99,a0 ;>1% New gun mode
|
||
callr rndrng0
|
||
move a0,a0
|
||
jrnz b500
|
||
movk 7,a0
|
||
callr rndrng0
|
||
move a0,@lgunmode
|
||
movk 7,a0
|
||
callr rndrng0
|
||
move a0,@rgunmode
|
||
|
||
|
||
**** Jump setup code
|
||
|
||
b500 move @bossz,a0,L
|
||
jrnz b1000 ;Jump in progress?
|
||
move @bflmrstat,a0
|
||
jrnz b1000 ;Flamers on?
|
||
move @bossmode,a0
|
||
jrn b1000 ;Firing?
|
||
|
||
move *a8,a0,L
|
||
move *a0(OYPOS),a2
|
||
subk 25,a2
|
||
movk 1,a0
|
||
callr rnd
|
||
jrz b530 ;Skip P1? So we don't pick on P1
|
||
move @PLYROBJS,a0,L
|
||
jrz b530
|
||
move *a0(OYPOS),a1
|
||
cmp a2,a1
|
||
jrlt b540 ;P1 Y < OrcY?
|
||
b530 move @PLYROBJS+32,a0,L
|
||
jrz b570
|
||
move *a0(OYPOS),a1
|
||
cmp a2,a1
|
||
jrge b570 ;P2 Y >= OrcY?
|
||
b540 movk 4,a0 ;Short jmps
|
||
move a0,@bossmode
|
||
|
||
b570 move @WORLDTLX+16,a4 ;A4=World X
|
||
move @WORLDTLY+16,a5 ;A5=World Y
|
||
callr boss_scrntst
|
||
jrz b600 ;On screen?
|
||
movk 1,a0 ;Jmp rnd
|
||
move a0,@bossmode
|
||
jruc b750
|
||
|
||
|
||
b600 move @bossmode,a0
|
||
jrle b1000 ;Fire or sit still mode?
|
||
cmpi 4,a0 ;>Short jmp
|
||
jrne b650
|
||
clr a0 ;X offset
|
||
movi 80,a1 ;Y offset
|
||
callr boss_getcloseplyr
|
||
jrz b1000
|
||
movi 75,a2
|
||
movi ZACC/2/2,a3
|
||
b630 move *a0(OYPOS),a1 ;Get plyr XY
|
||
move *a0(OXPOS),a0
|
||
callr bossjump_zacc ;Jump!
|
||
jruc b1000
|
||
|
||
b650 cmpi 6,a0 ;>Big jump
|
||
jrne b670
|
||
movi roarsnd,a0
|
||
calla ONESND
|
||
clr a0 ;X offset
|
||
movi 80,a1 ;Y offset
|
||
callr boss_getcloseplyr
|
||
movi 180,a2
|
||
movi ZACC/2,a3
|
||
move a0,a0
|
||
jrnz b630
|
||
jruc b1000
|
||
|
||
|
||
b670 subk 5,a0
|
||
jrne b750
|
||
|
||
movi yowl1snd,a0
|
||
calla ONESND
|
||
|
||
movi 60,a0 ;>Jump on plyr
|
||
callr rndrng0
|
||
subk 30,a0
|
||
move a0,a6 ;X offset +/-30
|
||
|
||
movi 30,a0
|
||
callr rndrng0
|
||
subk 15,a0
|
||
move a0,a7 ;Y offset
|
||
|
||
callr getplyr
|
||
jrz b750 ;No player?
|
||
move *a0(OYPOS),a1 ;Get plyr XY
|
||
move *a0(OXPOS),a0
|
||
add a6,a0 ;Add in offset
|
||
add a7,a1
|
||
sub a4,a0 ;>Check bounds
|
||
sub a5,a1
|
||
cmpi 25,a0 ;XMin
|
||
jrge b680
|
||
movk 25,a0
|
||
b680 cmpi 370,a0 ;XMax
|
||
jrle b690
|
||
movi 370,a0
|
||
b690 cmpi -10,a1 ;YMin
|
||
jrge b700
|
||
movi -10,a1
|
||
b700 cmpi 180,a1 ;YMax
|
||
jrle b800
|
||
movi 180,a1
|
||
jruc b800
|
||
|
||
|
||
b750 movi 129,a0
|
||
callr rndrng0
|
||
addi 45,a0
|
||
move a0,a2
|
||
movi 249,a0
|
||
callr rndrng0
|
||
addi 75,a0 ;Rnd X dest
|
||
move a2,a1 ;Rnd Y dest
|
||
|
||
move @bossmode,a3
|
||
subk 2,a3 ;2=Jump rnd X
|
||
jrne b790
|
||
movk 10,a1 ;Y dest
|
||
movi 60*4,a2
|
||
move a2,@bmtimer ;Sit at top for tongues
|
||
b790 subk 1,a3 ;3=Jump rnd Y
|
||
jrne b800
|
||
movi 200,a0 ;X dest
|
||
|
||
b800 add a4,a0 ;Add in world XY
|
||
add a5,a1
|
||
movi 100,a2
|
||
callr bossjump ;Jump!
|
||
|
||
|
||
b1000
|
||
move @bossz,a2,L ;>Update Z height
|
||
jrle b1300 ;No Z?
|
||
move a2,a3
|
||
move @bosszv,a0,L
|
||
subi ZACC,a0
|
||
move a0,@bosszv,L
|
||
add a0,a2 ;A2=Z+ZV
|
||
jrgt b1200 ;In air?
|
||
|
||
sub a2,a0 ;>Land
|
||
move a0,a4
|
||
move *a8(BOSSJMPHI),a0
|
||
jrz b1100
|
||
callr boss_setlow
|
||
b1100 movk 20,a10
|
||
calla SHAKER
|
||
movi landsnd,a0
|
||
calla ONESND
|
||
movi groanlndsnd,a0
|
||
calla ONESND
|
||
move @bossmode,a0
|
||
subk 5,a0
|
||
jrne b1120 ;!Sml jmp?
|
||
movk 5,a0 ;17%
|
||
callr rndrng0
|
||
move a0,a0
|
||
jrnz b1130 ;Keep jumping?
|
||
b1120 clr a0
|
||
move a0,@bossmode ;Sit still
|
||
b1130 move a4,a0
|
||
clr a2
|
||
move a2,@bosszv,L
|
||
move a2,@bossxv,L
|
||
move a2,@bossyv,L
|
||
move a2,*a8(BOSSJMPHI)
|
||
|
||
b1200 move a2,@bossz,L
|
||
callr vel_setz
|
||
move *a8(BOSSJMPHI),a0
|
||
jrnz b1300 ;High?
|
||
srl 16,a2
|
||
subk 16,a2 ;0-15 Z is low
|
||
jrlt b1300 ;Too low?
|
||
callr boss_sethi
|
||
movk 1,a0
|
||
move a0,*a8(BOSSJMPHI)
|
||
|
||
b1300 move @bossxv,a0,L
|
||
move @bossyv,a1,L
|
||
callr vel_set
|
||
SLOOP 1,bosslp
|
||
|
||
|
||
;Boss mode table
|
||
;0=Sit still, 1=Rnd jump, 2=Jmp X rnd Y top, 3=Jmp X center Y rnd
|
||
;4=Small jmp at plyr, 5=Jmp at plyr, 6=BigJmp
|
||
;7=Center jmp (blow)
|
||
bossmode_t
|
||
.byte 0,0,0,1,2,2,3,3,4,4,4,5,5,5,6,6
|
||
|
||
|
||
********************************
|
||
* Boss jump to screen center
|
||
* Trashes A0-A2
|
||
|
||
SUBRP bossjump_center
|
||
|
||
PUSH a7
|
||
CREATE BOSSPID,bossjump_center2
|
||
PULL a7
|
||
rets
|
||
|
||
|
||
bjc2 SLEEPK 1
|
||
|
||
SUBRP bossjump_center2
|
||
|
||
move @bossz,a0,L
|
||
jrnz bjc2 ;Jump in progress?
|
||
move @bflmrstat,a0
|
||
jrnz bjc2 ;Flamers on?
|
||
|
||
movk 7,a0
|
||
move a0,@bossmode
|
||
|
||
move @WORLDTLX+16,a0
|
||
move @WORLDTLY+16,a1
|
||
addi 200,a0
|
||
addi 100,a1
|
||
movi 100,a2 ;Time
|
||
movi SUCIDE,a3
|
||
move a3,-*sp,L ;We'll DIE
|
||
|
||
********************************
|
||
* Boss jump
|
||
* A0=DestX
|
||
* A1=DestY
|
||
* A2=Time
|
||
* Trashes A3
|
||
|
||
SUBRP bossjump
|
||
|
||
movi ZACC/2,a3
|
||
|
||
|
||
********************************
|
||
* Boss jump with custom ZACC
|
||
* A0=DestX
|
||
* A1=DestY
|
||
* A2=Time
|
||
* A3=ZACC
|
||
|
||
SUBRP bossjump_zacc
|
||
|
||
PUSH a2,a4,a7,a8,a10
|
||
move @bossd_t,a8,L ;A8=*1st obj
|
||
|
||
move *a8(OYPOS),a4
|
||
sub a4,a1
|
||
sll 16,a1
|
||
divs a2,a1 ;YV
|
||
move a1,@bossyv,L
|
||
|
||
move a0,a1
|
||
move *a8(OXPOS),a4
|
||
addi AX,a4 ;X center
|
||
sub a4,a1
|
||
sll 16,a1
|
||
divs a2,a1 ;XV
|
||
move a1,@bossxv,L
|
||
|
||
move a3,a1
|
||
mpys a2,a1 ;ZV
|
||
move a1,@bosszv,L
|
||
movk 1,a0
|
||
move a0,@bossz,L
|
||
|
||
movi BOSSPID|SUBTHRST,a0 ;Kill thrusters
|
||
calla KIL1C
|
||
movk 4,a10
|
||
CREATE BOSSPID|SUBTHRST,thrusters_fire
|
||
|
||
PULL a2,a4,a7,a8,a10
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Do great scott sound (Process)
|
||
|
||
SUBRP gscott_snd
|
||
|
||
SLEEP 50
|
||
movi gscottsnd,a0
|
||
calla ONESND
|
||
DIE
|
||
|
||
|
||
********************************
|
||
* Halt boss processes if halt on (Process)
|
||
|
||
SUBRP boss_halter
|
||
|
||
bhlp SLEEPK 8
|
||
move @HALT,a0
|
||
jrz bhlp ;No halt?
|
||
movi BOSSPID,a0
|
||
movk >1f,a1
|
||
movk 8,a2
|
||
calla KOP_ALL
|
||
jruc bhlp
|
||
|
||
|
||
********************************
|
||
* Player score
|
||
* A1=Amount to add (8 digit bcd)
|
||
* A11=*Bullet object that killed
|
||
|
||
SUBRP boss_scorehit
|
||
|
||
PUSH a2
|
||
move *a11(OPLINK),a0,L
|
||
movb *a0(MYPLYR),a0 ;A0=Player #
|
||
movi P1DATA,a2
|
||
subk 1,a0
|
||
jreq bsch1
|
||
movi P2DATA,a2
|
||
bsch1 calla SCRADD2 ;Do it!
|
||
PULL a2
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Score and send bonus word to score panel
|
||
* A1=Amount to add (8 digit bcd)
|
||
* A8=*Src obj
|
||
* A11=*Bullet obj
|
||
|
||
SUBRP boss_scorebonusword
|
||
|
||
PUSH a2,a7,a9,a10
|
||
|
||
move *a11(OPLINK),a10,L
|
||
movb *a10(MYPLYR),a0 ;A0=Player #
|
||
movi P1DATA,a2
|
||
subk 1,a0
|
||
jreq bsbw10 ;P1?
|
||
movi P2DATA,a2
|
||
bsbw10 move *a2(TBIGSTF),a0
|
||
addk 1,a0
|
||
move a0,*a2(TBIGSTF) ;Total big stuff destroyed
|
||
calla SCRADD2
|
||
|
||
movk 1,a9
|
||
CREATE FUTUREPID,BONE
|
||
|
||
PULL a2,a7,a9,a10
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Part of boss monster takes a hit
|
||
* A0=*Obj that hit
|
||
* A8=*Boss obj
|
||
|
||
SUBR orcus_hit
|
||
|
||
mmtm sp,a1,a2,a3,a4,a5,a6,a7,a9,a10,a11
|
||
|
||
movk 1,a1
|
||
move a1,@OUT_FLG ;Stop scan
|
||
|
||
move @bodystat,a1
|
||
jrnz ohx ;All blown?
|
||
|
||
move a0,a11 ;A11=*Obj that hit
|
||
move *a11(OID),a10 ;Get subtype
|
||
sll 32-3,a10
|
||
srl 32-3-4,a10 ;*16
|
||
jrz oh100 ;Bomb?
|
||
move @shldrstat,a1
|
||
jrz oh100 ;All blown?
|
||
move @bloflg,a0
|
||
jrn oh100 ;Blow in progress?
|
||
callr bosshit_big
|
||
|
||
oh100 move *a11(OXVEL),a1,L
|
||
move *a11(OYVEL),a2,L
|
||
addi buldat_t,a10 ;A10=*Data_t
|
||
move *a10,a9 ;>Push back
|
||
sra a9,a1
|
||
sra a9,a2
|
||
callr boss_addxy
|
||
|
||
move *a10,a0 ;>Shake
|
||
addk 10,a0
|
||
callr boss_addrndxy
|
||
|
||
movk 3,a0 ;75%
|
||
callr rnd
|
||
jrnz ohx ;No damage?
|
||
|
||
movi >1f1f0000,a9
|
||
CREATE0 FLASHME
|
||
|
||
move *a8(OPLINK),a9,L ;A9=*Obj data struct
|
||
move *a10(>80),a2 ;A2=Weapon damage
|
||
jrnn oh140 ;!Bomb?
|
||
movk 1,a0
|
||
callr rnd
|
||
move a0,a2 ;Bomb damage 0 or 1
|
||
oh140 movb *a9(BODAMR),a0
|
||
jrz oh150
|
||
addk 1,a2
|
||
srl a0,a2 ;Shift damage down
|
||
oh150 callr damage_react
|
||
move *a9(BODAM),a3 ;A3=Damage
|
||
add a2,a3
|
||
move a2,a4
|
||
callr boss_chknblowpart ;Check for special destruction
|
||
|
||
|
||
move @bloflg,a0 ;>Damage correct part for stupid plyrs
|
||
jrnz oh400 ;Blow or lockout in progress?
|
||
|
||
movk 7,a0 ;13%
|
||
callr rnd
|
||
jrnz oh400 ;Skip xfer?
|
||
|
||
move @larmstat,a0
|
||
subk 3,a0
|
||
jrlo oh400 ;!Stump?
|
||
move @rarmstat,a0
|
||
subk 3,a0
|
||
jrlo oh400 ;!Stump?
|
||
|
||
movi 9*>40,a1 ;Part 10
|
||
move @larmstat,a0
|
||
jrnn oh300
|
||
|
||
movi 10*>40,a1 ;Part 11
|
||
move @rarmstat,a0
|
||
jrnn oh300
|
||
|
||
movi 4*>40,a1 ;Part 5
|
||
move @leyestat,a0
|
||
jrz oh300 ;LEye OK?
|
||
|
||
movi 5*>40,a1 ;Part 6
|
||
move @reyestat,a0
|
||
jrz oh300 ;REye OK?
|
||
|
||
movi 8*>40,a1 ;Part 9
|
||
move @hdstat,a0
|
||
jrz oh300 ;Head OK?
|
||
|
||
movi 6*>40,a1 ;Part 7
|
||
move @shldrstat,a0
|
||
jrnz oh400 ;Top blown?
|
||
|
||
oh300 addi bossd_t,a1
|
||
cmp a1,a9
|
||
jreq oh400 ;Same part?
|
||
|
||
move *a1(BODAM),a0
|
||
add a4,a0
|
||
cmpi 48,a0
|
||
jrhs oh350 ;Maxed?
|
||
PUSH a3,a8,a9
|
||
move *a1,a8,L ;Get obj
|
||
move a1,a9
|
||
move a0,a3 ;A3=Damage
|
||
callr boss_chknblowpart ;Check for special destruction
|
||
move a4,a2
|
||
callr damage_set
|
||
PULL a3,a8,a9
|
||
oh350
|
||
|
||
oh400 move a4,a2
|
||
cmpi 47,a3
|
||
jrls oh500 ;!Maxed?
|
||
callr damage_xfer ;Xfer damage to other parts!
|
||
movi 47,a3
|
||
oh500 callr damage_set
|
||
|
||
move *a10(>80),a1 ;Get score
|
||
abs a1
|
||
callr boss_scorehit
|
||
|
||
ohx mmfm sp,a1,a2,a3,a4,a5,a6,a7,a9,a10,a11
|
||
rets
|
||
|
||
; Bullet subtype data table
|
||
;SUBLZR 1 ;Regular shots
|
||
;SUBSPRY 2 ;Spray
|
||
;SUBFIRE1 3 ;Flame thrower
|
||
;SUBGRND 4 ;Arcing balls
|
||
;SUBNOSTP 5 ;Non-stopping rockets
|
||
;SUBSPDG1 6 ;Fast blue balls
|
||
buldat_t
|
||
.word -2,-3,-3,-3, 0, 0,-2,0 ;Shift count
|
||
.word -1, 1, 1, 3, 4, 3, 1,0 ;Damage/score
|
||
|
||
|
||
********************************
|
||
* Make pieces from where boss is hit
|
||
* A11=*Obj that hit
|
||
* Trashes A0-A7,A9
|
||
|
||
SUBRP bosshit_big
|
||
|
||
PUSH a8,a11
|
||
|
||
movk 3,a0
|
||
callr rnd
|
||
sll 5,a0 ;*32
|
||
addi bigpain_t,a0
|
||
move *a0,a0,L
|
||
calla ONESND
|
||
|
||
movi t72blst_l,a9
|
||
|
||
move *a11(OXVEL),a6,L
|
||
move *a11(OYVEL),a7,L
|
||
|
||
move *a11(OXPOS),a0
|
||
move *a11(OSIZEX),a2
|
||
srl 1,a2 ;/2
|
||
add a2,a0
|
||
move *a11(OYPOS),a1
|
||
move *a11(OSIZEY),a2
|
||
srl 1,a2 ;/2
|
||
add a2,a1
|
||
subk 22,a1
|
||
sll 16,a0 ;X
|
||
sll 16,a1 ;Y
|
||
movi T72BLAST1,a2
|
||
move *a11(OZPOS),a3
|
||
addk 30,a3
|
||
movi DMAWNZ+M_NOCOLL,a4 ;No collisions
|
||
movi CLSDEAD,a5
|
||
|
||
PUSH a0,a1,a7
|
||
calla BEGINOBJ2
|
||
CREATE BOSSPID,FRQDELDIE
|
||
PULL a0,a1,a7
|
||
|
||
sll 1,a6 ;*2
|
||
sll 1,a7
|
||
calla BEGINOBJ2
|
||
CREATE BOSSPID,FRQDELDIE
|
||
|
||
PULL a8,a11
|
||
rets
|
||
|
||
t72blst_l
|
||
LW T72BLAST2,2
|
||
LW T72BLAST3,4
|
||
LW T72BLAST4,4
|
||
LW T72BLAST5,4
|
||
LW T72BLAST6,4
|
||
LW T72BLAST7,4
|
||
LWL0 T72BLAST8,4
|
||
|
||
bigpain_t
|
||
.long yowl1snd,yowl2snd,roarsnd,stvpainsnd
|
||
|
||
|
||
********************************
|
||
* Add random XY to boss position
|
||
* A0=XY Max (word)
|
||
* Trashes A0-A3
|
||
|
||
SUBRP boss_addrndxy
|
||
|
||
sll 15,a0 ;Make long
|
||
move a0,a3
|
||
calla RNDRNGS
|
||
move a0,a2 ;Y
|
||
move a3,a0
|
||
calla RNDRNGS
|
||
move a0,a1 ;X
|
||
|
||
********************************
|
||
* Add XY to boss position
|
||
* A1=Delta X
|
||
* A2=Delta Y
|
||
|
||
SUBRP boss_addxy
|
||
|
||
PUSH a2,a3,a4
|
||
movi bossd_t,a4
|
||
jruc baxy5
|
||
|
||
baxylp move *a0(OXVAL),a3,L
|
||
add a1,a3
|
||
move a3,*a0(OXVAL),L
|
||
move *a0(OYVAL),a3,L
|
||
add a2,a3
|
||
move a3,*a0(OYVAL),L
|
||
addk 32,a4
|
||
baxy5 move *a4+,a0,L
|
||
jrnz baxylp ;More?
|
||
|
||
PULL a2,a3,a4
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Heads react to damage
|
||
* A2=New damage
|
||
|
||
SUBRP damage_react
|
||
|
||
cmpi 2,a2
|
||
jrhs damage_react2 ;Always pain?
|
||
movk >f,a0 ;6%
|
||
callr rnd
|
||
jrnz drxx
|
||
|
||
SUBRP damage_react2
|
||
|
||
mmtm sp,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
|
||
|
||
movk 4,a0 ;>Random pain
|
||
move @hdstat,a1
|
||
jrnz dr1 ;Head blown?
|
||
movk 6,a0
|
||
dr1 callr rndrng0
|
||
sll 5,a0 ;*32
|
||
addi painsnd_t,a0
|
||
move *a0,a0,L
|
||
calla ONESND
|
||
|
||
move @hdstat,a0 ;>Lil head pain
|
||
jrnz dr5 ;Head blown?
|
||
movi hdani_p,a2
|
||
move *a2,a0,L
|
||
jrz dr2 ;Head inactive?
|
||
calla KILL
|
||
clr a0
|
||
move a0,*a2,L
|
||
dr2 movi hddam_t,a1
|
||
callr randseq ;Start new ani
|
||
|
||
dr5 move @bodystat,a0
|
||
jrnz drx ;Body blown?
|
||
movi iani_p,a2 ;>Big eyes pain
|
||
move *a2,a0,L
|
||
jrz dr50 ;Eye inactive?
|
||
calla KILL
|
||
clr a0
|
||
move a0,*a2,L
|
||
dr50 movi eyedam_t,a1
|
||
callr randseq ;Start new ani
|
||
|
||
drx mmfm sp,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
|
||
drxx rets
|
||
|
||
|
||
painsnd_t
|
||
.long groansnd,oofsnd,yowl1snd,yowl2snd
|
||
.long stvpainsnd,houchsnd,hyowlsnd
|
||
|
||
|
||
********************************
|
||
* Check a hit part for special damage or explosions
|
||
* A3=Damage
|
||
* A8=*Boss object hit
|
||
* A9=*Boss data struct for part
|
||
* A11=*Bullet obj
|
||
* Trashes A0-A2
|
||
* >A3=Damage
|
||
|
||
SUBRP boss_chknblowpart
|
||
|
||
move @bloflg,a0
|
||
jrnz ckbx ;Blow or lockout in progress?
|
||
|
||
movb *a8(OID),a1
|
||
cmpi SUBHD,a1
|
||
jrlo ckb100 ;Nothing special?
|
||
|
||
cmpi SUBARML,a1 ;>L arm blow ?
|
||
jrne ckb10
|
||
move @larmstat,a0
|
||
jrnn lftarmblo ;Damage it?
|
||
jruc ckb100
|
||
|
||
ckb10 cmpi SUBARMR,a1 ;>R arm blow?
|
||
jrne ckb20
|
||
move @rarmstat,a0
|
||
jrnn rtarmblo ;Damage it?
|
||
jruc ckb100
|
||
|
||
|
||
ckb20 move @larmstat,a0
|
||
jrnn ckbx0 ;LArm still there?
|
||
move @rarmstat,a0
|
||
jrnn ckbx0 ;RArm ^
|
||
|
||
cmpi SUBMTHL,a1 ;>Mouth not damaged until arms
|
||
jreq ckb100
|
||
cmpi SUBMTHR,a1
|
||
jreq ckb100
|
||
|
||
cmpi SUBEL,a1 ;>L eye
|
||
jrne ckb30
|
||
move @leyestat,a0
|
||
jrz lfteyeblo
|
||
jruc ckb100
|
||
|
||
ckb30 cmpi SUBER,a1 ;>R eye
|
||
jrne ckb40
|
||
move @reyestat,a0
|
||
jrz rteyeblo
|
||
jruc ckb100
|
||
|
||
|
||
ckb40 move @leyestat,a0
|
||
jrz ckbx0 ;LEye OK?
|
||
move @reyestat,a0
|
||
jrz ckbx0 ;REye OK?
|
||
|
||
cmpi SUBHD,a1
|
||
jrne ckb50 ;!Head?
|
||
cmpi 32,a3 ;32 or higher=destroyed
|
||
jrlo ckb100
|
||
move @hdstat,a0
|
||
jrz head_startblow ;Destroy?
|
||
jruc ckb100
|
||
|
||
|
||
ckb50 move @hdstat,a0
|
||
jrz ckbx0 ;Head OK?
|
||
|
||
cmpi SUBSHLDL,a1
|
||
jreq ckb60 ;Shoulder?
|
||
cmpi SUBSHLDR,a1
|
||
jrne ckb100
|
||
ckb60 cmpi 32,a3 ;32 or higher=destroyed
|
||
jrlo ckb100
|
||
move @shldrstat,a0
|
||
jrz shldr_startblow ;Blow shoulders?
|
||
|
||
ckb100 move @shldrstat,a0
|
||
jrz ckbx ;Top OK?
|
||
subk 1,a0 ;-1 hit for blow
|
||
jrle body_startblow ;Wasted?
|
||
move a0,@shldrstat
|
||
ckbx rets
|
||
|
||
ckbx0 clr a3 ;Reset damage
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Set, wait and clear bloflg
|
||
* A2=Delay before clr
|
||
|
||
SUBRP set_bloflg
|
||
|
||
PUSH a7
|
||
movi -1,a0
|
||
move a0,@bloflg
|
||
CREATE BOSSPID,clr_bloflg
|
||
move a2,*a0(PTIME) ;Set delay time
|
||
PULL a7
|
||
rets
|
||
|
||
clr_bloflg
|
||
clr a0
|
||
move a0,@bloflg
|
||
DIE
|
||
|
||
|
||
********************************
|
||
* Blow left or right arm
|
||
* A3=Damage
|
||
* A8=*Arm object
|
||
* A9=*Boss data struct for part
|
||
* A11=*Bullet obj
|
||
* >A3=New damage value
|
||
|
||
lftarmblo
|
||
PUSH a7,a9,a10,a11
|
||
movi larmdata,a10
|
||
jruc lrab20
|
||
|
||
rtarmblo
|
||
PUSH a7,a9,a10,a11
|
||
movi rarmdata,a10
|
||
|
||
lrab20 cmpi 16,a3
|
||
jrlo lrab200 ;Working?
|
||
move *a10,a1 ;Get status
|
||
jrgt lrab70
|
||
;>Start a fire!
|
||
CREATE BOSSPID,arm_burnblow
|
||
callr damage_react2 ;Pain!
|
||
|
||
clr a3 ;Set damage zero
|
||
movk 1,a2 ;Burn status
|
||
jruc lrab150
|
||
|
||
lrab70 subk 1,a1
|
||
jrgt lrab500 ;!Burning?
|
||
movk 2,a2 ;Explode status
|
||
movk 15,a3
|
||
lrab100 move *a10(GUNBLOW),a0
|
||
jrz lrab200 ;Can't blow?
|
||
; clr a0
|
||
; move a0,*a10(GUNBLOW) ;Clr it
|
||
movi >1500,a1
|
||
callr boss_scorebonusword
|
||
movi -1,a1
|
||
move a1,@bloflg
|
||
lrab150 move a2,*a10 ;Set status
|
||
lrab200 PULL a7,a9,a10,a11
|
||
rets
|
||
|
||
lrab500 cmpi 32,a3
|
||
jrlo lrab200 ;Stump ok?
|
||
movi -1,a2 ;Gone status
|
||
; movk 31,a3
|
||
jruc lrab100
|
||
|
||
|
||
********************************
|
||
* Arm destruction sequence (Process)
|
||
* A8=*Arm object
|
||
* A9=*Boss data struct for part
|
||
* A10=*Arm data struct
|
||
|
||
SUBRP arm_burnblow
|
||
|
||
PUSHP a9
|
||
move a10,a11 ;A11=*Arm data struct
|
||
|
||
clr a9
|
||
CREATE BOSSPID,arm_1gunflame
|
||
SLEEP 120
|
||
CREATE BOSSPID,arm_1gunflame
|
||
SLEEP 120
|
||
movi 192,a9
|
||
CREATE BOSSPID,arm_1gunflame
|
||
movi 192*2,a9
|
||
CREATE BOSSPID,arm_1gunflame
|
||
SLEEP 60*27
|
||
|
||
movi BOSSPID|SUBLGUN,a0
|
||
move *a11(GUNNUM),a1
|
||
jrz abn60
|
||
movi BOSSPID|SUBRGUN,a0
|
||
abn60 calla KIL1C ;Kill gun process
|
||
|
||
|
||
clr a9 ;>Random gun movement
|
||
move *a11(GUNNUM),a1
|
||
jrz abn100
|
||
movk 6,a9
|
||
abn100 movk 5,a10
|
||
JSRP gun_seek
|
||
|
||
movk 1,a0
|
||
move a0,*a11(GUNBLOW) ;We can blow
|
||
|
||
abn110 SLEEPK 3
|
||
movk >1f,a0
|
||
callr rnd
|
||
jrnz abn120
|
||
movk 5,a10
|
||
JSRP gun_seek
|
||
movk 3,a0
|
||
callr rnd
|
||
addk 2,a0
|
||
move a0,a10
|
||
JSRP gun_seek
|
||
abn120 move *a11,a0 ;Get status
|
||
subk 1,a0
|
||
jreq abn110 ;Still on fire?
|
||
|
||
|
||
callr bossjump_center
|
||
movi myarmsnd,a0
|
||
calla ONESNDOVR
|
||
|
||
movk 3,a5
|
||
abn300 PUSHP a5
|
||
movk 1,a6
|
||
JSRP gun_blow
|
||
movk 19,a0
|
||
callr rndrng0
|
||
addk 10,a0
|
||
calla PRCSLP
|
||
PULLP a5
|
||
dsj a5,abn300
|
||
|
||
movk 10,a6
|
||
JSRP gun_blow
|
||
SLEEP 45
|
||
movi myarmsnd,a0
|
||
calla ONESNDOVR
|
||
movk 30,a6
|
||
JSRP gun_blow
|
||
SLEEPK 30
|
||
movi 60,a6
|
||
JSRP gun_blow
|
||
movi myarmsnd,a0
|
||
calla ONESNDOVR
|
||
movi 120,a6
|
||
JSRP gun_blow
|
||
|
||
|
||
movk 3,a0 ;Stump status
|
||
move a0,*a11
|
||
move *a12,a9,L
|
||
movk 16,a3
|
||
callr damage_setalways ;Show stump
|
||
movk 1,a0
|
||
move a0,@bloflg ;Enable weapons
|
||
|
||
|
||
movi 60*3,a6
|
||
abn500 move a11,a5 ;>Stump bleeds
|
||
movi blooddn_t,a9
|
||
movi 68,a0
|
||
move *a11(GUNNUM),a1
|
||
callr boss_getanipt
|
||
addi 53,a11 ;Y
|
||
CREATE BOSSPID,mk_objbvfranim
|
||
move a6,a9
|
||
move a5,a11
|
||
SLEEPK 1
|
||
move a9,a6
|
||
dsj a6,abn500
|
||
|
||
SLEEP 60*10
|
||
clr a0
|
||
move a0,@bloflg ;Let blows continue
|
||
|
||
|
||
abn550 SLEEPK 1
|
||
move *a11,a0 ;Get status
|
||
jrnn abn550 ;Stump ok?
|
||
|
||
callr bossjump_center
|
||
movi myarmsnd,a0
|
||
calla ONESNDOVR
|
||
|
||
movi 60*5,a6 ;>Blow off stumps
|
||
abn600 move a11,a5
|
||
movi armripl_t,a9
|
||
clr a0
|
||
move *a11(GUNNUM),a1
|
||
jrz abn620
|
||
movi armripr_t,a9
|
||
abn620 callr boss_getanipt
|
||
addk 1,a11 ;Y
|
||
CREATE BOSSPID,mk_objfranim
|
||
move a6,a9
|
||
move a5,a11
|
||
SLEEPK 1
|
||
move a9,a6
|
||
cmpi 60*3,a6
|
||
jreq abn640
|
||
cmpi 60*1,a6
|
||
jrne abn650
|
||
abn640 movi myarmsnd,a0
|
||
calla ONESNDOVR
|
||
abn650 callr damage_react2 ;Pain!
|
||
movi exp1snd,a0
|
||
calla ONESND
|
||
movi exp2snd,a0
|
||
calla ONESND
|
||
movk 8,a0
|
||
callr boss_addrndxy ;Shake!
|
||
dsj a6,abn600
|
||
|
||
|
||
PULLP a9
|
||
movk 32,a3
|
||
callr damage_setalways ;Show null
|
||
movk 1,a0
|
||
move a0,@bloflg ;Enable weapons
|
||
move *a8(OFLAGS),a0
|
||
addi M_NOCOLL,a0
|
||
srl 4,a0 ;Clr DMA bits
|
||
sll 4,a0
|
||
move a0,*a8(OFLAGS)
|
||
|
||
movi 60*3,a6
|
||
abn700 move a11,a5
|
||
movi bloodl_t,a9 ;>Shoulder bleeds
|
||
movi 38,a0
|
||
move *a11(GUNNUM),a1
|
||
jrz abn720
|
||
movi bloodr_t,a9
|
||
abn720 callr boss_getanipt
|
||
subk 4,a10 ;X
|
||
addk 26,a11 ;Y
|
||
CREATE BOSSPID,mk_objbvfranim
|
||
move a6,a9
|
||
move a5,a11
|
||
SLEEPK 1
|
||
move a9,a6
|
||
dsj a6,abn700
|
||
|
||
SLEEP 60*10
|
||
clr a0
|
||
move a0,@bloflg
|
||
|
||
DIE
|
||
|
||
|
||
gunlexp_t
|
||
.long FIREEXP
|
||
.word 187,->800,->100,->400,>400
|
||
gunrexp_t
|
||
.long FIREEXP
|
||
.word 187,>100,>800,->400,>400
|
||
gunlexp2_t
|
||
.long XBOOM2
|
||
.word 187,->800,0,->800,>800
|
||
gunrexp2_t
|
||
.long XBOOM2
|
||
.word 187,0,>800,->800,>800
|
||
|
||
blooddn_t
|
||
.long bldclt_l
|
||
.word 181,->110,>110,>30,>180
|
||
|
||
armripl_t
|
||
.long armripl_l
|
||
.word 181,->a00,->200,->300,>300
|
||
armripr_t
|
||
.long armripr_l
|
||
.word 181,>200,>a00,->300,>300
|
||
armripr_l
|
||
LWW ARMRIP,FLIPBITS+1,M_FLIPH
|
||
armripl_l
|
||
LW ARMRIP,15
|
||
LWLW OKBM1,NEWPALET+DELTAY+3,GRNBOOM,50
|
||
LW OKBM2,3
|
||
LW OKBM3,3
|
||
LW OKBM4,3
|
||
LW OKBM5,3
|
||
LW OKBM6,3
|
||
LWL0 OKBM7,3
|
||
|
||
bloodl_t
|
||
.long bldclt_l
|
||
.word 161,->200,->80,->100,>100
|
||
bloodr_t
|
||
.long bldclt_l
|
||
.word 161,>80,>200,->100,>100
|
||
|
||
bldclt_l ;Oval blood spurt
|
||
LW bldclt1,4
|
||
LW bldclt2,4
|
||
LW bldclt3,4
|
||
LW bldclt4,4
|
||
LW bldclt5,4
|
||
LW bldclt6,4
|
||
LW bldclt7,4
|
||
LWL0 bldclt8,4
|
||
|
||
|
||
********************************
|
||
* Flame on gun (Process)
|
||
* A9=XY table offset
|
||
* A11=*Arm data struct
|
||
|
||
WORDPD flamexyto ,0
|
||
|
||
SUBRP arm_1gunflame
|
||
|
||
move a9,*a13(flamexyto)
|
||
|
||
clr a0
|
||
clr a1
|
||
movi LFLM1,a2
|
||
movi 185,a3 ;Z
|
||
movi DMAWNZ+M_NOCOLL,a4
|
||
movi CLSDEAD,a5
|
||
clr a6
|
||
clr a7
|
||
calla BEGINOBJ2
|
||
|
||
a1gf20 movk 1,a10
|
||
movi lflm_l,a9
|
||
|
||
a1gf50 move *a8(OFLAGS),a4
|
||
dsj a10,a1gf100
|
||
movk 5,a0
|
||
callr rndrng0
|
||
addk 2,a0
|
||
move a0,a10 ;>Sleep 2-7
|
||
move *a9+,a1,L
|
||
jrz a1gf20 ;End?
|
||
calla ANI
|
||
|
||
a1gf100 move *a13(flamexyto),a0
|
||
callr arm_getcenter
|
||
movk 1,a0
|
||
callr rnd
|
||
add a0,a2
|
||
movk 1,a0
|
||
callr rnd
|
||
add a0,a3
|
||
move a8,a0
|
||
sll 16,a2
|
||
sll 16,a3
|
||
calla GANISAG
|
||
SLEEPK 1
|
||
move *a11,a0 ;Get status
|
||
subk 2,a0
|
||
jrls a1gf50 ;Burning or exploding?
|
||
|
||
jauc DELOBJDIE
|
||
|
||
|
||
lflm_l .long LFLM1,LFLM2,LFLM3,LFLM4,LFLM5,LFLM6,0
|
||
|
||
|
||
|
||
********************************
|
||
* Get center of gun
|
||
* A0=XY table offset
|
||
* A11=*Arm data struct
|
||
* >A2=Y
|
||
* >A3=X
|
||
|
||
SUBRP arm_getcenter
|
||
|
||
move *a11(GUNDIR),a2
|
||
sll 5,a2 ;*32
|
||
addi gunxy_t,a2
|
||
add a0,a2
|
||
move *a2+,a3 ;XO
|
||
move *a2,a2 ;YO
|
||
move *a11(GUNNUM),a0
|
||
jrz agc80
|
||
neg a3
|
||
agc80 move @bossd_t,a0,L ;Get * 1st obj
|
||
move *a0(OXPOS),a1
|
||
addi AX+2,a1 ;+Ani pt X offset
|
||
add a1,a3
|
||
move *a0(OYPOS),a1
|
||
addi AY,a1 ;+Ani pt Y offset
|
||
add a1,a2
|
||
rets
|
||
|
||
gunxy_t
|
||
.word -62,35, -66,41, -70,35, -74,36
|
||
.word -73,29, -77,26
|
||
.word -60,41, -66,47, -72,41, -78,40
|
||
.word -79,31, -85,26
|
||
.word -58,47, -66,53, -74,47, -82,44
|
||
.word -85,33, -93,26
|
||
|
||
|
||
|
||
********************************
|
||
* Get ani point of boss plus X offset
|
||
* A0=X offset to right
|
||
* A1=Side: 0=Left, !0=Right
|
||
* >A10=X
|
||
* >A11=Y
|
||
|
||
SUBRP boss_getanipt
|
||
|
||
move a1,a1
|
||
jrnz bgap50 ;Right?
|
||
neg a0 ;Left
|
||
bgap50 move @bossd_t,a11,L ;Get * 1st obj
|
||
move *a11(OXPOS),a10
|
||
addi AX+2,a10 ;+Ani pt X offset
|
||
add a0,a10
|
||
move *a11(OYPOS),a11
|
||
addi AY,a11 ;+Ani pt Y offset
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Shoot explosions and chunks from gun
|
||
* A6=# Loops
|
||
* A8=*Arm object
|
||
* A11=*Arm data struct
|
||
|
||
SUBRP gun_blow
|
||
|
||
movi stvpainsnd,a0
|
||
calla ONESND
|
||
callr damage_react2 ;Pain!
|
||
|
||
gb200 clr a0
|
||
callr arm_getcenter
|
||
movi gunlexp_t,a9
|
||
movi gunlexp2_t,a4
|
||
move *a11(GUNNUM),a0
|
||
jrz gb240
|
||
movi gunrexp_t,a9
|
||
movi gunrexp2_t,a4
|
||
gb240 move a11,a5
|
||
move a3,a10
|
||
move a2,a11
|
||
addi 54,a11 ;Y
|
||
CREATE BOSSPID,mk_objfranim
|
||
btst 0,a6
|
||
jrz gb260
|
||
move a4,a9
|
||
CREATE BOSSPID,mk_objfranim
|
||
movi exp1snd,a0
|
||
calla ONESND
|
||
movi exp2snd,a0
|
||
calla ONESND
|
||
gb260 move a5,a11
|
||
|
||
movk >f,a0
|
||
and a6,a0
|
||
jrnz gb300 ;Skip piece?
|
||
CREATE BOSSPID,gun_piece
|
||
gb300 move a6,a9
|
||
SLEEPK 1
|
||
move a9,a6
|
||
movk 8,a0
|
||
callr boss_addrndxy ;Shake!
|
||
dsj a6,gb200
|
||
RETP
|
||
|
||
********************************
|
||
* Gun piece flying off (Process)
|
||
* A8=*Arm object
|
||
* A11=*Arm data struct
|
||
|
||
SUBRP gun_piece
|
||
|
||
movi >30000,a0
|
||
callr rndrng0
|
||
addi >100000,a0
|
||
move a0,a6 ;XV
|
||
|
||
move *a11(GUNNUM),a10
|
||
jrnz gp20 ;#1?
|
||
neg a6
|
||
|
||
gp20 movi >140000,a0
|
||
calla RNDRNGS
|
||
move a0,a7 ;YV
|
||
|
||
move *a11(GUNDIR),a10
|
||
subk 1,a10
|
||
cmpi 5,a10
|
||
jrlo gp40
|
||
clr a10
|
||
gp40 sll 6,a10 ;*64
|
||
movi gunfly_l,a9
|
||
|
||
move *a8(OFLAGS),a5
|
||
btst B_FLIPH,a5
|
||
jrz gp60
|
||
neg a10
|
||
jrz gp60 ;Don't flip?
|
||
movi gunflyend,a9 ;for flipped case
|
||
gp60 add a10,a9 ;get starting address
|
||
calla GETANIXY ;Get pos to start
|
||
move a3,a0
|
||
move a2,a1
|
||
movi gunoff_t,a5
|
||
abs a10 ;correct negative case
|
||
srl 1,a10
|
||
add a10,a5
|
||
move *a5+,a2 ;get your offset
|
||
move *a5,a3
|
||
move *a8(OFLAGS),a5
|
||
btst B_FLIPH,a5
|
||
jrz gp100
|
||
neg a2 ;negate offset for flip case
|
||
gp100 sll 16,a2
|
||
sll 16,a3
|
||
add a2,a0
|
||
add a3,a1
|
||
|
||
move *a9,a2,L ;get animation
|
||
movi 170,a3 ;Z
|
||
movi DMAWNZ+M_NOCOLL,a4
|
||
movi CLSDEAD,a5
|
||
sra 2,a6 ;Slow down velocity
|
||
sra 2,a7
|
||
calla BEGINOBJ2
|
||
movi 90,a10 ;Timeout cnt
|
||
|
||
gplp clr a1
|
||
JSRP FRANIM
|
||
jrnc gp300
|
||
movi gunfly_l,a9
|
||
gp300 calla SCRTST
|
||
jrnz gpx
|
||
|
||
movk 1,a0
|
||
callr rnd
|
||
jrnz gp400
|
||
CREATE0 make_smoketrail
|
||
|
||
gp400 dsj a10,gplp ;Time out check
|
||
|
||
gpx SLEEPK 1
|
||
jauc DELOBJDIE
|
||
|
||
|
||
gunoff_t ;XY offsets
|
||
.word -70,107, -78,98, -84,94, -85,81
|
||
.word -90,74, -51,100
|
||
|
||
gunfly_l
|
||
LWW GUNRIP1,>4002,0
|
||
LWW GUNRIP2,>4002,0
|
||
LWW GUNRIP3,>4002,0
|
||
LWW GUNRIP4,>4002,0
|
||
LWW GUNRIP5,>4002,0
|
||
LWW GUNRIP4,>4002,M_FLIPV
|
||
LWW GUNRIP3,>4002,M_FLIPV
|
||
LWW GUNRIP2,>4002,M_FLIPV
|
||
LWW GUNRIP1,>4002,M_FLIPV
|
||
LWW GUNRIP2,>4002,M_FLIPV+M_FLIPH
|
||
LWW GUNRIP3,>4002,M_FLIPV+M_FLIPH
|
||
LWW GUNRIP4,>4002,M_FLIPV+M_FLIPH
|
||
LWW GUNRIP5,>4002,M_FLIPV+M_FLIPH
|
||
LWW GUNRIP4,>4002,M_FLIPH
|
||
LWW GUNRIP3,>4002,M_FLIPH
|
||
LWW GUNRIP2,>4002,M_FLIPH
|
||
gunflyend
|
||
.long 0
|
||
|
||
|
||
********************************
|
||
* Hit the eyes
|
||
* A3=Damage
|
||
* A8=*Eye object
|
||
* A9=*Boss data struct for part
|
||
* A11=*Bullet obj
|
||
|
||
rteyeblo
|
||
cmpi 32,a3 ;32 or higher=destroyed
|
||
jrlo eyebx
|
||
movk 1,a2
|
||
move a2,@reyestat ;set blown flag
|
||
jruc eyeb30
|
||
|
||
lfteyeblo
|
||
cmpi 32,a3 ;32 or higher=destroyed
|
||
jrlo eyebx
|
||
movk 1,a2
|
||
move a2,@leyestat ;set blown flag
|
||
|
||
eyeb30 movi 60*7,a2
|
||
; movi 60*8,a2
|
||
callr set_bloflg
|
||
CREATE BOSSPID,eye_blow
|
||
movi >1500,a1
|
||
callr boss_scorebonusword
|
||
eyebx rets
|
||
|
||
|
||
********************************
|
||
* Start blowup of little head
|
||
* A8=*Arm object
|
||
* A9=*Boss data struct for part
|
||
* A11=*Bullet obj
|
||
|
||
SUBRP head_startblow
|
||
|
||
PUSH a7,a9,a10,a11
|
||
|
||
movi 60*7,a2 ;Set effect lockout flag
|
||
; movi 60*8,a2 ;Set effect lockout flag
|
||
callr set_bloflg
|
||
movi >1500,a1
|
||
callr boss_scorebonusword
|
||
movk 1,a0
|
||
move a0,@hdstat ;Set blown flag
|
||
move @hdani_p,a0,L ;>Kill HD process
|
||
jrz hsb30
|
||
calla KILL
|
||
clr a0
|
||
move a0,@hdani_p,L
|
||
|
||
hsb30 CREATE BOSSPID,head_blow
|
||
|
||
PULL a7,a9,a10,a11
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Start shoulder destruction
|
||
* A8=*Shoulder obj
|
||
* A9=*Boss data struct for part
|
||
* A11=*Bullet obj
|
||
|
||
SUBRP shldr_startblow
|
||
|
||
PUSH a7,a9,a10,a11
|
||
|
||
; movi 60*15,a2
|
||
movi 60*12,a2
|
||
callr set_bloflg
|
||
movi >1500,a1
|
||
callr boss_scorebonusword
|
||
movi 100,a0
|
||
move a0,@shldrstat ;Set blown and hits required for biggy
|
||
|
||
ssb50 CREATE BOSSPID,shldr_blow
|
||
|
||
PULL a7,a9,a10,a11
|
||
rets
|
||
|
||
********************************
|
||
* Start the body explosion
|
||
* A8=*Any big death object
|
||
* A9=*Boss data struct for part
|
||
* A11=*Bullet obj
|
||
|
||
SUBRP body_startblow
|
||
|
||
PUSH a7,a9,a10,a11
|
||
|
||
movi 60*4,a2
|
||
; movi 60*5,a2
|
||
callr set_bloflg
|
||
movi >2500,a1 ;2500 pts!
|
||
callr boss_scorebonusword
|
||
movk 1,a0
|
||
move a0,@bodystat ;Blown!
|
||
|
||
callr bossjump_center
|
||
|
||
movi BOSSPID|SUBANI,a0 ;Kill any animations
|
||
calla KIL1C
|
||
movi BOSSPID|SUBNOSEF,a0 ;Kill nose flamer
|
||
calla KIL1C
|
||
movi BOSSPID|SUBWEAPON,a0
|
||
calla KIL1C
|
||
|
||
CREATE BOSSPID,body_blow
|
||
|
||
PULL a7,a9,a10,a11
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Blow out an eye (Process)
|
||
* A8=*Eye object
|
||
* A9=*Boss data struct for part
|
||
|
||
SUBRP eye_blow
|
||
|
||
movk 32,a3
|
||
callr damage_setalways ;Show gunk
|
||
|
||
callr bossjump_center
|
||
movi myeyesnd,a0
|
||
calla ONESNDOVR
|
||
CREATE BOSSPID,eye_bleed
|
||
|
||
movi 70-15,a6
|
||
eb100 movi >ff,a0
|
||
callr rnd
|
||
subi >7f,a0
|
||
move a0,a10 ;X
|
||
movi >7f,a0
|
||
callr rnd
|
||
move a0,a11 ;Y
|
||
movi eye_l,a9
|
||
movk 3,a0
|
||
callr rnd
|
||
jrnz eb200
|
||
movi bld_l,a9
|
||
eb200 CREATE BOSSPID,mortar_releye
|
||
move a6,a11
|
||
SLEEPK 3+1
|
||
move a11,a6
|
||
|
||
cmpi 45-10,a6
|
||
jreq eb300
|
||
cmpi 20-10,a6
|
||
jrne eb300
|
||
eb250 movi myeyesnd,a0
|
||
calla ONESNDOVR
|
||
|
||
eb300 callr damage_react2 ;Pain!
|
||
movi exp1snd,a0
|
||
calla ONESND
|
||
movk 6,a0
|
||
callr boss_addrndxy ;Shake!
|
||
dsj a6,eb100
|
||
SLEEP 160
|
||
movk 1,a0
|
||
move a0,@bloflg ;Enable weapons
|
||
DIE
|
||
|
||
|
||
|
||
eye_l .long 0
|
||
EYEFLY LW I1,1
|
||
LW I2,2
|
||
LW I3,4
|
||
LW I4,8
|
||
LW I5,12
|
||
LW I6,14
|
||
LWW I6,FLIPBITS|14,M_FLIPH
|
||
LW I5,12
|
||
LW I4,8
|
||
LW I3,4
|
||
LW I2,2
|
||
LWL0 I1,1
|
||
.word DMAWNZ+M_NOCOLL
|
||
.long bldsplt_l
|
||
|
||
|
||
********************************
|
||
* Shoot blood from the eye
|
||
* A8=*Eye obj
|
||
|
||
SUBRP eye_bleed
|
||
|
||
movi 60*5/2,a11
|
||
eblp move a11,a5
|
||
movi blooddn_t,a9
|
||
move *a8(OXPOS),a10
|
||
addk 16,a10
|
||
move *a8(OFLAGS),a0
|
||
btst B_FLIPH,a0
|
||
jrz eb70
|
||
addk 8,a10
|
||
eb70 move *a8(OYPOS),a11
|
||
subk 8,a11 ;3
|
||
CREATE BOSSPID,mk_objbvfranim
|
||
move a5,a11
|
||
SLEEPK 1+1
|
||
dsj a11,eblp
|
||
|
||
DIE
|
||
|
||
|
||
|
||
********************************
|
||
* Blow off the lil head (Process)
|
||
* A8=*Head object
|
||
* A9=*Boss data struct for part
|
||
|
||
SUBRP head_blow
|
||
|
||
PUSHP a9
|
||
|
||
callr bossjump_center
|
||
|
||
movi 60*5,a6
|
||
hb100 movi head_t,a9
|
||
move *a8(OXPOS),a10
|
||
move *a8(OYPOS),a11
|
||
addk 22,a10
|
||
CREATE BOSSPID,mk_objfranim
|
||
movk 7,a0
|
||
and a6,a0
|
||
jrnz hb200
|
||
callr head_blowbld
|
||
|
||
hb200 move a6,a9
|
||
SLEEPK 1
|
||
move a9,a6
|
||
movi myheadsnd,a0
|
||
calla ONESND
|
||
callr damage_react2 ;Pain!
|
||
movi exp1snd,a0
|
||
calla ONESND
|
||
movi exp2snd,a0
|
||
calla ONESND
|
||
movk 8,a0
|
||
callr boss_addrndxy ;Shake!
|
||
clr a1
|
||
movi >8000,a2
|
||
callr boss_addxy
|
||
dsj a6,hb100
|
||
|
||
PULLP a9
|
||
movk 32,a3
|
||
callr damage_setalways
|
||
movi hdblo_seq,a9
|
||
callr aniboss ;Show gunk
|
||
movk 1,a0
|
||
move a0,@bloflg ;Enable weapons
|
||
|
||
movi 60*6/8,a6
|
||
hb300 callr head_blowbld
|
||
move a6,a9
|
||
SLEEPK 8
|
||
move a9,a6
|
||
dsj a6,hb300
|
||
|
||
DIE
|
||
|
||
|
||
SUBRP head_blowbld
|
||
|
||
movi >ff,a0
|
||
callr rnd
|
||
subi >7f,a0
|
||
move a0,a10 ;X
|
||
movi >7f,a0
|
||
callr rnd
|
||
move a0,a11 ;Y
|
||
movi bld_l,a9
|
||
CREATE BOSSPID,mortar_relhd
|
||
rets
|
||
|
||
|
||
|
||
head_t .long head_l
|
||
.word 190,->300,>300,->500,->100
|
||
head_l
|
||
LW FLYHD1,2
|
||
LW FLYHD2,2
|
||
LW FLYHD3,2
|
||
LW FLYHD4,2
|
||
LW FLYHD5,2
|
||
LW FLYHD6,2
|
||
LWW FLYHD6,FLIPBITS+2,M_FLIPH
|
||
LW FLYHD5,2
|
||
LW FLYHD4,2
|
||
LW FLYHD3,2
|
||
LW FLYHD2,2
|
||
LW FLYHD1,2
|
||
LWLW OKBM1,NEWPALET+DELTAY+3,GRNBOOM,25
|
||
LW OKBM2,3
|
||
LW OKBM3,3
|
||
LW OKBM4,3
|
||
LW OKBM5,3
|
||
LW OKBM6,3
|
||
LWL0 OKBM7,3
|
||
|
||
|
||
|
||
bld_l .long 0
|
||
LW BLD1,1
|
||
LW BLD2,2
|
||
LW BLD3,4
|
||
LW BLD4,8
|
||
LW BLD5,12
|
||
LW BLD6,14
|
||
LWW BLD6,FLIPBITS|14,M_FLIPH
|
||
LW BLD5,12
|
||
LW BLD4,8
|
||
LW BLD3,4
|
||
LW BLD2,2
|
||
LWL0 BLD1,1
|
||
.word DMAWNZ+M_NOCOLL
|
||
.long bldsplt_l
|
||
|
||
|
||
bldsplt_l
|
||
LWL BLDSPLT1,NEWPALET+6,RIPAL
|
||
LW BLDSPLT2,6
|
||
LWL0 BLDSPLT3,6
|
||
|
||
|
||
********************************
|
||
* Blow off the shoulders (Process)
|
||
* A8=*Shoulder object
|
||
* A9=*Boss data struct for part
|
||
|
||
SUBRP shldr_blow
|
||
|
||
PUSHP a9
|
||
|
||
callr bossjump_center
|
||
movi stvpainsnd,a0
|
||
calla ONESNDOVR
|
||
|
||
movi 60*5,a6
|
||
sb100
|
||
move @bossd_t,a11,L ;Get * 1st obj
|
||
move *a11(OXPOS),a10
|
||
addi AX+2,a10 ;+Ani pt X offset
|
||
move *a11(OYPOS),a11
|
||
subi 40,a11
|
||
movk 3,a0
|
||
and a6,a0
|
||
jrnz sb150
|
||
movi shldrexp_t,a9 ;>Explosion
|
||
CREATE BOSSPID,mk_objfranim
|
||
sb150 addi AY+40,a11
|
||
movi shldrl_t,a9 ;>Alternate LR shoulder
|
||
btst 0,a6
|
||
jrz sb200
|
||
movi shldrr_t,a9
|
||
sb200 CREATE BOSSPID,mk_objfranim
|
||
movk 7,a0
|
||
and a6,a0
|
||
jrnz sb300
|
||
movi >ff,a0
|
||
callr rnd
|
||
subi >7f,a0
|
||
move a0,a10 ;X
|
||
movi >7f,a0
|
||
callr rnd
|
||
move a0,a11 ;Y
|
||
movi bld_l,a9
|
||
CREATE BOSSPID,mortar_relbshldr
|
||
|
||
sb300 move a6,a9
|
||
SLEEPK 1
|
||
move a9,a6
|
||
callr damage_react2 ;Pain!
|
||
movi exp1snd,a0
|
||
calla ONESND
|
||
movi exp2snd,a0
|
||
calla ONESND
|
||
movk 8,a0
|
||
callr boss_addrndxy ;Shake!
|
||
clr a1
|
||
movi >c000,a2
|
||
callr boss_addxy
|
||
dsj a6,sb100
|
||
|
||
|
||
PULLP a9
|
||
movk 32,a3
|
||
callr damage_setalways
|
||
movi shldrblo_seq,a9
|
||
callr aniboss ;Show gunk
|
||
movk 1,a0
|
||
move a0,@bloflg ;Enable weapons
|
||
|
||
|
||
movi 60*4/10,a6
|
||
sb600 movi >ff,a0
|
||
callr rnd
|
||
subi >7f,a0
|
||
move a0,a10 ;X
|
||
movi >7f,a0
|
||
callr rnd
|
||
move a0,a11 ;Y
|
||
movi bld_l,a9
|
||
CREATE BOSSPID,mortar_relbshldr
|
||
move a6,a9
|
||
movk 7,a0
|
||
callr rnd
|
||
addk 10,a0 ;10-17
|
||
calla PRCSLP
|
||
move a9,a6
|
||
dsj a6,sb600
|
||
|
||
DIE
|
||
|
||
|
||
shldrexp_t
|
||
.long XBOOM2
|
||
.word 190,->800,>800,->800,0
|
||
shldrl_t
|
||
.long shldrl_l
|
||
.word 190,->800,->200,->400,0
|
||
shldrr_t
|
||
.long shldrr_l
|
||
.word 190,>200,>800,->400,0
|
||
|
||
shldrr_l
|
||
LWW SHLDR,FLIPBITS+1,M_FLIPH
|
||
shldrl_l
|
||
LW SHLDR,15
|
||
LWLW OKBM1,NEWPALET+DELTAY+3,GRNBOOM,50
|
||
LW OKBM2,3
|
||
LW OKBM3,3
|
||
LW OKBM4,3
|
||
LW OKBM5,3
|
||
LW OKBM6,3
|
||
LWL0 OKBM7,3
|
||
|
||
|
||
|
||
********************************
|
||
* Blow the body apart (Process)
|
||
|
||
SUBRP body_blow
|
||
|
||
movk 1,a0
|
||
move a0,@ICONS_DN ;Stop icons from coming out
|
||
|
||
SLEEP 60
|
||
movi stvpainsnd,a0
|
||
calla ONESNDOVR
|
||
move @bossd_t,a8,L ;A8=*1st obj
|
||
|
||
movi 60*12,a6
|
||
bb200 cmpi 60*8,a6
|
||
jrlo bb220 ;Do blows?
|
||
btst 0,a6
|
||
jrnz bb250
|
||
move *a8(OXPOS),a10
|
||
addi AX+2,a10 ;+Ani pt X offset
|
||
move *a8(OYPOS),a11
|
||
movi bodyexp1_t,a9 ;>Explosion
|
||
CREATE BOSSPID,mk_objfranim
|
||
movi exp1snd,a0
|
||
calla ONESND
|
||
movi exp2snd,a0
|
||
calla ONESND
|
||
jruc bb250
|
||
|
||
bb220 move a6,a0
|
||
srl 6,a0 ;/64
|
||
jrz bb230 ;Always?
|
||
callr rndrng0
|
||
move a0,a0
|
||
jrnz bb250 ;Skip?
|
||
bb230 callr body_blowone
|
||
bb250 movi >3f,a0
|
||
callr rnd
|
||
jrnz bb260 ;Skip pain snd?
|
||
movi stvpainsnd,a0
|
||
calla ONESND
|
||
bb260 movk 10,a0
|
||
callr boss_addrndxy ;Shake!
|
||
cmpi 60*5,a6
|
||
jreq bb265
|
||
cmpi 60*2,a6
|
||
jrne bb270
|
||
bb265 callr bossjump_center
|
||
bb270 move a6,a9
|
||
SLEEPK 1
|
||
move a9,a6
|
||
dsj a6,bb200
|
||
|
||
|
||
movi bodyblo_seq,a9
|
||
callr aniboss ;Show blown out base
|
||
|
||
movi bossd_t,a3,L ;NOCOLL on parts except base
|
||
jruc bb450
|
||
bb400 move *a2(OIMG),a1,L
|
||
cmpi NUSHAD,a1
|
||
jreq bb440 ;Shadow?
|
||
cmpi BASERIP,a1
|
||
jrne bb420 ;!Rip?
|
||
movi CLSNEUT|TYPTRUNK,a0
|
||
move a0,*a2(OID)
|
||
jruc bb430
|
||
bb420 move *a2(OFLAGS),a0
|
||
ori M_NOCOLL,a0
|
||
move a0,*a2(OFLAGS)
|
||
bb430 movi 151,a0
|
||
move a0,*a2(OZPOS)
|
||
bb440 addk 32,a3
|
||
bb450 move *a3+,a2,L
|
||
jrnz bb400 ;More?
|
||
|
||
|
||
movk 1,a0
|
||
move a0,@NOSHOOT ;Don't let plyrs shoot
|
||
|
||
CREATE0 body_bubblesnd
|
||
PUSHP a0
|
||
|
||
movi 60*7/2,a6 ;Big bog
|
||
|
||
bb500 btst 0,a6
|
||
jrnz bb550
|
||
movi >7f,a0
|
||
callr rnd
|
||
subi >3f,a0
|
||
move a0,a10 ;X
|
||
movi >3f,a0
|
||
callr rnd
|
||
move a0,a11 ;Y
|
||
movi bld_l,a9
|
||
CREATE BOSSPID,mortar_relbbase
|
||
|
||
bb550 move *a8(OXPOS),a10
|
||
addi AX+10,a10 ;+Ani pt X offset
|
||
move *a8(OYPOS),a11
|
||
addk 30,a11
|
||
movi bloodc_t,a9
|
||
CREATE BOSSPID,mk_objfranim
|
||
CREATE BOSSPID,mk_objfranim
|
||
btst 0,a6
|
||
jrnz bb570
|
||
CREATE BOSSPID,mk_objfranim
|
||
|
||
bb570 move a6,a9
|
||
calla YZSORT
|
||
calla YZSORT
|
||
calla YZSORT
|
||
SLEEPK 1
|
||
move a9,a6
|
||
dsj a6,bb500
|
||
|
||
PULLP a0
|
||
calla KILL
|
||
|
||
SLEEP 60*1
|
||
movi LOVEIT,a0 ;I love it speech
|
||
calla ONESND
|
||
|
||
SLEEP 60*1 ;Clean up and do rackup
|
||
clr a0
|
||
move a0,@WAVE ;So BNC_PLYR works on the limo!
|
||
CREATE0 LIMO ;Dictator drives by!
|
||
SLEEP 60*2
|
||
|
||
|
||
movi youwillsnd,a0
|
||
calla ONESND
|
||
|
||
clr a0
|
||
move a0,@WRLD
|
||
movi >3e3e,a6 ;Cycle color
|
||
movi bombs_s,a8
|
||
movi [100,>bc],a9 ;YX
|
||
movk 2,a10 ;y,x spacing between charcters
|
||
movi RD15FONT,a11
|
||
JSRP STRCNRMO
|
||
|
||
move @P1DATA+BMBSUSED,a0
|
||
move @P2DATA+BMBSUSED,a8
|
||
add a0,a8
|
||
move @bombtotal,a0
|
||
sub a0,a8
|
||
calla HEXTOASC
|
||
clr a0
|
||
movi >3e3e,a6 ;Cycle color
|
||
movi [100,>140],a9 ;YX
|
||
JSRP STRLNRMO
|
||
|
||
SLEEP 60*4
|
||
movk 16,a0
|
||
move a0,@WAVE ;Normal
|
||
movi BOSSPID,a0
|
||
movi >ff,a1
|
||
calla KILALLN
|
||
calla TRY_RCK
|
||
DIE
|
||
|
||
|
||
bloodc_t
|
||
.long bldclt_l
|
||
.word 250,->b0,>b0,->b0,>b0
|
||
|
||
bombs_s .byte "BOMBS USED ON ORCUS:",0
|
||
.even
|
||
|
||
|
||
SUBRP body_bubblesnd
|
||
|
||
bbslp movi bubl1snd,a0
|
||
calla ONESND
|
||
SLEEPK 20
|
||
movi bubl2snd,a0
|
||
calla ONESND
|
||
SLEEPK 20
|
||
jruc bbslp
|
||
|
||
|
||
SUBRP body_blowone
|
||
|
||
move *a8(OXPOS),a10
|
||
addi AX+2,a10 ;+Ani pt X offset
|
||
move *a8(OYPOS),a11
|
||
movk 1,a0
|
||
callr rnd
|
||
jrnz bbo160 ;Skip?
|
||
movi bodyexp1_t,a9 ;>Explosion
|
||
movk 1,a0
|
||
callr rnd
|
||
jrnz bbo150
|
||
movi bodyexp2_t,a9
|
||
bbo150 CREATE BOSSPID,mk_objfranim
|
||
|
||
bbo160 addi AY,a11 ;>Alternate LR shoulder
|
||
movi bshldrl_t,a9
|
||
movk 1,a0
|
||
callr rnd
|
||
jrnz bbo200
|
||
movi bshldrr_t,a9
|
||
bbo200 CREATE BOSSPID,mk_objfranim
|
||
|
||
movi beyel_t,a9 ;>Alt LR eye
|
||
movk 1,a0
|
||
callr rnd
|
||
jrnz bbo250
|
||
movi beyer_t,a9
|
||
bbo250 CREATE BOSSPID,mk_objfranim
|
||
|
||
movi bmthl_t,a9 ;>Alt LR mouth
|
||
movk 1,a0
|
||
callr rnd
|
||
jrnz bbo300
|
||
movi bmthr_t,a9
|
||
bbo300 CREATE BOSSPID,mk_objfranim
|
||
|
||
movi exp1snd,a0
|
||
calla ONESND
|
||
movi exp2snd,a0
|
||
calla ONESND
|
||
|
||
rets
|
||
|
||
|
||
bodyexp1_t
|
||
.long XBOOM2
|
||
.word 191,->800,>800,->800,>800
|
||
bodyexp2_t
|
||
.long explb_l
|
||
.word 191,->800,>800,->800,>800
|
||
|
||
explb_l
|
||
LWLW EXPL1,NEWPALET+DELTAY+3,BLUBOOM,50
|
||
LW EXPL2,3
|
||
LW EXPL3,3
|
||
LW EXPL4,3
|
||
LW EXPL5,3
|
||
LW EXPL6,3
|
||
LW EXPL7,3
|
||
LW EXPL8,3
|
||
LW EXPL9,3
|
||
LW EXPL10,3
|
||
LWL0 EXPL11,3
|
||
|
||
bshldrl_t
|
||
.long bshldrl_l
|
||
.word 190,->500,->40,->600,->40
|
||
bshldrr_t
|
||
.long bshldrr_l
|
||
.word 190,>40,>500,->600,->40
|
||
bshldrr_l
|
||
LWW TOPRIP,FLIPBITS+1,M_FLIPH
|
||
bshldrl_l
|
||
LW TOPRIP,15
|
||
LWLW OKBM1,NEWPALET+DELTAY+3,GRNBOOM,50
|
||
LW OKBM2,3
|
||
LW OKBM3,3
|
||
LW OKBM4,3
|
||
LW OKBM5,3
|
||
LW OKBM6,3
|
||
LWL0 OKBM7,3
|
||
|
||
|
||
beyel_t .long beyel_l
|
||
.word 190,->800,->40,->300,>300
|
||
beyer_t .long beyer_l
|
||
.word 190,>40,>800,->300,>300
|
||
|
||
beyer_l LWW OEYES1C,FLIPBITS+1,M_FLIPH
|
||
beyel_l LW OEYES1C,15
|
||
LWLW OKBM1,NEWPALET+DELTAY+3,BLUBOOM,50
|
||
LW OKBM2,3
|
||
LW OKBM3,3
|
||
LW OKBM4,3
|
||
LW OKBM5,3
|
||
LW OKBM6,3
|
||
LWL0 OKBM7,3
|
||
|
||
|
||
bmthl_t .long bmthl_l
|
||
.word 190,->800,->40,->80,>600
|
||
bmthr_t .long bmthr_l
|
||
.word 190,>40,>800,->80,>600
|
||
|
||
bmthr_l LWW OMTH4B,FLIPBITS+1,M_FLIPH
|
||
bmthl_l LW OMTH4B,15
|
||
LWLW OKBM1,NEWPALET+DELTAY+3,RDBOOM,50
|
||
LW OKBM2,3
|
||
LW OKBM3,3
|
||
LW OKBM4,3
|
||
LW OKBM5,3
|
||
LW OKBM6,3
|
||
LWL0 OKBM7,3
|
||
|
||
|
||
|
||
********************************
|
||
* Mortar shot (Process)
|
||
|
||
APTRPD msobj_p ,0 ;*Mortar shadow object
|
||
LONGPD mzpos ,2 ;
|
||
LONGPD mzvel ,4 ;
|
||
|
||
MZ .set 158
|
||
MZA .set >1800
|
||
|
||
GRUNTMODE equ 1
|
||
|
||
|
||
SUBR mortar_akhboob ;A8=*Src Obj
|
||
|
||
movi 160,a0
|
||
move @STATUS,a1
|
||
subk 3,a1
|
||
jreq makb50 ;2 plyrs?
|
||
movi 88,a0
|
||
makb50 calla RNDRNGS
|
||
move a0,a10 ;X
|
||
movi >2f,a0
|
||
callr rndrng0
|
||
addi 65,a0
|
||
move a0,a11 ;Y
|
||
movi akhbjmp_l,a9
|
||
movk 24,a0
|
||
movi 76,a1
|
||
jruc ms5
|
||
|
||
|
||
akhbjmp_l
|
||
.long 0 ;82
|
||
LWL0 ABOOBJUMP,82
|
||
.word DMAWNZ
|
||
.long GRUNTMODE
|
||
|
||
|
||
SUBR MORTAR_GRNT ;A8=*Src Obj
|
||
|
||
movi >7f,a0
|
||
callr rnd
|
||
subi >3f,a0
|
||
move a0,a10 ;X
|
||
movi >28,a0
|
||
callr rnd
|
||
addi 60,a0
|
||
move a0,a11 ;Y
|
||
movi grnt_l,a9
|
||
movi >4c,a0
|
||
movi >28,a1
|
||
jruc ms5
|
||
|
||
grnt_l .long 0 ;82
|
||
LW FLMUP1,2
|
||
LW FLMUP2,2
|
||
LW FLMUP3,2
|
||
LW FLMUP4,2
|
||
LW FLMUP5,2
|
||
LW FLMUP6,2
|
||
LW FLMUP1,2
|
||
LW FLMUP2,2
|
||
LW FLMUP3,2
|
||
LW FLMUP4,2
|
||
LW FLMUP5,2
|
||
LW FLMUP6,2
|
||
LW FLMUP1,2
|
||
LW FLMUP2,2
|
||
LW FLMUP3,2
|
||
LW FLMUP4,2
|
||
LW FLMUP5,2
|
||
LW FLMUP6,2
|
||
LW FLMUP1,2
|
||
LW FLMUP2,2
|
||
LW FLMUP3,2
|
||
LW FLMUP4,2
|
||
LW FLMUP5,2
|
||
LW FLMUP6,2
|
||
LW FLMUP1,2
|
||
LW FLMUP2,2
|
||
LW FLMUP3,2
|
||
LW FLMUP4,2
|
||
LW FLMUP5,2
|
||
LW FLMUP6,2
|
||
LW FLMUP1,2
|
||
LW FLMUP2,2
|
||
LW FLMUP3,2
|
||
LW FLMUP4,2
|
||
LW FLMUP5,2
|
||
LW FLMUP6,2
|
||
LW FLMUP1,2
|
||
LW FLMUP2,2
|
||
LW FLMUP3,2
|
||
LW FLMUP4,2
|
||
LWL0 FLMUP5,2
|
||
.word DMAWNZ
|
||
.long GRUNTMODE
|
||
|
||
|
||
SUBRP mortar_relbshldr ;A9=*Obj_l, A10=Dest XOffset, A11=DYO
|
||
|
||
move @bossd_t,a8,L ;Get * 1st obj
|
||
movi AX+2,a0 ;+Ani pt X offset
|
||
movi -22,a1
|
||
jruc ms5
|
||
|
||
SUBRP mortar_relbbase ;A9=*Obj_l, A10=Dest XOffset, A11=DYO
|
||
|
||
move @bossd_t,a8,L ;Get * 1st obj
|
||
movi AX+14,a0 ;+Ani pt X offset
|
||
movi 50,a1
|
||
jruc ms5
|
||
|
||
SUBRP mortar_releye ;A8=*Src Obj, A9=*Obj_l, A10=DXOffset, A11=DYO
|
||
|
||
movk 24,a0
|
||
movk 19,a1
|
||
jruc ms5
|
||
|
||
SUBRP mortar_relaboss ;A8=*Src Obj, A9=*Obj_l, A10=DXOffset, A11=DYO
|
||
|
||
movk 24,a0
|
||
movk 32,a1
|
||
jruc ms5
|
||
|
||
SUBRP mortar_relhd ;A8=*Src Obj, A9=*Obj_l, A10=DXOffset, A11=DYO
|
||
|
||
movk 26,a0
|
||
movk 30,a1
|
||
|
||
ms5 move *a8(OXPOS),a2 ;Get X
|
||
add a2,a0
|
||
move *a8(OYPOS),a2 ;Get Y
|
||
add a2,a1
|
||
|
||
move a0,a6
|
||
move a1,a7
|
||
|
||
add a10,a6 ;+X offset
|
||
add a11,a7 ;+Y offset
|
||
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 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 clr a3 ;Z
|
||
movi DMAWNZ+M_NOCOLL,a4 ;No collisions
|
||
movi CLSDEAD,a5
|
||
move a9,a10
|
||
addk 32,a10
|
||
move *a10,a2,L ;Get *1st obj
|
||
mmtm a12,a0,a1,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,a4,a6,a7
|
||
movi SHADW,a2
|
||
movi 70,a3 ;Z
|
||
movi CLSDEAD,a5
|
||
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(mzpos),L
|
||
movi 41*MZA,a0
|
||
move a0,*a13(mzvel),L
|
||
jruc ms400
|
||
|
||
|
||
ms300 move *a8(OFLAGS),a4 ;No collisions
|
||
move *a9+,a10 ;Get #ticks for frame
|
||
cmpi >100,a10
|
||
jrlo ms330
|
||
move *a9+,a2 ;Get the new flip flags
|
||
andni (M_FLIPV+M_FLIPH),a4 ;Clear the current flip status
|
||
or a2,a4 ;Set desired bits
|
||
sll 32-8,a10
|
||
srl 32-8,a10
|
||
ms330 calla ANI ;New 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(mzvel),a1,L
|
||
subi MZA,a1 ;Gravity
|
||
move *a13(mzpos),a0,L ;New height
|
||
add a1,a0
|
||
jrgt ms370
|
||
clr a0
|
||
neg a1
|
||
ms370 move a0,*a13(mzpos),L
|
||
move a1,*a13(mzvel),L
|
||
srl 16,a0
|
||
move *a5(OYPOS),a1
|
||
sub a0,a1
|
||
sub a7,a1
|
||
move a1,*a8(OYPOS) ;Set shot Y
|
||
addi MZ+130,a0
|
||
move a0,*a8(OZPOS)
|
||
SLEEPK 1
|
||
dsj a10,ms350
|
||
|
||
ms400 move *a9+,a1,L ;Get *Img
|
||
jrnz ms300
|
||
|
||
|
||
move *a13(msobj_p),a0,L ;Kill shadow
|
||
calla DELOBJ
|
||
|
||
movi 51,a0
|
||
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
|
||
cmpi GRUNTMODE,a9
|
||
jaz RUN_AWAY ;Flaming grunt runs away!
|
||
JSRP FRANIMQ ;Land
|
||
|
||
ms880 calla DELOBJA8
|
||
ms900 DIE
|
||
|
||
|
||
********************************
|
||
* Get animation offset
|
||
* A0=*Obj
|
||
*
|
||
* Rets: A6=X Anim offset
|
||
* A7=Y Anim offset
|
||
* Trash A1,A2
|
||
|
||
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
|
||
|
||
|
||
********************************
|
||
* Make an obj with boss vel, franim and delete (Process)
|
||
* A9=*Data table
|
||
* A10=X
|
||
* A11=Y
|
||
|
||
SUBRP mk_objbvfranim
|
||
|
||
move @bossxv,a6,L
|
||
move @bossyv,a7,L
|
||
jruc mofbv
|
||
|
||
********************************
|
||
* Make an obj, franim and delete (Process)
|
||
* A9=*Data table
|
||
* A10=X
|
||
* A11=Y
|
||
|
||
SUBR mk_objfranim
|
||
|
||
clr a6
|
||
clr a7
|
||
mofbv move a9,a5
|
||
move *a5+,a9,L ;*FRANIM_l
|
||
move *a9,a2,L ;*IMG
|
||
move *a5+,a3 ;Z
|
||
move *a5+,a0
|
||
move *a5+,a1
|
||
calla RNDRNG
|
||
sll 8,a0 ;*256
|
||
add a0,a6 ;XV
|
||
move *a5+,a0
|
||
move *a5+,a1
|
||
calla RNDRNG
|
||
sll 8,a0 ;*256
|
||
add a0,a7 ;YV
|
||
move a10,a0
|
||
move a11,a1
|
||
sll 16,a0 ;X
|
||
sll 16,a1 ;Y
|
||
movi DMAWNZ+M_NOCOLL,a4 ;No collisions
|
||
movi CLSDEAD,a5
|
||
calla BEGINOBJ2
|
||
jauc FRQDELDIE
|
||
|
||
|
||
|
||
********************************
|
||
* Smoke puff trail (Process)
|
||
* A8=*Src obj
|
||
|
||
SUBRP make_smoketrail
|
||
|
||
movi okbmg_l,a9
|
||
move *a8(OZPOS),a3
|
||
addk 1,a3
|
||
|
||
move *a8(OXVEL),a6,L
|
||
move *a8(OYVEL),a7,L
|
||
sra 1,a6
|
||
sra 1,a7
|
||
|
||
move *a8(OXPOS),a0
|
||
move *a8(OSIZEX),a2
|
||
srl 1,a2 ;/2
|
||
add a2,a0
|
||
move *a8(OYPOS),a1
|
||
move *a8(OSIZEY),a2
|
||
srl 1,a2 ;/2
|
||
add a2,a1
|
||
sll 16,a0 ;X
|
||
sll 16,a1 ;Y
|
||
movi CLD1A,a2
|
||
movi DMAWNZ+M_NOCOLL,a4 ;No collisions
|
||
movi CLSDEAD,a5
|
||
calla BEGINOBJ2
|
||
jauc FRQDELDIE
|
||
|
||
|
||
okbmg_l LWL OKBM1,NEWPALET+4,GREYPAL
|
||
LW OKBM2,4
|
||
LW OKBM3,4
|
||
LW OKBM4,4
|
||
LW OKBM5,4
|
||
LW OKBM6,4
|
||
LWL0 OKBM7,4
|
||
|
||
|
||
********************************
|
||
* Transfer damage on a dead part to other parts
|
||
* A2=Hit amount
|
||
* A9=*Boss data struct for part
|
||
* A11=*Bullet obj
|
||
|
||
SUBRP damage_xfer
|
||
|
||
PUSH a2,a3,a4,a8,a9
|
||
movk 3,a0 ;25%
|
||
callr rnd
|
||
jrnz dxx ;Skip it?
|
||
|
||
subi bossd_t,a9
|
||
srl 6,a9 ;/64
|
||
cmpi 14,a9
|
||
jrhs dxx ;Not in table?
|
||
sll 3,a9 ;*8
|
||
addi damxfer_t,a9
|
||
movb *a9,a9
|
||
jrn dxx ;No xfer part?
|
||
sll 6,a9 ;*64
|
||
addi bossd_t-64,a9 ;1st is 1
|
||
move *a9,a8,L
|
||
move *a9(BODAM),a3
|
||
cmpi 47,a3
|
||
jrhs dxx
|
||
add a2,a3
|
||
callr boss_chknblowpart
|
||
cmpi 47,a3
|
||
jrls dx20
|
||
movi 47,a3
|
||
dx20 callr damage_set
|
||
movi >1f1f0000,a9
|
||
CREATE0 FLASHME
|
||
|
||
dxx PULL a2,a3,a4,a8,a9
|
||
rets
|
||
|
||
|
||
damxfer_t
|
||
.byte SIDEL,SIDER,EYEL,EYER,LILHD,LILHD
|
||
.byte -1,-1,SHLDRL,-1,-1,-1,-1,SHLDRR
|
||
|
||
|
||
|
||
********************************
|
||
* Set damage amount and do ANI for level
|
||
* A3=Damage
|
||
* A8=*Object hit
|
||
* A9=*Bossdata_t entry
|
||
|
||
SUBRP damage_set
|
||
|
||
move @bloflg,a0
|
||
jrnz dsx2 ;Blow in progress?
|
||
|
||
SUBRP damage_setalways ;Don't chk bloflg
|
||
|
||
PUSH a2,a3,a4
|
||
|
||
cmpi 31,a3
|
||
jrls ds50
|
||
|
||
movb *a8(OID),a0 ;Mouth kludge check...
|
||
cmpi SUBMTHL,a0
|
||
jreq ds20
|
||
cmpi SUBMTHR,a0
|
||
jrne ds50
|
||
|
||
ds20 movi bossd_t+BODAM,a0
|
||
move *a0,a1
|
||
move *a0(64),a2
|
||
movk 31,a3
|
||
add a1,a2
|
||
cmpi 62,a2
|
||
jrlo ds50
|
||
|
||
movk 32,a3
|
||
move a3,*a0
|
||
move a3,*a0(BODAM)
|
||
|
||
ds50 move a3,*a9(BODAM) ;Save new damage
|
||
movb *a9(BOAFRM),a1 ;get frame pointer
|
||
subk 1,a1
|
||
cmpi LSTANI,a1
|
||
jrhs dsx ;Out of range?
|
||
|
||
movi BDAMSIZE,a2
|
||
mpyu a2,a1 ;*Entry size
|
||
addi bossdam_t,a1 ;+Base
|
||
srl 4,a3 ;Damage/16=Level
|
||
sll 5,a3 ;*32
|
||
add a3,a1
|
||
move *a1,a1,L ;OIMG
|
||
move *a8(OFLAGS),a4
|
||
calla ANI
|
||
|
||
dsx PULL a2,a3,a4
|
||
dsx2 rets
|
||
|
||
********************************
|
||
* Check if boss on screen
|
||
*Rets: Z if on screen, Trashes A0-A3
|
||
|
||
SUBRP boss_scrntst
|
||
|
||
PUSH a4,a5,a8
|
||
clr a0
|
||
move @bossd_t,a8,L ;Get * 1st obj
|
||
calla GETANIXY
|
||
sra 16,a2
|
||
sra 16,a3
|
||
move @WORLDTLX+16,a4
|
||
move @WORLDTLY+16,a5
|
||
sub a4,a3 ;X
|
||
sub a5,a2 ;Y
|
||
cmpi 30,a3 ;XMin
|
||
jrlt bst10
|
||
cmpi 370,a3 ;XMax
|
||
jrgt bst10
|
||
cmpi -55,a2 ;YMin
|
||
jrlt bst10
|
||
cmpi 170,a2 ;YMax
|
||
jrle bston
|
||
bst10 movk 1,a0 ;Off screen
|
||
|
||
bston PULL a4,a5,a8
|
||
move a0,a0 ;Set CC
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Missile launcher (Process)
|
||
|
||
SUBRP weapon_launcher
|
||
|
||
wl50 SLEEPK 32
|
||
move @larmstat,a0
|
||
subk 2,a0
|
||
jrls wl50 ;Arm OK?
|
||
move @rarmstat,a0
|
||
subk 2,a0
|
||
jrls wl50 ;^
|
||
|
||
wllp SLEEPK 8
|
||
move @bossmode,a0
|
||
jrnz wllp ;Jump/fire in progress?
|
||
move @bloflg,a0
|
||
jrn wllp ;Blowing?
|
||
; move @HALT,a0
|
||
; jrnz wllp ;Halt?
|
||
|
||
move @bossd_t,a2,L ;Get * 1st obj
|
||
move *a2(OYPOS),a2
|
||
move @WORLDTLY+16,a0
|
||
sub a0,a2
|
||
cmpi 140,a2
|
||
jrgt wllp ;Near bottom?
|
||
|
||
callr getplyr
|
||
jrz wllp ;No player?
|
||
move a0,a11
|
||
movi yowl2snd,a0
|
||
calla ONESND
|
||
movi -1,a0
|
||
move a0,@bossmode ;Neg
|
||
clr a0 ;XO
|
||
movi 120,a1 ;YO
|
||
movi bossd_t,a8
|
||
callr bossseeko_dir32
|
||
subk 9,a0
|
||
jrlt wl200 ;<9
|
||
subk 15,a0
|
||
jrlt wl400 ;<24
|
||
|
||
|
||
wl200 movk 2,a11 ;>Missile
|
||
move @bossd_t+64*14,a8,L ;Tongue obj
|
||
movi missileo_t,a9
|
||
|
||
wl250 movk 4,a0
|
||
callr rndrng0
|
||
addk 14,a0
|
||
move a0,a10 ;14-18
|
||
CREATE BOSSPID,missile_fire
|
||
movi msllnchsnd,a0
|
||
calla ONESND
|
||
SLEEPK 7
|
||
dsj a11,wl250
|
||
|
||
move a11,@bossmode ;Clr
|
||
SLEEP 390
|
||
jruc wllp
|
||
|
||
|
||
wl400 movk 25,a11 ;>Tongue
|
||
move *a8,a8,L ;A8=*1st boss obj
|
||
|
||
wl450 movk 12,a0
|
||
callr rndrng0
|
||
addk 10,a0 ;10-22
|
||
move a0,a10
|
||
CREATE BOSSPID,tongue_fire
|
||
movi tungsnd,a0
|
||
calla ONESND
|
||
SLEEPK 5
|
||
move @bossmode,a0
|
||
jrnn wl490 ;Fire canceled?
|
||
dsj a11,wl450
|
||
|
||
move a11,@bossmode ;Clr
|
||
wl490 SLEEP 200
|
||
jruc wllp
|
||
|
||
|
||
missileo_t
|
||
.word 9,7
|
||
|
||
|
||
********************************
|
||
* Missile, player seeking (Process)
|
||
|
||
WORDPD mslshield,0 ;Shield strength
|
||
WORDPD mslsko,1 ;Seek offset -1/1
|
||
WORDPD msldrag,2 ;Drag shift
|
||
APTRPD mslplyro,3 ;*Plyr leg obj or 0
|
||
|
||
SUBRP missile_dfire ;A8=*Src obj, A9=*Offset_t, A10=Dir 0-31
|
||
|
||
movi 80,a11 ;Fuel
|
||
movk 1,a0 ;Shield
|
||
jruc mif100
|
||
|
||
********************************
|
||
* Ground launched - shots.asm
|
||
|
||
SUBR missile_fire2 ;A8=*Src obj, A9=*Offset_t, A10=Dir 0-31
|
||
|
||
movi 220,a11 ;Fuel
|
||
move *a8(OZPOS),a3
|
||
subk 1,a3 ;Under launcher top obj
|
||
movk 4,a0
|
||
jruc mif110
|
||
|
||
********************************
|
||
* At skilled player - layer.asm
|
||
* A7=*Plyr leg obj, A8=X, A9=Y, A10=Dir, A11=Fuel
|
||
|
||
SUBR missile_firexy_slow
|
||
|
||
movi -4,a0
|
||
movk 20,a1
|
||
jruc mfxy100
|
||
|
||
SUBR missile_firexy ;A8=X, A9=Y, A10=Dir, A11=Fuel
|
||
|
||
movi -5,a0 ;Slow speed
|
||
|
||
abs a11
|
||
jrn mfxy20 ;Fuel pos?
|
||
subk 1,a0 ;Normal speed
|
||
mfxy20
|
||
movk 4,a1
|
||
clr a7
|
||
|
||
mfxy100 move a0,*a13(msldrag)
|
||
move a1,*a13(mslshield)
|
||
movk 1,a0
|
||
callr rnd
|
||
jrnz jet10
|
||
subk 1,a0
|
||
jet10 move a0,*a13(mslsko)
|
||
move a8,a0
|
||
move a9,a1
|
||
movi 159,a3 ;Z
|
||
jruc mif130
|
||
|
||
|
||
********************************
|
||
* Missile from aboss
|
||
|
||
SUBR missile_fireab ;A8=*Src obj, A9=*Offset_t, A10=Dir 0-31
|
||
|
||
movi 100,a11 ;Fuel
|
||
movk 2,a0 ;Shield
|
||
movi 159,a3 ;Z
|
||
jruc mif110
|
||
|
||
|
||
SUBRP missile_fire ;A8=*Src obj, A9=*Offset_t, A10=Dir 0-31
|
||
|
||
movi 400,a11 ;Fuel
|
||
movk 5,a0
|
||
|
||
mif100 move *a8(OZPOS),a3
|
||
addk 1,a3
|
||
|
||
mif110 move a0,*a13(mslshield)
|
||
movk 1,a0
|
||
callr rnd
|
||
jrnz mif120
|
||
subk 1,a0
|
||
mif120 move a0,*a13(mslsko) ;-1 or 1
|
||
movi -6,a0 ;Normal speed
|
||
move a0,*a13(msldrag)
|
||
|
||
move *a8(OXPOS),a0
|
||
move *a8(OYPOS),a1
|
||
move *a9+,a2 ;+X offset
|
||
add a2,a0
|
||
move *a9+,a2 ;+Y offset
|
||
add a2,a1
|
||
|
||
clr a7
|
||
mif130 move a7,*a13(mslplyro),L
|
||
|
||
sll 16,a0
|
||
sll 16,a1
|
||
movi MSLB1,a2 ;Image
|
||
movi DMAWNZ,a4
|
||
movi CLSENMY+TYPSL+SUBMSL,a5
|
||
clr a6
|
||
clr a7
|
||
calla BEGINOBJ2
|
||
|
||
movk 25,a9 ;Seek delay
|
||
jruc mif400
|
||
|
||
|
||
mif200 SLEEPK 1
|
||
; move @HALT,a0
|
||
; jrnz mif200 ;Freeze?
|
||
|
||
subk 1,a9
|
||
jrlt mif220
|
||
jrgt mif500 ;Don't seek?
|
||
movi 159,a0
|
||
move a0,*a8(OZPOS)
|
||
|
||
mif220 movk 1,a0
|
||
and a11,a0
|
||
jrnz mif230 ;No smoke?
|
||
cmpi 30,a11
|
||
jrlt mif230 ;Low fuel?
|
||
CREATE0 missile_smoketrail
|
||
|
||
mif230 movk 3,a0
|
||
callr rnd
|
||
jrz mif500 ;Skip seek?
|
||
|
||
move *a13(mslplyro),a0,L
|
||
jrnz mif260 ;Good plyr to kill?
|
||
calla getcloseplyr
|
||
jrz mif700 ;No player?
|
||
mif260 callr seekob_dir32la
|
||
|
||
mif300 sub a10,a0 ;A0=Difference
|
||
jrz mif500
|
||
|
||
move a0,a1
|
||
abs a0
|
||
cmpi 2,a0
|
||
jrle mif340 ;In seeker view?
|
||
move *a13(mslsko),a2
|
||
movk >f,a0
|
||
callr rnd
|
||
jrnz mif320 ;No dir change?
|
||
neg a2
|
||
move a2,*a13(mslsko)
|
||
mif320 add a2,a10
|
||
jruc mif400
|
||
|
||
mif340 subk 16,a0
|
||
jrle mif350
|
||
neg a1
|
||
mif350 move a1,a1
|
||
jrnn mif360
|
||
subk 2,a10 ;-1
|
||
mif360 addk 1,a10 ;+1
|
||
|
||
|
||
mif400 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 *a13(msldrag),a2
|
||
move *a8(OXVEL),a0,L
|
||
move a0,a1
|
||
sra a2,a1
|
||
sub a1,a0 ;-Drag
|
||
add a6,a0 ;+Vel
|
||
move a0,*a8(OXVEL),L
|
||
move *a8(OYVEL),a0,L
|
||
move a0,a1
|
||
sra a2,a1
|
||
sub a1,a0 ;-Drag
|
||
add a7,a0 ;+Vel
|
||
move a0,*a8(OYVEL),L
|
||
|
||
mif700 movk >f,a1
|
||
and a11,a1
|
||
jrnz mif800 ;Skip screen check?
|
||
move @WAVE,a1
|
||
subk 16,a1
|
||
jrne mif800 ;!Orcus missile?
|
||
calla SCRTST
|
||
janz DELOBJDIE
|
||
mif800 move @bloflg,a0
|
||
jrn mifx ;Big blow?
|
||
|
||
subk 1,a11
|
||
jrgt mif200 ;Got fuel?
|
||
|
||
mifx move *a8(OYPOS),a0
|
||
addk 15,a0
|
||
move a0,*a8(OYPOS)
|
||
movi DMAWNZ+M_NOCOLL,a0
|
||
move a0,*a8(OFLAGS)
|
||
movi mslexpsnd,a0
|
||
calla ONESND
|
||
movi mslnofuel_l,a9 ;Out of fuel!
|
||
jauc FRQDELDIE
|
||
|
||
|
||
missileimg_t
|
||
LW MSLB9,DMAWNZ
|
||
LW MSLB8,DMAWNZ+M_FLIPH
|
||
LW MSLB7,DMAWNZ+M_FLIPH
|
||
LW MSLB6,DMAWNZ+M_FLIPH
|
||
LW MSLB5,DMAWNZ+M_FLIPH
|
||
LW MSLB4,DMAWNZ+M_FLIPH
|
||
LW MSLB3,DMAWNZ+M_FLIPH
|
||
LW MSLB2,DMAWNZ+M_FLIPH
|
||
|
||
LW MSLB1,DMAWNZ+M_FLIPH
|
||
LW MSLB2,DMAWNZ+M_FLIPV+M_FLIPH
|
||
LW MSLB3,DMAWNZ+M_FLIPV+M_FLIPH
|
||
LW MSLB4,DMAWNZ+M_FLIPV+M_FLIPH
|
||
LW MSLB5,DMAWNZ+M_FLIPV+M_FLIPH
|
||
LW MSLB6,DMAWNZ+M_FLIPV+M_FLIPH
|
||
LW MSLB7,DMAWNZ+M_FLIPV+M_FLIPH
|
||
LW MSLB8,DMAWNZ+M_FLIPV+M_FLIPH
|
||
|
||
LW MSLB9,DMAWNZ+M_FLIPV
|
||
LW MSLB8,DMAWNZ+M_FLIPV
|
||
LW MSLB7,DMAWNZ+M_FLIPV
|
||
LW MSLB6,DMAWNZ+M_FLIPV
|
||
LW MSLB5,DMAWNZ+M_FLIPV
|
||
LW MSLB4,DMAWNZ+M_FLIPV
|
||
LW MSLB3,DMAWNZ+M_FLIPV
|
||
LW MSLB2,DMAWNZ+M_FLIPV
|
||
|
||
LW MSLB1,DMAWNZ
|
||
LW MSLB2,DMAWNZ
|
||
LW MSLB3,DMAWNZ
|
||
LW MSLB4,DMAWNZ
|
||
LW MSLB5,DMAWNZ
|
||
LW MSLB6,DMAWNZ
|
||
LW MSLB7,DMAWNZ
|
||
LW MSLB8,DMAWNZ
|
||
|
||
missilev_t
|
||
.word -7000,-6866,-6467,-5820,-4950,-3889,-2679,-1365
|
||
.word 0,1365,2678,3889,4950,5820,6467,6865
|
||
.word 7000,6865,6467,5820,4950,3889,2679,1365
|
||
.word 0,-1365,-2678,-3889,-4950,-5820,-6467,-6865
|
||
.word -7000,-6866,-6467,-5820,-4950,-3889,-2679,-1365
|
||
|
||
mslnofuel_l
|
||
LWL CLDB1,NEWPALET|3,BLUBOOM
|
||
LW CLDB2,3
|
||
LW CLDB4,3
|
||
LW CLD10,3
|
||
LWL0 CLD11,3
|
||
|
||
|
||
|
||
SUBR rocket_fireab ;A8=*Src obj, A9=*Offset_t, A10=Dir 0-31
|
||
|
||
movi 100,a11 ;Fuel
|
||
movk 1,a0 ;Shield
|
||
movi 159,a3 ;Z
|
||
jruc rf110
|
||
|
||
|
||
SUBRP rocket_fire ;A8=*Src obj, A9=*Offset_t, A10=Dir 0-31
|
||
|
||
movi 400,a11 ;Fuel
|
||
movk 5,a0
|
||
|
||
rf100 move *a8(OZPOS),a3
|
||
addk 1,a3
|
||
|
||
rf110 move a0,*a13(mslshield)
|
||
movi -6,a0 ;Norm speed
|
||
move a0,*a13(msldrag)
|
||
|
||
move *a8(OXPOS),a0
|
||
move *a8(OYPOS),a1
|
||
move *a9+,a2 ;+X offset
|
||
add a2,a0
|
||
move *a9+,a2 ;+Y offset
|
||
add a2,a1
|
||
|
||
rf130 sll 16,a0
|
||
sll 16,a1
|
||
movi MSL1,a2 ;Image
|
||
movi DMAWNZ,a4
|
||
movi CLSENMY+TYPSL+SUBMSL,a5
|
||
clr a6
|
||
clr a7
|
||
calla BEGINOBJ2
|
||
|
||
movk 25,a9 ;Seek delay
|
||
jruc rf400
|
||
|
||
|
||
rf200 SLEEPK 1
|
||
subk 1,a9
|
||
jrlt rf220
|
||
jrgt rf500 ;Don't seek?
|
||
; movi 159,a0
|
||
; move a0,*a8(OZPOS)
|
||
|
||
rf220 cmpi -9,a9
|
||
jrlt rf500 ;Seek time over?
|
||
movk 1,a0
|
||
and a11,a0
|
||
jrnz rf230 ;No smoke?
|
||
CREATE0 missile_smoketrail
|
||
|
||
rf230
|
||
calla getcloseplyr
|
||
jrz rf700 ;No player?
|
||
callr seekob_dir32la
|
||
|
||
rf300 sub a10,a0 ;A0=Difference
|
||
jrz rf500
|
||
|
||
move a0,a1
|
||
abs a0
|
||
subk 16,a0
|
||
jrle rf350
|
||
neg a1
|
||
rf350 move a1,a1
|
||
jrnn rf360
|
||
subk 2,a10 ;-1
|
||
rf360 addk 1,a10 ;+1
|
||
|
||
|
||
rf400 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 rocketimg_t,a0
|
||
move *a0+,a1,L
|
||
move *a0,a4
|
||
calla ANI ;New frame
|
||
|
||
rf500 move a10,a0
|
||
sll 4,a0 ;*16
|
||
addi rocketv_t,a0
|
||
move *a0(8*16),a6 ;XV
|
||
move *a0,a7 ;YV
|
||
|
||
move *a13(msldrag),a2
|
||
move *a8(OXVEL),a0,L
|
||
move a0,a1
|
||
sra a2,a1
|
||
sub a1,a0 ;-Drag
|
||
add a6,a0 ;+Vel
|
||
move a0,*a8(OXVEL),L
|
||
move *a8(OYVEL),a0,L
|
||
move a0,a1
|
||
sra a2,a1
|
||
sub a1,a0 ;-Drag
|
||
add a7,a0 ;+Vel
|
||
move a0,*a8(OYVEL),L
|
||
|
||
rf700
|
||
movk >f,a1
|
||
and a11,a1
|
||
jrnz rf800 ;Skip screen check?
|
||
calla SCRTST
|
||
janz DELOBJDIE
|
||
rf800 move @bloflg,a0
|
||
jrn rfx ;Big blow?
|
||
|
||
subk 1,a11
|
||
jrgt rf200 ;Got fuel?
|
||
|
||
rfx move *a8(OYPOS),a0
|
||
addk 15,a0
|
||
move a0,*a8(OYPOS)
|
||
movi DMAWNZ+M_NOCOLL,a0
|
||
move a0,*a8(OFLAGS)
|
||
movi mslexpsnd,a0
|
||
calla ONESND
|
||
movi mslnofuel_l,a9 ;Out of fuel!
|
||
jauc FRQDELDIE
|
||
|
||
|
||
rocketimg_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
|
||
|
||
rocketv_t
|
||
.word -7000,-6866,-6467,-5820,-4950,-3889,-2679,-1365
|
||
.word 0,1365,2678,3889,4950,5820,6467,6865
|
||
.word 7000,6865,6467,5820,4950,3889,2679,1365
|
||
.word 0,-1365,-2678,-3889,-4950,-5820,-6467,-6865
|
||
.word -7000,-6866,-6467,-5820,-4950,-3889,-2679,-1365
|
||
|
||
|
||
|
||
********************************
|
||
* Missile smoke trail (Process)
|
||
* A8=*Src obj, A10=Dir 0-31
|
||
|
||
SUBR aboss_smoketrail
|
||
|
||
movi 155,a3
|
||
jruc mstab
|
||
|
||
|
||
SUBRP missile_smoketrail
|
||
|
||
move *a8(OZPOS),a3
|
||
movk 3,a0
|
||
callr rnd
|
||
subk 2,a0
|
||
add a0,a3 ;-2 to 1
|
||
|
||
mstab movk 3,a0
|
||
callr rnd
|
||
sll 5,a0 ;*32
|
||
addi mslsmoke_t,a0
|
||
move *a0,a9,L
|
||
|
||
move *a8(OXVEL),a6,L
|
||
move *a8(OYVEL),a7,L
|
||
sra 2,a6 ;/4
|
||
sra 2,a7
|
||
|
||
move *a8(OXPOS),a0
|
||
move *a8(OSIZEX),a2
|
||
srl 1,a2 ;/2
|
||
add a2,a0
|
||
move *a8(OYPOS),a1
|
||
move *a8(OSIZEY),a2
|
||
srl 1,a2 ;/2
|
||
add a2,a1
|
||
addk 15,a1
|
||
sll 4,a10 ;*16
|
||
addi mslstxy_t,a10
|
||
move *a10(8*16),a2
|
||
add a2,a0 ;+X offset
|
||
move *a10,a2
|
||
add a2,a1 ;+YO
|
||
sll 16,a0 ;X
|
||
sll 16,a1 ;Y
|
||
movi CLDB1ORNG,a2
|
||
movi DMAWNZ+M_NOCOLL,a4 ;No collisions
|
||
movi CLSDEAD,a5
|
||
calla BEGINOBJ2
|
||
SLEEPK 3
|
||
jauc FRQDELDIE
|
||
|
||
mslstxy_t
|
||
.word 12,12,11,10,8,6,3,1 ;Y
|
||
.word 0,-1,-3,-6,-8,-10,-11,-12 ;X
|
||
.word -12,-12,-11,-10,-8,-6,-3,-1
|
||
.word 0,1,3,6,8,10,11,12
|
||
.word 12,12,11,10,8,6,3,1
|
||
|
||
mslsmoke_t
|
||
.long cldbw_l,cldblg_l,cldbgry_l,cldbblu_l
|
||
|
||
cldbw_l
|
||
LWL CLDB1,NEWPALET|2,WHTPAL
|
||
LW CLDB2,4
|
||
LW CLDB3,4
|
||
LW CLDB4,3
|
||
LW CLD5,3
|
||
LW CLD6,4
|
||
LW CLD7,4
|
||
LW CLD8,4
|
||
LW CLD9,4
|
||
LW CLD10,4
|
||
LWL0 CLD11,4
|
||
cldblg_l
|
||
LWL CLDB1,NEWPALET|2,LGRYPAL
|
||
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
|
||
cldbgry_l
|
||
LWL CLDB1,NEWPALET|2,GREYPAL
|
||
LW CLDB2,2
|
||
LW CLDB3,2
|
||
LW CLDB4,2
|
||
LW CLD5,2
|
||
LW CLD6,2
|
||
LW CLD7,3
|
||
LW CLD8,3
|
||
LW CLD9,3
|
||
LW CLD10,3
|
||
LWL0 CLD11,3
|
||
cldbblu_l
|
||
LWL CLDB1,NEWPALET|2,BLUBOOM
|
||
LW CLDB2,2
|
||
LW CLDB3,2
|
||
LW CLDB4,2
|
||
LW CLD5,2
|
||
LW CLD6,2
|
||
LW CLD7,2
|
||
LW CLD8,2
|
||
LW CLD9,2
|
||
LW CLD10,2
|
||
LWL0 CLD11,2
|
||
|
||
|
||
|
||
|
||
********************************
|
||
* Tongue flying down screen (Process)
|
||
|
||
WORDPD tngimgnum,0 ;0-3
|
||
|
||
SUBRP tongue_fire ;A8=*Src obj, A10=Dir 0-31
|
||
|
||
movi 100,a11 ;Fuel
|
||
|
||
move *a8(OXPOS),a0
|
||
move *a8(OYPOS),a1
|
||
addi AX,a0
|
||
addi AY,a1
|
||
sll 16,a0
|
||
sll 16,a1
|
||
movi TUNG1,a2 ;Image
|
||
move *a8(OZPOS),a3
|
||
addk 1,a3
|
||
movi DMAWNZ,a4
|
||
movi CLSENMY|TYPT72|SUBTK,A5
|
||
clr a6
|
||
clr a7
|
||
calla BEGINOBJ2
|
||
|
||
movi 30,a9 ;Low Z delay
|
||
sll 4,a10 ;*16
|
||
addi tonguev_t,a10 ;A10=*XY vel for dir
|
||
jruc tf500
|
||
|
||
tf200 SLEEPK 1
|
||
subk 1,a9
|
||
jrnz tf500
|
||
movi 158,a0
|
||
move a0,*a8(OZPOS)
|
||
|
||
tf500 btst 0,a11
|
||
jrnz tf600 ;Skip?
|
||
move *a13(tngimgnum),a0 ;>New frame
|
||
addk 1,a0
|
||
ANDK 3,a0
|
||
move a0,*a13(tngimgnum)
|
||
sll 5,a0 ;*32
|
||
addi tongueimg_t,a0
|
||
move *a0+,a1,L
|
||
move *a8(OFLAGS),a4
|
||
calla ANI
|
||
|
||
tf600 move *a10(8*16),a6 ;XV
|
||
move *a10,a7 ;YV
|
||
|
||
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
|
||
|
||
tf700 subk 1,a11
|
||
jrgt tf200 ;Got fuel?
|
||
|
||
jauc DELOBJDIE
|
||
|
||
tongueimg_t
|
||
.long TUNG1,TUNG2,TUNG1,TUNG3
|
||
|
||
tonguev_t
|
||
.word -8000,-7846,-7391,-6652,-5657,-4444,-3061,-1561
|
||
.word 0,1560,3061,4444,5657,6652,7391,7846
|
||
.word 8000,7846,7391,6652,5657,4444,3061,1560
|
||
.word 0,-1560,-3061,-4444,-5657,-6652,-7391,-7846
|
||
.word -8000,-7846,-7391,-6652,-5657,-4444,-3061,-1561
|
||
|
||
|
||
NOTINUSE
|
||
********************************
|
||
* Drone, player seeking (Process)
|
||
|
||
WORDPD drnimgnum,0 ;0-3
|
||
WORDPD drnmode,1 ;
|
||
|
||
|
||
SUBRP drone_fire ;A8=*Src obj, A9=*Offset_t, A10=Dir 0-31
|
||
|
||
movi 400,a11 ;Fuel
|
||
movk 2,a0
|
||
move a0,*a13(drnmode)
|
||
|
||
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 BLB1,a2 ;Image
|
||
move *a8(OZPOS),a3
|
||
addk 1,a3
|
||
movi DMAWNZ,a4
|
||
movi CLSENMY+TYPSL+SUBMSL,a5
|
||
clr a6
|
||
clr a7
|
||
calla BEGINOBJ2
|
||
|
||
movk 25,a9 ;Seek delay
|
||
jruc df400
|
||
|
||
df200 SLEEPK 1
|
||
subk 1,a9
|
||
jrlt df220
|
||
jrgt df500 ;Don't seek?
|
||
movi 158,a0
|
||
move a0,*a8(OZPOS)
|
||
|
||
df220
|
||
movi >1f,a0
|
||
callr rnd
|
||
jrnz df250
|
||
movk 2,a0 ;>New mode
|
||
callr rndrng0
|
||
move a0,*a13(drnmode)
|
||
|
||
|
||
df250 move *a13(drnmode),a0 ;>
|
||
subk 1,a0
|
||
jrnn df260 ;Skip?
|
||
addk 1,a10 ;Rotate rgt
|
||
jruc df400
|
||
|
||
df260 jrnz df280 ;No missile?
|
||
calla getcloseplyr
|
||
jrz df500 ;No player?
|
||
callr seekob_dir32
|
||
|
||
PUSH a9,a10
|
||
movi dronemslo_t,a9
|
||
move a0,a10
|
||
CREATE BOSSPID,missile_dfire
|
||
PULL a9,a10
|
||
clr a0 ;Turn mode
|
||
move a0,*a13(drnmode)
|
||
|
||
|
||
df280
|
||
calla getcloseplyr
|
||
jrz df500 ;No player?
|
||
callr seekob_dir32
|
||
addk 6,a0
|
||
sll 32-5,a0
|
||
srl 32-5,a0
|
||
|
||
df300 sub a10,a0 ;A0=Difference
|
||
jrz df500
|
||
|
||
move a10,a2
|
||
move a0,a1
|
||
abs a0
|
||
subk 16,a0
|
||
jrle df350
|
||
neg a1
|
||
df350 move a1,a1
|
||
jrnn df360
|
||
subk 2,a10 ;-1
|
||
df360 addk 1,a10 ;+1
|
||
|
||
df400 ANDK >1f,a10 ;Make 0-31
|
||
|
||
df500 movk 3,a0
|
||
and a11,a0
|
||
jrnz df600 ;Skip?
|
||
move *a13(drnimgnum),a0 ;>New frame
|
||
addk 1,a0
|
||
movk 3,a14
|
||
and a14,a0
|
||
move a0,*a13(drnimgnum)
|
||
sll 5,a0 ;*32
|
||
addi droneimg_t,a0
|
||
move *a0+,a1,L
|
||
movi DMAWNZ,a4
|
||
calla ANI
|
||
|
||
df600 move a10,a0
|
||
sll 4,a0 ;*16
|
||
addi dronev_t,a0
|
||
move *a0(8*16),a6 ;XV
|
||
move *a0,a7 ;YV
|
||
|
||
move *a8(OXVEL),a0,L
|
||
move a0,a1
|
||
sra 5,a1
|
||
sub a1,a0 ;-Drag
|
||
add a6,a0 ;+Vel
|
||
move a0,*a8(OXVEL),L
|
||
move *a8(OYVEL),a0,L
|
||
move a0,a1
|
||
sra 5,a1
|
||
sub a1,a0 ;-Drag
|
||
add a7,a0 ;+Vel
|
||
move a0,*a8(OYVEL),L
|
||
|
||
|
||
df700 move @bloflg,a0
|
||
jrn dfx ;Big blow?
|
||
|
||
subk 1,a11
|
||
jrgt df200 ;Got fuel?
|
||
|
||
dfx move *a8(OYPOS),a0
|
||
addk 20,a0
|
||
move a0,*a8(OYPOS)
|
||
movi DMAWNZ+M_NOCOLL,a0
|
||
move a0,*a8(OFLAGS)
|
||
movi mslexpsnd,a0
|
||
calla ONESND
|
||
movi cldbblu_l,a9 ;Out of fuel!
|
||
jauc FRQDELDIE
|
||
|
||
droneimg_t
|
||
.long BLB1,BLB2,BLB3,BLB4
|
||
|
||
dronev_t
|
||
.word -8000,-7846,-7391,-6652,-5657,-4444,-3061,-1561
|
||
.word 0,1560,3061,4444,5657,6652,7391,7846
|
||
.word 8000,7846,7391,6652,5657,4444,3061,1560
|
||
.word 0,-1560,-3061,-4444,-5657,-6652,-7391,-7846
|
||
.word -8000,-7846,-7391,-6652,-5657,-4444,-3061,-1561
|
||
|
||
dronemslo_t
|
||
.word 4,10
|
||
|
||
.endif
|
||
|
||
|
||
********************************
|
||
* Get boss dir to face an obj
|
||
* A0=X offset from ani pt
|
||
* A1=Y offset from ani pt
|
||
* A8=*Boss data struct
|
||
* A11=*Obj to follow
|
||
* Trashes A0-A3,A6-A7
|
||
*Rets:
|
||
* A0=Dir 0-31
|
||
|
||
SUBRP bossseeko_dir32
|
||
|
||
move *a11(OXPOS),a6 ;A6=Plyr X
|
||
addk 5,a6
|
||
move *a11(OYPOS),a7 ;A7=^ Y
|
||
|
||
move *a8,a3,L ;Get * 1st boss obj
|
||
move *a3(OXPOS),a2
|
||
addi AX,a2 ;+Ani pt X offset
|
||
add a2,a0
|
||
move *a3(OYPOS),a2
|
||
addi AY,a2 ;-Ani pt Y offset
|
||
add a2,a1
|
||
|
||
jruc sodboss
|
||
|
||
********************************
|
||
* Get dir to face an object
|
||
* A0=*Dest obj
|
||
* A8=*Src obj
|
||
* Trashes A0-A3,A6-A7
|
||
* >A0=Dir 0-31
|
||
|
||
SUBR seekob_dir32
|
||
|
||
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(OYPOS),a1 ;Get SY
|
||
jruc sod50
|
||
|
||
SUBR seekob_dir32la ;Look ahead
|
||
|
||
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(OYPOS),a1 ;Get SY
|
||
move *a8(OXVEL),a2,L ;Calc new pos
|
||
sra 16-2,a2 ;*4
|
||
add a2,a0
|
||
move *a8(OYVEL),a2,L
|
||
sra 16-2,a2 ;*4
|
||
add a2,a1
|
||
|
||
sod50 move *a8(OSIZEX),a2
|
||
srl 1,a2
|
||
add a2,a0 ;Center X
|
||
move *a8(OSIZEY),a2
|
||
srl 1,a2
|
||
add a2,a1 ;Center Y
|
||
|
||
|
||
SUBR sodboss ;A0/A1=Src XY, A6/A7=Dest XY
|
||
|
||
clr a2 ;Octant 0-1
|
||
sub a6,a0 ;A0=SrcX-DestX
|
||
jrnn sod100
|
||
abs a0
|
||
sub a7,a1 ;A1=SrcY-DestY
|
||
jrnn sod200
|
||
abs a1
|
||
jruc sod160 ;Oct 2-3
|
||
|
||
sod100 movk 16,a2 ;Oct 4-5
|
||
sub a7,a1 ;A1=SrcY-DestX
|
||
abs a1
|
||
jrnn sod200
|
||
sod160 addk 8,a2 ;Oct 6-7
|
||
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
|
||
|
||
|
||
|
||
|
||
********************************
|
||
* Nose flame throwers (Process)
|
||
|
||
SUBRP nose_flamers
|
||
|
||
movi PLYROBJS,a10
|
||
movi PLYRPRCS,a11
|
||
|
||
nflp move @larmstat,a0
|
||
jrnn nf200 ;Arm still there?
|
||
move @rarmstat,a0
|
||
jrnn nf200 ;^
|
||
move @bossz,a0,L
|
||
jrnz nf200 ;Jump in progress?
|
||
move @bloflg,a0
|
||
jrn nf200 ;Blow in progress?
|
||
|
||
move *a10,a8,L
|
||
jrz nf40
|
||
move *a11,a0,L
|
||
move *a0(DELYDET),a0
|
||
jrnz nf40
|
||
callr nose_proxchk
|
||
jrc nf100
|
||
|
||
nf40 move *a10(32),a8,L
|
||
jrz nf200
|
||
move *a11(32),a0,L
|
||
move *a0(DELYDET),a0
|
||
jrnz nf200
|
||
callr nose_proxchk
|
||
jrnc nf200
|
||
|
||
nf100 move @bossd_t,a8,L
|
||
CREATE BOSSPID,nose_flame4
|
||
CREATE BOSSPID,nose_flame8
|
||
movk 1,a0
|
||
move a0,@bflmrstat ;On
|
||
SLEEP 60*4
|
||
clr a0
|
||
move a0,@bflmrstat ;Off
|
||
|
||
nf200 SLEEPK 20
|
||
jruc nflp
|
||
|
||
|
||
********************************
|
||
* Check flamer proximity
|
||
*Rets: C=In box
|
||
|
||
SUBRP nose_proxchk
|
||
|
||
calla GETANIXY
|
||
move a2,a1
|
||
move a3,a0
|
||
move @bossd_t,a8,L
|
||
calla GETANIXY
|
||
sub a3,a0
|
||
sub a2,a1
|
||
sra 16,a0
|
||
sra 16,a1
|
||
abs a0
|
||
cmpi >62,a1 ;check y coords
|
||
jrls npc40
|
||
cmpi >82,a1
|
||
jrhs npc40
|
||
cmpi >14,a0
|
||
jrls npc40
|
||
cmpi >40,a0
|
||
jrhs npc40
|
||
npc20 setc ;In box!
|
||
rets
|
||
|
||
npc40 cmpi >78,a1 ;check further out box
|
||
jrls npc70
|
||
cmpi >98,a1
|
||
jrhs npc70
|
||
cmpi >34,a0
|
||
jrls npc70
|
||
cmpi >60,a0
|
||
jrlo npc20
|
||
npc70 clrc ;Not in box
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Create a nose flamer at 4 o'clock (Process)
|
||
* A8=*1st boss obj
|
||
|
||
SUBRP nose_flame4
|
||
|
||
movi DMAWNZ|M_PIXSCAN|M_FLIPH,a4
|
||
move *a8(OXPOS),a0
|
||
subk 8,a0
|
||
sll 16,a0
|
||
move *a8(OYPOS),a1
|
||
addi >29,a1
|
||
sll 16,a1
|
||
movk 4,a9
|
||
jauc DOIT
|
||
|
||
********************************
|
||
* Create a nose flamer at 8 o'clock (Process)
|
||
* A8=*1st boss obj
|
||
|
||
SUBRP nose_flame8
|
||
|
||
movi DMAWNZ|M_PIXSCAN,a4
|
||
move *a8(OXPOS),a0
|
||
addk 8,a0
|
||
sll 16,a0
|
||
move *a8(OYPOS),a1
|
||
addi >29,a1
|
||
sll 16,a1
|
||
movk 5,a9
|
||
jauc DOIT
|
||
|
||
|
||
********************************
|
||
* Boss gun controller (Process)
|
||
* A11=*Arm data struct
|
||
|
||
|
||
SUBRP gun
|
||
|
||
move *a11(GUNMODE),a0
|
||
sll 32-3,a0 ;Mask
|
||
srl 32-3-5,a0 ;*32
|
||
addi gunmd_t,a0
|
||
move *a0,a0,L
|
||
jump a0
|
||
|
||
gunmd_t .long grand,grand,gplayr,gplayr
|
||
.long gdown,gside,gsweep,gsweep
|
||
|
||
|
||
gunsk clr a9
|
||
move *a11(GUNNUM),a1
|
||
jrz gun10
|
||
movk 6,a9
|
||
gun10 JSRP gun_seek
|
||
SLEEPK 1
|
||
add a9,a10
|
||
CREATE BOSSPID,shot_fire
|
||
SLEEPK 4 ;Wait for muzzle flash to finish
|
||
move *a11,a0 ;Get status
|
||
jrgt gun ;On fire?
|
||
movk >f,a0
|
||
callr rnd
|
||
jrnz gun20 ;Skip sleep?
|
||
SLEEP 60
|
||
movk 1,a0
|
||
callr rnd
|
||
jrnz gun20 ;Skip sleep2?
|
||
SLEEP 40
|
||
gun20 movk 4,a0
|
||
callr rndrng0
|
||
addk 1,a0
|
||
calla PRCSLP ;1-5
|
||
jruc gun
|
||
|
||
|
||
grand movk 5,a0 ;>Shoot at random
|
||
callr rndrng0
|
||
move a0,a10
|
||
jruc gunsk
|
||
|
||
|
||
gplayr ;>Shoot at player
|
||
callr getplyr ;find player to seek
|
||
jrz gsweep ;No player?
|
||
|
||
PUSH a11
|
||
move a11,a7
|
||
movi bossd_t,a8 ;Get boss pointer
|
||
move a0,a11
|
||
movi -70,a0 ;X offset
|
||
movi aiml_t,a10
|
||
move *a7(GUNNUM),a1
|
||
jrz gun70
|
||
neg a0
|
||
movi aimr_t,a10
|
||
gun70 callr gun_aim ;Get gun dir (A10)
|
||
PULL a11
|
||
jruc gunsk
|
||
|
||
gdown movk 1,a10 ;>Shoot down
|
||
jruc gunsk
|
||
|
||
gside movk 5,a10 ;>Shoot side
|
||
jruc gunsk
|
||
|
||
gsweep move *a11(GUNDIR),a10 ;>Sweep
|
||
move *a11(GUNSWP),a0 ;Sweep direction flag
|
||
jrz gun200
|
||
addk 1,a10
|
||
cmpi 5,a10
|
||
jrls gunsk
|
||
clr a10
|
||
move a10,*a11(GUNSWP)
|
||
movk 5,a10
|
||
gun200 subk 1,a10
|
||
jrnn gunsk
|
||
move a10,*a11(GUNSWP)
|
||
movk 1,a10
|
||
jruc gunsk
|
||
|
||
|
||
********************************
|
||
* Aim gun
|
||
* A0=X offset of gun
|
||
* A8=Boss data struct
|
||
* A10=*Aim table
|
||
* A11=*Obj to follow
|
||
*Rets: A10=Gun dir 0-5
|
||
|
||
SUBRP gun_aim
|
||
|
||
movi 82,a1 ;Y offset
|
||
callr bossseeko_dir32
|
||
sll 3,a0
|
||
add a10,a0
|
||
movb *a0,a10
|
||
rets
|
||
|
||
aiml_t .byte 5,5,5,5,0,0,0,0
|
||
.byte 0,0,0,0,0,0,0,1
|
||
.byte 1,2,2,3,3,4,4,5
|
||
.byte 5,5,5,5,5,5,5,5
|
||
|
||
aimr_t .byte 5,5,5,5,5,5,5,5
|
||
.byte 5,4,4,3,3,2,2,1
|
||
.byte 1,0,0,0,0,0,0,0 ;Right aiming table for angles 0-31
|
||
.byte 0,0,0,0,5,5,5,5
|
||
|
||
|
||
********************************
|
||
* Seek gun direction
|
||
* A9=Seek table offset (0/6)
|
||
* A10=Postion to seek 0-5
|
||
* A11=*Arm data struct
|
||
|
||
SUBRP gun_seek
|
||
|
||
PUSHP a8,a10
|
||
movk 1,a8
|
||
move *a11(GUNDIR),a0
|
||
sub a0,a10
|
||
jreq gsx ;At position?
|
||
jrnn gs5 ;Seek +?
|
||
neg a8
|
||
gs5 abs a10
|
||
|
||
gslp move *a11(GUNDIR),a0
|
||
add a8,a0
|
||
move a0,*a11(GUNDIR)
|
||
PUSH a9
|
||
add a0,a9
|
||
sll 4,a9 ;*16
|
||
addi gunsk_t,a9
|
||
callr aniboss ;Animate into place
|
||
PULL a9
|
||
SLEEPK 2
|
||
dsj a10,gslp
|
||
|
||
gsx PULLP a8,a10
|
||
RETP
|
||
|
||
|
||
gunsk_t .byte ARML,-ARMR1
|
||
.byte ARML,-ARMDN
|
||
.byte ARML,-ARML1
|
||
.byte ARML,-ARML2
|
||
.byte ARML,-ARML3
|
||
.byte ARML,-ARML4
|
||
.byte ARMR,-ARMR1
|
||
.byte ARMR,-ARMDN
|
||
.byte ARMR,-ARML1
|
||
.byte ARMR,-ARML2
|
||
.byte ARMR,-ARML3
|
||
.byte ARMR,-ARML4
|
||
|
||
|
||
********************************
|
||
* Shoot bullet (Process)
|
||
* A10=Gun angle 0-11
|
||
|
||
SUBRP shot_fire
|
||
|
||
; move @HALT,a0
|
||
; janz SUCIDE ;No shoot on halt
|
||
|
||
PUSH a10
|
||
sll 5,a10
|
||
addi gunrecoil_t,a10
|
||
move *a10,a9,L ;get animation
|
||
movk 2,a10 ;get time
|
||
movi armani_p,a11 ;arm animation flag set
|
||
CREATE BOSSPID,aniseq
|
||
PULL a0
|
||
|
||
sll 6,a0 ;*64
|
||
addi bullet_t,a0 ;Get offset table index
|
||
move *a0+,a4 ;Get x offset from ani pt
|
||
move *a0+,a5 ;Get y offset from ani pt
|
||
move *a0+,a6 ;Get x vel
|
||
sll 7,a6 ;*128
|
||
move *a0+,a7 ;Get y vel
|
||
sll 7,a7 ;*128
|
||
move @bossd_t,a8,L
|
||
|
||
move *a8(OXVEL),a2,L ;Add in boss velocity
|
||
move *a8(OYVEL),a3,L
|
||
add a2,a6
|
||
add a3,a7
|
||
|
||
calla GETANIXY ;A2=Y, A3=X animation point
|
||
sll 16,a4
|
||
sll 16,a5
|
||
add a4,a3
|
||
add a5,a2
|
||
move a3,a0 ;oxval
|
||
move a2,a1 ;oyval
|
||
move a0,a10
|
||
move a1,a11
|
||
PUSH a0,a1,a7
|
||
CREATE BOSSPID,gun_muzblast
|
||
PULL a0,a1,a7
|
||
movi GUNBUL,a2 ;*IMG
|
||
movi 160,a3 ;Z
|
||
movi DMAWNZ,a4
|
||
movi CLSENMY+TYPGOO,a5
|
||
movi BURST,a10
|
||
jauc START_PJ
|
||
|
||
|
||
bullet_t ;Bullet table (XOFF,YOFF,XV,YV)
|
||
|
||
.word -35,148,>200,>400 ;LGun dir 6
|
||
.word -73,155,0,>400 ;LGun dir 1
|
||
.word -102,143,->200,>400 ;LGun dir 2
|
||
.word -118,129,->300,>300 ;LGun dir 3
|
||
.word -130,105,->400,>200 ;LGun dir 4
|
||
.word -137,74,->400,0 ;LGun dir 5
|
||
|
||
.word 34,148,->200,>400 ;RGun dir 6
|
||
.word 72,155,0,>400 ;RGun dir 1
|
||
.word 101,143,>200,>400 ;RGun dir 2
|
||
.word 117,129,>300,>300 ;RGun dir 3
|
||
.word 129,105,>400,>200 ;RGun dir 4
|
||
.word 136,74,>400,0 ;RGun dir 5
|
||
|
||
|
||
gunrecoil_t
|
||
.long LARMF6 ;LEFT GUN ANGLE 6
|
||
.long LARMF1 ;LEFT GUN ANGLE 1
|
||
.long LARMF2
|
||
.long LARMF3
|
||
.long LARMF4
|
||
.long LARMF5
|
||
|
||
.long RARMF6 ;RIGHT GUN ANGLE 6
|
||
.long RARMF1 ;RIGHT GUN ANGLE 1
|
||
.long RARMF2
|
||
.long RARMF3
|
||
.long RARMF4
|
||
.long RARMF5
|
||
|
||
|
||
********************************
|
||
* Gun muzzle blast
|
||
* A8=*1st boss obj, A10=X, A11=Y
|
||
|
||
SUBRP gun_muzblast
|
||
|
||
move a10,a0
|
||
move a11,a1
|
||
movi GNFR1,a2
|
||
movi 181,a3 ;Z
|
||
movi DMAWNZ|M_NOCOLL,a4
|
||
movi CLSDEAD,a5
|
||
clr a6
|
||
clr a7
|
||
move a8,a10
|
||
calla BEGINOBJ2
|
||
movi gnfr_l,a9
|
||
|
||
gmblp move *a10(OXVEL),a6,L ;get boss velocity for puffs
|
||
move *a10(OYVEL),a7,L
|
||
move a6,*a8(OXVEL),L
|
||
move a7,*a8(OYVEL),L
|
||
clr a1
|
||
JSRP FRANIM
|
||
jrnc gmblp
|
||
|
||
jauc DELOBJDIE
|
||
|
||
gnfr_l LW GNFR1,1
|
||
LW GNFR2,1
|
||
LWL0 GNFR3,1
|
||
|
||
|
||
********************************
|
||
* Jumping thrusters
|
||
* A10=Burn time
|
||
|
||
SUBRP thrusters_fire
|
||
|
||
movi thrustlo_seq,a9
|
||
callr aniboss
|
||
SLEEPK 2
|
||
movi thrusthi_seq,a9
|
||
callr aniboss
|
||
SLEEPK 2
|
||
movi thrustnull_seq,a9
|
||
callr aniboss
|
||
SLEEPK 2
|
||
dsj a10,thrusters_fire
|
||
DIE
|
||
|
||
********************************
|
||
* Get * aniset based on dir
|
||
* A0=X offset from ani pt
|
||
* A1=Y offset from ani pt
|
||
* A8=*Boss data struct
|
||
* A9=*Animation table
|
||
* Trashes A11
|
||
*Rets:
|
||
* A9=*Animation set
|
||
|
||
SUBRP bossseekp_ani32
|
||
|
||
PUSH a0,a1
|
||
callr boss_getcloseplyr
|
||
jrz bspaerr
|
||
move a0,a11
|
||
PULL a0,a1
|
||
callr bossseeko_dir32
|
||
sll 5,a0
|
||
add a0,a9
|
||
move *a9,a9,L
|
||
rets
|
||
|
||
bspaerr PULL a0,a1
|
||
move *a9,a9,L ;Get 1st
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Add up total damage
|
||
*Rets: A0=Damage
|
||
|
||
NOTINUSE
|
||
|
||
SUBRP damage_gettot
|
||
|
||
PUSH a1,a8
|
||
clr a0
|
||
movi bossd_t+32,a8
|
||
|
||
dt20 move *a8(BODAM-32),a1
|
||
add a1,a0 ;Add up
|
||
addk 32,a8
|
||
move *a8+,a1,L
|
||
jrnz dt20 ;More?
|
||
|
||
PULL a1,a8
|
||
rets
|
||
.endif
|
||
|
||
********************************
|
||
* Keep boss objects together
|
||
|
||
SUBRP boss_glue
|
||
|
||
movi bossd_t,a8 ;A8=*Data block
|
||
|
||
PUSH a12,a13
|
||
move *a8+,a10,L ;first piece index
|
||
move a8,a9
|
||
move *a10(OIMG),a1,L
|
||
move *a10(OSIZE),a2,L
|
||
move *a10(OFLAGS),a4
|
||
calla GANIOF ;get x y ani offset
|
||
move a6,a12 ;save x anioff
|
||
move a7,a13 ;save y anioff
|
||
jruc bg40
|
||
|
||
bglp move *a8(OIMG),a1,L
|
||
move *a8(OSIZE),a2,L
|
||
move *a8(OFLAGS),a4
|
||
calla GANIOF ;get x y ani offset
|
||
sub a12,a6
|
||
sub a13,a7
|
||
|
||
move *a8(OID),a0 ;get oid
|
||
|
||
btst B_FLIPH,a4 ;Flip kludge ?
|
||
jrz bg5 ;no...
|
||
addi >20000,a6 ;adjust flip kludge
|
||
cmpi -CLSENMY|TYPFACE|SUBHD,a0
|
||
jrne bg5 ;Little head?
|
||
subi >10000,a6
|
||
|
||
bg5 cmpi CLSDEAD,a0 ;Adjust shadow offset
|
||
jrne bg10
|
||
move @bossz,a0,L
|
||
sub a0,a7
|
||
|
||
bg10 move *a10(OXVAL),a0,L
|
||
sub a6,a0
|
||
move a0,*a8(OXVAL),L
|
||
move *a10(OYVAL),a1,L
|
||
sub a7,a1
|
||
move a1,*a8(OYVAL),L
|
||
|
||
bg40 addk 32,a9
|
||
move *a9+,a8,L ;get next index
|
||
jrnz bglp ;More?
|
||
|
||
PULL a12,a13
|
||
|
||
SLOOP 8,boss_glue
|
||
|
||
|
||
********************************
|
||
* Stuff new velocity into boss object
|
||
* A0=XV
|
||
* A1=YV
|
||
* A8=*Boss data struct
|
||
|
||
SUBRP vel_set
|
||
|
||
PUSH a2,a8
|
||
jruc vs50
|
||
|
||
vslp move a0,*a2(OXVEL),L
|
||
move a1,*a2(OYVEL),L
|
||
addk 32,a8
|
||
vs50 move *a8+,a2,L
|
||
jrnz vslp ;More?
|
||
|
||
PULL a2,a8
|
||
rets
|
||
|
||
********************************
|
||
* Add Z change into boss objects
|
||
* A0=Z delta
|
||
* A8=*Boss data struct
|
||
|
||
SUBRP vel_setz
|
||
|
||
PUSH a2,a8
|
||
jruc vsz50
|
||
|
||
vszlp move *a2(OID),a1
|
||
cmpi CLSDEAD,a1
|
||
jreq vsz20 ;Skip shadow?
|
||
move *a2(OYVAL),a1,L
|
||
sub a0,a1
|
||
move a1,*a2(OYVAL),L
|
||
vsz20 addk 32,a8
|
||
vsz50 move *a8+,a2,L
|
||
jrnz vszlp ;More?
|
||
|
||
PULL a2,a8
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Set boss objects up hi
|
||
* A8=*Boss data struct
|
||
|
||
SUBRP boss_sethi
|
||
|
||
PUSH a2,a3,a4,a8
|
||
jruc bsh50
|
||
|
||
bshlp move *a2(OID),a1
|
||
cmpi CLSDEAD,a1
|
||
jreq bsh40 ;Skip shadow?
|
||
move *a2(OZPOS),a1
|
||
addk 20,a1
|
||
move a1,*a2(OZPOS)
|
||
bsh40 addk 32,a8
|
||
bsh50 move *a8+,a2,L
|
||
jrnz bshlp ;More?
|
||
|
||
PULL a2,a3,a4,a8
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Set boss objects low Z
|
||
* A8=*Boss data struct
|
||
|
||
SUBRP boss_setlow
|
||
|
||
PUSH a2,a3,a8
|
||
jruc bsl50
|
||
|
||
bsllp move *a2(OID),a1
|
||
cmpi CLSDEAD,a1
|
||
jreq bsl40 ;Skip shadow?
|
||
move *a2(OZPOS),a1
|
||
subk 20,a1
|
||
move a1,*a2(OZPOS)
|
||
bsl40 addk 32,a8
|
||
bsl50 move *a8+,a2,L
|
||
jrnz bsllp ;More?
|
||
|
||
PULL a2,a3,a8
|
||
rets
|
||
|
||
|
||
|
||
********************************
|
||
* Random animator
|
||
* A1=*Ani table
|
||
* A2=*Aniflag
|
||
|
||
SUBRP ani_rnd
|
||
|
||
PUSH a9,a10,a11
|
||
|
||
move a2,a11 ;save flag
|
||
move @RAND,a0
|
||
movk >f,a14
|
||
and a14,a0
|
||
sll 4,a0 ;*16
|
||
move a0,a9
|
||
sll 1,a0
|
||
add a9,a0 ;A0=*48
|
||
add a1,a0
|
||
move *a0+,a9,L
|
||
move *a0,a10
|
||
CREATE BOSSPID|SUBANI,aniseq
|
||
|
||
PULL a9,a10,a11
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Random sequence animator
|
||
* A1=*Animation table
|
||
* A2=*Animation flag
|
||
|
||
SUBRP randseq
|
||
|
||
PUSH a8,a11
|
||
|
||
move a2,a11 ;Save flag
|
||
move @RAND,a0
|
||
movk >f,a14
|
||
and a14,a0
|
||
sll 5,a0 ;*32
|
||
add a1,a0
|
||
move *a0+,a8,L
|
||
CREATE BOSSPID|SUBANI,aniseqq
|
||
move a0,*a11,L ;Set flag for process now
|
||
|
||
PULL a8,a11
|
||
rets
|
||
|
||
********************************
|
||
* aniseq (Process)
|
||
* A9=* Ani seq table
|
||
* A10=Sleep time
|
||
* A11=*Flag
|
||
|
||
SUBRP aniseq
|
||
|
||
move a13,*a11,L ;Set flag
|
||
|
||
aseqlp move *a9,a1
|
||
jrz aseqx ;Null frame?
|
||
callr aniboss
|
||
move a10,a0
|
||
calla PRCSLP
|
||
jruc aseqlp
|
||
|
||
aseqx move a1,*a11,L ;Clear flag
|
||
DIE
|
||
|
||
********************************
|
||
* aniseqq (Process)
|
||
* A8=*Script index
|
||
* A11=*Flag
|
||
|
||
SUBRP aniseqq
|
||
|
||
move a13,*a11,L ;Set flag
|
||
aseqq5 move *a8+,a9,L
|
||
jrz aseqqx ;End?
|
||
move *a8+,a10 ;A10=Sleep time
|
||
|
||
aseqqlp move *a9,a1
|
||
jrz aseqq5 ;Null frame?
|
||
callr aniboss
|
||
move a10,a0
|
||
calla PRCSLP
|
||
jruc aseqqlp
|
||
|
||
aseqqx move a9,*a11,L ;Clear flag
|
||
DIE
|
||
|
||
|
||
********************************
|
||
* Animate boss monster
|
||
* A9=*Animation table
|
||
*Rets:
|
||
* A9=*Next frame
|
||
|
||
SUBRP aniboss
|
||
|
||
PUSH a2,a3,a4,a7,a8,a10,a11
|
||
|
||
movi bossd_t-64,a10 ;Get object block
|
||
subk 8,a9
|
||
|
||
ablp addk 8,a9 ;Next byte
|
||
movb *a9,a7 ;Get part #
|
||
sll 6,a7 ;*64
|
||
add a10,a7
|
||
move *a7,a8,L ;A8=*Obj
|
||
addk 8,a9 ;Next byte
|
||
movb *a9,a1 ;get new frame number
|
||
abs a1
|
||
movb a1,*a7(BOAFRM)
|
||
|
||
movi BDAMSIZE,a2
|
||
mpyu a2,a1 ;x # entries
|
||
addi bossdam_t-BDAMSIZE,a1 ;+Table base
|
||
move *a7(BODAM),a3 ;Get damage level
|
||
cmpi 47,a3
|
||
jrls ab60
|
||
movi 47,a3 ;Max damage
|
||
ab60 srl 4,a3 ;/16
|
||
sll 5,a3 ;*32
|
||
add a3,a1 ;+Damage level offset
|
||
move *a1,a1,L ;Get * new IMG
|
||
|
||
move *a8(OIMG),a4,L ;Get * old IMG
|
||
move *a4(ICMAP),a4,L ;*Pal
|
||
move *a1(ICMAP),a0,L ;^
|
||
cmp a0,a4
|
||
jreq ab90 ;Same palette
|
||
calla GETFPAL
|
||
move a0,*a8(OPAL) ;Set new palette
|
||
|
||
ab90 move *a8(OFLAGS),a4
|
||
calla ANI
|
||
movb *a9,a1
|
||
jrnn ablp ;More?
|
||
|
||
addk 8,a9 ;Next frame
|
||
PULL a2,a3,a4,a7,a8,a10,a11
|
||
rets
|
||
|
||
********************************
|
||
* Get a random player 1 or 2
|
||
*Rets: A0=*Player leg obj or 0 (Pass Z)
|
||
|
||
SUBRP getplyr
|
||
|
||
movk 1,a0
|
||
callr rnd
|
||
jrnz getp2
|
||
move @PLYRPRCS,a0,L
|
||
jrnz getp1 ;P1?
|
||
move @PLYRPRCS+32,a0,L
|
||
jrz getpx ;No players?
|
||
getp1 move *a0(DEAD),a1
|
||
jrz getpok
|
||
clr a0
|
||
getpx rets
|
||
getp2 move @PLYRPRCS+32,a0,L
|
||
jrnz getp1 ;P2?
|
||
move @PLYRPRCS,a0,L
|
||
jrnz getp1 ;P1?
|
||
rets
|
||
getpok move *a0(LEG_PTR),a0,L
|
||
rets
|
||
|
||
********************************
|
||
* Get * to closest player legs obj
|
||
* A0/A1=XY offset
|
||
* A8=*Boss data struct
|
||
* Trashes A0-A7
|
||
* >A0=*Plyr legs obj or 0 (Pass Z)
|
||
|
||
SUBRP boss_getcloseplyr
|
||
|
||
move @PLYRPRCS,a2,L
|
||
jrz gcp400 ;None?
|
||
move *a2(DEAD),a4
|
||
jrnz gcp400 ;Dead?
|
||
move @PLYRPRCS+32,a3,L
|
||
jrz gcp450 ;None?
|
||
move *a3(DEAD),a4
|
||
jrnz gcp450 ;Dead?
|
||
|
||
move *a8,a4,L ;Get * 1st boss obj
|
||
move *a4(OXPOS),a6 ;Get src XY
|
||
move *a4(OYPOS),a7
|
||
addi AX,a6 ;+Ani pt X offset
|
||
addi AY,a7 ;-Ani pt Y offset
|
||
add a0,a6 ;+Offset
|
||
add a1,a7
|
||
move *a2(LEG_PTR),a0,L
|
||
move *a3(LEG_PTR),a1,L
|
||
move *a0(OXPOS),a4
|
||
sub a6,a4
|
||
move *a0(OYPOS),a5
|
||
sub a7,a5
|
||
abs a4
|
||
abs a5
|
||
cmp a5,a4
|
||
jrhs gcp50
|
||
move a5,a4 ;A4=P1 distance
|
||
|
||
gcp50 move *a1(OXPOS),a5
|
||
sub a6,a5
|
||
move *a1(OYPOS),a6
|
||
sub a7,a6
|
||
abs a5
|
||
abs a6
|
||
cmp a6,a5
|
||
jrhs gcp70
|
||
move a6,a5 ;A5=P2 distance
|
||
gcp70 cmp a5,a4
|
||
jrls gcp80 ;P1 closer?
|
||
move a1,a0
|
||
gcp80 move a0,a0
|
||
rets
|
||
|
||
gcp400 move @PLYRPRCS+32,a2,L ;P1 bad
|
||
jrz gcp800 ;None?
|
||
move *a2(DEAD),a4
|
||
jrnz gcp800 ;Dead?
|
||
gcp450 move *a2(LEG_PTR),a0,L ;P2 bad
|
||
rets
|
||
|
||
gcp800 clr a0 ;P1&P2 bad
|
||
rets ;Pass Z
|
||
|
||
|
||
********************************
|
||
* Eye color cycler (Process)
|
||
|
||
SUBRP cycle_eye
|
||
|
||
movi >3b0001,a8 ;A8=[color # to start at,# to cycle]
|
||
movi ORCP1,a9 ;A9=pal name to cycle
|
||
movi eyecol_t,a10 ;A10=table to cycle it with
|
||
movk 3,a11 ;A11=rate of cycle in ticks
|
||
jauc CYCLE_TABLE
|
||
|
||
eyecol_t
|
||
COLORW 00,00,07, 00,00,13, 00,00,19, 00,00,25
|
||
COLORW 00,00,31, 00,06,31, 00,12,31, 00,18,31
|
||
COLORW 00,12,31, 00,06,31, 00,00,31, 00,00,25
|
||
COLORW 00,00,19, 00,00,13
|
||
.word -1
|
||
|
||
|
||
********************************
|
||
* Get random # with mask
|
||
* A0=Mask
|
||
* Preserves Regs 2-13
|
||
|
||
SUBRP rnd
|
||
|
||
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
|
||
|
||
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
|
||
|
||
|
||
********************************
|
||
* Animation scripts
|
||
|
||
*ANIMATION NUMBERS
|
||
MOUTHCL .set 1 ;MOUTH CLOSED
|
||
MOUTHOP1 .set 2 ;MOUTH OPENING
|
||
MOUTHOP2 .set 3
|
||
MOUTHOP3 .set 4
|
||
EYEBLD .set 5
|
||
EYECNT .set 6 ;EYES CENTER
|
||
EYECL1 .set 7 ;EYES CLOSING
|
||
EYECL2 .set 8
|
||
EYEBUG .set 9 ;BUG EYES
|
||
EYERT1 .set 10 ;EYES RIGHT
|
||
EYERT2 .set 11
|
||
EYELFT1 .set 12 ;EYES LEFT
|
||
EYELFT2 .set 13
|
||
SIDE .set 14
|
||
SHOULDER .set 15
|
||
ARMDN .set 16 ;ARM DOWN
|
||
ARMDN1 .set 17 ;ARM DOWN RECOIL
|
||
ARMDN2 .set 18
|
||
ARML1 .set 19 ;ARM ROTATING TO LEFT
|
||
ARML2 .set 20
|
||
ARML3 .set 21
|
||
ARML4 .set 22
|
||
ARMR1 .set 23 ;ARM ROTATING TO RIGHT
|
||
HDST .set 24 ;LITTLE HEAD STRAIGHT
|
||
HDFROWN .set 25
|
||
HDROAR .set 26
|
||
HDOOOH .set 27
|
||
HDGRIN .set 28
|
||
HDL1NT .set 29 ;LIL HEAD SLIGHT LEFT W/TEETH
|
||
HDL1T .set 30
|
||
HDL2NT .set 31
|
||
HDL2T .set 32
|
||
HDL3 .set 33
|
||
HDL4 .set 34
|
||
HDL5 .set 35
|
||
NUSHD .set 36
|
||
;free .set 37
|
||
NULLOBJ .set 38
|
||
TNG1 .set 39
|
||
TNG2 .set 40
|
||
TNG3 .set 41
|
||
TNG4 .set 42
|
||
TNG5 .set 43
|
||
TNGL .set 44
|
||
TNGR .set 45
|
||
NULLOBJ1 .set 46
|
||
ARMDNPT .set 47
|
||
ARML1PT .set 48
|
||
ARML2PT .set 49
|
||
ARML3PT .set 50
|
||
ARML4PT .set 51
|
||
ARMR1PT .set 52
|
||
THRUST1 .set 53
|
||
THRUST2 .set 54
|
||
HDRIPL .set 55
|
||
TOPRIPL .set 56
|
||
THRUSTNULL .set 57
|
||
BASERIPA .set 58
|
||
LSTANI .set 58
|
||
|
||
|
||
MOUTHL .set 1 ;Part numbers
|
||
MOUTHR .set 2
|
||
SIDEL .set 3
|
||
SIDER .set 4
|
||
EYEL .set 5
|
||
EYER .set 6
|
||
SHLDRL .set 7
|
||
SHLDRR .set 8
|
||
LILHD .set 9 ;LIL HEAD
|
||
ARML .set 10
|
||
ARMR .set 11
|
||
LILHDF .set 14 ;FLIPPED LIL HEAD
|
||
TONGUE .set 15
|
||
THRUSTL .set 16
|
||
THRUSTR .set 17
|
||
|
||
*ANIANITB
|
||
*SEQ(32),TIME(16)
|
||
|
||
hddam_t .long frowner,frowner,frowner,frowner
|
||
.long grimmr,grimmr,grimmr,grimmr
|
||
.long oooher,oooher,oooher,oooher
|
||
.long oooher,oooher,oooher,oooher
|
||
|
||
grinner LW HDGRINA,15
|
||
LW HDGRINA,15
|
||
LWL0 HDGRINA,15
|
||
|
||
frowner LW HDFRWNA,10
|
||
LW HDFRWNA,10
|
||
LWL0 HDFRWNA,10
|
||
|
||
oooher LW HDOOOHA,30
|
||
LWL0 HDOOOHA,20
|
||
|
||
grimmr LW HDGRIM,1
|
||
LW HDGRIM,1
|
||
LW HDGRIM,1
|
||
LWL0 HDGRIM,1
|
||
|
||
|
||
eyequad_t ;Eyeball table
|
||
.long EYESCNT,EYESCNT,EYESCNT,EYESRT1
|
||
.long EYESRT1,EYESRT1,EYESRT2,EYESRT2
|
||
.long EYESRT2,EYESRT2,EYESRT2,EYESRT1
|
||
.long EYESRT1,EYESRT1,EYESCNT,EYESCNT
|
||
.long EYESCNT,EYESCNT,EYESCNT,EYESLFT1
|
||
.long EYESLFT1,EYESLFT1,EYESLFT2,EYESLFT2
|
||
.long EYESLFT2,EYESLFT2,EYESLFT2,EYESLFT1
|
||
.long EYESLFT1,EYESLFT1,EYESCNT,EYESCNT
|
||
|
||
hdquad_t ;Lil head table
|
||
.long HEAD225,HEAD225,HEAD225,HEAD225
|
||
.long HEAD225,HEAD270,HEAD270,HEAD270
|
||
.long HEAD270,HEAD270,HEAD300,HEAD300
|
||
.long HEAD330,HEAD330,HEAD330,HEAD0
|
||
.long HEAD0,HEAD0,HEAD30,HEAD30
|
||
.long HEAD30,HEAD60,HEAD60,HEAD90
|
||
.long HEAD90,HEAD90,HEAD90,HEAD90
|
||
.long HEAD135,HEAD135,HEAD135,HEAD135
|
||
|
||
eyedam_t
|
||
.long bugger,bugger,bugger,bugger
|
||
.long bugger,bugger,bugger,bugger
|
||
.long blinker,blinker,blinker,blinker
|
||
.long blinker,blinker,blinker,blinker
|
||
|
||
|
||
bugger LW EYESBLNK,1
|
||
LW EYESBUG,15
|
||
LW EYESBLNK,1
|
||
LWL0 EYESBUG,15
|
||
|
||
blinker LW EYESBLNK,2
|
||
LW EYESBLNK,2
|
||
LW EYESBLNK,2
|
||
LW EYESBLNK,2
|
||
LW EYESBLNK,2
|
||
LWL0 EYESBLNK,2
|
||
|
||
mouthrnd_t
|
||
LW TNGSTIKA,7
|
||
LW bite_seq,10
|
||
LW CHOMP3,2
|
||
LW CHOMP2,3
|
||
LW TNGSTIKA,7
|
||
LW bite_seq,10
|
||
LW CHOMP3,5
|
||
LW CHOMP2,1
|
||
LW TNGSTIKA,7
|
||
LW bite_seq,10
|
||
LW CHOMP3,5
|
||
LW CHOMP2,3
|
||
LW TNGSTIKA,7
|
||
LW bite_seq,10
|
||
LW TNGSTIKA,7
|
||
LW bite_seq,10
|
||
|
||
|
||
*ANIMATION TABLE
|
||
*PART #, ANI FRAME
|
||
*-=End of frame
|
||
|
||
*Thrust sequences
|
||
|
||
thrusthi_seq .byte THRUSTL,THRUST2,THRUSTR,-THRUST2
|
||
thrustlo_seq .byte THRUSTL,THRUST1,THRUSTR,-THRUST1
|
||
thrustnull_seq .byte THRUSTL,THRUSTNULL,THRUSTR,-THRUSTNULL
|
||
|
||
|
||
*OPEN MOUTH
|
||
|
||
bite_seq
|
||
.byte MOUTHL,MOUTHOP1,MOUTHR,-MOUTHOP1
|
||
.byte MOUTHL,MOUTHOP2,MOUTHR,-MOUTHOP2
|
||
.byte MOUTHL,MOUTHOP3,MOUTHR,-MOUTHOP3
|
||
.byte MOUTHL,MOUTHOP2,MOUTHR,-MOUTHOP2
|
||
.byte MOUTHL,MOUTHOP1,MOUTHR,-MOUTHOP1
|
||
BITECL .byte MOUTHL,MOUTHCL,MOUTHR,-MOUTHCL
|
||
.word 0
|
||
CHOMP3 .byte MOUTHL,MOUTHOP1,MOUTHR,-MOUTHOP1
|
||
.byte MOUTHL,MOUTHOP2,MOUTHR,-MOUTHOP2
|
||
.byte MOUTHL,MOUTHOP3,MOUTHR,-MOUTHOP3
|
||
.byte MOUTHL,MOUTHOP2,MOUTHR,-MOUTHOP2
|
||
.byte MOUTHL,MOUTHOP1,MOUTHR,-MOUTHOP1
|
||
.byte MOUTHL,MOUTHCL,MOUTHR,-MOUTHCL
|
||
CHOMP2 .byte MOUTHL,MOUTHOP1,MOUTHR,-MOUTHOP1
|
||
.byte MOUTHL,MOUTHOP2,MOUTHR,-MOUTHOP2
|
||
.byte MOUTHL,MOUTHOP3,MOUTHR,-MOUTHOP3
|
||
.byte MOUTHL,MOUTHOP2,MOUTHR,-MOUTHOP2
|
||
.byte MOUTHL,MOUTHOP1,MOUTHR,-MOUTHOP1
|
||
.byte MOUTHL,MOUTHCL,MOUTHR,-MOUTHCL
|
||
.byte MOUTHL,MOUTHOP1,MOUTHR,-MOUTHOP1
|
||
.byte MOUTHL,MOUTHOP2,MOUTHR,-MOUTHOP2
|
||
.byte MOUTHL,MOUTHOP3,MOUTHR,-MOUTHOP3
|
||
.byte MOUTHL,MOUTHOP2,MOUTHR,-MOUTHOP2
|
||
.byte MOUTHL,MOUTHOP1,MOUTHR,-MOUTHOP1
|
||
.byte MOUTHL,MOUTHCL,MOUTHR,-MOUTHCL
|
||
.word 0
|
||
|
||
*EYE ANIMATIONS
|
||
|
||
EYESBLNK
|
||
.byte EYEL,EYECL1,EYER,-EYECL1 ;EYES HALF CLOSED
|
||
.byte EYEL,EYECL2,EYER,-EYECL2 ;EYES CLOSED
|
||
.byte EYEL,EYECL2,EYER,-EYECL2 ;EYES CLOSED
|
||
.byte EYEL,EYECL1,EYER,-EYECL1 ;EYES HALF CLOSED
|
||
.byte EYEL,EYECNT,EYER,-EYECNT ;EYES CENTERED
|
||
.word 0
|
||
EYESCNT .byte EYEL,EYECNT,EYER,-EYECNT ;EYES CENTERED
|
||
EYESLFT1
|
||
.byte EYEL,EYELFT1,EYER,-EYERT1 ;EYES LEFT
|
||
EYESLFT2
|
||
.byte EYEL,EYELFT2,EYER,-EYERT2 ;EYES LEFT EXTREME
|
||
.byte EYEL,EYELFT1,EYER,-EYERT1 ;EYES LEFT
|
||
.byte EYEL,EYECNT,EYER,-EYECNT ;EYES CENTERED
|
||
EYESRT1 .byte EYEL,EYERT1,EYER,-EYELFT1 ;EYES RIGHT
|
||
EYESRT2 .byte EYEL,EYERT2,EYER,-EYELFT2 ;EYES RIGHT EXTREME
|
||
.byte EYEL,EYERT1,EYER,-EYELFT1 ;EYES RIGHT
|
||
.byte EYEL,EYECNT,EYER,-EYECNT ;EYES CENTERED
|
||
.word 0
|
||
EYESLT3 .byte EYEL,EYELFT1,EYER,-EYERT1 ;EYES LEFT
|
||
.byte EYEL,EYELFT2,EYER,-EYERT2 ;EYES LEFT EXTREME
|
||
.byte EYEL,EYELFT1,EYER,-EYERT1 ;EYES LEFT
|
||
.byte EYEL,EYECNT,EYER,-EYECNT ;EYES CENTERED
|
||
.word 0
|
||
|
||
|
||
|
||
*BUGEYES
|
||
EYESBUG .byte EYEL,EYEBUG,EYER,-EYEBUG ;EYES BUGGED
|
||
.byte EYEL,EYECNT,EYER,-EYECNT ;EYES CENTERED
|
||
.word 0
|
||
hdblo_seq ;Little head blown
|
||
.byte LILHD,HDRIPL,LILHDF,-NULLOBJ
|
||
|
||
shldrblo_seq ;Shoulders blown
|
||
.byte LILHD,NULLOBJ,LILHDF,NULLOBJ
|
||
.byte SHLDRL,TOPRIPL,SHLDRR,-TOPRIPL
|
||
|
||
bodyblo_seq
|
||
.byte ARML,NULLOBJ,ARMR,NULLOBJ
|
||
.byte EYEL,NULLOBJ,EYER,NULLOBJ
|
||
.byte SIDEL,NULLOBJ,SIDER,NULLOBJ
|
||
.byte TONGUE,NULLOBJ
|
||
.byte THRUSTL,THRUSTNULL,THRUSTR,THRUSTNULL
|
||
.byte SHLDRL,NULLOBJ,SHLDRR,NULLOBJ
|
||
.byte MOUTHL,BASERIPA,MOUTHR,-BASERIPA
|
||
|
||
*LITTLE HEAD ROTATE
|
||
HEAD30 .byte LILHD,HDL1NT,LILHDF,-NULLOBJ
|
||
HEAD60 .byte LILHD,HDL2NT,LILHDF,-NULLOBJ
|
||
HEAD90 .byte LILHD,HDL3,LILHDF,-NULLOBJ
|
||
HEAD135 .byte LILHD,HDL4,LILHDF,-NULLOBJ
|
||
HEAD225 .byte LILHD,NULLOBJ,LILHDF,-HDL4
|
||
HEAD270 .byte LILHD,NULLOBJ,LILHDF,-HDL3
|
||
HEAD300 .byte LILHD,NULLOBJ,LILHDF,-HDL2NT
|
||
HEAD330 .byte LILHD,NULLOBJ,LILHDF,-HDL1NT
|
||
HEAD0 .byte LILHD,HDST,LILHDF,-NULLOBJ
|
||
.word 0
|
||
|
||
|
||
HDGRIM .byte LILHD,HDL1T,LILHDF,-NULLOBJ
|
||
.byte LILHD,HDL2T,LILHDF,-NULLOBJ
|
||
.byte LILHD,HDL3,LILHDF,-NULLOBJ
|
||
.byte LILHD,HDL2T,LILHDF,-NULLOBJ
|
||
.byte LILHD,HDL1T,LILHDF,-NULLOBJ
|
||
.byte LILHD,HDST,LILHDF,-NULLOBJ
|
||
.byte LILHD,NULLOBJ,LILHDF,-HDL1T
|
||
.byte LILHD,NULLOBJ,LILHDF,-HDL2T
|
||
.byte LILHD,NULLOBJ,LILHDF,-HDL3
|
||
.byte LILHD,NULLOBJ,LILHDF,-HDL2T
|
||
.byte LILHD,NULLOBJ,LILHDF,-HDL1T
|
||
.byte LILHD,HDST,LILHDF,-NULLOBJ
|
||
.word 0
|
||
*HEAD GRIN
|
||
HDGRINA .byte LILHD,HDGRIN,LILHDF,-NULLOBJ
|
||
.byte LILHD,HDST,LILHDF,-NULLOBJ
|
||
.word 0
|
||
*HEAD OOOH
|
||
HDOOOHA .byte LILHD,HDOOOH,LILHDF,-NULLOBJ
|
||
.byte LILHD,HDST,LILHDF,-NULLOBJ
|
||
.word 0
|
||
*HEAD FROWN
|
||
HDFRWNA .byte LILHD,HDFROWN,LILHDF,-NULLOBJ
|
||
.byte LILHD,HDST,LILHDF,-NULLOBJ
|
||
.word 0
|
||
|
||
*LEFT ARM FIRE POS. 1
|
||
LARMF1
|
||
.byte ARML,-ARMDN1
|
||
.byte ARML,-ARMDN
|
||
.word 0
|
||
*LEFT ARM FIRE POS. 2
|
||
LARMF2
|
||
.byte ARML,-ARML1PT
|
||
.byte ARML,-ARML1
|
||
.word 0
|
||
|
||
*LEFT ARM FIRE POS. 3
|
||
LARMF3
|
||
.byte ARML,-ARML2PT
|
||
.byte ARML,-ARML2
|
||
.word 0
|
||
*LEFT ARM FIRE POS. 4
|
||
LARMF4
|
||
.byte ARML,-ARML3PT
|
||
.byte ARML,-ARML3
|
||
.word 0
|
||
*LEFT ARM FIRE POS. 5
|
||
LARMF5
|
||
.byte ARML,-ARML4PT
|
||
.byte ARML,-ARML4
|
||
.word 0
|
||
*LEFT ARM FIRE POS. 6
|
||
LARMF6
|
||
.byte ARML,-ARMR1PT
|
||
.byte ARML,-ARMR1
|
||
.word 0
|
||
*RT ARM FIRE POS. 1
|
||
RARMF1
|
||
.byte ARMR,-ARMDN1
|
||
.byte ARMR,-ARMDN
|
||
.word 0
|
||
*RT ARM FIRE POS. 2
|
||
RARMF2
|
||
.byte ARMR,-ARML1PT
|
||
.byte ARMR,-ARML1
|
||
.word 0
|
||
*RT ARM FIRE POS. 3
|
||
RARMF3
|
||
.byte ARMR,-ARML2PT
|
||
.byte ARMR,-ARML2
|
||
.word 0
|
||
|
||
*RT ARM FIRE POS. 4
|
||
RARMF4
|
||
.byte ARMR,-ARML3PT
|
||
.byte ARMR,-ARML3
|
||
.word 0
|
||
|
||
*RT ARM FIRE POS. 5
|
||
RARMF5
|
||
.byte ARMR,-ARML4PT
|
||
.byte ARMR,-ARML4
|
||
.word 0
|
||
|
||
*RT ARM FIRE POS. 6
|
||
RARMF6
|
||
.byte ARMR,-ARMR1PT
|
||
.byte ARMR,-ARMR1
|
||
.word 0
|
||
|
||
*ARM FIRE SEQUENCE
|
||
ARMFIRE
|
||
.byte ARML,ARMR1,ARMR,-ARMR1
|
||
.byte ARML,ARMR1PT,ARMR,-ARMR1PT
|
||
.byte ARML,ARMR1,ARMR,-ARMR1
|
||
.byte ARML,ARMDN,ARMR,-ARMDN
|
||
.byte ARML,ARMDNPT,ARMR,-ARMDNPT
|
||
.byte ARML,ARMDN,ARMR,-ARMDN
|
||
.byte ARML,ARML1,ARMR,-ARML1
|
||
.byte ARML,ARML1PT,ARMR,-ARML1PT
|
||
.byte ARML,ARML1,ARMR,-ARML1
|
||
.byte ARML,ARML2,ARMR,-ARML2
|
||
.byte ARML,ARML2PT,ARMR,-ARML2PT
|
||
.byte ARML,ARML2,ARMR,-ARML2
|
||
.byte ARML,ARML3,ARMR,-ARML3
|
||
.byte ARML,ARML3PT,ARMR,-ARML3PT
|
||
.byte ARML,ARML3,ARMR,-ARML3
|
||
.byte ARML,ARML4,ARMR,-ARML4
|
||
.byte ARML,ARML4PT,ARMR,-ARML4PT
|
||
.byte ARML,ARML4,ARMR,-ARML4
|
||
.byte ARML,ARML3,ARMR,-ARML3
|
||
.byte ARML,ARML2,ARMR,-ARML2
|
||
.byte ARML,ARML1,ARMR,-ARML1
|
||
.byte ARML,ARMDN,ARMR,-ARMDN
|
||
.word 0
|
||
*TONGUE STICK OUT
|
||
TNGSTIKA
|
||
.byte MOUTHL,MOUTHOP1,MOUTHR,-MOUTHOP1
|
||
.byte MOUTHL,MOUTHOP2,MOUTHR,-MOUTHOP2
|
||
.byte MOUTHL,MOUTHOP3,MOUTHR,-MOUTHOP3
|
||
.byte TONGUE,-TNG1
|
||
.byte TONGUE,-TNG2
|
||
.byte TONGUE,-TNG3
|
||
.byte TONGUE,-TNG4
|
||
.byte TONGUE,-TNG5
|
||
.byte TONGUE,-TNGL
|
||
.byte TONGUE,-TNGR
|
||
.byte TONGUE,-TNGL
|
||
.byte TONGUE,-TNGR
|
||
.byte TONGUE,-TNG5
|
||
.byte TONGUE,-TNG4
|
||
.byte TONGUE,-TNG3
|
||
.byte TONGUE,-TNG2
|
||
.byte TONGUE,-TNG1
|
||
.byte TONGUE,-NULLOBJ1
|
||
.byte MOUTHL,MOUTHOP2,MOUTHR,-MOUTHOP2
|
||
.byte MOUTHL,MOUTHOP1,MOUTHR,-MOUTHOP1
|
||
.byte MOUTHL,MOUTHCL,MOUTHR,-MOUTHCL
|
||
.word 0
|
||
|
||
********************************
|
||
* Boss damage table
|
||
* 0-255
|
||
|
||
BDAMSIZE .equ 32*3
|
||
|
||
bossdam_t
|
||
.long OMTH1,OMTH1A,OMTH1B ;1 MOUTH CLOSED
|
||
.long OMTH2,OMTH2A,OMTH2B ;2 MOUTH SLIGHTLY OPEN
|
||
.long OMTH3,OMTH3A,OMTH3B ;3 MOUTH MORE OPEN
|
||
.long OMTH4,OMTH4A,OMTH4B ;4 MOUTH MORE OPEN
|
||
.long OEYES1C,OEYES1C,OEYES1C ;5 BLOODY EYE
|
||
.long OEYES1,OEYES1A,OEYES1C ;6 EYE CENTERED
|
||
.long OEYES1A,OEYES1A,OEYES1C ;7 EYE HALF CLOSED
|
||
.long OEYES1B,OEYES1A,OEYES1C ;8 EYE CLOSED
|
||
.long OEYES2,OEYES1A,OEYES1C ;9 EYE BUGGED OPEN CENTERED
|
||
.long OEYES3,OEYES1A,OEYES1C ;10 EYE HALF RIGHT
|
||
.long OEYES4,OEYES1A,OEYES1C ;11 EYE RIGHT
|
||
.long OEYES3A,OEYES1A,OEYES1C ;12 EYE HALF LEFT
|
||
.long OEYES4A,OEYES1A,OEYES1C ;13 EYE LEFT
|
||
.long SIDEPC,SIDEPC,SIDEPC ;14 SIDE OF CHEEK
|
||
.long SHLDR,SHLDR,SHLDR ;15 SHOULDER STRAP
|
||
.long OARM1,ARMRIP,NULO ;16 ARM DOWN
|
||
.long OARM1A,ARMRIP,NULO ;17 ARM DOWN PARTIAL RECOIL
|
||
.long OARM1B,ARMRIP,NULO ;18 ARM DOWN FULL RECOIL
|
||
.long OARM2,ARMRIP,NULO ;19 ARM SLIGHT ANGLE LEFT
|
||
.long OARM3,ARMRIP,NULO ;20 ARM MORE ANGLE LEFT
|
||
.long OARM4,ARMRIP,NULO ;21 ARM EVEN MORE ANGLE LEFT
|
||
.long OARM5,ARMRIP,NULO ;22 ARM FULL LEFT HORIZONTAL
|
||
.long OARM6,ARMRIP,NULO ;23 ARM SLIGHT ANGLE RIGHT
|
||
.long ORCHD1,ORCHD1,ORCHD1 ;24 LITTLE HEAD STRAIGHT FACE
|
||
.long ORCHD1A,ORCHD1A,ORCHD1A ;25 LITTLE HEAD FROWN FACE
|
||
.long ORCHD1B,ORCHD1B,ORCHD1B ;26 LITTLE HEAD ROAR FACE
|
||
.long ORCHD1C,ORCHD1C,ORCHD1C ;27 LITTLE HEAD OOOOHHH FACE
|
||
.long ORCHD1D,ORCHD1D,ORCHD1D ;28 LITTLE HEAD TOOTHY GRIN FACE
|
||
.long ORCHD2,ORCHD2,ORCHD2 ;29 LITTLE HEAD SLIGHTLY LEFT FACE (NO TEETH)
|
||
.long ORCHD2A,ORCHD2A,ORCHD2A ;30 LITTLE HEAD SLIGHTLY LEFT FACE (TEETH)
|
||
.long ORCHD3,ORCHD3,ORCHD3 ;31 LITTLE HEAD 45 LEFT FACE (NO TEETH)
|
||
.long ORCHD3A,ORCHD3A,ORCHD3A ;32 LITTLE HEAD 45 LEFT FACE (TEETH)
|
||
.long ORCHD4,ORCHD4,ORCHD4 ;33 LIL HEAD 60
|
||
.long ORCHD5,ORCHD5,ORCHD5 ;34 LIL HEAD 90
|
||
.long ORCHD6,ORCHD6,ORCHD6 ;35 LIL HEAD 135
|
||
.long NUSHAD,NUSHAD,NUSHAD ;36 SHADOW
|
||
.long NULO,NULO,NULO ;37 SIDE SHADOW was> OSHAD2,OSHAD2,OSHAD2
|
||
.long NULO,NULO,NULO ;38 NULL OBJECT
|
||
.long TUNG1D,TUNG1D,TUNG1D ;39 TONGUE SMALLEST
|
||
.long TUNG1C,TUNG1C,TUNG1C ;40 TONGUE NEXT SMALLEST
|
||
.long TUNG1B,TUNG1B,TUNG1B ;41 TONGUE NEXT SMALLEST
|
||
.long TUNG1A,TUNG1A,TUNG1A ;42 TONGUE NEXT SMALLEST
|
||
.long TUNG1,TUNG1,TUNG1 ;43 TONGUE FULL SIZE
|
||
.long TUNG2,TUNG2,TUNG2 ;44 TONGUE FULL SIZE CURVE TO LEFT
|
||
.long TUNG3,TUNG3,TUNG3 ;45 TONGUE FULL SIZE CURVE TO RIGHT
|
||
.long NULO1,NULO1,NULO1 ;46 TONGUE NULL
|
||
.long OARM1PT,OARM1PT,ARMRIP ;47 ARM1 FIRE ANI
|
||
.long OARM2PT,OARM2PT,ARMRIP ;48 ARM2 FIRE ANI
|
||
.long OARM3PT,OARM3PT,ARMRIP ;49 ARM3 FIRE ANI
|
||
.long OARM4PT,OARM4PT,ARMRIP ;50 ARM4 FIRE ANI
|
||
.long OARM5PT,OARM5PT,ARMRIP ;51 ARM5 FIRE ANI
|
||
.long OARM6PT,OARM6PT,ARMRIP ;52 ARM6 FIRE ANI
|
||
.long ORCFLM1,ORCFLM1,ORCFLM1 ;53 FLAME 1
|
||
.long ORCFLM2,ORCFLM2,ORCFLM2 ;54 FLAME 2
|
||
.long HDRIP,HDRIP,HDRIP ;55 HEAD RIPPED LEFT
|
||
.long TOPRIP,TOPRIP,TOPRIP ;56 TOP (SHOULDERS) RIPPED OFF
|
||
.long THRSTNL,THRSTNL,THRSTNL ;57 Thrust null
|
||
.long BASERIP,BASERIP,BASERIP ;58 BASE RIP
|
||
|
||
|
||
|
||
********************************
|
||
* Initialize boss
|
||
* A0=X, A1=Y, A11=Damage level
|
||
|
||
SUBRP boss_init
|
||
|
||
PUSH a2,a3,a12,a13
|
||
movi boss_t,a12 ;A12=*Init data
|
||
movi bossd_t,a13
|
||
|
||
binlp move *a12+,a4 ;Get OFLAGS
|
||
jrz binx ;End?
|
||
move *a12+,a5 ;OID
|
||
zext a5
|
||
|
||
move *a12+,a6 ;Get ani frame #
|
||
move a6,*a13(BODAMR) ;Set damage resistance & frame #
|
||
srl 8,a6 ;Dump BODAMR
|
||
subk 1,a6
|
||
movi BDAMSIZE,a7
|
||
mpyu a6,a7 ;adjust for length of entry
|
||
addi bossdam_t,a7 ;add table base
|
||
move *a7,a2,L ;get oimg pointer
|
||
|
||
clr a6 ;XV
|
||
clr a7 ;YV
|
||
move *a12+,a3 ;Z
|
||
PUSH a0
|
||
CALLA BEGINOBJ2
|
||
PULL a0
|
||
move a13,*a8(OPLINK),L ;Link object to block structure
|
||
move a11,*a13(BODAM) ;Set damage level
|
||
move a8,*a13+,L ;Save pointer to obj
|
||
addk 32,a13
|
||
jruc binlp
|
||
|
||
binx clr a0
|
||
move a0,*a13,L ;Zero last pointer to mark end
|
||
PULL a2,a3,a12,a13
|
||
CREATE BOSSPID,boss_glue ;Keep boss together
|
||
|
||
rets
|
||
|
||
|
||
* Boss initial data table
|
||
|
||
boss_t
|
||
*PART 1 LEFT MOUTH
|
||
.word DMAWNZ+M_PIXSCAN ;Flags
|
||
.word CLSENMY|TYPFACE|SUBMTHL ;Type
|
||
.byte -1,MOUTHCL ;Damage resistance, Ani#
|
||
.word 159 ;Z
|
||
*PART 2 RIGHT MOUTH
|
||
.word DMAWNZ+M_PIXSCAN+M_FLIPH
|
||
.word CLSENMY|TYPFACE|SUBMTHR
|
||
.byte -1,MOUTHCL
|
||
.word 159
|
||
*PART 3 LEFT SIDE PIECE
|
||
.word DMAWNZ+M_PIXSCAN
|
||
.word CLSENMY|TYPFACE|SUBSIDEL
|
||
.byte 0,SIDE
|
||
.word 159
|
||
*PART 4 RT SIDE PIECE
|
||
.word DMAWNZ+M_PIXSCAN+M_FLIPH
|
||
.word CLSENMY|TYPFACE|SUBSIDER
|
||
.byte 0,SIDE
|
||
.word 159
|
||
*PART 5 LEFT EYE
|
||
.word DMAWNZ
|
||
.word CLSENMY|TYPFACE|SUBEL
|
||
.byte 0,EYECNT
|
||
.word 160
|
||
*PART 6 RIGHT EYE
|
||
.word DMAWNZ+M_FLIPH
|
||
.word CLSENMY|TYPFACE|SUBER
|
||
.byte 0,EYECNT
|
||
.word 160
|
||
*PART 7 LEFT SHOULDER
|
||
.word DMAWNZ
|
||
.word CLSENMY|TYPFACE|SUBSHLDL
|
||
.byte 0,SHOULDER
|
||
.word 163
|
||
*PART 8 RT SHOULDER
|
||
.word DMAWNZ+M_FLIPH
|
||
.word CLSENMY|TYPFACE|SUBSHLDR
|
||
.byte 0,SHOULDER
|
||
.word 163
|
||
*PART 9 LIL HEAD
|
||
.word DMAWNZ
|
||
.word CLSENMY|TYPFACE|SUBHD
|
||
.byte 0,HDST
|
||
.word 163
|
||
*PART 10 LEFT ARM
|
||
.word DMAWNZ+M_PIXSCAN
|
||
.word CLSENMY|TYPFACE|SUBARML
|
||
.byte -1,ARMDN
|
||
.word 160
|
||
*PART 11 RIGHT ARM
|
||
.word DMAWNZ+M_PIXSCAN+M_FLIPH
|
||
.word CLSENMY|TYPFACE|SUBARMR
|
||
.byte -1,ARMDN
|
||
.word 160
|
||
*PART 12 LEFT SHADOW
|
||
.word DMACNZ+M_NOCOLL
|
||
.word CLSDEAD
|
||
.byte 0,NUSHD
|
||
.word 150
|
||
*PART 13 RIGHT SHADOW
|
||
.word DMACNZ+M_NOCOLL+M_FLIPH
|
||
.word CLSDEAD
|
||
.byte 0,NUSHD
|
||
.word 150
|
||
*PART 14 LIL HEAD FLIPPED
|
||
.word DMAWNZ+M_FLIPH
|
||
.word CLSENMY|TYPFACE|SUBHD
|
||
.byte 0,NULLOBJ
|
||
.word 162
|
||
*PART 15 TONGUE
|
||
.word DMAWNZ
|
||
.word CLSENMY|TYPFACE|SUBTUNG
|
||
.byte 0,NULLOBJ1
|
||
.word 160
|
||
*PART 16 LEFT FLAME
|
||
.word DMAWNZ
|
||
.word CLSENMY|TYPFACE|SUBFLAM
|
||
.byte 0,THRUSTNULL
|
||
.word 158
|
||
*PART 17 RT FLAME
|
||
.word DMAWNZ+M_FLIPH
|
||
.word CLSENMY|TYPFACE|SUBFLAM
|
||
.byte 0,THRUSTNULL
|
||
.word 158
|
||
.word 0
|
||
|
||
|
||
;Null object definition
|
||
;Lil head null
|
||
NULO .word 1,1,1000,-8 ;Off screen
|
||
.long IROM
|
||
.long ORCP1
|
||
;Tung null
|
||
NULO1 .word 1,1,11,-118
|
||
.long IROM
|
||
.long RIPAL
|
||
;Thrust null
|
||
THRSTNL .word 1,1,1000,-118
|
||
.long IROM
|
||
.long BLUBOOM
|
||
|
||
|
||
|
||
|
||
.end
|
||
|