设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1591|回复: 16
打印 上一主题 下一主题

[有事请教] 想做一个[提高异常附加率]的装备.[已解决]

[复制链接]

Lv2.观梦者

梦石
0
星屑
664
在线时间
100 小时
注册时间
2022-1-3
帖子
66
跳转到指定楼层
1
发表于 2023-5-27 20:40:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 ex悠米桑 于 2023-6-3 18:26 编辑

大概是想要这样的效果,某个装备、武器或者道具,或者角色自己的状态都可以,只要有这个效果在,这个角色附加异常的概率就会加多少多少。但,如果这个角色的攻击or技能本身没有异常,则不会额外添加一个异常。

我之前想过用武器的附加状态……但是这样会无中生有的给敌人上debuff……想问问有没有好思路……或者好脚本可以推荐我……谢谢

——————————————————
感谢rfvtgbzxc不厌其烦的帮忙反复修改脚本,已经可以正常使用了!有需要类似功能的小伙伴们有福啦!

Lv3.寻梦者

梦石
0
星屑
4914
在线时间
445 小时
注册时间
2011-3-26
帖子
101
2
发表于 2023-5-27 22:32:06 | 只看该作者
本帖最后由 rfvtgbzxc 于 2023-5-28 18:04 编辑

状态附加概率有两种,一种是基于角色角色特性计算的attackStatesRate(),一种是技能物品特效的effect.value1,前者可以改Game_BattlerBase.prototype.attackStatesRate()的返回值,后者可以改Game_Action.prototype.itemEffectAddNormalState()函数里的effect.value1。

希望更规范化的话,可以写状态+备注,然后在那些函数里面对状态进行筛选。例如
状态写上备注:
<状态额外成功率:10%>

下面这行代码可以计算带这类状态的额外成功率的总和(百分比,参与计算时需要除以100),在对应函数里处理即可。
actor.states().reduce((current, state)=>current + Number(state.meta["状态额外成功率"]?.match(/(.\d+)%/)[1] ?? 0), 0)
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
664
在线时间
100 小时
注册时间
2022-1-3
帖子
66
3
 楼主| 发表于 2023-5-28 07:10:38 | 只看该作者
rfvtgbzxc 发表于 2023-5-27 22:32
状态附加概率有两种,一种是基于角色角色特性计算的attackStatesRate(),一种是技能物品特效的effect.value ...

感谢大佬回复指点,我是脚本小白,方便追问一下,我应该在哪个脚本里修改对应的内容呢?我说自己尝试调试一下,结果发现不知道应该打开哪个脚本来修改……

点评

rmmz_objects.js,一般可以使用vscode这类编辑器的全局搜索来找,比较方便  发表于 2023-5-28 10:29
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
664
在线时间
100 小时
注册时间
2022-1-3
帖子
66
4
 楼主| 发表于 2023-5-28 12:46:20 | 只看该作者
rfvtgbzxc 发表于 2023-5-27 22:32
状态附加概率有两种,一种是基于角色角色特性计算的attackStatesRate(),一种是技能物品特效的effect.value ...

尝试改了一个小时……但是不怎么成功,一旦上了buff,就提示我
ReferenceError:
actor is not defined

能求大佬解释的详细一点吗?我应该怎么修改这个脚本呢?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4914
在线时间
445 小时
注册时间
2011-3-26
帖子
101
5
发表于 2023-5-28 14:33:30 | 只看该作者
本帖最后由 rfvtgbzxc 于 2023-5-29 12:40 编辑
ex悠米桑 发表于 2023-5-28 12:46
尝试改了一个小时……但是不怎么成功,一旦上了buff,就提示我
ReferenceError:
actor is not defined


actor是泛指类型为Game_Actor的对象,需要根据语境去找。实际上如果希望这个特性更通用,不限敌我,应该是泛指Game_Battler,同时包括了Game_Actor和Game_Enemy。
基于这个前提的代码:(想了下还是不改基类吧,两种都在Game_Action里改):

(攻击概率部分有更新,现在加到了攻击附带状态的概率上)
JAVASCRIPT 代码复制
  1. Game_Action.prototype.itemEffectAddAttackState = function(target, effect) {
  2.     for (const stateId of this.subject().attackStates()) {
  3.       let chance = effect.value1;
  4.       chance *= target.stateRate(stateId);
  5.       // 新修改的行
  6.       chance *= this.subject().attackStatesRate(stateId) + this.subject().states().reduce((current, state)=>current + Number(state.meta["状态额外成功率"]?.match(/(.\d+)%/)[1] ?? 0), 0) / 100;
  7.       chance *= this.lukEffectRate(target);
  8.       if (Math.random() < chance) {
  9.         target.addState(stateId);
  10.         this.makeSuccess(target);
  11.       }
  12.     }
  13.   };
  14.  
  15. Game_Action.prototype.itemEffectAddNormalState = function (target, effect) {
  16.     let chance = effect.value1;
  17.     // 新加入的行
  18.     chance += this.subject().states().reduce((current, state)=>current + Number(state.meta["状态额外成功率"]?.match(/(.\d+)%/)[1] ?? 0), 0) / 100;
  19.     if (!this.isCertainHit()) {
  20.       chance *= target.stateRate(effect.dataId);
  21.       chance *= this.lukEffectRate(target);
  22.     }
  23.     if (Math.random() < chance) {
  24.       target.addState(effect.dataId);
  25.       this.makeSuccess(target);
  26.     }
  27.   };


subject()是Game_Action实例特有的函数,很有用,可以使用它获取到本次行动的发起者。

这种不依靠插件,为开发者提供切入点思路的帖子平时看见得比较少,所以回复得详细一些,希望能有帮助。

评分

参与人数 1+1 收起 理由
ex悠米桑 + 1 我很赞同

查看全部评分

回复 支持 1 反对 0

使用道具 举报

Lv2.观梦者

梦石
0
星屑
664
在线时间
100 小时
注册时间
2022-1-3
帖子
66
6
 楼主| 发表于 2023-5-28 15:01:39 | 只看该作者
rfvtgbzxc 发表于 2023-5-28 14:33
actor是泛指类型为Game_Actor的对象,需要根据语境去找。实际上如果希望这个特性更通用,不限敌我,应该 ...

谢谢大佬帮忙!我尝试替换了rmmz_objects里对应的行数,但是一进入游戏就提示我
SyntaxError
missing ) after argument list
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4914
在线时间
445 小时
注册时间
2011-3-26
帖子
101
7
发表于 2023-5-28 15:44:56 | 只看该作者
ex悠米桑 发表于 2023-5-28 15:01
谢谢大佬帮忙!我尝试替换了rmmz_objects里对应的行数,但是一进入游戏就提示我
SyntaxError
missing ) a ...

改掉了,我忘了移除掉ts的类型注释,现在应该可以了。另外攻击附带状态的逻辑比较特殊,你可能需要根据实际情况去确定要把概率加到哪里。
攻击附带状态有两次概率乘算,第一次是技能的普通攻击概率,第二次是角色的特性,指明特定状态的附加概率。这边代码改在了第二次上。也可以看需要两个乘算都改上
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
664
在线时间
100 小时
注册时间
2022-1-3
帖子
66
8
 楼主| 发表于 2023-5-28 15:56:05 | 只看该作者
rfvtgbzxc 发表于 2023-5-28 15:44
改掉了,我忘了移除掉ts的类型注释,现在应该可以了。另外攻击附带状态的逻辑比较特殊,你可能需要根据实 ...

这次还是会报错233这次提示SyntaxError
Unexpected token '{'

我多问一下,我没太懂您说的这个两次概率。我按照我自己的想法理解一下啊?是不是这样,比如,某角色特性,攻击可能附加灼烧10%,然后他使用一个有20%概率冰冻的技能。我如果在角色栏里写<状态额外成功率:20%>,只有灼烧会变成30%,而冰冻还是20%?这个写在角色栏和状态栏有什么区别吗?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4914
在线时间
445 小时
注册时间
2011-3-26
帖子
101
9
发表于 2023-5-28 16:21:19 | 只看该作者
本帖最后由 rfvtgbzxc 于 2023-5-28 16:23 编辑
ex悠米桑 发表于 2023-5-28 15:56
这次还是会报错233这次提示SyntaxError
Unexpected token '{'


= = 忘了加function,代码改掉了,这次应该没问题了

两次概率是这样的,普通攻击要想附加状态,技能需要设置“附加状态 普通攻击 80%”这样的效果,然后角色自己还需要有“普通攻击附加状态 冰冻 70%”这样的特性,此时判定的算法概率是 80%*70%=56%。

目前的代码,会让“普通攻击附加状态 冰冻 70%”这里的概率提高。

你举的例子的话,如果技能没有设置“附加状态 普通攻击 80%”,就不会有普攻攻击状态的事。此时只有冰冻概率变成40%。如果附加了这个效果,就是40%冰冻 + 80% * 30%灼烧。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
664
在线时间
100 小时
注册时间
2022-1-3
帖子
66
10
 楼主| 发表于 2023-5-28 16:42:43 | 只看该作者
rfvtgbzxc 发表于 2023-5-28 16:21
= = 忘了加function,代码改掉了,这次应该没问题了

两次概率是这样的,普通攻击要想附加状态,技能需要 ...

其实……还有点小小的bug……ReferenceError
s is not defined

PS:原来如此,这次我明白了这个异常提高的运作方式了!您一举例子我就明白了!

点评

s改成了state,属于是写一半忘一半了,因为不是插件所以写得比较随意,这次测试了一下,没问题了。  发表于 2023-5-28 16:54
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-5 23:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表