Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # =============================================================================
- # TheoAllen - Message Ballon
- # Version : 1.1
- # 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.10.29 - Fixed unable to save bug
- # 2013.10.25 - Add <bm: id> as ballon setup
- # - Unused escape char now do not count as window size
- # 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
- # -------------------------------------------------------------------------
- # [Hard mode / Scripter only]
- # Note : Konfigurasi ini cuman untuk scripter. Kalo kamu ngga paham, mending
- # jangan diubah-ubah isinya
- # -------------------------------------------------------------------------
- # Dibawah sini adalah regular expression buat kode2 yang ngga digunain buat
- # perhitungan lebar window. Seperti kode wait dan semacemnya. Bagi kamu yang
- # mau ngedit, setidaknya kamu harus ngerti REGEXP dalam bahasa Ruby.
- # -------------------------------------------------------------------------
- Unused_EscapeChar = [
- /\eC\[(\d+)\]/i, # Change text color \C[n]
- /\e\./, # Wait for 1/4 second \.
- /\e\|/, # Wait for 1 second \|
- /\e\{/, # Make font bigger \{
- /\e\}/, # Make font smaller \{
- /\e\$/, # Show gold window \$
- /\e!/, # Wait for input \!
- /\e>/, # Display remaining text at line \>
- /\e</, # Cancel display remaining text \<
- /\e\^/, # Do not wait for input \^
- ] # <-- jangan dihapus
- 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_Temp
- def window_base
- unless @window_base
- @window_base = Window_Base.new(0,0,1,1)
- @window_base.visible = false
- end
- return @window_base
- 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 = $game_temp.window_base.convert_escape_characters(text)
- THEO::Msg::Unused_EscapeChar.each do |esc_code|
- result.gsub!(esc_code) {""}
- end
- result.gsub!(/\eI\[(\d+)\]/i) { " " }
- 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
- alias theo_msgballon_add add
- def add(text)
- text = text.gsub(/<bm:[ ]*(\d+)>/i) do
- @subject = $1.to_i
- ""
- end
- theo_msgballon_add(text)
- 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.opacity = window.openness
- update_placement
- else
- self.opacity = 0
- 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)
- 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
- 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?
- 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)
- 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
- end
Advertisement
Add Comment
Please, Sign In to add comment