請問如何讓狀態消失的判斷是看次數?

上一篇主題 下一篇主題 向下

請問如何讓狀態消失的判斷是看次數?

發表  leoyayaleo 于 周五 7月 30, 2010 11:03 am

目前RMXP的狀態要解除只有回合數到以及被攻擊後機率解除
不過我想問 狀態的解除可以是看次數決定嗎?
例如: 這是一個增防結界 被攻擊3次後 狀態自動解除
若是都沒被攻擊則永久存在
或者是一個增攻狀態 在主動攻擊敵人3次或1次後 狀態自動解除
若是沒有主動攻擊則永久存在

不曉得能不能做到這樣的效果?@@
希望知道的人能幫我解答 感謝><

leoyayaleo
賣彩色內褲的小鱉三
賣彩色內褲的小鱉三

文章數 : 8
注冊日期 : 2009-03-14

檢視會員個人資料

回頂端 向下

回復: 請問如何讓狀態消失的判斷是看次數?

發表  安里 于 周五 7月 30, 2010 5:43 pm

幫你寫好了
蠻瞎的
裡面有解說
不會再問
或是有BUG也歡迎提出


代碼:
#===================================================================
#解除狀態規則更改V1.00
#BY 金也安里
#===================================================================
=begin
====================================
●功能:
====================================

改變內建狀態解除的限制,採取回合的方式解除(內建的功能不會消失)

====================================
●使用方法:
====================================

在資料庫裡的狀態設定中,將狀態的名稱欄位格式更改成

狀態名,解除狀態的種類代碼,經果幾次後解除

例: (狀態名),(種類代碼),(經過次數)

==========================================================
   
    狀態名稱欄位: 死神結界,5,10
   
    意思是狀態名稱為死神結界,經過10次被攻擊時解除狀態
   
==========================================================
       
    狀態名稱欄位: 憤怒,0,3
   
    意思是狀態名稱為憤怒,使用普通攻擊3次時解除狀態

==========================================================

解除狀態種類與其代碼參考

(代碼)(解除狀態的種類)

  0 : 使用普通攻擊時
  1 : 使用技能攻擊時
  2 : 被普通攻擊時
  3 : 被技能攻擊時
  4 : 使用攻擊時
  5 : 被攻擊時
  6 : 防禦狀態被攻擊時

=end
module RPG
  class State
    attr_accessor :spcl_remove_type
    attr_accessor :spcl_remove_turn
    def name
      name = @name.split(/,/)[0]
      return name != nil ? name : ""
    end
    def spcl_remove_type
      type = @name.split(/,/)[1]
      return type != nil ? type.to_i : 0
    end
    def spcl_remove_turn
      turn = @name.split(/,/)[2]
      return turn != nil ? turn.to_i : 0
    end
  end
end

     
#==============================================================================
# ■ Game_Battler
#==============================================================================
#atkr defr sklr e_atkr e_defr e_sklr
class Game_Battler
  alias add_initialize initialize unless $F12_Check == true
  def initialize
    add_initialize
    @spcl_remove_turns = [[],[]]
    for i in 1...$data_states.size
      @spcl_remove_turns[0][i] = $data_states[i].spcl_remove_turn
      @spcl_remove_turns[1][i] = $data_states[i].spcl_remove_turn
    end
  end
  def spcl_remove_sta(type,owner)
    for i in @states.clone
      if $data_states[i].spcl_remove_type == type
        if @spcl_remove_turns[owner][i] > 0
          @spcl_remove_turns[owner][i] -= 1
        elsif @spcl_remove_turns[owner][i] <= 0
          remove_state(i)
        end
      end
    end
  end
    #--------------------------------------------------------------------------
  # ● 應用通常攻擊效果
  #    attacker : 攻擊者 (battler)
  #--------------------------------------------------------------------------
  alias add_attack_effect attack_effect  unless $F12_Check == true
  def attack_effect(attacker)
      add_attack_effect(attacker)
      a = self.is_a?(Game_Actor) ? 0 : 1
      b = a == 1 ? 0 : 1
      spcl_remove_sta(0,a)
      spcl_remove_sta(4,a)
      spcl_remove_sta(2,b)
      spcl_remove_sta(5,b)
      if self.guarding?
        spcl_remove_sta(6,b)
      end
  end
  #--------------------------------------------------------------------------
  # ● 應用特技效果
  #    user  : 特技的使用者 (battler)
  #    skill : 特技
  #--------------------------------------------------------------------------
  alias add_skill_effect skill_effect  unless $F12_Check == true
  def skill_effect(user, skill)
    add_skill_effect(user, skill)
    a = self.is_a?(Game_Actor) ? 0 : 1
    b = a == 1 ? 0 : 1
    spcl_remove_sta(1,a)
    spcl_remove_sta(4,a)
    spcl_remove_sta(3,b)
    spcl_remove_sta(5,b)
    if self.guarding?
      spcl_remove_sta(6,b)
    end
  end
end
$F12_Check = true
#==============================================================================
#轉載此腳本 請保留此行文字 BY RMXP小屋 金也安里
#[url]http://www.wretch.cc/blog/hauhauchen[/url]
#==============================================================================
avatar
安里
拿著木劍的戰士
拿著木劍的戰士

文章數 : 20
注冊日期 : 2009-12-29

檢視會員個人資料

回頂端 向下

回復: 請問如何讓狀態消失的判斷是看次數?

發表  leoyayaleo 于 周日 8月 01, 2010 11:14 am

非常感謝大大的幫助@@

我去試試看

leoyayaleo
賣彩色內褲的小鱉三
賣彩色內褲的小鱉三

文章數 : 8
注冊日期 : 2009-03-14

檢視會員個人資料

回頂端 向下

回復: 請問如何讓狀態消失的判斷是看次數?

發表  leoyayaleo 于 周二 8月 03, 2010 1:52 am

[quote="安里"]幫你寫好了
蠻瞎的
裡面有解說
不會再問
或是有BUG也歡迎提出




我測試後發現幾個問題@@

就是如果是設定被攻擊3次被解除的結界狀態
那麼敵人不管有沒有打到都會減少次數

如果敵人都沒攻擊
自己使用增益技能也會減少次數

主動攻擊次數的狀態則是無法消除
也就是說狀態會一直存在@@
普通攻擊的種類跟特技攻擊的種類都一樣

如果狀態在解除後 再使用這項結界技能
就會無法再附上這個狀態了
不管是主動攻擊還是被攻擊的種類都一樣

leoyayaleo
賣彩色內褲的小鱉三
賣彩色內褲的小鱉三

文章數 : 8
注冊日期 : 2009-03-14

檢視會員個人資料

回頂端 向下

回復: 請問如何讓狀態消失的判斷是看次數?

發表  安里 于 周二 8月 03, 2010 11:10 am

再試試看吧
把舊的全部刪掉
這是新的
代碼:
#===================================================================
#解除狀態規則更改V1.00
#BY 金也安里
#===================================================================
=begin
====================================
●功能:
====================================

改變內建狀態解除的限制,採取回合的方式解除(內建的功能不會消失)

====================================
●使用方法:
====================================

在資料庫裡的狀態設定中,將狀態的名稱欄位格式更改成

狀態名,解除狀態的種類代碼,經果幾次後解除

例: (狀態名),(種類代碼),(經過次數)

==========================================================
   
    狀態名稱欄位: 死神結界,5,10
   
    意思是狀態名稱為死神結界,經過10次被攻擊時解除狀態
   
==========================================================
       
    狀態名稱欄位: 憤怒,0,3
   
    意思是狀態名稱為憤怒,使用普通攻擊3次時解除狀態

==========================================================

解除狀態種類與其代碼參考(以下都是命中的情況)

(代碼)(解除狀態的種類)

  0 : 使用普通攻擊時
  1 : 使用技能攻擊時
  2 : 被普通攻擊時
  3 : 被技能攻擊時
  4 : 使用攻擊時
  5 : 被攻擊時
  6 : 防禦狀態被攻擊時

=end
module RPG
  class State
    attr_accessor :spcl_remove_type
    attr_accessor :spcl_remove_turn
    def name
      name = @name.split(/,/)[0]
      return name != nil ? name : ""
    end
    def spcl_remove_type
      type = @name.split(/,/)[1]
      return type != nil ? type.to_i : 0
    end
    def spcl_remove_turn
      turn = @name.split(/,/)[2]
      return turn != nil ? turn.to_i : 0
    end
  end
end

     
#==============================================================================
# ■ Game_Battler
#==============================================================================
#atkr defr sklr e_atkr e_defr e_sklr
class Game_Battler
  alias add_initialize initialize unless $F12_Check == true
  def initialize
    add_initialize
    @spcl_remove_turns = [[],[]]
    for i in 1...$data_states.size
      @spcl_remove_turns[0][i] = $data_states[i].spcl_remove_turn
      @spcl_remove_turns[1][i] = $data_states[i].spcl_remove_turn
    end
  end
  def spcl_remove_sta(type,owner)
    for i in @states.clone
      if $data_states[i].spcl_remove_type == type
        if @spcl_remove_turns[owner][i] > 0
          @spcl_remove_turns[owner][i] -= 1
        elsif @spcl_remove_turns[owner][i] <= 0
          remove_state(i)
          @spcl_remove_turns[owner][i] = $data_states[i].spcl_remove_turn
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 應用通常攻擊效果
  #    attacker : 攻擊者 (battler)
  #--------------------------------------------------------------------------
  def attack_effect(attacker)
    # 清除會心一擊標誌
    self.critical = false
    # 第一命中判斷
    hit_result = (rand(100) < attacker.hit)
    # 命中的情況下
    if hit_result == true
      # 計算基本傷害
      atk = [attacker.atk - self.pdef / 2, 0].max
      self.damage = atk * (20 + attacker.str) / 20
      # 屬性修正
      self.damage *= elements_correct(attacker.element_set)
      self.damage /= 100
      # 傷害符號正確的情況下
      if self.damage > 0
        # 會心一擊修正
        if rand(100) < 4 * attacker.dex / self.agi
          self.damage *= 2
          self.critical = true
        end
        # 防禦修正
        if self.guarding?
          self.damage /= 2
        end
      end
      # 分散
      if self.damage.abs > 0
        amp = [self.damage.abs * 15 / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # 第二命中判斷
      eva = 8 * self.agi / attacker.dex + self.eva
      hit = self.damage < 0 ? 100 : 100 - eva
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(100) < hit)
    end
    # 命中的情況下
    if hit_result == true
      a = attacker.is_a?(Game_Actor) ? 0 : 1
      b = self.is_a?(Game_Actor) ? 0 : 1
      spcl_remove_sta(0,a)
      spcl_remove_sta(4,a)
      spcl_remove_sta(2,b)
      spcl_remove_sta(5,b)
      if self.guarding?
        spcl_remove_sta(6,b)
      end
      # 狀態衝擊解除
      remove_states_shock
      # HP 的傷害計算
      self.hp -= self.damage
      # 狀態變化
      @state_changed = false
      states_plus(attacker.plus_state_set)
      states_minus(attacker.minus_state_set)
    # Miss 的情況下
    else
      # 傷害設置為 "Miss"
      self.damage = "Miss"
      # 清除會心一擊標誌
      self.critical = false
    end
    # 過程結束
    return true
  end
  #--------------------------------------------------------------------------
  # ● 應用特技效果
  #    user  : 特技的使用者 (battler)
  #    skill : 特技
  #--------------------------------------------------------------------------
  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
      # 屬性修正
      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
      a = user.is_a?(Game_Actor) ? 0 : 1
      b = self.is_a?(Game_Actor) ? 0 : 1
      if self.damage > 0
        spcl_remove_sta(1,a)
        spcl_remove_sta(4,a)
        spcl_remove_sta(3,b)
        spcl_remove_sta(5,b)
        if self.guarding?
          spcl_remove_sta(6,b)
        end
      end
      # 威力 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
$F12_Check = true
#==============================================================================
#轉載此腳本 請保留此行文字 BY RMXP小屋 金也安里
#http://www.wretch.cc/blog/hauhauchen
#==============================================================================
avatar
安里
拿著木劍的戰士
拿著木劍的戰士

文章數 : 20
注冊日期 : 2009-12-29

檢視會員個人資料

回頂端 向下

上一篇主題 下一篇主題 回頂端


 
這個論壇的權限:
無法 在這個版面回復文章