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