Releases: TheSuperHackers/GeneralsGameCode
Releases · TheSuperHackers/GeneralsGameCode
weekly-2026-04-17
Changelog
- unify(ww3d2): Merge dx8renderer, dx8rendererdebugger (#2600)
- fix: Fix assertion format argument for non-trivial types (#2606)
- refactor(ini): Simplify token related INI code (#2596)
- refactor(recorder): Remove code duplications related to file write and logging in RecorderClass (#2543)
- bugfix(dumbprojectile): Fix in-flight DumbProjectile detonating instantly on save load (#2591)
- bugfix(input): Fix touchpad upward scrolling in UI list boxes (#2586)
- unify(ww3d2): Move dx8wrapper, dx8caps to Core (#2599)
- fix(view): Improve setup of default camera pitch and angle (#2546)
- fix(ini): Support plus sign prefix in INI integer parse (#2576)
- fix(ini): Replace unsafe uses of INI::getNextTokenOrNull (#2593)
- bugfix(audiomanager): Fix dummy audio manager implementation for failing audio length script conditions in headless mode (#2313)
- bugfix(money): Fix undefined behavior for starting cash combo box (#2582)
- bugfix(view): Prevent overshooting camera zooming or pivoting on low frame rates (#2588)
- bugfix(view): Fix malformed camera area constraints during cutscenes (#2587)
- fix(pathfinder): Fix CRC computation of PathFinder::m_wallPieces (#2575)
- bugfix(energy): Don't apply power production bonus for disabled power plants on save game load (#2509)
- bugfix(energy): Don't increase power production for disabled power plants on save game load (#2508)
- bugfix(input): Use time-based double tap for unit group centering (#2545)
- refactor: Add override keyword to virtual function overrides in Tools and set compile option -Wsuggest-override (#2394)
- unify(ww3d2): Merge dx8wrapper, dx8caps, shdlib (#2499)
weekly-2026-04-10
Changelog
- fix(view): Introduce PRESERVE_RETAIL_SCRIPTED_CAMERA and fix or improve camera offset and zoom calculations (#2524)
- bugfix(dx8): Improve display mode transition reliability (#2539)
- ci: Disable vcpkg build (#2544)
- fix: Resolve macro redefinition warnings (#2525)
- refactor(ini): Simplify some INI code (#2541)
- tweak(radar): Suppress under attack radar notification spam (#2540)
- bugfix(treebuffer): Fix crash in W3DTreeBuffer::updateVertexBuffer() (#2526)
- fix(actionmanager): Improve validation of Sneak Attack placement legality (#2533)
- fix(skirmish): Improve determinism for restarted games by resetting slot values (#2373)
- perf(ini): Improve INI parsing performance by using std::from_chars (#2532)
- fix(targa): Fix TGA2 footer signature truncation by using strncpy (#2527)
- refactor(ini): Clean up INI type table and its search logic (#2511)
- fix(connection): Implement file content validation for map transfers (#1819)
weekly-2026-04-03
Changelog
- fix(refcount): Fix compile warning in constructors of RefCountClass (#2521)
- refactor: Remove string conversion code for MessageBox (#2523)
- refactor: Remove superfluous extern keyword from variable declarations (#2522)
- refactor(view): Remove friends from ViewLocation class (#2516)
- bugfix(object): Guard GameLogic xfer version bump with RETAIL_COMPATIBLE_XFER_SAVE (#2418)
- refactor(ww3d2): Simplify dx8wrapper's frame statistics with struct (#2507)
- refactor(object): Replace explicit local player checks with Object::isLocallyControlled (#2512)
- chore: Remove unused code in dx8wrapper (#2504)
- chore: Remove all code related to _XBOX (#2505)
- bugfix(view): Fix and improve camera pivoting (#2506)
- bugfix(view): Fix and improve camera area constraints behavior (#2506)
- bugfix(smudge): Decouple smudge time step from render update (#2484)
- bugfix(contain): Restore retail compatibility after crash fix in OpenContain::killAllContained (#2439)
- bugfix(contain): Restore retail compatibility after crash fix in OpenContain::processDamageToContained (#2427)
- fix(smudge): Align smudges Y offset range with X offset range (#2498)
- bugfix(globaldata): Fix the handling of documents folder redirection by using SHGetKnownFolderPath() (#2479)
weekly-2026-03-27
Changelog
- refactor: Add override keyword to virtual function overrides in GameEngineDevice (#2393)
- refactor: Add override keyword to virtual function overrides in Libraries (#2390)
- fix(headless): Set DX8Wrapper_IsWindowed to false to suppress assertion dialogs during shutdown (#2298)
- bugfix(logic): Fix broken camera edge scroll after loading a savegame from the ingame menu (#2000)
- bugfix(pathfinder): Improve initialization of uninitialized variable in Pathfinder::classifyFence (#2460)
- fix(logic): Add nullptr check to msgPlayer in GameLogic::logicMessageDispatcher (#2383)
- refactor(logic): Rename thisPlayer to msgPlayer in GameLogic::logicMessageDispatcher (#2383)
- fix(smudge): Fix minor errors in W3DSmudge (#2483)
- tweak(gui): Enable minimize button for game app window (#2473)
- bugfix(battleplan): Battle plans are now transferred to the new owner on capture (#2257)
- bugfix(battleplan): Multiple battle plans are now always applied correctly (#2256)
- chore: Remove debug code for KRIS_BRUTAL_HACK_FOR_AIRCRAFT_CARRIER_DEBUGGING (#2478)
- perf(pathfinder): Implement conditional reverse insertion sorting algorithm to reduce cost of long pathfinding by 50-66% (#2450)
- fix(pathfinder): Remove invalid retail compatible compilation conditional (#2477)
- refactor(bitflags): Simplify functions in BitFlags class (#2472)
- refactor(bitflags): Simplify conditions with testForAny, testForAll and remove unexpected assert in BitFlags::testForAll (#2476)
weekly-2026-03-20
Changelog
- feat(headless): Implement ParticleSystemManagerDummy (#2247)
- feat(headless): Implement ViewDummy (#2246)
- feat(headless): Implement GhostObjectManagerDummy (#2244)
- feat(rendering): Add support for multi sample anti-aliasing (MSAA) (#2454)
- ci(actions): Update GitHub Actions to latest versions and fixed hashes (#2377)
- feat(texturefilter): Extend texture filter with new filtering modes; none, point, bilinear, trilinear, anisotropic (#2423)
- chore(texturefilter): Cleanup code formatting and remove commented blocks (#2423)
- refactor: Add override keyword to virtual function overrides in GameEngine (2) (#2392)
- fix(docker): Fix docker WORKDIR ownership (#2459)
- bugfix(contain): Occupants killed by their containers now kill their occupants (#2239)
- fix(logic): Improve validation of MSG_SET_RALLY_POINT in GameLogicDispatch (#2441)
- fix(logic): Improve validation of MSG_NEW_GAME in GameLogicDispatch (#2440)
- fix(logic): Improve handling of ENABLE_RETALIATION_MODE in GameLogicDispatch (#2408)
- fix(logic): Improve validation of MSG_DO_SPECIAL_POWER and variants in GameLogicDispatch (#2380)
- bugfix(rallypoint): Make healed units follow building rally point on exit (#1822)
- bugfix(supply): Implement proportional supply bonus scaling to fix too generous money deposits for partial supply drops (#2431)
- bugfix(smudge): Fix Microwave Heat Haze blackout on forced AA (#2374)
- refactor: Add override keyword to virtual function overrides in GameEngine (#2391)
- unify(logic): Merge game loading related variables and functions from Zero Hour (#2444)
weekly-2026-03-13
Changelog
- fix(pathfinder): Implement robust forward insertion sort for PathfindCell::putOnSortedOpenList() (#2432)
- refactor(netpacket): Simplify NetPacket functions for packet buffer writes and size tests (#2329)
- refactor(netcommandmsg): Rename NetCommandMsg::getPackedByteCount to NetCommandMsg::getSizeForNetPacket (#2329)
- refactor(netcommandmsg): Simplify net messages NetAckBothCommandMsg, NetAckStage1CommandMsg, NetAckStage2CommandMsg (#2329)
- chore(network): Add new NetAckCommandMsg (#2329)
- fix(network): Fix constness around NetCommandMsg (#2329)
- bugfix(namekey): Remove hardcoded NameKeyIDs from dummy strings to work with modded files (#2349)
- ci(validate): Update PR validation workflow and valid tags (#2426)
- unify(pathfinder): Move AIPathfind.h and AIPathfind.cpp to Core (#2428)
- chore(replays): Update GeneralsReplays reference to latest (#2424)
- fix(lookat): Fix mouse anchor and direction issue for camera pitch (#2421)
- bugfix(audio): Decouple Particle Cannon audio spawn point from visual beam to restore correct position and fix quiet beam audio (#2415)
- unify(pathfinder): Merge Pathfinder::moveAllies and Pathfinder::findAttackPath from Zero Hour (#2341)
- unify(pathfinder): Merge Pathfinder::moveAlliesDestinationCallback, ::processHierarchicalCell, ::findClosestPath, ::updateGoal (#2341)
- unify(pathfinder): Merge Pathfinder::checkForPossible(), ::processPathfindQueue(), ::examineNeighboringCells(), ::buildHierarchicalPath() (#2341)
- unify(pathfinder): Merge Pathfinder::clientSafeQuickDoesPathExist() and Pathfinder::clientSafeQuickDoesPathExistForUI() from Zero Hour (#2341)
- refactor(random): Simplify code in RandomValue (#2370)
- unify(pathfinder): Merge PathfindLayer::doDebugIcons(), Pathfinder::Classify functions, Pathfinder::checkDestination() and Pathfinder::checkForMovement() (#2414)
weekly-2026-03-06
Changelog
- bugfix(heightmap): Fix zagged shapes on steep diagonal terrain (#2406)
- refactor(view): Split contents of W3DView::buildCameraTransform(), W3DView::calcCameraAreaConstraints() (#2403)
- bugfix(gunship): Select Spectre Gunship only on the client that controls the unit (#2402)
- bugfix(ai): Reset jet locomotor to normal when attack locomotor timer expires (#2397)
- build(cmake): Append RTS_BUILD_OUTPUT_SUFFIX to installable targets (#2378)
- unify(pathfinder): Merge PathfindZoneManager() (#2404)
- chore(pathfinder): Remove unused forced refresh calling in PathfindZoneManager::calculateZones() (#2404)
- refactor: Add compatibility macros for override and final keywords and rename conflicting identifiers (#2389)
- refactor(random): Reorder RandomValue function definitions (2) (#2405)
- refactor(dozeraiupdate): Streamline dozer task cancellation logic (#2387)
- refactor(random): Reorder RandomValue function definitions (#2384)
- feat: Implement math CRC calculation utility for logic mismatch detection purposes (#2100)
- bugfix(pathfinder): Fix uninitialized variable in Pathfinder::tightenPathCallback to prevent mismatches (#2309)
- unify(pathfinder): Remove unused argument from PathfindZoneManager::markZonesDirty() (#2381)
- unify(pathfinder): Merge PathfindCell class from Zero Hour (#2381)
- unify(pathfinder): Merge CellTypes and CELL_BRIDGE_IMPASSABLE code from Zero Hour (#2381)
- unify(pathfinder): Merge PathfindCell::setTypeAsObstacle() and PathfindCell::removeObstacle() from Zero Hour (#2381)
- chore(pathfinder): Remove legacy Pathfind debug code from Generals (#2381)
- bugfix(radar): Fix incorrect 2D distance calculation in Radar::tryEvent (#2368)
- refactor(battleplan): Split data off of BattlePlanBonuses class (#2335)
- bugfix(audio): Fix range volume fade of 3D sounds and make it configurable in AudioSettings.ini (#2369)
- fix(view): Implement state for user controlled camera to properly distinguish between scripted and user camera (#2363)
- fix(network): Move TransportMessageHeader to before it is used in NetworkDefs.h (#2382)
- ci(vcpkg): Fix recurring binary cache invalidation from runner image updates (#2371)
- unify(pathfinder): Merge local variable optimizations in PathfindZoneManager::calculateZones() from Zero Hour (#2367)
- fix(pathfinder): Add missing logical block for zone type optimization in PathfindZoneManager::calculateZones() (#2360)
- chore(pathfinder): Remove register variable and use member variable directly in PathfindZoneManager::calculateZones() (#2360)
- chore(pathfinder): Change while loops to for loops in PathfindZoneManager::calculateZones() (#2360)
- chore(pathfinder): Change open braces to be K&R style in PathfindZoneManager::calculateZones() (#2360)
- chore(pathfinder): Change leading spaces to leading tabs in PathfindZoneManager:calculateZones() (#2360)
- tweak(menu): Show mouse and menu immediately when shellmap is disabled (#2356)
- fix(logic): Fix potential null pointer deferences in GameLogicDispatch (#2354)
- tweak(random): Replace InitGameLogicRandom with InitRandom for consistent client and audio seeds (#2339)
- bugfix(audio): Fix particle cannon being inaudible after saveload (#2302)
- fix(headless): Use ParticleSystemManager update instead of reset in headless replay (#2219)
- refactor(view): Change scripted state booleans to enum flags in W3DView (#2357)
- bugfix(partition): Fix inconsistent mine collision behaviour (#2208)
weekly-2026-02-27
Changelog
- refactor(view): Simplify code to set location for Replay Camera (#2353)
- fix(view): Call View::forceRedraw() instead of doing tricks to refresh the camera normally (#2352)
- refactor(lookat): Simplify pitch, fov, zoom logic in LookAtTranslator (#2351)
- fix(object): Save and load game object list in correct order (#2161)
- bugfix(registry): Prioritize HKEY_CURRENT_USER registry reads and writes over HKEY_LOCAL_MACHINE to prevent inaccessible data (#1844)
- refactor: Remove redundant void argument from functions (#2345)
- refactor: Simplify unconditional asserts from DEBUG_ASSERTCRASH to DEBUG_CRASH (#2343)
- refactor(preferences): Move OptionPreferences class into separate files (#1840)
- refactor(language): Cleanup GlobalLanguage code and add function GlobalLanguage::getResolutionFontSizeScale() (#2338)
- bugfix(skirmish): Prevent mismatch in Replay playback by restoring correct game seed after restarting a Skirmish game (#2270)
- refactor(pathfinder): Remove unused function Pathfinder::pathDestination() (#2308)
- unify(client): Move several GameClient files to Core (#2337)
- unify(client): Merge DisplayString, GameText, GlobalLanguage, SelectionInfo code (#2337)
- bugfix(player): Fix rounding inaccuracies with money awarded by Cash Bounty (#2330)
- bugfix(behavior): Prevent fallen Angry Mob members from respawning at the Barracks after loading a save (#2314)
- refactor(pathfinder): Cleanup retail compatible insertion sort code (#2331)
- refactor(pathfinder): Implement PathfindCellList class for the pathfindcell closedList (#2327)
- refactor(pathfinder): Implement PathfindCellList class for the pathfindcell openList (#2327)
- bugfix(victory): Save victory status to prevent early exits from resulting in defeat in network matches (#2292)
- fix(netpacket): Fix incorrect improbable return value in NetPacket::GetBufferSizeNeededForCommand() (#2328)
- unify(gui): Move several GUI related files to Core (#2332)
- unify(loadscreen): Merge LoadScreen and related code (#2332)
- fix(loadscreen): Fix missing pointer initialization in constructors of MultiPlayerLoadScreen, GameSpyLoadScreen and remove superfluous code from destructors of LoadScreen classes (#2332)
- unify(mouse): Move Mouse, Keyboard files to Core (#2334)
- unify(mouse): Merge Mouse, Keyboard code (#2334)
weekly-2026-02-20
Changelog
- bugfix(battleplanupdate): Prevent using the Bombardment Cannon while switching Battle Plans (#2324)
- bugfix(behavior): Only detonate Bunker Busters if the missile reaches its destination (#2321)
- tweak(commandline): Skip intro logo with -quickstart and enable -nologo, -noShellAnim in Release builds (#2266)
- bugfix(radar): Show Hero Radar icons in Containers and Tunnels again (#2189)
- fix(connection): Fix unsafe Player ID usage in ConnectionManager, DisconnectManager (#2305)
- bugfix(particlesys): Restore Particle System IDs on save load before registering to ParticleSystemManager (#2316)
- bugfix(worldbuilder): Fix incorrect access of empty list in ObjectOptions::_FindOrDont() (#2306)
- tweak: Put fixes that do affect gameplay behind PRESERVE_RETAIL_BEHAVIOR (#2319)
- build: Fix compile error when building without RETAIL_COMPATIBLE_CRC (#2318)
- bugfix(worldbuilder): Fix optimized trees not being shown in object placer preview window (#2312)
- bugfix(worldbuilder): Fix uncaught carriage return in CommandButton name when parsing from INI (#2300)
- feat(cratecollide): Add INI option to allow a crate to be picked up multiple times in one frame (#2297)
- build(docker): Add Linux LSP support by fixing compile_commands.json paths (#2303)
- tweak(worldbuilder): Remove EULA code and data (#2307)
- fix(netpacket): Fix undefined behavior with NetPacket buffer writes (#2304)
- bugfix(network): Increase message buffer and max packet sizes to reduce connection issues (#2277)
- bugfix: Remove superfluous CD checks and related code (#2261)
- refactor(netpacket): Simplify initialization of net packet field types (#2288)
- refactor(netpacket): Streamline order of net packet fields (#2288)
- fix(draw): Recover tread debris effects for W3DTankTruckDraw (#2251)
- refactor(draw): Rename emitters functions in W3DTankDraw, W3DTankTruckDraw, W3DTruckDraw (#2251)
- bugfix(worldbuilder): Fix script condition selection when editing newly created condition (#2289)
weekly-2026-02-13
Changelog
- bugfix(view): Recalculate camera area constraints when toggling Control Bar or changing Pitch, FOV (#2291)
- chore(gui): Implement function GadgetTextEntrySetMaxLen() (#2290)
- bugfix(contain): Prevent undefined behaviour when a dead unit enters a container (#2258)
- bugfix(ocl): Fix uninitialized variable in ObjectCreationList to avoid mismatches (#2096)
- bugfix(projectile): Fix out-of-bounds access in DumbProjectile which causes mismatch with very high speed weapons at small hit distances (#2087)
- bugfix(pathfinder): Fix uninitialized variable in Pathfinder::classifyFence() and possible source of mismatches in Retail-compatible builds (#1748)
- fix(netpacket): Protect text length value from overflowing in NetPacketChatCommand, NetPacketDisconnectChatCommand (#2284)
- fix(netcommandmsg): Fix new/delete mismatch in NetWrapperCommandMsg (#2287)
- refactor(netpacket): Use more consistent names for packed net packet structs (#2283)
- refactor(netpacket): Remove duplicate packed commands and cleanup code comments (#2283)
- fix(comments): Use 2026 for this year's code comments (#2285)
- perf(view): Optimize and simplify camera transform update logic (#2280)
- bugfix(gui): Fix application hang from scrolling a map list with arrow keys (#2281)
- feat(gui): Add support for extra column to separate time and date in Replay Menu (#2278)
- bugfix(cratecollide): Prevent crates from being collected multiple times in a single frame (#2279)
- bugfix(object): Cancel previous tasks for captured dozers (#2237)
- fix(view): Prevent float division by zero in W3DView::setupWaypointPath() (#2274)
- refactor(view): Simplify View angle normalization (#2271)
- feat(gui): Add replay dates to replay list in Replay Menu (#2255)
- fix(display): Fix VideoBuffer format selection in W3DDisplay::createVideoBuffer (#2265)
- fix(intro): Fix order of Display Update and Draw in intro loop (#2264)
- fix(netpacket): Fix misplaced null test in NetPacket::addCommand() (#2272)
- feat(gui): Implement Player Info List (#2136)
- refactor(netpacket): Simplify packet serialization code by using packed structs (#1680)
- fix: Replace sprintf with snprintf to prevent potential stack overflows (#2262)
- build(cmake): Force include CppMacros.h globally for VC6 (#2252)
- tweak(gui): Use default locale of user for listed replays and save games to match regional date time formats (#2254)
- fix(debug): Allocate enough terrain debug icons based on the map dimensions in W3DDebugIcons() (#2231)