trog/TROGTROG.ASM

4488 lines
119 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.

.MLIB "TROGMACS.LIB"
.FILE 'TROGTROG.ASM'
.TITLE " <<< T R O G -- TROG, THE MAN, THE METHOD, THE CODE. >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1990 MIDWAY MANUFACTURING COMPANY, *
* MANUFACTURERS OF BALLY/MIDWAY AMUSEMENT GAMES. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
* GET THE SYSTEM STUFF
.INCLUDE "MPROCEQU.ASM" ;MPROC equates
.INCLUDE "DISPEQU.ASM" ;Display processor equates
.INCLUDE "GSPINC.ASM" ;GSP assembler equates
.INCLUDE "SYSINC.ASM" ;Zunit system equates
.INCLUDE "IMGTBL.GLO"
.INCLUDE "TROGEQU.ASM"
.INCLUDE "STRING.H"
.INCLUDE "TROGAUDN.ASM"
.INCLUDE "TROGAEQU.ASM" ;GET THE ANIMATION EQUATES
.DEF TROG_START, TROGCOLL, TROG_CENTER, CLIP_INTO, TROG_SQUASH
.DEF CENTER_CHECK, GET_BEST_DIRECTION, TROG_VEL_NORMAL, TROG_BUMP
.DEF GET_DIRECTIONS, GET_DIRECTIONS_TO_MOVE, DELETE_TROG
.DEF TROG_LOOK_COUNT, TROG_SEARCH_DIST
.DEF TROG_NEW_PNT, FIND_MVD, GET_TROG_CPNT, SCORE_TO_PLAYER
.DEF CK_TROG_CENT, SELECT_DINO, GET_TROG_MPNT
.DEF EXTRA_TROG_START, TROG_VALIDATE_CHASEE, CLEAR_PURSUIT
.DEF TROGWXFER, TROGDEATH_OLD_RET, TROG_OOF
.DEF TROG_START_WAIT, DIR_VELOCITY
**** .DEF TROG_SLOWDOWN, TROG_SPEEDUP
.REF ENEMY_START, TROGATAB, TROGINIT, TROG_INTRO_FLAG
.REF DINO_PNT_TST, DINOINIT_PNT_FIND, DSRCH_CLR, DINOLOAD
.REF FIND_SAFEST, FINDMOVE, GETCMOVE, DINOTURN
.REF GETMOVE, BOUNDRY_CHECK, ANIMATE_DIR, NOTDIR
.REF DINOLOOK, ANIMATE_TURN, DINO_TROG_OOF, DINO_TROG_CLUB
.REF SCOREOBJ, DINOPUNCH, TROG_PIT, FIND_OPEN_CPNT
.REF FINDCMOVE, PIT_CLOSE, CK_PIT_CENT, DINO_VEL
.REF TROGSPEED, FIND_CLOSE_MPNT, TOMOVE, FIND_CLOSE_CPNT
.REF ONE_MOVE, BONE_BETWEEN, BUMP, BUMPCK, DINOLOOK_TURN
.REF DINO_FRANIM, VALIDHITX, VALIDHITY, DINOREV, LOAD_DIR
.REF DINOS_NEAR_PNT, FREE_MOVE_EGG, DINO_ADD_VEL, TAROUT
.REF BONED_IN, GPLAYD, GPLAYNUM, TROG_PURSUIT, GET_DINO_MPNT
.REF TROG_PURSUIT_RESET, TROG_PIT_COMM
.REF FRANIMATE_DIR, SCORE, FIRE_UP_MONKEY_SHIT
.REF BONE_OBJ, HOUSE_PIT, FIND_CLOSE_EPNT, TROG_CLUB_ATAB
.REF BONE_SMASH, GET_DINO_CPNT, OPEN_PIT, LIGHT_MY_FIRE
.REF VALID_CPNT, DENT_GROUND, TWO_MOVES, TARBUBBLE_SND
.REF WHEEL_PROCESS, WHEEL_CNT, NUM_WHEELS
.REF FIND_CMOVE_X, FIND_CMOVE_Y, WAVEEGGS, BGND_TYPE
.REF DINO_MUNCH, TROGUHOH_SND, CK_TREX, TINIT_TAB, PUNCHED
.REF TROGSPRG_PROCESS, TROGUP, BTYPE_CK, POWERUP_DURATION
.REF FREEZE_TIME, BLOCK_CHECK, IS_DINO_DEAD_A8, BONUS_WAVE
.REF IS_DINO_DEAD_A0, TROG_CNT, NUM_TROGS, PUNCH_SND, TROGCLUB_SND
.REF TROGBXFER, EARTHSHAKER, DINO_PUNCHED, TGEN_CNT, TGEN_CPTRS
* NUMBER OF MOVES TROG WILL WALK BEFORE PICKING SOMEBODY TO CHASE
.BSS TROG_LOOK_COUNT,16 ;MOVES 'TIL NEXT LOOK IF NOT CHASING
*
*SEARCH DIFFICULTY VARIABLES
*
.BSS TROG_SEARCH_DIST,16 ;DISTANCE THAT TROG CAN SEE (> HARDER)
.TEXT
**************************************************************************
* *
* TROG_START - START TROG(S) *
* A5 = [RANDOM # TO ADD, # TO START] *
* A6 = OID *
* *
**************************************************************************
TROG_START:
MMTM SP,A1,A7,A10
MOVI TROG_PROCESS,A7
MOVI TROGPID,A1
MOVE A6,A10
CALLA ENEMY_START
MOVK 2,A1
MOVE A1,@TROG_LOOK_COUNT,W
MOVK 4,A1
MOVE A1,@TROG_SEARCH_DIST,W
MMFM SP,A1,A7,A10
RETS
**************************************************************************
* *
* EXTRA_TROG_START - ROUTINE TO START EXTRA TROGS (THE TROG BROTHERS). *
* 1 PLAYER = 3 EXTRAS (GREEN, RED, BLUE) *
* 2 PLAYERS = 2 EXTRAS (GREEN, RED) *
* 3 PLAYERS = 1 EXTRA (GREEN) *
* A5 (BYTE 0) = MAX NUMBER OF EXTRAS ALLOWED, UP TO 3 *
* A5 (BYTE 1) = # OF EXTRA TROGS WITH CLUB *
* A5 (BYTE 2) = # OF EXTRA TROGS WITH WHEEL *
* A5 (BYTE 3) = # OF EXTRA TROGS WITH SPRING SHOES *
* A6 = START INTERVAL *
* *
**************************************************************************
EXTRA_TROG_START:
MMTM SP,A0,A1,A7,A9,A11
MOVI EXTRA_TROGS,A7
MOVI TROGPID,A1
MOVE A5,A9
MOVE A6,A11
CALLA GETPRC
MOVK 2,A1
MOVE A1,@TROG_LOOK_COUNT,W
MOVK 4,A1
MOVE A1,@TROG_SEARCH_DIST,W
MMFM SP,A0,A1,A7,A9,A11
RETS
**************************************************************************
* *
* EXTRA_TROGS - PROCESS TO START EXTRA TROGS AT THE BEGINNING OF A WAVE *
* ACCORDING TO THE NUMBER OF PLAYERS ACTIVE. *
* *
* A9 (BYTE 0) = NUMBER OF EXTRAS TO START THIS CALL *
* A9 (BYTE 1) = PORTION WHICH USE THE CLUB *
* A9 (BYTE 2) = PORTION WHICH USE THE WHEEL *
* A5 (BYTE 3) = PORTION WHICH USE THE SPRING SHOES *
* (ALL OTHERS ARE BARE HANDED) *
* A11 = START INTERVAL *
* *
**************************************************************************
TCLUBCNT .EQU PDATA
TWHEELCNT .EQU PDATA+10H
TSPRINGCNT .EQU PDATA+20H
EXTRA_TROGS:
MOVE A9,A0
SLL 16,A0
SRL 24,A0
MOVE A0,*A13(TCLUBCNT),W
MOVE A9,A0
SLL 8,A0
SRL 24,A0
MOVE A0,*A13(TWHEELCNT),W
MOVE A9,A0
SRL 24,A0
MOVE A0,*A13(TSPRINGCNT),W
SLL 24,A9
SRL 24,A9
ET_LOOP
CALLR ETS_SUB
JRLE ET_DIE
SLOOPR A11,ET_LOOP
ET_DIE
DIE
*
*SUBROUTINE FOR EXTRA_TROGS
*A10 = BASE I.D.
*RETURNS .GT. IF MORE TROGS TO START
* .LE. WE ARE DONE
* A10 = FULL EXTRA TROG OID
*NOTE: TRASHES A0
ETS_SUB
MOVE *A13(TSPRINGCNT),A0,W
JRZ ETS_1
MOVI TROGOID|GTROGID|SPRING,A10
**** ORI SPRING,A10
DEC A0
MOVE A0,*A13(TSPRINGCNT),W
CREATE TROGPID,TROGSPRG_PROCESS ;CREATE SPECIAL PROCESS
JRUC ETS_X
ETS_1
MOVE *A13(TWHEELCNT),A0,W
JRZ ETS_2
MOVI TROGOID|BTROGID|WHEEL,A10
**** ORI WHEEL,A10
DEC A0
MOVE A0,*A13(TWHEELCNT),W
JRUC ETS_CREATE
ETS_2
MOVE *A13(TCLUBCNT),A0,W
JRZ ETS_3
MOVI TROGOID|RTROGID|CLUB,A10
**** ORI CLUB,A10
DEC A0
MOVE A0,*A13(TCLUBCNT),W
JRUC ETS_CREATE
ETS_3
MOVE @TGEN_CNT,A10,W ;ARE WE IN WHACKO WAVE?
JRZ ETS_NORM_TROG ;BR = NO, CREATE NORMAL TROG
MOVI 4,A0 ;RANDO COLOR'D TROG
CALLA RANDU
DEC A0
SLL 30,A0 ;LAST MINUTE SAFETY
SRL 26,A0
ADDI TECHNICOLOR_TROGS,A0
MOVE *A0,A10,W
JRUC ETS_CREATE
ETS_NORM_TROG
MOVI TROGOID,A10 ;JUST START A NORMAL TROG
ETS_CREATE
CREATE TROGPID,TROG_PROCESS
ETS_X
DEC A9
RETS
TECHNICOLOR_TROGS
.WORD TROGOID,TROGOID|RTROGID,TROGOID|BTROGID,TROGOID|GTROGID
**************************************************************************
* *
* TROG_START_WAIT - PROCESS SUBROUTINE TO WAIT FOR START OF TROG IF *
* THE NUMBERS ARE NOT CORRECT. *
* IF THERE ARE TOO MANY TROGS, THEN THIS WILL JUST *
* CAUSE THE PROCESS TO DIE, UNLESS WE ARE INVOLVED IN *
* A BONUS WAVE. *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
TROG_START_WAIT
PUSHP A11
MOVE *A13(PROCID),A11,W
MOVIM INDPID,*A13(PROCID),W
TSW_LP
MOVE @TROG_CNT,A0,W
MOVE @NUM_TROGS,A1,W
CMP A1,A0
JRLO TSW_X
MOVE @BONUS_WAVE,A0,W
JAEQ DUMDIE
SLOOP 10,TSW_LP
TSW_X
MOVE A11,*A13(PROCID),W
PULLP A11
RETP
*
*TROG ANIMATION TABLE INDEX IS LOW 4 BITS OF TROG'S OID
TROG_ANIM_TAB:
.LONG TROGATAB, TROG_CLUB_ATAB, TROGATAB, TROGATAB
.LONG TROGATAB, TROGATAB, TROGATAB, TROGATAB
.LONG TROGATAB, TROGATAB, TROGATAB, TROGATAB
.LONG TROGATAB, TROGATAB, TROGATAB, TROGATAB
**************************************************************************
* *
* TROG_PROCESS - CREATE AND CONTROL THE BARE HAND TROG CHARACTER. *
* A10 = OID *
* *
**************************************************************************
TROG_PROCESS:
CALLA CLRPDATA ;CLEAR OUR DATA AREA
MOVE A10,A0
SLL 30,A0
SRL 30,A0
MOVB A0,*A13(TTYPE) ;STORE TROG'S TYPE
SLL 5,A0
ADDI TROG_ANIM_TAB,A0
MOVE *A0,A0,L ;PICK THE CORRECT ANIMATION TABLE
MOVE A0,*A13(DATABLE),L ;STORE ANIMATION TABLE
MOVK DOWN,A0
MOVE A0,*A13(DINITDIR),W ;STORE INITIAL DIRECTION
MOVE A10,*A13(DOID),W ;STORE THIS GUYS OID
MOVE @TROGSPEED,A1,W ;GET THIS WAVES INITIAL VELOCITY
ZEXT A1
MOVE A1,*A13(DSPEED),W ;KEEP THE INITIAL SPEED
ZEXT A1
SLL 4,A1
CALLA DINO_VEL ;SETUP THE INITIAL VELOCITY
MOVI TRAPTIME,A0 ;INITIAL DIG TIME
MOVE A0,*A13(TTRAPDIG),W
MOVI INITSPEEDUPS,A0 ;INITIAL SPEED UP COUNT
MOVB A0,*A13(TSPEEDUPS)
TROG_RANDOM_INIT:
JSRP TROG_RANDOM_FIND ;FIND A RANDOM SPOT TO APPEAR
CLR A0
MOVB A0,*A13(DPUNCHFLG) ;CLEAR FLAGS
MOVB A0,*A13(TPURSUIT) ;RESET PURSUIT FLAG
MOVB A0,*A13(TPRESET) ;CLEAR RESET PURSUIT FLAG COUNT
MOVE A0,*A13(TDINO),L ;CLEAR THE PURSUEE
MOVB A0,*A13(TTRAPPED) ;RESET TRAP VARIABLES
MOVE A0,*A13(TMINTL),L
MOVE A0,*A13(TMAXLR),L
MOVB A0,*A13(TSWINGS) ;CLEAR HIS CLUB SWING COUNT
MOVB A0,*A13(THITS) ;CLEAR HIS HIT POINTS
MOVB A0,*A13(TFREEZE)
NOT A0
MOVB A0,*A13(TPLAYER)
MOVB *A13(DDIZZYFLG),A0 ;IS HE DIZZY?
JRNZ TI_DIZZY ;BR = YES, THEN LEAVE FLAG ALONE
MOVK 1,A0 ;MAKE SURE HE'S NOT MUCKED WITH
MOVB A0,*A13(DDIZZYFLG)
TI_DIZZY
MOVB *A13(TTYPE),A3
CMPI TTYPE_WHL,A3 ;WHEEL GUY?
JREQ TI_SKIP_WAIT ;BR = YES, WHEEL COUNT IS ALL WE CARE
JSRP TROG_START_WAIT
TI_SKIP_WAIT
MOVE *A13(DOID),A14,W
SRL 2,A14
SLL 30,A14
SRL 25,A14
ADDI TINIT_TAB,A14
MOVE *A14,A14,L ;LOAD THE CORRECT TROG INITIALIZATION
CALLA GPALOBJSTF ;GET AN OBJECT AND STUFF
JRZ TROG_PROC_DIE ;BR = WE FAILED TO GET AN OBJECT
MOVE A0,A8
MOVE A13,*A8(OPLINK),L ;LINK THE PROC TO THE OBJ
MOVE *A13(DOID),*A8(OID),W ;STUFF THE I.D.
MOVE *A13(DATABLE),A10,L ;RELOAD THE ANIMATION TABLE
MOVB *A13(TTYPE),A3
CMPI TTYPE_WHL,A3 ;ARE WE A WHEEL WATCHER?
JREQ TROG_WHEEL ;BR = YES, DO ESPECIAL WHEEL STUFF
INCM @TROG_CNT,W
CMPI TTYPE_CLUB,A3 ;CLUB MAN
JRNE TROGI_NCL ;BR = NO
MOVK 1,A3
MOVE A3,@TROG_INTRO_FLAG,W ;CLUB GUY SHOULD NOT WAVE AT PLAYER
TROGI_NCL
MOVE @TGEN_CNT,A14,W
JRZ TROG_NORM_POINT
*WE DO THIS WHEN GENERATORS ARE PRESENT
MOVE *A13(DINITPOS),A1,L ;GET THE SELECTED GENERATOR
CALLR TROG_NEW_PNT ;CENTER TROG ON THIS NEW POINT
MOVIM DOWN,*A13(DINITDIR),W ;SET INITIAL DIRECTION
JRUC TROG_EMERGE
TROG_NORM_POINT
MOVE *A13(DINITPOS),A3,L ;LOOK FOR A GOOD SPOT, TO APPEAR
CALLA DINO_PNT_TST
JRZ TROGINIT_OKP ;BR = WE FOUND ONE, NO PROBLEM
SLEEP 30
MOVE *A13(DINITPOS),A3,L ;LET'S START LOOKING
CALLA FINDMOVE
JRNC TROGINIT_OKP ;BR = WIERDNESS, NO MOVE
MOVE *A13(DINITDIR),A0,W ;SHOW US THE WAY
CALLA DINOINIT_PNT_FIND ;FIND A FREE POINT
CALLA DSRCH_CLR ;CLEAR THE SEARCH MARKS
TROGINIT_OKP:
MOVE A3,A1
MOVE A3,*A13(DINITPOS),L ;STORE AWAY FOR SAFE KEEPING
CALLR TROG_NEW_PNT ;CENTER TROG ON THIS NEW POINT
CALLA FINDMOVE ;NOW FIND THIS MOVE
JRNC TROGINIT_NOSRCH ;BR = NOT A VALID MOVE, DON'T SEARCH
CALLA FIND_SAFEST ;FIND US THE SAFEST MOVE
MOVE A2,*A13(DINITDIR),W ;NEW INITIAL DIRECTION
MOVE A1,A0
MOVE A2,A1
CLR A3
CALLR FIND_MVD ;FIND A DINO TO CHASE
JRZ TROGINIT_NOSRCH ;BR = THERE ISN'T ONE
MOVE A2,*A13(DINITDIR),W ;NEW INITIAL DIRECTION
TROGINIT_NOSRCH:
MOVE *A13(DINITPOS),A9,L
CREATE TROGSUBPID,TROG_PIT ;START THE PIT FROM WHICH HE WILL EMERGE
SLEEP 61
*ENTRY POINT JUST TO MAKE TROG EMERGE FROM HIS SPACE
TROG_EMERGE
MOVK DOWN,A0
MOVE A0,*A13(DDIR),W ;HE WILL FACE DOWN FOR THIS
MOVI INTRODUCE,A0 ;WAVE AT THE PLAYER
CALLA DINOLOAD
MOVK 4,A1
JSRP FRANIM ;LOAD THE NEW FRAME
MOVI TROGUP,A1
MOVE A1,*A13(TWALKFRM),L ;INITIALIZE THE CURRENT WALKING FRAME
MOVI TROGS,A1
CALLA INSERT_OBJ_SUPP ;INSERT THIS 'TING
SLEEPR A0 ;SLEEP THE FRAME TIME
*PICK HERE WHICH SOUND WILL BE FIRED DEPENDING ON LAST DEATH
MOVB *A13(DDIZZYFLG),A0
CMPI 3,A0 ;DID HE BURN?
JREQ TROGINIT_COUGH ;BR = YES, THEN COUGH
**** SOUND1 TROGBIRTH_SND
JRUC TROGINIT_EMERGE
TROGINIT_COUGH:
SOUND1 TROGCOUGH_SND
TROGINIT_EMERGE:
MOVK 1,A1
JSRP FRANIM
SLEEP 10
**** MOVE @TROG_INTRO_FLAG,A0,W
**** JRNZ TROG_SKIP_INTRO
**** MOVK 1,A1
**** MOVE A1,@TROG_INTRO_FLAG,W
**** JSRP FRANIM
****TROG_SKIP_INTRO:
MOVE *A13(DINITDIR),A11,W
JSRP DINOTURN ;TURN THE DIRECTION YOU WISH TO GO
MOVE *A13(DINITPOS),*A13(TCURMPOS),L
**** MOVB @TROG_LOOK_COUNT,A6
**** MOVB A6,*A13(TNEXTLOOK)
MOVK 10,A0
CALLA RANDU
MOVB A0,*A13(TNEXTLOOK)
*
*PROCESS TRANSFER POINT FOR TROG WALKING PROCESS
* A8 = PTR TO TROG OBJECT
* *A13(DATABLE),L = PTR TO TROG ANIMATION TABLE
* *A13(DDIR),W = CURRENT TROG DIRECTION
* *A13(DOID) = OBJECT I.D. OF THIS TROG MAN
* *A13(TPLAYER),B = PLAYER # THAT TROG IS CURRENTLY CHASING
*
TROGWXFER
MOVE A13,A12
ADDI PRCSIZ,A12 ;RESET PROCESS STACK POINTER
CLR A0
MOVB A0,*A13(DPUNCHFLG) ;CLEAR FLAGS
MOVB A0,*A13(DDIZZYFLG)
MOVB A0,*A13(TFREEZE)
MOVE *A13(DOID),*A8(OID),W ;MAKE HIM A NORMAL TROGSTER
ANDNIM M_NOCOLL,*A8(OFLAGS),W ;MAKE SURE COLLISIONS ARE ON
MOVE *A13(DDIR),A11,W ;GET THE NEW DIRECTION
MOVE A11,A0
MOVE *A13(DATABLE),A10,L ;RESTORE THE ANIMATION TABLE
CALLR TROG_WALK_LOAD
**** CALLA GET_TROG_CPNT ;THIS IS HIS NEW CENTER
**** ADDI [5,0],A1
**** CALLA FIND_CLOSE_MPNT ;FIND THE CLOSEST MOVE POINT
CALLR GET_TROG_MPNT
MOVE A3,*A13(TCURMPOS),L ;AND STORE IT AS HIS CURRENT MOVE POS
CALLA BONED_IN ;ARE WE STUCK IN BONES?
JRNZ TROGBONE_BLOCK ;BR = NO SIR
MOVB *A13(TTYPE),A7
CMPI TTYPE_CLUB,A7 ;IS HE A CLUBBER?
JRNE TROG_TRAP_LOOK ;BR = NO
MOVE A11,A1 ;LET'S FIND A BONE TO SMASH
CALLA ONE_MOVE ;CHECK THE WAY WE ARE GOING
JRZ TROG_TRAP_LOOK ;BR = NO MOVE HERE
MOVB *A1(MOVEPLYR),A7 ;IS THERE A BONE WHERE WE TURNED
CMPI PXPLAYER,A7
JREQ TROG_TRAP_LOOK
MOVE A1,A0
JRUC TROG_BONE_SMASH ;SMASH-A-BONE!
TROG_TRAP_LOOK:
CALLR TRAP_CHECK ;IS HE STUCK HERE
JRNZ TROG_DIG ;BR = YES HE IS, DIG AWAY
TROGBONE_BLOCK:
SRL 16,A4 ;CHECK TO SEE IF THERE IS A BONE AHEAD
BTST A11,A4
JREQ TROGWLP ;BR = NOPE
MOVE A11,A1 ;LET'S FIND THE BONE
CALLA ONE_MOVE ;GOT TO BE THIS WAY
JRZ TROGWLP
MOVE A1,A0
CALLA BONE_OBJ ;GET THE BONE OBJECT
JRZ TROGWLP ;NONE FOUND
MOVE A1,A9
JRUC TROGDEFL ;ACT LIKE YOU RAN INTO IT
*
*A11 = CURRENT TROG DIRECTION HERE
*
TROGWLP
MOVE A9,*A13(TWALKFRM),L ;STORE THIS AS THE CURRENT WALK FRAME
MOVE @GAME_STATE,A1,W
CMPI INGAME,A1 ;ARE WE BONUSING?
JRNE TROG_CONTINUE
MOVI STANDU,A0
JSRP FRANIMATE_DIR
MOVE A11,A0
CALLA DINOLOAD ;RESET FOR NEXT
ANDNIM M_NOCOLL,*A8(OFLAGS),W
JRUC TROGWLP
TROG_CONTINUE:
CLR A1
JSRP DINO_FRANIM
ANDNIM M_NOCOLL,*A8(OFLAGS),W ;MAKE SURE COLLISIONS ARE ON
MOVE A11,A1 ;AND PUT IT IN THE CORRECT PLACE
CALLR TROG_VEL_NORMAL ;RETURN TROG VELOCITY TO NORMAL
CALLA BOUNDRY_CHECK
JRNE TROG_OUT_OF_BOUNDS
**** CALLR GET_TROG_CPNT ;GET TROG'S CENTER POINT
**** ADDI [5,0],A1 ;FUDGE FOR THE DOWN DIRECTION
**** CALLA FIND_CLOSE_MPNT ;AND FIND THE CLOSEST MOVE POINT
CALLR GET_TROG_MPNT
MOVE *A13(TCURMPOS),A2,L ;GET THE CURRENT CENTER POINT
CMP A2,A3 ;SAME MOVE AS LAST TIME?
JREQ TROGWLP ;BR = YES, THEN KEEP ON TRUCKIN'
MOVI [4,4],A2 ;TROG MUST BE WITHIN THIS RANGE
CALLA PNT_IN_RANGE ;IS HE?
JRNC TROGWLP ;BR = NO
MOVE A3,*A13(TCURMPOS),L ;STORE THIS NEW [Y,X] OF THE MOVE PNT
MOVB *A13(TNEXTLOOK),A6
DEC A6 ;DECREMENT NEXT LOOK COUNTER
MOVB A6,*A13(TNEXTLOOK)
*CHECK TO SEE IF TROG IS IN PURSUIT OF A DINOSAUR THAT HAS TURNED INTO TREX
MOVB *A13(TPURSUIT),A6
JREQ TROGW_NP
MOVE *A13(TDINO),A6,L
JRZ TROGW_NP
MOVE *A6(OPLINK),A6,L
JRZ TROGW_NP
MOVB *A6(DTREXFLG),A6
JRZ TROGW_NP
CALLR CLEAR_PURSUIT
**** MOVB @TROG_LOOK_COUNT,A6
**** MOVB A6,*A13(TNEXTLOOK) ;RE-LOAD NEXT LOOK
MOVK 10,A0
CALLA RANDU
MOVB A0,*A13(TNEXTLOOK)
MOVI CLUBOUTU,A0
JSRP FRANIMATE_DIR ;STAND AND SHUDDER
SLEEP 30
*A11 = TROG DIRECTION
TROG_MACHA_MACHA
SOUND1 TROGUHOH_SND
CALLA NOTDIR
JSRP DINOTURN
JRUC TROGWXFER
*CHECK IF BLIND PURSUIT IS OVER
TROGW_NP:
MOVB *A13(TPRESET),A6
DEC A6 ;DECREMENT PURSUIT FLAG RESET COUNTER
JRN TROG_P_RESET ;BR = TIME TO RESET
MOVB A6,*A13(TPRESET)
JRUC TROG_CK_EDGE
TROG_P_RESET:
CLR A6
MOVB A6,*A13(TPURSUIT) ;CLEAR THE PURSUIT FLAG
TROG_CK_EDGE:
MOVE *A0(MOVEEPTR),A4,L ;IS THIS A DEATH SPOT?
JRN TROG_NOT_NEAR_EXIT ;BR = NO
MOVB *A4(EMOVEDIR),A5 ;GET THE DIRECTION OF THE EXIT
CMP A11,A5 ;IS HE WALKING THAT WAY?
JRNE TROG_NOT_NEAR_EXIT ;BR = NO
*
*NOTE: MAKE TROG LOOK OVER THE EDGE HERE, PAUSE, THEN ABOUT FACE
*A0 NOT GUARANTEED TO HOLD MOVE PTR HERE
TROG_NEAR_EXIT:
MOVB *A13(TPURSUIT),A6 ;IS HE ON SOMEONES TAIL?
JRNZ TROGWLP ;BR = YES, THEN JUST FALL OFF
MOVI STANDU,A0
JSRP ANIMATE_DIR ;STAND
SLEEP 10 ;PAUSE
CALLA NOTDIR
JSRP DINOLOOK_TURN ;ABOUTFACE
MOVE A11,A0
CALLA DINOLOAD ;LOAD THE WALKING FRAME
JRUC TROGWLP ;START TO WALKIN'
TROG_NOT_NEAR_EXIT:
MOVE A11,A1
CALLA ONE_MOVE ;GET ADJACENT MOVE
JRZ TROG_NEAR_EXIT ;BR = MUST BE NEAR AN EDGE?
JSRP TROG_LOOK_FOLLOW ;MUST PRESERVE A0,A1 THROUGH HERE
JRC TROG_FOLLOW_CK ;BR = YES, BUT HE CAN'T SEE IT
JRNZ TROGWLP ;HE FOUND SOMETHING
TROG_FOLLOW_CK:
MOVE A11,A1
CALLA ONE_MOVE ;GET A NEW ADJACENT IN CASE HE TURNED
JRZ TROG_NEAR_EXIT ;BR = HE TURNED AND NOW FACES DEATH
MOVE *A0(MOVECPTR),A5,L ;IS CURRENT MOVE A CENTER POINT?
JRNN TROG_CK_LOOK ;BR = YES, JUST TRY TO LOOK
MOVB *A13(TPURSUIT),A6 ;IS HE ON SOMEONES TAIL?
JRNZ TROG_CK_LOOK ;YES, THEN JUST FOLLOW
MOVE *A1(MOVECPTR),A4,L ;IS ADJACENT MOVE A CENTER?
JRN TROG_CK_LOOK ;BR = NO HANDLE NORMAL SCAN
MOVE A0,A6
MOVE A4,A0
CALLR CENTER_CHECK
JRNZ TROG_NEAR_EXIT ;DO NOT CONTINUE IN THIS DIRECTION
JRC TROG_NO_POUND ;BR = NOT TOTALLY EMPTY
MOVB *A13(TTYPE),A7
CMPI TTYPE_CLUB,A7 ;CLUB MAN?
JRNE TROG_NO_POUND ;BR = NO
MOVB *A4(CMOVETROG),A7 ;DOES TROG WANT TO JAM THIS SPOT
**** INC A7
**** JRZ TROG_NO_PIT ;BR = NO
**** DEC A7
CMPI PITID,A7
JRNE TROG_NO_PIT
MOVE *A4(CMOVEMPTR),A0,L ;GET THE MOVE TO POUND
JRUC TROG_HOLE_OPEN
*
*CHECK REVERSE MOVE TO SEE IF WE SHOULD START THE FIRE
TROG_NO_PIT:
MOVE A6,A0
MOVE A11,A7
MOVE A1,A4
CALLR NOTDIR
MOVE A11,A1
CALLA ONE_MOVE
JRZ TROG_NO_FIRE
MOVE *A1(MOVECPTR),A0,L ;IS THE REVERSE MOVE A CENTER?
JRN TROG_NO_FIRE ;BR = NO, JUST CONTINUE
CALLR CENTER_CHECK ;CHECK THAT CENTER
JRC TROG_NO_FIRE ;BR = NOT TOTALLY EMPTY
MOVB *A0(CMOVETROG),A2
CMPI FIREID,A2 ;DO WE WANT TO START A FIRE HERE
JRNE TROG_NO_FIRE ;BR = NO
MOVE *A0(CMOVEMPTR),A0,L ;GET THE MOVE TO POUND
PUSHP A0
**** MOVI [0,0202H],A1
**** JSRP FRANIM ;TAKE A COUPLE MORE STEPS
JSRP DINOTURN ;ABOUT FACE
PULLP A0
JRUC TROG_FIRE_START
TROG_NO_FIRE:
MOVE A4,A1
MOVE A7,A11
*A6 = PTR TO CURRENT MOVE
TROG_NO_POUND:
MOVE A6,A0
*
*A0 = CURRENT MOVE PTR
*A1 = ADJACENT MOVE IN THE CURRENT DIRECTION
*A5 = *A0(MOVECPTR),L
TROG_CK_LOOK:
MOVE A5,A5 ;SAFETY CENTER CHECK
JRN TROG_CK_TRAP ;BR = NOT A CENTER
MOVB *A13(TTYPE),A3
CMPI TTYPE_CLUB,A3
JRNE TROG_CK_TRAP
MOVB *A13(TPURSUIT),A6 ;IS HE ON SOMEONES TAIL?
JRNZ TROG_CK_TRAP ;YES, THEN JUST FOLLOW
MOVB *A1(MOVEPLYR),A3 ;IS THERE AN ADJACENT BONE?
JRN TROG_CK_TRAP ;BR = NO
CMPI PXPLAYER,A3
JREQ TROG_CK_TRAP
MOVB *A13(TSWINGS),A3
CMPI 3,A3
JRLO TROG_MAY_SMASH
CLR A3
MOVB A3,*A13(TSWINGS)
JRUC TROG_CK_TRAP
TROG_MAY_SMASH
MOVE A1,A0
JRUC TROG_BONE_SMASH ;JUST BUST A MOVE
TROG_CK_TRAP:
MOVB *A13(TTRAPPED),A3
JRNZ TROG_TRAPPED
MOVE *A0(MOVEPOS),A3,L
CALLR TRAP_CHECK ;SEE IF HE IS TRAPPED
JRZ TROG_LOOK_OK ;BR = NO HE IS NOT
TROG_TRAPPED:
MOVE A5,A0 ;IS HE ON A CENTER POINT?
JRN TROGWLP ;BR = NO, WAIT UNTIL WE HIT ONE
JRUC TROG_DIG ;BR = DIG IT!
*A0 = MOVE POINT DATA
*A5 = CORRESPONDING CENTER POINT DATA
TROG_LOOK_OK:
MOVE *A13(TTYPE),A6
CMPI TTYPE_CLUB,A6
JRNE TROG_LOOK_FOR_NEXT
MOVE A5,A5 ;IS THE CURRENT POINT A CENTER?
JRN TROG_LOOK_FOR_NEXT ;BR = NO
MOVE A0,A6
MOVE A1,A7
MOVE A0,A1
MOVE A11,A0
CALLA TWO_MOVES ;GET THE MOVE THAT IS TWO AWAY
JRZ TROG_NOT_TWO ;BR = THERE IS NO MOVE THERE.
MOVE A1,A0
MOVE *A0(MOVECPTR),A1,L ;IS THIS A CENTER
JRN TROG_NOT_TWO ;BR = NO?
MOVB *A13(TPURSUIT),A2 ;IS HE ON SOMEONES TAIL?
JRNZ TROG_NOT_TWO ;YES, THEN JUST FOLLOW
MOVB *A1(CMOVEEGG),A2
INC A2 ;SOMETHING ON THAT SPOT?
JRZ TROG_NOT_TWO ;BR = NO
DEC A2
MOVB *A1(CMOVETROG),A1
CMP A2,A1 ;DID TROG PUT IT THERE?
JRNE TROG_NOT_TWO ;BR = NO
MOVE A6,A0
MOVE A7,A1
JRUC TROG_SHALL_LOOK
TROG_NOT_TWO:
MOVE A6,A0
MOVE A7,A1
TROG_LOOK_FOR_NEXT:
MOVB *A13(TNEXTLOOK),A6
JRGT TROGWLP ;BR = NOT TIME TO LOOK AROUND YET
TROG_SHALL_LOOK:
MOVE *A13(TDINO),A4,L ;IS TROG CHASING A DINOSAUR
JRZ TROG_SELECT_NEW_DINO ;BR = NO, GET A NEW ONE
MOVE A0,A6
MOVB *A13(TPLAYER),A0
CALLA GPLAYD
MOVE A6,A0
MOVE *A2(PBOZO),A6,W ;HAS THIS PLAYER BECOME A BOZO?
CMPI 2,A6
JRLO TROGWLP
**** JREQ TROGWLP ;BR = NO, KEEP AFTER HIS ASS
TROG_SELECT_NEW_DINO:
CALLR CLEAR_PURSUIT ;CLEAR THE PURSUIT SO WE CAN SNAG
CALLA SELECT_DINO
JRNZ TROG_STUFF_DINO
CLR A4
MOVE A4,*A13(TDINO),L
NOT A4
MOVB A4,*A13(TPLAYER)
JRUC TROG_NOT_AFTER
TROG_STUFF_DINO:
MOVE A4,*A13(TDINO),L
MOVE *A4(OID),A2,W
SLL 28,A2
SRL 28,A2
MOVB A2,*A13(TPLAYER)
CALLR CLEAR_TRAP
JRUC TROGWLP ;AND GO FOR HIM
TROG_NOT_AFTER:
MOVE A5,A5 ;EEZ ZEES A ZENTER POYANT?
JRN TROGWLP ;BR = NO
MOVB *A13(TTYPE),A6
CMPI TTYPE_CLUB,A6 ;CLUB MAN?
JRNE TROG_NOT_ANLK ;BR = NO, JUST CHECK FOR NEXT LOOK
CALLR TROG_FIND_TRAP ;FIND A PLACE TO SET A TRAP
JRZ TROG_NOT_ANLK ;COULDN'T FIND ANY THAT NEED SETTING
MOVE *A13(DDIR),A11,W ;RESTORE DIRECTION
MOVE A1,A4
CALLR GET_BEST_DIR_TO_MOVE ;GET THE DIRECTION TO THE POINT
JRZ TROGWLP
MOVK 2,A6
MOVB A6,*A13(TNEXTLOOK) ;NEXT LOOK WILL NOT TAKE AS LONG
CMP A1,A11
JREQ TROGWLP
MMTM A12,A0,A1
CLR A1
JSRP DINO_FRANIM ;TAKE ONE MORE STEP
MOVE *A12(20H),A0,L ;RESTORE MOVE FOR A SECOND
CALLR TROG_CENTER
MOVI LOOKBOTHU,A0
JSRP ANIMATE_DIR
MMFM A12,A0,A1
MOVE A1,A11
JSRP DINOTURN
JRUC TROGWXFER
TROG_NOT_ANLK:
PUSHP A0
**** MOVB @TROG_LOOK_COUNT,A6
**** MOVB A6,*A13(TNEXTLOOK) ;RE-LOAD NEXT LOOK
MOVK 10,A0
CALLA RANDU
MOVB A0,*A13(TNEXTLOOK)
CLR A1
JSRP DINO_FRANIM ;TAKE ONE MORE STEP
MOVE *A12,A0,L ;RESTORE MOVE FOR A SECOND
CALLR TROG_CENTER
MOVI LOOKBOTHU,A0
JSRP ANIMATE_DIR
PULLP A0
MOVE *A13(DDIR),A11,W
CMPI UP,A11
JRNE TROG_CKD
TROG_LR:
MOVI LEFT,A6
MOVI RIGHT,A7
JRUC TROG_CK_CHOOSE
TROG_CKD:
CMPI DOWN,A11
JREQ TROG_LR
MOVI UP,A6
MOVI DOWN,A7
TROG_CK_CHOOSE:
CALLA NOTDIR
MOVE A11,A5
CALLR TROGCHOOSE
JSRP DINOTURN
JRUC TROGWXFER
TROG_OUT_OF_BOUNDS:
CALLR SCORE_TO_PLAYER ;SCORE TO THE WORLD, TROG IS DEAD
CALLA GET_TROG_CPNT ;GET THE CENTER POINT OF TROGGY
CALLA FIND_CLOSE_EPNT ;FIND OUT WHERE HE FELL OFF
MOVE A0,A4
PUSHP A4 ;STORE THE PTR TO EXIT AREA
CALLA NOTDIR ;APPEAR IN THE REVERSE DIRECTION
MOVE A11,*A13(DINITDIR),W ;MAKE THIS THE NEW DIRECTION
CMPI TYPE_PIT,A5 ;DID WE DIE IN A PIT?
JREQ TROG_PIT_DEATH ;BR = YES SIR
CMPI TYPE_VOLCANO,A5
JREQ TROGVOLCANO
TROG_CLIFF_DEATH:
MOVI DEADTROGOID,A0 ;MARK TROG AS DEAD
MOVE A0,*A8(OID),W
*CHECK TO SEE IF ANYONE HAD A HOUSE HERE
MOVE A4,A4
JRZ TROG_OFF_EDGE
MOVE *A4(EMOVEOBJ),A0,L
JRZ TROG_OFF_EDGE
MOVE *A13(DDIR),A11,W
CMPI DOWN,A11
JRNE TROG_DEATH_HOUSE_PIT
MOVI [0,0302H],A1 ;TAKE SOME EXTRA STEPS
JSRP DINO_FRANIM
MOVE *A12,A4,L ;RETRIEVE THE EXIT POINTER
TROG_DEATH_HOUSE_PIT:
MOVE A4,A9
CREATE INDPID,HOUSE_PIT
MOVI OGPITU,A0
JSRP FRANIMATE_DIR
MOVK 1,A1
JSRP FRANIM ;RUN THE REST OF THE SCRIPT
JRUC TROG_DEATH_DONE
TROG_OFF_EDGE:
CALLA BTYPE_CK
JRNZ TDEATHLAVA
MOVI DEATH_UP,A0 ;DEFAULT ON NORMAL DEATH
JRUC TDEATHLAN
TDEATHLAVA:
MOVI LAVADIEU,A0
JRUC TDEATHLAN
TDEATHLAN:
JSRP FRANIMATE_DIR
JRUC TROG_DEATH_DONE
*
*ANIMATE PIT DEATH ANIMATION WITH CENTER POINT DRIFT
*A6 = PIT [Y,X] CENTER POINT
TROG_PIT_DEATH:
MOVI DEADTROGOID,A0 ;MARK TROG AS DEAD
MOVE A0,*A8(OID),W
PUSHP A6
MOVI PIT_DEATH_UP,A0
JSRP FRANIMATE_DIR ;ANIMATE THE FLAIL
CALLA GETCPNT ;GET TROGS CENTER POINT
MOVE A1,A2
PULLP A3
MOVI 25*4,A4 ;AVERAGE SPIN DURATION
CALLA SLINEVEL
MOVE A1,*A8(OXVEL),L
MOVE A2,*A8(OYVEL),L
MOVK 1,A1
JSRP FRANIM ;NOW ANIMATE THE REST
CALLA PSTOP
JRUC TROG_DEATH_DONE
TROGVOLCANO:
PULLP A4
MOVI STANDU,A0
JSRP ANIMATE_DIR ;STAND
SLEEP 5 ;PAUSE
CALLA NOTDIR
JSRP DINOLOOK_TURN ;ABOUTFACE
**** MOVE A11,A0
**** CALLA DINOLOAD ;LOAD THE WALKING FRAME
CALLR TROG_WALK_LOAD
MOVI 0802H,A1 ;ANIMATE A LITTLE WAY BEFORE RESUMING
JSRP DINO_FRANIM
MOVE *A13(DOID),*A8(OID),W ;STUFF THE I.D.
JRUC TROGWLP ;START TO WALKIN'
*
*MUST HAVE PTR TO EXIT MOVE PUSHED ON THE PROCESS STACK
*IF = 0 THEN BLOW OFF THEN *A13(DINITPOS),L IS STUFFED
TROG_DEATH_DONE:
PULLP A4
MOVE A4,A4
JREQ TROGDEATH_OLD_RET
MOVE *A4(EMOVERET),A0,W
JRN TROGDEATH_OLD_RET ;BR = RETURN TO THE OLD POSITION
CALLA GETMOVE ;GET THE MOVE POINT
MOVE *A0(MOVEPOS),*A13(DINITPOS),L ;AND GET THE POSITION
TROGDEATH_OLD_RET:
MOVE *A13(DOID),A10,W ;RESTORE HIS I.D.
CLR A1
MOVB A1,*A13(DPUNCHFLG)
CALLR DELETE_TROG
**** MOVE @BONUS_WAVE,A0,W
**** JRNE TROG_PROC_DIE
**** SLEEP 150 ;WAIT A LITTLE BIT BEFORE RE-INIT
**** JRUC TROG_RANDOM_INIT ;FIND A RANDOM START POSITION
****TROGDEATH_EATEN
**** MOVE *A13(DOID),A10,W ;RESTORE HIS I.D.
**** CLR A1
**** MOVB A1,*A13(DPUNCHFLG)
**** CALLR DELETE_TROG
**** MOVE @BONUS_WAVE,A0,W ;ARE WE ON THE BONUS
**** JRNE TROG_PROC_DIE ;BR = BLOW THIS OFF
**** SLEEPM @POWERUP_DURATION,W
****TROGDEATH_WTREX
**** SLEEP 60 ;DEFAULT WAIT
**** CALLA CK_TREX ;WAIT FOR THE TREX TO GO
**** JRNZ TROGDEATH_WTREX
**** JRUC TROG_RANDOM_INIT ;FIND A RANDOM START POSITION
TROG_PROC_DIE:
DIE
**************************************************************************
* *
* DELETE_TROG - ROUTINE TO REMOVE TROG FROM PLAY. *
* A8 = PTR TO TROG *
* NOTE: TRASHES A14 *
* *
**************************************************************************
DELETE_TROG
PUSH A1
MOVI TROGS,A1
CALLA DELETE_OBJ_SUPP ;OFF THE LISTS
DECM @TROG_CNT,W
PULL A1
RETS
**************************************************************************
* *
* TROG_WALK_LOAD - ROUTINE TO LOAD THE TROGS CORRECT WALKING SCRIPT. *
* A8 = PTR TO TROG *
* A10 = PTR TO TROG ANIMATION TABLE *
* A11 = PTR TO CURRENT TROG DIRECTION *
* A13 = PTR TO TROG PROCESS *
* RETURNS: *
* A9 = PTR TO ANIMATION *
* X,Y & Z VELOCITIES STUFFED IN THE OBJECT *
* *
**************************************************************************
TROG_WALK_LOAD
MOVE A11,A0
CALLA DINOLOAD
MOVE A9,*A13(TWALKFRM),L
RETS
**************************************************************************
* *
* TROG_WHEEL - JUMP HERE FOR TROG TO CONTROL THE WHEEL *
* A8 = PTR TO ALLOCATED OBJECT NOT YET INSERTED ON LISTS. *
* A10 = PTR TROG ANIMATION TABLE *
* A13 = PTR TO INITIALIZED TROG PROCESS. *
* *
**************************************************************************
TROG_WHEEL:
MOVE @WHEEL_CNT,A0,W
MOVE @NUM_WHEELS,A1,W
CMP A1,A0
JRHS TROGWHL_SLEEP
JSRP TROG_RANDOM_FIND ;LOOK FOR A GOOD SPOT TO APPEAR
MOVE *A13(DINITPOS),A3,L
CALLA DINO_PNT_TST ;TEST THAT SPOT
JRZ TROGWHL_OKP ;BR = IT'S CLEAR TO APPEAR
SLEEP 30
MOVE *A13(DINITPOS),A1,L ;LET'S START LOOKING
CALLA FIND_CLOSE_MPNT
MOVE A0,A1
MOVE *A13(DINITDIR),A0,W ;SHOW US THE WAY
CALLA DINOINIT_PNT_FIND ;FIND A FREE POINT
CALLA DSRCH_CLR ;CLEAR THE SEARCH MARKS
TROGWHL_OKP:
MOVE A3,A1
MOVE A3,*A13(DINITPOS),L ;STORE AWAY FOR SAFE KEEPING
CALLR TROG_NEW_PNT ;CENTER TROG ON THIS NEW POINT
CALLA FIND_CLOSE_MPNT ;GET ADDRESS IN CASE IT'S NEW
MOVE A0,A1
CALLA FIND_SAFEST ;FIND US THE SAFEST MOVE
MOVE A2,*A13(DINITDIR),W ;NEW INITIAL DIRECTION
MOVE A1,A0
MOVE A2,A1
MOVK 1,A3
CALLR FIND_MVD ;FIND A DINO TO CHASE
JRZ TROGWHL_RESTD ;BR = THERE ISN'T ONE
MOVE A2,*A13(DINITDIR),W ;NEW INITIAL DIRECTION
JRUC TROGWHL_LOOKT
TROGWHL_RESTD
MOVE A1,A2 ;RESTORE OLD DIRECTION
TROGWHL_LOOKT
MOVE A0,A1
MOVE A2,A0
CALLR BLOCK_IN_TWO
JRZ TROGWHL_SLEEP
*
*POSITION IS PICKED, NOW BRING TROG OUT AND TOSS A WHEEL
*
TROGWHL_NOSRCH:
MOVE *A13(DINITPOS),A9,L
MOVE A13,A11
CLR A1
MOVE A1,*A13(PCOMM),W ;CLEAR THE COMMUNICATION LINE
CREATE TROGSUBPID,TROG_PIT_COMM ;START THE PIT FROM WHICH HE WILL EMERGE
JRZ TROGWHL_SLEEP ;BR = NO PIT, JUST HANG OUT
MOVE A0,A11 ;KEEP THE PIT POINTER HERE
SLEEP 1 ;LET THE PIT CREATE PROC TRY
MOVE *A13(PCOMM),A0,W
CMPI COMM_PIT_FAIL,A0 ;DID IT FAIL?
JREQ TROGWHL_SLEEP ;BR = YES, TRY LATER
MOVI COMM_PIT_OPEN,A2
MOVI 100,A3
JSRP COMM_WAIT ;WAIT FOR PIT TO OPEN
JRNZ TROGWHL_SLEEP
MOVE *A13(DINITDIR),*A13(DDIR),W ;FACE HIM IN THE THROW DIRECTION
MOVI WHEELU,A0 ;WAVE AT THE PLAYER
CALLA LOAD_DIR
MOVK 4,A1
JSRP FRANIM ;LOAD THE NEW FRAME
MOVI TROGS,A1
CALLA INSERT_OBJ_SUPP ;INSERT THIS 'TING
MOVE A0,A5
CREATE WHEELPID,WHEEL_PROCESS
SLEEPR A5 ;SLEEP THE FRAME TIME
CLR A1
MOVB A1,*A13(DDIZZYFLG) ;BUST'EM OR BLAST'EM
MOVK 1,A1
JSRP DINO_FRANIM
SLEEP 60
TROGWHL_DONE
MOVK 1,A1
MOVB A1,*A13(DDIZZYFLG)
JSRP FRANIM
MOVI TROGS,A1
CALLA DELETE_OBJ_SUPP ;OFF THE LISTS
MOVE *A11(PROCID),A0,W
CMPI TROGSUBPID,A0 ;IS A11 STILL THE PIT PROCESS?
JRNE TROGWHL_SLEEP ;BR = NO
MOVI COMM_PIT_CLOSE,A1
CALLA SEND_COMM
TROGWHL_SLEEP:
DIE
**************************************************************************
* *
* BLOCK_IN_TWO - CHECK TO SEE IF THERE IS A BLOCK TWO MOVES AWAY. *
* A0 = DIRECTION *
* A1 = PTR TO MOVE *
* RETURNS *
* Z = THERE IS A BLOCK IN THAT DIRECTION *
* NZ = NO BLOCK *
* *
**************************************************************************
BLOCK_IN_TWO
MMTM SP,A0,A1
CALLA TWO_MOVES
JRZ BIT_X
MOVE A1,A0
CALLA BLOCK_CHECK
BIT_X
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* TROG_RANDOM_FIND - PROCESS SUBROUTINE TO FIND A RANDOM CENTER POINT *
* FOR TROG TO APPEAR. *
* A13 = PTR TO TROG STRUCTURE. *
* RETURNS: *
* *A13(DINITPOS),L = [Y,X] POSITION TO APPEAR *
* NOTE: CALL WITH JSRP *
* TRASHES ALL BUT A8,A9,A10,A11 *
* *
**************************************************************************
TROG_RANDOM_FIND:
MOVE @TGEN_CNT,A0,W
JRNZ TRF_GENERATOR
CALLA FIND_OPEN_CPNT
JRNZ TROG_RANDOM_CPNT
TROG_RANDOM_AGAIN:
SLOOP 10,TROG_RANDOM_FIND
TROG_RANDOM_CPNT:
MOVB *A13(TTRAPPED),A2
JRZ TROG_RANDOM_OK
MOVE *A13(TMINTL),A3,L
MOVE *A13(TMAXLR),A4,L
MOVE A4,A5
SUB A3,A5
MOVI TRAPSIZE,A6
CMPXY A6,A5
JRXLE TROG_RANDOM_CK
JRYGT TROG_RANDOM_OK ;BR=TRAP BOX IS HUGE,TOO HUGE TO CARE
TROG_RANDOM_CK:
MOVE *A1(CMOVEPOS),A2,L
CMPXY A3,A2
JRXLT TROG_RANDOM_OK
JRYLT TROG_RANDOM_OK
CMPXY A4,A2
JRXGT TROG_RANDOM_OK
JRYLE TROG_RANDOM_AGAIN ;BR = THIS POINT IS IN THE TRAP BOX
TROG_RANDOM_OK:
MOVE *A1(CMOVEPOS),*A13(DINITPOS),L ;FIND US A STARTING MARK
RETP
*
*TROG GENERATORS ARE PRESENT, MAKE HIM APPEAR IN ONE OF THOSE
*A0 = GENERATOR COUNT
TRF_GENERATOR
CALLA RANDU ;PICK FROM THE BATCH OF GENERATORS
DEC A0
SLL 5,A0
ADDI TGEN_CPTRS,A0
MOVE *A0,A1,L ;GRAB THE CENTER POINT DATA
JRUC TROG_RANDOM_OK ;AND RETURN
**************************************************************************
* *
* TROG_BONE_SMASH - ENTRY POINT FOR TROG TO SWING AND SMASH A BONE. *
* A0 = PTR TO MOVE THAT THE BONE IS RESTING UPON *
* A8 = TROG OF COURSE *
* A13 = PTR TO TROGS DATA STRUCTURE *
* NOTE: JUMPS TO TROGWXFER *
* *
**************************************************************************
TROG_BONE_SMASH:
PUSHP A0
MOVI CLUBU,A0
JSRP ANIMATE_DIR ;THIS RETURNS A10 & A11 CORRECTLY
PULLP A0
CALLA BONE_SMASH
PUSHP A0
JSRP DINO_FRANIM
PULLP A0
MOVB *A0(MOVEPLYR),A6 ;DID TROG DESTROY THE BONE?
JRNN TROG_BONE_STILL ;BR = NO
CLR A3
*** MOVE *A13(DDIR),A11,W
MOVE A11,A1
CALLR SEARCH_DINO ;DID WE UNCOVER SOMETHING?
JRZ TROG_BONE_STILL ;BR = NO
MOVE *A4(OPLINK),A6,L
JRZ TROG_BONE_STILL
MOVB *A6(DTREXFLG),A6
JRZ TROG_BONE_AHA
*** MOVE *A13(DATABLE),A10,L
CLR A6
MOVB A6,*A13(TPURSUIT) ;RESET PURSUIT VARIABLES
MOVB A6,*A13(TPRESET)
JRUC TROG_MACHA_MACHA
TROG_BONE_AHA
SOUND1 TROGAHA_SND
TROG_BONE_STILL:
MOVB *A13(TSWINGS),A6
INC A6
MOVB A6,*A13(TSWINGS)
CLR A6
MOVB A6,*A13(TPURSUIT) ;RESET PURSUIT VARIABLES
MOVB A6,*A13(TPRESET)
JRUC TROGWXFER
**************************************************************************
* *
* TROG_HOLE_OPEN - ENTRY POINT FOR TROG TO BUST A HOLE IN THE GROUND. *
* A0 = PTR TO MOVE THAT TROG WISHES TO BUST OPEN *
* A8 = TROG OF COURSE *
* A13 = PTR TO TROGS DATA STRUCTURE *
* NOTE: JUMPS TO TROGWXFER *
* *
**************************************************************************
TROG_HOLE_OPEN:
MOVE *A0(MOVECPTR),A1,L ;IS THIS INDEED A CENTER POINT
JRZ TROGWXFER ;BR = NO
MOVE A0,A11 ;KEEP MOVE POINT
MOVK 3,A0 ;POUND IT THIS MANY TIMES BEFORE HOLE
TROG_HOLE_LP:
CALLA VALID_CPNT ;IS IT VALID?
JRZ TROGWXFER ;BR = NO
MMTM A12,A0,A1,A11
MOVI CLUBHOLEU,A0
JSRP ANIMATE_DIR
MMFM A12,A0,A1,A11
DEC A0
JRZ TROG_OPEN_PIT
MMTM A12,A0,A1,A11
CREATE INDPID,DENT_GROUND
MOVK 1,A1
JSRP FRANIM
MMFM A12,A0,A1,A11
JRUC TROG_HOLE_LP
TROG_OPEN_PIT:
MOVE A9,A11
MOVE A1,A9
CREATE INDPID,OPEN_PIT
MOVE A11,A9
MOVK 1,A1
JSRP FRANIM ;ANIMATE THE FINAL RECOIL
MOVK 1,A6
MOVB A6,*A13(TNEXTLOOK)
JRUC TROG_REV
**************************************************************************
* *
* TROG_FIRE_START - ENTRY POINT FOR TROG TO START A FIRE. *
* A0 = PTR TO MOVE THAT TROG WISHES TO LIGHT. *
* A8 = TROG OF COURSE *
* A13 = PTR TO TROGS DATA STRUCTURE *
* NOTE: JUMPS TO TROGWXFER *
* *
**************************************************************************
TROG_FIRE_START:
MOVE *A0(MOVECPTR),A10,L ;IS THIS INDEED A CENTER POINT
JRZ TROGWXFER ;BR = NO
MOVE *A13(DSMULT),A9,W ;PASS TROG'S SLEEP MULTIPLIER
MOVE *A13(DDIR),A11,W
CREATE TROGSUBPID,LIGHT_MY_FIRE
MOVI STOKEFIREU,A0
JSRP FRANIMATE_DIR
MOVK 1,A6
MOVB A6,*A13(TNEXTLOOK)
JRUC TROG_REV
**************************************************************************
* *
* TROG_LOOK_FOLLOW - TROG LOOKS FOR A DINO THEN TRIES TO FOLLOW HIM, *
* IF HE CAN. *
* A0 = PTR TO CURRENT TROG MOVE *
* A8 = PTR TO TROG *
* A10 = PTR TO ANIMATION TABLE *
* A11 = CURRENT DIRECTION *
* A13 = PTR TO TROG PROCESS DATA STRUCTURE *
* RETURNS: *
* Z = NOTHING WAS FOUND, NO CHANGES WERE MADE *
* NZ = HE IS NOW FOLLOWING SOMETHING. *
* C = HE'S FOLLOWING SOMETHING HE CAN'T SEE *
* NC & Z = DON'T CARE. *
* C & NZ = HE'S FOLLOWING SOMETHING HE CAN SEE *
* NOTE: CALL WITH JSRP *
* ASSUME THIS SLEEPS AND TRASHES EVERYTHING BUT A0,A1 *
* *
**************************************************************************
TROG_LOOK_FOLLOW:
PUSHP A1
MOVE @BONUS_WAVE,A1,W
JRNZ TROG_NOT_FOLLOWING ;BR = EXIT IMMEADIATELY
CALLR TROG_VALIDATE_CHASEE ;VALIDATE THE CURRENT CHASEE
MOVE A11,A1
MOVB *A13(TTYPE),A3 ;GET HIS TYPE
CMPI TTYPE_CLUB,A3
JREQ TROG_LOOK_FOR_MVD
CLR A3
TROG_LOOK_FOR_MVD:
CALLR FIND_MVD ;IS THERE A DINO ABOUT
JRNZ TROG_LOOK_CLOSER ;BR = YES
MOVE *A13(TDINO),A4,L ;INTERESTED IN A DINO HE CAN'T SEE
JRZ TROG_NOT_FOLLOWING ;BR = NO, CAN THE SCAN
MOVB *A13(TPURSUIT),A6 ;IS HE ON SOMEONES TAIL?
JRNZ TROG_NOT_FOLLOWING ;YES, THEN JUST WALK
CALLR GET_BEST_DIRECTION ;FIND THE DUDE
JRZ TROG_NOT_FOLLOWING ;CAN'T GO TOWARDS HIM, JUST KEEP ON
MOVE *A4(OPLINK),A6,L
JRZ TROGLF_NP
MOVB *A6(DTREXFLG),A6 ;IS THIS GUY A TYRANNO?
JRZ TROGLF_NP ;BR = NO
CALLR CLEAR_PURSUIT ;DON'T FOLLOW THIS GUY ANYMORE!
CMP A1,A11 ;ARE WE HEADING TOWARDS HIM?
JRNE TROG_NOT_FOLLOWING
PUSHP A0
MOVI CLUBOUTU,A0
JSRP FRANIMATE_DIR ;STAND AND SHUDDER
SLEEP 15
SOUND1 TROGUHOH_SND
CALLA NOTDIR
JSRP DINOTURN
**** MOVE A11,A0
**** CALLA DINOLOAD ;LOAD WALKING FRAMES AND GIVE VELS
CALLR TROG_WALK_LOAD
PULLP A0
JRUC TROG_NOT_FOLLOWING
TROGLF_NP
CMP A1,A11 ;IS THE BEST, THE SAME?
JREQ TROG_NOT_FOLLOWING ;YES, JUST WALK
PUSHP A0
CALLR TROG_CENTER ;CENTER TROGGY
MOVE A1,A11
JSRP DINOLOOK_TURN
**** MOVE A11,A0
**** CALLA DINOLOAD ;LOAD UP THE NEW WALKING FRAMES
CALLR TROG_WALK_LOAD
PULLP A0
MOVK 1,A4
SETC
JRUC TROG_LOOK_FOLLOW_X
TROG_NOT_FOLLOWING:
CLR A4
CLRC
JRUC TROG_LOOK_FOLLOW_X
TROG_LOOK_CLOSER:
MOVE *A13(TDINO),A3,L ;CHECK TO SEE IF THIS IS THE SAME DINO
CMP A3,A4
JRNE TROG_DIFF_DINO ;BR = DEFINITELY NOT
CMP A2,A11 ;STRAIGHT AHEAD?
JREQ TROG_FOLLOW ;BR = YES
MOVB *A13(TPURSUIT),A3 ;IS HE ON SOMEONES TAIL?
JRNZ TROG_NOT_FOLLOWING ;YES, THEN JUST WALK
JRUC TROG_TURN_FOLLOW ;BR = TURN TO GET HIM
TROG_DIFF_DINO:
MOVB *A13(TPURSUIT),A3 ;IS HE ON SOMEONES TAIL?
JRNZ TROG_NOT_FOLLOWING ;YES, THEN JUST WALK
CALLR CK_CHASE ;IS THERE ANOTHER TROG AFTER THIS DINO?
JRNZ TROG_NOT_FOLLOWING ;BR = YES, THEN DON'T YOU GO AFTER HIM
CLR A3
MOVB A3,*A13(TPRESET) ;MAKE SURE HE RESETS THE PURSUIT FLAG
CMP A2,A11
JREQ TROG_FOLLOW_NOT_IN_PURSUIT ;BR = YES
MOVE A11,A3
CALLA NOTDIR
SWAP A3,A11
CMP A2,A3 ;IS HE BEHIND US?
JREQ TROG_TURN_FOLLOW ;BR = YES, TURN AND FOLLOW HIM
MOVE @TROG_SEARCH_DIST,A3,W
CMP A3,A5 ;IS THIS ONE TOO FAR AWAY
JRHI TROG_NOT_FOLLOWING ;BR = NO
TROG_TURN_FOLLOW:
MMTM A12,A0,A1,A4,A5
CALLR TROG_CENTER
MOVE A2,A11
JSRP DINOLOOK_TURN
**** MOVE A11,A0
**** CALLA DINOLOAD ;LOAD UP THE NEW WALKING FRAMES
CALLR TROG_WALK_LOAD
MMFM A12,A0,A1,A4,A5
JRUC TROG_NO_PURSUIT
TROG_FOLLOW:
MOVB *A13(TPURSUIT),A3 ;ARE WE ALREADY IN PURSUIT?
JRNE TROG_FOLLOW_IN_PURSUIT ;BR = YES, THEN CONTINUE
TROG_FOLLOW_NOT_IN_PURSUIT:
MOVE *A4(OPLINK),A3,L
JRZ TROG_NO_PURSUIT ;DON'T PURSUE A DINO OUT OF CONTROL
MOVE *A4(OXVEL),A6,L ;IS HE ON THE MOVE?
JRNE TROG_FOLLOW_SAME ;BR = YES
MOVE *A4(OZVEL),A6,L
JREQ TROG_FOLLOW_IN_PURSUIT_1ST ;BR = HE'S STOPPED, FOLLOW 'IM
TROG_FOLLOW_SAME:
MOVE *A3(DDIR),A3,W
CMP A11,A3 ;GOING THE SAME DIRECTION?
JRNE TROG_NO_PURSUIT ;BR = NO, THEN YOU CANNOT BE
TROG_FOLLOW_IN_PURSUIT_1ST:
TROG_FOLLOW_IN_PURSUIT:
MOVE A0,A6
MOVE *A4(OID),A0,W
**** CALLA GET_TENSION ;GET THE TENSION TOWARD THIS DINO
CLR A1
SLL 28,A0
SRL 28,A0
CALLA GPLAYD
MOVE A6,A0
MOVE *A2(PBOZO),A6,W ;IS HE A BOZO?
JRZ TROG_FOLLOW_NO_BOZO ;BR = NO
MOVK MAXPURSUIT,A6 ;MAKE IT EASY FOR THE BOZO'S
JRUC TROG_EVEN_P_R
TROG_FOLLOW_NO_BOZO:
SRL 1,A1 ;IS HE PISSED AT THIS GUY?
JRZ TROG_FOLLOW_NORM ;BR = NO, DO A NORMAL FOLLOW
*TROG DOES THIS TO GUYS WHO KILL HIM TOO MUCH
MOVE @TROG_PURSUIT,A6
SUB A1,A6
CMPI MINPURSUIT,A6 ;IS HE MIN'D OUT?
JRGE TROG_EVEN_P_R ;BR = NO
MOVK MINPURSUIT,A6 ;YES, DON'T GET TO SMART TROG
TROG_EVEN_P_R:
CMP A6,A5 ;IS TROG CONSIDERED ON HIS TAIL?
JRHI TROG_NO_PURSUIT ;BR = NO
MOVB A6,*A13(TPRESET)
MOVK 1,A6 ;YES, GET MOVIN'
MOVB A6,*A13(TPURSUIT)
JRUC TROG_GOTO_NEXT
TROG_FOLLOW_NORM:
MOVE @TROG_PURSUIT,A6
CMP A6,A5 ;IS TROG CONSIDERED ON HIS TAIL?
JRHI TROG_NO_PURSUIT ;BR = NO
MOVK 1,A6 ;YES, GET MOVIN'
MOVB A6,*A13(TPURSUIT)
MOVE @TROG_PURSUIT_RESET,A6
MOVB A6,*A13(TPRESET)
JRUC TROG_GOTO_NEXT
TROG_NO_PURSUIT:
CLR A6
MOVB A6,*A13(TPURSUIT)
MOVB A6,*A13(TPRESET)
*
*A4 = DINO TO FOLLOW OBJECT POINTER
TROG_GOTO_NEXT:
MOVE A4,*A13(TDINO),L ;KEEP TRACK OF THE DINO BEING CHASED
MOVE *A4(OID),A6,W
SLL 28,A6
SRL 28,A6
MOVB A6,*A13(TPLAYER)
CALLR CLEAR_TRAP ;HE CAN'T BE TRAPPED NOW
MOVE @TROG_LOOK_COUNT,A6
CMP A6,A5
JRHS TROG_LOAD_NEXT
MOVE A6,A5 ;FEWEST NUMBER OF MOVES 'TIL CLEAR
TROG_LOAD_NEXT:
MOVB A5,*A13(TNEXTLOOK)
CLRC
*A4 = PTR TO DINOSAUR TO FOLLOW, OR ZERO IF NOT FOLLOWING ANYONE
TROG_LOOK_FOLLOW_X:
MOVE A4,A4 ;CLEAR Z, DO NOT FUCK WITH C!
PULLP A1
RETP
**************************************************************************
* *
* TROG_VALIDATE_CHASEE - MAKE SURE THE CURRENT OBJECT THAT TROG IS *
* CHASING IS STILL VALID. *
* A13 = PTR TO TROG DATA STRUCTURE *
* RETURNS: *
* TROG PURSUIT VARIABLES CLEARED IF OBJECT NO LONGER EXISTS *
* *
**************************************************************************
TROG_VALIDATE_CHASEE:
MMTM SP,A0,A1
MOVE *A13(TDINO),A0,L ;IS TROG AFTER SOMEONE?
JRZ TROG_NO_CHASE ;BR = NO
MOVI DINOS,A1 ;VALIDATE DINO THAT TROG IS CHASING
CALLA ISSUPP ;DOES IT STILL EXIST?
JRNZ TROG_NO_CHASE ;BR = YES
CALLR CLEAR_PURSUIT
TROG_NO_CHASE:
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* TROG_DIG - TROG DIGS INTO THE ISLAND AND APPEARS ELSEWHERE. *
* A8 = PTR TO TROG. *
* A13 = PTR TO TROGS CONTROL PROCESS *
* NOTE: JUMPS TO TROGDEATH_OLD_RET *
* *
**************************************************************************
TROG_DIG:
MOVE @BONUS_WAVE,A0,W ;IS THIS A BONUS WAVE?
JREQ TROG_DIG_OK ;BR = NO, OK TO DIG
MOVE *A13(DDIR),A11,W
MOVE *A13(TWALKFRM),A9,L
JRUC TROGWLP ;ABORT TO WALKING
TROG_DIG_OK
CALLR TROG_VALIDATE_CHASEE
MOVI TRAPDEC,A0
MOVE *A13(TTRAPDIG),A1,W
SUB A0,A1
CMPI TRAPMINTIME,A1
JRGE TROG_STUF_TTIME
MOVB *A13(TSPEEDUPS),A0 ;ANYMORE SPEED-UPS FOR TROG
JRLT TROG_NOMORE_SPEED ;BR = NO
DEC A0
MOVB A0,*A13(TSPEEDUPS) ;ONE LESS
MOVE *A13(DSPEED),A0,W
ADDI 0200H,A0 ;ADD SOME FUEL TO THE FIRE
MOVE A0,*A13(DSPEED),W
TROG_NOMORE_SPEED:
MOVI TRAPMINTIME,A1
TROG_STUF_TTIME:
MOVE A1,*A13(TTRAPDIG),W
**** CALLA ADD_FRUST ;ADD SOME FRUSTRATION
**** MOVE *A13(TDINO),A0,L ;WHAT DINO MADE ME DIG?
**** JRZ TROG_DIG_NBT ;BR = NOBODY
**** MOVE *A0(OID),A0,W
**** MOVK 1,A1
**** CALLA BUILD_TENSION ;GET PISSED AT HIM
*
*ENTER HERE IF YOU WANT TO SKIP THE TENSION AND SPEED BUILDING STUFF
*
TROG_DIG_NBT:
MOVI DEADTROGOID,A1
MOVE A1,*A8(OID),W ;MAKE HIM DEAD
CALLR GET_TROG_MPNT
MOVE A0,*A13(PTEMP1),L
MOVE A3,*A13(DINITPOS),L ;RETURN POINT IF NEEDED
CALLA PSTOP
CALLA TROG_CENTER
MOVI DIGU,A0
JSRP ANIMATE_DIR
MOVE *A13(PTEMP1),A11,L
CREATE TROGSUBPID,WHIRL_PIT
MOVI 0A000H,A2 ;SINK RATE
JSRP CLIP_INTO
JRUC TROGDEATH_OLD_RET
**************************************************************************
* *
* WHIRL_PIT - START A WHIRLING DUST CLOUD, THEN START A PIT AND DELETE *
* EVERYTHING. *
* A11 = MOVE POINT TO CENTER EVERYTHING UPON *
* *
**************************************************************************
WHIRL_PIT:
MOVI WHIRLINIT,A14
CALLA GPALOBJSTF ;DO THE OBJECT
JRZ WHIRL_PIT_DIE
MOVE A13,*A0(OPLINK),L ;LINK IT UP
MOVE A0,A8
MOVE *A11(MOVEPOS),A3,L
CALLA OBJ_TO_PNT
CALLA SET_MZPOS
CALLA INSERT_OBJ
MOVI WHIRL_SCRIPT,A9
MOVK 1,A1
JSRP FRANIM ;FEEL THE POWER OF THE WIND
MOVK 1,A1
JSRP FRANIM ;FINISH THE FART
CALLA DELETE_OBJ
WHIRL_PIT_DIE:
DIE
**************************************************************************
* *
* TRAP_CHECK - FIND OUT IF THE GUY HAS BEEN TRAPPED IN AN AREA TOO LONG. *
* A3 = CURRENT POSITION OF DUDE *
* A13 = PTR TO DUDES PROCESS(DINO TYPE) *
* RETURNS: *
* Z = NOT TRAPPED *
* NZ = TRAPPED *
* *A13(TMINTL),L = ADJUSTED IF NECESSARY. *
* *A13(TMAXLR),L = ADJUSTED IF NECESSARY. *
* *A13(TTRAPTIME),W = CLR IF HE'S OUT, INCREMENTED IF HE'S IN *
* *A13(TTRAPPED),B = 1 IF THE GUY IS TRAPPED. *
* *
**************************************************************************
TRAP_CHECK
MMTM SP,A1,A2,A3,A4
MOVE *A13(TMINTL),A1,L
JRZ TRAP_CHECK_INIT ;BR = INITIALIZE BOTH
CLR A4
CMPXY A1,A3 ;COMPARE NEW AGAINST CURRENT
JRYGE TRAP_CK_MINX
MOVE A3,A2
SRL 16,A2
MOVE A2,*A13(TMINTL+16),W ;STORE NEW TLY
INC A4
CMPXY A1,A3 ;COMPARE NEW AGAINST CURRENT
TRAP_CK_MINX:
JRXGE TRAP_CHECK_NEXT
MOVE A3,*A13(TMINTL),W ;STORE NEW TLX
JRUC TRAP_CHECK_CLR
TRAP_CHECK_NEXT:
MOVE A4,A4
JRNE TRAP_CHECK_CLR
MOVE *A13(TMAXLR),A1,L ;CHECK NEW AGAINST LOWER RIGHT
JRZ TRAP_CHECK_INIT ;BR = LR IS INTACT
CLR A4
CMPXY A1,A3 ;COMPARE NEW AGAINST CURRENT
JRYLE TRAP_CK_MAXX
MOVE A3,A2
SRL 16,A2
MOVE A2,*A13(TMAXLR+16),W ;STORE NEW LRY
INC A4
CMPXY A1,A3 ;COMPARE NEW AGAINST CURRENT
TRAP_CK_MAXX:
JRXGT TRAP_NEW_LRX
MOVE A4,A4
JRNE TRAP_CHECK_CLR
JRUC TRAP_CHECK_INC ;HE'S STUCK IN A BOX
TRAP_NEW_LRX:
MOVE A3,*A13(TMAXLR),W ;STORE NEW TLX
TRAP_CHECK_CLR:
CLR A1
MOVE A1,*A13(TTRAPTIME),W
JRUC TRAP_CHECK_X ;EXIT WITH Z BIT SET
TRAP_CHECK_INIT:
MOVE A3,*A13(TMINTL),L ;INITIALIZE BOTH
MOVE A3,*A13(TMAXLR),L
JRUC TRAP_CHECK_CLR
TRAP_CHECK_INC:
MOVE *A13(TTRAPTIME),A1,W
INC A1
MOVE A1,*A13(TTRAPTIME),W
MOVE *A13(TTRAPDIG),A2,W
CMP A2,A1 ;HAS HE BEEN HERE TOO LONG?
JRLO TRAP_CHECK_NOT ;BR = NO
MOVI 1,A1 ;MUST EXIT WITH Z CLR, MOVI O.K.
JRUC TRAP_CHECK_X
TRAP_CHECK_NOT:
CLR A1
TRAP_CHECK_X:
MOVB A1,*A13(TTRAPPED) ;DO THE RIGHT THING WITH THE FLAG
MMFM SP,A1,A2,A3,A4
RETS
**************************************************************************
* *
* CLEAR_TRAP - CLEAR TROGS TRAP VARIABLES. *
* A13 = PTR TO TROG PROCESS *
* *
**************************************************************************
CLEAR_TRAP:
PUSH A0
CLR A0
MOVB A0,*A13(TTRAPPED) ;RESET TRAP VARIABLES
MOVE A0,*A13(TMINTL),L
MOVE A0,*A13(TMAXLR),L
PULL A0
RETS
**************************************************************************
* *
* CLEAR_PURSUIT - CLEAR TROGS PURSUIT VARIABLES. *
* A13 = PTR TO TROG PROCESS *
* *
**************************************************************************
CLEAR_PURSUIT:
PUSH A0
CLR A0
MOVB A0,*A13(TPURSUIT) ;RESET PURSUIT VARIABLES
MOVB A0,*A13(TPRESET)
MOVE A0,*A13(TDINO),L
PULL A0
RETS
**************************************************************************
* *
* TROG_VEL_NORMAL - ADVANCE THE CURRENT TROG SPEED TOWARD *
* THE VALUE IN DSPEED. *
* A13 = PTR TO TROG DATA STRUCTURE. *
* A8 = PTR TO TROG *
* *A13(DVNFLAG),B = IF<>0 THEN DO NOTHING *
* *
**************************************************************************
TROG_VEL_NORMAL:
MMTM SP,A0,A1,A2
MOVB *A13(DVNFLAG),A1 ;ARE WE ALLOWED TO DO THIS
JRNE TROG_VNX ;BR = NO
MOVE *A13(DSPEED),A1,W
ZEXT A1
SLL 4,A1 ;GET THE BASE TROG SPEED
MOVE *A13(DVEL),A0,L
SUB A0,A1
JRZ TROG_VNX ;BR = THEY ARE EQUAL, NO CHANGE NECES.
JRN TROG_VNN ;BR = MUST ADD NEGATIVE
MOVI 100H,A0
JRUC TROG_VN
TROG_VNN:
MOVI -100H,A0
TROG_VN:
CALLA DINO_ADD_VEL
TROG_VNX:
MMFM SP,A0,A1,A2
RETS
**************************************************************************
* *
* CLIP_INTO - CLIP AN OBJECT COMPLETELY INTO SOMETHING WHILE ANIMATING *
* ABORTS IF END OF SCRIPT WAS REACHED BEFORE CLIP COMPLETE *
* A2 = CLIP RATE (+Y VEL) *
* A8 = OBJECT *
* A9 = ANIMATION SCRIPT *
* RETURNS: *
* A9 = PTR TO NEXT FRAME AFTER CLIP IS COMPLETE. *
* OBJECT IS STOPPED AND TURNED OFF UPON COMPLETION. *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
CLIP_INTO:
MMTM A12,A10,A11
MOVE *A8(OYPOS),A10,W
MOVE A2,*A8(OYVEL),L ;GIVE HIM SOME VELOCITY
DIG_NXT:
**** MOVE *A8(OIMG),A1,L ;RESET SIZE TO AVOID CONFUSION
**** MOVE *A1(ISIZEY),A2,W
**** MOVE A2,*A8(OSIZEY),W
MOVK 4,A1
JSRP FRANIM
JRC DIG_X
MOVE *A8(OIMG),A1,L ;LOAD IMAGE HEADER FOR CLIP
MOVE A0,A11
JRUC DIG_CLIP
DIG_LP:
MOVE *A8(OIMG),A1,L
MOVE *A8(OFLAGS),A4,W
**** MOVE *A1(ISIZEY),A2,W ;RESET SIZE TO AVOID CONFUSION
**** MOVE A2,*A8(OSIZEY),W
XORI M_PZPLUS,A4 ;FAKE ANI INTO ANIMATING YOURSELF
CALLA ANI ;ANIMATE TO YOURSELF, RESETTING CLIP
DIG_CLIP:
MOVE *A1(ISIZEY),A3,W
MOVE *A8(OYPOS),A2,W
SUB A10,A2
JRN DIG_SKIP_CLIP ;NO NEGATIVE CLIPPING
CMP A3,A2
JRGE DIG_X ;DONE...
SLL 16,A2 ;CLIP OFF THE BOTTOM
CLR A3
CALLA CLIPOBJ
DIG_SKIP_CLIP:
SLEEP 1
DSJ A11,DIG_LP
JRUC DIG_NXT
DIG_X:
CALLA PSTOP
CALLA OBJ_OFF
MMFM A12,A10,A11
RETP
**************************************************************************
* *
* TROGHHIT - TROG HIT A HORIZONTAL BAR *
* A0 = PTR TO TROG *
* A8 = PTR TO BAR *
* *
**************************************************************************
TROGHHIT:
PUSH A1
CALLR TROG_BUMP ;BASHES A1
BTST 1,A1
JREQ TROGHITX ;DIDN'T DO IT
JRUC TDEFLECT
**************************************************************************
* *
* TROGVHIT - TROG HIT A VERTICAL BAR *
* A0 = PTR TO TROG *
* A8 = PTR TO BAR *
* *
**************************************************************************
TROGVHIT:
PUSH A1
CALLR TROG_BUMP ;BASHES A1
BTST 0,A1
JREQ TROGHITX ;NOT A VALID COLLISION
*ENTRY POINT TO DEFLECT TROG
TDEFLECT:
MOVE *A0(OID),A1,W
CMPI DEADTROGOID,A1 ;IS HE DYING?
JREQ TROGHITX ;BR = HE'S ALREADY DEAD, NO MORE
MOVE *A0(OPLINK),A1,L
JRZ TROGHITX ;BR = NO PROCESS, BUM!
MMTM SP,A0,A7,A8,A9
MOVE A8,A9 ;PASS WALL OBJECT
MOVE A0,A8 ;PASS THE TROG PTR
MOVE A1,A0 ;PUT PROCESS PTR HERE FOR XFERPROC
MOVI TROGDEFL,A7
CALLA XFERPROC_ID ;TRANSFER CONTROL OF THE PROCESS
MMFM SP,A0,A7,A8,A9
TROGHITX:
PULL A1
MOVE A0,A0 ;WITH Z BIT SET TO CONTINUE COLLISION
RETS
**************************************************************************
* *
* TROGDINO - TROG HIT A DINOSAUR *
* A0 = PTR TO TROG *
* A8 = PTR TO DINOSAUR *
* *
**************************************************************************
TROGDINO:
PUSH A1
MOVE *A0(OID),A1,W
CMPI DEADTROGOID,A1 ;IS TROG CURRENTLY DYING?
JREQ TROGDINOX ;BR = YES, BLOW THIS OFF
CALLR TROG_BUMP ;BASHES A1
JRZ TROGDINO_ARGH ;BR = TROG DID NOT BUMP DINO
*
*A1 AS RETURNED FROM TROG_BUMP
TROG_PUNCH_DINO:
MMTM SP,A0,A4,A5,A6,A7,A8,A9,A11
MOVE @FREEZE_TIME,A7,W
JRNZ TROGDINO_BAIL
MOVE *A0(OPLINK),A4,L ;GET TROG'S CONTROL PROCESS
JRZ TROGDINO_BAIL ;BR = NO CONTROLLING PROCESS, BAIL
MOVE *A8(OPLINK),A5,L ;GET THE OTHER DINOS CONTROL PROCESS
JRZ TROGDINO_BAIL ;BR = NO CONTROL
MOVB *A4(TTYPE),A7
CMPI TTYPE_WHL,A7 ;IS HE THE WHEEL DUDE
JREQ TROGDINO_BAIL ;BR = YES, NO COLLISIONS ALLOWED
*CHECK IF TROG IS ATTACKING FROM BEHIND. IF HE IS AND HE IS BARE HANDED
* THEN BLOW OFF THE COLLISION UNTIL HE'S WAY IN THERE
BTST 0,A1 ;WAS IT AN X HIT?
JRZ TROGDINO_HIT ;BR = NO
MOVE *A0(OXVEL),A1,L
JRN TROGDINO_XLEFT ;BR = TROG IS MOVING LEFT
MOVE *A8(OXVEL),A1,L ;IS DINO MOVING RIGHT ALSO
JRN TROGDINO_HIT ;BR = NO
JRNZ TROGDINO_BEHIND ;BR = YES
MOVE *A8(OFLAGS),A1,W
BTST B_FLIPH,A1 ;IS DINO FACING RIGHT?
JRNE TROGDINO_HIT ;BR = NO
TROGDINO_BEHIND:
CALLA CK_TROGDINO_CENT
JRNC TROGDINO_BAIL ;BR = HE'S NOT CLOSE ENOUGH TO HIT
JRUC TROGDINO_HIT
TROGDINO_XLEFT
MOVE *A8(OXVEL),A1,L ;IS DINO MOVING LEFT ALSO
JRN TROGDINO_BEHIND ;BR = YES
JRNZ TROGDINO_HIT ;BR = COMING AT HIM, QUICK! PUNCH!
MOVE *A8(OFLAGS),A1,W
BTST B_FLIPH,A1 ;IS DINO FACING LEFT?
JRNE TROGDINO_BEHIND ;BR = YES
TROGDINO_HIT:
CALLA BONE_BETWEEN ;IS THERE A BONE BETWEEN THESE TWO
JRNZ TROGDINO_BAIL ;BR = YES
MOVB *A5(DDIZZYFLG),A1 ;IS THIS DINOSAUR DIZZY?
JRNE TROGDINO_REV ;BR = YES
MOVB *A5(DTREXFLG),A1
JRNE TROGDINO_REV
MOVE *A8(OID),A7,W
MOVE A7,A1
SRL 4,A1
SLL 4,A1
CMPI DEADDINOOID,A1 ;IS THE DINO DYING?
JREQ TROGDINO_REV ;BR = YES, JUST REVERSE
MOVE *A5(DPLAYER),A6,L ;GET THE PLAYER POINTER
JRZ TROGDINO_PUNCH ;NO PLAYER CONTROL
**** MMTM SP,A0,A13
**** MOVE A4,A13
**** MOVE A7,A0
**** CALLA GET_TENSION ;GET THE TENSION TOWARD THIS DINO
**** MMFM SP,A0,A13
****
**** CMPI TROGTOOPISSED,A1 ;IS TROG NOT INTO THIS GUY?
**** JRHS TROGDINO_PUNCH ;BR = NOT AT ALL
MOVE *A6(PBOZO),A1,W
CMPI 3,A1 ;TOO PITIFUL TO KILL
JRHS TROGDINO_REV ;BR = YES
MOVB *A5(DINVIN),A1 ;IS THIS DINO INVINCIBLE?
JRNZ TROGDINO_REV ;BR = YES
*TAKE A SWING AT THE DINOSAUR
TROGDINO_PUNCH:
MOVE A5,A9 ;LET'S PASS THE PUNCHEE PROCESS
MOVE A0,A8 ;NOW LET'S CREATE THE PUNCHING TROG
CALLA PSTOP ;STOP FIRST
MOVE A4,A0 ;GET THE PROCESS LINK
MOVK 1,A1
MOVB A1,*A0(DPUNCHFLG) ;TROG IS PUNCHING
CLR A1
MOVB A1,*A0(DDIZZYFLG) ;AND IS NOT DIZZY
MOVI TROG_PUNCH,A7
JRUC TROGDINO_XFER
*SEE IF THE DINO GOT TROG
TROGDINO_ARGH:
MMTM SP,A0,A4,A5,A6,A7,A8,A9,A11
SWAP A0,A8
CALLA IS_DINO_DEAD_A0
JRZ TROGDINO_BAIL
MOVE *A8(OPLINK),A4,L ;GET TROG'S CONTROL PROCESS
JRZ TROGDINO_BAIL ;BR = NO CONTROLLING PROCESS, BAIL
MOVE *A0(OPLINK),A5,L ;GET THE DINOS CONTROL PROCESS
JRZ TROGDINO_BAIL ;BR = NO CONTROL
MOVB *A5(DTREXFLG),A1 ;IS THIS DUDE IN REX MODE?
JREQ TROGDINO_DN ;BR = NO
CALLR TROG_BUMP ;AGGRESSOR BUMPAGE
JRNZ TD_TRYMUNCH ;BR = TREX DID VALIDLY HIT TROG
CALLR TREX_CLOSE_TROG ;ARE THEY ON THE SAME MOVE?
JRNZ TROGDINO_BAIL ;BR = NO
TD_TRYMUNCH
MOVB *A5(DPUNCHFLG),A1
JRNZ TROGDINO_BAIL ;TY IS ALREADY MUNCHING
*INITIATE THE FEAST (IT IS LIKE I HAVE ALWAYS SAID, "EAT OR BE EATEN.")
MOVE A8,A6
MOVE A0,A8 ;PASS THE DINO OBJECT
MOVE A5,A0 ;LET'S XFER TO THE DINO MUNCHER
CALLA PSTOP ;FIRST WE MUST STOP
MOVK 1,A1
MOVB A1,*A0(DPUNCHFLG) ;YES, HE IS MUNCHING
CLR A1
MOVB A1,*A0(DDIZZYFLG) ;NO, HE IS NOT GETTING PUNCHED
MOVE A1,*A0(PCOMM),W ;CLEAR THE COMMUNICATION LINE
MOVI DINO_MUNCH,A7
MOVE A4,A9 ;PASS TROG'S PROCESS
MOVE A6,A11 ;SEND THE TROGGY OBJECT
CALLA XFERPROC_ID ;WAKE UP IN A DAZE
MOVE A6,A8 ;TRANSFER TO TROG GETTING EATEN
CALLA PSTOP ;STOP FIRST
MOVE A4,A0 ;GET THE PROCESS LINK
MOVI DEADTROGOID,A1 ;HE'S FREAKIN' DEAD
MOVE A1,*A8(OID),W
MOVK 1,A1
MOVB A1,*A0(DDIZZYFLG) ;TROG IS GETTING MUNCHED, HA HA
CLR A1
MOVB A1,*A0(DPUNCHFLG) ;AND IS NOT PUNCHING
ORIM M_NOCOLL,*A8(OFLAGS),W ;MAKE SURE COLLISIONS ARE OFF
CALLA GETA11
MOVI TROG_EATEN,A7
MOVE A5,A9 ;PASS THE PTR TO THE DINOSAUR PROCESS
JRUC TROGDINO_XFER
TROGDINO_DN
MOVE A5,A1
MOVI GET_DINO_MPNT,A6
MOVI GET_TROG_MPNT,A7
CALLA DINO_PUNCHED
JREQ TD_DINO_PUNCH
MOVE @FREEZE_TIME,A7,W
JRNZ TROGDINO_BAIL
MOVB *A5(DINVIN),A7 ;DID THE DINO TURN INVINCIBLE?
JRNZ TROGDINO_BAIL ;BR = YES
SWAP A0,A8
MOVE A4,A1
MOVI GET_TROG_MPNT,A6
MOVI GET_DINO_MPNT,A7
CALLA PUNCHED
JRNE TROGDINO_BAIL
MOVE A0,A6 ;STORE THE TROG OBJECT HERE
MOVE A5,A0 ;LET'S XFER TO THE PUNCHEE PROCESS
CALLA PSTOP ;FIRST WE MUST STOP
MOVK 1,A1
MOVB A1,*A0(DDIZZYFLG) ;YES, HE IS GETTING PUNCHED
CLR A1
MOVB A1,*A0(DPUNCHFLG) ;NO, HE IS NOT PUNCHING BACK
MOVE A1,*A0(PCOMM),W ;CLEAR DINO COMM LINE
MOVE A1,*A4(PCOMM),W ;CLEAR TROG COMM LINE
MOVB *A4(TTYPE),A7
CMPI TTYPE_CLUB,A7 ;IS HE THE CLUB DUDE
JRNE TROGDINO_P_EAT ;BR = NO, THEN NORMAL EAT
MOVI DINO_TROG_CLUB,A7
JRUC TROGDINO_EAT_XFER
TROGDINO_P_EAT:
MOVI DINO_TROG_OOF,A7
TROGDINO_EAT_XFER:
CALLA XFERPROC_ID ;WAKE UP IN A DAZE
MOVE A0,A11 ;PASS THE PUNCHEE
MOVE A6,A8 ;NOW LET'S CREATE THE PUNCHING TROG
CALLA PSTOP ;STOP FIRST
MOVE A4,A0 ;GET THE PROCESS LINK
CALLA GETA9
MOVI TROG_EAT,A7
MOVK 1,A1
MOVB A1,*A0(DPUNCHFLG) ;HE IS NO LONGER DEADLY
JRUC TROGDINO_XFER
*MAKE DINOSAUR SMACK TROG
TD_DINO_PUNCH
CALLA PSTOP ;STOP FIRST
MOVE A4,A0 ;GET THE PROCESS LINK
MOVK 1,A1
MOVB A1,*A0(DDIZZYFLG) ;TROG IS GETTING PUNCHING, HA HA
CLR A1
MOVB A1,*A0(DPUNCHFLG) ;AND IS NOT PUNCHING
ORIM M_NOCOLL,*A8(OFLAGS),W ;TURN COLLISIONS OFF AT THIS POINT
MOVI TROG_OOF,A7
MOVE A5,A9 ;PASS THE PTR TO THE DINOSAUR PROCESS
CALLA GETA11 ;MAKE SURE A11 STAYS CORRECT
**** JRUC TROGDINO_XFER
CALLA XFERPROC_ID ;TRANSFER CONTROL OF THE PROCESS
MMFM SP,A0,A4,A5,A6,A7,A8,A9,A11
PULL A1
JAUC DUMSRETS ;RESET TROG/DINO COLLISIONS
*
*REVERSE DINOSAUR
*A0 = PTR TO DINO
*A5 = PTR TO DINO PROCESS
****TROGDINO_DINOREV:
**** MOVE A0,A8
**** CALLA PSTOP ;AND STOP THE DINOSAUR
**** MOVE A5,A0 ;GET THE PROCESS LINK
**** MOVI DINOREV,A7
**** JRUC TROGDINO_XFER
*
*REVERSE TROG
*A0 = PTR TO TROG
*A4 = PTR TO TROG PROCESS
TROGDINO_REV:
MOVE A0,A8 ;PASS TROG
CALLA PSTOP ;AND STOP HIM
MOVE A4,A0 ;GET THE PROCESS LINK
MOVI TROG_REV,A7
JRUC TROGDINO_XFER
TROGDINO_XFER:
CALLA XFERPROC_ID ;TRANSFER CONTROL OF THE PROCESS
TROGDINO_BAIL: ;BAIL-OUT POINT FOR ERRORS
MMFM SP,A0,A4,A5,A6,A7,A8,A9,A11
TROGDINOX:
PULL A1
JAUC DUMCRETS
**************************************************************************
* *
* TROG_EATEN - TROG IS TO BE EATEN *
* A8 = PTR TO TROG *
* A9 = PTR TO DINO PROCESS *
* A11 = TROG PROCESS A11 *
* A13 = PTR TO TROG PROCESS *
* *
**************************************************************************
TROG_EATEN:
MOVE *A13(PROCID),A0,W
PUSHP A0
MOVI INDPID,A0
MOVE A0,*A13(PROCID),W ;BE INDISTINGUISHABLE
MOVB *A13(TTYPE),A0
CMPI TTYPE_WHL,A0
JREQ TE_WHEEL
MOVI CLUBOUTU,A0
JSRP FRANIMATE_DIR
TE_X
PULLP A0
MOVE A0,*A13(PROCID),W
**** JRUC TROGDEATH_EATEN
CALLR DELETE_TROG
DIE
TE_WHEEL
SLEEP 30
JRUC TO_WHEEL_OUT
**************************************************************************
* *
* TROGPIT - WALKED INTO A LOCAL PIT. *
* A0 = PTR TO TROG *
* A8 = PTR TO PIT *
* *
**************************************************************************
TROGPIT:
PUSH A1
MOVE *A0(OID),A1,W
CMPI DEADTROGOID,A1 ;IS HE DYING?
JREQ TROGPITX ;BR = HE'S ALREADY DEAD, NO MORE
*** CALLR TROG_BUMP ;BASHES A1
*** JRZ TROGPITX
CALLR CK_TROG_CENT ;CHECK IF WE'RE NEAR THE PIT CENTER
JRNC TROGPITX ;BR = HE'S SAFE
MOVE *A0(OPLINK),A1,L
JRZ TROGPITX ;BR = NO CONTROLLING PROCESS
MMTM SP,A0,A7,A8,A9
MOVE A8,A9 ;PASS PIT OBJECT
MOVE A0,A8 ;PASS THE TROGSTER
MOVE A1,A0 ;FOR XFERPROC
MOVI TROGPIT_FALL,A7
CALLA XFERPROC_ID ;TRANSFER CONTROL OF THE PROCESS
MOVI DEADTROGOID,A1
MOVE A1,*A8(OID),W ;MARK HIM AS DEAD RIGHT AWAY
MMFM SP,A0,A7,A8,A9
TROGPITX:
PULL A1
MOVE A0,A0 ;WITH Z BIT SET TO CONTINUE COLLISION
RETS
**************************************************************************
* *
* TROGTAR - TROG WALKED INTO A TAR PIT *
* A0 = PTR TO TROG *
* A8 = PTR TO TAR PIT *
* *
**************************************************************************
TROGTAR:
PUSH A1
MOVE *A0(OID),A1,W
CMPI DEADTROGOID,A1 ;IS HE DYING?
JREQ TROGTARX ;BR = HE'S ALREADY DEAD, NO MORE
CALLA CK_TROG_CENT
JRNC TROGTARX ;BR = HE'S NOT STUCK
MOVE *A0(OPLINK),A1,L
JRZ TROGTARX ;BR = NO CONTROLLING PROCESS
MMTM SP,A0,A7,A8,A9
MOVE A8,A9 ;PASS TAR OBJECT FOR YUKS
MOVE A0,A8 ;PASS THE TROGSAUR
MOVE A1,A0 ;FOR XFERPROC
MOVI TROGTAR_SINK,A7
CALLA XFERPROC_ID ;TRANSFER CONTROL OF THE PROCESS
MOVI DEADTROGOID,A1 ;MARK HIM AS DEAD, RIGHT THIS INSTANT
MOVE A1,*A8(OID),W
MMFM SP,A0,A7,A8,A9
TROGTARX:
PULL A1
MOVE A0,A0 ;WITH Z BIT SET TO CONTINUE COLLISION
RETS
**************************************************************************
* *
* TROGFIRE - WALKED INTO A FIRE *
* A0 = PTR TO TROG *
* A8 = PTR TO FIRE *
* *
**************************************************************************
TROGFIRE:
PUSH A1
MOVE *A0(OID),A1,W
CMPI DEADTROGOID,A1 ;IS HE DYING?
JREQ TROGFIREX ;BR = HE'S ALREADY DEAD, NO MORE
CALLA CK_TROG_CENT
JRNC TROGFIREX ;BR = HE'S SAFE
MOVE *A0(OPLINK),A1,L
JRZ TROGFIREX ;BR = NO CONTROLLING PROCESS
MMTM SP,A0,A7,A8,A9
MOVE A8,A9 ;PASS FIRE OBJECT FOR YUKS
MOVE A0,A8 ;PASS THE DINOSAUR
MOVE A1,A0 ;FOR XFERPROC
MOVI TROGFIRE_BURN,A7
CALLA XFERPROC_ID ;TRANSFER CONTROL OF THE PROCESS
MOVI DEADTROGOID,A1
MOVE A1,*A8(OID),W
MMFM SP,A0,A7,A8,A9
TROGFIREX:
PULL A1
MOVE A0,A0 ;WITH Z BIT SET TO CONTINUE COLLISION
RETS
**************************************************************************
* *
* TROGFLOWER - TROG COLLIDES WITH FLOWER *
* A0 = PTR TO TROG *
* A8 = PTR TO FLOWER *
* *
**************************************************************************
****TROGFLOWER:
**** MMTM SP,A0,A1,A7,A8,A10,A11
**** MOVI TROGSPEEDPID,A1
**** MOVI TROG_SPEEDUP,A7
**** JRUC TROG_PLANT_HIT
**************************************************************************
* *
* TROGSHROOM - TROG COLLIDES WITH MUSHROOM *
* A0 = PTR TO TROG *
* A8 = PTR TO FLOWER *
* *
**************************************************************************
****TROGSHROOM:
**** MMTM SP,A0,A1,A7,A8,A10,A11
**** MOVI TROGSPEEDPID,A1
**** MOVI TROG_SLOWDOWN,A7
**** JRUC TROG_PLANT_HIT
*
*ENTRY FOR STUPID "ENEMY" THINGS
* A7 = PROCESS TO CREATE FOR TROG
* A0 = TROG
* A8 = THING
*NOTE: A14 IS TRASHED
****TROG_PLANT_HIT:
**** CALLR CK_TROG_CENT ;IS HE CLOSE ENOUGH TO GRAB IT?
**** JRNC TROG_PH_FL ;BR = NO
**** MOVE *A0(OPLINK),A10,L ;GET TROGS CONTROL
**** JRZ TROG_PH_FL ;THE TROG IS OUT OF CONTROL
**** MOVE A8,A11
**** MOVE A0,A8
**** CALLA GETPRC ;AND CREATE THE PROCESS
**** MOVE A11,A8
**** CALLA FREE_MOVE_EGG ;WIPE OUT THIS THING
**** CALLA OBJPROC_KILL
**** MOVI ENEMIES,A1
**** CALLA DELETE_OBJ_SUPP
**** SETZ ;END THIS SCAN PLEASE
**** JRUC TROG_PH_X
****TROG_PH_FL:
**** CLRZ
****TROG_PH_X:
**** MMFM SP,A0,A1,A7,A8,A10,A11
**** RETS
**************************************************************************
* *
* TROG_SPEEDUP - PROCESS TO SPEED UP TROG FOR A WHILE. *
* A8 = PTR TO TROG *
* *
**************************************************************************
****TROG_SPEEDUP:
**** MOVE *A13(PROCID),A0,W
**** CLR A1
**** NOT A1
**** CALLA KILALLA8 ;KILL THIS DINOS PROCS
**** MOVE *A8(OPLINK),A10,L
**** JRZ TROG_SU_X
**** SOUND1 TROGSPEED_SND
**** MOVE A13,A11 ;SAVE CURPROC POINTER
**** MOVE A10,A13 ;PASS TROG DATA STRUCTURE
**** MOVK 1,A0
**** MOVB A0,*A13(DVNFLAG) ;I AM MASTER
**** MOVE *A13(DVEL),A0,L
**** MOVE *A13(DSPEED),A0,W
**** ZEXT A0
**** SLL 3,A0
**** CALLA DINO_ADD_VEL
**** MOVE A11,A13 ;RETRIEVE CURPROC FOR SLEEP
**** SLEEP 10*60
**** CLR A0
**** MOVB A0,*A10(DVNFLAG) ;VELOCITY TO NORMAL
****TROG_SU_X:
**** DIE
**************************************************************************
* *
* TROG_SLOWDOWN - PROCESS TO SLOW DOWN THE TROG FOR A WHILE *
* A8 = PTR TO TROG *
* *
**************************************************************************
****TROG_SLOWDOWN:
**** MOVE *A13(PROCID),A0,W
**** CLR A1
**** NOT A1
**** CALLA KILALLA8
**** MOVE *A8(OPLINK),A10,L
**** JRZ TROG_SD_X
**** SOUND1 TROGSHROOM_SND
**** MOVE A13,A11 ;SAVE CURPROC POINTER
**** MOVE A10,A13 ;PASS DINO DATA STRUCTURE
**** MOVK 1,A0
**** MOVB A0,*A13(DVNFLAG) ;I AM MASTER
**** MOVE *A13(DSPEED),A0,W
**** ZEXT A0
**** SLL 3,A0
**** NEG A0
**** CALLA DINO_ADD_VEL
**** MOVE A11,A13 ;RETRIEVE CURPROC FOR SLEEP
**** SLEEP 10*60
**** CLR A0
**** MOVB A0,*A10(DVNFLAG)
****TROG_SD_X:
**** DIE
**************************************************************************
* *
* TROG_BUMP - CHECK TO SEE IF TROG (IN A0) BUMPED INTO THE OBJECT IN A8. *
* A0 = TROG *
* A8 = OBJECT TO CHECK AGAINST *
* RETURNS: *
* Z = A0 DID NOT BUMP INTO A8 *
* NZ = THEY BUMPED: *
* A1 = BIT 0: SET = BUMPED IN X *
* BIT 1: SET = BUMPED IN Y *
* NOTE: BASHES A14 *
* *
**************************************************************************
TROG_BUMP:
PUSH A2
CLR A1
MOVE *A0(OXVEL),A2,L
JRZ TROG_BUMPCKY ;NOT MOVING IN X, NO BUMP
CALLA WHICHSID
CALLA BUMPCK
JRZ TROG_BUMPCKY
MOVE *A8(OYVEL),A2,L
JRZ TROG_BUMPEDINX ;NO DOUBT ABOUT IT, HE BUMPED IT
CALLA ABOVBELO
NOTC ;ABOVE/BELOW SWAP
CALLA BUMPCK
JRZ TROG_BUMPCKY
TROG_BUMPEDINX:
CALLA VALIDHITX
JRNC TROG_BUMPCKY ;BR = THEY WERE NOT ON THE SAME PATH
BSET 0,A1 ;SHOW THE X BUMP
TROG_BUMPCKY:
MOVE *A0(OYVEL),A2,L
JRZ TROG_BUMPX
CALLA ABOVBELO ;ABOVE OR BELOW THE OBJECT
CALLA BUMPCK
JRZ TROG_BUMPX
MOVE *A8(OXVEL),A2,L
JRZ TROG_BUMPEDINY ;NO DOUBT ABOUT IT, HE BUMPED IT
CALLA WHICHSID
NOTC ;LEFT/RIGHT SWAP
CALLA BUMPCK
JRZ TROG_BUMPX
TROG_BUMPEDINY:
CALLA VALIDHITY
JRNC TROG_BUMPX ;BR = THEY WERE NOT ON THE SAME PATH
BSET 1,A1
TROG_BUMPX:
MOVE A1,A1 ;SET THE STATUS REGISTER
PULL A2
RETS
**************************************************************************
* *
* TREX_CLOSE_TROG - DETERMINE IF TREX AND TROG ARE ON THE SAME SPOT. *
* A0 = PTR TO TREX *
* A8 = PTR TO TROG *
* RETURNS: *
* Z = THEY ARE CLOSE TO THE SAME SPOT *
* NZ = NOT IN THE SAME VICINITY *
* *
**************************************************************************
TREX_CLOSE_TROG:
MMTM SP,A0,A1,A2,A3
MOVE A8,A2
MOVE A0,A8
CALLA GET_DINO_MPNT
MOVE A2,A8
MOVE A3,A2
CALLR GET_TROG_MPNT
CMP A2,A3
MMFM SP,A0,A1,A2,A3
RETS
**************************************************************************
* *
* TROGDEFL - TROG BAR DEFLECT PROCESS. *
* A8 = PTR TO TROG OBJECT *
* A9 = PTR TO BAR OBJECT *
* A13 = PTR TO TROG PROCESS DATA STRUCTURE *
* NOTE: THIS PROCESS TRANSFERS TO TROGWXFER *
* *
**************************************************************************
TROGDEFL
**** CALLA GET_TROG_CPNT ;THIS IS HIS NEW CENTER
**** ADDI [5,0],A1
**** CALLA FIND_CLOSE_MPNT ;FIND THE CLOSEST MOVE POINT
CALLR GET_TROG_MPNT
MOVE *A13(DATABLE),A10,L ;FIRST WE NEED THE ANIMATION TABLE
MOVE *A13(DDIR),A11,W ;AND THEN WE NEED THE DIRECTION
MOVE A11,*A13(PTEMP1),W ;KEEP THIS IN CASE WE CHANGE
PUSHP A9 ;SAVE THIS NEW GUY
JSRP TROG_LOOK_FOLLOW ;IS HE AFTER SOMEONE?
PULLP A9
JRZ TROGDEFL_CONT ;BR = NO, JUST CONTINUE
MOVE *A0(MOVECPTR),A6,L
JRN TROGDEFL_NOCTR ;BR = NOT A CENTER POINT, NO SMASH
MOVB *A13(TTYPE),A6
CMPI TTYPE_CLUB,A6 ;IS HE CLUBBING?
JRNE TROGDEFL_NOCTR ;BR = NO
MOVE A11,A1
CALLA ONE_MOVE ;GET THE BONER MOVE
JRZ TROGDEFL_NOCTR
MOVB *A1(MOVEPLYR),A6 ;IS THERE A BONE WHERE WE TURNED
JRN TROGWXFER ;BR = NO, JUST WALK
CMPI PXPLAYER,A6
JREQ TROGDEFL_CONT_NOCENT
MOVB *A13(TSWINGS),A6
CMPI 3,A6 ;CAN HE STILL SWING, BAIL OUT
JRHI TROGDEFL_CONT_NOCENT ;BR = NO
MOVE A1,A0
JRUC TROG_BONE_SMASH ;CRUSH THAT BONE
TROGDEFL_NOCTR:
MOVE *A13(PTEMP1),A6,W
CMP A6,A11 ;GOING THE SAME WAY
JRNE TROGWXFER ;BR = NO, THEN JUST FOLLOW
MOVB *A0(MOVEPLYR),A6 ;IS THERE A BONE HERE?
JRN TROGWXFER ;BR = NO, DON'T WORRY
*
*WE FALL HERE IF TROG IS NOT CHASING A DINOSAUR OR TROG IS NOT ON A CENTER
*POINT.
TROGDEFL_CONT:
MOVE *A0(MOVECPTR),A6,L
JRN TROGDEFL_CONT_NOCENT ;BR = NOT A CENTER POINT, NO SMASH
MOVB *A13(TTYPE),A6
CMPI TTYPE_CLUB,A6 ;IS HE CLUBBING?
JRNE TROGDEFL_CONT_NOCENT ;BR = NO
MOVB *A13(TSWINGS),A6
CMPI 3,A6 ;CAN HE STILL SWING
JRHI TROGDEFL_CONT_NOCENT ;BR = NO
MOVE A11,A1
CALLA ONE_MOVE ;THE THE MOVE JUST AHEAD, BONE IS THERE
JRZ TROGDEFL_CONT_NOCENT
MOVB *A1(MOVEPLYR),A0 ;WHAT HAVE WE HERE
CMPI PXPLAYER,A0
JREQ TROGDEFL_CONT_NOCENT
MOVE A1,A0
JRUC TROG_BONE_SMASH ;CRUSH THAT BONE
TROGDEFL_CONT_NOCENT:
MOVE *A9(OATTRIB),A0,W
CALLA GETMOVE ;GET THE MOVE DATA AREA
MOVE A0,A3 ;STORE THE MOVE POINT LOCATION
CMPI UP,A11
JREQ TROGHDEFU ;DEFLECTING HORIZ. WHILE GOING UP
CMPI DOWN,A11
JREQ TROGHDEFD ;HORIZ. DEFLECT WHILE GOING DOWN
CLR A6 ;MOVK UP,A6
MOVK DOWN,A7 ;DIRECTIONS FOR DEFLECTION
CMPI LEFT,A11
JREQ TROGVDEFL ;VERT. DEFLECT WHILE GOING LEFT
*HANDLE DEFLECTION IN THE RIGHT DIRECTION
MOVE *A0(MOVEUL),A1,W ;WALLS TO BE CONCERNED WITH
MOVE *A0(MOVEDL),A2,W
MOVE *A0(MOVELF),A4,W
MOVK LEFT,A5 ;ABOUT FACE DIRECTION
JRUC TROGVDEC
*DEFLECTION IN THE LEFT DIRECTION
TROGVDEFL
MOVE *A0(MOVEUR),A1,W
MOVE *A0(MOVEDR),A2,W
MOVE *A0(MOVERT),A4,W
MOVK RIGHT,A5 ;ABOUT FACE DIRECTION
JRUC TROGVDEC
*DEFLECT WHILE GOING UP
TROGHDEFU
MOVE *A0(MOVEDR),A1,W
MOVE *A0(MOVEDL),A2,W
MOVE *A0(MOVEDN),A4,W
MOVK DOWN,A5
MOVK RIGHT,A6
MOVK LEFT,A7
JRUC TROGVDEC
*DEFLECT WHILE GOING DOWN
TROGHDEFD
MOVE *A0(MOVEUR),A1,W
MOVE *A0(MOVEUL),A2,W
MOVE *A0(MOVEUP),A4,W
CLR A5 ;MOVK UP,A5
MOVK RIGHT,A6
MOVK LEFT,A7
JRUC TROGVDEC
*DECIDE WHICH DIRECTION TO PROCEED
TROGVDEC
MOVE A4,A4
JRN TROGSKIP ;HE'S OUTSIDE, TRYING TO GET IN
CMP A1,A2
JRNE TROGDEC1 ;THERE MUST BE A MOVE SOMEWHERE
MOVE A1,A1
JRN TROGSKIP ;NO ADJACENT MOVES, SKIP THE COLL.
TROGDEC1:
MOVE A4,A0
CALLA GETMOVE ;GET THE REVERSE MOVE
MOVE *A0(MOVECPTR),A0,L ;CENTER, IT SHOULD BE
JRZ TROGDEFL_NOCC ;BR = NO
MOVE *A9(OID),A14,W
SRL 4,A14
SLL 4,A14
CMPI PXOID,A14 ;IS THIS A NON-DESTRUCTIBLE BONE?
JREQ TROGDEFL_NOCC ;BR = YES, THEN NO PASS
CALLR CENTER_CHECK
**** JRNZ TROGSKIP
JRNZ TROGDEFL_ABORT
MMTM SP,A1,A3,A4
MOVE *A0(CMOVEPOS),A3,L
CLR A1
CALLA DINOS_NEAR_PNT
MMFM SP,A1,A3,A4
**** JRNZ TROGSKIP
JRZ TROGDEFL_NOCC
*ABORT THIS DEFLECTION BECAUSE OF THE GUY IN THE CENTER BEHIND US
TROGDEFL_ABORT:
ORIM M_NOCOLL,*A8(OFLAGS),W ;MAKE SURE COLLISIONS ARE OFF
MOVE *A13(TWALKFRM),A9,L ;RESTORE THE CURRENT WALKING FRAME
JRUC TROGWLP
TROGDEFL_NOCC:
CALLA PSTOP ;AND STOP HIM
MOVE A2,A0
CALLA GETMOVE
MOVE A0,A2 ;STORE DOWN INFO HERE
MOVE A1,A0
CALLA GETMOVE
*NOTE: DON'T JUMP TO TROGSKIP UNTIL REMOVING THE REGISTERS ABOUT TO BE PUSHED.
MMTM A12,A0,A2,A3,A4 ;PUSH VITAL STUFF FOR SLEEP
MOVB *A0(MOVEPLYR),A3 ;ANY"BAR"DY HOME?
JRNN TROGVDD ;YES, HOPE FOR DOWN
MOVB *A2(MOVEPLYR),A4
JRN TROGVHMM ;WE CAN EITHER GO UP OR DOWN
MOVE A6,A11
JRUC TROGDONE
*HMMMMM I WONDER WHICH WAY TO GO?
TROGVHMM
MOVE *A12,A0,W ;GET THE MOVE POINT INDEX
CALLA GETMOVE ;GET THE MOVE DATA AREA
CALLR TROGCHOOSE
JRUC TROG_DEFL_CENTER
*LOOKING FOR AN OUT HERE, IF THERE IS ONE WE TAKE IT, OTHERWISE ABOUT FACE
TROGVDD
MOVB *A2(MOVEPLYR),A4
JRNN TROGAROUND
MOVE A7,A11
JRUC TROGDONE
*SEND THE DINOSAUR ABOUT FACE
TROGAROUND:
MOVE A5,A11
TROGDONE:
MOVE *A12,A0,W ;GET THE MOVE POINT INDEX
CALLA GETMOVE ;GET THE MOVE DATA AREA
TROG_DEFL_CENTER:
CALLR TROG_CENTER ;CENTER TROG ON THE MOVE POINT
MMTM A12,A5,A6,A7
JSRP DINOLOOK ;MAKE THE DINOSAUR LOOK AT NEW DIR.
MMFM A12,A5,A6,A7
MMFM A12,A0,A2,A3,A4
MOVE A4,*A13(PTEMP1),W ;NO SLEEPING 'TIL END
MOVB *A3(MOVEPLYR),A3
JRN TROGSKIP ;THE WALL HAS BEEN REMOVED, WALK ON
*TAKE A SECOND LOOK AT THE WALLS TO SEE IF ANYTHING CHANGED WHILE WE
*WERE SLEEPING.
MOVB *A0(MOVEPLYR),A3 ;ANY"BAR"DY HOME?
JRNN TROG2NDL ;YES, HOPE FOR DOWN
MOVB *A2(MOVEPLYR),A4
JRNN TROG2NDL0
CMP A5,A11 ;WAS HE GOING TO ABOUT FACE?
JRNE TROGSAME ;BR = NO, JUST DO THE SAME THING
MOVE *A13(PTEMP1),A0,W
CALLA GETMOVE
CALLR TROGCHOOSE
JRUC TROGFINALT
TROG2NDL0:
MOVE A6,A3
JRUC TROGFINAL
*LOOKING FOR AN OUT HERE, IF THERE IS ONE WE TAKE IT, OTHERWISE ABOUT FACE
TROG2NDL:
MOVB *A2(MOVEPLYR),A4
JRNN TROGABT
MOVE A7,A3
JRUC TROGFINAL
*SEND THE DINOSAUR ABOUT FACE
TROGABT:
MOVE A5,A3
TROGFINAL:
CMP A3,A11
JREQ TROGSAME
MOVE A3,A11
TROGFINALT:
JSRP DINOTURN
JRUC TROGSKIP
TROGSAME:
JSRP ANIMATE_TURN ;OTHERWISE ANIMATE THE REST
TROGSKIP:
JRUC TROGWXFER
**************************************************************************
* *
* TROGCHOOSE - CHOOSE WHICH WAY TO TURN OUT OF THREE GIVEN DIRECTIONS. *
* A0 = PTR TO MOVE THAT TROG IS CURRENTLY ON. *
* A5 = ABOUT FACE *
* A6 = ADJACENT DIRECTION 1 *
* A7 = ADJACENT DIRECTION 2 *
* A8 = PTR TO TROG *
* RETURNS: *
* A11 = CHOSEN DIRECTION *
* *
**************************************************************************
TROGCHOOSE:
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A9
MOVE A0,A1
MOVE A5,A2
MOVE A6,A3
MOVE A7,A4
MOVE A6,A0
CALLR TROG_SEARCH
MOVE A7,A0
MOVE A5,A7
MOVE A6,A9
CALLR TROG_SEARCH
CMP A6,A9 ;COMPARE RATINGS
JRLT TROGCH1
JRNE TROGCH0
CMP A5,A7
JRLT TROGCH1
JRNE TROGCH0
TROGCHTOSS:
CALLA RANDOM
SLL 1,A0
JRC TROGCH1
TROGCH0:
MOVE A3,A11
JRUC TROGCHX
TROGCH1:
MOVE A4,A11
TROGCHX:
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A9
RETS
**************************************************************************
* *
* TROG_PUNCH - PROCESS TO MAKE TROG THROW A PUNCH. *
* A8 = PTR TO TROG OBJECT *
* A13 = PTR TO TROG PROCESS *
* NOTE: THIS PROCESS ULTIMATELY TRANSFERS TO TROGWXFER *
* *
**************************************************************************
TROG_PUNCH:
MOVI PUNCHU,A0
MOVB *A13(TTYPE),A1
CMPI TTYPE_CLUB,A1
JREQ TROG_SWING_CLUB
JSRP ANIMATE_DIR
MOVK 2,A1
MOVB A1,*A13(DPUNCHFLG)
SLEEP 4
MOVK 1,A1
MOVB A1,*A13(DPUNCHFLG)
TROG_PUNCH_MISS
MOVK 1,A1
JSRP DINO_FRANIM
JRUC TROGWXFER
TROG_SWING_CLUB
JSRP ANIMATE_DIR
MOVK 2,A1
MOVB A1,*A13(DPUNCHFLG)
SLEEP 4
MOVK 1,A1
MOVB A1,*A13(DPUNCHFLG)
SOUND1 TROGCLUB_SND
CREATE INDPID,EARTHSHAKER
JRUC TROG_PUNCH_MISS
**************************************************************************
* *
* TROG_EAT - TROG HAS CONNECTED WITH A DINOSAUR, NOW MAKE HIM FEAST *
* A8 = PTR TO TROG *
* A11 = PTR TO DINO PROCESS *
* A13 = PTR TO TROG PROCESS *
* *
**************************************************************************
TROG_EAT
MOVK 1,A1
JSRP FRANIM ;ANIMATE THE REST
MOVI EATU,A0
CALLA LOAD_DIR
MOVK 4,A1
JSRP FRANIM
MOVI ACK_TROG_PUNCH,A2
MOVI 200,A3
JSRP COMM_WAIT_REMOTE
JRNZ TROG_PUNCH_DEFAULT
CALLA GET_TROG_CPNT ;GET TROG'S CENTER POINT
MOVE *A13(DDIR),A4,W ;AND LET'S FIND A DIRECTION
CMPI UP,A4
JRNE TROG_PUNCH_CK_D
ADDI [-7,0],A1
JRUC TROG_PUNCH_LINEUP
TROG_PUNCH_CK_D:
CMPI DOWN,A4
JRNE TROG_PUNCH_CK_L
ADDI [12,0],A1
JRUC TROG_PUNCH_LINEUP
TROG_PUNCH_CK_L:
CMPI LEFT,A4
JRNE TROG_PUNCH_R
ADDI [0,-20],A1
JRUC TROG_PUNCH_LINEUP
TROG_PUNCH_R:
ADDI [0,20],A1
TROG_PUNCH_LINEUP:
MOVE A1,A3
MOVE A8,A5
MOVE A11,A0
CALLA GETA8 ;GET DINO OBJECT FROM PROCESS
JRZ TROG_PUNCH_NOLINE ;BR = NOT THERE?
CALLA GET_DINO_CPNT ;GET THIS CENTER POINT
MOVE A8,A6
MOVE A5,A8
CMP A1,A3
JREQ TROG_GRUB ;BR = HE'S ALREADY THERE
MOVE A1,A2
MOVI 40,A4
CALLA SLINEVEL
MOVE A1,*A6(OXVEL),L
MOVE A2,*A6(OYVEL),L
MOVE A2,*A6(OZVEL),L
PUSHP A6
**** CLR A1
**** JSRP FRANIM ;ANIMATE FIRST TROG FRAME
SLEEP 40
MOVE A8,A5
PULLP A8
CALLA PSTOP ;STOP THE DINO NOW!
TROG_PUNCH_NOLINE:
MOVE A5,A8 ;RESTORE TROG OBJECT POINTER
*GET DOWN ON SOME SERIOUS GRUB ACTION!
TROG_GRUB
MOVE *A11(DPLAYER),A2,L
CLRM *A2(PSTARTESC),W ;ALLOW AN ESCAPE FROM THIS MADNESS
JRUC TROG_EAT_1ST
TROG_EAT_LP:
MOVE *A11(DPLAYER),A2,L
MOVE *A2(PSTARTESC),A14,W ;DOES THE PLAYER WANT TO LEAVE?
JRNZ TROG_PUNCH_EARLY ;BR = YES, ALLOW HIM TO DO SO
TROG_EAT_1ST
MOVK 1,A1
JSRP FRANIM
MOVE *A9,A1,L ;CHECK FOR SECOND NULL
JRZ TROG_EAT_DONE ;BR = WE ARE FINISHED PUNCHING
MOVK COMMAND_EAT,A1
MOVB A1,*A11(PCOMM) ;SEND THE REACT COMMAND
MOVI 60H,A10
TROG_EAT_ACK:
MOVB *A11(PCOMM),A1
CMPI ACK_TROG_EAT,A1
JREQ TROG_EAT_LP
DEC A10
JRZ TROG_PUNCH_DEFAULT
SLOOP 1,TROG_EAT_ACK
TROG_EAT_DONE:
MOVK COMMAND_EAT_DONE,A1
MOVB A1,*A11(PCOMM) ;SEND THE EAT DONE COMMAND
ADDK 32,A9
MOVK 1,A1
JSRP FRANIM
MOVE *A13(DATABLE),A10,L
MOVE *A13(DDIR),A11,W ;GET THE CURRENT DIRECTION
CALLA NOTDIR
MOVK DOWN,A0
MOVE A0,*A13(DDIR),W ;THIS IS THE WAY HE'S FACING
JSRP DINOTURN
SLEEP 10
TROG_EAT_EARLY
CLR A0
MOVB A0,*A13(DPUNCHFLG) ;CLEAR PUNCH FLAG
CALLR CLEAR_TRAP
CALLR CLEAR_PURSUIT
MOVE @GAME_STATE,A0,W
CMPI INAMODE,A0
JREQ TROG_DIG_NBT ;NO AUDIT DURING ATTRACT MODE
AUDIT AUDDCHOW
JRUC TROG_DIG_NBT
TROG_PUNCH_DEFAULT:
CLR A0
MOVB A0,*A13(DPUNCHFLG) ;CLEAR PUNCH FLAG
CALLR CLEAR_TRAP
JRUC TROG_REV
*
*SOMETHING HAPPENED, WE NEED TO ESCAPE
TROG_PUNCH_ESCAPE:
MOVK COMMAND_ESC,A1
MOVB A1,*A11(PCOMM) ;SEND THE ESCAPE COMMAND
CLR A0
MOVB A0,*A13(DPUNCHFLG) ;CLEAR PUNCH FLAG
JRUC TROGWXFER ;AND CONTINUE
*
*EARLY ESCAPE FROM THE FEAST
TROG_PUNCH_EARLY
MOVK COMMAND_EAT_DONE,A1
MOVB A1,*A11(PCOMM) ;SEND THE ESCAPE COMMAND
JRUC TROG_EAT_EARLY ;AND CONTINUE
**************************************************************************
* *
* PUNCH_ABORT - DETERMINE IF WE SHOULD ABORT THE PUNCHING SEQUENCE. *
* A8 = PTR TO TROG OBJECT *
* A11 = PTR TO DINO PROCESS *
* RETURNS *
* Z = DO NOT ABORT *
* NZ = MUST ABORT *
* NOTE: DESTROYS A14 *
* *
**************************************************************************
PUNCH_ABORT
PUSH A0
MOVE A11,A0
MOVE A8,A14
CALLA GETA8
MOVE A8,A0
MOVE A14,A8
CALLA BONE_BETWEEN ;CHECK IF A BONE CAME BETWEEN US
JRNZ PA_X
MOVB *A11(DINVIN),A0 ;DID THE DINO GO INVINCIBLE
PA_X
PULL A0
RETS
**************************************************************************
* *
* TROG_OOF - PROCESS TO MAKE TROG REACT TO PUNCH. *
* A8 = PTR TO TROG OBJECT *
* A9 = PROCESS BLOCK OF THE DINO DOING THE PUNCHING *
* A13 = PTR TO TROG PROCESS *
* *
**************************************************************************
TROG_OOF:
MOVK 1,A0
MOVB A0,*A13(DDIZZYFLG)
MOVE A9,*A13(PTEMP2),L ;STORE THE PTR TO THE DINO PROCESS
MOVE *A9(DDIR),*A13(PTEMP3),W ;GRAB THE DINOSAUR DIR FOR LATER
MOVE *A13(PTEMP2),A2,L
MOVE *A2(DPLAYER),A2,L
MOVI 100H,A1
CALLA SCORE
MOVK 1,A1
MOVB A1,*A13(TPURSUIT) ;PUT HIM IN PURSUIT OF THIS DINO NOW!
MOVB A1,*A13(TPRESET) ;PUSH HIM IN IF YOU CAN
MOVE *A2(POBJ),*A13(TDINO),L
CALLA GPLAYNUM
MOVB A0,*A13(TPLAYER)
SOUND1 PUNCH_SND
MOVB *A13(TTYPE),A0
CMPI TTYPE_WHL,A0 ;IS THIS THE WHEEL MAN?
JREQ TROG_OOF_WHEEL ;BR = YES, THEN HANDLE IT THAT WAY
MOVE @FREEZE_TIME,A0,W ;IS HE FROZEN?
JRNZ TROG_OUTTA_HERE ;BR = YES, THEN HE CAN BE SMACKED OUT
MOVB *A13(THITS),A0
INC A0
CMPI 3,A0
JRHS TROG_OUTTA_HERE
MOVB A0,*A13(THITS)
MOVI OOFU,A0
JSRP ANIMATE_DIR
ANDNIM M_NOCOLL,*A8(OFLAGS),W
CLR A0
MOVB A0,*A13(DDIZZYFLG)
MOVB *A13(TTYPE),A0
CMPI TTYPE_SPRING,A0
JAEQ TROGBXFER
JRUC TROGWXFER
*DO THIS TO THE WHEEL GUY
TROG_OOF_WHEEL
SUBIM 12,*A8(OYPOS),W
SLEEP 4
ADDIM 12,*A8(OYPOS),W
TO_WHEEL_OUT
MOVI WHEELU,A0
CALLA LOAD_DIR
CALLA SKIP_ANIMATION
MOVK 4,A1
JSRP FRANIM
JRUC TROGWHL_DONE
TROG_OUTTA_HERE
SOUND1 TROGUGH_SND
MOVE *A13(PTEMP2),A2,L
MOVE *A2(DPLAYER),A2,L
MOVI 500H,A1
CALLA SCORE
INCM *A2(PTROGKILLS),W
MOVI KOU,A0
CALLA LOAD_DIR
CREATE INDPID,TA_FALL
MOVE *A13(PTEMP3),A0,W
MOVI [8,0],A1
CALLR DIR_VELOCITY
MOVIM PIZPOS,*A8(OZPOS),W
MOVE *A13(PTEMP2),A11,L
MOVE *A11(DPLAYER),A11,L
MOVE A11,A2
MOVI 500H,A1
CALLA SCORE
TOH_WAIT
MOVE A11,A2
MOVK 5,A1
CALLA SCORE
SLEEP 5
CALLA SCRTST
JREQ TOH_WAIT
CALLR DELETE_TROG
DIE ;AND BYE BYE BIRDIE
*
*JUST ANIMATE AND DIE
*A8 = OBJECT
*A9 = SCRIPT
TA_FALL
MOVK 1,A1
JSRP FRANIM
DIE
**************************************************************************
* *
* DIR_POSITION - ADD THE GIVEN PIXELS TO THE CURRENT POSITION OF AN *
* OBJECT WITH RESPECT TO THE GIVEN DIRECTION. *
* A0 = DIRECTION *
* A1 = PIXELS TO ADD *
* A8 = PTR TO OBJECT *
* RETURNS: *
* A1 = PIXELS ADDED *
* *
**************************************************************************
DIR_POSITION
CMPI UP,A0
JREQ DP_UP
CMPI DOWN,A0
JREQ DP_DOWN
CMPI LEFT,A0
JREQ DP_LEFT
DP_RIGHT
ADDRM A1,*A8(OXPOS),W
RETS
DP_LEFT
NEG A1
JRUC DP_RIGHT
DP_DOWN
ADDRM A1,*A8(OYPOS),W
RETS
DP_UP
NEG A1
JRUC DP_DOWN
**************************************************************************
* *
* DIR_VELOCITY - STUFF THE GIVEN VELOCITY INTO THE CORRECT COMPONENT *
* OF AN OBJECT WITH RESPECT TO THE GIVEN DIRECTION. *
* A0 = DIRECTION *
* A1 = VELOCITY *
* A8 = PTR TO OBJECT *
* RETURNS: *
* A1 = VELOCITY STUFFED *
* *
**************************************************************************
DIR_VELOCITY
CMPI UP,A0
JREQ DV_UP
CMPI DOWN,A0
JREQ DV_DOWN
CMPI LEFT,A0
JREQ DV_LEFT
DV_RIGHT
MOVE A1,*A8(OXVEL),L
RETS
DV_LEFT
NEG A1
JRUC DV_RIGHT
DV_DOWN
MOVE A1,*A8(OYVEL),L
RETS
DV_UP
NEG A1
JRUC DV_DOWN
**************************************************************************
* *
* TROGPIT_FALL - PROCESS TO MAKE TROG FALL DOWN A SMALL PIT *
* A8 = PTR TO TROG OBJECT *
* A9 = PTR TO PIT OBJECT *
* *A13(DATABLE),L = PTR TO ANIMATION TABLE *
* *A13(DDIR),W = CURRENT TROG DIRECTION *
* NOTE: THIS PROCESS ULTIMATELY TRANSFERS TO TROG_DEATH_DONE. *
* *
**************************************************************************
TROGPIT_FALL:
MOVE *A9(OID),A0,W
CMPI TUNNELOID,A0
JREQ TROGTUNNEL_FALL
PUSHP A9
MOVE A8,A5
MOVE A9,A8
CALLA OBJPROC_KILL ;KILL THE CONTROL
CALLA GETANIXY ;LET'S GET A RETURN POINT
SRL 16,A3
MOVY A2,A3
MOVE A3,*A13(DINITPOS),L
MOVE A5,A8
CALLA GETCPNT ;GET THE CENTER POINT OF THE TROG
MOVE A1,A2
MOVI 38H,A4
CALLA SLINEVEL
MMTM A12,A1,A2
CALLA PSTOP
CALLR SCORE_TO_PLAYER
MOVI OGPITU,A0
JSRP ANIMATE_DIR
MMFM A12,A1,A2
MOVE A1,*A8(OXVEL),L
MOVE A2,*A8(OYVEL),L
MOVK 1,A1
JSRP FRANIM ;ANIMATE THE REST OF THE FALL
CALLA PSTOP
CALLA OBJ_OFF ;TURN TROG OFF
MOVE A8,A5
PULLP A8 ;GET PIT POINTER
MOVE A8,A0
MOVI ENEMIES,A1
CALLA ISSUPP
JRZ FALL_NOPIT ;BR = PIT IS GONE, DON'T WORRY HERE
CALLA DELSUPP ;TAKE IT OFF FOR COLLISIONS
PITNSUPP:
CALLA FREE_MOVE_EGG
PUSHP A5
MOVI PIT_CLOSE,A9
MOVK 1,A1
JSRP FRANIM
PULLP A5
CALLA DELETE_OBJ
FALL_NOPIT:
MOVE A5,A8
**** SLEEP 1
**** CLR A4
**** PUSHP A4 ;RETURN POINT ALREADY STUFFED
**** JRUC TROG_DEATH_DONE
CALLR DELETE_TROG
DIE
*
*SIMPLE TROG FALL W/NO PIT CLOSE
*A8 = TROG
*A9 = PIT
*A13 = TROG PROCESS
TROGTUNNEL_FALL:
MOVE A8,A5
MOVE A9,A8
CALLA GETANIXY ;LET'S GET A RETURN POINT
SRL 16,A3
MOVY A2,A3
MOVE A3,*A13(DINITPOS),L
MOVE A5,A8
CALLA GETCPNT ;GET THE CENTER POINT OF TROG
MOVE A1,A2
MOVI 38H,A4
CALLA SLINEVEL
MMTM A12,A1,A2
CALLA PSTOP
CALLR SCORE_TO_PLAYER
MOVI OGPITU,A0
JSRP ANIMATE_DIR
MMFM A12,A1,A2
MOVE A1,*A8(OXVEL),L
MOVE A2,*A8(OYVEL),L
MOVK 1,A1
JSRP FRANIM ;ANIMATE THE REST OF THE FALL
CALLA PSTOP
CALLA OBJ_OFF ;TURN TROG OFF
**** SLEEP 1
**** CLR A4
**** PUSHP A4 ;RETURN POINT ALREADY STUFFED
**** JRUC TROG_DEATH_DONE
CALLR DELETE_TROG
DIE
**************************************************************************
* *
* TROGTAR_SINK - PROCESS TO MAKE TROG SINK INTO TAR AND DIE. *
* A8 = PTR TO TROG OBJECT *
* A9 = PTR TO TAR OBJECT *
* *A13(DATABLE),L = PTR TO ANIMATION TABLE *
* *A13(DDIR),W = CURRENT DIRECTION *
* *A13(DVEL),L = CURRENT VELOCITY *
* NOTE: THIS PROCESS ULTIMATELY TRANSFERS TO TROG_DEATH_DONE *
* *
**************************************************************************
TROGTAR_SINK:
MOVE A9,A0
MOVE A9,A4 ;STORE HERE DURING LOAD
MOVI ENEMIES,A1
CALLA ISSUPP
JRZ TARNSUPP ;BR = TAR NOT ON SUPP LIST
CALLA DELSUPP ;TAKE IT OFF FOR COLLISIONS
JRUC TARNPUSH
TARNSUPP:
CLR A9
TARNPUSH:
PUSHP A9
MOVE A8,A5
MOVE A4,A8
MOVE *A8(OPLINK),A0,L
JRZ TAR_POS
CALLA GETA9
MOVK 1,A11
MOVI INDPID,A1
MOVI ANIMATOR,A7
CALLA XFERPROC ;TRANSFER TO A LESSER GOD
TAR_POS:
MOVE *A13(DDIR),A0,W
CMPI UP,A0
JREQ TAR_FROM_DOWN
PUSHP A8
MOVE A5,A8
MOVE *A13(DATABLE),A10,L
CALLA DINOLOAD
MOVI [0,0402H],A1
JSRP DINO_FRANIM
MOVE A8,A5
PULLP A8
TAR_FROM_DOWN:
CALLA GETANIXY ;LET'S GET A RETURN POINT
MOVE A5,A8
SRL 16,A3
MOVY A2,A3
MOVE A3,*A13(DINITPOS),L
CALLA FINDMOVE
JRNC TROGTAR_SKC ;BR = SKIP THE CENTERING, NOT A MOVE
MOVE A1,A0
MOVE *A0(MOVEPOS),A1,L
SUBI [5,0],A1
CALLR TROG_NEW_PNT
TROGTAR_SKC:
CALLR SCORE_TO_PLAYER
MOVI TARU,A0
JSRP FRANIMATE_DIR ;ANIMATE THIS GUY
SOUND1 TARBUBBLE_SND ;BUBBLE THE TAR
MOVI 04000H,A2
JSRP CLIP_INTO
MOVE A8,A5
PULLP A8 ;GET TAR POINTER
MOVE A8,A8 ;IS THERE SOMETHING THERE?
JRZ SINK_NOTAR ;BR = ALREADY TAKEN CARE OF
PUSHP A5
CALLA OBJPROC_KILL ;KILL THE TAR CONTROL
MOVI TAROUT,A9
MOVK 1,A1
JSRP FRANIM ;FADE THE TAR FROM EXISTANCE
PULLP A5
CALLA FREE_MOVE_EGG
CALLA DELETE_OBJ
SINK_NOTAR:
MOVE A5,A8
**** CLR A4
**** PUSHP A4 ;RETURN POINT ALREADY STUFFED
**** JRUC TROG_DEATH_DONE
CALLR DELETE_TROG
DIE
**************************************************************************
* *
* TROGFIRE_BURN - PROCESS TO MAKE TROG BURN IN THE FIRE. *
* A8 = PTR TO TROG OBJECT *
* A9 = PTR TO FIRE OBJECT *
* *A13(DATABLE),L = PTR TO ANIMATION TABLE *
* *A13(DDIR),W = CURRENT DINO DIRECTION *
* NOTE: THIS PROCESS ULTIMATELY TRANSFERS TO TROG_DEATH_DONE *
* *
**************************************************************************
TROGFIRE_BURN:
MOVE A9,A0
MOVE A9,A4 ;STORE HERE DURING LOAD
MOVI ENEMIES,A1
CALLA ISSUPP
JRZ FIRENSUPP ;BR = FIRE NOT ON SUPP LIST
CALLA DELSUPP ;TAKE IT OFF FOR COLLISIONS
JRUC FIRENPUSH
FIRENSUPP:
CLR A9
FIRENPUSH:
PUSHP A9
FIRENPROC:
MOVE A8,A5
MOVE A4,A8
MOVE *A8(OPLINK),A0,L
JRZ FIRE_POS
MOVI FIRE_UP_MONKEY_SHIT,A9
MOVK 1,A11
MOVI INDPID,A1
MOVI ANIMATOR,A7
CALLA XFERPROC ;TRANSFER TO A LESSER GOD
FIRE_POS:
CALLA GETANIXY ;LET'S GET A RETURN POINT
MOVE A5,A8
SRL 16,A3
MOVY A2,A3
MOVE A3,*A13(DINITPOS),L
CALLA FINDMOVE
JRNC TROGFIRE_SKC ;BR = SKIP THE CENTERING, NOT A MOVE
MOVE A1,A0
CALLR TROG_CENTER ;CENTER TROG ON THIS POINT
TROGFIRE_SKC:
MOVE *A8(OYPOS),A5,W
SUBK 12,A5
MOVE A5,*A8(OYPOS),W
CALLR SCORE_TO_PLAYER
MOVI FIREU,A0
JSRP FRANIMATE_DIR
MOVE *A8(OYPOS),A5,W
ADDK 12,A5
MOVE A5,*A8(OYPOS),W
MOVE A8,A5
PULLP A8 ;GET FIRE POINTER
MOVE A8,A8 ;IS THERE SOMETHING THERE?
JRZ BURN_NOFIRE ;BR = ALREADY TAKEN CARE OF
CALLA FREE_MOVE_EGG
CALLA OBJPROC_KILL ;KILL THE CONTROL
CALLA DELETE_OBJ
BURN_NOFIRE:
MOVE A5,A8
MOVK 1,A1
JSRP FRANIM ;ANIMATE THE BURN
MOVK 3,A4
MOVB A4,*A13(DDIZZYFLG) ;RETURN BURNT
**** CLR A4
**** PUSHP A4
**** JRUC TROG_DEATH_DONE
CALLR DELETE_TROG
DIE
**************************************************************************
* *
* TROG_SQUASH - PROCESS TO SQUASH TROG WITH THE WHEEL. *
* A8 = PTR TO TROG OBJECT *
* A10 = PTR TO WHEEL PROCESS *
* A11 = TROG PROCESS A11 *
* A13 = PTR TO TROG PROCESS *
* NOTE: THIS PROCESS ULTIMATELY TRANSFERS TO TROG_DEATH_DONE. *
* *
**************************************************************************
TROG_SQUASH:
MOVE A11,*A13(PTEMP1),L
CALLA GET_TROG_CPNT
ADDI [5,0],A1
CALLA FIND_CLOSE_CPNT ;FIND US A RETURN POINT
MOVE A3,*A13(DINITPOS),L
CALLR SCORE_TO_PLAYER ;GIVE SOME SCORE TO THE PLAYER
MOVE *A9(OZVAL),A0,L
DEC A0
MOVE A0,*A8(OZVAL),L ;TROG IS BEHIND WHEEL
MOVE *A13(DDIR),A0,W
SLL 2,A0
MOVE *A10(DDIR),A1,W
ADD A1,A0
MOVE *A10(DSMULT),A3,W
ADDI SQUISHUU,A0
MOVE *A13(DATABLE),A10,L
CALLA DINOLOAD
MOVK 1,A1
SLL 16,A3
MOVY A3,A1 ;ANIMATE AT THE SPEED OF THE WHEEL
JSRP FRANIM
MOVE A8,A0
CALLA SET_MZPOS ;LIE HIM FLAT
SLEEP 80
MOVB *A13(TTYPE),A1
CMPI TTYPE_WHL,A1
JREQ TS_WHEEL
MOVK 1,A1
JSRP FRANIM ;ANIMATE HIM BACK INTO THE HOLE
CALLR DELETE_TROG
DIE
TS_WHEEL
MOVE *A13(PTEMP1),A11,L
JRUC TROGWHL_DONE
**************************************************************************
* *
* TROG_REV - REVERSE THE TROGSTER *
* A13 = PTR TO TROGS PROCESS *
* NOTE: ENDS UP AT TROGWXFER *
* *
**************************************************************************
TROG_REV
MOVE *A13(DATABLE),A10,L ;FIRST WE NEED THE ANIMATION TABLE
MOVE *A13(DDIR),A11,W ;AND THEN WE NEED THE DIRECTION
**** CALLR GET_TROG_CPNT
**** ADDI [5,0],A1
**** CALLA FIND_CLOSE_MPNT ;FIND OUR CLOSEST MOVE POINT
CALLR GET_TROG_MPNT
MOVE *A0(MOVECPTR),A0,L ;IS IT A CENTER?
JRNZ TROG_REV_REV ;BR = NO
MOVE A3,A1 ;EVERYBODY! GET...IN...LINE.
TROG_REV_REV:
CALLA NOTDIR ;GET THE OTHER DIRECTION
JSRP DINOTURN ;TURN THE TROG
JRUC TROGWXFER
**************************************************************************
* *
* GET_TROG_CPNT - GET THE CENTER POINT OF THE INTIAL TROG FRAME, *
* WITH RESPECT TO HIS CURRENT ANIMATION POINT. *
* A8 = PTR TO TROG OBJECT *
* RETURNS: *
* A1 = [Y,X] CENTER POINT *
* *
**************************************************************************
GET_TROG_CPNT:
PUSH A4
MOVI TROGINIT,A4
CALLA GET_INIT_CPNT ;GET TROG'S INTIAL CENTER POINT
PULL A4
RETS
**************************************************************************
* *
* GET_TROG_MPNT - GET THE CLOSEST MOVE POINT TO TROG. *
* A8 = PTR TO THE TROG OBJECT *
* RETURNS: *
* A0 = CLOSEST MOVE POINT DATA *
* A1 = [Y,X] CENTER POINT OF TROG *
* A3 = [Y,X] MOVE POINT OF TROG *
* *
**************************************************************************
GET_TROG_MPNT
CALLR GET_TROG_CPNT ;THIS IS HIS NEW CENTER
ADDI [5,0],A1
JAUC FIND_CLOSE_MPNT
**************************************************************************
* *
* TROG_CENTER - ALIGN THE CENTER OF TROG ON THE CENTER *
* OF THE BOX HE IS IN, WITH ANIMATION. *
* A0 = PTR TO MOVE THAT IS IN THE CENTER OF THE BOX *
* A8 = PTR TO TROG *
* *
**************************************************************************
TROG_CENTER:
PUSH A1
MOVE *A0(MOVEPOS),A1,L
CALLR TROG_NEW_PNT
PULL A1
RETS
**************************************************************************
* *
* TROG_NEW_PNT - ALIGN THE CENTER OF TROG ON A NEW PNT. *
* A1 = [Y,X] PNT TO ALIGN TROG ON *
* A8 = PTR TO TROG *
* *
**************************************************************************
TROG_NEW_PNT:
MMTM SP,A0,A1,A7
SUBI [5,0],A1 ;MOVE HIM UP
MOVE A1,A7 ;STORE ALIGNMENT POINT
CALLR GET_TROG_CPNT
MOVE A7,A0
CALLA ALIGNOBJ
MOVE A8,A0
CALLA SET_ZPOS
MMFM SP,A0,A1,A7
RETS
**************************************************************************
* *
* CK_TROG_CENT - CHECK IF TROGS CENTER PNT IS IN RANGE OF THE CENT. OF *
* ANOTHER OBJECT. *
* A0 = TROG OBJECT *
* A8 = THE OTHER OBJECT *
* RETURNS: *
* NC = NOT EVEN CLOSE *
* C = CLOSE *
* *
**************************************************************************
CK_TROG_CENT:
MMTM SP,A1,A2,A3,A8
CALLA GETCPNT ;GET CENTER POINT OF OTHER OBJECT
MOVE A1,A3
MOVE A0,A8
CALLR GET_TROG_CPNT
ADDI [0AH,0],A1 ;ADD A FUDGE FACTOR
MOVI [8,8],A2 ;FIX THE RANGE
CALLA PNT_IN_RANGE
MMFM SP,A1,A2,A3,A8
RETS
**************************************************************************
* *
* CK_TROGDINO_CENT - CHECK IF TROGS CENTER IS CLOSE ENOUGH TO A DINOS *
* CENTER TO HIT HIM WITH BARE HANDS. *
* A0 = TROG OBJECT *
* A8 = THE OTHER OBJECT *
* RETURNS: *
* NC = NOT EVEN CLOSE *
* C = CLOSE *
* *
**************************************************************************
CK_TROGDINO_CENT:
MMTM SP,A1,A2,A3,A8
CALLA GETCPNT ;GET CENTER POINT OF OTHER OBJECT
MOVE A1,A3
MOVE A0,A8
CALLR GET_TROG_CPNT
ADDI [5,0],A1 ;ADD A FUDGE FACTOR
MOVI [12,8],A2 ;FIX THE RANGE
CALLA PNT_IN_RANGE
MMFM SP,A1,A2,A3,A8
RETS
WALL_RATING .EQU 1
FLOWER_RATING .EQU 2
DINO_RATING .EQU 10
**************************************************************************
* *
* TROG_SEARCH - SEARCH A DIRECTION UNTIL WE FIND SOMETHING THAT *
* WOULD BE GOOD FOR TROG. *
* A0 = DIRECTION TO SEARCH *
* A1 = PTR TO STARTING MOVE PNT *
* RETURNS: *
* A5 = STEPS 'TIL END *
* A6 = RATING (0=DEATH,1=WALL, >1 = SAFER) *
* *
**************************************************************************
TROG_SEARCH:
MMTM SP,A0,A1,A3,A4
SWAP A0,A1
SLL 4,A1
ADDI MOVEREL,A1
CLR A5 ;CLEAR STEP COUNT
CLR A6 ;CLEAR RATING
TROG_SRCH_SAFLP:
MOVE A0,A3
ADD A1,A0
MOVE *A0,A0,W ;NEXT MOVE PLEASE
JRN TROG_SRCH_X ;BR = WE HAVE HIT THE END
TROG_SRCH_MOVE:
CALLA GETMOVE
MOVE *A0(MOVEPOS),A3,L
MMTM SP,A0,A1
CLR A1
CALLA DINOS_NEAR_PNT
MMFM SP,A0,A1
JRNZ TROG_SRCH_DINO ;WE GOT WHAT WE WANT!
MOVB *A0(MOVEPLYR),A3 ;DID WE HIT A WALL?
JRNN TROG_SRCH_WALL ;BR = YES
MOVE *A0(MOVECPTR),A3,L ;GRAB THE CENTER MOVE PTR
JRN TROG_SRCH_NOTHING ;BR = NOT A CENTER MOVE
MOVB *A3(CMOVEEGG),A3 ;IS THERE AN EGG ON THIS SPOT
INC A3
JREQ TROG_SRCH_NOTHING ;BR = NOTHING HERE
DEC A3
CMPI TARID,A3 ;ARE WE DEALING WITH A TAR PIT HERE?
JREQ TROG_SRCH_X ;BR = YES WE ARE
CMPI FIREID,A3 ;FIRE?
JREQ TROG_SRCH_X ;BR = YES
CMPI PITID,A3 ;LOCAL PIT?
JREQ TROG_SRCH_X ;BR = YES
CMPI SHROOMID,A3
JREQ TROG_SRCH_X
CMPI FLOWERID,A3
JREQ TROG_SRCH_FLOWER
TROG_SRCH_NOTHING:
INC A5 ;INCREMENT THE STEP COUNT
JRUC TROG_SRCH_SAFLP
TROG_SRCH_WALL:
ADDK WALL_RATING,A6
JRUC TROG_SRCH_X
TROG_SRCH_DINO:
ADDK DINO_RATING,A6
JRUC TROG_SRCH_X
TROG_SRCH_FLOWER:
ADDK FLOWER_RATING,A6
JRUC TROG_SRCH_X
TROG_SRCH_X:
MMFM SP,A0,A1,A3,A4
RETS
**************************************************************************
* *
* FIND_MVD - FIND THE MOST VALUABLE DINO FROM THE GIVEN MOVE POINT. *
* STARTS IN THE GIVEN DIRECTION. IF THE MOVE POINT IS *
* NOT A CENTER POINT THEN ONLY THAT DIRECTION AND *
* THE OPPOSITE ARE SEARCHED. *
* A0 = PTR TO MOVE POINT *
* A1 = STARTING DIRECTION *
* A3 = SEE THROUGH FLAG, *
* IF 0, STOP IF YOU HIT A BONE. *
* IF 1, SEE THROUGH THE BONES (CLUB MAN). *
* *A13(TDINO),L = PTR TO DINO THAT TROG IS CURRENTLY PURSUING *
* RETURNS: *
* Z = NOTHING FOUND *
* A2 = 0 *
* A4 = 0 *
* A5 = 0 *
* NZ = DINO FOUND *
* A2 = DIRECTION *
* A4 = PTR TO DINOSAUR OBJECT *
* A5 = # STEPS AWAY FROM DINOSAUR *
* *
**************************************************************************
FIND_MVD:
MMTM SP,A1,A6,A7,A8,A9,A11
CLR A2
CLR A7 ;FOUND DINO FLAG
CLR A6
CLR A8
MOVE *A0(MOVECPTR),A2,L ;IS THIS A CENTER
JRN FMVD_2WAY ;BR = NO, JUST SEARCH TWO WAYS
MOVE A1,A9
FIND_MVD_LP:
CALLR SEARCH_DINO
JRZ FMVD_NEXT_DIR
CALLR FMVD_COMPARE
FMVD_NEXT_DIR:
INC A1
CMPI RIGHT,A1
JRLS FMVD_NOT_TOPPED
MOVI UP,A1
FMVD_NOT_TOPPED:
CMP A1,A9 ;HAVE WE HIT THE STARTING POINT?
JRNE FIND_MVD_LP ;BR = NO
FMVD_X:
MOVE A8,A5
MOVE A6,A4
MMFM SP,A1,A6,A7,A8,A9,A11
RETS
*JUST SEARCH BOTH FOWARD AND BACKWARD HERE
FMVD_2WAY:
CALLR SEARCH_DINO
JRZ FMVD_OPP
CALLR FMVD_COMPARE
FMVD_OPP:
MOVE A1,A11
CALLA NOTDIR
MOVE A11,A1
CALLR SEARCH_DINO
JRZ FMVD_X
CALLR FMVD_COMPARE
JRUC FMVD_X
*
*SUBROUTINE FOR FIND_MVD
*USE ONLY WITH FIND_MVD
*A1 = DIRECTION
*A4 = DINO PTR
*A5 = STEPS AWAY
*A13(TDINO),L = DINO THAT TROG IS CURRENTLY CHASING
*RETURNS:
*A2 = DIRECTION OF BEST DINOSAUR
*A6 = BEST DINOSAUR
*A8 = # OF STEPS TO BEST DINOSAUR
*A7 = FOUND FLAG/RATING
FMVD_COMPARE:
MMTM SP,A10,A11
MOVE *A4(OPLINK),A11,L
JRZ FMVD_CX
MOVB *A11(DTREXFLG),A10 ;IS THIS DINO MAD?
JRNZ FMVD_CX ;BR = YES, HE'S NOT VERY VALUABLE
MOVE *A13(TDINO),A10,L
CMP A4,A10 ;IS THIS WHO I'VE BEEN LOOKING FOR?
JRNE FMVD_TEST_REST ;BR = NO
MOVK 1,A7
JRUC FMVD_ADD_NEW
FMVD_TEST_REST:
MOVB *A11(DDIZZYFLG),A10 ;IS THIS GUY DISABLED?
JRNE FMVD_CX ;BR = YES, THEN DON'T BOTHER HIM
MOVB *A11(DINVIN),A10 ;IS THIS GUY INVINCIBLE?
JRNE FMVD_CX ;BR = YES, THEN DON'T BOTHER HIM
MOVE *A11(DPLAYER),A10,L
MOVE *A10(PBOZO),A10,W ;IS THIS GUY A BOZO
CMPI 2,A10
JRHS FMVD_CX ;BR = YES, DON'T PICK ON HIM
**** JRNE FMVD_CX
MOVE A7,A7 ;HAS ONE BEEN FOUND AT ALL?
JRZ FMVD_ADD_2 ;BR = NO, THEN THIS IS THE ONE
CMPI 2,A7 ;IS THE LOADED GUY A BOZO
JRHI FMVD_ADD_2 ;BR = YES, THEN LOAD THIS ONE NOW
JRLO FMVD_CX ;BR = LOWER ONE
CMP A8,A5 ;IS THIS ONE, CLOSER?
JRHI FMVD_CX ;BR = NO
FMVD_ADD_2:
MOVK 2,A7
FMVD_ADD_NEW:
MOVE A4,A6
MOVE A1,A2
MOVE A5,A8
FMVD_CX:
MMFM SP,A10,A11
RETS
**************************************************************************
* *
* SEARCH_DINO - LOOK ALONG A STRAIGHT LINE FOR ANY DINOS THAT MAY EXIST. *
* A0 = STARTING MOVE POINT *
* A1 = DIRECTION TO SEARCH *
* A3 = SEE THROUGH FLAG, *
* IF 0, STOP IF YOU HIT A BONE. *
* IF 1, SEE THROUGH THE BONES (CLUB MAN). *
* RETURNS: *
* Z = NO DINO FOUND: *
* A4 = 0 *
* A5 = UNDEFINED *
* NZ = DINO FOUND: *
* A4 = PTR TO DINO OBJECT *
* A5 = # OF STEPS *
* *
**************************************************************************
SEARCH_DINO:
MMTM SP,A0,A1,A2,A3,A6,A7,A8,A9
MOVE A3,A9 ;KEEP BONE FLAG HERE
MOVI DINOOID,A7
MOVI 0FFF0H,A2
MOVE A1,A6
CLR A5
SEARCH_DINO_LP:
CALLA ONE_MOVE
JRZ SEARCH_DINO_FL ;BR = NO MORE MOVES ALONG THIS POINT
MOVE A9,A9 ;CAN WE SEARCH THROUGH BONES?
JRNZ SEARCH_DINO_AL ;BR = YES
MOVB *A1(MOVEPLYR),A3 ;CHECK FOR A BONE
JRNN SEARCH_DINO_FL ;BR = THERE IS ONE, BETTER CAN IT
SEARCH_DINO_AL:
INC A5
MOVE A1,A8
MOVE *A1(MOVEPOS),A3,L
MOVE A7,A0
MOVE A2,A1
CALLA DINOS_NEAR_PNT
JRNZ SEARCH_DINO_FOUND
MOVE A8,A0
MOVE A6,A1
JRUC SEARCH_DINO_LP
SEARCH_DINO_FL:
CLR A0
SEARCH_DINO_FOUND:
MOVE A0,A4
MMFM SP,A0,A1,A2,A3,A6,A7,A8,A9
RETS
**************************************************************************
* *
* GET_BEST_DIR_TO_MOVE - GET THE BEST DIRECTION TO GO FROM THIS MOVE POI *
* TO ANOTHER MOVE POINT. *
* A0 = PTR TO CURRENT MOVE POINT *
* A4 = PTR TO OTHER MOVE POINT *
* A8 = PTR TO CHASING OBJECT *
* A11 = CURRENT DIRECTION OF THE CHASING OBJECT *
* RETURNS: *
* Z = NO NEW DIRECTION COULD BE FOUND, I.E. 1x1 BOX, *
* A1 = 0 *
* NZ = NEW DIRECTION FOUND, *
* A1 = DIRECTION *
* *
**************************************************************************
GET_BEST_DIR_TO_MOVE:
MMTM SP,A2,A3
SWAP A0,A4
CALLR GET_DIRECTIONS_TO_MOVE
SWAP A0,A4
JRUC GET_BEST_GEN
**************************************************************************
* *
* GET_BEST_DIRECTION - GET THE BEST DIRECTION TO GO FROM THIS MOVE POINT *
* TO CATCH ANOTHER OBJECT. *
* A0 = PTR TO CURRENT MOVE POINT *
* A4 = PTR TO OBJECT TO CATCH *
* A8 = PTR TO THE CHASING OBJECT *
* A11 = CURRENT DIRECTION OF THE CHASING OBJECT *
* RETURNS: *
* Z = NO NEW DIRECTION COULD BE FOUND, I.E. 1x1 BOX, *
* A1 = 0 *
* NZ = NEW DIRECTION FOUND, *
* A1 = DIRECTION *
* *
**************************************************************************
GET_BEST_DIRECTION:
MMTM SP,A2,A3
CALLR GET_DIRECTIONS
*
*ENTRYPOINT FOR GET_BEST_DIRECTIONS
*A1 = FIRST CHOICE DIR
*A2 = SECOND
GET_BEST_GEN:
MOVE A11,A3
CALLA NOTDIR
SWAP A11,A3
CMP A3,A1 ;IS THE BEST THE SAME AS REVERSING
JREQ GET_BEST_CHECK_NEXT ;BR = YES
CALLR CHECK_DIRECTION
JRNZ GET_BEST_X
GET_BEST_CHECK_NEXT:
MOVE A2,A1
CMP A3,A1 ;IS THE SECOND THE SAME AS REVERSING
JREQ GET_BEST_X ;BR = YES
CALLR CHECK_DIRECTION
JRNZ GET_BEST_X
CLR A2
GET_BEST_X:
MMFM SP,A2,A3
RETS
**************************************************************************
* *
* CHECK_DIRECTION - CHECK TO SEE IF IT IS O.K. TO MOVE IN THIS DIRECTION *
* LOOKS FOR THINGS LIKE BONES, ILLEGAL MOVES AND BADIES. *
* A0 = CURRENT MOVE *
* A1 = DIRECTION *
* A8 = OBJECT TRYING TO MOVE THIS DIRECTION *
* RETURNS: *
* Z = NOT GOOD *
* NZ = O.K. IN THIS DIRECTION *
* *
**************************************************************************
CHECK_DIRECTION:
MMTM SP,A0,A1,A2,A3
MOVE *A0(MOVECPTR),A2,L ;IS THIS A CENTER POINT
JRN CHECK_AUX ;BR = NO
*CENTER POINT CHECK
MOVE A1,A2
CALLA ONE_MOVE ;GO ONE MOVE FOWARD
JRZ CHECK_DIR_EXIT_MOVE ;BR = NO MOVE THERE?
MOVE *A8(OID),A3,W ;GET THE I.D. OF THIS DOG
MOVE A3,A0
SRL 4,A0
SLL 4,A0
CMPI TROGOID,A0 ;IS THIS TROG?
JRNE CHECK_DIRECTION_ALL ;BR = NO, THEN ALWAYS CHECK THESE
MOVE A3,A0
SLL 30,A0
SRL 30,A0
CMPI TTYPE_CLUB,A0 ;IS THIS A CLUB TROG?
JREQ CHECK_DIR_SKIP_BONE ;BR = YES, BONES DON'T MATTER
CHECK_DIRECTION_ALL:
MOVB *A1(MOVEPLYR),A0
JRNN CHECK_DIR_FL
CHECK_DIR_SKIP_BONE:
MOVE A1,A0
MOVE A2,A1
CALLA ONE_MOVE ;GO ON TO THE NEXT
JRZ CHECK_DIR_EXIT_MOVE ;BR = NOTHING THERE
MOVE *A1(MOVECPTR),A0,L ;GET CENTER POINT
JRN CHECK_DIR_FL ;BR = NOT A CENTER?
CALLR CENTER_CHECK ;SOMETHING DANGEROUS?
JRNZ CHECK_DIR_FL
CHECK_DIR_OK:
CLR A1
INC A1
JRUC CHECK_DIR_X
*
*CHECK HERE TO SEE IF THIS IS A DINOSAUR LOOKING.
* IF IT IS THEN CHECK FOR HOUSE AT EXIT MOVE.
CHECK_DIR_EXIT_MOVE:
MOVE *A8(OID),A2,W
MOVE A2,A1
SRL 4,A2
SLL 4,A2
CMPI DINOOID,A2 ;ARE WE DEALING WITH A DINOSAUR
JRNE CHECK_DIR_FL ;BR = NO, JUST FAIL
MOVE *A0(MOVEEPTR),A2,L ;IS THIS AN EXIT MOVE?
JRN CHECK_DIR_AUX ;BR = NO
MOVE *A2(EMOVEOBJ),A3,L ;IS THERE AN OBJECT HERE
JRZ CHECK_DIR_AUX ;BR = NO
MOVB *A2(EMOVEPLYR),A3 ;DOES IT BELONG TO A PLAYER
JRN CHECK_DIR_AUX ;BR = NO
CMPI PXPLAYER,A3 ;COMMUNITY HOUSE?
JREQ CHECK_DIR_OK ;BR = YES
SLL 28,A1
SRL 28,A1
CMP A1,A3
JREQ CHECK_DIR_OK
CHECK_DIR_AUX:
MOVE *A0(MOVEAPTR),A2,L ;IS THIS AN AUXILLARY POINT?
JRN CHECK_DIR_FL ;BR = NO
MOVB *A2(CMOVEEGG),A3
SLL 28,A1
SRL 28,A1
CMP A1,A3
JREQ CHECK_DIR_OK
JRUC CHECK_DIR_FL
*AUXILLARY POINT CHECK
CHECK_AUX:
MOVE A1,A2
CALLA ONE_MOVE ;GO ONE MOVE FOWARD
JRZ CHECK_DIR_EXIT_MOVE ;BR = NO MOVE THERE, MUST BE AN EDGE
MOVE *A1(MOVECPTR),A0,L ;GET CENTER POINT
JRN CHECK_DIR_FL ;BR = NOT A CENTER, MUST BE A ROCK
CALLR CENTER_CHECK
JRNZ CHECK_DIR_FL
MOVE A1,A0
MOVE A2,A1
CALLA ONE_MOVE ;GO ON TO THE NEXT
JRZ CHECK_DIR_EXIT_MOVE ;BR = NOTHING THERE?
MOVB *A1(MOVEPLYR),A0
JRN CHECK_DIR_OK
CHECK_DIR_FL:
CLR A1
CHECK_DIR_X:
MMFM SP,A0,A1,A2,A3
RETS
**************************************************************************
* *
* CENTER_CHECK - CHECK A CENTER POINT FOR THINGS THAT CAUSE DEATH. *
* A0 = PTR TO CENTER POINT DATA *
* RETURNS: *
* Z = NOTHING WORTH CONCERING YOURSELF ABOUT *
* NZ = DANGER LURKS *
* C = NOTHING DANGEROUS, BUT THERE IS SOMETHING HERE. *
* NC = NOBODY, AT ALL, IN HERE *
* *
**************************************************************************
CENTER_CHECK:
PUSH A4
MOVB *A0(CMOVEEGG),A4 ;IS THERE SOMETHING HERE?
INC A4
JRNZ CENTER_CK_ITEM ;BR = YES
CLRC
JRUC CENTER_CK_X
CENTER_CK_ITEM:
DEC A4
CMPI FLOWERID,A4 ;IS IT A FLOWER?
JREQ CENTER_CK_X ;BR = OK TO WALK OVER IT
CMPI SHROOMID,A4 ;IS IT A MUSHROOM?
JREQ CENTER_CK_X ;BR = OK TO WALK OVER IT
CMPI TUNNELID,A4 ;IS IT A TUNNEL?
JREQ CENTER_CK_X ;BR = OK
CMPI TROGPITID,A4 ;IS IT A TROG PIT?
JREQ CENTER_CK_X ;BR = OK
CMPI PINEAPPLEID,A4 ;IS IT SOMETHING FRUITY?
JREQ CENTER_CK_X ;BR = YES, EAT IT
CMPI CATID,A4 ; IS IT A CATAPULT?
JREQ CENTER_CK_X ; BR = YES, GO FOR A RIDE
CMPI HAUSID,A4 ; IS IT A TRANSPORT HOUSE?
JREQ CENTER_CK_X ; BR = YES, GO FOR A RIDE
CMPI HSHOEID,A4 ;IS IT A HORSESHOE?
JREQ CENTER_CK_X ;BR = YES, GET LUCKY
CMPI ICEID,A4 ;IS IT AN ICE CUBE?
JREQ CENTER_CK_X ;BR = YES, FREEZE TROGS BALLS
CMPI CHILIID,A4 ;IS IT A RED HOT CHILI PEPPER?
JREQ CENTER_CK_X ;BR = YES, HANG FIRE
ANDI 0FFFFFFF0H,A4 ;IS IT SOMETHING TO WORRY ABOUT?
JREQ CENTER_CK_X ;BR = NO
*
* CHECK ALL ENEMIES AND GOODIES HERE, AND SEE IF IT IS O.K. TO WALK ON THEM
*
CLR A4 ;FLAG FAILURE
INC A4
SETC
CENTER_CK_X:
PULL A4
RETS
**************************************************************************
* *
* GET_DIRECTIONS_TO_MOVE - GET THE BEST DIRECTIONS TO TRAVEL TOWARDS *
* THE GIVEN MOVE POINT. *
* A0 = PTR TO MOVE THAT YOU WISH TO REACH *
* A8 = PTR TO THIS OBJECT *
* RETURNS: *
* A1 = FIRST CHOICE *
* A2 = SECOND CHOICE *
* *
**************************************************************************
GET_DIRECTIONS_TO_MOVE:
MMTM SP,A5,A6
CALLA GETCPNT
MOVE A1,A2 ;SEARCHING OBJECT CENTER IN A2
MOVE *A0(MOVEPOS),A1,L
SUBXY A1,A2 ;SIGNED [Y,X] DIFFERENCE IN A2
JRYGT GET_DIRTM_UP
JRXGT GET_DIRTM_DOWNLEFT
*TARGET POINT IS DOWN AND TO THE RIGHT
MOVI DOWN,A5
MOVI RIGHT,A6
JRUC GET_DIRTM_CMP
*TARGET POINT IS DOWN AND TO THE LEFT
GET_DIRTM_DOWNLEFT:
MOVI DOWN,A5
MOVI LEFT,A6
JRUC GET_DIRTM_CMP
GET_DIRTM_UP:
JRXGT GET_DIRTM_UPLEFT
*TARGET POINT IS UP AND TO THE RIGHT
MOVI UP,A5
MOVI RIGHT,A6
JRUC GET_DIRTM_CMP
*TARGET POINT IS UP AND TO THE LEFT
GET_DIRTM_UPLEFT:
MOVI UP,A5
MOVI LEFT,A6
*A5 = Y DIRECTION TO PROCEED
*A6 = X DIRECTION TO PROCEED
GET_DIRTM_CMP:
MOVY A2,A1
SRA 16,A1 ;SIGNED Y DIFFERENCE IN A1
SEXT A2 ;SIGNED X DIFFERENCE IN A2
ABS A1
ABS A2
CMP A1,A2 ;COMPARE DISTANCES
JRGT GET_DIRTM_XBEST ;LET'S GO FOR THE FARTHEST FIRST
CMPI 5,A2 ;IS THE X ON TARGET?
JRHI GET_DIRTM_YHI ;BR = NO
MOVE A5,A1 ;Y IS THE ONLY WAY TO GO
MOVE A5,A2
JRUC GET_DIRTM_X
GET_DIRTM_YHI:
MOVE A5,A1 ;Y IS THE BEST WAY TO GO
MOVE A6,A2
JRUC GET_DIRTM_X
GET_DIRTM_XBEST:
CMPI 5,A1 ;IS THE Y ON TARGET?
JRHI GET_DIRTM_XHI ;BR = NO
MOVE A6,A1 ;X IS THE ONLY WAY
MOVE A6,A2
JRUC GET_DIRTM_X
GET_DIRTM_XHI:
MOVE A6,A1 ;X IS THE BEST WAY
MOVE A5,A2
GET_DIRTM_X:
MMFM SP,A5,A6
RETS
**************************************************************************
* *
* GET_DIRECTIONS - GET THE DIRECTIONS THAT THIS OBJECT MUST TRAVEL *
* TO CATCH THE OTHER OBJECT. *
* A4 = PTR TO OBJECT TO CATCH *
* A8 = PTR TO THIS OBJECT *
* RETURNS: *
* A1 = FIRST CHOICE DIRECTION *
* A2 = SECOND CHOICE DIRECTION *
* *
**************************************************************************
GET_DIRECTIONS:
MMTM SP,A5,A6
CALLA GETCPNT
MOVE A1,A2 ;SEARCHING OBJECT CENTER IN A2
SWAP A4,A8
CALLA GETCPNT ;SEARCHEE OBJECT CENTER IN A1
SWAP A4,A8
*
*ENTRYPOINT FOR BEST DIRECTIONS
*A1 = [Y,X] TO REACH
*A2 = CURRENT [Y,X]
GET_DIR_GEN:
SUBXY A1,A2 ;SIGNED [Y,X] DIFFERENCE IN A2
JRYGT GET_DIR_UP
JRXGT GET_DIR_DOWNLEFT
*TARGET OBJECT IS DOWN AND TO THE RIGHT
MOVI DOWN,A5
MOVI RIGHT,A6
JRUC GET_DIR_CMP
*TARGET OBJECT IS DOWN AND TO THE LEFT
GET_DIR_DOWNLEFT:
MOVI DOWN,A5
MOVI LEFT,A6
JRUC GET_DIR_CMP
GET_DIR_UP:
JRXGT GET_DIR_UPLEFT
*TARGET OBJECT IS UP AND TO THE RIGHT
MOVI UP,A5
MOVI RIGHT,A6
JRUC GET_DIR_CMP
*TARGET OBJECT IS UP AND TO THE LEFT
GET_DIR_UPLEFT:
MOVI UP,A5
MOVI LEFT,A6
*A5 = Y DIRECTION TO PROCEED
*A6 = X DIRECTION TO PROCEED
GET_DIR_CMP:
MOVE *A4(OYVEL+16),A1,W ;ADD IN VELOCITIES FOR ACCURACY
SLL 16,A1
ADDXY A1,A2
MOVE *A4(OXVEL+16),A1,W
ZEXT A1
ADDXY A1,A2
MOVY A2,A1
SRA 16,A1 ;SIGNED Y DIFFERENCE IN A1
SEXT A2 ;SIGNED X DIFFERENCE IN A2
ABS A1
ABS A2
CMP A1,A2 ;COMPARE DISTANCES
JRGT GET_DIR_XBEST ;LET'S GO FOR THE FARTHEST FIRST
MOVE A5,A1 ;Y IS THE WAY WE SHOULD GO
MOVE A6,A2
JRUC GET_DIR_X
GET_DIR_XBEST:
MOVE A6,A1 ;X IS THE WAY
MOVE A5,A2
GET_DIR_X:
MMFM SP,A5,A6
RETS
**************************************************************************
* *
* SELECT_DINO - SELECT A DINO TO GO AFTER, BECAUSE WE CANNOT SEE ONE *
* FROM HERE. *
* RETURNS: *
* Z = COULD NOT FIND A DINO WORTH JAPPING. *
* A4 = UNDEFINED *
* NZ = FOUND ONE *
* A4 = DINOSAUR OBJECT PTR *
* *
**************************************************************************
SELECT_DINO:
MMTM SP,A0,A2,A3
MOVE @BONUS_WAVE,A4,W
JRZ SD_OK
CLR A4
JRUC SELECT_DINO_X
SD_OK
CALLR SELECT_PLAYER
JRZ SELECT_DINO_X
CALLA GPLAYNUM
MOVE @DINOS,A4,L
JRZ SELECT_DINO_X
SELECT_DINO_TST:
MOVE *A4(OID),A2,W
SLL 28,A2
SRL 28,A2
CMP A0,A2
JRNE SELECT_DINO_NEXT
MOVE *A4(OPLINK),A2,L
JRZ SELECT_DINO_NEXT
MOVB *A2(DINVIN),A3
JRNE SELECT_DINO_NEXT
MOVB *A2(DTREXFLG),A3
JRNE SELECT_DINO_NEXT
CALLR CK_CHASE
JRNE SELECT_DINO_NEXT
MOVE A4,A4
JRUC SELECT_DINO_X
SELECT_DINO_NEXT:
MOVE *A4(OSLINK),A4,L
JRNZ SELECT_DINO_TST
SELECT_DINO_X:
MMFM SP,A0,A2,A3
RETS
.BSS SELECTP_RAM,32*MAXPLAYERS,1
**************************************************************************
* *
* SELECT_PLAYER - SELECT A PLAYER TO BE WASTED. IF THE PLAYER IS ANY *
* KIND OF BOZO, HE WILL NOT BE SELECTED. *
* RETURNS: *
* Z = NO PLAYER WORTH WASTING *
* A2 = UNDEFINED *
* NZ = FOUND A PLAYER *
* A2 = PLAYER DATA AREA *
* *
**************************************************************************
SELECT_PLAYER:
MMTM SP,A0,A4,A5,A6
CLR A0
MOVI SELECTP_RAM,A4
MOVI P1DATA,A2
MOVE @NPLAYERS,A6,W
SELECT_P_LP:
MOVE *A2(POBJ),A5,L
JRZ SELECT_P_NXT
MOVE *A2(PBOZO),A5,W
CMPI 2,A5
JRHS SELECT_P_NXT
*** JRNE SELECT_P_NXT
MOVE A2,*A4+,L
INC A0
SELECT_P_NXT:
ADDI PDSIZE,A2
DEC A6
JRNN SELECT_P_LP
MOVE A0,A0 ;DID WE FIND ONE?
JRZ SELECT_P_X ;BR = NO, JUST EXIT
CALLA RANDU ;SELECT FROM THE CHOSEN
DEC A0
SLL 5,A0
ADDI SELECTP_RAM,A0
MOVE *A0,A2,L ;GET THAT PLAYER
SELECT_P_X:
MMFM SP,A0,A4,A5,A6
RETS
**************************************************************************
* *
* SCORE_TO_PLAYER - GIVE SOME SCORE TO THE PLAYER THAT KILLED TROG *
* A13 = PTR TO TROG'S PROCESS *
* *
**************************************************************************
SCORE_TO_PLAYER:
MMTM SP,A0,A1,A2,A4
CALLR TROG_VALIDATE_CHASEE
MOVE *A13(TDINO),A4,L ;WHAT DINO MADE ME DIE?
JRZ SCORE_TOP_NBT ;BR = NOBODY
**** MOVE *A4(OID),A0,W
**** MOVK 1,A1
**** CALLA BUILD_TENSION ;GET PISSED AT HIM
SCORE_TOP_NBT:
MOVB *A13(TPLAYER),A0 ;GET GUILTY PLAYER
JRN SCORE_TOP_NO ;BR = NONE TO BE HAD
MOVB *A13(TPURSUIT),A1 ;ARE WE PURSUING THIS GUY?
JRZ SCORE_TOP_X ;BR = NO
CALLA GPLAYD ;A2 GETS PLAYER DATA AREA
MOVE A4,A0
CALLR SCORE_TROG_KILL ;SCORE THE KILL
SCORE_TOP_NO:
CLR A1
MOVE A1,*A13(TDINO),L ;RESET CHASE/SCORE VARIABLES
NOT A1
MOVB A1,*A13(TPLAYER)
SCORE_TOP_X
MMFM SP,A0,A1,A2,A4
RETS
**************************************************************************
* *
* SCORE_TROG_KILL - SCORE POINTS FOR KILLING TROG *
* A2 = PTR TO PLAYER DATA AREA *
* A8 = PTR TO TROG OBJECT *
* NOTE: TRASHES A14 *
* *
**************************************************************************
SCORE_TROG_KILL:
MMTM SP,A1,A2,A3,A7,A8,A9,A10,A11
MOVE A2,A11
INCM *A2(PTROGKILLS),W
CALLA GETANIXY
SRL 16,A3
MOVY A2,A3
MOVE A3,A8
CLR A9 ;NO SOUND FOR NOW
MOVI 1000H,A10 ;1000 SCORE FOR NOW
CREATE INDPIDE,SCOREOBJ
JRNZ SCORE_TROG_K_OK
MOVE A11,A2 ;NO PROC, JUST SCORE
MOVE A10,A1
CALLA SCORE
SCORE_TROG_K_OK:
MMFM SP,A1,A2,A3,A7,A8,A9,A10,A11
RETS
**************************************************************************
* *
* TROG_FIND_TRAP - FIND THE CLOSEST POINT TO SET A TRAP FOR THE DINOS. *
* A13 = PTR TO TROG DATA STRUCTURE *
* RETURNS: *
* Z = NOTHING FOUND (A1 = UNDEFINED) *
* NZ = FOUND SOMETHING (A1 = PTR TO MOVE POINT TO SET THE TRAP) *
* *
**************************************************************************
TROG_FIND_TRAP:
MMTM SP,A2,A3,A4,A5,A6,A8
MOVE *A13(TCURMPOS),A5,L ;KEEP HIS CURRENT MOVE POSITION
MOVI 7FFFH,A6 ;BEST VECTOR SO FAR
CLR A1 ;BEST MOVE POINT SO FAR
MOVE @CMOVECNT,A4,W
JRZ TROG_FIND_TRAP_X
MOVI CMOVEMAP,A8 ;LET'S SCAN THE CENTER POINT MAP
TROG_FIND_TRAP_LP:
MOVB *A8(CMOVETROG),A3
INC A3 ;DOES HE WANT TO PUT ONE HERE?
JRZ TROG_FIND_TRAP_NXT ;BR = NO
DEC A3
MOVB *A8(CMOVEEGG),A2 ;SEE WHAT'S ACTUALLY THERE
INC A2
JRNZ TROG_FIND_TRAP_NXT ;BR = SOMETHING, THIS ONE'S NO GOOD
MOVE *A8(CMOVEPOS),A3,L
SUBXY A5,A3 ;GET VECTOR COMPONENTS
MOVY A3,A2 ;MAKE THEM ABSOLUTE
SRA 16,A2
ABS A2
SEXT A3
ABS A3
ADD A2,A3 ;VECTOR FOR THIS MOVE
CMP A6,A3 ;BETTER THAN THE BEST
JRHS TROG_FIND_TRAP_NXT ;BR = NO
MOVE A3,A6 ;KEEP THIS AS THE BEST
MOVE A8,A1
TROG_FIND_TRAP_NXT:
ADDI CMOVESIZE,A8
DSJ A4,TROG_FIND_TRAP_LP
MOVE A1,A1
JRZ TROG_FIND_TRAP_X
MOVE *A1(CMOVEMPTR),A1,L ;RETURN THE MOVE
TROG_FIND_TRAP_X:
MMFM SP,A2,A3,A4,A5,A6,A8
RETS
**************************************************************************
* *
* CK_CHASE - ROUTINE TO CHECK IF THERE IS A TROG SOMEWHERE AFTER THIS *
* DINO. *
* A4 = PTR TO DINO OBJECT *
* RETURNS: *
* Z = NOBODY IS AFTER THIS GUY *
* NZ = SOME TROG IS AFTER HIM *
* *
**************************************************************************
CK_CHASE
MMTM SP,A0,A8
MOVE @TROGS,A8,L
JRZ CK_CHASE_X
CK_CHASE_LP
MOVE *A8(OID),A0,W
SRL 4,A0
SLL 4,A0
CMPI TROGOID,A0
JRNE CK_CHASE_NXT
MOVE *A8(OPLINK),A0,L
JRZ CK_CHASE_NXT
MOVE *A0(TDINO),A0,L
CMP A0,A4
JREQ CK_CHASE_FND
CK_CHASE_NXT
MOVE *A8(OSLINK),A8,L
JRNZ CK_CHASE_LP
CK_CHASE_X
MMFM SP,A0,A8
RETS
CK_CHASE_FND
MOVE A4,A4 ;CLEAR THE ZERO
JRUC CK_CHASE_X
.DATA
**************************************************************************
* *
* ASSORTED SOUNDS FOR THIS MODULE *
* *
**************************************************************************
TROGAHA_SND:
.WORD >F010,>3C,>804A,0 ;A-HA
TROGBIRTH_SND:
.WORD >F005,>32,>804C,0 ;TROG GRUNTS HIS WAY OUT OF THE GROUND
TROGCOUGH_SND:
.WORD >F005,>23,>805C,>805C,0 ;TROG COUGHS BEFORE COMING OUT OF GROUND
TROGSPEED_SND:
.WORD >F010,>2D,>801C,>801D,0 ;TROG EATS A SPEED PLANT
TROGSHROOM_SND:
.WORD >F010,>46,>801B,0 ;TROG EATS A MUSHROOM
TROGOOF_SND
.WORD >F009,>20,>801D,0 ;TROG GETS PUNCHED
TROGUGH_SND:
.WORD >F010,>3C,>8040,0 ;TROG GETS KNOCKED OUT
**************************************************************************
* *
* TROG COLLISION LIST *
* *
**************************************************************************
TROGCOLL:
.WORD HBAROID,08FFFH ;IGNORE PLAYER #
.LONG TROGHHIT
.WORD VBAROID,08FFFH
.LONG TROGVHIT
.WORD DINOOID,0FFF0H
.LONG TROGDINO
.WORD TAROID,0FFF0H
.LONG TROGTAR
.WORD FIREOID,0FFF0H
.LONG TROGFIRE
.WORD PITOID,0FFFFH
.LONG TROGPIT
**** .WORD FLOWEROID,0FFFFH
**** .LONG TROGFLOWER
**** .WORD SHROOMOID,0FFFFH
**** .LONG TROGSHROOM
.WORD TUNNELOID,0FFFFH
.LONG TROGPIT
.WORD 0
.LONG DUMCRETS ;DO NOTHING
*
*WHIRLING DUST CLOUD INITIALIZATION TABLE
WHIRLINIT:
.LONG 0,0
.WORD 0,0
.LONG WHIRL1a,[40,0],DUMCOLL
.WORD DMAWNZ,JUNKOID
WHIRL_SCRIPT:
.LONG WHIRL3c
.WORD 6
.LONG WHIRL2c
.WORD 6
.LONG WHIRL1c
.WORD 6
.LONG WHIRL3b
.WORD 4
.LONG WHIRL2b
.WORD 4
.LONG WHIRL1b
.WORD 4
.LONG WHIRL3a
.WORD 4
.LONG WHIRL2a
.WORD 4
.LONG WHIRL1a
.WORD 4
.LONG 0
.LONG WHIRL3a
.WORD 3
.LONG WHIRL2a
.WORD 3
.LONG WHIRL1a
.WORD 3
.LONG WHIRL3a
.WORD 3
.LONG WHIRL2a
.WORD 3
.LONG WHIRL1a
.WORD 3
.LONG WHIRL3b
.WORD 3
.LONG WHIRL2b
.WORD 3
.LONG WHIRL1b
.WORD 3
.LONG WHIRL3c
.WORD 3
.LONG WHIRL2c
.WORD 3
.LONG WHIRL1c
.WORD 3
.LONG 0