| 赞 | 3 |
| VIP | |
| 好人卡 | |
| 积分 | 22 |
| 经验 | |
| 最后登录 | 2025-7-3 |
| 在线时间 | 1015 小时 |
- 梦石
- 0
- 星屑
- 2245
- 在线时间
- 1015 小时
- 注册时间
- 2015-10-17
- 回帖
- 1077
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 fjm 于 2022-4-7 19:55 编辑
角色离队时,副将有时候忘记卸下来,就没有了,问下怎样让角色离队时,副将自动解除,卸下来,谢谢
[pre lang="ruby"]#==============================================================================
# ■ VXAce-RGSS3-38 精霊システム [Ver.1.0.0] by Claimh
#------------------------------------------------------------------------------
# ・アクターごとに精霊をパートナーにすることができます。
# ・パートナーになるとパラメータ上昇、スキル習得など
# (パートナーのパラメータ、特徴が加算されます)
# ・精霊はパートナーになっている状態で戦闘に参加することでレベルが上昇します
# ・精霊のデータはデータベース上のアクターとして作成してください。
#------------------------------------------------------------------------------
# ☆精霊加入
# $game_party.add_spirit(精霊ID)
# ☆精霊脱退
# $game_party.del_spirit(精霊ID)
# ☆精霊パートナー化
# Spirits.add_partner(アクターID, 精霊ID)
# ☆精霊パートナー解消
# Spirits.remove_partner(アクターID, 精霊ID)
# ☆精霊パートナー最大数変更
# $game_actors[アクターID].max_spirits = n
#==============================================================================
module Spirits
AFNTY=[{0=>3}]; MAX=[1] # 変更禁止
### 精霊設定 ##################################################################
# 精霊 ※精霊ID:0 は使用禁止
SPIRIT_ACTOR = {
# 精霊ID => アクターID
1 => 300,
2 => 301,
3 => 302,
4 => 303,
5 => 304,
6 => 305,
7 => 306,
8 => 307,
9 => 308,
10 => 309,
11 => 310,
12 => 311,
13 => 312,
14 => 313,
15 => 314,
16 => 315,
17 => 316,
18 => 317,
19 => 318,
20 => 319,
21 => 320,
22 => 321,
23 => 322,
24 => 323,
25 => 324,
}
### 初期状態設定 ##############################################################
# 初期状態で加入している精霊
# START_V = [精霊ID, …]
START_V = [1]
# 初期状態のパートナー
# (注) 初期メンバーおよび初期精霊以外は設定不可
# START_P = {アクターID => 精霊ID, …}
START_P = {1=>12}#{4=>1} #{1=>3, 2=>4, 3=>2, 4=>1}
### パートナー数設定 ##########################################################
# 最大パートナー数(初期値)
# MAX[アクターID] = 最大数
MAX[1] = 1
MAX[2] = 1
MAX[3] = 1
MAX[4] = 1
MAX[5] = 3
MAX[6] = 3
MAX[7] = 3
MAX[8] = 3
MAX[9] = 3
MAX[10] = 3
MAX[11] = 3
MAX[12] = 3
MAX[13] = 3
MAX[14] = 3
MAX[15] = 3
MAX[16] = 3
MAX[17] = 3
MAX[18] = 3
MAX[19] = 1
MAX[20] = 1
MAX[21] = 1
MAX[22] = 1
MAX[23] = 1
MAX[24] = 1
MAX[25] = 1
MAX[26] = 1
MAX[27] = 1
MAX[28] = 1
MAX[29] = 1
MAX[30] = 1
MAX[31] = 1
MAX[32] = 1
MAX[33] = 1
MAX[34] = 1
MAX[35] = 1
MAX[36] = 1
MAX[37] = 1
MAX[38] = 1
MAX[39] = 1
MAX[40] = 1
MAX[41] = 1
MAX[42] = 1
MAX[43] = 1
MAX[44] = 1
MAX[45] = 1
MAX[46] = 1
MAX[47] = 1
MAX[48] = 1
MAX[49] = 1
MAX[50] = 1
MAX[51] = 1
MAX[52] = 1
MAX[53] = 1
MAX[54] = 1
MAX[55] = 1
MAX[56] = 1
MAX[57] = 1
MAX[58] = 1
MAX[59] = 1
MAX[60] = 1
MAX[61] = 1
MAX[62] = 1
MAX[63] = 1
MAX[64] = 1
MAX[65] = 1
MAX[66] = 1
MAX[67] = 1
MAX[68] = 1
MAX[69] = 1
MAX[70] = 1
MAX[71] = 1
MAX[72] = 1
MAX[73] = 1
MAX[74] = 1
MAX[75] = 1
MAX[76] = 1
MAX[77] = 1
MAX[78] = 1
MAX[79] = 1
MAX[80] = 1
MAX[81] = 1
MAX[82] = 1
MAX[83] = 1
MAX[84] = 1
MAX[85] = 1
MAX[86] = 1
MAX[87] = 1
MAX[88] = 1
MAX[89] = 1
MAX[90] = 1
MAX[91] = 1
MAX[92] = 1
MAX[93] = 1
MAX[94] = 1
MAX[95] = 1
MAX[96] = 1
MAX[97] = 1
MAX[98] = 1
MAX[99] = 1
MAX[100] = 1
MAX[101] = 1
MAX[102] = 1
MAX[103] = 1
MAX[104] = 1
MAX[105] = 1
MAX[106] = 1
MAX[107] = 1
MAX[108] = 1
MAX[109] = 1
MAX[110] = 1
MAX[111] = 1
MAX[112] = 1
MAX[113] = 1
MAX[114] = 1
MAX[115] = 1
MAX[116] = 1
MAX[117] = 1
MAX[118] = 1
MAX[119] = 1
MAX[120] = 1
MAX[121] = 1
MAX[122] = 1
MAX[123] = 1
MAX[124] = 1
MAX[125] = 1
MAX[126] = 1
MAX[127] = 1
MAX[128] = 1
MAX[129] = 1
MAX[130] = 1
MAX[131] = 1
MAX[132] = 1
MAX[133] = 1
MAX[134] = 1
MAX[135] = 1
MAX[136] = 1
MAX[137] = 1
MAX[138] = 1
MAX[139] = 1
MAX[140] = 1
MAX[141] = 1
MAX[142] = 1
MAX[143] = 1
MAX[144] = 1
MAX[145] = 1
MAX[146] = 1
MAX[147] = 1
MAX[148] = 1
MAX[149] = 1
MAX[150] = 1
MAX[151] = 3
MAX[152] = 3
MAX[153] = 3
MAX[154] = 3
MAX[155] = 3
MAX[156] = 3
MAX[157] = 3
MAX[158] = 3
MAX[159] = 3
MAX[160] = 3
MAX[161] = 3
MAX[162] = 3
MAX[163] = 3
MAX[164] = 3
MAX[165] = 3
MAX[166] = 3
MAX[167] = 3
MAX[168] = 3
MAX[169] = 3
MAX[170] = 3
MAX[171] = 3
MAX[172] = 3
MAX[173] = 3
MAX[174] = 3
MAX[175] = 3
MAX[176] = 3
MAX[177] = 3
MAX[178] = 3
MAX[179] = 3
MAX[180] = 3
MAX[181] = 3
MAX[182] = 3
MAX[183] = 3
MAX[184] = 3
MAX[185] = 3
MAX[186] = 3
MAX[187] = 3
MAX[188] = 3
MAX[189] = 3
MAX[190] = 3
MAX[191] = 3
MAX[192] = 3
MAX[193] = 3
MAX[194] = 3
MAX[195] = 3
MAX[196] = 3
MAX[197] = 3
MAX[198] = 3
MAX[199] = 3
MAX[200] = 3
MAX[201] = 3
MAX[202] = 3
MAX[203] = 3
MAX[204] = 3
MAX[205] = 3
MAX[206] = 3
MAX[207] = 3
MAX[208] = 3
MAX[209] = 3
MAX[210] = 3
MAX[211] = 3
MAX[212] = 3
MAX[213] = 3
MAX[214] = 3
MAX[215] = 3
MAX[216] = 3
MAX[217] = 3
MAX[218] = 3
MAX[219] = 3
MAX[220] = 3
MAX[221] = 3
MAX[222] = 3
MAX[223] = 3
MAX[224] = 3
MAX[225] = 3
MAX[226] = 3
MAX[227] = 3
MAX[228] = 3
MAX[229] = 3
MAX[230] = 3
MAX[231] = 3
MAX[232] = 3
MAX[233] = 3
MAX[234] = 3
MAX[235] = 3
MAX[236] = 3
MAX[237] = 3
MAX[238] = 3
MAX[239] = 3
MAX[240] = 3
MAX[241] = 3
MAX[242] = 3
MAX[243] = 3
MAX[244] = 3
MAX[245] = 3
MAX[246] = 3
MAX[247] = 3
MAX[248] = 3
MAX[249] = 3
MAX[250] = 3
MAX[251] = 3
MAX[252] = 3
MAX[253] = 3
MAX[254] = 3
MAX[255] = 3
MAX[256] = 3
MAX[257] = 3
MAX[258] = 3
MAX[259] = 3
MAX[260] = 3
### 相性設定 ##################################################################
# 5段階で各アクターと各精霊の相性を設定できます。
#---------------------------------------------------
# 5 : 非常に良い(能力上昇:1.5倍)
# 4 : やや良い (能力上昇:1.2倍)
# 3 : 普通 (能力上昇:1.0倍)
# 2 : やや悪い (能力上昇:0.8倍)
# 1 : 非常に悪い(能力上昇:0.5倍)
# 0 : パートナーにできない
#---------------------------------------------------
# [アクターID] = {精霊ID=>相性, …}
#AFNTY[1] = {1=>3, 2=>2, 3=>5, 4=>1}
#AFNTY[2] = {1=>3, 2=>3, 3=>1, 4=>5}
#AFNTY[3] = {1=>1, 2=>5, 3=>3, 4=>4}
#AFNTY[4] = {1=>5, 2=>1, 3=>3, 4=>4}
# AFNTY[8] = {0=>0} # 全ての精霊をパートナーにできない
### 精霊レベル設定 ############################################################
# レベル上昇あり
USE_LV = true
# 経験値入手対象
# 0 : 戦闘メンバーのパートナーとなっている精霊のみ
# 1 : 全メンバーのパートナーとなっている精霊のみ
# 2 : 全精霊
EXP_TARGET = 2
# 経験値入出種別
# 0 : 戦闘回数でLvUP
# 1 : アクターと同じEXP
EXP_TYPE = 1
### 閾値設定 ##################################################################
# 各能力の閾値設定
# 追加パラメータ = データベース上のパラメータ - PRM_BASE
PRM_BASE = [
0, # 最大HP
0, # 最大MP
0, # 攻撃力
0, # 防御力
0, # 魔法力
0, # 魔法防御
0, # 敏捷性
0 # 運
]
### ステータス画面表示設定 ####################################################
# 特徴ステータス表示と表示順序(上から順)
STS = {
:status => true, # ステータス表示(LVあり用)
:stskl => true, # ステータス表示(LVなし用)
:skills => true, # 習得スキル
:feater => true # 特徴
}
### 入替え画面表示設定 ########################################################
# 特徴ステータス表示と表示順序(上から順)
SHOW_ST = {
:text => false, # 解説
:status => true, # 能力パラメータ
:skills => true, # 習得スキル
:rate => false, # 耐性(属性有効度, 弱体有効度, ステート有効度, ステート無効化)
:param => false,#false, # 能力値(通常. 追加, 特殊)
:attack => false, # 攻撃(属性、ステート, 速度補正, 追加回数)
:skill => false, # スキル(タイプ追加・封印, 追加・封印)
:equip => false, # 装備(武器タイプ, 防具タイプ, 固定, 封印, スロットタイプ)
:other => false # その他(行動回数追加, 特殊フラグ, パーティ能力)
}
# スキル表示時の列数(1-2)
SKILL_NUM = 2
end
[/pre]
[pre lang="ruby"]
#==============================================================================
# ■ VXAce-RGSS3-38 精霊システム <入替画面> by Claimh
#==============================================================================
#==============================================================================
# ■ Window_MenuCommand
#==============================================================================
class Window_MenuCommand < Window_Command
#--------------------------------------------------------------------------
# ● 独自コマンドの追加用
#--------------------------------------------------------------------------
alias add_original_commands_partner add_original_commands
def add_original_commands
add_original_commands_partner
add_command("部下", :partner, partner_enable?) # if $game_switches[1]
end
#--------------------------------------------------------------------------
# ● コマンド追加?[パートナー設定]
#--------------------------------------------------------------------------
def add_spirits?
$game_party.members.size > 0 and $game_party.spirit_num > 0 #and $game_switches[1]
end
#--------------------------------------------------------------------------
# ● コマンド可能?[パートナー設定]
#--------------------------------------------------------------------------
def partner_enable?
$game_party.spirit_num > 0 # and $game_switches[1]
end
end
#==============================================================================
# ■ Scene_Menu
#==============================================================================
class Scene_Menu < Scene_MenuBase
#--------------------------------------------------------------------------
# ● コマンドウィンドウの作成
#--------------------------------------------------------------------------
alias create_command_window_partner create_command_window
def create_command_window
create_command_window_partner
@command_window.set_handler(:partner, method(:command_personal))
end
#--------------------------------------------------------------------------
# ● コマンド[パートナー設定]
#--------------------------------------------------------------------------
def command_partner
SceneManager.call(Scene_EditPartner)
end
#--------------------------------------------------------------------------
# ● 個人コマンド[決定]
#--------------------------------------------------------------------------
alias on_personal_ok_partner on_personal_ok
def on_personal_ok
if @command_window.current_symbol == :partner
command_partner
else
on_personal_ok_partner
end
end
end
#==============================================================================
# ■ Window_SptActor
#==============================================================================
class Window_SptActor < Window_Base
attr_accessor :index # 入れ替え対象index
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(actor)
@actor = actor
@spirit = nil
@index = 0
@diff_on = false
super(0, 0, Graphics.width, fitting_height(9))
refresh
end
#--------------------------------------------------------------------------
# ● 描画エリア
#--------------------------------------------------------------------------
def redraw_area
Rect.new(100, line_height, 150, contents.height - line_height)
end
#--------------------------------------------------------------------------
# ● 差分描画on/off
#--------------------------------------------------------------------------
def diff_on
@diff_on = true
part_refresh
end
def diff_off
@diff_on = false
@spirit = nil
part_refresh
end
#--------------------------------------------------------------------------
# ● アクター設定
#--------------------------------------------------------------------------
def actor=(a)
return if @actor == a
@actor = a
@spirit = nil
refresh
end
#--------------------------------------------------------------------------
# ● 精霊設定
#--------------------------------------------------------------------------
def spirit=(s)
return if @spirit == s
@spirit = s
part_refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
contents.clear
return if @actor.nil?
draw_actor_name(@actor, 0, 0)
draw_actor_face(@actor, 140, 0)
draw_status_vocab
part_refresh(false)
change_color(system_color)
draw_text(contents_width - 200, 0, 200, line_height, "部下")
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def part_refresh(clear=true)
contents.fill_rect(redraw_area, Color.new(0,0,0,0)) if clear
return if @actor.nil?
draw_actor_status
end
#--------------------------------------------------------------------------
# ● 顔グラフィックの描画
# enabled : 有効フラグ。false のとき半透明で描画
#--------------------------------------------------------------------------
def draw_face(face_name, face_index, x, y, enabled = true)
bitmap = Cache.face(face_name)
h = line_height
hh = (96 - h) / 2
rect = Rect.new(face_index % 4 * 96, face_index / 4 * 96 + hh, 96, h)
contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
bitmap.dispose
end
#--------------------------------------------------------------------------
# ● ステータス描画
#--------------------------------------------------------------------------
def draw_status_vocab
8.times do |i|
draw_param_vocab(20, i * line_height + line_height, i)
end
end
#--------------------------------------------------------------------------
# ● パラメータVcab描画
#--------------------------------------------------------------------------
def draw_param_vocab(x, y, param_id)
change_color(system_color)
draw_text(x, y, 120, line_height, Vocab::param(param_id))
end
#--------------------------------------------------------------------------
# ● ステータス描画
#--------------------------------------------------------------------------
def draw_actor_status
8.times do |i|
draw_actor_param(@actor, @spirit, 10, i * line_height + line_height, i, 300)
end
end
#--------------------------------------------------------------------------
# ● パラメータ描画
#--------------------------------------------------------------------------
def draw_actor_param(actor, spirit, x, y, param_id, width)
now = actor.param(param_id)
change_color(normal_color)
draw_text(x+90, y, 60, line_height, now, 2)
return if !@diff_on or (spirit.nil? and @actor.partners[@index].nil?)
# 差分描画
draw_actor_new_param(actor, spirit, x, y, param_id, width)
end
#--------------------------------------------------------------------------
# ● パラメータ描画
#--------------------------------------------------------------------------
def draw_actor_new_param(actor, spirit, x, y, param_id, width)
now = actor.param(param_id)
spirit_id = spirit.nil? ? 0 : spirit.spirit_id
new = @actor.v_chg_param(spirit_id, @index, param_id)
change_color(system_color)
draw_text(x+150, y, 32, line_height, "→")
change_color(param_change_color(new - now))
draw_text(x+170, y, 60, line_height, new, 2)
end
end
#==============================================================================
# ■ Window_SptListBase
#==============================================================================
class Window_SptListBase < Window_Selectable
attr_accessor :info_window # help_window2
#--------------------------------------------------------------------------
# ● ウィンドウのアクティブ化
#--------------------------------------------------------------------------
def activate
select(0) if @index < 0
super
end
#--------------------------------------------------------------------------
# ● アイテムの取得
#--------------------------------------------------------------------------
def item
i_item(index)
end
#--------------------------------------------------------------------------
# ● アイテムの取得
#--------------------------------------------------------------------------
def i_item(index)
@data && index >= 0 ? @data[index] : nil
end
#--------------------------------------------------------------------------
# ● 選択項目の有効状態を取得
#--------------------------------------------------------------------------
def current_item_enabled?
enable?(item)
end
#--------------------------------------------------------------------------
# ● 許可状態で表示するかどうか
#--------------------------------------------------------------------------
def enable?(item)
item.nil?
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
def draw_item(index)
item = i_item(index)
rect = item_rect(index)
if item
enabled = enable?(item)
rect.x += draw_actor_line_graphic(item, rect.x, rect.y, enabled)
draw_spirit_name(item, rect.x, rect.y, enabled)
else
draw_empty_text(rect)
end
end
#--------------------------------------------------------------------------
# ● 空項目の描画
#--------------------------------------------------------------------------
def draw_empty_text(rect)
end
#--------------------------------------------------------------------------
# ● アクター設定
#--------------------------------------------------------------------------
def actor=(a)
return if @actor == a
@actor = a
data_refresh
end
#--------------------------------------------------------------------------
# ● カーソルを右に移動
#--------------------------------------------------------------------------
def cursor_right(wrap = false)
@help_window.next_page
end
#--------------------------------------------------------------------------
# ● カーソルを左に移動
#--------------------------------------------------------------------------
def cursor_left(wrap = false)
@help_window.prev_page
end
end
#==============================================================================
# ■ Window_SptPartner
#==============================================================================
class Window_SptPartner < Window_SptListBase
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(x, height, actor)
@actor = actor
@data = actor.partners
y = line_height
super(x, y, Graphics.width - x, height - y)
self.z += 10
self.opacity = 0
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def data_refresh
@data = @actor.partners
refresh
end
#--------------------------------------------------------------------------
# ● 項目数の取得
#--------------------------------------------------------------------------
def item_max
@actor.max_spirits
end
#--------------------------------------------------------------------------
# ● 許可状態で表示するかどうか
#--------------------------------------------------------------------------
def enable?(item)
return false if item_max == 0
super(item) or !item.partner_locked
end
#--------------------------------------------------------------------------
# ● 空項目の描画
#--------------------------------------------------------------------------
def draw_empty_text(rect)
draw_text(rect.x, rect.y, contents_width-8, line_height, "-- 空缺 --", 1)
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
@help_window.spirit = item
@info_window.index = @index unless @info_window.nil?
end
end
#==============================================================================
# ■ Window_SptSpiritList
#==============================================================================
class Window_SptSpiritList < Window_SptListBase
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(x, y, actor)
@actor = actor
@data = $game_party.spirit_stay_members + [nil]
super(x, y, Graphics.width - x, Graphics.height - y)
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def data_refresh
@data = $game_party.spirit_stay_members + [nil]
refresh
end
#--------------------------------------------------------------------------
# ● 項目数の取得
#--------------------------------------------------------------------------
def item_max
(@data ? @data.size : 0)
end
#--------------------------------------------------------------------------
# ● 許可状態で表示するかどうか
#--------------------------------------------------------------------------
def enable?(item)
super(item) or @actor.can_partner(item.spirit_id)
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
@help_window.spirit = item
@info_window.spirit = item unless @info_window.nil?
end
end
#==============================================================================
# ■ Window_SptSpirit
#==============================================================================
class Window_SptSpirit < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(y, width)
@spirit = nil
@page = 0
@data = Spirits.status
@max = @data.size
@skill_start = @data.index(:skills)
super(0, y, width, Graphics.height - y)
refresh
end
#--------------------------------------------------------------------------
# ● 1ページに表示するスキル数
#--------------------------------------------------------------------------
def page_skills
((contents.height - (line_height * 2)) / line_height) * sr
end
def sr
Spirits::SKILL_NUM
end
#--------------------------------------------------------------------------
# ● ページ切り替え
#--------------------------------------------------------------------------
def page=(n)
@page = [0, [@max-1, n].min].max
refresh
end
def next_page
self.page = @page + 1
end
def prev_page
self.page = @page - 1
end
#--------------------------------------------------------------------------
# ● ウィンドウ内容の幅を計算
#--------------------------------------------------------------------------
def contents_width
super + (@spirit.nil? ? 0 : 10)
end
#--------------------------------------------------------------------------
# ● 精霊設定
#--------------------------------------------------------------------------
def spirit=(s)
return if @spirit == s
@spirit = s
is_skill = @data[@page] == :skills
data_refresh
refresh
self.page = @data.index(:skills) if is_skill
end
#--------------------------------------------------------------------------
# ● データリフレッシュ
#--------------------------------------------------------------------------
def data_refresh
@data = Spirits.status
@skill_start = @data.index(:skills)
unless @spirit.nil?
n = @spirit.skills.size
if n > page_skills
(n / page_skills).times {|i| @data.insert(@skill_start, :skills) }
end
end
@max = @data.size
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
contents_width != contents.width ? create_contents : contents.clear
self.ox = 0
return if @spirit.nil?
self.ox = (@page == 0 ? 0 : (@page == (@max-1) ? 10 : 5))
draw_spirit_name(@spirit, self.ox, 0)
draw_actor_level(@spirit, self.ox + 170, 0) if Spirits::USE_LV
draw_actor_face(@spirit, self.ox + contents_width - 100, 0)
case @data[@page]
when :text # description
draw_actor_nickname(@spirit, self.ox + 100, line_height)
draw_text_ex(self.ox, line_height * 2, @spirit.description)
when :status # status
draw_actor_status
when :skills # skill
i = @page - @skill_start
n = page_skills
draw_actor_skills(@spirit.skills[i*n, n])
else # feature
draw_feature_status
end
end
#--------------------------------------------------------------------------
# ● 顔グラフィックの描画
# enabled : 有効フラグ。false のとき半透明で描画
#--------------------------------------------------------------------------
def draw_face(face_name, face_index, x, y, enabled = true)
bitmap = Cache.face(face_name)
h = line_height * 2
hh = (96 - h) / 2
rect = Rect.new(face_index % 4 * 96, face_index / 4 * 96 + hh, 96, h)
contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
bitmap.dispose
end
#--------------------------------------------------------------------------
# ● 能力値の描画
#--------------------------------------------------------------------------
def draw_actor_status
change_color(system_color)
draw_text(self.ox, line_height, 100, line_height, "部下实力")
change_color(normal_color)
8.times do |i|
x = self.ox + i % 2 * contents_width / 2
y = i / 2 * line_height + line_height * 2
draw_spirit_param(@spirit, x, y, i)
end
end
#--------------------------------------------------------------------------
# ● スキルの描画
#--------------------------------------------------------------------------
def draw_actor_skills(skills)
change_color(system_color)
draw_text(self.ox, line_height, 100, line_height, "计谋战技")
change_color(normal_color)
skills.each_with_index do |skill, i|
x = self.ox + i % sr * contents_width / sr
y = i / sr * line_height + line_height * 2
draw_item_name(skill, x, y)
end
end
#--------------------------------------------------------------------------
# ● 特徴の描画
#--------------------------------------------------------------------------
def draw_feature_status
ft = Spirits::Features.new(@spirit)
case @data[@page]
when :rate; draw_feature_rate(ft)
when :param; draw_feature_param(ft)
when :attack; draw_feature_attack(ft)
when :skill; draw_feature_skill(ft)
when :equip; draw_feature_equip(ft)
when :other; draw_feature_other(ft)
end
end
#--------------------------------------------------------------------------
# ● 特徴テキストの描画
#--------------------------------------------------------------------------
def draw_feature_text(features, x, y, w=contents_width, col_max=2)
features.each_with_index do |ft, i|
ww = w / col_max
xx = x + i % col_max * ww
yy = y + i / col_max * line_height
draw_text(xx, yy, ww, line_height, ft[0])
draw_text(xx, yy, ww, line_height, ft[1], 2) unless ft[1].nil?
end
end
#--------------------------------------------------------------------------
# ● 特徴:耐性の描画
#--------------------------------------------------------------------------
def draw_feature_rate(ft)
change_color(system_color)
draw_text(self.ox, line_height, 100, line_height, "耐性")
change_color(normal_color)
draw_feature_text(ft.rate, self.ox, line_height * 2)
end
#--------------------------------------------------------------------------
# ● 特徴:能力の描画
#--------------------------------------------------------------------------
def draw_feature_param(ft)
change_color(system_color)
draw_text(self.ox, line_height, 100, line_height, "能力特性")
change_color(normal_color)
draw_feature_text(ft.param, self.ox, line_height * 2)
end
#--------------------------------------------------------------------------
# ● 特徴:攻撃の描画
#--------------------------------------------------------------------------
def draw_feature_attack(ft)
change_color(system_color)
draw_text(self.ox, line_height, 100, line_height, "攻击特性")
change_color(normal_color)
draw_feature_text(ft.attack, self.ox, line_height * 2)
end
#--------------------------------------------------------------------------
# ● 特徴:スキルの描画
#--------------------------------------------------------------------------
def draw_feature_skill(ft)
change_color(system_color)
draw_text(self.ox, line_height, 100, line_height, "技能特性")
change_color(normal_color)
draw_feature_text(ft.skill, self.ox, line_height * 2)
end
#--------------------------------------------------------------------------
# ● 特徴:装備の描画
#--------------------------------------------------------------------------
def draw_feature_equip(ft)
change_color(system_color)
draw_text(self.ox, line_height, 100, line_height, "装备特性")
change_color(normal_color)
draw_feature_text(ft.equip, self.ox, line_height * 2)
end
#--------------------------------------------------------------------------
# ● 特徴:その他の描画
#--------------------------------------------------------------------------
def draw_feature_other(ft)
change_color(system_color)
draw_text(self.ox, line_height, 100, line_height, "特性")
change_color(normal_color)
draw_feature_text(ft.other, self.ox, line_height * 2)
end
end
#==============================================================================
# ■ Scene_EditPartner
#==============================================================================
class Scene_EditPartner < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
create_actor_window
create_partner_window
create_sptlist_window
create_spirit_window
@sptlist_window.info_window = @actor_window
@sptlist_window.help_window = @spirit_window
@partner_window.info_window = @actor_window
@partner_window.help_window = @spirit_window
end
#--------------------------------------------------------------------------
# ● アクターウィンドウ作成
#--------------------------------------------------------------------------
def create_actor_window
@actor_window = Window_SptActor.new(@actor)
end
#--------------------------------------------------------------------------
# ● パートナーリストウィンドウ作成
#--------------------------------------------------------------------------
def create_partner_window
@partner_window = Window_SptPartner.new(@actor_window.width-200, @actor_window.height, @actor)
@partner_window.set_handler(:ok, method(:partner_ok))
@partner_window.set_handler(:cancel, method(:return_scene))
@partner_window.set_handler(:pagedown, method(:next_actor))
@partner_window.set_handler(:pageup, method(:prev_actor))
@partner_window.activate
end
#--------------------------------------------------------------------------
# ● パートナーウィンドウ : OK
#--------------------------------------------------------------------------
def partner_ok
@actor_window.diff_on
@sptlist_window.activate
end
#--------------------------------------------------------------------------
# ● 精霊リストウィンドウ作成
#--------------------------------------------------------------------------
def create_sptlist_window
@sptlist_window = Window_SptSpiritList.new(@partner_window.x, @actor_window.height, @actor)
@sptlist_window.set_handler(:ok, method(:sptlist_ok))
@sptlist_window.set_handler(:cancel, method(:sptlist_cancel))
end
#--------------------------------------------------------------------------
# ● 精霊リストウィンドウ : OK
#--------------------------------------------------------------------------
def sptlist_ok
if @sptlist_window.item.nil?
unless @partner_window.item.nil?
@actor.change_partner(0, @partner_window.index)
end
else
@actor.change_partner(@sptlist_window.item.spirit_id, @partner_window.index)
@sptlist_window.item.change_partner(@actor.id)
end
unless @partner_window.item.nil?
@partner_window.item.change_partner(0)
end
@sptlist_window.data_refresh
@partner_window.data_refresh
@partner_window.activate
@actor_window.diff_off
end
#--------------------------------------------------------------------------
# ● 精霊リストウィンドウ : Cancel
#--------------------------------------------------------------------------
def sptlist_cancel
@partner_window.activate
@actor_window.diff_off
end
#--------------------------------------------------------------------------
# ● 精霊ウィンドウ作成
#--------------------------------------------------------------------------
def create_spirit_window
@spirit_window = Window_SptSpirit.new(@actor_window.height, @partner_window.x)
end
#--------------------------------------------------------------------------
# ● アクターの切り替え
#--------------------------------------------------------------------------
def on_actor_change
@actor_window.actor = @actor
@partner_window.actor = @actor
@sptlist_window.actor = @actor
@partner_window.select(0)
@sptlist_window.select(0)
@partner_window.activate
end
end
[/pre]
[pre lang="ruby"]
#==============================================================================
# ■ VXAce-RGSS3-38 精霊システム <database> by Claimh
#==============================================================================
#==============================================================================
# ■ Spirits
#==============================================================================
module Spirits
#--------------------------------------------------------------------------
# ● 精霊パートナー化
#--------------------------------------------------------------------------
def self.add_partner(actor_id, spirit_id)
return unless $game_party.include_spirit?(spirit_id)
return unless $game_actors[actor_id].can_join_partner(spirit_id)
s_act_id = self.actor_id(spirit_id)
return unless $game_actors[s_act_id].can_join_partner(actor_id)
$game_actors[actor_id].add_partner(spirit_id)
$game_actors[s_act_id].add_partner(actor_id)
end
#--------------------------------------------------------------------------
# ● 精霊パートナー解消
#--------------------------------------------------------------------------
def self.remove_partner(actor_id, spirit_id)
$game_actors[actor_id].remove_partner(spirit_id)
$game_actors[self.actor_id(spirit_id)].remove_partner(actor_id)
end
#--------------------------------------------------------------------------
# ● 精霊パートナー固定化
#--------------------------------------------------------------------------
def self.lock_partner(spirit_id)
spirit = $game_actors[self.actor_id(spirit_id)]
return unless spirit.has_partner?
spirit.lock_partner
end
#--------------------------------------------------------------------------
# ● 精霊パートナー固有化解除
#--------------------------------------------------------------------------
def self.unlock_partner(spirit_id)
spirit = $game_actors[self.actor_id(spirit_id)]
return unless spirit.has_partner?
spirit.unlock_partner
end
#--------------------------------------------------------------------------
# ● 精霊?
#--------------------------------------------------------------------------
def self.spirit?(actor_id)
SPIRIT_ACTOR.has_value?(actor_id)
end
#--------------------------------------------------------------------------
# ● 精霊ID => アクターID
#--------------------------------------------------------------------------
def self.actor_id(spirit_id)
SPIRIT_ACTOR[spirit_id].nil? ? 0 : SPIRIT_ACTOR[spirit_id]
end
#--------------------------------------------------------------------------
# ● アクターID => 精霊ID
#--------------------------------------------------------------------------
def self.spirit_id(actor_id)
id = SPIRIT_ACTOR.index(actor_id)
id.nil? ? 0 : id
end
#--------------------------------------------------------------------------
# ● パートナー最大数
#--------------------------------------------------------------------------
def self.max(actor_id)
MAX[actor_id].nil? ? MAX[0] : MAX[actor_id]
end
#--------------------------------------------------------------------------
# ● 相性
#--------------------------------------------------------------------------
def self.affinity(actor_id, spirit_id)
if AFNTY[actor_id].nil?
return AFNTY[0][0]
elsif AFNTY[actor_id][spirit_id].nil?
return AFNTY[actor_id][0].nil? ? AFNTY[0][0] : AFNTY[actor_id][0]
else
return AFNTY[actor_id][spirit_id]
end
end
#--------------------------------------------------------------------------
# ● 相性計算
#--------------------------------------------------------------------------
def self.affinity_param(param, actor_id, spirit_id)
prm = [0, 0.5, 0.8, 1.0, 1.2, 1.5] # 相性補正
n = affinity(actor_id, spirit_id)
p "[#{actor_id}, #{spirit_id}] => #{n}" if n.nil?
(param * prm[affinity(actor_id, spirit_id)]).truncate
end
#--------------------------------------------------------------------------
# ● 有効ステータス表示
#--------------------------------------------------------------------------
def self.sts
STS.select {|key, v| v}.keys
end
#--------------------------------------------------------------------------
# ● 有効ステータス表示
#--------------------------------------------------------------------------
def self.status
SHOW_ST.select {|key, v| v}.keys
end
end
#==============================================================================
# ■ Spirits::Features : 特徴情報抽出
#==============================================================================
class Spirits::Features
#--------------------------------------------------------------------------
# ● 定数(特徴)
#--------------------------------------------------------------------------
FEATURE_ELEMENT_RATE = 11 # 属性有効度
FEATURE_DEBUFF_RATE = 12 # 弱体有効度
FEATURE_STATE_RATE = 13 # ステート有効度
FEATURE_STATE_RESIST = 14 # ステート無効化
FEATURE_PARAM = 21 # 通常能力値
FEATURE_XPARAM = 22 # 追加能力値
FEATURE_SPARAM = 23 # 特殊能力値
FEATURE_ATK_ELEMENT = 31 # 攻撃時属性
FEATURE_ATK_STATE = 32 # 攻撃時ステート
FEATURE_ATK_SPEED = 33 # 攻撃速度補正
FEATURE_ATK_TIMES = 34 # 攻撃追加回数
FEATURE_STYPE_ADD = 41 # スキルタイプ追加
FEATURE_STYPE_SEAL = 42 # スキルタイプ封印
FEATURE_SKILL_ADD = 43 # スキル追加
FEATURE_SKILL_SEAL = 44 # スキル封印
FEATURE_EQUIP_WTYPE = 51 # 武器タイプ装備
FEATURE_EQUIP_ATYPE = 52 # 防具タイプ装備
FEATURE_EQUIP_FIX = 53 # 装備固定
FEATURE_EQUIP_SEAL = 54 # 装備封印
FEATURE_SLOT_TYPE = 55 # スロットタイプ
FEATURE_ACTION_PLUS = 61 # 行動回数追加
FEATURE_SPECIAL_FLAG = 62 # 特殊フラグ
FEATURE_COLLAPSE_TYPE = 63 # 消滅エフェクト
FEATURE_PARTY_ABILITY = 64 # パーティ能力
#--------------------------------------------------------------------------
# ● パーティ能力定数
#--------------------------------------------------------------------------
ABILITY_ENCOUNTER_HALF = 0 # エンカウント半減
ABILITY_ENCOUNTER_NONE = 1 # エンカウント無効
ABILITY_CANCEL_SURPRISE = 2 # 不意打ち無効
ABILITY_RAISE_PREEMPTIVE = 3 # 先制攻撃率アップ
ABILITY_GOLD_DOUBLE = 4 # 獲得金額二倍
ABILITY_DROP_ITEM_DOUBLE = 5 # アイテム入手率二倍
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(spirit)
@obj = spirit
end
#--------------------------------------------------------------------------
# ● 属性耐性
#--------------------------------------------------------------------------
def element_rate
fts = @obj.features(FEATURE_ELEMENT_RATE)
fts.collect {|ft| ["#{$data_system.elements[ft.data_id]}属性耐性", sprintf("%d %", ft.value)] }
end
#--------------------------------------------------------------------------
# ● 弱体耐性
#--------------------------------------------------------------------------
def debuff_rate
fts = @obj.features(FEATURE_DEBUFF_RATE)
fts.collect {|ft| ["#{$data_system.terms.params[ft.data_id]}弱体耐性", sprintf("%d %", ft.value)] }
end
#--------------------------------------------------------------------------
# ● ステート耐性
#--------------------------------------------------------------------------
def state_rate
fts = @obj.features(FEATURE_STATE_RATE)
fts.collect {|ft| ["#{$data_states[ft.data_id].name}耐性", sprintf("%d %", ft.value)] }
end
#--------------------------------------------------------------------------
# ● ステート無効化
#--------------------------------------------------------------------------
def state_regist
fts = @obj.features(FEATURE_STATE_RESIST)
fts.collect {|ft| ["#{$data_states[ft.data_id].name}无效化", nil] }
end
#--------------------------------------------------------------------------
# ● 耐性情報取得
#--------------------------------------------------------------------------
def rate
element_rate + debuff_rate + state_rate + state_regist
end
#--------------------------------------------------------------------------
# ● 通常能力情報取得
#--------------------------------------------------------------------------
def nparam
fts = @obj.features(FEATURE_PARAM)
fts.collect {|ft| ["#{$data_system.terms.params[ft.data_id]}", sprintf("%+d %", ft.value * 100)] }
end
#--------------------------------------------------------------------------
# ● 追加能力情報取得
#--------------------------------------------------------------------------
def xparam
txt = ["命中率", "闪避", "会心一击", "会心闪避",
"兵法闪避", "策反", "反击",
"#{$data_system.terms.basic[2]}恢复",
"#{$data_system.terms.basic[4]}恢复",
"#{$data_system.terms.basic[6]}恢复"]
fts = @obj.features(FEATURE_XPARAM)
fts.collect {|ft| ["#{txt[ft.data_id]}", sprintf("%+d % ", ft.value * 100)] }
end
#--------------------------------------------------------------------------
# ● 特殊能力情報取得
#--------------------------------------------------------------------------
def sparam
txt = ["被攻击率", "防御効果率", "回复効果率", "草药知识",
"#{$data_system.terms.basic[4]}消费率",
"#{$data_system.terms.basic[6]}消费率",
"武力伤害率", "计谋伤害率", "地图伤害率", "经验获得率"]
fts = @obj.features(FEATURE_SPARAM)
fts.collect {|ft| ["#{$data_system.terms.params[ft.data_id]}", sprintf("%+d % ", ft.value * 100)] }
end
#--------------------------------------------------------------------------
# ● 能力情報取得
#--------------------------------------------------------------------------
def param
nparam + xparam + sparam
end
#--------------------------------------------------------------------------
# ● 攻撃属性情報取得
#--------------------------------------------------------------------------
def atk_element
fts = @obj.features(FEATURE_ATK_ELEMENT)
fts.collect {|ft| ["攻击时 属性", $data_system.elements[ft.data_id]] }
end
#--------------------------------------------------------------------------
# ● 攻撃ステート情報取得
#--------------------------------------------------------------------------
def atk_state
fts = @obj.features(FEATURE_ATK_STATE)
fts.collect {|ft| ["攻击时 状态附加", $data_states[ft.data_id].name] }
end
#--------------------------------------------------------------------------
# ● 攻撃速度補正情報取得
#--------------------------------------------------------------------------
def atk_speed
fts = @obj.features(FEATURE_ATK_SPEED)
fts.collect {|ft| ["攻击速度修正", ft.value.to_s] }
end
#--------------------------------------------------------------------------
# ● 攻撃回数情報取得
#--------------------------------------------------------------------------
def atk_times
fts = @obj.features(FEATURE_ATK_TIMES)
fts.collect {|ft| ["#{ft.value}回攻击", nil] }
end
#--------------------------------------------------------------------------
# ● 攻撃情報取得
#--------------------------------------------------------------------------
def attack
atk_element + atk_state + atk_speed + atk_times
end
#--------------------------------------------------------------------------
# ● スキルタイプ追加情報取得
#--------------------------------------------------------------------------
def skill_add_type
fts = @obj.features(FEATURE_STYPE_ADD)
fts.collect {|ft| ["タイプ「#{$data_system.skill_types[ft.data_id]}」追加", nil] }
end
#--------------------------------------------------------------------------
# ● スキルタイプ封印情報取得
#--------------------------------------------------------------------------
def skill_seal_type
fts = @obj.features(FEATURE_STYPE_SEAL)
fts.collect {|ft| ["タイプ「#{$data_system.skill_types[ft.data_id]}」封印", nil] }
end
#--------------------------------------------------------------------------
# ● スキル追加情報取得
#--------------------------------------------------------------------------
def skill_add
fts = @obj.features(FEATURE_SKILL_ADD)
fts.collect {|ft| ["「#{$data_skills[ft.data_id].name}」追加", nil] }
end
#--------------------------------------------------------------------------
# ● スキル封印情報取得
#--------------------------------------------------------------------------
def skill_seal
fts = @obj.features(FEATURE_SKILL_SEAL)
fts.collect {|ft| ["「#{$data_skills[ft.data_id].name}」封印", nil] }
end
#--------------------------------------------------------------------------
# ● スキル情報取得
#--------------------------------------------------------------------------
def skill
skill_add_type + skill_seal_type # + skill_add + skill_seal
end
#--------------------------------------------------------------------------
# ● 武器タイプ装備情報取得
#--------------------------------------------------------------------------
def equip_wtype
fts = @obj.features(FEATURE_EQUIP_WTYPE)
fts.collect {|ft| ["「#{$data_sytem.weapon_types[ft.data_id]}」装備", nil] }
end
#--------------------------------------------------------------------------
# ● 防具タイプ装備情報取得
#--------------------------------------------------------------------------
def equip_atype
fts = @obj.features(FEATURE_EQUIP_ATYPE)
fts.collect {|ft| ["「#{$data_sytem.armor_types[ft.data_id]}」装備", nil] }
end
#--------------------------------------------------------------------------
# ● 装備固定情報取得
#--------------------------------------------------------------------------
def equip_fix
fts = @obj.features(FEATURE_EQUIP_FIX)
fts.collect {|ft| ["「#{$data_sytem.terms.etypes[ft.data_id]}」装備固定化", nil] }
end
#--------------------------------------------------------------------------
# ● 装備封印情報取得
#--------------------------------------------------------------------------
def equip_seal
fts = @obj.features(FEATURE_EQUIP_SEAL)
fts.collect {|ft| ["「#{$data_sytem.terms.etypes[ft.data_id]}」装備封印", nil] }
end
#--------------------------------------------------------------------------
# ● 装備情報取得
#--------------------------------------------------------------------------
def equip
equip_wtype + equip_atype + equip_fix + equip_seal
end
#--------------------------------------------------------------------------
# ● 行動回数追加情報取得
#--------------------------------------------------------------------------
def action_plus
fts = @obj.features(FEATURE_ACTION_PLUS)
fts.collect {|ft| ["「#{[ft.value]}」回行動", nil] }
end
#--------------------------------------------------------------------------
# ● 特殊フラグ情報取得
#--------------------------------------------------------------------------
def special_flag
str = []
str.push(["自动战斗", nil]) if @obj.auto_battle?
str.push(["自动防御", nil]) if @obj.guard?
str.push(["援军", nil]) if @obj.substitute?
str.push(["#{$data_system.terms.basic[6]}装备", nil]) if @obj.substitute?
str
end
#--------------------------------------------------------------------------
# ● パーティー能力情報取得
#--------------------------------------------------------------------------
def party_ability
fts = @obj.features(FEATURE_PARTY_ABILITY)
str = []
str.push(["遇敌率减半", nil]) if fts.any? {|ft| ft.code_id == ABILITY_ENCOUNTER_HALF }
str.push(["不会遇敌", nil]) if fts.any? {|ft| ft.code_id == ABILITY_ENCOUNTER_NONE }
str.push(["不会被偷袭", nil]) if fts.any? {|ft| ft.code_id == ABILITY_CANCEL_SURPRISE }
str.push(["偷袭几率", nil]) if fts.any? {|ft| ft.code_id == ABILITY_RAISE_PREEMPTIVE }
str.push(["获得金双倍", nil]) if fts.any? {|ft| ft.code_id == ABILITY_GOLD_DOUBLE }
str.push(["掉宝双倍", nil]) if fts.any? {|ft| ft.code_id == ABILITY_DROP_ITEM_DOUBLE }
str
end
#--------------------------------------------------------------------------
# ● その他情報取得
#--------------------------------------------------------------------------
def other
action_plus + special_flag + party_ability
end
#--------------------------------------------------------------------------
# ● 全特徴取得
#--------------------------------------------------------------------------
def all
Spirits.status.inject([]) do |r, st|
case st
when :rate; r += self.rate
when :param; r += self.param
when :attack; r += self.attack
when :skill; r += self.skill
when :equip; r += self.equip
when :other; r += self.other
end
end
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
attr_reader :max_spirits # 最大精霊数
attr_reader :partner_locked # 固定パートナー
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
alias setup_spirit setup
def setup(actor_id)
@partners = []
@max_spirits = Spirits.max(actor_id)
@parent_id = 0
@partner_locked = false
@is_spirit = Spirits.spirit?(actor_id)
setup_spirit(actor_id)
end
#--------------------------------------------------------------------------
# ● 精霊?
#--------------------------------------------------------------------------
def spirit?
@is_spirit
end
#--------------------------------------------------------------------------
# ● 最大精霊数変更
#--------------------------------------------------------------------------
def max_spirits=(num)
@max_spirits = [1, num].max unless spirit?
end
#--------------------------------------------------------------------------
# ● 精霊ID
#--------------------------------------------------------------------------
def spirit_id
spirit? ? Spirits.spirit_id(@actor_id) : 0
end
#--------------------------------------------------------------------------
# ● 精霊付与可能?
#--------------------------------------------------------------------------
def can_partner(spirit_id)
spirit? ? false : (Spirits.affinity(@actor_id, spirit_id) != 0)
end
#--------------------------------------------------------------------------
# ● 精霊交換可能?
#--------------------------------------------------------------------------
def can_change_partner(index)
return false if spirit?
return true if @partners[index] == 0
$game_actors[@partners[index]].partner_locked
end
#--------------------------------------------------------------------------
# ● 精霊付与可能?
#--------------------------------------------------------------------------
def can_join_partner(partner_id=0)
return (@parent_id == 0) if spirit?
return false unless can_partner(partner_id)
(@partners.size < @max_spirits)
end
#--------------------------------------------------------------------------
# ● パートナー追加
#--------------------------------------------------------------------------
def add_partner(partner_id)
if spirit?
@parent_id = partner_id
else
return if @max_spirits == partner_num
@partners.push(partner_id) unless @partners.include?(partner_id)
end
end
#--------------------------------------------------------------------------
# ● パートナー削除
#--------------------------------------------------------------------------
def remove_partner(partner_id)
if spirit?
@parent_id = 0
unlock_partner
else
@partners.delete(partner_id)
end
end
#--------------------------------------------------------------------------
# ● パートナー変更
#--------------------------------------------------------------------------
def change_partner(partner_id, index=0)
if spirit?
@parent_id = partner_id
else
@partners[index] = partner_id
end
end
#--------------------------------------------------------------------------
# ● 仮想パートナー変更 パラメータ取得
#--------------------------------------------------------------------------
def v_chg_param(partner_id, index, param_id)
return 0 if spirit?
now_partner = @partners[index]
change_partner(partner_id, index)
prm = self.param(param_id)
change_partner(now_partner, index)
prm
end
#--------------------------------------------------------------------------
# ● パートナー有り?
#--------------------------------------------------------------------------
def has_partner?
spirit? ? (@parent_id != 0) : (!@partners.empty?)
end
def has_spirit?
spirit? ? false : (!@partners.empty?)
end
#--------------------------------------------------------------------------
# ● 精霊パートナー固定化
#--------------------------------------------------------------------------
def lock_partner
return unless spirit?
@partner_locked = true
end
#--------------------------------------------------------------------------
# ● 精霊パートナー固有化解除
#--------------------------------------------------------------------------
def unlock_partner
@partner_locked = false
end
#--------------------------------------------------------------------------
# ● パートナー参照
#--------------------------------------------------------------------------
def partners
return (has_partner? ? [$game_actors[@parent_id]] : []) if spirit?
@partners.collect {|id| id.nil? ? nil : $game_actors[Spirits.actor_id(id)]}
end
def partners_objs
partners.compact
end
#--------------------------------------------------------------------------
# ● パートナー数参照
#--------------------------------------------------------------------------
def partner_num
@partners.size
end
#--------------------------------------------------------------------------
# ● 追加スキルの取得
#--------------------------------------------------------------------------
def added_skills
has_spirit? ? partners_objs.inject(super) {|r, s| r |= s.skillids} : super
end
#--------------------------------------------------------------------------
# ● スキルID郡 取得
#--------------------------------------------------------------------------
def skillids
@skills
end
#--------------------------------------------------------------------------
# ● 通常能力値の取得
#--------------------------------------------------------------------------
def param(param_id)
super(param_id) - (spirit? ? Spirits::PRM_BASE[param_id] : 0)
end
alias org_param param
def param(param_id)
org = org_param(param_id)
if has_spirit?
partners_objs.each do |s|
org += Spirits.affinity_param(s.org_param(param_id), @actor_id, s.spirit_id)
end
end
org
end
#--------------------------------------------------------------------------
# ● 特徴を保持する全オブジェクトの配列取得
#--------------------------------------------------------------------------
alias org_feature_objects feature_objects
def feature_objects
org = org_feature_objects
partners_objs.collect {|s| s.org_feature_objects }.each {|obj| org += obj} if has_spirit?
org
end
#--------------------------------------------------------------------------
# ● 控えメンバーの経験獲得率を取得
#--------------------------------------------------------------------------
alias reserve_members_exp_rate_spirits reserve_members_exp_rate
def reserve_members_exp_rate
spirit? ? 1 : reserve_members_exp_rate_spirits
end
end
#==============================================================================
# ■ Game_Party
#==============================================================================
class Game_Party < Game_Unit
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias initialize_spirits initialize
def initialize
initialize_spirits
@spirits = []
end
#--------------------------------------------------------------------------
# ● 初期パーティのセットアップ
#--------------------------------------------------------------------------
alias setup_starting_members_spirits setup_starting_members
def setup_starting_members
setup_starting_members_spirits
@spirits = Spirits::START_V
Spirits::START_P.each_pair do |aid, sid|
if @actors.include?(aid) and @spirits.include?(sid)
$game_actors[aid].add_partner(sid)
$game_actors[Spirits.actor_id(sid)].add_partner(aid)
$game_actors[aid].recover_all
else
p "START_P[#{aid} => #{sid}] is bad arg."
end
end
end
#--------------------------------------------------------------------------
# ● 精霊を加える
#--------------------------------------------------------------------------
def include_spirit?(spirit_id)
@spirits.include?(spirit_id)
end
#--------------------------------------------------------------------------
# ● 精霊を加える
#--------------------------------------------------------------------------
def add_spirit(spirit_id)
@spirits.push(spirit_id) unless include_spirit?(spirit_id)
end
#--------------------------------------------------------------------------
# ● 精霊を外す
#--------------------------------------------------------------------------
def remove_spirit(spirit_id)
members.each {|actor| actor.remove_partner(spirit_id)}
@spirits.delete(spirit_id)
end
#--------------------------------------------------------------------------
# ● 精霊リスト
#--------------------------------------------------------------------------
def spirit_members
@spirits.collect {|id| spirit(id)}
end
#--------------------------------------------------------------------------
# ● 待機 精霊リスト
#--------------------------------------------------------------------------
def spirit_stay_members
spirit_members.select {|spirit| !spirit.has_partner?}
end
#--------------------------------------------------------------------------
# ● 精霊数
#--------------------------------------------------------------------------
def spirit_num
@spirits.size
end
#--------------------------------------------------------------------------
# ● 精霊データ
#--------------------------------------------------------------------------
def spirit(spirit_id)
$game_actors[Spirits.actor_id(spirit_id)]
end
end
#==============================================================================
# ■ Window_Base
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ● 歩行グラフィックの描画
#--------------------------------------------------------------------------
def draw_line_character(character_name, character_index, x, y, enabled=true)
return unless character_name
bitmap = Cache.character(character_name)
sign = character_name[/^[\!\$]./]
if sign && sign.include?('$')
cw = bitmap.width / 3
ch = bitmap.height / 4
else
cw = bitmap.width / 12
ch = bitmap.height / 8
end
y += (line_height - ch) / 2 if ch < line_height
n = character_index
src_rect = Rect.new((n%4*3+1)*cw, (n/4*4)*ch, cw, [ch, line_height].min)
contents.blt(x, y, bitmap, src_rect, enabled ? 255 : translucent_alpha)
cw
end
#--------------------------------------------------------------------------
# ● アクターの歩行グラフィック描画
#--------------------------------------------------------------------------
def draw_actor_line_graphic(actor, x, y, enabled=true)
draw_line_character(actor.character_name, actor.character_index, x, y, enabled)
end
#--------------------------------------------------------------------------
# ● パートナー名描画
#--------------------------------------------------------------------------
def draw_partner_name(actor, x, y)
change_color(system_color)
draw_text(x, y, contents_width, line_height, actor.spirit? ? "将领" : "副将")
x += 100
change_color(normal_color)
if actor.has_partner?
actor.partners.each_with_index {|s, i| draw_actor_line_graphic(s, x + 48 * i, y)}
else
draw_text(x, y, contents_width, line_height, "―――")
end
end
#--------------------------------------------------------------------------
# ● 名前の描画
#--------------------------------------------------------------------------
def draw_spirit_name(actor, x, y, enabled=true, width = 112)
change_color(normal_color, enabled)
draw_text(x, y, width, line_height, actor.name)
end
#--------------------------------------------------------------------------
# ● 能力値の描画
#--------------------------------------------------------------------------
def draw_spirit_param(actor, x, y, param_id)
change_color(system_color)
draw_text(x, y, 120, line_height, Vocab::param(param_id))
prm = actor.param(param_id)
change_color(param_change_color(prm))
if prm == 0
draw_text(x + 100, y, 56, line_height, "----", 2)
else
draw_text(x + 100, y, 56, line_height, sprintf("%+d", prm), 2)
end
end
end
class << BattleManager
#--------------------------------------------------------------------------
# ● 経験値の獲得とレベルアップの表示
#--------------------------------------------------------------------------
alias gain_exp_spirits gain_exp
def gain_exp
gain_exp_spirits
gain_spirit_exp if Spirits::USE_LV
end
#--------------------------------------------------------------------------
# ● 精霊の経験値獲得
#--------------------------------------------------------------------------
def gain_spirit_exp
case Spirits::EXP_TARGET
when 0
$game_party.battle_members.each do |actor|
actor.partners.compact.each do |spirit|
spirit.gain_exp(spirit_exp)
end
end
when 1
$game_party.all_members.each do |actor|
actor.partners.compact.each do |spirit|
spirit.gain_exp(spirit_exp)
end
end
when 2
$game_party.spirit_members.each do |spirit|
spirit.gain_exp(spirit_exp)
end
end
wait_for_message
end
#--------------------------------------------------------------------------
# ● 精霊用経験値
#--------------------------------------------------------------------------
def spirit_exp
Spirits::EXP_TYPE == 0 ? 1 : $game_troop.exp_total
end
end
if defined?(BtlrFv)
class << BattleManager
#--------------------------------------------------------------------------
# ● 獲得した経験値の表示
#--------------------------------------------------------------------------
alias display_result_spirit display_result
def display_result
display_result_spirit
gain_spirit_exp if Spirits::USE_LV
end
end
end # BtlrFv[/pre] |
|