Repository navigation
weekly-2026-09-12
·
88 commits
to main
since this release
Changelog
- ci(build-toolchain): stop requesting permissions from the reusable workflow
- 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)
- 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)
- 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)
- 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)
- 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)
- 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)
- 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)
- refactor: Remove the W3DMPO class to remove clutter and unnecessary vtables (TheSuperHackers#2607)
- refactor: Split preserve retail behavior flags (TheSuperHackers#2691)
- unify(ww3d2): Merge dx8fvf, dx8indexbuffer, dx8vertexbuffer (TheSuperHackers#2690)
- refactor: Add override keyword to virtual function overrides in Core code (2) (TheSuperHackers#2603)
- fix(heightmap): Properly draw larger terrain area on low camera pitch (TheSuperHackers#2677)
- chore(heightmap): Implement HeightMapRenderObjClass::setTerrainDrawSize() to set custom draw sizes (TheSuperHackers#2677)
- perf(heightmap): Update terrain tiles only if the terrain draw origin has really changed (TheSuperHackers#2677)
- bugfix(heightmap): Do full terrain update after new origin position was set (TheSuperHackers#2677)
- chore(heightmap): Remove useless logic in HeightMapRenderObjClass::updateCenter() (TheSuperHackers#2677)
- tweak(view): Align the camera far clip plane with the actual terrain draw size (TheSuperHackers#2677)
- refactor: Add override keyword to virtual function overrides in Zero Hour code (2) (TheSuperHackers#2605)
- refactor: Add override keyword to virtual function overrides in Generals code (2) (TheSuperHackers#2604)
- bugfix(gamelogic): Modules now cease updating when disabled by non-whitelisted disabled types (TheSuperHackers#2458)
- fix(lookat): Fix mouse anchor and direction issue for camera pitch (TheSuperHackers#2681)
- bugfix(controlbar): Show shortcut special powers in Generals again (TheSuperHackers#2680)
- bugfix(veterancy): Disable audiovisual cues for ejected veteran pilots (TheSuperHackers#2643)
- bugfix(player): Fix transferred in-progress upgrades (TheSuperHackers#2396)
- tweak(gamemessage): Remove unused MSG_AREA_SELECTION message from game logic (TheSuperHackers#2667)
- build(docker): Set correct targets in docker-build.sh (TheSuperHackers#2678)
- unify(gadget): Move Gadget files to Core (TheSuperHackers#2672)
- unify(gadget): Merge Gadget and related code from Zero Hour (TheSuperHackers#2672)
- bugfix(watertracks): Correct the path handling for .wak files in the WaterTracksRenderSystem (TheSuperHackers#2634)
- fix(aiupdate): Fix XFER and CRC of AIUpdateInterface::m_guardTargetType (TheSuperHackers#2662)
- chore(player): Remove unused GameMessage argument from Player member functions (TheSuperHackers#2669)
- bugfix(aiplayer): Preserve scaffold health when AI building completes (TheSuperHackers#1768)
- chore(filesystem): Implement getExtension() and TheFileSystem::removeExtension() functions (TheSuperHackers#2635)
- chore(string): Implement find() and reverseFind() functions in UnicodeString (TheSuperHackers#2635)
- chore(string): Remove unused removeExtension() function from GameState.cpp (TheSuperHackers#2635)
- tweak(gamemessage): Remove unused argument of MSG_DESTROY_SELECTED_GROUP (TheSuperHackers#2664)
- perf: Remove superfluous null tests in iterateObjects callbacks (TheSuperHackers#2658)
- chore(controlbar): Add asserts to verify special power templates and buttons (TheSuperHackers#2657)
- unify(controlbar): Merge ControlBar and related code from Zero Hour (TheSuperHackers#2655)
- feat: Implement game exit with ALT+F4 and game window close button (TheSuperHackers#2336)
- fix(view): Prevent the camera from clipping under terrain (TheSuperHackers#2652)
- docs(readme): Add section about profiling (TheSuperHackers#2202)
- feat(profiling): Add trace zones and frame marks to Tracy profiling (TheSuperHackers#2202)
- feat(profiling): Add messages on game start and game end to Tracy profiling (TheSuperHackers#2202)
- feat(profiling): Add plots for logical frame number and pathfinding cells/paths to Tracy profiling (TheSuperHackers#2202)
- feat(profiling): Add frame image capturing to Tracy profiling (TheSuperHackers#2202)
- feat(profiling): Include Tracy profiler library in the solution (TheSuperHackers#2202)
- refactor(profiling): Move rts/profile.h include into WWCommon.h (TheSuperHackers#2202)
- refactor(profiling): Rename RTS_PROFILE to RTS_PROFILE_LEGACY (TheSuperHackers#2202)
- refactor(profiling): Rename legacy profile library target (TheSuperHackers#2202)
- bugfix(view): Set camera far z to acceptable distance (TheSuperHackers#2653)
- tweak(view): Implement smooth terrain sampling for camera positioning (TheSuperHackers#2651)
- refactor: Eliminate macro-split assignments (TheSuperHackers#2641)
- feat(view): Save position and view direction of player camera in MSG_SET_REPLAY_CAMERA (TheSuperHackers#2631)
- feat(options): Implement game options for texture filter mode and anisotropy level (TheSuperHackers#2482)
- feat(options): Implement game option to set MSAA level (TheSuperHackers#2482)
- bugfix(gui): Remove slider bounds checks to prevent unexpected reset of custom settings (TheSuperHackers#2624)
- unify(client): Move GameClient display and system files to Core (TheSuperHackers#2616)
- docs: Amend code generation guidelines to CONTRIBUTING.md (TheSuperHackers#2628)
- perf(gui): Significantly reduce cost of 2d render elements (TheSuperHackers#2514)
- fix: Fix unused variables in WW3D (TheSuperHackers#2629)
- chore(dx8fvf): Remove unused vertex_size parameter from FVFInfoClass (TheSuperHackers#2615)
- bugfix(view): Fix ground level of bookmarks, replay camera and game world microphone (TheSuperHackers#2595)
- style(guiedit): Adjust indentation for combo box data output in save function (TheSuperHackers#2625)
- refactor: Remove superfluous returns at the end of functions (TheSuperHackers#2594)
- bugfix: Delay creation of object bound particle emitters until ParticleSystemManager is xfer-loaded (TheSuperHackers#2333)
- bugfix(input): Block all button presses except ESC during scripted camera scenes (TheSuperHackers#2621)
- bugfix(connection): Remove incorrect magic byte check for map transfers (TheSuperHackers#2614)
- refactor(metaevent): Move meta event type asserts from key event update to engine initialization (TheSuperHackers#2590)
- bugfix(water): Fix river borders appearing darkened under shroud (TheSuperHackers#2592)
- refactor: Remove redundant void argument from functions (2) (TheSuperHackers#2609)
- unify(ww3d2): Merge dx8renderer, dx8rendererdebugger (TheSuperHackers#2600)
- fix: Fix assertion format argument for non-trivial types (TheSuperHackers#2606)
- refactor(ini): Simplify token related INI code (TheSuperHackers#2596)
- refactor(recorder): Remove code duplications related to file write and logging in RecorderClass (TheSuperHackers#2543)
- bugfix(dumbprojectile): Fix in-flight DumbProjectile detonating instantly on save load (TheSuperHackers#2591)
- bugfix(input): Fix touchpad upward scrolling in UI list boxes (TheSuperHackers#2586)
- unify(ww3d2): Move dx8wrapper, dx8caps to Core (TheSuperHackers#2599)
- fix(view): Improve setup of default camera pitch and angle (TheSuperHackers#2546)
- fix(ini): Support plus sign prefix in INI integer parse (TheSuperHackers#2576)
- fix(ini): Replace unsafe uses of INI::getNextTokenOrNull (TheSuperHackers#2593)
- bugfix(audiomanager): Fix dummy audio manager implementation for failing audio length script conditions in headless mode (TheSuperHackers#2313)
- bugfix(money): Fix undefined behavior for starting cash combo box (TheSuperHackers#2582)
- bugfix(view): Prevent overshooting camera zooming or pivoting on low frame rates (TheSuperHackers#2588)
- bugfix(view): Fix malformed camera area constraints during cutscenes (TheSuperHackers#2587)
- fix(pathfinder): Fix CRC computation of PathFinder::m_wallPieces (TheSuperHackers#2575)
- bugfix(energy): Don't apply power production bonus for disabled power plants on save game load (TheSuperHackers#2509)
- bugfix(energy): Don't increase power production for disabled power plants on save game load (TheSuperHackers#2508)
- bugfix(input): Use time-based double tap for unit group centering (TheSuperHackers#2545)
- refactor: Add override keyword to virtual function overrides in Tools and set compile option -Wsuggest-override (TheSuperHackers#2394)
- unify(ww3d2): Merge dx8wrapper, dx8caps, shdlib (TheSuperHackers#2499)
- fix(view): Introduce PRESERVE_RETAIL_SCRIPTED_CAMERA and fix or improve camera offset and zoom calculations (TheSuperHackers#2524)
- bugfix(dx8): Improve display mode transition reliability (TheSuperHackers#2539)
- ci: Disable vcpkg build (TheSuperHackers#2544)
- fix: Resolve macro redefinition warnings (TheSuperHackers#2525)
- refactor(ini): Simplify some INI code (TheSuperHackers#2541)
- tweak(radar): Suppress under attack radar notification spam (TheSuperHackers#2540)
- bugfix(treebuffer): Fix crash in W3DTreeBuffer::updateVertexBuffer() (TheSuperHackers#2526)
- fix(actionmanager): Improve validation of Sneak Attack placement legality (TheSuperHackers#2533)
- fix(skirmish): Improve determinism for restarted games by resetting slot values (TheSuperHackers#2373)
- perf(ini): Improve INI parsing performance by using std::from_chars (TheSuperHackers#2532)
- fix(targa): Fix TGA2 footer signature truncation by using strncpy (TheSuperHackers#2527)
- refactor(ini): Clean up INI type table and its search logic (TheSuperHackers#2511)
- fix(connection): Implement file content validation for map transfers (TheSuperHackers#1819)
- fix(refcount): Fix compile warning in constructors of RefCountClass (TheSuperHackers#2521)
- refactor: Remove string conversion code for MessageBox (TheSuperHackers#2523)
- refactor: Remove superfluous extern keyword from variable declarations (TheSuperHackers#2522)
- refactor(view): Remove friends from ViewLocation class (TheSuperHackers#2516)
- bugfix(object): Guard GameLogic xfer version bump with RETAIL_COMPATIBLE_XFER_SAVE (TheSuperHackers#2418)
- refactor(ww3d2): Simplify dx8wrapper's frame statistics with struct (TheSuperHackers#2507)
- refactor(object): Replace explicit local player checks with Object::isLocallyControlled (TheSuperHackers#2512)
- chore: Remove unused code in dx8wrapper (TheSuperHackers#2504)
- chore: Remove all code related to _XBOX (TheSuperHackers#2505)
- bugfix(view): Fix and improve camera pivoting (TheSuperHackers#2506)
- bugfix(view): Fix and improve camera area constraints behavior (TheSuperHackers#2506)
- bugfix(smudge): Decouple smudge time step from render update (TheSuperHackers#2484)
- bugfix(contain): Restore retail compatibility after crash fix in OpenContain::killAllContained (TheSuperHackers#2439)
- bugfix(contain): Restore retail compatibility after crash fix in OpenContain::processDamageToContained (TheSuperHackers#2427)
- fix(smudge): Align smudges Y offset range with X offset range (TheSuperHackers#2498)
- bugfix(globaldata): Fix the handling of documents folder redirection by using SHGetKnownFolderPath() (TheSuperHackers#2479)
- refactor: Add override keyword to virtual function overrides in GameEngineDevice (TheSuperHackers#2393)
- refactor: Add override keyword to virtual function overrides in Libraries (TheSuperHackers#2390)
- fix(headless): Set DX8Wrapper_IsWindowed to false to suppress assertion dialogs during shutdown (TheSuperHackers#2298)
- bugfix(logic): Fix broken camera edge scroll after loading a savegame from the ingame menu (TheSuperHackers#2000)
- bugfix(pathfinder): Improve initialization of uninitialized variable in Pathfinder::classifyFence (TheSuperHackers#2460)
- fix(logic): Add nullptr check to msgPlayer in GameLogic::logicMessageDispatcher (TheSuperHackers#2383)
- refactor(logic): Rename thisPlayer to msgPlayer in GameLogic::logicMessageDispatcher (TheSuperHackers#2383)
- fix(smudge): Fix minor errors in W3DSmudge (TheSuperHackers#2483)
- tweak(gui): Enable minimize button for game app window (TheSuperHackers#2473)
- bugfix(battleplan): Battle plans are now transferred to the new owner on capture (TheSuperHackers#2257)
- bugfix(battleplan): Multiple battle plans are now always applied correctly (TheSuperHackers#2256)
- chore: Remove debug code for KRIS_BRUTAL_HACK_FOR_AIRCRAFT_CARRIER_DEBUGGING (TheSuperHackers#2478)
- perf(pathfinder): Implement conditional reverse insertion sorting algorithm to reduce cost of long pathfinding by 50-66% (TheSuperHackers#2450)
- fix(pathfinder): Remove invalid retail compatible compilation conditional (TheSuperHackers#2477)
- refactor(bitflags): Simplify functions in BitFlags class (TheSuperHackers#2472)
- refactor(bitflags): Simplify conditions with testForAny, testForAll and remove unexpected assert in BitFlags::testForAll (TheSuperHackers#2476)
- feat(headless): Implement ParticleSystemManagerDummy (TheSuperHackers#2247)
- feat(headless): Implement ViewDummy (TheSuperHackers#2246)
- feat(headless): Implement GhostObjectManagerDummy (TheSuperHackers#2244)
- feat(rendering): Add support for multi sample anti-aliasing (MSAA) (TheSuperHackers#2454)
- ci(actions): Update GitHub Actions to latest versions and fixed hashes (TheSuperHackers#2377)
- feat(texturefilter): Extend texture filter with new filtering modes; none, point, bilinear, trilinear, anisotropic (TheSuperHackers#2423)
- chore(texturefilter): Cleanup code formatting and remove commented blocks (TheSuperHackers#2423)
- refactor: Add override keyword to virtual function overrides in GameEngine (2) (TheSuperHackers#2392)
- fix(docker): Fix docker WORKDIR ownership (TheSuperHackers#2459)
- bugfix(contain): Occupants killed by their containers now kill their occupants (TheSuperHackers#2239)
- fix(logic): Improve validation of MSG_SET_RALLY_POINT in GameLogicDispatch (TheSuperHackers#2441)
- fix(logic): Improve validation of MSG_NEW_GAME in GameLogicDispatch (TheSuperHackers#2440)
- fix(logic): Improve handling of ENABLE_RETALIATION_MODE in GameLogicDispatch (TheSuperHackers#2408)
- fix(logic): Improve validation of MSG_DO_SPECIAL_POWER and variants in GameLogicDispatch (TheSuperHackers#2380)
- bugfix(rallypoint): Make healed units follow building rally point on exit (TheSuperHackers#1822)
- bugfix(supply): Implement proportional supply bonus scaling to fix too generous money deposits for partial supply drops (TheSuperHackers#2431)
- bugfix(smudge): Fix Microwave Heat Haze blackout on forced AA (TheSuperHackers#2374)
- refactor: Add override keyword to virtual function overrides in GameEngine (TheSuperHackers#2391)
- unify(logic): Merge game loading related variables and functions from Zero Hour (TheSuperHackers#2444)
- fix(pathfinder): Implement robust forward insertion sort for PathfindCell::putOnSortedOpenList() (TheSuperHackers#2432)
- refactor(netpacket): Simplify NetPacket functions for packet buffer writes and size tests (TheSuperHackers#2329)
- refactor(netcommandmsg): Rename NetCommandMsg::getPackedByteCount to NetCommandMsg::getSizeForNetPacket (TheSuperHackers#2329)
- refactor(netcommandmsg): Simplify net messages NetAckBothCommandMsg, NetAckStage1CommandMsg, NetAckStage2CommandMsg (TheSuperHackers#2329)
- chore(network): Add new NetAckCommandMsg (TheSuperHackers#2329)
- fix(network): Fix constness around NetCommandMsg (TheSuperHackers#2329)