Advertisement
MundoBezier

SizeEvents

Feb 22nd, 2022 (edited)
1,471
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 11.83 KB | None | 0 0
  1. ################################################################################
  2. #
  3. #                               SizeEvents v.3.0
  4. #                                Autor : Bezier
  5. #                       Compatible con : 16.2
  6. #              Sugerencias para mejora : Pablus y Scept
  7. #
  8. # Este script plug&play permite definir eventos con tamaño superior a 1 cuadro,
  9. # ahorrando eventos que afecten a una zona usando 1 solo evento.
  10. # Añade al nombre del evento el texto size(w,h) para definir un tamaño de
  11. # 'w' cuadros de ancho y 'h' cuadros de alto. Ejemplo.
  12. #
  13. #    evento: X
  14. #    nombre: bloqueo size(4,2)
  15. #         esto define un evento extendido de ancho 4 y alto 2
  16. #
  17. #    [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
  18. #    [ ] [ ] [h] [h] [h] [h] [ ] [ ] [ ] [ ]
  19. #    [ ] [ ] [X] [w] [w] [w] [ ] [ ] [ ] [ ]
  20. #    [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
  21. #    [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
  22. ################################################################################
  23. #
  24. # Al entrar en contacto con un evento de teletransporte, traslada al jugador
  25. # al cuadro correspondiente aplicando un desfase desde donde está el evento.
  26. # En el siguiente ejemplo, el personaje, \PN, entra en el cuadro extendido 2,
  27. # a 2 cuadros por encima del evento [X], el cual tiene un destino de
  28. # teletransporte a la posición [T]. El jugador aparecerá en T+2.
  29. # Se aplica tanto para eventos en horizontal como en vertical
  30. #    evento: X
  31. #    nombre: size(1,3)
  32. #    destino de tp desde el evento: X ---> T
  33. #    entra en [X + 2] ---> sale por [T + 2]
  34. #
  35. #    [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
  36. #    \PN --->[2]-[-]-[-]-[-]-[2]---> \PN [ ]
  37. #    [ ] [ ] [1] [ ] [ ] [ ] [1] [ ] [ ] [ ]
  38. #    [ ] [ ] [X] ----------> [T] [ ] [ ] [ ]
  39. #    [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
  40. ################################################################################
  41. #
  42. # * Versión 2.0 - Teletransportes cruzados [Sugerido por Scept]
  43. # Al entrar en contacto con un evento de teletransporte, traslada al jugador
  44. # al cuadro correspondiente aplicando el desfase y un cambio de coordenadas.
  45. # En el siguiente ejemplo, el personaje, \PN, entra en el cuadro extendido 2,
  46. # a 2 cuadros por encima del evento [X], el cual tiene un destino de
  47. # teletransporte a la posición [T]. El jugador aparecerá en T+2 cruzado
  48. # Se aplica tanto para eventos en horizontal como en vertical
  49. #    evento: X
  50. #    nombre: size(1,3)
  51. #    destino de tp desde el evento: X ---> T
  52. #    entra en [X + 2] ---> sale por [T + 2_x]
  53. #
  54. #    [ ] [ ] [ ] [ ] [ ] [ ] [ ] [   ] [   ] [ ]
  55. #    \PN --->[2]-[-]-[-]-[-]-[2]-[---]-[-· ] [ ]
  56. #    [ ] [ ] [1] [ ] [ ] [ ] [1] [   ] [ v ] [ ]
  57. #    [ ] [ ] [X] ----------> [T] [1_x] [2_x] \PN
  58. #    [ ] [ ] [ ] [ ] [ ] [ ] [ ] [   ] [   ] [ ]
  59. ################################################################################
  60. #
  61. # * Versión 3.0 - Omitir el desfase en los teletransportes [Sugerido por Pablus]
  62. # Se ha añadido un interruptor con el cual se puede omitir el desfase que aplica
  63. # a los teletransportes para mantener una correlación de cuadros.
  64. #    evento: X
  65. #    nombre: size(1,3)
  66. #    destino de tp desde el evento: X ---> T
  67. #    interruptor SIZEEVENT_OMITOFFSET_SWITCH activado
  68. #    entra en [X + 2] ---> sale por [T] SIN DESFASE
  69. #
  70. #    [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
  71. #    \PN --->[2] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
  72. #    [ ] [ ] [1] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
  73. #    [ ] [ ] [X] ----------> [T]---> \PN [ ]
  74. #    [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
  75. ################################################################################
  76.  
  77.  
  78. # Interruptor para omitir el desfase en los teletransportes
  79. # Con este interruptor activo se omitirán todos los desfases en los teletransportes
  80. # permitiendo que todos los cuadros del evento extendido hagan tp a un único punto
  81. # Se puede usar cualquier interruptor. Se ha usado el 100 por poner uno.
  82. # Este control se ha incluido gracias a una necesidad planteada por  Pablus
  83. SIZEEVENT_OMITOFFSET_SWITCH = 100
  84.  
  85. # Interruptor que se usa para modificar la dirección de teletransporte extendido
  86. # Los tp normales funcionan en horizontal o vertical, pero con este interruptor
  87. # activado, se puede entrar en un tp horizontal y salir por una zona en vertical
  88. # Se puede usar cualquier interruptor. Se ha usado el 101 por poner uno.
  89. # Esta actualización ha sido gracias a un problema planteado por  Scept
  90. SIZEEVENT_TPCROSS_SWITCH = 101
  91.  
  92. class Game_Character
  93.  
  94.   alias initialize_se_char initialize
  95.   def initialize(map=nil)
  96.     initialize_se_char(map)
  97.     @width = 1
  98.     @height = 1
  99.   end
  100.  
  101.   def at_coordinate?(check_x, check_y)
  102.     return check_x >= @x && check_x < @x + @width &&
  103.            check_y > @y - @height && check_y <= @y
  104.   end
  105.  
  106.   def passableEx?(x, y, d, strict=false)
  107.     new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
  108.     new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
  109.     return false unless self.map.valid?(new_x, new_y)
  110.     return true if @through
  111.     if strict
  112.       return false unless self.map.passableStrict?(x, y, d, self)
  113.       return false unless self.map.passableStrict?(new_x, new_y, 10 - d, self)
  114.     else
  115.       return false unless self.map.passable?(x, y, d, self)
  116.       return false unless self.map.passable?(new_x, new_y, 10 - d, self)
  117.     end
  118.     for event in self.map.events.values
  119.       if event.at_coordinate?(new_x, new_y) #event.x == new_x and event.y == new_y
  120.         unless event.through
  121.           return false if self != $game_player || event.character_name != ""
  122.         end
  123.       end
  124.     end
  125.     if $game_player.x == new_x and $game_player.y == new_y
  126.       unless $game_player.through
  127.         return false if @character_name != ""
  128.       end
  129.     end
  130.     return true
  131.   end
  132. end
  133.  
  134. class Game_Event < Game_Character
  135.  
  136.   alias initialize_se_event initialize
  137.   def initialize(map_id, event, map=nil)
  138.     initialize_se_event(map_id, event, map)
  139.     if @event.name[/size\((\d+),(\d+)\)/i]
  140.       @width = $~[1].to_i
  141.       @height = $~[2].to_i
  142.     end
  143.   end
  144.  
  145.   def onEvent?
  146.     return @map_id==$game_map.map_id && at_coordinate?($game_player.x, $game_player.y)
  147.   end
  148.  
  149.   def check_event_trigger_auto
  150.     if @trigger == 2 && at_coordinate?($game_player.x, $game_player.y) # Event touch
  151.       if not jumping? and over_trigger?
  152.         start
  153.       end
  154.     elsif @trigger == 3 # Autorun
  155.       start
  156.     end
  157.   end
  158. end
  159.  
  160. class Game_Player < Game_Character
  161.  
  162.   def pbFacingEvent
  163.     if $game_system.map_interpreter.running?
  164.       return nil
  165.     end
  166.     new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
  167.     new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
  168.     for event in $game_map.events.values
  169.       if event.at_coordinate?(new_x, new_y)
  170.         if not event.jumping? and not event.over_trigger?
  171.           return event
  172.         end
  173.       end
  174.     end
  175.     if $game_map.counter?(new_x, new_y)
  176.       new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
  177.       new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
  178.       for event in $game_map.events.values
  179.         if event.at_coordinate?(new_x, new_y)
  180.           if not event.jumping? and not event.over_trigger?
  181.             return event
  182.           end
  183.         end
  184.       end
  185.     end
  186.     return nil
  187.   end
  188.   #-----------------------------------------------------------------------------
  189.   # * Same Position Starting Determinant
  190.   #-----------------------------------------------------------------------------
  191.   def check_event_trigger_here(triggers)
  192.     result = false
  193.     # If event is running
  194.     if $game_system.map_interpreter.running?
  195.       return result
  196.     end
  197.     # All event loops
  198.     for event in $game_map.events.values
  199.       # If event coordinates and triggers are consistent
  200.       if event.at_coordinate?(@x, @y) && triggers.include?(event.trigger)
  201.         # If starting determinant is same position event (other than jumping)
  202.         if not event.jumping? and event.over_trigger?
  203.           event.start
  204.           result = true
  205.         end
  206.       end
  207.     end
  208.     return result
  209.   end
  210.   #-----------------------------------------------------------------------------
  211.   # * Front Event Starting Determinant
  212.   #-----------------------------------------------------------------------------
  213.   def check_event_trigger_there(triggers)
  214.     result = false
  215.     # If event is running
  216.     if $game_system.map_interpreter.running?
  217.       return result
  218.     end
  219.     # Calculate front event coordinates
  220.     new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
  221.     new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
  222.     # All event loops
  223.     for event in $game_map.events.values
  224.       # If event coordinates and triggers are consistent
  225.       if event.at_coordinate?(new_x, new_y) && triggers.include?(event.trigger)
  226.         # If starting determinant is front event (other than jumping)
  227.         if not event.jumping? and !event.over_trigger?
  228.           event.start
  229.           result = true
  230.         end
  231.       end
  232.     end
  233.     # If fitting event is not found
  234.     if result == false
  235.       # If front tile is a counter
  236.       if $game_map.counter?(new_x, new_y)
  237.         # Calculate 1 tile inside coordinates
  238.         new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
  239.         new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
  240.         # All event loops
  241.         for event in $game_map.events.values
  242.           # If event coordinates and triggers are consistent
  243.           if event.at_coordinate?(new_x, new_y) && triggers.include?(event.trigger)
  244.             # If starting determinant is front event (other than jumping)
  245.             if not event.jumping? and !event.over_trigger?
  246.               event.start
  247.               result = true
  248.             end
  249.           end
  250.         end
  251.       end
  252.     end
  253.     return result
  254.   end
  255.   #-----------------------------------------------------------------------------
  256.   # * Touch Event Starting Determinant
  257.   #-----------------------------------------------------------------------------
  258.   def check_event_trigger_touch(x, y)
  259.     result = false
  260.     # If event is running
  261.     if $game_system.map_interpreter.running?
  262.       return result
  263.     end
  264.     # All event loops
  265.     for event in $game_map.events.values
  266.       if event.name[/^Trainer\((\d+)\)$/]
  267.         distance=$~[1].to_i
  268.         next if !pbEventCanReachPlayer?(event,self,distance)
  269.       end
  270.       if event.name[/^Counter\((\d+)\)$/]
  271.         distance=$~[1].to_i
  272.         next if !pbEventFacesPlayer?(event,self,distance)
  273.       end
  274.       # If event coordinates and triggers are consistent
  275.       if event.at_coordinate?(x, y) && [1,2].include?(event.trigger)
  276.         # If starting determinant is front event (other than jumping)
  277.         if not event.jumping? and not event.over_trigger?
  278.           event.start
  279.           result = true
  280.         end
  281.       end
  282.     end
  283.     return result
  284.   end
  285. end
  286.  
  287. class Scene_Map
  288.   alias transfer_player_size transfer_player
  289.   def transfer_player(cancelVehicles=true)
  290.  
  291.     # Si no se está omitiendo el desfase de teletransporte,
  292.     # traslada al jugador a la posición correspondiente según el tamaño
  293.     if $game_switches[SIZEEVENT_OMITOFFSET_SWITCH] == false
  294.       inc_x = 0
  295.       inc_y = 0
  296.       interpreter=pbMapInterpreter
  297.       if interpreter
  298.         event=interpreter.get_character(0)
  299.         if event
  300.           if event.name[/size\((\d+),(\d+)\)/i]
  301.             difx = $game_player.x - event.x
  302.             dify = $game_player.y - event.y
  303.  
  304.             # Si se está aplicando un teletransporte cruzado,
  305.             # invierte los desfases de desplazamiento horizontal y vertical
  306.             if $game_switches[SIZEEVENT_TPCROSS_SWITCH]
  307.               $game_temp.player_new_x -= dify
  308.               $game_temp.player_new_y -= difx
  309.             else
  310.               $game_temp.player_new_x += difx
  311.               $game_temp.player_new_y += dify
  312.             end
  313.           end
  314.         end
  315.       end
  316.     end
  317.  
  318.     transfer_player_size
  319.   end
  320. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement