if the first spawned one died and executed some code in its death state.
- Added Karate Chris's submission for 'allowrespawn' MAPINFO option.
- Added Karate Chris's submission for customizable skill confirmation text.
- Fixed: Doom's statusbar only checked for primary attacks, not secondary ones when
setting Doomguy's face. (Thanks to Karate Chris for the fix.)
- added Skulltag's FORCEYBILLBOARD and FORCEXYBILLBOARD flags to the DECORATE parser.
Even though the software renderer has no use for them it is necessary to support them
so that mods can use these flags without becoming incompatible with ZDoom.
SVN r576 (trunk)
or scripts. ColorSetter (#9038) sets the sector's color and FadeSetter (#9039)
sets the fog color.
- added new flags MF5_ALWAYSFAST and MF5_NEVERFAST. These flags unconditionally
enable or disable fast movement logic, regardless of skill settings.
- added an abstraction layer for skill related settings. This is a preparation
for implementing custom skill definitions but right now all it does is
returning the original values but keeping the related information all in one
place
SVN r557 (trunk)
- Fixed: Right after teleporting P_SlideMove could cause player movement.
Added a check for reactiontime to prevent that.
- Fixed: PainChances and Damagefactors were never freed.
- Added option to A_Chase that prevents the monster from moving.
- Fixed: The stained glass shards were missing the HEXENBOUNCE flag.
- Added some NULL pointer checks to AActor::GiveAmmo.
- Fixed: The FSwordMissile was missing the special damage handling that
reduces damage when hitting a player.
SVN r555 (trunk)
TAutoGrowArray. A map can handle a wide range of key values better than
an array.
- Added a templated associative array class, TMap, that uses Lua's "chained
scatter table with Brent's variation" algorithm. I had considered using
hash_map until I discovered that it's not standard STL, and there are two
major but incompatible implementations of it. So I rolled my own, and Lua
seemed like a good place to go to for an efficient algorithm, since it
makes heavy use of tables.
SVN r513 (trunk)
when a player is going through a screen wipe and act like a pause, so the
game doesn't run several tics afterward to catch up with it.
SVN r485 (trunk)
both named item.
- Switched ddraw.dll to be delay loaded. With D3D9 now being the default
display code, this avoids wasting time loading DDraw if it isn't needed.
- Fixed: The Win32 I_FatalError() did not set alreadyThrown, so it could get
stuck in an endless fatal error loop.
SVN r433 (trunk)
- Renamed the new armor properties to use the same names as Skulltag to avoid
confusion. They still don't need a separate base class as in Skulltag though.
- Added Skulltag-type armor bonus that increases the max amount that can be given
by other armor items.
- Separated all armor related code from a_pickups.cpp into a_armor.cpp.
SVN r427 (trunk)
DLevelScript::DoSpawn().
- Changed VectorNormalize() (and VectorNormalize2) to use doubles for storing
the vector lengths, fixing desyncs between GCC/VC++ games that happened
because the two compilers produced slightly different results for some
slopes. GCC kept them in registers, so they were never truncated to floats.
VC++ stored them to memory and reloaded them in order to truncate them to
the defined precision. Lesson learned: Floating point numbers in local
variables should always be doubles to produce the best code with VC++ that
has the best chance of matching GCC's default behavior.
- Removed netget and netsend function pointers. PacketGet and PacketSend are
now called directly.
- Fixed: Watching a demo from the point of view of someone other than the
first player could cause a crash when the demo ended.
- Removed invcount from the expression evaluator at Grubber's suggestion,
because it doesn't work.
- Fixed: vid_nowidescreen should fire off setsizeneeded so that changes to it
can happen immediately instead of at the next resolution change.
SVN r355 (trunk)
ga_autosave, write DEM_CHECKAUTOSAVE to the net stream. When this is
processed, it will check if it's okay to do an autosave. If it is, it writes
DEM_DOAUTOSAVE to the net stream, which the sets gameaction to ga_autosave.
Essentially, about half of the functionality was moved out of G_DoAutoSave()
and into Net_DoCommand().
- Minor changes to OS detection: The os_WinNT enumeration has been renamed to
os_WinNT4, since every new OS coming out of Microsoft these days is
essentially NT. NT 5.2 and 6.0 are now properly identified as "Windows
Server 2003" and "Windows Vista" respectively, and any unknown NT versions
Microsoft introduces in the future will now be displayed as "Windows NT"
instead of "Windows 2000" if the minor version is 0 and "Windows XP" if the
minor version is non-0. Win32s detection has also been removed. Presumably
if somebody is foolish enough to try to run this on Windows 3.x with Win32s,
it won't even load due to missing DLLs.
- Fixed: Demos with NETD chunks should not set netgame to true unless they
have more than one player. And since netdemo is ignored if netgame is
false, it doesn't need to set that either.
- Fixed: FTexture::GetScaled* functions did not check for scale values of 0.
SVN r354 (trunk)
could not be saved for some reason.
- Added the writeini console command to write the config file, optionally
specifying a specific file name for it.
- Fixed: "Multiplayer" demos that only had one player were not played back
properly because the demo playback code only checked the number of players
to determine if it should be played as a netdemo.
SVN r333 (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)
probably switch to the IJG library once I pare it down. (Ken's code is 18K
of C source but does not support progressive JPEG. The IJG library is over
a megabyte of source and supports pretty much everything you would ever
need ever.)
- Fixed endianness issue in FTextureManager::CreateTexture().
- Added support for interlaced PNGs. Now ZDoom is a mostly complete PNG
reader. The only thing missing is 48-bit RGB and 16-bit grayscale support,
which are just wastes of bits here, but also less likely to appear than
an interlaced PNG. (However, if you are using interlaced PNGs for textures,
then you are needlessly wasting space, since the image won't display
progressively.)
- Fixed: Writing named screenshots didn't work.
SVN r292 (trunk)
ReplaceTextures (str old_texture, str new_texture, optional bool not_lower,
optional bool not_mid, optional bool not_upper, optional bool not_floor,
optional bool not_ceiling); and
SectorDamage (int tag, int amount, str type, bool players_only, bool in_air,
str protection_item, bool subclasses_okay);
- Added the vid_nowidescreen cvar to disable widescreen aspect ratio
correction. When this is enabled, the only display ratio available is 4:3
(and 5:4 if vid_tft is set).
- Added support for setting an actor's damage property to an expression
through decorate. Just enclose it within parentheses, and the expression
will be evaluated exactly as-is without the normal Doom damage calculation.
So if you want something that does exactly 6 damage, use a "Damage (6)"
property. To deal normal Doom missile damage, you can use
"Damage (random(1,8)*6)" instead of "Damage 6".
- Moved InvFirst and InvSel into APlayerPawn so that they can be consistantly
maintained by ObtainInventory.
SVN r288 (trunk)
- Fixed: CheckActorInventory stored the return value in the wrong address
on the ACS stack.
- Fixed: Skin sounds weren't properly restored after a SNDINFO reset.
- Added a more flexible ACS ChangeLevel function. It gets passed a level name
instead of a level number and has several additional options (e.g. changing
skill, starting the map without monsters and clearing the players' inventories. (UNTESTED!)
- Changed Thing_Activate so that passing a tid of 0 activates the calling actor.
- Changed Thing_Remove so that passing a tid of 0 removes the calling actor.
- Added DECORATE parameters to A_Saw.
SVN r283 (trunk)
so now it is available in all games.
- Replaced the call to A_FlameSnd in the HereticPlayer's burn death sequence
with A_FireScream and defined *burndeath for Heretic.
- Added Grubber's custom player class support.
SVN r250 (trunk)
using duplicate DoomEdNums and will affect all attempts to spawn the
replaced actor. However, because this happens for all spawns and not just
at map load, the replacing actor must be compatible with the replaced
actor, which means that an actor can only serve as a replacement for one
of its baseclasses. For example, if you want to use a modified imp, you can
use this DECORATE:
actor MyImp : DoomImp replaces DoompImp
{
// Put changed properties here
}
- New: The IWAD dialog now remembers the last IWAD you picked and
automatically highlights it the next time you run the game. This also
applies if you check "Don't ask me this again": The IWAD selected will be
the one that gets automatically loaded, not the one located first. (Using
the -iwad parameter will not change the default IWAD.) In addition, you
can now bring the dialog up even if you disable it by holding down SHIFT
during startup.
- Changed ExtractFilePath() and ExtractFileBase() to return FStrings instead
of writing to a provided output buffer. ExtractFileBase() can also
optionally keep the file's extension in the result.
- Removed the -heapsize parameter entirely. The informational message should
no longer be needed.
- Removed -maxdemo parameter. There's no point to having it around since
the demo buffer grows automatically.
SVN r238 (trunk)
yanking the mouse around if they keys haven't been read yet to combat the
same situation that causes the keyboard to return DIERR_NOTACQUIRED in
KeyRead(): The window is sort of in focus and sort of not. User.dll
considers it to be focused and it's drawn as such, but another focused
window is on top of it, and DirectInput doesn't see it as focused.
- Fixed: KeyRead() should handle DIERR_NOTACQUIRED errors the same way it
handles DIERR_INPUTLOST errors. This can happen if our window had the
focus stolen away from it before we tried to acquire the keyboard in
DI_Init2(). Strangely, MouseRead_DI() already did this.
- When a stack overflow occurs, report.txt now only includes the first and
last 16KB of the stack to make it more manageable.
- Limited StreamEditBinary() to the first 64KB of the file to keep it from
taking too long on large dumps.
- And now I know why gathering crash information in the same process that
crashed can be bad: Stack overflows. You get one spare page to play with
when the stack overflows. MiniDumpWriteDump() needs more than that and
causes an access violation when it runs out of leftover stack, silently
terminating the application. Windows XP x64 offers SetThreadStackGuarantee()
to increase this, but that isn't available on anything older, including
32-bit XP. To get around this, a new thread is created to write the mini
dump when the stack overflows.
- Changed A_Burnination() to be closer to Strife's.
- Fixed: When playing back demos, DoAddBot() can be called without an
associated call to SpawnBot(). So if the bot can't spawn, botnum can
go negative, which will cause problems later in DCajunMaster::Main()
when it sees that wanted_botnum (0) is higher than botnum (-1).
- Fixed: Stopping demo recording in multiplayer games should not abruptly
drop the recorder out of the game without notifying the other players.
In fact, there's no reason why it should drop them out of multiplayer at
all.
- Fixed: Earthquakes were unreliable in multiplayer games because
P_PredictPlayer() did not preserve the player's xviewshift.
- Fixed: PlayerIsGone() needs to stop any scripts that belong to the player
who left, in addition to executing disconnect scripts.
- Fixed: APlayerPawn::AddInventory() should also check for a NULL player->mo
in case the player left but somebody still has a reference to their actor.
- Fixed: DDrawFB::PaintToWindow() should simulate proper unlocking behavior
and set Buffer to NULL.
- Improved feedback for network game initialization with the console ticker.
- Moved i_net.cpp and i_net.h out of sdl/ and win32/ and into the main source
directory. They are identical, so keeping two copies of them is bad.
- Fixed: (At least with Creative's driver's,) EAX settings are global and not
per-application. So if you play a multiplayer ZDoom game on one computer
(or even another EAX-using application), ZDoom needs to restore the
environment when it regains focus.
- Maybe fixed: (See http://forum.zdoom.org/potato.php?t=10689) Apparently,
PacketGet can receive ECONNRESET from nodes that aren't in the game. It
should be safe to just ignore these packets.
- Fixed: PlayerIsGone() should set the gone player's camera to NULL in case
the player who left was player 0. This is because if a remaining player
receives a "recoverable" error, they will become player 0. Once that happens,
they game will try to update sounds through their camera and crash in
FMODSoundRenderer::UpdateListener() because the zones array is now NULL.
G_NewInit() should also clear all the player structures.
SVN r233 (trunk)
respawning in coop. Now the new inventory code should finally be complete. :-)
- Fixed: PROP_Inventory_PickupMessage was improperly defined for non-VC++
compilation.
SVN r197 (trunk)
- Fixed: The Zip loader loaded all WADs inside a Zip into the lump directory.
This is only supposed to be done for WADs in the root directory.
- Complete restructuring of the map loading code. Previously the only way
to put maps into Zips was to load them as embedded WADs which caused
some problems, most importantly that the map's file name was irrelevant
and the internal map label was used instead. With the new code there
is now a properly defined way to add maps to Zips:
* Maps are placed in a subdirectory called 'maps'.
* Maps are stored as WADs that contain all map related lumps.
* The first lump in the map's WAD directory must be the map label.
* All lumps not belonging to the first map are ignored.
* The map's file name determines the name the map is identified with.
For maps stored this way the internal map label is ignored so with this
method renaming maps is as easy as renaming a file and it is no longer
necessary to manipulate the map label.
With the new code it is also possible to load external maps without
adding them to the WAD list. Type 'open mapfile.wad' in the console
to start such a map.
The new code also performs stricter lump name checks to prevent accidental
loading of non-map data.
SVN r188 (trunk)
format. Now it calls FTexture::CreateTexture to do proper checks.
- Removed the PickupSound method from FakeInventory and changed it so that
it uses AInventory::PickupSound to store its custom pickup sound.
- Removed the PickupMessage method from FakeInventory. This can be handled
by the standard pickup message code now that it uses the meta data for the
message.
- Fixed: The maximum indices for StrifeTypes were inconsistent. Now the
allowed range is 0-1000 in all situations.
- Fixed: Setting a local SNDINFO for a map deleted all skin based sounds.
- Added a crouchsprite property to the skin info.
- Fixed: Crouching sprites must be checked each frame, not just each tic.
- Added an srand call to D_DoomMain in order to randomize the values returned
by rand which is being used to shuffle the playlist.
SVN r185 (trunk)
data enough (2 bits instead of 8), so it was super loud and aliased.
- Fixes for GCC 4.1: Several type-punned pointer warnings, but more
importantly, declaring a friend function inside a class body is no longer
enough to declare that function globally; you must declare it again outside
the class.
- Upgraded FArchive::SerializePointer so that it can store 32-bit indices.
- ACS printing pcodes now build their string in an FSttring instead of a fixed
sized buffer on the stack.
SVN r145 (trunk)
functions added to the exit chain with atterm so that they can be called
in a deterministic order and not whatever order the linker decides to put
them in.
- Fixed: DCajunMaster did not free its getspawned.
- Fixed: P_FreeLevelData() did not free ACS scripts.
- Fixed: Level snapshots were not freed at exit.
- Fixed: The save/load menu list was not freed at exit.
- Fixed: FCompressedMemFile needs a destructor to free the m_ImplodedBuffer.
- Fixed: G_DoLoadGame() did not free the engine string.
- Fixed: M_ReadSaveStrings() did not free the engine string.
- Fixed: Processing DEM_SAVEGAME did not free the pathname string.
- Added a check for truncated flats to FFlatTexture::MakeTexture() because
Heretic's F_SKY1 is only four bytes long.
- Added a dump of the offending state to the "Cannot find state..." diagnostic.
- Fixed: FCompressedFile did not initialize m_Mode in its default constructor.
- Fixed: Heretic and Hexen status bars did not initialize ArtiRefresh.
- Fixed: PNGHandle destructor should use delete[] to free TextChunks.
SVN r111 (trunk)
height if the floor had moved while they were there before. This was because
the player was spawned on the original copy of the map before the changes to
it were dearchived, so they didn't know about the new floor height.
- Fixed: Calling BaseFileSearch() and letting it fill in the file's extension
didn't work because the space for the path was deallocated before it
returned.
- Guess we're not leak-free yet. Try travelling around in a hub and see that
it leaks. I don't have time to track it down right now.
SVN r107 (trunk)
- Added a misc/secret sound definition for Heretic.
- Fixed: Powered up weapons were not properly deselected when the level ended
and their ready state was different from the main weapon's.
- Made some improvements to A_CountdownArg.
- Removed the 'Yes', 'No' and 'Greetings' state assignment commands. They haven't
been documented and thus haven't been used at all so far. Therefore they don't
need to be handled considering that they will go away anyway.
- Changed the DECORATE state parser so that Stop can also be specified right after
a label, in addition to goto.
SVN r84 (trunk)
actually work.
- Turned the list of TabCommands into a TArray because I saw lots of console
commands in the memory leak report at exit. Then I realized those were actually
key bindings, so I changed the Bindings and DoubleBindings arrays into FString
arrays.
- Fixed: FStringCVar was missing a destructor.
- Added TArray::Insert().
- Fixed: TArray::Delete() used memmove().
- Renamed Malloc(), Realloc(), and Calloc() to M_Malloc(), M_Realloc(), and
M_Calloc() so that the debug versions can be defined as macros.
- Enabled the CRT's memory leak detection in WinMain().
- Moved contents of PO_DeInit() into P_FreeLevelData().
- Removed "PolyBlockMap = NULL;" from P_SetupLevel(), because the P_FreeLevelData()
call it makes next does the exact same thing, but also freeing it if needed.
- Fixed: Unneeded memcpy in UnpackUserCmd() when ucmd and basis are the same
SVN r75 (trunk)
its tiles are loaded from the same directory.
- RFF files now load their entire directories into the lumplist.
- Added char * and const char * type coversions for FString, so FStrings can be
freely passed to functions expecting C strings. (Except varargs functions,
which still require manually fetching the C string out of it.)
- Renamed the name class to FName.
- Renamed the string class to FString to emphasize that it is not std::string.
SVN r74 (trunk)
- Removed doom.x, heretic.x and strife.x from the SVN repository. These
are generated files.
- Fixed: A_PainDie has to check whether a valid target exists before
calling IsFriend.
- Fixed: FDecalLib::FindAnimator needs a signed counter to work properly.
May 1, 2006 (Changes by Graf Zahl)
- Added support for game specific pickup messages, if only to be able
to define Raven's invulnerability item in DECORATE.
- Removed A_TreeDeath because it is no longer used.
- Fixed: When picking up a PowerupGiver for an active powerup the
blend color and the duration were transferred to a temorary item
and never took effect. They have to be trnasferred to the newly created
powerup item before trying to give it to the player, not afterward.
- Made the colormap of the InvulnerabilitySphere item specific.
The base power class still needs to have its color adjusted
per game though and since Raven's invulnerability item is used in both
Hexen and Heretic it can't define its own colormap/blend.
- Separated the invulnerability colormaps from the game being played
and made them item specific. They can also be specified as regular
blend colors in DECORATE now.
- Converted a_hereticarmor.cpp and most of a_doomartifacts.cpp,
a_hereticartifacts.cpp and a_heretickeys.cpp to DECORATE.
- Changed the Soulsphere to be a real health item with the Dehacked
modifications made in d_dehacked.cpp as for most other items which
need to be adjusted.
- Added IF_BIGPOWERUP flag to AInventory to expose the RESPAWN_SUPER
dmflag to DECORATE. Also removed the now obsolete ShouldRespawn methods
from AInvulnerabilitySphere and ABlurSphere.
- Converted a_splashes.cpp to DECORATE.
- Converted most of a_debris.cpp to DECORATE.
SVN r73 (trunk)
your head has popped off your body.
- Fixed: When item respawning is on and you play on skill 1 or 5, picking
up ammo would permanently double the amount of ammo received from that
item the next time it gets picked up.
- Added a check to PlayerIsGone() for players who have already had their
actors destroyed before calling it.
- Fixed: G_CheckDemoStatus() only restored your name, autoaim, and color
settings after playing back a demo.
- Added DEM_SPRAY net command so that sprayed decals work in multiplayer
and demos.
- Changed DEM_GIVECHEAT to use a word for specifying the item quantity.
This is useful mainly for giving yourself more than 255 health at a time.
- Fixed: DEM_SUMMONFRIEND was not handled by Net_SkipCommand().
SVN r58 (trunk)
- Added multiple-choice sound sequences. These overcome one of the major
deficiences of the Hexen-inherited SNDSEQ system while still being Hexen
compatible: Custom door sounds can now use different opening and closing
sequences, for both normal and blazing speeds.
- Added a serializer for TArray.
- Added a countof macro to doomtype.h. See the1's blog to find out why
it's implemented the way it is.
<http://blogs.msdn.com/the1/articles/210011.aspx>
- Added a new method to FRandom for getting random numbers larger than 255,
which lets me:
- Fixed: SNDSEQ delayrand commands could delay for no more than 255 tics.
- Fixed: If you're going to have sector_t.SoundTarget, then they need to
be included in the pointer cleanup scans.
- Ported back newer name code from 2.1.
- Fixed: Using -warp with only one parameter in Doom and Heretic to
select a map on episode 1 no longer worked.
- New: Loading a multiplayer save now restores the players based on
their names rather than on their connection order. Using connection
order was sensible when -net was the only way to start a network game,
but with -host/-join, it's not so nice. Also, if there aren't enough
players in the save, then the extra players will be spawned normally,
so you can continue a saved game with more players than you started it
with.
- Added some new SNDSEQ commands to make it possible to define Heretic's
ambient sounds in SNDSEQ: volumerel, volumerand, slot, randomsequence,
delayonce, and restart. With these, it is basically possible to obsolete
all of the $ambient SNDINFO commands.
- Fixed: Sound sequences would only execute one command each time they were
ticked.
- Fixed: No bounds checking was done on the volume sound sequences played at.
- Fixed: The tic parameter to playloop was useless and caused it to
act like a redundant playrepeat. I have removed all the logic that
caused playloop to play repeating sounds, and now it acts like an
infinite sequence of play/delay commands until the sequence is
stopped.
- Fixed: Sound sequences were ticked every frame, not every tic, so all
the delay commands were timed incorrectly and varied depending on your
framerate. Since this is useful for restarting looping sounds that got
cut off, I have not changed this. Instead, the delay commands now
record the tic when execution should resume, not the number of tics
left to delay.
SVN r57 (trunk)
of sync becase the RNG seed was being altered during recording but not
during playback. This was caused by an inappropriate fix for a similar
problem: -record calls G_InitNew() before it actually starts recording
the demo, but -playdemo calls G_InitNew() after it starts playback. So
the rngseed stored in the demo was already altered. The correct thing
to do is not to prevent the rngseed from changing during playback but
to move the call to G_InitNew() after the call to G_BeginRecording().
- Fixed: After respawning in a demo, demo playback was prematurely
terminated.
SVN r50 (trunk)