查看: 2662|回复: 1

[原创发布] 【7.20更新】仅用一个状态就能制作数十层的状态层数脚本

[复制链接]
梦石
0
星屑
1581
在线时间
253 小时
注册时间
2019-4-11
回帖
32
发表于 2021-7-19 10:33:13 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 sxjkjly8010 于 2021-7-20 07:39 编辑

其实也不能算是完全原创吧,也是自己参考了一些状态堆叠脚本写出来的脚本
时常会觉得制作层数太累太累了,而且有些手游现在还经常能看见那种30层,100层,甚至更多层数的状态,如果真的复制粘贴那么多那真的人都要没了,那为什么不让状态拥有一个层数的值呢?
[pre lang="ruby"]# =============================================================================
# 状态层数脚本 By Akahara
# =============================================================================
# 是否时常因为制作层数状态需要复制粘贴好几个无法制作数十层而感到苦恼?
# 为状态新增了max_level和state_levels的概念
# 在状态的备注中填写<level: x>,即该状态上限x层,未填写默认为1层
# 可以通过state_levels(state_id)来制作每层增加数值的效果
# 具体使用方法可以查阅https://rpg.blue/thread-486408-1-1.html
# =============================================================================
class RPG::State < RPG::BaseItem
  attr_accessor :max_level
  
  def load_level
    @max_level = 1
    note.split(/[\r\n]+/).each do |line|
      if line =~ /<level:[ ]*(\d+)>/i
        @max_level = $1.to_i
      end
    end
  end
  
end

class << DataManager
  
  alias theo_levelstate_load_db load_database
  def load_database
    theo_levelstate_load_db
    load_levelstate_db
  end
  
  def load_levelstate_db
    $data_states.compact.each do |state|
      state.load_level
    end
  end
  
end

class Game_BattlerBase
  attr_reader   :state_levels  
  alias clear_states_levels clear_states
  def clear_states
    clear_states_levels
    @state_levels = {}
  end
  
  alias erase_state_levels erase_state
  def erase_state(state_id)
    erase_state_levels(state_id)
    reset_state_levels(state_id)
  end
  
  def reset_state_levels(state_id)
    @state_levels ||= {}
    @state_levels.delete(state_id)
  end  
  
  def set_state_levels(state_id)
    @state_levels ||= {}
    @state_levels[state_id] ||= 0   
  end

  def state_levels(state_id)
    @state_levels ||= {}
    d = @state_levels[state_id]
    d ? d : 0
  end
end

class Game_Battler < Game_BattlerBase
  alias akahara_r_20210719 remove_state
  def remove_state(state_id)
    akahara_r_20210719(state_id)
    reset_state_levels(state_id)
  end
  
  alias akahara_20210719 add_state
  def add_state(state_id)
    akahara_20210719(state_id)
    set_state_levels(state_id)
    if state_addable?(state_id)
      return if $data_states[state_id].max_level <= 1
      if @state_levels[state_id] < 1
        @state_levels[state_id] = 1
        return ;
      end
      if state?(state_id)
        @state_levels[state_id] += 1 if @state_levels[state_id] != $data_states[state_id].max_level
      end
    end
  end
end
[/pre]

7月19日11:30更新:修复解除状态时层数不重置的问题
7月20日7:36更新:新增使用方法的例子(未更改脚本)

具体使用方法:
QQ图片20210719102703.png
在Game_BattlerBase中的def param(param_id)里可以使用state_levels(状态ID)来实现每层+1%最大生命的效果(红框标注),可以参考这种写法实现自己想要的效果,具体param_id填写几请参考57行

注:有的脚本(例如难易度脚本)给Game_Enemy重新定义了param(param_id),或者本身就重定义了Game_BattlerBase的def param(param_id),请注意查阅自己使用的脚本也照例填写层数效果

QQ截图20210720073701.png
在Game_Battler中的def make_damage_value(user, item)中可以追加value的计算(要放在@result.make_damage(value.to_i, item)之前),来实现每层使受到2号角色的伤害提升10%,可以参考这种写法实现自己想要的效果

评分

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

查看全部评分

梦石
0
星屑
146
在线时间
8 小时
注册时间
2022-2-18
回帖
9
发表于 2022-4-7 16:08:01 | 显示全部楼层
没看懂咋用。。。
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部