857 lines
19 KiB
NASM
857 lines
19 KiB
NASM
.MLIB "GXMACS.LIB"
|
||
.FILE "GXUNILNK.ASM"
|
||
.TITLE " <<< GENERATION X -- UNIVERSE LINK ROUTINES >>>"
|
||
.WIDTH 132
|
||
.OPTION B,D,L,T
|
||
.MNOLIST
|
||
|
||
**************************************************************************
|
||
* *
|
||
* COPYRIGHT (C) 1992 MIDWAY MANUFACTURING COMPANY. *
|
||
* ALL RIGHTS RESERVED. *
|
||
* *
|
||
**************************************************************************
|
||
|
||
* GET THE SYSTEM STUFF
|
||
.INCLUDE "GX.INC"
|
||
|
||
.BSS RAMLINKS,(MAX_UNIV_OBJS*BLOCK_SIZE)
|
||
.BSS BGHEAD_ACTIVE,32
|
||
.bss UNIV_STACK,MAX_UNI*UNIV_STK_SIZ
|
||
.bss UNIV_SP,32
|
||
.BSS FREE_LINKS,32
|
||
|
||
.bss UNIVPROC,32
|
||
.bss UNIV_ID,16 ; 0 1 2 or 3
|
||
|
||
.bss filler,16 ; to keep long word aligned
|
||
|
||
.TEXT
|
||
.EVEN
|
||
|
||
.DEF ADD_UNIVERSE
|
||
|
||
LEAVE_IT_IN .set 0
|
||
|
||
A_BRANCH:
|
||
calla GETAFARG_LONG
|
||
move a0,*a8(AnimFrm),L
|
||
move a0,*a8(AnimScr),L
|
||
rets
|
||
|
||
*
|
||
* Anim func to see if portal is opening to a new univ.
|
||
*
|
||
* IF NU_FLG == 0 then do nothing, proceed with animation.
|
||
* IF NU_FLG == 1 then check portal state and process
|
||
* IF NU_FLG < 0 then stay on current frame.
|
||
*
|
||
* PORTAL STATES 0 = closed
|
||
* 1 = closing
|
||
* 2 = opening
|
||
* 3 = open
|
||
*
|
||
.if LEAVE_IT_IN==1
|
||
AU_PORTAL_OPEN_CHECK: ; START HERE when doors are open. Pull if was opening
|
||
movk 1,a1 ; Clr DAnim bit if it was opening and is open
|
||
movk 1,a2 ; Mark as closing if you pull it.
|
||
move @NU_FLAG,a14
|
||
jrz PorChkX
|
||
jrn stick
|
||
move *a8(OULINK),a14,L ; link
|
||
movb *a14(MAP_ID+8),a3
|
||
subk 2,a3 ; was it opening?
|
||
jrz pullit ; pull if it's been opening
|
||
movk 1,a2 ; otherwise, mark it as closing
|
||
movb a2,*a14(MAP_ID+8)
|
||
rets
|
||
*
|
||
pullit:
|
||
movb a2,*a14(MAP_ID+8) ; opening becomes open, closing becomes closed
|
||
move *a8(AnimFrm),a0,L
|
||
or a1,a0 ; set ANIM and possibly DANIM
|
||
move a0,*a14(MAP_IMG),L
|
||
calla PULL_ANIM
|
||
PorChkX:
|
||
rets
|
||
|
||
stick:
|
||
move *a8(AnimFrm),a0,L
|
||
subi 50h,a0
|
||
move a0,*a8(AnimFrm),L
|
||
rets
|
||
|
||
AU_PORTAL_CLOSE_CHECK: ; START HERE when doors are open
|
||
movk 3,a1 ; Set DAnim bit if it was closing and is closed
|
||
movk 2,a2 ; Mark as opening if you pull it
|
||
move @NU_FLAG,a14
|
||
jrz PorChkX
|
||
jrn stick
|
||
move *a8(OULINK),a14,L ; link
|
||
movb *a14(MAP_ID+8),a3 ; if closing, pull it
|
||
subk 1,a3 ; was it closing?
|
||
jrz pullit ; pull if it's been closing
|
||
movk 2,a2 ; otherwise, mark it as opening
|
||
movb a2,*a14(MAP_ID+8)
|
||
goon:
|
||
rets
|
||
|
||
|
||
.else
|
||
****>>>
|
||
*
|
||
* WHEN A PORTAL IS ENTERED, IT OPENS and THE DANIM FLAG GETS CLEARED
|
||
* THE OBJECT WILL GET DELETED IN THIS STATE. WHEN WE RETURN TO THE
|
||
* UNIVERSE THE PORTAL OBJECT WILL GET RECREATED WITH ITS DANIM OFF SO
|
||
* THE ANIMATION WILL BEGIN IMMEDIATELY. IN THIS CASE (DANIM off AND
|
||
* PORTAL on), UPDATE_UNIV WILL START THE ANIMATION AT THE PROPER PLACE.
|
||
* (i.e. closing)
|
||
*
|
||
* In other words, when a universe object is created by UPDATE_UNIV,
|
||
* IF it is a PORTAL and the DANIM bit is OFF, then the script is started
|
||
* at an offset which is found in the lower 16 bits of MAP_SPAREL1.
|
||
*
|
||
* I have deemed this technique better than rewriting MAP_IMG with a
|
||
* new script start
|
||
*
|
||
*
|
||
****>>>
|
||
|
||
********************************************************
|
||
*
|
||
* This simply marks the portal as opening or closing
|
||
*
|
||
AU_PORTAL_START:
|
||
move *a8(OULINK),a5,L
|
||
movb *a5(MAP_ID+8),a3
|
||
xori 2,a3
|
||
movb a3,*a5(MAP_ID+8) ; from closed to opening or open to closing
|
||
rets
|
||
|
||
|
||
********************************************************
|
||
*
|
||
* This marks the portal as open and sets the offset of the animation
|
||
* sequence for when the portal gets recreated
|
||
*
|
||
AU_PORTAL_SET_OPEN:
|
||
move *a8(OULINK),a1,L
|
||
move *a1(MAP_X),a14,L
|
||
sra 14,a14 ; save 2 bits of fraction
|
||
move a14,*a1(MAP_SPAREL1+10h),W ; for sliding portals
|
||
move *a8(OXVAL),*a1(MAP_X),L
|
||
move *a8(AnimFrm),a2,L
|
||
move *a8(AnimScr),a3,L
|
||
sub a3,a2
|
||
move a2,*a1(MAP_SPAREL1),W ; store offset from frame
|
||
MOVKB 3,*a1(MAP_ID+8) ; mark as open
|
||
jauc PULL_ANIM ; DANIM bit is clear so it automatically
|
||
; starts when universe is exited
|
||
|
||
********************************************************
|
||
*
|
||
* This marks the portal as closed and sets the offset of the animation
|
||
* sequence for when the portal gets recreated
|
||
*
|
||
AU_CHANGE_PAL_SET_CLOSED:
|
||
calla GETAFARG_LONG
|
||
calla CHANGE_PAL
|
||
AU_PORTAL_SET_CLOSED:
|
||
move *a8(OULINK),a1,L
|
||
clr a14
|
||
movb a14,*a1(MAP_ID+8) ; mark as closed
|
||
move *a1(MAP_SPAREL1+10h),a14,W ; for sliding portals
|
||
sll 14,a14 ; restore 2 bits of fraction
|
||
move a14,*a8(OXVAL),L ; for sliding portals
|
||
move a14,*a1(MAP_X),L ; for sliding portals
|
||
move *a1(MAP_IMG),a2,W
|
||
ori M_IF_DANIM,a2
|
||
move a2,*a1(MAP_IMG),W ; just need to operate on word to change flag
|
||
jauc PULL_ANIM ; DANIM bit is set so it doesn't automatically
|
||
; start if it scrolls off and back on.
|
||
|
||
|
||
.endif
|
||
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* AU_CHANGE_MAP_IMG *
|
||
* *
|
||
**************************************************************************
|
||
AU_CHANGE_MAP_IMG:
|
||
calla GETAFARG_LONG ; new sequence or image pointer in a0
|
||
move *a8(OULINK),a14,L ; link
|
||
move a0,*a14(MAP_IMG),L
|
||
jauc PULL_ANIM
|
||
|
||
|
||
AU_ELEV_OPEN:
|
||
calla GETAFARG_LONG ; new sequence or image pointer in a0
|
||
move *a8(OULINK),a14,L ; link
|
||
move a0,*a14(MAP_IMG),L
|
||
|
||
move *a14(MAP_X),a1,L ;
|
||
sra 14,a1 ; save 1st bit of fraction
|
||
move a1,*a14(MAP_SPAREL1+10h),W ; for elevator
|
||
move *a8(OXVAL),*a14(MAP_X),L
|
||
|
||
jauc PULL_ANIM
|
||
|
||
|
||
AU_ELEV_CLOSED:
|
||
calla GETAFARG_LONG ; new sequence or image pointer in a0
|
||
move *a8(OULINK),a14,L ; link
|
||
move a0,*a14(MAP_IMG),L
|
||
|
||
move *a14(MAP_SPAREL1+10h),a1,W ; for elevator
|
||
sll 14,a1 ; restore 1st bit of fraction
|
||
move a1,*a8(OXVAL),L ; for elevator
|
||
move a1,*a14(MAP_X),L ; for elevator
|
||
|
||
jauc PULL_ANIM
|
||
|
||
|
||
********************************************************************
|
||
* *
|
||
* LINKED LIST ROUTINES *
|
||
* *
|
||
********************************************************************
|
||
|
||
|
||
INIT_LINKED_LIST:
|
||
movi MAX_UNIV_OBJS,a3 ; number of free links to create
|
||
clr a4 ; prev
|
||
movi RAMLINKS,a0 ; curr
|
||
move a0,a1 ; almost next
|
||
iniloop:
|
||
addi BLOCK_SIZE,a1 ; next
|
||
move a1,*a0(MAP_NEXT),L
|
||
move a4,*a0(MAP_PREV),L
|
||
move a0,a4 ; curr becomes prev
|
||
move a1,a0 ; next becomes curr
|
||
dsjs a3,iniloop
|
||
;
|
||
; Free list is now linked. Set the free list header.
|
||
;
|
||
movi RAMLINKS,a3
|
||
move a3,@FREE_LINKS,L
|
||
move a4,*a3(MAP_PREV),L ; make adjustments to last and first
|
||
move a3,*a4(MAP_NEXT),L ; so list is circular
|
||
|
||
rets
|
||
|
||
********************************************************
|
||
*
|
||
* a8 = pointer to first obj entry in ROM table
|
||
* a9 = number of objects
|
||
* a10 = Z offset (lo res)
|
||
* a11 = Y offset
|
||
*
|
||
* Use to add a universe to an existing set of BG BLOCKS
|
||
ADD_UNIVERSE:
|
||
move @BGHEAD_ACTIVE,a1,L ; first dummy link
|
||
move *a1(MAP_PREV),a0,L ; last dummy link
|
||
move *a0(MAP_PREV),a1,L ; where to start inserting
|
||
move @UNIV_ID,a4
|
||
jruc add_uni_hk
|
||
|
||
|
||
********************************************************
|
||
*
|
||
* a8 = pointer to first obj entry in ROM table
|
||
* a9 = number of objects
|
||
* a10 = Z offset (lo res)
|
||
* a11 = Y offset
|
||
*
|
||
CREATE_UNIVERSE:
|
||
;
|
||
; Create active universe list
|
||
;
|
||
; a14 is the pointer to the Z sorted universe list.
|
||
; The list must always contain a dummy object at start and end.
|
||
; First dummy object: MAP_OBJ = 0
|
||
; MAP_Z = 80000000h (most negative number)
|
||
; Second dummy object: MAP_OBJ = 0ffffffffh
|
||
; MAP_Z = 7fffffffh (most postive number)
|
||
;
|
||
move @UNIV_ID,a4
|
||
movi BGHEAD_ACTIVE,a14
|
||
callr GET_FREE_LINK ; new link in a0
|
||
LOCKON Z
|
||
move a0,*a0(MAP_NEXT),L
|
||
move a0,*a0(MAP_PREV),L
|
||
move a0,*a14,L
|
||
|
||
move a0,a1
|
||
callr GET_FREE_LINK ; new one appended to original
|
||
LOCKON Z
|
||
callr APPLINK
|
||
|
||
clr a14
|
||
move a14,*a1(MAP_OBJ),L ; obj = 0 for first link
|
||
dec a14
|
||
move a14,*a0(MAP_OBJ),L ; obj = -1 for last link
|
||
movi 80000000h,a14
|
||
move a14,*a1(MAP_Z),L ; most negative (1st link)
|
||
dec a14
|
||
move a14,*a0(MAP_Z),L ; most positive (last link)
|
||
move a4,*a1(MAP_ID)
|
||
move a4,*a0(MAP_ID)
|
||
*
|
||
* transfer ROM table to RAM linked list
|
||
*
|
||
add_uni_hk: ;
|
||
move a9,a5 ; original count
|
||
srl 2,a9 ; create in 4 ticks
|
||
move a9,a3
|
||
sll 2,a3 ; (( orig>>2 ) <<2 )
|
||
sub a3,a5 ; add remainder into 1st loop
|
||
add a9,a5 ; a5 is local loop count
|
||
CrUni1:
|
||
move @UNIV_ID,a4
|
||
movi 80000000h,a2 ; stuff all objs with this
|
||
CrUni0:
|
||
callr GET_FREE_LINK ; new link in a0
|
||
LOCKON Z
|
||
move *a1(MAP_NEXT),a14,L ; START APPLINK
|
||
move a0,*a1(MAP_NEXT),L
|
||
move a14,*a0(MAP_NEXT),L
|
||
move a0,*a14(MAP_PREV),L
|
||
move a1,*a0(MAP_PREV),L ; END APPLINK
|
||
move a0,a1 ; save for next APPLINK
|
||
move a2,*a0(MAP_OBJ),L
|
||
move a4,*a0(MAP_ID) ; JUST universe ID, DAMAGE LEVEL IS ZERO
|
||
move *a8+,*a0+,L ; xfer IMG,X,Y,Z & flags
|
||
move *a8+,*a0+,L
|
||
move *a8+,a14,L
|
||
sub a11,a14 ; adjust Y (for prev univ)
|
||
move a14,*a0+,L
|
||
move *a8+,a14,L
|
||
add a10,a14 ; adjust Z (for prev univ)
|
||
move a14,*a0+,L
|
||
move *a8+,*a0+
|
||
dsj a5,CrUni0
|
||
|
||
mmtm a12,a1,a3
|
||
sleep 1
|
||
mmfm a12,a1,a3
|
||
move a9,a5
|
||
sub a9,a3
|
||
jrnz CrUni1
|
||
|
||
RETP
|
||
|
||
|
||
********************************************************
|
||
*
|
||
* a0 = new link (0 if error)
|
||
* b0,b1,b14 trashed
|
||
*
|
||
GET_FREE_LINK:
|
||
move @FREE_LINKS,a0,L
|
||
move a0,b0
|
||
move *b0(MAP_NEXT),b14,L
|
||
cmp b14,b0
|
||
jreq nofree
|
||
move *b0(MAP_PREV),b1,L
|
||
move b1,*b14(MAP_PREV),L
|
||
move b14,*b1(MAP_NEXT),L
|
||
move b14,@FREE_LINKS,L
|
||
rets
|
||
|
||
nofree:
|
||
clr a0
|
||
rets
|
||
|
||
|
||
********************************************************
|
||
*
|
||
* UNLINK_LINK
|
||
*
|
||
* General Purpose routine to remove a UNIV RAM LINK.
|
||
* THIS ROUTINE DOES NOT PLACE THE LINK ON THE FREE LIST!
|
||
*
|
||
* a0 = link to remove from its neighbors
|
||
* trashes b0, b1 and b14
|
||
*
|
||
UNLINK_LINK:
|
||
move a0,b0
|
||
move *b0(MAP_NEXT),b14,L
|
||
move *b0(MAP_PREV),b1,L
|
||
move b1,*b14(MAP_PREV),L
|
||
move b14,*b1(MAP_NEXT),L
|
||
rets
|
||
|
||
|
||
************************************************************
|
||
* Take a universe obj and remove its connection to
|
||
* the universe, making it a regular object
|
||
*
|
||
* a8 = OBJECT BLOCK
|
||
*
|
||
BG_TO_FG:
|
||
MOVE *A8(OULINK),A0,L
|
||
jrz already_fg
|
||
CLR A14
|
||
MOVE A14,*A8(OULINK),L
|
||
|
||
********************************************************
|
||
*
|
||
* a0 = link to return to Free Universe Link list
|
||
*
|
||
|
||
REMOVE_AND_FREE_LINK:
|
||
|
||
.if DEBUG
|
||
MOVE *A0(MAP_OBJ),A14,L
|
||
JRN RAFL_NO_OBJ ;BR=NO OBJECT ALLOCATED
|
||
SRL 4,A14
|
||
SLL 4,A14
|
||
MOVE *A14(OULINK),A14,L ;THE LINK SHOULD BE ZERO
|
||
LOCKON NZ
|
||
.endif
|
||
RAFL_NO_OBJ:
|
||
|
||
|
||
callr UNLINK_LINK
|
||
move @RAMREF0,a14,L ; are we removing RAMREF0?
|
||
cmp a0,a14
|
||
jrne noadj0
|
||
move *a0(MAP_NEXT),a14,L ; if so, point to next one
|
||
move a14,@RAMREF0,L
|
||
noadj0:
|
||
move @RAMREF1,a14,L ; are we removing RAMREF1?
|
||
cmp a0,a14
|
||
jrne RETURN_TO_FREE
|
||
move *a0(MAP_NEXT),a14,L ; if so, point to next one
|
||
|
||
move a14,@RAMREF1,L ; FALL THROUGH TO RETURN_TO_FREE
|
||
|
||
********************************************************
|
||
*
|
||
* a0 = Universe link to return to list of free universe links
|
||
* trashes a14
|
||
*
|
||
RETURN_TO_FREE:
|
||
PUSH a1
|
||
;WFD start 5/23/1994
|
||
CLR A14
|
||
NOT A14
|
||
; MOVI -1,A14
|
||
MOVE A14,*A0(MAP_IMG),L ;FLAG ON FREE LIST
|
||
;WFD end 5/23/1994
|
||
move @FREE_LINKS,a1,L
|
||
callr INSLINK ;
|
||
move a0,@FREE_LINKS,L
|
||
PULLQ a1
|
||
already_fg:
|
||
rets
|
||
|
||
|
||
********************************************************
|
||
*
|
||
* a0 = universe link to be inserted into current universe list
|
||
* trashes a1,b0,b1,b4,b5,b14,a14
|
||
*
|
||
INSERT_LINK:
|
||
move a0,b0
|
||
move @BGHEAD_ACTIVE,b1,L
|
||
move b1,b14
|
||
move *b0(MAP_Z),b4,L ; Z of new block
|
||
|
||
illoop:
|
||
move *b1(MAP_Z),b5,L ; Z of next block
|
||
cmp b5,b4
|
||
jrlt found_insert
|
||
move *b1(MAP_NEXT),b1,L
|
||
cmp b1,b14 ; have we looped to beginning?
|
||
jrne illoop ; (This should never happen)
|
||
|
||
found_insert:
|
||
move b1,a1
|
||
callr INSLINK ; new link goes before current.
|
||
;WHY? move *a0(MAP_PREV),a5,L
|
||
|
||
move @RAMREF0,b5,L
|
||
cmp b1,b5
|
||
jrne noupd0
|
||
move b0,@RAMREF0,L ; RAMREF0 becomes new one
|
||
noupd0:
|
||
rets
|
||
|
||
|
||
*
|
||
* a0 = link to insert
|
||
* a1 = link to insert in front of
|
||
* trashes a14
|
||
INSLINK:
|
||
move *a1(MAP_PREV),a14,L
|
||
move a0,*a1(MAP_PREV),L
|
||
move a14,*a0(MAP_PREV),L
|
||
move a0,*a14(MAP_NEXT),L
|
||
move a1,*a0(MAP_NEXT),L
|
||
rets
|
||
|
||
*
|
||
* a0 = link to insert
|
||
* a1 = link to insert after
|
||
* trashes a14
|
||
*
|
||
APPLINK:
|
||
move *a1(MAP_NEXT),a14,L
|
||
move a0,*a1(MAP_NEXT),L
|
||
move a14,*a0(MAP_NEXT),L
|
||
move a0,*a14(MAP_PREV),L
|
||
move a1,*a0(MAP_PREV),L
|
||
rets
|
||
|
||
|
||
********************************************************
|
||
*
|
||
* This routine deletes all objects associated with universe links.
|
||
*
|
||
* It will not retain hit count in MAP_OBJ
|
||
*
|
||
RMV_OBJS_FROM_UNIVERSE:
|
||
mmtm sp,a0,a1,a2
|
||
movi 80000000h,a1
|
||
move @BGHEAD_ACTIVE,a2,L
|
||
chknxt:
|
||
move *a2(MAP_NEXT),a2,L
|
||
move *a2(MAP_OBJ),a0,L
|
||
jrz endolist
|
||
jrn chknxt
|
||
srl 4,a0
|
||
sll 4,a0
|
||
calla ZAPOBJ
|
||
move a1,*a2(MAP_OBJ),L
|
||
jruc chknxt
|
||
endolist:
|
||
mmfm sp,a0,a1,a2 ; link returned in a0
|
||
rets
|
||
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DELETE_UNIVERSE - DELETE ALL UNIVERSE LINKS AND OBJECTS *
|
||
* *
|
||
**************************************************************************
|
||
|
||
DELETE_UNIVERSE:
|
||
mmtm sp,a0,a1,a2
|
||
movi 80000000h,a1
|
||
move @BGHEAD_ACTIVE,a2,L
|
||
DU_chknxt:
|
||
move *a2(MAP_NEXT),a2,L
|
||
MOVE A2,A0
|
||
CALLR REMOVE_AND_FREE_LINK
|
||
move *a2(MAP_OBJ),a0,L
|
||
jrz DU_endolist
|
||
jrn DU_chknxt
|
||
srl 4,a0
|
||
sll 4,a0
|
||
calla ZAPOBJ
|
||
move a1,*a2(MAP_OBJ),L
|
||
jruc DU_chknxt
|
||
DU_endolist:
|
||
mmfm sp,a0,a1,a2 ; link returned in a0
|
||
rets
|
||
|
||
|
||
|
||
*
|
||
* Returns number of Links which make up the universe in a0
|
||
* Returns number of Objects from universe links in a2
|
||
*
|
||
GET_UNIVERSE_SIZE:
|
||
move @BGHEAD_ACTIVE,a14,L
|
||
clr a0
|
||
clr a2
|
||
move a14,a1
|
||
grslp:
|
||
move *a1(MAP_NEXT),a1,L
|
||
inc a0
|
||
move *a1(MAP_OBJ),a3,L
|
||
jrz noobj
|
||
jrn noobj
|
||
inc a2
|
||
noobj:
|
||
cmp a1,a14
|
||
jrne grslp
|
||
subk 2,a0 ; dummy head and tail
|
||
CO_ABORT:
|
||
rets
|
||
|
||
|
||
********************************************************
|
||
*
|
||
* a7 = link
|
||
* return: a0 = object
|
||
*
|
||
* THRASHES ALMOST EVERYTHING!
|
||
*
|
||
CREATE_OBJ_FROM_LINK:
|
||
MOVE A7,B14
|
||
|
||
ADDI MAP_X,B14
|
||
|
||
MMFM B14,B0,B1,B2 ;B2 = X WORLD
|
||
;B1 = Y WORLD
|
||
; MOVE @ZBASE,B3,L
|
||
; SUB B3,B0 ;B0 = Z WORLD
|
||
|
||
MOVE *A7(MAP_OBJ),A1,L ;GET CURRENT LIST FLAGS
|
||
LOCKON NN
|
||
|
||
CALLA GETOBJ
|
||
JRZ CO_ABORT ;BR=NO OBJECT BLOCK AVAILABLE
|
||
MOVE A0,A11
|
||
|
||
CALLA CLRODATA
|
||
|
||
MOVE A0,*A7(MAP_OBJ),L ;PUT IN LIST
|
||
|
||
MOVE *A7(MAP_IMG),A1,L ;A1 - OIMG/ANIM SCRIPT
|
||
|
||
;WFD start 5/23/1994
|
||
JRZ CO_BOGUS ;BR=BOGUS IMG
|
||
JRNN CO_GO ;BR=VALID IMG
|
||
CO_BOGUS
|
||
CLR A0 ;BOGUS IMG
|
||
RETS
|
||
CO_GO
|
||
;WFD end 5/23/1994
|
||
|
||
MOVE *A7(MAP_FLAGS),A3,W ;GET BLOCK FLAGS
|
||
|
||
MOVE A3,A5 ;GET OID SUB-TYPE
|
||
SLL 21,A5
|
||
SRL 27,A5
|
||
SLL 2,A5
|
||
MOVE A5,A6
|
||
ORI OID_UNIV,A6
|
||
|
||
BTST B_BF_PORTAL,a3
|
||
jrz CO_nxtchk ;BR=NOT A PORTAL
|
||
movi PORTAL_GUNVECT,a14
|
||
jruc CO_SETVECT
|
||
CO_nxtchk:
|
||
BTST B_BF_NOVECT,A3 ;TEST NOVECTOR FLAG
|
||
JRNZ CO_NOVECT
|
||
|
||
SLL 4,A5 ;GET OFFSET INTO TABLE
|
||
JRNZ CO_GETVECT ;BR=GET TABLE VECTOR
|
||
CO_DUMVECT
|
||
ANDNI MASK_SUPP,A6 ;CLEAR SUPP LIST
|
||
; TO REDUCE TIME DURING COLLISION CHECK
|
||
MOVI DUMRETS,A14 ;SET DUM GUN VECTOR
|
||
JRUC CO_SETVECT
|
||
CO_GETVECT
|
||
MOVE @WVT_PTR,A14,L
|
||
ADD A5,A14 ;SET TABLE ADDRESS
|
||
MOVE *A14+,A5,L ;GET COLLISION VECTOR
|
||
JRZ CO_DUMVECT ;BR=DUM VECTOR
|
||
MOVE A5,*A0(OCVECT),L ;SET OCVECT
|
||
MOVE *A14,A14,L ;GET GUN VECTOR
|
||
CO_SETVECT
|
||
MOVE A14,*A0(OGUNVECT),L ;SET OGUNVECT
|
||
CO_NOVECT
|
||
MOVE A6,*A0(OID),W ;SET OID
|
||
|
||
MOVE A3,A5
|
||
SLL 31,A5 ;ANDI M_NOSCALE,A5
|
||
SRL 31,A5
|
||
ORI M_OFSCRN,A5 ;ADD DEFAULT FLAGS
|
||
MOVE A5,*A0(OFLAGS),W
|
||
|
||
MOVE A1,A5
|
||
SRL 4,A1
|
||
SLL 4,A1
|
||
|
||
BTST B_IF_DAM,A5
|
||
JRZ CO_NO_DAM ;BR=NO DAMAGE TABLE
|
||
*
|
||
* HANDLE DAMAGE
|
||
*
|
||
MOVE *A1,A1,L ;GET FRAME OF DAMAGE SEQUENCE
|
||
ANDI M_IF_DANIM,A5
|
||
OR A1,A5
|
||
SRL 4,A1
|
||
SLL 4,A1
|
||
CO_NO_DAM
|
||
BTST B_BF_ENEMY,A3
|
||
JRZ CO_NOENEMY ;BR=NOT AN ENEMY GENERATOR
|
||
*
|
||
* HANDLE ENEMY
|
||
*
|
||
CO_ENEMY
|
||
MOVE A1,*A0(OENEMYANIM),L ;SAVE FOR LATER
|
||
MOVE @ENEMYDATA,A14,L
|
||
MOVE A0,*A14+,L ;STUFF ADDRESS
|
||
MOVE A14,B5 ;SAVE FOR NEXT GUY
|
||
JRUC CO_GET_IMG
|
||
CO_NOENEMY
|
||
BTST B_IF_SEQ,A5
|
||
JRZ CO_NO_ANIM ;BR=AN IMG
|
||
CO_ANIM
|
||
BTST B_IF_DANIM,A5
|
||
JRNZ CO_GET_IMG ;BR=SPECIAL DANIM CASE
|
||
|
||
btst B_BF_PORTAL,a3
|
||
jrz UV_SKP_FRMADJ
|
||
move a1,a14 ; move script start to a14
|
||
move *a7(MAP_SPAREL1),a1,W ; delta
|
||
add a14,a1 ; frame start in a1
|
||
calla STRTANIM_OFF
|
||
jruc CO_NORM_ANIM
|
||
UV_SKP_FRMADJ:
|
||
|
||
CALLA STRTANIM
|
||
CO_NORM_ANIM
|
||
MOVE @WAVEDISPS,A14,W ;SYNC ANIMS
|
||
ANDI 15,A14 ;MASK OUT LOW 4 BITS
|
||
SUBK 16,A14 ;GET TIME TIL NEXT 16TH COUNT
|
||
NEG A14
|
||
MOVB A14,*A0(AnimSlp)
|
||
CO_GET_IMG
|
||
MOVE *A1,A1,L ;A1 - OIMG
|
||
CO_NO_ANIM
|
||
MOVE *A1(ICMAP),A0,L
|
||
CALLA GETFPAL
|
||
JRNZ CO_PAL_AVAIL ;BR=PALETTE NOT D'ARE
|
||
; LOCKON
|
||
CLR A0
|
||
MOVE A0,A5
|
||
CALLA INC_PALCNT
|
||
CO_PAL_AVAIL
|
||
MOVE A0,A4 ;A4 - OCONST|OPAL
|
||
MOVE A11,A0
|
||
|
||
MOVE A7,*A0(OULINK),L ;STORE LIST POINTER ADDRESS
|
||
|
||
MOVE A1,A7
|
||
|
||
.if ICTRL != 0
|
||
addk ICTRL,a7
|
||
.endif
|
||
|
||
MOVE *A7+,A10,W ;A10 - ICTRL
|
||
MOVE *A7+,A5,L ;A5 - ISIZE
|
||
MOVE *A7+,A8,L ;A8 - ISAG
|
||
MOVE *A7,A11,L ;A11 - IANIP
|
||
|
||
ANDI M_FLIPV|M_FLIPH,A3 ;MASK OUT NON-DMA FLAGS
|
||
ADD A3,A10 ;ADD TO ICTRL
|
||
ADDI DMAWNZ,A10 ;ADD DEFAULT PIXOP AND GO
|
||
SLL 16,A10 ;A10 - OCTRL|OFSET
|
||
|
||
MOVE A11,*A0(OUANIOFF),L ;A11 - OANIOFF
|
||
|
||
MOVI 01000100H,A3 ;A3 - OSCALE
|
||
MOVE A3,A7
|
||
SLL 2,A7 ;A7 - ODAG
|
||
MOVE A5,A6 ;A6 - OUSIZE
|
||
|
||
MOVE A0,A14
|
||
ADDI OIMG+020H,A14
|
||
MMTM A14,A1,A3,A4,A5,A6,A7,A8,A10,A11 ;A1 - OIMG
|
||
;A3 - OSCALE
|
||
;A4 - OCONST|OPAL
|
||
;A5 - OSIZE
|
||
;A6 - OUSIZE
|
||
;A7 - ODAG
|
||
;A8 - OSAG
|
||
;A10 - OCTRL|OFSET
|
||
;A11 - OANIOFF
|
||
MOVE A0,B14
|
||
ADDI OZVAL+020H,B14
|
||
MMTM B14,B0,B1,B2 ;B0 - OZVAL
|
||
;B1 - OYVAL
|
||
;B2 - OXVAL
|
||
MOVE B5,@ENEMYDATA,L
|
||
JAUC INSOBJ
|
||
|
||
********************************************************
|
||
*
|
||
* PushUniverse
|
||
*
|
||
* When portaling into another universe, PushUniverse will save
|
||
* all pertinent info about the current universe on the universe stack.
|
||
* (It also increments UNIV_ID which gets stored with each link).
|
||
*
|
||
* a5 = Y pos of portal zoom point
|
||
* a6 = X pos of portal zoom point
|
||
* a11 = SCROLL TABLE containing
|
||
*
|
||
* UNIV_SP -> a0 +0 BGHEAD (ptr to RAMLIST)
|
||
* +20 YBASE (to return to when exiting portal)
|
||
* +40 XBASE (ditto)
|
||
* +60 YWORLD
|
||
* +80 ZBASE_HR (ditto)
|
||
* +a0 Z of portal
|
||
* +c0 YHALF
|
||
* +e0 ZFAR
|
||
* +100 SKYCOLOR
|
||
* +110 GRNDCOLOR
|
||
* +120 X of portal (point to zoom in on)
|
||
* +140 Y of portal (point to zoom in on)
|
||
* +160 XSACCEL
|
||
* +180 YSACCEL
|
||
* +1a0 ZSACCEL
|
||
* +1c0 XSCROLL
|
||
* +1e0 YSCROLL
|
||
* +200 ZSCROLL
|
||
* +220 YREL_OFF
|
||
* +240 ZREL_OFF
|
||
*
|
||
PushUniverse:
|
||
move @UNIV_ID,a14
|
||
inc a14
|
||
cmpk MAX_UNI,a14 ; can't have a UNIV ID of 5 (too big)
|
||
jrge NoCanDo ;
|
||
move a14,@UNIV_ID
|
||
|
||
move @UNIV_SP,a0,L
|
||
|
||
MOVE @ZREL_OFF,A1,L
|
||
MOVE @YREL_OFF,A2,L
|
||
|
||
movi XSCROLL,a4
|
||
mmfm a4,a3,a7,a8
|
||
mmtm a0,A1,A2,a3,a7,a8
|
||
|
||
movi XSACCEL,a4
|
||
mmfm a4,a1,a2,a3
|
||
mmtm a0,a1,a2,a3,a5,a6
|
||
|
||
move @SKYCOLOR,a1
|
||
move @GROUNDCOLOR,a2
|
||
sll 16,a2
|
||
movx a1,a2
|
||
move @ZFAR,a3,L
|
||
move @YHALF,a4
|
||
mmtm a0,a2,a3,a4
|
||
|
||
move @ZBASE_HR,a1,L
|
||
move @YWORLD,a2,L
|
||
move @XBASE,a3,L
|
||
move @YBASE,a4,L
|
||
move @BGHEAD_ACTIVE,a5,L
|
||
mmtm a0,a1,a2,a3,a4,a5
|
||
|
||
|
||
|
||
subk 20h,a0 ; placeholder for ZPORTAL
|
||
move a0,@UNIV_SP,L
|
||
clrc
|
||
rets
|
||
|
||
NoCanDo:
|
||
setc ; can't
|
||
rets
|
||
|
||
.END
|
||
|