#ifndef __GAMEINITEXIT
#define __GAMEINITEXIT

#include "vectors.h"
#include "entities.h"
#include "fileio.h"

#define kMaxPlayers 12
#define kMaxLaps 100
#define kNumCheckPoints 64
#define kMaxCornerSigns 64

typedef struct{
	tFileRef model;
	int color;
	int envFlags;
	int untouchable;
	tVector3 pos,dir;
}tMapObjectDef;

typedef struct{
	float time;
	tGameEntity *setBy;
	int hit;
}tPassTimeRec;

typedef struct{
	float index;
	tPassTimeRec passTimes[kMaxLaps+2];
}tCheckPoint;

typedef struct{
	float pos;
	float accel;
}tCornerSign;

typedef struct{
	tVector3 a,b,c;
}tVisWall;

typedef struct{
	int envFlags;
	int lightEnable;
	float fogBegin,fogEnd;
	float fogOscillation,fogOscillationSpeed;
	tVector3 fogColor;
	tVector3 lightDir,flareDir;
	tFileRef sky0,sky90,sky180,sky270,skytop,skybot;
	tFileRef spheremap;
	tFileRef lightMap;
	tVector2 lightMapTopLeft,lightMapBotRight,lightMapSpeed;
	tFileRef lightMap2;
	tVector2 lightMap2TopLeft,lightMap2BotRight,lightMap2Speed;
}tMapEnv;

typedef struct{
	tFileRef road;
	tFileRef image;
	int loop,dirtEnable;
	int hideMap;
	int dontDrawRoad;
	int builtIn;
	int demoAvailable;
	int needsToStop;
	int useAltEnv;
	tFileRef dirtMap;
	int maxPlayers;
	int hasOverview;
	tFileRef overview;
	tVector2 overviewTopLeft,overviewBotRight;
	
	char name[256];
	int playerPos;
	int reverse;
	float startLineOffset,startCenterOffset,carOffset;
	float speedFactor;
	float dirtIntensity;
	tVector3 startPos;
	tVector3 finishPos;
	tFileRef roadTypes;
	int numObjs;
	tMapObjectDef *obj;
	int numVisWalls;
	int baseSurfaceType;
	tVisWall *visWalls;
	int numMapEnvs;
	tMapEnv* mapEnv;
}tMapInfo;

enum {
	kGameInfoNetworkEnable=1<<0,
	kGameInfoNetworkForcePlayerCar=1<<1,
	kGameInfoNetworkCantGoBackwards=1<<2
};

#define kMaxNameLength 64

enum {
	kGameModeSim=0,
	kGameModeArcade,
	kGameModeTurbo,
	kGameModeStrict
};

typedef struct{
	UInt8 inited;
	UInt8 numNetPlayers;
	UInt8 numPlayers;
	UInt8 reverse;
	SInt8 numLaps;
	UInt8 network;
	UInt8 playerID;
	SInt8 arcade;
	UInt8 carsOnSpeed;
	UInt8 demolition;
	UInt8 unused1;
	UInt8 unused2;
	float maxTime,silverTime,goldTime;
	UInt32 version;
	tFileRef map;
	tFileRef environment;
	char environmentName[kMaxFileNameLength];
	char mapName[kMaxFileNameLength];
	UInt8 playerColors[kMaxPlayers];
	SInt8 netID[kMaxPlayers];
	tFileRef playerCars[kMaxPlayers];
	int playerAddOns[kMaxPlayers];
	float ping[kMaxPlayers];
	UInt8 playerInited[kMaxPlayers];
	int playerVersions[kMaxPlayers];
	char playerCarNames[kMaxPlayers][kMaxFileNameLength];
	char playerNames[kMaxPlayers][kMaxNameLength];
}tGameInfo;

typedef struct{
	UInt8 inited;
	UInt8 numNetPlayers;
	UInt8 numPlayers;
	UInt8 reverse;
	SInt8 numLaps;
	UInt8 network;
	SInt8 arcade;
	UInt8 carsOnSpeed;
	UInt8 demolition;
	UInt32 version;
	char environmentName[kMaxFileNameLength];
	char mapName[kMaxFileNameLength];
	UInt8 playerColors[kMaxPlayers];
	SInt8 netID[kMaxPlayers];
	int playerAddOns[kMaxPlayers];
	float ping[kMaxPlayers];
	UInt8 playerInited[kMaxPlayers];
	int playerVersions[kMaxPlayers];
	char playerCarNames[kMaxPlayers][kMaxFileNameLength];
	char playerNames[kMaxPlayers][kMaxNameLength];
}tNetGameInfo;

extern tMapInfo *gMapInfo;
extern tMapEnv *gMapEnv;
extern tGameInfo *gGameInfo;
extern int gReplay;
extern int gBackgroundReplay;
extern int gReplayAutoCam;
extern int gReplayViewedEntityID;
extern tGameEntity *gCarEntities[kMaxPlayers];
extern tGameEntity *gGhostEntity;
extern tCheckPoint gCheckPoints[kNumCheckPoints];
extern int gNumCornerSigns;
extern tCornerSign gCornerSigns[kMaxCornerSigns];
extern int gReplayOldFrameCount;

void InitGInfo(tGameInfo *gInfo);
int RunGame(tGameInfo *gInfo);

void StartReplay();
void RunReplay();
int ReplayFrame();

#endif