查看: 12428|回复: 24

[原创发布] 【原创】简易技能等级系统

[复制链接]
梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2013-9-20 22:11:48 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 RyanBern 于 2017-5-30 21:33 编辑

突然有给技能增加等级的想法。技能等级,说白了就是让技能也具有经验和级别。做了一个简单的脚本,感觉上应该能个实现这个要求。
主角越频繁使用一个技能,也就对这个技能越熟练,熟能生巧么,因此技能等级提高了……


以上是一年前写的东西,现在翻出来一看,写的这叫啥啊,果断返工重写。
2.0版本的东西和1.0的很不一样,使用方法也不同。修复了一些BUG,不过没有动什么界面上的东西(为了避免脚本冲突)
虽然如此,还是存在脚本冲突的可能。

有BUG欢迎报告,代码如下:
[pre lang="Ruby"]#=============================================================================
# 技能等级系统 Ver 2.01
#-----------------------------------------------------------------------------
# By:RyanBern
#-----------------------------------------------------------------------------
# 主要功能:
#     开放了技能成长值,角色在连续使用同一个技能若干次后,该技能会变得更加强大
#     值得一提的是,技能的等级和角色的等级没有关系,只和你使用它的频率相关,即
#     使角色等级非常高,如果那个技能一直不用,那么技能不会升级。
#     只有产生了效果的技能才会增加技能的熟练度(EXP),在这里产生效果是指:
#     对敌人打出了不为0的伤害/产生状态变化/对同伴有加血作用/
#     也就是说对着一个满血同伴一直加血的话是不会增加EXP的……
#     技能只要满足升级条件立即升级(也就是说在战斗未完成就可以用升级之后的技能)
#     如果在菜单中升级,则下次点击 C 键会立即使用新技能
#     技能升级之后原有技能将会消失。
#-----------------------------------------------------------------------------
# 使用方法:
#     在数据库中定义某技能升级后的技能,方法是在对应的技能说明中的任何位置写:
#     %sklv[升级后技能ID,升级所需EXP]
#     例如:1号技能[治疗]可以升级到2号技能[治疗+],需要10个EXP
#     %sklv[2,10] <-注意不要写多余的空格
# 更新记录:
#     v2.01 --- 修复了菜单不能使用技能的问题;修复了菜单使用技能时升级的问题
#=============================================================================

module RB
  # 使用一次技能之后获得的熟练度(EXP)
  BASE_SKILL_EXP = 1

  # 升级技能后播放的 SE
  SKILL_UP_SE = "Audio/SE/105-Heal01"

  # 显示升级窗口对应的开关:打开该序号开关则升级时不会显示升级窗口
  NO_SKILL_UP_WINDOW = 11
end

class RPG::Skill
  Regex_Skill = /%sklv\[(\d+),(\d+)\]/i
  alias rb_description_20141219 description
  def description
    text = rb_description_20141219
    return text.gsub(Regex_Skill, "")
  end
  def exp_next
    text = rb_description_20141219
    Regex_Skill =~ text
    return $2.to_i || 0
  end
  def skill_next
    text = rb_description_20141219
    Regex_Skill =~ text
    return $1.to_i || 0
  end
end

class Game_Temp
  attr_accessor :skill_level_up
end


class Game_Battler
  alias rb_skill_effect_20141219 skill_effect
  def skill_effect(user, skill)
    effective = rb_skill_effect_20141219(user, skill)
    if skill.skill_next != 0 && user.is_a?(Game_Actor)
      user.gain_skill_exp(skill.id, RB::BASE_SKILL_EXP) if effective
    end
    return effective
  end
end


class Game_Actor < Game_Battler
  alias rb_initialize_20141219 initialize
  def initialize(actor_id)
    @skills_exp = {}
    rb_initialize_20141219(actor_id)
  end
  #--------------------------------------------------------------------------
  # ● 增加技能经验
  #     skill_id : 特技 ID
  #     value    : 获取值
  #--------------------------------------------------------------------------
  def gain_skill_exp(skill_id, value)
    unless skill_learn?(skill_id)
      return
    end
    @skills_exp ||= {}
    if @skills_exp[skill_id] == nil
      @skills_exp[skill_id] = 0
    end
    @skills_exp[skill_id] += value
    # 满足条件就升级技能
    upgrade_skill(skill_id)
  end
  #--------------------------------------------------------------------------
  # ● 获取技能经验数值
  #     skill_id : 特技 ID
  #--------------------------------------------------------------------------
  def skill_exp(skill_id)
    return @skills_exp[skill_id] == nil ? 0 : @skills_exp[skill_id]
  end
  #--------------------------------------------------------------------------
  # ● 遗忘特技
  #     skill_id : 特技 ID
  #--------------------------------------------------------------------------
  alias rb_forget_skill_20141219 forget_skill
  def forget_skill(skill_id)
    rb_forget_skill_20141219(skill_id)
    @skills_exp ||= {}
    @skills_exp.delete(skill_id)
  end
  #--------------------------------------------------------------------------
  # ● 升级特技
  #     skill_id : 特技 ID
  #--------------------------------------------------------------------------
  def upgrade_skill(skill_id)
    skill_next = $data_skills[skill_id].skill_next
    exp_next = $data_skills[skill_id].exp_next
    # 技能的下一级别存在的情况下
    if $data_skills[skill_id] != nil
      # 当前经验高于升级所需经验
      if self.skill_exp(skill_id) >= exp_next
        # 设置技能升级标志
        $game_temp.skill_level_up = true
        # 遗忘上一级别的技能
        forget_skill(skill_id)
        # 显示窗口
        unless $game_switches[RB::NO_SKILL_UP_WINDOW]
          Audio.se_play(RB::SKILL_UP_SE, 80, 100) if RB::SKILL_UP_SE != ""
          show_skill_up_result(skill_id, skill_next)
        end
        # 学习新特技
        learn_skill(skill_next)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 升级显示处理
  #--------------------------------------------------------------------------
  def show_skill_up_result(skill_id, skill_next)
    skill_learning_window = Window_SkillUpgrade.new(skill_id, skill_next)
    # 循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 按下C就关闭窗口
      if Input.trigger?(Input::C)
        skill_learning_window.visible = false
        break
      end
    end
    skill_learning_window.dispose
  end
end

class Window_SkillUpgrade < Window_Base
  def initialize(skill_id, new_skill_id)
    super(0, 0, 32, 96)
    self.contents = Bitmap.new(1, 1)
    self.visible = false
    self.back_opacity = 160
    # 防止被对话框遮住
    self.z = 9999
    @old_skill = $data_skills[skill_id]
    @new_skill = $data_skills[new_skill_id]
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    text1 = @old_skill.name + " 升级为:"
    text2 = @new_skill.name
    w1 = self.contents.text_size(text1).width
    w2 = self.contents.text_size(text2).width
    self.contents = Bitmap.new([w1, w2].max + 28, 64)
    self.width = [w1, w2].max + 28 + 32
    self.x = 320 - width / 2
    self.y = 240 - height / 2
    # 各描写
    self.contents.clear
    bitmap1 = RPG::Cache.icon(@old_skill.icon_name)
    bitmap2 = RPG::Cache.icon(@new_skill.icon_name)
    self.contents.blt(4, 4, bitmap1, Rect.new(0,0,24,24))
    self.contents.blt(4, 36, bitmap2, Rect.new(0,0,24,24))
    self.contents.draw_text(28, 0, contents.width - 28, 32, text1)
    self.contents.draw_text(28, 32, contents.width - 28, 32, text2)
    self.visible = true
  end
end

class Window_Skill < Window_Selectable
  def update_help
    if self.skill == nil
      text = ""
    else
      text_append = self.skill.skill_next == 0 ? "" \
        : sprintf("Exp:%d/%d", @actor.skill_exp(self.skill.id), self.skill.exp_next)
      text = self.skill.description + text_append
    end
    @help_window.set_text(text)
  end
end


class Scene_Skill
  alias rb_update_target_20170530 update_target
  def update_target
    if $game_temp.skill_level_up
      $game_temp.skill_level_up = false
      @skill = $data_skills[@skill.skill_next] || @skill
      @skill_window.refresh
    end
    rb_update_target_20170530
  end
end

[/pre]

评分

参与人数 2星屑 +250 收起 理由
feizhaodan + 200 奖赏条例
美丽晨露 + 50 精品文章

查看全部评分

梦石
20
星屑
1840
在线时间
6925 小时
注册时间
2012-12-14
回帖
10960

短篇十战斗者组别冠军开拓者贵宾短篇九勇士组亚军

发表于 2013-9-21 19:46:30 | 显示全部楼层
效果还算不错的。
如果可以在帮助栏上显示升级技能时还需要的经验数就更好了。
大家好,这里是晨露的说。请多多指教。
刚入门RM软件制作,请大家多多帮助我哦。
落雪君的欢乐像素教程,欢迎查阅。

回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

 楼主| 发表于 2013-9-21 20:27:51 | 显示全部楼层
本帖最后由 RyanBern 于 2014-12-20 08:46 编辑

该层楼代码作废

点评

直接编辑1L多好。。。  发表于 2013-9-22 10:46
回复

使用道具 举报

梦石
0
星屑
50
在线时间
439 小时
注册时间
2013-3-2
回帖
657
发表于 2013-9-22 13:17:47 | 显示全部楼层
截图18.png

新建的工程。。。。
请楼主修正

曾经的美好已不在   吾只能独自回忆
【RMXP共享】50个脚本整合的系统
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

 楼主| 发表于 2013-9-22 13:25:21 | 显示全部楼层
guoyq1988 发表于 2013-9-22 13:17
新建的工程。。。。
请楼主修正

不知道遇到了什么问题呢……我这里看不到图,还请层主说下报错信息。
我这里的新工程一切正常。

点评

213我改成@skill = $data_skills[@active_battler.current_action.skill_id] 就正常了  发表于 2013-9-22 13:37
213行怎么回事,我发上来就显示一半的代码? [url=home.php?mod=space&uid=260100]@skill[/url] = $data_skills[@active_battler.current_action.skill_id]  发表于 2013-9-22 13:32
回复

使用道具 举报

梦石
0
星屑
50
在线时间
439 小时
注册时间
2013-3-2
回帖
657
发表于 2013-9-22 13:29:54 | 显示全部楼层
用的是第2个脚本
第213行是
  @skill = $data_skills[@active_battler.current_action.skill_id]

我在57行那定义了
#-----------------------------------------------------------------------------
# 设置技能对应数据
#-----------------------------------------------------------------------------
def get_skill_set
  data = Game_Skill_Set.new
  # 定义技能对应 data.set(1,2,10)
  data.set(14,15,10)
  # 定义完毕
  data.skills = data.skill_next.keys
  return data
end

class Game_Actor < Game_Battler
  attr_reader :skills_exp
  alias old_ini initialize
  def initialize(actor_id)
    @skills_exp = {}
    old_ini(actor_id)
  end

曾经的美好已不在   吾只能独自回忆
【RMXP共享】50个脚本整合的系统
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

 楼主| 发表于 2013-9-22 16:49:13 | 显示全部楼层
guoyq1988 发表于 2013-9-22 13:29
用的是第2个脚本
第213行是
  @skill = $data_skills[@active_battler.current_action.skill_id]

应该是到那里乱码了……正常了就好。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
59 小时
注册时间
2013-9-3
回帖
21
发表于 2013-9-22 19:27:00 | 显示全部楼层
进入打斗场景,76行发生错误
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

 楼主| 发表于 2013-9-22 19:50:10 | 显示全部楼层
浓睡不消残酒愁 发表于 2013-9-22 19:27
进入打斗场景,76行发生错误

有可能楼主用的是已经有存档的游戏,那个会出问题。如果是开的新游戏,应该不会有问题。
临时解决方法是在已经存档的游戏中临时使用脚本,对skills_exp哈希表进行初始化。
  1. for actor in $game_party.actors
  2.   actor.skills_exp = {}
  3. end
复制代码
这样,在主角再次学到技能的时候,就会有效果了。
有关这方面的我还会改,谢谢你的宝贵意见。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
59 小时
注册时间
2013-9-3
回帖
21
发表于 2013-9-22 20:06:14 | 显示全部楼层
RyanBern 发表于 2013-9-22 19:50
有可能楼主用的是已经有存档的游戏,那个会出问题。如果是开的新游戏,应该不会有问题。
临时解决方法是 ...

开新的可以了,不过变成打不到对方了。
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部