- Fixed: DThinker::Destroy(Most)ThinkersInList() were unreliable when
destroyed thinkers destroyed more thinkers in the same list.
Specifically, if the thinker it destroyed caused the very next thinker
in the list to also be destroyed, it would get lost in the thinker list
and end up with a NULL node. So just keep iterating through the first
thinker in the list until there are none left. Since destroying a
thinker causes it to remove itself from its list, the first thinker will
always be changing as long as there's something to destroy.
- Instead of tying NoDelay behavior to OF_JustSpawned, use a new actor
flag, MF7_HANDLENODELAY. This only gets cleared once it has actually
been checked by Tick(). This is necessary because freeze mode delays the
initial run of Tick() past the initial spawn, so OF_JustSpawned will no
longer be set when it does the initial tick.
- Delay NoDelay processing if an actor is spawned dormant. Actors spawned
dormant have Deactivate() called before they tick, so MF7_HANDLENODELAY
will remain set as long as an actor is dormant. This allows the NoDelay
handling to occur as expected once it is activated.
When set, the actor will run this state during its first tick. This means Spawn
states may now run an action function if you set this flag. Note that this action function
is executed during the actor's first tick, which is not the same as when it is spawned.
SVN r4240 (trunk)
about this now. I spent three days trying to figure out why the VC++ debug version was so slow.
It turns out I had a conditional breakpoint set in a high-traffic area. D'oh!
The rest of this stuff should get merged into trunk:
- Fixed: Writing to debugfile uses the standard fprintf, which does not understand %td on VC++.
- Fixed: Instead of crashing when a sprite has been scaled to 0, just don't draw it.
SVN r3896 (scripting)
- fixed: D_ErrorCleanup must clear 'savegamerestore'.
- fixed: Cleaning up when loading a savegame failed while restoring the thinker list did not work. There were two issues:
* removed the asserts in GC::SweepList because they get triggered by thinkers that were not fully initialized during loading.
* AActor::UnlinkFromWorld may not assume that the sector list has been initialized when this function is called.
SVN r3274 (trunk)
- fixed: The BossCube could be blocked by floors and ceiling resulting
in incorrect movement. I changed it so that A_BrainSpit now sets the
MF5_NOINTERACTION flag for anything it spawns that has the MF_NOCLIP
flag. For travelling cubes active collision detection makes no sense
and only causes problems. This should also make the boss brain
work in the other games which previously were excluded by a game mode
check in the movement code.
- fixed: ACS's GetUserVariable did not work for the script activator.
- fixed: Moving floors could be blocked by 2 actors without MF2_PASSMOBJ
overlapping each other (common mapping bug, check Herian 2 MAP30.)
SVN r1891 (trunk)
that were changed some time ago.
- fixed: The damage inflictor for a rail attack was the shooter, not the puff.
- Fixed: Floor and ceiling huggers may not change their z-velocity when seeking.
- Fixed: UDMF set the secret sector flag before parsing the sector's properties,
resulting in it always being false.
- Renamed sector's oldspecial variable to secretsector to better reflect its
only use.
- Fixed: A_BrainSpit stored as the SpawnShot's target the intended BossTarget,
not itself contrarily to other projectile spawning functions.
A_SpawnFly then used the target for CopyFriendliness, thinking it'll be the
BossEye when in fact it wasn't.
- Added Gez's submission for a DEHACKED hack introduced by Boom.
(using code pointers of the form 'Pointer 0 (x statenumber)'.
- fixed: Attaching 3DMidtex lines by sector tag did not work because lines
were marked by index in the sector's line list but needed to be marked by
line index in the global array.
- fixed: On Linux ZDoom was creating a directory called "~.zdoom" for
save files because of a missing slash.
- fixed: UDMF was unable to read floating point values in exponential format
because the C Mode scanner was missing a definition for them.
- fixed: The recent changes for removing pointer aliasing got the end sequence
info from an incorrect variable. To make this more robust the sequence index
is now stored as a hexadecimal string to avoid storing binary data in a string.
Also moved end sequence lookup from f_finale.cpp to the calling code so that
the proper end sequences can be retrieved for secret exits, too.
SVN r1777 (trunk)
thinkers tick, not just once every game tick. This more closely follows
the original Lua behavior. This change was made because, in cases of
extremely large and frequent memory allocations, the collector may not run
fast enough if it only has a chance to execute once per tick.
SVN r1197 (trunk)
list, it should just be ignored during the propagation stage.
- After sleeping on it and realizing what was really going in, I generalized
the inventory fix from the 13th: The actor is flagged by Destroy(), then it
is later inserted into the thinker list by DThinker::SerializeAll(). So
rather than unlinking the skipped player from their inventory, just make
sure any flagged thinkers aren't inserted into a list.
- Fixed: FCanvasTextureInfo::Viewpoint needed a read barrier, and the whole
list should serve as a root.
- Reimplemented SPC playback as a custom codec for FMOD.
- Removed spc_frequency, because snes_spc only supports the SPC's native
frequency of 32000 Hz.
SVN r806 (trunk)
copies of the players stored in the archive would be destroyed and break
apart the STAT_INVENTORY thinker list. Now they aren't destroyed while
loading the archive but are unlinked from the inventory list instead, so
the garbage collector will get them later.
- Changed pointer substitution to return the number of pointers changed.
SVN r803 (trunk)
way wasn't playing well with the write barriers.
- Fixed: DFrameBuffer::WriteSavePic needs to fix the canvas in place while
using it.
- Fixed: The sound system was updated every frame, which is a complete waste
of time. Doing it only once each tic is quite sufficient, since nothing
really moves between tics, even if the display makes it look otherwise.
SVN r799 (trunk)
FreshThinkers lists. These thinkers would still be saved in the savegame if
there were other references to them, but they would not go in any thinker
lists when loading the savegame. An easy way to exercise this bug is to
give yourself something new with the console and then save the game right
away without closing the console by using the "save" command. The item
would be stored in the savegame thanks to its presence in the Inventory
list, but it wouldn't be in a thinker list when the game was reloaded
because it was still in the FreshThinkers list when the game was saved.
SVN r763 (trunk)
- Added DECORATE support for setting an actor's args. If this is done
it will also disable the actor's special that can be set in a map. This
is for actors that want to use A_CountdownArg or similar functions
that use the args for something different than the special's parameters.
- Converted a_sharedmisc.cpp to DECORATE.
- Added a new NActorIterator that can search for classes specified by name.
- Added a new constructor to TThinkerIterator that can search
for DECORATE defined subclasses that are not represented by a real C++ class.
- Fixed: BuildInfoDefaults must set the parent symbol table so that
all actors can get to the global symbols stored in AActor.
- Fixed some minor inconsistencies in the Arch-Vile's DECORATE definition.
- Fixed: A_VileAttack moved the flame without relinking it into the sector
lists. It also forgot to set the z-position correctly. (original Doom bug.)
- Fixed: The Doom 2 cast finale didn't work with the dynamic state name handling.
SVN r401 (trunk)
- The stat meters now return an FString instead of sprintfing into a fixed
output buffer.
- NOASM is now automatically defined when compiling for a non-x86 target.
- Some changes have been made to the integral types in doomtype.h:
- For consistancy with the other integral types, byte is no longer a
synonym for BYTE.
- Most uses of BOOL have been change to the standard C++ bool type. Those
that weren't were changed to INTBOOL to indicate they may contain values
other than 0 or 1 but are still used as a boolean.
- Compiler-provided types with explicit bit sizes are now used. In
particular, DWORD is no longer a long so it will work with both 64-bit
Windows and Linux.
- Since some files need to include Windows headers, uint32 is a synonym
for the non-Windows version of DWORD.
- Removed d_textur.h. The pic_t struct it defined was used nowhere, and that
was all it contained.
SVN r326 (trunk)
- Changed: Decal scales now use full precision fixed point numbers.
- Changed: Keeping impact decals in their own statlist is enough to keep track
of them for when one needs to be destroyed. There's no need to maintain a
separate list for them.
- Fixed: Decal actors did not spread their decals across neighboring walls.
- Fixed: Decal groups did not initialize their IDs and could not be reliably
used with the decal actor.
- Fixed: Decals on moving polyobjects were not interpolated. R_RenderDecal()
now uses the decal's LeftDistance to calculate its visible location, so it
always stays in sync with the wall's vertices. This also lets me dump some
code from the polyobjects that maintained the decals' (x, y) coordinates.
Also, the decals' x and y information is redundant and can be removed.
Doing this revealed a bug with slider decals and horizontal sliding:
That is, it didn't work at all. I have opted to simply remove the horizontal
sliding support so that I don't have to worry about what happens when a
decal slides across the edge of a wall.
- Fixed: DBaseDecal::LeftDistance was calculated as a 30.2 fixed point number.
It should be 2.30 fixed point.
SVN r35 (trunk)