Artemis Protocols

Introduction

This is unoffical documentation of the network and file protocols used by Artemis Spaceship Bridge Simulator. No official documentation exists, so the information in this document has been obtained through community reverse-engineering efforts. There will be parts of the protocols that are not completely documented because their purpose has not been determined, and some parts may not be accurate. Contributions to this documentation are welcome.

Data Types

The Artemis protocols use the following data types:

  • byte
  • short (2 bytes)
  • int (4 bytes)
  • float (4 bytes)
  • bit field (variable length)
  • boolean (variable length)
  • string (variable length)

These types can be combined in structs or arrays.

Endianness

All multi-byte data types are represented in little-endian order (least-significant byte first). Numeric literals in this documentation, in order to follow the existing convention for many programming languages, are prefixed with 0x and are written in big-endian order. For example, the four bytes that begin every Artemis packet are ef be ad de; represented as an int, this is 0xdeadbeef.

Numeric Format

Integral types (byte, short, int) use two's complement representation in binary. Floats use IEEE 754 binary32 format.

Bit Field Format

A bit field is one or more bytes that encodes a series of on/off switches. Each bit in the binary representation of each byte in the field represents a single switch. In this documentation, an individual bit in a bit field is represented with the notation “bit {byte}.{bit}”, where the byte and bit values are one-based, and the bits are counted in little-endian order (least-significant bits first).

The most common use for a bit field is to declare which properties are defined in a struct. Each bit represents a property, with 1 indicating that the property is defined, and 0 meaning it is undefined. When sending updates to clients, the Artemis server typically omits properties which are unchanged since the last update; these properties will be undefined when the updated struct is transmitted.

Example

A single-byte bit field with the value 0x42 is represented in little-endian binary as 01000010. Bits 1.2 and 1.7 are on, the rest are off.

Boolean Format

Boolean values are simply expressed as an integer value 0 (false) or 1 (true). This value may be transmitted as a byte, short or int. In this documentation, a field is considered to be a boolean if all the following conditions are met:

  1. There are only two possible values.
  2. The values are exact opposites (true/false, on/off, etc.).
  3. They are represented by 0 and 1.
  4. It does not seem that other values could be added in the future. (If other values are deemed possible, the field's value is documented as an enumeration instead.)

String Format

Strings are represented by an int giving the length of the string in characters, followed by the string itself encoded in UTF-16LE. Because UTF-16 encodes each character in two bytes, the number of bytes to read after the length value is the number of characters times two. Strings are null-terminated (0x0000), and the length value includes the null. Under normal circumstances, the null character would be the last two bytes read for the string; if the null character occurs earlier, the remaining bytes are meaningless and should be discarded. Zero-length strings are not allowed. For brevity's sake, all values denoted as strings in this documentation are presumed to follow this format, and the string length value will not be documented separately.

Example

To interpret the byte sequence 04 00 00 00 48 00 69 00 21 00 00 00 as a string, you would first read an int (4 bytes) to learn the string's length: 04 00 00 00, which is four characters. In UTF-16, this is eight bytes, so you'd then read eight bytes from the stream: 48 00 69 00 21 00 00 00. Decoded, this is H, i, ! and null, which terminates the string. Thus, the byte sequence represents the string "Hi!"

Array Format

Arrays consist of an ordered list of values. These values can be primitive types, strings, structs or other arrays. There are two basic kinds of arrays: delimited and undelimited. Delimited arrays are typically used in circumstances where the exact number of elements in the array is not known in advance. Elements are transmitted one after the other until a particular byte is encountered instead of more data. With undelimited arrays, either the exact size or exact number of elements is known, so no delimiter is needed. Instead, parsing continues until the desired number of elements is read, or all the bytes that make up the array are consumed.

Structs

Structs are complex types composed of primitive types, strings, arrays or other structs. These properties are always specified in a particular defined order, so that it is unneccessary to declare each property's name when reading or writing a struct. There are two type of structs: static structs and bit field structs. A static struct always transmits all of its properties. A bit field struct has a bit field as its first property. Each bit in the field corresponds to one of the remaining properties in the struct. If a bit is 1, that property is defined; if it's 0, it is undefined and is omitted from the struct. When the Artemis server sends game object updates, it will typically use bit field structs to only send properties which have changed and leave the rest undefined; this reduces the payload size for update packets.

Enumerations

When Artemis needs to refer to an item from a static list (enumeration), it will use a predefined numeric value to represent it. This section documents these enumerations.

Alert Status

0x00 Normal
0x01 Red Alert

Audio Command

0x00 Play
0x01 Dismiss

Audio Mode

0x00 unused
0x01 playing
0x02 incoming

Beam Frequency

0x00 A
0x01 B
0x02 C
0x03 D
0x04 E

COMM Message

To players:

0x00 Yes.
0x01 No.
0x02 Help!
0x03 Greetings.
0x04 Die!
0x05 We're leaving the sector. Bye.
0x06 Ready to go.
0x07 Please follow us.
0x08 We'll follow you.
0x09 We're badly damaged.
0x0a We're headed back to the station.
0x0b Sorry, please disregard.

To enemies:

0x00 Will you surrender?
0x01 Taunt #1 (varies by race)
0x02 Taunt #2 (varies by race)
0x03 Taunt #3 (varies by race)

Comm Station Message

0x00 Prepare Docking
0x01 Report Status
0x02 Build Homing
0x03 Build Nukes
0x04 Build Mines
0x05 Build Emps
0x06 Build Pshocks

To other ships:

0x00 Report status
0x01 Turn to heading 0
0x02 Turn to heading 90
0x03 Turn to heading 180
0x04 Turn to heading 270
0x05 Turn 10 degrees to port
0x06 Turn 10 degrees to starboard
0x07 Attack nearest enemy
0x08 Proceed to your destination
0x09 Go defend [target]
0x0a unused
0x0b unused
0x0c unused
0x0d unused
0x0e unused
0x0f Turn 25 degrees to port
0x10 Turn 25 degrees to starboard

Comm Target Type

0x00 Player
0x01 Enemy
0x02 Station
0x03 Other

Connection Type

0x01 Server
0x02 Client

Console Status

0x00 Available
0x01 Yours
0x02 Unavailable

Console Type

< v2.1 ≥ v2.1, < v2.3 ≥ v2.3
0x00 main screen main screen main screen
0x01 helm helm helm
0x02 weapons weapons weapons
0x03 engineering engineering engineering
0x04 science science science
0x05 communications communications communications
0x06 observer data fighter
0x07 captain's map observer data
0x08 game master captain's map observer
0x09 unused game master captain's map
0x0a unused unused game master

Creature Type

0x00 Classic Monster
0x01 Whale
0x02 Shark
0x03 Dragon
0x04 Piranha
0x05 Charybdis
0x06 Insect
0x07 Wreck

Drive Type

0x00 Warp
0x01 Jump

Special Ability

Note: Special abilities can stack, in which case the values are ORed together. For example, cloak and warp would be 0x14. A ship with no special abilities would have a special ability value of 0x00. Special abilities used to be called elite abilities in earlier versions of the game.

FlagInternal nameAlt nameDescription
0x0001ELITE_INVIS_TO_MAIN_SCREENStealthCannot be seen on main screen
0x0002ELITE_INVIS_TO_TACTICAL LowVisCannot be seen on tactical map
0x0004ELITE_CLOAKING CloakCan become completely invisible
0x0008ELITE_HET HET?
0x0010ELITE_WARP Warp?
0x0020ELITE_TELEPORT Teleport?
0x0040ELITE_TRACTOR_BEAM TractorCan lock player ships in, preventing them from escaping
0x0080ELITE_DRONE_LAUNCHER DronesCan launch drones
0x0100ELITE_ANTI_MINE_BEAMS Anti-mines?
0x0200ELITE_ANTI_TORP_BEAMS Anti-torp?
0x0400ELITE_ANTI_SHIELD Shield-drainCan drain the energy of player ship shields
0x0800ELITE_? ShldVampCan steal energy from player ship shields (unconfirmed)

Game Type

< v2.1 ≥ v2.1
0x00 siege siege
0x01 single front single front
0x02 double front double front
0x03 unused deep strike
0x04 unused peacetime
0x05 unused border war

Main Screen View

0x00 Forward
0x01 Port
0x02 Starboard
0x03 Aft
0x04 Tactical
0x05 Long Range
0x06 Status

Object Type

< v2.1.5 ≥ v2.1.5
0x00 end of ObjectUpdatePacket end of ObjectUpdatePacket
0x01 player ship player ship
0x02 weapons console weapons console
0x03 engineering console engineering console
0x04 NPC ship (enemy or civilian) player ship upgrades
0x05 base NPC ship (enemy or civilian)
0x06 mine base
0x07 anomaly mine
0x08 unused anomaly
0x09 nebula unused
0x0a torpedo nebula
0x0b black hole torpedo
0x0c asteroid black hole
0x0d generic mesh asteroid
0x0e creature generic mesh
0x0f whale creature
0x10 drone drone

Ordnance Type

< v2.1.5 ≥ v2.1.5
0x00 homing missile homing missile
0x01 nuke nuke
0x02 mine mine
0x03 EMP EMP
0x04 unused plasma shock

Perspective

0x00 First Person
0x01 Third Person

Ship System

0x00 Beams
0x01 Torpedoes
0x02 Sensors
0x03 Maneuvering
0x04 Impulse
0x05 Warp Drive
0x06 Fore Shields
0x07 Aft Shields

Targeting Mode

0x00 Auto
0x01 Manual

Tube Status

0x00 Unloaded
0x01 Loaded
0x02 Loading
0x03 Unloading

Upgrades

New as of v2.1.5. Upgrades marked with (*) can be activated by client consoles, meaning they can occur in the ActivateUpgrade packet.

IndexIn-game nameTypeDescription
0x00*Infusion P-Coils Engine Boost 5 Minute 10% Impulse and Warp Speed Boost
0x01*Hydrogen Ram Maneuver Boost 5 Minute 10% Turn Speed Boost
0x02*Tauron Focusers Weapons Boost 5 Minute 10% Beam and Reload Speed Boost
0x03*Carapaction Coils Shield Boost 5 Minute 10% Shield Recharge Boost
0x04*Polyphasic Capacitors Energy Boost 5 Minute 10% Energy Recharge Boost
0x05*Coolant Reserves Heat Reduction 5 Minute 10% Faster Heat Reduction
0x06*Lateral Array Scanner Boost 5 Minute Target Scan Triple Speed
0x07*ECM Starpulse Jammer Boost 5 Minute Enemy Cannot Lock
0x08*Double Agent Auto-Surrender Can force one ship to auto surrender
0x09Wartime Production Prod Boost 10% (min +1) boost to all starting base munitions
0x0aInfusion P-Coils PERM Engine Refit Permanent 10% Impulse and Warp Speed Boost
0x0bProtonic Verniers Maneuver Refit Permanent 10% Turn Speed Boost
0x0cTauron Focusers PERM Weapons Refit Permanent 10% Reload and Beam Speed
0x0dRegenerative Pau-Grids Shield Refit Permanent 10% Shield Recharge Speed
0x0eVeteran DamCon Teams Faster DamCon Damcon teams move/repair 10% faster
0x0fCetrocite Heatsinks Heatsink Refit Heat builds 10% slower
0x10Tachyon Scanners Scanner Refit Permanent 10% Scan Speed Boost
0x11Gridscan Overload Sensor Refit Permanent 10% Range Booster
0x12Override Authorization Improved Prod All bases produce 10% faster
0x13Resupply Imperatives Mission Enhance 10% More missions
0x14Patrol Group Allied Combat Additional TSN Escort Ship in-sector
0x15Fast Supply Allied Supply Additional TSN Cargo Ship in-sector
0x16Vanguard Refit Improved Console Perm 10% Boost to Impulse, Warp, and Turn Speed
0x17Vanguard Refit Improved Console Perm 10% Boost to Beam, Shield and Reload Speeds
0x18Vanguard Refit Improved Console Perm 10% Boost to Scan speed and Sensor Range
0x19Vanguard Refit Improved Console Perm 10% Boost to Station production
0x1aVanguard Refit Improved Console Perm 10% Boost to all Engineering Systems
0x1bVanguard Refit Systems Overhaul Permanent 10% Boost to all Ship Systems

Game world upgrades

New as of v2.1.5.

IndexInternal nameKnown names
0x00ITEMTYPE_ENERGY Anomaly / HiDens Power Cell
0x01ITEMTYPE_RESTORE_DAMCONVigoranium Nodule
0x02ITEMTYPE_HEAT_BUFF Cetrocite Crystal
0x03ITEMTYPE_SCAN_BUFF Lateral Array
0x04ITEMTYPE_WEAP_BUFF Tauron Focusers
0x05ITEMTYPE_SPEED_BUFF Infusion P-Coils
0x06ITEMTYPE_SHIELD_BUFF Carapaction Coils
0x07ITEMTYPE_COMM_BUFF Secret code case / Double agent

Packet Structure

Artemis packets have two parts: the preamble and the payload.

Preamble

The preamble consists of metadata that describes what kind packet it is and how long it is. The information in the preamble is needed in order to interpret the payload. The preamble consists of the following parts:

Header (int)

The first four bytes constitute a header which identifies the packet as an Artemis packet. This value should always be 0xdeadbeef.

Packet length (int)

Gives the total length of the packet in bytes, including both the preamble and the payload.

Origin (int)

A connection type enumeration value indicating whether the packet originates from the server or the client.

Padding (int)

This value is always 0x00.

Remaining bytes (int)

The number of bytes following this field in the packet. This is the length of the packet type field (4) plus the length of the payload, or the length of the entire packet minus 20.

Packet type (int)

This value identifies the type of this packet. Refer to the packet types table to find the values that correspond to the various packet types. Note that many packets also have a subtype value; for those packets, the subtype will be the first value transmitted in the payload.

Payload

The remaining bytes in the packet after the preamble constitute the payload. Its format will vary depending on the packet type. Refer to the next section to see what packet types exist and the formats of their payloads.

Packet Types

The table below lists the known packet types. The type names are derived from the class names for the packets in ArtClientLib.

Name Origin Type Subtype(s)

Hypothetical

__client_hypothetical__1

Type: 0x0351a5ac:0x03 [from client]

This packet has not been observed, but has been hypothesized to exist based on the numeric range of the subtype. Nothing concrete is known about this packet type at this point, or even if it exists.

Payload

Subtype (int)

Always 0x03.

__client_hypothetical__3

Type: 0x69cc01d9:0x01 [from client]

This packet has not been observed, but has been hypothesized to exist based on the numeric range of the subtype. Nothing concrete is known about this packet type at this point, or even if it exists.

Payload

Subtype (int)

Always 0x01.

__server_hypothetical__2

Type: 0xf754c8fe:0x02 [from server]

This packet has not been observed, but has been hypothesized to exist based on the numeric range of the subtype. Nothing concrete is known about this packet type at this point, or even if it exists.

Payload

Subtype (int)

Always 0x02.

__server_hypothetical__2

Type: 0xf754c8fe:0x0e [from server]

This packet has not been observed, but has been hypothesized to exist based on the numeric range of the subtype. Nothing concrete is known about this packet type at this point, or even if it exists.

Payload

Subtype (int)

Always 0x0e.

__server_hypothetical__3

Type: 0xf754c8fe:0x16 [from server]

This packet has not been observed, but has been hypothesized to exist based on the numeric range of the subtype. Nothing concrete is known about this packet type at this point, or even if it exists.

Payload

Subtype (int)

Always 0x16.

Unknown

__client_unknown__4

Type: 0x0351a5ac:0x07 [from client]

Payload

Subtype (u32)

Always 0x07.

__unknown_1 (float array (length 10))

__client_unknown__1

Type: 0x4c821d3c:0x05 [from client]

This packet type has been observed, and is known to exist, but its function is as of yet completely unknown. All examples so far have seen was sent from Helm to Server.

Payload

Subtype (u32)

Always 0x05.

__unknown_1 (u32)

So far, only 0x00000000 has been observed.

__client_unknown__2

Type: 0x4c821d3c:0x06 [from client]

This packet type has been observed, and is known to exist, but its function is as of yet completely unknown. All examples so far have seen was sent from Helm to Server.

Payload

Subtype (u32)

Always 0x06.

__unknown_1 (u32)

So far, only 0x00000000 has been observed.

__client_unknown__3

Type: 0x4c821d3c:0x1e [from client]

Payload

Subtype (u32)

Always 0x1e.

__unknown_1 (u32)

__server_unknown__1

Type: 0xf754c8fe:0x01 [from server]

This packet type has been confirmed to exist. Every example so far has an empty payload.

Payload

Subtype (u32)

Always 0x01.

__server_unknown__2

Type: 0xf754c8fe:0x07 [from server]

This packet type has been observed, and its payload structure is believed to be understood. However, its function has not determined with certainty. Contains three floats which seem to correspond to map coordinates of ships with special abilities. Could relate to cloak/decloak graphical effects.

Payload

Subtype (u32)

Always 0x07.

X Coordinate (float)

Y Coordinate (float)

Z Coordinate (float)

__server_unknown__3

Type: 0xf754c8fe:0x08 [from server]

This packet type has been observed, and its payload structure is believed to be understood. However, its function is as of yet completely unknown. Has been hypothesized as having some relation to SoundEffectPacket.

Payload

Subtype (u32)

Always 0x08.

__unknown_1 (float)

Values of 0.0, 50.0 and 100.0 has been observed. It is unclear if other values have been observed.

__server_unknown__4

Type: 0xf754c8fe:0x13 [from server]

This packet type has been observed, and its payload structure is believed to be understood. However, its function is as of yet completely unknown. Seems to happen immediately before DestroyObject(Mine, objID) or DestroyObject(Torpedo, objID). Speculated to have some relation to detonations.

Payload

Subtype (u32)

Always 0x13.

__unknown_1 (u32)

Only the value 7 has been observed so far. Unknown function or significance.

Object Id (u32)

In the observed packets, the object ids correspond to a mixture of torpedos and mines, destroyed in the very next packet.

A

ActivateUpgradePacket

Type: 0x4c821d3c:0x1c [from client]

This packet is sent whenever a client wishes to activate a ship upgrade from the "upgrades" menu.

Payload

Subtype (u32)

Always 0x1c.

Target (enum UpgradeActivation as u32)

The upgrade to activate. The game supports 28 different types of powerups, but only 8 are activated abilities. The others are all passive abilities, that are simple active on any ship that has them.

AllShipSettingsPacket

Type: 0xf754c8fe:0x0f [from server]

Provides the list of available player ships.

Payload

Subtype (u32)

Always 0x0f.

Ships (struct Ship array (length 8))

A list of the eight available player ships.

AudioCommandPacket

Type: 0x6aadc57f [from client]

Instructs the server to play or dismiss an audio message.

Payload

Audio Id (i32)

The ID for the audio message. This is given by the IncomingAudioPacket.

Audio Command (enum AudioCommand as u32)

The desired action to perform.

B

BeamFiredPacket

Type: 0xb83fd2c4 [from server]

Notifies the client that a beam weapon has been fired.

Payload

Id (i32)

A unique identifier for this beam. Each time a beam is fired, it gets its own ID.

__unknown_1 (u32)

In single-bridge games, this value has been observed as 0 for beams fired by enemies and 1 for beams fired by the player's ship.

__unknown_2 (u32)

Values of 1200 (for beams from the player's ship) and 100 (for enemy beams) have been observed.

Beam Port Index (i32)

All ships that can fire beams have beam ports. These are defined in vesselData.xml as <beam_port> entries. This value gives the index of the beam port on the originating ship that fired the beam. This value is zero-based; thus, vessels that only have one beam port will always give 0 for this value.

Origin Object Type (i32)

Indicates the type of object that fired the beam.

Target Object Type (i32)

Indicates the type of object that was struck by the beam.

__unknown_3 (u32)

This field is present in v2.3 and later. A value of 0 has been observed.

Origin Object Id (u32)

The ID of the object that fired the beam.

Target Object Id (u32)

The ID of the object that was struck by the beam.

Target X Coordinate (float)

The X coordinate (relative to the center of the target) of the impact point. This is used to determine the endpoint for the beam. A negative value means an impact on the target's starboard (right) side; a positive value means an impact on the target's port (left) side.

Target Y Coordinate (float)

The Y coordinate (relative to the center of the target) of the impact point. This is used to determine the endpoint for the beam. A negative value means an impact on the target's ventral (bottom) side; a positive value means an impact on the target's dorsal (top) side.

Target Z Coordinate (float)

The Z coordinate (relative to the center of the target) of the impact point. This is used to determine the endpoint for the beam. A negative value means an impact on the target's aft (rear) side; a positive value means an impact on the target's forward (front) side.

Targeting Mode (u32)

Indicates whether the beam was auto- or manually-fired.

C

CaptainSelectPacket

Type: 0x4c821d3c:0x11 [from client]

Notifies the server that a new target has been selected on the captain's map.

Payload

Subtype (u32)

Always 0x11.

Target Id (i32)

The object ID for the new target, or 1 if the target has been cleared.

ClimbDivePacket

Type: 0x4c821d3c:0x1b [from client]

Causes the ship to climb or dive. This differs from HelmSetPitchPacket in that it indicates a direction in which to change the ship's current pitch, rather than setting a precise pitch value. The circumstances in which one type of packet might be sent versus the other are not fully understood at this time.

Payload

Subtype (u32)

Always 0x1b.

Direction (i32)

Indicates the change in the ship's direction: 0x00000001 (1) for down, 0xffffffff (-1) for up. For example, if the ship is diving when the instruction to go up is received, the ship will level out. If a second up command is received, the ship will start climbing.

CommsIncomingPacket

Type: 0xd672c35f [from server]

Contains a single incoming text message to display at the COMMS station.

Payload

Channel (i32)

Indicates the channel on which the message was received. Values range from 0x00 to 0x08. In the stock client, this affects the message's background color; the lower the channel number, the more red the background color. While this would seem to indicate priority, in practice, the channel number doesn't seem to correlate with message importance. Below is a list of message types received on each channel; note that this list may be incomplete and custom scenarios may send messages on any channel: 0x00 = Enemy taunts 0x01 = ? 0x02 = ? 0x03 = Base destroyed 0x04 = Base is under attack, docking complete, ship refuses orders 0x05 = Base acknowledges build order or docking request 0x06 = Ship accepts orders, base status response, ordnance built notice, GM message 0x07 = Mission notification, mission transfer complete 0x08 = Messages sent from player ships

Sender (string)

The name of the entity that sent the message. Note that this does not necessarily correspond to the exact name of that entity. This field appears to always at least start with the name of the originating ship or station in non-scripted missions, but may have additional text afterward (e.g. “DS3 TSN Base”). Custom missions could have any string in this field.

Message (string)

The contents of the incoming message. The carat symbol (^) in the message indicates a line break.

CommsOutgoingPacket

Type: 0x574c4c4b [from client]

Sends a COMMs message to the server.

Payload

Comm Target Type (i32)

The type of target for the message.

Recipient Id (i32)

ID of the object that is to receive the message.

Message (i32)

A value that indicates what message is to be transmitted. The interpretation of the value depends on the COMM target type.

Target Object Id (u32)

The ID of the object to be targeted by the message. Currently, the only message that accepts a target is “Other ship: Go defend [target].” This value will be ignored if the message cannot support a target, but must still be provided; the value 0x00730078 has been observed in this case, but it is unknown why.

__unknown1 (u32)

Possibly reserved for a second message argument. It is always ignored but must still be provided. The value of 0x004f005e has been observed for this field, but it is unknown why.

ConsoleStatusPacket

Type: 0x19c6e2d4 [from server]

Indicates that a change has occurred in the availability status of one or more bridge consoles.

Payload

Ship Number (i32)

The number of the ship whose consoles are being described. Before v2.3.0, this value was one-based, so by default the ship identified by 0x01 was Artemis. As of v2.3.0 it is now zero-based.

Console Status (Type)

This array contains one element for each possible console, with the availability status of each console represented with a single byte. The consoles are iterated in the order given by the console type enumeration. Note that the helm, weapons, engineering, and game master stations permit only one client to claim them. Once they've been claimed, their status will be reported as unavailable to other clients. All other stations will remain available to other clients when claimed.

ConvertTorpedoPacket

Type: 0x69cc01d9:0x03 [from client]

Converts a homing torpedo to energy or vice versa.

Payload

Subtype (u32)

Always 0x03.

Direction (float)

Indicates whether we are converting a torpedo to energy (0.0, 0x00000000) or energy to a torpedo (1.0, 0x3f800000). Why this is expressed as a float when a byte seems like it would be more appropriate is unknown.

__unused_1 (u32)

padding, because this packet is of type "valueFourInts"

__unused_2 (u32)

padding, because this packet is of type "valueFourInts"

__unused_3 (u32)

padding, because this packet is of type "valueFourInts"

D

DestroyObjectPacket

Type: 0xcc5a3e30 [from server]

Notifies the client that an object has been removed from play.

Payload

Object Type (enum ObjectType as u8)

Indicates the type of object being destroyed.

Object Id (u32)

The ID of the object being destroyed.

DestroyObject2Packet

Type: 0xf754c8fe:0x00 [from server]

In earlier versions, sent when the simulation starts, but this appears to have been discontinued as of v2.1.1. Starting in v2.3, this packet indicates that an object was destroyed.

Payload

Subtype (u32)

Always 0x00.

Object Type (enum ObjectType as u32)

The type of object destroyed.

Object Id (u32)

The ID of the object destroyed.

DifficultyPacket

Type: 0x3de66711 [from server]

Informs clients of the difficulty level when starting or connecting to a game.

Payload

Difficulty (i32)

The difficulty level (a value from 1 to 11).

Game Type (enum GameType as u32)

A value indicating the type of game. This applies only to solo and co- op games; the field is present but its value is undefined for PvP and scripted games.

DmxMessagePacket

Type: 0xf754c8fe:0x10 [from server]

Sends DMX messages. This packet is only sent to main screen consoles for ships other than the first.

Payload

Subtype (u32)

Always 0x10.

Name (string)

The DMX flag name.

State (bool32)

The DMX flag's current state.

E

EngAutoDamconUpdatePacket

Type: 0xf754c8fe:0x0b [from server]

Informs the client of changes to DAMCON team autonomy status. Triggered by the "Autonomous" button in the engineering console.

Payload

Subtype (u32)

Always 0x0b.

Damcon Autonomy (bool32)

Whether DAMCON teams are directed autonomously or not.

EngGridUpdatePacket

Type: 0x077e9f3c [from server]

Updates damage to the various system grids on the ship and DAMCON team locations and status.

Payload

Requested (bool8)

Requested: This field is false on normal engineering update from the server, but will be set to 1 when in response to the RequestEngGridUpdate packet.

System Grid Status (array of struct SystemNodeStatus, terminated by 0xff)

This array contains information on all system nodes

Damcon Team Status (array of struct DamconTeamStatus, terminated by 0xfe)

This array contains information on all DAMCON teams

EngRequestGridUpdatePacket

Type: 0x4c821d3c:0x19 [from client]

Sent from the engineering station, to request a full update for all values. This causes the server to send a full update, instead of the normal update type where only changes are sent.

Payload

Subtype (u32)

Always 0x19.

__unused (u32)

Always 0.

EngSendDamconPacket

Type: 0x69cc01d9:0x04 [from client]

Directs a DAMCON team to go to a particular grid location on the ship.

Payload

Subtype (u32)

Always 0x04.

Team Number (i32)

The number assigned to the team (0 to 2 inclusive).

X Coordinate (i32)

The X coordinate of the grid location that is the team's destination.

Y Coordinate (i32)

The Y coordinate of the grid location that is the team's destination.

Z Coordinate (i32)

The Z coordinate of the grid location that is the team's destination.

EngSetAutoDamconPacket

Type: 0x4c821d3c:0x0c [from client]

Notifies the server that DAMCON team autonomy has been togged on/off.

Payload

Subtype (u32)

Always 0x0c.

Autonomous (bool32)

Indicates whether DAMCON team autonomy is on or off.

EngSetCoolantPacket

Type: 0x69cc01d9:0x00 [from client]

Sets the amount of coolant to be allocated to a system.

Payload

Subtype (u32)

Always 0x00.

Ship System (enum ShipSystem as u32)

The system whose coolant level is being adjusted.

Value (i32)

The number of coolant units to allocate to the system (0 to 8 inclusive).

__unused_1 (u32)

padding, because this packet is of type "valueFourInts"

__unused_2 (u32)

padding, because this packet is of type "valueFourInts"

EngSetEnergyPacket

Type: 0x0351a5ac:0x04 [from client]

Sets the amount of energy to be allocated to a system.

Payload

Subtype (u32)

Always 0x04.

Value (float)

The amount of energy to allocate to the system. This value can range from 0.0 to 1.0 inclusive, which in the stock UI corresponds to 0% to 300%. Therefore, the default energy allocation of 100% would be represented as 0.333....

Ship System (enum ShipSystem as u32)

The system whose coolant level is being adjusted.

F

FighterBayStatusPacket

Type: 0x9ad1f23b [from server]

Updates the client of the current status of the ship's fighter bays.

Payload

Status (array of struct FighterBay, terminated by 0x00000000)

The payload consists of an array of structs, each one describing a single fighter, and terminated with 0x00000000.

FighterLaunchPacket

Type: 0x4c821d3c:0x1d [from client]

Notifies the server that a fighter is being launched. The server will send back a FighterLaunchedPacket in response.

Payload

Subtype (u32)

Always 0x1d.

Object Id (u32)

The ID of the fighter, as shown in FighterBayStatusPacket.

FighterLaunchedPacket

Type: 0xf754c8fe:0x17 [from server]

Notifies the client that a fighter was just launched.

Payload

Subtype (u32)

Always 0x17.

Object Id (u32)

The ID of the fighter, as shown in FighterBayStatusPacket.

FireBeamPacket

Type: 0xc2bee72e [from client]

Notifies the server that the weapons officer wants to manually fire beam weapons.

Payload

Target Object Id (u32)

The ID of the ship or entity at which to fire.

X Coordinate (float)

The X coordinate at which to fire, relative to the center of the target ship.

Y Coordinate (float)

The Y coordinate at which to fire, relative to the center of the target ship.

Z Coordinate (float)

The Z coordinate at which to fire, relative to the center of the target ship.

FireTubePacket

Type: 0x4c821d3c:0x08 [from client]

Notifies the server that the weapons officer wants to fire whatever's loaded in a certain tube.

Payload

Subtype (u32)

Always 0x08.

Tube Index (u32)

The index number of the tube to fire.

G

GameMasterButtonClickPacket

Type: 0x4c821d3c:0x15 [from client]

New as of v2.4.0. Sent by the client when the game master clicks on a button created by GameMasterButtonPacket.

Payload

Subtype (u32)

Always 0x15.

__unknown_1 (u32)

Appears to always be 0x0d.

Hash (u32)

The JamCRC32 hash value of the button title. This is also used as an identifier for the button

GameMasterButtonCreatePacket

Type: 0x26faacb9:0x01 [from server]

Payload

Subtype (u8)

Always 0x01.

Label (string)

GameMasterButtonCreatePlacePacket

Type: 0x26faacb9:0x02 [from server]

Payload

Subtype (u8)

Always 0x02.

Label (string)

Button text

Width (u32)

Height (u32)

X (u32)

x coordinate from the top left corner

Y (u32)

y coordinate from the top left corner

GameMasterButtonDestroyPacket

Type: 0x26faacb9:0x00 [from server]

Payload

Subtype (u8)

Always 0x00.

Label (string)

GameMasterButtonResetPacket

Type: 0x26faacb9:0x64 [from server]

Payload

Subtype (u8)

Always 0x64.

GameMasterInstructionsPacket

Type: 0x26faacb9:0x63 [from server]

Sent by the server to the game master console to provide instructions to be displayed on request.

Payload

Subtype (u8)

Always 0x63.

Title (string)

A title to display above the instructions.

Content (string)

The body content for the help screen.

GameMasterMessagePacket

Type: 0x809305a7:0x01 [from client]

New as of v2.4.0. A packet sent by the game master console to the server which causes a message to be displayed on a client.

Payload

Subtype (u32)

Always 0x01.

__unknown_1 (u32)

FIXME: perhaps ship_index?

Console Type (Type

If this value is 0x00, the message is received by the communications officer as a normal COMM message. Otherwise, it is sent as a popup message at a particular console type. The console that receives the message is determined by subtracting 1 from the value; the result then matches the values for the console type enumeration.

Sender (string)

The name of the message's sender. This can be any arbitrary string; it doesn't have to match the name of an existing object.

Message (string)

The message to send.

GameMasterSelectLocationPacket

Type: 0x0351a5ac:0x06 [from client]

Notifies the server that a new target has been selected on the game master's map.

Payload

Subtype (u32)

Always 0x06.

Z Coordinate (float)

The coordinate of the selected location on the Z axis.

Y Coordinate (float)

Seems to always be `0x00000000`.

X Coordinate (float)

The coordinate of the selected location on the X axis.

GameMasterSelectObjectPacket

Type: 0x4c821d3c:0x12 [from client]

Notifies the server that a new target has been selected on the game master's map.

Payload

Subtype (u32)

Always 0x12.

Target Id (i32)

ID of the selected object.

GameMessagePacket

Type: 0xf754c8fe:0x0a [from server]

Contains a message to be displayed on the screen. The stock client displays the message in a &ldquo;popup&rdquo; box in the lower-right corner.

Payload

Subtype (u32)

Always 0x0a.

Message (string)

The message to display.

GameOverPacket

Type: 0xf754c8fe:0x06 [from server]

Informs the client that the game is over. Transmitted when the "End Game" button on the statistics page is clicked.

Payload

Subtype (u32)

Always 0x06.

GameOverReasonPacket

Type: 0xf754c8fe:0x14 [from server]

Provides the reason why the game ended.

Payload

Subtype (u32)

Always 0x14.

Reason (array of string)

Text describing why the game ended. Each string is one line.

GameOverStatsPacket

Type: 0xf754c8fe:0x15 [from server]

Provides endgame statistics.

Payload

Subtype (u32)

Always 0x15.

Column Index (u8)

Stats are presented in vertical columns; each packet contains one column of stats data. This fields is the index for this column of data. In practice, there are only two possible values: 0 and 1.

Statistics (array of struct Statistic, terminated by 0xce)

The remaining bytes in the packet are an array, where each element constitutes a row in the stats column. The last element is followed by 0xce.

H

HeartbeatPacket

Type: 0xf5821226 [from server]

Payload

HelmJumpPacket

Type: 0x0351a5ac:0x05 [from client]

Initiates a jump. Note that the stock client molly-guards jumps, asking for confirmation from helm. This packet isn't sent until helm confirms the jump.

Payload

Subtype (u32)

Always 0x05.

Bearing (float)

The direction to jump, expressed as a value between 0.0 and 1.0 inclusive. To compute this value, take the desired bearing in degrees and divide by 360.

Distance (float)

The distance to jump, expressed as a value between 0.0 and 1.0 inclusive. To compute this value, take the desired distance in μls and divide by 50 (the maximum jump distance).

HelmRequestDockPacket

Type: 0x4c821d3c:0x07 [from client]

Request docking with the nearest station, or, in the case of a fighter, with its mothership.

Payload

Subtype (u32)

Always 0x07.

__unknown_1 (u32)

Always 0x00.

HelmSetImpulsePacket

Type: 0x0351a5ac:0x00 [from client]

Sets the throttle for impulse engines.

Payload

Subtype (u32)

Always 0x00.

Throttle (float)

Any value between 0.0 and 1.0 inclusive, where 0.0 is no throttle and 1.0 is full throttle. Actual velocity will depend on the ship's maximum velocity and the power allocated to impulse by engineering.

HelmSetPitchPacket

Type: 0x0351a5ac:0x02 [from client]

Sets the desired pitch for the player ship. This differs from ClimbDivePacket in that it sets a precise pitch value for the ship instead of just indicating a direction to change pitch. The circumstances in which one type of packet might be sent versus the other are not fully understood at this time.

Payload

Subtype (u32)

Always 0x02.

Pitch (float)

Any value between -1.0 and 1.0 inclusive, where 0.0 is level, -1.0 is a hard climb, and 1.0 is a hard dive.

HelmSetSteeringPacket

Type: 0x0351a5ac:0x01 [from client]

Sets the position of the ship's "rudder", controlling its turn rate.

Payload

Subtype (u32)

Always 0x01.

Rudder (float)

Any value between 0.0 and 1.0 inclusive, where 0.0 is hard to port (left), 0.5 is rudder amidships (straight), and 1.0 is a hard to starboard (right). Actual turn rate will depend on the ship's maximum turn rate and the power allocated to maneuvering by engineering.

HelmSetWarpPacket

Type: 0x4c821d3c:0x00 [from client]

Sets the ship's warp factor. Actual velocity will depend on the power allocated to warp by engineering.

Payload

Subtype (u32)

Always 0x00.

Warp Factor (i32)

The desired warp factor, from 0 to 4 inclusive. Warp 0 means to drop out of warp and move on impulse only.

HelmToggleReversePacket

Type: 0x4c821d3c:0x18 [from client]

Toggles the impulse engines between forward and reverse drive.

Payload

Subtype (u32)

Always 0x18.

__unused_1 (u32)

Always 0x00.

I

IncomingAudioPacket

Type: 0xae88e058 [from server]

Informs the client of incoming audio messages (used in custom scenarios).

Payload

Audio Id (i32)

The ID for this audio message.

Audio Mode (enum AudioMode as u32)

“Incoming” means that the communications officer is to be notified that an audio message is available, and offered the option to play or dismiss it. “Playing” is given in response to the communications officer giving the instruction to play the message, and notifies them that the message is now being played by the main screen. In the stock client, this results in the “Play” button changing to “REPlay.” (sic)

Title (Type

Title of the incoming message. This should be displayed to the COMMs officer. (incoming mode only)

File (Type

The filename for the audio clip. The client doesn't need to do anything with this string; as the audio is played by the server. (incoming mode only)

IntelPacket

Type: 0xee665279 [from server]

Contains intel about another ship. Intel on allied ships (and biomechs, for some reason) is sent right away. Intel for enemy ships is sent after undergoing a level 2 scan. Theoretically, the intel should only need to be sent once, but the game re-transmits known intel periodically.

Payload

Object Id (u32)

The ID of the ship to which this intel pertains.

__unknown_1 (u8)

Values of 0 and 1 have been observed

Intel (string)

The intel message about the ship. This is displayed to the science officer when selecting this ship.

J

JumpStatusBeginPacket

Type: 0xf754c8fe:0x0c [from server]

Notifies the client that a jump has started.

Payload

Subtype (u32)

Always 0x0c.

JumpStatusEndPacket

Type: 0xf754c8fe:0x0d [from server]

Notifies the client that a jump has completed.

Payload

Subtype (u32)

Always 0x0d.

K

KeyCaptureTogglePacket

Type: 0xf754c8fe:0x11 [from server]

Sent to all consoles when key capture is enabled or disabled for any console.

Payload

Subtype (u32)

Always 0x11.

Capture (bool8)

Whether this console should capture keystrokes or not. Note that because this packet is sent to all consoles when the capture status of any console is changed, a console may get a KeyCaptureTogglePacket telling it to do what it's already doing; this is normal.

KeystrokePacket

Type: 0x4c821d3c:0x14 [from client]

Informs the server that the player at this console pressed a particular key. This is used for custom mission scripts to allow keystrokes to trigger events. This packet should only be sent when keystroke capture is enabled for the console in question. Keystroke capture is always enabled for the game master console; other consoles require the script to activate keystroke capture first.

Payload

Subtype (u32)

Always 0x14.

Key Code (i32)

The code identifying the key that was pressed. Microsoft has a good reference page that documents the key codes. Many languages have constants for these values. For example: in Java, they are defined in the KeyEvent class.

L

LoadTubePacket

Type: 0x69cc01d9:0x02 [from client]

Loads a tube with a particular type of ordnance.

Payload

Subtype (u32)

Always 0x02.

Tube Index (i32)

Indicates which tube is to be loaded.

Ordnance Type (enum OrdnanceType as u32)

The type of ordnance to load into the tube.

__unknown_1 (u32)

__unknown_2 (u32)

O

ObjectUpdatePacket

Type: 0x80803df9 [from server]

Updates the status of one or more objects in the game world. Each type of object update has its own encoding within this package, which makes this packet both the single most important server packet type, as well as the most complicated one to implement.

Whereas other packet types that have many subtypes (for example, 0x4c821d3c) are documented for each subtype, that is not possible for this packet type, since it can contain more than one object update type in each packet.

Note: The official Artemis server always seems to send objects of only one type in a single packet. If other types of objects need to be updated, they'll be transmitted in separate packets. However, keep in mind that the protocol does not require this, so it might change in the future.

Payload

The payload consists of an array of object update entries. Parsing continues in a loop until the end of the packet is reached, or the object type byte is 0x00. Note that the array may be empty. Each entry in the array is structured as follows:

Object type (byte, enumeration)

The type of object represented by this entry. All objects in the same array will be of the same type. If you get 0x00 for this field, there are no more objects in the array.

In earlier protocol versions, this property was transmitted as an int rather than a byte. At least version 2.1.1 and onwards use the single byte encoding, but it is not verified if version 2.1.1 is the first version to do so.

Object ID (int)

A unique identifier assigned to this object.

Bit field (variable length)

In order to minimize the amount of data that has to be transmitted, the server typically only sends the properties that have changed instead of the entire object every time. This bit field indicates which properties are included in the update. Each bit represents a single property; if a bit is set to 1, that property is included. The length of the bit field depends the number of properties the object has.

Properties (variable length)

The rest of the entry consists of the updated values for the properties indicated in the bit field.

For details about the properties of the various object types which may be included in the array entries, see the Object Properties section.

P

PausePacket

Type: 0xf754c8fe:0x04 [from server]

Sent by the server when the simulation is paused or resumed.

Payload

Subtype (u32)

Always 0x04.

Paused (bool32)

True if the simulation is paused; false otherwise.

PerspectivePacket

Type: 0xf754c8fe:0x12 [from server]

Sent by the server when the main viewscreen perspective has changed.

Payload

Subtype (u32)

Always 0x12.

Perspective (enum Perspective as u32)

The current main screen perspective.

PlayerShipDamagePacket

Type: 0xf754c8fe:0x05 [from server]

Appears to be sent when the player ship is hit by enemy fire. Has been observed when fired upon by enemy beams. Information about this packet is still uncertain and the documentation for it should not be considered reliable at this time.

Payload

Subtype (u32)

Always 0x05.

__unknown_1 (u32)

Value of 1 observed.

__unknown_2 (float)

Appears to have values of 1.0 or less for hits against shields, and values greater than 1.0 and less than or equal to 2.0 for hits that pass through the shields and strike the hull.

R

ReadyPacket

Type: 0x4c821d3c:0x0f [from client]

Sent by the client when they click the "Ready" button to indicate that it is ready to join the game. The client must select at least one station before sending this packet. When a game ends, the stock client typically sends this packet again immediately, on the assumption that they will play again with the same console(s).

Payload

Subtype (u32)

Always 0x0f.

__unused (u32)

Always 0.

S

SciScanPacket

Type: 0x4c821d3c:0x13 [from client]

Starts a science scan.

Payload

Subtype (u32)

Always 0x13.

Target Id (i32)

The object ID for the target to be scanned.

SciSelectPacket

Type: 0x4c821d3c:0x10 [from client]

Notifies the server that a new target has been selected on the science map.

Payload

Subtype (u32)

Always 0x10.

Target Id (i32)

The object ID for the new target, or 1 if the target has been cleared.

SetBeamFreqPacket

Type: 0x4c821d3c:0x0b [from client]

Sets the beam frequency.

Payload

Subtype (u32)

Always 0x0b.

Beam Frequency (enum BeamFrequency as u32)

The new beam frequency.

SetConsolePacket

Type: 0x4c821d3c:0x0e [from client]

Sets whether or not this client will use a particular console. A single client may use multiple consoles, and some consoles allow multiple clients to use them. Clients should send SetShipPacket before sending this one.

Payload

Subtype (u32)

Always 0x0e.

Console Type (enum ConsoleType as u32)

The console whose status is being updated.

Selected (bool32)

True if this client is using the indicated console, false otherwise.

SetMainScreenPacket

Type: 0x4c821d3c:0x01 [from client]

Sets the view to display on the main screen.

Payload

Subtype (u32)

Always 0x01.

Main Screen View (enum MainScreenView as u32)

The view to display on the main screen.

SetShipPacket

Type: 0x4c821d3c:0x0d [from client]

Sets which ship the client will be on. This should be sent before SetConsolePacket.

Payload

Subtype (u32)

Always 0x0d.

Ship Index (i32)

The index of the desired ship; valid values are 0 through 7 inclusive.

SetShipSettingsV211Packet

Type: 0x4c821d3c:0x16 [from client]

Sets the name, ship type and drive type for the currently-selected ship. (version 2.1.0 up to 2.3.0)

Payload

Subtype (u32)

Always 0x16.

Ship (struct ShipV211)

SetShipSettingsV240Packet

Type: 0x4c821d3c:0x17 [from client]

Sets the name, ship type and drive type for the currently-selected ship. (version 2.4.0+)

Payload

Subtype (u32)

Always 0x17.

Ship (struct Ship)

SetWeaponsTargetPacket

Type: 0x4c821d3c:0x02 [from client]

Notifies the server that a new target has been selected on the weapons console.

Payload

Subtype (u32)

Always 0x02.

Target Id (i32)

The object ID for the new target, or 1 if the target has been cleared.

SkyboxPacket

Type: 0xf754c8fe:0x09 [from server]

Sent to change the displayed skybox image on the client. The server will send this packet at the start of a mission. The server will also send it any time a custom script instructs it to do so, but instead of sending the skybox index specified by the script, it will always send <code>0x0a</code> instead. This may be a bug in the Artemis server.

Payload

Subtype (u32)

Always 0x09.

Skybox Id (i32)

The number of the skybox image to load on the client. Under the Artemis install directory is an "art" folder; this folder contains a bunch of subfolders whose names start with "sb" followed by a two- digit decimal value. This value is the skybox ID, and each folder contains image files for a single skybox. The stock install of Artemis has skybox images for IDs 00 through 05 and 10 through 29. It is presumed but not yet confirmed that other skybox IDs will work if a corresponding folder is created and contains the appropriate files.

SoundEffectPacket

Type: 0xf754c8fe:0x03 [from server]

Causes the client to play a sound effect file.

Payload

Subtype (u32)

Always 0x03.

Filename (string)

Path to the file to play the sound effect from, e.g "dat/enemy-explode.wav".

T

ToggleAutoBeamsPacket

Type: 0x4c821d3c:0x03 [from client]

Informs the server that the auto beams setting has been toggled.

Payload

Subtype (u32)

Always 0x03.

__unused (u32)

Always 0.

TogglePerspectivePacket

Type: 0x4c821d3c:0x1a [from client]

Toggles between first- and third-person perspective on the main screen.

Payload

Subtype (u32)

Always 0x1a.

__unused (u32)

Always 0.

ToggleRedAlertPacket

Type: 0x4c821d3c:0x0a [from client]

Toggles the ship's red alert status.

Payload

Subtype (u32)

Always 0x0a.

__unused (u32)

Always 0.

ToggleShieldsPacket

Type: 0x4c821d3c:0x04 [from client]

Toggles the shields up or down.

Payload

Subtype (u32)

Always 0x04.

__unused (u32)

Always 0.

U

UnloadTubePacket

Type: 0x4c821d3c:0x09 [from client]

Removes whatever ordnance is loaded in a tube.

Payload

Subtype (u32)

Always 0x09.

Tube Index (i32)

Index of the tube to unload.

V

VersionPacket

Type: 0xe548e74a [from server]

Gives the server version number. This packet is sent immediately after the WelcomePacket

Payload

__unknown_1 (u32)

Unknown function, but has been observed to follow the cycle "ec f0 e8 d4 d8 dc e0 e4"

Old Version (float)

The version of Artemis running on the server. If the client doesn't support the given version, it should disconnect. This field is deprecated as of v2.1; it is still sent by the server, but client should ignore its value unless there are no more bytes after it in the packet.

Version (u32 array (length 3))

These three int values constitute the major, minor and patch version numbers. For example, v2.1.1 will transmit 02000000 01000000 01000000 (interpreted 2 1 1) for this field. If the client doesn't support the given version, it should disconnect. The version specified in this field supersedes any specified in the legacy version field. It has been officially confirmed that the schema is <major>.<network>.<minor>. In other words, the 2 first digits should uniquely identify any protocol version.

W

WelcomePacket

Type: 0x6d04b3da [from server]

Indicates a successful connection to the Artemis server. This is the first packet sent upon connection.

Payload

Welcome Message (ascii string)

Unlike all other strings in Artemis packets, this one is encoded in plain ASCII, so each character is one byte, not two. Also, the given length for the string does not include a terminating null. Currently, it says, "You have connected to Thom Robertson's Artemis Bridge Simulator. Please connect with an authorized game client."

Object Properties

This section documents the bit fields and properties for each of the object types. See ObjectUpdatePacket for how these objects are updated by the Artemis server.

Anomaly

New as of v.2.1.5. Previously, anomalies were handled by the “other” property structure.

Bit field (1 byte)
X Coordinate (bit 1.1, float)
Y Coordinate (bit 1.2, float)
Z Coordinate (bit 1.3, float)
Upgrade (bit 1.4, enum Upgrade as u32)

Note that only the values 0x00 through 0x07 have been observed, as the built-in mission types do not put other upgrade types in anomaly pickups.

__unknown_1 (bit 1.5, u32)
__unknown_2 (bit 1.6, u32)
__unknown_3 (bit 1.7, u32)

Base

Bit field (2 bytes)
Name (bit 1.1, string)

The name assigned to this base. In standard, non-custom scenarios, base names will be unique, but there is no guarantee that the same will be true in custom scenarios.

Front Shields (bit 1.2, float)

The current strength of the base's shields.

Rear Shields (bit 1.3, float)

Bases only have one shield, but all shielded objects in Artemis are encoded with front and rear shields. This value is therefore meaningless and should be ignored.

Index (bit 1.4, u32)

The index of this base. Each base will have a unique index from 0 to (number of bases-1). In a standard solo game, DS1 is 0, DS2 is 1, etc.

Vessel Type Id (bit 1.5, u32)

The vessel type ID, as found in vesselData.xml.

X Coordinate (bit 1.6, float)

The base's location along the X-axis.

Y Coordinate (bit 1.7, float)

The base's location along the Y-axis.

Z Coordinate (bit 1.8, float)

The base's location along the Z-axis.

__unknown_1 (bit 2.1, u32)
__unknown_2 (bit 2.2, u32)
__unknown_3 (bit 2.3, u32)
__unknown_4 (bit 2.4, u32)
__unknown_5 (bit 2.5, u8)
__unknown_6 (bit 2.6, u8)

Creature

Note that wrecks are also considered creatures, for some reason. This structure is new as of v2.1.5. Previously, the only type of creature was the classic space monster, which was handled by the “other” property structure, and space whales had their own structure.

Bit field (3 bytes)
X Coordinate (bit 1.1, float)

The X coordinate of this creature.

Y Coordinate (bit 1.2, float)

The Y coordinate of this creature.

Z Coordinate (bit 1.3, float)

The Z coordinate of this creature.

Name (bit 1.4, string)

The creature's name

Heading (bit 1.5, float)

The creature's current heading.

Pitch (bit 1.6, float)

The creature's current pitch.

Roll (bit 1.7, float)

The creature's current roll.

Creature Type Id (bit 1.8, enum CreatureType as u32)

The type of creature. FIXME: size?

__unknown_1 (bit 2.1, u32)
__unknown_2 (bit 2.2, u32)
__unknown_3 (bit 2.3, i32)
__unknown_4 (bit 2.4, i32)
__unknown_5 (bit 2.5, i32)
__unknown_6 (bit 2.6, i32)
__unknown_7 (bit 2.7, i32)
__unknown_8 (bit 2.8, i32)
__unknown_9 (bit 3.1, i32)
__unknown_10 (bit 3.2, i32)

Drone

Bit field (2 bytes)
__unknown_1 (bit 1.1, u32)
X Coordinate (bit 1.2, float)
__unknown_2 (bit 1.3, float)

Values observed range from approximately -0.01 to 53.7. Might be related to pitch/yaw.

Z Coordinate (bit 1.4, float)
__unknown_3 (bit 1.5, float)

Perhaps related to pitch/yaw.

Y Coordinate (bit 1.6, float)
Heading (bit 1.7, float)
__unknown_4 (bit 1.8, u32)
__unknown_5 (bit 2.1, u32)

Engineering Console

Each byte of the field represents a category of values: Heat levels Energy allocations Coolant allocations

Bit field (4 bytes)
Heat (float array (length 8))

The bits in each byte represent the ship systems, in the order specified in the ship system enumeration. So for example, if the first bit field is 0x01, it means that this packet will contain a single heat level value (beams).

Energy (float array (length 8))

The heat level for each system, as a value between 0 (no heat) and 1 (maximum heat). Reaching maximum heat for a system will cause an explosion, which will damage a system node of that type and release some of the heat.

Coolant (u8 array (length 8))

The energy allocation for each system, as a value between 0 (no energy allocated) and 1 (maximum possible energy allocation). In the UI, this is expressed as a percentage between 0% and 300%, so the nominal allocation level (100%) is represented by a value of 0.3333....

Generic Mesh

These are arbitrary 3D objects to display in the game world. Players and enemies don't interact with these objects; they are just decoration.

Bit field (4 bytes)
X Coordinate (bit 1.1, float)

The object's location on the X axis.

Y Coordinate (bit 1.2, float)

The object's location on the Y axis.

Z Coordinate (bit 1.3, float)

The object's location on the Z axis.

__unknown_1 (bit 1.4, u32)
__unknown_2 (bit 1.5, u32)
__unknown_3 (bit 1.6, u64)
__unknown_4 (bit 1.7, u32)
__unknown_5 (bit 1.8, u32)
__unknown_6 (bit 2.1, u32)
__unknown_7 (bit 2.2, u64)
Name (bit 2.3, string)

The name of this object.

Mesh File (bit 2.4, string)

The name of the file containing the 3D mesh data.

Texture File (bit 2.5, string)

The name of the file containing the texture to apply to the mesh. Note that this uses the same bit as the mesh name, and that bit 2.5 is unused.

__unknown_8 (bit 2.6, u32)
__unknown_9 (bit 2.7, u16)
__unknown_10 (bit 2.8, u8)
R Color (bit 3.1, float)

Red color channel (bit 3.1, float)

G Color (bit 3.2, float)

Green color channel (bit 3.2, float)

B Color (bit 3.3, float)

Blue color channel (bit 3.3, float)

Front Shields (bit 3.4, float)

Front shields (bit 3.4, float)

Rear Shields (bit 3.5, float)

Rear shields (bit 3.5, float)

__unknown_11 (bit 3.6, u32)
__unknown_12 (bit 3.7, u32)
__unknown_13 (bit 3.8, u32)
__unknown_14 (bit 4.1, u32)
__unknown_15 (bit 4.2, u32)

Nebula

Bit field (1 byte)
X Coordinate (bit 1.1, float)
Y Coordinate (bit 1.2, float)
Z Coordinate (bit 1.3, float)
R Color (bit 1.4, float)

Red color channel (bit 1.4, float)

G Color (bit 1.5, float)

Green color channel (bit 1.5, float)

B Color (bit 1.6, float)

Blue color channel (bit 1.6, float)

__unknown_1 (bit 1.7, u32)
__unknown_2 (bit 1.8, u32)

Npc Ship

Bit field (6 bytes)
Name (bit 1.1, string)

The ship's name.

Throttle (bit 1.2, float)

Values range from 0.0 for all stop to 1.0 for full speed.

Rudder (bit 1.3, float)

Values range from 0.0 for hard to port (left), to 1.0 for hard to starboard (right).

Max Impulse (bit 1.4, float)

The ship's maximum possible speed at impulse.

Max Turn Rate (bit 1.5, float)

The ship's maximum possible turning speed.

Enemy (bit 1.6, u32)

In single-bridge games, as well as multi-bridge co-op games this value will be true if the ship is hostile and false if it is friendly. In PvP and scripted games, this field is always true, regardless of whether the NPC is hostile or not.

Vessel Type Id (bit 1.7, u32)

The ID corresponding to the <vessel> entry in vesselData.xml that describes the vessel type for this ship.

X Coordinate (bit 1.8, float)
Y Coordinate (bit 2.1, float)
Z Coordinate (bit 2.2, float)
Pitch (bit 2.3, float)
Roll (bit 2.4, float)
Heading (bit 2.5, float)
Velocity (bit 2.6, float)
Surrendered (bit 2.7, bool8)

True if this ship has surrendered; false otherwise.

__unknown_1 (bit 2.8, u16)
Front Shields (bit 3.1, float)
Front Shields Max (bit 3.2, float)
Rear Shields (bit 3.3, float)
Rear Shields Max (bit 3.4, float)
__unknown_2 (bit 3.5, u16)
Fleet Number (bit 3.6, u8)

The number of the fleet to which this ship belongs. For custom missions, this is specified in the mission file.

Elite Abilities (bit 3.7, EliteAbilities as u32)

The elite abilites posessed by this ship. The value in this field is only meaningful if the ship's faction has the “elite” attribute, as specified in vesselData.xml. Other ships should ignore this value even if it is present, as they cannot have elite abilities.

Active Elite Abilities (bit 3.8, EliteAbilities as u32)

The elite abilites posessed by this ship that are currently in use. As with the previous field, this field should be ignored if the ship can't have elite abilities, even if it is present.

Scan Level (bit 4.1, u32)
Side (bit 4.2, u32)

This field appears to contain a different value for each side in the conflict. Ships with the same value will presumably be friendly to each other.

__unknown_3 (bit 4.3, i32)
__unknown_4 (bit 4.4, u8)
__unknown_5 (bit 4.5, u8)
__unknown_6 (bit 4.6, u8)
__unknown_7 (bit 4.7, u8)
__unknown_8 (bit 4.8, float)

Values of 0.0 and -100000.0 have been observed.

__unknown_9 (bit 5.1, u32)
__unknown_10 (bit 5.2, u32)
System Damage (float array (length 8))

Damage to various ship systems, in the order specified in the enumeration. A system with a damage value of 0.0 is undamaged; a higher value (up to 1.0) means the system is damaged. In the stock client, damaged systems on NPC vessels can be seen via the science console. Barring further damage or actions by a custom script, damage values gradually decrease as the ship is repaired, until they return to 0.0.

Beam Resistance (float array (length 5))

The ship's resistance to the five beam frequencies. Higher values indicate greater resistance to beams tuned to the corresponding frequency.

Player Ship

5 bytes before v2.3.0

Bit field (6 bytes)
__unknown_1 (bit 1.1, u32)

This might be the ship targeted by the weapons console.

Impulse (bit 1.2, float)

Current impulse power for this ship. Values range from 0.0 (all stop) to 1.0 (full speed) inclusive.

Rudder (bit 1.3, float)

Values range from 0.0 to 1.0 inclusive, with 0.0 meaning hard to port (left), 0.5 meaning rudder amidships (straight), and 1.0 meaning hard to starboard (right).

Top Speed (bit 1.4, float)
Turn Rate (bit 1.5, float)
Auto Beams (bit 1.6, bool8)
Warp Factor (bit 1.7, u8)
Energy (bit 1.8, float)
Shields Up (bit 2.1, bool16)
Ship Number (bit 2.2, u32)
Ship Type (bit 2.3, u32)
X Coordinate (bit 2.4, float)

The ship's location on the X axis.

Y Coordinate (bit 2.5, float)

The ship's location on the Y axis.

Z Coordinate (bit 2.6, float)

The ship's location on the Z axis.

Pitch (bit 2.7, float)

(values still uncertain) Values range from -1.0 to 1.0 inclusive, where -1.0 means the port (left) side points straight “up” and 1.0 means it points straight “down.”

Roll (bit 2.8, float)

(values still uncertain) Values range from -1.0 to 1.0 inclusive, where -1.0 means straight “up” and 1.0 means straight “down.”

Heading (bit 3.1, float)

A value from pi to negative pi. A value of pi corresponds to a heading of 0° (or “north”). The ship turns to port (left) as the value decreases. A value of 0.0 corresponds to a heading of 180° (or “south”).

Velocity (bit 3.2, float)

FIXME: copy pasta A value from pi to negative pi. A value of pi corresponds to a heading of 0° (or “north”). The ship turns to port (left) as the value decreases. A value of 0.0 corresponds to a heading of 180° (or “south”).

__unknown_2 (bit 3.3, u16)
Ship Name (bit 3.4, string)
Front Shields (bit 3.5, float)

Current strength of forward shield. A value greater than 0.0 indicates that this shield is up, while a value of 0.0 or less means it's down. If enemy fire penetrates the shield, this value can go negative; it will climb back towards 0.0 as the shield recovers.

Front Shields Max (bit 3.6, float)

The maximum strength of the forward shield.

Rear Shields (bit 3.7, float)

Current strength of rear shield. A value greater than 0.0 indicates that this shield is up, while a value of 0.0 or less means it's down. If enemy fire penetrates the shield, this value can go negative; it will climb back towards 0.0 as the shield recovers.

Rear Shields Max (bit 3.8, float)

The maximum strength of the aft shield.

Last Docked Base (bit 4.1, u32)

The ID of the base that most recently initiated docking with the ship. This field updates when a base's tractor beam latches onto the ship. Undocking does not change this field; to detect undocking, watch for the ship's impulse (bit 1.2) or warp factor (bit 1.7) fields to go above zero.

Alert Status (bit 4.2, enum AlertStatus as u8)
__unknown_3 (bit 4.3, float)
Main Screen View (bit 4.4, enum MainScreenView as u8)

The view currently displayed on the ship's main screen.

Beam Frequency (bit 4.5, enum BeamFrequency as u8)

The frequency to which the beams are currently tuned.

Available Coolant (bit 4.6, u8)

The total amount of coolant if a capital ship, or the number of missiles if a fighter.

Science Target (bit 4.7, u32)

The ID of the object selected by the science officer, or 1 if the selection was cleared.

Captain Target (bit 4.8, u32)

The ID of the object selected by the captain, or 1 if the selection was cleared.

Drive Type (bit 5.1, u8)

The type of drive system the ship has.

Science Scan Id (bit 5.2, u32)

The ID of the object currently being scanned by the science officer.

Science Scan Progress (bit 5.3, float)

A value from 0.0 to 1.0 inclusive indicating the current progress of the active science scan.

Reverse (bit 5.4, bool8)

True if the impulse drive is in reverse; false otherwise.

__unknown_4 (bit 5.5, float)

Usually 0.0, though -1.0 has been observed.

__unknown_5 (bit 5.6, u8)

0x02 has been observed.

__unknown_6 (bit 5.7, u32)
__unknown_7 (bit 5.8, u8)

0 has been observed.

Capital Ship Id (bit 6.1, u32)

The object ID of the associated capital ship, if this ship is a fighter. new as of v2.3.0

Accent Color (bit 6.2, u32)

The accent color of the ship. new as of v2.4.0

__unknown_8 (bit 6.3, u32)

new as of v2.4.0

Player Ship Upgrades

New as of v2.1.5. Indicates how many of each upgrade the player ship has on board, which ones are active, and how many seconds are left of each type of activation. There are 28 upgrade types available, each of which are described in this packet type. First, every upgrade is described with an 8-bit boolean value. If this value is true, the upgrade is currently activated. Secondly, every upgrade is described with a i8 (signed 8-bit integer), that determines how many of that type of upgrade the ship has available. Finally, every upgrade is described with a u16, that determines how many more seconds the upgrade is active for.

Activation flags (bits 1.1-4.4, bool8)
(bit 1.1) active_infusion_p_coils
(bit 1.2) active_hydrogen_ram
(bit 1.3) active_tauron_focusers
(bit 1.4) active_carapaction_coils
(bit 1.5) active_polyphasic_capacitors
(bit 1.6) active_cetrocite_crystals
(bit 1.7) active_lateral_array
(bit 1.8) active_ecm_starpulse
(bit 2.1) active_double_agent
(bit 2.2) active_wartime_production
(bit 2.3) active_infusion_p_coils_perm
(bit 2.4) active_protonic_verniers
(bit 2.5) active_tauron_focusers_perm
(bit 2.6) active_regenerative_pau_grids
(bit 2.7) active_veteran_damcon_teams
(bit 2.8) active_cetrocite_heatsinks
(bit 3.1) active_tachyon_scanners
(bit 3.2) active_gridscan_overload
(bit 3.3) active_override_authorization
(bit 3.4) active_resupply_imperatives
(bit 3.5) active_patrol_group
(bit 3.6) active_fast_supply
(bit 3.7) active_vanguard_refit_helm
(bit 3.8) active_vanguard_refit_weap
(bit 4.1) active_vanguard_refit_comm
(bit 4.2) active_vanguard_refit_station
(bit 4.3) active_vanguard_refit_eng
(bit 4.4) active_vanguard_refit_systems
Available upgrades (bits 4.5-7.8, i8)
(bit 4.5) count_infusion_p_coils
(bit 4.6) count_hydrogen_ram
(bit 4.7) count_tauron_focusers
(bit 4.8) count_carapaction_coils
(bit 5.1) count_polyphasic_capacitors
(bit 5.2) count_cetrocite_crystals
(bit 5.3) count_lateral_array
(bit 5.4) count_ecm_starpulse
(bit 5.5) count_double_agent
(bit 5.6) count_wartime_production
(bit 5.7) count_infusion_p_coils_perm
(bit 5.8) count_protonic_verniers
(bit 6.1) count_tauron_focusers_perm
(bit 6.2) count_regenerative_pau_grids
(bit 6.3) count_veteran_damcon_teams
(bit 6.4) count_cetrocite_heatsinks
(bit 6.5) count_tachyon_scanners
(bit 6.6) count_gridscan_overload
(bit 6.7) count_override_authorization
(bit 6.8) count_resupply_imperatives
(bit 7.1) count_patrol_group
(bit 7.2) count_fast_supply
(bit 7.3) count_vanguard_refit_helm
(bit 7.4) count_vanguard_refit_weap
(bit 7.5) count_vanguard_refit_comm
(bit 7.6) count_vanguard_refit_station
(bit 7.7) count_vanguard_refit_eng
(bit 7.8) count_vanguard_refit_systems
Activation time (bits 8.1-11.4, u16)
(bit 8.1) time_infusion_p_coils
(bit 8.2) time_hydrogen_ram
(bit 8.3) time_tauron_focusers
(bit 8.4) time_carapaction_coils
(bit 8.5) time_polyphasic_capacitors
(bit 8.6) time_cetrocite_crystals
(bit 8.7) time_lateral_array
(bit 8.8) time_ecm_starpulse
(bit 9.1) time_double_agent
(bit 9.2) time_wartime_production
(bit 9.3) time_infusion_p_coils_perm
(bit 9.4) time_protonic_verniers
(bit 9.5) time_tauron_focusers_perm
(bit 9.6) time_regenerative_pau_grids
(bit 9.7) time_veteran_damcon_teams
(bit 9.8) time_cetrocite_heatsinks
(bit 10.1) time_tachyon_scanners
(bit 10.2) time_gridscan_overload
(bit 10.3) time_override_authorization
(bit 10.4) time_resupply_imperatives
(bit 10.5) time_patrol_group
(bit 10.6) time_fast_supply
(bit 10.7) time_vanguard_refit_helm
(bit 10.8) time_vanguard_refit_weap
(bit 11.1) time_vanguard_refit_comm
(bit 11.2) time_vanguard_refit_station
(bit 11.3) time_vanguard_refit_eng
(bit 11.4) time_vanguard_refit_systems

Torpedo

Bit field (2 bytes)
X Coordinate (bit 1.1, float)

The torpedo's location on the X axis.

Y Coordinate (bit 1.2, float)

The torpedo's location on the Y axis.

Z Coordinate (bit 1.3, float)

The torpedo's location on the Z axis.

__unknown_2 (bit 1.4, float)

Appears to range from -1.0 to 1.0.

__unknown_3 (bit 1.5, float)
__unknown_4 (bit 1.6, float)
__unknown_5 (bit 1.7, u32)
__unknown_6 (bit 1.8, u32)

Weapons Console

Bit field (4 bytes)
Homing (bit 1.1, u8)
Nukes (bit 1.2, u8)
Mines (bit 1.3, u8)
Emps (bit 1.4, u8)
Plasma (bit 1.5, u8)

The plasma shock torpedo type was added in v.2.1.5. It was inserted at bit 1.5, and all subsequent bits were shifted by one bit. Before this addition, the bit field was only three bytes long instead of four.

Unknown (bit 1.6, u8)

Unknown (bit 1.6, byte)

Tube Times (float array (length 6))

This array contains up to six float elements. Each element gives the (un)load time for the corresponding tube. This field should be ignored (even when present) if the tube's status is not loading or unloading.

Tube Status (enum TubeStatus as u8 array (length 6))

This array contains up to six byte elements. Each element indicates the occupation status of each tube.

Ordnance Type (enum OrdnanceType as u8 array (length 6))

This array contains up to six byte elements. Each element indicates the type of ordnance in each tube. If the tube's status is unloaded, the tube is empty, and this field should be ignored even when present.

Whale

This type became obsolete starting v2.1.5, when whales were folded into the new creature object type.

Bit field (2 bytes)
Name (bit 1.1, string)

Always “WHALE” in non-custom missions.

__unknown_1 (bit 1.2, u32)
__unknown_2 (bit 1.3, u32)
X Coordinate (bit 1.4, float)
Y Coordinate (bit 1.5, float)
Z Coordinate (bit 1.6, float)
Pitch (bit 1.7, float)
Roll (bit 1.8, float)
Heading (bit 2.1, float)
__unknown_3 (bit 2.2, float)
__unknown_4 (bit 2.3, float)

Values range from 0.0 to 1.0.

__unknown_5 (bit 2.4, float)

Values range up to 1.0. Lowest value seen so far is approximately 0.855, minimum might be 0.0.

__unknown_6 (bit 2.5, float)

Observed ranges have been from about 0.5 to 1.36.

Other

The remaining object types (asteroids, black holes and mines) all use the same properties. Prior to v2.1.5, anomalies and space monsters also used this structure.

Bit field (1 byte)
X Coordinate (bit 1.1, float)
Y Coordinate (bit 1.2, float)
Z Coordinate (bit 1.3, float)
Name (bit 1.4, string)

The object's name. In standard missions, this property is never used, but there may be named objects in custom missions.

__unknown_2 (bit 1.5, float)
__unknown_3 (bit 1.6, float)
__unknown_4 (bit 1.7, u32)
__unknown_5 (bit 1.8, u32)

Game Events

Certain in-game events cause the transmission specific patterns of packets. This section documents some of these observed patterns:

Connected to server, no simulation running

  1. WelcomePacket
  2. VersionPacket
  3. ConsoleStatusPacket
  4. AllShipSettingsPacket

Simulation starts while client is connected

  1. SkyboxPacket
  2. Unknown packet: type=0xf754c8fe subtype=0x08
  3. DifficultyPacket
  4. AllShipSettingsPacket

Client clicks "Ready" while simulation is already running

  1. PausePacket
  2. SkyboxPacket
  3. DifficultyPacket
  4. AllShipSettingsPacket
  5. KeyCaptureTogglePacket

Fighter is launched

  1. FighterLaunchPacket
  2. FighterLaunchedPacket
  3. FighterBayStatusPacket (informing that the fighter is no longer in the bay)
  4. ObjectUpdatePacket (fighters are now updated as separate ship objects)

Fighter is docked

  1. HelmRequestDockPacket (sent by the fighter)
  2. DestroyObjectPacket (destroys the fighter's ship object)
  3. FighterBayStatusPacket (informating that the fighter is now in the bay)
  4. ObjectUpdatePacket (the docked fighter is no longer a separate ship object)

Ship Internals

The layout of system nodes in a vessel is stored in an .snt file referenced by the vessel's entry in vesselData.xml. This section documents the file format used by these files.

A vessel's internal system grid is laid out in a 5 × 5 × 10 matrix: X (port to starboard), Y (dorsal to ventral), then Z (fore to aft). An .snt file contains 250 blocks of data, with each block representing one node in the system grid. The nodes are iterated first in the X axis, then Y, then Z. So the first ten nodes are (0,0,0) through (0,0,9), followed by (0,1,0) through (0,1,9), etc.

Each block is 32 bytes long. The first 12 bytes contain the node's position in the vessel's 3D coordinate system. (This is separate from its system grid coordinates.) The coordinates are stored as three floats: X, Y, then Z.

Next is an int value which describes what kind of node it is. A value from 0 to 7 indicates that the node contains vital equipment for one of the ship systems; you can tell which system by looking up the corresponding value in the ship system enumeration. A value of -1 indicates a hallway; it contains no ship systems but is still accessible to DAMCON teams. A value of -2 indicates an empty node; it contains no ship systems and is not accessible to DAMCON teams. This is typically for nodes that would fall outside the vessel's hull.

The remaining 16 bytes in the block appear to be reserved for future use.