查看: 3224|回复: 6

[已经解决] 请教角色所穿的防具中若有防御第666号状态则add_state(666)无效

[复制链接]
梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
发表于 2021-12-3 05:24:43 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 taeckle 于 2021-12-31 18:33 编辑

我用了一个笨方法,在默认脚本Class Battler下def add_state(state_id, force = false)里面这么写的:

  1.     if state_id==666 #免疫第666号状态
  2.      if self.is_a?(Game_Actor)
  3.       armor1 = $data_armors[@armor1_id]
  4.       armor2 = $data_armors[@armor2_id]
  5.       armor3 = $data_armors[@armor3_id]
  6.       armor4 = $data_armors[@armor4_id]      
  7.       if armor1!=nil && armor1.guard_state_set.include?(state_id)
  8.       return
  9.       elsif armor2!=nil && armor2.guard_state_set.include?(state_id)
  10.       return
  11.       elsif armor3!=nil && armor3.guard_state_set.include?(state_id)
  12.       return
  13.       elsif armor4!=nil && armor4.guard_state_set.include?(state_id)
  14.       return      
  15.       end
  16.      end  
  17.     end
复制代码



请问大家有更简单的方法嘛?最好是用一行就解决这个问题,还请大家指点一二,多谢了!
梦石
0
星屑
29896
在线时间
5733 小时
注册时间
2016-3-8
回帖
1653
发表于 2021-12-3 08:31:02 | 显示全部楼层
本帖最后由 alexncf125 于 2021-12-3 08:39 编辑

[fold= 我只想说个理解误区,简单和复杂不是代码行数的决定的,你想要把循环式脚本写得简洁就可以用本楼得那些数组自带方法,随便搜下都有很多,什么each, map, find_all, any?等等在某些情况下的确可以让代码变成一行。本楼提供的运行逻辑和楼主你写的没有太大区别,主要式更懂得利用一些函数,理论上它并没有更简单。]表示没用过xp
以下是va一行的写法
return if state_id == 666 && self.is_a?(Game_Actor) && [@armor1_id, @armor2_id, @armor3_id, @armor4_id].any?{|n|$data_armors[n].guard_state_set.include?(state_id)}
[/fold]

评分

参与人数 2星屑 +50 赞 +1 收起 理由
RyanBern + 50 认可答案
taeckle + 1 我很赞同

查看全部评分

回复

使用道具 举报

老黄鸡

梦石
4
星屑
45695
在线时间
7947 小时
注册时间
2009-7-6
回帖
13337

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2021-12-3 12:55:30 | 显示全部楼层
用楼上的写法画瓢就行了

不过如果只是想防御状态的话,根本不需要写脚本
1.png

创建一个免疫666号状态的状态,把它附加给目标就可以了

评分

参与人数 2星屑 +20 赞 +1 收起 理由
RyanBern + 20 我很赞同
taeckle + 1 我很赞同

查看全部评分

RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
回帖
205
发表于 2021-12-3 15:59:46 | 显示全部楼层
已有 Game_Actor#state_guard?  ● 判定防御属性。
RPG::Armor#guard_state_set意思就是免疫状态(无论好坏)。
指令【更改状态】直接调用的 Game_Battlerr#add_state,该方法不考虑 RPG::Armor#guard_state_set。
不含公共事件事件的【技能】、【物品】直接调用的 Game_Battler#states_plus,该方法考虑 RPG::Armor#guard_state_set。

要么自行修改Game_Battler#add_state,要么合理运用状态的附加方式。
最后还是建议你先看看脚本吧……

评分

参与人数 1赞 +1 收起 理由
taeckle + 1 精品文章

查看全部评分

回复

使用道具 举报

梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
 楼主| 发表于 2021-12-8 07:56:36 | 显示全部楼层
本帖最后由 taeckle 于 2021-12-8 07:58 编辑
alexncf125 发表于 2021-12-3 08:31
[fold= 我只想说个理解误区,简单和复杂不是代码行数的决定的,你想要把循环式脚本写得简洁就可以用本楼得 ...


报告大神,我们这个写法其实还有个漏洞,如果角色没装备任何防具的话会报错,所以应该改成这样:
  1.     if state_id==666 #免疫第666号状态
  2.      if self.is_a?(Game_Actor)
  3.       armor1 = $data_armors[@armor1_id]
  4.       armor2 = $data_armors[@armor2_id]
  5.       armor3 = $data_armors[@armor3_id]
  6.       armor4 = $data_armors[@armor4_id]      
  7.       if armor1!=nil && armor1.guard_state_set.include?(state_id)
  8.       return
  9.       elsif armor2!=nil && armor2.guard_state_set.include?(state_id)
  10.       return
  11.       elsif armor3!=nil && armor3.guard_state_set.include?(state_id)
  12.       return
  13.       elsif armor4!=nil && armor4.guard_state_set.include?(state_id)
  14.       return      
  15.       end
  16.      end  
  17.     end
复制代码


请问下这么改过之后还能用你在上面第2楼的方法只用一行表达出来吗?
回复

使用道具 举报

梦石
0
星屑
8003
在线时间
1184 小时
注册时间
2007-7-29
回帖
2014
发表于 2021-12-8 17:22:40 | 显示全部楼层
taeckle 发表于 2021-12-8 07:56
报告大神,我们这个写法其实还有个漏洞,如果角色没装备任何防具的话会报错,所以应该改成这样:
  1. armor1!=nil && armor1.guard_state_set.include?(state_id)
复制代码

你不是写出来了吗?
如果 n 对应的就是 @armorn_id把 armorn !=nil 直接用 $data_armors[n] != nill 来表达即可不是吗?
回复

使用道具 举报

梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
 楼主| 发表于 2021-12-8 21:21:29 | 显示全部楼层
enghao_lim 发表于 2021-12-8 17:22
你不是写出来了吗?
如果 n 对应的就是 @armorn_id把 armorn !=nil 直接用 $data_armors[n] != nill 来 ...


我是想问这个问题可不可以也用find_all, any?之类之类的句式,就像你在上面第2楼的方法只用一行那样
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部