furnace/papers/multiplayer.md
Lunathir 6dae432279
Update multiplayer.md
Fix formatting
2023-07-10 01:31:00 -07:00

8.1 KiB
Raw Blame History

multiplayer protocol

this is a concept! it has not been implemented yet!

the Furnace protocol is described here.

information

all numbers are little-endian.

the following fields may be found in "size":

  • f indicates a floating point number.
  • STR is a UTF-8 zero-terminated string.
  • CFG is the same as STR, but contains a config.
  • ??? is an array of variable size.
  • S?? is an array of STRs.
  • 1?? is an array of bytes.
  • 2?? is an array of shorts.
  • 4?? is an array of ints.

two player IDs are reserved:

  • 0: system
  • 1: host (console)

two usernames are reserved:

  • SYSTEM
  • HOST

some characters are not allowed in usernames: 0x00-0x1f, @, 0x7f-0x9f, 0xd800-0xdfff, 0xfeff, 0xfffe and 0xffff.

header

size | description
-----|------------------------------------
  3  | "fur" header
  1  | packet type
  4  | sequence number

the sequence number always starts at 0.

client to server packets (init)

0x00: keep-alive

this packet keeps a connection alive. the server shall respond with a packet of type 0x00 (keep-alive). if the client does not receive any packets during 30 seconds, it will disconnect from the server. likewise, if the server does not receive any packets during 30 seconds, it will disconnect the client.

0x01: start connection

size | description
-----|------------------------------------
  1  | reason
     | - 0: information
     | - 1: join
  3  | padding
  4  | client version
 STR | host name (may be blank)

after sending, you will receive a packet of type 0x01 (information), 0x02 (disconnect) or 0x03 (authenticate).

0x02: disconnect

size | description
-----|------------------------------------
 STR | reason

0x03: auth response

size | description
-----|------------------------------------
  1  | type
     | - 0: open
     | - 1: password
     | - 2: token
 --- | **open response**
 STR | username
 --- | **password response**
  1  | password type
     | - 0: plain text
     | - 1: SHA-512
 STR | account name
 ??? | password
 --- | **token response**
 STR | token

server to client packets (init)

0x00: keep-alive

this packet keeps a connection alive. it is a response to a client's keep-alive packet.

0x01: information

size | description
-----|------------------------------------
  4  | server version
  2  | online players
     | - if it is 65535, this information is concealed.
  2  | maximum players
     | - 0 means unlimited.
 STR | server version (string)
 STR | server name
 STR | server description
 STR | project name

the client may send a 0x00 (keep-alive) packet after receiving this one within 5 seconds. connection is then closed.

0x02: disconnect

size | description
-----|------------------------------------
 STR | reason

after being sent, the connection is closed.

0x03: authenticate

size | description
-----|------------------------------------
  1  | authentication type
     | - 0: open
     | - 1: password
     | - 2: token

0x04: authentication success

size | description
-----|------------------------------------
  4  | player ID
 STR | username
 CFG | properties

client to server packets (session)

0x10: request project

the client may only send this once every minute.

0x11: participate

size | description
-----|------------------------------------
  1  | status
     | - 0: spectate
     | - 1: join

0x12: send chat message

size | description
-----|------------------------------------
 STR | message

0x13: send command

size | description
-----|------------------------------------
 STR | command
  2  | number of arguments
 S?? | arguments

0x14: get player list

no other information required.

0x15: project submission request

no other information required

0x16: project submission information

size | description
-----|------------------------------------
  4  | project size
 32  | SHA-256 sum of project
 STR | project name

this is followed by several 0x17 (project data) packets representing a Furnace song. see format.md for more information.

0x17: project submission data

size | description
-----|------------------------------------
  4  | offset
  4  | length
 ??? | data...

the client will send a packet with project size as offset and 0 as length to indicate end of data. the server subsequently loads the project.

server to client packets (session)

0x10: project information

size | description
-----|------------------------------------
  4  | project size
 32  | SHA-256 sum of project
 STR | project name

this is followed by several 0x13 (project data) packets representing a Furnace song. see format.md for more information.

0x11: project data

size | description
-----|------------------------------------
  4  | offset
  4  | length
 ??? | data...

the server will send a packet with project size as offset and 0 as length to indicate end of data. the client subsequently loads the project.

0x12: participate status

size | description
-----|------------------------------------
  1  | status
     | - 0: denied
     | - 1: allowed

## 0x13: message
size description
4 player ID
8 time (seconds)
4 time (nanoseconds)
4 message ID
1 type
- 0: chat, public
- 1: chat, private
- 2: notification, info
- 3: notification, warning
- 4: notification, urgent
STR message
## 0x14: system message
size description
STR message
## 0x15: chat message edited
size description
4 message ID
STR message
- an empty message means deleted.
## 0x16: player list
size description
2 number of players
--- player entry (×players)
4 ID
2 latency (ms)
1 participating?
- 0: no
- 1: yes
1 status
- 0: normal
- 1: away
- 2: busy
STR name
STR IP address
- if empty, then server is not disclosing IP addresses.
this is sent after receiving 0x14 (get player list).

## 0x17: project submission request status
size description
1 status
- 0: denied
- 1: allowed
this is sent after a project submission request is accepted.
if the status is 1, the client shall submit a project.

## 0x18: project submission complete
size description
1 status
- 0: error
- 1: success
STR additional information
## 0x19: player joined
size description
4 ID
STR name
## 0x1a: player left
size description
4 ID
# client to server packets (project)

## 0x20: request orders

## 0x21: request instrument

## 0x22: request wavetable

## 0x23: request sample

## 0x24: request patterns

## 0x25: request sub-song

## 0x26: request song info

## 0x27: request asset list

## 0x28: request patchbay

## 0x29: request grooves

## 0x30: alter orders
size description
4 transaction ID
## 0x31: alter instrument

## 0x32: alter wavetable

## 0x33: alter sample

## 0x34: alter pattern

## 0x35: alter sub-song

## 0x36: alter song info

## 0x37: alter asset list

## 0x38: alter patchbay

## 0x39: alter grooves

## 0x3a: alter chips

## 0x3b: alter chip settings

# server to client packets (project)

## 0x20: orders

## 0x21: instrument

## 0x22: wavetable

## 0x23: sample

## 0x24: pattern

## 0x25: sub-song

## 0x26: song info

## 0x27: asset list

## 0x28: patchbay

## 0x29: grooves

## 0x30: transaction response
size description
1 status
- 0: error
- 1: success
- 2: success but request again
STR additional information
# client to server packets (interact)

## 0x40: engine command

## 0x41: playback

# server to client packets (interact)

## 0x40: engine command

## 0x41: playback

# client to server packets (extension)

# server to client packets (extension)