anchor.diff:  
     TKMPointListArray = array of TKMPointList;
   
  +  TKMPointCenteredList = class(TKMPointList)
  +  private
  +    fCenter: TKMPoint;
  +    fWeight: array of Single;
  +  public
  +    constructor Create(aCenter: TKMPoint);
  +    procedure Add(const aLoc: TKMPoint); override;
  +    function GetWeightedRandom(out Point: TKMPoint): Boolean;
  +  end;
  +
     TKMPointTagList = class(TKMPointList)
     public
       Tag, Tag2: array of Cardinal; //0..Count-1
  
positive.code:   SetLength(fItems, fCount);
    if fCount > 0 then
      LoadStream.Read(fItems[0], SizeOf(fItems[0]) * fCount);
  end;
  
  
  
negative.code:     function GetItem(aIndex: Integer): TKMPointDir;
    public
      procedure Clear;
      procedure Add(const aLoc: TKMPointDir); virtual;
      property Count: Integer read fCount;
      property Items[aIndex: Integer]: TKMPointDir read GetItem; default;
      function GetRandom(out Point: TKMPointDir): Boolean; //overload;
  
  //    function GetRandom(aCloseToLoc: TKMPoint; out Point: TKMPointDir): Boolean; overload;
      procedure ToPointList(aList: TKMPointList; aUnique: Boolean);
      procedure LoadFromStream(LoadStream: TKMemoryStream); virtual;
      procedure SaveToStream(SaveStream: TKMemoryStream); virtual;
    end;
  
  
    TKMPointDirCenteredList = class(TKMPointDirList)
    private
      fCenter: TKMPoint;
      fWeight: array of Single;
    public
      constructor Create(aCenter: TKMPoint);
      procedure Add(const aLoc: TKMPointDir); override;
      function GetWeightedRandom(out Point: TKMPointDir): Boolean;
    end;
  
  
  