trog/TROGWAND.ASM

646 lines
19 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 '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