查看: 515|回复: 0

[交流讨论] 【VA移植MV】Theo - 经过指定时间后自动消失的状态

[复制链接]
梦石
0
星屑
29896
在线时间
5733 小时
注册时间
2016-3-8
回帖
1653
发表于 2026-5-17 07:58:23 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 alexncf125 于 2026-5-17 08:05 编辑

[pre lang="javascript"]//=============================================================================
// Theo_RealTimeStates.js
//=============================================================================

var Imported = Imported || {};
Imported.Theo_RealTimeStates = true;

var Theo = Theo || {};
Theo.RTS = Theo.RTS || {};
Theo.RTS.version = 1.01;

//=============================================================================
/*:
* @plugindesc v1.01 经过指定时间后自动消失的状态
* @author TheoAllen(原作者写的乃是va用的rb版本, 现转译成mv用的js版, 在mz上应该也能用)
*
* @param Message Pause
* @desc 是否在出现对话框时暂停状态的计时。
* @default true
*
* @param Pause Switch ID
* @desc 暂停状态计时的开关。
* @default 0
*
* @help
* ============================================================================
* 介绍
* ============================================================================
*
* 本脚本可以设定基于时间的状态,例如在地图上10秒后中毒状态自动消失。
*
* ============================================================================
* 使用方法
* ============================================================================
*
* 状态备注
* <Expired Time: n>
*
* n替换为数字,代表持续时间(秒)
* 比如要持续一分钟, 就填写<Expired Time: 60>
*
* ============================================================================
* 使用条款
* ============================================================================
*
* 署名脚本作者, TheoAllen.
* 你可以自由编辑此脚本,只要你不声明你是脚本的原作者.
*
* ============================================================================
* 更新日志
* ============================================================================
*
* Version 1.01:
* - Can now be applied to enemies!
*
* Version 1.00:
* - Finished plugin!
*/
//=============================================================================

//=============================================================================
// Parameter Variables
//=============================================================================

Theo.SetupParameters = function () {
    Theo.Parameters = PluginManager.parameters('Theo_RealTimeStates');
    Theo.Param = Theo.Param || {};
    Theo.Param.RTSMsgPause = Boolean(Theo.Parameters['Message Pause'] === "true" ? true : false);
    Theo.Param.RTSPauseSID = Number(Theo.Parameters['Pause Switch ID'] || 0);
};
Theo.SetupParameters();

//=============================================================================
// DataManager
//=============================================================================

Theo.RTS.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function () {
    if (!Theo.RTS.DataManager_isDatabaseLoaded.call(this)) return false;
    if (!Theo._loaded_RealTimeStates) {
        this.processRTSNotetags1($dataStates);
        Theo._loaded_RealTimeStates = true;
    }
    return true;
};

DataManager.processRTSNotetags1 = function (group) {
    var note1 = /<(?:EXPIRED TIME):[ ]*(\d+)>/i;
    for (var n = 1; n < group.length; n++) {
        var obj = group[n];
        var notedata = obj.note.split(/[\r\n]+/);
        obj.stateRealTime = 0;
        for (var i = 0; i < notedata.length; i++) {
            var line = notedata;
            if (line.match(note1)) {
                obj.stateRealTime = parseInt(RegExp.$1) * 60;
            }
        }
    }
};

//=============================================================================
// Game_System
//=============================================================================

Theo.RTS.Game_System_initialize = Game_System.prototype.initialize;
Game_System.prototype.initialize = function () {
    Theo.RTS.Game_System_initialize.call(this);
    this.initStateRealTime();
};

Game_System.prototype.initStateRealTime = function () {
    this._stateRealTime = 0;
};

Game_System.prototype.updateStateRealTime = function () {
    this._stateRealTime++;
};

Game_System.prototype.stateRealTime = function () {
    return this._stateRealTime;
};

//=============================================================================
// Game_Battler
//=============================================================================

Theo.RTS.Game_Battler_initialize = Game_Battler.prototype.initialize;
Game_Battler.prototype.initialize = function (actorId) {
    Theo.RTS.Game_Battler_initialize.call(this, actorId);
    this.initRealTimeStates();
};

Game_Battler.prototype.initRealTimeStates = function () {
    this._rtStates = {};
};

Theo.RTS.Game_Battler_resetStateCounts = Game_Battler.prototype.resetStateCounts;
Game_Battler.prototype.resetStateCounts = function (stateId) {
    Theo.RTS.Game_Battler_resetStateCounts.call(this, stateId);
    var time = $dataStates[stateId].stateRealTime;
    if (time <= 0) return;
    this._rtStates[stateId] = $gameSystem.stateRealTime() + time;
};

Game_Battler.prototype.checkRealTimeStates = function () {
    for (var i = 0; i < this._states.length; i++) {
        var stateId = this._states;
        if ($dataStates[stateId].stateRealTime <= 0) continue;
        if (this.isRealTimeStateTimeUp(stateId)) {
            this.removeState(stateId);
            if ($gameParty.inBattle()) {
                BattleManager.refreshStatus();
            }
        }
    }
};

Game_Battler.prototype.isRealTimeStateTimeUp = function (stateId) {
    if (!!this._rtStates[stateId]) {
        return $gameSystem.stateRealTime() >= this._rtStates[stateId];
    } else {
        return false;
    }
};

//=============================================================================
// Scene_Base
//=============================================================================

Theo.RTS.Scene_Base_update = Scene_Base.prototype.update;
Scene_Base.prototype.update = function () {
    Theo.RTS.Scene_Base_update.call(this);
    if (this instanceof Scene_Map || this instanceof Scene_Battle) {
        if ($gameSwitches.value(Theo.Param.RTSPauseSID)) return;
        if (!this.isMessagePause()) {
            this.updateStateRealTime();
            this.checkRealTimeStates();
        }
    }
};

Scene_Base.prototype.updateStateRealTime = function () {
    $gameSystem.updateStateRealTime();
};

Scene_Base.prototype.checkRealTimeStates = function () {
    for (var i = 0; i < $gameParty.members().length; i++) {
        $gameParty.members().checkRealTimeStates();
    }
    if ($gameParty.inBattle()) {
        for (var i = 0; i < $gameTroop.members().length; i++) {
            $gameTroop.members().checkRealTimeStates();
        }
    }
};

Scene_Base.prototype.isMessagePause = function () {
    var isSceneChangeOk = this.isActive() && !$gameMessage.isBusy();
    return Theo.Param.RTSMsgPause && !isSceneChangeOk;
};

//=============================================================================
// End of File
//=============================================================================
[/pre]
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部