赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 5 |
经验 | 920 |
最后登录 | 2024-2-8 |
在线时间 | 50 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 511
- 在线时间
- 50 小时
- 注册时间
- 2009-7-1
- 帖子
- 87
|
5楼
楼主 |
发表于 2010-9-10 22:18:24
|
只看该作者
本帖最后由 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对技能的影响和毒的伤害这两个地方改动过,其他的应该是原封的了。
请您再帮我看一看,麻烦您了啊…… |
|