anchor.diff:    TAxisKind = (Vertical,Horizontal);
   
     TDragSubject = (MapObject, MapTemplate);
  -
  +  TfMain = class;
     { TDragProxy }
   
     TDragProxy = class(TDragObject)
  +  protected
  +    FOwner: TFMain;
     public
  +    constructor Create(AOwner: TfMain); reintroduce;
  +    destructor Destroy; override;
       procedure Drop; virtual; abstract;
       procedure Render(x,y: integer); virtual; abstract;
     end;
  
positive.code:   cx := (x +1 ) * TILE_SIZE;
    cy := (y+1) * TILE_SIZE;
  
    FDraggingTemplate.Def.RenderO(0,cx, cy, fMain.FCurrentPlayer);
  end;
  
  
  
negative.code:   o: TMapObject;
    ot: TMapObjectTemplate;
  begin
    ot :=  FOwner.FMap.Templates.Add;
  
    ot.FillFrom(FDraggingTemplate);
  
    o := FOwner.FMap.Objects.Add;
  
    o.TemplateID := ot.TID;
  
    Assert(Assigned(o.Template), 'Template not assigned by ID');
  
    o.L := FOwner.FMap.CurrentLevel;
    o.X := FOwner.FMouseTileX;
    o.Y := FOwner.FMouseTileY;
  
    if o.Options.MayBeOwned then
    begin
      o.Options.Owner := FOwner.FCurrentPlayer;
    end;
  
    //TODO: undo
    FOwner.FSelectedObject := o;
  end;
  
  procedure TTemplateDragProxy.Render(x, y: integer);
  