關於部落格
RPG製作大師XP腳本為主要更新

RPG製作大師VX腳本為其次更新

RPG製作大師VX_Ace目前不考慮

RPG製作大師MV腳本完全沒打算

留言完建議重新整理看看是否顯示

目前不處理本舖外腳本的相關問題

其他相關事項請觀看規定注意事項

本舖未來的經營計畫與VA的支援




var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-37462754-1']);
_gaq.push(['_trackPageview']);

(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();

  • 307163

    累積人氣

  • 12

    今日人氣

    0

    追蹤人氣

【腳本】多功能狀態


使用方法
打開腳本編輯器,對腳本「Main」按下右鍵,選擇插入,會出現1個空白腳本
在空白腳本內貼上以下腳本:
RPG Maker XP 適用
module Sword
  ON = true ; OFF = false ; Sword22_Status = Hash.new
#=======================================
#★ 魔劍工舖 - 多功能狀態 2.01(XP版)
# 轉貼腳本請著名出處:http://blog.yam.com/a870053jjkj/
# 如果採用在遊戲中,看你高興是否顯示腳本出處,但嚴禁說是自己寫的腳本!!
#=======================================
#● 使用者自定設置
#--------------------------------------------------------------
#○ 設置狀態效果(Sword22_Status[狀態編號] = {狀態效果設置})
Sword22_Status[17] = {0=>[50.5]}
Sword22_Status[18] = {1=>[0, 20]}
Sword22_Status[19] = {1=>[-100, 0]}
Sword22_Status[20] = {2=>[30, 0]}
Sword22_Status[21] = {2=>[0, -20]}
Sword22_Status[31] = {22=>{9=>1}}
=begin
========================================
● 設置方法
獲取是否有該效果:$game_actors[角色編號].update_effect(效果編號)
解除指定效果狀態:$game_actors[角色編號].remove_status_effect(效果編號)
----------------------------------------------------------------
● 狀態效果設置表
設置加成:0=>[倍數],
持續扣血:1=>[扣血量, 扣血百分比],
持續扣氣:2=>[扣氣量, 扣氣百分比],
無效選項:3=>[第幾個選項],
變更狀態:4=>[狀態編號],
反射攻擊:5=>[反射機率, 反射傷害量, 反射傷害百分比],
混亂攻擊:6=>[攻擊同伴率, 攻擊概率, 防禦概率, 等待概率, 技能概率, 物品概率],
攻擊全體:7=>[攻擊全體率, 行動種類],  (0攻擊、1單體技能、2兩者皆用)
全體失敗:8=>[nil],
敵人集火:9=>[被攻擊率],
不被攻擊:10=>[不被攻擊率, 無結果時否判定效果無效],
用血維持:11=>[所需血量, 所需血量百分比],
用氣維持:12=>[所需氣量, 所需氣量百分比],
半透明化:13=>[不透明度],
消耗減免:14=>[氣消耗減少量, 氣消耗減少百分比],
開關狀態:15=>[nil],
被人暴擊:16=>[暴擊增加百分比],
自動復活:17=>[復活率, 復活恢復量, 復活恢復百分比, 動畫編號, 狀態解除率],
傷轉恢復:18=>[轉換率, 轉換血量, 轉換血百分比],
頻發暴擊:19=>[暴擊增加百分比],
解除扣血:20=>[扣血量, 扣血百分比],
解除扣氣:21=>[扣氣量, 扣氣百分比],
屬性加成:22=>{屬性加成列表(屬性編號=>加成百分比)}
========================================
詳細設置說明請參考:http://blog.yam.com/a870053jjkj/article/25879104
=end
  #-------------------------------------------------------------
  #● 生成狀態能力與列表的方法
  $Sword ? $Sword[22] = 201 : $Sword = {22=>201} # 腳本使用標誌
  Sword22 = [22] # 腳本參數
end
#=======================================
#■ 處理臨時資料的類別
class Game_Temp
  include Sword # 連接自定設置
  attr_reader    :status_effect # 狀態效果列表
  attr_accessor :effect_list # 狀態效果執行列表(我方)
  attr_accessor :effect_listr # 狀態效果執行列表(敵方)
  #-------------------------------------------------------------
  #● 初始化物件
  alias sword22_initialize initialize
  def initialize
    sword22_initialize
    @status_effect = Hash.new {|a, b| a[b] = []}
    @effect_list = Hash.new {|a, b| a[b] = Hash.new {|c, d| c[d] = []}}
    @effect_listr = Hash.new {|a, b| a[b] = Hash.new {|c, d| c[d] = []}}
    #○ 設置加成 與其他狀態的資料庫修改
    $data_states        = load_data("Data/States.rxdata") # 重新載入數據,以免在次加成
    (1...$data_states.size).each do |i| ; if Sword22_Status[i]
      if Sword22_Status[i][0] # 發現「設置加成」場合
        ['maxhp_rate', 'maxsp_rate', 'str_rate', 'dex_rate', 'agi_rate', 'int_rate', 'atk_rate',
        'pdef_rate', 'mdef_rate'].each {|rate| eval("$data_states[i].#{rate} = [((
        $data_states[i].#{rate} - 100) * Sword22_Status[i][0][0]).to_i, 0].max + 100")}
      end ; if Sword22_Status[i][15] # 發現「開關狀態」場合
        $data_states[i].nonresistance = true # 不能抵抗
      end
      (0..Sword22[0]).each {|ii| @status_effect[ii] += [i] if Sword22_Status[i][ii]}
    end ; end
  end
end
#=======================================
#■ 處理戰鬥者的類別
class Game_Battler
  include Sword # 連接自定設置
  attr_accessor :actor_id # 角色編號
  attr_accessor :enemy_id # 敵人編號
  #-------------------------------------------------------------
  #● 變更 HP
  alias sword22_hp= hp=
  def hp=(hp)
    #○ 反射攻擊
    if $game_temp.in_battle # 戰鬥時的情況
      if (list = update_effect(5)) and list[0] > rand(100) and (not $scene.sword22['反射攻擊'])
        hp = [list[1] + ((@hp - hp) / 100.0 * list[2]).to_i, @hp - hp].min
        $scene.sword22['反射攻擊'] = true
        $scene.active_battler.hp -= hp # 攻擊者受到反彈傷害
        $scene.sword22['反射攻擊'] = false
        $scene.active_battler.add_state(1) if $scene.active_battler.hp == 0
        $scene.active_battler.damage = 0 unless $scene.active_battler.damage
        $scene.active_battler.damage += hp # 設置攻擊者傷害顯示
        self.damage = 0
        $scene.target_battlers += [$scene.active_battler] # 加入攻擊目標列表中
        return
      end
    end
    #○ 傷轉恢復
    if (list = update_effect(18)) and @hp > hp and list[0] > rand(100)
      hpx = @hp - hp # 差距直(獲取實際傷害)
      hpx = [[hpx, 0].max + list[1] + (self.maxhp / 100.0 * list[2]).to_i, hpx].min
      @hp += hpx ; @hp = [@hp, self.maxhp].min
      self.damage = -hpx ; self.critical = false
      return
    end
    self.sword22_hp = hp
  end
  #-------------------------------------------------------------
  #● 變更 SP
  alias sword22_sp= sp=
  def sp=(sp)
    if $game_temp.in_battle or $scene.is_a?(Scene_Skill)
      #○ 消耗減免(減少消耗量)
      if $scene.sword22['消耗減免'] ; $scene.sword22['消耗減免'] = false
      if list = update_effect(14)
        @sp -= (list[0] + (@sp - sp) / 100.0 * list[1]).to_i
        @sp = [[@sp, 0].max, self.maxsp].min
        return
      end ; end
    end
    self.sword22_sp = sp
  end
    #--------------------------------------------------------------------------
  #● 附加狀態
  alias sword22_add_state add_state
  def add_state(state_id, force = false)
    #○ 開關狀態
    (remove_state(state_id) ; return) if update_effect(15)
    sword22_add_state(state_id, force)
  end
  #-------------------------------------------------------------
  #● 解除狀態
  alias sword22_remove_state remove_state
  def remove_state(state_id, force = false)
    if @states_remove_auto # 自然解除的情況
      #○ 變更狀態
      if list = update_effect(4) ; add_state(list[0]) ; end
      #○ 解除扣血
      if list = update_effect(20)
        @hp -= list[0] + (self.maxhp / 100.0 * list[1]).to_i ; @hp = [@hp, 0].max
        @damage = list[0] + (self.maxhp / 100.0 * list[1]).to_i ; @damage_pop = true
        self.current_action.kind = 0 ; self.current_action.basic = 3 # 終止行動
      end
      #○ 解除扣氣
      if list = update_effect(21)
      (@sp -= list[0] + (self.maxsp / 100.0 * list[1]).to_i ; @sp = [@sp, 0].max) ; end
    end
    sword22_remove_state(state_id, force)
  end
  #-------------------------------------------------------------
  #● 狀態自然解除 (回合改變時呼叫)
  alias sword22_remove_states_auto remove_states_auto
  def remove_states_auto
    #○ 判斷是否是自動解除
    @states_remove_auto = true # 本函數啟動標誌設為真
    sword22_remove_states_auto
    @states_remove_auto = false # 本函數啟動標誌設為偽
  end
  #-------------------------------------------------------------
  #● 戰鬥不能判定
  alias sword22_dead? dead?
  def dead?
    #○ 自動復活(恢復)
    if self.hp == 0 and (list = update_effect(17)) and list[0] > rand(100)
      self.hp = list[1] + (self.maxhp / 100.0 * list[2]).to_i
      $scene.sword22['自動復活'] = [self, list[3]] if list[3] > 0 # 儲存播放動畫資料
      if list[4] > rand(100) ; self.is_a?(Game_Actor) ?
      remove_state(($game_temp.effect_list[self.id][17] & @states)[-1]) :
      remove_state(($game_temp.effect_listr[self.id][17] & @states)[-1]) ; end
    end
    sword22_dead?
  end
  #-------------------------------------------------------------
  #● 獲取限制
  alias sword22_restriction restriction
  def restriction
    #○ 混亂技能(判斷攻擊隊伍)
    unless ($game_temp.effect_list[@actor_id][6] & @states).empty? # 判斷狀態
      effect = Sword22_Status[$game_temp.effect_list[@actor_id][6][-1]][6]
      return effect[0] > rand(100) ? 3 : 2
    end
    sword22_restriction
  end
  #-------------------------------------------------------------
  #● 解除指定效果的狀態
  def remove_status_effect(effect_id)
    @states -= $game_temp.status_effect[effect_id]
  end
  #-------------------------------------------------------------
  #● 可以使用技能的判定
  alias sword22_skill_can_use? skill_can_use?
  def skill_can_use?(skill_id)
    #○ 消耗減免(消耗減少的使用判定)
    sp_cost = $data_skills[skill_id].sp_cost
    if list = update_effect(14)
      $data_skills[skill_id].sp_cost -=
      list[0] + ($data_skills[skill_id].sp_cost / 100.0 * list[1]).to_i
    end   
    a = sword22_skill_can_use?(skill_id)
    $data_skills[skill_id].sp_cost = sp_cost
    return a
  end
  #-------------------------------------------------------------
  #● 套用通常攻擊效果
  alias sword22_attack_effect attack_effect
  def attack_effect(attacker)
    sword22_attack_effect(attacker)
    if self.damage.is_a?(Integer) ; if self.damage > 0 # 是傷害的場合
      #○ 屬性加成
      if list = attacker.update_effect(22) ; list.each do |a, b|
        acen = self.is_a?(Game_Enemy) ? $data_enemies[self.id].element_ranks :
        $data_classes[$data_actors[self.id].class_id].element_ranks
        if acen[a] == 1 # 屬性為A的場合
          damage = (self.damage / 100.0 * b).to_i
          self.damage = damage
          self.hp -= damage ; return
        end
      end ; end
      #○ 被人暴擊
      unless self.critical ; if list = update_effect(16)
        if rand(100) < 4 * self.dex / attacker.agi + list[0] # 再次計算會心機率
          self.hp -= self.damage ; self.damage *= 2 ; self.critical = true
        end
      end ; end
      #○ 頻發暴擊
      unless self.critical ; if list = attacker.update_effect(19)
        if rand(100) < 4 * attacker.dex / self.agi + list[0] # 再次計算會心機率
          self.hp -= self.damage ; self.damage *= 2 ; self.critical = true
        end
      end ; end
    end ; end
  end
  #-------------------------------------------------------------
  #● 辨識狀態效果並返回參數的方法
  def update_effect(list_id)
    if self.is_a?(Game_Actor) ? ($game_temp.effect_list[self.id][list_id] & @states).empty? :
    ($game_temp.effect_listr[self.id][list_id] & @states).empty? ; return false
    else ; if self.is_a?(Game_Actor)
      return Sword22_Status[(
      $game_temp.effect_list[self.id][list_id] & @states)[-1]][list_id]
      else ; return Sword22_Status[(
      $game_temp.effect_listr[self.id][list_id] & @states)[-1]][list_id]
    end ; end
  end
end
#=======================================
#■ 處理行動 (戰鬥中的行動) 的類別
class Game_BattleAction
  include Sword # 連接自定設置
  #-------------------------------------------------------------
  #● 隨機目標 (敵人用)
  alias sword22_decide_random_target_for_enemy decide_random_target_for_enemy
  def decide_random_target_for_enemy
    sword22_decide_random_target_for_enemy
    #○ 敵人集火 + 不被攻擊(2個都是100%時的特殊處理)
    act = $game_party.actors[@target_index] ; null = false
    if (list1 = act.update_effect(9)) and (list2 = act.update_effect(10))
    if list1 == 100 and list2 == 100 ; null = true ; end ; end
    #○ 敵人集火
    return if @target_index == -1 # 如果沒有預設目標就中斷
    roulette = [] ; target_index = @target_index ; i = 0
    a = Array.new($game_party.actors.size, false) # 是否無效索引
    $game_party.actors.each do |actor| ; next if actor == nil
      if list = actor.update_effect(9) and (not actor.dead?)
        list[0] = 0 if null # 如果「不被攻擊」的機率是100%,時,此機率為0%
        roulette += [actor] if list[0] > rand(100)
      end
      a[i] = true if actor.dead? #○ 不被攻擊 (借用「敵人集火」的循環來用)
      a[i] = true if actor.update_effect(10)
      i += 1 # 增加循環次數
    end
    actor = roulette[rand(roulette.size)]
    @target_index = $game_party.actors.index(actor)
    @target_index = target_index if @target_index == nil
    #○ 不被攻擊(轉移攻擊目標)
    return if @target_index == -1 # 如果沒有預設目標就中斷
    actor = $game_party.actors[@target_index]
    if list = actor.update_effect(10)
      (unless list[1] ; clear ; end ; return) unless a.include?(false)
      decide_random_target_for_enemy if list[0] > rand(100)
    end
  end
end
#=======================================
#■ 處理同伴的類別
class Game_Party
  attr_reader    :items # 持有物品
  #-------------------------------------------------------------
  #● 目標角色的順序確定
  alias sword22_smooth_target_actor smooth_target_actor
  def smooth_target_actor(actor_index)
    act = sword22_smooth_target_actor(actor_index)
    #○ 不被攻擊(自動轉移攻擊目標的處理)
    if list = act.update_effect(10) ; unless list[1]
      a = Array.new($game_party.actors.size, false) ; i = 0
      @actors.each do |actor|
        a[i] = true if actor.dead?
        a[i] = true if actor.update_effect(10)
        i += 1
      end
      unless a.include?(false) ; return Game_Actor.new(1) ; end # 產生不能用的目標
    end ; end
    return act
  end
end
#=======================================
#■ 戰鬥顯示用活動區塊
class Sprite_Battler < RPG::Sprite
  include Sword # 連接自定設置
  #-------------------------------------------------------------
  #● 更新畫面
  alias sword22_update update
  def update
    sword22_update
    #○ 半透明化
    if @battler_visible and list = @battler.update_effect(13) ; self.opacity = list[0] ; end
  end
end
#=======================================
#■ 處理戰鬥畫面的類別
class Scene_Battle
  include Sword # 連接自定設置
  attr_accessor :active_battler # 攻擊者的數據
  attr_accessor :target_battlers # 被攻擊者的數據數組
  attr_accessor :sword22 # 儲存狀態有效資料
  #-------------------------------------------------------------
  #● 勝負判定
  alias sword22_judge judge
  def judge
    $game_temp.effect_list = Hash.new {|a, b| a[b] = Hash.new {|c, d| c[d] = []}} # 清空
    $game_temp.effect_listr = Hash.new {|a, b| a[b] = Hash.new {|c, d| c[d] = []}} # 清空
    #○ 更新狀態列表
    $game_party.actors.each do |actor| ; actor.states.each do |i| ; (0..Sword22[0]).each do |ii|
      $game_temp.effect_list[actor.id][ii] += [i] if
      $game_temp.status_effect[ii].include?(i)
    end ; end ; end
    $game_troop.enemies.each do |enemie| # 敵人部分
    enemie.states.each do |i| ; (0..Sword22[0]).each do |ii|
      $game_temp.effect_listr[enemie.id][ii] += [i] if
      $game_temp.status_effect[ii].include?(i)
    end ; end ; end
    #○ 全體失敗
    over = [] # 遊戲失敗狀態列表
    $game_party.actors.each {|actor| over += [true] if actor.update_effect(8)}
    if over == [true, true, true, true] ; if $game_temp.battle_can_lose
      $game_system.bgm_play($game_temp.map_bgm) ; battle_end(2)
    else ; $game_temp.gameover = true
    end ; end
    sword22_judge
  end
  #-------------------------------------------------------------
  #● 轉到輸入下一個角色的命令
  alias sword22_phase3_next_actor phase3_next_actor
  def phase3_next_actor
    #○ 無效選項(恢復選項的文字顏色)
    if @sword_actor_command
      @actor_command_window.draw_item(
      @sword_actor_command, Color.new(255, 255, 255))
      @sword_actor_command = nil
    end
    sword22_phase3_next_actor
  end
  #-------------------------------------------------------------
  #● 設定角色指令視窗
  alias sword22_phase3_setup_command_window phase3_setup_command_window
  def phase3_setup_command_window
    sword22_phase3_setup_command_window
    #○ 無效選項(無效的選項顏色設定)
    if list = $game_party.actors[@actor_index].update_effect(3)
      @actor_command_window.draw_item(list[0] - 1, Color.new(255, 255, 255, 128))
    end
  end
  #-------------------------------------------------------------
  #● 更新畫面 (角色命令回合 : 基本命令)
  alias sword22_update_phase3_basic_command update_phase3_basic_command
  def update_phase3_basic_command
    #○ 無效選項(將該選項無法選擇)
    if Input.trigger?(Input::C)
      if (list = $game_party.actors[@actor_index].update_effect(3))
      if @actor_command_window.index == list[0] - 1
        $game_system.se_play($data_system.buzzer_se) ; return
      else ; @sword_actor_command = list[0] - 1
      end ; end
    end
    sword22_update_phase3_basic_command
  end
  #-------------------------------------------------------------
  #● 更新畫面 (主回合步驟 1 : 準備行動)
  alias sword22_update_phase4_step1 update_phase4_step1
  def update_phase4_step1
    @sword22 = {} # 儲存狀態有效資料
    sword22_update_phase4_step1
    return unless @active_battler # 沒有角色就中斷
    @active_battler.states.each do |i| ; if Sword22_Status[i]
      if Sword22_Status[i][1] #○ 持續扣血
        @active_battler.damage = Sword22_Status[i][1][0] +
        (@active_battler.maxhp / 100.0 * Sword22_Status[i][1][1]).to_i rescue next
        @active_battler.hp = @active_battler.hp - @active_battler.damage
        @active_battler.damage_pop = true
        @status_window.refresh
      end
      if Sword22_Status[i][2] #○ 持續扣氣
        sp_damage = (Sword22_Status[i][2][0] +
        (@active_battler.maxsp / 100.0 * Sword22_Status[i][2][1]).to_i) rescue next
        @active_battler.sp = @active_battler.sp - sp_damage
        @status_window.refresh
      end
    end ; end
  end
  #-------------------------------------------------------------
  #● 更新畫面 (主回合步驟 2 : 開始行動)
  alias sword22_update_phase4_step2 update_phase4_step2
  def update_phase4_step2
    #○ 混亂狀態
    actor = @active_battler
    unless ($game_temp.effect_list[actor.actor_id][6] & actor.states).empty? # 判斷狀態
      effect = Sword22_Status[$game_temp.effect_list[actor.actor_id][6][-1]][6]
      i = 0 # 循環次數
      loop do ; i += 1 # 循環
        if [effect[1], effect[2], effect[3], effect[4], effect[5]] == [0, 0, 0, 0, 0] or i > 255 or
        (actor.skills.empty? and $game_party.items.empty?) # 沒概率或沒技能和沒物品時
          (@active_battler.current_action.kind = 0 ; @active_battler.current_action.basic = 3)
          break
        end
        case rand(100) + 1 # 設定概率機率
        when 1..(effect[1] * 2) ; @active_battler.current_action.kind = 0 # 攻擊
          @active_battler.current_action.basic = 0 ; break
        when 21..(effect[2] * 2 + 20) ; @active_battler.current_action.kind = 0 # 防禦
          @active_battler.current_action.basic = 1 ; break
        when 41..(effect[3] * 2 + 40) ; @active_battler.current_action.kind = 0 # 等待
          @active_battler.current_action.basic = 3 ; break
        when 61..(effect[4] * 2 + 60) ; @active_battler.current_action.kind = 1 # 技能
          if actor.skills.empty? # 當沒有技能可用的情況
            if [effect[1], effect[2], effect[3], effect[5]] == [0, 0, 0, 0] # 其他概率都為0的場合
              (@active_battler.current_action.kind = 0 ; @active_battler.current_action.basic = 3)
              break
            else ; redo ; end # 重新循環
          end
          next unless actor.skill_can_use?(actor.skills[rand(actor.skills.size)])
          actor.current_action.skill_id = actor.skills[rand(actor.skills.size)] ; break
        when 81..(effect[5] * 2 + 80) ; @active_battler.current_action.kind = 2 # 物品
          if $game_party.items.empty? # 當沒有物品可用的情況
            if [effect[1], effect[2], effect[3], effect[4]] == [0, 0, 0, 0] # 其他概率都為0的場合
              (@active_battler.current_action.kind = 0 ; @active_battler.current_action.basic = 3)
              break
            else ; redo ; end # 重新循環
          end
          irem = [] # 儲存目前持有的物品列表
          (1...$data_items.size).each {|i|
          irem += [i] if $game_party.items[i] > 0 if $game_party.items[i] != nil}
          actor.current_action.item_id = irem[rand(irem.size)] ; break
        end ; end
        @active_battler.current_action.forcing = true # 防止自動被修正為基本攻擊
    end
    sword22_update_phase4_step2
  end
  #-------------------------------------------------------------
  #● 生成基本行動結果
  alias sword22_make_basic_action_result make_basic_action_result
  def make_basic_action_result
    sword22_make_basic_action_result
    #○ 攻擊全體(基本攻擊)
    actor = @active_battler ; target_battlers = []
    if @active_battler.current_action.basic == 0
    if (list = actor.update_effect(7)) and list[0] > rand(100) and [0, 2].include?(list[1])
      if @active_battler.is_a?(Game_Actor) # 角色
        $game_troop.enemies.each do |troop| ; next if @target_battlers[0] == troop
          troop.attack_effect(@active_battler) ; target_battlers += [troop]
        end
      else # 敵人
        $game_party.actors.each do |party| ; next if @target_battlers[0] == party
          party.attack_effect(@active_battler) ; target_battlers += [party]
        end
      end
      @target_battlers = target_battlers + @target_battlers
    end ; end
  end
  #-------------------------------------------------------------
  #● 設定物品或技能目標方的戰鬥者
  alias sword22_set_target_battlers set_target_battlers
  def set_target_battlers(scope)
    actor = @active_battler
    #○ 攻擊全體(敵單體技能)
    if list = actor.update_effect(7)
      scope = 2 if (list[0] > rand(100) and [1, 2].include?(list[1]) and scope == 1)
    end
    #○ 混亂狀態(處理攻擊的目標)
    unless ($game_temp.effect_list[actor.actor_id][6] & actor.states).empty? # 判斷狀態
      effect = Sword22_Status[$game_temp.effect_list[actor.actor_id][6][-1]][6]
      a = effect[0] > rand(100) # 獲取要攻擊敵方還是我方
      case scope # 效果範圍分歧(使用者和HP0的目標不受影響)
      when 1 ; scope = 3 if a # 敵單體轉為我方單體
      when 2 ; scope = 4 if a # 敵全體轉為我方全體
      when 3 ; scope = 1 if a # 我方單體轉為敵單體
      when 4 ; scope = 2 if a # 我方全體轉為敵全體
      end
      50.times do # 循環50次還是沒找到目標時,就攻擊排列最後的人
        if a # 攻擊我方的情況
          b = rand($game_party.actors.size)
          (@active_battler.current_action.target_index = b ; break) unless
          $game_party.actors[b].dead? if $game_party.actors[b] != nil
        else # 攻擊敵方的情況
          b = rand(8) # 獲取攻擊目標
          (@active_battler.current_action.target_index = b ; break) unless
          $game_troop.enemies[b].dead? if $game_troop.enemies[b] != nil
        end
      end
    end
    sword22_set_target_battlers(scope)
  end
  #-------------------------------------------------------------
  #● 生成特技行動結果
  alias sword22_make_skill_action_result make_skill_action_result
  def make_skill_action_result
    @sword22['消耗減免'] = true
    sword22_make_skill_action_result
    @sword22['消耗減免'] = false
  end
  #-------------------------------------------------------------
  #● 刷新畫面 (主回合步驟 5 : 顯示傷害)
  alias sword22_update_phase4_step5 update_phase4_step5
  def update_phase4_step5
    ($game_party.actors + $game_troop.enemies).each do |acen|
      #○ 用血維持
      if list = acen.update_effect(11)
        state_id = acen.is_a?(Game_Actor) ?
        (($game_temp.effect_list[acen.id][11] & acen.states)[-1]) :
        (($game_temp.effect_listr[acen.id][11] & acen.states)[-1])
        acen.remove_state(state_id) if acen.hp < list[0] + acen.maxhp / 100.0 * list[1]
      end
      #○ 用氣維持
      if list = acen.update_effect(12)
        state_id = acen.is_a?(Game_Actor) ?
        (($game_temp.effect_list[acen.id][12] & acen.states)[-1]) :
        (($game_temp.effect_listr[acen.id][12] & acen.states)[-1])
        acen.remove_state(state_id) if acen.sp < list[0] + acen.maxsp / 100.0 * list[1]
      end
    end
    #○ 自動復活(動畫處理)
    if sword22['自動復活'] # 有設定「自動復活」動畫的場合
      sword22['自動復活'][0].animation_hit = true
      sword22['自動復活'][0].animation_id = sword22['自動復活'][1]
      sword22['自動復活'] = nil
    end
    sword22_update_phase4_step5
  end
  #-------------------------------------------------------------
  #● 判斷該角色是否存在指定效果的方法
  def status_effect(actor_id, effect_id)
    a = actor_id < 0 ? $game_actors[actor_id.abs].states : $game_party.actors[actor_id].states
    a.each {|i| return i if $game_temp.status_effect[effect_id].include?(i) }
    return false
  end
end
 
RPG Maker VX 適用
module Sword
  ON = true ; OFF = false ; Sword22_Status = Hash.new ; Sword22_SE = Array.new
#=======================================
#★ 魔劍工舖 - 多功能狀態 1.01(VX版)
# 轉貼腳本請著名出處:http://blog.yam.com/a870053jjkj/
# 如果採用在遊戲中,看你高興是否顯示腳本出處,但嚴禁說是自己寫的腳本!!
#=======================================
#● 使用者自定設置
Sword22_Together = OFF # 是否要將相同效果的訊息一同顯示
#--------------------------------------------------------------
#○ SE音效設置列表(Sword22_SE[SE編號] = 'SE檔案名稱')
Sword22_SE[1] = 'Damage1'
Sword22_SE[2] = 'Heal3'
#--------------------------------------------------------------
#○ 設置狀態效果(Sword22_Status[狀態編號] = {狀態效果設置})
Sword22_Status[18] = {1=>[0, 10, 'F[255,0,0,10]SE[1]N這回合扣除VHP']}
Sword22_Status[19] = {2=>[-10, 0, 'F[150,150,255,10]SE[2]N這回合恢復VMP']}
Sword22_Status[20] = {4=>[1, 'F[255,0,0,10]SE[1]N暴斃了!!']}
Sword22_Status[21] = {20=>[0, 100, 'F[255,0,0,10]SE[1]N減少 V HP']}
Sword22_Status[22] = {21=>[0, 100, 'F[255,0,0,10]SE[1]N減少 V MP']}
Sword22_Status[23] = {8=>['全體角色已被石化,無法在繼續戰鬥']}
Sword22_Status[24] = {15=>['關閉了N身上的這個狀態']}
Sword22_Status[25] = {16=>[100]}
=begin
========================================
● 狀態效果設置表
設置加成:0=>[倍數],
持續扣血:1=>[扣血量, 扣血百分比, '訊息內容'],
持續扣氣:2=>[扣血量, 扣血百分比, '訊息內容'],
無效選項:3=>[第幾個選項],
變更狀態:4=>[狀態編號, '訊息內容'],
全體失敗:8=>['訊息內容'],
用血維持:11=>[所需血量, 所需血量百分比],
用氣維持:12=>[所需氣量, 所需氣量百分比],
開關狀態:15=>['訊息內容'],
被人暴擊:16=>[暴擊增加百分比],
頻發暴擊:19=>[暴擊增加百分比],
解除扣血:20=>[扣血量, 扣血百分比, '訊息內容'],
解除扣氣:21=>[扣氣量, 扣氣百分比, '訊息內容'],
屬性加乘:22=>{屬性加成列表(屬性編號=>加成百分比)}
========================================
● 控制碼(訊息內容用)
○ 內容控制碼
 V : 結果數值(支援1, 4)
 N : 角色名稱(有訊息的均可顯示)
---------------------------------------------------------------
○ 效果控制碼
 F[紅,綠,藍,時間] : 畫面閃爍
 SE[SE編號] : 播放SE,播放的SE採用Sword22_SE設置的檔案名稱
========================================
詳細設置說明請參考:http://blog.yam.com/a870053jjkj/article/25879104
=end
  #-------------------------------------------------------------
  #● 生成狀態能力與列表的方法
  $Sword ? $Sword[22] = 101 : $Sword = {22=>101} # 腳本使用標誌
  Sword22 = [22] # 腳本參數
end
#=======================================
#■ 處理臨時資料的類
class Game_Temp
  include Sword # 連接自定設置
  attr_reader   :status_effect # 狀態效果列表
  attr_accessor :effect_list   # 狀態效果執行列表(我方)
  attr_accessor :effect_listr  # 狀態效果執行列表(敵方)
  #-------------------------------------------------------------
  #● 初始化物件
  alias sword22_initialize initialize
  def initialize
    sword22_initialize
    @status_effect = Hash.new {|a, b| a[b] = []}
    @effect_list = Hash.new {|a, b| a[b] = Hash.new {|c, d| c[d] = []}}
    @effect_listr = Hash.new {|a, b| a[b] = Hash.new {|c, d| c[d] = []}}
    #○ 設置加成 與其他狀態的資料庫修改
    $data_states        = load_data('Data/States.rvdata') # 重新載入數據,以免在次加成
    (1...$data_states.size).each do |i| ; if Sword22_Status[i]
      if Sword22_Status[i][0] # 發現「設置加成」場合
        ['atk_rate', 'def_rate', 'spi_rate', 'agi_rate'].each {|rate|
        eval("$data_states[i].#{rate} = [((
        $data_states[i].#{rate} - 100) * Sword22_Status[i][0][0]).to_i, 0].max + 100")}
      end ; if Sword22_Status[i][15] # 發現「開關狀態」場合
        $data_states[i].nonresistance = true # 不能抵抗
      end
      (0..Sword22[0]).each {|ii| @status_effect[ii] += [i] if Sword22_Status[i][ii]}
    end ; end
  end
end
#=======================================
#■ 處理戰鬥者的類
class Game_Battler
  include Sword # 連接自定設置
  attr_accessor :hp_damage # HP傷害
  attr_accessor :mp_damage # MP傷害
  @@swoed22 = {}
  #-------------------------------------------------------------
  #● 檢查狀態
  alias sword22_state? state?
  def state?(state_id)
    #○ 開關狀態(處理默認的狀態判定)
    return false if ((not @@swoed22['開關狀態']) and (self.is_a?(Game_Actor) ?
    $game_temp.effect_list[self.id][15].include?(state_id) :
    $game_temp.effect_listr[self.id][15].include?(state_id)))
    sword22_state?(state_id)
  end
  #-------------------------------------------------------------
  #● 附加狀態
  alias sword22_add_state add_state
  def add_state(state_id)
    #○ 開關狀態(解除已經附加過的狀態)
    if list = update_effect(15)
      $scene.transform(list[0], self) unless list[0].empty?
      @@swoed22['開關狀態'] = true ; remove_state(state_id)
      @@swoed22['開關狀態'] = false ; return
    end
    sword22_add_state(state_id)
  end
  #-------------------------------------------------------------
  #● 解除狀態
  alias sword22_remove_state remove_state
  def remove_state(state_id)
    #○ 變更狀態(附加指定的狀態)
    if @@swoed22['remove_states_auto']
      if list = update_effect(4) and self.is_a?(Game_Actor) ?
      ($game_temp.effect_list[self.id][4] & @states).include?(state_id) :
      ($game_temp.effect_listr[self.id][4] & @states).include?(state_id)
        add_state(list[0]) # 附加狀態
        list[0] == 1 ? $scene.transform(list[1], self, -1) : $scene.transform(list[1], self)
      end
      #○ 解除扣血
      if list = update_effect(20) and self.is_a?(Game_Actor) ?
      ($game_temp.effect_list[self.id][20] & @states).include?(state_id) :
      ($game_temp.effect_listr[self.id][20] & @states).include?(state_id)
        self.hp_damage = list[0] + (self.maxhp / 100.0 * list[1]).to_i
        self.hp -= hp_damage
        $scene.transform(list[2], self, hp_damage.abs, true)
      end
      #○ 解除扣氣
      if list = update_effect(21) and self.is_a?(Game_Actor) ?
      ($game_temp.effect_list[self.id][21] & @states).include?(state_id) :
      ($game_temp.effect_listr[self.id][21] & @states).include?(state_id)
        self.mp_damage = list[0] + (self.maxmp / 100.0 * list[1]).to_i
        self.mp -= mp_damage
        $scene.transform(list[2], self, mp_damage.abs)
      end
      @@swoed22['remove_states_auto'] = false
    end
    sword22_remove_state(state_id)
  end
  #-------------------------------------------------------------
  #● 狀態自然解除 (回合改變時調用)
  alias sword22_remove_states_auto remove_states_auto
  def remove_states_auto
    #○ 變更狀態(確認是否為自然解除用)
    @@swoed22['remove_states_auto'] = true
    sword22_remove_states_auto
    @@swoed22['remove_states_auto'] = false
  end
  #-------------------------------------------------------------
  #● 計算普通攻擊傷害
  alias sword22_make_attack_damage_value make_attack_damage_value
  def make_attack_damage_value(attacker)
    sword22_make_attack_damage_value(attacker)
    if @hp_damage > 0 # 是傷害的場合
      #○ 屬性加乘
      if list = attacker.update_effect(22) ; list.each do |a, b|
        acen = self.is_a?(Game_Enemy) ? $data_enemies[self.id].element_ranks :
        $data_classes[$data_actors[self.id].class_id].element_ranks
        if acen[a] == 1 # 屬性為A的場合
          damage = (@hp_damage / 100.0 * b).to_i
          @hp_damage = damage
          self.hp -= damage ; return
        end
      end ; end
      unless @critical # 沒有會心一擊的場合
        #○ 被人暴擊
        if list = update_effect(16)
          (self.hp -= @hp_damage * 2 ; @hp_damage *= 3) if
          (@critical = (rand(100) < self.cri + list[0]))
        end
        #○ 頻發暴擊
        if list = attacker.update_effect(19)
          (self.hp -= @hp_damage * 2 ; @hp_damage *= 3) if
          (@critical = (rand(100) < attacker.cri + list[0]))
        end
      end
    end
  end
  #-------------------------------------------------------------
  #● 辨識狀態效果並返回參數的方法
  def update_effect(list_id)
    if self.is_a?(Game_Actor) ? ($game_temp.effect_list[self.id][list_id] & @states).empty? :
    ($game_temp.effect_listr[self.id][list_id] & @states).empty? ; return false
    elsif self.dead? ; return false
    else ; if self.is_a?(Game_Actor)
      return Sword22_Status[(
      $game_temp.effect_list[self.id][list_id] & @states)[-1]][list_id]
      else ; return Sword22_Status[(
      $game_temp.effect_listr[self.id][list_id] & @states)[-1]][list_id]
    end ; end
  end
  #-------------------------------------------------------------
  #● 只有狀態編號的數組讀取方法
  def states_id? ; @states ; end
end
#=======================================
#■ 處理敵人的類
class Game_Enemy < Game_Battler
  #-------------------------------------------------------------
  #● 獲取敵人 ID
  def id ; @enemy_id ; end
end
#=======================================
#■ 處理戰鬥畫面的類
class Scene_Battle < Scene_Base
  include Sword # 連接自定設置
  #-------------------------------------------------------------
  #● 判斷勝負結果
  alias sword22_judge_win_loss judge_win_loss
  def judge_win_loss
    $game_temp.effect_list = Hash.new {|a, b| a[b] = Hash.new {|c, d| c[d] = []}} # 清空
    $game_temp.effect_listr = Hash.new {|a, b| a[b] = Hash.new {|c, d| c[d] = []}} # 清空
    #○ 更新狀態列表
    $game_party.members.each do |actor| ; actor.states.each do |i| ; (0..Sword22[0]).each do |ii|
      $game_temp.effect_list[actor.id][ii] += [i.id] if
      $game_temp.status_effect[ii].include?(i.id)
    end ; end ; end
    $game_troop.members.each do |enemie| # 敵人部分
    enemie.states.each do |i| ; (0..Sword22[0]).each do |ii|
      $game_temp.effect_listr[enemie.id][ii] += [i.id] if
      $game_temp.status_effect[ii].include?(i.id)
    end ; end ; end
    #○ 全體失敗
    over = [] # 遊戲失敗狀態列表
    $game_party.members.each {|actor| over += [true] if actor.update_effect(8)}
    if over == [true, true, true, true]
      if $game_troop.can_lose
        battle_end(2)
      else ; $game_temp.next_scene = 'gameover'
      end
      @message_window.add_instant_text(
      transform($game_actors[1].update_effect(8)[0], $game_actors[1]))
    end
    sword22_judge_win_loss
  end
  #-------------------------------------------------------------
  #● 開始角色命令選擇
  alias sword22_start_actor_command_selection start_actor_command_selection
  def start_actor_command_selection
    sword22_start_actor_command_selection
    #○ 禁用選項(使選項變更為無效的顏色)
    if list = @active_battler.update_effect(3)
      @actor_command_window.draw_item(list[0] - 1, false)
    end
  end
  #-------------------------------------------------------------
  #● 更新角色命令選擇
  alias sword22_update_actor_command_selection update_actor_command_selection
  def update_actor_command_selection
    #○ 禁用選項(無效選項的選擇)
    if (list = @active_battler.update_effect(3)) and Input.trigger?(Input::C) and
    @actor_command_window.index == (list[0] - 1)
      Sound.play_buzzer ; return
    end
    sword22_update_actor_command_selection
  end
  #-------------------------------------------------------------
  #● 回合結束
  alias sword22_turn_end turn_end
  def turn_end
    ($game_party.members + $game_troop.members).each do |acen|
      #○ 持續扣血
      if list = acen.update_effect(1)
        acen.hp_damage = list[0] + (acen.maxhp / 100.0 * list[1]).to_i
        acen.hp -= acen.hp_damage
        text = transform(list[2], acen, acen.hp_damage.abs) if list[2]
      end
      #○ 持續扣氣
      if list = acen.update_effect(2)
        acen.mp_damage = list[0] + (acen.maxmp / 100.0 * list[1]).to_i
        acen.mp -= acen.mp_damage
        text = transform(list[2], acen, acen.mp_damage.abs) if list[2]
      end
    end
    sword22_turn_end
  end
  #-------------------------------------------------------------
  #● 顯示傷害
  alias sword22_display_damage display_damage
  def display_damage(target, obj = nil)
    ($game_party.members + $game_troop.members).each do |acen|
      #○ 用血維持
      if list = acen.update_effect(11)
        state_id = acen.is_a?(Game_Actor) ?
        (($game_temp.effect_list[acen.id][11] & acen.states)[-1]) :
        (($game_temp.effect_listr[acen.id][11] & acen.states)[-1])
        acen.remove_state(state_id) if acen.hp < list[0] + acen.maxhp / 100.0 * list[1]
      end
      #○ 用氣維持
      if list = acen.update_effect(12)
        state_id = acen.is_a?(Game_Actor) ?
        (($game_temp.effect_list[acen.id][12] & acen.states_id?)[-1]) :
        (($game_temp.effect_listr[acen.id][12] & acen.states_id?)[-1])
        acen.remove_state(state_id) if acen.mp < list[0] + acen.maxmp / 100.0 * list[1]
      end
    end
    sword22_display_damage(target, obj)
  end
  #-------------------------------------------------------------
  #● 處理控制碼的方法
  def transform(text, acen, v = 0, retur = false)
    text = text.dup ; color = nil ; se = nil ; desd = false
    (v = 0 ; desd = true) if v == -1 # 一律顯示死亡訊息
    text.gsub!(/\[Nn]/){acen.name} ; text.gsub!(/\[Vv]/){v}
    text.gsub!(/\[Ff][(d+)[, ]+(d+)[, ]+(d+)[, ]+(d+)]/){
    color = [Color.new($1.to_i, $2.to_i, $3.to_i), $4.to_i] ; ''}
    text.gsub!(/\[Ss][Ee][(d+)]/){se = Sword22_SE[$1.to_i] ; ''}
    text = [text, color, se]
    #[字串, 顏色(類,時間), SE]
    $game_troop.screen.start_flash(text[1][0], text[1][1]) if text[1]
    Audio.se_play('Audio/SE/' + text[2]) if text[2]
    @message_window.back_to(1)
    Sword22_Together ?
    (@message_window.add_instant_text(text[0]) if text[0]) :
    (@message_window.replace_instant_text(text[0]) if text[0])
    wait(40)
    return if ($data_states[1].message1.empty? or acen.hp > 0) unless desd
    return if retur # 中斷標誌
    acen.is_a?(Game_Actor) ? Sound.play_actor_collapse : acen.collapse = true
    @message_window.add_instant_text(acen.name + $data_states[1].message1)
    wait(40)
  end
end
 
 
設置方法
獲取是否有指定效果的狀態 
$game_actors[角色編號].update_effect(效果編號)
使用範例
條件分歧:腳本:$game_actors[1].pdate_effect(1) == false
 ◆註釋:當沒有指定效果狀態時的場合
 ◆
除此以外的場合
 ◆註釋:當有指定效果狀態時的場合
 ◆腳本:# 獲取該狀態的參數
 :  :p $game_actors[1].pdate_effect(1)
 ◆
分歧結束
《返回值》有的話返回該效果狀態的參數數組;沒有的話返回false(OFF)
 
解除指定效果的所有狀態 
$game_actors[角色編號].remove_status_effect(效果編號)
只要是有指定效果的狀態,不管是不是相同的狀態,都會解除掉
(是解除狀態,不是解除狀態效果喔~)
 
 
使用者自定設置說明 
【VX】Sword22_Together = OFF NEW
VX的戰鬥系統和XP的不同,VX主要是以訊息的方式呈現(如跑出窗口寫某某某少多少HP)
在VX的多功能狀態中,有一些效果設置多新增了訊息可以設置,通常一行一則訊息
這個設置設定是否要讓相同的狀態訊息一同顯示
ON:例如有2個中狀態的角色要顯示某個HP減少的訊息的話,如下:
       拉爾夫 減少 500 HP
       班尼特 減少 452 HP
OFF:不同的角色效果訊息會分開顯示,如先顯示「拉爾夫」的,然後再顯示「班尼特」
 
【VX】Sword22_SE[SE編號] = 'SE檔案名稱' NEW 
設定訊息顯示時,如果使用控制碼「SE」呼叫的SE音效設置
SE編號:用於控制碼「SE」用的識別編號,「SE[5]」,就是呼叫SE編號為5的SE音效
 
Sword22_Status[狀態編號] = {效果列表}
設定要附加特殊效果的狀態編號,可自行增加多個Sword22_Status設置
效果列表:請參考腳本中的註釋 [狀態效果設置表] 進行設置
     假設你要設自動回血(每回合恢復15%的血量)
     則此設置就設為『1=>[0, -15],』,此外也可以在進行多重附加
     除了自動回血外,還要加個禁用物品的話
     就改設成『1=>[0, -15], 3=>[nil],』想再附加也一此類推添加在後面
     如果還是不會設置,可以參考以下的範例自行研究看看吧 

 


 
狀態效果設置說明
設置加成
相簿設定
標籤設定
相簿狀態