Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP][Tutorial] Enemigos estilo los malos de Doctor Who

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP][Tutorial] Enemigos estilo los malos de Doctor Who

Mensaje por Wecoc el 2018-10-02, 14:39

Pese que personalmente no soy un gran fan de Doctor Who, no he podido evitar fijarme en que muchos de los monstruos míticos que salen en la serie tienen conceptos interesantes detrás, originales y a la vez recreables (quizá parcialmente) en juegos RPG.

En este topic raro voy a explicar como hacer algunos de ellos usando scripts ya existentes o bien en muchos casos creando pequeños códigos específicos para cada uno de esos monstruos. Lo que se pretende no es hacer el monstruo en sí sino generalizar su idea para aplicarla en un enemigo RPG.

1. The Silence

The Silence son unos monstruos que no pueden ser recordados. Por ese motivo durante una batalla éstos seres no pueden ser atacados directamente, ni con ataques físicos ni con magias ofensivas. A cambio, cuando son atacados los actores tienen una probabilidad de contraataque rápido lo cual permite ganar el enemigo.

Este concepto es bastante complejo y requiere dos scripts a parte.
El primero es el script Immediate Action (solo el principal, los añadidos no hacen ninguna falta)
Este primer script se usa para la parte de contraataque automático. En el topic original puse un añadido para contraataques pero en este caso la aplicación es aún más simple así que no hace falta. Al final del script solo tenéis que añadir algo como esto.

Código:
#==============================================================================
# ** [XP] Immediate Action - The Silence
#------------------------------------------------------------------------------
# Esto solo es un ejemplo de implementación del script Immediate Action
# Contra-ataque simple contra un determino ID enemigo
#==============================================================================

class Scene_Battle
  alias thesilence_p4s6 update_phase4_step6 unless $@
  def update_phase4_step6
    if @active_battler.is_a?(Game_Enemy)
      if @active_battler.id == 1 # Set here the enemy ID
        for actor in @target_battlers
          if actor.is_a?(Game_Actor) && actor.exist?
            # Set here the probability of counter attack
            # It can depend on actor's attributes (actor.dex, actor.agi...)
            # or can vary between actors (actor.id)
            prob = 50
            # Apply the action
            if rand(100) < prob
              immediate_action(actor, @active_battler.get_index, 0, 0)
              return true
            end
          end
        end
      end
    end
    thesilence_p4s6
  end
end

Como veis lo único a cambiar ahí es la ID del enemigo que tiene esta propiedad especial y la probabilidad de contraataque, en el ejemplo 50%.
A parte de eso podéis añadir más condiciones según el concepto que tengáis en mente para el enemigo, o podéis cambiar el immediate_action para que en vez de atacar se haga alguna habilidad.

El segundo script es el Monster-based Scope
Este sirve para impedir que los actores puedan atacar al monstruo.

Solo tenéis que configurar la ID del monstruo y su condición al principio del script, en SCOPE_CONDITION.
Nunca podrá ser atacado directamente así que su condición simplemente es false.

[line]SCOPE_CONDITION = {
  1 => "false"
}[/line]

Podéis poner una condición más compleja (por ejemplo sí poder atacarlo si tienes un equipo o estado especial), para casos así leed el topic original del script o bien preguntadlo ahí.

2. The Foretold

The Foretold es un monstruo que solo pueden ver (y atacar) aquellos que están a punto de morir.

La parte de atacar solo bajo la condición de poca vida vuelve a ser factible usando Monster-based Scope.

[line]SCOPE_CONDITION = {
  1 => "actor.hp < 100" # Set here the HP
}[/line]

Como veis en el ejemplo solo pueden atacarle los que tienen un HP menor de 100.
En vez de un número fijo se puede usar un porcentaje por ejemplo menor de actor.maxhp * 20 / 100 (es decir menor de un 20% del HP)

Con esto tenemos la parte principal del enemigo resuelta, pero puede que queramos que literalmente el enemigo no sea visible excepto cuando puede ser atacado.
En este caso necesitamos un añadido al final del script, os lo pongo a continuación. Lo único que tenéis que cambiarle es el principio para asignar la ID del enemigo correcta.

Código:
#==============================================================================
# ** [XP] Monster-based Scope - The Foretold
#==============================================================================

module Doctor_Who
  FORETOLD_ENEMIES = [1] # Set here the Enemy IDs of Foretold monsters
end

class Sprite_Battler
  unless $@
    alias foretold_ini initialize
    alias foretold_appear appear
    alias foretold_hide escape
    alias foretold_whiten whiten
  end
  
  def is_foretold?
    if self.battler.is_a?(Game_Enemy)
      return Doctor_Who::FORETOLD_ENEMIES.include?(self.battler.id)
    end
    return false
  end
  
  def initialize(*args)
    foretold_ini(*args)
    self.opacity = 0 if self.is_foretold?
  end
  
  def appear
    return if self.is_foretold?
    foretold_appear
  end
  
  def whiten
    foretold_whiten
    self.opacity = 0 if self.is_foretold?
  end
end

class Scene_Battle
  def hide_foretold(force=false)
    for enemy in @spriteset.instance_eval("@enemy_sprites")
      if Doctor_Who::FORETOLD_ENEMIES.include?(enemy.battler.id)
        if force
          enemy.opacity = 0
        else
          enemy.foretold_hide if enemy.opacity == 255
        end
      end
    end
  end

  def refresh_foretold
    targets = get_selectable_enemies(@active_battler.current_action.kind)
    for enemy in @spriteset.instance_eval("@enemy_sprites")
      if Doctor_Who::FORETOLD_ENEMIES.include?(enemy.battler.id)
        if enemy.opacity == 0 && targets.include?(enemy.battler.index)
          enemy.foretold_appear
        elsif enemy.opacity == 255 && !targets.include?(enemy.battler.index)
          enemy.foretold_hide
        end
      end
    end
  end
  
  alias foretold_next_actor phase3_next_actor unless $@
  def phase3_next_actor
    foretold_next_actor
    if @active_battler.nil?
      hide_foretold
      return
    end
    refresh_foretold
  end
  
  alias foretold_prior_actor phase3_prior_actor unless $@
  def phase3_prior_actor
    foretold_prior_actor
    if @active_battler.nil?
      hide_foretold
      return
    end
    refresh_foretold
  end
end

Nótese que en verdad se puede generalizar a cualquier condición, si se quieren monstruos visibles solo en cierto caso. Un ejemplo serían los caballos que aparecen en Harry Potter, que solo son vistos por quien ha presenciado la muerte de cerca (lo cual podría recrearse por trama y usando el actor.id en la condición).

Pronto pondré algún monstruo más.
avatar
Wecoc
Administrador
Administrador



Créditos 12314

Gracias : 655

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.