mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2025-02-18 01:21:32 +00:00
Merged p_setup conflict
This commit is contained in:
commit
6a0103a746
54 changed files with 191 additions and 779 deletions
|
@ -621,7 +621,6 @@ set( PLAT_WIN32_SOURCES
|
||||||
win32/i_rawps2.cpp
|
win32/i_rawps2.cpp
|
||||||
win32/i_xinput.cpp
|
win32/i_xinput.cpp
|
||||||
win32/i_main.cpp
|
win32/i_main.cpp
|
||||||
win32/i_movie.cpp
|
|
||||||
win32/i_system.cpp
|
win32/i_system.cpp
|
||||||
win32/i_specialpaths.cpp
|
win32/i_specialpaths.cpp
|
||||||
win32/st_start.cpp
|
win32/st_start.cpp
|
||||||
|
@ -629,7 +628,6 @@ set( PLAT_WIN32_SOURCES
|
||||||
win32/win32video.cpp )
|
win32/win32video.cpp )
|
||||||
set( PLAT_POSIX_SOURCES
|
set( PLAT_POSIX_SOURCES
|
||||||
posix/i_cd.cpp
|
posix/i_cd.cpp
|
||||||
posix/i_movie.cpp
|
|
||||||
posix/i_steam.cpp )
|
posix/i_steam.cpp )
|
||||||
set( PLAT_SDL_SOURCES
|
set( PLAT_SDL_SOURCES
|
||||||
posix/sdl/crashcatcher.c
|
posix/sdl/crashcatcher.c
|
||||||
|
|
|
@ -424,6 +424,7 @@ enum ActorRenderFlag
|
||||||
RF_MASKROTATION = 0x00200000, // [MC] Only draw the actor when viewed from a certain angle range.
|
RF_MASKROTATION = 0x00200000, // [MC] Only draw the actor when viewed from a certain angle range.
|
||||||
RF_ABSMASKANGLE = 0x00400000, // [MC] The mask rotation does not offset by the actor's angle.
|
RF_ABSMASKANGLE = 0x00400000, // [MC] The mask rotation does not offset by the actor's angle.
|
||||||
RF_ABSMASKPITCH = 0x00800000, // [MC] The mask rotation does not offset by the actor's pitch.
|
RF_ABSMASKPITCH = 0x00800000, // [MC] The mask rotation does not offset by the actor's pitch.
|
||||||
|
RF_INTERPOLATEANGLES = 0x01000000, // [MC] Allow interpolation of the actor's angle, pitch and roll.
|
||||||
|
|
||||||
RF_FORCEYBILLBOARD = 0x10000, // [BB] OpenGL only: draw with y axis billboard, i.e. anchored to the floor (overrides gl_billboard_mode setting)
|
RF_FORCEYBILLBOARD = 0x10000, // [BB] OpenGL only: draw with y axis billboard, i.e. anchored to the floor (overrides gl_billboard_mode setting)
|
||||||
RF_FORCEXYBILLBOARD = 0x20000, // [BB] OpenGL only: draw with xy axis billboard, i.e. unanchored (overrides gl_billboard_mode setting)
|
RF_FORCEXYBILLBOARD = 0x20000, // [BB] OpenGL only: draw with xy axis billboard, i.e. unanchored (overrides gl_billboard_mode setting)
|
||||||
|
|
|
@ -1190,7 +1190,7 @@ static void PrintSecretString(const char *string, bool thislevel)
|
||||||
{
|
{
|
||||||
if (string[1] == 'S' || string[1] == 's')
|
if (string[1] == 'S' || string[1] == 's')
|
||||||
{
|
{
|
||||||
auto secnum = strtoul(string+2, (char**)&string, 10);
|
auto secnum = (unsigned)strtoull(string+2, (char**)&string, 10);
|
||||||
if (*string == ';') string++;
|
if (*string == ';') string++;
|
||||||
if (thislevel && secnum < level.sectors.Size())
|
if (thislevel && secnum < level.sectors.Size())
|
||||||
{
|
{
|
||||||
|
@ -1201,7 +1201,7 @@ static void PrintSecretString(const char *string, bool thislevel)
|
||||||
}
|
}
|
||||||
else if (string[1] == 'T' || string[1] == 't')
|
else if (string[1] == 'T' || string[1] == 't')
|
||||||
{
|
{
|
||||||
long tid = strtol(string+2, (char**)&string, 10);
|
long tid = (long)strtoll(string+2, (char**)&string, 10);
|
||||||
if (*string == ';') string++;
|
if (*string == ';') string++;
|
||||||
FActorIterator it(tid);
|
FActorIterator it(tid);
|
||||||
AActor *actor;
|
AActor *actor;
|
||||||
|
|
|
@ -200,7 +200,7 @@ bool FBaseCVar::ToBool (UCVarValue value, ECVarType type)
|
||||||
else if (stricmp (value.String, "false") == 0)
|
else if (stricmp (value.String, "false") == 0)
|
||||||
return false;
|
return false;
|
||||||
else
|
else
|
||||||
return !!strtol (value.String, NULL, 0);
|
return !!strtoll (value.String, NULL, 0);
|
||||||
|
|
||||||
case CVAR_GUID:
|
case CVAR_GUID:
|
||||||
return false;
|
return false;
|
||||||
|
@ -233,7 +233,7 @@ int FBaseCVar::ToInt (UCVarValue value, ECVarType type)
|
||||||
else if (stricmp (value.String, "false") == 0)
|
else if (stricmp (value.String, "false") == 0)
|
||||||
res = 0;
|
res = 0;
|
||||||
else
|
else
|
||||||
res = strtol (value.String, NULL, 0);
|
res = (int)strtoll (value.String, NULL, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CVAR_GUID: res = 0; break;
|
case CVAR_GUID: res = 0; break;
|
||||||
|
@ -458,7 +458,7 @@ UCVarValue FBaseCVar::FromString (const char *value, ECVarType type)
|
||||||
else if (stricmp (value, "false") == 0)
|
else if (stricmp (value, "false") == 0)
|
||||||
ret.Bool = false;
|
ret.Bool = false;
|
||||||
else
|
else
|
||||||
ret.Bool = strtol (value, NULL, 0) != 0;
|
ret.Bool = strtoll (value, NULL, 0) != 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CVAR_Int:
|
case CVAR_Int:
|
||||||
|
@ -467,7 +467,7 @@ UCVarValue FBaseCVar::FromString (const char *value, ECVarType type)
|
||||||
else if (stricmp (value, "false") == 0)
|
else if (stricmp (value, "false") == 0)
|
||||||
ret.Int = 0;
|
ret.Int = 0;
|
||||||
else
|
else
|
||||||
ret.Int = strtol (value, NULL, 0);
|
ret.Int = (int)strtoll (value, NULL, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CVAR_Float:
|
case CVAR_Float:
|
||||||
|
@ -1617,8 +1617,16 @@ void C_ArchiveCVars (FConfigFile *f, uint32 filter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXTERN_CVAR(Bool, sv_cheats);
|
||||||
|
|
||||||
void FBaseCVar::CmdSet (const char *newval)
|
void FBaseCVar::CmdSet (const char *newval)
|
||||||
{
|
{
|
||||||
|
if ((GetFlags() & CVAR_CHEAT) && !sv_cheats)
|
||||||
|
{
|
||||||
|
Printf("sv_cheats must be true to set this console variable.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
UCVarValue val;
|
UCVarValue val;
|
||||||
|
|
||||||
// Casting away the const is safe in this case.
|
// Casting away the const is safe in this case.
|
||||||
|
|
|
@ -63,6 +63,7 @@ enum
|
||||||
CVAR_NOSAVE = 4096, // when used with CVAR_SERVERINFO, do not save var to savegame
|
CVAR_NOSAVE = 4096, // when used with CVAR_SERVERINFO, do not save var to savegame
|
||||||
CVAR_MOD = 8192, // cvar was defined by a mod
|
CVAR_MOD = 8192, // cvar was defined by a mod
|
||||||
CVAR_IGNORE = 16384,// do not send cvar across the network/inaccesible from ACS (dummy mod cvar)
|
CVAR_IGNORE = 16384,// do not send cvar across the network/inaccesible from ACS (dummy mod cvar)
|
||||||
|
CVAR_CHEAT = 32768,// can be set only when sv_cheats is enabled
|
||||||
};
|
};
|
||||||
|
|
||||||
union UCVarValue
|
union UCVarValue
|
||||||
|
|
|
@ -705,7 +705,7 @@ void AddCommandString (char *cmd, int keynum)
|
||||||
|
|
||||||
if (cmd[4] == ' ')
|
if (cmd[4] == ' ')
|
||||||
{
|
{
|
||||||
tics = strtol (cmd + 5, NULL, 0);
|
tics = (int)strtoll (cmd + 5, NULL, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -885,7 +885,7 @@ static int PatchThing (int thingy)
|
||||||
while ((result = GetLine ()) == 1)
|
while ((result = GetLine ()) == 1)
|
||||||
{
|
{
|
||||||
char *endptr;
|
char *endptr;
|
||||||
unsigned long val = strtoul (Line2, &endptr, 10);
|
unsigned long val = (unsigned long)strtoull (Line2, &endptr, 10);
|
||||||
size_t linelen = strlen (Line1);
|
size_t linelen = strlen (Line1);
|
||||||
|
|
||||||
if (linelen == 10 && stricmp (Line1, "Hit points") == 0)
|
if (linelen == 10 && stricmp (Line1, "Hit points") == 0)
|
||||||
|
@ -1064,11 +1064,7 @@ static int PatchThing (int thingy)
|
||||||
{
|
{
|
||||||
if (IsNum (strval))
|
if (IsNum (strval))
|
||||||
{
|
{
|
||||||
// I have no idea why everyone insists on using strtol here even though it fails
|
value[0] |= (unsigned long)strtoll(strval, NULL, 10);
|
||||||
// dismally if a value is parsed where the highest bit it set. Do people really
|
|
||||||
// use negative values here? Let's better be safe and check both.
|
|
||||||
if (strchr(strval, '-')) value[0] |= (unsigned long)strtol(strval, NULL, 10);
|
|
||||||
else value[0] |= (unsigned long)strtoul(strval, NULL, 10);
|
|
||||||
vchanged[0] = true;
|
vchanged[0] = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -1069,6 +1069,7 @@ void D_PageTicker (void)
|
||||||
|
|
||||||
void D_PageDrawer (void)
|
void D_PageDrawer (void)
|
||||||
{
|
{
|
||||||
|
screen->Clear(0, 0, SCREENWIDTH, SCREENHEIGHT, 0, 0);
|
||||||
if (Page != NULL)
|
if (Page != NULL)
|
||||||
{
|
{
|
||||||
screen->DrawTexture (Page, 0, 0,
|
screen->DrawTexture (Page, 0, 0,
|
||||||
|
@ -1076,11 +1077,9 @@ void D_PageDrawer (void)
|
||||||
DTA_Masked, false,
|
DTA_Masked, false,
|
||||||
DTA_BilinearFilter, true,
|
DTA_BilinearFilter, true,
|
||||||
TAG_DONE);
|
TAG_DONE);
|
||||||
screen->FillBorder (NULL);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
screen->Clear (0, 0, SCREENWIDTH, SCREENHEIGHT, 0, 0);
|
|
||||||
if (!PageBlank)
|
if (!PageBlank)
|
||||||
{
|
{
|
||||||
screen->DrawText (SmallFont, CR_WHITE, 0, 0, "Page graphic goes here", TAG_DONE);
|
screen->DrawText (SmallFont, CR_WHITE, 0, 0, "Page graphic goes here", TAG_DONE);
|
||||||
|
@ -1405,6 +1404,10 @@ void ParseCVarInfo()
|
||||||
{
|
{
|
||||||
cvarflags &= ~CVAR_ARCHIVE;
|
cvarflags &= ~CVAR_ARCHIVE;
|
||||||
}
|
}
|
||||||
|
else if (stricmp(sc.String, "cheat") == 0)
|
||||||
|
{
|
||||||
|
cvarflags |= CVAR_CHEAT;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sc.ScriptError("Unknown cvar attribute '%s'", sc.String);
|
sc.ScriptError("Unknown cvar attribute '%s'", sc.String);
|
||||||
|
@ -2714,6 +2717,7 @@ void D_DoomMain (void)
|
||||||
S_Shutdown(); // free all channels and delete playlist
|
S_Shutdown(); // free all channels and delete playlist
|
||||||
C_ClearAliases(); // CCMDs won't be reinitialized so these need to be deleted here
|
C_ClearAliases(); // CCMDs won't be reinitialized so these need to be deleted here
|
||||||
DestroyCVarsFlagged(CVAR_MOD); // Delete any cvar left by mods
|
DestroyCVarsFlagged(CVAR_MOD); // Delete any cvar left by mods
|
||||||
|
FS_Close(); // destroy the global FraggleScript.
|
||||||
|
|
||||||
GC::FullGC(); // clean up before taking down the object list.
|
GC::FullGC(); // clean up before taking down the object list.
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,7 @@ FNamespaceManager Namespaces;
|
||||||
|
|
||||||
FTypeTable TypeTable;
|
FTypeTable TypeTable;
|
||||||
TArray<PClass *> PClass::AllClasses;
|
TArray<PClass *> PClass::AllClasses;
|
||||||
|
TArray<VMFunction**> PClass::FunctionPtrList;
|
||||||
bool PClass::bShutdown;
|
bool PClass::bShutdown;
|
||||||
bool PClass::bVMOperational;
|
bool PClass::bVMOperational;
|
||||||
|
|
||||||
|
@ -2840,6 +2841,12 @@ void PClass::StaticShutdown ()
|
||||||
TArray<size_t *> uniqueFPs(64);
|
TArray<size_t *> uniqueFPs(64);
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
|
// delete all variables containing pointers to script functions.
|
||||||
|
for (auto p : FunctionPtrList)
|
||||||
|
{
|
||||||
|
*p = nullptr;
|
||||||
|
}
|
||||||
|
FunctionPtrList.Clear();
|
||||||
|
|
||||||
// Make a full garbage collection here so that all destroyed but uncollected higher level objects that still exist can be properly taken down.
|
// Make a full garbage collection here so that all destroyed but uncollected higher level objects that still exist can be properly taken down.
|
||||||
GC::FullGC();
|
GC::FullGC();
|
||||||
|
@ -3547,6 +3554,16 @@ VMFunction *PClass::FindFunction(FName clsname, FName funcname)
|
||||||
return func->Variants[0].Implementation;
|
return func->Variants[0].Implementation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PClass::FindFunction(VMFunction **pptr, FName clsname, FName funcname)
|
||||||
|
{
|
||||||
|
auto cls = PClass::FindActor(clsname);
|
||||||
|
if (!cls) return;
|
||||||
|
auto func = dyn_cast<PFunction>(cls->Symbols.FindSymbol(funcname, true));
|
||||||
|
if (!func) return;
|
||||||
|
*pptr = func->Variants[0].Implementation;
|
||||||
|
FunctionPtrList.Push(pptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* FTypeTable **************************************************************/
|
/* FTypeTable **************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -848,9 +848,11 @@ public:
|
||||||
static PClassActor *FindActor(ENamedName name) { return FindActor(FName(name)); }
|
static PClassActor *FindActor(ENamedName name) { return FindActor(FName(name)); }
|
||||||
static PClassActor *FindActor(FName name);
|
static PClassActor *FindActor(FName name);
|
||||||
static VMFunction *FindFunction(FName cls, FName func);
|
static VMFunction *FindFunction(FName cls, FName func);
|
||||||
|
static void FindFunction(VMFunction **pptr, FName cls, FName func);
|
||||||
PClass *FindClassTentative(FName name);
|
PClass *FindClassTentative(FName name);
|
||||||
|
|
||||||
static TArray<PClass *> AllClasses;
|
static TArray<PClass *> AllClasses;
|
||||||
|
static TArray<VMFunction**> FunctionPtrList;
|
||||||
|
|
||||||
static bool bShutdown;
|
static bool bShutdown;
|
||||||
static bool bVMOperational;
|
static bool bVMOperational;
|
||||||
|
|
|
@ -192,7 +192,7 @@ void FS_EmulateCmd(char * string)
|
||||||
else if (sc.Compare("gr_fogcolor"))
|
else if (sc.Compare("gr_fogcolor"))
|
||||||
{
|
{
|
||||||
sc.MustGetString();
|
sc.MustGetString();
|
||||||
level.fadeto = strtol(sc.String, NULL, 16);
|
level.fadeto = (uint32_t)strtoull(sc.String, NULL, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
|
@ -522,7 +522,7 @@ DEFINE_ACTION_FUNCTION(AInventory, DoRespawn)
|
||||||
bool AInventory::CallTryPickup(AActor *toucher, AActor **toucher_return)
|
bool AInventory::CallTryPickup(AActor *toucher, AActor **toucher_return)
|
||||||
{
|
{
|
||||||
static VMFunction *func = nullptr;
|
static VMFunction *func = nullptr;
|
||||||
if (func == nullptr) func = PClass::FindFunction(NAME_Inventory, NAME_CallTryPickup);
|
if (func == nullptr) PClass::FindFunction(&func, NAME_Inventory, NAME_CallTryPickup);
|
||||||
VMValue params[2] = { (DObject*)this, toucher };
|
VMValue params[2] = { (DObject*)this, toucher };
|
||||||
VMReturn ret[2];
|
VMReturn ret[2];
|
||||||
int res;
|
int res;
|
||||||
|
|
|
@ -1114,7 +1114,7 @@ void G_WorldDone (void)
|
||||||
|
|
||||||
if (strncmp (nextlevel, "enDSeQ", 6) == 0)
|
if (strncmp (nextlevel, "enDSeQ", 6) == 0)
|
||||||
{
|
{
|
||||||
FName endsequence = ENamedName(strtol(nextlevel.GetChars()+6, NULL, 16));
|
FName endsequence = ENamedName(strtoll(nextlevel.GetChars()+6, NULL, 16));
|
||||||
// Strife needs a special case here to choose between good and sad ending. Bad is handled elsewhere.
|
// Strife needs a special case here to choose between good and sad ending. Bad is handled elsewhere.
|
||||||
if (endsequence == NAME_Inter_Strife)
|
if (endsequence == NAME_Inter_Strife)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1437,7 +1437,7 @@ class CommandDrawNumber : public CommandDrawString
|
||||||
{
|
{
|
||||||
// num = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem) / TICRATE + 1;
|
// num = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem) / TICRATE + 1;
|
||||||
static VMFunction *func = nullptr;
|
static VMFunction *func = nullptr;
|
||||||
if (func == nullptr) func = PClass::FindFunction(NAME_PlayerPawn, "GetEffectTicsForItem");
|
if (func == nullptr) PClass::FindFunction(&func, NAME_PlayerPawn, "GetEffectTicsForItem");
|
||||||
VMValue params[] = { statusBar->CPlayer->mo, inventoryItem };
|
VMValue params[] = { statusBar->CPlayer->mo, inventoryItem };
|
||||||
int retv;
|
int retv;
|
||||||
VMReturn ret(&retv);
|
VMReturn ret(&retv);
|
||||||
|
@ -2830,7 +2830,7 @@ class CommandDrawBar : public SBarInfoCommand
|
||||||
// [value, max] = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem);
|
// [value, max] = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem);
|
||||||
// value++; max++;
|
// value++; max++;
|
||||||
static VMFunction *func = nullptr;
|
static VMFunction *func = nullptr;
|
||||||
if (func == nullptr) func = PClass::FindFunction(NAME_PlayerPawn, "GetEffectTicsForItem");
|
if (func == nullptr) PClass::FindFunction(&func, NAME_PlayerPawn, "GetEffectTicsForItem");
|
||||||
VMValue params[] = { statusBar->CPlayer->mo, data.inventoryItem };
|
VMValue params[] = { statusBar->CPlayer->mo, data.inventoryItem };
|
||||||
VMReturn ret[2];
|
VMReturn ret[2];
|
||||||
int ival;
|
int ival;
|
||||||
|
|
|
@ -413,7 +413,7 @@ void InitGLRMapinfoData()
|
||||||
|
|
||||||
if (opt != NULL)
|
if (opt != NULL)
|
||||||
{
|
{
|
||||||
gl_SetFogParams(opt->fogdensity, level.info->outsidefog, opt->outsidefogdensity, opt->skyfog);
|
gl_SetFogParams(clamp(opt->fogdensity, 0, 255), level.info->outsidefog, clamp(opt->outsidefogdensity, 0, 255), opt->skyfog);
|
||||||
glset.map_lightmode = opt->lightmode;
|
glset.map_lightmode = opt->lightmode;
|
||||||
glset.map_lightadditivesurfaces = opt->lightadditivesurfaces;
|
glset.map_lightadditivesurfaces = opt->lightadditivesurfaces;
|
||||||
glset.map_attenuate = opt->attenuate;
|
glset.map_attenuate = opt->attenuate;
|
||||||
|
|
|
@ -266,7 +266,7 @@ void ADynamicLight::Tick()
|
||||||
|
|
||||||
case FlickerLight:
|
case FlickerLight:
|
||||||
{
|
{
|
||||||
BYTE rnd = randLight();
|
int rnd = randLight();
|
||||||
float pct = specialf1 / 360.f;
|
float pct = specialf1 / 360.f;
|
||||||
|
|
||||||
m_currentRadius = float(args[LIGHT_INTENSITY + (rnd >= pct * 255)]);
|
m_currentRadius = float(args[LIGHT_INTENSITY + (rnd >= pct * 255)]);
|
||||||
|
@ -293,7 +293,7 @@ void ADynamicLight::Tick()
|
||||||
// These need some more work elsewhere
|
// These need some more work elsewhere
|
||||||
case ColorFlickerLight:
|
case ColorFlickerLight:
|
||||||
{
|
{
|
||||||
BYTE rnd = randLight();
|
int rnd = randLight();
|
||||||
float pct = specialf1/360.f;
|
float pct = specialf1/360.f;
|
||||||
|
|
||||||
m_currentRadius = m_Radius[rnd >= pct * 255];
|
m_currentRadius = m_Radius[rnd >= pct * 255];
|
||||||
|
@ -391,7 +391,7 @@ void ADynamicLight::UpdateLocation()
|
||||||
intensity = m_currentRadius;
|
intensity = m_currentRadius;
|
||||||
}
|
}
|
||||||
radius = intensity * 2.0f;
|
radius = intensity * 2.0f;
|
||||||
assert(radius >= m_currentRadius * 2);
|
if (radius < m_currentRadius * 2) radius = m_currentRadius * 2;
|
||||||
|
|
||||||
if (X() != oldx || Y() != oldy || radius != oldradius)
|
if (X() != oldx || Y() != oldy || radius != oldradius)
|
||||||
{
|
{
|
||||||
|
|
|
@ -126,8 +126,8 @@ public:
|
||||||
void ApplyProperties(ADynamicLight * light) const;
|
void ApplyProperties(ADynamicLight * light) const;
|
||||||
FName GetName() const { return m_Name; }
|
FName GetName() const { return m_Name; }
|
||||||
void SetParameter(double p) { m_Param = p; }
|
void SetParameter(double p) { m_Param = p; }
|
||||||
void SetArg(int arg, BYTE val) { m_Args[arg] = val; }
|
void SetArg(int arg, int val) { m_Args[arg] = val; }
|
||||||
BYTE GetArg(int arg) { return m_Args[arg]; }
|
int GetArg(int arg) { return m_Args[arg]; }
|
||||||
uint8_t GetAttenuate() const { return m_attenuate; }
|
uint8_t GetAttenuate() const { return m_attenuate; }
|
||||||
void SetOffset(float* ft) { m_Pos.X = ft[0]; m_Pos.Z = ft[1]; m_Pos.Y = ft[2]; }
|
void SetOffset(float* ft) { m_Pos.X = ft[0]; m_Pos.Z = ft[1]; m_Pos.Y = ft[2]; }
|
||||||
void SetSubtractive(bool subtract) { m_subtractive = subtract; }
|
void SetSubtractive(bool subtract) { m_subtractive = subtract; }
|
||||||
|
@ -648,7 +648,7 @@ void gl_ParseFlickerLight2(FScanner &sc)
|
||||||
}
|
}
|
||||||
if (defaults->GetArg(LIGHT_SECONDARY_INTENSITY) < defaults->GetArg(LIGHT_INTENSITY))
|
if (defaults->GetArg(LIGHT_SECONDARY_INTENSITY) < defaults->GetArg(LIGHT_INTENSITY))
|
||||||
{
|
{
|
||||||
BYTE v = defaults->GetArg(LIGHT_SECONDARY_INTENSITY);
|
int v = defaults->GetArg(LIGHT_SECONDARY_INTENSITY);
|
||||||
defaults->SetArg(LIGHT_SECONDARY_INTENSITY, defaults->GetArg(LIGHT_INTENSITY));
|
defaults->SetArg(LIGHT_SECONDARY_INTENSITY, defaults->GetArg(LIGHT_INTENSITY));
|
||||||
defaults->SetArg(LIGHT_INTENSITY, v);
|
defaults->SetArg(LIGHT_INTENSITY, v);
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "r_state.h"
|
#include "r_state.h"
|
||||||
#include "d_player.h"
|
#include "d_player.h"
|
||||||
#include "g_levellocals.h"
|
#include "g_levellocals.h"
|
||||||
|
#include "r_utility.h"
|
||||||
//#include "resources/voxels.h"
|
//#include "resources/voxels.h"
|
||||||
//#include "gl/gl_intern.h"
|
//#include "gl/gl_intern.h"
|
||||||
|
|
||||||
|
@ -1011,6 +1012,13 @@ void gl_RenderModel(GLSprite * spr)
|
||||||
// Model space => World space
|
// Model space => World space
|
||||||
gl_RenderState.mModelMatrix.translate(spr->x, spr->z, spr->y );
|
gl_RenderState.mModelMatrix.translate(spr->x, spr->z, spr->y );
|
||||||
|
|
||||||
|
if (spr->actor->renderflags & RF_INTERPOLATEANGLES)
|
||||||
|
{
|
||||||
|
// [Nash] use interpolated angles
|
||||||
|
DRotator Angles = spr->actor->InterpolatedAngles(r_TicFracF);
|
||||||
|
angle = Angles.Yaw.Degrees;
|
||||||
|
}
|
||||||
|
|
||||||
// Applying model transformations:
|
// Applying model transformations:
|
||||||
// 1) Applying actor angle, pitch and roll to the model
|
// 1) Applying actor angle, pitch and roll to the model
|
||||||
gl_RenderState.mModelMatrix.rotate(-angle, 0, 1, 0);
|
gl_RenderState.mModelMatrix.rotate(-angle, 0, 1, 0);
|
||||||
|
|
|
@ -552,7 +552,7 @@ CCMD(skyfog)
|
||||||
{
|
{
|
||||||
if (argv.argc()>1)
|
if (argv.argc()>1)
|
||||||
{
|
{
|
||||||
skyfog=strtol(argv[1],NULL,0);
|
skyfog = MAX(0, (int)strtoull(argv[1], NULL, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -738,7 +738,11 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
|
||||||
int clipres = GLRenderer->mClipPortal->ClipPoint(thingpos);
|
int clipres = GLRenderer->mClipPortal->ClipPoint(thingpos);
|
||||||
if (clipres == GLPortal::PClip_InFront) return;
|
if (clipres == GLPortal::PClip_InFront) return;
|
||||||
}
|
}
|
||||||
|
// disabled because almost none of the actual game code is even remotely prepared for this. If desired, use the INTERPOLATE flag.
|
||||||
|
if (thing->renderflags & RF_INTERPOLATEANGLES)
|
||||||
Angles = thing->InterpolatedAngles(r_TicFracF);
|
Angles = thing->InterpolatedAngles(r_TicFracF);
|
||||||
|
else
|
||||||
|
Angles = thing->Angles;
|
||||||
|
|
||||||
player_t *player = &players[consoleplayer];
|
player_t *player = &players[consoleplayer];
|
||||||
FloatRect r;
|
FloatRect r;
|
||||||
|
|
|
@ -40,6 +40,8 @@
|
||||||
#include <intrin.h>
|
#include <intrin.h>
|
||||||
|
|
||||||
#define USE_WINDOWS_DWORD
|
#define USE_WINDOWS_DWORD
|
||||||
|
#elif defined __APPLE__
|
||||||
|
#include <sys/sysctl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "i_system.h"
|
#include "i_system.h"
|
||||||
|
@ -114,6 +116,15 @@ void gl_CalculateCPUSpeed ()
|
||||||
gl_SecondsPerCycle = 1.0 / CyclesPerSecond;
|
gl_SecondsPerCycle = 1.0 / CyclesPerSecond;
|
||||||
gl_MillisecPerCycle = 1000.0 / CyclesPerSecond;
|
gl_MillisecPerCycle = 1000.0 / CyclesPerSecond;
|
||||||
}
|
}
|
||||||
|
#elif defined __APPLE__
|
||||||
|
long long frequency;
|
||||||
|
size_t size = sizeof frequency;
|
||||||
|
|
||||||
|
if (0 == sysctlbyname("machdep.tsc.frequency", &frequency, &size, nullptr, 0) && 0 != frequency)
|
||||||
|
{
|
||||||
|
gl_SecondsPerCycle = 1.0 / frequency;
|
||||||
|
gl_MillisecPerCycle = 1000.0 / frequency;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,11 +7,11 @@
|
||||||
|
|
||||||
extern bool gl_benching;
|
extern bool gl_benching;
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
|
|
||||||
extern double gl_SecondsPerCycle;
|
extern double gl_SecondsPerCycle;
|
||||||
extern double gl_MillisecPerCycle;
|
extern double gl_MillisecPerCycle;
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
|
||||||
__forceinline long long GetClockCycle ()
|
__forceinline long long GetClockCycle ()
|
||||||
{
|
{
|
||||||
#if _M_X64
|
#if _M_X64
|
||||||
|
@ -21,10 +21,14 @@ __forceinline long long GetClockCycle ()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(__GNUG__) && defined(__i386__)
|
#elif defined __APPLE__ && (defined __i386__ || defined __x86_64__)
|
||||||
|
|
||||||
extern double gl_SecondsPerCycle;
|
inline long long GetClockCycle()
|
||||||
extern double gl_MillisecPerCycle;
|
{
|
||||||
|
return __builtin_ia32_rdtsc();
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(__GNUG__) && defined(__i386__)
|
||||||
|
|
||||||
inline long long GetClockCycle()
|
inline long long GetClockCycle()
|
||||||
{
|
{
|
||||||
|
@ -42,21 +46,12 @@ inline long long GetClockCycle()
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
extern double gl_SecondsPerCycle;
|
|
||||||
extern double gl_MillisecPerCycle;
|
|
||||||
|
|
||||||
inline long long GetClockCycle ()
|
inline long long GetClockCycle ()
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (__APPLE__)
|
|
||||||
|
|
||||||
typedef cycle_t glcycle_t;
|
|
||||||
|
|
||||||
#else // !__APPLE__
|
|
||||||
|
|
||||||
class glcycle_t
|
class glcycle_t
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -100,8 +95,6 @@ private:
|
||||||
long long Counter;
|
long long Counter;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __APPLE__
|
|
||||||
|
|
||||||
extern glcycle_t RenderWall,SetupWall,ClipWall;
|
extern glcycle_t RenderWall,SetupWall,ClipWall;
|
||||||
extern glcycle_t RenderFlat,SetupFlat;
|
extern glcycle_t RenderFlat,SetupFlat;
|
||||||
extern glcycle_t RenderSprite,SetupSprite;
|
extern glcycle_t RenderSprite,SetupSprite;
|
||||||
|
|
|
@ -1,52 +0,0 @@
|
||||||
/*
|
|
||||||
** i_movie.h
|
|
||||||
** Defines the movie-related stuff
|
|
||||||
**
|
|
||||||
**---------------------------------------------------------------------------
|
|
||||||
** Copyright 1998-2006 Randy Heit
|
|
||||||
** All rights reserved.
|
|
||||||
**
|
|
||||||
** Redistribution and use in source and binary forms, with or without
|
|
||||||
** modification, are permitted provided that the following conditions
|
|
||||||
** are met:
|
|
||||||
**
|
|
||||||
** 1. Redistributions of source code must retain the above copyright
|
|
||||||
** notice, this list of conditions and the following disclaimer.
|
|
||||||
** 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
** notice, this list of conditions and the following disclaimer in the
|
|
||||||
** documentation and/or other materials provided with the distribution.
|
|
||||||
** 3. The name of the author may not be used to endorse or promote products
|
|
||||||
** derived from this software without specific prior written permission.
|
|
||||||
**
|
|
||||||
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
**---------------------------------------------------------------------------
|
|
||||||
**
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __I_MOVIE_H__
|
|
||||||
#define __I_MOVIE_H__
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma once
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int I_PlayMovie (const char *movieName);
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MOVIE_Played = 0,
|
|
||||||
MOVIE_Played_NoVideo = 1,
|
|
||||||
MOVIE_Played_Aborted = 2,
|
|
||||||
MOVIE_Failed = -1,
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //__I_MOVIE_H__
|
|
|
@ -485,7 +485,7 @@ void cht_DoCheat (player_t *player, int cheat)
|
||||||
if (player->mo != NULL && player->health >= 0)
|
if (player->mo != NULL && player->health >= 0)
|
||||||
{
|
{
|
||||||
static VMFunction *gsp = nullptr;
|
static VMFunction *gsp = nullptr;
|
||||||
if (gsp == nullptr) gsp = PClass::FindFunction(NAME_Sigil, NAME_GiveSigilPiece);
|
if (gsp == nullptr) PClass::FindFunction(&gsp, NAME_Sigil, NAME_GiveSigilPiece);
|
||||||
if (gsp)
|
if (gsp)
|
||||||
{
|
{
|
||||||
VMValue params[1] = { player->mo };
|
VMValue params[1] = { player->mo };
|
||||||
|
|
|
@ -65,7 +65,7 @@ CVAR (Bool, show_obituaries, true, CVAR_ARCHIVE)
|
||||||
|
|
||||||
|
|
||||||
CVAR (Float, snd_menuvolume, 0.6f, CVAR_ARCHIVE)
|
CVAR (Float, snd_menuvolume, 0.6f, CVAR_ARCHIVE)
|
||||||
CVAR(Int, m_use_mouse, 1, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
CVAR(Int, m_use_mouse, 2, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
||||||
CVAR(Int, m_show_backbutton, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
CVAR(Int, m_show_backbutton, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
||||||
|
|
||||||
DMenu *DMenu::CurrentMenu;
|
DMenu *DMenu::CurrentMenu;
|
||||||
|
|
|
@ -666,7 +666,7 @@ static EColorRange ParseOptionColor(FScanner &sc, FOptionMenuDescriptor *desc)
|
||||||
cr = V_FindFontColor(sc.String);
|
cr = V_FindFontColor(sc.String);
|
||||||
if (cr == CR_UNTRANSLATED && !sc.Compare("untranslated") && isdigit(sc.String[0]))
|
if (cr == CR_UNTRANSLATED && !sc.Compare("untranslated") && isdigit(sc.String[0]))
|
||||||
{
|
{
|
||||||
if (strtol(sc.String, NULL, 0)) cr = OptionSettings.mFontColorHeader;
|
if (strtoll(sc.String, NULL, 0)) cr = OptionSettings.mFontColorHeader;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return cr;
|
return cr;
|
||||||
|
|
|
@ -366,8 +366,8 @@ static bool GetSelectedSize (int *width, int *height)
|
||||||
char *breakpt;
|
char *breakpt;
|
||||||
if (it->GetString(FOptionMenuScreenResolutionLine::SRL_INDEX+hsel, buffer, sizeof(buffer)))
|
if (it->GetString(FOptionMenuScreenResolutionLine::SRL_INDEX+hsel, buffer, sizeof(buffer)))
|
||||||
{
|
{
|
||||||
*width = strtol (buffer, &breakpt, 10);
|
*width = (int)strtoll (buffer, &breakpt, 10);
|
||||||
*height = strtol (breakpt+1, NULL, 10);
|
*height = (int)strtoll (breakpt+1, NULL, 10);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -982,7 +982,12 @@ CCMD (dump3df)
|
||||||
{
|
{
|
||||||
if (argv.argc() > 1)
|
if (argv.argc() > 1)
|
||||||
{
|
{
|
||||||
int sec = strtol(argv[1], NULL, 10);
|
int sec = (int)strtoll(argv[1], NULL, 10);
|
||||||
|
if ((unsigned)sec >= level.sectors.Size())
|
||||||
|
{
|
||||||
|
Printf("Sector %d does not exist.\n", sec);
|
||||||
|
return;
|
||||||
|
}
|
||||||
sector_t *sector = &level.sectors[sec];
|
sector_t *sector = &level.sectors[sec];
|
||||||
TArray<F3DFloor*> & ffloors=sector->e->XFloor.ffloors;
|
TArray<F3DFloor*> & ffloors=sector->e->XFloor.ffloors;
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,6 @@
|
||||||
#include "c_dispatch.h"
|
#include "c_dispatch.h"
|
||||||
#include "s_sndseq.h"
|
#include "s_sndseq.h"
|
||||||
#include "i_system.h"
|
#include "i_system.h"
|
||||||
#include "i_movie.h"
|
|
||||||
#include "sbar.h"
|
#include "sbar.h"
|
||||||
#include "m_swap.h"
|
#include "m_swap.h"
|
||||||
#include "a_sharedglobal.h"
|
#include "a_sharedglobal.h"
|
||||||
|
@ -1086,12 +1085,12 @@ static void ReadArrayVars (FSerializer &file, FWorldGlobalArray *vars, size_t co
|
||||||
const char *arraykey;
|
const char *arraykey;
|
||||||
while ((arraykey = file.GetKey()))
|
while ((arraykey = file.GetKey()))
|
||||||
{
|
{
|
||||||
int i = (int)strtol(arraykey, nullptr, 10);
|
int i = (int)strtoll(arraykey, nullptr, 10);
|
||||||
if (file.BeginObject(nullptr))
|
if (file.BeginObject(nullptr))
|
||||||
{
|
{
|
||||||
while ((arraykey = file.GetKey()))
|
while ((arraykey = file.GetKey()))
|
||||||
{
|
{
|
||||||
int k = (int)strtol(arraykey, nullptr, 10);
|
int k = (int)strtoll(arraykey, nullptr, 10);
|
||||||
int val;
|
int val;
|
||||||
file(nullptr, val);
|
file(nullptr, val);
|
||||||
vars[i].Insert(k, val);
|
vars[i].Insert(k, val);
|
||||||
|
@ -6203,7 +6202,7 @@ static bool CharArrayParms(int &capacity, int &offset, int &a, int *Stack, int &
|
||||||
static void SetMarineWeapon(AActor *marine, int weapon)
|
static void SetMarineWeapon(AActor *marine, int weapon)
|
||||||
{
|
{
|
||||||
static VMFunction *smw = nullptr;
|
static VMFunction *smw = nullptr;
|
||||||
if (smw == nullptr) smw = PClass::FindFunction(NAME_ScriptedMarine, NAME_SetWeapon);
|
if (smw == nullptr) PClass::FindFunction(&smw, NAME_ScriptedMarine, NAME_SetWeapon);
|
||||||
if (smw)
|
if (smw)
|
||||||
{
|
{
|
||||||
VMValue params[2] = { marine, weapon };
|
VMValue params[2] = { marine, weapon };
|
||||||
|
@ -6214,7 +6213,7 @@ static void SetMarineWeapon(AActor *marine, int weapon)
|
||||||
static void SetMarineSprite(AActor *marine, PClassActor *source)
|
static void SetMarineSprite(AActor *marine, PClassActor *source)
|
||||||
{
|
{
|
||||||
static VMFunction *sms = nullptr;
|
static VMFunction *sms = nullptr;
|
||||||
if (sms == nullptr) sms = PClass::FindFunction(NAME_ScriptedMarine, NAME_SetSprite);
|
if (sms == nullptr) PClass::FindFunction(&sms, NAME_ScriptedMarine, NAME_SetSprite);
|
||||||
if (sms)
|
if (sms)
|
||||||
{
|
{
|
||||||
VMValue params[2] = { marine, source };
|
VMValue params[2] = { marine, source };
|
||||||
|
@ -8801,7 +8800,7 @@ scriptwait:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCD_PLAYMOVIE:
|
case PCD_PLAYMOVIE:
|
||||||
STACK(1) = I_PlayMovie (FBehavior::StaticLookupString (STACK(1)));
|
STACK(1) = -1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCD_SETACTORPOSITION:
|
case PCD_SETACTORPOSITION:
|
||||||
|
|
|
@ -2049,7 +2049,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->target)
|
if (self->target && self->SeeState)
|
||||||
{
|
{
|
||||||
self->SetState (self->SeeState);
|
self->SetState (self->SeeState);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2541,7 +2541,7 @@ void P_ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec, intmaps
|
||||||
case Sector_Set3DFloor:
|
case Sector_Set3DFloor:
|
||||||
if (msd->toptexture[0]=='#')
|
if (msd->toptexture[0]=='#')
|
||||||
{
|
{
|
||||||
sd->SetTexture(side_t::top, FNullTextureID() +(-strtol(&msd->toptexture[1], NULL, 10))); // store the alpha as a negative texture index
|
sd->SetTexture(side_t::top, FNullTextureID() +(int)(-strtoll(&msd->toptexture[1], NULL, 10))); // store the alpha as a negative texture index
|
||||||
// This will be sorted out by the 3D-floor code later.
|
// This will be sorted out by the 3D-floor code later.
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2979,6 +2979,15 @@ static bool P_VerifyBlockMap(int count)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// there's some node builder which carelessly removed the initial 0-entry.
|
||||||
|
// Rather than second-guessing the intent, let's just discard such blockmaps entirely
|
||||||
|
// to be on the safe side.
|
||||||
|
if (*list != 0)
|
||||||
|
{
|
||||||
|
Printf(PRINT_HIGH, "P_VerifyBlockMap: first entry is not 0.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// scan the list for out-of-range linedef indicies in list
|
// scan the list for out-of-range linedef indicies in list
|
||||||
for(tmplist = list; *tmplist != -1; tmplist++)
|
for(tmplist = list; *tmplist != -1; tmplist++)
|
||||||
{
|
{
|
||||||
|
@ -3426,6 +3435,17 @@ void P_FreeLevelData ()
|
||||||
{
|
{
|
||||||
// [ZZ] delete per-map event handlers
|
// [ZZ] delete per-map event handlers
|
||||||
E_Shutdown(true);
|
E_Shutdown(true);
|
||||||
|
MapThingsConverted.Clear();
|
||||||
|
MapThingsUserDataIndex.Clear();
|
||||||
|
MapThingsUserData.Clear();
|
||||||
|
linemap.Clear();
|
||||||
|
FCanvasTextureInfo::EmptyList();
|
||||||
|
R_FreePastViewers();
|
||||||
|
P_ClearUDMFKeys();
|
||||||
|
|
||||||
|
// [RH] Clear all ThingID hash chains.
|
||||||
|
AActor::ClearTIDHashes();
|
||||||
|
|
||||||
P_FreeMapDataBackup();
|
P_FreeMapDataBackup();
|
||||||
interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level.
|
interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level.
|
||||||
Renderer->CleanLevelData();
|
Renderer->CleanLevelData();
|
||||||
|
@ -3578,14 +3598,6 @@ void P_SetupLevel (const char *lumpname, int position)
|
||||||
level.maptype = MAPTYPE_UNKNOWN;
|
level.maptype = MAPTYPE_UNKNOWN;
|
||||||
wminfo.partime = 180;
|
wminfo.partime = 180;
|
||||||
|
|
||||||
MapThingsConverted.Clear();
|
|
||||||
MapThingsUserDataIndex.Clear();
|
|
||||||
MapThingsUserData.Clear();
|
|
||||||
linemap.Clear();
|
|
||||||
FCanvasTextureInfo::EmptyList ();
|
|
||||||
R_FreePastViewers ();
|
|
||||||
P_ClearUDMFKeys();
|
|
||||||
|
|
||||||
if (!savegamerestore)
|
if (!savegamerestore)
|
||||||
{
|
{
|
||||||
for (i = 0; i < MAXPLAYERS; ++i)
|
for (i = 0; i < MAXPLAYERS; ++i)
|
||||||
|
@ -3615,8 +3627,6 @@ void P_SetupLevel (const char *lumpname, int position)
|
||||||
|
|
||||||
// Make sure all sounds are stopped before Z_FreeTags.
|
// Make sure all sounds are stopped before Z_FreeTags.
|
||||||
S_Start ();
|
S_Start ();
|
||||||
// [RH] Clear all ThingID hash chains.
|
|
||||||
AActor::ClearTIDHashes ();
|
|
||||||
|
|
||||||
// [RH] clear out the mid-screen message
|
// [RH] clear out the mid-screen message
|
||||||
C_MidPrint (NULL, NULL);
|
C_MidPrint (NULL, NULL);
|
||||||
|
|
|
@ -731,7 +731,7 @@ FState *FStateDefinitions::ResolveGotoLabel (AActor *actor, PClassActor *mytype,
|
||||||
*pt = '\0';
|
*pt = '\0';
|
||||||
offset = pt + 1;
|
offset = pt + 1;
|
||||||
}
|
}
|
||||||
v = offset ? strtol (offset, NULL, 0) : 0;
|
v = offset ? (int)strtoll (offset, NULL, 0) : 0;
|
||||||
|
|
||||||
// Get the state's address.
|
// Get the state's address.
|
||||||
if (type == mytype)
|
if (type == mytype)
|
||||||
|
|
|
@ -103,7 +103,7 @@ loop:
|
||||||
c = *sourcep++;
|
c = *sourcep++;
|
||||||
if (c == 'x' || c == 'X')
|
if (c == 'x' || c == 'X')
|
||||||
{
|
{
|
||||||
yylval->val = (int)strtol(sourcep, &sourcep, 16);
|
yylval->val = (int)strtoll(sourcep, &sourcep, 16);
|
||||||
return TokenTrans[NUM];
|
return TokenTrans[NUM];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -114,7 +114,7 @@ loop:
|
||||||
char *endp;
|
char *endp;
|
||||||
|
|
||||||
sourcep--;
|
sourcep--;
|
||||||
yylval->val = (int)strtol(sourcep, &endp, 10);
|
yylval->val = (int)strtoll(sourcep, &endp, 10);
|
||||||
if (*endp == '.')
|
if (*endp == '.')
|
||||||
{
|
{
|
||||||
// It's a float
|
// It's a float
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <fnmatch.h>
|
#include <fnmatch.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
|
||||||
#include "d_ticcmd.h"
|
#include "d_ticcmd.h"
|
||||||
#include "doomdef.h"
|
#include "doomdef.h"
|
||||||
|
@ -98,9 +99,29 @@ void SetLanguageIDs()
|
||||||
void I_InitTimer();
|
void I_InitTimer();
|
||||||
void I_ShutdownTimer();
|
void I_ShutdownTimer();
|
||||||
|
|
||||||
|
double PerfToSec, PerfToMillisec;
|
||||||
|
|
||||||
|
static void CalculateCPUSpeed()
|
||||||
|
{
|
||||||
|
long long frequency;
|
||||||
|
size_t size = sizeof frequency;
|
||||||
|
|
||||||
|
if (0 == sysctlbyname("machdep.tsc.frequency", &frequency, &size, nullptr, 0) && 0 != frequency)
|
||||||
|
{
|
||||||
|
PerfToSec = 1.0 / frequency;
|
||||||
|
PerfToMillisec = 1000.0 / frequency;
|
||||||
|
|
||||||
|
if (!batchrun)
|
||||||
|
{
|
||||||
|
Printf("CPU speed: %.0f MHz\n", 0.001 / PerfToMillisec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void I_Init(void)
|
void I_Init(void)
|
||||||
{
|
{
|
||||||
CheckCPUID(&CPU);
|
CheckCPUID(&CPU);
|
||||||
|
CalculateCPUSpeed();
|
||||||
DumpCPUInfo(&CPU);
|
DumpCPUInfo(&CPU);
|
||||||
|
|
||||||
atterm(I_ShutdownSound);
|
atterm(I_ShutdownSound);
|
||||||
|
|
|
@ -534,6 +534,9 @@ CocoaVideo::CocoaVideo()
|
||||||
{
|
{
|
||||||
memset(&m_modeIterator, 0, sizeof m_modeIterator);
|
memset(&m_modeIterator, 0, sizeof m_modeIterator);
|
||||||
|
|
||||||
|
extern void gl_CalculateCPUSpeed();
|
||||||
|
gl_CalculateCPUSpeed();
|
||||||
|
|
||||||
// Create OpenGL pixel format
|
// Create OpenGL pixel format
|
||||||
|
|
||||||
NSOpenGLPixelFormat* pixelFormat = CreatePixelFormat(OpenGLProfile::Core);
|
NSOpenGLPixelFormat* pixelFormat = CreatePixelFormat(OpenGLProfile::Core);
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
#include "i_movie.h"
|
|
||||||
|
|
||||||
int I_PlayMovie (const char *movie)
|
|
||||||
{
|
|
||||||
return MOVIE_Failed;
|
|
||||||
}
|
|
||||||
|
|
|
@ -239,7 +239,7 @@ struct FUDMFKey
|
||||||
FUDMFKey& operator =(const FString &val)
|
FUDMFKey& operator =(const FString &val)
|
||||||
{
|
{
|
||||||
Type = UDMF_String;
|
Type = UDMF_String;
|
||||||
IntVal = strtol(val.GetChars(), NULL, 0);
|
IntVal = (int)strtoll(val.GetChars(), NULL, 0);
|
||||||
FloatVal = strtod(val.GetChars(), NULL);
|
FloatVal = strtod(val.GetChars(), NULL);
|
||||||
StringVal = val;
|
StringVal = val;
|
||||||
return *this;
|
return *this;
|
||||||
|
|
|
@ -554,12 +554,12 @@ bool FScanner::GetToken ()
|
||||||
String[StringLen - 2] == 'u' || String[StringLen - 2] == 'U')
|
String[StringLen - 2] == 'u' || String[StringLen - 2] == 'U')
|
||||||
{
|
{
|
||||||
TokenType = TK_UIntConst;
|
TokenType = TK_UIntConst;
|
||||||
Number = strtoul(String, &stopper, 0);
|
Number = (int)strtoull(String, &stopper, 0);
|
||||||
Float = (unsigned)Number;
|
Float = (unsigned)Number;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Number = strtol(String, &stopper, 0);
|
Number = (int)strtoll(String, &stopper, 0);
|
||||||
Float = Number;
|
Float = Number;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -660,7 +660,7 @@ bool FScanner::GetNumber ()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Number = strtol (String, &stopper, 0);
|
Number = (int)strtoll (String, &stopper, 0);
|
||||||
if (*stopper != 0)
|
if (*stopper != 0)
|
||||||
{
|
{
|
||||||
ScriptError ("SC_GetNumber: Bad numeric constant \"%s\".", String);
|
ScriptError ("SC_GetNumber: Bad numeric constant \"%s\".", String);
|
||||||
|
@ -715,7 +715,7 @@ bool FScanner::CheckNumber ()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Number = strtol (String, &stopper, 0);
|
Number = (int)strtoll (String, &stopper, 0);
|
||||||
if (*stopper != 0)
|
if (*stopper != 0)
|
||||||
{
|
{
|
||||||
UnGet();
|
UnGet();
|
||||||
|
|
|
@ -635,7 +635,7 @@ static void ParseSpriteFrames (PClassActor *info, TArray<FState> &states, TArray
|
||||||
char *stop;
|
char *stop;
|
||||||
|
|
||||||
*colon = 0;
|
*colon = 0;
|
||||||
rate = strtol (token, &stop, 10);
|
rate = (int)strtoll (token, &stop, 10);
|
||||||
if (stop == token || rate < 1 || rate > 65534)
|
if (stop == token || rate < 1 || rate > 65534)
|
||||||
{
|
{
|
||||||
sc.ScriptError ("Rates must be in the range [0,65534]");
|
sc.ScriptError ("Rates must be in the range [0,65534]");
|
||||||
|
|
|
@ -326,6 +326,7 @@ static FFlagDef ActorFlagDefs[]=
|
||||||
DEFINE_FLAG(RF, ABSMASKPITCH, AActor, renderflags),
|
DEFINE_FLAG(RF, ABSMASKPITCH, AActor, renderflags),
|
||||||
DEFINE_FLAG(RF, XFLIP, AActor, renderflags),
|
DEFINE_FLAG(RF, XFLIP, AActor, renderflags),
|
||||||
DEFINE_FLAG(RF, YFLIP, AActor, renderflags),
|
DEFINE_FLAG(RF, YFLIP, AActor, renderflags),
|
||||||
|
DEFINE_FLAG(RF, INTERPOLATEANGLES, AActor, renderflags),
|
||||||
|
|
||||||
// Bounce flags
|
// Bounce flags
|
||||||
DEFINE_FLAG2(BOUNCE_Walls, BOUNCEONWALLS, AActor, BounceFlags),
|
DEFINE_FLAG2(BOUNCE_Walls, BOUNCEONWALLS, AActor, BounceFlags),
|
||||||
|
|
|
@ -346,6 +346,16 @@ static void PrintProperty(FLispString &out, ZCC_TreeNode *node)
|
||||||
out.Close();
|
out.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void PrintStaticArrayState(FLispString &out, ZCC_TreeNode *node)
|
||||||
|
{
|
||||||
|
auto *snode = (ZCC_StaticArrayStatement *)node;
|
||||||
|
out.Break();
|
||||||
|
out.Open("static-array");
|
||||||
|
out.AddName(snode->Id);
|
||||||
|
PrintNodes(out, snode->Values, false, true);
|
||||||
|
out.Close();
|
||||||
|
}
|
||||||
|
|
||||||
static void PrintEnum(FLispString &out, ZCC_TreeNode *node)
|
static void PrintEnum(FLispString &out, ZCC_TreeNode *node)
|
||||||
{
|
{
|
||||||
ZCC_Enum *enode = (ZCC_Enum *)node;
|
ZCC_Enum *enode = (ZCC_Enum *)node;
|
||||||
|
@ -944,6 +954,7 @@ void (* const TreeNodePrinter[NUM_AST_NODE_TYPES])(FLispString &, ZCC_TreeNode *
|
||||||
PrintVectorInitializer,
|
PrintVectorInitializer,
|
||||||
PrintDeclFlags,
|
PrintDeclFlags,
|
||||||
PrintExprClassCast,
|
PrintExprClassCast,
|
||||||
|
PrintStaticArrayState,
|
||||||
PrintProperty,
|
PrintProperty,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -42,15 +42,6 @@
|
||||||
#include "m_swap.h"
|
#include "m_swap.h"
|
||||||
#include "sbar.h"
|
#include "sbar.h"
|
||||||
|
|
||||||
|
|
||||||
#if defined (__APPLE__)
|
|
||||||
|
|
||||||
mach_timebase_info_data_t cycle_t::s_info;
|
|
||||||
bool cycle_t::s_initialized;
|
|
||||||
|
|
||||||
#endif // __APPLE__
|
|
||||||
|
|
||||||
|
|
||||||
FStat *FStat::FirstStat;
|
FStat *FStat::FirstStat;
|
||||||
|
|
||||||
FStat::FStat (const char *name)
|
FStat::FStat (const char *name)
|
||||||
|
|
87
src/stats.h
87
src/stats.h
|
@ -36,78 +36,7 @@
|
||||||
|
|
||||||
#include "zstring.h"
|
#include "zstring.h"
|
||||||
|
|
||||||
#ifndef _WIN32
|
#if !defined _WIN32 && !defined __APPLE__
|
||||||
|
|
||||||
#if defined (__APPLE__)
|
|
||||||
|
|
||||||
|
|
||||||
#include <mach/mach_time.h>
|
|
||||||
|
|
||||||
|
|
||||||
class cycle_t
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
cycle_t()
|
|
||||||
{
|
|
||||||
if ( !s_initialized )
|
|
||||||
{
|
|
||||||
mach_timebase_info( &s_info );
|
|
||||||
s_initialized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
cycle_t &operator=( const cycle_t &other )
|
|
||||||
{
|
|
||||||
if ( &other != this )
|
|
||||||
{
|
|
||||||
m_seconds = other.m_seconds;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Reset()
|
|
||||||
{
|
|
||||||
m_seconds = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Clock()
|
|
||||||
{
|
|
||||||
m_seconds -= Nanoseconds() * 1e-9;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Unclock()
|
|
||||||
{
|
|
||||||
m_seconds += Nanoseconds() * 1e-9;
|
|
||||||
}
|
|
||||||
|
|
||||||
double Time()
|
|
||||||
{
|
|
||||||
return m_seconds;
|
|
||||||
}
|
|
||||||
|
|
||||||
double TimeMS()
|
|
||||||
{
|
|
||||||
return m_seconds * 1e3;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
double m_seconds;
|
|
||||||
|
|
||||||
static mach_timebase_info_data_t s_info;
|
|
||||||
static bool s_initialized;
|
|
||||||
|
|
||||||
uint64_t Nanoseconds() const
|
|
||||||
{
|
|
||||||
return mach_absolute_time() * s_info.numer / s_info.denom;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#else // !__APPLE__
|
|
||||||
|
|
||||||
#ifdef NO_CLOCK_GETTIME
|
#ifdef NO_CLOCK_GETTIME
|
||||||
class cycle_t
|
class cycle_t
|
||||||
|
@ -171,11 +100,9 @@ private:
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // __APPLE__
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
// Windows
|
// Windows and macOS
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
|
|
||||||
extern double PerfToSec, PerfToMillisec;
|
extern double PerfToSec, PerfToMillisec;
|
||||||
|
@ -199,15 +126,19 @@ inline unsigned __int64 rdtsc()
|
||||||
#else
|
#else
|
||||||
inline unsigned long long rdtsc()
|
inline unsigned long long rdtsc()
|
||||||
{
|
{
|
||||||
#ifndef __amd64__
|
#ifdef __amd64__
|
||||||
|
unsigned long long tsc;
|
||||||
|
asm volatile ("rdtsc; shlq $32, %%rdx; orq %%rdx, %%rax" : "=a" (tsc) :: "%rdx");
|
||||||
|
return tsc;
|
||||||
|
#else // i386
|
||||||
if (CPU.bRDTSC)
|
if (CPU.bRDTSC)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
register unsigned long long tsc;
|
unsigned long long tsc;
|
||||||
asm volatile ("\trdtsc\n" : "=A" (tsc));
|
asm volatile ("\trdtsc\n" : "=A" (tsc));
|
||||||
return tsc;
|
return tsc;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif // __amd64__
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1706,7 +1706,6 @@ void D3DFB::NewRefreshRate ()
|
||||||
|
|
||||||
void D3DFB::Blank ()
|
void D3DFB::Blank ()
|
||||||
{
|
{
|
||||||
// Only used by movie player, which isn't working with D3D9 yet.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void D3DFB::SetBlendingRect(int x1, int y1, int x2, int y2)
|
void D3DFB::SetBlendingRect(int x1, int y1, int x2, int y2)
|
||||||
|
|
|
@ -2731,7 +2731,7 @@ static bool ReadResponse (HWND hDlg, char *header, SOCKET sock, char *buf, int b
|
||||||
char *lenhead = strstr (header, "content-length: ");
|
char *lenhead = strstr (header, "content-length: ");
|
||||||
if (lenhead != 0)
|
if (lenhead != 0)
|
||||||
{
|
{
|
||||||
len = strtol (lenhead + 16, NULL, 10);
|
len = (int)strtoll (lenhead + 16, NULL, 10);
|
||||||
if (file != INVALID_HANDLE_VALUE)
|
if (file != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
ShowWindow (GetDlgItem (hDlg, IDC_BOINGPROGRESS), SW_SHOW);
|
ShowWindow (GetDlgItem (hDlg, IDC_BOINGPROGRESS), SW_SHOW);
|
||||||
|
|
|
@ -595,11 +595,9 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
break;
|
break;
|
||||||
case WTS_CONSOLE_DISCONNECT:
|
case WTS_CONSOLE_DISCONNECT:
|
||||||
SessionState |= 2;
|
SessionState |= 2;
|
||||||
//I_MovieDisableSound ();
|
|
||||||
break;
|
break;
|
||||||
case WTS_CONSOLE_CONNECT:
|
case WTS_CONSOLE_CONNECT:
|
||||||
SessionState &= ~2;
|
SessionState &= ~2;
|
||||||
//I_MovieResumeSound ();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -624,10 +622,6 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
GSnd->SuspendSound ();
|
GSnd->SuspendSound ();
|
||||||
}
|
}
|
||||||
else if (oldstate && !SessionState)
|
|
||||||
{
|
|
||||||
GSnd->MovieResumeSound ();
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
|
@ -953,18 +947,6 @@ FString I_GetFromClipboard (bool return_nothing)
|
||||||
return retstr;
|
return retstr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "i_movie.h"
|
|
||||||
|
|
||||||
CCMD (playmovie)
|
|
||||||
{
|
|
||||||
if (argv.argc() != 2)
|
|
||||||
{
|
|
||||||
Printf ("Usage: playmovie <movie name>\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
I_PlayMovie (argv[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// FInputDevice - Destructor
|
// FInputDevice - Destructor
|
||||||
|
|
|
@ -1,523 +0,0 @@
|
||||||
/*
|
|
||||||
** i_movie.cpp
|
|
||||||
**
|
|
||||||
**---------------------------------------------------------------------------
|
|
||||||
** Copyright 1998-2006 Randy Heit
|
|
||||||
** All rights reserved.
|
|
||||||
**
|
|
||||||
** Redistribution and use in source and binary forms, with or without
|
|
||||||
** modification, are permitted provided that the following conditions
|
|
||||||
** are met:
|
|
||||||
**
|
|
||||||
** 1. Redistributions of source code must retain the above copyright
|
|
||||||
** notice, this list of conditions and the following disclaimer.
|
|
||||||
** 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
** notice, this list of conditions and the following disclaimer in the
|
|
||||||
** documentation and/or other materials provided with the distribution.
|
|
||||||
** 3. The name of the author may not be used to endorse or promote products
|
|
||||||
** derived from this software without specific prior written permission.
|
|
||||||
**
|
|
||||||
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
**---------------------------------------------------------------------------
|
|
||||||
**
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
* If you do not have dshow.h, either download the latest DirectX SDK
|
|
||||||
* or #define I_DO_NOT_LIKE_BIG_DOWNLOADS
|
|
||||||
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef I_DO_NOT_LIKE_BIG_DOWNLOADS
|
|
||||||
#define I_DO_NOT_LIKE_BIG_DOWNLOADS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#include <windows.h>
|
|
||||||
#define USE_WINDOWS_DWORD
|
|
||||||
|
|
||||||
#include "c_cvars.h"
|
|
||||||
|
|
||||||
CUSTOM_CVAR (Float, snd_movievolume, 1.f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
|
||||||
{
|
|
||||||
if (self < 0.f)
|
|
||||||
self = 0.f;
|
|
||||||
else if (self > 1.f)
|
|
||||||
self = 1.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef I_DO_NOT_LIKE_BIG_DOWNLOADS
|
|
||||||
|
|
||||||
#include "i_movie.h"
|
|
||||||
|
|
||||||
int I_PlayMovie (const char *movie)
|
|
||||||
{
|
|
||||||
return MOVIE_Failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include <dshow.h>
|
|
||||||
#include "i_movie.h"
|
|
||||||
#include "i_sound.h"
|
|
||||||
#include "v_video.h"
|
|
||||||
#include "c_console.h"
|
|
||||||
#include "win32iface.h"
|
|
||||||
#include "sbar.h"
|
|
||||||
|
|
||||||
EXTERN_CVAR (String, language)
|
|
||||||
|
|
||||||
#define WM_GRAPHNOTIFY (WM_APP+321)
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
#define INGAME_PRIORITY_CLASS NORMAL_PRIORITY_CLASS
|
|
||||||
#else
|
|
||||||
//#define INGAME_PRIORITY_CLASS HIGH_PRIORITY_CLASS
|
|
||||||
#define INGAME_PRIORITY_CLASS NORMAL_PRIORITY_CLASS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern HWND Window;
|
|
||||||
extern IVideo *Video;
|
|
||||||
extern LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
|
||||||
extern void I_CheckNativeMouse (bool preferNative);
|
|
||||||
|
|
||||||
static bool MovieNotDone;
|
|
||||||
static bool MovieInterrupted;
|
|
||||||
static bool MovieDestroyed;
|
|
||||||
static bool FullVideo;
|
|
||||||
static bool NoVideo;
|
|
||||||
static IVideoWindow *vidwin;
|
|
||||||
static IMediaEventEx *event;
|
|
||||||
static IGraphBuilder *graph;
|
|
||||||
static IMediaControl *control;
|
|
||||||
static IBasicAudio *audio;
|
|
||||||
static IBasicVideo *video;
|
|
||||||
|
|
||||||
static void CheckIfVideo ();
|
|
||||||
static void SetMovieSize ();
|
|
||||||
static void SetTheVolume ();
|
|
||||||
static void SizeWindowForVideo ();
|
|
||||||
|
|
||||||
LRESULT CALLBACK MovieWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
||||||
{
|
|
||||||
switch (message)
|
|
||||||
{
|
|
||||||
case WM_GRAPHNOTIFY:
|
|
||||||
{
|
|
||||||
long code;
|
|
||||||
LONG_PTR parm1, parm2;
|
|
||||||
|
|
||||||
while (event->GetEvent (&code, &parm1, &parm2, 0) == S_OK)
|
|
||||||
{
|
|
||||||
if (code == EC_COMPLETE)
|
|
||||||
{
|
|
||||||
MovieNotDone = false;
|
|
||||||
}
|
|
||||||
event->FreeEventParams (code, parm1, parm2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_SIZE:
|
|
||||||
if (vidwin == NULL)
|
|
||||||
{
|
|
||||||
InvalidateRect (Window, NULL, FALSE);
|
|
||||||
}
|
|
||||||
else if ((wParam == SIZE_MAXIMIZED || wParam == SIZE_RESTORED) && !FullVideo)
|
|
||||||
{
|
|
||||||
SetMovieSize ();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_PAINT:
|
|
||||||
if (vidwin == NULL)
|
|
||||||
{
|
|
||||||
if (screen != NULL)
|
|
||||||
{
|
|
||||||
static_cast<BaseWinFB *> (screen)->PaintToWindow ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!FullVideo)
|
|
||||||
{
|
|
||||||
PAINTSTRUCT ps;
|
|
||||||
HBRUSH br;
|
|
||||||
HDC dc;
|
|
||||||
long left, top, width, height;
|
|
||||||
|
|
||||||
if (S_OK == vidwin->GetWindowPosition (&left, &top, &width, &height))
|
|
||||||
{
|
|
||||||
dc = BeginPaint (Window, &ps);
|
|
||||||
if (dc != NULL)
|
|
||||||
{
|
|
||||||
RECT rect = { left, top, left+width, top+height };
|
|
||||||
ScreenToClient (hWnd, (LPPOINT)&rect.left);
|
|
||||||
ScreenToClient (hWnd, (LPPOINT)&rect.right);
|
|
||||||
br = (HBRUSH)GetStockObject (BLACK_BRUSH);
|
|
||||||
switch (ExcludeClipRect (dc, rect.left, rect.top, rect.right, rect.bottom))
|
|
||||||
{
|
|
||||||
case SIMPLEREGION:
|
|
||||||
case COMPLEXREGION:
|
|
||||||
FillRect (dc, &ps.rcPaint, br);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
EndPaint (Window, &ps);
|
|
||||||
//return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_DESTROY:
|
|
||||||
case WM_KEYDOWN:
|
|
||||||
case WM_SYSKEYDOWN:
|
|
||||||
/*
|
|
||||||
case WM_LBUTTONDOWN:
|
|
||||||
case WM_RBUTTONDOWN:
|
|
||||||
case WM_MBUTTONDOWN:
|
|
||||||
*/
|
|
||||||
if (MovieNotDone)
|
|
||||||
{
|
|
||||||
if (wParam == VK_ESCAPE || message == WM_CANCELMODE || message == WM_DESTROY)
|
|
||||||
{
|
|
||||||
control->Stop ();
|
|
||||||
MovieNotDone = false;
|
|
||||||
MovieInterrupted = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (message == WM_DESTROY)
|
|
||||||
{
|
|
||||||
MovieDestroyed = true;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_GETMINMAXINFO:
|
|
||||||
if (screen && !FullVideo)
|
|
||||||
{
|
|
||||||
LPMINMAXINFO mmi = (LPMINMAXINFO)lParam;
|
|
||||||
RECT rect = { 0, 0, screen->GetWidth(), screen->GetHeight() };
|
|
||||||
AdjustWindowRectEx(&rect, WS_VISIBLE|WS_OVERLAPPEDWINDOW, FALSE, WS_EX_APPWINDOW);
|
|
||||||
mmi->ptMinTrackSize.x = rect.right - rect.left;
|
|
||||||
mmi->ptMinTrackSize.y = rect.bottom - rect.top;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_SETTINGCHANGE:
|
|
||||||
// In case regional settings were changed, reget preferred languages
|
|
||||||
language.Callback ();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return DefWindowProc (hWnd, message, wParam, lParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
int I_PlayMovie (const char *name)
|
|
||||||
{
|
|
||||||
HRESULT hr;
|
|
||||||
int returnval = MOVIE_Failed;
|
|
||||||
size_t namelen = strlen (name) + 1;
|
|
||||||
wchar_t *uniname = new wchar_t[namelen];
|
|
||||||
bool returnSound = false;
|
|
||||||
bool runningFull = false;
|
|
||||||
bool hotkey = false;
|
|
||||||
size_t i;
|
|
||||||
MSG msg;
|
|
||||||
|
|
||||||
MovieNotDone = true;
|
|
||||||
|
|
||||||
if (MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, name, -1, uniname, (int)namelen) == 0)
|
|
||||||
{ // Could not convert name to Unicode
|
|
||||||
goto bomb1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert slashes to backslashes because IGraphBuilder cannot deal with them
|
|
||||||
for (i = 0; i < namelen; ++i)
|
|
||||||
{
|
|
||||||
if (uniname[i] == L'/')
|
|
||||||
uniname[i] = L'\\';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FAILED(hr = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
|
|
||||||
IID_IGraphBuilder, (void **)&graph)))
|
|
||||||
{
|
|
||||||
goto bomb1;
|
|
||||||
}
|
|
||||||
|
|
||||||
control = NULL;
|
|
||||||
event = NULL;
|
|
||||||
vidwin = NULL;
|
|
||||||
audio = NULL;
|
|
||||||
video = NULL;
|
|
||||||
|
|
||||||
if (FAILED(hr = graph->RenderFile (uniname, NULL)))
|
|
||||||
{
|
|
||||||
goto bomb2;
|
|
||||||
}
|
|
||||||
|
|
||||||
graph->QueryInterface (IID_IMediaControl, (void **)&control);
|
|
||||||
graph->QueryInterface (IID_IMediaEventEx, (void **)&event);
|
|
||||||
graph->QueryInterface (IID_IVideoWindow, (void **)&vidwin);
|
|
||||||
graph->QueryInterface (IID_IBasicAudio, (void **)&audio);
|
|
||||||
graph->QueryInterface (IID_IBasicVideo, (void **)&video);
|
|
||||||
|
|
||||||
if (control == NULL || event == NULL)
|
|
||||||
{
|
|
||||||
goto bomb3;
|
|
||||||
}
|
|
||||||
|
|
||||||
GSnd->MovieDisableSound ();
|
|
||||||
returnSound = true;
|
|
||||||
|
|
||||||
CheckIfVideo ();
|
|
||||||
SetTheVolume ();
|
|
||||||
|
|
||||||
FullVideo = false;
|
|
||||||
|
|
||||||
if (vidwin != NULL)
|
|
||||||
{
|
|
||||||
FullVideo = runningFull = screen->IsFullscreen ();
|
|
||||||
|
|
||||||
// If the message drain cannot be set, then we simply won't be able
|
|
||||||
// to catch mouse button presses in the video window.
|
|
||||||
HRESULT drainhr = vidwin->put_MessageDrain ((OAHWND)Window);
|
|
||||||
|
|
||||||
if (FullVideo)
|
|
||||||
{
|
|
||||||
// Try to avoid nasty palette flashes by clearing the screen to black.
|
|
||||||
// Does not always work. :-(
|
|
||||||
static_cast<Win32Video *> (Video)->BlankForGDI ();
|
|
||||||
static_cast<Win32Video *> (Video)->GoFullscreen (false);
|
|
||||||
static_cast<BaseWinFB *> (screen)->ReleaseResources ();
|
|
||||||
if (FAILED (drainhr) || FAILED(hr = vidwin->put_FullScreenMode (OATRUE)))
|
|
||||||
{
|
|
||||||
SizeWindowForVideo ();
|
|
||||||
FullVideo = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!FullVideo)
|
|
||||||
{
|
|
||||||
vidwin->put_Owner ((OAHWND)Window);
|
|
||||||
vidwin->put_WindowStyle (WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
|
|
||||||
SetMovieSize ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RegisterHotKey (Window, 0, MOD_ALT, VK_TAB);
|
|
||||||
hotkey = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FAILED (hr = event->SetNotifyWindow ((OAHWND)Window, WM_GRAPHNOTIFY, 0)))
|
|
||||||
{
|
|
||||||
goto bomb3;
|
|
||||||
}
|
|
||||||
|
|
||||||
SetPriorityClass (GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
|
|
||||||
|
|
||||||
I_CheckNativeMouse (true);
|
|
||||||
SetWindowLongPtr (Window, GWLP_WNDPROC, (LONG_PTR)MovieWndProc);
|
|
||||||
|
|
||||||
if (FAILED (hr = control->Run ()))
|
|
||||||
{
|
|
||||||
goto bomb4;
|
|
||||||
}
|
|
||||||
|
|
||||||
MovieInterrupted = false;
|
|
||||||
MovieDestroyed = false;
|
|
||||||
|
|
||||||
while (MovieNotDone && GetMessage (&msg, NULL, 0, 0))
|
|
||||||
{
|
|
||||||
TranslateMessage (&msg);
|
|
||||||
DispatchMessage (&msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
returnval = MovieInterrupted ? MOVIE_Played_Aborted :
|
|
||||||
NoVideo ? MOVIE_Played_NoVideo :
|
|
||||||
MOVIE_Played;
|
|
||||||
|
|
||||||
bomb4:
|
|
||||||
SetWindowLongPtr (Window, GWLP_WNDPROC, (LONG_PTR)WndProc);
|
|
||||||
SetPriorityClass (GetCurrentProcess(), INGAME_PRIORITY_CLASS);
|
|
||||||
|
|
||||||
bomb3:
|
|
||||||
if (hotkey)
|
|
||||||
{
|
|
||||||
UnregisterHotKey (Window, 0);
|
|
||||||
}
|
|
||||||
if (vidwin != NULL)
|
|
||||||
{
|
|
||||||
if (!FullVideo)
|
|
||||||
{
|
|
||||||
vidwin->put_Visible (OAFALSE);
|
|
||||||
vidwin->put_Owner (NULL);
|
|
||||||
}
|
|
||||||
vidwin->Release ();
|
|
||||||
}
|
|
||||||
if (video != NULL)
|
|
||||||
{
|
|
||||||
video->Release ();
|
|
||||||
}
|
|
||||||
if (audio != NULL)
|
|
||||||
{
|
|
||||||
audio->Release ();
|
|
||||||
}
|
|
||||||
if (event != NULL)
|
|
||||||
{
|
|
||||||
event->Release ();
|
|
||||||
}
|
|
||||||
if (control != NULL)
|
|
||||||
{
|
|
||||||
control->Release ();
|
|
||||||
}
|
|
||||||
|
|
||||||
SetActiveWindow (Window);
|
|
||||||
|
|
||||||
bomb2:
|
|
||||||
graph->Release ();
|
|
||||||
|
|
||||||
if (returnSound)
|
|
||||||
{
|
|
||||||
GSnd->MovieResumeSound ();
|
|
||||||
C_FlushDisplay ();
|
|
||||||
}
|
|
||||||
if (runningFull)
|
|
||||||
{
|
|
||||||
static_cast<Win32Video *> (Video)->GoFullscreen (true);
|
|
||||||
static_cast<BaseWinFB *> (screen)->CreateResources ();
|
|
||||||
}
|
|
||||||
|
|
||||||
bomb1:
|
|
||||||
delete[] uniname;
|
|
||||||
|
|
||||||
if (MovieDestroyed)
|
|
||||||
{
|
|
||||||
exit (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnval;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void CheckIfVideo ()
|
|
||||||
{
|
|
||||||
long visible;
|
|
||||||
|
|
||||||
if (vidwin == NULL || video == NULL)
|
|
||||||
{
|
|
||||||
NoVideo = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (vidwin->get_Visible (&visible) == E_NOINTERFACE)
|
|
||||||
{
|
|
||||||
NoVideo = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NoVideo = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NoVideo)
|
|
||||||
{
|
|
||||||
if (vidwin != NULL)
|
|
||||||
{
|
|
||||||
vidwin->Release ();
|
|
||||||
vidwin = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
DHUDMessage *message = new DHUDMessage (
|
|
||||||
"This movie either does not contain a video stream "
|
|
||||||
"or no suitable decompressor could be found.",
|
|
||||||
1.5f, 0.375f, 0, 0, CR_RED, 1.f);
|
|
||||||
StatusBar->AttachMessage (message);
|
|
||||||
screen->Lock (false);
|
|
||||||
StatusBar->Draw (HUD_None);
|
|
||||||
StatusBar->DrawTopStuff (HUD_None);
|
|
||||||
screen->Update ();
|
|
||||||
StatusBar->DetachMessage (message);
|
|
||||||
delete message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SetTheVolume ()
|
|
||||||
{
|
|
||||||
if (audio != NULL)
|
|
||||||
{
|
|
||||||
// Convert snd_movievolume from a linear range to 1/100th
|
|
||||||
// decibels and pass that to the IBasicAudio interface.
|
|
||||||
long volume;
|
|
||||||
|
|
||||||
if (snd_movievolume == 0.f)
|
|
||||||
{
|
|
||||||
volume = -10000;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
volume = (long)(log10 (snd_movievolume) * 10000.0);
|
|
||||||
}
|
|
||||||
audio->put_Volume (volume);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SizeWindowForVideo ()
|
|
||||||
{
|
|
||||||
LONG width, height;
|
|
||||||
|
|
||||||
if (video == NULL || FAILED (video->GetVideoSize (&width, &height)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
SetWindowPos (Window, NULL, 0, 0,
|
|
||||||
width + 2*GetSystemMetrics(SM_CXBORDER),
|
|
||||||
height + GetSystemMetrics(SM_CYCAPTION) + 2*GetSystemMetrics(SM_CYBORDER),
|
|
||||||
SWP_NOMOVE|SWP_NOOWNERZORDER);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SetMovieSize ()
|
|
||||||
{
|
|
||||||
LONG width, height, left, top;
|
|
||||||
RECT grc;
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
GetClientRect (Window, &grc);
|
|
||||||
|
|
||||||
hr = video->GetVideoSize (&width, &height);
|
|
||||||
if (FAILED (hr))
|
|
||||||
{
|
|
||||||
vidwin->SetWindowPosition (0, 0, grc.right, grc.bottom);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
double aspect = (double)height / (double)width;
|
|
||||||
|
|
||||||
// Calculate size of video window that fits in our window
|
|
||||||
if (grc.right > grc.bottom)
|
|
||||||
{
|
|
||||||
height = grc.bottom;
|
|
||||||
width = (LONG)((double)height / aspect);
|
|
||||||
}
|
|
||||||
if (grc.right <= grc.bottom || width > grc.right)
|
|
||||||
{
|
|
||||||
width = grc.right;
|
|
||||||
height = (LONG)((double)width * aspect);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Then center it
|
|
||||||
left = (grc.right - width) / 2;
|
|
||||||
top = (grc.bottom - height) / 2;
|
|
||||||
|
|
||||||
// And use it
|
|
||||||
vidwin->SetWindowPosition (left, top, width, height);
|
|
||||||
|
|
||||||
InvalidateRect (Window, NULL, FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // I_DO_NOT_LIKE_BIG_DOWNLOADS
|
|
|
@ -136,7 +136,6 @@ protected:
|
||||||
|
|
||||||
bool Windowed;
|
bool Windowed;
|
||||||
|
|
||||||
friend int I_PlayMovie (const char *name);
|
|
||||||
friend class Win32Video;
|
friend class Win32Video;
|
||||||
|
|
||||||
BaseWinFB() {}
|
BaseWinFB() {}
|
||||||
|
|
|
@ -336,7 +336,7 @@ bool Win32Video::GoFullscreen (bool yes)
|
||||||
HRESULT hr[2];
|
HRESULT hr[2];
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
// FIXME: Do this right for D3D. (This function is only called by the movie player when using D3D.)
|
// FIXME: Do this right for D3D.
|
||||||
if (D3D != NULL)
|
if (D3D != NULL)
|
||||||
{
|
{
|
||||||
return yes;
|
return yes;
|
||||||
|
@ -372,7 +372,7 @@ bool Win32Video::GoFullscreen (bool yes)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flips to the GDI surface and clears it; used by the movie player
|
// Flips to the GDI surface and clears it
|
||||||
void Win32Video::BlankForGDI ()
|
void Win32Video::BlankForGDI ()
|
||||||
{
|
{
|
||||||
static_cast<BaseWinFB *> (screen)->Blank ();
|
static_cast<BaseWinFB *> (screen)->Blank ();
|
||||||
|
|
|
@ -1104,12 +1104,12 @@ digits = [0-9];
|
||||||
|
|
||||||
long FString::ToLong (int base) const
|
long FString::ToLong (int base) const
|
||||||
{
|
{
|
||||||
return strtol (Chars, NULL, base);
|
return (long)strtoll (Chars, NULL, base);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long FString::ToULong (int base) const
|
unsigned long FString::ToULong (int base) const
|
||||||
{
|
{
|
||||||
return strtoul (Chars, NULL, base);
|
return (unsigned long)strtoull (Chars, NULL, base);
|
||||||
}
|
}
|
||||||
|
|
||||||
double FString::ToDouble () const
|
double FString::ToDouble () const
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
in vec4 pixelpos;
|
in vec4 pixelpos;
|
||||||
in vec2 glowdist;
|
|
||||||
out vec4 FragColor;
|
out vec4 FragColor;
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
|
@ -287,7 +287,7 @@ class PathFollower : Actor
|
||||||
|
|
||||||
if (Interpolate ())
|
if (Interpolate ())
|
||||||
{
|
{
|
||||||
Time += (8. / (CurrNode.args[1] * TICRATE));
|
Time += (8. / (max(1, CurrNode.args[1]) * TICRATE));
|
||||||
if (Time > 1.)
|
if (Time > 1.)
|
||||||
{
|
{
|
||||||
Time -= 1.;
|
Time -= 1.;
|
||||||
|
|
|
@ -126,7 +126,7 @@ class PlayerPawn : Actor native
|
||||||
let powerup = Powerup(FindInventory(powerupType));
|
let powerup = Powerup(FindInventory(powerupType));
|
||||||
if(powerup != null)
|
if(powerup != null)
|
||||||
{
|
{
|
||||||
let maxtics = GetDefaultByType(powerupType).EffectTics;
|
let maxtics = GetDefaultByType(pg).EffectTics;
|
||||||
if (maxtics == 0) maxtics = powerup.default.EffectTics;
|
if (maxtics == 0) maxtics = powerup.default.EffectTics;
|
||||||
return powerup.EffectTics, maxtics;
|
return powerup.EffectTics, maxtics;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1345,7 +1345,7 @@ flickerlight2 FIREBULL
|
||||||
attenuate 1
|
attenuate 1
|
||||||
color 1.0 0.7 0.0
|
color 1.0 0.7 0.0
|
||||||
size 96
|
size 96
|
||||||
secondarysize - 105
|
secondarysize 130
|
||||||
interval 0.1
|
interval 0.1
|
||||||
offset 0 40 0
|
offset 0 40 0
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue