Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
344 commits
Select commit Hold shift + click to select a range
568a162
feat(client): Make opacity and shadows of build placement preview obj…
xezon Sep 20, 2025
dca765f
refactor(pathfinder): Remove superfluous whitespace and commented cod…
Mauller Sep 21, 2025
1875dbf
bugfix(input): Double-clicking to place a building no longer performs…
Stubbjax Sep 21, 2025
a2cebd8
bugfix(module): Fix damage calculation for determining the initial de…
Stubbjax Sep 23, 2025
cd86cc4
bugfix(input): Fix broken single click command after right mouse doub…
xezon Sep 23, 2025
80cc300
refactor(tree): Simplify W3DTreeDraw related code (#1614)
xezon Sep 23, 2025
5a9a526
bugfix(tree): Fix 1 in 10 trees not swaying (#1613)
xezon Sep 23, 2025
48054ec
perf(behavior): Optimize loops in ParkingPlaceBehavior (#1618)
xezon Sep 23, 2025
e87031f
bugfix(buildassistant): Prevent showing the invalid placement indicat…
Stubbjax Sep 25, 2025
e8ef120
bugfix(gui): Consistently show blue health bars for disabled objects …
Stubbjax Sep 25, 2025
5ba1741
bugfix(module): GLA Battle Bus can no longer be subdued indefinitely …
Stubbjax Sep 25, 2025
04b968f
bugfix(contain): Fix unit attachments being visible in fog after exit…
Stubbjax Sep 26, 2025
63ec8d0
tweak(options): Simplify user options for Cursor Capture (#1541)
xezon Sep 27, 2025
abe8dba
bugfix(input): Fix cargo units selection hack (#1635)
xezon Sep 27, 2025
777eae8
refactor(ww3d): Rename WW3D::Get_Frame_Time to WW3D::Get_Sync_Frame_T…
xezon Sep 13, 2025
e0d992f
bugfix(draw): Fix tank draw update logic step time is smaller than re…
xezon Sep 13, 2025
a9a69f6
tweak(snow): Decouple snow render update from logic step (#1579)
xezon Sep 13, 2025
bfa5671
tweak(segline): Decouple segline render update from logic step (#1579)
xezon Sep 13, 2025
4aabdcc
bugfix(anim): Fix calling Animatable3DObjClass::Single_Anim_Progress …
xezon Sep 13, 2025
abf86fa
tweak(anim): Decouple anim object render update from logic step (#1579)
xezon Sep 13, 2025
eee445d
bugfix(ww3d): Bind the ww3d sync step to the game logic step (#1579)
xezon Sep 13, 2025
5dd9d6a
refactor(anim): Cleanup and simplify animation code a bit (#1579)
xezon Sep 13, 2025
26c5a9b
tweak(anim): Enable interpolation for raw animation updates and coupl…
xezon Sep 14, 2025
792d17d
tweak(heightmap): Decouple cloud render update from logic step (#1579)
xezon Sep 14, 2025
7ac7a41
bugfix(drawable): Fix locked color in Drawable::colorTint, EMPUpdate:…
xezon Sep 14, 2025
8dc210c
tweak(ww3d): Decouple render update from logic step in RingRenderObjC…
xezon Sep 14, 2025
2683d1b
tweak(ww3d): Decouple render update from logic step in DazzleRenderOb…
xezon Sep 14, 2025
049ef5f
tweak(w3dview): Decouple WWAudioClass update from logic step (#1579)
xezon Sep 15, 2025
2bbf902
fix(shadow): Fix counting of W3DProjectedShadowManager::m_numDecalSha…
xezon Sep 27, 2025
0193ad2
bugfix(buildassistant): Fix Network game mismatch by using the correc…
Stubbjax Sep 30, 2025
098f638
bugfix(debug): Fix missing toggle for DEMO_TOGGLE_NO_DRAW (#1633)
xezon Sep 30, 2025
9174d63
bugfix(lan): Always allow players to join a LAN room if there is an o…
Stubbjax Sep 30, 2025
e13efd4
bugfix(network): Fix Network stalling state (#1650)
xezon Sep 30, 2025
c830b3b
refactor: Remove obsolete pragma optimize directives (#1649)
xezon Sep 30, 2025
358f660
refactor(terrain): Simplify cloud movement clamping (#1648)
xezon Sep 30, 2025
538407f
bugfix(camera): Decouple camera zoom update from logic time (#1655)
xezon Sep 30, 2025
93e7ea8
tweak(water): Decouple water movement time step from render update (#…
xezon Sep 30, 2025
3ae6b3a
tweak(water): Decouple wave movement time step from render update (#1…
xezon Sep 30, 2025
ca90e3d
feat(ui): Implement simple Latency and FPS display (#1546)
L3-M Sep 30, 2025
c2c5336
refactor(pathfinder): Simplify and improve readability of PathfindCel…
Mauller Sep 21, 2025
733d677
refactor(pathfinder): Simplify and improve readability of Pathfinder:…
Mauller Sep 21, 2025
824e3f8
refactor(pathfinder): Simplify and improve readability of Pathfinder:…
Mauller Sep 21, 2025
ab2c835
refactor(pathfinder): Extract functionality Pathfinder::checkCellOuts…
Mauller Sep 30, 2025
6c6e05b
refactor(pathfinder): Simplify and improve readability of Pathfinder:…
Mauller Sep 30, 2025
172362c
refactor(pathfinder): Simplify and improve readability of Pathfinder:…
Mauller Sep 22, 2025
455b8e8
refactor(pathfinder): Simplify and improve readability of Pathfinder:…
Mauller Sep 22, 2025
3ce09e5
refactor(pathfinder): Simplify and improve readability of Pathfinder:…
Mauller Sep 22, 2025
487e5ce
refactor(pathfinder): Simplify and improve readability of Pathfinder:…
Mauller Sep 22, 2025
9697c73
refactor(jetaiupdate): Rename variable in JetPauseBeforeTakeoffState …
xezon Sep 22, 2025
4eeb20e
bugfix(jetaiupdate): Fix pairs of Jets not waiting for each other bef…
xezon Sep 22, 2025
16ff7e4
bugfix(network): Fix clearing remote player commands in Connection::c…
Stubbjax Oct 7, 2025
341bef2
tweak(drawable): Decouple tint update step from render update (#1651)
xezon Oct 7, 2025
605b9b3
tweak(fps): Simplify function W3DDisplay::updateAverageFPS() and remo…
xezon Oct 7, 2025
893a557
fix(debug): Fix wrong assert condition in W3DTreeDraw::addToTreeBuffe…
xezon Oct 7, 2025
dbdcd89
tweak(module): Add 'TransferSelection' field to CreateObjectDie INI m…
Stubbjax Oct 7, 2025
fe49f3b
bugfix(tunnel): Fix stacked unit healing time inside multiple GLA Tun…
Stubbjax Oct 8, 2025
870f41c
refactor(network): Extract magic NetPacket character literals into na…
bobtista Oct 8, 2025
11b61d5
fix(quotedprintable): Fix assert in AsciiStringToQuotedPrintable duri…
xezon Sep 30, 2025
6d10c91
refactor(quotedprintable): Simplify and modernize code in QuotedPrint…
xezon Sep 30, 2025
fbb1ca4
refactor(utils): Move STLUtils.h to WWLib (#1679)
xezon Oct 9, 2025
89858fb
refactor(pathfinder): Simplify and improve readability of Pathfinder:…
Mauller Sep 23, 2025
155280b
refactor(pathfinder): Simplify and improve readability of Pathfinder:…
Mauller Sep 24, 2025
c95e79b
refactor(pathfinder): Simplify and improve readability of Pathfinder:…
Mauller Sep 28, 2025
8c02b22
refactor(pathfinder): Simplify and improve readability of Pathfinder:…
Mauller Sep 28, 2025
6c9a975
refactor(pathfinder): Simplify and improve readability of Pathfinder:…
Mauller Sep 30, 2025
9e42e59
tweak(gamelod): Simplify game detail setup for Options Menu (#1628)
xezon Oct 11, 2025
42bc6b0
feat(gamelod): Implement 'Very High' system spec (#1629)
xezon Oct 11, 2025
5155aea
bugfix(gamelod): Disable the recommended static lod level for texture…
xezon Oct 12, 2025
ebe28dc
refactor(gamelod): Simplify texture reduction code (#1631)
xezon Oct 12, 2025
403696c
tweak(gamelod): Disable changing display settings when clicking the D…
xezon Oct 12, 2025
6620cc3
refactor(gameengine): Move game time related code into new FramePacer…
xezon Oct 14, 2025
c12bab6
bugfix(fps): Fix crashes and ww3d updates in tools (#1688)
xezon Oct 14, 2025
affa598
refactor(gui): Remove duplicate code in score screen (#1699)
Stubbjax Oct 15, 2025
1e37075
refactor(lan): Simplify LAN player tooltip related code (#1693)
xezon Oct 13, 2025
9ede47f
tweak(lan): Hide computer identity in LAN lobby (#1693)
xezon Oct 13, 2025
630f6df
fix: Replace strncpy with strlcpy for robustness (#1533)
Skyaero42 Oct 15, 2025
14211bb
build(memory): Add placement new for VC6 compat with GameMemoryNull (…
slurmlord Oct 15, 2025
47b4cdc
fix: Replace strcat with strlcat for robustness (#1685)
Skyaero42 Oct 15, 2025
9e4b82f
fix: Replace strncat with strlcat for robustness (#1677)
Skyaero42 Oct 15, 2025
eb7093e
tweak(shadow): Double 3D shadow buffers in W3DBufferManager (#1691)
xezon Oct 15, 2025
9ba92fa
tweak(tree): Decouple tree sway, topple and sink time step from rende…
xezon Oct 15, 2025
3b78b63
fix: Replace wcsncpy with wcslcpy for robustness (#1676)
Skyaero42 Oct 16, 2025
57a8949
bugfix(anim): Fix single animation updates (#1702)
xezon Oct 16, 2025
76a2f4a
bugfix(object): Reward unit experience for kills caused by OCL object…
Stubbjax Oct 16, 2025
441e1aa
bugfix(behavior): Fix unexpected propaganda influence from contained …
Stubbjax Oct 16, 2025
08e59cb
bugfix(lan): Fix LANAPI init error (#1704)
xezon Oct 16, 2025
6748e68
feat(filesystem): Implement access to shadowed files inside archives …
xezon Oct 16, 2025
cb57c1b
refactor: Remove redundant CppMacros.h includes (#1706)
xezon Oct 17, 2025
b838c65
feat(filesystem): Recover 481 higher resolution textures in Zero Hour…
xezon Oct 18, 2025
8fa506b
fix: Revert strlcat on pointer arguments (#1713)
Skyaero42 Oct 19, 2025
2b791f2
refactor(ghostobject): Simplify code and style in GhostObject, W3DGho…
xezon Sep 12, 2025
71e56f6
build(ghostobject): Fix compile error when enabling DEBUG_FOG_MEMORY …
xezon Sep 12, 2025
7ba59bf
feat(client): Enable shroud for observed players (#1569)
xezon Sep 12, 2025
15cce0b
bugfix(ghostobject): No longer try to restore ghosted objects for a n…
xezon Sep 12, 2025
d1b0afd
tweak(ghostobject): Decouple DEBUG_FOG_MEMORY from tracking ghost obj…
xezon Sep 12, 2025
9ee190c
bugfix(ghostobject): Fix incorrect snapshot update in W3DGhostObject:…
xezon Sep 12, 2025
98de109
bugfix(ghostobject): Fix crash in W3DGhostObjectManager::updateOrphan…
xezon Sep 12, 2025
98f6cd1
fix(ghostobject): Add additional tests in W3DRenderObjectSnapshot::ad…
xezon Sep 6, 2025
743f11d
bugfix(ghostobject): Properly refresh real and ghost objects when cha…
xezon Sep 12, 2025
86eccd7
bugfix(ghostobject): Properly keep ghosted and shrouded objects hidde…
xezon Sep 12, 2025
b4d1013
bugfix(radar): Refresh radar objects without delay when changing play…
xezon Sep 12, 2025
ee9841b
bugfix(radar): No longer show hero radar icons in shroud (#1569)
xezon Sep 12, 2025
df6ebbd
bugfix(drawable): Fix duplicated terrain decals applied after call to…
xezon Sep 12, 2025
cd2e5bc
refactor: Remove _MSC_VER guards around #pragma once (#1726)
Skyaero42 Oct 22, 2025
1991c78
bugfix(client): Fix crash in WorldBuilder scene (#1723)
xezon Oct 22, 2025
8db49bf
bugfix(script): Fix global-buffer-overflow in WorldBuilder scripts (#…
xezon Oct 22, 2025
228ebdd
bugfix: Fix global-buffer-overflow in WorldBuilder (MapObjectProps cl…
xezon Oct 22, 2025
d83c8c9
bugfix(anim): Fix elapsed time of object animations (#1656)
xezon Oct 22, 2025
68efcde
bugfix(scene): Fix translucent objects drawn without translucency whe…
xezon Oct 18, 2025
a20744f
refactor(scene): Clean formatting, comments in W3DScene (#1710)
xezon Oct 18, 2025
fe1ec22
feat(radar): Save Radar hidden and forced status for each Player to s…
xezon Oct 19, 2025
4f89033
fix(observer): Reset observed player when switching teams (#1715)
xezon Oct 19, 2025
84017ea
feat(observer): Add button mapping for toggling Replay Observer (#1718)
xezon Oct 23, 2025
98e4f7e
refactor: Remove superfluous defines from Language.h (#1739)
Skyaero42 Oct 24, 2025
8a9db21
refactor: Replace all header include guards with pragma once (#1722)
Skyaero42 Oct 24, 2025
07be406
feat(recorder): Implement replay archive feature (#1703)
Stubbjax Oct 25, 2025
b620e21
bugfix(object): Check whether a bike still has a rider before sniping…
Caball009 Oct 25, 2025
090d76b
refactor: Simplify stdio.h includes (#1742)
xezon Oct 25, 2025
3d14972
refactor: Simplify string.h includes (#1743)
xezon Oct 25, 2025
54b8765
refactor: Remove superfluous include guards (#1741)
Skyaero42 Oct 25, 2025
af4c40b
ci: Update Windows Version for Replay Checker (#1746)
helmutbuhler Oct 27, 2025
789af64
bugfix(filesystem): Tentatively fix hang in file exist cache (#1751)
xezon Oct 27, 2025
87adc1a
bugfix(gui): Always show correct teams for players in the observer co…
Stubbjax Oct 27, 2025
834f369
feat(gui): Implement replay info tooltips in Replay Menu (#1720)
Stubbjax Oct 28, 2025
d1c5082
build: Use more precompiled headers to reduce build time by around 50…
slurmlord Oct 28, 2025
de8823f
unify(network): Merge GameNetwork and related code (#1735)
xezon Oct 23, 2025
59e5d9b
unify(network): Merge GameSpy and related code (#1735)
xezon Oct 23, 2025
5dff203
bugfix(weapon): Fix unreliability of historic bonus weapons (#1727)
Stubbjax Oct 29, 2025
cf55e87
refactor: Simplify path string formatting in World Builder (#1759)
bobtista Oct 31, 2025
24f8da9
refactor: Normalize all file extensions to lowercase (#1765)
bobtista Oct 31, 2025
217b582
feat(gui): Implement money per minute display for local player (#1481)
L3-M Nov 1, 2025
632e1b9
bugfix(system): Prevent AMD/ATI driver crash on game launch by front …
xezon Nov 1, 2025
8d46a46
unify(imagecollection): Merge ImageCollection code (#1771)
xezon Nov 1, 2025
e7ee57b
unify(maputil): Merge MapUtil code (#1771)
xezon Nov 1, 2025
733e3db
refactor(maputil): Remove unused variables in MapUtil (#1767)
bobtista Nov 1, 2025
2eb73a8
perf(gui): Eliminate expensive and unnecessary processing when popula…
xezon Oct 28, 2025
3c30024
refactor(gui): Break up and simplify map list related code in MapUtil…
xezon Oct 31, 2025
7a6402b
tweak(gui): Track money per minute for every player (#1773)
L3-M Nov 1, 2025
d453a21
build: Add RETAIL_COMPATIBLE_BUG as build prerequisite for the tunnel…
Stubbjax Nov 3, 2025
38a4202
bugfix(gui): Fix crash when RenderFpsFontSize is set to 0 (#1788)
L3-M Nov 3, 2025
10f130a
refactor: Replace custom strrchr implementations with standard functi…
bobtista Nov 3, 2025
5b5a973
bugfix(gui): Fix incorrect Replay incompatibility messages (#1745)
helmutbuhler Nov 3, 2025
cbfc718
fix(debug): Replace NDEBUG preprocessor with RTS_DEBUG or RTS_RELEASE…
xezon Nov 4, 2025
08807eb
refactor: Fix misspelled word in comments (#1795)
timkuijsten Nov 5, 2025
9a09bae
fix(script): Improve string handling of 'Fundamentalist' code hacks (…
Skyaero42 Nov 5, 2025
e2385c5
refactor(network): Assign name to type enum in LANMessage (#1801)
Caball009 Nov 5, 2025
615aca6
build: Move refcount.h include into WWCommon.h (#1798)
xezon Nov 5, 2025
15d0fbe
refactor(w3dview): Replace duplicate reference count macros with core…
bobtista Nov 6, 2025
c1f26a5
build(weekly): Enable complete debug symbols for VC6 weekly builds (#…
slurmlord Nov 6, 2025
ff65d33
fix: Replace strcpy with strlcpy and update length asserts (#1796)
Skyaero42 Nov 6, 2025
f8d2336
refactor: Remove superfluous string buffer copies (#1800)
Skyaero42 Nov 6, 2025
0bb57b2
build: Add static_assert's near relevant strcpy calls to prevent buff…
Skyaero42 Nov 6, 2025
c5d839e
bugfix(replay): Fix unrecognized replay files in Generals (#1815)
xezon Nov 7, 2025
f9504a6
unify(module): Merge HordeUpdate and related code (#1813)
xezon Nov 7, 2025
909a145
refactor(module): Improve and simplify the implementation of HordeUpd…
xezon Nov 3, 2025
972240b
bugfix(module): Fix missing horde condition of Nationalism and Fanati…
xezon Nov 3, 2025
8a26472
tweak(scrolling): Prevent far camera jumps when scrolling while the g…
xezon Nov 7, 2025
392d7ae
refactor: Remove wrong WWDefines.h file (#1814)
xezon Nov 7, 2025
5f6a948
fix(debug): Implement reference counter and thread safety in DbgHelpL…
xezon Nov 8, 2025
e404977
refactor: Simplify some if-else condition chains (#1683)
bobtista Nov 8, 2025
07244b8
build(cmake): Add status message for missing game install path (#1820)
tintinhamans Nov 8, 2025
038f51f
fix: Replace strcpy with strlcpy to prevent potential buffer overflow…
Skyaero42 Nov 9, 2025
c9e730d
fix(font): Handle malformed fonts without crashing the game (#1826)
xezon Nov 9, 2025
a813c56
build(memory): Add missing REF macros to always.h for null memory man…
Mauller Nov 9, 2025
d46feb9
unify(network): Move most GameNetwork and GameSpy files to Core (#1733)
bobtista Nov 11, 2025
d433899
perf(mapcache): Simplify and improve implementation of MapCache to pr…
xezon Nov 11, 2025
336bfb5
fix(font): Fix font scaling for large resolutions and implement new f…
xezon Nov 11, 2025
35b3f01
tweak(network): Add file extension validation to network map transfer…
bobtista Nov 11, 2025
6cfcc7b
fix: Fix incorrect argument used for isInSaveDirectory() (#1849)
Skyaero42 Nov 13, 2025
b3d7bcb
fix(parabolicease): Fix asserting on float inprecision in ParabolicEa…
Stubbjax Nov 14, 2025
2677c39
feat(view): Add ability to rotate the camera in 45 degree increments …
Stubbjax Nov 14, 2025
b399119
feat(view): Add ability to rotate the camera in 45 degree increments …
Stubbjax Nov 14, 2025
da26e01
bugfix(network): Deny players with invalid names from joining a LAN g…
slurmlord Nov 14, 2025
2e95fe2
tweak(specialpower): Enable special power EVA events for observed pla…
Stubbjax Nov 14, 2025
524a9c6
tweak(behavior): Add RETAIL_COMPATIBLE_BUG to Black Lotus cash value …
Skyaero42 Nov 16, 2025
c9b32b2
bugfix(module): Show cash amounts of stealthed objects for allies and…
Stubbjax Nov 16, 2025
44dbf0a
bugfix(weapon): Show weapon effects of stealthed objects for allies a…
Stubbjax Nov 16, 2025
f1138f1
bugfix(object): Show veterancy effects of stealthed objects for allie…
Stubbjax Nov 16, 2025
6461ca5
fix(debug): Add error handling for rename failures in Debug code (#1855)
Skyaero42 Nov 16, 2025
3934164
build(ai): Resolve compile errors when the USE_DOZER preprocessor dir…
Stubbjax Nov 17, 2025
9035166
build(vcpkg): Add lockfile and binary cache (#1862)
bobtista Nov 17, 2025
af0ba62
ci: Re-enable win32 vcpkg presets (#1863)
bobtista Nov 17, 2025
a1be619
refactor: Remove double semicolons (#1810)
vitimiti Nov 17, 2025
9706d30
refactor: Rename RETAIL_COMPATIBLE_BUG macro to PRESERVE_RETAIL_BEHAV…
Stubbjax Nov 18, 2025
c645c8f
refactor: Remove duplicate include directives (#1873)
Stubbjax Nov 18, 2025
5de3d63
tweak(eva): Enable more EVA events for observed players (#1866)
Stubbjax Nov 18, 2025
20f88f4
bugfix: Fix effect visibility of contained objects (#1878)
Stubbjax Nov 19, 2025
a2c1d0e
refactor(network): Convert some if-else chains to switch statements (…
bobtista Nov 19, 2025
f5c8fab
refactor: Convert strlcpy to strcpy with static_assert (#1887)
Skyaero42 Nov 22, 2025
2bd2ce6
unify(common): Merge ObjectStatusTypes code (#1894)
xezon Nov 23, 2025
d17e34e
unify(radar): Merge Radar code (#1894)
xezon Nov 23, 2025
b68c0b9
unify(radar): Move ObjectStatusTypes, Radar, W3DRadar files to Core (…
xezon Nov 23, 2025
59482a6
bugfix(module): A projectile can no longer be jammed multiple times (…
Stubbjax Nov 25, 2025
8d675a8
refactor: Use new utility logic for handling observed player behaviou…
Stubbjax Nov 25, 2025
dd51b7e
refactor(string): Implement generic startsWith, endsWith functions fo…
slurmlord Nov 26, 2025
b2afcd3
tweak(gui): Add configuration to GameData.ini to allow Money Per Minu…
L3-M Nov 27, 2025
c060a47
bugfix(weapon): Weapon effects now show again for hidden objects that…
Stubbjax Nov 27, 2025
952be8c
refactor(radar): Simplify function Radar::addObject (#1893)
xezon Nov 22, 2025
7f7deaa
refactor(radar): Simplify function W3DRadar::renderObjectList (#1893)
xezon Nov 22, 2025
f01c30c
refactor(radar): Simplify function Radar::deleteListResources (#1893)
xezon Nov 22, 2025
e104d68
bugfix(radar): Add hero radar objects into its own list to get rid of…
xezon Nov 22, 2025
042fc81
bugfix(energy): Destruction of disabled Power Plant no longer lowers …
Caball009 Nov 28, 2025
cadf573
unify(shader): Merge W3DShaderManager code, move Smudge, W3DSmudge to…
xezon Nov 28, 2025
395558a
unify(shader): Move W3DShaderManager to Core (#1920)
xezon Nov 28, 2025
61f69fc
refactor: Replace preprocessor condition _WINDOWS with _WIN32 (#1911)
bobtista Nov 29, 2025
b98918e
unify(client): Move ParabolicEase, CameraShakeSystem to Core (#1904)
xezon Nov 23, 2025
a40d246
unify(view): Merge View and closely related code (#1904)
xezon Nov 24, 2025
fe4a589
unify(view): Move View, W3DView to Core (#1904)
xezon Nov 27, 2025
7751544
refactor: Remove all explicit AsciiString instantiations from C strin…
xezon Nov 30, 2025
963d7f7
refactor: Remove superfluous variable init comments (#1876)
bobtista Nov 30, 2025
2a1f963
bugfix(filesystem): Prevent loading wrong INIZH.big from Data/INI dir…
bobtista Nov 30, 2025
0410990
refactor: Remove all explicit UnicodeString instantiations from C str…
xezon Nov 30, 2025
94354fd
refactor(string): Fix constness of TheEmptyString (#1930)
xezon Dec 1, 2025
cc9d649
build: Add WOW6432Node to registry path lookups for EA App install pa…
bobtista Dec 2, 2025
29bf57a
refactor(network): Replace implicit conversion from NULL to AsciiStri…
Caball009 Dec 2, 2025
1ee44db
refactor: Remove or replace some superfluous empty C strings (#1929)
xezon Dec 2, 2025
d81e743
bugfix(movie): Fix Campaign, Challenge, Score movie cancellation or d…
xezon Dec 2, 2025
b6c1c54
tweak(keyboard): Apply minor improvements to Keyboard class to query …
xezon Nov 30, 2025
e6c28a4
feat(movie): Implement ESC button mapping to skip Campaign, Challenge…
xezon Nov 30, 2025
6f9785f
build: Use cmake_host_system_information to make registry queries in …
bobtista Dec 7, 2025
2a1593e
bugfix(network): Prevent out of bounds memory access in NetCommandWra…
Mauller Dec 7, 2025
2b1bcee
fix: Wrong usage of sizeof(this) in BitFlags::xfer(), W3DMPO::glueEnf…
bobtista Dec 7, 2025
aed42f0
refactor(mouse): Apply minor refactoring and whitespace tweaks in Win…
xezon Dec 2, 2025
68d832f
bugfix(mouse): Prevent cursor capture when mouse is outside of app wi…
xezon Dec 2, 2025
f4608df
feat(crashdump): Add crash dump functionality for fatal errors (#1594)
slurmlord Dec 7, 2025
158b046
ci(vcpkg): Include preset in binary cache key to avoid ABI mismatches…
bobtista Dec 10, 2025
42f846b
bugfix(pathfinder): Prevent infinite loop within PathfindCell::putOnS…
Mauller Dec 10, 2025
9573250
build: Add clang-tidy checks and script (#1807)
bobtista Dec 10, 2025
e6e874e
bugfix(string): Allow startsWith and endsWith to be called on empty s…
Caball009 Dec 11, 2025
d2625f0
refactor: Remove superfluous inline and register keywords with clang-…
bobtista Dec 11, 2025
3209a5b
unify(matpass): Merge WW3D2 matpass code (#1982)
xezon Dec 11, 2025
d809648
refactor(namekey): Reduce code duplication in NameKeyGenerator functi…
xezon Dec 7, 2025
0c993a9
perf(namekey): Remove all superfluous AsciiString allocations for nam…
xezon Dec 11, 2025
38abe9e
bugfix(network): Prevent buffer overflow in NetPacket::readFileMessag…
Mauller Dec 13, 2025
c5aa3cd
fix(network): Fix missing value initialization of LANGameInfo::m_isDi…
bobtista Dec 13, 2025
746c017
refactor: Apply the readability-container-size-empty check with clang…
bobtista Dec 14, 2025
fa9cb0c
unify(texture): Merge W3DWater and WW3D2 texture code (#1989)
xezon Dec 13, 2025
c110a0e
unify(texture): Move W3DWater, W3DLaserDraw and WW3D2 texture related…
xezon Dec 14, 2025
334f56a
build(heightmap): Fix include paths in Zero Hour Height Map files (#1…
xezon Dec 13, 2025
330ad22
unify(heightmap): Merge Height Map related code and move Zero Hour's …
xezon Dec 14, 2025
ce4e595
unify(heightmap): Move Height Map and Terrain related files to Core (…
xezon Dec 14, 2025
844c436
bugfix(input): Disable mouse waypoint mode after using alt tab (#1987)
Caball009 Dec 16, 2025
123492c
bugfix(object): Fix visibility conditions for client-side effects (#1…
Stubbjax Dec 17, 2025
4951762
bugfix(experience): Prevent ranking of riders that are not trainable …
Stubbjax Dec 17, 2025
bffbcb4
refactor: Apply integer value comparisons for strcmp and stricmp with…
bobtista Dec 17, 2025
3b7e734
build: Implement docker build (#1774)
sherif181 Dec 17, 2025
fc36efc
bugfix(network): Fix data offset for string reads in NetPacket::readF…
Mauller Dec 18, 2025
23a2926
tweak(metaevent): Change COMMANDUSABLE_OBSERVER to no longer apply in…
xezon Dec 19, 2025
d3d6344
Merge branch 'main' of https://github.com/TheSuperHackers/GeneralsGam…
Andreas-W Dec 20, 2025
821ef2d
remove waitForDebug
Andreas-W Dec 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
167 changes: 167 additions & 0 deletions .clang-tidy
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
# TheSuperHackers @build JohnsterID 15/09/2025 Add clang-tidy configuration for code quality analysis
---
# Clang-tidy configuration for GeneralsGameCode project
# This configuration is tailored for a legacy C++98/C++20 hybrid codebase
# with Windows-specific code and COM interfaces

# Enable specific checks that are appropriate for this codebase
Checks: >
-*,
bugprone-*,
-bugprone-easily-swappable-parameters,
-bugprone-implicit-widening-of-multiplication-result,
-bugprone-narrowing-conversions,
-bugprone-signed-char-misuse,
cert-*,
-cert-dcl21-cpp,
-cert-dcl50-cpp,
-cert-dcl58-cpp,
-cert-env33-c,
-cert-err58-cpp,
clang-analyzer-*,
-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,
cppcoreguidelines-*,
-cppcoreguidelines-avoid-c-arrays,
-cppcoreguidelines-avoid-magic-numbers,
-cppcoreguidelines-avoid-non-const-global-variables,
-cppcoreguidelines-init-variables,
-cppcoreguidelines-macro-usage,
-cppcoreguidelines-no-malloc,
-cppcoreguidelines-owning-memory,
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
-cppcoreguidelines-pro-bounds-constant-array-index,
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
-cppcoreguidelines-pro-type-cstyle-cast,
-cppcoreguidelines-pro-type-reinterpret-cast,
-cppcoreguidelines-pro-type-union-access,
-cppcoreguidelines-pro-type-vararg,
-cppcoreguidelines-special-member-functions,
google-*,
-google-build-using-namespace,
-google-explicit-constructor,
-google-readability-casting,
-google-readability-todo,
-google-runtime-int,
-google-runtime-references,
hicpp-*,
-hicpp-avoid-c-arrays,
-hicpp-explicit-conversions,
-hicpp-no-array-decay,
-hicpp-signed-bitwise,
-hicpp-special-member-functions,
-hicpp-uppercase-literal-suffix,
-hicpp-use-auto,
-hicpp-vararg,
misc-*,
-misc-const-correctness,
-misc-include-cleaner,
-misc-non-private-member-variables-in-classes,
-misc-use-anonymous-namespace,
modernize-*,
-modernize-avoid-c-arrays,
-modernize-concat-nested-namespaces,
-modernize-loop-convert,
-modernize-pass-by-value,
-modernize-raw-string-literal,
-modernize-return-braced-init-list,
-modernize-use-auto,
-modernize-use-default-member-init,
-modernize-use-nodiscard,
-modernize-use-trailing-return-type,
performance-*,
-performance-avoid-endl,
portability-*,
readability-*,
-readability-avoid-const-params-in-decls,
-readability-braces-around-statements,
-readability-convert-member-functions-to-static,
-readability-function-cognitive-complexity,
-readability-identifier-length,
-readability-implicit-bool-conversion,
-readability-isolate-declaration,
-readability-magic-numbers,
-readability-named-parameter,
-readability-redundant-access-specifiers,
-readability-uppercase-literal-suffix

# Treat warnings as errors for CI/CD
WarningsAsErrors: false

# Header filter to include project headers
HeaderFilterRegex: '(Core|Generals|GeneralsMD|Dependencies)/.*\.(h|hpp)$'

# Check options for specific rules
CheckOptions:
# Naming conventions - adapted for the existing codebase style
- key: readability-identifier-naming.ClassCase
value: CamelCase
- key: readability-identifier-naming.StructCase
value: CamelCase
- key: readability-identifier-naming.FunctionCase
value: CamelCase
- key: readability-identifier-naming.MethodCase
value: CamelCase
- key: readability-identifier-naming.VariableCase
value: lower_case
- key: readability-identifier-naming.ParameterCase
value: lower_case
- key: readability-identifier-naming.MemberCase
value: lower_case
- key: readability-identifier-naming.MemberPrefix
value: m_
- key: readability-identifier-naming.ConstantCase
value: UPPER_CASE
- key: readability-identifier-naming.EnumConstantCase
value: UPPER_CASE
- key: readability-identifier-naming.MacroDefinitionCase
value: UPPER_CASE

# Performance settings
- key: performance-for-range-copy.WarnOnAllAutoCopies
value: true
- key: performance-unnecessary-value-param.AllowedTypes
value: 'AsciiString;UnicodeString;Utf8String;Utf16String'

# Modernize settings - be conservative for legacy code
- key: modernize-use-nullptr.NullMacros
value: 'NULL'
- key: modernize-replace-auto-ptr.IncludeStyle
value: llvm

# Readability settings
- key: readability-function-size.LineThreshold
value: 150
- key: readability-function-size.StatementThreshold
value: 100
- key: readability-function-size.BranchThreshold
value: 25
- key: readability-function-size.ParameterThreshold
value: 8
- key: readability-function-size.NestingThreshold
value: 6

# Bugprone settings
- key: bugprone-argument-comment.StrictMode
value: false
- key: bugprone-suspicious-string-compare.WarnOnImplicitComparison
value: true
- key: bugprone-suspicious-string-compare.WarnOnLogicalNotComparison
value: true

# Google style settings
- key: google-readability-braces-around-statements.ShortStatementLines
value: 2
- key: google-readability-function-size.StatementThreshold
value: 100

# CERT settings
- key: cert-dcl16-c.NewSuffixes
value: 'L;LL;LU;LLU'
- key: cert-oop54-cpp.WarnOnlyIfThisHasSuspiciousField
value: false

# Use .clang-format for formatting suggestions
FormatStyle: file

# Exclude certain directories and files
# Note: This is handled by HeaderFilterRegex above, but can be extended
133 changes: 133 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
# AI Coding Agent Instructions

## Project Overview

This is the **GeneralsGameCode** project - a community-driven effort to fix and improve the classic RTS games *Command & Conquer: Generals* and *Zero Hour*. The codebase has been modernized from Visual Studio 6/C++98 to Visual Studio 2022/C++20 while maintaining retail compatibility.

## Architecture

### Dual Game Structure
- **Generals/**: Original C&C Generals (v1.08) codebase
- **GeneralsMD/**: Zero Hour expansion (v1.04) codebase - **primary focus**
- **Core/**: Shared game engine and libraries used by both games

### Key Components
- **Core/GameEngine/**: Base game engine with GameClient/GameLogic separation
- **Core/Libraries/**: Internal libraries including WWVegas graphics framework
- **Core/GameEngineDevice/**: Platform-specific rendering (DirectX 8)
- **Core/Tools/**: Development tools (W3DView, texture compression, etc.)
- **Dependencies/**: External dependencies (MaxSDK for VC6, utilities)

## Build System

### CMake Presets (Critical)
- **vc6**: Visual Studio 6 compatible build (retail compatibility required)
- **win32**: Modern Visual Studio 2022 build
- **vc6-debug/vc6-profile**: Debug/profiling variants
- Use `cmake --preset <preset-name>` followed by `cmake --build build/<preset>`

### Build Commands
```bash
# Configure with specific preset
cmake --preset vc6

# Build (from project root)
cmake --build build/vc6

# Build with tools and extras
cmake --build build/vc6 --target <game>_tools <game>_extras
```

### Retail Compatibility
- VC6 builds are required for replay compatibility testing
- Debug builds break retail compatibility
- Use RTS_BUILD_OPTION_DEBUG=OFF for compatibility testing

## Development Workflow

### Code Change Documentation
**Every user-facing change requires TheSuperHackers comment format:**
```cpp
// TheSuperHackers @keyword author DD/MM/YYYY Description
```

Common keywords: `@bugfix`, `@feature`, `@performance`, `@refactor`, `@tweak`, `@build`

### Pull Request Guidelines
- Title format: `type: Description starting with action verb`
- Types: `bugfix:`, `feat:`, `fix:`, `refactor:`, `perf:`, `build:`
- Zero Hour changes take precedence over Generals
- Changes must be identical between both games when applicable

### Code Style
- Maintain consistency with surrounding legacy code
- Prefer C++98 style unless modern features add significant value
- No big refactors mixed with logical changes
- Use present tense in documentation ("Fixes" not "Fixed")

## Testing

### Replay Compatibility Testing
Located in `GeneralsReplays/` - critical for ensuring retail compatibility:
```bash
generalszh.exe -jobs 4 -headless -replay subfolder/*.rep
```
- Requires VC6 optimized build with RTS_BUILD_OPTION_DEBUG=OFF
- Copies replays to `%USERPROFILE%/Documents/Command and Conquer Generals Zero Hour Data/Replays`
- CI automatically tests GeneralsMD builds against known replays

### Build Validation
- CI tests multiple presets: vc6, vc6-profile, vc6-debug, win32 variants
- Path-based change detection triggers relevant builds
- Tools and extras are built with `+t+e` flags

## Common Patterns

### Memory Management
- Manual memory management (delete/delete[]) - this is legacy C++98 code
- STLPort for VC6 compatibility (see `cmake/stlport.cmake`)

### Game Engine Separation
- **GameLogic**: Game state, rules, simulation
- **GameClient**: Rendering, UI, platform-specific code
- Clean separation maintained for potential future networking

### Module Structure
```
Core/
├── GameEngine/Include/Common/ # Shared interfaces
├── GameEngine/Include/GameLogic/ # Game simulation
├── GameEngine/Include/GameClient/ # Rendering/UI
├── Libraries/Include/rts/ # RTS-specific utilities
└── Libraries/Source/WWVegas/ # Graphics framework
```

## External Dependencies

### Required for Building
- **VC6 builds**: Requires MSVC 6.0 toolchain (automated in CI via itsmattkc/MSVC600)
- **Modern builds**: Visual Studio 2022, Ninja generator
- **vcpkg** (optional): zlib, ffmpeg for enhanced builds

### Platform-Specific
- **Windows**: DirectX 8, Miles Sound System, Bink Video
- **Registry detection**: Automatic game install path detection from EA registry keys

## Tools and Utilities

### Development Scripts (`scripts/cpp/`)
- `fixInludesCase.sh`: Fix include case sensitivity
- `refactor_*.py`: Code refactoring utilities
- `remove_trailing_whitespace.py`: Code cleanup

### Build Tools
- W3DView: 3D model viewer
- TextureCompress: Asset optimization
- MapCacheBuilder: Map preprocessing

## Key Files to Understand
- `CMakePresets.json`: All build configurations
- `cmake/config-build.cmake`: Build options and feature flags
- `Core/GameEngine/Include/`: Core engine interfaces
- `**/Code/Main/WinMain.cpp`: Application entry points
- `GeneralsReplays/`: Compatibility test data
15 changes: 14 additions & 1 deletion .github/workflows/build-toolchain.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,24 @@ jobs:
build:
name: ${{ inputs.preset }}${{ inputs.tools && '+t' || '' }}${{ inputs.extras && '+e' || '' }}
runs-on: windows-2022
timeout-minutes: 20
timeout-minutes: 30
env:
VCPKG_FILE_CACHE: ${{ github.workspace }}\vcpkg-bincache
VCPKG_BINARY_SOURCES: clear;files,${{ github.workspace }}\vcpkg-bincache,readwrite
VCPKG_FEATURE_FLAGS: manifests,versions,binarycaching
steps:
- name: Checkout Code
uses: actions/checkout@v4

- name: Cache vcpkg binary artifacts
uses: actions/cache@v4
with:
path: ${{ github.workspace }}\vcpkg-bincache
key: vcpkg-bincache-${{ runner.os }}-${{ hashFiles('vcpkg.json','vcpkg-lock.json') }}-${{ inputs.preset }}
restore-keys: |
vcpkg-bincache-${{ runner.os }}-${{ hashFiles('vcpkg.json','vcpkg-lock.json') }}-
vcpkg-bincache-${{ runner.os }}-

- name: Cache VC6 Installation
if: startsWith(inputs.preset, 'vc6')
id: cache-vc6
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/check-replays.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: check-replays
name: Check Replays

permissions:
contents: read
Expand All @@ -23,7 +23,7 @@ on:
jobs:
build:
name: ${{ inputs.preset }}
runs-on: windows-latest
runs-on: windows-2022
timeout-minutes: 15
env:
GAME_PATH: C:\GameData
Expand Down
38 changes: 18 additions & 20 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,16 +80,15 @@ jobs:
- preset: "win32-debug"
tools: true
extras: true
# vcpkg builds have been disabled for now due to excessive build times of 30 minutes per preset
# - preset: "win32-vcpkg"
# tools: true
# extras: true
# - preset: "win32-vcpkg-profile"
# tools: true
# extras: true
# - preset: "win32-vcpkg-debug"
# tools: true
# extras: true
- preset: "win32-vcpkg"
tools: true
extras: true
- preset: "win32-vcpkg-profile"
tools: true
extras: true
- preset: "win32-vcpkg-debug"
tools: true
extras: true
fail-fast: false
uses: ./.github/workflows/build-toolchain.yml
with:
Expand Down Expand Up @@ -145,16 +144,15 @@ jobs:
- preset: "win32-debug"
tools: true
extras: true
# vcpkg builds have been disabled for now due to excessive build times of 30 minutes per preset
# - preset: "win32-vcpkg"
# tools: true
# extras: true
# - preset: "win32-vcpkg-profile"
# tools: true
# extras: true
# - preset: "win32-vcpkg-debug"
# tools: true
# extras: true
- preset: "win32-vcpkg"
tools: true
extras: true
- preset: "win32-vcpkg-profile"
tools: true
extras: true
- preset: "win32-vcpkg-debug"
tools: true
extras: true
fail-fast: false
uses: ./.github/workflows/build-toolchain.yml
with:
Expand Down
Loading