@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET BATDIR=%~dp0
REM //--------------------------------------------------------------------------
REM //静止画,動画,XML,Yaml,フォントのコピー元フォルダを、相対パス,又は,絶対パスで定義して下さい。
REM //静止画,動画,XML,Yaml,フォントは拡張子で区別するので、同じフォルダ名を指定しても構いません。
REM //下記の例はそれぞれ一つのフォルダしか指定していませんが、複数のフォルダを指定しても構いません。
REM //複数のフォルダを指定する場合は、空白で区切ってください。例:「SET IMGDIR=sozai1 sozai2 sozai3」
SET IMGDIR=sozai
SET MOVDIR=sozai
SET XMLDIR=sozai
SET YMLDIR=sozai
SET TTFDIR=sozai
REM //--------------------------------------------------------------------------
REM //静止画,動画,XML,Yaml,フォントの拡張子を定義して下さい。
REM //左側に定義された拡張子ほど優先度が高いと見なします。
REM //同じベース名で拡張子が異なるファイルが存在する場合、優先度が高いファイルだけをコピーします。
SET IMGEXT=*.png *.jpg *.gif *.bmp
SET MOVEXT=*.usm *.ogv *.avi
SET XMLEXT=*.xml
SET YMLEXT=*.yml
SET TTFEXT=*.ttf *.ttc *.otf
REM //--------------------------------------------------------------------------
REM //各種設定を行うテキストのファイル名を、相対パス,又は,絶対パスで定義して下さい。
REM //不要な設定のテキストファイル名は、空文字を設定するか,又は,未設定にして下さい。
SET PIVOTPOS_TXT=PivotPos.txt
SET TOPLEFT_TXT=TopLeft.txt
SET ALPHAMOVIE_TXT=AlphaMovie.txt
SET LOOPMOVIE_TXT=LoopMovie.txt
REM //--------------------------------------------------------------------------
REM //キャンバスサイズとギャップサイズを定義して下さい。
REM //パラメータの意味は、dpsprsht.exeを参照して下さい。
SET CANVAS_SIZE=2048x2048 -e
SET GAP_SIZE=1x1
REM //--------------------------------------------------------------------------
REM //動画スプライトの左上を原点にする場合は、MOV_CENTERの定義を無効にして下さい。
REM //動画スプライトの中央を原点にする場合は、MOV_CENTERの定義を有効にして下さい。
REM //一般的にはほとんどのスプライトが中央原点だと思うので、デフォルトではMOV_CENTERを定義する事にしました。
REM //MOV_CENTERの定義を有効にした場合も、TopLeft.txt に左上原点のスプライト名を指定して個別に変更出来ます。
SET MOV_CENTER=,,,50%%,50%%
REM //--------------------------------------------------------------------------
REM //Nuklearのカーソル画像を、素材フォルダ以外の場所に置いてある場合は、NK_CUSTOM_CURSOR_DATAの定義を有効にして下さい。
REM //Nuklearのカーソル画像も、素材フォルダ内に置いてある場合は、NK_CUSTOM_CURSOR_DATAの定義をコメントアウトして下さい。
REM //一般的には、Nuklearのカーソル画像は変更しないので、素材フォルダ内に置く必要は無く、下記の定義のままで問題有いはずです。
SET NK_CUSTOM_CURSOR_DATA=%CLIP%\nuklear\nk_custom_cursor_data.gif
REM //--------------------------------------------------------------------------
REM //バッチスクリプトと同じファイル名で拡張子が.cfgのファイルが有れば、各行が'変数名=設定値'である設定ファイルと見なして読み込み、デフォルトの設定値を上書きします。
REM //「URAMIRAIKAN」さんの「2014年05月27日 バッチファイルで外部設定ファイルを読み込む」(https://www.uramiraikan.net/Works/entry-1876.html)を参考にさせて頂きました。
REM // - "〜 tokens=1,2"ではなく"〜 tokens=1,*"とした事に注意して下さい。
REM //   "〜 tokens=1,2"では、設定値の中に区切り文字が含まれていると、設定値がそこで切られてしまうからです。
REM //   尚、"〜 tokens=1,*"と書いても"〜 tokens=1*"と書いても、同じ結果になるようです。(FORコマンドのヘルプでは後者の書き方ですが、前者の方が判り易いと思いました。)
SET CFGFILE=%~dpn0.cfg
IF EXIST "%CFGFILE%" (
  FOR /F "usebackq delims== tokens=1,*" %%i IN ("%CFGFILE%") DO (
    SET %%i=%%j
  )
)

REM //--------------------------------------------------------------------------
REM // * Sun Jan 31 21:43:46 JST 2016 Naoyuki Sawa
REM // - 1st リリース。
REM // - これは、SprDef.txtの雛形を作成するためのバッチスクリプトです。
REM //   MkSprNo.batが生成するSprDef.txtは、全ての静止画,及び,動画をそれぞれ一枚のスプライトとして定義しています。
REM //   MkSprNo.batが生成したSprDef.txtを、手で編集して、個々のスプライトを定義して下さい。
REM //   その後、MkTexNo.batを実行して、テクスチャ定義とスプライト定義のスクリプトを生成して下さい。
REM // - MkSprNo.batが生成したSprDef.txtを、手で編集した後は、MkSprNo.batを再実行しないように注意して下さい。
REM //   MkSprNo.batを再実行すると、SprDef.txtが上書きされて、手で編集した内容が消えてしまいます。
REM // * Fri Feb 19 21:59:00 JST 2016 Naoyuki Sawa
REM // - TopLeft.txt ファイルに、左上原点にするスプライト名を指定できるようにしました。
REM // - AlphaMovie.txt ファイルに、アルファムービーであるスプライト名を指定できるようにしました。
REM // * Tue Feb 23 21:00:55 JST 2016 Naoyuki Sawa
REM // - 静止画をスプライトシートにまとめるように変更しました。
REM //   MkTexNo.batとMkSprNo.batを統合し、MkTexNo.batのみにしました。
REM // - 大幅に変更したので、変更前のスクリプトはコメントアウトして残していません。
REM //   変更前のスクリプトを参照する必要が有る場合は、前回のアーカイブを参照して下さい。
REM // * Mon Mar 14 21:59:15 JST 2016 Naoyuki Sawa
REM // - dpsprsht.exeが、画像処理の方法を「ImageMagick」⇒「GDI+」に変更した事に伴い、当バッチスクリプトも変更しました。
REM //   identify.exeは使わなくなりました。
REM // * Sun Apr 03 21:51:26 JST 2016 Naoyuki Sawa
REM // - 環境変数MOVEXTに、'*.usm'を追加しました。
REM //   '*.usm'形式のファイルに対しては、SofdecProbe.exeを呼び出して情報を取得する処理を追加しました。
REM // - これまではSprDef.txtを残していましたが、当バッチスクリプトの実行後はSprDef.txtが不要である事に気付いたので、SprDef.txtを削除するようにしました。
REM // * Wed Apr 06 21:53:01 JST 2016 Naoyuki Sawa
REM // - AlphaMovie.txt ファイルに、ループムービーであるテクスチャファイル名を指定できるようにしました。
REM // * Thu Apr 14 17:28:44 JST 2016 Naoyuki Sawa
REM // - LoopMovie.txt に指定するファイル名に、拡張子を指定しなくて良いように変更しました。
REM //   これまでは、拡張子も含めて指定する必要が有ったので、ムービーの種類が変わると(*.avi/*.ogv/*.usm)、LoopMovie.txt も書き換える必要が有りました。
REM //   今後は、LoopMovie.txt にはベース名だけを指定するので、ムービーの種類が変わっても、LoopMovie.txt を書き換える必要は有りません。
REM // * Sun Apr 17 18:12:58 JST 2016 Naoyuki Sawa
REM // - dpsprsht.exeに'-f'オプションを追加した事に伴い、当バッチスクリプトも修正しました。
REM // * Fri May 06 21:58:10 JST 2016 Naoyuki Sawa
REM // - 環境変数CENTERの名前を、MOV_CENTERに変更しました。
REM //   この環境変数が影響するのは動画スプライトのみであり、静止画スプライトはdpsprsht.exeによって常に中央が原点になります。
REM //   この環境変数が影響するのは動画スプライトのみである事を明示するために、環境変数の名前をMOV_CENTERとする事にしました。
REM // - AfterEffectsアニメーションシーケンサ(バイナリ形式)のファイル(AfxBin.bin,EnmAfxBin.txt)を生成する処理を追加しました。
REM //   AfterEffectsアニメーションシーケンサ(バイナリ形式)を使用しない場合も、ダミーのファイルを生成します。
REM // * Tue May 17 21:36:02 JST 2016 Naoyuki Sawa
REM // - 環境変数IMGDIR,MOVDIR,XMLDIRに、複数のフォルダを指定出来るようにしました。
REM //   このようにした理由は、静止画/動画素材のフォルダと、AfterEffects素材のフォルダが分かれている時に、
REM //   AfterEffects素材のフォルダの中に有る静止画/動画のフッテージも、img\,mov\フォルダの中へ収集したい事が有ったからです。
REM // - 同じベース名で拡張子が異なるファイルが存在する場合、優先度が高いファイルだけをコピーするようにしました。
REM //   例えば、同じコピー元フォルダの中にfoo.avi(変換元ファイル)とfoo.ogv(変換後ファイル)が存在する場合、foo.ogv(変換後ファイル)だけがコピーされるようになりました。
REM //   これまでは、foo.avi(変換元ファイル)を削除しておく必要が有りましたが、今後は、foo.avi(変換元ファイル)が残っていても構わなくなりました。
REM // * Sat May 28 21:20:19 JST 2016 Naoyuki Sawa
REM // - dpafxbin.exeに'-o'オプションを指定して、出力ファイルを明示的に指定するように変更しました。
REM //   詳細は、/clip/tool/dpafxbin/app.c の同日のコメントを参照して下さい。
REM //   動作は、これまでと同じです。
REM // * Wed Jul 06 21:04:51 JST 2016 Naoyuki Sawa
REM // - PivotPos.txt ファイルに、個々のスプライトのピボット座標を明示的に指定出来るようにしました。
REM // * Mon Jul 25 21:36:27 JST 2016 Naoyuki Sawa
REM // - PivotPos.txt,TopLeft.txt,TopLeft.txt,LoopMovie.txtを、大文字小文字を区別しないように変更しました。
REM //    変更前は、PivotPos.txt,TopLeft.txt,TopLeft.txtはスプライト名なので大文字、LoopMovie.txtはテクスチャファイル名なので(大抵は)小文字で書く必要が有り、紛らわしい問題が有りました。
REM //    変更後は、大文字小文字を区別しないようにしたので、PivotPos.txt,TopLeft.txt,TopLeft.txt,LoopMovie.txt全て大文字(又は全て小文字)に統一して書くのが判り易いと思います。
REM // -  変更前に大文字小文字を区別していた理由は、sedのアドレス部の正規表現に、大文字小文字を区別しないオプションを指定する方法が判らなかったからです。
REM //    例えば、/regexp/is/foo/bar/と書くと、'i'が大文字小文字を区別しないオプションではなく、'i'コマンドと見なされてしまい、意図通りの動作になりません。
REM //    解決方法は、大文字小文字を区別しないオプションとして、'i'ではなく'I'を使う事です。
REM //    /regexp/Is/foo/bar/と書けば、'I'は意図通り大文字小文字を区別しないオプションと解釈されて、大文字小文字を区別せずに文字列'regexp'を含む行に対して、'foo'を'bar'に置換します。
REM //   □参照資料
REM //   「Super User - sed regexp address case-insensitive matching」(http://superuser.com/questions/612861/sed-regexp-address-case-insensitive-matching)
REM //   │Q: How to specify a sed regexp address which is case-insensitive?
REM //   │   E.g.,
REM //   │   sed '/my-kw/d'
REM //   │   But I want sed to remove lines with my-kw in any cases.
REM //   │A: sed '/my-kw/Id'
REM //   │   This will perform the match case-insensitive.
REM //   │   The switch is in uppercase itself, to avoid confusion with the i command that is offered by sed to insert a line into the stream.
REM // - ちなみに、アドレス部の正規表現だけでなく、's'コマンドに対する大文字小文字を区別しないオプションとしても、'I'は有効です。('i'でも'I'でも同じです。)
REM //   これまでは、's'コマンドに対する大文字小文字を区別しないオプションとしては'i'を使っていましたが、今後は、'I'に統一する方が判り易いかも知れません。
REM // * Sun Jul 31 21:00:54 JST 2016 Naoyuki Sawa
REM // - 2016/07/30に、SofdecProbe.exeが出力するムービー情報に、「アルファストリームの数(0,又は,1)」を追加した事に伴い、
REM //   当バッチスクリプトの「動画をそれぞれ一枚のスプライトとして定義し、SprDef.txtへ追加出力する。」において、SofdecProbe.exeの出力を解析する処理の正規表現も変更しました。
REM //   詳細は、/clip/tool/SofdecProbe/app.c の'Sat Jul 30 21:25:46 JST 2016'のコメントを参照して下さい。
REM // * Tue Aug 16 21:54:11 JST 2016 Naoyuki Sawa
REM // - IMGEXTに*.gifを追加しました。
REM //   簡単なアルファ付き素材を作成する時に、gifも使いたい事が有ったからです。
REM // * Wed Aug 17 21:19:23 JST 2016 Naoyuki Sawa
REM // - 環境変数YMLDIR,YMLEXTを追加し、Yamlファイルを'grp/yml/'フォルダに集めるようにしました。
REM //   アプリケーションが実行時にYamlファイルを読みに行くフォルダを、'grp/yml/'に統一出来るようにするためです。
REM //   (これまでは'grp/sozai/AnchorPoint.yml'や'grp/sozai/num/SpriteFont.yml'等、ばらばらのフォルダを読みに行っていました。)
REM // * Wed Aug 24 21:05:06 JST 2016 Naoyuki Sawa
REM // - IMGDIR,MOVDIR,XMLDIR,YMLDIR、IMGEXT,MOVEXT,XMLEXT,YMLEXT、CANVAS_SIZE,GAP_SIZE、MOV_CENTER等の定義を直接書き換えずに、外部設定ファイルを読み込んで定義を変更する方法を追加しました。
REM //   具体的には、"MkTexNo.cfg"というファイルの、各行に"変数名=設定値"という書式で定義を書けば、上記の設定が上書きされます。
REM //   上記の方法を追加した理由は、当バッチスクリプトの変更管理のために、極力、アプリケーション毎に、当バッチスクリプトを直接書き換えないで済むようにしたいと思ったからです。
REM // * Fri Sep 09 21:13:53 JST 2016 Naoyuki Sawa
REM // - PivotPos.txt,TopLeft.txt,AlphaMovie.txt,LoopMovie.txtのファイル名を、処理の中に直接書かずに、変数で指定するように変更しました。
REM //   変更した理由は、これらのテキストファイルを別のフォルダで管理したいケースが有り、MkTexNo.cfgに書いて変更したいと思ったからです。
REM // * Sat Sep 10 21:46:35 JST 2016 Naoyuki Sawa
REM // - 「動画をそれぞれ一枚のスプライトとして定義し、SprDef.txtへ追加出力する。」の処理において、ファイル名の'-'以降はテクスチャ名やスプライト名に含めないようにしました。
REM //   そのために、テクスチャ名を出力する処理と、スプライト名を出力する処理(合計二箇所)に、「^| onigsed.exe -e "s/-.*//" ^」を追加しました。
REM //   このようにした理由は、動画のファイル名の'-'以降は、プログラムに対するオプション指定として利用する事にしたからです。
REM //   例えば'-2x'ならば、1/2にリサイズした動画を、実行時に二倍に拡大して表示しようと思っています。('-4x','-8x'も同様です)
REM //   この仕様はまだ固まっていないので、引き続き作成しながら検証して、仕様が固まったらコメントを追記する予定です。		⇒{{2016/12/30コメント追記:Sofdec2EncHelper.exeを、入力ファイル名のサフィックスによる自動スケーリング指定に対応しました。詳細は、/clip/tool/Sofdec2EncHelper/app.cの'Fri Dec 30 21:09:49 JST 2016'のコメントを参照して下さい。}}
REM // * Tue Sep 13 21:11:40 JST 2016 Naoyuki Sawa
REM // - 2016/09/10に、ファイル名の'-'以降はテクスチャ名やスプライト名に含めないようにした事に伴い、PivotPos.txt,TopLeft.txt,AlphaMovie.txt,LoopMovie.txtの比較処理も、「\(-[_[:alnum:]]\+\)*」を含めずに比較するようにしました。
REM //   厳密には、ファイル名でなくスプライト名で比較している物も有るので、「\(-[_[:alnum:]]\+\)*」を除外しなくて良い物も有るのですが、判り易さのために上記の比較処理全てに「\(-[_[:alnum:]]\+\)*」を除外する処理を追加しました。
REM // * Fri Nov 04 21:14:19 JST 2016 Naoyuki Sawa
REM // - NK_CUSTOM_CURSOR_DATAの定義を追加しました。
REM //   '/clip/nuklear/nuklear_dxlib.cpp'の同日のコメントも参照して下さい。
REM // * Sun Nov 27 23:52:51 JST 2016 Naoyuki Sawa
REM // - 環境変数TTFDIR,TTFEXTを追加し、フォントファイルを'grp/ttf/'フォルダに集めるようにしました。
REM // * Mon Dec 12 21:05:17 JST 2016 Naoyuki Sawa
REM // - ピボット座標を明示的に指定するスプライトの、ピボット指定を置換する処理において、自動的に':'を付与するのはやめました。
REM //   PivotPos.txtの中で、%指定も使う事も有るからです。
REM //   ピクセル単位で指定する場合は、明示的に':'を書いて下さい。
REM // - しかし実際の所は、':'を書かずにこれまで通り数値だけを書いても、ピクセル単位と見なされます。
REM //   この処理の対象となるSprDef.txtは、dpsprsht.exeによって生成されたものであり、dpsprsht.exeは常に'grid 1,1'でSprDef.txtを生成するからです。
REM //   要するに、これまで自動的に':'を付与していたのは、不要な処理でした。
REM // * Sat Apr 01 23:44:39 JST 2017 Naoyuki Sawa
REM // - DTEXDEFC_OPTIONに'-a'を追加しました。
REM //   詳細は、/clip/tool/dTexDefC/winapp.hの2017/03/31のコメント,及び,/clip/DxlibHelper.cppの2017/04/01の変更点を参照して下さい。

REM //--------------------------------------------------------------------------
REM //■使用ソフトバージョン
REM //identify.exe - ImageMagick 6.9.3-5 Q16 x64 2016-02-20	⇒{{2016/03/14削除:identify.exeは使わなくなりました。}}
REM //ffprobe.exe - ffprobe version N-78358-g674cc26
REM //onigsed.exe - GNU sed version 4.1.5 with Oniguruma (ver. 2.5.0)

REM //--------------------------------------------------------------------------
REM //□前回作成したスプライトシートが残っていたら、確実に削除する。
IF EXIST SprSht*.png DEL SprSht*.png

REM //--------------------------------------------------------------------------
REM //□静止画の、各コピー元フォルダ以下に有る、各静止画を全て、imgフォルダにコピーする。
IF EXIST img\ RMDIR /S /Q img\
MKDIR img\
IF ERRORLEVEL 1 GOTO L_ERR
REM //各フォルダについて…
FOR /D %%i IN (%IMGDIR%) DO (
  REM //そのフォルダ以下の階層内に存在する、各拡張子のファイルを、コピー先フォルダにコピーする。
  REM //ここに直接'FOR /R'を書くと、何故か%%変数が上手く展開されなかったので、サブルーチン呼び出しする事にした。
  CALL :COPY_FILES %%i "%IMGEXT%" img
)
REM //□Nuklearのカーソル画像を、素材フォルダ以外の場所に置いてある場合は、それもコピー先フォルダにコピーする。
IF "%NK_CUSTOM_CURSOR_DATA%" NEQ "" (
  COPY "%NK_CUSTOM_CURSOR_DATA%" img
  IF ERRORLEVEL 1 GOTO L_ERR
)
REM //□imgフォルダ内に有る、静止画のパス名の一覧を取得する。
REM // - DIRコマンドの'/S'オプションは必要である。'/S'オプションを指定しないと、パス名に'img\'が付かないようだ。
DIR /B /S img\*.* > SprSht.txt
IF ERRORLEVEL 1 GOTO L_ERR
REM //□スプライトシート作成ツールを実行し、スプライトシートと、スプライト定義ファイルを作成する。
dpsprsht.exe -c%CANVAS_SIZE% -g%GAP_SIZE% -sSprDef.txt -fSprSht.txt
IF ERRORLEVEL 1 GOTO L_ERR
REM //□中間ファイルを削除する。
DEL SprSht.txt

REM //--------------------------------------------------------------------------
REM //□動画の、各コピー元フォルダ以下に有る、各動画を全て、movフォルダにコピーする。
IF EXIST mov\ RMDIR /S /Q mov\
MKDIR mov\
IF ERRORLEVEL 1 GOTO L_ERR
REM //各フォルダについて…
FOR /D %%i IN (%MOVDIR%) DO (
  REM //そのフォルダ以下の階層内に存在する、各拡張子のファイルを、コピー先フォルダにコピーする。
  REM //ここに直接'FOR /R'を書くと、何故か%%変数が上手く展開されなかったので、サブルーチン呼び出しする事にした。
  CALL :COPY_FILES %%i "%MOVEXT%" mov
)
REM //□動画をそれぞれ一枚のスプライトとして定義し、SprDef.txtへ追加出力する。
REM // - ECHOコマンドでなくUnxUtilsのecho.exeを使った理由は、名前の後に無駄な空白が付かないようにするためです。
REM //   無駄な空白が付加されても動作上は問題有りませんが、見た目のためにUnxUtilsのecho.exeを使う事にしました。
(FOR %%i IN (mov\*.*) DO (
  ECHO %%i >&2
  pipefail.exe -q echo.exe %%~ni ^
               ^| onigsed.exe -e "s/-.*//" ^
               ^| onigsed.exe -e "s/.*/`\U&\E/"
  IF ERRORLEVEL 1 GOTO L_ERR
  REM //拡張子を取得する。
  SET ext=%%~xi
  REM //拡張子が「.usm」ならば…
  IF /I "!ext!" EQU ".usm" (
    pipefail.exe -q SofdecProbe.exe -c %%i ^
                 ^| onigsed.exe -ne "/^\\\".*\\\",[[:digit:]]\+,[[:digit:]]\+,\([[:digit:]]\+\),\([[:digit:]]\+\),[[:digit:]]\+,[[:digit:]]\+,[[:digit:]]\+,[[:digit:]]\+,[[:digit:]]\+,[[:digit:]]\+,[[:digit:]]\+$/{s//\tgrid\t\1,\2/p;q}"
                    REM //                        width         height          disp_width        disp_height     framerate     framerate_n   framerate_d   total_frames material_width material_height alpha
    IF ERRORLEVEL 1 GOTO L_ERR
  REM //拡張子が「.usm」以外ならば…
  ) ELSE (
    REM //ffprobe.exeは動画の情報を標準エラー出力に出力するので、pipefail.exeが使えませんでした。
    REM //pipefail.exeを使わないと、パイプの中でffprobe.exeがエラーになった時に検出出来ませんが、止むを得ません。
    ffprobe.exe %%i 2>&1 ^
                  | onigsed.exe -ne "/^[[:blank:]]*\bStream\b.*\b\([[:digit:]]\+\)x\([[:digit:]]\+\)\b.*$/{s//\tgrid\t\1,\2/p;q}"
    IF ERRORLEVEL 1 GOTO L_ERR
  )
  pipefail.exe -q echo.exe %%~ni ^
               ^| onigsed.exe -e "s/-.*//" ^
               ^| onigsed.exe -e "s/.*/\t`\U&\E\t0,0%MOV_CENTER%\nend/"
  IF ERRORLEVEL 1 GOTO L_ERR
)) >> SprDef.txt

REM //--------------------------------------------------------------------------
REM //□XMLの、各コピー元フォルダ以下に有る、各XMLを全て、xmlフォルダにコピーする。
IF EXIST xml\ RMDIR /S /Q xml\
MKDIR xml\
IF ERRORLEVEL 1 GOTO L_ERR
REM //各フォルダについて…
FOR /D %%i IN (%XMLDIR%) DO (
  REM //そのフォルダ以下の階層内に存在する、各拡張子のファイルを、コピー先フォルダにコピーする。
  REM //ここに直接'FOR /R'を書くと、何故か%%変数が上手く展開されなかったので、サブルーチン呼び出しする事にした。
  CALL :COPY_FILES %%i "%XMLEXT%" xml
)
REM //□AfxBin.binとEnmAfxBin.txtを生成する。
REM // - XMLが一つも無い場合も、ダミーのAfxBin.binとEnmAfxBin.txtを生成する。
REM //   ただし、XMLが一つも無い時に'dpafxbin.exe -uEnmAfxBin.txt AfxBin.bin xml\%XMLEXT%'を実行しようとすると、ワイルドカードが展開されずにそのままのファイル名として解釈されエラーになってしまう。
REM //   上記の問題を避けるために、'IF EXIST xml\%XMLEXT%'で場合分けをしている。
IF EXIST xml\%XMLEXT% (
  dpafxbin.exe -oAfxBin.bin -uEnmAfxBin.txt xml\%XMLEXT%
  IF ERRORLEVEL 1 GOTO L_ERR
) ELSE (
  dpafxbin.exe -oAfxBin.bin -uEnmAfxBin.txt
  IF ERRORLEVEL 1 GOTO L_ERR
)

REM //--------------------------------------------------------------------------
REM //□Yamlの、各コピー元フォルダ以下に有る、各Yamlを全て、ymlフォルダにコピーする。
IF EXIST yml\ RMDIR /S /Q yml\
MKDIR yml\
IF ERRORLEVEL 1 GOTO L_ERR
REM //各フォルダについて…
FOR /D %%i IN (%YMLDIR%) DO (
  REM //そのフォルダ以下の階層内に存在する、各拡張子のファイルを、コピー先フォルダにコピーする。
  REM //ここに直接'FOR /R'を書くと、何故か%%変数が上手く展開されなかったので、サブルーチン呼び出しする事にした。
  CALL :COPY_FILES %%i "%YMLEXT%" yml
)

REM //--------------------------------------------------------------------------
REM //□フォントの、各コピー元フォルダ以下に有る、各フォントを全て、ttfフォルダにコピーする。
IF EXIST ttf\ RMDIR /S /Q ttf\
MKDIR ttf\
IF ERRORLEVEL 1 GOTO L_ERR
REM //各フォルダについて…
FOR /D %%i IN (%TTFDIR%) DO (
  REM //そのフォルダ以下の階層内に存在する、各拡張子のファイルを、コピー先フォルダにコピーする。
  REM //ここに直接'FOR /R'を書くと、何故か%%変数が上手く展開されなかったので、サブルーチン呼び出しする事にした。
  CALL :COPY_FILES %%i "%TTFEXT%" ttf
)

REM //--------------------------------------------------------------------------
REM //□ピボット座標を明示的に指定するスプライトの、ピボット指定を置換する。
REM // - PivotPos.txt には、左上原点にするスプライト名(正規表現)、空白、ピボットのX座標、空白、ピボットのY座標 を、一行づつ指定して下さい。(大文字小文字は区別しません)
REM //{{2016/12/12削除:ピボット座標を明示的に指定するスプライトの、ピボット指定を置換する処理において、自動的に':'を付与するのはやめました。
REM //REM //   PivotPos.txt で指定するピボット座標は常にピクセル単位と見なすために、下記の処理の中で':'を付与しています。
REM //}}2016/12/12削除:ピボット座標を明示的に指定するスプライトの、ピボット指定を置換する処理において、自動的に':'を付与するのはやめました。
IF NOT "%PIVOTPOS_TXT%" EQU "" (
  IF NOT EXIST "%PIVOTPOS_TXT%" GOTO L_ERR
  FOR /F "usebackq tokens=1,2,3" %%i IN (%PIVOTPOS_TXT%) DO (
    ECHO %PIVOTPOS_TXT%: %%i
REM //{{2016/12/12変更:ピボット座標を明示的に指定するスプライトの、ピボット指定を置換する処理において、自動的に':'を付与するのはやめました。
REM //    (onigsed.exe -e "/^[[:blank:]]\+`\?%%i\(-[_[:alnum:]]\+\)*[[:blank:]]\+/Is/,50%%,50%%/,:%%j,:%%k/" -i~ SprDef.txt) && (DEL *~)
REM //↓2016/12/12変更:ピボット座標を明示的に指定するスプライトの、ピボット指定を置換する処理において、自動的に':'を付与するのはやめました。
    (onigsed.exe -e "/^[[:blank:]]\+`\?%%i\(-[_[:alnum:]]\+\)*[[:blank:]]\+/Is/,50%%,50%%/,%%j,%%k/" -i~ SprDef.txt) && (DEL *~)
REM //}}2016/12/12変更:ピボット座標を明示的に指定するスプライトの、ピボット指定を置換する処理において、自動的に':'を付与するのはやめました。
    IF ERRORLEVEL 1 GOTO L_ERR
  )
)

REM //--------------------------------------------------------------------------
REM //□左上原点にするスプライトの、ピボット指定を削除する。
REM // - TopLeft.txt には、左上原点にするスプライト名を、一行づつ、正規表現で指定して下さい。(大文字小文字は区別しません)
IF NOT "%TOPLEFT_TXT%" EQU "" (
  IF NOT EXIST "%TOPLEFT_TXT%" GOTO L_ERR
  FOR /F "usebackq" %%i IN (%TOPLEFT_TXT%) DO (
    ECHO %TOPLEFT_TXT%: %%i
    (onigsed.exe -e "/^[[:blank:]]\+`\?%%i\(-[_[:alnum:]]\+\)*[[:blank:]]\+/Is/,\+50%%,50%%//" -i~ SprDef.txt) && (DEL *~)
    IF ERRORLEVEL 1 GOTO L_ERR
  )
)

REM //--------------------------------------------------------------------------
REM //□アルファムービーであるスプライトの、グリッドサイズを横半分にする。
REM // - AlphaMovie.txt には、アルファムービーであるスプライト名を、一行づつ、正規表現で指定して下さい。(大文字小文字は区別しません)
REM // - DxLibのアルファムービー機能を使って、ムービーの右半分にアルファ部分を置く場合のみ、指定して下さい。
REM //   Sofdecのアルファムービーを使う場合は、ムービーサイズはそのままなので、指定する必要は有りません。
IF NOT "%ALPHAMOVIE_TXT%" EQU "" (
  IF NOT EXIST "%ALPHAMOVIE_TXT%" GOTO L_ERR
  FOR /F "usebackq" %%i IN (%ALPHAMOVIE_TXT%) DO (
    ECHO %ALPHAMOVIE_TXT%: %%i
    (onigsed.exe -e "/^`\?%%i\(-[_[:alnum:]]\+\)*$/I{n;s/\([[:digit:]]\+\)\(,[[:digit:]]\+\)/\1\/2\2/}" -i~ SprDef.txt) && (DEL *~)
    IF ERRORLEVEL 1 GOTO L_ERR
  )
)

REM //--------------------------------------------------------------------------
REM //□TexDef.txtを生成する。
REM // - スプライトシート(SprSht*.png)と、個々の動画(mov\*.*)に対して実行する。
REM //   個々の静止画(img\*.*)は実行時には使用しないので、不要である。
DIR /B /S SprSht*.png mov\*.* > TexDef.txt
IF ERRORLEVEL 1 GOTO L_ERR
(onigsed.exe -e "s/^.*\\\(grp\\.*\)$/\"\1\"/" -i~ TexDef.txt) && (DEL *~)
IF ERRORLEVEL 1 GOTO L_ERR

REM //--------------------------------------------------------------------------
REM //□ループムービーであるテクスチャに、loopフラグを追加する。
REM // - LoopMovie.txt には、ループムービーであるテクスチャファイル名を、一行づつ、正規表現で指定して下さい。(大文字小文字は区別しません)
REM //   先頭と末尾のダブルクォーテーション,及び,'grp\mov\',及び,拡張子は、自動的に補うので指定不要です。
REM //   ベース名の部分だけを指定して下さい。
IF NOT "%LOOPMOVIE_TXT%" EQU "" (
  IF NOT EXIST "%LOOPMOVIE_TXT%" GOTO L_ERR
  FOR /F "usebackq" %%i IN (%LOOPMOVIE_TXT%) DO (
    ECHO %LOOPMOVIE_TXT%: %%i
REM (onigsed.exe -e "s/^\"grp\\mov\\%%i\(-[_[:alnum:]]\+\)*\.[[:alnum:]]\+\"$/& loop/I" -i~ TexDef.txt) && (DEL *~)	←←←と書くと何故か"〜"の範囲が正しく認識されずバッチスクリプトのエラーなった。↓仕方が無いのでこう書いたら動いた。「\"」が意図通り解釈される場合とそうでない場合の違いがよく判らないので、常に「\x22」と書く方が安全かも知れない。
    (onigsed.exe -e "s/^\x22grp\\mov\\%%i\(-[_[:alnum:]]\+\)*\.[[:alnum:]]\+\x22$/& loop/I" -i~ TexDef.txt) && (DEL *~)
    IF ERRORLEVEL 1 GOTO L_ERR
  )
)

REM //--------------------------------------------------------------------------
REM //□EnmTexDef.txtとRegTexDef.txtを生成する。
REM //{{2017/04/01変更:DTEXDEFC_OPTIONに'-a'を追加しました。詳細は、/clip/tool/dTexDefC/winapp.hの2017/03/31のコメント,及び,/clip/DxlibHelper.cppの2017/04/01の変更点を参照して下さい。
REM //env.exe DTEXDEFC_OPTION=-n WIN32=1 MkTexDef.bat TexDef.txt SprDef.txt
REM //↓2017/04/01変更:DTEXDEFC_OPTIONに'-a'を追加しました。詳細は、/clip/tool/dTexDefC/winapp.hの2017/03/31のコメント,及び,/clip/DxlibHelper.cppの2017/04/01の変更点を参照して下さい。
env.exe DTEXDEFC_OPTION="-n -a" WIN32=1 MkTexDef.bat TexDef.txt SprDef.txt
REM //}}2017/04/01変更:DTEXDEFC_OPTIONに'-a'を追加しました。詳細は、/clip/tool/dTexDefC/winapp.hの2017/03/31のコメント,及び,/clip/DxlibHelper.cppの2017/04/01の変更点を参照して下さい。
IF ERRORLEVEL 1 GOTO L_ERR
REM //□TexDef.txtとSprDef.txtはもう不要なので削除する。
DEL TexDef.txt SprDef.txt

REM //--------------------------------------------------------------------------
	ECHO 完了しました。
	TIMEOUT /T 3 /NOBREAK
EXIT /B

REM //--------------------------------------------------------------------------
:L_ERR
REM //□不完全な最終出力ファイルを確実に削除します。
IF EXIST    SprDef.txt DEL    SprDef.txt
IF EXIST    TexDef.txt DEL    TexDef.txt
IF EXIST EnmTexDef.txt DEL EnmTexDef.txt
IF EXIST RegTexDef.txt DEL RegTexDef.txt
IF EXIST    AfxBin.bin DEL    AfxBin.bin
IF EXIST EnmAfxBin.txt DEL EnmAfxBin.txt
ECHO ###エラーが発生しました。
	PAUSE
EXIT /B 1

REM //--------------------------------------------------------------------------
REM //フォルダ(%1)以下の階層内に存在する、各拡張子(%2)のファイルを、コピー先フォルダ(%3)にコピーする。
REM //[in]
REM //  %1 = コピー元フォルダ(一つ)
REM //  %2 = コピー元の複数の拡張子を"〜"で囲ったもの	⇒"〜"で囲まないと一つの引数として渡せないからです。当サブルーチンの中で'%~2'で"〜"を削除しています。
REM //  %3 = コピー先フォルダ(一つ)
:COPY_FILES
FOR /R %1 %%j IN (%~2) DO (
  REM //コピー先フォルダの中に、既に同じベース名のファイルが存在したら、既に存在するファイルの方が優先度が高いと見なして、新しいフォルダのコピーを行わない。
  IF NOT EXIST %3\%%~nj.* (
    REM //新しいファイルをコピーする。
    ECHO %%j >&2
    COPY "%%j" %3\ > NUL
    IF ERRORLEVEL 1 GOTO L_ERR
  )
)
EXIT /B
