#==============================================================================
#                   「ゲージによるステータス変動・改」(ACE) ver.3.4
#   製作者:奈々(なな)
#   へぷたなすくろーる http://heptanas.mamagoto.com/
#
#   ◇使用規約
#   使用される場合はスクリプト作成者として「奈々」を明記して下さい。
#   このスクリプトを改変したり、改変したものを配布するなどは自由ですが
#   その場合も元のスクリプトの作成者として名前は載せて下さい。
#   その他、詳しい利用規約はブログを参照して下さい。
#
#------------------------------------------------------------------------------
#
#   ゲージ量に応じてステータスを変動させることができます。
#   テンション、怒り、瀕死、根性値など
#   自由度の高い設定により、幅広いシステムを作成できます。
#
#   atk,def,mat,mdfの4つのステータスそれぞれに
#   HP/MP/TPの何れかを参照させることができます。
#   また「特定のステートでのみ変動」させることも可能です。
#   (対象ステートのメモ欄に<変動 atk><変動 def><変動 mat><変動 mdf>と書きます)
#   「どう変化するか」は幾つかのモードが用意されています。
#   
#   "a"
#   ゲージMAXを基準として、ゲージの減少に合わせて
#   ステータスも減少していくモードです。
#   
#   "b"
#   ゲージ0%を基準として、ゲージの増加に合わせて
#   ステータスも増加していくモードです。
#   
#   "c"
#   ゲージ50%を基準として、ゲージの増減に合わせて
#   ステータスも増減していくモードです。
#   
#   "d"
#   ゲージ50%を基準として、ゲージの減少に合わせて
#   ステータスも減少していくモードです。
#   cとは違い、ゲージが50%を超えてもステータスは増加しません。
#   
#   "e"
#   ゲージ50%を基準として、ゲージの増加に合わせて
#   ステータスも増加していくモードです。
#   cとは違い、ゲージが50%を割ってもステータスは減少しません。
#   
#   "f"
#   ゲージMAXを基準として、ゲージの減少に反して
#   ステータスが増加していくモードです。
#   
#   "g"
#   ゲージ0%を基準として、ゲージの増加に反して
#   ステータスが減少していくモードです。
#   
#   "h"
#   ゲージ50%を基準として、ゲージの増減に反して
#   ステータスは逆に増減していくモードです。
#   
#   "i"
#   ゲージ50%を基準として、ゲージの減少に反して
#   ステータスが増加していくモードです。
#   hとは違い、ゲージが50%を超えてもステータスは減少しません。
#   
#   "j"
#   ゲージ50%を基準として、ゲージの増加に反して
#   ステータスが減少していくモードです。
#   hとは違い、ゲージが50%を割ってもステータスは増加しません。
#   
#   "x"
#   プリセット以外のオリジナルパターンを作るモードです。
#   ・基準点
#   ゲージが指定した数値%のときを、増減なしのステータスとします。
#   ・連動タイプ
#   順連動:ゲージ↑ステータス↑、ゲージ↓ステータス↓
#   逆連動:ゲージ↑ステータス↓、ゲージ↓ステータス↑
#   ・限界点(上限点/下限点)
#   ゲージ参照の上限、下限を設定します。
#   例えば70%が上限なら、ゲージ70%と100%のときのステータスは同じです。
#
#==============================================================================
module Nana
module G_P
# ◇初期設定
# メニュー画面、ステータス画面、装備画面、ショップ画面の変動
# falseで変動なし、trueで変動あり
  PARAM_GAMEN = true

# 敵のステータスの変動
# falseでアクターのみ変動、trueでエネミーも変動あり
  ENEMY_G_P = false

# ◇攻撃力(atk)

  ATK_UP_STATE = -1      #0で常時有効、-1で常時無効、1で特定ステートのみ有効。
  ATK_HP_MP_TP = 1       #参照するゲージ、1ならHP、2ならMP、3ならTP。
  ATK_UP_MODE = "b"      #動作モード、詳しくは説明文を参照のこと。
  ATK_UP_RATE = 100      #変動係数、%指定で変化量をコントロールする。

# ◇防御力(def)

  DEF_UP_STATE = -1      #0で常時有効、-1で常時無効、1で特定ステートのみ有効。
  DEF_HP_MP_TP = 1       #参照するゲージ、1ならHP、2ならMP、3ならTP。
  DEF_UP_MODE = "b"      #動作モード、詳しくは説明文を参照のこと。
  DEF_UP_RATE = 100      #変動係数、%指定で変化量をコントロールする。

# ◇魔法力(mat)

  MAT_UP_STATE = -1      #0で常時有効、-1で常時無効、1で特定ステートのみ有効。
  MAT_HP_MP_TP = 1       #参照するゲージ、1ならHP、2ならMP、3ならTP。
  MAT_UP_MODE = "b"      #動作モード、詳しくは説明文を参照のこと。
  MAT_UP_RATE = 100      #変動係数、%指定で変化量をコントロールする。

# ◇魔法防御(mdf)

  MDF_UP_STATE = -1      #0で常時有効、-1で常時無効、1で特定ステートのみ有効。
  MDF_HP_MP_TP = 1       #参照するゲージ、1ならHP、2ならMP、3ならTP。
  MDF_UP_MODE = "b"      #動作モード、詳しくは説明文を参照のこと。
  MDF_UP_RATE = 100      #変動係数、%指定で変化量をコントロールする。

#動作モード"x"で使う詳細設定
  ATK_UP_LINE = 0        #基準点。
  ATK_UP_CONNECT = true  #連動タイプ。trueで順連動、falseで逆連動する。
  ATK_UP_LIMIT = 0       #限界点。%指定。
  ATK_UP_LIMIT_T = false #trueなら↑が上限、falseなら下限となる。

  DEF_UP_LINE = 0        #基準点。
  DEF_UP_CONNECT = true  #連動タイプ。trueで順連動、falseで逆連動する。
  DEF_UP_LIMIT = 0       #限界点。%指定。
  DEF_UP_LIMIT_T = false #trueなら↑が上限、falseなら下限となる。

  MAT_UP_LINE = 0        #基準点。
  MAT_UP_CONNECT = true  #連動タイプ。trueで順連動、falseで逆連動する。
  MAT_UP_LIMIT = 0       #限界点。%指定。
  MAT_UP_LIMIT_T = false #trueなら↑が上限、falseなら下限となる。

  MDF_UP_LINE = 0        #基準点。
  MDF_UP_CONNECT = true  #連動タイプ。trueで順連動、falseで逆連動する。
  MDF_UP_LIMIT = 0       #限界点。%指定。
  MDF_UP_LIMIT_T = false #trueなら↑が上限、falseなら下限となる。

end
end

#------------------------------------------------------------------------------

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 通常能力値の取得(再定義)
  #--------------------------------------------------------------------------
  alias param2 param
  def param(param_id)
    #特定シーンでは変動させない
    if Nana::G_P::PARAM_GAMEN == false &&
    (SceneManager.scene_is?(Scene_Equip) || SceneManager.scene_is?(Scene_Status) ||
    SceneManager.scene_is?(Scene_Shop) || SceneManager.scene_is?(Scene_Menu))
      return param2(param_id)
    else
      value = param2(param_id)
      value *= param_by_gauge(param_id)
      [[value, param_max(param_id)].min, param_min(param_id)].max.to_i
      return value.truncate
    end
  end
end

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 通常能力値の取得(再定義)
  #--------------------------------------------------------------------------
  alias param2 param
  def param(param_id)
    #エネミーは変動させない
    if Nana::G_P::ENEMY_G_P == false
      return param2(param_id)
    else
      value = param2(param_id)
      value *= param_by_gauge(param_id)
      [[value, param_max(param_id)].min, param_min(param_id)].max.to_i
      return value.truncate
    end
  end
end

class Game_Battler < Game_BattlerBase
  
  #--------------------------------------------------------------------------
  # ● ステータス変動判定&処理
  #--------------------------------------------------------------------------  
  def param_by_gauge(param_id)
    val = 1
    case param_id
    #◇攻撃力
    when 2
      #変動が有効かの判定
      if (Nana::G_P::ATK_UP_STATE == 1 && self.states.any?{|i|
        i.note.include?("<変動 atk>")}) || Nana::G_P::ATK_UP_STATE == 0
        #係数とゲージ量を取得。
        rate = Nana::G_P::ATK_UP_RATE
        gauge = self.hp_rate if Nana::G_P::ATK_HP_MP_TP == 1
        gauge = self.mp_rate if Nana::G_P::ATK_HP_MP_TP == 2
        gauge = self.tp_rate if Nana::G_P::ATK_HP_MP_TP == 3
        #モードに応じてプリセットを行う
        case Nana::G_P::ATK_UP_MODE
        when "x"
          line = Nana::G_P::ATK_UP_LINE
          connect = Nana::G_P::ATK_UP_CONNECT
          limit = Nana::G_P::ATK_UP_LIMIT
          limit_t = Nana::G_P::ATK_UP_LIMIT_T
        when "a"
          line = 100
          connect = true
          limit = 0
          limit_t = false
        when "b"
          line = 0
          connect = true
          limit = 0
          limit_t = false
        when "c"
          line = 50
          connect = true
          limit = 0
          limit_t = false
        when "d"
          line = 50
          connect = true
          limit = 50
          limit_t = true
        when "e"
          line = 50
          connect = true
          limit = 50
          limit_t = false
        when "f"
          line = 100
          connect = false
          limit = 0
          limit_t = false
        when "g"
          line = 0
          connect = false
          limit = 0
          limit_t = false
        when "h"
          line = 50
          connect = false
          limit = 0
          limit_t = false
        when "i"
          line = 50
          connect = false
          limit = 50
          limit_t = true
        when "j"
          line = 50
          connect = false
          limit = 50
          limit_t = false
        end
        #百分率タイプの数値を少数タイプに統一
        rate *= 0.01
        line *= 0.01
        limit *= 0.01
        #ゲージ量のリミット判定
        if limit_t == true
          gauge = [gauge, limit].min
        else
          gauge = [gauge, limit].max
        end
        #最終的な計算式
        if connect == true
          val = 1 + (gauge - line) * rate
        else
          val = 1 - (gauge - line) * rate
        end
      end

    #防御力
    when 3
      #変動が有効かの判定
      if (Nana::G_P::DEF_UP_STATE == 1 && self.states.any?{|i|
        i.note.include?("<変動 def>")}) || Nana::G_P::DEF_UP_STATE == 0
        #係数とゲージ量を取得。
        rate = Nana::G_P::DEF_UP_RATE
        gauge = self.hp_rate if Nana::G_P::DEF_HP_MP_TP == 1
        gauge = self.mp_rate if Nana::G_P::DEF_HP_MP_TP == 2
        gauge = self.tp_rate if Nana::G_P::DEF_HP_MP_TP == 3
        #モードに応じてプリセットを行う
        case Nana::G_P::DEF_UP_MODE
        when "x"
          line = Nana::G_P::DEF_UP_LINE
          connect = Nana::G_P::DEF_UP_CONNECT
          limit = Nana::G_P::DEF_UP_LIMIT
          limit_t = Nana::G_P::DEF_UP_LIMIT_T
        when "a"
          line = 100
          connect = true
          limit = 0
          limit_t = false
        when "b"
          line = 0
          connect = true
          limit = 0
          limit_t = false
        when "c"
          line = 50
          connect = true
          limit = 0
          limit_t = false
        when "d"
          line = 50
          connect = true
          limit = 50
          limit_t = true
        when "e"
          line = 50
          connect = true
          limit = 50
          limit_t = false
        when "f"
          line = 100
          connect = false
          limit = 0
          limit_t = false
        when "g"
          line = 0
          connect = false
          limit = 0
          limit_t = false
        when "h"
          line = 50
          connect = false
          limit = 0
          limit_t = false
        when "i"
          line = 50
          connect = false
          limit = 50
          limit_t = true
        when "j"
          line = 50
          connect = false
          limit = 50
          limit_t = false
        end
        #百分率タイプの数値を少数タイプに統一
        rate *= 0.01
        line *= 0.01
        limit *= 0.01
        #ゲージ量のリミット判定
        if limit_t == true
          gauge = [gauge, limit].min
        else
          gauge = [gauge, limit].max
        end
        #最終的な計算式
        if connect == true
          val = 1 + (gauge - line) * rate
        else
          val = 1 - (gauge - line) * rate
        end
      end

    #魔法力
    when 4
      #変動が有効かの判定
      if (Nana::G_P::MAT_UP_STATE == 1 && self.states.any?{|i|
        i.note.include?("<変動 mat>")}) || Nana::G_P::MAT_UP_STATE == 0
        #係数とゲージ量を取得。
        rate = Nana::G_P::MAT_UP_RATE
        gauge = self.hp_rate if Nana::G_P::MAT_HP_MP_TP == 1
        gauge = self.mp_rate if Nana::G_P::MAT_HP_MP_TP == 2
        gauge = self.tp_rate if Nana::G_P::MAT_HP_MP_TP == 3
        #モードに応じてプリセットを行う
        case Nana::G_P::MAT_UP_MODE
        when "x"
          line = Nana::G_P::MAT_UP_LINE
          connect = Nana::G_P::MAT_UP_CONNECT
          limit = Nana::G_P::MAT_UP_LIMIT
          limit_t = Nana::G_P::MAT_UP_LIMIT_T
        when "a"
          line = 100
          connect = true
          limit = 0
          limit_t = false
        when "b"
          line = 0
          connect = true
          limit = 0
          limit_t = false
        when "c"
          line = 50
          connect = true
          limit = 0
          limit_t = false
        when "d"
          line = 50
          connect = true
          limit = 50
          limit_t = true
        when "e"
          line = 50
          connect = true
          limit = 50
          limit_t = false
        when "f"
          line = 100
          connect = false
          limit = 0
          limit_t = false
        when "g"
          line = 0
          connect = false
          limit = 0
          limit_t = false
        when "h"
          line = 50
          connect = false
          limit = 0
          limit_t = false
        when "i"
          line = 50
          connect = false
          limit = 50
          limit_t = true
        when "j"
          line = 50
          connect = false
          limit = 50
          limit_t = false
        end
        #百分率タイプの数値を少数タイプに統一
        rate *= 0.01
        line *= 0.01
        limit *= 0.01
        #ゲージ量のリミット判定
        if limit_t == true
          gauge = [gauge, limit].min
        else
          gauge = [gauge, limit].max
        end
        #最終的な計算式
        if connect == true
          val = 1 + (gauge - line) * rate
        else
          val = 1 - (gauge - line) * rate
        end
      end

    #魔法防御
    when 5
      #変動が有効かの判定
      if (Nana::G_P::MDF_UP_STATE == 1 && self.states.any?{|i|
        i.note.include?("<変動 mdf>")}) || Nana::G_P::MDF_UP_STATE == 0
        #係数とゲージ量を取得。
        rate = Nana::G_P::MDF_UP_RATE
        gauge = self.hp_rate if Nana::G_P::MDF_HP_MP_TP == 1
        gauge = self.mp_rate if Nana::G_P::MDF_HP_MP_TP == 2
        gauge = self.tp_rate if Nana::G_P::MDF_HP_MP_TP == 3
        #モードに応じてプリセットを行う
        case Nana::G_P::MDF_UP_MODE
        when "x"
          line = Nana::G_P::MDF_UP_LINE
          connect = Nana::G_P::MDF_UP_CONNECT
          limit = Nana::G_P::MDF_UP_LIMIT
          limit_t = Nana::G_P::MDF_UP_LIMIT_T
        when "a"
          line = 100
          connect = true
          limit = 0
          limit_t = false
        when "b"
          line = 0
          connect = true
          limit = 0
          limit_t = false
        when "c"
          line = 50
          connect = true
          limit = 0
          limit_t = false
        when "d"
          line = 50
          connect = true
          limit = 50
          limit_t = true
        when "e"
          line = 50
          connect = true
          limit = 50
          limit_t = false
        when "f"
          line = 100
          connect = false
          limit = 0
          limit_t = false
        when "g"
          line = 0
          connect = false
          limit = 0
          limit_t = false
        when "h"
          line = 50
          connect = false
          limit = 0
          limit_t = false
        when "i"
          line = 50
          connect = false
          limit = 50
          limit_t = true
        when "j"
          line = 50
          connect = false
          limit = 50
          limit_t = false
        end
        #百分率タイプの数値を少数タイプに統一
        rate *= 0.01
        line *= 0.01
        limit *= 0.01
        #ゲージ量のリミット判定
        if limit_t == true
          gauge = [gauge, limit].min
        else
          gauge = [gauge, limit].max
        end
        #最終的な計算式
        if connect == true
          val = 1 + (gauge - line) * rate
        else
          val = 1 - (gauge - line) * rate
        end
      end
    end
    return val
  end
end