#============================================================================== # セリフウィンドウ ver1.03 #------------------------------------------------------------------------------ #[特徴] # メッセージウィンドウをイベントの傍に表示します。 # イベントの位置を常に確認するので、 # セリフを表示しているイベントが移動しても追尾します。 # #[使用方法] # 文章中に \EV[event_id] と記述します。 # # \EV[1] と書くと、イベントID:1の頭上にウィンドウを表示します。 # \EV[0] と書くと、プレイヤーの頭上にウィンドウを表示します。 # \EV と書くと、実行中のイベントの頭上にウィンドウを表示します。 # # また、\EV[-1] と、数値をマイナスにすると、 # アクターID:1の頭上にウィンドウを表示します。 # IDの走査は、プレイヤー(パーティの先頭アクター)とフォロワーをチェックします。 # 戦闘パーティ内にそのIDのアクターがいなかった場合はエラーが出るので、 # その点はご注意ください。 # # 作成:ぶちょー # ホム:http://nyannyannyan.bake-neko.net/ # 著作:自分で作ったとか言わないで>< # 改造はご自由にどうぞ。 # リードミーとかに私の名前の載せたりするのは任意で。 #============================================================================== #============================================================================== # バージョンアップ情報 # ver1.03 細かな不具合を修正 # ver1.02 \EVで実行中のイベントの頭上にウィンドウを表示できるように # ver1.01 \EV[0]でプレイヤーの頭上にウィンドウを表示できるように # ver1.00 公開 #============================================================================== #============================================================================== # 設定項目 #============================================================================== module Kazari module WordsWindow # 名前の表示判定 # 0 : 名前を表示する # 1 : プレイキャラの名前だけ表示する # 2 : 名前は表示しない NAME_VISIBLE = 0 # ウィンドウの背景色 BGCOLOR = Color.new(0, 0, 0, 80) end end $kzr_imported = {} if $kzr_imported == nil $kzr_imported["WordsWindow"] = true #============================================================================== # ■ Window_Message #============================================================================== class Window_Message < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias kzr_words_window_initialize initialize def initialize kzr_words_window_initialize @event = nil @name = Sprite.new @name.bitmap = Bitmap.new(100, 16) @name.bitmap.font.size = 16 @name.z = self.z + 1 @name_flag = false end #-------------------------------------------------------------------------- # ● 全ウィンドウの解放 #-------------------------------------------------------------------------- alias kzr_wors_window_dispose_all_windows dispose_all_windows def dispose_all_windows kzr_wors_window_dispose_all_windows @name.dispose end #-------------------------------------------------------------------------- # ● 全ウィンドウの更新 #-------------------------------------------------------------------------- alias kzr_words_window_update_all_windows update_all_windows def update_all_windows kzr_words_window_update_all_windows update_words_window end #-------------------------------------------------------------------------- # ● セリフウィンドウの更新 #-------------------------------------------------------------------------- def update_words_window if @event != nil self.x = [[@event.screen_x - self.width / 2, 0].max, Graphics.width - self.width].min self.y = [[@event.screen_y - 32 - self.height, 4].max, Graphics.height - self.height].min @name.x, @name.y = self.x + 12, self.y - 4 end @name.visible = (@event != nil) && self.openness == 255 && @name_flag end #-------------------------------------------------------------------------- # ● 全テキストの処理 #-------------------------------------------------------------------------- alias kzr_words_window_process_all_text process_all_text def process_all_text if event_id = message_is_a_words width = 0 for text in $game_message.texts.clone t = convert_escape_characters(text) width = [width, contents.text_size(t).width].max end self.opacity = 0 self.width = width + 24 + new_line_x if $game_message.face_name.empty? self.height = $game_message.texts.size * line_height + 24 else self.height = window_height end if event_id < 0 @name_flag = Kazari::WordsWindow::NAME_VISIBLE < 2 if $game_party.leader.id == -event_id @event = $game_player else $game_player.followers.each do |follower| @event = follower if follower.actor.id == -event_id end end elsif event_id == 0 @name_flag = Kazari::WordsWindow::NAME_VISIBLE < 2 @event = $game_player else @name_flag = Kazari::WordsWindow::NAME_VISIBLE < 1 @event = $game_map.events[event_id] end @name.bitmap.clear name = @event.name w = @name.bitmap.text_size(name).width + 5 @name.bitmap.fill_rect(0, 0, w, 16, Kazari::WordsWindow::BGCOLOR) @name.bitmap.draw_text(2, 0, 96, 16, name) update_words_window @name.visible = false else self.x = 0 self.width = window_width self.height = window_height update_background update_placement @event = nil end create_contents kzr_words_window_process_all_text end #-------------------------------------------------------------------------- # ● セリフかどうかの判定 #-------------------------------------------------------------------------- def message_is_a_words event_id = false text = $game_message.texts[0].clone if /\\EV\[(-)?(\d+)\]/i =~ text event_id = $1 ? $2.to_i * (-1) : $2.to_i elsif /\\EV/i =~ text event_id = $game_map.interpreter.event_id end event_id end #-------------------------------------------------------------------------- # ● 制御文字の事前変換 #-------------------------------------------------------------------------- def convert_escape_characters(text) result = super(text) result.gsub!(/\eEV\[(-)?(\d+)\]/i) {} result.gsub!(/\eEV/i) {} result end #-------------------------------------------------------------------------- # ● 顔グラフィックの描画 #-------------------------------------------------------------------------- def draw_face(face_name, face_index, x, y) contents.fill_rect(contents.rect, Kazari::WordsWindow::BGCOLOR) if @event != nil super(face_name, face_index, x, y) end #-------------------------------------------------------------------------- # ● 改行位置の取得 #-------------------------------------------------------------------------- alias kzr_words_window_new_line_x new_line_x def new_line_x @event ? ($game_message.face_name.empty? ? 0 : 100) : kzr_words_window_new_line_x end #-------------------------------------------------------------------------- # ● ウィンドウを閉じ、完全に閉じるまで待つ #-------------------------------------------------------------------------- alias kzr__words_window_close_and_wait close_and_wait def close_and_wait @event = nil kzr__words_window_close_and_wait end end #============================================================================== # ■ Game_Player #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ● 先頭メンバーの名前 #-------------------------------------------------------------------------- def name $game_party.members.empty? ? "" : $game_party.leader.name end end #============================================================================== # ■ Game_Follower #============================================================================== class Game_Follower < Game_Character #-------------------------------------------------------------------------- # ● 対応するアクターの名前 #-------------------------------------------------------------------------- def name actor.name end end #============================================================================== # ■ Game_Event #============================================================================== class Game_Event < Game_Character #-------------------------------------------------------------------------- # ● イベント名 #-------------------------------------------------------------------------- def name @event.name end end