trog/TROGDINO.ASM

4743 lines
130 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 'TROGDINO.ASM'
.TITLE " <<< T R O G -- DINOSAUR ROUTINES >>>"
.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" ;GET THE AUDIT STUFF
.INCLUDE "TROGAEQU.ASM" ;GET THE ANIMATION EQUATES
.INCLUDE "TROGSEQU.ASM" ;GET OTHER EQUATES
.DEF DINO_START, DINOCOLL, DINO_TROG_OOF
.DEF FIND_OPEN_CPNT, VALIDHITX, VALIDHITY, WIN_SND
.DEF DINO_PNT_TST, DINOINIT_PNT_FIND, DINOLOAD, DINOTURN, NOTDIR
.DEF ANIMATE_DIR, DINOLOOK_TURN, BUMP, DINOLOOK
.DEF FIND_SAFEST, ANIMATE_TURN, DINOPUNCH, CK_PIT_CENT, DINO_VEL
.DEF DINO_FRANIM, BONE_BETWEEN, BUMPCK, DINO_TROG_CLUB
.DEF DINO_CENTER, DINOREV, LOAD_DIR, SEARCH_SAFE
.DEF DINO_ADD_VEL, CELEBRATE_MESS
.DEF FRANIMATE_DIR, GET_DINO_MPNT, NUM_WIN_MESSAGES
.DEF GET_DINO_CPNT, DINOMADXFER, DINO_SQUASH, DINO_SPROING
.DEF ALIGNTAB, START_INVINCIBILITY, DINOWXFER, WIN_MESSAGES
.DEF KILL_INVINCIBILITY, PLANT_STALL, CELEBRATEAMATE, COMPSNDTAB
.DEF IS_DINO_DEAD_A0, IS_DINO_DEAD_A8, MARK_DINO_DEAD
.REF REXINIT, ELVISINIT, BLOOPINIT, SPIKEINIT
.REF GETMOVE, GETCMOVE, SUBLIFE, PLAYER_DELETE, GAME_OVER, TOMOVE
.REF WAVEEGGS, SEND2SCR, GPLAYD, WAVE_END, FINDCMOVE
.REF BOUNDRY_CHECK, PNAME_TAB, COLOR_START, WIPE_FROM_MID, GPLAYNUM
.REF FINDMOVE, TWO_MOVES, DSRCH_CLR, GET_EXIT_ANI, FINDAMOVE
.REF STOP_WAITING, STOP_GREETING, STOP_SEARCH, START_BONE
.REF FIRE_UP_MONKEY_SHIT, PIT_CLOSE, TAROUT
.REF GAME_OVER_FLY, GETAMOVE, DINOSPEED, FIND_CLOSE_CPNT
.REF FIND_CLOSE_MPNT, ONE_MOVE, OUTLIVES, CLR_PDINOCNT
.REF FREE_MOVE_EGG, BUYINWIN, BUYNOW, CLIP_INTO, BONE_OBJ
.REF BONED_IN, CENTER_CHECK, GET_BEST_DIRECTION, HOUSE_PIT
.REF HOUSE_PITS, WAVE_PLAYERS, BORDER_MARQUEE
.REF TUNNEL, TUNNEL_UP, TARBUBBLE_SND, TIME_WARP
.REF WAIT_WAVE_END, SPARKLE, EGG_OBJ, ATSTRT, WIPEOUT
.REF CLR_DRONE, SPSTP0, APLAYDONE, BGND_TYPE, ISHOME
.REF DINOXFORM, TREX_KILL, TROG_BUMP, BSPIKEFALL
.REF BONE_OBLITERATE, SPIKEUP, REXGROWL_SND, GROWL_TAB
.REF DINO_FIND_CLOSEST, DINO_FIND_FURTHEST, FIND_CLOSE_EPNT
.REF TREX_STOMP, WHLFIRE_EXT, DTREX_LEAP, BTYPE_CK
.REF DANCE_STUFF, BUYWIN_Z, PARTY_STUFF, FIREWERK, DINO_RING
.REF DINOFLY_ANIM, DINOCHEER_ANIM, SEE_STARS, FREEZE_EM
.REF DINOS_NEAR_PNT, DINO_LOOK_HOME, SPIT_FIRE, ENEMIES_NEAR_PNT
.REF BONUS_WAVE, SKYDOWN, PUNCHED, START_SCORE, PUNCH_SND
.REF TROGHEAD_SND, TROGCLUB_SND, BINBCD, POWERUP_DURATION
.REF ANIMATE_BUTTON, SLEEP_START, ALLOW_CONTINUE, BONED_IN_GREY
.IF PRINTER
.REF PGAMEWAVE
.ENDIF
*
*TENSION CONSTANTS
TENSION_PUNCH .EQU 10 ;AMOUNT OF TENSION FOR ONE PUNCH
TENSION_BUMP .EQU 7 ;AMOUNT OF TENSION FOR ONE BUMP
TENSION_REV .EQU 5 ;AMOUNT OF TENSION FOR ONE REVERSE
TENSION_WAIT .EQU 5 ;AMOUNT OF TENSION FOR ONE WAITING
PUNCH_LEVEL .EQU 1*TENSION_BUMP ;TENSION LEVEL AT WHICH THE DINO WILL PUNCH
*
*FRUSTRATION CONSTANTS
***FRUST_WALK .EQU 1 ;AMOUNT TO RELEASE WHILE WALKING
FRUST_TURN .EQU 3 ;AMOUNT TO ADD PER TURN
FRUST_WONDER .EQU 9 ;DINO HAS A QUESTION IN HIS MIND
FRUST_MAD1 .EQU 14 ;DINO IS PISSED
FRUST_MAD2 .EQU 23 ;DINO IS MORE PISSED
FRUST_MAD3 .EQU 29 ;DINO IS REALLY PISSED
DWAIT_TIME .EQU 120 ;NUMBER OF TICKS A DINO WILL STAY STOPPED
HITS_TO_KO .EQU 5 ;NUMBER OF HITS REQUIRED TO KNOCKOUT DINO
.TEXT
**************************************************************************
* *
* DINO_START - START THE PLAYERS DINOSAUR(S) FOR THIS WAVE *
* A2 = PTR TO PLAYER DATA *
* *
**************************************************************************
DINO_START
MMTM SP,A0,A1,A3,A4,A7,A8,A9,A10,A11
MOVE *A2(PDINO),A3,L ;GET TABLE FOR THIS DINO
MOVE *A3+,A8,L ;GET ANIMATIONS
MOVE *A3+,A9,L ;GET INITIALIZATION TABLE
CMPI P2DATA,A2 ;IS THIS BLOOP?
JRNE DS_NORM ;BR = NO
MOVE @NPLAYERS,A7,W
CMPI 1,A7 ;ARE WE A TWO PLAYER ONLY?
JRNE DS_NORM ;BR = NO
MOVE @P4DATA+PDINO,A3,L ;USE GWENS SPOT IN THIS CASE
ADDI 64,A3 ;SKIP USELESS GARBAGE
DS_NORM
MOVE *A3+,A10,L
MOVE *A3+,A11,L
CREATE DINOPID,DINOWALK
JRZ DINO_SX ;NO MORE PROCESS SPACE
MOVE A2,*A0(DPLAYER),L ;PASS THE POINTER TO THE PLAYER
DINO_SX
MMFM SP,A0,A1,A3,A4,A7,A8,A9,A10,A11
RETS
**************************************************************************
* *
* DINOWALK - WALK THE DINOSAUR PROCESS *
* A8 = ANIMATION FOR THIS DINOSAUR *
* A9 = DINOSAUR INITIALIZATION TABLE *
* A10 = [Y,X] STARTING COORDINATE OF DINOSAUR *
* A11 = DIRECTION TO START WALKING (0 = UP, 1 = DN, 2 = LF, 3 = RT) *
* *A13(DPLAYER),L = PTR TO PLAYER CONTROLLING THIS DINOSAUR *
* *
**************************************************************************
DINOWALK
MOVE *A13(DPLAYER),A2,L ;GRAB THIS BEFORE WIPING AREA
CALLA CLRPDATA ;CLEAR OUR DATA AREA
MOVB *A2(PDRONEFLG),*A13(DDRONE) ;SET DRONE FLAG IF APPLICABLE
MOVE A2,*A13(DPLAYER),L ;RESTORE PLAYER POINTER
MOVE A8,*A13(DATABLE),L ;STORE ANIMATION TABLE
MOVE A9,*A13(DINITTAB),L ;STORE INITIALIZATION TABLE
MOVI SPIKEUP,A1
MOVE A1,*A13(DWALKFRM),L ;INITIALIZE THE WALKING FRAME
MOVE @DINOSPEED,A1,W ;GET THIS WAVES INITIAL VELOCITY
MOVE A1,*A13(DSPEED),W ;KEEP THE INITIAL SPEED
MOVK 1,A0
MOVB A0,*A13(DDIZZYFLG) ;MAKE HIM SAFE FROM DANGER RIGHT NOW
MOVE *A2(PDTHPOS),A0,L ;GET THE LAST DINOSAUR DEATH POSITION
JRZ DINO_WAVE_1ST ;BR = HASN'T STARTED YET
MOVE A0,*A13(DINITPOS),L
JRUC DINOWALK_1ST
DINO_WAVE_1ST
MOVE A10,*A13(DINITPOS),L ;STORE THE POSITION
MOVE A11,*A13(DINITDIR),W ;STORE INITIAL DIRECTION
MOVK 1,A0
MOVE A0,*A13(PTEMP1),W ;USE THIS AS A FLAG FOR FIRST START
JRUC DINOWALK_1ST ;ENTER HERE FOR FIRST TIME
*TRANSFER HERE AFTER DINOSAUR DEATH
*ABOVE VARIABLES MUST BE CORRECT
*ONLY RETURN HERE AFTER THE OLD DINO HAS BEEN DELETED
* *A13(DINITPOS),L = RE-START POSITION [Y,X] CENTER POINT OF INITIAL FRAME
* *A13(DINITDIR),W = RE-START DIRECTION
*REMBER TO RE-INITIALIZE THE Z POSITION AFTER A DEATH.
DINODEATH_XFER
CLR A0
MOVB A0,*A13(DPUNCHFLG) ;CLEAR FLAGS
MOVB A0,*A13(DVNFLAG) ;RETURN TO NORMAL SPEED
MOVB A0,*A13(DINVIN) ;TURN OFF HIS INVINCIBILITY
MOVB A0,*A13(DFIREFLG) ;HE CAN NO LONGER FIRE BULLETS
MOVE A0,*A13(PTEMP1),W ;FLAG SAFE SEARCH
MOVE A0,*A13(DSPEED2),W ;TURN OFF SPEED INCREASE
MOVB A0,*A13(THITS) ;CLEAR HIS HIT COUNT
MOVB A0,*A13(DWAIT) ;WAIT TIMER
**** MOVK 1,A0
MOVK 2,A0
MOVB A0,*A13(DDIZZYFLG) ;MAKE HIM SAFE FROM DANGER RIGHT NOW
*ENTER HERE THE FIRST TIME A DINO IS STARTED DURING A WAVE
DINOWALK_1ST
MOVI ISAVES,A0
MOVE A0,*A13(DSAVES),W ;SAVE COUNT
MOVE *A13(DPLAYER),A2,L
MOVB *A13(DDRONE),A0 ;IS THIS A DRONE DINO?
JRZ DINOWALK_PLAYER ;BR = NO
MOVB *A13(DDRONEDEL),A0 ;IS IT TIME TO DELETE THIS DRONE?
JRNZ DINOWX ;BR = YES
JRUC DINOWALK_ALWAYS
DINOWALK_PLAYER
MOVE *A2(PDINOCNT),A0,W
MOVE *A2(PLIVES),A1,W
CMP A0,A1
JRLE DINOWX ;DON'T START ME FOR I AM TOO MANY
DINOWALK_ALWAYS
MOVE *A2(POBJ),A8,L ;RESTORE THE DINO OBJECT
JRZ DINOWX ;THERE ISN'T ONE?
MOVE A13,*A8(OPLINK),L ;LINK THE PROC TO THE OBJ
INCM *A2(PDINOCNT),W ;TALLY UP ANOTHER DINOSAUR
MOVE *A13(DSPEED),A1,W ;GET THE CORRECT VELOCITY
ZEXT A1
SLL 4,A1
CALLR DINO_VEL ;SETUP THE INITIAL VELOCITY
MOVE *A13(DATABLE),A10,L ;RELOAD THE ANIMATION TABLE
MOVE *A13(DINITPOS),A3,L ;APPEAR HERE
**** CALLR DINO_PNT_TST ;IS THIS SPOT COOL?
**** JRZ DINOINIT_OKP ;BR = YEAH, NO PROBLEM
**** SLEEP 5 ;DINO WILL SEARCH HERE FOR A SPOT
**** 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
**** CALLR DINOINIT_PNT_FIND ;FIND A FREE POINT
**** CALLA DSRCH_CLR ;CLEAR THE SEARCH MARKS
**** MOVE *A13(DPLAYER),A2,L
DINOINIT_OKP
MOVE *A2(PCONSECUTIVE),A5,W ;WE'LL NEED THIS A FEW TIMES
MOVE A3,A1
MOVE A3,*A13(DINITPOS),L ;STORE AWAY FOR SAFE KEEPING
CALLR DINO_NEW_PNT ;CENTER THE DINOSAUR ON THIS NEW PNT.
CALLA FIND_CLOSE_MPNT ;GET ADDRESS IN CASE IT'S NEW
MOVE A0,A1
MOVE A1,*A13(PTEMP3),L
**** MOVE @STOP_WAITING,A0,W
**** CMP A0,A5 ;NO MORE WAITING?
**** JRHS DINOINIT_NOSRCH ;BR = NO
**** CALLR FIND_SAFEST ;SEE IF THE SAFEST DIRECTION IS DEATH
**** MOVE A4,A4 ;ARE WE FACING DEATH?
**** JREQ DINOINIT_NOSRCH ;BR = NO
**** CMPI 1,A3 ;ARE WE REAL CLOSE TO IT?
**** JRHI DINOINIT_NOSRCH ;BR = NO
**** MOVK 2,A0
**** MOVE A0,*A13(PTEMP2),W ;FLAG SCRATCH ANIMATION
**** MOVK DOWN,A0
**** MOVE A0,*A13(DDIR),W ;FACE DOWN
**** MOVI WONDER,A0 ;LET'S SCRATCH OUR HEADS
**** JRUC DINOINIT_LOAD
****DINOINIT_NOSRCH
CLR A0
MOVE A0,*A13(PTEMP2),W ;CLR FLAG FOR ANIMATION
**** MOVE *A13(DDRONE),A0,W ;IS THIS A DRONE?
**** JRNE DINOINIT_DRONE ;BR = YES, THEN WE WILL NOT WAVE
**** MOVE @BONUS_WAVE,A0,W ;IS THIS A BONUS WAVE?
**** JRNZ DINOINIT_DRONE ;BR = YES, NO WAVING
**** MOVE @STOP_GREETING,A0
**** CMP A0,A5 ;SHOULD WE WAVE AT THE PLAYER?
**** JRLO DINOINIT_WAVE ;BR = YES
****
****DINOINIT_DRONE
MOVE *A13(DINITDIR),A11,W ;GET INIT DIRECTION
MOVE A11,*A13(DDIR),W ;STORE IT FOR USE
MOVI STANDU,A0 ;LET'S LOAD THE STANDING FRAME
ADD A11,A0 ;OFFSET FOR THE CORRECT DIRECTION
**** JRUC DINOINIT_LOAD
****DINOINIT_WAVE
**** MOVK 1,A0
**** MOVE A0,*A13(PTEMP2),W
**** MOVK DOWN,A0
**** MOVE A0,*A13(DDIR),W ;FACE DOWN FOR HAND WAVE
**** MOVI INTRODUCE,A0 ;WAVE AT THE PLAYER
****
****DINOINIT_LOAD
CALLR DINOLOAD
MOVK 4,A1
JSRP FRANIM ;LOAD THE NEW FRAME
MOVE A0,A6 ;STORE SLEEP TIME HERE
MOVI DINOS,A1
CALLA INSERT_SUPP ;INSERT THIS 'TING
CALLA OBJ_ON ;AND TURN IT ON
CALLR MARK_DINO_LIVE ;MAKE SURE HE LOOKS ALIVE
MOVE *A13(DPLAYER),A2,L
CALLA OUTLIVES ;UPDATE THE PLAYER LIFE DISPLAY
MOVE @GAME_STATE,A0,W
CMPI INPLAY,A0 ;ARE WE IN PLAY MODE
JREQ DINOPLAY ;YES, JUST CONTINUE NORMALLY
CMPI INAMODE,A0 ; ALLOW AMODE WALKING
JREQ DINOPLAY
MOVE *A2(PEGGS),A0
MOVE @WAVEEGGS,A1,W ;CHECK THE EGG COUNT
CMP A1,A0 ;ENOUGH EGGS TO FINISH?
JRHS DINOMADXFER ;BR = YES
JRUC DINOQUESXFER ;OTHERWISE JUST WONDER WHY.
*POSITION DINO TO PLAY
DINOPLAY
MOVE A10,A0
MOVI 500,A10
CALLR START_INVINCIBILITY ;THROW A RING OUT THERE.
MOVE A0,A10
MOVE *A13(PTEMP2),A0,W ;INITIAL ANIMATION?
JRZ DINO_SKIPANIM ;BR = NO
**** CMPI 2,A0 ;WAITING BEFORE DEATH?
**** JREQ DINO_SCRATCH ;YES'M
SLEEPR A6 ;SLEEP THE CORRECT TIME
MOVK 1,A1
JSRP FRANIM
DINO_SKIPANIM
MOVE *A13(PTEMP1),A0,W ;FIRST START THIS WAVE?
JRNZ DINO_START_MOVING ;BR = YES
MOVE *A13(DPLAYER),A2,L
MOVE *A2(PINSTRUCT),A0,W ;IS HE IN INSTRUCTION MODE?
JRNZ DINO_START_MOVING ;BR = YES, THEN DON'T SEARCH NEW
CALLA DINO_FIND_CLOSEST ;GET THE CLOSEST EGG OR HOUSE
JRZ DINO_START_SAFE ;BR = NONE EXIST
MOVE A1,A4
MOVE *A13(PTEMP3),A0,L
CALLA GET_BEST_DIRECTION ;FIND THE WAY TO THE EGG OR HOUSE
JRZ DINO_START_SAFE ;BR = CAN'T GO THAT WAY
MOVE A1,A11
JRUC DINO_START_MOVING
DINO_START_SAFE
MOVE *A13(PTEMP3),A1,L
CALLR DINO_FIND_BEST ;FIND US THE BEST MOVE FROM HERE
MOVE A2,*A13(DINITDIR),W ;NEW INITIAL DIRECTION
MOVE A2,A11
*TURN DINO TO INITIAL DIRECTION AND START MOVING
DINO_START_MOVING
SLEEP 5
CALLR DINO_HALTED ;IS THIS GUY HALTED
JRNZ DINO_START_MOVING ;BR = NO, WAIT FOR FLAG TO RELEASE
JSRP DINOTURN
SLEEP 35 ;SLEEP LONGER FOR LEARNERS
JRUC DINO_END_INIT
*
*END OF DINOSAUR INITIALIZATION
DINO_END_INIT
CALLA DINO_FIND_FURTHEST ;GET THE FURTHEST EGG
MOVE A1,*A13(DFURTHEST),L ;STORE FOR LATER USE
MOVE @TUNNEL,A0,W
JRZ DINO_END_NO_TUNNEL
MOVE @TUNNEL_UP,A0,W
JRNZ DINO_END_NO_TUNNEL
MOVE *A13(DPLAYER),A2,L
MOVE *A2(PEGGS),A0,W
JRNZ DINO_END_NO_TUNNEL
MOVE *A2(PWAVEDEATHS),A0,W
JRNZ DINO_END_NO_TUNNEL
MOVE A1,A9
MOVE A2,A11
CREATE INDPID,SPARKLE
DINO_END_NO_TUNNEL
SLEEP 20
CALLR KILL_INVINCIBILITY
MOVE @BONUS_WAVE,A0,W
CMPI BONUSW_1,A0 ;IS THIS THE TREX WAVE?
JRNE DWX_1 ;BR = NO
MOVE *A13(DPLAYER),A2,L
MOVE *A2(PPID),A1,W
ORI PTREXPID,A1 ;FORM PROCID UNIQUE TO THIS PLAYER
MOVI DINOXFORM,A7
CALLA GETPRC ;AND CREATE THE TREX PROCESS
JRUC DINOWXFER
DWX_1
CMPI BONUSW_2,A0
JRNE DWX_2
JRUC DINOWXFER
DWX_2
CMPI BONUSW_3,A0 ;IS THIS THE BARBEQUE?
JRNE DWX_3 ;BR = NO
MOVE *A13(DPLAYER),A2,L
MOVE *A2(PPID),A1,W
MOVE A13,A10
ORI PFIREPID,A1
MOVI SPIT_FIRE,A7
CALLA GETPRC ;CREATE THE FIRE SPIT PROCESS
MOVI 1500,A10
CALLR START_INVINCIBILITY
JRUC DINOWXFER
DWX_3
*DO THIS FOR NON-BONUS WAVE SHIT
MOVI 200,A10
CALLR START_INVINCIBILITY
*
*PROCESS TRANSFER POINT FOR DINOSAUR WALKING PROCESS
* A8 = PTR TO DINOSAUR OBJECT
* *A13(DATABLE),L = PTR TO DINOSAUR ANIMATION TABLE
* *A13(DDIR),W = CURRENT DINOSAUR DIRECTION
* *A13(DPLAYER),L = DATA AREA OF PLAYER CONTROLLING THIS GUY
*NOTE: PROCESS STACK IS RESET IMMEADIATELY, NO STACK PASSING HERE PLEASE
DINOWXFER
MOVE A13,A12
ADDI PRCSIZ,A12 ;RESET PROCESS STACK POINTER
ANDNIM M_NOCOLL,*A8(OFLAGS),W ;MAKE SURE COLLISIONS ARE ON
CLR A0
MOVB A0,*A13(DPUNCHFLG) ;CLEAR FLAGS
MOVB A0,*A13(DDIZZYFLG)
MOVE *A13(DDIR),A11,W ;GET THE NEW DIRECTION
CALLR DINO_STICK
JRC DWX_DOIT
JRZ DWX_DOIT
MOVE A6,A11
MOVE A11,*A13(DDIR),W
DWX_DOIT
MOVE *A13(DATABLE),A10,L ;RESTORE THE ANIMATION TABLE
CALLR DINO_WALK_LOAD
MOVB *A13(DTREXFLG),A0 ;IS THIS GUY A TYRANNO
JREQ DINOWX_SIF ;BR = NO
MOVI 500,A0
CALLA RANDPER ;SHOULD WE GROWL?
JRNC DINOWX_SIF ;BR = NO
MOVE A11,A0
SLL 5,A0
ADDI GROWL_TAB,A0
MOVE *A0,A9,L ;STICK IN OUR OLD FRIEND
MOVE A9,*A13(DWALKFRM),L ;STORE THIS AS THE CURRENT WALK FRAME
DINOWX_SIF
CALLR DINO_NEW_MOVE ;SET THE DINO ON THE NEW MOVE
JRC DINOWXFER_END ;BR = IT WAS AND AUXILLARY MOVE
CALLA BONED_IN ;LOOK FOR ADJACENT BONES
SRL 16,A4 ;CHECK TO SEE IF THERE IS A BONE AHEAD
BTST A11,A4
JREQ DINOWXFER_END ;BR = NOPE
MOVE A11,A1 ;LET'S FIND THE BONE
CALLA ONE_MOVE ;GOT TO BE THIS WAY
JRZ DINOWXFER_END
MOVE A1,A0
CALLA BONE_OBJ ;GET THE BONE OBJECT
JRZ DINOWXFER_END ;NONE FOUND
MOVE A1,A9
JRUC DINODEFL ;ACT LIKE YOU RAN INTO IT
DINOWXFER_END
SLEEP 3 ;COLLISION PAUSE
*
*A9 = PTR TO CORRECT WALKING ANIMATION
*
DINOWLP
MOVE *A13(DDIR),A11,W
MOVE A9,*A13(DWALKFRM),L ;STORE THIS AS THE CURRENT WALK FRAME
CALLR DINO_HALTED
JRZ DINOWLP_MOVE
*HALTED FOR SOFTWARE REASONS
CALLA PSTOP ;STOP HIM NOW!
MOVK 1,A0
MOVB A0,*A13(DDIZZYFLG) ;DON'T LET PEOPLE FUCK WITH HIM
DINOWLP_WAIT
SLEEP 5
ANDNIM M_NOCOLL,*A8(OFLAGS),W
CALLR DINO_HALTED
JRNZ DINOWLP_WAIT
CLR A0
MOVB A0,*A13(DDIZZYFLG)
JRUC DINO_SAVE_WALK
DINOWLP_MOVE
CALLA STOPPED ;IS THE DINO CURRENTLY STOPPED
JRNZ DINOWLP_WALK ;BR = NO, HE'S WALKING
MOVB *A13(DWAIT),A1
INC A1
CMPI DWAIT_TIME,A1 ;HAS HE BEEN STOPPED TOO LONG?
JRLS DINOWLP_STOPPED ;BR = NO, WAIT SOME MORE
MOVE *A13(TCURMPOS),A3,L
CALLA FINDAMOVE ;ARE WE ON AN AUXILLARY MOVE?
JRNC DINOWLP_NOREV ;BR = NO, THEN DO NOTHING (HU HU HU)
CALLR NOTDIR
JSRP DINOTURN ;REVERSE DINO, NO FREEBIES
CALLR DINO_WALK_LOAD
JRUC DINOWLP_WALK ;START TO WALKIN'
DINOWLP_NOREV
CLR A1 ;RESET WAIT TIMER
DINOWLP_STOPPED
MOVB A1,*A13(DWAIT)
SLEEP 1
JRUC DINOWLP_CHECK
DINOWLP_WALK
CLR A1
MOVB A1,*A13(DWAIT) ;RESET THE WAIT TIMER
MOVK 4,A1
JSRP DINO_FRANIM ;NEXT FRAME PLEASE
MOVE A9,*A13(DWALKFRM),L ;STORE THIS AS THE CURRENT WALK FRAME
MOVE A0,*A13(PTEMP1),W
DINOWLP_SLEEP
SLEEP 1
MOVE *A13(PTEMP1),A0,W
DEC A0
JRZ DINOWLP_CHECK
MOVE A0,*A13(PTEMP1),W
CALLR DINO_STICK
JRC DINOWLP_SLEEP
JRZ DINOWLP_SLEEP
JRUC DINO_NEW_DIRECTION
DINOWLP_CHECK
ANDNIM M_NOCOLL,*A8(OFLAGS),W ;MAKE SURE COLLISIONS ARE ON
MOVE A11,A1 ;AND PUT IT IN THE CORRECT PLACE
CALLR DINO_VEL_NORMAL ;RETURN DINO VELOCITY TO NORMAL
CALLA BOUNDRY_CHECK ;IS THE DINO STILL ON THE ISLAND
JRNE DINO_OUT_OF_BOUNDS ;BR = DINO IS DEAD
CALLR DINO_STICK
JRNC DINO_NEW_STICK
JRNZ DINO_NEXT_MOVE
JRUC DINOWLP
DINO_NEW_STICK
JRZ DINOW_SAME_DIR
*A0 = PTR TO CURRENT MOVE HERE
DINO_NEW_DIRECTION
MOVE A6,A11
JSRP DINOTURN
CALLR DINO_WALK_LOAD
JRUC DINOWLP ;START IN THE NEW DIRECTION
DINOW_SAME_DIR
MOVE *A13(TCURMPOS),A2,L ;GET THE CURRENT CENTER POINT
CMP A2,A3 ;SAME MOVE AS LAST TIME?
JREQ DINOWLP ;BR = YES, THEN KEEP ON TRUCKIN'
DINO_NEXT_MOVE
MOVI [4,4],A2 ;DINO MUST BE WITHIN THIS RANGE
CALLA PNT_IN_RANGE ;IS HE?
JRNC DINOWLP ;BR = NO
MOVE A3,*A13(TCURMPOS),L ;STORE THIS NEW [Y,X] OF THE MOVE PNT
MOVE *A0(MOVECPTR),A5,L
JRN DINO_CHECK_APNT
CLRB *A13(THITS) ;SO CLEAR HIS HIT COUNT
CALLA EGG_OBJ
MOVE A6,A6
JRN DINO_SAFETY
CMP A6,A11
JREQ DINO_SAFETY
CALLR DINO_CENTER
JRUC DINO_NEW_DIRECTION
DINO_CHECK_APNT
MOVE *A0(MOVEAPTR),A5,L
JRN DINO_SAFETY
CALLA EGG_OBJ ;CHECK FOR AN EGG
DINO_SAFETY
MOVE *A13(DPLAYER),A2,L ;GET CONTROLLING PLAYER
JRZ DINO_SAFETY_LOCAL ;BR = NONE
MOVE A0,A6
MOVI HOUSELST,A1
MOVI HOUSEOID|PXPLAYER,A0
CALLA ISSUPPID ;LOOK FOR GLOBAL HOUSE FIRST
MOVE A6,A0
MOVE A1,A1 ;DOES ONE EXIST?
JRNZ DS_LH ;BR = YES, DO THE STRAIGHT AWAY CK
MOVE *A2(PEXITPNT),A6,L ;GET THIS PLAYERS EXIT POINT
JRZ DINO_SAFETY_LOCAL ;BR = HE DOESN'T HAVE ONE (BOO HOO)
MOVE *A6(EMOVEOBJ),A6,L ;IS HIS HOUSE THERE YET?
JRZ DINO_SAFETY_LOCAL ;BR = NO
DS_LH
MOVE A11,A1
CALLA DINO_LOOK_HOME ;IS HOME STRAIGHT AHEAD?
JRZ DINO_SAFETY_LOCAL ;BR = NO
JRUC DINOWLP ;FUCK SAFETY, I'M GOING HOME
DINO_SAFETY_LOCAL
*
*DO SAFETY CHECK HERE FOR THE BOZO OR THE SMARTER DINO
*
MOVE *A0(MOVEEPTR),A4,L ;IS THIS A DEATH SPOT?
JRN DINO_NOT_NEAR_EXIT ;BR = NO
MOVB *A4(EMOVEDIR),A5 ;GET THE DIRECTION OF THE EXIT
CMP A11,A5 ;IS HE WALKING THAT WAY?
JRNE DINO_NOT_NEAR_EXIT ;BR = NO
*
*A0 = CURRENT MOVE PTR.
DINO_NEAR_EXIT
MOVB *A13(DSMART),A6
JRNZ DINO_SAVE_FROM_DEATH
MOVE *A13(DPLAYER),A2,L
JRZ DINO_SAVE_FROM_DEATH
MOVB *A13(DINVIN),A6
JRZ DINOWLP
**** JRNZ DINO_SAVE_FROM_DEATH
**** MOVE *A2(PBOZO),A6,W
**** CMPI 3,A6 ;BOZO ENOUGH TO SAVE
**** JRLO DINOWLP ;BR = NO
**** DECM *A13(DSAVES),W ;MORE SAVES ALLOWED?
**** JRLT DINOWLP ;BR = NO
DINO_SAVE_FROM_DEATH
**** MOVI STANDU,A0
**** JSRP ANIMATE_DIR ;STAND
**** JRUC DINOWLP ;AND WAIT THERE
MOVE *A13(DATABLE),A10,L ;FIRST WE NEED THE ANIMATION TABLE
MOVE *A13(DDIR),A0,W ;AND THEN WE NEED THE DIRECTION
ADDK STANDU,A0
CALLR DINOLOAD
MOVK 4,A1
JSRP FRANIM
JRUC DINOWLP
**** SLEEP 10 ;PAUSE
**** CALLR NOTDIR
**** JSRP DINOTURN ;ABOUTFACE
*WATCH OUT! MANY DIVERSE DUDES MAY JUMP TO THIS SPOT.
*A8 = OBJECT
*A10 = DATABLE
*A11 = DDIR
DINO_SAVE_WALK
CALLR DINO_WALK_LOAD
JRUC DINOWLP ;START TO WALKIN'
DINO_NOT_NEAR_EXIT
MOVE A11,A1
CALLA ONE_MOVE ;GET ADJACENT MOVE
JRZ DINO_NEAR_EXIT ;BR = MUST BE NEAR AN EDGE?
MOVE *A0(MOVECPTR),A5,L ;IS CURRENT MOVE A CENTER POINT?
JRNN DINO_CK_LOOK ;BR = YES, JUST TRY TO LOOK
MOVE *A1(MOVECPTR),A4,L ;IS ADJACENT MOVE A CENTER?
JRN DINO_CK_LOOK ;BR = NO HANDLE NORMAL SCAN
MOVE A0,A6
MOVE A4,A0
CALLA CENTER_CHECK
JRZ DINO_NOT_NEAR_DANGER ;OK TO CONTINUE IN THIS DIRECTION
MOVB *A13(DTREXFLG),A0 ;ARE WE DEALING WITH THE BIG GUY?
JRNE DTREX_CK_DANGER
MOVB *A13(DINVIN),A0 ;IS HE INVINCIBLE?
JRNE DINO_NOT_NEAR_DANGER ;BR = NOTHING CAN HURT HIM
JRUC DINO_LITTLE
DTREX_CK_DANGER
MOVB *A4(CMOVEEGG),A0
CMPI FIREID,A0 ;IS THE FIRE A BURNIN'
JREQ DINOWLP ;BR = YES, THEN STOMP IT OUT
MOVE *A4(CMOVEMPTR),A0,L
MOVE A1,A4
MOVE A0,A1
MOVE *A13(DDIR),A0,W
CALLA TWO_MOVES ;GO TWO MOVES AHEAD
JRZ DTREX_EDGED ;BR = NOTHING THERE, JUST DO NORMAL
MOVE *A1(MOVECPTR),A0,L
JRNN DTREX_CK_LAND
MOVE A1,A0
JAUC DTREX_LEAP
DTREX_CK_LAND
MOVB *A0(CMOVEEGG),A1
CMPI FIREID,A1
JAEQ DTREX_LEAP
CALLA CENTER_CHECK
JAZ DTREX_LEAP ;MAKE THE LONG JUMP
DTREX_EDGED
MOVE A4,A1
DINO_LITTLE
MOVE A6,A0
JRUC DINO_NEAR_EXIT ;SAVE ME FROM DEATH PLEASE
DINO_NOT_NEAR_DANGER
MOVE A6,A0
*
*A0 = CURRENT MOVE PTR
*A1 = ADJACENT MOVE IN THE CURRENT DIRECTION
*A5 = *A0(MOVECPTR),L
*
DINO_CK_LOOK
MOVB *A13(DSMART),A6 ;IS HE A SMARTIE PANTS?
JREQ DINOWLP ;BR = NO
MOVE A5,A5 ;EEZ ZEES A ZENTER POYANT?
JRN DINOWLP ;BR = NO
PUSHP A0
CLR A1
JSRP DINO_FRANIM ;TAKE ONE MORE STEP
PULLP A0
CALLA DINO_FIND_CLOSEST ;GET THE CLOSEST EGG OR HOUSE
MOVE A1,A4
CALLA GET_BEST_DIRECTION ;FIND THE WAY TO THE EGG OR HOUSE
JRZ DINOWLP ;BR = CAN'T GO THAT WAY
CMP A1,A11 ;IS THE BEST, THE SAME?
JREQ DINOWLP ;YES, JUST WALK
CALLR DINO_CENTER ;CENTER THIS GUY
MOVE A1,A11
JSRP DINOTURN ;AND HEAD TOWARDS IT
CALLR DINO_WALK_LOAD
JRUC DINOWLP
*
*JUMP HERE WHEN THE DINO STEPS OUT OF BOUNDS
*A11 = CURRENT DIRECTION
DINO_OUT_OF_BOUNDS
CALLA ISHOME ;SEE IF THE DINOSAUR MADE IT HOME
JRZ DINODTH5
MOVE @CURPLYRS,A0,W ;ARE THERE PLAYERS PLAYING?
JRNZ CELEBRATE ;BR = YES, YOU CAN GO HOME
MOVE @GAME_STATE,A0,W
CMPI INAMODE,A0 ;ARE WE IN ATTRACT MODE?
JREQ CELEBRATE ;BR = YES, THEN RUN THE FIRST PART
DINO_OUT_AND_BACK
SLEEP 2 ;PAUSE
CALLR NOTDIR
JSRP DINOTURN ;ABOUTFACE
CALLR DINO_WALK_LOAD
MOVI 0802H,A1 ;ANIMATE A LITTLE WAY BEFORE RESUMING
JSRP DINO_FRANIM
JRUC DINOWLP ;START TO WALKIN'
DINODTH5
MOVB *A13(DTREXFLG),A0 ;ARE WE TREX?
JRNE DINO_OUT_AND_BACK ;BR = YES, THEN NO DEATH ALLOWED
PUSHP A4 ;STORE THE PTR TO EXIT AREA
CALLR MARK_DINO_DEAD
MOVB *A4(EMOVEDIR),A11
MOVE A11,*A13(DDIR),W
CALLR NOTDIR
MOVE A11,*A13(DINITDIR),W ;MAKE THIS THE NEW DIRECTION
CMPI TYPE_PIT,A5 ;DID WE DIE IN A PIT?
JREQ DINOBIGPIT ;BR = YES SIR
CMPI TYPE_VOLCANO,A5 ;DID WE BUMP A VOLCANO?
JREQ DINOVOLCANO ;BR = YES SIR
*
* CHECK TO SEE IF ANYONE ELSE HAS A HOUSE ON THIS SPOT
*
MOVE *A4(EMOVEOBJ),A0,L
JRZ DINO_DEATH_OFF_EDGE
MOVE *A13(DDIR),A11,W
CMPI DOWN,A11
JRNE DINO_DEATH_HOUSE_PIT
MOVI [0,0302H],A1 ;TAKE SOME EXTRA STEPS
JSRP DINO_FRANIM
MOVE *A12,A4,L ;RETRIEVE THE EXIT POINTER
DINO_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 DINO_DEATH_DONE
DINO_DEATH_OFF_EDGE
CALLA BTYPE_CK
JRNZ DDEATHLAVA
MOVI DEATH_UP,A0 ;DEFAULT ON NORMAL DEATH
JRUC DDEATHLAN
DDEATHLAVA
MOVI LAVADIEU,A0
JRUC DDEATHLAN
DDEATHLAN
JSRP FRANIMATE_DIR
JRUC DINO_DEATH_DONE
*
*ANIMATE PIT DEATH ANIMATION WITH CENTER POINT DRIFT
*A6 = PIT [Y,X] CENTER POINT
DINOBIGPIT
PUSHP A6
MOVI PIT_DEATH_UP,A0
JSRP FRANIMATE_DIR ;ANIMATE THE FLAIL
CALLA GETCPNT ;GET THE DINO 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 DINO_DEATH_DONE
*
*WHAT TO DO IF WE HIT A VOLCANO
DINOVOLCANO
PULLP A4
MOVI STANDU,A0
JSRP ANIMATE_DIR ;STAND
**** SLEEP 5 ;PAUSE
**** CALLR NOTDIR
**** JSRP DINOLOOK_TURN ;ABOUTFACE
**** CALLR DINO_WALK_LOAD
****
**** MOVI 0802H,A1 ;ANIMATE A LITTLE WAY BEFORE RESUMING
**** JSRP DINO_FRANIM
CALLR MARK_DINO_LIVE
JRUC DINOWLP ;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
DINO_DEATH_DONE
MOVI DINOS,A1
CALLA DELETE_SUPP
CALLA OBJ_OFF ;TURN THAT DINO OFF
MOVE *A13(DPLAYER),A2,L ;RESTORE HIS PLAYER POINTER
MOVE *A2(PPALID),A0,L
CALLA CHANGE_PAL ;RESTORE OLD PALETTE
MOVE *A13(DINITTAB),A1,L ;RESTORE INITIALIZATION TABLE
MOVE *A1(INITIMG),A1,L
MOVE *A8(OFLAGS),A4,W
CALLA ANI ;RESTORE FORWARD STANDARD FRAME
CALLR KILL_INVINCIBILITY
MOVE *A2(PPID),A0,W
ORI PSPEEDPID,A0
CALLA KILLPROC_ALL ;KILL ALL THE SPEEDERS AND SLOWERS
MOVE *A2(PPID),A0,W
ORI PFIREPID,A0 ;KILL THE FIRE MEN
CALLA KILLPROC_ALL
CALLA TREX_KILL ;KILL THE TREX IF NECESSARY
CLR A0
MOVE A0,*A2(PLASTDTH),L ;CLEAR TIME SINCE LAST DEATH
MOVE A0,*A2(PEGGSTHISLIFE),W ;CLEAR THE CONTINUAL EGG COUNT
DECM *A2(PDINOCNT),W ;DECREMENT THE ACTIVE DINO COUNT
INCM *A2(PWAVEDEATHS),W ;INCREMENT DEATH COUNT THIS WAVE
MOVK 1,A0
MOVE A0,*A2(PDTHFLAG),W ; FLAG THE GUY AS DEAD
MOVK 10H,A1
CALLA SCORE ;GIVE THE DUDE SOME POINTS FOR DYING
PULLP A4
MOVE A4,A4
JREQ DINODEATH_OLD_RET
MOVE *A4(EMOVERET),A0,W
JRN DINODEATH_OLD_RET ;BR = RETURN TO THE OLD POSITION
CALLA GETMOVE ;GET THE MOVE POINT
MOVE *A0(MOVEPOS),*A13(DINITPOS),L ;AND GET THE POSITION
DINODEATH_OLD_RET
MOVE *A13(DINITPOS),*A2(PDTHPOS),L
MOVE *A2(PDRONEFLG),A0,W
JRNZ DINO_ETERNAL
MOVE @BONUS_WAVE,A0,W ;IS THIS SOME TYPE OF BONUS WAVE
JRNZ DINO_ETERNAL ;BR = YES, NO DEATH FOR US
CALLA SUBLIFE ;SUBTRACT A LIFE
JRC DINO_PLAYERX ;ALL LIVES EXTINGUISHED, BLOW OFF
DINO_ETERNAL
**** SLEEP 60 ;WAIT A LITTLE BIT BEFORE RE-INIT
MOVI 60,A0
MOVE *A13(DPLAYER),A2,L
JSRP SLEEP_START
JRUC DINODEATH_XFER
*
*A2 = PTR TO PLAYER DATA BLOCK
*A4 = RETURN MOVE POINTER
DINO_PLAYERX
MOVE A2,A11 ; PLAYER DATA AREA
MOVE A4,A4
JREQ DINO_GAMEOVER_CPNT ;BR = NO DEATH RETURN, DO IT FROM CENT
MOVE *A13(DINITPOS),A9,L ;IT'S ALREADY BEEN DONE FOR US
JRUC DINO_GAMEOVER_FLY
DINO_GAMEOVER_CPNT
CALLA GETCPNT
MOVE A1,A9
DINO_GAMEOVER_FLY
CREATE INDPID,GAME_OVER_FLY
MOVK 1,A0 ; KEEP SCORPROC FROM BEING A PAIN
MOVE A0,*A11(PDEAD),W
CALLA PLAYER_DELETE ;DELETE THIS PLAYER
JRNE DINOWX ;GAMES NOT OVER
**** ADJUST ADJBUYIN ;ARE GAME CONTINUES ALLOWED?
**** CMPI 0,A0
**** JAEQ GAME_OVER ;BR = NEVER
**** CMPI 2,A0
**** JREQ DINO_BUYBUY ;BR = ALWAYS
**** MOVE *A2(PCONSECUTIVE),A0,W
**** CMPI 1,A0
**** JAHI GAME_OVER ;BR = SOMETIMES
CALLA ALLOW_CONTINUE
JAZ GAME_OVER
DINO_BUYBUY
**** AUDIT AUDCONTOFFER ;CLICK A CONTINUE OFFERED
DINO_BUYBUY_LP
CREATE BUYINPID,BUYINWIN ;CREATE BUYIN WINDOW
JRNZ DINO_BUYIWT4
SLOOP 4,DINO_BUYBUY_LP
DINO_BUYIWT4
MOVK 1,A0
MOVE A0,@BUYNOW,W
DINO_BUYIWT5
*WAIT ON BUYIN MESSAGE TO CRUISE
MOVE @BUYNOW,A0,W
JRZ DINO_BUYIWT6 ;BR = WINDOW IS GONE.
SLOOP 1,DINO_BUYIWT5
DINO_BUYIWT6
MOVE @CURPLYRS,A0,W ;IS THERE A NEW DUDE?
JAZ GAME_OVER ;BR = NO
**** AUDIT AUDCONTTAKEN ;CLICK A CONTINUE TAKEN
DINOWX
DIE
DINODIE_SND
.WORD >F320,>3E,>808A,0 ;DEATH SOUND
DINO_MOVE_TAB
.BYTE 0FFH,UP,DOWN,0FFH
.BYTE LEFT,0FFH,0FFH,0FFH
**** .BYTE LEFT,(LEFT*16)+UP,(LEFT*16)+DOWN,0FFH
.BYTE RIGHT,0FFH,0FFH,0FFH
**** .BYTE RIGHT,(RIGHT*16)+UP,(RIGHT*16)+DOWN,0FFH
.BYTE 0FFH,0FFH,0FFH,0FFH
****UPTABLE
**** .BYTE 0FFH,0FFH,DOWN,DOWN
**** .BYTE LEFT,LEFT,LEFT,0FFH
**** .BYTE RIGHT,RIGHT,RIGHT,0FFH
**** .BYTE RIGHT,0FFH,0FFH,0FFH
****
****DNTABLE
**** .BYTE 0FFH,UP,0FFH,UP
**** .BYTE LEFT,LEFT,LEFT,0FFH
**** .BYTE RIGHT,RIGHT,RIGHT,0FFH
**** .BYTE RIGHT,0FFH,0FFH,0FFH
****
****LFTABLE
**** .BYTE 0FFH,UP,DOWN,UP
**** .BYTE 0FFH,UP,DOWN,0FFH
**** .BYTE RIGHT,UP,DOWN,0FFH
**** .BYTE RIGHT,0FFH,0FFH,0FFH
****
****RTTABLE
**** .BYTE 0FFH,UP,DOWN,UP
**** .BYTE LEFT,UP,DOWN,0FFH
**** .BYTE 0FFH,UP,DOWN,0FFH
**** .BYTE LEFT,0FFH,0FFH,0FFH
**************************************************************************
* *
* DINO_NEW_MOVE - SET DINO ON THE NEAREST MOVE POINT. *
* A8 = PTR TO DINO *
* A13 = PTR TO DINO PROCESS *
* RETURNS *
* NC = MOVE WAS A CENTER *
* C = MOVE WAS AN AUXILLARY *
* A0 = PTR TO MOVE DATA *
* A1 = [Y,X] DINO CENTER *
* A3 = [Y,X] MOVE POSITION *
* *
**************************************************************************
DINO_NEW_MOVE
PUSH A5
CALLR GET_DINO_MPNT
MOVE A3,*A13(TCURMPOS),L ;AND STORE IT AS HIS CURRENT MOVE POS
MOVE *A0(MOVECPTR),A5,L ;ARE WE SITTING ON A CENTER POINT
JRNN DNM_CPNT ;BR = YES
MOVE *A0(MOVEAPTR),A5,L ;HOW 'ABOUT AN AUX POINT
JRN DNM_AFAIL ;BR = NO
CALLA EGG_OBJ ;CHECK FOR AN EGG
DNM_AFAIL
SETC
JRUC DNM_X
DNM_CPNT
CALLA EGG_OBJ ;CHECK FOR AN EGG
CLRC
DNM_X
PULL A5
RETS
**************************************************************************
* *
* DINO_STICK - ROUTINE TO DETERMINE IF THIS SHOULD CHANGE DIRECTION. *
* A8 = PTR TO DINO *
* A11 = CURRENT DIRECTION *
* A13 = PTR TO DINO PROCESS *
* RETURNS: *
* C = NOT ALLOWED TO GO IN THE DIRECTION SPECIFIED. *
* Z = STILL ON SAME SPOT *
* NZ = DINO HAS MOVED TO A NEW SPOT *
* NC = NEW STICK DIRECTION *
* Z = NEW STICK IS THE SAME AS CURRENT DIRECTION *
* NZ = NEW STICK REQUIRES A TURN *
* A0 = PTR TO MOVE THAT DINO IS CURRENTLY UPON *
* A1 = [Y,X] CENTER OF DINO *
* A2 = PTR TO PLAYER DATA *
* A3 = [Y,X] CENTER OF MOVE *
* A6 = NEW DIRECTION *
* *
**************************************************************************
DINO_STICK
MMTM SP,A5,A7
CALLR GET_DINO_MPNT ;GET THE DINOSAURS PHYSICAL MOVE PNT
MOVE *A13(DPLAYER),A2,L
MOVE *A2(PJOYSTCK),A6,W ;CHECK THE CONTROL STICK
SLL 28,A6
SRL 25,A6
ADDI DINO_MOVE_TAB,A6
MOVB *A6,A6 ;TRANSLATE TO A MOVE
JRN DS_SAME_DIR ;BR = ILLEGAL STICK, JUST CONTINUE
**** CMPI RIGHT,A6 ;DO WE HAVE A SINGLE DIRECTION
**** JRLS DS_ONE_WAY ;BR = YES
*HERE WE HAVE A CASE WHERE TWO SWITCHES ARE MAKING AT ONCE.
*FIRST DIRECTION IS CHECKED, IF IT IS NOT CURRENT DINO DIRECTION
*THEN IT IS TAKEN, OTHERWISE, DIRECTION #2 IS TAKEN
**** MOVE A6,A7
**** SLL 28,A6
**** SRL 28,A6
**** CMP A6,A11 ;CHECK NUMBER ONE DIRECTION
**** JRNE DS_DIR_PICKED ;BR = NOT SAME, TAKE IT
**** MOVE A7,A6
**** SLL 28,A6
**** SRL 28,A6
**** JRUC DS_DIR_PICKED ;DEFAULT TO #2
****DS_ONE_WAY
CMP A6,A11 ;STICK DIR SAME AS DINO DIR?
JREQ DS_SAME_DIR ;BR = YES
****DS_DIR_PICKED
MOVE A1,A7
MOVE A6,A1 ;LOOK ONE MOVE IN THE STICK DIRECTION
CALLA ONE_MOVE
JRZ DS_CK_NEW ;BR = THERE IS NO MOVE THERE
MOVB *A1(MOVEPLYR),A5 ;IS THERE A BONE UPON THIS SPOT?
JRN DS_CK_NEW ;BR = NO, GO FOR NEW DIRECTION
MOVE A7,A1
MOVE A11,A6 ;CONTINUE IN THE SAME DIRECTION
MOVE *A13(TCURMPOS),A5,L ;GET THE CURRENT SOFTWARE MOVE POINT
CMP A5,A3 ;SAME AS PHYSICAL?
JRNE DS_SAMEDIR_NEWSPOT ;BR = NO, FLAG THE NEW POINT
JRUC DS_SAMEDIR_SAMESPOT
DS_CK_NEW
MOVE A7,A1
MOVE A11,A5
CALLA NOTDIR
SWAP A11,A5
CMP A6,A5
JREQ DS_NEW_DIRECTION
MOVE *A13(TCURMPOS),A5,L ;GET THE CURRENT MOVE POINT
CMP A5,A3 ;SAME MOVE AS LAST TIME?
JREQ DS_CENT_CK ;BR = YES, LOOK FOR CENTER
DS_SAMEDIR_NEWSPOT
SETC
CLRZ
JRUC DS_X
DS_CENT_CK
MOVE *A0(MOVECPTR),A5,L ;IS THIS MOVE A CENTER?
JRNN DS_ND_CENTER ;BR = TAKE THE DIRECTION, CENTER 1st
DS_SAMEDIR_SAMESPOT
SETC
SETZ
JRUC DS_X
DS_ND_CENTER
CALLR DINO_CENTER
DS_NEW_DIRECTION
CLRC
CLRZ
JRUC DS_X
DS_SAME_DIR
CLRC
SETZ
JRUC DS_X
DS_X
MMFM SP,A5,A7
RETS
**************************************************************************
* *
* DINO_WALK_LOAD - ROUTINE TO LOAD THE DINOSAURS CORRECT WALKING SCRIPT. *
* A8 = PTR TO DINOSAUR *
* A10 = PTR TO DINOSAUR ANIMATION TABLE *
* A11 = PTR TO CURRENT DINOSAUR DIRECTION *
* A13 = PTR TO DINOSAUR PROCESS *
* RETURNS: *
* A9 = PTR TO ANIMATION *
* X,Y & Z VELOCITIES STUFFED IN THE OBJECT *
* NOTE: TRASHES A0 *
* *
**************************************************************************
DINO_WALK_LOAD
**** MOVB *A13(DFIREFLG),A0
**** JRZ DWL_GO
**** MOVI SPITFIREU,A0
****DWL_GO
CLR A0
ADD A11,A0
CALLR DINOLOAD
MOVE A9,*A13(DWALKFRM),L
RETS
**************************************************************************
* *
* DINO_HALTED - CHECK TO SEE IF THE DINOSAUR IS SOFTWARE HALTED. *
* A13 = PTR TO DINO PROCESS *
* RETURNS: *
* Z = NOT HALTED (A0 = 0) *
* NZ = HALTED (A0 <> 0) *
* A2 = PTR TO PLAYER DATA BLOCK *
* *
**************************************************************************
DINO_HALTED
MOVE *A13(DPLAYER),A2,L
JRZ DINO_HALTED_X
MOVE *A2(PDINOSTOP),A0,W ;DO WE WANT TO STOP THIS GUY?
DINO_HALTED_X
RETS
**************************************************************************
* *
* DINO_PNT_TST - TEST THIS POINT FOR THE EXISTENCE OF OTHER *
* DINOSAURS. *
* A3 = [Y,X] POINT TO TEST *
* RETURNS: *
* Z = PNT CLEAR OF OTHER DINOSAURS *
* NZ = PNT NOT CLEAR *
* NOTE: TRASHES A4 *
* *
**************************************************************************
DINO_PNT_TST
MMTM SP,A0,A1
MOVI DINOOID,A0
MOVI 0FFF0H,A1
CALLA DINOS_NEAR_PNT ;ARE THERE DINOS ABOUT?
JRNZ DINO_PNT_TST_X ;BR = YES SIR
CLR A1
CALLA ENEMIES_NEAR_PNT ;ARE THERE ANY ENEMIES ABOUT
DINO_PNT_TST_X
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* DINOINIT_PNT_FIND - FIND A SPOT FREE OF DINOS SO THAT WE CAN PLOP *
* ONE DOWN. *
* A0 = DIRECTION TO SEARCH FIRST *
* A1 = STARTING MOVE DATA *
* RETURNS: *
* Z = PNT COULD NOT BE FOUND. *
* NZ = PNT FOUND. (A3 = [Y,X] POINT) *
* NOTE: TRASHES A14 *
* *
**************************************************************************
DINOINIT_PNT_FIND
MOVE *A1(MOVEPOS),A3,L ;GET THIS DUDES POSITION
CALLR DINO_PNT_TST
JRNZ DINO_PNT_SRCH ;BR = POINT NOT OPEN, WE MUST SEARCH
CLRZ
RETS
DINO_PNT_SRCH
MMTM SP,A0,A5,A6
CLR A14
NOT A14
MOVB A14,*A1(MOVEDSRCH) ;MARK THIS AS SEARCHED
MOVK 4,A5
DINO_PNT_FIND_LP
MOVE A1,A6
CALLA TWO_MOVES ;GET THE MOVE IN THIS DIRECTION
JRZ DINO_PNT_FIND_NXT ;BR = NO MOVE THAT DIRECTION
MOVB *A1(MOVEDSRCH),A14 ;HAVE WE SEARCHED HERE ALREADY?
JRN DINO_PNT_FIND_NXT ;BR = YES
MOVE *A1(MOVEPOS),A3,L ;GET THIS DUDES POSITION
CALLR DINOINIT_PNT_FIND ;NOW FIND ONE FROM HERE
JRZ DINO_PNT_FIND_NXT ;DIDN'T FIND ONE, NEXT PLEASE
MOVE A6,A1
CLRZ
MMFM SP,A0,A5,A6
RETS
DINO_PNT_FIND_NXT
MOVE A6,A1
INC A0 ;GET NEXT DIRECTION
CMPI RIGHT,A0
JRLS DINO_PNT_DEC_LP
CLR A0 ;RESET TO UP
DINO_PNT_DEC_LP
DSJ A5,DINO_PNT_FIND_LP
SETZ
MMFM SP,A0,A5,A6
RETS
**************************************************************************
* *
* CELEBRATE - CELEBRATE THE ENDING OF A WAVE *
* A0 = PTR TO THE HOME OBJECT *
* A4 = PTR TO THE EXIT MOVE THAT WE ARE HAPPY ABOUT. *
* A8 = PTR TO DINOSAUR OBJECT *
* A10 = PTR TO DINOSAUR ANIMATION TABLE *
* *A13(DATABLE),L = PTR TO DINOSAUR ANIMATION TABLE *
* *A13(DDIR),W = CURRENT DINOSAUR DIRECTION *
* *A13(DPLAYER),L = DATA AREA OF PLAYER CONTROLLING THIS GUY *
* *
* NOTE: JUMP HERE FROM A PROCESS, IT WILL NOT RETURN. *
* *
**************************************************************************
CELEBRATE
CALLR KILL_INVINCIBILITY
MOVE A0,*A13(PTEMP1),L ;KEEP HOUSE PTR
CALLA GET_EXIT_ANI ;GET THE EXIT ANIMATION POINT
MOVE A3,A0
MOVI HOUSE_PITS,A1
CALLA ISSUPPANI ;IS THERE A DEATH PIT HERE?
JRZ CELEBRATE_AWAY ;BR = NO
MOVE A8,A0 ;RID US OF THAT PIT
MOVE A1,A8
CALLA OBJPROC_KILL
MOVI HOUSE_PITS,A1
CALLA DELETE_OBJ_SUPP
MOVE A0,A8
CELEBRATE_AWAY
MOVE @GAME_STATE,A0,W
CMPI INGAMEOV,A0
JREQ CELE_SKIP_ST
CMPI INAMODE,A0
JREQ CELE_SKIP_ST
CMPI INGAME,A0
JREQ DINOMADXFER ;SKIP BECAUSE WE ARE ALREADY COMPLETE
MOVI INGAME,A0 ;WE ARE THE FIRST TO PASS
MOVE A0,@GAME_STATE,W
CELE_SKIP_ST
MOVK 1,A0
MOVE A0,@WAVE_OVER,W ;FLAG THE WAVE DONE
MOVI COLLPID,A0
MOVI 0FFF0H,A1
CALLA KILALL ;KILL THE COLLISION PROCESSES
CALLR DINOMAD ;MAKE THE OTHER DINOSAURS MAD AT THIS
CALLA TREX_KILL ;KILL THE TREX IF NECESSARY
MOVE *A13(DPLAYER),A2,L
MOVE *A2(PDRONEFLG),*A13(PTEMP4),W ;STORE DRONE FLAG FOR LATER
**** ALLPLYR CLR_DRONE ;CLEAR THE DRONE STATUS OF ALL PLAYERS
**** INCM *A2(PWINS),W
CLR A4
MOVE *A2(PWINS),A5,W
JRNZ CEL_NO_BONUS
MOVE @START_SCORE,A1,L
JRZ CEL_NO_BONUS
CALLA SCORE ;AWARD START AHEAD BONUS, IF ANY
INC A4
CEL_NO_BONUS
MOVE A4,*A13(PTEMP2),W
INC A5
MOVE A5,*A2(PWINS),W
MOVE @WAVE,A0,W
MOVE A0,*A2(PLASTWIN),W
* MAKE ALL OF THE OTHER PWAVETIMEs TO BIG TO OUTPUT TIMER
MOVE @NPLAYERS,A0,W
MOVI P1DATA,A3
MOVI 7FFFH,A4
CEL_CLEAR_LP
CMP A2,A3
JREQ CEL_NEXT_CLEAR
MOVE A4,*A3(PWAVETIME),L
CEL_NEXT_CLEAR
ADDI PDSIZE,A3
DEC A0
JRNN CEL_CLEAR_LP
MOVE *A13(DDIR),*A13(PTEMP3),W ;SAVE THE EXIT DIRECTION
MOVK DOWN,A11
JSRP DINOTURN
MOVI STANDU,A0
JSRP ANIMATE_DIR ;MAKE SURE HE STANDING STILL
MOVI 7FFF0002H,A1
MOVE A1,*A8(OZVAL),L
SLEEP 10
MOVE @GAME_STATE,A0,W
CMPI INAMODE,A0 ;DID WE DO THIS FOR FREE?
JREQ CELEBRATE_AMODE_DIE ;BR = YES!
JSRP WAIT_WAVE_END
SLEEP 30
MOVI 2000H,A9
CREATE SKYPID,SKYDOWN
MOVI PHELPPID,A0
MOVI PPROCMASK,A1
CALLA KILALL ;KILL ALL OF THE HELPER BOXES
SOUND1 ALLOFF
SLEEP 4
SOUND1 WIN_SND ;MAKE THE WINNER SOUND
CLR A0
MOVI 0E000h,A1
CALLA KILALL ;KILL EVERYTHING WE CAN
ALLPLYR CLR_DRONE ;CLEAR THE DRONE STATUS OF ALL PLAYERS
MOVK 30,A11
CREATE INDPID,WIPE_FROM_MID ;CLEAR THE SCREEN
MOVE *A8(OXPOS),A2,W
MOVE *A8(OYPOS),A3,W
SLL 16,A3
MOVY A3,A2
MOVI [180,185],A3
MOVI 10*4,A4 ;LONGER THAN WIPE_FROM_MID SLEEP
CALLA SLINEVEL
MOVE A1,*A8(OXVEL),L
MOVE A2,*A8(OYVEL),L
MOVI DINOFLY_ANIM,A9
MOVK 1,A1
JSRP FRANIM
CALLA PSTOP
CLR A1
CALLA KILOBJ_XA8 ;RID OF ALL OBJECTS EXCEPT WINNER
CLR A0 ;SCREEN SHALL BE BLACK
MOVE A0,@IRQSKYE,W
CALLA KILB2OBJ
CALLA KILBOBJ
CALLA CLRBPAL ;CLEAR THE BACKGROUND PALETTES
ALLPLYR CLR_PDINOCNT ;CLEAR THE DINOSAUR COUNTS
CALLA SCORAREA ;REPLOT THE SCORE AREA
MOVE *A13(DPLAYER),A2,L
**** CALLA OUT_TIME ;AND GIVE US THE TIME
MOVI BUYWIN_Z,A1
MOVE A1,*A8(OZVAL),L
MOVE A2,A11 ;PLAYER DATA HERE FOR PROCESSES
CALLA PARTY_STUFF
SLEEP 40
CALLA DANCE_STUFF ;MAKE SURE A11 STILL IS PLAYER DATA
MOVE *A13(PTEMP2),A2,W
JRZ CEL_SKIP_WB
MMTM A12,A8,A9,A10,A11
MOVI WINB_MESS,A8
JSRP LM_PRINTF
MMFM A12,A8,A9,A10,A11
MOVI TEXTOID,A0
MOVI BTITLEOID,A1
CALLA CHANGOID ;LETTERS SHOULD BE NON-DISCERNABLE
CEL_SKIP_WB
MOVE *A8(OID),A2,W
SLL 30,A2
SRL 24,A2
MOVE A2,A4
ADDI DINOCHEER_ANIM,A4
MOVE *A4+,A9,L
CREATE INDPID,CELEBRATEAMATE
MOVE A0,*A8(OPLINK),L
MOVE *A4+,A9,L ;DOES HE HAVE ANOTHER PART?
JRZ CELE_1PART ;BR = NO
CALLA GETOBJ ;ADD A SECOND PART
JRZ CELE_1PART
CALLA COPY_OBJ
MMTM A12,A2,A8,A9
MOVE A0,A8
MOVK 4,A1
JSRP FRANIM
CALLA INSERT_OBJ
PULLP A9
CREATE INDPID,CELEBRATEAMATE
MOVE A0,*A8(OPLINK),L
MOVE A8,*A13(PTEMP2),L
MMFM A12,A2,A8
JRUC CB_CONTINUE
CELE_1PART
CLR A0
MOVE A0,*A13(PTEMP2),L ;FLAG FOR NO EXTRA PARTS
CB_CONTINUE
MOVE @GAME_STATE,A0,W
CMPI INAMODE,A0 ;DID WE DO THIS FOR FREE?
JREQ CELEBRATE_AMODE_DIE ;BR = YES!
MOVE A8,*A13(PTEMP1),L ;KEEP DINO PTR FOR LATER
SRL 1,A2
ADDI COMPSNDTAB,A2
MOVE *A2,A0,L
CALLA ONESND ;MAKE HIS COMPLETION SOUND
MOVE *A8(OID),A4,W
SLL 28,A4
SRL 23,A4
ADDI PNAME_TAB,A4
MOVE *A4,A4,L
MOVE A4,@STRING1,L
MOVE *A13(PTEMP4),A0,W ;DRONE WIN?
JRZ CELEBRATE_NORM_TEXT ;BR = NO
MOVI WIN_MESS,A8 ;ALWAYS PUT THIS MESSAGE FOR DRONE WIN
JRUC CELEBRATE_PRINT
CELEBRATE_NORM_TEXT
CALLA WAVE_PLAYERS
CMPI 1,A0 ;DID MORE THAN ONE GUY PLAY?
JRHI CELEBRATE_WIN ;BR = YES, THEN THIS GUY WON
MOVI COMP_MESSAGES,A8 ;COMPLETE TEXT TABLE
JRUC CELEBRATE_TEXT
CELEBRATE_WIN
MOVI WIN_MESSAGES,A8 ;WIN TEXT TABLE
CELEBRATE_TEXT
MOVK NUM_WIN_MESSAGES,A0
CALLA RANDU ;SELECT A RANDOM MESSAGE
DEC A0 ;ZERO BASED
SLL 29,A0
SRL 24,A0
ADD A0,A8
MOVE *A8,A8,L
CELEBRATE_PRINT
PUSH A8
MOVI CELEBRATE_MESS,A8
CALLA LM_SETUP
PULL A8
JSRP PRINTF
MOVI BTITLEOID,A0
CALLA KILOBJ_ALL
SLEEP 10
CALLA WAVE_PLAYERS
CMPI 1,A0
JRLS CELE_SKIP_WINNER_BONUS
DEC A0
MOVI 25000,A1
MPYU A0,A1 ;POINTS BASED ON # OF PLAYERS
MOVE A1,A0
MOVE A0,@STRING2,L
CALLA BINBCD ;CONVERT FOR SCORE
MOVE A0,A1
MOVE *A13(DPLAYER),A2,L ;SCORE TO THIS PLAYER
CALLA SCORE
MOVI WINPOINT_MESS,A8
JSRP LM_PRINTF ;SEND OUT THE MESSAGE
CELE_SKIP_WINNER_BONUS
MOVI TEXTOID,A0
MOVI JUNKOID,A1
CALLA CHANGOID ;LETTERS SHOULD BE NON-DISCERNABLE
SLEEP 85
SOUND1 YAMOFF ;TURN THE CURRENT YAMAHA EFFECT OFF
**** MOVE *A13(PTEMP4),A0,W ;IS THIS A DRONE THAT WON?
**** JRNZ CELEBRATE_END ;BR = YES
**** SLEEP 5
**** SOUND1 BONUSM_SND ;START THE BONUS SOUND
**** MOVE *A13(PTEMP1),A8,L
**** CALLA OBJPROC_KILL
**** CALLA GETANIXY_PACKED
**** MOVE A3,A2
**** MOVI [100,193],A3
**** MOVI 10*4,A4 ;LONGER THAN WIPE_FROM_MID SLEEP
**** CALLA SLINEVEL
**** MOVE A1,*A8(OXVEL),L
**** MOVE A2,*A8(OYVEL),L
**** MOVE A8,A9
**** MOVE *A13(PTEMP2),A8,L
**** JRZ CB_NOEXTRA
**** CALLA OBJPROC_KILL
**** MOVE A8,A0
**** CALLA DELOBJ ;RID O' EXTRA OBJECT
****CB_NOEXTRA
**** MOVE A9,A8
**** MOVI BSPIKEFALL,A9
**** MOVK 1,A1
**** JSRP FRANIM
**** CALLA PSTOP
**** MOVE *A13(DATABLE),A10,L
**** MOVK 4,A0
**** CALLA RANDU
**** DEC A0
**** ADDK CHEER1,A0
**** CALLR DINOLOAD
**** CREATE INDPID,CELEBRATEAMATE
**** MOVE A0,*A8(OPLINK),L
**** MOVE *A8(OID),A0,W
**** SLL 28,A0
**** SRL 28,A0
**** CALLA GPLAYD ;GET THAT PLAYERS DATA AREA
.IF PRINTER
CALLA PGAMEWAVE
.ENDIF
**** MOVE A2,A11
**** CALLA GETANIXY_PACKED
**** MOVE A3,A10
**** CREATE GOODIEPID,FIREWERK
**** MOVI [149,81],A10 ;PUT THAT MARQUEE HERE
**** MOVE A2,A11
**** CREATE INDPID,BORDER_MARQUEE
**** CREATE BONUSPID,BONUS_COUNT
****CELEBRATE_BONUS_WAIT
**** SLEEP 10
**** MOVI BONUSPID,A0
**** CLR A1
**** NOT A1
**** CALLA EXISTP
**** JRNZ CELEBRATE_BONUS_WAIT
****CELEBRATE_END
JAUC WAVE_END
*
*DIE HERE IF WE ARE IN AMODE PLAY. THIS LEAVES THE DINO RUNNING HIS
*MONDO BIG ANIMATION.
CELEBRATE_AMODE_DIE
MOVK 1,A0
MOVE A0,@APLAYDONE,W ;FLAG THE A-MODE PLAY AS FINISHED
SLEEP 60
MOVE @APLAYDONE,A0,W
JRZ CADNOW
*SAFETY TRAP FOR BOGUS HAPPENINGS DURING ATTRACT MODE
CALLA WIPEOUT
CALLA ATSTRT
CADNOW
DIE
BONUSM_SND
.WORD >F231,>1,>8009,0 ;BONUS MUSIC
WINB_MESS
MESS_MAC RD7FONT,2,197,206+SKYTOPOF,DINO_PWHITE,STRCNRMO,0
.STRING "LEVEL BONUS AWARDED",0
.EVEN
**************************************************************************
* *
* TABLE OF MESSAGES TO OUTPUT UPON COMPLETION *
* OF A WAVE WITH MULTIPLE PLAYERS PLAYING. *
* *
**************************************************************************
WINPOINT_MESS
MESS_MAC RD7FONT,2,197,206+SKYTOPOF,DINO_PWHITE,STRCNRMO,0
.STRING "%,ld POINTS FOR WINNING.",0
.LONG STRING2
NUM_WIN_MESSAGES .EQU 5
*COMMON HEADER FOR ALL OF THE CELEBRATION MESSAGES
CELEBRATE_MESS
MESS_MAC RD20FONT,2,197,10+SKYTOPOF,01010000H,STRCNRMO,0
WIN_MESSAGES
.LONG WIN_MESS, BEST_MESS, VICTOR_MESS, TD_MESS
.LONG DINO_MESS, DINO_MESS, DINO_MESS, DINO_MESS
WIN_MESS
.STRING "%p\a!\a\n\bThe Winner\a!\a",0
.LONG STRING1
.WORD 60
.WORD 0
.WORD 0D0DH
.WORD 30
.WORD 0
BEST_MESS
.STRING "%p\a!\a\n\bThe Best\a!\a",0
.LONG STRING1
.WORD 60
.WORD 0
.WORD 0D0DH
.WORD 30
.WORD 0
VICTOR_MESS
.STRING "%p\a!\a\n\bThe Victor\a!\a",0
.LONG STRING1
.WORD 60
.WORD 0
.WORD 0D0DH
.WORD 30
.WORD 0
TD_MESS
.STRING "%p\a!\a\n\bTop Dino\a!\a",0
.LONG STRING1
.WORD 60
.WORD 0
.WORD 0D0DH
.WORD 30
.WORD 0
DINO_MESS
.STRING "%p\a!\a\n\bDINO-MITE\a!\a",0
.LONG STRING1
.WORD 60
.WORD 0
.WORD 0D0DH
.WORD 30
.WORD 0
**************************************************************************
* *
* TABLE OF MESSAGES TO OUTPUT UPON COMPLETION *
* OF A WAVE WITH ONE PLAYER PLAYING. *
* *
**************************************************************************
COMP_MESSAGES
.LONG CONGRAT_MESS, GJ_MESS, EXCEL_MESS, WTG_MESS
.LONG DINO_MESS, DINO_MESS, DINO_MESS, DINO_MESS
CONGRAT_MESS
.STRING "%p\a!\a\n\bCongratulations\a!\a",0
.LONG STRING1
.WORD 60
.WORD 0
.WORD 0D0DH
.WORD 30
.WORD 0
GJ_MESS
.STRING "%p\a!\a\n\bGOod Job\a!\a",0
.LONG STRING1
.WORD 60
.WORD 0
.WORD 0D0DH
.WORD 30
.WORD 0
EXCEL_MESS
.STRING "%p\a!\a\n\bExcellent\a!\a",0
.LONG STRING1
.WORD 60
.WORD 0
.WORD 0D0DH
.WORD 30
.WORD 0
WTG_MESS
.STRING "%p\a!\a\n\bWay To Go\a!\a",0
.LONG STRING1
.WORD 60
.WORD 0
.WORD 0D0DH
.WORD 30
.WORD 0
**************************************************************************
* *
* DINOMAD - MAKE THE OTHER DINOSAURS MAD THAT THIS ONE FINISHED. *
* A8 = PTR TO WINNING DINOSAUR *
* *
**************************************************************************
DINOMAD
MMTM SP,A0,A1,A2,A3,A4,A5,A7,A8
MOVE *A8(OID),A4,W
MOVE A8,A5
MOVI DINOS,A8
MOVE *A8,A8,L
JRZ DINOMADX
MOVI INDPID,A1
DINOMADCK
CMP A8,A5
JREQ DINOMADNXT ;SAME DINOSAUR
MOVE *A8(OID),A3,W
CMP A4,A3 ;DINOSAUR OF THE SAME NAME SMELLS
JREQ DINOCELE
MOVE A3,A0 ;GET AHOLD OF PLAYER IN CONTROL
SRL 4,A3
SLL 4,A3
CMPI DINOOID,A3
JRNE DINOMADNXT
SLL 28,A0
SRL 28,A0
CALLA GPLAYD ;GET THE PLAYER DATA AREA
MOVE *A2(PEGGS),A0,W ;CHECK EGG COUNT AGAINST REQUIRED
MOVE @WAVEEGGS,A7,W ;# OF EGGS GIVEN THIS WAVE / PLAYER
CMP A7,A0
JRHS DINO_MAD_EGGS ;BR = I HAD ENOUGH EGGS TOO, WAAAAA
MOVI DINOQUESXFER,A7 ;LOAD UP THE QUESTION XFER
JRUC DINOMADDO
DINO_MAD_EGGS
MOVI DINOMADXFER,A7 ;LOAD UP THE MAD XFER POINT
JRUC DINOMADDO
DINOCELE
MOVI DINOCELEXFER,A7 ;LOAD UP THE CELEBRATE XFER POINT
DINOMADDO
CALLA OBJPROC_XFER
DINOMADNXT
MOVE *A8(OSLINK),A8,L
JRNZ DINOMADCK
DINOMADX
MMFM SP,A0,A1,A2,A3,A4,A5,A7,A8
RETS
*
*DINOCELEXFER - ALL OTHER DINOSAURS CELEBRATE XFER POINT
*
DINOCELEXFER
CALLA TREX_KILL
MOVE *A13(DATABLE),A10,L
MOVK DOWN,A11
JSRP DINOTURN
MOVK 4,A0
CALLA RANDU
DEC A0
ADDK CHEER1,A0
CALLR DINOLOAD
JRUC CELEBRATEAMATE
*
*DINOMADXFER - MAD DINOSAUR TRANSFER POINT
*
DINOMADXFER
CALLA TREX_KILL
MOVE *A13(DATABLE),A10,L
MOVE *A13(DDIR),A11,W
MOVE A11,A0
ADDI MADU,A0
CALLR DINOLOAD
JRUC CELEBRATEAMATE
*
*DINOQUESXFER - DINOSUAR LOOKS AT YOU STUPIDLY XFER POINT
*
DINOQUESXFER
CALLA TREX_KILL
MOVE *A13(DATABLE),A10,L
MOVK DOWN,A11
JSRP DINOTURN ;FACE FORWARD
MOVK 4,A0
CALLA RANDU
DEC A0
ADDI QUESTION,A0
CALLR DINOLOAD
JRUC CELEBRATEAMATE
*
*COMPLETE SOUNDS
COMPSNDTAB
.LONG REXCOMP_SND,BLOOPCOMP_SND,ELVISCOMP_SND,SPIKECOMP_SND
REXCOMP_SND
.WORD >F321,>78,>8083,0 ;REX COMPLETE SOUND
BLOOPCOMP_SND
.WORD >F321,>78,>8086,0 ;BLOOP COMPLETE SOUND
ELVISCOMP_SND
.WORD >F321,>78,>8085,0 ;ELVIS COMPLETE SOUND (NEW NAME SPIKE)
SPIKECOMP_SND
.WORD >F321,>78,>8084,0 ;SPIKE COMPLETE SOUND (NEW NAME GWEN)
**************************************************************************
* *
* CELEBRATEAMATE - PROCESS TO KEEP RUNNING THE CELEBRATION ANIMATION SCR *
* A8 = OBJECT *
* A9 = SCRIPT *
* *
**************************************************************************
CELEBRATEAMATE
MOVK 3,A1
JSRP FRANIM
DIE
**************************************************************************
* *
* DINOLOAD - LOAD THE DINOSAUR WALKING ANIMATION AND CORRECT VELOCITIES *
* A0 = INDEX *
* A8 = PTR TO DINOSAUR *
* A10 = PTR TO DINOSAUR ANIMATION TABLE *
* *A13(DVEL),L = CURRENT DINOSAUR VELOCITY *
* RETURNS: *
* A9 = PTR TO ANIMATION *
* X,Y & Z VELOCITIES STUFFED IN THE OBJECT *
* *
**************************************************************************
DINOLOAD
MMTM SP,A0,A1,A2
MOVE A0,A1
SLL 6,A0
SLL 5,A1
ADD A1,A0
ADD A10,A0
MOVE *A0+,A9,L
MOVE *A0+,A1,L
MOVE *A0+,A2,L
CALLR UPDATE_VEL
MMFM SP,A0,A1,A2
RETS
**************************************************************************
* *
* UPDATE_VEL - UPDATE THE DINOSAUR WITH NEW VELOCITIES WITH RESPECT TO *
* *A13(DEVL),L. *
* A1 = CURRENT X VELOCITY *
* A2 = CURRENT Y VELOCITY *
* A8 = PTR TO DINOSAUR *
* *A13(DVEL),L = ABSOLUTE VELOCITY *
* *
**************************************************************************
UPDATE_VEL
PUSH A1
MOVE A1,A1 ;CHECK XVEL
JRZ UPDATE_V0X ;BR = IT'S ZERO
JRN UPDATE_VNX ;BR = NEGATIVE
MOVE *A13(DVEL),A1,L
JRUC UPDATE_V0X
UPDATE_VNX
MOVE *A13(DVEL),A1,L
NEG A1
UPDATE_V0X
MOVE A1,*A8(OXVEL),L ;STUFF NEW XVEL
MOVE A2,A1
JRZ UPDATE_V0Y
JRN UPDATE_VNY
MOVE *A13(DVEL),A1,L
JRUC UPDATE_V0Y
UPDATE_VNY
MOVE *A13(DVEL),A1,L
NEG A1
UPDATE_V0Y
MOVE A1,*A8(OYVEL),L ;STUFF NEW YVEL
MOVE A1,*A8(OZVEL),L ;A COPY FOR MISTER Z
PULL A1
RETS
**************************************************************************
* *
* DINO_VEL - ADJUST FOR A NEW X & Y VELOCITY. *
* A1 = ABSOLUTE VALUE OF THE NEW VELOCITY *
* A13 = PTR TO DINO DATA STRUCTURE *
* *
**************************************************************************
DINO_VEL
MMTM SP,A1,A3,A10
CMPI 18000H,A1
JRLS DV_OK
MOVI 18000H,A1 ;MAX DINOSAUR VELOCITY IS THIS
DV_OK
MOVE A1,*A13(DVEL),L ;SET THIS AS THE NEW VELOCITY
MOVI 96*RIGHT,A3
MOVE *A13(DATABLE),A10,L
ADD A10,A3
ADDK 32,A3
MOVE *A3,A3,L ;GET THE BASE VELOCITY
CMP A3,A1
JRNE DINO_VEL_SMULT ;THEY ARE NOT EQUAL, NEW DSMULT
CLR A3 ;0 = NO SCRIPT MULTIPLY
JRUC DINO_VEL_SX
DINO_VEL_SMULT
SLL 8,A3
DIVU A1,A3 ;CALCULATE A NEW SCRIPT MULTIPLIER
DINO_VEL_SX
MOVE A3,*A13(DSMULT),W
MMFM SP,A1,A3,A10
RETS
**************************************************************************
* *
* DINO_ADD_VEL - INCREASE/DECREASE CURRENT DINOSAUR VELOCITY BY THE *
* GIVEN AMOUNT. THE ABS(DVEL) IS NOT ALLOWED TO GO BELOW *
* DSPEED/2 + 1000H OR HIGHER THAN DSPEED*2 *
* A0 = AMOUNT TO INCREASE/DECREASE. *
* A8 = PTR TO DINOSAUR *
* A13 = PTR TO DINO DATA STRUCTURE. *
* *
**************************************************************************
DINO_ADD_VEL:
MMTM SP,A1,A2
MOVE *A13(DVEL),A1,L
ADD A0,A1
MOVE *A13(DSPEED),A2,W
ZEXT A2
SLL 5,A2 ;DSPEED*2 IS MAX
CMP A2,A1 ;TOO HIGH?
JRLE DINOAV_CK_LO ;BR = NO, CHECK THE LOW ROAD
MOVE A2,A1 ;GIVE MAX
JRUC DINOAV_ADJ
DINOAV_CK_LO
SRL 2,A2 ;DSPEED/2
ADDI 1000H,A2 ;+ 1000H
CMP A2,A1 ;TOO LOW?
JRGE DINOAV_ADJ ;BR = NO
MOVE A2,A1
DINOAV_ADJ
CALLR DINO_VEL ;RE-CALCULATE FOR THE NEW VELOCITY
MOVE *A8(OXVEL),A1,L
MOVE *A8(OYVEL),A2,L
CALLR UPDATE_VEL
MMFM SP,A1,A2
RETS
**************************************************************************
* *
* DINO_INIT_VEL - RESTORE THE DINOSAURS INITIAL VELOCITY TO THE CURRENT *
* WORKING VELOCITY. *
* A13 = PTR TO DINO DATA STRUCTURE *
* A8 = PTR TO DINOSAUR *
* *A13(DSPEED),W IS THE PACKED VEL. BITS 0 - 11 FRAC.; BITS 12-15 INT. *
* *
**************************************************************************
DINO_INIT_VEL:
MMTM SP,A1,A2
MOVB *A13(DVNFLAG),A1 ;ARE WE ALLOWED TO DO THIS
JRNE DINO_IVX ;BR = NO
MOVE *A13(DSPEED2),A1,W ;ARE WE ON SECONDARY VELOCITY
JRNZ DINO_IV_DS2 ;BR = YES, THEN USE IT
MOVE *A13(DSPEED),A1,W
DINO_IV_DS2
ZEXT A1
SLL 4,A1
CALLR DINO_VEL ;SETUP THE INITIAL VELOCITY
MOVE *A8(OXVEL),A1,L
MOVE *A8(OYVEL),A2,L
CALLR UPDATE_VEL
DINO_IVX
MMFM SP,A1,A2
RETS
**************************************************************************
* *
* DINO_VEL_NORMAL - ADVANCE THE CURRENT DINOSAUR SPEED TOWARD *
* THE VALUE IN DSPEED OR IF DSPEED2 <>0 THEN DSPEED2. *
* A13 = PTR TO DINOSAUR DATA STRUCTURE. *
* A8 = PTR TO DINOSAUR *
* *A13(DVNFLAG),B = IF<>0 THEN DO NOTHING *
* *
**************************************************************************
DINO_VEL_NORMAL:
MMTM SP,A0,A1,A2
MOVB *A13(DVNFLAG),A1 ;ARE WE ALLOWED TO DO THIS
JRNE DINO_VNX ;BR = NO
MOVE *A13(DSPEED2),A1,W
JRNZ DINO_VN_DS2
MOVE *A13(DSPEED),A1,W
DINO_VN_DS2
ZEXT A1
SLL 4,A1 ;GET THE BASE DINO SPEED
MOVE *A13(DVEL),A0,L
SUB A0,A1
JRZ DINO_VNX ;BR = THEY ARE EQUAL, NO CHANGE NECES.
JRN DINO_VNN ;BR = MUST ADD NEGATIVE
MOVI 100H,A0
JRUC DINO_VN
DINO_VNN
MOVI -100H,A0
DINO_VN
CALLR DINO_ADD_VEL
DINO_VNX
MMFM SP,A0,A1,A2
RETS
**************************************************************************
* *
* DINO_FRANIM - FRANIM PRE-PROCESSOR TO ADD SCRIPT MULTIPLIER TO THE *
* FRANIM COMMAND. THEN CALL FRANIM. *
* CALL WITH FRANIM PARAMETERS *
* *A13(DSMULT),W = SCRIPT MULTIPLIER *
* RETURNS: *
* DIRECTLY FROM FRANIM *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
DINO_FRANIM:
MOVE *A13(DSMULT),A2,W
SLL 16,A2
MOVY A2,A1
JAUC FRANIM
**************************************************************************
* *
* DINOLOOK_TURN - HAVE DINOSAUR LOOK IN THE DIRECTION HE WILL TURN. *
* THEN TURN THAT WAY. *
* A8 = PTR TO DINOSAUR OBJECT *
* A10 = PTR TO DINOSAUR ANIMATION TABLE *
* A11 = NEW DIRECTION *
* *A13(DDIR),W = CURRENT DIRECTION *
* RETURNS: *
* A9 = PTR TO NEXT ANIMATION SCRIPT(SHOULD BE THE TURN ANIMATION) *
* A8,A10,A11 AS THEY WERE *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
DINOLOOK_TURN:
JSRP DINOLOOK
*
* JUST ANIMATE THE TURN SCRIPT TO GET TO THE NEW DIRECTION,
* CALL WITH THE SAME PARAMETERS AS DINOLOOK_TURN.
ANIMATE_TURN:
MOVK 1,A1
JSRP DINO_FRANIM ;AND ANIMATE IT
MOVE A11,*A13(DDIR),W
RETP
**************************************************************************
* *
* DINOLOOK - HAVE DINOSAUR LOOK IN THE DIRECTION HE WILL TURN. *
* A8 = PTR TO DINOSAUR OBJECT *
* A10 = PTR TO DINOSAUR ANIMATION TABLE *
* A11 = NEW DIRECTION *
* *A13(DDIR),W = CURRENT DIRECTION *
* RETURNS: *
* A9 = PTR TO NEXT ANIMATION SCRIPT(SHOULD BE THE TURN ANIMATION *
* A8,A10,A11 AS THEY WERE *
* NOTE: CALL WITH JSRP *
* DOES NOT STUFF THE NEW DIRECTION. *
* *
**************************************************************************
DINOLOOK:
MOVE *A13(DDIR),A1,W
SLL 5,A1
ADDI TURNTAB,A1
MOVE *A1,A1,L ;GET THE CORRECT TABLE TO SELECT FROM
MOVE A11,A2
SLL 3,A2
ADD A1,A2
MOVB *A2,A0
JRNN DINOLANI ;JUST DO THE LOOK
NOT A0
JRNZ DINOLOOKX
MOVE *A13(DDIR),A1,W ;FUCKIN' ABOUT FACE, MAN!
SLL 1,A1
ADDI ABOUTUL,A1
CALLA RANDOM ;LOOK IN A RANDOM DIRECTION
SRL 1,A0
JRNC DINOLOOK0
ADDK 1,A1
DINOLOOK0
MOVE A1,A0
DINOLANI
CALLR DINOLOAD ;LOAD THE CORRECT ANIMATION
MOVK 1,A1
JSRP DINO_FRANIM ;AND ANIMATE IT
DINOLOOKX
RETP
**************************************************************************
* *
* DINOTURN - TURN THE DINOSAUR FROM HIS CURRENT DIRECTION TO THE NEW *
* ONE GIVEN. *
* A8 = PTR TO DINOSAUR OBJECT *
* A10 = PTR TO DINOSAUR ANIMATION TABLE *
* A11 = NEW DIRECTION *
* *A13(DDIR),W = CURRENT DIRECTION *
* RETURNS: *
* A9 = PTR TO NEXT ANIMATION SCRIPT *
* A8,A10,A11 AS THEY WERE *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
DINOTURN:
MOVE *A13(DDIR),A1,W
SLL 5,A1
ADDI TURNTAB,A1
MOVE *A1,A1,L ;GET THE CORRECT TABLE TO SELECT FROM
MOVE A11,A2
SLL 3,A2
ADD A1,A2
MOVB *A2,A0
JRNN DINOTANI ;JUST DO THE TURN
NOT A0
JRNZ DINOTURNX ;BR = TABLE LOOKUP ERROR
MOVE *A13(DDIR),A1,W ;FUCKIN' ABOUT FACE, MAN!
SLL 1,A1
ADDI ABOUTUL,A1
CALLA RANDOM ;TURN IN A RANDOM DIRECTION
SRL 1,A0
JRNC DINOABOUT0
ADDK 1,A1
DINOABOUT0
MOVE A1,A0
DINOTANI
CALLR DINOLOAD ;LOAD THE CORRECT ANIMATION
****DINOTANIS
**** CALLA FRAMSKIP ;SKIP LOOK AROUND, JUST TURN
**** JRNC DINOTANIS ;BR = WE MUST SKIP TO THE END
CALLR SKIP_ANIMATION
**** MOVE A11,*A13(DDIR),W ;LET'S SEE WHAT HAPPENS
MOVK 1,A1
JSRP DINO_FRANIM ;AND ANIMATE IT
MOVE A11,*A13(DDIR),W
DINOTURNX
RETP
*
*TURN TABLE, SELECT CORRECT TABLE BASED ON CURRENT DIRECTION
TURNTAB
.LONG FROMUP,FROMDN,FROMLF,FROMRT
*
*DINOLOAD INDEX TABLES
* 0FEH = DO NOTHING, SAME DIRECTION
* 0FFH = ABOUT FACE
FROMUP .BYTE 0FEH,0FFH,TURNLU,TURNRU
FROMDN .BYTE 0FFH,0FEH,TURNLD,TURNRD
FROMLF .BYTE TURNUL,TURNDL,0FEH,0FFH
FROMRT .BYTE TURNUR,TURNDR,0FFH,0FEH
.EVEN
*
*DIRECTIONS TO ABOUT FACE FROM A GIVEN DIRECTION
ABOUT_TAB
.WORD RIGHT,LEFT
.WORD LEFT,RIGHT
.WORD UP,DOWN
.WORD DOWN,UP
**************************************************************************
* *
* DINOHHIT - DINO HIT A HORIZONTAL BAR *
* A0 = PTR TO DINOSAUR *
* A8 = PTR TO BAR *
* *
**************************************************************************
DINOHHIT:
PUSH A1
CALLR BUMP ;BASHES A1
BTST 1,A1
JREQ DINOHITX ;DIDN'T DO IT
JRUC DDEFLECT
**************************************************************************
* *
* DINOVHIT - DINO HIT A VERTICAL BAR *
* A0 = PTR TO DINOSAUR *
* A8 = PTR TO BAR *
* *
**************************************************************************
DINOVHIT:
PUSH A1
CALLR BUMP ;BASHES A1
BTST 0,A1
JREQ DINOHITX ;NOT A VALID COLLISION
*ENTRY POINT TO DEFLECT THE DINOSUAR
DDEFLECT:
CALLR IS_DINO_DEAD_A0
JRZ DINOHITX
MMTM SP,A0,A4,A3,A7,A8,A9
MOVE *A0(OPLINK),A4,L
JRZ DINOHIT_BAIL ;BR = NO PROCESS. BUM!
MOVB *A4(DTREXFLG),A3
JREQ DINOHIT_NORM
MOVE *A4(TCURMPOS),A3,L
MOVE A0,A9
CALLA FINDCMOVE
JRC DINOHIT_NTREX
ORIM M_NOCOLL,*A9(OFLAGS),W
JRUC DINOHIT_BAIL
DINOHIT_NTREX
MOVE A9,A0
DINOHIT_NORM
MOVE A8,A9 ;PASS WALL OBJECT
MOVE A0,A8 ;PASS THE DINOSAUR
MOVE A4,A0 ;PUT PROCESS PTR HERE FOR XFERPROC
MOVI DINODEFL,A7
CALLA XFERPROC_ID ;TRANSFER CONTROL OF THE PROCESS
DINOHIT_BAIL
MMFM SP,A0,A4,A3,A7,A8,A9
DINOHITX
PULL A1
DUMCRETS ;COLLISION RETURN TO CONTINUE SCAN
CLRZ
RETS
DUMSRETS
SETZ ;COLLISION RETURN TO STOP SCAN
RETS
**************************************************************************
* *
* DINODINO - DINO HIT ANOTHER DINOSAUR *
* A0 = PTR TO DINOSAUR *
* A8 = PTR TO OTHER DINOSAUR *
* *
**************************************************************************
DINODINO
MMTM SP,A1,A4,A5
CALLR IS_DINO_DEAD_A0 ;IS THIS DINO DEAD?
JRZ DINODINOX ;BR = YES
CALLR IS_DINO_DEAD_A8 ;IS THE OTHER DINO DEAD?
JRZ DINODINOX ;BR = YES
MOVE *A0(OPLINK),A4,L ;GET THIS DINOS CONTROL PROCESS
JRZ DINODINOX ;BR = NO CONTROLLING PROCESS, BAIL
MOVE *A8(OPLINK),A5,L ;GET THE OTHER DINOS CONTROL PROCESS
JRZ DINODINOX ;BR = NO CONTROL
MOVB *A5(DTREXFLG),A1 ;IS THE OTHER DINO A TYRANNO
JRNE DINODINOX ;BR = YES
MOVB *A5(DINVIN),A1 ;IS THE OTHER DINO INVINCIBLE
JRNE DINODINOX ;BR = YES, THEN DON'T FUCK WITH HIM
MOVB *A5(DDIZZYFLG),A1 ;CHECK DIZZY FLAG
JRNZ DINODINOX ;BR = HE'S A DIZ
MMTM SP,A0,A6,A7,A8,A9,A11
MOVB *A4(DTREXFLG),A1 ;IS THIS DINO A TYRANNO
JREQ DD_PUNCH_CK ;BR = NO
CALLA TROG_BUMP ;EASY BUMPER
JRZ DINODINO_BAIL
CALLR BONE_BETWEEN ;IS THERE A BONE BETWEEN THESE TWO
JRNZ DINODINO_BAIL ;BR = YES
*
*TREX SHALL JUMP UPON THE LITTLE DINO HERE
*
MOVB *A4(DPUNCHFLG),A7
JRNZ DINODINO_BAIL
CALLA PSTOP
MOVE A4,A11 ;TYRANNO PROC
MOVE A0,A9 ;TYRANNO OBJ
MOVK 2,A7
MOVB A7,*A5(DDIZZYFLG)
MOVB A7,*A4(DPUNCHFLG)
ORIM M_NOCOLL,*A8(OFLAGS),W ;MAKE SURE DINO COLLISIONS ARE OFF
MOVI DINO_STOMPED,A7
MOVE A5,A0
CALLA XFERPROC_ID ;TRANSFER THE SMASHEE
SWAP A8,A9
CALLA PSTOP
ORIM M_NOCOLL,*A8(OFLAGS),W ;MAKE SURE COLLISIONS ARE OFF
MOVE A5,A11
MOVI TREX_STOMP,A7
MOVE A4,A0
JRUC DINODINO_XFER
*
*CHECK IF THESE DINOS ARE PUNCHERS
*
DD_PUNCH_CK
MOVE A4,A1
MOVI GET_DINO_MPNT,A6
MOVI GET_DINO_MPNT,A7
CALLA PUNCHED
JRNZ DINODINO_BAIL
MOVE A0,A9
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
MOVI DINOOOF,A7
JRUC DINODINO_XFER
DINODINO_XFER
CALLA XFERPROC_ID ;TRANSFER CONTROL OF THE PROCESS
DINODINO_BAIL ;BAIL-OUT POINT FOR ERRORS
MMFM SP,A0,A6,A7,A8,A9,A11
DINODINOX
MMFM SP,A1,A4,A5
JRUC DUMCRETS
**************************************************************************
* *
* DINO_STOMPED - DINO IS TO BE STOMPED BY TREX *
* A8 = PTR TO DINO *
* A9 = PTR TO TREX OBJECT *
* A11 = PTR TO TREX PROCESS *
* A13 = PTR TO DINO PROCESS *
* *
**************************************************************************
DINO_STOMPED:
SLEEP 18
MOVE *A9(OZVAL),A0,L
DEC A0
MOVE A0,*A8(OZVAL),L ;DINO IS BEHIND TREX
MOVI SPROINGU,A0
JSRP FRANIMATE_DIR
MOVE A8,A0
CALLA SET_TZPOS ;LIE HIM FLAT
SLEEP 60
MOVI STANDU,A0
JSRP FRANIMATE_DIR
MOVE A8,A0
CALLA SET_ZPOS
JRUC DINOWXFER
**************************************************************************
* *
* DINOTAR - WALKED INTO A TAR PIT *
* A0 = PTR TO DINOSAUR *
* A8 = PTR TO TAR PIT *
* *
**************************************************************************
*
*SPECIAL ENTRY FOR BAITER TAR PIT. SKIPS THE BUMP CALL.
DINO_BAITTAR:
PUSH A1
JRUC DINOTARG
*
*THIS IS THE NORMAL ENTRY POINT
DINOTAR:
PUSH A1
CALLR BUMP ;BASHES A1
JRZ DINOTARX
DINOTARG
CALLR IS_DINO_DEAD_A0
JRZ DINOTARX
CALLA CK_OBJ_CENT
JRNC DINOTARX ;BR = HE'S STUCK IN IT
MOVE *A0(OPLINK),A1,L
JRZ DINOTARX ;BR = NO CONTROLLING PROCESS
MMTM SP,A0,A7,A8,A9
MOVB *A1(DTREXFLG),A7 ;IS THIS A TYRANNO MAN?
JRNZ DINOTAR_BAIL ;BR = YES, NO DEATHS FOR HIM
MOVB *A1(DINVIN),A7 ;IS HE INVINCIBLE?
JRNZ DINOTAR_BAIL ;BR = YES, NO DEATHS
MOVE A8,A9 ;PASS TAR OBJECT FOR YUKS
MOVE A0,A8 ;PASS THE DINOSAUR
MOVE A1,A0 ;FOR XFERPROC
MOVI DINOTAR_SINK,A7
CALLA XFERPROC_ID ;TRANSFER CONTROL OF THE PROCESS
CALLR MARK_DINO_DEAD
DINOTAR_BAIL
MMFM SP,A0,A7,A8,A9
DINOTARX
PULL A1
MOVE A0,A0 ;WITH Z BIT SET TO CONTINUE COLLISION
RETS
**************************************************************************
* *
* DINOFIRE - WALKED INTO A FIRE *
* A0 = PTR TO DINOSAUR *
* A8 = PTR TO FIRE *
* *
**************************************************************************
DINOFIRE:
PUSH A1
CALLR IS_DINO_DEAD_A0
JRZ DINOFIREX
CALLR BUMP ;BASHES A1
JRZ DINOFIREX ;BR = NO VALID COLLISIONS
CALLA CK_OBJ_CENT
JRNC DINOFIREX ;BR = HE'S SAFE
MOVE *A0(OPLINK),A1,L
JRZ DINOFIREX ;BR = NO CONTROLLING PROCESS
MMTM SP,A0,A7,A8,A9
MOVB *A1(DTREXFLG),A7 ;TYRANNO?
JRZ DINOFIRE_B ;BR = NO, JUST BURN
MOVE A8,A9 ;PASS FIRE OBJECT
MOVE A0,A8 ;PASS THE DINOSAUR
CREATE INDPID,WHLFIRE_EXT ;STOMP OUT THE FIRE
JRUC DINOFIRE_BAIL
DINOFIRE_B
MOVB *A1(DINVIN),A7 ;IS HE INVINCIBLE?
JRNZ DINOFIRE_BAIL ;BR = YES, NO DEATHS
MOVE A8,A9 ;PASS FIRE OBJECT FOR YUKS
MOVE A0,A8 ;PASS THE DINOSAUR
MOVI DINOFIRE_BURN,A7
MOVE A1,A0 ;FOR XFERPROC
CALLA XFERPROC_ID ;TRANSFER CONTROL OF THE PROCESS
CALLR MARK_DINO_DEAD
DINOFIRE_BAIL
MMFM SP,A0,A7,A8,A9
DINOFIREX:
PULL A1
MOVE A0,A0 ;WITH Z BIT SET TO CONTINUE COLLISION
RETS
**************************************************************************
* *
* DINOPIT - WALKED INTO A LOCAL PIT. *
* A0 = PTR TO DINOSAUR *
* A8 = PTR TO PIT *
* *
**************************************************************************
DINOPIT:
PUSH A1
CALLR IS_DINO_DEAD_A0
JRZ DINOPITX
CALLR BUMP ;BASHES A1
JRZ DINOPITX
CALLR CK_PIT_CENT ;CHECK IF WE'RE NEAR THE PIT CENTER
JRNC DINOPITX ;BR = HE'S SAFE
MOVE *A0(OPLINK),A1,L
JRZ DINOPITX ;BR = NO CONTROLLING PROCESS
MMTM SP,A0,A7,A8,A9
MOVB *A1(DTREXFLG),A7 ;IS HE QUITE LARGE?
JRNZ DINOPIT_BAIL ;BR = YES, THEN NO DEATH
MOVB *A1(DINVIN),A7 ;IS HE INVINCIBLE?
JRNZ DINOPIT_BAIL ;BR = YES, NO DEATHS
MOVE A8,A9 ;PASS PIT OBJECT
MOVE A0,A8 ;PASS THE DINOSAUR
MOVE A1,A0 ;FOR XFERPROC
MOVI DINOPIT_FALL,A7
CALLA XFERPROC_ID ;TRANSFER CONTROL OF THE PROCESS
CALLR MARK_DINO_DEAD
DINOPIT_BAIL
MMFM SP,A0,A7,A8,A9
DINOPITX:
PULL A1
MOVE A0,A0 ;WITH Z BIT SET TO CONTINUE COLLISION
RETS
**************************************************************************
* *
* DINOTUNNEL - WALKED INTO A TUNNEL. *
* A0 = PTR TO DINOSAUR *
* A8 = PTR TO TUNNEL *
* *
**************************************************************************
DINOTUNNEL:
PUSH A1
MOVE @CURPLYRS,A1,W
JRZ DINOTUNNEL_X
CALLR IS_DINO_DEAD_A0
JRZ DINOTUNNEL_X
CALLR BUMP ;BASHES A1
JRZ DINOTUNNEL_X
CALLR CK_PIT_CENT ;CHECK IF WE'RE NEAR THE PIT CENTER
JRNC DINOTUNNEL_X ;BR = HE'S SAFE
MOVE *A0(OPLINK),A1,L
JRZ DINOTUNNEL_X ;BR = NO CONTROLLING PROCESS
MMTM SP,A0,A7,A8,A9
MOVE A8,A9 ;PASS TUNNEL OBJECT
MOVE A0,A8 ;PASS THE DINOSAUR
MOVE A1,A0 ;FOR XFERPROC
MOVI INDPID,A1
MOVI TIME_WARP,A7
CALLA XFERPROC ;TRANSFER CONTROL OF THE PROCESS
CALLR MARK_DINO_DEAD
MMFM SP,A0,A7,A8,A9
DINOTUNNEL_X:
PULL A1
MOVE A0,A0 ;WITH Z BIT SET TO CONTINUE COLLISION
RETS
**************************************************************************
* *
* DINOFLOWER - DINOSAUR COLLIDES WITH FLOWER *
* A0 = PTR TO DINOSAUR *
* A8 = PTR TO FLOWER *
* *
**************************************************************************
DINOFLOWER:
MMTM SP,A0,A1,A2,A3,A7,A8,A10,A11
MOVI PSPEEDPID,A1
MOVI DINO_SPEEDUP,A7
JRUC DINO_PLANT_HIT
**************************************************************************
* *
* DINOSHROOM - DINOSAUR COLLIDES WITH MUSHROOM *
* A0 = PTR TO DINOSAUR *
* A8 = PTR TO FLOWER *
* *
**************************************************************************
DINOSHROOM:
MMTM SP,A0,A1,A2,A3,A7,A8,A10,A11
MOVI PSPEEDPID,A1
MOVI DINO_SLOWDOWN,A7
JRUC DINO_PLANT_HIT
**************************************************************************
* *
* DINOPAPPLE - DINOSAUR COLLIDES WITH THE POWER PINEAPPLE. *
* A0 = PTR TO DINOSAUR *
* A8 = PTR TO PINEAPPLE *
* *
**************************************************************************
DINOPAPPLE
MMTM SP,A0,A1,A2,A3,A7,A8,A10,A11
MOVI PTREXPID,A1
MOVI DINOXFORM,A7
JRUC DINO_PLANT_HIT
**************************************************************************
* *
* DINOHSHOE - DINOSAUR COLLIDES WITH THE "LUCKY" HORSESHOE. *
* A0 = PTR TO DINOSAUR *
* A8 = PTR TO HORSESHOE *
* *
**************************************************************************
DINOHSHOE
MMTM SP,A0,A1,A2,A3,A7,A8,A10,A11
MOVI INDPID,A1
MOVI CAN_INV,A7
JRUC DINO_PLANT_HIT
**************************************************************************
* *
* DINOICE - DINOSAUR COLLIDES WITH THE ICE CUBE. *
* A0 = PTR TO DINOSAUR *
* A8 = PTR TO ICE CUBE *
* *
**************************************************************************
DINOICE
MMTM SP,A0,A1,A2,A3,A7,A8,A10,A11
MOVI INDPID,A1
MOVI FREEZE_EM,A7
JRUC DINO_PLANT_HIT
**************************************************************************
* *
* DINOCHILI - DINOSAUR COLLIDES WITH THE CHILI PEPPER. *
* A0 = PTR TO DINOSAUR *
* A8 = PTR TO CHILI PEPPER *
* *
**************************************************************************
DINOCHILI
MMTM SP,A0,A1,A2,A3,A7,A8,A10,A11
MOVI PFIREPID,A1
MOVI SPIT_FIRE,A7
JRUC DINO_PLANT_HIT
*
*ENTRY FOR STUPID "ENEMY" THINGS
* A1 = PLAYER PROCID SUB-TYPE
* A7 = PROCESS TO CREATE FOR DINO
* A0 = DINO
* A8 = THING
*NOTE: A14 IS TRASHED
DINO_PLANT_HIT:
CALLR CK_PIT_CENT
JRNC DINO_PH_FL ;BR = DIDN'T CENTER UP ON THE PLANT
MOVE *A0(OPLINK),A10,L ;GET THE DINOSAURS CONTROL
JRZ DINO_PH_FL ;THE DINO IS OUT OF CONTROL
CALLR IS_DINO_DEAD_A0
JRZ DINO_PH_FL
MOVE A8,A11
MOVE A0,A8
MOVE *A10(DPLAYER),A2,L
MOVE *A2(PPID),A3,W
OR A3,A1 ;FORM PROCID UNIQUE TO THIS PLAYER
CALLA GETPRC ;AND CREATE THE PROCESS
;SEND: A8 = DINOSAUR PTR
; A10 = PTR TO DINOSAUR PROCESS
MOVI 775H,A1
CALLA SCORE
MOVE A11,A8
CALLA FREE_MOVE_EGG
MOVE *A8(OPLINK),A0,L
JRZ DP_DEL
MOVI PLANT_STALL,A7
CALLA XFERPROC_ID
DP_DEL
MOVI ENEMIES,A1
CALLA DELETE_OBJ_SUPP
SETZ ;END THIS SCAN PLEASE
JRUC DINO_PH_X
DINO_PH_FL
CLRZ
DINO_PH_X
MMFM SP,A0,A1,A2,A3,A7,A8,A10,A11
RETS
*
*PLANT_STALL - JUST MAKE THE PLANT PROC HANG HERE FOR SOMETIME.
*
PLANT_STALL
MOVI 5*60,B0
MOVI 8*60,B1
CALLA RANGRAND
SLEEPR A0
DIE
**************************************************************************
* *
* DINO_SPEEDUP - PROCESS TO SPEED UP THE DINOSAUR FOR A WHILE *
* A8 = PTR TO DINOSAUR *
* *
**************************************************************************
DINO_SPEEDUP
MOVE *A13(PROCID),A0,W
CLR A1
NOT A1
CALLA KILALLA8 ;KILL THIS DINOS PROCS
MOVE *A8(OPLINK),A10,L
JRZ DINO_SU_X
MOVB *A10(DTREXFLG),A0
JREQ DINO_SNS
MOVI REXGROWL_SND,A0
JRUC DINO_SS
DINO_SNS
MOVI DINOSPEED_SND,A0
DINO_SS
CALLA ONESND
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(DVEL),A0,L
MOVI 4000H,A0
CALLA DINO_ADD_VEL
MOVE A11,A13 ;RETRIEVE CURPROC FOR SLEEP
SLEEP 12*60
CLR A0
MOVB A0,*A10(DVNFLAG) ;VELOCITY TO NORMAL
DINO_SU_X
DIE
**************************************************************************
* *
* DINO_SLOWDOWN - PROCESS TO SLOW DOWN THE DINOSAUR FOR A WHILE *
* A8 = PTR TO DINOSAUR *
* *
**************************************************************************
DINO_SLOWDOWN:
MOVE *A13(PROCID),A0,W
CLR A1
NOT A1
CALLA KILALLA8
MOVE *A8(OPLINK),A10,L
JRZ DINO_SD_X
MOVB *A10(DTREXFLG),A0
JREQ DINO_SDNS
MOVI REXGROWL_SND,A0
JRUC DINO_SDS
DINO_SDNS
MOVI DINOSHROOM_SND,A0
DINO_SDS
CALLA ONESND
MOVE A13,A11 ;SAVE CURPROC POINTER
MOVE A10,A13 ;PASS DINO DATA STRUCTURE
MOVK 1,A0
MOVB A0,*A13(DVNFLAG) ;I AM MASTER
MOVI -4000H,A0
CALLA DINO_ADD_VEL
MOVE A11,A13 ;RETRIEVE CURPROC FOR SLEEP
SLEEP 5*60
CLR A0
MOVB A0,*A10(DVNFLAG)
DINO_SD_X:
DIE
**************************************************************************
* *
* CAN_INV - TURN THIS DINOSAUR INVINCIBLE FOR A CANNED AMOUNT OF TIME. *
* A8 = PTR TO DINOSAUR *
* *
**************************************************************************
CAN_INV
MOVE *A8(OPLINK),A11,L
JRZ CAN_INVX
**** MOVI 280,A10
MOVE @POWERUP_DURATION,A10,W
SRL 2,A10
ADDI 50,A10
SWAP A11,A13
CALLR START_INVINCIBILITY
SWAP A11,A13
SOUND1 HSHOE_SND
CAN_INVX
DIE
**************************************************************************
* *
* BUMP - CHECK TO SEE IF THE OBJECT IN A0 BUMPED INTO THE OBJECT IN A8. *
* A0 = OBJECT TO BE CHECKED *
* 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 *
* *
**************************************************************************
BUMP
PUSH A2
CLR A1
MOVE *A0(OXVEL),A2,L
JRZ BUMPCKY ;NOT MOVING IN X, NO BUMP
CALLA WHICHSID
CALLR BUMPCK
JRZ BUMPCKY
MOVE *A8(OXVEL),A2,L
JRZ BUMPA8XY
NOTC ;LEFT/RIGHT SWAP
CALLR BUMPCK
JRNZ BUMPEDINX ;HE BUMPED WHILE MOVING IN X
JRUC BUMPCKY ;HE'S FREE TO ROAM
BUMPA8XY
MOVE *A8(OYVEL),A2,L
JRZ BUMPEDINX ;NO DOUBT ABOUT IT, HE BUMPED IT
CALLA ABOVBELO
NOTC ;ABOVE/BELOW SWAP
CALLR BUMPCK
JRZ BUMPCKY
BUMPEDINX
CALLR VALIDHITX
JRNC BUMPCKY ;BR = THEY WERE NOT ON THE SAME PATH
BSET 0,A1 ;SHOW THE X BUMP
BUMPCKY
MOVE *A0(OYVEL),A2,L
JRZ BUMPX
CALLA ABOVBELO ;ABOVE OR BELOW THE OBJECT
CALLR BUMPCK
JRZ BUMPX
MOVE *A8(OYVEL),A2,L
JRZ BUMPA8YX
NOTC ;ABOVE/BELOW SWAP
CALLR BUMPCK
JRNZ BUMPEDINY ;HE BUMPED WHILE MOVING IN Y
JRUC BUMPX ;HE'S FREE TO ROAM
BUMPA8YX
MOVE *A8(OXVEL),A2,L
JRZ BUMPEDINY ;NO DOUBT ABOUT IT, HE BUMPED IT
CALLA WHICHSID
NOTC ;LEFT/RIGHT SWAP
CALLR BUMPCK
JRZ BUMPX
BUMPEDINY
CALLR VALIDHITY
JRNC BUMPX ;BR = THEY WERE NOT ON THE SAME PATH
BSET 1,A1
BUMPX
MOVE A1,A1 ;SET THE STATUS REGISTER
PULL A2
RETS
**************************************************************************
* *
* BUMPCK - DETERMINE WHETHER OR NOT THE GIVEN VALUES COULD POSSIBLY *
* CONSTITUTE A VALID BUMP BASED ON THE FOLLOWING TABLES: *
* X+ X- Y+ Y- *
* ---------- ---------- *
* LEFT | 1 0 | ABOVE | 1 0 | *
* RIGHT | 0 1 | BELOW | 0 1 | *
* ---------- ---------- *
* A2 = VELOCITY (32) *
* C = AS RETURNED FROM "WHICHSID" OR "ABOVBELO" *
* RETURNS: *
* Z = FALSE *
* NZ = TRUE *
* C = UNCHANGED *
* NOTE: A14 IS NOT GUARANTEED TO RETURN *
* *
**************************************************************************
BUMPCK
MOVE A2,A2 ;SET N,Z,V
JRC BUMPRORB ;THIS IS A RIGHT OR BELOW CASE
JRNN BUMPCKX ;1 IF HE'S MOVING RIGHT, 0 IF STOPPED
SETZ ;RETURN FALSE
JRUC BUMPCKX
BUMPRORB
JRN BUMPCKX ;TRUE IF HE'S MOVING
SETZ ;OTHERWISE FALSE
BUMPCKX
RETS
**************************************************************************
* *
* VALIDHITX - CHECK TWO COLLIDED OBJECTS TO MAKE SURE THEY ARE ON THE *
* SAME X PATH. *
* A0 = OBJECT THAT HIT *
* A8 = OBJECT THAT WAS HIT *
* RETURNS: *
* C = VALID HIT *
* NC = NOT VALID *
* *
**************************************************************************
VALIDHITX
MMTM SP,A1,A2,A3,A8
CALLA GETCPNT ;GET OBJECTS CENTER POINT
MOVY A1,A2
SRL 16,A2
MOVE A2,A3
MOVE @BOXDIM+16,A1,W ;GET THE TYPICAL Y OF A BOX
SRA 1,A1
SUB A1,A2
ADD A1,A3
MOVE A0,A8
CALLA GETCPNT
SRL 16,A1
CALLA CHKRANGE ;CENTER Y WITHIN BAR?
MMFM SP,A1,A2,A3,A8
RETS
**************************************************************************
* *
* VALIDHITY - CHECK TWO COLLIDED OBJECTS TO MAKE SURE THEY ARE ON THE *
* SAME Y PATH. *
* A0 = OBJECT THAT HIT *
* A8 = OBJECT THAT WAS HIT *
* RETURNS: *
* C = VALID HIT *
* NC = NOT VALID *
* *
**************************************************************************
VALIDHITY
MMTM SP,A1,A2,A3,A8
CALLA GETCPNT ;GET CENTER POINT OF THE THING HIT
CLR A2
MOVX A1,A2
MOVE A2,A3
MOVE @BOXDIM,A1,W ;GET THE TYPICAL X OF A BOX
SRA 1,A1
SUB A1,A2
ADD A1,A3
MOVE A0,A8
CALLA GETCPNT
ZEXT A1
CALLA CHKRANGE ;CENTER X WITHIN BAR?
MMFM SP,A1,A2,A3,A8
RETS
**************************************************************************
* *
* BONE_BETWEEN - DETERMINE IF THERE IS A BONE BETWEEN TWO DUDES. *
* A0 = PTR TO ONE DUDES OBJECT *
* A4 = PTR TO HIS PROCESS *
* A5 = PTR TO OTHER DUDES PROCESS *
* A8 = PTR TO OTHER DUDES OBJECT *
* RETURNS: *
* Z = NO BONES BETWEEN *
* NZ = BONE *
* NOTE: TRASHES A14 *
* *
**************************************************************************
BONE_BETWEEN
MMTM SP,A0,A1,A3,A6,A7,A8
MOVE A0,A7
CALLA GETCPNT ;GET ONE CENTER
CALLA FIND_CLOSE_CPNT
MOVE A3,A6
MOVE A7,A8
MOVE A0,A7
CALLA GETCPNT ;GET THE OTHER
CALLA FIND_CLOSE_CPNT
CMPXY A3,A6
JRYEQ BONE_BETWEEN_LR ;BR = SAME Y LINE CHECK LEFT OR RIGHT
JRXNE BONE_BETWEEN_NO ;BR = WIERD POINT, TEST NEGATIVE
JRYGT BONE_BETWEEN_DOWN
MOVI UP,A1
JRUC BONE_BETWEEN_TEST
BONE_BETWEEN_DOWN
MOVK DOWN,A1
JRUC BONE_BETWEEN_TEST
BONE_BETWEEN_LR
JRXEQ BONE_BETWEEN_NO ;BR = SAME POINT
JRXGT BONE_BETWEEN_RIGHT
MOVK LEFT,A1
JRUC BONE_BETWEEN_TEST
BONE_BETWEEN_RIGHT
MOVK RIGHT,A1
BONE_BETWEEN_TEST
MOVE *A0(CMOVEMPTR),A0,L ;GET THE MOVE PTR FOR THIS GUY
CALLA ONE_MOVE ;GET ONE MOVE AWAY
MOVB *A1(MOVEPLYR),A1 ;IS THERE A BONE HERE
JRN BONE_BETWEEN_NO ;BR = NO
**** JRUC BONE_BETWEEN_YES
BONE_BETWEEN_YES
CLRZ
JRUC BONE_BETWEEN_X
BONE_BETWEEN_NO
SETZ
BONE_BETWEEN_X
MMFM SP,A0,A1,A3,A6,A7,A8
RETS
**************************************************************************
* *
* DINODEFL - DINOSAUR BAR DEFLECT PROCESS. *
* A8 = PTR TO DINOSAUR OBJECT *
* A9 = PTR TO BAR OBJECT *
* A13 = PTR TO DINOSAUR PROCESS DATA STRUCTURE *
* NOTE: THIS PROCESS TRANSFERS TO DINOWXFER *
* *
**************************************************************************
DINODEFL
MOVE *A13(DATABLE),A10,L ;FIRST WE NEED THE ANIMATION TABLE
MOVE *A13(DDIR),A0,W ;AND THEN WE NEED THE DIRECTION
ADDK STANDU,A0
CALLR DINOLOAD
MOVK 4,A1
JSRP FRANIM ;LOAD THE STANDING FRAME
CALLR DINO_NEW_MOVE ;CHECK FOR A NEW MOVE
CALLA BONED_IN_GREY
JRNZ DD_NO_BLOCK
*JUST IN CASE DINO BOY IS STUCK IN FOUR GREY BONES?
MOVE A0,A5 ;SAVE CURRENT MOVE POINT
MOVE A0,A1
MOVE *A13(DDIR),A0,W ;AND THEN WE NEED THE DIRECTION
CALLA TWO_MOVES
JRNZ DD_NEW_MOVE
*CASE, NEXT TWO MOVES IN DINO DIRECTION ARE NON-EXISTANT
* JUST LOOK FOR A GOOD ONE
CLR A0 ;MOVK UP,A0
DD_NEXT_SRCH
MOVE A5,A1
CALLA TWO_MOVES
JRNZ DD_NEW_MOVE
INC A0
CMPI RIGHT,A0
JRLS DD_NEXT_SRCH
JRUC DD_NO_BLOCK ;FAILURE ALL THE WAVE
*A1 = NEW MOVE POINT, TWO AWAY
DD_NEW_MOVE
MOVE *A1(MOVEPOS),A1,L
CALLR DINO_NEW_PNT ;ALIGN THE DINO
CALLR DINO_NEW_MOVE ;AND DO THE HONORS
DD_NO_BLOCK
MOVE A13,A12
ADDI PRCSIZ,A12 ;RESET PROCESS STACK POINTER
JRUC DINOWLP ;AND STOP HIM
**************************************************************************
* *
* DINOCHOOSE - CHOOSE WHICH WAY TO TURN OUT OF THREE GIVEN DIRECTIONS. *
* A0 = PTR TO MOVE THAT THE DINOSAUR IS CURRENTLY ON. *
* A5 = ABOUT FACE *
* A6 = ADJACENT DIRECTION 1 *
* A7 = ADJACENT DIRECTION 2 *
* A8 = PTR TO DINOSAUR *
* *A13(DDIR),W = CURRENT DINOSAUR DIRECTION. *
* RETURNS: *
* A11 = CHOSEN DIRECTION *
* *
**************************************************************************
DINOCHOOSE
PUSH A0
JRUC DINOCHOOSE_G
*
*DINOCHOOSE_CENT - ENTRYPOINT WITH PTR TO CENTER POINT IN A0
DINOCHOOSE_CENT
PUSH A0
MOVE *A0(CMOVEMPTR),A0,L ;GET THE CORRESPONDING MOVE POINTER
DINOCHOOSE_G
MMTM SP,A1,A2,A3,A4,A5,A6,A7,A9,A10
MOVE A0,A1
MOVE A0,A10
MOVE A5,A2
MOVE A6,A3
MOVE A7,A4
MOVE A6,A0
CALLR DINO_SEARCH_SAFE
MOVE A7,A0
MOVE A5,A7
MOVE A6,A9
CALLR DINO_SEARCH_SAFE
*ADD THIS CODE TO ADD THE DIFFICULTY OF A STUPID DINO
**** MOVE *A8(OPLINK),A0,L ;GET THE PROCESS LINK
**** JRZ DINOCHOOSE_EASY ;BR = NO CONTROL, CHOOSE EASY
**** MOVE *A0(DPLAYER),A0,L ;GET THE PLAYER PTR
**** JRZ DINOCHOOSE_EASY ;BR = NOT A PLAYER
**** MOVE *A0(PCONSECUTIVE),A1,W ;WE'LL NEED THIS A FEW TIMES
**** MOVE *A0(PBOZO),A0,W ;IS HE A BOZO
**** JRNZ DINOCHOOSE_EASY ;BR = YES
**** MOVE @START_BONE,A0,W
**** CMP A0,A1
**** JRGE DINOCHOOSE_HARD
**** MOVE @STOP_SEARCH,A0,W
**** CMP A0,A1
**** JRGE DINOCHTOSS
*
*CHOOSE THE EASIEST WAY
DINOCHOOSE_EASY
CMPI EGG_RATING,A6 ;IS THERE AT LEAST AN EGG IN SIGHT?
JRHS DINOC_EASY_CMP ;BR = YES
CMPI EGG_RATING,A9 ;HOW ABOUT THIS DIRECTION?
JRHS DINOC_EASY_CMP ;BR = YES
*GRAB THE THE BEST DIRECTION TO THE NEXT EGG OR HOUSE
CALLA DINO_FIND_CLOSEST ;GET THE CLOSEST EGG OR HOUSE
JRZ DINOC_EASY_CMP
MOVE A10,A0 ;RESTORE CURRENT MOVE POINTER
MOVE A4,A10 ;SAVE CHOOSE1
MOVE A1,A4 ;PASS OBJECT TO GET_BEST
CALLA GET_BEST_DIRECTION ;FIND THE WAY TO THE EGG OR HOUSE
JRZ DINOC_EASY_DIR ;BR = CAN'T GO THAT WAY
MOVE A10,A4
CMP A1,A3 ;IS THE BEST, AN ADJACENT?
JREQ DINOCH0 ;YES, CHOOSE IT
CMP A1,A4 ;HOW A BOUT THE OTHER ADJACENT
JREQ DINOCH1 ;YES, CHOOSE IT
DINOC_EASY_DIR
MOVE A10,A4
DINOC_EASY_CMP
CMP A6,A9 ;COMPARE RATINGS
JRLT DINOCH1
JRNE DINOCH0
CMP A5,A7
JRLT DINOCH1
JRNE DINOCH0
JRUC DINOCHTOSS
*
*CHOOSE THE HARDEST WAY
DINOCHOOSE_HARD
CMP A6,A9 ;COMPARE RATINGS
JRLT DINOCH0
JRNE DINOCH1
CMP A5,A7
JRLT DINOCH0
JRNE DINOCH1
*
*BOTH ARE EQUAL, TOSS A COIN
DINOCHTOSS
CALLA RANDOM
SLL 1,A0
JRC DINOCH1
DINOCH0
MOVE A3,A11
JRUC DINOCHX
DINOCH1
MOVE A4,A11
DINOCHX
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A9,A10
RETS
**************************************************************************
* *
* DINOPUNCH - TRANSFER THE DINOSAUR PROCESS HERE WHEN YOU WISH TO PUNCH. *
* A8 = PTR TO DINO OBJECT *
* A13 = PTR TO DINO PROCESS *
* RETURN ADDRESS OF DINO PROCESS SHOULD BE PUSHED ON THE PROCESS STACK *
* *
**************************************************************************
DINOPUNCH
MOVE *A8(OIMG),A1,L
MOVE *A8(OXVEL),A2,L
MOVE *A8(OYVEL),A3,L
MOVE *A8(OZVEL),A4,L
MMTM A12,A1,A2,A3,A4,A9 ;SAVE MOST VITAL INFO
MOVE *A13(DDIR),A11,W
CALLR DINO_STICK
JRC DP_DOIT
JRZ DP_DOIT
MOVE A6,A11
MOVE A11,*A13(DDIR),W
MOVK 1,A0
JRUC DP_DIR_CHANGED
DP_DOIT
CLR A0
DP_DIR_CHANGED
PUSHP A0
MOVI PUNCHU,A0
CALLA LOAD_DIR
CALLA RANDOM
JRN DP_RIGHTHOOK
CALLA SKIP_ANIMATION
DP_RIGHTHOOK
MOVK 1,A1
JSRP FRANIM
MOVK 2,A1
MOVB A1,*A13(DPUNCHFLG)
SLEEP 4 ;ALLOW OTHERS TO INTERACT
CLR A1
MOVB A1,*A13(DPUNCHFLG)
PULLP A0
MOVE A0,A0
JRZ DP_NO_CHANGE
MMFM A12,A1,A2,A3,A4,A9
MOVE *A13(DWALKFRM),A0,L
CMP A0,A9
JRNE DP_NOT_WALKING
CALLR DINO_WALK_LOAD
PULLP A0
JRUC DP_JUMP
DP_NOT_WALKING
PULLP A0
JRUC DP_RESTUFF_VEL
DP_NO_CHANGE
MMFM A12,A0,A1,A2,A3,A4,A9
DP_RESTUFF_VEL
MOVE A2,*A8(OXVEL),L
MOVE A3,*A8(OYVEL),L
MOVE A4,*A8(OZVEL),L
MOVE *A8(OFLAGS),A4,W
CALLA ANI ;RESTORE OLD FRAME
DP_JUMP
JUMP A0 ;AND JUMP BACK TO OLD CODE
**************************************************************************
* *
* DINOOOF - PROCESS TO MAKE DINO REACT TO PUNCH THEN FALL DOWN. *
* COMMUNCATES WITH DINOPUNCH VIA PCOMM IN THE PROCESS BLOCK *
* A8 = PTR TO DINOSAUR OBJECT *
* A9 = PTR TO PUNCHING DINOSAUR *
* A13 = PTR TO DINOSAUR PROCESS *
* NOTE: THIS PROCESS ULTIMATELY TRANSFERS TO DINOWXFER *
* *
**************************************************************************
DINOOOF:
MOVK 1,A0
MOVB A0,*A13(DDIZZYFLG)
MOVE *A13(DATABLE),A10,L ;FIRST WE NEED THE ANIMATION TABLE
MOVE *A13(DDIR),A11,W ;AND THEN WE NEED THE DIRECTION
MOVI OOFU,A0
ADD A11,A0
CALLA DINOLOAD
MOVB *A13(THITS),A0
INC A0
CMPI HITS_TO_KO,A0
JRHS DO_KNOCKOUT
MOVB A0,*A13(THITS)
SOUND1 TROGCLUB_SND
MOVK 1,A1
JSRP FRANIM ;DO A HEAD BOP
JRUC DINOWXFER
DO_KNOCKOUT
CLR A0
MOVB A0,*A13(THITS)
SOUND1 TROGHEAD_SND
**** MOVK 1,A1
**** JSRP FRANIM ;DO A HEAD BOP
MOVK 2,A0 ;MAKE HIM A DIFFERENT DIZZY
MOVB A0,*A13(DDIZZYFLG)
CALLA SEE_STARS
MOVI BUMPU,A0
JSRP FRANIMATE_DIR
JRUC DINOWXFER ;GET BACK ON YOUR FEET
**************************************************************************
* *
* DINO_TROG_CLUB - PROCESS TO MAKE DINO REACT TO A TROG CLUB THEN JUMP *
* TO THE EATING SEQUENCE. *
* COMMUNCATES WITH TROG_PUNCH VIA PCOMM IN THE PROCESS BLOCK *
* A8 = PTR TO DINOSAUR OBJECT *
* *A13(DATABLE),L = PTR TO ANIMATION TABLE *
* *A13(DDIR),W = CURRENT DINO DIRECTION *
* NOTE: THIS PROCESS ULTIMATELY TRANSFERS TO DINODEATH_XFER *
* *
**************************************************************************
DINO_TROG_CLUB
CALLR MARK_DINO_DEAD
MOVK 1,A0
MOVB A0,*A13(DDIZZYFLG)
CALLA GETCPNT
CALLA FIND_CLOSE_CPNT ;GET THE CURRENT CLOSEST C-POINT
MOVE A3,*A13(DINITPOS),L ;KEEP IN CASE WE DEFAULT AFTER PUNCH
MOVI CLUBOUTU,A0
JSRP ANIMATE_DIR
CALLA SEE_STARS
MOVK 1,A1
JSRP FRANIM ;BE DIZZY
MOVK ACK_TROG_PUNCH,A0
MOVB A0,*A13(PCOMM) ;TELL TROG WE ARE TRASHED
MOVK 1,A1
JSRP FRANIM ;AND ANIMATE THE DROP
JRUC DTOOF_COMM_WAIT
**************************************************************************
* *
* DINO_TROG_OOF - PROCESS TO MAKE DINO REACT TO A TROG PUNCH AND EAT. *
* COMMUNCATES WITH TROG_PUNCH VIA PCOMM IN THE PROCESS BLOCK *
* A8 = PTR TO DINOSAUR OBJECT *
* *A13(DATABLE),L = PTR TO ANIMATION TABLE *
* *A13(DDIR),W = CURRENT DINO DIRECTION *
* NOTE: THIS PROCESS ULTIMATELY TRANSFERS TO DINODEATH_XFER *
* *
**************************************************************************
DINO_TROG_OOF
CALLR MARK_DINO_DEAD
MOVK 1,A0
MOVB A0,*A13(DDIZZYFLG)
CALLA GETCPNT
CALLA FIND_CLOSE_CPNT ;GET THE CURRENT CLOSEST C-POINT
MOVE A3,*A13(DINITPOS),L ;KEEP IN CASE WE DEFAULT AFTER PUNCH
MOVK ACK_TROG_PUNCH,A0
MOVB A0,*A13(PCOMM) ;ACKNOWLEDGE COMMAND RECIEVED
MOVI KOU,A0
JSRP FRANIMATE_DIR
DTOOF_COMM_WAIT
MOVI 60H,A11 ;DEFAULT COUNT
DTOOF_LP
MOVB *A13(PCOMM),A1 ;CHECK THE COMMUNICATION LINE
JRNZ DTOOF_COMM
DTOOF_COMM_INV
DEC A11
JRZ DTOOF_DEFAULT ;BR = TIMEOUT ON PUNCH COMMAND
SLOOP 1,DTOOF_LP
DTOOF_COMM
MOVK ACK_TROG_PUNCH,A0
MOVB A0,*A13(PCOMM) ;ACKNOWLEDGE COMMAND RECIEVED
CMPI COMMAND_ESC,A1
JREQ DINO_TROG_ESCAPE
CMPI COMMAND_EAT,A1
JRNE DTOOF_COMM_INV
DTOOF_EAT
*NOTE: DO NOT SLEEP WHILE CREATING THE DINO SKELETON
MOVE A1,A5
CALLA GETCPNT
CALLA FIND_CLOSE_CPNT ;GET THE CLOSEST C-POINT
MOVE A3,*A13(DINITPOS),L ;WE'LL BE BACK
CLR A4
PUSHP A4 ;RETURN POINT ALREADY STUFFED
MOVE *A13(DINITTAB),A14,L
CALLA GPALOBJSTF
JRZ DTOOF_FAILED_SKEL
MOVE A13,*A0(OPLINK),L
CALLA GETANIXY
SRL 16,A3
MOVY A2,A3
MOVE A8,A10
MOVE A0,A8
PUSHP A3
MOVE *A10(OFLAGS),*A8(OFLAGS),W ;COPY FLAGS
MOVK 4,A1
JSRP FRANIM
PULLP A3
CALLA OBJ_TO_PNT
CALLA INSERT_OBJ
MOVE A8,A0
MOVE A10,A8
MOVE A0,A10
MOVE *A8(OZVAL),A1,L
DEC A1
MOVE A1,*A10(OZVAL),L
JRUC DTOOF_EAT_ACTION
DTOOF_FAILED_SKEL
CLR A10
CALLA FRAMSKIP ;SKIP THE FRAME
JRUC DTOOF_EAT_ACTION
DTOOF_EAT_COMM_WAIT
MOVI 60H,A11 ;DEFAULT COUNT
DTOOF_EAT_COMM_LP
MOVB *A13(PCOMM),A5 ;CHECK THE COMMUNICATION LINE
JRNZ DTOOF_EAT_ACTION
DTOOF_EAT_COMM_INV
DEC A11
JRZ DTOOF_EAT_DONE ;BR = TIMEOUT ON EAT COMMAND
SLOOP 1,DTOOF_EAT_COMM_LP
DTOOF_EAT_ACTION
MOVK ACK_TROG_EAT,A0
MOVB A0,*A13(PCOMM) ;ACKNOWLEDGE COMMAND RECIEVED
CMPI COMMAND_EAT_DONE,A5
JREQ DTOOF_EAT_DONE
CMPI COMMAND_ESC,A5
JREQ DINO_TROG_ESCAPE
CMPI COMMAND_EAT,A5
JRNE DTOOF_EAT_COMM_INV ;INVALID COMMAND
DTOOF_EAT_LP
MOVK 4,A1
JSRP FRANIM ;GRAB THE FIRST FRAME OF THE HEAD BOP
JRC DTOOF_EAT_OFF ;BR = 'TWAS THE END, WAIT FOR NEXT
MOVE A0,A11 ;STORE TICKS FOR LOOP
DTOOF_EAT_SLP_LP
SLEEP 1
MOVB *A13(PCOMM),A1
CMPI COMMAND_ESC,A1
JREQ DINO_TROG_ESCAPE
CMPI COMMAND_EAT,A1 ;CHECK COMMAND FOR ANOTHER BITE
JREQ DTOOF_EAT_COMM_LP ;BR = HE WANTS TO EAT MORE
DSJ A11,DTOOF_EAT_SLP_LP ;IF MORE TICKS SLEEP, IF NOT NEXT FRM
JRUC DTOOF_EAT_LP
DTOOF_EAT_OFF
MOVE *A9,A1,L ;ARE WE AT THE BITTER END?
JRNZ DTOOF_EAT_COMM_WAIT ;BR = NO, GO WAIT FOR NEXT FRAME
CALLA OBJ_OFF
JRUC DTOOF_EAT_COMM_WAIT
DTOOF_EAT_DONE
MOVE A10,A0
JRZ DTOOF_EAT_NO_SKEL
CALLA DELPAL
CALLA DELSOBJ
DTOOF_EAT_NO_SKEL
JRUC DINO_DEATH_DONE
DTOOF_DEFAULT
*
*NOTE: WORRY ABOUT DDIZZYFLG IF YOU CHANGE THE WAY DINOREV OPERATES
*
**** CLR A0
**** MOVB A0,*A13(DDIZZYFLG)
MOVE *A13(DINITPOS),A1,L
CALLR DINO_NEW_PNT
CALLR MARK_DINO_LIVE
JRUC DINOREV ;DINO REV ULTIMATELY RESETS DDIZZYFLG
*
*ESCAPE THE WRATH OF THE DREADED TROGSTER
DINO_TROG_ESCAPE
MOVE *A13(DINITPOS),A1,L
CALLR DINO_NEW_PNT ;RE-ALIGN
CALLR MARK_DINO_LIVE
JRUC DINOWXFER ;KEEP ON KEEPIN' ON
**************************************************************************
* *
* DINOBUMP - PROCESS TO MAKE DINO REACT TO HEAD-ON BUMP *
* THEN TURN AWAY FROM IT. *
* A8 = PTR TO DINOSAUR OBJECT *
* *A13(DATABLE),L = PTR TO ANIMATION TABLE *
* *A13(DDIR),W = CURRENT DINO DIRECTION *
* NOTE: THIS PROCESS TRANSFERS TO DINOWXFER *
* *
**************************************************************************
*
*SPECIAL ENTRY POINT WHEN A DINOSAUR BUMPS INTO ANOTHER DINOSAUR
*A9 = PTR TO THE OTHER DINOSAUR
****DINO_BUMP_DINO
**** MOVE *A8(OID),A1,W
**** MOVE *A9(OID),A0,W
**** CMP A1,A0
**** JREQ DINOREV ;BR = SAME TYPE OF DINOS
**** MOVI TENSION_BUMP,A1
**** CALLR BUILD_TENSION ;GET MAD AT THE GUY YOU BUMPED
**** SOUND1 DINOBUMP_SND ;CLUNK HEADS
****DINOBUMP
**** MOVK 1,A0
**** MOVB A0,*A13(DDIZZYFLG)
**** MOVI BUMPU,A0
**** JSRP ANIMATE_DIR
**** JRUC DINOREV
**************************************************************************
* *
* DINOREV - REVERSE THE DINOSAUR DIRECTION DUE TO COLLISION *
* WITH ANOTHER, USE PSTOP FIRST. *
* A8 = PTR TO DINOSAUR OBJECT *
* *A13(DATABLE),L = PTR TO ANIMATION TABLE *
* *A13(DDIR),W = CURRENT DINO DIRECTION *
* NOTE: THIS PROCESS TRANSFERS TO DINOWXFER *
* *
**************************************************************************
*
*SPECIAL ENTRY POINT WHEN A DINOSAUR REVERSES BECAUSE HE CAN'T PASS ANOTHER
*A9 = PTR TO THE OTHER DINOSAUR
****DINO_REV_DINO
**** MOVE *A8(OID),A1,W
**** MOVE *A9(OID),A0,W
**** CMP A1,A0
**** JREQ DINOREV ;BR = SAME TYPE DINOS, NO TENSION
**** MOVI TENSION_REV,A1
**** CALLR BUILD_TENSION ;GET MAD AT THE GUY YOU CAN'T PASS
DINOREV
MOVE *A13(DATABLE),A10,L ;FIRST WE NEED THE ANIMATION TABLE
MOVE *A13(DDIR),A11,W ;AND THEN WE NEED THE DIRECTION
CALLR GET_DINO_MPNT
MOVE *A0(MOVECPTR),A0,L ;IS IT A CENTER?
JRNZ DINO_REV_REV ;BR = NO
MOVE A3,A1 ;EVERYBODY! GET...IN...LINE.
CALLR DINO_NEW_PNT ;PUT THE DINO RIGHT ON THIS POINT
CMPI UP,A11
JRNE DINO_REV_T1
MOVK DOWN,A5
MOVK LEFT,A6
MOVK RIGHT,A7
JRUC DINO_REV_CHOOSE
DINO_REV_T1
CMPI DOWN,A11
JRNE DINO_REV_T2
CLR A5 ;MOVK UP,A5
MOVK RIGHT,A6
MOVK LEFT,A7
JRUC DINO_REV_CHOOSE
DINO_REV_T2
CMPI LEFT,A11
JRNE DINO_REV_T3
MOVK RIGHT,A5
MOVK DOWN,A6
CLR A7 ;MOVK UP,A7
JRUC DINO_REV_CHOOSE
DINO_REV_T3
MOVK LEFT,A5
CLR A6 ;MOVK UP,A6
MOVK DOWN,A7
DINO_REV_CHOOSE
CALLR DINOCHOOSE_CENT
JRUC DINO_REV_TURN
DINO_REV_REV
CALLR NOTDIR ;GET THE OTHER DIRECTION
DINO_REV_TURN
JSRP DINOTURN ;TURN THE DINOSAUR
JRUC DINOWXFER
**************************************************************************
* *
* DINO_PAUSE - PAUSE THE DINOSAUR FOR AN INSTANT, USE PSTOP FIRST. *
* A8 = PTR TO DINOSAUR OBJECT *
* *A13(DATABLE),L = PTR TO ANIMATION TABLE *
* *A13(DDIR),W = CURRENT DINO DIRECTION *
* NOTE: THIS PROCESS TRANSFERS TO DINOWXFER *
* *
**************************************************************************
*
*SPECIAL ENTRY POINT WHEN A DINOSAUR PAUSES BECAUSE HE CAN'T PASS ANOTHER
*A9 = PTR TO THE OTHER DINOSAUR
****DINO_PAUSE_DINO
**** MOVE *A8(OID),A1,W
**** MOVE *A9(OID),A0,W
**** CMP A1,A0
**** JREQ DINO_PAUSE ;BR = SAME TYPE DINOS, NO TENSION
**** MOVI TENSION_REV,A1
**** CALLR BUILD_TENSION ;GET MAD AT THE GUY YOU CAN'T PASS
****DINO_PAUSE
**** MOVE *A13(DATABLE),A10,L ;FIRST WE NEED THE ANIMATION TABLE
**** MOVE *A13(DDIR),A11,W ;AND THEN WE NEED THE DIRECTION
**** MOVI STANDU,A0
**** JSRP ANIMATE_DIR
**** SLEEP 10
**** JRUC DINOWXFER
**************************************************************************
* *
* DINOTAR_SINK - PROCESS TO MAKE DINO SINK INTO TAR AND DIE. *
* A8 = PTR TO DINOSAUR OBJECT *
* A9 = PTR TO TAR OBJECT *
* *A13(DATABLE),L = PTR TO ANIMATION TABLE *
* *A13(DDIR),W = CURRENT DINO DIRECTION *
* NOTE: THIS PROCESS ULTIMATELY TRANSFERS TO DINO_DEATH_DONE *
* *
**************************************************************************
DINOTAR_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
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 DINOTAR_SKC ;BR = SKIP THE CENTERING, NOT A MOVE
MOVE A1,A0
CALLR DINO_CENTER ;CENTER TO DINO ON THIS POINT
DINOTAR_SKC
MOVI TARU,A0
**** JSRP FRANIMATE_DIR ;ANIMATE THIS GUY
CALLA LOAD_DIR
JSRP ANIMATE_BUTTON
SOUND1 TARBUBBLE_SND
MOVI 08000H,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 DINO_DEATH_DONE
**************************************************************************
* *
* DINOFIRE_BURN - PROCESS TO MAKE DINO BURN IN THE FIRE. *
* A8 = PTR TO DINOSAUR 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 DINOWXFER IF NO DEATH *
* DINO_DEATH_DONE IF HE DIED. *
* *
**************************************************************************
DINOFIRE_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 DINOFIRE_SKC ;BR = SKIP THE CENTERING, NOT A MOVE
MOVE A1,A0
CALLR DINO_CENTER ;CENTER TO DINO ON THIS POINT
MOVE *A8(OYPOS),A5,W
SUBK 12,A5
MOVE A5,*A8(OYPOS),W
DINOFIRE_SKC
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
SLEEP 1
MOVI SKELU,A0 ;NO BONES ABOUT IT, YOU'RE DEAD
JSRP FRANIMATE_DIR ;ANIMATE IT
CLR A4
PUSHP A4 ;RETURN POINT ALREADY STUFFED
JRUC DINO_DEATH_DONE
**************************************************************************
* *
* DINO_SPROING - PROCESS TO GET THE DINO SQUASHED BY THE SPRING SHOES. *
* A8 = PTR TO DINOSAUR OBJECT *
* A9 = PTR TO TROG SPRING SHOE OBJECT *
* A10 = PTR TO TROG SPRING SHOE PROCESS *
* A13 = PTR TO DINO PROCESS *
* *
**************************************************************************
DINO_SPROING
MOVE *A9(OZVAL),A0,L
DEC A0
MOVE A0,*A8(OZVAL),L ;DINO IS BEHIND WHEEL
MOVE *A10(DSMULT),A4,W
MOVI SPROINGU,A0
CALLR LOAD_DIR
JRUC DINO_SQUASH_ALL
**************************************************************************
* *
* DINO_SQUASH - PROCESS TO SQUASH THE DINO WITH THE WHEEL *
* A8 = PTR TO DINOSAUR OBJECT *
* A9 = PTR TO WHEEL OBJECT *
* A10 = PTR TO WHEEL PROCESS *
* A13 = PTR TO DINO PROCESS *
* NOTE: THIS PROCESS ULTIMATELY TRANSFERS TO DINO_DEATH_DONE. *
* *
**************************************************************************
DINO_SQUASH
MOVE *A9(OZVAL),A0,L
DEC A0
MOVE A0,*A8(OZVAL),L ;DINO IS BEHIND WHEEL
MOVE *A13(DDIR),A0,W
SLL 2,A0
MOVE *A10(DDIR),A1,W
ADD A1,A0
MOVE *A10(DSMULT),A4,W
ADDI SQUISHUU,A0
MOVE *A13(DATABLE),A10,L
CALLA DINOLOAD
*A4 = CORRECT SLEEP MULTIPLIER
*A9 = ANIMATION SCRIPT
DINO_SQUASH_ALL
CALLA GET_DINO_CPNT
ADDI [5,0],A1
CALLA FIND_CLOSE_CPNT ;FIND US A RETURN POINT
MOVE A3,*A13(DINITPOS),L
MOVK 1,A1
SLL 16,A4
MOVY A4,A1 ;ANIMATE AT THE SPEED OF THE WHEEL
JSRP FRANIM
MOVE A8,A0
CALLA SET_TZPOS ;LIE HIM FLAT
**** SLEEP 80
MOVI 80,A0
MOVE *A13(DPLAYER),A2,L
JSRP SLEEP_START
MOVI [3,1],A9
JSRP OSINK ;SINK THAT PANCAKE
CLR A4
PUSHP A4 ;RETURN POINT ALREADY STUFFED
JRUC DINO_DEATH_DONE
**************************************************************************
* *
* CK_PIT_CENT - DETERMINE IF OBJECT IS NEAR THE CENTER OF A PIT. *
* A0 = OBJECT *
* A8 = PIT OBJECT *
* RETURNS: *
* NC = NOT EVEN CLOSE *
* C = CLOSE *
* *
**************************************************************************
CK_PIT_CENT
MMTM SP,A8,A1,A2,A3
CALLA GETCPNT ;CENTER POINT OF FIRST OBJECT
SUBI [7,0],A1 ;FUDGE FACTOR
MOVE A1,A3
MOVE A0,A8
CALLA GETCPNT ;AND CENTER POINT OF THE SECOND
MOVI [15,15],A2 ;FIX THE RANGE
CALLA PNT_IN_RANGE
MMFM SP,A8,A1,A2,A3
RETS
**************************************************************************
* *
* CK_DINO_CENT - DETERMINE IF DINO IS NEAR THE CENTER OF AN OBJECT. *
* A0 = OBJECT *
* A8 = DINO *
* RETURNS: *
* NC = NOT EVEN CLOSE *
* C = CLOSE *
* *
**************************************************************************
CK_DINO_CENT
MMTM SP,A1,A2,A3,A8
CALLR GET_DINO_CPNT ;CENTER POINT OF FIRST OBJECT
ADDI [5,0],A1 ;FUDGE FACTOR
MOVE A1,A3
MOVE A0,A8
CALLA GETCPNT ;AND CENTER POINT OF THE SECOND
MOVI [6,6],A2 ;FIX THE RANGE
CALLA PNT_IN_RANGE
MMFM SP,A1,A2,A3,A8
RETS
**************************************************************************
* *
* DINOPIT_FALL - PROCESS TO MAKE DINO FALL DOWN A SMALL PIT *
* A8 = PTR TO DINOSAUR OBJECT *
* A9 = PTR TO PIT OBJECT *
* *A13(DATABLE),L = PTR TO ANIMATION TABLE *
* *A13(DDIR),W = CURRENT DINO DIRECTION *
* NOTE: THIS PROCESS ULTIMATELY TRANSFERS TO DINO_DEATH_DONE. *
* *
**************************************************************************
DINOPIT_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 DINO
MOVE A1,A2
MOVI 4*25,A4
CALLA SLINEVEL
MMTM A12,A1,A2
CALLA PSTOP
MOVI OGPITU,A0
JSRP FRANIMATE_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 THE DINOSAUR OFF
MOVE A8,A5
PULLP A8 ;GET FIRE 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 DINO_DEATH_DONE
**************************************************************************
* *
* ANIMATE_DIR - ANIMATE A SCRIPT BASED ON THE DINOS CURRENT DIRECTION. *
* A0 = ANIMATION SCRIPT OFFSET *
* A8 = PTR TO DINOSAUR OBJECT *
* *A13(DATABLE),L = PTR TO ANIMATION TABLE *
* *A13(DDIR),W = CURRENT DINO DIRECTION *
* RETURNS: *
* A8 = PTR TO OBJECT *
* A9 = WORD AFTER SCRIPT *
* A10 = PTR TO ANIMATION TABLE *
* A11 = DIRECTION WHEN CALLED *
* *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
ANIMATE_DIR
MOVE *A13(DATABLE),A10,L ;FIRST WE NEED THE ANIMATION TABLE
MOVE *A13(DDIR),A11,W ;AND THEN WE NEED THE DIRECTION
ADD A11,A0
CALLA DINOLOAD
MOVK 1,A1
JRUC DINO_FRANIM
**************************************************************************
* *
* FRANIMATE_DIR - ANIMATE A SCRIPT BASED ON THE DINOS CURRENT DIRECTION. *
* JUMPS STRAIGHT TO FRANIM, BYPASSING DINO_FRANIM, THE *
* THE RESULT IS A NORMAL SPEED ANIMATION. *
* A0 = ANIMATION SCRIPT OFFSET *
* A8 = PTR TO DINOSAUR OBJECT *
* *A13(DATABLE),L = PTR TO ANIMATION TABLE *
* *A13(DDIR),W = CURRENT DINO DIRECTION *
* RETURNS: *
* A8 = PTR TO OBJECT *
* A9 = WORD AFTER SCRIPT *
* A10 = PTR TO ANIMATION TABLE *
* A11 = DIRECTION WHEN CALLED *
* *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
FRANIMATE_DIR
MOVE *A13(DATABLE),A10,L ;FIRST WE NEED THE ANIMATION TABLE
MOVE *A13(DDIR),A11,W ;AND THEN WE NEED THE DIRECTION
ADD A11,A0
CALLA DINOLOAD
MOVK 1,A1
JAUC FRANIM
**************************************************************************
* *
* LOAD_DIR - LOAD AN ANIMATION SCRIPT BASED ON THE CURRENT DIRECTION. *
* A0 = ANIMATION SCRIPT OFFSET *
* A8 = PTR TO OBJECT *
* *A13(DATABLE),L = PTR TO ANIMATION TABLE *
* *A13(DDIR),W = CURRENT DIRECTION *
* RETURNS: *
* A9 = PTR TO SCRIPT *
* *
**************************************************************************
LOAD_DIR
MMTM SP,A0,A10,A11
MOVE *A13(DATABLE),A10,L ;FIRST WE NEED THE ANIMATION TABLE
MOVE *A13(DDIR),A11,W ;AND THEN WE NEED THE DIRECTION
ADD A11,A0
CALLA DINOLOAD
MMFM SP,A0,A10,A11
RETS
**************************************************************************
* *
* NOTDIR - COMPLEMENT THE GIVEN DIRECTION. *
* (I.E. UP -> DOWN, RIGHT -> LEFT) *
* A11 = DIRECTION TO COMPLEMENT *
* RETURNS: *
* A11 = COMPLEMENT *
* *
**************************************************************************
NOTDIR
CMPI UP,A11
JRNE NOTDCD ;NOT UP, CHECK DOWN
MOVK DOWN,A11 ;UP -> DOWN
JRUC NOTDIRX
NOTDCD
CMPI DOWN,A11
JRNE NOTDCL ;NOT DOWN, CHECK LEFT
CLR A11 ;MOVK UP,A11 ;DOWN -> UP
JRUC NOTDIRX
NOTDCL
CMPI LEFT,A11
JRNE NOTDR ;NOT LEFT, MUST BE RIGHT
MOVK RIGHT,A11 ;LEFT -> RIGHT
JRUC NOTDIRX
NOTDR
MOVK LEFT,A11 ;RIGHT -> LEFT
NOTDIRX
RETS
**************************************************************************
* *
* IS_DINO_DEAD - ROUTINE TO DETERMINE IF THE GIVEN DINOSAUR OBJECT *
* IS CONSIDERED DEAD! *
* RETURNS *
* Z = DINO IS DEAD. *
* NZ = DINO IS NOT DEAD. *
* *
**************************************************************************
*
*PASS DINO OBJECT IN A8
*
IS_DINO_DEAD_A8
PUSH A1
MOVE *A8(OID),A1,W
JRUC IDD_G
*
*PASS DINO OBJECT IN A0
*
IS_DINO_DEAD_A0
PUSH A1
MOVE *A0(OID),A1,W
IDD_G
SRL 4,A1
SLL 4,A1
CMPI DEADDINOOID,A1 ;IS HE DYING?
PULL A1
RETS
**************************************************************************
* *
* MARK_DINO_LIVE - ROUTINE TO MARK THE DINOSAUR OBJECT "ALIVE." *
* A8 = PTR TO THE DINOSAUR OBJECT *
* *
**************************************************************************
MARK_DINO_LIVE
PUSH A0
MOVE *A8(OID),A0,W
SLL 28,A0
SRL 28,A0
ORI DINOOID,A0 ;MARK HIM AS DEAD, DEAD I SAY
MOVE A0,*A8(OID),W
PULL A0
RETS
**************************************************************************
* *
* MARK_DINO_DEAD - ROUTINE TO MARK THE DINOSAUR OBJECT "DEAD." *
* A8 = PTR TO THE DINOSAUR OBJECT *
* *
**************************************************************************
MARK_DINO_DEAD
PUSH A1
MOVE *A8(OID),A1,W
SLL 28,A1
SRL 28,A1
ORI DEADDINOOID,A1 ;MARK HIM AS DEAD, DEAD I SAY
MOVE A1,*A8(OID),W
PULL A1
RETS
**************************************************************************
* *
* GET_DINO_CPNT - GET THE DINOSAURS CENTER POINT, BASED ON HIS INITIAL *
* FRAME WITH RESPECT TO HIS CURRENT ANIMATION POINT. *
* A8 = PTR TO DINOSAUR OBJECT *
* RETURNS: *
* A1 = [Y,X] CENTER POINT OF DINO *
* *
**************************************************************************
GET_DINO_CPNT:
PUSH A4
MOVE *A8(OID),A4,W
SLL 28,A4
SRL 23,A4 ;GET TYPE I.D. AND MULT x 32
ADDI ALIGNTAB,A4
MOVE *A4,A4,L ;GET THE CORRECT INIT TABLE
CALLA GET_INIT_CPNT
PULL A4
RETS
**************************************************************************
* *
* GET_DINO_MPNT - FIND MOVE POINT THAT DINOSAUR IS CLOSEST TO. *
* A8 = PTR TO DINOSAUR *
* RETURNS *
* A0 = PTR TO CLOSEST MOVE POINT DATA *
* A1 = [Y,X] DINOSAUR CENTER POINT *
* A3 = [Y,X] POSITION OF CLOSEST MOVE POINT *
* *
**************************************************************************
GET_DINO_MPNT
CALLR GET_DINO_CPNT ;THIS IS HIS NEW CENTER
ADDI [5,0],A1
JAUC FIND_CLOSE_MPNT ;FIND THE CLOSEST MOVE POINT
**************************************************************************
* *
* DINO_CENTER - ALIGN THE CENTER OF THE DINOSAUR 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 DINOSAUR *
* *
**************************************************************************
DINO_CENTER:
PUSH A1
MOVE *A0(MOVEPOS),A1,L
CALLR DINO_NEW_PNT
PULL A1
RETS
**************************************************************************
* *
* DINO_NEW_PNT - ALIGN THE CENTER OF THE DINOSAUR ON A NEW PNT. *
* A1 = [Y,X] PNT TO ALIGN DINOSAUR ON *
* A8 = PTR TO DINOSAUR *
* *
**************************************************************************
DINO_NEW_PNT:
MMTM SP,A0,A1,A7
SUBI [3,0],A1 ;MOVE HIM UP
MOVE A1,A7 ;STORE ALIGNMENT POINT
CALLR GET_DINO_CPNT
MOVE A7,A0
CALLA ALIGNOBJ
MOVE A8,A0
CALLA SET_ZPOS
MMFM SP,A0,A1,A7
RETS
**************************************************************************
* *
* BUILD_TENSION - BUILD THIS DINOSAURS TENSION LEVEL TOWARDS ANOTHER *
* DINOSAUR. *
* A0 = OID OF DINOSAUR TO BUILD AGAINST *
* A1 = AMOUNT TO ADD *
* A13 = PTR PROCESS OF DINOSAUR BUILDING TENSION *
* *
**************************************************************************
****BUILD_TENSION
**** MMTM SP,A0,A2
**** CALLR GET_TENSION_AREA
**** MOVB *A0,A2
**** ADD A1,A2 ;ADD IT UP
**** SLL 24,A2 ;CHECK TO SEE IF THE BYTES GONE NEGATIVE
**** SRA 24,A2 ;BRING IT BACK DOWN IN CASE WE MUST STORE
**** JRN SKIP_BUILD ;BR = THAT PUTS US OVER
**** MOVB A2,*A0 ;AND PUT IT BACK
****SKIP_BUILD
**** MMFM SP,A0,A2
**** RETS
**************************************************************************
* *
* RELEASE_TENSION - RELEASE TENSION AGAINST ANOTHER DINOSAUR. *
* A0 = OID OF DINOSAUR TO RELEASE FROM *
* A1 = AMOUNT TO RELEASE *
* A13 = PTR PROCESS OF DINOSAUR RELEASING TENSION *
* *
**************************************************************************
****RELEASE_TENSION
**** MMTM SP,A0,A2
**** CALLR GET_TENSION_AREA
**** MOVB *A0,A2
**** SUB A1,A2 ;TAKE IT OFF
**** JRNN BUILD_T_OK ;WE DIDN'T GROUND OUT
**** CLR A2 ;DON'T GO BELOW ZERO
****BUILD_T_OK
**** MOVB A2,*A0 ;AND RESTORE
**** MMFM SP,A0,A2
**** RETS
**************************************************************************
* *
* CLEAR_TENSION - CLEAR THE TENSION BETWEEN TO DINOSAURS *
* A0 = OID OF DINOSAUR TO CLEAR TENSION AGAINST *
* A13 = PTR PROCESS OF DINOSAUR CLEARING TENSION *
* *
**************************************************************************
****CLEAR_TENSION
**** PUSH A1
**** CALLR GET_TENSION_AREA
**** CLR A1
**** MOVB A1,*A0
**** PULL A1
**** RETS
**************************************************************************
* *
* GET_TENSION - GET THE AMOUNT OF TENSION TOWARDS A DINOSAUR. *
* A0 = OID OF DINOSAUR AGAINST *
* A13 = PTR TO THIS DINOSAURS PROCESS *
* RETURNS: *
* A1 = TENSION LEVEL *
* *
**************************************************************************
****GET_TENSION
**** PUSH A0
**** CALLR GET_TENSION_AREA
**** MOVB *A0,A1 ;GET TENSE BABY
**** PULL A0
**** RETS
**************************************************************************
* *
* GET_TENSION_AREA - GET THE TENSION AREA OF A DINOSAUR AGAINST *
* ANOTHER. *
* A0 = OID OF AGAINST *
* A13 = PTR TO PROCESS OF DINOSAUR TO GET TENSION *
* RETURNS: *
* A0 = PTR TO TENSION AREA *
* *
**************************************************************************
****GET_TENSION_AREA
**** SLL 30,A0 ;ONLY HANDLE FOUR TYPES OF DINOS
**** SRL 27,A0 ;THE SIZE IS ONE BYTE PER DINO
**** ADDI DD0TENSE,A0
**** ADD A13,A0 ;OFFSET TO PROCESS TENSION AREA
**** RETS
**************************************************************************
* *
* ADD_FRUST - ADD TO THE GENERAL FRUSTRATION LEVEL OF THE DINOSAUR *
* A0 = AMOUNT TO ADD *
* A13 = PTR TO DINOSAUR PROCESS *
* RETURNS: *
* A0 = NEW FRUSTRATION LEVEL *
* *
**************************************************************************
****ADD_FRUST
**** PUSH A1
**** MOVB *A13(DFRUST),A1
**** ADD A0,A1 ;ADD THE VALUE
**** SLL 24,A1 ;CHECK TO SEE IF THE BYTES GONE NEGATIVE
**** SRA 24,A1 ;BRING IT BACK DOWN IN CASE WE MUST STORE
**** JRN SKIP_FRUST_ADD ;BR = THAT PUTS US OVER
**** MOVB A1,*A13(DFRUST)
**** MOVE A1,A0 ;RETURN HERE
**** JRUC ADD_FRUSTX
****SKIP_FRUST_ADD
**** MOVB *A13(DFRUST),A0 ;RESTORE THE OLD VALUE
****ADD_FRUSTX
**** PULL A1
**** RETS
**************************************************************************
* *
* EASE_FRUST - EASE SOME OF THE FRUSTRATIONS OF THE DINOSAUR. *
* WILL NOT ALLOW THE LEVEL TO GO NEGATIVE. *
* A0 = AMOUNT TO EASE *
* A13 = PTR TO DINOSAUR PROCESS *
* RETURNS: *
* A0 = NEW FRUSTRATION LEVEL *
* *
**************************************************************************
****EASE_FRUST
**** PUSH A1
**** MOVB *A13(DFRUST),A1
**** SUB A0,A1 ;ADD THE VALUE
**** JRNN EASE_F_OK ;BR = LEVEL HAS NOT GONE NEGATIVE
**** CLR A1 ;SURFACE
****EASE_F_OK
**** MOVB A1,*A13(DFRUST)
**** MOVE A1,A0 ;AND RETURN IT
**** PULL A1
**** RETS
**************************************************************************
* *
* ADD_TURNQ - ADD A TURN TO THE TURN QUEUE *
* A0 = DIRECTION HE WILL TURN *
* A1 = MOVE INDEX OF TURN POINT *
* A13 = PTR TO DINOSAUR PROCESS *
* RETURNS: *
* Z = TURN ALREADY EXITS IN THE QUEUE *
* NZ = TURN WAS ADDED *
* *
**************************************************************************
****ADD_TURNQ
**** MMTM SP,A2,A3,A4,A5,A6
**** MOVB *A13(DTURNQCNT),A2 ;GET THE QUEUE STUFF
**** SLL 24,A2
**** SRL 24,A2 ;RID O' SIGN
**** MOVE A2,A3
**** MOVI DTURNQ,A4 ;GET THE OFFSET HERE
**** SRL 4,A3 ;GET THE SEARCH COUNT
**** JRZ ADD_TURNQ_NOW ;BR = NO TURNS TO SEARCH
**** MOVE A13,A5
**** ADD A4,A5
****ADD_TURNQ_LP
**** MOVE *A5(DTURNQMOVE),A6,W ;CHECK PREVIOUS MOVE PNT
**** CMP A6,A1
**** JRNE ADD_TURNQ_CNT ;BR = NO MATCH HERE
**** MOVB *A5(DTURNQDIR),A6
**** CMP A6,A0
**** JREQ ADD_TURNQ_X ;WE FOUND THE MOVE, EXIT
****ADD_TURNQ_CNT
**** ADDI DTURNQSIZE,A5 ;TRY NEXT TURN
**** DSJ A3,ADD_TURNQ_LP
**** MOVE A2,A3
**** SRL 4,A3
**** CMPI NDTURNS,A3
**** JREQ ADD_TURNQ_NEXT
****ADD_TURNQ_NOW
**** INC A3 ;CLICK THE TURN COUNTER
****ADD_TURNQ_NEXT
**** SLL 4,A3 ;BACK INTO POSITION
**** SLL 28,A2
**** SRL 28,A2
**** MOVI DTURNQSIZE,A5
**** MPYU A2,A5 ;OFFSET TO NEW Q STORAGE LOCATION
**** ADD A4,A5 ;OFFSET INTO PROCESS BLOCK
**** ADD A13,A5 ;NOW OFFSET TO THE CORRECT PROCESS
**** MOVE A1,*A5(DTURNQMOVE),W ;STUFF IN THE MOVE
**** MOVB A0,*A5(DTURNQDIR) ;AND THE DIRECTION
**** CMPI NDTURNS-1,A2 ;MAX Q OFFSET?
**** JRNE ADD_TURNQ_MORE ;BR = NO
**** CLR A2 ;GO BACK TO THE BEGINNING
**** JRUC ADD_TURNQ_COMB
****ADD_TURNQ_MORE
**** INC A2
****ADD_TURNQ_COMB
**** ADD A3,A2 ;COMBINE SEARCH COUNT:INDEX, CLR Z
**** MOVB A2,*A13(DTURNQCNT)
****ADD_TURNQ_X
**** MMFM SP,A2,A3,A4,A5,A6
**** RETS
**************************************************************************
* *
* DINO_FIND_BEST - FIND THE BEST PATH FROM THE GIVEN MOVE POINT. *
* A1 = STARTING MOVE PNT DATA *
* A8 = PTR TO DINOSAUR OBJECT *
* RETURNS: *
* A2 = BEST DIRECTION *
* A3 = # OF STEPS 'TIL END *
* A4 = PATH RATING *
* *
**************************************************************************
DINO_FIND_BEST
MMTM SP,A0,A5,A6
CLR A2
CLR A3
CLR A4
CLR A0 ;MOVK UP,A0
DINO_FIND_BLP
CALLR DINO_SEARCH_SAFE
CMP A4,A6 ;HOW DOES THIS COMPARE WITH THE BEST
JRLT DINO_FIND_BSK ;BR = DOESN'T
JRGT DINO_FIND_BNEW
CMP A3,A5
JRLO DINO_FIND_BSK
DINO_FIND_BNEW
MOVE A0,A2
MOVE A5,A3
MOVE A6,A4
DINO_FIND_BSK
INC A0
CMPI RIGHT,A0
JRLS DINO_FIND_BLP
MMFM SP,A0,A5,A6
RETS
WALL_RATING .EQU 1
EGG_RATING .EQU 2
PINEAPPLE_RATING .EQU 3
HOUSE_RATING .EQU 5
**************************************************************************
* *
* DINO_SEARCH_SAFE - SEARCH A DIRECTION UNTIL WE FIND SOMETHING THAT *
* WOULD BE GOOD FOR A DINOSAUR. *
* A0 = DIRECTION TO SEARCH *
* A1 = PTR TO STARTING MOVE PNT *
* A8 = PTR TO DINOSAUR OBJECT *
* RETURNS: *
* A5 = STEPS 'TIL END *
* A6 = RATING (0=DEATH,1=WALL, >1 = SAFER) *
* *
**************************************************************************
DINO_SEARCH_SAFE
MMTM SP,A0,A1,A3,A4
MOVE *A8(OID),A4,W
SLL 28,A4
SRL 28,A4 ;ISOLATE PLAYER NUMBER
SWAP A0,A1
SLL 4,A1
ADDI MOVEREL,A1
CLR A5 ;CLEAR STEP COUNT
CLR A6 ;CLEAR RATING
DINO_SRCH_SAFLP
MOVE A0,A3
ADD A1,A0
MOVE *A0,A0,W
JRNN DINO_SRCH_MOVE ;WE HAVE NOT HIT THE END
MOVE *A3(MOVEEPTR),A0,L ;IS THIS AN EXIT POINT
JRN DINO_SRCH_X ;BR = NO, THIS IS CERTAIN DEATH
MOVB *A0(EMOVEPLYR),A3 ;IS THIS A PLAYERS SPOT?
JRN DINO_SRCH_X ;BR = NO
CMPI PXPLAYER,A3
JREQ DS_HOUSE_SPOT
CMP A4,A3 ;IS THIS MY EXIT?
JRNE DINO_SRCH_X ;BR = NO
DS_HOUSE_SPOT
MOVE *A0(EMOVEOBJ),A3,L ;IS MY HOUSE THERE?
JRZ DINO_SRCH_X ;BR = NO
ADDK HOUSE_RATING,A6 ;HOME SWEET HOME
JRUC DINO_SRCH_X
DINO_SRCH_MOVE
CALLA GETMOVE
MOVB *A0(MOVEPLYR),A3 ;DID WE HIT A WALL?
JRNN DINO_SRCH_WALL ;BR = YES
MOVE *A0(MOVECPTR),A3,L ;GRAB THE CENTER MOVE PTR
JRN DINO_SRCH_NOCMV ;BR = NOT A CENTER MOVE
MOVB *A3(CMOVEEGG),A3 ;IS THERE AN EGG ON THIS SPOT
INC A3
JREQ DINO_SRCH_NOTHING ;BR = NOTHING HERE
DEC A3
CMPI PXPLAYER,A3
JREQ DINO_SRCH_EGG
CMP A3,A4 ;IS THIS AN EGG?
JREQ DINO_SRCH_EGG ;YES, COOL
CMPI PINEAPPLEID,A3
JREQ DINO_SRCH_PINEAPPLE
CMPI TARID,A3 ;ARE WE DEALING WITH A TAR PIT HERE?
JREQ DINO_SRCH_X ;BR = YES WE ARE
CMPI FIREID,A3 ;FIRE?
JREQ DINO_SRCH_X ;BR = YES
CMPI PITID,A3 ;LOCAL PIT?
JREQ DINO_SRCH_X ;BR = YES
JRUC DINO_SRCH_NOTHING
DINO_SRCH_NOCMV
MOVE *A0(MOVEAPTR),A3,L ;GRAB THE AUXILLARY
JRN DINO_SRCH_NOTHING ;BR = NOT AN A MOVE
MOVB *A3(CMOVEEGG),A3 ;IS THERE AN EGG ON THIS SPOT
INC A3
JREQ DINO_SRCH_NOTHING ;BR = NOTHING HERE
DEC A3
CMP A3,A4 ;IS THIS AN EGG?
JRNE DINO_SRCH_NOTHING
DINO_SRCH_EGG
ADDK EGG_RATING,A6 ;RATE THIS EGG
DINO_SRCH_NOTHING
INC A5 ;INCREMENT THE STEP COUNT
JRUC DINO_SRCH_SAFLP
DINO_SRCH_PINEAPPLE
ADDK PINEAPPLE_RATING,A6
JRUC DINO_SRCH_NOTHING
DINO_SRCH_WALL
ADDK WALL_RATING,A6
JRUC DINO_SRCH_X
DINO_SRCH_X
MMFM SP,A0,A1,A3,A4
RETS
**************************************************************************
* *
* FIND_SAFEST - FIND THE SAFEST PATH FROM THE GIVEN MOVE POINT. *
* A1 = STARTING MOVE PNT DATA *
* RETURNS: *
* A2 = SAFEST DIRECTION *
* A3 = # OF STEPS 'TIL END *
* A4 = END TYPE (0 = WALL, 1 = DEATH) *
* *
**************************************************************************
FIND_SAFEST
MMTM SP,A0,A5,A6
CLR A2
CLR A3
CLR A4
CLR A0 ;MOVK UP,A0
FIND_SAFLP
CALLR SEARCH_SAFE
CMP A3,A5
JRLO FIND_SAFSK
MOVE A0,A2
MOVE A5,A3
MOVE A6,A4
FIND_SAFSK
INC A0
CMPI RIGHT,A0
JRLS FIND_SAFLP
MMFM SP,A0,A5,A6
RETS
**************************************************************************
* *
* FIND_OPEN_CPNT - FIND A RANDOM OPEN CENTER POINT. *
* RETURNS: *
* Z = NO OPEN CENTER POINTS WERE FOUND, A1 = DESTROYED *
* NZ = A1 = PTR TO OPEN SPACE *
* *
**************************************************************************
FIND_OPEN_CPNT
MMTM SP,A0,A3,A4,A6,A7
MOVE @CMOVECNT,A7,W ;GET THE NUMBER OF CENTER MOVES
JRZ FOCPX ;THERE ARE NO CENTER MOVES, whAT?
MOVK 10,A6 ;THIS MANY TRIES UNTIL FAILURE
FOCPLP
MOVE A7,A0
CALLA RANDU ;FIND A CENTER POINT
DEC A0 ;MAKE IT ZERO BASED
CALLA GETCMOVE
MOVB *A0(CMOVEEGG),A1 ;SPOT EMPTY?
INC A1
JRNE FOCPNXT ;BR = NO
MOVB *A0(CMOVETROG),A1 ;IS THE FUTURE OF THIS SPOT CLEAR?
INC A1
JRNE FOCPNXT ;BR = NO
MOVE *A0(CMOVEPOS),A3,L ;GET THE POSITION OF THIS POINT
CALLR DINO_PNT_TST
JRZ FOCPHERE
FOCPNXT
DSJ A6,FOCPLP
*RANDOM FAILURE MODE, JUST LOOK FOR THE FIRST AVAILABLE CENTER
MOVI CMOVEMAP,A0
FOCPCLP
MOVB *A0(CMOVEEGG),A1 ;SPOT EMPTY?
INC A1
JRNE FOCPCNXT ;BR = NO
MOVB *A0(CMOVETROG),A1 ;IS THE FUTURE OF THIS SPOT CLEAR?
INC A1
JRNE FOCPCNXT ;BR = NO
MOVE *A0(CMOVEPOS),A3,L ;GET THE POSITION OF THIS POINT
CALLR DINO_PNT_TST
JRZ FOCPHERE
FOCPCNXT
ADDI CMOVESIZE,A0
DSJ A7,FOCPCLP
CLR A0 ;NO OPEN SPACES, SET Z WITH THIS
FOCPHERE
MOVE A0,A1 ;SET OR CLR Z
FOCPX
MMFM SP,A0,A3,A4,A6,A7
RETS
**************************************************************************
* *
* SEARCH_SAFE - SEARCH A DIRECTION UNTIL A WALL OR DEATH IS HIT *
* A0 = DIRECTION TO SEARCH *
* A1 = PTR TO STARTING MOVE PNT *
* RETURNS: *
* A5 = # OF STEPS 'TIL END *
* A6 = END TYPE (0 = WALL, 1 = DEATH) *
* *
**************************************************************************
SEARCH_SAFE
MMTM SP,A0,A1
SWAP A0,A1
SLL 4,A1
ADDI MOVEREL,A1
CLR A5
SRCH_SAFLP
ADD A1,A0
MOVE *A0,A0,W
JRN SRCH_DEATH
CALLA GETMOVE
MOVB *A0(MOVEPLYR),A6
JRNN SRCH_WALL
MOVE *A0(MOVECPTR),A6,L ;GRAB THE CENTER MOVE PTR
JRN SRCH_NOCMV ;BR = NOT A CENTER MOVE
MOVB *A6(CMOVEEGG),A6 ;IS THERE AN EGG ON THIS SPOT
INC A6
JREQ SRCH_NOCMV ;BR = YES
DEC A6
CMPI TARID,A6 ;ARE WE DEALING WITH A TAR PIT HERE?
JREQ SRCH_DEATH ;BR = YES WE ARE
CMPI FIREID,A6 ;FIRE?
JREQ SRCH_DEATH ;BR = YES
CMPI PITID,A6 ;LOCAL PIT?
JREQ SRCH_DEATH ;BR = YES
SRCH_NOCMV
INC A5
JRUC SRCH_SAFLP
SRCH_WALL
CLR A6
MMFM SP,A0,A1
RETS
SRCH_DEATH
MOVK 1,A6
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* START_INVINCIBILITY - ROUTINE TO START THE DINO INVINCIBILITY PROCESS. *
* A8 = PTR TO THE DINOSAUR OBJECT *
* A10 = INVINCIBILITY TIME *
* A13 = PTR TO DINO PROCESS *
* NOTE: TRASHES A14 *
* *
**************************************************************************
START_INVINCIBILITY
MMTM SP,A0,A1,A7,A8,A10,A11
MOVE *A13(DINVPROC),A0,L
JRZ START_I_NONE ;BR = NONE CURRENTLY
MOVE A10,A7
CALLA GETA10
ADD A7,A10 ;ADD SOME MORE TIME TO THE KITTY
CMPI 600,A10
JRLS SI_NOTOP
MOVI 600,A10
SI_NOTOP
CALLA PUTA10
JRUC SI_NO_RING ;AND BLOW THIS JOINT
START_I_NONE
MOVE A13,A11
CREATE INDPID,DINO_INVINCIBLE
MOVE A0,*A13(DINVPROC),L ;KEEP THIS IN CASE OF DEATH
JRZ SI_NO_RING
MOVE *A13(DINITTAB),A14,L
CALLA GPALOBJ
JRZ SI_NO_RING
CALLA COPY_OBJ
CALLA ADD_SLAVE
MOVE A8,A10
MOVE A0,A8
CREATE INDPID,DINO_RING
MOVE A0,*A8(OPLINK),L
JRNZ SI_NO_RING
CALLA DELETE_PAL
MOVE A8,A0
CALLA FREEOBJ
SI_NO_RING
MMFM SP,A0,A1,A7,A8,A10,A11
RETS
**************************************************************************
* *
* KILL_INVINCIBILITY - ROUTINE TO KILL THE DINO INVINCIBILITY PROCESS. *
* A8 = PTR TO THE DINOSAUR OBJECT *
* A13 = PTR TO DINO PROCESS *
* *
**************************************************************************
KILL_INVINCIBILITY
PUSH A0
CALLA DELETE_SLAVES
CLR A0
MOVB A0,*A13(DINVIN) ;DOWN FLAG
MOVE *A13(DINVPROC),A0,L
JRZ KI_NOPROC
CALLA KILL ;KILL THE INVINCIBLE
CLR A0
MOVE A0,*A13(DINVPROC),L
KI_NOPROC
PULL A0
RETS
**************************************************************************
* *
* DINO_INVINCIBLE - PROCESS TO MAKE THE DINOSAUR INVINCIBLE. *
* A10 = TICKS TO STAY INVINCIBLE *
* A11 = PTR TO DINOSAUR PROCESS *
* NOTES: REMAINING TIME MUST STAY IN A10. *
* THIS IS THE ONLY PROCESS ALLOWED TO CHANGE DINVIN. *
* *
**************************************************************************
DINO_INVINCIBLE
MOVE A11,A0
CALLA GETA8
CALLR IS_DINO_DEAD_A8 ;RACE CHECK, IS DINO DEAD?
JRZ DINO_INV_END ;BR = YES, THEN DON'T KEEP SAYING NO
MOVK 1,A0
MOVB A0,*A11(DINVIN)
DINO_INV_LP
SLEEP 10
SUBK 10,A10
JRGT DINO_INV_LP
MOVE A11,A0 ;REDUNDANT CODE FOR SAFETY
CALLA GETA8
DINO_INV_END
CALLA DELETE_SLAVES
CLR A0
MOVB A0,*A11(DINVIN)
MOVE A0,*A11(DINVPROC),L
DIE
.DATA
**************************************************************************
* *
* DINO SOUNDS *
* *
**************************************************************************
WIN_SND
.WORD >F340,>38,>808C,0 ;SOMEBODY JUST WON
DINOSPEED_SND
.WORD >F010,>70,>8039,0 ;DINO EATS A SPEED PLANT
DINOSHROOM_SND
.WORD >F010,>5D,>803B,0 ;DINO EATS A MUSHROOM
****DINOFIGHT_SNDTAB
**** .LONG DINOF1_SND,DINOF2_SND,DINOF3_SND,DINOF4_SND
**** .LONG DINOF2_SND,DINOF1_SND,DINOF4_SND,DINOF3_SND
****NUMFIGHTSNDS .EQU 8
****DINOF1_SND
**** .WORD >F005,>25,>8031,0 ;DINO REACTING TO PUNCHES
****DINOF2_SND
**** .WORD >F005,>19,>8032,0 ;DINO REACTING TO PUNCHES
****DINOF3_SND
**** .WORD >F005,>45,>8033,0 ;DINO REACTING TO PUNCHES
****DINOF4_SND
**** .WORD >F005,>22,>8034,0 ;DINO REACTING TO PUNCHES
****DINOBUMP_SND
**** .WORD >F010,>C,>805F,0 ;DINO CLUNKS HIS HEAD
****DINOHUH1_SND
**** .WORD >F001,>A,>8018,0 ;DINO CONFUSED BY STUPID PLAYER
HSHOE_SND
.WORD >F310,>3C,>80AD,0 ;DINO PICKS UP HORSESHOE
*
*TABLE OF INIT TABLES, USED TO GET THE INITIAL IMAGE BASED ON THE DINOSAUR
*TYPE I.D.
ALIGNTAB
.LONG REXINIT,BLOOPINIT,ELVISINIT,SPIKEINIT
.LONG SPIKEINIT,SPIKEINIT,SPIKEINIT,SPIKEINIT
.LONG SPIKEINIT,SPIKEINIT,SPIKEINIT,SPIKEINIT
.LONG SPIKEINIT,SPIKEINIT,SPIKEINIT,SPIKEINIT
**************************************************************************
* *
* DINOSAUR COLLISION LIST(S) *
* *
**************************************************************************
DINOCOLL
.WORD HBAROID,08FFFH ;IGNORE PLAYER #
.LONG DINOHHIT
.WORD VBAROID,08FFFH
.LONG DINOVHIT
.WORD DINOOID,0FFF0H ;COLLIDE WITH ALL OTHER DINOS
.LONG DINODINO
.WORD TARBAITOID,0FFFFH
.LONG DINO_BAITTAR
.WORD TAROID,0FFF0H
.LONG DINOTAR
.WORD FIREOID,0FFF0H
.LONG DINOFIRE
.WORD PITOID,0FFFFH
.LONG DINOPIT
.WORD FLOWEROID,0FFFFH
.LONG DINOFLOWER
.WORD SHROOMOID,0FFFFH
.LONG DINOSHROOM
.WORD TUNNELOID,0FFFFH
.LONG DINOTUNNEL
.WORD PINEAPPLEOID,0FFFFH
.LONG DINOPAPPLE
.WORD HSHOEOID,0FFFFH
.LONG DINOHSHOE
.WORD ICEOID,0FFFFH
.LONG DINOICE
.WORD CHILIOID,0FFFFH
.LONG DINOCHILI
DUMCOLL ;LABEL FOR THE COMMON CAUSE
.WORD 0
.LONG DUMCRETS ;DO NOTHING
.END