I did some debugging with this kind of code:
Code:
  //oldX:=MarioGO.x;
  oldY:=MarioGO.y;
  oldX:=10; // TEST

  //movement
  if al_key[Options.binding_up]<>0 then begin
    MarioGO.y:=MarioGO.y-4;
  end;
  if al_key[Options.binding_down]<>0 then begin
    MarioGO.y:=MarioGO.y+4;
  end;
  if al_key[Options.binding_left]<>0 then begin
    MarioGO.x:=MarioGO.x-4;
  end;
  if al_key[Options.binding_right]<>0 then begin
    MarioGO.x:=MarioGO.x+4;
  end;
  if MarioGO.isColliding(OtherMarioGO) then begin
    MarioGO.x:=oldX;
    MarioGO.y:=oldY;
  end;
End effect is that player is no longer stuck but warps to left side, and i can clearly see that the pixel collision, if that is the intention, is not accurate. Character moves well inside the other until collision triggers. Also debugger says that MarioGO is nil for some reason. Clearly it is not nil because this code doesn't stop the procedure
Code:
if MarioGO=nil then exit;