查看: 1916|回复: 6

[已经解决] 关于流星技能升级脚本的BUG

[复制链接]
梦石
0
星屑
50
在线时间
108 小时
注册时间
2013-10-22
回帖
42
发表于 2015-1-21 10:07:35 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 yunxin0111 于 2015-1-21 12:21 编辑

使用了流星大的技能脚本 https://rpg.blue/forum.php?mo ... 2619&highlight=技能升级  
[pre lang="ruby" line="1"]=begin
使用方法:
技能备注里填写 [max_level X]
则某技能最高能够提升到 X 级。
没有填写时默认为 1 ,则不会提升等级。
技能提升时,伤害值提升 当前等级/最高等级 倍
例如:某技能最高等级 10,当前等级 3。
则伤害提升 3/10 = 30%

技能备注里填写 [exp_base X]
则技能升级的熟练度就会变化。没有填写时,默认为30。
熟练度的变化为 X * 技能等级的阶乘(factorial)

技能升级有三种方式:
  1. 事件指令升级
    * 事件调用 gain_skill_level(角色ID, 技能ID[, 升级数])
   
  2. 吸收角色经验值当作熟练度来升级
    * 技能备注里面填写 [exp_part 基础值]
      则角色获得经验值时,技能能够获得 经验值/基础值 的熟练度
      没有填写时,默认为0,则不会吸收经验值
      
      例如:[exp_part 10]
      则角色获得 100 点经验值时,技能获得 100/10=10点熟练度
      
  3. 角色使用技能时,熟练度提升
    * 技能备注里填写 [use_exp X]
      则角色使用技能的时候,可以提升 X 点熟练度。
      使用技能时,若对象超过一个,熟练度也只提升一次。
      使用技能时,若是攻击落空,则熟练度减半。
      若有需要可以填写做 0 ,则使用时不会提升熟练度
      没有填写时,默认为1。
      
      目前跟着技能等级变化的只有伤害值和熟练度
其他会在下一版再加入。

更新日志:
2012-02-11:
  * 修正BUG
     - 修正使用技能而获得熟练度时出错的问题
     - 修正技能介面中,技能等级窗口可能消失的问题

2012-02-12 更新 1.5 版
  * 功能新增:等级提升至 X 级时,变化为另一个技能
     - 技能备注里填写 [on_level X,I]
       则当技能升级到 X 级时,则自动遗忘,并且角色自动学会 I 号技能
     - 技能备注里填写 [inherit Y]
       则其他的设定如最高等级、升级方式、技能熟练度自动继承 Y 号技能
   
  * 功能移除:技能升级时不再增加伤害
  
  * 介面修改:技能等级窗口
     - 窗口下移,随着光标变换位置
     - 移除下一级熟练度
     - 增加技能变化的显示
     - 修改显示/隐藏的呼叫方式,应该能降低冲突造成的问题

2012-02-13 更新 1.5.1 版
  * 介面修改:技能等级窗口
     - 技能无法升级时,显示技能名称和讯息
     - 调整技能熟练度的显示座标

2012-02-14 更新 1.5.2 版
  * 介面修改:技能等级窗口
     - 修正熟练度增加实,经验槽不会填满的问题

2012-02-14 更新 1.5.2 版
  * Bug 修正:技能升级后,熟练度变负数的问题
  * 功能新增:控制技能升级后,是否遗忘原有技能的开关
  * 介面修改:技能等级窗口
    技能升级后,没有遗忘原有技能时,技能熟练度不显示
    调整技能熟练度的显示座标

2012-02-18 更新 2.0 版
  * 功能新增:增加各个技能是否在升级后被遗忘的设定
    技能备注里填写 [no_forget],则升级后不会遗忘
    脚本里可以设定 SKILL_LVUP_NO_FORGET=true 统一不遗忘任何技能
   
  * 功能新增:手动升级技能
    所有无法吸收经验、无法在使用时获得熟练度的技能
    即所有设定为[exp_part 0]、[use_exp 0]的技能
    就是可以手动升级的技能
    也可以在脚本里设定 SKILL_MANUAL_LVUP=true 所有技能全部能手动升级
  
  * 功能新增:角色获得技能升级点数
    技能升级点数无上限,默认获得经验值的一半
    可以在脚本中设定 SKILL_RES_EXP_BASE 来变化
    技能升级点数的名称可以在脚本里修改 SKILL_REXP_VOCAB
    默认名称为 "精元点数"
   
  * 介面修改:技能等级窗口
    调整后置技能的显示座标
    增加技能升级点数
    可以手动升级的技能,升级点数正常显示。
    不能手动升级的技能,升级点数会淡化。
    按 X 键升级技能(可以在脚本里修改 SKILL_MAN_LVUP_KEY 来改变)

2012-03-09 更新 2.1 版
  * 新增功能:增加各个技能升级时,自动赋值的变量,此变量会自动添加进技能的伤害公式之中,增加伤害值
    技能备注里填写 [dmg_var X],则技能升级后,会自动赋值 X+角色ID-1 号变量
    这项设定是为了防止习得同技能的角色同时获得技能升级的效果
    也就是说 X 为 3 ,角色有 5 人时
    那么实际调用的变量如下:
    1号角色 调用 3号变量
    2号角色 调用 4号变量
    ... ... ...
    5号角色 调用 7号变量
    所以在设定时请注意变量ID 的间距
    赋值公式为 1+( 当前等级/最高等级)
   
    例如:技能3号 [dmg_var 3] 最高等级 4
    技能升级为2级之后,伤害提升 1/2 倍
    技能升级为3级之后,伤害提升 3/4 倍
    技能升级为4级之后,伤害提升 1   倍

=end


module Snstar2006
  module Skill_LvUp
    SKILL_LVUP_NO_FORGET = true # 升级时不遗忘旧技能
    SKILL_MANUAL_LVUP    = true # 手动升级
    SKILL_RES_EXP_BASE   = 1     # 升级点数基数,数字越大,获得越少
    SKILL_MAN_LVUP_KEY   = :X    # 手动升级的按键设定
   
    SKILL_EXP_VOCAB      = "熟练度"   # 技能熟练度术语
    SKILL_REXP_VOCAB     = "潜能" # 技能提升点数术语
  end
end


class RPG::Skill < RPG::UsableItem
  include Snstar2006::Skill_LvUp
  #--------------------------------------------------------------------------
  # ● 获取技能最高等级
  #--------------------------------------------------------------------------
  def get_max_skill
    self.note.split(/[\r\n]+/).each{ |line|
      if line =~ /\[(?:max_level) (\d+)\]/
        return $1 ? $1.to_i : 1
      end}
    return 1
  end
  #--------------------------------------------------------------------------
  # ● 获取技能熟练度基数
  #--------------------------------------------------------------------------
  def get_exp_base
    self.note.split(/[\r\n]+/).each{ |line|
      if line =~ /\[(?:exp_base) (\d+)\]/
        return $1 ? $1.to_i : 30
      end}
    return 30
  end
  #--------------------------------------------------------------------------
  # ● 获取技能吸收角色经验值作为熟练度的基础值
  #--------------------------------------------------------------------------
  def get_exp_part
    self.note.split(/[\r\n]+/).each{ |line|
      if line =~ /\[(?:exp_part) (\d+)\]/
        return $1 ? $1.to_i : 0
      end}
    return 0
  end
  #--------------------------------------------------------------------------
  # ● 获取技能使用时获取的熟练度
  #--------------------------------------------------------------------------
  def get_use_exp
    self.note.split(/[\r\n]+/).each{ |line|
      if line =~ /\[(?:use_exp) (\d+)\]/
        return $1 ? $1.to_i : 1
      end}
    return 1
  end
  #-------------------------------------------------------------------------
  # ● 获取技能当前等级
  #-------------------------------------------------------------------------
#~   def get_dqskill
#~     
#~      return $game_actors[1].instance_variable_get(:@skill_level)[127]
#~     end
  #--------------------------------------------------------------------------
  # ● 获取技能升级后变化的技能
  #--------------------------------------------------------------------------
  def get_on_level(level)
    trans_skill_id = 0
    self.note.split(/[\r\n]+/).each{ |line|
      if line =~ /\[(?:on_level) (\d+)\,(\d+)\]/
        trans_skill_id = $2.to_i if level == $1.to_i
      end}
    return trans_skill_id
  end
  #--------------------------------------------------------------------------
  # ● 获取技能升级后变化的技能
  #--------------------------------------------------------------------------
  def get_inherit
    self.note.split(/[\r\n]+/).each{ |line|
      if line =~ /\[(?:inherit) (\d+)\]/
        return $1 ? $1.to_i : 0
      end}
    return 0
  end
  #--------------------------------------------------------------------------
  # ● 判断是否升级后遗忘
  #--------------------------------------------------------------------------
  def no_forget?
    self.note.split(/[\r\n]+/).each{ |line|
      if line =~ /\[(?:no_forget)\]/
        return true
      end}
    return false
  end
  #--------------------------------------------------------------------------
  # ● 获取技能升级后变化的伤害值基数
  #--------------------------------------------------------------------------
  def get_dmg_var
    self.note.split(/[\r\n]+/).each{ |line|
      if line =~ /\[(?:dmg_var) (\d+)\]/
        return $1 ? $1.to_i : 0
      end}
    return 0
  end
  #--------------------------------------------------------------------------
  # ● 判断是否能升级
  #--------------------------------------------------------------------------
  def can_lvup?
    skill_level_initialize # 技能等级初始化
    return @max_level > 1
  end
  #--------------------------------------------------------------------------
  # ● 判断是否获取角色经验当作熟练度
  #--------------------------------------------------------------------------
  def get_exp_from_actor?
    return false unless can_lvup?
    return @get_exp > 0
  end
  #--------------------------------------------------------------------------
  # ● 判断是否手动升级
  #--------------------------------------------------------------------------
  def manual_lvup?
    return false unless can_lvup?  #备注里写的MAX_LV
    return false if transformed  #attr_accessor :transformed #已变化技能
    return true if SKILL_MANUAL_LVUP #SKILL_MANUAL_LVUP    = true # 手动升级
    return false if get_exp_from_actor?  #判断是否获取角色经验当作熟练度
    return false if lvup_by_use? #判断是否在使用时提升熟练度
    return true
  end
  #--------------------------------------------------------------------------
  # ● 判断是否在使用时提升熟练度
  #--------------------------------------------------------------------------
  def lvup_by_use?
    return false unless can_lvup?
    return @use_exp > 0
  end
  #--------------------------------------------------------------------------
  # ● 判断是否继承任何技能设定
  #--------------------------------------------------------------------------
  def inherit?
    @transform_from = get_inherit
    return @transform_from > 0
  end
  #--------------------------------------------------------------------------
  # ● 技能等级参数初始化
  #--------------------------------------------------------------------------
  def skill_level_initialize
    return if @skill_level_initialized # 已初始化时跳过
    @max_level = get_max_skill
    @get_exp = get_exp_part
    @use_exp = get_use_exp
    @skill_level_initialized = true
    initialize_skill_transform
    @transformed = false
    @transform_from = 0
    @dmg_var = get_dmg_var
    @fml_altered = false
    if @dmg_var > 0
      $game_variables[@dmg_var]=1
    end
  end
  #--------------------------------------------------------------------------
  # ● 技能等级参数继承
  #--------------------------------------------------------------------------
  def skill_level_inherit
    return unless inherit? # 已设定继承时跳过
    old_skill = $data_skills[@transform_from]
    @max_level = old_skill.get_max_skill
    @get_exp = old_skill.get_exp_part
    @use_exp = old_skill.get_use_exp
    initialize_skill_transform
  end
  #--------------------------------------------------------------------------
  # ● 获取技能吸取角色经验值的基数
  #--------------------------------------------------------------------------
  def exp_from_actor
    return @get_exp
  end
  #--------------------------------------------------------------------------
  # ● 技能变化资讯初始化
  #--------------------------------------------------------------------------
  def initialize_skill_transform
    @skill_transform = []
    1.upto(@max_level){ |level|
      t_id = get_on_level(level)
      if t_id > 0
        @skill_transform = [level, t_id]
        break
      end
    }
  end
  #--------------------------------------------------------------------------
  # ● 判断技能是否会变化
  #--------------------------------------------------------------------------
  def transform?
    return !@skill_transform.empty?
  end
  #--------------------------------------------------------------------------
  # ● 判断技能是否会在某等级变化
  #--------------------------------------------------------------------------
  def transform_at?(level)
    return false unless transform?
    return @skill_transform[0] == level
  end
  def transform_at
    return @skill_transform[0]
  end
  #--------------------------------------------------------------------------
  # ● 获取技能变化后的技能ID
  #--------------------------------------------------------------------------
  def transform_to(level)
    return 0 unless transform_at?(level)
    return @skill_transform[1]
  end
  #--------------------------------------------------------------------------
  # ● 判断技能是否有指定伤害变量
  #--------------------------------------------------------------------------
  def dmg_var?
    return @dmg_var>0
  end
  #--------------------------------------------------------------------------
  # ● 判断技能是否已修改公式
  #--------------------------------------------------------------------------
  def fml_altered?
    return @fml_altered
  end
  attr_reader :max_level # 获取最高等级
  attr_reader :use_exp   # 使用提升熟练度量
  attr_accessor :transformed # 已变化技能
  attr_accessor :fml_altered # 已修改公式
  attr_reader :dmg_var   # 升级提升伤害的变量ID
end
class Game_Actor < Game_Battler
  include Snstar2006::Skill_LvUp
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  alias skill_level_initialize initialize
  def initialize(actor_id)
    @skill_level = {}    # 纪录技能等级
    @skill_exp = {}      # 记录技能熟练度
    @skill_exp_base = {} # 记录技能熟练度基数
    @skill_next_exp = {} # 记录技能下一级熟练度
    @skill_dmg_val = {}  # 纪录技能伤害变化的变量ID
    @skill_res_exp = 1000   # 纪录获取的技能升级点数
    skill_level_initialize(actor_id)
   
  end
  #--------------------------------------------------------------------------
  # ● 角色习得技能
  #--------------------------------------------------------------------------
  alias skill_level_learn_skill learn_skill
  def learn_skill(skill_id)
    skill_level_learn_skill(skill_id)
    skill = $data_skills[skill_id]
    if skill.can_lvup? # 判断技能是否可升级
      @skill_level[skill_id] = 1
      @skill_exp[skill_id] = 0
      @skill_exp_base[skill_id] = skill.get_exp_base
      @skill_next_exp[skill_id] = @skill_exp_base[skill_id]
      if skill.dmg_var?
        @skill_dmg_val[skill_id] = skill.dmg_var+@actor_id-1
        alter_damage_formula(skill_id)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 修改伤害公式
  #--------------------------------------------------------------------------
  def alter_damage_formula(skill_id)
    skill = $data_skills[skill_id]
    return if skill.fml_altered? # 已修改时返回
    formula = skill.damage.formula # 获取公式
    dmg_var_id = @skill_dmg_val[skill_id]
    skill.damage.formula = "(#{formula})*v[#{dmg_var_id}]"
    skill.fml_altered = true # 标记为已修改
  end
  #--------------------------------------------------------------------------
  # ● 判断技能是否能升级
  #--------------------------------------------------------------------------
  def skill_can_lvup?(skill_id)
    return false unless $data_skills[skill_id].can_lvup? # 技能不可升级
    return false unless @skills.include?(skill_id) # 角色未学习此技能
    return @skill_level[skill_id] < max_skill_level(skill_id) # 技能未达最高等级
  end
  #--------------------------------------------------------------------------
  # ● 获取技能最高等级
  #--------------------------------------------------------------------------
  def max_skill_level(skill_id)
    return $data_skills[skill_id].max_level
  end
  #--------------------------------------------------------------------------
  # ● 获取技能等级
  #--------------------------------------------------------------------------
  def skill_level(skill_id)
    return 1 unless $data_skills[skill_id].can_lvup?
    return @skill_level[skill_id]
   
  end
  #--------------------------------------------------------------------------
  # ● 获取技能下一级熟练度
  #--------------------------------------------------------------------------
  def skill_next_exp(skill_id)
    return 0 unless skill_can_lvup?(skill_id)
    return @skill_next_exp[skill_id]
  end
  #--------------------------------------------------------------------------
  # ● 获取技能当前熟练度
  #--------------------------------------------------------------------------
  def skill_exp(skill_id)
    return 0 unless skill_can_lvup?(skill_id)
    return @skill_exp[skill_id]
  end
  #--------------------------------------------------------------------------
  # ● 角色获得经验值
  #--------------------------------------------------------------------------
  alias skill_level_gain_exp gain_exp
  def gain_exp(exp)
    skill_level_gain_exp(exp)
    gain_skill_res_exp(exp/SKILL_RES_EXP_BASE)
    @skills.each{ |id|
      skill = $data_skills[id]
      if skill.get_exp_from_actor? # 技能是否吸收经验值
          skill_exp = (exp.to_f / skill.exp_from_actor).ceil
          gain_skill_exp(id, skill_exp) # 技能提升熟练度
      end
    }
  end
  #--------------------------------------------------------------------------
  # ● 角色获得技能熟练度
  #--------------------------------------------------------------------------
  def gain_skill_exp(skill_id, val)
    return unless skill_can_lvup?(skill_id)
    skill = $data_skills[skill_id]
    return if skill.transformed
    return if val == 0
    @skill_exp[skill_id] += val
    if @skill_exp[skill_id] >= @skill_next_exp[skill_id]
      skill_lvup(skill_id)
    end
  end
  #--------------------------------------------------------------------------
  # ● 使用技能提升熟练度
  #--------------------------------------------------------------------------
  def gain_skill_exp_by_use(skill)
    @gain_skill_exp = 0
    if skill.is_a?(RPG::Skill) and skill.lvup_by_use?
      @gain_skill_exp = skill.use_exp
    end
  end
  #--------------------------------------------------------------------------
  # ● 角色获得技能提升点数
  #--------------------------------------------------------------------------
  def gain_skill_res_exp(val)
    @skill_res_exp += val
  end
  #--------------------------------------------------------------------------
  # ● 返回角色的技能提升点数
  #--------------------------------------------------------------------------
  def res_exp
    return @skill_res_exp
  end
  #--------------------------------------------------------------------------
  # ● 判断是否能手动升级
  #--------------------------------------------------------------------------
  def can_lv_skill_manually?(skill)
    return false unless skill.manual_lvup?
    return @skill_res_exp > 0
  end
  def has_dmg_var?(skill_id)
    return @skill_dmg_val.keys.include?(skill_id)
  end
  #--------------------------------------------------------------------------
  # ● 手动提升熟练度
  #--------------------------------------------------------------------------
  def gain_skill_exp_manual(skill_id)
    skill = $data_skills[skill_id]
    return unless skill.manual_lvup?
    val = [@skill_next_exp[skill_id], @skill_res_exp].min
    @skill_res_exp -= val
    gain_skill_exp(skill_id, val)
  end
  #--------------------------------------------------------------------------
  # ● 计算使用技能后提升的最终熟练度
  #--------------------------------------------------------------------------
  def gain_skill_final_exp_by_use(skill, hit)
    return if @gain_skill_exp < 1
    @gain_skill_exp /= 2 unless hit # 若是技能落空则熟练度减半
    gain_skill_exp(skill.id, @gain_skill_exp)
    @gain_skill_exp = 0
  end
  #--------------------------------------------------------------------------
  # ● 角色使用技能,技能获得熟练度
  #--------------------------------------------------------------------------
  alias skill_level_use_item use_item
  def use_item(item)
    skill_level_use_item(item)
    gain_skill_exp_by_use(item)
  end
  #--------------------------------------------------------------------------
  # ● 角色技能升级
  #--------------------------------------------------------------------------
  def skill_lvup(skill_id, val=1)
    return unless skill_can_lvup?(skill_id)
    return if $data_skills[skill_id].transformed
    temp_level = @skill_level[skill_id] + val
    max_level = max_skill_level(skill_id)
    @skill_level[skill_id] = [temp_level, max_level].min
    level = @skill_level[skill_id]
    @skill_exp[skill_id] -= @skill_next_exp[skill_id]
    @skill_exp[skill_id] = [@skill_exp[skill_id], 0].max
    @skill_next_exp[skill_id] = @skill_exp_base[skill_id] * factorial(level)
    if has_dmg_var?(skill_id)
      dmg_var_id = @skill_dmg_val[skill_id]
      $game_variables[dmg_var_id] = 1+(level.to_f/max_level)
    end
    process_skill_transform(skill_id, level)
   
        case $game_actors[12].instance_variable_get(:@skill_level)[180] #新增
      when  4
        $game_actors[12].xstat.力量+=10                               #新增
      end
  end
  #--------------------------------------------------------------------------
  # ● 计算技能伤害
  #--------------------------------------------------------------------------
  alias skill_level_make_damage_value make_damage_value
  def make_damage_value(user, item)
    skill_level_make_damage_value(user, item) # 呼叫原有方法
  end
  def process_skill_transform(skill_id, level)
    skill = $data_skills[skill_id]
    return unless skill.transform_at?(level) # 判断技能是否在这个等级变化
    new_skill_id = skill.transform_to(level) # 获取变化后的技能ID
    skill.transformed = true
    learn_skill(new_skill_id) # 学习新技能
   
    # 将旧技能的等级、熟练度、熟练度基数、下一级熟练度转移到新技能下
    $data_skills[new_skill_id].skill_level_inherit # 变化后的技能设定
    @skill_level[new_skill_id] = @skill_level[skill_id]
    @skill_exp[new_skill_id] = @skill_exp[skill_id]
    @skill_exp_base[new_skill_id] = skill.get_exp_base
    @skill_next_exp[new_skill_id] = @skill_next_exp[skill_id]
    @skill_dmg_val[new_skill_id] = @skill_dmg_val[skill_id]
    alter_damage_formula(new_skill_id) # 调整伤害公式
   
    if SKILL_LVUP_NO_FORGET or skill.no_forget? # 若是设定技能升级时不遗忘旧技能
      @skill_exp[new_skill_id] = 0 # 熟练度归零
    else
      forget_skill(skill_id) # 遗忘旧技能
      # 删除旧技能的等级、熟练度、熟练度基数、下一级熟练度
      @skill_level.delete(skill_id)
      @skill_exp.delete(skill_id)
      @skill_exp_base.delete(skill_id)
      @skill_next_exp.delete(skill_id)
      @skill_dmg_val.delete(skill_id)
    end
  end
end
class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● 技能使用对象的效果应用
  #--------------------------------------------------------------------------
  alias skill_level_item_apply item_apply
  def item_apply(user, item)
    skill_level_item_apply(user, item) # 呼叫原有方法
    return unless item.is_a?(RPG::Skill) # 不是使用技能时返回
    return unless user.actor?
    user.gain_skill_final_exp_by_use(item, @result.hit?) # 计算最终熟练度
  end
end
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● 技能等级提升
  #--------------------------------------------------------------------------
  def gain_skill_level(actor_id, skill_id, value=1)
    $game_actors[actor_id].skill_lvup(skill_id, value)
  end
  #--------------------------------------------------------------------------
  # ● 获得技能升级点数
  #--------------------------------------------------------------------------
  def gain_res_exp(actor_id, value=1)
    $game_actors[actor_id].gain_skill_res_exp(value)
  end
end
#--------------------------------------------------------------------------
# ● 计算阶乘(计算技能下一级熟练度使用)
#--------------------------------------------------------------------------
def factorial(val)
  if val <= 1
    return 1
  else
    return factorial(val-2) + factorial(val-1)
  end
end[/pre]

[pre lang="ruby" line="1"]class Window_SkillLevel < Window_Base
  include Snstar2006::Skill_LvUp
  attr_reader :skill # 返回当前显示的技能
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  def initialize(x, y, actor, skill=nil)
    super(x, y, Graphics.width/2, fitting_height(6))
    @actor = actor
    @skill = skill
  end
  #--------------------------------------------------------------------------
  # ● 设定显示的技能
  #--------------------------------------------------------------------------
  def skill=(skill)
    #return if @skill == skill
    @skill = skill
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 设定当前显示的角色
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 窗口刷新
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    return unless @skill
    draw_skill_name(@skill, 0, 0)
    if @skill.can_lvup?
      draw_skill_max_level(@skill, 24, line_height)
      draw_skill_exp(@skill, 24, line_height*2)
      draw_actor_res_exp(24, line_height*3)
      draw_skill_transform(@skill, 24, line_height*4)
    else
      text = "此技能无法升级"
      draw_text(24, line_height, text_width(text), line_height, text)
    end
  end
  #--------------------------------------------------------------------------
  # ● 绘制技能名称
  #--------------------------------------------------------------------------
  def draw_skill_name(skill, x, y, enabled = true)
    return unless skill
    return unless skill.is_a?(RPG::Skill)
    draw_icon(skill.icon_index, x, y, enabled)
    change_color(normal_color, enabled)
    skill_name = skill.name
    skill_name += " (#{@actor.skill_level(skill.id)}级)" if skill.can_lvup?
    text = skill_name
    draw_text(x + 24, y, text_width(text), line_height, text)
  end
  #--------------------------------------------------------------------------
  # ● 绘制技能最高等级
  #--------------------------------------------------------------------------
  def draw_skill_max_level(skill, x, y)
    return unless skill.can_lvup?
    change_color(system_color)
    text = "最高等级"
    draw_text(x, y, text_width(text), line_height, text)
    change_color(normal_color)
    text = "#{skill.max_level} 级"
    draw_text(x+108, y, text_width(text), line_height, text)
  end
  #--------------------------------------------------------------------------
  # ● 绘制技能熟练度
  #--------------------------------------------------------------------------
  def draw_skill_exp(skill, x, y)
    return unless skill.can_lvup?
    return if skill.transformed
    change_color(system_color)
    text = SKILL_EXP_VOCAB
    draw_text(x, y, text_width(text), line_height, text)
    change_color(normal_color)
    color1 = text_color(18)
    color2 = text_color(20)
    current = @actor.skill_exp(skill.id)
    if @actor.skill_can_lvup?(skill.id)
      max = @actor.skill_next_exp(skill.id)
      rate = current.to_f / max
      draw_gauge(x+103, y, 120, rate, color1, color2)
      draw_current_and_max_values(x+76, y, 150, current, max, normal_color, normal_color)
    else
      draw_current_and_max_values(x+76, y, 150, "--", "--", normal_color, normal_color)
    end
  end
  #--------------------------------------------------------------------------
  # ● 绘制技能变化技
  #--------------------------------------------------------------------------
  def draw_skill_transform(skill, x, y)
    return unless skill.transform?
    change_color(system_color)
    level = skill.transform_at
    new_skill = $data_skills[skill.transform_to(level)]
    text = sprintf("升至%s级则习得", level)
    draw_text(x, y, text_width(text), line_height, text)
    change_color(normal_color)
    draw_item_name(new_skill, x+12, y+line_height)
  end
  def draw_actor_res_exp(x, y)
    enabled = @skill.manual_lvup?
    text = SKILL_REXP_VOCAB
    change_color(system_color, enabled)
    draw_text(x, y, text_width(text), line_height, text)
    change_color(normal_color, enabled)
    text = @actor.res_exp
    draw_text(x+108, y, text_width(text), line_height, text)
  end
  #--------------------------------------------------------------------------
  # ● 获得文字宽度
  #--------------------------------------------------------------------------
  def text_width(text)
    return text_size(text).width*1.5
  end
end
class Window_SkillList < Window_Selectable
  include Snstar2006::Skill_LvUp
  attr_reader   :skill_level_window # 返回技能等级窗口
  #--------------------------------------------------------------------------
  # ● 选择技能
  #--------------------------------------------------------------------------
  alias skill_level_select select
  def select(index)
    skill_level_select(index)
    if !$game_party.in_battle
      @skill_level_window.skill = item
      @skill_level_window.refresh
      if index % 2 == 0
        @skill_level_window.x = Graphics.width/2
      else
        @skill_level_window.x = 0
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 设定技能等级窗口
  #--------------------------------------------------------------------------
  def skill_level_window=(skill_level_window)
    @skill_level_window = skill_level_window
    call_skill_level
  end
  #--------------------------------------------------------------------------
  # ● 呼叫技能窗口更新
  #--------------------------------------------------------------------------
  def call_skill_level
    update_skill_level if active && @skill_level_window
  end
  #--------------------------------------------------------------------------
  # ● 技能窗口更新
  #--------------------------------------------------------------------------
  def update_skill_level
    @skill_level_window.clear
  end
  alias skill_level_deactivate deactivate
  def deactivate
    skill_level_deactivate
    return unless @skill_level_window
    @skill_level_window.hide
  end
  alias skill_level_activate activate
  def activate
    skill_level_activate
    return unless @skill_level_window
    @skill_level_window.show
  end
  #--------------------------------------------------------------------------
  # ● 处理句柄
  #--------------------------------------------------------------------------
  alias skill_level_process_handling process_handling
  def process_handling
    skill_level_process_handling
    return manual_skill_lvup  if Input.trigger?(SKILL_MAN_LVUP_KEY)
  end
  #--------------------------------------------------------------------------
  # ● 执行手动升级
  #--------------------------------------------------------------------------
  def manual_skill_lvup
    #return  unless item
    #if item and item.manual_lvup? && @actor.can_lv_skill_manually?(item)
    if item.manual_lvup? && @actor.can_lv_skill_manually?(item)
      Sound.play_ok
      @actor.gain_skill_exp_manual(item.id)
      refresh
      @skill_level_window.skill = item
   else
     
      Sound.play_buzzer
    end
    Input.update
  end
end
class Scene_Skill < Scene_ItemBase
  #--------------------------------------------------------------------------
  # ● 场景开始
  #--------------------------------------------------------------------------
  alias skill_level_start start
  def start
    skill_level_start
    create_skill_level_window
    @skill_level_window.z = 200
  end
  #--------------------------------------------------------------------------
  # ● 创建技能等级窗口
  #--------------------------------------------------------------------------
  def create_skill_level_window
    y = @help_window.height + 120
    @skill_level_window = Window_SkillLevel.new(Graphics.width/2, y, @actor)
    @item_window.skill_level_window = @skill_level_window
    @skill_level_window.hide
  end
end[/pre]

  脚本,但是在使用过程中,如果在技能升级界面直接按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
复制代码
梦石
0
星屑
115
在线时间
121 小时
注册时间
2009-7-17
回帖
113
发表于 2015-1-21 10:43:29 | 显示全部楼层
ctrl+alt+shift+F键查查manual_lvup?这个方法的定义,然后看看是否前面脚本有重定义或者类有问题
回复

使用道具 举报

梦石
0
星屑
50
在线时间
108 小时
注册时间
2013-10-22
回帖
42
 楼主| 发表于 2015-1-21 10:59:58 | 显示全部楼层
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
复制代码
好像没看到那个乜有初始化的地方。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
108 小时
注册时间
2013-10-22
回帖
42
 楼主| 发表于 2015-1-21 11:13:48 | 显示全部楼层
有没有办法调用时候直接判断呢,按A 找不到技能,什么都不做就是了。。。
回复

使用道具 举报

无限の剣制

梦石
0
星屑
10450
在线时间
5019 小时
注册时间
2013-2-28
回帖
4942

开拓者贵宾

发表于 2015-1-21 11:31:10 | 显示全部楼层
没看过脚本,也没测试过,初步猜测是itme为空
在def manual_skill_lvup下面加一句
return  unless item
试试?

评分

参与人数 1梦石 +1 收起 理由
taroxd + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
50
在线时间
108 小时
注册时间
2013-10-22
回帖
42
 楼主| 发表于 2015-1-21 11:38:42 | 显示全部楼层
本帖最后由 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> 之前的问题是 选技能不报错 ,不选技能报错~~现在变成不会技能不报错 选技能报错咯

点评

那就不知道发生了什么了,检查一下这个脚本的item 方法? [s]我也没环境帮你测试•﹏•[s]  发表于 2015-1-21 11:50
回复

使用道具 举报

梦石
0
星屑
50
在线时间
108 小时
注册时间
2013-10-22
回帖
42
 楼主| 发表于 2015-1-21 14:04:21 | 显示全部楼层
@VIPArcher 找到方法咯 可以结贴了 感谢大家的帮助
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部