pastime/js/plugins/KRD_MZ_Sugoroku.js
2026-03-15 16:45:22 -05:00

528 lines
16 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*:
* @target MZ
* @plugindesc すごろくプラグイン。
* @author くろうどkuroudo119
* @url https://github.com/kuroudo119/RPGMZ-Plugin
*
* @param cmnSugoroku
* @text すごろくコモン開始位置
* @desc このプラグインで使用するコモンイベントの開始位置6個以上使用する
* @default 1
* @type common_event
*
* @param swSugoroku
* @text すごろくスイッチ開始位置
* @desc このプラグインで使用するスイッチの開始位置2個使用する
* @default 1
* @type switch
*
* @param varSugoroku
* @text すごろく変数開始位置
* @desc このプラグインで使用する変数の開始位置3個使用する
* @default 1
* @type variable
*
* @command KRD_loadSugoroku
* @text すごろく再開
* @desc すごろく中のセーブデータをロードした時に使います。
*
* @command KRD_setPlayerStep
* @text プレイヤー歩数指定
* @desc プレイヤーが移動する歩数を指定します。
* @arg varStep
* @text 歩数変数
* @desc 移動する歩数の値が入っている変数
* @type variable
*
* @command KRD_setPlayerStepValue
* @text プレイヤー歩数指定(値)
* @desc プレイヤーが移動する歩数の値を指定します。
* @arg step
* @text 歩数
* @desc 移動する歩数の値
* @type number
*
* @command KRD_setRivalStep
* @text ライバル歩数指定
* @desc ライバルが移動する歩数を指定します。
* @arg varStep
* @text 歩数変数
* @desc 移動する歩数の値が入っている変数
* @type variable
*
* @command KRD_initRival
* @text ライバル初期化
* @desc 保存したライバル位置を初期化します。
* @arg x
* @text X座標
* @desc ライバルの初期位置です。
* @type number
* @arg y
* @text Y座標
* @desc ライバルの初期位置です。
* @type number
*
* @help
* KRD_MZ_Sugoroku.js
* すごろくプラグインです。
* (c) 2020 kuroudo119
*
* このプラグインはMITライセンスです。
* https://github.com/kuroudo119/RPGMZ-Plugin/blob/master/LICENSE
*
* ver.1 (2020/11/14) 1st Release.
* ver.2 (2020/11/15) 「すごろくコモン開始位置」を変更した。
* ver.3 (2020/11/17) 「ライバル初期化」にパラメータを追加した。
* ver.4 (2020/11/19) ライバルのマイナス移動を可能にした。
*
* 【プラグインパラメータ】
* 「すごろくコモン開始位置」で指定したコモンイベントから
* 連続したコモンイベントを使用します。
* それぞれに応じたイベントを作成して下さい。
* 0:プレイヤー移動処理(プラグイン内では使用しません)
* 1:ライバル移動処理(プラグイン内では使用しません)
* 2:ライバルからの衝突時に呼ばれるイベント
* 3:アクターからの衝突時に呼ばれるイベント
* 4:戻る移動での衝突時に呼ばれるイベント
* 5:プレイヤーがマスに止まった時のイベント
* リージョン0番のすごろくイベントです。
* ゴールイベントとしてお使い下さい。
* 6:以降リージョン番号に対応するすごろくイベント
*
* 「すごろくスイッチ開始位置」から2個のスイッチを使用します。
* 必要に応じてイベントコマンドからONOFFして下さい。
* 0:すごろくスイッチ
* プラグイン内では使いませんが、すごろくの状態管理にお使い下さい。
* 1:衝突スイッチ
* ONの場合、ライバルと衝突します。
* OFFの場合、ライバルと重なってもすり抜けます。
*
* 「すごろく変数開始位置」から3個の変数を使用します。
* いずれもデータの保存用に使います。
* 0:プレイヤーの向き
* 1:ライバルX座標
* 2:ライバルY座標
*
* 【プラグインコマンド】
* 「すごろく再開」はセーブデータのロード直後に呼ぶためのコマンドです。
* ライバルの位置が復元されます。
*
* 「プレイヤー歩数指定」と「プレイヤー歩数指定(値)」は
* プレイヤーの移動に使用します。
* 変数を使用するか、直接値を指定するかの違いです。
*
* 「ライバル歩数指定」はライバルの移動に使用します。
* 歩数の入った変数を指定して下さい。
*
* 「ライバル初期化」は新しいマップに移動した場合などに使います。
* 座標(X=0, Y=0)を指定すると、ライバル位置が
* そのマップでイベント1番が置かれている位置になります。
*
* 【マップに関する設定】
* 移動に使用するタイルセットに地形タグを設定してください。
*
* 地形タグ : 移動する方向
* 1 : 下 ↓
* 2 : 左 ←
* 3 : 右 →
* 4 : 上 ↑
*
* 止まった時に発生するコモンイベントの番号と
* 対応するリージョンIDをマップに設定してください。
* 「すごろくイベントのコモンイベント番号 リージョン番号」が
* 「止まった時に発生するコモンイベントの番号」となります。
*
* 【すごろくの開始について】
* 自動実行イベントでプラグインコマンド「すごろく再開」を実行して下さい。
* 各種スイッチや変数を初期化して下さい。
* そして、「プレイヤー移動処理」を用意して実行して下さい。
*
* 【プレイヤー移動処理】
* プラグインコマンド「プレイヤー歩数指定」を使用して、
* プレイヤーが移動する歩数(マスの数)を設定してください。
*
* これにより、マスに設定された地形タグに従って自動的に移動します。
* そして、止まったマスのリージョンIDを元に
* 算出されたコモンイベントを実行します。
*
* 【ライバルの使い方】
* 一緒にすごろくをするキャラクターを1体用意する事が出来ます。
* このプラグインではこれをライバルと呼びます。
*
* ライバルはイベントID 1 を使います。
*
* ライバルを移動させるには
* コモンイベントにライバル移動処理を記述する必要があります。
* 任意の「すごろくイベント」の中にライバル移動処理を記述してください。
* プレイヤーの移動後に(マスによっては)ライバルが移動します。
*
* ライバル移動処理の中では、
* プラグインコマンド「ライバル歩数指定」を使用して、
* ライバルが移動する歩数(マスの数)を設定してください。
* これにより、ライバルが自動的に移動します。
* ライバルはマスに止まってもイベントが発生しません。
*
* ライバルとの衝突イベントを発生させる場合、
* 「衝突スイッチ」を ON にしてください。
*
* 【歩数について】
* 歩数がマイナスの場合、マスの向きと反対方向に移動します。
* つまり、戻る移動をするわけですが、曲がる事は出来ません。
*
*/
(function() {
'use strict';
const PLUGIN_NAME = "KRD_MZ_Sugoroku";
const PARAM = PluginManager.parameters(PLUGIN_NAME);
// Common Event ID
const CMN_SUGOROKU = Number(PARAM["cmnSugoroku"]) || 1;
const cmnPlayerMove = CMN_SUGOROKU; // プラグイン内では使用しない
const cmnRivalMove = CMN_SUGOROKU + 1; // プラグイン内では使用しない
const cmnCollisionByRival = CMN_SUGOROKU + 2;
const cmnCollisionByActor = CMN_SUGOROKU + 3;
const cmnCollisionByReverse = CMN_SUGOROKU + 4;
const cmnSugorokuEvent = CMN_SUGOROKU + 5;
// Switch ID
const SW_SUGOROKU = Number(PARAM["swSugoroku"]) || 1;
const swSugoroku = SW_SUGOROKU; // プラグイン内では使用しない
const swCollision = SW_SUGOROKU + 1;
// Variable ID
const VAR_SUGOROKU = Number(PARAM["varSugoroku"]) || 1;
const varDirection = VAR_SUGOROKU;
const varEventX = VAR_SUGOROKU + 1;
const varEventY = VAR_SUGOROKU + 2;
// Event ID
const evRival = 1;
// Move Speed
const moveSpeed = 6;
const defaultSpeed = 4;
//------------------------------------------------
// Plugin Command for MV
const KRD_Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
KRD_Game_Interpreter_pluginCommand.call(this, command, args);
switch (command) {
case 'KRD_setPlayerStep':
const v = !!Number(args) ? Number(args) : 0;
$gamePlayer.setStep($gameVariables.value(v));
break;
case 'KRD_setPlayerStepValue':
const step = !!Number(args) ? Number(args) : 0;
$gamePlayer.setStep(step);
break;
case 'KRD_setRivalStep':
if (!!$gameMap._events[evRival]) {
const v = !!Number(args) ? Number(args) : 0;
$gameMap._events[evRival].setStep($gameVariables.value(v));
}
break;
case 'KRD_loadSugoroku':
$gamePlayer.loadSugoroku();
break;
case 'KRD_initRival':
if (!!$gameMap._events[evRival]) {
const a = args.split(" ");
const x = Number(a[0]) || 0;
const y = Number(a[1]) || 0;
$gameMap._events[evRival].initRival(x, y);
$gameMap._events[evRival].loadRival();
}
break;
}
};
//------------------------------------------------
// Plugin Command for MZ
PluginManager.registerCommand(PLUGIN_NAME, "KRD_loadSugoroku", () => {
$gamePlayer.loadSugoroku();
});
PluginManager.registerCommand(PLUGIN_NAME, "KRD_setPlayerStep", args => {
const varStep = Number(args.varStep) || 1;
$gamePlayer.setStep($gameVariables.value(varStep));
});
PluginManager.registerCommand(PLUGIN_NAME, "KRD_setPlayerStepValue", args => {
const step = Number(args.step) || 1;
$gamePlayer.setStep(step);
});
PluginManager.registerCommand(PLUGIN_NAME, "KRD_setRivalStep", args => {
if (!!$gameMap._events[evRival]) {
const varStep = Number(args.varStep) || 1;
$gameMap._events[evRival].setStep($gameVariables.value(varStep));
}
});
PluginManager.registerCommand(PLUGIN_NAME, "KRD_initRival", args => {
if (!!$gameMap._events[evRival]) {
const x = Number(args.x) || 0;
const y = Number(args.y) || 0;
$gameMap._events[evRival].initRival(x, y);
$gameMap._events[evRival].loadRival();
}
});
//------------------------------------------------
// Sugoroku Load from Savedata
Game_Player.prototype.loadSugoroku = function(){
if (!!$gameMap._events[evRival]) {
$gameMap._events[evRival].loadRival();
}
};
//------------------------------------------------
// Sugoroku Step
Game_Player.prototype.setStep = function(step = null){
this._step = step;
};
Game_Player.prototype.sugorokuStep = function(){
const x = $gamePlayer.x;
const y = $gamePlayer.y;
let direction = $gameMap.terrainTag(x, y);
const next = $gameVariables.value(varDirection);
if (next > 0 && next <= 4) {
direction = next;
$gameVariables.setValue(varDirection, 0);
}
switch (direction) {
case 1: // Down
this.setDirection(2);
break;
case 2: // Left
this.setDirection(4);
break;
case 3: // Right
this.setDirection(6);
break;
case 4: // Up
this.setDirection(8);
break;
default: // Don't Move
return;
}
this.forceMoveForward();
if (!!$gameMap._events[evRival]) {
$gameMap._events[evRival].collisionEvent(cmnCollisionByActor);
}
};
Game_Player.prototype.sugorokuReverse = function(){
const x = $gamePlayer.x;
const y = $gamePlayer.y;
const tag = $gameMap.terrainTag(x, y);
switch (tag) {
case 1: // Down -> Up
this.setDirection(8);
break;
case 2: // Left -> Right
this.setDirection(6);
break;
case 3: // Right -> Left
this.setDirection(4);
break;
case 4: // Up -> Down
this.setDirection(2);
break;
default: // Don't Move
return;
}
this.forceMoveForward();
if (!!$gameMap._events[evRival]) {
$gameMap._events[evRival].collisionEvent(cmnCollisionByReverse);
}
};
const KRD_Game_Player_updateStop = Game_Player.prototype.updateStop;
Game_Player.prototype.updateStop = function() {
KRD_Game_Player_updateStop.call(this);
if (this._step != null) {
if (this._step > 0) {
this._step -= 1;
this.setMoveSpeed(moveSpeed);
this.sugorokuStep();
} else if (this._step < 0) {
this._step += 1;
this.setMoveSpeed(moveSpeed);
this.sugorokuReverse();
} else {
this.checkRegion();
this.setMoveSpeed(defaultSpeed);
this._step = null;
}
}
};
const KRD_Game_Player_canMove = Game_Player.prototype.canMove;
Game_Player.prototype.canMove = function() {
if (!!$gameMap._events[evRival]) {
if (!!(this._step == null && $gameMap._events[evRival]._step == null)) {
return KRD_Game_Player_canMove.call(this);
}
return false;
} else {
if (this._step == null) {
return KRD_Game_Player_canMove.call(this);
}
return false;
}
};
const KRD_Scene_Map_isMenuCalled = Scene_Map.prototype.isMenuCalled;
Scene_Map.prototype.isMenuCalled = function() {
if ($gamePlayer.canMove()) {
return KRD_Scene_Map_isMenuCalled.call(this);
}
return false;
};
//------------------------------------------------
// Sugoroku Stop Event
Game_Player.prototype.checkRegion = function(){
const x = $gamePlayer.x;
const y = $gamePlayer.y;
const region = $gameMap.regionId(x, y);
$gameTemp.reserveCommonEvent(cmnSugorokuEvent + region);
};
//------------------------------------------------
// Rival Move
Game_Event.prototype.setStep = function(step = null){
this._step = step;
};
Game_Event.prototype.sugorokuStep = function(){
const x = this.x;
const y = this.y;
const tag = $gameMap.terrainTag(x, y);
switch (tag) {
case 1: // Down
this.setDirection(2);
break;
case 2: // Left
this.setDirection(4);
break;
case 3: // Right
this.setDirection(6);
break;
case 4: // Up
this.setDirection(8);
break;
default: // Don't Move
return;
}
this.moveForward();
this.collisionEvent(cmnCollisionByRival);
};
Game_Event.prototype.sugorokuReverse = function(){
const x = this.x;
const y = this.y;
const tag = $gameMap.terrainTag(x, y);
switch (tag) {
case 1: // Down -> Up
this.setDirection(8);
break;
case 2: // Left -> Right
this.setDirection(6);
break;
case 3: // Right -> Left
this.setDirection(4);
break;
case 4: // Up -> Down
this.setDirection(2);
break;
default: // Don't Move
return;
}
this.moveForward();
this.collisionEvent(cmnCollisionByRival);
};
const KRD_Game_Event_updateStop = Game_Event.prototype.updateStop;
Game_Event.prototype.updateStop = function() {
KRD_Game_Event_updateStop.call(this);
if (this._step != null) {
if (this._step > 0) {
this._step -= 1;
this.setThrough(true);
this.setMoveSpeed(moveSpeed);
this.sugorokuStep();
} else if (this._step < 0) {
this._step += 1;
this.setThrough(true);
this.setMoveSpeed(moveSpeed);
this.sugorokuReverse();
} else {
this.saveRival();
this.setMoveSpeed(defaultSpeed);
this.setThrough(false);
this._step = null;
}
}
};
//------------------------------------------------
// Rival Position
Game_Event.prototype.initRival = function(x = 0, y = 0){
$gameVariables.setValue(varEventX, x);
$gameVariables.setValue(varEventY, y);
};
Game_Event.prototype.loadRival = function(){
const x = $gameVariables.value(varEventX);
const y = $gameVariables.value(varEventY);
if (x != 0 && y != 0) {
this.locate(x, y);
}
};
Game_Event.prototype.saveRival = function(){
$gameVariables.setValue(varEventX, this.x);
$gameVariables.setValue(varEventY, this.y);
};
//------------------------------------------------
// Collision
Game_Event.prototype.checkCollision = function(){
const x = $gamePlayer.x;
const y = $gamePlayer.y;
const eventX = this.x;
const eventY = this.y;
return x === eventX && y === eventY;
};
Game_Event.prototype.collisionEvent = function(commonId){
if ($gameSwitches.value(swCollision) && this.checkCollision()) {
$gamePlayer._step = null;
this._step = null;
this.saveRival();
if (!!commonId) {
$gameTemp.reserveCommonEvent(commonId);
}
}
};
//------------------------------------------------
}());