Advertisement
Raizen

Untitled

Mar 27th, 2014
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 42.42 KB | None | 0 0
  1. #==============================================================================
  2. # VMB ExtraOptions [VX]
  3. #------------------------------------------------------------------------------
  4. # Adiciona algumas configurações extra ao script Vampyr Message Balloon, criado
  5. # por Vampyr.
  6. #------------------------------------------------------------------------------
  7. # Site : http://www.mundorpgmaker.com.br/
  8. # Autor : Kyo Panda
  9. # Versão : 1.1
  10. # Lançado em : 16 de Junho de 2010
  11. # Atualização : 29 de Junho de 2010
  12. #==============================================================================
  13.  
  14. #==============================================================================
  15. # Agradecimentos:
  16. #------------------------------------------------------------------------------
  17. # • Vampyr : Criador do script Vampyr Message Balloon.
  18. # • LORD @.N.D : Por verificar o bug da troca de mensagens.
  19. # • Lady Loren : Pela localização de alguns bugs no Vampyr Message Balloon.
  20. #==============================================================================
  21.  
  22. #==============================================================================
  23. # Funções:
  24. #------------------------------------------------------------------------------
  25. # • Permite à você deixar que a mensagem apareça primariamente sobre o evento
  26. # que a chamou.
  27. # • Restaura a função de exibição de faces nas mensagens.
  28. # • Permite desenhar as pontas das mensagens arredondadas.
  29. # • Permite a troca entra a mensagem em forma de balão e a mensagem padrão do
  30. # RPG Maker VX por switch
  31. # • Corrige a lentidão dada pela velocidade das mensagens.
  32. # • Restaura a opção de escolhas nas mensagens.
  33. # • Restaura as opções de cores padrão das mensagens.
  34. # • Adiciona a opção de adicionar windowskin nas mensagens.
  35. # • Restaura a sombra de textos das mensagens.
  36. # • Corrigido a função de troca de mensagem normal para balão por switch.
  37. #==============================================================================
  38.  
  39. #==============================================================================
  40. # Como usar:
  41. #------------------------------------------------------------------------------
  42. #
  43. # #--------------------------------------------------------------------------
  44. # # Instalação
  45. # #--------------------------------------------------------------------------
  46. #
  47. # • Cole esse script abaixo do script "Vampyr Message Balloon" e acima do
  48. # "▼ Principal" no Editor de Scripts do RPG Maker VX.
  49. #
  50. # • Configure esse script no guia "Configuração" logo abaixo se desejado.
  51. #
  52. #==============================================================================
  53.  
  54. #==============================================================================
  55. # Histórico de versões:
  56. #------------------------------------------------------------------------------
  57. # • Versão 1.1: 29 de Junho de 2010:
  58. # * Corrigido a função de troca de mensagem normal para balão por switch.
  59. # • Versão 1.0: 16 de Junho de 2010:
  60. # * Primeira versão do script.
  61. # * Permite à você deixar que a mensagem apareça primariamente sobre o
  62. # evento que a chamou.
  63. # * Restaura a função de exibição de faces nas mensagens.
  64. # * Permite desenhar as pontas das mensagens arredondadas.
  65. # * Permite a troca entra a mensagem em forma de balão e a mensagem padrão
  66. # do RPG Maker VX por switch
  67. # * Corrige a lentidão dada pela velocidade das mensagens.
  68. # * Restaura a opção de escolhas nas mensagens.
  69. # * Restaura as opções de cores padrão das mensagens.
  70. # * Adiciona a opção de adicionar windowskin nas mensagens.
  71. # * Restaura a sombra de textos das mensagens.
  72. #==============================================================================
  73.  
  74. #==============================================================================
  75. # VMB_ExtraOptions
  76. #------------------------------------------------------------------------------
  77. # Módulo que armazena configurações extra para o script Vampyr Message Ballon.
  78. #==============================================================================
  79.  
  80. module VMB_ExtraOptions
  81. #--------------------------------------------------------------------------
  82. # Configuração
  83. #--------------------------------------------------------------------------
  84.  
  85. # Defina aqui se a mensagem deve estar posicionada, primáriamente, sobre
  86. # o evento que a chamou, ao invés de estar acima do personagem.
  87. # Isso agiliza a criação de eventos que simplesmente exibem uma mensagem
  88. # simples quando acionados.
  89. # Caso definido que sim, para exibir a mensagem acima do personagem, apenas
  90. # defina o comando de mensgem \EV[X] como 0.
  91. # Defina true para sim e false para não.
  92. ON_EVENT_CALLER = true
  93.  
  94. # Defina aqui se deseja que faces sejam exibidas nas mensagens.
  95. # Defina true para sim e false para não.
  96. SHOW_MESSAGE_FACES = true
  97.  
  98. # Tamanho do raio da ponta da mensagem, se desejar usar mensagens
  99. # com pontas arredondadas.
  100. # Defina como 0, se desejar utilizar as pontas padrões
  101. ROUND_RADIUS = 10
  102.  
  103. # Defina aqui a switch que ativará e desativará o recurso de mensagem em
  104. # balão. Quando ligado: Mensagem Normal, quando desligado: Balão.
  105. # Defina como 0 para não utilizar esta função.
  106. BALLOON_SWITCH = 1
  107.  
  108. # Primariamente, quando você vai definir uma nova mensagem, seu
  109. # posicionamento padrão é abaixo, o que fica estranho quando utilizado
  110. # com o VMB. Logo, ative esta opção para que, quando a mensagem for
  111. # definida para exibir abaixo, exiba-a acima, e vice-versa.
  112. # Como a ON_EVENT_CALLER, esta opção agiliza a criação de eventos
  113. # Defina true para sim e false para não.
  114. FLIP_UP_DOWN = true
  115.  
  116. # Defina aqui se deseja utilizar uma Windowskin no lugar do balão padrão.
  117. # Se optar por utilizar a Windowskin, tanto o balão quanto a sua ponta se
  118. # tornarão invisível. Mas, há como você definir setas em forma de imagens.
  119. # Veja abaixo, como fazer isso.
  120. # Defina true para usar e false para não usar.
  121. USE_WINDOWSKIN = false
  122.  
  123. # Para definir uma seta em forma de imagem, apenas defina aqui o prefixo
  124. # da imagem que você deseja, e após isso adicione as imagens à pasta
  125. # Graphics/Pictures do seu projeto com o mesmo prefixo da imagem,
  126. # adicionando _Up para acima e _Down para abaixo.
  127. # Por exemplo, se o prefixo for "Message_Point", deverá haver duas imagens
  128. # de ponta na pasta Graphics/Pictures com os seguintes nomes:
  129. # Message_Point_Up : Acima
  130. # Message_Point_Down : Abaixo
  131. # Defina como "" para não utilizar as pontas.
  132. ARROW_PREFIX = "Message_Point"
  133.  
  134. #--------------------------------------------------------------------------
  135. # Fim da configuração
  136. #--------------------------------------------------------------------------
  137. end
  138.  
  139. #==============================================================================
  140. # Game_Interpreter
  141. #------------------------------------------------------------------------------
  142. # Esta classe interpreta os comandos de evento e os transforma no código da
  143. # engine do RPG Maker. As classes Game_Map, Game_Troop, Game_Event são usadas.
  144. #==============================================================================
  145.  
  146. class Game_Interpreter
  147. #--------------------------------------------------------------------------
  148. # Variáveis públicas
  149. #--------------------------------------------------------------------------
  150. attr_reader :event_id
  151. #--------------------------------------------------------------------------
  152. # Alias da inicialização do objeto
  153. #--------------------------------------------------------------------------
  154. alias vmb01_initialize initialize
  155. #--------------------------------------------------------------------------
  156. # Inicialização do objeto
  157. # depth : profundidade
  158. # main : principal
  159. #--------------------------------------------------------------------------
  160. def initialize(depth = 0, main = false)
  161. # Chama o método original
  162. vmb01_initialize(depth, main)
  163. # Define o ID do evento que o executa
  164. @event_id = 0
  165. end
  166. end
  167.  
  168. #==============================================================================
  169. # Ellipse
  170. #------------------------------------------------------------------------------
  171. # Armazena um objeto elíptico.
  172. #==============================================================================
  173.  
  174. class Ellipse
  175. #--------------------------------------------------------------------------
  176. # Variáveis públicas
  177. #--------------------------------------------------------------------------
  178. attr_reader :a # A largura do círculo
  179. attr_reader :b # A altura do círculo
  180. attr_reader :x # O posicionamento horizontal
  181. attr_reader :y # O posicionamento vertical
  182. attr_reader :h # O posicionamento horizontal em sua origem
  183. attr_reader :k # O posicionamento vertical em sua origem
  184. #--------------------------------------------------------------------------
  185. # Inicialização do objeto
  186. # x : o posicionamento horizontal
  187. # y : o posicionamento vertical
  188. # a : a largura do círculo em sua origem do seu lado
  189. # b : a altura do círculo em sua origem. Se nil, é o radius do círculo
  190. #--------------------------------------------------------------------------
  191. def initialize (x, y, a, b = nil)
  192. @x = x
  193. @y = y
  194. @a = a
  195. @b = b.nil? ? a : b
  196. @h = x + a
  197. @k = y + @b
  198. end
  199. #--------------------------------------------------------------------------
  200. # Em conjunto?
  201. # x : a coordenada horizontal sendo testada
  202. # y : a coordenada vertical sendo testada
  203. #--------------------------------------------------------------------------
  204. def within? (x, y)
  205. x_square = ((x - @h)*(x - @h)).to_f / (@a*@a)
  206. y_square = ((y - @k)*(y - @k)).to_f / (@b*@b)
  207. # Se "radius" <= 1, então isso deve estar em conjunto com a ellipse
  208. return (x_square + y_square) <= 1
  209. end
  210. end
  211.  
  212. #==============================================================================
  213. # Bitmap
  214. #------------------------------------------------------------------------------
  215. # Classe que comanda toda e qualquer imagem exibida no jogo.
  216. #------------------------------------------------------------------------------
  217. # Sumário de mudanças:
  218. # - Novos métodos: outiline_ellipse, fill_ellipse e fill_rounded_rect.
  219. #==============================================================================
  220.  
  221. class Bitmap
  222. #--------------------------------------------------------------------------
  223. # Contorno da elipse
  224. # ellipse : a elipse sendo desenhada
  225. # width : a largura da barra
  226. # colour : a cor do contorno
  227. #--------------------------------------------------------------------------
  228. def outline_ellipse (ellipse, colour = font.color, width = 1, steps = 0)
  229. # Para organização, define as variáveis locais a e b para as variáveis de elipse
  230. a, b = ellipse.a, ellipse.b
  231. # Usa a aproximação de Ramanujan para a circunferência da elipse
  232. steps = Math::PI*(3*(a + b) - Math.sqrt((3*a + b)*(a + 3*b))) if steps == 0
  233. radian_modifier = (2*Math::PI) / steps
  234. for i in 0...steps
  235. t = (radian_modifier*i) % (2*Math::PI)
  236. # Expressada parametricamente:
  237. # x = h + acos(t), y = k + bsin(t) : onde t vai de 0 a 2pi
  238. x = (ellipse.h + (a*Math.cos(t)))
  239. y = (ellipse.k + (b*Math.sin(t)))
  240. set_pixel (x, y, colour)
  241. end
  242. # Reforça a linha
  243. if width > 1
  244. ellipse = Ellipse.new (ellipse.x + 1, ellipse.y + 1, ellipse.a - 1, ellipse.b - 1)
  245. outline_ellipse (ellipse, colour, width - 1, steps)
  246. end
  247. end
  248. #--------------------------------------------------------------------------
  249. # Preenche a elipse
  250. # ellipse : a elipse sendo desenhada
  251. # colour : a cor do contorno
  252. #--------------------------------------------------------------------------
  253. def fill_ellipse (ellipse, colour = font.color, steps = 0)
  254. # Para organização, define as variáveis locais a e b para as variáveis de elipse
  255. a, b = ellipse.a, ellipse.b
  256. # Usa a aproximação de Ramanujan para a circunferência da elipse
  257. steps = Math::PI*(3*(a + b) - Math.sqrt((3*a + b)*(a + 3*b))) if steps == 0
  258. radian_modifier = (2*Math::PI) / steps
  259. for i in 0...(steps / 2)
  260. t = (radian_modifier*i) % (2*Math::PI)
  261. # Expressada parametricamente:
  262. # x = h + acos(t), y = k + bsin(t) : onde t vai de 0 a 2pi
  263. x = ellipse.h + (a*Math.cos(t))
  264. y = ellipse.k - (b*Math.sin(t))
  265. fill_rect (x, y, 1, 2*(ellipse.k - y), colour)
  266. end
  267. end
  268. #--------------------------------------------------------------------------
  269. # Preenche retângulo circular
  270. # rect : o retângulo sendo desenhado
  271. # colour : a cor do contorno
  272. # w : o número de pixels para cobrir o círculo
  273. #--------------------------------------------------------------------------
  274. # Usado para preencher retângulos com cantos circulares
  275. #--------------------------------------------------------------------------
  276. def fill_rounded_rect (rect, colour = font.color, w = 8)
  277. # Desenha o corpo do retângulo
  278. fill_rect (rect.x + w, rect.y, rect.width - 2*w, rect.height, colour)
  279. # Desenha o retângulo horizontal
  280. fill_rect (rect.x, rect.y + w, w, rect.height - 2*w, colour)
  281. # Desenha o retângulo vertical
  282. x = rect.x + rect.width - w
  283. fill_rect (x, rect.y + w, w, rect.height - 2*w, colour)
  284. # Faz um círculo
  285. circle = Ellipse.new (0, 0, w)
  286. for i in 0...w
  287. for j in 0...w
  288. # Canto superior esquerdo
  289. set_pixel (rect.x + i, rect.y + j, colour) if circle.within? (i, j)
  290. # Canto superior direito
  291. set_pixel (rect.x + rect.width - w + i, rect.y + j, colour) if circle.within? (i + w, j)
  292. # Canto inferior esquerdo
  293. set_pixel (rect.x + i, rect.y + rect.height - w + j, colour) if circle.within? (i, j + w)
  294. # Canto inferior direito
  295. set_pixel (rect.x + rect.width - w + i, rect.y + rect.height - w + j, colour) if circle.within? (i + w, j + w)
  296. end
  297. end
  298. end
  299. end
  300.  
  301. #==============================================================================
  302. # Window_RectChoice
  303. #------------------------------------------------------------------------------
  304. # Janela que serve de retãngulo de escolha.
  305. #==============================================================================
  306.  
  307. class Window_RectChoice < Window_Selectable
  308. #--------------------------------------------------------------------------
  309. # Variáveis públicas
  310. #--------------------------------------------------------------------------
  311. attr_accessor :item_max # Máximo de items
  312. attr_accessor :index # Posição do cursor
  313. #--------------------------------------------------------------------------
  314. # Inicialização do objeto
  315. # x : alinhamento horizontal da janela
  316. # y : alinhamento vertical da janela
  317. # width : largura da janela
  318. # height : altura da janela
  319. #--------------------------------------------------------------------------
  320. def initialize(x, y, width, height)
  321. # Define os valores da janela
  322. super(x, y, width, height)
  323. # Define a janela como trnasparente
  324. self.opacity = 0
  325. # Define a prioridade da janela
  326. self.z = 2000
  327. # Define o index da janela
  328. self.index = 0
  329. # Define se a janela está ativa ou não
  330. self.active = true
  331. end
  332. #--------------------------------------------------------------------------
  333. # Atualização do cursor
  334. #--------------------------------------------------------------------------
  335. def update_cursor
  336. # Define o cursor da janela
  337. cursor_rect.set(0, 0, contents.width, contents.height)
  338. end
  339. end
  340.  
  341. #==============================================================================
  342. # Sprite_MessageBALLOON
  343. #------------------------------------------------------------------------------
  344. # Sprite que exibe as mensagens em forma de balão.
  345. #------------------------------------------------------------------------------
  346. # Sumário de mudanças:
  347. # * Métodos sobrescritos: open, update e update_message.
  348. # * Alias dos métodos : reset e convert_special_characters.
  349. # * Novos métodos : start_choice, input_choice, terminate_messagem,
  350. # update_cursor e text_color
  351. #==============================================================================
  352.  
  353. class Sprite_MessageBalloon < Sprite
  354. #--------------------------------------------------------------------------
  355. # Inclusão das constantes e métodos do módulo VMB_ExtraOptions
  356. #--------------------------------------------------------------------------
  357. include VMB_ExtraOptions
  358. #--------------------------------------------------------------------------
  359. # Alias da reinicialização da mensagem
  360. #--------------------------------------------------------------------------
  361. alias vmb01_reset reset
  362. #--------------------------------------------------------------------------
  363. # Reinicialização da mensagem
  364. #--------------------------------------------------------------------------
  365. def reset
  366. # Roda o método original
  367. vmb01_reset
  368. # Define o alinhamento vertical do texto
  369. @contents_y = 8
  370. end
  371. #--------------------------------------------------------------------------
  372. # Exibição do ícone
  373. # icon_index : número do ícone
  374. # x : exibe na coordenada X
  375. # y : exibe na coordenada Y
  376. # enabled : um espaço permitido. Fica transparente quando falso
  377. #--------------------------------------------------------------------------
  378. def draw_icon(icon_index, x, y, enabled = true)
  379. bitmap = Cache.system("Iconset")
  380. rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  381. self.bitmap.blt(x, y, bitmap, rect, enabled ? 255 : 128)
  382. end
  383. #--------------------------------------------------------------------------
  384. # Abrir
  385. #--------------------------------------------------------------------------
  386. def open
  387. # Se definir como abrir mensagens acima dos eventos que as chamous
  388. if ON_EVENT_CALLER
  389. # Define o @character como o evento
  390. @character = $game_map.events[$game_map.interpreter.event_id]
  391. # Se não
  392. else
  393. # Define o @character como o personagem
  394. @character = $game_player
  395. end
  396. # Para cada i de 0 ao tamanho do texto à ser exibido
  397. for i in 0...$game_message.texts.size
  398. # Adiciona um espaço se iniciado uma escolha
  399. @text += "  " if i >= $game_message.choice_start
  400. # Clona-se o i referente à string do texto
  401. @text += $game_message.texts[i].clone + "\x00"
  402. end
  403. # Define o @item_max de acordo com a quantidade de escolhas
  404. @item_max = $game_message.choice_max
  405. # Define a largura extra da mensagem pelas escolhas
  406. cw = $game_message.choice_max > 0 ? 16 : 0
  407. # Converte os caracteres especiais
  408. convert_special_characters
  409. # Para cada i do texto, separa-se o texto
  410. for i in @text.split("\x00")
  411. # Para cada texto separado, adquire-se o seu tamanho
  412. @width << @text[i].getw
  413. end
  414. # Define-se a altura do texto
  415. height = $game_message.texts.size * 24 + (24 + 8)
  416. # Se definir utilizar faces nas mensagens, define o valor padrão
  417. if $game_message.face_name.empty?
  418. fw = 0
  419. fh = 0
  420. else
  421. fw = SHOW_MESSAGE_FACES ? 108 : 0
  422. fh = SHOW_MESSAGE_FACES ? 88 : 0
  423. end
  424. # Se não houver face na mensagem, desenha a mensagem normal
  425. # Define uma nova altura de acordo com a face
  426. if SHOW_MESSAGE_FACES
  427. if !$game_message.face_name.empty?
  428. if height < 132
  429. height = 40
  430. else
  431. height = height - 124
  432. end
  433. end
  434. end
  435. # Define o bitmap do texto de acordo com a altura e largura definida
  436. self.bitmap = Bitmap.new(@width.max + 8 + fw + cw, height + fh)
  437. # Define-se a fonte da mensagem
  438. self.bitmap.font.name = FONT_NAME
  439. # Define-se o tamanho da fonte da mensagem
  440. self.bitmap.font.size = FONT_SIZE
  441. # Define-se se deve adicionar sombra a fonte da mensagem
  442. self.bitmap.font.shadow = FONT_SHADOW
  443. # Define-se a cor do texto da mensagem
  444. self.bitmap.font.color = FONT_COLOR
  445. # Realiza a compensação horizontal
  446. self.ox = self.bitmap.width / 2
  447. # Realiza a compensação vertical
  448. self.oy = self.bitmap.height / 2
  449. # Define-se um Rect de acordao com a largura e altua do bitmap
  450. rect = self.bitmap.rect.clone
  451. # Diminui-se em 16 pixels o tamanho do retângulo
  452. rect.height -= 16
  453. # Cria-se o valor de posicionamento da janela
  454. position_v = FLIP_UP_DOWN ? 0 : 2
  455. # Define-se a opacidade do bitmap, se houver windowskin
  456. o = USE_WINDOWSKIN ? 0 : 192
  457. # Cria a ponta do balão de mensagem
  458. # Se estiver acima
  459. if $game_message.position == position_v
  460. q = [7, 6, 5, 4, 3, 2, 1, 0]
  461. for p in 0 .. 7
  462. self.bitmap.fill_rect(self.ox - 4, p, 8 - q[p], 1, Color.new(255, 255, 255, o))
  463. end
  464. # Se não estiver acima
  465. else
  466. q = [7, 6, 5, 4, 3, 2, 1, 0]
  467. for p in 0 .. 7
  468. self.bitmap.fill_rect(self.ox - 4, rect.height + p, q[p], 1, Color.new(255, 255, 255, o))
  469. end
  470. end
  471. # Se definido não utilizar a mensagem arredondada
  472. if !ROUND_RADIUS.is_a?(Integer) || ROUND_RADIUS <= 0
  473. # Desenha a mensagem padrão
  474. self.bitmap.fill_rect(rect, Color.new(255, 255, 255, o))
  475. # Se não
  476. else
  477. # Desenha a mensagem arredondada
  478. self.bitmap.fill_rounded_rect(rect, Color.new(255, 255, 255, o), ROUND_RADIUS)
  479. end
  480. # Se usar windowskin, define a windowskin da janela
  481. if USE_WINDOWSKIN
  482. @windowskin = Window_Base.new(rect.x - (self.bitmap.width / 2) - 16,
  483. rect.y - (self.bitmap.height / 2) - 16, rect.width + 16,
  484. rect.height + 16)
  485. end
  486. # Se o prefixo de seta for uma String e não for nula e se houver windowskin
  487. if ARROW_PREFIX.is_a?(String) && !ARROW_PREFIX.empty? && !@windowskin.nil?
  488. # Define as setas
  489. @arrow_up = Sprite.new
  490. @arrow_down = Sprite.new
  491. # Deixa ambas as setas invisíveis
  492. @arrow_up.visible = false
  493. @arrow_down.visible = false
  494. # Define a prioridade das setas
  495. @arrow_up.z = 2000
  496. @arrow_down.z = 2000
  497. # Define o bitmap das setas
  498. @arrow_up.bitmap = Cache.picture("#{ARROW_PREFIX}_Up")
  499. @arrow_down.bitmap = Cache.picture("#{ARROW_PREFIX}_Down")
  500. # Define o posicionamento das setas, de acordo com o posicionamento da janela
  501. @arrow_up.x = @windowskin.x + @windowskin.width / 2 - @arrow_up.bitmap.width / 2
  502. @arrow_up.y = @windowskin.y - @arrow_up.bitmap.height + 6
  503. @arrow_down.x = @windowskin.x + @windowskin.width / 2 - @arrow_down.bitmap.width / 2
  504. @arrow_down.y = @windowskin.y + @windowskin.height - 6
  505. # Exibe a seta de acordo com a posição da mensagem
  506. # Se for acima
  507. if $game_message.position == position_v
  508. @arrow_up.visible = true
  509. # Se não estiver acima
  510. else
  511. @arrow_down.visible = true
  512. end
  513. end
  514. # Define-se a opacidade da janela
  515. self.opacity = 255
  516. # Exibe a face da mensagem, se assim definido
  517. if SHOW_MESSAGE_FACES
  518. if !$game_message.face_name.empty?
  519. name = $game_message.face_name
  520. index = $game_message.face_index
  521. face = Cache.face(name)
  522. rect = Rect.new(0, 0, 0, 0)
  523. rect.x = index % 4 * 96
  524. rect.y = index / 4 * 96
  525. rect.width = 96
  526. rect.height = 96
  527. bitmap.blt(8, 8, face, rect)
  528. face.dispose
  529. @contents_x = 112
  530. end
  531. end
  532. # Define-se a mensagem como visível
  533. self.visible = true
  534. # Marca a mensagem como visível
  535. $game_message.visible = true
  536. end
  537. #--------------------------------------------------------------------------
  538. # Atualização da tela
  539. #--------------------------------------------------------------------------
  540. def update
  541. # Chama as propriedade da super classe
  542. super
  543. # Retorna se não houver texto
  544. return if $game_message.texts.empty?
  545. # Se estiver ativa as escolhas
  546. if @active
  547. # Atualiza o cursor
  548. update_cursor
  549. # Atualiza o retângulo do cursor
  550. @cursor_rect.update
  551. # Atualiza a inserção de comandos
  552. input_choice
  553. # Se estiver apagando a mensagem
  554. elsif @erasing
  555. # Se estiver usando windowskin
  556. if USE_WINDOWSKIN
  557. # Se a opacidade da mensagem for maior que 0
  558. if @windowskin.opacity > 0
  559. # Reduz-se a opacidade em 10.
  560. @windowskin.opacity -= 10
  561. # Se a opacidade da mensagem for maior que 0
  562. if self.opacity > 0
  563. # Reduz-se a opacidade em 10.
  564. self.opacity -= 10
  565. end
  566. # Se o prefixo de seta for uma String e não for nula e se houver windowskin
  567. if ARROW_PREFIX.is_a?(String) && !ARROW_PREFIX.empty? && !@windowskin.nil? &&
  568. !@arrow_up.nil? && !@arrow_down.nil?
  569. # Apaga as setas
  570. if @arrow_up.opacity > 0
  571. @arrow_up.opacity -= 10
  572. end
  573. if @arrow_down.opacity > 0
  574. @arrow_down.opacity -= 10
  575. end
  576. end
  577. # Se não
  578. else
  579. # Fecha a mensagem
  580. @erasing = false
  581. terminate_message
  582. end
  583. # Se não estiver usando windowskin
  584. else
  585. # Se a opacidade da mensagem for maior que 0
  586. if self.opacity > 0
  587. # Reduz-se a opacidade em 10.
  588. self.opacity -= 10
  589. # Se não
  590. else
  591. # Fecha a mensagem
  592. @erasing = false
  593. terminate_message
  594. end
  595. end
  596. # Se a contagem de espera for mais que 0
  597. elsif @wait_count > 0
  598. # Reduz-se a contagem de espera em 1
  599. @wait_count -= 1
  600. # Se a mensagem estiver terminando
  601. elsif @terminate_message
  602. # Se houver escolhas, inicia-as
  603. if $game_message.choice_max > 0
  604. start_choice
  605. else
  606. terminate_message
  607. end
  608. @wait_count = 10
  609. @text = nil
  610. # Se a mensagem estiver fechando
  611. elsif @closing
  612. # Se pressionar C ou B ou se haver escolhas
  613. if Input.trigger?(Input::C) or Input.trigger?(Input::B) or
  614. $game_message.choice_max > 0
  615. # Marca a mensagem como finalizando
  616. @terminate_message = true
  617. end
  618. # Se estiver aguardando por pressionamento
  619. elsif @wait_input
  620. # Se pressionar C ou B
  621. if Input.trigger?(Input::C) or Input.trigger?(Input::B)
  622. # Define a espera por pressionamento como falso
  623. @wait_input = false
  624. end
  625. # Se pressionar C
  626. elsif Input.trigger?(Input::C)
  627. # Marca como exibir rápido
  628. @show_fast = true
  629. # Se o texto for diferente de nulo
  630. elsif @text != ""
  631. # Atualiza a mensagem
  632. update_message
  633. # Se o texto for nulo
  634. elsif @text == ""
  635. # Abre a mensagem
  636. open
  637. end
  638. # Retorna se estiver visivel
  639. return unless self.visible
  640. # Define X como o posicionamento de @character
  641. self.x = @character.screen_x
  642. # Cria-se o valor de posicionamento da janela
  643. position_v = FLIP_UP_DOWN ? 0 : 2
  644. # Se estiver exibindo acima
  645. if $game_message.position == position_v
  646. # Define o posicionamento de acordo
  647. self.y = @character.screen_y + (self.bitmap.height / 2) + 8
  648. # Se não
  649. else
  650. # Define o posicionamento de acordo
  651. self.y = @character.screen_y - (self.bitmap.height / 2) - 24 - 32
  652. # self.y = @character.screen_y - (self.bitmap.height / 2) - 24
  653. end
  654. # Se estiver utilizando windowskin, posiciona a windowskin de acordo
  655. if USE_WINDOWSKIN
  656. # Define X como o posicionamento de @character
  657. @windowskin.x = @character.screen_x - (self.bitmap.width / 2) - 8
  658. # Se estiver exibindo acima
  659. if $game_message.position == position_v
  660. # Define o posicionamento de acordo
  661. @windowskin.y = @character.screen_y + (self.bitmap.height / 2) + 8 - (self.bitmap.height / 2) - 8
  662. # Se não
  663. else
  664. # Define o posicionamento de acordo
  665. @windowskin.y = @character.screen_y - (self.bitmap.height / 2) - 24 - (self.bitmap.height / 2) - 8 - 32
  666. # @windowskin.y = @character.screen_y - (self.bitmap.height / 2) - 24 - (self.bitmap.height / 2) - 8
  667. end
  668. # Se o prefixo de seta for uma String e não for nula e se houver windowskin
  669. if ARROW_PREFIX.is_a?(String) && !ARROW_PREFIX.empty? && !@windowskin.nil? &&
  670. !@arrow_up.nil? && !@arrow_down.nil?
  671. # Deixa as duas setas invisíveis
  672. @arrow_up.visible = false
  673. @arrow_down.visible = false
  674. # Define o posicionamento das setas, de acordo com o posicionamento da janela
  675. @arrow_up.x = @windowskin.x + @windowskin.width / 2 - @arrow_up.bitmap.width / 2
  676. @arrow_up.y = @windowskin.y - @arrow_up.bitmap.height + 6
  677. @arrow_down.x = @windowskin.x + @windowskin.width / 2 - @arrow_down.bitmap.width / 2
  678. @arrow_down.y = @windowskin.y + @windowskin.height - 6
  679. # Exibe a seta de acordo com a posição da mensagem
  680. # Se for acima
  681. if $game_message.position == position_v
  682. @arrow_up.visible = true
  683. # Se não estiver acima
  684. else
  685. @arrow_down.visible = true
  686. end
  687. end
  688. end
  689. end
  690. #--------------------------------------------------------------------------
  691. # Atualização da mensagem
  692. #--------------------------------------------------------------------------
  693. def update_message
  694. # Retorna se não houver bitmap
  695. return if self.bitmap == nil
  696. # Retorna se o bitmap foi disposed
  697. return if self.bitmap.disposed?
  698. # Realização do loop
  699. loop do
  700. # Define c como a divisão da mensagem em /
  701. c = @text.slice!(/./m)
  702. # Caso c
  703. case c
  704. # Se for nulo
  705. when nil
  706. # Define a contagem de espera como 10
  707. @wait_count = 10
  708. # Marca a mensagem como fechando
  709. @closing = true
  710. # Quebra o loop
  711. break
  712. # Se for normal
  713. when "\x00"
  714. # Define o alinhamento X do conteúdo como 4
  715. if $game_message.face_name.empty?
  716. @contents_x = 4
  717. else
  718. @contents_x = SHOW_MESSAGE_FACES ? 112 : 4
  719. end
  720. # Aumenta o alinhamento Y do conteúdo para mais o tamanho da fonte
  721. @contents_y += 24
  722. # Define como mostrar a mensagem rápido como falso
  723. @line_show_fast = false
  724. # Se não houver texto
  725. if @text.empty?
  726. # Define a contagem de espera como 10
  727. @wait_count = 10
  728. # Marca a mensagem como fechando
  729. @closing = true
  730. # Quebra o loop
  731. break
  732. end
  733. # Se for mudança de cor
  734. when "\x01"
  735. # Adquire o número do texto
  736. @text.sub!(/\[([0-9]+)\]/, "")
  737. # Define a cor da mensagem
  738. self.bitmap.font.color = text_color($1.to_i)
  739. # Prossegue com o loop
  740. next
  741. # Se esperar por 1/4 de segundo
  742. when "\x03"
  743. # Defina a espera como 15
  744. @wait_count = 15
  745. # Quebra o loop
  746. break
  747. # Se esperar por 1 segundo
  748. when "\x04"
  749. # Define a espera como 60
  750. @wait_count = 60
  751. # Quebra o loop
  752. break
  753. # Se aguardar pelo pressionamento do usuário
  754. when "\x05"
  755. # Marca a espera por pressionamento como verdadeiro
  756. @wait_input = true
  757. # Quebra o loop
  758. break
  759. # Quando mostrar rápido
  760. when "\x06"
  761. # Marca o mostrar rápido como verdadeiro
  762. @line_show_fast = true
  763. # Quando não mostrar rápido
  764. when "\x07"
  765. # Marca o mostrar rápido como falso
  766. @line_show_fast = false
  767. # Quando fechar a mensagem automaticamente
  768. when "\x08"
  769. # Marca o fechando como verdadeiro
  770. @closing = true
  771. # Marca a tag de fechamento como verdadeiro
  772. @terminate_message = true
  773. # Quebra o loop
  774. break
  775. # Definição do desenho do nome e ícone de um objeto
  776. when "\x10"
  777. # Adquire o index da string
  778. @text.sub!(/\[(\d+)\]/, "")
  779. # Desenha o ícone
  780. draw_icon($1.to_i, @contents_x, @contents_y)
  781. # Aumente o X do conteúdo em 26 devido ao ícone
  782. @contents_x += 26
  783. # Se mudar o nome da fonte
  784. when "\x11"
  785. # Adquire o nome da fonte da string
  786. @text.sub!(/\[(.*?)\]/, "")
  787. # Define o nome da fonte
  788. self.bitmap.font.name = ($1.to_s != "" ? $1.to_s : FONT_NAME)
  789. # Se mudar o tamanho da fonte
  790. when "\x12"
  791. # Adquire o tamanho da fonte da string
  792. @text.sub!(/\[(.*?)\]/, "")
  793. # Define o tamanho da fonte
  794. self.bitmap.font.size = ($1.to_i > 0 ? $1.to_i : FONT_SIZE)
  795. # Se definir o estilo da fonte para negrito
  796. when "\x13"
  797. # Adquire a tag da string
  798. @text.sub!(/\[(.*?)\]/, "")
  799. # Define a fonte como negrito
  800. self.bitmap.font.bold = !self.bitmap.font.bold
  801. # Se definir o estilo da fonte para itálico
  802. when "\x14"
  803. # Adquire a tag da string
  804. @text.sub!(/\[(.*?)\]/, "")
  805. # Define a fonte como itálico
  806. self.bitmap.font.italic = !self.bitmap.font.italic
  807. # Se não
  808. else
  809. # Memoriza a cor padrão da fonte
  810. base_color = self.bitmap.font.color.clone
  811. # Define a cor escura
  812. self.bitmap.font.color = Color.new(0, 0, 0, base_color.alpha)
  813. # Desenha o texto um pouco escuro, para a sombra da mensagem
  814. self.bitmap.draw_text(@contents_x + 1, @contents_y + 1, 20, FONT_SIZE, c)
  815. # Redefine a cor da fonte
  816. self.bitmap.font.color = base_color
  817. # Desenha o texto normal
  818. self.bitmap.draw_text(@contents_x, @contents_y, 20, FONT_SIZE, c)
  819. # Aumenta o alinhamento x
  820. @contents_x += c.getw
  821. # Reproduz o SE da mensagem
  822. RPG::SE.new(TYPE_SE).play if TYPE_SE != ""
  823. end
  824. # Quebra o loop se estiver exibindo rápido
  825. break unless @show_fast or @line_show_fast
  826. end
  827. end
  828. #--------------------------------------------------------------------------
  829. # Alias da conversão dos caracteres especiais
  830. #--------------------------------------------------------------------------
  831. alias vmb01_convert_special_characters convert_special_characters
  832. #--------------------------------------------------------------------------
  833. # Conversão dos caracteres especiais
  834. #--------------------------------------------------------------------------
  835. def convert_special_characters
  836. # Se for a mudança do posicionamento de eventos, se o ID for nulo,
  837. # define o @character como o personagem
  838. @text.gsub!(/\\EV\[(\d+)\]/i){@character = $game_map.events[$1.to_i].nil? ?
  839. $game_player : $game_map.events[$1.to_i]; ""}
  840. # Roda o método padrão
  841. vmb01_convert_special_characters
  842. end
  843. #--------------------------------------------------------------------------
  844. # Iniciar escolha
  845. #--------------------------------------------------------------------------
  846. def start_choice
  847. # Define a mensagem como ativa, para escolhas
  848. @active = true
  849. # Se houver faces
  850. if SHOW_MESSAGE_FACES
  851. # Define a largura do cursor de acordo
  852. width = $game_message.face_name.empty? ? self.bitmap.width + 32 :
  853. self.bitmap.width + 32 - 108
  854. # Se não houver faces
  855. else
  856. # Define a largura do cursor de acordo
  857. width = self.bitmap.width + 32
  858. end
  859. # Cria o cursor pela janela de cursor
  860. @cursor_rect = Window_RectChoice.new(0, 0, width - 16, 56) if @cursor_rect.nil?
  861. # Define o @item_max da janela de acordo com o número de mensagens
  862. @cursor_rect.item_max = @item_max
  863. end
  864. #--------------------------------------------------------------------------
  865. # Inserção: escolha
  866. #--------------------------------------------------------------------------
  867. def input_choice
  868. # Se cancelar
  869. if Input.trigger?(Input::B)
  870. # Se o cancelamento da mensagem for por botão
  871. if $game_message.choice_cancel_type > 0
  872. # Toca o som de cancelamento
  873. Sound.play_cancel
  874. # Chama o processo de cancelamento
  875. $game_message.choice_proc.call($game_message.choice_cancel_type - 1)
  876. # Finaliza a mensagem
  877. terminate_message
  878. end
  879. # Se confirmar
  880. elsif Input.trigger?(Input::C)
  881. # Toca o som de confirmação
  882. Sound.play_decision
  883. # Chama o processo correspondente ao index da escolha
  884. $game_message.choice_proc.call(@cursor_rect.index)
  885. # Finaliza a mensagem
  886. terminate_message
  887. end
  888. end
  889. #--------------------------------------------------------------------------
  890. # Atualização do cursor
  891. #--------------------------------------------------------------------------
  892. def update_cursor
  893. # Se o index for maior que 0
  894. if @cursor_rect.index >= 0
  895. # Se exibir faces
  896. if SHOW_MESSAGE_FACES
  897. # Define o posicionamento horizontal de acordo
  898. x = $game_message.face_name.empty? ?
  899. self.x - (self.bitmap.width / 2) : self.x - (self.bitmap.width / 2) + 108
  900. # Não exibir faces
  901. else
  902. # Define o posicionamento horizontal de acordo
  903. x = self.x - (self.bitmap.width / 2)
  904. end
  905. # Define o posicionamento vertical do cursor
  906. y = (self.y - (self.bitmap.height / 2)) +
  907. (($game_message.choice_start + @cursor_rect.index) * 24) - 12
  908. # Define o posicionamento do cursor
  909. @cursor_rect.x = x - 8
  910. @cursor_rect.y = y
  911. end
  912. end
  913. #--------------------------------------------------------------------------
  914. # Fim da mensagem
  915. #--------------------------------------------------------------------------
  916. def terminate_message
  917. @active = false
  918. # Fecha a janela de cursor se não for nula
  919. if !@cursor_rect.nil?
  920. @cursor_rect.dispose
  921. @cursor_rect = nil
  922. end
  923. # Se estiver usando windowskin
  924. if USE_WINDOWSKIN
  925. # Se a opacidade da mensagem for maior que 0
  926. if @windowskin.opacity > 0
  927. # Marca o apagamento da mensagem
  928. @erasing = true
  929. else
  930. # Chama o processo principal da mensagem
  931. $game_message.main_proc.call if $game_message.main_proc != nil
  932. # Limpa a mensagem
  933. $game_message.clear
  934. # Fecha a mensagem
  935. close
  936. # Define a mensagem como invisível
  937. $game_message.visible = false
  938. # Faz o dispose da windowskin
  939. # @windowskin.dispose
  940. # Faz o dispose das setas
  941. @arrow_up.dispose if !@arrow_up.nil?
  942. @arrow_down.dispose if !@arrow_down.nil?
  943. end
  944. # Se não estiver usando windowskin
  945. else
  946. # Se a opacidade da mensagem for maior que 0
  947. if self.opacity > 0
  948. # Marca o apagamento da mensagem
  949. @erasing = true
  950. else
  951. # Chama o processo principal da mensagem
  952. $game_message.main_proc.call if $game_message.main_proc != nil
  953. # Limpa a mensagem
  954. $game_message.clear
  955. # Fecha a mensagem
  956. close
  957. # Define a mensagem como invisível
  958. $game_message.visible = false
  959. end
  960. end
  961. end
  962. #--------------------------------------------------------------------------
  963. # Configuração da cor da letra
  964. # n : cor da letra (0~31)
  965. #--------------------------------------------------------------------------
  966. def text_color(n)
  967. # Posicionamento horizontal da cor na paleta da windowskin
  968. x = 64 + (n % 8) * 8
  969. # Posicionamento vertical da cor na paleta da windowskin
  970. y = 96 + (n / 8) * 8
  971. # Define a windowskin
  972. windowskin = Cache.system("Window")
  973. # Retorna o valor da paleta
  974. return windowskin.get_pixel(x, y)
  975. end
  976. end
  977.  
  978. #==============================================================================
  979. # Scene_Map
  980. #------------------------------------------------------------------------------
  981. # Classe das operações nos mapas.
  982. #------------------------------------------------------------------------------
  983. # Sumário de mudanças:
  984. # * Alias do método: start.
  985. #==============================================================================
  986.  
  987. class Scene_Map < Scene_Base
  988. #--------------------------------------------------------------------------
  989. # Alias do início do processo
  990. #--------------------------------------------------------------------------
  991. alias vampyr_balloon_message_smap2_start start
  992. #--------------------------------------------------------------------------
  993. # Início do processo
  994. #--------------------------------------------------------------------------
  995. def start
  996. # Chama o método padrão
  997. vampyr_balloon_message_smap2_start
  998. @balloon_message = Sprite_MessageBalloon.new
  999. @normal_message = Window_Message.new
  1000. @memo_switch = $game_switches[VMB_ExtraOptions::BALLOON_SWITCH]
  1001. # Se a switch de balões não for nula e estiver ativada
  1002. if !$game_switches[VMB_ExtraOptions::BALLOON_SWITCH].nil? &&
  1003. $game_switches[VMB_ExtraOptions::BALLOON_SWITCH]
  1004. # Define a mensagem como padrão
  1005. @message_window = @normal_message
  1006. # Se não
  1007. else
  1008. # Define a mensagem como balão
  1009. @message_window = @balloon_message
  1010. end
  1011. end
  1012. #--------------------------------------------------------------------------
  1013. # Alias da atualização da tela
  1014. #--------------------------------------------------------------------------
  1015. alias vampyr_balloon_message_smap2_update update
  1016. #--------------------------------------------------------------------------
  1017. # Atualização da tela
  1018. #--------------------------------------------------------------------------
  1019. def update
  1020. # Chama o método padrão
  1021. vampyr_balloon_message_smap2_update
  1022. if @memo_switch != $game_switches[VMB_ExtraOptions::BALLOON_SWITCH]
  1023. # Se a switch de balões não for nula e estiver ativada
  1024. if !$game_switches[VMB_ExtraOptions::BALLOON_SWITCH].nil? &&
  1025. $game_switches[VMB_ExtraOptions::BALLOON_SWITCH]
  1026. # Retorna se estiver visivel
  1027. return if $game_message.visible
  1028. # Define a mensagem como padrão
  1029. @message_window = @normal_message
  1030. # Se não
  1031. else
  1032. # Retorna se estiver visivel
  1033. return if $game_message.visible
  1034. # Define a mensagem como balão
  1035. @message_window = @balloon_message
  1036. end
  1037. @memo_switch = $game_switches[VMB_ExtraOptions::BALLOON_SWITCH]
  1038. end
  1039. end
  1040. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement