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

Project1

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

[已经解决] 关于技能升级的一些问题

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
197 小时
注册时间
2016-1-22
帖子
55
跳转到指定楼层
1
发表于 2016-2-4 07:36:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 VIPArcher 于 2016-2-4 12:24 编辑

RUBY 代码复制
  1. #~ 使用方法:
  2. #~ 技能备注里填写 [max_level X]
  3. #~ 则某技能最高能够提升到 X 级。
  4. #~ 没有填写时默认为 1 ,则不会提升等级。
  5. #~ 技能提升时,伤害值提升 当前等级/最高等级 倍
  6. #~ 例如:某技能最高等级 10,当前等级 3。
  7. #~ 则伤害提升 3/10 = 30%
  8.  
  9. #~ 技能备注里填写 [exp_base X]
  10. #~ 则技能升级的熟练度就会变化。没有填写时,默认为30。
  11. #~ 熟练度的变化为 X * 技能等级的阶乘(factorial)
  12.  
  13. #~ 技能升级有三种方式:
  14. #~   1. 事件指令升级
  15. #~     * 事件调用 gain_skill_level(角色ID, 技能ID[, 升级数])
  16. #~     
  17. #~   2. 吸收角色经验值当作熟练度来升级
  18. #~     * 技能备注里面填写 [exp_part 基础值]
  19. #~       则角色获得经验值时,技能能够获得 经验值/基础值 的熟练度
  20. #~       没有填写时,默认为0,则不会吸收经验值
  21. #~      
  22. #~       例如:[exp_part 10]
  23. #~       则角色获得 100 点经验值时,技能获得 100/10=10点熟练度
  24. #~      
  25. #~   3. 角色使用技能时,熟练度提升
  26. #~     * 技能备注里填写 [use_exp X]
  27. #~       则角色使用技能的时候,可以提升 X 点熟练度。
  28. #~       使用技能时,若对象超过一个,熟练度也只提升一次。
  29. #~       使用技能时,若是攻击落空,则熟练度减半。
  30. #~       若有需要可以填写做 0 ,则使用时不会提升熟练度
  31. #~       没有填写时,默认为1。
  32.  
  33. #~ 目前跟着技能等级变化的只有伤害值和熟练度
  34. #~ 其他会在下一版再加入。
  35.  
  36. #~ 更新日志:
  37. #~ 2012-02-11:
  38. #~   * 修正BUG
  39. #~      - 修正使用技能而获得熟练度时出错的问题
  40. #~      - 修正技能介面中,技能等级窗口可能消失的问题
  41.  
  42. #~ 2012-02-12 更新 1.5 版
  43. #~   * 功能新增:等级提升至 X 级时,变化为另一个技能
  44. #~      - 技能备注里填写 [on_level X,I]
  45. #~        则当技能升级到 X 级时,则自动遗忘,并且角色自动学会 I 号技能
  46. #~      - 技能备注里填写 [inherit Y]
  47. #~        则其他的设定如最高等级、升级方式、技能熟练度自动继承 Y 号技能
  48. #~     
  49. #~   * 功能移除:技能升级时不再增加伤害
  50. #~   
  51. #~   * 介面修改:技能等级窗口
  52. #~      - 窗口下移,随着光标变换位置
  53. #~      - 移除下一级熟练度
  54. #~      - 增加技能变化的显示
  55. #~      - 修改显示/隐藏的呼叫方式,应该能降低冲突造成的问题
  56.  
  57. #~ 2012-02-13 更新 1.5.1 版
  58. #~   * 介面修改:技能等级窗口
  59. #~      - 技能无法升级时,显示技能名称和讯息
  60. #~      - 调整技能熟练度的显示座标
  61.  
  62. #~ 2012-02-14 更新 1.5.2 版
  63. #~   * 介面修改:技能等级窗口
  64. #~      - 修正熟练度增加实,经验槽不会填满的问题
  65.  
  66. #~ 2012-02-14 更新 1.5.2 版
  67. #~   * Bug 修正:技能升级后,熟练度变负数的问题
  68. #~   * 功能新增:控制技能升级后,是否遗忘原有技能的开关
  69. #~   * 介面修改:技能等级窗口
  70. #~     技能升级后,没有遗忘原有技能时,技能熟练度不显示
  71. #~     调整技能熟练度的显示座标
  72.  
  73. #~ 2012-02-18 更新 2.0 版
  74. #~   * 功能新增:增加各个技能是否在升级后被遗忘的设定
  75. #~     技能备注里填写 [no_forget],则升级后不会遗忘
  76. #~     脚本里可以设定 SKILL_LVUP_NO_FORGET=true 统一不遗忘任何技能
  77. #~     
  78. #~   * 功能新增:手动升级技能
  79. #~     所有无法吸收经验、无法在使用时获得熟练度的技能
  80. #~     即所有设定为[exp_part 0]、[use_exp 0]的技能
  81. #~     就是可以手动升级的技能
  82. #~     也可以在脚本里设定 SKILL_MANUAL_LVUP=true 所有技能全部能手动升级
  83. #~   
  84. #~   * 功能新增:角色获得技能升级点数
  85. #~     技能升级点数无上限,默认获得经验值的一半
  86. #~     可以在脚本中设定 SKILL_RES_EXP_BASE 来变化
  87. #~     技能升级点数的名称可以在脚本里修改 SKILL_REXP_VOCAB
  88. #~     默认名称为 "精元点数"
  89. #~     
  90. #~   * 介面修改:技能等级窗口
  91. #~     调整后置技能的显示座标
  92. #~     增加技能升级点数
  93. #~     可以手动升级的技能,升级点数正常显示。
  94. #~     不能手动升级的技能,升级点数会淡化。
  95. #~     按 X 键升级技能(可以在脚本里修改 SKILL_MAN_LVUP_KEY 来改变)
  96.  
  97. #~ 2012-03-09 更新 2.1 版
  98. #~   * 新增功能:增加各个技能升级时,自动赋值的变量,此变量会自动添加进技能的伤害公式之中,增加伤害值
  99. #~     技能备注里填写 [dmg_var X],则技能升级后,会自动赋值 X+角色ID-1 号变量
  100. #~     这项设定是为了防止习得同技能的角色同时获得技能升级的效果
  101. #~     也就是说 X 为 3 ,角色有 5 人时
  102. #~     那么实际调用的变量如下:
  103. #~     1号角色 调用 3号变量
  104. #~     2号角色 调用 4号变量
  105. #~     ... ... ...
  106. #~     5号角色 调用 7号变量
  107. #~     所以在设定时请注意变量ID 的间距
  108. #~     赋值公式为 1+( 当前等级/最高等级)
  109. #~     
  110. #~     例如:技能3号 [dmg_var 3] 最高等级 4
  111. #~     技能升级为2级之后,伤害提升 1/2 倍
  112. #~     技能升级为3级之后,伤害提升 3/4 倍
  113. #~     技能升级为4级之后,伤害提升 1   倍
  114.  
  115. #--------------------------------------------------------------------------
  116. module Snstar2006
  117.   module Skill_LvUp
  118.     SKILL_LVUP_NO_FORGET = true # 升级时不遗忘旧技能
  119.     SKILL_MANUAL_LVUP    = false # 手动升级
  120.     SKILL_RES_EXP_BASE   = 2     # 升级点数基数,数字越大,获得越少
  121.     SKILL_MAN_LVUP_KEY   = :X    # 手动升级的按键设定
  122.  
  123.     SKILL_EXP_VOCAB      = "熟练度"   # 技能熟练度术语
  124.     SKILL_REXP_VOCAB     = "精元点数" # 技能提升点数术语
  125.   end
  126. end
  127.  
  128.  
  129. class RPG::Skill < RPG::UsableItem
  130.   include Snstar2006::Skill_LvUp
  131.   #--------------------------------------------------------------------------
  132.   # ● 获取技能最高等级
  133.   #--------------------------------------------------------------------------
  134.   def get_max_skill
  135.     self.note.split(/[\r\n]+/).each{ |line|
  136.       if line =~ /\[(?:max_level) (\d+)\]/
  137.         return $1 ? $1.to_i : 1
  138.       end}
  139.     return 1
  140.   end
  141.   #--------------------------------------------------------------------------
  142.   # ● 获取技能熟练度基数
  143.   #--------------------------------------------------------------------------
  144.   def get_exp_base
  145.     self.note.split(/[\r\n]+/).each{ |line|
  146.       if line =~ /\[(?:exp_base) (\d+)\]/
  147.         return $1 ? $1.to_i : 30
  148.       end}
  149.     return 30
  150.   end
  151.   #--------------------------------------------------------------------------
  152.   # ● 获取技能吸收角色经验值作为熟练度的基础值
  153.   #--------------------------------------------------------------------------
  154.   def get_exp_part
  155.     self.note.split(/[\r\n]+/).each{ |line|
  156.       if line =~ /\[(?:exp_part) (\d+)\]/
  157.         return $1 ? $1.to_i : 0
  158.       end}
  159.     return 0
  160.   end
  161.   #--------------------------------------------------------------------------
  162.   # ● 获取技能使用时获取的熟练度
  163.   #--------------------------------------------------------------------------
  164.   def get_use_exp
  165.     self.note.split(/[\r\n]+/).each{ |line|
  166.       if line =~ /\[(?:use_exp) (\d+)\]/
  167.         return $1 ? $1.to_i : 1
  168.       end}
  169.     return 1
  170.   end
  171.   #--------------------------------------------------------------------------
  172.   # ● 获取技能升级后变化的技能
  173.   #--------------------------------------------------------------------------
  174.   def get_on_level(level)
  175.     trans_skill_id = 0
  176.     self.note.split(/[\r\n]+/).each{ |line|
  177.       if line =~ /\[(?:on_level) (\d+)\,(\d+)\]/
  178.         trans_skill_id = $2.to_i if level == $1.to_i
  179.       end}
  180.     return trans_skill_id
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   # ● 获取技能升级后变化的技能
  184.   #--------------------------------------------------------------------------
  185.   def get_inherit
  186.     self.note.split(/[\r\n]+/).each{ |line|
  187.       if line =~ /\[(?:inherit) (\d+)\]/
  188.         return $1 ? $1.to_i : 0
  189.       end}
  190.     return 0
  191.   end
  192.   #--------------------------------------------------------------------------
  193.   # ● 判断是否升级后遗忘
  194.   #--------------------------------------------------------------------------
  195.   def no_forget?
  196.     self.note.split(/[\r\n]+/).each{ |line|
  197.       if line =~ /\[(?:no_forget)\]/
  198.         return true
  199.       end}
  200.     return false
  201.   end
  202.   #--------------------------------------------------------------------------
  203.   # ● 获取技能升级后变化的伤害值基数
  204.   #--------------------------------------------------------------------------
  205.   def get_dmg_var
  206.     self.note.split(/[\r\n]+/).each{ |line|
  207.       if line =~ /\[(?:dmg_var) (\d+)\]/
  208.         return $1 ? $1.to_i : 0
  209.       end}
  210.     return 0
  211.   end
  212.   #--------------------------------------------------------------------------
  213.   # ● 判断是否能升级
  214.   #--------------------------------------------------------------------------
  215.   def can_lvup?
  216.     skill_level_initialize # 技能等级初始化
  217.     return @max_level > 1
  218.   end
  219.   #--------------------------------------------------------------------------
  220.   # ● 判断是否获取角色经验当作熟练度
  221.   #--------------------------------------------------------------------------
  222.   def get_exp_from_actor?
  223.     return false unless can_lvup?
  224.     return @get_exp > 0
  225.   end
  226.   #--------------------------------------------------------------------------
  227.   # ● 判断是否手动升级
  228.   #--------------------------------------------------------------------------
  229.   def manual_lvup?
  230.     return false unless can_lvup?
  231.     return false if transformed
  232.     return true if SKILL_MANUAL_LVUP
  233.     return false if get_exp_from_actor?
  234.     return false if lvup_by_use?
  235.     return true
  236.   end
  237.   #--------------------------------------------------------------------------
  238.   # ● 判断是否在使用时提升熟练度
  239.   #--------------------------------------------------------------------------
  240.   def lvup_by_use?
  241.     return false unless can_lvup?
  242.     return @use_exp > 0
  243.   end
  244.   #--------------------------------------------------------------------------
  245.   # ● 判断是否继承任何技能设定
  246.   #--------------------------------------------------------------------------
  247.   def inherit?
  248.     @transform_from = get_inherit
  249.     return @transform_from > 0
  250.   end
  251.   #--------------------------------------------------------------------------
  252.   # ● 技能等级参数初始化
  253.   #--------------------------------------------------------------------------
  254.   def skill_level_initialize
  255.     return if @skill_level_initialized # 已初始化时跳过
  256.     @max_level = get_max_skill
  257.     @get_exp = get_exp_part
  258.     @use_exp = get_use_exp
  259.     @skill_level_initialized = true
  260.     initialize_skill_transform
  261.     @transformed = false
  262.     @transform_from = 0
  263.     @dmg_var = get_dmg_var
  264.     @fml_altered = false
  265.     if @dmg_var > 0
  266.       $game_variables[@dmg_var]=1
  267.     end
  268.   end
  269.   #--------------------------------------------------------------------------
  270.   # ● 技能等级参数继承
  271.   #--------------------------------------------------------------------------
  272.   def skill_level_inherit
  273.     return unless inherit? # 已设定继承时跳过
  274.     old_skill = $data_skills[@transform_from]
  275.     @max_level = old_skill.get_max_skill
  276.     @get_exp = old_skill.get_exp_part
  277.     @use_exp = old_skill.get_use_exp
  278.     initialize_skill_transform
  279.   end
  280.   #--------------------------------------------------------------------------
  281.   # ● 获取技能吸取角色经验值的基数
  282.   #--------------------------------------------------------------------------
  283.   def exp_from_actor
  284.     return @get_exp
  285.   end
  286.   #--------------------------------------------------------------------------
  287.   # ● 技能变化资讯初始化
  288.   #--------------------------------------------------------------------------
  289.   def initialize_skill_transform
  290.     @skill_transform = []
  291.     1.upto(@max_level){ |level|
  292.       t_id = get_on_level(level)
  293.       if t_id > 0
  294.         @skill_transform = [level, t_id]
  295.         break
  296.       end
  297.     }
  298.   end
  299.   #--------------------------------------------------------------------------
  300.   # ● 判断技能是否会变化
  301.   #--------------------------------------------------------------------------
  302.   def transform?
  303.     return !@skill_transform.empty?
  304.   end
  305.   #--------------------------------------------------------------------------
  306.   # ● 判断技能是否会在某等级变化
  307.   #--------------------------------------------------------------------------
  308.   def transform_at?(level)
  309.     return false unless transform?
  310.     return @skill_transform[0] == level
  311.   end
  312.   def transform_at
  313.     return @skill_transform[0]
  314.   end
  315.   #--------------------------------------------------------------------------
  316.   # ● 获取技能变化后的技能ID
  317.   #--------------------------------------------------------------------------
  318.   def transform_to(level)
  319.     return 0 unless transform_at?(level)
  320.     return @skill_transform[1]
  321.   end
  322.   #--------------------------------------------------------------------------
  323.   # ● 判断技能是否有指定伤害变量
  324.   #--------------------------------------------------------------------------
  325.   def dmg_var?
  326.     return @dmg_var>0
  327.   end
  328.   #--------------------------------------------------------------------------
  329.   # ● 判断技能是否已修改公式
  330.   #--------------------------------------------------------------------------
  331.   def fml_altered?
  332.     return @fml_altered
  333.   end
  334.   attr_reader :max_level # 获取最高等级
  335.   attr_reader :use_exp   # 使用提升熟练度量
  336.   attr_accessor :transformed # 已变化技能
  337.   attr_accessor :fml_altered # 已修改公式
  338.   attr_reader :dmg_var   # 升级提升伤害的变量ID
  339. end
  340. class Game_Actor < Game_Battler
  341.   include Snstar2006::Skill_LvUp
  342.   #--------------------------------------------------------------------------
  343.   # ● 初始化
  344.   #--------------------------------------------------------------------------
  345.   alias skill_level_initialize initialize
  346.   def initialize(actor_id)
  347.     @skill_level = {}    # 纪录技能等级
  348.     @skill_exp = {}      # 记录技能熟练度
  349.     @skill_exp_base = {} # 记录技能熟练度基数
  350.     @skill_next_exp = {} # 记录技能下一级熟练度
  351.     @skill_dmg_val = {}  # 纪录技能伤害变化的变量ID
  352.     @skill_res_exp = 0   # 纪录获取的技能升级点数
  353.     skill_level_initialize(actor_id)
  354.   end
  355.   #--------------------------------------------------------------------------
  356.   # ● 角色习得技能
  357.   #--------------------------------------------------------------------------
  358.   alias skill_level_learn_skill learn_skill
  359.   def learn_skill(skill_id)
  360.     skill_level_learn_skill(skill_id)
  361.     skill = $data_skills[skill_id]
  362.     if skill.can_lvup? # 判断技能是否可升级
  363.       @skill_level[skill_id] = 1
  364.       @skill_exp[skill_id] = 0
  365.       @skill_exp_base[skill_id] = skill.get_exp_base
  366.       @skill_next_exp[skill_id] = @skill_exp_base[skill_id]
  367.       if skill.dmg_var?
  368.         @skill_dmg_val[skill_id] = skill.dmg_var+@actor_id-1
  369.         alter_damage_formula(skill_id)
  370.       end
  371.     end
  372.   end
  373.   #--------------------------------------------------------------------------
  374.   # ● 修改伤害公式
  375.   #--------------------------------------------------------------------------
  376.   def alter_damage_formula(skill_id)
  377.     skill = $data_skills[skill_id]
  378.     return if skill.fml_altered? # 已修改时返回
  379.     formula = skill.damage.formula # 获取公式
  380.     dmg_var_id = @skill_dmg_val[skill_id]
  381.     skill.damage.formula = "(#{formula})*v[#{dmg_var_id}]"
  382.     skill.fml_altered = true # 标记为已修改
  383.   end
  384.   #--------------------------------------------------------------------------
  385.   # ● 判断技能是否能升级
  386.   #--------------------------------------------------------------------------
  387.   def skill_can_lvup?(skill_id)
  388.     return false unless $data_skills[skill_id].can_lvup? # 技能不可升级
  389.     return false unless @skills.include?(skill_id) # 角色未学习此技能
  390.     return @skill_level[skill_id] < max_skill_level(skill_id) # 技能未达最高等级
  391.   end
  392.   #--------------------------------------------------------------------------
  393.   # ● 获取技能最高等级
  394.   #--------------------------------------------------------------------------
  395.   def max_skill_level(skill_id)
  396.     return $data_skills[skill_id].max_level
  397.   end
  398.   #--------------------------------------------------------------------------
  399.   # ● 获取技能等级
  400.   #--------------------------------------------------------------------------
  401.   def skill_level(skill_id)
  402.     return 1 unless $data_skills[skill_id].can_lvup?
  403.     return @skill_level[skill_id]
  404.   end
  405.   #--------------------------------------------------------------------------
  406.   # ● 获取技能下一级熟练度
  407.   #--------------------------------------------------------------------------
  408.   def skill_next_exp(skill_id)
  409.     return 0 unless skill_can_lvup?(skill_id)
  410.     return @skill_next_exp[skill_id]
  411.   end
  412.   #--------------------------------------------------------------------------
  413.   # ● 获取技能当前熟练度
  414.   #--------------------------------------------------------------------------
  415.   def skill_exp(skill_id)
  416.     return 0 unless skill_can_lvup?(skill_id)
  417.     return @skill_exp[skill_id]
  418.   end
  419.   #--------------------------------------------------------------------------
  420.   # ● 角色获得经验值
  421.   #--------------------------------------------------------------------------
  422.   alias skill_level_gain_exp gain_exp
  423.   def gain_exp(exp)
  424.     skill_level_gain_exp(exp)
  425.     gain_skill_res_exp(exp/SKILL_RES_EXP_BASE)
  426.     @skills.each{ |id|
  427.       skill = $data_skills[id]
  428.       if skill.get_exp_from_actor? # 技能是否吸收经验值
  429.           skill_exp = (exp.to_f / skill.exp_from_actor).ceil
  430.           gain_skill_exp(id, skill_exp) # 技能提升熟练度
  431.       end
  432.     }
  433.   end
  434.   #--------------------------------------------------------------------------
  435.   # ● 角色获得技能熟练度
  436.   #--------------------------------------------------------------------------
  437.   def gain_skill_exp(skill_id, val)
  438.     return unless skill_can_lvup?(skill_id)
  439.     skill = $data_skills[skill_id]
  440.     return if skill.transformed
  441.     return if val == 0
  442.     @skill_exp[skill_id] += val
  443.     if @skill_exp[skill_id] >= @skill_next_exp[skill_id]
  444.       skill_lvup(skill_id)
  445.     end
  446.   end
  447.   #--------------------------------------------------------------------------
  448.   # ● 使用技能提升熟练度
  449.   #--------------------------------------------------------------------------
  450.   def gain_skill_exp_by_use(skill)
  451.     @gain_skill_exp = 0
  452.     if skill.is_a?(RPG::Skill) and skill.lvup_by_use?
  453.       @gain_skill_exp = skill.use_exp
  454.     end
  455.   end
  456.   #--------------------------------------------------------------------------
  457.   # ● 角色获得技能提升点数
  458.   #--------------------------------------------------------------------------
  459.   def gain_skill_res_exp(val)
  460.     @skill_res_exp += val
  461.   end
  462.   #--------------------------------------------------------------------------
  463.   # ● 返回角色的技能提升点数
  464.   #--------------------------------------------------------------------------
  465.   def res_exp
  466.     return @skill_res_exp
  467.   end
  468.   #--------------------------------------------------------------------------
  469.   # ● 判断是否能手动升级
  470.   #--------------------------------------------------------------------------
  471.   def can_lv_skill_manually?(skill)
  472.     return false unless skill.manual_lvup?
  473.     return @skill_res_exp > 0
  474.   end
  475.   def has_dmg_var?(skill_id)
  476.     return @skill_dmg_val.keys.include?(skill_id)
  477.   end
  478.   #--------------------------------------------------------------------------
  479.   # ● 手动提升熟练度
  480.   #--------------------------------------------------------------------------
  481.   def gain_skill_exp_manual(skill_id)
  482.     skill = $data_skills[skill_id]
  483.     return unless skill.manual_lvup?
  484.     val = [@skill_next_exp[skill_id], @skill_res_exp].min
  485.     @skill_res_exp -= val
  486.     gain_skill_exp(skill_id, val)
  487.   end
  488.   #--------------------------------------------------------------------------
  489.   # ● 计算使用技能后提升的最终熟练度
  490.   #--------------------------------------------------------------------------
  491.   def gain_skill_final_exp_by_use(skill, hit)
  492.     return if @gain_skill_exp < 1
  493.     @gain_skill_exp /= 2 unless hit # 若是技能落空则熟练度减半
  494.     gain_skill_exp(skill.id, @gain_skill_exp)
  495.     @gain_skill_exp = 0
  496.   end
  497.   #--------------------------------------------------------------------------
  498.   # ● 角色使用技能,技能获得熟练度
  499.   #--------------------------------------------------------------------------
  500.   alias skill_level_use_item use_item
  501.   def use_item(item)
  502.     skill_level_use_item(item)
  503.     gain_skill_exp_by_use(item)
  504.   end
  505.   #--------------------------------------------------------------------------
  506.   # ● 角色技能升级
  507.   #--------------------------------------------------------------------------
  508.   def skill_lvup(skill_id, val=1)
  509.     return unless skill_can_lvup?(skill_id)
  510.     return if $data_skills[skill_id].transformed
  511.     temp_level = @skill_level[skill_id] + val
  512.     max_level = max_skill_level(skill_id)
  513.     @skill_level[skill_id] = [temp_level, max_level].min
  514.     level = @skill_level[skill_id]
  515.     @skill_exp[skill_id] -= @skill_next_exp[skill_id]
  516.     @skill_exp[skill_id] = [@skill_exp[skill_id], 0].max
  517.     @skill_next_exp[skill_id] = @skill_exp_base[skill_id] * factorial(level)
  518.     if has_dmg_var?(skill_id)
  519.       dmg_var_id = @skill_dmg_val[skill_id]
  520.       $game_variables[dmg_var_id] = 1+(level.to_f/max_level)
  521.     end
  522.     process_skill_transform(skill_id, level)
  523.  
  524.   end
  525.   #--------------------------------------------------------------------------
  526.   # ● 计算技能伤害
  527.   #--------------------------------------------------------------------------
  528.   alias skill_level_make_damage_value make_damage_value
  529.   def make_damage_value(user, item)
  530.     skill_level_make_damage_value(user, item) # 呼叫原有方法
  531.   end
  532.   def process_skill_transform(skill_id, level)
  533.     skill = $data_skills[skill_id]
  534.     return unless skill.transform_at?(level) # 判断技能是否在这个等级变化
  535.     new_skill_id = skill.transform_to(level) # 获取变化后的技能ID
  536.     skill.transformed = true
  537.     learn_skill(new_skill_id) # 学习新技能
  538.  
  539.     # 将旧技能的等级、熟练度、熟练度基数、下一级熟练度转移到新技能下
  540.     $data_skills[new_skill_id].skill_level_inherit # 变化后的技能设定
  541.     @skill_level[new_skill_id] = @skill_level[skill_id]
  542.     @skill_exp[new_skill_id] = @skill_exp[skill_id]
  543.     @skill_exp_base[new_skill_id] = skill.get_exp_base
  544.     @skill_next_exp[new_skill_id] = @skill_next_exp[skill_id]
  545.     @skill_dmg_val[new_skill_id] = @skill_dmg_val[skill_id]
  546.     alter_damage_formula(new_skill_id) # 调整伤害公式
  547.  
  548.     if SKILL_LVUP_NO_FORGET or skill.no_forget? # 若是设定技能升级时不遗忘旧技能
  549.       @skill_exp[new_skill_id] = 0 # 熟练度归零
  550.     else
  551.       forget_skill(skill_id) # 遗忘旧技能
  552.       # 删除旧技能的等级、熟练度、熟练度基数、下一级熟练度
  553.       @skill_level.delete(skill_id)
  554.       @skill_exp.delete(skill_id)
  555.       @skill_exp_base.delete(skill_id)
  556.       @skill_next_exp.delete(skill_id)
  557.       @skill_dmg_val.delete(skill_id)
  558.     end
  559.   end
  560. end
  561. class Game_Battler < Game_BattlerBase
  562.   #--------------------------------------------------------------------------
  563.   # ● 技能使用对象的效果应用
  564.   #--------------------------------------------------------------------------
  565.   alias skill_level_item_apply item_apply
  566.   def item_apply(user, item)
  567.     skill_level_item_apply(user, item) # 呼叫原有方法
  568.     return unless item.is_a?(RPG::Skill) # 不是使用技能时返回
  569.     return unless user.actor?
  570.     user.gain_skill_final_exp_by_use(item, @result.hit?) # 计算最终熟练度
  571.   end
  572. end
  573. class Game_Interpreter
  574.   #--------------------------------------------------------------------------
  575.   # ● 技能等级提升
  576.   #--------------------------------------------------------------------------
  577.   def gain_skill_level(actor_id, skill_id, value=1)
  578.     $game_actors[actor_id].skill_lvup(skill_id, value)
  579.   end
  580.   #--------------------------------------------------------------------------
  581.   # ● 获得技能升级点数
  582.   #--------------------------------------------------------------------------
  583.   def gain_res_exp(actor_id, value=1)
  584.     $game_actors[actor_id].gain_skill_res_exp(value)
  585.   end
  586. end
  587. #--------------------------------------------------------------------------
  588. # ● 计算阶乘(计算技能下一级熟练度使用)
  589. #--------------------------------------------------------------------------
  590. def factorial(val)
  591.   if val <= 1
  592.     return 1
  593.   else
  594.     return factorial(val-2) + factorial(val-1)
  595.   end
  596. end
  597.  
  598. class Window_SkillLevel < Window_Base
  599.   include Snstar2006::Skill_LvUp
  600.   attr_reader :skill # 返回当前显示的技能
  601.   #--------------------------------------------------------------------------
  602.   # ● 初始化
  603.   #--------------------------------------------------------------------------
  604.   def initialize(x, y, actor, skill=nil)
  605.     super(x, y, Graphics.width/2, fitting_height(6))
  606.     @actor = actor
  607.     [url=home.php?mod=space&uid=260100]@skill[/url] = skill
  608.   end
  609.   #--------------------------------------------------------------------------
  610.   # ● 设定显示的技能
  611.   #--------------------------------------------------------------------------
  612.   def skill=(skill)
  613.     #return if @skill == skill
  614.     @skill = skill
  615.     refresh
  616.   end
  617.   #--------------------------------------------------------------------------
  618.   # ● 设定当前显示的角色
  619.   #--------------------------------------------------------------------------
  620.   def actor=(actor)
  621.     return if @actor == actor
  622.     @actor = actor
  623.     refresh
  624.   end
  625.   #--------------------------------------------------------------------------
  626.   # ● 窗口刷新
  627.   #--------------------------------------------------------------------------
  628.   def refresh
  629.     contents.clear
  630.     return unless @skill
  631.     draw_skill_name(@skill, 0, 0)
  632.     if @skill.can_lvup?
  633.       draw_skill_max_level(@skill, 24, line_height)
  634.       draw_skill_exp(@skill, 24, line_height*2)
  635.       draw_actor_res_exp(24, line_height*3)
  636.       draw_skill_transform(@skill, 24, line_height*4)
  637.     else
  638.       text = "此技能无法升级"
  639.       draw_text(24, line_height, text_width(text), line_height, text)
  640.     end
  641.   end
  642.   #--------------------------------------------------------------------------
  643.   # ● 绘制技能名称
  644.   #--------------------------------------------------------------------------
  645.   def draw_skill_name(skill, x, y, enabled = true)
  646.     return unless skill
  647.     return unless skill.is_a?(RPG::Skill)
  648.     draw_icon(skill.icon_index, x, y, enabled)
  649.     change_color(normal_color, enabled)
  650.     skill_name = skill.name
  651.     skill_name += " (#{@actor.skill_level(skill.id)}级)" if skill.can_lvup?
  652.     text = skill_name
  653.     draw_text(x + 24, y, text_width(text), line_height, text)
  654.   end
  655.   #--------------------------------------------------------------------------
  656.   # ● 绘制技能最高等级
  657.   #--------------------------------------------------------------------------
  658.   def draw_skill_max_level(skill, x, y)
  659.     return unless skill.can_lvup?
  660.     change_color(system_color)
  661.     text = "最高等级"
  662.     draw_text(x, y, text_width(text), line_height, text)
  663.     change_color(normal_color)
  664.     text = "#{skill.max_level} 级"
  665.     draw_text(x+108, y, text_width(text), line_height, text)
  666.   end
  667.   #--------------------------------------------------------------------------
  668.   # ● 绘制技能熟练度
  669.   #--------------------------------------------------------------------------
  670.   def draw_skill_exp(skill, x, y)
  671.     return unless skill.can_lvup?
  672.     return if skill.transformed
  673.     change_color(system_color)
  674.     text = SKILL_EXP_VOCAB
  675.     draw_text(x, y, text_width(text), line_height, text)
  676.     change_color(normal_color)
  677.     color1 = text_color(18)
  678.     color2 = text_color(20)
  679.     current = @actor.skill_exp(skill.id)
  680.     if @actor.skill_can_lvup?(skill.id)
  681.       max = @actor.skill_next_exp(skill.id)
  682.       rate = current.to_f / max
  683.       draw_gauge(x+103, y, 120, rate, color1, color2)
  684.       draw_current_and_max_values(x+76, y, 150, current, max, normal_color, normal_color)
  685.     else
  686.       draw_current_and_max_values(x+76, y, 150, "--", "--", normal_color, normal_color)
  687.     end
  688.   end
  689.   #--------------------------------------------------------------------------
  690.   # ● 绘制技能变化技
  691.   #--------------------------------------------------------------------------
  692.   def draw_skill_transform(skill, x, y)
  693.     return unless skill.transform?
  694.     change_color(system_color)
  695.     level = skill.transform_at
  696.     new_skill = $data_skills[skill.transform_to(level)]
  697.     text = sprintf("升至%s级则习得", level)
  698.     draw_text(x, y, text_width(text), line_height, text)
  699.     change_color(normal_color)
  700.     draw_item_name(new_skill, x+12, y+line_height)
  701.   end
  702.   def draw_actor_res_exp(x, y)
  703.     enabled = @skill.manual_lvup?
  704.     text = SKILL_REXP_VOCAB
  705.     change_color(system_color, enabled)
  706.     draw_text(x, y, text_width(text), line_height, text)
  707.     change_color(normal_color, enabled)
  708.     text = @actor.res_exp
  709.     draw_text(x+108, y, text_width(text), line_height, text)
  710.   end
  711.   #--------------------------------------------------------------------------
  712.   # ● 获得文字宽度
  713.   #--------------------------------------------------------------------------
  714.   def text_width(text)
  715.     return text_size(text).width*1.5
  716.   end
  717. end
  718. class Window_SkillList < Window_Selectable
  719.   include Snstar2006::Skill_LvUp
  720.   attr_reader   :skill_level_window # 返回技能等级窗口
  721.   #--------------------------------------------------------------------------
  722.   # ● 选择技能
  723.   #--------------------------------------------------------------------------
  724.   alias skill_level_select select
  725.   def select(index)
  726.     skill_level_select(index)
  727.     if !$game_party.in_battle
  728.       @skill_level_window.skill = item
  729.       @skill_level_window.refresh
  730.       if index % 2 == 0
  731.         @skill_level_window.x = Graphics.width/2
  732.       else
  733.         @skill_level_window.x = 0
  734.       end
  735.     end
  736.   end
  737.   #--------------------------------------------------------------------------
  738.   # ● 设定技能等级窗口
  739.   #--------------------------------------------------------------------------
  740.   def skill_level_window=(skill_level_window)
  741.     @skill_level_window = skill_level_window
  742.     call_skill_level
  743.   end
  744.   #--------------------------------------------------------------------------
  745.   # ● 呼叫技能窗口更新
  746.   #--------------------------------------------------------------------------
  747.   def call_skill_level
  748.     update_skill_level if active && @skill_level_window
  749.   end
  750.   #--------------------------------------------------------------------------
  751.   # ● 技能窗口更新
  752.   #--------------------------------------------------------------------------
  753.   def update_skill_level
  754.     @skill_level_window.clear
  755.   end
  756.   alias skill_level_deactivate deactivate
  757.   def deactivate
  758.     skill_level_deactivate
  759.     return unless @skill_level_window
  760.     @skill_level_window.hide
  761.   end
  762.   alias skill_level_activate activate
  763.   def activate
  764.     skill_level_activate
  765.     return unless @skill_level_window
  766.     @skill_level_window.show
  767.   end
  768.   #--------------------------------------------------------------------------
  769.   # ● 处理句柄
  770.   #--------------------------------------------------------------------------
  771.   alias skill_level_process_handling process_handling
  772.   def process_handling
  773.     skill_level_process_handling
  774.     return manual_skill_lvup  if Input.trigger?(SKILL_MAN_LVUP_KEY)
  775.   end
  776.   #--------------------------------------------------------------------------
  777.   # ● 执行手动升级
  778.   #--------------------------------------------------------------------------
  779.   def manual_skill_lvup
  780.     if item.manual_lvup? && @actor.can_lv_skill_manually?(item)
  781.       Sound.play_ok
  782.       @actor.gain_skill_exp_manual(item.id)
  783.       refresh
  784.       @skill_level_window.skill = item
  785.     else
  786.       Sound.play_buzzer
  787.     end
  788.     Input.update
  789.   end
  790. end
  791. class Scene_Skill < Scene_ItemBase
  792.   #--------------------------------------------------------------------------
  793.   # ● 场景开始
  794.   #--------------------------------------------------------------------------
  795.   alias skill_level_start start
  796.   def start
  797.     skill_level_start
  798.     create_skill_level_window
  799.     @skill_level_window.z = 200
  800.   end
  801.   #--------------------------------------------------------------------------
  802.   # ● 创建技能等级窗口
  803.   #--------------------------------------------------------------------------
  804.   def create_skill_level_window
  805.     y = @help_window.height + 120
  806.     @skill_level_window = Window_SkillLevel.new(Graphics.width/2, y, @actor)
  807.     @item_window.skill_level_window = @skill_level_window
  808.     @skill_level_window.hide
  809.   end
  810. end
帮你加上代码框——VIPArcher
初始状态是没有如“火球”这个技能的,我把技能设置在了一个装备身上,技能熟练度显示不出,但是初始状态设置火球就能正常显示,还有关于这个脚本的"精元点数" 我还是没研究出来怎么弄,即使是技能满级了就自动学到下个技能,不能选使用XX个"精元点数" 升级,所以本脚本的手动升级被我关了,因为开了也是按下升级键就自动升级的。本人也是新手,对于这些也是刚接触学习,希望大神们有空的时候帮忙小弟,叩谢!  

QQ截图20160204072551.jpg (7.79 KB, 下载次数: 21)

QQ截图20160204072551.jpg

QQ截图20160204072122.jpg (7.83 KB, 下载次数: 21)

QQ截图20160204072122.jpg

QQ截图20160204072032.jpg (9.45 KB, 下载次数: 24)

QQ截图20160204072032.jpg

Lv1.梦旅人

梦石
0
星屑
70
在线时间
175 小时
注册时间
2014-11-15
帖子
69
2
发表于 2016-2-4 09:49:59 | 只看该作者
通常遇到这种情况。。。我觉得。。
换个脚本比较好(你丫一定是懒啊喂!!
例如这个!
几乎可以满足你想到的和想不到的所有功能。。。。。。大概~
(带被动,可升级,可定义公式,可设置技能前置,可设置佩戴武器增加技能等级!……)
以上!

点评

哦对了!发脚本请用脚本框,与人方便与己方便:[code]我只是脚本[/code],太长请加上折叠:[fold=显示文字]我只是折叠[/fold]  发表于 2016-2-4 09:54

评分

参与人数 1星屑 +200 收起 理由
VIPArcher + 200 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
197 小时
注册时间
2016-1-22
帖子
55
3
 楼主| 发表于 2016-2-4 09:59:23 | 只看该作者
小灵魂 发表于 2016-2-4 09:49
通常遇到这种情况。。。我觉得。。
换个脚本比较好(你丫一定是懒啊喂!!
例如这个!

感谢!状态界面看起来很好看的样子,待我研究研究。再次感谢!!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-17 07:29

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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