RPGツクールMZダンジョンに宝箱をランダムに設置スクリプト

ダンジョンにスクリプトを使って宝箱をランダムに設置したいと思います。

Image

まず、ランダムに出現させたい宝箱、出現させたい場所にリージョンを設定しておきます。

はじめは通行できない場所には宝箱を設置できないようにしようとしていたのですが…

Image

×の所でも壁の上の部分はRPGツクールMZの仕様上通行できるとされてしまうので宝箱は壁の上にも設置されてしまいます…。

Image

それを防ぐために、リージョンで出現させたい場所を設定しておく方法にしました。

こっちの方が自分の好きな場所に出現させられますから、結果的には良かったのかも…。

Image

宝箱やリージョンの設定が終わりましたらスクリプトを記入します。

// 宝箱の座標をランダムに設定
let treasure = [];
const treasureNum = 宝箱の数;

// ランダムな座標を作る
while (treasure.length < treasureNum) {
let x = Math.floor(Math.random() * $gameMap.width()) + 開始するx座標;
let y = Math.floor(Math.random() * $gameMap.height()) + 開始するy座標;
let isDuplicate = false;

// 既に同じ座標に宝箱があるかをチェック
for (let i = 0; i < treasure.length; i++) {
if (treasure[i][0] === x && treasure[i][1] === y) {
isDuplicate = true;
break;
}
}

// 重複ではない、かつリージョンIDで指定された座標を追加
if (!isDuplicate && $gameMap.regionId(x, y) === リージョンID) {
treasure.push([x, y]);
}
}

// 宝箱イベントをマップ上に配置する
for (let i = 0; i < treasureNum; i++) {
$gameMap.event(i + 開始するイベントID).setPosition(treasure[i][0], treasure[i][1]);
}

例えば宝箱のイベントIDが連なっていない場合は
$gameMap.event(2).setPosition(treasure[0][0], treasure[0][1]);
$gameMap.event(6).setPosition(treasure[1][0], treasure[1][1]);
$gameMap.event(8).setPosition(treasure[2][0], treasure[2][1]);
…と言う感じに個別に設定する必要があるので宝箱のイベントIDは連なっていると楽です。

Image

宝箱をランダムに設置するスクリプトを記入し終えたら、一応ゲームっぽくするためにプレイタイムを取得しておきます。

// プレイタイムの計測を開始
let time = $gameSystem.playtime();
$gameVariables.setValue(変数ID, time);

$gameSystem.playtime()で現在のプレイタイムを取得できます。

Image

2ページ目に飛ばしてゲーム開始です。
左端にプレイタイムも「TextPicture」で表示します。

// ミニゲーム開始時間を算出
let time =  $gameSystem.playtime() - $gameVariables.value(変数ID);

// 分と秒に分ける
let minutes = Math.floor(time / 60);
let seconds = time % 60;

$gameVariables.setValue(変数ID, minutes)
$gameVariables.setValue(変数ID, seconds)

$gameSystem.playtimeText()でも良かったかも…。

しかし、これで宝箱を全て見つけたらゲームクリアです!

ダンジョンに宝箱をランダムで設置した後、場所を変えたくない人は1ページのスクリプトに

$gameVariables.setValue(変数ID, treasure);

を追加してセルフスイッチを入れて
(treasureには宝箱の数の座標が入っています)

セルフスイッチを出現条件にして2ページ目に

let treasure =  $gameVariables.value(変数ID);
// 宝箱イベントをマップ上に配置する
for (let i = 0; i < 宝箱の数; i++) {
$gameMap.event(i + 開始するイベントID).setPosition(treasure[i][0], treasure[i][1]);
}

と入れればマップを開く度に宝箱は1ページ目で決めた位置にセットされます。

コメント