6123 lines
113 KiB
NASM
Executable File
6123 lines
113 KiB
NASM
Executable File
**************************************************************
|
||
*
|
||
* Owner: TURMELL
|
||
*
|
||
* Software: Shawn Liptak, Mark Turmell
|
||
* Initiated: 9/17/92
|
||
*
|
||
* Modified: Shawn Liptak, 10/5/92 -Split from plyr.asm
|
||
*
|
||
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
|
||
*
|
||
*.Last mod - 3/17/93 17:54
|
||
**************************************************************
|
||
.file "plyr2.asm"
|
||
.title "basketball player code"
|
||
.width 132
|
||
.option b,d,l,t
|
||
.mnolist
|
||
|
||
|
||
.include "mproc.equ" ;Mproc equates
|
||
.include "disp.equ" ;Display proc equates
|
||
.include "gsp.equ" ;Gsp asm equates
|
||
.include "sys.equ"
|
||
.include "audit.equ"
|
||
.include "world.equ" ;Court-world defs
|
||
.include "game.equ"
|
||
.include "macros.hdr" ;Macros
|
||
|
||
.include "ballshad.glo"
|
||
.include "imgtbl7.glo"
|
||
.include "imgtbl.glo"
|
||
.include "credturb.glo"
|
||
.include "arrow.glo"
|
||
|
||
.asg 0,SEQT
|
||
.include "plyr.equ"
|
||
|
||
|
||
;sounds external
|
||
|
||
.ref FLAME_F_13,FLAME2F_13
|
||
|
||
.ref ohmy,intercept,into_stnd_sp
|
||
.ref stealsb
|
||
.ref swish_snd1,swish_snd2,swish_snd3
|
||
.ref swish_snd4,swish_snd5,swish_snd6
|
||
.ref miss1_snd,miss2_snd,miss3_snd,miss4_snd
|
||
.ref dunk_snd1,dunk_snd2,dunk_snd3,dunk_snd4
|
||
.ref missd1_snd,hitbkbd_snd,swat_snd,boo1_snd
|
||
.ref hitbkbd2_snd,miss5_snd,dunk_snd5
|
||
.ref cheer_snd,cheer1_snd,cheer2_snd,cheer3_snd,cheer4_snd
|
||
.ref steal_snd
|
||
|
||
.ref on_fire_sp,dribble_snd,push1_snd
|
||
.ref dribble3_snd
|
||
.ref pup_court,pup_aba
|
||
|
||
|
||
;symbols externally defined
|
||
|
||
.ref pup_maxpower
|
||
.ref shot_percentage
|
||
.ref gmqrtr
|
||
.ref shot_distance
|
||
|
||
.ref AUD1,AUD
|
||
.ref nogood_speech,GAMSTATE
|
||
|
||
.ref rejected_speech
|
||
.ref rejected_dnk_speech
|
||
.ref rebound_speech
|
||
.ref intercepted_speech
|
||
.ref stolen_speech
|
||
|
||
.ref rebound_delay
|
||
.ref pushing_delay
|
||
.ref team1
|
||
|
||
.ref shot_type
|
||
.ref shoots_speech,scored_speech
|
||
|
||
.ref steals_off
|
||
.ref pass_off
|
||
.ref PSTATUS
|
||
|
||
.ref game_time
|
||
.ref scores,prt_top_scores
|
||
.ref tvpanelon
|
||
.ref score_add,score_showtvpanel
|
||
.ref stick_number
|
||
.ref sclockx,sc_proc
|
||
; .ref movie_test
|
||
.ref net_ani,rimlf,rimrf
|
||
.ref arw_on1plyr
|
||
|
||
.ref pal_getf
|
||
|
||
.ref PCNT
|
||
.ref HALT
|
||
.ref gndx
|
||
.ref RNDPER
|
||
.ref SHAKER
|
||
.ref GET_ADJ
|
||
|
||
.ref plyrobj_t,plyrproc_t
|
||
.ref P1DATA,P2DATA,P3DATA,P4DATA
|
||
.ref plyrcharge
|
||
.ref plyrpasstype
|
||
.ref plyrairballoff
|
||
.ref ball_smokepuff
|
||
|
||
.ref seekdir_xyxy128
|
||
.ref seekdirdist_obxz128
|
||
.ref plyr_setseq,plyr_takeoutball
|
||
; .ref plyr_freethrow
|
||
.ref plyr_goaltending
|
||
.ref plyr_setshtdly
|
||
|
||
.ref inc_player_stat
|
||
.ref flsh1_snd,flsh3_snd,flsh4_snd
|
||
|
||
|
||
;symbols defined in this file
|
||
|
||
.def hoopl_t,hoopr_t
|
||
|
||
|
||
;uninitialized ram definitions
|
||
|
||
.bss off_boxy,16
|
||
|
||
BSSX plyr_onfire ,16 ;Bit 0-3=plyr 0-3 on-fire; 0 for none
|
||
BSSX ballobj_p ,32 ;* basketball obj
|
||
BSSX ballpnum ,16 ;Plyr # who owns (0-3) or Neg
|
||
BSSX ballpnumlast ,16 ;Last plyr who owned ^ (0-3) or neg if loose
|
||
BSSX ballpnumshot ,16 ;Last plyr who shot (0-3)
|
||
BSSX ballsclastp ,16 ;Last plyr who owned (0-3) for shot clock
|
||
BSSX ballshotinair ,16 ;Shooter # if shot in air, else -1
|
||
|
||
;Stucture - Keep in order!
|
||
BSSX ballpnumscored ,16 ;Last plyr who scored (0-3) or neg
|
||
BSSX ballnumscored ,16 ;# times last plyr scored
|
||
BSSX balltmscored ,16 ;Last team-shot scored (0=tm2,32=tm1)
|
||
BSSX balltmshotcnt ,16 ;# times last team-shot scored
|
||
;End of structure
|
||
|
||
BSSX ballfree ,16 ;!0=Ball free to move
|
||
BSSX ballscorezhit ,16 ;!0=Ball hit score zone, +=Top z, -=Scored
|
||
|
||
BSSX ballrimhitcnt ,16 ;# times rim hit since last shot
|
||
BSSX ballbbhitcnt ,16 ;# times backboard hit since last shot
|
||
BSSX in_cylinder ,16 ;Cntdwn after first rim hit on shots
|
||
BSSX must_rebound ,16 ;Convert block/rej art into rebound
|
||
|
||
BSSX ballptsforshot ,16 ;Point value for current shot (1-3)
|
||
BSSX ballprcv_p ,32 ;*Plyr proc who gets this pass or 0
|
||
BSSX ballpasstime ,16 ;# ticks since passed
|
||
BSSX ballgoaltcnt ,16 ;+=Goaltend cnt down
|
||
BSSX ballflash ,16 ;!0=Ball flashing
|
||
BSSX inbound ,16 ;Inbounding team (0-1) or Neg
|
||
BSSX bbshatter ,16 ;!0=Backboard shattered (+=L, -=R)
|
||
|
||
BSSX cntl_team ,16 ;Team in control (0,1,-1)
|
||
BSSX cntl_team_last ,16 ;Team in control (0,1,-1)
|
||
BSSX scrl_divs_cur ,16 ;Scroller current divisor
|
||
BSSX scrl_divs_dest ,16 ;Scroller acceleration target divisor
|
||
|
||
; .bss movieshown ,16 ;!0=Movie has been played
|
||
|
||
BSSX slamming ,16 ;!0=Ball going into rim from dunking
|
||
|
||
BSSX t1dunkcnt ,16 ;+=# dunks since start of game (In order)
|
||
.bss t2dunkcnt ,16 ;^ -=# dunks till we can break board
|
||
|
||
BSSX brick_count ,16*NUMPLYRS ;# bricks each player has thrown up
|
||
BSSX last_power ,16 ;Player pushing has this power
|
||
|
||
BSSX original_names ,32*NUMPLYRS ;Names of original players in game
|
||
; BSSX fire_flags ,16 ;1 if this player has been on fire (1,2,4,8)
|
||
|
||
BSSX my_ballpnumlast ,16 ;last player to own ball
|
||
;equates for this file
|
||
|
||
|
||
.text
|
||
|
||
|
||
#*******************************
|
||
* Play bell, flash ball on ABA ball powerup
|
||
|
||
church
|
||
;Wait for HALT to get set!
|
||
SLEEPK 8
|
||
|
||
#lpz SLEEPK 1 ;waiting for idiot boxes
|
||
move @HALT,a0
|
||
jrnz #lpz
|
||
;MJT Start
|
||
.ref robo_3_snd
|
||
SLEEPK 20
|
||
callr flash_ball
|
||
SOUND1 robo_3_snd
|
||
SLEEPK 27
|
||
callr flash_ball
|
||
SOUND1 robo_3_snd
|
||
SLEEPK 27
|
||
callr flash_ball
|
||
SOUND1 robo_3_snd
|
||
;MJT End
|
||
DIE
|
||
|
||
#*******************************
|
||
* Ball main code (Process)
|
||
|
||
SUBR ball_main
|
||
|
||
move a13,a1 ;>Clr PDATA & PSDATA areas
|
||
addi PDATA,a1
|
||
movi (PRCSIZ-PDATA)/16,a2
|
||
clr a0
|
||
#clrpd move a0,*a1+
|
||
dsj a2,#clrpd
|
||
|
||
move @WORLDTLX+16,a0 ;Init ball obj
|
||
addi 200,a0
|
||
sll 16,a0
|
||
movi [-80,0],a1 ;In air
|
||
.ref NBALL101
|
||
movi NBALL101,a2
|
||
move @pup_aba,a14
|
||
jrz #notd
|
||
.ref ABALL101
|
||
movi ABALL101,a2
|
||
PUSH a0,a1,a2
|
||
|
||
|
||
CREATE0 church
|
||
|
||
|
||
PULL a0,a1,a2
|
||
#notd
|
||
movi CZMID,a3
|
||
movi DMAWNZ|M_3D|M_NOSCALE,a4
|
||
movi CLSENMY|TYPBALL,a5
|
||
clr a6
|
||
movi ->20000,a7
|
||
calla BEGINOBJ2
|
||
move a8,@ballobj_p,L
|
||
callr ball_getshadow ;Init ball shadow
|
||
|
||
clr a0 ;Init various ball stats/counts
|
||
move a0,@ballpnumshot
|
||
move a0,@ballscorezhit
|
||
move a0,@ballbbhitcnt
|
||
move a0,@ballgoaltcnt
|
||
move a0,@ballflash
|
||
move a0,@t1dunkcnt
|
||
move a0,@t2dunkcnt
|
||
move a0,@off_boxy
|
||
move a0,@puffcnt
|
||
|
||
subk 1,a0
|
||
move a0,@ballpnum
|
||
move a0,@ballpnumlast
|
||
move a0,@ballpnumscored
|
||
move a0,@balltmscored
|
||
|
||
move a0,@brick_count,L
|
||
move a0,@brick_count+20h,L
|
||
|
||
move a0,*a13(ball_zsznum)
|
||
move a0,@bbshatter
|
||
movk 1,a0
|
||
move a0,@ballfree ;Free
|
||
|
||
; movk 3,a0
|
||
; move a0,*a13(ball_numforfire)
|
||
|
||
move *a8(OIMG),a0,L
|
||
move *a0(IANIOFFX),*a13(ball_anix)
|
||
|
||
movk 1,a10 ;A10=Anim cntdn
|
||
|
||
movi DIVS_RATE1,a0
|
||
move a0,@scrl_divs_cur
|
||
movi DIVS_RATE2,a0
|
||
move a0,@scrl_divs_dest
|
||
|
||
move @WORLDTLX,a0,L
|
||
subi [WRLDMID-200,0],a0
|
||
move a0,@gndx,L
|
||
|
||
SLEEPK 4 ;Wait for others to establish data
|
||
|
||
.if DEBUG
|
||
clr a0
|
||
move a0,@#tmp_debounce
|
||
move a0,@#halt_ball
|
||
.endif
|
||
|
||
;----------
|
||
; main proc loop
|
||
|
||
#lp
|
||
.if DEBUG
|
||
|
||
.bss #tmp_debounce,16
|
||
.bss #halt_ball,16
|
||
.ref get_but_val_down
|
||
|
||
;This is for halting the ball in midair - Allows checking blocks, rebound
|
||
;targeting, etc.
|
||
.if HEADCK
|
||
.else
|
||
jruc #no ;Take this out when testing blocks
|
||
.endif
|
||
|
||
clr a0
|
||
calla get_but_val_down
|
||
jrz #no
|
||
|
||
move @#tmp_debounce,a14
|
||
jrnz #held
|
||
|
||
movk 1,a0
|
||
move a0,@#tmp_debounce
|
||
|
||
.if HEADCK
|
||
.ref game_start
|
||
clr a8 ;A8=Player #
|
||
movi P1DATA,a11 ;A11=*plyr data
|
||
jauc game_start
|
||
.endif
|
||
|
||
move @#halt_ball,a0
|
||
xori 1,a0
|
||
move a0,@#halt_ball
|
||
jrz #held
|
||
clr a0
|
||
move a0,*a8(OXVEL),L
|
||
move a0,*a8(OYVEL),L
|
||
move a0,*a8(OZVEL),L
|
||
jruc #held
|
||
|
||
#no clr a0
|
||
move a0,@#tmp_debounce
|
||
#held
|
||
|
||
move @#halt_ball,a0
|
||
jrnz #halted2
|
||
.endif
|
||
move @HALT,a0
|
||
|
||
.if DEBUG
|
||
BSSX RIM_STEP,16
|
||
jrz #nohalt
|
||
move @RIM_STEP,a14
|
||
jrz #nohalt
|
||
.ref get_all_buttons_cur2
|
||
.ref get_all_buttons_down2
|
||
calla get_all_buttons_down2
|
||
jrz #halted
|
||
clr a0
|
||
#nohalt
|
||
|
||
move a0,a0
|
||
.endif
|
||
|
||
jrnz #halted
|
||
|
||
move @ballgoaltcnt,a0 ;Dec goal tend cnt if >0
|
||
jrle #skipgt
|
||
subk 1,a0
|
||
move a0,@ballgoaltcnt
|
||
#skipgt
|
||
|
||
;----------
|
||
; check if its time for ball on-fire effects
|
||
|
||
move @plyr_onfire,a3 ;Get last plyr on-fire bits or 0
|
||
|
||
move @balltmscored,a1 ;Chk if a team is on-fire
|
||
jrn #notmfire ; br=no
|
||
move @balltmshotcnt,a4 ;Maybe. Chk shot cnt
|
||
subk TMFIRE_MINCNT,a4
|
||
jrn #notmfire ; br=no
|
||
|
||
movk 2+1,a2 ;Set team 1 on-fire
|
||
move a1,a1 ;Was it team 1?
|
||
jrnz #chkownr ; br=yes
|
||
movk 8+4,a2 ;Set team 2 on-fire
|
||
jruc #chkownr
|
||
|
||
#notmfire
|
||
clr a2 ;Set for no on-fire
|
||
move @ballpnumscored,a0 ;Last plyr who scored (0-3) or neg
|
||
jrn #chkhot ; br=no plyr on-fire
|
||
move @ballnumscored,a4 ;# times last plyr scored
|
||
|
||
; move @fire_flags,a1
|
||
; btst a0,a1 ;Been on-fire before?
|
||
; jrz #frstfire
|
||
; subk ONFIRE_MINCNT+1,a4 ;# shots for on-fire if was before
|
||
; jruc #notff
|
||
;#frstfire
|
||
subk ONFIRE_MINCNT,a4 ;# shots for on-fire
|
||
;#notff
|
||
jrlt #chkhot ;Enough for on-fire? br=no
|
||
|
||
movk 1,a2 ;Set new plyr on-fire
|
||
sll a0,a2
|
||
|
||
#chkownr
|
||
.if DUNKTST
|
||
jruc #chkhot ;When testing dunks - PUT IN!
|
||
.endif
|
||
|
||
move @ballpnum,a1
|
||
jrn #noownr
|
||
|
||
btst a1,a3 ;Ball owner last plyr # on-fire?
|
||
jrz #chkhot ; br=no
|
||
jruc #hot ;Do smoke puffs
|
||
|
||
; sll 5,a1
|
||
; addi plyrproc_t,a1
|
||
; move *a1,a1,L
|
||
; move *a1(plyr_seqflgs),a1 ;Chk owner ani seq
|
||
; btst DUNK_B,a1 ;Dunking?
|
||
; jrnz #hot ; br=yes, do smoke puffs
|
||
; jruc #chkhot ;No, holding or dribbling on-fire
|
||
|
||
|
||
#noownr
|
||
move @ballpnumlast,a1 ;Get last owner team #
|
||
srl 1,a1
|
||
move a3,a14 ;Get last plyr # on-fire team #
|
||
sll 3,a14
|
||
.ref pbit_tval
|
||
addi pbit_tval,a14,L
|
||
movb *a14,a14
|
||
cmp a1,a14 ;On the same team?
|
||
jrnz #chkhot ; br=no, no smoke puffs
|
||
|
||
move @ballpnumshot,a1 ;Last shooter=last plyr # on-fire?
|
||
btst a1,a3
|
||
jrnz #hot ; br=yes, do smoke puffs
|
||
|
||
move @ballprcv_p,a4,L ;Pass in progress?
|
||
jrz #chkhot ; br=no, no smoke puffs
|
||
move *a4(plyr_tmproc_p),a4,L ;Get passer *proc
|
||
move *a4(plyr_num),a4 ;Get passer plyr #
|
||
btst a4,a3 ;Passer plyr #=last plyr # on-fire?
|
||
jrz #chkhot ; br=no, no smoke puffs
|
||
#hot
|
||
.bss puffcnt,16
|
||
move @puffcnt,a0 ;Do smoke puffs
|
||
subk 1,a0
|
||
jrnn #nopuff
|
||
|
||
;Reduce bog by not doing puffs when score plate is present...
|
||
move @tvpanelon,a14,L
|
||
jrnz #nopuff0
|
||
CREATE0 ball_smokepuff
|
||
#nopuff0
|
||
|
||
|
||
movk 3-1,a0
|
||
#nopuff
|
||
move a0,@puffcnt
|
||
|
||
;----------
|
||
; do current ball on-fire status
|
||
|
||
#chkhot
|
||
move a3,a0 ;Skip if someone is on-fire
|
||
jrnz #skip ; br=yes
|
||
move a2,a2 ;Did someone go on-fire?
|
||
jrz #skip ; br=no
|
||
|
||
movi AUD_TM_FIRE,a0 ;>Audit team on-fires
|
||
move @ballnumscored,a14 ;Was it a team on-fire?
|
||
subk ONFIRE_MINCNT,a14
|
||
jrn #aud ; br=yes
|
||
movi AUD_NUMHOTSTRK,a0 ;>Audit plyr on-fires
|
||
movk ONFIRE_MINCNT+1,a14 ;Set for # of on-fire shots to allow
|
||
move a14,@ballnumscored
|
||
#aud
|
||
move @GAMSTATE,a14
|
||
cmpi INAMODE,a14 ;Don't audit if in attract
|
||
jrz #noaud
|
||
calla AUD1
|
||
#noaud
|
||
; move @fire_flags,a14 ;Set plyr been on-fire bit
|
||
; or a2,a14
|
||
; move a14,@fire_flags
|
||
|
||
SOUND1 on_fire_sp
|
||
|
||
movk 32,a0 ;Set bogus plyr # for ball not on-fire
|
||
move a2,@plyr_onfire ;Save new on-fire plyr bit val or 0
|
||
|
||
#skip
|
||
clr a14 ;0 for ball not on-fire
|
||
; movi -1,a4 ;Cause ani change
|
||
|
||
move @ballpnum,a1
|
||
jrnn #ck1
|
||
move @ballpnumlast,a1
|
||
jrn #setb
|
||
#ck1
|
||
movk 1,a6
|
||
sll a1,a6
|
||
and a0,a6
|
||
jrz #setb
|
||
movk 1,a14 ;!0 for ball on-fire
|
||
#setb
|
||
move a14,*a13(ball_onfire)
|
||
; move a4,*a13(ball_zsznum) ;Cause ani change
|
||
|
||
;----------
|
||
; check ball X coor limits
|
||
|
||
move *a8(OXPOS),a6 ;Add ani X to check ball center
|
||
move *a13(ball_anix),a14
|
||
add a14,a6
|
||
|
||
move *a8(OXVEL),a1,L ;Chk vel for which limit to chk
|
||
jreq #xok ; = if held or dribbled
|
||
jrgt #xvpos
|
||
|
||
cmpi LFTCRT_X,a6 ;Neg vel. Chk left X limit
|
||
jrge #xok
|
||
movi LFTCRT_X,a6 ;Too far. Pull it back & go 0 X vel
|
||
jruc #xbad
|
||
|
||
#xvpos cmpi RGTCRT_X,a6 ;Pos vel. Chk right X limit
|
||
jrlt #xok
|
||
movi RGTCRT_X,a6 ;Too far. Pull it back & go 0 X vel
|
||
|
||
#xbad move a6,a5 ;(OXPOS+anix) wants to remain in A6
|
||
sub a14,a5 ;Adjust for ani X
|
||
move a5,*a8(OXPOS)
|
||
clr a1
|
||
move a1,*a8(OXVEL),L ;Clr X vel
|
||
#xok
|
||
|
||
;----------
|
||
; check ball Z coor limits
|
||
|
||
move @ballpnum,a5 ;Ball owned? Yes if >=0
|
||
jrge #zok
|
||
move *a8(OZPOS),a0 ;No
|
||
move *a8(OZVEL),a1,L ;Chk vel for which limit to chk
|
||
jreq #zok ;No chk if not moving
|
||
jrgt #zvpos
|
||
|
||
cmpi CZMIN,a0 ;Neg vel. Chk upper Z limit
|
||
jrge #zok
|
||
movi CZMIN,a0 ;Too far. Pull it back & go 0 Z vel
|
||
jruc #zbad
|
||
|
||
#zvpos cmpi CZMAX-2,a0 ;Pos vel. Chk lower Z limit
|
||
jrlt #zok
|
||
movi CZMAX-2,a0 ;Too far. Pull it back & go 0 Z vel
|
||
|
||
#zbad move a0,*a8(OZPOS)
|
||
clr a1
|
||
move a1,*a8(OZVEL),L ;Clr Z vel
|
||
#zok ;(ballpnum) wants to remain in A5
|
||
|
||
;----------
|
||
; check for anim kill & a basket
|
||
|
||
move a5,a5 ;Ball owned? No if <0
|
||
jrn #no_own
|
||
|
||
clr a14 ;Yes. Clr pass timer
|
||
move a14,@ballpasstime
|
||
move *a13(ball_onfire),a14 ;On fire?
|
||
jrnz #scroll
|
||
movk 2,a10 ;No. Keep ball from animating
|
||
jruc #scroll
|
||
|
||
#no_own move @ballprcv_p,a5,L ;No owner. Passing?
|
||
jrnz #skpcol
|
||
callr ball_bbcollision ;No. Chk for a basket
|
||
#skpcol
|
||
move @ballpasstime,a0 ;Shot or pass, inc pass timer
|
||
addk 1,a0
|
||
move a0,@ballpasstime
|
||
|
||
;----------
|
||
; do world-scroll X
|
||
|
||
#scroll
|
||
move @inbound,a0 ;Doing an inbound?
|
||
jrn #not_inbounding
|
||
#dunking
|
||
jrnz #ib_rgt
|
||
movi [WRLDMID-200-MAX_VIEW1,0],a3 ;TARGX = lft side limit
|
||
jruc #do_ib
|
||
#ib_rgt
|
||
movi [WRLDMID-200+MAX_VIEW1,0],a3 ;TARGX = rgt side limit
|
||
#do_ib
|
||
movi DIVS_RATE1,a0 ;Set new current rate
|
||
move a0,@scrl_divs_cur
|
||
jruc #do_scroll
|
||
|
||
#not_inbounding
|
||
movi DIVS_RATE2,a0 ;Set default target rate
|
||
move a0,@scrl_divs_dest
|
||
|
||
move @ballpnum,a5 ;Ball owned?
|
||
jrnn #plyr_has_ball
|
||
move a6,a3 ;No. TARGX = ball X
|
||
move @ballprcv_p,a0,L ;Passing? No if 0
|
||
jrz #not_passing
|
||
move @ballpnumlast,a5 ;Yes or was. Still is or loose?
|
||
jrn #not_passing
|
||
|
||
movi DIVS_RATE3,a0 ;Pass. Set new target rate
|
||
move a0,@scrl_divs_dest
|
||
move @plyrpasstype,a1 ;Normal or turbo pass? Normal if 0
|
||
jrz #plyr_passed
|
||
move a0,@scrl_divs_cur ;Turbo. Set new current rate
|
||
jruc #plyr_passed
|
||
|
||
#not_passing
|
||
move @ballpnumlast,a5 ;Not owned. Is it a shot or loose?
|
||
jrnn #plyr_shooting
|
||
movi -1,a0 ;Loose. Set for no team in control
|
||
move a0,@cntl_team
|
||
movi DIVS_RATE1,a0 ;Set new current rate
|
||
move a0,@scrl_divs_cur
|
||
jruc #adj_targx
|
||
|
||
#plyr_has_ball
|
||
move a5,a0 ;Owned (A5 = plyrpnum)
|
||
sll 5,a0
|
||
addi plyrobj_t,a0 ;Get owner's OBJ ptr
|
||
move *a0,a0,L
|
||
move *a0(OXPOS),a3
|
||
move *a0(OXANI+16),a1
|
||
add a1,a3 ;TARGX = owner X + ani X offset
|
||
#plyr_passed ;(TARGX = ball X, A5 = plyrpnumlast)
|
||
#plyr_shooting ;(TARGX = ball X, A5 = plyrpnumlast)
|
||
move a5,a0 ;Set current team in control (0 or 1)
|
||
srl 1,a0 ; by who A5 is (owner or last owner)
|
||
move a0,@cntl_team
|
||
sll 5,a5
|
||
addi plyrproc_t,a5 ;Get plyr PROC ptr
|
||
move *a5,a5,L
|
||
move *a5(plyr_seqflgs),a1
|
||
btst DUNK_B,a1 ;Is it a dunk? No if 0
|
||
jrz #not_dunking
|
||
subk 1,a0 ;Yes. Dec team control for condition
|
||
|
||
|
||
|
||
;This causes the scroller to drift a little further than the end of the court.
|
||
;But not as far as an inbound pass.
|
||
jrnz #ib_rgt0
|
||
movi [WRLDMID-200-MAX_VIEW1+20,0],a3 ;TARGX = lft side limit
|
||
jruc #do_ib
|
||
#ib_rgt0
|
||
movi [WRLDMID-200+MAX_VIEW1-20,0],a3 ;TARGX = rgt side limit
|
||
jruc #do_ib
|
||
; jruc #dunking ; to select which side to scroll to
|
||
|
||
|
||
|
||
#not_dunking
|
||
movi DIVS_DELTA,a0 ;Pass or jump/layup
|
||
move @scrl_divs_cur,a1
|
||
move @scrl_divs_dest,a2
|
||
cmp a1,a2 ;Need to accel cur to dest?
|
||
jreq #adj_targx
|
||
jrgt #add
|
||
sub a0,a1 ;Accelerate
|
||
cmp a1,a2
|
||
jrle #set_divs
|
||
jruc #lim
|
||
#add
|
||
add a0,a1 ;Decelerate
|
||
cmp a1,a2
|
||
jrge #set_divs
|
||
#lim
|
||
move a2,a1
|
||
#set_divs
|
||
move a1,@scrl_divs_cur
|
||
|
||
#adj_targx
|
||
move @cntl_team,a0 ;Adj TARGX to team in control
|
||
jrn #noteam ;Team 0 or 1 or no team if -
|
||
jrnz #adj_t1
|
||
addi SCRL_EDGE_OFF*2,a3 ;2x to fall thru the SUBI
|
||
#adj_t1
|
||
subi SCRL_EDGE_OFF,a3
|
||
|
||
#noteam
|
||
move @cntl_team,a0 ;Chk for turnover/loss of control
|
||
move @cntl_team_last,a1
|
||
cmp a0,a1
|
||
jreq #chk_targx
|
||
move a0,@cntl_team_last ;Whoever had it lost it
|
||
movi DIVS_RATE1,a0 ;Set new current rate
|
||
move a0,@scrl_divs_cur
|
||
|
||
#chk_targx
|
||
cmpi WRLDMID-MAX_VIEW2,a3 ;Chk TARGX to lft MAX2
|
||
jrge #trgx_ok1
|
||
movi WRLDMID-MAX_VIEW2,a3 ;Too far. Set lft MAX2
|
||
jruc #chk_cur
|
||
#trgx_ok1
|
||
cmpi WRLDMID+MAX_VIEW2,a3 ;Chk TARGX to rgt MAX2
|
||
jrle #trgx_ok2
|
||
movi WRLDMID+MAX_VIEW2,a3 ;Too far. Set rgt MAX2
|
||
#chk_cur
|
||
move @scrl_divs_cur,a0
|
||
cmpi DIVS_RATE2,a0
|
||
jrhs #trgx_ok2
|
||
movi DIVS_RATE2,a0
|
||
move a0,@scrl_divs_cur
|
||
move a0,@scrl_divs_dest
|
||
#trgx_ok2
|
||
subi 200,a3 ;Adj TARGX to WORLDTLX
|
||
sll 16,a3
|
||
|
||
#do_scroll
|
||
move @scrl_divs_cur,a7 ;Do world-scroll X
|
||
move @WORLDTLX,a1,L
|
||
move a1,a5
|
||
sub a3,a5 ;DIFFX=WORLDTLX-TARGX
|
||
jreq #no_scroll
|
||
jrlt #scr_rgt
|
||
#scr_lft
|
||
subi [SCROLL_BUFFER,0],a5 ;No scroll if in "window"
|
||
jrle #no_scroll
|
||
divu a7,a5 ;DIFFX/scrl_divs_cur
|
||
sll 8,a5 ;Move to int portion &
|
||
sub a5,a1 ; step
|
||
cmpi [WRLDMID-200-MAX_VIEW1,0],a1 ;Chk new X to lft MAX1
|
||
jrle #no_scroll
|
||
jruc #scr_inb
|
||
#scr_rgt
|
||
abs a5
|
||
subi [SCROLL_BUFFER,0],a5 ;No scroll if in "window"
|
||
jrle #no_scroll
|
||
divu a7,a5 ;DIFFX/scrl_divs_cur
|
||
sll 8,a5 ;Move to int portion &
|
||
add a5,a1 ; step
|
||
cmpi [WRLDMID-200+MAX_VIEW1,0],a1 ;Chk new X to rgt MAX1
|
||
jrge #no_scroll
|
||
#scr_inb
|
||
move @inbound,a0 ;Go scroll if not inbounding (if neg)
|
||
jrn #scr_set
|
||
move @WORLDTLX,a0,L ;Inbounding
|
||
sub a1,a0 ;No scroll if the difference between
|
||
abs a0 ; old WORLDTLX & scrolled TLX is
|
||
cmpi INBND_MINX,a0 ; minimal
|
||
jrlt #no_scroll
|
||
#scr_set
|
||
move a1,@WORLDTLX,L ;Set new TLX
|
||
subi [WRLDMID-200,0],a1
|
||
move a1,@gndx,L ;Set new ground-base X
|
||
|
||
#no_scroll
|
||
|
||
;----------
|
||
; do world-scroll Y
|
||
|
||
move *a8(OZPOS),a14
|
||
cmpi CZMAX,a14
|
||
jrlt #zin
|
||
movi CZMAX-1,a14
|
||
#zin
|
||
subi CZMIN,a14 ;Sub min crt Z
|
||
sra 1,a14 ;YOFF=Z*3/8
|
||
move a14,a0
|
||
sra 2,a14
|
||
sub a14,a0 ;TARGY=YOFF
|
||
movi YBUFF_NORM,a1 ;Set default buffer count
|
||
movk (-YRATE_NORM)&31,a2 ;Set default Y rate shift count
|
||
|
||
move @ballpnum,a14 ;Ball owned?
|
||
jrn #no_owner ; br=not owned
|
||
|
||
sll 5,a14
|
||
addi plyrproc_t,a14
|
||
move *a14,a14,L ;Get owner *PROC
|
||
move *a14(plyr_seqflgs),a5
|
||
btst PASS_B,a5 ;Is it a pass?
|
||
jrnz #no_yalt ; br=yes
|
||
btst DUNK_B,a5 ;Is it a dunk?
|
||
jrz #do_yalt ; br=no
|
||
|
||
movi YBUFF_DUNK1,a1 ;Set buffer count
|
||
move *a14(plyr_seq),a5 ;Get dunk ani seq #
|
||
cmpi DUNKU2_SEQ,a5 ;Dunk that needs different buffering?
|
||
jrlt #do_yalt ; br=no
|
||
movi YBUFF_DUNK2,a1 ;Set buffer count
|
||
movk (-YRATE_SLOW)&31,a2 ;Set Y rate shift count
|
||
jruc #do_yalt
|
||
|
||
#no_owner
|
||
move @ballprcv_p,a14,L ;Passing?
|
||
jrz #free ; br=no
|
||
move *a14(plyr_rcvpass),a3 ;Is or was. Missed?
|
||
jrle #free ; br=yes
|
||
|
||
move *a14(plyr_seq),a3 ;Pass in progress
|
||
cmpi ALLEYOOP1_SEQ,a3 ;Is it an oop?
|
||
jrlo #no_oop
|
||
cmpi ALLEYOOP14_SEQ,a3 ;Is it an oop?
|
||
jrls #ys_yalt ;br=no
|
||
#no_oop
|
||
cmpi DDUNK_RECV_SEQ,a3
|
||
jrne #no_yalt ; br=no
|
||
#ys_yalt
|
||
movi YBUFF_ALLEY,a1 ;Set buffer count
|
||
movk (-YRATE_SLOW)&31,a2 ;Set Y rate shift count
|
||
jruc #do_yalt
|
||
#free
|
||
.if DEBUG
|
||
.asg 0,YALTOFF ;Scroller Y offset for debug
|
||
.else
|
||
.asg 0,YALTOFF ;Always 0!
|
||
.endif
|
||
|
||
.if VSCR_CNT
|
||
move @ballshotinair,a14 ;Shooter # if shot in air, else -1
|
||
jrnn #do_yalt ; br=shot in the air
|
||
cmpi GNDI_H-VSCR_CNT-YALTOFF,a0
|
||
jrle #do_yalt
|
||
subi GNDI_H,a0
|
||
jruc #chk_trgy ;Go scroll up
|
||
.endif
|
||
|
||
#do_yalt
|
||
move *a8(OYPOS),a14
|
||
add a14,a0 ;TARGY+=BallAltitude
|
||
#no_yalt
|
||
add a1,a0 ;Add buffer count to TARGY
|
||
cmpi -VSCR_CNT-CLIP_CNT-YALTOFF,a0
|
||
jrlt #chk_trgy ;Did it go pos? 0 it if so
|
||
movi -VSCR_CNT-CLIP_CNT-YALTOFF,a0
|
||
|
||
#chk_trgy
|
||
move @WORLDTLY+16,a1 ;Int part of WORLDTLY
|
||
sub a1,a0 ;DIFFY=TARGY-WORLDTLY
|
||
jreq #wy_skip
|
||
sra a2,a0 ;Shift-div DIFFY to calc step
|
||
jrnz #wy_sok ;Don't allow step of 0
|
||
addk 1,a0
|
||
#wy_sok
|
||
add a0,a1 ;Step WORLDTLY
|
||
cmpi YMIN_VIEW,a1 ;In allowed range?
|
||
jrge #wy_set
|
||
movi YMIN_VIEW,a1
|
||
#wy_set
|
||
move a1,@WORLDTLY+16 ;Set new TLY
|
||
|
||
.asg -80,YBUFF_BOX
|
||
.ref crbox1_p ;sky box, all
|
||
|
||
move @pup_court,a14 ;No skybox to scroll if outside
|
||
jrnz #wy_skip
|
||
neg a1
|
||
addi YBUFF_BOX,a1
|
||
jrgt #chk_boxy
|
||
move @off_boxy,a0
|
||
jrz #wy_skip
|
||
clr a1
|
||
jruc #do_boxy
|
||
#chk_boxy
|
||
move a1,a0
|
||
sra 3,a1 ;Take frac of Y diff (3/32)
|
||
sra 5,a0
|
||
sub a0,a1
|
||
move @off_boxy,a0
|
||
#do_boxy
|
||
sub a1,a0
|
||
jreq #wy_skip
|
||
move a1,@off_boxy
|
||
movi crbox1_p,a3 ;sky box, all
|
||
movk 5,a5
|
||
#boxy
|
||
move *a3+,a2,L
|
||
move *a2(OYPOS),a14
|
||
sub a0,a14
|
||
move a14,*a2(OYPOS)
|
||
dsj a5,#boxy
|
||
|
||
#wy_skip
|
||
|
||
;----------
|
||
|
||
.ref do_ball_ani
|
||
calla do_ball_ani
|
||
|
||
;----------
|
||
; check ball Y coor bounce
|
||
|
||
move *a8(OYVEL),a2,L
|
||
move *a8(OYPOS),a1
|
||
move *a13(ball_aniy),a3
|
||
add a3,a1
|
||
;
|
||
; cmpi HOOPY-10,a1 ;TEMP!!! Floats ball
|
||
;
|
||
jrlt #agnd ;Above gnd? br=yes
|
||
|
||
movi -1,a0
|
||
move a0,@ballshotinair ;Shooter # if shot in air, else -1
|
||
clr a0
|
||
calla plyr_setshtdly
|
||
|
||
cmpi >7f00,a2 ;>4000
|
||
jrlt #nosnd
|
||
|
||
movi dribble3_snd,a0,L
|
||
move @pup_court,a14
|
||
jrnz #ply1 ;br=outdoor court
|
||
movi dribble_snd,a0,L
|
||
#ply1 calla snd_play1
|
||
#nosnd
|
||
neg a3
|
||
;
|
||
; addi HOOPY-10,A3 ;TEMP!!! Floats ball
|
||
;
|
||
move a3,*a8(OYPOS) ;Set on gnd
|
||
neg a2
|
||
move a2,a3 ;Take 1/4 off YVEL
|
||
sra 2,a3
|
||
sub a3,a2
|
||
;; move @ballpnum,a0 ;Plyr # who owns (0-3) or Neg
|
||
;; jrnn #agnd ; br=owned, dribbling
|
||
;; sra 1,a3 ;Take another 1/8 off YVEL
|
||
;; sub a3,a2
|
||
#agnd
|
||
addi GRAVB,a2
|
||
move a2,*a8(OYVEL),L
|
||
|
||
move *a8(OXVAL),*a9(OXVAL),L ;>Align shadow
|
||
move *a8(OXANI),*a9(OXANI),L
|
||
move *a8(OZPOS),a0
|
||
subk 10,a0 ;Adjust
|
||
move a0,*a9(OZPOS)
|
||
|
||
#halted2
|
||
;Did ball just hit the rim? If yes, skip collisions!
|
||
;I hope this variable never gets thrashed!
|
||
move @in_cylinder,a0
|
||
jrnz #halted
|
||
callr ball_chkpcollide
|
||
|
||
#halted
|
||
SLOOP 1,#lp
|
||
|
||
|
||
********************************
|
||
* Get shadow obj for ball
|
||
* A8=*Obj
|
||
* >A9=*Shadow obj
|
||
* Trashes scratch, A2-A7
|
||
|
||
SUBRP ball_getshadow
|
||
|
||
PUSH a8
|
||
|
||
move *a8(OXVAL),a0,L
|
||
movi [-2,0],a1
|
||
movi ballshad5,a2
|
||
move *a8(OZPOS),a3
|
||
subk 10,a3 ;Z
|
||
move *a8(OCTRL),a4
|
||
andi M_FLIPH|M_FLIPV,a4
|
||
ori DMAWNZ|M_3D|M_SHAD|M_NOCOLL,a4
|
||
movi CLSDEAD,a5
|
||
clr a6
|
||
clr a7
|
||
calla BEGINOBJ2
|
||
move a8,a9
|
||
movk 10,a0
|
||
move a0,*a8(OMISC) ;Z offset
|
||
|
||
PULL a8
|
||
rets
|
||
|
||
|
||
#*******************************
|
||
* Check ball for collisions with backboard/hoop
|
||
* A6=Ball ani XPOS
|
||
* A8=*Ball obj
|
||
* A13=*Ball process
|
||
* Trashes scratch, B2-B3
|
||
|
||
SUBRP ball_bbcollision
|
||
|
||
PUSH a2,a3,a4,a5,a6,a7,a9,a10,a11
|
||
|
||
move *a8(OYPOS),a7 ;A7=Ball Y
|
||
move *a8(OSIZEY),a14
|
||
srl 1,a14
|
||
add a14,a7 ;=Ball center Y
|
||
|
||
.if DEBUG
|
||
move @RIM_STEP,a0
|
||
jrz #ttt2
|
||
clr a14
|
||
cmpi HOOPY+20,a7
|
||
jrge #ttt1
|
||
move *a8(OZPOS),a0
|
||
movi CZMID,A1
|
||
sub a1,a0
|
||
abs a0
|
||
cmpi 20,a0
|
||
jrge #ttt1
|
||
movi HOOPLX,a0
|
||
sub a6,a0
|
||
abs a0
|
||
cmpi 24,a0
|
||
jrhi #ttt0
|
||
movk 4,a14
|
||
#ttt0
|
||
movi HOOPRX,a0
|
||
sub a6,a0
|
||
abs a0
|
||
cmpi 24,a0
|
||
jrhi #ttt1
|
||
movk 4,a14
|
||
#ttt1
|
||
.ref slowmotion
|
||
.ref pup_notag
|
||
move a14,@slowmotion
|
||
movk 15,a14
|
||
move a14,@pup_notag
|
||
#ttt2
|
||
.endif
|
||
|
||
cmpi HOOPY+20,a7 ;Below all collision pts? Yes if >=
|
||
jrge #x
|
||
|
||
clr b2 ;B2=Rim collision flag
|
||
|
||
move @shot_distance,a14
|
||
cmpi >150*DIST_ADDITION,a14 ;!!!Close or far shot?
|
||
jrlt #ok
|
||
|
||
move @ballscorezhit,a0 ;Far, but have we hit 1st score zone?
|
||
jrp #ok ; br=yes, continue score detect
|
||
|
||
movi 200,a0 ;!!!Far. Set long odds
|
||
cmpi >1c0*DIST_ADDITION,a14 ;!!!How far?
|
||
jrlt #far
|
||
movi 20,a0 ;!!!Very far. Set longer odds
|
||
#far
|
||
move @game_time,a1,L
|
||
cmpi >400,a1 ;!!!Improve odds if qrtr almost over
|
||
jrgt #nohelp
|
||
addi 150,a0 ;!!!
|
||
#nohelp
|
||
calla RNDPER ;Scoreable or unscoreable?
|
||
jrhi #ok
|
||
movi lhoopl_t,a10 ;Set ptr for unscoreable hoop
|
||
movi HOOPLX,b3 ;B3=Hoop X
|
||
cmpi WRLDMID,a6
|
||
jrlt #left
|
||
movi lhoopr_t,a10
|
||
movi HOOPRX,b3
|
||
jruc #left
|
||
#ok
|
||
movi hoopl_t,a10 ;Set ptr for scoreable hoop
|
||
movi HOOPLX,b3 ;B3=Hoop X
|
||
cmpi WRLDMID,a6
|
||
jrlt #left
|
||
movi hoopr_t,a10
|
||
movi HOOPRX,b3
|
||
#left
|
||
move *a8(OZPOS),a5 ;A5=Ball Z
|
||
move @ballscorezhit,a0 ;Haven't scored? No if >=
|
||
jrge #chkpts
|
||
|
||
move *a8(OZVEL),a0,L ;Yes. Slow XYZ vels
|
||
sra 1,a0
|
||
move a0,*a8(OZVEL),L ;=-1/2 ZVEL
|
||
|
||
move *a8(OYVEL),a0,L
|
||
move a0,a14
|
||
sra 2,a14
|
||
sub a14,a0
|
||
move a0,*a8(OYVEL),L ;=-1/4 YVEL
|
||
|
||
move a6,a0 ;Pull ball toward hoop center X
|
||
move b3,a14
|
||
sub a14,a0 ;=BALLX-HOOPX
|
||
sll 16-4,a0 ;XVELPULLCTR=(INT:FRC)/16
|
||
|
||
move *a8(OXVEL),a1,L
|
||
sub a0,a1 ;=XVEL-XVELPULLCTR
|
||
move a1,a14
|
||
sra 2,a14
|
||
sub a14,a1
|
||
move a1,*a8(OXVEL),L ;=-1/4 XVEL
|
||
|
||
jruc #chkbb
|
||
|
||
;----------
|
||
; Top of rim pt chk loop
|
||
|
||
#lp
|
||
move *a10+,a3 ;Rim Y
|
||
move *a10+,a4 ;Rim Z
|
||
move *a10+,a11 ;Rim zone #
|
||
sub a6,a2
|
||
sub a7,a3
|
||
sub a5,a4
|
||
abs a2
|
||
abs a3
|
||
abs a4
|
||
|
||
.asg 4,DX_RNG ;!!!
|
||
.asg 4,DY_RNG ;!!!
|
||
.asg 4,DZ_RNG ;!!!
|
||
.asg 5,MAX_RNG ;!!!
|
||
|
||
cmpi DX_RNG,a2
|
||
jrgt #nxt
|
||
cmpi DY_RNG,a3
|
||
jrgt #nxt
|
||
cmpi DZ_RNG,a4
|
||
jrgt #nxt
|
||
|
||
cmp a3,a2 ;Sort A10,A12,A13 to most,mid,least
|
||
jrge #20
|
||
SWAP a2,a3
|
||
#20
|
||
cmp a4,a3
|
||
jrge #sorted
|
||
SWAP a3,a4
|
||
|
||
cmp a3,a2
|
||
jrge #sorted
|
||
SWAP a2,a3
|
||
#sorted
|
||
srl 1,a3 ;1/2 of delta mid
|
||
srl 2,a4 ;1/4 of delta least
|
||
add a3,a2 ;Sum the deltas
|
||
add a4,a2
|
||
subk MAX_RNG,a2 ;Too far? Yes if >
|
||
jrgt #nxt
|
||
|
||
move @sc_proc,a0,L ;No. Any shot clock going?
|
||
jrz #no24clock
|
||
;; move *a0(PROCID),a14
|
||
;; cmpi clockid,a14
|
||
;; jrz #cont
|
||
;; LOCKUP
|
||
;;#cont
|
||
clr a14 ;Yes. Clr so we don't do this again
|
||
move a14,@sc_proc,L
|
||
PUSH a7,a10 ;Go turn it off
|
||
movi sclockx,a7
|
||
movi clockid,a1
|
||
move *a0(PA10),a10,L
|
||
calla XFERPROC
|
||
PULL a7,a10
|
||
#no24clock
|
||
clr a0
|
||
move a0,@ballgoaltcnt
|
||
|
||
movi 3*60+30,a0 ;!!!Set Rebound stat time limit
|
||
move a0,@rebound_delay
|
||
|
||
movi -1,a0 ;Tell shot clock ball has no owner
|
||
move a0,@ballsclastp
|
||
move a0,@ballshotinair ;Shooter # if shot in air, else -1
|
||
|
||
move a11,a11 ;Scoreable? Yes if <=
|
||
jrle #notrim
|
||
|
||
.if DEBUG
|
||
move @RIM_STEP,a0
|
||
jrz #nobprs
|
||
calla get_all_buttons_cur2
|
||
andi 2020202h,a0
|
||
jrz #nobp
|
||
movk 1,a0
|
||
move a0,@HALT
|
||
jruc #x
|
||
#nobp
|
||
clr a0
|
||
move a0,@HALT
|
||
#nobprs
|
||
.endif
|
||
|
||
move @ballrimhitcnt,a0 ;No. Already hit the rim? Yes if !0
|
||
jrnz #skipit
|
||
|
||
PUSH a0,a7,a11 ;No
|
||
|
||
|
||
;To disallow people from swatting (or rebounding) ball off of rim, we will
|
||
;ignore ball collisions for x ticks after the first rim hit....
|
||
;Yikes!
|
||
movk 12,a0
|
||
move a0,@in_cylinder
|
||
|
||
;Disallow slap rejection of ball within 120 ticks - rejection art will
|
||
;glitch into rebound art within this time limit...
|
||
movi 120,a0
|
||
move a0,@must_rebound
|
||
|
||
|
||
|
||
move @ballpnumshot,a0 ;Set ptr to shooter brick cnt
|
||
sll 4,a0
|
||
addi brick_count,a0
|
||
move *a0,a1 ;Inc brick cnt (in case it is one?)
|
||
inc a1
|
||
move a1,*a0
|
||
move b3,a11 ;A11=Hoop X
|
||
CREATE NOG_PID,no_good_check ;Let it say "No good" (if it is?)
|
||
PULL a0,a7,a11
|
||
#skipit
|
||
addk 1,a0 ;Inc rim hit cnt
|
||
move a0,@ballrimhitcnt
|
||
|
||
move b2,b2 ;Hit already? Yes if !0
|
||
jrnz #not1st
|
||
|
||
addk 1,b2 ;No. Set hit flag
|
||
cmpi 2,a11 ;Hit in a rim-bend zone? No if <
|
||
jrlt #nobend
|
||
clr a0 ;Yes. Do rim bend anim
|
||
move @rimlf,a1,L ;Assume doing lft hoop
|
||
cmpi WRLDMID,a6 ;Bend lft or rgt rim? Lft if <
|
||
jrlt #netani
|
||
movk 1,a0 ;Set for rgt hoop
|
||
move @rimrf,a1,L
|
||
#netani
|
||
move *a1(OIMG),a1,L ;Deref *obj
|
||
cmpi FLAME_F_13,a1,L ;Is it burnt hoop img? Yes if =
|
||
jreq #nobend
|
||
cmpi FLAME2F_13,a1,L ;Is it burnt hoop img? Yes if =
|
||
jreq #nobend
|
||
movk NET_MISS_CLOSE,a1 ;No, we can bend it
|
||
move @shot_distance,a14
|
||
cmpi 300*DIST_ADDITION,a14 ;!!!Shot close or far?
|
||
jrlt #nani
|
||
movk NET_MISS_FAR,a1
|
||
#nani
|
||
calla net_ani
|
||
#nobend
|
||
move @pup_court,a0
|
||
jrz #indrct ;br=indoor court!
|
||
SOUND1 miss5_snd
|
||
jruc #not1st
|
||
#indrct
|
||
move @PCNT,a0 ;Do rnd rim-bounce sound
|
||
sll 32-2,a0 ; (choose 1 of 4 possible)
|
||
srl 32-2-5,a0
|
||
addi rim_snds,a0
|
||
move *a0,a0,L
|
||
calla snd_play1
|
||
|
||
#not1st
|
||
PUSH A5,A6,A7,A11,A12,A13 ;Move ball back out of rim detection
|
||
sll 16,a6
|
||
sll 16,a7 ;A7=Y:0
|
||
sll 16,a5
|
||
move a6,a9 ;A9=X:0
|
||
move a5,a11 ;A11=Z:0
|
||
|
||
movk OXVEL,a0
|
||
add a8,a0
|
||
mmfm a0,a6,a5,a4,a3,a2,a1 ;Get VELs & VALs (X,Y,Z,X,Y,Z)
|
||
movx a3,a9 ;Copy VAL fracs to ball detect POSs
|
||
movx a2,a7
|
||
movx a1,a11
|
||
|
||
.bss ballrimhit_x,32
|
||
.bss ballrimhit_y,32
|
||
.bss ballrimhit_z,32
|
||
|
||
move a9,@ballrimhit_x,L
|
||
move a7,@ballrimhit_y,L
|
||
move a11,@ballrimhit_z,L
|
||
cmpi 1,b2 ;Hit already? Yes if >
|
||
jrls #yes1st ; br=no
|
||
PULL A5,A6,A7,A11,A12,A13
|
||
jruc #notstk
|
||
#yes1st
|
||
sra 4,a6 ;!!!Take frac of VELs
|
||
sra 4,a5 ;!!!
|
||
sra 4,a4 ;!!!
|
||
|
||
subi 4*16,a10 ;Retrieve coords we detected against
|
||
move *a10+,a0 ; to calc detection deltas
|
||
sll 16,a0
|
||
sub a0,a9 ;=dX
|
||
move *a10+,a0
|
||
sll 16,a0
|
||
sub a0,a7 ;=dY
|
||
move *a10+,a0
|
||
sll 16,a0
|
||
sub a0,a11 ;=dZ
|
||
addk 16,a10
|
||
#velstep
|
||
sub a6,a3 ;Step back the ball
|
||
sub a5,a2
|
||
sub a4,a1
|
||
sub a6,a9 ;Step back the deltas
|
||
sub a5,a7
|
||
sub a4,a11
|
||
move a9,a12 ;Get abs of delta integers
|
||
abs a12
|
||
srl 16,a12
|
||
move a7,a13
|
||
abs a13
|
||
srl 16,a13
|
||
move a11,a14
|
||
abs a14
|
||
srl 16,a14
|
||
|
||
cmpi DX_RNG,a12
|
||
jrgt #velset
|
||
cmpi DY_RNG,a13
|
||
jrgt #velset
|
||
cmpi DZ_RNG,a14
|
||
jrgt #velset
|
||
|
||
cmp a13,a12 ;Sort A12,A13,A14 to most,mid,least
|
||
jrge #30
|
||
SWAP a12,a13
|
||
#30
|
||
cmp a14,a13
|
||
jrge #velsort
|
||
SWAP a13,a14
|
||
|
||
cmp a13,a12
|
||
jrge #velsort
|
||
SWAP a12,a13
|
||
#velsort
|
||
srl 1,a13 ;1/2 of delta mid
|
||
srl 2,a14 ;1/4 of delta least
|
||
add a13,a12 ;Sum the deltas
|
||
add a14,a12
|
||
subk MAX_RNG,a12 ;Too far? No if <=
|
||
jrle #velstep
|
||
#velset
|
||
move a5,a5 ;Keep steping if ball Y has still
|
||
jrnn #posyv ; stepped over the collision pt Y
|
||
move a7,a7
|
||
jrn #velstep
|
||
jruc #velst
|
||
#posyv
|
||
move a7,a7
|
||
jrnn #velstep
|
||
#velst
|
||
move a3,*a8(OXVAL),L
|
||
move a2,*a8(OYVAL),L
|
||
move a1,*a8(OZVAL),L
|
||
PULL A5,A6,A7,A11,A12,A13
|
||
|
||
move *a13(ball_collcnt),a1 ;Might ball be stuck?
|
||
subk 3,a1 ;!!!No if <
|
||
jrlt #notstk
|
||
callr ball_stuck ;Go try unstick &
|
||
jruc #limvels ; exit detect loop
|
||
|
||
#notstk
|
||
subi 4*16,a10 ;Retrieve coords we detected against
|
||
move *a10+,a2 ; for deflection
|
||
move *a10+,a3
|
||
move *a10+,a4
|
||
addk 16,a10
|
||
callr ball_deflect
|
||
jruc #limvels ; exit detect loop
|
||
; jruc #nxt ;Go chk next pt
|
||
|
||
#notrim
|
||
callr ball_score ;Score if really a basket
|
||
move @ballscorezhit,a0 ;Did it score?
|
||
jrn #limvels ; br=yes
|
||
|
||
#chkpts
|
||
#nxt
|
||
move *a10+,a2 ;Rim X
|
||
jrnz #lp ;End of table? No if !0
|
||
|
||
;----------
|
||
; Do velocity limits
|
||
|
||
#limvels
|
||
move b2,a1 ;Chk consecutive rim collisions
|
||
jrz #svcol ;Hit rim this time? br=no, reset cnt
|
||
move *a13(ball_collcnt),a1 ;Inc consecutive cnt
|
||
addk 1,a1
|
||
#svcol
|
||
move a1,*a13(ball_collcnt)
|
||
jrz #chkbb ;No rim collision? br=no
|
||
|
||
move *a8(OXVEL),a2,L ;Yes. Limit max X&Z VEL
|
||
move *a8(OZVEL),a3,L
|
||
move *a8(OYVEL),a4,L
|
||
move a4,a14
|
||
sra 8,a14 ;=YVEL/256
|
||
move a2,a0
|
||
move a3,a1
|
||
abs a0 ;=abs(XVEL)
|
||
abs a1 ;=abs(ZVEL)
|
||
cmp a0,a1 ;Make A1 whichever is faster, X|Z
|
||
jrge #sclvlp
|
||
move a0,a1
|
||
#sclvlp
|
||
cmpi >18000,a1 ;>12000;!!!X|Z VEL within max? Yes if <
|
||
jrle #chkyv
|
||
srl 1,a1 ;Shift down X&Z
|
||
sra 1,a2
|
||
sra 1,a3
|
||
add a14,a4 ;Bump Y fractionally
|
||
jruc #sclvlp
|
||
#chkyv
|
||
move a2,*a8(OXVEL),L ;Store back (new) X&Z vels
|
||
move a3,*a8(OZVEL),L
|
||
|
||
cmpi ->44000,a4 ;!!!Limit max up YVEL
|
||
jrge #yupok
|
||
movi ->44000,a4 ;!!!
|
||
#yupok
|
||
cmpi >30000,a4 ;!!!Limit max dn YVEL
|
||
jrle #ydnok
|
||
movi >30000,a4 ;!!!
|
||
#ydnok
|
||
move a4,*a8(OYVEL),L ;Store back (new) Y vel
|
||
|
||
;----------
|
||
; Detect backboard
|
||
|
||
.asg 4,BBRD_X_BC ;# frac bits to keep in XVAL detect
|
||
.asg 4,BBRD_X_DEPTH ;# frac bits to keep in XVAL detect
|
||
|
||
#chkbb
|
||
subi BBRD_Z,a5 ;Chk Z
|
||
move a5,a2
|
||
abs a2
|
||
cmpi BBRD_ZWID/2,a2
|
||
jrgt #x
|
||
subi BBRD_Y-BBRD_YWID/2,a7 ;Chk Y
|
||
abs a7
|
||
cmpi BBRD_YWID/2,a7
|
||
jrgt #x
|
||
move *a8(OXVAL),a6,L ;Add ani X to check ball center
|
||
move *a13(ball_anix),a14
|
||
sll 16,a14
|
||
add a14,a6
|
||
subi [WRLDMID,0],a6,L ;Chk X
|
||
move a6,a2
|
||
abs a6
|
||
sra 16-BBRD_X_BC,a6
|
||
;; sub a5,a6 ;Fudge with (now 3/32) Z offset from
|
||
;; sra 1,a5 ; bbrd ctr to retard/advance X detect
|
||
;; sub a5,a6
|
||
cmpi BBRD_X << BBRD_X_BC,a6
|
||
jrlt #x
|
||
|
||
movi -1,a0 ;Detect
|
||
move a0,@ballshotinair ;Shooter # if shot in air, else -1
|
||
move *a8(OXVEL),a0,L ;Make sure ball continues
|
||
abs a0 ; towards ctr crt
|
||
move a0,a1 ;Slow down XVEL
|
||
srl 2,a1 ;-25%
|
||
sub a1,a0
|
||
move a2,a2
|
||
jrn #lbb ;Lft bbrd? Yes if -
|
||
neg a0
|
||
#lbb
|
||
move a0,*a8(OXVEL),L
|
||
move *a8(OXVAL),a1,L ;Give XVAL a quick kick in new dir
|
||
add a0,a1
|
||
add a0,a1
|
||
move a1,*a8(OXVAL),L
|
||
|
||
abs a0 ;Should we make a bbrd bounce sound?
|
||
cmpi >1fff,a0 ;!!! Min XVEL to make sound
|
||
jrlt #softbbhit
|
||
movi hitbkbd_snd,a0,L
|
||
move @pup_court,a14
|
||
jrz #indr ;br=indoor court
|
||
movi hitbkbd2_snd,a0,L
|
||
#indr calla snd_play1
|
||
#softbbhit
|
||
.ref backbrd_hit_speech
|
||
CREATE0 backbrd_hit_speech
|
||
move @ballbbhitcnt,a0
|
||
addk 1,a0
|
||
move a0,@ballbbhitcnt
|
||
|
||
subk 7,a0 ;!!! Stuck on bbrd? No if <
|
||
jrlt #x
|
||
movi >20000,a0 ;!!! ZVEL(!) to kick it from bbrd
|
||
move *a8(OZPOS),a1
|
||
cmpi CZMID,a1 ;Kick it which way? Out if >
|
||
jrgt #newzv
|
||
neg a0 ;In
|
||
#newzv
|
||
move a0,*a8(OZVEL),L ;Try to unstick
|
||
|
||
#x PULL a2,a3,a4,a5,a6,a7,a9,a10,a11
|
||
rets
|
||
|
||
|
||
.asg HOOPLX,X
|
||
.asg HOOPY,Y
|
||
.asg CZMID,Z
|
||
hoopl_t
|
||
.word X+8 ,Y ,Z ,4 ;Rim
|
||
.word X+6 ,Y ,Z-6 ,3
|
||
.word X+6 ,Y ,Z+6 ,3
|
||
.word X+3 ,Y ,Z-8 ,1
|
||
.word X+3 ,Y ,Z+8 ,1
|
||
.word X ,Y ,Z-9 ,2
|
||
.word X ,Y ,Z+9 ,2
|
||
.word X-3 ,Y ,Z-8 ,1
|
||
.word X-3 ,Y ,Z+8 ,1
|
||
.word X-6 ,Y ,Z-6 ,1
|
||
.word X-6 ,Y ,Z+6 ,1
|
||
.word X-8 ,Y ,Z ,1
|
||
|
||
.word X ,Y ,Z ,-1 ;Score spots
|
||
.word X ,Y+3 ,Z ,-1
|
||
|
||
.word X+1 ,Y+6 ,Z ,-2
|
||
.word X ,Y+6 ,Z-1 ,-2
|
||
.word X ,Y+6 ,Z+1 ,-2
|
||
.word X-1 ,Y+6 ,Z ,-2
|
||
|
||
.word X+3 ,Y+8 ,Z ,-2
|
||
.word X ,Y+8 ,Z-3 ,-2
|
||
.word X ,Y+8 ,Z+3 ,-2
|
||
.word X-3 ,Y+8 ,Z ,-2
|
||
.word 0
|
||
|
||
.asg HOOPRX,X
|
||
hoopr_t
|
||
.word X-8 ,Y ,Z ,4 ;Rim
|
||
.word X-6 ,Y ,Z-6 ,3
|
||
.word X-6 ,Y ,Z+6 ,3
|
||
.word X-3 ,Y ,Z-8 ,1
|
||
.word X-3 ,Y ,Z+8 ,1
|
||
.word X ,Y ,Z-9 ,2
|
||
.word X ,Y ,Z+9 ,2
|
||
.word X+3 ,Y ,Z-8 ,1
|
||
.word X+3 ,Y ,Z+8 ,1
|
||
.word X+6 ,Y ,Z-6 ,1
|
||
.word X+6 ,Y ,Z+6 ,1
|
||
.word X+8 ,Y ,Z ,1
|
||
|
||
.word X ,Y ,Z ,-1 ;Score spots
|
||
.word X ,Y+3 ,Z ,-1
|
||
|
||
.word X-1 ,Y+6 ,Z ,-2
|
||
.word X ,Y+6 ,Z-1 ,-2
|
||
.word X ,Y+6 ,Z+1 ,-2
|
||
.word X+1 ,Y+6 ,Z ,-2
|
||
|
||
.word X-3 ,Y+8 ,Z ,-2
|
||
.word X ,Y+8 ,Z-3 ,-2
|
||
.word X ,Y+8 ,Z+3 ,-2
|
||
.word X+3 ,Y+8 ,Z ,-2
|
||
.word 0
|
||
|
||
|
||
;--------------------
|
||
; Long range shot tables; no score pts
|
||
|
||
.asg HOOPLX,X
|
||
lhoopl_t
|
||
.word X+8 ,Y ,Z ,4 ;Rim
|
||
.word X+6 ,Y ,Z-6 ,3
|
||
.word X+6 ,Y ,Z+6 ,3
|
||
.word X+3 ,Y ,Z-8 ,1
|
||
.word X+3 ,Y ,Z+8 ,1
|
||
.word X ,Y ,Z-9 ,2
|
||
.word X ,Y ,Z+9 ,2
|
||
.word X-3 ,Y ,Z-8 ,1
|
||
.word X-3 ,Y ,Z+8 ,1
|
||
.word X-6 ,Y ,Z-6 ,1
|
||
.word X-6 ,Y ,Z+6 ,1
|
||
.word X-8 ,Y ,Z ,1
|
||
|
||
.word X+4 ,Y ,Z ,3 ;No-score spots
|
||
.word X ,Y ,Z-4 ,2
|
||
.word X ,Y ,Z ,2
|
||
.word X ,Y ,Z+4 ,2
|
||
.word X-4 ,Y ,Z ,1
|
||
|
||
.word 0
|
||
|
||
.asg HOOPRX,X
|
||
lhoopr_t
|
||
.word X-8 ,Y ,Z ,4 ;Rim
|
||
.word X-6 ,Y ,Z-6 ,3
|
||
.word X-6 ,Y ,Z+6 ,3
|
||
.word X-3 ,Y ,Z-8 ,1
|
||
.word X-3 ,Y ,Z+8 ,1
|
||
.word X ,Y ,Z-9 ,2
|
||
.word X ,Y ,Z+9 ,2
|
||
.word X+3 ,Y ,Z-8 ,1
|
||
.word X+3 ,Y ,Z+8 ,1
|
||
.word X+6 ,Y ,Z-6 ,1
|
||
.word X+6 ,Y ,Z+6 ,1
|
||
.word X+8 ,Y ,Z ,1
|
||
|
||
.word X-4 ,Y ,Z ,3 ;No-score spots
|
||
.word X ,Y ,Z-4 ,2
|
||
.word X ,Y ,Z ,2
|
||
.word X ,Y ,Z+4 ,2
|
||
.word X+4 ,Y ,Z ,1
|
||
|
||
.word 0
|
||
|
||
rim_snds
|
||
.long miss1_snd,miss4_snd,miss2_snd,miss3_snd
|
||
|
||
|
||
#*******************************
|
||
* Deflect ball from what it hit
|
||
* A2=Hit X
|
||
* A3=Hit Y
|
||
* A4=Hit Z
|
||
* ballrimhit_x=ball ctr X @ hit
|
||
* ballrimhit_y=ball ctr Y @ hit
|
||
* ballrimhit_z=ball ctr Z @ hit
|
||
* A8=*Ball obj
|
||
* A13=*Ball process
|
||
* Trashes scratch, A0-A4
|
||
|
||
;LOOK!!!
|
||
SUBRP ball_deflect
|
||
|
||
PUSH a5,a6,a7,a9,a10,a11
|
||
|
||
move @ballrimhit_x,a6,L
|
||
move @ballrimhit_y,a7,L
|
||
move @ballrimhit_z,a5,L
|
||
move *a8(OXVEL),a14,L
|
||
sub a14,a6
|
||
move *a8(OYVEL),a14,L
|
||
sub a14,a7
|
||
move *a8(OZVEL),a14,L
|
||
sub a14,a5
|
||
|
||
;; move *a8(OXVAL),a6,L
|
||
;; move *a8(OYVAL),a7,L
|
||
;; move *a8(OZVAL),a5,L
|
||
;;
|
||
;; move *a13(ball_anix),a14 ;Add ani X to check ball center
|
||
;; sll 16,a14
|
||
;; add a14,a6
|
||
;;
|
||
;; move *a8(OSIZEY),a14
|
||
;; sll 16-1,a14 ;Shf up -1 to divide SIZEY in half
|
||
;; add a14,a7 ;=Ball center Y
|
||
|
||
sll 16,a2
|
||
sll 16,a3
|
||
sll 16,a4
|
||
|
||
;; sra 12,a5
|
||
;; sra 12,a6
|
||
;; sra 12,a7
|
||
;; sll 4,a2
|
||
;; sll 4,a3
|
||
;; sll 4,a4
|
||
;;; sll 4,a5
|
||
;;; sll 4,a6
|
||
;;; sll 4,a7
|
||
|
||
PUSH a2,a3,a6,a7
|
||
|
||
move a6,a0 ;>Deflect XZ
|
||
move a5,a1
|
||
move a2,a6
|
||
move a4,a7
|
||
callr seekdir_xyxy128
|
||
move a0,a14
|
||
neg a0
|
||
addi >80,a0
|
||
callr sinecos_get
|
||
|
||
move *a8(OXVEL),a3,L
|
||
move *a8(OZVEL),a9,L
|
||
sra 1,a3 ;Shf to avoid mpy overflows
|
||
sra 1,a9
|
||
|
||
move a3,a5 ;>Rotate to 0
|
||
move a9,a11
|
||
mpys a1,a3 ;X*COS
|
||
mpys a0,a11 ;Z*SIN
|
||
sub a11,a3 ;X-Z
|
||
mpys a0,a5 ;X*SIN
|
||
mpys a1,a9 ;Z*COS
|
||
add a5,a9 ;X+Z
|
||
sra 12,a3
|
||
sra 12,a9
|
||
|
||
neg a9 ;Neg Z
|
||
|
||
move a14,a0
|
||
callr sinecos_get
|
||
|
||
move a3,a5 ;>Rotate back
|
||
move a9,a11
|
||
mpys a1,a3 ;X*COS
|
||
mpys a0,a11 ;Z*SIN
|
||
sub a11,a3 ;X-Z
|
||
mpys a0,a5 ;X*SIN
|
||
mpys a1,a9 ;Z*COS
|
||
add a5,a9 ;X+Z
|
||
sra 12,a3
|
||
sra 12,a9
|
||
|
||
sla 1,a3
|
||
sla 1,a9
|
||
move a3,*a8(OXVEL),L
|
||
move a9,*a8(OZVEL),L
|
||
|
||
PULL a2,a3,a6,a7
|
||
|
||
move a6,a0 ;>Deflect XY
|
||
move a7,a1
|
||
move a2,a6
|
||
move a3,a7
|
||
callr seekdir_xyxy128
|
||
move a0,a14
|
||
neg a0
|
||
addi >80,a0
|
||
callr sinecos_get
|
||
|
||
move *a8(OXVEL),a3,L
|
||
move *a8(OYVEL),a9,L
|
||
sra 1,a3
|
||
sra 1,a9
|
||
|
||
move a3,a5 ;>Rotate to 0
|
||
move a9,a11
|
||
mpys a1,a3 ;X*COS
|
||
mpys a0,a11 ;Z*SIN
|
||
sub a11,a3 ;X-Z
|
||
mpys a0,a5 ;X*SIN
|
||
mpys a1,a9 ;Z*COS
|
||
add a5,a9 ;X+Z
|
||
sra 12,a3
|
||
sra 12,a9
|
||
|
||
neg a9 ;Neg Y
|
||
|
||
move a14,a0
|
||
callr sinecos_get
|
||
|
||
move a3,a5 ;>Rotate back
|
||
move a9,a11
|
||
mpys a1,a3 ;X*COS
|
||
mpys a0,a11 ;Z*SIN
|
||
sub a11,a3 ;X-Z
|
||
mpys a0,a5 ;X*SIN
|
||
mpys a1,a9 ;Z*COS
|
||
add a5,a9 ;X+Z
|
||
sra 12,a3
|
||
sra 12,a9
|
||
|
||
sla 1,a3
|
||
sla 1,a9
|
||
move a3,*a8(OXVEL),L
|
||
move a9,*a8(OYVEL),L
|
||
|
||
PULL a5,a6,a7,a9,a10,a11
|
||
rets
|
||
|
||
|
||
#*******************************
|
||
* Ball stuck on rim, try to unstick
|
||
* A8=*Ball obj
|
||
* B3=Hoop X
|
||
* Trashes scratch, A2,A3
|
||
|
||
SUBRP ball_stuck
|
||
|
||
PUSH a4,a5,a6,a7
|
||
|
||
move *a8(OIMG),a4,L
|
||
move *a8(OXANI+16),a5
|
||
move *a4(IANIOFFX),a0
|
||
move a0,*a8(OXANI+16)
|
||
|
||
move b3,a6 ;>Give vel towards or away from center
|
||
movi CZMID,a7
|
||
callr seekdirdist_obxz128
|
||
|
||
move a5,*a8(OXANI+16)
|
||
|
||
srl 3,a0 ;Dir 0-15
|
||
sll 4,a0 ;*16
|
||
addi #dx_t,a0
|
||
move *a0,a2
|
||
move *a0(#dz_t-#dx_t),a3
|
||
subk 10,a1
|
||
jrle #tcent ;Towards center?
|
||
neg a2
|
||
neg a3
|
||
sra 1,a2 ;/2
|
||
sra 1,a3
|
||
#tcent
|
||
sll 3,a2 ;*8
|
||
sll 3,a3
|
||
move a2,*a8(OXVEL),L
|
||
move a3,*a8(OZVEL),L
|
||
|
||
move *a8(OXVAL),a0,L
|
||
add a2,a0
|
||
move a0,*a8(OXVAL),L
|
||
move *a8(OZVAL),a0,L
|
||
add a3,a0
|
||
move a0,*a8(OZVAL),L
|
||
|
||
move @HCOUNT,a14
|
||
btst 0,a14
|
||
jrz #noyvc ;Skip yvel change?
|
||
|
||
movi -GRAVB*7,a1
|
||
move *a8(OYPOS),a0
|
||
cmpi HOOPY+6,a0
|
||
jrlt #abv ;Ball above rim?
|
||
neg a1
|
||
#abv move a1,*a8(OYVEL),L
|
||
|
||
#noyvc
|
||
clr a1
|
||
move a1,*a13(ball_collcnt)
|
||
|
||
PULL a4,a5,a6,a7
|
||
rets
|
||
|
||
|
||
#dz_t
|
||
.word -16384,-15137,-11585,-6270
|
||
#dx_t
|
||
.word 0,6270,11585,15137,16384,15137,11585,6270
|
||
.word 0,-6269,-11585,-15137, -16384,-15137,-11585,-6270
|
||
|
||
|
||
#*******************************
|
||
* Ball touching score zone, score if valid
|
||
* A8=*Ball obj
|
||
* A11=-1/-2 (upper spot / lower spot)
|
||
* Trashes scratch
|
||
|
||
SUBRP ball_score
|
||
|
||
PUSH a2,a3,a4,a5,a6,a7,a10,a11
|
||
|
||
|
||
move *a8(OYVEL),a0,L
|
||
jrle #x ;Moving up?
|
||
|
||
addk 1,a11
|
||
jrne #low
|
||
|
||
movk 1,a0 ;Upper zone hit
|
||
move a0,@ballscorezhit
|
||
jruc #x
|
||
|
||
#low
|
||
move @ballscorezhit,a0
|
||
jrle #x ;No top hit?
|
||
|
||
movi -1,a0
|
||
move a0,@ballscorezhit
|
||
|
||
movi NOG_PID,a0 ;kill no good process
|
||
calla KIL1C
|
||
|
||
move @ballptsforshot,a1
|
||
jrz #x ;Goaltending?
|
||
|
||
clr a10
|
||
|
||
movk 16,a0 ;Team 2
|
||
clr a2
|
||
move *a8(OXPOS),a14
|
||
cmpi WRLDMID,a14
|
||
jrlt #left
|
||
clr a0 ;Team 1
|
||
movk 32,a2
|
||
#left
|
||
addi scores,a0 ;+Base
|
||
move @ballptsforshot,a1
|
||
move a1,a3
|
||
calla score_add
|
||
|
||
clr a0
|
||
move a0,@rebound_delay
|
||
|
||
callr plyr_setptsdown
|
||
|
||
movk PS_2PTS_MADE,a0 ;>Inc made shot stat
|
||
subk 2,a3
|
||
jrz #2ptr
|
||
movk PS_3PTS_MADE,a0
|
||
#2ptr
|
||
move @ballpnumshot,a1
|
||
calla inc_player_stat
|
||
|
||
; calla scored_speech
|
||
calla prt_top_scores ;Update scores at scrn top
|
||
|
||
CREATE0 score_showtvpanel
|
||
|
||
move a2,a11 ;A11=who takes-out ball (0=1, !0=2)
|
||
|
||
.if DUNKTST
|
||
.else
|
||
CREATE0 plyr_takeoutball ;When testing dunks - TAKE OUT!
|
||
.endif
|
||
|
||
movi TSEC*1,a0
|
||
calla plyr_setshtdly
|
||
|
||
movi P1DATA,a10
|
||
calla stick_number
|
||
movi P2DATA,a10
|
||
calla stick_number
|
||
movi P3DATA,a10
|
||
calla stick_number
|
||
movi P4DATA,a10
|
||
calla stick_number
|
||
|
||
;----------
|
||
; Do plyr on-fire logic
|
||
|
||
move @ballpnumshot,a0 ;Get scoring plyr #
|
||
movi ballpnumscored,a3
|
||
move *a3+,a1 ;Get last scoring plyr #
|
||
move *a3+,a4 ;Get # times last plyr scored
|
||
move *a3+,a5 ;Get last team-shot scored (0=tm2,32=tm1)
|
||
move *a3,a7 ;Get # times last team-shot scored
|
||
|
||
move a0,a14 ;Clr scoring plyr brick cnt
|
||
sll 4,a14
|
||
addi brick_count,a14
|
||
clr a11
|
||
move a11,*a14
|
||
|
||
move a0,a10 ;Get scoring plyr *proc
|
||
sll 5,a10
|
||
addi plyrproc_t,a10
|
||
move *a10,a10,L
|
||
move *a10(plyr_seq),a6 ;Get scoring plyr ani seq #
|
||
|
||
movi AUD_ALLEYOOPS,a14
|
||
cmpi ALLEYOOP1_SEQ,a6 ;Was it an oop?
|
||
jrlo #notoop
|
||
cmpi ALLEYOOP14_SEQ,a6
|
||
jrls #yestmsht
|
||
#notoop
|
||
movi AUD_DBLE_DNKS,a14
|
||
cmpi DDUNK_RECV_SEQ,a6 ;Was it a double dunk?
|
||
; jreq #yestmsht
|
||
jreq #yestmsht2
|
||
cmpi TMFIRE_MINCNT,a7 ;Is a team on-fire?
|
||
jrhs #ply1st ; br=yes
|
||
jruc #notmsht
|
||
#yestmsht
|
||
PUSH a0
|
||
|
||
;If I am a drone, and my teammate is a human, we end up allowing only
|
||
;3 per period.
|
||
|
||
;NOTE: Double dunks do not count toward this maximum.
|
||
move *a10(plyr_alley_cnt),a0 ;3 successful drone alley oops/period
|
||
inc a0
|
||
move a0,*a10(plyr_alley_cnt)
|
||
jruc #cont_oop
|
||
#yestmsht2
|
||
PUSH a0
|
||
#cont_oop
|
||
|
||
move @GAMSTATE,a0
|
||
cmpi INAMODE,a0 ;Don't audit if in attract
|
||
jrz #noaud
|
||
move a14,a0
|
||
calla AUD1
|
||
#noaud
|
||
PULL a0
|
||
cmpi TMFIRE_MINCNT,a7 ;Is a team on-fire?
|
||
jrlo #notmfire ; br=no
|
||
cmp a5,a2 ;Same team as last time?
|
||
jreq #ply1st ; br=yes
|
||
#notmfire
|
||
addk 1,a7 ;Assume it is same team
|
||
cmp a5,a2 ;Same team as last time?
|
||
jreq #sametm ; br=yes
|
||
; move a2,a5 ;Set new last team-shot scored
|
||
movk 1,a7 ;Set new team-shot cnt
|
||
jruc #notm1
|
||
#sametm
|
||
cmpi TMFIRE_MINCNT,a7 ;Did a team go on-fire?
|
||
jrlo #notmsht ; br=no
|
||
PUSH a0,a1,a7,a9
|
||
move a5,a9
|
||
.ref tmfire_timer
|
||
CREATE tmfireid,tmfire_timer
|
||
PULL a0,a1,a7,a9
|
||
jruc #plyfireout
|
||
|
||
#notmsht
|
||
cmp a5,a2 ;Same team as last time?
|
||
jreq #sametm1 ; br=yes
|
||
clr a7 ;Set new team-shot cnt
|
||
#notm1
|
||
move a2,a5 ;Set new last team-shot scored
|
||
cmpi ONFIRE_MINCNT,a4 ;Was a plyr on-fire?
|
||
jrlt #ply1st ; br=no, set new 1st timer
|
||
jruc #plyfireout ;Go put out fire
|
||
#sametm1
|
||
cmpi ONFIRE_MINCNT,a4 ;Last scoring plyr # on-fire?
|
||
jrge #sametm2 ; br=yes
|
||
cmp a1,a0 ;Same plyr as last time?
|
||
jrne #ply1st ; br=no
|
||
jruc #sameplr
|
||
#sametm2
|
||
move @plyr_onfire,a14
|
||
btst a0,a14 ;Is scoring plyr on-fire?
|
||
jrz #savefire ; br=no, teammate is on-fire
|
||
#sameplr
|
||
.if (DUNKTST==0)|(DUNKTST==2)
|
||
addk 1,a4 ;When testing dunks - TAKE OUT!
|
||
.endif
|
||
cmpi ONFIRE_MAXCNT,a4 ;Time to put out fire?
|
||
jrlt #savefire ; br=no
|
||
|
||
#plyfireout
|
||
clr a1 ;Put out plyr on-fire
|
||
move a1,@plyr_onfire ;Save new on-fire bits
|
||
#ply1st
|
||
movk 1,a4 ;Set new # times last plyr scored
|
||
|
||
#savefire
|
||
move a7,*a3 ;Save # times last team-shot scored
|
||
move a5,-*a3 ;Save last team-shot scored (0=tm2,32=tm1)
|
||
move a4,-*a3 ;Save # times last plyr scored
|
||
move a0,-*a3 ;Save last scoring plyr #
|
||
|
||
;----------
|
||
; Do a net animation
|
||
|
||
move *a10(plyr_seqflgs),a6 ;Get plyr shot ani seq #
|
||
|
||
move @pup_court,a0
|
||
jrz #indrct2 ;br=indoor court!
|
||
movi dunk_snd5,a11,L
|
||
jruc #crt2
|
||
#indrct2
|
||
movk 3,a0
|
||
calla rndrng0
|
||
move a0,a11
|
||
sll 5,a11
|
||
addi dnk_snd_tbl,a11
|
||
move *a11,a11,L
|
||
#crt2
|
||
movk NET_DUNK,a1 ;Dunk netani #
|
||
btst DUNK_B,a6 ;Was it a dunk? Yes if !0
|
||
jrnz #netani
|
||
|
||
CREATE0 plyr_jscrowdsnd ;For good jump shot
|
||
|
||
movk 3,a0
|
||
calla rndrng0
|
||
move @pup_court,a14
|
||
jrz #indoor ;br=outdoor court
|
||
addk 4,a0
|
||
#indoor
|
||
move a0,a11
|
||
sll 5,a11
|
||
addi swish_snd_tbl,a11
|
||
move *a11,a11,L
|
||
movk NET_MIDZ_FAR,a0 ;Mid crt far netani #
|
||
movk NET_MIDZ_CLOSE,a1 ;Mid crt close netani #
|
||
move *a8(OXVEL),a14,L
|
||
move *a8(OZVEL),a4,L
|
||
abs a14
|
||
abs a4
|
||
cmp a4,a14
|
||
jrgt #gotnet
|
||
movk NET_DEEPZ_FAR,a0 ;Deep Z far netani #
|
||
movk NET_DEEPZ_CLOSE,a1 ;Deep Z close netani #
|
||
move *a8(OZVEL),a4,L
|
||
jrnn #gotnet
|
||
movk NET_NEARZ_FAR,a0 ;Near Z far netani #
|
||
movk NET_NEARZ_CLOSE,a1 ;Near Z close netani #
|
||
#gotnet
|
||
move @shot_distance,a14
|
||
cmpi 180*DIST_ADDITION,a14 ;!!!Shot close or far?
|
||
jrlt #rndani
|
||
move a0,a1 ;Use far netani #
|
||
#rndani
|
||
move @PCNT,a0 ;Choose one of the ani versions
|
||
sll 32-2,a0
|
||
srl 32-31,a0
|
||
add a0,a1
|
||
#netani
|
||
move *a3(32),a4 ;Chk for team on-fire
|
||
cmp a2,a4
|
||
jrnz #notmf ; br=not
|
||
move *a3(48),a4 ;Maybe. Chk shot cnt
|
||
subk TMFIRE_MINCNT,a4
|
||
jrnn #nethot ; br=yes, team on-fire
|
||
#notmf
|
||
move *a3(16),a4 ;Chk for plyr on-fire
|
||
; move *a3,a14
|
||
; move @fire_flags,a0
|
||
; btst a14,a0
|
||
; jrz #nor2
|
||
; subk ONFIRE_MINCNT+1,a4 ;# shots for on-fire if was before
|
||
; jruc #nor3
|
||
;#nor2
|
||
subk ONFIRE_MINCNT,a4 ;# shots for on-fire
|
||
;#nor3
|
||
jrlt #nothot ;Enough for on-fire? br=no
|
||
move @plyr_onfire,a0 ;Is shooter the one on-fire?
|
||
jrz #nethot ; br=yes, just went on-fire
|
||
move *a3,a14 ;Maybe. Was he on-fire before?
|
||
btst a14,a0
|
||
jrz #nothot
|
||
#nethot
|
||
.ref rim_fire_snd
|
||
movi rim_fire_snd,a11,L
|
||
movk NET_ONFIRE,a1 ;Burn netani # - all net
|
||
; move @ballrimhitcnt,a0
|
||
; jrz #nothot
|
||
move @HCOUNT,a0
|
||
srl 1,a0
|
||
jrnc #hotshk
|
||
movk NET_ROLLINFIRE,a1 ;Burn netani # - off rim
|
||
#hotshk
|
||
PUSH a1,a6,a10,a11
|
||
.ref SHAKER ;2
|
||
movk 24,a10
|
||
calla SHAKER ;2
|
||
move *a3(48),a4 ;Chk shot cnt
|
||
subk TMFIRE_MINCNT,a4
|
||
jrn #nosalt ; br=yes, team on-fire
|
||
.ref rim_salt
|
||
CREATE0 rim_salt
|
||
#nosalt
|
||
PULL a1,a6,a10,a11
|
||
#nothot
|
||
move a2,a0
|
||
calla net_ani ;Do net ani
|
||
|
||
move a11,a0
|
||
calla snd_play1 ;Do net sound
|
||
|
||
|
||
; .if 0
|
||
; subk 2,a4
|
||
; jrlt #cold ;The scorer is cold?
|
||
; movi heatup_snd,a0
|
||
; subk 3-2,a4
|
||
; jrlt #hsnd
|
||
; movi onfire_snd,a0
|
||
;#hsnd
|
||
; move @ballpnumshot,a1
|
||
; move @ballpnumscored,a14
|
||
; cmp a1,a14
|
||
; jrne #cold ;Teammates the hot one?
|
||
; calla snd_play1
|
||
;#cold
|
||
; .endif
|
||
|
||
|
||
move *a8(OXVEL),a0,L ;>Slow XZ vel
|
||
sra 1,a0
|
||
move a0,*a8(OXVEL),L
|
||
move *a8(OZVEL),a0,L
|
||
sra 1,a0
|
||
move a0,*a8(OZVEL),L
|
||
|
||
movi >14000,a0 ;!!!temp(?)
|
||
move a0,*a8(OYVEL),L
|
||
|
||
btst DUNK_B,a6
|
||
jrz #noshake ;!dunk?
|
||
btst LAYUP_B,a6
|
||
jrnz #noshake ;!dunk?
|
||
|
||
movk PS_DUNKS_MADE,a0
|
||
move @ballpnumshot,a1
|
||
move a1,a2
|
||
calla inc_player_stat
|
||
srl 1,a2 ;0-1
|
||
move a2,a3
|
||
XORK 1,a2 ;Inbounding team (0-1)
|
||
|
||
.if DUNKTST
|
||
.else
|
||
move a2,@inbound ;When testing dunks - TAKE OUT!
|
||
.endif
|
||
|
||
movk 20,a10
|
||
calla SHAKER ;2
|
||
|
||
;FIXX!!! TEMP!!!
|
||
; sll 4,a3 ;*16
|
||
; addi t1dunkcnt,a3
|
||
; move *a3,a0
|
||
; addk 1,a0
|
||
; jrnc #noshat ;No overflow?
|
||
;
|
||
; move *a10(plyr_seq),a0
|
||
; movi #dunk_t,a1
|
||
;#dlp move *a1+,a14
|
||
; jrn #noshat2 ;End of table?
|
||
; cmp a14,a0
|
||
; jrne #dlp ;Wimpy dunk?
|
||
;
|
||
; move @PSTATUS,a0 ;Plyr start bits 0-3
|
||
; move @ballpnumshot,a1
|
||
; btst a1,a0
|
||
; jrz #noshat2 ;Drone?
|
||
;
|
||
;
|
||
; move @bbshatter,a0 ;Already happened
|
||
; jrnz #noshat2
|
||
;
|
||
;; jruc #noshat2 ;THE NBA SUCKS!
|
||
;
|
||
; .ref gmqrtr
|
||
; move @gmqrtr,a0
|
||
; cmpi 3,a0
|
||
; jrlt #noshat2
|
||
;
|
||
; move *a10(plyr_attrib_p),a0,L
|
||
; move *a0(PAT_DUNKSKILL),a0
|
||
; cmpi 9,a0
|
||
; jrlt #noshat2
|
||
;
|
||
; clr a0
|
||
; move a0,*a3 ;Reset cnt
|
||
; move a0,@t1dunkcnt
|
||
; move a0,@t2dunkcnt
|
||
;
|
||
; movk 32,a0
|
||
; cmpi 2,a1
|
||
; jrlt tm1
|
||
;;Knock down team 1
|
||
; move @plyrproc_t,a1,L
|
||
; move a0,*a1(plyr_stagcnt)
|
||
; move @plyrproc_t+32,a1,L
|
||
; move a0,*a1(plyr_stagcnt)
|
||
; jruc #doit
|
||
;tm1
|
||
; move @plyrproc_t+64,a1,L
|
||
; move a0,*a1(plyr_stagcnt)
|
||
; move @plyrproc_t+96,a1,L
|
||
; move a0,*a1(plyr_stagcnt)
|
||
;#doit
|
||
; CREATE0 board_shatter
|
||
; movi HOOP_PID,a0
|
||
; calla KIL1C
|
||
; move a2,a0
|
||
; movk 5,a1 ;Big rim bend
|
||
; calla net_ani
|
||
; movk 18,a10 ;Big shake
|
||
; jruc #shake
|
||
;#noshat
|
||
; move a0,*a3
|
||
;#noshat2
|
||
; movk 24,a10
|
||
;#shake calla SHAKER ;2
|
||
|
||
#noshake
|
||
|
||
|
||
; move @movieshown,a0
|
||
;; jrnz #x
|
||
; jruc #x
|
||
;
|
||
; movk 7,a0
|
||
; callr rnd
|
||
; jrnz #x
|
||
;
|
||
; movk 1,a0
|
||
; move a0,@movieshown
|
||
;
|
||
; CREATE0 movie_test
|
||
|
||
calla scored_speech
|
||
|
||
#x PULL a2,a3,a4,a5,a6,a7,a10,a11
|
||
rets
|
||
|
||
dnk_snd_tbl
|
||
.long dunk_snd2,dunk_snd4,dunk_snd3,dunk_snd1
|
||
|
||
swish_snd_tbl
|
||
.long swish_snd2,swish_snd3,swish_snd1,swish_snd2
|
||
.long swish_snd4,swish_snd5,swish_snd6,swish_snd4,swish_snd5
|
||
|
||
#dunk_t .word DUNKP_SEQ,DUNKA_SEQ,DUNKB_SEQ,DUNKC_SEQ,DUNKD_SEQ
|
||
.word DUNKE_SEQ,DUNKE2_SEQ,DUNKD2_SEQ
|
||
.word DUNKL_SEQ,DUNKL2_SEQ,DUNKL3_SEQ
|
||
.word DUNKP2_SEQ
|
||
.word DUNKP3_SEQ
|
||
.word DUNKR_SEQ
|
||
.word DUNKR2_SEQ
|
||
.word DUNKU2_SEQ
|
||
.word DUNKU3_SEQ
|
||
.word DUNKX_SEQ
|
||
.word DUNKX2_SEQ
|
||
.word DUNKX3_SEQ
|
||
.word DUNKY_SEQ
|
||
.word DUNKY2_SEQ
|
||
.word DUNKZ_SEQ
|
||
.word DUNKZ2_SEQ
|
||
.word DUNKZ3_SEQ
|
||
.word DUNKT2_SEQ
|
||
.word DUNKT3_SEQ
|
||
.word DUNKT4_SEQ
|
||
.word DUNKT_SEQ
|
||
.word DUNKU_SEQ
|
||
.word DUNKF_SEQ,DUNKJ_SEQ,DUNKO_SEQ
|
||
.word DUNKK_SEQ,DUNKK2_SEQ,DUNKJ2_SEQ
|
||
.word DUNKQ_SEQ
|
||
.word DUNKQ3_SEQ
|
||
.word DUNKO2_SEQ
|
||
.word DUNKW3_SEQ
|
||
.word DUNKW2_SEQ
|
||
.word DUNKW_SEQ
|
||
|
||
.word -1
|
||
|
||
|
||
********************************
|
||
* Get sine and cosine
|
||
* A0=Angle (0-127) (Not neg!)
|
||
* >A0=Sine (0-4096)
|
||
* >A1=Cos (0-4096)
|
||
* Preserves A14
|
||
|
||
SUBR sinecos_get
|
||
|
||
sll 32-7,a0
|
||
srl 32-7-4,a0 ;*16
|
||
addi sine_t,a0
|
||
move *a0(cos_t-sine_t),a1
|
||
move *a0,a0
|
||
rets
|
||
|
||
sine_t
|
||
.word -4096,-4091,-4076,-4052,-4017,-3973,-3920,-3857
|
||
.word -3784,-3703,-3612,-3513,-3406,-3290,-3166,-3035
|
||
.word -2896,-2751,-2598,-2440,-2275,-2106,-1931,-1751
|
||
.word -1567,-1380,-1189,-995,-799,-601,-401,-201
|
||
cos_t
|
||
.word 0,201,401,601,799,995,1189,1380
|
||
.word 1567,1751,1931,2106,2275,2440,2598,2751
|
||
.word 2896,3035,3166,3290,3406,3513,3612,3703
|
||
.word 3784,3857,3920,3973,4017,4052,4076,4091
|
||
|
||
.word 4096,4091,4076,4052,4017,3973,3920,3857
|
||
.word 3784,3703,3612,3513,3406,3290,3166,3035
|
||
.word 2896,2751,2598,2440,2275,2106,1931,1751
|
||
.word 1567,1380,1189,995,799,601,401,201
|
||
|
||
.word 0,-200,-401,-601,-799,-995,-1189,-1380
|
||
.word -1567,-1751,-1931,-2105,-2275,-2440,-2598,-2750
|
||
.word -2896,-3035,-3166,-3290,-3406,-3513,-3612,-3703
|
||
.word -3784,-3857,-3920,-3973,-4017,-4052,-4076,-4091
|
||
|
||
.word -4096,-4091,-4076,-4052,-4017,-3973,-3920,-3857
|
||
.word -3784,-3703,-3612,-3513,-3406,-3290,-3166,-3035
|
||
.word -2896,-2751,-2598,-2440,-2275,-2106,-1931,-1751
|
||
.word -1567,-1380,-1189,-995,-799,-601,-401,-201
|
||
|
||
|
||
|
||
#*******************************
|
||
* Check for ball collision with a player
|
||
* A8=*Ball obj
|
||
* Trashes scratch
|
||
|
||
SUBR ball_chkpcollide
|
||
|
||
PUSH a2,a3,a4,a5,a6,a7,a10,a11
|
||
|
||
movk NUMPLYRS,a7
|
||
|
||
move *a8(OXPOS),a4
|
||
move *a8(OXANI+16),a14
|
||
|
||
|
||
move *a8(OSIZEX),a6
|
||
srl 1,a6
|
||
add a6,a4
|
||
sra 1,a14
|
||
add a14,a4 ;A4=Center X
|
||
|
||
|
||
|
||
move *a8(OZPOS),a6 ;A6=Z
|
||
movi plyrobj_t,a5
|
||
|
||
; Select Z-range for plyr collision per ball altitude/speed
|
||
movk 18,a10 ;A10=Z coll radius
|
||
move *a8(OYPOS),a0
|
||
cmpi -28,a0
|
||
jrlt #lp
|
||
move *a8(OYVEL),a0,L
|
||
abs a0
|
||
cmpi >c000,a0
|
||
jrgt #lp
|
||
movi 35,a10 ;Larger radius
|
||
|
||
#lp move *a5+,a11,L
|
||
|
||
move *a11(OPLINK),a2,L
|
||
move *a2(plyr_attrib_p),a2,L
|
||
move *a2(PAT_DEFSKILL),a2
|
||
sll 4,a2
|
||
subk 18,a10
|
||
jrz #tbl1
|
||
addi tbl2,a2
|
||
jruc #tbo
|
||
#tbl1
|
||
addi tbl1,a2
|
||
#tbo move *a2,a10
|
||
|
||
move *a11(OZPOS),a2 ;>Chk Z
|
||
sub a6,a2
|
||
abs a2
|
||
sub a10,a2
|
||
jrge #nxt
|
||
|
||
move *a11(OXPOS),a1 ;>Chk box X
|
||
move *a11(OXANI+16),a14
|
||
add a14,a1
|
||
move *a11(OSIZEX),a14
|
||
|
||
srl 1,a14 ;/2
|
||
|
||
move a14,a3
|
||
srl 2,a3
|
||
sub a3,a14
|
||
|
||
sub a14,a1
|
||
cmp a1,a4
|
||
jrle #nxt ;Center X <= lft?
|
||
|
||
sll 1,a14
|
||
|
||
; move a14,a3
|
||
; srl 2,a3
|
||
; add a3,a14
|
||
|
||
add a14,a1
|
||
cmp a1,a4
|
||
jrge #nxt ;Center X >= rgt?
|
||
|
||
move *a11(OYPOS),a1
|
||
move *a8(OYPOS),a0
|
||
addk 3,a0
|
||
move *a13(plyr_seq),a14
|
||
cmpi RUNDRIBTURB_SEQ,a14
|
||
jrhi #handhi ;Hand higher than shoulder?
|
||
|
||
move *a11(OPLINK),a14,L
|
||
move *a14(plyr_attrib_p),a14,L
|
||
move *a14(PAT_DEFSKILL),a14
|
||
sll 4,a14
|
||
addi tbl3,a14
|
||
move *a14,a14
|
||
add a14,a0
|
||
|
||
|
||
;TBL3 should get larger as def skill improves
|
||
;FIX!!
|
||
;DEBUG!
|
||
; addk 10,a0 ;Take out
|
||
|
||
|
||
#handhi cmp a1,a0
|
||
jrlt #nxt ;Too hi?
|
||
|
||
move *a11(OPLINK),a3,L
|
||
move *a3(plyr_shtdly),a14
|
||
jrgt #nxt5 ;Can't touch?
|
||
|
||
move @ballpnum,b0 ;a14
|
||
jrn #ok
|
||
|
||
;Ball is owned by someone
|
||
|
||
sll 5,b0 ;a14
|
||
addi plyrproc_t,b0 ;a14
|
||
move *b0,b0,L ;a14,a14,L
|
||
move b0,a14
|
||
cmp a14,a3
|
||
jrz #skpz
|
||
move *b0(plyr_seqflgs),b0 ;a14 a6
|
||
btst LAYUP_B,b0
|
||
jrnz #guydunking
|
||
btst DUNK_B,b0
|
||
jrnz #guydunking
|
||
#skpz
|
||
move *a14(plyr_seq),a14
|
||
cmpi SHOOT_SEQ,a14
|
||
jrnz #ok
|
||
jruc #nxt5
|
||
|
||
takedunk_t
|
||
; .word 0,0,0,0,0,0,0,0,0,0,0,50/2,100/2,150/2,300/2,400/2
|
||
; .word 500/2,600/2,700/2,800/2,999/2,999/2
|
||
|
||
; .word 0,0,0,0,0,0,0,0,0,0,0,100,200,300,600,800
|
||
; .word 999,999,999,999,999,999
|
||
|
||
.word 0,0,0,0,0,0,0,100,130,170,200,300,400,600,800,800
|
||
.word 999,999,999,999,999,999
|
||
|
||
#guydunking
|
||
;Guy with ball is dunking!
|
||
PUSH a0,a1
|
||
|
||
move *a14(plyr_num),a0
|
||
move @pup_maxpower,a1
|
||
btst a0,a1
|
||
jrz #nochng
|
||
;This guy has max power! Can't take ball!
|
||
movk 9,a0
|
||
jruc #maxp
|
||
#nochng
|
||
move *a14(plyr_attrib_p),a14,L
|
||
move *a14(PAT_POWER),a0 ;Guy trying to dunk ball
|
||
#maxp
|
||
|
||
move *a11(OPLINK),a14,L
|
||
move *a14(plyr_attrib_p),a14,L
|
||
move *a14(PAT_POWER),a14 ;Guy trying to take ball
|
||
cmpi 4,a14
|
||
jrle #nxt0z ;3 power can't take ball!
|
||
|
||
;Cut blocked dunks in half!
|
||
move @HCOUNT,a1
|
||
btst 0,a1
|
||
jrz #nxt0z
|
||
|
||
sub a14,a0 ;a0=-10 thru 10
|
||
addk 10,a0
|
||
sll 4,a0
|
||
addi takedunk_t,a0
|
||
move *a0,a0
|
||
jrz #ok0
|
||
calla RNDPER
|
||
jrls #ok0
|
||
#nxt0z ;3 power can't take ball!
|
||
PULL a0,a1
|
||
jruc #nxt ;To big, don't lose ball!
|
||
#ok0
|
||
PULL a0,a1
|
||
#ok
|
||
move *a3(plyr_jmpcnt),a14
|
||
jrle #ongnd
|
||
move *a3(plyr_aniy),a14
|
||
add a14,a1
|
||
sra 2,a14 ;/4
|
||
sub a14,a1 ;75% down from top
|
||
cmp a1,a0
|
||
jrge #nxt3 ;Ball too low?
|
||
#ongnd
|
||
|
||
move *a3(plyr_seqflgs),a14
|
||
btst BLOCKREB_B,a14
|
||
jrz #nobr ;No?
|
||
|
||
;FIX!!
|
||
;TWEAK this z-rng
|
||
addk 18-12,a2
|
||
jrge #nxt2 ;Too far from Z?
|
||
;>Chk box X
|
||
move *a11(OIMG),a2,L
|
||
move *a2(IANI2X),a0
|
||
|
||
move *a11(OCTRL),a14
|
||
btst B_FLIPH,a14
|
||
jrz #nof ;No flip?
|
||
|
||
move *a2,a2 ;ISIZEX
|
||
subk 1,a2
|
||
neg a0
|
||
add a2,a0 ;+size
|
||
#nof
|
||
move *a11(OXPOS),a14
|
||
add a14,a0
|
||
sub a4,a0
|
||
abs a0
|
||
|
||
move *a11(OPLINK),a14,L
|
||
move *a14(plyr_attrib_p),a14,L
|
||
move *a14(PAT_DEFSKILL),a14
|
||
sll 4,a14
|
||
addi tbl4,a14
|
||
move *a14,a14
|
||
sub a14,a0
|
||
; subk 12,a0
|
||
|
||
jrge #nxt4 ;Too far from X?
|
||
|
||
|
||
move @ballpnum,a1
|
||
jrn #noow ;No owner?
|
||
move *a3(plyr_num),a14
|
||
cmp a1,a14
|
||
jreq #nxt ;I own?
|
||
|
||
srl 1,a1
|
||
srl 1,a14
|
||
cmp a1,a14
|
||
jreq #nxt ;Teammate owns?
|
||
|
||
|
||
move *a3(plyr_num),a0
|
||
move @plyr_onfire,a1
|
||
;; cmp a0,a1
|
||
;; jrz #noow ;If on fire, don't miss as often
|
||
btst a0,a1
|
||
jrnz #noow ;If on fire, don't miss as often
|
||
|
||
move *a11(OPLINK),a14,L
|
||
move *a14(plyr_attrib_p),a14,L
|
||
move *a14(PAT_DEFSKILL),a14
|
||
sll 4,a14
|
||
addi tbl5,a14
|
||
move *a14,a0
|
||
calla RNDPER
|
||
jrhi #nxt
|
||
|
||
; movk 1,a0
|
||
; callr rnd
|
||
; jrnz #nxt5 ;50% skip?
|
||
|
||
#noow
|
||
PUSH a7
|
||
CREATE0 fix_airb
|
||
PULL a7
|
||
|
||
; movk 1,a0
|
||
; move a0,@plyrairballoff ;Shut off eventual airball snd
|
||
|
||
move @ballprcv_p,a2,L
|
||
cmp a3,a2
|
||
jreq #rcvok ;The receiver is touching it?
|
||
|
||
|
||
move @ballgoaltcnt,a0 ;>Chk goaltending
|
||
jrle #skipgt
|
||
move @ballpnumshot,a1
|
||
move *a3(plyr_num),a14
|
||
srl 1,a1
|
||
srl 1,a14
|
||
cmp a1,a14
|
||
jreq #nxt ;Same team?
|
||
|
||
;Turmell, allow ball to be blocked at peak of arc
|
||
move *a8(OYVEL),a0,L
|
||
move a0,a2
|
||
sra 14,a0
|
||
jrle #nogt
|
||
;Turmell
|
||
|
||
move *a3(plyr_num),a0
|
||
move @plyr_onfire,a1
|
||
;; cmp a0,a1
|
||
;; jrz #nogt
|
||
btst a0,a1 ;Blocker on-fire?
|
||
jrnz #nogt ; br=yes, allow goaltend
|
||
|
||
;Try #goalt
|
||
move *a3(plyr_ptsdown),a0
|
||
|
||
subk 5,a0
|
||
jrlt #normgt ;I'm losing by 5?
|
||
; cmpi [3,8000h],a2
|
||
cmpi [3,0000h],a2
|
||
jrlt #nogt
|
||
jruc #gt
|
||
#normgt
|
||
; cmpi [2,8000h],a2
|
||
cmpi [2,0000h],a2
|
||
jrlt #nogt
|
||
|
||
#gt
|
||
; movk 6,a0
|
||
; calla rnd
|
||
; jrnz #nxt
|
||
|
||
move *a3(plyr_num),a0
|
||
move @plyr_onfire,a1
|
||
btst a0,a1
|
||
jrnz #do_gt
|
||
|
||
|
||
;This was throwing away most blocks if it were to be a goal tend!
|
||
;Took out 4/5/96 - 2 days before shipping... Genius!
|
||
; movk 6,a0
|
||
movk 5,a0
|
||
calla rnd
|
||
jrnz #nxt
|
||
|
||
#do_gt
|
||
|
||
|
||
move @plyrairballoff,a0
|
||
jrn #nogt
|
||
move @shot_percentage,a0
|
||
jrn #nogt
|
||
|
||
|
||
move *a3(plyr_num),a0
|
||
.ref pup_goaltend
|
||
move @pup_goaltend,a14
|
||
btst a0,a14 ;Plyr arrow-off bit set?
|
||
jrz #nosec1 ;br=no goaltending allowed
|
||
; sll 4,a0 ;Secret goaltend
|
||
; .ref p1taps
|
||
; addi p1taps,a0
|
||
; move *a0,a0
|
||
; cmpi 24,a0
|
||
; jrnz #nosec1
|
||
|
||
movi 700,a0 ;Let this guy get away with GT
|
||
calla RNDPER
|
||
jrhi #nogt
|
||
|
||
; jruc #nogt
|
||
|
||
#nosec1
|
||
move a7,a2
|
||
CREATE0 plyr_goaltending ;Pass A11
|
||
move a2,a7
|
||
jruc #skipgt
|
||
#nogt
|
||
movk PS_BLOCKS,a0 ;It's a block
|
||
move *a3(plyr_num),a1
|
||
calla inc_player_stat
|
||
|
||
;call rejected speech here
|
||
calla rejected_speech
|
||
|
||
SOUND1 steal_snd
|
||
PUSH a7,a10
|
||
move a3,a10
|
||
calla arw_on1plyr ;Guy who picks up ball gets arw
|
||
PULL a7,a10
|
||
|
||
#skipgt
|
||
|
||
callr flash_ball
|
||
; SOUND1 cheer_snd
|
||
SOUND1 swat_snd
|
||
; callr get_swat
|
||
|
||
move *a3(plyr_seq),a2
|
||
cmpi REBOUND_SEQ,a2
|
||
jreq #agiveball
|
||
cmpi REBOUNDA_SEQ,a2
|
||
jrnz #fix
|
||
|
||
|
||
#agiveball
|
||
PUSH a3
|
||
|
||
;call rebound speech here
|
||
move @ballpnum,a0
|
||
jrn #ballfree
|
||
|
||
SOUND1 stealsb
|
||
; calla stolen_speech
|
||
|
||
jruc #skiprbnd
|
||
#ballfree
|
||
move @ballgoaltcnt,a0 ;>Chk goaltending
|
||
jrgt #skiprbnd
|
||
move @ballprcv_p,a0,L
|
||
jrz #isreb
|
||
calla intercepted_speech
|
||
jruc #skiprbnd
|
||
#isreb
|
||
move *a3(plyr_num),a14
|
||
move a14,@ballpnum
|
||
clr a0
|
||
move a0,*a3(plyr_dribmode) ;Reset dribble
|
||
move a0,@ballbbhitcnt
|
||
|
||
move @inbound,a0
|
||
jrnn #skiprbnd
|
||
|
||
;Player touches ball for a rebound, it attaches to one hand.
|
||
;As soon as player touches ball, slam hands together for
|
||
;a more dramatic looking rebound
|
||
move *a3(PA10),a14
|
||
cmpi 100,a14
|
||
jrgt #landing
|
||
movk 1,a0
|
||
move a0,*a3(PA10)
|
||
#landing
|
||
|
||
|
||
move @gmqrtr,a0
|
||
jrnz #okr
|
||
move @game_time,a0,L
|
||
cmpi >2050400,a0
|
||
jrgt #nor
|
||
|
||
#okr
|
||
calla rebound_speech
|
||
#nor
|
||
movi 80,a0
|
||
move a0,@pushing_delay
|
||
;After grabbing rebound, don't allow stolen rebound!
|
||
;5% of time, allow stolen rebound after 15 ticks! (That was old game)
|
||
movk 15,a2
|
||
movi 50,a0
|
||
calla RNDPER
|
||
jrhi #reg
|
||
movi 40,a2
|
||
#reg move a2,a0
|
||
calla plyr_setshtdly
|
||
PULL a3
|
||
|
||
jruc #x
|
||
|
||
fix_airb
|
||
movk 1,a0
|
||
move a0,@plyrairballoff ;Shut off eventual airball snd
|
||
DIE
|
||
|
||
#skiprbnd
|
||
movi 80,a0
|
||
move a0,@pushing_delay
|
||
movi 15,a0
|
||
calla plyr_setshtdly
|
||
PULL a3
|
||
jruc #giveball
|
||
#fix
|
||
cmpi FASTBLOCKREJ_SEQ,a2
|
||
jreq #rej
|
||
subk BLOCKREJ_SEQ,a2
|
||
jreq #rej
|
||
|
||
movk 3,a0 ;>Regular block
|
||
callr rnd
|
||
|
||
;This is for a block dunk, but if a player jumps in front of a pass
|
||
;this code is also executed. And ball has a chance of bouncing back at
|
||
;full speed toward passer!
|
||
|
||
jrnz #glance_off
|
||
|
||
SOUND1 steal_snd
|
||
movi 80,a0
|
||
move a0,@pushing_delay
|
||
PUSH a7,a10
|
||
move a3,a10
|
||
calla arw_on1plyr
|
||
PULL a7,a10
|
||
|
||
;Block dunk stat
|
||
movk PS_BLOCKS,a0 ;It's a block
|
||
move *a3(plyr_num),a1
|
||
calla inc_player_stat
|
||
|
||
;dunk rejected speech here!
|
||
;FIX, this is where bogus rejected speech calls come from
|
||
calla rejected_dnk_speech
|
||
; LOCKUP
|
||
;Go into rebound sequence to make spear look better
|
||
jruc #giveball
|
||
|
||
#glance_off
|
||
PUSH a3
|
||
movi 15,a0
|
||
calla plyr_setshtdly
|
||
PULL a3
|
||
|
||
move @ballgoaltcnt,a0
|
||
jrgt #ablk
|
||
|
||
;This is when a pass or sometimes when a dunk gets rejected!
|
||
;This also happens when a player jumps on a ball which is sitting on ground!
|
||
|
||
move *a8(OYPOS),a0
|
||
addk 30,a0 ;Not if ball near ground
|
||
jrgt #x
|
||
|
||
move *a3(plyr_dir),a0
|
||
callr sinecos_get
|
||
sll 5,a0 ;*32
|
||
sll 5,a1
|
||
move a0,*a8(OZVEL),L
|
||
move a1,*a8(OXVEL),L
|
||
|
||
; movi -GRAV*22,a1 ;Towards roof
|
||
movi -GRAV*20,a1 ;Towards roof
|
||
|
||
move a1,*a8(OYVEL),L
|
||
|
||
;New, 1/22/93
|
||
move @PCNT,a0
|
||
ANDK 7,a0
|
||
jrnz #x
|
||
|
||
movk 25,a0
|
||
move a0,*a3(plyr_shtdly)
|
||
;dunk rejected speech here! (plyr doesn't have ball though)
|
||
;(Why is this being called, if plyr doesn't keep ball, its not rejected!!)
|
||
;FIX!!!
|
||
; calla rejected_dnk_speech
|
||
jruc #x
|
||
|
||
#ablk
|
||
;2/3/92
|
||
clr a0
|
||
move a0,@ballgoaltcnt
|
||
|
||
; LOCKUP
|
||
|
||
;2/3/92
|
||
movi -GRAV*15,a1 ;Towards roof
|
||
move a1,*a8(OYVEL),L
|
||
|
||
|
||
movk >1f,a0
|
||
callr rnd
|
||
btst 0,a0
|
||
jrz #noxf
|
||
move *a8(OXVEL),a2,L
|
||
neg a2
|
||
move a2,*a8(OXVEL),L
|
||
#noxf
|
||
btst 1,a0
|
||
jrz #nxt
|
||
move *a8(OZVEL),a2,L
|
||
neg a2
|
||
move a2,*a8(OZVEL),L
|
||
|
||
; clr a0
|
||
; move a0,@ballgoaltcnt
|
||
|
||
jruc #nxt
|
||
|
||
#rej
|
||
move @must_rebound,a0
|
||
jrz #cont
|
||
move *a3(plyr_seq),a0
|
||
cmpi BLOCK_SEQ,a0
|
||
jrz #rej1
|
||
cmpi BLOCKREJ_SEQ,a0
|
||
jrz #rej1
|
||
cmpi FASTBLOCKREJ_SEQ,a0
|
||
jrnz #cont
|
||
#rej1
|
||
move *a3(plyr_ohpdist),a14
|
||
cmpi 55,a14
|
||
jrgt #cont0
|
||
|
||
;Still allow slap of ball if it is right on the rim (approx.)
|
||
.if DEBUG
|
||
LOCKUP
|
||
.endif
|
||
|
||
jruc #cont
|
||
|
||
#cont0
|
||
;Could also check my proximity to floor...
|
||
move *a3(plyr_jmpcnt),a14
|
||
jrnz #convert_rej ;Br=I was trying to swat a rebound!
|
||
#cont
|
||
|
||
movk PS_BLOCKS,a0 ;It's a block
|
||
move *a3(plyr_num),a1
|
||
calla inc_player_stat
|
||
move *a3(plyr_dir),a0
|
||
callr sinecos_get
|
||
sll 5,a0 ;*32
|
||
sll 5,a1
|
||
move a0,*a8(OZVEL),L
|
||
move a1,*a8(OXVEL),L
|
||
movi -GRAV*21,a1 ;Towards roof ;18
|
||
move a1,*a8(OYVEL),L
|
||
movk 15,a0
|
||
move a0,*a3(plyr_shtdly)
|
||
|
||
callr def_play_reward ;Good defensive play reward
|
||
|
||
clr a0
|
||
move a0,@ballgoaltcnt
|
||
jruc #nxt
|
||
|
||
#nobr
|
||
move @ballpnum,a2
|
||
jrlt #giveball ;No owner?
|
||
move *a3(plyr_num),a14
|
||
cmp a2,a14
|
||
jreq #nxt ;I already have it?
|
||
|
||
move *a3(plyr_seq),a0
|
||
|
||
; cmpi STEALUP_SEQ,a0
|
||
; jreq #doit
|
||
subi STEAL_SEQ,a0
|
||
jrne #nxt
|
||
;#doit
|
||
|
||
|
||
;Shawn, we should probably adjust this % based upon ptsdown!
|
||
;200 is if you are losing, but if you are winning, slowly reduce %
|
||
|
||
;Turmell
|
||
move *a3(plyr_attrib_p),a0,L
|
||
move *a0(PAT_STLSKILL),a0
|
||
sll 4,a0
|
||
addi stl1,a0
|
||
move *a0,a0
|
||
; movi 190,a0 ;120
|
||
|
||
calla RNDPER
|
||
jrls #nxt ;No steal?
|
||
|
||
sll 5,a2 ;*32
|
||
addi plyrproc_t,a2
|
||
move *a2,a2,L
|
||
|
||
move *a2(plyr_seqflgs),a0
|
||
btst NOSTEAL_B,a0
|
||
jrnz #nxt ;Ball can't be stolen?
|
||
|
||
|
||
move @steals_off,a0
|
||
jrnz #nxt
|
||
|
||
movk PS_STEALS,a0
|
||
move *a3(plyr_num),a1
|
||
calla inc_player_stat
|
||
move @my_ballpnumlast,a1
|
||
jrn #noown
|
||
movk PS_TURNOVERS,a0
|
||
calla inc_player_stat
|
||
#noown
|
||
move *a3(plyr_attrib_p),a0,L
|
||
move *a0(PAT_STLSKILL),a0
|
||
sll 4,a0
|
||
addi stl2,a0
|
||
move *a0,a0
|
||
; movi 180,a0
|
||
|
||
calla RNDPER
|
||
jrhi #giveballflsh ;20% give him the ball?
|
||
;FIXX!!!
|
||
;Debug - don't have ball skip away on steal!
|
||
; jruc #giveballflsh ;temp
|
||
|
||
; movk 15,a0 ;>Knock it away
|
||
movk 20,a0 ;>Knock it away
|
||
move a0,*a2(plyr_shtdly)
|
||
move a0,*a3(plyr_shtdly)
|
||
|
||
callr loose_ball
|
||
SOUND1 swat_snd
|
||
; callr get_swat
|
||
jruc #nxt
|
||
|
||
SUBR loose_ball
|
||
|
||
clr a0
|
||
move a0,@ballbbhitcnt
|
||
not a0 ;=-1
|
||
move a0,@ballpnum
|
||
move a0,@ballpnumlast
|
||
callr ball_convfmprel ;was rel2
|
||
|
||
movi >1ffff,a2 ;>Give rnd velocity
|
||
movi >10000,a3
|
||
move a2,a0
|
||
callr rnd
|
||
add a3,a0
|
||
btst 0,a0
|
||
jrz #xpos
|
||
neg a0
|
||
#xpos move a0,*a8(OXVEL),L
|
||
move a2,a0
|
||
callr rnd
|
||
add a3,a0
|
||
btst 0,a0
|
||
jrz #ypos
|
||
neg a0
|
||
#ypos move a0,*a8(OZVEL),L
|
||
|
||
movi 50,a0
|
||
calla RNDPER
|
||
jrls #noy
|
||
movi 40000h,a0
|
||
calla rndrng0
|
||
move *a8(OYVEL),a1,L
|
||
sub a0,a1
|
||
move a1,*a8(OYVEL),L
|
||
#noy
|
||
|
||
callr flash_ball
|
||
.ref ball_loose_spch
|
||
PUSH a7
|
||
CREATE0 ball_loose_spch
|
||
PULL a7
|
||
|
||
rets
|
||
|
||
|
||
.asg 75/100,lo_stl ;85,77
|
||
;This is for stealing ball
|
||
stl1 .word 160*lo_stl,170*lo_stl,180*lo_stl,195*lo_stl,200*lo_stl
|
||
.word 205*lo_stl,215*lo_stl,245*lo_stl,260*lo_stl,285*lo_stl
|
||
.word 300*lo_stl
|
||
|
||
;stl1 .word 160*lo_stl,165*lo_stl,170*lo_stl,175*lo_stl,180*lo_stl
|
||
; .word 185*lo_stl,190*lo_stl,195*lo_stl,200*lo_stl,202*lo_stl
|
||
; .word 204*lo_stl
|
||
;This is for sticking to ball after a successfull steal
|
||
;Otherwise, ball will dribble away!
|
||
|
||
stl2 .word 160,170,180,195,200
|
||
.word 205,215,225,230,235
|
||
.word 250
|
||
|
||
|
||
#giveballflsh
|
||
|
||
;steals ball speech (ball sticks to player)
|
||
calla stolen_speech
|
||
|
||
callr flash_ball
|
||
SOUND1 swat_snd
|
||
; callr get_swat
|
||
; SOUND1 cheer_snd
|
||
;FIXX!!!
|
||
;Debug - don't have ball skip away on steal!
|
||
; jruc #nxt ;temp for checking distance for steals
|
||
|
||
; movk 30,a0
|
||
movi 40,a0
|
||
move a0,@steals_off
|
||
movk 25,a0
|
||
move a0,@pass_off
|
||
movi 80,a0
|
||
move a0,@pushing_delay
|
||
|
||
|
||
#giveball
|
||
;Pick up ball bug.... If @ballprcv_p has a value, intercept style collisions
|
||
;occur, so rarely can you pick up the ball....
|
||
move @ballprcv_p,a2,L
|
||
jrz #norcvr ;No pass receiver?
|
||
cmp a3,a2
|
||
jreq #rcvok ;The receiver has it?
|
||
|
||
movi 99,a0
|
||
callr rndrng0
|
||
|
||
clr a14
|
||
move *a3(plyr_ptsdown),a1
|
||
jrle #normint ;!Losing?
|
||
|
||
cmpi 15,a1
|
||
jrle #maxpts2
|
||
movk 15,a1
|
||
|
||
#maxpts2
|
||
|
||
; movi 150,a14 ;Secret steal power!
|
||
movi 50,a14 ;Secret steal power!
|
||
move *a3(plyr_num),a6
|
||
.ref pup_maxsteal
|
||
move @pup_maxsteal,a4
|
||
btst a6,a4
|
||
jrnz #normint
|
||
|
||
sll 4,a1
|
||
addi #int_t,a1
|
||
move *a1,a14
|
||
|
||
#normint
|
||
|
||
;Let's see if this pass is intended for an alley ooper!
|
||
;If so, do more intercepts!
|
||
move @ballprcv_p,a1,L ;*Plyr proc who gets this pass or 0
|
||
jrz #nxtck
|
||
move *a1(plyr_jmpcnt),a4
|
||
jrz #nxtck
|
||
move *a1(plyr_seq),a1
|
||
cmpi ALLEYOOP1_SEQ,a1
|
||
jrlt #nxtck
|
||
cmpi ALLEYOOP14_SEQ,a1
|
||
jrgt #nxtck
|
||
;More intercepts if alley oop...
|
||
addi 25,a14 ;Alley oop steal power!
|
||
#nxtck
|
||
|
||
move @ballpasstime,a1
|
||
subk 3,a1
|
||
abs a1
|
||
srl 1,a1 ;/2
|
||
add a14,a1
|
||
addk 1,a1 ;1% to 100%
|
||
cmp a1,a0
|
||
jrge #nxt ;% failed?
|
||
|
||
;Still too many steals
|
||
|
||
;Bumped this up because we still had too many intercepted passes...
|
||
; movi 500,a0 ;650 ,450
|
||
;TRIED new value
|
||
; movi 750,a0
|
||
movi 850,a0
|
||
calla RNDPER
|
||
jrhi #nxt ;br=yes skip it
|
||
|
||
PUSH a2,a8
|
||
|
||
move *a8(OXVAL),a6,L ;Figure out where ball was 4 ticks ago
|
||
move *a8(OZVAL),a7,L
|
||
|
||
move *a8(OXVEL),a1,L
|
||
sll 2,a1
|
||
sub a1,a6
|
||
move *a8(OZVEL),a1,L
|
||
sll 2,a1
|
||
sub a1,a7
|
||
|
||
sra 16,a6
|
||
sra 16,a7
|
||
|
||
move a11,a8
|
||
|
||
calla seekdirdist_obxz128
|
||
move a0,*a3(plyr_newdir) ;Turn toward ball
|
||
|
||
PULL a2,a8
|
||
|
||
move *a2(plyr_rcvpass),a0
|
||
jrle #rcvok0 ;Already caught?
|
||
|
||
;; clr a14 ;Intercepted
|
||
;
|
||
; Just set it to 1 so plyr_main, etc., can take care of the rest
|
||
movk 1,a14 ;Intercepted
|
||
move a14,*a2(plyr_rcvpass)
|
||
;; move *a2(plyr_jmpcnt),a0
|
||
;; jrnz #inair ;Jumping?
|
||
;; move a14,*a2(plyr_nojoy)
|
||
;;#inair
|
||
|
||
|
||
;Shawn, Sometimes the ball can be intercepted and you do not fall thru
|
||
;this ball flash, etc. code (Below). I moved the flash/snd stuff up
|
||
;in front of the code which checks if ball has already been caught, but then
|
||
;when an errant pass is picked up, it does the flash stuff.
|
||
|
||
callr def_play_reward ;Good defensive play reward
|
||
|
||
; movi 50,a0 ;4% of intercepts are just deflects
|
||
movi 40,a0 ;4% of intercepts are just deflects
|
||
calla RNDPER
|
||
jrls #nope
|
||
|
||
;Sometimes, just have ball bounce off the defender
|
||
|
||
SOUND1 intercept
|
||
|
||
move *a3(plyr_dir),a0
|
||
callr sinecos_get
|
||
sll 5,a0 ;*32
|
||
sll 5,a1
|
||
move a0,*a8(OZVEL),L
|
||
move a1,*a8(OXVEL),L
|
||
movi -GRAV*25,a1 ;Towards roof
|
||
move a1,*a8(OYVEL),L
|
||
movk PS_STEALS,a0
|
||
move *a3(plyr_num),a1
|
||
calla inc_player_stat
|
||
move @my_ballpnumlast,a1
|
||
jrn #x
|
||
movk PS_TURNOVERS,a0
|
||
calla inc_player_stat
|
||
jruc #x ;#nxt
|
||
|
||
#nope
|
||
|
||
;intercepted speech call here
|
||
|
||
move @ballprcv_p,a0,L ;*Plyr proc who gets this pass or 0
|
||
jrz #nopass
|
||
|
||
move @ballpasstime,a0 ;# ticks since passed
|
||
cmpi 6,a0
|
||
jrle #cntstl ;#nopass
|
||
|
||
calla intercepted_speech
|
||
jruc #cntstl
|
||
|
||
#nopass
|
||
calla stolen_speech
|
||
|
||
#cntstl
|
||
|
||
movk PS_STEALS,a0
|
||
move *a3(plyr_num),a1
|
||
calla inc_player_stat
|
||
move @my_ballpnumlast,a1
|
||
jrn #noown2
|
||
movk PS_TURNOVERS,a0
|
||
calla inc_player_stat
|
||
#noown2
|
||
jruc #rcvok
|
||
|
||
#rcvok0
|
||
PUSH a7,a10
|
||
move a3,a10
|
||
calla arw_on1plyr ;Guy who picks up ball gets arw
|
||
PULL a7,a10
|
||
|
||
#rcvok
|
||
clr a14
|
||
move a14,@ballprcv_p,L
|
||
|
||
#norcvr
|
||
move *a3(plyr_num),a14
|
||
move a14,@ballpnum
|
||
clr a0
|
||
move a0,*a3(plyr_dribmode) ;Reset dribble
|
||
move a0,@ballbbhitcnt
|
||
|
||
|
||
;Player is jumping up with standard 1 handed block frms, if he is going to
|
||
;attach to ball, then lets jump into spear seq. which looks like a strong
|
||
;2 handed grab. Rebound art basically...
|
||
|
||
; .ref w1blokl3
|
||
; .ref w1blokl4
|
||
; .ref w2blokl3
|
||
; .ref w2blokl4
|
||
; .ref w3blokl3
|
||
; .ref w3blokl4
|
||
; .ref w4blokl3
|
||
; .ref w4blokl4
|
||
; .ref w5blokl3
|
||
;
|
||
;;Player spearing the ball?
|
||
; move *a11(OIMG),a0,L
|
||
; cmpi w1blokl3,a0
|
||
; jrz #convert_rej
|
||
; cmpi w1blokl4,a0
|
||
; jrz #convert_rej
|
||
; cmpi w2blokl3,a0
|
||
; jrz #convert_rej
|
||
; cmpi w2blokl4,a0
|
||
; jrz #convert_rej
|
||
; cmpi w3blokl3,a0
|
||
; jrz #convert_rej
|
||
; cmpi w3blokl4,a0
|
||
; jrz #convert_rej
|
||
; cmpi w4blokl3,a0
|
||
; jrz #convert_rej
|
||
; cmpi w4blokl4,a0
|
||
; jrz #convert_rej
|
||
; cmpi w5blokl3,a0
|
||
; jrz #convert_rej
|
||
; cmpi w5blokl4,a0
|
||
; jrz #convert_rej
|
||
.ref w1blokl1
|
||
.ref w5blokl4
|
||
|
||
; move @must_rebound,a0
|
||
; jrnz #convert_rej0 ;Br=I was trying to stab a rebound!
|
||
|
||
;Player spearing the ball?
|
||
move *a11(OIMG),a0,L
|
||
cmpi w1blokl1,a0
|
||
jrlt #tagx
|
||
cmpi w5blokl4,a0
|
||
jrgt #tagx
|
||
jruc #convert_rej
|
||
|
||
#tagx
|
||
move @must_rebound,a0
|
||
jrz #x
|
||
|
||
#convert_rej0
|
||
move *a3(plyr_seq),a0
|
||
cmpi BLOCK_SEQ,a0
|
||
jrz #rej1a
|
||
cmpi BLOCKREJ_SEQ,a0
|
||
jrz #rej1a
|
||
cmpi FASTBLOCKREJ_SEQ,a0
|
||
jrnz #x
|
||
#rej1a
|
||
|
||
;Could also check my proximity to floor...
|
||
move *a3(plyr_jmpcnt),a14
|
||
jrz #x
|
||
|
||
#convert_rej
|
||
|
||
; LOCKUP
|
||
|
||
movk NOSPEAR_SEQ,a0
|
||
;This sequence is simply a two handed rebound
|
||
move *a3(plyr_dir),a7
|
||
PUSH a13
|
||
move a3,a13
|
||
calla plyr_setseq
|
||
movk 1,a0
|
||
move a0,*a13(PA10),L
|
||
PULL a13
|
||
|
||
clr a0
|
||
move a0,@ballgoaltcnt
|
||
|
||
move *a3(plyr_num),a14
|
||
move a14,@ballpnum
|
||
clr a0
|
||
move a0,*a3(plyr_dribmode) ;Reset dribble
|
||
move a0,@ballbbhitcnt
|
||
movi 80,a0
|
||
move a0,@pushing_delay
|
||
movi 15,a0
|
||
calla plyr_setshtdly
|
||
jruc #x
|
||
|
||
|
||
#nxt5
|
||
; LOCKUP
|
||
nop
|
||
nop
|
||
#nxt2
|
||
nop
|
||
nop
|
||
#nxt3
|
||
nop
|
||
nop
|
||
#nxt4
|
||
nop
|
||
nop
|
||
|
||
|
||
#nxt dsj a7,#lp
|
||
|
||
|
||
#x PULL a2,a3,a4,a5,a6,a7,a10,a11
|
||
rets
|
||
|
||
tbl1 .word 16+2,17+2,18+2,18+2,18+2,18+2,18+2,19+2,20+2,21+2,22+2,23+2
|
||
;tbl1 .word 18,18,18,18,18,18,18,18,18,18,18,18
|
||
tbl2 .word 32,33,34,35,35,35,35,36,37,38,39,40
|
||
;tbl2 .word 35,35,35,35,35,35,35,35,35,35,35,35
|
||
tbl3 .word 15,15,15,15,15,15,15,15,15,15,15,15
|
||
|
||
tbl4 .word 11*DIST_ADDITION+2,12*DIST_ADDITION+2,12*DIST_ADDITION+2
|
||
.word 12*DIST_ADDITION+2,12*DIST_ADDITION+2,12*DIST_ADDITION+2
|
||
.word 12*DIST_ADDITION+2,13*DIST_ADDITION+2,14*DIST_ADDITION+2
|
||
.word 15*DIST_ADDITION+2,16*DIST_ADDITION+2,17*DIST_ADDITION+2
|
||
|
||
;tbl4 .word 12,12,12,12,12,12,12,12,12,12,12,12
|
||
;tbl5 .word 500,500,500,500,500,500,500,500,400,300,200,200
|
||
tbl5 .word 500,500,500,500,500,500,500,500,500,500,500,500
|
||
|
||
|
||
#goalt_t
|
||
;Extra % chance of allowing losing team to get away with a goaltend
|
||
;1 pt down up to 15 & over down
|
||
.word 0,35,45,55,60,65,70,75,75
|
||
.word 75,80,90,90,90,90,90
|
||
|
||
#int_t
|
||
;Bonus % of losing team getting an intercept
|
||
;1 pt down up to 15 & over down
|
||
;Turmell
|
||
;Don't have so many interceptions for losing teams
|
||
.word 0,3,5,6,8,9,10,11,12,12
|
||
.word 12,13,14,15,17,19
|
||
|
||
; .word 0,4,7,10,12,15,19,20,20,20
|
||
; .word 20,20,22,25,27,30
|
||
|
||
|
||
********************************
|
||
* Random swat sound
|
||
|
||
; SUBR get_swat
|
||
; SOUND1 swat_snd
|
||
; rets
|
||
|
||
|
||
; movk 3,a0
|
||
; callr rndrng0
|
||
; sll 5,a0
|
||
; addi #swtsnds,a0
|
||
; move *a0,a0,L
|
||
; calla snd_play1
|
||
; rets
|
||
;
|
||
;#swtsnds
|
||
; .long swat_snd,swat_snd,swat_snd,swat_snd
|
||
|
||
|
||
********************************
|
||
* Good defensive play reward
|
||
|
||
SUBR def_play_reward
|
||
|
||
callr flash_ball
|
||
|
||
SOUND1 steal_snd
|
||
SOUND1 swat_snd
|
||
; callr get_swat
|
||
|
||
PUSH a7,a10
|
||
move a3,a10
|
||
calla arw_on1plyr ;Guy who picks up ball gets arw
|
||
PULL a7,a10
|
||
|
||
rets
|
||
|
||
|
||
SUBR flash_reward
|
||
|
||
callr flash_ball
|
||
; SOUND1 cheer_snd
|
||
SOUND1 swat_snd
|
||
; callr get_swat
|
||
rets
|
||
|
||
|
||
|
||
#*******************************
|
||
* Flash ball
|
||
|
||
SUBRP flash_ball
|
||
|
||
move @inbound,a0
|
||
jrnn #x
|
||
move @ballflash,a0
|
||
jrnz #x
|
||
PUSH a7
|
||
CREATE0 ball_flash
|
||
PULL a7
|
||
#x rets
|
||
|
||
|
||
ball_flash
|
||
movk 1,a0
|
||
move a0,@ballflash
|
||
|
||
move @ballobj_p,a8,L ;Basketball obj
|
||
|
||
movi 1010h,a2
|
||
move a2,*a8(OCONST)
|
||
|
||
movk 4,a10
|
||
#again
|
||
setf 4,0,0
|
||
movk M_CONNON,a0 ;Replace non-zero data with constant
|
||
move a0,*a8(OCTRL) ;Write 4 low bits
|
||
setf 16,1,0
|
||
|
||
SLEEPK 3
|
||
|
||
setf 4,0,0
|
||
movk M_WRNONZ,a0
|
||
move a0,*a8(OCTRL) ;Write 4 low bits
|
||
setf 16,1,0
|
||
|
||
SLEEPK 3
|
||
|
||
; move @inbound,a0
|
||
; jrnn #die
|
||
|
||
dsj a10,#again
|
||
|
||
#die clr a0
|
||
move a0,@ballflash
|
||
|
||
move @HCOUNT,a14
|
||
btst 0,a14
|
||
jrz #die2
|
||
SOUND1 cheer_snd
|
||
#die2
|
||
DIE
|
||
|
||
|
||
#*******************************
|
||
* Jump shot crowd sounds (process)
|
||
|
||
SUBR plyr_jscrowdsnd
|
||
|
||
SLEEPK 10
|
||
|
||
movk 10,a0
|
||
calla rndrng0
|
||
move a0,a8
|
||
sll 5,a8
|
||
addi #crwd_noise_sp_tbl,a8
|
||
move *a8,a0,L
|
||
calla snd_play1
|
||
DIE
|
||
|
||
|
||
#crwd_noise_sp_tbl
|
||
.long cheer3_snd
|
||
.long cheer2_snd
|
||
.long cheer1_snd
|
||
.long cheer2_snd
|
||
.long cheer3_snd
|
||
.long cheer_snd
|
||
.long cheer1_snd
|
||
.long cheer2_snd
|
||
.long cheer_snd
|
||
.long cheer2_snd
|
||
.long cheer2_snd
|
||
|
||
|
||
#*******************************
|
||
* Convert ball from player relative
|
||
* Trashes scratch
|
||
|
||
SUBR ball_convfmprel
|
||
|
||
; move @ballobj_p,a0,L
|
||
;
|
||
; move *a0(OIMG),a1,L ;Get ball ani X
|
||
; move *a1(IANIOFFX),a1
|
||
; sll 16,a1
|
||
; move *a0(OXANI),a14,L ;Get ball/plyr ani X combo &
|
||
; move a1,*a0(OXANI),L ; make new ani X ball only
|
||
; sub a14,a1
|
||
;
|
||
; move *a0(OZPOS),a14 ;Do Z proj on old/new ani X diff
|
||
; PRJX2Z a1,a14,16-1 ;(16-1)=*64k/2
|
||
;
|
||
; move *a0(OXVAL),a14,L ;Adjust ball X by proj'd amount to
|
||
; sub a1,a14 ; make ball not jerk when released
|
||
; move a14,*a0(OXVAL),L
|
||
;
|
||
move @ballobj_p,a0,L
|
||
|
||
SUBR convfmprel
|
||
move *a0(OXANI),a1,L ;Get ball ani X
|
||
move *a0(OZPOS),a14 ;Do Z proj on old ani X
|
||
PRJX2Z a1,a14,16-2
|
||
|
||
move *a0(OXVAL),a14,L ;Adjust ball X by proj'd amount to
|
||
add a1,a14 ; make ball not jerk when released
|
||
move a14,*a0(OXVAL),L
|
||
|
||
clr a14
|
||
move a14,*a0(OXANI),L
|
||
|
||
rets
|
||
|
||
|
||
#*******************************
|
||
* Set ptsdown for each plyr
|
||
* Trashes scratch
|
||
|
||
.ref pup_noassistance
|
||
|
||
SUBR plyr_setptsdown
|
||
|
||
PUSH a2,a3,a4,a5,a6
|
||
|
||
movi scores,a14
|
||
move *a14+,a0
|
||
move *a14+,a4
|
||
sub a0,a4 ;+ if losing, - if winning
|
||
|
||
move @PSTATUS,a5
|
||
|
||
movi plyrproc_t,a6
|
||
movk NUMPLYRS,a3
|
||
#lp
|
||
move a4,a2
|
||
srl 1,a5
|
||
jrnc #set ;Drone?
|
||
|
||
move @PSTATUS,a0
|
||
move a0,a1
|
||
sll 32-2,a0
|
||
jrz #set ;Drone team?
|
||
ANDK >c,a1
|
||
jrz #set ;Drone team?
|
||
|
||
move @pup_noassistance,a0
|
||
jrnz #noset
|
||
|
||
movk ADJCOMPASS,a0 ;Computer assistance
|
||
calla GET_ADJ ;0-1
|
||
jrz #set ;On?
|
||
#noset
|
||
clr a2
|
||
#set
|
||
move *a6+,a0,L
|
||
move a2,*a0(plyr_ptsdown)
|
||
|
||
.if DRONES_2MORE
|
||
LOCKUP
|
||
.else
|
||
cmpi NUMPLYRS-1,a3
|
||
jrne #nxt
|
||
neg a4
|
||
.endif
|
||
|
||
#nxt dsj a3,#lp
|
||
|
||
PULL a2,a3,a4,a5,a6
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Get random # with mask
|
||
* A0=Mask
|
||
* >A0=Rnd # (Pass CC)
|
||
* Trashes scratch
|
||
|
||
SUBRP rnd
|
||
|
||
move @RAND,a1,L
|
||
rl a1,a1
|
||
move @HCOUNT,a14
|
||
rl a14,a1
|
||
add sp,a1
|
||
move a1,@RAND,L
|
||
|
||
and a1,a0
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Quickly produce a random # in range 0-X
|
||
* A0=X
|
||
* >A0=Random # (0 to A0) (No CC)
|
||
* Trashes scratch
|
||
|
||
SUBRP rndrng0
|
||
|
||
move @RAND,a1,L
|
||
rl a1,a1
|
||
move @HCOUNT,a14
|
||
rl a14,a1
|
||
add sp,a1
|
||
move a1,@RAND,L
|
||
|
||
addk 1,a0
|
||
mpyu a1,a0 ;Condition codes not valid!
|
||
|
||
rets
|
||
|
||
|
||
****************************************************************
|
||
* Sequence code may trash scratch, A2-A5
|
||
|
||
#*****************************************
|
||
*
|
||
* A13=*PxCTRL
|
||
* RETURNS: carry clear if player under hoop
|
||
*
|
||
SUBR chck_plyr_under_hoop
|
||
|
||
PUSH a0,a1
|
||
move *a13(plyr_seqdir),a1
|
||
|
||
move *a8(OXPOS),a0
|
||
move *a8(OZPOS),a1
|
||
|
||
move *a13(plyr_num),a14
|
||
srl 1,a14
|
||
jrz #tm1 ;br=team 1, right hoop
|
||
cmpi HOOPLX-16,a0
|
||
jrhs #nsq0 ;br=player not behind hoop
|
||
cmpi CZMID-150,a1
|
||
jrlo #nsq0 ;br=player not under hoop
|
||
cmpi CZMID+125,a1
|
||
jrgt #nsq0 ;br=player not under hoop
|
||
jruc #nsq1
|
||
#tm1
|
||
cmpi HOOPRX-35,a0
|
||
jrls #nsq0 ;br=player not behind hoop
|
||
cmpi CZMID-150,a1
|
||
jrlo #nsq0 ;br=player not under hoop
|
||
cmpi CZMID+125,a1
|
||
jrgt #nsq0 ;br=player not under hoop
|
||
jruc #nsq1
|
||
|
||
#nsq0 clrc
|
||
jruc #nsq2
|
||
#nsq1
|
||
setc
|
||
|
||
#nsq2
|
||
PULL a0,a1
|
||
rets
|
||
|
||
#*****************************************
|
||
* Sequence - adjust players X,Y, and/or Z
|
||
*
|
||
* A8=*plyr obj
|
||
* A13=*PxCTRL
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_shadow_trail
|
||
|
||
PUSH a10,a11
|
||
move *b4+,b0,L ;create RATE and delete rate
|
||
move b0,a10
|
||
|
||
move *a13(plyr_headobj_p),a11,L
|
||
CREATE TRAIL_HNDLR_PID,plr_trail_proc_disbatcher
|
||
|
||
PULL a10,a11
|
||
rets
|
||
|
||
|
||
#*****************************************************************************
|
||
* This PROCESS handles the disbatching of process for the player trail
|
||
*
|
||
* INPUT: reg a8 - * plyr obj
|
||
* reg a10 - rate and delete time
|
||
* reg a11 - * plyr head obj
|
||
*
|
||
******************************************************************************
|
||
SUBRP plr_trail_proc_disbatcher
|
||
|
||
ptp_0 movy a10,a9 ;get create RATE
|
||
srl 16,a9
|
||
ptp_1 SLEEPK 1
|
||
dsj a9,ptp_1
|
||
CREATE PLYR_TRAIL_OBJ_PID,plyr_trail
|
||
jruc ptp_0
|
||
|
||
******************************************************************************
|
||
* This PROCESS creates a copy of the image at X rate and delete it
|
||
*
|
||
* INPUT: reg a8 - * plyr obj
|
||
* reg a10 - rate and delete time
|
||
* reg a11 - * plyr head obj
|
||
******************************************************************************
|
||
SUBRP plyr_trail
|
||
|
||
;player body
|
||
clr a0
|
||
clr a1
|
||
move *a8(OIMG),a2,L
|
||
clr a3
|
||
move *a8(OFLAGS),a4
|
||
movi PLR_TRAIL_ID,a5
|
||
clr a6 ;x vel
|
||
clr a7 ;y vel
|
||
move a8,a9
|
||
calla BEGINOBJ
|
||
; calla BEGINOBJP
|
||
|
||
move *a9(OXVAL),a14,L
|
||
move a14,*a8(OXVAL),L
|
||
move *a9(OYVAL),a14,L
|
||
move a14,*a8(OYVAL),L
|
||
move *a9(OZVAL),a14,L
|
||
subi 8<<16,a14 ;force shadow under plyr
|
||
move a14,*a8(OZVAL),L
|
||
|
||
move *a9(OXANI),a14,L
|
||
move a14,*a8(OXANI),L
|
||
move *a9(OCTRL),a14
|
||
ori M_NOCOLL,a14
|
||
move a14,*a8(OCTRL)
|
||
move *a9(ODATA_p),a14,L
|
||
move a14,*a8(ODATA_p),L
|
||
|
||
move a8,a9 ;save plyr obj ptr
|
||
|
||
;player head
|
||
|
||
move *a11(OIMG),a2,L
|
||
move *a11(OFLAGS),a4
|
||
movi PLR_TRAIL_ID,a5
|
||
clr a0 ;x
|
||
clr a1 ;y
|
||
clr a3 ;z
|
||
clr a6 ;x vel
|
||
clr a7 ;y vel
|
||
calla BEGINOBJ
|
||
|
||
|
||
move *a11(OPAL),a14
|
||
move a14,*a8(OPAL)
|
||
move *a11(OXVAL),a14,L
|
||
move a14,*a8(OXVAL),L
|
||
move *a11(OYVAL),a14,L
|
||
move a14,*a8(OYVAL),L
|
||
move *a11(OZVAL),a14,L
|
||
subi 8<<16,a14 ;force shadow under plyr
|
||
move a14,*a8(OZVAL),L
|
||
|
||
move *a11(OXANI),a14,L
|
||
move a14,*a8(OXANI),L
|
||
move *a11(OCTRL),a14
|
||
ori M_NOCOLL,a14
|
||
move a14,*a8(OCTRL)
|
||
move *a11(ODATA_p),a14,L
|
||
move a14,*a8(ODATA_p),L
|
||
|
||
clr a11
|
||
movx a10,a11
|
||
pt_1
|
||
SLEEPK 1
|
||
move *a9(OZPOS),a14 ;player body Z
|
||
dec a14
|
||
move a14,*a8(OZPOS)
|
||
move a14,*a9(OZPOS)
|
||
dsj a11,pt_1
|
||
|
||
calla DELOBJA8 ;delete player body
|
||
move a9,a8
|
||
calla DELOBJA8 ;delete player head
|
||
DIE
|
||
|
||
#*****************************************
|
||
* Sequence - adjust players X,Y, and/or Z
|
||
*
|
||
* A13=*PxCTRL
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_allow_alleyoop
|
||
|
||
clr a14
|
||
move a14,*a13(plyr_inair_pass)
|
||
rets
|
||
|
||
#*****************************************
|
||
* Sequence - adjust players X,Y, and/or Z
|
||
*
|
||
* A13=*PxCTRL
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_disallow_alleyoop
|
||
|
||
clr a14
|
||
not a14
|
||
move a14,*a13(plyr_inair_pass)
|
||
rets
|
||
|
||
#*****************************************
|
||
* Sequence - adjust players X,Y, and/or Z
|
||
*
|
||
* A11=*PxCTRL
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_offset
|
||
|
||
move *b4+,b0 ;get X offset
|
||
move b0,a0
|
||
move *a8(OXPOS),a14
|
||
|
||
move *a8(OCTRL),a1,W
|
||
btst B_FLIPH,a1
|
||
jrz #sx ;No flip?
|
||
neg a0
|
||
#sx add a0,a14
|
||
move a14,*a8(OXPOS)
|
||
|
||
move *b4+,b0 ;get Y offset
|
||
move b0,a0
|
||
move *a8(OYPOS),a14
|
||
add a0,a14
|
||
move a14,*a8(OYPOS)
|
||
|
||
move *b4+,b0 ;get Z offset
|
||
move b0,a0
|
||
movi CZMID,a14
|
||
; move *a8(OZPOS),a14
|
||
add a0,a14
|
||
move a14,*a8(OZPOS)
|
||
rets
|
||
|
||
#*****************************************
|
||
* Sequence - adjust players X,Y, and/or Z
|
||
* Set a flag that says "I have already been offset" for FLYBACKS
|
||
*
|
||
* A11=*PxCTRL
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_offset2
|
||
|
||
move *a13(plyr_offset_flag),a14
|
||
jrz #cont
|
||
addi 48,b4
|
||
rets
|
||
#cont movk 1,a14
|
||
move a14,*a13(plyr_offset_flag)
|
||
move *b4+,b0 ;get X offset
|
||
move b0,a0
|
||
move *a8(OXPOS),a14
|
||
|
||
move *a8(OCTRL),a1,W
|
||
btst B_FLIPH,a1
|
||
jrz #sx ;No flip?
|
||
neg a0
|
||
#sx add a0,a14
|
||
move a14,*a8(OXPOS)
|
||
|
||
move *b4+,b0 ;get Y offset
|
||
move b0,a0
|
||
move *a8(OYPOS),a14
|
||
add a0,a14
|
||
move a14,*a8(OYPOS)
|
||
|
||
move *b4+,b0 ;get Z offset
|
||
move b0,a0
|
||
; movi CZMID,a14
|
||
move *a8(OZPOS),a14
|
||
add a0,a14
|
||
move a14,*a8(OZPOS)
|
||
rets
|
||
|
||
|
||
********************************
|
||
* Sequence - stand
|
||
* A11=*PxCTRL
|
||
* >B4=*Start of seq list
|
||
|
||
SUBR seq_stand
|
||
;trying to stop a player in a DISH_OFF seq. receiving pass, dont allow
|
||
;joystick if pass on the way
|
||
;
|
||
move @ballprcv_p,a14,L
|
||
cmp a14,a13
|
||
jreq stnd1
|
||
move *a13(plyr_nojoy),a14
|
||
jrn stnd1
|
||
move *a13(plyr_rcvpass),a14
|
||
jrnz stnd1
|
||
clr a0
|
||
move a0,*a13(plyr_nojoy)
|
||
stnd1
|
||
|
||
|
||
;Make this STND_SEQ if in close
|
||
movk STND2_SEQ,a0 ;Set stand sequence
|
||
|
||
move *a13(plyr_o1dist),a14
|
||
cmpi 155*DIST_REDUCTION,a14
|
||
jrlt #stnd0
|
||
move *a13(plyr_o2dist),a14
|
||
cmpi 155*DIST_REDUCTION,a14
|
||
jrgt #stnd1
|
||
#stnd0
|
||
movk STND_SEQ,a0
|
||
#stnd1
|
||
|
||
|
||
move *a13(plyr_ownball),a1
|
||
jrle #set
|
||
|
||
|
||
move *a13(plyr_num),a2
|
||
srl 1,a2
|
||
XORK 1,a2
|
||
sll 6,a2 ;*64
|
||
addi plyrproc_t,a2
|
||
move *a2+,a4,L
|
||
move *a2+,a5,L
|
||
move *a13(plyr_o1dist),a0
|
||
cmpi 60*DIST_REDUCTION,a0
|
||
jrge #chko2 ;Too far?
|
||
subi 30*DIST_REDUCTION,a0
|
||
jrlt #doelbo ;In close?
|
||
move *a4(plyr_seq),a14
|
||
|
||
|
||
; cmpi STEALUP_SEQ,a14
|
||
; jreq #doelbo
|
||
|
||
|
||
subi STEAL_SEQ,a14
|
||
jreq #doelbo
|
||
subk PUSH_SEQ-STEAL_SEQ,a14
|
||
jreq #doelbo
|
||
#chko2
|
||
move *a13(plyr_o2dist),a0
|
||
cmpi 60*DIST_REDUCTION,a0
|
||
jrge #stndwb ;Too far?
|
||
subi 30*DIST_REDUCTION,a0
|
||
jrlt #doelbo ;In close?
|
||
move *a5(plyr_seq),a14
|
||
|
||
|
||
; cmpi STEALUP_SEQ,a14
|
||
; jreq #doelbo
|
||
|
||
|
||
subi STEAL_SEQ,a14
|
||
jreq #doelbo
|
||
subk PUSH_SEQ-STEAL_SEQ,a14
|
||
jrne #stndwb
|
||
#doelbo
|
||
move *a13(plyr_autoctrl),a14
|
||
jrnz #stndwb
|
||
|
||
move @game_time,a1,L ;If under 2 secs, no elbow
|
||
cmpi >200,a1
|
||
jrle #stndwb
|
||
|
||
movi ELBO_SEQ,a0
|
||
move *a13(plyr_seq),a14
|
||
cmp a0,a14
|
||
jrne #setnostl ;!In elbo?
|
||
move *a11,a1
|
||
sll 32-6,a1
|
||
jrz #set ;No buttons?
|
||
|
||
|
||
#stndwb
|
||
movk STNDWB_SEQ,a0
|
||
move *a13(plyr_seq),a14
|
||
cmpi ELBO2_SEQ,a14
|
||
jrne #set
|
||
movk STNDWB2_SEQ,a0 ;stops glitch from elbo swing to stand
|
||
#set calla plyr_setseq
|
||
|
||
move *a13(plyr_ani1st_p),a0,L
|
||
move a0,b4
|
||
rets
|
||
|
||
|
||
|
||
#setnostl
|
||
calla plyr_setseq
|
||
|
||
move *a13(plyr_ani1st_p),a0,L
|
||
move a0,b4
|
||
|
||
movi 140,a0
|
||
move a0,@steals_off ;Don't allow steals for 60 ticks
|
||
movi 80,a0
|
||
move a0,@pushing_delay
|
||
rets
|
||
|
||
|
||
|
||
********************************
|
||
* Sequence - See if we should stand from steal
|
||
* A6=Button bits
|
||
|
||
SUBR seq_stealstand
|
||
|
||
;Turmell
|
||
move *a13(plyr_ownball),a0
|
||
jrp seq_stand
|
||
|
||
btst 5,a6
|
||
jrz seq_stand
|
||
rets
|
||
|
||
|
||
#*******************************
|
||
* Sequence - Set new direction (for dunks)
|
||
* B4=*Next data in seq list
|
||
* >A7=New dir
|
||
|
||
SUBR seq_newdir
|
||
|
||
move *b4+,b0
|
||
move b0,a7
|
||
move *a13(plyr_anirevff),a0
|
||
jrz #x
|
||
srl 4,a7
|
||
sll 3,a7
|
||
addi #t,a7
|
||
movb *a7,a7
|
||
#x move a7,*a13(plyr_dir)
|
||
rets
|
||
|
||
#t .byte 0,7*16,6*16,5*16,4*16,3*16,2*16,1*16
|
||
|
||
|
||
#*******************************
|
||
* Sequence - Check turbo button from mid run
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_ck_turbo
|
||
|
||
movk RUN_SEQ,a0 ;>Setup run sequence
|
||
|
||
move *a13(plyr_turbon),a14
|
||
jrz #cont
|
||
|
||
;Skip next frame of animation + next seq_command
|
||
addi 112,b4
|
||
movk RUNTURB_SEQ,a0 ;>Setup run sequence
|
||
#cont
|
||
move a0,*a13(plyr_seq)
|
||
rets
|
||
|
||
#*******************************
|
||
* Sequence - Check turbo button from mid run
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_ck_drib_turbo
|
||
|
||
movk RUNDRIB_SEQ,a0 ;>Setup run sequence
|
||
|
||
move *a13(plyr_turbon),a14
|
||
jrz #cont
|
||
|
||
;Skip next frame of animation + next seq_command
|
||
addi 112,b4
|
||
movk RUNDRIBTURB_SEQ,a0 ;>Setup run sequence
|
||
#cont
|
||
move a0,*a13(plyr_seq)
|
||
rets
|
||
|
||
|
||
|
||
#*******************************
|
||
* Sequence - Skip 1 frame of animation
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_skip_1frm
|
||
|
||
addi 64,b4
|
||
rets
|
||
|
||
|
||
|
||
#*******************************
|
||
* Sequence - Keep falling player from finishing his get up animation until
|
||
* he is on the ground
|
||
|
||
SUBR seq_stayinair
|
||
|
||
move *a13(plyr_jmpcnt),a0
|
||
jrz #x
|
||
subi 2*32+3*16,b4
|
||
#x rets
|
||
|
||
#*******************************
|
||
* Sequence - Keep zx vel for later skid on butt
|
||
|
||
SUBR seq_keepzx
|
||
|
||
move *a8(OXVEL),a0,L
|
||
sla 1,a0
|
||
move a0,*a13(plyr_kpxvel),L
|
||
move *a8(OZVEL),a0,L
|
||
sla 1,a0
|
||
move a0,*a13(plyr_kpzvel),L
|
||
rets
|
||
|
||
#*******************************
|
||
* Sequence - set injury for this player
|
||
|
||
SUBR seq_injury
|
||
|
||
movk PS_INJURY,a0 ;>Inc try shot stat
|
||
move *a13(plyr_num),a1
|
||
calla inc_player_stat
|
||
|
||
rets
|
||
|
||
#*******************************
|
||
* Sequence - Restore zx vel for skid on butt
|
||
|
||
SUBR seq_stuffzx
|
||
|
||
move *a13(plyr_kpxvel),a0,L
|
||
move a0,*a8(OXVEL),L
|
||
move *a13(plyr_kpzvel),a0,L
|
||
move a0,*a8(OZVEL),L
|
||
|
||
rets
|
||
|
||
#*******************************
|
||
* Sequence - Change into fire pal
|
||
|
||
; SUBR seq_strtfire
|
||
;
|
||
;;WORD plyr_keeppal ;Keep pal for reuse upon finish of flames
|
||
;
|
||
; move *a13(plyr_keeppal),a0
|
||
; jrnz #x
|
||
; move *a8(OPAL),a0
|
||
; move a0,*a13(plyr_keeppal)
|
||
; movi FIREFALP,a0
|
||
; calla pal_getf
|
||
; move a0,*a8(OPAL)
|
||
;;Do head also
|
||
; move *a13(plyr_headobj_p),a1,L
|
||
; move *a1(OPAL),a14
|
||
; move a14,*a13(plyr_hdkeeppal)
|
||
; move a0,*a1(OPAL)
|
||
;#x
|
||
; rets
|
||
|
||
#*******************************
|
||
* Sequence - Change back from fire pal
|
||
|
||
; SUBR seq_stopfire
|
||
;
|
||
; move *a13(plyr_keeppal),a0
|
||
; jrz #x
|
||
; move a0,*a8(OPAL)
|
||
;;Do head also
|
||
; move *a13(plyr_hdkeeppal),a0
|
||
; move *a13(plyr_headobj_p),a1,L
|
||
; move a0,*a1(OPAL)
|
||
; clr a0
|
||
; move a0,*a13(plyr_keeppal)
|
||
;#x
|
||
; rets
|
||
|
||
#*******************************
|
||
* Sequence - Start smoke
|
||
|
||
; SUBR seq_smoke
|
||
;
|
||
; .ref plyr_smoketrail2
|
||
; CREATE0 plyr_smoketrail2
|
||
; move a13,*a0(PA10),L
|
||
;
|
||
; rets
|
||
|
||
|
||
#*******************************
|
||
* Sequence - Call a sound
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_snd
|
||
|
||
move *b4+,b0,L
|
||
move b0,a0
|
||
jauc snd_play1
|
||
|
||
#*******************************
|
||
* Sequence - Turn off the NOBALL flag
|
||
|
||
SUBR seq_noballoff
|
||
|
||
move *a13(plyr_seqflgs),a0
|
||
andni NOBALL_M,a0
|
||
move a0,*a13(plyr_seqflgs)
|
||
|
||
rets
|
||
|
||
|
||
#*******************************
|
||
* Sequence - reset seq, in case dir changed
|
||
|
||
SUBR seq_resetseq
|
||
|
||
clr a0
|
||
move a0,*a13(plyr_nojoy)
|
||
|
||
move *a13(plyr_seq),a0
|
||
move a6,a1
|
||
sll 32-4,a1
|
||
jrnz #set ;Pushing joy?
|
||
|
||
movk STNDDEF_SEQ,a0 ;>Setup stand sequence
|
||
move *a13(plyr_ownball),a14
|
||
jrle #set
|
||
movk STNDDRIBDEF_SEQ,a1
|
||
|
||
#set jruc plyr_setseq
|
||
|
||
|
||
#*******************************
|
||
* Sequence - Start of run
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_run
|
||
|
||
;Used to skip 1st frame for sequential #3 run!
|
||
|
||
move b4,a0
|
||
addi 4*16,a0
|
||
move a0,*a13(plyr_ani1st_p),L
|
||
rets
|
||
|
||
|
||
#*******************************
|
||
* Sequence - jump
|
||
* A6=Button bits
|
||
|
||
SUBR seq_jump
|
||
|
||
move *a13(plyr_seq),a14
|
||
cmpi LAYUP_SEQ,a14
|
||
jreq #jmp
|
||
cmpi HOOK_SEQ,a14
|
||
jreq #jmp
|
||
cmpi HOOK2_SEQ,a14
|
||
jreq #jmp
|
||
|
||
;No head fake if under 4 secs
|
||
|
||
move @game_time,a0,L
|
||
cmpi >400,a0
|
||
jrlt #jmp
|
||
|
||
btst 4,a6 ;But1 (Shoot/block)
|
||
jrnz seq_jump2 ;Fake?
|
||
.ref head_fake_speech
|
||
calla head_fake_speech
|
||
jruc seq_stand ;Fake?
|
||
|
||
|
||
SUBR seq_jump2
|
||
|
||
#jmp
|
||
movk 1,a0 ;Start jump
|
||
move a0,*a13(plyr_jmpcnt)
|
||
|
||
move *a8(OXVEL),a2,L ;>Reduce vel
|
||
move *a8(OZVEL),a3,L
|
||
sra 2,a2
|
||
sra 2,a3
|
||
|
||
move *a13(plyr_seq),a0
|
||
cmpi LAYUP_SEQ,a0
|
||
jrz #nodesp
|
||
|
||
move *a13(plyr_turbon),a5
|
||
|
||
move *a13(plyr_num),a14
|
||
move @plyr_onfire,a0
|
||
;; cmp a0,a14
|
||
;; jrnz #fire1 ;If on fire, don't do turbo jump!
|
||
btst a14,a0 ;If on fire, don't do turbo jump!
|
||
jrz #fire1 ; br=not on-fire
|
||
clr a5
|
||
jruc #fire
|
||
#fire1
|
||
|
||
move *a13(plyr_PDATA_p),a1,L ;If lotsa turbo, still do tall jump!
|
||
move *a1(ply_turbo),a1
|
||
; cmpi TURBO_CNT/2,a1 ;!!! Min cnt for tall jump
|
||
;Allow more turbo jumps...
|
||
cmpi TURBO_CNT/4,a1 ;!!! Min cnt for tall jump
|
||
jrlt #fire ;Turbo too low?
|
||
|
||
move *a13(plyr_turbon),a5
|
||
jrnz #turb ;Br=taller jump!
|
||
;#fire
|
||
sra 1,a2
|
||
sra 1,a3
|
||
;LOOK!!!
|
||
#fire
|
||
#turb
|
||
|
||
|
||
|
||
;Keep - may need this on some desperation shot!
|
||
; move *a13(plyr_seq),a0
|
||
; subk SHOOTDESP3_SEQ,a0
|
||
; jrne #nodesp
|
||
; movi >20000,a2 ;For this desperation shot, we
|
||
; move *a13(plyr_num),a0 ;need some x velocity
|
||
; subk 2,a0
|
||
; jrlt #nodesp
|
||
; movi ->20000,a2
|
||
|
||
|
||
#nodesp
|
||
|
||
|
||
move a2,*a8(OXVEL),L
|
||
move a3,*a8(OZVEL),L
|
||
|
||
|
||
move *a8(OZPOS),a14 ;894 to 1379 (Z range 486)
|
||
subi 400,a14
|
||
movi ->70,a1
|
||
mpys a14,a1
|
||
addi ->24000,a1
|
||
|
||
move a5,a5
|
||
jrz #notur
|
||
addi ->8000,a1
|
||
#notur
|
||
move *a13(plyr_seq),a0
|
||
cmpi LAYUP_SEQ,a0
|
||
jreq #noly2
|
||
addi ->8000,a1
|
||
#noly2
|
||
move *a13(plyr_seqflgs),a0
|
||
btst SHOOT_B,a0
|
||
jrz #notsh
|
||
move a1,a0 ;-1/16
|
||
sra 4,a0
|
||
sub a0,a1
|
||
|
||
move *a13(plyr_seq),a14
|
||
cmpi QSHOOT_SEQ,a14
|
||
jrnz #notsh
|
||
sra 1,a1
|
||
|
||
#notsh
|
||
move a1,*a8(OYVEL),L
|
||
|
||
move *a13(plyr_num),a14
|
||
move @plyr_onfire,a0
|
||
;; cmp a14,a0
|
||
;; jrnz #nofire
|
||
btst a14,a0
|
||
jrz #nofire
|
||
|
||
;Try turning on fire circles under player
|
||
;If on defense, don't do fire circles.
|
||
move @ballpnum,a0
|
||
cmp a14,a0
|
||
jrnz #nofire
|
||
|
||
move @tvpanelon,a0,L
|
||
jrnz #nofire
|
||
|
||
.ref fire_circle
|
||
CREATE0 fire_circle
|
||
move a13,*a0(PA10),L
|
||
|
||
#nofire
|
||
|
||
rets
|
||
|
||
|
||
|
||
#*******************************
|
||
* Sequence - start block jump
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_block
|
||
|
||
PUSH a6,a7,a9
|
||
|
||
movk 1,a0 ;Start jump
|
||
move a0,*a13(plyr_jmpcnt)
|
||
|
||
move @ballobj_p,a5,L ;>Calc where ball is headed
|
||
|
||
move @ballpnum,a14
|
||
jrn #binair ;Ball in air?
|
||
|
||
move *a13(plyr_myhoopx),a0
|
||
movi CZMID,a1
|
||
|
||
sll 5,a14
|
||
addi plyrproc_t,a14
|
||
move *a14,a14,L
|
||
move *a14(plyr_seqflgs),a2
|
||
btst DUNK_B,a2
|
||
jrz #nodunk
|
||
|
||
#float_at_hp
|
||
move a0,a6 ;>Jump at rim
|
||
move a1,a7
|
||
movi -200<<16,a9
|
||
addk 6,a6
|
||
cmpi WRLDMID,a6
|
||
jrlt #calcintercept
|
||
subk 6+6,a6
|
||
jruc #calcintercept
|
||
|
||
#nodunk
|
||
;Check teammate of guy holding ball to see if he is alley oop jumping!
|
||
move @ballpnum,a14
|
||
xori 1,a14
|
||
|
||
sll 5,a14
|
||
addi plyrproc_t,a14
|
||
move *a14,a14,L
|
||
move *a14(plyr_seqflgs),a2
|
||
btst DUNK_B,a2
|
||
jrz #nodunk2
|
||
;Yes, he is alley oop jumping.
|
||
;If near him, jump up and float toward my hoop - just like if I were trying
|
||
;to block a dunker with the ball.
|
||
|
||
;If near guy with the ball, just jump straight up in front of him.
|
||
move *a13(plyr_balldist),a2
|
||
cmpi >40,a2 ;About 3 feet away from ball
|
||
|
||
jrgt #float_at_hp ;this guy wants to jump up and
|
||
;disrupt the alley oop jumper!
|
||
PULL a6,a7,a9
|
||
addk 32,b4 ;Skip
|
||
jruc seq_jump2
|
||
|
||
#nodunk2
|
||
move *a13(plyr_seq),a14
|
||
subk BLOCK_SEQ,a14
|
||
jrne #noblk
|
||
addk 32,b4 ;Skip
|
||
|
||
PULL a6,a7,a9
|
||
|
||
;If not near ball, jump lower and ignore turbo jump!
|
||
|
||
move *a13(plyr_balldist),a0
|
||
cmpi >e0*DIST_REDUCTION,a0 ;About 10 feet away from ball
|
||
; cmpi >100*DIST_REDUCTION,a0 ;About 10 feet away from ball
|
||
jrlt seq_jump2
|
||
|
||
;If near my own hoop, I am probably trying to G.T.! So allow high jump!
|
||
move @ballshotinair,a0 ;Shooter # if shot in air, else -1
|
||
jrn #cont
|
||
move *a13(plyr_hpdist),a0
|
||
cmpi 70,a0 ;About 3 feet away from my hoop
|
||
jrlt seq_jump2
|
||
#cont
|
||
movk 1,a0 ;Start jump
|
||
move a0,*a13(plyr_jmpcnt)
|
||
|
||
clr a0
|
||
move a0,*a8(OXVEL),L ;Zero vel
|
||
move a0,*a8(OZVEL),L
|
||
|
||
;LOOK!!!
|
||
move *a8(OZPOS),a14 ;894 to 1379 (Z range 486)
|
||
subi 400,a14
|
||
movi ->30,a1 ;Smaller vertical jump
|
||
mpys a14,a1
|
||
addi ->24000,a1
|
||
|
||
move a1,*a8(OYVEL),L
|
||
|
||
rets
|
||
|
||
#noblk
|
||
move *a5(OXPOS),a6 ;>In front of plyr between basket
|
||
move *a5(OXANI+16),a14
|
||
add a14,a6
|
||
move *a5(OZPOS),a7
|
||
movi -200<<16,a9
|
||
|
||
sub a6,a0
|
||
sub a7,a1
|
||
move a0,a2
|
||
move a1,a3
|
||
abs a2
|
||
abs a3
|
||
cmp a3,a2
|
||
jrge #scl
|
||
move a3,a2
|
||
jruc #scl
|
||
|
||
#scllp sra 1,a0 ;Scale down
|
||
sra 1,a1
|
||
srl 1,a2
|
||
#scl cmpi 22,a2
|
||
jrgt #scllp
|
||
|
||
add a0,a6
|
||
add a1,a7
|
||
|
||
jruc #calcintercept
|
||
|
||
#binair
|
||
move *a5(OXVAL),a6,L
|
||
move *a5(OXANI),a0,L
|
||
add a0,a6
|
||
move *a5(OZVAL),a7,L
|
||
move *a5(OYVAL),a9,L
|
||
|
||
move *a5(OXVEL),a0,L
|
||
move *a5(OZVEL),a1,L
|
||
move *a5(OYVEL),a2,L
|
||
movk 30,b0
|
||
#newblp
|
||
add a0,a6
|
||
add a1,a7
|
||
add a2,a9
|
||
addi GRAVB,a2
|
||
dsj b0,#newblp
|
||
|
||
sra 16,a6
|
||
sra 16,a7
|
||
|
||
#calcintercept
|
||
|
||
move *b4+,b0,L
|
||
move b0,a2 ;*Key img
|
||
|
||
;Time till impact?
|
||
movk 30,a4
|
||
|
||
clr a3
|
||
clr a5
|
||
move @ballprcv_p,a0,L
|
||
cmp a13,a0
|
||
jreq #setvel ;I'm receiving?
|
||
|
||
|
||
move *a2(IANIOFFX),a1
|
||
move *a2(IANI2X),a14
|
||
sub a14,a1
|
||
movi 850,a0
|
||
mpys a0,a1
|
||
sra 10,a1 ;/1024
|
||
|
||
move *a13(plyr_newdir),a14
|
||
jrge #ndok
|
||
move *a13(plyr_dir),a14
|
||
#ndok addk 8,a14
|
||
sll 32-7,a14
|
||
srl 32-7+4,a14
|
||
subk 4,a14
|
||
jrle #nof ;No flip?
|
||
neg a1
|
||
#nof
|
||
add a1,a6
|
||
|
||
|
||
move a6,a3
|
||
move a7,a5
|
||
|
||
move *a8(OXPOS),a1
|
||
move *a8(OXANI+16),a14
|
||
add a14,a1
|
||
sub a1,a3 ;X delta
|
||
|
||
; move *a13(plyr_dir),a14
|
||
; addk 8,a14 ;Round up
|
||
; srl 4,a14 ;Lose frac
|
||
; sll 4,a14 ;*16
|
||
; addi #z_t,a14
|
||
; move *a14,a5
|
||
|
||
move *a8(OZPOS),a1
|
||
sub a1,a5 ;Z delta
|
||
|
||
;Very important! Maximum x/z float for defender blocks/rebounds
|
||
;Should be linked to attribute!
|
||
movk 30,a1 ;Max delta (Old)
|
||
; movi 40,a1 ;Max delta
|
||
move *a13(plyr_seq),a14
|
||
subk REBOUND_SEQ,a14
|
||
jrne #noreb
|
||
;Fly further if rebound art sequence
|
||
addk 32,a1
|
||
; addk 20,a1 ;TE value
|
||
; addk 10,a1
|
||
|
||
#noreb cmp a1,a3
|
||
jrlt #x1ok
|
||
move a1,a3
|
||
#x1ok
|
||
cmp a1,a5
|
||
jrlt #z1ok
|
||
move a1,a5
|
||
#z1ok
|
||
neg a1
|
||
cmp a1,a3
|
||
jrgt #x2ok
|
||
move a1,a3
|
||
#x2ok
|
||
cmp a1,a5
|
||
jrgt #z2ok
|
||
move a1,a5
|
||
#z2ok
|
||
|
||
sll 16,a3
|
||
sll 16,a5
|
||
divs a4,a3
|
||
divs a4,a5
|
||
#setvel
|
||
;PUTBACK logic
|
||
; move *a13(plyr_seq),a1
|
||
; cmpi PUTBACK_SEQ,a1
|
||
; jrne #noput
|
||
; clr a3 ;no drift toward ball
|
||
; clr a5 ;no drift toward ball
|
||
; move a3,*a8(OXVEL),L
|
||
; move a5,*a8(OZVEL),L
|
||
; movi ->33000,a1
|
||
; move a1,*a8(OYVEL),L
|
||
; jruc #x
|
||
;#noput
|
||
|
||
move *a13(plyr_num),a14
|
||
.ref pup_nodrift
|
||
move @pup_nodrift,a1
|
||
btst a14,a1
|
||
jrz #dodrift
|
||
clr a3
|
||
clr a5
|
||
#dodrift
|
||
|
||
move a3,*a8(OXVEL),L
|
||
move a5,*a8(OZVEL),L
|
||
|
||
movi -GRAV/2,a1
|
||
mpys a4,a1
|
||
move *a8(OYVAL),a3,L ;Adjust for hgt difference
|
||
sub a9,a3 ;- if above
|
||
divs a4,a3
|
||
sub a3,a1
|
||
;Bug? Code usually has to use minimum allowed vel.
|
||
;Mimimum jumping height!
|
||
|
||
move @ballgoaltcnt,a14 ;Not owned. Is it a shot or loose?
|
||
jrnz #shot
|
||
;This is rebound time
|
||
|
||
cmpi ->1c000,a1
|
||
jrlt #minok
|
||
movi ->1c000,a1 ;Min
|
||
jruc #minok
|
||
#shot
|
||
|
||
move *a13(plyr_num),a14
|
||
move @plyr_onfire,a6
|
||
btst a14,a6
|
||
jrz #norm
|
||
;Guy is on fire, trying to block a shot, make minimum jump go higher!
|
||
cmpi ->4c000,a1
|
||
jrlt #minok
|
||
movi ->4c000,a1 ;Min
|
||
jruc #minok
|
||
#norm
|
||
|
||
|
||
cmpi ->3c000,a1
|
||
jrlt #minok
|
||
movi ->3c000,a1 ;Min
|
||
#minok
|
||
|
||
move *a13(plyr_num),a14
|
||
move @plyr_onfire,a6
|
||
;; cmp a14,a6
|
||
;; jrnz #nofire
|
||
btst a14,a6
|
||
jrz #nofire
|
||
|
||
;This guy on fire, let him jump higher!
|
||
; cmpi ->50200,a1 ;T.E.
|
||
; cmpi ->52200,a1 ;Old hangtime
|
||
; cmpi ->58200,a1 ;Cool value
|
||
cmpi ->54200,a1 ;Current value
|
||
jrgt #maxok
|
||
movi ->54200,a1
|
||
jruc #maxok
|
||
|
||
#nofire
|
||
;Maximum jumping height!
|
||
;FIX!! Should be linked to attribute!
|
||
; cmpi ->4b200,a1 ;4a200
|
||
; jrgt #maxok
|
||
; movi ->4b200,a1
|
||
|
||
move *a13(plyr_num),a6
|
||
;This is tied in with super blocks for create a player or powerup!!
|
||
.ref blkpower
|
||
move @blkpower,a14
|
||
btst a6,a14
|
||
jrz #norm1
|
||
;FIX!!
|
||
jruc #norm1 ;Temp!
|
||
|
||
;Powerup blocking ability
|
||
cmpi ->50000,a1 ;Let him jump higher
|
||
jrgt #maxok
|
||
movi ->50000,a1
|
||
jruc #maxok
|
||
#norm1
|
||
move *a13(plyr_ptsdown),a14
|
||
jrgt #losing ;If losing, jump higher
|
||
; cmpi ->4b200,a1 ;Let him jump higher
|
||
cmpi ->4b400,a1 ;Let him jump higher
|
||
jrgt #maxok
|
||
movi ->4b400,a1
|
||
jruc #maxok
|
||
#losing
|
||
cmpi ->4b700,a1 ;Let him jump higher
|
||
jrgt #maxok
|
||
movi ->4b700,a1
|
||
#maxok
|
||
move a1,*a8(OYVEL),L
|
||
|
||
|
||
#x PULL a6,a7,a9
|
||
rets
|
||
|
||
|
||
#z_t .word CZMID+12,CZMID+8,CZMID,CZMID-8
|
||
.word CZMID-12,CZMID-8,CZMID,CZMID+8
|
||
.word CZMID+12
|
||
|
||
|
||
#*******************************
|
||
* Sequence - Auto rebound jump
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_rebounda
|
||
|
||
move @ballpnum,a14
|
||
jrge seq_stand ;Someone grabbed ball?
|
||
|
||
|
||
PUSH a6,a7,a9
|
||
|
||
|
||
movk 1,a0 ;Start jump
|
||
move a0,*a13(plyr_jmpcnt)
|
||
|
||
|
||
move @ballobj_p,a5,L ;>Calc where ball is headed
|
||
|
||
move *a5(OXVAL),a6,L
|
||
move *a5(OXANI),a0,L
|
||
add a0,a6
|
||
move *a5(OZVAL),a7,L
|
||
move *a5(OYVAL),a9,L
|
||
|
||
move *a5(OXVEL),a0,L
|
||
move *a5(OZVEL),a1,L
|
||
move *a5(OYVEL),a2,L
|
||
movk 20,b0
|
||
movi GRAVB,a14
|
||
#newblp
|
||
add a0,a6
|
||
add a1,a7
|
||
add a2,a9
|
||
add a14,a2
|
||
dsj b0,#newblp
|
||
|
||
sra 16,a6
|
||
sra 16,a7
|
||
|
||
|
||
move *b4+,b0,L
|
||
move b0,a2 ;*Key img
|
||
|
||
movk 20,a4
|
||
|
||
|
||
move *a2(IANIOFFX),a1
|
||
move *a2(IANI2X),a14
|
||
sub a14,a1
|
||
movi 850,a0
|
||
mpys a0,a1
|
||
sra 10,a1 ;/1024
|
||
|
||
move *a13(plyr_newdir),a14
|
||
jrge #ndok
|
||
move *a13(plyr_dir),a14
|
||
#ndok addk 8,a14
|
||
sll 32-7,a14
|
||
srl 32-7+4,a14
|
||
subk 4,a14
|
||
jrle #nof ;No flip?
|
||
neg a1
|
||
#nof
|
||
add a1,a6
|
||
|
||
|
||
move a6,a3
|
||
move a7,a5
|
||
|
||
move *a8(OXPOS),a1
|
||
move *a8(OXANI+16),a14
|
||
add a14,a1
|
||
sub a1,a3 ;X delta
|
||
|
||
|
||
move *a8(OZPOS),a1
|
||
sub a1,a5 ;Z delta
|
||
|
||
movi 50,a1 ;Max delta (was 30)
|
||
cmp a1,a3
|
||
jrlt #x1ok
|
||
move a1,a3
|
||
#x1ok
|
||
cmp a1,a5
|
||
jrlt #z1ok
|
||
move a1,a5
|
||
#z1ok
|
||
neg a1
|
||
cmp a1,a3
|
||
jrgt #x2ok
|
||
move a1,a3
|
||
#x2ok
|
||
cmp a1,a5
|
||
jrgt #z2ok
|
||
move a1,a5
|
||
#z2ok
|
||
|
||
sll 16,a3
|
||
sll 16,a5
|
||
divs a4,a3
|
||
divs a4,a5
|
||
#setvel
|
||
move a3,*a8(OXVEL),L
|
||
move a5,*a8(OZVEL),L
|
||
|
||
movi -GRAV/2,a1
|
||
mpys a4,a1
|
||
move *a8(OYVAL),a3,L ;Adjust for hgt difference
|
||
sub a9,a3 ;- if above
|
||
divs a4,a3
|
||
sub a3,a1
|
||
cmpi ->1c000,a1
|
||
jrlt #minok
|
||
movi ->1c000,a1 ;Min
|
||
#minok
|
||
; cmpi ->4a000,a1
|
||
; jrgt #maxok
|
||
|
||
; LOCKUP
|
||
; PULL a6,a7,a9
|
||
; jruc seq_stand
|
||
|
||
#maxok move a1,*a8(OYVEL),L
|
||
|
||
|
||
PULL a6,a7,a9
|
||
rets
|
||
|
||
|
||
#*******************************
|
||
* Sequence - start dunk jump
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_strtdunk
|
||
|
||
move *b4+,b0,L
|
||
move b0,a2 ;*Slam img
|
||
|
||
move *b4+,b0
|
||
move b0,a4 ;#ticks till we reach rim
|
||
|
||
move a4,*a13(plyr_slam_ticks)
|
||
movk 1,a0 ;Start jump
|
||
move a0,*a13(plyr_jmpcnt)
|
||
|
||
|
||
move *a13(plyr_ohoopx),a3
|
||
|
||
move *a2(IANIOFFX),a1
|
||
move *a2(IANI2X),a14
|
||
sub a14,a1
|
||
; movi 850,a0
|
||
movi 900,a0
|
||
mpys a0,a1
|
||
sra 10,a1 ;/1024
|
||
|
||
; move *a13(plyr_dir),a14
|
||
; addk 8,a14
|
||
; sll 32-7,a14
|
||
; srl 32-7+4,a14
|
||
; subk 4,a14
|
||
; jrle #nof ;No flip?
|
||
; neg a1
|
||
;#nof
|
||
|
||
move *a8(OCTRL),a14
|
||
btst B_FLIPH,a14
|
||
jrz #nof
|
||
neg a1
|
||
#nof
|
||
add a1,a3
|
||
|
||
|
||
move *a8(OXPOS),a1
|
||
move *a8(OXANI+16),a14
|
||
add a14,a1
|
||
sub a1,a3 ;X delta
|
||
|
||
move *a13(plyr_dir),a14
|
||
addk 8,a14 ;Round up
|
||
srl 4,a14 ;Lose frac
|
||
sll 4,a14 ;*16
|
||
addi #z_t,a14
|
||
move *a14,a5
|
||
move *a8(OZPOS),a1
|
||
sub a1,a5 ;Y delta
|
||
|
||
sll 16,a3
|
||
sll 16,a5
|
||
divs a4,a3
|
||
divs a4,a5
|
||
|
||
move *a13(plyr_seqflgs),a0
|
||
btst LAYUP_B,a0
|
||
jrz #nolay
|
||
|
||
movk LAY_UP,a0
|
||
move a0,@shot_type
|
||
|
||
movk 3,a14
|
||
move a3,a7
|
||
divs a14,a7
|
||
sub a7,a3
|
||
|
||
move a5,a7
|
||
divs a14,a7
|
||
sub a7,a5
|
||
|
||
; sra 1,a3
|
||
; sra 1,a5
|
||
jruc #layin
|
||
#nolay
|
||
movk PS_DUNKS_TRY,a0 ;>Inc dunk stats
|
||
move *a13(plyr_num),a1
|
||
calla inc_player_stat
|
||
|
||
#layin
|
||
move a3,*a8(OXVEL),L
|
||
move a5,*a8(OZVEL),L
|
||
|
||
movi -GRAV/2,a1
|
||
mpys a4,a1
|
||
move *a8(OYVAL),a3,L ;Adjust for hgt difference
|
||
subi (HOOPY+12)<<16,a3 ;- if above
|
||
divs a4,a3
|
||
sub a3,a1
|
||
move a1,*a8(OYVEL),L
|
||
|
||
clr a0
|
||
move a0,@plyrcharge
|
||
move a0,@slamming
|
||
|
||
movi PS_2PTS_TRY,a0
|
||
move *a13(plyr_num),a1
|
||
calla inc_player_stat
|
||
|
||
cmpi 62,a4 ;60
|
||
jrlt #nofl
|
||
|
||
PUSH a10
|
||
clr a10
|
||
cmpi 48h,a4
|
||
jrlt #nosnd
|
||
movi 10,a0 ;2% do bogus snd
|
||
calla RNDPER
|
||
jrls #nosnd
|
||
movk 1,a10
|
||
#nosnd
|
||
move a7,a2
|
||
CREATE0 plyr_camflash
|
||
move a2,a7
|
||
PULL a10
|
||
|
||
#nofl
|
||
|
||
move *a13(plyr_num),a14
|
||
move @plyr_onfire,a0
|
||
;; cmp a14,a0
|
||
;; jrnz #nofire
|
||
btst a14,a0
|
||
jrz #nofire
|
||
|
||
;Stop fire circles under on fire alley oop jumper!
|
||
move @ballpnum,a0
|
||
cmp a14,a0
|
||
jrnz #nofire
|
||
|
||
move @tvpanelon,a0,L
|
||
jrnz #nofire
|
||
;Try turning on fire circles under player
|
||
.ref fire_circle
|
||
CREATE0 fire_circle
|
||
move a13,*a0(PA10),L
|
||
|
||
#nofire
|
||
|
||
|
||
|
||
rets
|
||
|
||
;LOOK!!!
|
||
#z_t .word CZMID+12,CZMID+8,CZMID,CZMID-8
|
||
.word CZMID-12,CZMID-8,CZMID,CZMID+8
|
||
.word CZMID+12
|
||
|
||
|
||
#*******************************
|
||
* Flash cameras in crowd
|
||
|
||
.ref gndpos_t
|
||
|
||
SUBR plyr_camflash
|
||
|
||
move @pup_court,a14
|
||
jrnz #die ;br=outdoor court, no camera flashes
|
||
|
||
movk 7,a0
|
||
callr rnd
|
||
addk 17,a0
|
||
move a0,a8
|
||
#lp CREATE0 plyr_cflsh
|
||
move a10,a10
|
||
jrz #nosnd
|
||
CREATE0 plyr_cflsh_snd
|
||
#nosnd
|
||
movk 4,a0 ;7
|
||
callr rnd
|
||
; addk 2,a0
|
||
addk 4,a0
|
||
calla PRCSLP
|
||
dsj a8,#lp
|
||
#die
|
||
DIE
|
||
|
||
plyr_cflsh_snd
|
||
movk 3,a0
|
||
callr rndrng0
|
||
sll 5,a0
|
||
addi flsh_t,a0
|
||
;FIX!!! Ugly camera flash snd
|
||
move *a0,a0,L
|
||
#s1 calla snd_play1
|
||
DIE
|
||
|
||
flsh_t .long flsh1_snd,flsh3_snd,flsh3_snd,flsh4_snd
|
||
|
||
|
||
plyr_cflsh
|
||
;Give flashes a tall y range
|
||
movi >96,a0
|
||
callr rndrng0
|
||
subi >69,a0
|
||
move a0,a2
|
||
|
||
movi 399,a0
|
||
callr rndrng0
|
||
move @WORLDTLX+16,a14
|
||
subi >2000-200,a14
|
||
add a14,a0
|
||
sll 16,a0 ;X
|
||
|
||
move a2,a1
|
||
sll 16,a1 ;Y
|
||
|
||
movi nflash1,a2
|
||
movi 290,a3
|
||
movi DMAWNZ|M_3DQ|M_NOCOLL|M_NOSCALE,a4
|
||
movi CLSDEAD,a5
|
||
clr a6
|
||
clr a7
|
||
calla BEGINOBJ2
|
||
movi gndpos_t,a1
|
||
move a1,*a8(ODATA_p),L
|
||
|
||
movi #f_l,a9
|
||
movk 1,a0
|
||
callr rnd
|
||
jrnz #1
|
||
movi #f2_l,a9
|
||
#1
|
||
SLEEPK 2
|
||
jauc FRQDELDIE
|
||
|
||
|
||
#f_l LW nflash2,2
|
||
LW nflash3,2
|
||
LW nflash3a,2
|
||
LW nflash3,2
|
||
LW nflash2,2
|
||
LWL0 nflash1,2
|
||
|
||
#f2_l LW nflash4,2
|
||
LW nflash5,1
|
||
LW nflash6,1
|
||
LW nflash5,1
|
||
LWL0 nflash4,2
|
||
|
||
|
||
#*******************************
|
||
* Sequence - slam ball through hoop (dunk)
|
||
* B4=*Next data in seq list
|
||
|
||
SUBR seq_slamball
|
||
|
||
|
||
move @ballpnum,a0
|
||
move *a13(plyr_num),a1
|
||
cmp a0,a1
|
||
jrne #x ;I don't have it?
|
||
|
||
movk 1,a0
|
||
move a0,@slamming
|
||
|
||
move @ballobj_p,a5,L
|
||
|
||
move *a5(OIMG),a1,L ;>Convert ball from player relative
|
||
move *a1(IANIOFFX),a1
|
||
sll 16,a1
|
||
move a1,*a5(OXANI),L
|
||
|
||
|
||
;Shawn, the ball isn't lined up for players scoring on left side of court
|
||
|
||
move *a13(plyr_ohoopx),a7 ;>Set ball over rim
|
||
; THE BALL WASN'T BEING PLACED IN THE MIDDLE OF THE RIM!!! (WHY?!?!?)
|
||
subk 9,a7
|
||
; subk 6,a7
|
||
|
||
; move *a13(plyr_seq),a0
|
||
; cmpi DUNKT6_SEQ,a0
|
||
; jrz #yes
|
||
|
||
movi 35,a0
|
||
calla RNDPER
|
||
jrls #noadjst
|
||
|
||
#yes
|
||
move *a13(plyr_num),a0
|
||
cmpi 2,a0
|
||
jrlt #nofix
|
||
addk 9,a7
|
||
; addk 1,a7
|
||
#nofix
|
||
subk 6,a7
|
||
|
||
#noadjst
|
||
|
||
move a7,*a5(OXPOS)
|
||
|
||
movi HOOPY-8,a14
|
||
move a14,*a5(OYPOS)
|
||
movi CZMID,a14
|
||
move a14,*a5(OZPOS)
|
||
|
||
; movk >1f,a0 ;3%
|
||
; callr rnd
|
||
; jrnz #dunknorm
|
||
|
||
movi 25,a0
|
||
calla RNDPER
|
||
jrls #dunknorm
|
||
;>Missed dunk
|
||
move *a13(plyr_ptsdown),a0
|
||
subk 2,a0
|
||
jrge #dunknorm ;I'm loosing by 5?
|
||
|
||
; move *a13(plyr_num),a0
|
||
; move @plyr_onfire,a14
|
||
; btst a0,a14
|
||
; jrnz #dunknorm
|
||
|
||
move @plyr_onfire,a14
|
||
;; jrnn #dunknorm
|
||
jrnz #dunknorm ;br=someone on-fire
|
||
|
||
SOUND1 missd1_snd
|
||
; SOUND1 boo1_snd
|
||
; SOUND1 cheer1_snd
|
||
|
||
movi >3ffff,a0
|
||
callr rnd
|
||
subi >20000,a0
|
||
move a0,a2
|
||
movi >1ffff,a0
|
||
callr rnd
|
||
addi >4000,a0
|
||
move *a13(plyr_num),a1
|
||
subk 2,a1
|
||
jrge #t2
|
||
neg a0
|
||
#t2 movi -GRAVB*40,a3 ;Up
|
||
jruc #setxyz
|
||
|
||
#dunknorm
|
||
|
||
;Only flash screen white if on fire...
|
||
move *a13(plyr_num),a14
|
||
move @plyr_onfire,a0
|
||
btst a14,a0
|
||
jrz #nofire
|
||
|
||
.ref flash_white
|
||
calla flash_white
|
||
#nofire
|
||
|
||
;Deliver a facial?
|
||
move *a13(plyr_o1dist),a0
|
||
cmpi 35*DIST_REDUCTION,a0
|
||
jrlt #dlvr
|
||
move *a13(plyr_o2dist),a0
|
||
cmpi 35*DIST_REDUCTION,a0
|
||
jrgt #nodlvr
|
||
#dlvr
|
||
move *a13(plyr_num),a0
|
||
cmpi 2,a0
|
||
jrlt #cktm2
|
||
;check tm1
|
||
|
||
; Start opponent on fire here!
|
||
|
||
move @plyrproc_t,a0,L
|
||
move *a0(plyr_stagcnt),a1
|
||
move @plyrproc_t+32,a2,L
|
||
move *a2(plyr_stagcnt),a2
|
||
add a2,a1
|
||
cmpi 13,a1
|
||
jrlt #nodlvr
|
||
jruc #dlv
|
||
#cktm2
|
||
move @plyrproc_t+64,a0,L
|
||
move *a0(plyr_stagcnt),a1
|
||
move @plyrproc_t+96,a2,L
|
||
move *a2(plyr_stagcnt),a2
|
||
add a2,a1
|
||
cmpi 13,a1
|
||
jrlt #nodlvr
|
||
#dlv
|
||
movi 350,a0
|
||
calla RNDPER
|
||
jrhi #nodlvr
|
||
.ref call_facial_speech
|
||
calla call_facial_speech
|
||
#nodlvr
|
||
|
||
CREATE0 #dunk_cheer
|
||
clr a0
|
||
clr a2
|
||
movi GRAVB*4,a3
|
||
#setxyz move a0,*a5(OXVEL),L
|
||
move a2,*a5(OZVEL),L
|
||
move a3,*a5(OYVEL),L
|
||
|
||
|
||
move *a8(OXVEL),a1,L
|
||
move *a8(OZVEL),a2,L
|
||
|
||
move *b4+,b0 ;Get # ticks we hang
|
||
move b0,a0
|
||
move a0,*a13(plyr_hangcnt)
|
||
subk 2,a0
|
||
jrlt #nohang
|
||
; move *a13(plyr_seq),a1
|
||
; cmpi DUNKX3_SEQ,a1
|
||
; jrnz #dck1
|
||
;;Align dunkkx3
|
||
; move *a8(OYPOS),a1
|
||
; addk 5,a1
|
||
; move a1,*a8(OYPOS)
|
||
; move *a8(OXPOS),a1
|
||
; move *a8(OXVEL),a2,L
|
||
; jrnn #fix1
|
||
; subi >2e,a1 ;2c
|
||
;#fix1 addi >16,a1
|
||
; move a1,*a8(OXPOS)
|
||
; jruc #fix2
|
||
;#dck1
|
||
; cmpi DUNKX_SEQ,a1
|
||
; jrnz #dck2
|
||
;;Align dunkkx
|
||
; move *a8(OYPOS),a1
|
||
; addk 9,a1
|
||
; move a1,*a8(OYPOS)
|
||
; move *a8(OXPOS),a1
|
||
; move *a8(OXVEL),a2,L
|
||
; jrnn #fix1a
|
||
; subi >2e,a1 ;2c
|
||
;#fix1a addi >18,a1
|
||
; move a1,*a8(OXPOS)
|
||
; jruc #fix2
|
||
;#dck2
|
||
; cmpi DUNKX2_SEQ,a1
|
||
; jrnz #dck3
|
||
;;Align dunkkx
|
||
; move *a8(OYPOS),a1
|
||
; subk 2,a1
|
||
; move a1,*a8(OYPOS)
|
||
; move *a8(OXPOS),a1
|
||
; move *a8(OXVEL),a2,L
|
||
; jrnn #fix1b
|
||
; subi >2e,a1 ;2c
|
||
;#fix1b addi >16,a1
|
||
; move a1,*a8(OXPOS)
|
||
; jruc #fix2
|
||
#dck3
|
||
|
||
#fix2
|
||
clr a1 ;0 velocity
|
||
clr a2
|
||
move a1,*a8(OYVEL),L
|
||
#nohang sra 1,a1
|
||
sra 1,a2
|
||
move a1,*a8(OXVEL),L
|
||
move a2,*a8(OZVEL),L
|
||
|
||
move *a13(plyr_num),a1
|
||
move a1,@ballpnumshot
|
||
move a1,@ballpnumlast
|
||
movi -1,a0
|
||
move a0,@ballpnum ;No owner
|
||
clr a0
|
||
move a0,@ballscorezhit
|
||
move a0,@ballrimhitcnt
|
||
move a0,@ballbbhitcnt
|
||
move a0,*a13(plyr_ownball)
|
||
movi TSEC+20,a0
|
||
move a0,*a13(plyr_shtdly)
|
||
|
||
rets
|
||
|
||
#x addk 16,b4
|
||
rets
|
||
|
||
*******************************
|
||
#dunk_cheer
|
||
SLEEPK 15
|
||
|
||
movk 8,a0
|
||
calla rndrng0
|
||
move a0,a8
|
||
sll 6,a8
|
||
addi #dunk_crwd_sp_tbl,a8
|
||
|
||
move *a8+,a0,L
|
||
calla snd_play1
|
||
SLEEPK 9
|
||
move *a8,a0,L
|
||
jrz #done
|
||
calla snd_play1
|
||
#done
|
||
SLEEP 5*60
|
||
clr a0
|
||
move a0,@slamming
|
||
DIE
|
||
|
||
|
||
#dunk_crwd_sp_tbl
|
||
.long cheer2_snd,0
|
||
.long cheer1_snd,0
|
||
.long cheer2_snd,0
|
||
.long cheer3_snd,0
|
||
.long cheer1_snd,cheer2_snd
|
||
.long cheer2_snd,0
|
||
.long cheer2_snd,cheer3_snd
|
||
.long cheer4_snd,cheer1_snd
|
||
.long cheer2_snd,0
|
||
|
||
; SOUND1 cheer1_snd
|
||
; SOUND1 cheer2_snd
|
||
;
|
||
; SLEEP 5*60
|
||
;
|
||
; clr a0
|
||
; move a0,@slamming
|
||
|
||
DIE
|
||
|
||
|
||
#*******************************
|
||
* Sequence - push opponent in front of me
|
||
|
||
SUBR seq_push
|
||
|
||
;We have to make the accuracy dependent upon ptsdown! Except when pushing
|
||
;my own teammate, then keep it easy.
|
||
|
||
PUSH a11
|
||
|
||
move *a13(plyr_dir),a3
|
||
|
||
move *a13(plyr_o1dist),a14
|
||
subi 50*DIST_REDUCTION,a14
|
||
jrgt #o1far ;Too far?
|
||
clr a5 ;O1
|
||
move *a13(plyr_o1dir),a2
|
||
sub a3,a2
|
||
abs a2
|
||
cmpi >40,a2
|
||
jrle #o1dsml
|
||
subi >80,a2
|
||
abs a2
|
||
#o1dsml subk 32,a2 ;16
|
||
jrlt #pusho ;In front of me?
|
||
|
||
#o1far
|
||
|
||
move *a13(plyr_o2dist),a14
|
||
subi 50*DIST_REDUCTION,a14
|
||
jrgt #o2far ;Too far?
|
||
movk 32,a5 ;O2
|
||
move *a13(plyr_o2dir),a2
|
||
sub a3,a2
|
||
abs a2
|
||
cmpi >40,a2
|
||
jrle #o2dsml
|
||
subi >80,a2
|
||
abs a2
|
||
#o2dsml subk 32,a2 ;16
|
||
jrlt #pusho
|
||
#o2far
|
||
|
||
;Checking for teammate also
|
||
|
||
move *a13(plyr_num),a14
|
||
move @PSTATUS,a0
|
||
btst a14,a0
|
||
jrz #x ;I am a stupid drone? Drones never
|
||
;push human teammate!
|
||
|
||
move *a13(plyr_tmdist),a14
|
||
subi 50*DIST_REDUCTION,a14
|
||
jrgt #x ;Too far?
|
||
movi -1,a5
|
||
move *a13(plyr_tmdir),a2
|
||
sub a3,a2
|
||
abs a2
|
||
cmpi >40,a2
|
||
jrle #tmdsml
|
||
subi >80,a2
|
||
abs a2
|
||
#tmdsml subk 16,a2
|
||
jrlt #push
|
||
jruc #x
|
||
|
||
;Make it harder to push team who is down by 5 or more pnts
|
||
;The CMOS game difficulty setting should also check this.
|
||
|
||
#pusho
|
||
|
||
;Fix up, make it harder, not impossible!
|
||
|
||
; move *a13(plyr_num),a0
|
||
; srl 1,a0
|
||
; sll 4,a0
|
||
; move a0,a1
|
||
; XORK 16,a1
|
||
; addi scores,a0
|
||
; move *a0,a0
|
||
; addi scores,a1
|
||
; move *a1,a1
|
||
; subk 5,a0
|
||
; cmp a0,a1
|
||
; jrge #push
|
||
;
|
||
;;Maybe ignore this successful push of an opponent (Teammate can always get it!)
|
||
;;50% of time
|
||
; movk 1,a0
|
||
; callr rnd
|
||
; jrz #x
|
||
|
||
#push
|
||
move @inbound,a0
|
||
jrnn #x
|
||
|
||
move *a13(plyr_num),a0 ;>Nail him
|
||
|
||
move a5,a5
|
||
jrnn #push_op ;Pushing opponent
|
||
|
||
XORK 1,a0 ;Get teammate
|
||
sll 5,a0
|
||
addi plyrproc_t,a0
|
||
jruc #get_prc
|
||
|
||
#push_op
|
||
|
||
; PUSH a0
|
||
; movi 100,a0
|
||
; calla RNDPER
|
||
; jrls #no_facial
|
||
; movi facial_snd,a0
|
||
; calla snd_play1
|
||
;#no_facial
|
||
; PULL a0
|
||
|
||
srl 1,a0
|
||
XORK 1,a0
|
||
sll 6,a0 ;*64
|
||
addi plyrproc_t,a0
|
||
add a5,a0
|
||
|
||
#get_prc
|
||
move *a0,a5,L ;A5=*O proc
|
||
|
||
move *a5(plyr_seqflgs),a14
|
||
; movi 300,a0
|
||
;% of time to ignore push if player is in layup sequence!
|
||
movi 500,a0
|
||
btst LAYUP_B,a14
|
||
jrnz #xz2
|
||
|
||
move *a5(plyr_seq),a14
|
||
cmpi SPIN_MOVE_SEQ,a14
|
||
jrz #xz ;br=push SPINNING dude 15% of time
|
||
cmpi ELBO_SEQ,a14
|
||
jrz #xz
|
||
cmpi ELBO2_SEQ,a14
|
||
jrz #xz
|
||
cmpi REBOUND_SEQ,a14
|
||
jrz #xz
|
||
cmpi REBOUNDA_SEQ,a14
|
||
jrnz #skpck
|
||
|
||
#xz
|
||
movi 150,a0 ;200
|
||
#xz2 ;Layups 30%
|
||
calla RNDPER
|
||
jrls #x ;br=nope
|
||
#skpck
|
||
|
||
move *a5(PA8),a2,L
|
||
move *a2(OYPOS),a0
|
||
move *a8(OYPOS),a1
|
||
sub a0,a1
|
||
|
||
cmpi >54,a1 ;>60,5c,58
|
||
jrgt #x ;Too far above me?
|
||
|
||
;player pushed speech here
|
||
|
||
|
||
move *a13(plyr_num),a14
|
||
move @pup_maxpower,a0
|
||
btst a14,a0
|
||
jrz #nochng
|
||
;This guy has max power! Don't knock him down!
|
||
movk 9,a3
|
||
jruc #maxp
|
||
#nochng
|
||
move *a13(plyr_attrib_p),a0,L
|
||
move *a0(PAT_POWER),a3
|
||
#maxp
|
||
move a3,@last_power ;For later analysis
|
||
|
||
move *a13(plyr_dir),a0
|
||
move a0,a1
|
||
addi >40,a1
|
||
sll 32-7,a1
|
||
srl 32-7,a1
|
||
move a1,*a5(plyr_newdir)
|
||
callr sinecos_get
|
||
|
||
sll 4,a0 ;*128
|
||
sll 4,a1
|
||
|
||
move *a5(plyr_attrib_p),a14,L
|
||
move *a14(PAT_POWER),a14
|
||
sub a3,a14
|
||
move a14,a3
|
||
cmpi 6,a14
|
||
|
||
;If the pusher is smaller than pushee, fly
|
||
;back just a short distance.
|
||
|
||
jrge #shortfal
|
||
|
||
sll 2,a0 ;*128
|
||
sll 2,a1
|
||
jruc #sh1
|
||
#shortfal
|
||
PUSH a0,a1
|
||
SOUND1 push1_snd
|
||
PULL a0,a1
|
||
#sh1
|
||
move a0,a11
|
||
move a0,*a2(OZVEL),L
|
||
move a1,*a2(OXVEL),L
|
||
move *a5(plyr_jmpcnt),a0
|
||
jrnz #injmp2
|
||
movk 1,a0
|
||
move a0,*a5(plyr_jmpcnt)
|
||
#injmp2
|
||
movi -GRAVB*11,a0 ;Up ;19
|
||
; movi -GRAVB*18,a0 ;Up ;19
|
||
move @HCOUNT,a14
|
||
andi 07,a14
|
||
jrnz #notlow
|
||
movi -GRAVB*9,a0 ;Up
|
||
; movi -GRAVB*14,a0 ;Up
|
||
#notlow
|
||
move a0,*a2(OYVEL),L
|
||
#injmp
|
||
movk 32,a0
|
||
cmpi 7,a3
|
||
jrlt #notsml
|
||
|
||
movi 650,a0
|
||
calla RNDPER
|
||
jrhi #notsml
|
||
|
||
;35% of time, do small push away
|
||
; move @HCOUNT,a3
|
||
; btst 0,a3
|
||
; jrz #notsml
|
||
|
||
movi -GRAVB*7,a0 ;7
|
||
; movi -GRAVB*8,a0 ;7
|
||
move a0,*a2(OYVEL),L
|
||
movk 16,a0 ;16
|
||
#notsml
|
||
|
||
move *a5(plyr_num),a14
|
||
move @pup_maxpower,a1
|
||
btst a14,a1
|
||
jrz #nochng1
|
||
;This guy has max power! Don't knock him down!
|
||
movi -GRAVB*7,a0 ;7
|
||
; movi -GRAVB*8,a0 ;7
|
||
move a0,*a2(OYVEL),L
|
||
move *a2(OZVEL),a0,L
|
||
sra 2,a0
|
||
move a0,*a2(OZVEL),L
|
||
move *a2(OXVEL),a0,L
|
||
sra 2,a0
|
||
move a0,*a2(OXVEL),L
|
||
|
||
SOUND1 push1_snd
|
||
|
||
movk 16,a0
|
||
move @HCOUNT,a1
|
||
btst 0,a1
|
||
jrz #nochng1
|
||
movk 24,a0 ;16
|
||
#nochng1
|
||
move a0,*a5(plyr_stagcnt)
|
||
|
||
move @ballpnum,a0
|
||
move *a5(plyr_num),a1
|
||
cmp a0,a1
|
||
jrne #nobl ;Doesn't have ball?
|
||
|
||
;Sometimes have pushed player keep ball!
|
||
|
||
movk PS_STEALS,a0
|
||
move *a13(plyr_num),a1
|
||
calla inc_player_stat
|
||
move @my_ballpnumlast,a1
|
||
jrn #noown3
|
||
movk PS_TURNOVERS,a0
|
||
calla inc_player_stat
|
||
#noown3
|
||
|
||
move @ballprcv_p,a0,L
|
||
jrz #ok_ball
|
||
;Messing with ball vels but pass has gotten triggered?
|
||
; .if DEBUG
|
||
; LOCKUP
|
||
; .endif
|
||
clr a0
|
||
move a0,@ballprcv_p,L
|
||
|
||
callr flash_ball
|
||
SOUND1 steal_snd
|
||
SOUND1 swat_snd
|
||
; callr get_swat
|
||
|
||
;Fall thru...
|
||
; jruc #nobl
|
||
#ok_ball
|
||
|
||
move @ballobj_p,a4,L
|
||
movi >1ffff,a2 ;>Give rnd velocity
|
||
movi >10000,a3
|
||
move a2,a0
|
||
callr rnd
|
||
sub a3,a0
|
||
move a0,*a4(OXVEL),L
|
||
move a2,a0
|
||
callr rnd
|
||
sub a3,a0
|
||
|
||
;If pushed over scorers table, have ball drift down screen
|
||
|
||
move *a5(plyr_num),a14
|
||
sll 5,a14
|
||
addi plyrobj_t,a14
|
||
move *a14,a14,L
|
||
move *a14(OZPOS),a1
|
||
cmpi >410,a1
|
||
jrgt #not_rear
|
||
|
||
movi 40,a0
|
||
move a0,*a5(plyr_shtdly) ;can't scoop up ball
|
||
|
||
clr a0
|
||
move a0,@ballbbhitcnt
|
||
not a0 ;=-1
|
||
move a0,@ballpnum
|
||
move a0,@ballpnumlast
|
||
|
||
movi [2,0],a0
|
||
#not_rear
|
||
move a0,*a4(OZVEL),L
|
||
|
||
;Make sure owner is losing ball!
|
||
; move @ballpnum,a0
|
||
; jrn #nobl
|
||
; movi -1,a0
|
||
; move a0,@ballpnum ;a14
|
||
|
||
#nobl
|
||
move *a5(plyr_num),a14
|
||
sll 5,a14
|
||
addi plyrobj_t,a14
|
||
move *a14,a14,L
|
||
move *a14(OZPOS),a1
|
||
cmpi >410,a1
|
||
jrgt #not_rear2
|
||
|
||
move a11,a11
|
||
jrnn #not_rear2
|
||
|
||
move *a5(plyr_ownball),a0
|
||
jrle #not_rear2 ;br=hey, i dont have ball
|
||
SOUND1 into_stnd_sp
|
||
|
||
#not_rear2
|
||
|
||
move *a13(plyr_num),a0 ;If on fire, don't use turbo on push
|
||
move @plyr_onfire,a1
|
||
;; cmp a0,a1
|
||
;; jrz #x
|
||
btst a0,a1
|
||
jrnz #x ;br=plyr on-fire
|
||
|
||
move *a13(plyr_PDATA_p),a2,L
|
||
move *a2(ply_turbo),a1
|
||
subk (TURBO_CNT*2)/13,a1 ;!!! Min cnt for push
|
||
jrge #clrbl
|
||
clr a1
|
||
#clrbl
|
||
move a1,*a2(ply_turbo)
|
||
sll 5,a1
|
||
.ref TURBO_52
|
||
addi TURBO_52,a1
|
||
move *a2(ply_meter_imgs+32),a0,L
|
||
move *a1(0),*a0(OSAG),L
|
||
|
||
#x PULL a11
|
||
rets
|
||
|
||
; subk 7,a1
|
||
; move a1,*a2(ply_turbo)
|
||
; move *a2(ply_meter_imgs+40h),a0,L
|
||
; move *a0(OFSET),a1 ;Shrink meter
|
||
; addk 7,a1
|
||
; move a1,*a0(OFSET)
|
||
;
|
||
; jruc #x
|
||
;
|
||
;#clrbl
|
||
; move *a13(plyr_PDATA_p),a2,L
|
||
; move *a2(ply_turbo),a14
|
||
; clr a0
|
||
; move a0,*a2(ply_turbo)
|
||
; move *a2(ply_meter_imgs+40h),a0,L
|
||
; move *a0(OFSET),a1 ;Shrink meter
|
||
; add a14,a1
|
||
; move a1,*a0(OFSET)
|
||
;
|
||
;
|
||
;#x PULL a11
|
||
; rets
|
||
|
||
|
||
#*******************************
|
||
* Sequence - elbo opponents around me
|
||
|
||
SUBR seq_elbo
|
||
|
||
move *a13(plyr_num),a4
|
||
srl 1,a4
|
||
XORK 1,a4
|
||
sll 6,a4 ;*64
|
||
addi plyrproc_t,a4
|
||
|
||
move *a13(plyr_o1dist),a14
|
||
subi 40*DIST_REDUCTION,a14
|
||
jrge #o1far ;Too far?
|
||
|
||
move @HCOUNT,a14
|
||
btst 0,a14
|
||
jrz #o1far ;Skip? (50%)
|
||
|
||
move *a4,a5,L ;A5=*O proc
|
||
move *a13(plyr_o1dir),a0
|
||
callr #elbo
|
||
#o1far
|
||
|
||
move *a13(plyr_o2dist),a14
|
||
subi 40*DIST_REDUCTION,a14
|
||
jrge #x ;Too far?
|
||
|
||
move @HCOUNT,a14
|
||
btst 0,a14
|
||
jrz #x ;Skip? (50%)
|
||
|
||
addk 32,a4
|
||
move *a4,a5,L ;A5=*O proc
|
||
move *a13(plyr_o2dir),a0
|
||
callr #elbo
|
||
|
||
#x rets
|
||
|
||
|
||
#elbo
|
||
move *a5(PA8),a2,L ;>Make opponent fly
|
||
|
||
move a0,a1
|
||
addi >40,a1
|
||
sll 32-7,a1
|
||
srl 32-7,a1
|
||
move a1,*a5(plyr_newdir)
|
||
callr sinecos_get
|
||
|
||
;Possibly elbos toss should be shorter?
|
||
sll 5,a0 ;*32
|
||
sll 5,a1
|
||
move a0,*a2(OZVEL),L
|
||
move a1,*a2(OXVEL),L
|
||
move *a5(plyr_jmpcnt),a0
|
||
jrnz #injmp
|
||
movk 1,a0
|
||
move a0,*a5(plyr_jmpcnt)
|
||
movi -GRAVB*9,a0 ;Up 15
|
||
; movi -GRAVB*12,a0 ;Up 15
|
||
move a0,*a2(OYVEL),L
|
||
|
||
move *a5(plyr_num),a14
|
||
move @pup_maxpower,a1
|
||
btst a14,a1
|
||
jrz #injmp
|
||
;This guy has max power! Don't knock him down!
|
||
movi -GRAVB*7,a0 ;7
|
||
; movi -GRAVB*8,a0 ;7
|
||
move a0,*a2(OYVEL),L
|
||
movk 24,a0 ;16
|
||
move @HCOUNT,a1
|
||
btst 0,a1
|
||
jrz #ko
|
||
movk 16,a0 ;16
|
||
#ko
|
||
move a0,*a5(plyr_stagcnt)
|
||
rets
|
||
|
||
#injmp
|
||
movk 32,a0
|
||
move a0,*a5(plyr_stagcnt)
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
; a8 = * ball object
|
||
; a11 = hoop x
|
||
|
||
.asg 22,DIAM
|
||
.asg PDATA,GAME_QTR
|
||
|
||
SUBRP no_good_check
|
||
|
||
move @gmqrtr,a0
|
||
move a0,*a13(GAME_QTR)
|
||
|
||
#loop
|
||
SLEEPK 1
|
||
|
||
move @game_time,a0,L ;If at beginning of qrtr, no speech!
|
||
cmpi >2050400,a0 ;!!!
|
||
jrgt #snuffit
|
||
|
||
move @gmqrtr,a0
|
||
move *a13(GAME_QTR),a1
|
||
cmp a0,a1 ;If not in same qrtr, no speech!
|
||
jrne #snuffit
|
||
|
||
move *a8(OYPOS),a0 ;Ball Y in range? No if >
|
||
cmpi HOOPY+15,a0
|
||
jrgt #no_good
|
||
|
||
move *a8(OXPOS),a0 ;Calc delta X for ball to hoop
|
||
move *a8(OXANI+10h),a1
|
||
add a1,a0
|
||
sub a11,a0
|
||
abs a0
|
||
subk DIAM,a0 ;Ball X in range? No if >
|
||
jrgt #no_good
|
||
|
||
move *a8(OZPOS),a0 ;Calc delta Z for ball to hoop
|
||
subi CZMID,a0
|
||
abs a0
|
||
subk DIAM,a0 ;Ball Z in range? No if >
|
||
jrgt #no_good
|
||
|
||
jruc #loop
|
||
|
||
#no_good
|
||
calla nogood_speech
|
||
|
||
#snuffit
|
||
DIE
|
||
|
||
******************************************************************************
|
||
.end
|
||
|
||
|
||
|