646 lines
19 KiB
NASM
646 lines
19 KiB
NASM
.MLIB "TROGMACS.LIB"
|
||
.FILE 'TROGWAND.ASM'
|
||
.TITLE " <<< T R O G -- WANDA THE CAVE GIRL >>>"
|
||
.WIDTH 132
|
||
.OPTION B,D,L,T
|
||
.MNOLIST
|
||
|
||
**************************************************************************
|
||
* *
|
||
* THIS IS ONLY A COPY OF LOW LEVEL TROG INTELLIGENCE CURRENTLY. *
|
||
* JUST A PLACEHOLDER FOR THE TRUE WANDA CODE. *
|
||
* *
|
||
**************************************************************************
|
||
**************************************************************************
|
||
* *
|
||
* 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 "TROGAEQU.ASM" ;GET THE ANIMATION EQUATES
|
||
|
||
.TEXT
|
||
|
||
**************************************************************************
|
||
* *
|
||
* TROG_START - START TROG(S) *
|
||
* A5 = [RANDOM # TO ADD, # TO START] *
|
||
* A6 = OID *
|
||
* *
|
||
**************************************************************************
|
||
TROG_START:
|
||
MMTM SP,A1,A7,A10
|
||
MOVI TROGPID,A1
|
||
MOVI TROG_PROCESS,A7
|
||
MOVE A6,A10
|
||
CALLA ENEMY_START
|
||
MOVK 6,A1
|
||
MOVE A1,@TROG_LOOK_COUNT,W
|
||
MOVK 1,A1
|
||
MOVE A1,@TROG_SEARCH_DIST,W
|
||
MMFM SP,A1,A7,A10
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* TROG_PROCESS - CREATE AND CONTROL THE TROG CHARACTER *
|
||
* A10 = OID *
|
||
* *
|
||
**************************************************************************
|
||
TROG_PROCESS:
|
||
CALLA CLRPDATA ;CLEAR OUR DATA AREA
|
||
MOVI TROGATAB,A0
|
||
MOVE A0,*A13(DATABLE),L ;STORE ANIMATION TABLE
|
||
MOVK DOWN,A0
|
||
MOVE A0,*A13(DINITDIR),W ;STORE INITIAL DIRECTION
|
||
MOVE A10,*A13(DOID),W ;STORE THIS GUYS OID
|
||
MOVE @TROGSPEED,A1,W ;GET THIS WAVES INITIAL VELOCITY
|
||
ZEXT A1
|
||
MOVE A1,*A13(DSPEED),W ;KEEP THE INITIAL SPEED
|
||
ZEXT A1
|
||
SLL 4,A1
|
||
CALLR DINO_VEL ;SETUP THE INITIAL VELOCITY
|
||
TROG_RANDOM_INIT:
|
||
CALLA FIND_OPEN_CPNT
|
||
JRNZ TROG_RANDOM_CPNT
|
||
SLOOP 10,TROG_RANDOM_INIT
|
||
TROG_RANDOM_CPNT:
|
||
MOVE *A1(CMOVEPOS),*A13(DINITPOS),L ;FIND US A STARTING MARK
|
||
|
||
*TRANSFER HERE AFTER TROG 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.
|
||
TROGDEATH_XFER:
|
||
CLR A0
|
||
MOVB A0,*A13(DPUNCHFLG) ;CLEAR FLAGS
|
||
MOVB A0,*A13(DDIZZYFLG)
|
||
MOVB A0,*A13(DBURNS) ;CLEAR THE BURN COUNT
|
||
MOVI TROGINIT,A14,L ;INIT TABLE IN THE CORRECT SPOT
|
||
CALLA GPALOBJSTF ;GET AN OBJECT AND STUFF
|
||
JRZ TROG_PROC_DIE ;BR = WE FAILED TO GET AN OBJECT
|
||
MOVE A0,A8
|
||
MOVE A13,*A8(OPLINK),L ;LINK THE PROC TO THE OBJ
|
||
MOVE *A13(DOID),*A8(OID),W ;STUFF THE I.D.
|
||
MOVE *A13(DATABLE),A10,L ;RELOAD THE ANIMATION TABLE
|
||
|
||
MOVE *A13(DINITPOS),A3,L ;LOOK FOR A GOOD SPOT, TO APPEAR
|
||
CALLA DINO_PNT_TST
|
||
JRZ TROGINIT_OKP ;BR = WE FOUND ONE, NO PROBLEM
|
||
SLEEP 30
|
||
MOVE *A13(DINITPOS),A3,L ;LET'S START LOOKING
|
||
CALLA FINDMOVE
|
||
JRNC TROGINIT_OKP ;BR = WIERDNESS, NO MOVE
|
||
MOVE *A13(DINITDIR),A0,W ;SHOW US THE WAY
|
||
CALLA DINOINIT_PNT_FIND ;FIND A FREE POINT
|
||
CALLA DSRCH_CLR ;CLEAR THE SEARCH MARKS
|
||
TROGINIT_OKP:
|
||
MOVE A3,A1
|
||
MOVE A3,*A13(DINITPOS),L ;STORE AWAY FOR SAFE KEEPING
|
||
CALLR TROG_NEW_PNT ;CENTER TROG ON THIS NEW POINT
|
||
CALLA FINDMOVE ;NOW FIND THIS MOVE
|
||
JRNC TROGINIT_NOSRCH ;BR = NOT A VALID MOVE, DON'T SEARCH
|
||
CALLA FIND_SAFEST ;FIND US THE SAFEST MOVE
|
||
MOVE A2,*A13(DINITDIR),W ;NEW INITIAL DIRECTION
|
||
TROGINIT_NOSRCH:
|
||
MOVE *A13(DINITPOS),A9,L
|
||
CREATE INDPID,TROG_PIT ;START THE PIT FROM WHICH HE WILL EMERGE
|
||
SLEEP 61
|
||
MOVK DOWN,A0
|
||
MOVE A0,*A13(DDIR),W ;HE WILL FACE DOWN FOR THIS
|
||
MOVI TROG_APPEAR,A9
|
||
MOVK 4,A1
|
||
JSRP FRANIM ;LOAD THE NEW FRAME
|
||
MOVI TROGS,A1
|
||
CALLA INSERT_OBJ_SUPP ;INSERT THIS 'TING
|
||
SLEEPR A0 ;SLEEP THE FRAME TIME
|
||
MOVK 1,A1
|
||
JSRP FRANIM
|
||
SLEEP 10
|
||
MOVE @TROG_INTRO_FLAG,A0,W
|
||
JRNZ TROG_SKIP_INTRO
|
||
MOVI INTRODUCE,A0 ;WAVE AT THE PLAYER
|
||
CALLA DINOLOAD
|
||
MOVK 1,A1
|
||
MOVE A1,@TROG_INTRO_FLAG,W
|
||
JSRP FRANIM
|
||
TROG_SKIP_INTRO:
|
||
MOVE *A13(DINITDIR),A11,W
|
||
JSRP DINOTURN ;TURN THE DIRECTION YOU WISH TO GO
|
||
MOVE *A13(DINITPOS),*A13(TCURMPOS),L
|
||
*
|
||
*PROCESS TRANSFER POINT FOR TROG WALKING PROCESS
|
||
* A8 = PTR TO TROG OBJECT
|
||
* *A13(DATABLE),L = PTR TO TROG ANIMATION TABLE
|
||
* *A13(DDIR),W = CURRENT TROG DIRECTION
|
||
* *A13(DOID) = OBJECT I.D. OF THIS TROG MAN
|
||
* *A13(DPLAYER),L = DATA AREA OF PLAYER THAT TROG IS CHASING
|
||
*
|
||
TROGWXFER
|
||
CLR A0
|
||
MOVB A0,*A13(DPUNCHFLG) ;CLEAR FLAGS
|
||
MOVB A0,*A13(DDIZZYFLG)
|
||
MOVE *A13(DOID),*A8(OID),W ;MAKE HIM A NORMAL TROGSTER
|
||
|
||
MOVE *A13(DDIR),A11,W ;GET THE NEW DIRECTION
|
||
MOVE A11,A0
|
||
MOVE *A13(DATABLE),A10,L ;RESTORE THE ANIMATION TABLE
|
||
CALLA DINOLOAD
|
||
MOVB @TROG_LOOK_COUNT,A6
|
||
MOVB A6,*A13(TNEXTLOOK)
|
||
CALLA GET_TROG_CPNT ;THIS IS HIS NEW CENTER
|
||
ADDI [5,0],A1
|
||
CALLA FIND_CLOSE_MPNT ;FIND THE CLOSEST MOVE POINT
|
||
MOVE A3,*A13(TCURMPOS),L ;AND STORE IT AS HIS CURRENT MOVE POS
|
||
*
|
||
*A11 = CURRENT TROG-MAN DIRECTION HERE
|
||
*
|
||
TROGWLP
|
||
CLR A1
|
||
JSRP DINO_FRANIM
|
||
**** MOVE *A13(DDIR),A11,W ;GET THE CURRENT DIRECTION
|
||
MOVE A11,A1 ;AND PUT IT IN THE CORRECT PLACE
|
||
CALLA DINO_VEL_NORMAL ;RETURN TROG VELOCITY TO NORMAL
|
||
CALLA BOUNDRY_CHECK
|
||
JRNE TROG_OUT_OF_BOUNDS
|
||
|
||
CALLR GET_TROG_CPNT ;GET TROG'S CENTER POINT
|
||
ADDI [5,0],A1 ;FUDGE FOR THE DOWN DIRECTION
|
||
CALLA FIND_CLOSE_MPNT ;AND FIND THE CLOSEST MOVE POINT
|
||
MOVE *A13(TCURMPOS),A2,L ;GET THE CURRENT CENTER POINT
|
||
CMP A2,A3 ;SAME MOVE AS LAST TIME?
|
||
JREQ TROGWLP ;BR = YES, THEN KEEP ON TRUCKIN'
|
||
MOVI [4,4],A2 ;TROG MUST BE WITHIN THIS RANGE
|
||
CALLA PNT_IN_RANGE ;IS HE?
|
||
JRNC TROGWLP ;BR = NO
|
||
|
||
MOVE A3,*A13(TCURMPOS),L ;STORE THIS NEW [Y,X] OF THE MOVE PNT
|
||
|
||
MOVB *A13(TNEXTLOOK),A6
|
||
DEC A6 ;DECREMENT NEXT LOOK COUNTER
|
||
MOVB A6,*A13(TNEXTLOOK)
|
||
|
||
MOVE *A0(MOVEEPTR),A4,L ;IS THIS A DEATH SPOT?
|
||
JRN TROG_NOT_NEAR_EXIT ;BR = NO
|
||
MOVB *A4(EMOVEDIR),A5 ;GET THE DIRECTION OF THE EXIT
|
||
CMP A11,A5 ;IS HE WALKING THAT WAY?
|
||
JRNE TROG_NOT_NEAR_EXIT ;BR = NO
|
||
*
|
||
*NOTE: MAKE TROG LOOK OVER THE EDGE HERE, PAUSE, THEN ABOUT FACE
|
||
*
|
||
TROG_NEAR_EXIT:
|
||
MOVI STANDU,A0
|
||
JSRP ANIMATE_DIR ;STAND
|
||
SLEEP 60 ;PAUSE
|
||
CALLA NOTDIR
|
||
JSRP DINOLOOK_TURN ;ABOUTFACE
|
||
MOVE A11,A0
|
||
CALLA DINOLOAD ;LOAD THE WALKING FRAME
|
||
JRUC TROGWLP ;START TO WALKIN'
|
||
|
||
TROG_NOT_NEAR_EXIT:
|
||
MOVE A11,A1
|
||
CALLA ONE_MOVE ;GET ADJACENT MOVE
|
||
JRZ TROG_NEAR_EXIT ;BR = MUST BE NEAR AN EDGE?
|
||
|
||
MOVE *A0(MOVECPTR),A5,L ;IS CURRENT MOVE A CENTER POINT?
|
||
JRNN TROG_CK_LOOK ;BR = YES, JUST TRY TO LOOK
|
||
|
||
MOVE *A1(MOVECPTR),A4,L ;IS ADJACENT MOVE A CENTER?
|
||
JRN TROG_CK_LOOK ;BR = NO HANDLE NORMAL SCAN
|
||
MOVB *A4(CMOVEEGG),A4 ;IS THERE SOMETHING HERE?
|
||
INC A4
|
||
JRZ TROG_CK_LOOK ;BR = NO
|
||
DEC A4
|
||
CMPI FLOWERID,A4 ;IS IT A FLOWER?
|
||
JREQ TROG_CK_LOOK ;BR = OK TO WALK OVER IT
|
||
CMPI SHROOMID,A4 ;IS IT A MUSHROOM?
|
||
JREQ TROG_CK_LOOK ;BR = OK TO WALK OVER IT
|
||
ANDI 0FFFFFFF0H,A4 ;IS IT SOMETHING TO WORRY ABOUT?
|
||
JREQ TROG_CK_LOOK ;BR = NO
|
||
|
||
*
|
||
* CHECK ALL ENEMIES AND GOODIES HERE, AND SEE IF IT IS O.K. TO WALK ON THEM
|
||
*
|
||
JRUC TROG_NEAR_EXIT ;DO NOT CONTINUE IN THIS DIRECTION
|
||
|
||
*
|
||
*A0 = CURRENT MOVE PTR
|
||
*A1 = ADJACENT MOVE IN THE CURRENT DIRECTION
|
||
*A5 = *A0(MOVECPTR),L
|
||
TROG_CK_LOOK:
|
||
MOVB *A13(TTRAPPED),A3
|
||
JRNZ TROG_TRAPPED
|
||
MOVE *A0(MOVEPOS),A3,L
|
||
CALLR TRAP_CHECK ;SEE IF HE IS TRAPPED
|
||
JRZ TROG_LOOK_OK ;BR = NO HE IS NOT
|
||
TROG_TRAPPED:
|
||
MOVE A5,A0 ;IS HE ON A CENTER POINT?
|
||
JRN TROGWLP ;BR = NO, WAIT UNTIL WE HIT ONE
|
||
JRUC TROG_DIG ;DIG IT TROGGY!
|
||
TROG_LOOK_OK:
|
||
MOVB *A13(TNEXTLOOK),A6
|
||
JRGT TROGWLP ;BR = NOT TIME TO LOOK AROUND YET
|
||
|
||
MOVE A5,A0 ;EEZ ZEES A ZENTER POYANT?
|
||
JRN TROGWLP ;BR = NO
|
||
|
||
MOVB @TROG_LOOK_COUNT,A6
|
||
MOVB A6,*A13(TNEXTLOOK) ;RE-LOAD NEXT LOOK
|
||
|
||
PUSHP A0
|
||
CLR A1
|
||
JSRP DINO_FRANIM ;TAKE ONE MORE STEP
|
||
PULLP A0
|
||
CALLR TROG_CENTER
|
||
|
||
*
|
||
*SCAN FOR NEW DIRECTION HERE
|
||
*
|
||
MOVE A0,*A13(PTEMP1),L ;SAVE CENTER POINT
|
||
MOVI LOOKBOTHU,A0
|
||
JSRP ANIMATE_DIR
|
||
MOVE *A13(PTEMP1),A0,L
|
||
CALLR TROG_CENTER
|
||
MOVE *A13(DDIR),A5,W
|
||
CMPI UP,A5
|
||
JRNE TROG_CKD
|
||
TROG_LR:
|
||
MOVI LEFT,A6
|
||
MOVI RIGHT,A7
|
||
JRUC TROG_CK_CHOOSE
|
||
TROG_CKD:
|
||
CMPI DOWN,A5
|
||
JREQ TROG_LR
|
||
MOVI UP,A6
|
||
MOVI DOWN,A7
|
||
TROG_CK_CHOOSE:
|
||
MOVE *A0(CMOVEMPTR),A0,L
|
||
CALLA DINOCHOOSE
|
||
JSRP DINOTURN
|
||
JRUC TROGWXFER
|
||
|
||
TROG_OUT_OF_BOUNDS:
|
||
CALLR FIND_EXIT ;FIND OUT WHERE HE FELL OFF
|
||
PUSHP A4 ;STORE THE PTR TO EXIT AREA
|
||
|
||
CALLA NOTDIR ;APPEAR IN THE REVERSE DIRECTION
|
||
MOVE A11,*A13(DINITDIR),W ;MAKE THIS THE NEW DIRECTION
|
||
CMPI TYPE_PIT,A5 ;DID WE DIE IN A PIT?
|
||
JREQ TROG_PIT_DEATH ;BR = YES SIR
|
||
TROG_CLIFF_DEATH:
|
||
MOVI DEADTROGOID,A0 ;MARK TROG AS DEAD
|
||
MOVE A0,*A8(OID),W
|
||
MOVI DEATH_UP,A0 ;DEFAULT ON NORMAL DEATH
|
||
JSRP ANIMATE_DIR
|
||
JRUC TROG_DEATH_DONE
|
||
*
|
||
*ANIMATE PIT DEATH ANIMATION WITH CENTER POINT DRIFT
|
||
*A6 = PIT [Y,X] CENTER POINT
|
||
TROG_PIT_DEATH:
|
||
MOVI DEADTROGOID,A0 ;MARK TROG AS DEAD
|
||
MOVE A0,*A8(OID),W
|
||
PUSHP A6
|
||
MOVI PIT_DEATH_UP,A0
|
||
JSRP ANIMATE_DIR ;ANIMATE THE FLAIL
|
||
CALLA GETCPNT ;GET TROGS CENTER POINT
|
||
MOVE A1,A2
|
||
PULLP A3
|
||
MOVI 25*4,A4 ;AVERAGE SPIN DURATION
|
||
CALLA SLINEVEL
|
||
MOVE A1,*A8(OXVEL),L
|
||
MOVE A2,*A8(OYVEL),L
|
||
MOVK 1,A1
|
||
JSRP FRANIM ;NOW ANIMATE THE REST
|
||
CALLA PSTOP
|
||
JRUC TROG_DEATH_DONE
|
||
*
|
||
*MUST HAVE PTR TO EXIT MOVE PUSHED ON THE PROCESS STACK
|
||
*IF = 0 THEN BLOW OFF THEN *A13(DINITPOS),L IS STUFFED
|
||
TROG_DEATH_DONE:
|
||
MOVE *A8(OID),A10,W ;RESTORE HIS I.D.
|
||
MOVI TROGS,A1
|
||
CALLA DELETE_OBJ_SUPP ;OFF THE LISTS
|
||
PULLP A4
|
||
MOVE A4,A4
|
||
JREQ TROGDEATH_OLD_RET
|
||
MOVE *A4(EMOVERET),A0,W
|
||
JRN TROGDEATH_OLD_RET ;BR = RETURN TO THE OLD POSITION
|
||
CALLA GETMOVE ;GET THE MOVE POINT
|
||
MOVE *A0(MOVEPOS),*A13(DINITPOS),L ;AND GET THE POSITION
|
||
TROGDEATH_OLD_RET:
|
||
SLEEP 60 ;WAIT A LITTLE BIT BEFORE RE-INIT
|
||
JRUC TROG_RANDOM_INIT ;FIND A RANDOM START POSITION
|
||
|
||
TROG_PROC_DIE:
|
||
DIE
|
||
**************************************************************************
|
||
* *
|
||
* TROG_PROCESS - CREATE AND CONTROL THE TROG CHARACTER *
|
||
* A10 = OID *
|
||
* *
|
||
**************************************************************************
|
||
TROG_PROCESS:
|
||
CALLA CLRPDATA ;CLEAR OUR DATA AREA
|
||
MOVI TROGATAB,A0
|
||
MOVE A0,*A13(DATABLE),L ;STORE ANIMATION TABLE
|
||
MOVK DOWN,A0
|
||
MOVE A0,*A13(DINITDIR),W ;STORE INITIAL DIRECTION
|
||
MOVE A10,*A13(DOID),W ;STORE THIS GUYS OID
|
||
MOVE @TROGSPEED,A1,W ;GET THIS WAVES INITIAL VELOCITY
|
||
ZEXT A1
|
||
MOVE A1,*A13(DSPEED),W ;KEEP THE INITIAL SPEED
|
||
ZEXT A1
|
||
SLL 4,A1
|
||
CALLR DINO_VEL ;SETUP THE INITIAL VELOCITY
|
||
TROG_RANDOM_INIT:
|
||
CALLA FIND_OPEN_CPNT
|
||
JRNZ TROG_RANDOM_CPNT
|
||
SLOOP 10,TROG_RANDOM_INIT
|
||
TROG_RANDOM_CPNT:
|
||
MOVE *A1(CMOVEPOS),*A13(DINITPOS),L ;FIND US A STARTING MARK
|
||
|
||
*TRANSFER HERE AFTER TROG 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.
|
||
TROGDEATH_XFER:
|
||
CLR A0
|
||
MOVB A0,*A13(DPUNCHFLG) ;CLEAR FLAGS
|
||
MOVB A0,*A13(DDIZZYFLG)
|
||
MOVB A0,*A13(DBURNS) ;CLEAR THE BURN COUNT
|
||
MOVI TROGINIT,A14,L ;INIT TABLE IN THE CORRECT SPOT
|
||
CALLA GPALOBJSTF ;GET AN OBJECT AND STUFF
|
||
JRZ TROG_PROC_DIE ;BR = WE FAILED TO GET AN OBJECT
|
||
MOVE A0,A8
|
||
MOVE A13,*A8(OPLINK),L ;LINK THE PROC TO THE OBJ
|
||
MOVE *A13(DOID),*A8(OID),W ;STUFF THE I.D.
|
||
MOVE *A13(DATABLE),A10,L ;RELOAD THE ANIMATION TABLE
|
||
|
||
MOVE *A13(DINITPOS),A3,L ;LOOK FOR A GOOD SPOT, TO APPEAR
|
||
CALLA DINO_PNT_TST
|
||
JRZ TROGINIT_OKP ;BR = WE FOUND ONE, NO PROBLEM
|
||
SLEEP 30
|
||
MOVE *A13(DINITPOS),A3,L ;LET'S START LOOKING
|
||
CALLA FINDMOVE
|
||
JRNC TROGINIT_OKP ;BR = WIERDNESS, NO MOVE
|
||
MOVE *A13(DINITDIR),A0,W ;SHOW US THE WAY
|
||
CALLA DINOINIT_PNT_FIND ;FIND A FREE POINT
|
||
CALLA DSRCH_CLR ;CLEAR THE SEARCH MARKS
|
||
TROGINIT_OKP:
|
||
MOVE A3,A1
|
||
MOVE A3,*A13(DINITPOS),L ;STORE AWAY FOR SAFE KEEPING
|
||
CALLR TROG_NEW_PNT ;CENTER TROG ON THIS NEW POINT
|
||
CALLA FINDMOVE ;NOW FIND THIS MOVE
|
||
JRNC TROGINIT_NOSRCH ;BR = NOT A VALID MOVE, DON'T SEARCH
|
||
CALLA FIND_SAFEST ;FIND US THE SAFEST MOVE
|
||
MOVE A2,*A13(DINITDIR),W ;NEW INITIAL DIRECTION
|
||
TROGINIT_NOSRCH:
|
||
MOVE *A13(DINITPOS),A9,L
|
||
CREATE INDPID,TROG_PIT ;START THE PIT FROM WHICH HE WILL EMERGE
|
||
SLEEP 61
|
||
MOVK DOWN,A0
|
||
MOVE A0,*A13(DDIR),W ;HE WILL FACE DOWN FOR THIS
|
||
MOVI TROG_APPEAR,A9
|
||
MOVK 4,A1
|
||
JSRP FRANIM ;LOAD THE NEW FRAME
|
||
MOVI TROGS,A1
|
||
CALLA INSERT_OBJ_SUPP ;INSERT THIS 'TING
|
||
SLEEPR A0 ;SLEEP THE FRAME TIME
|
||
MOVK 1,A1
|
||
JSRP FRANIM
|
||
SLEEP 10
|
||
MOVE @TROG_INTRO_FLAG,A0,W
|
||
JRNZ TROG_SKIP_INTRO
|
||
MOVI INTRODUCE,A0 ;WAVE AT THE PLAYER
|
||
CALLA DINOLOAD
|
||
MOVK 1,A1
|
||
MOVE A1,@TROG_INTRO_FLAG,W
|
||
JSRP FRANIM
|
||
TROG_SKIP_INTRO:
|
||
MOVE *A13(DINITDIR),A11,W
|
||
JSRP DINOTURN ;TURN THE DIRECTION YOU WISH TO GO
|
||
MOVE *A13(DINITPOS),*A13(TCURMPOS),L
|
||
*
|
||
*PROCESS TRANSFER POINT FOR TROG WALKING PROCESS
|
||
* A8 = PTR TO TROG OBJECT
|
||
* *A13(DATABLE),L = PTR TO TROG ANIMATION TABLE
|
||
* *A13(DDIR),W = CURRENT TROG DIRECTION
|
||
* *A13(DOID) = OBJECT I.D. OF THIS TROG MAN
|
||
* *A13(DPLAYER),L = DATA AREA OF PLAYER THAT TROG IS CHASING
|
||
*
|
||
TROGWXFER
|
||
CLR A0
|
||
MOVB A0,*A13(DPUNCHFLG) ;CLEAR FLAGS
|
||
MOVB A0,*A13(DDIZZYFLG)
|
||
MOVE *A13(DOID),*A8(OID),W ;MAKE HIM A NORMAL TROGSTER
|
||
|
||
MOVE *A13(DDIR),A11,W ;GET THE NEW DIRECTION
|
||
MOVE A11,A0
|
||
MOVE *A13(DATABLE),A10,L ;RESTORE THE ANIMATION TABLE
|
||
CALLA DINOLOAD
|
||
MOVB @TROG_LOOK_COUNT,A6
|
||
MOVB A6,*A13(TNEXTLOOK)
|
||
CALLA GET_TROG_CPNT ;THIS IS HIS NEW CENTER
|
||
ADDI [5,0],A1
|
||
CALLA FIND_CLOSE_MPNT ;FIND THE CLOSEST MOVE POINT
|
||
MOVE A3,*A13(TCURMPOS),L ;AND STORE IT AS HIS CURRENT MOVE POS
|
||
*
|
||
*A11 = CURRENT TROG-MAN DIRECTION HERE
|
||
*
|
||
TROGWLP
|
||
CLR A1
|
||
JSRP DINO_FRANIM
|
||
**** MOVE *A13(DDIR),A11,W ;GET THE CURRENT DIRECTION
|
||
MOVE A11,A1 ;AND PUT IT IN THE CORRECT PLACE
|
||
CALLA DINO_VEL_NORMAL ;RETURN TROG VELOCITY TO NORMAL
|
||
CALLA BOUNDRY_CHECK
|
||
JRNE TROG_OUT_OF_BOUNDS
|
||
|
||
CALLR GET_TROG_CPNT ;GET TROG'S CENTER POINT
|
||
ADDI [5,0],A1 ;FUDGE FOR THE DOWN DIRECTION
|
||
CALLA FIND_CLOSE_MPNT ;AND FIND THE CLOSEST MOVE POINT
|
||
MOVE *A13(TCURMPOS),A2,L ;GET THE CURRENT CENTER POINT
|
||
CMP A2,A3 ;SAME MOVE AS LAST TIME?
|
||
JREQ TROGWLP ;BR = YES, THEN KEEP ON TRUCKIN'
|
||
MOVI [4,4],A2 ;TROG MUST BE WITHIN THIS RANGE
|
||
CALLA PNT_IN_RANGE ;IS HE?
|
||
JRNC TROGWLP ;BR = NO
|
||
|
||
MOVE A3,*A13(TCURMPOS),L ;STORE THIS NEW [Y,X] OF THE MOVE PNT
|
||
|
||
MOVB *A13(TNEXTLOOK),A6
|
||
DEC A6 ;DECREMENT NEXT LOOK COUNTER
|
||
MOVB A6,*A13(TNEXTLOOK)
|
||
|
||
MOVE *A0(MOVEEPTR),A4,L ;IS THIS A DEATH SPOT?
|
||
JRN TROG_NOT_NEAR_EXIT ;BR = NO
|
||
MOVB *A4(EMOVEDIR),A5 ;GET THE DIRECTION OF THE EXIT
|
||
CMP A11,A5 ;IS HE WALKING THAT WAY?
|
||
JRNE TROG_NOT_NEAR_EXIT ;BR = NO
|
||
*
|
||
*NOTE: MAKE TROG LOOK OVER THE EDGE HERE, PAUSE, THEN ABOUT FACE
|
||
*
|
||
TROG_NEAR_EXIT:
|
||
MOVI STANDU,A0
|
||
JSRP ANIMATE_DIR ;STAND
|
||
SLEEP 60 ;PAUSE
|
||
CALLA NOTDIR
|
||
JSRP DINOLOOK_TURN ;ABOUTFACE
|
||
MOVE A11,A0
|
||
CALLA DINOLOAD ;LOAD THE WALKING FRAME
|
||
JRUC TROGWLP ;START TO WALKIN'
|
||
|
||
TROG_NOT_NEAR_EXIT:
|
||
MOVE A11,A1
|
||
CALLA ONE_MOVE ;GET ADJACENT MOVE
|
||
JRZ TROG_NEAR_EXIT ;BR = MUST BE NEAR AN EDGE?
|
||
|
||
MOVE *A0(MOVECPTR),A5,L ;IS CURRENT MOVE A CENTER POINT?
|
||
JRNN TROG_CK_LOOK ;BR = YES, JUST TRY TO LOOK
|
||
|
||
MOVE *A1(MOVECPTR),A4,L ;IS ADJACENT MOVE A CENTER?
|
||
JRN TROG_CK_LOOK ;BR = NO HANDLE NORMAL SCAN
|
||
MOVB *A4(CMOVEEGG),A4 ;IS THERE SOMETHING HERE?
|
||
INC A4
|
||
JRZ TROG_CK_LOOK ;BR = NO
|
||
DEC A4
|
||
CMPI FLOWERID,A4 ;IS IT A FLOWER?
|
||
JREQ TROG_CK_LOOK ;BR = OK TO WALK OVER IT
|
||
CMPI SHROOMID,A4 ;IS IT A MUSHROOM?
|
||
JREQ TROG_CK_LOOK ;BR = OK TO WALK OVER IT
|
||
ANDI 0FFFFFFF0H,A4 ;IS IT SOMETHING TO WORRY ABOUT?
|
||
JREQ TROG_CK_LOOK ;BR = NO
|
||
|
||
*
|
||
* CHECK ALL ENEMIES AND GOODIES HERE, AND SEE IF IT IS O.K. TO WALK ON THEM
|
||
*
|
||
JRUC TROG_NEAR_EXIT ;DO NOT CONTINUE IN THIS DIRECTION
|
||
|
||
*
|
||
*A0 = CURRENT MOVE PTR
|
||
*A1 = ADJACENT MOVE IN THE CURRENT DIRECTION
|
||
*A5 = *A0(MOVECPTR),L
|
||
TROG_CK_LOOK:
|
||
MOVB *A13(TTRAPPED),A3
|
||
JRNZ TROG_TRAPPED
|
||
MOVE *A0(MOVEPOS),A3,L
|
||
CALLR TRAP_CHECK ;SEE IF HE IS TRAPPED
|
||
JRZ TROG_LOOK_OK ;BR = NO HE IS NOT
|
||
TROG_TRAPPED:
|
||
MOVE A5,A0 ;IS HE ON A CENTER POINT?
|
||
JRN TROGWLP ;BR = NO, WAIT UNTIL WE HIT ONE
|
||
JRUC TROG_DIG ;DIG IT TROGGY!
|
||
TROG_LOOK_OK:
|
||
MOVB *A13(TNEXTLOOK),A6
|
||
JRGT TROGWLP ;BR = NOT TIME TO LOOK AROUND YET
|
||
|
||
MOVE A5,A0 ;EEZ ZEES A ZENTER POYANT?
|
||
JRN TROGWLP ;BR = NO
|
||
|
||
MOVB @TROG_LOOK_COUNT,A6
|
||
MOVB A6,*A13(TNEXTLOOK) ;RE-LOAD NEXT LOOK
|
||
|
||
PUSHP A0
|
||
CLR A1
|
||
JSRP DINO_FRANIM ;TAKE ONE MORE STEP
|
||
PULLP A0
|
||
CALLR TROG_CENTER
|
||
|
||
*
|
||
*SCAN FOR NEW DIRECTION HERE
|
||
*
|
||
MOVE A0,*A13(PTEMP1),L ;SAVE CENTER POINT
|
||
MOVI LOOKBOTHU,A0
|
||
JSRP ANIMATE_DIR
|
||
MOVE *A13(PTEMP1),A0,L
|
||
CALLR TROG_CENTER
|
||
MOVE *A13(DDIR),A5,W
|
||
CMPI UP,A5
|
||
JRNE TROG_CKD
|
||
TROG_LR:
|
||
MOVI LEFT,A6
|
||
MOVI RIGHT,A7
|
||
JRUC TROG_CK_CHOOSE
|
||
TROG_CKD:
|
||
CMPI DOWN,A5
|
||
JREQ TROG_LR
|
||
MOVI UP,A6
|
||
MOVI DOWN,A7
|
||
TROG_CK_CHOOSE:
|
||
MOVE *A0(CMOVEMPTR),A0,L
|
||
CALLA DINOCHOOSE
|
||
JSRP DINOTURN
|
||
JRUC TROGWXFER
|
||
|
||
TROG_OUT_OF_BOUNDS:
|
||
CALLR FIND_EXIT ;FIND OUT WHERE HE FELL OFF
|
||
PUSHP A4 ;STORE THE PTR TO EXIT AREA
|
||
|
||
CALLA NOTDIR ;APPEAR IN THE REVERSE DIRECTION
|
||
MOVE A11,*A13(DINITDIR),W ;MAKE THIS THE NEW DIRECTION
|
||
CMPI TYPE_PIT,A5 ;DID WE DIE IN A PIT?
|
||
JREQ TROG_PIT_DEATH ;BR = YES SIR
|
||
TROG_CLIFF_DEATH:
|
||
MOVI DEADTROGOID,A0 ;MARK TROG AS DEAD
|
||
MOVE A0,*A8(OID),W
|
||
MOVI DEATH_UP,A0 ;DEFAULT ON NORMAL DEATH
|
||
JSRP ANIMATE_DIR
|
||
JRUC TROG_DEATH_DONE
|
||
*
|
||
*ANIMATE PIT DEATH ANIMATION WITH CENTER POINT DRIFT
|
||
*A6 = PIT [Y,X] CENTER POINT
|
||
TROG_PIT_DEATH:
|
||
MOVI DEADTROGOID,A0 ;MARK TROG AS DEAD
|
||
MOVE A0,*A8(OID),W
|
||
PUSHP A6
|
||
MOVI PIT_DEATH_UP,A0
|
||
JSRP ANIMATE_DIR ;ANIMATE THE FLAIL
|
||
CALLA GETCPNT ;GET TROGS CENTER POINT
|
||
MOVE A1,A2
|
||
PULLP A3
|
||
MOVI 25*4,A4 ;AVERAGE SPIN DURATION
|
||
CALLA SLINEVEL
|
||
MOVE A1,*A8(OXVEL),L
|
||
MOVE A2,*A8(OYVEL),L
|
||
MOVK 1,A1
|
||
JSRP FRANIM ;NOW ANIMATE THE REST
|
||
CALLA PSTOP
|
||
JRUC TROG_DEATH_DONE
|
||
*
|
||
*MUST HAVE PTR TO EXIT MOVE PUSHED ON THE PROCESS STACK
|
||
*IF = 0 THEN BLOW OFF THEN *A13(DINITPOS),L IS STUFFED
|
||
TROG_DEATH_DONE:
|
||
MOVE *A8(OID),A10,W ;RESTORE HIS I.D.
|
||
MOVI TROGS,A1
|
||
CALLA DELETE_OBJ_SUPP ;OFF THE LISTS
|
||
PULLP A4
|
||
MOVE A4,A4
|
||
JREQ TROGDEATH_OLD_RET
|
||
MOVE *A4(EMOVERET),A0,W
|
||
JRN TROGDEATH_OLD_RET ;BR = RETURN TO THE OLD POSITION
|
||
CALLA GETMOVE ;GET THE MOVE POINT
|
||
MOVE *A0(MOVEPOS),*A13(DINITPOS),L ;AND GET THE POSITION
|
||
TROGDEATH_OLD_RET:
|
||
SLEEP 60 ;WAIT A LITTLE BIT BEFORE RE-INIT
|
||
JRUC TROG_RANDOM_INIT ;FIND A RANDOM START POSITION
|
||
|
||
TROG_PROC_DIE:
|
||
DIE
|
||
|
||
|