/* Copyright (C) 1996-1997 Id Software, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ //#include //#include #include "qwsvdef.h" #include #include #include #include // _mkdir cvar_t sys_sleep = {"sys_sleep", "8"}; cvar_t sys_nostdout = {"sys_nostdout","0"}; qboolean WinNT; /* ================ Sys_FileTime ================ */ int Sys_FileTime (char *path) { FILE *f; f = fopen(path, "rb"); if (f) { fclose(f); return 1; } return -1; } /* ================ Sys_mkdir ================ */ void Sys_mkdir (char *path) { _mkdir(path); } /* ================ Sys_Error ================ */ void Sys_Error (char *error, ...) { va_list argptr; char text[1024]; va_start (argptr, error); vsnprintf (text, sizeof(text), error, argptr); va_end (argptr); // MessageBox(NULL, text, "Error", 0 /* MB_OK */ ); printf ("ERROR: %s\n", text); exit (1); } double Sys_DoubleTime (void) { static DWORD starttime; static qboolean first = true; DWORD now; now = timeGetTime(); if (first) { first = false; starttime = now; return 0.0; } if (now < starttime) // wrapped? return (now / 1000.0) + (LONG_MAX - starttime / 1000.0); if (now - starttime == 0) return 0.0; return (now - starttime) / 1000.0; } /* ================ Sys_ConsoleInput ================ */ char *Sys_ConsoleInput (void) { static char text[256]; static int len; int c; // read a line out while (_kbhit()) { c = _getch(); if (c == 224) { if (_kbhit()) { // assume escape sequence (arrows etc), skip _getch(); continue; } // assume character } if (c < 32 && c != '\r' && c != 8) continue; putch (c); if (c == '\r') { text[len] = 0; putch ('\n'); len = 0; return text; } if (c == 8) { if (len) { putch (' '); putch (c); len--; text[len] = 0; } continue; } text[len] = c; len++; text[len] = 0; if (len == sizeof(text)) len = 0; } return NULL; } /* ================ Sys_Printf ================ */ void Sys_Printf (char *fmt, ...) { va_list argptr; if (sys_nostdout.value) return; va_start (argptr,fmt); vprintf (fmt,argptr); va_end (argptr); } /* ================ Sys_Quit ================ */ void Sys_Quit (void) { exit (0); } /* ============= Sys_Init Quake calls this so the system can register variables before host_hunklevel is marked ============= */ void Sys_Init (void) { OSVERSIONINFO vinfo; // make sure the timer is high precision, otherwise // NT gets 18ms resolution timeBeginPeriod( 1 ); vinfo.dwOSVersionInfoSize = sizeof(vinfo); if (!GetVersionEx (&vinfo)) Sys_Error ("Couldn't get OS info"); if ((vinfo.dwMajorVersion < 4) || (vinfo.dwPlatformId == VER_PLATFORM_WIN32s)) { Sys_Error ("QuakeWorld requires at least Win95 or NT 4.0"); } if (vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT) WinNT = true; else WinNT = false; Cvar_Register (&sys_sleep); Cvar_Register (&sys_nostdout); if (COM_CheckParm ("-nopriority")) { Cvar_Set (&sys_sleep, "0"); } else { if ( ! SetPriorityClass (GetCurrentProcess(), HIGH_PRIORITY_CLASS)) Com_Printf ("SetPriorityClass() failed\n"); else Com_Printf ("Process priority class set to HIGH\n"); // sys_sleep > 0 seems to cause packet loss on WinNT (why?) if (WinNT) Cvar_Set (&sys_sleep, "0"); } } /* ================== main ================== */ int main (int argc, char **argv) { double newtime, time, oldtime; int sleep_msec; Host_Init (argc, argv, 16*1024*1024); // // main loop // oldtime = Sys_DoubleTime () - 0.1; while (1) { sleep_msec = sys_sleep.value; if (sleep_msec > 0) { if (sleep_msec > 13) sleep_msec = 13; Sleep (sleep_msec); } NET_Sleep (1); // find time passed since last cycle newtime = Sys_DoubleTime (); time = newtime - oldtime; oldtime = newtime; Host_Frame (time); } return true; }