#============================================================================== # 回血变扣血的状态 ID DEDUCT_HP_STATE = 49 #============================================================================== 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 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 # 过程结束 return effective end #-------------------------------------------------------------------------- def item_effect(item) # 清除会心一击标志 self.critical = false # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、 # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下 if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or ((item.scope == 5 or item.scope == 6) and self.hp >= 1) # 过程结束 return false end # 清除有效标志 effective = false # 公共事件 ID 是有效的情况下,设置为有效标志 effective |= item.common_event_id > 0 # 命中判定 hit_result = (rand(100) < item.hit) # 不确定的特技的情况下设置为有效标志 effective |= item.hit < 100 # 命中的情况 if hit_result == true # 计算回复量 recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp if recover_hp < 0 recover_hp += self.pdef * item.pdef_f / 20 recover_hp += self.mdef * item.mdef_f / 20 recover_hp = [recover_hp, 0].min end # 属性修正 recover_hp *= elements_correct(item.element_set) recover_hp /= 100 recover_sp *= elements_correct(item.element_set) recover_sp /= 100 # 分散 if item.variance > 0 and recover_hp.abs > 0 amp = [recover_hp.abs * item.variance / 100, 1].max recover_hp += rand(amp+1) + rand(amp+1) - amp end if item.variance > 0 and recover_sp.abs > 0 amp = [recover_sp.abs * item.variance / 100, 1].max recover_sp += rand(amp+1) + rand(amp+1) - amp end # 回复量符号为负的情况下 if recover_hp < 0 # 防御修正 if self.guarding? recover_hp /= 2 end end # HP 回复量符号的反转、设置伤害值 self.damage = -recover_hp # HP 以及 SP 的回复 last_hp = self.hp last_sp = self.sp ###################################################################### if self.state?(DEDUCT_HP_STATE) and recover_hp > 0 recover_hp = -recover_hp end ###################################################################### self.hp += recover_hp self.sp += recover_sp effective |= self.hp != last_hp effective |= self.sp != last_sp # 状态变化 @state_changed = false effective |= states_plus(item.plus_state_set) effective |= states_minus(item.minus_state_set) # 能力上升值有效的情况下 if item.parameter_type > 0 and item.parameter_points != 0 # 能力值的分支 case item.parameter_type when 1 # MaxHP @maxhp_plus += item.parameter_points when 2 # MaxSP @maxsp_plus += item.parameter_points when 3 # 力量 @str_plus += item.parameter_points when 4 # 灵巧 @dex_plus += item.parameter_points when 5 # 速度 @agi_plus += item.parameter_points when 6 # 魔力 @int_plus += item.parameter_points end # 设置有效标志 effective = true end # HP 回复率与回复量为 0 的情况下 if item.recover_hp_rate == 0 and item.recover_hp == 0 # 设置伤害为空的字符串 self.damage = "" # SP 回复率与回复量为 0、能力上升值无效的情况下 if item.recover_sp_rate == 0 and item.recover_sp == 0 and (item.parameter_type == 0 or item.parameter_points == 0) # 状态没有变化的情况下 unless @state_changed # 伤害设置为 "Miss" self.damage = "Miss" end end end # Miss 的情况下 else # 伤害设置为 "Miss" self.damage = "Miss" end # 不在战斗中的情况下 unless $game_temp.in_battle # 伤害设置为 nil self.damage = nil end # 过程结束 return effective end end
#============================================================================== # ★★★★★★★★ 技能等級設定腳本 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 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
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
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |