仿VA自定义技能公式
其实就是想做做看..... 感觉有不少童鞋不理解默认的技能伤害公式设置, 如果不会设置默认, 干脆用自定义吧XD功能就是能像VA一样 单独设置技能的公式, 没设置的话就按XP默认的来,设置了自定义伤害计算后, 技能的属性克制, 分散度一样会影响最终结果, 如果需要固定伤害, 就去掉属性, 把分散度设置为0
另外增加了一些参数, 像金钱,时间, 步数, 队伍活着的人数, 死掉的人数之类的,可以用来做些奇葩技能......=.=
同时也加入了限制最大最小伤害的设置
设置方法 技能引用公共事件, 并在公共事件第一行用注释, 内容:[公式]XXXXX, 可以换行
不影响原本的公共事件调用,如果技能无需用到公共事件,就只注释写公式就可以了,具体公式写法看说明
冲突, 经芯大指点, 使用公共事件应该没冲突了
有覆盖了 def skill_effect(user, skill) , 其实就只加一句, 如果有改动过, 就把(菜刀到此一游的那句)复制到自己的脚本里就可以了
RUBY 代码
#------------------------------------------------------
# 自定义技能公式 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号变量的值
# 钱: 持有的金钱
# 步: 走过的步数
# 时: 游戏时间(秒)
# lv : 队伍总等级
# 人 : 队伍里存活的人数
# 尸 : 队伍里死掉的人数
# 怪 : 场上剩余的怪物数量
#------------------------------------------------------
module RPG
class Skill
def formula
returnnilif@common_event_id == 0
returnnilif$data_common_events[@common_event_id].list.code != 108
returnnilif !$data_common_events[@common_event_id].list[0
].parameters.include?("[公式]")
f = $data_common_events[@common_event_id].list[0
].parameters.gsub("[公式]","")
for i in1..5
if$data_common_events[@common_event_id].list != niland
$data_common_events[@common_event_id].list.code == 408
f += $data_common_events[@common_event_id].list.parameters
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
尸 += 1if i.dead?
人 += 1if i.exist?
lv += i.level
end
怪 = 0
for i in$game_troop.enemies
怪 += 1if i.exist?
end
f = skill_for.split(/最大/)
f1 = f.split(/最小/)
f2 = f.nil? ? [] : f.split(/最小/)
if f1 != nil
big,small,fr = f,f1,f1
elsif f2 != nil
big,small,fr = f2,f2,f
elsif f != nil
big,small,fr = f,nil,f
else
big,small,fr = nil,nil,f
end
eval("damage = (#{fr}).to_i")
damage = .minif big != nil
damage = .maxif 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 == 3or skill.scope == 4)andself.hp == 0)or
((skill.scope == 5or skill.scope == 6)andself.hp >= 1)
# 过程结束
returnfalse
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 = .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
# 伤害符号正确的情况下
ifself.damage > 0
# 防御修正
ifself.guarding?
self.damage /= 2
end
end
# 分散
if skill.variance > 0andself.damage.abs > 0
amp = .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 != 0and 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
本帖来自P1论坛作者灯笼菜刀王,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=477244若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页:
[1]