revolution-x/GXKERRI.ASM

796 lines
16 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 "GXMACS.LIB"
.FILE "GXKERRI.ASM"
.TITLE "<<< GENERATION X -- The lovely Kerri Hoskins >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1994 MIDWAY MANUFACTURING COMPANY. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
* GET THE SYSTEM STUFF
.INCLUDE "GX.INC"
.INCLUDE "IMGTBL.GLO"
.INCLUDE "GXKLUDGE.H"
.include gxkerri.tbl
***** In this file
.DEF PROC_KERRI_KISS, AU_CREATE_KERRI_FLOSS
.DEF KERCAGE_COLLVECT, KERCAGE_GUNVECT
.DEF RN3B01, RN3B02, RN3B03, RN3B04, RN3B05, RN3B06, RN3B07
.DEF RN3B08
***** From GXAFUNC.ASM
.REF A_STAY_TIL_GRND_HIT, A_Set_LOOP_STRT, A_Set_Var_Word
.REF A_CLR_OYVEL, A_STAY_TIL_SY_LT, A_STAY_TIL_OFFSCRN
***** From GXRAM.ASM
.REF KISSING_KERRI
***** From GXUNISEQ.ASM
.REF dn1b,dn5b
***** From GXUNIFX.ASM
.REF KCAGE_EXPLO_INIT
***** From GXUNIV1.ASM
.REF BOX_CHECK_OBJ2
***** From GXPLAYER.ASM
.REF VALID_PLAYER, PLAYER_AWARD_GIRL
***** From GXJUNGLE.ASM
.REF MAKE_VIDCAM_SND
***** From GXDESK.ASM
.REF DGV_FRAG_SPARK
***** From GXUNIJP2.ASM
.REF METAL_GUNVECT
***** From GXBEEK2.ASM
.REF KERRI_RUNAWAY_ANIM
*
* Object data field
*
OGIRL_RESCUER .EQU OU_ODATA ;UHL Player that free'd Kerri
OKERRI_SEAT .EQU OU_ODATA+20H ;UHL This is the seat she's in
**************************************************************************
* *
* PROC_KERRI_KISS *
* *
* Process to create a pop-up kissing Kerri. *
* *
* A11 = Ptr to player data area that she is going to kiss *
* *
**************************************************************************
PROC_KERRI_KISS
MOVE @KISSING_KERRI,A14,W
JRZ PKK_KAN_KISS ;BR = No other Kissing Kerri's
SLOOP 5,PROC_KERRI_KISS
PKK_KAN_KISS
MOVI KERRI_KISS_INIT,B0
CALLA MULTIMAKE
JAZ SUCIDE ;BR = We couldn't get one
MOVE *A11(PHITBOXUL),A1,W
MOVE *A11(PHITBOXLR),A2,W
SUB A1,A2
SRA 1,A2 ;Make her pop in the middle of player
ADD A2,A1
ADDXYI (256+130) << 16,A1
MOVI -60000000H,A2
CALLA SET_SCRNOBJ
CLR A14
MOVE A14,*A8(OCVECT),L
MOVE A14,*A8(OGUNVECT),L ;Clear vectors for sure
MOVKM 1,@KISSING_KERRI,W
CALLA INSERT_OBJ
DIE
**************************************************************************
* *
* A_BIG_KISS_SOUND *
* *
* What to say, what to say. *
* *
* A8 = ptr to speaking part *
* *
**************************************************************************
A_BIG_KISS_SOUND
MOVE @GAME_STATE,A14,W
CMPI INGAME,A14
JREQ ABKS_BONUS_SND
SOUND1 SND_THANK_YOU
MOVIB 25,*A8(AnimSLP)
RETS
ABKS_BONUS_SND
SOUND1 SND_BEST
MOVIB 50,*A8(AnimSLP)
RETS
*
* Init table for pop-up kissing Kerri
*
KERRI_KISS_INIT
.BYTE 3, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.LONG CUKRKIS_P
.WORD OID_JUNK, 0
* .long IMG
* .word OCTRL, OFLAGS, OZOFF, OPTION_BITS
LWWWW CUKERKIS2A, DMAWNZ, M_SCRNOBJ|M_NOSCALE, 0, OM_ANIM
.LONG KERRI_KISS_ANIM
LWWWW CUKERKIS2B, DMAWNZ, M_SCRNOBJ|M_NOSCALE, 0, 0
LWWWW CUKERKIS2C, DMAWNZ, M_SCRNOBJ|M_NOSCALE, 0, 0
*
* Pop-up and kiss animation
*
KERRI_KISS_ANIM
LWLL 1,1|AFunc,A_SET_OYVEL+2,-60000h
LWLW 1,1|AFunc,A_STAY_TIL_SY_LT+1,150
LWL 1,2|AFunc,A_CLR_OYVEL
LWL 1,1|AFunc,A_BIG_KISS_SOUND
LW 1,0
LWLL CUKERKIS1A,1|AMulti|AFunc,A_SOUND+2,SND_KERRI_KISS
LW CUKERKIS1B,1|AMulti
LW CUKERKIS1C,30
LW CUKERKIS2A,1|AMulti
LW CUKERKIS2B,1|AMulti
LW CUKERKIS2C,1
LWLL 1,20|AFunc,A_SET_OYVEL+2,60000h
LWLLW 1,1|AFunc,A_Set_Var_Word+3,KISSING_KERRI,0
LWL 1,1|AFunc,DELETE_OBJ
SND_THANK_YOU
.WORD 0F244H,47,0A532H,0
SND_FREE_AT_LAST
.WORD 0F244H,79,0A53BH,0
SND_BEST
.WORD 0F244H,80,0A547H,0
SND_KERRI_KISS
.WORD 0F144H,15,0A252H,0
**************************************************************************
* *
* FREE_CAGE_KERRI *
* *
* Free Kerri from the dancing cage. *
* *
* A8 = Cage front obj. *
* *A8(OGIRL_RESCUER),L = Ptr to player that free'd her *
* *
**************************************************************************
FREE_CAGE_KERRI:
.IF AUSTRALIA
RETS
.ENDIF
move *a8(OULINK),a4,L
move *a4(MAP_Z),a10,L ; orig Z
addi 5000h,a10 ; range to look in
move *a4(MAP_X+10h),a1,W ; orig X pos of cage front
find_her_loop:
move *a4(MAP_NEXT),a4,L
move *a4(MAP_Z),a14,L
cmp a10,a14
jrgt give_up
move *a4(MAP_X+10h),a2,W
move *a4(MAP_X+10h),a2,W
sub a1,a2
abs a2
cmpk 10,a2
jrgt find_her_loop ; she's close in X
move *a4(MAP_IMG),a3,L
btst 0,a3
jrz find_her_loop ; she's animating
move *a4(MAP_OBJ),a0,L
jrn find_her_loop ; she's created
srl 4,a3
sll 4,a3
cmpi dn5b,a3
jrne chk_fwd
*
* She's dancing backwards, turn her around
*
movi FREE_FROM_5,a1
jruc found_her_hook
chk_fwd:
cmpi dn1b,a3
jrne find_her_loop
*
* She's dancing forwards, turn her around
*
movi FREE_FROM_1,a1
found_her_hook:
move a8,a9 ; save cage obj
move a0,a8 ; kerri obj into a8
calla BG_TO_FG ; no longer part of universe
move a8,a0
MOVE *A9(OGIRL_RESCUER),*A8(OGIRL_RESCUER),L ;Transfer for kiss
move a9,a8 ; restore cage obj
calla STRTANIM
give_up:
rets
PICK_A_DIRECTION:
move *a8(OCTRL),a5 ; is she unflipped?
move *a8(OXVAL),a0,L
move @XBASE,a14,L
sub a14,a0 ; world X in a0
jrn run_right
*
* if off to right, run left (i.e. flip me)
*
btst B_FLIPH,a5
jrnz she_cool
flip_her:
XORI M_FLIPH,a5
move a5,*a8(OCTRL)
rets
*
* if off to left, run right (i.e. no flip)
*
run_right:
btst B_FLIPH,a5 ; if not, unflip her
jrnz flip_her
she_cool:
rets
**************************************************************************
* *
* A_KERRI_AWARD *
* *
* Anim func to award the save for Kerri by putting the *
* big pop-up girl on the screen. Deletes object when *
* done *
* *
* A8 = Ptr to universe Kerri object *
* *A8(OGIRL_RESCUER),L = Player that should be awarded with *
* the kill. *
* *
**************************************************************************
A_KERRI_AWARD
MOVE *A8(OGIRL_RESCUER),A11,L
CREATE PID_IND, PROC_KERRI_KISS
JAUC DELETE_OBJ
FREE_FROM_5:
LW TR53B01,5
LW TR53B02,5
LW TR53B03,5
LW TR13B02,5
FREE_FROM_1:
LW SF1BA01,5
LWLL SF1BA02,5|AFunc,A_SOUND+2,SND_FREE_AT_LAST
LWLL SF1BA03,5|AFunc,A_SET_OZVEL+2,-90h
LWLW SF1BA04,5|AFunc,A_SET_OYACCEL+1,3400h
LW SF1BA05,5
LWL SF1BA06,1|AFunc,A_STAY_TIL_GRND_HIT
LWL SF1BA07,4|AFunc,PSTOP
LWL SF1BA08,4|AFunc,DELAYED_PRAISE
LW SF1BA09,4
LWL SF1BA10,4|AFunc,PICK_A_DIRECTION
LW SF1BA11,4
LW SF1BA12,4
LW SF1BA13,4
LW SF1BA14,4
LW SF1BA15,4
LW TR13B01,5
LW TR13B02,5
LWLL TR13B03,5|AFunc,A_SET_OXVEL+2,10000h
LW TR13B04,5
LWLL TR13B05,4|AFunc,A_SET_OXVEL+2,20000h
LWL 1,1|AFunc,A_Set_LOOP_STRT
LW RN3B02,5
LW RN3B03,5
LW RN3B04,5
LW RN3B05,5
LW RN3B06,5
LW RN3B07,5
LW RN3B08,5
LWLL RN3B01,5|AFunc,A_OFFSCREEN+2,KER_FREE_DONE
.long 0
KER_FREE_DONE
LW 1,30
LWL 1,1|AFunc,A_KERRI_AWARD
**************************************************************************
* *
* KERRI CAGE VECTORS *
* *
**************************************************************************
KERCAGE_COLLVECT
WWL OID_PROCKET,~MASK_PLAYER,UNIV_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,KERCAGE_CVECT
WL 0,DUMCRETS
KERCAGE_CVECT
PUSH a1
CHKZLIM 015000H+010H,KCAGE_DONE
CALLA UNIV_COLL_CHECK
JRNZ KCAGE_DONE
move *a8(ODATA+70h),a14
cmpi 0BADh,a14
jreq already_init1
movi [0BADh,0808h],a14
move a14,*a8(ODATA+60h),L
already_init1:
*
* Where did rocket hit?
*
move *a0(OXVAL),a7,L ; target univ position
move *a0(OYVAL),a1,L
movi [-82,-45],a3
movi [-72,-33],a4
calla BOX_CHECK_OBJ2
jrz othr_side_chk
*
* Hit Left Side
*
movb *a8(ODATA+60h),a3
jrz KCAGE_DONE
PUSH a0
calla UNIV_FLASH
calla MAKE_VIDCAM_SND
movi -39<<15,a14
mmtm sp,b0,b1,b2,b4,b5,b6,b8,b9
callr MAKE_BLAST
mmfm sp,b0,b1,b2,b4,b5,b6,b8,b9
PULLQ a0
clr a14 ; we're gonna flip over all the cards
movb a14,*a8(ODATA+60h)
jrnz KCAGE_DONE
movb *a8(ODATA+68h),a3
jrz BCO_ROCKET
PULLQ a1
rets
othr_side_chk:
movi [-82,34],a3
movi [-72,463],a4
calla BOX_CHECK_OBJ2
jrz KCAGE_DONE
*
* Hit Right Side
*
movb *a8(ODATA+68h),a3
jrz KCAGE_DONE
PUSH a0
calla UNIV_FLASH
calla MAKE_VIDCAM_SND
movi 39<<15,a14
mmtm sp,b0,b1,b2,b4,b5,b6,b8,b9
callr MAKE_BLAST
mmfm sp,b0,b1,b2,b4,b5,b6,b8,b9
PULLQ a0
clr a14 ; we're gonna flip over all the cards
movb a14,*a8(ODATA+68h)
jrnz KCAGE_DONE
movb *a8(ODATA+60h),a3
jrz BCO_ROCKET
PULLQ a1
rets
KERCAGE_GUNVECT
PUSH a1
CHKZLIM 015000H+010H,KCAGE_DONE
move *a8(ODATA+70h),a14
cmpi 0BADh,a14
jreq already_init2
movi [0BADh,0808h],a14
move a14,*a8(ODATA+60h),L
already_init2:
movi [-82,-45],a3
movi [-72,-33],a4
calla BOX_CHECK_OBJ
jrz chk_othr_side
*
* Hit Left Side
*
movb *a8(ODATA+60h),a3
jrz KCAGE_DEFAULT_DING
calla UNIV_FLASH
; calla MAKE_VIDCAM_SND
SOUNDZ SND_LOCK_HIT
calla DGV_FRAG_SPARK
dec a3
movb a3,*a8(ODATA+60h)
jrnz KCAGE_DONE
movi -39<<15,a14
callr MAKE_BLAST
movb *a8(ODATA+68h),a3
jrz BLAST_CAGE_OPEN
PULLQ a1
rets
chk_othr_side:
movi [-82,34],a3
movi [-72,46],a4
calla BOX_CHECK_OBJ
jrz KCAGE_DEFAULT_DING
*
* Hit Right Side
*
movb *a8(ODATA+68h),a3 ; get left count
jrz KCAGE_DEFAULT_DING ; been opened already
calla UNIV_FLASH
; calla MAKE_VIDCAM_SND
SOUNDZ SND_LOCK_HIT
calla DGV_FRAG_SPARK
dec a3
movb a3,*a8(ODATA+68h)
jrnz KCAGE_DONE
movi 39<<15,a14
callr MAKE_BLAST
movb *a8(ODATA+60h),a3 ; if newly opened, check other side
jrz BLAST_CAGE_OPEN
KCAGE_DONE:
PULLQ a1
RETS
*
* Just make sound and spark here
*
KCAGE_DEFAULT_DING
calla MAKE_VIDCAM_SND
calla DGV_FRAG_SPARK
JRUC KCAGE_DONE
SND_CAGE_BLAST
.WORD 0F342h,88,0A390H,0
SND_CAGE_BOUNCE
.word 0F310h,44,0A1E6h,0
SND_LOCK_HIT
.WORD 0F141H,62,0A1A1H,0 ;Hit the lock of the cage
BCO_ROCKET:
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA
BLAST_CAGE_OPEN:
CLRM *a8(ODATA+70h),W ; reset for future objects
MOVIM DUMCOLL,*A8(OCVECT),L
MOVIM METAL_GUNVECT,*A8(OGUNVECT),L
.IF DEBUG
CALLA VALID_PLAYER
.ENDIF
.IF AUSTRALIA
.ELSE
CALLA PLAYER_AWARD_GIRL
.ENDIF
MOVE A2,*A8(OGIRL_RESCUER),L ;Store here for the kiss
CREATE PID_IND,CAGE_LIFT_OFF
PULLQ a1
rets
MAKE_BLAST:
move *a8(OXVAL),a3,L ; get position of explosions
add a14,a3
move *a8(OYVAL),a4,L
subi 77<<15,a4
move *a8(OZVAL),a6,L
subk 5,a6
move a6,a5
move @ZBASE,a14,L
sub a14,a5
sra Z2SCALE-1,a5 ; quarter size
move a5,a9 ; start scale exists in process at a9
PUSH a8
*
* Start some explosion effect over locks
*
movi KCAGE_EXPLO_INIT,b0
calla MULTIMAKE
calla SET_SCALE_MANUAL
CREATE PID_IND,KEXP_ADJ_SCL
move a0,*a8(OPLINK),L
move a3,*a8(OXVAL),L
move a4,*a8(OYVAL),L
move a6,*a8(OZVAL),L
move *a8(OPARTS),a14,L
move a3,*a14(OXVAL),L
move a4,*a14(OYVAL),L
move a6,*a14(OZVAL),L
calla INSERT_OBJ
SOUND1 SND_CAGE_BLAST
PULLQ a8
rets
KEXP_ADJ_SCL:
move *a8(OZVAL),a5,L ; assume all parts have same scale
move @ZBASE,a14,L
sub a14,a5 ; WORLD Z
sra Z2SCALE-1,a5 ; assume normal size image
; move a5,a7
; srl 1,a7
; add a7,a5 ; add back 1/8
cmp a5,a9
jreq scl_notnew
move a5,a9
calla SET_SCALE_MANUAL
scl_notnew:
sloop 2,KEXP_ADJ_SCL
*
* Start cage moving
*
CAGE_LIFT_OFF:
sleep 3
CALLR FREE_CAGE_KERRI
MOVIM -20h,*a8(OZVEL),L
MOVIM -40000h,*a8(OYVEL),L
movi -18000h,a1
movi -0c000h,a0
calla RANGRAND
move *a8(OXVAL),a3,L
move @XBASE,a14,L
sub a14,a3
jrn negxvel
neg a0
negxvel:
move a0,*a8(OXVEL),L
MOVIM 3800h,*a8(OYACCEL),W
movi 0c0000h,a9 ; dest Y
jruc CLO_st
CLO_lp:
move *a8(OYVAL),a1,L
cmp a9,a1
jrlt CLO_st
move *a8(OYVEL),a2,L
jrn CLO_st ; on the way up, ignore
*
* Hit ground, going down
*
SOUNDZ SND_CAGE_BOUNCE
sra 2,a2
cmpi 800h,a2
jrlt stop_for_good
neg a2
move a2,*a8(OYVEL),L ; bounce
CLO_st:
sloop 1,CLO_lp
stop_for_good:
calla PSTOP
CLRM *a8(OPLINK),L
move *a8(OULINK),a0,L
move *a8(OXVAL),*a0(MAP_X),L ; update position in link
move *a8(OYVAL),*a0(MAP_Y),L
move *a8(OZVAL),*a0(MAP_Z),L
DIE
**************************************************************************
* *
* Kerri sitting in the brain machine *
* *
**************************************************************************
**************************************************************************
* *
* Universe anim func to create a Kerri tied to a chair *
* Direction is taken from H-flip of generator. *
* Position is offset from generator position. *
* *
* AARG+,W = X offset *
* AARG+,W = Y offset *
* *
**************************************************************************
AU_CREATE_KERRI_FLOSS
PUSH A8
MOVI KERRI_FLOSS_INIT,B0 ;Get us one
CALLA CREATE_ENEMY
PULL A2 ;A2=obj block of creator,
;pull must preserve status.
JRZ ACKF_ABORT ;BR = Object not created.
CALLA CLR_ODATA
CLRM *A2(OPLAYER),L ;Make sure seat OPLAYER field is gone
MOVE A2,*A8(OKERRI_SEAT),L ;This is her seat ptr
MOVE *A8(OPARTS),A14,L
MOVE A2,*A14(OKERRI_SEAT),L ;Keep it in this guy also
MOVE *A2(OCTRL),A14
BTST B_FLIPH,A14
JRZ ACKF_NOFLIP
MOVI M_FLIPH,A0
CALLA SET_FLPS
ACKF_NOFLIP
*
* set position
*
MOVE A8,A9
MOVE A2,A8
CALLA GETAFARG_LONG ; pixel Y:X in a0
MOVE A0,A4
MOVE *A8(OZVAL),A3,L
SUBK 8,A3 ;Hold Z for set
MOVE *A8(OXVAL),A1,L
MOVE *A8(OYVAL),A2,L
MOVE A4,A5 ; do X and Y
SEXT A5
MOVE *A8(OCTRL),A14
BTST B_FLIPH,A14
JRZ ACKF_NO_FLIPXOFF
NEG A5
ACKF_NO_FLIPXOFF
SRA 16,A4
SLL 15,A5
SLL 15,A4
ADD A5,A1
ADD A4,A2
MOVE A9,A8
MOVE @YWORLD,A14,L
MOVE A2,A4
SUB A14,A4
MOVE A4,*A8(OGRNDOFF),L
CALLA SET_ANIPU
CALLA INSERT_OBJ ;Insert Kerri
ACKF_ABORT
RETS
**************************************************************************
* *
* A_SEAT_CHECK *
* *
* Anim func to check if the seat we are sitting in is *
* destroyed. *
* *
* A8 = Ptr to Kerri part *
* *
**************************************************************************
A_SEAT_CHECK
MOVE *A8(OKERRI_SEAT),A0,L
JRZ ASC_X
MOVE *A0(OCTRL),A14,W
JRNN ASC_X ;BR = The seat is gone
MOVE *A0(OIMG),A14,L
CMPI STATIC5bd,A14
JRNE ASC_X ;BR = The seat is still cool
MOVE *A0(OPLAYER),A2,L
CALLA PULL_ANIM ;Pull this part
CALLA GET_HEAD_PART
MOVI [-30,0],A9
MOVI 8000,A1
CALLA PRINT_SCORE
CALLA PLAYER_AWARD_GIRL
MOVI ANIM_GET_UP,A1
CALLA STRT_ANIM
ASC_X
RETS
KERRI_FLOSS_INIT
.byte 3, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long KERTIE_P ;Discrete palette
.word OID_JUNK,OM_COLL
.LONG DUMCOLL
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW TOPHELP01, DMAWNZ, 0, 0, OM_GUNV|OM_ANIM
.LONG DUMRETS
.LONG ANIM_FLOSS_STRUGGLE
LWWWW BOTHELP01, DMAWNZ, 0, 1, OM_ANIM|OM_PRVGUNV
.LONG ANIM_WATCH_SEAT
LWWWW BOTHELP02, DMAWNZ, 0, 1, OM_PRVGUNV
ANIM_FLOSS_STRUGGLE
LWL 1,1|AFunc,A_STAY_TIL_ONSCRN
FLOSS_ME
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,15,100
LW 1,0
LW TOPHELP02,4
LW TOPHELP03,4
LW TOPHELP04,4
LW TOPHELP05,4
LW TOPHELP06,4
LW TOPHELP07,4
LWLL TOPHELP01,4|AFunc,A_ONSCREEN+2,FLOSS_ME
; LWL 1,1|AFunc,A_STAY_TIL_OFFSCRN
LWL 1,1|AFunc,DELETE_OBJ
ANIM_WATCH_SEAT
LWL 1,1|AFunc,A_SEAT_CHECK
.LONG 0
ANIM_GET_UP
LWLL KERSFD01,1|AMulti|AFunc,A_CHANGE_PAL+2,KERTIE_P
LWLL KERSFD02,1|AMulti|AFunc,A_CHANGE_PAL+2,KERTIE_P
LWLL KERSFD03,6|AFunc,A_CHANGE_PAL+2,KERTIE_P
LW KERSFE01,1|AMulti
LW KERSFE02,1|AMulti
LW KERSFE03,6
LW KERSFI01,1|AMulti
LW KERSFI02,1|AMulti
LW KERSFI03,6
LWLL 1,1|AMulti|AFunc,A_AnimGo+2,KERRI_RUNAWAY_ANIM
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,1|AFunc,OBJ_OFF
.END