From e815474cbe808a6f859a3b9c87ba7fbf66908be7 Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Wed, 12 Apr 2006 01:50:09 +0000 Subject: [PATCH] - Fixed: ACS improperly calculated the address of local variables when returning from one function to another function when the function that was called was used as part of an expression. - Fixed: Using Thing_Hate with arg0 (hater) set to 0 from an open script could crash. - Fixed: Some items along ledges in Hexen's MAP32 (Orchard of Lamentations) appeared at the bottom of the ledge (and consequently inside it) instead of on top of it because the items were placed directly on the lines. AActor::LinkToWorldForMapThing() needs to use the original R_PointOnLineSide() code to handle situations like this. Previously, it just used the original code for straight horizontal/vertical lines and used the new code for diagonal lines. - Fixed: FWadCollection::MergeLumps() used in incorrect realloc. - Fixed: FPlayList::NextLine() did not properly handle blank lines in the playlist. - Changed: Decals now use lightweight thinkers instead of actors. (76 bytes versus 396, so you save 320k if you have 1024 decals present.) - Fixed: Wads added with pullin were loaded immediately after the IWAD. Exec files are now processed immediately before -file but after autoloading wads in D_DoomMain(). - Fixed: sdl/i_system.h unconditionally defined SHARE_DIR, preventing redefinition from the command line. - Fixed: The standard way to include SDL.h is , not . - Fixed: Returned FActiveInterpolation::HashKey()'s return type to size_t, avoiding a pointer truncation warning. SVN r30 (trunk) --- docs/rh-log.txt | 27 ++ src/d_dehacked.cpp | 8 +- src/d_main.cpp | 26 +- src/decallib.cpp | 95 ++--- src/decallib.h | 19 +- src/g_shared/a_decals.cpp | 631 ++++++++++++++++-------------- src/g_shared/a_sharedglobal.h | 59 ++- src/p_acs.cpp | 22 +- src/p_lnspec.cpp | 2 +- src/p_map.cpp | 4 +- src/p_maputl.cpp | 75 ++-- src/p_mobj.cpp | 2 +- src/p_saveg.cpp | 4 +- src/p_teleport.cpp | 2 +- src/po_man.cpp | 12 +- src/r_defs.h | 4 +- src/r_main.cpp | 6 +- src/r_main.h | 2 +- src/r_segs.cpp | 88 ++--- src/s_playlist.cpp | 5 +- src/sdl/hardware.cpp | 2 +- src/sdl/i_input.cpp | 2 +- src/sdl/i_main.cpp | 2 +- src/sdl/i_system.cpp | 2 +- src/sdl/i_system.h | 2 + src/sdl/sdlvideo.cpp | 2 +- src/sound/music_midi_timidity.cpp | 4 +- src/version.h | 4 +- src/w_wad.cpp | 4 +- 29 files changed, 610 insertions(+), 507 deletions(-) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 6149983a8..d23d7919f 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,3 +1,30 @@ +April 11, 2006 +- Fixed: ACS improperly calculated the address of local variables when + returning from one function to another function when the function that + was called was used as part of an expression. +- Fixed: Using Thing_Hate with arg0 (hater) set to 0 from an open script + could crash. +- Fixed: Some items along ledges in Hexen's MAP32 (Orchard of Lamentations) + appeared at the bottom of the ledge (and consequently inside it) instead + of on top of it because the items were placed directly on the lines. + AActor::LinkToWorldForMapThing() needs to use the original R_PointOnLineSide() + code to handle situations like this. Previously, it just used the original + code for straight horizontal/vertical lines and used the new code for + diagonal lines. +- Fixed: FWadCollection::MergeLumps() used in incorrect realloc. +- Fixed: FPlayList::NextLine() did not properly handle blank lines in the + playlist. +- Changed: Decals now use lightweight thinkers instead of actors. (76 bytes + versus 396, so you save 320k if you have 1024 decals present.) +- Fixed: Wads added with pullin were loaded immediately after the IWAD. + Exec files are now processed immediately before -file but after autoloading + wads in D_DoomMain(). +- Fixed: sdl/i_system.h unconditionally defined SHARE_DIR, preventing + redefinition from the command line. +- Fixed: The standard way to include SDL.h is , not . +- Fixed: Returned FActiveInterpolation::HashKey()'s return type to size_t, + avoiding a pointer truncation warning. + April 11, 2006 (Changes by Graf Zahl) - Fixed: Strife's dialogs don't give weapons to the player he already has. - Fixed: The INDIANA cheat in Hexen gives 25 of each item, not just 1. diff --git a/src/d_dehacked.cpp b/src/d_dehacked.cpp index 8ca3e1beb..08b86a3ef 100644 --- a/src/d_dehacked.cpp +++ b/src/d_dehacked.cpp @@ -803,10 +803,10 @@ static int PatchThing (int thingy) else if (stricmp (Line1, "Decal") == 0) { stripwhite (Line2); - const FDecal *decal = DecalLibrary.GetDecalByName (Line2); + const FDecalTemplate *decal = DecalLibrary.GetDecalByName (Line2); if (decal != NULL) { - info->DecalGenerator = const_cast (decal); + info->DecalGenerator = const_cast (decal); } else { @@ -1429,10 +1429,10 @@ static int PatchWeapon (int weapNum) else if (stricmp (Line1, "Decal") == 0) { stripwhite (Line2); - const FDecal *decal = DecalLibrary.GetDecalByName (Line2); + const FDecalTemplate *decal = DecalLibrary.GetDecalByName (Line2); if (decal != NULL) { - info->DecalGenerator = const_cast (decal); + info->DecalGenerator = const_cast (decal); } else { diff --git a/src/d_main.cpp b/src/d_main.cpp index 1aec850a2..6ad5cc72c 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -1919,19 +1919,6 @@ void D_DoomMain (void) I_SetTitleString (IWADTypeNames[IdentifyVersion ()]); GameConfig->DoGameSetup (GameNames[gameinfo.gametype]); - // Run automatically executed files - execFiles = new DArgs; - GameConfig->AddAutoexec (execFiles, GameNames[gameinfo.gametype]); - D_MultiExec (execFiles, true); - delete execFiles; - - // Run .cfg files at the start of the command line. - execFiles = Args.GatherFiles (NULL, ".cfg", false); - D_MultiExec (execFiles, true); - delete execFiles; - - C_ExecCmdLineParams (); // [RH] do all +set commands on the command line - // [RH] zvox.wad - A wad I had intended to be automatically generated // from Q2's pak0.pak so the female and cyborg player could have // voices. I never got around to writing the utility to do it, though. @@ -1965,6 +1952,19 @@ void D_DoomMain (void) D_AddConfigWads (file); } + // Run automatically executed files + execFiles = new DArgs; + GameConfig->AddAutoexec (execFiles, GameNames[gameinfo.gametype]); + D_MultiExec (execFiles, true); + delete execFiles; + + // Run .cfg files at the start of the command line. + execFiles = Args.GatherFiles (NULL, ".cfg", false); + D_MultiExec (execFiles, true); + delete execFiles; + + C_ExecCmdLineParams (); // [RH] do all +set commands on the command line + DArgs *files = Args.GatherFiles ("-file", ".wad", true); if (files->NumArgs() > 0) { diff --git a/src/decallib.cpp b/src/decallib.cpp index 211c52616..b92f4ef0f 100644 --- a/src/decallib.cpp +++ b/src/decallib.cpp @@ -43,6 +43,7 @@ #include "statnums.h" #include "templates.h" #include "r_draw.h" +#include "a_sharedglobal.h" FDecalLib DecalLibrary; @@ -65,7 +66,7 @@ class FDecalGroup : public FDecalBase public: FDecalGroup () : Choices (pr_decalchoice) {} - const FDecal *GetDecal () const; + const FDecalTemplate *GetDecal () const; void AddDecal (FDecalBase *decal, WORD weight) { Choices.AddEntry (decal, weight); @@ -89,7 +90,7 @@ struct FDecalAnimator { FDecalAnimator (const char *name); virtual ~FDecalAnimator (); - virtual DThinker *CreateThinker (AActor *actor) const = 0; + virtual DThinker *CreateThinker (DBaseDecal *actor) const = 0; char *Name; }; @@ -101,9 +102,9 @@ struct DDecalThinker : public DThinker DECLARE_CLASS (DDecalThinker, DThinker) HAS_OBJECT_POINTERS public: - DDecalThinker (AActor *decal) : DThinker (STAT_DECALTHINKER), TheDecal (decal) {} + DDecalThinker (DBaseDecal *decal) : DThinker (STAT_DECALTHINKER), TheDecal (decal) {} void Serialize (FArchive &arc); - AActor *TheDecal; + DBaseDecal *TheDecal; protected: DDecalThinker () : DThinker (STAT_DECALTHINKER) {} }; @@ -121,7 +122,7 @@ void DDecalThinker::Serialize (FArchive &arc) struct FDecalFaderAnim : public FDecalAnimator { FDecalFaderAnim (const char *name) : FDecalAnimator (name) {} - DThinker *CreateThinker (AActor *actor) const; + DThinker *CreateThinker (DBaseDecal *actor) const; int DecayStart; int DecayTime; @@ -131,7 +132,7 @@ class DDecalFader : public DDecalThinker { DECLARE_CLASS (DDecalFader, DDecalThinker) public: - DDecalFader (AActor *decal) : DDecalThinker (decal) {} + DDecalFader (DBaseDecal *decal) : DDecalThinker (decal) {} void Serialize (FArchive &arc); void Tick (); @@ -145,7 +146,7 @@ private: struct FDecalColorerAnim : public FDecalAnimator { FDecalColorerAnim (const char *name) : FDecalAnimator (name) {} - DThinker *CreateThinker (AActor *actor) const; + DThinker *CreateThinker (DBaseDecal *actor) const; int DecayStart; int DecayTime; @@ -156,7 +157,7 @@ class DDecalColorer : public DDecalThinker { DECLARE_CLASS (DDecalColorer, DDecalThinker) public: - DDecalColorer (AActor *decal) : DDecalThinker (decal) {} + DDecalColorer (DBaseDecal *decal) : DDecalThinker (decal) {} void Serialize (FArchive &arc); void Tick (); @@ -171,7 +172,7 @@ private: struct FDecalStretcherAnim : public FDecalAnimator { FDecalStretcherAnim (const char *name) : FDecalAnimator (name) {} - DThinker *CreateThinker (AActor *actor) const; + DThinker *CreateThinker (DBaseDecal *actor) const; int StretchStart; int StretchTime; @@ -182,7 +183,7 @@ class DDecalStretcher : public DDecalThinker { DECLARE_CLASS (DDecalStretcher, DDecalThinker) public: - DDecalStretcher (AActor *decal) : DDecalThinker (decal) {} + DDecalStretcher (DBaseDecal *decal) : DDecalThinker (decal) {} void Serialize (FArchive &arc); void Tick (); @@ -202,7 +203,7 @@ private: struct FDecalSliderAnim : public FDecalAnimator { FDecalSliderAnim (const char *name) : FDecalAnimator (name) {} - DThinker *CreateThinker (AActor *actor) const; + DThinker *CreateThinker (DBaseDecal *actor) const; int SlideStart; int SlideTime; @@ -213,7 +214,7 @@ class DDecalSlider : public DDecalThinker { DECLARE_CLASS (DDecalSlider, DDecalThinker) public: - DDecalSlider (AActor *decal) : DDecalThinker (decal) {} + DDecalSlider (DBaseDecal *decal) : DDecalThinker (decal) {} void Serialize (FArchive &arc); void Tick (); @@ -231,7 +232,7 @@ private: struct FDecalCombinerAnim : public FDecalAnimator { FDecalCombinerAnim (const char *name) : FDecalAnimator (name) {} - DThinker *CreateThinker (AActor *actor) const; + DThinker *CreateThinker (DBaseDecal *actor) const; int FirstAnimator; int NumAnimators; @@ -282,7 +283,7 @@ enum DECAL_LOWERDECAL }; -const FDecal *FDecalBase::GetDecal () const +const FDecalTemplate *FDecalBase::GetDecal () const { return NULL; } @@ -420,7 +421,7 @@ void FDecalLib::ParseDecal () { char decalName[64]; byte decalNum; - FDecal newdecal; + FDecalTemplate newdecal; int code, picnum; SC_MustGetString (); @@ -488,11 +489,11 @@ void FDecalLib::ParseDecal () break; case DECAL_RANDOMFLIPX: - newdecal.RenderFlags |= FDecal::DECAL_RandomFlipX; + newdecal.RenderFlags |= FDecalTemplate::DECAL_RandomFlipX; break; case DECAL_RANDOMFLIPY: - newdecal.RenderFlags |= FDecal::DECAL_RandomFlipY; + newdecal.RenderFlags |= FDecalTemplate::DECAL_RandomFlipY; break; case DECAL_FULLBRIGHT: @@ -826,9 +827,9 @@ void FDecalLib::ParseCombiner () } } -void FDecalLib::AddDecal (const char *name, byte num, const FDecal &decal) +void FDecalLib::AddDecal (const char *name, byte num, const FDecalTemplate &decal) { - FDecal *newDecal = new FDecal; + FDecalTemplate *newDecal = new FDecalTemplate; *newDecal = decal; newDecal->Name = copystring (name); @@ -895,7 +896,7 @@ void FDecalLib::AddDecal (FDecalBase *decal) } } -const FDecal *FDecalLib::GetDecalByNum (byte num) const +const FDecalTemplate *FDecalLib::GetDecalByNum (byte num) const { if (num == 0) { @@ -909,7 +910,7 @@ const FDecal *FDecalLib::GetDecalByNum (byte num) const return NULL; } -const FDecal *FDecalLib::GetDecalByName (const char *name) const +const FDecalTemplate *FDecalLib::GetDecalByName (const char *name) const { if (name == NULL) { @@ -918,7 +919,7 @@ const FDecal *FDecalLib::GetDecalByName (const char *name) const FDecalBase *base = ScanTreeForName (name, Root); if (base != NULL) { - return static_cast(base); + return static_cast(base); } return NULL; } @@ -992,23 +993,23 @@ FDecalBase::~FDecalBase () delete[] Name; } -void FDecal::ApplyToActor (AActor *actor) const +void FDecalTemplate::ApplyToDecal (DBaseDecal *actor) const { if (RenderStyle == STYLE_Shaded) { actor->SetShade (ShadeColor); } actor->Translation = Translation; - actor->xscale = ScaleX; - actor->yscale = ScaleY; - actor->picnum = PicNum; - actor->alpha = Alpha << 1; + actor->XScale = ScaleX; + actor->YScale = ScaleY; + actor->PicNum = PicNum; + actor->Alpha = Alpha << 1; actor->RenderStyle = RenderStyle; - actor->renderflags = (RenderFlags & ~(DECAL_RandomFlipX|DECAL_RandomFlipY)) | - (actor->renderflags & (RF_RELMASK|RF_CLIPMASK|RF_INVISIBLE|RF_ONESIDED)); + actor->RenderFlags = (RenderFlags & ~(DECAL_RandomFlipX|DECAL_RandomFlipY)) | + (actor->RenderFlags & (RF_RELMASK|RF_CLIPMASK|RF_INVISIBLE|RF_ONESIDED)); if (RenderFlags & (DECAL_RandomFlipX|DECAL_RandomFlipY)) { - actor->renderflags ^= pr_decal() & + actor->RenderFlags ^= pr_decal() & ((RenderFlags & (DECAL_RandomFlipX|DECAL_RandomFlipY)) >> 8); } if (Animator != NULL) @@ -1017,7 +1018,7 @@ void FDecal::ApplyToActor (AActor *actor) const } } -const FDecal *FDecal::GetDecal () const +const FDecalTemplate *FDecalTemplate::GetDecal () const { return this; } @@ -1080,7 +1081,7 @@ FDecalLib::FTranslation *FDecalLib::FTranslation::LocateTranslation (DWORD start return trans; } -const FDecal *FDecalGroup::GetDecal () const +const FDecalTemplate *FDecalGroup::GetDecal () const { const FDecalBase *decal = Choices.PickEntry (); const FDecalBase *remember; @@ -1092,7 +1093,7 @@ const FDecal *FDecalGroup::GetDecal () const remember = decal; decal = decal->GetDecal (); } while (decal != remember); - return static_cast(decal); + return static_cast(decal); } FDecalAnimator::FDecalAnimator (const char *name) @@ -1136,12 +1137,12 @@ void DDecalFader::Tick () } if (StartTrans == -1) { - StartTrans = TheDecal->alpha; + StartTrans = TheDecal->Alpha; } int distanceToEnd = TimeToEndDecay - level.maptime; int fadeDistance = TimeToEndDecay - TimeToStartDecay; - TheDecal->alpha = Scale (StartTrans, distanceToEnd, fadeDistance); + TheDecal->Alpha = Scale (StartTrans, distanceToEnd, fadeDistance); if (TheDecal->RenderStyle < STYLE_Translucent) { @@ -1150,7 +1151,7 @@ void DDecalFader::Tick () } } -DThinker *FDecalFaderAnim::CreateThinker (AActor *actor) const +DThinker *FDecalFaderAnim::CreateThinker (DBaseDecal *actor) const { DDecalFader *fader = new DDecalFader (actor); @@ -1176,7 +1177,7 @@ void DDecalStretcher::Serialize (FArchive &arc) << bStarted; } -DThinker *FDecalStretcherAnim::CreateThinker (AActor *actor) const +DThinker *FDecalStretcherAnim::CreateThinker (DBaseDecal *actor) const { DDecalStretcher *thinker = new DDecalStretcher (actor); @@ -1219,11 +1220,11 @@ void DDecalStretcher::Tick () { if (bStretchX) { - TheDecal->xscale = GoalX; + TheDecal->XScale = GoalX; } if (bStretchY) { - TheDecal->yscale = GoalY; + TheDecal->YScale = GoalY; } Destroy (); return; @@ -1231,19 +1232,19 @@ void DDecalStretcher::Tick () if (!bStarted) { bStarted = true; - StartX = TheDecal->xscale; - StartY = TheDecal->yscale; + StartX = TheDecal->XScale; + StartY = TheDecal->YScale; } int distance = level.maptime - TimeToStart; int maxDistance = TimeToStop - TimeToStart; if (bStretchX) { - TheDecal->xscale = StartX + Scale (GoalX - StartX, distance, maxDistance); + TheDecal->XScale = StartX + Scale (GoalX - StartX, distance, maxDistance); } if (bStretchY) { - TheDecal->yscale = StartY + Scale (GoalY - StartY, distance, maxDistance); + TheDecal->YScale = StartY + Scale (GoalY - StartY, distance, maxDistance); } } @@ -1261,7 +1262,7 @@ void DDecalSlider::Serialize (FArchive &arc) << bStarted; } -DThinker *FDecalSliderAnim::CreateThinker (AActor *actor) const +DThinker *FDecalSliderAnim::CreateThinker (DBaseDecal *actor) const { DDecalSlider *thinker = new DDecalSlider (actor); @@ -1304,7 +1305,7 @@ void DDecalSlider::Tick () TheDecal->z = StartY + Scale (DistY, distance, maxDistance); } -DThinker *FDecalCombinerAnim::CreateThinker (AActor *actor) const +DThinker *FDecalCombinerAnim::CreateThinker (DBaseDecal *actor) const { DThinker *thinker = NULL; @@ -1357,7 +1358,7 @@ void DDecalColorer::Tick () } if (StartColor.a == 255) { - StartColor = TheDecal->alphacolor & 0xffffff; + StartColor = TheDecal->AlphaColor & 0xffffff; if (StartColor == GoalColor) { Destroy (); @@ -1378,7 +1379,7 @@ void DDecalColorer::Tick () } } -DThinker *FDecalColorerAnim::CreateThinker (AActor *actor) const +DThinker *FDecalColorerAnim::CreateThinker (DBaseDecal *actor) const { DDecalColorer *Colorer = new DDecalColorer (actor); diff --git a/src/decallib.h b/src/decallib.h index 605d0fda3..f50195a50 100644 --- a/src/decallib.h +++ b/src/decallib.h @@ -40,15 +40,16 @@ #include "tarray.h" class AActor; -class FDecal; +class FDecalTemplate; struct FDecalAnimator; struct TypeInfo; +class DBaseDecal; class FDecalBase { friend class FDecalLib; public: - virtual const FDecal *GetDecal () const; + virtual const FDecalTemplate *GetDecal () const; protected: FDecalBase (); @@ -60,14 +61,14 @@ protected: TArray Users; // Which actors generate this decal }; -class FDecal : public FDecalBase +class FDecalTemplate : public FDecalBase { friend class FDecalLib; public: - FDecal () : Translation (0) {} + FDecalTemplate () : Translation (0) {} - void ApplyToActor (AActor *actor) const; - const FDecal *GetDecal () const; + void ApplyToDecal (DBaseDecal *actor) const; + const FDecalTemplate *GetDecal () const; DWORD ShadeColor; WORD Translation; @@ -92,8 +93,8 @@ public: void ReadDecals (); // SC_Open() should have just been called void ReadAllDecals (); - const FDecal *GetDecalByNum (byte num) const; - const FDecal *GetDecalByName (const char *name) const; + const FDecalTemplate *GetDecalByNum (byte num) const; + const FDecalTemplate *GetDecalByName (const char *name) const; private: struct FTranslation; @@ -102,7 +103,7 @@ private: static FDecalBase *ScanTreeForNum (const BYTE num, FDecalBase *root); static FDecalBase *ScanTreeForName (const char *name, FDecalBase *root); FTranslation *GenerateTranslation (DWORD start, DWORD end); - void AddDecal (const char *name, byte num, const FDecal &decal); + void AddDecal (const char *name, byte num, const FDecalTemplate &decal); void AddDecal (FDecalBase *decal); FDecalAnimator *FindAnimator (const char *name); diff --git a/src/g_shared/a_decals.cpp b/src/g_shared/a_decals.cpp index af48a57a6..4a43e7aa1 100644 --- a/src/g_shared/a_decals.cpp +++ b/src/g_shared/a_decals.cpp @@ -3,7 +3,7 @@ ** Implements the actor that represents decals in the level ** **--------------------------------------------------------------------------- -** Copyright 1998-2005 Randy Heit +** Copyright 1998-2006 Randy Heit ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without @@ -42,35 +42,91 @@ #include "statnums.h" #include "c_dispatch.h" -// Decals overload snext and sprev to keep a list of decals attached to a wall. +static fixed_t DecalWidth, DecalLeft, DecalRight; +static fixed_t SpreadZ; +static const DBaseDecal *SpreadSource; +static const FDecalTemplate *SpreadTemplate; +static TArray SpreadStack; + +static int ImpactCount; +static DImpactDecal *FirstImpact; // (but not the Second or Third Impact :-) +static DImpactDecal *LastImpact; + +CVAR (Bool, cl_spreaddecals, true, CVAR_ARCHIVE) + // They also overload floorclip to be the fractional distance from the // left edge of the side. This distance is stored as a 2.30 fixed pt number. -IMPLEMENT_STATELESS_ACTOR (ADecal, Any, 9200, 0) - PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY) -END_DEFAULTS +IMPLEMENT_CLASS (DBaseDecal) +IMPLEMENT_CLASS (DImpactDecal) -void ADecal::Destroy () +DBaseDecal::DBaseDecal () +: DThinker(STAT_DECAL), + WallNext(0), WallPrev(0), x(0), y(0), z(0), AlphaColor(0), Translation(0), PicNum(0xFFFF), + RenderFlags(0), XScale(8), YScale(8), RenderStyle(0), LeftDistance(0), Alpha(0) +{ +} + +DBaseDecal::DBaseDecal (fixed_t x, fixed_t y, fixed_t z) +: DThinker(STAT_DECAL), + WallNext(0), WallPrev(0), x(x), y(y), z(z), AlphaColor(0), Translation(0), PicNum(0xFFFF), + RenderFlags(0), XScale(8), YScale(8), RenderStyle(0), LeftDistance(0), Alpha(0) +{ +} + +DBaseDecal::DBaseDecal (const AActor *basis) +: DThinker(STAT_DECAL), + WallNext(0), WallPrev(0), x(basis->x), y(basis->y), z(basis->z), AlphaColor(basis->alphacolor), + Translation(basis->Translation), PicNum(basis->picnum), RenderFlags(basis->renderflags), + XScale(basis->xscale), YScale(basis->yscale), RenderStyle(basis->RenderStyle), LeftDistance(0), + Alpha(basis->alpha) +{ +} + +DBaseDecal::DBaseDecal (const DBaseDecal *basis) +: DThinker(STAT_DECAL), + WallNext(0), WallPrev(0), x(basis->x), y(basis->y), z(basis->z), AlphaColor(basis->AlphaColor), + Translation(basis->Translation), PicNum(basis->PicNum), RenderFlags(basis->RenderFlags), + XScale(basis->XScale), YScale(basis->YScale), RenderStyle(basis->RenderStyle), LeftDistance(0), + Alpha(basis->Alpha) +{ +} + +void DBaseDecal::Destroy () { Remove (); Super::Destroy (); } -void ADecal::Remove () +void DBaseDecal::Remove () { - AActor **prev = sprev; - AActor *next = snext; + DBaseDecal **prev = WallPrev; + DBaseDecal *next = WallNext; if (prev && (*prev = next)) - next->sprev = prev; - sprev = NULL; - snext = NULL; + next->WallPrev = prev; + WallPrev = NULL; + WallNext = NULL; } -void ADecal::SerializeChain (FArchive &arc, ADecal **first) +void DBaseDecal::Serialize (FArchive &arc) +{ + Super::Serialize (arc); + arc << x << y << z + << AlphaColor + << Translation + << PicNum + << RenderFlags + << XScale << YScale + << RenderStyle + << LeftDistance + << Alpha; +} + +void DBaseDecal::SerializeChain (FArchive &arc, DBaseDecal **first) { DWORD numInChain; - AActor *fresh; - AActor **firstptr = (AActor **)first; + DBaseDecal *fresh; + DBaseDecal **firstptr = first; if (arc.IsLoading ()) { @@ -80,8 +136,8 @@ void ADecal::SerializeChain (FArchive &arc, ADecal **first) { arc << fresh; *firstptr = fresh; - fresh->sprev = firstptr; - firstptr = &fresh->snext; + fresh->WallPrev = firstptr; + firstptr = &fresh->WallNext; } } else @@ -90,7 +146,7 @@ void ADecal::SerializeChain (FArchive &arc, ADecal **first) fresh = *firstptr; while (fresh != NULL) { - fresh = fresh->snext; + fresh = fresh->WallNext; ++numInChain; } arc.WriteCount (numInChain); @@ -98,24 +154,24 @@ void ADecal::SerializeChain (FArchive &arc, ADecal **first) while (numInChain--) { arc << fresh; - fresh = fresh->snext; + fresh = fresh->WallNext; } } } -void ADecal::MoveChain (ADecal *first, fixed_t x, fixed_t y) +void DBaseDecal::MoveChain (DBaseDecal *first, fixed_t x, fixed_t y) { while (first != NULL) { first->x += x; first->y += y; - first = (ADecal *)first->snext; + first = (DBaseDecal *)first->WallNext; } } -void ADecal::FixForSide (side_t *wall) +void DBaseDecal::FixForSide (side_t *wall) { - AActor *decal = wall->BoundActors; + DBaseDecal *decal = wall->AttachedDecals; line_t *line = &lines[wall->linenum]; int wallnum = int(wall - sides); vertex_t *v1, *v2; @@ -136,83 +192,45 @@ void ADecal::FixForSide (side_t *wall) while (decal != NULL) { - decal->x = v1->x + MulScale2 (decal->floorclip, dx); - decal->y = v1->y + MulScale2 (decal->floorclip, dy); - decal = decal->snext; + decal->x = v1->x + MulScale2 (decal->LeftDistance, dx); + decal->y = v1->y + MulScale2 (decal->LeftDistance, dy); + decal = decal->WallNext; } } -void ADecal::BeginPlay () +void DBaseDecal::SetShade (DWORD rgb) { - Super::BeginPlay (); - - // Decals do not think. - ChangeStatNum (STAT_DECAL); - - // Find a wall to attach to, and set renderflags to keep - // the decal at its current height. If the decal cannot find a wall - // within 64 units, it destroys itself. - // - // Subclasses can set special1 if they don't want this sticky logic. - - if (special1 == 0) - { - DoTrace (); - } - - if (args[0] != 0) - { - const FDecal *decal = DecalLibrary.GetDecalByNum (args[0]); - if (decal != NULL) - { - decal->ApplyToActor (this); - } - } + PalEntry *entry = (PalEntry *)&rgb; + AlphaColor = rgb | (ColorMatcher.Pick (entry->r, entry->g, entry->b) << 24); } -void ADecal::DoTrace () +void DBaseDecal::SetShade (int r, int g, int b) { - FTraceResults trace; - - Trace (x, y, z, Sector, - finecosine[(angle+ANGLE_180)>>ANGLETOFINESHIFT], - finesine[(angle+ANGLE_180)>>ANGLETOFINESHIFT], 0, - 64*FRACUNIT, 0, 0, NULL, trace, TRACE_NoSky); - - if (trace.HitType == TRACE_HitWall) - { - x = trace.X; - y = trace.Y; - StickToWall (sides + trace.Line->sidenum[trace.Side]); - } - else - { - Destroy (); - } + AlphaColor = MAKEARGB(ColorMatcher.Pick (r, g, b), r, g, b); } // Returns the texture the decal stuck to. -int ADecal::StickToWall (side_t *wall) +int DBaseDecal::StickToWall (side_t *wall) { // Stick the decal at the end of the chain so it appears on top - AActor *next, **prev; + DBaseDecal *next, **prev; - prev = (AActor **)&wall->BoundActors; + prev = &wall->AttachedDecals; while (*prev != NULL) { next = *prev; - prev = &next->snext; + prev = &next->WallNext; } *prev = this; - snext = NULL; - sprev = prev; + WallNext = NULL; + WallPrev = prev; /* - snext = wall->BoundActors; - sprev = &wall->BoundActors; - if (snext) - snext->sprev = &snext; - wall->BoundActors = this; + WallNext = wall->AttachedDecals; + WallPrev = &wall->AttachedDecals; + if (WallNext) + WallNext->WallPrev = &WallNext; + wall->AttachedDecals = this; */ sector_t *front, *back; line_t *line; @@ -231,7 +249,7 @@ int ADecal::StickToWall (side_t *wall) } if (back == NULL) { - renderflags |= RF_RELMID; + RenderFlags |= RF_RELMID; if (line->flags & ML_DONTPEGBOTTOM) z -= front->floortexz; else @@ -240,7 +258,7 @@ int ADecal::StickToWall (side_t *wall) } else if (back->floorplane.ZatPoint (x, y) >= z) { - renderflags |= RF_RELLOWER|RF_CLIPLOWER; + RenderFlags |= RF_RELLOWER|RF_CLIPLOWER; if (line->flags & ML_DONTPEGBOTTOM) z -= front->ceilingtexz; else @@ -249,7 +267,7 @@ int ADecal::StickToWall (side_t *wall) } else { - renderflags |= RF_RELUPPER|RF_CLIPUPPER; + RenderFlags |= RF_RELUPPER|RF_CLIPUPPER; if (line->flags & ML_DONTPEGTOP) z -= front->ceilingtexz; else @@ -259,21 +277,10 @@ int ADecal::StickToWall (side_t *wall) CalcFracPos (wall); - // Face the decal away from the wall - angle = R_PointToAngle2 (0, 0, line->dx, line->dy); - if (line->frontsector == front) - { - angle -= ANGLE_90; - } - else - { - angle += ANGLE_90; - } - return tex; } -fixed_t ADecal::GetRealZ (const side_t *wall) const +fixed_t DBaseDecal::GetRealZ (const side_t *wall) const { const line_t *line = &lines[wall->linenum]; const sector_t *front, *back; @@ -293,7 +300,7 @@ fixed_t ADecal::GetRealZ (const side_t *wall) const back = front; } - switch (renderflags & RF_RELMASK) + switch (RenderFlags & RF_RELMASK) { default: return z; @@ -327,16 +334,7 @@ fixed_t ADecal::GetRealZ (const side_t *wall) const } } -void ADecal::Relocate (fixed_t ix, fixed_t iy, fixed_t iz) -{ - Remove (); - x = ix; - y = iy; - z = iz; - DoTrace (); -} - -void ADecal::CalcFracPos (side_t *wall) +void DBaseDecal::CalcFracPos (side_t *wall) { line_t *line = &lines[wall->linenum]; int wallnum = int(wall - sides); @@ -358,123 +356,18 @@ void ADecal::CalcFracPos (side_t *wall) if (abs(dx) > abs(dy)) { - floorclip = SafeDivScale2 (x - v1->x, dx); + LeftDistance = SafeDivScale2 (x - v1->x, dx); } else if (dy != 0) { - floorclip = SafeDivScale2 (y - v1->y, dy); + LeftDistance = SafeDivScale2 (y - v1->y, dy); } else { - floorclip = 0; + LeftDistance = 0; } } -static int ImpactCount; -static AActor *FirstImpact; // (but not the Second or Third Impact :-) -static AActor *LastImpact; - -CVAR (Bool, cl_spreaddecals, true, CVAR_ARCHIVE) - -CUSTOM_CVAR (Int, cl_maxdecals, 1024, CVAR_ARCHIVE) -{ - if (self < 0) - { - self = 0; - } - else - { - while (ImpactCount > self) - { - FirstImpact->Destroy (); - } - } -} - -// Uses: target points to previous impact decal -// tracer points to next impact decal -// -// Note that this means we can't simply serialize an impact decal as-is -// because doing so when many are present in a level could result in -// a lot of recursion and we would run out of stack. Not nice. So instead, -// the save game code calls AImpactDecal::SerializeAll to serialize a -// list of impact decals. - -IMPLEMENT_STATELESS_ACTOR (AImpactDecal, Any, -1, 0) -END_DEFAULTS - -void AImpactDecal::SerializeTime (FArchive &arc) -{ - if (arc.IsLoading ()) - { - ImpactCount = 0; - FirstImpact = LastImpact = NULL; - } -} - -void AImpactDecal::Serialize (FArchive &arc) -{ - if (arc.IsStoring ()) - { - // NULL the next pointer so that the serializer will not follow it - // and possibly run out of stack space. NULLing target isn't - // required; it just makes the archive smaller. - AActor *saved1 = tracer, *saved2 = target; - tracer = NULL; - target = NULL; - Super::Serialize (arc); - tracer = saved1; - target = saved2; - } - else - { - Super::Serialize (arc); - - ImpactCount++; - target = LastImpact; - if (target != NULL) - { - target->tracer = this; - } - else - { - FirstImpact = this; - } - LastImpact = this; - } -} - -void AImpactDecal::BeginPlay () -{ - special1 = 1; // Don't want ADecal to find a wall to stick to - Super::BeginPlay (); - - target = LastImpact; - if (target != NULL) - { - target->tracer = this; - } - else - { - FirstImpact = this; - } - LastImpact = this; -} - -AImpactDecal *AImpactDecal::StaticCreate (const char *name, fixed_t x, fixed_t y, fixed_t z, side_t *wall, PalEntry color) -{ - if (cl_maxdecals > 0) - { - const FDecal *decal = DecalLibrary.GetDecalByName (name); - - if (decal != NULL && (decal = decal->GetDecal()) != NULL) - { - return StaticCreate (decal, x, y, z, wall, color); - } - } - return NULL; -} - static void GetWallStuff (side_t *wall, vertex_t *&v1, fixed_t &ldx, fixed_t &ldy) { line_t *line = &lines[wall->linenum]; @@ -516,13 +409,7 @@ static side_t *NextWall (const side_t *wall) return NULL; } -static fixed_t DecalWidth, DecalLeft, DecalRight; -static fixed_t SpreadZ; -static const AImpactDecal *SpreadSource; -static const FDecal *SpreadDecal; -static TArray SpreadStack; - -void AImpactDecal::SpreadLeft (fixed_t r, vertex_t *v1, side_t *feelwall) +void DBaseDecal::SpreadLeft (fixed_t r, vertex_t *v1, side_t *feelwall) { fixed_t ldx, ldy; @@ -542,7 +429,7 @@ void AImpactDecal::SpreadLeft (fixed_t r, vertex_t *v1, side_t *feelwall) x += Scale (r, ldx, wallsize); y += Scale (r, ldy, wallsize); r = wallsize + startr; - SpreadSource->CloneSelf (SpreadDecal, x, y, SpreadZ, feelwall); + SpreadSource->CloneSelf (SpreadTemplate, x, y, SpreadZ, feelwall); SpreadStack.Push (feelwall); side_t *nextwall = NextWall (feelwall); @@ -566,7 +453,7 @@ void AImpactDecal::SpreadLeft (fixed_t r, vertex_t *v1, side_t *feelwall) } } -void AImpactDecal::SpreadRight (fixed_t r, side_t *feelwall, fixed_t wallsize) +void DBaseDecal::SpreadRight (fixed_t r, side_t *feelwall, fixed_t wallsize) { vertex_t *v1; fixed_t x, y, ldx, ldy; @@ -601,120 +488,220 @@ void AImpactDecal::SpreadRight (fixed_t r, side_t *feelwall, fixed_t wallsize) x -= Scale (r, ldx, wallsize); y -= Scale (r, ldy, wallsize); r = DecalRight - r; - SpreadSource->CloneSelf (SpreadDecal, x, y, SpreadZ, feelwall); + SpreadSource->CloneSelf (SpreadTemplate, x, y, SpreadZ, feelwall); SpreadStack.Push (feelwall); } } -AImpactDecal *AImpactDecal::StaticCreate (const FDecal *decal, fixed_t x, fixed_t y, fixed_t z, side_t *wall, PalEntry color) +void DBaseDecal::Spread (const FDecalTemplate *tpl, side_t *wall) { - AImpactDecal *actor = NULL; - if (decal != NULL && cl_maxdecals > 0 && - !(wall->Flags & WALLF_NOAUTODECALS)) + FTexture *tex; + vertex_t *v1; + fixed_t rorg, ldx, ldy; + int xscale, yscale; + + GetWallStuff (wall, v1, ldx, ldy); + rorg = Length (x - v1->x, y - v1->y); + + tex = TexMan[PicNum]; + int dwidth = tex->GetWidth (); + + xscale = (XScale + 1) << (FRACBITS - 6); + yscale = (YScale + 1) << (FRACBITS - 6); + + DecalWidth = dwidth * xscale; + DecalLeft = tex->LeftOffset * xscale; + DecalRight = DecalWidth - DecalLeft; + SpreadSource = this; + SpreadTemplate = tpl; + SpreadZ = z; + + + // Try spreading left first + SpreadLeft (rorg - DecalLeft, v1, wall); + SpreadStack.Clear (); + + // Then try spreading right + SpreadRight (rorg + DecalRight, wall, + Length (lines[wall->linenum].dx, lines[wall->linenum].dy)); + SpreadStack.Clear (); +} + +DBaseDecal *DBaseDecal::CloneSelf (const FDecalTemplate *tpl, fixed_t ix, fixed_t iy, fixed_t iz, side_t *wall) const +{ + DBaseDecal *decal = new DBaseDecal(ix, iy, iz); + if (decal != NULL) { - if (decal->LowerDecal) + decal->StickToWall (wall); + tpl->ApplyToDecal (decal); + decal->AlphaColor = AlphaColor; + decal->RenderFlags = (decal->RenderFlags & RF_DECALMASK) | + (this->RenderFlags & ~RF_DECALMASK); + } + return decal; +} + +CUSTOM_CVAR (Int, cl_maxdecals, 1024, CVAR_ARCHIVE) +{ + if (self < 0) + { + self = 0; + } + else + { + while (ImpactCount > self) { - StaticCreate (decal->LowerDecal->GetDecal(), x, y, z, wall); + FirstImpact->Destroy (); + } + } +} + +// Uses: target points to previous impact decal +// tracer points to next impact decal +// +// Note that this means we can't simply serialize an impact decal as-is +// because doing so when many are present in a level could result in +// a lot of recursion and we would run out of stack. Not nice. So instead, +// the save game code calls DImpactDecal::SerializeAll to serialize a +// list of impact decals. + +void DImpactDecal::SerializeTime (FArchive &arc) +{ + if (arc.IsLoading ()) + { + ImpactCount = 0; + FirstImpact = LastImpact = NULL; + } +} + +void DImpactDecal::Serialize (FArchive &arc) +{ + Super::Serialize (arc); +} + +DImpactDecal::DImpactDecal () +: ImpactNext(0), ImpactPrev(0) +{ + Link(); +} + +DImpactDecal::DImpactDecal (fixed_t x, fixed_t y, fixed_t z) +: DBaseDecal (x, y, z), + ImpactNext(0), ImpactPrev(0) +{ + Link(); +} + +void DImpactDecal::Link () +{ + ImpactCount++; + ImpactPrev = LastImpact; + if (ImpactPrev != NULL) + { + ImpactPrev->ImpactNext = this; + } + else + { + FirstImpact = this; + } + LastImpact = this; +} + +DImpactDecal *DImpactDecal::StaticCreate (const char *name, fixed_t x, fixed_t y, fixed_t z, side_t *wall, PalEntry color) +{ + if (cl_maxdecals > 0) + { + const FDecalTemplate *tpl = DecalLibrary.GetDecalByName (name); + + if (tpl != NULL && (tpl = tpl->GetDecal()) != NULL) + { + return StaticCreate (tpl, x, y, z, wall, color); + } + } + return NULL; +} + +DImpactDecal *DImpactDecal::StaticCreate (const FDecalTemplate *tpl, fixed_t x, fixed_t y, fixed_t z, side_t *wall, PalEntry color) +{ + DImpactDecal *decal = NULL; + if (tpl != NULL && cl_maxdecals > 0 && !(wall->Flags & WALLF_NOAUTODECALS)) + { + if (tpl->LowerDecal) + { + StaticCreate (tpl->LowerDecal->GetDecal(), x, y, z, wall); } if (ImpactCount >= cl_maxdecals) { FirstImpact->Destroy (); } - ImpactCount++; - actor = Spawn (x, y, z); - if (actor == NULL) - return NULL; + decal = new DImpactDecal (x, y, z); - int stickypic = actor->StickToWall (wall); + int stickypic = decal->StickToWall (wall); FTexture *tex = TexMan[stickypic]; if (tex != NULL && tex->bNoDecals) { - actor->Destroy (); return NULL; } - decal->ApplyToActor (actor); - if (color != 0) actor->SetShade (color.r, color.g, color.b); + if (decal == NULL) + { + return NULL; + } - if (!cl_spreaddecals || actor->picnum == 0xffff) - return actor; + tpl->ApplyToDecal (decal); + if (color != 0) + { + decal->SetShade (color.r, color.g, color.b); + } + + if (!cl_spreaddecals || decal->PicNum == 0xffff) + { + return decal; + } // Spread decal to nearby walls if it does not all fit on this one - vertex_t *v1; - fixed_t rorg, ldx, ldy; - int xscale, yscale; - - GetWallStuff (wall, v1, ldx, ldy); - rorg = Length (x - v1->x, y - v1->y); - - tex = TexMan[actor->picnum]; - int dwidth = tex->GetWidth (); - - xscale = (actor->xscale + 1) << (FRACBITS - 6); - yscale = (actor->yscale + 1) << (FRACBITS - 6); - - DecalWidth = dwidth * xscale; - DecalLeft = tex->LeftOffset * xscale; - DecalRight = DecalWidth - DecalLeft; - SpreadSource = actor; - SpreadDecal = decal; - SpreadZ = z; - - - // Try spreading left first - SpreadLeft (rorg - DecalLeft, v1, wall); - SpreadStack.Clear (); - - // Then try spreading right - SpreadRight (rorg + DecalRight, wall, - Length (lines[wall->linenum].dx, lines[wall->linenum].dy)); - SpreadStack.Clear (); + decal->Spread (tpl, wall); } - return actor; + return decal; } -AImpactDecal *AImpactDecal::CloneSelf (const FDecal *decal, fixed_t ix, fixed_t iy, fixed_t iz, side_t *wall) const +DBaseDecal *DImpactDecal::CloneSelf (const FDecalTemplate *tpl, fixed_t ix, fixed_t iy, fixed_t iz, side_t *wall) const { - AImpactDecal *actor = NULL; - // [SO] We used to have an 'else' here -- but that means we create an actor without increasing the - // count!!! - // [RH] Moved this before the destroy, just so it can't go negative temporarily. - ImpactCount++; if (ImpactCount >= cl_maxdecals) { FirstImpact->Destroy (); } - actor = Spawn (ix, iy, iz); - if (actor != NULL) + DImpactDecal *decal = new DImpactDecal(ix, iy, iz); + if (decal != NULL) { - actor->StickToWall (wall); - decal->ApplyToActor (actor); - actor->alphacolor = alphacolor; - actor->renderflags = (actor->renderflags & RF_DECALMASK) | - (this->renderflags & ~RF_DECALMASK); + decal->StickToWall (wall); + tpl->ApplyToDecal (decal); + decal->AlphaColor = AlphaColor; + decal->RenderFlags = (decal->RenderFlags & RF_DECALMASK) | + (this->RenderFlags & ~RF_DECALMASK); } - return actor; + return decal; } -void AImpactDecal::Destroy () +void DImpactDecal::Destroy () { - if (target != NULL) + if (ImpactPrev != NULL) { - target->tracer = tracer; + ImpactPrev->ImpactNext = ImpactNext; } - if (tracer != NULL) + if (ImpactNext != NULL) { - tracer->target = target; + ImpactNext->ImpactPrev = ImpactPrev; } if (LastImpact == this) { - LastImpact = target; + LastImpact = ImpactPrev; } if (FirstImpact == this) { - FirstImpact = tracer; + FirstImpact = ImpactNext; } ImpactCount--; @@ -728,7 +715,7 @@ CCMD (countdecals) CCMD (countdecalsreal) { - TThinkerIterator iterator (STAT_DECAL); + TThinkerIterator iterator (STAT_DECAL); int count = 0; while (iterator.Next()) @@ -761,9 +748,67 @@ CCMD (spray) { if (trace.HitType == TRACE_HitWall) { - AImpactDecal::StaticCreate (argv[1], + DImpactDecal::StaticCreate (argv[1], trace.X, trace.Y, trace.Z, sides + trace.Line->sidenum[trace.Side]); } } } + +class ADecal : public AActor +{ + DECLARE_STATELESS_ACTOR (ADecal, AActor); +public: + void BeginPlay (); + bool DoTrace (DBaseDecal *decal, angle_t angle, sector_t *sec); +}; + +IMPLEMENT_STATELESS_ACTOR (ADecal, Any, 9200, 0) +END_DEFAULTS + +void ADecal::BeginPlay () +{ + Super::BeginPlay (); + + // Find a wall to attach to, and set RenderFlags to keep + // the decal at its current height. If the decal cannot find a wall + // within 64 units, it destroys itself. + // + // Subclasses can set special1 if they don't want this sticky logic. + + DBaseDecal *decal = new DBaseDecal (this); + + if (!DoTrace (decal, angle, Sector)) + { + decal->Destroy(); + return; + } + + if (args[0] != 0) + { + const FDecalTemplate *tpl = DecalLibrary.GetDecalByNum (args[0]); + if (tpl != NULL) + { + tpl->ApplyToDecal (decal); + } + } +} + +bool ADecal::DoTrace (DBaseDecal *decal, angle_t angle, sector_t *sec) +{ + FTraceResults trace; + + Trace (x, y, z, sec, + finecosine[(angle+ANGLE_180)>>ANGLETOFINESHIFT], + finesine[(angle+ANGLE_180)>>ANGLETOFINESHIFT], 0, + 64*FRACUNIT, 0, 0, NULL, trace, TRACE_NoSky); + + if (trace.HitType == TRACE_HitWall) + { + decal->x = trace.X; + decal->y = trace.Y; + decal->StickToWall (sides + trace.Line->sidenum[trace.Side]); + return true; + } + return false; +} diff --git a/src/g_shared/a_sharedglobal.h b/src/g_shared/a_sharedglobal.h index 297b0302c..85a0f4b02 100644 --- a/src/g_shared/a_sharedglobal.h +++ b/src/g_shared/a_sharedglobal.h @@ -5,7 +5,7 @@ #include "info.h" #include "actor.h" -class FDecal; +class FDecalTemplate; struct vertex_s; struct side_s; @@ -50,32 +50,57 @@ class ARealGibs : public AActor struct side_s; -class ADecal : public AActor +class DBaseDecal : public DThinker { - DECLARE_STATELESS_ACTOR (ADecal, AActor) + DECLARE_CLASS (DBaseDecal, DThinker) public: - void BeginPlay (); + DBaseDecal (); + DBaseDecal (fixed_t x, fixed_t y, fixed_t z); + DBaseDecal (const AActor *actor); + DBaseDecal (const DBaseDecal *basis); + + void Serialize (FArchive &arc); void Destroy (); int StickToWall (side_s *wall); - void Relocate (fixed_t x, fixed_t y, fixed_t z); fixed_t GetRealZ (const side_s *wall) const; + void SetShade (DWORD rgb); + void SetShade (int r, int g, int b); + void Spread (const FDecalTemplate *tpl, side_s *wall); - static void SerializeChain (FArchive &arc, ADecal **firstptr); - static void MoveChain (ADecal *first, fixed_t x, fixed_t y); + static void SerializeChain (FArchive &arc, DBaseDecal **firstptr); + static void MoveChain (DBaseDecal *first, fixed_t x, fixed_t y); static void FixForSide (side_s *side); + DBaseDecal *WallNext, **WallPrev; + + fixed_t x, y, z; + DWORD AlphaColor; + WORD Translation; + WORD PicNum; + WORD RenderFlags; + BYTE XScale, YScale; + BYTE RenderStyle; + fixed_t LeftDistance; + fixed_t Alpha; + protected: + virtual DBaseDecal *CloneSelf (const FDecalTemplate *tpl, fixed_t x, fixed_t y, fixed_t z, side_s *wall) const; void CalcFracPos (side_s *wall); - void DoTrace (); void Remove (); + + static void SpreadLeft (fixed_t r, vertex_s *v1, side_s *feelwall); + static void SpreadRight (fixed_t r, side_s *feelwall, fixed_t wallsize); }; -class AImpactDecal : public ADecal +class DImpactDecal : public DBaseDecal { - DECLARE_STATELESS_ACTOR (AImpactDecal, ADecal) + DECLARE_CLASS (DImpactDecal, DBaseDecal) public: - static AImpactDecal *StaticCreate (const char *name, fixed_t x, fixed_t y, fixed_t z, side_s *wall, PalEntry color=0); - static AImpactDecal *StaticCreate (const FDecal *decal, fixed_t x, fixed_t y, fixed_t z, side_s *wall, PalEntry color=0); + DImpactDecal (fixed_t x, fixed_t y, fixed_t z); + DImpactDecal (side_s *wall, const FDecalTemplate *templ); + + static DImpactDecal *StaticCreate (const char *name, fixed_t x, fixed_t y, fixed_t z, side_s *wall, PalEntry color=0); + static DImpactDecal *StaticCreate (const FDecalTemplate *tpl, fixed_t x, fixed_t y, fixed_t z, side_s *wall, PalEntry color=0); void BeginPlay (); void Destroy (); @@ -83,10 +108,14 @@ public: void Serialize (FArchive &arc); static void SerializeTime (FArchive &arc); + DImpactDecal *ImpactNext, *ImpactPrev; + protected: - AImpactDecal *CloneSelf (const FDecal *decal, fixed_t x, fixed_t y, fixed_t z, side_s *wall) const; - static void SpreadLeft (fixed_t r, vertex_s *v1, side_s *feelwall); - static void SpreadRight (fixed_t r, side_s *feelwall, fixed_t wallsize); + DBaseDecal *CloneSelf (const FDecalTemplate *tpl, fixed_t x, fixed_t y, fixed_t z, side_s *wall) const; + +private: + DImpactDecal(); + void Link(); }; class AWaterSplashBase : public AActor diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 49865dbfc..b4b11ddec 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -77,11 +77,11 @@ FRandom pr_acs ("ACS"); struct CallReturn { - int ReturnAddress; ScriptFunction *ReturnFunction; FBehavior *ReturnModule; - BYTE bDiscardResult; - BYTE Pad[3]; + SDWORD *ReturnLocals; + int ReturnAddress; + int bDiscardResult; }; static SDWORD Stack[STACK_SIZE]; @@ -2330,6 +2330,7 @@ int DLevelScript::RunScript () int i; ScriptFunction *func; FBehavior *module = activeBehavior; + SDWORD *mylocals; funcnum = NEXTBYTE; func = activeBehavior->GetFunction (funcnum, module); @@ -2345,6 +2346,7 @@ int DLevelScript::RunScript () state = SCRIPT_PleaseRemove; break; } + mylocals = locals; // The function's first argument is also its first local variable. locals = &Stack[sp - func->ArgCount]; // Make space on the stack for any other variables the function uses. @@ -2356,6 +2358,7 @@ int DLevelScript::RunScript () ((CallReturn *)&Stack[sp])->ReturnAddress = activeBehavior->PC2Ofs (pc); ((CallReturn *)&Stack[sp])->ReturnFunction = activeFunction; ((CallReturn *)&Stack[sp])->ReturnModule = activeBehavior; + ((CallReturn *)&Stack[sp])->ReturnLocals = mylocals; ((CallReturn *)&Stack[sp])->bDiscardResult = (pcd == PCD_CALLDISCARD); sp += sizeof(CallReturn)/sizeof(int); pc = module->Ofs2PC (func->Address); @@ -2381,19 +2384,12 @@ int DLevelScript::RunScript () } sp -= sizeof(CallReturn)/sizeof(int); retState = (CallReturn *)&Stack[sp]; + sp = locals - Stack; pc = retState->ReturnModule->Ofs2PC (retState->ReturnAddress); - sp -= activeFunction->ArgCount + activeFunction->LocalCount; activeFunction = retState->ReturnFunction; activeBehavior = retState->ReturnModule; fmt = activeBehavior->GetFormat(); - if (activeFunction == NULL) - { - locals = localvars; - } - else - { - locals = &Stack[sp - activeFunction->ArgCount - activeFunction->LocalCount - sizeof(CallReturn)/sizeof(int)]; - } + locals = retState->ReturnLocals; if (!retState->bDiscardResult) { Stack[sp++] = value; @@ -3393,7 +3389,7 @@ int DLevelScript::RunScript () static const char logbar[] = "\n<------------------------------->\n"; workreal[0] = '\x1c'; - workreal[1] = color >= CR_BRICK && color <= CR_YELLOW ? 'A' + color : '-'; + workreal[1] = color >= CR_BRICK && color <= CR_YELLOW ? color + 'A' : '-'; AddToConsole (-1, bar); AddToConsole (-1, workreal); AddToConsole (-1, bar); diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 9622a16c6..63140c97a 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -1137,7 +1137,7 @@ FUNC(LS_Thing_Hate) if (arg0 == 0) { - if (it->player) + if (it != NULL && it->player != NULL) { // Players cannot have their attitudes set return false; diff --git a/src/p_map.cpp b/src/p_map.cpp index 93b62302b..15743c1bc 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -2860,7 +2860,7 @@ void P_TraceBleed (int damage, fixed_t x, fixed_t y, fixed_t z, AActor *actor, a bloodcolor.a=1; } - AImpactDecal::StaticCreate (bloodType, + DImpactDecal::StaticCreate (bloodType, bleedtrace.X, bleedtrace.Y, bleedtrace.Z, sides + bleedtrace.Line->sidenum[bleedtrace.Side], bloodcolor); @@ -4492,7 +4492,7 @@ void SpawnShootDecal (AActor *t1, const FTraceResults &trace) } if (decalbase != NULL) { - AImpactDecal::StaticCreate (decalbase->GetDecal (), + DImpactDecal::StaticCreate (decalbase->GetDecal (), trace.X, trace.Y, trace.Z, sides + trace.Line->sidenum[trace.Side]); } } diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index 6c87c56d0..83782d22e 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -434,12 +434,59 @@ void AActor::LinkToWorld (sector_t *sec) // Emulate buggy PointOnLineSide and fix actors that lie on // lines to compensate for some IWAD maps. // +static int R_PointOnSideSlow (fixed_t x, fixed_t y, node_t *node) +{ + // [RH] This might have been faster than two multiplies and an + // add on a 386/486, but it certainly isn't on anything newer than that. + fixed_t dx; + fixed_t dy; + fixed_t left; + fixed_t right; + + if (!node->dx) + { + if (x <= node->x) + return node->dy > 0; + + return node->dy < 0; + } + if (!node->dy) + { + if (y <= node->y) + return node->dx < 0; + + return node->dx > 0; + } + + dx = (x - node->x); + dy = (y - node->y); + + // Try to quickly decide by looking at sign bits. + if ( (node->dy ^ node->dx ^ dx ^ dy)&0x80000000 ) + { + if ( (node->dy ^ dx) & 0x80000000 ) + { + // (left is negative) + return 1; + } + return 0; + } + + left = FixedMul ( node->dy>>FRACBITS , dx ); + right = FixedMul ( dy , node->dx>>FRACBITS ); + + if (right < left) + { + // front side + return 0; + } + // back side + return 1; +} + sector_t *AActor::LinkToWorldForMapThing () { - node_t *node; - int side; - - node = nodes + numnodes - 1; + node_t *node = nodes + numnodes - 1; do { @@ -451,25 +498,7 @@ sector_t *AActor::LinkToWorldForMapThing () // that lies directly on a line should always be // considered as "in front" of the line. The orientation // of the line should be irrelevant. - if (node->dx == 0) - { - if (x <= node->x) - side = node->dy > 0; - else - side = node->dy < 0; - } - else if (node->dy == 0) - { - if (y <= node->y) - side = node->dx < 0; - else - side = node->dx > 0; - } - else - { - side = R_PointOnSide (x, y, node); - } - node = (node_t *)node->children[side]; + node = (node_t *)node->children[R_PointOnSideSlow (x, y, node)]; } while (!((size_t)node & 1)); diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 9a090e87b..f09fbcde6 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -986,7 +986,7 @@ void P_ExplodeMissile (AActor *mo, line_t *line) y = line->v1->y + MulScale30 (line->dy, frac); z = mo->z; - AImpactDecal::StaticCreate (base->GetDecal (), + DImpactDecal::StaticCreate (base->GetDecal (), x, y, z, sides + line->sidenum[side]); } } diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 569d78478..f567e7da1 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -179,7 +179,7 @@ void P_SerializeWorld (FArchive &arc) << si->Flags << si->LeftSide << si->RightSide; - ADecal::SerializeChain (arc, &si->BoundActors); + DBaseDecal::SerializeChain (arc, &si->AttachedDecals); } } @@ -212,7 +212,7 @@ void P_SerializeWorld (FArchive &arc) void P_SerializeThinkers (FArchive &arc, bool hubLoad) { - AImpactDecal::SerializeTime (arc); + DImpactDecal::SerializeTime (arc); DThinker::SerializeAll (arc, hubLoad); } diff --git a/src/p_teleport.cpp b/src/p_teleport.cpp index 257d5cb56..a2371a320 100644 --- a/src/p_teleport.cpp +++ b/src/p_teleport.cpp @@ -610,7 +610,7 @@ static bool DoGroupForOne (AActor *victim, AActor *source, AActor *dest, bool fl } #if 0 -static void MoveTheDecal (ADecal *decal, fixed_t z, AActor *source, AActor *dest) +static void MoveTheDecal (DBaseDecal *decal, fixed_t z, AActor *source, AActor *dest) { int an = (dest->angle - source->angle) >> ANGLETOFINESHIFT; fixed_t offX = decal->x - source->x; diff --git a/src/po_man.cpp b/src/po_man.cpp index 6a4b700d4..1f6a06732 100644 --- a/src/po_man.cpp +++ b/src/po_man.cpp @@ -821,9 +821,9 @@ void DoMovePolyobj (polyobj_t *po, int x, int y) linedef->bbox[BOXLEFT] += x; linedef->bbox[BOXRIGHT] += x; if (linedef->sidenum[0] != NO_SIDE) - ADecal::MoveChain (sides[linedef->sidenum[0]].BoundActors, x, y); + DBaseDecal::MoveChain (sides[linedef->sidenum[0]].AttachedDecals, x, y); if (linedef->sidenum[1] != NO_SIDE) - ADecal::MoveChain (sides[linedef->sidenum[1]].BoundActors, x, y); + DBaseDecal::MoveChain (sides[linedef->sidenum[1]].AttachedDecals, x, y); linedef->validcount = validcount; } for (veryTempSeg = po->segs; veryTempSeg != segList; veryTempSeg++) @@ -910,9 +910,9 @@ BOOL PO_RotatePolyobj (int num, angle_t angle) UpdateSegBBox(*segList); line_t *line = (*segList)->linedef; if (line->sidenum[0] != NO_SIDE) - ADecal::FixForSide (&sides[line->sidenum[0]]); + DBaseDecal::FixForSide (&sides[line->sidenum[0]]); if (line->sidenum[1] != NO_SIDE) - ADecal::FixForSide (&sides[line->sidenum[1]]); + DBaseDecal::FixForSide (&sides[line->sidenum[1]]); line->validcount = validcount; } } @@ -934,9 +934,9 @@ BOOL PO_RotatePolyobj (int num, angle_t angle) UpdateSegBBox(*segList); line_t *line = (*segList)->linedef; if (line->sidenum[0] != NO_SIDE) - ADecal::FixForSide (&sides[line->sidenum[0]]); + DBaseDecal::FixForSide (&sides[line->sidenum[0]]); if (line->sidenum[1] != NO_SIDE) - ADecal::FixForSide (&sides[line->sidenum[1]]); + DBaseDecal::FixForSide (&sides[line->sidenum[1]]); line->validcount = validcount; } } diff --git a/src/r_defs.h b/src/r_defs.h index 1eddeb4b8..599d318b6 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -379,7 +379,7 @@ struct zone_t // The SideDef. // -class ADecal; +class DBaseDecal; enum { @@ -394,7 +394,7 @@ struct side_s fixed_t textureoffset; // add this to the calculated texture column fixed_t rowoffset; // add this to the calculated texture top sector_t* sector; // Sector the SideDef is facing. - ADecal* BoundActors; // [RH] Decals bound to the wall + DBaseDecal* AttachedDecals; // [RH] Decals bound to the wall short toptexture, bottomtexture, midtexture; // texture indices WORD linenum; DWORD LeftSide, RightSide; // [RH] Group walls into loops diff --git a/src/r_main.cpp b/src/r_main.cpp index c204b3cc2..e25821b30 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -1774,9 +1774,9 @@ void FActiveInterpolation::DoAnInterpolation (fixed_t smoothratio) *adr2 = oldipos[1] + FixedMul (pos - oldipos[1], smoothratio); } -unsigned FActiveInterpolation::HashKey (EInterpType type, void *interptr) +size_t FActiveInterpolation::HashKey (EInterpType type, void *interptr) { - return (unsigned)type * ((unsigned)interptr>>5); + return (size_t)type * ((size_t)interptr>>5); } int FActiveInterpolation::CountInterpolations () @@ -1823,7 +1823,7 @@ int FActiveInterpolation::CountInterpolations (int *usedbuckets, int *minbucketf FActiveInterpolation *FActiveInterpolation::FindInterpolation (EInterpType type, void *interptr, FActiveInterpolation **&interp_p) { - unsigned hash = HashKey (type, interptr) % INTERPOLATION_BUCKETS; + size_t hash = HashKey (type, interptr) % INTERPOLATION_BUCKETS; FActiveInterpolation *probe, **probe_p; for (probe_p = &curiposhash[hash], probe = *probe_p; diff --git a/src/r_main.h b/src/r_main.h index 99d0aa3ff..f15ea0797 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -229,7 +229,7 @@ private: void CopyBakToInterp(); void DoAnInterpolation(fixed_t smoothratio); - static unsigned HashKey(EInterpType type, void *interptr); + static size_t HashKey(EInterpType type, void *interptr); static FActiveInterpolation *FindInterpolation(EInterpType, void *interptr, FActiveInterpolation **&interp_p); friend void updateinterpolations(); diff --git a/src/r_segs.cpp b/src/r_segs.cpp index aa9d91f7b..c58745dd3 100644 --- a/src/r_segs.cpp +++ b/src/r_segs.cpp @@ -43,6 +43,7 @@ #include "m_swap.h" #include "w_wad.h" #include "stats.h" +#include "a_sharedglobal.h" #define WALLYREPEAT 8 @@ -123,7 +124,7 @@ FTexture *rw_pic; static short *maskedtexturecol; static FTexture *WallSpriteTile; -static void R_RenderBoundWallSprite (AActor *first, drawseg_t *clipper, int pass); +static void R_RenderDecal (DBaseDecal *first, drawseg_t *clipper, int pass); static void WallSpriteColumn (void (*drawfunc)(const BYTE *column, const FTexture::Span *spans)); //============================================================================= @@ -1333,11 +1334,9 @@ void R_StoreWallRange (int start, int stop) } // [RH] Draw any decals bound to the seg - AActor *decal = (AActor *)curline->sidedef->BoundActors; - while (decal != NULL) + for (DBaseDecal *decal = curline->sidedef->AttachedDecals; decal != NULL; decal = decal->WallNext) { - R_RenderBoundWallSprite (decal, ds_p, 0); - decal = decal->snext; + R_RenderDecal (decal, ds_p, 0); } ds_p++; @@ -1767,9 +1766,7 @@ void PrepLWall (fixed_t *lwall, fixed_t walxrepeat) // = 1: drawing masked textures (including sprites) // Currently, only pass = 0 is done or used -static AActor *DecalActorForDebug; - -static void R_RenderBoundWallSprite (AActor *actor, drawseg_t *clipper, int pass) +static void R_RenderDecal (DBaseDecal *decal, drawseg_t *clipper, int pass) { fixed_t lx, ly, lx2, ly2; int x1, x2; @@ -1780,72 +1777,62 @@ static void R_RenderBoundWallSprite (AActor *actor, drawseg_t *clipper, int pass int needrepeat = 0; sector_t *front, *back; - if (actor->renderflags & RF_INVISIBLE || !viewactive) + if (decal->RenderFlags & RF_INVISIBLE || !viewactive || decal->PicNum == 0xFFFF) return; - DecalActorForDebug = actor; - // Determine actor z - zpos = actor->z; + zpos = decal->z; front = curline->frontsector; back = (curline->backsector != NULL) ? curline->backsector : curline->frontsector; - switch (actor->renderflags & RF_RELMASK) + switch (decal->RenderFlags & RF_RELMASK) { default: - zpos = actor->z; + zpos = decal->z; break; case RF_RELUPPER: if (curline->linedef->flags & ML_DONTPEGTOP) { - zpos = actor->z + front->ceilingtexz; + zpos = decal->z + front->ceilingtexz; } else { - zpos = actor->z + back->ceilingtexz; + zpos = decal->z + back->ceilingtexz; } break; case RF_RELLOWER: if (curline->linedef->flags & ML_DONTPEGBOTTOM) { - zpos = actor->z + front->ceilingtexz; + zpos = decal->z + front->ceilingtexz; } else { - zpos = actor->z + back->floortexz; + zpos = decal->z + back->floortexz; } break; case RF_RELMID: if (curline->linedef->flags & ML_DONTPEGBOTTOM) { - zpos = actor->z + front->floortexz; + zpos = decal->z + front->floortexz; } else { - zpos = actor->z + front->ceilingtexz; + zpos = decal->z + front->ceilingtexz; } } - xscale = actor->xscale + 1; - yscale = actor->yscale + 1; + xscale = decal->XScale + 1; + yscale = decal->YScale + 1; + + WallSpriteTile = TexMan(decal->PicNum); + flipx = decal->RenderFlags & RF_XFLIP; - if (actor->picnum != 0xffff) - { - WallSpriteTile = TexMan(actor->picnum); - flipx = actor->renderflags & RF_XFLIP; - } - else - { - //WallSpriteTile = SpriteFrames[sprites[actor->sprite].spriteframes + actor->frame].lump[0]; - //flipx = SpriteFrames[sprites[actor->sprite].spriteframes + actor->frame].flip & 1; - return; - } if (WallSpriteTile->UseType == FTexture::TEX_Null) { return; } // Determine left and right edges of sprite. Since this sprite is bound - // to a wall, we use the wall's angle instead of the actor's. This is + // to a wall, we use the wall's angle instead of the decal's. This is // pretty much the same as what R_AddLine() does. x2 = WallSpriteTile->GetWidth(); @@ -1856,10 +1843,10 @@ static void R_RenderBoundWallSprite (AActor *actor, drawseg_t *clipper, int pass x2 *= xscale; angle_t ang = R_PointToAngle2 (curline->v1->x, curline->v1->y, curline->v2->x, curline->v2->y) >> ANGLETOFINESHIFT; - lx = actor->x - MulScale6 (x1, finecosine[ang]) - viewx; - lx2 = actor->x + MulScale6 (x2, finecosine[ang]) - viewx; - ly = actor->y - MulScale6 (x1, finesine[ang]) - viewy; - ly2 = actor->y + MulScale6 (x2, finesine[ang]) - viewy; + lx = decal->x - MulScale6 (x1, finecosine[ang]) - viewx; + lx2 = decal->x + MulScale6 (x2, finecosine[ang]) - viewx; + ly = decal->y - MulScale6 (x1, finesine[ang]) - viewy; + ly2 = decal->y + MulScale6 (x2, finesine[ang]) - viewy; WallTX1 = DMulScale20 (lx, viewsin, -ly, viewcos); WallTX2 = DMulScale20 (lx2, viewsin, -ly2, viewcos); @@ -1933,7 +1920,7 @@ static void R_RenderBoundWallSprite (AActor *actor, drawseg_t *clipper, int pass WallDepthOrg = -WallUoverZstep * WallTMapScale2; // Get the top and bottom clipping arrays - switch (actor->renderflags & RF_CLIPMASK) + switch (decal->RenderFlags & RF_CLIPMASK) { case RF_CLIPFULL: if (curline->backsector == NULL) @@ -2031,13 +2018,13 @@ static void R_RenderBoundWallSprite (AActor *actor, drawseg_t *clipper, int pass dc_colormap = basecolormap + fixedlightlev; else if (fixedcolormap) dc_colormap = fixedcolormap; - else if (!foggy && (actor->renderflags & RF_FULLBRIGHT)) + else if (!foggy && (decal->RenderFlags & RF_FULLBRIGHT)) dc_colormap = basecolormap; else calclighting = true; // Draw it - if (actor->renderflags & RF_YFLIP) + if (decal->RenderFlags & RF_YFLIP) { sprflipvert = true; yscale = -yscale; @@ -2055,7 +2042,7 @@ static void R_RenderBoundWallSprite (AActor *actor, drawseg_t *clipper, int pass dc_x = x1; ESPSResult mode; - mode = R_SetPatchStyle (actor->RenderStyle, actor->alpha, actor->Translation, actor->alphacolor); + mode = R_SetPatchStyle (decal->RenderStyle, decal->Alpha, decal->Translation, decal->AlphaColor); if (mode == DontDraw) { @@ -2130,23 +2117,6 @@ static void R_RenderBoundWallSprite (AActor *actor, drawseg_t *clipper, int pass static void WallSpriteColumn (void (*drawfunc)(const BYTE *column, const FTexture::Span *spans)) { unsigned int texturecolumn = lwall[dc_x] >> FRACBITS; -#if 0 - if (texturecolumn >= (unsigned)WallSpriteTile->GetWidth()) - { - I_FatalError ("WallSpriteColumn tried to draw part of a decal that didn't exist.\n" - "Please report all of the following information, because\n" - "I want to get this fixed, yet I just can't get it happen to me:\n\n" - "%d->%d/%d" - " %s %04x %d\n" - "%d %d %d\n" - "%d %d %d %u\n", - dc_x, texturecolumn, TileCache[WallSpriteTile]->width, - WallSpriteTile->Name, DecalActorForDebug->renderflags, DecalActorForDebug->RenderStyle, - DecalActorForDebug->x, DecalActorForDebug->y, DecalActorForDebug->z, - viewx, viewy, viewz, viewangle); - texturecolumn = TileCache[WallSpriteTile]->width-1; - } -#endif dc_iscale = MulScale16 (swall[dc_x], rw_offset); spryscale = SafeDivScale32 (1, dc_iscale); if (sprflipvert) diff --git a/src/s_playlist.cpp b/src/s_playlist.cpp index 597cc7ee0..eda4cc2d8 100644 --- a/src/s_playlist.cpp +++ b/src/s_playlist.cpp @@ -119,7 +119,7 @@ bool FPlayList::NextLine (FILE *file, char *buffer, int n) if (NULL == fgets (buffer, n, file)) return false; - for (skipper = buffer; *skipper <= ' '; skipper++) + for (skipper = buffer; *skipper != 0 && *skipper <= ' '; skipper++) ; } while (*skipper == '#' || *skipper == 0); @@ -161,6 +161,7 @@ int FPlayList::SetPosition (int position) { Position = position; } + DPrintf ("Playlist position set to %d\n", Position); return Position; } @@ -175,6 +176,7 @@ int FPlayList::Advance () { Position = 0; } + DPrintf ("Playlist advanced to song %d\n", Position); return Position; } @@ -184,6 +186,7 @@ int FPlayList::Backup () { Position = NumSongs - 1; } + DPrintf ("Playlist backed up to song %d\n", Position); return Position; } diff --git a/src/sdl/hardware.cpp b/src/sdl/hardware.cpp index a0ef52209..c357f4cd1 100644 --- a/src/sdl/hardware.cpp +++ b/src/sdl/hardware.cpp @@ -32,7 +32,7 @@ ** */ -#include +#include #include "hardware.h" #include "i_video.h" diff --git a/src/sdl/i_input.cpp b/src/sdl/i_input.cpp index e985153f5..2d002b32c 100644 --- a/src/sdl/i_input.cpp +++ b/src/sdl/i_input.cpp @@ -1,4 +1,4 @@ -#include +#include #include "doomtype.h" #include "c_dispatch.h" #include "doomdef.h" diff --git a/src/sdl/i_main.cpp b/src/sdl/i_main.cpp index 269524fe4..fe346c65e 100644 --- a/src/sdl/i_main.cpp +++ b/src/sdl/i_main.cpp @@ -20,7 +20,7 @@ // //----------------------------------------------------------------------------- -#include +#include #include #include #include diff --git a/src/sdl/i_system.cpp b/src/sdl/i_system.cpp index a4a7c47c9..7a0c61f97 100644 --- a/src/sdl/i_system.cpp +++ b/src/sdl/i_system.cpp @@ -41,7 +41,7 @@ #include "doomerrors.h" #include -#include "SDL/SDL.h" +#include "SDL.h" #include "doomtype.h" #include "version.h" #include "doomdef.h" diff --git a/src/sdl/i_system.h b/src/sdl/i_system.h index d7985573f..04aee83ac 100644 --- a/src/sdl/i_system.h +++ b/src/sdl/i_system.h @@ -30,7 +30,9 @@ #include "d_ticcmd.h" #include "d_event.h" +#ifndef SHARE_DIR #define SHARE_DIR "/usr/local/share/" +#endif // Index values into the LanguageIDs array enum diff --git a/src/sdl/sdlvideo.cpp b/src/sdl/sdlvideo.cpp index e72adac3f..8311aacf5 100644 --- a/src/sdl/sdlvideo.cpp +++ b/src/sdl/sdlvideo.cpp @@ -12,7 +12,7 @@ #include "sdlvideo.h" -#include +#include // MACROS ------------------------------------------------------------------ diff --git a/src/sound/music_midi_timidity.cpp b/src/sound/music_midi_timidity.cpp index bce6c7d9c..672eff50c 100644 --- a/src/sound/music_midi_timidity.cpp +++ b/src/sound/music_midi_timidity.cpp @@ -414,7 +414,7 @@ bool TimiditySong::LaunchTimidity () // Tell Timidity whether it should loop or not CommandLine[LoopPos] = m_Looping ? 'l' : ' '; - DPrintf ("cmd: \x1cG%s\n", CommandLine); + DPrintf ("cmd: \x1cG%s\n", CommandLine.GetChars()); #ifdef _WIN32 STARTUPINFO startup = { sizeof(startup), }; @@ -496,7 +496,7 @@ bool TimiditySong::LaunchTimidity () freopen ("/dev/null", "r", stdin); freopen ("/dev/null", "w", stderr); close (WavePipe[1]); - + printf ("exec %s\n", words.we_wordv[0]); execvp (words.we_wordv[0], words.we_wordv); exit (0); // if execvp succeeds, we never get here diff --git a/src/version.h b/src/version.h index 412dbab02..39e093e96 100644 --- a/src/version.h +++ b/src/version.h @@ -44,12 +44,12 @@ enum { GAMEVERSION = 205 }; // Note that SAVEVER is not directly comparable to VERSION. // SAVESIG should match SAVEVER. #define SAVEVER 231 -#define SAVESIG "ZDOOMSAVE231" +#define SAVESIG "ZDOOMSAVE232" // This is so that derivates can use the same savegame versions without worrying about engine compatibility #define GAMESIG "ZDOOM" // MINSAVEVER is the minimum level snapshot version that can be loaded. -#define MINSAVEVER 231 // Used by 2.0.99 +#define MINSAVEVER 232 // Used by 2.0.99 // The maximum length of one save game description for the menus. #define SAVESTRINGSIZE 24 diff --git a/src/w_wad.cpp b/src/w_wad.cpp index 11c8c4424..290840744 100644 --- a/src/w_wad.cpp +++ b/src/w_wad.cpp @@ -968,8 +968,8 @@ int FWadCollection::MergeLumps (const char *start, const char *end, int space) if (newlumps) { - if (size_t(oldlumps + newlumps) > NumLumps) - LumpInfo = (LumpRecord *)Realloc (LumpInfo, oldlumps + newlumps); + if (size_t(oldlumps + newlumps) >= NumLumps) + LumpInfo = (LumpRecord *)Realloc (LumpInfo, (oldlumps + newlumps + 1) * sizeof(LumpRecord)); memcpy (LumpInfo + oldlumps, newlumpinfos, sizeof(LumpRecord) * newlumps); markerpos = oldlumps;