Merge tag 'g2.3.2'

# Conflicts:
#	src/p_effect.cpp
#	src/p_secnodes.cpp
#	src/r_draw.cpp
#	src/r_things.cpp
#	src/win32/win32video.cpp
This commit is contained in:
nashmuhandes 2017-02-05 18:34:29 +08:00
commit 4521f9eabc
30 changed files with 141 additions and 52 deletions

View file

@ -258,5 +258,6 @@ DEFINE_SPECIAL(Ceiling_LowerByTexture, 269, 2, 4, 4)
DEFINE_SPECIAL(Stairs_BuildDownDoom, 270, 5, 5, 5)
DEFINE_SPECIAL(Stairs_BuildUpDoomSync, 271, 4, 4, 4)
DEFINE_SPECIAL(Stairs_BuildDownDoomSync, 272, 4, 4, 4)
DEFINE_SPECIAL(Stairs_BuildUpDoomCrush, 273, 5, 5, 5)
#undef DEFINE_SPECIAL

View file

@ -1040,7 +1040,11 @@ FString BuildString (int argc, FString *argv)
for (arg = 0; arg < argc; arg++)
{
if (strchr(argv[arg], '"'))
if (argv[arg][0] == '\0')
{ // It's an empty argument, we need to convert it to '""'
buf << "\"\" ";
}
else if (strchr(argv[arg], '"'))
{ // If it contains one or more quotes, we need to escape them.
buf << '"';
long substr_start = 0, quotepos;

View file

@ -675,6 +675,9 @@ DThinker *FThinkerIterator::Next (bool exact)
{
return thinker;
}
// This can actually happen when a Destroy call on 'thinker' happens to destroy 'm_CurrThinker'.
// In that case there is no chance to recover, we have to terminate the iteration of this list.
if (m_CurrThinker == nullptr) break;
}
}
if ((m_SearchingFresh = !m_SearchingFresh))

View file

@ -644,6 +644,8 @@ void AInventory::BecomeItem ()
RemoveFromHash ();
flags &= ~MF_SPECIAL;
ChangeStatNum(STAT_INVENTORY);
// stop all sounds this item is playing.
for(int i = 1;i<=7;i++) S_StopSound(this, i);
SetState (FindState("Held"));
}

View file

@ -307,6 +307,9 @@ void FMapInfoParser::ParseGameInfo()
GAMEINFOKEY_STRINGARRAY(finalePages, "finalePage", 8, true)
GAMEINFOKEY_STRINGARRAY(infoPages, "addinfoPage", 8, false)
GAMEINFOKEY_STRINGARRAY(infoPages, "infoPage", 8, true)
GAMEINFOKEY_STRINGARRAY(PrecachedClasses, "precacheclasses", 0, false)
GAMEINFOKEY_STRINGARRAY(PrecachedTextures, "precachetextures", 0, false)
GAMEINFOKEY_STRINGARRAY(PrecachedSounds, "precachesounds", 0, false)
GAMEINFOKEY_STRING(PauseSign, "pausesign")
GAMEINFOKEY_STRING(quitSound, "quitSound")
GAMEINFOKEY_STRING(BorderFlat, "borderFlat")

View file

@ -36,6 +36,7 @@
#include "basictypes.h"
#include "zstring.h"
#include "s_sound.h"
// Flags are not user configurable and only depend on the standard IWADs
#define GI_MAPxx 0x00000001
@ -120,6 +121,10 @@ struct gameinfo_t
TArray<FName> DefaultWeaponSlots[10];
TArray<FName> PlayerClasses;
TArray<FName> PrecachedClasses;
TArray<FString> PrecachedTextures;
TArray<FSoundID> PrecachedSounds;
FString titleMusic;
int titleOrder;
float titleTime;

View file

@ -184,7 +184,9 @@ void FLightDefaults::ApplyProperties(ADynamicLight * light) const
if (m_additive) light->flags4 |= MF4_ADDITIVE;
if (m_dontlightself) light->flags4 |= MF4_DONTLIGHTSELF;
light->m_tickCount = 0;
if (m_type == PulseLight)
switch (m_type)
{
case PulseLight:
{
float pulseTime = float(m_Param / TICRATE);
@ -193,6 +195,36 @@ void FLightDefaults::ApplyProperties(ADynamicLight * light) const
light->m_cycler.ShouldCycle(true);
light->m_cycler.SetCycleType(CYCLE_Sin);
light->m_currentRadius = light->m_cycler.GetVal();
break;
}
case FlickerLight:
case RandomFlickerLight:
{
float minrad = float(MIN(light->m_Radius[0], light->m_Radius[1]));
float maxrad = float(MAX(light->m_Radius[0], light->m_Radius[1]));
light->m_currentRadius = clamp(light->m_currentRadius, minrad, maxrad);
break;
}
case PointLight:
light->m_currentRadius = float(light->m_Radius[0]);
break;
case SectorLight:
{
float intensity;
float scale = light->args[LIGHT_SCALE] / 8.f;
if (scale == 0.f) scale = 1.f;
intensity = light->Sector->lightlevel * scale;
intensity = clamp<float>(intensity, 0.f, 255.f);
light->m_currentRadius = intensity;
break;
}
}
switch (m_attenuate)

View file

@ -1108,6 +1108,9 @@ bool DPlayerMenu::MouseEvent(int type, int x, int y)
SendNewColor (RPART(color), GPART(color), v);
}
break;
case NAME_Autoaim:
AutoaimChanged(li);
break;
}
}
return res;

View file

@ -272,7 +272,7 @@ void P_ThinkParticles ()
auto oldtrans = particle->alpha;
particle->alpha -= particle->fadestep;
particle->size += particle->sizestep;
if (oldtrans < particle->alpha || --particle->ttl <= 0 || (particle->size <= 0))
if (particle->alpha <= 0 || oldtrans < particle->alpha || --particle->ttl <= 0 || (particle->size <= 0))
{ // The particle has expired, so free it
memset (particle, 0, sizeof(particle_t));
if (prev)
@ -763,7 +763,7 @@ void P_DrawRailTrail(AActor *source, TArray<SPortalHit> &portalhits, int color1,
int spiralduration = (duration == 0) ? 35 : duration;
p->alpha = 1.f;
p->ttl = duration;
p->ttl = spiralduration;
p->fadestep = FADEFROMTTL(spiralduration);
p->size = 3;
p->bright = fullbright;

View file

@ -626,7 +626,7 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line,
floor->m_PauseTime = 0;
floor->m_StepTime = floor->m_PerStepTime = persteptime;
floor->m_Crush = (!(usespecials & DFloor::stairUseSpecials) && speed == 4) ? 10 : -1; //jff 2/27/98 fix uninitialized crush field
floor->m_Crush = (usespecials & DFloor::stairCrush) ? 10 : -1; //jff 2/27/98 fix uninitialized crush field
floor->m_Hexencrush = false;
floor->m_Speed = speed;

View file

@ -591,6 +591,13 @@ FUNC(LS_Stairs_BuildUpDoom)
arg2, SPEED(arg1), TICS(arg3), arg4, 0, 0);
}
FUNC(LS_Stairs_BuildUpDoomCrush)
// Stairs_BuildUpDoom (tag, speed, height, delay, reset)
{
return EV_BuildStairs(arg0, DFloor::buildUp, ln,
arg2, SPEED(arg1), TICS(arg3), arg4, 0, DFloor::stairCrush);
}
FUNC(LS_Stairs_BuildDownDoom)
// Stair_BuildDownDoom (tag, speed, height, delay, reset)
{
@ -3582,6 +3589,7 @@ static lnSpecFunc LineSpecials[] =
/* 270 */ LS_Stairs_BuildDownDoom,
/* 271 */ LS_Stairs_BuildUpDoomSync,
/* 272 */ LS_Stairs_BuildDownDoomSync,
/* 273 */ LS_Stairs_BuildUpDoomCrush,
};

View file

@ -3379,6 +3379,11 @@ static void P_PrecacheLevel()
actorhitlist[actor->GetClass()] = true;
}
for (auto n : gameinfo.PrecachedClasses)
{
PClassActor *cls = PClass::FindActor(n);
if (cls != NULL) actorhitlist[cls] = true;
}
for (unsigned i = 0; i < level.info->PrecacheClasses.Size(); i++)
{
// level.info can only store names, no class pointers.
@ -3415,6 +3420,11 @@ static void P_PrecacheLevel()
hitlist[sky2texture.GetIndex()] |= FTextureManager::HIT_Sky;
}
for (auto n : gameinfo.PrecachedTextures)
{
FTextureID tex = TexMan.CheckForTexture(n, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_TryAny | FTextureManager::TEXMAN_ReturnFirst);
if (tex.Exists()) hitlist[tex.GetIndex()] |= FTextureManager::HIT_Wall;
}
for (unsigned i = 0; i < level.info->PrecacheTextures.Size(); i++)
{
FTextureID tex = TexMan.CheckForTexture(level.info->PrecacheTextures[i], FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_TryAny | FTextureManager::TEXMAN_ReturnFirst);

View file

@ -116,6 +116,7 @@ public:
sightend = t2->PosRelative(task->portalgroup);
sightstart.Z += t1->Height * 0.75;
portalgroup = task->portalgroup;
Startfrac = task->Frac;
Trace = { sightstart.X, sightstart.Y, sightend.X - sightstart.X, sightend.Y - sightstart.Y };
Lastztop = Lastzbottom = sightstart.Z;
@ -790,6 +791,7 @@ sightcounts[2]++;
bool traverseres = P_SightTraverseIntercepts ( );
if (itres == -1) return false; // if the iterator had an early out there was no line of sight. The traverser was only called to collect more portals.
if (seeingthing->Sector->PortalGroup != portalgroup) return false; // We are in a different group than the seeingthing, so this trace cannot determine visibility alone.
return traverseres;
}

View file

@ -504,7 +504,8 @@ public:
enum EStairType
{
stairUseSpecials = 1,
stairSync = 2
stairSync = 2,
stairCrush = 4,
};
DFloor (sector_t *sec);

View file

@ -481,6 +481,10 @@ void S_PrecacheLevel ()
{
actor->MarkPrecacheSounds();
}
for (auto i : gameinfo.PrecachedSounds)
{
level.info->PrecacheSounds[i].MarkUsed();
}
// Precache all extra sounds requested by this map.
for (i = 0; i < level.info->PrecacheSounds.Size(); ++i)
{

View file

@ -2336,6 +2336,7 @@ void ZCCCompiler::CompileFunction(ZCC_StructWork *c, ZCC_FuncDeclarator *f, bool
sym->Variants[0].Implementation->DefaultArgs = std::move(argdefaults);
}
PClass *clstype = static_cast<PClass *>(c->Type());
if (varflags & VARF_Virtual)
{
if (sym->Variants[0].Implementation == nullptr)
@ -2349,7 +2350,6 @@ void ZCCCompiler::CompileFunction(ZCC_StructWork *c, ZCC_FuncDeclarator *f, bool
}
if (forclass)
{
PClass *clstype = static_cast<PClass *>(c->Type());
int vindex = clstype->FindVirtualIndex(sym->SymbolName, sym->Variants[0].Proto);
// specifying 'override' is necessary to prevent one of the biggest problem spots with virtual inheritance: Mismatching argument types.
if (varflags & VARF_Override)
@ -2383,6 +2383,14 @@ void ZCCCompiler::CompileFunction(ZCC_StructWork *c, ZCC_FuncDeclarator *f, bool
Error(p, "Virtual functions can only be defined for classes");
}
}
else if (forclass)
{
int vindex = clstype->FindVirtualIndex(sym->SymbolName, sym->Variants[0].Proto);
if (vindex != -1)
{
Error(f, "Function %s attempts to override parent function without 'override' qualifier", FName(f->Name).GetChars());
}
}
}
}

View file

@ -407,7 +407,7 @@ public:
virtual FString GetStats()
{
FString stats;
size_t pos, len;
size_t pos = 0, len = 0;
ALfloat volume;
ALint offset;
ALint processed;
@ -429,28 +429,34 @@ public:
return stats;
}
pos = Decoder->getSampleOffset();
len = Decoder->getSampleLength();
if (Decoder != nullptr)
{
pos = Decoder->getSampleOffset();
len = Decoder->getSampleLength();
}
lock.unlock();
stats = (state == AL_INITIAL) ? "Buffering" : (state == AL_STOPPED) ? "Underrun" :
(state == AL_PLAYING || state == AL_PAUSED) ? "Ready" : "Unknown state";
if(state == AL_STOPPED)
offset = BufferCount * (Data.Size()/FrameSize);
else
{
size_t rem = queued*(Data.Size()/FrameSize) - offset;
if(pos > rem) pos -= rem;
else if(len > 0) pos += len - rem;
else pos = 0;
}
pos = (size_t)(pos * 1000.0 / SampleRate);
len = (size_t)(len * 1000.0 / SampleRate);
stats.AppendFormat(",%3u%% buffered", 100 - 100*offset/(BufferCount*(Data.Size()/FrameSize)));
stats.AppendFormat(", %zu.%03zu", pos/1000, pos%1000);
if(len > 0)
stats.AppendFormat(" / %zu.%03zu", len/1000, len%1000);
if (Decoder != nullptr)
{
if (state == AL_STOPPED)
offset = BufferCount * (Data.Size() / FrameSize);
else
{
size_t rem = queued*(Data.Size() / FrameSize) - offset;
if (pos > rem) pos -= rem;
else if (len > 0) pos += len - rem;
else pos = 0;
}
pos = (size_t)(pos * 1000.0 / SampleRate);
len = (size_t)(len * 1000.0 / SampleRate);
stats.AppendFormat(",%3u%% buffered", 100 - 100 * offset / (BufferCount*(Data.Size() / FrameSize)));
stats.AppendFormat(", %zu.%03zu", pos / 1000, pos % 1000);
if (len > 0)
stats.AppendFormat(" / %zu.%03zu", len / 1000, len % 1000);
}
if(state == AL_PAUSED)
stats += ", paused";
if(state == AL_PLAYING)

View file

@ -41,12 +41,12 @@ const char *GetVersionString();
/** Lots of different version numbers **/
#define VERSIONSTR "2.3pre"
#define VERSIONSTR "2.3.2"
// The version as seen in the Windows resource
#define RC_FILEVERSION 2,3,9999,0
#define RC_PRODUCTVERSION 2,3,9999,0
#define RC_PRODUCTVERSION2 "2.3pre"
#define RC_FILEVERSION 2,3,2,0
#define RC_PRODUCTVERSION 2,3,2,0
#define RC_PRODUCTVERSION2 "2.3.2"
// Version identifier for network games.
// Bump it every time you do a release unless you're certain you

View file

@ -352,6 +352,11 @@ DFrameBuffer *Win32GLVideo::CreateFrameBuffer(int width, int height, bool fs, DF
{
Win32GLFrameBuffer *fb;
if (fs)
{
I_ClosestResolution(&width, &height, 32);
}
m_DisplayWidth = width;
m_DisplayHeight = height;
m_DisplayBits = 32;

View file

@ -1779,7 +1779,6 @@ DSPLYMNU_SCREENSIZE = "Screen size";
DSPLYMNU_BRIGHTNESS = "Brightness";
DSPLYMNU_VSYNC = "Vertical Sync";
DSPLYMNU_CAPFPS = "Rendering Interpolation";
DSPLYMNU_COLUMNMETHOD = "Column render mode";
DSPLYMNU_WIPETYPE = "Screen wipe style";
DSPLYMNU_SHOWENDOOM = "Show ENDOOM screen";
DSPLYMNU_BLOODFADE = "Blood Flash Intensity";

View file

@ -594,12 +594,6 @@ OptionMenu "JoystickConfigMenu"
//
//-------------------------------------------------------------------------------------------
OptionValue ColumnMethods
{
0.0, "$OPTVAL_ORIGINAL"
1.0, "$OPTVAL_OPTIMIZED"
}
OptionValue SkyModes
{
0.0, "$OPTVAL_NORMAL"
@ -684,7 +678,6 @@ OptionMenu "VideoOptions"
Slider "$DSPLYMNU_BLOODFADE", "blood_fade_scalar", 0.0, 1.0, 0.05, 2
Slider "$DSPLYMNU_PICKUPFADE", "pickup_fade_scalar", 0.0, 1.0, 0.05, 2
Slider "$DSPLYMNU_WATERFADE", "underwater_fade_scalar", 0.0, 1.0, 0.05, 2
Option "$DSPLYMNU_COLUMNMETHOD", "r_columnmethod", "ColumnMethods"
StaticText " "
Option "$DSPLYMNU_WIPETYPE", "wipetype", "Wipes"

View file

@ -99,7 +99,7 @@ include "xlat/defines.i"
97 = WALK|REP|MONST, Teleport (0, tag)
98 = WALK|REP, Floor_LowerToHighest (tag, F_FAST, 136)
99 = USE|REP, Door_LockedRaise (tag, D_FAST, 0, BCard | CardIsSkull)
100 = WALK, Stairs_BuildUpDoom (tag, ST_TURBO, 16, 0, 0)
100 = WALK, Stairs_BuildUpDoomCrush (tag, ST_TURBO, 16, 0, 0)
101 = USE, Floor_RaiseToLowestCeiling (tag, F_SLOW)
102 = USE, Floor_LowerToHighest (tag, F_SLOW, 128)
103 = USE, Door_Open (tag, D_SLOW)
@ -126,7 +126,7 @@ include "xlat/defines.i"
124 = WALK, Exit_Secret (0)
125 = MONWALK, Teleport (0, tag)
126 = MONWALK|REP, Teleport (0, tag)
127 = USE, Stairs_BuildUpDoom (tag, ST_TURBO, 16, 0, 0)
127 = USE, Stairs_BuildUpDoomCrush (tag, ST_TURBO, 16, 0, 0)
128 = WALK|REP, Floor_RaiseToNearest (tag, F_SLOW)
129 = WALK|REP, Floor_RaiseToNearest (tag, F_FAST)
130 = WALK, Floor_RaiseToNearest (tag, F_FAST)
@ -259,9 +259,9 @@ include "xlat/defines.i"
254 = 0, Scroll_Texture_Model (lineid, 0)
255 = 0, Scroll_Texture_Offsets ()
256 = WALK|REP, Stairs_BuildUpDoom (tag, ST_SLOW, 8, 0, 0)
257 = WALK|REP, Stairs_BuildUpDoom (tag, ST_TURBO, 16, 0, 0)
257 = WALK|REP, Stairs_BuildUpDoomCrush (tag, ST_TURBO, 16, 0, 0)
258 = USE|REP, Stairs_BuildUpDoom (tag, ST_SLOW, 8, 0, 0)
259 = USE|REP, Stairs_BuildUpDoom (tag, ST_TURBO, 16, 0, 0)
259 = USE|REP, Stairs_BuildUpDoomCrush (tag, ST_TURBO, 16, 0, 0)
260 = 0, TranslucentLine (lineid, 168) // Changed to better reflect the BOOM default
261 = 0, Transfer_CeilingLight (tag)
262 = WALK|MONST, Teleport_Line (tag, tag, 1)

View file

@ -120,7 +120,7 @@ RetailOnly = 121
104 = WALK, Light_MinNeighbor (tag)
108 = WALK, Door_Raise (tag, D_FAST, VDOORWAIT)
109 = WALK, Door_Open (tag, D_FAST)
100 = WALK, Stairs_BuildUpDoom (tag, ST_TURBO, 16, 0, 0)
100 = WALK, Stairs_BuildUpDoomCrush (tag, ST_TURBO, 16, 0, 0)
197 = WALK|REP, ACS_ExecuteAlways (0, 0, 197, tag)
110 = WALK, Door_Close (tag, D_FAST)
119 = WALK, Floor_RaiseToNearest (tag, F_SLOW)
@ -255,7 +255,7 @@ RetailOnly = 121
112 = USE, Door_Open (tag, D_FAST)
113 = USE, Door_Close (tag, D_FAST)
122 = USE, Plat_DownWaitUpStayLip (tag, P_TURBO, PLATWAIT, 0)
127 = USE, Stairs_BuildUpDoom (tag, ST_TURBO, 16, 0, 0)
127 = USE, Stairs_BuildUpDoomCrush (tag, ST_TURBO, 16, 0, 0)
131 = USE, Floor_RaiseToNearest (tag, F_FAST)
133 = USE, Door_LockedRaise (tag, D_FAST, 0, 4)
135 = USE, Door_LockedRaise (tag, D_FAST, 0, 11)

View file

@ -66,7 +66,7 @@ Class ArtiTomeOfPower : PowerupGiver
Loop;
}
bool Use (bool pickup)
override bool Use (bool pickup)
{
Playerinfo p = Owner.player;
if (p && p.morphTics && (p.MorphStyle & MRF_UNDOBYTOMEOFPOWER))

View file

@ -220,7 +220,7 @@ class Ripper : Actor
Stop;
}
int DoSpecialDamage (Actor target, int damage, Name damagetype)
override int DoSpecialDamage (Actor target, int damage, Name damagetype)
{
if (target is "Ironlich")
{ // Less damage to Ironlich bosses

View file

@ -311,7 +311,7 @@ class PhoenixFX2 : Actor
}
int DoSpecialDamage (Actor target, int damage, Name damagetype)
override int DoSpecialDamage (Actor target, int damage, Name damagetype)
{
if (target.player && Random[PhoenixFX2]() < 128)
{ // Freeze player for a bit

View file

@ -402,7 +402,7 @@ class RainPillar : Actor
// Rain pillar 1 ------------------------------------------------------------
int DoSpecialDamage (Actor target, int damage, Name damagetype)
override int DoSpecialDamage (Actor target, int damage, Name damagetype)
{
if (target.bBoss)
{ // Decrease damage for bosses

View file

@ -112,7 +112,7 @@ class Heresiarch : Actor
Stop;
}
void Die (Actor source, Actor inflictor, int dmgflags)
override void Die (Actor source, Actor inflictor, int dmgflags)
{
// The heresiarch just executes a script instead of a special upon death
int script = special;
@ -698,8 +698,8 @@ class SorcBall2 : SorcBall
Actor parent = target;
Actor mo = Spawn("SorcFX2", Pos + (0, 0, parent.Floorclip + Heresiarch.SORC_DEFENSE_HEIGHT), ALLOW_REPLACE);
bReflective = true;
bInvulnerable = true;
parent.bReflective = true;
parent.bInvulnerable = true;
parent.args[0] = Heresiarch.SORC_DEFENSE_TIME;
if (mo) mo.target = parent;
}

View file

@ -28,7 +28,7 @@ class FadeSetter : Actor
RenderStyle "None";
}
void PostBeginPlay()
override void PostBeginPlay()
{
Super.PostBeginPlay();
CurSector.SetFade(color(args[0], args[1], args[2]));

View file

@ -241,7 +241,7 @@ class PhosphorousFire : Actor
Stop;
}
int DoSpecialDamage (Actor target, int damage, Name damagetype)
override int DoSpecialDamage (Actor target, int damage, Name damagetype)
{
if (target.bNoBlood)
{