Project1
标题:
困扰了我2天,RTAB战斗如何做损伤(恢复)SP值的技能?
[打印本页]
作者:
daiboy12
时间:
2010-9-7 21:33
标题:
困扰了我2天,RTAB战斗如何做损伤(恢复)SP值的技能?
我想通过给技能属性来改变技能损伤SP值,也就是如果技能带有19号属性那么技能的伤害值就判定为SP,这样就能制作回复SP的技能了。
RTAB脚本太复杂,我简单试了一下下面的写法(在game_battler中),但是用起来好像不行,依旧是损伤HP。请教一下应该怎么写呢?
# HP の変動判定
if skill.element_set.include?(19)
last_sp = [[self.sp - self.damage[user], self.maxsp].min, 0].max
# 効果判定
effective |= self.sp != last_sp
else
last_hp = [[self.hp - self.damage[user], self.maxhp].min, 0].max
# 効果判定
effective |= self.hp != last_hp
end
复制代码
作者:
clap_pl
时间:
2010-9-8 01:40
本帖最后由 clap_pl 于 2010-9-8 02:07 编辑
仔细研究了一下 基本实现了这个功能 也不知道有没有什么不可预料的问题
效果如下
1.JPG
(15.28 KB, 下载次数: 15)
下载附件
保存到相册
2010-9-8 01:40 上传
击中后损耗SP的同时对其造成了等量伤害
怪物的SP损耗这么多而减为0了
2.JPG
(13.33 KB, 下载次数: 19)
下载附件
保存到相册
2010-9-8 01:27 上传
首先找到
RTAB 战斗系统
中的
def skill_effect(user,skill)
注意不是默认脚本列表里 Game_Battler 3里面的def skill_effect(user,skill)
否则改了无效
在这个函数中最后有一句
return effective
在这句话之前加上如下内容
#=============================
if skill.element_set.include?(19) #判断技能是否带有19号属性,如果带有,则为SP损耗技能
if self.damage[user] == "" or self.damage[user] == "Miss"
self.recover_sp[user] = 0 #如果技能未命中,则不损耗SP
else #反之如果技能命中,则损耗SP
self.recover_sp[user] = -self.damage[user]
#损耗SP的值为技能的伤害量,即技能的威力等关联属性可以控制SP损耗量
self.damage[user] = 0 #不造成伤害,如果想在损耗SP的同时造成等量伤害,这句话去掉。
#如果想在损耗SP的同时造成SP损耗半数伤害 则可以改成 self.damage[user] /=2, 以此类推
#这有点类似WAR3里面恶魔猎手的抽蓝技能了。
end
end
#=============================
此外在RTAB战斗系统中 找到如下函数
def damage_effect(battler, item)
在其中有这么一句
if item == 2
self.hp += self.recover_hp[battler]
self.sp += self.recover_sp[battler]
if self.recover_sp[battler] != 0
self.damage_sp[battler] = -self.recover_sp[battler]
end
else
在这之后加上如下内容
#======================================SP损伤
if self.recover_sp[battler] != 0 #如果sp恢复不为0,我们是通过SP的负恢复量代表损耗
self.damage_sp[battler] = self.recover_sp[battler]
self.sp += self.recover_sp[battler] #sp实际损耗
end
#==================================================
注意哦,如此修改之后,带有19号属性的技能的威力攻击力 等在数据库中设置的相关属性将影响sp伤害
而此技能的命中情况,以及分散度等等的计算都交给了技能原威力计算中完成,也就是说数据库中的数据修改都会有效,
这会比较方便。
如果不行,就要看看你的RTAB脚本了,我的是早些站上的RMXP增强补丁里面一起带的纵版战斗的RTAB
作者:
daiboy12
时间:
2010-9-9 19:54
用了楼上前辈的方法使用技能后会报错喔,问题好像出在伤害演算的self.recover_sp[battler] 里。还是感谢你,谢谢。
其实我不需要扣血的同时扣蓝这么复杂的脚本!我只需要在演算伤害的地方分歧,如果使用的是带有19号属性的技能的话那么本来HP扣伤害的就改成SP扣伤害。
请各位前辈再帮我看看吧!
作者:
clap_pl
时间:
2010-9-9 21:31
那只好请你附上你的RTAB脚本或简单工程了 脚本之间还是有冲突的
作者:
daiboy12
时间:
2010-9-10 22:18
本帖最后由 daiboy12 于 2010-9-10 22:41 编辑
问题出在
self.sp += self.recover_sp[battler] #sp
复制代码
实际损耗这一行,
报错是:TypeError,nil cannot convert Fixnum into String
好像是字符串问题啊……
还有,前辈,这是我的脚本,只发这一段可以吗?
#==============================================================================
# ■ Game_Battler (分割定義 1)
#------------------------------------------------------------------------------
# バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ
# スのスーパークラスとして使用されます。
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数追加
#--------------------------------------------------------------------------
attr_accessor :up_level # レベルアップ数
attr_accessor :at # AT(タイムゲージ)
attr_accessor :atp # AT(表示用)
attr_accessor :rt # RP(詠唱ゲージ)
attr_accessor :rtp # RP(詠唱必要量)
attr_accessor :spell # 合成スキル発動中
attr_accessor :recover_hp # HP回復量
attr_accessor :recover_sp # SP回復量
attr_accessor :state_p # ステータス異常配列
attr_accessor :state_m # ステータス異常配列
attr_accessor :damage_sp # SPダメージ表示フラグ
attr_accessor :animation # アニメーション ID, Hitの配列
attr_accessor :phase
attr_accessor :wait
attr_accessor :target
attr_accessor :anime1
attr_accessor :anime2
attr_accessor :event
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias :initialize_rtab :initialize
def initialize
initialize_rtab
@damage_pop = {}
@damage = {}
@damage_sp = {}
@critical = {}
@recover_hp = {}
@recover_sp = {}
@state_p = {}
@state_m = {}
@animation = []
@phase = 1
@wait = 0
@target = []
@anime1 = 0
@anime2 = 0
@event = 0
end
#--------------------------------------------------------------------------
# ● 存在判定
#--------------------------------------------------------------------------
def exist?
return (not @hidden and (@hp > 0 or @immortal or @damage_pop.size > 0))
end
#--------------------------------------------------------------------------
# ● ステートの解除
# state_id : ステート ID
# force : 強制解除フラグ (オートステートの処理で使用)
#--------------------------------------------------------------------------
def remove_state(state_id, force = false)
# このステートが付加されている場合
if state?(state_id)
# 強制付加されたステートで、かつ解除が強制ではない場合
if @states_turn[state_id] == -1 and not force
# メソッド終了
return
end
# 現在の HP が 0 かつ オプション [HP 0 の状態とみなす] が有効の場合
if @hp == 0 and $data_states[state_id].zero_hp
# ほかに [HP 0 の状態とみなす] ステートがあるかどうか判定
zero_hp = false
for i in @states
if i != state_id and $data_states[i].zero_hp
zero_hp = true
end
end
# 戦闘不能を解除してよければ、HP を 1 に変更
if zero_hp == false
@hp = 1
end
end
unless self.movable?
# ステート ID を @states 配列および @states_turn ハッシュから削除
@states.delete(state_id)
@states_turn.delete(state_id)
if self.movable?
self.at = 0
end
else
# ステート ID を @states 配列および @states_turn ハッシュから削除
@states.delete(state_id)
@states_turn.delete(state_id)
end
end
# HP および SP の最大値チェック
@hp = [@hp, self.maxhp].min
@sp = [@sp, self.maxsp].min
end
#--------------------------------------------------------------------------
# ● 通常攻撃の効果適用
# attacker : 攻撃者 (バトラー)
#--------------------------------------------------------------------------
def attack_effect(attacker)
# クリティカルフラグをクリア
self.critical[attacker] = false
state_p[attacker] = []
state_m[attacker] = []
# 第一命中判定
hit_result = (rand(100) < attacker.hit)
# 命中の場合
if hit_result == true
# 基本ダメージを計算
atk = [attacker.atk - self.pdef / 10, 0].max
self.damage[attacker] = atk * (20 + attacker.str) / 20
# 属性修正
self.damage[attacker] *= elements_correct(attacker.element_set)
self.damage[attacker] /= 100
# ダメージの符号が正の場合
if self.damage[attacker] > 0
# クリティカル修正
if rand(100) < 4 * attacker.dex / self.agi
self.damage[attacker] *= 2
self.critical[attacker] = true
end
# 防御修正
if self.guarding?
self.damage[attacker] /= 2
end
end
# 分散
if self.damage[attacker].abs > 0
amp = [self.damage[attacker].abs * 15 / 100, 1].max
self.damage[attacker] += rand(amp+1) + rand(amp+1) - amp
end
# 第二命中判定
eva = 8 * self.agi / attacker.dex + self.eva
hit = self.damage[attacker] < 0 ? 100 : 100 - eva
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
end
# 命中の場合
if hit_result == true
# ステート衝撃解除
remove_states_shock
# HP からダメージを減算
# ステート変化
@state_changed = false
states_plus(attacker, attacker.plus_state_set)
states_minus(attacker, attacker.minus_state_set)
# ミスの場合
else
# ダメージに "Miss" を設定
self.damage[attacker] = "Miss"
# クリティカルフラグをクリア
self.critical[attacker] = false
end
# メソッド終了
return true
end
#--------------------------------------------------------------------------
# ● スキルの効果適用
# user : スキルの使用者 (バトラー)
# skill : スキル
#--------------------------------------------------------------------------
def skill_effect(user, skill)
if skill.element_set.include?(19)
$game_switches[1] = true
else
$game_switches[1] = false
end
# クリティカルフラグをクリア
self.critical[user] = false
state_p[user] = []
state_m[user] = []
# スキルの効果範囲が 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 / 20
if power > 0
power -= self.pdef * skill.pdef_f / 1000
power -= self.mdef * skill.mdef_f / 1000
power = [power, 0].max
end
# 倍率を計算
rate = 20
rate += (user.str * skill.str_f / 20)
rate += (user.dex * skill.dex_f / 20)
rate += (user.agi * skill.agi_f / 20)
rate += (user.int * skill.int_f / 20)
# 基本ダメージを計算
self.damage[user] = power * rate / 20
# 属性修正
self.damage[user] *= elements_correct(skill.element_set)
self.damage[user] /= 100
# ダメージの符号が正の場合
if self.damage[user] > 0
# 防御修正
if self.guarding?
self.damage[user] /= 2
end
end
# 分散
if skill.variance > 0 and self.damage[user].abs > 0
amp = [self.damage[user].abs * skill.variance / 100, 1].max
self.damage[user] += rand(amp+1) + rand(amp+1) - amp
end
# 第二命中判定
eva = 8 * self.agi / user.dex + self.eva
hit = self.damage[user] < 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.damage[user], self.maxhp].min, 0].max
# 効果判定
effective |= self.hp != last_hp
# ステート変化
@state_changed = false
effective |= states_plus(user, skill.plus_state_set)
effective |= states_minus(user, skill.minus_state_set)
unless $game_temp.in_battle
self.damage_effect(user, 1)
end
# 威力が 0 の場合
if skill.power == 0
# ダメージに空文字列を設定
self.damage[user] = ""
# ステートに変化がない場合
unless @state_changed
# ダメージに "Miss" を設定
self.damage[user] = "Miss"
end
end
# ミスの場合
else
# ダメージに "Miss" を設定
self.damage[user] = "Miss"
end
# 戦闘中でない場合
unless $game_temp.in_battle
# ダメージに nil を設定
self.damage[user] = nil
end
if skill.element_set.include?(19) #判断技能是否带有19号属性,如果带有,则为SP损耗技能
if self.damage[user] == "" or self.damage[user] == "Miss"
self.recover_sp[user] = 0 #如果技能未命中,则不损耗SP
else #反之如果技能命中,则损耗SP
self.recover_sp[user] = -self.damage[user].to_s
#损耗SP的值为技能的伤害量,即技能的威力等关联属性可以控制SP损耗量
self.damage[user] = 0 #不造成伤害,如果想在损耗SP的同时造成等量伤害,这句话去掉。
#如果想在损耗SP的同时造成SP损耗半数伤害 则可以改成 self.damage[user] /=2, 以此类推
#这有点类似WAR3里面恶魔猎手的抽蓝技能了。
end
end
return effective
end
#--------------------------------------------------------------------------
# ● アイテムの効果適用
# item : アイテム
#--------------------------------------------------------------------------
def item_effect(item, user = $game_party.actors[0])
# クリティカルフラグをクリア
self.critical[user] = false
state_p[user] = []
state_m[user] = []
# アイテムの効果範囲が 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
# 回復量を計算
self.recover_hp[user] = maxhp * item.recover_hp_rate / 100 +
item.recover_hp
self.recover_sp[user] = maxsp * item.recover_sp_rate / 100 +
item.recover_sp
if self.recover_hp[user] < 0
self.recover_hp[user] += self.pdef * item.pdef_f / 20
self.recover_hp[user] += self.mdef * item.mdef_f / 20
self.recover_hp[user] = [self.recover_hp[user], 0].min
end
# 属性修正
self.recover_hp[user] *= elements_correct(item.element_set)
self.recover_hp[user] /= 100
self.recover_sp[user] *= elements_correct(item.element_set)
self.recover_sp[user] /= 100
# 分散
if item.variance > 0 and self.recover_hp[user].abs > 0
amp = [self.recover_hp[user].abs * item.variance / 100, 1].max
self.recover_hp[user] += rand(amp+1) + rand(amp+1) - amp
end
if item.variance > 0 and self.recover_sp[user].abs > 0
amp = [self.recover_sp[user].abs * item.variance / 100, 1].max
self.recover_sp[user] += rand(amp+1) + rand(amp+1) - amp
end
# 回復量の符号が負の場合
if self.recover_hp[user] < 0
# 防御修正
if self.guarding?
self.recover_hp[user] /= 2
end
end
# HP 回復量の符号を反転し、ダメージの値に設定
self.damage[user] = -self.recover_hp[user]
# HP および SP の変動判定
last_hp = [[self.hp + self.recover_hp[user], self.maxhp].min, 0].max
last_sp = [[self.sp + self.recover_sp[user], self.maxsp].min, 0].max
effective |= self.hp != last_hp
effective |= self.sp != last_sp
# ステート変化
@state_changed = false
effective |= states_plus(user, item.plus_state_set)
effective |= states_minus(user, item.minus_state_set)
unless $game_temp.in_battle
self.damage_effect(user, 2)
end
# パラメータ上昇値が有効の場合
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[user] = ""
# 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[user] = "Miss"
end
end
end
# ミスの場合
else
# ダメージに "Miss" を設定
self.damage[user] = "Miss"
end
# 戦闘中でない場合
unless $game_temp.in_battle
# ダメージに nil を設定
self.damage[user] = nil
end
# メソッド終了
return effective
end
#--------------------------------------------------------------------------
# ● ステート変化 (+) の適用
# plus_state_set : ステート変化 (+)
#--------------------------------------------------------------------------
def states_plus(battler, plus_state_set)
# 有効フラグをクリア
effective = false
# ループ (付加するステート)
for i in plus_state_set
# このステートが防御されていない場合
unless self.state_guard?(i)
# このステートがフルでなければ有効フラグをセット
effective |= self.state_full?(i) == false
# ステートが [抵抗しない] の場合
if $data_states[i].nonresistance
# ステート変化フラグをセット
@state_changed = true
# ステートを付加
add_state(i)
# このステートがフルではない場合
elsif self.state_full?(i) == false
# ステート有効度を確率に変換し、乱数と比較
if rand(100) < [0,100,80,60,40,20,0][self.state_ranks[i]]
# ステート変化フラグをセット
@state_changed = true
# ステートを付加
self.state_p[battler].push(i)
end
end
end
end
# メソッド終了
return effective
end
#--------------------------------------------------------------------------
# ● ステート変化 (-) の適用
# minus_state_set : ステート変化 (-)
#--------------------------------------------------------------------------
def states_minus(battler, minus_state_set)
# 有効フラグをクリア
effective = false
# ループ (解除するステート)
for i in minus_state_set
# このステートが付加されていれば有効フラグをセット
effective |= self.state?(i)
# ステート変化フラグをセット
@state_changed = true
# ステートを解除
self.state_m[battler].push(i)
end
# メソッド終了
return effective
end
#--------------------------------------------------------------------------
# ● ダメージ演算
#--------------------------------------------------------------------------
def damage_effect(battler, item)
if item == 2
self.hp += self.recover_hp[battler]
self.sp += self.recover_sp[battler]
if self.recover_sp[battler] != 0
self.damage_sp[battler] = self.recover_sp[battler]
end
else
if self.recover_sp[battler] != 0 #如果sp恢复不为0,我们是通过SP的负恢复量代表损耗
self.damage_sp[battler] = self.recover_sp[battler]
self.sp += self.recover_sp[battler] #sp实际损耗
end
if self.damage[battler].class != String
self.hp -= self.damage[battler]
end
end
for i in self.state_p[battler]
add_state(i)
end
for i in self.state_m[battler]
remove_state(i)
end
end
#--------------------------------------------------------------------------
# ● スリップダメージの効果適用
#--------------------------------------------------------------------------
def slip_damage_effect
# ダメージを設定
self.damage["slip"] = self.dex + self.agi - self.str
# 分散
if self.damage["slip"].abs > 0
amp = [self.damage["slip"].abs * 15 / 100, 1].max
self.damage["slip"] += rand(amp+1) + rand(amp+1) - amp
end
# HP からダメージを減算
self.hp -= self.damage["slip"]
# メソッド終了
return true
end
end
复制代码
这个脚本已经加入了您写的脚本,就是这个脚本我用起来会出问题。我只在属性F对技能的影响和毒的伤害这两个地方改动过,其他的应该是原封的了。
请您再帮我看一看,麻烦您了啊……
作者:
clap_pl
时间:
2010-9-11 10:56
我看过了,我把你的脚本丢到我的游戏里是正常的
唯一出错的地方是这句
self.recover_sp[user] = -self.damage[user].to_s
这句 我记得我写的是
self.recover_sp[user] = -self.damage[user]
不用转数据格式
如果不是这里出问题,单凭这个脚本我检查不出其他问题
作者:
daiboy12
时间:
2010-9-11 11:23
本帖最后由 daiboy12 于 2010-9-11 11:29 编辑
啊 是的 这是我出了问题之后自己加上去的,忘记删掉了对不起。不麻烦您再另外写啦,把您的脚本给我吧,我再试试看行不。
我刚刚新建了个工程吧脚本放了进去还是不行。看来是我RTAB脚本的问题了。
作者:
clap_pl
时间:
2010-9-13 12:12
我的RTAB已经被我改得面目全非了 改动了很多窗口 找不到纯净版的了-。-
作者:
zcgsw123
时间:
2010-9-13 12:51
提示:
作者被禁止或删除 内容自动屏蔽
作者:
daiboy12
时间:
2010-9-13 19:06
要不前辈您看看错误代码是怎么回事吧!感觉好像不难解决的样子。
是在不行就只能麻烦前辈看看这个了,我用的RTAB脚本是这个。
http://rpg.blue/upload_program/files/RTAB.txt
感激不尽!
作者:
clap_pl
时间:
2010-9-18 04:39
外出4天-。-
久等- -
试了下 那个问题不是每次都会出现
你把加上去的脚本中的下面一句
if self.recover_sp[battler] != 0 #如果sp恢复不为0,我们是通过SP的负恢复量代表损耗
改成
if self.recover_sp[battler] != 0 and self.recover_sp[battler] != nil
试试 应该不会有问题了
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1