Project1

标题: 关于流星技能升级脚本的BUG [打印本页]

作者: yunxin0111    时间: 2015-1-21 10:07
标题: 关于流星技能升级脚本的BUG
本帖最后由 yunxin0111 于 2015-1-21 12:21 编辑

使用了流星大的技能脚本 https://rpg.blue/forum.php?mo ... 2619&highlight=技能升级  
RUBY 代码复制
  1. =begin
  2. 使用方法:
  3. 技能备注里填写 [max_level X]
  4. 则某技能最高能够提升到 X 级。
  5. 没有填写时默认为 1 ,则不会提升等级。
  6. 技能提升时,伤害值提升 当前等级/最高等级 倍
  7. 例如:某技能最高等级 10,当前等级 3。
  8. 则伤害提升 3/10 = 30%
  9.  
  10. 技能备注里填写 [exp_base X]
  11. 则技能升级的熟练度就会变化。没有填写时,默认为30。
  12. 熟练度的变化为 X * 技能等级的阶乘(factorial)
  13.  
  14. 技能升级有三种方式:
  15.   1. 事件指令升级
  16.     * 事件调用 gain_skill_level(角色ID, 技能ID[, 升级数])
  17.     
  18.   2. 吸收角色经验值当作熟练度来升级
  19.     * 技能备注里面填写 [exp_part 基础值]
  20.       则角色获得经验值时,技能能够获得 经验值/基础值 的熟练度
  21.       没有填写时,默认为0,则不会吸收经验值
  22.       
  23.       例如:[exp_part 10]
  24.       则角色获得 100 点经验值时,技能获得 100/10=10点熟练度
  25.       
  26.   3. 角色使用技能时,熟练度提升
  27.     * 技能备注里填写 [use_exp X]
  28.       则角色使用技能的时候,可以提升 X 点熟练度。
  29.       使用技能时,若对象超过一个,熟练度也只提升一次。
  30.       使用技能时,若是攻击落空,则熟练度减半。
  31.       若有需要可以填写做 0 ,则使用时不会提升熟练度
  32.       没有填写时,默认为1。
  33.       
  34.       目前跟着技能等级变化的只有伤害值和熟练度
  35. 其他会在下一版再加入。
  36.  
  37. 更新日志:
  38. 2012-02-11:
  39.   * 修正BUG
  40.      - 修正使用技能而获得熟练度时出错的问题
  41.      - 修正技能介面中,技能等级窗口可能消失的问题
  42.  
  43. 2012-02-12 更新 1.5 版
  44.   * 功能新增:等级提升至 X 级时,变化为另一个技能
  45.      - 技能备注里填写 [on_level X,I]
  46.        则当技能升级到 X 级时,则自动遗忘,并且角色自动学会 I 号技能
  47.      - 技能备注里填写 [inherit Y]
  48.        则其他的设定如最高等级、升级方式、技能熟练度自动继承 Y 号技能
  49.     
  50.   * 功能移除:技能升级时不再增加伤害
  51.  
  52.   * 介面修改:技能等级窗口
  53.      - 窗口下移,随着光标变换位置
  54.      - 移除下一级熟练度
  55.      - 增加技能变化的显示
  56.      - 修改显示/隐藏的呼叫方式,应该能降低冲突造成的问题
  57.  
  58. 2012-02-13 更新 1.5.1 版
  59.   * 介面修改:技能等级窗口
  60.      - 技能无法升级时,显示技能名称和讯息
  61.      - 调整技能熟练度的显示座标
  62.  
  63. 2012-02-14 更新 1.5.2 版
  64.   * 介面修改:技能等级窗口
  65.      - 修正熟练度增加实,经验槽不会填满的问题
  66.  
  67. 2012-02-14 更新 1.5.2 版
  68.   * Bug 修正:技能升级后,熟练度变负数的问题
  69.   * 功能新增:控制技能升级后,是否遗忘原有技能的开关
  70.   * 介面修改:技能等级窗口
  71.     技能升级后,没有遗忘原有技能时,技能熟练度不显示
  72.     调整技能熟练度的显示座标
  73.  
  74. 2012-02-18 更新 2.0 版
  75.   * 功能新增:增加各个技能是否在升级后被遗忘的设定
  76.     技能备注里填写 [no_forget],则升级后不会遗忘
  77.     脚本里可以设定 SKILL_LVUP_NO_FORGET=true 统一不遗忘任何技能
  78.     
  79.   * 功能新增:手动升级技能
  80.     所有无法吸收经验、无法在使用时获得熟练度的技能
  81.     即所有设定为[exp_part 0]、[use_exp 0]的技能
  82.     就是可以手动升级的技能
  83.     也可以在脚本里设定 SKILL_MANUAL_LVUP=true 所有技能全部能手动升级
  84.  
  85.   * 功能新增:角色获得技能升级点数
  86.     技能升级点数无上限,默认获得经验值的一半
  87.     可以在脚本中设定 SKILL_RES_EXP_BASE 来变化
  88.     技能升级点数的名称可以在脚本里修改 SKILL_REXP_VOCAB
  89.     默认名称为 "精元点数"
  90.     
  91.   * 介面修改:技能等级窗口
  92.     调整后置技能的显示座标
  93.     增加技能升级点数
  94.     可以手动升级的技能,升级点数正常显示。
  95.     不能手动升级的技能,升级点数会淡化。
  96.     按 X 键升级技能(可以在脚本里修改 SKILL_MAN_LVUP_KEY 来改变)
  97.  
  98. 2012-03-09 更新 2.1 版
  99.   * 新增功能:增加各个技能升级时,自动赋值的变量,此变量会自动添加进技能的伤害公式之中,增加伤害值
  100.     技能备注里填写 [dmg_var X],则技能升级后,会自动赋值 X+角色ID-1 号变量
  101.     这项设定是为了防止习得同技能的角色同时获得技能升级的效果
  102.     也就是说 X 为 3 ,角色有 5 人时
  103.     那么实际调用的变量如下:
  104.     1号角色 调用 3号变量
  105.     2号角色 调用 4号变量
  106.     ... ... ...
  107.     5号角色 调用 7号变量
  108.     所以在设定时请注意变量ID 的间距
  109.     赋值公式为 1+( 当前等级/最高等级)
  110.     
  111.     例如:技能3号 [dmg_var 3] 最高等级 4
  112.     技能升级为2级之后,伤害提升 1/2 倍
  113.     技能升级为3级之后,伤害提升 3/4 倍
  114.     技能升级为4级之后,伤害提升 1   倍
  115.  
  116. =end
  117.  
  118.  
  119. module Snstar2006
  120.   module Skill_LvUp
  121.     SKILL_LVUP_NO_FORGET = true # 升级时不遗忘旧技能
  122.     SKILL_MANUAL_LVUP    = true # 手动升级
  123.     SKILL_RES_EXP_BASE   = 1     # 升级点数基数,数字越大,获得越少
  124.     SKILL_MAN_LVUP_KEY   = :X    # 手动升级的按键设定
  125.  
  126.     SKILL_EXP_VOCAB      = "熟练度"   # 技能熟练度术语
  127.     SKILL_REXP_VOCAB     = "潜能" # 技能提升点数术语
  128.   end
  129. end
  130.  
  131.  
  132. class RPG::Skill < RPG::UsableItem
  133.   include Snstar2006::Skill_LvUp
  134.   #--------------------------------------------------------------------------
  135.   # ● 获取技能最高等级
  136.   #--------------------------------------------------------------------------
  137.   def get_max_skill
  138.     self.note.split(/[\r\n]+/).each{ |line|
  139.       if line =~ /\[(?:max_level) (\d+)\]/
  140.         return $1 ? $1.to_i : 1
  141.       end}
  142.     return 1
  143.   end
  144.   #--------------------------------------------------------------------------
  145.   # ● 获取技能熟练度基数
  146.   #--------------------------------------------------------------------------
  147.   def get_exp_base
  148.     self.note.split(/[\r\n]+/).each{ |line|
  149.       if line =~ /\[(?:exp_base) (\d+)\]/
  150.         return $1 ? $1.to_i : 30
  151.       end}
  152.     return 30
  153.   end
  154.   #--------------------------------------------------------------------------
  155.   # ● 获取技能吸收角色经验值作为熟练度的基础值
  156.   #--------------------------------------------------------------------------
  157.   def get_exp_part
  158.     self.note.split(/[\r\n]+/).each{ |line|
  159.       if line =~ /\[(?:exp_part) (\d+)\]/
  160.         return $1 ? $1.to_i : 0
  161.       end}
  162.     return 0
  163.   end
  164.   #--------------------------------------------------------------------------
  165.   # ● 获取技能使用时获取的熟练度
  166.   #--------------------------------------------------------------------------
  167.   def get_use_exp
  168.     self.note.split(/[\r\n]+/).each{ |line|
  169.       if line =~ /\[(?:use_exp) (\d+)\]/
  170.         return $1 ? $1.to_i : 1
  171.       end}
  172.     return 1
  173.   end
  174.   #-------------------------------------------------------------------------
  175.   # ● 获取技能当前等级
  176.   #-------------------------------------------------------------------------
  177. #~   def get_dqskill
  178. #~     
  179. #~      return $game_actors[1].instance_variable_get(:@skill_level)[127]
  180. #~     end
  181.   #--------------------------------------------------------------------------
  182.   # ● 获取技能升级后变化的技能
  183.   #--------------------------------------------------------------------------
  184.   def get_on_level(level)
  185.     trans_skill_id = 0
  186.     self.note.split(/[\r\n]+/).each{ |line|
  187.       if line =~ /\[(?:on_level) (\d+)\,(\d+)\]/
  188.         trans_skill_id = $2.to_i if level == $1.to_i
  189.       end}
  190.     return trans_skill_id
  191.   end
  192.   #--------------------------------------------------------------------------
  193.   # ● 获取技能升级后变化的技能
  194.   #--------------------------------------------------------------------------
  195.   def get_inherit
  196.     self.note.split(/[\r\n]+/).each{ |line|
  197.       if line =~ /\[(?:inherit) (\d+)\]/
  198.         return $1 ? $1.to_i : 0
  199.       end}
  200.     return 0
  201.   end
  202.   #--------------------------------------------------------------------------
  203.   # ● 判断是否升级后遗忘
  204.   #--------------------------------------------------------------------------
  205.   def no_forget?
  206.     self.note.split(/[\r\n]+/).each{ |line|
  207.       if line =~ /\[(?:no_forget)\]/
  208.         return true
  209.       end}
  210.     return false
  211.   end
  212.   #--------------------------------------------------------------------------
  213.   # ● 获取技能升级后变化的伤害值基数
  214.   #--------------------------------------------------------------------------
  215.   def get_dmg_var
  216.     self.note.split(/[\r\n]+/).each{ |line|
  217.       if line =~ /\[(?:dmg_var) (\d+)\]/
  218.         return $1 ? $1.to_i : 0
  219.       end}
  220.     return 0
  221.   end
  222.   #--------------------------------------------------------------------------
  223.   # ● 判断是否能升级
  224.   #--------------------------------------------------------------------------
  225.   def can_lvup?
  226.     skill_level_initialize # 技能等级初始化
  227.     return @max_level > 1
  228.   end
  229.   #--------------------------------------------------------------------------
  230.   # ● 判断是否获取角色经验当作熟练度
  231.   #--------------------------------------------------------------------------
  232.   def get_exp_from_actor?
  233.     return false unless can_lvup?
  234.     return @get_exp > 0
  235.   end
  236.   #--------------------------------------------------------------------------
  237.   # ● 判断是否手动升级
  238.   #--------------------------------------------------------------------------
  239.   def manual_lvup?
  240.     return false unless can_lvup?  #备注里写的MAX_LV
  241.     return false if transformed  #attr_accessor :transformed #已变化技能
  242.     return true if SKILL_MANUAL_LVUP #SKILL_MANUAL_LVUP    = true # 手动升级
  243.     return false if get_exp_from_actor?  #判断是否获取角色经验当作熟练度
  244.     return false if lvup_by_use? #判断是否在使用时提升熟练度
  245.     return true
  246.   end
  247.   #--------------------------------------------------------------------------
  248.   # ● 判断是否在使用时提升熟练度
  249.   #--------------------------------------------------------------------------
  250.   def lvup_by_use?
  251.     return false unless can_lvup?
  252.     return @use_exp > 0
  253.   end
  254.   #--------------------------------------------------------------------------
  255.   # ● 判断是否继承任何技能设定
  256.   #--------------------------------------------------------------------------
  257.   def inherit?
  258.     @transform_from = get_inherit
  259.     return @transform_from > 0
  260.   end
  261.   #--------------------------------------------------------------------------
  262.   # ● 技能等级参数初始化
  263.   #--------------------------------------------------------------------------
  264.   def skill_level_initialize
  265.     return if @skill_level_initialized # 已初始化时跳过
  266.     @max_level = get_max_skill
  267.     @get_exp = get_exp_part
  268.     @use_exp = get_use_exp
  269.     @skill_level_initialized = true
  270.     initialize_skill_transform
  271.     @transformed = false
  272.     @transform_from = 0
  273.     @dmg_var = get_dmg_var
  274.     @fml_altered = false
  275.     if @dmg_var > 0
  276.       $game_variables[@dmg_var]=1
  277.     end
  278.   end
  279.   #--------------------------------------------------------------------------
  280.   # ● 技能等级参数继承
  281.   #--------------------------------------------------------------------------
  282.   def skill_level_inherit
  283.     return unless inherit? # 已设定继承时跳过
  284.     old_skill = $data_skills[@transform_from]
  285.     @max_level = old_skill.get_max_skill
  286.     @get_exp = old_skill.get_exp_part
  287.     @use_exp = old_skill.get_use_exp
  288.     initialize_skill_transform
  289.   end
  290.   #--------------------------------------------------------------------------
  291.   # ● 获取技能吸取角色经验值的基数
  292.   #--------------------------------------------------------------------------
  293.   def exp_from_actor
  294.     return @get_exp
  295.   end
  296.   #--------------------------------------------------------------------------
  297.   # ● 技能变化资讯初始化
  298.   #--------------------------------------------------------------------------
  299.   def initialize_skill_transform
  300.     @skill_transform = []
  301.     1.upto(@max_level){ |level|
  302.       t_id = get_on_level(level)
  303.       if t_id > 0
  304.         @skill_transform = [level, t_id]
  305.         break
  306.       end
  307.     }
  308.   end
  309.   #--------------------------------------------------------------------------
  310.   # ● 判断技能是否会变化
  311.   #--------------------------------------------------------------------------
  312.   def transform?
  313.     return !@skill_transform.empty?
  314.   end
  315.   #--------------------------------------------------------------------------
  316.   # ● 判断技能是否会在某等级变化
  317.   #--------------------------------------------------------------------------
  318.   def transform_at?(level)
  319.     return false unless transform?
  320.     return @skill_transform[0] == level
  321.   end
  322.   def transform_at
  323.     return @skill_transform[0]
  324.   end
  325.   #--------------------------------------------------------------------------
  326.   # ● 获取技能变化后的技能ID
  327.   #--------------------------------------------------------------------------
  328.   def transform_to(level)
  329.     return 0 unless transform_at?(level)
  330.     return @skill_transform[1]
  331.   end
  332.   #--------------------------------------------------------------------------
  333.   # ● 判断技能是否有指定伤害变量
  334.   #--------------------------------------------------------------------------
  335.   def dmg_var?
  336.     return @dmg_var>0
  337.   end
  338.   #--------------------------------------------------------------------------
  339.   # ● 判断技能是否已修改公式
  340.   #--------------------------------------------------------------------------
  341.   def fml_altered?
  342.     return @fml_altered
  343.   end
  344.   attr_reader :max_level # 获取最高等级
  345.   attr_reader :use_exp   # 使用提升熟练度量
  346.   attr_accessor :transformed # 已变化技能
  347.   attr_accessor :fml_altered # 已修改公式
  348.   attr_reader :dmg_var   # 升级提升伤害的变量ID
  349. end
  350. class Game_Actor < Game_Battler
  351.   include Snstar2006::Skill_LvUp
  352.   #--------------------------------------------------------------------------
  353.   # ● 初始化
  354.   #--------------------------------------------------------------------------
  355.   alias skill_level_initialize initialize
  356.   def initialize(actor_id)
  357.     @skill_level = {}    # 纪录技能等级
  358.     @skill_exp = {}      # 记录技能熟练度
  359.     @skill_exp_base = {} # 记录技能熟练度基数
  360.     @skill_next_exp = {} # 记录技能下一级熟练度
  361.     @skill_dmg_val = {}  # 纪录技能伤害变化的变量ID
  362.     @skill_res_exp = 1000   # 纪录获取的技能升级点数
  363.     skill_level_initialize(actor_id)
  364.  
  365.   end
  366.   #--------------------------------------------------------------------------
  367.   # ● 角色习得技能
  368.   #--------------------------------------------------------------------------
  369.   alias skill_level_learn_skill learn_skill
  370.   def learn_skill(skill_id)
  371.     skill_level_learn_skill(skill_id)
  372.     skill = $data_skills[skill_id]
  373.     if skill.can_lvup? # 判断技能是否可升级
  374.       @skill_level[skill_id] = 1
  375.       @skill_exp[skill_id] = 0
  376.       @skill_exp_base[skill_id] = skill.get_exp_base
  377.       @skill_next_exp[skill_id] = @skill_exp_base[skill_id]
  378.       if skill.dmg_var?
  379.         @skill_dmg_val[skill_id] = skill.dmg_var+@actor_id-1
  380.         alter_damage_formula(skill_id)
  381.       end
  382.     end
  383.   end
  384.   #--------------------------------------------------------------------------
  385.   # ● 修改伤害公式
  386.   #--------------------------------------------------------------------------
  387.   def alter_damage_formula(skill_id)
  388.     skill = $data_skills[skill_id]
  389.     return if skill.fml_altered? # 已修改时返回
  390.     formula = skill.damage.formula # 获取公式
  391.     dmg_var_id = @skill_dmg_val[skill_id]
  392.     skill.damage.formula = "(#{formula})*v[#{dmg_var_id}]"
  393.     skill.fml_altered = true # 标记为已修改
  394.   end
  395.   #--------------------------------------------------------------------------
  396.   # ● 判断技能是否能升级
  397.   #--------------------------------------------------------------------------
  398.   def skill_can_lvup?(skill_id)
  399.     return false unless $data_skills[skill_id].can_lvup? # 技能不可升级
  400.     return false unless @skills.include?(skill_id) # 角色未学习此技能
  401.     return @skill_level[skill_id] < max_skill_level(skill_id) # 技能未达最高等级
  402.   end
  403.   #--------------------------------------------------------------------------
  404.   # ● 获取技能最高等级
  405.   #--------------------------------------------------------------------------
  406.   def max_skill_level(skill_id)
  407.     return $data_skills[skill_id].max_level
  408.   end
  409.   #--------------------------------------------------------------------------
  410.   # ● 获取技能等级
  411.   #--------------------------------------------------------------------------
  412.   def skill_level(skill_id)
  413.     return 1 unless $data_skills[skill_id].can_lvup?
  414.     return @skill_level[skill_id]
  415.  
  416.   end
  417.   #--------------------------------------------------------------------------
  418.   # ● 获取技能下一级熟练度
  419.   #--------------------------------------------------------------------------
  420.   def skill_next_exp(skill_id)
  421.     return 0 unless skill_can_lvup?(skill_id)
  422.     return @skill_next_exp[skill_id]
  423.   end
  424.   #--------------------------------------------------------------------------
  425.   # ● 获取技能当前熟练度
  426.   #--------------------------------------------------------------------------
  427.   def skill_exp(skill_id)
  428.     return 0 unless skill_can_lvup?(skill_id)
  429.     return @skill_exp[skill_id]
  430.   end
  431.   #--------------------------------------------------------------------------
  432.   # ● 角色获得经验值
  433.   #--------------------------------------------------------------------------
  434.   alias skill_level_gain_exp gain_exp
  435.   def gain_exp(exp)
  436.     skill_level_gain_exp(exp)
  437.     gain_skill_res_exp(exp/SKILL_RES_EXP_BASE)
  438.     @skills.each{ |id|
  439.       skill = $data_skills[id]
  440.       if skill.get_exp_from_actor? # 技能是否吸收经验值
  441.           skill_exp = (exp.to_f / skill.exp_from_actor).ceil
  442.           gain_skill_exp(id, skill_exp) # 技能提升熟练度
  443.       end
  444.     }
  445.   end
  446.   #--------------------------------------------------------------------------
  447.   # ● 角色获得技能熟练度
  448.   #--------------------------------------------------------------------------
  449.   def gain_skill_exp(skill_id, val)
  450.     return unless skill_can_lvup?(skill_id)
  451.     skill = $data_skills[skill_id]
  452.     return if skill.transformed
  453.     return if val == 0
  454.     @skill_exp[skill_id] += val
  455.     if @skill_exp[skill_id] >= @skill_next_exp[skill_id]
  456.       skill_lvup(skill_id)
  457.     end
  458.   end
  459.   #--------------------------------------------------------------------------
  460.   # ● 使用技能提升熟练度
  461.   #--------------------------------------------------------------------------
  462.   def gain_skill_exp_by_use(skill)
  463.     @gain_skill_exp = 0
  464.     if skill.is_a?(RPG::Skill) and skill.lvup_by_use?
  465.       @gain_skill_exp = skill.use_exp
  466.     end
  467.   end
  468.   #--------------------------------------------------------------------------
  469.   # ● 角色获得技能提升点数
  470.   #--------------------------------------------------------------------------
  471.   def gain_skill_res_exp(val)
  472.     @skill_res_exp += val
  473.   end
  474.   #--------------------------------------------------------------------------
  475.   # ● 返回角色的技能提升点数
  476.   #--------------------------------------------------------------------------
  477.   def res_exp
  478.     return @skill_res_exp
  479.   end
  480.   #--------------------------------------------------------------------------
  481.   # ● 判断是否能手动升级
  482.   #--------------------------------------------------------------------------
  483.   def can_lv_skill_manually?(skill)
  484.     return false unless skill.manual_lvup?
  485.     return @skill_res_exp > 0
  486.   end
  487.   def has_dmg_var?(skill_id)
  488.     return @skill_dmg_val.keys.include?(skill_id)
  489.   end
  490.   #--------------------------------------------------------------------------
  491.   # ● 手动提升熟练度
  492.   #--------------------------------------------------------------------------
  493.   def gain_skill_exp_manual(skill_id)
  494.     skill = $data_skills[skill_id]
  495.     return unless skill.manual_lvup?
  496.     val = [@skill_next_exp[skill_id], @skill_res_exp].min
  497.     @skill_res_exp -= val
  498.     gain_skill_exp(skill_id, val)
  499.   end
  500.   #--------------------------------------------------------------------------
  501.   # ● 计算使用技能后提升的最终熟练度
  502.   #--------------------------------------------------------------------------
  503.   def gain_skill_final_exp_by_use(skill, hit)
  504.     return if @gain_skill_exp < 1
  505.     @gain_skill_exp /= 2 unless hit # 若是技能落空则熟练度减半
  506.     gain_skill_exp(skill.id, @gain_skill_exp)
  507.     @gain_skill_exp = 0
  508.   end
  509.   #--------------------------------------------------------------------------
  510.   # ● 角色使用技能,技能获得熟练度
  511.   #--------------------------------------------------------------------------
  512.   alias skill_level_use_item use_item
  513.   def use_item(item)
  514.     skill_level_use_item(item)
  515.     gain_skill_exp_by_use(item)
  516.   end
  517.   #--------------------------------------------------------------------------
  518.   # ● 角色技能升级
  519.   #--------------------------------------------------------------------------
  520.   def skill_lvup(skill_id, val=1)
  521.     return unless skill_can_lvup?(skill_id)
  522.     return if $data_skills[skill_id].transformed
  523.     temp_level = @skill_level[skill_id] + val
  524.     max_level = max_skill_level(skill_id)
  525.     @skill_level[skill_id] = [temp_level, max_level].min
  526.     level = @skill_level[skill_id]
  527.     @skill_exp[skill_id] -= @skill_next_exp[skill_id]
  528.     @skill_exp[skill_id] = [@skill_exp[skill_id], 0].max
  529.     @skill_next_exp[skill_id] = @skill_exp_base[skill_id] * factorial(level)
  530.     if has_dmg_var?(skill_id)
  531.       dmg_var_id = @skill_dmg_val[skill_id]
  532.       $game_variables[dmg_var_id] = 1+(level.to_f/max_level)
  533.     end
  534.     process_skill_transform(skill_id, level)
  535.  
  536.         case $game_actors[12].instance_variable_get(:@skill_level)[180] #新增
  537.       when  4
  538.         $game_actors[12].xstat.力量+=10                               #新增
  539.       end
  540.   end
  541.   #--------------------------------------------------------------------------
  542.   # ● 计算技能伤害
  543.   #--------------------------------------------------------------------------
  544.   alias skill_level_make_damage_value make_damage_value
  545.   def make_damage_value(user, item)
  546.     skill_level_make_damage_value(user, item) # 呼叫原有方法
  547.   end
  548.   def process_skill_transform(skill_id, level)
  549.     skill = $data_skills[skill_id]
  550.     return unless skill.transform_at?(level) # 判断技能是否在这个等级变化
  551.     new_skill_id = skill.transform_to(level) # 获取变化后的技能ID
  552.     skill.transformed = true
  553.     learn_skill(new_skill_id) # 学习新技能
  554.  
  555.     # 将旧技能的等级、熟练度、熟练度基数、下一级熟练度转移到新技能下
  556.     $data_skills[new_skill_id].skill_level_inherit # 变化后的技能设定
  557.     @skill_level[new_skill_id] = @skill_level[skill_id]
  558.     @skill_exp[new_skill_id] = @skill_exp[skill_id]
  559.     @skill_exp_base[new_skill_id] = skill.get_exp_base
  560.     @skill_next_exp[new_skill_id] = @skill_next_exp[skill_id]
  561.     @skill_dmg_val[new_skill_id] = @skill_dmg_val[skill_id]
  562.     alter_damage_formula(new_skill_id) # 调整伤害公式
  563.  
  564.     if SKILL_LVUP_NO_FORGET or skill.no_forget? # 若是设定技能升级时不遗忘旧技能
  565.       @skill_exp[new_skill_id] = 0 # 熟练度归零
  566.     else
  567.       forget_skill(skill_id) # 遗忘旧技能
  568.       # 删除旧技能的等级、熟练度、熟练度基数、下一级熟练度
  569.       @skill_level.delete(skill_id)
  570.       @skill_exp.delete(skill_id)
  571.       @skill_exp_base.delete(skill_id)
  572.       @skill_next_exp.delete(skill_id)
  573.       @skill_dmg_val.delete(skill_id)
  574.     end
  575.   end
  576. end
  577. class Game_Battler < Game_BattlerBase
  578.   #--------------------------------------------------------------------------
  579.   # ● 技能使用对象的效果应用
  580.   #--------------------------------------------------------------------------
  581.   alias skill_level_item_apply item_apply
  582.   def item_apply(user, item)
  583.     skill_level_item_apply(user, item) # 呼叫原有方法
  584.     return unless item.is_a?(RPG::Skill) # 不是使用技能时返回
  585.     return unless user.actor?
  586.     user.gain_skill_final_exp_by_use(item, @result.hit?) # 计算最终熟练度
  587.   end
  588. end
  589. class Game_Interpreter
  590.   #--------------------------------------------------------------------------
  591.   # ● 技能等级提升
  592.   #--------------------------------------------------------------------------
  593.   def gain_skill_level(actor_id, skill_id, value=1)
  594.     $game_actors[actor_id].skill_lvup(skill_id, value)
  595.   end
  596.   #--------------------------------------------------------------------------
  597.   # ● 获得技能升级点数
  598.   #--------------------------------------------------------------------------
  599.   def gain_res_exp(actor_id, value=1)
  600.     $game_actors[actor_id].gain_skill_res_exp(value)
  601.   end
  602. end
  603. #--------------------------------------------------------------------------
  604. # ● 计算阶乘(计算技能下一级熟练度使用)
  605. #--------------------------------------------------------------------------
  606. def factorial(val)
  607.   if val <= 1
  608.     return 1
  609.   else
  610.     return factorial(val-2) + factorial(val-1)
  611.   end
  612. end


RUBY 代码复制
  1. class Window_SkillLevel < Window_Base
  2.   include Snstar2006::Skill_LvUp
  3.   attr_reader :skill # 返回当前显示的技能
  4.   #--------------------------------------------------------------------------
  5.   # ● 初始化
  6.   #--------------------------------------------------------------------------
  7.   def initialize(x, y, actor, skill=nil)
  8.     super(x, y, Graphics.width/2, fitting_height(6))
  9.     @actor = actor
  10.     [url=home.php?mod=space&uid=260100]@skill[/url] = skill
  11.   end
  12.   #--------------------------------------------------------------------------
  13.   # ● 设定显示的技能
  14.   #--------------------------------------------------------------------------
  15.   def skill=(skill)
  16.     #return if @skill == skill
  17.     @skill = skill
  18.     refresh
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 设定当前显示的角色
  22.   #--------------------------------------------------------------------------
  23.   def actor=(actor)
  24.     return if @actor == actor
  25.     @actor = actor
  26.     refresh
  27.   end
  28.   #--------------------------------------------------------------------------
  29.   # ● 窗口刷新
  30.   #--------------------------------------------------------------------------
  31.   def refresh
  32.     contents.clear
  33.     return unless @skill
  34.     draw_skill_name(@skill, 0, 0)
  35.     if @skill.can_lvup?
  36.       draw_skill_max_level(@skill, 24, line_height)
  37.       draw_skill_exp(@skill, 24, line_height*2)
  38.       draw_actor_res_exp(24, line_height*3)
  39.       draw_skill_transform(@skill, 24, line_height*4)
  40.     else
  41.       text = "此技能无法升级"
  42.       draw_text(24, line_height, text_width(text), line_height, text)
  43.     end
  44.   end
  45.   #--------------------------------------------------------------------------
  46.   # ● 绘制技能名称
  47.   #--------------------------------------------------------------------------
  48.   def draw_skill_name(skill, x, y, enabled = true)
  49.     return unless skill
  50.     return unless skill.is_a?(RPG::Skill)
  51.     draw_icon(skill.icon_index, x, y, enabled)
  52.     change_color(normal_color, enabled)
  53.     skill_name = skill.name
  54.     skill_name += " (#{@actor.skill_level(skill.id)}级)" if skill.can_lvup?
  55.     text = skill_name
  56.     draw_text(x + 24, y, text_width(text), line_height, text)
  57.   end
  58.   #--------------------------------------------------------------------------
  59.   # ● 绘制技能最高等级
  60.   #--------------------------------------------------------------------------
  61.   def draw_skill_max_level(skill, x, y)
  62.     return unless skill.can_lvup?
  63.     change_color(system_color)
  64.     text = "最高等级"
  65.     draw_text(x, y, text_width(text), line_height, text)
  66.     change_color(normal_color)
  67.     text = "#{skill.max_level} 级"
  68.     draw_text(x+108, y, text_width(text), line_height, text)
  69.   end
  70.   #--------------------------------------------------------------------------
  71.   # ● 绘制技能熟练度
  72.   #--------------------------------------------------------------------------
  73.   def draw_skill_exp(skill, x, y)
  74.     return unless skill.can_lvup?
  75.     return if skill.transformed
  76.     change_color(system_color)
  77.     text = SKILL_EXP_VOCAB
  78.     draw_text(x, y, text_width(text), line_height, text)
  79.     change_color(normal_color)
  80.     color1 = text_color(18)
  81.     color2 = text_color(20)
  82.     current = @actor.skill_exp(skill.id)
  83.     if @actor.skill_can_lvup?(skill.id)
  84.       max = @actor.skill_next_exp(skill.id)
  85.       rate = current.to_f / max
  86.       draw_gauge(x+103, y, 120, rate, color1, color2)
  87.       draw_current_and_max_values(x+76, y, 150, current, max, normal_color, normal_color)
  88.     else
  89.       draw_current_and_max_values(x+76, y, 150, "--", "--", normal_color, normal_color)
  90.     end
  91.   end
  92.   #--------------------------------------------------------------------------
  93.   # ● 绘制技能变化技
  94.   #--------------------------------------------------------------------------
  95.   def draw_skill_transform(skill, x, y)
  96.     return unless skill.transform?
  97.     change_color(system_color)
  98.     level = skill.transform_at
  99.     new_skill = $data_skills[skill.transform_to(level)]
  100.     text = sprintf("升至%s级则习得", level)
  101.     draw_text(x, y, text_width(text), line_height, text)
  102.     change_color(normal_color)
  103.     draw_item_name(new_skill, x+12, y+line_height)
  104.   end
  105.   def draw_actor_res_exp(x, y)
  106.     enabled = @skill.manual_lvup?
  107.     text = SKILL_REXP_VOCAB
  108.     change_color(system_color, enabled)
  109.     draw_text(x, y, text_width(text), line_height, text)
  110.     change_color(normal_color, enabled)
  111.     text = @actor.res_exp
  112.     draw_text(x+108, y, text_width(text), line_height, text)
  113.   end
  114.   #--------------------------------------------------------------------------
  115.   # ● 获得文字宽度
  116.   #--------------------------------------------------------------------------
  117.   def text_width(text)
  118.     return text_size(text).width*1.5
  119.   end
  120. end
  121. class Window_SkillList < Window_Selectable
  122.   include Snstar2006::Skill_LvUp
  123.   attr_reader   :skill_level_window # 返回技能等级窗口
  124.   #--------------------------------------------------------------------------
  125.   # ● 选择技能
  126.   #--------------------------------------------------------------------------
  127.   alias skill_level_select select
  128.   def select(index)
  129.     skill_level_select(index)
  130.     if !$game_party.in_battle
  131.       @skill_level_window.skill = item
  132.       @skill_level_window.refresh
  133.       if index % 2 == 0
  134.         @skill_level_window.x = Graphics.width/2
  135.       else
  136.         @skill_level_window.x = 0
  137.       end
  138.     end
  139.   end
  140.   #--------------------------------------------------------------------------
  141.   # ● 设定技能等级窗口
  142.   #--------------------------------------------------------------------------
  143.   def skill_level_window=(skill_level_window)
  144.     @skill_level_window = skill_level_window
  145.     call_skill_level
  146.   end
  147.   #--------------------------------------------------------------------------
  148.   # ● 呼叫技能窗口更新
  149.   #--------------------------------------------------------------------------
  150.   def call_skill_level
  151.     update_skill_level if active && @skill_level_window
  152.   end
  153.   #--------------------------------------------------------------------------
  154.   # ● 技能窗口更新
  155.   #--------------------------------------------------------------------------
  156.   def update_skill_level
  157.     @skill_level_window.clear
  158.   end
  159.   alias skill_level_deactivate deactivate
  160.   def deactivate
  161.     skill_level_deactivate
  162.     return unless @skill_level_window
  163.     @skill_level_window.hide
  164.   end
  165.   alias skill_level_activate activate
  166.   def activate
  167.     skill_level_activate
  168.     return unless @skill_level_window
  169.     @skill_level_window.show
  170.   end
  171.   #--------------------------------------------------------------------------
  172.   # ● 处理句柄
  173.   #--------------------------------------------------------------------------
  174.   alias skill_level_process_handling process_handling
  175.   def process_handling
  176.     skill_level_process_handling
  177.     return manual_skill_lvup  if Input.trigger?(SKILL_MAN_LVUP_KEY)
  178.   end
  179.   #--------------------------------------------------------------------------
  180.   # ● 执行手动升级
  181.   #--------------------------------------------------------------------------
  182.   def manual_skill_lvup
  183.     #return  unless item
  184.     #if item and item.manual_lvup? && @actor.can_lv_skill_manually?(item)
  185.     if item.manual_lvup? && @actor.can_lv_skill_manually?(item)
  186.       Sound.play_ok
  187.       @actor.gain_skill_exp_manual(item.id)
  188.       refresh
  189.       @skill_level_window.skill = item
  190.    else
  191.  
  192.       Sound.play_buzzer
  193.     end
  194.     Input.update
  195.   end
  196. end
  197. class Scene_Skill < Scene_ItemBase
  198.   #--------------------------------------------------------------------------
  199.   # ● 场景开始
  200.   #--------------------------------------------------------------------------
  201.   alias skill_level_start start
  202.   def start
  203.     skill_level_start
  204.     create_skill_level_window
  205.     @skill_level_window.z = 200
  206.   end
  207.   #--------------------------------------------------------------------------
  208.   # ● 创建技能等级窗口
  209.   #--------------------------------------------------------------------------
  210.   def create_skill_level_window
  211.     y = @help_window.height + 120
  212.     @skill_level_window = Window_SkillLevel.new(Graphics.width/2, y, @actor)
  213.     @item_window.skill_level_window = @skill_level_window
  214.     @skill_level_window.hide
  215.   end
  216. end


  脚本,但是在使用过程中,如果在技能升级界面直接按A手动升级的话,就会报错说(界面第184行发生NoMethoError undefined method maual_lvup? for nil: NilClass)错误,错误脚本是
  1.   def manual_skill_lvup
  2.     if  item.manual_lvup? && @actor.can_lv_skill_manually?(item)
  3.       Sound.play_ok
  4.       @actor.gain_skill_exp_manual(item.id)
  5.       refresh
  6.       @skill_level_window.skill = item
  7.     else
  8.       Sound.play_buzzer
  9.     end
  10.     Input.update
  11.   end
  12. end
复制代码

作者: morningboo    时间: 2015-1-21 10:43
ctrl+alt+shift+F键查查manual_lvup?这个方法的定义,然后看看是否前面脚本有重定义或者类有问题
作者: yunxin0111    时间: 2015-1-21 10:59
morningboo 发表于 2015-1-21 10:43
ctrl+alt+shift+F键查查manual_lvup?这个方法的定义,然后看看是否前面脚本有重定义或者类有问题 ...
  1. #--------------------------------------------------------------------------
  2.   # ● 判断是否手动升级
  3.   #--------------------------------------------------------------------------
  4.   def manual_lvup?
  5.     return false unless can_lvup?  #备注里写的MAX_LV
  6.     return false if transformed  #attr_accessor :transformed #已变化技能
  7.     return true if SKILL_MANUAL_LVUP #SKILL_MANUAL_LVUP    = true # 手动升级
  8.     return false if get_exp_from_actor?  #判断是否获取角色经验当作熟练度
  9.     return false if lvup_by_use? #判断是否在使用时提升熟练度
  10.     return true
  11.   end
复制代码
好像没看到那个乜有初始化的地方。
作者: yunxin0111    时间: 2015-1-21 11:13
有没有办法调用时候直接判断呢,按A 找不到技能,什么都不做就是了。。。
作者: VIPArcher    时间: 2015-1-21 11:31
没看过脚本,也没测试过,初步猜测是itme为空
在def manual_skill_lvup下面加一句
return  unless item
试试?
作者: yunxin0111    时间: 2015-1-21 11:38
本帖最后由 yunxin0111 于 2015-1-21 11:46 编辑
VIPArcher 发表于 2015-1-21 11:31
没看过脚本,也没测试过,初步猜测是itme为空
在def manual_skill_lvup下面加一句
return  unless item


用了版主大大的方法,在技能界面不选技能,直接按A弹错的问题解决了。。,可是如果选了技能 则会显示 NoMethoError undefined method maual_lvup? for #<RPG::0xaba14a4> 之前的问题是 选技能不报错 ,不选技能报错~~现在变成不会技能不报错 选技能报错咯
作者: yunxin0111    时间: 2015-1-21 14:04
@VIPArcher 找到方法咯 可以结贴了 感谢大家的帮助




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