jstout

CPU Find Open Receiver

54 posts in this topic

My notes for updating the 90 Command to allow the CPU to throw to open receivers rather than randomly.  In short, the COM looks at each receiver one by one throwing to the first open receiver it finds.  Open is defined as no defender within a specified distance from the receiver.  The first nibble is the amount of distance to look and the second nibble is the receiver.

 

As of the moment, the COA and COM games seem improved in receiver choice.  The MAN vs COM has been hard to tell as all or most receivers tend to be covered.  I would love to hear input for both COA/COM vs COA/COM and MAN vs COM and any plays where I need to edit the default values (I might have the default size too large right now for playing against MAN).

 

Original_CPU_Passing.nes

Original_CPU_Passing_Juiced.nes

 

 

.define X_DISTANCE $DD.define Y_DISTANCE $DE .define RECEIVER_LO $40.define RECEIVER_HI $41 .define DEFENDER_LO $42.define DEFENDER_HI $43 .define X_LO_APART $44.define X_HI_APART $45 START:LDY #$00      ; SET TO FIRST COMMAND BYTETYAPHA@NEXT_RECEIVER:PLATAY; CHECK FOR NO MORE RECEIVERSCPY $DCBCC @CONTINUEBEQ @CONTINUE; NO OPEN RECEIVERS SO RANDOM THROWLDA $3BAND $DCTAYRTS@CONTINUE:INY  ; SET TO NEXT RECEIVER ; FIND X DISTANCELDA ($3E),YAND #$F0LSRSTA X_DISTANCE ; DISTANCE * 8 PIXELSBNE @Y_GETJMP @EXIT @Y_GET:; FIND Y DISTANCELDA ($3E),YAND #$F0LSRLSRLSRLSRSTA Y_DISTANCEASLASLCLCADC Y_DISTANCESTA Y_DISTANCE ; DISTANCE * 5 PIXELS ; GET RECEIVER LOCATIONLDA ($3E),YAND #$0FASLTAXTYAPHA;LDY #$08LDA ($AE),YBMI @2PLDA $DEEB,XSTA RECEIVER_LOLDA $DEEC,XSTA RECEIVER_HIJMP @DEFENDER@2P:LDA $DF01,XSTA RECEIVER_LOLDA $DF02,XSTA RECEIVER_HI @DEFENDER:; GET DEFENDER LOCATIONLDX #$14@NEXT_DEFENDER:LDY #$08LDA ($AE),YBMI @1PLDA $DF01,XSTA DEFENDER_LOLDA $DF02,XSTA DEFENDER_HIJMP @CALC@1P:LDA $DEEB,XSTA DEFENDER_LOLDA $DEEC,XSTA DEFENDER_HI @CALC:; FIND X SIDELDY #$15LDA (RECEIVER_LO),YCMP (DEFENDER_LO),YBCC @RIGHT         ; RECEIVER < DEFENDERBNE @LEFT          ; RECEIVER > DEFENDERDEYLDA (RECEIVER_LO),YCMP (DEFENDER_LO),YBCC @RIGHT         ; RECEIVER < DEFENDER                   ; RECEIVER > DEFENDER ; X DISTANCE CHECK@LEFT:LDY #$14LDA (RECEIVER_LO),YSECSBC (DEFENDER_LO),YSTA X_LO_APARTINYLDA (RECEIVER_LO),YSBC (DEFENDER_LO),YSTA X_HI_APARTJMP @XAPART @RIGHT:LDY #$14LDA (DEFENDER_LO),YSECSBC (RECEIVER_LO),YSTA X_LO_APARTINYLDA (DEFENDER_LO),YSBC (RECEIVER_LO),YSTA X_HI_APART @XAPART:LDA X_HI_APARTBNE @GOOD          ; VERY LARGE DISTANCELDA X_LO_APARTCMP X_DISTANCEBCS @GOOD          ; OUT OF X DISTANCE                   ; IN X DISTANCE = CHECK Y DISTANCE ; Y DISTANCE CHECK@TOP_BOTTOM:LDY #$17LDA (RECEIVER_LO),YCMP (DEFENDER_LO),YBCC @BOTTOM        ; RECEIVER < DEFENDER                   ; RECEIVER > DEFENDER @TOP:LDA (RECEIVER_LO),YSECSBC (DEFENDER_LO),YCMP Y_DISTANCEJMP @YAPART @BOTTOM:LDA (DEFENDER_LO),YSECSBC (RECEIVER_LO),YCMP Y_DISTANCE @YAPART:BCC @NEXT          ; IN Y DISTANCE = BAD THROW@GOOD:DEXDEXBMI @THROW         ; OPENJMP @NEXT_DEFENDER@NEXT:JMP @NEXT_RECEIVER @THROW:PLATAY@EXIT:RTS

 

Set Default Values:

PRO T WAGGLE L  = 93 54 22
R AND S FLARE C = 94 83 75 52 21
PRO T WAGGLE R  = 63 54 21
ROLL OUT R      = 94 63 45 31
ROLL OUT L      = 93 74 45 22
T PLAY ACTION D = 93 73 42 21
PRO T SCREEN L  = 93 54 45 21
PLAY ACTION     = 93 54 42

PWR FAKE Z POST = 94 53 31
WTE F-FLICKER   = 93 84
SHOTGUN X CURL  = 63 64 45 42 21
R AND S Z FLY   = 94 92 53 55
PRO T FLARE D   = 94 73 45 22 21
OFFSET FLARE E  = 94 63 41 32
ONEBACK Z CROSS = 93 92 44 31
ONEBACK FLARE A = 94 53 42

T FLEA FLICKER  = 93 54 22
PWR FAKE X FLY  = 93 94 55 31
SHOTGUN X DRIVE = 93 54 AND 93 95 54 61 22
R AND S 3-WING  = 93 94 72 55
PLAYACTION Z IN = 93 51 54 42
FLEA FLICKER    = 94 53 32
PRO T FLARE C   = 93 75 64 42
SHOTGUN 3-WING  = 93 74 52 45 31

SHOTGUN XY BOMB = 93 94 81 75 62
R AND S Y UP    = 93 95 84 42 21
X OUT AND FLY   = 94 83 55 32 31
REV-FAKE Z POST = 94 51
SLOT L Z DRIVE  = 83 54 AND 83 71 54 45 22
NO BACK X DEEP  = 94 72 53 21
SHOTGUN Z S-IN  = 73 44 AND 95 73 62 44 21
REDGUN Z SLANT  = 94 95 52 43 31

;---------------

x90 COMMAND:

FIRST NIBBLE (BOX DISTANCE) SECOND NIBBLE (RECEIVER): (8 Pixels = 1 Yard)
0 =   0 PIXELS LEFT AND RIGHT +  0 PIXELS UP AND DOWN (Forces Throw)
1 =   8 PIXELS LEFT AND RIGHT + 5 PIXELS UP AND DOWN
2 =  16 PIXELS LEFT AND RIGHT + 10 PIXELS UP AND DOWN
3 =  24 PIXELS LEFT AND RIGHT + 15 PIXELS UP AND DOWN
4 =  32 PIXELS LEFT AND RIGHT + 20 PIXELS UP AND DOWN
5 =  40 PIXELS LEFT AND RIGHT + 25 PIXELS UP AND DOWN
6 =  48 PIXELS LEFT AND RIGHT + 30 PIXELS UP AND DOWN
7 =  56 PIXELS LEFT AND RIGHT + 35 PIXELS UP AND DOWN
8 =  64 PIXELS LEFT AND RIGHT + 40 PIXELS UP AND DOWN
9 =  72 PIXELS LEFT AND RIGHT + 45 PIXELS UP AND DOWN
A =  80 PIXELS LEFT AND RIGHT + 50 PIXELS UP AND DOWN
B =  88 PIXELS LEFT AND RIGHT + 55 PIXELS UP AND DOWN
C =  96 PIXELS LEFT AND RIGHT + 60 PIXELS UP AND DOWN
D = 104 PIXELS LEFT AND RIGHT + 65 PIXELS UP AND DOWN
E = 112 PIXELS LEFT AND RIGHT + 70 PIXELS UP AND DOWN
F = 120 PIXELS LEFT AND RIGHT + 75 PIXELS UP AND DOWN



This post has been promoted to an article Edited by jstout

Share this post


Link to post
Share on other sites

gosh.  


I will test out some MAN v COM.


so, can this hack be applied to any TSB ROM (including 32-team)?


Share this post


Link to post
Share on other sites

gosh.  

I will test out some MAN v COM.

so, can this hack be applied to any TSB ROM (including 32-team)?

 

This can be applied to any rom including the 32-team roms.  If there is playbook changes then the made code will work but all the x90 commands for the offense need to be altered to adhere to the new format.  The code above is x1DA20-x1DAF9 and the code to jump to it is x288BE-x288D6 (only other changes are the 90 commands values for the plays)

Share this post


Link to post
Share on other sites

I was just playing on save staves against RAMS, it seems to be working great - I knew what play they were running and would go cover different receivers - the QB would throw to the open guy.


 


regarding the new "90 commands" - what does a higher value "first nibble" mean?  does it mean that they can be "less open" and still be thrown to?


Share this post


Link to post
Share on other sites

I was just playing on save staves against RAMS, it seems to be working great - I knew what play they were running and would go cover different receivers - the QB would throw to the open guy.

 

regarding the new "90 commands" - what does a higher value "first nibble" mean?  does it mean that they can be "less open" and still be thrown to?

 

The higher the first nibble the more open they need to be.  Example 13 and A3, 13 would need the WR1 to be open with about 1 yard surrounding him on all sides to be open while A3 would need about 10 yards to his left and right and 6 yards to his top and bottom to be open

 

The original play code looked like:

91 73 F4 42 B8

91 = 2 Receivers

73 = 46% chance of throwing to 3 (WR1)

F4 = 100% chance of throwing to 4 (WR2) (if not thrown to 3)

42 B8 = pointer to change control to receiver

while the new code replaces the receivers chance of being thrown to with the value of how much space needs to open around him.

Edited by jstout

Share this post


Link to post
Share on other sites

The Priority Code for the QB was one of my favorite pieces of information acquired (by Jstout) early on in the development of Tecmo Super Coach. It allowed me to personalize pressured releases, scramble rate, and 'intelligence' of the QB. This now bumps up the QB 'smarts' x 10. Well done, Jstout. Awesome stuff.


Share this post


Link to post
Share on other sites

This is awesome. A huge step up from even weighted random. 


 


I should revisit my formulas that tried to determined if a WR was open or not to create some rule of thumbs depending on the the final destination of the pattern. 


 


This is obvious but the closer to the line of scrimmage the WR stops his pattern at the smaller "box distance" you want to set. The "box distance" doesn't increase linearly


since WR's that run longer patterns the defender will have more time to accelerate to and run at top speed. 


 


For a rom that is primarily designed for  COA vs COA or COM vs COM the box distances can be set smaller.


 


For MAN it has to be larger so that a man can't easily "bait" the QB's into throws. 

Share this post


Link to post
Share on other sites

Wow, I've been saying that if someone could finally do this, then the computer would finally start giving good players legit competition.  This hack + juice is going to revolutionize MAN vs. COM play, and COA vs. COA.  The computer already knows how to run in most cases.  Now it can pass smartly . . . awesome. 


 


I tested this in MANvs.COM, MANvs.COA, and COAvs.COA, and it was perfect.  That's not to say the QB's performed perfectly, but they shouldn't.  Very often, the best NFL QB's don't see open WR's.  Under pressure especially, the QB's will still throw into coverage but that's also realistic. 


 


The ONLY thing I might add to this hack is if the QB's first two receivers are covered and he has a 31 or better MS, then scramble.  Definitely not necessary though.


 


Great job! I hope this can be applied to Drummer's rom.


Share this post


Link to post
Share on other sites

This is obvious but the closer to the line of scrimmage the WR stops his pattern at the smaller "box distance" you want to set. The "box distance" doesn't increase linearly

since WR's that run longer patterns the defender will have more time to accelerate to and run at top speed. 

 

This is a good point

Share this post


Link to post
Share on other sites

This is awesome!! So have you figured out how the COM "looks" for players? Would love to add this to our TSB3 logic we applied. With what we added in player AI and this... my head is spinning!

Share this post


Link to post
Share on other sites

This is the same code as above but changing the rectangular check to a circle (requires more space for better accuracy).


 


 



.define DISTANCE $DD
.define TEMP_HI      $DE
 
.define RECEIVER_LO $40
.define RECEIVER_HI $41
 
.define DEFENDER_LO $42
.define DEFENDER_HI $43
 
.define X_LO_APART $44
.define X_HI_APART $45
 
.define X_APART $44
.define Y_APART $45
 
.define APART_LO $44
.define APART_HI $45
 
START:
                LDY #$00                              ; SET TO FIRST COMMAND BYTE
                TYA
                PHA
@NEXT_RECEIVER:
                PLA
                TAY
; CHECK FOR NO MORE RECEIVERS
                CPY $DC
                BCC @CONTINUE
                BEQ @CONTINUE
; NO OPEN RECEIVERS SO RANDOM THROW
                LDA $3B
                AND $DC
                TAY
                RTS
@CONTINUE:
                INY                         ; SET TO NEXT RECEIVER
 
; FIND DISTANCE
                LDA ($3E),Y
                AND #$F0
                LSR
                LSR
                LSR
                LSR
                STA DISTANCE
                BNE @LOCATIONS
                JMP @EXIT
 
@LOCATIONS:
; GET RECEIVER LOCATION
                LDA ($3E),Y
                AND #$0F                            ; RECEIVER
                ASL
                TAX                                        ; PLAYER INDEX
                TYA
                PHA                                       ; STORE Y
; WHICH PLAYER?
                LDY #$08
                LDA ($AE),Y
                BMI @2P
                LDA $DEEB,X
                STA RECEIVER_LO
                LDA $DEEC,X
                STA RECEIVER_HI
                JMP @DEFENDER
@2P:
                LDA $DF01,X
                STA RECEIVER_LO
                LDA $DF02,X
                STA RECEIVER_HI
 
@DEFENDER:
; GET DEFENDER LOCATION
                LDX #$14                              ; SET TO LAST DEFENDER INDEX
@NEXT_DEFENDER:
; WHICH PLAYER?
                LDY #$08
                LDA ($AE),Y
                BMI @1P
                LDA $DF01,X
                STA DEFENDER_LO
                LDA $DF02,X
                STA DEFENDER_HI
                JMP @CALC
@1P:
                LDA $DEEB,X
                STA DEFENDER_LO
                LDA $DEEC,X
                STA DEFENDER_HI
 
@CALC:
 
; FIND X SIDE
                LDY #$15
                LDA (RECEIVER_LO),Y
                CMP (DEFENDER_LO),Y
                BCC @RIGHT                      ; RECEIVER < DEFENDER
                BNE @LEFT                         ; RECEIVER > DEFENDER
                DEY
                LDA (RECEIVER_LO),Y
                CMP (DEFENDER_LO),Y
                BCC @RIGHT                      ; RECEIVER < DEFENDER
                                                                ; RECEIVER > DEFENDER
; X DISTANCE CHECK
@LEFT:
                LDY #$14
                LDA (RECEIVER_LO),Y
                SEC
                SBC (DEFENDER_LO),Y
                STA X_LO_APART
                INY
                LDA (RECEIVER_LO),Y
                SBC (DEFENDER_LO),Y
                STA X_HI_APART
                JMP @XAPART
@RIGHT:
                LDY #$14
                LDA (DEFENDER_LO),Y
                SEC
                SBC (RECEIVER_LO),Y
                STA X_LO_APART
                INY
                LDA (DEFENDER_LO),Y
                SBC (RECEIVER_LO),Y
                STA X_HI_APART
@XAPART:
                LDA X_HI_APART
                BEQ @X_LO
                JMP @GOOD                     ; VERY LARGE DISTANCE
@X_LO:
                LDA X_LO_APART
                LSR
                LSR
                LSR
                CMP DISTANCE
                BCS @GOOD                      ; OUT OF X DISTANCE
                STA X_APART                    ; IN X DISTANCE = CHECK Y DISTANCE
 
; FIND Y SIDE
                LDY #$17
                LDA (RECEIVER_LO),Y
                CMP (DEFENDER_LO),Y
                BCC @BOTTOM                                ; RECEIVER < DEFENDER
                                                                ; RECEIVER > DEFENDER
; Y DISTANCE CHECK
@TOP:
                LDA (RECEIVER_LO),Y
                SEC
                SBC (DEFENDER_LO),Y
                JMP @YAPART
@BOTTOM:
                LDA (DEFENDER_LO),Y
                SEC
                SBC (RECEIVER_LO),Y
@YAPART:
                LSR
                LSR
                LSR
                CMP DISTANCE
                BCS @GOOD                      ; OUT OF Y DISTANCE
                STA Y_APART                     ; IN Y DISTANCE = CHECK RADIUS
 
; CHECK RADIUS DISTANCE
; A^2
                LDY X_APART
                BEQ @NO_X
                LDA #$00
@LOOP_X:
                CLC
                ADC X_APART
                DEY
                BNE @LOOP_X
                STA X_APART
; B^2
@NO_X:
                LDY Y_APART
                BEQ @NO_Y
                LDA #$00
@LOOP_Y:
                CLC
                ADC Y_APART
                DEY
                BNE @LOOP_Y
                STA Y_APART
@NO_Y:
; A^2 + B^2
                LDA X_APART
                CLC
                ADC Y_APART
                STA APART_LO
                LDA #$00
                ADC #$00
                STA APART_HI
; SQRT(A^2 + B^2)
                TXA
                PHA
                LDY #$00
                LDX #$07
@loop:
                TYA
                ORA @stab-1,X
                STA TEMP_HI
                LDA APART_HI
                CMP TEMP_HI
                BCC @skip1
                SBC TEMP_HI
                STA APART_HI
                TYA
                ORA @stab,x
                TAY
@skip1:
                ASL APART_LO
                ROL APART_HI
                DEX
                BNE @loop
; last iteration
                STY TEMP_HI
                LDA APART_LO
                CMP #$80
                LDA APART_HI
                SBC TEMP_HI
                BCC @skip2
                INY
@skip2:
                PLA
                TAX
        CPY DISTANCE
                BCC @NEXT                        ; IN RADIUS DISTANCE = BAD THROW
 
; MORE DEFENDERS?
@GOOD:
                DEX
                DEX
                BMI @THROW                   ; OPEN
                JMP @NEXT_DEFENDER
@NEXT:
                JMP @NEXT_RECEIVER
@THROW:
                PLA
                TAY
@EXIT:
                RTS
@stab:  .BYTE $01,$02,$04,$08,$10,$20,$40,$80

Edited by jstout

Share this post


Link to post
Share on other sites

Dude this is AWESOME! I just watched a COM vs COM game and sure enough he is through to them open guys alot more now. Can't wait to test more AWESOME JOB MAN!!!!!


Share this post


Link to post
Share on other sites

I'm thinking that this might be entirely too much to consider, but has anyone thought of a means to have the QB throw the ball away?


Share this post


Link to post
Share on other sites

How and where does one implement this code into a ROM that already exists? Is that possible? Is there a SET command?


Share this post


Link to post
Share on other sites

I echo jesseguild and buckbbuck's questions: how do we get this into a rom?  Is there an ips patch?  That programming language above is foreign to me.


Share this post


Link to post
Share on other sites

I echo jesseguild and buckbbuck's questions: how do we get this into a rom?  Is there an ips patch?  That programming language above is foreign to me.

 

make a patch!  download original NES TSB rom, download jstouts first rom of the first post.  make a patch.  apply patch to whatever.

Share this post


Link to post
Share on other sites

make a patch!  download original NES TSB rom, download jstouts first rom of the first post.  make a patch.  apply patch to whatever.

Thanks, I guess I should ask for SET commands instead though.  I made a patch and applied it to the TB.org 2013 version of the game and it ended up changing player names, positions, etc. too. 

Share this post


Link to post
Share on other sites

Thanks, I guess I should ask for SET commands instead though.  I made a patch and applied it to the TB.org 2013 version of the game and it ended up changing player names, positions, etc. too. 

 

you must have done something wrong, then.  this looks like a regular 28-team original NES TSB rom with this hack applied.  

 

you need to use the original 1991 NES TSB unmodified rom to make your patch

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.