/*:
* @plugindesc 自动释放技能插件,根据特定条件触发技能。
* @author chatgpt
*
* @param Trigger Skills
* @text 技能触发设置
* @desc 该设置用于定义哪些技能会触发,以及它们的触发条件。
*
* @help
* 该插件通过条件来自动触发技能。技能的条件包括:
* - 角色处于特定状态
* - 角色的生命值低于或高于一定百分比
* - 战斗进行了一定回合数
* - 技能每回合有一定概率触发
*
* 技能备注示例:
* <autoSkill: 1, state: 3> // 角色处于状态 ID 3 时,自动释放技能 ID 1
* <autoSkill: 2, state: 3,5,7> // 角色处于状态 ID 3、5、7 时,自动释放技能 ID 2
* <autoSkill: 3, state: 5-10> // 角色处于状态 ID 从 5 到 10 时,自动释放技能 ID 3
* <autoSkill: 4, hpBelow: 50> // 角色生命值低于 50% 时,自动释放技能 ID 4
* <autoSkill: 5, turnCount: 5> // 战斗进行到第 5 回合时,自动释放技能 ID 5
* <autoSkill: 6, chance: 20> // 每回合有 20% 的概率自动释放技能 ID 6
*
* 插件通过解析技能备注来判断是否满足条件并触发技能。
*/
(function() {
// 读取配置并生成技能触发条件列表
var autoSkills = [];
// 解析状态ID的条件,支持单值、多值、范围
function parseStateCondition(stateStr) {
var states = [];
var parts = stateStr.split(',');
parts.forEach(part => {
if (part.includes('-')) { // 范围
var range = part.split('-').map(Number);
for (var i = range[0]; i <= range[1]; i++) {
states.push(i);
}
} else { // 单值
states.push(Number(part));
}
});
return states;
}
// 初始化从技能备注中读取条件
function parseSkillConditions(skill) {
var note = skill.note;
var conditions = [];
// 条件 A: 角色处于指定状态
if (note.match(/<autoSkill:\s*state:\s*([\d,-]+)>/)) {
conditions.push({
type: 'state',
stateIds: parseStateCondition(RegExp.$1),
skillId: skill.id // 记录技能 ID
});
}
// 条件 B: 角色生命值低于或高于百分比
if (note.match(/<autoSkill:\s*hpBelow:\s*(\d+)>/)) {
conditions.push({
type: 'hpBelow',
hpPercentage: parseInt(RegExp.$1),
skillId: skill.id
});
}
if (note.match(/<autoSkill:\s*hpAbove:\s*(\d+)>/)) {
conditions.push({
type: 'hpAbove',
hpPercentage: parseInt(RegExp.$1),
skillId: skill.id
});
}
// 条件 C: 战斗进行的回合数
if (note.match(/<autoSkill:\s*turnCount:\s*(\d+)>/)) {
conditions.push({
type: 'turnCount',
turnCount: parseInt(RegExp.$1),
skillId: skill.id
});
}
// 条件 D: 每回合有一定概率触发
if (note.match(/<autoSkill:\s*chance:\s*(\d+)>/)) {
conditions.push({
type: 'chance',
chance: parseInt(RegExp.$1),
skillId: skill.id
});
}
return conditions;
}
// 读取所有技能并解析其条件
Game_Battler.prototype.loadAutoSkills = function() {
if (autoSkills.length === 0) {
$dataSkills.forEach(skill => {
if (skill) {
var conditions = parseSkillConditions(skill);
conditions.forEach(condition => {
autoSkills.push(condition);
});
}
});
}
};
// 增加对 _autoSkillsToTrigger 的检查,确保它是数组
var _Game_Battler_onTurnEnd = Game_Battler.prototype.onTurnEnd;
Game_Battler.prototype.onTurnEnd = function() {
this.loadAutoSkills();
// 初始化 _autoSkillsToTrigger 如果它是 undefined
if (!this._autoSkillsToTrigger) {
this._autoSkillsToTrigger = [];
}
// 遍历技能触发条件
autoSkills.forEach(condition => {
switch (condition.type) {
case 'state':
if (condition.stateIds.some(stateId => this.isStateAffected(stateId))) {
this._autoSkillsToTrigger.push(condition.skillId); // 记录待触发的技能ID
}
break;
case 'hpBelow':
if (this.hpRate() <= condition.hpPercentage / 100) {
this._autoSkillsToTrigger.push(condition.skillId);
}
break;
case 'hpAbove':
if (this.hpRate() > condition.hpPercentage / 100) {
this._autoSkillsToTrigger.push(condition.skillId);
}
break;
case 'turnCount':
if ($gameTroop.turnCount >= condition.turnCount) {
this._autoSkillsToTrigger.push(condition.skillId);
}
break;
case 'chance':
if (Math.random() * 100 < condition.chance) {
this._autoSkillsToTrigger.push(condition.skillId);
}
break;
}
});
// 在 onTurnEnd 前触发技能
// 依次触发所有技能
this._autoSkillsToTrigger.forEach(skillId => {
var skill = $dataSkills[skillId];
if (skill) {
var action = new Game_Action(this);
action.setSkill(skillId);
// 选择目标(根据技能的 scope)
var targets = action.makeTargets();
if (targets.length > 0) {
// 触发技能动画
targets.forEach(target => {
target.startAnimation(skill.animationId); // 播放技能动画
});
// 应用技能效果
action.apply(targets[0]);
// 显示技能文本
if (skill.message1) {
$gameMessage.add(skill.message1); // 显示释放文本
}
if (skill.message2) {
$gameMessage.setPositionType(0)
$gameMessage.add(skill.message2); // 显示释放文本
}
// 消耗技能的资源(例如 MP)
this.paySkillCost(skill);
// 如果技能有触发的公共事件,执行
if (skill.meta.TriggerEvent) {
$gameTemp.reserveCommonEvent(Number(skill.meta.TriggerEvent)); // 执行公共事件
}
}
}
});
// 清空待触发技能
this._autoSkillsToTrigger = null;
// 执行原本的 onTurnEnd 逻辑
_Game_Battler_onTurnEnd.call(this);
};
})();