anchor.diff:    TREES_RX_OFFSET = 260;
     HOUSES_RX_OFFSET = 2100;
   begin
  +  SetLength(fAnimCache, 0);
  +  SetLength(fInterpCache, 0);
  +
     //UNITS
     picOffset := UNITS_RX_OFFSET;
   
  -  animData := 'ACTION_INTERP_LOOKUP: array[TKMUnitType, TKMUnitActionType, TKMDirection] of Integer = ('+#13#10;
  +  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;
  
positive.code:       animData := animData + ',';
      animData := animData+#13#10;
    end;
    animData := animData + ');';
  
  
    Memo1.Text := animData;
  
negative.code: end;
  
  
  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(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(INVALID_INTERP);
  
    //Death animations have semi-transparent white that we treat as shadows
    if aAction = uaDie then
  