#------------------------------------------------------
# 自定义技能公式 by 灯笼菜刀君
#
# 用途, 和VA一样,可以对技能单独设置伤害计算公式
#
# 设置方法 技能引用公共事件, 并在公共事件第一行用注释, 内容:[公式]XXXXX,可以换行
# 不影响原本的公共事件调用,如果技能无需用到公共事件,就注释写完公式后放空
#
# 写法:
# [公式](a攻-b防)*a力
# 表示, 伤害值等于 攻方的攻击 - 受方的防御的差 乘上 攻方的力量
#
# [公式](a攻-b防)*a力 最大9999
# 公式后面加上 最大9999, 表示公式结果如果超过9999就只取值9999
#
# [公式](a攻-b防)*a力 最小1
# 公式后面加上 最小1, 表示公式结果如果低于1就取值1
#
# [公式](a攻-b防)*a力 最小1最大9999
# 最小和最大可以同时写,结果会在 1-9999 之间
#
#[公式] 100
# 固定伤害 100点(会受属性,分散度, 防御的修正)
#--------------------------------------------------------
# 公式里可使用的参数 注意符号都要用半角
#--------------------------------------------------------
# 备注: 最大N 写在公式最后,表示结果取值不超过N
# 最小N 写在公式最后,表示结果取值不低于N
# ※以上两个可以同时写,但是之间不能有空格或者其他符号
#
# 运算符号: 加+ ; 减- ; 乘* ; 除/ ; 除余%
#
# 能力对应写法,a表示攻方,b表示受方(注意都要用小写字母)两者都可以使用以下参数
# 攻击力: a攻 力量: a力 灵活: a灵 最大HP : aM血 ※M是大写
# 防御: a防 智力: a智 HP: a血 最大SP : aM蓝
# 特防: a特 速度: a速 SP: a蓝 等级 : a级 (敌人的话, 这个数值为
# 队伍里的最高等级)
# 特殊参数:
# v : v[1] 表示 1号变量的值
# 钱: 持有的金钱
# 步: 走过的步数
# 时: 游戏时间(秒)
# lv : 队伍总等级
# 人 : 队伍里存活的人数
# 尸 : 队伍里死掉的人数
# 怪 : 场上剩余的怪物数量
#------------------------------------------------------
module RPG
class Skill
def formula
return nil if @common_event_id == 0
return nil if $data_common_events[@common_event_id].list[0].code != 108
return nil if !$data_common_events[@common_event_id].list[0
].parameters[0].include?("[公式]")
f = $data_common_events[@common_event_id].list[0
].parameters[0].gsub("[公式]","")
for i in 1..5
if $data_common_events[@common_event_id].list[i] != nil and
$data_common_events[@common_event_id].list[i].code == 408
f += $data_common_events[@common_event_id].list[i].parameters[0]
end
end
return f
end
end
end
class Game_Battler
def diy_formula(user,skill_for)
if skill_for.nil?
return
end
a攻 = user.atk.to_f
a防 = user.pdef.to_f
a特 = user.mdef.to_f
a力 = user.str.to_f
a速 = user.agi.to_f
a灵 = user.dex.to_f
a智 = user.int.to_f
a血 = user.hp.to_f
aM血 = user.maxhp.to_f
a蓝 = user.sp.to_f
aM蓝 = user.maxsp.to_f
a级 = user.is_a?(Game_Actors) ? user.level.to_f : $game_party.max_level.to_f
b攻 = self.atk.to_f
b防 = self.pdef.to_f
b特 = self.mdef.to_f
b力 = self.str.to_f
b速 = self.agi.to_f
b灵 = self.dex.to_f
b智 = self.int.to_f
b血 = self.hp.to_f
bM血 = self.maxhp.to_f
b蓝 = self.sp.to_f
bM蓝 = self.maxsp.to_f
b级 = self.is_a?(Game_Actors) ? self.level.to_f : $game_party.max_level.to_f
v = $game_variables
钱 = $game_party.gold
步 = $game_party.steps
时 = Graphics.frame_count / Graphics.frame_rate
lv = 0
人 = 0
尸 = 0
for i in $game_party.actors
尸 += 1 if i.dead?
人 += 1 if i.exist?
lv += i.level
end
怪 = 0
for i in $game_troop.enemies
怪 += 1 if i.exist?
end
f = skill_for.split(/最大/)
f1 = f[0].split(/最小/)
f2 = f[1].nil? ? [] : f[1].split(/最小/)
if f1[1] != nil
big,small,fr = f[1],f1[1],f1[0]
elsif f2[1] != nil
big,small,fr = f2[0],f2[1],f[0]
elsif f[1] != nil
big,small,fr = f[1],nil,f[0]
else
big,small,fr = nil,nil,f[0]
end
eval("damage = (#{fr}).to_i")
damage = [damage,big.to_i].min if big != nil
damage = [damage,small.to_i].max if small != nil
self.damage = damage
end
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
#####菜刀到此一游####################################################
diy_formula(user,skill.formula)
#####################################################################
# 属性修正
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