anchor.diff:                        mk_GameSetup,
                         mk_Gameplay);
   
  -
   type
  +  TKMPlayerInfo = class
  +    Addr:string;
  +    Nikname:string;
  +    PlayerType:TPlayerType;
  +    FlagColor:cardinal;
  +    StartLocID:integer;
  +    Alliances:array[1..MAX_PLAYERS] of TAllianceType;
  +    ReadyToStart:boolean;
  +  end;
  +
  +
  +type //Should handle everything related to players list
  +  TKMPlayersList = class
  +    private
  +      fCount:integer;
  +      fMyself:string; //
  +      fPlayers:array [1..MAX_PLAYERS] of TKMPlayerInfo;
  +      function GetAsText:string;
  +      procedure SetAsText(aText:string);
  +    public
  +      constructor Create;
  +      destructor Destroy; override;
  +      procedure Clear;
  +      property Myself:string read fMyself;
  +      procedure AddSelf(aAddr:string);
  +      procedure AddPlayer(aAddr:string);
  +      function AllReady:boolean;
  +      property AsText:string read GetAsText write SetAsText;
  +      procedure PacketSend(aKind:TMessageKind; const aData:string=''); //Broadcast to all except self
  +      procedure EncodeGameSetup(aStream:TKMemoryStream);
  +    end;
  +
  +
  +type //Should handle message exchange and routing, interacting with UI
     TKMNetworking = class
       private
         fNetwork:TKMNetwork;
  
positive.code: //Send whole game setup info at once, making sure there are no misunderstandings,
  //especially about random values (e.g. start locations)
  procedure TKMNetworking.StartGame;
  var i:integer; AllReady:boolean; Msg:TKMemoryStream;
  begin
    Assert(fLANPlayerKind = lpk_Host, 'Only host can start the game');
  
    //Check if everyone is ready to start
    AllReady := true;
    //for i := 1 to fPlayersList.Count-1 do //Exclude self
      //AllReady := AllReady and fPlayersList[i].Ready;
  
    if not AllReady then begin
      Assert(AllReady, 'Not everyone is ready to start');
      exit;
    end;
  
    Msg := TKMemoryStream.Create;
    EncodeGameSetup(Msg);
  
    //Send game setup to partners
    for i := 1 to fPlayersList.Count-1 do //Exclude self and send to [2nd to last] range
      //PacketSend(fPlayersList[i], mk_StartGame, Msg);
  
    Msg.Free;
  
    //Now we will await confirmation messages from other players and start the game
  end;
  
  
  procedure TKMNetworking.EncodeGameSetup(aStream:TKMemoryStream);
  var i:integer;
  begin
    aStream.Write(MapName);
    //aStream.Write(AllianceMode); //Fixed / changeable
    //aStream.Write(StartupConditions);
    //aStream.Write(WinConditions);
    //aStream.Write(DefeatConditions);
    aStream.Write(fPlayersList.Count);
  
    for i:=0 to fPlayersList.Count-1 do
    begin
      //aStream.Write(fPlayersList[i].PlayerType); //Human / AI
      aStream.Write(i{fPlayersList[i].StartLocID});
      //aStream.Write(fPlayersList[i].FlagColor);
      //for k:=0 to fPlayersList.Count-1
      //  aStream.Write(fPlayersList[i].Alliance[k]); //Startup
    end;
  end;
  
  
  procedure TKMNetworking.PostMessage(aText:string);
  var i:integer;
  begin
    fOnTextMessage(fPlayersList[0] + ': ' + aText);
  
    //Send to partners
    for i := 1 to fPlayersList.Count-1 do //Exclude self and send to [2nd to last] range
      PacketSend(fPlayersList[i], mk_Text, fPlayersList[0] + ': ' + aText);
  end;
  
  
  
negative.code: 
  
  procedure TKMNetworking.PacketRecieve(const aData: array of byte; aAddr:string);
  var Kind:TMessageKind; Data:string;
  begin
    Assert(Length(aData) >= 1, 'Unexpectedly short message'); //Kind, Message
  