nba-jam-tournament-edition/DRONE.ASM

1436 lines
24 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
* Initiated: 9/17/92
*
* Modified: Shawn Liptak, 12/29/92 -Split from plyr.asm
*
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 1/25/93 20:25
**************************************************************
.file "drone.asm"
.title "basketball drone 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 "shawn.hdr" ;Macros
.asg 0,SEQT
.include "plyr.equ"
;sounds external
;symbols externally defined
.ref plyrobj_t,plyrproc_t
.ref ballobj_p
.ref ballpnum
.ref seekdirdist_obxz128
.ref drone2on
.ref drone2_main,drone2_adjskill,drone2_setuptob
.ref game_time,gmqrtr
.ref shotimer
.ref team1,team2
.ref RNDPER
.ref PSTATUS
.ref GET_ADJ
;symbols defined in this file
;uninitialized ram definitions
.bss drnzzcnt ,16 ;Drone zigzag mode cntdn
.bss drnzzmode ,16 ;Drone zigzag mode (0-?)
;equates for this file
.text
#***************************************************************
* Main drone logic
* A8=*Obj
* A11=*Ctrl bits
* A13=*Plyr process
* Trashes scratch, A2-A5
SUBR drone_main
move @drone2on,b0
jrnz drone2_main
move @ballpnum,a14
jrn drone_chaseball ;No owner?
move *a13(plyr_ownball),a1
jrz drone_defence ;We don't have ball?
jrn drone_offwoball ;Teammate has ball?
;------- ;>Offense
move @PSTATUS,a0 ;Plyr start bits 0-3
move *a13(plyr_num),a1
XORK 1,a1
btst a1,a0
jrz #tmdrone ;Teammate is a drone?
move *a13(plyr_d_cflgs),a2
btst DRN_PASS_B,a2
jrz #nopass
movi BUT2_M<<8+BUT2_M,a14 ;>Make him pass
jruc #docmd
#nopass
btst DRN_SHOOT_B,a2
jrz #noshoot
movi BUT1_M|BUT3_M,a14 ;>Make him shoot
movk 3,a0
move a0,*a13(plyr_d_seekcnt)
#docmd
move *a11,a0
sll 32-4,a0
srl 32-4,a0
; move a2,a2
; jrnn #noturb
ori BUT3_M,a0 ;+turbo
#noturb
or a14,a0
move a0,*a11
clr a0
move a0,*a13(plyr_d_cflgs)
jruc #x
#noshoot
#tmdrone
movk 1,a0
move a0,*a13(plyr_d_mode)
move *a13(plyr_seqflgs),a2
btst PASS_B,a2
jrnz #kilbuts
move *a13(plyr_jmpcnt),a14
jrnz #injmp
move *a11,a0
btst BUT1_B,a0
jrnz #fake ;Shoot button down?
btst SHOOT_B,a2
jrnz #injmp
move *a13(plyr_dribmode),a14
jrn #nodrib
move *a13(plyr_num),a14 ;>Chk for breakaway
srl 1,a14
movk 1,a0
xor a0,a14
sll 6,a14 ;*64
addi plyrproc_t,a14
move *a14+,a2,L
move *a14+,a3,L
move *a2(plyr_hpdist),a2
move *a3(plyr_hpdist),a3
move *a13(plyr_ohpdist),a4
cmp a4,a2
jrlt #shootrnd ;He's closer?
cmp a4,a3
jrlt #shootrnd ;He's closer?
move *a13(plyr_ohoopx),a0
movi CZMID,a1
callr drone_seekxy
move *a13(plyr_d_skill),a14
cmpi -11-3,a14
jrle #noturb2
ori BUT3_M,a0 ;Push turbo
move a0,*a11
#noturb2
move @game_time,a1,L
cmpi >200,a1
jrlt #shoot2 ;Less than 2 secs?
move @shotimer+16,a1 ;Tens
jrnz #scok
move @shotimer,a1 ;Ones
subk 2,a1
jrlt #shoot2 ;Less than 2 secs?
#scok
move *a13(plyr_ohpdist),a14
cmpi 170,a14
jrge #x ;Too far?
cmpi 50,a14
jrlt #shoot2 ;Close?
movk >1f,a0
callr rnd
jrnz #x
jruc #shoot2
#nodrib ;>Can't dribble
move *a13(plyr_ohpdist),a0
cmpi 230,a0
jrlt #shoot2
callr drone_pass
jrnz #x ;Pass OK?
movk >1f,a0
callr rnd
jrnz #x ;97%?
jruc #shoot2
#shootrnd
move @game_time,a1,L
cmpi >200,a1
jrlt #shoot2 ;Less than 2 secs?
move @shotimer+16,a1
jrnz #scok2
move @shotimer,a1
subk 2,a1
jrlt #shoot2 ;Less than 2 secs?
#scok2
PUSH a6,a7
move *a13(plyr_ohoopx),a6
movi CZMID,a7
calla seekdirdist_obxz128
PULL a6,a7
move *a13(plyr_o1dist),a14
cmpi 80,a14
jrgt #o1dok ;He's too far?
cmp a14,a1
jrlt #o1dok ;I'm closer?
move *a13(plyr_o1dir),a2
sub a0,a2
abs a2
cmpi >40,a2
jrle #o1dsml
subi >80,a2
abs a2
#o1dsml subk 32,a2
jrlt #goaround ;In front of me?
#o1dok
move *a13(plyr_o2dist),a14
cmpi 80,a14
jrgt #o2dok ;He's too far?
cmp a14,a1
jrlt #o2dok ;I'm closer?
move *a13(plyr_o2dir),a2
sub a0,a2
abs a2
cmpi >40,a2
jrle #o2dsml
subi >80,a2
abs a2
#o2dsml subk 32,a2
jrlt #goaround ;In front of me?
#o2dok
jruc #runath
#goaround ;>Opponent in my way
move *a13(plyr_tmdist),a0
cmpi 70,a0
jrlt #goa ;Teammate too close?
callr drone_pass
jrnz #x ;Pass OK?
#goa
movi drnzzcnt,a2
move *a2,a0
subk 1,a0
jrgt #zzsame
movk 1,a0 ;New mode
callr rnd
move a0,*a2(drnzzmode-drnzzcnt)
movi TSEC-10,a0
callr rndrng0
addk 10,a0
#zzsame
move a0,*a2
move *a13(plyr_ohoopx),a0
movi CZMID,a1
callr drone_seekxy
jrz #shoot2 ;In position?
sll 3,a0 ;*8
addi #jbits_t,a0
move *a2(drnzzmode-drnzzcnt),a14
jrz #md1
addi 16*8,a0
#md1 movb *a0,a0
move a0,*a11
cmpi 80,a4
jrlt #shoot2 ;Close enough for jam?
jruc #tryshot
#runath ;>I have a clr path to hoop!
move *a13(plyr_o1dist),a14
cmpi 65,a14
jrlt #goa ;He's too close?
move *a13(plyr_o2dist),a14
cmpi 65,a14
jrlt #goa ;He's too close?
move *a13(plyr_ohoopx),a0
movi CZMID,a1
callr drone_seekxy
move *a13(plyr_d_skill),a14
cmpi -11-3,a14
jrle #tryshot
ori BUT3_M,a0 ;Turbo
move a0,*a11
#tryshot
cmpi 50,a4
jrlt #shoot2 ;Close enough for jam?
move @PSTATUS,a0 ;Plyr start bits 0-3
move *a13(plyr_num),a1
XORK 1,a1
btst a1,a0
jrnz #x ;Teammate is a human?
cmpi 230,a4 ;>Chk if we need 3ptrs
jrlt #no3
cmpi 290,a4
jrgt #no3
movk 6,a1
move @game_time,a2,L
cmpi >1010000,a2
jrgt #hvtime ;Enough time?
movk 3,a1
#hvtime
move *a13(plyr_ptsdown),a14
cmp a1,a14
jrlt #no3
cmpi >40000,a2
jrlt #shoot2 ;Less than 40 secs?
movk 8,a0
move *a13(plyr_o1dist),a14
cmpi 70,a14
jrlt #rndsht ;He's close?
move *a13(plyr_o2dist),a14
cmpi 70,a14
jrlt #rndsht ;He's close?
jruc #shoot2
#no3
movi 50,a0
move *a13(plyr_d_skill),a14
cmpi -8,a14
jrgt #rndsht
movk 30,a0
#rndsht callr rndrng0
move a0,a0
jrnz #x
#shoot
move *a13(plyr_ohpdist),a14
cmpi 240,a14
jrge #x ;Too far?
#shoot2 move *a11,a0 ;>Shoot
ori BUT1_M|BUT3_M,a0
move a0,*a11
movk 1,a0 ;Max fakes
move a0,*a13(plyr_d_seekcnt)
jruc #x
#fake ;>Jumping but still on gnd
move *a13(plyr_d_seekcnt),a2
jrle #x ;No fakes?
move @PSTATUS,a0 ;Plyr start bits 0-3
move *a13(plyr_num),a1
XORK 1,a1
btst a1,a0
jrnz #x ;Teammate is a human?
movk >1f,a0
callr rnd
jrnz #x
move @game_time,a1,L
cmpi >200,a1
jrlt #x ;Less than 2 secs?
move @shotimer+16,a1 ;Tens
jrnz #fk
move @shotimer,a1 ;Ones
subk 2,a1
jrlt #x ;Less than 2 secs?
#fk
subk 1,a2
move a2,*a13(plyr_d_seekcnt)
jruc #kilbuts
#injmp
move @PSTATUS,a0 ;Plyr start bits 0-3
move *a13(plyr_num),a1
XORK 1,a1
btst a1,a0
jrz #tmdrn ;Teammate is a drone?
;FIX! give pass ability
move *a13(plyr_tmproc_p),a0,L
move *a0(PA11),a0,L
move *a0,a0 ;Get teammates ctrl bits
btst BUT1_B,a0
jrnz #x ;Holding shoot button?
jruc #kilbuts
#tmdrn
move *a3(plyr_seqflgs),a0
btst BLOCKREB_B,a0
jrnz #kilbuts ;Got a rebound?
movk 15,a0
callr rndrng0
move a0,a0
jrz #kilbuts ;Cause shoot?
movk 7,a0
callr rnd
jrnz #x ;88%?
move *a13(plyr_ptsdown),a14
addk 5,a14
jrlt #pss ;Winning by >5?
move *a13(plyr_seqflgs),a14
btst DUNK_B,a14
jrnz #x ;In a dunk?
move @game_time,a1,L
cmpi >200,a1
jrlt #x ;Less than 2 secs?
#pss callr drone_pass
jruc #x
#kilbuts
clr a0 ;>Let go of shoot button
move a0,*a11
#x rets
#jbits_t
.byte 0,JOYL_M,JOYR_M,0
.byte JOYD_M,JOYD_M|JOYL_M,JOYD_M|JOYR_M,0
.byte JOYU_M,JOYU_M|JOYL_M,JOYU_M|JOYR_M,0
.byte 0,0,0,0
.byte 0,JOYR_M,JOYL_M,0
.byte JOYU_M,JOYU_M|JOYR_M,JOYU_M|JOYL_M,0
.byte JOYD_M,JOYD_M|JOYR_M,JOYD_M|JOYL_M,0
.byte 0,0,0,0
#*******************************
* Drone in offense with out ball
SUBRP drone_offwoball
clr a0
move a0,*a13(plyr_d_cflgs)
move *a13(plyr_d_mode),a14
jrgt #inmd ;Already in mode?
movk 1,a0
move a0,*a13(plyr_d_mode)
callr drone_getcurskillo
addi #mdsk_t,a0
move *a0,a0
callr rndrng0
addk 1,a0
move a0,*a13(plyr_d_seekcnt)
#inmd
move *a13(plyr_dir),a3
move *a13(plyr_o1dist),a14
subi 50,a14
jrgt #o1far ;Too far?
move *a13(plyr_o1dir),a2
sub a3,a2
abs a2
cmpi >40,a2
jrle #o1dsml
subi >80,a2
abs a2
#o1dsml subk 16,a2
jrlt #pusho ;In front of me?
#o1far
move *a13(plyr_o2dist),a14
subi 50,a14
jrgt #nopush ;Too far?
move *a13(plyr_o2dir),a2
sub a3,a2
abs a2
cmpi >40,a2
jrle #o2dsml
subi >80,a2
abs a2
#o2dsml subk 16,a2
jrge #nopush ;!In front?
#pusho
movi 99,a0
callr rndrng0
move *a13(plyr_ptsdown),a14
move *a13(plyr_d_skill),a1
add a1,a14
cmpi 15,a14
jrle #mxdnok
movk 15,a14
#mxdnok addk 15,a14
jrge #dnok
clr a14
#dnok sll 4,a14
addi #p_t,a14
move *a14,a1
cmp a1,a0
jrge #newseek ;Skip push?
move *a11,a0 ;Push
ori BUT2_M<<8|BUT2_M|BUT3_M,a0
move a0,*a11
jruc #x
#nopush
movi >7f,a0
callr rnd
jrz #newseek
move *a13(plyr_d_seekcnt),a0
subk 1,a0
jrgt #seek
#newseek
move *a13(plyr_newdir),a0
jrnn #contsk ;Turning?
movk 16,a0
callr rndrng0
sll 5,a0 ;*32
addi #seek_t,a0
move *a0+,a1
move *a13(plyr_num),a14
subk 2,a14
jrge #lft
neg a1
#lft addi WRLDMID,a1
move a1,*a13(plyr_d_seekx)
move *a0+,a1
move a1,*a13(plyr_d_seeky)
movi TSEC*3,a0
callr rndrng0
addk TSEC/2,a0
#seek move a0,*a13(plyr_d_seekcnt)
#contsk
move *a13(plyr_d_seekx),a0
move *a13(plyr_d_seeky),a1
callr drone_seekxy
jrnz #notthere
movk >1f,a0 ;3%
callr rnd
jrnz #x
clr a0
move a0,*a13(plyr_d_seekcnt)
#notthere
#x
rets
#mdsk_t ;Mode switch max seek time
.word 50,50,50,50,50 ;Up 15-11
.word 40,40,40,35,30 ;10-6
.word 25,22,20,18,16 ;5-1
.word 14 ;Even score
.word 10,8,6,4,4 ;Dn 1-5
.word 4,3,3,3,2 ;6-10
.word 2,2,2,2,1 ;11-15
#p_t ;% to push
.word 1,1,1,1,1
.word 2,2,2,2,3
.word 3,3,4,4,5
.word 5
.word 5,6,8,10,13
.word 15,17,18,20,20
.word 25,30,35,40,50
.asg CZMID,Z
#seek_t
.word -320,Z-160, -250,Z-160, -120,Z-100 ;3ptrs
.word -120,Z
.word -120,Z+100, -250,Z+160, -320,Z+160
.word -320,Z-100, -250,Z-80, -200,Z-50 ;2ptrs
.word -180,Z
.word -200,Z+50, -250,Z+80, -320,Z+100
.word -310,Z-10, -305,Z, -310,Z+10
#*******************************
* Drone code - pass if clear
* A8=*Obj
* A11=*Ctrl bits
* A13=*Plyr process
* >A0=!0 if pass OK (CC)
* Trashes scratch
SUBRP drone_pass
move @PSTATUS,a0 ;Plyr start bits 0-3
move *a13(plyr_num),a1
XORK 1,a1
btst a1,a0
jrnz #x ;Teammate is a human?
move *a13(plyr_tmdist),a0
addk 10,a0
move *a13(plyr_o1dist),a1
cmp a1,a0
jrlt #o1ok
move *a13(plyr_tmdir),a14
move *a13(plyr_o1dir),a1
sub a14,a1
abs a1
cmpi 64,a1
jrle #dsml
subi 128,a1
abs a1
#dsml subk 16,a1
jrlt #x
#o1ok
move *a13(plyr_o2dist),a1
cmp a1,a0
jrlt #o2ok
move *a13(plyr_tmdir),a14
move *a13(plyr_o2dir),a1
sub a14,a1
abs a1
cmpi 64,a1
jrle #dsml2
subi 128,a1
abs a1
#dsml2 subk 16,a1
jrlt #x
#o2ok
move *a13(plyr_tmproc_p),a1,L
move *a1(plyr_seq),a0
subk RUNDRIBTURB_SEQ,a0
jrhi #x
move *a11,a0 ;>Pass
ori BUT2_M<<8|BUT2_M|BUT3_M,a0
move a0,*a11
rets
#x clr a0
rets
#*******************************
* Drone code - defence
* A8=*Obj
* A11=*Ctrl bits
* A13=*Plyr process
SUBRP drone_defence
PUSH a7
move @ballpnum,a5
sll 5,a5
addi plyrproc_t,a5
move *a5,a5,L ;A5=*Proc of opponent with ball
callr drone_getcurskillo
move a0,a7 ;A7=Ptsdn+skill for indexing (*16)
clr a0
move a0,*a13(plyr_d_cflgs)
move *a13(plyr_d_mode),a14
jrn #inmd ;Already in mode?
subk 1,a0 ;-1
move a0,*a13(plyr_d_mode)
move a7,a14
addi #mdsk_t,a14
move *a14,a0
move a0,a2
srl 2,a2 ;/4
callr rndrng0
addk 1,a0
add a2,a0
move a0,*a13(plyr_d_seekcnt)
#inmd
move *a13(plyr_d_seekcnt),a0
subk 1,a0
jrgt #seek
move *a13(plyr_num),a2
XORK 2,a2
move a2,a4
sll 5,a4 ;*32
addi plyrproc_t,a4
move *a4,a4,L
cmp a5,a4
jreq #guard ;I'm on guy with ball?
move *a5(plyr_ohpdist),a0
cmpi 300,a0
jrgt #guard ;Too far to worry about?
move *a5(plyr_seqflgs),a0
btst DUNK_B,a0
jrnz #gbc ;He's dunking?
move *a13(plyr_tmproc_p),a3,L
move *a3(plyr_seq),a0
subi STAGGER_SEQ,a0
jrls #tmok
subk FLYBACKWB2_SEQ-STAGGER_SEQ,a0
jrls #gbc ;Teammates staggered?
#tmok
move *a3(plyr_o1dist),a14
move *a3(plyr_o1dir),a1
btst 0,a2
jrnz #p1
move *a3(plyr_o2dist),a14
move *a3(plyr_o2dir),a1
#p1
move *a3(plyr_hpdir),a0 ;Find dir difference
sub a1,a0
abs a0
cmpi >40,a0
jrle #dsml
subi >80,a0
abs a0
#dsml subk 28,a0
jrle #gbc ;TM not between op and hoop?
cmpi 160,a14
jrgt #gbc ;TM not guarding?
;FIX
jruc #guard
#gbc move a5,a4 ;Guard ball carrier
#guard
move *a4(PA8),a2,L ;*Obj
move *a2(OXPOS),a0
move *a2(OXANI+16),a14
add a14,a0 ;X
move *a2(OZPOS),a1 ;Z
move @game_time,a14,L
cmpi >800,a14
jrlt #setseek ;Less than 8 secs?
move @shotimer+16,a14 ;Tens
jrnz #scok
move @shotimer,a14 ;Ones
subk 5,a14
jrlt #setseek ;Less than 5 secs?
#scok
move *a5(plyr_seqflgs),a14
btst SHOOT_B,a14
jrnz #setseek ;Starting a shot?
move *a2(OXVEL),a14,L
sra 16-4,a14 ;16 ticks from now
add a14,a0
move *a2(OZVEL),a14,L
sra 16-4,a14 ;16 ticks from now
add a14,a1
move *a13(plyr_myhoopx),a2 ;>Stay near oplyr between my basket
movi CZMID,a3
add a0,a2
sll 1,a0
add a2,a0
sra 2,a0 ;/4
add a1,a3
sll 1,a1
add a3,a1
sra 2,a1 ;/4
#setseek
move a0,*a13(plyr_d_seekx)
move a1,*a13(plyr_d_seeky)
movk 25,a0
move *a5(plyr_hpdist),a1
cmpi 310,a1
jrge #seek ;Far from my hoop?
move a7,a14
addi #skt_t,a14
move *a14,a0
move a0,a2
srl 2,a2 ;/4
callr rndrng0
add a2,a0
#seek move a0,*a13(plyr_d_seekcnt)
move *a13(plyr_d_seekx),a0
move *a13(plyr_d_seeky),a1
callr drone_seekxy
move a0,a2
move *a13(plyr_num),a14 ;>Get opponents proc
addk 2,a14
sll 32-2,a14
srl 32-2-5,a14 ;*32
addi plyrproc_t,a14
move *a14,a0,L
move *a0(plyr_ohpdist),a0
subk 10,a0
cmpi 300,a0
jrlt #long
subi 80,a0 ;Turbo earlier
#long
move *a13(plyr_hpdist),a1
cmp a0,a1
jrlt #icloser
addi BUT3_M,a2 ;Turbo
#icloser
move *a13(plyr_balldist),a1
cmpi 30,a1
jrgt #psrnd ;!In his face?
move @game_time,a14,L
cmpi >800,a14
jrlt #ps ;Less than 8 secs?
move @shotimer+16,a14 ;Tens
jrnz #psrnd
move @shotimer,a14 ;Ones
subk 5,a14
jrlt #ps ;Less than 5 secs?
#psrnd
move a7,a14
addi #dist_t,a14
move *a14,a0
cmp a0,a1
jrgt #skipsp ;Ball too far?
movi 999,a0
callr rndrng0
move a7,a14
addi #ps_t,a14
move *a14,a1
cmp a1,a0
jrge #skipsp ;Skip push?
#ps
sll 32-4,a2
srl 32-4,a2
addk BUT2_M,a2 ;Steal
movk 1,a0
callr rnd
jrnz #skipsp ;50%?
addi BUT2_M<<8|BUT3_M,a2 ;Push
#skipsp
move *a13(plyr_balldist),a14 ;>Chk if I can block ball
cmpi 65,a14
jrge #noblk
move *a5(plyr_jmpcnt),a0
jrnz #tryblk ;Plyr with ball is in air?
move *a5(plyr_seqflgs),a0
btst SHOOT_B,a0
jrz #noblk ;!Starting a shot?
movk 11,a0
callr rndrng0
move a0,a0
jrnz #noblk ;94% ignore?
jruc #blk
#tryblk
movi 99,a0
callr rndrng0
move a7,a14
addi #blk_t,a14
move *a14,a1
cmp a1,a0
jrge #noblk
#blk ORK BUT1_M,a2 ;Block
#noblk
move a2,*a11
PULL a7
rets
#mdsk_t ;Mode switch max seek time
.word 50,50,50,50,50 ;Up 15-11
.word 50,50,45,45,40 ;10-6
.word 33,25,22,18,16 ;5-1
.word 14 ;Even score
.word 10,8,6,4,4 ;Dn 1-5
.word 4,3,3,3,2 ;6-10
.word 2,2,2,2,1 ;11-15
#skt_t ;Max seek time
.word 60,60,58,55,52
.word 48,44,40,36,32
.word 28,24,22,18,16
.word 14 ;Even score
.word 10,8,6,4,4
.word 4,3,3,3,2
.word 2,2,2,2,1
#dist_t ;Max dist to try push/steal
.word 110,100,100,100,100
.word 90,90,80,80,80,80
.word 70,70,60,60,60
.word 50
.word 50,50,50,50,50
.word 50,50,50,50,50
.word 50,50,50,50,50
#ps_t ;% to push/steal
.word 2,2,2,2,2
.word 3,3,3,3,3
.word 4,4,4,5,5
.word 6
.word 6,6,8,10,13
.word 15,17,18,20,30
.word 40,60,80,150,250
#blk_t ;% to block
.word 1,1,2,3,3
.word 3,3,4,4,5
.word 6,7,8,10,12
.word 14
.word 16,18,20,25,30
.word 35,40,45,50,50
.word 50,50,50,50,50
#*******************************
* Setup defensive drones for ball takeout
* Trashes scratch
SUBR drone_setuptob
move @drone2on,b0
jrnz drone2_setuptob
PUSH a2,a3,a4,a13
movk 4,a4
movi plyrproc_t,a3
#lp move *a3+,a13,L
move *a13(plyr_ownball),a14
jrnz #nxt ;Offense?
movi -1,a14
move a14,*a13(plyr_d_mode) ;Defense
callr drone_getcurskillo
addi #mdsk_t,a0
move *a0,a0
move a0,a2
srl 2,a2 ;/4
callr rndrng0
addk 1,a0
add a0,a2
movk 1,a0
callr rnd
jrnz #sk
srl 1,a2
#sk
move a2,*a13(plyr_d_seekcnt)
#nxt
dsj a4,#lp
PULL a2,a3,a4,a13
rets
#mdsk_t ;Mode switch max seek time
.word 50,50,50,50,50 ;Up 15-11
.word 50,50,45,45,40 ;10-6
.word 33,25,22,18,16 ;5-1
.word 14 ;Even score
.word 10,8,6,4,4 ;Dn 1-5
.word 4,3,3,3,2 ;6-10
.word 2,2,2,2,1 ;11-15
#*******************************
* Drone code - nobody has ball
* A8=*Obj
* A11=*Ctrl bits
* A13=*Plyr process
SUBRP drone_chaseball
move *a13(plyr_rcvpass),a14
jrgt drone_offwoball ;I'm rcving ball?
move *a13(plyr_tmproc_p),a2,L
move *a2(plyr_rcvpass),a14
jrgt drone_offwoball ;Teammate rcving ball?
clr a0
move a0,*a13(plyr_d_cflgs)
move *a13(plyr_d_mode),a14
jrz #inmd ;Already in mode?
move a0,*a13(plyr_d_mode)
move *a13(plyr_ptsdown),a14
move *a13(plyr_d_skill),a0
add a0,a14
cmpi 15,a14
jrle #mxdnok
movk 15,a14
#mxdnok addk 15,a14
jrge #dnok
clr a14
#dnok sll 4,a14
addi #mdsk_t,a14
move *a14,a0
callr rndrng0
addk 2,a0
move a0,*a13(plyr_d_seekcnt)
#inmd
move *a13(plyr_d_seekcnt),a0
subk 1,a0
jrgt #seek
move *a2(plyr_seq),a0
subi STAGGER_SEQ,a0
jrls #tmok
subk FLYBACKWB2_SEQ-STAGGER_SEQ,a0
jrls #chaseb ;Teammates staggered?
#tmok
move *a13(plyr_balldist),a0
move *a2(plyr_balldist),a14
cmp a14,a0
jrlt #chaseb ;I'm closer?
movi WRLDMID,a0
movi CZMID,a1
jruc #setxz
#chaseb
move @ballobj_p,a5,L
move *a5(OXPOS),a0
move *a5(OXANI+16),a14
add a14,a0
move *a5(OXVEL),a14,L
sra 16-3,a14 ;8 ticks from now
add a14,a0
move *a5(OZPOS),a1
move *a5(OZVEL),a14,L
sra 16-3,a14 ;8 ticks from now
add a14,a1
#setxz
move a0,*a13(plyr_d_seekx)
move a1,*a13(plyr_d_seeky)
move *a13(plyr_ptsdown),a14
move *a13(plyr_d_skill),a0
add a0,a14
cmpi 15,a14
jrle #mxdnok2
movk 15,a14
#mxdnok2
addk 15,a14
jrge #dnok2
clr a14
#dnok2 sll 4,a14
addi #skt_t,a14
move *a14,a0
callr rndrng0
addk 5,a0
#seek move a0,*a13(plyr_d_seekcnt)
move *a13(plyr_d_seekx),a0
move *a13(plyr_d_seeky),a1
callr drone_seekxy
move *a13(plyr_balldist),a2 ;>Chk if I can jump at ball
subk 30,a2
jrge #nojmp
move *a5(OYPOS),a0
addk 25,a0
move *a8(OYPOS),a1
cmp a1,a0
jrlt #nojmp
movk 7,a0
callr rnd
jrnz #nojmp ;87%?
move *a11,a0 ;Jmp
ORK BUT1_M,a14
move a0,*a11
#nojmp
rets
#mdsk_t ;Mode switch max seek time
.word 90,90,90,90,80 ;Up 15-11
.word 80,70,60,55,50 ;10-6
.word 33,25,22,18,16 ;5-1
.word 14 ;Even score
.word 10,8,6,4,4 ;Dn 1-5
.word 4,3,3,3,2 ;6-10
.word 2,2,2,2,1 ;11-15
#skt_t ;Max seek time
.word 50,50,45,45,45
.word 40,40,30,30,20
.word 20,16,14,13,12
.word 12
.word 12,11,10,10,9
.word 8,5,4,3,2
.word 1,1,1,1,1
#*******************************
* Drone - push stick to move drone towards an XZ location
* A0=X to seek
* A1=Z
* A8=*Obj
* A11=*Ctrl bits
* >A0=Joy bits set or 0 (Pass CC)
* Trashes scratch
SUBRP drone_seekxy
move a2,b0
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 b0,a2
move a0,a0
rets
#*******************************
* Get the current skill offset
* >A0=Offset (0-30) *16
* Trashes scratch
SUBRP drone_getcurskillo
move *a13(plyr_ptsdown),a0
move *a13(plyr_d_skill),a14
add a14,a0
cmpi 15,a0
jrle #mxdnok
movk 15,a0
#mxdnok addk 15,a0
jrge #dnok
clr a0
#dnok sll 4,a0 ;A7=Ptsdn+skill for indexing (*16)
rets
#*******************************
* Adjust all drone abilities (at end of quarter)
* A0=Minute of qrtr (0-2)
* Trashes scratch
SUBR drone_adjskill
move @drone2on,b0
jrnz drone2_adjskill
PUSH a2,a3,a4
move a0,a0
jrnz #x
movi plyrproc_t,a4
movk 4,b0
#lp
move *a4+,a3,L
move *a3(plyr_d_skill),a2
move *a3(plyr_ptsdown),a14
cmpi 15,a14
jrle #mxdnok
movk 15,a14
#mxdnok addk 15,a14
jrge #dnok
clr a14
#dnok sll 4,a14
addi #adj_t,a14
move *a14,a14
add a14,a2
movk ADJDIFF,a0 ;Get difficulty level
calla GET_ADJ
subk 3,a0 ;-2 to 2
sll 1,a0 ;*2
move @gmqrtr,a14 ;>Chk quarter minimum
cmpi 2,a14
jrle #qok
movk 2,a14
#qok sll 4,a14
addi #min_t,a14
move *a14,a14
add a0,a14
cmp a14,a2
jrge #minok
move a14,a2
#minok
move *a3(plyr_num),a1
XORK 1,a1
move @PSTATUS,a14
btst a1,a14
jrnz #tminok ;Teammate is human?
move @team1,a14 ;>Chk team minimum
cmpi 3,b0
jrge #t1
move @team2,a14
#t1 sll 3+2,a14
move @gmqrtr,a1
cmpi 3,a1
jrle #qok2
movk 3,a1
#qok2 sll 3,a1
add a1,a14
addi #tdmin_t-8,a14
movb *a14,a14
add a0,a14
cmp a14,a2
jrge #tminok
move a14,a2
#tminok
move a2,*a3(plyr_d_skill)
dsj b0,#lp
#x PULL a2,a3,a4
rets
#adj_t .word -5,-5,-5,-5,-5
.word -5,-5,-5,-4,-3
.word -2,-1,0,0,0
.word 0
.word 1,1,2,2,3
.word 3,4,4,5,5
.word 5,6,6,6,7
#min_t .word -8,-6,-4
#tdmin_t
.byte -8,-6,-4,0 ;ATL
.byte -8,-6,-4,0 ;BOST
.byte -8,-6,-4,0 ;CHAR
.byte 6,9,12,14 ;CHI (1)
.byte -8,-6,-4,0 ;CLEV
.byte -8,-6,-4,0 ;DAL
.byte -8,-6,-4,0 ;DEN
.byte -8,-6,-4,0 ;DET
.byte -8,-6,-4,0 ;GOLD
.byte -8,-6,-4,0 ;HOU
.byte -8,-6,-4,0 ;IND
.byte -8,-6,-4,0 ;LAC
.byte -8,-6,-4,0 ;LAL
.byte -8,-6,-4,0 ;MIAMI
.byte -8,-6,-4,0 ;MILW
.byte -8,-6,-4,0 ;MINN
.byte -8,-6,-4,0 ;NJ
.byte 1,3,4,5 ;NY (4)
.byte -8,-6,-4,0 ;ORL
.byte -8,-6,-4,0 ;PHIL
.byte 4,6,7,8 ;PHX (2)
.byte 2,4,5,6 ;PORT (3)
.byte -8,-6,-4,0 ;SAC
.byte -8,-6,-4,0 ;SANANT
.byte -8,-6,-4,0 ;SEA
.byte 0,2,3,4 ;UTAH (5)
.byte -8,-6,-4,0 ;WASH
.even
********************************
* Get random # with mask
* A0=Mask
* >A0=Rnd # (Pass CC)
* Trashes scratch
SUBRP rnd
move @RAND,a1,L
rl a1,a1
move @HCOUNT,a14
rl a14,a1
add sp,a1
move a1,@RAND,L
and a1,a0
rets
********************************
* Quickly produce a random # in range 0-X
* A0=X
* >A0=Random # (0 to A0) (No CC)
* Trashes scratch
SUBRP rndrng0
move @RAND,a1,L
rl a1,a1
move @HCOUNT,a14
rl a14,a1
add sp,a1
move a1,@RAND,L
addk 1,a0
mpyu a1,a0 ;Condition codes not valid!
rets
.end