#============================================================================ # # ■パーティーメンバーの追従 □Ver.3.36 □製作者:月紳士 # ・RPGツクールVX用 RGSS2スクリプト # # ●…書き換えメソッド(競合注意) ◎…メソッドのエイリアス ○…新規メソッド # # ※二次配布禁止!配布元には利用規約があります。必ずそちらを見てください。 #---------------------------------------------------------------------------- # 更新履歴 # Ver.3.36 イベントコマンド「アクターのグラフィック変更」に更新処理を追加。 # Ver.3.35 乗り物拡張併用時の動作を修正。 # Ver.3.34 乗り物拡張併用時の動作を修正。 # Ver.3.32 フォローメンバーグラフィックの更新処理を修正。 # Ver.3.31 フォローメンバーのすり抜けON/OFFを維持出来るように変更。 # Ver.3.30 追従動作に斜め移動を追加。 # Ver.3.24 フォローメンバーが非表示の場合の衝突判定の不具合を修正。 # Ver.3.23 棺桶表示を使用しない場合の処理を修正。 # Ver.3.22 追従キャラクター非表示の際の集合動作を改良。 # Ver.3.21 棺桶が表示されない不具合を修正。 # Ver.3.20 マップループ時の追従挙動を修正。 # Ver.3.17 メソッド整理とゲストメンバー挿入位置調整機能追加。 # Ver.3.16 隠す処理の不具合修正。 # Ver.3.12 イベントコマンド・スクリプト全回復時の更新処理を追加。 # Ver.3.11 パーティー加入時イベント用動作処理を追加。 # Ver.3.10 フォローメンバーを隠す機能の強化とゲスト表示機能を強化。 # Ver.3.01 コマンド追加。 # Ver.3.00 ゲストキャラクター表示機能を追加。 # Ver.2.03 戦闘テスト時に起きる不具合を修正。 # Ver.2.02 不具合再修正と処理軽量化。 # Ver.2.00 仕様見直しと棺桶未使用時の不具合を修正。 #============================================================================ =begin  このスクリプトは  パーティーのメンバーを主人公キャラ(先頭キャラ)の後に着いて歩かせる、  いわいる「隊列歩行」を実現するスクリプトです。  ・乗り物への乗り込み動作を再現。  ・簡単に表示数を増やすことができる構造になっており、   パーティー人数の多いシステムへの対応が容易。  ・某ゲームのように戦闘不能メンバーを棺おけ表示にしたり出来る。  ・パーティーには実際に参加せず、追従のみをするゲストキャラクターを設定可能。   ゲストは最後尾だけでなく、先頭にすることも可能。  以下に使い方を説明します↓ #----------------------------------------------------------------------------  ●カスタマイズ項目の説明  まず、カスタマイズ項目の説明をします。 MOVE_ROUTE_FORCING_FOLLOW  移動ルートの強制時にもパーティーメンバーを追従させるか?  カスタマイズ項目での設定は初期設定となります。  ゲーム中は イベントコマンド・スクリプトにて $game_player.move_route_forcing_follow = true  (もしくは = false) で変更できます。  = true で常に追従、= false でキー操作時のみとなります。 USE_COFFIN  戦闘不能時に棺おけにするか?  戦闘不能メンバーは隊列が(表示だけですが)変更されます。  生存者から先頭に並びます。棺桶はその後ろです。  ちなみに生存者のうち、先頭キャラの取得の仕方は $game_party.existing_members[0] IDの取得であれば $game_party.existing_members[0].id です。生存者数なら $game_party.existing_members[0].size と、なります。イベントコマンドでの変数取得や条件分岐に。 COFFIN_FILE_NAME  棺おけに使う画像のファイル名です。  = "$Coffin" 等と、必ず "" で囲ってください。 COFFIN_FILE_INDEX 棺おけに使う画像ファイルのインデックスです。 DISPLAY_MEMBERS 表示するメンバーの最大数です。 多人数パーティースクリプトなどで数をカスタマイズしている場合は 戦闘メンバーの数にあわせると良いと思います。 ゲストメンバーを使用する場合は、ゲーム中における パーティーメンバー+ゲストメンバーの最大数にしておく必要があります。 DIRECTION_8_FOLLOW 追従時の8方向移動(斜め移動)を許可するか、設定します。  = true で斜め移動可、= false で縦横移動のみとなります。 #----------------------------------------------------------------------------  ●イベント時の追従キャラクターの操作  イベントコマンド・移動ルートの設定やフキダシ表示をメンバーに行うには  「移動ルートの設定」コマンドより前にイベントコマンド・スクリプトで   change_this_event(1) と実行すると、各スクリプトでの「このイベント」の対象が 指定順番(上記括弧内の 1 の部分→追従順で1番=パーティー先頭から2番目)の  キャラクターへの指示となります。   ちなみに、0 番は先頭キャラ(プレイヤーへの指示と同じ)、  -1 で元の「このイベント」に戻ります。     ※ この対象変更設定はページ内のみ有効なので     別ページならその都度、対象を変更してから行う必要がありますが、     他ページの為に実行後にいちいち元に戻す、という手間はありません。  棺桶状態での表示(カスタマイズ項目参照)時、指定はアクターの隊列順番ではなく  生存者によって並び直した見た目の順番に対して、  単純に「先頭から何番目に表示されているか」で指定されます。  (棺桶であっても。change_this_event(1) ならとにかく先頭から2番目のキャラ)   #--------------------------------------------------------------------------    ●追従キャラクター非表示  追従キャラクターを非表示にするには、イベントコマンド・スクリプトにて follow_member_off と記入し実行します。 follow_member_on  とすれば、追従キャラクターを表示するように戻すことが出来ます。  また、 follow_member_off(2) とすると、「パーティー2番目までを表示、後を隠す」という風に 指定の数を元に、隠す際の人数を調節できます。  ※ これは隠す人数を調整しているだけなので、   厳密には表示人数の変更とは違います。 後述の表示最大人数の設定を超えて表示させるような   表示人数の変更にあたる動作はできません。   隠す人数の調整ですから、その後にfollow_member_on を実行すれば、   隠された人数が何人であっても、全員表示に戻ります。    隠す人数を変更したい場合は、 改めて follow_member_off(x) を別の数で実行してください。   ちなみに follow_member_off(1) は follow_member_off と同機能、 follow_member_off(0) は先頭キャラを含めて全員を隠す  です。   #--------------------------------------------------------------------------  ●ゲストメンバーの表示  実際にパーティーには加入せず、  追従表示だけをおこなうキャラクターを設定できます。  加入させたい時は  イベントコマンド・スクリプトにて add_guest_member("People1", 1) というようにスクリプト実行させます。 ( )内にファイル名とインデックスを記入することでキャラクター指定をします。 "People1" の部分がファイル名です。Charactersフォルダ内のファイルです。 拡張子はいりませんが、ファイル名を "" で閉じるのを忘れずに。 その後の半角数字でインデックスを記入します。例だと 1 の部分です。 ゲストキャラクターを外す場合は、 remove_guest_member("People1", 1)    と実行させます。このコマンドは  同名・同インデックスのゲストキャラクターがいる場合のみ有効です。   clear_guest_member とすればゲストキャラクターを一括で消し、初期状態に戻せます。 ゲストキャラクターを表示できるのは 追従キャラクターの表示最大数までとなります。 ゲストメンバーはパーティーメンバーの後ろについて行きますが ゲストメンバーを先頭に、パーティーメンバーを後に続かせる事も出来ます。 change_guest_member_order とイベントコマンド・スクリプトを実行すると ゲストメンバーとパーティーメンバーの並びが逆転します。 (再度の実行で元にもどります) 逆転という形でなく、次のような特別な指定も出来ます。 change_guest_member_order(true) # ゲストメンバーを先頭にする change_guest_member_order(false) # ゲストメンバーを後ろにする change_guest_member_order(2) # ゲストメンバーを2番目に挿入 いずれも、 change_guest_member_order の再実行でデフォルト(列の後ろ)に戻ります。 #--------------------------------------------------------------------------  ●パーティーメンバーを個別に非表示  パーティーメンバーの歩行画像を「なし」にした場合、  そのキャラクターの隊列表示はされず、  それより後ろのパーティーメンバーやゲストが次に続きます。    隊列に参加させたくないアクターは歩行画像を「なし」にしてみてください。 #--------------------------------------------------------------------------  ●追従キャラクターの集合  イベントコマンド・スクリプトにて follow_member_gathering  というようにスクリプト実行させると、  乗り物への乗りこみ動作のように追従キャラクターが集合します。 =end #============================================================================== # □ カスタマイズ項目 #============================================================================== module Party_Member_Follow MOVE_ROUTE_FORCING_FOLLOW = false # 移動ルートの強制時にもパーティーメンバーを追従させるか?(初期設定) USE_COFFIN = true # 戦闘不能時に棺おけにするか? COFFIN_FILE_NAME = "$Coffin" # 棺おけに使う画像のファイル名。 COFFIN_FILE_INDEX = 0 # 棺おけに使う画像ファイルのインデックス。 DISPLAY_MEMBERS = 5 # 表示するメンバーの最大数。 DIRECTION_8_FOLLOW = true # 追従時の8方向移動(斜め移動)を許可するか? end #============================================================================== # ■ Game_Party #------------------------------------------------------------------------------ #  パーティを扱うクラスです。ゴールドやアイテムなどの情報が含まれます。このク # ラスのインスタンスは $game_party で参照されます。 #============================================================================== class Game_Party < Game_Unit #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :follow_member # 追従メンバー情報 attr_reader :guest_member # ゲストメンバー情報 attr_accessor :guest_head # ゲスト先頭フラグ #-------------------------------------------------------------------------- # ◎ 初期パーティのセットアップ #-------------------------------------------------------------------------- alias tig_pmf_setup_starting_members setup_starting_members def setup_starting_members tig_pmf_setup_starting_members @guest_member = [] @guest_head = false create_follow_member end #-------------------------------------------------------------------------- # ○ フォローメンバーの作成 #-------------------------------------------------------------------------- def create_follow_member @follow_member = [] (Party_Member_Follow::DISPLAY_MEMBERS - 1).times do |i| @follow_member.push(Game_Follow_Members.new(i)) end character_graphic_refresh end #-------------------------------------------------------------------------- # ○ パーティーの歩行グラフィックのリフレッシュ #-------------------------------------------------------------------------- def character_graphic_refresh return unless $scene.is_a?(Scene_Map) $game_player.character_graphic_refresh @follow_member.each{|i|i.character_graphic_refresh} end #-------------------------------------------------------------------------- # ○ 歩行表示させるメンバーの取得 #-------------------------------------------------------------------------- def display_follow_member(exist = true) result = [] actors = (exist and Party_Member_Follow::USE_COFFIN ) ? existing_members : members for actor in actors next if actor.character_name == "" result.push(actor) end if @guest_head == true result = @guest_member + result elsif @guest_head == false result += @guest_member else result[@guest_head-1, 0] = @guest_member end return result end #-------------------------------------------------------------------------- # ○ フォローメンバー追従 #-------------------------------------------------------------------------- def follow_member_target_move gathered = true @follow_member.each{|i|gathered = false unless i.move_toward_target_update} if gathered # 集合が完了した場合 $game_player.follow_member_gathering = false # 集合中フラグのオフ end end #-------------------------------------------------------------------------- # ○ フォローメンバーをプレイヤーキャラクターに重ねる #-------------------------------------------------------------------------- def follow_member_stack @follow_member.each{|i|i.moveto_player} end #-------------------------------------------------------------------------- # ○ フォローメンバーの透明化解除 #-------------------------------------------------------------------------- def follow_member_transparent_off @follow_member.each{|i|i.transparent = false} end #-------------------------------------------------------------------------- # ○ ゲストキャラクターをパーティーに加入させる #-------------------------------------------------------------------------- def add_guest_member(file_name, index) @guest_member.push(Guest_Members.new(file_name, index)) character_graphic_refresh end #-------------------------------------------------------------------------- # ○ ゲストキャラクターをパーティーから外す #-------------------------------------------------------------------------- def remove_guest_member(file_name, index) for i in 0...@guest_member.size if @guest_member[i].character_name == file_name and @guest_member[i].character_index == index @guest_member[i] = nil end end @guest_member.compact! character_graphic_refresh end #-------------------------------------------------------------------------- # ○ ゲストキャラクターをクリアする #-------------------------------------------------------------------------- def clear_guest_member @guest_member =[] character_graphic_refresh end #-------------------------------------------------------------------------- # ○ ゲストキャラクターとパーティーメンバーの並びを変更する #-------------------------------------------------------------------------- def change_guest_member_order(order = nil) if order == nil @guest_head = !@guest_head # フラグ初期化・反転 else @guest_head = order end character_graphic_refresh end end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ◎ リフレッシュ #-------------------------------------------------------------------------- alias tig_pmf_refresh refresh def refresh tig_pmf_refresh $game_party.character_graphic_refresh end end #============================================================================== # ■ Game_Character #------------------------------------------------------------------------------ #  キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event # クラスのスーパークラスとして使用されます。 #============================================================================== class Game_Character #-------------------------------------------------------------------------- # ● 通行可能判定 # x : X 座標 # y : Y 座標 #-------------------------------------------------------------------------- def passable?(x, y) x = $game_map.round_x(x) # 横方向ループ補正 y = $game_map.round_y(y) # 縦方向ループ補正 return false unless $game_map.valid?(x, y) # マップ外? return true if @through or debug_through? # すり抜け ON? return false unless map_passable?(x, y) # マップが通行不能? return false if collide_with_characters?(x, y) # キャラクターに衝突? return false if collide_with_follow_member(x, y) ## 追加部分 return true # 通行可 end #-------------------------------------------------------------------------- # ○ フォローメンバーとの衝突判定 #-------------------------------------------------------------------------- def collide_with_follow_member(x, y) return false if self == $game_player $game_party.follow_member.each do |follow_member| next if follow_member == self next if follow_member.transparent return true if follow_member.pos_nt?(x, y) end return false end #-------------------------------------------------------------------------- # ○ 指定座標に近づく #-------------------------------------------------------------------------- def move_toward_coordinates(x, y) sx = @x - x if $game_map.loop_horizontal? # 横にループしているとき if sx.abs > $game_map.width / 2 # 絶対値がマップの半分より大きい? sx -= $game_map.width # マップの幅を引く end end sy = @y - y if $game_map.loop_vertical? # 縦にループしているとき if sy.abs > $game_map.height / 2 # 絶対値がマップの半分より大きい? sy -= $game_map.height # マップの高さを引く end end if sx != 0 or sy != 0 if sx.abs > sy.abs # 横の距離のほうが長い sx > 0 ? move_left : move_right # 左右方向を優先 if @move_failed and sy != 0 sy > 0 ? move_up : move_down end else # 縦の距離のほうが長いか等しい sy > 0 ? move_up : move_down # 上下方向を優先 if @move_failed and sx != 0 sx > 0 ? move_left : move_right end end end end #-------------------------------------------------------------------------- # ○ 指定キャラクターに近づく #-------------------------------------------------------------------------- def move_toward_pos(character) move_toward_coordinates(character.x, character.y) end #-------------------------------------------------------------------------- # ○ プレイヤー正面からパーティー最後尾へ #-------------------------------------------------------------------------- # ※ イベントキャラクターをパーティーに追加する際の演出に。 # イベントコマンド・移動ルートの設定内の、スクリプトで実行。 # パーティー表示最大数と同じ数だけ実行設定しておく必要あり。 # 「このイベント」・「移動終了までウエイト」の設定、 # 実行前にすり抜けONにする、実行後にイベント位置を(必要なら)戻す # 等も忘れずに。 #-------------------------------------------------------------------------- def party_join member = $game_party.follow_member return if @x == member[$game_party.display_follow_member.size-1].x and @y == member[$game_party.display_follow_member.size-1].y ($game_party.display_follow_member.size - 2).downto(0) do |i| if @x == member[i].x and @y == member[i].y move_toward_pos(member[i+1]) return end end if @x == $game_player.x and @y == $game_player.y move_toward_pos(member[0]) return end move_toward_pos($game_player) end end #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :follow_member_gathering attr_reader :move_speed attr_reader :vehicle_getting_on attr_accessor :move_route_forcing_follow attr_accessor :follow_hide #-------------------------------------------------------------------------- # ◎ オブジェクト初期化 #-------------------------------------------------------------------------- alias tig_pmf_initialize initialize def initialize tig_pmf_initialize @follow_member_gathering = false @move_route_forcing_follow = Party_Member_Follow::MOVE_ROUTE_FORCING_FOLLOW @follow_hide = false end #-------------------------------------------------------------------------- # ◎ フレーム更新 #-------------------------------------------------------------------------- alias tig_pmf_pl_update update def update tig_pmf_pl_update $game_party.follow_member_target_move if moving? and @move_route_forcing_follow end #-------------------------------------------------------------------------- # ◎ 方向ボタン入力による移動処理 #-------------------------------------------------------------------------- alias tig_pmf_move_by_input move_by_input def move_by_input tig_pmf_move_by_input if Input.dir4 != 0 $game_party.follow_member_target_move if moving? and not @move_route_forcing_follow end end #-------------------------------------------------------------------------- # ◎ 移動可能判定 #-------------------------------------------------------------------------- alias tig_pmf_movable? movable? def movable? return false unless tig_pmf_movable? return false if @follow_member_gathering return false if @vehicle_getting_off_wait return true end #-------------------------------------------------------------------------- # ◎ フレーム更新 #-------------------------------------------------------------------------- alias tig_pmf_update update def update tig_pmf_update if @follow_member_gathering $game_party.follow_member_target_move end $game_party.follow_member.each{|i|i.update} if @vehicle_getting_on and not moving? and now_vehicle and now_vehicle.pos?(@x, @y) @vehicle_hide = true end if @vehicle_getting_off_wait and now_vehicle == nil $game_party.follow_member_transparent_off $game_party.follow_member_stack @vehicle_getting_off_wait = false end end #-------------------------------------------------------------------------- # ○ 透明化の取得 #-------------------------------------------------------------------------- def transparent return true if @vehicle_hide and not now_vehicle_riding_type? return true if @follow_hide return @transparent end #-------------------------------------------------------------------------- # ○ 歩行グラフィックのリフレッシュ # ※ 生存者が先頭になるように歩行グラフィックを表示する機能あり。 # 全員死亡している場合は棺にする #-------------------------------------------------------------------------- def character_graphic_refresh return unless $scene.is_a?(Scene_Map) @pmf_character_name = "" @pmf_character_index = 0 unless Party_Member_Follow::USE_COFFIN unless $game_party.display_follow_member.empty? @pmf_character_name = $game_party.display_follow_member[0].character_name @pmf_character_index = $game_party.display_follow_member[0].character_index end return end if $game_party.display_follow_member[0] == nil if $game_party.display_follow_member(false).size >= 1 @pmf_character_name = Party_Member_Follow::COFFIN_FILE_NAME @pmf_character_index = Party_Member_Follow::COFFIN_FILE_INDEX end else @pmf_character_name = $game_party.display_follow_member[0].character_name @pmf_character_index = $game_party.display_follow_member[0].character_index end end #-------------------------------------------------------------------------- # ○ 歩行グラフィック ファイル名 #-------------------------------------------------------------------------- def character_name return @pmf_character_name end #-------------------------------------------------------------------------- # ○ 歩行グラフィック インデックス #-------------------------------------------------------------------------- def character_index return @pmf_character_index end #-------------------------------------------------------------------------- # ◎ 指定位置に移動 # x : X 座標 # y : Y 座標 #-------------------------------------------------------------------------- alias tig_pmf_moveto moveto def moveto(x, y) tig_pmf_moveto(x, y) $game_party.follow_member_stack end #-------------------------------------------------------------------------- # ● 乗り物の乗降 #-------------------------------------------------------------------------- def get_on_off_vehicle return false unless movable? if in_vehicle? result = get_off_vehicle ## 変更部分 if result ## 結果に合わせてフラグオン @vehicle_getting_off_wait = true ## @vehicle_hide = false ## end ## return result else result = get_on_vehicle ## 変更部分 @follow_member_gathering = true if result ## 結果に合わせてフラグオン return result ## end end #-------------------------------------------------------------------------- # ◎ 乗り物の処理 #-------------------------------------------------------------------------- alias tig_pmf_update_vehicle update_vehicle def update_vehicle return if @follow_member_gathering tig_pmf_update_vehicle end #-------------------------------------------------------------------------- # ○ 今乗っている乗り物 #-------------------------------------------------------------------------- def now_vehicle return nil if @vehicle_type == -1 return $game_map.vehicles[@vehicle_type] end #-------------------------------------------------------------------------- # ○ 今乗っている乗り物が騎乗タイプか?(乗り物拡張用ダミー) #-------------------------------------------------------------------------- def now_vehicle_riding_type? return false end end #============================================================================== # ■ Game_Vehicle #------------------------------------------------------------------------------ #  乗り物を扱うクラスです。このクラスは Game_Map クラスの内部で使用されます。 # 現在のマップに乗り物がないときは、マップ座標 (-1,-1) に設定されます。 #============================================================================== class Game_Vehicle < Game_Character #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super if @type == 2 # 飛行船の場合 if @driving return if $game_player.follow_member_gathering ### 追加部分 if @altitude < MAX_ALTITUDE @altitude += 1 # 高度を上げる end elsif @altitude > 0 @altitude -= 1 # 高度を下げる if @altitude == 0 @priority_type = 0 # プライオリティを「通常キャラの下」に戻す end end end end end #============================================================================== # □ Game_Follow_Members #------------------------------------------------------------------------------ #  主人公キャラ(先頭キャラ)の後を追従するパーティーメンバーを扱うクラスです。 #============================================================================== class Game_Follow_Members < Game_Character #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :index attr_accessor :follow_hide #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(order) super() @order = order @target_x = $game_player.x @target_y = $game_player.y @next_target_x = $game_player.x @next_target_y = $game_player.y @follow_hide = false end #-------------------------------------------------------------------------- # ○ 歩行グラフィックのリフレッシュ # ※ 生存者が先頭になるように歩行グラフィックを表示する機能あり。 # 全員死亡している場合は棺にする #-------------------------------------------------------------------------- def character_graphic_refresh return unless $scene.is_a?(Scene_Map) @pmf_character_name = "" @pmf_character_index = 0 unless Party_Member_Follow::USE_COFFIN if $game_party.display_follow_member[@order+1] @pmf_character_name = $game_party.display_follow_member[@order+1].character_name @pmf_character_index = $game_party.display_follow_member[@order+1].character_index end return end if $game_party.display_follow_member[@order+1] == nil if $game_party.display_follow_member(false).size >= @order+2 @pmf_character_name = Party_Member_Follow::COFFIN_FILE_NAME @pmf_character_index = Party_Member_Follow::COFFIN_FILE_INDEX end else @pmf_character_name = $game_party.display_follow_member[@order+1].character_name @pmf_character_index = $game_party.display_follow_member[@order+1].character_index end end #-------------------------------------------------------------------------- # ○ 歩行グラフィック ファイル名 #-------------------------------------------------------------------------- def character_name return @pmf_character_name end #-------------------------------------------------------------------------- # ○ 歩行グラフィック インデックス #-------------------------------------------------------------------------- def character_index return @pmf_character_index end #-------------------------------------------------------------------------- # ○ フレーム更新 #-------------------------------------------------------------------------- def update if $game_player.vehicle_getting_on and not moving? and $game_player.now_vehicle and $game_player.now_vehicle.pos?(@x, @y) @transparent = true end @move_speed = $game_player.move_speed super end #-------------------------------------------------------------------------- # ● 座標一致と「すり抜け OFF」判定 (nt = No Through) #-------------------------------------------------------------------------- def pos_nt?(x, y) return false if @transparent return (pos?(x, y) and not @through) end #-------------------------------------------------------------------------- # ○ ダッシュ状態判定 #-------------------------------------------------------------------------- def dash? return false if @move_route_forcing return false if $game_player.follow_member_gathering return $game_player.dash? end #-------------------------------------------------------------------------- # ○ 透明化の取得 #-------------------------------------------------------------------------- def transparent return true if @follow_hide return @transparent end #-------------------------------------------------------------------------- # ○ プレイヤーの位置とそろえる #-------------------------------------------------------------------------- def moveto_player moveto($game_player.x, $game_player.y) @target_x = $game_player.x @target_y = $game_player.y @next_target_x = $game_player.x @next_target_y = $game_player.y @direction = $game_player.direction end #-------------------------------------------------------------------------- # ○ 追従するキャラクターの取得 #-------------------------------------------------------------------------- def target_character if @order == 0 return $game_player else return $game_party.follow_member[@order-1] end end #-------------------------------------------------------------------------- # ○ 追従の更新 # ※ 追従が完了している場合は true を返す #-------------------------------------------------------------------------- def move_toward_target_update return false if moving? if $game_player.follow_member_gathering and (character_name == "" or transparent) moveto_player return true end if @x == target_character.x and @x == @next_target_x and @y == target_character.y and @y == @next_target_y return true end if $game_player.move_route_forcing and not $game_player.move_route_forcing_follow return true end @target_x = @next_target_x @target_y = @next_target_y @next_target_x = target_character.x @next_target_y = target_character.y if @target_x == @next_target_x and @target_y == @next_target_y return if target_character.moving? end move_toward_target return true if character_name == "" return true if transparent return false end #-------------------------------------------------------------------------- # ○ 追従すべきポイントへの X 距離計算 #-------------------------------------------------------------------------- def distance_x_target sx = @x - @target_x if $game_map.loop_horizontal? # 横にループしているとき if sx.abs > $game_map.width / 2 # 絶対値がマップの半分より大きい? sx += $game_map.width # マップの幅を足す end end return sx end #-------------------------------------------------------------------------- # ○ 追従すべきポイントへの Y 距離計算 #-------------------------------------------------------------------------- def distance_y_target sy = @y - @target_y if $game_map.loop_vertical? # 縦にループしているとき if sy.abs > $game_map.height / 2 # 絶対値がマップの半分より大きい? sy += $game_map.height # マップの高さを足す end end return sy end #-------------------------------------------------------------------------- # ○ 追従すべきポイントへ近づく #-------------------------------------------------------------------------- def move_toward_target default_through = @through @through = true # 追従歩行中はすり抜け判定 sx = distance_x_target sy = distance_y_target if sx != 0 or sy != 0 if sx == 0 # 横方向へ移動 (0..$game_map.height).include?(sy) ? move_up : move_down elsif sy == 0 # 縦方向へ移動 (0..$game_map.width).include?(sx) ? move_left : move_right elsif Party_Member_Follow::DIRECTION_8_FOLLOW # 斜め方向へ移動 if (0..$game_map.height).include?(sy) (0..$game_map.width).include?(sx) ? move_upper_left : move_upper_right else (0..$game_map.width).include?(sx) ? move_lower_left : move_lower_right end else # 斜め移動させない場合 if sx.abs > sy.abs # 横の距離のほうが長い (0..$game_map.width).include?(sx) ? move_left : move_right # 左右方向を優先 if @move_failed and sy != 0 (0..$game_map.height).include?(sy) ? move_up : move_down end else # 縦の距離のほうが長いか等しい (0..$game_map.height).include?(sy) ? move_up : move_down # 上下方向を優先 if @move_failed and sx != 0 (0..$game_map.width).include?(sx) ? move_left : move_right end end end end @through = default_through end #-------------------------------------------------------------------------- # ● 接触イベントの起動判定 #-------------------------------------------------------------------------- def check_event_trigger_touch(x, y) return false end #-------------------------------------------------------------------------- # ○ プレイヤーの対面に移動 #-------------------------------------------------------------------------- def set_pos_player_facing x = $game_map.x_with_direction($game_player.x, $game_player.direction) y = $game_map.y_with_direction($game_player.y, $game_player.direction) moveto(x, y) @direction = 10 - $game_player.direction end end #============================================================================== # □ Guest_Members #------------------------------------------------------------------------------ #  歩行表示のみをするゲストメンバーを扱うクラスです。 #============================================================================== class Guest_Members #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :character_name # 歩行グラフィック ファイル名 attr_reader :character_index # 歩行グラフィック インデックス #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(file_name, index) @character_name = file_name @character_index = index end end #============================================================================== # ■ Spriteset_Map #------------------------------------------------------------------------------ #  マップ画面のスプライトやタイルマップなどをまとめたクラスです。このクラスは # Scene_Map クラスの内部で使用されます。 #============================================================================== class Spriteset_Map #-------------------------------------------------------------------------- # ● キャラクタースプライトの作成 #-------------------------------------------------------------------------- def create_characters @character_sprites = [] for i in $game_map.events.keys.sort sprite = Sprite_Character.new(@viewport1, $game_map.events[i]) @character_sprites.push(sprite) end for vehicle in $game_map.vehicles sprite = Sprite_Character.new(@viewport1, vehicle) @character_sprites.push(sprite) end create_follow_members ### 追加部分 @character_sprites.push(Sprite_Character.new(@viewport1, $game_player)) end #-------------------------------------------------------------------------- # ○ キャラクタースプライトの作成 #-------------------------------------------------------------------------- def create_follow_members for members in $game_party.follow_member.reverse sprite = Sprite_Character.new(@viewport1, members) @character_sprites.push(sprite) members.transparent = true if $game_player.in_vehicle? end end end #============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、 # Game_Troop クラス、Game_Event クラスの内部で使用されます。 #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ◎ イベントのセットアップ # list : 実行内容 # event_id : イベント ID #-------------------------------------------------------------------------- alias tig_pmf_clear clear def clear tig_pmf_clear @this_event = -1 end #-------------------------------------------------------------------------- # ◎ ステートの変更 #-------------------------------------------------------------------------- alias tig_pmf_command_313 command_313 def command_313 tig_pmf_command_313 $game_party.character_graphic_refresh return true end #-------------------------------------------------------------------------- # ◎ アクターのグラフィック変更 #-------------------------------------------------------------------------- alias tig_pmf_command_322 command_322 def command_322 tig_pmf_command_322 $game_party.character_graphic_refresh return true end #-------------------------------------------------------------------------- # ◎ 全回復 #-------------------------------------------------------------------------- alias tig_pmf_command_314 command_314 def command_314 tig_pmf_command_314 $game_party.character_graphic_refresh return true end #-------------------------------------------------------------------------- # ● キャラクターの取得 #-------------------------------------------------------------------------- def get_character(param) case param when -1 # プレイヤー return $game_player when 0 # このイベント case @this_event when -1 events = $game_map.events return events == nil ? nil : events[@event_id] when 0 return $game_player else return $game_party.follow_member[@this_event-1] end else # 特定のイベント events = $game_map.events return events == nil ? nil : events[param] end end #-------------------------------------------------------------------------- # ○ 「このイベント」の対象変更 #-------------------------------------------------------------------------- def change_this_event(number) @this_event = number end #-------------------------------------------------------------------------- # ○ 追従キャラクターの表示 #-------------------------------------------------------------------------- def follow_member_on $game_player.follow_hide = false $game_party.follow_member.each {|i|i.follow_hide = false} end #-------------------------------------------------------------------------- # ○ 追従キャラクターの非表示 #-------------------------------------------------------------------------- def follow_member_off(n = nil) if n == nil $game_player.follow_hide = false $game_party.follow_member.each {|i|i.follow_hide = true} else case n when 0 $game_player.follow_hide = true $game_party.follow_member.each {|i|i.follow_hide = true} when 1 $game_player.follow_hide = false $game_party.follow_member.each {|i|i.follow_hide = true} else $game_player.follow_hide = false $game_party.follow_member.each{|i|i.follow_hide = true} for i in 0..(n-2) $game_party.follow_member[i].follow_hide = false end end end end #-------------------------------------------------------------------------- # ○ ゲストキャラクターをパーティーに加入させる #-------------------------------------------------------------------------- def add_guest_member(file_name, index) $game_party.add_guest_member(file_name, index) end #-------------------------------------------------------------------------- # ○ ゲストキャラクターをパーティーから外す #-------------------------------------------------------------------------- def remove_guest_member(file_name, index) $game_party.remove_guest_member(file_name, index) end #-------------------------------------------------------------------------- # ○ ゲストキャラクターをクリアする #-------------------------------------------------------------------------- def clear_guest_member $game_party.clear_guest_member end #-------------------------------------------------------------------------- # ○ ゲストキャラクターとパーティーメンバーの並びを逆転する #-------------------------------------------------------------------------- #  引数を省略した場合、並びが逆転。 # true 指定でゲストが先頭、false 指定でゲストが後ろ。 #-------------------------------------------------------------------------- def change_guest_member_order(order = nil) $game_party.change_guest_member_order(order) end #-------------------------------------------------------------------------- # ○ 追従メンバーを集合させる #-------------------------------------------------------------------------- def follow_member_gathering $game_player.follow_member_gathering = true end end