DEDUCT_HP_STATE = 49
#==============================================================================
# ★★★★★★★★ 技能等級設定腳本 BY:愚零鬥武多 ★★★★★★★★
# ■想要用別客氣就直接拿去吧,腳本這種東西哪有版權可言=.=|||
#==============================================================================
# 此腳本可實現技能累積使用次數增加熟練度藉以提升技能等級的功能
# 每位角色會自動在程式中建立專屬技能熟練與等級的資料庫,跟隨存檔
# 適合想脫離常規技能製作的製作者,難度中等
# 目前只有攻擊和回復技能威力會受等級影響,其他狀態添加類或地圖技能
# 有興趣者可自行在def skill_effect(user, skill)添加功能
# ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
# 技能的設定法:
# SKILL_EXP_LIST =
# {
# 技能ID=>[等級2累積熟練度,等級3累積熟練度,等級4累積熟練度..],
# "END"=>0}
# ◆範例:
# SKILL_EXP_LIST =
# {
# 1=>[2,4,6],
# 2=>[4,8],
# 10=>[12,18,22,38],
# "END"=>0}
# ◆說明:
#1號技能=>[LV2熟練度須達2,LV3熟練度須達4,LV4熟練度須達6],
#2號技能=>[LV2熟練度須達4,LV3熟練度須達8],
#10號技能=>[LV2熟練度須達12,LV3熟練度須達18,LV4熟練度須達22,LV4熟練度須達38],
#[ ]裏的內容數量+1就是該技能的最高等級
#末尾要加"END"=>0}沒啥意義,方便設定而已
#沒有設定到的技能ID不受影響就照正常顯示
#有設定到的技能在技能名稱後面會自動顯示其等級,說明後面會自動出現熟練度
# ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
# 技能熟練度的增加:
# 只要傷害或回復值不為Miss成功使用的狀態下熟練度就+1
# ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
# 技能的威力設定:
# 內建為技能威力+技能威力*技能等級*倍率
# 倍率可以在腳本中搜尋S_PLUS = {}請自行修改,值越大等級影響威力越顯著
# 修改法S_PLUS[技能ID] = 倍率
# 沒有設定到的技能ID是以倍率0設定,也就是技能威力不受技能等級影響
# ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
# 技能經驗值與等級用語設定:
# 請在腳本中搜尋
# S_EXP = "熟練度:"
# S_LV = "LV"
# 請自行修改用語
# ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
#==============================================================================
# ■ 所有技能升級所需list列表設定
#==============================================================================
SKILL_EXP_LIST =
{
1=>[5,10,15,20,25,30,35,40,45,50],
"END"=>0}
#==============================================================================
# ■ 技能經驗值與等級用語設定
#==============================================================================
S_EXP = "熟練度:"
S_LV = "-LV"
#==============================================================================
# ■ 每提升1級等級的技能威力倍率(自行添加設定)
#==============================================================================
S_PLUS = {}
S_PLUS[1] = 0.2
#==============================================================================
# ■ Game_Actor添加可存取的技能等級與熟練度資料
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 讀取技能附加威力
#--------------------------------------------------------------------------
def skill_power_plus(skill)
plus = S_PLUS[skill.id] != nil ? S_PLUS[skill.id] : 0
# 技能威力*角色對應該技能等級*倍率
return Integer(skill.power*self.skill_lv[skill.id]*plus)
end
#--------------------------------------------------------------------------
# ● 讀取技能經驗值資料
#--------------------------------------------------------------------------
def skill_exps
# 初始化@skill_exps
@skill_exps = [] if @skill_exps == nil
# 生成技能經驗值資料
for i in 1...$data_skills.size
if @skill_exps[i] == nil
@skill_exps[i] = 0
end
end
return @skill_exps
end
#--------------------------------------------------------------------------
# ● 寫入技能經驗值資料
#--------------------------------------------------------------------------
def push_skill_exps(id,exp)
self.skill_exps
if SKILL_EXP_LIST[id] != nil
t_max = SKILL_EXP_LIST[id][SKILL_EXP_LIST[id].size-1]
@skill_exps[id] = [@skill_exps[id]+exp,t_max].min
end
end
#--------------------------------------------------------------------------
# ● 讀取技能等級
#--------------------------------------------------------------------------
def skill_lv
# 初始化@skill_lv
@skill_lv = [] if @skill_lv == nil
# 生成並計算技能等級資料
for i in 1...$data_skills.size
list = SKILL_EXP_LIST[i]
# 沒有被規劃到的技能list就設為[0]
list = [0] if list == nil
exp = skill_exps[i]
# 計算對應熟練度的等級
@skill_lv[i] = 0
for index in 0...list.size
if exp >= list[index]
@skill_lv[i] = [@skill_lv[i]+1,list.size].min
end
end
end
return @skill_lv
end
end
#==============================================================================
# ■ Window_Skill技能help窗口說明增設exp與lv字串
#==============================================================================
class Window_Skill < Window_Selectable
#--------------------------------------------------------------------------
# ● 描繪項目
#--------------------------------------------------------------------------
def draw_item(index)
skill = @data[index]
if @actor.skill_can_use?(skill.id)
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
# 技能熟練list存在時,技能名稱添加等級字串
if SKILL_EXP_LIST[skill.id] != nil
id = skill.id
lv = @actor.skill_lv[id]
list = SKILL_EXP_LIST
t_lv = lv >= list[id].size ? "MAX" : (lv+1).to_s
text = S_LV+t_lv
else
text = ""
end
x = 4 + index % 2 * (288 + 32)
y = index / 2 * 32
rect = Rect.new(x, y, self.width / @column_max - 32, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
bitmap = RPG::Cache.icon(skill.icon_name)
opacity = self.contents.font.color == normal_color ? 255 : 128
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
self.contents.draw_text(x + 28, y, 204, 32, skill.name+text, 0)
self.contents.draw_text(x + 232, y, 48, 32, skill.sp_cost.to_s, 2)
end
#--------------------------------------------------------------------------
# ● 更新提示內容
#--------------------------------------------------------------------------
def update_help
# 有按下按鈕的情形才update
if Input.dir4 != 0 or Input.press?(Input::C) or Input.press?(Input::B)
# 技能為空的情況,說明設為空
if self.skill == nil
text = ""
else
# 技能熟練list存在時,說明添加熟練度字串
if SKILL_EXP_LIST[self.skill.id] != nil
id = self.skill.id
lv = @actor.skill_lv[id]
list = SKILL_EXP_LIST
m_exp = list[id][[lv,list[id].size-1].min].to_s
exp = S_EXP+@actor.skill_exps[id].to_s+"/"+m_exp
text = self.skill.description+"("+exp+")"
else
text = self.skill.description
end
end
# 設定help窗口
@help_window.set_text(text)
end
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 應用特技效果
#--------------------------------------------------------------------------
def skill_effect(user, skill)
# 清除會心一擊標誌
self.critical = false
# 特技的效果範圍是 HP 1 以上的我方、自己的 HP 為 0、
# 或者特技的效果範圍是 HP 0 的我方、自己的 HP 為 1 以上的情況下
if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
# 過程結束
return false
end
# 清除有效標誌
effective = false
# 共通事件 ID 是有效的情況下,設定為有效標誌
effective |= skill.common_event_id > 0
# 第一命中判斷
hit = skill.hit
if skill.atk_f > 0
hit *= user.hit / 100
end
hit_result = (rand(100) < hit)
# 不確定特技的情況下設定為有效標誌
effective |= hit < 100
# 命中的情況下
if hit_result == true
# 計算威力
power = skill.power + user.atk * skill.atk_f / 100
# 我方使用的情形
if user.is_a?(Game_Actor)
# 計算技能等級的附加威力
power += user.skill_power_plus(skill)
end
if power > 0
power -= self.pdef * skill.pdef_f / 200
power -= self.mdef * skill.mdef_f / 200
power = [power, 0].max
end
# 計算倍率
rate = 20
rate += (user.str * skill.str_f / 100)
rate += (user.dex * skill.dex_f / 100)
rate += (user.agi * skill.agi_f / 100)
rate += (user.int * skill.int_f / 100)
# 計算基本傷害
self.damage = power * rate / 20
# 屬性修正
self.damage *= elements_correct(skill.element_set)
self.damage /= 100
# 傷害符號正確的情況下
if self.damage > 0
# 防禦修正
if self.guarding?
self.damage /= 2
end
end
# 分散
if skill.variance > 0 and self.damage.abs > 0
amp = [self.damage.abs * skill.variance / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# 第二命中判斷
eva = 8 * self.agi / user.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
# 不確定特技的情況下設定為有效標誌
effective |= hit < 100
end
# 命中的情況下
if hit_result == true
# 威力 0 以外的物理攻擊的情況下
if skill.power != 0 and skill.atk_f > 0
# 狀態衝擊解除
remove_states_shock
# 設定有效標誌
effective = true
end
# HP 的傷害減法運算
last_hp = self.hp
#########################################################################
if self.state?(DEDUCT_HP_STATE) and self.damage <0
self.damage = -self.damage
end
#########################################################################
self.hp -= self.damage
effective |= self.hp != last_hp
# 狀態變化
@state_changed = false
effective |= states_plus(skill.plus_state_set)
effective |= states_minus(skill.minus_state_set)
# 威力為 0 的場合
if skill.power == 0
# 傷害設定為空的字串
self.damage = ""
# 狀態沒有變化的情況下
unless @state_changed
# 傷害設定為 "Miss"
self.damage = "Miss"
end
end
# Miss 的情況下
else
# 傷害設定為 "Miss"
self.damage = "Miss"
end
# 不在戰鬥中的情況下
unless $game_temp.in_battle
# 傷害設定為 nil
self.damage = nil
end
# 使用者是我方的情形
if user.is_a?(Game_Actor)
# 有效使用的情況,熟練度+1
if effective && self.damage != "Miss"
user.push_skill_exps(skill.id,1)
end
end
# 過程結束
return effective
end
end