module Lune_Message
#=======================================================
# Lune Message System
# Autor: Raizen
# Compativel com: RMVXAce
# Comunidade: Centrorpg.com
# O script permite mensagens acima de eventos,
# fazendo um modo mais interativo de mensagens entre
# npcs e personagens.
# Informações: Versão Atual 1.2
# O script pode substituir as versões antigas que não afetará
# negativamente em nada no jogo.
#Atualização 1.1 => Adicionado setas para indicar o evento que está falando.
#Atualização 1.2 => Correção no dispose da imagem, e adicionado
#Atualização 1.3 => Sistema de mensagens da batalha colocada para padrão.
# a função de utilizar o modo antigo de mensagens.
# Instruções
# Para utilizar a mensagem basta chamar o comando basico
# de mostrar mensagem, podendo conter ou não uma face.
# antes do mostrar mensagem configure o evento que quer
# que apareça a mensagem, e a posição(acima ou abaixo) do evento.
# Também é possivel escolher pontos diferentes de mensagens sem se
# basear em eventos.
# Para configurar a posição da mensagem faça o seguinte.
# Chamar Script:Lune_Message.config(p, id)
# Sendo o p a posição que pode ser
# 1 = acima do personagem
# 0 = abaixo do personagem
# 2 = estilo de mensagens antiga
# Ou seja para desativar o script de mensagens e usar do modo antigo
# basta chamar script desse modo.
# Chamar Script:Lune_Message.config(2, 0)
# Coloque um Esperar 1 frame antes de mostrar a mensagem no modo antigo,
# para ser possível dar tempo de reconfigurar todas as posições antigas.
# ID sendo o ID do evento, e 0 o ID do personagem.
# Para o Herói coloque o valor 0.
# Espacamento é a correção do tamanho da janela, ajuste
# o valor para melhor ajustar a sua fonte.
Espacamento = 23
# Tamanho dos personagens(em pixels) que aparecerá as mensagens, para efeito
# de correção
Tamanho = 48
# Nome do arquivo que servirá de cursor para indicar o personagem que
# está falando.
# Caso não queira arquivo algum para indicar, basta colocar desse modo.
# Imagem = ""
# A imagem deve estar na pasta Graphics/System dentro da pasta do seu projeto.
Imagem = ""
# ========================================================================
# Aqui começa o script modifique caso saiba o que está fazendo.
# ========================================================================
def self.config(p, id)
posicao(p)
identificacao(id)
end
def self.posicao(p = nil)
@p = p unless p == nil
return @p
end
def self.identificacao(id = nil)
@id = id unless id == nil
return @id
end
end
#==============================================================================
# ** Janela auxiliar
#==============================================================================
class Lune_Window_Message < Window_Base
include Lune_Message
def initialize(x, y, window_width, window_height)
super(x, y, window_width, window_height)
self.z = 199
self.openness = 0
@get_sprite = true
@sprite_arrow = Sprite.new
@sprite_arrow.bitmap = Cache.system(Imagem)
if Lune_Message.identificacao == 0
@lune_x = $game_player.screen_x
@lune_y = $game_player.screen_y
else
@lune_x = $game_map.events[Lune_Message.identificacao].screen_x
@lune_y = $game_map.events[Lune_Message.identificacao].screen_y
end
@sprite_arrow.x = @lune_x - 8
@sprite_arrow.y = @lune_y - Lune_Message::Tamanho
end
def refresh
if @get_sprite == true
@sprite_arrow.y += 4
@get_sprite = false
else
@sprite_arrow.y -= 4
@get_sprite = true
end
end
def openlune
self.openness += 40
self.openness <= 254 ? (return false) : (return true)
end
def closelune
@sprite_arrow.opacity = 0 unless Imagem.nil?
self.openness -= 40
self.openness >= 1 ? (return false) : (return true)
end
def dispose
@sprite_arrow.dispose
super
end
end
class Game_Message
# Retorna o valor da quantidade de linhas
def get_lune_lines
@lune_text_size = 0
@texts.inject("") {|r, text| @lune_text_size += 1}
return @lune_text_size
end
# Retorna o valor do tamanho do texto.
def get_lune_length
@lune_length_size = 0
@biggest = 0
@texts.inject("") {|r, text|
if text.size > @lune_length_size
@lune_length_size = text.size
@biggest = text.dup
@biggest.delete! "\."
@biggest.delete! "\!"
@biggest.delete! "\c["
@biggest.delete! "]"
@biggest.delete! "["
p @biggest
end
}
return @biggest
end
end
#==============================================================================
# ** Window_Message
#------------------------------------------------------------------------------
# Esta janela de mensagem é usada para exibir textos.
#==============================================================================
#--------------------------------------------------------------------------
# * Aquisição da largura da janela
#--------------------------------------------------------------------------
class Window_Message < Window_Base
# aliasing
alias lune_message_update update
alias lune_process_all_text process_all_text
alias lune_message_dispose dispose
alias lune_input_choice input_choice
def initialize
super(0, 0, Graphics.width, fitting_height(4))
self.z = 200
self.openness = 0
create_all_windows
create_back_bitmap
create_back_sprite
clear_instance_variables
end
def window_width
text_size($game_message.get_lune_length).width + Lune_Message::Espacamento
end
#--------------------------------------------------------------------------
# * Aquisição da altura da janela
#--------------------------------------------------------------------------
def window_height
fitting_height($game_message.get_lune_lines)
end
def update(*args)
lune_message_update(*args)
unless Lune_Message.posicao == 2
@lune_message.refresh if @lune_message and Graphics.frame_count % 25 == 1
self.opacity = 0
end
end
def fiber_main
$game_message.visible = true
update_background
lune_update_placement if Lune_Message.posicao == 2
loop do
if Lune_Message.posicao == 2
lune_process_all_text if $game_message.has_text?
else
process_all_text if $game_message.has_text?
end
process_input
$game_message.clear
@gold_window.close
Fiber.yield
break unless text_continue?
end
@lune_message.opacity = 0 unless @lune_message == nil and Lune_Message.posicao == 2
close_and_wait
$game_message.visible = false
@fiber = nil
end
def lune_update_placement
@position = $game_message.position
self.y = @position * (Graphics.height - height) / 2
self.x = 0
@gold_window.y = y > 0 ? 0 : Graphics.height - @gold_window.height
end
def update_placement
@gold_window.y = y > 0 ? 0 : Graphics.height - @gold_window.height
unless Lune_Message.identificacao.nil?
self.x = @lune_x - window_width / 2
self.x -= (self.x + window_width - Graphics.width) if self.x + window_width >= Graphics.width
self.x -= new_line_x
self.x = [self.x,0].max
self.y = @lune_y
self.y -= window_height + Lune_Message::Tamanho if Lune_Message.posicao == 1
self.y = [self.y,0].max
self.y -= (self.y + window_height - Graphics.height) if self.y + window_height >= Graphics.height
end
end
#--------------------------------------------------------------------------
# * Execução de todos texto
#--------------------------------------------------------------------------
def process_all_text
if Lune_Message.identificacao == 0
@lune_x = $game_player.screen_x
@lune_y = $game_player.screen_y
else
@lune_x = $game_map.events[Lune_Message.identificacao].screen_x
@lune_y = $game_map.events[Lune_Message.identificacao].screen_y
end
@lune_message.dispose unless @lune_message.nil?
w = @lune_x - window_width / 2
h = @lune_y
$game_message.face_name.empty? ? (w = [w,0].max) : (w = [w,112].max)
h -= window_height + Lune_Message::Tamanho if Lune_Message.posicao == 1
h = [h,0].max
w -= (w + window_width - Graphics.width) if w + window_width >= Graphics.width
h -= (h + window_height - Graphics.height) if h + window_height >= Graphics.height
@lune_message = Lune_Window_Message.new(w, h, window_width, window_height)
@lune_face = Window_Base.new(w - 104, h + 8, 104, 104) unless $game_message.face_name.empty?
update_placement
text = convert_escape_characters($game_message.all_text)
pos = {}
new_page(text, pos)
open_and_wait
process_character(text.slice!(0, 1), text, pos) until text.empty?
end
#--------------------------------------------------------------------------
# * Abertura da janela e espeta até abertura total
#--------------------------------------------------------------------------
def open_and_wait
unless Lune_Message.posicao == 2
@lune_message.openlune
Fiber.yield until @lune_message.openlune
open
else
open
Fiber.yield until open?
end
end
#--------------------------------------------------------------------------
# * Fechamento da janela e espeta até fechamento total
#--------------------------------------------------------------------------
def close_and_wait
close
Fiber.yield until all_close?
@lune_message.closelune if @lune_message
Fiber.yield until @lune_message.closelune unless Lune_Message.posicao == 2
end
#--------------------------------------------------------------------------
# * Execução de espera de entrada
#--------------------------------------------------------------------------
def input_pause
self.pause = true if Lune_Message.posicao == 2
wait(10)
Fiber.yield until Input.trigger?(:B) || Input.trigger?(:C)
Input.update
@lune_face.dispose unless @lune_face.nil?
self.pause = false
end
def dispose
@lune_message.dispose if @lune_message
Lune_Message.config(2,0)
lune_message_dispose
end
#--------------------------------------------------------------------------
# * Execução de entrada de escolhas
#--------------------------------------------------------------------------
def input_choice
lune_input_choice
@lune_face.dispose unless @lune_face.nil?
end
end
해당 스크립트는 Lune Message System 으로 말풍선 대화를 지원해주는데요.
특수문자까지 글자수를 인식해서 말풍선이 지나치게 크게 나오더라구요.
이 부분을 수정해주실 수 있는 분 없나요..ㅠㅠ