#pragma once

bool autocvar_g_allow_checkpoints;

// scores
const float ST_RACE_LAPS = 1;

int autocvar_g_cts_send_rankings_cnt = 15;
bool autocvar_g_race_cptimes_onlyself = false;

int g_race_qualifying;

float speedaward_lastsent;
float speedaward_lastupdate;

float race_spawns;
float race_highest_place_spawn; // number of places; a place higher gets spawned at 0
float race_lowest_place_spawn; // where to spawn in qualifying
float race_fraglimit;
float race_leadlimit;
float race_timelimit;
.float race_place;
.float race_started;
.float race_completed;
.float race_laptime;
float race_completing;

.float race_movetime; // for reading
.float race_movetime_frac; // fractional accumulator for higher accuracy (helper for writing)
.float race_movetime_count; // integer accumulator

.float race_respawn_checkpoint;
.entity race_respawn_spotref; // try THIS spawn in case you respawn

// definitions for functions used outside race.qc
void write_recordmarker(entity pl, float tstart, float dt);

float race_PreviousCheckpoint(float f);
float race_NextCheckpoint(float f);
void race_AbandonRaceCheck(entity p);
void race_ImposePenaltyTime(entity pl, float penalty, string reason);
void race_StartCompleting();
float race_GetFractionalLapCount(entity e);
float race_readTime(string map, float pos);
string race_readUID(string map, float pos);
string race_readName(string map, float pos);

void race_checkAndWriteName(entity player);
void race_ClearPlayerRecords(entity player);
void race_ClearRecords();
void race_SendNextCheckpoint(entity e, float spec);
void race_PreparePlayer(entity this);
void race_send_recordtime(float msg);

void race_setTime(string map, float t, string myuid, string mynetname, entity e, bool showmessage);

float speedaward_speed;
string speedaward_holder;
string speedaward_uid;

float speedaward_alltimebest;
string speedaward_alltimebest_holder;
string speedaward_alltimebest_uid;

void race_send_speedaward(float msg);
void race_send_speedaward_alltimebest(float msg);
void race_SpeedAwardFrame(entity player);

void race_send_rankings_cnt(float msg);
void race_SendRanking(float pos, float prevpos, float del, float msg);
void race_SendAll(entity player, bool only_rankings);

void race_RetractPlayer(entity this);

string uid2name(string myuid);

spawnfunc(target_checkpoint);
