# ============================================================================= # TheoAllen - Message Ballon # Version : 1.0 # Contact : www.rpgmakerid.com (or) http://theolized.blogspot.com # (This script documentation is written in informal indonesian language) # ============================================================================= ($imported ||= {})[:Theo_MessageBallon] = true # ============================================================================= # CHANGE LOGS: # ----------------------------------------------------------------------------- # 2013.09.05 - Finished script # ============================================================================= =begin ------------------------------------------------------------------------ Perkenalan : ------------------------------------------------------------------------ Script ini ngebikin kamu nampilin dialog dalam ballon diatas karakter ------------------------------------------------------------------------ Cara penggunaan : ------------------------------------------------------------------------ Pasang dibawah material namun diatas main. Masukkan gambar untuk ballon pointer di Graphics/system. Dan jangan lupa dinamain "ballonpointer". Edit konfigurasinya dan ikuti aturan script call berikut ------------------------------------------------------------------------ Script Calls : ------------------------------------------------------------------------ - message.ballon Panggil script call seperti ini untuk membuat text ditampilkan dalam model ballon - message.normal Panggil script call seperti ini untuk mengembalikan message seperti biasa - message.subject = angka Panggil script call seperti ini untuk menentukan subject yang berbicara. Angka disana adalah event ID. Jika kamu memasukkan 0, maka yang akan berbicara adalah player. Jika event ID tidak ada, maka message akan berubah seperti biasa ------------------------------------------------------------------------ Terms of use : ------------------------------------------------------------------------ Credit gw, TheoAllen. Kalo semisal u bisa ngedit2 script gw trus jadi lebih keren, terserah. Ane bebasin. Asal ngga ngeklaim aja. Kalo semisal mau dipake buat komersil, jangan lupa, gw dibagi gratisannya. =end # ============================================================================= # Konfigurasi # ============================================================================= module THEO module Msg Buffer_Y = 32 # Jarak keatas message ballon (default: 32) FontSize = 22 # Ukuran font dalam ballon BackColor1 = Color.new(100,100,100,150) # Background Color atas untuk ballon. Harus diisi dengan : # Color.new(red,green,blue,alpha) BackColor2 = Color.new(0,0,0,150) # Background Color bawah untuk ballon. Harus diisi dengan : # Color.new(red,green,blue,alpha) BorderColor = Color.new(0,0,0,255) # Border Color untuk ballon. Harus diisi dengan : # Color.new(red,green,blue,alpha) BorderSize = 2 # Ketebalan border end end # ============================================================================= # Akhir dari konfigurasi # ============================================================================= class Bitmap def border_fill(color,size = 1) fill_rect(0,0,width,size,color) fill_rect(0,0,size,height,color) fill_rect(width-size,0,size,height,color) fill_rect(0,height-size,width,size,color) end end class Game_Interpreter def message $game_message end end class Game_Message attr_accessor :ballon_refresh attr_accessor :subject attr_reader :type alias theo_msgballon_init initialize def initialize theo_msgballon_init @subject = 0 normal end def ballon @type = :ballon @ballon_refresh = true end def normal @type = :normal @ballon_refresh = true end def ballon? return false unless SceneManager.scene_is?(Scene_Map) @type == :ballon && @subject > -1 && !get_char.nil? end # ------------------------------------------------------- # Destruct escape character for length calculation # ------------------------------------------------------- def convert_escape_characters(text) result = text.to_s.clone result.gsub!(/\\/) { "\e" } result.gsub!(/\e\e/) { "\\" } result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] } result.gsub!(/\eN\[(\d+)\]/i) { actor_name($1.to_i) } result.gsub!(/\eP\[(\d+)\]/i) { party_member_name($1.to_i) } result.gsub!(/\eG/i) { Vocab::currency_unit } result.gsub!(/\eC\[(\d+)\]/i) { "" } # Destroy change color code result.gsub!(/\eI\[(\d+)\]/i) { " " } # Destroy draw icon result end def actor_name(n) actor = n >= 1 ? $game_actors[n] : nil actor ? actor.name : "" end def party_member_name(n) actor = n >= 1 ? $game_party.members[n - 1] : nil actor ? actor.name : "" end def longest_text test = Bitmap.new(1,1) test.font.size = THEO::Msg::FontSize txts = [] @texts.each do |txt| txts.push(convert_escape_characters(txt)) end longest = txts.sort do |a,b| test.text_size(b).width <=> test.text_size(a).width end[0] result = test.text_size(longest).width test.dispose return result end def get_char if @subject == 0 player = $game_player return Point.new(player.screen_x, player.screen_y) else event = $game_map.events[@subject] return nil unless event return Point.new(event.screen_x, event.screen_y) end end def total_text @texts.size end end class Point attr_accessor :x attr_accessor :y def initialize(x,y) @x, @y = x, y end end class BallonPointer < Sprite attr_reader :window attr_reader :pos def initialize(viewport,window) super(viewport) @window = window @pos = :upper self.bitmap = Cache.system("ballonpointer") to_center update end def pos=(pos) @pos = pos update_placement end def to_center self.ox = width/2 self.oy = height end def update super if window.ballon? self.visible = window.open? update_placement else self.visible = false end end def update_placement self.x = window.char.x if pos == :upper self.y = window.char.y - THEO::Msg::Buffer_Y - 2 self.angle = 0 else self.angle = 180 self.y = window.char.y end end end class Window_Message < Window_Base alias theo_msgballon_init initialize def initialize theo_msgballon_init @pointer = BallonPointer.new(viewport,self) end alias theo_msgballon_clear_instances clear_instance_variables def clear_instance_variables theo_msgballon_clear_instances @ballon = false @subject = -1 end alias theo_msgballon_settings_changed? settings_changed? def settings_changed? theo_msgballon_settings_changed? || ballon_setting_changed? end def ballon_setting_changed? @ballon != ballon? || @subject != $game_message.subject end def setup_window if ballon? setup_ballon else setup_normal end end def setup_normal h = fitting_height(visible_line_number) w = Graphics.width self.width = w self.height = h end def setup_ballon h = fitting_height($game_message.total_text) + 2 w = $game_message.longest_text + 10 + (standard_padding * 2) self.width = w self.height = h self.opacity = 0 end def ballon? $game_message.ballon? end alias theo_msgballon_update_bg update_background def update_background recreate_choice if @ballon != ballon? @ballon = ballon? @subject = $game_message.subject theo_msgballon_update_bg end alias theo_msgballon_normal_placement update_placement def update_placement setup_window theo_msgballon_normal_placement if ballon? update_ballon_placement else self.x = 0 end end def char $game_message.get_char end def update_ballon_placement xpos = [[char.x - width/2, - standard_padding].max, Graphics.width - width + standard_padding].min ypos = char.y - height - THEO::Msg::Buffer_Y @pointer.pos = :upper if ypos < 0 ypos = char.y - 2 @pointer.pos = :lower end self.x = xpos self.y = ypos end alias theo_msgballon_new_page new_page def new_page(text, pos) if ballon? return ballon_new_page(text, pos) end theo_msgballon_new_page(text, pos) end def ballon_new_page(text, pos) setup_ballon update_ballon_placement contents.clear entire_fill reset_font_settings pos[:x] = new_line_x pos[:y] = 0 pos[:new_x] = new_line_x pos[:height] = calc_line_height(text) clear_flags end alias theo_ballon_new_line_x new_line_x def new_line_x if ballon? return 4 else theo_ballon_new_line_x end end alias theo_msgballon_update update def update theo_msgballon_update @pointer.update update_ballon_placement if ballon? && !@opening && !@closing recreate_choice if $game_message.ballon_refresh end def recreate_choice @choice_window.dispose @choice_window = Window_ChoiceList.new(self) $game_message.ballon_refresh = false end def entire_fill contents.gradient_fill_rect(contents.rect,THEO::Msg::BackColor1, THEO::Msg::BackColor2,true) contents.border_fill(THEO::Msg::BorderColor,THEO::Msg::BorderSize) end alias theo_msgballon_width= width= def width=(width) self.theo_msgballon_width = width create_contents end alias theo_msgballon_height= height= def height=(height) self.theo_msgballon_height = height create_contents end alias theo_msgballon_line_height line_height def line_height if ballon? THEO::Msg::FontSize else theo_msgballon_line_height end end alias theo_msgballon_reset_font reset_font_settings def reset_font_settings theo_msgballon_reset_font contents.font.size = THEO::Msg::FontSize if ballon? end # ---------------------------------------------------------------- # Overwrite input pause ~ # ---------------------------------------------------------------- def input_pause self.pause = true unless ballon? wait(10) Fiber.yield until Input.trigger?(:B) || Input.trigger?(:C) Input.update self.pause = false unless ballon? end end class Window_ChoiceList < Window_Command alias theo_msgballon_start start def start reset_window theo_msgballon_start end def reset_window self.opacity = 255 end def setup_ballon self.opacity = 0 entire_fill end def entire_fill dispose_background @back_bitmap = Bitmap.new(contents.width,contents.height) @back_sprite = Sprite.new(viewport) @back_sprite.bitmap = @back_bitmap @back_sprite.x = x + standard_padding @back_sprite.y = y + standard_padding bmp = @back_sprite.bitmap bmp.gradient_fill_rect(contents.rect,THEO::Msg::BackColor1, THEO::Msg::BackColor2,true) bmp.border_fill(THEO::Msg::BorderColor,THEO::Msg::BorderSize) @back_sprite.visible = false end alias theo_msgballon_reset_font reset_font_settings def reset_font_settings theo_msgballon_reset_font contents.font.size = THEO::Msg::FontSize if @message_window.ballon? end alias theo_msgballon_draw_all draw_all_items def draw_all_items setup_ballon if @message_window.ballon? theo_msgballon_draw_all end alias theo_msgballon_update_placement update_placement def update_placement theo_msgballon_update_placement if @message_window.ballon? update_ballon_placement end end def update_ballon_placement msg = @message_window self.y = msg.y self.x = msg.x + msg.width - standard_padding * 2 if (x + width) > Graphics.width self.x = msg.x - width + standard_padding * 2 end end alias theo_msgballon_line_height line_height def line_height if @message_window.ballon? THEO::Msg::FontSize else theo_msgballon_line_height end end def dispose_background @back_bitmap.dispose if @back_bitmap @back_sprite.dispose if @back_sprite end alias theo_msgballon_close close def close dispose_background theo_msgballon_close end alias theo_msgballon_update update def update theo_msgballon_update @back_sprite.visible = open? if @back_sprite && !@back_sprite.disposed? end end