diff --git a/engine/client/sys_sdl.c b/engine/client/sys_sdl.c new file mode 100644 index 000000000..73192b638 --- /dev/null +++ b/engine/client/sys_sdl.c @@ -0,0 +1,291 @@ +#include "quakedef.h" + +#include + +#ifndef WIN32 +#include +#endif + +qboolean isDedicated; + + +void Sys_Error (const char *error, ...) +{ + va_list argptr; + char string[1024]; + + va_start (argptr,error); + vsnprintf (string, sizeof (string), error, argptr); + va_end (argptr); + fprintf(stderr, "Error: %s\n", string); + + Con_Print ("Quake Error: "); + Con_Print (string); + Con_Print ("\n"); + + Host_Shutdown (); + exit (1); +} + +//print into stdout +void Sys_Printf (char *fmt, ...) +{ + va_list argptr; + + va_start (argptr,fmt); + vprintf (fmt,argptr); + va_end (argptr); +} + +//return the current time, in the form of a double +double Sys_DoubleTime (void) +{ + static int first = true; + static double oldtime = 0.0, curtime = 0.0; + double newtime; + + newtime = (double) SDL_GetTicks() / 1000.0; + + + if (first) + { + first = false; + oldtime = newtime; + } + + if (newtime < oldtime) + { + // warn if it's significant + if (newtime - oldtime < -0.01) + Con_Printf("Sys_DoubleTime: time stepped backwards (went from %f to %f, difference %f)\n", oldtime, newtime, newtime - oldtime); + } + else + curtime += newtime - oldtime; + oldtime = newtime; + + return curtime; +} + +//create a directory +void Sys_mkdir (char *path) +{ +#if WIN32 + _mkdir (path); +#else + mkdir (path, 0777); //WARNING: DO NOT RUN AS ROOT! +#endif +} + +//unlink a file +qboolean Sys_remove (char *path) +{ + remove(path); + + return true; +} + +//someone used the 'quit' command +void Sys_Quit (void) +{ + if (VID_ForceUnlockedAndReturnState) + VID_ForceUnlockedAndReturnState (); + + Host_Shutdown(); + + exit (0); +} + +//enumerate the files in a directory (of both gpath and match - match may not contain ..) +//calls the callback for each one until the callback returns 0 +//SDL provides no file enumeration facilities. +int Sys_EnumerateFiles (char *gpath, char *match, int (*func)(char *, int, void *), void *parm) +{ + return 1; +} + +//blink window if possible (it's not) +void Sys_ServerActivity(void) +{ +} + + + +//Without these two we cannot run Q2 gamecode. +void Sys_UnloadGame (void) +{ +} +void *Sys_GetGameAPI (void *parms) +{ + return NULL; +} + + + +//used to see if a file exists or not. +int Sys_FileTime (char *path) +{ + FILE *f; + + f = fopen(path, "rb"); + if (f) + { + fclose(f); + return 1; + } + + return -1; +} + +void Sys_Init(void) +{ + SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_CDROM | SDL_INIT_NOPARACHUTE); +} + + + + +void VARGS Sys_DebugLog(char *file, char *fmt, ...) +{ + FILE *fd; + va_list argptr; + static char data[1024]; + + va_start(argptr, fmt); + _vsnprintf(data, sizeof(data)-1, fmt, argptr); + va_end(argptr); + +#if defined(CRAZYDEBUGGING) && CRAZYDEBUGGING > 1 + { + static int sock; + if (!sock) + { + struct sockaddr_in sa; + netadr_t na; + int _true = true; + int listip; + listip = COM_CheckParm("-debugip"); + NET_StringToAdr(listip?com_argv[listip+1]:"127.0.0.1", &na); + NetadrToSockadr(&na, (struct sockaddr_qstorage*)&sa); + sa.sin_port = htons(10000); + sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (-1==connect(sock, (struct sockaddr*)&sa, sizeof(sa))) + Sys_Error("Couldn't send debug log lines\n"); + setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char*)&_true, sizeof(_true)); + } + send(sock, data, strlen(data), 0); + } +#endif + fd = fopen(file, "wt"); + fwrite(data, 1, strlen(data), fd); + fclose(fd); +}; + + + +qboolean Sys_InitTerminal(void) +{ + return true; +} +char *Sys_ConsoleInput(void) +{ + return NULL; +} +void Sys_CloseTerminal (void) +{ +} + +#ifdef _WIN32 +#include +#endif +int SDL_main(int argc, char **argv) +{ + float time, newtime, oldtime; + quakeparms_t parms; + int t; + + parms.argv = argv; + + parms.basedir = "."; + parms.cachedir = NULL; + + parms.argc = argc; + parms.argv = argv; + +#ifndef WIN32 + fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY); +#endif + + COM_InitArgv (parms.argc, parms.argv); + + TL_InitLanguages(); + + parms.memsize = 0x0800000; + + if (parms.memsize < 0x0800000) + parms.memsize = 0x0800000; + + + if (COM_CheckParm ("-heapsize")) + { + t = COM_CheckParm("-heapsize") + 1; + + if (t < com_argc) + parms.memsize = Q_atoi (com_argv[t]) * 1024; + } + else if (COM_CheckParm ("-mem")) + { + t = COM_CheckParm("-mem") + 1; + + if (t < com_argc) + parms.memsize = Q_atoi (com_argv[t]) * 1024*1024; + } + + +#ifdef _WIN32 + parms.membase = VirtualAlloc (NULL, parms.memsize, MEM_RESERVE, PAGE_NOACCESS); +#else + parms.membase = malloc (parms.memsize); +#endif + Sys_Init (); + + Sys_Printf ("Host_Init\n"); + Host_Init (&parms); + + oldtime = Sys_DoubleTime (); + + +//client console should now be initialized. + + /* main window message loop */ + while (1) + { +#ifndef CLIENTONLY + if (isDedicated) + { + NET_Sleep(100, false); + + // find time passed since last cycle + newtime = Sys_DoubleTime (); + time = newtime - oldtime; + oldtime = newtime; + + SV_Frame (time); + } + else +#endif + { + // yield the CPU for a little while when paused, minimized, or not the focus + NET_Sleep(1, false); + + newtime = Sys_DoubleTime (); + time = newtime - oldtime; + Host_Frame (time); + oldtime = newtime; + } + } + return 0; +} + + + +