【PowerShell】mGBAのセーブデータからRTC情報を削除する

PowerShell 7 Windows

初めに

AndroidスマホでGBC・GBAエミュレータのJohn GBACを使って、今更ポケモン第3世代を再開しました。
PCではmGBAを使っていたため、そのセーブデータを共有したところ、mGBAで作成したセーブデータをJohn GBACで読み込めないことが判明しました。
原因はmGBAのセーブデータの末尾16バイトにRTC情報が内包されており、John GBACが想定していないセーブデータ形式だったためです。
(John GBACはRTC情報は別ファイルとして保存しています)

mGBAの設定でRTC情報をセーブデータに内包させないようにしたかったのですが、2024年12月時点でそのような設定は見受けられませんでした。
そのため、PowerShellでmGBAのセーブデータからRTC情報を削除するスクリプトを作成したため、下記にて紹介します。

mGBAのセーブデータからRTC情報を削除するスクリプト

前提

PowerShellのバージョンは「7.4.6」です。

スクリプト

param (
    [string]$filePath
)

# ファイルが存在するか確認
if (Test-Path $filePath) {
    # ファイルのサイズを取得
    $fileInfo = Get-Item $filePath
    $fileSize = $fileInfo.Length

    # ファイルサイズが131,088バイトであるか確認
    if ($fileSize -eq 131088) {
        # 末尾16バイトを削減したサイズを計算
        $newSize = $fileSize - 16

        # ファイルを開いて新しいサイズでトリム
        $stream = [System.IO.File]::Open($filePath, [System.IO.FileMode]::Open)
        $stream.SetLength($newSize)
        $stream.Close()

        Write-Host "ファイルの末尾16バイトを削除しました。"
    }
    else {
        Write-Host "ファイルサイズが131,088バイトでないため削除できません。"
    }
}
else {
    Write-Host "指定したファイルが存在しません。"
}

動作仕様

上記スクリプトを「tranSaveData.ps1」のように保存し、以下のようにpowershellで実行します。
 tranSaveData.ps1-filePath 対象ファイルのフルパス

このスクリプトは指定したファイルの末尾16バイトを削除します。
指定したファイルが存在しない、または実行対象外(131,088バイトでない)のファイルの場合は実行せずにエラーを吐いて終了します。

最後に

John GBACのセーブデータにRTC情報がなくても、mGBAでは普通に読み込みできます。
あくまでもmGBA→John GBACへのセーブデータ共有向けです。

コメント