fteqw/engine/client/sys_xdk.c
Spoike 09ec3bf6ea added explicit 'blend rtsmoke' particles that are intended to lit by rtlights without needing to override shaders.
addtrisoup_simple now supports line lists too.
fix a memory leak in the sound code.
fix chunked http download corruption in certain cases.
reworked the networking associated with entity editing. now carries ids instead of indexes (qc isn't aware of them).
'map blarg.map' will now auto-create a dummy map if it does not already exist. this should make it easier to get started with map editing.
fix some issues with banning yourself - loopback can now mute etc themselves, but not ban themselves.
downloads/updates menu now handles plugin detection. user-installed plugins will result in a prompt allowing the user to enable/disable/delete them. This makes using plugins more explicit.
revamped help menu to remove m_state
fix silly ode copypasta bug, added preliminary bullet code in case anyone is interested.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5090 fc73d0e0-1445-4013-8a0c-d673dee63da5
2017-04-18 11:12:17 +00:00

255 lines
6.4 KiB
C

#include "quakedef.h"
#include <xtl.h>
#define MAXPRINTMSG 1024 // Yes
qboolean isDedicated = false;
/*Timers, supposedly xbox supports QueryPerformanceCounter stuff*/
double Sys_DoubleTime (void)
{
static int first = 1;
static LARGE_INTEGER qpcfreq;
LARGE_INTEGER PerformanceCount;
static LONGLONG oldcall;
static LONGLONG firsttime;
LONGLONG diff;
QueryPerformanceCounter (&PerformanceCount);
if (first)
{
first = 0;
QueryPerformanceFrequency(&qpcfreq);
firsttime = PerformanceCount.QuadPart;
diff = 0;
}
else
diff = PerformanceCount.QuadPart - oldcall;
if (diff >= 0)
oldcall = PerformanceCount.QuadPart;
return (oldcall - firsttime) / (double)qpcfreq.QuadPart;
}
unsigned int Sys_Milliseconds (void)
{
return Sys_DoubleTime()*1000;
}
NORETURN void VARGS Sys_Error (const char *error, ...)
{
//FIXME: panic! everyone panic!
//you might want to figure out some way to display the message...
for(;;)
;
}
void Sys_Sleep(double seconds)
{ //yields to other processes/threads for a bit.
}
void Sys_Quit (void)
{
#if 0
Host_Shutdown ();
//successful execution.
//should go back to the system menu or something, or possibly longjmp out of the main loop.
for (;;)
;
exit(1);
#endif
}
void Sys_Shutdown(void)
{
}
void Sys_Init(void)
{ //register system-specific cvars here
}
/*prints to dedicated server console or debug output*/
void VARGS Sys_Printf (char *fmt, ...)
{
va_list argptr;
char msg[MAXPRINTMSG];
va_start (argptr,fmt);
vsnprintf(msg,sizeof(msg)-1, fmt,argptr);
msg[sizeof(msg)-1] = 0; //_vsnprintf sucks.
va_end (argptr);
//no idea what the stdout is hooked up to, lets try it anyway.
printf("%s", msg);
}
/*returns the system video mode settings, ish*/
qboolean Sys_GetDesktopParameters(int *width, int *height, int *bpp, int *refreshrate)
{
//FIXME: use XGetVideoStandard or XGetVideoFlags or something
*width = 640;
*height = 480;
*bpp = 32;
*refreshrate = 60;
return true;
}
/*dedicated server type stuff*/
qboolean Sys_InitTerminal(void)
{
return false; //failure
}
void Sys_CloseTerminal (void)
{
}
char *Sys_ConsoleInput (void)
{ //returns any text typed on the stdin, when acting as a dedicated server.
//this includes debugger commands if we're integrated with fteqccgui
return NULL;
}
/*various system notifications*/
void Sys_ServerActivity(void)
{ //player joined the server or said something. would normally flash the app in the system tray.
}
void Sys_RecentServer(char *command, char *target, char *title, char *desc) {
}
/*check any system message queues here*/
void Sys_SendKeyEvents(void)
{
}
qboolean Sys_RandomBytes(qbyte *string, int len)
{
//FIXME: should return some cryptographically strong random number data from some proper crypto library. C's rand function isn't really strong enough.
return false;
}
/*filesystem stuff*/
void Sys_mkdir (char *path)
{
}
qboolean Sys_remove (char *path)
{
return false; //false for failure
}
qboolean Sys_Rename (char *oldfname, char *newfname)
{
return false; //false for failure
}
int Sys_EnumerateFiles (const char *gpath, const char *match, int (QDECL *func)(const char *fname, qofs_t fsize, void *parm, searchpathfuncs_t *spath), void *parm, searchpathfuncs_t *spath)
{
//if func returns false, abort with false return value, otherwise return true.
//use wildcmd to compare two filenames
//note that match may contain wildcards and multiple directories with multiple wildcards all over.
return true;
}
/*consoles don't tend to need system clipboards, so this is fully internal to our engine*/
#define SYS_CLIPBOARD_SIZE 256
static char clipboard_buffer[SYS_CLIPBOARD_SIZE] = {0};
char *Sys_GetClipboard(void)
{
return clipboard_buffer;
}
void Sys_CloseClipboard(char *bf)
{
}
void Sys_SaveClipboard(char *text)
{
Q_strncpyz(clipboard_buffer, text, SYS_CLIPBOARD_SIZE);
}
/*dynamic library stubs*/
dllhandle_t *Sys_LoadLibrary(const char *name, dllfunction_t *funcs)
{
Con_Printf("Sys_LoadLibrary: %s\n", name);
return NULL;
}
void Sys_CloseLibrary(dllhandle_t *lib)
{
}
void *Sys_GetAddressForName(dllhandle_t *module, const char *exportname)
{
return NULL; //unsupported
}
char *Sys_GetNameForAddress(dllhandle_t *module, void *address)
{
return NULL; //unsupported (on most platforms, actually)
}
void main( int argc, char **argv)
{
float time, lasttime;
quakeparms_t parms;
memset(&parms, 0, sizeof(parms));
parms.argc = argc;
parms.argv = argv;
#ifdef CONFIG_MANIFEST_TEXT
parms.manifest = CONFIG_MANIFEST_TEXT;
#endif
COM_InitArgv(parms.argc, parms.argv);
TL_InitLanguages(parms.basedir);
Host_Init(&parms);
//main loop
lasttime = Sys_DoubleTime();
while (1)
{
time = Sys_DoubleTime();
Host_Frame(time - lasttime);
lasttime = time;
}
}
/*input stubs
in_generic.c should make these kinda useless, but sometimes you need more than the following three functions:
void IN_JoystickAxisEvent(unsigned int devid, int axis, float value);
void IN_KeyEvent(unsigned int devid, int down, int keycode, int unicode);
void IN_MouseMove(unsigned int devid, int abs, float x, float y, float z, float size);
that said, if they're enough, then just call those in Sys_SendKeyEvents. You can also call them from other threads just fine.
their devid values should be assigned only when a button is first pressed, or something, so controllers get assigned to seats in the order that they're pressed. so player 1 always hits a button first to ensure that they are player 1.
or just hardcode those based upon usbport numbers, but that's unreliable with usb hubs.
*/
void INS_Shutdown (void)
{
}
void INS_ReInit (void)
{
}
void INS_Move(float *movements, int pnum)
{
//accululates system-specific inputs on a per-seat basis.
}
void INS_Init (void)
{
}
void INS_Accumulate(void) //input polling
{
}
void INS_Commands (void) //used to Cbuf_AddText joystick button events in windows.
{
}
void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, unsigned int *qdevid))
{
#if 0
unsigned int i;
for (i = 0; i < MAX_JOYSTICKS; i++)
if (sdljoy[i].controller)
callback(ctx, "joy", sdljoy[i].devname, &sdljoy[i].qdevid);
#endif
}
void INS_SetupControllerAudioDevices (void) // Not used
{
}
void INS_UpdateGrabs (void) // Not used
{
}