total-carnage/RBOSS.ASM

5498 lines
99 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

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

**************************************************************
*
* 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