#~ 使用方法:
#~ 技能备注里填写 [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 倍
#--------------------------------------------------------------------------
module Snstar2006
module Skill_LvUp
SKILL_LVUP_NO_FORGET = true # 升级时不遗忘旧技能
SKILL_MANUAL_LVUP = false # 手动升级
SKILL_RES_EXP_BASE = 2 # 升级点数基数,数字越大,获得越少
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_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?
return false if transformed
return true if SKILL_MANUAL_LVUP
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 = 0 # 纪录获取的技能升级点数
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)
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
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
[url=home.php?mod=space&uid=260100]@skill[/url] = 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
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