anchor.diff:  end;
   
   
  -function TForm1.DoInterpUnit(aUT: TKMUnitType; aAction: TKMUnitActionType; aDir: TKMDirection; var aPicOffset: Integer; aDryRun: Boolean): Integer;
  +function TForm1.DoInterpUnit(aUT: TKMUnitType; aAction: TKMUnitActionType; aDir: TKMDirection; var aPicOffset: Integer; aDryRun: Boolean): string;
   var
     A: TKMAnimLoop;
     bkgRGB: Cardinal;
   begin
     if aDir = dirNA then
  -    Exit(-1);
  +    Exit(INVALID_INTERP);
   
     A := fResUnits[aUT].UnitAnim[aAction,aDir];
   
     if (A.Count <= 1) or (A.Step[1] = -1) or not (aAction in UNIT_SUPPORTED_ANIMS[aUT]) then
  -    Exit(-1);
  +    Exit(INVALID_INTERP);
   
     //Death animations have semi-transparent white that we treat as shadows
     if aAction = uaDie then
  
positive.code: end;
  
  
  function TForm1.DoInterpSerfCarry(aWare: TKMWareType; aDir: TKMDirection; var aPicOffset: Integer; aDryRun: Boolean): Integer;
  var
    A: TKMAnimLoop;
  begin
  
negative.code:   TREES_RX_OFFSET = 260;
    HOUSES_RX_OFFSET = 2100;
  begin
    SetLength(fAnimCache, 0);
    SetLength(fInterpCache, 0);
  
    //UNITS
    picOffset := UNITS_RX_OFFSET;
  
    for u := Low(TKMUnitType) to High(TKMUnitType) do
      animData := animData + DoInterpUnit(u, uaEat, dirE, picOffset, not chkUnitActions.Checked);
  
    Memo1.Text := animData;
    Exit;
  
    animData := 'type'+#13#10;
    animData := animData + '  TKMInterpolation: array[1..30, 0..7] of Integer;'+#13#10;
    animData := animData + 'const'+#13#10;
    animData := animData + 'ACTION_INTERP_LOOKUP: array[TKMUnitType, TKMUnitActionType, TKMDirection] of TKMInterpolation = ('+#13#10;
    for u := Low(TKMUnitType) to High(TKMUnitType) do
    begin
      animData := animData + '  ('+' // '+TRttiEnumerationType.GetName(u)+#13#10;
  