1073 lines
26 KiB
NASM
1073 lines
26 KiB
NASM
.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
|
||
|
||
|
||
|