Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 4133 miembros registrados.
El último usuario registrado es Neysersitoh.

Nuestros miembros han publicado un total de 84769 mensajes en 12064 argumentos.

[XP] Big Events System v1.1

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Big Events System v1.1

Mensaje por Wecoc el 2015-01-25, 01:27

Quizá haya scripts de eso por ahí muy similares, pero no dí con ninguno realmente "guachi" para XP así que hice el mío propio. Además así tenéis uno sin requerimiento de créditos ;D

Permite a los eventos ocupar más de un tile, con lo que ello conlleva, que es básicamente:
- Trigger
- Pasabilidad
- ¡Menos laggg!

Para usarlo podéis usar por ejemplo:
$game_map.events[1].ch_width = 2
$game_map.events[1].ch_height = 3

Además puse la opción de activarlo directamente mediante una Anotación del evento, por ejemplo:
CH_WIDTH 2
CH_HEIGHT 3

Obviamente el ancho y el alto por defecto valen 1, si ponéis que valgan 0 ese evento pasará a ser inservible xD

Versión 1.1:
Código:
#==============================================================================
# ** Big Events System v1.1
#------------------------------------------------------------------------------
# Autor: Wecoc, alguna colaboración de Orochii
# No se requieren créditos
#==============================================================================
#Permite a los eventos ocupar más de un tile, con lo que ello conlleva, que es básicamente:
#- Trigger
#- Pasabilidad
#- ¡Menos laggg!
#
#Para usarlo podéis usar por ejemplo:
#$game_map.events[1].ch_width = 2
#$game_map.events[1].ch_height = 3
#
#Además puse la opción de activarlo directamente mediante una Anotación del evento, por ejemplo:
#CH_WIDTH 2
#CH_HEIGHT 3
#
#Obviamente el ancho y el alto por defecto valen 1, si ponéis que valgan 0 ese evento pasará a ser inservible xD
#
#==============================================================================
# ** Game_Character
#==============================================================================

class Game_Character
  attr_accessor :ch_width
  attr_accessor :ch_height
  alias big_chars_ini initialize unless $@
  def initialize(*args)
    big_chars_ini(*args)
    @ch_width = 1
    @ch_height = 1
  end
 
  def ch_area
    area_array = []
    for ix in 0...@ch_width
      for iy in 0...@ch_height
        dx = (@ch_width - 1) / 2
        dy = (@ch_height - 1)
        area_array.push([@x - dx + ix, @y - dy + iy])
      end
    end
    return area_array
  end
 
  def new_ch_area(x,y)
    area_array = []
    for ix in 0...@ch_width
      for iy in 0...@ch_height
        dx = (@ch_width - 1) / 2
        dy = (@ch_height - 1)
        area_array.push([x - dx + ix, y - dy + iy])
      end
    end
    return area_array
  end
 
  alias big_chars_screen_x screen_x unless $@
  def screen_x
    sx = big_chars_screen_x
    if @ch_width % 2 == 0
      sx += 16
    end
    return sx
  end
 
  def passable?(x, y, d)
    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
    #unless $game_map.valid?(new_x, new_y) # get valid for all coords in the event.
    #  return false
    #end
    for coord in new_ch_area(new_x, new_y)
      unless $game_map.valid?(coord[0], coord[1])
        return false
      end
    end
    # Same as always
    if @through
      return true
    end
   
    # Instead of doing a single check, do one for each coord in its own area
    for coordThis in ch_area
      x = coordThis[0]
      y = coordThis[1]
      new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
      new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
      unless $game_map.passable?(x, y, d, self)
        return false
      end
      unless $game_map.passable?(new_x, new_y, 10 - d)
        return false
      end
      for event in $game_map.events.values
        next if self == event
        for coord in event.ch_area
          if coord == [new_x, new_y]
            unless event.through
              if self != $game_player
                return false
              end
              if event.character_name != ""
                return false
              end
            end
          end
        end
      end
      if $game_player.x == new_x and $game_player.y == new_y
        unless $game_player.through
          if @character_name != ""
            return false
          end
        end
      end
    end
    # If nothing fails, then it's passable.
    return true
  end
 
  #--------------------------------------------------------------------------
  # * Turn Towards Player
  #--------------------------------------------------------------------------
  def turn_toward_player
    # Get difference in player coordinates
    sx = @x - $game_player.x
    sy = @y - $game_player.y
    if(sx != 0)
      sx = sx/sx.abs if(sx.abs <= @ch_width)
    end
    sy = 0 if(sy > 0 && sy.abs < @ch_height)
    # If coordinates are equal
    if sx == 0 and sy == 0
      return
    end
    # If horizontal distance is longer
    if sx.abs > sy.abs
      # Turn to the right or left towards player
      sx > 0 ? turn_left : turn_right
    # If vertical distance is longer
    else
      # Turn up or down towards player
      sy > 0 ? turn_up : turn_down
    end
  end
end

#==============================================================================
# ** Game_Event
#==============================================================================

class Game_Event < Game_Character
  def over_trigger?
    if @character_name != "" and not @through
      return false
    end
    for coord in self.ch_area
      unless $game_map.passable?(coord[0], coord[1], 0)
        return false
      end
    end
    return true
  end
 
  def check_event_trigger_touch(x, y)
    # If event is running
    if $game_system.map_interpreter.running?
      return
    end
    for coord in self.new_ch_area(x,y)
      # If trigger is [touch from event] and consistent with player coordinates
      if @trigger == 2 and coord[0] == $game_player.x and coord[1] == $game_player.y
        # If starting determinant other than jumping is front event
        if not jumping? and not over_trigger?
          start
        end
      end
    end
   
  end
 
  def check_event_trigger_auto
    if @trigger == 2
      for coord in self.ch_area
        if coord == [$game_player.x, $game_player.y]
          if not jumping? and over_trigger?
            start
          end
        end
      end
    end
    if @trigger == 3
      start
    end
  end
 
  def refresh
    new_page = nil
    unless @erased
      for page in @event.pages.reverse
        c = page.condition
        if c.switch1_valid
          if $game_switches[c.switch1_id] == false
            next
          end
        end
        if c.switch2_valid
          if $game_switches[c.switch2_id] == false
            next
          end
        end
        if c.variable_valid
          if $game_variables[c.variable_id] < c.variable_value
            next
          end
        end
        if c.self_switch_valid
          key = [@map_id, @event.id, c.self_switch_ch]
          if $game_self_switches[key] != true
            next
          end
        end
        new_page = page
        break
      end
    end
    if new_page == @page
      return
    end
    setup_page(new_page)
  end
 
  def setup_page(new_page)
    @page = new_page
    clear_starting
    if @page == nil
      @tile_id = 0
      @character_name = ""
      @character_hue = 0
      @move_type = 0
      @through = true
      @trigger = nil
      @list = nil
      @interpreter = nil
      return
    end
    @tile_id = @page.graphic.tile_id
    @character_name = @page.graphic.character_name
    @character_hue = @page.graphic.character_hue
    if @original_direction != @page.graphic.direction
      @direction = @page.graphic.direction
      @original_direction = @direction
      @prelock_direction = 0
    end
    if @original_pattern != @page.graphic.pattern
      @pattern = @page.graphic.pattern
      @original_pattern = @pattern
    end
    @opacity = @page.graphic.opacity
    @blend_type = @page.graphic.blend_type
    @move_type = @page.move_type
    @move_speed = @page.move_speed
    @move_frequency = @page.move_frequency
    @move_route = @page.move_route
    @move_route_index = 0
    @move_route_forcing = false
    @walk_anime = @page.walk_anime
    @step_anime = @page.step_anime
    @direction_fix = @page.direction_fix
    @through = @page.through
    @always_on_top = @page.always_on_top
    @trigger = @page.trigger
    @list = @page.list
    @interpreter = nil
    if @trigger == 4
      @interpreter = Interpreter.new
    end
    check_event_trigger_auto
    get_list_codes
  end
 
  def get_list_codes
    result = check_for_comment(/CH_WIDTH (.+)/i)
    if result != false
      @ch_width = result.to_i
    end
    result = check_for_comment(/CH_HEIGHT (.+)/i)
    if result != false
      @ch_height = result.to_i
    end
  end
 
  def check_for_comment(regexp)
    return false if @list.nil?
    for item in @list
      if item.code == 108 or item.code == 408
        if !item.parameters[0][regexp].nil?
          return $1.nil? ? true : $1
        end
      end
    end
    return false
  end
end

#==============================================================================
# ** Game_Player
#==============================================================================

class Game_Player < Game_Character
  def check_event_trigger_here(triggers)
    result = false
    if $game_system.map_interpreter.running?
      return result
    end
    for event in $game_map.events.values
      if triggers.include?(event.trigger)
        if not event.jumping? and event.over_trigger?
          for coord in event.ch_area
            if coord == [@x, @y]
              event.start
              result = true
            end
          end
        end
      end
    end
    return result
  end

  def check_event_trigger_there(triggers)
    result = false
    if $game_system.map_interpreter.running?
      return result
    end
    new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
    new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
    for event in $game_map.events.values
      if triggers.include?(event.trigger)
        if not event.jumping? and not event.over_trigger?
          for coord in event.ch_area
            if coord == [new_x, new_y]
              event.start
              result = true
            end
          end
        end
      end
    end
    if result == false
      if $game_map.counter?(new_x, new_y)
        new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
        new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
        for event in $game_map.events.values
          if triggers.include?(event.trigger)
            if not event.jumping? and not event.over_trigger?
              for coord in event.ch_area
                if coord == [new_x, new_y]
                  event.start
                  result = true
                end
              end
            end
          end
        end
      end
    end
    return result
  end

  def check_event_trigger_touch(x, y)
    result = false
    triggers = [1, 2]
    if $game_system.map_interpreter.running?
      return result
    end
    for event in $game_map.events.values
      if triggers.include?(event.trigger)
        if not event.jumping? and not event.over_trigger?
          for coord in event.ch_area
            if coord == [x, y]
              event.start
              result = true
            end
          end
        end
      end
    end
    return result
  end
end

#==============================================================================
# ** Game_Map
#==============================================================================

class Game_Map
  def passable?(x, y, d, self_event = nil)
    unless valid?(x, y)
      return false
    end
    bit = (1 << (d / 2 - 1)) & 0x0f
    for event in events.values
      if event.tile_id >= 0 and event != self_event and not event.through
        for coord in event.ch_area
          if coord == [x, y]
            if @passages[event.tile_id] & bit != 0
              return false
            elsif @passages[event.tile_id] & 0x0f == 0x0f
              return false
            elsif @priorities[event.tile_id] == 0
              return true
            end
          end
        end
      end
    end
    for i in [2, 1, 0]
      tile_id = data[x, y, i]
      if tile_id == nil
        return false
      elsif @passages[tile_id] & bit != 0
        return false
      elsif @passages[tile_id] & 0x0f == 0x0f
        return false
      elsif @priorities[tile_id] == 0
        return true
      end
    end
    return true
  end
end

Versión 1.0:
Código:
#==============================================================================
# ** Big Events System v1.0
#------------------------------------------------------------------------------
# Autor: Wecoc
# No se requieren créditos
#==============================================================================
#Permite a los eventos ocupar más de un tile, con lo que ello conlleva, que es básicamente:
#- Trigger
#- Pasabilidad
#- ¡Menos laggg!
#
#Para usarlo podéis usar por ejemplo:
#$game_map.events[1].ch_width = 2
#$game_map.events[1].ch_height = 3
#
#Además puse la opción de activarlo directamente mediante una Anotación del evento, por ejemplo:
#CH_WIDTH 2
#CH_HEIGHT 3
#
#Obviamente el ancho y el alto por defecto valen 1, si ponéis que valgan 0 ese evento pasará a ser inservible xD
#
#==============================================================================
# ** Game_Character
#==============================================================================

class Game_Character
  attr_accessor :ch_width
  attr_accessor :ch_height
  alias big_chars_ini initialize unless $@
  def initialize(*args)
    big_chars_ini(*args)
    @ch_width = 1
    @ch_height = 1
  end
  
  def ch_area
    area_array = []
    for ix in 0...@ch_width
      for iy in 0...@ch_height
        dx = (@ch_width - 1) / 2
        dy = (@ch_height - 1)
        area_array.push([@x - dx + ix, @y - dy + iy])
      end
    end
    return area_array
  end
  
  alias big_chars_screen_x screen_x unless $@
  def screen_x
    sx = big_chars_screen_x
    if @ch_width % 2 == 0
      sx += 16
    end
    return sx
  end
  
  def passable?(x, y, d)
    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
    unless $game_map.valid?(new_x, new_y)
      return false
    end
    if @through
      return true
    end
    unless $game_map.passable?(x, y, d, self)
      return false
    end
    unless $game_map.passable?(new_x, new_y, 10 - d)
      return false
    end
    for event in $game_map.events.values
      next if self == event
      for coord in event.ch_area
        if coord == [new_x, new_y]
          unless event.through
            if self != $game_player
              return false
            end
            if event.character_name != ""
              return false
            end
          end
        end
      end
    end
    if $game_player.x == new_x and $game_player.y == new_y
      unless $game_player.through
        if @character_name != ""
          return false
        end
      end
    end
    return true
  end
end

#==============================================================================
# ** Game_Event
#==============================================================================

class Game_Event < Game_Character
  def over_trigger?
    if @character_name != "" and not @through
      return false
    end
    for coord in self.ch_area
      unless $game_map.passable?(coord[0], coord[1], 0)
        return false
      end
    end
    return true
  end
  
  def check_event_trigger_auto
    if @trigger == 2
      for coord in self.ch_area
        if coord == [$game_player.x, $game_player.y]
          if not jumping? and over_trigger?
            start
          end
        end
      end
    end
    if @trigger == 3
      start
    end
  end
  
  def refresh
    new_page = nil
    unless @erased
      for page in @event.pages.reverse
        c = page.condition
        if c.switch1_valid
          if $game_switches[c.switch1_id] == false
            next
          end
        end
        if c.switch2_valid
          if $game_switches[c.switch2_id] == false
            next
          end
        end
        if c.variable_valid
          if $game_variables[c.variable_id] < c.variable_value
            next
          end
        end
        if c.self_switch_valid
          key = [@map_id, @event.id, c.self_switch_ch]
          if $game_self_switches[key] != true
            next
          end
        end
        new_page = page
        break
      end
    end
    if new_page == @page
      return
    end
    setup_page(new_page)
  end
  
  def setup_page(new_page)
    @page = new_page
    clear_starting
    if @page == nil
      @tile_id = 0
      @character_name = ""
      @character_hue = 0
      @move_type = 0
      @through = true
      @trigger = nil
      @list = nil
      @interpreter = nil
      return
    end
    @tile_id = @page.graphic.tile_id
    @character_name = @page.graphic.character_name
    @character_hue = @page.graphic.character_hue
    if @original_direction != @page.graphic.direction
      @direction = @page.graphic.direction
      @original_direction = @direction
      @prelock_direction = 0
    end
    if @original_pattern != @page.graphic.pattern
      @pattern = @page.graphic.pattern
      @original_pattern = @pattern
    end
    @opacity = @page.graphic.opacity
    @blend_type = @page.graphic.blend_type
    @move_type = @page.move_type
    @move_speed = @page.move_speed
    @move_frequency = @page.move_frequency
    @move_route = @page.move_route
    @move_route_index = 0
    @move_route_forcing = false
    @walk_anime = @page.walk_anime
    @step_anime = @page.step_anime
    @direction_fix = @page.direction_fix
    @through = @page.through
    @always_on_top = @page.always_on_top
    @trigger = @page.trigger
    @list = @page.list
    @interpreter = nil
    if @trigger == 4
      @interpreter = Interpreter.new
    end
    check_event_trigger_auto
    get_list_codes
  end
  
  def get_list_codes
    result = check_for_comment(/CH_WIDTH (.+)/i)
    if result != false
      @ch_width = result.to_i
    end
    result = check_for_comment(/CH_HEIGHT (.+)/i)
    if result != false
      @ch_height = result.to_i
    end
  end
  
  def check_for_comment(regexp)
    return false if @list.nil?
    for item in @list
      if item.code == 108 or item.code == 408
        if !item.parameters[0][regexp].nil?
          return $1.nil? ? true : $1
        end
      end
    end
    return false
  end
end

#==============================================================================
# ** Game_Player
#==============================================================================

class Game_Player < Game_Character
  def check_event_trigger_here(triggers)
    result = false
    if $game_system.map_interpreter.running?
      return result
    end
    for event in $game_map.events.values
      if triggers.include?(event.trigger)
        if not event.jumping? and event.over_trigger?
          for coord in event.ch_area
            if coord == [@x, @y]
              event.start
              result = true
            end
          end
        end
      end
    end
    return result
  end

  def check_event_trigger_there(triggers)
    result = false
    if $game_system.map_interpreter.running?
      return result
    end
    new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
    new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
    for event in $game_map.events.values
      if triggers.include?(event.trigger)
        if not event.jumping? and not event.over_trigger?
          for coord in event.ch_area
            if coord == [new_x, new_y]
              event.start
              result = true
            end
          end
        end
      end
    end
    if result == false
      if $game_map.counter?(new_x, new_y)
        new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
        new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
        for event in $game_map.events.values
          if triggers.include?(event.trigger)
            if not event.jumping? and not event.over_trigger?
              for coord in event.ch_area
                if coord == [new_x, new_y]
                  event.start
                  result = true
                end
              end
            end
          end
        end
      end
    end
    return result
  end

  def check_event_trigger_touch(x, y)
    result = false
    triggers = [1, 2]
    if $game_system.map_interpreter.running?
      return result
    end
    for event in $game_map.events.values
      if triggers.include?(event.trigger)
        if not event.jumping? and not event.over_trigger?
          for coord in event.ch_area
            if coord == [x, y]
              event.start
              result = true
            end
          end
        end
      end
    end
    return result
  end
end

#==============================================================================
# ** Game_Map
#==============================================================================

class Game_Map
  def passable?(x, y, d, self_event = nil)
    unless valid?(x, y)
      return false
    end
    bit = (1 << (d / 2 - 1)) & 0x0f
    for event in events.values
      if event.tile_id >= 0 and event != self_event and not event.through
        for coord in event.ch_area
          if coord == [x, y]
            if @passages[event.tile_id] & bit != 0
              return false
            elsif @passages[event.tile_id] & 0x0f == 0x0f
              return false
            elsif @priorities[event.tile_id] == 0
              return true
            end
          end
        end
      end
    end
    for i in [2, 1, 0]
      tile_id = data[x, y, i]
      if tile_id == nil
        return false
      elsif @passages[tile_id] & bit != 0
        return false
      elsif @passages[tile_id] & 0x0f == 0x0f
        return false
      elsif @priorities[tile_id] == 0
        return true
      end
    end
    return true
  end
end

Acepto sugerencias, peticiones, agradecimientos, ofrendas y sacrificios.


Última edición por Wecoc el 2017-05-15, 18:33, editado 2 veces
avatar
Wecoc
Administrador
Administrador



Créditos 9217

Gracias : 493

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Big Events System v1.1

Mensaje por natalie_cuxi el 2015-01-25, 10:24

Entonces si yo tengo un oso tumbado en el mapa que físicamente ocupa 3 tiles de ancho (pero se traspasa por los lados, el evento sería el tile del medio) para solucionarlo pondría llamar a script y poner:
$game_map.events[1].ch_height = 3 ¿no? Y el [1] que es? El número del evento, no? Si fuera el evento 30 pues seria: bla la la [30] blabala=3, ¿así?

¡Muchas gracias por el aporte! :D
avatar
natalie_cuxi
Principiante
Principiante

0/3

Créditos 1072

Gracias : 25

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Big Events System v1.1

Mensaje por silvanash el 2015-01-25, 11:48

Tal y como indica Wecocio, hay dos formas de usar el script.

1) Llamada a script usando $game_map.events[id].ch_[cosa] = valor, donde "id" es la ID del evento, y "cosa" es height (alto) o width (ancho).

2) Poner anotaciones dentro del evento, especificando sus valores. Para el oso de tres tiles de ancho, habría que colocar una anotación que dijera "CH_WIDTH 3" dentro del evento.
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 1605

Gracias : 225

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Big Events System v1.1

Mensaje por natalie_cuxi el 2015-01-25, 11:57

¡Vale, muchas gracias! Duda solucionada! :D

¡ Saludos! :D
avatar
natalie_cuxi
Principiante
Principiante

0/3

Créditos 1072

Gracias : 25

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Big Events System v1.1

Mensaje por Wecoc el 2017-01-27, 23:41

Ledai detectó un bug en éste script, relacionado con la pasabilidad de los Big Events.
He resubido el script con el problema solucionado.
Siento las molestias.
avatar
Wecoc
Administrador
Administrador



Créditos 9217

Gracias : 493

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Big Events System v1.1

Mensaje por orochii el 2017-05-15, 18:19

Hola Wec, he solucionado lo de la activación de los eventos, la pasabilidad y encontré otro bug por ahí con el "face_towards_player" que también le hice un arreglillo. En buena teoría ya está xD, si quieres lo agregas al post principal o asdf.

Básicamente los cambios están en la redefinición de
Game_Event::check_event_trigger_touch,
Game_Character::passable?,
Game_Character::turn_toward_player
y agregué un método más, un tal Game_Character::new_ch_area

Código:
#==============================================================================
# ** Big Events System v1.1
#------------------------------------------------------------------------------
# Autor: Wecoc, alguna colaboración de Orochii
# No se requieren créditos
#==============================================================================
#Permite a los eventos ocupar más de un tile, con lo que ello conlleva, que es básicamente:
#- Trigger
#- Pasabilidad
#- ¡Menos laggg!
#
#Para usarlo podéis usar por ejemplo:
#$game_map.events[1].ch_width = 2
#$game_map.events[1].ch_height = 3
#
#Además puse la opción de activarlo directamente mediante una Anotación del evento, por ejemplo:
#CH_WIDTH 2
#CH_HEIGHT 3
#
#Obviamente el ancho y el alto por defecto valen 1, si ponéis que valgan 0 ese evento pasará a ser inservible xD
#
#==============================================================================
# ** Game_Character
#==============================================================================

class Game_Character
  attr_accessor :ch_width
  attr_accessor :ch_height
  alias big_chars_ini initialize unless $@
  def initialize(*args)
    big_chars_ini(*args)
    @ch_width = 1
    @ch_height = 1
  end
 
  def ch_area
    area_array = []
    for ix in 0...@ch_width
      for iy in 0...@ch_height
        dx = (@ch_width - 1) / 2
        dy = (@ch_height - 1)
        area_array.push([@x - dx + ix, @y - dy + iy])
      end
    end
    return area_array
  end
 
  def new_ch_area(x,y)
    area_array = []
    for ix in 0...@ch_width
      for iy in 0...@ch_height
        dx = (@ch_width - 1) / 2
        dy = (@ch_height - 1)
        area_array.push([x - dx + ix, y - dy + iy])
      end
    end
    return area_array
  end
 
  alias big_chars_screen_x screen_x unless $@
  def screen_x
    sx = big_chars_screen_x
    if @ch_width % 2 == 0
      sx += 16
    end
    return sx
  end
 
  def passable?(x, y, d)
    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
    #unless $game_map.valid?(new_x, new_y) # get valid for all coords in the event.
    #  return false
    #end
    for coord in new_ch_area(new_x, new_y)
      unless $game_map.valid?(coord[0], coord[1])
        return false
      end
    end
    # Same as always
    if @through
      return true
    end
   
    # Instead of doing a single check, do one for each coord in its own area
    for coordThis in ch_area
      x = coordThis[0]
      y = coordThis[1]
      new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
      new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
      unless $game_map.passable?(x, y, d, self)
        return false
      end
      unless $game_map.passable?(new_x, new_y, 10 - d)
        return false
      end
      for event in $game_map.events.values
        next if self == event
        for coord in event.ch_area
          if coord == [new_x, new_y]
            unless event.through
              if self != $game_player
                return false
              end
              if event.character_name != ""
                return false
              end
            end
          end
        end
      end
      if $game_player.x == new_x and $game_player.y == new_y
        unless $game_player.through
          if @character_name != ""
            return false
          end
        end
      end
    end
    # If nothing fails, then it's passable.
    return true
  end
 
  #--------------------------------------------------------------------------
  # * Turn Towards Player
  #--------------------------------------------------------------------------
  def turn_toward_player
    # Get difference in player coordinates
    sx = @x - $game_player.x
    sy = @y - $game_player.y
    if(sx != 0)
      sx = sx/sx.abs if(sx.abs <= @ch_width)
    end
    sy = 0 if(sy > 0 && sy.abs < @ch_height)
    # If coordinates are equal
    if sx == 0 and sy == 0
      return
    end
    # If horizontal distance is longer
    if sx.abs > sy.abs
      # Turn to the right or left towards player
      sx > 0 ? turn_left : turn_right
    # If vertical distance is longer
    else
      # Turn up or down towards player
      sy > 0 ? turn_up : turn_down
    end
  end
end

#==============================================================================
# ** Game_Event
#==============================================================================

class Game_Event < Game_Character
  def over_trigger?
    if @character_name != "" and not @through
      return false
    end
    for coord in self.ch_area
      unless $game_map.passable?(coord[0], coord[1], 0)
        return false
      end
    end
    return true
  end
 
  def check_event_trigger_touch(x, y)
    # If event is running
    if $game_system.map_interpreter.running?
      return
    end
    for coord in self.new_ch_area(x,y)
      # If trigger is [touch from event] and consistent with player coordinates
      if @trigger == 2 and coord[0] == $game_player.x and coord[1] == $game_player.y
        # If starting determinant other than jumping is front event
        if not jumping? and not over_trigger?
          start
        end
      end
    end
   
  end
 
  def check_event_trigger_auto
    if @trigger == 2
      for coord in self.ch_area
        if coord == [$game_player.x, $game_player.y]
          if not jumping? and over_trigger?
            start
          end
        end
      end
    end
    if @trigger == 3
      start
    end
  end
 
  def refresh
    new_page = nil
    unless @erased
      for page in @event.pages.reverse
        c = page.condition
        if c.switch1_valid
          if $game_switches[c.switch1_id] == false
            next
          end
        end
        if c.switch2_valid
          if $game_switches[c.switch2_id] == false
            next
          end
        end
        if c.variable_valid
          if $game_variables[c.variable_id] < c.variable_value
            next
          end
        end
        if c.self_switch_valid
          key = [@map_id, @event.id, c.self_switch_ch]
          if $game_self_switches[key] != true
            next
          end
        end
        new_page = page
        break
      end
    end
    if new_page == @page
      return
    end
    setup_page(new_page)
  end
 
  def setup_page(new_page)
    @page = new_page
    clear_starting
    if @page == nil
      @tile_id = 0
      @character_name = ""
      @character_hue = 0
      @move_type = 0
      @through = true
      @trigger = nil
      @list = nil
      @interpreter = nil
      return
    end
    @tile_id = @page.graphic.tile_id
    @character_name = @page.graphic.character_name
    @character_hue = @page.graphic.character_hue
    if @original_direction != @page.graphic.direction
      @direction = @page.graphic.direction
      @original_direction = @direction
      @prelock_direction = 0
    end
    if @original_pattern != @page.graphic.pattern
      @pattern = @page.graphic.pattern
      @original_pattern = @pattern
    end
    @opacity = @page.graphic.opacity
    @blend_type = @page.graphic.blend_type
    @move_type = @page.move_type
    @move_speed = @page.move_speed
    @move_frequency = @page.move_frequency
    @move_route = @page.move_route
    @move_route_index = 0
    @move_route_forcing = false
    @walk_anime = @page.walk_anime
    @step_anime = @page.step_anime
    @direction_fix = @page.direction_fix
    @through = @page.through
    @always_on_top = @page.always_on_top
    @trigger = @page.trigger
    @list = @page.list
    @interpreter = nil
    if @trigger == 4
      @interpreter = Interpreter.new
    end
    check_event_trigger_auto
    get_list_codes
  end
 
  def get_list_codes
    result = check_for_comment(/CH_WIDTH (.+)/i)
    if result != false
      @ch_width = result.to_i
    end
    result = check_for_comment(/CH_HEIGHT (.+)/i)
    if result != false
      @ch_height = result.to_i
    end
  end
 
  def check_for_comment(regexp)
    return false if @list.nil?
    for item in @list
      if item.code == 108 or item.code == 408
        if !item.parameters[0][regexp].nil?
          return $1.nil? ? true : $1
        end
      end
    end
    return false
  end
end

#==============================================================================
# ** Game_Player
#==============================================================================

class Game_Player < Game_Character
  def check_event_trigger_here(triggers)
    result = false
    if $game_system.map_interpreter.running?
      return result
    end
    for event in $game_map.events.values
      if triggers.include?(event.trigger)
        if not event.jumping? and event.over_trigger?
          for coord in event.ch_area
            if coord == [@x, @y]
              event.start
              result = true
            end
          end
        end
      end
    end
    return result
  end

  def check_event_trigger_there(triggers)
    result = false
    if $game_system.map_interpreter.running?
      return result
    end
    new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
    new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
    for event in $game_map.events.values
      if triggers.include?(event.trigger)
        if not event.jumping? and not event.over_trigger?
          for coord in event.ch_area
            if coord == [new_x, new_y]
              event.start
              result = true
            end
          end
        end
      end
    end
    if result == false
      if $game_map.counter?(new_x, new_y)
        new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
        new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
        for event in $game_map.events.values
          if triggers.include?(event.trigger)
            if not event.jumping? and not event.over_trigger?
              for coord in event.ch_area
                if coord == [new_x, new_y]
                  event.start
                  result = true
                end
              end
            end
          end
        end
      end
    end
    return result
  end

  def check_event_trigger_touch(x, y)
    result = false
    triggers = [1, 2]
    if $game_system.map_interpreter.running?
      return result
    end
    for event in $game_map.events.values
      if triggers.include?(event.trigger)
        if not event.jumping? and not event.over_trigger?
          for coord in event.ch_area
            if coord == [x, y]
              event.start
              result = true
            end
          end
        end
      end
    end
    return result
  end
end

#==============================================================================
# ** Game_Map
#==============================================================================

class Game_Map
  def passable?(x, y, d, self_event = nil)
    unless valid?(x, y)
      return false
    end
    bit = (1 << (d / 2 - 1)) & 0x0f
    for event in events.values
      if event.tile_id >= 0 and event != self_event and not event.through
        for coord in event.ch_area
          if coord == [x, y]
            if @passages[event.tile_id] & bit != 0
              return false
            elsif @passages[event.tile_id] & 0x0f == 0x0f
              return false
            elsif @priorities[event.tile_id] == 0
              return true
            end
          end
        end
      end
    end
    for i in [2, 1, 0]
      tile_id = data[x, y, i]
      if tile_id == nil
        return false
      elsif @passages[tile_id] & bit != 0
        return false
      elsif @passages[tile_id] & 0x0f == 0x0f
        return false
      elsif @priorities[tile_id] == 0
        return true
      end
    end
    return true
  end
end

Salut!
avatar
orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6388

Gracias : 332

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Big Events System v1.1

Mensaje por Wecoc el 2017-05-15, 18:33

Añadido al post principal. ¡Gracias por el arreglo!
avatar
Wecoc
Administrador
Administrador



Créditos 9217

Gracias : 493

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Big Events System v1.1

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.