赞 | 406 |
VIP | 0 |
好人卡 | 11 |
积分 | 390 |
经验 | 242285 |
最后登录 | 2024-11-29 |
在线时间 | 5725 小时 |
Lv5.捕梦者
- 梦石
- 0
- 星屑
- 39034
- 在线时间
- 5725 小时
- 注册时间
- 2006-11-10
- 帖子
- 6622
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 灯笼菜刀王 于 2020-3-19 17:25 编辑
其实就是想做做看..... 感觉有不少童鞋不理解默认的技能伤害公式设置, 如果不会设置默认, 干脆用自定义吧XD
功能就是能像VA一样 单独设置技能的公式, 没设置的话就按XP默认的来, 设置了自定义伤害计算后, 技能的属性克制, 分散度一样会影响最终结果, 如果需要固定伤害, 就去掉属性, 把分散度设置为0
另外增加了一些参数, 像金钱,时间, 步数, 队伍活着的人数, 死掉的人数之类的, 可以用来做些奇葩技能......=.=
同时也加入了限制最大最小伤害的设置
设置方法 技能引用公共事件, 并在公共事件第一行用注释, 内容:[公式]XXXXX, 可以换行
不影响原本的公共事件调用,如果技能无需用到公共事件,就只注释写公式就可以了,具体公式写法看说明
冲突, 经芯大指点, 使用公共事件应该没冲突了
有覆盖了 def skill_effect(user, skill) , 其实就只加一句, 如果有改动过, 就把(菜刀到此一游的那句)复制到自己的脚本里就可以了
#------------------------------------------------------ # 自定义技能公式 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
#------------------------------------------------------
# 自定义技能公式 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
|
评分
-
查看全部评分
|