Project1

标题: [RM脚本] 战斗终了能力上升 [打印本页]

作者: 九泪    时间: 2006-5-29 22:37
标题: [RM脚本] 战斗终了能力上升
效果图:


[概要]
戦闘時の行動によって、バトル終了時に一定確率で能力値がアップします。


  1. #==============================================================================
  2. # ++ 戦闘終了時にステータスUP ver. 1.40 ++
  3. #  Script by パラ犬
  4. #  http://para.j-mx.com/
  5. #------------------------------------------------------------------------------
  6. # 戦闘時の行動により、バトル終了時にステータスがアップします。
  7. #------------------------------------------------------------------------------
  8. #[設置上の注意]
  9. # アクティブタイムバトルと併用する時は、このスクリプトを下に置いてください。
  10. #==============================================================================

  11. module PARA_STSUP
  12.   
  13.   # 各行動時に能力値がアップする確率
  14.   # (戦闘終了時に全ての行動の平均値で計算します)
  15.   # [最大HP/最大SP/腕力/器用さ/素早さ/魔力]
  16.   ACT_ATK = [10, 0, 10, 5, 5, 0]      # 通常攻撃
  17.   ACT_SKILL = [5, 10, 5, 5, 5, 5]     # スキル
  18.   ACT_GUARD = [20, 0, 0, 0, 0, 0]     # 防御
  19.   ACT_ITEM = [5, 5, 5, 5, 5, 5]       # アイテム
  20.   ACT_NONE = [0, 0, 0, 0, 0, 0]       # コマンド未入力または行動不能

  21.   # 武器属性で通常攻撃の成長率を変化
  22.   # (書式は「 "属性名"=>成長率 」。最終行は「 } 」で閉じる)
  23.   ATK_ELEMENTS = {  "剣" => [10, 0, 10, 5, 5, 0],
  24.                     "槍" => [10, 0, 10, 5, 5, 0],
  25.                     "斧" => [10, 0, 20, 0, 0, 0]}

  26.   # スキルの属性で成長率を変化
  27.   SKILL_ELEMENTS = {  "剣" => [5, 10, 10, 5, 5, 0],
  28.                       "槍" => [5, 10, 5, 5, 10, 0],
  29.                       "斧" => [10, 10, 20, 0, 0, 0],
  30.                       "黒魔法\" => [0, 15, 0, 5, 0, 15],
  31.                       "神聖魔法" => [0, 15, 0, 0, 5, 15]}

  32.   # 上昇値 [最小値,最大値]
  33.   # [最大HP/最大SP/腕力/器用さ/素早さ/魔力]
  34.   UP_POINT = [ [5,20], [5,20], [1,5], [1,5], [1,5], [1,5] ]
  35.   
  36.   # 能力値限界
  37.   # [最大HP/最大SP/腕力/器用さ/素早さ/魔力]
  38.   LIMIT = [ 999999, 9999, 999, 999, 999, 999 ]

  39.   # ステータスアップを行わないアクターのID
  40.   #(アクターIDをコンマで区切って記述。 例:[ 0, 2, 3 ] )
  41.   EXC_ACTOR = []

  42.   # ステータスアップ結果の表示順( 0:アクターごと / 1:能力値ごと )
  43.   THREAD_TYPE = 0

  44.   # ステータス上昇ウインドウを表示するか( true / false )
  45.   VIEW_VISIBLE = true
  46.   # ステータス上昇ウインドウの書式
  47.   # {name} :アクター名
  48.   # {param} :パラメータ
  49.   # {point} :上昇値
  50.   VIEW_TEXT = "{name}の{param}が{point}ポイントアップ"
  51.   # ステータス上昇ウインドウの表示時間
  52.   VIEW_TIME = 40
  53.   # ステータス上昇ウインドウを表示しないときのアニメーション表示間隔
  54.   VIEW_ANM_TIME = 8
  55.   
  56.   # 敵との強さに差があるとき、成長率に影響を与えるか( true / false )
  57.   # (補正率は「敵の能力値÷アクターの能力値」の平均)
  58.   LVEF = true
  59.   # 能力値アップ率に対する補正率の適用パーセント
  60.   LVEF_PER = 50
  61.   # 上昇値に対する補正率の適用パーセント
  62.   LVEF_POINT = 0
  63.   # 人数差が補正率に与える影響(パーセント)
  64.   LVEF_PARTIES = 50
  65.   
  66.   # ステータスアップ時にアニメーションを表示( true / false )
  67.   ANM_USE = true
  68.   # 表示するアニメーションのID
  69.   ANM_HP = 98    # 最大HP
  70.   ANM_SP = 98    # 最大SP
  71.   ANM_STR = 98   # 腕力
  72.   ANM_DEX = 98   # 器用さ
  73.   ANM_AGI = 98   # 素早さ
  74.   ANM_INT = 98   # 魔力
  75.   
  76. end

  77. # ↑ 設定項目ここまで
  78. #------------------------------------------------------------------------------

  79. #==============================================================================
  80. # ■ Scene_Battle
  81. #==============================================================================

  82. class Scene_Battle
  83.   #--------------------------------------------------------------------------
  84.   # ● プレバトルフェーズ開始
  85.   #--------------------------------------------------------------------------
  86.   alias start_phase1_stsup start_phase1
  87.   def start_phase1
  88.     for actor in $game_party.actors
  89.       # 行動履歴を初期化
  90.       actor.act_history = []
  91.     end
  92.     @stsup = []
  93.     @now_stsup_anm = -1
  94.     @btl_lv = 0
  95.     enemy_sts = [0,0,0,0,0,0]
  96.     actor_sts = [0,0,0,0,0,0]
  97.     btl_lv = [0,0,0,0,0,0]
  98.     # エネミーの強さを記録
  99.     for enemy in $game_troop.enemies
  100.       enemy_sts[0] += enemy.base_maxhp
  101.       enemy_sts[1] += enemy.base_maxsp
  102.       enemy_sts[2] += enemy.base_str
  103.       enemy_sts[3] += enemy.base_dex
  104.       enemy_sts[4] += enemy.base_agi
  105.       enemy_sts[5] += enemy.base_int
  106.     end
  107.     # アクターの強さを記録
  108.     for actor in $game_party.actors
  109.       actor_sts[0] += actor.base_maxhp
  110.       actor_sts[1] += actor.base_maxsp
  111.       actor_sts[2] += actor.base_str
  112.       actor_sts[3] += actor.base_dex
  113.       actor_sts[4] += actor.base_agi
  114.       actor_sts[5] += actor.base_int
  115.     end
  116.     # 一体あたりの強さを計算
  117.     for i in 0..5
  118.       enemy_sts[i] /= $game_troop.enemies.size.to_f
  119.       actor_sts[i] /= $game_party.actors.size.to_f
  120.     end
  121.     # 敵の強さの倍率
  122.     for i in 0..5
  123.       btl_lv[i] = enemy_sts[i] / actor_sts[i]
  124.       @btl_lv += btl_lv[i]
  125.     end
  126.     @btl_lv /= btl_lv.size
  127.     # 人数差による補正
  128.     m = $game_troop.enemies.size.to_f / $game_party.actors.size.to_f
  129.     if m >= 1
  130.       m = 1 + (m - 1) * PARA_STSUP::LVEF_PARTIES / 100
  131.     else
  132.       m = 1 - (1 - m) * PARA_STSUP::LVEF_PARTIES / 100
  133.     end
  134.     if @btl_lv >= 1
  135.       @btl_lv = (@btl_lv - 1) * m + 1
  136.     else
  137.       @btl_lv = @btl_lv * m
  138.     end
  139.     start_phase1_stsup
  140.   end
  141.   #--------------------------------------------------------------------------
  142.   # ● 次のアクターのコマンド入力へ
  143.   #--------------------------------------------------------------------------
  144.   alias phase3_next_actor_stsup phase3_next_actor
  145.   def phase3_next_actor
  146.     if @active_battler != nil
  147.       # アクションを行動履歴に追加
  148.       act_kind = @active_battler.current_action.kind
  149.       act_basic = @active_battler.current_action.basic
  150.       act = [act_kind,act_basic]
  151.       if act == [0,0]  # 攻撃
  152.         # 武器属性によって成長率を変更
  153.         if @active_battler.element_set.size != 0
  154.           for element_id in @active_battler.element_set
  155.             element_name = $data_system.elements[element_id]
  156.             if PARA_STSUP::ATK_ELEMENTS.include?(element_name)
  157.               per = PARA_STSUP::ATK_ELEMENTS[element_name]
  158.             end
  159.           end
  160.         end
  161.         if per == nil
  162.           per = PARA_STSUP::ACT_ATK
  163.         end
  164.       elsif act == [0,1]  # 防御
  165.         per = PARA_STSUP::ACT_GUARD
  166.       elsif act == [1,3] or act == [1,0]  # スキル
  167.         # スキル属性によって成長率を変更
  168.         skill_id = @active_battler.current_action.skill_id
  169.         skill_elements = $data_skills[skill_id].element_set
  170.         if skill_elements.size != 0
  171.           for element_id in skill_elements
  172.             element_name = $data_system.elements[element_id]
  173.             if PARA_STSUP::SKILL_ELEMENTS.include?(element_name)
  174.               per = PARA_STSUP::SKILL_ELEMENTS[element_name]
  175.             end
  176.           end
  177.         end
  178.         if per == nil
  179.           per = PARA_STSUP::ACT_SKILL
  180.         end
  181.       elsif act == [2,3] or act == [2,0]  # アイテム
  182.         per = PARA_STSUP::ACT_ITEM
  183.       else
  184.         per = PARA_STSUP::ACT_NONE
  185.       end
  186.       @active_battler.act_history.push(per)
  187.     end
  188.     phase3_next_actor_stsup
  189.   end
  190.   #--------------------------------------------------------------------------
  191.   # ● 前のアクターのコマンド入力へ
  192.   #--------------------------------------------------------------------------
  193.   alias phase3_prior_actor_stsup phase3_prior_actor
  194.   def phase3_prior_actor
  195.     phase3_prior_actor_stsup
  196.     if @active_battler != nil
  197.       # 行動履歴を削除
  198.       @active_battler.act_history.pop
  199.     end
  200.   end
  201.   #--------------------------------------------------------------------------
  202.   # ● アフターバトルフェーズ開始
  203.   #--------------------------------------------------------------------------
  204.   alias start_phase5_stsup start_phase5
  205.   def start_phase5
  206.     start_phase5_stsup
  207.     # ステータスアップ処理
  208.     status_up
  209.   end
  210.   #--------------------------------------------------------------------------
  211.   # ● フレーム更新 (アフターバトルフェーズ)
  212.   #--------------------------------------------------------------------------
  213.   alias update_phase5_stsup update_phase5
  214.   def update_phase5
  215.     # ステータス上昇ウインドウ表示待ちのアイテムがある場合
  216.     if @stsup != nil and @stsup != []
  217.       # C ボタンが押された場合
  218.       if Input.trigger?(Input::C)
  219.         # 次のステータスアップウインドウを表示
  220.         result_stsup
  221.       end
  222.       # ウェイトカウントが 0 より大きい場合
  223.       if @phase5_wait_count > 0
  224.         # ウェイトカウントを減らす
  225.         @phase5_wait_count -= 1
  226.         # ウェイトカウントが 0 になった場合
  227.         if @phase5_wait_count == 0
  228.           # 次のステータスアップウインドウを表示
  229.           result_stsup
  230.         end
  231.         return
  232.       end
  233.     # ステータス上昇ウインドウ表示中の場合
  234.     elsif @help_window.visible
  235.       # C ボタンが押された場合
  236.       if Input.trigger?(Input::C)
  237.         @help_window.visible = false
  238.         @phase5_wait_count = 1
  239.       end
  240.       # ウェイトカウントが 0 より大きい場合
  241.       if @phase5_wait_count > 0
  242.         # ウェイトカウントを減らす
  243.         @phase5_wait_count -= 1
  244.         # ウェイトカウントが 0 になった場合
  245.         if @phase5_wait_count == 0
  246.           @help_window.visible = false
  247.           @phase5_wait_count = 1
  248.         end
  249.         return
  250.       end
  251.     else
  252.       update_phase5_stsup
  253.     end
  254.   end
  255.   #--------------------------------------------------------------------------
  256.   # ○ ステータスアップウインドウを表示
  257.   #--------------------------------------------------------------------------
  258.   def result_stsup
  259.     if @stsup[0] != nil and @stsup[0] != []
  260.       # 配列の先頭から値を取り出す
  261.       stsup = @stsup[0]
  262.       # 能力値の名前を取得
  263.       case stsup[1]
  264.         when 0  # 最大HP
  265.         stsup_sts = $data_system.words.hp
  266.         when 1  # 最大SP
  267.         stsup_sts = $data_system.words.sp
  268.         when 2  # 腕力
  269.         stsup_sts = $data_system.words.str
  270.         when 3  # 器用さ
  271.         stsup_sts = $data_system.words.dex
  272.         when 4  # 素早さ
  273.         stsup_sts = $data_system.words.agi
  274.         when 5  # 魔力
  275.         stsup_sts = $data_system.words.int
  276.       end
  277.       name = stsup[0].name
  278.       param = stsup_sts
  279.       point = stsup[2]
  280.       # 表示する文字列を設定
  281.       text = PARA_STSUP::VIEW_TEXT.dup
  282.       begin
  283.         text[/{name}/] = "#{name}"
  284.       rescue
  285.       end
  286.       begin
  287.         text[/{param}/] = "#{param}"
  288.       rescue
  289.       end
  290.       begin
  291.         text[/{point}/] = "#{point.to_s}"
  292.       rescue
  293.       end
  294.       # ヘルプウィンドウに文字列をセット
  295.       @help_window.set_text(text, 1)
  296.       # アニメーションを表示
  297.       if PARA_STSUP::ANM_USE
  298.         # アニメーションをまとめて表示
  299.         if PARA_STSUP::THREAD_TYPE == 1
  300.           if @now_stsup_anm != stsup[1]
  301.             @now_stsup_anm = stsup[1]
  302.             actors = []
  303.             for sts_group in @stsup
  304.               if sts_group[1] == @now_stsup_anm
  305.                 actors.push(sts_group[0])
  306.               end
  307.             end
  308.             for actor in actors
  309.               case @now_stsup_anm
  310.                 when 0  # 最大HP
  311.                 actor.animation_id = PARA_STSUP::ANM_HP
  312.                 when 1  # 最大SP
  313.                 actor.animation_id = PARA_STSUP::ANM_SP
  314.                 when 2  # 腕力
  315.                 actor.animation_id = PARA_STSUP::ANM_STR
  316.                 when 3  # 器用さ
  317.                 actor.animation_id = PARA_STSUP::ANM_DEX
  318.                 when 4  # 素早さ
  319.                 actor.animation_id = PARA_STSUP::ANM_AGI
  320.                 when 5  # 魔力
  321.                 actor.animation_id = PARA_STSUP::ANM_INT
  322.               end
  323.             end
  324.           end
  325.         else
  326.           actor = stsup[0]
  327.           case stsup[1]
  328.             when 0  # 最大HP
  329.             actor.animation_id = PARA_STSUP::ANM_HP
  330.             when 1  # 最大SP
  331.             actor.animation_id = PARA_STSUP::ANM_SP
  332.             when 2  # 腕力
  333.             actor.animation_id = PARA_STSUP::ANM_STR
  334.             when 3  # 器用さ
  335.             actor.animation_id = PARA_STSUP::ANM_DEX
  336.             when 4  # 素早さ
  337.             actor.animation_id = PARA_STSUP::ANM_AGI
  338.             when 5  # 魔力
  339.             actor.animation_id = PARA_STSUP::ANM_INT
  340.           end
  341.         end
  342.       end
  343.       @stsup.shift
  344.       # ヘルプウィンドウを表示
  345.       if PARA_STSUP::VIEW_VISIBLE
  346.         @help_window.visible = true
  347.         @phase5_wait_count = PARA_STSUP::VIEW_TIME
  348.       else
  349.         @help_window.visible = false
  350.         @phase5_wait_count = PARA_STSUP::VIEW_ANM_TIME
  351.       end
  352.     end
  353.   end
  354.   #--------------------------------------------------------------------------
  355.   # ○ ステータスアップ処理
  356.   #--------------------------------------------------------------------------
  357.   def status_up
  358.     for actor in $game_party.actors
  359.       # EXPを取得できないステート時もしくは
  360.       # 除外アクターは処理をスキップ
  361.       if actor.cant_get_exp? or PARA_STSUP::EXC_ACTOR.include?(actor.id)
  362.         next
  363.       end
  364.       stsup_percent = [0,0,0,0,0,0]
  365.       # コマンド未入力だった場合
  366.       if actor.act_history == []
  367.         # ダミーコマンドを追加
  368.         actor.act_history.push(PARA_STSUP::ACT_NONE)
  369.       end
  370.       for act in actor.act_history
  371.         # 上昇パーセンテージを合計
  372.         for i in 0...stsup_percent.size
  373.           stsup_percent[i] += act[i]
  374.         end
  375.       end
  376.       # 敵の強さによる補正
  377.       if PARA_STSUP::LVEF
  378.         for i in 0..stsup_percent.size-1
  379.           if @btl_lv >= 1
  380.             btl_per = 1 + (@btl_lv - 1) * PARA_STSUP::LVEF_PER / 100
  381.           else
  382.             btl_per = 1 - (1 - @btl_lv) * PARA_STSUP::LVEF_PER / 100
  383.           end
  384.           stsup_percent[i] *= btl_per
  385.         end
  386.       end
  387.       # 上昇パーセンテージを算出
  388.       for i in 0..stsup_percent.size-1
  389.         stsup_percent[i] /= actor.act_history.size
  390.       end
  391.       # 各ステータスで上昇判定
  392.       for s in 0..stsup_percent.size-1
  393.         rnd = rand(100)
  394.         if stsup_percent[s] > rnd
  395.           # 上昇値を決定
  396.           up_point = PARA_STSUP::UP_POINT[s].dup
  397.           # 敵の強さによる補正
  398.           if PARA_STSUP::LVEF
  399.             if @btl_lv >= 1
  400.               btl_point = 1 + (@btl_lv - 1) * PARA_STSUP::LVEF_POINT / 100
  401.             else
  402.               btl_point = 1 - (1 - @btl_lv) * PARA_STSUP::LVEF_POINT / 100
  403.             end
  404.             up_point[0] *= @btl_lv * btl_point
  405.             up_point[1] *= @btl_lv * btl_point
  406.           end
  407.           # ランダマイズ
  408.           rnd_val = (up_point[1] - up_point[0]).floor
  409.           rnd_pt = rand(rnd_val)
  410.           stsup_pt = (rnd_pt + up_point[0]).floor
  411.           # 能力値を上昇
  412.           case s
  413.             when 0  # 最大HP
  414.               if actor.stsup_maxhp + stsup_pt > PARA_STSUP::LIMIT[0]
  415.                 stsup_pt = PARA_STSUP::LIMIT[0] - actor.stsup_maxhp
  416.                 stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
  417.               end
  418.               actor.stsup_maxhp += stsup_pt
  419.             when 1  # 最大SP
  420.               if actor.stsup_maxsp + stsup_pt > PARA_STSUP::LIMIT[1]
  421.                 stsup_pt = PARA_STSUP::LIMIT[1] - actor.stsup_maxsp
  422.                 stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
  423.               end
  424.               actor.stsup_maxsp += stsup_pt
  425.             when 2  # 腕力
  426.               if actor.stsup_str + stsup_pt > PARA_STSUP::LIMIT[2]
  427.                 stsup_pt = PARA_STSUP::LIMIT[2] - actor.stsup_str
  428.                 stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
  429.               end
  430.               actor.stsup_str += stsup_pt
  431.             when 3  # 器用さ
  432.               if actor.stsup_dex + stsup_pt > PARA_STSUP::LIMIT[3]
  433.                 stsup_pt = PARA_STSUP::LIMIT[3] - actor.stsup_dex
  434.                 stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
  435.               end
  436.               actor.stsup_dex += stsup_pt
  437.             when 4  # 素早さ
  438.               if actor.stsup_agi + stsup_pt > PARA_STSUP::LIMIT[4]
  439.                 stsup_pt = PARA_STSUP::LIMIT[4] - actor.stsup_agi
  440.                 stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
  441.               end
  442.               actor.stsup_agi += stsup_pt
  443.             when 5  # 魔力
  444.               if actor.stsup_int + stsup_pt > PARA_STSUP::LIMIT[5]
  445.                 stsup_pt = PARA_STSUP::LIMIT[5] - actor.stsup_int
  446.                 stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
  447.               end
  448.               actor.stsup_int += stsup_pt
  449.           end
  450.           # 上昇ポイントが0のときはスキップ
  451.           if stsup_pt <= 0
  452.             next
  453.           end
  454.           # 配列に追加
  455.           @stsup.push([actor,s,stsup_pt])
  456.         end
  457.       end
  458.     end
  459.     if PARA_STSUP::THREAD_TYPE == 1 and @stsup != []
  460.       # 能力値ごとにソート
  461.       @stsup.sort! do |a, b|
  462.         if a[1] > b[1]
  463.           +1
  464.         elsif a[1] < b[1]
  465.           -1
  466.         elsif a[0].index > b[0].index
  467.           +1
  468.         elsif a[0].index < b[0].index
  469.           -1
  470.         else
  471.           a <=> b
  472.         end
  473.       end
  474.     end
  475.   end
  476. end

  477. #==============================================================================
  478. # ■ Game_Battler
  479. #==============================================================================

  480. class Game_Battler
  481.   #--------------------------------------------------------------------------
  482.   # ● 公開インスタンス変数
  483.   #--------------------------------------------------------------------------
  484.   attr_accessor :act_history          # 行動履歴
  485.   #--------------------------------------------------------------------------
  486.   # ● オブジェクト初期化
  487.   #--------------------------------------------------------------------------
  488.   alias initialize_stsup initialize
  489.   def initialize
  490.     initialize_stsup
  491.     @act_history = []
  492.   end
  493. end

  494. #==============================================================================
  495. # ■ Game_Actor
  496. #==============================================================================

  497. class Game_Actor < Game_Battler
  498.   #--------------------------------------------------------------------------
  499.   # ● 公開インスタンス変数
  500.   #--------------------------------------------------------------------------
  501.   attr_accessor :stsup_maxhp
  502.   attr_accessor :stsup_maxsp
  503.   attr_accessor :stsup_str
  504.   attr_accessor :stsup_dex
  505.   attr_accessor :stsup_agi
  506.   attr_accessor :stsup_int
  507.   #--------------------------------------------------------------------------
  508.   # ● セットアップ
  509.   #     actor_id : アクター ID
  510.   #--------------------------------------------------------------------------
  511.   alias setup_stsup setup
  512.   def setup(actor_id)
  513.     setup_stsup(actor_id)
  514.     @stsup_maxhp = 0
  515.     @stsup_maxsp = 0
  516.     @stsup_str = 0
  517.     @stsup_dex = 0
  518.     @stsup_agi = 0
  519.     @stsup_int = 0
  520.   end
  521.   #--------------------------------------------------------------------------
  522.   # ● 基本 MaxHP の取得
  523.   #--------------------------------------------------------------------------
  524.   alias base_maxhp_stsup base_maxhp
  525.   def base_maxhp
  526.     n = base_maxhp_stsup
  527.     if @stsup_maxhp != nil
  528.       n += @stsup_maxhp
  529.     end
  530.     return n
  531.   end
  532.   #--------------------------------------------------------------------------
  533.   # ● 基本 MaxSP の取得
  534.   #--------------------------------------------------------------------------
  535.   alias base_maxsp_stsup base_maxsp
  536.   def base_maxsp
  537.     n = base_maxsp_stsup
  538.     if @stsup_maxsp != nil
  539.       n += @stsup_maxsp
  540.     end
  541.     return n
  542.   end
  543.   #--------------------------------------------------------------------------
  544.   # ● 基本腕力の取得
  545.   #--------------------------------------------------------------------------
  546.   alias base_str_stsup base_str
  547.   def base_str
  548.     n = base_str_stsup
  549.     if @stsup_str != nil
  550.       n += @stsup_str
  551.     end
  552.     return n
  553.   end
  554.   #--------------------------------------------------------------------------
  555.   # ● 基本器用さの取得
  556.   #--------------------------------------------------------------------------
  557.   alias base_dex_stsup base_dex
  558.   def base_dex
  559.     n = base_dex_stsup
  560.     if @stsup_dex != nil
  561.       n += @stsup_dex
  562.     end
  563.     return n
  564.   end
  565.   #--------------------------------------------------------------------------
  566.   # ● 基本素早さの取得
  567.   #--------------------------------------------------------------------------
  568.   alias base_agi_stsup base_agi
  569.   def base_agi
  570.     n = base_agi_stsup
  571.     if @stsup_agi != nil
  572.       n += @stsup_agi
  573.     end
  574.     return n
  575.   end
  576.   #--------------------------------------------------------------------------
  577.   # ● 基本魔力の取得
  578.   #--------------------------------------------------------------------------
  579.   alias base_int_stsup base_int
  580.   def base_int
  581.     n = base_int_stsup
  582.     if @stsup_int != nil
  583.       n += @stsup_int
  584.     end
  585.     return n
  586.   end
  587. end
复制代码


[設定]
まず、能力値上昇が発生するパーセンテージを決定します。
値は各自のゲームバランスに合わせて調節してください。
配列は、左から順に[最大HP/最大SP/腕力/器用さ/素早さ/魔力]となっています。

戦闘終了時に全ての行動の上昇率の平均値から、能力上昇が起こるか決定します。
合計ではなく平均値なので、注意してください。

たとえば、次のように上昇率を設定したとします。

  ACT_ATK = [10, 0, 10, 5, 5, 0]   # 通常攻撃
  ACT_GUARD = [20, 0, 0, 0, 0, 0]   # 防御

この上昇率で、攻撃4回&防御1回を行ったとき、
戦闘終了時に各能力値がアップする確率は

 最大HP:12% 最大SP:0% 腕力:8%
 器用さ:4% 素早さ:4% 魔力:0%

となります。
(これを基本値として、敵の強さに応じて補正が入ります)

上昇する数値は、各ステータスごとに最大値と最小値を設定し、
その範囲内でランダムに上昇します。



[おまけ]


[更新履歴]
2005/9/20 ver.1.40
 設定項目「能力値限界」を追加。
 EXPを獲得できないステート時はステータスアップ処理を行わないように。
 ステータスアップしないアクターを設定できるように。
2005/7/31 ver.1.31
 Raise Field様のサイドビュースクリプトとの併用に対応。
2005/7/31 ver.1.30
 武器およびスキルに属性を付加することで成長率を変化させる機能を追加。
 ステータスアップ結果をアップした能力値ごとにまとめて表示可能に。
 ステータス上昇ウインドウの書式が欠けると正しく表示されない問題を修正。
2005/7/3 ver.1.22
 戦闘不能時はステータスアップ処理を行わないように。
2005/7/1 ver.1.21
 上昇値が0の時はステータスアップ表示を行わないように。
 補正値が0のとき上昇値が+1されてしまう問題を修正。
2005/6/29 ver.1.20
 ステータスアップ時にアニメーションを表示可能に。
 上昇値が勝手に変動してしまうバグを修正。
2005/6/28 ver.1.10
 敵の強さに応じて成長率を補正する機能を追加。
 ATB導入等でコマンド未入力のアクターが存在するとエラーが出るバグを修正。
2005/6/28 ver.1.02
 動作確認用の数値ウインドウを消し忘れていたのを修正。
2005/6/28 ver.1.01
 能力値アップウインドウが正しく切り替わらなかったのを修正。
2005/6/27 ver.1.00
 公開。





              [本贴由 柳柳 于 2006-6-8 17:29:47 最后编辑]
作者: 九泪    时间: 2006-5-29 22:37
标题: [RM脚本] 战斗终了能力上升
效果图:


[概要]
戦闘時の行動によって、バトル終了時に一定確率で能力値がアップします。


  1. #==============================================================================
  2. # ++ 戦闘終了時にステータスUP ver. 1.40 ++
  3. #  Script by パラ犬
  4. #  http://para.j-mx.com/
  5. #------------------------------------------------------------------------------
  6. # 戦闘時の行動により、バトル終了時にステータスがアップします。
  7. #------------------------------------------------------------------------------
  8. #[設置上の注意]
  9. # アクティブタイムバトルと併用する時は、このスクリプトを下に置いてください。
  10. #==============================================================================

  11. module PARA_STSUP
  12.   
  13.   # 各行動時に能力値がアップする確率
  14.   # (戦闘終了時に全ての行動の平均値で計算します)
  15.   # [最大HP/最大SP/腕力/器用さ/素早さ/魔力]
  16.   ACT_ATK = [10, 0, 10, 5, 5, 0]      # 通常攻撃
  17.   ACT_SKILL = [5, 10, 5, 5, 5, 5]     # スキル
  18.   ACT_GUARD = [20, 0, 0, 0, 0, 0]     # 防御
  19.   ACT_ITEM = [5, 5, 5, 5, 5, 5]       # アイテム
  20.   ACT_NONE = [0, 0, 0, 0, 0, 0]       # コマンド未入力または行動不能

  21.   # 武器属性で通常攻撃の成長率を変化
  22.   # (書式は「 "属性名"=>成長率 」。最終行は「 } 」で閉じる)
  23.   ATK_ELEMENTS = {  "剣" => [10, 0, 10, 5, 5, 0],
  24.                     "槍" => [10, 0, 10, 5, 5, 0],
  25.                     "斧" => [10, 0, 20, 0, 0, 0]}

  26.   # スキルの属性で成長率を変化
  27.   SKILL_ELEMENTS = {  "剣" => [5, 10, 10, 5, 5, 0],
  28.                       "槍" => [5, 10, 5, 5, 10, 0],
  29.                       "斧" => [10, 10, 20, 0, 0, 0],
  30.                       "黒魔法\" => [0, 15, 0, 5, 0, 15],
  31.                       "神聖魔法" => [0, 15, 0, 0, 5, 15]}

  32.   # 上昇値 [最小値,最大値]
  33.   # [最大HP/最大SP/腕力/器用さ/素早さ/魔力]
  34.   UP_POINT = [ [5,20], [5,20], [1,5], [1,5], [1,5], [1,5] ]
  35.   
  36.   # 能力値限界
  37.   # [最大HP/最大SP/腕力/器用さ/素早さ/魔力]
  38.   LIMIT = [ 999999, 9999, 999, 999, 999, 999 ]

  39.   # ステータスアップを行わないアクターのID
  40.   #(アクターIDをコンマで区切って記述。 例:[ 0, 2, 3 ] )
  41.   EXC_ACTOR = []

  42.   # ステータスアップ結果の表示順( 0:アクターごと / 1:能力値ごと )
  43.   THREAD_TYPE = 0

  44.   # ステータス上昇ウインドウを表示するか( true / false )
  45.   VIEW_VISIBLE = true
  46.   # ステータス上昇ウインドウの書式
  47.   # {name} :アクター名
  48.   # {param} :パラメータ
  49.   # {point} :上昇値
  50.   VIEW_TEXT = "{name}の{param}が{point}ポイントアップ"
  51.   # ステータス上昇ウインドウの表示時間
  52.   VIEW_TIME = 40
  53.   # ステータス上昇ウインドウを表示しないときのアニメーション表示間隔
  54.   VIEW_ANM_TIME = 8
  55.   
  56.   # 敵との強さに差があるとき、成長率に影響を与えるか( true / false )
  57.   # (補正率は「敵の能力値÷アクターの能力値」の平均)
  58.   LVEF = true
  59.   # 能力値アップ率に対する補正率の適用パーセント
  60.   LVEF_PER = 50
  61.   # 上昇値に対する補正率の適用パーセント
  62.   LVEF_POINT = 0
  63.   # 人数差が補正率に与える影響(パーセント)
  64.   LVEF_PARTIES = 50
  65.   
  66.   # ステータスアップ時にアニメーションを表示( true / false )
  67.   ANM_USE = true
  68.   # 表示するアニメーションのID
  69.   ANM_HP = 98    # 最大HP
  70.   ANM_SP = 98    # 最大SP
  71.   ANM_STR = 98   # 腕力
  72.   ANM_DEX = 98   # 器用さ
  73.   ANM_AGI = 98   # 素早さ
  74.   ANM_INT = 98   # 魔力
  75.   
  76. end

  77. # ↑ 設定項目ここまで
  78. #------------------------------------------------------------------------------

  79. #==============================================================================
  80. # ■ Scene_Battle
  81. #==============================================================================

  82. class Scene_Battle
  83.   #--------------------------------------------------------------------------
  84.   # ● プレバトルフェーズ開始
  85.   #--------------------------------------------------------------------------
  86.   alias start_phase1_stsup start_phase1
  87.   def start_phase1
  88.     for actor in $game_party.actors
  89.       # 行動履歴を初期化
  90.       actor.act_history = []
  91.     end
  92.     @stsup = []
  93.     @now_stsup_anm = -1
  94.     @btl_lv = 0
  95.     enemy_sts = [0,0,0,0,0,0]
  96.     actor_sts = [0,0,0,0,0,0]
  97.     btl_lv = [0,0,0,0,0,0]
  98.     # エネミーの強さを記録
  99.     for enemy in $game_troop.enemies
  100.       enemy_sts[0] += enemy.base_maxhp
  101.       enemy_sts[1] += enemy.base_maxsp
  102.       enemy_sts[2] += enemy.base_str
  103.       enemy_sts[3] += enemy.base_dex
  104.       enemy_sts[4] += enemy.base_agi
  105.       enemy_sts[5] += enemy.base_int
  106.     end
  107.     # アクターの強さを記録
  108.     for actor in $game_party.actors
  109.       actor_sts[0] += actor.base_maxhp
  110.       actor_sts[1] += actor.base_maxsp
  111.       actor_sts[2] += actor.base_str
  112.       actor_sts[3] += actor.base_dex
  113.       actor_sts[4] += actor.base_agi
  114.       actor_sts[5] += actor.base_int
  115.     end
  116.     # 一体あたりの強さを計算
  117.     for i in 0..5
  118.       enemy_sts[i] /= $game_troop.enemies.size.to_f
  119.       actor_sts[i] /= $game_party.actors.size.to_f
  120.     end
  121.     # 敵の強さの倍率
  122.     for i in 0..5
  123.       btl_lv[i] = enemy_sts[i] / actor_sts[i]
  124.       @btl_lv += btl_lv[i]
  125.     end
  126.     @btl_lv /= btl_lv.size
  127.     # 人数差による補正
  128.     m = $game_troop.enemies.size.to_f / $game_party.actors.size.to_f
  129.     if m >= 1
  130.       m = 1 + (m - 1) * PARA_STSUP::LVEF_PARTIES / 100
  131.     else
  132.       m = 1 - (1 - m) * PARA_STSUP::LVEF_PARTIES / 100
  133.     end
  134.     if @btl_lv >= 1
  135.       @btl_lv = (@btl_lv - 1) * m + 1
  136.     else
  137.       @btl_lv = @btl_lv * m
  138.     end
  139.     start_phase1_stsup
  140.   end
  141.   #--------------------------------------------------------------------------
  142.   # ● 次のアクターのコマンド入力へ
  143.   #--------------------------------------------------------------------------
  144.   alias phase3_next_actor_stsup phase3_next_actor
  145.   def phase3_next_actor
  146.     if @active_battler != nil
  147.       # アクションを行動履歴に追加
  148.       act_kind = @active_battler.current_action.kind
  149.       act_basic = @active_battler.current_action.basic
  150.       act = [act_kind,act_basic]
  151.       if act == [0,0]  # 攻撃
  152.         # 武器属性によって成長率を変更
  153.         if @active_battler.element_set.size != 0
  154.           for element_id in @active_battler.element_set
  155.             element_name = $data_system.elements[element_id]
  156.             if PARA_STSUP::ATK_ELEMENTS.include?(element_name)
  157.               per = PARA_STSUP::ATK_ELEMENTS[element_name]
  158.             end
  159.           end
  160.         end
  161.         if per == nil
  162.           per = PARA_STSUP::ACT_ATK
  163.         end
  164.       elsif act == [0,1]  # 防御
  165.         per = PARA_STSUP::ACT_GUARD
  166.       elsif act == [1,3] or act == [1,0]  # スキル
  167.         # スキル属性によって成長率を変更
  168.         skill_id = @active_battler.current_action.skill_id
  169.         skill_elements = $data_skills[skill_id].element_set
  170.         if skill_elements.size != 0
  171.           for element_id in skill_elements
  172.             element_name = $data_system.elements[element_id]
  173.             if PARA_STSUP::SKILL_ELEMENTS.include?(element_name)
  174.               per = PARA_STSUP::SKILL_ELEMENTS[element_name]
  175.             end
  176.           end
  177.         end
  178.         if per == nil
  179.           per = PARA_STSUP::ACT_SKILL
  180.         end
  181.       elsif act == [2,3] or act == [2,0]  # アイテム
  182.         per = PARA_STSUP::ACT_ITEM
  183.       else
  184.         per = PARA_STSUP::ACT_NONE
  185.       end
  186.       @active_battler.act_history.push(per)
  187.     end
  188.     phase3_next_actor_stsup
  189.   end
  190.   #--------------------------------------------------------------------------
  191.   # ● 前のアクターのコマンド入力へ
  192.   #--------------------------------------------------------------------------
  193.   alias phase3_prior_actor_stsup phase3_prior_actor
  194.   def phase3_prior_actor
  195.     phase3_prior_actor_stsup
  196.     if @active_battler != nil
  197.       # 行動履歴を削除
  198.       @active_battler.act_history.pop
  199.     end
  200.   end
  201.   #--------------------------------------------------------------------------
  202.   # ● アフターバトルフェーズ開始
  203.   #--------------------------------------------------------------------------
  204.   alias start_phase5_stsup start_phase5
  205.   def start_phase5
  206.     start_phase5_stsup
  207.     # ステータスアップ処理
  208.     status_up
  209.   end
  210.   #--------------------------------------------------------------------------
  211.   # ● フレーム更新 (アフターバトルフェーズ)
  212.   #--------------------------------------------------------------------------
  213.   alias update_phase5_stsup update_phase5
  214.   def update_phase5
  215.     # ステータス上昇ウインドウ表示待ちのアイテムがある場合
  216.     if @stsup != nil and @stsup != []
  217.       # C ボタンが押された場合
  218.       if Input.trigger?(Input::C)
  219.         # 次のステータスアップウインドウを表示
  220.         result_stsup
  221.       end
  222.       # ウェイトカウントが 0 より大きい場合
  223.       if @phase5_wait_count > 0
  224.         # ウェイトカウントを減らす
  225.         @phase5_wait_count -= 1
  226.         # ウェイトカウントが 0 になった場合
  227.         if @phase5_wait_count == 0
  228.           # 次のステータスアップウインドウを表示
  229.           result_stsup
  230.         end
  231.         return
  232.       end
  233.     # ステータス上昇ウインドウ表示中の場合
  234.     elsif @help_window.visible
  235.       # C ボタンが押された場合
  236.       if Input.trigger?(Input::C)
  237.         @help_window.visible = false
  238.         @phase5_wait_count = 1
  239.       end
  240.       # ウェイトカウントが 0 より大きい場合
  241.       if @phase5_wait_count > 0
  242.         # ウェイトカウントを減らす
  243.         @phase5_wait_count -= 1
  244.         # ウェイトカウントが 0 になった場合
  245.         if @phase5_wait_count == 0
  246.           @help_window.visible = false
  247.           @phase5_wait_count = 1
  248.         end
  249.         return
  250.       end
  251.     else
  252.       update_phase5_stsup
  253.     end
  254.   end
  255.   #--------------------------------------------------------------------------
  256.   # ○ ステータスアップウインドウを表示
  257.   #--------------------------------------------------------------------------
  258.   def result_stsup
  259.     if @stsup[0] != nil and @stsup[0] != []
  260.       # 配列の先頭から値を取り出す
  261.       stsup = @stsup[0]
  262.       # 能力値の名前を取得
  263.       case stsup[1]
  264.         when 0  # 最大HP
  265.         stsup_sts = $data_system.words.hp
  266.         when 1  # 最大SP
  267.         stsup_sts = $data_system.words.sp
  268.         when 2  # 腕力
  269.         stsup_sts = $data_system.words.str
  270.         when 3  # 器用さ
  271.         stsup_sts = $data_system.words.dex
  272.         when 4  # 素早さ
  273.         stsup_sts = $data_system.words.agi
  274.         when 5  # 魔力
  275.         stsup_sts = $data_system.words.int
  276.       end
  277.       name = stsup[0].name
  278.       param = stsup_sts
  279.       point = stsup[2]
  280.       # 表示する文字列を設定
  281.       text = PARA_STSUP::VIEW_TEXT.dup
  282.       begin
  283.         text[/{name}/] = "#{name}"
  284.       rescue
  285.       end
  286.       begin
  287.         text[/{param}/] = "#{param}"
  288.       rescue
  289.       end
  290.       begin
  291.         text[/{point}/] = "#{point.to_s}"
  292.       rescue
  293.       end
  294.       # ヘルプウィンドウに文字列をセット
  295.       @help_window.set_text(text, 1)
  296.       # アニメーションを表示
  297.       if PARA_STSUP::ANM_USE
  298.         # アニメーションをまとめて表示
  299.         if PARA_STSUP::THREAD_TYPE == 1
  300.           if @now_stsup_anm != stsup[1]
  301.             @now_stsup_anm = stsup[1]
  302.             actors = []
  303.             for sts_group in @stsup
  304.               if sts_group[1] == @now_stsup_anm
  305.                 actors.push(sts_group[0])
  306.               end
  307.             end
  308.             for actor in actors
  309.               case @now_stsup_anm
  310.                 when 0  # 最大HP
  311.                 actor.animation_id = PARA_STSUP::ANM_HP
  312.                 when 1  # 最大SP
  313.                 actor.animation_id = PARA_STSUP::ANM_SP
  314.                 when 2  # 腕力
  315.                 actor.animation_id = PARA_STSUP::ANM_STR
  316.                 when 3  # 器用さ
  317.                 actor.animation_id = PARA_STSUP::ANM_DEX
  318.                 when 4  # 素早さ
  319.                 actor.animation_id = PARA_STSUP::ANM_AGI
  320.                 when 5  # 魔力
  321.                 actor.animation_id = PARA_STSUP::ANM_INT
  322.               end
  323.             end
  324.           end
  325.         else
  326.           actor = stsup[0]
  327.           case stsup[1]
  328.             when 0  # 最大HP
  329.             actor.animation_id = PARA_STSUP::ANM_HP
  330.             when 1  # 最大SP
  331.             actor.animation_id = PARA_STSUP::ANM_SP
  332.             when 2  # 腕力
  333.             actor.animation_id = PARA_STSUP::ANM_STR
  334.             when 3  # 器用さ
  335.             actor.animation_id = PARA_STSUP::ANM_DEX
  336.             when 4  # 素早さ
  337.             actor.animation_id = PARA_STSUP::ANM_AGI
  338.             when 5  # 魔力
  339.             actor.animation_id = PARA_STSUP::ANM_INT
  340.           end
  341.         end
  342.       end
  343.       @stsup.shift
  344.       # ヘルプウィンドウを表示
  345.       if PARA_STSUP::VIEW_VISIBLE
  346.         @help_window.visible = true
  347.         @phase5_wait_count = PARA_STSUP::VIEW_TIME
  348.       else
  349.         @help_window.visible = false
  350.         @phase5_wait_count = PARA_STSUP::VIEW_ANM_TIME
  351.       end
  352.     end
  353.   end
  354.   #--------------------------------------------------------------------------
  355.   # ○ ステータスアップ処理
  356.   #--------------------------------------------------------------------------
  357.   def status_up
  358.     for actor in $game_party.actors
  359.       # EXPを取得できないステート時もしくは
  360.       # 除外アクターは処理をスキップ
  361.       if actor.cant_get_exp? or PARA_STSUP::EXC_ACTOR.include?(actor.id)
  362.         next
  363.       end
  364.       stsup_percent = [0,0,0,0,0,0]
  365.       # コマンド未入力だった場合
  366.       if actor.act_history == []
  367.         # ダミーコマンドを追加
  368.         actor.act_history.push(PARA_STSUP::ACT_NONE)
  369.       end
  370.       for act in actor.act_history
  371.         # 上昇パーセンテージを合計
  372.         for i in 0...stsup_percent.size
  373.           stsup_percent[i] += act[i]
  374.         end
  375.       end
  376.       # 敵の強さによる補正
  377.       if PARA_STSUP::LVEF
  378.         for i in 0..stsup_percent.size-1
  379.           if @btl_lv >= 1
  380.             btl_per = 1 + (@btl_lv - 1) * PARA_STSUP::LVEF_PER / 100
  381.           else
  382.             btl_per = 1 - (1 - @btl_lv) * PARA_STSUP::LVEF_PER / 100
  383.           end
  384.           stsup_percent[i] *= btl_per
  385.         end
  386.       end
  387.       # 上昇パーセンテージを算出
  388.       for i in 0..stsup_percent.size-1
  389.         stsup_percent[i] /= actor.act_history.size
  390.       end
  391.       # 各ステータスで上昇判定
  392.       for s in 0..stsup_percent.size-1
  393.         rnd = rand(100)
  394.         if stsup_percent[s] > rnd
  395.           # 上昇値を決定
  396.           up_point = PARA_STSUP::UP_POINT[s].dup
  397.           # 敵の強さによる補正
  398.           if PARA_STSUP::LVEF
  399.             if @btl_lv >= 1
  400.               btl_point = 1 + (@btl_lv - 1) * PARA_STSUP::LVEF_POINT / 100
  401.             else
  402.               btl_point = 1 - (1 - @btl_lv) * PARA_STSUP::LVEF_POINT / 100
  403.             end
  404.             up_point[0] *= @btl_lv * btl_point
  405.             up_point[1] *= @btl_lv * btl_point
  406.           end
  407.           # ランダマイズ
  408.           rnd_val = (up_point[1] - up_point[0]).floor
  409.           rnd_pt = rand(rnd_val)
  410.           stsup_pt = (rnd_pt + up_point[0]).floor
  411.           # 能力値を上昇
  412.           case s
  413.             when 0  # 最大HP
  414.               if actor.stsup_maxhp + stsup_pt > PARA_STSUP::LIMIT[0]
  415.                 stsup_pt = PARA_STSUP::LIMIT[0] - actor.stsup_maxhp
  416.                 stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
  417.               end
  418.               actor.stsup_maxhp += stsup_pt
  419.             when 1  # 最大SP
  420.               if actor.stsup_maxsp + stsup_pt > PARA_STSUP::LIMIT[1]
  421.                 stsup_pt = PARA_STSUP::LIMIT[1] - actor.stsup_maxsp
  422.                 stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
  423.               end
  424.               actor.stsup_maxsp += stsup_pt
  425.             when 2  # 腕力
  426.               if actor.stsup_str + stsup_pt > PARA_STSUP::LIMIT[2]
  427.                 stsup_pt = PARA_STSUP::LIMIT[2] - actor.stsup_str
  428.                 stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
  429.               end
  430.               actor.stsup_str += stsup_pt
  431.             when 3  # 器用さ
  432.               if actor.stsup_dex + stsup_pt > PARA_STSUP::LIMIT[3]
  433.                 stsup_pt = PARA_STSUP::LIMIT[3] - actor.stsup_dex
  434.                 stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
  435.               end
  436.               actor.stsup_dex += stsup_pt
  437.             when 4  # 素早さ
  438.               if actor.stsup_agi + stsup_pt > PARA_STSUP::LIMIT[4]
  439.                 stsup_pt = PARA_STSUP::LIMIT[4] - actor.stsup_agi
  440.                 stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
  441.               end
  442.               actor.stsup_agi += stsup_pt
  443.             when 5  # 魔力
  444.               if actor.stsup_int + stsup_pt > PARA_STSUP::LIMIT[5]
  445.                 stsup_pt = PARA_STSUP::LIMIT[5] - actor.stsup_int
  446.                 stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
  447.               end
  448.               actor.stsup_int += stsup_pt
  449.           end
  450.           # 上昇ポイントが0のときはスキップ
  451.           if stsup_pt <= 0
  452.             next
  453.           end
  454.           # 配列に追加
  455.           @stsup.push([actor,s,stsup_pt])
  456.         end
  457.       end
  458.     end
  459.     if PARA_STSUP::THREAD_TYPE == 1 and @stsup != []
  460.       # 能力値ごとにソート
  461.       @stsup.sort! do |a, b|
  462.         if a[1] > b[1]
  463.           +1
  464.         elsif a[1] < b[1]
  465.           -1
  466.         elsif a[0].index > b[0].index
  467.           +1
  468.         elsif a[0].index < b[0].index
  469.           -1
  470.         else
  471.           a <=> b
  472.         end
  473.       end
  474.     end
  475.   end
  476. end

  477. #==============================================================================
  478. # ■ Game_Battler
  479. #==============================================================================

  480. class Game_Battler
  481.   #--------------------------------------------------------------------------
  482.   # ● 公開インスタンス変数
  483.   #--------------------------------------------------------------------------
  484.   attr_accessor :act_history          # 行動履歴
  485.   #--------------------------------------------------------------------------
  486.   # ● オブジェクト初期化
  487.   #--------------------------------------------------------------------------
  488.   alias initialize_stsup initialize
  489.   def initialize
  490.     initialize_stsup
  491.     @act_history = []
  492.   end
  493. end

  494. #==============================================================================
  495. # ■ Game_Actor
  496. #==============================================================================

  497. class Game_Actor < Game_Battler
  498.   #--------------------------------------------------------------------------
  499.   # ● 公開インスタンス変数
  500.   #--------------------------------------------------------------------------
  501.   attr_accessor :stsup_maxhp
  502.   attr_accessor :stsup_maxsp
  503.   attr_accessor :stsup_str
  504.   attr_accessor :stsup_dex
  505.   attr_accessor :stsup_agi
  506.   attr_accessor :stsup_int
  507.   #--------------------------------------------------------------------------
  508.   # ● セットアップ
  509.   #     actor_id : アクター ID
  510.   #--------------------------------------------------------------------------
  511.   alias setup_stsup setup
  512.   def setup(actor_id)
  513.     setup_stsup(actor_id)
  514.     @stsup_maxhp = 0
  515.     @stsup_maxsp = 0
  516.     @stsup_str = 0
  517.     @stsup_dex = 0
  518.     @stsup_agi = 0
  519.     @stsup_int = 0
  520.   end
  521.   #--------------------------------------------------------------------------
  522.   # ● 基本 MaxHP の取得
  523.   #--------------------------------------------------------------------------
  524.   alias base_maxhp_stsup base_maxhp
  525.   def base_maxhp
  526.     n = base_maxhp_stsup
  527.     if @stsup_maxhp != nil
  528.       n += @stsup_maxhp
  529.     end
  530.     return n
  531.   end
  532.   #--------------------------------------------------------------------------
  533.   # ● 基本 MaxSP の取得
  534.   #--------------------------------------------------------------------------
  535.   alias base_maxsp_stsup base_maxsp
  536.   def base_maxsp
  537.     n = base_maxsp_stsup
  538.     if @stsup_maxsp != nil
  539.       n += @stsup_maxsp
  540.     end
  541.     return n
  542.   end
  543.   #--------------------------------------------------------------------------
  544.   # ● 基本腕力の取得
  545.   #--------------------------------------------------------------------------
  546.   alias base_str_stsup base_str
  547.   def base_str
  548.     n = base_str_stsup
  549.     if @stsup_str != nil
  550.       n += @stsup_str
  551.     end
  552.     return n
  553.   end
  554.   #--------------------------------------------------------------------------
  555.   # ● 基本器用さの取得
  556.   #--------------------------------------------------------------------------
  557.   alias base_dex_stsup base_dex
  558.   def base_dex
  559.     n = base_dex_stsup
  560.     if @stsup_dex != nil
  561.       n += @stsup_dex
  562.     end
  563.     return n
  564.   end
  565.   #--------------------------------------------------------------------------
  566.   # ● 基本素早さの取得
  567.   #--------------------------------------------------------------------------
  568.   alias base_agi_stsup base_agi
  569.   def base_agi
  570.     n = base_agi_stsup
  571.     if @stsup_agi != nil
  572.       n += @stsup_agi
  573.     end
  574.     return n
  575.   end
  576.   #--------------------------------------------------------------------------
  577.   # ● 基本魔力の取得
  578.   #--------------------------------------------------------------------------
  579.   alias base_int_stsup base_int
  580.   def base_int
  581.     n = base_int_stsup
  582.     if @stsup_int != nil
  583.       n += @stsup_int
  584.     end
  585.     return n
  586.   end
  587. end
复制代码


[設定]
まず、能力値上昇が発生するパーセンテージを決定します。
値は各自のゲームバランスに合わせて調節してください。
配列は、左から順に[最大HP/最大SP/腕力/器用さ/素早さ/魔力]となっています。

戦闘終了時に全ての行動の上昇率の平均値から、能力上昇が起こるか決定します。
合計ではなく平均値なので、注意してください。

たとえば、次のように上昇率を設定したとします。

  ACT_ATK = [10, 0, 10, 5, 5, 0]   # 通常攻撃
  ACT_GUARD = [20, 0, 0, 0, 0, 0]   # 防御

この上昇率で、攻撃4回&防御1回を行ったとき、
戦闘終了時に各能力値がアップする確率は

 最大HP:12% 最大SP:0% 腕力:8%
 器用さ:4% 素早さ:4% 魔力:0%

となります。
(これを基本値として、敵の強さに応じて補正が入ります)

上昇する数値は、各ステータスごとに最大値と最小値を設定し、
その範囲内でランダムに上昇します。



[おまけ]


[更新履歴]
2005/9/20 ver.1.40
 設定項目「能力値限界」を追加。
 EXPを獲得できないステート時はステータスアップ処理を行わないように。
 ステータスアップしないアクターを設定できるように。
2005/7/31 ver.1.31
 Raise Field様のサイドビュースクリプトとの併用に対応。
2005/7/31 ver.1.30
 武器およびスキルに属性を付加することで成長率を変化させる機能を追加。
 ステータスアップ結果をアップした能力値ごとにまとめて表示可能に。
 ステータス上昇ウインドウの書式が欠けると正しく表示されない問題を修正。
2005/7/3 ver.1.22
 戦闘不能時はステータスアップ処理を行わないように。
2005/7/1 ver.1.21
 上昇値が0の時はステータスアップ表示を行わないように。
 補正値が0のとき上昇値が+1されてしまう問題を修正。
2005/6/29 ver.1.20
 ステータスアップ時にアニメーションを表示可能に。
 上昇値が勝手に変動してしまうバグを修正。
2005/6/28 ver.1.10
 敵の強さに応じて成長率を補正する機能を追加。
 ATB導入等でコマンド未入力のアクターが存在するとエラーが出るバグを修正。
2005/6/28 ver.1.02
 動作確認用の数値ウインドウを消し忘れていたのを修正。
2005/6/28 ver.1.01
 能力値アップウインドウが正しく切り替わらなかったのを修正。
2005/6/27 ver.1.00
 公開。





              [本贴由 柳柳 于 2006-6-8 17:29:47 最后编辑]




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1