RPGツクールMVの任意スクリプト実行の準備を自動化してみた

以前、[RPGツクールMVで使える自作スクリプト集](https://qiita.com/qwe001/items/e3903f342b0a4582af76)を公開しましたが、
イチイチ各ゲームのHTMLファイルを編集するのは面倒だなと思って、
node.jsを用いてHTML編集を自動化しました。

さらに、nodeコマンドを毎回入力することさえも面倒なので
バッチファイルで簡単に自作スクリプトを差し込めるようにしました。

## 使用に必要なもの

node.js と cheerio が必要です。

cheerioはバッチファイル内でローカルインストールしますが、
何かうまくいかなかったらグローバルインストールしてみてください。

```bash
npm install -g cheerio
```

(windows環境でグローバルライブラリを読み込む方法がよくわからなかったのでローカルインストールしてます)


## 動作確認環境

* Windows 10 Home Edition
* node.js 12.14.0
* npm 6.13.4
* cheerio 1.0.0-rc.10

## ダウンロード

https://drive.google.com/drive/folders/1k0HGGtjsHD9NOW7M8alJDyQQGIPN_kB4?usp=sharing

## 使い方

上記リンク先に置いてある以下3点のファイルをダウンロードし、
RPGツクールMVのゲームフォルダ直下に置きます。

* mvScriptAppender.bat -> バッチファイル。これしか使いません
* mvScriptAppender.js -> index.htmlを上書きするスクリプト。node.js(javascript+cheerio)で作成
* mvCustomScript.html -> 自作のRPGツクールMV用スクリプト。詳しくはこちら -> [RPGツクールMVで使える自作スクリプト集](https://qiita.com/qwe001/items/e3903f342b0a4582af76)

よくあるゲームフォルダ構成ならば、
以下のように `Game.exe` が置いてあるフォルダに置きます

また、書き込む `index.html` ファイルがどこにあるかを確認します。
多くのゲームは、 `./www/index.html` にあります。
たまに、 ゲームフォルダ直下の `./index.html` にある場合もあります

`Game_boxed.exe` のような形でパッケージ化されており、
`index.html` が見当たらないゲームもあります。
それはどうしようもないので諦めてください。
(エニグマなんとかを使ってゴニョゴニョすればなんとかなりますが、本稿と関係ない話なので割愛)

![スクリーンショット 2021-12-26 191309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130352/b17cd9eb-1037-7f44-57b2-4ca646e4bb68.png)

`mvScriptAppender.bat` をダブルクリックして実行します

![スクリーンショット 2021-12-26 191410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130352/8a6230d1-ce73-30b2-3c74-5efb6a2ea227.png)

任意スクリプトを書き込む `index.html` の置いてあるディレクトリを指定します。
何も入力せずにEnterキーを押すと、デフォルト指定の `./www/index.html` に書き込みます
`.` を入力してEnterキーを押せば、`./index.html` に書き込みます
`./www` を入力してEnterキーを押すことでも、 `./www/index.html` に書き込みます

![スクリーンショット 2021-12-26 192601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130352/fb8790e9-3973-e2ed-e554-2059611f09eb.png)

ゲームフォルダ直下に `cheerio` ライブラリをローカルインストールした後、
`./mvScriptAppender.js` を実行して、
`./mvCustomScript.html` に書いてある自作スクリプトを読み込み、
`./www/index.html` の bodyタグ内の末尾にスクリプトを追記します。

あとは[自作スクリプトのソースコード](https://qiita.com/qwe001/items/e3903f342b0a4582af76)に書いてある通りで、ゲーム内でAlt+Iキーだとか、Alt+Jキーを押すとかで私の自作スクリプトが実行されます。

## 使用上の注意

* バッチファイルの使用中は書き込むファイルを別のアプリケーションで開かないでください

ファイルに書き込めないため

* バッチファイルの使用は原則、1ゲームにつき1度だけにしてください。

書き込む前の `index.html` の内容は保存していません。
バッチファイルを実行するたびにbodyタグ末尾にスクリプトが追記されていきます
やり直したい時は ゲームフォルダ直下に作られる node_modulesフォルダを削除し、
`www/index.html` に追記されたスクリプトを削除して上書き保存した後、バッチファイルを再実行してください

## ソースコードの解説

```javascript:mvScriptAppender.js
/**
 * RPG Tkool MV Custom Script Appender
 * Requires to use this with node.js, cheerio
 *
 * [USAGE]
 * $ node mvScriptAppender.js [OPTION]{fileDir}
 * $ node mvScriptAppender.js        -> it outputs html to "./www/index.html"
 * $ node mvScriptAppender.js .      -> it outputs html to "./index.html"
 * $ node mvScriptAppender.js ./www/ -> it outputs html to "./www/index.html"
 *
 * @author @qwe001
 * @since 2021.12.25
 */

const fileDir = process.argv[2] || "./www";

const fs = require('fs');
const cheerio = require('cheerio');

const filePath = fileDir + '/index.html'; // e.g. "./www/index.html" or "./index.html"

let html;

try {
  html = fs.readFileSync(filePath);
}
catch(err){
  if(err.code === 'ENOENT'){
    console.log('File not found. filePath:' + filePath);
    return false;
  }
  else {
    throw err;
  }
}
const $1 = cheerio.load(html);

const myHtmlPath = './mvCustomScript.html'
const myHtml = fs.readFileSync(myHtmlPath);
const $2 = cheerio.load(myHtml);

const addHtml = '<script>' + $2('script').html() + '</script>';

$1('body').append(addHtml);

const result = $1.html();

// execute overwrite index.html file
fs.writeFile(filePath, result, (err) => {
  if (err) throw err;
  console.log('overwrite index.html successfully.');
});
```

`fs` ライブラリを使ってHTMLファイルを読み込み、`cheerio` ライブラリを使って文字列化。
あとは `cheerio` ライブラリで `jquery` ライクな書き方が出来るので、
`index.html` 内の `body` タグの末尾に自作スクリプトをアペンドし、
`fs` ライブラリで `index.html` に上書き保存します

```batchfile:mvScriptAppender.bat
@echo off
cd /d %~dp0

set NODE_FILE_NAME=mvScriptAppender.js

echo %NODE_FILE_NAME%を実行します。

set /P USER_INPUT_ARGV="HTMLファイルを上書きするディレクトリを指定してください(デフォルト ./www ) :"

if "%USER_INPUT_ARGV%" equ "" set "USER_INPUT_ARGV=./www"

call npm install cheerio

node %NODE_FILE_NAME% %USER_INPUT_ARGV%

echo.
echo %NODE_FILE_NAME%の実行が完了しました。
pause
```

単純化すると、以下2点のコマンドを実行してるだけです

```cmd
npm install cheerio
node mvScriptAppender.js ./www
```

`cheerio` ライブラリをローカルインストールしているのは、
グローバルライブラリから呼び出す方法がわからなかったためです。

NODE_PATHの変数追記とかもしましたがうまくいかず。。

ローカルインストールしなくて済めば、
オリジナルのゲームフォルダをあまり汚染しなくて済むんですけどねえ