furnace/papers/multiplayer.md
2023-07-10 11:30:41 -07:00

8.1 KiB
Raw Permalink 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)