param( [string]$FragmentMoveFile = "Unity/Assets/Scripts/TH1_Anim/Fragments/FragmentMove.cs", [string]$UnitRendererFile = "Unity/Assets/Scripts/TH1_Renderer/UnitRenderer.cs" ) $ErrorActionPreference = "Stop" $repoRoot = git rev-parse --show-toplevel 2>$null if (-not $repoRoot) { throw "Not inside a git repository." } $repoRoot = [System.IO.Path]::GetFullPath($repoRoot.Trim()) $fragmentMovePath = Join-Path $repoRoot $FragmentMoveFile $unitRendererPath = Join-Path $repoRoot $UnitRendererFile if (-not (Test-Path -LiteralPath $fragmentMovePath)) { throw "FragmentMove file not found: $fragmentMovePath" } if (-not (Test-Path -LiteralPath $unitRendererPath)) { throw "UnitRenderer file not found: $unitRendererPath" } $fragmentMoveText = Get-Content -LiteralPath $fragmentMovePath -Raw -Encoding UTF8 $unitRendererText = Get-Content -LiteralPath $unitRendererPath -Raw -Encoding UTF8 foreach ($needle in @( 'public void InstantUpdateUnitImageOnly()', 'RenderUpdateUnitImage();' )) { if (-not $unitRendererText.Contains($needle)) { throw "Move transform visual-refresh guardrail failed: UnitRenderer missing '$needle'." } } foreach ($needle in @( 'Data.UnitRenderer?.InstantUpdateUnitImageOnly();', 'Data.UnitRenderer.AnimManager.EnqueueAnim(UnitAtomAnimType.Move,animData);', 'Data.UnitRenderer?.InstantUpdateUnit(true);' )) { if (-not $fragmentMoveText.Contains($needle)) { throw "Move transform visual-refresh guardrail failed: FragmentMove missing '$needle'." } } $startRefresh = $fragmentMoveText.IndexOf('Data.UnitRenderer?.InstantUpdateUnitImageOnly();') $moveAnim = $fragmentMoveText.IndexOf('Data.UnitRenderer.AnimManager.EnqueueAnim(UnitAtomAnimType.Move,animData);') if ($startRefresh -lt 0 -or $moveAnim -lt 0 -or $startRefresh -gt $moveAnim) { throw "Move transform visual-refresh guardrail failed: FragmentMove must refresh transformed unit image before starting the move animation." } Write-Host "Move transform visual-refresh guardrail passed."