mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-10 22:51:57 +00:00
Fix hexen2 cd tracks.
Fix zalon's crash. git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3605 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
9f29f8d97f
commit
dfd02ad9e3
13 changed files with 98 additions and 51 deletions
|
@ -104,21 +104,23 @@ static int CDAudio_GetAudioDiskInfo(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifndef NOMEDIA
|
||||
void Media_FakeTrack(int i, qboolean loop);
|
||||
#endif
|
||||
|
||||
void CDAudio_Play(int track, qboolean looping)
|
||||
{
|
||||
DWORD dwReturn;
|
||||
MCI_PLAY_PARMS mciPlayParms;
|
||||
MCI_STATUS_PARMS mciStatusParms;
|
||||
|
||||
#ifndef NOMEDIA
|
||||
if (Media_FakeTrack(track, looping))
|
||||
{
|
||||
if (playing)
|
||||
CDAudio_Stop();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!enabled)
|
||||
{
|
||||
#ifndef NOMEDIA
|
||||
Media_FakeTrack(track, looping);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -1220,6 +1220,7 @@ typedef struct cin_s cin_t;
|
|||
struct cin_s *Media_StartCin(char *name);
|
||||
texid_t Media_UpdateForShader(cin_t *cin);
|
||||
void Media_ShutdownCin(cin_t *cin);
|
||||
qboolean Media_FakeTrack(int i, qboolean loop);
|
||||
|
||||
//these accept NULL for cin to mean the current fullscreen video
|
||||
void Media_Send_Command(cin_t *cin, char *command);
|
||||
|
|
|
@ -2002,6 +2002,9 @@ texid_t R_LoadHiResTexture(char *name, char *subpath, unsigned int flags)
|
|||
|
||||
int i, e;
|
||||
|
||||
if (!*name)
|
||||
return r_nulltex;
|
||||
|
||||
image_width = 0;
|
||||
image_height = 0;
|
||||
|
||||
|
|
|
@ -216,7 +216,7 @@ void Media_Clear (void)
|
|||
}
|
||||
|
||||
qboolean fakecdactive;
|
||||
void Media_FakeTrack(int i, qboolean loop)
|
||||
qboolean Media_FakeTrack(int i, qboolean loop)
|
||||
{
|
||||
char trackname[512];
|
||||
|
||||
|
@ -234,9 +234,11 @@ void Media_FakeTrack(int i, qboolean loop)
|
|||
|
||||
fakecdactive = true;
|
||||
media_playing = true;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
fakecdactive = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
//actually, this func just flushes and states that it should be playing. the ambientsound func actually changes the track.
|
||||
|
|
|
@ -196,7 +196,10 @@ static void *FSZIP_LoadZipFile (vfsfile_t *packhandle, const char *desc)
|
|||
if (unzGetCurrentFileInfo (zip->handle, &file_info, newfiles[i].name, sizeof(newfiles[i].name), NULL, 0, NULL, 0) != UNZ_OK)
|
||||
Con_Printf("Zip Error\n");
|
||||
Q_strlwr(newfiles[i].name);
|
||||
newfiles[i].filelen = file_info.uncompressed_size;
|
||||
if (!*newfiles[i].name || newfiles[i].name[strlen(newfiles[i].name)-1] == '/')
|
||||
newfiles[i].filelen = -1;
|
||||
else
|
||||
newfiles[i].filelen = file_info.uncompressed_size;
|
||||
newfiles[i].filepos = file_info.c_offset;
|
||||
|
||||
nextfileziphandle = unzGoToNextFile (zip->handle);
|
||||
|
|
|
@ -2096,7 +2096,12 @@ void Sh_DrawLights(qbyte *vis)
|
|||
return;
|
||||
|
||||
if (!gl_config.arb_shader_objects)
|
||||
{
|
||||
Con_Printf("Missing GL extensions: switching off realtime lighting.\n");
|
||||
r_shadow_realtime_world.ival = 0;
|
||||
r_shadow_realtime_dlight.ival = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
ignoreflags = (r_shadow_realtime_world.value?LFLAG_REALTIMEMODE:LFLAG_NORMALMODE);
|
||||
|
||||
|
|
|
@ -935,7 +935,7 @@ qboolean VID_AttachGL (rendererstate_t *info)
|
|||
if (qwglCreateContextAttribsARB)
|
||||
{
|
||||
HGLRC opengl3;
|
||||
int attribs[7];
|
||||
int attribs[9];
|
||||
char *mv;
|
||||
int i = 0;
|
||||
|
||||
|
@ -959,9 +959,9 @@ qboolean VID_AttachGL (rendererstate_t *info)
|
|||
|
||||
//flags
|
||||
attribs[i+1] = 0;
|
||||
if (vid_gl_context_debug.value)
|
||||
if (vid_gl_context_debug.ival)
|
||||
attribs[i+1] |= WGL_CONTEXT_DEBUG_BIT_ARB;
|
||||
if (vid_gl_context_forwardcompatible.value)
|
||||
if (vid_gl_context_forwardcompatible.ival)
|
||||
attribs[i+1] |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
|
||||
|
||||
if (attribs[i+1])
|
||||
|
@ -970,39 +970,39 @@ qboolean VID_AttachGL (rendererstate_t *info)
|
|||
i += 2;
|
||||
}
|
||||
|
||||
attribs[i+1] = 0;
|
||||
if (vid_gl_context_compatibility.value)
|
||||
attribs[i+1] |= WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
|
||||
else
|
||||
attribs[i+1] |= WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
|
||||
attribs[i] = WGL_CONTEXT_PROFILE_MASK_ARB;
|
||||
i+=2;
|
||||
|
||||
attribs[i] = 0;
|
||||
|
||||
if (!i)
|
||||
/*only switch contexts if there's actually a point*/
|
||||
if (i || !vid_gl_context_compatibility.ival)
|
||||
{
|
||||
//just use the default (ie: max = opengl 2.1 or so)
|
||||
}
|
||||
else if ((opengl3 = qwglCreateContextAttribsARB(maindc, NULL, attribs)))
|
||||
{
|
||||
qwglMakeCurrent(NULL, NULL);
|
||||
qwglDeleteContext(baseRC);
|
||||
|
||||
baseRC = opengl3;
|
||||
if (!qwglMakeCurrent( maindc, baseRC ))
|
||||
{
|
||||
Con_SafePrintf(CON_ERROR "wglMakeCurrent failed\n"); //green to make it show.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DWORD error = GetLastError();
|
||||
if (error == ERROR_INVALID_VERSION_ARB)
|
||||
Con_Printf("Unsupported OpenGL context version (%s).\n", vid_gl_context_version.string);
|
||||
attribs[i+1] = 0;
|
||||
if (vid_gl_context_compatibility.ival)
|
||||
attribs[i+1] |= WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
|
||||
else
|
||||
Con_Printf("Unknown error creating an OpenGL (%s) Context.\n", vid_gl_context_version.string);
|
||||
attribs[i+1] |= WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
|
||||
attribs[i] = WGL_CONTEXT_PROFILE_MASK_ARB;
|
||||
i+=2;
|
||||
|
||||
attribs[i] = 0;
|
||||
|
||||
if ((opengl3 = qwglCreateContextAttribsARB(maindc, NULL, attribs)))
|
||||
{
|
||||
qwglMakeCurrent(NULL, NULL);
|
||||
qwglDeleteContext(baseRC);
|
||||
|
||||
baseRC = opengl3;
|
||||
if (!qwglMakeCurrent( maindc, baseRC ))
|
||||
{
|
||||
Con_SafePrintf(CON_ERROR "wglMakeCurrent failed\n"); //green to make it show.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DWORD error = GetLastError();
|
||||
if (error == ERROR_INVALID_VERSION_ARB)
|
||||
Con_Printf("Unsupported OpenGL context version (%s).\n", vid_gl_context_version.string);
|
||||
else
|
||||
Con_Printf("Unknown error creating an OpenGL (%s) Context.\n", vid_gl_context_version.string);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -677,6 +677,7 @@ progexterns_t defexterns = {
|
|||
//used when loading a game
|
||||
NULL, //builtin_t *(*builtinsfor) (int num); //must return a pointer to the builtins that were used before the state was saved.
|
||||
NULL, //void (*loadcompleate) (int edictsize); //notification to reset any pointers.
|
||||
NULL,
|
||||
|
||||
(void*)malloc, //void *(*memalloc) (int size); //small string allocation malloced and freed randomly by the executor. (use memalloc if you want)
|
||||
free, //void (*memfree) (void * mem);
|
||||
|
|
|
@ -1224,6 +1224,8 @@ char *ED_ParseEdict (progfuncs_t *progfuncs, char *data, edictrun_t *ent)
|
|||
if (!strcmp(keyname, "light")) //Quake lighthack - allows a field name and a classname to go by the same thing in the level editor
|
||||
if ((key = ED_FindField (progfuncs, "light_lev")))
|
||||
goto cont;
|
||||
if (externs->badfield && externs->badfield(progfuncs, (struct edict_s*)ent, keyname, qcc_token))
|
||||
continue;
|
||||
printf ("'%s' is not a field\n", keyname);
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -150,6 +150,7 @@ typedef struct progexterns_s {
|
|||
//used when loading a game
|
||||
builtin_t *(*builtinsfor) (int num, int headercrc); //must return a pointer to the builtins that were used before the state was saved.
|
||||
void (*loadcompleate) (int edictsize); //notification to reset any pointers.
|
||||
pbool (*badfield)(progfuncs_t *prinst, struct edict_s *ent, const char *keyname, const char *value); //called for any fields that are not registered
|
||||
|
||||
void *(VARGS *memalloc) (int size); //small string allocation malloced and freed randomly by the executor. (use malloc if you want)
|
||||
void (VARGS *memfree) (void * mem);
|
||||
|
|
|
@ -331,12 +331,27 @@ void CWStateOp (progfuncs_t *prinst, float startFrame, float endFrame, func_t cu
|
|||
void ThinkTimeOp (progfuncs_t *prinst, edict_t *ed, float var)
|
||||
{
|
||||
stdentvars_t *vars = ed->v;
|
||||
#ifdef PARANOID
|
||||
NUM_FOR_EDICT(ed); // Make sure it's in range
|
||||
#endif
|
||||
vars->nextthink = pr_global_struct->time+var;
|
||||
}
|
||||
|
||||
pbool SV_BadField(progfuncs_t *inst, edict_t *foo, const char *keyname, const char *value)
|
||||
{
|
||||
/*Worldspawn only fields...*/
|
||||
if (NUM_FOR_EDICT(inst, foo) == 0)
|
||||
{
|
||||
/*hexen2 midi - just mute it, we don't support it*/
|
||||
if (!stricmp(keyname, "MIDI"))
|
||||
return true;
|
||||
/*hexen2 does cd tracks slightly differently too*/
|
||||
if (!stricmp(keyname, "CD"))
|
||||
{
|
||||
sv.h2cdtrack = atoi(value);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//int QCEditor (char *filename, int line, int nump, char **parms);
|
||||
void QC_Clear(void);
|
||||
builtin_t pr_builtin[];
|
||||
|
@ -448,6 +463,7 @@ void Q_SetProgsParms(qboolean forcompiler)
|
|||
//used when loading a game
|
||||
svprogparms.builtinsfor = NULL;//builtin_t *(*builtinsfor) (int num); //must return a pointer to the builtins that were used before the state was saved.
|
||||
svprogparms.loadcompleate = NULL;//void (*loadcompleate) (int edictsize); //notification to reset any pointers.
|
||||
svprogparms.badfield = SV_BadField;
|
||||
|
||||
svprogparms.memalloc = PR_CB_Malloc;//void *(*memalloc) (int size); //small string allocation malloced and freed randomly
|
||||
svprogparms.memfree = PR_CB_Free;//void (*memfree) (void * mem);
|
||||
|
|
|
@ -141,6 +141,7 @@ typedef struct
|
|||
char lightstylecolours[MAX_LIGHTSTYLES];
|
||||
};
|
||||
} strings;
|
||||
qbyte h2cdtrack;
|
||||
|
||||
int allocated_client_slots; //number of slots available. (used mostly to stop single player saved games cacking up)
|
||||
|
||||
|
@ -260,11 +261,11 @@ typedef struct
|
|||
char *demolightstyles[MAX_LIGHTSTYLES];
|
||||
#endif
|
||||
//====================================================
|
||||
|
||||
int num_static_entities;
|
||||
// movevars_t demomovevars; //FIXME:!
|
||||
//end this lot... (demo playback)
|
||||
|
||||
int num_static_entities;
|
||||
|
||||
svcustomtents_t customtents[255];
|
||||
|
||||
int csqcentversion[MAX_EDICTS];//prevents ent versions from going backwards
|
||||
|
|
|
@ -378,7 +378,9 @@ void SV_New_f (void)
|
|||
ClientReliableCheckBlock(host_client, 2);
|
||||
|
||||
ClientReliableWrite_Byte (host_client, svc_cdtrack);
|
||||
if (svprogfuncs)
|
||||
if (progstype == PROG_H2)
|
||||
ClientReliableWrite_Byte (host_client, sv.h2cdtrack);
|
||||
else if (svprogfuncs)
|
||||
ClientReliableWrite_Byte (host_client, ((edict_t*)sv.world.edicts)->v->sounds);
|
||||
else
|
||||
ClientReliableWrite_Byte (host_client, 0);
|
||||
|
@ -470,8 +472,16 @@ void SVNQ_New_f (void)
|
|||
|
||||
// send music
|
||||
MSG_WriteByte (&host_client->netchan.message, svc_cdtrack);
|
||||
MSG_WriteByte (&host_client->netchan.message, ((edict_t*)sv.world.edicts)->v->sounds);
|
||||
MSG_WriteByte (&host_client->netchan.message, ((edict_t*)sv.world.edicts)->v->sounds);
|
||||
if (progstype == PROG_H2)
|
||||
{
|
||||
MSG_WriteByte (&host_client->netchan.message, sv.h2cdtrack);
|
||||
MSG_WriteByte (&host_client->netchan.message, sv.h2cdtrack);
|
||||
}
|
||||
else
|
||||
{
|
||||
MSG_WriteByte (&host_client->netchan.message, ((edict_t*)sv.world.edicts)->v->sounds);
|
||||
MSG_WriteByte (&host_client->netchan.message, ((edict_t*)sv.world.edicts)->v->sounds);
|
||||
}
|
||||
|
||||
// set view
|
||||
MSG_WriteByte (&host_client->netchan.message, svc_setview);
|
||||
|
|
Loading…
Reference in a new issue