Repository navigation
weekly-2026-03-13
·
490 commits
to main
since this release
Changelog
- bugfix(namekey): Remove hardcoded NameKeyIDs from dummy strings to work with modded files (TheSuperHackers#2349)
- ci(validate): Update PR validation workflow and valid tags (TheSuperHackers#2426)
- unify(pathfinder): Move AIPathfind.h and AIPathfind.cpp to Core (TheSuperHackers#2428)
- chore(replays): Update GeneralsReplays reference to latest (TheSuperHackers#2424)
- fix(lookat): Fix mouse anchor and direction issue for camera pitch (TheSuperHackers#2421)
- bugfix(audio): Decouple Particle Cannon audio spawn point from visual beam to restore correct position and fix quiet beam audio (TheSuperHackers#2415)
- unify(pathfinder): Merge Pathfinder::moveAllies and Pathfinder::findAttackPath from Zero Hour (TheSuperHackers#2341)
- unify(pathfinder): Merge Pathfinder::moveAlliesDestinationCallback, ::processHierarchicalCell, ::findClosestPath, ::updateGoal (TheSuperHackers#2341)
- unify(pathfinder): Merge Pathfinder::checkForPossible(), ::processPathfindQueue(), ::examineNeighboringCells(), ::buildHierarchicalPath() (TheSuperHackers#2341)
- unify(pathfinder): Merge Pathfinder::clientSafeQuickDoesPathExist() and Pathfinder::clientSafeQuickDoesPathExistForUI() from Zero Hour (TheSuperHackers#2341)
- 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)
- ci(vcpkg): Fix recurring binary cache invalidation from runner image updates (TheSuperHackers#2371)
- 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)
- 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)
- bugfix(skirmish): Prevent mismatch in Replay playback by restoring correct game seed after restarting a Skirmish game (TheSuperHackers#2270)
- refactor(pathfinder): Remove unused function Pathfinder::pathDestination() (TheSuperHackers#2308)
- unify(client): Move several GameClient files to Core (TheSuperHackers#2337)
- unify(client): Merge DisplayString, GameText, GlobalLanguage, SelectionInfo code (TheSuperHackers#2337)
- bugfix(player): Fix rounding inaccuracies with money awarded by Cash Bounty (TheSuperHackers#2330)
- bugfix(behavior): Prevent fallen Angry Mob members from respawning at the Barracks after loading a save (TheSuperHackers#2314)
- refactor(pathfinder): Cleanup retail compatible insertion sort code (TheSuperHackers#2331)
- refactor(pathfinder): Implement PathfindCellList class for the pathfindcell closedList (TheSuperHackers#2327)
- refactor(pathfinder): Implement PathfindCellList class for the pathfindcell openList (TheSuperHackers#2327)
- bugfix(victory): Save victory status to prevent early exits from resulting in defeat in network matches (TheSuperHackers#2292)
- fix(netpacket): Fix incorrect improbable return value in NetPacket::GetBufferSizeNeededForCommand() (TheSuperHackers#2328)
- unify(gui): Move several GUI related files to Core (TheSuperHackers#2332)
- unify(loadscreen): Merge LoadScreen and related code (TheSuperHackers#2332)
- fix(loadscreen): Fix missing pointer initialization in constructors of MultiPlayerLoadScreen, GameSpyLoadScreen and remove superfluous code from destructors of LoadScreen classes (TheSuperHackers#2332)
- unify(mouse): Move Mouse, Keyboard files to Core (TheSuperHackers#2334)
- unify(mouse): Merge Mouse, Keyboard code (TheSuperHackers#2334)
- bugfix(battleplanupdate): Prevent using the Bombardment Cannon while switching Battle Plans (TheSuperHackers#2324)
- bugfix(behavior): Only detonate Bunker Busters if the missile reaches its destination (TheSuperHackers#2321)
- tweak(commandline): Skip intro logo with -quickstart and enable -nologo, -noShellAnim in Release builds (TheSuperHackers#2266)
- bugfix(radar): Show Hero Radar icons in Containers and Tunnels again (TheSuperHackers#2189)
- fix(connection): Fix unsafe Player ID usage in ConnectionManager, DisconnectManager (TheSuperHackers#2305)
- bugfix(particlesys): Restore Particle System IDs on save load before registering to ParticleSystemManager (TheSuperHackers#2316)
- bugfix(worldbuilder): Fix incorrect access of empty list in ObjectOptions::_FindOrDont() (TheSuperHackers#2306)
- tweak: Put fixes that do affect gameplay behind PRESERVE_RETAIL_BEHAVIOR (TheSuperHackers#2319)
- build: Fix compile error when building without RETAIL_COMPATIBLE_CRC (TheSuperHackers#2318)
- bugfix(worldbuilder): Fix optimized trees not being shown in object placer preview window (TheSuperHackers#2312)
- bugfix(worldbuilder): Fix uncaught carriage return in CommandButton name when parsing from INI (TheSuperHackers#2300)
- feat(cratecollide): Add INI option to allow a crate to be picked up multiple times in one frame (TheSuperHackers#2297)
- build(docker): Add Linux LSP support by fixing compile_commands.json paths (TheSuperHackers#2303)
- tweak(worldbuilder): Remove EULA code and data (TheSuperHackers#2307)
- fix(netpacket): Fix undefined behavior with NetPacket buffer writes (TheSuperHackers#2304)
- bugfix(network): Increase message buffer and max packet sizes to reduce connection issues (TheSuperHackers#2277)
- bugfix: Remove superfluous CD checks and related code (TheSuperHackers#2261)
- refactor(netpacket): Simplify initialization of net packet field types (TheSuperHackers#2288)
- refactor(netpacket): Streamline order of net packet fields (TheSuperHackers#2288)
- fix(draw): Recover tread debris effects for W3DTankTruckDraw (TheSuperHackers#2251)
- refactor(draw): Rename emitters functions in W3DTankDraw, W3DTankTruckDraw, W3DTruckDraw (TheSuperHackers#2251)
- bugfix(worldbuilder): Fix script condition selection when editing newly created condition (TheSuperHackers#2289)
- bugfix(view): Recalculate camera area constraints when toggling Control Bar or changing Pitch, FOV (TheSuperHackers#2291)
- chore(gui): Implement function GadgetTextEntrySetMaxLen() (TheSuperHackers#2290)
- bugfix(contain): Prevent undefined behaviour when a dead unit enters a container (TheSuperHackers#2258)
- bugfix(ocl): Fix uninitialized variable in ObjectCreationList to avoid mismatches (TheSuperHackers#2096)
- bugfix(projectile): Fix out-of-bounds access in DumbProjectile which causes mismatch with very high speed weapons at small hit distances (TheSuperHackers#2087)
- bugfix(pathfinder): Fix uninitialized variable in Pathfinder::classifyFence() and possible source of mismatches in Retail-compatible builds (TheSuperHackers#1748)
- fix(netpacket): Protect text length value from overflowing in NetPacketChatCommand, NetPacketDisconnectChatCommand (TheSuperHackers#2284)
- fix(netcommandmsg): Fix new/delete mismatch in NetWrapperCommandMsg (TheSuperHackers#2287)
- refactor(netpacket): Use more consistent names for packed net packet structs (TheSuperHackers#2283)
- refactor(netpacket): Remove duplicate packed commands and cleanup code comments (TheSuperHackers#2283)
- fix(comments): Use 2026 for this year's code comments (TheSuperHackers#2285)
- perf(view): Optimize and simplify camera transform update logic (TheSuperHackers#2280)
- bugfix(gui): Fix application hang from scrolling a map list with arrow keys (TheSuperHackers#2281)
- feat(gui): Add support for extra column to separate time and date in Replay Menu (TheSuperHackers#2278)
- bugfix(cratecollide): Prevent crates from being collected multiple times in a single frame (TheSuperHackers#2279)
- bugfix(object): Cancel previous tasks for captured dozers (TheSuperHackers#2237)
- fix(view): Prevent float division by zero in W3DView::setupWaypointPath() (TheSuperHackers#2274)
- refactor(view): Simplify View angle normalization (TheSuperHackers#2271)
- feat(gui): Add replay dates to replay list in Replay Menu (TheSuperHackers#2255)
- fix(display): Fix VideoBuffer format selection in W3DDisplay::createVideoBuffer (TheSuperHackers#2265)
- fix(intro): Fix order of Display Update and Draw in intro loop (TheSuperHackers#2264)
- fix(netpacket): Fix misplaced null test in NetPacket::addCommand() (TheSuperHackers#2272)
- feat(gui): Implement Player Info List (TheSuperHackers#2136)
- refactor(netpacket): Simplify packet serialization code by using packed structs (TheSuperHackers#1680)
- fix: Replace sprintf with snprintf to prevent potential stack overflows (TheSuperHackers#2262)
- build(cmake): Force include CppMacros.h globally for VC6 (TheSuperHackers#2252)
- tweak(gui): Use default locale of user for listed replays and save games to match regional date time formats (TheSuperHackers#2254)
- fix(debug): Allocate enough terrain debug icons based on the map dimensions in W3DDebugIcons() (TheSuperHackers#2231)