Project1
标题:
[RM脚本] 战斗终了能力上升
[打印本页]
作者:
九泪
时间:
2006-5-29 22:37
标题:
[RM脚本] 战斗终了能力上升
效果图:
[概要]
戦闘時の行動によって、バトル終了時に一定確率で能力値がアップします。
#==============================================================================
# ++ 戦闘終了時にステータスUP ver. 1.40 ++
# Script by パラ犬
# http://para.j-mx.com/
#------------------------------------------------------------------------------
# 戦闘時の行動により、バトル終了時にステータスがアップします。
#------------------------------------------------------------------------------
#[設置上の注意]
# アクティブタイムバトルと併用する時は、このスクリプトを下に置いてください。
#==============================================================================
module PARA_STSUP
# 各行動時に能力値がアップする確率
# (戦闘終了時に全ての行動の平均値で計算します)
# [最大HP/最大SP/腕力/器用さ/素早さ/魔力]
ACT_ATK = [10, 0, 10, 5, 5, 0] # 通常攻撃
ACT_SKILL = [5, 10, 5, 5, 5, 5] # スキル
ACT_GUARD = [20, 0, 0, 0, 0, 0] # 防御
ACT_ITEM = [5, 5, 5, 5, 5, 5] # アイテム
ACT_NONE = [0, 0, 0, 0, 0, 0] # コマンド未入力または行動不能
# 武器属性で通常攻撃の成長率を変化
# (書式は「 "属性名"=>成長率 」。最終行は「 } 」で閉じる)
ATK_ELEMENTS = { "剣" => [10, 0, 10, 5, 5, 0],
"槍" => [10, 0, 10, 5, 5, 0],
"斧" => [10, 0, 20, 0, 0, 0]}
# スキルの属性で成長率を変化
SKILL_ELEMENTS = { "剣" => [5, 10, 10, 5, 5, 0],
"槍" => [5, 10, 5, 5, 10, 0],
"斧" => [10, 10, 20, 0, 0, 0],
"黒魔法\" => [0, 15, 0, 5, 0, 15],
"神聖魔法" => [0, 15, 0, 0, 5, 15]}
# 上昇値 [最小値,最大値]
# [最大HP/最大SP/腕力/器用さ/素早さ/魔力]
UP_POINT = [ [5,20], [5,20], [1,5], [1,5], [1,5], [1,5] ]
# 能力値限界
# [最大HP/最大SP/腕力/器用さ/素早さ/魔力]
LIMIT = [ 999999, 9999, 999, 999, 999, 999 ]
# ステータスアップを行わないアクターのID
#(アクターIDをコンマで区切って記述。 例:[ 0, 2, 3 ] )
EXC_ACTOR = []
# ステータスアップ結果の表示順( 0:アクターごと / 1:能力値ごと )
THREAD_TYPE = 0
# ステータス上昇ウインドウを表示するか( true / false )
VIEW_VISIBLE = true
# ステータス上昇ウインドウの書式
# {name} :アクター名
# {param} :パラメータ
# {point} :上昇値
VIEW_TEXT = "{name}の{param}が{point}ポイントアップ"
# ステータス上昇ウインドウの表示時間
VIEW_TIME = 40
# ステータス上昇ウインドウを表示しないときのアニメーション表示間隔
VIEW_ANM_TIME = 8
# 敵との強さに差があるとき、成長率に影響を与えるか( true / false )
# (補正率は「敵の能力値÷アクターの能力値」の平均)
LVEF = true
# 能力値アップ率に対する補正率の適用パーセント
LVEF_PER = 50
# 上昇値に対する補正率の適用パーセント
LVEF_POINT = 0
# 人数差が補正率に与える影響(パーセント)
LVEF_PARTIES = 50
# ステータスアップ時にアニメーションを表示( true / false )
ANM_USE = true
# 表示するアニメーションのID
ANM_HP = 98 # 最大HP
ANM_SP = 98 # 最大SP
ANM_STR = 98 # 腕力
ANM_DEX = 98 # 器用さ
ANM_AGI = 98 # 素早さ
ANM_INT = 98 # 魔力
end
# ↑ 設定項目ここまで
#------------------------------------------------------------------------------
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● プレバトルフェーズ開始
#--------------------------------------------------------------------------
alias start_phase1_stsup start_phase1
def start_phase1
for actor in $game_party.actors
# 行動履歴を初期化
actor.act_history = []
end
@stsup = []
@now_stsup_anm = -1
@btl_lv = 0
enemy_sts = [0,0,0,0,0,0]
actor_sts = [0,0,0,0,0,0]
btl_lv = [0,0,0,0,0,0]
# エネミーの強さを記録
for enemy in $game_troop.enemies
enemy_sts[0] += enemy.base_maxhp
enemy_sts[1] += enemy.base_maxsp
enemy_sts[2] += enemy.base_str
enemy_sts[3] += enemy.base_dex
enemy_sts[4] += enemy.base_agi
enemy_sts[5] += enemy.base_int
end
# アクターの強さを記録
for actor in $game_party.actors
actor_sts[0] += actor.base_maxhp
actor_sts[1] += actor.base_maxsp
actor_sts[2] += actor.base_str
actor_sts[3] += actor.base_dex
actor_sts[4] += actor.base_agi
actor_sts[5] += actor.base_int
end
# 一体あたりの強さを計算
for i in 0..5
enemy_sts[i] /= $game_troop.enemies.size.to_f
actor_sts[i] /= $game_party.actors.size.to_f
end
# 敵の強さの倍率
for i in 0..5
btl_lv[i] = enemy_sts[i] / actor_sts[i]
@btl_lv += btl_lv[i]
end
@btl_lv /= btl_lv.size
# 人数差による補正
m = $game_troop.enemies.size.to_f / $game_party.actors.size.to_f
if m >= 1
m = 1 + (m - 1) * PARA_STSUP::LVEF_PARTIES / 100
else
m = 1 - (1 - m) * PARA_STSUP::LVEF_PARTIES / 100
end
if @btl_lv >= 1
@btl_lv = (@btl_lv - 1) * m + 1
else
@btl_lv = @btl_lv * m
end
start_phase1_stsup
end
#--------------------------------------------------------------------------
# ● 次のアクターのコマンド入力へ
#--------------------------------------------------------------------------
alias phase3_next_actor_stsup phase3_next_actor
def phase3_next_actor
if @active_battler != nil
# アクションを行動履歴に追加
act_kind = @active_battler.current_action.kind
act_basic = @active_battler.current_action.basic
act = [act_kind,act_basic]
if act == [0,0] # 攻撃
# 武器属性によって成長率を変更
if @active_battler.element_set.size != 0
for element_id in @active_battler.element_set
element_name = $data_system.elements[element_id]
if PARA_STSUP::ATK_ELEMENTS.include?(element_name)
per = PARA_STSUP::ATK_ELEMENTS[element_name]
end
end
end
if per == nil
per = PARA_STSUP::ACT_ATK
end
elsif act == [0,1] # 防御
per = PARA_STSUP::ACT_GUARD
elsif act == [1,3] or act == [1,0] # スキル
# スキル属性によって成長率を変更
skill_id = @active_battler.current_action.skill_id
skill_elements = $data_skills[skill_id].element_set
if skill_elements.size != 0
for element_id in skill_elements
element_name = $data_system.elements[element_id]
if PARA_STSUP::SKILL_ELEMENTS.include?(element_name)
per = PARA_STSUP::SKILL_ELEMENTS[element_name]
end
end
end
if per == nil
per = PARA_STSUP::ACT_SKILL
end
elsif act == [2,3] or act == [2,0] # アイテム
per = PARA_STSUP::ACT_ITEM
else
per = PARA_STSUP::ACT_NONE
end
@active_battler.act_history.push(per)
end
phase3_next_actor_stsup
end
#--------------------------------------------------------------------------
# ● 前のアクターのコマンド入力へ
#--------------------------------------------------------------------------
alias phase3_prior_actor_stsup phase3_prior_actor
def phase3_prior_actor
phase3_prior_actor_stsup
if @active_battler != nil
# 行動履歴を削除
@active_battler.act_history.pop
end
end
#--------------------------------------------------------------------------
# ● アフターバトルフェーズ開始
#--------------------------------------------------------------------------
alias start_phase5_stsup start_phase5
def start_phase5
start_phase5_stsup
# ステータスアップ処理
status_up
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アフターバトルフェーズ)
#--------------------------------------------------------------------------
alias update_phase5_stsup update_phase5
def update_phase5
# ステータス上昇ウインドウ表示待ちのアイテムがある場合
if @stsup != nil and @stsup != []
# C ボタンが押された場合
if Input.trigger?(Input::C)
# 次のステータスアップウインドウを表示
result_stsup
end
# ウェイトカウントが 0 より大きい場合
if @phase5_wait_count > 0
# ウェイトカウントを減らす
@phase5_wait_count -= 1
# ウェイトカウントが 0 になった場合
if @phase5_wait_count == 0
# 次のステータスアップウインドウを表示
result_stsup
end
return
end
# ステータス上昇ウインドウ表示中の場合
elsif @help_window.visible
# C ボタンが押された場合
if Input.trigger?(Input::C)
@help_window.visible = false
@phase5_wait_count = 1
end
# ウェイトカウントが 0 より大きい場合
if @phase5_wait_count > 0
# ウェイトカウントを減らす
@phase5_wait_count -= 1
# ウェイトカウントが 0 になった場合
if @phase5_wait_count == 0
@help_window.visible = false
@phase5_wait_count = 1
end
return
end
else
update_phase5_stsup
end
end
#--------------------------------------------------------------------------
# ○ ステータスアップウインドウを表示
#--------------------------------------------------------------------------
def result_stsup
if @stsup[0] != nil and @stsup[0] != []
# 配列の先頭から値を取り出す
stsup = @stsup[0]
# 能力値の名前を取得
case stsup[1]
when 0 # 最大HP
stsup_sts = $data_system.words.hp
when 1 # 最大SP
stsup_sts = $data_system.words.sp
when 2 # 腕力
stsup_sts = $data_system.words.str
when 3 # 器用さ
stsup_sts = $data_system.words.dex
when 4 # 素早さ
stsup_sts = $data_system.words.agi
when 5 # 魔力
stsup_sts = $data_system.words.int
end
name = stsup[0].name
param = stsup_sts
point = stsup[2]
# 表示する文字列を設定
text = PARA_STSUP::VIEW_TEXT.dup
begin
text[/{name}/] = "#{name}"
rescue
end
begin
text[/{param}/] = "#{param}"
rescue
end
begin
text[/{point}/] = "#{point.to_s}"
rescue
end
# ヘルプウィンドウに文字列をセット
@help_window.set_text(text, 1)
# アニメーションを表示
if PARA_STSUP::ANM_USE
# アニメーションをまとめて表示
if PARA_STSUP::THREAD_TYPE == 1
if @now_stsup_anm != stsup[1]
@now_stsup_anm = stsup[1]
actors = []
for sts_group in @stsup
if sts_group[1] == @now_stsup_anm
actors.push(sts_group[0])
end
end
for actor in actors
case @now_stsup_anm
when 0 # 最大HP
actor.animation_id = PARA_STSUP::ANM_HP
when 1 # 最大SP
actor.animation_id = PARA_STSUP::ANM_SP
when 2 # 腕力
actor.animation_id = PARA_STSUP::ANM_STR
when 3 # 器用さ
actor.animation_id = PARA_STSUP::ANM_DEX
when 4 # 素早さ
actor.animation_id = PARA_STSUP::ANM_AGI
when 5 # 魔力
actor.animation_id = PARA_STSUP::ANM_INT
end
end
end
else
actor = stsup[0]
case stsup[1]
when 0 # 最大HP
actor.animation_id = PARA_STSUP::ANM_HP
when 1 # 最大SP
actor.animation_id = PARA_STSUP::ANM_SP
when 2 # 腕力
actor.animation_id = PARA_STSUP::ANM_STR
when 3 # 器用さ
actor.animation_id = PARA_STSUP::ANM_DEX
when 4 # 素早さ
actor.animation_id = PARA_STSUP::ANM_AGI
when 5 # 魔力
actor.animation_id = PARA_STSUP::ANM_INT
end
end
end
@stsup.shift
# ヘルプウィンドウを表示
if PARA_STSUP::VIEW_VISIBLE
@help_window.visible = true
@phase5_wait_count = PARA_STSUP::VIEW_TIME
else
@help_window.visible = false
@phase5_wait_count = PARA_STSUP::VIEW_ANM_TIME
end
end
end
#--------------------------------------------------------------------------
# ○ ステータスアップ処理
#--------------------------------------------------------------------------
def status_up
for actor in $game_party.actors
# EXPを取得できないステート時もしくは
# 除外アクターは処理をスキップ
if actor.cant_get_exp? or PARA_STSUP::EXC_ACTOR.include?(actor.id)
next
end
stsup_percent = [0,0,0,0,0,0]
# コマンド未入力だった場合
if actor.act_history == []
# ダミーコマンドを追加
actor.act_history.push(PARA_STSUP::ACT_NONE)
end
for act in actor.act_history
# 上昇パーセンテージを合計
for i in 0...stsup_percent.size
stsup_percent[i] += act[i]
end
end
# 敵の強さによる補正
if PARA_STSUP::LVEF
for i in 0..stsup_percent.size-1
if @btl_lv >= 1
btl_per = 1 + (@btl_lv - 1) * PARA_STSUP::LVEF_PER / 100
else
btl_per = 1 - (1 - @btl_lv) * PARA_STSUP::LVEF_PER / 100
end
stsup_percent[i] *= btl_per
end
end
# 上昇パーセンテージを算出
for i in 0..stsup_percent.size-1
stsup_percent[i] /= actor.act_history.size
end
# 各ステータスで上昇判定
for s in 0..stsup_percent.size-1
rnd = rand(100)
if stsup_percent[s] > rnd
# 上昇値を決定
up_point = PARA_STSUP::UP_POINT[s].dup
# 敵の強さによる補正
if PARA_STSUP::LVEF
if @btl_lv >= 1
btl_point = 1 + (@btl_lv - 1) * PARA_STSUP::LVEF_POINT / 100
else
btl_point = 1 - (1 - @btl_lv) * PARA_STSUP::LVEF_POINT / 100
end
up_point[0] *= @btl_lv * btl_point
up_point[1] *= @btl_lv * btl_point
end
# ランダマイズ
rnd_val = (up_point[1] - up_point[0]).floor
rnd_pt = rand(rnd_val)
stsup_pt = (rnd_pt + up_point[0]).floor
# 能力値を上昇
case s
when 0 # 最大HP
if actor.stsup_maxhp + stsup_pt > PARA_STSUP::LIMIT[0]
stsup_pt = PARA_STSUP::LIMIT[0] - actor.stsup_maxhp
stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
end
actor.stsup_maxhp += stsup_pt
when 1 # 最大SP
if actor.stsup_maxsp + stsup_pt > PARA_STSUP::LIMIT[1]
stsup_pt = PARA_STSUP::LIMIT[1] - actor.stsup_maxsp
stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
end
actor.stsup_maxsp += stsup_pt
when 2 # 腕力
if actor.stsup_str + stsup_pt > PARA_STSUP::LIMIT[2]
stsup_pt = PARA_STSUP::LIMIT[2] - actor.stsup_str
stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
end
actor.stsup_str += stsup_pt
when 3 # 器用さ
if actor.stsup_dex + stsup_pt > PARA_STSUP::LIMIT[3]
stsup_pt = PARA_STSUP::LIMIT[3] - actor.stsup_dex
stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
end
actor.stsup_dex += stsup_pt
when 4 # 素早さ
if actor.stsup_agi + stsup_pt > PARA_STSUP::LIMIT[4]
stsup_pt = PARA_STSUP::LIMIT[4] - actor.stsup_agi
stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
end
actor.stsup_agi += stsup_pt
when 5 # 魔力
if actor.stsup_int + stsup_pt > PARA_STSUP::LIMIT[5]
stsup_pt = PARA_STSUP::LIMIT[5] - actor.stsup_int
stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
end
actor.stsup_int += stsup_pt
end
# 上昇ポイントが0のときはスキップ
if stsup_pt <= 0
next
end
# 配列に追加
@stsup.push([actor,s,stsup_pt])
end
end
end
if PARA_STSUP::THREAD_TYPE == 1 and @stsup != []
# 能力値ごとにソート
@stsup.sort! do |a, b|
if a[1] > b[1]
+1
elsif a[1] < b[1]
-1
elsif a[0].index > b[0].index
+1
elsif a[0].index < b[0].index
-1
else
a <=> b
end
end
end
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :act_history # 行動履歴
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias initialize_stsup initialize
def initialize
initialize_stsup
@act_history = []
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :stsup_maxhp
attr_accessor :stsup_maxsp
attr_accessor :stsup_str
attr_accessor :stsup_dex
attr_accessor :stsup_agi
attr_accessor :stsup_int
#--------------------------------------------------------------------------
# ● セットアップ
# actor_id : アクター ID
#--------------------------------------------------------------------------
alias setup_stsup setup
def setup(actor_id)
setup_stsup(actor_id)
@stsup_maxhp = 0
@stsup_maxsp = 0
@stsup_str = 0
@stsup_dex = 0
@stsup_agi = 0
@stsup_int = 0
end
#--------------------------------------------------------------------------
# ● 基本 MaxHP の取得
#--------------------------------------------------------------------------
alias base_maxhp_stsup base_maxhp
def base_maxhp
n = base_maxhp_stsup
if @stsup_maxhp != nil
n += @stsup_maxhp
end
return n
end
#--------------------------------------------------------------------------
# ● 基本 MaxSP の取得
#--------------------------------------------------------------------------
alias base_maxsp_stsup base_maxsp
def base_maxsp
n = base_maxsp_stsup
if @stsup_maxsp != nil
n += @stsup_maxsp
end
return n
end
#--------------------------------------------------------------------------
# ● 基本腕力の取得
#--------------------------------------------------------------------------
alias base_str_stsup base_str
def base_str
n = base_str_stsup
if @stsup_str != nil
n += @stsup_str
end
return n
end
#--------------------------------------------------------------------------
# ● 基本器用さの取得
#--------------------------------------------------------------------------
alias base_dex_stsup base_dex
def base_dex
n = base_dex_stsup
if @stsup_dex != nil
n += @stsup_dex
end
return n
end
#--------------------------------------------------------------------------
# ● 基本素早さの取得
#--------------------------------------------------------------------------
alias base_agi_stsup base_agi
def base_agi
n = base_agi_stsup
if @stsup_agi != nil
n += @stsup_agi
end
return n
end
#--------------------------------------------------------------------------
# ● 基本魔力の取得
#--------------------------------------------------------------------------
alias base_int_stsup base_int
def base_int
n = base_int_stsup
if @stsup_int != nil
n += @stsup_int
end
return n
end
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脚本] 战斗终了能力上升
效果图:
[概要]
戦闘時の行動によって、バトル終了時に一定確率で能力値がアップします。
#==============================================================================
# ++ 戦闘終了時にステータスUP ver. 1.40 ++
# Script by パラ犬
# http://para.j-mx.com/
#------------------------------------------------------------------------------
# 戦闘時の行動により、バトル終了時にステータスがアップします。
#------------------------------------------------------------------------------
#[設置上の注意]
# アクティブタイムバトルと併用する時は、このスクリプトを下に置いてください。
#==============================================================================
module PARA_STSUP
# 各行動時に能力値がアップする確率
# (戦闘終了時に全ての行動の平均値で計算します)
# [最大HP/最大SP/腕力/器用さ/素早さ/魔力]
ACT_ATK = [10, 0, 10, 5, 5, 0] # 通常攻撃
ACT_SKILL = [5, 10, 5, 5, 5, 5] # スキル
ACT_GUARD = [20, 0, 0, 0, 0, 0] # 防御
ACT_ITEM = [5, 5, 5, 5, 5, 5] # アイテム
ACT_NONE = [0, 0, 0, 0, 0, 0] # コマンド未入力または行動不能
# 武器属性で通常攻撃の成長率を変化
# (書式は「 "属性名"=>成長率 」。最終行は「 } 」で閉じる)
ATK_ELEMENTS = { "剣" => [10, 0, 10, 5, 5, 0],
"槍" => [10, 0, 10, 5, 5, 0],
"斧" => [10, 0, 20, 0, 0, 0]}
# スキルの属性で成長率を変化
SKILL_ELEMENTS = { "剣" => [5, 10, 10, 5, 5, 0],
"槍" => [5, 10, 5, 5, 10, 0],
"斧" => [10, 10, 20, 0, 0, 0],
"黒魔法\" => [0, 15, 0, 5, 0, 15],
"神聖魔法" => [0, 15, 0, 0, 5, 15]}
# 上昇値 [最小値,最大値]
# [最大HP/最大SP/腕力/器用さ/素早さ/魔力]
UP_POINT = [ [5,20], [5,20], [1,5], [1,5], [1,5], [1,5] ]
# 能力値限界
# [最大HP/最大SP/腕力/器用さ/素早さ/魔力]
LIMIT = [ 999999, 9999, 999, 999, 999, 999 ]
# ステータスアップを行わないアクターのID
#(アクターIDをコンマで区切って記述。 例:[ 0, 2, 3 ] )
EXC_ACTOR = []
# ステータスアップ結果の表示順( 0:アクターごと / 1:能力値ごと )
THREAD_TYPE = 0
# ステータス上昇ウインドウを表示するか( true / false )
VIEW_VISIBLE = true
# ステータス上昇ウインドウの書式
# {name} :アクター名
# {param} :パラメータ
# {point} :上昇値
VIEW_TEXT = "{name}の{param}が{point}ポイントアップ"
# ステータス上昇ウインドウの表示時間
VIEW_TIME = 40
# ステータス上昇ウインドウを表示しないときのアニメーション表示間隔
VIEW_ANM_TIME = 8
# 敵との強さに差があるとき、成長率に影響を与えるか( true / false )
# (補正率は「敵の能力値÷アクターの能力値」の平均)
LVEF = true
# 能力値アップ率に対する補正率の適用パーセント
LVEF_PER = 50
# 上昇値に対する補正率の適用パーセント
LVEF_POINT = 0
# 人数差が補正率に与える影響(パーセント)
LVEF_PARTIES = 50
# ステータスアップ時にアニメーションを表示( true / false )
ANM_USE = true
# 表示するアニメーションのID
ANM_HP = 98 # 最大HP
ANM_SP = 98 # 最大SP
ANM_STR = 98 # 腕力
ANM_DEX = 98 # 器用さ
ANM_AGI = 98 # 素早さ
ANM_INT = 98 # 魔力
end
# ↑ 設定項目ここまで
#------------------------------------------------------------------------------
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● プレバトルフェーズ開始
#--------------------------------------------------------------------------
alias start_phase1_stsup start_phase1
def start_phase1
for actor in $game_party.actors
# 行動履歴を初期化
actor.act_history = []
end
@stsup = []
@now_stsup_anm = -1
@btl_lv = 0
enemy_sts = [0,0,0,0,0,0]
actor_sts = [0,0,0,0,0,0]
btl_lv = [0,0,0,0,0,0]
# エネミーの強さを記録
for enemy in $game_troop.enemies
enemy_sts[0] += enemy.base_maxhp
enemy_sts[1] += enemy.base_maxsp
enemy_sts[2] += enemy.base_str
enemy_sts[3] += enemy.base_dex
enemy_sts[4] += enemy.base_agi
enemy_sts[5] += enemy.base_int
end
# アクターの強さを記録
for actor in $game_party.actors
actor_sts[0] += actor.base_maxhp
actor_sts[1] += actor.base_maxsp
actor_sts[2] += actor.base_str
actor_sts[3] += actor.base_dex
actor_sts[4] += actor.base_agi
actor_sts[5] += actor.base_int
end
# 一体あたりの強さを計算
for i in 0..5
enemy_sts[i] /= $game_troop.enemies.size.to_f
actor_sts[i] /= $game_party.actors.size.to_f
end
# 敵の強さの倍率
for i in 0..5
btl_lv[i] = enemy_sts[i] / actor_sts[i]
@btl_lv += btl_lv[i]
end
@btl_lv /= btl_lv.size
# 人数差による補正
m = $game_troop.enemies.size.to_f / $game_party.actors.size.to_f
if m >= 1
m = 1 + (m - 1) * PARA_STSUP::LVEF_PARTIES / 100
else
m = 1 - (1 - m) * PARA_STSUP::LVEF_PARTIES / 100
end
if @btl_lv >= 1
@btl_lv = (@btl_lv - 1) * m + 1
else
@btl_lv = @btl_lv * m
end
start_phase1_stsup
end
#--------------------------------------------------------------------------
# ● 次のアクターのコマンド入力へ
#--------------------------------------------------------------------------
alias phase3_next_actor_stsup phase3_next_actor
def phase3_next_actor
if @active_battler != nil
# アクションを行動履歴に追加
act_kind = @active_battler.current_action.kind
act_basic = @active_battler.current_action.basic
act = [act_kind,act_basic]
if act == [0,0] # 攻撃
# 武器属性によって成長率を変更
if @active_battler.element_set.size != 0
for element_id in @active_battler.element_set
element_name = $data_system.elements[element_id]
if PARA_STSUP::ATK_ELEMENTS.include?(element_name)
per = PARA_STSUP::ATK_ELEMENTS[element_name]
end
end
end
if per == nil
per = PARA_STSUP::ACT_ATK
end
elsif act == [0,1] # 防御
per = PARA_STSUP::ACT_GUARD
elsif act == [1,3] or act == [1,0] # スキル
# スキル属性によって成長率を変更
skill_id = @active_battler.current_action.skill_id
skill_elements = $data_skills[skill_id].element_set
if skill_elements.size != 0
for element_id in skill_elements
element_name = $data_system.elements[element_id]
if PARA_STSUP::SKILL_ELEMENTS.include?(element_name)
per = PARA_STSUP::SKILL_ELEMENTS[element_name]
end
end
end
if per == nil
per = PARA_STSUP::ACT_SKILL
end
elsif act == [2,3] or act == [2,0] # アイテム
per = PARA_STSUP::ACT_ITEM
else
per = PARA_STSUP::ACT_NONE
end
@active_battler.act_history.push(per)
end
phase3_next_actor_stsup
end
#--------------------------------------------------------------------------
# ● 前のアクターのコマンド入力へ
#--------------------------------------------------------------------------
alias phase3_prior_actor_stsup phase3_prior_actor
def phase3_prior_actor
phase3_prior_actor_stsup
if @active_battler != nil
# 行動履歴を削除
@active_battler.act_history.pop
end
end
#--------------------------------------------------------------------------
# ● アフターバトルフェーズ開始
#--------------------------------------------------------------------------
alias start_phase5_stsup start_phase5
def start_phase5
start_phase5_stsup
# ステータスアップ処理
status_up
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アフターバトルフェーズ)
#--------------------------------------------------------------------------
alias update_phase5_stsup update_phase5
def update_phase5
# ステータス上昇ウインドウ表示待ちのアイテムがある場合
if @stsup != nil and @stsup != []
# C ボタンが押された場合
if Input.trigger?(Input::C)
# 次のステータスアップウインドウを表示
result_stsup
end
# ウェイトカウントが 0 より大きい場合
if @phase5_wait_count > 0
# ウェイトカウントを減らす
@phase5_wait_count -= 1
# ウェイトカウントが 0 になった場合
if @phase5_wait_count == 0
# 次のステータスアップウインドウを表示
result_stsup
end
return
end
# ステータス上昇ウインドウ表示中の場合
elsif @help_window.visible
# C ボタンが押された場合
if Input.trigger?(Input::C)
@help_window.visible = false
@phase5_wait_count = 1
end
# ウェイトカウントが 0 より大きい場合
if @phase5_wait_count > 0
# ウェイトカウントを減らす
@phase5_wait_count -= 1
# ウェイトカウントが 0 になった場合
if @phase5_wait_count == 0
@help_window.visible = false
@phase5_wait_count = 1
end
return
end
else
update_phase5_stsup
end
end
#--------------------------------------------------------------------------
# ○ ステータスアップウインドウを表示
#--------------------------------------------------------------------------
def result_stsup
if @stsup[0] != nil and @stsup[0] != []
# 配列の先頭から値を取り出す
stsup = @stsup[0]
# 能力値の名前を取得
case stsup[1]
when 0 # 最大HP
stsup_sts = $data_system.words.hp
when 1 # 最大SP
stsup_sts = $data_system.words.sp
when 2 # 腕力
stsup_sts = $data_system.words.str
when 3 # 器用さ
stsup_sts = $data_system.words.dex
when 4 # 素早さ
stsup_sts = $data_system.words.agi
when 5 # 魔力
stsup_sts = $data_system.words.int
end
name = stsup[0].name
param = stsup_sts
point = stsup[2]
# 表示する文字列を設定
text = PARA_STSUP::VIEW_TEXT.dup
begin
text[/{name}/] = "#{name}"
rescue
end
begin
text[/{param}/] = "#{param}"
rescue
end
begin
text[/{point}/] = "#{point.to_s}"
rescue
end
# ヘルプウィンドウに文字列をセット
@help_window.set_text(text, 1)
# アニメーションを表示
if PARA_STSUP::ANM_USE
# アニメーションをまとめて表示
if PARA_STSUP::THREAD_TYPE == 1
if @now_stsup_anm != stsup[1]
@now_stsup_anm = stsup[1]
actors = []
for sts_group in @stsup
if sts_group[1] == @now_stsup_anm
actors.push(sts_group[0])
end
end
for actor in actors
case @now_stsup_anm
when 0 # 最大HP
actor.animation_id = PARA_STSUP::ANM_HP
when 1 # 最大SP
actor.animation_id = PARA_STSUP::ANM_SP
when 2 # 腕力
actor.animation_id = PARA_STSUP::ANM_STR
when 3 # 器用さ
actor.animation_id = PARA_STSUP::ANM_DEX
when 4 # 素早さ
actor.animation_id = PARA_STSUP::ANM_AGI
when 5 # 魔力
actor.animation_id = PARA_STSUP::ANM_INT
end
end
end
else
actor = stsup[0]
case stsup[1]
when 0 # 最大HP
actor.animation_id = PARA_STSUP::ANM_HP
when 1 # 最大SP
actor.animation_id = PARA_STSUP::ANM_SP
when 2 # 腕力
actor.animation_id = PARA_STSUP::ANM_STR
when 3 # 器用さ
actor.animation_id = PARA_STSUP::ANM_DEX
when 4 # 素早さ
actor.animation_id = PARA_STSUP::ANM_AGI
when 5 # 魔力
actor.animation_id = PARA_STSUP::ANM_INT
end
end
end
@stsup.shift
# ヘルプウィンドウを表示
if PARA_STSUP::VIEW_VISIBLE
@help_window.visible = true
@phase5_wait_count = PARA_STSUP::VIEW_TIME
else
@help_window.visible = false
@phase5_wait_count = PARA_STSUP::VIEW_ANM_TIME
end
end
end
#--------------------------------------------------------------------------
# ○ ステータスアップ処理
#--------------------------------------------------------------------------
def status_up
for actor in $game_party.actors
# EXPを取得できないステート時もしくは
# 除外アクターは処理をスキップ
if actor.cant_get_exp? or PARA_STSUP::EXC_ACTOR.include?(actor.id)
next
end
stsup_percent = [0,0,0,0,0,0]
# コマンド未入力だった場合
if actor.act_history == []
# ダミーコマンドを追加
actor.act_history.push(PARA_STSUP::ACT_NONE)
end
for act in actor.act_history
# 上昇パーセンテージを合計
for i in 0...stsup_percent.size
stsup_percent[i] += act[i]
end
end
# 敵の強さによる補正
if PARA_STSUP::LVEF
for i in 0..stsup_percent.size-1
if @btl_lv >= 1
btl_per = 1 + (@btl_lv - 1) * PARA_STSUP::LVEF_PER / 100
else
btl_per = 1 - (1 - @btl_lv) * PARA_STSUP::LVEF_PER / 100
end
stsup_percent[i] *= btl_per
end
end
# 上昇パーセンテージを算出
for i in 0..stsup_percent.size-1
stsup_percent[i] /= actor.act_history.size
end
# 各ステータスで上昇判定
for s in 0..stsup_percent.size-1
rnd = rand(100)
if stsup_percent[s] > rnd
# 上昇値を決定
up_point = PARA_STSUP::UP_POINT[s].dup
# 敵の強さによる補正
if PARA_STSUP::LVEF
if @btl_lv >= 1
btl_point = 1 + (@btl_lv - 1) * PARA_STSUP::LVEF_POINT / 100
else
btl_point = 1 - (1 - @btl_lv) * PARA_STSUP::LVEF_POINT / 100
end
up_point[0] *= @btl_lv * btl_point
up_point[1] *= @btl_lv * btl_point
end
# ランダマイズ
rnd_val = (up_point[1] - up_point[0]).floor
rnd_pt = rand(rnd_val)
stsup_pt = (rnd_pt + up_point[0]).floor
# 能力値を上昇
case s
when 0 # 最大HP
if actor.stsup_maxhp + stsup_pt > PARA_STSUP::LIMIT[0]
stsup_pt = PARA_STSUP::LIMIT[0] - actor.stsup_maxhp
stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
end
actor.stsup_maxhp += stsup_pt
when 1 # 最大SP
if actor.stsup_maxsp + stsup_pt > PARA_STSUP::LIMIT[1]
stsup_pt = PARA_STSUP::LIMIT[1] - actor.stsup_maxsp
stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
end
actor.stsup_maxsp += stsup_pt
when 2 # 腕力
if actor.stsup_str + stsup_pt > PARA_STSUP::LIMIT[2]
stsup_pt = PARA_STSUP::LIMIT[2] - actor.stsup_str
stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
end
actor.stsup_str += stsup_pt
when 3 # 器用さ
if actor.stsup_dex + stsup_pt > PARA_STSUP::LIMIT[3]
stsup_pt = PARA_STSUP::LIMIT[3] - actor.stsup_dex
stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
end
actor.stsup_dex += stsup_pt
when 4 # 素早さ
if actor.stsup_agi + stsup_pt > PARA_STSUP::LIMIT[4]
stsup_pt = PARA_STSUP::LIMIT[4] - actor.stsup_agi
stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
end
actor.stsup_agi += stsup_pt
when 5 # 魔力
if actor.stsup_int + stsup_pt > PARA_STSUP::LIMIT[5]
stsup_pt = PARA_STSUP::LIMIT[5] - actor.stsup_int
stsup_pt = stsup_pt < 0 ? 0 : stsup_pt
end
actor.stsup_int += stsup_pt
end
# 上昇ポイントが0のときはスキップ
if stsup_pt <= 0
next
end
# 配列に追加
@stsup.push([actor,s,stsup_pt])
end
end
end
if PARA_STSUP::THREAD_TYPE == 1 and @stsup != []
# 能力値ごとにソート
@stsup.sort! do |a, b|
if a[1] > b[1]
+1
elsif a[1] < b[1]
-1
elsif a[0].index > b[0].index
+1
elsif a[0].index < b[0].index
-1
else
a <=> b
end
end
end
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :act_history # 行動履歴
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias initialize_stsup initialize
def initialize
initialize_stsup
@act_history = []
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :stsup_maxhp
attr_accessor :stsup_maxsp
attr_accessor :stsup_str
attr_accessor :stsup_dex
attr_accessor :stsup_agi
attr_accessor :stsup_int
#--------------------------------------------------------------------------
# ● セットアップ
# actor_id : アクター ID
#--------------------------------------------------------------------------
alias setup_stsup setup
def setup(actor_id)
setup_stsup(actor_id)
@stsup_maxhp = 0
@stsup_maxsp = 0
@stsup_str = 0
@stsup_dex = 0
@stsup_agi = 0
@stsup_int = 0
end
#--------------------------------------------------------------------------
# ● 基本 MaxHP の取得
#--------------------------------------------------------------------------
alias base_maxhp_stsup base_maxhp
def base_maxhp
n = base_maxhp_stsup
if @stsup_maxhp != nil
n += @stsup_maxhp
end
return n
end
#--------------------------------------------------------------------------
# ● 基本 MaxSP の取得
#--------------------------------------------------------------------------
alias base_maxsp_stsup base_maxsp
def base_maxsp
n = base_maxsp_stsup
if @stsup_maxsp != nil
n += @stsup_maxsp
end
return n
end
#--------------------------------------------------------------------------
# ● 基本腕力の取得
#--------------------------------------------------------------------------
alias base_str_stsup base_str
def base_str
n = base_str_stsup
if @stsup_str != nil
n += @stsup_str
end
return n
end
#--------------------------------------------------------------------------
# ● 基本器用さの取得
#--------------------------------------------------------------------------
alias base_dex_stsup base_dex
def base_dex
n = base_dex_stsup
if @stsup_dex != nil
n += @stsup_dex
end
return n
end
#--------------------------------------------------------------------------
# ● 基本素早さの取得
#--------------------------------------------------------------------------
alias base_agi_stsup base_agi
def base_agi
n = base_agi_stsup
if @stsup_agi != nil
n += @stsup_agi
end
return n
end
#--------------------------------------------------------------------------
# ● 基本魔力の取得
#--------------------------------------------------------------------------
alias base_int_stsup base_int
def base_int
n = base_int_stsup
if @stsup_int != nil
n += @stsup_int
end
return n
end
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