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

Project1

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

[已经解决] 如何实现状态层数的效果?(已解决)

[复制链接]

Lv2.观梦者

梦石
0
星屑
872
在线时间
194 小时
注册时间
2019-4-11
帖子
56
跳转到指定楼层
1
发表于 2021-7-19 08:42:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
200星屑
本帖最后由 sxjkjly8010 于 2021-7-19 10:37 编辑

已解决

参考了VIP和Theo的写法试图自己写一个状态层数的效果,但是最后还是卡壳了
RUBY 代码复制
  1. class Game_Battler
  2.  
  3.   STATE_UPGRADE = {
  4.     #28 => [28, 29, 30],  # 28、29、30号状态为三个等级。通过添加28号状态来升级
  5.     #31 => [31, 32]
  6.   }
  7.  
  8.   alias as_20141212 add_state
  9.   def add_state(id)
  10.     levels = STATE_UPGRADE[id]
  11.     return as_20141212(id) unless levels
  12.     index = levels.index { |state| state?(state) } # 当前等级
  13.     return as_20141212(id) unless index
  14.     return if index == levels.size - 1   # 已经达到最高等级
  15.     remove_state levels[index]
  16.     as_20141212 levels[index + 1]
  17.   end
  18.  
  19. end

RUBY 代码复制
  1. # =============================================================================
  2. # TheoAllen - 状态堆叠
  3. # Version : 1.0
  4. # Contact : www.rpgmakerid.com (or) http://theolized.blogspot.com
  5. # (This script documentation is written in informal indonesian language)
  6. # =============================================================================
  7. ($imported ||= {})[:Theo_StackingState] = true
  8. # =============================================================================
  9. # Change Logs:
  10. # -----------------------------------------------------------------------------
  11. # 2013.10.24 - Finished Script
  12. # =============================================================================
  13. =begin
  14.  
  15.   介绍 :
  16.   本脚本可以使相同状态效果互相叠加.
  17.  
  18.   使用方法 :
  19.   本脚本放在插件脚本之下,main之上
  20.   状态备注: <stack: n>
  21.   n为最大堆叠数量。
  22.  
  23.   使用条款 :
  24.   署名脚本作者, TheoAllen. 你可以自由编辑此脚本,只要你不声明你是脚本的原作者
  25.   如果你想用此脚本于商业游戏,请和我共享收益.别忘了给我一份免费的游戏拷贝.
  26.  
  27. =end
  28. # =============================================================================
  29. # 无设定
  30. # =============================================================================
  31. class RPG::State < RPG::BaseItem
  32.   attr_accessor :max_stack
  33.  
  34.   def load_stack
  35.     @max_stack = 1
  36.     note.split(/[\r\n]+/).each do |line|
  37.       if line =~ /<stack:[ ]*(\d+)>/i
  38.         @max_stack = $1.to_i
  39.       end
  40.     end
  41.   end
  42.  
  43. end
  44.  
  45. class << DataManager
  46.  
  47.   alias theo_stackstate_load_db load_database
  48.   def load_database
  49.     theo_stackstate_load_db
  50.     load_stackstate_db
  51.   end
  52.  
  53.   def load_stackstate_db
  54.     $data_states.compact.each do |state|
  55.       state.load_stack
  56.     end
  57.   end
  58.  
  59. end
  60.  
  61. class Game_Battler < Game_BattlerBase
  62.   # ---------------------------------------------------------------------------
  63.   # Overwrite add state
  64.   # ---------------------------------------------------------------------------
  65.   def add_state(state_id)
  66.     #puts @states.select {|id| id == state_id}.size
  67.     if state_addable?(state_id)
  68.       add_new_state(state_id) unless state?(state_id) && state_maxed?(state_id)
  69.       reset_state_counts(state_id)
  70.       @result.added_states.push(state_id).uniq!
  71.     end
  72.   end
  73.  
  74.   def state_maxed?(state_id)
  75.     @states.select {|id| id == state_id}.size ==
  76.       $data_states[state_id].max_stack
  77.   end
  78.  
  79. end

RUBY 代码复制
  1. class RPG::State < RPG::BaseItem
  2.   attr_accessor :max_level
  3.  
  4.   def load_level
  5.     @max_level = 1
  6.     note.split(/[\r\n]+/).each do |line|
  7.       if line =~ /<level:[ ]*(\d+)>/i
  8.         @max_level = $1.to_i
  9.       end
  10.     end
  11.   end
  12.  
  13. end
  14.  
  15. class << DataManager
  16.  
  17.   alias theo_levelstate_load_db load_database
  18.   def load_database
  19.     theo_levelstate_load_db
  20.     load_levelstate_db
  21.   end
  22.  
  23.   def load_levelstate_db
  24.     $data_states.compact.each do |state|
  25.       state.load_level
  26.     end
  27.   end
  28.  
  29. end
  30.  
  31. class Game_BattlerBase
  32.   attr_reader   :state_levels  
  33.   alias clear_states_levels clear_states
  34.   def clear_states
  35.     clear_states_levels
  36.     @state_levels = {}
  37.   end
  38.  
  39.   alias erase_state_levels erase_state
  40.   def erase_state(state_id)
  41.     erase_state_levels(state_id)
  42.     reset_state_levels(state_id)
  43.   end
  44.  
  45.   def reset_state_levels(state_id)
  46.     @state_levels ||= {}
  47.     @state_levels.delete(state_id)
  48.   end  
  49.  
  50.   def set_state_levels(state_id)
  51.     @state_levels ||= {}
  52.     @state_levels[state_id] ||= 0
  53.   end
  54.  
  55.   def state_levels(state_id)
  56.     @state_levels ||= {}
  57.     d = @state_levels[state_id]
  58.     d ? d : 0
  59.   end
  60.  
  61. end
  62.  
  63. class Game_Battler < Game_BattlerBase
  64.   alias akahara_20210719 add_state
  65.   def add_state(state_id)
  66.     akahara_20210719(state_id)
  67.     set_state_levels(state_id)
  68.     if state_addable?(state_id)
  69.       return if $data_states[state_id].max_level <= 1
  70.       if @state_levels[state_id] <= 1
  71.         @state_levels[state_id] = 1
  72.       end
  73.       if state?(state_id)
  74.         @state_levels[state_id] += 1 if @state_levels[state_id] != $data_states[state_id].max_level
  75.       end
  76.     end
  77.   end
  78. end


设想的是一个状态可以设定最大层数,通过重复赋予一个状态来使层数+1,也就是每个角色敌人都能计算层数,最大层数是定死的,但是参考这两位大大的写法来看,theo的size应该是判断当前状态的个数?vip的level应该是判断当前处于哪个状态,看上去都是定死的,不能够实现每个角色独立增加!不使用vip的是因为如果一个状态可以堆叠的层数太多,复制几十个几百个那就太难受了

已解决

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

本版积分规则

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

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

GMT+8, 2024-4-26 02:08

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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