Tile Molester 0.16
SnowBro Software's (Kent Hansen) next generation, platform independant ROM tile editing software. Effectively an upgrade to Tile Layer Pro, Tile Molester offers many advantages over Tile Layer Pro, including support for the 3bpp linear codec needed to edit the NHL 94 and NHL 95 player cards. Much thanks goes to Kent as without this fine piece of software, this tutorial would have not been possible!
J2SE Runtime Environment (JRE)
Follow the "Download JRE 5.0 Update 5" link and download the appropiate version installation, for example "Windows Offline Installation, Multi-language". This component is required by Tile Molester.
Gens Emulator
The very well known Genesis/MegaDrive emulator is essential when wanting to test the player card changes made to your ROM.
Binary ROM Dumps – based on NHL Hockey 94 (UE) [!].bin or NHL 95 (EUJ) [!].bin
Ensure that the ROM is in BIN not SMD format, and that you have also applied a ROM checksum hack to allow you to successful test your changes. Both of these tasks are automatically performed on any ROM opened and saved within NOSE, the NHL Old Skool Editor.
IPS Patcher – I recommended Zerosoft IPSWin 2.0 or Stealth Patch
Required to apply the .IPS patch files I have created to correct all occurances of player cards with shared tiles, allowing you to easily update the existing photographs.
Required to view and print some of the supplementary documents provided with the tutorial distribution.
BEFORE YOU START: The steps below are based on NHL 94 related offsets. Simply substitute the appropriate NHL 95 offsets if you are working with a NHL 95 based ROM. These offsets can be found in the supplementary pages/documents provided with the tutorial distribution.
Set your desktop screen resolution to at minimum of 1024x768 at 16bit colors.
Launch "Tile Molester" (TM). TM v 0.16 as used for this tutorial.
Bring up the file "Open" dialog box.
Change the "Files of Type" to "All Files (*.*)" to allow you to see the .BIN extension ROMs.
Open a NHL 94 based ROM.
As the .BIN extension ROM is a generic extension that TM does not automatically associate to Sega Genesis ROMs, it will open and display the tiles of the ROM using the default "2bpp planar" codec.
In terms of size, the player cards are 48x48 pixels. This is stored in the ROM as 36 tiles stored in a 6 columns x 6 rows formation, with each tile being 8x8 pixels in size.
To help us better see the player cards, set the canvas size accordingly.
In terms of colors, the player cards use 8 color BGR. Using only 8 colors allows the ROM to store the tiles in a "3bpp linear" byte format. This effectively provides basic compression when compared to the usual "4bpp linear", 16 color BGR format used to store most the graphic tiles. The downside of using "3bpp linear" compression is that you must know the starting offset of the player card graphic bytes to see the associated tiles correctly.
To allow us better to see the player cards, set the codec to "3bpp linear".
You will notice your active palette is now 8 colors in length. Rather than manually changing the colors to match the BGR grayscale used by the player cards, we can import this information from the loaded ROM , or as TM refers to it, "This File".
The entered offset must be in decimal. The player card palette is stored within the data structure of the first player card, at the decimal offset "812940" (for NHL 95, use the decimal offset "663022"). Set the palette "Size" to "8", "Format" to "9bpp BGR (Genesis)" and the "Byte Order" to "Motorola", and click "OK".
NOTE: It is important to know that when importing the palette from the decimal offset of the loaded ROM , any color changed in the on-screen active palette within TM will also be changed in the ROM. This is because the decimal offset entered is stored and the colors are dynamically read. This is different to when you create a new palette and manually set the colors yourself, which effectively creates a standalone palette.
TM is now best prepared to view and update player cards. Referring to the either the Player Card HTML or PDF files provided with this tutorial, use the "Go To" feature to jump to the first player card. Use the hexadecimal value from the TM Offset Hex column, which for is "000C6402" (for NHL 95, use "000A1A64").
The player card located at hexadecimal "000C6402" will appear. Interestingly, this player card only appears to be used as a template for the majority of the player card stored within the ROM , and is never actually shown in-game even though I have successfully tested it can be used!
There are 9 player cards of the 149 in total that refer to their own template details, as they use shared tiles that effectively makes them more difficult to update. Information (and a IPS patch file) to fix the problem created by player cards with shared tiles is provided later in this tutorial.
The player card data in the ROM is not stored in a manor that allows you to simply arrow down/slide the scroll bar to the next player card. This is because each player card contain 10 bytes of header data that prefix the "3bpp linear" tile data which effectively breaks up the "3bpp linear" compression, causing it to display the tiles incorrectly.
To successfully get to the next player card, use the "Go To" feature to jump to the next listed offset "000C6838" (for NHL 95, use "000A1E9A").
As you will most likely notice, the player card at hexadecimal "000C6838" is used in-game to show all "Handedness Left " players without personalised player cards.
To replace this player card with your own, create a 48x48 pixel image using your preferred graphics editor, and save in BMP or PNG format.
From the "Paste From" dialog, open your player card image file.
Your image will placed effectively be on the clipboard over the existing player card. To commit the new image, simply press [Esc] or alternatively, click on the unused window space surrounding the player card/clipboard selection (typically dark gray in color).
NOTE: TM will best attempt to match the colors of the pasted image to the colors of the active palette. While TM does a very decent job of converting the image to the active palette, you can try and get better results by preparing your image in your favorite graphics editing software. Dither the image down to a 8 color grayscale that match the shades of gray in TM's active palette.
Save the loaded ROM , and open it in the Gens emulator to test your changes.
Now that wasn't too hard now was it! :)
With TM's graphic bookmarking and palette storing support, I have included specially prepared resources (.XML files) to help you navigate through the player cards within the ROMs.
Before opening your ROM in TM, copy the appropriate .XML file in TM's "resources" sub folder. Rename the .XML to match the ROM filename you will be editing, for example: "NHL Hockey 94 [h] - Editing Player Cards.xml".
Now when you open the "NHL Hockey 94 [h] - Editing Player Cards.bin" ROM, TM will load the resource information (bookmarks and palettes) contained within the .XML file.
Under the "Navigate" menu, you will find the first player card bookmarked, followed by bookmarks for the player cards are after a player card that contained it's own palette and tile layout bytes (as the previous card has shared tiles, or previously had if you have applied the .IPS patch).
Under the "Palette" menu, you will find the palette that linked to the first player card template, and three additional palettes I have set up independent to the ROM. You can use the additional palettes when pasting in new player cards images in attempt to improve TM's color conversion to active palette. Experiment with these yourself to see what I mean.
The majority of player cards within both year's ROMs share the first player card template's palette and tile layout information. For these player cards, their 10 byte header reads 00000000 00000000 0024. As such player cards only contain the "3bpp linear" tile date to reconstruct the image in-game, the majority of the players cards are hexadecimal "036A" bytes apart.

Using the "Go To Offset" feature, enter the "Offset" as "36A", set the "Radix" to "Hex", and set the "Mode" to "Relative" to go "036A" hexadecimal bytes from the current offset. Click "OK" to be taken to the next player card.

By pressing [F5], you can repeat the "Go To Offset" function to again go "036A" hexadecimal bytes from the current offset, taking you to the next player card.
When the player cards does not appear correctly, you have ever come across a player card with shared tiles, or the previous player card contained its own palette and/or tile layout bytes which effectively breaks the hexadecimal "036A" spacing rule. When the latter occurs, simply select the next player card bookmark in order from the "Navigate" menu.
Using these methods, you should be able to quickly learn how to navigate though all the player cards rather than using the go to feature and cut and pasting in the appropriate "Absolute" offset every time.
The first 10 bytes of every player card contains 4 bytes which store the offset (plus) value of the palette data, the next 4 bytes which store the offset (plus) value for the tile layout data, and finally the last 2 bytes that store the amount of tiles used by the player card. Immediately after (and also the offset used to correctly see the player card in TM) is the "3bpp linear" tile data. Its length is determined by the amount of tiles used by the player cards.
The first player card in both year's ROMs is effectively the template used by the majority of player cards, all of which do not have any shared tiles. These player cards are easily identified as their header value always 00000000 00000000 0024. Setting the value 00000000 to either the palette offset (plus), or the tile layout offset (plus) instructs the game to use that standard palette and tile layout as seen in the first player card template. As these player cards use the template, they do not store any palette and tile layout data after the "3bpp linear" tile data.
For the minimal amount of player cards with shared tiles, you will notice they each player card carries their own repeat of the palette data, and also their individual configuration for the tile layout data, as it needs to instruct the ROM which shared tile is repeated else where. This data is similar to the format used by the rink layout data, with values from 2000 though 2023 used to map out the layout of the tiles. The first 4 bytes of the tile layout data is always 0006 0006, most probably instructing ROM the player card is 6x6 tiles.
The palette data used in both the player card template (and cards with shared tiles) appears to be the same amount of BGR colors (4 x 16 color palettes) as used dynamically in-game. As such, while the player card palette found within (highlighted in purple) can be changed, avoid changing the first two colors, 0EEE (white) and 0000 (black). When the player cards are shown in-game, any existing screen graphics that used the same palette color locations automatically change to the colors you have set. This gives a rather undesirable look to the main menu screen.

Included in this tutorial distribution are two .IPS patch files that fix all player cards with shared tiles in both the NHL 94 (9 instances) and NHL 95 (11 instances) ROMs. These patch files will only work correctly on a ROM that has not had any of the player cards with shared tiles updated, and have not had the same patch previously applied. Please also note that these patches do not apply the checksum fix required to boot an altered ROM.

This patch works by changing the header of each affected player card to not use the palette stored within, as the palette data alone (not including the tile layout data) use more bytes than if the player cards didn't have any shared tiles at all. Kind of silly when you consider games in those days where all about saving bytes!
The tile layout is still used, though it has been updated to layout the tiles in the default sequence (2000 through 2023) as used by the first player card template. I have chosen to keep the tile layout data as its keeps the same protocol of the ROM where the next player card immediately exists right after the previous player card's tile layout data (when it has shared tiles). This will also make it easier to programmatically retrieve all player cards from a ROM when I get around to implementing its support in NOSE.
At the offset Hex "000F92F4", you will find the team order player cards offset pointers that instruct the game where the player card-to-roster association data exists. The break down of the data that exists at each one of those pointer offsets can be found in the image below.
The player card offset that is stored in each slot is the player card offset starting at the 10 byte header data, not the "3bpp linear" tile data. The position "Pos#" value determines which player's name on your team rosters is associated to the player card. The "Pos#" value must equal the position of the player in your team roster starting at 0 (as opposed to start at 1 as used by the Line Configuration data found within each team). For example, your first goalie's Pos# value is 0000, and the second goalie is 0001. If the team only has two goalies, then the 1st player/skater is your 3rd rostered player, so they their Pos# value is 0002. If your teams has 26 rostered players, and you wish to assign the player card to the last player on your list, then the Pos# value is 0019, as Hex 19 equals decimal 25 (the 26th number starting from 0).
The first player card offset is typically your goalie and is shown last on game's main menu, after the player cards offset slots 2 through 6 have been shown. If a team has more than six slots, then those player cards can only be seen when viewing the team though the "Player Cards" facility found in-game on the "Start Game"/"Pause Menu". As you can see in red, each team player card is terminated with Hex 00000000. All players not listed with their own player card association use the generic "Handedness Left/Right" picture (or goalie if appropriate) when viewed in-game within "Player Cards".
NOTE: The Florida team player card data (highlighted in yellow) is actually stored before Anaheim. This has most probably been done as both Florida, and Anaheim both use the generic handedness left/right picture for the six main menu showcased player cards. I can only guess that because of this the developers decided to keep them together. The order shown in the image below matches that games correct team order as seen within order offset pointers.
As NHL 95 only supports showing the player cards faces on the main menu screen, the data storage method used to link players cards to rostered players has been simplified when compared to NHL 94.
Each team (excluding All Stars East & West) has allocation for six player card offsets starting at Hex "000C47FC". Working from left to right, these are G, LD, RD, LW, C & RW. The names that are associated to these player cards are determined by the team best line, the line used when the game is played with no line changes (NLC).
Marginally before this data at Hex "000C47F0" are the bytes that determine the player cards used by the All Stars East & West teams. Unlike the standard NHL teams which store the offset of the player cards (starting at the 10 byte header data), the All Star player cards use a indexed value from which it sources the team/position player card offset. As shown in the image below, simply use the Hex value of X plus Y to determine the correct indexed value you wish to use for the All Star player cards. For example, X which is 4 and Y which is 6C equals Hex 70. This would make the game use Quebec's Center as the player card. Like the standard NHL teams, the names associated to these player cards are determined by the team's best line.
––– THE END –––