【Windows】TRPGクトゥルフ神話キャラメイク用バッチファイル


概要

みんな大好きクトゥルフ神話。
とっても面白いTRPGだけど、キャラメイクが少々面倒……。
何度も何度もダイスを振らなければいけない。

じゃあWindows環境なら誰でも使えるバッチファイルにしてしまえば良いのでは?
ということで書いてみた。

注意点

ひとまず動くように作っただけの試作段階
都度改修予定。

制約

ゆるゆるハウスルールに準拠して作成。
以下ハウスルール。

能力値判定

STR : 3D6
CON : 3D6
POW : 3D6
DEX : 3D6
APP : 3D6
SIZ : 2D6+6
INT : 2D6+6
EDU : 3D6+3
年収・財産はステータスとしない。

全体一括

一括サイコロは3回まで振れる。

個別振り直し

全体一括が終了後、個別能力値の振り直しは全部で2回まで振れる。

前提

バッチファイルの配置先フォルダの下にdice_batフォルダを作成。
dice_batフォルダ内に以下のファイルを配置。

2D6.bat
3D6.bat
3D6_3.bat
next.list

またキャラメイク終了後はバッチファイル配置フォルダにcharacter_data.txtが作成される。

内容

以下、各ファイルの内容を記載。
オプションやif文の表記揺れには目を瞑る。
メイン以外のファイルは全てメインの中で呼び出されているので名前を変えるときは注意。

メインバッチファイル

全体的に冗長。*回目をfor文でまとめたいところ。
色々と要改修点あり。
個別振り直しのif文の中身はうまくないのでその内綺麗にする。
errorlevelの処理をリストファイルかなんかで対応させたら綺麗になるかな。

make_char.bat
@echo off

cd %~dp0
setlocal enabledelayedexpansion

echo  キャラメイクbatの起動します。
echo  全体3回、個別2回までです。
echo.
echo  【全体ダイス】
echo  全体ダイスは3回までです。
echo.

echo  ------------------------------------------------------
echo  【全体ダイス】1回目
echo  Enterを押してダイスロール。
pause > nul
echo.

call .\dice_bat\3D6.bat
echo  STR(筋力)  =%result%
set cSTR=%result%
call .\dice_bat\3D6.bat
echo  CON(体力)  =%result%
set cCON=%result%
call .\dice_bat\3D6.bat
echo  POW(精神力)=%result%
set cPOW=%result%
call .\dice_bat\3D6.bat
echo  DEX(敏捷性)=%result%
set cDEX=%result%
call .\dice_bat\3D6.bat
echo  APP(外見)  =%result%
set cAPP=%result%
call .\dice_bat\2D6.bat
echo  SIZ(体格)  =%result%
set cSIZ=%result%
call .\dice_bat\2D6.bat
echo  INT(知性)  =%result%
set cINT=%result%
call .\dice_bat\3D6_3.bat
echo  EDU(教育)  =%result%
set cEDU=%result%

echo.
choice /m " 振り直すには y を、全体ダイスを終えるには n を押してください。 "
if %errorlevel% == 2 goto NEXT

echo.
echo  ------------------------------------------------------
echo  【全体ダイス】2回目
echo  Enterを押してダイスロール
pause > nul
echo.

call .\dice_bat\3D6.bat
echo  STR(筋力)  =%result%
set cSTR=%result%
call .\dice_bat\3D6.bat
echo  CON(体力)  =%result%
set cCON=%result%
call .\dice_bat\3D6.bat
echo  POW(精神力)=%result%
set cPOW=%result%
call .\dice_bat\3D6.bat
echo  DEX(敏捷性)=%result%
set cDEX=%result%
call .\dice_bat\3D6.bat
echo  APP(外見)  =%result%
set cAPP=%result%
call .\dice_bat\2D6.bat
echo  SIZ(体格)  =%result%
set cSIZ=%result%
call .\dice_bat\2D6.bat
echo  INT(知性)  =%result%
set cINT=%result%
call .\dice_bat\3D6_3.bat
echo  EDU(教育)  =%result%
set cEDU=%result%

echo.
choice /m " 振り直すには y を、全体ダイスを終えるには n を押してください。 "
if %errorlevel% == 2 goto NEXT

echo.
echo  ------------------------------------------------------
echo  【全体ダイス】3回目
echo  Enterを押してダイスロール
pause > nul
echo.

call .\dice_bat\3D6.bat
echo  STR(筋力)  =%result%
set cSTR=%result%
call .\dice_bat\3D6.bat
echo  CON(体力)  =%result%
set cCON=%result%
call .\dice_bat\3D6.bat
echo  POW(精神力)=%result%
set cPOW=%result%
call .\dice_bat\3D6.bat
echo  DEX(敏捷性)=%result%
set cDEX=%result%
call .\dice_bat\3D6.bat
echo  APP(外見)  =%result%
set cAPP=%result%
call .\dice_bat\2D6.bat
echo  SIZ(体格)  =%result%
set cSIZ=%result%
call .\dice_bat\2D6.bat
echo  INT(知性)  =%result%
set cINT=%result%
call .\dice_bat\3D6_3.bat
echo  EDU(教育)  =%result%
set cEDU=%result%

echo.
goto NEXT


:NEXT
echo.
echo  ------------------------------------------------------
echo  【個別振り直し】
echo  個別振り直しは2回までです。
echo.
echo   現在ステータス
echo   STR(筋力)  =%cSTR%
echo   CON(体力)  =%cCON%
echo   POW(精神力)=%cPOW%
echo   DEX(敏捷性)=%cDEX%
echo   APP(外見)  =%cAPP%
echo   SIZ(体格)  =%cSIZ%
echo   INT(知性)  =%cINT%
echo   EDU(教育)  =%cEDU%
echo.
choice /m " 振り直しを行うには y 、終了するには n を押してください。"
if %errorlevel% == 2 goto FINISH


:RE
echo.
echo  ------------------------------------------------------
echo 【個別振り直し】1回目
echo  振り直したい能力を選択してください。
type .\dice_bat\next.list
choice /c:12345678 /n

if %errorlevel% == 1 (
    echo.
    echo " STR(筋力) は %cSTR% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\3D6.bat
            echo.
            echo " 振り直したSTR(筋力)は !result! です。 "
            set " cSTR=!result! "
            goto RE2 )
        if !errorlevel! == 2 goto RE
    )

if %errorlevel% == 2 (
    echo.
    echo " CON(体力) は %cCON% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\3D6.bat
            echo.
            echo " 振り直したCON(体力)は !result! です。 "
            set " cCON=!result! "
            goto RE2 )
        if !errorlevel! == 2 goto RE
    )

if %errorlevel% == 3 (
    echo.
    echo " POW(精神力) は %cPOW% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\3D6.bat
            echo.
            echo " 振り直したPOW(精神力)は !result! です。 "
            set " cPOW=!result! "
            goto RE2 )
        if !errorlevel! == 2 goto RE
    )

if %errorlevel% == 4 (
    echo.
    echo " DEX(敏捷性) は %cDEX% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\3D6.bat
            echo.
            echo " 振り直したDEX(敏捷性)は !result! です。 "
            set " cDEX=!result! "
            goto RE2 )
        if !errorlevel! == 2 goto RE
    )

if %errorlevel% == 5 (
    echo.
    echo " APP(外見) は %cAPP% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\3D6.bat
            echo.
            echo " 振り直したAPP(外見)は !result! です。 "
            set " cAPP=!result! "
            goto RE2 )
        if !errorlevel! == 2 goto RE
    )

if %errorlevel% == 6 (
    echo.
    echo " SIZ(体格) は %cSIZ% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\2D6.bat
            echo.
            echo " 振り直したSIZ(体格)は !result! です。 "
            set " cSIZ=!result! "
            goto RE2 )
        if !errorlevel! == 2 goto RE
    )

if %errorlevel% == 7 (
    echo.
    echo " INT(知性) は %cINT% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\2D6.bat
            echo.
            echo " 振り直したINT(知性)は !result! です。 "
            set " cINT=!result! "
            goto RE2 )
        if !errorlevel! == 2 goto RE
    )

if %errorlevel% == 8 (
    echo.
    echo " EDU(教育) は %cEDU% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\3D6_3.bat
            echo.
            echo " 振り直したEDU(教育)は !result! です。 "
            set " cEDU=!result! "
            goto RE2 )
        if !errorlevel! == 2 goto RE
    )


:RE2
echo.
echo.
echo  ------------------------------------------------------
echo 【個別振り直し】2回目

echo  個別振り直しはあと1回出来ます。
echo.
echo   現在ステータス
echo   STR(筋力)  =%cSTR%
echo   CON(体力)  =%cCON%
echo   POW(精神力)=%cPOW%
echo   DEX(敏捷性)=%cDEX%
echo   APP(外見)  =%cAPP%
echo   SIZ(体格)  =%cSIZ%
echo   INT(知性)  =%cINT%
echo   EDU(教育)  =%cEDU%
echo.
choice /m " 振り直しを行うには y 、終了するには n を押してください。 "
if %errorlevel% == 2 goto FINISH

echo.
echo  振り直したい能力を数字で選択してください。
type .\dice_bat\next.list
choice /c:12345678 /n
echo.

if %errorlevel% == 1 (
    echo.
    echo " STR(筋力) は %cSTR% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\3D6.bat
            echo.
            echo " 振り直したSTR(筋力)は !result! です。 "
            set " cSTR=!result! "
            goto FINISH )
        if !errorlevel! == 2 goto RE2
    )

if %errorlevel% == 2 (
    echo.
    echo " CON(体力) は %cCON% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\3D6.bat
            echo.
            echo " 振り直したCON(体力)は !result! です。 "
            set " cCON=!result! "
            goto FINISH )
        if !errorlevel! == 2 goto RE2
    )

if %errorlevel% == 3 (
    echo.
    echo " POW(精神力) は %cPOW% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\3D6.bat
            echo.
            echo " 振り直したPOW(精神力)は !result! です。 "
            set " cPOW=!result! "
            goto FINISH )
        if !errorlevel! == 2 goto RE2
    )

if %errorlevel% == 4 (
    echo.
    echo " DEX(敏捷性) は %cDEX% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\3D6.bat
            echo.
            echo " 振り直したDEX(敏捷性)は !result! です。 "
            set " cDEX=!result! "
            goto FINISH )
        if !errorlevel! == 2 goto RE2
    )

if %errorlevel% == 5 (
    echo.
    echo " APP(外見) は %cAPP% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\3D6.bat
            echo.
            echo " 振り直したAPP(外見)は !result! です。 "
            set " cAPP=!result! "
            goto FINISH )
        if !errorlevel! == 2 goto RE2
    )

if %errorlevel% == 6 (
    echo.
    echo " SIZ(体格) は %cSIZ% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\2D6.bat
            echo.
            echo " 振り直したSIZ(体格)は !result! です。 "
            set " cSIZ=!result! "
            goto FINISH )
        if !errorlevel! == 2 goto RE2
    )

if %errorlevel% == 7 (
    echo.
    echo " INT(知性) は %cINT% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\2D6.bat
            echo.
            echo " 振り直したINT(知性)は !result! です。 "
            set " cINT=!result! "
            goto FINISH )
        if !errorlevel! == 2 goto RE2
    )

if %errorlevel% == 8 (
    echo.
    echo " EDU(教育) は %cEDU% です。 "
    choice /n /m " 振り直すには y 、キャンセルは n を押してください。 "
        if !errorlevel! == 1 (
            call .\dice_bat\3D6_3.bat
            echo.
            echo " 振り直したEDU(教育)は !result! です。 "
            set " cEDU=!result! "
            goto FINISH )
        if !errorlevel! == 2 goto RE2
    )


:FINISH
echo.
echo.
echo  ------------------------------------------------------
echo  ------------------------------------------------------
echo  【最終ステータス】
echo %date% %time% > character_data.txt
echo.
echo. >> character_data.txt

echo   STR(筋力)  =%cSTR%
echo   CON(体力)  =%cCON%
echo   POW(精神力)=%cPOW%
echo   DEX(敏捷性)=%cDEX%
echo   APP(外見)  =%cAPP%
echo   SIZ(体格)  =%cSIZ%
echo   INT(知性)  =%cINT%
echo   EDU(教育)  =%cEDU%

echo   STR(筋力)  =%cSTR% >> character_data.txt
echo   CON(体力)  =%cCON% >> character_data.txt
echo   POW(精神力)=%cPOW% >> character_data.txt
echo   DEX(敏捷性)=%cDEX% >> character_data.txt
echo   APP(外見)  =%cAPP% >> character_data.txt
echo   SIZ(体格)  =%cSIZ% >> character_data.txt
echo   INT(知性)  =%cINT% >> character_data.txt
echo   EDU(教育)  =%cEDU% >> character_data.txt
echo.
echo  -----------------------------------------------------

echo.
echo  次回このツールを使用するまで、
echo  character_data.txtにデータが保存されます。
echo. 
echo  なにかキーを押すと画面が閉じてcharacter_data.txtが開きます。
pause > nul

start character_data.txt

endlocal
exit

2D6+6用バッチファイル

所詮batの乱数なので精度は期待しないこと。
そして、書いてから思ったんだけどこのif文必要無いな。

2D6.bat
@echo off

set result=
set result1=
set result2=
set result3=

set /a ran1=%random%*6/32767
if %ran1% equ 0 set result1=1
if %ran1% equ 1 set result1=2
if %ran1% equ 2 set result1=3
if %ran1% equ 3 set result1=4
if %ran1% equ 4 set result1=5
if %ran1% equ 5 set result1=6

set /a ran1=%random%*6/32767
if %ran1% equ 0 set result2=1
if %ran1% equ 1 set result2=2
if %ran1% equ 2 set result2=3
if %ran1% equ 3 set result2=4
if %ran1% equ 4 set result2=5
if %ran1% equ 5 set result2=6

set /A result=%result1%+%result2%+6
exit /b 0

3D6用バッチファイル

以下同文。

3D6.bat
@echo off

set result=
set result1=
set result2=
set result3=

set /a ran1=%random%*6/32767
if %ran1% equ 0 set result1=1
if %ran1% equ 1 set result1=2
if %ran1% equ 2 set result1=3
if %ran1% equ 3 set result1=4
if %ran1% equ 4 set result1=5
if %ran1% equ 5 set result1=6

set /a ran1=%random%*6/32767
if %ran1% equ 0 set result2=1
if %ran1% equ 1 set result2=2
if %ran1% equ 2 set result2=3
if %ran1% equ 3 set result2=4
if %ran1% equ 4 set result2=5
if %ran1% equ 5 set result2=6

set /a ran1=%random%*6/32767
if %ran1% equ 0 set result3=1
if %ran1% equ 1 set result3=2
if %ran1% equ 2 set result3=3
if %ran1% equ 3 set result3=4
if %ran1% equ 4 set result3=5
if %ran1% equ 5 set result3=6

set /A result=%result1%+%result2%+%result3%

exit /b 0

3D6+3用バッチファイル

以下同文。

3D6_3
@echo off

set result=
set result1=
set result2=
set result3=

set /a ran1=%random%*6/32767
if %ran1% equ 0 set result1=1
if %ran1% equ 1 set result1=2
if %ran1% equ 2 set result1=3
if %ran1% equ 3 set result1=4
if %ran1% equ 4 set result1=5
if %ran1% equ 5 set result1=6

set /a ran1=%random%*6/32767
if %ran1% equ 0 set result2=1
if %ran1% equ 1 set result2=2
if %ran1% equ 2 set result2=3
if %ran1% equ 3 set result2=4
if %ran1% equ 4 set result2=5
if %ran1% equ 5 set result2=6

set /a ran1=%random%*6/32767
if %ran1% equ 0 set result3=1
if %ran1% equ 1 set result3=2
if %ran1% equ 2 set result3=3
if %ran1% equ 3 set result3=4
if %ran1% equ 4 set result3=5
if %ran1% equ 5 set result3=6

set /A result=%result1%+%result2%+%result3%+3

exit /b 0

個別振り直し参照用リストファイル

特に言うこと無し。先頭末尾に改行あり。
bat内に直接書いても問題なし。

next.list

 1. STR(筋力)
 2. CON(体力)
 3. POW(精神力)
 4. DEX(敏捷性)
 5. APP(外見)
 6. SIZ(体格)
 7. INT(知性)
 8. EDU(教育)

実行結果

実際の挙動。

キャラメイクbatの起動します。
 全体3回、個別2回までです。

 【全体ダイス】
 全体ダイスは3回までです。

 ------------------------------------------------------
 【全体ダイス】1回目
 Enterを押してダイスロール。

 STR(筋力)  =10
 CON(体力)  =9
 POW(精神力)=8
 DEX(敏捷性)=10
 APP(外見)  =7
 SIZ(体格)  =14
 INT(知性)  =16
 EDU(教育)  =10

振り直すには y を、全体ダイスを終えるには n を押してください。 [Y,N]?Y

 ------------------------------------------------------
 【全体ダイス】2回目
 Enterを押してダイスロール

 STR(筋力)  =14
 CON(体力)  =10
 POW(精神力)=9
 DEX(敏捷性)=10
 APP(外見)  =11
 SIZ(体格)  =11
 INT(知性)  =12
 EDU(教育)  =19

振り直すには y を、全体ダイスを終えるには n を押してください。 [Y,N]?N

 ------------------------------------------------------
 【個別振り直し】
 個別振り直しは2回までです。

  現在ステータス
  STR(筋力)  =14
  CON(体力)  =10
  POW(精神力)=9
  DEX(敏捷性)=10
  APP(外見)  =11
  SIZ(体格)  =11
  INT(知性)  =12
  EDU(教育)  =19

振り直しを行うには y 、終了するには n を押してください。 [Y,N]?Y

 ------------------------------------------------------
【個別振り直し】1回目
 振り直したい能力を選択してください。

 1. STR(筋力)
 2. CON(体力)
 3. POW(精神力)
 4. DEX(敏捷性)
 5. APP(外見)
 6. SIZ(体格)
 7. INT(知性)
 8. EDU(教育)

3

" POW(精神力) は 9 です。 "
振り直すには y 、キャンセルは n を押してください。 Y

" 振り直したPOW(精神力)は 11 です。 "


 ------------------------------------------------------
【個別振り直し】2回目
 個別振り直しはあと1回出来ます。

  現在ステータス
  STR(筋力)  =14
  CON(体力)  =10
  POW(精神力)=11
  DEX(敏捷性)=10
  APP(外見)  =11
  SIZ(体格)  =11
  INT(知性)  =12
  EDU(教育)  =19

振り直しを行うには y 、終了するには n を押してください。 [Y,N]?Y

 振り直したい能力を数字で選択してください。

 1. STR(筋力)
 2. CON(体力)
 3. POW(精神力)
 4. DEX(敏捷性)
 5. APP(外見)
 6. SIZ(体格)
 7. INT(知性)
 8. EDU(教育)

2


" CON(体力) は 10 です。 "
振り直すには y 、キャンセルは n を押してください。 Y

" 振り直したCON(体力)は 11 です。 "


 ------------------------------------------------------
 ------------------------------------------------------
 【最終ステータス】

  STR(筋力)  =14
  CON(体力)  =11
  POW(精神力)=11
  DEX(敏捷性)=10
  APP(外見)  =11
  SIZ(体格)  =11
  INT(知性)  =12
  EDU(教育)  =19

 -----------------------------------------------------

 次回このツールを使用するまで、
 character_data.txtにデータが保存されます。

 なにかキーを押すと画面が閉じてcharacter_data.txtが開きます。

ここでなにかしらのキーを押すと以下テキストファイルが開く。

character_data.txt
2020/01/14  0:34:25.62 

  STR(筋力)  =14 
  CON(体力)  =11  
  POW(精神力)=11  
  DEX(敏捷性)=10 
  APP(外見)  =11 
  SIZ(体格)  =11 
  INT(知性)  =12 
  EDU(教育)  =19 

まとめ

とりあえず後日各試行回数を自由に動かせるようにする。
あと、キャラメイクはけっこう大変。