Releases: mirelle7/GeneralsGameCode
Releases · mirelle7/GeneralsGameCode
Release list
weekly-2026-09-18
Changelog
- bugfix(filesystem): Preserve write paths with missing directories (TheSuperHackers#3104)
- fix(milesaudiomanager): Prevent heap-buffer-overflow read in MilesAudioManager::selectProvider() (TheSuperHackers#3281)
- chore(pathfinder): Remove superfluous CPOP_STARTS_FROM_PREV_SEG macro (TheSuperHackers#3295)
- fix(hash): Fix initialization of HashTableIteratorClass and make it work with an empty HashTableClass (TheSuperHackers#3284)
- fix(audio): Copy SoundSceneObjClass state safely (TheSuperHackers#3247)
- feat(recorder): Play a replay file from the command line (TheSuperHackers#3227)
- bugfix(pathfinder): Restore Generals retail compatibility after crash fix changes to Pathfinder::findAttackPath (TheSuperHackers#3289)
- chore(license): Add SPDX-License-Identifier to LICENSE.md (TheSuperHackers#3290)
- chore: Remove trailing commas in braced initializers that break clang-format's compact layout (TheSuperHackers#3274)
- ci: Restore CI workflow permission compatibility (TheSuperHackers#3286)
- bugfix(meshmatdesc): Fix mesh material color processing (TheSuperHackers#3246)
- build(cmake): Add retail compatibility option in CMake config (TheSuperHackers#2379)
- refactor(basetype): Add utility functions to Region and Coord types (TheSuperHackers#3271)
- ci(release): Stop requesting permissions from the reusable workflow (TheSuperHackers#3276)
- refactor(particlesys): Parse IsGroundAligned as an enum instead of a boolean (TheSuperHackers#3265)
- fix(gamefont): Ceil font glyph buffer size to the actual glyph size to prevent a buffer write overflow (TheSuperHackers#3268)
- perf(gamememory): Remove unnecessary calls to preMainInitMemoryManager from delete and free functions and make freeBytes noexcept to get rid of EH frame (TheSuperHackers#3266)
- chore(gamememory): Remove superfluous extern keywords from operator overloads (TheSuperHackers#3266)
- perf(gamememory): Add overloads for the deletes with size_t argument (TheSuperHackers#3266)
- perf(gamememory): Inline preMainInitMemoryManager (TheSuperHackers#3266)
- perf(gamememory): Early exit delete and free functions on null pointer (TheSuperHackers#3266)
- chore(gamememory): Compile out the memory link tester in Release (TheSuperHackers#3266)
- perf(productionupdate): Simplify and correct implementations of cancel functions in ProductionUpdate (TheSuperHackers#3270)
- refactor(miles): Fix the written primitive types in mss.h and all its call sites; no ABI changes (TheSuperHackers#3272)
- refactor(miles): Replace the Miles SDK stub with a Miles runtime loader (TheSuperHackers#3272)
- refactor(bink): Replace the Bink SDK stub with a Bink runtime loader (TheSuperHackers#3272)
- bugfix(milesaudiomanager): No longer use stopped audio in queries and updates (TheSuperHackers#3254)
- bugfix(milesaudiomanager): Fix premature 2d and 3d sound cancellations from MilesAudioManager::stopAudioEvent() (TheSuperHackers#3254)
- refactor(milesaudiomanager): Simplify MilesAudioManager::findLowestPrioritySound() (TheSuperHackers#3254)
- refactor(milesaudiomanager): Simplify MilesAudioManager::notifyOfAudioCompletion() (TheSuperHackers#3254)
- refactor(milesaudiomanager): Use consistent variable names for PlayingAudio in MilesAudioManager (TheSuperHackers#3254)
- bugfix(dozeraiupdate): Fix issue where builders could resume completed tasks after being disabled (TheSuperHackers#2793)
- bugfix(neutronmissile): Fix and improve Nuke Missile damage for large objects inside the outer blast radius (TheSuperHackers#3161)
- feat(commandline): Add working directory command line options (TheSuperHackers#3149)
- bugfix(gamewindow): Remove destroyed windows from the modal stack and prevent duplicate modals for the same window (TheSuperHackers#3224)
- bugfix(productionupdate): Prevent cancelling and refunding a single production entry when a number of its units already finished production (TheSuperHackers#2399)
- ci(release): Protect weekly-release against commit-subject injection (TheSuperHackers#3267)
- bugfix(aiupdate): Contact weapons are no longer blocked by obstacles (TheSuperHackers#3194)
- perf(particlesys): Batch same type particles to reduce cost of particle rendering by 15 to 30% (TheSuperHackers#3155)
- docs: Update the AI code guidelines (TheSuperHackers#3249)
- ci(release): Fix weekly release workflow permissions (TheSuperHackers#3256)
- chore(lib): Implement Usp10Loader class (TheSuperHackers#3241)
- tweak(gameaudio): Only update sound volumes if the volume has really changed (TheSuperHackers#3252)
- fix(gameaudio): Remove the has3DSensitiveStreamsPlaying volume hack (TheSuperHackers#3252)
- bugfix(tunnel): Restore retail compatibility after changes to TunnelTracker::onTunnelDestroyed() and TunnelContain::onCapture() (TheSuperHackers#3242)
- tweak(gamestate): Support loading save files from absolute paths (TheSuperHackers#3226)
- bugfix(audio): Apply configured volume to Bink movie audio (TheSuperHackers#3083)
- build(vcpkg): Define FFmpeg as VCPKG feature, disabled by default (TheSuperHackers#3184)
- fix(htree): Reject invalid W3D hierarchy pivot counts (TheSuperHackers#3195)
- unify(gui): Move game window files to Core (TheSuperHackers#3197)
- unify(gui): Merge game window files (TheSuperHackers#3197)
- ci(vcpkg): Disable vcpkg metrics to stop random link failures (TheSuperHackers#3244)
- bugfix(particlesys): Delay particle system destruction to prevent orphaning slaved finite-lifetime particle systems (TheSuperHackers#3238)
- chore: Accept both path slashes for clang tidy (TheSuperHackers#3225)
- refactor: Fix unnecessary copy initializations (TheSuperHackers#3202)
- tweak(scorch): Increase scorch buffer limits to 16-bit maximum (TheSuperHackers#3186)
- fix(scorch): Early return if scorch does not fit in buffer (TheSuperHackers#3186)
- chore: Add override keywords to virtual function overrides (TheSuperHackers#3221)
- bugfix(update): Resolve mismatch in Generals caused by updating AssistedTargetingUpdate for the initial frame (TheSuperHackers#3212)
- fix(heightmapedit): Fix undefined behaviors in WorldHeightMapEdit::remapTextures, WorldHeightMapEdit::findBoundaryNear (TheSuperHackers#3201)
- bugfix(object): Avoid potential crash when Troop Crawler is destroyed before reaching Reinforcement Pad (TheSuperHackers#3165)
- Revert previous crash fixes when Troop Crawler is destroyed before reaching Reinforcement Pad (TheSuperHackers#3165)
- refactor(ww3d2): Implement first bits for IRenderBackend interface (TheSuperHackers#2613)
- ci(vcpkg): Repair the vcpkg CI path and move the binary cache to GitHub Packages (TheSuperHackers#2542)
- tweak(particlesys): Cleanup volume particle depth handling and add INI field to control it (TheSuperHackers#3188)
- fix(filesystem): Delay StdBIGFile allocation until after archive validation (TheSuperHackers#3196)
- feat(saveload): Implement -loadsave command line option (TheSuperHackers#3001)
- refactor(network): Clarify command list ordering (TheSuperHackers#3052)
- bugfix(network): Sort fast path in NetCommandList by sort number (TheSuperHackers#3052)
weekly-2026-08-28
Changelog
- bugfix(missileaiupdate): Diving missiles no longer miss moving targets (TheSuperHackers#3192)
- tweak(w3ddisplay): Set texture bit depth to display bit depth (TheSuperHackers#3181)
- refactor(gamestate): Decouple result handling from game state (TheSuperHackers#3000)
- bugfix(modulefactory): Fix mismatch caused by W3D module additions in Generals (TheSuperHackers#3180)
- bugfix(shell): Prevent menu crashing by avoiding initializing layouts during teardown (TheSuperHackers#3158)
- bugfix(selection): Prevent objects from being appended to a selection if they are not mass-selectable (TheSuperHackers#3169)
- refactor(scorch): Store scorch structs in a deque (TheSuperHackers#3159)
- refactor(scorch): Reorganize scorch deduplication and buffer writes (TheSuperHackers#3159)
- chore(scorch): Remove debug sample marks (TheSuperHackers#3159)
- fix(scorch): Releasing old scorch buffers before allocation (TheSuperHackers#3159)
- bugfix(scorch): Deduplicate before evicting the oldest scorch (TheSuperHackers#3159)
- fix(saveload): Use getFinalOverride in WeaponSet xfer load to match Object constructor (TheSuperHackers#2160)
- unify(particlesys): Move W3DParticleSys.h to Core (TheSuperHackers#3172)
- bugfix(contain): Preserve occupants when transferring assets to allies (TheSuperHackers#3124)
- bugfix(aiupdate): Let Tunnel Network passengers exit from any Tunnel Object again (TheSuperHackers#3136)
- refactor(particlesys): Cleanup retail smudge particle type identification (TheSuperHackers#3162)
- test(neutronmissile): Add debug draw for nuke missile radius (TheSuperHackers#3160)
- feat(string): Implement UTF-8 string conversion and validation functions (TheSuperHackers#2528)
- bugfix(object): The KINDOF_NO_SELECT flag now prevents an object from being selected (TheSuperHackers#3125)
- bugfix(scorch): Fix diffuse color calculation of scorches (TheSuperHackers#3153)
- perf(smudge): Early return W3DSmudgeManager::render when no smudges are present (TheSuperHackers#3140)
- bugfix(ai): Attacking infantry no longer attempt to path to their targets when force-evacuated from a vehicle (TheSuperHackers#3098)
- bugfix(selection): Fix group index range in SelectionTranslator::onMetaViewTeam() (TheSuperHackers#3139)
- bugfix(chinookaiupdate): Helicopter enter commands are now ignored if the target to enter is invalid or ourselves (TheSuperHackers#3115)
- bugfix(horde): Prevent dead units from being considered for horde membership (TheSuperHackers#3067)
- unify(shell): Move Shell to Core (TheSuperHackers#3070)
- unify(shell): Merge Shell from Zero Hour (TheSuperHackers#3070)
- perf(script): Reduce cost of ScriptEngine::findScript() by around 85% (TheSuperHackers#3096)
- bugfix(heightmap): Fix ray casting in BaseHeightMapRenderObjClass::Cast_Ray (2) (TheSuperHackers#2869)
- refactor: Simplify slot-to-player lookups (TheSuperHackers#3034)
- bugfix(scorch): Prevent volatile scorches from evicting static map scorches (TheSuperHackers#3114)
- bugfix(pathfinder): Prevent a retail crash where a pathfindCell has a dangling linked list pointer (TheSuperHackers#3113)
- bugfix(pathfinder): Prevent a retail crash where the head of the closed list has no associated m_info (TheSuperHackers#3113)
- bugfix(milesaudiomanager): Prevent dangling pointer to AudioEventRTS in PlayingAudio when handing it over to a new AudioRequest after a call to MilesAudioManager::startNextLoop() (TheSuperHackers#2774)
- refactor(audioevent): Add RefCountClass to DynamicAudioEventRTS (TheSuperHackers#2774)
- bugfix(scorch): Update scorch texture mip quality when changing texture quality setting (TheSuperHackers#3119)
- unify(drawable): Merge most of Drawable and Locomotor (TheSuperHackers#3097)
- ci(vcpkg): Limit setup to vcpkg presets (TheSuperHackers#3128)
- bugfix(jetaiupdate): Helicopters no longer land or remain landed at destroyed Airfields (TheSuperHackers#3080)
- tweak(gui): Move animated GUI window smoothly at higher than 30 frames per second (TheSuperHackers#3061)
- refactor(network): Remove dynamic allocations for NetPacket (TheSuperHackers#2866)
- refactor(baseheightmap): Extract scorch rendering from BaseHeightMap into new W3DScorch (TheSuperHackers#3017)
- bugfix(aiupdate): Don't process invalid exit commands (TheSuperHackers#3089)
- bugfix(jetaiupdate): Save helicopter landing position (TheSuperHackers#3077)
- bugfix(stickybomb): Allow Booby Traps to be placed on a previously booby-trapped object (TheSuperHackers#3060)
- fix(namekey): Canonicalize lowercase name keys (TheSuperHackers#3082)
- bugfix(contain): Allow passengers to exit immobilized Battle Buses (TheSuperHackers#3041)
- tweak(gui): Change LAN emote buttons to chat buttons and implement /me emote text command in LAN chats (TheSuperHackers#1821)
- refactor: Use slot indices for player conversions (TheSuperHackers#3033)
- chore: Remove unused W3DCustomEdging class (TheSuperHackers#3079)
- bugfix(jetaiupdate): Fix aircraft falling to their death if their Airfield is lost during their return flight (TheSuperHackers#3076)
- unify(w3ddevice): Move W3DDevice/Common to Core (TheSuperHackers#3073)
- unify(w3ddevice): Merge W3DModuleFactory from Zero Hour (TheSuperHackers#3073)
- unify(w3ddevice): Move W3DDevice/GameClient/GUI to Core (TheSuperHackers#3074)
- unify(gui): Move EstablishConnectionsMenu to Core (TheSuperHackers#3069)
- refactor(w3dview): Migrate raw pointers to RefCountPtr (TheSuperHackers#1763)
- unify(gui): Move GUICallbacks to Core (TheSuperHackers#3068)
- fix(client): Prevent movies from playing in headless mode (TheSuperHackers#3066)
- chore: Update retail behaviour preservation flags (TheSuperHackers#3065)
- feat(specialpower): Add INI option to start a special power without its initial reload time (TheSuperHackers#3054)
- refactor(refcountptr): Simplify RefCountPtr's Create_No_Add_Ref, Create_Add_Ref and add Assign_No_Add_Ref, Assign_Add_Ref (TheSuperHackers#3058)
- chore(refcountptr): Include ref_ptr.h in WWCommon.h (TheSuperHackers#3059)
- fix(spectregunship): Decouple particle system in SpectreGunshipUpdate::update from logic crc (TheSuperHackers#3055)
- bugfix(aiupdate): Prevent units from deploying when moving (TheSuperHackers#3016)
- tweak(gui): Decouple GUI window-move animations from the render frame rate (TheSuperHackers#2833)
- unify(win32device): Move Win32Device to Core (TheSuperHackers#3046)
- unify(win32device): Merge Win32GameEngine from Zero Hour (TheSuperHackers#3046)
- bugfix(gamefont): Lift the upper font point size limit of 100 (TheSuperHackers#3051)
- unify(precompiled): Move Precompiled to Core (TheSuperHackers#3050)
- unify(precompiled): Merge Precompiled from Zero Hour (TheSuperHackers#3050)
- feat(object): Implement KINDOF_NO_ATTACK_WARNING to suppress alarm events on object attacks (TheSuperHackers#2862)
- unify(bezier): Move Bezier to Core (TheSuperHackers#3047)
- bugfix(shroud): Fix texture access bounds in W3DShroud::getShroudLevel() (TheSuperHackers#3045)
- unify(commandline): Move CommandLine to Core (TheSuperHackers#3037)
- unify(common): Move DamageFX, Dict, DiscreteCircle, Language, MessageStream... to Core (TheSuperHackers#3038)
- chore: Correct the game title in Copyright headers of CommandLine source files (TheSuperHackers#3042)
- unify(ww3d2): Move ww3d to Core (TheSuperHackers#3012)
- unify(ww3d2): Merge ww3d (TheSuperHackers#3012)
- refactor(commandxlat): Split evaluateContextCommand into per-command handlers (TheSuperHackers#3008)
- chore: Restore full relative include visibility in WWVegas libraries (TheSuperHackers#3032)
weekly-2026-08-07
Changelog
- bugfix(debug): Skip system-modal crash dialogs in headless runs (TheSuperHackers#3030)
- refactor(smudge): Replace custom doubly linked list with std::deque in W3DSmudge (TheSuperHackers#3021)
- chore(network): Remove obsolete HTTP Proxy option (TheSuperHackers#3009)
- chore(network): Remove legacy Send Delay (TheSuperHackers#3007)
- chore: Remove redundant void argument from functions (3) (TheSuperHackers#3027)
weekly-2026-07-31
Changelog
- perf(terrain): Hoist global light ray computation out of per-vertex loop
- chore(string): Implement AsciiString::toUpper() (TheSuperHackers#3020)
- fix(string): Fix character length limit and unnecessary allocation in AsciiString::toLower() (TheSuperHackers#3020)
- fix(displaystring): Guard null bold font pointer in W3DDisplayString::setFont() (TheSuperHackers#2893)
- tweak(gui): Show Money Per Minute in Player Info List (TheSuperHackers#2738)
- unify(particlesys): Move W3DParticleSys to Core (TheSuperHackers#3014)
- unify(particlesys): Merge W3DParticleSys (TheSuperHackers#3014)
- bugfix(replay): Handle replay deletion during version mismatch prompt (TheSuperHackers#1837)
- bugfix(saveload): Fix aircraft carrier losing its order when saving (TheSuperHackers#2996)
- bugfix(savegame): Fix aircraft carrier ramp state serialized out of bounds (TheSuperHackers#2997)
- bugfix(texture): Fix Generals missing texture and vegetation at lowest texture resolution (TheSuperHackers#3013)
- perf(view): Cache only latest screen-to-terrain result (TheSuperHackers#2992)
- bugfix(contain): Restore retail compatibility after changes to Object::m_containedByID (TheSuperHackers#2868)
- perf(network): Reduce loop complexity for transport messages and remove unused static variables (TheSuperHackers#2659)
- bugfix(particlesys): Prevent accumulation of particle systems in headless mode (TheSuperHackers#3006)
- bugfix(fxlist): Fix unreliable terrain layer selection of particles using CreateAtGroundHeight (TheSuperHackers#3004)
weekly-2026-07-24
Changelog
- bugfix(behavior): Do not fire weapons via the InstantDeathBehavior module while under construction (TheSuperHackers#3002)
- bugfix(saveload): Serialize base state machine in TurretStateMachine and DozerActionStateMachine (TheSuperHackers#2896)
- bugfix(behavior): Allow multiple InstantDeathBehavior modules to be processed (TheSuperHackers#2990)
- bugfix(weapon): Sniper weapons can no longer fire upon empty Stinger Sites (TheSuperHackers#2822)
- tweak(intro): Implement intro skipping with ESC button (TheSuperHackers#2879)
- bugfix(gui): Fix black fade out at the end of the map load screen (TheSuperHackers#2889)
- chore: Use qualified include paths for WWVegas headers (2) (TheSuperHackers#2881)
- tweak(cmake): Use GameSpy SDK from TheSuperHackers repository (TheSuperHackers#2884)
- bugfix(gamelogic): Map player index to slot index for CRC validation (TheSuperHackers#2857)
- bugfix(heightmap): Prevent full terrain rebuild on every frame when DrawEntireTerrain is enabled (TheSuperHackers#2846)
- chore(heightmap): Remove remnants of unimplemented Stretch Terrain and Half Height Map (TheSuperHackers#2846)
- fix(bitflags): Prevent linker errors from multiple defined BitFlags::s_bitNameList (TheSuperHackers#2888)
- chore: Replace CPP_11(= delete) with FUNCTION_DELETE macro to help clang format (TheSuperHackers#2885)
- chore: Remove empty braces in macros to help clang format (TheSuperHackers#2883)
- chore: Use qualified include paths for WWVegas headers (1)
- feat(screenshot): Add threaded JPEG/PNG screenshots without game stalls (TheSuperHackers#1785)
- feat(intro): Add short Intro Logo for The Super Hackers team (TheSuperHackers#2267)
- tweak(intro): Remove superfluous legal page window from intro sequence (TheSuperHackers#2267)
- fix(intro): Remove non functional copyright string and simplify logo movie code (TheSuperHackers#2267)
- refactor(intro): Simplify the intro state machine in Intro class (TheSuperHackers#2267)
- refactor(intro): Move intro related code to new file and class (TheSuperHackers#2267)
- refactor(sphere): Zero initialize SphereClass by default and add Is_Valid function (TheSuperHackers#2855)
- tweak(gamemessage): Reduce number of MSG_DESTROY_SELECTED_GROUP messages (TheSuperHackers#2668)
- unify(ini): Move INI parser files to Core (TheSuperHackers#2863)
- unify(ini): Merge INIMultiplayer starting money parsing from Zero Hour (TheSuperHackers#2863)
weekly-2026-07-17
Changelog
- bugfix(gameengine): Prevent logic time accumulation while the game is halted (TheSuperHackers#2865)
- bugfix(commandxlat): Re-enable right mouse click move commands during camera scrolling (TheSuperHackers#2847)
- tweak(controlbar): Decouple the general promotion star blink from the render frame rate (TheSuperHackers#2835)
- bugfix(ini): Store every debris model name in GenericObjectCreationNugget::parseDebrisObjectNames (TheSuperHackers#2597)
- perf(sortingrenderer): Skip z-sorting for nodes without bounding info in SortingRenderer (TheSuperHackers#2854)
- bugfix(logic): Restore retail compatibility after change to frozen time check (TheSuperHackers#2803)
- unify(controlbar): Move ControlBar files to Core (TheSuperHackers#2849)
- unify(controlbar): Merge ControlBar and related code from Zero Hour (TheSuperHackers#2849)
- fix(gui): Pace whole-screen fade loop through the frame pacer (TheSuperHackers#2848)
- feat(gui): Implement user option to scale the game window transition speed (TheSuperHackers#2840)
- bugfix(pointgroup): Render ground-aligned particles without sorting (TheSuperHackers#2838)
- fix(textureloader): Simplify and fix faulty implementations of texture reduction (2) (TheSuperHackers#2814)
- bugfix(heightmap): Reduce ray cast lengths and fix ray casting in BaseHeightMapRenderObjClass::Cast_Ray (TheSuperHackers#2836)
- bugfix(mouse): Fix bad drag tolerances with high scroll speed factors (TheSuperHackers#2826)
- chore(basetype): Add addition and subtraction functions to Coord2D, Coord3D, ICoord2D, ICoord3D (TheSuperHackers#2826)
- refactor(selectionxlat): Split switch cases of SelectionTranslator::translateGameMessage into separate functions (TheSuperHackers#2819)
- build: Fix compile error in Smudge.h with docker-build (TheSuperHackers#2701)
weekly-2026-07-10
Changelog
- temp skip workflow
- disable engine slowdown when not in focus
- disable WM_INACTIVE audio mute
- Enhance sync-upstream workflow comments and logging
- Add workflow to sync fork with upstream repository
- bugfix(ini): Store every debris model name in GenericObjectCreationNugget::parseDebrisObjectNames (TheSuperHackers#2597)
- perf(sortingrenderer): Skip z-sorting for nodes without bounding info in SortingRenderer (TheSuperHackers#2854)
- bugfix(logic): Restore retail compatibility after change to frozen time check (TheSuperHackers#2803)
- unify(controlbar): Move ControlBar files to Core (TheSuperHackers#2849)
- unify(controlbar): Merge ControlBar and related code from Zero Hour (TheSuperHackers#2849)
- fix(gui): Pace whole-screen fade loop through the frame pacer (TheSuperHackers#2848)
- feat(gui): Implement user option to scale the game window transition speed (TheSuperHackers#2840)
- bugfix(pointgroup): Render ground-aligned particles without sorting (TheSuperHackers#2838)
- fix(textureloader): Simplify and fix faulty implementations of texture reduction (2) (TheSuperHackers#2814)
- bugfix(heightmap): Reduce ray cast lengths and fix ray casting in BaseHeightMapRenderObjClass::Cast_Ray (TheSuperHackers#2836)
- bugfix(mouse): Fix bad drag tolerances with high scroll speed factors (TheSuperHackers#2826)
- chore(basetype): Add addition and subtraction functions to Coord2D, Coord3D, ICoord2D, ICoord3D (TheSuperHackers#2826)
- refactor(selectionxlat): Split switch cases of SelectionTranslator::translateGameMessage into separate functions (TheSuperHackers#2819)
- build: Fix compile error in Smudge.h with docker-build (TheSuperHackers#2701)
weekly-2026-07-03
Changelog
- refactor(basetype): Refactor functions of Coord3D, Region3D to take reference instead of pointer (TheSuperHackers#2830)
- tweak(drawable): Decouple police car light time step from render update (TheSuperHackers#2829)
- tweak(gui): Decouple GUI transition and world animation time step from render update (TheSuperHackers#2056)
- bugfix(view): Fix view ray cast behavior for mouse picks and drawable occlusion (TheSuperHackers#2818)
- unify(update): Parse template references in the AssistedTargetingUpdate module by name (TheSuperHackers#2809)
- refactor(audio): Simplify available audio samples management (TheSuperHackers#2773)
- unify(messagestream): Move all client message translator files to Core (TheSuperHackers#2805)
- fix(update): Fix laser-to-target setup mistake in AssistedTargetingUpdate (TheSuperHackers#2817)
- chore(sortingrenderer): Remove unused function Insert_VolumeParticle (TheSuperHackers#2816)
- refactor(sortingrenderer): Replace custom doubly linked list with std::list in SortingNodeStruct (TheSuperHackers#2810)
- bugfix(logic): Restore retail compatibility after change in CountermeasuresBehavior::calculateCountermeasureToDivertTo (TheSuperHackers#2808)
- chore: Prevent conflict between clang-format and MSVC by wrapping inline assembly blocks in curly braces (TheSuperHackers#2811)
- chore: Prevent conflict between clang-format and pre-C++11 nested template parsing (TheSuperHackers#2760)
- bugfix(ai): Fix bugged unit behavior when attacked during guard mode (TheSuperHackers#2197)
- bugfix(crc): Fix spurious mismatches for disconnected players at low CRC intervals (TheSuperHackers#2796)
- bugfix(network): Improve compare method of command id's to keep network commands in chronological order when overflowing (TheSuperHackers#2736)
- bugfix(pathfinder): Fix inaccurate single unit movement destinations when unobstructed (TheSuperHackers#2296)
- bugfix(textureloader): Fix faulty implementations of texture reduction (TheSuperHackers#2789)
- tweak(textureloader): Remove superfluous texture reduction code from TextureLoadTaskClass::Begin_Uncompressed_Load() (TheSuperHackers#2789)
- refactor(textureloader): Simplify code in Texture Loader (TheSuperHackers#2789)
- bugfix(textureloader): Lift hardcoded texture aspect ratio limit of 1:8 to allow loading all textures with modern gpu (TheSuperHackers#2788)
- perf: Reduce cost of retrieving labels from Waypoint and PolygonTrigger by 90% (TheSuperHackers#2761)
- unify(selectionxlat): Merge SelectionXlat (TheSuperHackers#2792)
- unify(commandxlat): Merge CommandXlat and related code from Zero Hour (TheSuperHackers#2765)
- unify(academystats): Move AcademyStats files to Core and merge related required code (TheSuperHackers#2765)
- feat(options): Implement user option to toggle Right Mouse Scroll with Alternate Mouse (TheSuperHackers#2798)
- unify(translator): Merge message translators from Zero Hour (TheSuperHackers#2794)
- perf(pathfinding): Skip redundant path-exists check in Pathfinder::checkForAdjust() (TheSuperHackers#2791)
- refactor(pathfinder): Simplify implementation of spiral cell search in Pathfinder::adjustDestination() (TheSuperHackers#2790)
- fix(bitflags): Use UnsignedInt64 and %I64X to support VC6 compiler in BitFlags.h (TheSuperHackers#2759)
- fix(milesaudiomanager): Fix audio request kill condition in MilesAudioManager::killAudioEventImmediately() (TheSuperHackers#2784)
- fix(sortingrenderer): Prevent a crash when exceeding the 16-bit index buffer limit (TheSuperHackers#2783)
- refactor(gamelogic): Split switch cases of GameLogic::logicMessageDispatcher into separate functions (TheSuperHackers#2702)
- unify(ww3d2): Move SortingRenderer to Core (TheSuperHackers#2772)
- unify(ww3d2): Merge SortingRenderer (TheSuperHackers#2772)
- perf(gamemessage): Replace GameMessageArgument linked lists with vectors (TheSuperHackers#2700)
- bugfix(contain): Prevent riders from being added to destroyed container object when Reinforcement Pad is destroyed before Troop Crawler drop (TheSuperHackers#2746)
- refactor(metaevent): Split MetaEventTranslator::translateGameMessage() into smaller functions (TheSuperHackers#2758)
- fix(milesaudiomanager): Prevent multithread crashing in MilesAudioManager (TheSuperHackers#2718)
- refactor(milesaudiomanager): Clean up and simplify MilesAudioManager (TheSuperHackers#2718)
- bugfix(object): Avoid crash with dangling contain module in Object::onDestroy() when Reinforcement Pad is destroyed before Troop Crawler drop (TheSuperHackers#2747)
- fix(memory): Fix various memory leaks (2) (TheSuperHackers#2710)
- unify(shroud): Merge W3DShroud code from Zero Hour and implicitly fix black terrain for one frame on far camera jumps (TheSuperHackers#2757)
- fix(metaevent): Ignore order in which modifier keys are released to trigger meta events (TheSuperHackers#2577)
- unify(message): Merge MessageStream, MetaEvent code (TheSuperHackers#2756)
- bugfix(water): Fix river visuals in black shroud (TheSuperHackers#2749)
- fix(memory): Fix audio event related memory leaks when pausing the game (TheSuperHackers#2731)
- fix(particlesys): Simplify ParticleSystemManagerDummy setup (TheSuperHackers#2740)
- fix(particlesys): Decouple particle systems from logic crc (TheSuperHackers#2742)
- bugfix(gameengine): Fix logic in GameEngine::canUpdateRegularGameLogic() (TheSuperHackers#2707)
- fix(recorder): Fix memory leak of RecorderClass::m_crcInfo (TheSuperHackers#2713)
- bugfix(aigroup): Prevent game crash when a player is selected in Replay playback (2) (TheSuperHackers#2711)
- perf(network): Replace extern global network variables with const ones (TheSuperHackers#2726)
- refactor(network): Use switch cases in utility functions for network commands (TheSuperHackers#2725)
- fix(particlesys): Add or simplify null-checks to createParticleSystem calls (TheSuperHackers#2724)
- fix(network): Verify accepted type of incoming game messages (TheSuperHackers#2708)
- bugfix(physics): Prevent building crash damage from dealing damage to other objects (TheSuperHackers#2723)
- bugfix(physics): Prevent dead units from repeatedly dealing crash damage on collision with non-buildings (TheSuperHackers#2204)
- fix(gameengine): Remove music tracks as prerequisite to initialize the game engine (TheSuperHackers#2737)
- bugfix: Restore retail compatibility after retail behavior flags change (TheSuperHackers#2727)
- refactor(netpacket): Simplify NetPacket functions for packet buffer reads (TheSuperHackers#2463)
- fix(object): Prevent crash if Object::m_drawable is a nullptr on save load (TheSuperHackers#2712)
- unify(ww3d2): Move dx8fvf, dx8indexbuffer, dx8vertexbuffer to Core (TheSuperHackers#2706)
- bugfix(contain): Abort containee's AIExitState if its container object dies (TheSuperHackers#2513)
- chore(gamemessage): Clean up GameMessage::getCommandTypeAsString (TheSuperHackers#2695)
- unify(gamelogic): Move most GameLogic System files to Core (TheSuperHackers#2698)
- unify(gamelogic): Merge GameLogicDispatch and related code (TheSuperHackers#2698)
- bugfix(input): Revert changes to local group creation (TheSuperHackers#2694)
weekly-2026-06-26
Changelog
- chore: Apply clang-format to entire codebase
- refactor(audio): Simplify available audio samples management (TheSuperHackers#2773)
- unify(messagestream): Move all client message translator files to Core (TheSuperHackers#2805)
- fix(update): Fix laser-to-target setup mistake in AssistedTargetingUpdate (TheSuperHackers#2817)
- chore(sortingrenderer): Remove unused function Insert_VolumeParticle (TheSuperHackers#2816)
- refactor(sortingrenderer): Replace custom doubly linked list with std::list in SortingNodeStruct (TheSuperHackers#2810)
- bugfix(logic): Restore retail compatibility after change in CountermeasuresBehavior::calculateCountermeasureToDivertTo (TheSuperHackers#2808)
- chore: Prevent conflict between clang-format and MSVC by wrapping inline assembly blocks in curly braces (TheSuperHackers#2811)
- chore: Prevent conflict between clang-format and pre-C++11 nested template parsing (TheSuperHackers#2760)
- bugfix(ai): Fix bugged unit behavior when attacked during guard mode (TheSuperHackers#2197)
- bugfix(crc): Fix spurious mismatches for disconnected players at low CRC intervals (TheSuperHackers#2796)
- bugfix(network): Improve compare method of command id's to keep network commands in chronological order when overflowing (TheSuperHackers#2736)
- bugfix(pathfinder): Fix inaccurate single unit movement destinations when unobstructed (TheSuperHackers#2296)
- bugfix(textureloader): Fix faulty implementations of texture reduction (TheSuperHackers#2789)
- tweak(textureloader): Remove superfluous texture reduction code from TextureLoadTaskClass::Begin_Uncompressed_Load() (TheSuperHackers#2789)
- refactor(textureloader): Simplify code in Texture Loader (TheSuperHackers#2789)
- bugfix(textureloader): Lift hardcoded texture aspect ratio limit of 1:8 to allow loading all textures with modern gpu (TheSuperHackers#2788)
- perf: Reduce cost of retrieving labels from Waypoint and PolygonTrigger by 90% (TheSuperHackers#2761)
- unify(selectionxlat): Merge SelectionXlat (TheSuperHackers#2792)
- unify(commandxlat): Merge CommandXlat and related code from Zero Hour (TheSuperHackers#2765)
- unify(academystats): Move AcademyStats files to Core and merge related required code (TheSuperHackers#2765)
- feat(options): Implement user option to toggle Right Mouse Scroll with Alternate Mouse (TheSuperHackers#2798)
- unify(translator): Merge message translators from Zero Hour (TheSuperHackers#2794)
- perf(pathfinding): Skip redundant path-exists check in Pathfinder::checkForAdjust() (TheSuperHackers#2791)
- refactor(pathfinder): Simplify implementation of spiral cell search in Pathfinder::adjustDestination() (TheSuperHackers#2790)
- fix(bitflags): Use UnsignedInt64 and %I64X to support VC6 compiler in BitFlags.h (TheSuperHackers#2759)
- fix(milesaudiomanager): Fix audio request kill condition in MilesAudioManager::killAudioEventImmediately() (TheSuperHackers#2784)
- fix(sortingrenderer): Prevent a crash when exceeding the 16-bit index buffer limit (TheSuperHackers#2783)
- refactor(gamelogic): Split switch cases of GameLogic::logicMessageDispatcher into separate functions (TheSuperHackers#2702)
- unify(ww3d2): Move SortingRenderer to Core (TheSuperHackers#2772)
- unify(ww3d2): Merge SortingRenderer (TheSuperHackers#2772)
- perf(gamemessage): Replace GameMessageArgument linked lists with vectors (TheSuperHackers#2700)
- bugfix(contain): Prevent riders from being added to destroyed container object when Reinforcement Pad is destroyed before Troop Crawler drop (TheSuperHackers#2746)
- refactor(metaevent): Split MetaEventTranslator::translateGameMessage() into smaller functions (TheSuperHackers#2758)
- fix(milesaudiomanager): Prevent multithread crashing in MilesAudioManager (TheSuperHackers#2718)
- refactor(milesaudiomanager): Clean up and simplify MilesAudioManager (TheSuperHackers#2718)
- bugfix(object): Avoid crash with dangling contain module in Object::onDestroy() when Reinforcement Pad is destroyed before Troop Crawler drop (TheSuperHackers#2747)
- fix(memory): Fix various memory leaks (2) (TheSuperHackers#2710)
- unify(shroud): Merge W3DShroud code from Zero Hour and implicitly fix black terrain for one frame on far camera jumps (TheSuperHackers#2757)
- fix(metaevent): Ignore order in which modifier keys are released to trigger meta events (TheSuperHackers#2577)
- unify(message): Merge MessageStream, MetaEvent code (TheSuperHackers#2756)
- bugfix(water): Fix river visuals in black shroud (TheSuperHackers#2749)
- fix(memory): Fix audio event related memory leaks when pausing the game (TheSuperHackers#2731)
- fix(particlesys): Simplify ParticleSystemManagerDummy setup (TheSuperHackers#2740)
- fix(particlesys): Decouple particle systems from logic crc (TheSuperHackers#2742)
- bugfix(gameengine): Fix logic in GameEngine::canUpdateRegularGameLogic() (TheSuperHackers#2707)
- fix(recorder): Fix memory leak of RecorderClass::m_crcInfo (TheSuperHackers#2713)
- bugfix(aigroup): Prevent game crash when a player is selected in Replay playback (2) (TheSuperHackers#2711)
- perf(network): Replace extern global network variables with const ones (TheSuperHackers#2726)
- refactor(network): Use switch cases in utility functions for network commands (TheSuperHackers#2725)
- fix(particlesys): Add or simplify null-checks to createParticleSystem calls (TheSuperHackers#2724)
- fix(network): Verify accepted type of incoming game messages (TheSuperHackers#2708)
- bugfix(physics): Prevent building crash damage from dealing damage to other objects (TheSuperHackers#2723)
- bugfix(physics): Prevent dead units from repeatedly dealing crash damage on collision with non-buildings (TheSuperHackers#2204)
- fix(gameengine): Remove music tracks as prerequisite to initialize the game engine (TheSuperHackers#2737)
- bugfix: Restore retail compatibility after retail behavior flags change (TheSuperHackers#2727)
- refactor(netpacket): Simplify NetPacket functions for packet buffer reads (TheSuperHackers#2463)
- fix(object): Prevent crash if Object::m_drawable is a nullptr on save load (TheSuperHackers#2712)
- unify(ww3d2): Move dx8fvf, dx8indexbuffer, dx8vertexbuffer to Core (TheSuperHackers#2706)
- bugfix(contain): Abort containee's AIExitState if its container object dies (TheSuperHackers#2513)
- chore(gamemessage): Clean up GameMessage::getCommandTypeAsString (TheSuperHackers#2695)
- unify(gamelogic): Move most GameLogic System files to Core (TheSuperHackers#2698)
- unify(gamelogic): Merge GameLogicDispatch and related code (TheSuperHackers#2698)
- bugfix(input): Revert changes to local group creation (TheSuperHackers#2694)
weekly-2026-06-12
Changelog
- refactor(gamelogic): Split switch cases of GameLogic::logicMessageDispatcher into separate functions (TheSuperHackers#2702)
- unify(ww3d2): Move SortingRenderer to Core (TheSuperHackers#2772)
- unify(ww3d2): Merge SortingRenderer (TheSuperHackers#2772)
- perf(gamemessage): Replace GameMessageArgument linked lists with vectors (TheSuperHackers#2700)
- bugfix(contain): Prevent riders from being added to destroyed container object when Reinforcement Pad is destroyed before Troop Crawler drop (TheSuperHackers#2746)
- refactor(metaevent): Split MetaEventTranslator::translateGameMessage() into smaller functions (TheSuperHackers#2758)
- fix(milesaudiomanager): Prevent multithread crashing in MilesAudioManager (TheSuperHackers#2718)
- refactor(milesaudiomanager): Clean up and simplify MilesAudioManager (TheSuperHackers#2718)
- bugfix(object): Avoid crash with dangling contain module in Object::onDestroy() when Reinforcement Pad is destroyed before Troop Crawler drop (TheSuperHackers#2747)
- fix(memory): Fix various memory leaks (2) (TheSuperHackers#2710)
- unify(shroud): Merge W3DShroud code from Zero Hour and implicitly fix black terrain for one frame on far camera jumps (TheSuperHackers#2757)
- fix(metaevent): Ignore order in which modifier keys are released to trigger meta events (TheSuperHackers#2577)
- unify(message): Merge MessageStream, MetaEvent code (TheSuperHackers#2756)
- bugfix(water): Fix river visuals in black shroud (TheSuperHackers#2749)
- fix(memory): Fix audio event related memory leaks when pausing the game (TheSuperHackers#2731)