mirror of
https://git.code.sf.net/p/quake/quakeforge-old
synced 2024-11-11 23:21:41 +00:00
3f74fe38b8
default game name from "id1" to "base". This allows you to have full and shareware version's of Id's pak's installed, as well as other full TC's you want.. You may want to make base a symlink to id1 for now since you currently can't have multiple -game's, that's my next fix.
195 lines
4 KiB
C
195 lines
4 KiB
C
/*
|
|
Copyright (C) 1996-1997 Id Software, Inc.
|
|
Copyright (C) 1999,2000 contributors of the QuakeForge project
|
|
Please see the file "AUTHORS" for a list of contributors
|
|
|
|
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 <sys/types.h>
|
|
#include "qwsvdef.h"
|
|
|
|
#ifdef NeXT
|
|
#include <libc.h>
|
|
#endif
|
|
|
|
// FIXME: use autoconf
|
|
#if defined(unix) || defined(_AIX)
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
#include <sys/time.h>
|
|
#include <errno.h>
|
|
#else
|
|
#include <sys/dir.h>
|
|
#endif
|
|
|
|
extern cvar_t sys_nostdout;
|
|
|
|
cvar_t sys_extrasleep = {"sys_extrasleep","0"};
|
|
qboolean stdin_ready;
|
|
|
|
/*
|
|
===============================================================================
|
|
|
|
REQUIRED SYS FUNCTIONS
|
|
|
|
===============================================================================
|
|
*/
|
|
|
|
/*
|
|
================
|
|
Sys_Error
|
|
================
|
|
*/
|
|
void Sys_Error (char *error, ...)
|
|
{
|
|
va_list argptr;
|
|
char string[1024];
|
|
|
|
va_start (argptr, error);
|
|
vsnprintf (string, sizeof(string), error, argptr);
|
|
va_end (argptr);
|
|
printf ("Fatal error: %s\n",string);
|
|
|
|
exit (1);
|
|
}
|
|
|
|
|
|
/*
|
|
================
|
|
Sys_Quit
|
|
================
|
|
*/
|
|
void Sys_Quit (void)
|
|
{
|
|
exit (0); // appkit isn't running
|
|
}
|
|
|
|
static int do_stdin = 1;
|
|
|
|
/*
|
|
================
|
|
Sys_ConsoleInput
|
|
|
|
Checks for a complete line of text typed in at the console, then forwards
|
|
it to the host command processor
|
|
================
|
|
*/
|
|
char *Sys_ConsoleInput (void)
|
|
{
|
|
static char text[256];
|
|
int len;
|
|
|
|
if (!stdin_ready || !do_stdin)
|
|
return NULL; // the select didn't say it was ready
|
|
stdin_ready = false;
|
|
|
|
len = read (0, text, sizeof(text));
|
|
if (len == 0) {
|
|
// end of file
|
|
do_stdin = 0;
|
|
return NULL;
|
|
}
|
|
if (len < 1)
|
|
return NULL;
|
|
text[len-1] = 0; // rip off the /n and terminate
|
|
|
|
return text;
|
|
}
|
|
|
|
/*
|
|
=============
|
|
Sys_Init
|
|
|
|
Quake calls this so the system can register variables before host_hunklevel
|
|
is marked
|
|
=============
|
|
*/
|
|
void Sys_Init (void)
|
|
{
|
|
Cvar_RegisterVariable (&sys_nostdout);
|
|
Cvar_RegisterVariable (&sys_extrasleep);
|
|
}
|
|
|
|
/*
|
|
=============
|
|
main
|
|
=============
|
|
*/
|
|
int main(int argc, char *argv[])
|
|
{
|
|
double time, oldtime, newtime;
|
|
quakeparms_t parms;
|
|
fd_set fdset;
|
|
extern int net_socket;
|
|
struct timeval timeout;
|
|
int j;
|
|
|
|
memset (&parms, 0, sizeof(parms));
|
|
|
|
COM_InitArgv (argc, argv);
|
|
parms.argc = com_argc;
|
|
parms.argv = com_argv;
|
|
|
|
parms.memsize = 16*1024*1024;
|
|
|
|
j = COM_CheckParm("-mem");
|
|
if (j)
|
|
parms.memsize = (int) (Q_atof(com_argv[j+1]) * 1024 * 1024);
|
|
if ((parms.membase = malloc (parms.memsize)) == NULL)
|
|
Sys_Error("Can't allocate %ld\n", parms.memsize);
|
|
|
|
parms.basedir = ".";
|
|
|
|
SV_Init (&parms);
|
|
|
|
// run one frame immediately for first heartbeat
|
|
SV_Frame (0.1);
|
|
|
|
//
|
|
// main loop
|
|
//
|
|
oldtime = Sys_DoubleTime () - 0.1;
|
|
while (1)
|
|
{
|
|
// select on the net socket and stdin
|
|
// the only reason we have a timeout at all is so that if the last
|
|
// connected client times out, the message would not otherwise
|
|
// be printed until the next event.
|
|
FD_ZERO(&fdset);
|
|
if (do_stdin)
|
|
FD_SET(0, &fdset);
|
|
FD_SET(net_socket, &fdset);
|
|
timeout.tv_sec = 1;
|
|
timeout.tv_usec = 0;
|
|
if (select (net_socket+1, &fdset, NULL, NULL, &timeout) == -1)
|
|
continue;
|
|
stdin_ready = FD_ISSET(0, &fdset);
|
|
|
|
// find time passed since last cycle
|
|
newtime = Sys_DoubleTime ();
|
|
time = newtime - oldtime;
|
|
oldtime = newtime;
|
|
|
|
SV_Frame (time);
|
|
|
|
// extrasleep is just a way to generate a fucked up connection on purpose
|
|
if (sys_extrasleep.value)
|
|
usleep (sys_extrasleep.value);
|
|
}
|
|
exit(0);
|
|
}
|
|
|