total-carnage/ABOSS.ASM

3986 lines
72 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

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

**************************************************************
*
* Software: Shawn Liptak
* Initiated: 11/17/91 from Orcus
*
* Modified: Shawn Liptak, 1/6/92 -Done??
* Shawn Liptak, 1/24/92 -DIP switch for keys
*
*
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 1/24/92 22:49
**************************************************************
.TITLE 'Akhboobs flying death machine,face & pleasure domes'
.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"
.include "akhbboss.tbl"
.ref CURRENT,BCURRENT,TARGET,HZSPD,ICLIST,ICN5A
.ref TTORSO,SETC2,WIPEOUT
.ref PLYRPRCS,P1DATA,P2DATA
.ref FADEIN,COLCYC,FB_FADEOUT,FB_FADEIN,IRQSKYE,FADE_STRT
.ref ONESNDOVR
.ref OUT_FLG,FLASHME,GAMERASE
.ref PCNT,WAVE,HALT,NOSHOOT,START
.ref FRANIMQ,GETFPAL,CLNPAL
.ref XBOOM2,BOOM3
.ref SCRADD2
.ref RNDRNGS,RNDRNG
.ref anim_script ;anim_wait
.ref prt0_xy
.ref fry_plyrs
.ref getcloseplyr
.ref BAKMODS,KILBGND,BGND_UD1
.ref CRSRAM,CTOTAL,T72PNTR
.ref BOTMBMOD,DOMEBMOD,THRONEBMOD
.ref TAUNTOUT,NO_START,SHK_ON,ICONS_DN,ESCAPED
.ref SCRLUP,SCORE_FLAG,INIT_SCORE,BONE
.ref PLYRS_CNTR,JOY_UPDATE,P1CTRL,P2CTRL
.ref STATUS,DRAW_PLYR_TORSO,DMA_SCORE,ZONE_TXT2
.ref FIXGUNS,SETDET,COLLISIONS
.ref AFTR_WRP,LSHIT
.ref GAMEOVER,vidhwfx_flyin
.ref endome_p
.ref STRCNRMO,SPECT,ERASE_TXT
.ref RD15FONT,RD7FONT
.ref aud_addnumplyrs,AUD
.ref FINDPAL,girls
.ref mortar_akhboob
.ref mk_objfranim
.ref seekob_dir32la
.ref rocket_fireab
.ref missile_fireab
.ref aboss_smoketrail
.ref sodboss
.def WFLG,WATR1,WATR2,WATR3
.def bossmeterv
;Sound headers
.ref LOVEIT
yousuck .word >f9a0,10,>80c5,0 ;You suck at this game!
musicsnd .word >f3fe,10,>800e,0 ;Boss music
;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,>8130,0 ;Blood bubbling
;bubl2snd .word >f0e5,20,>8131,0 ;^
;bubl3snd .word >f2e5,20,>8086,0 ;^
;myeyesnd .word >f9e0,110,>8118,0 ;
;myarmsnd .word >f9e0,120,>8119,0 ;
;myheadsnd .word >f9e0,70,>8121,0 ;
msllnchsnd .word >f290,10,>80b6,0 ;Missile launch
mslexpsnd .word >f470,10,>8048,0 ;Missile explosion
whawhasnd .word >fbee,90,>8088,0 ;Whawha
racktunesnd .word >f3fe,10,>800d,0 ;Rackup tune
* Aboss
ahkb1 .word >f9a0,60,>80eb,0 ;Akhboob speech
ahkb2 .word >f9a0,60,>80ec,0 ;^
ahkb3 .word >f9a0,60,>80ed,0 ;^
ahkbsta .word >f9a0,60,>80ee,0 ;^ start angry
ahkbang .word >f9a0,60,>80ef,0 ;^ angry
doorsldsnd .word >f480,2,>804c,0 ;Door slides
rcktlnchsnd .word >f290,10,>812c,0 ;Rocket launch
;puffsnd .word >f280,10,>8085,0 ;Attack balls puffing
tungsnd .word >f290,10,>80b6,0 ;Tongue launch
pain1snd .word >f1f1,40,>8141,0 ;Ow
pain2snd .word >f1f1,60,>814c,0 ;Laugh
pain3snd .word >f1f1,60,>8150,0 ;Hahaha
pain4snd .word >f1f1,80,>8156,0 ;See if I care
germ1snd .word >f9f7,120,>8142,0
germ2snd .word >f9f7,60,>8143,0
germ3snd .word >f9f7,80,>8144,0
germ4snd .word >f9f7,60,>8145,0
germ5snd .word >f9f7,60,>8146,0
germ6snd .word >f9f7,60,>8147,0
yougoodsnd .word >f9f7,60,>8148,0 ;Your really good
excusesnd .word >f9f0,10,>814f,0 ;Excuse me
painbpsnd .word >f9f7,80,>8154,0 ;Pain before pleasure
laffsnd .word >f9f7,60,>814c,0 ;Laugh
peacesnd .word >f9f7,90,>8155,0 ;Peaceful citizen
amnotsnd .word >f9f7,60,>8149,0 ;Not
* Pleasure dome
pdtunesnd .word >f3fe,10,>800b,0 ;Pleasure tune
pdwelcomesnd .word >f9a0,60,>813f,0 ;Welcome
TOTCARN .word >f9f0,120,>80cf,0 ;"TOTAL CARNAGE"
WOO1 .word >f97e,>24,>80cb,0 ;WHHOOO
WOO2 .word >f97e,>24,>80cc,0 ;"YEAH"
gosnd .word >f17e,20,>8140 ;Go
.word >f17e,20,>8140
.word >f17e,20,>8140,0
pddoorsnd .word >f0c0,10,>811a,0 ;Big door
.bss bossd_t,25*16*4 ;Boss object data structure
.bss cycmem,16*10*2 ;10 color words *2 for cycle
.bss abossshld,16 ;-1=Eject, 0=Invulnerable, +=Shield str
.bss abossaballnum,16 ;Num atkballs active
.bss bodystat,16 ;-=Dead face, 0=Ship, 1-3=face
.bss bloflg,16
.bss abramend,0
.bss keytotal,16 ;Plyrs key total at end for prt
.bss bossmeterv,16 ;Meter value 0-250*16 (4 bits frac)
.bss WFLG,16 ;0=NOT ON, 1=YES IT IS ON
****************************************************************
* Akhboob's flying death machine & killer wall (Process)
****************************************************************
EASY .equ 0 ;Makes easy for DEBUG
SUBABANI .equ 1 ;Akhboob ani process
SUBFEYEANI .equ 2 ;Face eye ani process
SUBABMORT .equ 3 ;Akhboob mortar
SUBABGRNT .equ >20 ;Akhboob grunt
SUBBOSSHALT .equ >80 ;Freezes action on halt
;Boss data struct
ABDOBJ .set >0 ;*Parts obj
ABDXO .set >20 ;X offset from ani pt
ABDSHLD .set >30 ;Shield, 0=Dead, +=OK
ABXO .equ 24 ;1st obj offsets for center
ABYO .equ 40
PDX .equ 2364 ;Pleasure dome XY
PDY .equ 3020
ABWRLDTY .set 100 ;Bkgnd world top Y for end of scroll
WORDPD abmode ,0 ;Mode, -=At top, 0=Msl mania,
; 1=Chase plyr, 2=Balls
WORDPD absko ,1 ;Seek offset -1/1
WORDPD abdrag ,2 ;Drag shift
WORDPD abmtrdie ,3 ;!0=Boss meter dies
********************************
* Main aboss loop
* A8=Mode (0=Normal, 1=Debug)
SUBR aboss
movk AUDBOSSEND,a0
calla aud_addnumplyrs
movi base1,a0
move a0,@CURRENT,L
movi 35,a0
move a0,@WAVE
movi musicsnd,a0
calla ONESND
clr a0 ;>Clear out boss variables
movi bossd_t,a1
abossc move a0,*a1+
cmpi abramend,a1
jrlo abossc
CREATE BOSSPID,plyr_shoeson
.if DEBUG
move a8,a8
jrnz aboss_test ;Do test?
.endif
move @WORLDTLX+16,a8 ;>Scroll up to pit
addk 5,a8 ;A8=X target line to trigger scroll
clr a9 ;A9=0 (no check for y target)
movi path1_t,a10 ;Scroll table
movi >10000,a0
move a0,@HZSPD,L
CREATE TARGPID,TARGET
movi boss_as,a8
CREATE ANIMPID,anim_script
abl50 SLEEPK 5
movi TARGPID,a0
movi -1,a1
calla EXISTP
jrnz abl50 ;Scroll on?
calla CLNPAL
SLEEP 356
clr a0
move a0,*a13(abmtrdie)
move a13,a11
CREATE BOSSPID,ab_bossmeter
movi abosspal_t,a0
movk 2,a1
calla FADEIN
SLEEPK 4+6*3
movi 200,a0
movi SHPY+310,a1
movi abossshp_t,a9 ;*Init data
callr aboss_init
movi BBSHPAL,a8
movi cycmem,a9 ;Ram area
movi [60,64],a10 ;Begin/end color #
movk 3,a11 ;Rate in ticks
CREATE CYCPID,COLCYC ;Color cycler on
move @bossd_t,a8,L ;A8=*1st obj
move a13,a11
CREATE BOSSPID,ab_scrollstrt
CREATE BOSSPID,ab_gunturrets
CREATE BOSSPID,ab_msllauncher
CREATE BOSSPID|SUBABANI,ab_akhboobani
CREATE BOSSPID|SUBBOSSHALT,boss_halter
clr a10 ;A10=Dir 0-31
movk 1,a0
move a0,*a13(absko) ;-1 or 1
movi -4,a0 ;Normal speed
move a0,*a13(abdrag)
move a0,*a13(abmode) ;Neg
movi 60*14,a11 ;A11=Mode cnt down (Chase time)
.if EASY
movi 10,a11 ;DEBUG
.endif
abosslp
SLEEPK 1
move *a13(abmode),a0 ;>Mode change
jrle abl200 ;Guns still good?
subk 1,a11
jrgt abl200 ;Still counting?
movi 60*60*20,a11 ;Ball time
abl150 addk 1,a0
move a0,*a13(abmode)
subk 2,a0
jrne abl200 ;!Ball time?
movi bossd_t+BLPART,a9 ;*Left ball data
CREATE BOSSPID,ab_atkball
movi bossd_t+BRPART,a9 ;*Rgt ball data
CREATE BOSSPID,ab_atkball
movk 2,a0
move a0,@abossaballnum
abl200 movk 1,a0
callr rnd
jrnz abl230 ;No smoke?
CREATE0 aboss_smoketrail
abl230 movk 3,a0 ;>Turn
callr rnd
jrz abl500 ;Skip seek?
move *a13(abmode),a7
subk 1,a7
jrne abl250 ;Go top?
calla getcloseplyr ;>Chase plyr
jrz abl250 ;No player?
callr abossseeko_dir32
jruc abl300
abl250 movk 32,a0 ;Y
subk 2-1,a7
jrne abl260 ;!Ball time?
addk 22,a0 ;Lower
move @abossshld,a3
jrge abl260 ;!Docking?
movk 28,a0
abl260 callr abossseektop_dir32
abl300 sub a10,a0 ;A0=Difference
jrz abl500
move a0,a1
abs a0
cmpi 2,a0
jrle abl340 ;In seeker view?
move *a13(abmode),a7
subk 2,a7
jreq abl340 ;Ball time?
move *a13(absko),a2
movk >f,a0
callr rnd
jrnz abl320 ;No dir change?
neg a2
move a2,*a13(absko)
abl320 add a2,a10
jruc abl400
abl340 subk 16,a0
jrle abl350
neg a1
abl350 move a1,a1
jrnn abl360
subk 2,a10 ;-1
abl360 addk 1,a10 ;+1
abl400 ANDK >1f,a10 ;Make 0-31
abl500 move a10,a0 ;>Thrust
sll 4,a0 ;*16
addi missilev_t,a0
move *a0(8*16),a6 ;XV
move *a0,a7 ;YV
move *a13(abdrag),a2
move *a8(OXVEL),a0,L
move a0,a3
sra a2,a3
sub a3,a0 ;-Drag
add a6,a0 ;+Vel
move *a8(OYVEL),a1,L
move a1,a3
sra a2,a3
sub a3,a1 ;-Drag
add a7,a1 ;+Vel
move a8,a6
movi bossd_t,a8 ;A8=*Boss data struct
callr vel_set
move a6,a8
abl700
callr ab_keeponscrn
move @abossshld,a3
addk 1,a3
jrge abosslp ;Vehicle in air?
aboss_test
; .ref BEACONS ;DEBUG
; CREATE0 BEACONS ;Show cruise msl zones
calla CLNPAL
clr a0
clr a1
movi bossd_t,a8 ;A8=*Boss data struct
callr vel_set
SLEEP 60*2
calla SETC2 ;Start land mine color cycle
clr a0
move a0,@CRSRAM,L
move a0,@T72PNTR
movk 1,a0
move a0,@CTOTAL
movi 36,a0
move a0,@WAVE
movi BOSSPID|SUBABANI,a0 ;Kill akhboob ani
calla KIL1C
movi bossd_t,a9 ;>Delete all objs
jruc abl830
abl800 calla DELOBJ
clr a0
move a0,*a9+,L ;Clr out *
addk 32,a9
abl830 move *a9,a0,L
jrnz abl800
movi 200,a0
movi -236,a1
movi abossface_t,a9 ;*Init data
callr aboss_init
move @bossd_t,a8,L ;A8=*1st obj
CREATE BOSSPID|SUBFEYEANI,ab_faceeyeani
CREATE BOSSPID,ab_faceweapons
CREATE BOSSPID,ab_minelauncher
clr a9
CREATE BOSSPID,ab_wtube
movk 1,a9
CREATE BOSSPID,ab_wtube
movk 1,a0
move a0,@bodystat ;Face mode 1
movi 1500,a9
.if EASY
movi 10,a9 ;DEBUG
.endif
move a9,@abossshld
sll 4-2,a9 ;/4 (skip fractions)
move a9,@bossmeterv
; CREATE BOSSPID,ab_bossmeterup
abllp2 SLEEPK 1
move @WORLDTLY+16,a6
move *a8(OYPOS),a0
sub a6,a0
move @bodystat,a4
jrge abl1100
addk 8,a0
abl1100 addk 2,a0
jrge abl1200 ;Max Y?
clr a1 ;>Move down 1
movk 1,a2
sll 16,a2
move @bloflg,a0
jrz abl1150 ;!Blowing?
srl 1,a2 ;/2
abl1150 callr boss_addxy
abl1200 move a4,a4
jrnn abllp2
movk 1,a0
move a0,*a13(abmtrdie) ;Kill mtr
move @ESCAPED,a0
jrnz abl1300 ;Akhboob escaped?
cmpi ABWRLDTY+300,a6
jrlt abllp2
movi BOSSPID|SUBABMORT,a0 ;Kill akhboob mortar
calla KIL1C
movi ahkbang,a0
calla ONESNDOVR
SLEEP 60*4
clr a0 ;Caught akhboob
abl1300 PUSHP a0
movi BOSSPID,a0 ;Kill boss procs
movi >ff,a1
calla KILALLN
movk 1,a0
move a0,@HALT
move a0,@TAUNTOUT
move a0,@NO_START
move a0,@SHK_ON
movi TARGPID,a0
calla KIL1C
calla INIT_SCORE ;Make scoreboards into images
SLEEPK 2
clr a0
move a0,@SCORE_FLAG
CREATE 3100,SCRLUP
movi fade_t,a11
JSRP FADE_STRT
clr a0
move a0,@SHK_ON
move a0,@WFLG
callr procobjpal_delall
clr a0
move a0,@HALT
movi 40,a0
move a0,@WAVE
movk AUDRPDOME,a0
calla aud_addnumplyrs
movk 1,a8 ;Fry akhboob
movk 23,a10
PULLP a0
jrz abl1800 ;Caught akhboob?
; jruc abl1800 ;DEBUG
movi yousuck,a0
calla ONESND
movi whawhasnd,a0
calla ONESND
movk 2,a8 ;Escaped
movk 24,a10
abl1800 clr a9
CREATE0 ZONE_TXT2
SLEEP 60*6
CREATE0 fry_plyrs ;Fry dictator (A8)
abl2000 SLEEPK 10
move @TAUNTOUT,a0
subk 3,a0
jrne abl2000 ;Rackup not done?
SUBR TEXTTST ;Test
movi fade_t,a11
JSRP FADE_STRT
calla WIPEOUT
callr procobjpal_delall
movk 1,a0
move a0,@GAMERASE
SLEEPK 2
movk 1,a0
move a0,@NO_START
clr a9
movk 25,a10 ;Pleasure domes
CREATE0 ZONE_TXT2
SLEEP 60*5
movi ->1004,a0 ;Hide screen
move a0,@DPYSTRT
movi PDX+8,a0 ;>Turn on underground
move a0,@WORLDTLX+16
movi 4745,a0
move a0,@WORLDTLY+16
SLEEPK 2
callr procobjpal_delall
movi pdbkgnd_t,a0
move a0,@BAKMODS,L
calla BGND_UD1
callr fountains_strtani
move @STATUS,a6 ;>Start plyrs
move a2,@AFTR_WRP
btst 0,a6
jrz abl2400
movk 1,a8
CREATE PLY1PID,DRAW_PLYR_TORSO
abl2400 btst 1,a6
jrz abl2450
movk 2,a8
CREATE PLY2PID,DRAW_PLYR_TORSO
abl2450
clr a11 ;A11=Key flag
move @P1DATA+TKEYS,a2
move @P2DATA+TKEYS,a0
add a0,a2 ;A2=Total keys
move a2,@keytotal
movi 220,a1 ;Default # keys
move @SWITCH+>30,a7
btst 7,a7
jrnz abl2500
movi 200,a1 ;Easier # keys
abl2500 cmp a1,a2 ;# Keys required
jrlt abl2600 ;Too low?
movk 1,a11
movi pdwelcomesnd,a0
calla ONESND
abl2600 PUSHP a11
move @P1DATA+PSCORE,a0,L
cmpi >450000,a0
jrge abl2610 ;Most of game?
move @P2DATA+PSCORE,a0,L
cmpi >450000,a0
jrlt abl2640 ;!Most of game?
abl2610
movi AUDKEYTOT,a0 ;>Add in keys
move a2,a1
calla AUD
movi AUDFULLGAMES,a0
movk 1,a1
calla AUD
; calla aud_addnumplyrs
abl2640 movi pdtunesnd,a0
calla ONESND
move a11,a11 ;>Fade up with guys running in
jrz abl2650 ;Not enough keys?
calla INIT_SCORE
abl2650 movi fade_t,a0
movk 2,a1
calla FADEIN
clr a0
calla FB_FADEIN
SLEEPK 2
calla PLYRS_CNTR
movi -4,a0 ;Show screen
move a0,@DPYSTRT
SLEEP 40
move *a12,a11,L
jrz abl2670 ;Not enough keys?
calla DMA_SCORE
abl2670 SLEEP 40
calla SPECT ;Start scorepal cycle
movi keycoll_st,a0 ;>Show ammount
calla prt0_xy
PULLP a11
jrnz abl2700 ;Enough keys?
calla prt0_xy ;No entry
abl2700 SLEEP 60*2
movi 485*>10000/>18333,a8
move a11,a11
jrnz abl2800 ;Enough keys to get in?
movi 230*>10000/>18333,a8
abl2800 movi ->18333,a9
CREATE TARGPID,scroll_y
; SLEEP 37
abllp3 SLEEPK 1 ;>Wait till right before doors
move @WORLDTLY+16,a0
cmpi 5000-215,a0
jrgt abllp3
movk 1,a0
movb a0,@P1CTRL
movb a0,@P2CTRL
move a11,a11
jrz abl3300 ;Not enough keys?
move @keytotal,a0
cmpi 500,a0
jreq abl3000 ;Neil (AZAZ) password cheat?
movk AUDEPDOME,a0
calla aud_addnumplyrs
abl3000
move @BAKLST,a0,L ;>Delete entry doors
abl3100 move *a0(OZPOS),a1
cmpi 64,a1
jrne abl3150
move *a0(OSIZE),a1,L
cmpi [49,36],a1
jrne abl3150
move *a0,a3,L ;Get * next
calla DELBOBJ
move a3,a0
jruc abl3170
abl3150 move *a0,a0,L
abl3170 jrnz abl3100 ;Continue?
abl3300 SLEEPK 5
movi TARGPID,a0
movi -1,a1
calla EXISTP
jrnz abl3300 ;Scroll on?
calla ERASE_TXT
movi pdsnd_t,a8 ;Akhboob talking
CREATE0 snd_script
movi nopdometxt_s,a8 ;No fry akhboob
move @ESCAPED,a0
jrnz abl3500
movi nopdometxt2_s,a8 ;Fryed ahkboob!
abl3500 move a11,a11
jrz abl7000 ;Not enough keys?
move @WORLDTLX+16,a8 ;>Scroll through pleasuredome
addk 5,a8
clr a9
movi pathpd_t,a10
movi >10000,a0
move a0,@HZSPD,L
CREATE TARGPID,TARGET
CREATE COLPID,COLLISIONS
CREATE0 pdome_rndspch
abllp4 SLEEPK 1
move @WORLDTLY+16,a0
cmpi 4290,a0
jrgt abllp4
movi pdwelcomesnd,a0
calla ONESNDOVR
clr a0
move a0,@NOSHOOT
movi basepd_t,a0 ;>Give control to plyrs
move a0,@CURRENT,L
CREATE JOYPID,JOY_UPDATE
; CREATE BOSSPID,plyr_shoeson
movi endome_p,a8 ;*Pal
movi cycmem,a9 ;Ram
movi [55,64],a10 ;Begin/end color #
movk 4,a11 ;Rate
CREATE CYCPID,COLCYC
clr a0
move a0,@NO_START
movi 60*90/8,a11 ;A11=Time out
abl4000 SLEEPK 8
movk 3,a0 ;75%
callr rnd
jrnz abl4200
move @WORLDTLY+16,a0
cmpi 3680,a0
jrgt abl4200 ;South of pools?
cmpi 3370,a0
jrlt abl4200 ;North of pools?
movi bubl1snd,a0
calla ONESND
abl4200 movi TARGPID,a0
movi -1,a1
calla EXISTP
jrz abl4500 ;Scroll done?
dsj a11,abl4000
movi whawhasnd,a0 ;Didn't scroll all the way
calla ONESND
abl4500 SLEEP 60*8
;DO CANNED LIST OF SPEEC CALLS HERE?
movk 1,a0
move a0,@NO_START
movi pddoorsnd,a0
calla ONESND
move @OBJLST,a0,L ;>Big doors scroll up
abl5100 move *a0(OZPOS),a1
cmpi 159,a1
jrne abl5150
move *a0(OSIZE),a1,L
cmpi [108,64],a1
jrne abl5150
movi -3,a1
move a1,*a0(OYVEL+16)
abl5150 move *a0,a0,L
jrnz abl5100 ;More?
SLEEPK 30
calla INIT_SCORE ;>Scroll up scoreboards and fadeout
SLEEPK 2
clr a0
move a0,@SCORE_FLAG
CREATE 3100,SCRLUP
movi fade_t,a11
JSRP FADE_STRT
callr procobjpal_delall
movi 2057,a0 ;>Show thrones
move a0,@WORLDTLY+16
SLEEPK 2
clr a0
move a0,@GAMERASE
move a0,@IRQSKYE ;Black
movi ->1004,a0 ;Start display at bottom of screen
move a0,@DPYSTRT
movi thronebkgnd_t,a0
move a0,@BAKMODS,L
calla BGND_UD1
; move @pdcash,a0
; cmpi 200,a0
; jrge abl6500 ;All prizes?
jruc abl6500 ;DEBUG
movi girls,a0
calla FINDPAL
jrz abl6500 ;No PAL?
sext a0
move a0,a4
move @BAKLST,a0,L ;>Delete girls
abl6000 move *a0(OPAL),a1
cmp a4,a1
jrne abl6050
move *a0,a3,L ;Get * next
calla DELBOBJ
move a3,a0
jruc abl6100
abl6050 move *a0,a0,L
abl6100 jrnz abl6000 ;Continue?
abl6500 SLEEPK 3
clr a0
move a0,@DISPLAYON
SLEEPK 2
movi -4,a0 ;Show screen
move a0,@DPYSTRT
calla vidhwfx_flyin
movk 1,a0
move a0,@DISPLAYON
movi victorytxt_s,a8
SLEEP 60*2
abl7000
clr a0
movb a0,@P1CTRL
movb a0,@P2CTRL
move a0,@HALT
calla SPECT ;Start scorepal cycle
JSRP prt_scrolltxt
SLEEP 60*10
calla CLNPAL
movi fade2_t,a11
JSRP FADE_STRT
callr procobjpal_delall
jauc GAMEOVER
path1_t .word 1,314,0
abosspal_t
.long BBSHPAL,0
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
fade_t .long 3*32*32+4*32+5,0
fadein_t
.long SCOREPAL,0
pdbkgnd_t
; LWW BOTMBMOD,1000,5000
LWW DOMEBMOD,PDX,3018
.long -1
keycoll_st
XYTXT PRTF15,200,80,63,"KEYS COLLECTED"
XYNUM PRTDEC|PRTF15,200,106,63,keytotal
XYTXT PRTF15|PRTE,200,160,63,"ENTRY DENIED"
.word -1
pdsnd_t .word 60*17
LW painbpsnd,60*3
LW painbpsnd,60*2
LW laffsnd,60*10
LW peacesnd,60*2
LW amnotsnd,-1
pathpd_t
.word 1,1195,0
basepd_t
.word PDX,10,PDX+38,9000 ;Left Wall
.word PDX+360,10,PDX+400,9000 ;Rgt ^
.word PDX,10,PDX+400,3196 ;Top
.word PDX,3200,PDX+84,3249 ;LColumn
.word PDX,3400,PDX+95,3499 ;LSnake wall
.word PDX,3700,PDX+84,3752 ;LC
.word PDX,4150,PDX+84,4206 ;LC
.word 0
thronebkgnd_t
LWW THRONEBMOD,>944,>7D3
.long -1
fade2_t .long 0,0
********************************
* Delete all processes, objects and palettes
SUBRP procobjpal_delall
clr a0
movi PLYRPRCS,a1
move a0,*a1+,L ;These must be cleared!
move a0,*a1+,L
movi >efff,a1 ;Keep only the coin process
calla KILALLN
clr a0
clr a1
calla KILOBJ
calla KILBGND
jauc CLNPAL
********************************
* Scroll background Y
* A8=# Ticks for scroll
* A9=Y add
SUBRP scroll_y
sylp move @WORLDTLY,a0,L
add a9,a0
move a0,@WORLDTLY,L
calla BGND_UD1
SLEEPK 1
dsj a8,sylp
DIE
********************************
* Anim script for aboss
boss_as
ASNEW bossrisenew_t ;>Ship in pit and sliding door
ASASM
abas50 SLEEPK 5
movi TARGPID,a0
movi -1,a1
calla EXISTP
jrnz abas50 ;Scroll on?
ASENDASM
ASSLP 60
ASRUN doorsnd_as
ASLAB 27 ;>Slide door up
ASXY >10,>f,0,-1
ASDSJS1
ASHIDE >10
ASLAB 33
ASXY >10,>f,0,-1
ASDSJS1
ASHIDE >11
ASLAB 33
ASXY >10,>f,0,-1
ASDSJS1
ASHIDE >12
ASLAB 27
ASXY >10,>f,0,-1
ASDSJS1
ASSLP 180
ASSND rcktlnchsnd
ASXY >20,3,-400,0 ;>Ship rises
ASXYV >20,3,0,->18000
ASSLP 6
ASANI LILBBSHP2,>20
ASANI LILBBSHP2A,>21
ASSLP 6
ASANI LILBBSHP3,>20
ASANI LILBBSHP3A,>21
ASSLP 6
ASDELM >20,1
ASLAB 27 ;>Slide door down
ASXY >10,>f,0,1
ASDSJS1
ASSHOW >12
ASLAB 33
ASXY >10,>f,0,1
ASDSJS1
ASSHOW >11
ASLAB 33
ASXY >10,>f,0,1
ASDSJS1
ASSHOW >10
ASLAB 27
ASXY >10,>f,0,1
ASDSJS1
ASASM
movi base2,a0
move a0,@CURRENT,L
ASENDASM
ASSLP 60*40
ASDELM 0,>ff
ASASM
abas100 SLEEPK 10
move @WORLDTLY+16,a0
cmpi ABWRLDTY+90,a0
jrgt abas100
move @OBJLST,a2,L ;>Set wall Z down
abas200 move *a2(OZPOS),a0
cmpi 281,a0
jrne abas240
movi 140,a0
move a0,*a2(OZPOS)
abas240 move *a2,a2,L
jrnz abas200 ;More?
ASENDASM
ASNEW abwallnew_t
ASASM
abas400 SLEEPK 15
move @WORLDTLY+16,a0
cmpi ABWRLDTY+20,a0
jrgt abas400
move @abossshld,a0
jrnn abas400 ;Ship OK?
ASENDASM
ASLAB 70 ;>Slide doors open
ASXY >44,0,-1,0
ASXY >45,0,1,0
ASDSJS1
ASSLP 60*2
ASASM
abas500 SLEEPK 15
move @WORLDTLY+16,a0
cmpi ABWRLDTY+3,a0
jrgt abas500
movi 120,a1
move @bossd_t,a0,L ;>Set Z low
move a1,*a0(OZPOS)
move @bossd_t+AKPART,a0,L
move a1,*a0(OZPOS)
movi -2,a0
move a0,@abossshld
ASENDASM
ASLAB 69 ;>Slide doors closed
ASXY >44,0,1,0
ASXY >45,0,-1,0
ASDSJS1
ASSLP 60*2
ASLAB 69 ;>Slide doors open
ASXY >44,0,-1,0
ASXY >45,0,1,0
ASDSJS1
ASDELM >44,1
ASEND
SHPY .set 48-310
BDX .set 196-70
BDY .set 59-310
bossrisenew_t
ASITEMN 600,SHPY+93,LILBBSHP1,15,DMAWNZ,>20
ASITEMN 600-1,SHPY+93,LILBBSHP1,15,DMAWNZ+M_FLIPH,>20
ASITEMN 600,SHPY+93,LILBBSHP1A,15,DMAWNZ,>21
ASITEMN 600-1,SHPY+93,LILBBSHP1A,15,DMAWNZ+M_FLIPH,>21
ASITEMN BDX-25,BDY-35,PCCOVER,25,DMAWNZ,8
ASITEMN BDX+166,BDY-35,PCCOVER,25,DMAWNZ+M_FLIPH,8
ASITEMN BDX,BDY,STEELPC1,20,DMAWNZ,>10
ASITEMN BDX+141,BDY,STEELPC1,20,DMAWNZ+M_FLIPH,>10
ASITEMN BDX,BDY+27,STEELPC2,20,DMAWNZ,>11
ASITEMN BDX+141,BDY+27,STEELPC2,20,DMAWNZ+M_FLIPH,>11
ASITEMN BDX,BDY+60,STEELPC2,20,DMAWNZ,>12
ASITEMN BDX+141,BDY+60,STEELPC2,20,DMAWNZ+M_FLIPH,>12
ASITEMN BDX,BDY+118,STEELPC1,20,DMAWNZ+M_FLIPV,>13
ASITEMN BDX+141,BDY+118,STEELPC1,20,DMAWNZ+M_FLIPH+M_FLIPV,>13
.word -1000
BWX .set 130 ;Door XY
BWY .set -90
;BHDX .set 199
;BHDY .set -236
abwallnew_t
; ASITEMN BWX,BWY,DORWAY1,50,DMAWNZ,>40
; ASITEMN BWX+137,BWY,DORWAY1,50,DMAWNZ+M_FLIPH,>40
ASITEMN BWX,BWY,BIGDOR,130,DMAWNZ,>44
ASITEMN BWX+137,BWY,BIGDOR,130,DMAWNZ+M_FLIPH,>45
.word -1000
doorsnd_as
ASLAB 120/5 ;Open
ASSND doorsldsnd
ASSLP 5
ASDSJ
ASSLP 60
ASSND ahkbang ;Yell!
ASSLP 126
ASLAB 120/5 ;Close
ASSND doorsldsnd
ASSLP 5
ASDSJ
ASEND
********************************
* Initialize boss
* A0=X, A1=Y, A9=*Init table
* Trashes A0-A10
SUBRP aboss_init
move @WORLDTLX+16,a2 ;>Add in WORLDXY
add a2,a0
sll 16,a0
move @WORLDTLY+16,a2
add a2,a1
sll 16,a1
movi bossd_t,a10
abinlp move *a9+,a4 ;Get OFLAGS
jrz abinx ;End?
move *a9+,a5 ;OID
zext a5
move *a9+,a3 ;Z
move *a9+,a2,L ;*Img
clr a6 ;XV
clr a7 ;YV
PUSH a0
CALLA BEGINOBJ2
PULL a0
move a10,*a8(OPLINK),L ;Link object to block structure
move a8,*a10+,L ;Save pointer to obj
clr a2
move a2,*a10+,L ;Clr offset & damage
jruc abinlp
abinx clr a0
move a0,*a10,L ;Zero last pointer to mark end
CREATE BOSSPID,aboss_glue ;Keep boss together
rets
ABZ equ 160
CETA equ CLSENMY|TYPABOSS
abossshp_t
.word DMAWNZ,CETA|SUBABBACK,ABZ ;Back
.long BBSHP1
akpart .word DMAWNZ|M_NOCOLL,CLSDEAD|1,ABZ+5 ;Akhboob
.long AKB1ARMUP1
shpart .word DMAWNZ|M_NOCOLL,CLSDEAD,120 ;L shadow (2 in row)
.long BIGSHAD
.word DMAWNZ|M_FLIPH|M_NOCOLL,CLSDEAD,120 ;R shadow
.long BIGSHAD
.word DMAWNZ,CETA,ABZ ;Center
.long BBSHP2
.word DMAWNZ,CETA,ABZ ;Front
.long BBSHP3
.word DMAWNZ,CETA,ABZ ;Close left
.long BBSHP4
.word DMAWNZ,CETA,ABZ ;Far left
.long BBSHP5
.word DMAWNZ|M_FLIPH,CETA,ABZ ;Close rgt
.long BBSHP4
.word DMAWNZ|M_FLIPH,CETA,ABZ ;Far rgt
.long BBSHP5
blpart .word DMAWNZ|M_PIXSCAN,CETA,ABZ-1 ;Left ball (3 in row)
.long BBALL1
.word DMAWNZ,CETA,ABZ-1 ;Left arm
.long BBARM
.word DMAWNZ,CETA,ABZ-1 ;Left arm2
.long BBARM2
brpart .word DMAWNZ|M_PIXSCAN|M_FLIPH,CETA,ABZ-1 ;Rgt ball
.long BBALL1
.word DMAWNZ|M_FLIPH,CETA,ABZ-1 ;Rgt arm
.long BBARM
.word DMAWNZ|M_FLIPH,CETA,ABZ-1 ;Rgt arm2
.long BBARM2
.word 0
;SHPART equ (shpart-abossshp_t)/80*64
AKPART equ (akpart-abossshp_t)/80*64
BLPART equ (blpart-abossshp_t)/80*64
BRPART equ (brpart-abossshp_t)/80*64
ABFZ equ 158
abossface_t
.word DMAWNZ,CETA,ABFZ ;L head
.long TOPHED
.word DMAWNZ|M_FLIPH,CETA,ABFZ ;R ^
.long TOPHED
.word DMAWNZ,CETA,ABFZ ;L hd tubes
.long HEDTUBES
.word DMAWNZ|M_FLIPH,CETA,ABFZ ;R ^
.long HEDTUBES
eyepart .word DMAWNZ,CETA,ABFZ ;L eye
.long DCI1
.word DMAWNZ|M_FLIPH,CETA,ABFZ ;R ^
.long DCI1
mthpart .word DMAWNZ,CETA,ABFZ ;L mouth
.long DCIMTH1
.word DMAWNZ|M_FLIPH,CETA,ABFZ ;R ^
.long DCIMTH1
.word DMAWNZ|M_PIXSCAN,CETA,ABFZ ;L
.long CHEEK
.word DMAWNZ|M_FLIPH|M_PIXSCAN,CETA,ABFZ ;R
.long CHEEK
.word DMAWNZ,CETA,ABFZ ;L
.long CHIN
.word DMAWNZ|M_FLIPH,CETA,ABFZ ;R
.long CHIN
.word DMAWNZ,CETA,ABFZ ;L
.long EAR
.word DMAWNZ|M_FLIPH,CETA,ABFZ ;R
.long EAR
.word 0
EYEPART equ (eyepart-abossface_t)/80*64
MTHPART equ (mthpart-abossface_t)/80*64
********************************
* Boss meter (Process)
* A11=*aboss process
SUBRP ab_bossmeter
movi bossmeterv,a10
clr a0
move a0,*a10
movi [35,0],a0
clr a1
movi bmeter,a2
movk 30,a3 ;Z
movi DMAWNZ+M_NOCOLL,a4
movi CLSDEAD,a5 ;ID
clr a6
clr a7
calla BEGINOBJ ;bmeter name
move a8,a9
movi [35+74,0],a0
movi DMACAL+M_NOCOLL,a4
calla BEGINOBJ ;bmeter bar
clr a0
move a0,*a8(OPAL)
movk 1,a0
move a0,*a8(OSIZEX)
abbmlp move *a10,a0
sra 4,a0 ;/16
cmpi 250,a0
jrle abbm80 ;In range?
movi 250,a0 ;Set max
abbm80
movi >c0c,a3 ;Green
cmpi 155,a0
jrge abbm120
movi >3b3b,a3 ;Yellow
cmpi 70,a0
jrge abbm120
movi >f0f,a3 ;Red
abbm120
movk 32,a2 ;Off bottom
move a0,a0
jrle abbm400 ;No bar?
clr a2
move a3,*a8(OCONST)
move *a8(OSIZEX),a1 ;Bar X
cmp a0,a1
jreq abbm400 ;Correct size?
jrgt abbm200 ;Shrink?
addk 1,a1
move a1,a0
abbm200 move a0,a1
move a1,*a8(OSIZEX) ;Bar X
abbm400 move @WORLDTLY+16,a1
addi 242,a1
move a1,*a9(OYPOS)
add a2,a1
move a1,*a8(OYPOS) ;Keep on screen
SLEEPK 1
move *a11(abmtrdie),a0
jrz abbmlp ;Continue?
move a9,a0
calla DELOBJ
jauc DELOBJDIE
********************************
* Keep plyrs shoes on (Process)
SUBRP plyr_shoeson
movi PLYRPRCS,a8
movi >8140,a9
psolp move *a8,a0,L
jrz pso50
move *a0(LEG_PRC),a0,L
move a9,*a0(SHOECNT)
pso50 move *a8(32),a0,L
jrz pso100
move *a0(LEG_PRC),a0,L
move a9,*a0(SHOECNT)
pso100 SLOOP 90,psolp
********************************
* Starts various scrollers
* A11=*Aboss process
SUBRP ab_scrollstrt
SLEEP 120
move @WORLDTLX+16,a8 ;>Start 1st scroll
addk 5,a8 ;A8=X target line to trigger scroll
clr a9 ;A9=0 (not checking for y target)
movi pathb2,a10 ;Scroll table
movi >8000,a0
move a0,@HZSPD,L
CREATE TARGPID,TARGET
; clr a9 ;A9=0 for up, 1 for rgt
; CREATE ARWPID,ONARRW ;Turn on lft arrow
; CREATE FUTUREPID,AOF ;Arrow off after a time
; movi baseb2,a0
clr a0
move a0,@BCURRENT,L
asslp1 SLEEPK 30
move *a11(abmode),a0
jrn asslp1 ;Guns OK?
movi TARGPID,a0
movi -1,a1
calla EXISTP
jrnz asslp1 ;Scroll on?
move @WORLDTLX+16,a8 ;>Start 2nd scroll
addk 5,a8 ;A8=X target line to trigger scroll
clr a9 ;A9=0 (not checking for y target)
movi pathb3,a10
movi >2000,a0
.if EASY
movi >4000*16,a0 ;DEBUG
.endif
move a0,@HZSPD,L
CREATE TARGPID,TARGET
movi base3,a0
move a0,@CURRENT,L
movi baseb3,a0
move a0,@BCURRENT,L
SLEEPK 30
clr a0
asslp2 sll 2,a0 ;*4
move a0,a1
sll 1,a0 ;=*8
add a1,a0 ;=*12
move a0,@bossmeterv
ass200 SLEEPK 15
move @WORLDTLY+16,a0
subi ABWRLDTY+380,a0
jrgt asslp2 ;!Halfway there?
movk 1,a0
move a0,*a11(abmode) ;Start chase plyr
asslp3 SLEEPK 30
move *a11(abmode),a0
subk 1,a0
jreq asslp3 ;Still chasing?
movi TARGPID,a0
movi -1,a1
calla EXISTP
jrnz asslp3 ;Scroll on?
asslp4 SLEEPK 30
move @abossaballnum,a0
jrgt asslp4 ;Atkballs OK?
move @WORLDTLX+16,a8 ;>Start 3rd scroll
addk 5,a8 ;A8=X target line to trigger scroll
clr a9 ;A9=0 (not checking for y target)
movi pathb4,a10
movi >4000,a0
move a0,@HZSPD,L
CREATE TARGPID,TARGET
movi ICN5A,a0
move a0,@ICLIST,L
DIE
pathb2 .word 1,212*2,0
.if EASY
pathb3 .word 1,532*4/16,0 ;DEBUG
.else
pathb3 .word 1,532*8,0
.endif
pathb4 .word 1,100*4,0
BXO .set >578
BYO .set >95
base1 .word >bab-BXO,>47b-BYO,>c3c-BXO,>4ed-BYO ;Pit
base2 .word >b20-BXO,>420-BYO,>b50-BXO,>52a ;Lower side wall
.word >c9b-BXO,>420-BYO,>cd0-BXO,>1000
.word >b20-BXO,20,>b46-BXO,>430-BYO ;Top side wall
.word >ca6-BXO,20,>cd0-BXO,>430-BYO
.word 0
base3 .word >b2b-BXO,10,>b44-BXO,>3000
.word >ca8-BXO,10,>cc7-BXO,>3000
.word >b2b-BXO,10,>b86-BXO,>17c-BYO ;Tube up left
.word >c64-BXO,10,>cd6-BXO,>17c-BYO ;Tube up rght
.word >b2b-BXO,10,>d16-BXO,>140-BYO ;Back wall
.word 0
baseb2 .WORD 0B2BH-BXO,10,0B5BH-12-BXO,3000H ;SIDE WALL
.WORD 0C8BH+12-BXO,10,0CC7H-BXO,3000H ;SIDE WALL
.WORD 0
baseb3 .WORD 0B2BH-BXO,10,0B40H-12-BXO,03000H
.WORD 0CA8H+12-BXO,10,0CC7H-BXO,03000H
.WORD 0B2BH-BXO,10,0B86H-12-BXO,17CH-12-BYO ;TUBE UP LEFT
.WORD 0C64H+12-BXO,10,0CD6H-BXO,017CH-12-BYO ;TUBE UP RGHT
.WORD 0B2BH-BXO,10,0D16H-BXO,0140H-12-BYO ;BACK WALL
.WORD 0
********************************
* Keep boss objects together
SUBRP aboss_glue
movi bossd_t,a8 ;A8=*Data block
move *a8+,a10,L ;First piece index
jaz SUCIDE
move a8,a9
move *a10(OIMG),a1,L
move *a10(OSIZE),a2,L
move *a10(OFLAGS),a4
calla GANIOF ;Get XY ani offset
PUSH a12,a13
move a6,a12 ;Save X anioff
move a7,a13 ;Save Y anioff
jruc abg40
abglp move *a8(OIMG),a1,L
move *a8(OSIZE),a2,L
move *a8(OFLAGS),a4
calla GANIOF ;Get XY ani offset
sub a12,a6
sub a13,a7
move *a8(OID),a0 ;Get oid
move *a9,a1 ;ABDXO
btst B_FLIPH,a4
jrz abg5 ;No flip fix?
addi >10000,a6
neg a1
abg5 cmpi CLSDEAD,a0 ;>Adjust shadow for height
jrne abg10
btst B_FLIPH,a4
jrz abg8 ;No flip fix?
addi >10000,a6 ;One more
abg8
; move @bossz,a0,L
; sub a0,a7
subk 10,a7
abg10 move *a10(OXVAL),a0,L
sub a6,a0
sll 16,a1
sub a1,a0
move a0,*a8(OXVAL),L
move *a10(OYVAL),a1,L
sub a7,a1
move a1,*a8(OYVAL),L
abg40 addk 32,a9
move *a9+,a8,L ;Get next index
jrnz abglp ;More?
PULL a12,a13
SLOOP 1,aboss_glue
********************************
* Check if boss on screen
* A8=*Boss 1st obj
*Rets: Z if on screen, Trashes A0-A3
SUBRP ab_keeponscrn
PUSH a4,a5
clr a2
move *a8(OXPOS),a4
addi ABXO,a4 ;Center X
move *a8(OYPOS),a5
addi ABYO,a5 ;Center Y
move *a8(OXVEL),a0,L
move *a8(OYVEL),a1,L
move @WORLDTLX+16,a3
sub a3,a4 ;X
move @WORLDTLY+16,a3
sub a3,a5 ;Y
cmpi 50,a4 ;XMin
jrge akos50
movk 1,a2
abs a0 ;+
akos50 cmpi 350,a4 ;XMax
jrle akos80
movk 1,a2
abs a0
neg a0 ;-
akos80 cmpi -25,a5 ;YMin
jrge akos120
movk 1,a2
abs a1 ;+
akos120 cmpi 250,a5 ;YMax
jrle akos300
movk 1,a2
abs a1
neg a1 ;-
akos300 move a2,a2
jrz akosx
move a8,a2
movi bossd_t,a8 ;A8=*Boss data struct
callr vel_set
move a2,a8
akosx PULL a4,a5
rets
********************************
* Aboss akhboob pilot animations (Process)
* A11=*Aboss process
SUBRP ab_akhboobani
move @bossd_t+AKPART,a8,L ;*Akhboob obj
aabalp
movk 15,a0
callr rndrng0
sll 5,a0 ;*32
addi aaba_t,a0
move *a0,a9,L
move *a9+,a2 ;Get delay
jrn aaba50 ;No speech?
CREATE BOSSPID,ab_akhb_rndspch
move a2,*a0(PTIME)
aaba50 JSRP FRANIMQ
movi >7f,a0
callr rnd
addk 10,a0
calla PRCSLP
jruc aabalp
aaba_t .long akbrchl_l,akbrchl_l,akbrchr_l,akbrchr_l
.long akbrchl_l,akbrchl_l,akbrchr_l,akbrchr_l
.long akbhdtrn_l,akbhdtrn_l,akbhdtrn_l,akbhdtrn_l
.long akb1aup_l,akb2aup_l,akbyak_l,akblean_l
akbrchl_l
.word -1
LWW AKBREACH,FLIPBITS|15,0
LWL0 AKB1ARMUP1,1
akbrchr_l
.word -1
LWW AKBREACH,FLIPBITS|15,M_FLIPH
LWL0 AKB1ARMUP1,1
akbhdtrn_l
.word -1
LW AKBHEDTURN,40
LWL0 AKB1ARMUP1,1
akb1aup_l
.word 4*3
LW AKB1ARMUP1,4
LW AKB1ARMUP2,4
LW AKB1ARMUP3,4
LW AKB1ARMUP4,4
LW AKB1ARMUP5,4
LW AKB1ARMUP6,5
LW AKB1ARMUP5,4
LW AKB1ARMUP6,5
LW AKB1ARMUP5,4
LW AKB1ARMUP6,4
LW AKB1ARMUP5,4
LW AKB1ARMUP4,4
LW AKB1ARMUP3,4
LW AKB1ARMUP2,4
LWL0 AKB1ARMUP1,1
akb2aup_l
.word 4*3
LW AKB2ARMUP1,4
LW AKB2ARMUP2,4
LW AKB2ARMUP3,4
LW AKB2ARMUP4,4
LW AKB2ARMUP5,5
LW AKB2ARMUP4,5
LW AKB2ARMUP5,5
LW AKB2ARMUP4,5
LW AKB2ARMUP5,4
LW AKB2ARMUP4,4
LW AKB2ARMUP3,4
LW AKB2ARMUP2,4
LWL0 AKB2ARMUP1,1
akbyak_l
.word 0
LW AKBYAK,5
LW AKB1ARMUP1,5
LW AKBYAK,4
LW AKB1ARMUP1,5
LW AKBYAK,5
LW AKB1ARMUP1,4
LW AKBYAK,4
LW AKB1ARMUP1,4
LW AKBYAK,4
LWL0 AKB1ARMUP1,1
akblean_l
.word 0
LW AKBLEAN1,5
LW AKBLEAN2,5
LW AKBLEAN3,5
LW AKBLEAN4,5
LW AKBLEAN3,5
LW AKBLEAN4,5
LW AKBLEAN3,5
LW AKBLEAN4,5
LW AKBLEAN3,5
LW AKBLEAN2,5
LW AKBLEAN1,5
LWL0 AKB1ARMUP1,1
********************************
* Random akhboob speech (Process)
SUBRP ab_akhb_rndspch
movk 5,a0
callr rndrng0
sll 5,a0 ;*32
addi abakhspeech_t,a0
move *a0,a0,L
calla ONESND
DIE
abakhspeech_t
.long ahkb1,ahkb2,ahkb3,ahkbsta,ahkbang,peacesnd
********************************
* ABOSS turret spawner (Process)
* A8=*1st boss obj
* A11=*ABOSS process
APTRPD KPTSOBJ ,0 ;For turret (in ARAB)
SUBRP ab_gunturrets
movi 250*16,a0
move a0,@bossmeterv
movk 3,a9 ;Gun type
move a13,a10
CREATE T72PID,TTORSO
CREATE T72PID,TTORSO
CREATE T72PID,TTORSO
abgtlp SLEEPK 30
movi T72PID,a0
movi -1,a1
calla EXISTP
jrnz abgtlp ;Still alive?
clr a0
move a0,@bossmeterv
SLEEP 60
movi [30,0],a9
movk 27,a10 ;Survive this barrage of missiles!
CREATE0 ZONE_TXT2
SLEEP 4*60
clr a0
move a0,*a11(abmode) ;Start missile attack
DIE
********************************
* Aboss missile launcher (Process)
* A11=*Aboss process
APTRPD amlabproc ,0 ;*AB proc
SUBRP ab_msllauncher
move a11,*a13(amlabproc),L
amllp SLEEPK 8
move *a13(amlabproc),a2,L
move *a2(abmode),a0
jrnz amlslp ;No missile mania?
move @bossd_t,a8,L ;*1st obj
movi abmslo_t,a9
movk 1,a0
callr rnd
jrnz aml500 ;Msl?
callr getplyr ;>Rocket
jrz amlslp ;No player?
callr abossseeko_dir32
move a0,a10
subk 6,a10
movk 7,a11
aml350 CREATE BOSSPID,rocket_fireab
movi rcktlnchsnd,a0
calla ONESND
SLEEPK 1
addk 2,a10 ;Turn
dsj a11,aml350
jruc amlslp
aml500 movk 3,a11 ;>Missile
aml550 movk 4,a0
callr rndrng0
addk 14,a0
move a0,a10 ;14-18
CREATE BOSSPID,missile_fireab
movi msllnchsnd,a0
calla ONESND
SLEEPK 7
addk 32,a9 ;Next slot
dsj a11,aml550
amlslp
movi 55,a0
move @STATUS,a1
subk 3,a1
jreq aml700 ;2 plyrs?
addk 20,a0 ;Easier
aml700 callr rndrng0
addk 10,a0
calla PRCSLP
jruc amllp
abmslo_t
.word ABXO,ABYO+15,ABXO-50,ABYO+15,ABXO+50,ABYO+15
********************************
* Aboss attack ball (Process)
* A9=*Ball data struct
; APTRPD aababproc ,0 ;*AB proc
WORDPD aabxvel ,2 ;XVel of ball
SUBRP ab_atkball
movi 105,a0
.if EASY
movi 1,a0 ;DEBUG
.endif
move a0,*a9(ABDSHLD) ;Set shield
movi 40,a11
aab100 move a9,a8 ;>Extend ball and arms
movk 3,a3
aab120 addk 32,a8
move *a8,a1 ;ABDXO
addk 1,a1
move a1,*a8
addk 32,a8
dsj a3,aab120
SLEEPK 1
dsj a11,aab100
CREATE BOSSPID,ab_ballopen
SLEEP 60
move a13,a11
CREATE BOSSPID,ab_ballshoot
movk 1,a0
move a0,*a13(aabxvel)
aablp SLEEPK 1
move *a13(aabxvel),a2
move *a9(ABDXO),a3
add a2,a3
cmpi 20,a3
jrge aab200 ;OK?
movk 20,a3
jruc aab400
aab200 cmpi 67,a3
jrle aab300 ;OK?
movi 67,a3
jruc aab400
aab300 movk >1f,a0
callr rnd
jrnz aab420 ;!Dir change?
aab400 neg a2 ;Neg XVel
aab420 move a2,*a13(aabxvel)
move a3,*a9(ABDXO)
move a3,*a9(ABDXO+64) ;Arm1
move a3,*a9(ABDXO+64*2) ;Arm2
;aab600 movk 3,a0
; callr rnd
; addk 3,a0 ;3-6
; move a0,a6
; move a9,a5
; move *a9,a8,L
; movi sparkball_l,a9
; movi 70,a0
; calla RNDRNGS
; move a0,a10
; movk 30,a11
;aab630 CREATE BOSSPID,mortar_relaboss
; addk 25,a11
; dsj a6,aab630
; move a5,a9
aab800 move *a9(ABDSHLD),a0
jrgt aablp ;Ball OK?
SLEEP 60*6
aab900 move a9,a8 ;>Retract ball and arms
movk 3,a3
aab920 addk 32,a8
move *a8,a1 ;ABDXO
subk 1,a1
move a1,*a8
addk 32,a8
dsj a3,aab920
SLEEPK 1
move *a9(ABDXO),a1
subk 12,a1
jrgt aab900 ;Still out?
move @abossaballnum,a0
subk 1,a0
move a0,@abossaballnum
jrgt aabx
movi 110,a0
.if EASY
movk 1,a0 ;DEBUG
.endif
move a0,@abossshld ;Let ship die
aabx DIE
;sparkball_l
; .long 0 ;*FRANIM
; LW TEST1,2 ;82 Ticks
; LW TEST2,3
; LW TEST3,4
; LW TEST4,6
; LW TEST5,9
; LW TEST6,11
; LW TEST7,12
; LW TEST6,11
; LW TEST5,9
; LW TEST4,6
; LW TEST3,4
; LW TEST2,3
; LWL0 TEST1,2
; .word DMAWNZ
; .long BOOM3 ;*FRANIM
********************************
* Open the ball and animate (Process)
* A9=*Ball data struct
SUBRP ab_ballopen
SLEEPK 20
move *a9,a8,L
CREATE BOSSPID,ab_ballopenex
movi ballopen_l,a9
JSRP FRANIMQ
DIE
ballopen_l
LW BBALL2,7
LW BBALL3,7
LWL BLLFACE1,NEWPALET|5,GRNFCP
LW BLLFACE3,5
LWL0 BLLFACE4,1
********************************
* Do extra face img for open ball (Process)
* A8=*Ball obj
SUBRP ab_ballopenex
move a8,a10
clr a0
clr a1
movi BLLOPEN1,a2
movi ABZ,a3 ;Z
move *a10(OFLAGS),a4
addi M_NOCOLL,a4
movi CLSDEAD,a5
clr a6
clr a7
calla BEGINOBJ2
movi ballopenex_l,a9
CREATE BOSSPID,FRQDELDIE
movk 13,a11 ;>Keep face on ball
aboelp move a8,a0
move a10,a8
calla GETANIXY
move *a0(OFLAGS),a4
calla GANISAG
move a0,a8
SLEEPK 1
dsj a11,aboelp
DIE
ballopenex_l
LW BLLOPEN1,7
LWL0 BLLOPEN2,7
********************************
* Fire shot from ball (Process)
* A9=*Ball data struct
* A11=*Ball main process
SUBRP ab_ballshoot
move *a9,a8,L
abslp CREATE BOSSPID,ab_ballpuff
callr bloop_snd
; movi puffsnd,a0
; calla ONESND
SLEEPK 4
movk 3,a10
abs50 SLEEPK 3
CREATE BOSSPID,ab_ballshot
dsj a10,abs50
movi 40,a0
callr rndrng0
move @STATUS,a1
subk 3,a1
jreq abs300 ;2 plyrs?
addi 60,a0 ;Easier
abs300 addi 80,a0
calla PRCSLP
move *a9(ABDSHLD),a0
jrgt abslp
DIE
********************************
* Do face puffing (Process)
* A8=*Ball obj
SUBRP ab_ballpuff
movi ballblow_l,a9
JSRP FRANIMQ
DIE
ballblow_l
LW BLLBLOW1,2
LW BLLBLOW2,2
LW BLLBLOW3,2
LW BLLBLOW4,2
LW BLLBLOW3,2
LW BLLBLOW2,2
LW BLLBLOW1,2
LWL0 BLLFACE4,1
********************************
* Fire shot from wall tube (Process)
* A9=Wall # (0=L,1=R)
WORDPD shotshield,0 ;Shield strength
WORDPD shotdrag,2 ;Drag shift
SUBRP ab_wtubeshot
move @WORLDTLX+16,a0
addi 43,a0
move a9,a9
jrz awts40 ;Left?
addi 400-43*2,a0
awts40 move @WORLDTLY+16,a1
addi 80,a1
movk 16,a10
movi 120,a11 ;Fuel
movi 119,a3 ;Z
clr a6
movk 2,a7
sll 16,a7
jruc smrtshot_fire
********************************
* Fire shot from atkball (Process)
* A8=*Ball obj
* A9=*Ball data struct
* A11=*Ball main process
SUBRP ab_ballshot
move *a11(aabxvel),a11
move *a8(OXPOS),a0
addk 26,a0
move *a8(OYPOS),a1
addi 42,a1
move *a8(OXVEL),a6,L
move *a8(OYVEL),a7,L
jrgt abf30 ;Pos YVel?
clr a7
abf30 addi >10000,a7
sll 17,a11 ;*2
move *a9(OFLAGS),a10
btst B_FLIPH,a10
jrz abf50 ;No flip?
neg a11
abf50 sub a11,a6
movk 16,a10
movi 200,a11 ;Fuel
movi 159,a3 ;Z
SUBRP smrtshot_fire ;A0/A1=XY, A3=Z, A6/A7=XYV, A10=Dir 0-31
movk 1,a2 ;Shield
move a2,*a13(shotshield)
movi -5,a2 ;Slow speed
move a2,*a13(shotdrag)
sll 16,a0
sll 16,a1
movi BALL6,a2 ;*Image
movi DMAWNZ,a4
movi CLSENMY+TYPSL+SUBMSL,a5
calla BEGINOBJ2
movk 25,a9 ;Seek delay
jruc ssf400
ssf200 SLEEPK 1
subk 1,a9
jrlt ssf220
jrgt ssf500 ;Don't seek?
movi 159,a0
move a0,*a8(OZPOS)
ssf220
calla getcloseplyr
jrz ssf700 ;No player?
calla seekob_dir32la
ssf300 sub a10,a0 ;A0=Difference
jrz ssf500
move a0,a1
abs a0
subk 16,a0
jrle ssf350
neg a1
ssf350 move a1,a1
jrnn ssf360
subk 2,a10 ;-1
ssf360 addk 1,a10 ;+1
ssf400 ANDK >1f,a10 ;Make 0-31
ssf500 move a10,a0
sll 4,a0 ;*16
addi sballv_t,a0
move *a0(8*16),a6 ;XV
move *a0,a7 ;YV
move *a13(shotdrag),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
ssf700
movk >f,a1
and a11,a1
jrnz ssf800 ;Skip screen check?
calla SCRTST
janz DELOBJDIE
ssf800
; move @bloflg,a0
; jrn ssfx ;Big blow?
subk 1,a11
jrgt ssf200 ;Got fuel?
ssfx 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
sballv_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
********************************
* Part of boss monster takes a hit
* A0=*Obj that hit
* A8=*Boss obj
SUBR aboss_hit
mmtm sp,a1,a2,a3,a4,a5,a6,a7,a9,a10,a11
movk 1,a1
move a1,@OUT_FLG ;Stop scan
move a0,a11 ;A11=*Obj that hit
move *a11(OID),a10 ;Get subtype
sll 32-3,a10
move @bodystat,a6
jrz abh300 ;Ship on?
jrn abhx
srl 32-3-4,a10 ;*16
addi buldat2_t,a10 ;A10=*Data_t
move *a11(OYVEL),a2,L
jrgt abh100 ;Bad vel?
subi >2000,a2
move *a10,a9 ;>Push face up
clr a1
sra a9,a2
callr boss_addxy
abh100
movk 1,a0 ;50%
callr rnd
jrnz abhx ;No damage?
move @HCOUNT,a0
sll 32-3,a0
jrnz abh110
callr snd_rndakhboob ;Do a speech call
abh110 movi >2d2d0000,a9
subk 3,a6
jrne abh120 ;!Skull?
movi >35350000,a9
abh120 CREATE0 FLASHME
move *a8(OPLINK),a9,L ;A9=*Obj data struct
move *a10(>80),a2 ;A2=Weapon damage
jrnn abh150 ;!Bomb?
movk 1,a0
callr rnd
move a0,a2 ;Bomb damage 0 or 1
abh150
move @abossshld,a3
jrle abh170 ;Not counting?
sub a2,a3
jrgt abh170 ;OK?
CREATE BOSSPID,ab_facexpld
movi >5000,a1
callr boss_scorebonusword
clr a3
abh170 move a3,@abossshld
sll 4-2,a3 ;/4 (skip fractions)
move a3,@bossmeterv
jruc abh700
;>Ship collisions
abh300 srl 32-3-4,a10 ;*16
; jrz abh350 ;Bomb?
; move @bloflg,a0
; jrn abh350 ;Blow in progress?
; callr bosshit_big
abh350 move *a11(OXVEL),a1,L
move *a11(OYVEL),a2,L
addi buldat2_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 abhx ;No damage?
movi >21210000,a9
CREATE0 FLASHME
move *a8(OPLINK),a9,L ;A9=*Obj data struct
move *a10(>80),a2 ;A2=Weapon damage
jrnn abh400 ;!Bomb?
movk 1,a0
callr rnd
move a0,a2 ;Bomb damage 0 or 1
abh400
move @abossshld,a3
jrle abh500 ;Not counting?
sub a2,a3
jrgt abh450 ;OK?
CREATE BOSSPID,ab_afdmxpld
movi >4000,a1
callr boss_scorebonusword
clr a3
abh450 move a3,@abossshld
sll 4+2,a3 ;*4 (skip fractions)
move a3,@bossmeterv
jruc abh700
abh500 move *a9(ABDSHLD),a3 ;A3=Shield strength
jrle abh700
sub a2,a3
jrgt abh550 ;OK?
move @bloflg,a0
jrnz abh700 ;Blow or lockout in progress?
CREATE BOSSPID,ab_ballxpld
movi >4000,a1
callr boss_scorebonusword
abh550 move a3,*a9(ABDSHLD)
move @bossd_t+BLPART+ABDSHLD,a0
move @bossd_t+BRPART+ABDSHLD,a1
add a0,a1
sll 4+1,a1 ;*2 (skip fractions)
move a1,@bossmeterv
abh700 move *a10(>80),a1 ;Get score
abs a1
calla boss_scorehit
abhx 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
buldat2_t
.word -2,-3,-3,-3, 0, 0,-2,0 ;Shift count
.word -1, 1, 1, 3, 4, 3, 1,0 ;Damage/score
********************************
* Random akhboob snd for face hit
SUBRP snd_rndakhboob
movk 11,a0
callr rndrng0
sll 5,a0
addi srp_l,a0
move *a0,a0,L
jauc ONESND
srp_l
.long pain1snd,pain2snd,pain3snd,pain4snd
.long pain1snd,pain2snd,pain3snd,pain4snd
.long pain1snd,excusesnd
.long germ2snd,germ6snd
********************************
* 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
********************************
* Explode the ball (Process)
* A8=*Ball obj
* A9=*Ball data struct
SUBRP ab_ballxpld
movi ahkbang,a0
calla ONESNDOVR
movi 60*5,a6
abxlp
move *a8(OFLAGS),a4
move *a8(OXPOS),a10
addk 25,a10 ;+XO
move *a8(OYPOS),a11
addk 20,a11 ;+YO
btst 0,a6
jrnz abx150
movi aballlexp_t,a9 ;>Explosion
btst B_FLIPH,a4
jrz abx100 ;Left ball?
movi aballrexp_t,a9
abx100 CREATE BOSSPID,mk_objrpalfran
abx150
movi exp1snd,a0
calla ONESND
movi exp2snd,a0
calla ONESND
movk 8,a0
callr boss_addrndxy ;Shake!
movi >8000,a1
clr a2
btst B_FLIPH,a4
jrz abx400 ;LBall?
neg a1
abx400 callr boss_addxy ;Push
move a6,a9
SLEEPK 1
move a9,a6
dsj a6,abxlp
movi aballwrk_l,a9
JSRP FRANIMQ
DIE
aballlexp_t
LW xpld_l,3
.long GRNPAL,BLUBOOM,ORNGPAL
.word 190,->800,>200,->800,>800
aballrexp_t
LW xpld_l,3
.long GRNPAL,BLUBOOM,ORNGPAL
.word 190,->200,>800,->800,>800
xpld_l LW XPLD1,4
LW XPLD2,4
LW XPLD3,4
LW XPLD4,4
LW XPLD5,4
LW XPLD6,4
LW XPLD7,4
LW XPLD8,4
LW XPLD9,5
LWL0 XPLD10,5
aballwrk_l
LWL BBALLWRECK,NEWPALET|1,BBSHPAL
.long 0
********************************
* Explode the death machine (Process)
* A8=*Ball obj
* A9=*Ball data struct
SUBRP ab_afdmxpld
movi ahkbang,a0
calla ONESNDOVR
move @bossd_t,a8,L ;A8=*1st obj
movi 60*6,a6
aafxlp
movk 3,a0
callr rnd
jrz aafx200 ;25% skip explosion
btst 0,a6
jrnz aafx200
move *a8(OXPOS),a10
addk 25,a10 ;+XO
move *a8(OYPOS),a11
addi 38,a11 ;+YO
movi afdmexp_t,a9 ;>Explosion
btst 1,a6
jrnz aafx150
movi afdmexp2_t,a9
aafx150 CREATE BOSSPID,mk_objrpalfran
aafx200 movi exp1snd,a0
calla ONESND
movi exp2snd,a0
calla ONESND
movk 10,a0
callr boss_addrndxy ;Shake!
move a6,a9
SLEEPK 1
move a9,a6
dsj a6,aafxlp
movi EJECTSEAT,a1
move *a8(OFLAGS),a4
calla ANI
movi bossd_t+AKPART+64,a9 ;>Delete all objs except for 1-2
jruc aafx530
aafx500 calla DELOBJ
clr a0
move a0,*a9+,L ;Clr out *
addk 32,a9
aafx530 move *a9,a0,L
jrnz aafx500
; move @bossd_t+SHPART,a8,L ;>Small shadow
; movi EJCTSHAD,a1
; move *a8(OFLAGS),a4
; calla ANI
; move @bossd_t+SHPART+64,a8,L
; move *a8(OFLAGS),a4
; calla ANI
movi -1,a0
move a0,@abossshld ;Eject!
DIE
afdmexp_t
LW xpld_l,4
.long RDBOOM,YELLPAL,WHTPAL,ORNGPAL
.word 190,->300,>300,->280,>280
afdmexp2_t
LW xpld_l,4
.long RDBOOM,YELLPAL,WHTPAL,ORNGPAL
.word 190,->c00,>c00,->a00,>c00
********************************
* Explode the face (Process)
SUBRP ab_facexpld
movi BOSSPID|SUBFEYEANI,a0 ;Kill eye ani
calla KIL1C
movi 60*6,a2
callr set_bloflg
movi ahkbang,a0
calla ONESNDOVR
move @bossd_t,a8,L ;A8=*1st obj
movi 60*5,a6
.if EASY
movi 60*1,a6 ;DEBUG
.endif
afxlp
move *a8(OXPOS),a10
addi 55,a10 ;+XO
move *a8(OYPOS),a11
addi 64,a11 ;+YO
btst 0,a6
jrnz afx150
movi faceexp_t,a9 ;>Explosion
CREATE BOSSPID,mk_objrpalfran
afx150
movi exp1snd,a0
calla ONESND
movi exp2snd,a0
calla ONESND
movk >1f,a0 ;>Move up rnd
callr rnd
clr a1
sll 12,a0
neg a0
move a0,a2
move @bodystat,a0
subk 3,a0
jrne afx180 ;!Skull face?
sra 1,a2 ;/2
afx180 callr boss_addxy
move a6,a9
SLEEPK 1
move a9,a6
dsj a6,afxlp
movi bossd_t,a9 ;>Ani to new face
move @bodystat,a1
subk 2,a1
jrge afx400 ;!Akhboob face?
movi germansnd_t,a8
CREATE0 snd_script
movi abhitler_t,a10
movi HTLRP,a5
jruc afx530
afx400 movi abskull_t,a10
movi RDSKULLP,a5
subk 3-2,a1
jrlt afx530 ;Hitler?
movi abskulldead_t,a10
jruc afx530
afx500 move *a10+,a1,L
move *a8(OFLAGS),a4
calla ANI
move a5,a0
calla GETFPAL ;Get a color map assignment
move a0,*a8(OPAL) ;Set new palette
; clr a0
; move a0,*a9+,L ;Clr out *
addk 32,a9
afx530 move *a9+,a8,L
jrnz afx500 ;Object?
movi 2300,a3
.if EASY
movi 10,a3 ;DEBUG
.endif
move @bodystat,a2
addk 1,a2
cmpi 4,a2
jrlo afx650 ;!Dead?
neg a2
clr a3
afx650 move a3,@abossshld ;New shield (Hitler/Skull)
move a2,@bodystat
move a2,a2
jrn afx1000 ;Dead?
sll 4-2,a3 ;/4 (skip fractions)
move a3,@bossmeterv
clr a0
move a0,@CRSRAM,L ;More cruise msls
CREATE BOSSPID|SUBFEYEANI,ab_faceeyeani ;Restart
jruc afxx
afx1000 movk 1,a0
move a0,@ICONS_DN
CREATE BOSSPID,ab_bubblesnd ;>Bloody mess
PUSHP a0
CREATE BOSSPID,ab_facebleed
SLEEP 60*6
movi LOVEIT,a0 ;I love it speech
calla ONESND
SLEEP 60*1
movi racktunesnd,a0
calla ONESND
movk 1,a0
move a0,@NOSHOOT ;Plyrs can't shoot
movi [30,0],a9
movk 22,a10 ;Find real akhboob
CREATE0 ZONE_TXT2
SLEEP 60*5
PULLP a0
calla KILL ;Kill bubble snd
move @PLYRPRCS,a0,L ;>Remove helper blade
jrz afx2000
move *a0(LSRPTR),a8,L
jrz afx2000
calla LSHIT
afx2000 move @PLYRPRCS+32,a0,L
jrz afx2050
move *a0(LSRPTR),a8,L
jrz afx2050
calla LSHIT
afx2050
clr a0
move a0,@ESCAPED ;Ahkboob escaped flag
CREATE BOSSPID|SUBABMORT,ab_lnch_akhboobs
CREATE BOSSPID|SUBABMORT,ab_lnch_rndspch
movi >140,a10
CREATE0 SETDET ;Rings on
move @WORLDTLX+16,a8 ;>Start scroll down
addk 5,a8 ;A8=X target line to trigger scroll
clr a9 ;A9=0 (not checking for y target)
movi pathdn_t,a10 ;Scroll table
movi >8000,a0
move a0,@HZSPD,L
CREATE TARGPID,TARGET
afxx DIE
faceexp_t
LW xpld_l,7
.long RDBOOM,YELLPAL,WHTPAL,ORNGPAL,GRNPAL,BLUBOOM,GREYPAL
.word 190,->a00,>a00,->200,>c00
abhitler_t
.long HTLRTPHED
.long IMGNULL
.long HEDTUBES
.long HEDTUBES
.long HTLRI1
.long HTLRI1
.long HTLRMTH1
.long HTLRMTH1
.long CHEEK
.long CHEEK
.long CHIN
.long CHIN
.long EAR
.long EAR
abskull_t
.long SKULLTP
.long SKULLTP
.long IMGNULL
.long IMGNULL
.long SKULLI1
.long SKULLI1
.long SKULLMTH1
.long SKULLMTH1
.long SKULLCHEEK
.long SKULLCHEEK
.long SKULLCHIN
.long SKULLCHIN
.long IMGNULL
.long IMGNULL
abskulldead_t
.long IMGNULL
.long IMGNULL
.long SKPIPES
.long SKPIPES
.long IMGNULL
.long IMGNULL
.long IMGNULL
.long IMGNULL
.long SKULLRECK
.long SKULLRECK
.long IMGNULL
.long IMGNULL
.long IMGNULL
.long IMGNULL
IMGNULL .word 1,1,1000,0
.long IROM+3*32
germansnd_t
.word 60
LW germ1snd,>68
LW germ2snd,>3c
LW germ3snd,>3c
LW germ4snd,>3c
LW germ5snd,>3c
LW germ6snd,>30
LW germ2snd,>3c
LW germ1snd,>68
LW germ6snd,>30
LW germ5snd,>3c
LW germ3snd,>50
LW germ4snd,-1
pathdn_t
.word 5,1000*2,0
SUBRP ab_bubblesnd
abbslp
movi bubl1snd,a0
calla ONESND
SLEEPK 20
; movi bubl1snd,a0
; calla ONESND
; SLEEPK 20
jruc abbslp
********************************
* Face stump bleeds (Process)
SUBRP ab_facebleed
move @bossd_t+64*2,a8,L ;A8=*1st pipes obj
movi 60*7,a6
afblp
; btst 0,a6
; jrnz afb150
; 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
afb150 move *a8(OXPOS),a10
addk 20,a10 ;+Ani pt X offset
move *a8(OYPOS),a11
addi 45,a11
movi bloodc_t,a9
CREATE BOSSPID,mk_objfranim
CREATE BOSSPID,mk_objfranim
; btst 0,a6
; jrnz afb170
; CREATE BOSSPID,mk_objfranim
afb170 move a6,a9
; calla YZSORT
; calla YZSORT
; calla YZSORT
SLEEPK 1
move a9,a6
dsj a6,afblp
jruc afblp
bloodc_t
.long bldclt_l
.word 250,->c0,>c0,->c0,>c0
bldclt_l ;Oval blood spurt
LW bldclt1,5
LW bldclt2,5
LW bldclt3,5
LW bldclt4,5
LW bldclt5,5
LW bldclt6,5
LW bldclt7,5
LWL0 bldclt8,5
********************************
* Fire weapons from big face (Process)
SUBRP ab_faceweapons
afwlp SLEEPK 8
move @bloflg,a0
jrnz afwslp ;Blowing?
move @bossd_t,a2,L ;Get * 1st obj
move *a2(OYPOS),a2
move @WORLDTLY+16,a0
sub a0,a2
cmpi -10,a2
jrlt afwlp ;Too hi?
movi facemslo_t,a9
move @bodystat,a0
subk 3,a0
jrne afw100 ;!Skull?
movi facesklmslo_t,a9
afw100 movk 1,a0
callr rnd
jrnz afw500 ;Msl?
callr getplyr ;>Rocket
jrz afwslp ;No player?
callr abossseeko_dir32
move a0,a10
move @bossd_t+MTHPART,a8,L ;*LMth
CREATE BOSSPID,ab_fmouthani
move @bossd_t+MTHPART+64,a8,L ;*RMth
CREATE BOSSPID,ab_fmouthani
; movi puffsnd,a0
; calla ONESND
SLEEPK 4
move @bossd_t,a8,L ;*1st obj
movk 1,a11
movk 1,a0
callr rnd
jrnz afw350 ;Only 1?
subk 8,a10
movk 5,a11
afw350 CREATE BOSSPID,rocket_fireab
movi rcktlnchsnd,a0
calla ONESND
SLEEPK 1
addk 4,a10 ;Turn
dsj a11,afw350
jruc afwslp
afw500 ;>Missile
move @bossd_t+MTHPART,a8,L ;*LMth
CREATE BOSSPID,ab_fmouthani
move @bossd_t+MTHPART+64,a8,L ;*RMth
CREATE BOSSPID,ab_fmouthani
; movi puffsnd,a0
; calla ONESND
SLEEPK 4
move @bossd_t,a8,L ;*1st obj
movk 1,a11
movk 1,a0
callr rnd
jrnz afw550 ;Only 1?
movk 2,a11
addk 32,a9 ;2nd slot
afw550 movk 4,a0
callr rndrng0
addk 14,a0
move a0,a10 ;14-18
CREATE BOSSPID,missile_fireab
movi msllnchsnd,a0
calla ONESND
SLEEPK 1
addk 32,a9 ;Next slot
dsj a11,afw550
jruc afwslp
afw700 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
; dsj a11,wl450
afwslp movi 60*6,a0
callr rndrng0
addk 30,a0
move @STATUS,a1
subk 3,a1
jreq afw900 ;2 plyrs?
addi 60,a0 ;Easier
afw900 calla PRCSLP
move @bodystat,a0
jrnn afwlp
DIE
ABFXO .equ 55 ;Face offsets for center
ABFYO .equ 100
facemslo_t
.word ABFXO,ABFYO,ABFXO-10,ABFYO,ABFXO+10,ABFYO
facesklmslo_t
.word ABFXO-21,ABFYO-5,ABFXO-10-21,ABFYO-5,ABFXO+10-21,ABFYO-5
********************************
* Launch mines (Process)
SUBRP ab_minelauncher
amnllp SLEEPK 8
move @bloflg,a0
jrnz amnl70 ;Blowing?
callr getplyr ;>Rocket
jrz amnllp ;No player?
callr abossseeko_dir32
move a0,a10
move @bossd_t,a8,L ;*1st obj
CREATE BOSSPID,ab_mine
movi rcktlnchsnd,a0
calla ONESND
amnl70 movi 65,a0
callr rndrng0
addk 30,a0
calla PRCSLP
move @bodystat,a0
jrnn amnllp
DIE
********************************
* Mine (Process)
* A8=*1st boss obj
* A10=Dir 0-31
SUBRP ab_mine
move a10,a0
subk 12,a10
jrge am40 ;Min OK?
movk 12,a0
am40 subk 20-12,a10
jrle am50 ;Max OK?
movk 20,a0
am50 sll 4,a0 ;*16
addi sballv_t,a0
move *a0(8*16),a6 ;XV
move *a0,a7 ;YV
sll 3,a6
sll 3,a7
move @WORLDTLX,a0,L
addi [200,0],a0
move *a8(OYVAL),a1,L
addi [130,0],a1
movi M1,a2
movi 69,a3 ;Z
movi DMAWNZ,a4
movi CLSNEUT|TYPMINE,a5
calla BEGINOBJ2
amlp SLEEP 90
move *a8(OPLINK),a0,L
cmp a13,a0
jrne amx ;Freed and reallocated?
move a8,a0
calla ISOBJ
jrz amx ;Deleted?
move *a8(OYPOS),a2
move @WORLDTLY+16,a0
sub a0,a2
cmpi 256,a2
jrlt amlp ;Near bottom?
jauc DELOBJDIE
amx DIE
********************************
* Face mouth ani open/close (Process)
* A8=*Mouth obj
SUBRP ab_fmouthani
move @bodystat,a0
jrle afmax ;Bad?
sll 5,a0 ;*32
addi afma_t-32,a0
move *a0,a9,L
JSRP FRANIMQ
afmax DIE
afma_t .long akmth_l,htlrmth_l,skullmth_l
akmth_l
LW DCIMTH1,1
LW DCIMTH2,1
LW DCIMTH3,1
LW DCIMTH4,1
LW DCIMTH5,15
LW DCIMTH4,1
LW DCIMTH3,1
LW DCIMTH2,1
LWL0 DCIMTH1,1
htlrmth_l
LW HTLRMTH1,1
LW HTLRMTH2,1
LW HTLRMTH3,1
LW HTLRMTH4,1
LW HTLRMTH5,15
LW HTLRMTH4,1
LW HTLRMTH3,1
LW HTLRMTH2,1
LWL0 HTLRMTH1,1
skullmth_l
LW SKULLMTH1,2
LW SKULLMTH2,2
LW SKULLMTH3,15
LW SKULLMTH2,2
LWL0 SKULLMTH1,1
********************************
* Face eye animations (Process)
* A11=*Aboss process
SUBRP ab_faceeyeani
move @bossd_t+EYEPART+64,a8,L ;*REye obj
afealp
move @bodystat,a2
jale SUCIDE
sll 5,a2 ;*32
addi afea_t-32,a2
move *a2,a2,L
move *a2+,a0 ;# of pairs -1
callr rndrng0
sll 6,a0 ;*64
add a0,a2
move *a2+,a9,L
CREATE BOSSPID,afeafr
move *a2,a9,L
JSRP FRANIMQ
movk >1f,a0
callr rnd
addk 5,a0
calla PRCSLP
jruc afealp
afeafr move @bossd_t+EYEPART,a8,L ;FRANIM left eye
JSRP FRANIMQ
DIE
afea_t .long afeaak_t,afeaht_t,afeask_t
afeaak_t
.word 4
.long akeyel_l,akeyer_l, akeyer_l,akeyel_l
.long akeyel2_l,akeyer2_l, akeyer2_l,akeyel2_l
.long akeyeblnk_l,akeyeblnk_l, akeyeblnk_l,akeyeblnk_l
afeaht_t
.word 4
.long hteyel_l,hteyer_l, hteyer_l,hteyel_l
.long hteyel2_l,hteyer2_l, hteyer2_l,hteyel2_l
.long hteyeblnk_l,hteyeblnk_l, hteyeblnk_l,hteyeblnk_l
afeask_t
.word 1
.long skeyeblnk_l,skeyeblnk_l, skeyeblnk2_l,skeyeblnk2_l
akeyel_l
LW DCI1A,4
LW DCI1B,4
LW DCI1C,4
LW DCI1B,4
LW DCI1A,4
LWL0 DCI1,1
akeyer_l
LW DCI1D,4
LW DCI1E,4
LW DCI1F,4
LW DCI1E,4
LW DCI1D,4
LWL0 DCI1,1
akeyel2_l
LW DCI1A,4
LW DCI1B,4
LW DCI1C,20
LW DCI1B,4
LW DCI1A,4
LWL0 DCI1,1
akeyer2_l
LW DCI1D,4
LW DCI1E,4
LW DCI1F,20
LW DCI1E,4
LW DCI1D,4
LWL0 DCI1,1
akeyeblnk_l
LW DCICLOSED,4
LW DCICLOSED2,4
LW DCICLOSED,4
LWL0 DCI1,1
hteyel_l
LW HTLRI1A,4
LW HTLRI1B,4
LW HTLRI1C,4
LW HTLRI1B,4
LW HTLRI1A,4
LWL0 HTLRI1,1
hteyer_l
LW HTLRI1D,4
LW HTLRI1E,4
LW HTLRI1F,4
LW HTLRI1E,4
LW HTLRI1D,4
LWL0 HTLRI1,1
hteyel2_l
LW HTLRI1A,4
LW HTLRI1B,4
LW HTLRI1C,20
LW HTLRI1B,4
LW HTLRI1A,4
LWL0 HTLRI1,1
hteyer2_l
LW HTLRI1D,4
LW HTLRI1E,4
LW HTLRI1F,20
LW HTLRI1E,4
LW HTLRI1D,4
LWL0 HTLRI1,1
hteyeblnk_l
LW HTLRICLOSED,4
LW HTLRICLOSED2,4
LW HTLRICLOSED,4
LWL0 HTLRI1,1
skeyeblnk_l
LW SKULLI2,4
LW SKULLI3,4
LW SKULLI2,4
LWL0 SKULLI1,1
skeyeblnk2_l
LW SKULLI2,3
LW SKULLI3,3
LW SKULLI2,3
LWL0 SKULLI1,1
********************************
* Wall tube weapon launcher (Process)
* A9=Wall # (0=L,1=R)
SUBRP ab_wtube
awtlp
movk 8,a11
awtlp2 CREATE BOSSPID,ab_wtubeshot
SLEEPK 5
dsj a11,awtlp2
movi 180,a0
callr rndrng0
addi 60,a0
move @STATUS,a1
subk 3,a1
jreq awt50 ;2 plyrs?
addi 120,a0 ;Easier
awt50 calla PRCSLP
move @bodystat,a0
jrnn awtlp
DIE
********************************
* Launch akhboobs from dead face (Process)
SUBRP ab_lnch_akhboobs
SLEEP 60*1
move @bossd_t+64*2,a8,L ;A8=*1st pipes obj
alalp movk 3,a11
ala50 CREATE BOSSPID|SUBABGRNT,mortar_akhboob
; callr bloop_snd
SLEEPK 15
dsj a11,ala50
SLEEPK 30
jruc alalp
********************************
* Random akhboob speech (Process)
SUBRP ab_lnch_rndspch
alrslp movk 11,a0
callr rndrng0
sll 5,a0 ;*32
addi akhspch_t,a0
move *a0,a0,L
calla ONESND
movi 60*1,a0
callr rndrng0
addi 120,a0
calla PRCSLP
jruc alrslp
akhspch_t
.long ahkb1,ahkb2,ahkb3,ahkbsta,ahkbang
.long germ1snd,germ2snd,germ3snd,germ4snd,germ5snd,germ6snd
.long excusesnd
********************************
* Make slime pool sound
SUBRP bloop_snd
move @HCOUNT,a0
sll 32-2,a0
srl 32-2-5,a0
addi bloop_t,a0
move *a0,a0,L
movk 2,a1 ;repeat it
jauc SNDLD
bloop_t .long blp1snd,blp2snd,blp3snd,blp4snd
blp1snd .word >f575,20,>8134,0 ;Bloop snd
blp2snd .word >f575,20,>8136,0 ;
blp3snd .word >f575,20,>8138,0 ;
blp4snd .word >f575,20,>813a,0 ;
********************************
* Gun turret from wall (Process)
* A9=Tur # (0=L, 1-R)
; SUBRP ab_wallturret
; move @WORLDTLX,a0,L
; addi [200,0],a0
; move *a8(OYVAL),a1,L
; addi [130,0],a1
; movi TURBL1,a2
; movi 158,a3 ;Z
; movi DMAWNZ,a4
; movi CLSNEUT|TYPMINE,a5
; clr a6
; clr a7
; calla BEGINOBJ2
;
;
; 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
********************************
* Get aboss dir to face top of screen
* A0=Y offset
* A8=*Boss 1st obj
* Trashes A0-A3,A6-A7
*Rets:
* >A0=Dir 0-31
SUBRP abossseektop_dir32
move @WORLDTLX+16,a6 ;Dest XY
addi 200,a6
move @WORLDTLY+16,a7
add a0,a7
jruc absod32
********************************
* Get aboss dir to face a plyr
* A0=*Plyr obj to follow
* A8=*Boss 1st obj
* Trashes A0-A3,A6-A7
*Rets:
* >A0=Dir 0-31
SUBRP abossseeko_dir32
move *a0(OXPOS),a6 ;A6=Plyr X
addk 5,a6
move *a0(OYPOS),a7 ;A7=^ Y
absod32 move *a8(OXPOS),a0
addi ABXO,a0 ;+Center pt X offset
move *a8(OYPOS),a1
addi ABYO,a1 ;^YO
jauc sodboss
********************************
* 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
********************************
* 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
********************************
* 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
********************************
* 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
********************************
* 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
********************************
* Make an obj, franim and delete (Process)
* A9=*Data table
* A10=X
* A11=Y
SUBRP mk_objrpalfran
clr a6
clr a7
mofbv move a9,a5
move *a5+,a9,L ;*FRANIM_l
move *a5+,a0 ;Get # palettes
move a5,a2
move a0,a1
sll 5,a1 ;*32
add a1,a5 ;Skip list
subk 1,a0
callr rndrng0
sll 5,a0 ;*32
add a0,a2
move *a2,a8,L ;Get *PAL
mof20 move *a9,a2,L ;*IMG
mof40 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
move a8,a10
calla BEGINOBJ2
move a10,a0 ;*PAL
calla GETFPAL
jrz mof70 ;No palette?
move a0,*a8(OPAL) ;Set new palette
mof70 jauc FRQDELDIE
********************************
* Start the pleasure dome fountain anims
SUBRP fountains_strtani
movi fount_t,a8
fsalp CREATE0 fountain_ani
addi 80,a8
move *a8,a0,L
jrnz fsalp
rets
fount_t LWWW watr_l,106,-60,DMAWNZ|M_NOCOLL
LWWW watr_l,300,-60,DMAWNZ|M_NOCOLL|M_FLIPH
LWWW fount_l,70,-1217,DMAWNZ|M_NOCOLL
LWWW nside_l,114,-1212,DMAWNZ|M_NOCOLL
LWWW wside_l,56,-1200,DMAWNZ|M_NOCOLL
LWWW fount_l,332,-1153,DMAWNZ|M_NOCOLL|M_FLIPH
LWWW nside_l,288,-1148,DMAWNZ|M_NOCOLL|M_FLIPH
LWWW wside_l,347,-1135,DMAWNZ|M_NOCOLL|M_FLIPH
.long 0
watr_l LW WATR1,6
LW WATR2,6
LWL0 WATR3,6
fount_l LW fount1,7
LW fount2,7
LW fount3,7
LWL0 fount4,7
nside_l LW nside1,7
LW nside2,7
LW nside3,7
LWL0 nside4,7
wside_l LW wside1,7
LW wside2,7
LW wside3,7
LWL0 wside4,7
SUBRP fountain_ani
move *a8+,a9,L
move *a8+,a0 ;X
move *a8+,a1 ;Y
sll 16,a0
sll 16,a1
move *a9,a2,L
movi 170,a3 ;Z
cmpi fount_l,a9
jrne fa50 ;!Fountain
addk 5,a3 ;+Z
fa50 move *a8+,a4
movi CLSDEAD,a5
clr a6
clr a7
calla BEGINOBJ
move a9,a11
falp JSRP FRANIMQ
move a11,a9
jruc falp
********************************
* Random pdome speech (Process)
SUBRP pdome_rndspch
pdrslp movk 5,a0
callr rndrng0
sll 5,a0 ;*32
addi pdspeech_t,a0
move *a0,a0,L
calla ONESND
movi 60*5,a0
callr rndrng0
addi 90,a0
calla PRCSLP
jruc pdrslp
pdspeech_t
.long LOVEIT,TOTCARN,WOO1,WOO2,pdwelcomesnd,gosnd
********************************
* Run a sound script (Process)
* A8=*Script
SUBRP snd_script
move *a8+,a0 ;1st sleep
sslp calla PRCSLP
move *a8+,a0,L
calla ONESND
move *a8+,a0
jrgt sslp ;More?
DIE
********************************
* Print text scrolling up
* A8=*String table
SUBRP prt_scrolltxt
CREATE0 scrolltxt
pstlp movb *a8,a0
jrnn pst100
move @SWITCH+>30,a1
btst 0,a0
jrz pst50 ;Normal?
not a1 ;Flip the test
pst50 btst 7,a1
jrnz pst80 ;DIP off?
pst70 addk 8,a8
movb *a8,a0
jrnz pst70 ;!End of line?
addk 8,a8 ;1st char next line
jruc pst300
pst80 addk 8,a8
pst100 clr a0
movi >3f3f,a6 ;Color
movi [256,200],a9 ;Y:X
movk [0,1],a10 ;Char Y:X spacing
movi RD15FONT,a11 ;*Font
JSRP STRCNRMO
SLEEP 85
pst300 movb *a8,a0
jrnz pstlp
RETP
********************************
* Scroll all text up screen, delete if off top (Process)
SUBRP scrolltxt
stlp move @WORLDTLY+16,a6
subk 20,a6
move @OBJLST,a0,L
st40 move *a0(OID),a1
cmpi CLSNEUT|TYPTEXT|SUBTXT,a1
jrne st70
move *a0(OYPOS),a1
cmp a6,a1
jrge st60
move *a0,a3,L ;Get * next
calla DELOBJ
move a3,a0
jruc st80
st60 movi ->8000,a1
move a1,*a0(OYVEL),L
st70 move *a0,a0,L
st80 jrnz st40 ;Continue?
SLEEPK 2
jruc stlp
;TX $macro t
; .byte :t:,0
; $end
********************************
* Text - destroyed akhboobs capabilities and entered pdomes
victorytxt_s
.byte "Congratulations!",0
.byte " ",0
.byte "You have joined the heroes",0
.byte "from Smash T.V. in the",0
.byte "Pleasure Domes! We have",0
.byte "been waiting for you! The",0
.byte "ladies have been most anxious!",0
.byte " ",0
.byte "You have delivered Captain",0
.byte "Carnage and Major Mayhem into",0
.byte "a life of leisure. Their every",0
.byte "wish will be granted. Of",0
.byte "course, they will have to share",0
.byte "the goodies with the Smash boys,",0
.byte "but there is plenty to go around!",0
.byte " ",0
.byte "You are one of only a few",0
.byte "who have reached this far.",0
.byte " ",0
.byte "You are a great dual joystick",0
.byte "game player.",0
.byte " ",0
.byte " ",0
.byte "However, as greedy as you are, you",0
.byte "failed to pick up all the cash and",0
.byte "prizes sitting in the Pleasure Dome!",0
.byte " ",0
.byte "If you do this, the ladies will",0
.byte "prove that pain before pleasure",0
.byte "is worth it.",0
.byte " ",0
.byte "Can you do this?",0
.byte " ",0
.byte " ",0
.byte "Thank you for playing",0
.byte "Total Carnage.",0
.byte " ",0
.byte " ",0
.byte "Total Carnage Design Team:",0
.byte "Mark Turmell",0
.byte "John Tobias",0
.byte "Shawn Liptak",0
.byte "Jim Gentile",0
.byte "Jon Hey",0
.byte "Eugene Jarvis",0
.byte "Tony Goskie",0
.byte " ",0
.byte "Special Thanks:",0
.byte "George Petro",0
.byte "Larry Demar",0
.byte "Ed Boon (Voices)",0
.byte "Todd Allen",0
.byte "Cary Mednick",0
.byte "Sheridan Oursler",0
.byte "Mark Loffredo",0
.byte "Ray Gay",0
.byte "Ray Czajka",0
.byte "Betty Purcell",0
.word 0
********************************
* Text - destroyed akhboobs stuff, he escaped, you failed to enter pdomes
nopdometxt_s
.byte "Congratulations!",0
.byte " ",0
.byte "You have destroyed Akhboob's",0
.byte "army and his ability to",0
.byte "create more mutant life",0
.byte "forms. You wrecked his",0
.byte "Bio-Nuclear facility,",0
.byte "airport, communications",0
.byte "system, weapons arsenal,",0
.byte "and his military vehicles.",0
.byte " ",0
.byte "You also saved hundreds",0
.byte "of hostages and recovered",0
.byte "billions of dollars worth",0
.byte "of stolen gems.",0
.byte "That is great news!",0
.byte " ",0
.byte "However, you allowed General",0
.byte "Akhboob to escape!",0
.byte " ",0
.byte "Being the DUFUS you are, you",0
.byte >80,"also failed to collect the 220",0
.byte >81,"also failed to collect the 200",0
.byte "keys required to join other",0
.byte "game heroes in the Midway",0
.byte "Pleasure Domes.",0
.byte "This is not good.",0
.byte " ",0
.byte "Ahkboob lives...",0
.byte " ",0
.byte "No pleasure for you today...",0
.byte " ",0
.byte "Thank you for playing!",0
.word 0
********************************
* Text - destroyed akhboobs stuff and akhboob, failed to enter pdomes
nopdometxt2_s
.byte "Congratulations!",0
.byte " ",0
.byte "You fried the hell out of",0
.byte "that jerk! Great job!",0
.byte " ",0
.byte "You have destroyed Akhboob's",0
.byte "army and his ability to",0
.byte "create more mutant life",0
.byte "forms. You blew up his",0
.byte "Bio-Nuclear facility,",0
.byte "airport, communications,",0
.byte "and weapons arsenal. You",0
.byte "saved hundreds of lives!",0
.byte "You are a stud game player.",0
.byte " ",0
.byte "However, the real goal of",0
.byte "this game is to join the",0
.byte "heroes from Smash T.V. in",0
.byte "the Midway Pleasure Domes.",0
.byte >80,"You must collect 220 keys",0
.byte >81,"You must collect 200 keys",0
.byte "to gain entrance.",0
.byte "You failed to do this.",0
.byte " ",0
.byte "You suck.",0
.byte " ",0
.byte "Thank you for playing!",0
.word 0
.end