bcrt2000 Posted May 9 Report Posted May 9 (edited) Hey folks. I just released a tool which allows the extracting of .ANIM sprite files (which are included in the source code for NHL92 and also embedded into the ROM-- for convenience they are in the repo). The Readme.md also includes a detailed description of the file format. You can use the default Palette that is embedded in the .ANIM file, or pass in a custom team's palette (also included in the repo for convenience). https://github.com/abdulahmad/EA-NHL-Tools/tree/main/ANIM-To-BMP Special thanks to @chaos & @McMarkis on collaborating to figure out the file format. We've been looking at these in an effort to understand the NHL94 animation format better so that chaos can add the fighting sprites to his fighting mod for NHL 94. Now I'm going to see if I can get this going for NHL93 & 94 sprites. Edited May 12 by bcrt2000 1 Quote
AdamCatalyst Posted May 9 Report Posted May 9 Holy frack!!!! This is amazing! I would love to know more about the underlying logic, if you were willing to share. Quote
bcrt2000 Posted May 9 Author Report Posted May 9 1 hour ago, AdamCatalyst said: Holy frack!!!! This is amazing! I would love to know more about the underlying logic, if you were willing to share. I will see if I get time. I’m so jazzed about figuring out 93/94 that it’s hard to stop. Did you read the readme.md in the repo? It has the full detailed description of the data structure. also, hot tip— you can copy and paste the code from animToBmp.js into something like Grok and ask it to explain the code to you… I extensively used grok to read the NHL92 source code and figure out the finer details of the file format Quote
AdamCatalyst Posted May 9 Report Posted May 9 No no, haven't downloaded. If there is an MD, that will probably be enough. Thanks! Been using Claude myself, want to try the latest Grok and Gemini. Thanks again for this. 1 Quote
chaos Posted May 10 Report Posted May 10 On 5/9/2025 at 9:41 AM, AdamCatalyst said: Holy frack!!!! This is amazing! I would love to know more about the underlying logic, if you were willing to share. I plan to write a post this week describing exactly what's going on. The gist: Each "action" is an animation. These animations are based on an action the player is doing (i.e. shooting, skating, skating with puck, checking, etc). There is a list of each frame in the animation and a timer based on how long to display that frame. This is also based on direction the player is facing (i.e. different animation frames if they are skating up compared to skating to the right). Each frame has data associated with it. This data includes the "hot spot" X and Y (center of the hit box), and the number of sprites in the frame. Each sprite will have their own data, which provides the tile size (1x1, 2x4, etc), the offset of the sprite from the player's XY position on the ice (used for aligning the sprites together), the offset to the tile used for the sprite, and information regarding the palette and H/V flip priority. This is the same as what you found for your crowd animation sprites. The layout of all this data in 92 is a bit different than 94. But both 93 and 94 use the same format. We've figured out both sets. 1 Quote
bcrt2000 Posted May 12 Author Report Posted May 12 (edited) 93/94 Extractor has been released: https://github.com/abdulahmad/EA-NHL-Tools/tree/main/ANIM94-To-BMP Thank you to @chaos & @McMarkis for helping make this happen. NHLPA93 Sprites example: NHL 94 sprites example: I haven't added the 93/94 palettes to the repo. When I get some time I'll do that. It still has the 92 palettes for convenience though. One thing I should note is that unlike '92, the default .anim palette doesn't seem to work with all of the sprites-- as you can see for example, blood is not coloured correctly with the '93 sprites. And if you don't pass in a custom palette for 93/94, the player sprites have kind of wild colors (although it's possible it was the palette that was used for player sprite creation). Edited May 12 by bcrt2000 1 1 Quote
bcrt2000 Posted May 15 Author Report Posted May 15 (edited) A few notes I wanted to add, mainly because I’ve been having so much fun getting back into hacking/reverse engineering the games, and have been thinking about this stuff a lot. 1. I think I will update the exporter at some point to use the correct palette for blood and other non-player sprites. Again, I think the palette that they used in the .anim file is invalid, so it’s kind of a hack 2. I eventually will revise the export tool to generate a reversible export, and also create an import tool, and also create an NHL92 -> 93/94 anim converter and 93/94 -> 92 anim converter 3. But first I am looking into creating a buildable disassembly of 93/94. I think that’s where I want things to be— I don’t want to have to deal with manually adjusting addresses in roms when adding new sprites/tiles. You should just be able to drop in new sprites and build. And the baby steps of this are me just getting better at the process of working with disassembly tools and doing something a little easier— making the NHL92 source code bitwise perfect with the retail version. I’ve made good progress so far. I’m hoping can get it done by this weekend. 4. I also want to get 92 to the point where it’s fully ripped apart— I want to disassemble hockey.snd & ealogo.bin, figure out the fm/sfx formats. And then also maybe build .map/jim export/import tools along side the .anim export/import. Then theoretically you could go from full source code + raw image/sound assets to a built rom. 5a. I’ve started to get ideas on how to improve jerseys on Genesis and get them to look as good as the PC version (or better). I have a couple of ideas. The more basic one is just adding the crest as an additional sprite to each player “frame”. We would just need some logic which could select the right tile based on the team when the code is grabbing tile data. 5b. The more advanced ideas for improved jerseys involve rendering the 256 color pc sprites either into 16 color set templates or 16 color team jersey sets. The latter idea would be huge size wise and likely would require bank switching. Maybe we could save space in either case by excluding tiles that are identical across template sets/jersey sets. Edited May 15 by bcrt2000 1 1 Quote
AdamCatalyst Posted May 15 Report Posted May 15 @bcrt2000 Re: #5. Another thing you may want to consider, is that the game uses the same Sprites for all teams, which requires many inauthentic compromises where two elements have to share the same colour, even if in real life they are coloured differently. If the game was able to choose from multiple different sprite sets, it could look much more authentic. This wouldn't even require any new drawing, just different sprite sets where the colours have been applied differently to the uniforms. If you did this in '94, I could help a bit, as I have a few different uniform options already done. Re: #2. I will wait with the anticipation at the idea of being able to export, revise, and re-import into '94. I'm so glad you are doing this! 1 Quote
bcrt2000 Posted May 15 Author Report Posted May 15 (edited) 37 minutes ago, AdamCatalyst said: @bcrt2000 Re: #5. Another thing you may want to consider, is that the game uses the same Sprites for all teams, which requires many inauthentic compromises where two elements have to share the same colour, even if in real life they are coloured differently. If the game was able to choose from multiple different sprite sets, it could look much more authentic. This wouldn't even require any new drawing, just different sprite sets where the colours have been applied differently to the uniforms. If you did this in '94, I could help a bit, as I have a few different uniform options already done. Re: #2. I will wait with the anticipation at the idea of being able to export, revise, and re-import into '94. I'm so glad you are doing this! Yeah on #5– totally with you there. I actually edited my post and gave more details on what I was thinking, and that’s one of my ideas. Either render out multiple jersey templates that can be more accurate, or go all the way and just literally render out a sprite set per jersey (which is insane from the space side of things but I have a couple of ideas in my head to achieve said space— either bank switching or sega cd storage/program Ram— or a combination of both). The ultimate idea in my head is taking the pc sprites and expanding the color zones to be per pixel… so that you can essentially use textures at that point to create a fully accurate jersey (or render out any sort of template you want), no compromises. Could also be expanded for proper gloves, goalie masks, pads, etc. Would be pretty intense to touch up every sprite to this level though. Edited May 15 by bcrt2000 1 Quote
chaos Posted Wednesday at 02:18 PM Report Posted Wednesday at 02:18 PM Can you explain how to download your files? There's no Code dropdown for some reason on your repositories. Quote
bcrt2000 Posted Wednesday at 03:30 PM Author Report Posted Wednesday at 03:30 PM (edited) Here is the repo: https://github.com/abdulahmad/EA-NHL-Tools I have been linking to subfolders with the specific tools which is why they don’t have the code checkout prompt. I need to do a round of cleanups to the documentation, and do a proper new release. Coming shortly. At the same time, haven’t wanted to stop my momentum. The partially developed JIM tools are there— extracting and rebuilding the JIM works perfectly, but the tool which color reduces an image and outputs something that can be imported into a Jim file is not done yet. And there is no documentation yet (other than what the CLI will tell you). That, and I need to do a release of the cleaned up NHL92 source with options to build the retail or rev a build. Once I finish fixing the Jim tool bug I’ll release all this and put up some posts. And then next on my list: - SND extractor/builder - ANIM importer - start of 93/94 buildable disassembly Edited Wednesday at 03:32 PM by bcrt2000 1 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.