anchor.diff:  
   
   destructor TKMCityPlanner.Destroy();
  -begin
  +var
  +  HT: TKMHouseType;
  +  I, K, Len: Integer;
  +begin
  +  for HT := HOUSE_MIN to HOUSE_MAX do
  +    for I := 0 to fPlannedHouses[HT].Count - 1 do
  +      if (fPlannedHouses[HT].Plans[I].House <> nil) then
  +        gHands.CleanUpHousePointer(fPlannedHouses[HT].Plans[I].House);
     fRoadPlanner.Free;
     fForestsNearby.Free;
     fRoadShortcutPlanner.Free;
  
positive.code: type
    THousePlan = record
      Placed, ShortcutsCompleted, RemoveTreeInPlanProcedure, HouseReservation, ChopOnly: Boolean;
      UID: Integer;
      Loc, SpecPoint: TKMPoint;
    end;
    THousePlanArray = record
      Count: Word;
      Plans: array of THousePlan;
    end;
    TPlannedHousesArray = array [HOUSE_MIN..HOUSE_MAX] of THousePlanArray;
  
negative.code:         end;
    end;
  
    procedure CheckWoodcutter(aHousePlan: THousePlan; aCheckChopOnly: Boolean);
    var
      Point: TKMPoint;
      W: TKMHouseWoodcutters;
    begin
      // Make sure that this house is woodcutter
      if (aHousePlan.House.HouseType <> ht_Woodcutters) then
        Exit;
      W := TKMHouseWoodcutters(aHousePlan.House);
      // Check if is cutting point required (compare with default cutting point)
      if not KMSamePoint(aHousePlan.SpecPoint, KMPOINT_ZERO) AND not W.IsFlagPointSet then
      // Set the cutting point - do it only once because it reset empty message (woodcutters in chop only mode will not be destroyed)
  