Swimmer code as it currently stands. I have bolded the line I suspect is responsible for this.
IchoTolot has dug up an old related topic by Nepster (https://www.lemmingsforums.net/index.php?topic=2619.0), which leads me to think this might actually have been an intentional design decision (though this is based only on reading the topic - I cbf digging out an old NL version to examine the level).
function TLemmingGame.HandleSwimming(L: TLemming): Boolean;
var
LemDy: Integer;
function LemDive(L: TLemming): Integer;
// Returns 0 if the lem may not dive down
// Otherwise return the amount of pixels the lem dives
var
DiveDepth: Integer;
begin
if L.LemIsClimber then DiveDepth := 3
else DiveDepth := 4;
Result := 1;
while HasPixelAt(L.LemX, L.LemY + Result) and (Result <= DiveDepth) do
begin
Inc(Result);
if L.LemY + Result >= PhysicsMap.Height then Result := DiveDepth + 1; // End while loop!
end;
// do not dive, when there is no more water
if not HasTriggerAt(L.LemX, L.LemY + Result, trWater) then Result := 0;
if Result > DiveDepth then Result := 0; // too much terrain to dive
end;
begin
Result := True;
Inc(L.LemX, L.LemDx);
if HasTriggerAt(L.LemX, L.LemY, trWater) or HasPixelAt(L.LemX, L.LemY) then
begin
LemDy := FindGroundPixel(L.LemX, L.LemY);
// Rise if there is water above the lemming
if (LemDy >= -1) and HasTriggerAt(L.LemX, L.LemY -1, trWater)
and not HasPixelAt(L.LemX, L.LemY - 1) then
Dec(L.LemY)
else if LemDy < -6 then
begin
if LemDive(L) > 0 then
Inc(L.LemY, LemDive(L)) // Dive below the terrain
// Only transition to climber, if the lemming is not under water
else if L.LemIsClimber and not HasTriggerAt(L.LemX, L.LemY - 1, trWater) then
Transition(L, baClimbing)
else
begin
TurnAround(L);
Inc(L.LemX, L.LemDx); // Move lemming back
end
end
else if LemDy <= -3 then
begin
Transition(L, baAscending);
Dec(L.LemY, 2);
end
// see http://www.lemmingsforums.net/index.php?topic=3380.0
// And the swimmer should not yet stop if the water and terrain overlaps
else if (LemDy <= -1)
or ((LemDy = 0) and not HasTriggerAt(L.LemX, L.LemY, trWater)) then
begin
Transition(L, baWalking);
Inc(L.LemY, LemDy);
end;
end
else // if no water or terrain on current position
begin
LemDy := FindGroundPixel(L.LemX, L.LemY);
If LemDy > 1 then
begin
Inc(L.LemY);
Transition(L, baFalling);
end
else // if LemDy = 0 or 1
begin
Inc(L.LemY, LemDy);
Transition(L, baWalking);
end;
end;
end;