Skip to content

Protocol Fundamentals

The FunOrb protocol is a TCP-based, stream-oriented protocol with variable sized packets. The original game servers ran under the 43594 port, falling back to port 443 if certain communication errors occur. These ports are not strictly required and each game can be configured to use different ports via Applet parameters.

Packet Framing

The protocol uses a very simple packet framing scheme, a packet typeId followed by it's size and then the payload.

protocol-framing

Optionally, some packets may contain a crc32 checksum of the payload:

protocol-framing-crc

Packet Sizes

Packets can have four different sizes:

  • Fixed size packets, which are packets whose payload is a fixed size.
  • Var-Byte packets, which are packets whose payload size is a value between 0 and 255.
  • Var-Short packets, which are packets whose payload size is a value between 0 and 65535.
  • Var-Size packets, which are Var-Byte or a Var-Short packets depending on it's payload size.

Packet Type Obfuscation

The Game Protocol employs a packet typeId obfuscation by using an Isaac pseudo-random generator and adding (on the encoder side)/subtracting (on the decoder side) the next generated random int to the typeId as the following pseudo-code:

Encoder
int typeId = (byte) (realTypeId + isaac.nextInt())
Decoder
int typeId = obfuscatedTypeId - isaac.nextInt() & 0xFF