Releases: slurmlord/GeneralsGameCode
Releases · slurmlord/GeneralsGameCode
weekly-2025-12-26
Changelog
- bugfix(network): Fix data offset for string reads in NetPacket::readFileMessage() and NetPacket::readFileAnnounceMessage() (TheSuperHackers#2005)
- build: Implement docker build (TheSuperHackers#1774)
- refactor: Apply integer value comparisons for strcmp and stricmp with clang-tidy (TheSuperHackers#1956)
- bugfix(experience): Prevent ranking of riders that are not trainable (TheSuperHackers#1970)
- bugfix(object): Fix visibility conditions for client-side effects (TheSuperHackers#1964)
- bugfix(input): Disable mouse waypoint mode after using alt tab (TheSuperHackers#1987)
- unify(heightmap): Move Height Map and Terrain related files to Core (TheSuperHackers#1991)
- unify(heightmap): Merge Height Map related code and move Zero Hour's BaseHeightMap, FlatHeightMap, W3DPropDraw, W3DTreeDraw, W3DPropBuffer, W3DSnow, W3DTerrainBackground files to Core (TheSuperHackers#1991)
- build(heightmap): Fix include paths in Zero Hour Height Map files (TheSuperHackers#1991)
- unify(texture): Move W3DWater, W3DLaserDraw and WW3D2 texture related files to Core (TheSuperHackers#1989)
- unify(texture): Merge W3DWater and WW3D2 texture code (TheSuperHackers#1989)
- refactor: Apply the readability-container-size-empty check with clang-tidy (TheSuperHackers#1957)
- fix(network): Fix missing value initialization of LANGameInfo::m_isDirectConnect (TheSuperHackers#1836)
- bugfix(network): Prevent buffer overflow in NetPacket::readFileMessage() and NetPacket::readFileAnnounceMessage() (TheSuperHackers#1981)
- perf(namekey): Remove all superfluous AsciiString allocations for name key lookups (TheSuperHackers#1959)
- refactor(namekey): Reduce code duplication in NameKeyGenerator functions, misc formatting tweaks (TheSuperHackers#1959)
- unify(matpass): Merge WW3D2 matpass code (TheSuperHackers#1982)
- refactor: Remove superfluous inline and register keywords with clang-tidy (TheSuperHackers#1936)
- bugfix(string): Allow startsWith and endsWith to be called on empty strings (TheSuperHackers#1979)
- build: Add clang-tidy checks and script (TheSuperHackers#1807)
- bugfix(pathfinder): Prevent infinite loop within PathfindCell::putOnSortedOpenList() (TheSuperHackers#1965)
- ci(vcpkg): Include preset in binary cache key to avoid ABI mismatches and slow CI builds (TheSuperHackers#1973)
weekly-2025-12-12
Changelog
- feat(crashdump): Add crash dump functionality for fatal errors (TheSuperHackers#1594)
- bugfix(mouse): Prevent cursor capture when mouse is outside of app window (TheSuperHackers#1939)
- refactor(mouse): Apply minor refactoring and whitespace tweaks in WinMain, Mouse, HeaderTemplate (TheSuperHackers#1939)
- fix: Wrong usage of sizeof(this) in BitFlags::xfer(), W3DMPO::glueEnforcer() (TheSuperHackers#1947)
- bugfix(network): Prevent out of bounds memory access in NetCommandWrapperListNode::copyChunkData() (TheSuperHackers#1946)
- build: Use cmake_host_system_information to make registry queries in cmake (TheSuperHackers#1943)
- feat(movie): Implement ESC button mapping to skip Campaign, Challenge and Score videos (TheSuperHackers#1926)
- tweak(keyboard): Apply minor improvements to Keyboard class to query pressed keys (TheSuperHackers#1926)
- bugfix(movie): Fix Campaign, Challenge, Score movie cancellation or decompression artifacts when tabbing out of the game (TheSuperHackers#1927)
- refactor: Remove or replace some superfluous empty C strings (TheSuperHackers#1929)
- refactor(network): Replace implicit conversion from NULL to AsciiString in IPEnumeration::getMachineName (TheSuperHackers#1934)
- build: Add WOW6432Node to registry path lookups for EA App install path detection (TheSuperHackers#1903)
- refactor(string): Fix constness of TheEmptyString (TheSuperHackers#1930)
- refactor: Remove all explicit UnicodeString instantiations from C strings (TheSuperHackers#1928)
- bugfix(filesystem): Prevent loading wrong INIZH.big from Data/INI directory to prevent INI CRC mismatch (TheSuperHackers#1879)
- refactor: Remove superfluous variable init comments (TheSuperHackers#1876)
- refactor: Remove all explicit AsciiString instantiations from C strings (TheSuperHackers#1916)
- unify(view): Move View, W3DView to Core (TheSuperHackers#1904)
- unify(view): Merge View and closely related code (TheSuperHackers#1904)
- unify(client): Move ParabolicEase, CameraShakeSystem to Core (TheSuperHackers#1904)
- refactor: Replace preprocessor condition _WINDOWS with _WIN32 (TheSuperHackers#1911)
- unify(shader): Move W3DShaderManager to Core (TheSuperHackers#1920)
- unify(shader): Merge W3DShaderManager code, move Smudge, W3DSmudge to Core (TheSuperHackers#1920)
- bugfix(energy): Destruction of disabled Power Plant no longer lowers energy production twice (TheSuperHackers#1857)
- bugfix(radar): Add hero radar objects into its own list to get rid of hero cache updates and its related issues (TheSuperHackers#1893)
- refactor(radar): Simplify function Radar::deleteListResources (TheSuperHackers#1893)
- refactor(radar): Simplify function W3DRadar::renderObjectList (TheSuperHackers#1893)
- refactor(radar): Simplify function Radar::addObject (TheSuperHackers#1893)
- bugfix(weapon): Weapon effects now show again for hidden objects that are not explicitly stealthed (TheSuperHackers#1918)
- tweak(gui): Add configuration to GameData.ini to allow Money Per Minute for players (TheSuperHackers#1914)
weekly-2025-11-28
Changelog
- refactor(string): Implement generic startsWith, endsWith functions for C strings (TheSuperHackers#1898)
- refactor: Use new utility logic for handling observed player behaviour (TheSuperHackers#1861)
- bugfix(module): A projectile can no longer be jammed multiple times (TheSuperHackers#1907)
- unify(radar): Move ObjectStatusTypes, Radar, W3DRadar files to Core (TheSuperHackers#1894)
- unify(radar): Merge Radar code (TheSuperHackers#1894)
- unify(common): Merge ObjectStatusTypes code (TheSuperHackers#1894)
- refactor: Convert strlcpy to strcpy with static_assert (TheSuperHackers#1887)
- refactor(network): Convert some if-else chains to switch statements (TheSuperHackers#1682)
- bugfix: Fix effect visibility of contained objects (TheSuperHackers#1878)
- tweak(eva): Enable more EVA events for observed players (TheSuperHackers#1866)
- refactor: Remove duplicate include directives (TheSuperHackers#1873)
- refactor: Rename RETAIL_COMPATIBLE_BUG macro to PRESERVE_RETAIL_BEHAVIOR (TheSuperHackers#1877)
- refactor: Remove double semicolons (TheSuperHackers#1810)
- ci: Re-enable win32 vcpkg presets (TheSuperHackers#1863)
- build(vcpkg): Add lockfile and binary cache (TheSuperHackers#1862)
- build(ai): Resolve compile errors when the USE_DOZER preprocessor directive is false (TheSuperHackers#1871)
- fix(debug): Add error handling for rename failures in Debug code (TheSuperHackers#1855)
- bugfix(object): Show veterancy effects of stealthed objects for allies and observers (TheSuperHackers#1867)
- bugfix(weapon): Show weapon effects of stealthed objects for allies and observers (TheSuperHackers#1865)
- bugfix(module): Show cash amounts of stealthed objects for allies and observers (TheSuperHackers#1858)
- tweak(behavior): Add RETAIL_COMPATIBLE_BUG to Black Lotus cash value fix (TheSuperHackers#1864)
- tweak(specialpower): Enable special power EVA events for observed players (TheSuperHackers#1540)
- bugfix(network): Deny players with invalid names from joining a LAN game room (TheSuperHackers#1595)
- feat(view): Add ability to rotate the camera in 45 degree increments using the mouse (TheSuperHackers#1848)
- feat(view): Add ability to rotate the camera in 45 degree increments using the numpad (TheSuperHackers#1846)
- fix(parabolicease): Fix asserting on float inprecision in ParabolicEase::setEaseTimes() (TheSuperHackers#1854)
weekly-2025-11-14
Changelog
- fix: Fix incorrect argument used for isInSaveDirectory() (TheSuperHackers#1849)
- tweak(network): Add file extension validation to network map transfer (TheSuperHackers#1818)
- fix(font): Fix font scaling for large resolutions and implement new font scaling methods (TheSuperHackers#1466)
- perf(mapcache): Simplify and improve implementation of MapCache to prevent expensive reoccurring redundant map cache reads (TheSuperHackers#1775)
- unify(network): Move most GameNetwork and GameSpy files to Core (TheSuperHackers#1733)
- build(memory): Add missing REF macros to always.h for null memory manager (TheSuperHackers#1830)
- fix(font): Handle malformed fonts without crashing the game (TheSuperHackers#1826)
- fix: Replace strcpy with strlcpy to prevent potential buffer overflows (TheSuperHackers#1808)
- build(cmake): Add status message for missing game install path (TheSuperHackers#1820)
- refactor: Simplify some if-else condition chains (TheSuperHackers#1683)
- fix(debug): Implement reference counter and thread safety in DbgHelpLoader to allow for independent users (TheSuperHackers#1804)
- refactor: Remove wrong WWDefines.h file (TheSuperHackers#1814)
- tweak(scrolling): Prevent far camera jumps when scrolling while the game stalls (TheSuperHackers#1661)
- bugfix(module): Fix missing horde condition of Nationalism and Fanaticism weapon bonuses (TheSuperHackers#1582)
- refactor(module): Improve and simplify the implementation of HordeUpdate and related code (TheSuperHackers#1582)
- unify(module): Merge HordeUpdate and related code (TheSuperHackers#1813)
- bugfix(replay): Fix unrecognized replay files in Generals (TheSuperHackers#1815)
- build: Add static_assert's near relevant strcpy calls to prevent buffer overflows (TheSuperHackers#1806)
- refactor: Remove superfluous string buffer copies (TheSuperHackers#1800)
- fix: Replace strcpy with strlcpy and update length asserts (TheSuperHackers#1796)
- build(weekly): Enable complete debug symbols for VC6 weekly builds (TheSuperHackers#1803)
- refactor(w3dview): Replace duplicate reference count macros with core library equivalents (TheSuperHackers#1784)
- build: Move refcount.h include into WWCommon.h (TheSuperHackers#1798)
weekly-2025-11-07
Changelog
- refactor(network): Assign name to type enum in LANMessage (TheSuperHackers#1801)
- fix(script): Improve string handling of 'Fundamentalist' code hacks (TheSuperHackers#1797)
- refactor: Fix misspelled word in comments (TheSuperHackers#1795)
- fix(debug): Replace NDEBUG preprocessor with RTS_DEBUG or RTS_RELEASE (TheSuperHackers#1791)
- bugfix(gui): Fix incorrect Replay incompatibility messages (TheSuperHackers#1745)
- refactor: Replace custom strrchr implementations with standard function (TheSuperHackers#1782)
- bugfix(gui): Fix crash when RenderFpsFontSize is set to 0 (TheSuperHackers#1788)
- build: Add RETAIL_COMPATIBLE_BUG as build prerequisite for the tunnel healing fix (TheSuperHackers#1783)
- tweak(gui): Track money per minute for every player (TheSuperHackers#1773)
- refactor(gui): Break up and simplify map list related code in MapUtil (TheSuperHackers#1758)
- perf(gui): Eliminate expensive and unnecessary processing when populating the replay and map lists after they are full (TheSuperHackers#1758)
- refactor(maputil): Remove unused variables in MapUtil (TheSuperHackers#1767)
- unify(maputil): Merge MapUtil code (TheSuperHackers#1771)
- unify(imagecollection): Merge ImageCollection code (TheSuperHackers#1771)
- bugfix(system): Prevent AMD/ATI driver crash on game launch by front loading the system dbghelp.dll (TheSuperHackers#1066)
- feat(gui): Implement money per minute display for local player (TheSuperHackers#1481)
- refactor: Normalize all file extensions to lowercase (TheSuperHackers#1765)
- refactor: Simplify path string formatting in World Builder (TheSuperHackers#1759)
- bugfix(weapon): Fix unreliability of historic bonus weapons (TheSuperHackers#1727)
- unify(network): Merge GameSpy and related code (TheSuperHackers#1735)
- unify(network): Merge GameNetwork and related code (TheSuperHackers#1735)
weekly-2025-10-31
Changelog
- build: Use more precompiled headers to reduce build time by around 50% (TheSuperHackers#1740)
- feat(gui): Implement replay info tooltips in Replay Menu (TheSuperHackers#1720)
- bugfix(gui): Always show correct teams for players in the observer control bar (TheSuperHackers#1753)
- bugfix(filesystem): Tentatively fix hang in file exist cache (TheSuperHackers#1751)
- ci: Update Windows Version for Replay Checker (TheSuperHackers#1746)
- refactor: Remove superfluous include guards (TheSuperHackers#1741)
- refactor: Simplify string.h includes (TheSuperHackers#1743)
- refactor: Simplify stdio.h includes (TheSuperHackers#1742)
- bugfix(object): Check whether a bike still has a rider before sniping it to prevent crashing the game (TheSuperHackers#1537)
- feat(recorder): Implement replay archive feature (TheSuperHackers#1703)
- refactor: Replace all header include guards with pragma once (TheSuperHackers#1722)
- refactor: Remove superfluous defines from Language.h (TheSuperHackers#1739)
- feat(observer): Add button mapping for toggling Replay Observer (TheSuperHackers#1718)
- fix(observer): Reset observed player when switching teams (TheSuperHackers#1715)
- feat(radar): Save Radar hidden and forced status for each Player to show correct radar states when switching teams (TheSuperHackers#1715)
- refactor(scene): Clean formatting, comments in W3DScene (TheSuperHackers#1710)
- bugfix(scene): Fix translucent objects drawn without translucency when no occluders are in the scene (TheSuperHackers#1710)
- bugfix(anim): Fix elapsed time of object animations (TheSuperHackers#1656)
- bugfix: Fix global-buffer-overflow in WorldBuilder (MapObjectProps class) (TheSuperHackers#1725)
weekly-2025-10-24
Changelog
- bugfix(script): Fix global-buffer-overflow in WorldBuilder scripts (TheSuperHackers#1724)
- bugfix(client): Fix crash in WorldBuilder scene (TheSuperHackers#1723)
- refactor: Remove _MSC_VER guards around #pragma once (TheSuperHackers#1726)
- bugfix(drawable): Fix duplicated terrain decals applied after call to W3DModelDraw::replaceModelConditionState (TheSuperHackers#1569)
- bugfix(radar): No longer show hero radar icons in shroud (TheSuperHackers#1569)
- bugfix(radar): Refresh radar objects without delay when changing player (TheSuperHackers#1569)
- bugfix(ghostobject): Properly keep ghosted and shrouded objects hidden when taking a ghost snapshot or changing the local player (TheSuperHackers#1569)
- bugfix(ghostobject): Properly refresh real and ghost objects when changing the local player in the Ghost Object Manager (TheSuperHackers#1569)
- fix(ghostobject): Add additional tests in W3DRenderObjectSnapshot::addToScene, W3DGhostObject::removeParentObject for robustness (TheSuperHackers#1569)
- bugfix(ghostobject): Fix crash in W3DGhostObjectManager::updateOrphanedObjects (TheSuperHackers#1569)
- bugfix(ghostobject): Fix incorrect snapshot update in W3DGhostObject::snapShot (TheSuperHackers#1569)
- tweak(ghostobject): Decouple DEBUG_FOG_MEMORY from tracking ghost object states for all players when required (TheSuperHackers#1569)
- bugfix(ghostobject): No longer try to restore ghosted objects for a non-local player and simplify code in W3DGhostObject::freeSnapShot, W3DGhostObject::freeAllSnapShots (TheSuperHackers#1569)
- feat(client): Enable shroud for observed players (TheSuperHackers#1569)
- build(ghostobject): Fix compile error when enabling DEBUG_FOG_MEMORY (TheSuperHackers#1569)
- refactor(ghostobject): Simplify code and style in GhostObject, W3DGhostObject (TheSuperHackers#1569)
- fix: Revert strlcat on pointer arguments (TheSuperHackers#1713)
- feat(filesystem): Recover 481 higher resolution textures in Zero Hour by re-prioritizing textures by size (TheSuperHackers#1484)
- refactor: Remove redundant CppMacros.h includes (TheSuperHackers#1706)
weekly-2025-10-17
Changelog
- feat(filesystem): Implement access to shadowed files inside archives (TheSuperHackers#1483)
- bugfix(lan): Fix LANAPI init error (TheSuperHackers#1704)
- bugfix(behavior): Fix unexpected propaganda influence from contained units with direct Propaganda Tower behavior modules (TheSuperHackers#1545)
- bugfix(object): Reward unit experience for kills caused by OCL objects (TheSuperHackers#1634)
- bugfix(anim): Fix single animation updates (TheSuperHackers#1702)
- fix: Replace wcsncpy with wcslcpy for robustness (TheSuperHackers#1676)
- tweak(tree): Decouple tree sway, topple and sink time step from render update (TheSuperHackers#1652)
- tweak(shadow): Double 3D shadow buffers in W3DBufferManager (TheSuperHackers#1691)
- fix: Replace strncat with strlcat for robustness (TheSuperHackers#1677)
- fix: Replace strcat with strlcat for robustness (TheSuperHackers#1685)
- build(memory): Add placement new for VC6 compat with GameMemoryNull (TheSuperHackers#1701)
- fix: Replace strncpy with strlcpy for robustness (TheSuperHackers#1533)
- tweak(lan): Hide computer identity in LAN lobby (TheSuperHackers#1693)
- refactor(lan): Simplify LAN player tooltip related code (TheSuperHackers#1693)
- refactor(gui): Remove duplicate code in score screen (TheSuperHackers#1699)
- bugfix(fps): Fix crashes and ww3d updates in tools (TheSuperHackers#1688)
- refactor(gameengine): Move game time related code into new FramePacer class (TheSuperHackers#1688)
- tweak(gamelod): Disable changing display settings when clicking the Default button in Options Menu (TheSuperHackers#1632)
- refactor(gamelod): Simplify texture reduction code (TheSuperHackers#1631)
- bugfix(gamelod): Disable the recommended static lod level for texture reduction to prevent low texture resolution with 'Medium' and 'High' specs (TheSuperHackers#1630)
- feat(gamelod): Implement 'Very High' system spec (TheSuperHackers#1629)
- tweak(gamelod): Simplify game detail setup for Options Menu (TheSuperHackers#1628)
- refactor(pathfinder): Simplify and improve readability of Pathfinder::moveAllies (TheSuperHackers#1645)
- refactor(pathfinder): Simplify and improve readability of Pathfinder::checkForMovement (TheSuperHackers#1645)
- refactor(pathfinder): Simplify and improve readability of Pathfinder::examineCellsCallback (TheSuperHackers#1645)
- refactor(pathfinder): Simplify and improve readability of Pathfinder::snapClosestGoalPosition (TheSuperHackers#1645)
- refactor(pathfinder): Simplify and improve readability of Pathfinder::checkDestination (TheSuperHackers#1645)
- refactor(utils): Move STLUtils.h to WWLib (TheSuperHackers#1679)
weekly-2025-10-10
Changelog
- refactor(quotedprintable): Simplify and modernize code in QuotedPrintable (TheSuperHackers#1659)
- fix(quotedprintable): Fix assert in AsciiStringToQuotedPrintable during map cache generation (TheSuperHackers#1659)
- refactor(network): Extract magic NetPacket character literals into named constants (TheSuperHackers#1672)
- bugfix(tunnel): Fix stacked unit healing time inside multiple GLA Tunnel Networks (TheSuperHackers#1626)
- tweak(module): Add 'TransferSelection' field to CreateObjectDie INI module to allow transfer selection on object creation (TheSuperHackers#1665)
- fix(debug): Fix wrong assert condition in W3DTreeDraw::addToTreeBuffer() (TheSuperHackers#1663)
- tweak(fps): Simplify function W3DDisplay::updateAverageFPS() and remove its frame spike filter (TheSuperHackers#1662)
- tweak(drawable): Decouple tint update step from render update (TheSuperHackers#1651)
- bugfix(network): Fix clearing remote player commands in Connection::clearCommandsExceptFrom() to prevent local player left hanging in game over screen (TheSuperHackers#1638)
- bugfix(jetaiupdate): Fix pairs of Jets not waiting for each other before takeoff (TheSuperHackers#1617)
- refactor(jetaiupdate): Rename variable in JetPauseBeforeTakeoffState (TheSuperHackers#1617)
- refactor(pathfinder): Simplify and improve readability of Pathfinder::getMoveAwayFromPath (TheSuperHackers#1620)
- refactor(pathfinder): Simplify and improve readability of Pathfinder::findAttackPath (TheSuperHackers#1620)
- refactor(pathfinder): Simplify and improve readability of Pathfinder::validLocomotorSurfacesForCellType (TheSuperHackers#1620)
- refactor(pathfinder): Simplify and improve readability of Pathfinder::internalFindPath (TheSuperHackers#1620)
- refactor(pathfinder): Simplify and improve readability of Pathfinder::internal_findHierarchicalPath (TheSuperHackers#1619)
- refactor(pathfinder): Extract functionality Pathfinder::checkCellOutsideExtents (TheSuperHackers#1619)
- refactor(pathfinder): Simplify and improve readability of Pathfinder::examineNeighboringCells (TheSuperHackers#1619)
- refactor(pathfinder): Simplify and improve readability of Pathfinder::checkChangeLayers (TheSuperHackers#1619)
- refactor(pathfinder): Simplify and improve readability of PathfindCell::releaseInfo (TheSuperHackers#1619)
- feat(ui): Implement simple Latency and FPS display (TheSuperHackers#1546)
- tweak(water): Decouple wave movement time step from render update (TheSuperHackers#1654)
- tweak(water): Decouple water movement time step from render update (TheSuperHackers#1653)
- bugfix(camera): Decouple camera zoom update from logic time (TheSuperHackers#1655)
- refactor(terrain): Simplify cloud movement clamping (TheSuperHackers#1648)
- refactor: Remove obsolete pragma optimize directives (TheSuperHackers#1649)
- bugfix(network): Fix Network stalling state (TheSuperHackers#1650)
- bugfix(lan): Always allow players to join a LAN room if there is an open slot (TheSuperHackers#1637)
- bugfix(debug): Fix missing toggle for DEMO_TOGGLE_NO_DRAW (TheSuperHackers#1633)
- bugfix(buildassistant): Fix Network game mismatch by using the correct player index to check shroud status when placing structures (TheSuperHackers#1646)
- fix(shadow): Fix counting of W3DProjectedShadowManager::m_numDecalShadows (TheSuperHackers#1568)
- tweak(w3dview): Decouple WWAudioClass update from logic step (TheSuperHackers#1579)
- tweak(ww3d): Decouple render update from logic step in DazzleRenderObjClass::Render, TexProjectClass::Pre_Render_Update (TheSuperHackers#1579)
- tweak(ww3d): Decouple render update from logic step in RingRenderObjClass::animate, SphereRenderObjClass::animate (TheSuperHackers#1579)
- bugfix(drawable): Fix locked color in Drawable::colorTint, EMPUpdate::update (TheSuperHackers#1579)
- tweak(heightmap): Decouple cloud render update from logic step (TheSuperHackers#1579)
- tweak(anim): Enable interpolation for raw animation updates and couple the legacy non interpolated updates to the ww3d sync (TheSuperHackers#1579)
- refactor(anim): Cleanup and simplify animation code a bit (TheSuperHackers#1579)
- bugfix(ww3d): Bind the ww3d sync step to the game logic step (TheSuperHackers#1579)
- tweak(anim): Decouple anim object render update from logic step (TheSuperHackers#1579)
- bugfix(anim): Fix calling Animatable3DObjClass::Single_Anim_Progress more than once a frame (TheSuperHackers#1579)
- tweak(segline): Decouple segline render update from logic step (TheSuperHackers#1579)
- tweak(snow): Decouple snow render update from logic step (TheSuperHackers#1579)
- bugfix(draw): Fix tank draw update logic step time is smaller than render frame time (TheSuperHackers#1579)
- refactor(ww3d): Rename WW3D::Get_Frame_Time to WW3D::Get_Sync_Frame_Time (TheSuperHackers#1579)
- bugfix(input): Fix cargo units selection hack (TheSuperHackers#1635)
- tweak(options): Simplify user options for Cursor Capture (TheSuperHackers#1541)
- bugfix(contain): Fix unit attachments being visible in fog after exiting a GLA Tunnel Network (TheSuperHackers#1522)
- bugfix(module): GLA Battle Bus can no longer be subdued indefinitely (TheSuperHackers#1604)
- bugfix(gui): Consistently show blue health bars for disabled objects (TheSuperHackers#1622)
- bugfix(buildassistant): Prevent showing the invalid placement indicator for shrouded objects (TheSuperHackers#1543)
- perf(behavior): Optimize loops in ParkingPlaceBehavior (TheSuperHackers#1618)
- bugfix(tree): Fix 1 in 10 trees not swaying (TheSuperHackers#1613)
- refactor(tree): Simplify W3DTreeDraw related code (TheSuperHackers#1614)
- bugfix(input): Fix broken single click command after right mouse double click (TheSuperHackers#1605)
- bugfix(module): Fix damage calculation for determining the initial death of GLA Battle Bus (TheSuperHackers#1603)
- bugfix(input): Double-clicking to place a building no longer performs double-click selection logic (TheSuperHackers#1608)
- refactor(pathfinder): Remove superfluous whitespace and commented code in Pathfinder (TheSuperHackers#1611)
- feat(client): Make opacity and shadows of build placement preview objects customizable (TheSuperHackers#1592)
- fix(shadow): Fix initial shadow states of draw modules (TheSuperHackers#1591)
- bugfix(shadow): Fix missing tree shadow decals when no object shadow decals exist (TheSuperHackers#1590)
- bugfix(input): Force stop camera inputs after game end (TheSuperHackers#1602)
- bugfix(view): Prevent moving the camera with most user inputs during camera playback in Replay playback (TheSuperHackers#1599)
- bugfix(view): Fix camera terrain height adjustment during camera playback in Replay playback (TheSuperHackers#1598)
- bugfix(view): Fix camera terrain height adjustment in Replay playback (TheSuperHackers#1597)
- bugfix(fps): Fix mouse wheel zoom speed and decouple zoom update from logic step (TheSuperHackers#1587)
- refactor(view): Simplify View related code (TheSuperHackers#1600)
- refactor(message): Simplify double click related code in MetaEventTranslator::translateGameMessage() (TheSuperHackers#1606)
- refactor: Verify array size, fix constness of strings lists, and improve order of enum values (TheSuperHackers#1584)
- bugfix(pathfinder): Fix various crashes in Pathfinder due to inadequate cleanup of pathfinding resources (TheSuperHackers#994)
weekly-2025-09-26
Changelog
- ci(release): Add weekly pre-releases workflow for Generals and GeneralsMD (TheSuperHackers#929)
- bugfix(behavior): Fix hardcoded cash hack value for Black Lotus (TheSuperHackers#1601)
- fix: Fix malformed string lists (TheSuperHackers#1583)
- refactor: Remove ELEMENTS_OF macro (TheSuperHackers#1588)
- feat(gui): Add button to select the next idle worker of the currently viewed player for observers (TheSuperHackers#1526)
- tweak(network): Transfer assets of disconnected players to allies (TheSuperHackers#1523)
- bugfix(module): Consistently yield experience for direct flame kills (TheSuperHackers#1539)
- bugfix(module): Consistently yield experience for direct poison kills (TheSuperHackers#1527)
- refactor: Remove superfluous comments from last entries in enums and arrays (TheSuperHackers#1586)
- refactor: Remove superfluous enum values (TheSuperHackers#1585)