- Windows 64-bit
- Linux 64-bit
- macOS
- Source
This new release brings several new features:
- full internationalized fonts for all games
- enabled language options for already complete languages (DE, PT, RO)
- optional advanced weapon interpolation for Blood
- GLES backend for better low end hardware support
- enabled the text screens when quitting Duke and SW.
- update of Blood's 'modern' features to the latest version of NBlood
- Duke: Use `DeferredGameStart()` instead of `ChangeLevel()` in `cheatLevel()` to instantly warp to the targeted map, matching DOS behaviour.
- fixed bad serializers for vec2_t and vec3_t.
- Exhumed: Avoid masking bits into the sector index as well.
- Exhumed: Avoid masking sound flags into the sprite index.
- Exhumed: fixed sound origin in DoRegenerates.
- split off the extended sprite flags into their own word.
- flag sprites for automapping regardless of the 'automapping' variable's value.
- Attempt to fix music replacement definitions again. Store per-map music replacements in a TMap, and perform the replacements after parsing the MAPINFO
- do not crash on badly defined walls where the end point is missing.
- core shader override block, backported from GZDoom.
- Blood: fixed super secret notification on the level summary screen.
- Duke: fixed some incorrect cutscene playback speeds.
- SW: fixed recursive saving of panel sprites
- clear pspAsArray at the beginning of a save/load operation, not at the end.
- SW: avoid crashing when unwinding from a savegame loading error.
- Duke: fixed a few places using a sprite index where a player index is needed.
- Duke: don't process input when not in a game.
- Duke/RR: Fix clearing of weapons for RRRA E2L2 that should only be done for RR.
- Fixed bug collecting lifeleech with ignited tnt/spray
- Skip CheckProximityWall when newSectCheckMethod is set
- Blood: don't abort the INI scanner if it finds a file with resource file index 0.
- Remove early return from `GrpScan()` that was allowing addons to come through even if they weren't valid.
- Duke: Correctly mark `Duke: Alien World Tour` as a Duke add-on.
- fixed: List menus still allowed to select unselectable items with the mouse.
- Fix issues with self collision on MoveMissile()
- Add modern map kViewEffectSpotProgress support
- Blood: Fix handling of QAVs defined as loopable while interpolating.
- Blood: Implement `defineqav` DEF parser with hookup to game-side code.
- Blood: Fix teleport triggers not updating player angle
- Added new cl_bloodvanillaenemies CVAR
- Improved GetClosestSpriteSectors() detection
- Blood: removed redundant STAT_Update call in StartLevel.
- Don't trigger fall scream after player has died
- Fixed burning cultists switching type in water
- Fixed glitched burning enemy state
- Fixed burning Caleb using innocent burning sprite
- Exhumed: fixed incorrect CD tracks being played through cutscenes
- Exhumed: fixed crash when ending the game.
- call ColorMatcher.Pick instead of BestColor when remapping a voxel.
- avoid calling the node builder to triangulate degenerate sectors.
- Duke: fixed sound lists for E4 intro cutscene.
- Exhumed: fixed bad arguments of BuildGameoverScene.
- Tweaked next/prev weapon behavior underwater
- flag SW's cutscenes as 'boss death only'.
- Fix ignited spray/TNT issue when going underwater
- added means to define resource IDs in all container formats allowing long file names.
- Blood: Expose legacy 1.0 weapon handling game option as a CVAR.
- fixed detection of Steam's Duke3D on macOS
- Blood: Restore originally intended `isRunning` code that never worked behind two CVARs to offer an alternative playing experience.
- Blood: Perform interpolation of menu's blood dripping.
- validate 'nextsector' fields on walls.
- set currentLevel before calling engineLoadBoard. This is needed if the compatibility patcher needs to alter mapinfo data.
- Blood: fix potential view sprite overflows
- Blood: fix view sprites overflow in ROR code
- Blood: fix OOB issue in aiPatrolSetMarker
- Blood: fixed path validation for cutscene files.
- fixed bad operator grouping in cheat code.
- quote argument for sending cheats from the chat editor.
- fix crash issue with empty VOCs.
- Duke/RR: Call Bowling lane reset code only when playing RR.
- adapted the Zip root folder eliminator to deal with archives that do not add proper folder records to their central directory.
- adapted cheat input handler to treat spaces as '0' when entering parts of numeric fields.
- Blood: fixed parser for 'mario' cheat to treat a leading space for the level number as 0.
- Rides Again: Possible array index by -1 in Proj_DoHitscan(). Added check to prevent this.
- handle newly activated 'unused' fields properly for serialization.
- Build: Change `MAXSPRITESONSCREEN` from constant of 2560 to 1/4 of MAXSPRITES. Mods like Blood's Eviction are pushing these limits hard. Bumping the onscreen limit resolved recurring crash on `sstation.map` with no apparent ill-effects.
- Blood: Add some nullptr checks to the `aiPatrol*()` inline bools.
- Blood: Fix ammo colour for status bar and first fullscreen HUD.
- Blood: Repair some missing nullptr checks causing a crash upon reloading after dying.
- fixed initialization pf upscale state properly.
- Add leading zero to `statFPS()` output (`vid_fps`) so that the text doesn't bounce continually when alternating between 10 ms and <10 ms.
- Pass the missing fullscreen flag when creating a Vukan window.
- SW: Remove `gi->FreeGameData()` from game as its inside code wasn't freeing game data but level data already freed in `gi->FreeLevelData()`.
- Capitalise `CPART07.AR_` and `CPART15.AR_` in `ProcessOptions()`. The original files are in capitals and this is important as POSIX systems are case-sensitive. We can't cater towards every use-case but this should cover most bases.
- Duke: Ensure `gi->NextLevel()` sets the skill level upon invocation.
- Ensure `g_nextskill` is used everywhere so that setting skill for next level works properly.
- Blood: Capitalise `Blood` for 1.0 and 1.1 grpinfo definitions for consistency.
- Blood: Fixed grpinfo declarations for Blood 1.0 and 1.1 as per wildweasel on the forums: viewtopic.php?f=358&t=67220&start=45#p1149216
- Blood: Hide `Multiplayer` from the menu.
- Blood: Lock input after setting angle/horizon targets in nnexts.cpp code, then unlock in `ProcessInput()` where `resetForcedSyncInput()` is called.
- Allow ticker to lock input to player's angle and horizon without having to force use of synchronised input.
- Blood: Restore original horizon algorithm in `trPlayerCtrlSetLookAngle()` and adjust to Raze's backend input code.
- Blood: Make delirium rotscrnang smoother with use of more precision.
- Blood: Fix angle issues with NHIS.
- Blood: Add nullptr check for `actor2` in `ProcessTouchObjects()`.
- Fix menu strings and missing class declaration for `VideoOptions`.
- added 'endofgame' CCMD. Not really good yet, but it does what's needed, i.e. write out the statistics for the current session.
- Exhumed: Move key display on `DrawHUD2()` to accommodate larger ammo display for M60 with `cl_showmagamt 1` from 2a8e636066f475681c504dee98662fc04c8e0e3f.
- Exhumed: Extend 7b8dcde5d24ef60b03b0067fc530d5f65b5da00c by showing the M60's clip/magazine amount available when `cl_showmagamt 1` is set.
- Exhumed: Move pistol clip/magazine recalculation code that was added in 593bbe10efc429d9615aebce0c38cb0aba03092f from `FillWeapons()` to `CheckClip()`.
- Exhumed: Change M60's clip/magazine capacity from 99 to 100 to better match the max ammo capacity of the weapon. This does not increase the player's available ammunition.
- Exhumed: Make `FillWeapons()` fill the ammo count to the maximum allowed by the game for all weapons (300).
- allow palette emulation for indexed hightiles.
- support for indexed hightiles.
- Allow CON-based games to have multiplayer episodes filtered from menu.
- Exhumed: Ensure `FillWeapons()` recalculates the pistol clip amount after filling.
- Exhumed: Make use of `cl_showmagamt`.
- relaxed consistency checks for VOC files. Rampage Warrior contains a few sounds that failed validation so this check does not exist in the original 3D Realms sound code.
- Blood: fixed order of initialization for voxels. Just like Shadow Warrior it needs to load its voxel table before .def files.
- fixed texture lookup for hightile lookup. Not all commands had the proper flags to also look in the root folder.
- SW: Create inline function `pspPresentRetractScale()` to scale the rate at which weapons present and retract based on the current tile's height vs. the original asset's height.
- fixed crash when parsing malformed .def file
- Remove some remains of Redneck Deer Huntin'.
- Use `isWW2GI()` in more places.
- Use `isNamWW2GI()` in more places.
- Use `isRR()` in more places.
- Use the new `isSWALL()` wrapper everywhere.
- SW: Set default skill level to match original release and what the manual says is default.
- SW: Ensure `PANEL_SPRITEstruct`'s `ox`/`oy` values are in the save data.
- SW: Declare and initialise variables in `pWeaponBob()` vs declaring and initialising later on to reduce warnings about variables being uninitialised.
- Optimise `fFindDistance2D()` to multiply by inverse rather than divide by a constant.
- SW: Rename `cl_smoothsway` to `cl_swsmoothsway` and enable by default
- SW: Factor out bob coordinate backups.
- SW: Factor out panel interpolation backups;
- SW: Factor out repeated panel coordinate math into inline functions.
- SW: Remove fixed-point math from panel x/y coordinate updating.
- allow external replacements of SW's 3D Realms logo to use their own palette.
- disable texture name truncation for textures/ directory.
- don't attempt to decode animation frames at offsets beyond the end of the current page.
- SW: Promote `PANEL_SPRITEstruct`'s `xorig`/`yorig` values from int to double to match `x`/`ox` and `y`/`oy` respectively.
- zero-terminate the buffer for reading Blood's INI files.
- dynamically adjust SW's menu spacing based on language.