This code is based on slawter666's pokeem implementation, which loads a custom sprite for each pokemon that can learn surf. I've ported it to Fire Red and changed it up, in my opinion, for the better.
For starters, the overall surfable pokemon structure has been combined into a single case, so you don't have to worry about matching indices between tables. It also saves space by using pointers to graphics templates that, if are nonexistent, can just be set to zero rather than making a null template.
The palettes are also loaded directly, rather than being searched for by tag, so a single palette tag can be used for all of the sprites. This isn't that big of a deal with the knowledge of increased palette tags, but it saves the user the work of adding palettes to their npc palette table.
The repository is here. The readme should do a good job of explaining necessary information, but please ask if anything is unclear or not working correctly.
**One of the main reasons I ported this was to encourage more artwork to be developed for this resource, as only a handful of sprites have been made thus far. My intent was that with more users gaining access to it, more people would be willing to contribute. I will be contributing here and there, but my spriting skill is somewhat limited, so please help out :)
I should also note that the pokeem source allows horizontally-aligned images, but I am unaware of such a nicety in FR, so the sprites must be vertically aligned. It's not too bad to swap frames around, though.
Here is a nice GIF of it working in FR:
Finally, here is the spriting progress: Gen I (35.7%)
It looks like the images won't compile, so you'll need to include a grit reference in C:/devkitPro/devkitARM/bin/ folder. I'm not sure if those are okay to share or not, but if you are on discord I can give them to you over DM
What happens is that I do not know what the problem is since I have not modified the surf sprite.
Most Pokemon don't have their artwork completed in this resource. If their artwork isn't there, it can't be compiled (logically) and it won't be showing up in the game. You'll need to check whether the routine compiled correctly by surfing on a Lapras or a Tentacool for example (or any other Pokemon which artwork is completed, check the main thread for which are completed). If, in that case, the default surfing blob appears, something went wrong in implementing the routine. You'll probably need to check a tutorial on how to compile such a routine then.