nba-jam-tournament-edition/PLYR.ASM

9222 lines
153 KiB
NASM
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

**************************************************************
*
* Software: Shawn Liptak, Mark Turmell
* Initiated: 9/17/92
*
* Modified: Shawn Liptak, 9/17/92 -Split from BB.asm
*
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 3/24/93 16:21
**************************************************************
.file "plyr.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 "mac2.asm"
.include "imgtbl.glo"
.include "imgtbl2.glo"
.include "game.equ"
.include "shawn.hdr" ;Macros
.asg 0,SEQT
.include "plyr.equ"
;sounds external
baddec_snd .word >f990,72,>81b7,0 ;bad decision <--change!
win_snd .word >f3ff,>8,>80a5,0 ;Winner snd
;swipe_snd .word >f484,>4,>8119,0 ;swipe at ball
swat_snd .word >fd94,15,>8157,0 ;Swat ball (Steals & blocks)
steal_snd .word >fbf7,>8,>8093,0 ;Steal
sqk1_snd .word >f584,>4,>8114,0 ;Sneaker squeek
sqk2_snd .word >f584,>4,>8115,0
sqk3_snd .word >f584,>4,>8116,0
sqk4_snd .word >f584,>4,>8117,0
airball_snd .word >f894,>38,>814d,0 ;crowd screams "air ball"
pass_snd .word >f3a7,>8,>808c,0 ;short pass
whstle_snd .word >f9f5,>30,>8148,0 ;Ref whistle at game start
;whstle2_snd .word >f9f5,>30,>8148,0 ;Ref whistle for fouls
tuneend_snd .word >f3ff,>8,>8003,0 ;End game time tune
;tuneend_snd .word >f3ff,>8,>8009,0 ;End game time tune
tuneend1_snd .word >f3ff,>8,>800a,0 ;End quarter 1 tune
tunehalf_snd .word >f3ff,>8,>8004,0 ;Half time tune
anncr1_snd .word >f9f6,120,>818e,0 ;He shoots from downtown
anncr2_snd .word >f9f6,110,>8190,0 ;He shoots from the outside
anncr4_snd .word >f9f6,80,>8183,0 ;At the buzzer
anncr5_snd .word >f9f6,70,>818b,0 ;From long range
;deflectd .word >f991,40,>81a9,0 ;deflected
fball_snd .word >fcb0,40,>8179,0 ;Fire ball launch
overtime_snd .word >f9ff,69,>8180,0 ;overtime!
rainbow_snd .word >f1a0,99,>81f0,0 ;Rainbow
;symbols externally defined
.ref p1taps
.ref fatality
.ref seq_stopfire
.ref brick_count
.ref last_power
.ref qtr_purchased
.ref call_scores
.ref last_name_time
.ref plyrnumonfire
.ref pushed_speech
.ref grand_champs_screen
.ref show_hiscore
.ref speech_playovrp
.ref rebound_delay
.ref def_play_reward,flash_reward,sinecos_get,slamming
.ref start_animate,pass_off,steals_off,idiot_box
.ref GET_ADJ
.ref pass_to_speech
.ref shoots_speech
.ref shot_type,shot_percentage,shot_distance
.ref rejected_dnk_speech
.ref plyr_getattributes,snd_play1ovr
.ref scores,prt_top_scores
.ref score_add,score_showtvpanel2
.ref score_showtvpanel,tvpanelon
.ref gmqrtr
.ref clock_active
.ref crplate_ptr
.ref shot_clock,shotimer
.ref arw_on1plyr
.ref pushing_delay
.ref cntrs_delay
.ref game_time
.ref sc_proc
.ref stick_number
.ref doalert_snd
.ref flash_bigtxt
.ref player_data
.ref inc_player_stat
.ref stats_page,hint_page
.ref stats_page2
.ref rank_screen
; .ref result_screen
.ref save_player_records
.ref game_purchased
.ref team1,team2
.ref show_ot_msg,scr1
.ref winner_stays_on
.ref print_string_C2
.ref mess_objid
.ref setup_message
.ref omlgmd_ascii
.ref pal_clean
.ref pal_getf,pal_set
.ref fade_down_half,fade_up_half
.ref SCRTST
.ref IRQSKYE
.ref PCNT
.ref GAMSTATE,HALT
.ref gndx
.ref AUD,AUD1,GET_AUD,STORE_AUDIT
.ref PSTATUS2
.ref RNDPER
.ref game_over
.ref TWOPLAYERS
.ref scale63_t
.ref ball_convfmprel
.ref ballobj_p
.ref ballpnum,ballpnumlast,ballpnumshot,ballfree
.ref ballrimhitcnt,ballbbhitcnt
.ref ballpasstime
.ref ballscorezhit
.ref ballptsforshot
.ref ballprcv_p
.ref ballgoaltcnt
.ref ballsclastp
.ref inbound
.ref ballflash
.ref t1dunkcnt
.ref plyr_setptsdown
.ref halftime_showclips
.ref plyr_smoketrail
.ref drone_main,drone_adjskill
.ref drone2on
.ref w3run1
;symbols defined in this file
;uninitialized ram definitions
.bss reduce_3ptr,16
BSSX kp_scores ,32
BSSX kp_team1 ,16
BSSX kp_team2 ,16
BSSX pleasewt ,16
BSSX PSTATUS ,16 ;Player in game bits (0-3)
;/Must be in order!
BSSX P1CTRL ,16 ;P1 joy/but bits (0-3=UDLR, 4-6=B1-B3)
BSSX P2CTRL ,16 ;P2 (^ 8-14 are on for a on transition
BSSX P3CTRL ,16 ;P3 of 0-6)
BSSX P4CTRL ,16 ;P4
BSSX P1DATA ,PDSIZE ;Player 1 data
BSSX P2DATA ,PDSIZE ;P2
BSSX P3DATA ,PDSIZE ;P3
BSSX P4DATA ,PDSIZE ;P4
.bss pld ,PLDSZ*4 ;Player secondary data
BSSX plyrobj_t ,32*4 ;*player obj (4)
BSSX plyrproc_t ,32*4 ;*player process (4)
BSSX plyrcharge ,16 ;!0=Dunker rammed an opponent
BSSX plyrpasstype ,16 ;!0=Turbo pass
BSSX plyrairballoff ,16 ;!0=No airball sound
BSSX plyrbighead ,16 ;Bit 0-3 on = plyr 0-3 has big head
BSSX stlpower ,16 ;Bit 0-3 on = plyr 0-3 has stl power
.bss plyrinautorbnd ,16 ;!0=A plyr is in auto rebound
; .bss drnzzcnt ,16 ;Drone zigzag mode cntdn
; .bss drnzzmode ,16 ;Drone zigzag mode (0-?)
BSSX plyrpals_t ,256*16*4 ;Assembled palette for each plyr
BSSX assist_delay ,16
BSSX assist_plyr ,16
BSSX kp_qscrs ,128 ;Keep scores during game play
BSSX kp_qscrs2 ,128 ;Keep scores for attract mode
BSSX baby_flag ,16 ;Flag for baby size mode
BSSX strongmen ,16 ;Grnd champ flag 0,1 or 2 for team #
;equates for this file
PLYRMINX .equ WRLDMID-337 ;342
PLYRMAXX .equ WRLDMID+337-9 ;342-9
PLYRMINX2 .equ WRLDMID-370
PLYRMAXX2 .equ WRLDMID+370
STRUCTPD
WORD ball_anix ;X anipt offset
WORD ball_aniy ;Y ^
APTR ball_ani1st_p ;*1st ani_l pos
APTR ball_ani_p ;*Current ani_l pos
WORD ball_zsznum ;Z size # 0-?
WORD ball_collcnt ;# of collisions in a row
; LONG ball_oldx ;Last good X before collision
; LONG ball_oldy ;^ Y
; LONG ball_oldz ;^ Z
WORD ball_xscrllmin ;
WORD ball_xscrllmax ;
WORD ball_onfire ;!0=Flaming
WORD ball_numforfire ;# of consecutive pts to be hot
.text
********************************
* Start player processes
SUBR plyr_start
; movk 1,a0
; move a0,@>fff80000,L
callr joy_read2
clr a0
move a0,@plyrinautorbnd
move a0,@plyrcharge
move a0,@plyrairballoff
move a0,@stlpower
move a0,@strongmen ;Grand champion playing flag
movk 1,a2
.ref player1_data
.ref player2_data
.ref player3_data
.ref player4_data
movk 1,a3
move @player1_data+PR_TEAMSDEF,a0,L
cmpi >7ffffff,a0
jrz #easy0
move @player2_data+PR_TEAMSDEF,a0,L
cmpi >7ffffff,a0
jrz #easy0
movk 2,a3
move @player3_data+PR_TEAMSDEF,a0,L
cmpi >7ffffff,a0
jrz #easy0
move @player4_data+PR_TEAMSDEF,a0,L
cmpi >7ffffff,a0
jrnz #nea
#easy0 move a3,@strongmen ;Grand champion playing flag
jruc #easy
#nea
clr a2
movk ADJDIFF,a0 ;Get difficulty level
calla GET_ADJ
subk 3,a0
jrle #regdrn
movk 1,a2
#regdrn
move @PSTATUS,a0
cmpi 1,a0
jrz #hard
cmpi 2,a0
jrz #hard
cmpi 4,a0
jrz #hard
cmpi 8,a0
jrnz #easy
#hard
movi 200,a0
calla RNDPER
jrhi #easy
movk 1,a2 ;Give hard drones 70% of time
#easy move a2,@drone2on
; move @plyrbighead,a0
; zext a0
; cmpi >eaea,a0
; jrnz #no_3d
; movk >f,a2
; move a2,@stlpower
; jruc #adjoff
;#no_3d
clr a2
movk ADJHEADSZ,a0 ;Get head size
calla GET_ADJ ;1-2
subk 1,a0
jrle #adjoff ;No big heads?
movk >f,a2
#adjoff
move a2,@plyrbighead
CREATE0 plyr_referee
movi plyrproc_t+4*32,a2
movi plyrobj_t+3*32,a9
movk 3,a8
#strtp CREATE0 plyr_main
move a0,-*a2,L ;Save *proc
subk 32,a9
dsj a8,#strtp
move a13,-*a2,L
; jruc plyr_main ;#0
#*******************************
* Main player control code (Process)
* A8=Plyr # (0-3)
* A9=*plyrobj_t for plyr #
SUBRP plyr_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 a8,a0 ;>Chk if plyr wants to override headsize
sll 4,a0 ;*16
addi P1CTRL,a0
move *a0,a0
sll 32-7,a0
srl 32-7,a0
; cmpi BUT3_M|BUT2_M|BUT1_M|JOYD_M,a0
cmpi BUT1_M|JOYD_M,a0 ;Shoot down, jostick down
jrne #nostl
move a8,a0
sll 4,a0
addi p1taps,a0
move *a0,a0
cmpi 5,a0
jrlt #nostl
move @stlpower,a0 ;Powerup intercepts (Quick hands)
movk 1,a14
sll a8,a14
xor a14,a0 ;Flip bit
move a0,@stlpower
#nostl
cmpi BUT3_M|BUT2_M|JOYU_M,a0
jrne #nohdcng
move @plyrbighead,a0
movk 1,a14
sll a8,a14
xor a14,a0 ;Flip bit
move a0,@plyrbighead
#nohdcng
movi -1,a1
move a1,*a13(plyr_newdir)
movk 1,a0
move a0,*a13(plyr_shtbutn)
movk 30,a0
move a0,*a13(plyr_turndelay)
move a8,*a13(plyr_num)
move a8,a11
movk 1,a7
xor a8,a7
sll 5,a7 ;*32
addi plyrproc_t,a7
move *a7,a7,L
move a7,*a13(plyr_tmproc_p),L
movi P2DATA-P1DATA,a7,W
mpyu a8,a7
addi P1DATA,a7
move a7,*a13(plyr_PDATA_p),L
calla plyr_getattributes ;Set attribute_p
;A10=*Uniform attr (ignores spechds)
movi #pd1-#pdat_t,a7,W
mpyu a8,a7
addi #pdat_t,a7
move *a7+,a0
move a0,*a13(PROCID)
move *a7+,a1 ;Dir
move a1,*a13(plyr_dir)
move *a7+,a0 ;X
move @WORLDTLX+16,a1
add a1,a0
move @gmqrtr,a3
jrz #not2
addi 400,a0
#not2
sll 16,a0
clr a1 ;Y
move *a7+,a3 ;Z
move *a7,a2,L
movi DMAWNZ|M_3D,a4
movi CLSPLYR|TYPPLYR,a5
clr a6
clr a7
calla BEGINOBJ2
move a8,*a9,L ;Save *obj
movi scale63_t,a0 ;Temp size
move a0,*a8(ODATA_p),L
SLEEPK 2 ;Wait for other plyrs init
move *a13(plyr_attrib_p),a7,L
move a10,a6
move *a7,a0,L ;Get *scale_t
move a0,*a8(ODATA_p),L
move *a7(PAT_BVEL),a0
move a0,*a13(plyr_bvel)
;--
move *a7(PAT_SKILL),a0
move @PSTATUS,a1
btst a11,a1
jrnz #hmn ;I'm a human?
movk 1,a14 ;Drone
xor a11,a14
btst a14,a1
jrz #tdrn ;Teammate is a drone?
#hmn
; movk 2,a14 ;Human
; xor a11,a14
; sll 5,a14 ;*32
; addi plyrproc_t,a14
; move *a14,a14,L
clr a0
jruc #setskl
#tdrn
movk 2,a14 ;We are drones
xor a11,a14
btst a14,a1
jrnz #humop ;Human opponent?
movk 1,a2
xor a2,a14
btst a14,a1
jrz #setskl ;All drones?
#humop
sll 5,a14
addi player_data,a14
move *a14,a14,L
movk 6,a2
move *a14(PR_COUNT),a1 ;- if no entry
jrn #wimp
move *a14(PR_NUMDEF),a2 ;# teams defeated
subk 10,a2
jrlt #few
move a2,@drone2on
#few
movk 4,a2 ;3
subk 4,a1
jrle #wimp ;1st couple of games?
movk 1,a2
#wimp
sub a2,a0
move *a14(PR_WINSTREAK),a1
jrnz #won ;Won last game?
subk 4,a0 ;4 Decrease skill
#won
#setskl move a0,*a13(plyr_d_skill)
;--
movi team1,a14 ;>Chk for conflicting pals
move *a14+,a3
move *a14,a4
btst 1,a11
jrz #t1
SWAP a3,a4
#t1 sll 3,a3
sll 3,a4
addi #team_t,a3
addi #team_t,a4
movb *a3,a3
jrn #keepc ;I always keep?
movb *a4,a4
move a4,a14
sll 32-4,a3
sll 32-4,a14
cmp a3,a14
jrne #keepc ;Different colors?
move a4,a4
jrn #altc ;Other team always keeps?
btst 1,a11
jrnz #keepc ;2nd team?
#altc addk 32,a6 ;*Alternates
#keepc
move a11,a2 ;>Build plyr palette
sll 8+4,a2
addi plyrpals_t,a2
PUSH a2
movi 255,a0
move a0,*a2+ ;Set # colors
;Check for special pals
move *a7(PAT_SHOTSKILL),a1
;.asg 1201,SHT11 ;MK SPECIAL FLAG
cmpi 1201,a1
jrnz #reg
;Stay with defined pals!
move a7,a6
#reg
move *a6(PAT_PALU_p),a1,L ;Copy uniform
move *a1+,a0
#plulp move *a1+,*a2+
dsj a0,#plulp
move *a7(PAT_PALF_p),a1,L ;Copy flesh
move *a1+,a0
addk 16,a1
subk 1,a0
#plflp move *a1+,*a2+
dsj a0,#plflp
move *a6(PAT_PALT_p),a1,L ;Copy trim
move *a1+,a0
addk 16,a1
subk 1,a0
#pltlp move *a1+,*a2+
dsj a0,#pltlp
movi 31<<10+31<<5+31,a0 ;White
move a0,*a2+
movi ltshoepal_t,a1 ;Copy shoes
; btst 0,a11
; jrz #p02
; movi dkshoepal_t,a1
;#p02
movk 5,a0 ;5 colors
#plslp move *a1+,*a2+
dsj a0,#plslp
clr a0 ;Black
move a0,*a2+
PULL a0
calla pal_getf
move a0,*a8(OPAL)
PUSH a8
clr a0 ;>Get head
clr a1
move *a7(PAT_HEADT_p),a2,L
move *a2,a2,L
movi CZMID,a3 ;Z
movi DMAWNZ|M_3D|M_NOCOLL,a4
movi CLSDEAD,a5
clr a6
clr a7
calla BEGINOBJ2
move a8,*a13(plyr_headobj_p),L
move *a13(plyr_attrib_p),a0,L
move *a0,a0,L ;Get *scale_t
;MJT
; addi SCALETSIZE*2,a0
addi SCALETSIZE*2+100h,a0
;Do multiple levels of bighead
move *a13(plyr_num),a1
move @plyrbighead,a2
btst a1,a2
jrz #smlhd
sll 4,a1
addi p1taps,a1
move *a1,a1
cmpi 6,a1
jrz #bighd2
subi SCALETSIZE*1+200h,a0
jruc #smlhd
#bighd2 subi >a80,a0 ;Really big head
; addi SCALETSIZE,a0
#smlhd
move a0,*a8(ODATA_p),L
clr a0 ;>Get shadow
clr a1
movi shadow1,a2
move *a8(OZPOS),a3
subi 50,a3
movi DMAWNZ|M_3D|M_SHAD|M_NOCOLL,a4
calla BEGINOBJ2
move a8,*a13(plyr_shadobj_p),L
movi 50,a0
move a0,*a8(OMISC) ;Z offset
PULL a8
; .if DEBUG
; callr plyr_getgndaligndot
; .endif
clr a0
movi PLDSZ,a9
mpyu a11,a9
addi pld,a9 ;A9=*Plyr secondary data struc
move a9,a1
movi PLDSZ/16,b0
#cpldlp move a0,*a1+
dsj b0,#cpldlp
sll 4,a11 ;*16
addi P1CTRL,a11 ;A11=*PxCTRL
move a0,*a11
movk STND_SEQ,a0 ;Initial sequence
move *a13(plyr_num),a14
jrz #pn03
subk 3,a14
jrge #pn03
move @gmqrtr,a14
jrnz #pn03
movi TIP_SEQ,a0
#pn03
move *a13(plyr_dir),a7
callr plyr_setseq ;Rets: A10=Ani cntdn
movi HOOPLX,a0
movi HOOPRX,a1
move *a13(plyr_num),a14
subk 2,a14
jrlt #_p0or1
SWAP a0,a1
#_p0or1 move a0,*a13(plyr_myhoopx)
move a1,*a13(plyr_ohoopx)
; move *a13(plyr_num),a0 ;DEBUG
; subk 2,a0
; jreq #num2
; SLEEP 30000
;#num2
SLEEPK 2 ;Wait for others to establish data
;---------------------------
#lp
move @HALT,a0
jrnz #halted
;MJT
clr a9
.if IMGVIEW
move *a13(plyr_num),a0
cmpi 0,a0
jrz #yes
cmpi 3,a0
jrne #halted
#yes
movk 1,a2 ;+=Me
jruc #nobl2
.endif
;This could be a dipswitch setting for our home games
;FIX
; move @DIPSWITCH,a0
; btst 0,a0 ;UJ2 switch 8
; jrnz #notfair ;OFF?
; clr a0
; move a0,*a13(plyr_ptsdown)
;#notfair
clr a2 ;>Set flag if we have ball
move *a13(plyr_num),a0
move @ballpnum,a1
cmp a1,a0
jrne #nobl1 ;No ball?
move *a13(plyr_seqflgs),a14
btst NOBALL_B,a14
jrnz #nohold ;Can't hold the ball?
move *a13(plyr_ownball),a0
jrgt #hadball ;Already had?
move @ballobj_p,a1,L
move *a1(OYPOS),a0
cmpi -28,a0
jrlt #yesair
move *a1(OYVEL),a0,L
abs a0
cmpi >c000,a0
jrlt #notinair
#yesair
move @rebound_delay,a0
jrz #inair
clr a0
move a0,@rebound_delay
move @inbound,a0
jrnn #inair
;Ball in air, give player a rebound
movi PS_OFF_REB,a0
move *a13(plyr_num),a1
move @ballpnumlast,a14
srl 1,a1
srl 1,a14
cmp a1,a14
jrz #offrb
movi PS_DEF_REB,a0
#offrb
move *a13(plyr_num),a1
calla inc_player_stat
jruc #inair
#notinair
move *a13(plyr_jmpcnt),a0
jrnz #nohold ;In air?
calla seq_stopfire
movi PICKUP_SEQ,a0
move *a13(plyr_dir),a7
callr plyr_setseq
#inair movk 1,a2 ;+=Me
jruc #nobl2
#nohold
subk 1,a2 ;-1
move a2,@ballpnum
move a2,@ballpnumlast
calla ball_convfmprel
clr a2
jruc #nobl2
#nobl1
XORK 1,a0
cmp a1,a0
jrne #nobl2 ;No ball?
subk 1,a2 ;-=Teammate
#nobl2
move a2,*a13(plyr_ownball)
move a2,a2
jrle #hadball
PUSH a10
move a13,a10
calla arw_on1plyr ;Guy who picks up ball gets arw
PULL a10
move *a13(plyr_num),a0
srl 1,a0 ;A0=0/1 for left/rgt hoop start clock
move @ballsclastp,a1
srl 1,a1
cmp a0,a1
jreq #hadball ;Same team?
calla shot_clock ;New 24
#hadball
clr a0 ;>Setup turbo flag
move *a13(plyr_nojoy),a6
jrn #newjoy ;Override plyr input?
move *a11,a6
#newjoy btst BUT3_B,a6 ;Turbo but
jrz #turboff
move *a13(plyr_PDATA_p),a1,L
move *a1(ply_turbo),a1
jrz #turboff ;No turbo left?
movk 1,a0
#turboff
move a0,*a13(plyr_turbon)
move *a13(plyr_num),a4 ;>Do 1 in 4 ticks
move @PCNT,a0
move a4,a1
sll 32-2,a0
sll 32-2,a1
cmp a0,a1
jrne #skip
movk 1,a14 ;>Get teammates dir/dist
xor a4,a14
sll 5,a14 ;*32
addi plyrobj_t,a14
move *a14,a0,L
callr seekdirdist_obob128
move a0,*a13(plyr_tmdir)
move a1,*a13(plyr_tmdist)
srl 1,a4 ;>Get opponents dir/dist
movk 1,a14
xor a14,a4
sll 6,a4 ;*64
addi plyrobj_t,a4
move *a4+,a0,L
callr seekdirdist_obob128
move a0,*a13(plyr_o1dir)
move a1,*a13(plyr_o1dist)
move *a4+,a0,L
callr seekdirdist_obob128
move a0,*a13(plyr_o2dir)
move a1,*a13(plyr_o2dist)
move @ballobj_p,a0,L
callr seekdirdist_obob128
move a0,*a13(plyr_balldir)
move a1,*a13(plyr_balldist)
move *a13(plyr_myhoopx),a6
movi CZMID,a7
callr seekdirdist_obxz128
move a0,*a13(plyr_hpdir)
move a1,*a13(plyr_hpdist)
move *a13(plyr_ohoopx),a6
movi CZMID,a7
callr seekdirdist_obxz128
move a0,*a13(plyr_ohpdir)
move a1,*a13(plyr_ohpdist)
#skip clr a14 ;>Setup defensive flag
move @ballpnum,a0
jrn #setdef ;No owner?
move *a13(plyr_ownball),a0
jrnz #setdef ;My team has?
move *a13(plyr_hpdist),a0
move *a13(plyr_num),a1
move @PSTATUS,a2
btst a1,a2
jrz #drn
cmpi 220,a0
jruc #ndrn
#drn
cmpi 310,a0
#ndrn jrge #setdef ;Too far from my hoop?
move *a13(plyr_hpdir),a0 ;Find dir difference
move *a13(plyr_balldir),a1
sub a1,a0
abs a0
cmpi >40,a0
jrle #dsml
subi >80,a0
abs a0
#dsml subk 24,a0
jrle #setdef ;Not between ball and hoop?
move *a13(plyr_seq),a2
cmpi RUNDRIBTURB_SEQ,a2
jrhi #setdef
move *a13(plyr_o1dist),a1
cmpi 90,a1
jrlt #defon
move *a13(plyr_o2dist),a1
cmpi 90,a1
jrge #setdef
#defon movk 1,a14
#setdef move a14,*a13(plyr_indef)
;-------
move *a13(plyr_autoctrl),a0
jrnz #tcc ;Temp computer control?
move *a13(plyr_seqflgs),a0
btst NOCOLLP_B,a0
jrnz #nocol ;No collide?
callr plyr_chkpcollide
#nocol
;>Stagger/fall
move *a13(plyr_stagcnt),a2
jrle #nostag
subk 1,a2
move a2,*a13(plyr_stagcnt)
subk 15,a2
jrle #nostag
move *a13(plyr_seq),a14
subk 30-15,a2
jrle #chkstag ;Chk stag?
move @plyrnumonfire,a1
jrn #noflm1
move @fatality,a2
jrz #noflm1
move *a13(plyr_num),a3
srl 1,a3
srl 1,a1
cmp a1,a3
jrz #noflm1
btst a1,a2
jrz #noflm1
movi 500,a0
calla RNDPER
jrls #noflm1
;Yes, this will be a flaming fall!
movk 1,a9
#noflm1
move *a13(plyr_seq),a14
movi FLYBACK_SEQ,a0
move a9,a9
jrz #noflm2
movi FFLYBACK_SEQ,a0
#noflm2
cmp a0,a14
jreq #cstag
;MJT
; cmpi FALL_SEQ,a14
; jrge #cstag
; cmpi FFLYBACKWB2_SEQ,a14
; jrgt #cstag
cmpi FLYBACKWB_SEQ,a14
jreq #cstag
cmpi FLYBACKWB2_SEQ,a14
jreq #cstag
cmpi FLYBACK2_SEQ,a14
jreq #cstag
;MJT
move *a13(plyr_ownball),a1
jrgt #haveball
move *a13(plyr_attrib_p),a1,L
move *a1(PAT_POWER),a1
move @last_power,a2 ;Player pushing has this power
sub a1,a2
abs a2
movi FLYBACK_SEQ,a0 ;If similar power, always do flyback
move a9,a9
jrz #noflm3
movi FFLYBACK_SEQ,a0
#noflm3
cmpi 1,a2
jrle #fall
sll 4,a1
;Powerful guys, flail more often
PUSH a14
addi #noblflail_t,a1
move *a1,a0
calla RNDPER
PULL a14
movi FLYBACK_SEQ,a0 ;If similar power, always do flyback
move a9,a9
jrz #noflm4
movi FFLYBACK_SEQ,a0
#noflm4
;MJT - Will this work?
jrls #fall
jruc #flail
#haveball
;If toward rear edge of court and is being pushed back into crowd, always do
;normal flyback and never keep ball!
movi FLYBACK_SEQ,a0 ;If similar power, always do flyback
move a9,a9
jrz #noflm5
movi FFLYBACK_SEQ,a0
#noflm5
move *a8(OZPOS),a1
cmpi >410,a1
jrgt #not_rear
move *a8(OZVEL),a1,L
jrn #fall ;Heading over scores table?
#not_rear
move @pushing_delay,a1
jrnz #keepball
move @strongmen,a1
jrz #notchamp
srl 1,a1
;A grand champion is playing!
move *a13(plyr_num),a0
srl 1,a0
cmp a0,a1
jrz #notchamp ;br=champ getting pushed
movi 900,a0
calla RNDPER
jrhi #keepball
#notchamp
;MJT
; move *a13(plyr_ptsdown),a1
; jrle #fall ;I'm winning?
;If player is in elbo mode, have him keep ball more often!
movi 500,a0 ;40% chance of keeping ball if in ELBO
cmpi ELBO_SEQ,a14 ;Could also do ELBO2_SEQ
jrz #fbnorm
;MJT
move *a13(plyr_attrib_p),a14,L
move *a14(PAT_POWER),a0
move @last_power,a2 ;Player pushing has this power
sub a0,a2
abs a2
cmpi 1,a2
jrgt #norm
movi 200,a0
jruc #norm2
#norm
sll 4,a0
;Powerful guys, keep ball more often
addi #kpball_t,a0
move *a0,a0
; movi 200,a0 ;15% chance of keeping ball if winning
#norm2
move *a13(plyr_ptsdown),a1
jrle #fbnorm ;!Losing?
cmpi 15,a1
jrle #fbmok
movk 15,a1
#fbmok sll 4,a1
addi #flyb_t,a1
move *a1,a14
add a14,a0
cmpi 1000,a0
jrge #keepball
#fbnorm
calla RNDPER
jrls #fb
#keepball
;Yes, keep ball even though I've been pushed.
clr a0
move a0,*a13(plyr_dribmode) ;Allow dribble when he gets up
;Rules for using short flyback/WITH BALL sequence:
;If in dunk, don't do short flybacks
;If in jump shot, 50%
;If losing, 50%
;What else?
calla pushed_speech
movi FLYBACKWB_SEQ,a0 ;If similar power, always do flyback
move a9,a9
jrz #noflm6
movi FFLYBACKWB_SEQ,a0
#noflm6
move *a13(plyr_seqflgs),a14
btst DUNK_B,a14
jrnz #fall ;In dunk?
move *a13(plyr_seq),a14
subk SHOOT_SEQ,a14 ;Am I shooting?
jrz #_50_50
;MJT
movi 50,a0
move *a13(plyr_ptsdown),a1
jrle #i5050
; jrle #fall ;I'm winning?
#_50_50
;I'm losing or shooting, 25% of time don't fly all the way back.
move *a13(plyr_attrib_p),a14,L
move *a14(PAT_POWER),a0
move @last_power,a2 ;Player pushing has this power
sub a0,a2
abs a2
cmpi 1,a2
jrgt #norm3
movi 250,a0
jruc #i5050
#norm3
sll 4,a0
;Powerful guys, keep ball more often
addi #shortfly_t,a0
move *a0,a0
; movi 250,a0
#i5050
calla RNDPER
jrhi #nofall
movi FLYBACKWB_SEQ,a0 ;If similar power, always do flyback
move a9,a9
jrz #noflm7
movi FFLYBACKWB_SEQ,a0
#noflm7
jruc #fall
#nofall
; move @HCOUNT,a1
; andi 3,a1 ;andi 1
; jrz #fall
;He lucked out, fly short distance
#flail move *a8(OZVEL),a0,L
sra 2,a0
move a0,*a8(OZVEL),L
move *a8(OXVEL),a0,L
sra 2,a0
move a0,*a8(OXVEL),L
movi FLYBACKWB2_SEQ,a0 ;If similar power, always do flyback
move a9,a9
jrz #noflm8
movi FFLYBACKWB2_SEQ,a0
#noflm8
jruc #fall
#fb
;Rules for using short flyback/NO BALL sequence:
;If in dunk, don't do short flybacks
;If losing, 35%
;What else?
movi FLYBACK_SEQ,a0 ;If similar power, always do flyback
move a9,a9
jrz #noflm9
movi FFLYBACK_SEQ,a0
#noflm9
move *a13(plyr_seqflgs),a14
btst DUNK_B,a14
jrnz #fall ;In dunk?
;MJT
;If big guy, do short flyback more often!
move *a13(plyr_attrib_p),a14,L
move *a14(PAT_POWER),a0
move @last_power,a2 ;Player pushing has this power
sub a0,a2
abs a2
cmpi 1,a2
jrgt #norm5
movi FLYBACK_SEQ,a0 ;If similar power, always do flyback
move a9,a9
jrz #noflm10
movi FFLYBACK_SEQ,a0
#noflm10
jruc #fall
#norm5
sll 4,a0
move *a13(plyr_ptsdown),a1
jrle #winshortfly ;Br= I'm winning!
;I'm losing
addi #shortfly_t,a0
move *a0,a0
jruc #flyout
#winshortfly ;Br= I'm winning!
addi #winshortfly_t,a0
move *a0,a0
#flyout
; move *a13(plyr_ptsdown),a1
; jrle #fall ;Br= I'm winning!
;I'm losing, 35% of time don't fly all the way back.
; addi 150,a0
;#fbnorm2
calla RNDPER
jrhi #fly_short
movi FLYBACK_SEQ,a0 ;If similar power, always do flyback
move a9,a9
jrz #noflm11
movi FFLYBACK_SEQ,a0
#noflm11
jruc #fall
#fly_short
;He lucked out, make him fly short distance
move *a8(OZVEL),a0,L
sra 2,a0
move a0,*a8(OZVEL),L
move *a8(OXVEL),a0,L
sra 2,a0
move a0,*a8(OXVEL),L
movi FLYBACK2_SEQ,a0 ;If similar power, always do flyback
move a9,a9
jrz #noflm12
movi FFLYBACK2_SEQ,a0
#noflm12
jruc #fall
#chkstag
move *a13(plyr_jmpcnt),a1
jrz #stag ;On gnd?
movi FALL_SEQ,a0 ;If similar power, always do flyback
move a9,a9
jrz #noflm13
movi FFALL_SEQ,a0
#noflm13
cmp a14,a0
jrne #fall
jruc #cstag
#stag subi STAGGER_SEQ,a14
jreq #nostag
subk FALL_SEQ-STAGGER_SEQ,a14
jreq #cstag
movk 3,a0
callr rnd
jrnz #nostag
movi STAGGER_SEQ,a0
#fall
move *a13(plyr_dir),a7
callr plyr_setseq
#cstag clr a2
move a2,*a13(plyr_stagcnt)
#nostag
;-------
move @PSTATUS,a0 ;Plyr start bits 0-3
move *a13(plyr_num),a1
btst a1,a0
jrnz #human
calla drone_main
#human
#tcc
move *a13(plyr_indef),a14
jrz #nodef
move *a13(plyr_balldir),*a13(plyr_newdir)
#nodef
move *a11,a6 ;A6=Ctrl bits
; move *a13(plyr_jmpcnt),a0
; jrnz #clrsb ;In air?
movb *a13(plyr_seqflgs+NOJOY_B-7),a0
jrn #clrsb ;Joy off?
move *a13(plyr_nojoy),a0
jrz #joyon ;Joystick on?
jrgt #clrsb
move a0,a6
jruc #joyon
#clrsb
srl 4,a6 ;Clr stick bits
sll 4,a6
#joyon
move *a13(plyr_dir),a7 ;A7=Dir
move *a13(plyr_newdir),a0
jrn #stick ;No forced dir?
sub a7,a0
jrnz #turn
movi -1,a0
move a0,*a13(plyr_newdir)
#stick
move *a13(plyr_autoctrl),a1
jrnz #rok
move *a8(OZPOS),a0 ;>Clr joy bits that make us go out of bounds
move a0,a14
cmpi CZMIN+8,a0
jrgt #upok ;OK?
movk JOYU_M,a0
andn a0,a6
move *a13(plyr_rcvpass),a1
jrz #notwaiting
;Tell player recieving a leading pass to turn and wait for pass
movk 1,a1
move a1,*a13(plyr_nojoy) ;Neg
move a1,*a13(plyr_turndelay)
#notwaiting
cmpi CZMIN+6,a14 ;a0
jrgt #upok
move *a13(plyr_seq),a14
cmpi RUN_SEQ,a14
jrz #sldin0
cmpi RUNTURB_SEQ,a14
jrz #sldin0
cmpi RUNDRIB_SEQ,a14
jrz #sldin0
cmpi RUNDRIBTURB_SEQ,a14
jrnz #upok
#sldin0
move *a8(OZPOS),a14
inc a14
move a14,*a8(OZPOS)
#upok
cmpi GZMAX-6,a0
jrlt #dnok ;OK?
movk JOYD_M,a0
andn a0,a6
move *a13(plyr_rcvpass),a14
jrz #notwaiting1
;Tell player recieving a leading pass to turn and wait for pass
movk 1,a14
move a14,*a13(plyr_nojoy) ;Neg
move a14,*a13(plyr_turndelay)
#notwaiting1
#dnok
move *a8(OXPOS),a0
move *a8(OXANI+16),a14
add a14,a0
move a0,a14
cmpi PLYRMINX,a0
jrgt #lok ;OK?
movk JOYL_M,a0
andn a0,a6
move *a13(plyr_rcvpass),a1
jrz #notwaiting2
;Tell player recieving a leading pass to turn and wait for pass
movk 1,a1
move a1,*a13(plyr_nojoy) ;Neg
move a1,*a13(plyr_turndelay)
#notwaiting2
cmpi PLYRMINX-2,a14
jrgt #lok ;OK?
move *a13(plyr_seq),a14
cmpi RUN_SEQ,a14
jrz #sldin
cmpi RUNTURB_SEQ,a14
jrz #sldin
cmpi RUNDRIB_SEQ,a14
jrz #sldin
cmpi RUNDRIBTURB_SEQ,a14
jrnz #lok
#sldin
move *a8(OXPOS),a14
inc a14
move a14,*a8(OXPOS)
#lok
move a0,a14
cmpi PLYRMAXX,a0
jrlt #rok ;OK?
movk JOYR_M,a0
andn a0,a6
move *a13(plyr_rcvpass),a1
jrz #notwaiting3
;Tell player recieving a leading pass to turn and wait for pass
movk 1,a1
move a1,*a13(plyr_nojoy) ;Neg
move a1,*a13(plyr_turndelay)
#notwaiting3
cmpi PLYRMAXX+2,a14
jrlt #rok ;OK?
move *a13(plyr_seq),a14
cmpi RUN_SEQ,a14
jrz #sldin2
cmpi RUNTURB_SEQ,a14
jrz #sldin2
cmpi RUNDRIB_SEQ,a14
jrz #sldin2
cmpi RUNDRIBTURB_SEQ,a14
jrnz #rok
#sldin2
move *a8(OXPOS),a14
dec a14
move a14,*a8(OXPOS)
#rok
move a6,a0
sll 32-4,a0
jrz #setdt ;No stick?
srl 32-4-3,a0 ;>Convert to dir 0-127
addi #dirc_t,a0
movb *a0,a0
sub a7,a0 ;A0=Difference
jrz #samedir
#turn move a0,a1 ;>Turn the shortest way
abs a0
subk 6,a0
jrge #340 ;Far?
add a1,a7 ;Make exact
jruc #380
#340 cmpi 64-6,a0
jrle #350
neg a1
#350 move a1,a1
jrnn #360
subk 12,a7 ;-6
#360 addk 6,a7 ;+6
#380 sll 32-7,a7 ;Make 0-127
srl 32-7,a7
move a7,*a13(plyr_dir)
movk >1f,a0
callr rnd
jrnz #nosq ;No squeak?
move @PCNT,a0
movk 3,a1
and a1,a0
sll 5,a0
addi #sqsnds,a0
move *a0,a0,L
calla snd_play1
#nosq
move *a13(plyr_seqflgs),a0
btst WALK_B,a0
jrnz #nodir
move *a13(plyr_seqdir),a0
move a7,a1 ;Dir
addk 8,a1
sll 32-7,a1
srl 32-7+4,a1 ;Kill frac
cmp a0,a1
jreq #nodir ;Already in this dir?
move *a13(plyr_seq),a0
callr plyr_setseq
#nodir clr a0
jruc #setdt
#samedir
move *a13(plyr_dirtime),a0
addk 1,a0
#setdt move a0,*a13(plyr_dirtime)
;-------
;>Movement/boundary check
move *a8(OXVEL),a2,L
move *a8(OZVEL),a3,L
move *a13(plyr_jmpcnt),a0
jrnz #drift ;Jumping?
move *a13(plyr_seqflgs),a4
btst DRIFT_B,a4
jrz #nodrift
#drift move *a8(OXPOS),a4 ;>Put drag on vel if we drift too far
move *a8(OXANI+16),a0
add a0,a4
move *a8(OZPOS),a5
move a3,a3
jrge #zvpos
cmpi CZMIN+8,a5
jrgt #chkx ;OK?
jruc #ydrag
#zvpos cmpi GZMAX-6,a5
jrlt #chkx ;OK?
#ydrag move a3,a0 ;-1/4 from vel
sra 2,a0
sub a0,a3
#chkx
move a2,a2
jrge #xvpos
cmpi PLYRMINX2,a4
jrgt #setvel ;OK?
jruc #xdrag
#xvpos
cmpi PLYRMAXX2,a4
jrlt #setvel ;OK?
#xdrag move a2,a0 ;-1/4 from vel
sra 2,a0
sub a0,a2
jruc #setvel
#nodrift
move a2,a0 ;>-1/4 from XZVEL
sra 2,a0
sub a0,a2
move a3,a0
sra 2,a0
sub a0,a3
btst NOMV_B,a4
jrnz #setvel ;No moving?
move *a13(plyr_autoctrl),a1
jrz #noautoc
movi >1a000,a14
jruc #noturb
#noautoc
move *a13(plyr_bvel),a14
sll 4,a14
;Double turbo mode
; addi >5800,a14
move *a13(plyr_ownball),a1
jrle #nobal ;Have ball?
;I own ball, if shot clock down to 10, and am over
;half court, slow down! I am trying to burn out the clock!
move *a13(plyr_ohpdist),a1
cmpi >174,a1
jrlt #nobal
move @shotimer,a1,L
jrz #nobal
cmpi [1,0],a1
jrz #nobal
move *a13(plyr_ptsdown),a1
jrgt #nobal ;If losing, don't slow down
subi >3000,a14 ;Slow him down
#nobal
move @game_time,a1,L
cmpi 050000h,a1
jrge #noxtraspd
;Under 50 seconds, speed up losing players!
; move *a13(plyr_ptsdown),a1 ;>Adjust shot %
; jrle #noxtraspd
move *a13(plyr_num),a1
cmpi 2,a1
jrge #tm2
move @scores,a0
move @scores+16,a1
cmp a0,a1
jrle #noxtraspd
jruc #yes
#tm2 move @scores,a0
move @scores+16,a1
cmp a0,a1
jrge #noxtraspd
#yes
addi >1c00,a14
#noxtraspd
move *a13(plyr_offscrn),a1
jrz #onscrn
addi >e000,a14 ;Speedup when offscrn on defense
clr a1
move a1,*a13(plyr_offscrn)
#onscrn
move *a13(plyr_ownball),a1
jrz #chkturb
;MJT subi >e00,a14 ;Slow offense down
subi >e80,a14 ;Slow offense down
move a1,a1
jrn #chkturb ;Buddy has ball?
;MJT subi >1000,a14 ;Slow him down
subi >1100,a14 ;Slow him down
#chkturb
move *a13(plyr_turbon),a0
jrz #noturb
addi >3e00,a14
#noturb
movk 11b,a0
and a6,a0
jrz #nodiag ;Neither up or dn?
movk 1100b,a0
and a6,a0
jrz #nodiag ;Neither lft or rgt?
move a14,a0
sra 3,a0
sub a0,a14 ;-12%
#nodiag
; btst 4,a6 ;3point DEBUG
; jrz #DEBUG
; movi >2000,a14
;#DEBUG
move *a8(OXPOS),a4
move *a8(OXANI+16),a0
add a0,a4
move *a8(OZPOS),a5
btst JOYU_B,a6
jrz #noup
cmpi CZMIN+8,a5
jrle #noup ;Min?
sub a14,a3
#noup
btst JOYD_B,a6
jrz #nodn
cmpi GZMAX-6,a5
jrge #nodn ;Max?
add a14,a3
#nodn
btst JOYL_B,a6
jrz #chkr
sub a14,a2
cmpi PLYRMINX,a4
jrgt #setvel ;In bounds?
move *a13(plyr_autoctrl),a0
jrnz #setvel
add a14,a2
jruc #setvel
#chkr
btst JOYR_B,a6
jrz #setvel
add a14,a2
cmpi PLYRMAXX,a4
jrlt #setvel ;In bounds?
move *a13(plyr_autoctrl),a0
jrnz #setvel
sub a14,a2
#setvel move a2,*a8(OXVEL),L
move a3,*a8(OZVEL),L
#nomv
;-------
;>Do turbo meters
btst BUT3_B,a6 ;Turbo but
jrz #turdone
;Allow guy with ball to throw elbows if turbo button pressed twice quickly
btst BUT3_B+8,a6
jrz #noelbo
move *a13(plyr_tbutn),a14
clr a0
move a0,*a13(plyr_tbutn)
subk 1,a14
jrlt #noelbo ;Too quick?
subk 8-1,a14
jrgt #noelbo ;Too late?
move *a13(plyr_seq),a14
cmpi STNDWB_SEQ,a14
jreq #ok
cmpi STNDWB2_SEQ,a14
jreq #ok
cmpi STNDDRIB2_SEQ,a14
jreq #ok
cmpi RUNDRIB_SEQ,a14
jreq #ok
; cmpi RUNDRIBTURB_SEQ,a14
; jreq #ok
subk STNDDRIB_SEQ,a14
jrne #noelbo
#ok
; move *a13(plyr_num),a0
; move @PSTATUS,a2
; btst a0,a2
; jrz #notingame
move @gmqrtr,a0
jrnz #s1
move @game_time,a0,L
cmpi >2040906,a0
jrge #noelbo
#s1
;Shrink turbo meter for this plyr
move *a13(plyr_PDATA_p),a2,L
move *a2(ply_turbo),a1
cmpi >5,a1 ;>2f is max
jrlt #noelbo ;Turbo too low?
subk >4,a1 ;Use a bunch up!
move a1,*a2(ply_turbo)
move *a2(ply_meter_imgs+40h),a0,L
move *a0(OFSET),a1 ;Shrink meter
addk >4,a1
move a1,*a0(OFSET)
#notingame
movi 60,a0
move a0,@steals_off ;Don't allow steals for 60 ticks
movi ELBO2_SEQ,a0
callr plyr_setseq
jruc #turdone
#noelbo
; move *a13(plyr_num),a0 ;Don't allow drones to mess with
; move @PSTATUS,a2 ;img ofsets!
; btst a0,a2
; jrz #turdone
move *a13(plyr_num),a0 ;If on fire, don't use turbo on run
move @plyrnumonfire,a1
cmp a0,a1
jrz #turdone
move *a13(plyr_PDATA_p),a0,L
move *a0(ply_turbo),a1 ;Turbo info in PxDATA (0-2f OXSIZE)
jrz #turdone ;No turbo left?
move *a0(ply_turbo_dl),a2 ;Cnt for delaying dec of ply_turbo
subk 1,a2
move a2,*a0(ply_turbo_dl)
jrnz #turdone
movk 8,a2 ;Rate of decline adjustment
move a2,*a0(ply_turbo_dl)
subk 1,a1
move a1,*a0(ply_turbo) ;Turbo meter size to get smaller
movk 4,a1
move a1,*a0(used_turbo) ;Cntr for replenishing meter after use
move *a0(ply_idiot_use),a1
inc a1
move a1,*a0(ply_idiot_use)
move *a0(ply_meter_imgs+40h),a0,L ;LITUP img
move *a0(OFSET),a1 ;Need to shrink LITUP img
addk 1,a1
move a1,*a0(OFSET)
#turdone
move *a13(plyr_tbutn),a0 ;Ticks since turbo button last hit
addk 1,a0
move a0,*a13(plyr_tbutn)
move *a13(plyr_shtdly),a0
jrle #nodly ;No delay?
subk 1,a0
move a0,*a13(plyr_shtdly)
#nodly
;-------
move *a13(plyr_rcvpass),a0 ;>Pass receiving
jrle #norcvp ;No pass?
subk 1,a0
move a0,*a13(plyr_rcvpass)
jrgt #norcvp ;Not yet?
; move *a13(plyr_nojoy),a1
move a0,*a13(plyr_nojoy)
; move @ballobj_p,a2,L
; move *a2(OYVEL+16),a0
; jrge #balllow
; move *a8(OYPOS),a0
; subk 10,a0
; move *a2(OYPOS),a1
; cmp a0,a1
; jrgt #balllow
; subk REBOUND_SEQ,a1
; jrne #noreb
; movk REBOUND_SEQ,a0
; callr plyr_setseq
;#noreb
#norcvp
move *a13(plyr_seq),a2
cmpi RUNDRIBTURB_SEQ,a2
jrhi #anicnt
move a6,a1 ;>Change ani if no joy
sll 32-4,a1
jrz #nojoy ;Joy neutral?
movi 38,a14 ;Delay before auto turn toward ball
move *a13(plyr_ownball),a0
jrz #indef
movi 60,a14 ;^
#indef move a14,*a13(plyr_turndelay)
move *a13(plyr_indef),a14
jrz #nodef2
move *a13(plyr_seqflgs),a0
btst WALK_B,a0
jrnz #anicnt
srl 32-4-3,a1 ;>Convert to dir 0-127
addi #dirc_t,a1
movb *a1,a1
sub a7,a1
move a1,a14 ;Calc dir dist
abs a14
cmpi >40,a14
jrle #diffsml
neg a1
subi >80,a14
abs a14
#diffsml
movk WALKFDEF_SEQ,a0
cmpi 16,a14
jrlt #setseq
movk WALKBDEF_SEQ,a0
cmpi >30,a14
jrgt #setseq
movk WALKLDEF_SEQ,a0
move a1,a1
jrn #setseq
movk WALKRDEF_SEQ,a0
jruc #setseq
#nodef2
;MJT
clr a0
move a0,*a13(plyr_keeppal)
movk RUN_SEQ,a0 ;>Setup run sequence
move *a13(plyr_ownball),a14
jrle #nobl
move *a13(plyr_dribmode),a14
jrn #stndwb ;Can't drib?
movk RUNDRIB_SEQ,a0
#nobl
move a0,a1
move *a13(plyr_turbon),a14
jrz #slow
addk 1,a0 ;Turbo version
#slow
addk 1,a1
sub a2,a1
subk 1,a1
jrhi #setseq ;Different type?
move *a13(plyr_ani_p),a14,L
move *a14+,a14
jrnz #anicnt ;!At end?
jruc #setseq
#nojoy
move *a13(plyr_seqflgs),a0
btst WALK_B,a0
jrnz #anicnt
movk STNDDEF_SEQ,a0 ;>Setup stand sequence
movk STNDDRIBDEF_SEQ,a1
move *a13(plyr_indef),a14
jrnz #chkb
movk STND2_SEQ,a0
movk STNDDRIB_SEQ,a1
move *a13(plyr_turndelay),a14
jrz #turnok1
subk 1,a14
move a14,*a13(plyr_turndelay)
subk 20,a14
jrgt #chkb
#turnok1
move *a13(plyr_o1dist),a14
cmpi 155,a14
jrlt #stnd0
move *a13(plyr_o2dist),a14
cmpi 155,a14
jrgt #stnd1
#stnd0
movk STND_SEQ,a0
movk STNDDRIB2_SEQ,a1
#stnd1
move *a13(plyr_ownball),a14
jrle #chka
move *a13(plyr_turndelay),a14
jrz #turnok0
dec a14
move a14,*a13(plyr_turndelay)
jruc #chkb
#turnok0
move *a13(plyr_ohpdir),a14
move a14,*a13(plyr_newdir)
jruc #chkb
#chka
move *a13(plyr_turndelay),a14
jrz #turnok
dec a14
move a14,*a13(plyr_turndelay)
jruc #chkb
#turnok move *a13(plyr_balldir),a14
move a14,*a13(plyr_newdir)
#chkb move *a13(plyr_ownball),a14
jrle #setseq
move a1,a0
move *a13(plyr_dribmode),a14
jrgt #setseq ;Dribbling?
#stndwb movk STNDWB_SEQ,a0
move @inbound,a14
jrnn #setseq
move *a13(plyr_num),a14
btst 0,a14
jrnz #setseq
movk STNDWB2_SEQ,a0
#setseq cmp a0,a2
jreq #anicnt
.if IMGVIEW
movi debug_SEQ1,a0
.endif
callr plyr_setseq
#anicnt dsj a10,#noani
move *a13(plyr_ani_p),a14,L ;>Set new ani
#getdel move *a14+,a10 ;Delay
jrnn #nocode ;Not code?
move *a14+,a0,L ;*Code
move a14,b4
call a0 ;Can trash scratch, A2-A5
move b4,a14
jruc #getdel
#nocode jrnz #100
move *a13(plyr_seqcode_p),a0,L
jrge #noendc
call a0 ;Can trash scratch, A2-A5
#noendc move *a13(plyr_ani1st_p),a14,L ;Head of list
move *a14+,a10
#100 move *a14+,a0,L ;*Img
move *a14+,a1 ;Flags (OCTRL)
move *a13(plyr_anirevff),a2 ;Get reverse flip flag
xor a2,a1
move a1,a4
move *a0(IANI2Z),*a13(plyr_ballzo)
move a14,*a13(plyr_ani_p),L
callr plyr_ani
callr anipt2_getsclxy
move a0,*a13(plyr_ballxo),L
sra 16,a1
move a4,a4
jrnn #ynorm ;!YFree flag?
movi -200,a1
#ynorm move a1,*a13(plyr_ballyo)
move *a13(plyr_jmpcnt),a14
jrnz #injmp ;Jumping?
move *a13(plyr_aniy),a1
neg a1
move a1,*a8(OYPOS) ;Set on gnd
cmpi 30,a10
jrlt #injmp
movk 4,a10
#injmp
move *a8(OIMG),a2,L ;>Set new head img
move *a2(IANI3ID),a1
sll 5,a1 ;*32
move *a2(IANI3Z),a14
neg a14
move *a13(plyr_attrib_p),a0,L
move *a0(PAT_HEADT_p),a0,L
add a1,a0
move *a0,a4,L
move *a13(plyr_headobj_p),a3,L
move a14,*a3(OMISC)
move a4,*a3(OIMG),L ;Set new img
move *a4,a14,L
move a14,*a3(OSIZE),L
move *a4(ISAG),*a3(OSAG),L
setf 1,0,0
move *a8(OCTRL+4),*a3(OCTRL+4) ;Copy HFlip bit
move *a2(IFLAGS+FLIPH_IFB),a14 ;Chk reverse bit
jrz #nohflip
move *a3(OCTRL+4),a14 ;Reverse hflip
addk 1,a14
move a14,*a3(OCTRL+4)
#nohflip
setf 16,1,0
#noani
;-------
move *a13(plyr_jmpcnt),a0 ;>Jumping
jrz #noj
addk 1,a0
move a0,*a13(plyr_jmpcnt)
move *a13(plyr_hangcnt),a0
jrle #nohang ;Not hanging?
subk 1,a0
move a0,*a13(plyr_hangcnt)
jruc #pass ;Skip grav
#nohang
move *a8(OYVEL),a0,L
move *a13(plyr_ownball),a14
jrgt #grav ;Have ball?
; btst BUT1_B,a6 ;Mario like jump
; jrnz #grav
; addi GRAV/2,a0 ;+Grav/2
#grav addi GRAV,a0 ;+Gravity
jrn #200
move *a8(OYPOS),a1
move *a13(plyr_aniy),a14
add a14,a1 ;Ani pt position
jrlt #200 ;Above gnd
neg a14
move a14,*a8(OYPOS) ;Set on gnd
.if DEBUG
; clr a0
; move a0,@slowmotion
.endif
movk 1,a10 ;Run landing seq
clr a0
move a0,*a13(plyr_jmpcnt)
#200 move a0,*a8(OYVEL),L
move *a13(plyr_seqflgs),a0
btst DUNK_B,a0
jrnz #znubb ;In dunk?
move *a8(OZPOS),a1 ;Get SZ
subi CZMID,a1
abs a1
cmpi 40,a1
jrge #znubb
move *a8(OXPOS),a0 ;Get SX
move *a8(OXANI+16),a14
add a14,a0
subi WRLDMID,a0
abs a0
move a0,a3
movi >20000,a14
cmpi HOOPRX-WRLDMID+13,a0
jrge #undrbb ;Under backboard?
subk 10,a1
jrgt #znubb
cmpi HOOPRX-WRLDMID-8,a3
jrlt #znubb ;!Under rim?
; cmpi HOOPRX-WRLDMID+13,a3
; jrgt #znubb ;!Under rim?
movi >10000,a14
move *a8(OXVAL),a1,L
cmpi WRLDMID<<16,a1
jrlt #rhoop
neg a14
#rhoop add a14,a1
move a1,*a8(OXVAL),L
movi >10000,a14
#undrbb
move *a8(OZVAL),a1,L
cmpi CZMID<<16,a1
jrge #dzpos ;In front of?
neg a14
#dzpos add a14,a1
move a1,*a8(OZVAL),L
#znubb
move *a13(plyr_ownball),a1
jrz #pass ;No ball?
jrlt #sblk ;Teammate has ball?
move *a13(plyr_jmpcnt),a0
subk 12,a0
jrlt #pass ;Too soon?
; move *a8(OYVEL+16),a0
; jrn #chkb1
move *a8(OYPOS),a1
move *a13(plyr_aniy),a14
add a14,a1 ;Ani pt position
addk 15,a1
jrlt #chkb1 ;High enough?
move *a13(plyr_seqflgs),a0
btst DUNK_B,a0
jrnz #slp ;Already started?
; btst BUT2_B+8,a6
; jrnz #dopass ;Air dish off pass?
btst SHOOT_B,a0
jrz #slp
move @gmqrtr,a0
jrnz #shoot2
move *a13(plyr_seq),a0
cmpi QSHOOT_SEQ,a0
jrz #shoot2
;Force him to shoot
movk 5,a0
move *a13(plyr_num),a1
calla idiot_box ;Tell him to release ball at peak of jump
jruc #shoot2 ;Too low?
#chkb1
move *a13(plyr_seq),a0
subk REBOUND_SEQ,a0
jreq #reb
subk REBOUNDA_SEQ-REBOUND_SEQ,a0
jrne #noreb
#reb
btst BUT1_B+8,a6
jrz #noreb ;No press?
move *a13(plyr_ohpdist),a14
cmpi 150,a14
jrgt #pass ;Too far?
move *a13(plyr_ownball),a0
jrle #pass ;Don't have?
move *a13(plyr_ohpdir),a0
move *a13(plyr_dir),a1
sub a1,a0
abs a0
cmpi >40,a0
jrle #rdsml
subi >80,a0
abs a0
#rdsml subk 32,a0
jrgt #pass ;Not between ball and hoop?
movk 2,a0
move a0,@ballptsforshot
movk LAYUPREB_SEQ,a0
callr plyr_setseq
jruc #pass
#noreb
btst BUT1_B,a6
jrnz #pass ;Holding shoot button?
btst BUT2_B+8,a6
jrnz #dopass ;Air dish off pass?
move *a13(plyr_seqflgs),a0
btst DUNK_B,a0
jrnz #slp ;Already started?
btst SHOOT_B,a0
jrz #slp
#shoot2
callr plyr_shoot
movk 1,a10
jruc #pass
#noj move @ballpnum,a0
jrge #sblk ;Somebody has ball?
move *a13(plyr_seq),a0
cmpi RUNDRIBTURB_SEQ,a0
jrhi #sblk ;Doing something?
move @ballgoaltcnt,a0
jrgt #sblk ;Going towards rim?
move *a13(plyr_balldist),a0
cmpi 100,a0
jrgt #sblk ;Too far?
move @ballprcv_p,a1,L
jrnz #sblk ;Pass in progress?
move *a13(plyr_seqflgs),a0
btst NOJUMP_B,a0
jrnz #sblk ;No jumping?
move *a13(plyr_autoctrl),a0
jrnz #sblk ;Temp computer control?
callr plyr_tryrebound
move *a13(plyr_seqflgs),a0
btst NOJUMP_B,a0
jrnz #slp ;No jumping?
#sblk btst BUT1_B,a6 ;>Shoot/block (But1)
jrz #pass
move *a13(plyr_ownball),a1
jrlt #drnshoot
;#tshoot
movk 1,a0
move *a13(plyr_shtbutn),a14
cmpi 2,a14
jrle #scont
cmpi 9,a14
jrge #scont
move *a13(plyr_seq),a0
cmpi QSHOOT_SEQ,a0
jrz #dblhit
cmpi TIP_SEQ,a0
jrz #dblhit
cmpi TIPJ_SEQ,a0
jrz #dblhit
clr a0
; move a0,*a13(plyr_shtbutn)
; callr plyr_startjmp
; jruc #pass
#scont move a0,*a13(plyr_shtbutn)
move *a13(plyr_seqflgs),a0
btst NOJUMP_B,a0
jrnz #pass ;No jumping?
btst DUNK_B,a0
jrnz #pass ;Already in a dunk?
move *a13(plyr_rcvpass),a0
jrgt #slp ;Waiting on pass?
move *a13(plyr_tmproc_p),a0,L
move *a0(plyr_rcvpass),a0
jrgt #slp ;Teammate waiting on pass?
callr plyr_startjmp
jruc #pass
#drnshoot ;>Tell drone to shoot
; btst BUT3_B,a6
; jrnz #tshoot ;Turbo override?
move @PSTATUS,a0 ;Plyr start bits 0-3
move *a13(plyr_num),a1
XORK 1,a1
btst a1,a0
jrnz #pass ;Teammate is a human?
move *a13(plyr_tmproc_p),a0,L
movk DRN_SHOOT_M,a1
move a1,*a0(plyr_d_cflgs)
move *a0(plyr_ohpdist),a14
cmpi 350,a14
jrlt #pass ;Drone is close enough?
move @gmqrtr,a14
jrnz #pass
move *a0(plyr_jmpcnt),a14
jrnz #pass
move *a13(plyr_idiotbit),a14
btst 1,a14
jrnz #pass
addk 2,a14
move a14,*a13(plyr_idiotbit)
movk 4,a0
move *a13(plyr_num),a1
calla idiot_box ;Tell drone to shoot ball
#pass ;>Pass/steal (But2)
move *a13(plyr_shtbutn),a0
jrz #dblhit
inc a0
move a0,*a13(plyr_shtbutn)
#dblhit
move *a13(plyr_ownball),a2
jrz #steal ;No ball?
move *a13(plyr_rcvpass),a0
jrgt #slp ;Waiting on pass?
btst BUT2_B+8,a6
jrz #slp
move *a13(plyr_seqflgs),a14
btst PASS_B,a14
jrnz #slp ;Passing?
move @pass_off,a14
jrnz #slp ;Lockout passing for now?
move a2,a2
jrlt #passtome
#dopass
callr plyr_startpass
jruc #slp
#passtome ;>Tell drone to pass
btst BUT3_B,a6
jrnz #steal ;Turbo?
move *a13(plyr_tmproc_p),a0,L
movk DRN_PASS_M,a1
; btst 6,a6
; jrz #regds ;No turbo?
; ori >8000,a1
#regds move a1,*a0(plyr_d_cflgs)
jruc #slp
#steal
btst BUT2_B,a6
jrz #slp ;No button?
move *a13(plyr_jmpcnt),a0
jrnz #slp
move *a13(plyr_seq),a0
btst BUT3_B,a6
jrnz #push ;Turbo?
subi STEAL_SEQ,a0
jreq #slp
move *a13(plyr_rcvpass),a0
jrgt #slp ;Getting pass?
move *a13(plyr_tmproc_p),a1,L
move *a1(plyr_rcvpass),a0
jrgt #slp ;Getting pass?
move *a13(plyr_keeppal),a0 ;Getting up while on fire, on butt
jrz #noflames
calla seq_stopfire
#noflames
movi STEAL_SEQ,a0
callr plyr_setseq
move *a13(plyr_balldir),*a13(plyr_newdir)
jruc #slp
#push
btst BUT2_B+8,a6
jrz #slp ;No button?
move *a13(plyr_PDATA_p),a2,L
move *a2(ply_turbo),a1
cmpi 10,a1
jrlt #slp ;Turbo too low?
subi PUSH_SEQ,a0
jreq #slp
move *a13(plyr_num),a0 ;If on fire, don't use turbo on push
move @plyrnumonfire,a14
cmp a0,a14
jrz #notingame2
subk 8,a1
move a1,*a2(ply_turbo)
move *a2(ply_meter_imgs+40h),a0,L
move *a0(OFSET),a1 ;Shrink meter
addk 8,a1
move a1,*a0(OFSET)
#notingame2
calla seq_stopfire
movi PUSH_SEQ,a0
callr plyr_setseq
#slp
move *a13(plyr_ownball),a1
jrle #nob
callr plyr_setballxyz
#nob
#halted
callr plyr_headalign
callr plyr_setshadow
; .if DEBUG
; callr plyr_setgndaligndot
; .endif
;#halted
SLOOP 1,#lp
#pdat_t .word P1_PID,3<<4,120,CZMID-50
.long w3run1
#pd1 .word P2_PID,2<<4,175,CZMID
.long w3run1
.word P3_PID,6<<4,215,CZMID
.long w3run1
.word P4_PID,7<<4,280,CZMID+50
.long w3run1
ltshoepal_t
COLORW 31,31,31, 27,27,27, 22,22,22, 18,18,18
COLORW 14,14,14
;dkshoepal_t
; COLORW 8,8,8, 6,6,6, 5,5,5, 4,4,4
; COLORW 2,2,2
#dirc_t .byte 0,0,4<<4,0,6<<4,7<<4,5<<4,0,2<<4,1<<4,3<<4,0,0,0,0,0
pdta_l .long P1DATA,P2DATA,P3DATA,P4DATA
#sqsnds .long sqk1_snd,sqk2_snd,sqk3_snd,sqk4_snd
#kpball_t
; .word 100,130,160,190,200,220,280,300,450,550,850
.word 190,200,220,280,300,450,550,600,650,650,650
#noblflail_t
; .word 50,65,80,80,80,80,100,130,170,250,250
.word 85,100,105,110,115,120,150,190,250,250,300
#shortfly_t
; .word 50,100,140,160,180,200,250,300,400,550,650
.word 140,160,180,200,250,300,400,550,650,650,650
#winshortfly_t
.word 50/2,100/2,100/2,120/2,150/2,150/2,200/2,300/2,450/2,550/2,550/2
#flyb_t
;Extra % chance of allowing losing team to keep ball after being pushed
;1 pt down up to 15 & over down
; .word 250,275,300,325,350,375,400,425,450,475,500
; .word 500,500,500,500,500,500,500,500
.word 25,50,75,100,125,150,175,200,225,250,275
.word 275,275,275,275,275,275,275,275,275
RED_C .equ 0
GRN_C .equ 1
BLU_C .equ 3
PUR_C .equ 4
BLK_C .equ 3
WHT_C .equ 6
;YEL_C .equ 7
.asg >80,I ;Always keeps home colors
#team_t .byte RED_C,GRN_C,BLU_C,RED_C,BLU_C,BLU_C,BLU_C,BLU_C
.byte BLU_C,RED_C,BLU_C,RED_C,PUR_C,BLK_C,GRN_C,BLU_C
.byte WHT_C,BLU_C,BLK_C,RED_C,PUR_C,BLK_C,BLU_C,BLK_C
.byte GRN_C,PUR_C,RED_C
********************************
* Setup player sequence data
* A0=Sequence #
* A7=Dir 0-127
* A13=*Player process
* >A10=New ani cnt
* Trashes scratch
SUBR plyr_setseq
cmpi TIP_SEQ,a0
jrnz #bugok
move @scores,a14,L
jrz #bugok ;Game start?
LOCKUP
movk STND_SEQ,a0
#bugok
move a0,*a13(plyr_seq)
sll 5,a0 ;*32
addi pseq_t,a0
move *a0,a0,L
move *a0+,a1 ;Get flags
move a1,*a13(plyr_seqflgs)
btst DRIBBLE_B,a1 ;>Calc new dribble mode
jrnz #d
move *a13(plyr_dribmode),a14
jrz #n
movi -1,a1
jruc #setd
#d move *a13(plyr_dribmode),a14
jrnz #n
movk 1,a1
#setd move a1,*a13(plyr_dribmode)
#n
move *a0+,a1,L ;Get *code
move a1,*a13(plyr_seqcode_p),L
move a7,a1 ;Dir
addk 8,a1 ;Round off
sll 32-7,a1
srl 32-7+4,a1 ;Kill frac
move a1,*a13(plyr_seqdir)
clr a14 ;Dir 5-7 have reversed FLIPH
cmpi 5,a1
jrlt #nohf
movi M_FLIPH,a14
#nohf move a14,*a13(plyr_anirevff)
sll 32-3,a1 ;Clr bits
srl 32-3-5,a1 ;*32
add a1,a0
move *a0,a0,L
move a0,*a13(plyr_ani1st_p),L
move a0,*a13(plyr_ani_p),L
movk 1,a10
rets
********************************
* Delete a players processes and objects
* A0=Plyr # (0-3)
; SUBRP plyr_del
;
; PUSH a2,a3
;
; move a0,a2
; move a0,a3
; sll 5,a3 ;*32
; addi pdel_t,a3
;
; move *a3+,a0
; calla KIL1C ;Kill process
;
; move *a3+,a0
; calla obj_del1c ;Kill plyr images
;
; clr a0
; sll 5,a2 ;*32
; movi plyrobj_t,a1
; add a2,a1
; move a0,*a1,L
;
; addi plyrproc_t,a2
; move a0,*a2,L
;
; PULL a2,a3
; rets
;
;
;pdel_t .word P1_PID,CLSPLYR|TYPPLYR|SUBPL1
; .word P2_PID,CLSPLYR|TYPPLYR|SUBPL2
; .word P3_PID,CLSPLYR|TYPPLYR|SUBPL3
; .word P4_PID,CLSPLYR|TYPPLYR|SUBPL4
#*******************************
* Update player controls (called by main loop)
SUBR joy_read
move @GAMSTATE,a0
subk INGAME,a0
jrne #x
move @HALT,a0
jrnz #x
move @plyrproc_t,a0,L ;Get 1st plyr proc
move *a0(plyr_autoctrl),a0
jrnz #x ;Temp computer control?
SUBRP joy_read2 ;Called by reftip
move @PSTATUS,a0 ;Plyr start bits 0-3
.if TUNIT
move @TWOPLAYERS,a14 ;!0=2 plyr kit
jrz #4p
movi P2CTRL,a1 ;A1=*PxCTRL
move @SWITCH,a2
not a2
srl 2,a0 ;P2
jrnc #no2p2
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
move a2,a3
sll 32-8,a3
srl 32-8,a3
or a3,a14
move a14,*a1
#no2p2 addk 16,a1 ;P3
srl 1,a0
jrnc #x
zext a2
srl 8,a2
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
or a2,a14
move a14,*a1
jruc #x
#4p ;>4 player version
movi P1CTRL,a1 ;A1=*PxCTRL
move @SWITCH,a2
not a2
srl 1,a0 ;P1
jrnc #nop1
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
move a2,a3
sll 32-8,a3
srl 32-8,a3
or a3,a14
move a14,*a1
#nop1 addk 16,a1 ;P2
srl 1,a0
jrnc #nop2
zext a2
srl 8,a2
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
or a2,a14
move a14,*a1
#nop2
move @SWITCH2,a2
not a2
addk 16,a1 ;P3
srl 1,a0
jrnc #nop3
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
move a2,a3
sll 32-8,a3
srl 32-8,a3
or a3,a14
move a14,*a1
#nop3 srl 1,a0 ;P4
jrnc #x
addk 16,a1
zext a2
srl 8,a2
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
or a2,a14
move a14,*a1
.else ;>YUNIT
move @SWITCH,a2,L
not a2
srl 1,a0 ;P1
jrnc #nop1
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
move a2,a3
sll 32-8,a3
srl 32-8,a3
or a3,a14
move a14,*a1
#nop1 addk 16,a1 ;P2
srl 8,a2
srl 1,a0
jrnc #nop2
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
move a2,a3
sll 32-8,a3
srl 32-8,a3
or a3,a14
move a14,*a1
#nop2 addk 16,a1 ;P3
srl 1,a0
jrnc #nop3
srl 16,a2
move a2,a14 ;>Move bit 7 to 6 (But 3)
sll 32-6,a2
srl 7,a14
or a14,a2
rl 6,a2
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
or a2,a14
move a14,*a1
#nop3 srl 1,a0 ;P4
jrnc #x
move @SWITCH+>20,a2
not a2
addk 16,a1
sll 32-8,a2
srl 32-8,a2
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
or a2,a14
move a14,*a1
.endif
#x
rets
.if 0
move @GAMSTATE,a0
subk INGAME,a0
jrne #x
move @HALT,a0
jrnz #x
move @plyrproc_t,a0,L ;Get 1st plyr proc
move *a0(plyr_autoctrl),a0
jrnz #x ;Temp computer control?
SUBRP joy_read2 ;Called by reftip
move @PSTATUS,a0 ;Plyr start bits 0-3
movi P1CTRL,a1 ;A1=*PxCTRL
.if TUNIT
move @SWITCH,a2
not a2
srl 1,a0 ;P1
jrnc #nop1
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
move a2,a3
sll 32-8,a3
srl 32-8,a3
or a3,a14
move a14,*a1
#nop1 addk 16,a1 ;P2
srl 1,a0
jrnc #nop2
zext a2
srl 8,a2
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
or a2,a14
move a14,*a1
#nop2
move @SWITCH2,a2
not a2
addk 16,a1 ;P3
srl 1,a0
jrnc #nop3
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
move a2,a3
sll 32-8,a3
srl 32-8,a3
or a3,a14
move a14,*a1
#nop3 srl 1,a0 ;P4
jrnc #x
addk 16,a1
zext a2
srl 8,a2
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
or a2,a14
move a14,*a1
.else
move @SWITCH,a2,L
not a2
srl 1,a0 ;P1
jrnc #nop1
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
move a2,a3
sll 32-8,a3
srl 32-8,a3
or a3,a14
move a14,*a1
#nop1 addk 16,a1 ;P2
srl 8,a2
srl 1,a0
jrnc #nop2
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
move a2,a3
sll 32-8,a3
srl 32-8,a3
or a3,a14
move a14,*a1
#nop2 addk 16,a1 ;P3
srl 1,a0
jrnc #nop3
srl 16,a2
move a2,a14 ;>Move bit 7 to 6 (But 3)
sll 32-6,a2
srl 7,a14
or a14,a2
rl 6,a2
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
or a2,a14
move a14,*a1
#nop3 srl 1,a0
jrnc #x
move @SWITCH+>20,a2
not a2
addk 16,a1
sll 32-8,a2
srl 32-8,a2
move *a1,a14
xor a2,a14 ;New with old. Changed bits are now on
and a2,a14 ;Keep down transitions
sll 8,a14
or a2,a14
move a14,*a1
.endif
#x
rets
.endif
#*******************************
* Check for collision with opponent players
* A8=*Obj
* A13=*Player process
* Trashes scratch
SUBRP plyr_chkpcollide
PUSH a2,a3,a4,a5,a6,a7,a9,a10,a11
movk 2,b1
move *a8(OXPOS),a4
move *a8(OXANI+16),a14
add a14,a4
move a4,a5
move *a8(OSIZEX),a14
move *a8(OIMG),a1,L
move *a1(IFLAGS),a1
jrn #lscl ;Large art?
move a14,a1 ;*75%
srl 2,a1
sub a1,a14
sll 1,a14
#lscl srl 2,a14 ;/4
sub a14,a4 ;A4=Box left
add a14,a5 ;A5=Box rgt
move *a8(OZPOS),a6 ;A6=Z
; move *a8(OIMG),a0,L
; move *a0(ICBZ),a11 ;A11=Z radius (1-?)
; jrnz #test
movk 13,a11
;#test
movi plyrobj_t,a7
move *a13(plyr_num),a0
subk 2,a0
jrge #lp
addi 64,a7
#lp move *a7+,a9,L
; cmp a9,a8
; jreq #next
; move *a9(OPLINK),a14,L
; move *a13(plyr_num),a0
; move *a14(plyr_num),a2
; srl 1,a0
; srl 1,a2
; cmp a0,a2
; jreq #next ;Same team?
move *a9(OZPOS),a2 ;>Chk Z
sub a6,a2
abs a2
move *a9(OIMG),a1,L
move *a1(ICBZ),a3 ;Get Z radius
jrnz #test2
movk 13,a3
#test2 add a11,a3
cmp a3,a2
jrge #next
move *a9(OXPOS),a1 ;>Chk box X
move *a9(OXANI+16),a14
add a14,a1
move *a9(OSIZEX),a14
move *a8(OIMG),a2,L
move *a2(IFLAGS),a2
jrnn #smlscl2 ;Small art?
move a14,a2 ;*75%
srl 2,a2
sub a2,a14
#smlscl2
srl 1,a14 ;/2
add a14,a1
sub a4,a1
jrle #next ;His rgt <= my lft edge?
move a1,a10
add a4,a1
sub a14,a1
sub a14,a1
sub a5,a1
jrge #next ;His lft >= my rgt edge?
move a1,a0 ;A10=Closer edge match
abs a0
cmp a0,a10
jrle #smledge
move a0,a10
#smledge
move *a8(OYPOS),a0
move *a9(OYPOS),a1
addi 75,a1 ;Y difference
cmp a1,a0
jrgt #next ;Opponent much higher?
;>Outer box collision
move *a8(OXVEL),a14,L
abs a14
srl 15,a14
jrnz #otrbnc ;Moving?
move *a8(OZVEL),a2,L
abs a2
srl 15,a2
; jrnz #otrbnc
jrz #chkib ;Not moving?
#otrbnc
PUSH a6,a7
clr a0
clr a1
move *a8(OXVEL),a6,L
move *a8(OZVEL),a7,L
callr seekdir_xyxy128 ;Customize?
PULL a6,a7
move *a13(plyr_num),a2
sll 2,a2 ;*4
move *a9(OPLINK),a1,L
move *a1(plyr_num),a1
add a1,a2
sll 4,a2 ;*16
addi #c_t,a2
move *a2,a2 ;Get my dir variable offset
add a13,a2
move *a2,a2 ;Get dir
sub a0,a2
move a2,a14
abs a14
cmpi >40,a14
jrle #dsml
neg a2
#dsml move a2,a2
jrge #angpos ;Positive angle?
addi >28+>28,a0
#angpos subi >28,a0
addk 4,a0
sll 32-7,a0
srl 32-7+3,a0 ;Leave 4 bits
sll 4,a0
addi #vel_t,a0
move *a0,a1
move *a0(16*4),a0
sll 1,a0
sll 1,a1
move *a8(OXVAL),a14,L
add a0,a14
move a14,*a8(OXVAL),L
move *a8(OZVAL),a14,L
add a1,a14
move a14,*a8(OZVAL),L
#chkib
subk 6,a10
jrle #next ;X edges slightly touching?
move *a9(OZPOS),a1
sub a6,a1
abs a1 ;Z distance
subk 6,a3
cmp a3,a1 ;Z radius
jrge #next
;>Inner box collision
move *a8(OXVEL),a14,L
move *a9(OXVEL),a2,L
move a2,a3
xor a14,a2
move a2,a2
jrn #xvdif ;XV different dir?
move a14,a0
abs a3
abs a0
cmp a3,a0
jrlt #skipxv ;My vel smaller?
xor a14,a2 ;Fix A2
sub a2,a14
#xvdif
move *a8(OXVAL),a1,L
sub a14,a1
move a1,*a8(OXVAL),L
#skipxv
move *a8(OZVEL),a14,L
move *a9(OZVEL),a2,L
move a2,a3
xor a14,a2
move a2,a2
jrn #zvdif ;ZV different dir?
move a14,a0
abs a3
abs a0
cmp a3,a0
jrlt #next ;My vel smaller?
xor a14,a2 ;Fix A2
sub a2,a14
#zvdif
move *a8(OZVAL),a1,L
sub a14,a1
move a1,*a8(OZVAL),L
move *a13(plyr_ownball),a0
jrgt #next ;I have ball?
move *a13(plyr_stagcnt),a10 ;>Add some stagger
move *a9(OPLINK),a14,L
move *a14(plyr_seqflgs),a0
btst DUNK_B,a0
jrz #nodunk ;!Dunking?
btst LAYUP_B,a0
jrnz #nodunk ;Layup=don't disrupt ball
addk 1,a10
move *a13(plyr_num),a0
move *a14(plyr_num),a2
srl 1,a0
srl 1,a2
cmp a0,a2
jreq #nodunk ;Same team?
move *a13(plyr_jmpcnt),a0
jrz #nopop
move *a8(OYPOS),a0
move *a9(OYPOS),a1
addk 9,a1 ;15
cmp a1,a0
jrgt #nopop ;Dunker is higher?
move @slamming,a0 ;Ball already successfully into hoop
jrnz #nopop
move @HCOUNT,a0
sll 32-4,a0
jrnz #noflsh
calla flash_reward
#noflsh
;Shawn, this % should also key off from ptsdown. The % should never get
;higher, but maybe get a bit lower for the good team?
move *a13(plyr_attrib_p),a14,L
move *a14(PAT_DEFSKILL),a0
sll 4,a0
addi tryblk_t,a0
move *a0,a0
; movk 22,a0 ;38,25,21,19
move *a13(plyr_num),a14
; move @plyrnumonfire,a3
; cmp a14,a3
; jrnz #nofire
;;This guy on fire
; movi 75,a0
;#nofire
move @PSTATUS,a3
btst a14,a3
jrnz #cont
movk 18,a0 ;Drone is less
#cont
calla RNDPER
jrls #nopop
; movk >1f,a0
; callr rnd
; jrnz #nopop
calla rejected_dnk_speech
move a13,a3
calla def_play_reward ;Good defensive play reward snds, etc
;If player is still going up, give him ball, otherwise, maybe disrupt dunk
move *a13(plyr_seq),a0
cmpi BLOCKREJ_SEQ,a0
jreq #disrupt
cmpi FASTBLOCKREJ_SEQ,a0
jreq #disrupt
movi 200,a0
calla RNDPER
jrhi #disrupt
move *a8(OYVEL),a0,L
jrn #gvbl
#disrupt
;If coming down, disrupt ball
;MJT
; movi 200,a0
; calla RNDPER
; jrhi #gvbl
;Probably want to give swatter the ball if this is a rebound!
;Check goaltcnt?
; movi deflectd,a0 ;deflected!
; calla snd_play1
move *a13(plyr_dir),a0
calla sinecos_get
move @ballobj_p,a2,L
sll 4,a0
sll 4,a1
move a0,*a2(OZVEL),L
move a1,*a2(OXVEL),L
movi -GRAV*21,a1 ;Towards roof
move a1,*a2(OYVEL),L
movi -1,a0
move a0,@ballpnum
move a0,@ballpnumlast
calla ball_convfmprel
move *a9(OPLINK),a14,L
clr a0
move a0,*a14(plyr_ownball)
movk 15,a0
move a0,*a13(plyr_shtdly)
move a0,*a14(plyr_shtdly)
jruc #nopop
#gvbl
move *a13(plyr_num),a0 ;Give defender the ball
move a0,@ballpnum
clr a0
move a0,*a13(plyr_dribmode)
; movi steal_snd,a0
; calla snd_play1
#nopop
; move @plyrcharge,a0
; addk 1,a0
; move a0,@plyrcharge
#nodunk move *a14(plyr_jmpcnt),a3
jrz #ongnd
addk 1,a10 ;Collided with a jumper
#ongnd
move *a13(plyr_seqflgs),a2
btst EASYSTAG_B,a2
jrz #nesy ;!An easy stagger?
move *a13(plyr_num),a0
move *a14(plyr_num),a2
srl 1,a0
srl 1,a2
cmp a0,a2
jreq #setstg ;Same team?
addk 1,a10
#nesy
#setstg move a10,*a13(plyr_stagcnt)
#next dsj b1,#lp
#x PULL a2,a3,a4,a5,a6,a7,a9,a10,a11
rets
tryblk_t
.word 1,2,3,10,15,18,22,23,24,25,25
#c_t .word 0,plyr_tmdir,plyr_o1dir,plyr_o2dir
.word plyr_tmdir,0,plyr_o1dir,plyr_o2dir
.word plyr_o1dir,plyr_o2dir,0,plyr_tmdir
.word plyr_o1dir,plyr_o2dir,plyr_tmdir,0
#vel_t
.word -16384,-15137,-11585,-6270
.word 0,6270,11585,15137,16384,15137,11585,6270
.word 0,-6269,-11585,-15137,-16384,-15137,-11585,-6270
#*******************************
* Change the players image
* A0=*New image
* A1=New OCTRL (low 8 bits)
* A8=*Obj
* A13=*Plyr process
* Trashes scratch, A2,A3
SUBRP plyr_ani
cmpi ROM,a0
jrlo #anierr
move a0,a2
move a1,a3
callr anipt_getsclxy
movb a3,*a8(OCTRL)
move a2,*a8(OIMG),L
move *a2(0),*a8(OSIZE),L
move *a2(ISAG),*a8(OSAG),L
move *a13(plyr_attrib_p),a14,L
move *a14,a14,L ;Get *scale_t
move *a2(IFLAGS),a2
jrnn #small ;Bit15 = Scale
addi SCALETSIZE,a14 ;>c80
;Shawn, help!
move @baby_flag,a2
jrz #cont
addi SCALETSIZE,a14 ;Funny option - small bodies
jruc #cont
#small
move @baby_flag,a2
jrz #cont
addi >1a00,a14 ;Small bodies for small artwork
#cont
move a14,*a8(ODATA_p),L
move a0,a2
move a1,a3
callr anipt_getsclxy
sub a0,a2 ;Subtract new from old
sub a1,a3
move a0,*a8(OXANI),L ;Save scaled anipt
sra 16,a1
move a1,*a13(plyr_aniy)
move a8,a0 ;Get base address
addi OXVAL,a0
move *a0,a14,L ;New OXVAL
add a2,a14
move a14,*a0+,L
move *a0,a14,L ;New OYVAL
add a3,a14
move a14,*a0,L
#x rets
#anierr
.if DEBUG
LOCKUP
eint
.else
CALLERR 2,2
.endif
jruc #x
#*******************************
* Start player jumping (block, shoot, dunk)
* A8=*Plyr obj
* A13=*Plyr process
* Trashes scratch, A2-A5
SUBRP plyr_startjmp
PUSH a6,a7
;MJT
move *a13(plyr_ownball),a5
jrz #blk ;We don't have ball?
move *a13(plyr_ohoopx),a6
movi CZMID,a7
callr seekdirdist_obxz128
move *a13(plyr_newdir),a4 ;Get old
move a0,*a13(plyr_newdir) ;Turn toward basket
move a5,a5
jrlt #blkd ;Teammate has ball?
clr a14
move a14,@reduce_3ptr
cmpi 400,a1
jrge #desp ;Long shot?
cmpi 270,a1
jrge #3ptr ;3ptr
cmpi 200,a1
jrge #tag1
move *a13(plyr_seqdir),a14
jrz #ahook
subk 4,a14
jrne #tag1
#ahook
move *a13(plyr_ohpdir),a14
addk 8,a14 ;Round off
sll 32-7,a14
srl 32-7+4,a14 ;Kill frac
jrz #tag1
cmpi 4,a14
jrz #tag1
move *a13(plyr_num),a2
srl 1,a2
jrz #tg1 ;Team1?
cmpi 5,a14
jrlt #tag1 ;Team 2 behind hoop
jruc #tgx
#tg1 cmpi 4,a14
jrge #tag1
#tgx
move *a13(plyr_ohpdist),a14
cmpi 40h,a14 ;48h
jrlt #tag1 ;Too close for hook?
move *a8(OZPOS),a14
cmpi >430,a14
jrlt #tag1
cmpi >4fa,a14
jrgt #tag1
;Okay to do hook!
move a4,*a13(plyr_newdir) ;Turn toward basket
jruc #hs ;Hook shot
#tag1
move a0,a3
move a1,a4
;>Skip dunks from behind the hoop
addk 8,a0 ;Round off
sll 32-7,a0
srl 32-3,a0 ;Kill frac
move *a13(plyr_num),a14
srl 1,a14
jrnz #lhoop ;Team2?
subk 5,a0
jrlt #trydunk
jruc #sj
;If behind hoop, I will try to do a hook shot...
#lhoop move a0,a0
jrz #trydunk
subk 4,a0
jrlt #sj
#trydunk ;>Try a dunk
cmpi 60,a4
jrle #velok ;Close to hoop?
move *a13(plyr_dir),a14
sub a3,a14
abs a14
cmpi >40,a14
jrle #nodov
subi >80,a14
abs a14
#nodov
subk 24,a14
jrgt #sj ;!Facing basket?
;Shawn, stop dunker if he just made a real quick move. Should we do this?
; move *a13(plyr_dirtime),a14
; subk 4,a14
; jrgt #dnk_ok
; nop
; jruc #sj
;
;#dnk_ok
cmpi 170,a4 ;Max dunk range
jrge #sj ;Too far for dunk?
; cmpi 36,a4 ;Short range
; jrle #sj ;Too close?
move *a8(OXVEL),a14,L ;>Chk velocity
abs a14
srl 16,a14
jrnz #velok
move *a8(OZVEL),a14,L
abs a14
srl 16,a14
jrz #sj
#velok
;Perhaps allow big guys to dunk through anybody!
move *a13(plyr_attrib_p),a0,L
move *a0(PAT_POWER),a0
sll 4,a0
addi dnkthru_t,a0
move *a0,a0
calla RNDPER
jrhi #dunk ;Yes, jump over anybody!
; movk 7,a0 ;12%
; callr rnd
; jrz #dunk ;Ignore opponents?
;Get opponents defense of dunks info
movi 64,a7
move *a13(plyr_num),a14
cmpi 2,a14
jrlt #tm1
clr a7
#tm1
movi plyrproc_t,a14,L
add a7,a14
move *a14,a14,L
move *a14(plyr_num),a7
move @plyrnumonfire,a0
cmp a0,a7
jrnz #nof1
;This defender is on fire! Make his defense of dunkers the best!
movk 11,a0
jruc #gdd
#nof1
move *a14(plyr_attrib_p),a14,L
move *a14(PAT_DEFSKILL),a0
#gdd
sll 4,a0
movi #dist_t,a14
add a0,a14
move *a14,a2 ;Distance check
movi #width_t,a14
add a0,a14
move *a14,a0 ;Get width of check ;Distance check
move *a13(plyr_o1dist),a14
cmp a14,a4
jrlt #o1dok ;I'm closer?
; cmpi 50,a14
cmp a2,a14
jrgt #o1dok ;He's too far?
move *a13(plyr_o1dir),a2
sub a3,a2
abs a2
cmpi >40,a2
jrle #o1dsml
subi >80,a2
abs a2
#o1dsml
; subk 32,a2
sub a0,a2
jrlt #trylyup ;In front of me?
#o1dok
movi 64,a7
move *a13(plyr_num),a14
cmpi 2,a14
jrlt #tm1a
clr a7
#tm1a
movi plyrproc_t+32,a14,L
add a7,a14
move *a14,a14,L
move *a14(plyr_num),a7
move @plyrnumonfire,a0
cmp a0,a7
jrnz #nof2
;This defender is on fire! Make his defense of dunkers the best!
movk 11,a0
jruc #gdd2
#nof2
move *a14(plyr_attrib_p),a14,L
move *a14(PAT_DEFSKILL),a0
#gdd2
sll 4,a0
movi #dist_t,a14
add a0,a14
move *a14,a2 ;Distance check
movi #width_t,a14
add a0,a14
move *a14,a0 ;Get width of check ;Distance check
move *a13(plyr_o2dist),a14
cmp a14,a4
jrlt #o2dok ;I'm closer?
; cmpi 50,a14
cmp a2,a14
jrgt #o2dok ;He's too far?
move *a13(plyr_o2dir),a2
sub a3,a2
abs a2
cmpi >40,a2
jrle #o2dsml
subi >80,a2
abs a2
#o2dsml
; subk 32,a2
sub a0,a2
jrlt #trylyup ;In front of me?
#o2dok
#dunk move a3,*a13(plyr_dir)
movi -1,a14
move a14,*a13(plyr_newdir) ;Cancel turn
addk 8,a3 ;Round off
srl 4,a3 ;Kill frac
sll 5,a3 ;*32
.ref getdunkseq
calla getdunkseq
move a0,a0
jrnz #sj
clr a0
move a0,@shot_distance
movk DUNK_SHORT,a0
cmpi 80,a4
jrle #short
movk DUNK_MED,a0
cmpi 120,a4
jrle #med
movk DUNK_LONG,a0
#short
#med
move a0,@shot_type
move *a3,a2,L
move *a2+,a0 ;#Entries-1
callr rndrng0
sll 4,a0 ;*16
add a2,a0
move *a0,a0
jrz #sj ;Null entry?
; movi DUNKA_SEQ,a0
; movi DUNKA2_SEQ,a0
; movi DUNKB_SEQ,a0
; movi DUNKB2_SEQ,a0
; movi DUNKC_SEQ,a0
; movi DUNKD_SEQ,a0
; movi DUNKD2_SEQ,a0
; movi DUNKE_SEQ,a0
; movi DUNKE2_SEQ,a0
; movi DUNKF_SEQ,a0
; movi DUNKG_SEQ,a0
; movi DUNKG2_SEQ,a0
; movi DUNKJ_SEQ,a0
; movi DUNKJ2_SEQ,a0
; movi DUNKJ3_SEQ,a0
; movi DUNKJ4_SEQ,a0
; movi DUNKK_SEQ,a0
; movi DUNKK2_SEQ,a0
; movi DUNKL_SEQ,a0
; movi DUNKL2_SEQ,a0
; movi DUNKL3_SEQ,a0
; movi DUNKL4_SEQ,a0
; movi DUNKN_SEQ,a0
; movi DUNKN2_SEQ,a0
; movi DUNKO_SEQ,a0
; movi DUNKO2_SEQ,a0
; movi DUNKP_SEQ,a0
; movi DUNKP2_SEQ,a0
; movi DUNKP3_SEQ,a0
; movi DUNKQ_SEQ,a0
; movi DUNKQ2_SEQ,a0
; movi DUNKQ3_SEQ,a0
; movi DUNKQ4_SEQ,a0
; movi DUNKR_SEQ,a0
; movi DUNKR2_SEQ,a0
; movi DUNKS_SEQ,a0
; movi DUNKS2_SEQ,a0
; movi DUNKT_SEQ,a0
; movi DUNKT2_SEQ,a0
; movi DUNKT3_SEQ,a0
; movi DUNKT4_SEQ,a0
; movi DUNKT5_SEQ,a0
; movi DUNKV_SEQ,a0
; movi DUNKV2_SEQ,a0
; movi DUNKW_SEQ,a0
; movi DUNKW2_SEQ,a0
; movi DUNKW3_SEQ,a0
; movi DUNKY_SEQ,a0
; movi DUNKY2_SEQ,a0
; movi DUNKZ_SEQ,a0
; movi DUNKZ2_SEQ,a0
; movi DUNKZ3_SEQ,a0
; movi DUNKLAY7_SEQ,a0
; movi DUNKZ5_SEQ,a0
; movi DUNKZ4_SEQ,a0
; movi DUNKZ6_SEQ,a0
; movi DUNKZ7_SEQ,a0
; movi DUNKZ8_SEQ,a0
; movi DUNKZ9_SEQ,a0
; movi DUNKZ10_SEQ,a0
; movi DUNKZ11_SEQ,a0
; movi DUNKB3_SEQ,a0
;Dunks below here require scroller to pan up higher (Already works)
; movi DUNKU_SEQ,a0
; movi DUNKU2_SEQ,a0
; movi DUNKU3_SEQ,a0
; movi DUNKU4_SEQ,a0
; movi DUNKU5_SEQ,a0
; movi DUNKU6_SEQ,a0
; movi DUNKX_SEQ,a0
; movi DUNKX2_SEQ,a0
; movi DUNKX3_SEQ,a0
; movi DUNKLAY2_SEQ,a0
; movi DUNKLAY3_SEQ,a0
; movi DUNKLAY4_SEQ,a0
; movi DUNKLAY5_SEQ,a0
; movi DUNKLAY3A_SEQ,a0
; movi DUNKLAY_SEQ,a0
; movi DUNKLAY6_SEQ,a0
.if DEBUG
;Shawn, I'm stuffing the dunk into ram so I can pause the game when someone
;has a problem with a dunk and I can jot down the dunk # and fix it.
.bss debug_dunk_num,16
.ref slowmotion
move a0,@debug_dunk_num
clr a1
move a1,@slowmotion
.endif
move a0,a2
CREATE0 start_animate
cmpi DUNKX_SEQ,a2
jreq #smk
cmpi DUNKX2_SEQ,a2
jreq #smk
cmpi DUNKX3_SEQ,a2
jrne #nosmk
#smk CREATE0 plyr_smoketrail
move a13,*a0(PA10),L
#nosmk move a2,a0
movk 2,a14
move a14,@ballptsforshot
move *a13(plyr_dir),a7
callr plyr_setseq ;Dunk!
move *a13(plyr_num),a14
srl 1,a14
jrz #x ;Team1?
movi M_FLIPH,a14
move a14,*a13(plyr_anirevff)
jruc #x
;strtsnd SLEEP 40
; movi dnk_snd,a0
; calla snd_play1
; SLEEP 180
; movi push1_snd,a0
; calla snd_play1
; DIE
;
;push1_snd .word >fd85,15,>8160,0 ;Push ugh
;dnk_snd .word >fda9,120,>8167,0
dnkthru_t
.word 0,0,0,0,0,0,0,100,150,250,350
#dist_t .word 40,43,46,49,50,52,54,56,68,70,72,95
#width_t
.word 27,29,31,33,36,37,38,39,40,43,45,70
#trylyup
move @HCOUNT,a14
btst 0,a14
jrnz #sj
move *a13(plyr_ohpdist),a14
cmpi 138,a14
jrgt #sj
cmpi 35,a14
jrlt #sj
move a3,*a13(plyr_dir)
movi -1,a14
move a14,*a13(plyr_newdir) ;Cancel turn
movk 2,a0
move a0,@ballptsforshot
movk FINGER_ROLL,a0
move a0,@shot_type
movi LAYUP_SEQ,a0
jruc #sseq
#hs
movk 2,a4
move a4,@ballptsforshot
movk HOOK_SHOT,a0
move a0,@shot_type
movk HOOK_SEQ,a0
move *a13(plyr_turbon),a4
jrnz #hs1
movk HOOK2_SEQ,a0 ;Not a high arc
#hs1 move *a13(plyr_dir),a7
callr plyr_setseq
move *a13(plyr_num),a14
srl 1,a14
jrz #x ;Team1?
movi M_FLIPH,a14
move a14,*a13(plyr_anirevff)
jruc #x
#sj ;>Start a jump shot seq
movk 2,a4
move *a8(OZPOS),a0
subi CZMIN+18,a0
jrlt #3ptra
cmpi CZMID+178-(CZMIN+18),a0
jrgt #3ptra
srl 2,a0 ;/4
sll 4,a0 ;*16
addi #3pt_t,a0
move *a0,a0
move *a8(OXPOS),a2
move *a8(OXANI+16),a14
add a14,a2
subi WRLDMID,a2
abs a2
cmp a0,a2
jrgt #2ptr ;Far from center court?
;3ptr from behind arc
sub a2,a0
cmpi 16h,a0
jrlt #3ptrx
movk 1,a0
move a0,@reduce_3ptr
; LOCKUP
jruc #3ptrx
; addi WRLDMID,a0 ;3point DEBUG
; sub a14,a0
; move a0,*a8(OXPOS)
;#3ptr clr a0
; move a0,*a13(plyr_nojoy)
; movk STNDDRIB_SEQ,a0
; jruc #sseq
;3ptr from sideline top or bottom
#3ptra
; LOCKUP
jruc #3ptrx
;3ptr from way downtown
#3ptr movk 1,a4
move a4,@reduce_3ptr
move a1,a1
; LOCKUP
#3ptrx
movk 3,a4
move *a13(plyr_ohpdist),a0
cmpi 310,a0 ;distance from hoop
jrle #nrm_3
movk LONG_RANGE,a0
move a0,@shot_type
jruc #contxy
#nrm_3
movk _3_POINTS,a0
move a0,@shot_type
jruc #contxy
#2ptr
movk _2_POINTS,a0
move a0,@shot_type
#contxy
move a4,@ballptsforshot
movk SHOOT_SEQ,a0
move *a13(plyr_shtbutn),a14
jrnz #notq
movk 1,a14
move a14,*a13(plyr_shtbutn)
movk QSHOOT_SEQ,a0
#notq
jruc #sseq
#desp
movi DESPERATION,a0
move a0,@shot_type
movk 3,a14
move a14,@ballptsforshot
;This is a heave grenade toss
;only do it if under 5 seconds in quarter
movk SHOOTDESP2_SEQ,a0 ;Heave
move @game_time,a14,L
cmpi >500,a14
jrlt #heave ;Do it
move @PCNT,a0
ANDK 1,a0
sll 1,a0
addk SHOOTDESP_SEQ,a0
#heave
move *a13(plyr_newdir),a14
move a14,*a13(plyr_dir)
movi -1,a14
move a14,*a13(plyr_newdir)
jruc #sseq
#blk
move *a13(plyr_rcvpass),a0
jrgt #x ;Waiting on pass?
move @ballpnum,a14
jrn #inair
sll 5,a14 ;*32
addi plyrproc_t,a14
move *a14,a14,L
move *a14(plyr_seqflgs),a0
btst SHOOT_B,a0
; jrz #faceb ;!Shooting?
jrnz #inair
;Slow down drift fr this blocker!
move *a8(OXVEL),a0,L
sra 1,a0
move a0,*a8(OXVEL),L
move *a8(OYVEL),a0,L
sra 1,a0
move a0,*a8(OYVEL),L
move *a8(OZVEL),a0,L
sra 1,a0
move a0,*a8(OZVEL),L
move @ballobj_p,a5,L
move *a5(OXPOS),a6
addk 6,a6
move *a5(OZPOS),a7
PUSH A0
callr seekdirdist_obxz128
move a0,*a13(plyr_newdir) ;Turn toward ball
PULL A0
btst DUNK_B,a0
jrz #blkd
movk 7,a0
calla rndrng0
sll 5,a0
addi blktype_t,a0
move *a0,a0,L
jruc #sseq
blktype_t
.long BLOCK_SEQ,BLOCK_SEQ,BLOCK_SEQ,BLOCK_SEQ
.long REBOUND_SEQ,BLOCKREJ_SEQ
.long REBOUND_SEQ,FASTBLOCKREJ_SEQ
#inair move @ballobj_p,a5,L
move *a5(OYPOS),a1
cmpi -20,a1
jrge #faceb ;Ball close to gnd?
move *a5(OXVAL),a6,L
move *a5(OXANI),a14,L
add a14,a6
move *a5(OZVAL),a7,L
move @ballpnum,a14
jrge #chkdist ;Other team has ball?
movk 20,a0
move *a5(OXVEL),a1,L
mpys a0,a1
add a1,a6
move *a5(OZVEL),a1,L
mpys a0,a1
add a1,a7
#chkdist
sra 16,a6
sra 16,a7
callr seekdirdist_obxz128
move a0,*a13(plyr_newdir) ;Turn where ball is headed
cmpi 120,a1
jrge #blkd ;Too far to jump?
movk 1,a0 ;50%
move @ballpnum,a1
jrge #dornd
move @ballgoaltcnt,a14
jrle #dorb ;Do rebound?
movk 1,a0 ;50%
#dornd callr rnd
jrnz #dorej
;MJT
;Weak shot blockers will do swat, not grab!
move *a13(plyr_attrib_p),a14,L
move *a14(PAT_DEFSKILL),a0
cmpi 5,a0
jrlt #dorej
#dorb movk REBOUND_SEQ,a0
jruc #sseq
#dorej movk BLOCKREJ_SEQ,a0
jruc #sseq
#faceb move @ballobj_p,a5,L
move *a5(OXPOS),a6
addk 6,a6
move *a5(OZPOS),a7
callr seekdirdist_obxz128
move a0,*a13(plyr_newdir) ;Turn toward ball
#blkd movk BLOCK_SEQ,a0
#sseq move *a13(plyr_dir),a7
callr plyr_setseq
#x PULL a6,a7
rets
********************************
#3pt_t
.word 193
.word 187,175,166,158,153,144,138,130
.word 125,120,115,110,106,102,100,98
.word 96,94,92,89,86,84,82,80
.word 80,79,79,79,78,78,78,77
.word 77,77,77,77,77,77,77,78
.word 78,79,81,82,83,84,85,86
.word 87,88,89,90,91,92,94,95
.word 96,98,100,104,108,113,116,120
.word 124,129,133,138,141,145,148,153
.word 157,162,166,175,180,186,191,198
.word 204,214,230,230
#*******************************
* Player takes a shot (also called by seq)
* A8=*Plyr obj
* A13=*Plyr process
* Trashes scratch, A2-A5
SUBR plyr_shoot
PUSH a6,a7,a9,a10,a11
move *a13(plyr_num),a0
move @ballpnum,a1
cmp a0,a1
jrne #x
; .ref do_ball_spark
;
; move @GAMSTATE,a0
; cmpi INAMODE,a0
; jrnz #nofake
; CREATE0 do_ball_spark
;#nofake
move @plyrnumonfire,a14
cmp a0,a14
jrne #cold
movi fball_snd,a0
calla snd_play1
#cold
callr plyr_setballxyz
move *a13(plyr_ohoopx),a6
movi CZMID,a7
callr seekdirdist_obxz128
move a0,a10
move a1,a11 ;A11=Hoop distance
move *a13(plyr_attrib_p),a7,L
move *a7(PAT_SHOTSKILL),a9
; movi 1000,a9 ;A9=Base %
move @ballptsforshot,a0
cmpi 3,a0
jrnz #oui
cmpi 1025,a9
jrgt #oui
;Stat #0-4 reduce 3-ptrs
subi 200,a9
#oui
move @reduce_3ptr,a0
jrz #no3
subi 15,a9 ;150?
#no3
cmpi 70h,a11
jrgt #notshort
; movi 1150,a9 ;A9=Base %
addi 250,a9
#notshort
cmpi >130,a11
jrlt #notlong
subi 990,a9 ;680 ;790 ;890
; LOCKUP
; movi 10,a9 ;1%
#notlong
move *a13(plyr_num),a4 ;>Get opponents dir/dist
srl 1,a4
movk 1,a14
xor a14,a4
sll 6,a4 ;*64
addi plyrobj_t,a4
move *a4+,a0,L
move *a0(OYPOS),a3
callr seekdirdist_obob128
cmpi 40,a1 ;35
jrgt #1far2 ;Opponent too far?
subi 240,a9 ;-24% ;10%
#1far2 cmpi 75,a1 ;70
jrgt #1far ;Opponent too far?
sub a10,a0
abs a0
cmpi >40,a0
jrle #1dsml
subi >80,a0
abs a0
#1dsml subk 20,a0
jrge #1far ;Not between me and hoop?
sll 2,a1 ;*4
subi 390,a1 ;-320 to -40 ;320
move *a8(OYPOS),a2
sub a3,a2
jrle #1ihi ;Shooter higher?
addk 8,a2
mpys a2,a1
sra 3,a1 ;/8
#1ihi add a1,a9 ;Decrease accuracy
#1far
move *a4+,a0,L
callr seekdirdist_obob128
cmpi 40,a1
jrgt #2far2 ;Opponent too far?
subi 240,a9 ;-25%
#2far2 cmpi 75,a1
jrgt #2far ;Opponent too far?
sub a10,a0
abs a0
cmpi >40,a0
jrle #2dsml
subi >80,a0
abs a0
#2dsml subk 20,a0
jrge #2far ;Not between me and hoop?
sll 2,a1 ;*4
subi 390,a1 ;-320 to -40 ;320
move *a8(OYPOS),a2
sub a3,a2
jrle #2ihi ;Shooter higher?
addk 8,a2
mpys a2,a1
sra 3,a1 ;/8
#2ihi add a1,a9 ;Decrease accuracy
#2far
move a11,a14
sll 1,a14 ;*2
sub a14,a9
cmpi 50,a9
jrge #accok
movi 50,a9
#accok
; CREATE >6000,plyr_showshotpercent
;If player has thrown up 4 bricks, make next shot go in!
move *a13(plyr_num),a0
sll 4,a0 ;x 16
addi brick_count,a0
move *a0,a1 ;brick_count++
cmpi 3,a1
jrlt #nohelping
; LOCKUP
movi 990,a9
#nohelping
move *a13(plyr_ptsdown),a1 ;>Adjust shot %
move a1,a2
movk 20,a0 ;20
mpys a0,a1
add a1,a9 ;+/-2% per point difference
cmpi 50,a9
jrge #minok
movi 50,a9
#minok
*If end of qrtr/game, affect shots like this:
*
* 1. If 4th or overtime qrtr has 5 seconds or less remaining and
*
* a. If score is already tied or I am ahead, do nothing.
* b. This shot (2 or 3) would tie the score, then make it go in 75% of
* the time. (Regardless of shot distance)
* c. This shot (2 or 3) would win the game, then make it go in at
* least 30% of the time (Close in would be higher, but even bombs
* go in 30%)
* d. If this shot would pull me to within 1/2 points, then make it go
* in 90% of the time for max excitement without putting him ahead.
*
* 2. If 1/2/3rd qrtr has 5 seconds or less remaining and
*
* a. If score is already tied or I am ahead, do nothing.
* b. This shot (2 or 3) would tie the score, then make it go in 40% of
* the time at least. (Regardless of shot distance)
* c. If this shot would pull me to within or ahead by 1/2 points, then
* make it go in 50% of the time for max excitement)
* d. If I am losing by a larger margin than 4, then make it go in at
* least 60%. (Regardless of shot distance)
;MJT
movi 55,a0 ;80
calla RNDPER
jrls nomis
move *a13(plyr_ptsdown),a1 ;>Adjust shot %
jrgt nomis
movi 150,a9
nomis
move @game_time,a1,L
cmpi >400,a1
jrgt #nohelp
move a2,a0
jrnz #tryh
;Game tied in 4th quarter
move @gmqrtr,a1
subk 3,a1
jrlt #nohelp
movi 50,a9 ;Last second shot of a tie game
;should not go in at the game buzzer
jruc #nohelp ;Not if tied
#tryh jrgt #tryhelp
cmpi -5,a0
jrgt #nohelp ;Winning by less than 5
move @gmqrtr,a1
subk 3,a1
jrlt #nohelp
;I'm winning big, if end of game, allow shot to go in.
move @game_time,a1,L
cmpi >200,a1
jrgt #losingbige
jruc #willtie
#tryhelp
; move @game_time,a1,L
; cmpi >200,a1
; jrgt #nobuzz
;
;#nobuzz
move a2,a0
move @ballptsforshot,a14
move @gmqrtr,a1
subk 3,a1
jrge #endg ;End game help?
subk 5,a0
jrgt #losingbig
cmp a2,a14
jreq #willtie ;This shot would tie up score!
movi 100,a3 ;Losing by 1-5
jruc #chkper
#losingbig
movi 120,a3 ;Losing by more than 5 points
jruc #chkper
#willtie
movi 120,a3 ;This will tie game
jruc #chkper
#endg
subk 4,a0
jrge #losingbige
cmp a2,a14
jrz #willtiee ;This shot would tie up score!
;Drone team trying to win at buzzer?
move *a13(plyr_num),a14
move @PSTATUS,a0
btst a14,a0
jrnz #okok
XORK 1,a14
btst a14,a0
jrnz #okok
;Drone+Drone trying to win the game!
movi 100,a3 ;This will tie game at end
jruc #chkper
#okok
movi 380,a3 ;Losing by 1-5
jruc #chkper
#losingbige ;Losing by more than 5 points
movi 300,a3
jruc #chkper
#willtiee
movi 800,a3 ;This will tie game at end
#chkper cmp a3,a9
jrge #nohelp
move a3,a9
#nohelp
; movi 950,a9
move @ballobj_p,a7,L ;A7=*Ball obj
move *a7(OPLINK),a0,L
move *a0(ball_onfire),a14
jrz #nofire
addi 750,a9 ;Player is on fire!
cmpi >148,a11
jrlt #nofire
movi 100,a9 ;Player is on fire!
#nofire
move *a7(OIMG),a3,L ;>Convert ball from player relative
move *a3(IANIOFFX),a3
sll 16,a3
move *a7(OXANI),a14,L
move a3,*a7(OXANI),L
sub a14,a3 ;Ani difference
sra 16-5,a3
move *a7(OZPOS),a14 ;894 to 1379 (Z range 486)
addi (819-GZBASE),a14 ;768 to ?
mpys a14,a3
move a3,a14
sra 2,a14 ;/4
sub a14,a3
sra 1,a14 ;/2
sub a14,a3
sll 16-(14+1),a3 ;*64k /16k /2
move *a13(plyr_seq),a0 ;>Adjust pos for desp shots
cmpi DUNKLAY5_SEQ,a0
jrnz #ck2
movi [-10,0],a3
movi [7,0],a14
addi 760,a9 ;720
jruc #fixperc
#ck2
cmpi DUNKLAY4_SEQ,a0
jrnz #ck3
movi [-1,0],a3
movi [-1,0],a14
addi 760,a9
jruc #fixperc
#ck3
cmpi DUNKLAY3_SEQ,a0
jrnz #ck4
movi [-10,0],a3
movi [10,0],a14
addi 760,a9
jruc #fixperc
#ck4
; cmpi DUNKLAY2_SEQ,a0
; jrnz #ck5
; movi [-10,0],a3
; movi [10,0],a14
; addi 690,a9
; jruc #fixperc
;#ck5
cmpi DUNKLAY2_SEQ,a0
jrnz #ck6
movi [10,0],a3
addi 760,a9
move *a13(plyr_num),a14
cmpi 2,a14
jrlt #ok1
movi [-8,0],a3
jruc #ok1
#ck6
cmpi DUNKLAY3A_SEQ,a0
jrnz #ck6a
movi [-10,0],a3
movi [5,0],a14
addi 760,a9
jruc #fixperc
#ck6a
cmpi DUNKLAY6_SEQ,a0
jrnz #ck7
movi [15,0],a3
addi 760,a9
move *a13(plyr_num),a14
cmpi 2,a14
jrge #ok1
movi [-15,0],a3
jruc #ok1
#fixperc
move *a13(plyr_seqdir),a0
cmpi 5,a0
jrge #ok1
move a14,a3
#ok1
;MJT
;Block layups more readily
; movi 690,a0
movi 750,a0 ;700
calla RNDPER
jrhi #fixde
;Don't allow layup to be blocked!
movi TSEC*2-20,a0
callr plyr_setshtdly ;Don't block layups!
jruc #fixde
#ck7
cmpi LAYUPREB_SEQ,a0
jreq #ly ;Layup?
cmpi DUNKLAY_SEQ,a0
jreq #ly ;Layup?
cmpi LAYUP_SEQ,a0 ;Put back layup
jrne #noly0
#ly
callr lay_perc
move *a13(plyr_seqdir),a0
sll 5,a0
addi adjst_t,a0
move *a0,a3,L
; move *a7(OYPOS),a5
; subk 1,a5
; movi [-8,0],a3
; move a5,*a7(OYPOS)
jruc #fixde
adjst_t .long 0,[7,0],[11,0],[6,0],[0,0],[-8,0],[-8,0],[-8,0]
lay_perc
; movi 890,a9 ;Make those layups go in...
movi 870,a9 ;800
move *a13(plyr_ptsdown),a1 ;>Adjust shot %
jrgt #noms
;fix
; jruc #noms
movi 100,a0
calla RNDPER
jrls #noms
movi 450,a9 ;250
#noms
; movi 600,a0 ;450
movi 700,a0 ;650
calla RNDPER
jrhi #xx
movi TSEC*2,a0
callr plyr_setshtdly ;Don't block layups!
#xx rets
#noly0
move *a13(plyr_seqflgs),a14 ;>Adjust pos for desp shots
btst LAYUP_B,a14
jrz #noly
;Funky new layups
callr lay_perc
jruc #fixde
#noly
cmpi HOOK_SEQ,a0
jreq #extra
cmpi HOOK2_SEQ,a0
jrne #noextra
#extra
movi 600,a9 ;750
PUSH a0
movi 120,a0
calla RNDPER
jrls #noms1
movi 250,a9
#noms1
PULL a0
#noextra
subk SHOOTDESP_SEQ,a0
jrne #fixd2
move *a7(OYPOS),a5
subk 8,a5
jruc #fixdy
#fixd2 subk 1,a0 ;SHOOTDESP2_SEQ
jrne #fixd3
clr a3
move *a7(OYPOS),a5
subk 4,a5
jruc #fixdy
#fixd3 subk 1,a0 ;SHOOTDESP3_SEQ
jrne #fixde
sra 1,a3
move *a7(OYPOS),a5
subk 2,a5
#fixdy move a5,*a7(OYPOS)
#fixde
move *a7(OXVAL),a14,L ;Adjust X
sub a3,a14
move a14,*a7(OXVAL),L
move a10,a3
move a11,a1
sll 32-6,a3
srl 32-6,a3
subk >20,a3
abs a3 ;0-32
move *a13(plyr_ohpdist),a14 ;distance from hoop
move a14,@shot_distance
movk 1,a14
move a14,@shot_percentage ;start at 100%
;Put this on a secret button combo
move @show_shot,a14
.ref show_shot
jrz #nosp
PUSH a1,a7
CREATE >6000,plyr_showshotpercent
PULL a1,a7
#nosp
movk 1,a10 ;A10=At hoop
PUSH a1
movi 16,a0
calla RNDPER
jrls #noflat0
clr a10
#noflat0
move *a13(plyr_seqflgs),a14
btst LAYUP_B,a14
jrz #noflat
;Maybe give ball a flat arc!
movi 100,a0
calla RNDPER
jrls #noflat
clr a10
#noflat
PULL a1
; jruc #miss ;DEBUG
; jruc #good ;DEBUG
subk 24,a3
jrge #athoop ;At bad backboard angle?
cmpi 100,a1
jrgt #longshot ;Too far for bank?
; jruc #offbb ;DEBUG
; movk 2,a0
; move *a13(plyr_seqflgs),a14
; btst LAYUP_B,a14
; jrnz #fmfront
move *a13(plyr_seq),a14
cmpi DUNKLAY5_SEQ,a14
jrz #offbb
movk 4,a0 ;20%
addk 24-16,a3
jrlt #fmfront
movk 3,a0 ;25%
#fmfront
callr rndrng0
move a0,a0
jrnz #athoop
#offbb ;>Close bank shot
move @plyrnumonfire,a0
jrnn #athoop ;cont
;;Someone is on fire - do not allow bank shots if it is opposition!
; move *a13(plyr_num),a14
; cmp a0,a14
; jrz #cont
; XORK 1,a0
; cmp a0,a14
; jrnz #athoop
#cont
clr a10
move *a7(OZPOS),a0
subi CZMID,a0 ;Z delta
move a0,a3
sll 8,a3
move *a13(plyr_ohoopx),a1
move *a7(OXPOS),a14
sub a14,a1
move *a7(OXANI+16),a14
sub a14,a1 ;X delta
abs a1
sll 8+2,a1
abs a0
jrz #nodiv ;Same Z?
divu a0,a1
#nodiv
addi 512,a1 ;2
divs a1,a3
move a3,a2 ;Z
movi 999,a0
callr rndrng0
cmp a0,a9
jrgt #bgood
; movk 14,a0 ;Miss
; callr rndrng0
; subk 7,a0
; move a0,a2 ;Z
#bgood
movi -10,a0 ;X
movi -18,a1 ;Y
jruc #calcshot
#longshot
movk 3,a0
callr rnd
jrnz #athoop ;75%?
movi 999,a0 ;>Long bank shot
callr rndrng0
cmp a0,a9
jrle #miss
movi -10,a0 ;X
movi -30,a1 ;Y
clr a2 ;Z
addk 24-16,a3
jrlt #calcshot ;In front of board?
jruc #good ;Do good shot at hoop
#athoop
cmpi 55,a9 ;25
jrge #notlng
cmpi >148,a11
jrlt #notlng
movi 120,a0 ;250
calla RNDPER
jrls #noairb
jruc #airok
#notlng
movk >1f,a0 ;3%
cmpi 55,a11
jrge #chkairb ;Not a close shot?
movi >7f,a0 ;1.5%
#chkairb
callr rnd
jrnz #noairb ;No air ball?
move *a13(plyr_ptsdown),a0
subk 2,a0
jrge #noairb ;Losing by 2 or more? No airball
move @plyrnumonfire,a14
jrnn #noairb
; move *a13(plyr_num),a0
; move @plyrnumonfire,a14
; cmp a0,a14
; jrz #noairb
move *a13(plyr_o1dist),a14 ;Totally open shot?
cmpi 50,a14
jrlt #airok
move *a13(plyr_o2dist),a14
cmpi 50,a14
jrgt #noairb
#airok
movi -1,a0
move a0,@plyrairballoff
move a7,a2
CREATE0 plyr_airballsnd
movi -1,a0
move a0,@shot_percentage ;miss
move a2,a7
movk 20,a2 ;>Air ball ;18
movk 1,a0
callr rnd
jrnz #airf
neg a2 ;-Z
#airf
clr a0 ;X
clr a1 ;Y
; movi -40,a0
; movi -30,a1 ;Y
jruc #calcshot
#noairb
movi 999,a0 ;>Shoot at hoop
callr rndrng0
cmp a0,a9
jrgt #good
#miss
clr a0
move a0,@shot_percentage ;miss
movk >1f,a0 ;Miss
callr rnd
sll 4,a0
addi #misszx_t,a0
move *a0,a5
move *a0(8*16),a3
movk 1,a0 ;50%
callr rnd
jrnz #miss2
movk 2,a0 ;More towards rim edge
callr rndrng0
addk 7,a0
jruc #miss3
#miss2
movk 3,a0 ;Regular miss (they go in a fair amount)
callr rnd
addk 6,a0
#miss3
mpys a0,a3
mpys a0,a5
move a3,a0
move a5,a2
sra 12,a0 ;X
sra 12,a2 ;Z
jruc #cyo
#good movk 4,a0 ;Hit
callr rndrng0
subk 2,a0
move a0,a2 ;Z
movk 4,a0
callr rndrng0
subk 2,a0 ;X
#cyo
movi -3,a1 ;Y
#calcshot
move *a13(plyr_ohoopx),a3
cmpi WRLDMID,a3
jrlt #lhoop
neg a0
#lhoop add a0,a3 ;Add X offset
move *a7(OXPOS),a14
sub a14,a3
move *a7(OXANI+16),a14
sub a14,a3 ;X delta
movi CZMID,a5
add a2,a5
move *a7(OZPOS),a14
sub a14,a5 ;Z delta
move a1,a2
move a3,a4 ;>Calc distance (long+short/2.667)
move a5,a14
abs a4
abs a14
cmp a14,a4
jrhs #xbig
SWAP a14,a4
#xbig sra 1,a14 ;/2
add a14,a4
sra 2,a14 ;/8
sub a14,a4
cmpi 170,a4
jrls #distok
move a4,a14 ;>Reduce excess
movi 170,a4
sub a4,a14
sra 3,a14 ;/8
add a14,a4
#distok
move a4,a1
movi 110,a14 ;120
mpys a14,a1
move a1,a4
sra 8,a4 ;/256
move a10,a10
jrnz #athp ;At hoop?
move a4,a1 ;Time*.75
sra 2,a1
sub a1,a4
cmpi 35,a4
jrge #divok
movi 35,a4
jruc #divok
#athp
cmpi 50,a4
jrge #divok
movi 50,a4 ;Min
#divok
move *a13(plyr_seq),a1
; move *a13(plyr_seqflgs),a14
; btst LAYUP_B,a14
; jrz #hkck
;
; jruc #hkck
;
; addk 2,a4 ;8
; move @HCOUNT,a14
; btst 0,a14
; jrz #hko
; subk 10,a4
; jruc #hko
;
;#hkck
cmpi HOOK_SEQ,a1
jrnz #hky
addk 15,a4 ;Make hook shot go a bit higher
jruc #hko
#hky
cmpi HOOK2_SEQ,a1
jrnz #hko
subk 10,a4
#hko
;MJT 12/15/93
addk 2,a4
movi 10,a0
calla RNDPER
jrls #regshot
;Try a rainbow!
move @shot_distance,a0
cmpi >104,a0
jrgt #regshot
addk 20,a4
movi rainbow_snd,a0
calla snd_play1ovr
#regshot
sll 16,a3
sll 16,a5
divs a4,a3
divs a4,a5
; move *a8(OXVEL),a1,L
; sra 3,a1 ;/8
; add a1,a3
move @plyrairballoff,a0
jrnn #nobrick
clr a0
move a0,@plyrairballoff
clr a0
move a0,@ballgoaltcnt
move a3,a0
sra 2,a0
sub a0,a3
; move *a13(plyr_num),a14
; cmpi 2,a14
; jrge #nobrick
; add a0,a3
; add a0,a3
#nobrick
move a3,*a7(OXVEL),L
; move *a8(OZVEL),a1,L
; sra 3,a1 ;/8
; add a1,a5
move a5,*a7(OZVEL),L
movi -GRAVB/2,a1
mpys a4,a1
move *a7(OYVAL),a3,L ;Adjust for hgt difference
addi HOOPY-8,a2
sll 16,a2
sub a2,a3 ;- if above
divs a4,a3
sub a3,a1
move a1,*a7(OYVEL),L
addk 2,a4
; subk 1,a4 ;Allows goaltend of airballs
move a4,@ballgoaltcnt
move *a13(plyr_num),a1 ;A1=Plyr #
move a1,@ballpnumshot
move a1,@ballpnumlast
move a1,@ballsclastp
movi -1,a0
move a0,@ballpnum ;No owner
clr a0
move a0,@ballscorezhit
move a0,@ballrimhitcnt
move a0,@ballbbhitcnt
move a0,*a13(plyr_ownball)
move a0,@plyrcharge
movi 50,a0 ;40
move a0,*a13(plyr_shtdly)
;>Inc try shot stat
move *a13(plyr_seqflgs),a0
btst LAYUP_B,a0
jrnz #x
movi PS_2PTS_TRY,a0
move @ballptsforshot,a14
subk 2,a14
jreq #2ptr
movk PS_3PTS_TRY,a0
#2ptr calla inc_player_stat
#x
move *a13(plyr_num),a0 ;Plyr # shooting
calla shoots_speech
PULL a6,a7,a9,a10,a11
rets
;
; movi PS_2PTS_TRY,a0
; calla dec_player_stat
#misszx_t
.word -4096,-4017,-3784,-3406,-2896,-2275,-1567,-799
.word 0,799,1567,2275,2896,3406,3784,4017
.word 4096,4017,3784,3406,2896,2275,1567,799
.word 0,-799,-1567,-2275,-2896,-3406,-3784,-4017
.word -4096,-4017,-3784,-3406,-2896,-2275,-1567,-799
; .if 0
#*******************************
* Show shot percentage (process)
* A9=Percent (0-1000)
SUBRP plyr_showshotpercent
move a11,*a13(PDATA),L
movk 10,a1
divu a1,a9
cmpi 99,a9
jrls #maxok
movi 99,a9
#maxok
clr a8
divu a1,a8
sll 5,a8
addi #f_t,a8
move *a8,a2,L
movi [191,0],a0
movi [11,0],a1
movi 950,a3 ;Z
movi DMAWNZ|M_NOCOLL|M_SCRNREL,a4
movi CLSDEAD,a5
clr a6
clr a7
calla BEGINOBJ2
move a8,a10
sll 5,a9
addi #f_t,a9
move *a9,a2,L
movi [196,0],a0
movi [11,0],a1
movi 950,a3 ;Z
movi DMAWNZ|M_NOCOLL|M_SCRNREL,a4
movi CLSDEAD,a5
clr a6
clr a7
calla BEGINOBJ2
PUSHP a8
movi crplate2,a0 ;>Change credit plate
move @crplate_ptr,a8,L
move *a8(OCTRL),a1
calla obj_aniq
SLEEP TSEC*2
movi crplate,a0
move *a8(OCTRL),a1
calla obj_aniq
PULLP a8
.if DEBUG
move *a13(PDATA),a0,L
cmp a0,a11
jrz #db
LOCKUP
#db
.endif
move a10,a0
calla DELOBJ
jauc DELOBJDIE
#f_t
.long font60,font61,font62,font63,font64
.long font65,font66,font67,font68,font69
; .endif
#*******************************
* Make sound for airball (process)
SUBRP plyr_airballsnd
SLEEP 65
move @plyrairballoff,a0
jrnz #x
movi airball_snd,a0
calla snd_play1
SLEEP 90
movi airball_snd,a0
calla snd_play1
#x DIE
#*******************************
* Start player pass to teammate
* A8=*Plyr obj
* A13=*Plyr process
* Trashes scratch, A2-A5
SUBRP plyr_startpass
PUSH a6,a7
move *a13(plyr_tmproc_p),a4,L
move *a4(plyr_jmpcnt),a0
jrnz #x ;Teammate in air?
move *a13(plyr_keeppal),a0
jrz #no
calla seq_stopfire
#no
move *a13(plyr_num),a1
inc a1
move a1,@assist_plyr
movi 3*60+30,a0
move a0,@assist_delay
; move @PSTATUS,a0 ;Plyr start bits 0-3
; move *a13(plyr_num),a1
; btst a1,a0
; jrnz #human
; XORK 1,a1
; btst a1,a0
; jrz #human ;Drone passing to a drone?
;
; move *a13(plyr_idiotbit),a0
; btst 0,a0
; jrnz #human
; addk 1,a0
; move a0,*a13(plyr_idiotbit)
;
; move @inbound,a0 ;Inbounding team (0-1) or Neg
; jrnn #human
;
; movk 5,a0
; calla idiot_box ;This plyr is telling drone to pass ball
;#human
move a10,a2
move a4,a10
calla arw_on1plyr ;Guy who picks up ball gets arw
move a2,a10
move a4,@ballprcv_p,L
move *a4(PA8),a2,L ;Get teammates obj
move *a2(OXPOS),a6
move *a2(OXANI+16),a14
add a14,a6
move *a2(OZPOS),a7
;Try to do a no look pass
;If passer is facing 0,1,2 and teammate is located in the angle 2
;then we can use the T2NLPR pass.
;
; OR
;
;If passer is facing 6,7 and teammate is located in the angle 6
;then we can use the T2NLPR pass.
;
; OR
;
;If passer is facing 0,1,2 and teammate is located in the angle 7
;then we can use the T2NLPL pass.
;
; OR
;
;If passer is facing 6,7 and teammate is located in the angle 0
;then we can use the T2NLPL pass.
move @inbound,a0
jrnn #notnl4 ;Inbounding the ball?
movk 7,a0 ;>Try no look pass
callr rnd
jrnz #notnl4
move *a13(plyr_jmpcnt),a14
jrnz #notnl4 ;In air?
move *a13(plyr_tmdist),a14
cmpi 70,a14
jrlt #notnl4 ;Too short?
subi 320,a14
jrgt #notnl4 ;Too far?
callr seekdirdist_obxz128
move a1,a2
move a0,a14
addi >40,a14
sll 32-7,a14
srl 32-7,a14
addk 8,a0 ;Round off
sll 32-7,a0
srl 32-7+4,a0 ;Kill frac
move *a13(plyr_seqdir),a1
cmpi 3,a1
jrlt #dir2n
cmpi 6,a1
jrlt #notnl
cmpi 6,a0
jrz #donl
cmpi 1,a0
jrz #dir3
; cmpi 7,a0
; jrz #dir3
jruc #notnl
#dir2n cmpi 2,a0
jrz #donl
cmpi 7,a0
jrnz #notnl
#dir3 movi PASSNL2_SEQ,a0
jruc #don1
#donl
movi PASSNL_SEQ,a0
#don1 move a14,*a4(plyr_newdir)
move *a13(plyr_dir),a7
jruc #bhpas
#notnl
;If passer is facing 2,3,4 and teammate is located in the angle 5
;then we can use the T4NLPR pass.
;
; OR
;
;If passer is facing 5,6 and teammate is located in the angle 5
;then we can use the T4NLPR pass.
;
; OR
;
;If passer is facing 2,3,4 and teammate is located in the angle 2
;then we can use the T4NLPL pass.
;
; OR
;
;If passer is facing 5,6 and teammate is located in the angle 6
;then we can use the T4NLPL pass.
cmpi 2,a1
jrlt #notnl4
cmpi 5,a1
jrlt #dir2n4
cmpi 7,a1
jrz #notnl4
; cmpi 3,a0
; jrz #donl4
cmpi 6,a0
jrz #dir34
jruc #notnl4
#dir2n4 cmpi 5,a0
jrz #donl4a
cmpi 2,a0
jrnz #notnl4
#dir34 movi PASSNL2_SEQ,a0
jruc #don14
#donl4
movi PASSNL_SEQ,a0
#don14 move a14,*a4(plyr_newdir)
move *a13(plyr_dir),a7
jruc #bhpas
#donl4a
movi PASSNL3_SEQ,a0
jruc #don14
#notnl4
movi 350,a0
calla RNDPER
jrls #notbh
; movk 2,a0 ;>Try behind the back pass
; callr rnd
; jrnz #notbh
move *a13(plyr_jmpcnt),a14
jrnz #notbh ;In air?
move *a13(plyr_tmdist),a14
cmpi 90,a14
jrlt #notbh ;Too short?
subi 360,a14
jrgt #notbh ;Too far?
move *a13(plyr_attrib_p),a14,L
move *a14(PAT_PASS),a14
cmpi 5,a14
jrlt #notbh
move *a13(plyr_o1dist),a1
cmpi >78,a1
jrlt #notbh
move *a13(plyr_o2dist),a1
cmpi >78,a1
jrlt #notbh
;Want to stop ball from being inbounded using the BHPASS
move @inbound,a0
jrn #bhcont ;Inbounding the ball?
;I'm ahead, maybe still do cocky inbound
move *a13(plyr_ptsdown),a1
jrgt #notbh ;If losing, don't bhpass
addk 6,a1
jrge #notbh ;If ahead by 7 or more, allow attempt
#bhcont
;Check to see is teammate is in an ok position to receive a behind the back
;pass based on what direction pass is facing and teammate is located.
;
;If passer is facing 2,3,4 and teammate is in 1 or 2 then do it, or if passer
;is facing 5,6 and teammate is located in the angles 6 or 7 then we can also
;use the T4HIND pass.
;
;If passer is facing 0,1 and teammate is in 2 or 3 then do it,
;or if passer is facing 7 and teammate is located in the angles 5 or 6
;then we can also use the T2HIND pass.
callr seekdirdist_obxz128
move a1,a2
move a0,a14
addi >40,a14
sll 32-7,a14
srl 32-7,a14
addk 8,a0 ;Round off
sll 32-7,a0
srl 32-7+4,a0 ;Kill frac
move *a13(plyr_seqdir),a1
cmpi 2,a1
jrlt #dir2
cmpi 7,a1
jrz #dir2
;4 direction possibility
subk 5,a1
jrge #flp4
move a0,a0 ;Unflipped 4
jrz #notbh ;Not in 0 direction
subk 3,a0
jrge #notbh
jruc #dobh2
#flp4
subk 6,a0
jrlt #notbh
jruc #dobh2
#dir2 ;2 direction possibility
subk 7,a1
jreq #flp2
subk 2,a0
jreq #dobh2
subk 3-2,a0
jrne #notbh
#dobh2
;RJR
;behind back pass speech here
movi PASSBH_SEQ,a0 ;Will do a #2 behind the back pass
move a14,*a4(plyr_newdir)
move *a13(plyr_dir),a7
jruc #bhpas
#flp2 subk 5,a0
jreq #dobh2
subk 6-5,a0
jreq #dobh2
#notbh
callr seekdirdist_obxz128 ;>Turn toward teammate
move a0,*a13(plyr_dir)
move a0,*a13(plyr_newdir)
move a0,a7
move a0,a3
addi >40,a0
sll 32-7,a0
srl 32-7,a0
move a0,*a4(plyr_newdir)
move a1,a2
movi PASSDO_SEQ,a0
move *a13(plyr_jmpcnt),a14
jrz #contpass
;MJT
;Fix dunks attempted stat
move *a13(plyr_seqflgs),a14
btst DUNK_B,a14
jrz #nodnk
PUSH a0
movk PS_DUNKS_TRY,a0 ;>Dec dunk stats
move *a13(plyr_num),a1
.ref dec_player_stat
calla dec_player_stat
movi PS_2PTS_TRY,a0
move *a13(plyr_num),a1
calla dec_player_stat
PULL a0
#nodnk
move *a13(plyr_tmdist),a14
cmpi 110,a14
jrgt #ss
movi PASSDO2_SEQ,a0
jrnz #ss ;Air dish off pass?
#contpass
movk PASSS_SEQ,a0
cmpi 170,a2 ;50
jrle #ss
;If a good passer...
movi PASSC_SEQ,a3
;MJT
move *a13(plyr_attrib_p),a14,L
move *a14(PAT_PASS),a5
cmpi 6,a5
jrlt #normp
movi FASTPASSC_SEQ,a3
#normp
movk 7,a0
callr rnd
jrnz #normchest ;12% regular chest?
movi PASSNEWOH_SEQ,a3
cmpi 6,a5
jrlt #normchest
movi FASTPASSNEWOH_SEQ,a3
#normchest
move a3,a0
#ss
#bhpas
move a0,a3
callr plyr_setseq
; subk PASSOH_SEQ,a3
; jreq #nolead
cmpi PASSNL_SEQ,a3
jrz #lead_nl
cmpi PASSNL2_SEQ,a3
jrnz #noleadnl
#lead_nl
;Try a leading pass even on a no look pass
move *a4(plyr_dirtime),a1
jrz #nolead_nl
subk 10,a1
jrlt #nolead_nl
#noleadnl
; cmpi 35,a2
; jrlt #nolead ;Too close?
move *a4(plyr_dirtime),a1
jrz #nolead_notm
;Shawn, I increased this because we were getting to many missed leading
;passes. Because the receiver would bump into a defender and get thrown
;off course.
subk 8,a1 ;4
jrgt #leadingpass
move *a4(plyr_o1dist),a0
;MJT
cmpi 25,a0
; cmpi 35,a0
jrlt #nolead_ocls ;Opponent too close?
move *a4(plyr_o2dist),a0
cmpi 25,a0
; cmpi 35,a0
jrge #leadingpass
;Additional checks are required here to determine if this will cause the
;leading pass to fly off scrn and cause the receiver to become stuck
;against the glass wall.
;MJT
cmpi 30,a2 ;40
jrlt #nolead_tm ;Too close?
move *a4(plyr_dirtime),a1
subk 4,a1
jrgt #leadingpass
#nolead_notm
; LOCKUP ;Not running long enough
move @PCNT,a0
;MJT
ANDK 1,a0
; ANDK 3,a0
jrnz #nolead
jruc #leadingpass
#nolead_nl
; LOCKUP ;A no look pass
jruc #nolead
#nolead_ocls
; LOCKUP ;Opponent too close
jruc #nolead
#nolead_tm
; LOCKUP ;Teammate too close
#nolead
movk 1,a0
move a0,*a4(plyr_nojoy)
jruc #end
#leadingpass
move *a4(plyr_jmpcnt),a1
jrnz #nolead ;He's jumping?
;Disallow leading behind the back pass if using #4 or #2 behind back pass art
;and teammate is running toward passer
;At the moment, receiver must be running horizontally away from me! (2 or 6)
move @PCNT,a14
ANDK 3,a14
; btst 0,a14
jrnz #notst
cmpi PASSBH_SEQ,a3
jrne #notst
move *a13(plyr_seqdir),a1
move *a4(plyr_seqdir),a0
cmpi 5,a1
jrge #ck1
cmpi 2,a0
jrz #bhin
jruc #nolead
#ck1 cmpi 6,a0
jrne #nolead
jruc #bhin
#notst
;Will be a leading pass, rotate passer so that pass will go to where
;receiver will be when he receives the pass
move *a13(plyr_tmproc_p),a4,L
move *a4(PA8),a2,L ;Get teammates obj
move *a2(OXPOS),a6
move *a2(OXANI+16),a14
add a14,a6
move *a2(OZPOS),a7
move *a2(OXVEL),a0,L ;Where will teammate be in 32 ticks?
sra 16-5,a0
add a0,a6
move *a2(OZVEL),a0,L
sra 16-5,a0
add a0,a7
;FIX!!!
callr seekdirdist_obxz128 ;>Turn toward where teammate will be
move a0,*a13(plyr_dir)
move a0,*a13(plyr_newdir)
#bhin
move *a4(PA11),a0,L ;>Keep teammate moving in same dir
move *a0,a0
sll 32-4,a0
srl 32-4,a0
ori >8000,a0
move a0,*a4(plyr_nojoy) ;Neg
move a0,*a4(plyr_newdir)
#end
movk 30,a0
move a0,*a4(plyr_rcvpass)
move *a4(plyr_seqflgs),a0
btst SAMEDIR_B,a0
jrz #x
movi -1,a0
move a0,*a4(plyr_newdir) ;Kill dir change
#x PULL a6,a7
rets
#*******************************
* Player passes to teammate (called from seq)
* A8=*Plyr obj
* A13=*Plyr process
* Trashes scratch, A2-A5
SUBR plyr_pass
PUSH a6
move @ballpnum,a0
move *a13(plyr_num),a1
cmp a0,a1
jrne #x ;I don't have ball?
calla ball_convfmprel
move @ballobj_p,a0,L
move *a13(plyr_tmproc_p),a6,L
move *a6(PA8),a2,L ;Get * teammates obj
move *a2(OXPOS),a3
move *a2(OXANI+16),a14
add a14,a3
move *a2(OZPOS),a5
move *a0(OXPOS),a1
move *a0(OXANI+16),a14
add a14,a1
sub a1,a3 ;X delta
move *a0(OZPOS),a1
sub a1,a5 ;Y delta
move a3,a4 ;>Calc distance (long+short/2.667)
move a5,a14
abs a4
abs a14
cmp a14,a4
jrhs #xbig
SWAP a14,a4
#xbig sra 1,a14 ;/2
add a14,a4
sra 2,a14 ;/8
sub a14,a4
PUSH a0
move @inbound,a0
jrnn #no_speech
cmpi 100,a4 ;too close to call
jrlt #no_speech
move *a13(plyr_num),a1
calla pass_to_speech
#no_speech
PULL a0
;MJT
move *a13(plyr_attrib_p),a14,L
move *a14(PAT_PASS),a2
sll 4,a2
movi #longpas_t,a1
add a2,a1
move *a1,a1
; movi 95,a1 ;>Calc time
cmpi 300,a4
jrgt #ct
movi #shortpas_t,a1
add a2,a1
move *a1,a1
; movi 115,a1
#ct move *a13(plyr_turbon),a14
jrz #noturb ;No turbo?
addi #turbopas_t,a2
move *a2,a2
sub a2,a1
; subi 32,a1 ;Quicker
#noturb
move a14,@plyrpasstype ;0=Normal, !0=Turbo
mpys a4,a1
sra 10,a1 ;/1024
move a1,a4
subk 16,a1
jrge #nshrt ;!Short?
movk 16,a4 ;Min
#nshrt
move *a6(PA8),a2,L ;Get * teammates obj
move *a6(plyr_nojoy),a14
jrnn #nolead
; move *a6(plyr_seqdir),a3
; cmpi 2,a3
; jrz #oldway
; cmpi 6,a3
; jrnz #newway
;#oldway
; move *a13(plyr_seqdir),a14
; cmp a14,a3
; jrnz #newway
; move *a2(OXVEL),a3,L
; mpys a4,a3
; move *a2(OXVAL),a14,L
; add a14,a3
; move *a2(OXANI),a14,L
; add a14,a3
; move *a2(OZVEL),a5,L
; mpys a4,a5
; move *a2(OZVAL),a14,L
; add a14,a5
; sra 16,a3
; sra 16,a5
; jruc #outb1
;#newway
move a4,b0 ;>Calc where ball should go
move *a2(OXVAL),a3,L
move *a2(OXANI),a14,L
add a14,a3
move *a2(OZVAL),a5,L
move *a2(OXVEL),a1,L
move *a2(OZVEL),a14,L
#bndlp add a1,a3 ;Walk through movements
add a14,a5
cmpi (PLYRMINX)<<16,a3
jrle #outb
cmpi (PLYRMAXX)<<16,a3
jrge #outb
cmpi (CZMIN+8)<<16,a5
jrle #outb
cmpi (GZMAX-6)<<16,a5
jrge #outb
subk 1,b0 ;1 step
jrgt #bndlp
; jruc #outb1
#outb
; PUSH a0,a1
; movi whstle2_snd,a0
; calla snd_play1ovr
; PULL a0,a1
;#outb1
sra 16,a3
sra 16,a5
move *a0(OXPOS),a1
move *a0(OXANI+16),a14
add a14,a1
sub a1,a3 ;X delta
move *a0(OZPOS),a1
sub a1,a5 ;Y delta
#nolead
sll 16,a3
sll 16,a5
divs a4,a3
divs a4,a5
move a3,*a0(OXVEL),L
move a5,*a0(OZVEL),L
move *a0(OYVAL),a3,L ;Adjust for hgt difference
move *a2(OYVAL),a14,L
sub a14,a3 ;- if ball above dest
move a14,a1
sra 2,a1
add a1,a3
move a4,a5
move *a6(plyr_nojoy),a2
jrn #nopoh ;Leading pass?
subk 4,a5
;FIX!!
; move *a13(plyr_seq),a2
; subk PASSOH_SEQ,a2
; jrne #nopoh
; sub a1,a3
; subk 26,a5
; movk REBOUND_SEQ,a14
#nopoh
movi -GRAVB/2,a1
move *a13(plyr_jmpcnt),a2
jrnz #level ;In jump?
move @PCNT,a14
andi 0fh,a14
jrnz #level
;Shawn, we have to fix this bounce pass
move *a13(plyr_seq),a14 ;>Chk for overhead pass
subi PASSNEWOH_SEQ,a14
jrz #level
move *a13(plyr_seqdir),a14
cmpi 0,a14
jrz #level
cmpi 1,a14
jrz #level
cmpi 7,a14
jrz #level
move *a0(OYVAL),a3,L ;Adjust for hgt difference
movi -GRAVB/2,a1
srl 1,a4
#level
mpys a4,a1
divs a4,a3
sub a3,a1
move a1,*a0(OYVEL),L
move *a13(plyr_num),a0
move a0,@ballpnumshot
move a0,@ballpnumlast
move a0,@ballsclastp
movi -1,a0
move a0,@ballpnum ;No owner
clr a0
move a0,@ballscorezhit
move a0,@ballpasstime
move a0,*a13(plyr_ownball)
movk 30,a0
move a0,*a13(plyr_shtdly)
addk 5,a5
move a5,*a6(plyr_rcvpass) ;Tell teammate when to expect pass
movi pass_snd,a0
calla snd_play1
#x PULL a6
rets
#longpas_t
.word 103,101,99,97,95,93
.word 91,89,87,85,83
#shortpas_t
.word 127,124,121,118,115,112
.word 109,106,103,100,97
#turbopas_t
.word 28,29,30,31,32,33
.word 35,38,41,44,44
#*******************************
* Try a rebound if possible
* A8=*Plyr obj
* A13=*Plyr process
* Trashes scratch, A2-A5
RTIME .equ 25
SUBRP plyr_tryrebound
PUSH a6,a7
move @plyrinautorbnd,a1
jrnz #x ;Someone else doing?
move @game_time,a14,L
cmpi >500,a14
jrge #heave ;Do it
move *a13(plyr_num),a0
move @ballpnumshot,a1
cmp a0,a1
jrz #x
XORI 1,a1
cmp a1,a0
jrz #x ;Br=teammate shot
#heave
;>Chk my start
move *a8(OZPOS),a1 ;Get SZ
subi CZMID,a1
abs a1
cmpi 40,a1
jrgt #posok
move *a8(OXPOS),a0 ;Get SX
move *a8(OXANI+16),a14
add a14,a0
subi WRLDMID,a0
abs a0
cmpi HOOPRX-WRLDMID+13,a0
jrge #x ;Under backboard?
subk 12,a1
jrgt #posok
cmpi HOOPRX-WRLDMID-8,a3
jrge #x ;Under rim?
#posok
move @ballobj_p,a5,L
movk RTIME,a0 ;>Find new Y pos in x ticks
move *a5(OYVAL),a4,L
move *a5(OYVEL),a2,L
movi GRAVB,a1
#newblp
add a2,a4
add a1,a2
dsj a0,#newblp
sra 16,a4
cmpi -140,a4
jrlt #x ;Too hi?
addk 30,a4
move *a8(OYPOS),a0
cmp a0,a4
jrge #x ;Ball lower than plyr?
move *a5(OXVAL),a6,L ;>Find new XZ pos in x ticks
move *a5(OXANI),a14,L
add a14,a6
move *a5(OZVAL),a7,L
move a6,a0 ;>Chk ball pos
move a7,a1
sra 16,a0
sra 16,a1
subi CZMID,a1
abs a1
subk 12,a1
jrgt #bposok
subi WRLDMID,a0
abs a0
cmpi HOOPRX-WRLDMID-10,a3
jrge #x ;Under rim or backboard?
#bposok
movk RTIME,a0
move *a5(OXVEL),a1,L
mpys a0,a1
add a1,a6
move *a5(OZVEL),a1,L
mpys a0,a1
add a1,a7
sra 16,a6
sra 16,a7
move a6,a0 ;>Chk my destination
move a7,a1
subi CZMID,a1
abs a1
cmpi 40,a1
jrgt #eposok
subi WRLDMID,a0
abs a0
cmpi HOOPRX-WRLDMID+13,a0
jrge #x ;Under backboard?
subk 14,a1
jrgt #eposok
cmpi HOOPRX-WRLDMID-10,a3
jrge #x ;Under rim?
#eposok
callr seekdirdist_obxz128
cmpi 60,a1
jrge #x ;Too far to jump?
move a0,*a13(plyr_newdir) ;Turn where ball is headed
movk REBOUNDA_SEQ,a0
move a0,@plyrinautorbnd
move *a13(plyr_dir),a7
callr plyr_setseq
#x PULL a6,a7
rets
#*******************************
* Clear auto rebound flag - Called when SEQ_REBOUNDA lands
SUBR clr_autorbnd
clr a0
move a0,@plyrinautorbnd
rets
#*******************************
* Set the ball xyz position from player
* A8=*Plyr obj
* A13=*Plyr process
* Trashes scratch
SUBRP plyr_setballxyz
move @ballobj_p,a0,L
move *a8(OZPOS),a1 ;>Set Z
move *a13(plyr_ballzo),a14
add a14,a1
move a1,*a0(OZPOS)
move *a8(OXVAL),a1,L ;>Set X
move a1,b0
move *a13(plyr_ballxo),a14,L
add a14,a1
move *a0(OIMG),a14,L
move *a14(IANIOFFX),a14
sll 16,a14
sub a14,a1
move a1,*a0(OXVAL),L
move *a8(OXANI),a14,L ;Make 3D ball X+ani = plyr X+ani
sub a14,a1
move b0,a14
sub a1,a14
move a14,*a0(OXANI),L
move *a13(plyr_ballyo),a1
cmpi -200,a1
jreq #bfree ;Ball Y free?
move *a0(OIMG),a14,L ;>Set Y
move *a14(IANIOFFY),a14
sub a14,a1
move *a8(OYPOS),a14
add a14,a1
move a1,*a0(OYPOS)
clr a1
move a1,*a0(OYVEL),L ;Stop grav from accumulating
move a1,*a0(OXVEL),L
move a1,*a0(OZVEL),L
move a1,@ballfree ;!Free
rets
#bfree
move @ballfree,a14
jrnz #x ;Already free?
movk 1,a14
move a14,@ballfree ;Free
move *a0(OYPOS),a1
move *a0(OIMG),a14,L
move *a14(IANIOFFY),a14
add a14,a1
movi ->a00,a14 ;Push it towards gnd
mpys a14,a1
addi >16000,a1
move a1,*a0(OYVEL),L
#x rets
#*******************************
* Get a scaled objects anipt XY
* A8=*Obj
* >A0=Scaled Ani X (16:16)
* >A1=Scaled Ani Y
* Trashes scratch
SUBR anipt_getsclxy
move a2,b0
move *a8(OZPOS),a14 ;894 to 1379 (Z range 486)
subi GZBASE,a14 ;-Base
jrge #zok
clr a14
#zok srl 4,a14 ;/16
sll 6,a14 ;*64
move *a8(ODATA_p),a0,L
addk 32,a0
add a14,a0
move *a0+,a14
sll 4,a14 ;*16
move *a8(OIMG),a2,L
move *a2(IANIOFFX),a1
mpys a14,a1
move *a0,a14
sll 4,a14 ;*16
move a1,a0
move *a2(IANIOFFY),a1
mpys a14,a1
move *a8(OCTRL),a14
btst B_FLIPH,a14
jrz #x ;No flip?
move *a2,a2 ;ISIZEX
subk 1,a2
sll 16,a2 ;*64K
neg a0
add a2,a0 ;+size
#x move b0,a2
rets
#*******************************
* Get a scaled objects 2nd anipt XY
* A8=*Obj
* >A0=Scaled Ani2 X (16:16)
* >A1=Scaled Ani2 Y
* Trashes scratch
SUBRP anipt2_getsclxy
move a2,b0
move *a8(OZPOS),a14 ;894 to 1379 (Z range 486)
subi GZBASE,a14 ;-Base
jrge #zok
clr a14
#zok srl 4,a14 ;/16
sll 6,a14 ;*64
move *a8(ODATA_p),a0,L
addk 32,a0
add a14,a0
move *a0+,a14
sll 4,a14 ;*16
move *a8(OIMG),a2,L
move *a2(IANI2X),a1
mpys a14,a1
move *a0,a14
sll 4,a14 ;*16
move a1,a0
move *a2(IANI2Y),a1
cmpi -200,a1
jrne #ynorm
sll 16,a1
jruc #cflip
#ynorm mpys a14,a1
#cflip move *a8(OCTRL),a14
btst B_FLIPH,a14
jrz #x ;No flip?
move *a2,a2 ;ISIZEX
subk 1,a2
sll 16,a2 ;*64K
neg a0
add a2,a0 ;+size
#x move b0,a2
rets
#*******************************
* Get a scaled objects 3rd anipt XY
* A8=*Obj
* >A0=Scaled Ani3 X (16:16)
* >A1=Scaled Ani3 Y
* Trashes scratch
SUBR anipt3_getsclxy
move a2,b0
move *a8(OZPOS),a14 ;894 to 1379 (Z range 486)
subi GZBASE,a14 ;-Base
jrge #zok
clr a14
#zok srl 4,a14 ;/16
sll 6,a14 ;*64
move *a8(ODATA_p),a0,L
addk 32,a0
add a14,a0
move *a0+,a14
sll 4,a14 ;*16
move *a8(OIMG),a2,L
move *a2(IANI3X),a1
mpys a14,a1
move *a0,a14
sll 4,a14 ;*16
move a1,a0
move *a2(IANI3Y),a1
mpys a14,a1
#cflip move *a8(OCTRL),a14
btst B_FLIPH,a14
jrz #x ;No flip?
move *a2,a2 ;ISIZEX
subk 1,a2
sll 16,a2 ;*64K
neg a0
add a2,a0 ;+size
#x move b0,a2
rets
#*******************************
* Align shadow obj with player obj and set ani
* A8=*Obj
* A13=*Plyr process
* Trashes scratch, A2-A4
SUBRP plyr_setshadow
move *a13(plyr_shadobj_p),a4,L
move *a8(OZPOS),a0
move a0,a1
subi 50,a1 ;Adjust
move a1,*a4(OZPOS)
subi CZMIN,a0 ;-Base
jrge #zok
clr a0
#zok srl 5,a0 ;/32
move *a8(OYPOS),a1
move *a13(plyr_aniy),a14
add a14,a1 ;Ani pt position
sra 4,a1 ;/16 (Neg)
add a1,a0
sll 5,a0 ;*32
addi #ani_t,a0
move *a0,a2,L
move a2,*a4(OIMG),L ;Set new img
move *a2,a14,L
move a14,*a4(OSIZE),L
move *a2(ISAG),*a4(OSAG),L
callr anipt_getsclxy
move *a2(IANIOFFX),a3
sll 16,a3
move a3,*a4(OXANI),L
move *a8(OXVAL),a14,L
add a0,a14 ;Ani X
sub a3,a14
move a14,*a4(OXVAL),L
move *a2(IANIOFFY),a3
neg a3
move a3,*a4(OYPOS)
rets
.long shadow15,shadow15,shadow15,shadow15
.long shadow15,shadow15,shadow15,shadow15
.long shadow15,shadow14,shadow13,shadow12
#ani_t .long shadow11,shadow10,shadow9,shadow8
.long shadow7,shadow6,shadow5,shadow4
.long shadow3,shadow2,shadow1,shadow1
.long shadow1,shadow1,shadow1
#*******************************
* Align head obj with player obj
* A8=*Obj
* A13=*Plyr process
* Trashes scratch, A2-A6
SUBRP plyr_headalign
move *a13(plyr_headobj_p),a6,L ;>A6=*Head obj
move *a8(OIMG),a0,L ;>Set Z
move *a8(OZPOS),a14
move *a0(IANI3Z),a1
add a1,a14
move a14,*a6(OZPOS)
sub a1,a14
neg a1
move a1,*a6(OMISC) ;Z offset
;>Calc head scale anixy (A3,A5)
subi GZBASE,a14 ;-Base
jrge #zok
clr a14
#zok srl 4,a14 ;/16
sll 6,a14 ;*64
move *a6(ODATA_p),a0,L
addk 32,a0
add a14,a0
move *a0+,a14
sll 4,a14 ;*16
move *a6(OIMG),a2,L
move *a2(IANIOFFX),a3
mpys a14,a3
move *a0,a14
sll 4,a14 ;*16
move *a2(IANIOFFY),a5
mpys a14,a5
move *a6(OCTRL),a14
btst B_FLIPH,a14
jrz #nohf ;No flip?
move *a2,a2 ;ISIZEX
subk 1,a2
sll 16,a2 ;*64K
neg a3
add a2,a3 ;+size
#nohf
callr anipt3_getsclxy
move *a8(OYVAL),a14,L
add a1,a14 ;Ani3 Y
sub a5,a14
move a14,*a6(OYVAL),L
move *a8(OXVAL),a14,L
move a14,a1
add a0,a14 ;Ani3 X
sub a3,a14
move a14,*a6(OXVAL),L
move *a8(OXANI),a0,L ;Make head X+ani = plyr X+ani
add a0,a1
sub a14,a1
move a1,*a6(OXANI),L
rets
;#*******************************
;* Align arw obj with player obj
;* A8=*Obj
;* a6=Arw Obj
;* Trashes scratch, A2-A6
;
; SUBR plyr_arwalign
;
;
; move *a8(OIMG),a0,L ;>Set Z
; move *a8(OZPOS),a14
; move *a0(IANI3Z),a1
; add a1,a14
; move a14,*a6(OZPOS)
; sub a1,a14
; neg a1
; move a1,*a6(OMISC) ;Z offset
;
; ;>Calc head scale anixy (A3,A5)
; subi GZBASE,a14 ;-Base
; jrge #zok
; clr a14
;#zok srl 4,a14 ;/16
; sll 6,a14 ;*64
; move *a6(ODATA_p),a0,L
; addk 32,a0
; add a14,a0
;
; move *a0+,a14
; sll 4,a14 ;*16
; move *a6(OIMG),a2,L
;
; move *a2(IANIOFFX),a3
; mpys a14,a3
;
; move *a0,a14
; sll 4,a14 ;*16
;
; move *a2(IANIOFFY),a5
; mpys a14,a5
;
;; move *a6(OCTRL),a14
;; btst B_FLIPH,a14
;; jrz #nohf ;No flip?
;;
;; move *a2,a2 ;ISIZEX
;; subk 1,a2
;; sll 16,a2 ;*64K
;; neg a3
;; add a2,a3 ;+size
;;#nohf
;
; callr anipt3_getsclxy
;
; move *a8(OYVAL),a14,L
; add a1,a14 ;Ani3 Y
; sub a5,a14
; move a14,*a6(OYVAL),L
;
; move *a8(OXVAL),a14,L
; move a14,a1
; add a0,a14 ;Ani3 X
; sub a3,a14
; move a14,*a6(OXVAL),L
;
;
; move *a8(OXANI),a0,L ;Make head X+ani = plyr X+ani
; add a0,a1
; sub a14,a1
; move a1,*a6(OXANI),L
;
;
; rets
;
#*******************************
* Referee tosses up ball (process)
SUBRP plyr_referee
movk 1,a0
callr plyr_setac
movi [WRLDMID,0],a0
clr a1
movi shadow7,a2
movi CZMID-30-1,a3
movi DMAWNZ|M_3D|M_SHAD|M_NOCOLL,a4
movi CLSDEAD,a5
clr a6
clr a7
calla BEGINOBJ2
; movi 50,a0
; move a0,*a8(OMISC) ;Z offset
move a8,a11
movi [WRLDMID,0],a0
clr a1
movi reftip1,a2
movi CZMID-30,a3
movi DMAWNZ|M_3D|M_NOCOLL,a4
calla BEGINOBJ2
movi #att_t,a0
move a0,*a13(plyr_attrib_p),L
movi scale63_t,a0
move a0,*a8(ODATA_p),L
SLEEPK 5
movk 1,a0
move a0,*a13(plyr_ownball) ;!0=Ref has ball
movk 25,a0
move a0,*a13(plyr_ballzo)
movi #ani_l,a9
movk 1,a10
#lp
dsj a10,#noani
#getwt move *a9+,a10
jrz #refdone
jrnn #nocode
move *a9+,a0,L ;Call function
call a0
jruc #getwt
#nocode
move *a9+,a0,L
movk M_WRNONZ,a1
callr plyr_ani
callr anipt2_getsclxy
move a0,*a13(plyr_ballxo),L
sra 16,a1
move a1,*a13(plyr_ballyo)
move *a13(plyr_aniy),a1
neg a1
move a1,*a8(OYPOS) ;Set on gnd
#noani
move *a13(plyr_ownball),a0
jrz #noball ;Tossed up?
callr plyr_setballxyz
#noball
callr joy_read2 ;Scan buttons since ac is on
clr a0
move a0,@P1CTRL
move a0,@P4CTRL
movi P1CTRL,a1 ;>Kill unwanted bits
movk 4,b0
#jlp move *a1,a0
andi BUT1_M<<8+BUT1_M,a0
move a0,*a1+
dsj b0,#jlp
SLEEPK 1
move @HALT,a0
jrnz #noball
jruc #lp
#refdone
SLEEPK 5
calla SCRTST
jrz #refdone ;Still on screen?
move a11,a0
calla DELOBJ
jauc DELOBJDIE
#att_t .long scale63_t,Ref_p
#ani_l WL TSEC,reftip1
WL 10,reftip2
WL 10,reftip1
WL 10,reftip3
WL 10,reftip4
WL 10,reftip5
WL -1,#do_whstle
WL 10,reftip6
WL 10,reftip7
WL 10,reftip8
WL 8,reftip9
WL 7,reftip10
WL 7,reftip11
WL 7,reftip12
WL -1,#tossball
WL 7,reftip13
WL 7,reftip14
WL 6,reftip15
WL 5,reftip16
WL -1,#step_back
WL 3,refbk1
WL 3,refbk2
WL 3,refbk3
WL 3,refbk4
WL 3,refbk5
WL 3,refbk6
WL 3,refbk7
WL 3,refbk8
WL 3,refbk1
WL 3,refbk2
WL 3,refbk3
WL 3,refbk4
WL 3,refbk5
WL 3,refbk6
WL 3,refbk7
WL 3,refbk8
WL 3,refbk1
WL 3,refbk2
WL 3,refbk3
WL 3,refbk4
WL -1,#ac_off
WL 3,refbk5
WL 3,refbk6
WL 3,refbk7
WL 3,refbk8
WL 3,refbk1
WL 3,refbk2
WL 3,refbk3
WL 3,refbk4
WL 3,refbk5
WL 3,refbk6
WL 3,refbk7
WL 3,refbk8
WL 3,refbk1
WL 3,refbk2
WL 3,refbk3
WL 3,refbk4
WL 3,refbk5
WL 3,refbk6
WL 3,refbk7
; WL 3,refbk8
WL -1,#stop_back
WL 5,refsqt5
W0
#do_whstle
movi whstle_snd,a0
jauc snd_play1ovr
#tossball
move @ballobj_p,a1,L
movi -GRAVB*44,a0
move a0,*a1(OYVEL),L
clr a0
move a0,@clock_active ;Turn on clock
move a0,*a13(plyr_ownball) ;Let go
rets
#step_back
movi -14000h,a0
move a0,*a8(OZVEL),L
move a0,*a11(OZVEL),L
move a11,a2
move @plyrproc_t+32,a11,L
CREATE TIPID,plyr_tip
move @plyrproc_t+32*2,a11,L
CREATE TIPID,plyr_tip
move a2,a11
rets
#ac_off
clr a0
jruc plyr_setac
#stop_back
clr a0
move a0,*a8(OZVEL),L
move a0,*a11(OZVEL),L
rets
#*******************************
* Jump at ball for tip (Process)
* A11=*Plyr process
.bss t1bcnt ,16 ;Team1 (p1) # button hits
.bss t2bcnt ,16 ;Team2 (p2) ^
SUBRP plyr_tip
move *a11(PA8),a8,L
PUSH a13
move a11,a13
movi TIPJ_SEQ,a0
move *a13(plyr_dir),a7
callr plyr_setseq
move a10,*a13(PA10),L
PULL a13
SLEEPK 6
movi -GRAVB*30,a0
move a0,*a8(OYVEL),L
movk 1,a0 ;Start jump
move a0,*a11(plyr_jmpcnt)
movi t1bcnt,a9 ;>Count button1 down presses
move *a11(plyr_num),a1
btst 1,a1
jrz #t1
addk 16,a9
#t1 clr a0
move @PSTATUS,a14
btst a1,a14
jrnz #human ;Human opponent?
movk 3,a0 ;Drones # presses
#human move a0,*a9
movk 25,a10
#lp
move *a11(PA11),a0,L
move *a0,a0
btst BUT1_B+8,a0
jrz #noprs ;No down transition?
move *a9,a0 ;+1 cnt
addk 1,a0
move a0,*a9
#noprs
SLEEPK 1
dsj a10,#lp
move *a11(plyr_num),a5
movi t1bcnt,a2
move *a2+,a0
move *a2+,a1
btst 1,a5
jrz #tm1
SWAP a0,a1
#tm1
cmp a1,a0
jrlt #x ;Less presses than opponent?
movi ->18000,a0
movi ->f000,a1
movi -20,a3
btst 1,a5
jrz #tm1a
neg a0
neg a1
neg a3
#tm1a
move @ballobj_p,a2,L
move *a2(OXPOS),a4
add a3,a4
move a4,*a2(OXPOS)
move a0,*a2(OXVEL),L
move a1,*a2(OZVEL),L
movi -GRAVB*10,a0
move a0,*a2(OYVEL),L
movi TIPID,a0
calla KIL1C
#x
;RJR
;call ball slap sound
movi swat_snd,a0
calla snd_play1
DIE
#*******************************
* End of quarter (JSRP by score)
SUBR plyr_endofqrtr
movi 1000,a0
move a0,@cntrs_delay ;Delay credit timers
move @gmqrtr,a0 ;Next quarter
addk 1,a0
move a0,@gmqrtr
subk 1,a0
jrne #not1st
movi AUD_1STQUARTR,a0 ;>1st guarter
calla AUD1
JSRP plyr_endqfinishshot
clr a0
move a0,@kp_qscrs,L
move a0,@kp_qscrs+32,L
move a0,@kp_qscrs+64,L
move a0,@kp_qscrs+96,L
move @scores,a0
move a0,@kp_qscrs
move @scores+16,a0
move a0,@kp_qscrs+16
movi tuneend1_snd,a0
calla snd_play1ovr
JSRP hint_page
jruc #tob
#not1st
subk 1,a0
jrne #nothalf
movi AUD_HALFTIME,a0 ;>2nd quarter
calla AUD1
JSRP plyr_endqfinishshot
move @scores,a0
move @kp_qscrs,a14
sub a14,a0
move a0,@kp_qscrs+32
move @scores+16,a0
move @kp_qscrs+16,a14
sub a14,a0
move a0,@kp_qscrs+48
movi tunehalf_snd,a0
calla snd_play1ovr
JSRP halftime_showclips
; SUBR plyr_eoq_lockcont ;Continuation point after clip lockup
clr a0
JSRP stats_page2
movi t1dunkcnt,a2 ;>Setup most dunking team for board shatter
move *a2,a1
cmpi 3,a1
jrlt #nobrk ;!Enough dunks?
subk 2,a1
neg a1
move a1,*a2 ;New cnt
#nobrk
movi t1dunkcnt+16,a2 ;>Setup most dunking team for board shatter
move *a2,a1
cmpi 3,a1
jrlt #nobrk2 ;!Enough dunks?
subk 2,a1
neg a1
move a1,*a2 ;New cnt
#nobrk2
;Restart players here?
move @plyrproc_t,a8,L
move *a8(plyr_headobj_p),a0,L
calla DELOBJ
move *a8(plyr_shadobj_p),a0,L
calla DELOBJ
move a8,a0
calla KILL
move @plyrproc_t+32,a8,L
move *a8(plyr_headobj_p),a0,L
calla DELOBJ
move *a8(plyr_shadobj_p),a0,L
calla DELOBJ
move a8,a0
calla KILL
move @plyrproc_t+64,a8,L
move *a8(plyr_headobj_p),a0,L
calla DELOBJ
move *a8(plyr_shadobj_p),a0,L
calla DELOBJ
move a8,a0
calla KILL
move @plyrproc_t+96,a8,L
move *a8(plyr_headobj_p),a0,L
calla DELOBJ
move *a8(plyr_shadobj_p),a0,L
calla DELOBJ
move a8,a0
calla KILL
move @plyrobj_t,a0,L
calla DELOBJ
move @plyrobj_t+32,a0,L
calla DELOBJ
move @plyrobj_t+64,a0,L
calla DELOBJ
move @plyrobj_t+96,a0,L
calla DELOBJ
movi P1_PID,a0
calla KIL1C
movi P2_PID,a0
calla KIL1C
movi P3_PID,a0
calla KIL1C
movi P4_PID,a0
calla KIL1C
movi P1_PID,a0
calla obj_del1c
movi P2_PID,a0
calla obj_del1c
movi P3_PID,a0
calla obj_del1c
movi P4_PID,a0
calla obj_del1c
CREATE0 doplyrs
movi ARWPID,a0
calla KIL1C
movi arwid,a0
calla obj_del1c
movi ARWPID,a0
calla obj_del1c
CREATE0 delay_arws
movk 1,a0
move a0,@HALT
; movi >1e0c3100,a0
; move a0,@WORLDTLX,L
; clr a0
; move a0,@WORLDTLY,L
; move @ballobj_p,a0,L
; movi >1e7d6caf,a1
; move a1,*a0(OXVAL),L
; movi >ffc265df,a1
; move a1,*a0(OYVAL),L
; movi >0476c52d,a1
; move a1,*a0(OZVAL),L
; movi >2500,a1
; move a1,*a0(OZVEL),L
; clr a1
; move a1,*a0(OXVEL),L
; move a1,*a0(OYVEL),L
jruc #tob
delay_arws
;Give players a chance to start
SLEEPK 10
.ref start_arws
calla start_arws
; SLEEP 1*60
SLEEPK 8
clr a0
move a0,@HALT
DIE
doplyrs
; move @plyrbighead,a0
; zext a0
; cmpi >eaea,a0
; jrnz #no_3d
; movk >f,a2
; move a2,@stlpower
; jruc #adjoff
;#no_3d
; clr a2
; movk ADJHEADSZ,a0 ;Get head size
; calla GET_ADJ ;1-2
; subk 1,a0
; jrle #adjoff ;No big heads?
; movk >f,a2
;#adjoff
; move a2,@plyrbighead
movi plyrproc_t+4*32,a2
movi plyrobj_t+3*32,a9
movk 3,a8
#strtp CREATE 1000h,plyr_main
move a0,-*a2,L ;Save *proc
subk 32,a9
dsj a8,#strtp
move a13,-*a2,L
jruc plyr_main ;#0
#nothalf
subk 1,a0
jrne #not3rd
movi AUD_3RDQUARTR,a0 ;>3rd quarter
calla AUD1
JSRP plyr_endqfinishshot
move @scores,a0
move @kp_qscrs,a14
move @kp_qscrs+32,a1
add a1,a14
sub a14,a0
move a0,@kp_qscrs+64
move @scores+16,a0
move @kp_qscrs+16,a14
move @kp_qscrs+48,a1
add a1,a14
sub a14,a0
move a0,@kp_qscrs+80
movi tuneend1_snd,a0
calla snd_play1ovr
JSRP hint_page
jruc #tob
#not3rd
;2/9/93
; clr a0
; move a0,@gmqrtr
; jruc mark
subk 1,a0
jrne #not4th
movi AUD_4THQUARTR,a0 ;>4th quarter
calla AUD1
JSRP plyr_endqfinishshot
move @scores,a0
move @kp_qscrs,a14
move @kp_qscrs+32,a1
move @kp_qscrs+64,a2
add a1,a14
add a2,a14
sub a14,a0
move a0,@kp_qscrs+96
move @scores+16,a0
move @kp_qscrs+16,a14
move @kp_qscrs+48,a1
move @kp_qscrs+80,a2
add a1,a14
add a2,a14
sub a14,a0
move a0,@kp_qscrs+112
move @scores,a0
move @scores+16,a1
cmp a0,a1
jreq #tie
#endofg callr endgame_audits ;>End of game
SLEEP TSEC*3-30
.ref victory_speech
calla victory_speech
SLEEP TSEC*2+30
; JSRP result_screen
movk 1,a0
JSRP stats_page
clr a0
move a0,@IRQSKYE
calla display_blank
calla save_player_records
calla display_unblank
JSRP rank_screen
JSRP grand_champs_screen ;if a champ is found then
; move a10,a10 ;print the hiscore screen next
; jrz #no_champ
; JSRP show_hiscore
;#no_champ
clr a0
move a0,@qtr_purchased,L ;clr 4x16
move a0,@qtr_purchased+20h,L
move @team1,a0
move a0,@kp_team1
move @team2,a0
move a0,@kp_team2
move @scores,a0,L
move a0,@kp_scores,L
move @kp_qscrs,a0,L
move a0,@kp_qscrs2,L
move @kp_qscrs+32,a0,L
move a0,@kp_qscrs2+32,L
move @kp_qscrs+64,a0,L
move a0,@kp_qscrs2+64,L
move @kp_qscrs+96,a0,L
move a0,@kp_qscrs2+96,L
JSRP winner_stays_on
; move @PSTATUS,a0
; jrz #x
; jruc game_start2
;#x
jauc game_over
#not4th
JSRP plyr_endqfinishshot ;>Overtime
move @scores,a0
move @scores+16,a1
cmp a0,a1
jrne #endofg
;Display Double or Triple OT message, keep going...
#tie ;>Tie
movi AUD_OVERTIME,a0
calla AUD1
movi tuneend1_snd,a0
calla snd_play1ovr
movk 1,a0
move a0,@HALT
movi 6*TSEC+10-70+60-20,a11
CREATE0 scr1
CREATE0 show_ot_msg
SLEEP 160
movi overtime_snd,a0
calla snd_play1ovr
SLEEP 120
movk 12,a1 ;Free time into OT for
movi P1DATA,a2
move @game_purchased,a0
movk 4,b0
clr a3
#tlp btst a3,a0
jrz #nx ;No full game?
move a1,*a2(ply_time) ;Give xtra time
#nx addi PDSIZE,a2
addk 1,a3
dsj b0,#tlp
move b0,@game_purchased
move @team1,a0
move a0,@kp_team1
move @team2,a0
move a0,@kp_team2
move @scores,a0,L
move a0,@kp_scores,L
JSRP hint_page
jruc #tob
; move @ballpnum,a11
; jrnn #ok1
; move @ballpnumshot,a11
;#ok1
; srl 1,a11
; subk 1,a11
; CREATE0 plyr_takeoutball3
; jruc #tob2
#tob
.ref random_ads
calla random_ads
movi nofade_t,a10
CREATE0 fade_up_half
CREATE0 fix_floor
move @gmqrtr,a11
sll 32-1,a11
move @gmqrtr,a0
cmpi 2,a0
jrnz #not2
CREATE takepid,plyr_takeoutball
jruc #tob2
#not2 CREATE0 plyr_takeoutball2
#tob2
clr a0
move a0,@cntrs_delay ;Delay credit timers
move @gmqrtr,a14
cmpi 2,a14
jrz #skp
move a0,@HALT
#skp movi 2<<10+4<<5+9,a0
move a0,@IRQSKYE
move @gmqrtr,a14
cmpi 2,a14
jrnz #skpz
CREATE0 delay_numbs
RETP
#skpz
;Make sure #'s are on at start of qrtr
movi P1DATA,a10
calla stick_number
movi P2DATA,a10
calla stick_number
movi P3DATA,a10
calla stick_number
movi P4DATA,a10
calla stick_number
RETP
delay_numbs
;Make sure #'s are on at start of qrtr
SLEEPK 20
movi P1DATA,a10
calla stick_number
movi P2DATA,a10
calla stick_number
movi P3DATA,a10
calla stick_number
movi P4DATA,a10
calla stick_number
DIE
fix_floor
SLEEPK 12
.ref fix_floorclr
calla fix_floorclr
DIE
#*******************************
SUBRP endgame_audits
; movi 0100b,a0
; move a0,@PSTATUS2
;
; movi 28,a0
; move a0,@scores
; movi 49,a0
; move a0,@scores+10h
movi AUD_COMPLETED,a0 ;>4th quarter
calla AUD1
move @scores,a0
move @scores+10h,a1
cmp a1,a0
jrhi #t1_wins
#t2_wins
movi AUD_LOS_SCORE,a0
move @scores,a1
calla AUD
movi AUD_WIN_SCORE,a0
move @scores+10h,a1
calla AUD
jruc #cont
#t1_wins
movi AUD_WIN_SCORE,a0
move @scores,a1
calla AUD
movi AUD_LOS_SCORE,a0
move @scores+10h,a1
calla AUD
#cont
move @PSTATUS2,a0
andi 011b,a0
jrnz #team1_human
;#team1_cpu
move @scores,a4 ;CPU SCORE
move @scores+10h,a5 ;HUMAN SCORE
movi AUD_CPUGAMES,a0 ;a cpu team
calla AUD1
movi AUD_CPUSCORES,a0
move a4,a1 ;cpu score
calla AUD
callr do_cpu_stats
jruc #cont2
#team1_human
movi AUD_HUMGAMES,a0 ;a human team
calla AUD1
movi AUD_HUMSCORES,a0
move @scores,a1 ;human score
calla AUD
#cont2
move @PSTATUS2,a0
andi 01100b,a0
jrnz #team2_human
;#team2_cpu
move @scores+10h,a4 ;CPU SCORE
move @scores,a5 ;HUMAN SCORE
movi AUD_CPUGAMES,a0 ;a cpu team
calla AUD1
movi AUD_CPUSCORES,a0
move a4,a1 ;cpu score
calla AUD
callr do_cpu_stats
rets
#team2_human
movi AUD_HUMGAMES,a0 ;a human team
calla AUD1
movi AUD_HUMSCORES,a0
move @scores+10h,a1 ;human score
calla AUD
;Now total all human vs. human games, and audit left side winners
move @PSTATUS2,a0
andi 011b,a0
jrz #novs
move @PSTATUS2,a0
andi 01100b,a0
jrz #novs
;Was a human vs. human game.
movi AUD_HUMANVSHUMAN,a0
calla AUD1
move @scores,a0
move @scores+10h,a1
cmp a1,a0
jrlo #tm2_wins
movi AUD_WINSONLEFT,a0
calla AUD1
#tm2_wins
#novs
rets
#*******************************
* Update CPU stats
* A4=Cpu score
* A5=Human score
do_cpu_stats
cmp a4,a5
jrhi #cpu_loses
;cpu_wins
movi AUD_CPUWINS,a0 ;CPU victories + 1
calla AUD1
movi AUD_CPUWINMARG,a0
calla GET_AUD ;RET in A1
sub a5,a4
cmp a1,a4
jrls #not_higher
move a4,a1
movi AUD_CPUWINMARG,a0 ;new win margin
calla STORE_AUDIT
rets
#cpu_loses
movi AUD_CPULOSMARG,a0
calla GET_AUD ;RET in A1
sub a4,a5 ;HUMAN - CPU SCORE
cmp a1,a5
jrls #not_higher
move a5,a1
movi AUD_CPULOSMARG,a0 ;new loss margin
calla STORE_AUDIT
#not_higher
rets
#*******************************
* Let shot finish at end of quarter (JSRP)
SUBRP plyr_endqfinishshot
movi TSEC*5/2,a10
#lp
move @ballpnum,a0
jrnn #stop ;Somebody has ball?
move @ballobj_p,a2,L
move *a2(OYPOS),a0
cmpi -15,a0
jrgt #stop ;Ball near gnd?
SLEEPK 2
#gbcnt dsj a10,#lp
#stop
move @ballpnum,a0
jrn #no_owner
sll 5,a0 ;*32
addi plyrproc_t,a0
move *a0,a0,L
move *a0(plyr_seqflgs),a1
btst DUNK_B,a1
jrz #no_owner
move *a0(plyr_jmpcnt),a1
cmpi 15,a1
jrlt #no_owner
; jrnz #was_bad
; btst SHOOT_B,a1
; jrz #no_owner
;#was_bad
CREATE0 dobad
#no_owner
movk 1,a0
callr plyr_setac
clr a0 ;>Clr ctrl bits
movi P1CTRL,a1
movk 2,b0
#stlp move a0,*a1+,L
dsj b0,#stlp
movi clockid,a0
calla KIL1C ;Kill existing shot clock proc
movi CLSDEAD|clockid,a0
calla obj_del1c ;Delete any 24 second shot clock imgs
clr a0
move a0,@sc_proc,L
move a0,@game_time,L
movk 1,a0
move a0,@HALT
move @tvpanelon,a0,L
jrz #turnon
movi CLSDEAD|tvid,a0
clr a1
calla EXISTOBJ
jrz #turnon
move @tvpanelon,a0,L
movi 6*TSEC,a1
move a1,*a0(PTIME)
#turnon
CREATE0 score_showtvpanel2
move @gmqrtr,a0 ;Ran out of time
subk 4,a0
jrlt #fade
move @scores,a0
move @scores+16,a1
cmp a0,a1
jreq #fade
SLEEP 90
; move @tvpanelon,a0,L
; jrz #turnon
; movi 6*TSEC,a1
; move a1,*a0(PTIME)
;#turnon
;Turn on winning team message
; movi win_snd,a0
; calla snd_play1
movi tuneend_snd,a0
calla snd_play1ovr
.ref winning_msg
CREATE0 winning_msg
jruc #fade
;#otune
; movi tuneend1_snd,a0
; calla snd_play1
#fade
;MJT 12/7
calla pal_clean
movi nofade_t,a10
CREATE0 fade_down_half
#x RETP
dobad SLEEP 100
movi baddec_snd,a0
calla speech_playovrp
DIE
nofade_t ;Pals not to fade
.long scorepr,metprp_p
.long scorep
.long scorepb
.long scorepy
.long GROWBOX
.long SGMD8RED
.long SGMD8WHT
.long textp
.long ledw
.long ledr
.long MD_16
.long MD_16r
.long LED_P
.long GROWBOXr,GROWBOXy,GROWBOXg,GROWBOXb
.long LGMDRED2,LGMDPURP
.long LGMDWHT,WHITE2PAL,PURPLE
.long P_NUGS,P_BLAZ,P_76RS,P_HAWKS,P_MAGIC,P_SONICS,P_SPURS,P_SUNS
.long P_CAVS,P_BUCKS,P_HEAT,P_CLIPS,P_PACER
.long P_BULTS,P_WARS,P_HORS,P_PISS
.long P_LAKS,P_TWOV,P_CELTS,P_JAZZ
.long P_KINGS,P_NETS,P_MAVS,P_ROCKS
.long P_KNIKS,P_BULS,GREENPAL
.long 0
#*******************************
* Player goaltended (Process)
* A11=*Plyr obj
SUBR plyr_goaltending
move *a11(OPLINK),a11,L
move *a11(plyr_num),a0
srl 1,a0
move a0,a11
XORK 1,a0
sll 4,a0 ;0 or 16
addi scores,a0 ;+Base
move @ballptsforshot,a1
move a1,a3
calla score_add
calla plyr_setptsdown
movk PS_2PTS_MADE,a0 ;>Inc try shot stat
subk 2,a3
jreq #2ptr
movk PS_3PTS_MADE,a0
#2ptr move @ballpnumshot,a1
calla inc_player_stat
calla prt_top_scores ;Update scores at scrn top
movi TSEC*2,a0
callr plyr_setshtdly
CREATE0 goaltend_text
movi whstle_snd,a0
calla snd_play1
move @tvpanelon,a0,L
jrz #turnon
movi 4*TSEC+10-70,a1
move a1,*a0(PTIME)
jruc #alrdyon
#turnon
CREATE0 score_showtvpanel
#alrdyon
movi P1DATA,a10
calla stick_number
movi P2DATA,a10
calla stick_number
movi P3DATA,a10
calla stick_number
movi P4DATA,a10
calla stick_number
SLEEP 30
clr a0
move a0,@ballptsforshot
jruc plyr_takeoutball3
#*******************************
* Show goaltending message (JSRP)
SUBRP goaltend_text
; move @ballobj_p,a2,L ;clear out ball vels
; clr a0
; move a0,*a2(OXVEL),L
; move a0,*a2(OYVEL),L
; move a0,*a2(OZVEL),L
;
; movk 4,a3
; movi plyrobj_t,a2,L ;clear out player vels
;#velini_lp
; move *a2+,a1,L
; move a0,*a1(OXVEL),L
; move a0,*a1(OYVEL),L
; move a0,*a1(OZVEL),L
; dsj a3,#velini_lp
;
; SLEEPK 1
;
; movk 1,a0
; move a0,@HALT
movk 3,a10
CREATE0 doalert_snd
move @game_time,a0,L
jaz SUCIDE
movi #ln0_setup,a2
calla setup_message
movi CLSDEAD|123,a0
move a0,@mess_objid
movi #str_goaltend,a4
calla print_string_C2
CREATE0 flash_bigtxt
move a0,a9
; movk 3,a10
; CREATE0 doalert_snd
SLEEP TSEC*2
move a9,a0
calla KILL
movi CLSDEAD|123,a0
calla obj_del1c ;delete text
; clr a0
; move a0,@HALT
DIE
#ln0_setup
RJR_STR omlgmd_ascii,12,2,200,120-44/2,LGMDRED2,0
#str_goaltend
.string "GOAL TENDING",0
.even
#*******************************
* Control players for taking the ball out (Process)
* A11=Team who gets ball (0=1, !0=2)
STRUCTPD
WORD ptob_pball ;Plyr # (0-3) who gets ball
WORD ptob_pball2 ;P# who gets ball passed to him
SUBR plyr_takeoutball
; move @ballpnumshot,@ballpnum ;DEBUG
; move @ballpnumshot,a2
; sll 5,a2 ;*32
; addi plyrproc_t,a2
; move *a2,a1,L
; clr a0
; move a0,*a1(plyr_dribmode) ;Reset dribble
; movi -1,a0
; move a0,@inbound
; DIE
movi TOB_PID,a0 ;Kill any other plyr_takeoutball
move a0,*a13(PROCID)
calla KIL1C
movk 8,a0
move a0,@ballsclastp
movi TSEC+20,a0
callr plyr_setshtdly
clr a0
move a0,@P1CTRL,L ;clear p1 & p2
move a0,@P3CTRL,L ;p3 & p4
SLEEPK 1
movi -1,a0
move a0,@ballpnum
move a0,@ballpnumlast
movk 1,a0
callr plyr_setac
clr a0 ;Clr staggers
movi plyr_stagcnt,a1
callr plyr_setprocword
movi plyrproc_t,a0
clr a1
clr a2
move @PSTATUS,a3
movk 2,a9
move a11,a11
jrz #t1
addi 32*2,a0
movk 1,a1
movk 2,a2
srl 2,a3
clr a9
#t1
move *a0+,a8,L ;A8=*Proc of plyr who gets ball
move *a0+,a7,L
move a1,@inbound ;Inbounding team (0-1)
move a3,a3 ;if human and CPU
jrz #no_players ;always make CPU
cmpi 011b,a3 ;pass ball to human
jreq #two_players
andi 1,a3
jrz #1st
jruc #2nd
#two_players
#no_players
move *a8(plyr_balldist),a0
move *a7(plyr_balldist),a1
cmp a1,a0
jrle #1st ;Closer?
#2nd
move a7,a8
addk 1,a2 ;2nd in team
#1st
move a2,*a13(ptob_pball)
XORK 1,a2
move a2,*a13(ptob_pball2)
movi TSEC*3,a10 ;>Get ball
#gblp1
movi -1,a0
move a0,@ballpnum
move a0,@ballpnumlast
SLEEPK 1
callr plyrtob_moveo3
move @ballobj_p,a3,L
move *a3(OXPOS),a0
addk 6,a0
move *a3(OZPOS),a1
move *a13(ptob_pball),a2
callr plyrtob_seekxy
jrz #atball
dsj a10,#gblp1
jruc #atball2
#atball
move *a8(plyr_jmpcnt),a0
jrnz #gblp1
#atball2
clr a0
move a0,*a8(plyr_shtdly)
movi TSEC*1,a10 ;>Get ball
#gblp2
movi -1,a0
move a0,@ballpnum
move a0,@ballpnumlast
SLEEPK 1
move @ballpnum,a0
jrn #gbcnt2
move *a13(ptob_pball),a2
cmp a0,a2
jreq #gotball
#gbcnt2
callr plyrtob_moveo3
move @ballobj_p,a3,L
move *a3(OXPOS),a0
addk 6,a0
move *a3(OZPOS),a1
move *a13(ptob_pball),a2
callr plyrtob_seekxy
dsj a10,#gblp2
#gotball
move *a13(ptob_pball),a0
move a0,@ballpnum
clr a0
move a0,*a8(plyr_dribmode)
movi TSEC*3,a10 ;>Run out of bounds
#outlp
SLEEPK 1
callr plyrtob_moveo3
movi -355,a0
move a11,a11
jrz #outl ;Team2 on def
neg a0
#outl addi WRLDMID,a0
move a0,a3
movi CZMID-20,a1
move *a13(ptob_pball),a2
move a2,@ballpnum
callr plyrtob_seekxy
jrz #outofb
dsj a10,#outlp
#outofb
movi -1,a0
move a0,*a8(plyr_dribmode)
calla call_scores
movi TSEC*3,a10 ;>Wait for other 3 to get in place
#wtlp SLEEPK 1
callr plyrtob_moveo3
jrz #inpos
dsj a10,#wtlp
#inpos
SLEEPK 30
movk 20,a0
move a0,@last_name_time ;don't call pass on inbound
move *a13(ptob_pball),a10 ;>Pass with turbo
sll 4,a10 ;*16
addi P1CTRL,a10
movi (BUT2_M|BUT3_M)<<8|BUT2_M|BUT3_M,a0
move a0,*a10
move *a13(ptob_pball),a0
move a0,@ballpnum
movi TSEC*2,a2 ;>Wait for pass to start
#waitp PUSHP a2
SLEEPK 1
PULLP a2
move *a8(plyr_seqflgs),a0
btst PASS_B,a0
jrnz #passing
dsj a2,#waitp
#passing
clr a0
move a0,*a10
movi -1,a0
move a0,@inbound ;Inbounding off
SLEEPK 30
#runinlp
SLEEPK 1
movi -345,a0
move a11,a11
jrz #outl2 ;Team2 on def
neg a0
#outl2 addi WRLDMID,a0
movi CZMID-20,a1
move *a13(ptob_pball),a2
callr plyrtob_seekxy
jrnz #runinlp
plyr_tobend
move a11,a0
calla shot_clock ;New 24
clr a0
move a0,@clock_active ;Start game clock again
move a0,@plyrinautorbnd ;In case seq didn't clr
move a0,@ballflash
move a0,@pass_off
move a0,@steals_off
move a0,@slamming
callr plyr_setac
clr a0 ;Clr staggers
movi plyr_stagcnt,a1
callr plyr_setprocword
clr a0
movi plyr_d_cflgs,a1
callr plyr_setprocword
.ref drone_setuptob
calla drone_setuptob
DIE
#*****************************************************************************
* Control players for taking the ball out (Process)
* Teleport players to their positions
* A11=Team who gets ball (0=1, !0=2)
.asg 60h,FACE_LEFT
.asg 20h,FACE_RIGHT
SUBR plyr_takeoutball2
movi TOB_PID,a0 ;Kill any other plyr_takeoutball
move a0,*a13(PROCID)
calla KIL1C
movk 8,a0
move a0,@ballsclastp
movk 1,a0
callr plyr_setac
clr a0
move a0,@P1CTRL,L ;clear p1 & p2
move a0,@P3CTRL,L ;p3 & p4
clr a0
move a0,@WORLDTLY,L
movi [WRLDMID-200-MAX_VIEW1,0],a1
clr a2 ;player 1 has ball
movi #t1_setup_table,a10
move a11,a11
jrz #setib
movk 1,a0
movi [WRLDMID-200+MAX_VIEW1,0],a1
movk 3,a2 ;player 4 has ball
movi #t2_setup_table,a10
#setib move a0,@inbound ;Inbounding team
move a1,@WORLDTLX,L
subi [WRLDMID-200,0],a1
move a1,@gndx,L
move a2,@ballpnum
movi -1,a0
move a0,@ballpnumlast
move a2,*a13(ptob_pball) ;0,3
move a2,a0
XORK 1,a0
move a0,*a13(ptob_pball2) ;1,2
PUSH a13
sll 5,a2 ;x 32 bits
movi plyrobj_t,a8
add a2,a8
move *a8,a8,L ;*Plyr obj
addi plyrproc_t,a2
move *a2,a13,L ;*Plyr process
callr plyr_setballxyz
PULL a13
movk 4,a14
#init_loop
PUSH a14
move *a10+,a0 ;player (0-3)
move *a10+,a4
sll 16,a4 ;player Z VAL
move *a10+,a5
sll 16,a5 ;player X VAL
move *a10+,a7 ;player direction (right)
callr plyr_init
PULL a14
dsj a14,#init_loop
SLEEP 1*60
movk 20,a0
move a0,@last_name_time ;don't call pass on inbound
move *a13(ptob_pball),a10 ;>Pass with turbo
sll 4,a10 ;*16
addi P1CTRL,a10
movi (BUT2_M|BUT3_M)<<8|BUT2_M|BUT3_M,a0
move a0,*a10
#waitp SLEEPK 1
move *a8(plyr_seqflgs),a0
btst PASS_B,a0
jrz #waitp
clr a0
move a0,*a10
movi -1,a0
move a0,@inbound ;Inbounding off
SLEEPK 30
#runinlp
SLEEPK 1
movi -345,a0
move a11,a11
jrz #outl2 ;Team2 on def
neg a0
#outl2 addi WRLDMID,a0
movi CZMID-20,a1
move *a13(ptob_pball),a2
callr plyrtob_seekxy
jrnz #runinlp
jruc plyr_tobend
#t1_setup_table
;normal setup (left)
.word 0,CZMID-20, WRLDMID-365, 20h ;ply,z,x,face
.word 1,CZMID+15, WRLDMID-280, 60h ;ply,z,x,face
.word 2,CZMID-50, WRLDMID-160, 60h ;ply,z,x,face
.word 3,CZMID+70, WRLDMID-160, 60h ;ply,z,x,face
#t2_setup_table
;normal setup (right)
.word 3,CZMID-20, WRLDMID+365, 60h ;ply,z,x,face
.word 2,CZMID+15, WRLDMID+280, 20h ;ply,z,x,face
.word 0,CZMID-50, WRLDMID+160, 20h ;ply,z,x,face
.word 1,CZMID+70, WRLDMID+160, 20h ;ply,z,x,face
#*****************************************************************************
* Clear out plyr variables
* a0 = player number in (0-3)
* a4 = player Z VAL
* a5 = player X VAL
* a7 = player direction (00h - 7fh)
SUBR plyr_init
PUSH a8,a10,a13
sll 5,a0 ;x 32 bits
movi plyrproc_t,a13
add a0,a13
move *a13,a13,L ;*plyr process
addi plyrobj_t,a0
move *a0,a8,L ;*plyr object
move a4,*a8(OZVAL),L
callr anipt_getsclxy ;a0 = anix, a1 = aniy
move a0,*a8(OXANI),L
neg a1
move a1,*a8(OYVAL),L
sub a0,a5
move a5,*a8(OXVAL),L
movk STND_SEQ,a0
callr plyr_setseq
clr a0
move a0,*a8(OXVEL),L
move a0,*a8(OYVEL),L
move a0,*a8(OZVEL),L
move a0,*a13(plyr_jmpcnt)
move a0,*a13(plyr_dribmode)
move a0,*a13(plyr_offscrn)
move a0,*a13(plyr_d_cflgs)
move a0,*a13(plyr_hangcnt)
move a0,*a13(plyr_nojoy)
move a0,*a13(plyr_shtdly)
move a0,*a13(plyr_passbtime)
move a0,*a13(plyr_rcvpass)
move a0,*a13(plyr_ownball)
move a0,*a13(plyr_stagcnt)
movi -1,a0
move a0,*a13(plyr_newdir)
movk 1,a0
move a0,*a13(PA10),L ;reset sequence wake count
PULL a8,a10,a13
rets
#*****************************************************************************
* Control players for taking the ball out (Process)
* A11=Team who gets ball (0=1, !0=2)
SUBR plyr_takeoutball3
movi TOB_PID,a0 ;Kill any other plyr_takeoutball
move a0,*a13(PROCID)
calla KIL1C
movk 8,a0
move a0,@ballsclastp
movk 25,a0
callr plyr_setshtdly
SLEEPK 1
movi -1,a0
move a0,@ballpnum
move a0,@ballpnumlast
clr a0
move a11,a11
jrz #setib
movk 1,a0
#setib move a0,@inbound ;Inbounding team
movk 1,a0
callr plyr_setac
clr a0 ;Clr staggers
movi plyr_stagcnt,a1
callr plyr_setprocword
clr a2
movk 2,a9 ;A9=1st p# of team on defense
movi plyrproc_t,a0
move a11,a11
jrz #t1
movk 2,a2
clr a9
addi 32*2,a0
#t1
move *a0+,a8,L ;A8=*Proc of plyr who gets ball
move *a0+,a7,L
move *a8(plyr_hpdist),a0
move *a7(plyr_hpdist),a1
cmp a1,a0
jrle #1st ;Closer?
move a7,a8
addk 1,a2 ;2nd in team
#1st
move a2,*a13(ptob_pball)
move a2,@ballpnum
XORK 1,a2
move a2,*a13(ptob_pball2)
movi -1,a0
move a0,@ballpnumlast
#outlp
SLEEPK 1
move *a13(ptob_pball),a0
move a0,@ballpnum
clr a0
move a0,*a8(plyr_dribmode)
callr plyrtob_moveo3
movi -355,a0
move a11,a11
jrz #outl ;Team2 on def
neg a0
#outl addi WRLDMID,a0
movi CZMID-20,a1
move *a13(ptob_pball),a2
callr plyrtob_seekxy
jrnz #outlp
movi TSEC*3,a10 ;>Wait for other 3 to get in place
#wtlp SLEEPK 1
callr plyrtob_moveo3
jrz #inpos
dsj a10,#wtlp
#inpos
SLEEP 60
move *a13(ptob_pball),a10 ;>Pass with turbo
sll 4,a10 ;*16
addi P1CTRL,a10
movi (BUT2_M|BUT3_M)<<8|BUT2_M|BUT3_M,a0
move a0,*a10
#waitp SLEEPK 1
move *a8(plyr_seqflgs),a0
btst PASS_B,a0
jrz #waitp
clr a0
move a0,*a10
movi -1,a0
move a0,@inbound ;Inbounding off
SLEEPK 30
#runinlp
SLEEPK 1
movi -345,a0
move a11,a11
jrz #outl2 ;Team2 on def
neg a0
#outl2 addi WRLDMID,a0
movi CZMID-20,a1
move *a13(ptob_pball),a2
callr plyrtob_seekxy
jrnz #runinlp
jruc plyr_tobend
********************************
* Set new autoctrl value
* A0=autoctrl #
* Trashes scratch
SUBRP plyr_setac
movi plyrproc_t,a14
movk 4,b0
#aclp move *a14+,a1,L
move a0,*a1(plyr_autoctrl)
dsj b0,#aclp
rets
#*******************************
* Set new shtdly value
* A0=shtdly #
* Trashes scratch
SUBR plyr_setshtdly
movi plyrproc_t,a14
movk 4,b0
#aclp move *a14+,a1,L
move a0,*a1(plyr_shtdly)
dsj b0,#aclp
rets
#*******************************
* Set word in plyr's proc
* A0=#
* A1=Proc offset
* Trashes scratch
SUBRP plyr_setprocword
move a2,b1
movi plyrproc_t,a14
movk 4,b0
#aclp move *a14+,a2,L
add a1,a2
move a0,*a2
dsj b0,#aclp
move b1,a2
rets
#*******************************
* Move the other 3 guys who aren't getting the ball
* A9=1st pnum of team on defense (0/2)
* A11=Team who gets ball (0=1, !0=2)
* >A0=0 if all players in position (Pass CC)
* Trashes scratch, A2-A4
SUBRP plyrtob_moveo3
movi -150,a0 ;>Send defenders to their spot
movi -270,a4
move a11,a11
jrz #t2 ;Team1 gets?
neg a0
neg a4
#t2 addi WRLDMID,a0
move a0,a3
movi CZMID-50,a1
move a9,a2
callr plyrtob_seekxy
PUSH a0
move a3,a0
movi CZMID+70,a1
addk 1,a2
callr plyrtob_seekxy
PUSH a0
move a4,a0 ;>Send teammate to spot
addi WRLDMID,a0
movi CZMID+10,a1
move *a13(ptob_pball2),a2
callr plyrtob_seekxy
PULL a1
or a1,a0
PULL a1
or a1,a0
rets
#*******************************
* Push stick to move plyr towards an XZ location
* A0=X to seek
* A1=Z
* A2=Player # (0-3)
* >A0=Joy bits set or 0 (Pass CC)
* Trashes scratch
SUBRP plyrtob_seekxy
PUSH a2,a8,a11
move a0,b0
sll 4,a2 ;*16
move a2,a11
addi P1CTRL,a11
sll 1,a2
addi plyrobj_t,a2
move *a2,a8,L
move *a8(OXPOS),a2
move *a8(OXANI+16),a14
add a14,a2
sub a0,a2
clr a0
move a2,a14
abs a2
subk 10,a2
jrle #onx
move a14,a14
jrlt #nolft
subk 4,a0 ;Left
#nolft addk 8,a0 ;Rgt
#onx
move *a8(OZPOS),a2
sub a1,a2
move a2,a14
abs a2
subk 10,a2
jrle #onz
move a14,a14
jrlt #noup
subk 1,a0 ;Up
#noup addk 2,a0 ;Dn
#onz
move a0,*a11
move a0,a0
jrnz #x
move b0,a14
move *a8(OXANI+16),a2
sub a2,a14
move a14,*a8(OXPOS)
move a1,*a8(OZPOS)
move *a8(OXVEL),a1,L
sra 1,a1
move a1,*a8(OXVEL),L
move *a8(OZVEL),a1,L
sra 1,a1
move a1,*a8(OZVEL),L
#x PULL a2,a8,a11
move a0,a0
rets
.if 0
#*******************************
* Control players for free throws (Process)
* A11=Team who scored (0=2, !0=1)
STRUCTPD
WORD pft_pball ;Plyr # (0-3) who gets ball
WORD pft_pball2 ;P# who gets ball passed to him
APTR pft_bbobj ;*Backboard/crowd object
SUBR plyr_freethrow
jruc plyr_takeoutball
movi TSEC,a10 ;>Let shot finish
#lp movi -1,a0
move a0,@ballpnum
SLEEPK 1
dsj a10,#lp
movi [20,0],a0
movi [20,0],a1
; movi ftbackbd,a2
movi [500,0],a3 ;Z
movi DMAWNZ|M_NOCOLL|M_SCRNREL,a4
movi CLSDEAD,a5
clr a6
clr a7
calla BEGINOBJ2
move a8,*a13(pft_bbobj),L
movk 1,a0
callr plyr_setac
clr a2
movk 2,a9 ;A9=1st p# of team on defense
movi plyrproc_t,a0
move a11,a11
jrz #t1
movk 2,a2
clr a9
addi 32*2,a0
#t1
move *a0+,a8,L ;A8=*Proc of plyr who gets ball
move *a0+,a7,L
move *a8(plyr_balldist),a0
move *a7(plyr_balldist),a1
cmp a1,a0
jrle #1st ;Closer?
move a7,a8
addk 1,a2 ;2nd in team
#1st
move a2,*a13(pft_pball)
XORK 1,a2
move a2,*a13(pft_pball2)
movi TSEC*4,a10 ;>Get ball
#gblp
movi -1,a0
move a0,@ballpnum
SLEEPK 1
callr plyrtob_moveo3
move @ballobj_p,a3,L
move *a3(OXPOS),a0
addk 6,a0
move *a3(OZPOS),a1
move *a13(pft_pball),a2
callr plyrtob_seekxy
move @ballpnum,a0
jrn #gbcnt
cmp a0,a2
jreq #gotball
#gbcnt dsj a10,#gblp
#gotball
move *a13(pft_pball),a0
move a0,@ballpnum
movi TSEC*3,a10 ;>Run out of bounds
#outlp
SLEEPK 1
callr plyrtob_moveo3
movi -370,a0
move a11,a11
jrz #outl ;Team2 on def
neg a0
#outl addi WRLDMID,a0
move a0,a3
movi CZMID-20,a1
move *a13(pft_pball),a2
callr plyrtob_seekxy
jrz #outofb
; move *a8(PA8),a2,L ;Get * obj
; move *a2(OXPOS),a0
; move *a2(OXANI+16),a14
; add a14,a0
; abs a0
; abs a3
; sub a0,a3
; subk 20,a3
; jrlt #outofb
dsj a10,#outlp
#outofb
movi TSEC*3,a10 ;>Wait for other 3 to get in place
#wtlp SLEEPK 1
callr plyrtob_moveo3
jrz #inpos
dsj a10,#wtlp
#inpos
move *a13(pft_pball),a10 ;>Pass with turbo
sll 4,a10 ;*16
addi P1CTRL,a10
movi >60,a0
move a0,*a10
SLEEPK 10
clr a0
move a0,*a10
SLEEP 40
clr a0
callr plyr_setac
move *a13(pft_bbobj),a0,L
calla DELOBJ
DIE
#*******************************
* Create ground alignment dots for debugging (Process)
SUBR gnd_aligndots
.ref hoopl_t,hoopr_t
movi hoopl_t,a11 ;>Setup left hoop dots
jruc #hlstrt
#hllp
sll 16,a0
move *a11+,a1 ;Y
sll 16,a1
move *a11+,a3 ;Z
addi 300,a3
movi alignimg_t,a2
movi >800c|M_NOCOLL|M_3D|M_NOSCALE,a4
movi CLSDEAD,a5
clr a6
clr a7
calla BEGINOBJ2
movi >101,a0
move a0,*a8(OCONST)
movi -300,a0
move a0,*a8(OMISC) ;Z offset
addk 16,a11
#hlstrt move *a11+,a0 ;X
jrnz #hllp ;!End?
movi hoopr_t,a11 ;>Setup rgt hoop dots
jruc #hrstrt
#hrlp
sll 16,a0
move *a11+,a1 ;Y
sll 16,a1
move *a11+,a3 ;Z
addi 300,a3
movi alignimg_t,a2
movi >800c|M_NOCOLL|M_3D|M_NOSCALE,a4
movi CLSDEAD,a5
clr a6
clr a7
calla BEGINOBJ2
movi >101,a0
move a0,*a8(OCONST)
movi -300,a0
move a0,*a8(OMISC) ;Z offset
addk 16,a11
#hrstrt move *a11+,a0 ;X
jrnz #hrlp ;!End?
movi #init_t,a11 ;>Setup gnd dot images
jruc #5
#lp
addi 200,a0
sll 16,a0
clr a1 ;Y
move *a11+,a3 ;Z
movi alignimg_t,a2
movi >800c|M_NOCOLL|M_3D|M_NOSCALE,a4
movi CLSDEAD,a5
clr a6
clr a7
calla BEGINOBJ
movi >101,a0
move a0,*a8(OCONST)
#5 move *a11+,a0 ;X
cmpi 4000,a0
jrne #lp ;!End?
move *a8(OPAL),a9
sll 8,a9
addk 1,a9 ;Color 1
clr a10
#plp
move a10,a0
addi #color_t,a0
move a9,a1
movk 1,a2 ;#Colors
calla pal_set
SLEEPK 10
addk 16,a10
sll 32-6,a10 ;0-3 color #
srl 32-6,a10
jruc #plp
#z0 .equ GZBASE
#z1 .equ 1000
#z2 .equ 1095
#z3 .equ 1190
#z4 .equ 1284
#z5 .equ GZMAX
#init_t
; .word -350,#z0, 0,#z0, 350,#z0
; .word -350,#z1, 0,#z1, 350,#z1
; .word -350,#z2, 0,#z2, 350,#z2
; .word -350,#z3, 0,#z3, 350,#z3
; .word -350,#z4, 0,#z4, 350,#z4
; .word -350,#z5, 0,#z5, 350,#z5
.word 4000
#color_t
COLORW 0,0,0, 0,16,0, 0,31,0, 0,16,0
; .endif
********************************
; .if DEBUG
alignimg_t
.word 1,1,0,0
.long 0
.word >1000
.long #test_p
#test_p .word 1, 0
********************************
* Start an alignment dot for a player
* A13=*Plyr proc
* Trashes scratch
SUBRP plyr_getgndaligndot
PUSH a2,a3,a4,a5,a6,a7,a8
clr a0 ;X
clr a1 ;Y
movi CZMIN,a3 ;Z
movi alignimg_t,a2
movi >800c|M_NOCOLL|M_3D|M_NOSCALE,a4
movi CLSDEAD,a5
clr a6
clr a7
calla BEGINOBJ
movi >101,a0
move a0,*a8(OCONST)
movi -300,a0
move a0,*a8(OMISC) ;Z offset
move a8,*a13(plyr_aligndot_p),L
PULL a2,a3,a4,a5,a6,a7,a8
rets
********************************
* Set alignment dot to players position
* A8=*Plyr obj
* A13=*Plyr proc
* Trashes scratch
SUBRP plyr_setgndaligndot
PUSH a2,a3,a4,a5,a6,a7
callr anipt_getsclxy
move *a8(OXVAL),a14,L
add a14,a0
move *a13(plyr_aligndot_p),a2,L
move a0,*a2(OXVAL),L
move *a8(OZPOS),a14
addi 300,a14
move a14,*a2(OZPOS)
PULL a2,a3,a4,a5,a6,a7
rets
; .endif
.endif
#*******************************
* Get dir for object to face an XZ
* A6=Dest X
* A7=Dest Z
* A8=*Source obj
* >A0=0-127
* Trashes A0-A2,A14
SUBRP seekdir_obxz128
move *a8(OXPOS),a0 ;Get SX
move *a8(OXANI+16),a14
add a14,a0
move *a8(OZPOS),a1 ;Get SZ
********************************
* Get dir for src XY to face an XY
* A0=Src X
* A1=Src Y
* A6=Dest X
* A7=Dest Y
* >A0=0-127
* Trashes A0-A2,A14
SUBR seekdir_xyxy128
clr a2 ;Octant 0-1
sub a6,a0 ;A0=SrcX-DestX
jrgt #100
abs a0
sub a7,a1 ;A1=SrcY-DestY
jrnn #oct01
movk 8,a2 ;Oct 2-3
abs a1
jruc #160
#100 movk 16,a2 ;Oct 4-5
sub a7,a1 ;A1=SrcY-DestX
abs a1
jrnn #200
movk 16+8,a2 ;Oct 6-7
#160 SWAP a0,a1
#200 sll 2,a2 ;Oct*4
#oct01 clr a14
cmp a1,a0 ;>Cmp slope
jrhs #300
srl 2+2,a1 ;Bigger/16
jrnz #250
jruc #x
#lp1 addk 1,a2 ;Next 1/16 oct
add a1,a14 ;+1/16
#250 cmp a0,a14
jrlo #lp1
jruc #x
#300 addk 31,a2 ;End of next octant
srl 2+2,a0 ;Bigger/16
jrnz #350
jruc #x
#lp2 subk 1,a2 ;Next 1/16 oct
add a0,a14 ;+1/16
#350 cmp a1,a14
jrlo #lp2
#x movi >7f,a0
and a2,a0
rets
#*******************************
* Get dir and distance from object to object
* A0=*Dest obj
* A8=*Source obj
* >A0=0-127
* >A1=Distance
* Trashes scratch, A2,A6,A7
SUBRP seekdirdist_obob128
move *a0(OXPOS),a6 ;Get SX
move *a0(OXANI+16),a14
add a14,a6
move *a0(OZPOS),a7 ;Get SZ
#*******************************
* Get dir and distance from object to XZ
* A6=Dest X
* A7=Dest Z
* A8=*Source obj
* >A0=0-127
* >A1=Distance
* Trashes scratch, A2
SUBR seekdirdist_obxz128
move *a8(OXPOS),a0 ;Get SX
move *a8(OXANI+16),a14
add a14,a0
move *a8(OZPOS),a1 ;Get SZ
clr a2 ;Octant 0-1
sub a6,a0 ;A0=SrcX-DestX
jrgt #100
abs a0
sub a7,a1 ;A1=SrcY-DestY
jrnn #oct01
movk 8,a2 ;Oct 2-3
abs a1
jruc #160
#100 movk 16,a2 ;Oct 4-5
sub a7,a1 ;A1=SrcY-DestX
abs a1
jrnn #200
movk 16+8,a2 ;Oct 6-7
#160 SWAP a0,a1
#200 sll 2,a2 ;Oct*4
#oct01 clr a14
cmp a1,a0 ;>Cmp slope
jrhs #300
move a0,b0 ;Save distance
move a1,b1
srl 2+2,a1 ;Bigger/16
jrnz #250
jruc #x
#lp1 addk 1,a2 ;Next 1/16 oct
add a1,a14 ;+1/16
#250 cmp a0,a14
jrlo #lp1
jruc #x
#300 move a0,b1 ;Save distance
move a1,b0
addk 31,a2 ;End of next octant
srl 2+2,a0 ;Bigger/16
jrnz #350
jruc #x
#lp2 subk 1,a2 ;Next 1/16 oct
add a0,a14 ;+1/16
#350 cmp a1,a14
jrlo #lp2
#x ;>Calc distance (long+short/2.667)
srl 1,b0 ;Shorter/2
add b0,b1
srl 2,b0 ;Shorter/8
sub b0,b1
move b1,a1
movi >7f,a0
and a2,a0
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
SUBR 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
.end