Project1

标题: [RMMV]技能复制/青魔法 [打印本页]

作者: 悟行    时间: 2022-12-20 23:09
标题: [RMMV]技能复制/青魔法
各位大佬好,我是位RM新人。我现在在做一个RPG游戏,里面有类似ff系列的青魔职业,暂定叫“小丑”。他有一个技能暂定叫“模仿”,效果是复制指定怪物使用过的上一个技能。
我现在已经实现的功能是复制指定怪物的全部技能,具体实现方式如下:
首先在技能公式里赋值某一敌人的id给50号变量,然后调用公共事件。
在公共事件里调出数据库里怪物的id并学会它的全部技能。
现在遇到的问题是:我想在这基础上优化,需要将“全部技能”改成“上一个使用过的技能”,我的猜想是需要调出log战斗记录来查看,但是不知道怎么实现。注意是怪物的,不是上一角色的(Game.lastActor)。
有大佬能帮忙解答一下吗?感谢~
作者: soulsaga    时间: 2022-12-21 08:37
https://katai5plate.github.io/RP ... /BattleManager.html

可以在这里查找一下..不过我不保证能找到
作者: xiamumomo    时间: 2022-12-21 10:17
http://www.yanfly.moe/wiki/Blue_Magic_(MV_Plugin_Tips_%26_Tricks)   参考一下  这是Yep的 角色一旦被敌人击中就可以学习敌人技能的系统
作者: 悟行    时间: 2022-12-22 12:41
soulsaga 发表于 2022-12-21 08:37
https://katai5plate.github.io/RPGMV-CoreScript-Reference/jsdoc/BattleManager.html

可以在这里查找一 ...

感谢,不过找了一圈还是没思路。主要不确定的点是关于战斗流程的。据我所知,战斗流程大体上是先排列然后更新。我估计得在战斗记录里先检索选择的怪兽,然后再检索它所使用的最后一个技能。这样应该就可以实现“复制”了。
作者: 悟行    时间: 2022-12-22 12:58
本帖最后由 悟行 于 2022-12-22 13:01 编辑
xiamumomo 发表于 2022-12-21 10:17
http://www.yanfly.moe/wiki/Blue_Magic_(MV_Plugin_Tips_%26_Tricks)   参考一下  这是Yep的 角色一旦被敌 ...


感谢。不过这可能涉及到一个时点问题?Yep那个是受攻击就能学会,有点类似于触发技,触发时点是青魔角色收到青魔技能的攻击。我想的这个是主动技,主动选择对象(暂定怪兽,未来可能还可以拓展到同伴?)后检索它使用的上一个技能并学习(有可能是上一回合或者是本回合)。所以可能会更复杂一些。

还有关于play337的那个提问(抱歉,我不知道怎么回复在后面就放这一起说了),Yep那个战斗结束后学会的技能依然是存在的,因为它用的指令是".learnSkill()"。

作者: alexncf125    时间: 2022-12-22 16:41
本帖最后由 alexncf125 于 2022-12-22 18:00 编辑

JAVASCRIPT 代码复制
  1. //=============================================================================
  2. // SkillMimic.js
  3. //=============================================================================
  4.  
  5. var Imported = Imported || {};
  6. Imported.Kanna_SkillMimic = true;
  7.  
  8. var Kanna = Kanna || {};
  9. Kanna.SM = Kanna.SM || {};
  10.  
  11. /*:
  12.  * @plugindesc 复制目标怪物使用过的上一个技能。
  13.  * @author alexncf125
  14.  *
  15.  * @help 在技能的备注栏写上:
  16.  * <SKILL MIMIC>
  17.  *
  18.  * 对目标怪物使用该技能后,
  19.  * 会习得该怪物使用过的上一个技能。
  20.  *
  21.  * 注:习得的技能不会在战斗结束后消失。
  22.  */
  23.  
  24. (function() {
  25.  
  26.     Kanna.SM.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
  27.     DataManager.isDatabaseLoaded = function() {
  28.         if (!Kanna.SM.DataManager_isDatabaseLoaded.call(this)) return false;
  29.         if (!Kanna._loaded_SkillMimic) {
  30.             this.processSkillMimicNotetags($dataSkills);
  31.             Kanna._loaded_SkillMimic = true;
  32.         };
  33.         return true;
  34.     };
  35.  
  36.     DataManager.processSkillMimicNotetags = function(group) {
  37.         for (var n = 1; n < group.length; n++) {
  38.             var obj = group[n];
  39.             var notedata = obj.note.split(/[\r\n]+/);
  40.             obj._isSkillMimic = false;
  41.             for (var i = 0; i < notedata.length; i++) {
  42.                 var line = notedata[i];
  43.                 if (line.match(/<(?:SKILL MIMIC)>/i)) {
  44.                     obj._isSkillMimic = true;
  45.                 };
  46.             };
  47.         };
  48.     };
  49.  
  50.     Kanna.SM.BattleManager_invokeAction = BattleManager.invokeAction;
  51.     BattleManager.invokeAction = function(subject, target) {
  52.         Kanna.SM.BattleManager_invokeAction.call(this, subject, target);
  53.         subject.setSkillMimicId(this._action);
  54.     };
  55.  
  56.     var _Game_Action_applyItemUserEffect = Game_Action.prototype.applyItemUserEffect;
  57.     Game_Action.prototype.applyItemUserEffect = function(target) {
  58.         _Game_Action_applyItemUserEffect.call(this, target);
  59.         if (this.item()._isSkillMimic && target._idSkillMimic > 0) {
  60.             if (this.subject().isActor() && !this.subject().isLearnedSkill(target._idSkillMimic)) {
  61.                 this.subject().learnSkill(target._idSkillMimic);
  62.                 this.makeSuccess(this.subject());
  63.             };
  64.         };
  65.     };
  66.  
  67.     var _Game_Battler_initMembers = Game_Battler.prototype.initMembers;
  68.     Game_Battler.prototype.initMembers = function() {
  69.         _Game_Battler_initMembers.call(this);
  70.         this._idSkillMimic = 0;
  71.     };
  72.  
  73.     Game_Battler.prototype.setSkillMimicId = function(action) {
  74.         if (action.isSkill()) {
  75.             this._idSkillMimic = action.item().id;
  76.         };
  77.     };
  78.  
  79. })();

作者: 天空娃娃    时间: 2022-12-23 20:45
有个比较笨的办法是,在怪物技能的公共事件里面设置一个变量,每次使用技能时设置那个变量的值为怪物上次使用的技能的ID,然后你这个技能的模仿就多增加一个获得一个新行动效果和读取怪物上次使用的技能的变量值后获得对应ID的技能这两个功能。
作者: 悟行    时间: 2023-1-1 19:51
alexncf125 发表于 2022-12-22 16:41
//=============================================================================
// SkillMimic.js
//= ...

感谢大佬回复,最近三次元的事有点忙,等过段时间闲下来试试,有什么问题再向您请教。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1