# ======================================================
#  「BPシステム」スクリプトver.1.1
# ======================================================
# ■更新履歴
# ver.1.1(2011/04/01)
# ・KGCさんの多人数パーティに対応。
# 　「■仕様」にそれに関する説明を追加。
# ・イベントコマンドのスクリプトによるBP初期化方法を追加。
# 　使い方は「■イベントコマンドのスクリプトによる
# 　BPのリセット」の説明を読んで下さい。
# ver.1.0(2011/3/31)
# ・新規作成
# ======================================================
# ■概要
# MPをBPとして見立てて戦闘開始時に全員のMPを初期値に設定、
# 毎ターン終了時に設定された値だけ加算していく仕様にできます。
# また、アクターや敵毎に初期値や加算値を変更したり、
# 装備やステートによってそれらの値を変動させたり出来ます。
# 
# ■基本的な使い方
# スクリプト内の設定項目でデフォルト初期BP・加算BPを設定、
# 必要ならばアクター毎の初期BP・加算BPを設定して下さい。
# また、後述するメモ欄への記入方法でそれらを更に増減できます。
# 対応しているのは敵・装備・ステートのメモ欄です。
# 
# ■メモ欄への記入形式
# ・対応しているメモ欄
# 　アクター　＝　装備＆ステートのメモ欄
# 　エネミー　＝　敵キャラ＆ステートのメモ欄
# ・<初期BP:○○> or <加算BP:○○>
# 　それぞれ戦闘開始時の初期BP、ターン終了時の加算BPに影響します。
# ・○○の記述方法
# 　例:<初期BP:+10>
#     初期BP値が30だった場合、+10が加算されて40になります。
#   例:<初期BP:-10>
#     初期BP値が30だった場合、-10が加算されて20になります。
#   例:<初期BP=10>
#     初期BP値が30だった場合、10に置き換えられて10になります。
#   
# ■イベントコマンドのスクリプトによるBPのリセット
# 初期BPが設定されるのは開始時にPTに存在するメンバーのみです。
# 戦闘中に参戦するアクターの初期BP処理をしたい場合などは、
# このコマンドを上級→スクリプトに記述して実行して下さい。
# ・アクターのBPを戦闘開始時の初期BPの値にする
#     actor_bp_reset(actor_id)
#   actor_idには「データベース上のアクターのID」の数字を入力して下さい。
# ※ ただし「BP処理部分の再定義をする設定」にしている場合、
#    ターン終了時の加算BP処理がバトルイベントの後に実行されるので、
#    次ターンのコマンド入力の時点では初期BP+加算BPという数値になります。
#    BP初期化後に加算分を引きたい場合は、これを実行して下さい。
#     actor_bp_lost(actor_id)
#   このコマンドを実行すれば対象アクターから加算BP分がマイナスされます。
# ・一応エネミー版のBP初期化と加算分マイナスも作っておきました
#     enemy_bp_reset(enemy_index)   ←初期化
#     enemy_bp_lost(enemy_index)    ←加算分マイナス
#   enemy_indexには「敵グループ上でのエネミーのindex」の数字を入力して下さい。
#   (「敵キャラのHP増減」などのコマンドを選択する時の順番。)
# 
# ■仕様
# ・「メモ欄の処理の順番」
# 　[装備orエネミーのメモ]→[ステートのメモ]の順番で処理されます。
# 　例えば[装備orエネミーのメモ]でBPを50に指定したとしても、
# 　[ステートのメモ]でBPを40に指定した場合は上書きされてしまいます。
# ・「バトルイベントとBP処理の順番」
# 　スクリプト内の設定項目で再定義をしない事を選択した場合、
# 　[BP初期化処理→バトル開始時のバトルイベント]
# 　[BP加算処理→ターン終了時バトルイベント]
# 　という順番になるのでBP初期値や加算値が変動するステートが
# 　開始時や終了時のバトルイベント中に付加されたとしても、
# 　その瞬間のBP処理には反映されません。
# 　再定義をする場合は順序が逆になるので反映されます。
# ・初期BPが設定されるのは戦闘開始時に居るPTメンバーのみです。
#   イベントコマンドなどで途中参加したアクターは処理されません。
# ・KGCさんの多人数パーティを入れている場合、
#   ターン終了時にBPが加算されるのは戦闘メンバーのみです。
#   待機メンパーのBPは加算されません。
# 
# ■エイリアスしている箇所
# class Scene_Battle < Scene_Base内
#   execute_action_attack (戦闘行動の実行 : 攻撃)
#   execute_action_guard  (戦闘行動の実行 : 防御)
#   execute_action_item   (戦闘行動の実行 : アイテム)
# ■設定によりエイリアスか再定義される場所
# class Scene_Battle < Scene_Base内
#   process_battle_start  (戦闘開始の処理)
#   turn_end              (ターン終了)
# 
# 同じ箇所を再定義やエイリアスしているスクリプトとは
# 競合する可能性があります。
# 
# ======================================================

module NukumizuBPsystem
  # ■初期BP設定
  # ・バトル開始時のBP値の設定です。
  # 　PRESET_DEFAULT_BPはBPの共通デフォルト値です。(敵味方共通)
  # ・アクターによって個別にデフォルト値を変えたい場合は、
  # 　ACTOR_DEFAULT_BPに「アクターID => BP値」の形式で
  # 　記入して下さい。（一番下以外には「,」を付けるのを忘れずに。）
  # ・ここで個別設定がなされたアクターはその値に、
  # 　設定されていないアクターは共通デフォルト値になります。
  # ・敵のデフォルト値を個別に設定したい場合は、
  # 　敵のメモ欄を利用して<初期BP:値>を使って下さい。
  PRESET_DEFAULT_BP = 30
  ACTOR_DEFAULT_BP ={
  1 => 30,
  2 => 30,
  3 => 30,
  4 => 30
  }
  # ■加算BP設定
  # ターン終了時に加算されるBP値の設定です。
  # 基本的に初期BPの設定と同じです。
  PRESET_GAIN_BP = 30
  ACTOR_GAIN_BP ={
  1 => 30,
  2 => 30,
  3 => 30,
  4 => 30
  }
  # ■行動時消費BP設定
  # 上から順に通常攻撃時・防御時・アイテム使用時に
  # 消費するBPの設定です。0にすれば消費されません。
  # 消費BPが足りなくても残りが0になるだけで行動できます。
  ATTACK_BP_COST  = 20
  GUARD_BP_COST   = 10
  ITEM_BP_COST    = 20
  
  # ■BP処理のため「process_battle_start(戦闘開始の処理)」を再定義するか？
  # trueの場合は再定義で、開始バトルイベントの後にBP処理が入ります。
  # falseの場合は再定義せず、バトルイベントとBPの処理が順序が逆になる
  # 代わりに同じ箇所を再定義しているスクリプトと競合する
  # 可能性が少なくなります。
  START_REDEFINE = true
  
  # ■BP処理のため「turn_end(ターン終了)」を再定義するか？
  # 戦闘開始の処理の場合と同じです。
  END_REDEFINE = true
end

$imported = {} if $imported == nil
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● 対象のアクターのBPを初期化   ■新規
  #--------------------------------------------------------------------------
  def actor_bp_reset(actor_id)
    actor = $game_actors[actor_id]
    actor.mp = actor.default_bp
  end
  #--------------------------------------------------------------------------
  # ● 対象のアクターのBPを加算分マイナスする   ■新規
  #--------------------------------------------------------------------------
  def actor_bp_lost(actor_id)
    actor = $game_actors[actor_id]
    actor.mp -= actor.gain_bp
  end
  #--------------------------------------------------------------------------
  # ● 対象のエネミーのBPを初期化   ■新規
  #--------------------------------------------------------------------------
  def enemy_bp_reset(enemy_index)
    enemy = $game_troop.members[enemy_index - 1]
    enemy.mp = enemy.default_bp
  end
  #--------------------------------------------------------------------------
  # ● 対象のエネミーのBPを加算分マイナスする   ■新規
  #--------------------------------------------------------------------------
  def enemy_bp_lost(enemy_index)
    enemy = $game_troop.members[enemy_index - 1]
    enemy.mp -= enemy.gain_bp
  end
end
#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
# 　バトル画面の処理を行うクラスです。
#==============================================================================

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 戦闘開始の処理   ■エイリアスor再定義
  #--------------------------------------------------------------------------
  alias bpsystem_process_battle_start process_battle_start
  def process_battle_start
    if NukumizuBPsystem::START_REDEFINE == true
    @message_window.clear
    wait(10)
    for name in $game_troop.enemy_names
      text = sprintf(Vocab::Emerge, name)
      $game_message.texts.push(text)
    end
    if $game_troop.preemptive
      text = sprintf(Vocab::Preemptive, $game_party.name)
      $game_message.texts.push(text)
    elsif $game_troop.surprise
      text = sprintf(Vocab::Surprise, $game_party.name)
      $game_message.texts.push(text)
    end
    wait_for_message
    @message_window.clear
    make_escape_ratio
    process_battle_event
    default_bp_set  #初期BPのセット(ここ以外はデフォルトスクリプトと同一)
    start_party_command_selection
    else  # 再定義しない場合
      default_bp_set  #初期BPのセット
      bpsystem_process_battle_start
    end
  end
  #--------------------------------------------------------------------------
  # ● ターン終了    ■エイリアスor再定義
  #--------------------------------------------------------------------------
  alias bpsystem_turn_end turn_end
  def turn_end
    if NukumizuBPsystem::END_REDEFINE == true
    $game_troop.turn_ending = true
    $game_party.slip_damage_effect
    $game_troop.slip_damage_effect
    $game_party.do_auto_recovery
    $game_troop.preemptive = false
    $game_troop.surprise = false
    process_battle_event
    gain_bp_set  #加算BPのセット(ここ以外はデフォルトスクリプトと同一)
    $game_troop.turn_ending = false
    start_party_command_selection
    else  # 再定義しない場合
      gain_bp_set  #加算BPのセット
      bpsystem_turn_end
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : 攻撃    ■エイリアス
  #--------------------------------------------------------------------------
  alias bp_execute_action_attack execute_action_attack
  def execute_action_attack
    bp_execute_action_attack
    @active_battler.mp -= NukumizuBPsystem::ATTACK_BP_COST
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : 防御    ■エイリアス
  #--------------------------------------------------------------------------
  alias bp_execute_action_guard execute_action_guard
  def execute_action_guard
    bp_execute_action_guard
    @active_battler.mp -= NukumizuBPsystem::GUARD_BP_COST
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : アイテム    ■エイリアス
  #--------------------------------------------------------------------------
  alias bp_execute_action_item execute_action_item
  def execute_action_item
    bp_execute_action_item
    @active_battler.mp -= NukumizuBPsystem::ITEM_BP_COST
  end
  #--------------------------------------------------------------------------
  # ● 初期BPのセット    ■新規
  #--------------------------------------------------------------------------
  def default_bp_set
    if $imported["LargeParty"] == true
      bp_members = $game_party.all_members
    else
      bp_members = $game_party.members
    end
    for i in bp_members
      i.mp = i.default_bp
    end
    for i in $game_troop.members
      i.mp = i.default_bp
    end
  end
  #--------------------------------------------------------------------------
  # ● 加算BPの処理    ■新規
  #--------------------------------------------------------------------------
  def gain_bp_set
    for i in $game_party.existing_members
      i.mp += i.gain_bp
    end
    for i in $game_troop.existing_members
      i.mp += i.gain_bp
    end
  end
end

#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
# 　バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ
# スのスーパークラスとして使用されます。
#==============================================================================
class Game_Battler
  #--------------------------------------------------------------------------
  # ● ステートのBP関連メモ数値の取得    ■新規
  #--------------------------------------------------------------------------
  def bp_state_notescan(keyword,bp)
    for state in self.states
      if state.note.include?("<#{keyword}:")
        statenote = state.note.scan(/<#{keyword}:(\D)(\d+)>/).flatten
        if statenote[0] == "="
          bp = statenote[1].to_i
        elsif statenote[0] == "+"
          bp += statenote[1].to_i
        elsif statenote[0] == "-"
          bp -= statenote[1].to_i
        end
      end
    end
    return bp
  end
end

#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
# 　アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
# の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
#==============================================================================
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● アクターの初期BPの取得    ■新規
  #--------------------------------------------------------------------------
  def default_bp
    bp = NukumizuBPsystem::ACTOR_DEFAULT_BP[self.id]
    if bp == nil
      bp = NukumizuBPsystem::PRESET_DEFAULT_BP
    end
    bp = bp_equips_notescan("初期BP",bp)
    bp = bp_state_notescan("初期BP",bp)
    return bp
  end
  #--------------------------------------------------------------------------
  # ● アクターの加算BPの取得    ■新規
  #--------------------------------------------------------------------------
  def gain_bp
    bp = NukumizuBPsystem::ACTOR_GAIN_BP[self.id]
    if bp == nil
      bp = NukumizuBPsystem::PRESET_GAIN_BP
    end
    bp = bp_equips_notescan("加算BP",bp)
    bp = bp_state_notescan("加算BP",bp)
    return bp
  end
  #--------------------------------------------------------------------------
  # ● 装備のBP関連メモ数値の取得    ■新規
  #--------------------------------------------------------------------------
  def bp_equips_notescan(keyword,bp)
    for i in self.equips.compact
      if i.note.include?("<#{keyword}:")
        equipnote = i.note.scan(/<#{keyword}:(\D)(\d+)>/).flatten
        if equipnote[0] == "="
          bp = equipnote[1].to_i
        elsif equipnote[0] == "+"
          bp += equipnote[1].to_i
        elsif equipnote[0] == "-"
          bp -= equipnote[1].to_i
        end
      end
    end
    return bp
  end
end

#==============================================================================
# ■ Game_Enemy
#------------------------------------------------------------------------------
# 　敵キャラを扱うクラスです。このクラスは Game_Troop クラス ($game_troop) の
# 内部で使用されます。
#==============================================================================
class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● エネミーの初期BPの取得    ■新規
  #--------------------------------------------------------------------------
  def default_bp
    bp = NukumizuBPsystem::PRESET_DEFAULT_BP
    bp = bp_enemy_notescan("初期BP",bp)
    bp = bp_state_notescan("初期BP",bp)
    return bp
  end
  #--------------------------------------------------------------------------
  # ● エネミーの加算BPの取得    ■新規
  #--------------------------------------------------------------------------
  def gain_bp
    bp = NukumizuBPsystem::PRESET_GAIN_BP
    bp = bp_enemy_notescan("加算BP",bp)
    bp = bp_state_notescan("加算BP",bp)
    return bp
  end
  #--------------------------------------------------------------------------
  # ● エネミーのBP関連メモ数値の取得    ■新規
  #--------------------------------------------------------------------------
  def bp_enemy_notescan(keyword,bp)
    enemy = $data_enemies[self.enemy_id]
    if enemy.note.include?("<#{keyword}:")
      enemynote = enemy.note.scan(/<#{keyword}:(\D)(\d+)>/).flatten
      if enemynote[0] == "="
        bp = enemynote[1].to_i
      elsif enemynote[0] == "+"
        bp += enemynote[1].to_i
      elsif enemynote[0] == "-"
        bp -= enemynote[1].to_i
      end
    end
    return bp
  end
end