#============================================================================== # ■ 自訂技能傷害公式 #------------------------------------------------------------------------------ # 仿照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
灯笼菜刀王 发表于 2020-3-19 00:58
仿VA的自定义公式
写法 [公式]-(17 + a等 * 3)
1.png (16.46 KB, 下载次数: 21)
灯笼菜刀王 发表于 2020-3-19 00:58
仿VA的自定义公式
写法 [公式]-(17 + a等 * 3)
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |