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

Project1

 找回密码
 注册会员
搜索
查看: 4052|回复: 31

[已经解决] 状态的各种用法请教!

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3981
在线时间
603 小时
注册时间
2017-4-21
帖子
228
发表于 2018-8-5 00:51:01 | 显示全部楼层 |阅读模式

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

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

x
忙了一天,有几个问题解决不了,所以来请教一番!

问题汇总:
1.如何让状态的增减属性改为额定的值,比如力量增加10,防御减少20等。
2.如何让状态改变属性有效度。(如果能实现,会方便一点,但关系不大)

关于问题1,
在论坛搜到了一个类似的,但不太懂原理和使用方法。
RUBY 代码复制
  1. def atk
  2.  
  3.  
  4.   n = base_atk
  5.  
  6.  
  7.   if self.state?(32)
  8.  
  9.     n += 20
  10.  
  11.   end
  12.  
  13.  
  14.   return Integer(n)
  15.  
  16.  
  17. end



关于问题2,敌人和职业都有一个数组   element_ranks   
我想,如果附加了这个状态的敌人或者是角色,自定义这个敌人/角色的  element_ranks
比如
element_ranks[1] = 3
element_ranks[2] = 4
等等这样自定义

Lv3.寻梦者

梦石
0
星屑
1438
在线时间
328 小时
注册时间
2016-4-4
帖子
168

开拓者

发表于 2018-8-5 08:09:19 | 显示全部楼层
本帖最后由 porlutia 于 2018-8-5 08:19 编辑

1. 这个的原理 就是
  1. n = base_atk
复制代码
先获取基础攻击力,然后把它赋值给n
  1. if self.state?(32)
  2.    n += 20
  3. end
复制代码
这里是判断 如果在第32号状态下 n的数值增加20   这一部分就是你需要修改的   这里的32是状态的id 就是数据库中这个状态的序号
  1. return Integer(n)
复制代码
最后这里是返回n  


2.
我方game actor 和敌人game enemy 都有element_rate 这个函数,它就是用来判断属性有效度的

然后这个方法下面可以看到这句

# 获取对应属性有效度的数值
table = [0,200,150,100,50,0,-100]

具体数值就是这个数组了,代表了各个等级的伤害比例。从数字上可以判断出,它是按 (第一个0没用到,属于占坑用,因为数组是按0号开始算,无视它就行)ABCDEF这样排列

所以,你想要改不同的属性比例,那就改变里面的数字就可以了

然后,想要不同的状态下有不同的比例,那只要复制一份,然后套个分歧,满足这个条件的时候用新的数组就好了

if @states.include?(1)   #当中了1号状态的时候
  table = [0,1000,1000,1000,1000,1000,1000]   #所有属性全部十倍伤害
elsif $game_variables[1]  #1号开关打开的时候
  table = [0,0,0,0,0,0,0]  #所有属性全部0伤害
else
table = [0,200,150,100,50,0,-100]  
end
这里是某个帖子中 灯笼菜刀王大大关于状态改变属性有效度的说明
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4471
在线时间
1053 小时
注册时间
2013-3-28
帖子
390

开拓者

发表于 2018-8-5 10:03:56 | 显示全部楼层
本帖最后由 陈大帅帅帅哥 于 2018-8-5 10:06 编辑

一眼看到你的id就进来了
如果1类状态不多的话,楼上的方法挺好的
2类状态的话,有个自定义更直观的方案

全局搜索def element_rate(element_id),进入Game_Actor类的那个
RUBY 代码复制
  1. result = table[$data_classes[@class_id].element_ranks[element_id]]
这行修改成
RUBY 代码复制
  1. if state?(10086)
  2.       result = table[$data_classes[233].element_ranks[element_id]]
  3.     else
  4.       result = table[$data_classes[@class_id].element_ranks[element_id]]
  5.     end
10086改成状态id,233改成想要变成的element_ranks所属的职业id,没有想要的element_ranks的职业的话就新建一个空白的
有白字
鉴于时之旅是口袋妖怪类游戏,应该会有不少的拥有相同element_ranks的宝可梦,所以这种方法应该方便一点

点评

这个方案不错。在下一句增加 result = table[$data_classes[233].element_ranks[element_id]] if state?(10086) 会方便一点  发表于 2018-8-5 13:43
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
31838
在线时间
5079 小时
注册时间
2012-11-19
帖子
4877

开拓者

发表于 2018-8-5 10:42:09 | 显示全部楼层
本帖最后由 芯☆淡茹水 于 2018-8-5 11:10 编辑

1,以前做过这个功能,XP的各项东西没有备注,想加额外的东西有些蛋疼,
所以做的这个功能只好用属性开刀。

整个功能脚本剔出来就是这样,比较简单
  1. #==============================================================================
  2. # 状态增减固定属性              
  3. #==============================================================================
  4. # Author : 芯☆淡茹水
  5. #==============================================================================
  6. # 属性命名:<maxhp:num>      最大HP
  7. #           <maxsp:num>      最大SP
  8. #           <str:num>        力量
  9. #           <dex:num>        敏捷
  10. #           <agi:num>        速度
  11. #           <int:num>        魔力
  12. #
  13. # 里面的 num 为增/减的值,正加负减,不要留空格。例: <maxhp:200> ,  <str:-20>
  14. # 最后在对应状态里勾上这个属性即可(可多项)。
  15. #
  16. #==============================================================================
  17. #==============================================================================
  18. class Game_Battler
  19.   #--------------------------------------------------------------------------
  20.   def refresh_state_changed(states_data, type)
  21.     return unless ["add", "remove"].include?(type)
  22.     data = (states_data - @states) | (@states - states_data)
  23.     data = data.find_all{|id| !$data_states[id].guard_element_set.empty?}
  24.     unless data.empty?
  25.       data.each{|id| attribute_count($data_states[id], type)}
  26.       @hp = [@hp, self.maxhp].min
  27.       @sp = [@sp, self.maxsp].min
  28.     end
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   def attribute_count(state, type)
  32.     syms = ["maxhp","maxsp","str","dex","agi","int"]
  33.     state.guard_element_set.size.times do |i|
  34.       element = $data_system.elements[state.guard_element_set[i]]
  35.       6.times do |j|
  36.         num = nil
  37.         num = $1.to_i    if element.match(Regexp.new("<#{syms[j]}:(\\d+)>"))
  38.         num = -($1.to_i) if element.match(Regexp.new("<#{syms[j]}:-(\\d+)>"))
  39.         next unless num
  40.         num = type == "add" ? num : -num
  41.         value = instance_variable_get("@#{syms[j]}_plus") + num
  42.         instance_variable_set("@#{syms[j]}_plus", value)
  43.       end
  44.     end
  45.   end
  46.   #--------------------------------------------------------------------------
  47.   alias xr_state_property_add_state add_state
  48.   def add_state(state_id, force=false)
  49.     last_states = @states.clone
  50.     xr_state_property_add_state(state_id, force)
  51.     last_states != @states && refresh_state_changed(last_states, "add")
  52.   end
  53.   #--------------------------------------------------------------------------
  54.   alias xr_state_property_remove_state remove_state
  55.   def remove_state(state_id, force=false)
  56.     last_states = @states.clone
  57.     xr_state_property_remove_state(state_id, force)
  58.     last_states != @states && refresh_state_changed(last_states, "remove")
  59.   end
  60. end
  61. #==============================================================================
  62. #==============================================================================
复制代码


然后如果不知道怎么用的话,这儿有个简单范例

Project2.rar (187.92 KB, 下载次数: 102)

点评

属性上这么写:maxhp:1 maxhp:2 maxhp:4 maxhp:8 maxhp:16....你要300-400的加成值的话,也就是最多写到maxhp:256,通过勾选可以实现511以内的加成  发表于 2018-8-5 21:42
看到了,但可能不适合我。因为,一个状态有4项加成,可能每个值都不同,然后我想做300~400个左右,针对批量,需要用到的属性就有点多了  发表于 2018-8-5 13:31
xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
31838
在线时间
5079 小时
注册时间
2012-11-19
帖子
4877

开拓者

发表于 2018-8-5 11:52:49 | 显示全部楼层
本帖最后由 芯☆淡茹水 于 2018-8-5 17:57 编辑

唔~,根据楼上加了3个属性(攻击,防御,魔防)进去。
至于 回避 嘛,状态本身加的就是固定值。

  1. #==============================================================================
  2. # 状态增减固定属性              
  3. #==============================================================================
  4. # Author : 芯☆淡茹水
  5. #==============================================================================
  6. # 属性命名:<maxhp:num>      最大HP
  7. #           <maxsp:num>      最大SP
  8. #           <str:num>        力量
  9. #           <dex:num>        敏捷
  10. #           <agi:num>        速度
  11. #           <int:num>        魔力
  12. #           <atk:num>        攻击力
  13. #           <pdef:num>       防御力
  14. #           <mdef:num>       魔法防御力
  15. #
  16. # 里面的 num 为增/减的值,正加负减,不要留空格。例: <maxhp:200> ,  <str:-20>
  17. # 最后在对应状态里勾上这个属性即可(可多项)。
  18. #
  19. #==============================================================================
  20. #==============================================================================
  21. class Game_Battler
  22.   #--------------------------------------------------------------------------
  23.   alias xr_state_property_initialize initialize
  24.   def initialize
  25.     xr_state_property_initialize
  26.     @atk_plus  = @pdef_plus = @mdef_plus = 0
  27.   end
  28.   #--------------------------------------------------------------------------
  29.   def refresh_state_changed(states_data, type)
  30.     return unless ["add", "remove"].include?(type)
  31.     data = (states_data - @states) | (@states - states_data)
  32.     data = data.find_all{|id| !$data_states[id].guard_element_set.empty?}
  33.     unless data.empty?
  34.       data.each{|id| attribute_count($data_states[id], type)}
  35.       @hp = [@hp, self.maxhp].min
  36.       @sp = [@sp, self.maxsp].min
  37.     end
  38.   end
  39.   #--------------------------------------------------------------------------
  40.   def attribute_count(state, type)
  41.     syms = ["maxhp","maxsp","str","dex","agi","int","atk","pdef","mdef"]
  42.     state.guard_element_set.size.times do |i|
  43.       element = $data_system.elements[state.guard_element_set[i]]
  44.       9.times do |j|
  45.         num = nil
  46.         num = $1.to_i  if element.match(Regexp.new("<#{syms[j]}:(\\d+)>"))
  47.         num = -$1.to_i if element.match(Regexp.new("<#{syms[j]}:-(\\d+)>"))
  48.         next unless num
  49.         num = type == "add" ? num : -num
  50.         value = instance_variable_get("@#{syms[j]}_plus") + num
  51.         instance_variable_set("@#{syms[j]}_plus", value)
  52.       end
  53.     end
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   alias xr_state_property_add_state add_state
  57.   def add_state(state_id, force=false)
  58.     last_states = @states.clone
  59.     xr_state_property_add_state(state_id, force)
  60.     last_states != @states && refresh_state_changed(last_states, "add")
  61.   end
  62.   #--------------------------------------------------------------------------
  63.   alias xr_state_property_remove_state remove_state
  64.   def remove_state(state_id, force=false)
  65.     last_states = @states.clone
  66.     xr_state_property_remove_state(state_id, force)
  67.     last_states != @states && refresh_state_changed(last_states, "remove")
  68.   end
  69. end
  70. #==============================================================================
  71. class Game_Actor < Game_Battler
  72.   #--------------------------------------------------------------------------
  73.   alias xr_state_property_base_atk base_atk
  74.   def base_atk;  return xr_state_property_base_atk + @atk_plus;   end
  75.   #--------------------------------------------------------------------------
  76.   alias xr_state_property_base_pdef base_pdef
  77.   def base_pdef; return xr_state_property_base_pdef + @pdef_plus; end
  78.   #--------------------------------------------------------------------------
  79.   alias xr_state_property_base_mdef base_mdef
  80.   def base_mdef; return xr_state_property_base_mdef + @mdef_plus; end
  81. end
  82. #==============================================================================
  83. class Game_Enemy < Game_Battler
  84.   #--------------------------------------------------------------------------
  85.   alias xr_state_property_base_atk base_atk
  86.   def base_atk;  return xr_state_property_base_atk + @atk_plus;   end
  87.   #--------------------------------------------------------------------------
  88.   alias xr_state_property_base_pdef base_pdef
  89.   def base_pdef; return xr_state_property_base_pdef + @pdef_plus; end
  90.   #--------------------------------------------------------------------------
  91.   alias xr_state_property_base_mdef base_mdef
  92.   def base_mdef; return xr_state_property_base_mdef + @mdef_plus; end
  93. end
  94. #==============================================================================
  95. #==============================================================================
复制代码
xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37749
在线时间
5383 小时
注册时间
2006-11-10
帖子
6545
发表于 2018-8-5 13:24:36 | 显示全部楼层
其实, 如果是要"状态加成的数值全部为增加固定数值而不是百分比" 那改下公式就好了

  #--------------------------------------------------------------------------
  # ● 获取力量
  #--------------------------------------------------------------------------
  def str
    n = [[base_str + @str_plus, 1].max, 999].min
    for j in @states
      n += $data_states[j].str_rate - 100
    end
    n = [[Integer(n), 1].max, 999].min
    return n
  end

把乘改加就好了~  不过因为数据库只能填 0-200的数值, 不能用负数, 所以只能把 100当做 0;  填80就是相当于 -20

缺点, 只能用于 -100~+100 的变化. 需要超过这个数值的, 还是要用芯大的扩展脚本~

点评

=v=知道哦,猫姐的数据库备注接口非常好用,要增加一两个扩展很方便,但是如果11个都要狂野.... 外接备注的话,就和引用常量一样了~  发表于 2018-8-6 09:53
你知道有个东西叫做数据库备注狂野模式么……  发表于 2018-8-5 21:42
我觉得这个更适合你...不用写N个IF..  发表于 2018-8-5 15:34
谢谢!可以告诉我1楼的问题一怎么用吗?那个适合我。。。  发表于 2018-8-5 13:49
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3981
在线时间
603 小时
注册时间
2017-4-21
帖子
228
 楼主| 发表于 2018-8-5 13:39:36 | 显示全部楼层
porlutia 发表于 2018-8-5 08:09
1. 这个的原理 就是 先获取基础攻击力,然后把它赋值给n
  这里是判断 如果在第32号状态下 n的数值增加20    ...

谢谢回复哈

问题1刚刚试了下,在main前插入,发现没有效果。。其实你说的意思我明白。不太明白的是这个脚本怎么使用。

2呢,我也看到灯笼菜刀王的原帖了。
但是和我想做的其实不是同一个效果
table = [0,1000,1000,1000,1000,1000,1000]     是把属性的A,B,C,D,E,F有效度都增加10倍

而我是想自定义element_rate的值
比如1号属性是A,2号属性是F,3号属性是E,4号。。5号。。
这样
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
31838
在线时间
5079 小时
注册时间
2012-11-19
帖子
4877

开拓者

发表于 2018-8-5 15:04:15 | 显示全部楼层
嘛~,想要每个状态都多个属性增减那就更简单了,既然数据库状态里没有地方写,
那也只有编辑在脚本里。
建一个哈希随便编辑就行了, 想多少个状态就照格式写多少个,每个状态想增减多少属性就写多少,
不说四五个,每个状态9项属性你全都增减也是可以的。
  1. #==============================================================================
  2. # 状态增减固定属性              
  3. #==============================================================================
  4. # Author : 芯☆淡茹水
  5. #==============================================================================
  6. #==============================================================================
  7. module XdRs_Sp
  8.   Add_Data = {
  9.   #对应格式(正加负减):
  10.   #状态ID   HP  SP 力量 敏捷 速度 魔力 攻击 物防 魔防
  11.       8 => [200, 0,  0,  0,   0,   0,   0,   0,   0],
  12.      12 => [0,-200,0,0,0,0,0,0,0],
  13.      13 => [200,0,100,0,0,0,0,0,0]
  14.   }
  15.   #--------------------------------------------------------------------------
  16.   def self.attribute_names
  17.     return ["maxhp","maxsp","str","dex","agi","int","atk","pdef","mdef"]
  18.   end
  19.   #--------------------------------------------------------------------------
  20.   def self.state_add(state_id, param_index)
  21.     return Add_Data[state_id] ?  Add_Data[state_id][param_index] || 0 : 0
  22.   end
  23. end
  24. #==============================================================================
  25. class Game_Battler
  26.   #--------------------------------------------------------------------------
  27.   alias xr_state_property_initialize initialize
  28.   def initialize
  29.     xr_state_property_initialize
  30.     @atk_plus  = @pdef_plus = @mdef_plus = 0
  31.   end
  32.   #--------------------------------------------------------------------------
  33.   def refresh_state_changed(states_data, type)
  34.     return unless ["add", "remove"].include?(type)
  35.     data = (states_data - @states) | (@states - states_data)
  36.     data.each{|id| attribute_count(id, type)}
  37.     @hp = [@hp, self.maxhp].min
  38.     @sp = [@sp, self.maxsp].min
  39.   end
  40.   #--------------------------------------------------------------------------
  41.   def attribute_count(state_id, type)
  42.     XdRs_Sp.attribute_names.each_with_index do |sym, index|
  43.       num = XdRs_Sp.state_add(state_id, index)
  44.       next if num == 0
  45.       num = type == "add" ? num : -num
  46.       value = instance_variable_get("@#{sym}_plus") + num
  47.       instance_variable_set("@#{sym}_plus", value)
  48.     end
  49.   end
  50.   #--------------------------------------------------------------------------
  51.   alias xr_state_property_add_state add_state
  52.   def add_state(state_id, force=false)
  53.     last_states = @states.clone
  54.     xr_state_property_add_state(state_id, force)
  55.     last_states != @states && refresh_state_changed(last_states, "add")
  56.   end
  57.   #--------------------------------------------------------------------------
  58.   alias xr_state_property_remove_state remove_state
  59.   def remove_state(state_id, force=false)
  60.     last_states = @states.clone
  61.     xr_state_property_remove_state(state_id, force)
  62.     last_states != @states && refresh_state_changed(last_states, "remove")
  63.   end
  64. end
  65. #==============================================================================
  66. class Game_Actor < Game_Battler
  67.   #--------------------------------------------------------------------------
  68.   alias xr_state_property_base_atk base_atk
  69.   def base_atk;  return xr_state_property_base_atk + @atk_plus;   end
  70.   #--------------------------------------------------------------------------
  71.   alias xr_state_property_base_pdef base_pdef
  72.   def base_pdef; return xr_state_property_base_pdef + @pdef_plus; end
  73.   #--------------------------------------------------------------------------
  74.   alias xr_state_property_base_mdef base_mdef
  75.   def base_mdef; return xr_state_property_base_mdef + @mdef_plus; end
  76. end
  77. #==============================================================================
  78. class Game_Enemy < Game_Battler
  79.   #--------------------------------------------------------------------------
  80.   alias xr_state_property_base_atk base_atk
  81.   def base_atk;  return xr_state_property_base_atk + @atk_plus;   end
  82.   #--------------------------------------------------------------------------
  83.   alias xr_state_property_base_pdef base_pdef
  84.   def base_pdef; return xr_state_property_base_pdef + @pdef_plus; end
  85.   #--------------------------------------------------------------------------
  86.   alias xr_state_property_base_mdef base_mdef
  87.   def base_mdef; return xr_state_property_base_mdef + @mdef_plus; end
  88. end
  89. #==============================================================================
  90. #==============================================================================
复制代码

点评

-_-!!! , 好吧,反正已经做了,顺便再改一版出来。  发表于 2018-8-5 16:02
当然是你说的关联公共事件……占用公共事件位置那毕竟还是在数据库中,调整可以联动,也不用记忆一堆id……  发表于 2018-8-5 15:59
要不可以关联公共事件,反正里面有增加属性,读取其数据就可以了。但也要占用公共事件位置,  发表于 2018-8-5 15:57
那有什么办法! XP这尿性你又不是不知道,想要过多的数据,在数据库状态里根本无法下手。  发表于 2018-8-5 15:56
把数据批量写在脚本里……维护会是个极大的问题  发表于 2018-8-5 15:46

评分

参与人数 1+1 收起 理由
阮声悠悠 + 1 我很赞同

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 1 反对 0

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3981
在线时间
603 小时
注册时间
2017-4-21
帖子
228
 楼主| 发表于 2018-8-5 15:09:11 | 显示全部楼层
灯笼菜刀王 发表于 2018-8-5 13:24
其实, 如果是要"状态加成的数值全部为增加固定数值而不是百分比" 那改下公式就好了

  #-------- ...

想问个问题
  1.   #--------------------------------------------------------------------------
  2.   # ● 获取力量
  3.   #--------------------------------------------------------------------------
  4.   def str
  5.     n = [[base_str + @str_plus, 1].max, 999].min
  6.     for i in @states
  7.       n *= $data_states[i].str_rate / 100.0
  8.      [color=Red] #这里调用方法(self,n,0,0,0,0),把n和self代入进去,在方法内进行计算,然后返回一个值[/color]
  9.      n += #上面返回的值
  10.     end
  11.     n = [[Integer(n), 1].max, 999].min
  12.     return n
  13.   end
  14.   #--------------------------------------------------------------------------
  15.   # ● 获取灵巧
  16.   #--------------------------------------------------------------------------
  17.   def dex
  18.     n = [[base_dex + @dex_plus, 1].max, 999].min
  19.     for i in @states
  20.       n *= $data_states[i].dex_rate / 100.0
  21.      [color=Red] #这里也调用同一个方法(self,0,n,0,0,0),把n和self代入进去,在方法内进行计算,然后返回一个值[/color]
  22.      n += #上面返回的值
  23.     end
  24.     n = [[Integer(n), 1].max, 999].min
  25.     return n
  26.   end
复制代码


然后呢,这个方法的逻辑是这样
RUBY 代码复制
  1. (self,LiLiang,LingQiao,MoLi,MoFaFangYu,SuDu)
  2. if self.state?(32)
  3.   LiLiang += 123
  4.   LingQiao += 22
  5. end


我不知道该怎么写

点评

你这个就和芯大的方法一致了,不会引用常数的话,还是芯大那招直接在数据库设置更方便。  发表于 2018-8-6 09:55
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
31838
在线时间
5079 小时
注册时间
2012-11-19
帖子
4877

开拓者

发表于 2018-8-5 17:01:18 | 显示全部楼层
本帖最后由 芯☆淡茹水 于 2018-8-5 17:56 编辑

看了一下,公共事件的增减属性值只有六项,所以改用 公共事件 的 注释 来 备注
这个在状态名关联公共事件,如果有其它的脚本在状态里使用同样方法关联东西,可能会使状态名字变得奇怪或相关功能失效。

  1. #==============================================================================
  2. # 状态增减固定属性              
  3. #==============================================================================
  4. # Author : 芯☆淡茹水
  5. #==============================================================================
  6. # 1,状态关联公共事件。
  7. #    状态名后面加上 ☆ ,接着写上公共事件ID。
  8. #
  9. # 2,对应公共事件的编辑。
  10. #    公共事件编辑 注释 ,然后写上以下的对应备注项。
  11. #    注意:两项之间不要接连备注,用随意字符或空格隔开以及换行都行。
  12. #    备注格式:<maxhp:num>      最大HP
  13. #              <maxsp:num>      最大SP
  14. #              <str:num>        力量
  15. #              <dex:num>        敏捷
  16. #              <agi:num>        速度
  17. #              <int:num>        魔力
  18. #              <atk:num>        攻击力
  19. #              <pdef:num>       防御力
  20. #              <mdef:num>       魔法防御力
  21. #
  22. #    里面的 num 为增/减的值,正加负减,中间不要留空格。例: <maxhp:200> , <str:-20>
  23. #
  24. #==============================================================================
  25. module RPG
  26.   class State
  27.     #--------------------------------------------------------------------------
  28.     def name;    return @name.split("☆")[0] || "";     end
  29.     #--------------------------------------------------------------------------
  30.     def spce_id; return @name.split("☆")[1].to_i || 0; end
  31.   end
  32. end
  33. #==============================================================================
  34. module XdRs_Sp
  35.   #--------------------------------------------------------------------------
  36.   def self.attribute_names
  37.     return ["maxhp","maxsp","str","dex","agi","int","atk","pdef","mdef"]
  38.   end
  39.   #--------------------------------------------------------------------------
  40.   def self.state_has_spce?(state_id)
  41.     event = self.spce_event(state_id)
  42.     return event && event.list.any?{|l| l.code == 108 }
  43.   end
  44.   #--------------------------------------------------------------------------
  45.   def self.spce_event(state_id)
  46.     return $data_common_events[$data_states[state_id].spce_id]
  47.   end
  48.   #--------------------------------------------------------------------------
  49.   def self.state_add(state_id, sym)
  50.     note = self.event_note(self.spce_event(state_id))
  51.     return $1.to_i  if note.match(Regexp.new("<#{sym}:(\\d+)>"))
  52.     return -$1.to_i if note.match(Regexp.new("<#{sym}:-(\\d+)>"))
  53.     return 0
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   def self.event_note(event)
  57.     note = event.list.find_all{|l| [108,408].include?(l.code)}.map{|l| l.parameters[0]}
  58.     return note.join(";")
  59.   end
  60. end
  61. #==============================================================================
  62. class Game_Battler
  63.   #--------------------------------------------------------------------------
  64.   alias xr_state_property_initialize initialize
  65.   def initialize
  66.     xr_state_property_initialize
  67.     @atk_plus  = @pdef_plus = @mdef_plus = 0
  68.   end
  69.   #--------------------------------------------------------------------------
  70.   def refresh_state_changed(states_data, type)
  71.     return unless ["add", "remove"].include?(type)
  72.     data = (states_data - @states) | (@states - states_data)
  73.     data = data.find_all{|id| XdRs_Sp.state_has_spce?(id) }
  74.     unless data.empty?
  75.       data.each{|id| attribute_count(id, type)}
  76.       @hp = [@hp, self.maxhp].min
  77.       @sp = [@sp, self.maxsp].min
  78.     end
  79.   end
  80.   #--------------------------------------------------------------------------
  81.   def attribute_count(state_id, type)
  82.     XdRs_Sp.attribute_names.each do |sym|
  83.       num = XdRs_Sp.state_add(state_id, sym)
  84.       next if num == 0
  85.       num = type == "add" ? num : -num
  86.       value = instance_variable_get("@#{sym}_plus") + num
  87.       instance_variable_set("@#{sym}_plus", value)
  88.     end
  89.   end
  90.   #--------------------------------------------------------------------------
  91.   alias xr_state_property_add_state add_state
  92.   def add_state(state_id, force=false)
  93.     last_states = @states.clone
  94.     xr_state_property_add_state(state_id, force)
  95.     last_states != @states && refresh_state_changed(last_states, "add")
  96.   end
  97.   #--------------------------------------------------------------------------
  98.   alias xr_state_property_remove_state remove_state
  99.   def remove_state(state_id, force=false)
  100.     last_states = @states.clone
  101.     xr_state_property_remove_state(state_id, force)
  102.     last_states != @states && refresh_state_changed(last_states, "remove")
  103.   end
  104. end
  105. #==============================================================================
  106. class Game_Actor < Game_Battler
  107.   #--------------------------------------------------------------------------
  108.   alias xr_state_property_base_atk base_atk
  109.   def base_atk;  return xr_state_property_base_atk + @atk_plus;   end
  110.   #--------------------------------------------------------------------------
  111.   alias xr_state_property_base_pdef base_pdef
  112.   def base_pdef; return xr_state_property_base_pdef + @pdef_plus; end
  113.   #--------------------------------------------------------------------------
  114.   alias xr_state_property_base_mdef base_mdef
  115.   def base_mdef; return xr_state_property_base_mdef + @mdef_plus; end
  116. end
  117. #==============================================================================
  118. class Game_Enemy < Game_Battler
  119.   #--------------------------------------------------------------------------
  120.   alias xr_state_property_base_atk base_atk
  121.   def base_atk;  return xr_state_property_base_atk + @atk_plus;   end
  122.   #--------------------------------------------------------------------------
  123.   alias xr_state_property_base_pdef base_pdef
  124.   def base_pdef; return xr_state_property_base_pdef + @pdef_plus; end
  125.   #--------------------------------------------------------------------------
  126.   alias xr_state_property_base_mdef base_mdef
  127.   def base_mdef; return xr_state_property_base_mdef + @mdef_plus; end
  128. end
  129. #==============================================================================
  130. #==============================================================================
复制代码


上面一共发了 3 个版本的,总有一款适合的。

评分

参与人数 2星屑 +350 +1 收起 理由
RyanBern + 300 + 1 认可答案
SailCat + 50 认可答案

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-18 12:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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