Сборка NDS ROMа с помощью BAT-файла


Написать эту маленькую документацию меня заставила злость. Вчера, когда собирал ROM Наруто с помощью DSLazy и опять вместо кнопки "nds packer" нажал "nds unpack"!!!

image
И это уже не первый раз!!! Ну почему автор сделал такое неудобное расположение кнопок, что постоянно нажимаешь не на ту??? ?(????)
Решил посмотреть батник 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%


image
Как мы видим, время выводится с сотовыми долями. По сути, они нам не так важны. Но нам нужна эта переменная одна, чтобы она указывалась в имени файле. Нет проблем. Просто объединим её таким образом.


echo %CURDATE%_%CURTIME%


image
Гм... Странное дело. После года идёт пустое место. Уже как-то некрасиво идёт.
Мы можем у каждой переменной выводить необходимые нам знаки с помощи конструкции :~n,x , где n - с какого символа начинаем выводить, а х - сколько символов выводим.


@echo off
rem Объявляем в переменные CURDATE и CURTIME текущею дату и время.
set CURDATE=%DATE%
set CURTIME=%time%
rem Выводим эти значения
echo %CURDATE:~0,10%_%CURTIME:~0,8%
pause


Казалось бы, что всё правильно. Но это не так!
В Windows запрещено в именах использовать двоеточие, поэтому нам надо их убрать или заменить на что-то другое. Я решил использовать точку с запятой.

image

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-файлов. Наша папка.

image
Запускаем 1_Unpack.bat для распаковки ROMa.

image
Надпись "Не удаётся найти указанный файл." появляется из-за того, что папки rom_data нет, поэтому мы её и создаём. Когда папка буде сразу, то такая надпись появляться не будет.

image
Теперь пробуем запаковать.

image
Три раза нажал запаковать ROM.

image
Всё работает.
BAT-файлы можете скачать отсюда.