Please note that the survey is currently closed. GZDoom 4.0.0 does not include the survey code that 3.5.0 did.
Download (Modern, OpenGL 3.3 and higher) Highlights
- Vulkan released in its alpha stages. Use "+vid_backend 0" on the command line to activate it. VERY IMPORTANT! Vulkan is unfinished and has several issues. You will likely crash. It works well in vanilla Doom without any mods, and will work with mods that don't use models or shaders - but any mods that have these things will likely cause GZDoom to crash. You will have to switch back to OpenGL to play these mods. ("+vid_backend 1")
- Localization: GZDoom has been translated to several languages, with more to come soon. Please see the following two threads if you wish to help: [1] [2]
- Scaling has been changed. GZDoom now runs at a minimum of 640x400. An extra mode - 960x600 - has been added to replace the lost 320x200 one.
- Internal code restructuring to agnostisize level structures.
- add 'cl_blockcheats' - useful for people who use debugging keys, allows a user to consciously turn off cheats without affecting the server
- Punctuated the input strings in UpperCamelCase format, improving its appearance in the menu for upper/lowercase capable fonts
- 'wait' console commands no longer execute inside the level, and can run during intermissions and outside the game
- moved controls to submenus in "Customize Controls" menu
- Implement page string names for dialog lumps
- did a bit of cleanup on the option menus by regrouping some settings, especially splitting out of the Hardware Rendering Options menu into submenus.
ZScript
- scriptified P_CalcHeight. This was the only code using the ViewBob member variable. This also moves the range check for this variable to its application, because a badly behaved mod can just as easily change it at run time instead of just setting an absurdly large value in the class definition.
- scriptified APlayerPawn's DamageFade handling.
- scriptified A_SkullPop and ObtainInventory. These were the last relevant items to access PlayerPawn.InvFirst.
- scriptified useflechette CCMD's item finding code.
- scriptified the remaining PlayerPawn methods.
- exported all native components of APlayerPawn.
- Added Z + camera roll relativity for A_QuakeEx's QF_RELATIVE flag.
- Added inflictor, source and flag parameters to GetModifiedDamage on actors and ModifyDamage on inventory. The flags are used by DamageMobj so modders can determine radius damage, for example, by checking for DMG_EXPLOSION.
- removed extraneous parameter in SpawnPlayerMissile call in A_FireProjectile. The native variant has a MissileActor out parameter in this place, but in ZScript that's a secondary return value.
- Add LookScale variable on weapon This variable allows a weapon to set a custom look sensitivity multiplier without fiddling with FOVScale / DesiredFOV hacks.
Spoiler: This is long
- Vulkan released in its alpha stages. Use "+vid_backend 0" on the command line to activate it. VERY IMPORTANT! Vulkan is unfinished and has several issues. You will likely crash. It works well in vanilla Doom without any mods, and will work with mods that don't use models or shaders - but any mods that have these things will likely cause GZDoom to crash. You will have to switch back to OpenGL to play these mods. ("+vid_backend 1")
- Localization: GZDoom has been translated to several languages, with more to come soon. Please see the following two threads if you wish to help: [1] [2]
- Scaling has been changed. GZDoom now runs at a minimum of 640x400. An extra mode - 960x600 - has been added to replace the lost 320x200 one.
- Source code has been reorganized a bit to modernize it and to streamline some of the now defunct ZDoom project stuff with the GZDoom specific stuff, since there are no longer concerns with upstream support.
- Have Plutonia MAP16 pit kill player
- TNT.WAD fixes
- Fixed: IsFakePain received the modified damage instead of the raw, preventing ALLOWPAIN from working as intended.
- made some changes to how the compatibility code works to allow removing the last remaining global variables of the map loading code.
- Everything temporary is now part of the MapLoader class.
- treat non-existent arrays in the savegame as zero length.
- eliminated the two global FraggleScript variables by moving them into DFraggleThinker.
- made PlayerPawn.TweakSpeeds virtual.
- fixed: The polyobject spawn point collector did not properly check for bad mapthings.
- reworked the lock code to remove the 255 locks limit and to allow it to automatically deinitialize.
- fixed missing attack sound in A_CustomPunch
- fixed ammo check for weapon with 'uses both' flags
- do not use global variables to track state in the decal code. Setups like this have caused problems in the past so best get rid of it.
- removed the static members from FMaterial. Their functionality has been moved to more appropriate places already and they were essentially unused.
- use a TArray to store the sprite model hash to get rid of one atterm call.
- The backwards animation accessed the wrong array which in case of sequences with different length could crash
- fixed precaching of switches.
- fixed SPC music loops
- let UDMFParser use the level from the map loader, not the global variable.
- pass level as an argument to some code being used by the map loader.
- fixed the direct native variant of DynamicLight.SetOffset.
- added missing null pointer check to SBarInfo's inventory bar drawer.
- added missing return in P_RemoveThing.
- Fixed settings_controller not updating properly when a player becomes the new arbitrator in a netgame.
- Fixed: SXF_CLEARCALLERSPECIAL cleared the spawned actor's special instead of the caller.
- fixed typo in sky preparation.
- split up P_FreeLevelData, so that everything that clears out fields in FLevelLocals is now in a member function of that class.
- fixed crash in AutoUseStrifeHealth The loop never checked if the item was still valid and would continue to try to use it, even after it was removed from the inventory and destroyed. As native code this just failed silently, but with the VM it needs to be explicitly checked.
- fixed everlasting fast projectile after hitting ceiling Without the test for ceiling hit fast projectile could enter its Death state every tick infinitely
- rewrote dynamic lights to not use actors for the internal representation and made DynamicLight a purely scripted class. This should be less of a drag on the playsim than having each light a separate actor. A quick check with ZDCMP2 showed that the light processing time was reduced to 1/3rd from 0.5 ms to 0.17 ms per tic. It's also one native actor class less.
- fixed memory leaks in network code. ReadString allocates a buffer, so saving it in a local variable and then forgetting it will not free the buffer afterward. (This should probably be refactored to use some safer methods to read the string than this old-school method...)
- Since GetParentAmmo is now virtual, BackpackItem and the "give ammo" cheat should call GetParentAmmo to determine base ammo classes.
- scriptified the declaration of AmbientSound Most of the code is still native, but this means that PlayerPawn is the last remaining child of AActor.
- Fix A_CustomBulletAttack's spawnofs_xy parameter The current behaviour offsets to the front of the actor rather than the side, due to an oversight in the code, which oddly is not present in the A_FireBullets equivalent.
- fix Unix builds without backtrace functions in their libc backtrace functions are not present in all libc implementations. Cmake has module to add external libraries into build if needed so use it to fix build on Unix systems without backtrace in libc.
- scriptified useflechette CCMD's item finding code.
- force CMake to use internal asmjit. left it in a state so that it can easily be changed back in the future.
- added missing range checks to level compatibility handler
- Fixed: NODAMAGE was not accounted for with pain.
- made ColorRangeStart and ColorRangeEnd meta properties of APlayerPawn. These are only used during initialization and they should have been readonly from the start.
- scriptified A_SkullPop and ObtainInventory. These were the last relevant items to access PlayerPawn.InvFirst.
- fixed: DeactivateLight called Activate instead of Deactivate.
- Add missing screenshot sRGB gamma when vid_hdr is active
- initialize the PlayerPawn members only used by scripts through the script variable interface. The goal here is to eliminate the native PlayerPawn class, after all, so this will be needed anyway.
- properly handle passing of the light flags. Since these can be changed on the placed light actor they have to be read from there, so this is now a pointer in FDynamicLight, just like the other properties that can be user-changed. Also did some cleanup on the interface so that external code doesn't need to dereference the lightflags pointer but can use utility functions for all flags.
- did some more lightening on the PlayerPawn class. 4 more properties and one native member function have been handled.
- scriptified P_CalcHeight. This was the only code using the ViewBob member variable. This also moves the range check for this variable to its application, because a badly behaved mod can just as easily change it at run time instead of just setting an absurdly large value in the class definition.
- scriptified APlayerPawn's DamageFade handling.
- scriptified A_SkullPop and ObtainInventory. These were the last relevant items to access PlayerPawn.InvFirst.
- scriptified useflechette CCMD's item finding code.
- scriptified the remaining PlayerPawn methods.
- exported all native components of APlayerPawn.
- fixed: G_StartTravel must remove all dynamic lights from the actors it is about to carry over to the next level.
- fixed A_Chase default detection.
- Default gender for sound classes should be male and not other since it could be undefined in SNDINFO.
- fixed: The player sound lookup would fail if a sound was only available for the last gender in the list. This is an ancient bug, but it never registered before - only after making 'other' the default gender for nonsense input it became apparent.
- fixed: The update check for a changed AABBTree was inverted.
- disable polyobj AABBTree updates
- split shadowmap AABB tree into two parts. one for static and one for dynamic
- upload only the dynamic AABB subtree using glBufferSubData
- change internal raytracing stack limit from 16 to 32
- update shadowmap AABB tree after R_SetupFrame for proper frame interpolation
- fixed: GetSoundClass must be able to handle non-players.
- fixed delete calls on FDynamicLight. This isn't allocated from the system heap so it cannot be freed by it.
- fixed: Trying to remove the first item in an actor's inventory would lose all owned items.
- made forwardmove and sidemove defaults configurable through the gameinfo section.
- bumped savegame version because the recent scriptification of APlayerPawn will render all old savegames unusable.
- changed FraggleScript setup so that the MapLoader does not use the global level variable anymore. This involves passing the level explicitly to many functions. What was done here may seem a bit excessive but at least it covers everything. Most importantly, the global ActiveThinker pointer has been moved into FLevelLocals and is now getting tracked properly by the level without using dangerous assumptions about how the game organizes its data.
- moved the global spot state into FLevelLocals. This way it doesn't even have to be a thinker.
- made the corpse queue a simple array in FLevelLocals. I have to wonder why it had to use such a complicated implementation that provided no advantages whatsoever. The new code is just 1/5th of the old one's size and much closer to Hexen's original implementation which also was a simple array but with no means to resize the queue.
- reordered sector_t so that the internal declarations are at the top, followed by the member variables and the methods. Also tried to sort them by renderer use but that turned out to be without any performance effect, even though the struct is a bit better aligned now and several bytes shorter.
- let RunHealth clamping respect the newly added global properties.
- converted the ACS Stringbuilder macros into inline functions.
- moved the per-level ACS state into FLevelLocals.
- Fixed spawn height of projectiles created by SpawnPlayerMissile.
- changed AFuncDesc initialization to avoid generating initializer functions. Visual C++ will never statically initialize a class instance where a member field has a default value set, so the DEFINE_ACTION_FUNCTION variants without a direct native call need to be handled differently. The easiest way to do this is to leave out the nullptr default and omit the value in the initializer list. For trailing fields this will always get them nulled.
- moved the global ACS ActiveThinker variable into FLevelLocals.
- store the index of each map item in the struct itself and return that for the Index function. If we ever want to refactor the global level data these must not reference the 'level' variable. The main parts of the map loader cannot use this information, because it can only be created after running the node builder, so it got its own set of index functions instead.
- Implemented compound initializers for arrays.
- changed light mode handling of the hardware renderer so that it only operates on local copies but doesn't alter the level's setting. There are several places where a temporary change of light mode is needed, all these made this change in the global level struct. Now the change is only local to the active draw info.
- let level stats screen operate only on the data it got provided instead of getting the current level from global variables.
- pass level num to string locking functions as a parameter.
- (source) replaced some NULLs with nullptr.
- fixed serialization of ACS thinker.
- major cleanup of p_scroll.cpp to eliminate the use of indices to access sidedefs and sectors.
- check the shader timer only once per frame, not once per draw call.
- Fixed Thing_ProjectileAimed being broken.
- It was calling the fallback aiming in the wrong place when it should have been outside the speed check.
- Credit to _mental_ for the base code, but no gotos involved.
- Move receiver NULL check above the orresult check (#695) This is to prevent a VM abort from happening here if orresult is false.
- Fixed some issues in the ZScript array compilation code.
- Added support for implicitly-sized initialized arrays. Also fixed dynamic arrays not being cleared before initializing.
- fixed crash on creation of scroll texture Example: Hadephobia MAP19 crashes on loading
- fixed key number assignment during parsing of locks
- Moved high level parts of view border drawing to status bar.
- Moved access to ACS instance data out of ScriptUtil worker class This is better done at a higher level.
- removed dependency on global time in sound sequence code. This can better use a countdown timer that doesn't depend on external behavior. - same for the ambient sound
- increased range of valid sound positions and velocities
- Fixed multidimensional array definitions.
- moved the impact decal counter into FLevelLocals and do the counting in a less problematic fashion. This was yet another piece of code that lived or died with the assumption that there can only be one level, stored in global variables.
- Fix return value of native BuiltinCallLineSpecial
- made OP_NEW a builtin function instead of an opcode. The code was present 3 times due to the JIt, and this is not something that benefits from being a real opcode, even in the interpreted case.
- unary minus operator propagates boolean operand to integer
- Make LevelLocals::ExecuteSpecial return int
- the sound compatibility flags do not need level support. They are intentionally omitted from both MAPINFO and compatibility settings. This removes the last place where it still went through the map-modified versions of the compatflags.
- fixed script line numbers after multi-line raw string literal
- fix black cam texture on HUD
- fixed: Strife was missing the move factors.
- relaxed caller type check for states modified by Dehacked
- fixed condition to produce blood splatter during line attack
- ensure proper emission of deprecations. For global variables this wasn't implemented.
- fixed compilation errors
- fixed crash in the precaching code. This didn't detect software canvas textures and crashed on the missing image.
- fixed wrong self type in Array.Resize()
- fixed potentially missing event handlers Event handlers linked list might skip an entry if its order was in a middle of existing handlers
- fixed error reporting for the BSP loader Using global variables for this is bad, and it didn't even catch all cases. Now a node build is only considered successful if everything is set up successfully.
- recalculate the line deltas if a nodebuild is needed One potential cause is moving around vertices in which case these do not match anymore
- fixed default alpha for sector colors It has to be 0, not 255.
- allow assignment of line IDs through LevelCompatbility.
- fixed disappearing inventory after morphing pickup When player is picked up item that does morph, the corresponding toucher actor is changed in process Previously, morhing item was removed from original actor leaving player's inventory in inconsistent state
- workaround code generation issue in PlayerPawn.FindMostRecentWeapon() Multiple values in returned from a subfunction cannot be used directly as a function result
- workaround MSVC 2015 code generation issue, x64 only With optimization turned on illegal instructions were generated for turbo CVAR handler function
- normalize the pitch in ACS's SetActorPitch. Apparently some people have to pass positive numbers in here to get a negative pitch, e.g. 350.0 instead of -10.0... This prevents clamping of such out-of-range values that would otherwise constitute valid pitches with the wraparound in place.
- fixed: TVector3::Pitch() got the sign inverted. This caused bad calculations with CMF_OFFSETPITCH. Note that to compensate for the fix, the SphericalCoords function had to have its own inversion of the value removed so that it calculates the same result as before.
- fixed: application of fake contrast should never result in a light level of 0 unless the sector's own light level is 0.
- applied proper use type to font textures Font upscaling no longer depends on texture resizing setting
- reverted GME Kss_Cpu.cpp to previous version Update to GME 0.6.2 broke playback of MSX .kss files
- fix spacing on one of the resolution preset entries
- add 4k UHD resolution to presets
- fixed: The rail attack only considered the puff's decal if it had ALWAYSPUFF set.
- set resolution selector to auto detected resolution at startup, remove the entries from the config file
- committing a change for fullscreen sets scaling to 1.0 to guarantee the selected number of pixels are actually used
- modify the wording in the preset scaling menu to imply that all it does is pixel scaling, not change the actual screen resolution
- fixed 'missing interpolation point' warning
- fixed 'overriding core lump' error Wrong container was reported for overriding lump
- Move the "time" string in saved game comment into the LANGUAGE lump.
- removed incorrect assert. This assert disallowed pointers to non GC'd objects, which on some occasions can happen and must be allowed.
- fixed armor bonus giving in A_CustomPunch
- moved LZMA docs to the same location as in SDK distribution Updated them to the actual version 18.05 as well
- updated LZMA to version 18.06
- force internal GME with any build environment created after this commit. if anyone is using a build environment from before - you will have to make sure to enable the relevant variable - or simply nuke and recreate. this applies only if you have the GME library installed on your system - if you were using the internal before, anyhow, you don't have to make any changes
- fixed Identifier resolving for static functions This entered the code path which warned about ambiguous use of variables in action functions and as a result ran afoul of subsequent error checks. Since ZScript has no global scope resolution operator, this needs to ignore all non-static class symbols and try to look up any of these as global identifiers.
- swapped order of checks for picking up an item. Failure must take precedence over the morph check because this does not return a proper toucher.
- remove vid_hwgamma, always use shader gamma
- removed now unused BuildGammaTable function
- fixed: ScriptUtil.PlayerAmmo must be declared static.
- fixed flicker light selection of light radius.
- copied the changes to DFlashFader in master.
- fixed code emission for constant ZScript function arguments
- Wrap all iterator calls in the map loader into FLevelLocals methods.
- changed Polyobject thinkers to operate on the actual polyobjects instead of indices This also changes the action special interface to pass a Level parameter to the separate functions and makes a few other minor adjustments to the polyobject code.
- removed most global references to the tag manager by routing most access to FLevelocals.
- moved the tag manager into FLevelLocals
- moved the scripted creation functions for tag iterators to LevelLocals The old static methods are now deprecated, this was done to clarify the relationships at play here.
- Improved Strife’s BIGFONT file
- Punctuated the input strings in UpperCamelCase format.
- reroute all uses of FActorIterator and NActorIterator through FLevelLocals.
- moved the tid hash into FLevelLocals and adjusted the interface to the iterators.
- Moved Strife conversation data into FLevelLocals.
- moved a large batch of code from p_spec.cpp and a few other files into the maploader folder.
- use default constructors for the thinkers to avoid empty non-inlined functions.
- deleted unused mus2midi.cpp file.
- moved most functions of portals.cpp into FLevelLocals. Much of this is used during level init and needs to be independent of the current level.
- give line_t a GetLevel function. The portal getters need this, even though currently it only gets the global level.
- call level compatibility handlers for all levels and pass the map name as a second parameter. This is for user-made handlers for which the checksum is rather useless both for deciding whether to call the handler and for identifying the map.
- give the hardware renderer's drawinfo its own level pointer
- add 'cl_blockcheats' - useful for people who use debugging keys, allows a user to consciously turn off cheats without affecting the server
- use a separate variable pointing to the current level for the UI code. UI always runs on the primary level, so this does not need the ability to operate on multiple levels. Additionally, this can later be set to null when running play code so that scope violations result in an abort.
- fixed indentations caused by conflict resolution in cherry-picked commit d911fa99a121fd415472c3d5217cd9cda9f2c20a
- use a local variable to access the level in DLevelScript. This was a relatively cheap change but removes a significant batch of references to the global variable, only making the entry points to the ACS interpreter relevant.
- made G_InitLevelLocals a member function of FLevelLocals. This was another cheap one with a good number of removed references.
- made most of the EV_* functions part of FLevelLocals.
- level as member variable in the sight checker.
- made the automap an object. This simplifies handling a lot because it allows to make the level the owner of its map.
- fixed: DAutomap::Serialize needs to call its super method.
- moved all EV_Light* functions and G_SerializeLevel into FLevelLocals
- added a pseudo-serializer for FLevelLocals pointers.
- initialize the impact decal counter for each level.
- give thinkers a 'level' member and change linking to the chain to happen outside the constructor.
- took the delayed console command execution out of the thinker management.
- pass a const string to AddCommandString.
- changed thinker initialization to occur in a Construct function instead of the constructor itself.
- fixed: When A_SpawnProjectile got fixed, this fix broke the old A_CustomMissile function because the added workaround was overlooked. This now separates the code more clearly into the twp paths to make the differences easier to see and compare.
- deprecated the global 'level' variable.
- translate UMAPINFO specials at execution time, not load time.
- removed a few direct uses of TThinkerIterator.
- added virtual destructor to FDelayedCommand
- give the sector a level reference.
- removed level references in the software renderers.
- let the sound code use the current UI level. This is what should be audible. To prevent other levels from playing sound, all entry points check whether the sound playing entity belongs to the current UI level.
- fix handling of the global script in FraggleScript. Depending on serialization order is not a good idea here, so now it's no longer stored as a parent in the main level script but explicitly checked for when looking for a variable.
- changemap must use the current UI level if the user wants to go to "*".
- changed infighting check so that the static skill checker does not access the level
- moved the interpolator into FLevelLocals and refactored its use to happen outside the renderers.
- use map time, not hub time for map actions.
- sanitized the 'frozen level' code. This had two different flags that were checked totally inconsistently, and one was not even saved. Moved everything into a few subfunctions so that these checks do not have to be scattered all over the code.
- Split G_DoCompleted into a global part and a level specific part.
- Handle level check in texture coordinate calculation, in bot code, G_StartSlideshow
- handle the software renderer's GetColorTable function The real question here should be: Why does this need to get called in over 40 differenrt locations…?
- moved the static sky variables into FLevelLocals and removed the redundant ones for the texture ID.
- health groups and software rendering textures freed of 'level'
- made dumpportals CCMD multi-level aware.
- split G_DoLoadLevel into a level specific and a global part.
- moved the SectorMarker handling into the level itself.
- moved UDMF custom properties into FLevelLocals.
- run disconnect scripts on the level the disconnected player is on. This is nearly always the primary one but let's keep the option of using bots on secondary levels.
- replaced DWORD_MAX with UINT_MAX globally. This was the last remnant of ZDoom's old integer types.
- moved gamestate_t to g_game.h. This made reviewing the code for accessing the global state hard, because the doomdef.h contains mainly constants, this particular item was the only thing in there that represents actual engine state.
- cleaned up the header list in maploader.cpp.
- started cleaning up the contents of the g_shared directory
- moved the hud message and alt hud code from g_shared to g_statusbar
- copied a few more map information CCMDs to g_ccmd.
- fixed: DInterpolation was unlinking itself from the wrong interpolator
- removed the playernum parameter from CheckLocalView
- only activate lights if the light actor isn't dormant, and only create a new one if it doesn't already have one.
- make the file name of savegame nodes read only.
- DOOM.WAD fixes
- Added CheckReplacee.
- Allows defining of what actor is replacing another for information.
- If multiple arachnotrons, a modder can attribute them as being a replacer of Arachnotron itself, allowing A_BossDeath and GetReplacee to work with it.
- moved the I_Error prototypes to doomerrors.h to avoid having to include the low level system header for this.
- moved the menu.h include from oalsound.h to oalsound.cpp. The menu is a very 'dirty' header, and forcing it to be pulled in with something entirely unrelated is not good - even though only two files include oalsound.h.
- moved all rendering code into a common subdirectory.
- moved most utility code to a subdirectory.
- prettification of p_teleport.cpp and some include cleanup.
- moved some diagnostic CCMDs to g_dumpinfo.cpp.
- removed v_video.h include from portals.h This has no business in a play related file which also made no use of it.
- moved a bunch of files to the utility folder.
- do not call renderer code directly to reset the view interpolation The playsim really has no idea what the renderer is supposed to do here and the current system has some serious issues that eventually need addressing. So it is better to just set a flag that an actor needs to have its view interpolation reset if being used as a camera and let the render code deal with it. This will keep the playsim clean of future changes to this feature.
- removed all access to the consoleplayer variable from the play code. There is one exception in ACS for a net arbitrator check. Aside from this the bot_observer CVAR was also removed. This was never implemented properly and could stomp upon custom player settings.
- changed most places where a player index is calculated by subtracting the player array's base access.
- fixed potentially incomplete list of argument flags for virtual function
- moved the contents of g_inventory to g_shared and gamedata subfolders. a_pickups only contains a few native remains of the inventory code and the other two only the static data maintenance for their items.
- moved the CCMDs out of a_pickups.cpp.
- Added Inventory UNCLEARABLE flag. - Allows prevention of ClearInventory without stopping it from being dropped.
- moved the resourcefiles and textures folders into gamedata.
- moved KEYCONF_only CCMDs out of play files.
- renamed the level variables. currentUILevel is now primaryLevel. For ZScript, currentVMLevel was added. This is also exported as 'level' and will change as needed. This also means that no breaking deprecations will be needed in the future, because in order to sandbox a level only 4 variables need to be handled: level, players, playeringame and consoleplayer. The remaining global variables are not relevant for the level state. The static 'level' has been mostly removed from the code except some places that still need work.
- changed the linedef translator into a struct and reorganized its storage to allow having different ones at the same time.
- made the event manager an object so it can be instantiated multiple times.
- changed the place where the CheckRequireMouse event gets called. The original place in I_CheckNativeMouse is unsafe because that function can get called from the system message queue which can result in a bad global state of the VM for such a call because it can be recursively invoked from code that may temporarily alter some settings.
- separation of static and map-local event handlers into separate lists.
- fixed: Retriving a key's color did not work.
- allow localization of Strife's log text.
- had to fix a few things.
- added am_showkeys_always
- fixed: The HUD model code did not account for placeholder sprites.
- fixed: Instead of mapping Hexen's BLANK texture to the null texture, make its actual use type that of a null texture. The software renderer does not have any safeguards against such a mapping and crashes on it. This code was a quick hack from ancient times from when ZDoom did not have robust texture management and some recent changes ran afoul of this very special exception.
- fixed: The CheckEnvironmant call in PlayerThink can already invalidate the PlayerPawn so even the calls to CheckUndoMorph and CheckUse need to get the pawn through the PlayerInfo.
- fixed glitches with some poorly set up sector stack portals.
- fix polyobject init
- removed bad character from A_CustomPunch definition.
- disabled VM JIT completely on unsuported platforms
- disabled usage of intrinsics on non-Intel platforms
- fixed optimization settings of RelWithDebInfo build to match the regular release version. CMake sets RelWithDebInfo to only inline functions explicitly marked as such whereas Release is allowed to inline everything suitable.
- fixed: SendPitchLimits is not playsim code so it cannot use the PlayerPawn for anything.
- allow localization of Hexen's original ACS strings.
- fixed ambient sounds "leaking" into reverb environment. Set speed of sound to 343.3 and init scale to 1 according to @kcat suggestion
- exported all texts from Strife's dialogues to the string table. Now all this content can be localized. However, since this is actual game content it was placed in a secondary file in zd_extra.pk3, so that it won't affect the GPL-compatible status of the main one.
- split up the OnDestroy method of interpolations.
- fixed bad default initialization of BoundingRect's coordinates.
- changed type of Nop expression to void Control flow statements with constant condition no longer cause misleading fatal errors in ZScript
- re-count impact decals each time a savegame is loaded. This counter is not always reliable, especially when running for longer periods, so putting it in a savegame is not a good idea.
- print more meaningful info in countdecals CCMD.
- fixed creation of phased light sequences.
- properly un-count faded out decals without involving the Destroy method.
- added a compatibility fix for KDiZD Z1M3 and fixed some tagging issues in the compatibility handler.
- reworked font loader to make adding multi-lump fonts easier. A multi-lump font can be created by putting all characters into a subdirectory of fonts/ with the intended name. Each character needs to be named by its character index as hex number.
- fixed lowercase handling of non-basic-latin characters and added Undead's Russian translation. The added table may be overkill but this way the font engine is prepared for things to come.
- fixed: ACS calls need to explicitly pass the level into COPY_AAPTR. Unlike from an action function, this can be called with a null actor, which for the player constants still needs to return something valid.
- start the HUD message ticker at -1 to compensate for the additional tick they now receive due to the change at which time the status bar gets ticked.
- fixed: The global viewpoint's Level member was accessed before it was set. All affected code needs to get a Level parameter passed in through its arguments.
- fixed: LEVEL_USEPLAYERSTARTZ was checked on the wrong variable.
- fixed: 'level.frozen' still needs to be writable and have an effect.
- Added Z + camera roll relativity for A_QuakeEx's QF_RELATIVE flag.
- Added inflictor, source and flag parameters to GetModifiedDamage on actors and ModifyDamage on inventory. The flags are used by DamageMobj so modders can determine radius damage, for example, by checking for DMG_EXPLOSION.
- fixed: The level's local event manager wasn't fully taken down when freeing the level's data.
- fixed dropoff checks for portals and 3D floors in the same sector.
- removed extraneous parameter in SpawnPlayerMissile call in A_FireProjectile. The native variant has a MissileActor out parameter in this place, but in ZScript that's a secondary return value.
- exported the character names of Strife's dialogues.
- Added Russian Unicode alphabet for Hexen, Heretic, and Strife
- use proper casing for the game texts so that they can also work with a complete font.
- cleaned up .gitignore. This still contained a lot of data from the pre-CMake build setup for Windows. None of these paths is relevant anymore.
- removed the ActiveSequences counter.
- moved Strife's map names to the string table, moved the displayed text in strfhelp.o to the string table.
- exported all Hexen map names and intermission texts to the language table, As IWAD content this is in zd_extra.pk3.
- Only replace Strife dialogue content if the default strings from zd_extra.pk3 are present. If not, use the dialogue file's content directly.
- added compatibility flag for buggy CheckSwitchRange behavior, added compatibility entries for maps affected by buggy CheckSwitchRange behavior
- changed font loader to detect fonts in folders and to find all default fonts in folders.
- cleanup of font init to have less special cases
- To make things easier, DBIGFONT, SBIGFONT and HBIGFONT will now be renamed in the lump directory to make things a bit easier to handle.
- Another change is to make font folders atomic units to prevent cross-pollution between incompatible fonts. The only exception to this are the def* folders because they need to piece together their fonts from both zd_extra.pk3 and the IWADs.
- added Doom and Strife BigFont characters.
- Fixed loading of folder based fonts and added a config lump per font. - Current options are "Kerning", "Scale", "FontHeight" and "SpaceWidth"
- fixed map name setup This was broken when localization for Hexen was added.
- made gameaction read only The script side cannot do anything useful with this, because most actions require parameters in global variables, so this is a first grade candidate for rogue mods to make the engine misbehave.
- fixed run health clamping. This didn't scale the move factors properly.
- added ability to customize font of automap marks
- Set am_markfont CVAR to a desired font name
- Use am_markcolor to select a text color, has no effect with the default font, AMMNUMx
- Remove "gitversion.h" from "version.h" - should result in faster compiles after a commit in Windows
- Fix zdoom.rc to show the actual git commit tag and id for the Product Version
- Made zdoom.rc "codepage 1252" compliant as dictated by the #pragma (if this needs changed the pragma should be updated, this was messing up the version strings in the final compile)
- pass full Unicode characters to EV_GUI_Char for Linux and macOS.
- switched the Windows backend to use the Windows Unicode API.
- added some character counting utilities to FString.
- fixed DHudMessageTypeOnFadeOut's character counter to be UTF-8 compatible. This was reading the string by byte and not by character and could end up printing incomplete UTF-8 data.
- New BIGFONT, uppercase and lowercase (Credits to Skulltag for the uppercase B, Amuscaria for the uppercase X and Z, and @jnechaevsky for all Russian characters, taken from Russian Doom!)
- made Windows backend parts of the console Unicode capable.
- use the Unicode version of Windows's clipboard functions.
- made the console Unicode-capable.
- made the chat input Unicode-capable.
- made the menu's text input handler Unicode capable.
- fixed the player name display.
- fixed crash log display.
- use wWinMain instead of WinMain so that a Unicode argv gets created. For whatever reason, the ANSI startup leaves this variable empty.
- added a 'disablecrashlog' CCMD for Windows. It is a lot more useful with a debugger present to get the standard crash notification from the system which allows opening a debugger than the crash log and no option to open a debugger.
- set a kerning of -1 for both BigFonts.
- moved font code into a subdirectory.
- split the FSingleLumpFont class into its own file.
- split FSinglePicFont into its own file.
- moved FSpecialFont to its own file.
- did a bit of fine tuning to the character replacement mappings:
- prefer accent-less lower case over uppercase letters if an accented lower case letter cannot be found.
- added accent-less mappings for Latin Extended 1 (0x100-0x17f) and some easy to handle characters between 0x200 and 0x220. This should allow to display all Eastern European text without empty gaps for missing letters.
- split the FFont base class into its own file.
- reworked console font loading to use the glyph sheets directly and allowing to load more than one per font.
- added U-100-U-17f to the CONFONT
- added German Umlauts for the BigFont and fixed the character substitution logic.
- allow the language table to supersede the title patches, if appropriate
- fixed automap marks placement with custom fonts
- Automap rotation wasn't taken into account when drawing marks
- Fixed monsters waking up even if all the damage was absorbed without pain causing flags
- Fixed FORCEPAIN not overriding PainThreshold property
- moved controls to submenus in "Customize Controls" menu
- What is done:
- Controls are separated by existing sections, each section is now a submenu;
- The original sections are preserved;
- The original controls order is preserved;
- "Controls" section is renamed to "Game", because "Controls" submenu of "Customize Controls" would be too confusing;
- Map (automap) controls are added as a section, map controls submenu is unchanged;
- Missing controls are added to "Other" section;
- Sections are given a title following the scheme "Customize <section> Controls", except N4 (see below).
- Inside the sections, spaces are added to group the related controls.
- Add handling of left and right mousewheel events to the SDL2 input path
- Implement page string names for dialog lumps
- Create special new GZDoom name space for ZSDF
- add usdf_gzdoom spec document
- reposition the binary strife fix in a more appropriate location
- add compatibility fix for negative numbers in responses in USDF/ZSDF (don't know if it's actually necessary)
- fixed: offsets got lost in font's translated textures
- Pass the target as the source for active damage modifiers (i.e. PowerDamage) instead of the actual source. - Getting the victim would be impossible otherwise, and passing in the original source is redundant when there's already the owner.
- fixed: The wbstartstruct that gets passed to the level summary screen needs to be static This variable is needed long after the function which sets it up will be exited. So this either needs to be dynamically allocated or static, and in this case using a static variable is simpler. However, unlike before, it is only being accessed in the one function that needs to initialize it and pass to the summary screen and nowhere else.
- added a function that creates a texture for a text in a given font.
- changed zstrformat to allow %c to emit non-ASCII characters as UTF-8.
- fixed: The language ID was set before reading the config.
- moved the lump/resource names in the string table to their own file and removed them from other language files.
- a bit of text cleanup. Removed some unused strings and moved a few not-to-be-translated ones to language.def.
- fixed: Doom used Chex Quest's default settings for menu fonts.
- added support for localized texture replacements.
- enforce that localized graphics need to be the same size as the one they replace.
- This is one of those things where the work needed to make it robust stands in no relation to the gain.
This simply isn't worth the hassle of going through the entire code and fixing every single use of the 2D texture drawing functions.- Unfortunately this means that the graphics items for the menu cannot be replaced this way because their size will most likely differ, but considering that the only candidates for this are the contents of Doom's main menu, the episode menu, the skill menu and the single player summary screen, it's simply not worth it.
- In all these cases the IWAD contents can just as easily be replaced with text and user mods which want to offer localized menus will have to work within the confines of the system, e.g. making sure that all menu items are designed to have proper size for substitution to work or by requesting text based menus, which will be added as a modding feature later.
- allow text substitution for StaticPatch items in ListMenus
- reworked summary screen to use consistent contents, either all patches or all text but not mixed
- reworked texture lookup for localized textures
- fixed reading of exit text replacements and display of intermission text screens for Unicode.
- fixed string checks in dialogue loader.
- initialize the language right after reading the strings.
- changed all places which used a localized string as a format template for printf, String.Format et.al. Passing something non-constant at compile time here is extremely dangerous, especially when users can replace those strings if they like. It now uses FString::Substitute in all cases where something needs to be inserted into a template string.
- fixed layout of summary screen.
- more work on graphics substitutiion
- added a CVAR that sets how localizable graphics need to be dealt with.
- pass the substitution string to OkForLocalization so that proper checks can be performed.
- increased item spacing on Doom's list menus to 18 from 16 pixels, because otherwise the diacritic letters would not fit. 20 would have been more ideal but 18 was the limit without compromising its visual style
- added a second text-only main menu because here the spacing cannot be changed. Doing so would render any single-patch main menu non-functional. So here the rules are that if substitution takes place, it will swap out the entire menu class.
- fixed some issues with the summary screen's "entering" and "finished" graphics.
- implemented OkForLocalization
- added a kerning option to FONTDEFS
- Add language selector in the miscellaneous menu
- fixed the usedcolor array's base type. The usedcolors array which counts the number of pixels in a given color in a font used bytes as storage, so any color that just happened to have a count that is a multiple of 256 the color was considered not present.
- moved all dialogue loading code into the map loader.
- deleted the unused lumpconfigfile. The chance that this will ever see some use is precisely zero so there's no need keeping this code around.
- moved a few more things and deleted the unused v_pfx implementation. These were pixel format conversion routines used in the D3D backend. Nothing in here is needed anymore - the FBitmap class offers much of the functionality covered here in a far more concise and approachable manner.
- fixed DHUDMessageTypeOnFadeOut with empty messages.
- removed FCriticalSection and replaced all of its uses with std::mutex. There's really no need for a non-standard solution here anymore with C++11. This also fixes an unreleased lock in the WildMidi code.
- fixed: empty strings cannot be substituted.
- added the final missing piece of localization support, i.e. forcing text based menus. Now a localization mod can disable the graphics patches containing text entirely so that it can properly localize the text based menu variant. If this flag gets set in MAPINFO, it will override all user settings.
- reorganized the ZScript content in gzdoom.pk3 and changed the files' extensions to something unique for easier syntax highlighting.
- removed the XP warning from the CMake project. This now got even triggered in 64 bit and overall is mostly pointless, considering the extremely low user share of XP.
- moved a few parts from g_level.cpp to better fitting places.
- moved the 2D drawing code to its own directory under 'rendering'.
- made the text comparison for Dehacked case insensitive so that the contents of the string table can be properly capitalized without breaking old-style string replacements.
- fixed a warning and set NOINITCALL for a few CVARs accessing the current level. These inits are done at a time when the data isn't even initialized so they will get overwritten anyway.
- fixed: ACS must use COPY_AAPTREX for all pointer transfers. It was already correct for most, but two cases have slipped through.
- Fix stereo-3D 2D quad color problem.
- Use flag to avoid second eye stereo color problem
- removed unused gl_spritebrightfog CVAR.
- added a workaround for mods using the name CONFONT directly. In the old system it just loaded the font a second time, but with the folder based setup there is no file named CONFONT anymore so it needs to be dealt with explicitly.
- Enable menu blur in stereo 3d. Use more blitting to avoid confusing framebuffer state management in stereo 3D.
- Added a master volume setting.
- separate/group out the volume sliders, make them look slightly hierarchal in order to denote their importance
- reformat the intermission screen if the text is very long. This will ensure better visibility on widescreen displays, at least.
- Exported MusPlaying to ZScript. - Allows grabbing the currently playing song, base order, and loop properties.
- use BigUpper font for option menu captions.
- allow reading csv spreadsheets directly for language definitions.
- added a 'testfinale' CCMD, so that the layout of finale texts can be tested more easily
- Add Serbian characters for Doom, Heretic and Hexen
- added inverted exclamation and question marks wherever they could be created by rotating the regular ones.
- fixed: The lump renaming was not performed for Doom, even for those pieces where needed.
- implemented string table macros.
- French characters for Raven games Most of this is ripped from Hexen 64 with minor edits and palette conversions. Credits to Jimmy for the cedillas and BIGFONT breves!
- moved the sprite box on the player menu up a bit because this was badly overlapping with some long texts in most languages.
- let IWAD and PWAD BigFonts override BigUpper for consistency.
- fixed: cl_maxdecals did not reset the decal counter when deleting decals.
- fixed: Unmorphing a monster did not clear its UNMORPHED flag.
- fixed: FLevelLocals did not set the owner for its event manager.
- fixed: PlayerStartStomp must check for NOTELEFRAG.
- fixed: static event handlers must also receive WorldLoaded events on loading a savegame.
- output the error code when submitting a command buffer fails.
- Spanish font for Doom and Raven Also includes extra French letters (ÿ and œ) as well as a tiny fix for the Hexen smallfont ü.
- moved the 'ÿ's to the corresponding uppercase code point so that the internal substitution logic handles this properly.
- reject all DMX sounds shorter than or equal 8 bytes.
- 8 bytes is the minimum header size for DMX, so for one byte of sample data it has to be 9 bytes. This was causing access to invalid memory when trying to read the header of something too short. For other file formats this is of no concern because none has a header this short.
- fixed: in CollectWithinRadius, make pos a value variable instead of a reference. The underlying data here can be reallocated and invalidate what it points to.
- fixed: ACS's LocalAmbientSound did not check the activator before calling its methods.
- moved the weapon bobbing options from the Display Options to the HUD Options menu.
- ChexQuest 3 BIGFONT in lump format
- filter out the BIGFONT lump in Chex Quest, now that we have a more complete font internally.
- fixed incorrect flag keyword in IWADINFO.
- moved the Doom BigFonts to the Game-Doom filter, now that Chex Quest got its own font.