求问各位大佬
起初我设计了一个技能,当角色处于异常状态时自动触发,为角色驱散所有的负面状态。测试中发现这个驱散的时机要在onTurnEnd的regenerateAll前面才行,不然中毒状态会扣一次血。于是把时机挪到了onTurnEnd的最开始。在chatgpt的帮助下写了一个插件,实现了角色处于特定状态时,在回合结束的时候自动释放技能,能够正确计算技能消耗MP。但这样又出现了几个问题。首先是技能指定目标完全是随机的,没有读取Skill.json里面写的scope,导致有时候驱散在怪身上了。然后是如果有多个技能同时满足条件时,动画会同时播放,技能释放的文本提示(就那个xxx吟唱了xxx)也是同时出现在同一个文本框中。最后是被这种方式触发的技能打死的怪不会播放死亡动画。
萌新刚接触RPGmakerMV没几天,请各位大佬指点!
/*: * @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); }; })();
qq1217066367 发表于 2024-12-12 20:23
或者反着来,将驱散异常的状态分类为驱散,在异常状态里备注如果有驱散,则移除所有异常状态 ...
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |