Jump to content
NHL'94 Forums

HOW TO: Fix The Weight Bug (Gens)


smozoma

Recommended Posts

No I meant the hacked or edited '94 roms.

It should work with any 94 rom, as long it has been through NOSE at some point. you can take, say, a GDL rom, and apply the patch to that.

Link to comment
Share on other sites

New ROM with 3 new features:

1.

Check ability is calculated as (6*wgt + 10*chk - 12) instead of (8*wgt). Ability to take a hit is still (8*wgt).

This formula scales well for players of different weights.

Heavy guys:

Bourque (wgt=10, chk=6): his checking ability is no longer (8*10)=80, it is now (6*10+10*6-12)=108. He could check himself, because his checking rating is good. He can now usually check guys up to wgt=13.

McSorley (wgt=14,chk=3): (6*14+10*3-12)=102 compared to (8*14)=112. He can't check himself because he's no good at checking (3 is bad if you're that heavy!). He can usually check guys up to wgt=12.

Light guys:

Fleury (wgt=3, chk=4): (6*3+10*4-12)=46 , (8*3)=24. He can check himself, and guys up to wgt=5 (usually). When you're light, a 3+ in checking gives you bonus, whereas if you're heavy, a 3 actually makes you less effective! neat! Even if Fleury's checking were just 3, he'd have a checking ability of 36, so he could check guys with wgt=4.

I'll make an excel table some time...

There are 3 'crossover' points, where guys hit like normal.

wgt=4,chk=2. If a guy has wgt=4 and chk=2, he checks like normal. If he has chk=3+, he gets bonus.

wgt=9,chk=3. if a guy with wgt=9 has chk=4+, he gets bonus. 2 or less, penalty.

wgt=14,chk=4. 5+ = bonus. 3 or less, penalty

2.

Checks after the whistle no longer count in the stats.

3.

If you go into the Player Stats page in the pause menu... You can see how many checks each player has dished out!

Updated patcher to come eventually...

NHL94_ChkStats080811.bin

post-253-1218523341_thumb.png

Link to comment
Share on other sites

New ROM with 3 new features:

1.

Check ability is calculated as (6*wgt + 10*chk - 12) instead of (8*wgt). Ability to take a hit is still (8*wgt).

This formula scales well for players of different weights.

Heavy guys:

Bourque (wgt=10, chk=6): his checking ability is no longer (8*10)=80, it is now (6*10+10*6-12)=108. He could check himself, because his checking rating is good. He can now usually check guys up to wgt=13.

McSorley (wgt=14,chk=3): (6*14+10*3-12)=102 compared to (8*14)=112. He can't check himself because he's no good at checking (3 is bad if you're that heavy!). He can usually check guys up to wgt=12.

Light guys:

Fleury (wgt=3, chk=4): (6*3+10*4-12)=46 , (8*3)=24. He can check himself, and guys up to wgt=5 (usually). When you're light, a 3+ in checking gives you bonus, whereas if you're heavy, a 3 actually makes you less effective! neat! Even if Fleury's checking were just 3, he'd have a checking ability of 36, so he could check guys with wgt=4.

I'll make an excel table some time...

There are 3 'crossover' points, where guys hit like normal.

wgt=4,chk=2. If a guy has wgt=4 and chk=2, he checks like normal. If he has chk=3+, he gets bonus.

wgt=9,chk=3. if a guy with wgt=9 has chk=4+, he gets bonus. 2 or less, penalty.

wgt=14,chk=4. 5+ = bonus. 3 or less, penalty

2.

Checks after the whistle no longer count in the stats.

3.

If you go into the Player Stats page in the pause menu... You can see how many checks each player has dished out!

Updated patcher to come eventually...

NHL94_ChkStats080811.bin

post-253-1218523341_thumb.png

WOW! major props dude. This such a huge step for the nhl94 community!

Link to comment
Share on other sites

  • 1 month later...

For those interested, here are my notes on how to do the weight bug fix and the wgt+chk hack.

If you want to add the weight bug fix or checking hack to your ROM, talk to me on AIM and I'll try to help out (it's not that hard, though I make it look pretty confusing here!).

a line of code in my notes might look like this:

52 28 01 1C -- ADDQ.B #1,$011C(A0) -- increment check value

52 28 01 1C is the actual code that you put in the ROM using a hex editor

ADDQ.B #1,$011C(A0) is what the hex code translates to in assembly code

increment check value is my description of what the code/instruction does

If you open an NHL94 ROM in a hex editor and go to the end, you'll see a bunch 
of "FFFFFF...".  This is empty space in the ROM.  I use this empty space to add
new code to the ROM.  When I want to change the behaviour of the original code,
I overwrite the original code with code that tells the ROM to look at my code
at the end of the ROM (using a "JSR" instruction).  My code then does what I 
want to do (like add 1 check to a player who did a check).  Then at the end of 
my code, I jump back to place after my "JSR" instruction, to keep doing whatever
the game was doing before.

When a fix adds code at the end of the ROM, let "gggggggg" or "gg:gggg" be the 
location of the unused code section of the ROM (the "FF" bytes, 
so gggggggg is where those FFs start. For example, 00fffac2 for a 
28-team ROM and 01E2af2 for a 30-team ROM).  The last number should always be 
even (0,2,4,6,8,A,C,E).

================================================================================
SIMPLE WEIGHT BUG FIX - CHECKING BASED ONLY ON WEIGHT
--------------------------------------------------------------------------------
This hack doesn't involve using the empty space at the end of the ROM.  You 
just need to change 2 values in the original ROM (switch 2a and 2b).  
Easiest hack ever!
(A2) is the info array of the player getting checked
(A3) is the info array of the player trying to check

@ 01:3D72
::Old::
90 2b 00 67		 - SUB.B #$0067(A3),D0 - sub guy checking's (wgt*8)
d0 2a 00 67		 - ADD.B #$0067(A2),D0 - add guy getting checked (wgt*8)
::New::
90 2a 00 67		 - SUB.B #$0067(A2),D0 - sub guy getting checked (wgt*8)
d0 2b 00 67		 - ADD.B #$0067(A3),D0 - add guy checking's (wgt*8)

================================================================================
IMPROVED WEIGHT BUG FIX - CHECKING BASED ON WEIGHT AND CHECKING ATTRIBUTE
--------------------------------------------------------------------------------
(A2) is the info array of the player getting checked
(A3) is the info array of the player trying to check

Make sure the bytes at 01:3D70 are E3 40

@ 01:3D72
::Old::
90 2b 00 67	 -- SUB.B #$0067(A3),D0	  -- sub guy checking's (wgt*8)
d0 2a 00 67	 -- ADD.B #$0067(A2),D0	  -- add guy getting checked (wgt*8)
::New::
4e b9 gggg gggg -- JSR $(empty code)
4e 71		   -- NOP

@ gg:gggg
::Old::
FF FF FF FF ...
::New::
3F 01		   -- MOVE.W   D1,-(A7)		-- push d1
90 2a 00 67	 -- SUB.B	#$0067(A2),D0   -- sub guy getting checked (wgt*8)
											-- (let x = current value of d0, which is $78 or $F0)
12 2B 00 67	 -- MOV.B	#$0067(A3),D1   -- d1 = ckr wgt	 -- d1 = wgt*8
E2 01		   -- ASR.B	#1,D1		   -- d1 /= 2		  -- d1 = wgt*4
D0 01		   -- ADD.B	D1, D0		  -- d0 += d1		 -- d0 = x + wgt*4
E2 01		   -- ASR.B	#1,D1		   -- d1 /= 2		  -- d1 = wgt*2
D0 01		   -- ADD.B	D1, D0		  -- d0 += d1		 -- d0 = x + wgt*6
12 2B 00 75	 -- MOV.B	#$0075(A3),D1   -- d1 = ckr chk	 -- d1 = chk*5+0.5 (the bonus averages about 0.5)
E3 01		   -- ASL.B	#1,D1		   -- d1 *= 2		  -- d1 = chk*10+1
D0 01		   -- ADD.B	D1, D0		  -- d0 += d1		 -- d0 = x + wgt*6 + chk*10+1
04 00 00 0E	 -- SUBI.B   #$0E, D0		-- d0 -= 14		 -- d0 = x + wgt*6 + chk*10+1 - 14
32 1F		   -- MOVE.W   (A7)+,D1		-- pop d1
4e 75		   -- RTS

You can change the value subtracted with the SUBI.B to make it harder or 
easier to check, overall.  Subtract less to make it easier to check, 
subtract more to make it harder.  I chose 14 because it made the average of 
the formula equal to the average wgt*8.  wgt*8 is the check resistance of 
the players.

================================================================================
CHECK STATS
--------------------------------------------------------------------------------
This replaces the PIM stat in the Player Stats screen with CHK (checks) per player.
It also adds a Checks Against stat per player (overwriting the original hidden check stat).
(A0) is $C6CE or $CA32, the start of the home or away team stats, respectively.
(A2) is the info array of the player getting checked
(A3) is the info array of the player giving the check

Replace "PIM" text with "CHK" in Player Stats screen.
@ 00:993F
::Old::
50 49 4D		-- PIM					  -- ASCII text "PIM"
::New::
43 48 4B		-- CHK					  -- ASCII text "CHK"


Replace the "increment team and player check count" with a jump to custom code:
@ 01:4130
::Old::
52 68 00 10		 -- ADDQ.W	#1,$0010(A0)
42 40			   -- CLR.W	 D0
10 2B 00 66		 -- MOVE.b	$0066(A3),D0   -- d0 = player index/offset in team	 
D0 C0			   -- ADDA.W	D0,A0		  -- a0 += player index/offset
52 28 01 1C		 -- ADDQ.B	#1,$011C(A0)   -- increment check value
(we can change the value of A0 because it isn't used later until reset to another value)

::New::
4e b9 gggg gggg	 -- JSR	   $gggggggg
4e 71 4e 71		 -- NOP, NOP
4e 71 4e 71		 -- NOP, NOP
4e 71

Here is our custom code:
@ hh:hhhh
::Old::
FF FF FF FF ...
::New::

1. Increment team check count
52 68 00 10			 -- ADDQ.W   #1,$0010(A0)	-- inc team check count for the Game Stats 
													-- screen (checks after the whistle count)

2. If the game is halted (whistle blown), branch to skip recording individual checks
08 39 00 00 00 ff c2 ea -- BTST	 #0,($00FFC2EA)  -- if the bit not 0, we will branch
66 00 00 2A			 -- BNE	  $002A		   -- branch to the RTS to skip checks after whistle

(NOTE: if you want to also not count checks after the whistle in the Game 
Stats screen, then move the "1." code below "2." and change "66 00 00 2A" 
to "66 00 00 2E")

3. Increment check (for) count for individual players
42 40				   -- CLR.W	D0
10 2B 00 66			 -- MOVE.b   $0066(A3),D0	-- d0 = player index (offset in team)
D0 C0				   -- ADDA.W   D0,A0		   -- a0 += player index
52 28 01 02			 -- ADDQ.B   #1,$0102(A0)	-- increment check value

4. Increment check (against) count for individual players
90 C0				   -- SUBA.W   D0, A0		  -- undo the ADDA.W above
90 FC 03 64			 -- SUBA.W   #$0364,A0	   -- back up A0 to Home Players stat array
B7 CA				   -- CMPA.L   a2,a3		   -- cmp a3-a2  (cmp checker-checkee)
6E 00 00 06			 -- BGT	  #$0006		  -- if a3-a2 is positive, it's a check against
													-- a home player, so skip next instruction
D0 FC 06 C8			 -- ADDA.W   #$06C8,A0	   -- go to Away Players stat array
42 40				   -- CLR.W	D0			  -- set D0 to zero
10 2A 00 66			 -- MOV.B	#$0066(A2),D0   -- set D0 = player index of checked player
D0 C0				   -- ADDA.W   D0,A0		   -- a0 += player index
52 28 01 1C			 -- ADDQ.B   #1,$011C(A0)	-- increment check against value

5. return
4e 75				   -- RTS


Don't write PIM stat -- we're using that memory for check stats!
@ 01:2302
::Old::
D5 32 00 00			 -- ADD.B	D2,$00(A2,D0)
::New::
4E 71 4E 71			 -- NOP NOP	   

================================================================================

Edited by smozoma
Link to comment
Share on other sites

  • 2 weeks later...
Smoz:

What would happen if there were two 2Bs or two 2As in the code for the weight-bug?

even checking, with different weights.

ie it'd behave as though 2 guys with equal weights were in a check, even though they actually have different weights.

90 2b 00 67 - SUB.B #$0067(A3),D0 - sub guy checking's (wgt*8)

d0 2a 00 67 - ADD.B #$0067(A2),D0 - add guy getting checked (wgt*8)

if you make them both 2b or both 2a, then you basically don't change the value of D0 at all.

Link to comment
Share on other sites

  • 2 months later...

I'm actually going to check this out right now, no pun intended. This displays CHK instead of PIM, but the PIM stats are still recorded properly right?

Great work!

-Evan

Link to comment
Share on other sites

I'm actually going to check this out right now, no pun intended. This displays CHK instead of PIM, but the PIM stats are still recorded properly right?

Great work!

-Evan

I overwrote the PIM stats.

When reading a save file for GDL or Blitz, you have to write code to inspect the Penalty Summary and count the PIMs for players manually.

Link to comment
Share on other sites

I overwrote the PIM stats.

When reading a save file for GDL or Blitz, you have to write code to inspect the Penalty Summary and count the PIMs for players manually.

Ahh I see. Ok, thanks for the info. Can't believe you've had time to work on these types of hacks.

-Evan

Link to comment
Share on other sites

  • 1 month later...
  • 3 months later...
I finally re-wrote the patcher program, so it works now.

see original post

w00000000000t.

I actually hacked one ROM myself by following your notes but this will def. make everything alot easier.

I also played your nhl94 rom which you posted before (the one with your weight fix and that tracks CHK) and ran a few demos. Boston is really brutal.

Okay I patched some roms to include the CHK for and against stat.

My question is if the CHK against stat is hidden then what purpose does it serve?

Edited by feivelclark
Link to comment
Share on other sites

  • 2 months later...
Okay I patched some roms to include the CHK for and against stat.

My question is if the CHK against stat is hidden then what purpose does it serve?

The statistic is stored in a save state made at the end of the game, so it can be retrieved and displayed in a stats-enabled league like Blitz.

see here:

http://www.blitz94.com/playerstats.asp?ord...=false&lg=0

Russ Courtnall was the most-checked player in season 2 of Blitz

Link to comment
Share on other sites

v1.2

Bug Fix:

in the Game Stats screen, if you sorted on the "checks for" stat, it still had a title of "Penalty Minutes". Now says "Checks For".

Link to comment
Share on other sites

  • 1 year later...

just applied this hack (only the 2B<->2A part) to EA Hockey. I suppose it is now "right," but I don't know the players, any way. there was a question on the first page of this thread which I answered elsewhere, but seeing the question here made me want to add the answer here, as well. in SNES NHL '94, when you have so many players penalized that you run out of folks to skate, they get sprung, one by one, but the advantage still holds until the penalty time is up. when your team has so many injuries that you don't have enough uninjured humans to skate, guys suddenly feel better and rally. "I'm not dead, after all, coach." took me many tries to prove these facts.

Link to comment
Share on other sites

  • 1 year later...

So if you make them both 2A or 2B, then weight is no longer a factor in checking?

This seems to me to the best solution.

I hate that weight is the most important factor in the game.

The wt bug fix is great but it just reverses the problem.

Some of the little guys were great checkers.

Link to comment
Share on other sites

Well after testing if you make them both 2A or both 2B. The rom will not open.

This is in 93.

So I guess that does not work.

On a side note the weights in the game are all wrong.

Gretzky, Fleury, Sweeney were all 180-190.

So if that were correct wt bug would not matter as much.

Edited by CoachMac
Link to comment
Share on other sites

Well after testing if you make them both 2A or both 2B. The rom will not open.

This is in 93.

So I guess that does not work.

On a side note the weights in the game are all wrong.

Gretzky, Fleury, Sweeney were all 180-190.

So if that were correct wt bug would not matter as much.

Hm the ROM should open, unless the checksum routine is still in there. But you're right, setting them both to the same register will eliminate weight from the checking calculation.

I'm not sure that the weights are particularly wrong. My hockey cards from that era line up pretty well with the game. Fleury is always listed as 160. Greztky, 170-175. Gilmour 170, Roenick 170... If you go by hockey-reference or hockeydb, then they will have their most recent playing weight, and players from that time tended to gain weight over their career (not sure if it's just normal, or it's that the conditioning levels improved so much over the course of the 90s)

Link to comment
Share on other sites

Wow is Hockeydb and Hockeyref off!

I checked the Cards from then to and you are exactly right.

The 2 web-sites list Roenick at 211 and 205. Sure not what he weighed in 91.

Thanks for setting me straight.

I still don't get why my roms won't open when I make them both the same.

I am doing this with NHLPA 93 by the way.

Thanks for your insight.

Edited by CoachMac
Link to comment
Share on other sites

I still don't get why my roms won't open when I make them both the same.

I am doing this with NHLPA 93 by the way.

Thanks for your insight.

Is the ROM a 'brand new' never-edited NHLPA 93?

The games have a built-in checksum routine, so that if the game has been modified (or maybe the ROM 'went bad' in the cartridge), the game just sits on a black screen.

Here is wboy's way of killing the checksum

Here is my easier way for NHL94 (might work for 93)

Link to comment
Share on other sites

Nope.

It is not a brand new rom.

It is a rom that I had already done the WBF to.

I just went back in and tried to make them both the same.

I tied both 2A and both 2B.

I also ran it back thru NOSE.

I will keep experimenting and report back.

Link to comment
Share on other sites

Hm, it really doesn't make sense that the ROM wouldn't even load, because that code isn't used until a check takes place. My only guess is you accidentally deleted or added bytes to the ROM, which puts everything out of whack.

Link to comment
Share on other sites

  • 3 weeks later...

Hey, I've been doing some work on a NHL 93 rom and had some trouble adding IMPROVED WEIGHT BUG FIX - CHECKING BASED ON WEIGHT AND CHECKING ATTRIBUTE at the end of the rom. The rom would simply not read it.

That said, at offset FF40 i decided to add the checking value $0075 in place of the weight value for the checkee so it was D02B 0075.

Unfortunately this made it all but impossible to check accordingly I decided to swap the values of the checker and checkee. That is 902A 0075 and D02B 0067. That way the checking value of the checker is Multiplied by 8 and weight value of the checkee is multiplied by 5. As such the checking value plays and important role in checking.

After that, I went into NOSE and swapped the weight value and checking value and went into Hexeditor changed the text "Weight" to "Checking" and "Checking" to "Balance"

This change worked quite well. The rom doesn't allow you to check the weight of the players but allows you to tinker with the Checking values to alter the flow of the game.

If anyone has any questions please let me know.

Edited by ricci
Link to comment
Share on other sites

  • 2 months later...

I think it's important to highlight that this thread not only shows how to fix the weight bug, but this also has the explanation of how to hack the ROM to only count checks during the game (not after whistle).

It's not talked about much, but in my opinion this is one of the greatest hacks out there! Especially for stat leagues. The checking stat is pretty meaningless without this hack applied.

Yes GDL, I'm looking at you. :P

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.

  • Who's Online   0 Members, 0 Anonymous, 58 Guests (See full list)

    • There are no registered users currently online
×
×
  • Create New...