cube-engine 0.1.0

cube-pump protocol implementation
Documentation
[ProtocolWrapper]
CubePump protocol runs via WebSocket.

There are two types of signals: LowLevelSignal (LL) and PackedSignal (PK).

[PackedSignal]
PKs mainly provide non-network-critical data related to the gameplay. They are sent in packages every 50ms.

[LowLevelSignal]
There are 5 classes of LL. Four of them are described in [HandShake], [LoginAccept], [Ping] and [Disconnect].

The fifth type of LL is the Package Signal, which sends a package of PKs in this format:
	length uint32
	deflated byte[length]
where deflated is the following data encoded in zlib deflation:
	for i from 1 to size
		0x80
		signalId[i] uint16
		signalPayload[i] dynamic
	0x00

Each LL has a 1-byte ID as presented in ll-id.txt

signalId[i] is the 2-byte ID of the i-th PK as presented in pk-id.txt

[Legend]
CS = Client -> Server only
SC = Server -> Client only
MT = Signal may be sent from both sides

nop = add some bits to pad the payload to a full byte

[DataTypes]
; [u]int(8|16|32|64): big-endian encoded

struct string
	length uint16
	buffer byte[length]
struct string32
	length uint32
	buffer byte[length]

struct event_time
	time uint64 ; number of microseconds since SPAWN happens

struct int_pos
	x int32
	y int32
	z int32
struct float_pos
	x float32
	y float32
	z float32

struct cube_pos
	batch int_pos
	local_x nibble
	local_y nibble
	local_z nibble
	nop
struct cube_precise_pos
	batch int_pos
	local_x nibble
	local_y nibble
	local_z nibble
	face nibble
	precise_x float32
	precise_y float32

struct cube_model
	TODO

struct flex_pos
	batch int_pos
	local float_pos
	yaw float32
	pitch float32

[FSM]
digraph FSM
	initial -> login_requested [HandShake]
	login_requested -> loading [LoginAccept]
	login_requested -> disconnected [Disconnect]
	loading -> loading [Load]
	loading -> loading [Ping]
	loading -> spawned [Spawn]
	loading -> disconnected [Disconnect]
	spawned -> spawned [Load]
	spawned -> spawned [GamePlay]
	spawned -> spawned [Ping]
	spawned -> disconnected [Disconnect]
	spawned -> loading [WorldSwitch]

[HandShake]
CS LOGIN_REQUEST
	majorProtocol uint32 ; client.major == server.major
	minorProtocol uint32 ; client.minor >= server.minor
	username string
	userId byte[20]
	language string
	sysInfo string

[LoginAccept]
SC LOGIN_ACCEPT
	minorProtocol uint32 ; to let client determine if server supports new features

[Disconnect]
SC DISCONNECT
	reason string
	rejoin bool
	nop

CS DISCONNECT

[Ping]
MT PING
	lastCycle uint64
MT PONG

[Load]
SC CUBE_DICT
	size uint32
	for i from 1 to size
		cubeDefId[i] uint32
		cubeDefName[i] string
		if cubeDefName[i] does not start with "CubePump."
			cubeDefModel[i] cube_model

SC CUBE_BATCH
	pos int_pos
	payload uint32[4096]

[Spawn]
SC SPAWN
	pos flex_pos
	; also resets eventTime to uint64(0)

[GamePlay]
SC CUBE_UPDATE
	pos cube_pos
	new uint16

CS CUBE_INTERACT
	pos cube_precise_pos
	method uint16

SC FLEX_MOTION
	eventTime event_time
	new flex_pos
	velocity float_pos

CS USER_MOTION
	yaw float32
	dash bool
	nop

CS USER_ROTATION
	yaw float32
	pitch float32

CS USER_FLAGS
	flyUp bool
	flyDown bool
	freeFly bool
	float bool
	crouch bool
	nop

SC FLEX_FLAGS
	crouch bool