Releases: githubawn/GeneralsGameCode
Releases · githubawn/GeneralsGameCode
weekly-2026-04-17
Changelog
- unify(ww3d2): Move dx8wrapper, dx8caps to Core (TheSuperHackers#2599)
- fix(view): Improve setup of default camera pitch and angle (TheSuperHackers#2546)
- fix(ini): Support plus sign prefix in INI integer parse (TheSuperHackers#2576)
- fix(ini): Replace unsafe uses of INI::getNextTokenOrNull (TheSuperHackers#2593)
- bugfix(audiomanager): Fix dummy audio manager implementation for failing audio length script conditions in headless mode (TheSuperHackers#2313)
- bugfix(money): Fix undefined behavior for starting cash combo box (TheSuperHackers#2582)
- bugfix(view): Prevent overshooting camera zooming or pivoting on low frame rates (TheSuperHackers#2588)
- bugfix(view): Fix malformed camera area constraints during cutscenes (TheSuperHackers#2587)
- fix(pathfinder): Fix CRC computation of PathFinder::m_wallPieces (TheSuperHackers#2575)
- bugfix(energy): Don't apply power production bonus for disabled power plants on save game load (TheSuperHackers#2509)
- bugfix(energy): Don't increase power production for disabled power plants on save game load (TheSuperHackers#2508)
- bugfix(input): Use time-based double tap for unit group centering (TheSuperHackers#2545)
- refactor: Add override keyword to virtual function overrides in Tools and set compile option -Wsuggest-override (TheSuperHackers#2394)
- unify(ww3d2): Merge dx8wrapper, dx8caps, shdlib (TheSuperHackers#2499)
weekly-2026-04-10
Changelog
- fix(view): Introduce PRESERVE_RETAIL_SCRIPTED_CAMERA and fix or improve camera offset and zoom calculations (TheSuperHackers#2524)
- bugfix(dx8): Improve display mode transition reliability (TheSuperHackers#2539)
- ci: Disable vcpkg build (TheSuperHackers#2544)
- fix: Resolve macro redefinition warnings (TheSuperHackers#2525)
- refactor(ini): Simplify some INI code (TheSuperHackers#2541)
- tweak(radar): Suppress under attack radar notification spam (TheSuperHackers#2540)
- bugfix(treebuffer): Fix crash in W3DTreeBuffer::updateVertexBuffer() (TheSuperHackers#2526)
- fix(actionmanager): Improve validation of Sneak Attack placement legality (TheSuperHackers#2533)
- fix(skirmish): Improve determinism for restarted games by resetting slot values (TheSuperHackers#2373)
- perf(ini): Improve INI parsing performance by using std::from_chars (TheSuperHackers#2532)
- fix(targa): Fix TGA2 footer signature truncation by using strncpy (TheSuperHackers#2527)
- refactor(ini): Clean up INI type table and its search logic (TheSuperHackers#2511)
- fix(connection): Implement file content validation for map transfers (TheSuperHackers#1819)
- fix(refcount): Fix compile warning in constructors of RefCountClass (TheSuperHackers#2521)
- refactor: Remove string conversion code for MessageBox (TheSuperHackers#2523)
weekly-2026-04-03
Changelog
- refactor: Remove superfluous extern keyword from variable declarations (TheSuperHackers#2522)
- refactor(view): Remove friends from ViewLocation class (TheSuperHackers#2516)
- bugfix(object): Guard GameLogic xfer version bump with RETAIL_COMPATIBLE_XFER_SAVE (TheSuperHackers#2418)
- refactor(ww3d2): Simplify dx8wrapper's frame statistics with struct (TheSuperHackers#2507)
- refactor(object): Replace explicit local player checks with Object::isLocallyControlled (TheSuperHackers#2512)
- chore: Remove unused code in dx8wrapper (TheSuperHackers#2504)
- chore: Remove all code related to _XBOX (TheSuperHackers#2505)
- bugfix(view): Fix and improve camera pivoting (TheSuperHackers#2506)
- bugfix(view): Fix and improve camera area constraints behavior (TheSuperHackers#2506)
- bugfix(smudge): Decouple smudge time step from render update (TheSuperHackers#2484)
- bugfix(contain): Restore retail compatibility after crash fix in OpenContain::killAllContained (TheSuperHackers#2439)
- bugfix(contain): Restore retail compatibility after crash fix in OpenContain::processDamageToContained (TheSuperHackers#2427)
- fix(smudge): Align smudges Y offset range with X offset range (TheSuperHackers#2498)
- bugfix(globaldata): Fix the handling of documents folder redirection by using SHGetKnownFolderPath() (TheSuperHackers#2479)
- refactor: Add override keyword to virtual function overrides in GameEngineDevice (TheSuperHackers#2393)
- refactor: Add override keyword to virtual function overrides in Libraries (TheSuperHackers#2390)
weekly-2026-03-27
Changelog
- fix(headless): Set DX8Wrapper_IsWindowed to false to suppress assertion dialogs during shutdown (TheSuperHackers#2298)
- bugfix(logic): Fix broken camera edge scroll after loading a savegame from the ingame menu (TheSuperHackers#2000)
- bugfix(pathfinder): Improve initialization of uninitialized variable in Pathfinder::classifyFence (TheSuperHackers#2460)
- fix(logic): Add nullptr check to msgPlayer in GameLogic::logicMessageDispatcher (TheSuperHackers#2383)
- refactor(logic): Rename thisPlayer to msgPlayer in GameLogic::logicMessageDispatcher (TheSuperHackers#2383)
- fix(smudge): Fix minor errors in W3DSmudge (TheSuperHackers#2483)
- tweak(gui): Enable minimize button for game app window (TheSuperHackers#2473)
- bugfix(battleplan): Battle plans are now transferred to the new owner on capture (TheSuperHackers#2257)
- bugfix(battleplan): Multiple battle plans are now always applied correctly (TheSuperHackers#2256)
- chore: Remove debug code for KRIS_BRUTAL_HACK_FOR_AIRCRAFT_CARRIER_DEBUGGING (TheSuperHackers#2478)
- perf(pathfinder): Implement conditional reverse insertion sorting algorithm to reduce cost of long pathfinding by 50-66% (TheSuperHackers#2450)
- fix(pathfinder): Remove invalid retail compatible compilation conditional (TheSuperHackers#2477)
- refactor(bitflags): Simplify functions in BitFlags class (TheSuperHackers#2472)
- refactor(bitflags): Simplify conditions with testForAny, testForAll and remove unexpected assert in BitFlags::testForAll (TheSuperHackers#2476)
- feat(headless): Implement ParticleSystemManagerDummy (TheSuperHackers#2247)
- feat(headless): Implement ViewDummy (TheSuperHackers#2246)
- feat(headless): Implement GhostObjectManagerDummy (TheSuperHackers#2244)
weekly-2026-03-20
Changelog
- feat(rendering): Add support for multi sample anti-aliasing (MSAA) (TheSuperHackers#2454)
- ci(actions): Update GitHub Actions to latest versions and fixed hashes (TheSuperHackers#2377)
- feat(texturefilter): Extend texture filter with new filtering modes; none, point, bilinear, trilinear, anisotropic (TheSuperHackers#2423)
- chore(texturefilter): Cleanup code formatting and remove commented blocks (TheSuperHackers#2423)
- refactor: Add override keyword to virtual function overrides in GameEngine (2) (TheSuperHackers#2392)
- fix(docker): Fix docker WORKDIR ownership (TheSuperHackers#2459)
- bugfix(contain): Occupants killed by their containers now kill their occupants (TheSuperHackers#2239)
- fix(logic): Improve validation of MSG_SET_RALLY_POINT in GameLogicDispatch (TheSuperHackers#2441)
- fix(logic): Improve validation of MSG_NEW_GAME in GameLogicDispatch (TheSuperHackers#2440)
- fix(logic): Improve handling of ENABLE_RETALIATION_MODE in GameLogicDispatch (TheSuperHackers#2408)
- fix(logic): Improve validation of MSG_DO_SPECIAL_POWER and variants in GameLogicDispatch (TheSuperHackers#2380)
weekly-2026-03-16
Changelog
- Replicated in Generals.
- Changed 'thisPlayer' to 'msgPlayer'.
- Removed two more instances of 'msg->getPlayerIndex'.
- refactor(random): Simplify code in RandomValue (TheSuperHackers#2370)
- unify(pathfinder): Merge PathfindLayer::doDebugIcons(), Pathfinder::Classify functions, Pathfinder::checkDestination() and Pathfinder::checkForMovement() (TheSuperHackers#2414)
- bugfix(heightmap): Fix zagged shapes on steep diagonal terrain (TheSuperHackers#2406)
- refactor(view): Split contents of W3DView::buildCameraTransform(), W3DView::calcCameraAreaConstraints() (TheSuperHackers#2403)
- bugfix(gunship): Select Spectre Gunship only on the client that controls the unit (TheSuperHackers#2402)
- bugfix(ai): Reset jet locomotor to normal when attack locomotor timer expires (TheSuperHackers#2397)
- build(cmake): Append RTS_BUILD_OUTPUT_SUFFIX to installable targets (TheSuperHackers#2378)
- unify(pathfinder): Merge PathfindZoneManager() (TheSuperHackers#2404)
- chore(pathfinder): Remove unused forced refresh calling in PathfindZoneManager::calculateZones() (TheSuperHackers#2404)
- refactor: Add compatibility macros for override and final keywords and rename conflicting identifiers (TheSuperHackers#2389)
- refactor(random): Reorder RandomValue function definitions (2) (TheSuperHackers#2405)
- refactor(dozeraiupdate): Streamline dozer task cancellation logic (TheSuperHackers#2387)
- refactor(random): Reorder RandomValue function definitions (TheSuperHackers#2384)
- feat: Implement math CRC calculation utility for logic mismatch detection purposes (TheSuperHackers#2100)
- bugfix(pathfinder): Fix uninitialized variable in Pathfinder::tightenPathCallback to prevent mismatches (TheSuperHackers#2309)
- unify(pathfinder): Remove unused argument from PathfindZoneManager::markZonesDirty() (TheSuperHackers#2381)
- unify(pathfinder): Merge PathfindCell class from Zero Hour (TheSuperHackers#2381)
- unify(pathfinder): Merge CellTypes and CELL_BRIDGE_IMPASSABLE code from Zero Hour (TheSuperHackers#2381)
- unify(pathfinder): Merge PathfindCell::setTypeAsObstacle() and PathfindCell::removeObstacle() from Zero Hour (TheSuperHackers#2381)
- chore(pathfinder): Remove legacy Pathfind debug code from Generals (TheSuperHackers#2381)
- bugfix(radar): Fix incorrect 2D distance calculation in Radar::tryEvent (TheSuperHackers#2368)
- refactor(battleplan): Split data off of BattlePlanBonuses class (TheSuperHackers#2335)
- bugfix(audio): Fix range volume fade of 3D sounds and make it configurable in AudioSettings.ini (TheSuperHackers#2369)
- fix(view): Implement state for user controlled camera to properly distinguish between scripted and user camera (TheSuperHackers#2363)
- fix(network): Move TransportMessageHeader to before it is used in NetworkDefs.h (TheSuperHackers#2382)
- Changed 'msg->getPlayerIndex' to 'thisPlayer->getPlayerIndex'.
- Removed redundant player pointer checks.
- Added check on 'thisPlayer'.
- ci(vcpkg): Fix recurring binary cache invalidation from runner image updates (TheSuperHackers#2371)
weekly-2026-03-11
Changelog
- performance(d3d): enable PUREDEVICE and hardware vertex processing
- Added isquitmenuvisible as check
- added comment and removed blank link
- added tryStartNewGame to avoid long catch
- refine graceful exit logic and apply suggestions
- Apply suggestion from @greptile-apps[bot]
- refactor: Remove redundant void argument from functions (TheSuperHackers#2345)
- refactor: Simplify unconditional asserts from DEBUG_ASSERTCRASH to DEBUG_CRASH (TheSuperHackers#2343)
- refactor(preferences): Move OptionPreferences class into separate files (TheSuperHackers#1840)
- Implemented feedback
- Backport graceful exit logic from GeneralsMD
- refactor(language): Cleanup GlobalLanguage code and add function GlobalLanguage::getResolutionFontSizeScale() (TheSuperHackers#2338)
- Implement graceful exit during loading and movie screens
- Implement graceful exit for Alt+F4 and window close events
weekly-2026-03-02
Changelog
- feat: Add Anti-Aliasing and Anisotropic Filtering support to options.ini
- unify(pathfinder): Merge local variable optimizations in PathfindZoneManager::calculateZones() from Zero Hour (TheSuperHackers#2367)
- fix(pathfinder): Add missing logical block for zone type optimization in PathfindZoneManager::calculateZones() (TheSuperHackers#2360)
- chore(pathfinder): Remove register variable and use member variable directly in PathfindZoneManager::calculateZones() (TheSuperHackers#2360)
- chore(pathfinder): Change while loops to for loops in PathfindZoneManager::calculateZones() (TheSuperHackers#2360)
- chore(pathfinder): Change open braces to be K&R style in PathfindZoneManager::calculateZones() (TheSuperHackers#2360)
- chore(pathfinder): Change leading spaces to leading tabs in PathfindZoneManager:calculateZones() (TheSuperHackers#2360)
- tweak(menu): Show mouse and menu immediately when shellmap is disabled (TheSuperHackers#2356)
- fix(logic): Fix potential null pointer deferences in GameLogicDispatch (TheSuperHackers#2354)
- tweak(random): Replace InitGameLogicRandom with InitRandom for consistent client and audio seeds (TheSuperHackers#2339)
- bugfix(audio): Fix particle cannon being inaudible after saveload (TheSuperHackers#2302)
- fix(headless): Use ParticleSystemManager update instead of reset in headless replay (TheSuperHackers#2219)
- refactor(view): Change scripted state booleans to enum flags in W3DView (TheSuperHackers#2357)
- bugfix(partition): Fix inconsistent mine collision behaviour (TheSuperHackers#2208)
weekly-2026-03-01
Changelog
- simplify
- Add benchmark results for SAGE MSAA CopyRects
- Delete benchmark/benchmark_out_ascii.txt
- saved file as UTF-8 instead of UTF-16LE
- wip: fix for Microwave blackout on forced AA
- tweak(menu): Show mouse and menu immediately when shellmap is disabled (TheSuperHackers#2356)
- fix(logic): Fix potential null pointer deferences in GameLogicDispatch (TheSuperHackers#2354)
- tweak(random): Replace InitGameLogicRandom with InitRandom for consistent client and audio seeds (TheSuperHackers#2339)
- bugfix(audio): Fix particle cannon being inaudible after saveload (TheSuperHackers#2302)
- fix(headless): Use ParticleSystemManager update instead of reset in headless replay (TheSuperHackers#2219)
- refactor(view): Change scripted state booleans to enum flags in W3DView (TheSuperHackers#2357)
- bugfix(partition): Fix inconsistent mine collision behaviour (TheSuperHackers#2208)
weekly-2026-02-28
Changelog
- wip: fix for Microwave blackout on forced AA
- tweak(menu): Show mouse and menu immediately when shellmap is disabled (TheSuperHackers#2356)
- fix(logic): Fix potential null pointer deferences in GameLogicDispatch (TheSuperHackers#2354)
- tweak(random): Replace InitGameLogicRandom with InitRandom for consistent client and audio seeds (TheSuperHackers#2339)
- bugfix(audio): Fix particle cannon being inaudible after saveload (TheSuperHackers#2302)
- fix(headless): Use ParticleSystemManager update instead of reset in headless replay (TheSuperHackers#2219)
- refactor(view): Change scripted state booleans to enum flags in W3DView (TheSuperHackers#2357)
- bugfix(partition): Fix inconsistent mine collision behaviour (TheSuperHackers#2208)
- refactor(view): Simplify code to set location for Replay Camera (TheSuperHackers#2353)
- fix(view): Call View::forceRedraw() instead of doing tricks to refresh the camera normally (TheSuperHackers#2352)
- refactor(lookat): Simplify pitch, fov, zoom logic in LookAtTranslator (TheSuperHackers#2351)
- fix(object): Save and load game object list in correct order (TheSuperHackers#2161)
- bugfix(registry): Prioritize HKEY_CURRENT_USER registry reads and writes over HKEY_LOCAL_MACHINE to prevent inaccessible data (TheSuperHackers#1844)
- refactor: Remove redundant void argument from functions (TheSuperHackers#2345)
- refactor: Simplify unconditional asserts from DEBUG_ASSERTCRASH to DEBUG_CRASH (TheSuperHackers#2343)
- refactor(preferences): Move OptionPreferences class into separate files (TheSuperHackers#1840)
- refactor(language): Cleanup GlobalLanguage code and add function GlobalLanguage::getResolutionFontSizeScale() (TheSuperHackers#2338)