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:
- Set both personal and/or world records
- Automatically record ghosts and compete against your best one per track
- Race against ghosts from other players in offline play (excluding split-screen)
- Marking tracks as favorites
- You can upvote your tracks, or give it a numerical rating between 1 and 5 for specific categories
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:
- Akane
- Diabler
- Froggy the Kawaii Frog.
- Hydro
- Jakie Cash
- LostCharacter
- Metalted
- RonanC
- Rorroh
- Sliced
- Warcans
- Wolfyyy
- jandje
- justMaki
- rsgold
- st_nicholas
- trbodev
- voidwyrm