#============================================================================== # ■ RGSS3 変装特徴 Ver1.02 by 星潟 #------------------------------------------------------------------------------ # 顔グラフィックや歩行グラフィックを # 一時的に変更する特徴の作成が可能になります。 #------------------------------------------------------------------------------ # このスクリプトによる設定は、全て装備品のメモ欄で行います。 #------------------------------------------------------------------------------ # ★顔グラフィックの変更 # # <顔グラ変更:Actor1,0,5> # # これで、この装備品を持つアクターの変更後の顔グラフィックとして # ファイルネーム「Actor1」の # インデックス0(上段の最も左)を優先度5で指定します。 #------------------------------------------------------------------------------ # ★歩行グラフィックの変更 # # <ホコグラ変更:Actor2,5,6> # # これで、この装備品を持つアクターの変更後の歩行グラフィックとして # ファイルネーム「Actor2」の # インデックス5(下段の左から2番目)を優先度6で指定します。 #------------------------------------------------------------------------------ # ★共通 # # 他の装備でもグラフィックの変更が設定されている場合は # 最も優先度が高い物の中で、最初に選択された物が選択されます。 #------------------------------------------------------------------------------ # 以下 XPスタイルバトル併用時のみ有効な設定です。 #------------------------------------------------------------------------------ # ★状況に応じた顔グラフィックの変更 # # HPとステートに応じて、顔グラフィックが指定された物に変更されます。 #------------------------------------------------------------------------------ # Ver1.01 XPスタイルバトル用の機能を更に追加しました。 # Ver1.02 歩行グラフィック変更機能無効化時にエラーになる不具合を解消しました。 #============================================================================== module DISGUISE_FEATURE #顔グラフィック変更機能を有効にするか否か。(trueで有効、falseで無効) FACE = true #顔グラフィック設定用のキーワードを指定します。 WORD1 = "顔グラ変更" #歩行グラフィック変更機能を有効にするか否か。(trueで有効、falseで無効) CHARA = true #歩行グラフィック設定用のキーワードを指定します。 WORD2 = "ホコグラ変更" #XPスタイルバトル導入時、ステートや現在HPに応じて #顔グラフィックを変更する機能を有効にするか? XPSC = true #XPスタイルバトル導入時の変更設定が有効な場合 #現在ステートに応じた顔グラフィックを指定します。 #[ステートID,優先度,追加文字]で1セットとなります。 #複数セット指定する場合は「,」で区切ってください。 #ステートIDは対象となるステートID。 #優先度は、その変更の優先度。(有効な物の中で最も優先度の高い物が選択されます) #追加文字は、元の顔グラフィックの後につく文字です。 #例えば、[2,50,"▲"]で、これのみを満たしている場合 #アクターの顔グラフィックファイル名がActor4であれば #Actor4▲という顔グラフィックファイルから読み込みます。 STATE_F = [ [2,50,"▲"] ] #XPスタイルバトル導入時の変更設定が有効な場合 #現在HP割合に応じた顔グラフィックを指定します。 #[HP割合,優先度,追加文字]で #1セットとなります。 #複数セット指定する場合は「,」で区切ってください。 #HP割合は対象となるHP割合。 #優先度は、その変更の優先度。(有効な物の中で最も優先度の高い物が選択されます) #追加文字は、元の顔グラフィックの後につく文字です。 #例えば、[60,1,"☆"]で、これのみを満たしている場合 #アクターの顔グラフィックファイル名がActor4であれば #Actor4☆という顔グラフィックファイルから読み込みます。 HPRATE_F = [ [60,1,"☆"], [30,2,"★"] ] #優先度はステートとHP両方共通ですので #両方で最も高い優先度の物が選択されます。 #同じ値である場合、先に処理が行われた方が優先されます。 end class Game_Temp attr_accessor :disguise_flag #-------------------------------------------------------------------------- # XPスタイルバトル導入フラグ #-------------------------------------------------------------------------- def xps_flag #キャッシュが存在する場合はキャッシュを返す。 return @xps_flag if @xps_flag != nil #XPスタイルバトル導入フラグの取得。 @xps_flag = $lnx_include != nil && $lnx_include[:lnx11a] != nil #キャッシュを返す。 @xps_flag end end class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # 顔グラフィック変更機能が有効な時 #-------------------------------------------------------------------------- if DISGUISE_FEATURE::FACE #-------------------------------------------------------------------------- # 顔グラフィックの名称 #-------------------------------------------------------------------------- def face_name #変更用の顔グラフィックのファイル名を取得する。 #存在しない場合は本来の顔グラフィックのファイル名を返す。 data = ex_face.empty? ? @face_name : ex_face_best[0] #XPスタイルバトル導入時のみ処理を分岐。 if $game_temp.xps_flag #キャッシュが存在しない場合はキャッシュを生成。 @l_face_name = data if @l_face_name == nil #キャッシュと一致しない場合に限り、バトラーグラフィック更新フラグを立てる。 if @l_face_name != data self.refresh_battler_graphic = true @l_face_name = data end end data end #-------------------------------------------------------------------------- # 顔グラフィックのインデックスを取得 #-------------------------------------------------------------------------- def face_index #変更用の顔グラフィックインデックスを取得する。 #存在しない場合は本来の顔グラフィックインデックスを返す。 data = ex_face.empty? ? @face_index : ex_face_best[1] #XPスタイルバトル導入時のみ処理を分岐。 if $game_temp.xps_flag #キャッシュが存在しない場合はキャッシュを生成。 @l_face_index = data if @l_face_index == nil if @l_face_index != data self.refresh_battler_graphic = true @l_face_index = data end end data end #-------------------------------------------------------------------------- # 顔グラフィックの一覧を取得 #-------------------------------------------------------------------------- def ex_face data = [] feature_objects.each {|f| data.push(f.ex_face) if f && f.ex_face} data end #-------------------------------------------------------------------------- # 最も優先度の高い顔グラフィックを取得 #-------------------------------------------------------------------------- def ex_face_best f_data = ["",0,0] ex_face.each {|f| f_data = f if f_data[2] < f[2]} f_data end end #-------------------------------------------------------------------------- # 歩行グラフィック変更機能が有効な時 #-------------------------------------------------------------------------- if DISGUISE_FEATURE::CHARA #-------------------------------------------------------------------------- # 歩行グラフィックの名称 #-------------------------------------------------------------------------- def character_name #変更用の歩行グラフィックのファイル名を取得する。 #存在しない場合は本来の歩行グラフィックのファイル名を返す。 data = ex_character.empty? ? @character_name : ex_character_best[0] #XPスタイルバトル導入時のみ処理を分岐。 if $game_temp.xps_flag #キャッシュが存在しない場合はキャッシュを生成。 @l_character_name = data if @l_character_name == nil if @l_character_name != data self.refresh_battler_graphic = true @l_character_name = data end end data end #-------------------------------------------------------------------------- # 歩行グラフィックのインデックスを取得 #-------------------------------------------------------------------------- def character_index #変更用の歩行グラフィックインデックスを取得する。 #存在しない場合は本来の歩行グラフィックインデックスを返す。 data = ex_character.empty? ? @character_index : ex_character_best[1] #XPスタイルバトル導入時のみ処理を分岐。 if $game_temp.xps_flag #キャッシュが存在しない場合はキャッシュを生成。 @l_character_index = data if @l_character_index == nil if @l_character_index != data self.refresh_battler_graphic = true @l_character_index = data end end data end #-------------------------------------------------------------------------- # 歩行グラフィックの一覧を取得 #-------------------------------------------------------------------------- def ex_character data = [] feature_objects.each {|f| data.push(f.ex_character) if f && f.ex_character} data end #-------------------------------------------------------------------------- # 最も優先度の高い歩行グラフィックを取得 #-------------------------------------------------------------------------- def ex_character_best c_data = ["",0,0] ex_character.each {|c| c_data = c if c_data[2] < c[2]} c_data end end #-------------------------------------------------------------------------- # リフレッシュ #-------------------------------------------------------------------------- alias refresh_disguise refresh def refresh #本来の処理を実行。 refresh_disguise #スタック回避フラグが立っていない場合に限り、特殊リフレッシュを実行。 $game_player.disguise_refresh(self) if !$game_temp.disguise_flag end end if DISGUISE_FEATURE::CHARA class Game_Player < Game_Character #-------------------------------------------------------------------------- # 特殊リフレッシュ #-------------------------------------------------------------------------- def disguise_refresh(d_actor) #スタック回避フラグを立てる。 $game_temp.disguise_flag = true #先頭アクターと特殊リフレッシュ対象が同一の場合は #先頭アクターに特殊リフレッシュを実行する。 #そうでない場合は、フォロワーに対し特殊リフレッシュを実行する。 if actor == d_actor @character_name = actor ? actor.character_name : "" @character_index = actor ? actor.character_index : 0 else @followers.disguise_refresh(d_actor) end #スタック回避フラグを消す。 $game_temp.disguise_flag = nil end end class Game_Followers #-------------------------------------------------------------------------- # 特殊リフレッシュ #-------------------------------------------------------------------------- def disguise_refresh(d_actor) #フォロワーが存在しない場合は処理を終了する。 return if @data.empty? #フォロワー内に特殊リフレッシュ対象が存在する時 #そのフォロワーのみに特殊リフレッシュを実行。 @data.each do |d| return d.refresh if d.actor == d_actor end end end end class RPG::BaseItem if DISGUISE_FEATURE::FACE #-------------------------------------------------------------------------- # 顔グラフィック変更情報 #-------------------------------------------------------------------------- def ex_face #キャッシュがある場合はキャッシュを返す。 return @ex_face if @ex_face != nil #メモ欄からデータを取得。 @ex_face = false memo = self.note.scan(/<#{DISGUISE_FEATURE::WORD1}[::](\S+),(\d+),(\d+)>/).flatten #正常なデータを取得出来無かった場合は空の配列とする。 if memo != nil && !memo.empty? && memo[1].to_i < 8 && memo[2].to_i > 0 @ex_face = [memo[0], memo[1].to_i, memo[2].to_i] end #データを返す。 @ex_face end end if DISGUISE_FEATURE::CHARA #-------------------------------------------------------------------------- # 歩行グラフィック変更情報 #-------------------------------------------------------------------------- def ex_character #キャッシュがある場合はキャッシュを返す。 return @ex_character if @ex_character != nil #メモ欄からデータを取得。 @ex_character = false memo = self.note.scan(/<#{DISGUISE_FEATURE::WORD2}[::](\S+),(\d+),(\d+)>/).flatten #正常なデータを取得出来無かった場合は空の配列とする。 if memo != nil && !memo.empty? && memo[1].to_i < 8 && memo[2].to_i > 0 @ex_character = [memo[0], memo[1].to_i, memo[2].to_i] end #データを返す。 @ex_character end end end if $lnx_include != nil && $lnx_include[:lnx11a] != nil class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # グラフィック設定の配列内データを変更する。 #-------------------------------------------------------------------------- def graphic_name_index #@を抜き、参照対象をGame_Actor内変数からGame_Actorで定義された物にする。 case LNX11::DEFAULT_BATTLER_GRAPHIC when 0 ; [face_name, face_index] when 1 ; [character_name, character_index] end end #-------------------------------------------------------------------------- # デフォルトバトラーグラフィック設定を変更する。 #-------------------------------------------------------------------------- def default_battler_graphic #@を抜き、参照対象をGame_Actor内変数からGame_Actorで定義された物にする。 case LNX11::DEFAULT_BATTLER_GRAPHIC when 0 # 顔グラフィック self.facebattler = draw_face(face_name, face_index) when 1 # 歩行グラフィック self.facebattler = draw_character(character_name, character_index) end end #以下はステートやHPに応じた表情変化が有効な場合のみ処理を行う。 if DISGUISE_FEATURE::XPSC #-------------------------------------------------------------------------- # 顔グラフィックの名称 #-------------------------------------------------------------------------- alias face_name_hp_rate_state face_name def face_name #本来の処理でのデータを取得する。 data = face_name_hp_rate_state #顔グラフィックの追加名称を付与。 data = data + hp_rate_face_text #データを返す。 data end #-------------------------------------------------------------------------- # 顔グラフィックの追加名称 #-------------------------------------------------------------------------- def hp_rate_face_text #HP割合を取得。 data = self.hp_rate * 100 #初期優先度を設定。 pr = 0 #初期追加文字を設定。 text = "" #各ステート指定に依存した処理を実行。 DISGUISE_FEATURE::STATE_F.each do |a| if a[1] > pr next unless state?(a[0]) pr = a[1] text = a[2] end end #各HP指定に依存した処理を実行。 DISGUISE_FEATURE::HPRATE_F.each do |a| if a[1] > pr next unless a[0] >= data pr = a[1] text = a[2] end end text end #-------------------------------------------------------------------------- # リフレッシュ #-------------------------------------------------------------------------- alias refresh_hp_rate_state refresh def refresh #本来の処理を実行。 refresh_hp_rate_state #グラフィック更新フラグをtrueにする。 @refresh_battler_graphic = true end end end end