trog/TROGCAT.ASM

1073 lines
26 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 'TROGCAT.ASM'
.TITLE " <<< T R O G -- CATAPULT ROUTINES >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1990 MIDWAY MANUFACTURING COMPANY, *
* MANUFACTURERS OF BALLY/MIDWAY AMUSEMENT GAMES. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
.INCLUDE "MPROCEQU.ASM" ;MPROC equates
.INCLUDE "DISPEQU.ASM" ;Display processor equates
.INCLUDE "GSPINC.ASM" ;GSP assembler equates
.INCLUDE "SYSINC.ASM" ;Zunit system equates
.INCLUDE "TROGEQU.ASM"
.INCLUDE "TROGAEQU.ASM"
.INCLUDE "IMGTBL.GLO"
**************************************************************************
* *
* REFS AND DEFS *
* *
**************************************************************************
.DEF CATAPULT_START
.REF ENEMY_START, FIND_OPEN_CPNT, TOMOVE, BUMP
.REF DINOWXFER, REXINIT
.REF GETANIXY, GETCENT
.REF SPBOING01, SPBOING41, SPBOINGL41, SPBOING81
.REF TRBOING01, TRBOING41, TRBOINGL41, TRBOING81
.REF TROG_SHADOW_UPDATE
.REF DINO_CENTER, FIND_CLOSE_MPNT, FIND_CLOSE_CPNT
.REF START_INVINCIBILITY, FIRE_SND
.REF DINOTURN, FIND_SAFEST
.REF TROG_CENTER, TROGWXFER, TROGINIT
.REF KILALLA8, SMACK_SCREEN, SMACK_CNT
.REF WHLXFER, WHL_CENTER, WHLINIT, IS_DINO_DEAD_A0
.BSS TROG_TIME_TABLE,(32*16)
MAX_SMACK .EQU 1 ;MAX SCREEN SMACKS PER WAVE
.TEXT
.EVEN
**************************************************************************
* *
* CATAPULT_START *
* *
* START YOUR ENGINES! *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CALL *
* *
**************************************************************************
CATAPULT_START:
MMTM SP,A1,A7
CREATE CATPID,CATAPULT_CONTROL
MMFM SP,A1,A7
RETS
**************************************************************************
* *
* CATAPULT_CONTROL *
* *
* THING THAT MANAGES ALL THE CATAPULT_PROCESS STUFF *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CREATE *
* *
**************************************************************************
CCPTR EQU PDATA ; LIST OF CATAPULTS WE CONTROL
CATAPULT_CONTROL:
CLR A0
MOVI TROG_TIME_TABLE,A1
MOVI 16,A2
CAT_Z_LOOP
MOVE A0,*A1+,L
DSJS A2,CAT_Z_LOOP
;
MOVE A13,A3
ADDI CCPTR,A3 ; LIST OF CATAPULT POINTER THINGS
MOVI CAT_TABLE_1,A2
CAT_START_LOOP
MOVE *A2+,A8,L
JRZ CAT_START_DONE
MOVE A2,A9
ADDI 4*32,A2 ; OFFSET PAST THE "TO" LOCS
CREATE CATPID,CATAPULT_PROCESS
MOVE A0,*A3+,L ; SAVE PROCESS PTR AWAY
JRUC CAT_START_LOOP
CAT_START_DONE
CLR A0
MOVE A0,*A3,L ; ZERO TERMINATE LIST
;
; CAT CONTROL LOOP
;
CAT_CONTROL_RESTART
MOVI CAT_CONTROL_1,A2 ; CATAPULT CONTROL TABLE
CAT_CONTROL_LOOP
MOVE *A2+,A3,W ; GET THE SLEEP TIME
JRZ CAT_CONTROL_RESTART ; BR = RELOOP ON THE LIST
CATS_ON:
MOVE *A2+,A4,W ; GET NEXT ON CAT
JRZ CATS_OFF
DEC A4 ; ZERO BASE IT
SLL 5,A4
ADDI CCPTR,A4
ADD A13,A4
MOVE *A4,A4,L ; POINTER TO ACTUAL CAT PROCESS
JRZ CAT_CONTROL_DIE ; PROC PTR IS ZERO?!?
MOVK 1,A1
MOVE A1,*A4(CATON),W ; TURN ON THAT PUPPY
JRUC CATS_ON
CATS_OFF:
MOVE *A2+,A4,W ; GET NEXT OFF CAT
JRZ CAT_SLEEP ; BR = END OF LIST
DEC A4 ; ZERO BASE IT
SLL 5,A4
ADDI CCPTR,A4
ADD A13,A4
MOVE *A4,A4,L ; POINTER TO ACTUAL CAT PROCESS
JRZ CAT_CONTROL_DIE ; PROC PTR IS ZERO?!?
CLR A1
MOVE A1,*A4(CATON),W ; TURN IT OFF
JRUC CATS_OFF
CAT_SLEEP:
PUSHP A2
SLEEPR A3 ; HANG OUT FOR A WHILE
PULLP A2
JRUC CAT_CONTROL_LOOP
CAT_CONTROL_DIE
DIE
**************************************************************************
* *
* CATAPULT_PROCESS *
* *
* RUN A MASS TRANSPORTATION SYSTEM *
* *
* ENTRY *
* A8 LOCATION POINT *
* A9 PTR TO "WHERE TO GO" TABLE *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CREATE *
* *
**************************************************************************
CATON EQU PDATA ; 1 IF CATAPULT IS TURNED ON
CATDIRPTR EQU CATON+16 ; PTR TO DIRECTION TABLE
CATHILITE EQU CATDIRPTR+32 ; THE HILITE OBJECT
CATINUSE EQU CATHILITE+32
CATAPULT_PROCESS:
MOVE A9,*A13(CATDIRPTR),L ; SAVE AWAY THE "WHERE TO FLY"
MOVE A8,A1
CALLA FIND_CLOSE_CPNT
JRZ CATAPULT_PROC_DIE ; BR = NOTHING TO FIND
MOVE A0,A5 ; SAVE CENTER POINT AWAY
MOVI CAT_INIT,A14
CALLA GPALOBJSTF
JRZ CATAPULT_PROC_DIE ; BR = COULDN'T MAKE THE OBJECT
MOVE A13,*A0(OPLINK),L ; LINK IT UP
MOVI CATOID,A10
MOVE A10,*A0(OID),W
MOVE A0,A8 ; OBJECT
MOVE A5,A0 ; CENTER POINT
CALLA TOMOVE ; PLACE THE CATAPULT ON THE SPOT
MOVI CATID,A0
MOVB *A5(CMOVEEGG),A2
INC A2
JRNZ CATAPULT_SPOT_BAD
MOVB A0,*A5(CMOVEEGG) ; MARK IT TAKEN
CATAPULT_SPOT_BAD
MOVE A8,A0
CALLA SET_TZPOS ; SET TOP Z POSITION
CALLA INSERT_OBJ
MOVI ENEMIES,A1
CALLA INSERT_SUPP ; MAKE US COLLIDABLE
;
MOVE A8,A7
CALLA GETANIXY
SRL 16,A3
MOVY A2,A3
MOVI CAT_SPOT,A14
CALLA GPALOBJSTF
JRZ CATAPULT_PROC_DIE
MOVE A0,A8
CALLA OBJ_OFF
CALLA OBJ_TO_PNT
MOVE *A7(OZPOS),A7,W
INC A7
MOVE A7,*A8(OZPOS),W
CALLA INSOBJ
MOVI CAT_SPOT_ANIM,A9 ; SETUP THE ANIMATION START
MOVE A8,*A13(CATHILITE),L ; SAVE THE HILITE OBJECT
CLR A0
MOVE A0,*A13(CATINUSE),W ; MAKE IT "NOT IN USE"
;
; NOW RUN THE CATAPULT, MAINLY CHECKING FOR ON/OFF CONDITIONS
;
CATAPULT_PROC_LOOP
MOVK 4,A0
MOVE *A13(CATINUSE),A1,W
JRNZ CATAPULT_PROC_PROC ; BR = WE DON'T CARE, HERE
MOVE *A13(CATON),A0,W
JRNZ CAT_PROC_ON ; BR = CATAPULT TURNED ON
CALLA OBJ_OFF
MOVI CAT_SPOT_ANIM,A9 ; RESET ANIMATION TO START
MOVK 5,A0 ; SLEEP TIME
JRUC CATAPULT_PROC_PROC
CAT_PROC_ON
MOVK 4,A1
JSRP FRANIM ; LOAD UP THE NEXT FRAME
CALLA OBJ_ON
CATAPULT_PROC_PROC
SLEEPR A0
JRUC CATAPULT_PROC_LOOP
;
CATAPULT_PROC_DIE:
DIE
**************************************************************************
* *
* CAT_DINO *
* *
* CATAPULT VS. DINOSAUR COLLISION ROUTINE *
* *
* ENTRY *
* A0 CATAPULT OBJECT POINTER *
* A8 DINO OBJECT POINTER *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CALL *
* *
**************************************************************************
CAT_DINO:
MMTM SP,A0,A8
SWAP A8,A0 ; SWAP DINO AND CATAPULT
CALLR CK_CAT_CENT
JRNC CAT_BAILOUT
MMTM SP,A1,A2,A3,A4,A7,A9,A10,A14
;
; A0 = DINO
; A8 = CATAPULT
;
MOVE *A0(OPLINK),A11,L ; GET THE DINOSAURS CONTROL
JRZ CAT_DINO_X ; THE DINO IS OUT OF CONTROL
MOVE *A8(OPLINK),A10,L ; GET THE CATAPULT PROCESS
JRZ CAT_DINO_X ; IT MUST HAVE DIED
MOVE *A10(CATON),A1,W ; CHECK TO SEE IF CATAPULT ACTIVE
JRZ CAT_DINO_X ; BR = IT IS TURNED OFF
MOVE *A10(CATINUSE),A1,W ; CHECK TO SEE IF IN USE
JRNZ CAT_DINO_X ; BR = ALREADY RUNNING
MOVB *A11(DTREXFLG),A1 ; MONSTER MAN?
JRNZ CAT_DINO_X
**** MOVE *A11(DINVPROC),A1,L ; CHECK TO SEE IF INVINCIBLE
**** JRNZ CAT_DINO_X ; BR = PROC, SO YEAH
CALLA IS_DINO_DEAD_A0
JRZ CAT_DINO_X
MOVIB 2,*A11(DDIZZYFLG)
MOVI DINO_FLY,A7 ; WHICH ROUTINE TO USE
;
; A0 = VICTIM
; A8 = CATAPULT
; A10 = CATAPULT PROCESS
; A11 = VICTIM PROCESS
;
CATAPULT_HAPPEN:
MOVE *A10(CATDIRPTR),A9,L ; GET THE DIRECTION TABLE POINTER
MOVE *A11(DDIR),A1,W ; GET THE DIRECTION DINO IS WALKING IN
SLL 5,A1
ADD A9,A1
MOVE *A1,A9,L ; GET THE DIRECTION
JRZ CAT_DINO_X ; BR = "WHERE'D YOU COME FROM?"
PUSH A0
PUSH A7
CREATE INDPID,CAT_CYCLE ; CYCLE THE CATAPULT
PULL A7
PULL A8 ; PULL THE DINO INTO A8
CALLA PSTOP ; STOP THE DINO FROM WALKING
ORIM M_NOCOLL,*A8(OFLAGS),W ; MAKE SURE DINO COLLISIONS ARE OFF
MOVE *A8(OPLINK),A0,L ; DINO PROCESS
CALLA XFERPROC_ID ; RELOCATE THE OBJECT
;
CLR A0 ;END SCAN NOW
MMFM SP,A1,A2,A3,A4,A7,A9,A10,A14
MMFM SP,A0,A8
RETS
CAT_DINO_X:
MMFM SP,A1,A2,A3,A4,A7,A9,A10,A14
CAT_BAILOUT
MMFM SP,A0,A8
MOVE A0,A0 ;KEEP ON SCANNIN'
RETS
**************************************************************************
* *
* CAT_TROG *
* *
* CATAPULT VS. TROG COLLISION ROUTINE *
* *
* ENTRY *
* A0 CATAPULT OBJECT POINTER *
* A8 TROG OBJECT POINTER *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CALL *
* *
**************************************************************************
CAT_TROG:
MMTM SP,A0,A8
SWAP A8,A0 ; SWAP DINO AND CATAPULT
CALLR CK_CAT_CENT
JRNC CAT_BAILOUT
MMTM SP,A1,A2,A3,A4,A7,A9,A10,A14
;
; A0 = TROG
; A8 = CATAPULT
;
MOVE *A0(OPLINK),A11,L ; GET THE TROG'S CONTROL
JRZ CAT_DINO_X ; THE TROG IS OUT OF CONTROL
MOVE *A8(OPLINK),A10,L ; GET THE CATAPULT PROCESS
JRZ CAT_DINO_X ; IT MUST HAVE DIED
MOVE *A10(CATON),A1,W ; CHECK TO SEE IF CATAPULT ACTIVE
JRZ CAT_TROG_SPRING_CHECK ; BR = IT IS TURNED OFF
MOVE *A10(CATINUSE),A1,W ; CHECK TO SEE IF IN USE
JRNZ CAT_DINO_X ; BR = ALREADY RUNNING
MOVB *A11(TTYPE),A1 ; GET THE TROG TYPE
CMPI TTYPE_WHL,A1
JRZ CAT_DINO_X ; NO WHEEL GUYS ALLOWED
CMPI TTYPE_SPRING,A1
JRNZ CAT_SPRING_GO ; SPECIAL CHECKS FOR SPRING DUDES
MOVE @SMACK_CNT,A1,W
CMPI MAX_SMACK,A1
JRHS CAT_DINO_X
CALLA TROG_CHECK_TIMER
JRNZ CAT_DINO_X ; BR = TIMER FOR SAFETY
CAT_SPRING_GO:
MOVE *A0(OID),A1,W
CMPI DEADTROGOID,A1 ; IS HE DYING?
JREQ CAT_DINO_X ; BR = HE'S ALREADY DEAD, NO MORE
; CALLA CK_CAT_CENT ; CHECK IF WE'RE NEAR THE PIT CENTER
; JRNC CAT_DINO_X ; BR = HE'S SAFE
MOVI TROG_FLY,A7
JRUC CATAPULT_HAPPEN ; HANDLE ALL THE GRIT WORK
CAT_TROG_SPRING_CHECK:
MOVB *A11(TTYPE),A1
CMPI TTYPE_SPRING,A1 ; SPRING DUDE?
JRNZ CAT_DINO_X ; NOPE
CALLA TROG_TIME_ADD ; START HIS TIMER
JRUC CAT_DINO_X
**************************************************************************
* *
* TROG_CHECK_TIMER *
* *
* CHECK TO SEE IF I'M ON A TIMING LIST *
* *
* ENTRY *
* A0 TROG OBJ *
* *
* EXIT *
* .Z. NOT ON THE LIST *
* .NZ. ON THE LIST *
* *
* CALL *
* CALL *
* *
**************************************************************************
TROG_CHECK_TIMER:
MMTM SP,A9
MOVE *A0(OID),A9,W
SLL 28,A9
SRL 23,A9
ADDI TROG_TIME_TABLE,A9
MOVE *A9,A9,L ; GRAB THE ENTRY
MMFM SP,A9
RETS
**************************************************************************
* *
* TROG_TIME_ADD *
* *
* ADD A TROG TO THE TIMING LIST *
* *
* ENTRY *
* A0 TROG OBJ *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CALL *
* *
**************************************************************************
TROG_TIME_ADD:
MMTM SP,A0,A9
MOVE *A0(OID),A9,W
SLL 28,A9
SRL 23,A9
ADDI TROG_TIME_TABLE,A9
MOVE *A9,A0,L
JRNZ TROG_TIME_ADD_DIE ; ALREADY A TABLE ENTRY
CREATE INDPID,TROG_TIMER
MOVE A0,*A9,L ; SET THE ADDRESS OF THE TIMER
TROG_TIME_ADD_DIE
MMFM SP,A0,A9
RETS
**************************************************************************
* *
* TROG_TIMER *
* *
* WAIT A CERTAIN AMOUNT OF TIME AND THEN CLEAR MYSELF OUT *
* *
* ENTRY *
* A9 TABLE PTR TO CLEAR ON COMPLETION *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CREATE *
* *
**************************************************************************
TROG_TIMER:
SLEEP 230 ; HANG OUT FOR A WHILE
CLR A0
MOVE A0,*A9,L ; CLEAR THE TABLE ENTRY
DIE
**************************************************************************
* *
* CAT_WHEEL *
* *
* CATAPULT VS. WHEEL COLLISION ROUTINE *
* *
* ENTRY *
* A0 CATAPULT OBJECT POINTER *
* A8 WHEEL OBJECT POINTER *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CALL *
* *
**************************************************************************
CAT_WHEEL:
MMTM SP,A0,A8
SWAP A8,A0 ; SWAP DINO AND CATAPULT
CALLR CK_CAT_CENT
JRNC CAT_BAILOUT
MMTM SP,A1,A2,A3,A4,A7,A9,A10,A14
;
; A0 = WHEEL
; A8 = CATAPULT
;
MOVE *A0(OPLINK),A11,L ; GET THE WHEEL'S CONTROL
JRZ CAT_DINO_X ; THE TROG IS OUT OF CONTROL
MOVE *A8(OPLINK),A10,L ; GET THE CATAPULT PROCESS
JRZ CAT_DINO_X ; IT MUST HAVE DIED
MOVE *A10(CATON),A1,W ; CHECK TO SEE IF CATAPULT ACTIVE
JRZ CAT_TROG_SPRING_CHECK ; BR = IT IS TURNED OFF
MOVE *A10(CATINUSE),A1,W ; CHECK TO SEE IF IN USE
JRNZ CAT_DINO_X ; BR = ALREADY RUNNING
;
; CALLA CK_CAT_CENT ; CHECK IF WE'RE NEAR THE PIT CENTER
; JRNC CAT_DINO_X ; BR = HE'S SAFE
MOVI WHEEL_FLY,A7
JRUC CATAPULT_HAPPEN ; HANDLE ALL THE GRIT WORK
**************************************************************************
* *
* DINO_FLY *
* *
* FLY THE DINO FROM ONE POINT TO ANOTHER *
* *
* ENTRY *
* A8 DINO OBJECT *
* A9 LOCATION TO GO TO *
* A13 DINO PROCESS *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* XFER'D FROM THE REGULAR DINO PROCESS *
* *
**************************************************************************
DINO_FLY:
MOVIB 2,*A13(DDIZZYFLG)
CALLA PSTOP ; DON'T GO ANYWHERE, GUY
SLEEP 24 ; WAIT FOR THE CATAPULT TO PUMP
MOVE A9,A3
JRZ DINO_FLY_DIE
JSRP BOUNCE_TO ; FLY THIS SUCKER
MOVE A8,A0
CALLA SET_ZPOS ; GET A DECENT Z POSITION
MOVE *A8(OXPOS),A1,W
MOVE *A8(OYPOS),A2,W
SLL 16,A2
MOVY A2,A1
CALLA FIND_CLOSE_CPNT
MOVE A0,A0
JRZ DINO_FLY_DIE
MOVE *A0(CMOVEMPTR),A0,L
CALLA DINO_CENTER ; CENTER UP THE LITTLE DINO
**** MOVI 60,A10
**** CALLA START_INVINCIBILITY ; MAKE HIM INVINCIBLE FOR A SEC
;
; TURN THE GUY IN A GOOD DIRECTION
;
MOVE A0,A1 ; GET POINTER IN A GOOD PLACE
CALLA FIND_SAFEST
MOVE A2,A11
MOVE *A13(DATABLE),A10,L ; RESTORE THE ANIMATION TABLE
JSRP DINOTURN
DINO_FLY_DIE
JAUC DINOWXFER ; START DINO BACK UP
**************************************************************************
* *
* TROG_FLY *
* *
* FLY TROG FROM ONE POINT TO ANOTHER *
* *
* ENTRY *
* A8 TROG OBJECT *
* A9 LOCATION TO GO TO *
* A13 TROG PROCESS *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* XFER'D FROM THE REGULAR TROG PROCESS *
* *
**************************************************************************
TROG_FLY:
CALLA PSTOP ; DON'T GO ANYWHERE, GUY
SLEEP 24 ; WAIT FOR THE CATAPULT TO PUMP
MOVE A9,A3
JRZ TROG_FLY_DIE
MOVB *A13(TTYPE),A0
CMPI TTYPE_SPRING,A0
JRZ TROG_SMACK ; WELCOME TO THE SCREEN
JSRP BOUNCE_TO ; FLY THIS SUCKER
MOVE A8,A0
CALLA SET_ZPOS ; GET A DECENT Z POSITION
TROG_FLY_DIE
JAUC TROGWXFER ; START TROG BACK UP
TROG_SMACK:
MOVE *A13(PROCID),A0,W
CLR A1
NOT A1
CALLA KILALLA8 ; KILL ANY OTHER SPEED UP PROCS
JAUC SMACK_SCREEN ; PASS IT OFF TO SMACK SCREEN
**************************************************************************
* *
* WHEEL_FLY *
* *
* FLY WHEEL FROM ONE POINT TO ANOTHER *
* *
* ENTRY *
* A8 WHEEL OBJECT *
* A9 LOCATION TO GO TO *
* A13 WHEEL PROCESS *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* XFER'D FROM THE REGULAR WHEEL PROCESS *
* *
**************************************************************************
WHEEL_FLY:
CALLA PSTOP ; DON'T ROLL ANYWHERE, STONEHEAD
SLEEP 24 ; WAIT FOR THE CATAPULT TO PUMP
MOVE A9,A3
JRZ WHEEL_FLY_DIE
JSRP BOUNCE_TO ; FLY THIS SUCKER
MOVE *A13(PTEMP1),A0,W
SLL 4,A0
ADDI WHEEL_DIR_TABLE,A0 ; TURN IT AROUND
MOVE *A0,A0,W
MOVE A0,*A13(DDIR),W
MOVE A8,A0
CALLA SET_ZPOS ; GET A DECENT Z POSITION
WHEEL_FLY_DIE
ANDNIM M_NOCOLL,*A8(OFLAGS),W ; TURN WHEEL COLLISIONS BACK ON
JAUC WHLXFER ; START WHEEL ROLLING AGAIN
WHEEL_DIR_TABLE:
.WORD 1,0,3,2
**************************************************************************
* *
* CAT_CYCLE *
* *
* CYCLE THE CATAPULT THROUGH ITS PACES *
* *
* ENTRY *
* A8 CATAPULT OBJECT *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CREATE *
* *
**************************************************************************
CAT_CYCLE:
MOVE *A8(OPLINK),A10,L ; GET THE CATAPULT PROCESS
JRZ CAT_CYCLE_X ; IT MUST HAVE DIED
MOVK 1,A0
MOVE A0,*A10(CATINUSE),W ; FLAG THAT THE CATAPULT IS BUSY
MOVE A8,A9
MOVE *A10(CATHILITE),A8,L ; GET THE HILITE OBJECT
CALLA OBJ_ON ; FORCE ON FOR A FEW TICKS
SLEEP 4
CALLA OBJ_OFF ; TURN IT OFF
MOVE A9,A8
MOVI CATAPULT_ANIM,A9
MOVK 1,A1
JSRP FRANIM ; ANIMATE PLUNGER
CLR A0
MOVE A0,*A10(CATINUSE),W ; TURN IT BACK ON
CAT_CYCLE_X
DIE
**************************************************************************
* *
* BOUNCE ROUTINES *
* *
**************************************************************************
**************************************************************************
* *
* BOUNCE_TO *
* *
* MOVE THE OBJECT FROM HIS CURRENT POINT TO ANOTHER ONE -- THE *
* TARGET POINT IS WHERE HE HITS THE GROUND. THIS IS BASICALLY *
* GNP'S ROUTINE FROM TROGSPRG WITHOUT ALL THE ADDED STUFF FOR *
* TROG'S TO JUMP UP AND DOWN ( ALL ERRORS ADDED BY JKM! ) *
* *
* ENTRY *
* A3 TARGET [ Y,X ] *
* A8 PTR TO OBJECT *
* A13 CONTROLLING PROCESS OF OBJECT *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* JSRP *
* *
**************************************************************************
BOUNCE_TO:
MOVE A3,A4
PUSHP A3
MOVE *A8(OID),A0,W ; WHAT TYPE OF OBJECT FOR CENTERING
SRL 4,A0
SLL 4,A0
CMPI TROGOID,A0 ; IS IT A TROG?
JRNZ BOUNCE_CENT_1
MOVI TROGINIT,A14 ; TROG CENTERING
JRUC BOUNCE_TO_CENTER
BOUNCE_CENT_1
CMPI WHEELOID,A0 ; IS IT A WHEEL?
JRNZ BOUNCE_CENT_2
MOVI WHLINIT,A14 ; WHEEL CENTERING
JRUC BOUNCE_TO_CENTER
BOUNCE_CENT_2
MOVI REXINIT,A14 ; DEFAULT IS A DINO
BOUNCE_TO_CENTER
MOVE *A14(INITIMG),A5,L ;GET THE INITIAL IMAGE PTR
CLR A0
MOVE *A5(ISIZE),A1,L
CALLA GETCENT
SLL 16,A0
MOVY A0,A1
SUBXY A1,A4
MOVE *A5(IANIOFF),A1,L
ADDXY A1,A4 ; A3 = THE POINT WE NEED TO REACH
CALLA GETANIXY
SRL 16,A3
MOVX A3,A2
;
; A2 = CURRENT [ Y,X ]
; A4 = DESTINATION [ Y,X ]
;
; FIGURE OUT DIRECTION ANIMATION
;
MMTM SP,A2,A4
SUBXY A2,A4 ; DEST - CURRENT = A4
PUSH A4 ; SAVE AWAY RESULTS
ABSXY A4
CLR A5
MOVX A4,A5 ; X IN A5
SRL 16,A4
CMP A5,A4 ; X VS. Y
JRGT FIGURE_Y
FIGURE_X:
MOVK LEFT,A11
PULL A4
SLL 16,A4
SRL 16,A4
SEXT A4
JRN DIR_DONE
MOVK RIGHT,A11
JRUC DIR_DONE
FIGURE_Y:
CLR A11
PULL A4
SRL 16,A4
SEXT A4
JRN DIR_DONE
MOVK DOWN,A11
DIR_DONE:
MOVE *A13(DDIR),A9,W ; SAVE THE OLD DIRECTION
MOVE A9,*A13(PTEMP1),W
MOVE A11,*A13(DDIR),W ; STUFF THE NEW DIRECTION
MMFM SP,A2,A4
;
; NOW COMPUTE THE VELOCITIES AND THINGS
;
MMTM SP,A2,A4 ; SAVE AWAY THE LOCATIONS
MOVE A4,A3 ; DESTINATION
MOVE *A13(DDIR),A14,W
SLL 4,A14
ADDI CAT_TIME_TABLE,A14
MOVE *A14,A4,W ; GET THE TIME TO TRAVEL THERE
MOVE A4,A11
CALLA SLINEVEL
MOVE A1,*A8(OXVEL),L
MOVE A2,*A8(OZVEL),L ; GET THE OBJECT ROCKING
;
; GIVE THE GUY SOME ARC
;
MOVI 40000H,A5
MOVE A5,A6
SRL 1,A4
DIVU A4,A5 ; VEL / ( TIME/2 )
MOVE A5,A10 ; DECEL FACTOR
NEG A6
ADD A6,A2
MOVE A2,*A8(OYVEL),L ; SPEED - BASE VEL
MMFM SP,A2,A4
;
; LOOKUP THE APPROPRIATE ANIMATION TABLE FOR FLIGHT
;
MOVE *A13(DDIR),A11,W
SLL 5,A11
MOVI CAT_THROW_DINO_TABLE,A0
MOVE *A8(OID),A14,W
SRL 4,A14
SLL 4,A14
CMPI TROGOID,A14
JRNZ BOUNCE_ADD
MOVI CAT_THROW_TROG_TABLE,A0
BOUNCE_ADD
ADD A0,A11
MOVE *A11,A9,L ; GET THE ANIMATION
MOVE *A13(DDIR),A14,W ; LOOKUP THE FLIGHT TIME AGAIN
SLL 4,A14
ADDI CAT_TIME_TABLE,A14
MOVE *A14,A11,W ; GET THE TIME TO TRAVEL THERE
CALLA TROG_SHADOW_UPDATE ; CREATE A SHADOW
MOVE *A8(OID),A14,W
SRL 4,A14
SLL 4,A14
CMPI WHEELOID,A14
JRZ BOUNCE_WHEEL_FLIGHT ; SPECIAL CASE FOR THE WHEEL'S FLIGHT
CMPI TROGOID,A14
JRNZ DINOSND
SOUND1 TROGFIRE_SND
JRUC SOUNDDONE
DINOSND
SOUND1 FIRE_SND
SOUNDDONE
MOVK 4,A1
JSRP FRANIM
BOUNCE_ASCENT:
SUB A0,A11
JSRP BOUNCE_SLEEP
MOVK 4,A1
JSRP FRANIM
JRNC BOUNCE_ASCENT
MOVE *A13(DDIR),A14,W
MOVK 4,A1
JSRP FRANIM
BOUNCE_DESCENT:
SUB A0,A11
JSRP BOUNCE_SLEEP
MOVK 4,A1
JSRP FRANIM
JRNC BOUNCE_DESCENT
JRUC BOUNCE_LAND
BOUNCE_WHEEL_FLIGHT ; SPECIAL FLIGHT FOR WHEEL
MOVE A11,A0
JSRP BOUNCE_SLEEP ; HANG OUT FOR THE FLIGHT
SOUND1 WHEELHIT_SND
BOUNCE_LAND:
CALLA PSTOP ; STOP ALL THE ACTION
PULLP A1 ; WHERE WE WERE GOING
CALLA FIND_CLOSE_CPNT
MOVE A0,A0
JRZ NOCENTER
MOVE *A0(CMOVEMPTR),A0,L
MOVE *A13(DDIR),A14,W
MOVE *A8(OID),A14,W
SRL 4,A14
SLL 4,A14
CMPI WHEELOID,A14 ; CHECK FOR WHEEL CENTERING
JRNZ BOUNCE_TROG_CENTER
CALLA WHL_CENTER
MOVE A8,A0
CALLA DELSHAD ; DELETE THE SHADOW
CALLA SET_ZPOS ; GET A DECENT Z POSITION
JRUC BOUNCE_WHEEL_DONE
BOUNCE_TROG_CENTER
CMPI TROGOID,A14
JRNZ BOUNCE_DINO_CENTER
CALLA TROG_CENTER ; CENTER UP TROG
JRUC NOCENTER
BOUNCE_DINO_CENTER
CALLA DINO_CENTER ; CENTER UP THE LITTLE DINO
NOCENTER
MOVE A8,A0
CALLA DELSHAD ; DELETE THE SHADOW
CALLA SET_ZPOS ; GET A DECENT Z POSITION
MOVK 1,A1
JSRP FRANIM
BOUNCE_WHEEL_DONE
CLR A1
MOVB A1,*A13(DDIZZYFLG) ;TROG IS BACK ON THE GROUND
RETP
CAT_THROW_DINO_TABLE:
.LONG SPBOING81,SPBOING01,SPBOINGL41,SPBOING41
CAT_THROW_TROG_TABLE:
.LONG TRBOING81,TRBOING01,TRBOINGL41,TRBOING41
CAT_TIME_TABLE:
.WORD 51,57,57,57
**************************************************************************
* *
* BOUNCE_SLEEP *
* *
* SPECIAL SLEEP PROCESS FOR CATAPULTED DINOS -- ADDS Y DECEL *
* FACTOR EVERY TICK *
* *
* ENTRY *
* A0 TICKS TO SLEEP *
* A8 OBJECT *
* A10 DECEL FACTOR *
* A13 PTR TO OBJECT'S PROCESS *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* JSRP *
* *
**************************************************************************
BOUNCE_SLEEP:
MMTM A12,A9,A11
MOVE A0,A11
JRZ BOUNCE_SLEEP_X
BOUNCE_SLEEP_LP:
SLEEP 1
ADDRM A10,*A8(OYVEL),L
DSJS A11,BOUNCE_SLEEP_LP
BOUNCE_SLEEP_X:
MMFM A12,A9,A11
RETP
**************************************************************************
* *
* CK_CAT_CENT *
* *
* CHECK IF OBJECT IS NEAR THE CENTER OF A CATAPULT *
* *
* ENTRY *
* A0 OBJECT *
* A8 CATAPULT OBJECT *
* *
* EXIT *
* NC NOT EVEN CLOSE *
* C CLOSE *
* *
* CALL *
* CALL *
* *
**************************************************************************
CK_CAT_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 [5,5],A2 ; FIX THE RANGE
CALLA PNT_IN_RANGE
MMFM SP,A8,A1,A2,A3
RETS
**************************************************************************
* *
* CATAPULT TABLES *
* *
**************************************************************************
CAT_INIT:
.LONG 0,0
.WORD 0,0
.LONG OING3,[30,30],CATAPULT_COLL
.WORD DMAWNZ,CATOID
CAT_SPOT:
.LONG 0,0
.WORD 0,0
.LONG RADI4,0,DUMCOLL
.WORD DMAWNZ,CATOID
CATAPULT_COLL:
.WORD DINOOID,0FFF0H ; COLLIDE WITH ALL DINOS
.LONG CAT_DINO
.WORD TROGOID,0FFF0H ; COLLIDE WITH THE BROTHERS TROG
.LONG CAT_TROG
.WORD WHEELOID,0FFF0H ; COLLIDE WITH THOSE SILLY ROLLERS
.LONG CAT_WHEEL
.WORD 0
.LONG DUMCRETS ; DO NOTHING
CATAPULT_ANIM:
.LONG OING3
.WORD 4
.LONG OING2
.WORD 4
.LONG OING1
.WORD 4
.LONG OING2
.WORD 4|MAKESOUND
.LONG MEDSPRING_SND
.LONG OING3
.WORD 4
.LONG OING4
.WORD 4
.LONG OING5
.WORD 4
.LONG OING4
.WORD 4
.LONG OING3
.WORD 4
.LONG 0
CAT_SPOT_ANIM
.LONG RADI1
.WORD 8
.LONG RADI2
.WORD 8
.LONG RADI3
.WORD 8
.LONG RADI4
.WORD 8|SCRIPT
.LONG CAT_SPOT_ANIM
;
; CATAPULT TABLE ENTRY FORMAT :
;
; CPNT[Y,X], DIR UP[Y,X], DIR DOWN[Y,X], DIR LEFT[Y,X] DIR RIGHT[Y,X]
;
CAT_TABLE_1:
.LONG [88,66],[120,322],[120,322],[216,98],[216,98]
.LONG [88,322],[120,66],[120,66],[216,290],[216,290]
.LONG [216,66],[184,322],[184,322],[88,98],[88,98]
.LONG [216,322],[184,66],[184,66],[88,290],[88,290]
.LONG 0
;
; SLEEP TIME, CATS ON, 0, CATS OFF, 0
; SLEEP TIME == 0 MEANS START LIST AGAIN
;
CAT_CONTROL_1:
**** .WORD 120,1,4,0,2,3,0 ; 2 ON, 2 OFF
.WORD 120,1,2,3,4,0,0 ; ALL ON, NONE OFF
**** .WORD 120,2,3,0,1,4,0 ; OTHER 2 ON, OTHER 2 OFF
**** .WORD 80,0,1,2,3,4,0 ; ALL OFF
.WORD 0
;
; SOME MUSICAL ENTERTAINMENT
;
MEDSPRING_SND:
.WORD >F310,>10,>80A1,0 ; MEDIUM SPRING SOUND
TROGFIRE_SND:
.WORD >F015,>5D,>8046,0 ; TROG HIT FIRE
WHEELHIT_SND:
.WORD >F050,>10,>801E,0 ; WHEEL HITS THE GROUND