Project1

标题: 冷却脚本与技能脚本冲突,跪求帮助 [打印本页]

作者: 望月神绮    时间: 2016-5-26 20:21
标题: 冷却脚本与技能脚本冲突,跪求帮助
我用的绿发的Eclair的豪华版技能冷却系统。将这份代码放在后面位置(我技能脚本后面)的话,它的实现是没有问题,但是我技能脚本在使用过程中就会出错,错误原因第133行发生了NoMethodError,private method ‘split’called for nil:NilClass。
然后如果把它放在前面,则会出现错误,错误显示是第77行发生了ArgunmentError wrong number of argunments(1 for 0)。
然后我贴脚本,首先是豪华冷却。
  1. #=======================================================================
  2. #  豪华版技能冷却系统 By 绿发的Eclair
  3. #  使用方法:在特技名称后面用半角逗号分割,写上冷却回合数。
  4. #  比如 十字斩,10 就是特技 十字斩 冷却10个回合了。
  5. #  注意这个冷却是敌我通用的,不只是我方,敌人也不会使用冷却中的技能哦。
  6. #  不想让特技窗口中显示冷却回合数, $冷却时间显示 = false 就行了。
  7. #  冲突性:存在,但是除了RTAB外似乎整合难度不大。
  8. #=======================================================================
  9. $冷却时间显示 = true
  10. module RPG
  11.   class Skill
  12.   def cold
  13.     return @name.split(/-/)[1]
  14.   end
  15.   def name(actor = nil)
  16.     if $冷却时间显示 and actor != nil and actor.cold[@id] != nil
  17.       a = (@name.split(/-/)[0] == nil ? 0 : @name.split(/-/)[0])
  18.       return a + "(" + actor.cold[@id].to_s + "回合冷却)"
  19.     else
  20.       return (@name.split(/-/)[0] == nil ? 0 : @name.split(/-/)[0])
  21.     end
  22.   end
  23.   end
  24. end
  25. class Game_Battler
  26.   attr_accessor :cold
  27.   alias initialize_cold :initialize
  28.   def initialize
  29.     @cold = {}
  30.     initialize_cold
  31.   end
  32.   def set_cold(key,val)
  33.     return if @cold[key] == nil
  34.     @cold[key] += val
  35.     @cold.delete(key) if @cold[key] <= 0
  36.   end
  37.   alias skill_can_use_addcold :skill_can_use?
  38.   def skill_can_use?(skill_id)
  39.     return false if @cold[skill_id] != nil
  40.     skill_can_use_addcold(skill_id)
  41.   end
  42. end
  43. class Scene_Battle
  44.   alias make_skill_action_result_addcold :make_skill_action_result
  45.   def make_skill_action_result
  46.     make_skill_action_result_addcold
  47.     if @skill.cold.to_i != 0
  48.     @active_battler.cold[@skill.id] = @skill.cold.to_i
  49.     end
  50.   end
  51.   alias start_phase4_addcold :start_phase4
  52.   def start_phase4
  53.     for i in $game_party.actors + $game_troop.enemies
  54.       for j in i.cold.keys
  55.       i.set_cold(j,-1)
  56.       end  
  57.     end  
  58.     start_phase4_addcold
  59.   end   
  60. end  
  61. class Window_Skill < Window_Selectable
  62.     def draw_item(index)
  63.     skill = @data[index]
  64.     if @actor.skill_can_use?(skill.id)
  65.       self.contents.font.color = normal_color
  66.     else
  67.       self.contents.font.color = disabled_color
  68.     end
  69.     x = 4 + index % 2 * (288 + 32)
  70.     y = index / 2 * 32
  71.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  72.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  73.     bitmap = RPG::Cache.icon(skill.icon_name)
  74.     opacity = self.contents.font.color == normal_color ? 255 : 128
  75.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  76.     if $scene.is_a?(Scene_Battle)
  77.     self.contents.draw_text(x + 28, y, 204, 32, skill.name(@actor), 0)
  78.     else
  79.     self.contents.draw_text(x + 28, y, 204, 32, skill.name, 0)
  80.     end
  81.     self.contents.draw_text(x + 232, y, 48, 32, skill.sp_cost.to_s, 2)
  82.   end
  83. end

  84. class Game_Enemy < Game_Battler
  85.     def make_action
  86.     # 清除当前行动
  87.     self.current_action.clear
  88.     # 无法行动的情况
  89.     unless self.movable?
  90.       # 过程结束
  91.       return
  92.     end
  93.     # 抽取现在有效的行动
  94.     available_actions = []
  95.     rating_max = 0
  96.     for action in self.actions
  97.       # 确认回合条件
  98.       n = $game_temp.battle_turn
  99.       a = action.condition_turn_a
  100.       b = action.condition_turn_b
  101.       if (b == 0 and n != a) or
  102.          (b > 0 and (n < 1 or n < a or n % b != a % b))
  103.         next
  104.       end
  105.       # 确认 HP 条件
  106.       if self.hp * 100.0 / self.maxhp > action.condition_hp
  107.         next
  108.       end
  109.       if self.cold[action.skill_id] != nil
  110.         next
  111.       end
  112.       # 确认等级条件
  113.       if $game_party.max_level < action.condition_level
  114.         next
  115.       end
  116.       # 确认开关条件
  117.       switch_id = action.condition_switch_id
  118.       if switch_id > 0 and $game_switches[switch_id] == false
  119.         next
  120.       end
  121.       # 符合条件 : 添加本行动
  122.       available_actions.push(action)
  123.       if action.rating > rating_max
  124.         rating_max = action.rating
  125.       end
  126.     end
  127.     # 最大概率值作为 3 合计计算(0 除外)
  128.     ratings_total = 0
  129.     for action in available_actions
  130.       if action.rating > rating_max - 3
  131.         ratings_total += action.rating - (rating_max - 3)
  132.       end
  133.     end
  134.     # 概率合计不为 0 的情况下
  135.     if ratings_total > 0
  136.       # 生成随机数
  137.       value = rand(ratings_total)
  138.       # 设置对应生成随机数的当前行动
  139.       for action in available_actions
  140.         if action.rating > rating_max - 3
  141.           if value < action.rating - (rating_max - 3)
  142.             self.current_action.kind = action.kind
  143.             self.current_action.basic = action.basic
  144.             self.current_action.skill_id = action.skill_id
  145.             self.current_action.decide_random_target_for_enemy
  146.             return
  147.           else
  148.             value -= action.rating - (rating_max - 3)
  149.           end
  150.         end
  151.       end
  152.     end
  153.   end
  154. end
  155. #=======================================================================
  156. #豪华版技能冷却系统
  157. #=======================================================================
复制代码
然后是我的技能脚本
  1. module RPG
  2.   #--------------------------------------------------------------------------
  3.   # ● Cache追加
  4.   #--------------------------------------------------------------------------  
  5.   module Cache
  6.     def self.faces(filename)
  7.       self.load_bitmap("Graphics/Faces/", filename)
  8.     end
  9.     def self.menu(filename)
  10.       self.load_bitmap("Graphics/Menu/", filename)
  11.     end
  12.     def self.images(filename)
  13.       self.load_bitmap("Graphics/Images/", filename)
  14.     end
  15.     def self.menu(filename)
  16.       self.load_bitmap("Graphics/Menu/", filename)
  17.     end
  18.     def self.menu_icon(filename)
  19.       self.load_bitmap("Graphics/Menu_Icons/", filename)
  20.     end
  21.     def self.crystal(filename)
  22.       self.load_bitmap("Graphics/Crystal/", filename)
  23.     end
  24.     def self.members(filename)
  25.       self.load_bitmap("Graphics/Members/", filename)
  26.     end
  27.     def self.mission(filename)
  28.       self.load_bitmap("Graphics/Mission/", filename)
  29.     end
  30.     def self.cook(filename)
  31.       self.load_bitmap("Graphics/Cook/", filename)
  32.     end
  33.   end
  34.   #--------------------------------------------------------------------------
  35.   # ● 结晶回路用全局变量
  36.   #--------------------------------------------------------------------------
  37.   # 结晶石防具数据库起始ID,此为第一件结晶石的ID,其后不得再含有普通的防具。
  38.   ARMOR_BEGIN = 201
  39.   # 结晶石技能数据库起始ID,此为第一个结晶石技能的ID,其后不得再含有普通的技能。
  40.   SKILL_BEGIN = 201
  41.   #--------------------------------------------------------------------------
  42.   # ● 结晶回路的各个属性定义
  43.   #--------------------------------------------------------------------------
  44.   class Armor
  45.     # 防具数据库,结晶石是通过防具数据库进行设置的。
  46.     # 设置方法:
  47.     # 在属性防御上勾选此结晶所包含的属性,之后在名称栏中通过半角逗号分隔,将具
  48.     # 体属性值写于其中。如范例中:“火神的愤怒,25@5”,同时勾选了炎和雷属性,根
  49.     # 据从上到下的先后次序,炎属性为25,雷属性为5。
  50.     # 结晶石本身的属性以及本身的等级,通过描述一栏后追加分隔符的方法来给定。
  51.     # 具体可参考范例。
  52.    
  53.     if self.id >= ARMOR_BEGIN
  54.     #--------------------------------------------------------------------------
  55.     # ● 重新定义名字
  56.     #--------------------------------------------------------------------------  
  57.       def name
  58.         return @name.split(/,/)[0]
  59.       end
  60.     #--------------------------------------------------------------------------
  61.     # ● 定义结晶回路包含的属性值
  62.     #--------------------------------------------------------------------------  
  63.       def crystal_element
  64.         return Array.new(CRYSTAL::ELE_NUMBER, 0) if @name.split(/,/).size == 1
  65.         data = @name.split(/,/)[1].split(/@/)
  66.         final = []
  67.         for i in 0...CRYSTAL::ELE_NUMBER
  68.           if self.guard_element_set.include?(i + 1)
  69.             if data.empty?
  70.               raise ("#{@id}号结晶石的属性未设置")
  71.             end
  72.             final[i] = data.shift.to_i
  73.           else
  74.             final[i] = 0
  75.           end
  76.         end
  77.         return final
  78.       end
  79.     #--------------------------------------------------------------------------
  80.     # ● 重新定义结晶回路的描述
  81.     #--------------------------------------------------------------------------  
  82.       def description
  83.         return @description.split(/,/)[0]
  84.       end
  85.     #--------------------------------------------------------------------------
  86.     # ● 定义结晶回路的主要属性
  87.     #--------------------------------------------------------------------------  
  88.       def element
  89.         return @description.split(/,/)[1].to_i
  90.       end
  91.     #--------------------------------------------------------------------------
  92.     # ● 定义结晶回路的等级
  93.     #--------------------------------------------------------------------------  
  94.       def level
  95.         return @description.split(/,/)[2].to_i
  96.       end
  97.     #--------------------------------------------------------------------------
  98.     # ● 定义结晶回路的价格 也就是耗费的各个耀晶片数量
  99.     #--------------------------------------------------------------------------   
  100.       def cost_sepich
  101.         @data = $data_armors[self.id+1].description.split(/#/)
  102.         final = []
  103.         for i in 0...CRYSTAL::ELE_NUMBER
  104.           if $data_armors[self.id+1].guard_element_set.include?(i+1)
  105.             if @data.empty?
  106.               break
  107.             end
  108.             final[i] = @data.shift.to_i
  109.           else
  110.             final[i] = 0
  111.           end
  112.         end
  113.         return final
  114.       end
  115.     #--------------------------------------------------------------------------
  116.     # ● 定义结晶回路的种类 为了让同样的回路不能装备多个用
  117.     #--------------------------------------------------------------------------   
  118.       def cry_type
  119.         return $data_armors[self.id+1].name.to_i
  120.       end
  121.       
  122.     end
  123.   end
  124.   class Skill
  125.     # 技能数据库,用来设置根据结晶属性值的多少学会的技能。
  126.     # 设置方法与防具数据库类似,勾选属性一栏的对应属性,然后通过名称给予需要的
  127.     # 结晶属性值。

  128.     if self.id >= SKILL_BEGIN
  129.       def name
  130.         return @name.split(/,/)[0]
  131.       end
  132.       def require_element
  133.         data = @name.split(/,/)[1].split(/@/)
  134.         final = []
  135.         for i in 0...CRYSTAL::ELE_NUMBER
  136.           if self.element_set.include?(i + 1)
  137.             if data.empty?
  138.               raise ("#{@id}号技能的属性未设置")
  139.             end
  140.             final[i] = data.shift.to_i
  141.           else
  142.             final[i] = 0
  143.           end
  144.         end
  145.         return final
  146.       end
  147.       def description
  148.         return @description.split(/,/)[0]
  149.       end
  150.       def element
  151.         return @description.split(/,/)[1].to_i
  152.       end
复制代码
能想办法颁布感我处理一下这个BUG吗……拜托各位大神了QAQ,跪求帮助

作者: cinderelmini    时间: 2016-5-27 12:55
本帖最后由 cinderelmini 于 2016-5-27 21:08 编辑
  1. module RPG
  2.   class Skill
  3.     def name(actor = nil)
  4.       _name = @name.split(/,/)[0] || @name
  5.       a = _name.split(/-/)[0]
  6.       if ($冷却时间显示 and actor and actor.cold[@id])
  7.         return "#{a}(#{actor.cold[@id].to_s}回合冷却)"
  8.       else
  9.         return a
  10.       end
  11.     end
  12.     def cold
  13.       _name = @name.split(/,/)[0] || @name
  14.       return _name.split(/-/)[1].to_i
  15.     end
  16.   end
  17. end
复制代码
试试放在列表里这俩系统之下,然后设置的时候先填冷却再填结晶属性。
例【十字斩-3,1@2@5】
也许能成吧…………

发现冷却脚本里名字的设定好像有坑,代码已经改了,
脚本的顺序大概应该是:
·冷却
·结晶
·本楼这个
作者: 望月神绮    时间: 2016-5-27 16:26
cinderelmini 发表于 2016-5-27 12:55
试试放在列表里这俩系统之下,然后设置的时候先填冷却再填结晶属性。
例【十字斩-3,1@2@5】
也许能成吧…… ...

那个您好。
把您这段代码粘到了最后面(MAIN前),然后把冷却放在结晶属性后,冷却可以实现,结晶属性的技能还是会报错。然后把冷却放在结晶属性前,冷却不能实现,结晶属性还是会报错……求帮助……问题还是134行发生那个错误。
作者: 望月神绮    时间: 2016-5-27 18:56
cinderelmini 发表于 2016-5-27 12:55
试试放在列表里这俩系统之下,然后设置的时候先填冷却再填结晶属性。
例【十字斩-3,1@2@5】
也许能成吧…… ...

您给我的第5行在使用结晶的时候发生了错误,NoMethodError,private method ‘split’called for nil:NilClass。
然后我试了一下,冷却脚本也不好使了,在战斗测试里,我给技能加了十字斩-5,在技能里显示确实是十字斩,但是用完没有冷却显示。
如果需要工程的话我可以发上来,不过可能有些大,工程必须的贴图有些多……

作者: 望月神绮    时间: 2016-5-27 19:15
我添加的脚本有些多,要运行游戏需要许多图片支持,传不了那么大的文件。
如果您有时间的话可不可以告诉我您的QQ之类联系方式?我好把工程传给您。我只放了一个DATA上来……
我的QQ是815839513。谢谢您的帮助,拜托了……

DATA.zip

735.94 KB, 下载次数: 37






欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1