#==============================================================================
# ■ 自訂技能傷害公式
#------------------------------------------------------------------------------
# 仿照VX ACE的自訂公式,公式基本上是照搬
# 只要設定好屬性(啟動用)和對應的公式就能作用
# 自訂公式只跳脫技能資料庫的【素質需求】部分,
# 屬性加乘、迴避、分散度仍照內建公式
#==============================================================================
module Skill_Custom
#--------------------------------------------------------------------------
# ● 使用者修改項目1:自訂公式的屬性名稱
#--------------------------------------------------------------------------
# 在資料庫設定同名屬性,技能只要勾選該屬性就會偵測腳本的自訂公式
# 如果有勾選屬性沒設定公式傷害會變為 0
#--------------------------------------------------------------------------
CUSTOM_ELE = "自訂公式"
#--------------------------------------------------------------------------
# ● 使用者修改項目2:自訂公式(編輯格式:技能ID => 公式,每個公式用逗號隔開)
#--------------------------------------------------------------------------
# <變量說明>
# power:在資料庫設定的技能威力
# g:隊伍目前持有金錢
# v[n]:使用事件n號變數的值 (ex: v[5],使用5號變數的值)
# rand(n):亂數,最高到n-1,最小為0
# a: 技能使用者
# b:目標
=begin
==============================================================================
■ a(技能使用者)和b(目標)可用的變量,
基本上就是Game_Battler所有的數值變量
------------------------------------------------------------------------------
使用例:(a.atk + a.int)*2 - (b.pdef/2) (使用者atk + 使用者int)*2 - 對像物防/2
==============================================================================
hp 現有HP
maxhp 最大HP
sp 現有sp
maxsp 最大SP
atk 攻擊力
str 力量
agi 敏捷
dex 熟練
int 智力
pdef 物防
mdef 魔防
eva 迴避率
level 等級(我方限定)
exp 經驗值(我方限定)
=end
#--------------------------------------------------------------------------
# ● 使用例:
# power + a.int*2 - b.mdef/2 + v[3] (技能威力 + 使用者int*2 - 敵方魔防/2 + 變數3的值)
# power + g + a.atk (技能威力 + 現有金錢 + 使用者atk)
# power + rand(100) - 50 (技能威力 + -50~49浮動值)
# a.level + v[10] (使用者等級 + 變數10的值)
#--------------------------------------------------------------------------
CUSTOM_FORMULA = {
1 => "power * a.level", # 1號技能 (威力*使用者等級)
2 => "power * v[1]", # 2號技能 (威力*1號變數)
3 => "power + g", # 3號技能 (威力+隊伍持有金錢)
4 => "power ** b.str" # 4號技能 (威力為目標力量的平方倍)
}
end
#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
# 處理戰鬥者的類。作為 Game_Actor 與 Game_Enemy 的父類使用。
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 自訂公式傷害處理
# a:攻擊方 (技能使用者)
# b:防禦方 (目標)
# skill:技能
# recover:恢復技判定(值為1或-1,資料庫設定傷害值負的會判定為恢復技)
#--------------------------------------------------------------------------
def custom_result(a, b, skill, recover)
formula = Skill_Custom::CUSTOM_FORMULA[skill.id]
power = (skill.power).abs
v = $game_variables
g = $game_party.gold
begin
result = [eval(formula).round, 0].max * recover
return result
rescue
if formula == nil
p "錯誤:技能的自訂公式不存在"
return 0
end
if skill == nil
p "錯誤:技能本身不存在"
return 0
end
p "錯誤:技能公式有誤"
return 0
end
end
#--------------------------------------------------------------------------
# ● 套用技能效果
# user : 技能的使用者 (battler)
# skill : 技能
#--------------------------------------------------------------------------
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
# 有自訂公式的情況下
if skill.element_set.include?($data_system.elements.index(Skill_Custom::CUSTOM_ELE))
sign = (skill.power >= 0) ? 1 : -1
self.damage = custom_result(user, self, skill, sign)
# 沒有的情況,使用原本的計算方式
else
# 計算威力
power = skill.power + user.atk * skill.atk_f / 100
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
end # 分歧結束,以下內容維持不變
# 屬性修正
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
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
# 過程結束
return effective
end
end