The 0xBBE heat-sink BANK was built as a plain HeatSink, so the numeric-R cockpit gauge binding HeatSink/AmbientTemperature (L4GAUGE.CFG:4552) had no publisher -> the LAST unresolved config attribute. Reconstruct AggregateHeatSink : HeatSink (ctor @4ae8d0, own GUID 0x50e590), byte-exact + static_assert-locked (heatSinkCount@0x1D0, ambientTemperature @0x1D4=300, helper@0x1D8 0xC link node, sizeof 0x1E4 == factory alloc @9993). Publish HeatSinkCount + AmbientTemperature via a dense-prefix attribute table chained to HeatSink::NextAttributeID (shared HeatSink table unchanged, so CoolantMass/CoolantCapacity keep resolving). Move CreateHeatSinkBankSubsystem into heatfamily_reslice.cpp (needs the class def) and build the real class at factory case 0xBBE; mech.cpp unchanged. DELIBERATE DEVIATION (documented in the class): keep the base HeatSinkSimulation the HeatSink ctor installs; do NOT reimplement the authentic Performance @4ae73c -- it derefs a raw self+0xE0 -> [+0x158] that does not map in our compiled layout (AV/NaN, and runs for EVERY mech), and ambientTemperature is a frozen constant so the gauge reads 300 either way. Authentic relaxation model deferred. Verified: [attr] HeatSink/AmbientTemperature OK; all 50 config attribute bindings resolve (0 NULL); no every-mech crash; combat TARGET DESTROYED, FIRED #41+, un-regressed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
37 lines
1.6 KiB
PowerShell
37 lines
1.6 KiB
PowerShell
param([long]$Hwnd, [string]$Out = "w.png")
|
|
Add-Type -AssemblyName System.Drawing
|
|
Add-Type @"
|
|
using System; using System.Runtime.InteropServices;
|
|
public class P {
|
|
[DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr h, out RC r);
|
|
[DllImport("user32.dll")] public static extern bool PrintWindow(IntPtr h, IntPtr hdc, uint f);
|
|
[DllImport("user32.dll")] public static extern IntPtr GetWindowDC(IntPtr h);
|
|
[DllImport("user32.dll")] public static extern int ReleaseDC(IntPtr h, IntPtr dc);
|
|
[DllImport("user32.dll")] public static extern bool BringWindowToTop(IntPtr h);
|
|
[DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr h);
|
|
[DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr h, int c);
|
|
public struct RC { public int L,T,R,B; }
|
|
}
|
|
"@
|
|
$h = [IntPtr]$Hwnd
|
|
[void][P]::ShowWindow($h, 9) # SW_RESTORE
|
|
[void][P]::BringWindowToTop($h)
|
|
[void][P]::SetForegroundWindow($h)
|
|
Start-Sleep -Milliseconds 400
|
|
$r = New-Object P+RC; [void][P]::GetWindowRect($h, [ref]$r)
|
|
$w = $r.R - $r.L; $ht = $r.B - $r.T
|
|
if ($w -le 0 -or $ht -le 0) { Write-Host "bad rect"; exit 1 }
|
|
$bmp = New-Object System.Drawing.Bitmap $w, $ht
|
|
$g = [System.Drawing.Graphics]::FromImage($bmp)
|
|
$hdc = $g.GetHdc()
|
|
# PW_RENDERFULLCONTENT = 2 (captures DWM-composited content incl. many D3D windows)
|
|
$ok = [P]::PrintWindow($h, $hdc, 2)
|
|
$g.ReleaseHdc($hdc)
|
|
if (-not $ok) {
|
|
# fallback: screen copy of the (now foreground) window rect
|
|
$g.CopyFromScreen($r.L, $r.T, 0, 0, (New-Object System.Drawing.Size($w, $ht)))
|
|
}
|
|
$bmp.Save($Out, [System.Drawing.Imaging.ImageFormat]::Png)
|
|
$g.Dispose(); $bmp.Dispose()
|
|
Write-Host "saved $Out (${w}x${ht}) printwindow=$ok"
|