anchor.diff:  
     Conf := true; //See if all players confirm this tick commands list
     for i:=1 to MAX_PLAYERS do
  -    for k:=1 to MAX_PLAYERS do
  -      Conf := Conf and (fSchedule[id,i].Confirmed[k] or not fPlayersEnabled[k]);
  +    Conf := Conf and (fConfirmed[id,i] or not fPlayersEnabled[i]);
   
     //Handle the issue
     if not Conf then
  
positive.code: 
    //Allocate memory for all commands lists
    for i:=0 to MAX_SCHEDULE-1 do for k:=1 to MAX_PLAYERS do
      fSchedule[i,k].Commands := TGIPList.Create;
  end;
  
  
  
negative.code: var i,k:integer;
  begin
    for i:=0 to MAX_SCHEDULE-1 do for k:=1 to MAX_PLAYERS do
      fSchedule[i,k].Free;
    fNetwork.Free;
    Inherited;
  end;
  
  
  procedure TGameInputProcess_Multi.TakeCommand(aCommand:TGameInputCommand);
  var id:integer;
  begin
    Assert(fDelay < MAX_SCHEDULE, 'Error, fDelay >= MAX_SCHEDULE');
  
    id := (fGame.GetTickCount + fDelay) mod MAX_SCHEDULE; //Place in a ring buffer
  
    fSchedule[id,byte(aCommand.PlayerID)].Add(aCommand);
    FillChar(fConfirmed[id], SizeOf(fConfirmed[id]), #0); //Reset
    fConfirmed[id,byte(aCommand.PlayerID)] := true; //Confirm by self
  end;
  
  
  procedure TGameInputProcess_Multi.SendCommands;
  var i,id:integer; Msg:TKMemoryStream;
  begin
    id := (fGame.GetTickCount + fDelay) mod MAX_SCHEDULE;
  
    Msg := TKMemoryStream.Create;
    Msg.Write(id); //Target Tick
  
    Msg.Write(fSchedule[id,1].Count); //todo: put our player id here
  
  {  for i:=1 to fSchedule[id,1].Count do
    begin
      fSchedule[id,1].Get(i).CommandType
  
    end;}
  
    //Now we just wait till the tick and hopefully everyone will confirm
    //to have recieved our commands
  end;
  
  
  procedure TGameInputProcess_Multi.RecieveCommands(aData:array of byte);
  begin
    //todo: Decode recieved messages (Commands from other players, Confirmations, Errors)
  end;
  