Didn't look in depth yet, but I at a glance, the largest technical error is using $game_map to store sprites. Rendered objects cannot be Marshaled, and $game_map is saved, therefore you get potential errors. I saw you had to alias the save method to prevent crashes, when all you need to do is not use Game_Map. Sure, it may work for the default save system as a quick and cheap hack, but compatibility goes out the window for any custom save system that does not use the named method. If the data doesn't need saved, it would be wiser, and easier to use Spriteset_Map. Take a look at how the default system works. The pertinent values are stored in Game_Map, and are simply read by Spriteset_Map. This allows you it to be saved without actually saving the Sprite. The same goes with Sprite_Character, etc.