форум группы Chief-Net » » Программирование » Patch Creator

Страниц (1): [1]
 

1. Guyver - 12 Июля, 2026 - 15:45:30 - перейти к сообщению
Программа Patch Creator при создании патчей учитывает EOF-коллизии и способна создавать/применять патчи с RLE-сжатием и без него. Для работы с файлами больше 16 мБ она поддерживает формат IPS-EXT (при выборе файла более 16 МБ программа автоматически переключается в режим IPS-EXT).

Можно перетащить файл ips или ips32 на программу, тогда она запустится и попросит открыть файл, который вы собираетесь патчить.

Изначально программа создавалась больше для того, чтобы копировать размер рома, crc32 и md5 в ReadMe-файл при создании патчей и размещении их на сайте. А потом разрослась до создания/применения патчей...





При желании можно работать через командную строку и batch-скрипты (к примеру, для пакетного создания/применения патчей). Через командную строку программа намного быстрее работает с большими файлами.





2. Guyver - 12 Июля, 2026 - 15:49:59 - перейти к сообщению
Памятка по консольным командам:

СОЗДАНИЕ ПАТЧА
CODE:
PC.exe create <оригинал> <модификация> <патч>
PC.exe c <оригинал> <модификация> <патч>


ПРИМЕНЕНИЕ ПАТЧА
CODE:
PC.exe apply <патч> <оригинал> <результат>
PC.exe a <патч> <оригинал> <результат>


СПРАВКА
CODE:
PC.exe help


ОТКРЫТЬ ПАТЧ В GUI
CODE:
PC.exe <путь_к_патчу>


Форматы:

*.ips — классический IPS (до 16 МБ)
*.ips32 — расширенный IPS-EXT (до 4 ГБ)
Формат определяется автоматически по размеру файлов.
ВАЖНО: пути и названия файлов с пробелами нужно "заключать в кавычки"!
3. Guyver - 12 Июля, 2026 - 15:51:21 - перейти к сообщению
Примеры использования bat файлов:

Создание патча:

CODE:
@echo off
setlocal EnableDelayedExpansion
cd /d "%~dp0"

if not exist "PC.exe" (echo [ERROR] PC.exe not found! & pause & exit /b 1)
if not exist "original.sfc" (echo [ERROR] original.sfc not found! & pause & exit /b 1)
if not exist "modified.sfc" (echo [ERROR] modified.sfc not found! & pause & exit /b 1)

echo Creating patch...
"PC.exe" create "original.sfc" "modified.sfc" "patch.ips"

if !ERRORLEVEL! EQU 0 (echo [OK] Patch created: patch.ips) else (echo [ERROR] Failed!)
pause


Применение патча:

CODE:
@echo off
setlocal EnableDelayedExpansion
cd /d "%~dp0"

if not exist "PC.exe" (echo [ERROR] PC.exe not found! & pause & exit /b 1)
if not exist "original.sfc" (echo [ERROR] original.sfc not found! & pause & exit /b 1)
if not exist "patch.ips" (echo [ERROR] patch.ips not found! & pause & exit /b 1)

echo Applying patch...
"PC.exe" apply "patch.ips" "original.sfc" "output.sfc"

if !ERRORLEVEL! EQU 0 (echo [OK] Result: output.sfc) else (echo [ERROR] Failed!)
pause


Пакетное создание патчей:

CODE:
@echo off
setlocal EnableDelayedExpansion
cd /d "%~dp0"

if not exist "PC.exe" (echo [ERROR] PC.exe not found! & pause & exit /b 1)
if not exist "Original" mkdir "Original"
if not exist "Modified" mkdir "Modified"
if not exist "Patches" mkdir "Patches"

set /a OK=0
set /a FAIL=0

for %%F in ("Modified\*.sfc") do (
if exist "Original\%%~nxF" (
"PC.exe" create "Original\%%~nxF" "%%F" "Patches\%%~nF.ips"
if !ERRORLEVEL! EQU 0 (set /a OK+=1) else (set /a FAIL+=1)
) else (
echo [SKIP] %%~nxF - no original
set /a FAIL+=1
)
)

echo Done: !OK! OK, !FAIL! failed
pause


Пакетное применение патчей:

CODE:
@echo off
setlocal EnableDelayedExpansion
cd /d "%~dp0"

if not exist "PC.exe" (echo [ERROR] PC.exe not found! & pause & exit /b 1)
if not exist "Patched" mkdir "Patched"

set /a OK=0
set /a FAIL=0

for %%F in ("Patches\*.ips") do (
set "ORIG="
if exist "Original\%%~nF.sfc" set "ORIG=Original\%%~nF.sfc"
if exist "Original\%%~nF.nes" set "ORIG=Original\%%~nF.nes"
if exist "Original\%%~nF.gba" set "ORIG=Original\%%~nF.gba"

if defined ORIG (
"PC.exe" apply "%%F" "!ORIG!" "Patched\%%~nF_patched.sfc"
if !ERRORLEVEL! EQU 0 (set /a OK+=1) else (set /a FAIL+=1)
) else (
echo [SKIP] %%~nF.ips - no original
set /a FAIL+=1
)
)

echo Done: !OK! OK, !FAIL! failed
pause


Мод установки перевода:

CODE:
@echo off
setlocal EnableDelayedExpansion
cd /d "%~dp0"

echo Russian Translation Installer v1.0
echo Required: Game (Japan).nes
echo.
set /p OK="Continue? (Y/N): "
if /i not "%OK%"=="Y" exit /b 0

if not exist "PC.exe" (echo [ERROR] PC.exe not found! & pause & exit /b 1)
if not exist "Game (Japan).nes" (echo [ERROR] ROM not found! & pause & exit /b 1)

echo Creating backup...
copy "Game (Japan).nes" "Game (Japan).nes.bak" >nul

echo Applying patch...
"PC.exe" apply "translation.ips" "Game (Japan).nes" "Game (Russian).nes"

if !ERRORLEVEL! EQU 0 (echo [OK] Done! Run Game (Russian).nes) else (
echo [ERROR] Failed! Restoring backup...
copy "Game (Japan).nes.bak" "Game (Japan).nes" >nul
)
pause


Перетаскивание файла *.ips на файл *.bat:

CODE:
@echo off
setlocal EnableDelayedExpansion
cd /d "%~dp0"

if "%~1"=="" (echo Drag an .ips file onto this script! & pause & exit /b 1)
if not exist "PC.exe" (echo [ERROR] PC.exe not found! & pause & exit /b 1)

echo Patch: %~nx1
set /p ROM="Enter original ROM path: "

"PC.exe" apply "%~1" "%ROM%" "patched_output.sfc"

if !ERRORLEVEL! EQU 0 (echo [OK] Result: patched_output.sfc) else (echo [ERROR] Failed!)
pause


Ещё один пример простого скрипта:

CODE:
@echo off
setlocal EnableDelayedExpansion
cd /d "%~dp0"

if not exist "PC.exe" (echo [ERROR] PC.exe not found! & pause & exit /b 1)
if not exist "base.sfc" (echo [ERROR] base.sfc not found! & pause & exit /b 1)
if not exist "patch.ips" (echo [ERROR] patch.ips not found! & pause & exit /b 1)

if exist "final.sfc" del "final.sfc"

"PC.exe" apply "patch.ips" "base.sfc" "final.sfc"

if !ERRORLEVEL! EQU 0 (
echo [OK] Build complete: final.sfc
if not exist "Release" mkdir "Release"
copy "final.sfc" "Release\" >nul
) else (
echo [ERROR] Build failed!
)
pause
4. Guyver - 13 Июля, 2026 - 12:51:01 - перейти к сообщению
Версия 1.0.0.1:

Недостатком ips патчей является то, что если файл оригинала больше, чем файл модификации, то при применении патча к оригинальному файлу он не обрезается до размера модификации и остаётся таким же большим. Поэтому в программу добавлена возможность создания патчей для таких случаев: "IPS-EXT (с обрезкой файлов)". Отличие такого патча от стандартного ips32 в том, что в его конце после EOF задаются 8 байт, в которые записывается размер файла модификации. И при применении такого патча файл оригинала обрезается до нужного размера. При этом другие программы будут работать с таким ips32 патчем как и раньше, так как они не воспринимают информацию после EOF, но не будут обрезать файл оригинала.



Что нового:
* добавлена возможность создавать/применять ips32 с обрезкой файлов
* в консольные команды добавлена команда trim
* увеличено быстродействие программы
* программа работает по двум алгоритмам: для файлов до 750 Мб и больше 750 Мб (этот алгоритм медленнее, так как память берётся не из оперативки)

новая консольная команда:
CODE:
PC.exe create trim <оригинал> <модификация> <патч>

5. Griever - 13 Июля, 2026 - 19:33:35 - перейти к сообщению
Guyver пишет:

Недостатком ips патчей является то, что если файл оригинала больше, чем файл модификации, то при применении патча к оригинальному файлу он не обрезается до размера модификации и остаётся таким же большим.

Не хочется быть Бабой-ягой, но у ips куча других недостатков. Типа 1 мб на offset, отсутствие чексуммы, или (мой любимый) коллизия с EOF маркером.
Решение - переходить на другие форматы. BPS и UPS, кажется, корректно справляются с ситуациям, когда измененный файл меньше оригинального.
6. Guyver - 14 Июля, 2026 - 00:46:08 - перейти к сообщению
EOF-Коллизии можно же избежать, сдвинув блок при создании патча (сделать смещение)? Так что это не недостаток, а недочёт при программировании.

Спойлер (Отобразить)


Отсутствие чексуммы, как по мне, это хорошо. Я могу патчить не оригинальные файлы, а хаки, к примеру...



А так я не уверял, что формат без других недостатков. Просто для моих любимых переводов на денди его хватает...

Я сделал BPS и UPS, всё прекрасно работает, патчи меньше и у них много преимуществ, но... Оказывается, форматы не очень-то и унифицированные. Я скачал несколько патчеров - и некоторые даже со своими созданными патчами не всегда дружат (!), я уж не говорю про сторонние... Как я подозреваю, не все они работают с маленькими файлами...

Спойлер (Отобразить)


Поэтому я не стал пока их использовать...

Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®