Project1

标题: 请教,技能升级系统的问题。 [打印本页]

作者: 674998887    时间: 2013-7-28 10:55
标题: 请教,技能升级系统的问题。
听说不能挖坟,我不敢在老贴里面发。
这是为什么,怎么显示不出来熟练度?
@雪流星

QQ图片20130727225245.jpg (14.44 KB, 下载次数: 20)

QQ图片20130727225245.jpg

QQ图片20130727225458.jpg (3.68 KB, 下载次数: 18)

QQ图片20130727225458.jpg

作者: a0936459772    时间: 2013-7-28 12:16
把你的脚本贴出来...
还有你是不是分类错误了阿?
作者: 渝川    时间: 2013-7-28 15:38
这……应该是【有事请教】吧……不是【版务】吧……
作者: 674998887    时间: 2013-7-28 21:01


  1. module Snstar2006

  2.   module Skill_LvUp

  3.     SKILL_LVUP_NO_FORGET = false # 升级时不遗忘旧技能

  4.     SKILL_MANUAL_LVUP    = false # 手动升级

  5.     SKILL_RES_EXP_BASE   = 2     # 升级点数基数,数字越大,获得越少

  6.     SKILL_MAN_LVUP_KEY   = :X    # 手动升级的按键设定

  7.    
  8.     SKILL_EXP_VOCAB      = "熟练度"   # 技能熟练度术语

  9.     SKILL_REXP_VOCAB     = "精元点数" # 技能提升点数术语

  10.   end

  11. end



  12. class RPG::Skill < RPG::UsableItem

  13.   include Snstar2006::Skill_LvUp

  14.   #--------------------------------------------------------------------------

  15.   # ● 获取技能最高等级

  16.   #--------------------------------------------------------------------------

  17.   def get_max_skill

  18.     self.note.split(/[\r\n]+/).each{ |line|

  19.       if line =~ /\[(?:max_level) (\d+)\]/

  20.         return $1 ? $1.to_i : 1

  21.       end}

  22.     return 1

  23.   end

  24.   #--------------------------------------------------------------------------

  25.   # ● 获取技能熟练度基数

  26.   #--------------------------------------------------------------------------

  27.   def get_exp_base

  28.     self.note.split(/[\r\n]+/).each{ |line|

  29.       if line =~ /\[(?:exp_base) (\d+)\]/

  30.         return $1 ? $1.to_i : 30

  31.       end}

  32.     return 30

  33.   end

  34.   #--------------------------------------------------------------------------

  35.   # ● 获取技能吸收角色经验值作为熟练度的基础值

  36.   #--------------------------------------------------------------------------

  37.   def get_exp_part

  38.     self.note.split(/[\r\n]+/).each{ |line|

  39.       if line =~ /\[(?:exp_part) (\d+)\]/

  40.         return $1 ? $1.to_i : 0

  41.       end}

  42.     return 0

  43.   end

  44.   #--------------------------------------------------------------------------

  45.   # ● 获取技能使用时获取的熟练度

  46.   #--------------------------------------------------------------------------

  47.   def get_use_exp

  48.     self.note.split(/[\r\n]+/).each{ |line|

  49.       if line =~ /\[(?:use_exp) (\d+)\]/

  50.         return $1 ? $1.to_i : 1

  51.       end}

  52.     return 1

  53.   end

  54.   #--------------------------------------------------------------------------

  55.   # ● 获取技能升级后变化的技能

  56.   #--------------------------------------------------------------------------

  57.   def get_on_level(level)

  58.     trans_skill_id = 0

  59.     self.note.split(/[\r\n]+/).each{ |line|

  60.       if line =~ /\[(?:on_level) (\d+)\,(\d+)\]/

  61.         trans_skill_id = $2.to_i if level == $1.to_i

  62.       end}

  63.     return trans_skill_id

  64.   end

  65.   #--------------------------------------------------------------------------

  66.   # ● 获取技能升级后变化的技能

  67.   #--------------------------------------------------------------------------

  68.   def get_inherit

  69.     self.note.split(/[\r\n]+/).each{ |line|

  70.       if line =~ /\[(?:inherit) (\d+)\]/

  71.         return $1 ? $1.to_i : 0

  72.       end}

  73.     return 0

  74.   end

  75.   #--------------------------------------------------------------------------

  76.   # ● 判断是否升级后遗忘

  77.   #--------------------------------------------------------------------------

  78.   def no_forget?

  79.     self.note.split(/[\r\n]+/).each{ |line|

  80.       if line =~ /\[(?:no_forget)\]/

  81.         return true

  82.       end}

  83.     return false

  84.   end

  85.   #--------------------------------------------------------------------------

  86.   # ● 获取技能升级后变化的伤害值基数

  87.   #--------------------------------------------------------------------------

  88.   def get_dmg_var

  89.     self.note.split(/[\r\n]+/).each{ |line|

  90.       if line =~ /\[(?:dmg_var) (\d+)\]/

  91.         return $1 ? $1.to_i : 0

  92.       end}

  93.     return 0

  94.   end

  95.   #--------------------------------------------------------------------------

  96.   # ● 判断是否能升级

  97.   #--------------------------------------------------------------------------

  98.   def can_lvup?

  99.     skill_level_initialize # 技能等级初始化

  100.     return @max_level > 1

  101.   end

  102.   #--------------------------------------------------------------------------

  103.   # ● 判断是否获取角色经验当作熟练度

  104.   #--------------------------------------------------------------------------

  105.   def get_exp_from_actor?

  106.     return false unless can_lvup?

  107.     return @get_exp > 0

  108.   end

  109.   #--------------------------------------------------------------------------

  110.   # ● 判断是否手动升级

  111.   #--------------------------------------------------------------------------

  112.   def manual_lvup?

  113.     return false unless can_lvup?

  114.     return false if transformed

  115.     return true if SKILL_MANUAL_LVUP

  116.     return false if get_exp_from_actor?

  117.     return false if lvup_by_use?

  118.     return true

  119.   end

  120.   #--------------------------------------------------------------------------

  121.   # ● 判断是否在使用时提升熟练度

  122.   #--------------------------------------------------------------------------

  123.   def lvup_by_use?

  124.     return false unless can_lvup?

  125.     return @use_exp > 0

  126.   end

  127.   #--------------------------------------------------------------------------

  128.   # ● 判断是否继承任何技能设定

  129.   #--------------------------------------------------------------------------

  130.   def inherit?

  131.     @transform_from = get_inherit

  132.     return @transform_from > 0

  133.   end

  134.   #--------------------------------------------------------------------------

  135.   # ● 技能等级参数初始化

  136.   #--------------------------------------------------------------------------

  137.   def skill_level_initialize

  138.     return if @skill_level_initialized # 已初始化时跳过

  139.     @max_level = get_max_skill

  140.     @get_exp = get_exp_part

  141.     @use_exp = get_use_exp

  142.     @skill_level_initialized = true

  143.     initialize_skill_transform

  144.     @transformed = false

  145.     @transform_from = 0

  146.     @dmg_var = get_dmg_var

  147.     @fml_altered = false

  148.     if @dmg_var > 0

  149.       $game_variables[@dmg_var]=1

  150.     end

  151.   end

  152.   #--------------------------------------------------------------------------

  153.   # ● 技能等级参数继承

  154.   #--------------------------------------------------------------------------

  155.   def skill_level_inherit

  156.     return unless inherit? # 已设定继承时跳过

  157.     old_skill = $data_skills[@transform_from]

  158.     @max_level = old_skill.get_max_skill

  159.     @get_exp = old_skill.get_exp_part

  160.     @use_exp = old_skill.get_use_exp

  161.     initialize_skill_transform

  162.   end

  163.   #--------------------------------------------------------------------------

  164.   # ● 获取技能吸取角色经验值的基数

  165.   #--------------------------------------------------------------------------

  166.   def exp_from_actor

  167.     return @get_exp

  168.   end

  169.   #--------------------------------------------------------------------------

  170.   # ● 技能变化资讯初始化

  171.   #--------------------------------------------------------------------------

  172.   def initialize_skill_transform

  173.     @skill_transform = []

  174.     1.upto(@max_level){ |level|

  175.       t_id = get_on_level(level)

  176.       if t_id > 0

  177.         @skill_transform = [level, t_id]

  178.         break

  179.       end

  180.     }

  181.   end

  182.   #--------------------------------------------------------------------------

  183.   # ● 判断技能是否会变化

  184.   #--------------------------------------------------------------------------

  185.   def transform?

  186.     return !@skill_transform.empty?

  187.   end

  188.   #--------------------------------------------------------------------------

  189.   # ● 判断技能是否会在某等级变化

  190.   #--------------------------------------------------------------------------

  191.   def transform_at?(level)

  192.     return false unless transform?

  193.     return @skill_transform[0] == level

  194.   end

  195.   def transform_at

  196.     return @skill_transform[0]

  197.   end

  198.   #--------------------------------------------------------------------------

  199.   # ● 获取技能变化后的技能ID

  200.   #--------------------------------------------------------------------------

  201.   def transform_to(level)

  202.     return 0 unless transform_at?(level)

  203.     return @skill_transform[1]

  204.   end

  205.   #--------------------------------------------------------------------------

  206.   # ● 判断技能是否有指定伤害变量

  207.   #--------------------------------------------------------------------------

  208.   def dmg_var?

  209.     return @dmg_var>0

  210.   end

  211.   #--------------------------------------------------------------------------

  212.   # ● 判断技能是否已修改公式

  213.   #--------------------------------------------------------------------------

  214.   def fml_altered?

  215.     return @fml_altered

  216.   end

  217.   attr_reader :max_level # 获取最高等级

  218.   attr_reader :use_exp   # 使用提升熟练度量

  219.   attr_accessor :transformed # 已变化技能

  220.   attr_accessor :fml_altered # 已修改公式

  221.   attr_reader :dmg_var   # 升级提升伤害的变量ID

  222. end

  223. class Game_Actor < Game_Battler

  224.   include Snstar2006::Skill_LvUp

  225.   #--------------------------------------------------------------------------

  226.   # ● 初始化

  227.   #--------------------------------------------------------------------------

  228.   alias skill_level_initialize initialize

  229.   def initialize(actor_id)

  230.     @skill_level = {}    # 纪录技能等级

  231.     @skill_exp = {}      # 记录技能熟练度

  232.     @skill_exp_base = {} # 记录技能熟练度基数

  233.     @skill_next_exp = {} # 记录技能下一级熟练度

  234.     @skill_dmg_val = {}  # 纪录技能伤害变化的变量ID

  235.     @skill_res_exp = 0   # 纪录获取的技能升级点数

  236.     skill_level_initialize(actor_id)

  237.   end

  238.   #--------------------------------------------------------------------------

  239.   # ● 角色习得技能

  240.   #--------------------------------------------------------------------------

  241.   alias skill_level_learn_skill learn_skill

  242.   def learn_skill(skill_id)

  243.     skill_level_learn_skill(skill_id)

  244.     skill = $data_skills[skill_id]

  245.     if skill.can_lvup? # 判断技能是否可升级

  246.       @skill_level[skill_id] = 1

  247.       @skill_exp[skill_id] = 0

  248.       @skill_exp_base[skill_id] = skill.get_exp_base

  249.       @skill_next_exp[skill_id] = @skill_exp_base[skill_id]

  250.       if skill.dmg_var?

  251.         @skill_dmg_val[skill_id] = skill.dmg_var+@actor_id-1

  252.         alter_damage_formula(skill_id)

  253.       end

  254.     end

  255.   end

  256.   #--------------------------------------------------------------------------

  257.   # ● 修改伤害公式

  258.   #--------------------------------------------------------------------------

  259.   def alter_damage_formula(skill_id)

  260.     skill = $data_skills[skill_id]

  261.     return if skill.fml_altered? # 已修改时返回

  262.     formula = skill.damage.formula # 获取公式

  263.     dmg_var_id = @skill_dmg_val[skill_id]

  264.     skill.damage.formula = "(#{formula})*v[#{dmg_var_id}]"

  265.     skill.fml_altered = true # 标记为已修改

  266.   end

  267.   #--------------------------------------------------------------------------

  268.   # ● 判断技能是否能升级

  269.   #--------------------------------------------------------------------------

  270.   def skill_can_lvup?(skill_id)

  271.     return false unless $data_skills[skill_id].can_lvup? # 技能不可升级

  272.     return false unless @skills.include?(skill_id) # 角色未学习此技能

  273.     return @skill_level[skill_id] < max_skill_level(skill_id) # 技能未达最高等级

  274.   end

  275.   #--------------------------------------------------------------------------

  276.   # ● 获取技能最高等级

  277.   #--------------------------------------------------------------------------

  278.   def max_skill_level(skill_id)

  279.     return $data_skills[skill_id].max_level

  280.   end

  281.   #--------------------------------------------------------------------------

  282.   # ● 获取技能等级

  283.   #--------------------------------------------------------------------------

  284.   def skill_level(skill_id)

  285.     return 1 unless $data_skills[skill_id].can_lvup?

  286.     return @skill_level[skill_id]

  287.   end

  288.   #--------------------------------------------------------------------------

  289.   # ● 获取技能下一级熟练度

  290.   #--------------------------------------------------------------------------

  291.   def skill_next_exp(skill_id)

  292.     return 0 unless skill_can_lvup?(skill_id)

  293.     return @skill_next_exp[skill_id]

  294.   end

  295.   #--------------------------------------------------------------------------

  296.   # ● 获取技能当前熟练度

  297.   #--------------------------------------------------------------------------

  298.   def skill_exp(skill_id)

  299.     return 0 unless skill_can_lvup?(skill_id)

  300.     return @skill_exp[skill_id]

  301.   end

  302.   #--------------------------------------------------------------------------

  303.   # ● 角色获得经验值

  304.   #--------------------------------------------------------------------------

  305.   alias skill_level_gain_exp gain_exp

  306.   def gain_exp(exp)

  307.     skill_level_gain_exp(exp)

  308.     gain_skill_res_exp(exp/SKILL_RES_EXP_BASE)

  309.     @skills.each{ |id|

  310.       skill = $data_skills[id]

  311.       if skill.get_exp_from_actor? # 技能是否吸收经验值

  312.           skill_exp = (exp.to_f / skill.exp_from_actor).ceil

  313.           gain_skill_exp(id, skill_exp) # 技能提升熟练度

  314.       end

  315.     }

  316.   end

  317.   #--------------------------------------------------------------------------

  318.   # ● 角色获得技能熟练度

  319.   #--------------------------------------------------------------------------

  320.   def gain_skill_exp(skill_id, val)

  321.     return unless skill_can_lvup?(skill_id)

  322.     skill = $data_skills[skill_id]

  323.     return if skill.transformed

  324.     return if val == 0

  325.     @skill_exp[skill_id] += val

  326.     if @skill_exp[skill_id] >= @skill_next_exp[skill_id]

  327.       skill_lvup(skill_id)

  328.     end

  329.   end

  330.   #--------------------------------------------------------------------------

  331.   # ● 使用技能提升熟练度

  332.   #--------------------------------------------------------------------------

  333.   def gain_skill_exp_by_use(skill)

  334.     @gain_skill_exp = 0

  335.     if skill.is_a?(RPG::Skill) and skill.lvup_by_use?

  336.       @gain_skill_exp = skill.use_exp

  337.     end

  338.   end

  339.   #--------------------------------------------------------------------------

  340.   # ● 角色获得技能提升点数

  341.   #--------------------------------------------------------------------------

  342.   def gain_skill_res_exp(val)

  343.     @skill_res_exp += val

  344.   end

  345.   #--------------------------------------------------------------------------

  346.   # ● 返回角色的技能提升点数

  347.   #--------------------------------------------------------------------------

  348.   def res_exp

  349.     return @skill_res_exp

  350.   end

  351.   #--------------------------------------------------------------------------

  352.   # ● 判断是否能手动升级

  353.   #--------------------------------------------------------------------------

  354.   def can_lv_skill_manually?(skill)

  355.     return false unless skill.manual_lvup?

  356.     return @skill_res_exp > 0

  357.   end

  358.   def has_dmg_var?(skill_id)

  359.     return @skill_dmg_val.keys.include?(skill_id)

  360.   end

  361.   #--------------------------------------------------------------------------

  362.   # ● 手动提升熟练度

  363.   #--------------------------------------------------------------------------

  364.   def gain_skill_exp_manual(skill_id)

  365.     skill = $data_skills[skill_id]

  366.     return unless skill.manual_lvup?

  367.     val = [@skill_next_exp[skill_id], @skill_res_exp].min

  368.     @skill_res_exp -= val

  369.     gain_skill_exp(skill_id, val)

  370.   end

  371.   #--------------------------------------------------------------------------

  372.   # ● 计算使用技能后提升的最终熟练度

  373.   #--------------------------------------------------------------------------

  374.   def gain_skill_final_exp_by_use(skill, hit)

  375.     return if @gain_skill_exp < 1

  376.     @gain_skill_exp /= 2 unless hit # 若是技能落空则熟练度减半

  377.     gain_skill_exp(skill.id, @gain_skill_exp)

  378.     @gain_skill_exp = 0

  379.   end

  380.   #--------------------------------------------------------------------------

  381.   # ● 角色使用技能,技能获得熟练度

  382.   #--------------------------------------------------------------------------

  383.   alias skill_level_use_item use_item

  384.   def use_item(item)

  385.     skill_level_use_item(item)

  386.     gain_skill_exp_by_use(item)
  387.   end

  388.   #--------------------------------------------------------------------------

  389.   # ● 角色技能升级

  390.   #--------------------------------------------------------------------------

  391.   def skill_lvup(skill_id, val=1)

  392.     return unless skill_can_lvup?(skill_id)

  393.     return if $data_skills[skill_id].transformed

  394.     temp_level = @skill_level[skill_id] + val

  395.     max_level = max_skill_level(skill_id)

  396.     @skill_level[skill_id] = [temp_level, max_level].min

  397.     level = @skill_level[skill_id]

  398.     @skill_exp[skill_id] -= @skill_next_exp[skill_id]

  399.     @skill_exp[skill_id] = [@skill_exp[skill_id], 0].max

  400.     @skill_next_exp[skill_id] = @skill_exp_base[skill_id] * factorial(level)

  401.     if has_dmg_var?(skill_id)

  402.       dmg_var_id = @skill_dmg_val[skill_id]

  403.       $game_variables[dmg_var_id] = 1+(level.to_f/max_level)

  404.     end

  405.     process_skill_transform(skill_id, level)

  406.    
  407.   end

  408.   #--------------------------------------------------------------------------

  409.   # ● 计算技能伤害

  410.   #--------------------------------------------------------------------------

  411.   alias skill_level_make_damage_value make_damage_value

  412.   def make_damage_value(user, item)

  413.     skill_level_make_damage_value(user, item) # 呼叫原有方法

  414.   end

  415.   def process_skill_transform(skill_id, level)

  416.     skill = $data_skills[skill_id]

  417.     return unless skill.transform_at?(level) # 判断技能是否在这个等级变化

  418.     new_skill_id = skill.transform_to(level) # 获取变化后的技能ID

  419.     skill.transformed = true

  420.     learn_skill(new_skill_id) # 学习新技能

  421.    
  422.     # 将旧技能的等级、熟练度、熟练度基数、下一级熟练度转移到新技能下

  423.     $data_skills[new_skill_id].skill_level_inherit # 变化后的技能设定

  424.     @skill_level[new_skill_id] = @skill_level[skill_id]

  425.     @skill_exp[new_skill_id] = @skill_exp[skill_id]

  426.     @skill_exp_base[new_skill_id] = skill.get_exp_base

  427.     @skill_next_exp[new_skill_id] = @skill_next_exp[skill_id]

  428.     @skill_dmg_val[new_skill_id] = @skill_dmg_val[skill_id]

  429.     alter_damage_formula(new_skill_id) # 调整伤害公式

  430.    
  431.     if SKILL_LVUP_NO_FORGET or skill.no_forget? # 若是设定技能升级时不遗忘旧技能

  432.       @skill_exp[new_skill_id] = 0 # 熟练度归零

  433.     else

  434.       forget_skill(skill_id) # 遗忘旧技能

  435.       # 删除旧技能的等级、熟练度、熟练度基数、下一级熟练度

  436.       @skill_level.delete(skill_id)

  437.       @skill_exp.delete(skill_id)

  438.       @skill_exp_base.delete(skill_id)

  439.       @skill_next_exp.delete(skill_id)

  440.       @skill_dmg_val.delete(skill_id)

  441.     end

  442.   end

  443. end

  444. class Game_Battler < Game_BattlerBase

  445.   #--------------------------------------------------------------------------

  446.   # ● 技能使用对象的效果应用

  447.   #--------------------------------------------------------------------------

  448.   alias skill_level_item_apply item_apply

  449.   def item_apply(user, item)

  450.     skill_level_item_apply(user, item) # 呼叫原有方法

  451.     return unless item.is_a?(RPG::Skill) # 不是使用技能时返回

  452.     return unless user.actor?

  453.     user.gain_skill_final_exp_by_use(item, @result.hit?) # 计算最终熟练度

  454.   end

  455. end

  456. class Game_Interpreter

  457.   #--------------------------------------------------------------------------

  458.   # ● 技能等级提升

  459.   #--------------------------------------------------------------------------

  460.   def gain_skill_level(actor_id, skill_id, value=1)

  461.     $game_actors[actor_id].skill_lvup(skill_id, value)

  462.   end

  463.   #--------------------------------------------------------------------------

  464.   # ● 获得技能升级点数

  465.   #--------------------------------------------------------------------------

  466.   def gain_res_exp(actor_id, value=1)

  467.     $game_actors[actor_id].gain_skill_res_exp(value)

  468.   end

  469. end

  470. #--------------------------------------------------------------------------

  471. # ● 计算阶乘(计算技能下一级熟练度使用)

  472. #--------------------------------------------------------------------------

  473. def factorial(val)

  474.   if val <= 1

  475.     return 1

  476.   else

  477.     return factorial(val-2) + factorial(val-1)

  478.   end

  479. end
复制代码

作者: a0936459772    时间: 2013-7-28 22:16
本帖最后由 a0936459772 于 2013-7-28 22:38 编辑
674998887 发表于 2013-7-28 21:01


原作者的帖子有附说明,不晓得你有没有先阅读过?

技能升级脚本 v2.1
http://rpg.blue/forum.php?mod=vi ... &fromuid=356025

RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 绘制技能熟练度
  3.   #--------------------------------------------------------------------------
  4.   def draw_skill_exp(skill, x, y)
  5.     return unless skill.can_lvup?
  6.     return if skill.transformed
  7.     change_color(system_color)
  8.     text = SKILL_EXP_VOCAB
  9.     draw_text(x, y, text_width(text), line_height, text)
  10.     change_color(normal_color)
  11.     color1 = text_color(18)
  12.     color2 = text_color(20)
  13.     current = @actor.skill_exp(skill.id)
  14.     if @actor.skill_can_lvup?(skill.id)
  15.       max = @actor.skill_next_exp(skill.id)
  16.       rate = current.to_f / max
  17.       draw_gauge(x+103, y, 120, rate, color1, color2)
  18.       draw_current_and_max_values(x+76, y, 150, current, max, normal_color, normal_color)
  19.     else
  20.       draw_current_and_max_values(x+76, y, 150, "--", "--", normal_color, normal_color)
  21.     end
  22.   end


从这段代码来看,技能能升级时就正常绘制,无法升级则绘制--/--
合理判断你贴的技能应该无法再升级,也就是满级状态,你确认一下
作者: 674998887    时间: 2013-7-29 03:12
a0936459772 发表于 2013-7-28 22:16
原作者的帖子有附说明,不晓得你有没有先阅读过?

技能升级脚本 v2.1

给一个范例好不好,求你了!!!{:2_271:}
作者: 200928326    时间: 2013-7-29 06:29
是不是插入了其他脚本?
你设置好的第一次测试中,技能旁边的(X级)显示的是什么?
还有,原创区原则上可以挖坟,详情阅读版规= =
作者: 674998887    时间: 2013-7-29 07:03
200928326 发表于 2013-7-29 06:29
是不是插入了其他脚本?
你设置好的第一次测试中,技能旁边的(X级)显示的是什么?
还有,原创区原则上可 ...

奇怪了,我自己开新的工程测试无问题,请问这个脚本和哪个脚本冲突?
作者: 674998887    时间: 2013-7-29 07:26
已经解决!原来无法天生遗传,只能通过升级学习的技能才有。




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