anchor.diff:  { TUnitActionWalkTo }
   constructor TUnitActionWalkTo.Create(KMUnit: TKMUnit; LocB,Avoid:TKMPoint; const aActionType:TUnitActionType=ua_Walk; const aWalkToSpot:boolean=true; const IgnorePass:boolean=false);
   begin
  +  Assert(LocB.X*LocB.Y<>0,'Illegal WalkTo 0;0');
  +
     Inherited Create(aActionType);
  -  fWalker       :=KMUnit;
  -  fWalkFrom     :=fWalker.GetPosition;
  -  fWalkTo       :=LocB;
  -  fWalkToSpot   :=aWalkToSpot;   
  -
  -  case fWalker.fUnitType of
  -    ut_Serf..ut_Fisher,ut_StoneCutter..ut_Recruit: fPass:=canWalkRoad; //Citizens except Worker
  -    ut_Wolf..ut_Duck: fPass:=AnimalTerrain[byte(fWalker.fUnitType)]
  -    else fPass:=canWalk;
  -  end;
  -
  -  if not DO_SERFS_WALK_ROADS then fPass:=canWalk;
  -
  -  //Thats for Workers on house area
  -  if IgnorePass then fPass:=canAll;
  -
  -  //Thats for 'miners' at work
  -  if (fWalker.fUnitType in [ut_Woodcutter,ut_Farmer,ut_Fisher,ut_StoneCutter])and
  -     (fWalker.fUnitTask is TTaskMining) then
  -    fPass:=canWalk;
  +  fWalker       := KMUnit;
  +  fWalkFrom     := fWalker.GetPosition;
  +  fWalkTo       := LocB;
  +  fWalkToSpot   := aWalkToSpot;
  +  fPass         := ChoosePassability(fWalker, IgnorePass);
   
     NodePos       :=1;
  -  fRouteBuilt   :=false;
  -
  -  Assert(LocB.X*LocB.Y<>0,'Illegal WalkTo 0;0');
  -
  -  if KMSamePoint(fWalkFrom,fWalkTo) then exit; //We don't care for this case, Execute will report action is done immeduately
  +  fRouteBuilt   :=false;     
  +
  +  if KMSamePoint(fWalkFrom,fWalkTo) then //We don't care for this case, Execute will report action is done immediately
  +    exit; //so we don't need to perform any more processing
   
     //Build a route A*
     fTerrain.Route_Make(fWalkFrom, fWalkTo, Avoid, fPass, NodeCount, Nodes); //Try to make the route with fPass
  
positive.code: 
    //Somehow route was not built, this is an error
    if not fRouteBuilt then begin  
      fLog.AddToLog('Unable to walk a route ');
      //DEBUG, should be wrapped somehow for the release
      fViewport.SetCenter(fWalker.GetPosition.X,fWalker.GetPosition.Y);
      fGame.PauseGame(true);
    end;
  
    //Execute the route in series of moves
  
negative.code:   if not fRouteBuilt then
      fLog.AddToLog('Unable to make a route '+TypeToString(fWalkFrom)+' > '+TypeToString(fWalkTo)+'with canWalk');
  
    if fRouteBuilt and not fWalkToSpot then dec(NodeCount); //Approach spot from any side
  end;
  
  
  function TUnitActionWalkTo.ChoosePassability(KMUnit: TKMUnit; DoIgnorePass:boolean):TPassability;
  begin
    case KMUnit.fUnitType of //Select desired passability depending on unit type
      ut_Serf..ut_Fisher,ut_StoneCutter..ut_Recruit: Result:=canWalkRoad; //Citizens except Worker
      ut_Wolf..ut_Duck: Result:=AnimalTerrain[byte(KMUnit.fUnitType)] //Animals
      else Result:=canWalk; //Worker, Warriors
    end;
  
    if not DO_SERFS_WALK_ROADS then Result:=canWalk; //Reset everyone to canWalk for debug
  
    //Thats for 'miners' at work
    if (KMUnit.fUnitType in [ut_Woodcutter,ut_Farmer,ut_Fisher,ut_StoneCutter])and(KMUnit.fUnitTask is TTaskMining) then
      Result:=canWalk;
  
    if DoIgnorePass then Result:=canAll; //Thats for Workers walking on house area and maybe some other cases?
  end;
  
  
  