mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-25 13:41:05 +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_xinput.cpp
|
||||
win32/i_main.cpp
|
||||
win32/i_movie.cpp
|
||||
win32/i_system.cpp
|
||||
win32/i_specialpaths.cpp
|
||||
win32/st_start.cpp
|
||||
|
@ -629,7 +628,6 @@ set( PLAT_WIN32_SOURCES
|
|||
win32/win32video.cpp )
|
||||
set( PLAT_POSIX_SOURCES
|
||||
posix/i_cd.cpp
|
||||
posix/i_movie.cpp
|
||||
posix/i_steam.cpp )
|
||||
set( PLAT_SDL_SOURCES
|
||||
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_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_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_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')
|
||||
{
|
||||
auto secnum = strtoul(string+2, (char**)&string, 10);
|
||||
auto secnum = (unsigned)strtoull(string+2, (char**)&string, 10);
|
||||
if (*string == ';') string++;
|
||||
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')
|
||||
{
|
||||
long tid = strtol(string+2, (char**)&string, 10);
|
||||
long tid = (long)strtoll(string+2, (char**)&string, 10);
|
||||
if (*string == ';') string++;
|
||||
FActorIterator it(tid);
|
||||
AActor *actor;
|
||||
|
|
|
@ -200,7 +200,7 @@ bool FBaseCVar::ToBool (UCVarValue value, ECVarType type)
|
|||
else if (stricmp (value.String, "false") == 0)
|
||||
return false;
|
||||
else
|
||||
return !!strtol (value.String, NULL, 0);
|
||||
return !!strtoll (value.String, NULL, 0);
|
||||
|
||||
case CVAR_GUID:
|
||||
return false;
|
||||
|
@ -233,7 +233,7 @@ int FBaseCVar::ToInt (UCVarValue value, ECVarType type)
|
|||
else if (stricmp (value.String, "false") == 0)
|
||||
res = 0;
|
||||
else
|
||||
res = strtol (value.String, NULL, 0);
|
||||
res = (int)strtoll (value.String, NULL, 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)
|
||||
ret.Bool = false;
|
||||
else
|
||||
ret.Bool = strtol (value, NULL, 0) != 0;
|
||||
ret.Bool = strtoll (value, NULL, 0) != 0;
|
||||
break;
|
||||
|
||||
case CVAR_Int:
|
||||
|
@ -467,7 +467,7 @@ UCVarValue FBaseCVar::FromString (const char *value, ECVarType type)
|
|||
else if (stricmp (value, "false") == 0)
|
||||
ret.Int = 0;
|
||||
else
|
||||
ret.Int = strtol (value, NULL, 0);
|
||||
ret.Int = (int)strtoll (value, NULL, 0);
|
||||
break;
|
||||
|
||||
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)
|
||||
{
|
||||
if ((GetFlags() & CVAR_CHEAT) && !sv_cheats)
|
||||
{
|
||||
Printf("sv_cheats must be true to set this console variable.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
UCVarValue val;
|
||||
|
||||
// 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_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_CHEAT = 32768,// can be set only when sv_cheats is enabled
|
||||
};
|
||||
|
||||
union UCVarValue
|
||||
|
|
|
@ -705,7 +705,7 @@ void AddCommandString (char *cmd, int keynum)
|
|||
|
||||
if (cmd[4] == ' ')
|
||||
{
|
||||
tics = strtol (cmd + 5, NULL, 0);
|
||||
tics = (int)strtoll (cmd + 5, NULL, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -885,7 +885,7 @@ static int PatchThing (int thingy)
|
|||
while ((result = GetLine ()) == 1)
|
||||
{
|
||||
char *endptr;
|
||||
unsigned long val = strtoul (Line2, &endptr, 10);
|
||||
unsigned long val = (unsigned long)strtoull (Line2, &endptr, 10);
|
||||
size_t linelen = strlen (Line1);
|
||||
|
||||
if (linelen == 10 && stricmp (Line1, "Hit points") == 0)
|
||||
|
@ -1064,11 +1064,7 @@ static int PatchThing (int thingy)
|
|||
{
|
||||
if (IsNum (strval))
|
||||
{
|
||||
// I have no idea why everyone insists on using strtol here even though it fails
|
||||
// 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);
|
||||
value[0] |= (unsigned long)strtoll(strval, NULL, 10);
|
||||
vchanged[0] = true;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -1069,6 +1069,7 @@ void D_PageTicker (void)
|
|||
|
||||
void D_PageDrawer (void)
|
||||
{
|
||||
screen->Clear(0, 0, SCREENWIDTH, SCREENHEIGHT, 0, 0);
|
||||
if (Page != NULL)
|
||||
{
|
||||
screen->DrawTexture (Page, 0, 0,
|
||||
|
@ -1076,11 +1077,9 @@ void D_PageDrawer (void)
|
|||
DTA_Masked, false,
|
||||
DTA_BilinearFilter, true,
|
||||
TAG_DONE);
|
||||
screen->FillBorder (NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
screen->Clear (0, 0, SCREENWIDTH, SCREENHEIGHT, 0, 0);
|
||||
if (!PageBlank)
|
||||
{
|
||||
screen->DrawText (SmallFont, CR_WHITE, 0, 0, "Page graphic goes here", TAG_DONE);
|
||||
|
@ -1405,6 +1404,10 @@ void ParseCVarInfo()
|
|||
{
|
||||
cvarflags &= ~CVAR_ARCHIVE;
|
||||
}
|
||||
else if (stricmp(sc.String, "cheat") == 0)
|
||||
{
|
||||
cvarflags |= CVAR_CHEAT;
|
||||
}
|
||||
else
|
||||
{
|
||||
sc.ScriptError("Unknown cvar attribute '%s'", sc.String);
|
||||
|
@ -2714,6 +2717,7 @@ void D_DoomMain (void)
|
|||
S_Shutdown(); // free all channels and delete playlist
|
||||
C_ClearAliases(); // CCMDs won't be reinitialized so these need to be deleted here
|
||||
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.
|
||||
|
||||
|
|
|
@ -69,6 +69,7 @@ FNamespaceManager Namespaces;
|
|||
|
||||
FTypeTable TypeTable;
|
||||
TArray<PClass *> PClass::AllClasses;
|
||||
TArray<VMFunction**> PClass::FunctionPtrList;
|
||||
bool PClass::bShutdown;
|
||||
bool PClass::bVMOperational;
|
||||
|
||||
|
@ -2840,6 +2841,12 @@ void PClass::StaticShutdown ()
|
|||
TArray<size_t *> uniqueFPs(64);
|
||||
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.
|
||||
GC::FullGC();
|
||||
|
@ -3547,6 +3554,16 @@ VMFunction *PClass::FindFunction(FName clsname, FName funcname)
|
|||
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 **************************************************************/
|
||||
|
||||
|
|
|
@ -848,9 +848,11 @@ public:
|
|||
static PClassActor *FindActor(ENamedName name) { return FindActor(FName(name)); }
|
||||
static PClassActor *FindActor(FName name);
|
||||
static VMFunction *FindFunction(FName cls, FName func);
|
||||
static void FindFunction(VMFunction **pptr, FName cls, FName func);
|
||||
PClass *FindClassTentative(FName name);
|
||||
|
||||
static TArray<PClass *> AllClasses;
|
||||
static TArray<VMFunction**> FunctionPtrList;
|
||||
|
||||
static bool bShutdown;
|
||||
static bool bVMOperational;
|
||||
|
|
|
@ -192,7 +192,7 @@ void FS_EmulateCmd(char * string)
|
|||
else if (sc.Compare("gr_fogcolor"))
|
||||
{
|
||||
sc.MustGetString();
|
||||
level.fadeto = strtol(sc.String, NULL, 16);
|
||||
level.fadeto = (uint32_t)strtoull(sc.String, NULL, 16);
|
||||
}
|
||||
|
||||
else
|
||||
|
|
|
@ -522,7 +522,7 @@ DEFINE_ACTION_FUNCTION(AInventory, DoRespawn)
|
|||
bool AInventory::CallTryPickup(AActor *toucher, AActor **toucher_return)
|
||||
{
|
||||
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 };
|
||||
VMReturn ret[2];
|
||||
int res;
|
||||
|
|
|
@ -1114,7 +1114,7 @@ void G_WorldDone (void)
|
|||
|
||||
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.
|
||||
if (endsequence == NAME_Inter_Strife)
|
||||
{
|
||||
|
|
|
@ -1437,7 +1437,7 @@ class CommandDrawNumber : public CommandDrawString
|
|||
{
|
||||
// num = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem) / TICRATE + 1;
|
||||
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 };
|
||||
int retv;
|
||||
VMReturn ret(&retv);
|
||||
|
@ -2830,7 +2830,7 @@ class CommandDrawBar : public SBarInfoCommand
|
|||
// [value, max] = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem);
|
||||
// value++; max++;
|
||||
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 };
|
||||
VMReturn ret[2];
|
||||
int ival;
|
||||
|
|
|
@ -413,7 +413,7 @@ void InitGLRMapinfoData()
|
|||
|
||||
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_lightadditivesurfaces = opt->lightadditivesurfaces;
|
||||
glset.map_attenuate = opt->attenuate;
|
||||
|
|
|
@ -266,7 +266,7 @@ void ADynamicLight::Tick()
|
|||
|
||||
case FlickerLight:
|
||||
{
|
||||
BYTE rnd = randLight();
|
||||
int rnd = randLight();
|
||||
float pct = specialf1 / 360.f;
|
||||
|
||||
m_currentRadius = float(args[LIGHT_INTENSITY + (rnd >= pct * 255)]);
|
||||
|
@ -293,7 +293,7 @@ void ADynamicLight::Tick()
|
|||
// These need some more work elsewhere
|
||||
case ColorFlickerLight:
|
||||
{
|
||||
BYTE rnd = randLight();
|
||||
int rnd = randLight();
|
||||
float pct = specialf1/360.f;
|
||||
|
||||
m_currentRadius = m_Radius[rnd >= pct * 255];
|
||||
|
@ -391,7 +391,7 @@ void ADynamicLight::UpdateLocation()
|
|||
intensity = m_currentRadius;
|
||||
}
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -126,8 +126,8 @@ public:
|
|||
void ApplyProperties(ADynamicLight * light) const;
|
||||
FName GetName() const { return m_Name; }
|
||||
void SetParameter(double p) { m_Param = p; }
|
||||
void SetArg(int arg, BYTE val) { m_Args[arg] = val; }
|
||||
BYTE GetArg(int arg) { return m_Args[arg]; }
|
||||
void SetArg(int arg, int val) { m_Args[arg] = val; }
|
||||
int GetArg(int arg) { return m_Args[arg]; }
|
||||
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 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))
|
||||
{
|
||||
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_INTENSITY, v);
|
||||
}
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include "r_state.h"
|
||||
#include "d_player.h"
|
||||
#include "g_levellocals.h"
|
||||
#include "r_utility.h"
|
||||
//#include "resources/voxels.h"
|
||||
//#include "gl/gl_intern.h"
|
||||
|
||||
|
@ -1011,6 +1012,13 @@ void gl_RenderModel(GLSprite * spr)
|
|||
// Model space => World space
|
||||
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:
|
||||
// 1) Applying actor angle, pitch and roll to the model
|
||||
gl_RenderState.mModelMatrix.rotate(-angle, 0, 1, 0);
|
||||
|
|
|
@ -552,7 +552,7 @@ CCMD(skyfog)
|
|||
{
|
||||
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);
|
||||
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);
|
||||
else
|
||||
Angles = thing->Angles;
|
||||
|
||||
player_t *player = &players[consoleplayer];
|
||||
FloatRect r;
|
||||
|
|
|
@ -40,6 +40,8 @@
|
|||
#include <intrin.h>
|
||||
|
||||
#define USE_WINDOWS_DWORD
|
||||
#elif defined __APPLE__
|
||||
#include <sys/sysctl.h>
|
||||
#endif
|
||||
|
||||
#include "i_system.h"
|
||||
|
@ -114,6 +116,15 @@ void gl_CalculateCPUSpeed ()
|
|||
gl_SecondsPerCycle = 1.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
|
||||
}
|
||||
|
||||
|
|
|
@ -7,11 +7,11 @@
|
|||
|
||||
extern bool gl_benching;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
||||
extern double gl_SecondsPerCycle;
|
||||
extern double gl_MillisecPerCycle;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
||||
__forceinline long long GetClockCycle ()
|
||||
{
|
||||
#if _M_X64
|
||||
|
@ -21,10 +21,14 @@ __forceinline long long GetClockCycle ()
|
|||
#endif
|
||||
}
|
||||
|
||||
#elif defined(__GNUG__) && defined(__i386__)
|
||||
#elif defined __APPLE__ && (defined __i386__ || defined __x86_64__)
|
||||
|
||||
extern double gl_SecondsPerCycle;
|
||||
extern double gl_MillisecPerCycle;
|
||||
inline long long GetClockCycle()
|
||||
{
|
||||
return __builtin_ia32_rdtsc();
|
||||
}
|
||||
|
||||
#elif defined(__GNUG__) && defined(__i386__)
|
||||
|
||||
inline long long GetClockCycle()
|
||||
{
|
||||
|
@ -42,21 +46,12 @@ inline long long GetClockCycle()
|
|||
|
||||
#else
|
||||
|
||||
extern double gl_SecondsPerCycle;
|
||||
extern double gl_MillisecPerCycle;
|
||||
|
||||
inline long long GetClockCycle ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined (__APPLE__)
|
||||
|
||||
typedef cycle_t glcycle_t;
|
||||
|
||||
#else // !__APPLE__
|
||||
|
||||
class glcycle_t
|
||||
{
|
||||
public:
|
||||
|
@ -100,8 +95,6 @@ private:
|
|||
long long Counter;
|
||||
};
|
||||
|
||||
#endif // __APPLE__
|
||||
|
||||
extern glcycle_t RenderWall,SetupWall,ClipWall;
|
||||
extern glcycle_t RenderFlat,SetupFlat;
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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(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)
|
||||
|
||||
DMenu *DMenu::CurrentMenu;
|
||||
|
|
|
@ -666,7 +666,7 @@ static EColorRange ParseOptionColor(FScanner &sc, FOptionMenuDescriptor *desc)
|
|||
cr = V_FindFontColor(sc.String);
|
||||
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;
|
||||
|
|
|
@ -366,8 +366,8 @@ static bool GetSelectedSize (int *width, int *height)
|
|||
char *breakpt;
|
||||
if (it->GetString(FOptionMenuScreenResolutionLine::SRL_INDEX+hsel, buffer, sizeof(buffer)))
|
||||
{
|
||||
*width = strtol (buffer, &breakpt, 10);
|
||||
*height = strtol (breakpt+1, NULL, 10);
|
||||
*width = (int)strtoll (buffer, &breakpt, 10);
|
||||
*height = (int)strtoll (breakpt+1, NULL, 10);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -982,7 +982,12 @@ CCMD (dump3df)
|
|||
{
|
||||
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];
|
||||
TArray<F3DFloor*> & ffloors=sector->e->XFloor.ffloors;
|
||||
|
||||
|
|
|
@ -54,7 +54,6 @@
|
|||
#include "c_dispatch.h"
|
||||
#include "s_sndseq.h"
|
||||
#include "i_system.h"
|
||||
#include "i_movie.h"
|
||||
#include "sbar.h"
|
||||
#include "m_swap.h"
|
||||
#include "a_sharedglobal.h"
|
||||
|
@ -1086,12 +1085,12 @@ static void ReadArrayVars (FSerializer &file, FWorldGlobalArray *vars, size_t co
|
|||
const char *arraykey;
|
||||
while ((arraykey = file.GetKey()))
|
||||
{
|
||||
int i = (int)strtol(arraykey, nullptr, 10);
|
||||
int i = (int)strtoll(arraykey, nullptr, 10);
|
||||
if (file.BeginObject(nullptr))
|
||||
{
|
||||
while ((arraykey = file.GetKey()))
|
||||
{
|
||||
int k = (int)strtol(arraykey, nullptr, 10);
|
||||
int k = (int)strtoll(arraykey, nullptr, 10);
|
||||
int val;
|
||||
file(nullptr, 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 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)
|
||||
{
|
||||
VMValue params[2] = { marine, weapon };
|
||||
|
@ -6214,7 +6213,7 @@ static void SetMarineWeapon(AActor *marine, int weapon)
|
|||
static void SetMarineSprite(AActor *marine, PClassActor *source)
|
||||
{
|
||||
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)
|
||||
{
|
||||
VMValue params[2] = { marine, source };
|
||||
|
@ -8801,7 +8800,7 @@ scriptwait:
|
|||
break;
|
||||
|
||||
case PCD_PLAYMOVIE:
|
||||
STACK(1) = I_PlayMovie (FBehavior::StaticLookupString (STACK(1)));
|
||||
STACK(1) = -1;
|
||||
break;
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -2541,7 +2541,7 @@ void P_ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec, intmaps
|
|||
case Sector_Set3DFloor:
|
||||
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.
|
||||
}
|
||||
else
|
||||
|
@ -2979,6 +2979,15 @@ static bool P_VerifyBlockMap(int count)
|
|||
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
|
||||
for(tmplist = list; *tmplist != -1; tmplist++)
|
||||
{
|
||||
|
@ -3426,6 +3435,17 @@ void P_FreeLevelData ()
|
|||
{
|
||||
// [ZZ] delete per-map event handlers
|
||||
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();
|
||||
interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level.
|
||||
Renderer->CleanLevelData();
|
||||
|
@ -3578,14 +3598,6 @@ void P_SetupLevel (const char *lumpname, int position)
|
|||
level.maptype = MAPTYPE_UNKNOWN;
|
||||
wminfo.partime = 180;
|
||||
|
||||
MapThingsConverted.Clear();
|
||||
MapThingsUserDataIndex.Clear();
|
||||
MapThingsUserData.Clear();
|
||||
linemap.Clear();
|
||||
FCanvasTextureInfo::EmptyList ();
|
||||
R_FreePastViewers ();
|
||||
P_ClearUDMFKeys();
|
||||
|
||||
if (!savegamerestore)
|
||||
{
|
||||
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.
|
||||
S_Start ();
|
||||
// [RH] Clear all ThingID hash chains.
|
||||
AActor::ClearTIDHashes ();
|
||||
|
||||
// [RH] clear out the mid-screen message
|
||||
C_MidPrint (NULL, NULL);
|
||||
|
|
|
@ -731,7 +731,7 @@ FState *FStateDefinitions::ResolveGotoLabel (AActor *actor, PClassActor *mytype,
|
|||
*pt = '\0';
|
||||
offset = pt + 1;
|
||||
}
|
||||
v = offset ? strtol (offset, NULL, 0) : 0;
|
||||
v = offset ? (int)strtoll (offset, NULL, 0) : 0;
|
||||
|
||||
// Get the state's address.
|
||||
if (type == mytype)
|
||||
|
|
|
@ -103,7 +103,7 @@ loop:
|
|||
c = *sourcep++;
|
||||
if (c == 'x' || c == 'X')
|
||||
{
|
||||
yylval->val = (int)strtol(sourcep, &sourcep, 16);
|
||||
yylval->val = (int)strtoll(sourcep, &sourcep, 16);
|
||||
return TokenTrans[NUM];
|
||||
}
|
||||
else
|
||||
|
@ -114,7 +114,7 @@ loop:
|
|||
char *endp;
|
||||
|
||||
sourcep--;
|
||||
yylval->val = (int)strtol(sourcep, &endp, 10);
|
||||
yylval->val = (int)strtoll(sourcep, &endp, 10);
|
||||
if (*endp == '.')
|
||||
{
|
||||
// It's a float
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include <fnmatch.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
#include "d_ticcmd.h"
|
||||
#include "doomdef.h"
|
||||
|
@ -98,9 +99,29 @@ void SetLanguageIDs()
|
|||
void I_InitTimer();
|
||||
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)
|
||||
{
|
||||
CheckCPUID(&CPU);
|
||||
CalculateCPUSpeed();
|
||||
DumpCPUInfo(&CPU);
|
||||
|
||||
atterm(I_ShutdownSound);
|
||||
|
|
|
@ -534,6 +534,9 @@ CocoaVideo::CocoaVideo()
|
|||
{
|
||||
memset(&m_modeIterator, 0, sizeof m_modeIterator);
|
||||
|
||||
extern void gl_CalculateCPUSpeed();
|
||||
gl_CalculateCPUSpeed();
|
||||
|
||||
// Create OpenGL pixel format
|
||||
|
||||
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)
|
||||
{
|
||||
Type = UDMF_String;
|
||||
IntVal = strtol(val.GetChars(), NULL, 0);
|
||||
IntVal = (int)strtoll(val.GetChars(), NULL, 0);
|
||||
FloatVal = strtod(val.GetChars(), NULL);
|
||||
StringVal = val;
|
||||
return *this;
|
||||
|
|
|
@ -554,12 +554,12 @@ bool FScanner::GetToken ()
|
|||
String[StringLen - 2] == 'u' || String[StringLen - 2] == 'U')
|
||||
{
|
||||
TokenType = TK_UIntConst;
|
||||
Number = strtoul(String, &stopper, 0);
|
||||
Number = (int)strtoull(String, &stopper, 0);
|
||||
Float = (unsigned)Number;
|
||||
}
|
||||
else
|
||||
{
|
||||
Number = strtol(String, &stopper, 0);
|
||||
Number = (int)strtoll(String, &stopper, 0);
|
||||
Float = Number;
|
||||
}
|
||||
}
|
||||
|
@ -660,7 +660,7 @@ bool FScanner::GetNumber ()
|
|||
}
|
||||
else
|
||||
{
|
||||
Number = strtol (String, &stopper, 0);
|
||||
Number = (int)strtoll (String, &stopper, 0);
|
||||
if (*stopper != 0)
|
||||
{
|
||||
ScriptError ("SC_GetNumber: Bad numeric constant \"%s\".", String);
|
||||
|
@ -715,7 +715,7 @@ bool FScanner::CheckNumber ()
|
|||
}
|
||||
else
|
||||
{
|
||||
Number = strtol (String, &stopper, 0);
|
||||
Number = (int)strtoll (String, &stopper, 0);
|
||||
if (*stopper != 0)
|
||||
{
|
||||
UnGet();
|
||||
|
|
|
@ -635,7 +635,7 @@ static void ParseSpriteFrames (PClassActor *info, TArray<FState> &states, TArray
|
|||
char *stop;
|
||||
|
||||
*colon = 0;
|
||||
rate = strtol (token, &stop, 10);
|
||||
rate = (int)strtoll (token, &stop, 10);
|
||||
if (stop == token || rate < 1 || rate > 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, XFLIP, AActor, renderflags),
|
||||
DEFINE_FLAG(RF, YFLIP, AActor, renderflags),
|
||||
DEFINE_FLAG(RF, INTERPOLATEANGLES, AActor, renderflags),
|
||||
|
||||
// Bounce flags
|
||||
DEFINE_FLAG2(BOUNCE_Walls, BOUNCEONWALLS, AActor, BounceFlags),
|
||||
|
|
|
@ -346,6 +346,16 @@ static void PrintProperty(FLispString &out, ZCC_TreeNode *node)
|
|||
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)
|
||||
{
|
||||
ZCC_Enum *enode = (ZCC_Enum *)node;
|
||||
|
@ -944,6 +954,7 @@ void (* const TreeNodePrinter[NUM_AST_NODE_TYPES])(FLispString &, ZCC_TreeNode *
|
|||
PrintVectorInitializer,
|
||||
PrintDeclFlags,
|
||||
PrintExprClassCast,
|
||||
PrintStaticArrayState,
|
||||
PrintProperty,
|
||||
};
|
||||
|
||||
|
|
|
@ -42,15 +42,6 @@
|
|||
#include "m_swap.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 (const char *name)
|
||||
|
|
87
src/stats.h
87
src/stats.h
|
@ -36,78 +36,7 @@
|
|||
|
||||
#include "zstring.h"
|
||||
|
||||
#ifndef _WIN32
|
||||
|
||||
#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__
|
||||
#if !defined _WIN32 && !defined __APPLE__
|
||||
|
||||
#ifdef NO_CLOCK_GETTIME
|
||||
class cycle_t
|
||||
|
@ -171,11 +100,9 @@ private:
|
|||
|
||||
#endif
|
||||
|
||||
#endif // __APPLE__
|
||||
|
||||
#else
|
||||
|
||||
// Windows
|
||||
// Windows and macOS
|
||||
#include "x86.h"
|
||||
|
||||
extern double PerfToSec, PerfToMillisec;
|
||||
|
@ -199,15 +126,19 @@ inline unsigned __int64 rdtsc()
|
|||
#else
|
||||
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)
|
||||
#endif
|
||||
{
|
||||
register unsigned long long tsc;
|
||||
unsigned long long tsc;
|
||||
asm volatile ("\trdtsc\n" : "=A" (tsc));
|
||||
return tsc;
|
||||
}
|
||||
return 0;
|
||||
#endif // __amd64__
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1706,7 +1706,6 @@ void D3DFB::NewRefreshRate ()
|
|||
|
||||
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)
|
||||
|
|
|
@ -2731,7 +2731,7 @@ static bool ReadResponse (HWND hDlg, char *header, SOCKET sock, char *buf, int b
|
|||
char *lenhead = strstr (header, "content-length: ");
|
||||
if (lenhead != 0)
|
||||
{
|
||||
len = strtol (lenhead + 16, NULL, 10);
|
||||
len = (int)strtoll (lenhead + 16, NULL, 10);
|
||||
if (file != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
ShowWindow (GetDlgItem (hDlg, IDC_BOINGPROGRESS), SW_SHOW);
|
||||
|
|
|
@ -595,11 +595,9 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||
break;
|
||||
case WTS_CONSOLE_DISCONNECT:
|
||||
SessionState |= 2;
|
||||
//I_MovieDisableSound ();
|
||||
break;
|
||||
case WTS_CONSOLE_CONNECT:
|
||||
SessionState &= ~2;
|
||||
//I_MovieResumeSound ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -624,10 +622,6 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||
{
|
||||
GSnd->SuspendSound ();
|
||||
}
|
||||
else if (oldstate && !SessionState)
|
||||
{
|
||||
GSnd->MovieResumeSound ();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#ifdef _DEBUG
|
||||
|
@ -953,18 +947,6 @@ FString I_GetFromClipboard (bool return_nothing)
|
|||
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
|
||||
|
|
|
@ -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;
|
||||
|
||||
friend int I_PlayMovie (const char *name);
|
||||
friend class Win32Video;
|
||||
|
||||
BaseWinFB() {}
|
||||
|
|
|
@ -336,7 +336,7 @@ bool Win32Video::GoFullscreen (bool yes)
|
|||
HRESULT hr[2];
|
||||
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)
|
||||
{
|
||||
return yes;
|
||||
|
@ -372,7 +372,7 @@ bool Win32Video::GoFullscreen (bool yes)
|
|||
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 ()
|
||||
{
|
||||
static_cast<BaseWinFB *> (screen)->Blank ();
|
||||
|
|
|
@ -1104,12 +1104,12 @@ digits = [0-9];
|
|||
|
||||
long FString::ToLong (int base) const
|
||||
{
|
||||
return strtol (Chars, NULL, base);
|
||||
return (long)strtoll (Chars, NULL, base);
|
||||
}
|
||||
|
||||
unsigned long FString::ToULong (int base) const
|
||||
{
|
||||
return strtoul (Chars, NULL, base);
|
||||
return (unsigned long)strtoull (Chars, NULL, base);
|
||||
}
|
||||
|
||||
double FString::ToDouble () const
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
in vec4 pixelpos;
|
||||
in vec2 glowdist;
|
||||
out vec4 FragColor;
|
||||
|
||||
//===========================================================================
|
||||
|
|
|
@ -287,7 +287,7 @@ class PathFollower : Actor
|
|||
|
||||
if (Interpolate ())
|
||||
{
|
||||
Time += (8. / (CurrNode.args[1] * TICRATE));
|
||||
Time += (8. / (max(1, CurrNode.args[1]) * TICRATE));
|
||||
if (Time > 1.)
|
||||
{
|
||||
Time -= 1.;
|
||||
|
|
|
@ -126,7 +126,7 @@ class PlayerPawn : Actor native
|
|||
let powerup = Powerup(FindInventory(powerupType));
|
||||
if(powerup != null)
|
||||
{
|
||||
let maxtics = GetDefaultByType(powerupType).EffectTics;
|
||||
let maxtics = GetDefaultByType(pg).EffectTics;
|
||||
if (maxtics == 0) maxtics = powerup.default.EffectTics;
|
||||
return powerup.EffectTics, maxtics;
|
||||
}
|
||||
|
|
|
@ -1345,7 +1345,7 @@ flickerlight2 FIREBULL
|
|||
attenuate 1
|
||||
color 1.0 0.7 0.0
|
||||
size 96
|
||||
secondarysize - 105
|
||||
secondarysize 130
|
||||
interval 0.1
|
||||
offset 0 40 0
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue