WHAT’S ALL THIS THEN?

Zeepkist GTR is a mod for Zeepkist, an indie game on Steam.

It is a combination of multiple pieces of software that work together to give players the ability to a couple of different things:

WHERE CAN I GET IT?

The mod is still in “early access” and is therefore only available through the dedicated Zeepkist GTR thread in the Zeepkist Modding Discord.

If you are interested in working with the api then I suggest you go over to https://api.zeepkist-gtr.com/

GHOST SCHEMAS

V4
public class Ghost
{
    public int version = 4;
    public ulong steamId;
    public int soapboxId;
    public int hatId;
    public int colorId;
    public byte framePrecision;
    public int frameCount;
    public Frame[frameCount] frames;

    public abstract class Frame
    {
    }

    public class ResetFrame : Frame
    {
        public float time;
        public float positionX;
        public float positionY;
        public float positionZ;
        public short rotationX;
        public short rotationY;
        public short rotationZ;
        public short rotationW;
        public byte steering;
        public Flags flags;
    }

    public class DeltaFrame : Frame
    {
        public float time;
        public short positionX;
        public short positionY;
        public short positionZ;
        public short rotationX;
        public short rotationY;
        public short rotationZ;
        public short rotationW;
        public byte steering;
        public Flags flags;
    }

    public enum Flags : byte
    {
        None = 0,
        ArmsUp = 1 << 0,
        IsBraking = 1 << 1
    }
}

Notes

ResetFrame or DeltaFrame

To figure out if a frame is a ResetFrame or a DeltaFrame you should use the value of framePrecision. An example can be seen below.

for (int i = 0; i < frameCount; i++)
{
    bool isResetFrame = i % framePrecision == 0;
    ...
}

Converting DeltaFrame Position

The position in the delta frames is saved as three 16-bit integers (shorts). The conversion method is relatively simple:

The conversion from short (x) to float (y) is y = x / 10000f

Converting rotation

The rotation in both frame types is a quaternion saved as four 16-bit integers (shorts). This conversion is also relatively simple:

The conversion from short (x) to float (y) is y = x / 30000f

V3
public class Ghost
{
    public int version = 3;
    public ulong steamId;
    public int soapboxId;
    public int hatId;
    public int colorId;
    public int frameCount;
    public Frame[frameCount] frames;

    public class Frame
    {
        public float time;
        public float xPosition;
        public float yPosition;
        public float zPosition;
        public float xRotation; // euler
        public float yRotation; // euler
        public float zRotation; // euler
        public float steering; // range from -1 to 1
        public bool armsUp;
        public bool isBraking;
    }
}
V2
public class Ghost
{
    public int version = 2;
    public ulong steamId;
    public int soapboxId;
    public int hatId;
    public int colorId;
    public int frameCount;
    public Frame[frameCount] frames;

    public class Frame
    {
        public float time;
        public float xPosition;
        public float yPosition;
        public float zPosition;
        public float xRotation; // euler
        public float yRotation; // euler
        public float zRotation; // euler
    }
}
V1
public class Ghost
{
    public int version = 1;
    public int frameCount;
    public Frame[frameCount] frames;

    public class Frame
    {
        public float time;
        public float xPosition;
        public float yPosition;
        public float zPosition;
        public float xRotation; // euler
        public float yRotation; // euler
        public float zRotation; // euler
    }
}

SPECIAL THANKS

In alphabetical order: