Написать эту маленькую документацию меня заставила злость. Вчера, когда собирал ROM Наруто с помощью
DSLazy и опять вместо кнопки "nds packer" нажал "nds unpack"!!!
И это уже не первый раз!!! Ну почему автор сделал такое неудобное расположение кнопок, что постоянно нажимаешь не на ту??? ?(????)
Решил посмотреть батник dslazy.bat, что лежит с программой. Меня заинтересовал код распаковки и запаковки.
IF %~1 == UNPACK (
rd /Q /S NDS_UNPACK
mkdir NDS_UNPACK
ndstool -v -x current.nds -9 NDS_UNPACK/arm9.bin -7 NDS_UNPACK/arm7.bin -y9 NDS_UNPACK/y9.bin -y7 NDS_UNPACK/y7.bin -d NDS_UNPACK/data -y NDS_UNPACK/overlay -t NDS_UNPACK/banner.bin -h NDS_UNPACK/header.bin
)
IF %~1 == PACK (
ndstool -c current.nds -9 NDS_UNPACK/arm9.bin -7 NDS_UNPACK/arm7.bin -y9 NDS_UNPACK/y9.bin -y7 NDS_UNPACK/y7.bin -d NDS_UNPACK/data -y NDS_UNPACK/overlay -t NDS_UNPACK/banner.bin -h NDS_UNPACK/header.bin
)
Решил пояндексить ещё примеры BAT-файлов для DSLazy.
Третья ссылка была на тему форума Шедевра "Princess Maker 4 DS Special Edition", где HoRRoR выложил код BAT-файла распаковки ROMa.
@echo off
set rom=pm4.nds
set dir=rom_data
echo Preparation...
rd /Q /S %dir% > nul
mkdir %dir% > nul
echo Extracting...
ndstool -v -x %rom% -9 %dir%\arm9.bin -7 %dir%\arm7.bin -y9 %dir%\y9.bin -y7 %dir%\y7.bin -d %dir%\data -y %dir%\overlay -t %dir%\banner.bin -h %dir%\header.bin > nul
echo Done!
pause
Весь код заключается в следующем:
1) В начале присваиваем переменной rom название ROMa с которым будем работать.
2) В переменной dir указываем папку rom_data, куда будем распаковывать ROM.
3) Далее у нас идёт проверка на наличие данной папки и если её нет, то создаем.
4) И наконец сама распаковка, куда в отличие от оригинального кода, где вместо ROMa указан current.nds, а папка для распаковки жестко прописана как NDS_UNPACK - сюда вставлены переменные, которые в начале мы объявляем.
Хорошо скажете вы, но это же код HoRRoRa, а не твой! Согласен!
Но! BAT-файл сборки тут не указан + мы сделаем бекапирование файлов.
По сути у нас уже написан готовый оригинальный код сборки.
ndstool -c current.nds -9 NDS_UNPACK/arm9.bin -7 NDS_UNPACK/arm7.bin -y9 NDS_UNPACK/y9.bin -y7 NDS_UNPACK/y7.bin -d NDS_UNPACK/data -y NDS_UNPACK/overlay -t NDS_UNPACK/banner.bin -h NDS_UNPACK/header.bin
Здесь нужно только current.nds заменить на %rom%, а NDS_UNPACK/ на %dir%\.
@echo off
set rom=NAME_ROM
set dir=rom_data
echo Compressing...
ndstool -c %rom% -9 %dir%\arm9.bin -7 %dir%\arm7.bin -y9 %dir%\y9.bin -y7 %dir%\y7.bin -d %dir%\data -y %dir%\overlay -t %dir%\banner.bin -h %dir%\header.bin > nul
echo Done!
pause
Далее разъясним, что из себя представляет backup. Это точная копия файла созданная на данный период времени. То есть после сборки ROMa, нам нужно сохранить этот РОМ в другой папке с указанием времени компиляции, чтобы проще было их различать.
В CMD есть команда
DATE для отображения текущей даты (и изменения на новую) и команда
TIME для отображения текущего времени (и изменения на новое).
@echo off
rem Объявляем в переменные CURDATE и CURTIME текущею дату и время.
set CURDATE=%DATE%
set CURTIME=%time%
rem Выводим эти значения
echo %CURDATE%
echo %CURTIME%
Как мы видим, время выводится с сотовыми долями. По сути, они нам не так важны. Но нам нужна эта переменная одна, чтобы она указывалась в имени файле. Нет проблем. Просто объединим её таким образом.
echo %CURDATE%_%CURTIME%
Гм... Странное дело. После года идёт пустое место. Уже как-то некрасиво идёт.
Мы можем у каждой переменной выводить необходимые нам знаки с помощи конструкции
:~n,x , где
n - с какого символа начинаем выводить, а
х - сколько символов выводим.
@echo off
rem Объявляем в переменные CURDATE и CURTIME текущею дату и время.
set CURDATE=%DATE%
set CURTIME=%time%
rem Выводим эти значения
echo %CURDATE:~0,10%_%CURTIME:~0,8%
pause
Казалось бы, что всё правильно. Но это не так!
В Windows запрещено в именах использовать двоеточие, поэтому нам надо их убрать или заменить на что-то другое. Я решил использовать точку с запятой.
echo %CURDATE:~0,10%_%CURTIME:~0,2%;%CURTIME:~3,2%;%CURTIME:~6,2%
Внимание! Сразу хочу обратить внимание. Такое имя нам не даст сохранить т.к. знак двоеточие надо экранировать. Для этого просто откроем кавычку ".
Для перемещения файла будем использовать команду
COPY с параметром
/Y, чтобы не спрашивать подтверждение файла. Да у нас и не смогут одинаковые файлы быть. У нас же время постоянно меняется.
И параметр
/V проверяет правильность копирования файла.
В итоге у нас получился следующий код.
Первый батник для распаковки 1_Unpack.bat.
@echo off
set rom=NarutoRUS.nds
set dir=rom_data
echo Preparation...
rd /Q /S %dir% > nul
mkdir %dir% > nul
echo Extracting...
ndstool -v -x %rom% -9 %dir%\arm9.bin -7 %dir%\arm7.bin -y9 %dir%\y9.bin -y7 %dir%\y7.bin -d %dir%\data -y %dir%\overlay -t %dir%\banner.bin -h %dir%\header.bin > nul
echo Done!
pause
Первый батник для распаковки 2_Packing.bat.
@echo off
set rom=NarutoRUS
set dir=rom_data
set archives=backup
set CURDATE=%DATE%
set CURTIME=%time%
echo Compressing...
ndstool -c %rom%.nds -9 %dir%\arm9.bin -7 %dir%\arm7.bin -y9 %dir%\y9.bin -y7 %dir%\y7.bin -d %dir%\data -y %dir%\overlay -t %dir%\banner.bin -h %dir%\header.bin > nul
mkdir %archives% > nul
copy /Y /V %rom%.nds %archives%\%rom%_"%CURDATE:~0,10%_%CURTIME:~0,2%;%CURTIME:~3,2%;%CURTIME:~6,2%.nds
echo Done!
pause
Хочу обратить внимание на одну вещь.
В первом батнике у имени файла есть окончание .nds , здесь мы его не должны писать (ну никто не запрещает писать, просто в имени будет .nds перед временем).
Проверяем работу BAT-файлов. Наша папка.
Запускаем 1_Unpack.bat для распаковки ROMa.
Надпись "Не удаётся найти указанный файл." появляется из-за того, что папки rom_data нет, поэтому мы её и создаём. Когда папка буде сразу, то такая надпись появляться не будет.
Теперь пробуем запаковать.
Три раза нажал запаковать ROM.
Всё работает.
BAT-файлы можете скачать
отсюда.