• Sign in to follow this  
    Followers 0

    CPU Find Open Receiver


    jstout

    View attachment: Original_CPU_Passing.nes

    View attachment: 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


    Sign in to follow this  
    Followers 0


    User Feedback




    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 comment


    Link to comment
    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 comment


    Link to comment
    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 comment


    Link to comment
    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 comment


    Link to comment
    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 comment


    Link to comment
    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 comment


    Link to comment
    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 comment


    Link to comment
    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 comment


    Link to comment
    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 comment


    Link to comment
    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 comment


    Link to comment
    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 comment


    Link to comment
    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 comment


    Link to comment
    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 comment


    Link to comment
    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 comment


    Link to comment
    Share on other sites

    attached is an ips patch made from 1991 TSB and JStout's 1st rom in the 1st post of this thread.   It passes my tests.

     

    attachicon.gifJSTOUT COM PASSING HACK.ips

    Sweet, thanks, that one works for me.  The first time, I did use the original game to make the patch, but I also used the juiced version of jstout's file, so maybe that's what went wrong. 

    Share this comment


    Link to comment
    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

  • Member Statistics

    10,532
    Total Members
    776
    Most Online
    millertime2325
    Newest Member
    millertime2325
    Joined
  • Forum Statistics

    67,148
    Total Topics
    456,620
    Total Posts