Advertisement
MundoBezier

Mugshots

Jan 27th, 2021 (edited)
972
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 9.77 KB | None | 0 0
  1. #===============================================================================
  2. #                       Script : Mugshots Manager v.3
  3. #                        Autor : Bezier
  4. #-------------------------------------------------------------------------------
  5. #  Changelog v.3:
  6. #   - Permite reducir la textbox cuando aparece el mugshot dando un valor a REDUCETEXTBOXWIDTH
  7. #       * Mejora planteada a raíz de una conversación con Pira
  8. #  Changelog v.2:
  9. #   - Añade campos a la configuración para poder hacerlo mas personalizable
  10. #   - Añade una función para poder tener mugshots animados mientras pasa el texto
  11. #   - Cambia el término anterior animate por appear en la función load, ya que es más correcto
  12. #       así no se confunde con la animación de mugshot, pues es una aparición por el lado derecho
  13. #-------------------------------------------------------------------------------
  14. #  Muestra el mugshot asociado a un nombre en la posición indicada.
  15. #  Si la imagen está compuesta por frames con las diferentes poses o rostros
  16. #  del personaje, se podrá definir el tamaño del frame sobre la imagen.
  17. #  -----------------------------------------
  18. #  |         |         |         |         |
  19. #  | Frame 0 | Frame 1 | Frame 2 | Frame 3 |
  20. #  |         |         |         |         |
  21. #  -----------------------------------------
  22. #
  23. #  Tiene compatibilidad con el script NameBox para mostrar el cuadro de nombre
  24. #  junto con el mugshot.
  25. #-------------------------------------------------------------------------------
  26. #  Paso 1: ¿Cómo integrarlo?
  27. #
  28. #  Añadir una línea en la función Kernel.pbMessageDisplay del script Messages:
  29. #
  30. #  [...]
  31. #  ########## Show text #############################
  32. #  Mugshots.show(msgwindow) # <- Añadir esta línea para mostrar el Mugshot.
  33. #  msgwindow.text=text
  34. #  [...]
  35. #
  36. #-------------------------------------------------------------------------------
  37. #  Paso 2: ¿Cómo se usa?
  38. #
  39. #  Hacer el cambio del Paso 1.
  40. #
  41. #  Para mostrar un mugshot desde un evento tan solo hay que llamar al script:
  42. #     Mugshots.load('NAME', FRAME=0, APPEAR=false)
  43. #
  44. #   'NAME' : Nombre del gráfico en la carpeta Graphics/Pictures/FOLDER
  45. #             FOLDER es el nombre de la carpeta definida más abajo, en configuración
  46. #   FRAME : Frame que se mostrará de la imágen, si está compuesto por frames
  47. #             El valor por defecto es 0
  48. #   APPEAR : Si es true, el mugshot aparece desde la derecha con una transición
  49. #             El valor por defecto es false
  50. #
  51. #  Esto cargará la imagen 'NAME' encima del cuadro de texto.
  52. #  Se mostrará hasta que se desactive llamando al script:
  53. #     Mugshots.dispose
  54. #
  55. #  v.2
  56. #  Para mostrar un mugshot animado desde evento, hay que indicar qué frames
  57. #  debe usar para la animación llamando al script:
  58. #     Mugshots.loadAnim('NAME', [F1,F2,F3,...], FRAME_SKIP, REPITE, PAUSE_FRAMES=0)
  59. #
  60. #   'NAME' : Igual que con la función load, es el nombre del gráfico
  61. #   [F1,F2,F3] : Índice de los frames del gráfico que componen la animación
  62. #   FRAME_SKIP : Frames de espera entre cada cambio de frame.
  63. #   REPITE : Si es true, la animación se repetirá en bucle
  64. #   PAUSE_FRAMES : Frames de pausa antes de iniciar una nueva animación si se ha definido como bucle
  65. #
  66. #-------------------------------------------------------------------------------
  67. #  Paso 3: Compatibilidades (Opcional)
  68. #
  69. #  Si se está usando el script de comandos de JESS, que sobreescribe la función
  70. #  Kernel.pbMessageDisplay, hay que editar este script en vez del de Messages.
  71. #  Del mismo modo que en el Paso 1, hay que añadir la llamada a Mugshots
  72. #  en la función Kernel.pbMessageDisplay.
  73. #  Si no se encuentra el comentario:
  74. #      ########## Show text #############################
  75. #  habrá que buscar la línea:
  76. #      msgwindow.text=text
  77. #  y hacer la llamada:
  78. #
  79. #  [...]
  80. #  atTop=(msgwindow.y==0)
  81. #  Mugshots.show(msgwindow) # <- Añadir esta línea para mostrar el Mugshot.
  82. #  msgwindow.text=text
  83. #  [...]
  84. #===============================================================================
  85.  
  86. module Mugshots
  87.  
  88.   # ---------- CONFIRUGACIÓN ----------
  89.  
  90.   # Nombre de la carpeta que tiene los mugshots dentro de Graphics/Pictures
  91.   FOLDER = "Mugshots"
  92.  
  93.   # Frames que tarda el Mugshot en entrar si se carga con animación de entrada
  94.   APPEARFRAMES = 15
  95.  
  96.   # Si es true, activa la compatibilidad con el script NameBox para mostrar
  97.   # el cuadro de nombre junto con el Mugshot con el que comparta dicho nombre
  98.   AUTONAMEBOX = true
  99.  
  100.   # Define el ancho de frame de Mugshots compuesto por una secuencia de imagenes
  101.   CHARACTERS = {
  102.     # NAME => Ancho del frame
  103.     "Candela" => 262
  104.   }
  105.  
  106.   # Ancho, en píxeles, que se reducirá la textbox cuando se muestre un mugshot
  107.   REDUCETEXTBOXWIDTH = 0
  108.  
  109.   # ---------- FUNCIONES DE USO ----------
  110.  
  111.   # Carga el mugshot con frame concreto
  112.   # name : Nombre de la imagen en Graphics/Pictures/FOLDER
  113.   # frame : Frame de la imagen a mostrar, solo si está dividida en frames
  114.   #           y se ha definido un ancho en CHARACTERS
  115.   # appear : Si es true, el mugshot aparece por la derecha y sale igual cuando se destruye
  116.   def self.load(name, frame=0, appear=false)
  117.     # Antes de cargar un nuevo mugshot, quita el actual
  118.     dispose
  119.    
  120.     @name = name
  121.     @framewidth = 0
  122.     @framewidth = CHARACTERS[name] if CHARACTERS[name]
  123.     @frame = frame >= 0 ? frame : 0
  124.     @appearIn = @appearOut = appear
  125.    
  126.     if defined?(NameBox) && AUTONAMEBOX
  127.       NameBox.load(name)
  128.     end
  129.   end
  130.  
  131.   # Carga el mugshot con una animación definida
  132.   # name : nombre de la imagen en Graphics/Pictures/FOLDER
  133.   # frameRange : Array con los frames que componen la animación. Ej: [0, 1, 3, 2, 4]
  134.   # frameWait : Tiempo de espera (en frames) antes de cambiar al siguiente frame.
  135.   # repite : Si es true, la animación se repite en bucle hasta que se destruya
  136.   # framePause : Tiempo de espera (en frames) antes de iniciar de nuevo la animación
  137.   #                 Esto solo se usa si repite es true
  138.   def self.loadAnim(name, frameRange, frameWait, repite, framePause=0)
  139.     self.load(name, frameRange[0])
  140.     @mugAnimated = true
  141.     @frameRange = frameRange
  142.     @frameIndex = 0
  143.     @frameWait = frameWait
  144.     @frameCountDown = frameWait
  145.     @repiteAnimation = repite
  146.     @framePause = framePause
  147.   end
  148.  
  149.   def self.visible?
  150.     return @mugshot && @mugshot.visible
  151.   end
  152.  
  153.   # Muestra el mugshot de acuerdo a la configuración
  154.   def self.show(msgwindow)
  155.     if msgwindow && @name
  156.       # Compatibilidad con el script NameBox para mostrar el nombre del personaje
  157.       if defined?(NameBox) && AUTONAMEBOX
  158.         NameBox.show(msgwindow)
  159.       end
  160.      
  161.       @mugshot = Sprite.new(msgwindow.viewport) if !@mugshot
  162.       @mugshot.z = msgwindow.z-1
  163.       @mugshot.bitmap = Cache.picture("#{FOLDER}/#{@name}")
  164.  
  165.       if REDUCETEXTBOXWIDTH > 0
  166.         msgwindow.width = Graphics.width - REDUCETEXTBOXWIDTH
  167.       end
  168.      
  169.       if @framewidth == 0
  170.         @framewidth = @mugshot.bitmap.width
  171.       end
  172.      
  173.       # Calcula las coordenadas del mugshot en base a su tamaño
  174.       x = Graphics.width - @framewidth
  175.       y = Graphics.height - @mugshot.bitmap.height
  176.      
  177.       # Muestra el frame, si lo hay, en la posición indicada
  178.       @mugshot.src_rect.set(@frame * @framewidth, 0, @framewidth, @mugshot.bitmap.height)
  179.       @mugshot.x = x
  180.       @mugshot.y = y
  181.      
  182.       # Si se ha cargado con aparición, la entrada la hará desde el lateral
  183.       # derecho hacia la posición definida
  184.       if @appearIn
  185.         @mugshot.x = Graphics.width
  186.         step = @framewidth / (APPEARFRAMES * 1.0)
  187.         APPEARFRAMES.times do
  188.           @mugshot.x -= step
  189.           pbWait(1)
  190.         end
  191.         @mugshot.x = x
  192.         pbWait(1)
  193.         @appearIn = false
  194.         @appearOut = true
  195.       end
  196.     end
  197.   end
  198.  
  199.   # v.2 - Animación del mugshot
  200.   # Actualiza el mugshot si se ha definido con una animación
  201.   def self.update
  202.     if @mugshot && @mugAnimated
  203.       @mugshot.src_rect.set(@frameRange[@frameIndex] * @framewidth, 0, @framewidth, @mugshot.bitmap.height)
  204.       @frameCountDown -= 1
  205.       if @frameCountDown <= 0
  206.         @frameCountDown = @frameWait
  207.         @frameIndex += 1
  208.         if @frameIndex == @frameRange.size
  209.           if @repiteAnimation
  210.             @frameIndex = 0
  211.             @frameCountDown += @framePause if @framePause > 0
  212.           else
  213.             @frameIndex -= 1
  214.             @mugAnimated=false
  215.           end
  216.         end
  217.         @frame = @frameRange[@frameIndex]
  218.       end
  219.     end
  220.   end
  221.  
  222.   # Oculta el NameBox pero no lo destruye, para que se muestre junto al próximo texto
  223.   def self.hide
  224.     @mugshot.visible = false if @namebox
  225.     if defined?(NameBox) && AUTONAMEBOX
  226.       NameBox.hide
  227.     end
  228.   end
  229.  
  230.   # Destruye el Mugshot para que no aparezca en el siguiente cuadro de texto
  231.   def self.dispose
  232.     if @mugshot
  233.       if @appearOut && @framewidth
  234.         step = @framewidth / (APPEARFRAMES * 1.0)
  235.         while @mugshot.x < Graphics.width
  236.           @mugshot.x += step
  237.           pbWait(1)
  238.         end
  239.         @appearIn = true
  240.       end
  241.       @mugshot.visible = false
  242.     end
  243.    
  244.     @mugshot.dispose if @mugshot
  245.     @mugshot = nil
  246.     @name = nil
  247.     @framewidth = 0
  248.     @frame = 0
  249.     @animatIn = @appearOut = false
  250.     if @mugAnimated
  251.       @mugAnimated = false
  252.       @frameRange.clear if @frameRange
  253.       @frameRange = nil
  254.       @frameWait = 0
  255.       @frameCountDown = 0
  256.       @frameIdx = 0
  257.       @repiteAnimation = 0
  258.     end
  259.    
  260.     if defined?(NameBox) && AUTONAMEBOX
  261.       NameBox.dispose
  262.     end
  263.   end
  264. end
  265.  
  266. # v.2 - Actualiza el Mugshot en cada actualización del mapa
  267. class Scene_Map
  268.   alias mugupdateSpritesets updateSpritesets
  269.   def updateSpritesets
  270.     mugupdateSpritesets
  271.     Mugshots.update
  272.   end
  273. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement