total-carnage/NEWHULK.ASM

3720 lines
70 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: Mark Turmell
* Initiated: 11/6/90
*
* Modified: Shawn Liptak, 10/27/91 -Orcus mods
*
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 1/7/92 13:24
**************************************************************
.FILE 'NEWHULK.ASM'
.TITLE 'TOTAL CARNAGE GAME PROGRAM'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
.INCLUDE "DISP.EQU" ;DISPLAY PROC. EQUATES
.INCLUDE "\VIDEO\SYS\SYS.INC" ;Z UNIT SYSTEM EQUATES
.include "\video\sys\gsp.inc"
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS DEFINITIONS
.INCLUDE "IMGTBL.GLO"
.INCLUDE "GAME.EQU"
.INCLUDE "FINGRNT.TBL"
.INCLUDE "HULK.HDR"
;
;SOUNDS EXTERNAL
;
.REF EXP2,GRNTSHT,ALTEXP1,EXP1L,GUYDI
;
;SYMBOLS EXTERNALLY DEFINED
;
.REF ATME,DOAGN
.REF aboss,T72PNTR,CTOTAL
.REF ERECT6,BURST,DO_WINNER,STATUS,PHASE1,BOLTS
.REF INST_WARP
.REF HSTGS_LOST,AOF,RNDRNG0,FLAMING
.REF SETC2,STRT_G,CRSRAM,ICONS_DN,HZSPD
.REF TARGET,LHLPS
.REF SEND_ICON
.REF WAVE_RAM,EHALT,GETANIX,GETFPAL,PLYROBJS,PLYRPRCS,OUT_FLG
.REF P1DATA,P2DATA,RANDPER,FRANIM,FRANIMQ
.REF RANGRAND,HALT,SCRADD2,PCTOT
.REF ENEMY_RECT,RANDOM,TAKEEL,SCRTST,XBOOM2,WAVE,DOLORD,ENDWV
.REF CHUNK_OBJ,PCNT,START_PJ2,FLASHME,ONARRW
.REF PUSHME,DO_PUNISH,HSTGSET,OBJON,OBJOFF,FAKET,EXPCNT,BTR60A
.REF ONE_FND,FND_CNT,MAXFND,WAITTNT,GOBACK,CLNPAL
.REF GSKIPR,ASKIPR
.REF DOYV1,DOYV,DOYVP
.ref RUNIN
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF SKGHXT,SHXT,ABOOBJUMP
.DEF FLMUP1,FLMUP2,FLMUP3,FLMUP4,FLMUP5,FLMUP6,RUN_AWAY,FIXEDA
.DEF SPAWN_RUNNR
.DEF CRT_AHMD,SPAWN_FND,SPAWN_SKIPR
.DEF SEND_GROUP,SPAWN_HULKS,BAT_PLYR,KILL_HULK,KILL_H1
.DEF MAXHULK,HULK_CNT,EN_CURRENT,HULK_DN
.DEF SENDH_TOP,SENDH_GROUP,INTO
.DEF DO_DIFF2,SPINFLGS,BOOM3,KILL_HULKZ,JUMPER
.DEF BLSTS,SPAWN_AHMD,SHULK
.DEF SOLDR,SOLDRD,SOLDRDL,INTO12,MAXAHMD,AHMD_CNT,SITLST,ANI_STEEL
.DEF JUMPXY,JUMPXY2,GET_WVADDR,BOOM2,PBLSTS
.DEF KILL_AHMDZ,KILL_AHMD,I_FLM,HTYPE
.DEF SKIPR_DN,SKIPR_CNT,MAXSKPR,SHSTG
.def TRY_RCK
.DEF ESCAPED
;
;UNINITIALIZED RAM DEFINITIONS
;
.BSS ESCAPED,16
.BSS HULK_DN,16
.BSS AHMD_CNT,16 ;TOTAL AHMEDS ON SCREEN
.BSS MAXHULK,16
.BSS MAXAHMD,16
.BSS JUMPER,16
.BSS JUMPXY,16
.BSS JUMPXY2,16
.BSS EN_CURRENT,32 ;COLLISION RECTANGLES
.BSS SITLST,32 ;FOR AHMED SITTING SPOTS
.BSS HTYPE,16
.BSS MAXSKPR,16
.BSS SKIPR_CNT,16
.BSS SKIPR_DN,16
.BSS SNDCNT,16
.BSS HULK_CNT,16 ;TOTAL HULKS ON SCREEN
;
;EQUATES FOR THIS FILE
;
MAXLEVEL .EQU 10
HSPEED .EQU 08000H
HITAHMD .EQU 25*30 ;BTR60 TURRET
;
;STRUCTURES
;
;
;HSTG DATA STRUCTURE
;
;CYCLES .EQU PDATA ;ANIMATION CYCLES BEFORE TURN
;OLDDIR .EQU PDATA+16 ;OLD DIR BEFORE TURN
;
;HULK DATA STRUCTURE
;
HAGE .EQU PDATA ;OBJECT AGE
DIR .EQU PDATA+16 ;OBJECT DIRECTION
DIS .EQU PDATA+32 ;OBJECT DISTANCE COUNT
;MYPLYR .EQU PDATA+48 ;UHW PLAYER 1 OR 2 FIRED ME=1 OR 2
KPAGE .EQU PDATA+48 ;UHW
SK_DIR .EQU PDATA+64 ;SEEK DIR FOR SPIN
LEVEL .EQU PDATA+80 ;DIFFICULTY LEVEL FOR SPEEDS ETC.
HSPD .EQU PDATA+96
H2SPD .EQU PDATA+128
VSPD .EQU PDATA+160
V2SPD .EQU PDATA+192 ;UHL
SKPLYR .EQU PDATA+224 ;UHW PLAYER # TO PURSUE 0 OR 1
OSCILLATE .EQU PDATA+240 ;UHW
ABSRB .EQU PDATA+256 ;UHW
;ABSRB IS DEFINED IN FIEND.ASM AND IT MUST STAY HERE
BOXCK .EQU PDATA+272 ;UHW CNTR FOR TIMING BOX CHECKS
BNCING .EQU PDATA+288 ;UHW FLAG 0=NO,1=YES BNCING OFF
JUMPF .EQU PDATA+304 ;UHW FLAG 1=DWN,2=LFT,3=RGT
HULKTYP .EQU PDATA+320 ;UHW 0=NORM W/GUN,1=DEMON W/AXE
STCNT .EQU PDATA+336 ;UHW SHOOT AT PLAYER CNTR
BULPRC .EQU PDATA+352 ;UHL BULLET PROCESS FIRING BULLS!
GOCRNR .EQU PDATA+384 ;UHL [Y,X] OF CORNER FOR AHMD
CFLAGS .EQU PDATA+416 ;UHW CONTROL FLAGS FOR OBJECT
NOFLMS .EQU PDATA+432 ;UHW
BNCCNT .EQU PDATA+448 ;UHW BOUNCE OFF RECT CNT
IBAT .EQU PDATA+464 ;UHW BAT FLAG 0=OFF, 1=ON
;
.TEXT
ANI_STEEL
;A8=STEEL DOOR IMAGE FROM BACKGROUND UPDATER
;ANIMATE, THEN KILL OFF ONCE IT IS OFF SCREEN
CLR A0
MOVE A0,*A13(PDATA) ;GRUNTS SPAWNED FROM THIS TRAP DOOR
SLEEP 4*60
ANIST
MOVI 20,B0
MOVI 2*60,B1
CALLA RANGRAND
CALLA PRCSLP
MOVE @WORLDTLY,A0,L
ADDI [250,0],A0
MOVE *A8(OYVAL),A1,L
CMP A0,A1
JRC ANI_S9
;FALLS IN HERE IF PIT IS DOWN BELOW SCREEN
jauc DELOBJDIE
ANI_S9
;CHECK TO SEE IF I CAN GENERATE A GRUNT
;IF SO, OPEN DOOR AND SEND X # OF GRUNTS OUT
;SEND GRUNT AT PROPER DIRECTION
MOVE @HULK_CNT,A2 ;MOVE BYTE (# HULKS ON SCRN) TO A2
MOVE @MAXHULK,A3
SUBK 9,A3
CMP A3,A2 ;HULKS MAXED OUT?
JRGT ANIST
MOVE *A13(PDATA),A0
CMPI 50,A0
JRGT ANIST
MOVI PITDR2,A1 ;HALFWAY
MOVE *A8(OFLAGS),A4
CALLA ANI
SLEEPK 2
MOVE A8,A0
CALLA OBJOFF ;OPEN ALL THE WAY
; MOVE @PCNT,A9
; ANDI 07H,A9
; INC A9
MOVK 6,A0
CALLA RNDRNG0
INC A0
MOVE A0,A9
ANS3 SLEEPK 1
MOVE @HALT,A0
JRNZ ANS3
;TURN ON GRUNT AND SEND HIM OUT!
MJP CREATE HULKPID,JUMPOUT
MOVE @HTYPE,A1
MOVE A1,*A0(HULKTYP)
MOVE *A13(PDATA),A0
INC A0
MOVE A0,*A13(PDATA) ;HULKS RELEASED FROM THIS PIT!
MOVK 1,B0
MOVK 23,B1
CALLA RANGRAND
CALLA PRCSLP
DSJS A9,MJP
SLEEPK 15
MOVE A8,A0
CALLA OBJON ;HALFWAY
SLEEPK 2
MOVI PITDR1,A1
MOVE *A8(OFLAGS),A4
CALLA ANI ;CLOSED
JRUC ANIST
SOLDRD:
;A8=SOLDIER FROM BACKGROUND TABLE
;A HULK CREATED FROM BACKGROUND MODULE
;PAUSE, COME ALIVE AND JUMP STRAIGHT DOWN TOWARD PLAYER
CALLR GETPSK
CLR A0
MOVE A0,*A13(HULKTYP) ;REGULAR SOLDIER FROM BGND
MOVE A0,*A13(BULPRC),L
MOVI ZEROS,A9
MOVI DGSTND1,A1
CALLR SOLD
JRZ NOSP0
;ODD Y LINE, PAUSE A MOMENT
MOVI 0FFH,A0
MOVE A0,*A13(IBAT)
MOVI 170,B0 ;200
MOVI 430,B1 ;450
CALLA RANGRAND
CALLA PRCSLP
NOSP0
CLR A0
MOVE A0,*A13(IBAT)
MOVK 5,A0
MOVK 1,A11
NOSP00 MOVE A0,*A13(DIR)
MOVE A0,*A13(BOXCK)
MOVK 3,A1
MOVE A1,*A13(LEVEL),W
CALLR DO_DIFF
MOVE *A13(DIR),A0
CALLR INTO
CALLR GET_RUN ;GET FIRST FRANIM PNTR FOR
MOVE A11,*A13(JUMPF) ;STRAIGHT DOWN FLAG
JRUC BIN
SOLDRDL:
;A8=SOLDIER FROM BACKGROUND TABLE
;A HULK CREATED FROM BACKGROUND MODULE
;PAUSE, COME ALIVE AND JUMPD DOWN TO LEFT AND RUN TOWARD PLAYER
CALLR GETPSK
CLR A0
MOVE A0,*A13(HULKTYP) ;REGULAR SOLDIER FROM BGND
MOVE A0,*A13(BULPRC),L
MOVI ZEROS,A9
MOVI DSWINGa,A1
CALLR SOLD
JRZ NOSP1
;ODD Y LINE, PAUSE A MOMENT
MOVI 0FFH,A0
MOVE A0,*A13(IBAT)
MOVI 250,B0
MOVI 400,B1
CALLA RANGRAND
CALLA PRCSLP
NOSP1 CLR A0
MOVE A0,*A13(IBAT)
MOVK 7,A0
MOVK 3,A11
JRUC NOSP00
SHULK
;A9=[Y,X] SPOT TO SPAWN FROM
;A10=DIRECTION OF GROW FROM SLIME
;A10=0=UPLFT
;A10=1=UPRGT
;A10=2=BTMLFT
;A10=3=BTMRGT
CALLR GETPSK
CLR A0
MOVE A0,*A13(BULPRC),L
MOVK 1,A0 ;DEMON
MOVE A0,*A13(HULKTYP) ;REGULAR SOLDIER FROM BGND
MOVE A0,*A13(BOXCK)
MOVK 3,A1
MOVE A1,*A13(LEVEL),W
MOVK 1,A0
MOVE A0,*A13(DIS) ;TIME BEFORE WE GET NEW VELOCITIES
MOVE A9,A1
MOVX A9,A0
SLL 16,A0
SLL 6,A10
ADDI GRWINFO,A10
MOVE *A10+,A9,L
MOVE *A10,A10
MOVE A10,*A13(DIR)
;A0,A1 ARE SET UP
;A9=FRANIM GROW FROM SLIME
MOVI gb6w5a,A2 ;DEMON START
MOVI 159,A3
MOVI DMAWNZ,A4 ;NON-ZERO VALUE
MOVI CLSENMY|TYPGRW,A5
CLR A6
CLR A7
CALLA BEGINOBJ2
MOVI GRNTB,A0
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
;GROW UP FROM SLIME
JSRP FRANIMQ
MOVI CLSENMY|TYPHULK,A5
MOVE A5,*A8(OID)
;THEN START WITH A VELOCITY!
CALLR OKVA
MOVK 6,A3
MOVE A3,*A13(DIS)
JRUC LUP_ST
GRWINFO .LONG GR10,8,GR2,2,GR8,6,GR5,4
SOLDR:
;A8=SOLDIER FROM BACKGROUND TABLE
;A HULK CREATED FROM BACKGROUND MODULE
;PAUSE, COME ALIVE AND RUN TOWARD PLAYER
;NOW POINT THIS HULK AT CURRENT POSITION OF PLAYER
CALLR GETPSK
CLR A0
MOVE A0,*A13(BULPRC),L
MOVE A0,*A13(HULKTYP) ;REGULAR SOLDIER FROM BGND
MOVI ZEROS,A9
MOVI DGSTND1,A1
CALLR SOLD
JRZ NOSP
;ODD Y LINE, PAUSE A MOMENT
MOVI 0FFH,A0
MOVE A0,*A13(IBAT)
MOVI 200,B0
MOVI 900,B1
CALLA RANGRAND
CALLA PRCSLP
CLR A0
MOVE A0,*A13(IBAT)
NOSP
MOVK 5,A0
MOVE A0,*A13(DIR)
MOVE A0,*A13(BOXCK)
MOVK 2,A1
MOVE A1,*A13(LEVEL),W
MOVK 1,A0
MOVE A0,*A13(DIS) ;TIME BEFORE WE GET NEW VELOCITIES
CALLR DO_DIFF
JRUC LUP_ST
RUN_AWAY
MOVE @WAVE,A0
SUBI 36,A0
JRNZ RUN2
;AKHBOOB JUMPING OUT OF MOUTH
MOVE A13,A9
CREATE HULKPID,CKESCAPE
clr a0
move a0,*a8(OPLINK),L
MOVI BOOB_DN,A9
MOVI 1532,A0
MOVE A0,*A13(DIS) ;TIME BEFORE WE GET NEW VELOCITIES
MOVE A0,*A13(KPAGE)
MOVK 6,A1
MOVE A1,*A13(LEVEL),W
MOVI 0f000H,B0
MOVI 01f000H,B1
CALLA RANGRAND
MOVE A0,A4
MOVK 4,A0 ;INDICATES AKHBOOB GRUNT
MOVI ABOOB61,A1
JRUC RUN3
CKESCAPE
SLEEPK 1
MOVE *A8(OID),A0
CMPI CLSDEAD,A0
JAZ SUCIDE
;AKHBOOB AT BOTM OF SCRN
MOVE *A8(OYPOS),A0
MOVE @WORLDTLY+16,A1
ADDI 270,A1
CMP A0,A1
JRGT CKESCAPE
; CALLA SCRTST ;RETURNS Z IF ON SCREEN
; JRZ CKESCAPE
movk 1,a0
move a0,@ESCAPED ;Tell ABOSS that akhboob escaped
DIE
;ABOOB61,ABOOB62,ABOOB63,ABOOB64,ABOOB65,ABOOB66,ABOOB67,ABOOB68
RUN2
;A8=FLAMING GRUNT FROM BTR60
MOVI FTF_PWK_DN,A9
MOVK 32,A0
MOVE A0,*A13(DIS) ;TIME BEFORE WE GET NEW VELOCITIES
MOVK 2,A1
MOVE A1,*A13(LEVEL),W
MOVK 3,A0
MOVI FLM6R1,A1
MOVI 08000H,A4
RUN3 MOVE A0,*A13(HULKTYP) ;FLAMING GRUNT
MOVE A4,*A8(OYVEL),L
MOVE *A8(OFLAGS),A4
CALLA ANI
CALLR GETPSK
CLR A0
MOVE A0,*A13(BULPRC),L
MOVE A13,*A8(OPLINK),L
MOVE *A8(OYPOS),A10
SUBK 20H,A10
MOVE A10,*A8(OYPOS)
; CALLA ANI
MOVI CLSENMY|TYPHULK,A4
MOVE A4,*A8(OID),W
CLR A4
MOVE A4,*A8(OXVEL),L
MOVI 159,A4
MOVE A4,*A8(OZPOS),W
MOVK 5,A0
MOVE A0,*A13(DIR)
MOVE A0,*A13(SK_DIR)
MOVE A0,*A13(BOXCK)
CALLR DO_DIFF
JRUC LUP_ST
SPAWN_RUNNR
;SEND HOSTAGES DOWN SCREEN
MOVE @HALT,A0
JRNZ SPRET
MOVI 150,A0
CALLA RANDPER
JRNC SPRET
MOVI JEEPID,A0
CLR A1
NOT A1
CALLA EXISTP
JRNZ SPRET ;BR=JEEP OUT!
CREATE0 LHLPS
MOVI RUNNRS,A2
CALLR GET_WVADDR
MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS HSTG GROUP
DEC A1
MOVE A1,*A0(16),W
; MOVE *A0(32),A0 ;GET HSTG RANGE PNTR
; SLL 5,A0
MOVE @ENEMY_RECT,A0,L
SPR MOVE *A0(16),A1
CMPI 5,A1
JRZ GOTSPT
ADDI 6*16,A0
JRUC SPR
GOTSPT
;A9=[Y,X] OF SPOT TO START FROM
MOVE *A0(64),A1
MOVE *A0(32),A9
SUB A9,A1
SRL 1,A1
ADD A1,A9 ;X IS SET UP
MOVE *A0(80),A1
MOVE *A0(48),A2
SUB A2,A1
SRL 1,A1
ADD A1,A2 ;Y IS SET UP
SLL 16,A2
SUBI [20,0],A2
MOVY A2,A9
CREATE FUTUREPID,SENDRUN
SPRET RETS
SENDRUN
MOVK 3,A8
RUN1 SLEEPK 30
CALLR SENDH_GROUP
DSJ A8,RUN1
DIE
; .WORD 0,5,595-XX2+25,4356-YY2-36,605-XX2+25,4351-YY2-20
;SEND HOSTAGES DOWN SCREEN
SENDH_TOP:
;SEND FIRST GROUP OF HOSTAGES DOWN AT PLAYER
; MOVK 2,A8
SEND1
SLEEP >35
MOVE @WORLDTLY,A0,L
SUBI [50,0],A0
MOVE @WORLDTLX,A9,L
SRL 16,A9
ADDI 160,A9
MOVY A0,A9
CALLR SENDH_GROUP
; DSJ A8,SEND1
DIE
SENDH_GROUP:
;SEND GROUP OF HULKS FROM SPECIFIC SPOT
;A9=[Y,X] OF SPOT TO START FROM
;8 1 2
;7 3
;6 5 4
CALLA RANDOM
ANDI 07H,A0
ADDK 2,A0 ;1
MOVE A0,A5
;A11=0 TO SPREAD THEM OUT A BIT
SG1H
CREATE FUTUREPID,AHSTG ;START ONE HSTG
DSJS A5,SG1H
RETS
HSLST .LONG HSTGDWN,HSTGDWNA,HSTGDWNA2,HSTGDWN2
AHSTG:
;A9=[Y,X] SPOT TO SPAWN FROM
;A11=1 IF FIXED AREA FOR RELEASE
;8 1 2
;7 3
;6 5 4
;THIS HSTG WAS SPAWNED FROM SEND_GROUP
CLR B0
MOVK 19,B1
CALLA RANGRAND
SLL 16,A0
ADD A9,A0
MOVE A0,A1
CLR B0
MOVI 60,B1
CALLA RANGRAND
MOVX A9,A2
ADD A0,A2
SLL 16,A2
MOVE A2,A0
;A0,A1 ARE SET UP
MOVI GRL1,A2 ;DOES NOT MATTER
MOVI 159,A3
MOVI DMAWNZ,A4 ;NON-ZERO VALUE
MOVI CLSNEUT|TYPHSTG|SUBRUN,A5
CLR A6
CLR A7
CALLA BEGINOBJ2
CALLA RANDOM
ANDI 03H,A0
SLL 5,A0
ADDI HSLST,A0
MOVE *A0,A9,L
MOVI 0B000H,B0
MOVI 14000H,B1
CALLA RANGRAND
MOVE A0,*A8(OYVEL),L
MOVE A9,A10
JSRP FRANIMQ
MOVE A10,A9
;GET ME ON SCRN
HTOP
;GO THROUGH ANIMATION LIST
JSRP FRANIMQ
CALLA SCRTST
JRNZ KILOFF
MOVE A10,A9
JRUC HTOP
KILOFF
MOVE @HSTGS_LOST,A0 ;TOTAL MISSED HOSTAGES HERE FOR RACKUP
INC A0
MOVE A0,@HSTGS_LOST
jauc DELOBJDIE
CRT_AHMD
;AHMED FLAME THROWER DUDE SPAWNED FROM A CRATE
;AAHMED:
;A9=[Y,X] SPOT TO SPAWN FROM
;A10=DIRECTION
;8 1 2
;7 3
;6 5 4
MOVK 3,A10
MOVE *A8(OFLAGS),A0 ;A8=CRATE
BTST B_FLIPH,A0
JRZ FND1
MOVK 7,A10 ;A10=DIR
FND1 MOVE *A8(OXPOS),A0,L
; ADDK 15,A0
MOVE *A8(OYVAL),A9,L
SUBI [20,0],A9
MOVX A0,A9
MOVK 4,A1 ;LEVEL FOR CRATE AHMEDS
CALLR START_AHMD
MOVK 25,A3 ;20
MOVE A3,*A13(DIS) ;CHANGE BASED ON HULKS SPEED?
CLR A0
MOVE A0,*A13(CFLAGS)
MOVE A0,*A13(GOCRNR),L
JRUC CRATE_IN
SPAWN_FND:
;SPAWN FIEND
MOVE @FND_CNT,A2 ;MOVE BYTE (# FNDS ON SCRN) TO A2
MOVE @MAXFND,A3
CMP A3,A2 ;FNDS MAXED OUT?
JRGT HULK_OUT
CALLR FIXEDA
CMPI 5,A10
JRNZ SPF
ADDI [-25,42],A9
;A8=CHOSEN RECTANGLE INFO
;A9=[Y,X] OF SPOT TO START FROM
;A10=DIRECTION
SPF CREATE FNDPID,ONE_FND ;START ONE FND
RETS
SPAWN_AHMD:
;SPAWN AHMED IS CALLED FROM 'WAVE OVERLORD' CODE WHICH DISPERSES
;BAD GUYS THROUGHOUT A WAVE
MOVE @AHMD_CNT,A2 ;MOVE BYTE (# HULKS ON SCRN) TO A2
MOVE @MAXAHMD,A3
CMP A3,A2 ;HULKS MAXED OUT?
JRGT HULK_OUT
;SELECT RECTANGLE FROM CURRENT LIST
;GET RANDOM [Y,X] WITHIN CHOSEN RECTANGLE INTO A9
;GET DIRECTION FOR THAT RECTANGLE INTO A10
;JUMP INTO SEND_GROUP CODE
CALLR FIXEDA
;A8=CHOSEN RECTANGLE INFO
;A9=[Y,X] OF SPOT TO START FROM
;A10=DIRECTION
CREATE AHMDPID,AAHMED ;START ONE AHMED
RETS
SPAWN_HULKS:
;SPAWN HULKS IS CALLED FROM 'WAVE OVERLORD' CODE WHICH DISPERSES
;BAD GUYS THROUGHOUT A WAVE
MOVE @HULK_DN,A0
JRNZ HULK_OUT
MOVE @HULK_CNT,A2 ;MOVE BYTE (# HULKS ON SCRN) TO A2
MOVE @MAXHULK,A3
CMP A3,A2 ;HULKS MAXED OUT?
JRGT HULK_OUT
;SELECT RECTANGLE FROM CURRENT LIST
;GET RANDOM [Y,X] WITHIN CHOSEN RECTANGLE INTO A9
;GET DIRECTION FOR THAT RECTANGLE INTO A10
;JUMP INTO SEND_GROUP CODE
CALLA RANDOM
MOVK 7,A8
AND A8,A0
SLL 5,A0
ADDI INTOL,A0
MOVE *A0,A0,L
MOVE @ENEMY_RECT,A8,L
ADD A0,A8
MOVE *A8+,A0,W
SLL 5,A0
ADDI JLST,A0
MOVE *A0,A0,L
JUMP A0
SPAWN_SKIPR:
MOVE @SKIPR_DN,A0
JRNZ HULK_OUT
MOVE @SKIPR_CNT,A2 ;MOVE BYTE (# HULKS ON SCRN) TO A2
MOVE @MAXSKPR,A3
CMP A3,A2 ;HULKS MAXED OUT?
JRGT HULK_OUT
;SELECT RECTANGLE FROM CURRENT LIST
;GET RANDOM [Y,X] WITHIN CHOSEN RECTANGLE INTO A9
;GET DIRECTION FOR THAT RECTANGLE INTO A10
CALLA RANDOM
ANDI 03H,A0
SLL 5,A0
ADDI INTOL,A0
MOVE *A0,A0,L
MOVE @ENEMY_RECT,A8,L
ADD A0,A8
MOVE *A8+,A0,W
SLL 5,A0
ADDI JLST2,A0
MOVE *A0,A1,L
JUMP A1
INTOL .LONG 0,60H,0C0H,120H,180H,1E0H,240H,2A0H
HULK_OUT:
RETS
JLST .LONG FIXED,FLTL,FLTR,FLTT,FLTB,FIXED2,JUMPD,JUMPR
JLST2 .LONG SFIXED,FLTL,FLTR,SFLTT,FLTB,FIXED2,JUMPD,JUMPR
FLTL
FLTR
FLTB
RETS
SFLTT
CALLR POSITN
JRUC SPAWN_GROUPS
FLTT
;.WORD 3,5,150,-10,250,0 ;FLOATING IN FROM TOP
;FLOATING RECT AT TOP
CLR A11
MOVE A11,@JUMPER
CALLR POSITN
JRUC SPAWN_GROUP
.BSS BUGFIX,16
.BSS BUGFIX2,32
POSITN
MOVE *A8+,A10,W ;DIRECTION
CMPI 9,A10
JRC POT1
LOCKUP
EINT
POT1 MOVE A10,@BUGFIX,W
MOVE A8,@BUGFIX2,L
MOVE @WORLDTLX+16,A3
MOVE *A8+,A0,W
ADD A3,A0
MOVE A0,B0
MOVE *A8+,A2
MOVE *A8+,A0
ADD A3,A0
MOVE A0,B1
CALLA RANGRAND
MOVE A0,A9
MOVE A2,B0
MOVE *A8,A0
MOVE A0,B1
CALLA RANGRAND
MOVE @WORLDTLY+16,A3
ADD A3,A0
SLL 16,A0
MOVY A0,A9
;A8=CHOSEN RECTANGLE INFO
;A9=[Y,X] OF SPOT TO START FROM
;A10=DIRECTION
RETS
FIXED2
MOVK 1,A11 ;NOT LOTS OF RANGE
JRUC FIXA
JUMPR
;JUMP DOWN FROM RIGHT WALL
MOVK 3,A0 ;A0=3=JUMP DOWN FROM RGT WALL
JRUC FIXAB
JUMPD MOVK 1,A0 ;A0=1=JUMP DOWN FROM ROOF
JRUC FIXAB
FIXEDA
MOVE @HCOUNT,A0
ANDI 03H,A0
SLL 5,A0
ADDI INTOL,A0
MOVE *A0,A0,L
MOVE @ENEMY_RECT,A8,L
ADD A0,A8
MOVE *A8+,A0,W
;FIXED RECTANGLE FOR ALL AHMEDS/FNDS
CLR A11
MOVE *A8+,A10,W ;DIRECTION
MOVE *A8+,A0,W
MOVE A0,B0
MOVE *A8+,A2
MOVE *A8+,A0
MOVE A0,B1
CALLA RANGRAND
MOVE A0,A9
MOVE A2,B0
MOVE *A8,A0
MOVE A0,B1
CALLA RANGRAND
SLL 16,A0
MOVY A0,A9
;A8=CHOSEN RECTANGLE INFO
;A9=[Y,X] OF SPOT TO START FROM
;A10=DIRECTION
RETS
SFIXED
CALLR POSITN2
JRUC SPAWN_GROUPS ;SKIPPER
FIXED
;FIXED RECTANGLE
CLR A11
FIXA CLR A0
FIXAB MOVE A0,@JUMPER
CALLR POSITN2
JRUC SPAWN_GROUP
POSITN2 MOVE *A8+,A10,W ;DIRECTION
MOVE *A8+,A0,W
MOVE A0,B0
MOVE *A8+,A2
MOVE *A8+,A0
MOVE A0,B1
CALLA RANGRAND
MOVE A0,A9
MOVE A2,B0
MOVE *A8,A0
MOVE A0,B1
CALLA RANGRAND
SLL 16,A0
MOVY A0,A9
;A8=CHOSEN RECTANGLE INFO
;A9=[Y,X] OF SPOT TO START FROM
;A10=DIRECTION
RETS
SEND_GROUP:
;SEND GROUP OF HULKS FROM SPECIFIC SPOT
;A9=[Y,X] OF SPOT TO START FROM
;A10=DIRECTION
;8 1 2
;7 3
;6 5 4
MOVE @HULK_DN,A0
JRNZ ROUT
CLR A11
SPAWN_GROUP:
;@JUMPER=0 FOR NORM, 1=FROM ROOFTOP
MOVI 100,A0 ;140
CALLA RANDPER
JRC GANG
REGG ANDI 03H,A0
ADDK 1,A0
MOVE A0,A8
SG1
CREATE HULKPID,AHULK ;START ONE HULK
MOVE @HTYPE,A1
MOVE A1,*A0(HULKTYP)
DSJS A8,SG1
ROUT
RETS
SPAWN_GROUPS:
;FOR SKIPPERS
MOVI 230,A0 ;260
CALLA RANDPER
JRC SKGANG
GS1 MOVE @RAND,A0
ANDI 03H,A0
ADDK 1,A0
MOVE A0,A8
G2 CREATE HULKPID,ASKIPR
DSJS A8,G2
RETS
SKGANG:
MOVE @SKIPR_CNT,A2 ;MOVE BYTE (# HULKS ON SCRN) TO A2
CMPI 15,A2 ;18
JRNC GS1
MOVI SKIPR,A2
CALLR GET_WVADDR
MOVE *A0(16),A0 ;GET HULKS LEFT TO RELEASE THIS WAVE!
CMPI 16,A0 ;MIN HULKS BEFORE GANG
JRLT SNH1 ;RELEASE ALL OF THEM!
MOVK 5,B0 ;5 ;# OF HULKS IN A GANG
MOVK 13,B1 ;13
CALLA RANGRAND
SNH1: PUSH A0
CREATE HULKPID,GSKIPR
PULL A0
DSJ A0,SNH1
RETS
GANG:
;@JUMPER=0 FOR NORM, 1=FROM ROOFTOP
MOVE A11,A11
JRNZ REGG
;BTST FOR SEVERAL WAVES HERE!
; MOVE @WAVE,A2
; CMPI 1,A2
; JRZ REGG
MOVI HULK,A2
CALLR GET_WVADDR
MOVE *A0(16),A0 ;GET HULKS LEFT TO RELEASE THIS WAVE!
CMPI 16,A0 ;MIN HULKS BEFORE GANG
JRLT GNH1 ;RELEASE ALL OF THEM!
MOVK 7,B0 ;5 ;# OF HULKS IN A GANG
MOVK 15,B1 ;13
CALLA RANGRAND
GNH1: PUSH A0
CREATE HULKPID,GHULK
MOVE @HTYPE,A1
MOVE A1,*A0(HULKTYP)
PULL A0
DSJ A0,GNH1
RETS
GHULK:
;GHULK PUTS X # OF HULKS BEHIND SPOT IN GANG FORMATION!
;A9=[Y,X] SPOT TO SPAWN FROM
;A10=DIRECTION
CALLR SETUP_HULK
MOVE A10,*A13(DIR)
MOVK 30,A1
MOVE A1,*A13(DIS)
MOVE A10,A0
SLL 5,A0
ADDI GHXT,A0
MOVE *A0,A4,L
MOVE *A4+,A2,W
MOVE A2,B0
MOVE *A4+,A2,W
MOVE A2,B1
CALLA RANGRAND
SLL 16,A0
ADD A9,A0
MOVE A0,A1
MOVE *A4+,A2,W
MOVE A2,B0
MOVE *A4+,A2,W
MOVE A2,B1
CALLA RANGRAND
MOVX A9,A2
ADD A0,A2
SLL 16,A2
MOVE A2,A0
SLL 5,A10
ADDI GHXTF,A10
MOVE *A10,A9,L
;A0,A1 ARE SET UP
MOVE *A13(HULKTYP),A3
SLL 5,A3
ADDI HULTP,A3
MOVE *A3,A2,L
MOVI 159,A3
MOVI DMAWNZ,A4 ;NON-ZERO VALUE
MOVI CLSENMY|TYPGRW,A5
CLR A6
CLR A7
CALLA BEGINOBJ2
MOVK 1,B0 ;CLR B0
MOVK 6,B1 ;5
CALLA RANGRAND
DEC A0
MOVE A0,*A13(LEVEL)
MOVE *A13(CFLAGS),A0 ;INDICATE GANG MEMBER FOR RUN IN
ORI 012H,A0 ;10
MOVE A0,*A13(CFLAGS)
JRUC OKZ0
HULTP .LONG DUM2,BOY1,AHDETH82B,FLM6R1,ABOOB61
GHXT .LONG 0,GBTML,GBTML,GLFTL,GTOPL,GTOPL,GTOPL,GRGTL,GRGTL
GHXTF .LONG 0,GR10,GR2,GR5,GR5,GR8,GR8,GR8,GR10
DGHXTF .LONG 0,DGR10,DGR2,DGR5,DGR5,DGR8,DGR8,DGR8,DGR10
GTOPL .WORD -30,-15,-10,65 ;Y,Y,X,X
GBTML .WORD -5,50,-15,55
GLFTL .WORD -30,11,0,25
GRGTL .WORD -30,11,5,30
SKGLFTL .WORD -45,-5,0,25
SKGRGTL .WORD -45,-5,5,30
FLD1 .LONG DBAT1,gb6w5a,AHDETH82B,FLM6R1,ABOOB61 ;ADETH81B
FLD2 .LONG DHXTF,HXTF,DHXTFA,DHXTF,DHXTF
HXT .LONG 0,BTML,BTML,LFTL,TOPL,TOPL,TOPL,RGTL,RGTL
;DEMON GRUNT
HXTF .LONG 0,BTMLF,BTMLF,LFTLF,TOPLF,TOPLF,TOPLF,RGTLF,RGTLF ;AXE
;SOLDIER
DHXTF .LONG 0,DBTMLF,DBTMLF,DLFTLF,DTOPLF,DTOPLF,DTOPLF,DRGTLF,DRGTLF
;AHMED GRUNT
DHXTFA .LONG 0,DBTMLFA,DBTMLFA,DLFTLFA,DTOPLFA,DTOPLFA,DTOPLFA,DRGTLFA,DRGTLFA
;[Y],[X] OF PLACEMENT
BTML .LONG 0,0,[-15,0],[24,0],[-15,0],[48,0],[-5,0],[00,0],[-5,0],[72,0]
LFTL .LONG 0,0,[-10,0],[25,0],[14,0],[5,0],[-34,0],[5,0],[-10,0],[-5,0]
TOPL .LONG 0,0,[-20,0],[22,0],[-20,0],[44,0],[-30,0],[0,0],[-30,0],[66,0]
RGTL .LONG 0,0,[-19,0],[20,0],[-2,0],[20,0],[-36,0],[32,0],[15,0],[32,0]
;SKIPPERS
SLFTL .LONG 0,0,[-10,0],[25,0],[0,0],[5,0],[-30,0],[5,0],[-10,0],[-5,0]
SRGTL .LONG 0,0,[-19,0],[20,0],[-2,0],[20,0],[-30,0],[32,0],[0,0],[32,0]
FRMHUT .LONG 0,0,[0,0],[10,0],[0,0],[30,0],[0,0],[50,0],[0,0],[70,0]
BTMLF .LONG 0,GR10,GR10,GR2,GR2
LFTLF .LONG 0,GR2,GR5,GR2,GR5
TOPLF .LONG 0,GR5,GR5,GR5,GR5
RGTLF .LONG 0,GR10,GR8,GR10,GR8
;REGULAR GRUNT
DBTMLF .LONG 0,DGR10,DGR10,DGR2,DGR2
DLFTLF .LONG 0,DGR2,DGR5,DGR2,DGR5
DTOPLF .LONG 0,DGR5,DGR5,DGR5,DGR5
DRGTLF .LONG 0,DGR10,DGR8,DGR10,DGR8
;AHMED GRUNT
DBTMLFA .LONG 0,DGR10A,DGR10A,DGR2A,DGR2A
DLFTLFA .LONG 0,DGR2A,DGR5A,DGR2A,DGR5A
DTOPLFA .LONG 0,DGR5A,DGR5A,DGR5A,DGR5A
DRGTLFA .LONG 0,DGR10A,DGR8A,DGR10A,DGR8A
JUMPOUT
;A8=STEEL DOOR IMG
MOVE @PCNT,A1
ANDI 03H,A1
ADDK 2,A1 ;2
MOVE @HCOUNT,A0
MOVK 7,A2
AND A2,A0
JRNZ JP2
ADDK 1,A1 ;MAKE A LITTLE BIT HARDER!
JP2
MOVE A1,*A13(LEVEL),W
CALLR DO_DIFF
CLR A0
MOVE A0,*A13(BULPRC),L ;BULLET FIRING PROCESS
CALLR GETPSK
MOVE *A8(OFLAGS),A0
BTST B_FLIPH,A0
JRNZ FLFT
;FROM RIGHT TO LEFT JUMPER OUT OF PIT
MOVE *A8(OXVAL),A0,L ;POSITION GRUNT UNDER PIT
ADDI [22,0],A0
MOVE @PCNT,A1
ANDI 07H,A1
SLL 16,A1
ADD A1,A0
MOVK 7,A4
MOVI -0B800H,A11 ;12
MOVI DMAWNZ,A5 ;NON-ZERO VALUE
JRUC JALL
FLFT
;JUMP UP AND OUT FROM LEFT TO RIGHT
MOVE *A8(OXVAL),A0,L ;POSITION GRUNT UNDER PIT
ADDI [5,0],A0
MOVE @PCNT,A1
ANDI 07H,A1
SLL 16,A1
ADD A1,A0
MOVK 3,A4
MOVI 0B800H,A11 ;12
MOVI DMAWNZ|M_FLIPH,A5 ;NON-ZERO VALUE
JALL
MOVE *A8(OYVAL),A1,L
MOVE @HULK_CNT,A2
ANDI 07H,A2
SLL 16,A2
ADD A2,A1
ADDI [3,0],A1 ;6
MOVE A4,*A13(SK_DIR)
MOVE A4,*A13(DIR)
MOVE *A13(HULKTYP),A3
SLL 5,A3
ADDI FLD1,A3
MOVE *A3,A2,L ;GET IMG TO TURN ON
MOVI 30,A3 ;UNDER PIT WALLS
MOVE A5,A4
MOVI CLSENMY|TYPGRW,A5
CLR A6
CLR A7
CALLA BEGINOBJ2
;OBJECT ON, NOW JUMP HIM OUT
;READY FOR JUMP FROM RIGHT
;CHANGE VELOCITY HERE
CREATE0 DOYVP ;FOR PIT JUMPERS
MOVI JRDWNP,A9 ;DEMON
MOVI JRDWN2,A10 ;NEXT PHASE
MOVE *A13(HULKTYP),A1
SUBK 1,A1
JRZ RTAG4X
MOVI DJRDWNP,A9 ;REGULAR SOLDIER
MOVI DJRDWN2,A10 ;NEXT PHASE
RTAG4X
MOVE A11,*A8(OXVEL),L
JSRP FRANIMQ
MOVE A10,A9
;JUMP/LAND
;TURN ON COLLISIONS
MOVI CLSENMY|TYPHULK,A5 ;OR MAYBE IN JUMPING DOWN LOOP!
MOVE A5,*A8(OID)
CLR A0
MOVE A0,*A8(OYVEL),L
MOVE A0,*A8(OXVEL),L
JSRP FRANIMQ
MOVE *A13(DIR),A0
CALLR INTO
CALLR GET_RUN ;GET FIRST FRANIM PNTR FOR
MOVK 2,A3 ;5
MOVE A3,*A13(DIS) ;CHANGE BASED ON HULKS SPEED?
MOVE A3,*A13(BOXCK)
MOVE *A13(CFLAGS),A0 ;RUNNING OUT/ ANGLE OFF AFTER DIS=0
ORI 2,A0
MOVE A0,*A13(CFLAGS)
JRUC LUP_ST
;
AHULK:
;A8=1-4 FOR GRUNT # FOR THIS RELEASE
;A9=[Y,X] SPOT TO SPAWN FROM
;A10=DIRECTION
;A11=1 IF FIXED AREA FOR RELEASE
;@JUMPER=0 FOR NORM, 1=FROM ROOFTOP
;8 1 2
;7 3
;6 5 4
CALLR SETUP_HULK ;INC CNT, SET DIR, SET DEATH FLAG
MOVE A10,*A13(DIR)
;A8=1-4
;A11=0 THEN SPREAD OUT
MOVE A11,A11
JRZ DOXY
;FOR STACKING UP IN HUT
MOVE A10,A0
SLL 5,A0
MOVI FRMHUT,A4 ;ADDI HXT2,A0
JRUC DOX
DOXY MOVE A10,A0
SLL 5,A0
ADDI HXT,A0
MOVE *A0,A4,L
;BTML .LONG 0,0,[08,0],[10,0],[08,0],[30,0],[08,0],[50,0],[17,0],[20,0]
;[Y,X] OF PLACEMENT
;A4=THIS
;A8=1-4
DOX SLL 6,A8
ADD A8,A4
MOVE *A4+,A1,L ;GET Y FIRST
ADD A9,A1
SLL 16,A9
MOVE *A4,A0,L
ADD A9,A0
SLL 5,A10
;BTMLF .LONG 0,GR10,GR10,GR2,GR2
MOVE *A13(HULKTYP),A3
SLL 5,A3
MOVI FLD1,A2
ADD A3,A2
MOVE *A2,A2,L
ADDI FLD2,A3
MOVE *A3,A3,L
ADD A3,A10
RTAG3 MOVE *A10,A10,L
SRL 1,A8
ADD A8,A10
MOVE *A10,A9,L
;NEED A0=[X,0000],A1=[Y,0000]
;A0,A1 ARE SET UP
;A9=FRANIM GROW FROM SLIME
MOVI 159,A3
MOVI DMAWNZ,A4 ;NON-ZERO VALUE
MOVI CLSENMY|TYPGRW,A5
CLR A6
CLR A7
CALLA BEGINOBJ2
MOVE *A13(CFLAGS),A0 ;RUNNING OUT
ORI 2,A0
MOVE A0,*A13(CFLAGS)
OKZ0
MOVE @JUMPER,A11
JRZ NOJMP
MOVI 300,A0
MOVE A0,*A8(OZPOS)
MOVK 4,A0 ;5
MOVE A0,*A13(LEVEL)
MOVE A11,*A13(JUMPF)
CALLR SV ;STRTME
BIN
;IN HERE FOR BACKGROUND JUMPER
;IF THIS IS A JUMPER DUDE, THEN
;TURN OFF COLLISIONS
MOVE *A8(OFLAGS),A0
ORI M_NOCOLL,A0
MOVE A0,*A8(OFLAGS)
STPWLK SLEEPK 1
;RUN UNTIL TIME TO JUMP
CKXYTOP MOVE @HALT,A0
JRNZ STPWLK
CLR A1
JSRP FRANIM
JRNC CKY ;BR=NOT AT END OF SCRIPT YET
CALLR GET_RUN
CKY CMPI 1,A11
JRNZ CKXL
MOVE *A8(OYVEL),A0,L
JRNZ CKY2
MOVI 05000H,A0
MOVE A0,*A8(OYVEL),L
CKY2 MOVE *A8(OYPOS),A0
MOVE @JUMPXY,A1
CMP A0,A1
JRGT CKXYTOP
MOVK 1,A0
MOVE A0,*A13(HAGE)
;READY FOR JUMP DOWN
;CHANGE VELOCITY HERE
CREATE0 DOYV1
MOVI JDWN,A9 ;AXE GRUNT
MOVI JDWN2,A10 ;NEXT PHASE
MOVE *A13(HULKTYP),A1
SUBK 1,A1
JRZ RTAG6
MOVI DJDWN,A9 ;SOLDIER GRUNT
MOVI DJDWN2,A10 ;NEXT PHASE
RTAG6
JSRP FRANIMQ
MOVE A10,A9
; MOVI JDWN2,A9
JINOUT
;JUMP/LAND
;TURN ON COLLISIONS
MOVE *A8(OFLAGS),A0
ANDI 0F7FFH,A0
MOVE A0,*A8(OFLAGS)
MOVI CLSENMY|TYPHULK,A5
MOVE A5,*A8(OID)
MOVI 159,A0
MOVE A0,*A8(OZPOS)
CLR A0
MOVE A0,*A8(OYVEL),L
MOVE A0,*A8(OXVEL),L
JSRP FRANIMQ
SLEEPK 10
MOVE *A13(DIR),A0
CALLR INTO
CALLR GET_RUN ;GET FIRST FRANIM PNTR FOR
MOVK 20,A3
MOVE A3,*A13(DIS) ;CHANGE BASED ON HULKS SPEED?
JRUC LUP_ST
CKXL
; CMPI 3,A11
; JRNZ CKXR
MOVE *A8(OXPOS),A0
MOVE @JUMPXY2,A1
CMP A0,A1
JRLT CKXYTOP
;READY FOR JUMP FROM RIGHT
;CHANGE VELOCITY HERE
CREATE0 DOYV
MOVI JRDWN,A9 ;DEMON
MOVI JRDWN2,A10 ;NEXT PHASE
MOVE *A13(HULKTYP),A1
SUBK 1,A1
JRZ RTAG4
; CREATE0 MYSHAD
MOVI DJRDWN,A9 ;REGULAR SOLDIER
MOVI DJRDWN2,A10 ;NEXT PHASE
RTAG4
MOVI -8800H,A0 ;12
MOVE A0,*A8(OXVEL),L
JSRP FRANIMQ
MOVE A10,A9
JRUC JINOUT
;CKXR LOCKUP
SV
MOVE *A13(HULKTYP),A1
SLL 5,A1
ADDI HPAL,A1
MOVE *A1,A0,L
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
OKVA
CALLR DO_DIFF
MOVE *A13(DIR),A0
MOVE A0,*A13(BOXCK)
CALLR INTO
JRUC GET_RUN ;CALLR GET_RUN ;GET FIRST FRANIM PNTR FOR
HPAL .LONG DGP2,GRNTB,AHMEDP,DGP2,BOOBP
NOJMP
;CHANGE PAL IF NEEDED
MOVE *A13(LEVEL),A0
CMPI 4,A0 ;4
JRLT OKVX
MOVE *A13(HULKTYP),A1
SLL 5,A1
ADDI HPAL,A1
MOVE *A1,A0,L
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
OKVX
;GROW UP OUT OF SLIME
JSRP FRANIMQ
MOVI CLSENMY|TYPHULK,A5
MOVE A5,*A8(OID)
;THEN START WITH A VELOCITY!
CALLR OKVA
MOVI 38,A3 ;38
MOVE A3,*A13(DIS) ;CHANGE BASED ON HULKS SPEED?
MOVE *A8(OYPOS),A0
MOVE @WORLDTLY,A1,L
SRL 16,A1
ADDI 285,A1 ;275
CMP A0,A1
JRGT LUP_ST
;THIS HULK STARTING LOWER THAN BOTTOM OF SCRN!
;RESET ITS Y LINE
MOVE A1,*A8(OYPOS)
LUP_ST: MOVK 2,B0
MOVI 12,B1
CALLA RANGRAND
MOVE A0,*A13(STCNT)
;
; LOOP TOP FOR HULKS
;
LUP_TOP:
;TOP OF HULK LOGIC
MOVE @HALT,A0
JRZ CONT0 ;IF HALT ON, LOOP BACK TO TOP
SLEEPK 3
JRUC LUP_TOP
CONT0
;
; DO HULK MOVEMENT LOGIC A8=CURRENT OBJECT POINTER (HULK IMAGE)
;
;FIRST, DO AGE/LEVEL UPDATE
MOVE *A13(HAGE),A0
ANDI 03FFH,A0
DEC A0
MOVE A0,*A13(HAGE)
JRNZ NONEW
MOVE *A13(LEVEL),A0
CMPI MAXLEVEL,A0
JREQ NONEW
INC A0
MOVE A0,*A13(LEVEL)
CALLR DO_DIFF
MOVE *A13(KPAGE),A0
MOVE A0,*A13(HAGE)
MOVE *A8(OPLINK),A0,L
CMP A0,A13
JRZ NONEW
;GRUNT WITHOUT AN OBJECT?
.IF DEBUG
LOCKUP
EINT
.ENDIF
DIE
; MOVI CLSENMY|TYPHULK,A5 ;1/7/92
; MOVE A5,*A8(OID)
NONEW
MOVE *A13(CFLAGS),A0
BTST 1,A0
JRNZ NOPROB ;IF JUST RUNNING IN, DON'T CHECK WALLS
MOVE @EN_CURRENT,A0,L ;CURRENT RECT LIST
JRZ NOPROB
CALLR CK_RECT
JRNC NOPROB
;THIS GRUNT IS STUCK BNCING BETWEEN WALLS!
;KILL ME!
MOVK 1,A11
JRUC HULK_EXP ;BMPDI
NOPROB MOVI SETUP_DIR,A10 ;ROUTINE TO CALL
CALLR CK_SPIN
MOVE A0,A0
JRZ NOTSPIN
CALLA PRCSLP
JRUC LUP_TOP
NOTSPIN
MOVE *A13(DIS),A0 ;UPDATE DISTANCE COUNT
DEC A0
MOVE A0,*A13(DIS) ;STUFF NEW COUNT
JRNZ DOHULK ;BR=CONTINUE CURRENT DIRECTION
MOVE A0,*A13(BNCING)
MOVE *A13(CFLAGS),A0
BTST 4,A0
JRZ NGNG ;BR=NOT A GANG MEMBER
MOVE *A13(CFLAGS),A0
ANDI 0FFEDH,A0 ;I AM A GANG MEMBER ;FFEF
MOVE A0,*A13(CFLAGS)
JRUC T3
NGNG MOVE *A13(CFLAGS),A0
BTST 1,A0
JRZ T3
;THIS HULK JUST RUNNING IN! GIVE THIS ONE A BOGUS SEEK DIR
;IF WITHIN WALLS THEN CONT, OTHERWISE RESET DIS CNTR
MOVE *A13(DIR),A3
SLL 5,A3
ADDI NEWANG,A3
MOVK 1,B0
MOVK 4,B1
CALLA RANGRAND
MOVE *A3,A3,L
DEC A0
SLL 4,A0
ADD A0,A3
MOVE *A3,A0 ;NEW SEEK DIR
MOVE A0,*A13(SK_DIR)
CALLR INTO
JRUC T4
;8 1 2
;7 3
;6 5 4
NEWANGA:
.LONG 0,ANG1A,ANG1A,ANG3A,ANG5A,ANG5A,ANG7A,ANG7A,ANG1A
NEWANG: .LONG 0,ANG1,ANG1,ANG3,ANG5,ANG5,ANG7,ANG7,ANG1
ANG5: .WORD 7,6,4,3
ANG1: .WORD 7,3,8,2
ANG3: .WORD 1,5,2,4
ANG7: .WORD 8,6,1,5
;
ANG5A: .WORD 7,3,5,3
ANG1A: .WORD 7,3,1,7
ANG3A: .WORD 1,5,5,3
ANG7A: .WORD 1,5,1,7
;
;NOW POINT THIS HULK AT CURRENT POSITION OF PLAYER
T3: MOVE *A13(BNCING),A0
JRNZ DOHULK
MOVE *A13(SK_DIR),A7,W
;IF NEW SEEK IS <> OLD SEEK, THEN SET STAND FLAG
CALLR GET_DIS
CALLR SETUP_DIR
MOVE *A13(SK_DIR),A0
CMP A0,A7 ;NEW CMP OLD SEEK
JREQ DOHULK
MOVE *A13(HULKTYP),A0
JRNZ T4
;MAYBE SHOOT AT PLAYER!
MOVE *A13(STCNT),A0
JRZ T4
DEC A0
MOVE A0,*A13(STCNT)
JRNZ T4
;SHOOT AT PLAYER
MOVK 2,B0
MOVI 12,B1
CALLA RANGRAND
MOVE A0,*A13(STCNT)
;DOSHOOT
;A9=PLAYER 1 OR 2
;THIS HULK IS ABOUT TO SHOOT
;START HULK SHOTS
* ISOBJ - IS AN OBJECT ON THE OBJECT LIST? *
* A0 = PTR TO OBJECT *
* RETURNS: *
* Z BIT SET = NO OBJECT, A0 = 0 *
* Z BIT CLR = NO OBJECT, A0 = PTR TO OBJECT *
MOVE A8,A0
CALLA ISOBJ ;FIX BUG!
JRZ HDI
CLR A1
MOVE A1,*A8(OXVEL),L
MOVE A1,*A8(OYVEL),L
MOVE @HULK_CNT,A9
MOVE @PCNT,A11
sll 32-2,a11
srl 32-2,a11
INC A11 ;A11=FRANIM LIST CNT
MOVE A11,*A13(IBAT)
sll 32-1,a9
srl 32-1-5,a9 ;*32
; ANDI 01H,A9
; SLL 5,A9
MOVI PLYROBJS,A2
ADD A9,A2
MOVE *A2,A0,L
JRNZ DOS1
XORI 32,A9
MOVI PLYROBJS,A2
ADD A9,A2
MOVE *A2,A0,L
DOS1 MOVE *A0(OYPOS),A2 ;A2=Y OF PLYR I HIT
MOVE *A0(OXPOS),A1 ;A1=X
MOVE *A8(OYPOS),A3 ;A3=THIS HULKS' Y
MOVE *A8(OXPOS),A4 ;A4=THIS HULKS' X
CMP A3,A2
JRC XSUP ;BR=BAT UPWARD
CMP A4,A1
JRC XB8O ;BR=8 O'CLOCK SWING NEEDED
;4 O'CLOCK
MOVI SHOOT4O,A9 ;SOLDIER
CLR A10
JRUC GUNFIRE
XB8O
;8
MOVI SHOOT8O,A9
MOVK 1,A10
JRUC GUNFIRE
XSUP CMP A4,A1
JRC XB10O
;2 O'CLOCK
MOVI SHOOT2O,A9
MOVK 2,A10
JRUC GUNFIRE
XB10O
MOVI SHOOT10O,A9
MOVK 3,A10
GUNFIRE
CREATE FLMPID,ABULLET ;HULKPID
MOVE A0,*A13(BULPRC),L ;KEEP BULLET FIRING PROCESS
SLL 5,A10 ;DISPLAY INITIAL SHOOTING FRAME
MOVI GFA,A0
ADD A10,A0
MOVE *A0,A1,L
ADDI GFF,A10
MOVE *A10,A4,L
CALLA ANI
SLEEPK 30
MOVE A9,A10
GF JSRP FRANIMQ
MOVE A10,A9
DSJS A11,GF
SLEEPK 30
JRUC BATDN
ABULLET
;A11=# OF BULLETS TO SHOOT/2
;A10=0=4,1=8,2=2,3=10 = DIRECTIONS
SLEEPK 30
SLL 1,A11
ABU CREATE FLMPID,BULL2 ;HULKPID
SLEEPK 8
DSJS A11,ABU
MOVE *A8(OPLINK),A0,L
MOVE A11,*A0(BULPRC),L
HDI DIE
GFA .LONG DSWINGa,DSWINGa,DBATa,DBATa
GFF .LONG DMAWNZ|M_FLIPH,DMAWNZ,DMAWNZ|M_FLIPH,DMAWNZ
;A10=0=4,1=8,2=2,3=10 = DIRECTIONS
;BLIMG .LONG GNTBUL8,GNTBUL8,GNTBUL10,GNTBUL10
;BLIMG .LONG GNTBUL8,GNTBUL8,GNTBUL10,GNTBUL10
;BLFLP .LONG DMAWNZ|M_FLIPH,DMAWNZ,DMAWNZ|M_FLIPH,DMAWNZ
XVL .LONG 018000H,-18000H,018000H,-18000H
YVL .LONG 0C000H,0C000H,-18000H,-18000H
XOFSET .LONG [16H,0],[0,0],[1BH,0],[-2,0]
YOFSET .LONG [15H,0],[16H,0],[-2,0],[-2,0]
BULL2
SLL 5,A10
MOVI GFF,A3
ADD A10,A3
MOVE *A3,A4,W ;MAYBE LONG
MOVI XVL,A3
ADD A10,A3
MOVE *A3,A6,L
MOVI YVL,A3
ADD A10,A3
MOVE *A3,A7,L
MOVE *A8(OXVAL),A0,L
MOVE *A8(OYVAL),A1,L
MOVI XOFSET,A3
MOVI YOFSET,A5
ADD A10,A3
MOVE *A3,A3,L
ADD A3,A0
ADD A10,A5
MOVE *A5,A3,L
ADD A3,A1
MOVI CNNBLL2,A2
MOVI CLSENMY|TYPGOO,A5 ;ENMY|TYPSHOT,A5
MOVI 160,A3 ;133
CALLA BEGINOBJ2
MOVI GRNTSHT,A0
CALLA ONESND
MOVI BURST,A10
JAUC START_PJ2
T4: MOVE *A13(CFLAGS),A0 ;SAYS I AM SPINNING
ORI 01H,A0
MOVE A0,*A13(CFLAGS),W
MOVK 2,A0
MOVE A0,*A13(OSCILLATE)
SLEEPK 3
JRUC LUP_TOP
DOHULK:
CLR A1
JSRP FRANIM
JRNC CHECK_NEXT ;BR=NOT AT END OF SCRIPT YET
CALLR GET_RUN
CHECK_NEXT:
JRUC LUP_TOP
DOBAT:
;A9=PLAYER 1 OR 2
;THIS HULK IS BATTING
;START BAT SWING
MOVE *A13(DIR),A0
CMPI 1,A0
JRNZ DBC
;HULK WAS GOING UP, CHEAT HIM UP A LITTLE CLOSER TO PLAYER
MOVE *A8(OYPOS),A0
SUBK 5,A0
MOVE A0,*A8(OYPOS)
DBC CALLA PHASE1
JRC SUP ;BR=BAT UPWARD
CMP A4,A1
JRC B8O ;BR=8 O'CLOCK SWING NEEDED
;4 O'CLOCK
MOVE *A13(HULKTYP),A0
SLL 5,A0
ADDI ABAT,A0
MOVE *A0,A9,L
JRUC DOBT
ABAT .LONG BAT4OS,BAT4O,BAT4OA,BAT4OF,BBHIT
BBAT .LONG BAT8OS,BAT8O,BAT8OA,BAT8OF,BBHIT
CBAT .LONG BAT2OS,BAT2O,BAT2OA,BAT2OF,BBHIT
DBAT .LONG BAT10OS,BAT10O,BAT10OA,BAT10OF,BBHIT
B8O
;8
MOVE *A13(HULKTYP),A0
SLL 5,A0
ADDI BBAT,A0
MOVE *A0,A9,L
JRUC DOBT
SUP CMP A4,A1
JRC B10O
;2 O'CLOCK
MOVE *A13(HULKTYP),A0
SLL 5,A0
ADDI CBAT,A0
MOVE *A0,A9,L
JRUC DOBT
B10O
MOVE *A13(HULKTYP),A0
SLL 5,A0
ADDI DBAT,A0
MOVE *A0,A9,L
DOBT MOVE A9,A10
JSRP FRANIMQ
MOVE A10,A9
JSRP FRANIMQ
BATDN CLR A0
MOVE A0,*A13(IBAT)
MOVK 1,A0
MOVE A0,*A13(DIS)
MOVE A0,*A13(CFLAGS)
MOVI ZEROS,A9
JRUC LUP_TOP
;
ZEROS .LONG 0,0
GET_WVADDR:
;A2=ENEMY TYPE LOOKING FOR
;IE.HULK,TANK
;PROBLEM WITH DUPLICATES!
MOVI WAVE_RAM,A0
HU1: MOVE *A0,A1,W ;TYPE
CMP A2,A1
JREQ YSID
ADDI 6*16,A0
CMPI WAVE_RAM+6*16*9,A0
JRLE HU1
MOVI WAVE_RAM+6*16*9,A0
YSID: RETS
DO_DIFF:
MOVI HSPEED,A1
DO_DIFF2:
MOVE *A13(LEVEL),A0
JRNN Z0
MOVK 4,A0
MOVE A0,*A13(LEVEL)
Z0 JRZ Z1
ADDI 02000H,A1
DEC A0
JRUC Z0
Z1 MOVE A1,*A13(HSPD),L
MOVE A1,A5
SUBI 01000H,A5
MOVE A5,*A13(VSPD),L
MOVK 10,A3
DIVU A3,A1 ;DIVIDE A1 BY 10
MOVK 8,A4
MPYU A4,A1 ;A1 * .8
MOVE A1,*A13(H2SPD),L
DIVU A3,A5
MPYU A4,A5
MOVE A5,*A13(V2SPD),L
RETS
LEVTBL:
.WORD 11,10,9,8,7,7,6,6,5,5,4,4,3,3,3,3
AGTBL: .WORD 160,300,180,220,280,420,500,100,140,250,90,160
;
GET_DIS:
MOVK 1,B0
MOVE *A13(LEVEL),A0
SLL 4,A0
ADDI LEVTBL,A0
MOVE *A0,A2
MOVE A2,B1
CALLA RANGRAND
MOVE A0,*A13(DIS) ;TIME BEFORE WE GET NEW VELOCITIES
RETS
WAY:
;A1=SEEK DIR
;A0=DIR IMAGE IS FACING NOW
SUB A0,A1
MOVE A1,A2
ABS A1
CMPI 5,A1
JRLT N0
NEG A2
N0: BTST 31,A2
JRZ IC
DEC A0
JRP T1
MOVK 8,A0
JRUC T1
IC: INC A0 ;ROTATE TOWARD PLAYER
CMPI 9,A0
JRNE T1
MOVK 1,A0
T1: MOVE A0,*A13(DIR),W
;ANI ONTO SCREEN THIS HULKS STANDING POSITION
MOVE *A13(DIR),A0 ;CURRENT DIR HULK IS FACING
DEC A0
MOVE A0,A2
SLL 5,A0
MOVE *A13(HULKTYP),A4
SLL 5,A4
ADDI HSTND,A4
MOVE *A4,A4,L
ADD A4,A0
MOVE *A0,A1,L ;NEW OIMG
SLL 4,A2
ADDI SPINFLGS,A2
MOVE *A2,A4,W ;NEW OFLAGS
JAUC ANI ;CALLA ANI
; RETS
;SWAPSK
;;SEEK ANOTHER PLAYER ROUTINE
;;A10=0 OR 1 FOR WHICH PLAYER DIED
; CLR A1
; NOT A1
; MOVI HULKPID,A0
; CALLA EXISTP
; JRZ OUTZ
;;FOUND HULK
; MOVE *A0(SKPLYR),A1
; CMP A1,A10
; JRZ YES
; MOVI TP2PID,A1
; MOVE A1,*A0(PROCID),W
; JRUC SWAPSK
;
;YES MOVI TEMPPID,A1
; MOVI SWAPIT,A7
; CALLA GETA8
; CALLA GETA9
; CALLA XFERPROC
; JRUC SWAPSK
;OUTZ
; CLR A1
; NOT A1
; MOVI TP2PID,A0
; CALLA EXISTP
; JRZ OUTB
;;FOUND TEMP HULK
; MOVI HULKPID,A1
; MOVE A1,*A0(PROCID),W
; JRUC OUTZ
;OUTB RETS
;
;SWAPIT
;;HULKS FALL INTO HERE IF PLAYER THEY WERE SEEKING HAS DIED. THEY WILL
;;NOW SEEK OTHER PLAYER
; MOVI HULKPID,A0
; MOVE A0,*A13(PROCID),W
;
; MOVE *A13(SKPLYR),A2
; XORI 1,A2
; MOVE A2,A1
; SLL 5,A1
; ADDI PLYROBJS,A1
; MOVE *A1,A1,L
; JRZ ZCT ;BR=OTHER PLAYER DOES NOT EXIST!
; MOVE A2,*A13(SKPLYR)
;ZCT
; SLEEPK 1
; JAUC LUP_TOP
SETUP_DIRA:
MOVE *A13(GOCRNR),A0,L ;[Y,X]
JRZ SETUP_DIR
;THIS AHMED WILL SEEK TO A CORNER BEFORE SEEKING PLAYER
;NEED 32 BIT Y/X [Y,X] IN A0
JRUC DOGET
SETUP_DIR:
;GET NEW VELOCITIES AND SEEK DIR FOR THIS HULK
;SET SEEK DIR FOR THIS HULK
;MAKE SURE THIS LEG_PTR HAS A VALID VALUE! THE PLAYER MUST BE INITIALIZED!
;DETERMINE WHICH OF TWO PLAYERS THIS HULK IS SEEKING!
;NORMAL
MOVE *A13(SKPLYR),A2
MOVE A2,A1
SLL 5,A1
ADDI PLYROBJS,A1
MOVE *A1,A1,L
JRNZ ZCV
;PLAYER NO LONGER EXISTS! GET OTHER
WIT
CMPI 3,A2
JRLT WIT2
;OH OH! BOTH ARE DEAD
; MOVI >111,A0
; MOVE A0,@EHALT
RETS
WIT2 XORI 1,A2
MOVE A2,*A13(SKPLYR)
SLL 5,A2
ADDI PLYROBJS,A2
MOVE *A2,A1,L
ZCV
MOVE *A1(OXPOS),A0,W
JRZ WIT
MOVE *A1(OYPOS),A2,W
SLL 16,A2
MOVY A2,A0
DOGET CALLA GETXY ;A8 TO SEEK A0
INC A0
MOVE A0,*A13(SK_DIR) ;DIR WE WANT TO BE FACING!
;
;NEEDED FOR WHEN BOTH PLAYERS ARE DEAD
;
MOVE @EHALT,A1 ;IN CASE HULKS MOVE SLIGHTLY
JRNE NRM
;FALLS INTO THIS
INTO:
;A0=DIR FROM 1-8
MOVK 0FH,A2
AND A2,A0
SLL 5,A0
ADDI JTBL,A0
MOVE *A0,A2,L
JUMP A2
JTBL .LONG IN1,IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8
.LONG IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8
.LONG IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8
;INTO16:
;;A0=DIR FROM 1-16
; SLL 5,A0
; ADDI JTBL16,A0
; MOVE *A0,A0,L
; JUMP A0
;
;JTBL16 .LONG LK,IN1,LK,IN2,LK,IN3,LK,IN4,LK,IN5,LK,IN6,LK,IN7,LK,IN8,LK
; 01
; 16 02
; 15 03
; 14 04
; 13 05
; 12 06
; 11 07
; 10 08
; 09
;
INTO12:
;A0=DIR FROM 1-12
SLL 5,A0
ADDI JTBL12,A0
MOVE *A0,A3,L
JUMP A3
JTBL12 .LONG LK,IN1,LK,LK,IN3,LK,LK,IN5,LK,LK,IN7,LK,LK
; 1
; 12 2
; 11 3
; 10 4
; 9 5
; 8 6
; 7
LK
; LOCKUP
IN1
;IS 0 DIR
MOVE *A13(VSPD),A0,L
NEG A0
CLR A1
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
NRM RETS
IN2
MOVE *A13(V2SPD),A0,L
NEG A0
MOVE *A13(H2SPD),A1,L
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
IN3
CLR A0
MOVE *A13(HSPD),A1,L
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
IN4
MOVE *A13(V2SPD),A0,L
MOVE *A13(H2SPD),A1,L
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
IN5
MOVE *A13(VSPD),A0,L
CLR A1
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
IN6
MOVE *A13(V2SPD),A0,L
MOVE *A13(H2SPD),A1,L
NEG A1
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
IN7
CLR A0
MOVE *A13(HSPD),A1,L
NEG A1
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
IN8
MOVE *A13(H2SPD),A1,L
NEG A1
MOVE *A13(V2SPD),A0,L
NEG A0
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
SETUP_HULK:
;A10=DIRECTION
;8 1 2
;7 3
;6 5 4
MOVE A10,*A13(SK_DIR)
CLR A0
MOVE A0,*A13(BULPRC),L ;BULLET FIRING PROCESS
CALLR GETPSK
MOVI HULK,A2
CALLR GET_WVADDR
MOVE *A0(32),A1,W ;GET DIFFICULTY LEVEL
MOVE A1,*A13(LEVEL),W
MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS HULK
DEC A1
MOVE A1,*A0(16),W
JRNZ BZ
;END OF THIS WAVES HULK CNT
MOVK 1,A1
MOVE A1,@HULK_DN
MOVE @WAVE,A0
CMPI 39,A0
JRZ PART2
CMPI 41,A0
JRZ ABOS
CMPI 38,A0
JRZ GOUNDR
CMPI 29,A0
JRZ GOAGN
CMPI 22,A0
JRZ GB
CMPI 21,A0
JRZ GB
CMPI 9,A0
JRZ GB2
CMPI 19,A0
JRZ AWARP
CMPI 16,A0
JRZ TRY_RCK
CMPI 13,A0
JRZ TAUNT
CMPI 14,A0
JRZ SCRLAGN
CMPI 20,A0
JRZ BRING60
CMPI 3,A0
JRNZ NXC
CREATE FUTUREPID,ENDWV
RETS
GOUNDR
CREATE0 DOGUN
RETS
PART2
CREATE0 PART2A
RETS
PART2A
;PART 2 OF LAST LOCKDOWN WAVE
;AHMEDS STILL ALIVE?
SLEEPK 30
MOVI AHMDPID,A0
CLR A1
NOT A1
CALLA EXISTP
JRNZ PART2A
MOVI 41,A0
CALLA DOLORD
movi youwillsnd,a0
calla ONESND
DIE
youwillsnd .word >f9f7,32,>8153,0 ;YOU WILL FRY
ABOS CREATE0 DO_WINNER
MOVI LORDPID,A0
CALLA KIL1C
move a8,a2
clr a8
CREATE BOSSPID,aboss
move a2,a8
RETS
DOGUN
;TURN ON ELECTRIC BOLTS
CREATE0 DO_WINNER
SLEEP 200
CREATE FUTUREPID,BOLTS
MOVI LORDPID,A0
CALLA KIL1C
MOVK 1,A9 ;A9=0 FOR UP, 1 FOR RGT
CREATE ARWPID,ONARRW ;TURN ON UP ARROW
CREATE FUTUREPID,AOF ;ARROW OFF AFTER A TIME
CREATE0 ATME
MOVE @WORLDTLX+16,A8
ADDK 5,A8 ;A8=X TARGET LINE TO TRIGGER SCROLL
CLR A9 ;A9=0 MEANS NOT CHECKING FOR Y TARGET
MOVI PATHUND,A10 ;INDICATES NEW SCROLL WITH SCRL TABLE
MOVI 08000H,A0
MOVE A0,@HZSPD,L
CREATE TARGPID,TARGET
MOVE @WORLDTLX+16,A9
ADDI 60,A9
FIXR1 SLEEPK 10
MOVE @WORLDTLX+16,A0
CMP A0,A9
jrnc FIXR1
MOVK 1,A0 ;FROM LEFT OF SCRN
MOVE A0,@RUNIN
DIE
PATHUND ;DIR,CNT
.WORD 9,2*60,3,0550H*2,0
AWARP
;CREATE A INSTANT WARP DISC
;START SCROLL INTO AIRPORT
CREATE0 DLYWRP
RETS
DLYWRP SLEEP 120
CREATE0 DO_WINNER
SLEEP 90
CREATE WARPPID,INST_WARP
MOVI 08000H,A0
MOVE A0,@HZSPD,L
CLR A0
MOVE A0,@CRSRAM,L
MOVI PATHAIR,A10 ;INDICATES NEW SCROLL WITH SCRL TABLE
MOVE @WORLDTLX,A8,L
SRL 16,A8
ADDI 250,A8 ;A8=0 MEANS NOT CHECKING FOR X TARGET
CLR A9
CREATE TARGPID,TARGET ;A9=Y TARGET LINE TO TRIGGER SCROLL
MOVK 1,A9 ;A9=0 FOR UP, 1 FOR RGT
CREATE ARWPID,ONARRW ;TURN ON UP ARROW
CREATE FUTUREPID,AOF ;ARROW OFF AFTER A TIME
CALLA CLNPAL
DIE
PATHAIR
.WORD 3,3D0H,15,1,2,700H,16,1,1,0F8H/2,3,320H/2
.WORD 17,1,1,504H/2,19,1,0
GOAGN
;START SCROLL INTO END OF AIRPORT
CREATE0 DLYGO
RETS
DLYGO SLEEP 120
CREATE0 DO_WINNER
SLEEP 90
MOVK 13,A0 ;10
MOVE A0,@CTOTAL
MOVK 30,A0
MOVE A0,@WAVE
MOVI LORDPID,A0
CALLA KIL1C
;NEW RECTANGLES HERE?
CLR A0
MOVE A0,@CRSRAM,L
MOVI PATHEND,A10 ;INDICATES NEW SCROLL WITH SCRL TABLE
MOVE @WORLDTLX,A8,L
SRL 16,A8
ADDI 200,A8 ;A8=0 MEANS NOT CHECKING FOR X TARGET
CLR A9
CREATE TARGPID,TARGET ;A9=Y TARGET LINE TO TRIGGER SCROLL
MOVK 1,A9 ;A9=0 FOR UP, 1 FOR RGT
CREATE ARWPID,ONARRW ;TURN ON UP ARROW
CREATE FUTUREPID,AOF ;ARROW OFF AFTER A TIME
DIE
PATHEND .WORD 3,362H/2,1,290/2,0
SHSTG
;SEND GROUP OF HOSTAGES DOWN AT PLAYER FROM ELEVATOR IN LOCKDOWN
MOVK 5,A8
CREATE0 LHLPS
XSEND1
SLEEPK >1f
MOVE @WORLDTLY,A0,L
SUBI [34H,0],A0
MOVE @WORLDTLX,A9,L
SRL 16,A9
ADDI 162,A9
MOVY A0,A9
CALLR SENDH_GROUP
DSJ A8,XSEND1
DIE
GB2
CREATE0 SLOWBK
RETS
SLOWBK SLEEP 18*60
;GO BACK FROM WARP LOCKDOWN #2
SLW1 SLEEP 120
movi CLSNEUT+TYPICON+SUBBOMBSN,a0
CLR A1
NOT A1
CALLA EXISTOBJ
*Z BIT SET = NO OBJECT, A0 = 0*
JRNZ SLW1
MOVK 10,A0
CALLR CHKFREE
JRNE SLW1
CREATE WARPPID,GOBACK
;SEND OUT CHASER!
MOVK 1,A0
MOVE A0,@ICONS_DN
DIE
GB
;GO BACK FROM WARP LOCKDOWN #2
CREATE WARPPID,GOBACK
;SEND OUT CHASER!
MOVK 1,A0
MOVE A0,@ICONS_DN
RETS
TRY_RCK
CREATE0 DOWIN
RETS
DOWIN
MOVE @STATUS,A0
CMPI 3,A0
JRNZ DW1
CREATE0 DO_WINNER
SLEEP 80
DW1 SLEEPK 10
MOVK 1,A10 ;FIRST RACKUP
CREATE0 WAITTNT
DIE
TAUNT
PUSH A10
CLR A10 ;0=FIRST TAUNT
CREATE0 WAITTNT
PULL A10
RETS
SCRLAGN
;START SCROLLING UP INTO DESERT AGAIN
CREATE0 DOAGN
RETS
BRING60
;WARP LOCKDOWN 1
;BRING OUT A BTR60
CREATE FUTUREPID,BTR60A
CREATE FUTUREPID,GBK
RETS
GBK SLEEP 6*60
GBK2 SLEEP 60
MOVK 10,A0
CALLR CHKFREE
JRNE GBK2
CREATE WARPPID,GOBACK
DIE
NXC CMPI 4,A0
JRNZ NXW
CREATE0 DOWINX
RETS
*
*CHECK FOR A0 FREE PROCESSES
*RET EQ IF THEY ARE FREE, NE IF FAIL
CHKFREE
MMTM SP,A0
MOVI OFREE,A1,L
CHKFREL
MOVE *A1,A1,L
JREQ CHKFREX
DSJS A0,CHKFREL
CHKFREX
MOVE A0,A0
MMFM SP,A0
RETS
DOWINX
;WHEN WAVE IS FINISHED, CREATE A PROC TO BLINK ELEVATOR MESSAGE!
CREATE0 DO_WINNER
SLEEP 60
CREATE DROPPID,TAKEEL
DIE
NXW CMPI 5,A0
JRNZ BZ
CREATE FUTUREPID,CKFORY
BZ RETS
CKFORY SLEEP 60
MOVE @WORLDTLY,A0,L
CMPI [679H,0],A0
JRGT CKFORY
;MIDDLE OF SECRET PATH! START NEW WAVE
MOVI 0140H,A0 ;FOR JUMPING DOWN HORIZONTALLY
MOVE A0,@JUMPXY2
MOVK 6,A0
CALLA DOLORD
MOVI ERECT6,A0
MOVE A0,@ENEMY_RECT,L ;FOR SPAWNING
DIE
GET_RUN:
;GET FRANIM BASE ADDRESS FOR THIS HULKS DIRECTION
;
MOVE *A13(DIR),A4
DEC A4
MOVK 7,A0
AND A0,A4
SLL 5,A4 ;*32 FOR LONG WORD LOOKUP TABLE
MOVE *A13(HULKTYP),A0
MOVK 7,A1
AND A1,A0
SLL 5,A0
ADDI HLISTS,A0
MOVE *A0,A5,L
JUMP A5
HLISTS .LONG NORM,NORM1,NORM2,NORM3,NORM4
.LONG NORM,NORM1,NORM2,NORM3,NORM4
;AKHBOOB GRUNT
NORM4 MOVI BOOB_DN,A9
RETS
;FLAMING GRUNT
NORM3
MOVE *A13(LEVEL),A0
CMPI 2,A0 ;3
JRLT SLOBF
CMPI 5,A0 ;6
JRLT MEDBF
ADDI WALK_LISTFBF,A4
JRUC SPO
MEDBF ADDI WALK_LISTMBF,A4
JRUC SPO
SLOBF ADDI WALK_LISTBF,A4 ;CALCULATE OFFSET IN TABLE
JRUC SPO
;FLAME THROWER CARRYING AHMED GRUNT
NORM2
MOVE *A13(LEVEL),A0
CMPI 2,A0 ;3
JRLT SLOB
CMPI 5,A0 ;6
JRLT MEDB
ADDI WALK_LISTFB,A4
JRUC SPO
MEDB ADDI WALK_LISTMB,A4
JRUC SPO
SLOB ADDI WALK_LISTB,A4 ;CALCULATE OFFSET IN TABLE
JRUC SPO
;AXE CARRYING DEMON GRUNT
NORM1
MOVE *A13(LEVEL),A0
CMPI 2,A0 ;3
JRLT SLOA
CMPI 5,A0 ;6
JRLT MEDA
ADDI WALK_LISTFA,A4
JRUC SPO
MEDA ADDI WALK_LISTMA,A4
JRUC SPO
SLOA ADDI WALK_LISTA,A4 ;CALCULATE OFFSET IN TABLE
JRUC SPO
;REGULAR SOLDIER GRUNT
NORM MOVE *A13(LEVEL),A0
CMPI 2,A0 ;3
JRLT SLO
CMPI 5,A0 ;6
JRLT MED
ADDI WALK_LISTF,A4
JRUC SPO
MED ADDI WALK_LISTM,A4
JRUC SPO
SLO ADDI WALK_LIST,A4 ;CALCULATE OFFSET IN TABLE
SPO MOVE *A4,A9,L ;MOVE TABLE VALUE INTO A9
;NEW ANIMATION SCRIPT
MOVE *A13(CFLAGS),A0
ANDI 0FFFEH,A0 ;
MOVE A0,*A13(CFLAGS) ;ZERO STANDING FLAG
RETS
HSTND .LONG SPINFRMS2,SPINFRMS,SPINFRMSA,SPINF,SPINF
**************************************************************************
GETXY:
* gets direction from Obj in A8 to Z:X coors in A0, where dir
* is expressed as
* 7 0 1
* 6 * 2
* 5 4 3
* The direction is returned in A0
mmtm SP,A2,A3,A4,A5
movy A0,A3
srl 16,A3
movx A0,A2
zext A2,W
calla GETANIX ;A0 - MBIG X
sub A0,A2 ;A2 = XDELTA
; SHOULD BE ANIMATION Y COOR!
move *A8(OYPOS),A0,W
sub A0,A3 ;A3 = ZDELTA
move A2,A4
move A3,A5
abs A4
abs A5
sll 16,A5
clr A0 ;set Direction
divu A4,A5 ;A5 = A5/A4 = ABS(ZDELTA)/ABS(XDELTA) = TAN(THETA)
jrv GotD0 ;Overflow indicates XDELTA=0
cmpi >269FB,A5 ;Tan(22.5deg) = 2.414 as 16.16
jrgt GotD0
inc A0
cmpi >69FB,A5 ;Tan(67.5deg) = .414 as 16.16
jrgt GotD0
inc A0
GotD0:
;* Must Adjust for Quadrant
move A2,A2 ;check sign of XDELTA
jrn Q34
move A3,A3 ;ck sign of ZDELTA
jrn Q1
;* Quadrant 2, X+,Z+
neg A0
addk 4,A0
jruc GotD1
Q34:
move A3,A3 ;ck sign of ZDELTA
jrn Q4
Q3:
;* Quadrant 3, X-,Z+
addk 4,A0
jruc GotD1
Q4:
;* Quadrant 4, X-,Z-
neg A0
jrz GotD1
addk 8,A0
jruc GotD1
Q1:
;* Quadrant 1, X+,Z-
GotD1:
mmfm SP,A2,A3,A4,A5
rets
;SX: .LONG -080000H,01980000H,0AD0000H,0AD0000H
;SY: .LONG 05D0000H,05D0000H,-220000H,0F80000H
;SOX: .LONG 0,0,0180000H,0180000H
;SOY: .LONG 0130000H,0130000H,0,0
;SD: .WORD 3,7,5,1
;INFOTBL:
; .LONG LDOOR_INFO,RDOOR_INFO,TDOOR_INFO,BDOOR_INFO
KILL_H1
;A8=HULK IMAGE TO SMART BOMB ALSO KILL AHMED
;A9=P1DATA OR P2DATA FOR SCORE UPDATE
;SMART BOMB ENTRY
;ENTER HERE WITH SMART BOMB
MOVE *A8(OID),A0,W
ZEXT A0
CMPI CLSENMY|TYPAHMD,A0
JRNZ AHLK
MOVE @AHMD_CNT,A0
DEC A0
MOVE A0,@AHMD_CNT
JRUC ALO
AHLK
MOVE *A8(OPLINK),A0,L
JRZ NOTGD
CLR A1
MOVE A1,*A0(PROCID) ;SEPT 20
NOTGD MOVE @HULK_CNT,A0
DEC A0
MOVE A0,@HULK_CNT
JRNN ALO
CLR A0
MOVE A0,@HULK_CNT
ALO CREATE0 HSMRT ;BULLETS DIR WILL BE IN A10
;HULK_EXP WHEN IT WAKES UP
MOVI CLSDEAD,A0
MOVE A0,*A8(OID)
MOVE *A8(OPLINK),A0,L
jrz kj5
MOVE *A0(BULPRC),A0,L
JRZ KJ1
CALLA PEXIST
JRZ KJ1
CALLA KILL ;KILLS BULLET PROCESS
KJ1 MOVE *A8(OPLINK),A0,L
CALLA KILL ;KILL GRUNT PROC
kj5 CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
HSMRT
MOVE A9,A2
;A2=P1DATA OR P2DATA
MOVI HLKPT,A1 ;AMOUNT OF SCORE
CALLA SCRADD2 ;DO IT!
MOVE *A8(OYPOS),A2
ADDI 35,A2 ;A2=Y OFFSET ;30
MOVE A2,*A8(OYPOS)
MOVI 300,A0 ;200
MOVE A0,*A8(OZPOS)
MOVE @EXPCNT,A0 ;EXPS CAUSED BY SMART BOMB
CMPI 25,A0
JRNC HSO
INC A0
MOVE A0,@EXPCNT
MOVI XBOOM2,A9 ;BOOM3 CHANGES PALETTE TO EXPLOSION!
JAUC FRQDELDIE
HSO jauc DELOBJDIE ;TO MANY EXPS CAUSE SCRN GLITCH
BAT_PLYR
;STOP HULK FROM MOVING
;DECIDE WHICH OF FOUR SWING ANGLES TO USE
;TELL MAIN LOGIC THIS HULK IS SWINGING
MMTM SP,A1,A7
MOVE *A0(OPLINK),A0,L
MOVE *A0(PNUM),A9
MOVE *A8(OPLINK),A0,L
MOVE *A0(IBAT),A7
JRNZ FROMST
MOVI DOBAT,A7
MOVI HULKPID,A1
MOVE A1,*A0(IBAT)
CALLA XFERPROC
BPO MMFM SP,A1,A7
RETS
FROMST
;THIS GRUNT JUST STANDING AROUND!
MOVK 1,A1
MOVE A1,*A0(PTIME)
JRUC BPO
KILL_HULKZ:
;A8=HULK IMG PNTR, A0=KILLER IMG PNTR
MMTM SP,A1,A2
MOVE *A0(OID),A9,W ;KILLERS OID
MOVE *A0(OPLINK),A10,L
;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK HULK!
MOVE *A8(OPLINK),A0,L
MOVE *A0(DIR),A11 ;HULKS DIR
MOVI HULK_EXPZ,A7
JRUC ABC
KILL_HULK:
;A8=HULK IMG PNTR, A0=KILLER IMG PNTR
MMTM SP,A1,A2
MOVE *A0(OID),A9,W ;KILLERS OID
MOVE *A0(OPLINK),A10,L
;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK HULK!
MOVE *A8(OPLINK),A0,L
MOVE *A0(DIR),A11 ;HULKS DIR
MOVI HULK_EXP,A7
ABC
MOVI HULKPID,A1
CALLA XFERPROC
MOVE *A0(BULPRC),A0,L
JRZ KJ2
MOVE *A0(PROCID),A1
.IF DEBUG
CMPI FLMPID,A1
JRZ PAS
LOCKUP
EINT
PAS
.ENDIF
CALLA KILL ;KILLS BULLET PROCESS
KJ2
MOVI P1DATA,A2 ;PLAYER 1 SCORE SELECT
MOVE *A10(MYPLYR),A0 ;GET PLAYER #
CMPI 1,A0
JREQ CGA
CMPI 2,A0
JRNZ BMPDI0
MOVI P2DATA,A2
CGA
MOVI HLKPT,A1 ;AMOUNT OF SCORE
CALLA SCRADD2 ;DO IT!
BMPDI0
MOVK 1,A0
MOVE A0,@OUT_FLG
; MOVI 158,A0 ;199
MOVI 199,A0 ;199
MOVE A0,*A8(OZPOS)
MOVE *A8(OFLAGS),A1
ORI M_NOCOLL,A1
MOVE A1,*A8(OFLAGS)
MOVI CLSDEAD,A0
MOVE A0,*A8(OID)
MOVI ALTEXP1,A0
MOVE @PCNT,A1
BTST 0,A1
JRZ DSA
MOVI EXP1L,A0
DSA CALLA ONESND
MMFM SP,A1,A2
RETS
HULK_EXPZ:
;A10=PROCESS OF BULLET/BLADE THAT HIT THIS HULK
;A11=HULKS DIR
;A9=KILLERS OID
MOVI P1DATA,A2 ;PLAYER 1 SCORE SELECT
MOVE *A10(PNUM),A0 ;GET PLAYER #
MOVI CLSPLYR|TYPPLBL|SUBNOSTP,A9
HULK_EXP:
;A10=PROCESS OF BULLET/BLADE THAT HIT THIS HULK
;A11=HULKS DIR
;A9=KILLERS OID
;BMPDI
MOVE *A10(BLTDIR),A10 ;=BLTDIR!!! CAREFUL!!
MOVI 160,A0 ;158
MOVE A0,*A8(OZPOS)
CLR A0
MOVE A0,*A13(PROCID) ;SEPT 20
MOVE @HULK_CNT,A3
DEC A3
MOVE A3,@HULK_CNT
JRNN NOBUG
; LOCKUP
; EINT
CLR A0
MOVE A0,@HULK_CNT
NOBUG MOVE *A8(OPLINK),A0,L
MOVE *A0(HULKTYP),A0
; CMPI 3,A0
; JRZ FLMDIE
CMPI 2,A0
JRZ AHMDDIE
;NOT AN AHMED GRUNT
CMPI CLSPLYR|TYPPLBL|SUBNOSTP,A9
JREQ BIGEXP ;GO TO REGULAR FIRE BOMB EXPLOSION
;8 1 2
;7 3
;6 5 4
;A10 SHOULD BE 1-8!
DEC A10
ANDI 07,A10 ;IN CASE A BLADE STRUCK HULK
SLL 5,A10
MOVI RNGXL,A1
ADD A10,A1
MOVE *A1,A6,L
MOVE A6,*A8(OXVEL),L
MOVI RNGYL,A1
ADD A10,A1
MOVE *A1,A10,L
MOVE A10,*A8(OYVEL),L
CMPI CLSPLYR|TYPPLBL|SUBSPRY,A9
JRNE R1
;PIECES OR BLOODY DEATH DECISION HERE!
GR1 MOVE @PCTOT,A2
CMPI 010H,A2 ;19
JRLO ADDPCS
R1: DEC A11
ANDI 07H,A11
SLL 5,A11 ;A11=HULKS FACE DIR
SLL 5,A0 ;A0=HULKTYP
ADDI DLTS,A0
MOVE *A0,A0,L
ADD A0,A11
MOVE *A11,A9,L
JAUC FRQDELDIE
DLTS .LONG DDLIST,DLIST,DLISTA,DDLISTF,DDLIST
DCLTS .LONG DBLSTS,BLSTS,ALSTS,DBLSTS,DBLSTS
ADDPCS
MOVE *A13(HULKTYP),A1
SLL 5,A1
ADDI DCLTS,A1
MOVE *A1,A11,L
MOVE A6,A9
;A10=Y VEL
SLL 2,A9
SLL 2,A10
CREATE FUTUREPID,CHUNK_OBJ
MOVE *A8(OPAL),A1,W
MOVE A1,*A0(PDATA),W ;TELLS CHUNKS TO USE THIS PAL
SLEEPK 1
jauc DELOBJDIE
BIGEXP
MOVI 158,A0 ;199
MOVE A0,*A8(OZPOS)
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
CALLA GETANIXY
ADDI 01F0000H,A2 ;A2=Y OFFSET
SUBI 0C0000H,A3 ;A2=Y OFFSET
MOVI BOOM2,A9
MOVE A2,*A8(OYVAL),L
MOVE A3,*A8(OXVAL),L
jauc FRQDELDIE
KILL_AHMDZ
;A8=AHMD IMG PNTR, A0=KILLER IMG PNTR
MMTM SP,A1,A2,A3,A4,A7,A9,A10
MOVE *A0(OPLINK),A10,L
;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK HULK!
MOVE *A8(OPLINK),A0,L
MOVE *A0(DIR),A11 ;HULKS DIR
JRUC AABC
KILL_AHMD:
;A8=HULK IMG PNTR, A0=KILLER IMG PNTR
MMTM SP,A1,A2,A3,A4,A7,A9,A10
MOVI 03F3FH,A9 ;COLOR TO FLASH
MOVI HITAHMD,A3
CALLA DO_PUNISH
JALT PUSHME ;PUSHME IN FIEND.ASM
MOVE @WAVE,A3
SUBK 32,A3
JAZ PUSHME
MOVE *A0(OPLINK),A10,L
;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK HULK!
MOVE *A8(OPLINK),A0,L
;CHECK FOR TOTAL HITS HERE
MOVE *A0(DIR),A11 ;HULKS DIR
;KILL AHMED
;YEAH, KILL AHMD
;YES I WILL DIE
AABC
MOVI AHMD_EXP,A7
MOVI AHMDPID,A1
CALLA XFERPROC
CALLR KIL_FLM
MOVK 1,A0
MOVE A0,@OUT_FLG
MOVI 199,A0 ;199 ;158
MOVE A0,*A8(OZPOS)
MOVE *A8(OFLAGS),A1
ORI M_NOCOLL,A1
MOVE A1,*A8(OFLAGS)
MOVI CLSDEAD,A0
MOVE A0,*A8(OID)
MOVI GUYDI,A0
CALLA ONESND
MOVI ALTEXP1,A0
CALLA ONESND
MMFM SP,A1,A2,A3,A4,A7,A9,A10
RETS
AHMD_EXP:
;A10=PROCESS OF BULLET/BLADE THAT HIT THIS AHMD
;A11=AHMD DIR
;USED TO BE A9=KILLERS OID
MOVI P1DATA,A2 ;PLAYER 1 SCORE SELECT
MOVE *A10(MYPLYR),A0 ;GET PLAYER #
DEC A0
JREQ ACGA
CMPI 1,A0
JRNZ BMPDA
MOVI P2DATA,A2
ACGA
MOVI AHMDPT,A1 ;AMOUNT OF SCORE
CALLA SCRADD2 ;DO IT!
BMPDA
MOVE *A10(BLTDIR),A10 ;=BLTDIR!!! CAREFUL!!
MOVE @AHMD_CNT,A3 ;DELETE A BNCR FROM CNT
DEC A3
MOVE A3,@AHMD_CNT
;8 1 2
;7 3
;6 5 4
;A10 SHOULD BE 1-8!
AHMDDIE ;GRUNT AHMED COMES IN HERE
DEC A10
ANDI 07,A10 ;IN CASE A BLADE STRUCK HULK
SLL 5,A10
MOVI RNGXL,A0
ADD A10,A0
MOVE *A0,A6,L
MOVE A6,*A8(OXVEL),L
MOVI RNGYL,A0
ADD A10,A0
MOVE *A0,A10,L
MOVE A10,*A8(OYVEL),L
DEC A11
ANDI 07H,A11
SLL 5,A11 ;A11=HULKS FACE DIR
; MOVE *A8(OPLINK),A0,L
ADDI DLISTA,A11
MOVE *A11,A9,L
JAUC FRQDELDIE
;8 1 2
;7 3
;6 5 4
RNGXL:
.LONG 0,05C00H*1,05C00H*1,05C00H*1,0,-5C00H*1,-5C00H*1,-5C00H*1
RNGYL:
.LONG -05000H*1,-05000H*1,0,05000H*1,05000H*1,05000H*1,0,-05000H*1
;RNGXLA:
; .LONG 0,05C00H*3,05C00H*3,05C00H*3,0,-5C00H*3,-5C00H*3,-5C00H*3
;RNGYLA:
; .LONG -05000H*3,-05000H*3,0,05000H*3,05000H*3,05000H*3,0,-05000H*3
DLIST .LONG VDIE,HDIER,HDIER,HDIER,VDIE,HDIE,HDIE,HDIE
DDLIST .LONG DVDIE,DHDIER,DHDIER,DHDIER,DVDIE,DHDIE,DHDIE,DHDIE
;FLAMING GRUNT
DDLISTF .LONG DVDIEF,DHDIERF,DHDIERF,DHDIERF,DVDIEF,DHDIEF,DHDIEF,DHDIEF
;AHMED DIE LIST
DLISTA .LONG AHDIE,AHDIER,AVDIE2,AVDIE2,AVDIE,AVDIE,AVDIE,AHDIE
;FOR AHMED GRUNT
AHDIE:
.LONG ADETH101
.WORD FLIPBITS|5,0
.LONG ADETH102
.WORD 5
.LONG ADETH103
.WORD 5
.LONG ADETH104
.WORD 5
.LONG ADETH84
.WORD 3
.LONG ADETH85
.WORD 3
.LONG ADETH86
.WORD 3
.LONG ADETH86
.WORD 3
.LONG 0
AHDIER:
.LONG ADETH101
.WORD FLIPBITS|5,(M_FLIPH)
.LONG ADETH102
.WORD 5
.LONG ADETH103
.WORD 5
.LONG ADETH104
.WORD 5
.LONG ADETH84
.WORD 3
.LONG ADETH85
.WORD 3
.LONG ADETH86
.WORD 3
.LONG ADETH86
.WORD 3
.LONG 0
AVDIE:
.LONG ADETH81
.WORD FLIPBITS|5,0
.LONG AHDETH82
.WORD 5
.LONG ADETH82
.WORD 5
.LONG ADETH83
.WORD 5
.LONG ADETH84
.WORD 3
.LONG ADETH85
.WORD 3
.LONG ADETH86
.WORD 3
.LONG ADETH87
.WORD 3
.LONG 0
AVDIE2:
.LONG ADETH81
.WORD FLIPBITS|5,(M_FLIPH)
.LONG AHDETH82
.WORD 5
.LONG ADETH82
.WORD 5
.LONG ADETH83
.WORD 5
.LONG ADETH84
.WORD 3
.LONG ADETH85
.WORD 3
.LONG ADETH86
.WORD 3
.LONG ADETH87
.WORD 3
.LONG 0
;FOR DEMON GRUNT
HDIE:
.LONG HIT1
.WORD FLIPBITS|4,0
.LONG HIT2
.WORD 4
.LONG HIT3
.WORD 3
.LONG HIT4
.WORD 3
.LONG HIT5
.WORD 3
.LONG HIT6
.WORD 3
.LONG HIT7
.WORD 3
.LONG HIT8
.WORD 3
.LONG 0
HDIER:
.LONG HIT1
.WORD FLIPBITS|4,(M_FLIPH)
.LONG HIT2
.WORD 4
.LONG HIT3
.WORD 3
.LONG HIT4
.WORD 3
.LONG HIT5
.WORD 3
.LONG HIT6
.WORD 3
.LONG HIT7
.WORD 3
.LONG HIT8
.WORD 3
.LONG 0
VDIE:
.LONG VHIT1
.WORD FLIPBITS|5,0
.LONG VHIT2
.WORD 4
.LONG VHIT3
.WORD 3
.LONG VHIT4
.WORD 3
.LONG VHIT5
.WORD 3
.LONG HIT6
.WORD 3
.LONG HIT7
.WORD 3
.LONG HIT8
.WORD 3
.LONG 0
;FOR SOLDIER GRUNT
DHDIE:
.LONG DHIT1
.WORD FLIPBITS|4,0
.LONG DHIT2
.WORD 4
.LONG DHIT3
.WORD 3
.LONG DHIT4
.WORD 3
.LONG DHIT5
.WORD 3
.LONG DHIT6
.WORD 3
.LONG DHIT7
.WORD 3
.LONG DHIT8
.WORD 3
.LONG 0
DHDIER:
.LONG DHIT1
.WORD FLIPBITS|4,(M_FLIPH)
.LONG DHIT2
.WORD 4
.LONG DHIT3
.WORD 3
.LONG DHIT4
.WORD 3
.LONG DHIT5
.WORD 3
.LONG DHIT6
.WORD 3
.LONG DHIT7
.WORD 3
.LONG DHIT8
.WORD 3
.LONG 0
DVDIE:
.LONG DVHIT1
.WORD FLIPBITS|5,0
.LONG DVHIT2
.WORD 4
.LONG DVHIT3
.WORD 3
.LONG DVHIT4
.WORD 3
.LONG DVHIT5
.WORD 3
.LONG DHIT6
.WORD 3
.LONG DHIT7
.WORD 3
.LONG DHIT8
.WORD 3
.LONG 0
;FLAMING GRUNT
DHDIEF:
.LONG GRNTFLM1
.WORD NEWPALET|3
.long RDBOOM
.LONG GRNTFLM2
.WORD 3
.LONG GRNTFLM3
.WORD 3
.LONG GRNTFLM4
.WORD 3
.LONG GRNTFLM5
.WORD 3
.LONG GRNTFLM6
.WORD 3
.LONG 0
DHDIERF:
DVDIEF:
.LONG GRNTFLM1
.WORD NEWPALET|3
.long RDBOOM
.LONG GRNTFLM2
.WORD 3
.LONG GRNTFLM3
.WORD 3
.LONG GRNTFLM4
.WORD 3
.LONG GRNTFLM5
.WORD 3
.LONG GRNTFLM6
.WORD 3
.LONG 0
;
;8 1 2
;7 3
;6 5 4
;
;FOR FLAMING GRUNT
WALK_LISTBF:
.LONG FTF_PWK_UP,FTF_PWK_UPRGT,FTF_PWK_RGT,FTF_PWK_DNRGT,FTF_PWK_DN
.LONG FTF_PWK_DNLFT,FTF_PWK_LFT,FTF_PWK_UPLFT
WALK_LISTMBF:
.LONG TFM_PWK_UP,TFM_PWK_UPRGT,TFM_PWK_RGT,TFM_PWK_DNRGT,TFM_PWK_DN
.LONG TFM_PWK_DNLFT,TFM_PWK_LFT,TFM_PWK_UPLFT
WALK_LISTFBF:
.LONG TFF_PWK_UP,TFF_PWK_UPRGT,TFF_PWK_RGT,TFF_PWK_DNRGT,TFF_PWK_DN
.LONG TFF_PWK_DNLFT,TFF_PWK_LFT,TFF_PWK_UPLFT
;FOR FLAME THROWER CARRYING AHMED GRUNT
WALK_LISTB:
.LONG T3_PWK_UP,T3_PWK_UPRGT,T3_PWK_RGT,T3_PWK_DNRGT,T3_PWK_DN
.LONG T3_PWK_DNLFT,T3_PWK_LFT,T3_PWK_UPLFT
WALK_LISTMB:
.LONG T3M_PWK_UP,T3M_PWK_UPRGT,T3M_PWK_RGT,T3M_PWK_DNRGT,T3M_PWK_DN
.LONG T3M_PWK_DNLFT,T3M_PWK_LFT,T3M_PWK_UPLFT
WALK_LISTFB:
.LONG T3F_PWK_UP,T3F_PWK_UPRGT,T3F_PWK_RGT,T3F_PWK_DNRGT,T3F_PWK_DN
.LONG T3F_PWK_DNLFT,T3F_PWK_LFT,T3F_PWK_UPLFT
;FOR AXE CARRYING DEMON GRUNT
WALK_LISTA:
.LONG T_PWK_UP,T_PWK_UPRGT,T_PWK_RGT,T_PWK_DNRGT,T_PWK_DN
.LONG T_PWK_DNLFT,T_PWK_LFT,T_PWK_UPLFT
WALK_LISTMA:
.LONG TM_PWK_UP,TM_PWK_UPRGT,TM_PWK_RGT,TM_PWK_DNRGT,TM_PWK_DN
.LONG TM_PWK_DNLFT,TM_PWK_LFT,TM_PWK_UPLFT
WALK_LISTFA:
.LONG TF_PWK_UP,TF_PWK_UPRGT,TF_PWK_RGT,TF_PWK_DNRGT,TF_PWK_DN
.LONG TF_PWK_DNLFT,TF_PWK_LFT,TF_PWK_UPLFT
;FOR DESERT SOLDIER
WALK_LIST:
.LONG T2_PWK_UP,T2_PWK_UPRGT,T2_PWK_RGT,T2_PWK_DNRGT,T2_PWK_DN
.LONG T2_PWK_DNLFT,T2_PWK_LFT,T2_PWK_UPLFT
WALK_LISTM:
.LONG T2M_PWK_UP,T2M_PWK_UPRGT,T2M_PWK_RGT,T2M_PWK_DNRGT,T2M_PWK_DN
.LONG T2M_PWK_DNLFT,T2M_PWK_LFT,T2M_PWK_UPLFT
WALK_LISTF:
.LONG T2F_PWK_UP,T2F_PWK_UPRGT,T2F_PWK_RGT,T2F_PWK_DNRGT,T2F_PWK_DN
.LONG T2F_PWK_DNLFT,T2F_PWK_LFT,T2F_PWK_UPLFT
;
;HULK ANIMATIONS TABLE 2
;
SPINF: ;FLAMING GRUNT
.LONG FLM12R2,FLM11R3,FLM9R4,FLM8R3,FLM6R5,FLM8R3,FLM9R4,FLM11R3
SPINFRMS: ;AXE DEMON GRUNT
.LONG gb12w2a,gb10w3a,gb9w4a,gb8w3a,gb6w5a,gb8w3a,gb9w4a,gb10w3a
SPINFRMS2: ;REGULAR SOLDIER GRUNT
.LONG Dgb12w2a,Dgb10w3a,Dgb9w4a,Dgb8w3a,Dgb6w5a,Dgb8w3a,Dgb9w4a,Dgb10w3a
SPINFRMSA: ;FLAME THROWING AHMED GRUNT
.LONG AHMED12b,AHMED10e,AHMED9a,AHMED8f,AHMED6a,AHMED8f,AHMED9a,AHMED10e
SPINFLGS:
.WORD DMAWNZ,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH,DMAWNZ
.WORD DMAWNZ,DMAWNZ,DMAWNZ
BLSTS .LONG FLSHA1,ARMUP,LEGUP,FLSHA,FLSHB,ARMUPZ,LEGUPZ,FLSHAZ,FLSHBZ,0
;AHMED LIST
ALSTS .LONG FLSHA1,ARMUP,LEGUP,FLSHA,FLSHB,ARMUPZ,LEGUPZ,FLSHAZ,FLSHBZ,0
PBLSTS .LONG BOY3,ARMUP,LEGUP,FLSHA,FLSHB,ARMUPZ,LEGUPZ,FLSHAZ,FLSHBZ,0
GETPSK
;UPDATE HULK COUNT
MOVE @HULK_CNT,A0
INC A0
MOVE A0,@HULK_CNT
;CHOOSE PLAYER TO SEEK
ANDI 01,A0
MOVE A0,*A13(SKPLYR)
MOVE A0,A1
SLL 5,A1
ADDI PLYROBJS,A1
MOVE *A1,A1,L
MOVE *A1(OXPOS),A1
JRNZ RZY ;BR=OKAY TO SEEK THIS PLAYER
;PLAYER I AM SEEKING IS IN DIE MODE
XORI 1,A0
MOVE A0,*A13(SKPLYR)
RZY
CLR A0
MOVE A0,*A13(CFLAGS),W
MOVE A0,*A13(IBAT) ;NO BATTING AT START!
MOVE A0,*A13(BNCCNT) ;NOBNCCNT AT START
MOVE A0,*A13(BNCING)
CLR B0
MOVK 10,B1
CALLA RANGRAND ;TIE THIS IN WITH DIFFICULTY!
SLL 4,A0
ADDI AGTBL,A0
MOVE *A0,A0
MOVE A0,*A13(HAGE)
MOVE A0,*A13(KPAGE)
RETS
SOLD
MOVE A13,*A8(OPLINK),L
MOVE *A8(OFLAGS),A4
MOVE *A8(OXPOS),A0
ADDK 16,A0
MOVE A0,*A8(OXPOS)
MOVE *A8(OYPOS),A10
SUBK 9,A10
MOVE A10,*A8(OYPOS)
CALLA ANI
BTST 0,A10
RETS
*****************************************************************************
I_FLM
;FROM COLLISION ROUTINE, TELL THIS AHMED TO FLAME - I AM TOUCHING A PLAYER
;A8=AHMD IMG PNTR, A0=KILLER IMG PNTR
;A9=0 OR 1
MMTM SP,A1,A7
MOVE *A0(OPLINK),A0,L
MOVE *A0(PNUM),A9
MOVE *A8(OPLINK),A0,L
MOVE *A0(IBAT),A7
;2=FLAMING,1=PUNCHING
JRZ WLK0
;THIS AHMED IS CURRENTLY FLAMING!
;KILL OFF FLAME PROC
;DELOBJ FLAME IMG
MMTM SP,A0,A8
CALLR KIL_FLM
MMFM SP,A0,A8
WLK0
CLR A1
MOVE A1,*A0(GOCRNR),L
MOVE A1,*A0(CFLAGS)
MOVK 1,A1
MOVE A1,*A0(IBAT)
MOVI DOPNCH,A7
MOVI AHMDPID,A1
CALLA XFERPROC
MMFM SP,A1,A7
RETS
KIL_FLM
;CLEAN UP FLAME FROM AHMED DUDE
MOVE *A0(BULPRC),A0,L
JRZ WLK ;BR=HE WAS LINING UP TO FLAME ME!
CLR A1
MOVE A1,*A0(BULPRC),L
MOVE *A0(PDATA+64),A1,L
MOVE *A0(PDATA+128),A2,L
MOVE *A0(PDATA+192),A3,L
CALLA PEXIST
JRZ WLK
MOVE *A0(PROCID),A4
CMPI FLMPID,A4
JRNZ WLK
CALLA KILL ;KILLS BULLET PROCESS
MOVE A1,A0 ;KILL FLAME
CALLA DELOBJ
MOVE A2,A0 ;KILL FLAME
CALLA DELOBJ
MOVE A3,A0 ;KILL FLAME
CALLA DELOBJ
WLK RETS
PUNCHSND .WORD >F5E5,20,>812B,0
DOPNCH:
;A9=PLAYER 1 OR 2
;THIS AHMED IS PUNCHING
;START PUNCH
MOVI PUNCHSND,A0
CALLA ONESND
CALLA PHASE1
JRC PSUP ;BR=BAT UPWARD
CMP A4,A1
JRC PB8O ;BR=8 O'CLOCK SWING NEEDED
;4 O'CLOCK
MOVI BAT4OA,A9
JRUC DOPN
PB8O
;8
MOVI BAT8OA,A9 ;AHMED PUNCH
JRUC DOPN
PSUP CMP A4,A1
JRC PB10O
;2 O'CLOCK
MOVI BAT2OA,A9
JRUC DOPN
PB10O
MOVI BAT10OA,A9
DOPN
MOVE A9,A10
JSRP FRANIMQ
MOVI PUNCHSND,A0
CALLA ONESND
MOVE A10,A9
JSRP FRANIMQ
MOVI PUNCHSND,A0
CALLA ONESND
;PNCHDN
CLR A0
MOVE A0,*A13(IBAT)
MOVK 1,A0
MOVE A0,*A13(DIS)
MOVE A0,*A13(CFLAGS)
MOVI ZEROS,A9
JRUC ALUP_TOP
AAHMED:
;A9=[Y,X] SPOT TO SPAWN FROM
;A10=DIRECTION
;8 1 2
;7 3
;6 5 4
MOVI AHMD,A2
CALLR GET_WVADDR
MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS HULK
DEC A1
MOVE A1,*A0(16),W
MOVE *A0(32),A1,W ;GET DIFFICULTY LEVEL
CALLR START_AHMD
MOVK 4,A3 ;20
MOVE A3,*A13(DIS) ;CHANGE BASED ON HULKS SPEED?
MOVE @WAVE,A0
SUBK 32,A0
JRNZ RATS
MOVI 07FFFH,A3 ;TAKE OUT
MOVE A3,*A13(NOFLMS)
CLR A0
MOVE A0,*A13(CFLAGS)
MOVE A0,*A13(GOCRNR),L
JRUC CRATE_IN
RATS MOVE *A13(CFLAGS),A0 ;RUNNING OUT
ORI 2,A0
MOVE A0,*A13(CFLAGS)
CRATE_IN
;ENTRY POINT FOR CRATE AHMED DUDE
;NOW START WITH A VELOCITY!
CALLR OKVA
MOVE *A8(OYPOS),A0
MOVE @WORLDTLY,A1,L
SRL 16,A1
ADDI 255,A1 ;275
CMP A0,A1
JRGT ALUP_TOP
;THIS HULK STARTING LOWER THAN BOTTOM OF SCRN!
;RESET ITS Y LINE
MOVE A1,*A8(OYPOS)
;
; LOOP TOP FOR AHMED FLAME THROWER GRUNT
;
ALUP_TOP:
;TOP OF HULK LOGIC
MOVE @HALT,A0
JRZ ACONT1 ;IF HALT ON, LOOP BACK TO TOP
SLEEPK 3
JRUC ALUP_TOP
ACONT1
MOVE *A13(CFLAGS),A0
BTST 2,A0
JRZ AC2
;SEEKING SIT SPOT, AM I THERE?
MOVE *A13(GOCRNR),A0,L
MOVE *A8(OYVAL),A1,L
SUB A0,A1
ABS A1
CMPI [10,0],A1
JRNC AC2
ANDI 0FFFFH,A0
MOVE *A8(OXPOS),A1
SUB A0,A1
ABS A1
CMPI 15H,A1
JRNC AC2
;YES A HIT!
;PAUSE HERE FOR X TIME
;ALWAYS POINT TOWARD PLAYER I WILL SEEK!
CALLR SETUP_DIR
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
MOVE A0,*A13(GOCRNR),L
MOVE A0,*A13(CFLAGS)
GTO
MOVE *A13(DIR),A0
MOVE *A13(SK_DIR),A1
CMP A0,A1
JRZ GTOO
CALLR WAY
SLEEPK 5
JRUC GTO
GTOO
MOVK 1,B0 ;AHMED STAYS IN CORNER
MOVI 60*6,B1
CALLA RANGRAND
CALLA PRCSLP
MOVI ZEROS,A9
AC2 MOVE *A13(NOFLMS),A0
JRZ AC3
DEC A0
MOVE A0,*A13(NOFLMS)
JRNZ NOFL
AC3
MOVE *A13(SKPLYR),A1
SLL 5,A1
ADDI PLYROBJS,A1
MOVE *A1,A1,L
MOVE *A1(OXPOS),A2
MOVE *A8(OXPOS),A3
SUB A2,A3
ABS A3
CMPI 80,A3
JRNC NOFL
MOVE *A1(OYPOS),A2
MOVE *A8(OYPOS),A3
SUB A2,A3
ABS A3
CMPI 04CH,A3
JRNC NOFL
MOVE *A13(SKPLYR),A9
;A9=PLAYER 0 OR 1
;THIS AHMED IS FLAMING AT
INC A9
MOVK 2,A0 ;2=FLAMING,1=PUNCHING
MOVE A0,*A13(IBAT)
CALLA PHASE1
JRC FSUP ;BR=BAT UPWARD
CMP A4,A1
JRC FB8O ;BR=8 O'CLOCK SWING NEEDED
;4 O'CLOCK
MOVI AHMED8,A1
MOVE *A8(OFLAGS),A4
ORI M_FLIPH,A4
CALLA ANI
SLEEPK 10
MOVI DMAWNZ|M_PIXSCAN|M_FLIPH,A4
MOVE *A8(OXVAL),A0,L
ADDI [13H,0],A0
MOVE *A8(OYVAL),A1,L
SUBI [12H,0],A1
MOVK 2,A9
JRUC FBATDN
FB8O
MOVI AHMED8,A1
MOVE *A8(OFLAGS),A4
ANDI 0FFEFH,A4
CALLA ANI
SLEEPK 10
MOVI DMAWNZ|M_PIXSCAN,A4
MOVE *A8(OXVAL),A0,L
ADDI [10H,0],A0
MOVE *A8(OYVAL),A1,L
SUBI [12H,0],A1
MOVK 3,A9
JRUC FBATDN
FSUP CMP A4,A1
JRC FB10O
;2 O'CLOCK
MOVI AHMED10,A1
MOVE *A8(OFLAGS),A4
ANDI 0FFEFH,A4 ;NO HZ FLIP BIT SET
ORI M_FLIPH,A4
CALLA ANI
SLEEPK 10
MOVI DMAWNZ|M_PIXSCAN|M_FLIPH|M_FLIPV,A4
MOVE *A8(OXVAL),A0,L
ADDI [019H,0],A0
MOVE *A8(OYVAL),A1,L
ADDI [03CH,0],A1
MOVK 1,A9
JRUC FBATDN
FB10O
MOVI AHMED10,A1
MOVE *A8(OFLAGS),A4
ANDI 0FFEFH,A4 ;NO HZ FLIP BIT SET
CALLA ANI
SLEEPK 10
MOVI DMAWNZ|M_PIXSCAN|M_FLIPV,A4
MOVE *A8(OXVAL),A0,L
ADDI [0EH,0],A0
MOVE *A8(OYVAL),A1,L
ADDI [03CH,0],A1
CLR A9
FBATDN
;A0,A1 ARE SET UP
MOVI 160,A3
MOVI AHMEDBLST1,A2
MOVI CLSENMY|TYPLAYR|SUBFLM,A5
CLR A6
CLR A7
MOVE A8,A10
CALLA BEGINOBJ2
CREATE FLMPID,FLAMING
MOVE A0,*A13(BULPRC),L
MOVE A10,A8
SLEEP 10FH-120
CLR A0
MOVE A0,*A13(IBAT)
MOVE A0,*A13(GOCRNR),L
MOVK 1,A0
MOVE A0,*A13(DIS)
MOVE A0,*A13(CFLAGS)
MOVI ZEROS,A9
MOVK 1,B0
MOVI 60,B1 ;120
CALLA RANGRAND
MOVE A0,*A13(NOFLMS)
JRUC ALUP_TOP
NOFL
;CHECK FOR COLLISIONS WITH RECTANGLES ON THIS SCREEN
MOVE @EN_CURRENT,A0,L ;CURRENT RECT LIST
JRZ NOBOXS
CALLR CK_RECT
NOBOXS MOVI SETUP_DIRA,A10 ;ROUTINE TO CALL
CALLR CK_SPIN
MOVE A0,A0
JRZ NOTSPINA
CALLA PRCSLP
JRUC ALUP_TOP
NOTSPINA:
MOVE *A13(DIS),A0 ;UPDATE DISTANCE COUNT
DEC A0
MOVE A0,*A13(DIS) ;STUFF NEW COUNT
JRNZ DOAHMD ;BR=CONTINUE CURRENT DIRECTION
MOVE A0,*A13(BNCING)
MOVE *A13(CFLAGS),A0
BTST 1,A0
JRZ T3A
;THIS AHMD JUST RUNNING IN! GIVE THIS ONE A BOGUS SEEK DIR
;IF WITHIN WALLS THEN CONT, OTHERWISE RESET DIS CNTR
MOVE @WORLDTLX,A0,L
MOVE @SITLST,A2,L
MOVE @WORLDTLY,A1,L
MOVE *A13(DIR),A3
DEC A3
SLL 6,A3
ADD A3,A2
MOVE @HCOUNT,A4 ;HULK_CNT,A4
ANDI 01,A4
SLL 5,A4
ADD A4,A2
MOVE *A2,A2,L
ADD A2,A1
SRL 16,A0
ADD A2,A0
MOVX A0,A1
MOVE A1,*A13(GOCRNR),L
MOVE *A13(CFLAGS),A0
ORI 04,A0 ;INDICATE SEEKING SIT SPOT
MOVE A0,*A13(CFLAGS)
JRUC T4A
;NOW POINT THIS AHMD AT CURRENT POSITION OF PLAYER
T3A: MOVE *A13(BNCING),A0
JRNZ DOAHMD
MOVE *A13(SK_DIR),A7,W
;IF NEW SEEK IS <> OLD SEEK, THEN SET STAND FLAG
CALLR GET_DIS
CALLR SETUP_DIRA
MOVE *A13(SK_DIR),A0
CMP A0,A7 ;NEW CMP OLD SEEK
JREQ DOAHMD
T4A: MOVE *A13(CFLAGS),A0 ;SAYS I AM SPINNING
ORI 01H,A0
MOVE A0,*A13(CFLAGS),W
MOVK 2,A0
MOVE A0,*A13(OSCILLATE)
SLEEPK 3
JRUC ALUP_TOP
DOAHMD:
CLR A1
JSRP FRANIM
JRNC CHA ;BR=NOT AT END OF SCRIPT YET
CALLR GET_RUN
CHA
JRUC ALUP_TOP
START_AHMD
MOVE A1,*A13(LEVEL),W
MOVK 2,A0 ;INDICATES AHMED GRUNT
MOVE A0,*A13(HULKTYP)
CLR A0
MOVE A0,*A13(BULPRC),L
MOVE A0,*A13(ABSRB)
;A10=DIRECTION
;8 1 2
;7 3
;6 5 4
MOVE A10,*A13(SK_DIR)
;UPDATE AHMD COUNT
MOVE @AHMD_CNT,A0
INC A0
MOVE A0,@AHMD_CNT
;CHOOSE PLAYER TO SEEK
ANDI 01,A0
MOVE A0,*A13(SKPLYR)
MOVE A0,A1
SLL 5,A1
ADDI PLYROBJS,A1
MOVE *A1,A1,L
MOVE *A1(OXPOS),A1
JRNZ PZY ;BR=OKAY TO SEEK THIS PLAYER
;PLAYER I AM SEEKING IS IN DIE MODE
XORI 1,A0
MOVE A0,*A13(SKPLYR)
PZY
CLR A0
MOVE A0,*A13(CFLAGS),W
MOVE A0,*A13(IBAT) ;NO BATTING AT START!
MOVE A0,*A13(BNCING)
MOVE A10,*A13(DIR)
MOVE A10,A0
SLL 5,A0
ADDI HXT,A0
MOVE *A0,A4,L
;BTML .LONG 0,0,[08,0],[10,0],[08,0],[30,0],[08,0],[50,0],[17,0],[20,0]
;[Y,X] OF PLACEMENT
;A4=THIS
;A8=1-4
MOVK 1,A8
SLL 6,A8
ADD A8,A4
MOVE *A4+,A1,L ;GET Y FIRST
ADD A9,A1
SLL 16,A9
MOVE *A4,A0,L
ADD A9,A0
MOVI AHMED10,A2
;NEED A0=[X,0000],A1=[Y,0000]
;A0,A1 ARE SET UP
MOVI 100,A3 ;TAKE OUT
MOVE A3,*A13(NOFLMS)
MOVI 159,A3
MOVI DMAWNZ,A4 ;NON-ZERO VALUE
MOVI CLSENMY|TYPAHMD,A5
CLR A6
CLR A7
CALLA BEGINOBJ2
RETS
CK_RECT
;NOW CHECK RECTANGLES FOR COLLISIONS
MOVE *A13(BOXCK),A1
DEC A1
JRNZ NOREC
;TIME TO CHECK HULK AGAINST RECTANGLES!
;BOG CITY
MOVK 8,A1
MOVE A1,*A13(BOXCK)
;MAYBE JUST KILL THIS GUY OFF IF HE HAS COLLIDED WITH RECTANGLES TOO MUCH!
;FIRST CHECK TO SEE IF THIS WILL PUSH PLAYER INTO BAD RECTANGLE AREA
;CHECK FOR RECTANGLE COLLISIONS!
MOVE *A8(OXVAL),A4,L
MOVE *A8(OYVAL),A6,L
SRL 16,A4 ;X
SRL 16,A6 ;Y
NEXT0 MOVE *A0+,A1,W
JRZ NOBOX
CMP A1,A4
JRLT NEXT ;IF BRNCH RECT LFT EDGE > PLYR X
MOVE *A0+,A1,W
CMP A1,A6 ;
JRLT NEXTA ;IF BRNCH RECT TOP EDGE > PLYR Y
MOVE *A0+,A1,W
CMP A1,A4
JRGT NEXTB ;IF BRNCH RECT RGT EDGE < PLYR X
MOVE *A0+,A1,W
CMP A1,A6
JRLT YESA ;IF BRNCH RECT BOT EDGE < PLYR Y
ADDK 16,A0
JRUC NEXT0
YESA
;HIT A RECTANGLE
;WHAT DO I DO?
MOVE *A0,A0
MOVE A0,*A13(SK_DIR)
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
MOVE *A13(CFLAGS),A0
ORI 1,A0
MOVE A0,*A13(CFLAGS)
MOVK 32,A1 ;DON'T CHECK FOR AWHILE ;40
MOVE A1,*A13(BNCING) ;DIS HULK WILL TRAVEL AFTER BNC!
MOVE A1,*A13(BOXCK) ;TIME BEFORE WE CHECK AGAIN
MOVE *A13(BNCCNT),A0
INC A0
MOVE A0,*A13(BNCCNT)
CMPI 3,A0
JRNZ NOBOX
;GRUNT IS STUCK BNCING OFF RECTANGLES! KILL HIM!
SETC
RETS
NEXT ADDI 48+16,A0
JRUC NEXT0
NEXTA ADDI 32+16,A0
JRUC NEXT0
NEXTB ADDK 16+16,A0
JRUC NEXT0
NOREC MOVE A1,*A13(BOXCK)
NOBOX CLRC
RETS
CK_SPIN
MOVE *A13(CFLAGS),A0
BTST 0,A0
JRZ NOSPN
;THIS HULK IS SPINNING, DO SPIN
MOVE *A13(SK_DIR),A1
MOVE *A13(DIR),A0,W
CMP A0,A1
JRNE CONT
;HULK HAS SPUN TO CORRECT DIR, NOW START HIM WALKING AGAIN
;SET DIS CNTR ALSO
;CHECK TO MAKE THIS DIR IS STILL HEADING TOWARD PLAYER!
;IF SO, START RUN WITH CORRECT VELOCITY STUFFED TO COLLIDE WITH PLAYER
;IF NOT, SPIN SOME MORE!
;IF NEW SEEK IS <> OLD SEEK, THEN SET STAND FLAG
MOVE *A13(CFLAGS),A0
BTST 1,A0 ;REGULAR HULK RUN IN FLAG
JRZ R0
; HULK HAS RUN IN, NOW ANGLE HIM OFF RANDOMLY
MOVK 18,A0 ;15
MOVE A0,*A13(DIS)
MOVE *A13(CFLAGS),A0
ANDI 0FFFDH,A0
MOVE A0,*A13(CFLAGS)
JRUC GOODNEWS
R0
MOVE *A13(BNCING),A0
JRNZ GNW2
PUSH A1
CALLR GET_DIS
CALL A10 ;SETUP_DIR
PULL A1
MOVE *A13(SK_DIR),A0
CMP A0,A1 ;NEW CMP OLD SEEK
JREQ GOODNEWS
;HULK SPUN TO CORRECT DIR THEN CHECKED AGAIN AND THE PLAYER HAD MOVED
MOVE *A13(OSCILLATE),A0
JRNZ GNW
MOVK 1,A0
MOVE A0,*A13(OSCILLATE)
;SET HULK SPIN FLAG AGAIN BECAUSE PLAYER MOVED!
MOVE *A13(CFLAGS),A0
ORI 01H,A0
MOVE A0,*A13(CFLAGS),W
MOVK 1,A0
RETS
GNW2
;A0=DIR TO BNC
MOVE *A13(DIR),A0
CALLR INTO
MOVI 30,A0
JRUC GNW1
GNW MOVK 5,A0 ;6
GNW1 MOVE A0,*A13(DIS)
GOODNEWS:
CLR A0
MOVE A0,*A13(OSCILLATE)
CALLR GET_RUN ;ZEROS STAND FLAG ALSO
MOVK 1,A0
RETS
CONT:
CALLR WAY ;WHICH WAY TO SPIN/THEN ANI STAND VW
CONT1: MOVK 3,A0
RETS
NOSPN: CLR A0
RETS
SKGHXT .LONG 0,GBTML,GBTML,SKGLFTL,GTOPL,GTOPL,GTOPL,SKGRGTL,SKGRGTL
SHXT .LONG 0,BTML,BTML,SLFTL,TOPL,TOPL,TOPL,SRGTL,SRGTL
.END