Oh, "Pyramid of Foosteps", I didn't notice that before.
The Dopefish code has always been problematic. The code uses one of the object's temp variables to store a pointer to the object the Dopefish is trying to eat. If you save and then load a game while any Dopefish is trying to eat something, the pointer may be invalid after loading the game. Once the Dopefish has completed its bite animation, it removes the target object from the level. Since the pointer is invalid, the target of said pointer might not even exist in the level. Removing an object that doesn't exist will mess up the links in the object list, and any code that tries to follow the links until it hits a Null pointer may turn into an infinite loop.
The best way to avoid this issue would be to change the way the objects are written to and loaded from the savegame files, keeping any pointers intact. Doing that felt like overkill for this simple project. After all, the same bug has been present in Keen 4 for almost 30 years now. I have already modified the save/load code in FITF to take care of this (most of the creatures in FITF store pointers to other objects in their variables), adapting it for the Keen 4 codebase would be easy.