Jump to content

CPU Find Open Receiver


jstout
 Share

Recommended Posts

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. 

Link to comment
Share on other sites

Why blitz your linebacker ever, save the specific run plays?

against the computer?  Because I think it's the most efficient defensive tactic vs. the pass.  Otherwise, you end up dropping back and covering some guy who only has a 20-25% chance of being targeted anyway . . . and wasting him.  And, even if he does throw to the man you covered, a linebacker vs. a juiced computer WR usually results in a completion anyway.

Link to comment
Share on other sites

  • 2 weeks later...

 

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

 

do you have a ROM with this "radial" distancing hack applied?  thx

Link to comment
Share on other sites

jstout, would it be feasible to port this beautiful hack to SNES TSB 1?

 

Yes, the code would look nearly the same with just RAM locations changed and ability to use 16-bit numbers.  I'll see about writing it up when I get the chance.

 

BTW, I do have a ROM with the Radial code but need to find it on my hard drive (or recompile) and then I'll post it.

Link to comment
Share on other sites

  • 8 months later...

Yes, the code would look nearly the same with just RAM locations changed and ability to use 16-bit numbers.  I'll see about writing it up when I get the chance.

 

BTW, I do have a ROM with the Radial code but need to find it on my hard drive (or recompile) and then I'll post it.

Any update on this good sir?

Link to comment
Share on other sites

  • 3 months later...

I've found two plays where the CPU throw to "non-eligible" players, in MAN vs COM.

 

attachicon.gifpro t waggle r & pwr fake z post.jpg

 

Good find.  There are also some other plays where it does not seem to be optimized (R&S Pass 2, for example), and some plays where the QB partially scrambles and then throws to someone that's covered.

 

I will make some SET patches for these fixes, eventually.

Link to comment
Share on other sites

  • 11 months later...

so, what does the QB do when all receivers are covered?  it seems like he throws to RB2 or TE


.  


which brings up the question:  how can I set this "dump off" receiver for each (or all) play?  I would rather QB dump to WR1 or WR2 if all else fails.


Edited by buck
Link to comment
Share on other sites

Lmao...cmon guys Its right in the source for the hack about 10 lines down

"NO OPEN RECEIVERS SO RANDOM THROW"

I see that, but how can the code be changed to make the QB throw to WR1 instead of random?  I can't follow that formatting.

Link to comment
Share on other sites

I guess I can spoon feed you the answer....I'm feeling generous...but you must change your name to TecmoLeechMonster.  :razz:

 

On the first rom post you would do the following

 

SET (0x1DA2C, 0xA08060EAEAEA)

 

LDY #$80                                        ; use as our indicator to throw to a designated WR

RTS                                                 ; return

NOP

NOP

NOP

 

 

SET(0x288C7, 0xC080D005A9034CCB884CC788)

 

CPY #$80                                                    ; check to throw to designated WR
BNE NORM                                                  ; NO-> do normal COM pass throw
LDA #$03                                                    ; LOAD WR 1 player ID
JMP $88CB                                                  ; jump to different point in COM pass that skips target # to actual player conversion

NORM                                                          ;
JMP $88C7                                                  ; jump to normal point in COM PASS

Link to comment
Share on other sites

but you must change your name to TecmoLeechMonster.  :razz:

Ha, sheesh, come ON, dude!  Not only (1) was it buck that first asked, but (2) I give back to this community, including what I think is the 2nd most downloaded rom outside this site's "official" rom, (3) I've donated to you personally, and (4) in last season's rom release thread, I asked downloaders to donate to you using your donate button within the same thread.  I don't know how much money that raised for you -- I'm sure not very much -- but whatever it was, was infinitely more than I personally collected from it (which, if you're counting at home, is zero dollars to date). 

 

So, in other words, I've decided not to change my name, but I do thank you for the info.  I'm anxious to try this out.

Link to comment
Share on other sites

Mostly just giving you a hard time...but I spent a lot of time learning assembly language so I eventually didn't have to keep asking. Jstout even provided links to very good tutorials. If you spent some time learning the basics of what's going on you could do some small assembly language hacks or at least better understand how the existing ones work. 


 


The fact that I can whip out an answer in like 30 minutes is built on XXXXXX hours learning assembly and commenting the rom code/locations.


 


I do appreciate the donations from you and others. In terms of dollars donated/ time spent I've likely been working for much less than a $1 per hour...


 


Anyways hopefully you enjoy it. 


Link to comment
Share on other sites

it sure as heck doesn't seem random to me, but that is beside the point.  

 

so, how do these codes this make it "random"?

 

load accumulator $3B? ; is this an address or actual value?

logical AND $DC? ; is this an address or actual value?

Transfer Accumulator to Y register;  store the number?

Return from Subroutine

 

; NO OPEN RECEIVERS SO RANDOM THROW
LDA $3B
AND $DC
TAY
RTS

Edited by buck
Link to comment
Share on other sites

Anything that only has a $ is a memory location.

#$ indicates a constant

$3B,$3C,$3D are the memory locations of random numbers. The random numbers are created by adding prime numbers to the current number. They are updated at least once a frame. Sometimes othe functions re-update them mid frame if "better" randomness is needed. You can watch them update in fceux by slowing the speed way down

$DC is memory location that is used as a temporary variable. At this point in the code its holding the total number of pass targets for the play.

ANDing the number of targets with a random number means the the value will be restricted to between 0 and the number of targets.

However i realized this won't give a truly random result due to how bit wise anding works

Link to comment
Share on other sites

However i realized this won't give a truly random result due to how bit wise anding works

 

I realized it wasn't random before I even looked at the code.  Mostly because I have never seen it "randomly" throw to either WR1 or WR2.  It mostly dumps it to RB2.

 

is there an easy fix (that will fit in existing space) to make it actually random?

Link to comment
Share on other sites

Buck..your observation isn't correct either. I made it so it would be random every play the way its currently written every time to test it. For shotgun pass 3 for example it will throw to WR 1 often.


 


For 5 WR patterns it will either throw to TARGET 1 or TARGET 5. 


For 4 WR patterns it will throw to ANY OF THE 4 possible targets


For 3 WR patterns it will throw to TARGET 1 or TARGET 3.  


 


The order of the targets is not the same for each play so sometimes target 1 is WR1 sometimes it is RB1 etc. 


 


For example in  one short test of BUF vs MIA the com threw to WR1, WR2, WR2, RB2, RB1. It depends on what plays are used. 


 


 


 


 


Yes there should be a way to make it completely random...


Link to comment
Share on other sites

Buck..your observation isn't correct either. I made it so it would be random every play the way its currently written every time to test it. For shotgun pass 3 for example it will throw to WR 1 often.

 

For 5 WR patterns it will either throw to TARGET 1 or TARGET 5. 

For 4 WR patterns it will throw to ANY OF THE 4 possible targets

For 3 WR patterns it will throw to TARGET 1 or TARGET 3.  

 

The order of the targets is not the same for each play so sometimes target 1 is WR1 sometimes it is RB1 etc. 

 

For example in  one short test of BUF vs MIA the com threw to WR1, WR2, WR2, RB2, RB1. It depends on what plays are used. 

 

 

Yes there should be a way to make it completely random...

 

cool.  

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...