<# .SYNOPSIS Poe a arte do PWRO nas duas telas que o jogador ve ANTES de entrar no jogo. .DESCRIPTION Sao duas telas da Gravity, as unicas que aparecem com o jogo abrindo: login_interface\warning.bmp o aviso coreano de faixa etaria (12 anos), login_interface\warning2.bmp que nem se aplica a um servidor brasileiro bgi_temp.bmp o fundo do login e da escolha de servidor A arte viaja como UM jpg de ~670 KB e vira BMP aqui, na maquina do jogador. Os tres BMPs somados dao 10,6 MB: baixar isso a cada instalacao, para uma imagem que o cliente vai esticar de qualquer jeito, nao se paga. A pasta da interface tem, no disco, um nome diferente do que o GRF diz -- ver Nome-No-Disco mais abaixo. Escrever com o nome em coreano cria uma pasta que o cliente nunca le; foi o erro que custou a fase inteira de traducao (docs/o-que-o-cliente-le.md). Idempotente: grava PWRO\telas\aplicado.txt com o SHA-256 da arte e nao redesenha nada enquanto a arte e os destinos continuarem os mesmos. Quem abre a janela do PWRO toda vez nao paga 10 MB de escrita por isso. .PARAMETER Desfazer Apaga os BMPs que este script gravou -- o cliente volta a ler as telas originais de dentro do data.grf, que nunca foram tocadas. .EXAMPLE .\Telas-PWRO.ps1 -Cliente "C:\Gravity\WG" #> param( [Parameter(Mandatory = $true)][string]$Cliente, [string]$Arte, [switch]$Desfazer ) $ErrorActionPreference = 'Stop' function Ok($t) { Write-Host " [ok] $t" -ForegroundColor Green } function Aviso($t){ Write-Host " [!] $t" -ForegroundColor Yellow } function Erro($t) { Write-Host " [erro] $t" -ForegroundColor Red } if (-not (Test-Path -LiteralPath $Cliente)) { Erro "pasta do cliente nao existe: $Cliente"; exit 1 } # ------------------------------------------------------------ onde escrever # O cliente e um programa ANSI: ele pede a pasta em bytes CP949 e o Windows # converte pela pagina de codigo do sistema. Numa maquina brasileira o nome no # disco vira uma sequencia latina ilegivel, nao o nome coreano. O nome esta # escrito por ponto de codigo para este arquivo continuar ASCII. $UI_KO = [string]::Join('', @([char]0xC720, [char]0xC800, [char]0xC778, [char]0xD130, [char]0xD398, [char]0xC774, [char]0xC2A4)) function Nome-No-Disco([string]$coreano) { $bytes = [System.Text.Encoding]::GetEncoding(949).GetBytes($coreano) $ansi = [System.Globalization.CultureInfo]::CurrentCulture.TextInfo.ANSICodePage return [System.Text.Encoding]::GetEncoding($ansi).GetString($bytes) } $raizTex = Join-Path $Cliente 'data\texture' $raizUI = Nome-No-Disco $UI_KO if (Test-Path -LiteralPath $raizTex) { # prefere a pasta que JA existe, seja qual for o nome que ela tenha foreach ($d in (Get-ChildItem -LiteralPath $raizTex -Directory -ErrorAction SilentlyContinue)) { if ($d.Name -eq $raizUI -or $d.Name -eq $UI_KO) { $raizUI = $d.Name; break } } } $pastaUI = Join-Path $raizTex $raizUI $alvos = @( @{ rel = 'bgi_temp.bmp'; largura = 1024; altura = 768 }, @{ rel = 'login_interface\warning.bmp'; largura = 1920; altura = 1440 }, @{ rel = 'login_interface\warning2.bmp'; largura = 1920; altura = 1440 } ) $marca = Join-Path $Cliente 'PWRO\telas\aplicado.txt' # ------------------------------------------------------------ desfazer if ($Desfazer) { $n = 0 foreach ($a in $alvos) { $d = Join-Path $pastaUI $a.rel if (Test-Path -LiteralPath $d) { Remove-Item -LiteralPath $d -Force; $n++ } } if (Test-Path -LiteralPath $marca) { Remove-Item -LiteralPath $marca -Force } Ok "$n tela(s) removida(s) -- o cliente volta a usar as da Gravity" exit 0 } # ------------------------------------------------------------ achar a arte if (-not $Arte) { $raizRepo = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) foreach ($c in @((Join-Path $Cliente 'PWRO\telas\pwro.jpg'), (Join-Path $PSScriptRoot 'PWRO\telas\pwro.jpg'), # dentro do PACOTE a arte viaja em patch-2025\ e este script # fica na raiz, do mesmo jeito que a tabela dos botoes (Join-Path $PSScriptRoot 'patch-2025\PWRO\telas\pwro.jpg'), (Join-Path $raizRepo 'client\patch-2025\PWRO\telas\pwro.jpg'))) { if (Test-Path -LiteralPath $c) { $Arte = $c; break } } } if (-not $Arte -or -not (Test-Path -LiteralPath $Arte)) { Aviso 'pwro.jpg nao encontrado -- as telas continuam as da Gravity' exit 0 } # ------------------------------------------------------------ ja esta feito? $hash = (Get-FileHash -LiteralPath $Arte -Algorithm SHA256).Hash.ToLowerInvariant() $assinatura = $hash + '|' + (($alvos | ForEach-Object { $_.rel + ':' + $_.largura + 'x' + $_.altura }) -join ',') $todosLa = $true foreach ($a in $alvos) { if (-not (Test-Path -LiteralPath (Join-Path $pastaUI $a.rel))) { $todosLa = $false } } if ($todosLa -and (Test-Path -LiteralPath $marca)) { $antiga = (Get-Content -LiteralPath $marca -Raw -ErrorAction SilentlyContinue) if ($antiga -and $antiga.Trim() -eq $assinatura) { Ok 'telas do PWRO ja estao no lugar'; exit 0 } } # ------------------------------------------------------------ desenhar Add-Type -AssemblyName System.Drawing $feitas = 0 $origem = [System.Drawing.Image]::FromFile((Resolve-Path -LiteralPath $Arte).Path) try { foreach ($a in $alvos) { $destino = Join-Path $pastaUI $a.rel New-Item -ItemType Directory -Path (Split-Path -Parent $destino) -Force | Out-Null # Format24bppRgb: e o que a Gravity usa nestas duas telas, e o que o # cliente abre sem pensar. Salvar com canal alfa aqui da tela preta. $bmp = New-Object System.Drawing.Bitmap($a.largura, $a.altura, [System.Drawing.Imaging.PixelFormat]::Format24bppRgb) try { $g = [System.Drawing.Graphics]::FromImage($bmp) try { $g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic $g.PixelOffsetMode = [System.Drawing.Drawing2D.PixelOffsetMode]::HighQuality $g.DrawImage($origem, 0, 0, $a.largura, $a.altura) } finally { $g.Dispose() } $bmp.Save($destino, [System.Drawing.Imaging.ImageFormat]::Bmp) $feitas++ } finally { $bmp.Dispose() } } } catch { Erro "nao consegui gravar as telas: $($_.Exception.Message)" exit 1 } finally { $origem.Dispose() } New-Item -ItemType Directory -Path (Split-Path -Parent $marca) -Force | Out-Null Set-Content -LiteralPath $marca -Value $assinatura -Encoding ASCII Ok "$feitas tela(s) com a arte do PWRO" exit 0