Protocol Header

The header has a fixed length of 20 bytes and is present in almost all of the packets. Exceptions are the sync packets with 16 byte length, who have a smaller header.

Definition

def Header
  int32 :network_source_id
  int32 :network_dest_id
  int8 :command
  int8 :option1
  int8 :option2
  int8 :option3
  int32 :communication_turn
  int32 :individual_counter
end

Description

:network_source_id
The :network_id of the person who sent the packet. A :network_id is different for every game, but is not generated randomly for all players. When joining the lobby, every player gets assigned last_network_id - 2 as his own :network_id where last_network_id is the ID of the person who joined before him.

:network_dest_id
The :network_id of the person who should receive the packet. Is only used for sync packets and remains unused for most commands.

:command
The command which tells the network engine how the data bytes should be interpreted.

:option{1-3}
These are options with unknown effects.

:communication_turn
The communication turn where the command is executed. Packets that contain a communication turn that has already passed are discarded.

:individual_counter
The individual counter of the player who receives the packet. It increments by 1 with every 16BC41 sync command. For individual players, this counter starts with values that are 1200 units (two players) or 2000 units (three players, 0x7d0) apart from each other. In the latter example player 1 starts with the value 0x7d0, player 2 with 0xfa0 and player 3 with 0x1770. If the differences between these values is not a multiple of 2000, this indicates a de-sync.

Examples

82 b2 45 00 00 00 00 00 53 02 8f 0b 30 00 00 00 01 08 00 00

82 b2 45 00 — network_source_id
00 00 00 00 — network_dest_id
53 — command
02 — option1
8f — option2
0b — option3
30 00 00 00 — communication_turn
01 08 00 00 — individual_counter