Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
994 commits
Select commit Hold shift + click to select a range
21290c7
74.41%: match ctor smooth-normal lod loop
JohnDeved Mar 24, 2026
5e5cf3b
74.44%: match ctor material setup flow
JohnDeved Mar 24, 2026
5e8a92a
74.55%: recover ctor part light materials
JohnDeved Mar 24, 2026
e4d82c9
74.57%: match ctor material null branches
JohnDeved Mar 24, 2026
ee10df7
74.56985%: move ctor spinner null store
JohnDeved Mar 24, 2026
a57aeb3
74.5735%: match ctor mirror-left store
JohnDeved Mar 24, 2026
d67ea63
74.58%: reorder WWorldPos ctor clears
JohnDeved Mar 24, 2026
bc0ee78
74.581%: square UpdateTires hop scale in place
JohnDeved Mar 24, 2026
fc20c93
74.583%: reorder CompositeSkin palette setup
JohnDeved Mar 24, 2026
42285a4
74.584%: reorder CompositeSkin param loads
JohnDeved Mar 24, 2026
3257315
74.607%: reorder CompositeSkin 8-bit locals
JohnDeved Mar 24, 2026
b1474dd
74.613%: reshape CompositeSkin blend locals
JohnDeved Mar 24, 2026
a8c4e4b
74.618%: tighten CompositeSkin swatch cache writes
JohnDeved Mar 24, 2026
bc718bd
74.623%: split CompositeSkin swatch cache lanes
JohnDeved Mar 24, 2026
d36efac
74.657%: invert CompositeSkin opacity branch
JohnDeved Mar 24, 2026
8989458
74.667%: delay CompositeSkin pixel offset calc
JohnDeved Mar 24, 2026
3d449b6
74.669%: use CompositeSkin capped increment
JohnDeved Mar 24, 2026
74f8462
74.691%: align CompositeSkin quantization locals
JohnDeved Mar 24, 2026
abc62f0
74.734%: use direct widths in CompositeSkin pixel paths
JohnDeved Mar 24, 2026
68e2b2c
74.735%: reorder CompositeSkin quantized byte writes
JohnDeved Mar 24, 2026
55ebb80
74.735%: correct CompositeSkin palette entry packing
JohnDeved Mar 24, 2026
9ee9035
74.737%: narrow CompositeSkin quantized byte counter
JohnDeved Mar 24, 2026
466f733
74.737%: drop CompositeSkin pixel list alias
JohnDeved Mar 24, 2026
79bdd70
74.748%: regroup CompositeSkin palette combine
JohnDeved Mar 24, 2026
26e76ee
74.748%: split CompositeSkin cur counter init
JohnDeved Mar 24, 2026
b17c8b3
74.750%: zero Effect key on emitter delete
JohnDeved Mar 24, 2026
3921bdd
74.750%: finish HandleEmitterGroupDelete dwarf match
JohnDeved Mar 24, 2026
bc1eaaf
74.755%: add TireState reset helper
JohnDeved Mar 24, 2026
e8ff272
74.860%: fix CarPart model table stride
JohnDeved Mar 24, 2026
d410ede
74.860%: finish CarPart GetModelNameHash dwarf
JohnDeved Mar 24, 2026
9f7f228
75.049%: match VehicleRenderConn Load
JohnDeved Mar 24, 2026
edb9d4e
75.072%: match VehicleRenderConn SetupLoading
JohnDeved Mar 24, 2026
3b33b1c
75.088%: match VehicleRenderConn part helpers
JohnDeved Mar 24, 2026
1a50c18
75.106%: match VehicleRenderConn UpdateLoading
JohnDeved Mar 24, 2026
92e12c7
75.113%: match VehicleRenderConn FetchData
JohnDeved Mar 24, 2026
a9f5005
75.140%: improve CarRenderConn OnEvent
JohnDeved Mar 24, 2026
74b6b12
75.140%: match CarRenderConn OnEvent
JohnDeved Mar 24, 2026
ac2c97c
75.140%: recover SpaceNode layout
JohnDeved Mar 24, 2026
1d27526
75.140%: finish ServiceSpaceNodes dwarf
JohnDeved Mar 24, 2026
0d753f4
75.143%: match GetSpinnerTextureMaskHash
JohnDeved Mar 24, 2026
907fc14
75.147%: match RideInfo SetRandomPaint
JohnDeved Mar 24, 2026
d61822f
75.151%: match SkinSlotToMask
JohnDeved Mar 24, 2026
7d776dd
75.156%: match GetCarPartNameFromID
JohnDeved Mar 24, 2026
6c7c56a
75.165%: match GetCarSlotNameFromID
JohnDeved Mar 24, 2026
0913a56
75.165%: match DebugVehicleSelection constructor
JohnDeved Mar 24, 2026
3efa132
75.173%: match DebugVehicleSelection InitSelectionList
JohnDeved Mar 24, 2026
9bfb7e5
75.185%: match CarInfo preset helpers
JohnDeved Mar 24, 2026
23ae4db
75.192%: match MapCarTypeNameHashToIndex
JohnDeved Mar 24, 2026
4d04566
75.202%: match RideInfo GetSkinNameHash
JohnDeved Mar 24, 2026
e3124df
75.208%: improve LoadedTexturePack memory entries
JohnDeved Mar 24, 2026
b115c22
75.225%: match LoadedSolidPack constructor
JohnDeved Mar 24, 2026
9d34db6
75.242%: match LoadedTexturePack constructor
JohnDeved Mar 24, 2026
e154830
75.251%: match LoadedSkin constructor
JohnDeved Mar 24, 2026
1d416be
75.275%: improve LoadedRideInfo constructor
JohnDeved Mar 24, 2026
6cccad5
75.276%: tune LoadedRideInfo constructor
JohnDeved Mar 24, 2026
e1a0194
75.320%: improve LoadedWheel constructor
JohnDeved Mar 25, 2026
92fb4f7
75.323%: refine LoadedWheel constructor
JohnDeved Mar 25, 2026
cdc1df0
75.368%: match loader pack destructors
JohnDeved Mar 25, 2026
e377bc4
75.370%: improve LoadedCar GetModelHashes
JohnDeved Mar 25, 2026
052c3cb
75.404%: match pack unloaders
JohnDeved Mar 25, 2026
0d3819e
75.429%: improve unload ride info path
JohnDeved Mar 25, 2026
b73966d
75.439%: refine UnloadRideInfo
JohnDeved Mar 25, 2026
1546320
75.450%: improve UnloadCar
JohnDeved Mar 25, 2026
0f11aa1
75.470%: match UnloadSkinPerms
JohnDeved Mar 25, 2026
967366e
75.471%: match UnloadCar
JohnDeved Mar 25, 2026
68e175c
75.485%: improve UnloadSkinTemporaries
JohnDeved Mar 25, 2026
10ca874
75.495%: match UnloadAllSkinTemporaries
JohnDeved Mar 25, 2026
1f28fd4
75.506%: match UnloadSkinTemporaries
JohnDeved Mar 25, 2026
2ad05f9
75.510%: match UnloaderCarInfo
JohnDeved Mar 25, 2026
0ccb91b
75.518%: match ParameterMapLayer unload
JohnDeved Mar 25, 2026
5233a6a
75.518%: match VehicleFragmentConn UpdateModel
JohnDeved Mar 25, 2026
7be9239
75.528%: match FacePixelation SetLocation
JohnDeved Mar 25, 2026
536e2ac
75.533%: match AmIinATunnel
JohnDeved Mar 25, 2026
5c7413f
75.541%: match SetRainBase
JohnDeved Mar 25, 2026
301ac23
75.551%: match UnallocateRideInfo
JohnDeved Mar 25, 2026
bd6b58e
75.551%: improve GetCarPartByIndex
JohnDeved Mar 25, 2026
d401310
75.556%: match GetCarPartByIndex
JohnDeved Mar 25, 2026
72b91b2
75.566%: match coplightflicker
JohnDeved Mar 25, 2026
70ebb92
75.573%: improve coplightflicker2
JohnDeved Mar 25, 2026
9999dcb
75.576%: refine coplightflicker2
JohnDeved Mar 25, 2026
b207823
75.580%: improve coplightflicker2 branch order
JohnDeved Mar 25, 2026
d0e8e30
75.590%: match UpdateContrails
JohnDeved Mar 25, 2026
300c3e2
75.593%: match LoadedRideInfo constructor
JohnDeved Mar 25, 2026
55ce8de
75.603%: match CarRenderConn Hide
JohnDeved Mar 25, 2026
7815ce3
75.603%: match ParameterAccessor CaptureData
JohnDeved Mar 25, 2026
6c41858
75.603%: use ecar ChangeWithDefault wrapper
JohnDeved Mar 25, 2026
a59f466
75.606%: use ecar wrapper in VehicleRenderConn ctor
JohnDeved Mar 25, 2026
4bc7425
75.651%: use typed attrib wrappers in CarRenderConn ctor
JohnDeved Mar 25, 2026
3a80f7d
75.655%: use UMath Max in CarRenderConn ctor
JohnDeved Mar 25, 2026
09e4913
75.649%: restructure CompositeSkin32 locals
JohnDeved Mar 25, 2026
6ba65a0
75.668%: tighten CompositeSkin32 colour packing
JohnDeved Mar 25, 2026
576ce26
75.685%: refine CompositeSkin32 swatch handling
JohnDeved Mar 25, 2026
f81cc8f
75.685%: use LoadedSolidPack in DefragmentAllocation
JohnDeved Mar 25, 2026
3c4cc9b
75.689%: inline LoaderCarInfo attribute swaps
JohnDeved Mar 25, 2026
ddbb764
75.690%: use attribute locals in LoaderCarInfo
JohnDeved Mar 25, 2026
9844646
75.701%: use direct global assignments in LoaderCarInfo
JohnDeved Mar 25, 2026
d668225
75.703%: restructure RemoveSomethingFromCarMemoryPool
JohnDeved Mar 25, 2026
014b212
75.868%: reorder RemoveSomethingFromCarMemoryPool branches
JohnDeved Mar 25, 2026
12836cd
75.873%: narrow RemoveSomethingFromCarMemoryPool skin loads
JohnDeved Mar 25, 2026
80f341a
75.884%: match RemoveSomethingFromCarMemoryPool
JohnDeved Mar 25, 2026
0a97847
75.884%: improve RemoveSomethingFromCarMemoryPool DWARF
JohnDeved Mar 25, 2026
b94677d
75.9%: match VehicleFX::GetMaps and VehicleFX::LookupID
JohnDeved Mar 25, 2026
19bffe9
76.1%: match ch2d and partially match make_chain/ccw
JohnDeved Mar 25, 2026
6b25baf
76.3%: match GetParameterMapsManager, GetAutoParameterAccessors, __tc…
JohnDeved Mar 25, 2026
f7bbb7e
76.3%: match IsPartHidden, GetPartMatrix, GetDataFloat, GetDataInt
JohnDeved Mar 25, 2026
ef3cbb0
76.4%: match ParameterAccessor ctor, dtor blend, GetDataForLayer
JohnDeved Mar 25, 2026
19f8bb3
76.4%: match UnloaderParameterMaps, remove extra GetDataForLayer over…
JohnDeved Mar 25, 2026
2ed6701
76.5%: match SetLayer, GetFieldPointer
JohnDeved Mar 25, 2026
18befbb
76.6%: match NotifyTireStateEffectOfEmitterDelete, ParameterAccessor …
JohnDeved Mar 25, 2026
5df8cb3
76.6%: match UnloadUnallocatedRideInfos, SetUpForNewLayer
JohnDeved Mar 25, 2026
4f23b1c
76.7%: match LoaderParameterMaps
JohnDeved Mar 25, 2026
c0ed862
76.8%: match UnloadAllLayers, ParameterMapsManager dtor, BeginLoading
JohnDeved Mar 25, 2026
8a2853f
76.9%: match UnloadRideInfo
JohnDeved Mar 25, 2026
762bf13
76.9%: match CarLoader::Load (100% objdiff, DWARF mismatch on AddHead…
JohnDeved Mar 25, 2026
e5cc00a
77.0%: match initnet, GetSkinCompositeParams, ConvertVinylGroupNumber…
JohnDeved Mar 25, 2026
142602a
77.1%: match TriggerPulse (100% objdiff), improve Reset to 93.8%, add…
JohnDeved Mar 25, 2026
6fa9513
77.1%: match SetNosEngaged, IsInSkinCompositeCache
JohnDeved Mar 25, 2026
f4e1e6e
77.3%: match TestVisibility, improve BlendVisualLookAttribute/Refresh…
JohnDeved Mar 25, 2026
a2f94ae
77.4%: improve ManageGlassDamage to 98.8% (fix bMin arg order, branch…
JohnDeved Mar 25, 2026
8680f52
77.5%: match LoadSolidPack (fix branch inversion, unsigned int callba…
JohnDeved Mar 25, 2026
b0fe533
77.7%: match InitSkyHash (remove unused TOD branch), improve SpaceNod…
JohnDeved Mar 25, 2026
f47bb1c
77.8%: match TriggerUves (100% objdiff, 85% DWARF), update Trigger in…
JohnDeved Mar 25, 2026
95f5ce6
78.0%: match CarLoader ctor, HeliPoly::GetVertices, improve UpdateAct…
JohnDeved Mar 25, 2026
adadb92
78.0%: improve UpdatePartsEnabled to 99.3%, improve UpdateActive to 9…
JohnDeved Mar 25, 2026
deaabec
78.1%: match UpdateParts with BitArray, match GetVinylLayerHash, impr…
JohnDeved Mar 25, 2026
4e8aea7
78.1%: match RefreshAllRenderInfo, improve GetValueFromSpline
JohnDeved Mar 25, 2026
57e6bf8
78.1%: match RenderAll, SmackableRenderConn dtor, UpdateAll
JohnDeved Mar 25, 2026
40d5045
78.2%: match VehicleFragmentConn ctor/dtor/Update, improve FetchData
JohnDeved Mar 25, 2026
6a649ba
78.3%: improve GetLayerMod from 66.2% to 98.5%
JohnDeved Mar 25, 2026
71f2ef5
78.4%: match SwitchSkin, improve TireFace
JohnDeved Mar 25, 2026
48c370d
78.5%: match VehiclePartDamageZone dtor, improve GetModelNameHash to …
JohnDeved Mar 25, 2026
890ad3d
78.5%: improve DamageZone to 84.4% with UMath::Max/Min and proper DWA…
JohnDeved Mar 25, 2026
b5b13a2
78.5%: match LoadTexturePack, improve CompositeSkin to 97.6%
JohnDeved Mar 25, 2026
7c0d0a1
78.6%: match UpdateBodyAnimation, improve coplightflicker2
JohnDeved Mar 25, 2026
5e313c7
78.6%: improve IVisualTreatment ctor from 97.4% to 97.5%
JohnDeved Mar 25, 2026
64938e0
78.8%: match VehicleRenderConn::OnLoaded, implement _V3c::Decompress …
JohnDeved Mar 25, 2026
a3c5dba
78.9%: match CarRenderConn::OnLoaded with bAbs/DEG2RAD inlines
JohnDeved Mar 25, 2026
7da1305
78.9%: improve SetSurface from 56.7% to 81%, fix ~CarRenderInfo loop bug
JohnDeved Mar 25, 2026
fd88a9f
78.9%: remove anonymous namespace to fix extra _GLOBAL_.N symbols
JohnDeved Mar 25, 2026
9859965
79.0%: improve StuffSpecular from 62.7% to 83.7%
JohnDeved Mar 25, 2026
030b76b
79.2%: improve convex_hull from 55.8% to 83.2%, remove DotPassesTest …
JohnDeved Mar 25, 2026
1e3163f
79.2%: inline extra functions (CarRenderFrameMalloc, MakeIdentityMatr…
JohnDeved Mar 25, 2026
9e8a97c
79.2%: match UpdateContrails, improve Update to 95.9% using bLength
JohnDeved Mar 26, 2026
ec3bd1c
79.3%: match UpdateRoadNoise using UMath::Clear, UMath::Sinr, UMath::…
JohnDeved Mar 26, 2026
88cd7d8
79.5%: improve AddRoadNoise from 60.7% to 88% using UMath::Ramp, UMat…
JohnDeved Mar 26, 2026
d4235ab
79.6%: improve UpdateWheelYRenderOffset from 67.9% to 88%, fix branch…
JohnDeved Mar 26, 2026
76d619d
79.6%: match LoadCar, HeliRenderConn::Update, add GetCarTypeInfo inline
JohnDeved Mar 26, 2026
1fd6a57
79.6%: improve UpdateEngineAnimation from 82.2% to 85.2%, fix accel R…
JohnDeved Mar 26, 2026
0d53949
79.7%: improve AnimatePart from 58.9% to 93.6%
JohnDeved Mar 26, 2026
00b04f8
79.8%: match global constructors keyed to SuperEasyAIMode
JohnDeved Mar 26, 2026
ed58134
79.8%: improve WorldModel::RenderModel from 87.2% to 90.5%, fix AABBA…
JohnDeved Mar 26, 2026
807015d
79.8%: improve Init, CloseWorldModels, WorldModel::Render delta ordering
JohnDeved Mar 26, 2026
523c71a
79.9%: improve NeuQuant functions - contest 97%, inxbuild 75.5%, inxs…
JohnDeved Mar 26, 2026
511008f
80.0%: improve GetElevation from 37.5% to 81.7%, fix bMath inline wra…
JohnDeved Mar 26, 2026
9b9aef0
80.1%: improve GetPartIndex from 76.4% to 81.4%
JohnDeved Mar 26, 2026
cd99fb3
80.1%: match GetLayerMod
JohnDeved Mar 27, 2026
345e904
80.1%: match SetRandomParts
JohnDeved Mar 27, 2026
ba73dca
80.1%: improve SetStockParts branch structure
JohnDeved Mar 27, 2026
160c40e
80.2%: match RemapColour, improve ScaleColours with int casts
JohnDeved Mar 27, 2026
790da38
80.2%: improve CalcPartRotation with vector copy assignments
JohnDeved Mar 27, 2026
dd5751c
80.2%: improve UpdateSteering with early steering_limit computation
JohnDeved Mar 27, 2026
02765cb
80.3%: match RenderPart with IsLodMissing inline
JohnDeved Mar 27, 2026
7f1847c
80.3%: improve GetBlendColour with g/b swap and comparison fix
JohnDeved Mar 27, 2026
8b3d490
80.3%: fix IVehiclePartDamageBehaviour vtable order, implement CarPar…
JohnDeved Mar 27, 2026
0900662
80.4%: improve UpdateLightStateTextures with DWARF-matched block stru…
JohnDeved Mar 27, 2026
57d0246
81.1%: rewrite Render with DWARF-matched allocations and LOD logic
JohnDeved Mar 27, 2026
70b9b05
82.0%: rewrite tire/brake sections with camber, wheel scale loop, per…
JohnDeved Mar 27, 2026
c1df283
82.0%: improve Update/TireFace with Y-axis rotation and branch fix
JohnDeved Mar 27, 2026
ffe844d
82.3%: add spoiler/roof scoop sections to Render with LOD checks and …
JohnDeved Mar 27, 2026
c68eb55
82.5%: match SwitchPlayerVehicle
JohnDeved Mar 27, 2026
1e523fb
82.5%: improve UpdateEnvironmentMapCameras and RenderFrontEndCars bra…
JohnDeved Mar 27, 2026
085bbe8
82.5%: improve destructor and CompositeSkin load order
JohnDeved Mar 27, 2026
e68cc41
82.6%: match GetSpecialLODRangeForCarSlot with reordered cases
JohnDeved Mar 27, 2026
cb84a0c
82.65%: improve RideInfo::SetPart body and decal blocks
JohnDeved Mar 27, 2026
ba57c26
82.76%: implement Render brake section
JohnDeved Mar 27, 2026
0cb2955
82.96%: improve Render brake light flow
JohnDeved Mar 27, 2026
f6ce868
82.99%: tighten Render brake flags
JohnDeved Mar 27, 2026
eed74de
82.992%: improve DrawKeithProjShadow clamp
JohnDeved Mar 27, 2026
e7dcdac
82.992%: improve DrawKeithProjShadow loop control
JohnDeved Mar 27, 2026
36c52e7
83.005%: improve DrawKeithProjShadow strip temporaries
JohnDeved Mar 27, 2026
a8e21f5
83.005%: improve DrawKeithProjShadow loop branch
JohnDeved Mar 27, 2026
83d47a5
83.005%: refine DrawKeithProjShadow temp order
JohnDeved Mar 27, 2026
8eb6a82
83.046%: improve DrawKeithProjShadow section flow
JohnDeved Mar 27, 2026
1797974
83.060%: improve DrawKeithProjShadow strip locals
JohnDeved Mar 27, 2026
f890222
83.060%: refine DrawKeithProjShadow start advance
JohnDeved Mar 27, 2026
076943d
83.060%: refine DrawKeithProjShadow setup order
JohnDeved Mar 27, 2026
d27f083
87.0%: recover static-init owners, improve CompositeSkin and CarRender
JohnDeved Apr 3, 2026
1c2c573
86.96%: remove duplicate ePoly ctor in headlights
JohnDeved Apr 3, 2026
81d443f
87.0%: recover headlight basis and vertex stores
JohnDeved Apr 3, 2026
057d97e
87.04%: refine headlights and engine animation
JohnDeved Apr 3, 2026
8130686
87.10%: improve effect dispatch and shadow alpha clamp
JohnDeved Apr 3, 2026
cf5ba1f
87.11%: clamp ambient shadow alpha
JohnDeved Apr 3, 2026
ecf2d77
87.13%: simplify CompositeSkin32 early exits
JohnDeved Apr 3, 2026
7ff09d8
87.13%: recover CarPart loader helpers
JohnDeved Apr 3, 2026
3979ee3
87.13%: use tire helper inlines
JohnDeved Apr 3, 2026
4df016e
87.16%: improve Keith shadow hull loop
JohnDeved Apr 3, 2026
ec0f326
87.23%: use bSub for tire skid delta
JohnDeved Apr 3, 2026
72dc886
87.23%: make UpdateTires loop unsigned
JohnDeved Apr 3, 2026
ae4e95a
87.25%: hoist UpdateTires skid width
JohnDeved Apr 3, 2026
e80787e
87.25%: reshape LoaderCarInfo vinyl branch
JohnDeved Apr 3, 2026
08f3da8
87.25%: spell out LoaderCarInfo upgrade clamp
JohnDeved Apr 3, 2026
9ffd830
87.26%: decode LoaderCarInfo part byte once
JohnDeved Apr 3, 2026
d11e604
87.26%: split LoaderCarInfo upgrade clamp
JohnDeved Apr 3, 2026
fc7ac91
87.30%: invert UpdateCarParts marker checks
JohnDeved Apr 3, 2026
86b7207
87.34%: improve RenderFlares ordering
JohnDeved Apr 3, 2026
d7be199
87.35%: split CompositeSkin texture guard
JohnDeved Apr 3, 2026
5777097
87.37%: improve skin and engine branch ordering
JohnDeved Apr 3, 2026
a505e43
87.37%: swap engine zeroing order
JohnDeved Apr 3, 2026
886dee7
87.39131%: improve VehicleRenderConn flare history
JohnDeved Apr 3, 2026
a95c844
87.39380%: reload RenderFlares info after primary draw
JohnDeved Apr 3, 2026
46f8030
87.39864%: defer RenderFlares info load until render check
JohnDeved Apr 3, 2026
8225743
87.39890%: tune RenderFlares local and streak ordering
JohnDeved Apr 3, 2026
651f5cf
87.40804%: align GetBlendColour with byte-indexed RGBA accesses
JohnDeved Apr 3, 2026
0f17edf
87.41760%: byte-index ScaleColours channels
JohnDeved Apr 3, 2026
aa9ed7e
87.42233%: store GetBlendColour channels in clamp order
JohnDeved Apr 3, 2026
ffac107
87.43662%: split ScaleColours channel scaling
JohnDeved Apr 3, 2026
6a47118
87.44146%: use compound ScaleColours channel multiplies
JohnDeved Apr 3, 2026
f61dfaa
87.45578%: recover SmackableRenderConn pivot offset setup
JohnDeved Apr 3, 2026
1a482b4
87.45834%: initialize SmackableRenderConn model pointer
JohnDeved Apr 3, 2026
b7fe77c
87.45836%: use Smackable object WUID for target reference
JohnDeved Apr 3, 2026
60fb9d6
87.48162%: match CompareCompositeParams layer tail
JohnDeved Apr 3, 2026
c1e6a92
87.49114%: force SmackableRenderConn model hash zero
JohnDeved Apr 3, 2026
d2c6ec8
87.50660%: match SmackableRenderConn constructor
JohnDeved Apr 3, 2026
902deec
87.51194%: use direct ModelNames access in GetModelNameHash
JohnDeved Apr 3, 2026
4660291
87.51530%: flip GetPartNameHash halfword order
JohnDeved Apr 3, 2026
c6564b3
87.52638%: fix LoadedWheel model hash layout
JohnDeved Apr 3, 2026
de33c3d
87.52973%: match VehicleRenderConn constructor
JohnDeved Apr 3, 2026
76b280f
87.53967%: improve HeliRenderConn matrix loop
JohnDeved Apr 3, 2026
0fc1379
87.55%: reuse Keith shadow hull pointer
JohnDeved Apr 3, 2026
102f0aa
87.56%: reuse Keith min-lend compare
JohnDeved Apr 3, 2026
28be6c1
87.56%: move ctor info lookup after culler clear
JohnDeved Apr 3, 2026
f0af10a
87.65%: flip Render marker branches
JohnDeved Apr 3, 2026
064060d
87.66%: cache FEManager in Render light setup
JohnDeved Apr 3, 2026
6571c72
87.67%: keep Render query flag as int
JohnDeved Apr 3, 2026
000dc20
87.67%: seed middle-string model hash
JohnDeved Apr 3, 2026
6d57514
87.67%: improve templated model hash init
JohnDeved Apr 3, 2026
621e7f5
87.67%: match ManageGlassDamage codegen
JohnDeved Apr 3, 2026
d020d63
87.68%: reorder IVisualTreatment ctor tail
JohnDeved Apr 3, 2026
77d2d8a
87.68%: simplify Render frame-buffer allocations
JohnDeved Apr 3, 2026
a0fd763
87.68%: reorder RenderTextureHeadlights copy
JohnDeved Apr 3, 2026
fc85e7a
87.68%: match headlight frame allocation
JohnDeved Apr 3, 2026
46c0d3a
87.68%: match CarPartModelTable::GetModelNameHash
JohnDeved Apr 3, 2026
5d8c1b3
87.68%: improve CompositeSkin32 mask-byte load
JohnDeved Apr 3, 2026
2ead88b
87.69%: widen CompositeSkin32 blend mask compare
JohnDeved Apr 3, 2026
e9e131c
87.72%: switch LoaderCarInfo vinyl branch
JohnDeved Apr 3, 2026
3bfa52d
87.79%: switch LoaderCarInfo paint branch
JohnDeved Apr 3, 2026
ab85b9e
87.793%: reorder LoaderCarInfo paint switch cases
JohnDeved Apr 3, 2026
7ce5761
87.794%: refine LoaderCarInfo paint switch order
JohnDeved Apr 3, 2026
f82fa5d
87.794%: tune LoaderCarInfo paint switch order
JohnDeved Apr 3, 2026
b538bde
87.815%: improve CompositeSkin32 blend setup order
JohnDeved Apr 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .agents/skills/code_style
1 change: 1 addition & 0 deletions .agents/skills/execute
1 change: 1 addition & 0 deletions .agents/skills/ghidra
1 change: 1 addition & 0 deletions .agents/skills/implement
1 change: 1 addition & 0 deletions .agents/skills/line_lookup
1 change: 1 addition & 0 deletions .agents/skills/lookup
1 change: 1 addition & 0 deletions .agents/skills/refiner
1 change: 1 addition & 0 deletions .agents/skills/scaffold
1 change: 1 addition & 0 deletions .claude
36 changes: 35 additions & 1 deletion .github/skills/code_style/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ python tools/code_style.py audit --base origin/main
- `audit` also checks touched `class` / `struct` declarations against known header declarations and, when no header exists, against the PS2 visibility rule.
- `audit` warns on touched local forward declarations when the repo already has a header for that type.
- `audit` warns on touched type members that look like invented padding or placeholder names such as `pad`, `unk`, or `field_1234`.
- `audit` also checks touched style-guide rules that clang-format cannot enforce for you, such as cast spacing, `using namespace`, `NULL`, and missing `EA_PRAGMA_ONCE_SUPPORTED` guard blocks when a header's guard region is touched.
- `audit` also checks touched style-guide rules that clang-format cannot enforce for you, such as cast spacing, `using namespace`, `NULL`, bare `#if MACRO` presence checks, recovered layout members that still use raw `unsigned char` / `unsigned short`, and missing or misordered `EA_PRAGMA_ONCE_SUPPORTED` guard blocks when a header's prologue is touched.
- `audit` groups repeated findings by file so branch-wide output stays readable.
- Use `audit --category safe-cpp` when you want a smaller Frontend/FEng-focused subset and `audit --category match-sensitive-cpp` when you want a conservative review queue for decomp code.
- `format --check` is an opt-in wrapper around the repo's `.clang-format`, and by default it targets eligible changed C/C++ files, including match-sensitive code.
Expand Down Expand Up @@ -95,14 +95,22 @@ Foo::Foo()
- Use `nullptr` exclusively for null pointers.
- Prefer `if (ptr)` / `if (!ptr)` over explicit null comparisons when the change is local and verified safe.
- When a match-sensitive TU has many explicit `nullptr` checks and you decide to normalize them, prefer one mechanical full-TU pass over piecemeal cleanup. Rebuild the unit and re-check its status before keeping the rewrite.
- When a helper is doing address arithmetic, prefer `intptr_t` / `uintptr_t` or byte-pointer (`reinterpret_cast<char *>`) math over plain `int` parameters or integerized pointer subtraction.
- Inline assembly is acceptable when it is needed to preserve dead-code compares, ordering, or other compiler behavior that source alone cannot reproduce.
- In low-level list / node / allocator code, prefer existing helper methods such as `AddBefore`, `AddAfter`, `Remove`, `GetPrev`, `GetNext`, or typed accessors over open-coding link rewiring once the helper exists.

### Header prologues and preprocessor checks

- In headers, keep the guard / `EA_PRAGMA_ONCE_SUPPORTED` block before any project `#include`; do not place includes ahead of `#pragma once`.
- Use `#ifdef MACRO` / `#ifndef MACRO` for presence checks. Reserve bare `#if MACRO` for cases where you really need the macro's numeric value.

### Forward declarations and local prototypes

- Prefer including the owning repo header over adding a local forward declaration for a project type.
- If the repo already has a header declaration/definition for a type, include that header instead of redeclaring the type locally.
- If the repo only has an empty or stub owner header, and line info / surrounding source clearly points at that header's subsystem, prefer populating that owner header over leaving a recovered project type declaration inside a `.cpp`.
- Only keep a local forward declaration when no canonical repo header exists yet and you have verified that the ownership is still unresolved.
- Likewise for project free functions: if a declaration is shared across translation units, move it into the owning header instead of leaving ad-hoc local prototypes in `.cpp` files.
- Prefer moving helper template declarations next to their real use site instead of leaving them in an unrelated file.

### Pointer style
Expand All @@ -114,13 +122,18 @@ Foo::Foo()

- Use the repo's header guard form when writing headers: `#ifndef` / `#define` plus the `#ifdef EA_PRAGMA_ONCE_SUPPORTED` / `#pragma once` block.
- Keep member layout comments aligned and intact in decomp headers.
- When writing a recovered layout, start from a pasted GC DWARF dump instead of hand-reconstructing a cleaner version. Treat the dump as source-of-truth data entry, then make only small verified fixes from PS2 or existing headers.
- Preserve the original `class` / `struct` kind from existing headers or Dwarf / PS2 evidence; do not treat it as a cosmetic style choice.
- Treat header declarations as the repo source of truth. If the repo only has local `.cpp` partial declarations, verify the kind with the PS2 dump instead of copying them blindly.
- Even forward declarations and local partial declarations should use the accurate keyword when known.
- Keep the `// total size: 0x...` comment above the recovered type declaration instead of burying it inside the body.
- When a recovered type is a `class`, keep explicit access sections and put the method/accessor block before the member layout block unless existing repo evidence shows otherwise.
- Preserve the member naming style that DWARF shows. Some types use `mMember`, others use `m_member`; do not normalize them.
- Preserve recovered member names, types, order, and offset comments. Do not invent placeholder members named `pad`, `unk`, `unknown`, or `field_XXXX` for game code just to make a layout compile.
- Preserve the dumped declaration order too. Do not regroup methods, helpers, enums, or fields for readability unless an existing repo header or PS2 evidence proves the original order differs.
- If a member is genuinely unknown, stop and verify it with `find-symbol.py`, GC Dwarf, and PS2 data. If the layout is still incomplete, add a short TODO above the type instead of burying uncertainty in fake member names.
- Add offset / size comments when you are writing recovered type layouts from DWARF.
- In recovered layouts, prefer explicit-width aliases such as `uint8` / `uint16` when the field width is known. Use plain `char` for text / byte buffers and `signed char` when the field is a signed 8-bit counter.
- Define inline member functions in headers only when DWARF shows that they are genuinely inlined in the binary.
- Use `struct` for POD-like data carriers with public fields; use `class` for behavior-heavy types only when that matches the recovered type information.
- Keep tiny placeholder methods as concise inline bodies when that is already the local pattern.
Expand All @@ -134,13 +147,27 @@ Foo::Foo()
### Dense local code

- Expand dense one-line helper structs, declaration blocks, and function bodies in non-match-sensitive files into normal multiline formatting.
- In low-level headers, prefer normal multi-line bodies for touched inline operators and accessors instead of stacking `{ return ...; }` on one line, unless the surrounding file clearly uses intentional placeholder one-liners.
- Prefer readable blocks over stacked one-line statements when behavior does not depend on exact source shape.
- In touched validation/parsing code, prefer explicit min/max or boundary checks over equivalent magic-constant arithmetic when the clearer form still compiles to the verified result.
- In parser/state-table code, prefer named enums and enum-typed state variables over anonymous integer state codes when that rewrite is verified safe.

### Recovery markers

- Remove stale recovery markers such as `// TODO`, `// UNSOLVED`, or `// STRIPPED` when the touched code is now implemented or understood.
- If a marker still needs to stay, give it short context such as ownership uncertainty, a Dwarf caveat, a platform/config note, or a scratch/link reference. Avoid bare marker-only comments.
- Do not leave `// TODO` hanging off a declaration or helper you just implemented; either finish the thought or remove the marker.

### Uncertain ownership

- If a declaration or global clearly compiles but its original home is uncertain, add a short TODO comment instead of inventing structure you cannot justify yet.
- When ownership matters, verify it with `decomp-workflow.py`, `decomp-context.py`, and `line-lookup` before moving code.

### Readable helper extraction

- When touched recovered code repeats the same pointer/boundary arithmetic, prefer a short named helper or accessor such as `GetTop`, `GetBot`, `GetNext`, `GetPrev`, `GetStringTableStart`, or `GetStringTableEnd` if that shape is already supported by Dwarf/inlining evidence.
- Prefer call sites that use those helpers or existing container APIs over re-encoding the same arithmetic or link manipulation inline.

## Phase 3: Things Not To "Clean Up" Blindly

- Do not move an inline method out of a header just because it looks cleaner.
Expand Down Expand Up @@ -172,3 +199,10 @@ Keep the cleanup only if the build succeeds and the relevant match status is unc
- The trailing `//` initializer-list markers are an intentional repo convention, not noise to remove.
- Small `if (ptr)` cleanup batches can be kept in match-sensitive code, but only after rebuilding the affected unit.
- Dense frontend shim files benefit from multiline struct/prototype/function formatting.
- Header prologues should keep the `EA_PRAGMA_ONCE_SUPPORTED` block ahead of includes, not after them.
- Bare `#if MACRO` presence checks are review bait; use `#ifdef` / `#ifndef` unless you are intentionally testing a numeric config value.
- Reviewed recovered headers tend to keep total-size comments above the type, methods before fields, explicit access sections, and fixed-width aliases for width-known narrow integer members.
- Recent `zMisc` review cleanup also showed that hand-reconstructed structs and reordered declarations create avoidable churn; copy recovered layouts from DWARF into the owner header first and keep the dumped order unless PS2/header evidence proves a correction.
- Reviewed fixups also remove stale bare recovery markers or replace them with context, and prefer existing list/node helpers over hand-written pointer/link rewiring.
- Some reviewed fixups improved readability without losing match by replacing opaque range-check arithmetic with explicit bounds and by moving repeated pointer/boundary math behind short named helpers.
- Other recurring review churn came from plain-`int` address helpers, stray local `.cpp` prototypes for shared functions, and integer-coded parser states where named enums were clearer but still matched.
16 changes: 16 additions & 0 deletions .github/skills/execute/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ the produced C++ compiles to byte-identical object code against the original ret

For each function, "done" means both objdiff and normalized DWARF are exact.

Human review is not a substitute for running `dwarf compare`. Each function should hit
its own `verify` gate before you treat it as ready to hand off, commit, or move past.

## Overview

This workflow combines several smaller workflows:
Expand Down Expand Up @@ -88,6 +91,10 @@ definition does not yet exist in the project, follow the scaffold workflow in
`.github/skills/scaffold/SKILL.md` to create the needed header/source definitions
before moving on.

Treat recovered types here as copied reference data, not as hand-designed headers. Copy
the GC DWARF type body into the canonical owner header first and preserve its declaration
order unless PS2 or existing repo-header evidence proves a specific correction.

## Phase 3: Implement Functions

### 3a. Get the updated function list
Expand All @@ -113,6 +120,9 @@ For each missing or nonmatching function, follow the implementation workflow in
- **One at a time.** Keep the tree in a coherent state as you work through the list.
- **Balance new vs fixing.** Don't get stuck on one stubborn function — sometimes
implementing the next function reveals patterns that make the previous one click.
- **Recovered types are not freeform.** If a function forces you to add or fix a type,
copy the DWARF layout into the owner header first. Do not sketch structs/classes from
use sites or reorder declarations just to make the header look nicer.
- **Mismatch triage:**
- `@stringBase0` offset mismatches often resolve as more string literals are added
- If you need to inspect the original string or rodata at a virtual address, use `python tools/elf_lookup.py 0xADDR`
Expand Down Expand Up @@ -152,6 +162,10 @@ python tools/decomp-workflow.py verify -u main/Path/To/TU -f FunctionName
If it fails, follow up with `decomp-workflow.py diff` and `decomp-workflow.py dwarf`
until both checks pass.

Do not queue up several "probably done" functions and leave the DWARF check for later.
Close the `verify` gate per function before moving on whenever feasible; otherwise the
reviewer ends up doing avoidable DWARF triage.

### 3g. Periodic reassessment

After every few functions, re-run the full status check:
Expand Down Expand Up @@ -189,6 +203,8 @@ For any remaining nonmatching functions, make one final pass using the implement
or refiner workflow with all context accumulated during the session.

Do not report a function as complete unless its per-function `verify` check also passes.
Do not hand a function to review as "done except maybe DWARF" — either resolve the DWARF
failure yourself or explicitly call out the blocker and why it remains.

## Phase 5: Report

Expand Down
33 changes: 33 additions & 0 deletions .github/skills/implement/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ Your goal is to decompile a specific function: writing C++ source that compiles

A function is not done until it is exact in both objdiff and normalized DWARF.

Reviewers should not be spending their time rediscovering DWARF mismatches. Before you
report progress, ask for review, hand the function off, or switch to another target, you
must run the per-function verification gate yourself and treat any DWARF failure as your
next task, not as review debt.

## Phase 1: Gather Context

Collect data from **all** of these sources in parallel where possible.
Expand Down Expand Up @@ -85,6 +90,8 @@ Reference the skill for the usage. It gives info based on the virtual address of
- If a repo header already exists for the type, include that header instead of introducing a local forward declaration.
- Preserve the original `class` vs `struct` kind. If the existing header is missing or incomplete, verify the type kind from GC Dwarf and PS2 info before writing a local declaration.
- Preserve real member names and field types too. Do not introduce `pad`, `unk`, or `field_XXXX` members as placeholders for guessed layout; verify the member list from GC Dwarf / PS2 data and leave a TODO when something is still uncertain.
- When a type is missing or incomplete, dump the full class/struct body from GC DWARF and paste that as the starting point. Do not reconstruct the layout from one function's field accesses or from guessed semantics.
- Preserve the dumped declaration order as well as the member order. Do not re-sort methods, group fields by guessed meaning, or otherwise "clean up" the layout unless an existing repo header or PS2 evidence proves a specific correction.

### 1e. Assembly reference

Expand Down Expand Up @@ -125,6 +132,8 @@ and assembly:

Utilize the dwarf information that you get from the lookup skill heavily.

For any recovered type you touch while implementing the function, treat the DWARF body as source material to copy, not prose to paraphrase. Start from the dumped layout in the canonical owner header, then make only the minimal verified fixes.

Don't add explanatory comments during implementation unless you need to document a remaining DWARF mismatch.

Don't use any temporary local variables that don't exist in the dwarf.
Expand Down Expand Up @@ -156,6 +165,16 @@ python tools/decomp-workflow.py verify -u main/Path/To/TU -f FunctionName

If the build fails, fix compilation errors first.

As soon as you have a compiling draft, run the combined verification gate immediately:

```sh
python tools/decomp-workflow.py verify -u main/Path/To/TU -f FunctionName
```

Do this before you spend a long time polishing late instruction mismatches. If `verify`
already shows a DWARF failure, fix that first so you are not polishing code the reviewer
will bounce anyway.

### Check the diff

```sh
Expand Down Expand Up @@ -203,6 +222,17 @@ debug-line owner files for each DWARF `// Range:` block, which makes it much eas
spot inlines that are coming from the wrong header or owner file. Exact line-number
agreement is a useful secondary hint, but file ownership is the first thing to check.

Use this as the default loop when the function compiles but `verify` is still failing:

1. Run `verify`.
2. If DWARF fails, run `dwarf`.
3. Fix the structural issue the DWARF diff is pointing at first: missing/extra locals,
wrong qualifiers or parameter types, wrong inline ownership, wrong helper/header owner,
or a source shape that outlined something that should be inlined.
4. Rebuild and rerun `verify`.
5. Only return to instruction-by-instruction cleanup once the remaining failures are no
longer obvious DWARF-compare issues.

Manual fallback:

After writing your code, you can also run the dwarf dump on the compiled output and then query your output dump with lookup.py to compare your decompiled functions against the originals. Since the address of the function you're working on can keep changing
Expand Down Expand Up @@ -233,6 +263,9 @@ Every mismatched instruction is a signal — don't settle for "close enough".
Reaching 100% instruction matching status is not enough. Stay in the loop until `verify`
passes, which means the DWARF of the function also matches after normalization.

Do not leave a function in a "review-ready" or "good enough for now" state with a known
DWARF failure unless you are explicitly blocked and you document that blocker clearly.

## Phase 5: Report

Summarize:
Expand Down
19 changes: 19 additions & 0 deletions .github/skills/refiner/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,25 @@ approaches that were tried before — instead, apply systematic lateral analysis
- A diff is available (`decomp-diff.py -u <TU> -d <func>`).
- The "obvious" translation from Ghidra has been attempted.
- You have been given the current source code and the diff.
- You have already run the per-function `verify` gate and know whether the remaining work
is still structural DWARF cleanup or true late-stage instruction cleanup.

Refiner is not the place to dump unresolved DWARF debt on a reviewer. If `verify` or
`dwarf` is still showing obvious structural mismatches (missing locals, wrong types,
wrong inline ownership, wrong helper/header owner), fix those first or drop back to the
implementer workflow before doing late instruction polish.

## Phase 1: Read the full diff without collapsing

Before you start a refiner pass, confirm the gate status:

```sh
python tools/decomp-workflow.py verify -u main/Path/To/TU -f FunctionName
```

If the combined gate is failing for reasons that are still clearly visible in the DWARF
diff, address those first instead of treating them as reviewer follow-up.

Preferred shortcut:

```sh
Expand Down Expand Up @@ -151,6 +167,9 @@ DWARF mismatches to watch for:
- Wrong return type
- Missing inlined function records (means an inline call was outlined)

If these mismatches are still present, you are not in pure refiner territory yet. Resolve
them before you ask a reviewer to spend time on the function.

## Phase 4: Report

Summarize:
Expand Down
Loading