Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Advanced Map Encounters

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Advanced Map Encounters

Mensaje por Wecoc el 2016-10-01, 22:48

El script de hoy permite asignar algo que siempre me molestó que no estuviera en el RPG maker por defecto: Hacer que en un mapa haya encuentros enemigos más probables que otros. Hay otros scripts que arreglan ésto, pero quise hacer uno sencicilillo y lo más intuitivo posible, a parte de ponerle algunas cosas únicas.

Los encuentros asignados en el mapa siguen funcionando básicamente igual, simplifiqué la fórmula de encuentro (ahora es un poco más azaroso cuando te los encontrarás, pero igual de probable al fin y al cabo), pero lo importante es que puedes asignar encuentros a mano mediante un evento controlando los pasos necesarios para ese encuentro. Permitir o no encuentros también funciona igual, así como pulsar CTRL en modo Debug.

Para asignar un encuentro desde un evento usad:
$game_map.set_encounter(TROOP ID, STEPS) (STEPS debe ser entre 1 y 999)

Por ejemplo: $game_map.set_encounter(1, 30)

Si ya sabéis que ese encuentro está definido y queréis quitarlo dada alguna circunstancia, es lo mismo pero con clear, así:
$game_map.clear_encounter(TROOP ID, STEPS)
Desafortunadamente ésto solo funciona con los que se asignaron mediante evento, pero todo se almacena en la array $game_map.encounters de modo que sabiendo un poco de script se puede controlar de modo más preciso la lista de encuentros.

Ponedlo encima de main:

Código:
#==============================================================================
# ** Advanced Map Encounters v1.2
#------------------------------------------------------------------------------
#  Autor: Wecoc - No requiere créditos
#==============================================================================

#==============================================================================
# ** RPG encounter rates
#==============================================================================

module RPG
  for Klass in [Actor, Item, Weapon, Armor, State]
    class Klass
      attr_accessor :encounter_rate
      define_method(:encounter_rate) { @encounter_rate ||= 1.0}
    end
  end
end

#==============================================================================
# ** Game_Actor
#==============================================================================

class Game_Actor < Game_Battler
  def encounter_rate
    result = $data_actors[@actor_id].encounter_rate
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    result *= weapon.encounter_rate if weapon != nil
    result *= armor1.encounter_rate if armor1 != nil
    result *= armor2.encounter_rate if armor2 != nil
    result *= armor3.encounter_rate if armor3 != nil
    result *= armor4.encounter_rate if armor4 != nil
    for state in @states
      state = $data_states[state]
      result *= state.encounter_rate if state != nil
    end
    return result
  end
end

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

class Game_Map
  attr_reader :encounters
  #--------------------------------------------------------------------------
  # * Setup
  #--------------------------------------------------------------------------
  alias adv_encounter_setup setup unless $@
  def setup(map_id)
    adv_encounter_setup(map_id)
    @encounters = []
    # Definir los encuentros asignados por defecto en el mapa
    encounter_list = @map.encounter_list
    encounter_steps = @map.encounter_step * encounter_list.size
    for troop_id in encounter_list
      set_encounter(troop_id, encounter_steps, nil)
    end
  end
  #--------------------------------------------------------------------------
  # * Limpiar lista de enemigos default
  #--------------------------------------------------------------------------
  def encounter_list
    return []
  end
  #--------------------------------------------------------------------------
  # * Limpiar pasos para encuentro default
  #--------------------------------------------------------------------------
  def encounter_step
    return 0
  end
  #--------------------------------------------------------------------------
  # * Añadir nuevo encuentro
  #--------------------------------------------------------------------------
  def set_encounter(troop_id, steps, area=nil)
    steps = [[1, steps].max, 999].min
    @encounters.push([troop_id, 1.0 / steps, area])
    @encounters.uniq!
    @encounters.sort!{|b,a| b[1] - a[1]}
  end
  #--------------------------------------------------------------------------
  # * Limpiar encuentro
  #--------------------------------------------------------------------------
  def clear_encounter(troop_id, steps, area=nil)
    steps = [[1, steps].max, 999].min
    @encounters.delete!([troop_id, 1.0 / steps, area])
  end
end

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

class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # * Incrementar pasos
  #--------------------------------------------------------------------------
  alias adv_encounter_steps increase_steps unless $@
  def increase_steps
    adv_encounter_steps
    return if $DEBUG && Input.press?(Input::CTRL)
    return if $game_system.encounter_disabled == true
    rate = 1.0
    for actor in $game_party.actors
      rate *= actor.encounter_rate
    end
    for i in 1...$data_items.size
      if $game_party.item_number(i) > 0
        $game_party.item_number(i).times do
          rate *= $data_items[i].encounter_rate
        end
      end
    end
    return if rate == 0
    $game_map.encounters.each do |encounter|
      get_encounter_data(encounter, rate)
      return if $game_temp.battle_calling
    end
  end
  #--------------------------------------------------------------------------
  # * Evaluar la información de cada encuentro
  #--------------------------------------------------------------------------
  def get_encounter_data(encounter, rate)
    troop_id = encounter[0]
    return if $data_troops[troop_id] == nil
    ratio = encounter[1] * (1.0 / rate)
    encounter_area = encounter[2]
    if Game_Player.method_defined?(:area) && encounter_area != nil
      next if self.area != encounter_area
    end
    if rand < ratio
      # Empezar batalla
      $game_temp.battle_calling = true
      $game_temp.battle_troop_id = troop_id
      $game_temp.battle_can_escape = true
      $game_temp.battle_can_lose = false
      $game_temp.battle_proc = nil
    end
  end
end

#==============================================================================
# ** Game_Temp
#==============================================================================

class Game_Temp
  attr_accessor :force_battleback
  alias area_battleback_ini initialize unless $@
  def initialize
    area_battleback_ini
    @force_battleback = false
  end
end

#==============================================================================
# ** Game_Map (Battleback Areas)
#==============================================================================

class Game_Map
 
  BATTLEBACK_AREAS = {} # {AREA ID => 'BATTLEBACK NAME'}
 
  def battleback_name
    return @battleback_name if $game_temp.force_battleback == true
    area = $game_player.area rescue 0
    battleback_area = BATTLEBACK_AREAS[area]
    return battleback_area if !battleback_area.nil?
    return @battleback_name
  end
end

Extra (1):

¡Si estáis usando Area Support podéis asignar encuentros por area!
Para ello solo hay que añadir un último número en los métodos que he puesto antes, que será el ID del área.
Por ejemplo: $game_map.set_encounter(1, 30, 1)
Haciéndolo así ese encuentro solo ocurrirá si el personaje se encuentra en esa área concreta.

Y también podéis asignar battlebacks por área, solo tenéis que buscar ésta línea:
BATTLEBACK_AREAS = {}
Y ponerle para cada ID de area que interese el nombre de battleback que usará, por ejemplo:
BATTLEBACK_AREAS = {1 => '001-Grassland01'}

Finalmente podéis controlar in-game si eso se tiene en cuenta o si se usa el battleback del mapa indiferentemente del área.
Para ello usad: $game_temp.force_battleback = true / false

Extra (2):

Se puede asignar encounter rates a diferentes cosas de la base de datos de modo que afecten a los pasos por encuentro.

$data_actors[ID].encounter_rate = 1.0 # Actor (cuando está en la party)
$data_items[ID].encounter_rate = 1.0 # Item (teniendo en cuenta el número de ese item que posee la party)
$data_weapons[ID].encounter_rate = 1.0 # Arma (debe estar equipada)
$data_armors[ID].encounter_rate = 1.0 # Protector (debe estar equipado)
$data_states[ID].encounter_rate = 1.0 # Estado alterado


Última edición por Wecoc el 2017-11-01, 04:36, editado 2 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12286

Gracias : 646

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Advanced Map Encounters

Mensaje por Wecoc el 2016-10-29, 20:47

Hace un tiempo encontré por la red un script compatible con éste que me pareció interesante, y ahora lo he rescatado de entre mis archivos. Es de uso libre, se desconoce su autor original (creo que yo le cambié algún detalle) pero se puede usar igualmente sin problemas.

Lo que hace es definir en ciertos terrain tag que el contador de pasos no incremente.
Para ello buscad la línea @encounter_tags = [1] y poned ahí los terrain tags que interesen.

Código:
# RPG Maker XP - Terrain Tags with disabled Encounter Count

class Game_System
  attr_accessor :encounter_tags
  alias no_encounter_ini initialize unless $@
  def initialize
    no_encounter_ini
    @encounter_tags = [1]
  end
end

class Game_Player < Game_Character
  def update
    last_moving = moving?
    update_move_input
    last_real_x = @real_x
    last_real_y = @real_y
    super
    get_scroll(last_real_x, last_real_y)
    unless moving?
      if last_moving
        update_encounter_count
      end
      if Input.trigger?(Input::C)
        check_event_trigger_here([0])
        check_event_trigger_there([0,1,2])
      end
    end
  end
  
  def update_move_input
    unless moving? or $game_system.map_interpreter.running? or
           @move_route_forcing or $game_temp.message_window_showing
      case Input.dir4
        when 2 then move_down
        when 4 then move_left
        when 6 then move_right
        when 8 then move_up
      end
    end
  end
  
  def get_scroll(last_real_x, last_real_y)
    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
      $game_map.scroll_down(@real_y - last_real_y)
    end
    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
      $game_map.scroll_left(last_real_x - @real_x)
    end
    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
      $game_map.scroll_right(@real_x - last_real_x)
    end
    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
      $game_map.scroll_up(last_real_y - @real_y)
    end
  end
  
  def update_encounter_count
    result = check_event_trigger_here([1,2])
    if result == false
      unless $DEBUG and Input.press?(Input::CTRL)
        terrain_tag = $game_map.terrain_tag(self.x, self.y)
        if !$game_system.encounter_tags.include?(terrain_tag)
          if @encounter_count > 0
            @encounter_count -= 1
          end
        end
      end
    end
  end
end
avatar
Wecoc
Administrador
Administrador



Créditos 12286

Gracias : 646

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Advanced Map Encounters

Mensaje por Wecoc el 2017-11-01, 04:57

He actualizado el script Advanced Map Encounters a la versión 1.2.

La parte del principio está un poco más límpia y el método increase_steps está separado en dos de modo que es más fácil de controlar (hacerle cambios añadidos). No es una gran actualización pero permite el add-on que pondré a continuación.

Encounter Conditions

Da la opción de añadir una condición extra para evaluar a cada uno de los encuentros.

Es decir, ahora puedes hacer lo siguiente:
$game_map.set_encounter(ID de tropa, Nº de pasos, Area, Condición)

Area y Condición son opcionales y valen nil por defecto.

Ejemplo:
$game_map.set_encounter(1, 20, nil, "$game_switches[1] == true")

Eso significa que un determinado encuentro enemigo solo puede suceder si el interruptor 1 está activado.
El eval puede ser cualquier condición. Para quitar un determinado encuentro con clear_encounter tal como ya se explicó, se recomienda usar exactamente los mismos argumentos que hayas usado para definirlo, incluyendo area y condición.

Código:
#==============================================================================
# ** [XP] Encounter Conditions
#------------------------------------------------------------------------------
# Autor: Wecoc (no requiere créditos)
# Este script requiere el Advanced Map Encounters v1.1
# Es un añadido que permite definir condiciones por script a los encuentros
#==============================================================================

class Game_Map
  def set_encounter(troop_id, steps, area=nil, condition=nil)
    steps = [[1, steps].max, 999].min
    @encounters.push([troop_id, 1.0 / steps, area, condition])
    @encounters.uniq!
    @encounters.sort!{|b,a| b[1] - a[1]}
  end
  def clear_encounter(troop_id, steps, area=nil, condition=nil)
    steps = [[1, steps].max, 999].min
    @encounters.delete!([troop_id, 1.0 / steps, area, condition])
  end
end

class Game_Player
  alias condition_encounter_data get_encounter_data unless $@
  def get_encounter_data(encounter, rate)
    if encounter[3] != nil
      return if eval(encounter[3]) == false
    end
    condition_encounter_data(encounter, rate)
  end
end

Podéis comentarme dudas si tenéis alguna. Si la duda es "¿Por qué haces necropost de más de un año?" entonces

GET OUTTA HERE

, estoy aportando :V
avatar
Wecoc
Administrador
Administrador



Créditos 12286

Gracias : 646

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Advanced Map Encounters

Mensaje por xXIsrael0499Xx el 2017-11-01, 08:59

Oh muy bueno, es algo molesto no poder controlar del todo los encuentros por mapa, es lo que hace a este script tan útil y eso, y me llama la atención que ahora con la versión 1.2 se pueda hacer:
$game_map.set_encounter(ID de tropa, Nº de pasos, Area, Condición)
Es decir esta genial, podrías cambiar los encuentros de una manera genial y dividir el mapa o que se yo, no se estas tonterías así me gustan.

Así que bueno gracias y eso. +1 Warrior
avatar
xXIsrael0499Xx
Veterano
Veterano

0/3

Créditos 2047

Gracias : 113

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Advanced Map Encounters

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.