# Spine resource data generation script # Scans assets/spine/ directory and generates: # generated/spine_assets.js - resource name list # generated/spine_data.js - .json/.atlas text content embedded (file:// CORS fix) $ErrorActionPreference = "Stop" $scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path $projectDir = Split-Path -Parent $scriptDir $spineDir = Join-Path $projectDir "assets\spine" $outDir = Join-Path $projectDir "generated" $assetsOut = Join-Path $outDir "spine_assets.js" $dataOut = Join-Path $outDir "spine_data.js" if (-not (Test-Path $outDir)) { New-Item -ItemType Directory -Path $outDir | Out-Null } if (-not (Test-Path $spineDir)) { Write-Host "[WARN] Spine assets directory not found: $spineDir — generating empty files" -ForegroundColor Yellow $jsonFiles = @() } else { $jsonFiles = Get-ChildItem $spineDir -Filter "*.json" | Sort-Object Name } if ($jsonFiles.Count -eq 0) { Write-Host "[INFO] No .json files found — generating empty placeholder files" -ForegroundColor Yellow $utf8NoBom = New-Object System.Text.UTF8Encoding($false) [System.IO.File]::WriteAllText($assetsOut, "// Spine resource list (auto-generated, do not edit manually)`ngameabc_face.spineAssets = [];`n", $utf8NoBom) [System.IO.File]::WriteAllText($dataOut, "// Spine text data (auto-generated, do not edit manually)`ngameabc_face.spineTextData = {};`n", $utf8NoBom) Write-Host "[OK] $assetsOut (empty)" -ForegroundColor Green Write-Host "[OK] $dataOut (empty)" -ForegroundColor Green exit 0 } $names = @() foreach ($f in $jsonFiles) { $names += $f.BaseName } Write-Host "Found $($names.Count) Spine resource(s): $($names -join ', ')" -ForegroundColor Cyan # ==================== spine_assets.js ==================== $assetsSB = [System.Text.StringBuilder]::new() [void]$assetsSB.AppendLine('// Spine resource list (auto-generated, do not edit manually)') [void]$assetsSB.Append('gameabc_face.spineAssets = [') for ($i = 0; $i -lt $names.Count; $i++) { if ($i -gt 0) { [void]$assetsSB.Append(',') } [void]$assetsSB.AppendLine('') [void]$assetsSB.Append("`t`"$($names[$i])`"") } [void]$assetsSB.AppendLine('') [void]$assetsSB.AppendLine('];') $utf8NoBom = New-Object System.Text.UTF8Encoding($false) [System.IO.File]::WriteAllText($assetsOut, $assetsSB.ToString(), $utf8NoBom) Write-Host "[OK] $assetsOut" -ForegroundColor Green # ==================== spine_data.js ==================== $dataSB = [System.Text.StringBuilder]::new() [void]$dataSB.AppendLine('// Spine text data (auto-generated, do not edit manually)') [void]$dataSB.AppendLine('// Embeds .json/.atlas content into JS to bypass file:// XHR CORS') [void]$dataSB.AppendLine('gameabc_face.spineTextData = {};') $totalOriginal = 0 foreach ($name in $names) { foreach ($ext in '.json', '.atlas') { $filePath = Join-Path $spineDir "$name$ext" if (-not (Test-Path $filePath)) { Write-Host "[WARN] Missing file: $name$ext" -ForegroundColor Yellow continue } $raw = [System.IO.File]::ReadAllText($filePath, [System.Text.Encoding]::UTF8) $totalOriginal += (Get-Item $filePath).Length $escaped = $raw.Replace('\', '\\').Replace("'", "\'") $escaped = $escaped.Replace("`r`n", '\n').Replace("`n", '\n').Replace("`r", '') [void]$dataSB.AppendLine("gameabc_face.spineTextData['$name$ext'] = '$escaped';") } } [System.IO.File]::WriteAllText($dataOut, $dataSB.ToString(), $utf8NoBom) $dataSize = (Get-Item $dataOut).Length $overhead = $dataSize - $totalOriginal Write-Host "[OK] $dataOut" -ForegroundColor Green Write-Host '' Write-Host '=== Summary ===' -ForegroundColor Cyan Write-Host " Resources: $($names.Count)" Write-Host " Original size: $([math]::Round($totalOriginal/1024, 1)) KB" Write-Host " Output size: $([math]::Round($dataSize/1024, 1)) KB (overhead: $overhead bytes)"