【自分用】バッチファイルでRPG、ADVゲームを作成するときのテンプレ

内部の細かい説明は各ラベル先頭に。
使用済みの変数は都度確認するのを忘れずに。

フォルダ構造
game(任意)
　これ.bat
　SaveData
　　Save1.txt
　　Save2.txt
　　　：
　DisplayText
　　表示する文章置き場

現在実装しているラベルの機能は、
・ゲーム内で一度も変化しない変数の設定（:Initialize）
・データのセーブ、ロード（:DataSave :DataLoad）
・数字用のゲージ作成（:GaugeSet）
・全ステータスの列挙、書き出し（:DataDisplay）
・任意txtファイルの削除（:FileDelete）
・GUI選択肢とその上に表示するメニューや質問文の表示（:select）
・GUI選択肢用のカーソル移動計算（:Cursor :Cursor_0,1,2,3,4）

　使いたいという奇特な同志がいれば、改変含め（当然ですが）ご自由にどうぞ。
　その際、「.batでゲーム作ろうな！」と周りに言いまくってくれると嬉しいです
　質問あればコメントに是非。

```bat:Game.bat
@echo off
setlocal enabledelayedexpansion
cd /d %~dp0

:Main1
rem 起動時最初だけ行うメインプロセス
	call :Initialize
	call :DataLoad
	goto Main2

:Main2
rem データロード終了後のメインプロセス（マイページ的な）
	call :DataSave
	exit

:Initialize
rem 起動後の後の設定
	set fP_d=%cd%\DisplayText
	set fP_s=%cd%\SaveData
	exit /b

:DataLoad
rem 全セーブデータの中身を取得、プレイするデータを選ばせて決定させる
rem status[0]=セーブしているデータの個数
rem status[1~個数]=各データの名前（nameとか）
rem status[[ファイル番号][1~個数]=各データのステータスの中身
	set /a existfile+=1,k=0
	if exist %fP_s%\Save%existfile%.txt (
		for /f %%m in (%fP_s%\Save%existfile%.txt) do (
			set /a k+=1
			set status[%existfile%][!k!]=%%m
		)
		goto DataLoad
	) else set /a existfile-=1
	for /f "delims=" %%m in (%fP_s%\template.txt) do (
		set status[!k!]=%%m
		set /a k+=1
	)
	call :Cursor　0 %existfile% 1
	for /l %%i in (1,1,%existfile%) do set command[%%i][1]=Save%%i:!status[%%i][1]!
	echo セーブデータ選択（%%cursorm%%/%arraym%）>%fP_d%\Temp.txt
	call :Select 0 0 j
	set selectdata=%cursorm%
	for /l %%i in (1,1,%status[0]%) do set !status[%%i]!=!status[%selectdata%][%%i]!
	cls
	call :Cursor 0 2 1
	set command[1][1]=はい
	set command[2][1]=いいえ
	call :FileDelete %fP_d%\Temp
	call :DataDisplay 2 0 %fP_d%\Temp
	echo このデータで始めてよろしいですか？>>%fP_d%\Temp.txt
	call :Select 0 0 j
	if %cursorm% == 2 set existfile=0& goto DataLoad
	exit /b

:DataSave
	call :DataDisplay 1 1 %fP_s%\Save%selectdata%
	exit /b

:Select
rem WASDを含む選択肢の表示
rem 呼び出し時のarrayを使用、コマンドはcommand[m][n]に格納しておく
rem 引数↓
rem 0/Temp.txtを表示するなら０、しないなら１/wasd以外の選択肢…実行
rem 1/選択肢の上に表示する文章を書き込んだtxtのファイル名…%2.txtの中身を追加
rem 2/カーソル番号によって読み込むファイルが変わるとき、その変数名の配列以前…!%2[m][n]!.txtの中身を追加
rem 返り値...選択肢のerrorlevel（出力はerrorlevel）（１～４はwasdなので、５～が帰ってくる。何番目が選ばれたのかはcursorm,n）
	if %1 == -1 del /q %fP_d%\Temp.txt
	if %1 == 1 for /f %%m in (%fP_d%\%3.txt) do call echo %%m
	if %1 == 2 for /f %%m in (%fP_d%\!%3[%cursorm%][%cursorn%]!.txt) do call echo %%m
	if %1 == 10 call :%2 %3 %4 %5 %6 %7 %8 %9
	if %1 neq 0 exit /b
	for /l %%i in (1,1,%arraym%) do (
		set commandlist[%%i]=　
		for /l %%j in (1,1,%arrayn%) do (
			set commandlist[%%i]=!commandlist[%%i]!!cursorl[%%i][%%j]!!command[%%i][%%j]!!cursorr[%%i][%%j]!
		)
	)
	cls
	if %2 == 0 for /f %%m in (%fP_d%\Temp.txt) do call echo %%m
		for /l %%i in (1,1,%arraym%) do (
		echo !commandlist[%%i]!
	)
	choice /c wasd%3 >nul
	if %errorlevel% leq 4 (
		call :Cursor %errorlevel%
		goto Select
	)
	exit /b

:DataDisplay
rem 全ステータスを、「ステータス名：ステータス」の形で列挙
rem 引数1…0なら表示、1なら書き込み（新規）、2なら書き込み（追記）
rem 引数2…0なら全部、1ならステータスだけ（ステータス名無し）
rem 引数3…書き込みの場合ファイル名
	if %1 == 0 if %2 == 0 for /l %%i in (1,1,%status[0]%) do call call echo %%%%status[%%i]%%%%:%%%%%%status[%%i]%%%%%%
	if %1 == 0 if %2 == 1 for /l %%i in (1,1,%status[0]%) do call call echo %%%%%%status[%%i]%%%%%%
	if %1 == 1 call :FileDelete %3
	if %1 geq 1 if %2 == 0 for /l %%i in (1,1,%status[0]%) do call call echo %%%%status[%%i]%%%%:%%%%%%status[%%i]%%%%%%>>%3.txt
	if %1 geq 1 if %2 == 1 for /l %%i in (1,1,%status[0]%) do call call echo %%%%%%status[%%i]%%%%%%>>%3.txt
	exit /b

:GaugeSet
rem 引数１…分子の数値or数値が入っている変数
rem 引数２…分母の数値or数値が入っている変数
rem 引数３…ゲージの文字列を代入したい変数名
rem 引数４…ゲージのサイズ(100の約数)
	set /a tempint1=%1*%4/%2
	set /a tempint2=%1*%4%%%2
	set gauge=
	set /a blank=0,division=0
	for /l %%i in (1,1,%4) do (
		if %%i leq %tempint1% (
			set tempstr1=■
			set division=%%i
		) else (
			if !tempint2! neq 0 (
				set tempstr1=■
				set tempint2=0
			) else (
				set tempstr1=□
			)
		)
		set gauge=!gauge!!tempstr1!
	)
	set %3=%gauge% (%1/%2)
	exit /b

:FileDelete
	del /q %1.txt
	exit /b

:Cursor
rem カーソル移動関連
rem 引数...01234(/arraym/arrayn)
	if not "%3" == "" set /a arraym=%2,arrayn=%3
	set cursorl[%cursorm%][%cursorn%]=　
	set cursorr[%cursorm%][%cursorn%]=　
	call :Cursor_%1
	set cursorl[%cursorm%][%cursorn%]=【
	set cursorr[%cursorm%][%cursorn%]=】
	exit /b
:Cursor_0
rem カーソル初期化
	for /l %%i in (1,1,!arraym!) do (
		for /l %%j in (1,1,!arrayn!) do (
			set cursorl[%%i][%%j]=　
			set cursorr[%%i][%%j]=　
		)
	)
	set /a cursorm=1,cursorn=1
	exit /b
:Cursor_1
rem カーソル移動（上）
	set /a cursorm=(cursorm+arraym-2)%%arraym+1
	exit /b
:Cursor_2
rem カーソル移動（左）
	set /a cursorn=(cursorn+arrayn-2)%%arrayn+1
	exit /b
:Cursor_3
rem カーソル移動（下）
	set /a cursorm=cursorm%%arraym+1
	exit /b
:Cursor_4
rem カーソル移動（右）
	set /a cursorn=cursorn%%arrayn+1
	exit /b
```