princess-synergy/www/js/plugins/JsScript179Set.js
2026-02-05 14:03:22 -06:00

64 lines
2.3 KiB
JavaScript

/*:
* @plugindesc
* @target MV
* @help
*/
let StuckRecovery_CkInterval = 60;
(function() {
const STUCK_TIME = 120;
const EVENT_NAME = "停止対策";
const FADE_TYPE = 2;
let _stuckTimer = 0;
let _lastPos = { x: -1, y: -1 };
const _Game_Player_update = Game_Player.prototype.update;
Game_Player.prototype.update = function(sceneActive) {
_Game_Player_update.call(this, sceneActive);
if (this._canCheckStuck()) {
this._checkStuckPosition();
} else {
_stuckTimer = 0;
}
};
Game_Player.prototype._canCheckStuck = function() {
return !$gameMap.isEventRunning() &&
!$gameMessage.isBusy() &&
!this.isMoveRouteForcing() &&
!this.isTransferring();
};
Game_Player.prototype._isOnImpassableTile = function() {
const dirs = [2, 4, 6, 8];
return dirs.every(d => !this.canPass(this.x, this.y, d));
};
Game_Player.prototype._checkStuckPosition = function() {
if (!StuckRecovery_CkFlg) return;
StuckRecovery_CkFlg = false;
if (MenuFlgSwich) return;
if (this.x === _lastPos.x && this.y === _lastPos.y && this._isOnImpassableTile()) {
_stuckTimer += StuckRecovery_CkInterval;
} else {
_stuckTimer = 0;
}
_lastPos.x = this.x;
_lastPos.y = this.y;
if (_stuckTimer >= STUCK_TIME) {
_stuckTimer = 0;
const ev = $gameMap.events().find(e => e.event().name === EVENT_NAME);
if (!ev) {
console.log(`停止対策イベントが存在しないため、救済処理は実行されません。`);
return;
}
console.warn("⚠ スタック検知:停止対策イベントに転送します");
$gamePlayer.reserveTransfer($gameMap.mapId(), ev.x, ev.y, 2, FADE_TYPE);
}
};
})();
let StuckRecovery_CkFlg = false;
let StuckRecovery_NUpdateSc = Game_Interpreter.prototype.NUpdateSc;
Game_Interpreter.prototype.NUpdateSc = function () {
StuckRecovery_NUpdateSc.call(this);
StuckRecovery_CkInterval--;
if (StuckRecovery_CkInterval <= 0) {
StuckRecovery_CkInterval = 60;
StuckRecovery_CkFlg = true;
}
}