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 3817 miembros registrados.
El último usuario registrado es mendo89.

Nuestros miembros han publicado un total de 86235 mensajes en 12290 argumentos.

[XP][Tutorial] Efectos de estados al andar por el mapa

Ver el tema anterior Ver el tema siguiente Ir abajo

[XP][Tutorial] Efectos de estados al andar por el mapa

Mensaje por Wecoc el 2017-04-05, 10:56

El truco de hoy consiste en imitar el sistema "map slip damage" (daño en el mapa) de algunos estados, pero por engine.
Ya hice una imitación del efecto cuando expliqué el Engine de terreno del pantano, pero en ese caso era distinto porque iba por area y no había estado. En cambio en éste caso sí hay un estado alterado, solo que queremos su efecto más personalizado.

Efecto de estados en mapa

Lo que haremos es llamar a un evento común cada paso que hagamos, usando éste pequeño script donde tenemos que definir la ID del evento común.

Código:
#==============================================================================
# ** Step Common Event
#==============================================================================

class Game_Player < Game_Character
  alias wec_slip_dam_steps increase_steps unless $@
  def increase_steps
    wec_slip_dam_steps
    unless @move_route_forcing
      $game_temp.common_event_id = 1 # ID del Evento Común
    end
  end
end

class Interpreter
  def party_has_state?(id)
    return $game_party.actors.any? {|actor| actor.state?(id)}
  end
  def actors_with_state(id)
    return $game_party.actors.select {|actor| actor.state?(id)}
  end
end

Lo hacemos por script para asegurarnos de que ocurre solo cuando está andando, no cuando pulsamos teclas de dirección.

Luego es cuestión de montar el evento común. He hecho de ejemplo uno que tiene exactamente el mismo efecto que el Veneno, pero claro, la gracia está en personalizarlo.

Primero se comprueba si álguien del grupo tiene un cierto estado, usando ésto en condiciones y efectos:
party_has_state?(ID)
Luego se pone que solo ocurra cada x pasos (en el ejemplo cada 2):
$game_party.steps % 2 == 0

Luego en llamar script definimos el efecto del estado. Ésta es la parte un poco más complicada pero tampoco mucho, no os preocupéis xD En éste caso es más largo porque como el efecto es quitar vida, también añadimos que si uno de los protagonistas muere se aplique un sonido que lo indica. Queda así:

Código:
for actor in actors_with_state(2)
  actor.hp -= [actor.maxhp / 100, 1].max
  if actor.hp == 0
    c = $data_system.actor_collapse_se
    $game_system.se_play(c)
  end
end

Si fuera con SP por ejemplo no haría falta, solo habría que hacer ésto:

Código:
for actor in actors_with_state(2)
  actor.sp -= [actor.maxsp / 100, 1].max
end

Luego aplicamos los efectos de pantalla que queramos (flash, popup de daño, shake...)

Finalmente justo al final del engine añadimos una última llamada: Si todos han muerto debido al estado se va a Game Over

Código:
$game_temp.gameover = $game_party.all_dead?
return true

Queda así:

Spoiler:

Efecto de estados por turno

Os preguntaréis: Vale, para hacer ésto hay que quitar el efecto normal de veneno del estado, porque ya se efectúa su efecto en mapa por aquí.
Pero luego, ¿cómo se hace para que su efecto ocurra en batalla como antes?

La respuesta es: Haciendo lo mismo, llamando a otro evento común que imite el efecto en batalla.
Esto nos da nuevas opciones como hacer que en batalla y en mapa los efectos sean distintos (o que solo afecte en batalla, solo en mapa, etc)

Para hacerlo nuevamente insertaremos un pequeño script. Puede quedar en el mismo de antes, debajo de las líneas insertadas antes.
En éste tendremos que definir la ID de otro Evento Común

Código:
#==============================================================================
# ** Turn Common Event
#==============================================================================

class Scene_Battle
  def update_phase4_step1
    @help_window.visible = false
    return if judge
    if $game_temp.forcing_battler == nil
      setup_battle_event
      if $game_system.battle_interpreter.running?
        return
      end
    end
    if $game_temp.forcing_battler != nil
      @action_battlers.delete($game_temp.forcing_battler)
      @action_battlers.unshift($game_temp.forcing_battler)
    end
    if @action_battlers.size == 0
      start_phase2
      return
    end
    @animation1_id = 0
    @animation2_id = 0
    #---------------------------------------------------------------
    @common_event_id = 2 # ID del Evento Común
    if @common_event_id > 0
      common_event = $data_common_events[@common_event_id]
      $game_system.battle_interpreter.setup(common_event.list, 0)
    end
    #---------------------------------------------------------------
    @common_event_id = 0
    @active_battler = @action_battlers.shift
    if @active_battler.index == nil
      return
    end
    if @active_battler.hp > 0 and @active_battler.slip_damage?
      @active_battler.slip_damage_effect
      @active_battler.damage_pop = true
    end
    @active_battler.remove_states_auto
    @status_window.refresh
    @phase4_step = 2
  end
end

class Interpreter
  def active_battler
    if $scene.is_a?(Scene_Battle)
      return $scene.instance_eval("@active_battler")
    end
  end
end

En el evento común miraremos si el active_battler tiene el estado que nos interesa del siguiente modo:
active_battler.state?(2)

Y dentro de la condición pondremos el efecto.
Por defecto es bastante largo puesto que el daño en éste caso tiene dispersión.

Código:
actor = active_battler
# Aplicar daño
actor.damage = actor.maxhp / 10
# Dispersión
d = actor.damage.abs
if d > 0
  amp = [d * 15 / 100, 1].max
  actor.damage += rand(amp+1) +
    rand(amp+1) - amp
end
actor.hp -= actor.damage
return true

Finalmente mostramos el daño en pantalla con:

Código:
active_battler.damage_pop = true

Quedará así:

Spoiler:

Que no os asusten las llamadas de script, no son complicadas.
La libertad que tenéis haciéndolo así no se puede comparar con la del maker por defecto: cada estado puede tener un efecto distinto a vuestro gusto y podéis añadir cualquier componente de engine que se os ocurra para mejorar el efecto. Ésto es una de esas cosas que la gente no suele personalizar en sus proyectos, y vale la pena.

Saludos. Cualquier cosa, me lo decís.
avatar
Wecoc
Administrador
Administrador



Créditos 12103

Gracias : 522

Volver arriba Ir abajo

Re: [XP][Tutorial] Efectos de estados al andar por el mapa

Mensaje por Wecoc el 2017-04-18, 23:43

Aún a riesgo de desvirtuar un poco ésto, me comentaron que un buen añadido a la última parte de éste tutorial sería aplicar un efecto dinámico según el número de turnos, por ejemplo un veneno que cada turno hace más daño.

Para hacer eso una vez obtenido el actor con active_battler como en el ejemplo puesto, también habrá que obtener el número de turno de ese estado concreto por tal de usarlo en el cálculo de daño.

Siguiendo en el ejemplo en el que el ID del estado es 2, pongo aquí el pedacito de código necesario para obtener el número de turnos que lleva activo el estado:

Código:
actor = active_battler
st = actor.instance_eval("@states_turn")
turn = $data_states[2].hold_turn - st[2]

Como véis la ID del estado sale dos veces, en la última línea, y es lo único que hay que cambiar ahí. Una vez hecho eso puedes aplicar el daño de forma similar a como se puso en el tutorial pero usando la variable turn, por ejemplo:

Código:
actor.damage = (turn + 1) * 100

Y luego más te vale curar pronto ese veneno porque la cosa va a peor ;(
avatar
Wecoc
Administrador
Administrador



Créditos 12103

Gracias : 522

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.