diff --git a/src/g_cvars.cpp b/src/g_cvars.cpp index cb26743bf..6f661371e 100644 --- a/src/g_cvars.cpp +++ b/src/g_cvars.cpp @@ -36,6 +36,9 @@ #include "c_cvars.h" #include "g_levellocals.h" +CVAR (Bool, cl_spreaddecals, true, CVAR_ARCHIVE) + + CUSTOM_CVAR (Bool, gl_lights, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { for (auto Level : AllLevels()) @@ -45,4 +48,43 @@ CUSTOM_CVAR (Bool, gl_lights, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOIN } } +CUSTOM_CVAR(Int, sv_corpsequeuesize, 64, CVAR_ARCHIVE|CVAR_SERVERINFO) +{ + if (self > 0) + { + for (auto Level : AllLevels()) + { + auto &corpsequeue = Level->CorpseQueue; + while (corpsequeue.Size() > (unsigned)self) + { + AActor *corpse = corpsequeue[0]; + if (corpse) corpse->Destroy(); + corpsequeue.Delete(0); + } + } + } +} + +CUSTOM_CVAR (Int, cl_maxdecals, 1024, CVAR_ARCHIVE) +{ + if (self < 0) + { + self = 0; + } + else for (auto Level : AllLevels()) + { + while (Level->ImpactDecalCount > self) + { + DThinker *thinker = Level->FirstThinker(STAT_AUTODECAL); + if (thinker != NULL) + { + thinker->Destroy(); + } + } + } +} + + + + diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index b4d177490..95677f330 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -98,3 +98,30 @@ CCMD(listlights) } } +CCMD (countdecals) +{ + for (auto Level : AllLevels()) + { + auto iterator = Level->GetThinkerIterator(NAME_None, STAT_AUTODECAL); + int count = 0; + + while (iterator.Next()) + count++; + + Printf("%s: Counted %d impact decals\n", Level->MapName.GetChars(), count); + } +} + +CCMD (spray) +{ + if (who == NULL || argv.argc() < 2) + { + Printf ("Usage: spray \n"); + return; + } + + Net_WriteByte (DEM_SPRAY); + Net_WriteString (argv[1]); +} + + diff --git a/src/g_shared/a_action.cpp b/src/g_shared/a_action.cpp index fb3b9a309..c5e96adcd 100644 --- a/src/g_shared/a_action.cpp +++ b/src/g_shared/a_action.cpp @@ -32,6 +32,8 @@ #include "vm.h" #include "actorinlines.h" +EXTERN_CVAR(Int, sv_corpsequeuesize) + //---------------------------------------------------------------------------- // // PROC A_NoBlocking @@ -88,25 +90,6 @@ void A_Unblock(AActor *self, bool drop) // //---------------------------------------------------------------------------- -CUSTOM_CVAR(Int, sv_corpsequeuesize, 64, CVAR_ARCHIVE|CVAR_SERVERINFO) -{ - if (self > 0) - { - for (auto Level : AllLevels()) - { - auto &corpsequeue = Level->CorpseQueue; - while (corpsequeue.Size() > (unsigned)self) - { - AActor *corpse = corpsequeue[0]; - if (corpse) corpse->Destroy(); - corpsequeue.Delete(0); - } - } - } -} - - - // throw another corpse on the queue DEFINE_ACTION_FUNCTION(AActor, A_QueueCorpse) { diff --git a/src/g_shared/a_decals.cpp b/src/g_shared/a_decals.cpp index a0a27aacd..b53675b23 100644 --- a/src/g_shared/a_decals.cpp +++ b/src/g_shared/a_decals.cpp @@ -45,6 +45,16 @@ #include "g_levellocals.h" #include "vm.h" +EXTERN_CVAR (Bool, cl_spreaddecals) +EXTERN_CVAR (Int, cl_maxdecals) + + +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + struct SpreadInfo { double DecalWidth, DecalLeft, DecalRight; @@ -54,7 +64,12 @@ struct SpreadInfo TArray SpreadStack; }; -CVAR (Bool, cl_spreaddecals, true, CVAR_ARCHIVE) + +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- IMPLEMENT_CLASS(DBaseDecal, false, true) @@ -65,6 +80,12 @@ IMPLEMENT_POINTERS_END IMPLEMENT_CLASS(DImpactDecal, false, false) +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::Construct(double z) { Z = z; @@ -72,6 +93,12 @@ void DBaseDecal::Construct(double z) PicNum.SetInvalid(); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::Construct(const AActor *basis) { Z = basis->Z(); @@ -85,6 +112,12 @@ void DBaseDecal::Construct(const AActor *basis) RenderStyle = basis->RenderStyle; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::Construct(const DBaseDecal *basis) { LeftDistance = basis->LeftDistance; @@ -100,12 +133,24 @@ void DBaseDecal::Construct(const DBaseDecal *basis) } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::OnDestroy () { Remove (); Super::OnDestroy(); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::Remove () { if (WallPrev == nullptr) @@ -120,6 +165,12 @@ void DBaseDecal::Remove () WallNext = nullptr; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -139,6 +190,12 @@ void DBaseDecal::Serialize(FSerializer &arc) ("sector", Sector); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::GetXY (side_t *wall, double &ox, double &oy) const { line_t *line = wall->linedef; @@ -162,18 +219,35 @@ void DBaseDecal::GetXY (side_t *wall, double &ox, double &oy) const oy = v1->fY() + LeftDistance * dy; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::SetShade (uint32_t rgb) { PalEntry *entry = (PalEntry *)&rgb; AlphaColor = rgb | (ColorMatcher.Pick (entry->r, entry->g, entry->b) << 24); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::SetShade (int r, int g, int b) { AlphaColor = MAKEARGB(ColorMatcher.Pick (r, g, b), r, g, b); } +//---------------------------------------------------------------------------- +// // Returns the texture the decal stuck to. +// +//---------------------------------------------------------------------------- + FTextureID DBaseDecal::StickToWall (side_t *wall, double x, double y, F3DFloor *ffloor) { Side = wall; @@ -265,6 +339,12 @@ FTextureID DBaseDecal::StickToWall (side_t *wall, double x, double y, F3DFloor * return tex; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + double DBaseDecal::GetRealZ (const side_t *wall) const { const line_t *line = wall->linedef; @@ -319,6 +399,12 @@ double DBaseDecal::GetRealZ (const side_t *wall) const } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::CalcFracPos (side_t *wall, double x, double y) { line_t *line = wall->linedef; @@ -352,6 +438,12 @@ void DBaseDecal::CalcFracPos (side_t *wall, double x, double y) } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + static void GetWallStuff (side_t *wall, vertex_t *&v1, double &ldx, double &ldy) { line_t *line = wall->linedef; @@ -369,11 +461,23 @@ static void GetWallStuff (side_t *wall, vertex_t *&v1, double &ldx, double &ldy) } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + static double Length (double dx, double dy) { return DVector2(dx, dy).Length(); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + static side_t *NextWall (const side_t *wall) { line_t *line = wall->linedef; @@ -392,6 +496,12 @@ static side_t *NextWall (const side_t *wall) return NULL; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::SpreadLeft (double r, vertex_t *v1, side_t *feelwall, F3DFloor *ffloor, SpreadInfo *spread) { double ldx, ldy; @@ -436,6 +546,12 @@ void DBaseDecal::SpreadLeft (double r, vertex_t *v1, side_t *feelwall, F3DFloor } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::SpreadRight (double r, side_t *feelwall, double wallsize, F3DFloor *ffloor, SpreadInfo *spread) { vertex_t *v1; @@ -476,6 +592,12 @@ void DBaseDecal::SpreadRight (double r, side_t *feelwall, double wallsize, F3DFl } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::Spread (const FDecalTemplate *tpl, side_t *wall, double x, double y, double z, F3DFloor * ffloor) { SpreadInfo spread; @@ -509,6 +631,12 @@ void DBaseDecal::Spread (const FDecalTemplate *tpl, side_t *wall, double x, doub Length (wall->linedef->Delta().X, wall->linedef->Delta().Y), ffloor, &spread); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + DBaseDecal *DBaseDecal::CloneSelf (const FDecalTemplate *tpl, double ix, double iy, double iz, side_t *wall, F3DFloor * ffloor) const { DBaseDecal *decal = Level->CreateThinker(iz); @@ -530,24 +658,11 @@ DBaseDecal *DBaseDecal::CloneSelf (const FDecalTemplate *tpl, double ix, double return decal; } -CUSTOM_CVAR (Int, cl_maxdecals, 1024, CVAR_ARCHIVE) -{ - if (self < 0) - { - self = 0; - } - else for (auto Level : AllLevels()) - { - while (Level->ImpactDecalCount > self) - { - DThinker *thinker = Level->FirstThinker(STAT_AUTODECAL); - if (thinker != NULL) - { - thinker->Destroy(); - } - } - } -} +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- void DImpactDecal::CheckMax () { @@ -562,6 +677,12 @@ void DImpactDecal::CheckMax () } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + DImpactDecal *DImpactDecal::StaticCreate (FLevelLocals *Level, const char *name, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color) { if (cl_maxdecals > 0) @@ -576,6 +697,12 @@ DImpactDecal *DImpactDecal::StaticCreate (FLevelLocals *Level, const char *name, return NULL; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + DImpactDecal *DImpactDecal::StaticCreate (FLevelLocals *Level, const FDecalTemplate *tpl, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color) { DImpactDecal *decal = NULL; @@ -621,6 +748,12 @@ DImpactDecal *DImpactDecal::StaticCreate (FLevelLocals *Level, const FDecalTempl return decal; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + DBaseDecal *DImpactDecal::CloneSelf (const FDecalTemplate *tpl, double ix, double iy, double iz, side_t *wall, F3DFloor * ffloor) const { if (wall->Flags & WALLF_NOAUTODECALS) @@ -648,31 +781,11 @@ DBaseDecal *DImpactDecal::CloneSelf (const FDecalTemplate *tpl, double ix, doubl return decal; } -CCMD (countdecals) -{ - for (auto Level : AllLevels()) - { - auto iterator = Level->GetThinkerIterator(NAME_None, STAT_AUTODECAL); - int count = 0; - - while (iterator.Next()) - count++; - - Printf("%s: Counted %d impact decals\n", Level->MapName.GetChars(), count); - } -} - -CCMD (spray) -{ - if (who == NULL || argv.argc() < 2) - { - Printf ("Usage: spray \n"); - return; - } - - Net_WriteByte (DEM_SPRAY); - Net_WriteString (argv[1]); -} +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- void SprayDecal(AActor *shooter, const char *name, double distance) { @@ -692,6 +805,12 @@ void SprayDecal(AActor *shooter, const char *name, double distance) } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + DBaseDecal *ShootDecal(FLevelLocals *Level, const FDecalTemplate *tpl, sector_t *sec, double x, double y, double z, DAngle angle, double tracedist, bool permanent) { if (tpl == NULL || (tpl = tpl->GetDecal()) == NULL) @@ -728,12 +847,16 @@ DBaseDecal *ShootDecal(FLevelLocals *Level, const FDecalTemplate *tpl, sector_t return NULL; } -DEFINE_ACTION_FUNCTION(ADecal, SpawnDecal) +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + +static void SpawnDecal(AActor *self) { - PARAM_SELF_PROLOGUE(AActor); - const FDecalTemplate *tpl = nullptr; - + if (self->args[0] < 0) { FName name = ENamedName(-self->args[0]); @@ -744,7 +867,7 @@ DEFINE_ACTION_FUNCTION(ADecal, SpawnDecal) int decalid = self->args[0] + (self->args[1] << 8); // [KS] High byte for decals. tpl = DecalLibrary.GetDecalByNum(decalid); } - + // If no decal is specified, don't try to create one. if (tpl != nullptr) { @@ -767,5 +890,11 @@ DEFINE_ACTION_FUNCTION(ADecal, SpawnDecal) { DPrintf (DMSG_ERROR, "Decal actor at (%f,%f) does not have a good template\n", self->X(), self->Y()); } +} + +DEFINE_ACTION_FUNCTION_NATIVE(ADecal, SpawnDecal, SpawnDecal) +{ + PARAM_SELF_PROLOGUE(AActor); + SpawnDecal(self); return 0; } diff --git a/src/g_shared/a_flashfader.cpp b/src/g_shared/a_flashfader.cpp index c93ef7ef4..e08ae8bf6 100644 --- a/src/g_shared/a_flashfader.cpp +++ b/src/g_shared/a_flashfader.cpp @@ -43,6 +43,12 @@ IMPLEMENT_POINTERS_START(DFlashFader) IMPLEMENT_POINTER(ForWho) IMPLEMENT_POINTERS_END +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DFlashFader::Construct (float r1, float g1, float b1, float a1, float r2, float g2, float b2, float a2, float time, AActor *who, bool terminate) @@ -55,6 +61,12 @@ void DFlashFader::Construct (float r1, float g1, float b1, float a1, Terminate = terminate; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DFlashFader::OnDestroy () { if (Terminate) Blends[1][3] = 0.f; // Needed in order to cancel out the secondary fade. @@ -62,6 +74,12 @@ void DFlashFader::OnDestroy () Super::OnDestroy(); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DFlashFader::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -71,6 +89,12 @@ void DFlashFader::Serialize(FSerializer &arc) .Array("blends", Blends[0], 8); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DFlashFader::Tick () { if (ForWho == NULL || ForWho->player == NULL) @@ -87,6 +111,12 @@ void DFlashFader::Tick () SetBlend (1.f - (float)RemainingTics / (float)TotalTics); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DFlashFader::SetBlend (float time) { if (ForWho == NULL || ForWho->player == NULL) @@ -101,6 +131,12 @@ void DFlashFader::SetBlend (float time) player->BlendA = Blends[0][3]*iT + Blends[1][3]*time; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DFlashFader::Cancel () { RemainingTics = 0; diff --git a/src/g_shared/a_lightning.cpp b/src/g_shared/a_lightning.cpp index d52bd1b92..62fae6e44 100644 --- a/src/g_shared/a_lightning.cpp +++ b/src/g_shared/a_lightning.cpp @@ -41,6 +41,12 @@ static FRandom pr_lightning ("Lightning"); IMPLEMENT_CLASS(DLightningThinker, false, false) +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DLightningThinker::Construct() { Stopped = false; @@ -55,6 +61,12 @@ DLightningThinker::~DLightningThinker () { } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DLightningThinker::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -64,6 +76,12 @@ void DLightningThinker::Serialize(FSerializer &arc) ("levels", LightningLightLevels); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DLightningThinker::Tick () { if (!NextLightningFlash || LightningFlashCount) @@ -77,6 +95,12 @@ void DLightningThinker::Tick () } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DLightningThinker::LightningFlash () { int i, j; @@ -179,6 +203,12 @@ void DLightningThinker::LightningFlash () } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DLightningThinker::ForceLightning (int mode) { switch (mode) @@ -196,12 +226,24 @@ void DLightningThinker::ForceLightning (int mode) } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + static DLightningThinker *LocateLightning (FLevelLocals *Level) { auto iterator = Level->GetThinkerIterator(NAME_None, STAT_LIGHTNING); return iterator.Next (); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void FLevelLocals::StartLightning () { const bool isOriginalHexen = (gameinfo.gametype == GAME_Hexen) @@ -237,6 +279,12 @@ void FLevelLocals::StartLightning () } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void FLevelLocals::ForceLightning (int mode) { DLightningThinker *lightning = LocateLightning (this);