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 objects in an ObjectUpdatePacket use bit fields declare which properties are defined in the object's 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. Artemis bit fields do not completely utilize the final byte; if the number of bits needed is divisble by 8, an extra byte will be allocated. So a seven-bit field will be one byte wide, but an eight-bit field will be two bytes wide, with the second byte always 0x00.

Example

The table below shows a bit field value of 0x93 represented in little-endian binary, with the bits labelled:

1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8
1 1 0 0 1 0 0 1

Boolean Format

Boolean values are simply expressed as an integer value 0 (false) or 1 (true). (When coercing an integer to a boolean, any non-zero value is interpreted as true.) Although a byte is sufficient for this purpose, in practice 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 logical values.
  2. The values are exact opposites (true/false, on/off, etc.).
  3. Those values are represented numerically as zero and non-zero.
  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.

Coordinates

Coordinates are expressed in three-dimensional Cartesian space as three float values (X, Y, Z). The simulation space is defined as a rectangular cuboid. The X- and Z-dimensions range from 0 to 100000, while the Y-dimension ranges from -100000 to 100000. In the standard siege game mode, the ship starts at (50000,0,50000). Another way of thinking of it is that the space is two cubes of size 100000 stacked on top of one another, with the ship starting out resting at the center of the plane that divides them.

From the point of view of the ship when oriented at a bearing of 0°, the X-axis increases toward starboard ("right"), the Y-axis increases toward the ventral side of the ship ("down"), and the Z-axis increases toward aft ("back", or toward the viewer). In the top-down view (as seen on most consoles), the X-axis increases toward the right (90° or "east"), the Y-axis increases "into" the screen (away from the viewer), and the Z-axis increase toward the bottom (180° or "south").

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

Anomaly Type

New as of v2.1.5.

0x00 HiDens Power Cell
0x01 Vigoranium Nodule
0x02 Cetrocite Crystal
0x03 Lateral Array
0x04 Tauron Focusers
0x05 Infusion P-Coils
0x06 Carapaction Coils
0x07 Secret code case
0x08 Beacon New as of v2.6.204
0x09 Space junk New as of v2.6.204

Audio Command

0x00 play
0x01 dismiss

Audio Mode

0x00 unused
0x01 playing
0x02 incoming

Beacon Mode

0x00 attract
0x01 repel

Beam Frequency

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

COMM Filter

Note: COMM filter values can be ORed together. Thus, 0x54 means that the message is a status update from a friendly space station.

0x01 alert
0x02 side
0x04 status
0x08 player
0x10 station (base)
0x20 enemy
0x40 friend

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 enemy ships:

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

To stations:

0x00 (friendly) Stand by for docking.
(enemy) Cease operation.
0x01 Please report status.
0x02 Build homing missiles
0x03 Build nukes
0x04 Build mines
0x05 Build EMPs
0x06 Build PShocks
0x07 Build beacons (since v2.6.3)
0x08 Build probes (since v2.6.3)
0x09 Build tags (since v2.6.3)

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 ship
0x02 station
0x03 other

Connection Type

0x00 unused
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 single-seat craft
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

New as of v2.1.5. Note that before v2.7.0, the typhon didn't have an official name, and would just show as "ZZ" even when scanned.

<v2.7.0 ≥v2.7.0 Note
0x00 typhon typhon a.k.a. classic space monster or crystalline entity
0x01 whale whale
0x02 shark shark
0x03 dragon dragon
0x04 piranha piranha
0x05 charybdis charybdis
0x06 insect insect
0x07 wreck jelly
0x08 unused wreck can't be beaconed

Drive Type

0x00 warp
0x01 jump

Intel Type

0x00 race
0x01 class
0x02 level 1 scan description
0x03 level 2 scan description

Game Type

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

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

0x00 homing missile
0x01 nuke
0x02 mine
0x03 EMP
0x04 plasma shock (since v2.1.5)
0x05 beacon (since v2.6.3)
0x06 probe (since v2.6.3)
0x07 tag (since v2.6.3)

Perspective

0x00 first person
0x01 third person

Ship System

0x00 beams
0x01 torpedoes
0x02 sensors
0x03 maneuvering
0x04 impulse
0x05 warp/jump drive
0x06 fore shields
0x07 aft shields

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.

Flag Internal name Alt name Description
0x0001 ELITE_INVIS_TO_MAIN_SCREEN Stealth Cannot be seen on main screen
0x0002 ELITE_INVIS_TO_TACTICAL LowVis Cannot be seen on tactical map
0x0004 ELITE_CLOAKING Cloak Can become completely invisible
0x0008 ELITE_HET HET High energy turn, ship can turn rapidly
0x0010 ELITE_WARP Warp Short bursts of warp speed
0x0020 ELITE_TELEPORT Teleport Ship has a limited jump drive
0x0040 ELITE_TRACTOR_BEAM Tractor Can lock player ships in, preventing them from escaping
0x0080 ELITE_DRONE_LAUNCHER Drones Can launch drones
0x0100 ELITE_ANTI_MINE_BEAMS Anti-mines Ship has a special beam to shoot mines
0x0200 ELITE_ANTI_TORP_BEAMS Anti-torp Ship has a special beam to shoot torpedoes
0x0400 ELITE_ANTI_SHIELD Shield-drain Can drain the energy of player ship shields
0x0800 ELITE_? ShldVamp Can steal energy from player ship shields (unconfirmed)

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

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. This value is a JamCRC hash of the internal name of the packet type.

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.

Sort by:
Name Origin Type Internal Type Name Subtype(s)

Hypothetical

0x0351a5ac:0x03

Type: 0x0351a5ac:0x03 [from client]

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

0x4c821d3c:0x16

Type: 0x4c821d3c:0x16 [from client]

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

0x69cc01d9:0x01

Type: 0x69cc01d9:0x01 [from client]

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

0xf754c8fe:0x02

Type: 0xf754c8fe:0x02 [from server]

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

0xf754c8fe:0x16

Type: 0xf754c8fe:0x16 [from server]

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

Unknown

0xf754c8fe:0x08

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 uncertain.

Has been hypothesized as having some relation to SoundEffectPacket.

Payload

Subtype (int)

Always 0x08.

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

0xf754c8fe:0x0e

Type: 0xf754c8fe:0x0e [from server]

This packet type has been observed, and its payload structure is believed to be understood. However, its function is as of yet uncertain.

Payload

Subtype (int)

Always 0x0e.

Unknown (4 bytes)

Only 0x00000000 observed so far.

Unknown (float)

Observed values from 0.00475 to 0.8866.

0xf754c8fe:0x19

Type: 0xf754c8fe:0x19 [from server]

This packet type has been observed, and its payload structure is believed to be understood. However, its function is as of yet uncertain.

Payload

Subtype (int)

Always 0x08.

Unknown (int)
Values of 0, 2, 3, and 4 observed.

A

ActivateUpgradePacket

Type: 0x4c821d3c:0x1c [from client]

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

Before v2.3.109, this was subtype 0x1b.

Payload

Subtype (int)

Always 0x1c.

Upgrade (int)

The upgrades that can be activated seem to be the ones between 0x00 (InfusionPCoils) and 0x08 (DoubleAgent / Secret Code Case), both inclusive.

AddGMButtonPacket

Type: 0x26faacb9:0x01 [from server]

New as of v2.4.0. Sent by the server to create a button on the game master UI. Unlike AddGMButtonAtPositionPacket, the button's position and size are up to the client. The client will use the default width set with SetDefaultGMButtonWidthPacket, if any.

Payload

Subtype (byte)

Always 0x01

Label (string)

The button's label. This doubles as an identifier for the button and must therefore be unique.

AddGMButtonAtPositionPacket

Type: 0x26faacb9:0x02 [from server]

New as of v2.4.0. Sent by the server to add a button with a specified position and size on the game master UI.

Payload

Subtype (byte)

Always 0x02.

Label (string)

The button's label. This doubles as an identifier for the button and must therefore be unique.

x (int)

The X-coordinate of the button's location.

y (int)

The Y-coordinate of the button's location.

width (int)

The width of the button to create.

height (int)

The height of the button to create.

AllShipSettingsPacket

Type: 0xf754c8fe:0x0f [from server]

Provides the list of available player ships.

Payload

Subtype (int)

Always 0x0f for this packet type.

Ships (array)

A list of the eight available player ships. Each ship is a struct with the following properties:

Drive type (int, enumeration)

Whether the ship has warp or jump drive

Ship type (int)

ID from vesselData.xml

Accent color (float) (v2.4 or later)

Ship accent color hue in the range 0.0 to 1.0. Multiply by 360 to get a Hue as described on Wikipedia. Default hue values for ships are:

  • Artemis (0)
  • Intrepid (0.125)
  • Aegis (0.25)
  • Horatio (0.375)
  • Excalibur (0.5)
  • Hera (0.625)
  • Ceres (0.75)
  • Diana (0.875)
Has name (boolean, 4 bytes) (v2.0 or later)

Will be true if the name property is included.

Name (string)

The name of the ship. Omitted if the "has name" property is false.

AudioCommandPacket

Type: 0x6aadc57f [from client]

Instructs the server to play or dismiss an audio message.

Payload

Audio ID (int)

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

Audio command (int, enumeration)
The desired action to perform.

B

BeamFiredPacket

Type: 0xb83fd2c4 [from server]

Notifies the client that a beam weapon has been fired.

Payload

ID (int)

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

Struct type (int)

Before v2.3.0, observed values included 0, 1, 4, and 8. Starting with v2.3.0, the only observed value thus far is 9. The value of this property affects what other properties are present

Struct type 0/1/4
Damage? (int)

This is believed to be the amount of damage inflicted by the beam. Appears to always be a multiple of 100.

Beam port index (int)
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 (int)

Indicates the type of object that fired the beam.

Target object type (int)

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

Unknown (int) (v2.3 or later)

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

Origin object ID (int)

The ID of the object that fired the beam.

Target object ID (int)

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 drawing 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 drawing 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 drawing 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 (int)

Indicates whether the beam was auto- or manually-fired. If the beam was auto-fired, the target X/Y/Z will be 0,0,0.

Struct type 8
Unknown (int)
Unknown (short)
Unknown (short)
Unknown (short)
Unknown (short)
Unknown (short)
Unknown (short)
Unknown X coordinate (float)

Range indicates this is likely relative to the game world rather than the ship.

Unknown Y coordinate (float)

Range indicates this is likely relative to the game world rather than the ship.

Unknown Z coordinate (float)

Range indicates this is likely relative to the game world rather than the ship.

Unknown (int)
Struct type 9
Subtype? (int)
Beam port index? (int)
Origin object type (int)
Target object type (int)
Unknown (int)
Origin object ID (int)

The ID of the object that fired the beam.

Target object ID (int)

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

Target X coordinate (float)

If subtype? is any value other than 9, this is the X coordinate (relative to the center of the target) of the impact point. This is used to determine the endpoint for drawing 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.

If subtype? is 9, it is an unknown world X coordinate instead.

Target Y coordinate (float)

If subtype? is any value other than 9, this is the Y coordinate (relative to the center of the target) of the impact point. This is used to determine the endpoint for drawing 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.

If subtype? is 9, it is an unknown world Y coordinate instead.

Target Z coordinate (float)

If subtype? is any value other than 9, this is the Z coordinate (relative to the center of the target) of the impact point. This is used to determine the endpoint for drawing 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.

If subtype? is 9, it is an unknown world Z coordinate instead.

Targeting mode (int)

Indicates whether the beam was auto- or manually-fired. If the beam was auto-fired, the target X/Y/Z will be 0,0,0.

BeaconConfigPacket

Type: 0x4c821d3c:0x22 [from client]

(new as of v2.6.204) Programs beacons prior to launch.

Payload

Subtype (int)

Always 0x22.

Unknown (int)

Appears to always be 12345.

Creature type (byte)

The creature for which this beacon is programmed. Presumably 0x07 (wreck) is invalid.

Mode (byte)
The effect this beacon will have on the indicated creature.

ButtonClickPacket

Type: 0x4c821d3c:0x15 [from client]

(since v2.4.0) Sent by the client when a custom button is clicked. The buttons are created by AddGMButtonPacket, AddGMButtonAtPositionPacket, or CommsButtonPacket.

Payload

Subtype (int)

Always 0x15.

Unknown (int)

Appears to always be 0x0d.

Hash (int)

A hash value identifying the button. This is a hash of the button's label computed using the JamCRC hash algorithm. (sample Java implementation)

C

CaptainSelectPacket

Type: 0x4c821d3c:0x11 [from client]

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

Payload

Subtype (int)

Always 0x11.

Target ID (int)

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

ClimbDivePacket

Type: 0x4c821d3c:0x1d [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.

This subtype was 0x1b before v2.2, 0x1c starting with v2.2 and before v2.3.109), and 0x1d from v2.3.109 on.

Payload

Subtype (int)

Always 0x1d.

Direction (int)

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.

CloakDecloakPacket

Type: 0xf754c8fe:0x07 [from server]

Renders a green "poof" graphical effect. Artemis does this when a ship cloaks or decloaks.

Payload

Subtype (int)

Always 0x07.

X-coordinate (float)
Y-coordinate (float)
Z-coordinate (float)

CommsButtonPacket

Type: 0xca88f050 [from server]

(since v2.5.106) Instructs the comms console to display or remove a button. Clicking the button results in the client transmitting a ButtonClickPacket.

Payload

Action (byte)

Indicates the action being performed:

0x00 Remove
0x02 Add
0x64 Remove all
Label (string, omitted if action is 0x64)

The label of the button being added or removed.

CommsIncomingPacket

Type: 0xd672c35f [from server]

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

Payload

Filters (bit field, 2 bytes, since v2.6.0)

Indicates the channel(s) on which the message was received. The bits in the field correspond to filters on the comms console: a set bit means that the message matches the corresponding filter.

Channel (int, before v2.6.0)

Values ranged from 0x00 to 0x08. In the stock client, this affected 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 didn'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 could 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 (int)

The type of target for the message.

Recipient ID (int)

ID of the object that is to receive the message.

Message (int)

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

Target object ID (int)

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.

Unknown (int)

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 (int)

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 (array)

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 (int)

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.

Unknown (12 bytes)

D

DestroyObjectPacket

Type: 0xcc5a3e30 [from server]

Notifies the client that an object has been removed from play. This does not imply any particular graphical or sound effect; that is handled by other packets. This packet just means that the client can discard the indicated object.

Payload

Object type (byte)

Indicates the type of object being destroyed.

Object ID (int)

The ID of the object being destroyed.

DetonationPacket

Type: 0xf754c8fe:0x13 [from server]

Indicates that a detonation effect for an exploding torpedo or mine should be displayed. Very similar to ExplosionPacket, which is for other types of objects.

Payload

Subtype (int)

Always 0x13.

Object type (int)

The type of object that is detonating. Can only be 0x07 (mine) or 0x0b (torpedo).

Object ID (int)

The ID of the object being detonated.

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 (int)

Always 0x10.

Name (string)

The DMX flag name.

State (boolean, 4 bytes)

The DMX flag's current state.

DockedPacket

Type: 0xf754c8fe:0x1a [from server]

Sent by the server when a player ship is fully docked at a base.

Payload

Subtype (int)

Always 0x1a.

Object ID (int)

The ID of the ship that has docked.

E

EmergencyJumpPacket

Type: 0x4c821d3c:0x20 [from client]

(since v2.3.109) Sent by the helm console to request an emergency jump. Only usable by ships equipped with jump drive, obviously.

Payload

Subtype (int)

Always 0x20.

Direction (int)

Direction to jump: 0 means foward and 1 means backward.

EndGamePacket

Type: 0xf754c8fe:0x06 [from server]

Informs the client that the game is over. Distinct from GameOverPacket in that it is transmitted when the “End Game” button on the statistics page is clicked.

Payload

Subtype (int)

Always 0x06.

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 (int)

Always 0x0b.

DAMCON autonomy (boolean, 4 bytes)

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

Full status (boolean, 1 byte)

Whether this packet contains a full update of all nodes and DAMCON teams (true) or just updates (false). You can get a full update by sending a RequestEngGridUpdate packet.

System grid status (array)

This array contains a list of system nodes, terminated with 0xff. Each system node contains the following fields:

X coordinate (byte)

The X coordinate of the node relative to the ship's center.

Y coordinate (byte)

The Y coordinate of the node relative to the ship's center.

Z coordinate (byte)

The Z coordinate of the node relative to the ship's center.

Damage (float)

The current damage level for this node. An undamaged node has a value of 0.0; any higher value indicates damage. (Is there an upper limit to this value?)

DAMCON team status (array)

This contains a list of DAMCON teams, terminated with 0xfe. Each DAMCON team contains the following fields:

Team ID (byte)

An ID assigned to this team. For some reason known only to Thom, this value always has 0x0a added to it.

Goal X coordinate (int)

The X coordinate of the node to which this team is currently moving. If the team does not want to move elsewhere, this will be the same as their current X coordinate.

Current X coordinate (int)

The X coordinate of the team's current node. This value does not change while the team in in transit; it is only updated when they arrive at a new node.

Goal Y coordinate (int)

The Y coordinate of the node to which this team is currently moving. If the team does not want to move elsewhere, this will be the same as their current Y coordinate.

Current Y coordinate (int)

The Y coordinate of the team's current node. This value does not change while the team in in transit; it is only updated when they arrive at a new node.

Goal Z coordinate (int)

The Z coordinate of the node to which this team is currently moving. If the team does not want to move elsewhere, this will be the same as their current Z coordinate.

Current Z coordinate (int)

The Z coordinate of the team's current node. This value does not change while the team in in transit; it is only updated when they arrive at a new node.

Progress (float)

A value between 0.0 and 1.0 that expresses how close the team is in their progress towards the goal node. The value starts at 1.0 as the team begins moving towards the goal node, and gradually decreases until it reaches 0.0 upon their arriving at the goal.

Number of team members (int)

The number of people on this DAMCON team.

EngResetCoolantPacket

Type: 0x4c821d3c:0x18 [from client]

Resets the coolant levels to 0 on all systems. This is sent by the stock client in response to pressing double spacebar or enter on the engineering console.

Before v2.3.109, this was subtype 0x17.

Payload

Subtype (int)

Always 0x18.

EngSendDamconPacket

Type: 0x69cc01d9:0x04 [from client]

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

Payload

Subtype (int)

Always 0x04.

Team number (int)

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

X coordinate (int)

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

Y coordinate (int)

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

Z coordinate (int)

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 (int)

Always 0x0c.

Autonomous (int, boolean)

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 (int)

Always 0x00.

Ship system (int, enumeration)

The system whose coolant level is being adjusted.

Value (int)

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

Unknown (int)

Only observed value is 0.

Unknown (int)

Only observed value is 0.

EngSetEnergyPacket

Type: 0x0351a5ac:0x04 [from client]

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

Payload

Subtype (int)

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 (int, enumeration)

The system whose coolant level is being adjusted.

ExplosionPacket

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 explosion effect should be rendered at the current location of an object. Very similar to DetonationPacket, which is for mines and torpedoes.

Payload

Subtype (int)

Always 0x00.

Object type (byte, enumeration)

The type of object that is exploding.

Object ID (int)

The ID of the exploding object.

F

FighterBayStatusPacket

Type: 0x9ad1f23b [from server]

Updates the client of the current status of the single-seat craft bays.

Payload

The payload consists of an array of structs, each one describing a single bay, and terminated with 0x00000000. The struct's properties are as follows:

Object ID (int)
Bay number (int) (v2.6 or later)
Fighter name (string)
Fighter class name (string)
Refit time (int)

Number of seconds of refit time remaining before fighter is ready to launch.

FighterDamagePacket

Type: 0xf754c8fe:0x18 [from server]

Causes the client for a single-seat craft to present an interface screw as a result of an impact. By default, this causes the screen to shake and break up.

Payload

Subtype (int)

Always 0x18.

Object ID (int)

The ID of the impacted single-seat craft.

Duration (float)

Length of time (in seconds) that the damage visualization should last.

FighterLaunchedPacket

Type: 0xf754c8fe:0x17 [from server]

Notifies the client that a single-seat craft was just launched.

Payload

Subtype (int)

Always 0x17.

Object ID (int)

The ID of the single-seat craft, as shown in FighterBayStatusPacket.

FighterLaunchPacket

Type: 0x4c821d3c:0x1e [from client]

Notifies the server that a single-seat craft is being launched. The server will send back a FighterLaunchedPacket in response.

Before v2.3.109, this was subtype 0x1d.

Payload

Subtype (int)

Always 0x1d.

Object ID (int)

The ID of the single-seat craft, as shown in FighterBayStatusPacket.

FighterPilotPacket

Type: 0x0351a5ac:0x07 [from client]

Notifies the server of a single-seat craft's trajectory.

Payload

Subtype (int)

Always 0x07.

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.

Object ID (int)

The ID of the single-seat craft, as shown in FighterBayStatusPacket.

Unknown (float)

A value of 1.0 has been observed.

X coordinate (float)

The ship's location on the X axis.

Y coordinate (float)

The ship's location on the Y axis.

Z coordinate (float)

The ship's location on the Z axis.

Orientation x component(float)

The x component of the quaternion representing the ship's orientation.

Orientation y component(float)

The y component of the quaternion representing the ship's orientation.

Orientation z component(float)

The z component of the quaternion representing the ship's orientation.

Orientation w component(float)

The w component of the quaternion representing the ship's orientation.

FighterShootPacket

Type: 0x4c821d3c:0x1f [from client]

Indicates that a single-seat craft is shooting.

Before v2.3.109, this was subtype 0x1e.

Payload

Subtype (int)

Always 0x1f.

Shooter object ID (int)

ID of the single-seat craft that is shooting.

Target object ID (int)

ID of the object being shot.

FighterTextPacket

Type: 0xf754c8fe:0x1c [from server]

Sent to single-seat craft when comms or the GM sends them a free-form text message.

Payload

Object ID (int)

The ID of the craft receiving the message

Message (string)

The content of the message.

FireBeamPacket

Type: 0xc2bee72e [from client]

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

Payload

Target object ID (int)

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 (int)

Always 0x08.

Tube index (index)

The index number of the tube to fire.

G

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 (byte)

Always 0x63.

Title (string)

A title to display above the instructions.

Content (string)

The body content for the help screen.

GameMasterMessagePacket

Type: 0x809305a7 [from client]

A packet sent by the game master console to the server which causes a message to be displayed on a client.

Payload

Recipients (since v2.4.0, array)

Since v2.6.0, this is an array of int values giving the object IDs of the recipient ships. The array is terminated with an ID of 0.

When initially introduced in v2.4.0, this was instead an array of eight 1-byte booleans, one for each player ship in order of their ship index.

Presentation (int)

Dictates how the message is displayed:

0
Shown to the communications officer as a normal COMM message.
3000
(since v2.7.0) Displayed as a chat message on the ship selection screen before the game.
(other)
Shown as a popup message on a particular console. The console is identified 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.

Filter (2 bytes, since v2.7.0)

Only present if the presentation field is not 3000. This indicates which COMM filter the message will match. This is not a bit field because only one filter can be specified. If the value is 0, it will be a "general" message not matching any of the filters.

GameMasterSelectLocationPacket

Type: 0x0351a5ac:0x06 [from client]

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

Payload

Subtype (int)

Always 0x06.

Z-coordinate (float)

The coordinate of the selected location on the Z axis.

Unknown (4 bytes)

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 (int)

Always 0x12.

Target ID (int)

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 “popup” box in the lower-right corner.

Payload

Subtype (int)

Always 0x0a.

Message (string)

The message to display.

GameOverPacket

Type: 0xf754c8fe:0x1e [from server]

(since v2.6.3) Informs the client that the game is over. Distinct from EndGamePacket in that this is sent when the end game condition is met or "End Simulation" is clicked on the server, right before GameOverReasonPacket and GameOverStatsPacket are sent.

Payload

Subtype (int)

Always 0x06.

GameOverReasonPacket

Type: 0xf754c8fe:0x14 [from server]

Provides the reason why the game ended.

Payload

Subtype (int)

Always 0x14.

Reason (string array)

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

GameOverStatsPacket

Type: 0xf754c8fe:0x15 [from server]

Provides endgame statistics.

Payload

Subtype (int)

Always 0x15.

Column index (byte)

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)

The remaining bytes in the packet are an array, where each element constitutes a row in the stats column. Each element is prefaced with 0x00, and the last element is followed by 0xce. Each element contains the following fields:

Value (int)

The numeric value for this statistic.

Label (string)

The description for this statistic.

GameStartPacket

Type: 0x3de66711 [from server]

Informs clients that the game has started. Clients that do not receive this packet will not render beam arcs on the helm and weapons consoles. This is probably because difficulty level affects beam range.

Payload

Difficulty (int)

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

Game type (int, enumeration)

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.

H

HeartbeatPacket

Type: 0xf5821226 [from server]

This packet is transmitted regularly by the server to demonstrate that it's still alive. If the stock client does not receive a heartbeat packet in a while, it will display a message at the top-right of the console selection screen saying "Server not running" but will otherwise still continue to act as though everything is fine.

Payload

This packet has no 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 (int)

Always 0x04.

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 single-seat craft, with its mothership.

Payload

Subtype (int)

Always 0x07.

Single-seat craft ID (int)

The ID of the single-seat craft that is docking with its mothership, or 0x00 if helm is docking with a station.

HelmSetImpulsePacket

Type: 0x0351a5ac:0x00 [from client]

Sets the throttle for impulse engines.

Payload

Subtype (int)

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 (int)

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 (int)

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 (int)

Always 0x00.

Warp factor (int)

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:0x19 [from client]

Toggles the impulse engines between forward and reverse drive.

Before v2.3.109, this was subtype 0x18.

Payload

Subtype (int)

Always 0x19.

Unused (int)

Always 0x00.

I

IdleTextPacket

Type: 0xbe991309 [from server]

(since v2.7.0) Informs the client of an incoming text message displayed on the console choice screen (pre-game).

Payload

Ship name (string)

The name of the ship sending the message.

Message (string)

The message cotnent.

IncomingAudioPacket

Type: 0xae88e058 [from server]

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

Payload

Audio ID (int)

The ID for this audio message.

Audio mode (int, enumeration)

“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 (string, incoming mode only)

Title of the incoming message. This should be displayed to the COMMs officer.

File (string, incoming mode only)

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.

IntelPacket

Type: 0xee665279 [from server]

Transmits information about a ship which is displayed on the science console. Some information may not be revealed until after science scans the ship. Theoretically, the intel on any one ship should only need to be sent once, but the game re-transmits known intel periodically.

Payload

Object ID (int)

The ID of the ship to which this intel pertains.

Intel type (byte)

Indicates which piece of information is being received.

Intel (string)

The actual information to be displayed to science.

J

JumpStatusBeginPacket

Type: 0xf754c8fe:0x0c [from server]

Notifies the client that a jump has started.

Payload

Subtype (int)

Always 0x0c.

JumpStatusEndPacket

Type: 0xf754c8fe:0x0d [from server]

Notifies the client that a jump has completed.

Payload

Subtype (int)

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 (int)

Always 0x11.

Capture (boolean, 1 byte)

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 (byte)

Always 0x14.

Key code (int)

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.

KlaxonPacket

Type: 0xf754c8fe:0x01 [from server]

Plays a klaxon sound. Artemis sends this packet when red alert is activated.

Payload

Subtype (int)

Always 0x01.

L

LoadTubePacket

Type: 0x69cc01d9:0x02 [from client]

Loads a tube with a particular type of ordnance.

Payload

Subtype (int)

Always 0x02.

Tube index (int)

Indicates which tube is to be loaded.

Ordnance type (int, enumeration)

The type of ordnance to load into the tube.

Unknown (int)
Unknown (int)

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.

Payload

The payload consists of an array of object update entries, terminated with 0x00000000. 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. If you get 0x00 for this field, there are no more objects in the array.

Official Artemis servers only send "homogenous" ObjectUpdatePackets (packets containing only objects of the same type). However, there is nothing in the protocol to require this, and the stock clients handle heterogeneous update packets just fine.

In earlier protocol versions, this property was transmitted as an int rather than a byte. At least v2.1.1 and onward use the single byte encoding, but it is not verified if v2.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 (int)

Always 0x04.

Paused (boolean, 4 bytes)

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 (int)

Always 0x12.

Perspective (int, enumeration, before v2.4.0)

The current main screen perspective. This property is omitted starting with v2.4.0, which simply toggles the perspective between first- and third-person instead of specifying the desired perspective.

PlayerShipDamagePacket

Type: 0xf754c8fe:0x05 [from server]

Causes the client to present an interface screw as a result of an impact on the ship. By default, this causes the screen to shake and break up.

Payload

Subtype (int)

Always 0x05.

Ship index (int)

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

Duration (float)

Length of time (in seconds) that the damage visualization should last.

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). Note that the server treats a ReadyPacket as a request to send the complete simulation state to the client, so ReadyPacket can be sent again during a simulation if you want a full update.

Payload

Subtype (int)

Always 0x0f.

Unknown (int)

Always 0.

RemoveAllGMButtonsPacket

Type: 0x26faacb9:0x64 [from server]

New as of v2.4.0. Sent by the server to remove all buttons on the game master UI.

Payload

Subtype (byte)

Always 0x64.

RemoveGMButtonPacket

Type: 0x26faacb9:0x00 [from server]

New as of v2.4.0. Sent by the server to remove a previously-created button on the game master UI.

Payload

Subtype (byte)

Always 0x00.

Label (string)

The button's label. This doubles as an identifier for the button and must therefore be unique.

RequestEngGridUpdate

Type: 0x4c821d3c:0x1a [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.

Before v2.3.109, this was subtype 0x19.

Payload

Subtype (int)

Always 0x19.

Unknown (int)

Always 0.

S

SciScanPacket

Type: 0x4c821d3c:0x13 [from client]

Starts a science scan.

Payload

Subtype (int)

Always 0x13.

Target ID (int)

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 (int)

Always 0x10.

Target ID (int)

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 (int)

Always 0x0b.

Beam frequency (int, enumeration)

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 (int)

Always 0x0e.

Console type (int, enumeration)

The console whose status is being updated.

Selected (boolean, 4 bytes)

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

SetDefaultGMButtonWidthPacket

Type: 0x26faacb9:0x03 [from server]

Sets the width of buttons on the game master UI that are added with AddGMButtonPacket.

Payload

Subtype (byte)

Always 0x01

Width (int)

The default width in pixels.

SetFighterSettingsPacket

Type: 0x4c821d3c:0x21 [from client]

(new as of v2.6.0) Sets the details of the single-seat craft on a ship. This is transmitted by the client when you click the "Back" button from the "Customize Ship" screen.

Payload

Subtype (int)

Always 0x21.

Unknown (int)

Always seems to be 0.

Craft array

An array of single-seat craft, terminated by 0x00000000. Each entry is a struct as follows:

Vessel type (int)

The ID of the vessel from vesselData.xml.

Bay index (int)

The index of the bay where this craft is located, ranging from 0 to the ship's bay count - 1.

Name (string)

The name of this craft.

Hull race (string)

As specified in vesselData.xml: "TSN", "Ximni", "Pirate", etc.

Broad type (string)

As specified in vesselData.xml.

SetMainScreenPacket

Type: 0x4c821d3c:0x01 [from client]

Sets the view to display on the main screen.

Payload

Subtype (int)

Always 0x01.

Main screen view (int, enumeration)

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 (int)

Always 0x0d.

Ship index (int)

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

SetShipSettingsPacket

Type: 0x4c821d3c:0x17 [from client]

Sets the properties for the currently-selected ship.

Before v2.3.109, this was subtype 0x16.

Payload

Subtype (int)

Always 0x17.

Ship (struct)

The updated ship properties. This is a struct as defined in AllShipSettingsPacket.

SetWeaponsTargetPacket

Type: 0x4c821d3c:0x02 [from client]

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

Payload

Subtype (int)

Always 0x02.

Target ID (int)

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

ShieldsDownPacket

Type: 0x4c821d3c:0x06 [from client]

Lowers shields.

Payload

Subtype (int)

Always 0x06.

Unused (int)

Always 0.

ShieldsUpPacket

Type: 0x4c821d3c:0x05 [from client]

Raises shields.

Payload

Subtype (int)

Always 0x05.

Unused (int)

Always 0.

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 0x0a instead. This may be a bug in the Artemis server.

Payload

Subtype (int)

Always 0x09.

Skybox ID (int)

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.

SmokePacket

Type: 0xf754c8fe:0x1b [from server]

Causes the client to render a puff of smoke as a result of damage.

Payload

Subtype (int)

Always 0x1b.

Object ID (int)

The ID of the object emitting the smoke.

Unknown (int)

Values 0 through 7 observed. Does not appear to be related to duration or ship index. Maybe ship system index? Or type of smoke?

X-coordinate (float)

The X-coordinate relative to the ship's origin where the smoke is emitted. Some extreme values have been observed; maybe smoke left after a ship is destroyed?

Y-coordinate (float)

The Y-coordinate relative to the ship's origin where the smoke is emitted. Some extreme values have been observed; maybe smoke left after a ship is destroyed?

Z-coordinate (float)

The Z-coordinate relative to the ship's origin where the smoke is emitted. Some extreme values have been observed; maybe smoke left after a ship is destroyed?

SoundEffectPacket

Type: 0xf754c8fe:0x03 [from server]

Causes the client to play a sound effect file.

Payload

Subtype (int)

Always 0x03.

Filename (string)

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

T

TagPacket

Type: 0xf754c8fe:0x1d [from server]

Sent by the server when a player ship has detected a tag. Introduced in v2.6.204.

Payload

Subtype (int)

Always 0x1d.

Object ID (int)

The ID of the tagged object.

Unknown (int)

Values of 0 and occasionally 3 observed.

Tagger (string)

The ship that launched the tag. This is not neccessarily the name of a ship that exists in the game.

Date (string)

The date the tag was applied, in YYYY-M-D format. (Month and day do not have leading 0s.)

TitlePacket

Type: 0x902f0b1a [from server]

Transmits a large title to display on the main screen. This occurs in response to the <big_message> tag in a scripted mission.

Payload

Title (string)

The title text to display

Subtitle 1 (string)

The first line of the subtitle

Subtitle 2 (string)

The second line of the subtitle

ToggleAutoBeamsPacket

Type: 0x4c821d3c:0x03 [from client]

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

Payload

Subtype (int)

Always 0x03.

Unused (int)

Always 0.

TogglePerspectivePacket

Type: 0x4c821d3c:0x1b [from client]

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

Before v2.3.109, this was subtype 0x1b.

Payload

Subtype (int)

Always 0x1a.

Unused (int)

Always 0.

ToggleRedAlertPacket

Type: 0x4c821d3c:0x0a [from client]

Toggles the ship's red alert status.

Payload

Subtype (int)

Always 0x0a.

Unused (int)

Always 0.

ToggleShieldsPacket

Type: 0x4c821d3c:0x04 [from client]

Toggles the shields up or down.

Payload

Subtype (int)

Always 0x04.

Unused (int)

Always 0.

U

UnloadTubePacket

Type: 0x4c821d3c:0x09 [from client]

Removes whatever ordnance is loaded in a tube.

Payload

Subtype (int)

Always 0x09.

Tube index (int)

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 (int)

The value of this field can vary, even when connecting to the same version of the server.

Version (deprecated since v2.1) (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 (since v2.1) (3 ints)
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.

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 (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 v2.1.5. Previously, anomalies were handled by the “other” property structure.

Bit field (2 bytes, 1 byte before v2.6.3)
X coordinate (byte 1.1, float)
Y coordinate (byte 1.2, float)
Z coordinate (byte 1.3, float)
Anomaly type (byte 1.4, enumeration, int)
Scan (byte 1.5, int, new as of v2.3.0)

This is a bitmask indicating which sides have scanned this anomaly. To determine whether a particular side has scanned the anomaly, compute (1 << sideIndex) && scanValue. If the result is non-zero, the anomaly has been scanned by that side. Note that there is no side 0.

Unknown (byte 1.6, int, new as of v2.3.0)

So far only 0 has been observed.

Beacon creature type (byte 1.7, byte, new as of 2.6.3)

If this anomaly represents a deployed beacon, this is the type of creature affected by it. Presumably 0x07 (wreck) is invalid.

Beacon mode (byte 1.8, byte, new as of 2.6.3)

If this anomaly represents a deployed beacon, this is the beacon's mode.

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.

Shields (bit 1.2, float)

The current strength of the base's shields.

Aft shields (unused) (bit 1.3, float)

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

Unknown (bit 1.4, int)

Since v2.3.0, this property is unknown, and appears to always have a value of 6.

Before v2.3.0, this was the index of this base. Each base had a unique index from 0 to (number of bases-1). In a standard solo game, DS1 was 0, DS2 was 1, etc.

Vessel type (bit 1.5, int)

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 (bit 2.1, 4 bytes)
Unknown (bit 2.2, 4 bytes)
Unknown (bit 2.3, 4 bytes)
Unknown (bit 2.4, 4 bytes)
Unknown (bit 2.5, byte)
Unknown (bit 2.6, byte)

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)

Note: Before v2.3.0, the bit field was 2 bytes.

X (bit 1.1, float)

The X coordinate of this creature.

Y (bit 1.2, float)

The Y coordinate of this creature.

Z (bit 1.3, float)

The Z coordinate of this creature.

Name (bit 1.4, string)

The name of the creature.

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 (bit 1.8, int, enumeration)

The type of creature.

Scan? (bit 2.1, 4 bytes)

This appears to be a scanned bitmask, simiar to those found on player and NPC ships.

Unknown (bit 2.2, 4 bytes)

Side?

Unknown (bit 2.3, 4 bytes)
Unknown (bit 2.4, 4 bytes)
Unknown (bit 2.5, 4 bytes)
Unknown (bit 2.6, 4 bytes)
Health (bit 2.7, float, since 2.3.0)

The creature's current health.

Max health (bit 2.8, float, since 2.3.0)

The creature's maximum health.

Unknown (bit 3.1, byte, since v2.6.3)

Possibly related to tags, nebulae, or age?

Unknown (bit 3.2, int, since v2.7.0)

Usually -1, but many other values observed, as well.

Drone

Bit field (2 bytes)
Unknown (bit 1.1, int)
X coordinate (bit 1.2, float)
Y coordinate (bit 1.3 float)
Z coordinate (bit 1.4, float)
Unknown (bit 1.5 float)

Perhaps related to pitch/yaw.

Unknown (bit 1.6, float)
Heading (bit 1.7, float)
Side (bit 1.8, int)
Unknown (bit 2.1, float?, v2.1.5+)

Engineering Console

Bit fields (4 bytes)

Each byte of the field represents a category of values:

  1. Heat levels
  2. Energy allocations
  3. Coolant allocations

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).

Heat levels (bits 1.1-1.8, float array)

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.

Energy allocations (bits 2.1-2.8, float array)

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....

Coolant allocations (bits 3.1-3.8, byte array)

The units of coolant allocated to each system.

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 (bit 1.4, int)
Unknown (bit 1.5, int)
Unknown (bit 1.6, int)
Roll (bit 1.7, float)
Pitch (bit 1.8, float)
Heading (bit 2.1, float)
Roll delta (bit 2.2, float)
Pitch delta (bit 2.3, float)
Heading delta (bit 2.4, float)
Name (bit 2.5, string)

The name of this object.

Mesh file (bit 2.6, string)

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

Texture file (bit 2.7, string)

The name of the file containing the texture to apply to the mesh.

Push radius (bit 2.8, float)

The distance to maintain from other objects.

Block shots (bit 3.1, boolean, byte)

Whether this object blocks weapons fire.

Scale (bit 3.2, float)

Scale factor of the model

Red color channel (bit 3.3, float)
Green color channel (bit 3.4, float)
Blue color channel (bit 3.5, float)
Fore shields (bit 3.6, float)
Aft shields (bit 3.7, float)
Unknown (bit 3.8, byte)
Unknown (bit 4.1, string?)
Unknown (bit 4.2, string?)
Unknown (bit 4.3, int, since v2.7.0)

Nebula

Bit field (1 byte)
X coordinate (bit 1.1, float)
Y coordinate (bit 1.2, float)
Z coordinate (bit 1.3, float)
Red color channel (bit 1.4, float)

This affects the color shown on a 3D view, not in a map view.

Green color channel (bit 1.5, float)

This affects the color shown on a 3D view, not in a map view.

Blue color channel (bit 1.6, float)

This affects the color shown on a 3D view, not in a map view.

Type (bit 1.7, byte, since v2.7.0)

Valid values are 1, 2, or 3. All nebulae limit ships within them to warp 1, but other than the color used to render them on map views, they are indistinguishable in stock scenarios. Scripts can use them for unique effects, though.

NPC Ship

The "Tagged" property was added in v2.6.204, and the unknown byte after it was added in v2.6.3. The subsequent properties shifted accordingly.

Bit field (7 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, boolean, 4 bytes)

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 (bit 1.7, int)

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, boolean, 1 byte)

True if this ship has surrendered; false otherwise.

Unknown (bit 2.8, byte)

Possibly indicates the type of nebula the ship is in, but this is unconfirmed at this time.

Before v2.7.0, this was two bytes long. Sample observed values: 0x0000, 0x0100, 0x01ff, 0x02ff, 0x03ff, 0x16ff, 0x2bff, 0x32ff, 0x43ff, 0x46ff, 0x47ff, 0x51ff, 0x57ff, 0xc6ff.

Forward shields (bit 3.1, float)
Forward shields max (bit 3.2, float)
Aft shields (bit 3.3, float)
Aft shields (bit 3.4, float)
Unknown (bit 3.5, short)

0x0100 observed

Fleet number (bit 3.6, byte)

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

Special abilities (bit 3.7, bit field, 4 bytes)

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

Active special abilities (bit 3.8, bit field, 4 bytes)

The special 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 special abilities, even if it is present.

Single scan (bit 4.1, int)

This is a bitmask indicating which sides have scanned this ship at least once. To determine whether a particular side has scanned the ship, compute (1 << sideIndex) && scanValue. If the result is non-zero, the ship has been scanned once by that side. Note that there is no side 0.

Double scan (bit 4.2, int)

This is a bitmask indicating which sides have scanned this ship twice. It takes the same format at the single scan property.

Map visibility (bit 4.3, int)

This is a bitmask indicating which sides are able to see this ship in their overhead map views (LRS, science, captain's map, etc.). It takes the same format as the previous two properties.

Side (bit 4.4, byte)

The side index for this ship. Ships which have the same side index are friendly to one another and share scan data. There is no side 0.

Unknown (bit 4.5, byte)

Observed values include 0x00 through 0x02 and 0xfa through 0xff.

Unknown (bit 4.6, byte)

Observed values include 0x00 through 0x05, 0xfa, and 0xfc through 0xff.

Unknown (bit 4.7, byte)

0x01 observed

Target X (bit 4.8, float)
Target Y (bit 5.1, float)
Target Z (bit 5.2, float)
Tagged (bit 5.3, byte, new as of v2.6.204)
Unknown (bit 5.4, byte, new as of v2.6.3)

Only 0 observed so far.

Ship system damage (bit 5.5 - 6.4, float array)

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 frequency resistance (bit 6.5 - 7.1, float array)

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

Player Ship

Bit field (6 bytes, 5 bytes before v2.3.0)
Weapons target (bit 1.1, int)

The ID of the object selected by the weapons officer, or 0 if the selection was cleared.

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, boolean, 1 byte)
Warp factor (bit 1.7, byte)
Energy reserves (bit 1.8, float)
Shields up/down (bit 2.1, boolean, 2 bytes)
Unknown (bit 2.2, int)

Was ship number before v2.3.0.

Hull ID (bit 2.3, int)

The ID of the vessel entry for this ship in vesselData.xml.

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)

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”).

Nebula type (bit 3.3, byte)

The type of nebula that the player's ship is in, or 0 if the ship is not in a nebula. Nebulae types are 1, 2, and 3; but other values for this property have been observed, such as 38 and -127. It is unknown what these other values mean. Player ships in nebulae cannot go faster than warp 1.

Before v2.7.0, this was two bytes, and nebula types did not exist. The value was then treated as a boolean, where any non-zero value meant "in a nebula."

Ship name (bit 3.4, string)
Forward 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.

Forward shields max (bit 3.6, float)

The maximum strength of the forward shield.

Aft shields (bit 3.7, float)

Current strength of aft 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.

Aft shields max (bit 3.8, float)

The maximum strength of the aft shield.

Last docked base (bit 4.1, int)

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, byte, enumeration)
Unknown (bit 4.3, float)

Value of 200000 observed

Main screen view (bit 4.4, byte, enumeration)

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

Beam frequency (bit 4.5, byte, enumeration)

The frequency to which the beams are currently tuned.

Available coolant or missiles (bit 4.6, byte)

The total amount of coolant if a capital ship, or the number of missiles if a single-seat craft.

Science target (bit 4.7, int)

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

Captain target (bit 4.8, int)

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

Drive type (bit 5.1, byte, enumeration)

The type of drive system the ship has.

Scanning ID (bit 5.2, int)

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

Scanning 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, boolean, 1 byte)

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

Climb/dive (bit 5.5, float)

Whether the ship is climbing (-1), diving (1), or leveling out (0).

Side (bit 5.6, byte)

What side this ship is on. Ships with the same side value are allies and share scan data.

Unknown (bit 5.7, int)

Appears to affect visibility on science/captain's map (0 for invisible, -1 for visible, other values observed).

Ship index (bit 5.8, byte, new as of v2.3.0)

The index of the player ship (0=Artemis, etc.). If this ship is a single-seater, this value is 0xff.

Capital ship object ID (bit 6.1, int, new as of v2.3.0)

The object ID of the associated capital ship, if this ship is a single-seater.

Accent color (bit 6.2, float, new as of v2.4.0)

Ship accent color hue in the range 0.0 to 1.0. Multiply by 360 to get a Hue as described on Wikipedia.

Emergency jump cooldown (bit 6.3, float, new as of v2.4.0)

When the ship is ready for an emergency jump, this value will be 0.0. After a jump, it will go to 1.0, then gradually decrease back down to 0.0.

Beacon creature type (bit 6.4, byte, new as of v2.6.3)

The weapons console's setting for the type of creature that will be attracted/repelled by a launched beacon.

Beacon mode (bit 6.4, byte, new as of v2.6.3)

The weapons console's setting for what a launched beacon will do to the configured type of creature.

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.

Bit field (11 bytes)

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 detmines 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.

Delta X (bit 1.4, float)

Ranges from -1.0 to 1.0 (though the client handles values outside this range fine).

Delta Y (bit 1.5, float)

Ranges from -1.0 to 1.0 (though the client handles values outside this range fine).

Delta Z (bit 1.6, float)

Ranges from -1.0 to 1.0 (though the client handles values outside this range fine).

Unknown (bit 1.7, int)

Seems to always be 0x0b, which is the object ID for a torpedo, although this seems redundant.

Ordnance type (bit 1.8, int)

The ordnance type of this torpedo.

Weapons Console

Version notes:

  • There used to be an unknown byte between the ordnance counts array and the tube (un)load times array. Before v2.1.5, it was located at bit 1.5. Starting with v2.1.5 it moved to bit 1.6 as a result of the introduction of the plasma shock torpedo. It was removed starting at v2.6.0.
  • The plasma shock torpedo type was added in v2.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.
  • Beacons, probes, and tags were introduced in v2.6.0. These were inserted at bits 1.6, 1.7, and 1.8 (with the unknown byte removed), and the remaining properties were shifted accordingly.
Bit field (4 bytes)
Ordnance counts (bits 1.1-1.8, byte array)

Each element of this array indicates how many of a particular ordinance type are stored on the ship, in the order given in the ordnance type enumeration.

Tube (un)load times (bits 2.1-2.6, float array)

Each element of this array gives the (un)load time (in seconds) for the corresponding tube. This field should be ignored (even when present) if the tube's status is not loading or unloading.

Tube status (bits 2.7-3.4, byte array)

Each element of this array indicates the occupation status of each tube.

Ordnance type (bits 3.5-4.2, byte array)

Each element of this array 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 (bit 1.2, int)
Unknown (bit 1.3, int)
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 (bit 2.2, float)
Unknown (bit 2.3, float)

Values range from 0.0 to 1.0.

Unknown (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 (bit 2.5, float)

Observed ranges have been from about 0.5 to 1.36.

Other Objects

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)

The object's location on the X axis.

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.

UDP Server Discovery

Starting in v2.7.0, the game supports auto-discovery of servers on the LAN.

Request

A client requests that servers announce themselves by broadcasting from an ephermal UDP port to 255.255.255.255:3100, sending a single byte: 0x05 (ENQ). It should then listen for responses from servers.

Response

A server that receives an ENQ on UDP port 3100 responds with the following:

  1. 0x06 (ACK)
  2. the host's IP address (string)
  3. the host's name (string)
  4. 0x00 (NUL)

A string is transmitted by first sending the length of the string in bytes as a 16-bit integer, followed by the ASCII-encoded string itself. The string is not null-terminated.

The IP address of the host does not include the port number. If the server and client do not have the same port number configured in artemis.ini, the client will discover the server but fail to connect to it. This has been reported as a bug in the Artemis forums.

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. GameStartPacket
  4. AllShipSettingsPacket

Client clicks "Ready" while simulation is already running

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

Single-seat carft is launched

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

Single-seat craft is docked

  1. HelmRequestDockPacket (sent by the single-seat craft)
  2. DestroyObjectPacket (destroys the single-seat craft object)
  3. FighterBayStatusPacket (informing that the single-seat craft is now in the bay)
  4. ObjectUpdatePacket (the docked single-seat craft is no longer a separate ship object)

Vessel Data

Information about vessels are stored in dat/vesselData.xml. This section provides documentation for the tags used in this file.

art

parent: <vessel>, count: 1-n

Provides paths to files used to create the 3D models seen in the game.

Attributes

diffuseFile (string)

The base texture file.

glowFile (string)

Replaces the base texture in shadowed areas of the vessel.

meshFile (string)

The actual 3D model, must be a .dxs file.

pushRadius (float)

The collision distance for the vessel. Other vessel models will be kept out of this range.

scale (float)

Scales the 3D model.

specularFile (string)

Defines how shiny surfaces are.

beam_port

parent: <vessel>, count: 0-n

Represents a beam port on the vessel.

Attributes

arcwidth (float)

The (in radians) width of the beam arc.

cycletime (integer, 0-n)

The time (in seconds) this port requires to cool down between shots.

damage (integer, 0-n)

How much damage is inflicted per shot by this beam port.

range (integer, 0-n)

The maximum distance this beam can fire.

x, y, z

Coordinates for the beam port's location on the 3D model. The position of this point relative to the origin determines the center of this port's beam arc.

carrierload

parent: <vessel>, count: 0-1

Information about the single-seat craft carried by this vessel. Only permitted for vessels with both the player and carrier broadTypes.

Attributes

bomber (integer, 0-n)

The number of bombers carried by this vessel.

fighter (integer, 0-n)

The number of fighters carried by this vessel.

drone_port

parent: <vessel>, count: 0-n

Represents a drone port on the vessel. Not supported for vessels with the player broadType.

Attributes

cycletime (integer, 0-n)

The time (in seconds) this port requires to cool down between shots.

damage (integer, 0-n)

How much damage is inflicted per shot by this drone port.

range (integer, 0-n)

The distance to the enemy at which this port will start firing drones.

x, y, z (float)

Coordinates for the drone port's location on the 3D model.

engine_port

parent: <vessel>, count: 0-n

Represents a engine port on the vessel. This is where the glowing engine trails are emitted.

Attributes

x, y, z (float)

Coordinates for the engine port's location on the 3D model.

fleet_ai

parent: <vessel>, count: 0-1

Not supported for vessels with the player broadType.

Attributes

commonality (integer)

hullRace

parent: <vessel_data>, count: 2-n

Represents a single game faction.

Attributes

ID (integer)
name (string)

Display name for this faction.

keys (string)

A space-delimited list of attributes for this faction. There are three categories of keys:

  • Stance
    • enemy: Enemies use these vessels
    • friendly: Allies use these vessels
    • player: Can be controlled by player
  • Fleet organization (enemy only)
    • loner: Flies alone outside of a fleet
    • standard: Form the core of fleets
    • support: Accompanies standard enemies
  • Behavior
    • biomech: Has hive mind, eats asteroids
    • hasspecials: Will have special abilities
    • jumpmaster: (player only) Has reduced jump cooldown and the combat jump
    • whalehater: Gets distracted with hunting whales
    • whalelover: Will attack anyone who shoots whales

Some additional notes:

  • Every faction must have at least one stance key, and every enemy must have exactly one fleet organization key.
  • There must be at least one faction with the player stance and at least one with the enemy stance.
  • The whalehater and whalelover keys are mutually exclusive.
  • At least one faction must have the biomech key, and at least one must have the hasspecials key.

impulse_point

parent: <vessel>, count: 0-n

Represents an impulse point on the vessel. Only applicable to vessels from enemy factions.

Attributes

x, y, z (float)

Coordinates for the impulse point's location on the 3D model.

internal_data

parent: <vessel>, count: 0-1

References an .snt file for ship internals. Only applicable for ships with the player broadType. See the Ship Internals section for details about the .snt format.

Attributes

file (string)

Path to the .snt file.

long_desc

parent: <vessel>, count: 1

An on-screen description of the vessel. Carats (^) are converted to newlines.

Attributes

text (string)

The description to display.

maneuver_point

parent: <vessel>, count: 0-n

Represents an maneuver point on the vessel. Only applicable to vessels from enemy factions.

Attributes

x, y, z (float)

Coordinates for the maneuver point's location on the 3D model.

performance

parent: <vessel>, count: 0-1

The vessel's performance specs. Not applicable to vessels with the base broadType.

Attributes

jumpefficiency (float, 0-n)

A multiplier on the jump drive's energy usage: less than 1.0 decreases energy usage, greater than 1.0 increases it.

shipefficiency (float, 0-n)

A multiplier on the vessel's energy usage: less than 1.0 decreases energy usage, greater than 1.0 increases it.

topspeed (float, 0-n)

The maximum speed of this ship.

turnrate (float, 0-n)

How fast the ship turns. This number is in degrees per second divided by 2500.

warpefficiency (float, 0-n)

A multiplier on the warp drive's energy usage: less than 1.0 decreases energy usage, greater than 1.0 increases it.

production

parent: <vessel>, count: 0-1

Only applicable to vessels with the base broadType. Controls how quickly the base produces weapons.

Attributes

coeff (float, 0-n)

The base's production speed; higher numbers mean faster production. Artemis spawns bases until the side has a total production of 4.0, so if you make a base with more than 4.0 production, it will never spawn.

shields

parent: <vessel>, count: 1

Declares shield strength for the vessel.

Attributes

back (integer, 0-n)

The maximum strength of the back shield. Bases always have 0 for this attribute, since they only have one shield.

front (integer, 0-n)

The maximum strength of the front shield.

player (integer, 0-n)

Only applicable to vessels with the fighter broadType. This is the shield strength used when the single-seat craft is flown by a player (as opposed to an NPC).

taunt

parent: <hullRace>, count: 1-n

Declares a single taunt for a faction.

Attributes

immunity (string)

The captain trait that makes them immune to this taunt.

text (string)

The taunt itself.

torpedo_station_port

parent: <vessel>, count: 0-n

Torpedo ports for friendly bases. Only applicable for vessels with the base broadType belonging to a faction with the friendly key.

Attributes

cycletime (integer, 0-n)

The time (in seconds) this port requires to cool down between shots.

damage (integer, 0-n)

How much damage is inflicted per shot by this port.

range (integer, 0-n)

The distance to the enemy at which this port will start firing torpedoes.

x, y, z (float)

Coordinates for the drone port's location on the 3D model.

torpedo_storage

parent: <vessel>, count: 0,5

How many of each torpedo type can be stored. Only applicable to vessels with the player broadType.

Attributes

amount (integer, 0-n)

The maximum number of torpedoes of this type that the vessel can store.

type (Ordnance type)

What type of ordnance is being declared.

torpedo_tube

parent: <vessel>, count: 0-6

Declares the locations of torpedo tubes. Only applicable for vessels with the player broadType.

Attributes

cycletime (integer, 0-n)

The time (in seconds) this port requires to cool down between shots.

range (integer, 0-n)

The maximum range of torpedoes fired by this port.

x, y, z (float)

Coordinates for the drone port's location on the 3D model.

vessel

parent: <vessel_data>, count: 0-n

The parent tag for each vessel.

Attributes

broadType (string)

A space-delimite list of attributes for this vessel. There are three categories of broadTypes:

  • Vessel class
    • base: Immovable vessels that can resupply other vessels
    • carrier: Can launch single-seat craft
    • fighter: Single-seat craft launched from carriers
    • large: Large non-player vessels
    • medium: Medium non-player vessels
    • player: Vessels which players can control
    • small: Small non-player vessels
  • Friendly type
    • cargo: Has no weapons
    • luxury: Has no weapons
    • science: Has no weapons
    • transport: Has no weapons
    • warship: Has weapons and can assist players in combat
  • Biomech traits
    • anomalyeater: Eats anomalies
    • asteroideater: Eats asteroids
    • sentient: Can respond to hails and calm the tribe

Additional notes:

  • Some broadTypes are mutually exclusive: base and all other broadTypes except carrier; carrier and fighter; small, medium, large, and fighter.
  • The friendly type broadTypes can only be used by vessels belonging to factions with the friendly key.
  • The anomalyeater, asteroideater and sentient broadTypes are only applicable to vessels belonging to a faction with the biomech key.
classname (string)

The name of the vessel type, as it appears in science scans.

side (integer, 0-n)

The faction to which the ship belongs, corresponding to the <hullRace ID> attribute.

uniqueID (integer, 0-n)

An ID assigned to this vessel. Player ships must start at 0 and increase sequentially; others can use whatever ID they like.

vessel_data

parent: none, count: 1

The root tag for the vesselData.xml file.

Attributes

version (string)

The version of the vesselData.xml schema used.

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.

Known Implementations

The following table provides links to known implementations of the protocols described in this document (other than the official Artemis software). These implementations are in various states of completion and may or may not be suitable for your purposes. See their corresponding sites for information about each project's current status.

Name Language License GitHub status
Artemis Bridge Tools C++ closed source n/a
node-asbs-lib JavaScript "Beer-ware"
huin/artemis Go BSD 2-Clause "Simplified"
IAN Java MIT
libdiana Python MIT
parser.pl Perl none n/a