Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Automatic Battle Actions

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Automatic Battle Actions

Mensaje por AsFzKakarotto el 2018-04-28, 20:21

Bien, ahora sigamos con los aportes...les traigo un sistema que lo he puesto en el tema de Pedidos hace ya un buen tiempo
atrás, en ese entonces me dierón un script que cumplió fielmente su tarea pero tenia unas cuantas fallas que de hecho el mismo
que me ayudo, los dijo que tenia, lo deje para solucionarlo con mis métodos locos (el sea como sea xd) y finalmente lo deje abandonado entre los infinitos archivos revueltos que tengo por allí (No es un desorden, es que son muchos enserio). Es nada más y nada menos que un sistema que permite que uno o más de nuestros aliados, puedan luchar automáticamente y no me refiero al típico script que añade el botón que aparece en:

Luchar - Escapar - Auto batalla

¡¡NO!! si no que me refiero a uno de los sistemas que tenia Rpg maker 2003 en su base de datos (que por cierto también lo
heche bastante de menos) el sistema automatico en que simula que uno o más de nuestros héroes (previamente personalizados)
sean controlados por el ordenador mientras que otros los sigue controlando el jugador.

Este sistema no es el mismo que me dierón, pero aun así es bastante completo y bueno, ya que puede ser compatible con la batalla
default del maker XP o con batallas de luchas laterales. Intenta a probar para ver si funciona en tu sistema, obviamente tiene
que pertenecer a la regla de batalla por turnos para funcionar correctamente.

También el sistema nos abre a un sin fin de personalizaciones para cada conducta.
Puede hacer que un luchador automático utilice los siguientes comandos:

- Ataque
- Defiender
- Habilidad
- Objetos

Características Especiales...

Ademas puede usar habilidades u objetos específicos, señalando atravez de las ID cual es el que debe utilizar.

Permite dar un control a las probabilidades de cada acción. Ejemplo, si quieres que ataque muchas veces o defienda mucho más.

Puedes especificar a que objetivo llegar, ya sea enemigos fuertes o enemigos heridos, aliados, etc.

Y por si fuera poco, también permite cambiar completamente el comportamiento del personaje atravez de los patrones.
Simplemente al cambiar una variable especificada puedes hacer que un personaje que atacaba bastante, se disponga a ofrecer
pociones a sus compañeros de una manera más constante que atacar.

Aquí les dejo el Script:

Código:
#==============================================================================
# ** Acciones de lucha automáticas
#==============================================================================
# Autor: Claimh
# Traducción al Castellano: AsFzKakarotto
#------------------------------------------------------------------------------
#  Automaticamente puede luchar solo un personaje especificado
#------------------------------------------------------------------------------
#  Usted puede ajustar el desempeño o caracteristica de un personaje
#  automatico, dentro de un [EVENTO DEL MAPA] utililizando el siguiente
#  llamado de script:
#
#  $game_actors[Actor ID].auto_play = true/nil
#
#     true  : Configura que el actor lleve a cabo
#             las acciones de lucha automáticamente.
#     nil   : Cancela la función de acción de lucha automática.
#
#  NOTA por DERVVULFMAN:
#  Antes, el código fue puesto en la lista de script como:
#
#  $game_actors[Actor ID].auto_play = true/false
#
#   ... solamente RGSS tiene un defecto en sí que "Paraliza" el sistema cuando
#  se cambia de los eventos de mapa a "false".  Lo verifiqué y "nil" trabaja
#  muy bien.

#------------------------------------------------------------------------------
# * Cambiando las acciones de lucha automáticas.
# El PT_SW puede ser usado en el juego para cambiar la lista de movimientos
# definidos de un actor a otro. Si ningún patrón (Pattern) de lucha combina,
# se lleva a cabo las acción de "Defender".
#------------------------------------------------------------------------------

module AutoPlayer
  AUTO_MODE   = []
  PT_SW       = []
  RATING_PLUS = 5
  RETRY_TIME  = 10
  
#------------------------------------------------------------------------------
# ** Personalización de Parametros
#------------------------------------------------------------------------------
  # Configurar un persoanje automatico (Solo NPCs, ningún jugador los controla)
  # AUTO_PLAYER = [Actor ID, ...]
  AUTO_PLAYER = [1, 3]

  # Las variables para cambiar el patrón (Pattern) de acción automático.
  # PT_SW[Actor ID] = Variable ID
  PT_SW[1] = 1
  PT_SW[2] = 2
  PT_SW[7] = 7
  PT_SW[8] = 8

  # El (%) de configuración de HP que determina la condición de Herido/Muerto
  CRISIS = 25

#-------------------------------------------------------------------------------
# ** Ajuste de patrón de conducta automática
#-------------------------------------------------------------------------------
# Aquí usted puede poner los patrones de acción para sus battlers. El
# comportamiento puede ser determinado para responder sobre la base de una
# balanza de "Clasificación". Usted puede configurar preferentemente las
# condiciones y es recomendado ir no más alto que 10.
#-------------------------------------------------------------------------------
# Nombre constante = [
#  Clasificación (1 a 10),
#  Prioridad    (0: Sin Prioridad,  1: Aliados Heridos,  2: Enemigos Muertos),
#  Tipo de acción     (0: Atacar,  1: Defender,  2: Habilidad,  3: Artículo),
#  Habilidad/Artículo (nil, Valor ID a usar, o si no funciona Ataca o Defiende),
#  Objetivo   (0: Aleatorio,  1: Objetivo/HP más bajo,  2: Objetivo/HP más alto)
#  ]
#
# En la Siguiente Manera:
# [Clasificación, Prioridad, Tipo de acción, Habilidad/Artículo ID, Objetivo]
#===============================================================================
# · Actor 1
#===============================================================================
# Patrón 0
AT_PATTERN_1_0 = [
[5, 0, 0, nil, 0],  # Clasific. 5: Sin P.: Ataque Normal : Aleatorio
[2, 0, 2,  57, 2],  # Clasific. 2: Sin P.: Habilidad 57  : Objetivo/HP alto
[1, 0, 1, nil, 0]   # Clasific. 1: Sin P.: Defender
]
# Patrón 1
AT_PATTERN_1_1 = [
[2, 0, 0, nil, 0],  # Clasific. 2: Sin P.: Ataque Normal : Aleatorio
[5, 0, 2, nil, 0]   # Clasific. 5: Sin P.: Defender
]
#===============================================================================
# · Actor 2
#===============================================================================
# Patrón 0
AT_PATTERN_2_0 = [
[5, 0, 0, nil, 0],  # Clasific. 5: Sin P.: Ataque Normal : Aleatorio
[1, 0, 0, nil, 1],  # Clasific. 1: Sin P.: Defender
[2, 0, 2,   7, 2]   # Clasific. 2: Sin P.: Habilidad 7   : Objetivo/HP alto
]
# Patrón 1
AT_PATTERN_2_1 = [
[2, 0, 0, nil, 0],  # Clasific. 2: Sin P.: Ataque Normal : Aleatorio
[5, 0, 2, nil, 0]   # Clasific. 5: Sin P.: Defender
]
#===============================================================================
# · Actor 7
#===============================================================================
# Patrón 0
AT_PATTERN_7_0 = [
[5, 0, 0, nil, 1],  # Clasific. 5: Sin P.: Ataque Normal : Objetivo/HP bajo
[2, 0, 1, nil, 0],  # Clasific. 2: Sin P.: Defender
[3, 1, 2,   1, 1]   # Clasific. 3: Aliados H.: Habilidad 1: Objetivo/HP bajo
]
# Patrón 1
AT_PATTERN_7_1 = [
[2, 0, 1, nil, 0],  # Clasific. 2: Sin P.: Defender
[5, 1, 2,   1, 1]   # Clasific. 5: Aliados H.: Habilidad 1: Objetivo/HP bajo
]
#===============================================================================
# · Actor 8
#===============================================================================
# Patrón 0
AT_PATTERN_8_0 = [
[5, 0, 0, nil, 1],  # Clasific. 5: Sin P.: Ataque Normal : Objetivo/HP bajo
[3, 2, 0, nil, 1],  # Clasific. 2: Enemigos M.: Ataque Normal: Objetivo/HP bajo
[1, 0, 1, nil, 0]   # Clasific. 1: Sin P.: Defender
]
# Patrón 1
AT_PATTERN_8_1 = [
[2, 0, 0, nil, 1],  # Clasific. 2: Sin P.: Ataque Normal : Objetivo/HP bajo
[5, 0, 2, nil, 0]   # Clasific. 5: Sin P.: Defender
]
#===============================================================================
#-------------------------------------------------------------------------------
# * Ajuste de conducta automática
#     Ajuste del patrón de conducta de cada personaje
#-------------------------------------------------------------------------------
# AUTO_MODE[Actor ID] = {
#   PT_SW[Actor ID] => Patrón de Acción
#   }
#
#   Esto asigna un valor en PT_SW para efectuar un patrón de acción.  
#   Cuando el valor es escogido, funciona el patrón.
#
#-------------------------------------------------------------------------------
#===============================================================================
# · Actor 1
#===============================================================================
  AUTO_MODE[1] = {
    0 => AT_PATTERN_1_0,    # Actor 1: Pattern 0
    1 => AT_PATTERN_1_1     # Actor 1: Pattern 1
  }

#===============================================================================
# · Actor 2
#===============================================================================
  AUTO_MODE[2] = {
    0 => AT_PATTERN_2_0,    # Actor 2: Pattern 0
    1 => AT_PATTERN_2_1     # Actor 2: Pattern 1
  }

#===============================================================================
# · Actor 7
#===============================================================================
  AUTO_MODE[7] = {
    0 => AT_PATTERN_7_0,    # Actor 7: Pattern 0
    1 => AT_PATTERN_7_1     # Actor 7: Pattern 1
  }

#===============================================================================
# · Actor 8
#===============================================================================
  AUTO_MODE[8] = {
    0 => AT_PATTERN_8_0,    # Actor 8: Pattern 0
    1 => AT_PATTERN_8_1     # Actor 8: Pattern 1
  }

#------------------------------------------------------------------------------
end


#==============================================================================
# ** Scene_Battle
#==============================================================================
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor   :auto_play                 # Automatic conduct
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     actor_id : Actor ID
  #--------------------------------------------------------------------------
  alias init_auto_chara initialize
  def initialize(actor_id)
    init_auto_chara(actor_id)
    @auto_play = AutoPlayer::AUTO_PLAYER.include?(actor_id)
  end
  #--------------------------------------------------------------------------
  # * Determine if Command is Inputable
  #--------------------------------------------------------------------------
  def inputable?
    ret = super
    ret = false if @auto_play
    return ret
  end
end


#==============================================================================
# ** Scene_Battle
#==============================================================================
class Scene_Battle
  #--------------------------------------------------------------------------
  # * Frame Update (main phase step 2 : start action)
  #--------------------------------------------------------------------------
  alias update_phase4_step2_auto_player update_phase4_step2
  def update_phase4_step2
    # If battler set to 'Automatic'?
    if @active_battler.is_a?(Game_Actor) and @active_battler.auto_play
      make_auto_player_actions
    end
    update_phase4_step2_auto_player
  end
  #--------------------------------------------------------------------------
  # * Make Auto Player Actions
  #--------------------------------------------------------------------------
  def make_auto_player_actions
    # Obtain Conduct Pattern
    action_motion = at_judge_auto_pattern?
    return if action_motion.nil?  # Return if no pattern
    #
    # A loop for the RETRY_TIME of an actor
    for i in 0...AutoPlayer::RETRY_TIME
      # Process conduct action
      action = make_auto_play_pattern(action_motion)
      # if no conduct pattern
      if action.nil?
        # Perform defend action
        @active_battler.current_action.kind = 0
        @active_battler.current_action.basic = 3
        return
      end
      # Obtain the conduct action
      ret = make_auto_play_motion(action)
      return if ret   # Return with the action
    end
    # Set the battler to 'defend' if no conduct selected
    @active_battler.current_action.kind = 0
    @active_battler.current_action.basic = 3
  end
  #--------------------------------------------------------------------------
  # * Determine Automatic Action
  #--------------------------------------------------------------------------
  def at_judge_auto_pattern?
    # If there is no pattern.
    vari = $game_variables[AutoPlayer::PT_SW[@active_battler.id]]
    if AutoPlayer::AUTO_MODE[@active_battler.id].nil? or vari.nil?
      # Perform 'defend' action
      @active_battler.current_action.kind = 0
      @active_battler.current_action.basic = 3
      return nil
    end
    action_motion = AutoPlayer::AUTO_MODE[@active_battler.id][vari]
    # if there is no pattern
    if action_motion.nil?
      # Perform 'defend' action
      @active_battler.current_action.kind = 0
      @active_battler.current_action.basic = 3
      return nil
    end
    return action_motion
  end
  #--------------------------------------------------------------------------
  # * Determine if Fellow Party Member is Critical
  #--------------------------------------------------------------------------
  def at_judge_party_crisis?
    for actor in $game_party.actors
      # Dying state?
      if actor.hp <= (actor.maxhp * AutoPlayer::CRISIS / 100)
        return true
      end
    end
    return false
  end
  #--------------------------------------------------------------------------
  # * Determine if Fellow Troop Member is Critical
  #--------------------------------------------------------------------------
  def at_judge_enemy_crisis?
    for enemy in $game_troop.enemies
      # Dying state?
      if enemy.hp <= (enemy.maxhp * AutoPlayer::CRISIS / 100)
        return true
      end
    end
    return false
  end
  #--------------------------------------------------------------------------
  # * Make Auto Play Pattern
  #--------------------------------------------------------------------------
  def make_auto_play_pattern(action_pattern)
    # Determine priority condition
    pt_crisis = at_judge_party_crisis?
    tr_crisis = at_judge_enemy_crisis?
    # Rating total value
    total_rating = 0
    rating_box = []
    for i in 0...action_pattern.size
      rating_plus = 0
      case action_pattern[i][1]
      when 0    # No priority
      when 1    # Friend injured
        rating_plus = AutoPlayer::RATING_PLUS if pt_crisis
      when 2    # Enemy injured
        rating_plus = AutoPlayer::RATING_PLUS if tr_crisis
      else
        p "Error de Configuración. Patrón de conducta :: [Prioridad]"
        exit
      end
      rating_box[i] = action_pattern[i][0] + rating_plus
      total_rating += rating_box[i]
    end
    # Select conduct with rating
    rating_randam = rand(total_rating)
    before_rating = 0
    for i in 0...action_pattern.size
      if rating_randam < (rating_box[i] + before_rating)
        return action_pattern[i]
      end
      before_rating += rating_box[i]
    end
    return nil    # Return if failed to perform action
  end
  #--------------------------------------------------------------------------
  # * Make Auto Play Motion
  #--------------------------------------------------------------------------
  def make_auto_play_motion(action)
    ret = true
    case action[2]
    when 0  # Normal Attack
      @active_battler.current_action.kind = 0
      @active_battler.current_action.basic = 0
      ret = make_auto_play_target(action[4], 1)
    when 1  # Defend
      @active_battler.current_action.kind = 0
      @active_battler.current_action.basic = 1
    when 2  # Skill
      @active_battler.current_action.kind = 1
      @active_battler.current_action.skill_id = skill_id = action[3]
      # Redo when you cannot use skill
      return nil unless @active_battler.skill_can_use?(skill_id)
      # Select Target
      ret = make_auto_play_target(action[4], $data_skills[skill_id].scope)
    when 3  # Item
      @active_battler.current_action.kind = 2
      @active_battler.current_action.item_id = item_id = action[3]
      # Redo when you cannot use item
      return nil if $game_party.item_number(item_id) == 0
      # Select Target
      ret = make_auto_play_target(action[4], $data_items[item_id].scope)
    else
      p "Error de Configuración. Patrón de conducta :: [Tipo de acción]"
      exit
    end
    return ret
  end
  #--------------------------------------------------------------------------
  # * Make Auto Play Target
  #     mode  : mode of action
  #     scope : effect scope for action
  #--------------------------------------------------------------------------
  def make_auto_play_target(mode, scope)
    case scope
    when 0, 2, 4, 6, 7   # Multiple targets are chosen.
      @active_battler.current_action.target_index = 0
    else  # Individual target is chosen.
      # Target selection
      case mode
      when 0  # Chose random target
        case scope
        when 1    # Enemy
          @active_battler.current_action.target_index = make_randum_target($game_troop.enemies)
        when 3, 5 # Friend
          @active_battler.current_action.target_index = make_randum_target($game_party.actors)
        end
      when 1  # Chose target with lowest HP
        case scope
        when 1    # Enemy
          @active_battler.current_action.target_index = make_crisis_target($game_troop.enemies)
        when 3    # Friend
          @active_battler.current_action.target_index = make_crisis_target($game_party.actors)
        when 5    # Friend(HP0)
          target = make_dead_target
          return nil if target.nil?   # return if no decision made
          @active_battler.current_action.target_index = target
        end
      when 2  # Chose target with highest HP
        case scope
        when 1    # Enemy
          @active_battler.current_action.target_index = make_vigour_target($game_troop.enemies)
        when 3    # Friend
          @active_battler.current_action.target_index = make_vigour_target($game_party.actors)
        when 5    # Enemy (HP0)
          target = make_dead_target
          return nil if target.nil?   # return if no decision made
          @active_battler.current_action.target_index = target
        end
      else
        p "Error de Configuración. Patrón de conducta :: [Objetivo]"
        exit
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # * Make Random Target
  #--------------------------------------------------------------------------
  def make_randum_target(targets)
    while 0
      index = rand(targets.size)
      if targets[index].exist?
        return index
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Make Critical Target
  #--------------------------------------------------------------------------
  def make_crisis_target(targets)
    target_hp = 1000000
    target_index = make_randum_target(targets)
    for index in 0...targets.size
      if targets[index].hp < target_hp
        target_hp = targets[index].hp
        target_index = index
      end
    end
    return target_index
  end
  #--------------------------------------------------------------------------
  # * Make Vigourous Target
  #--------------------------------------------------------------------------
  def make_vigour_target(targets)
    target_hp = 0
    target_index = make_randum_target(targets)
    for index in 0...targets.size
      if targets[index].hp > target_hp
        target_hp = targets[index].hp
        target_index = index
      end
    end
    return target_index
  end
  #--------------------------------------------------------------------------
  # * Make Deat Target
  #--------------------------------------------------------------------------
  def make_dead_target
    target_index = []
    for index in 0...$game_party.actors.size
      if $game_party.actors[index].dead?
        target_index.push(index)
      end
    end
    return nil if target_index.empty
    return target_index[rand(target_index.size)]
  end
end

Pronto subiré una Demo a mi estilo XD pero antes les voy a dejar el otro sistema automático de batallas, esta vez es el que añade el botón de auto-batalla junto al de Luchar y escapar... este sistema ya ha estado antes en Mundo maker... creo.... pero este es diferente ya que su personalización tiene mucho que ver con los patrones que se ajusten en el primer script que he puesto en este tema. No es necesario añadir ambos script, pero si tambien deseas un auto batalla para ahorrar acciones, puedes incluir este script justo debajo del anterior mencionado:

Código:
#===============================================================================
# ** Movimientos de lucha automáticos
#===============================================================================
# Autor: Claimh
# Traducción al Castellano: AsFzKakarotto
#-------------------------------------------------------------------------------
#   Este sistema controla los movimientos de lucha de el grupo entero,
#   dependiente de lo que usted haya personalizado, escogiendo el método de
#   combate de cada personaje (battler) automáticamente. Sin embargo, este
#   sistema requiere que las "Acciones de luchas automáticas" esten en una
#   lista de Control con cada battler.
#
#   NOTA por DERVVULFMAN:
#   Este sistema es usado para modificar la barra de  "Luchar / Escapar" en la
#   parte superior de la pantalla de lucha, para incluir la función de
#   "Batalla-Auto" semejante y muy popular en el RM2K . Si usted selecciona la
#   opción de "Batalla-Auto" se cambia a una segunda ventana en la que usted
#   puede escoger qué patrón de ataque predeterminado está usando usted.
#
#===============================================================================
#  <Redefinir clases & los métodos>
#     Scene_Battle        : update_phase2
#     Window_PartyCommand : initialize, draw_item, update_cursor_rect
#===============================================================================

module AutoPlayer
#------------------------------------------------------------------------------
# *  Ajustes de Personalización
#------------------------------------------------------------------------------
  #----------------------------------------------------------------------------
  # * Maniobras de ataque
  #   Cada array CONSTANTE es una lista de miembros del grupo "Acción", Si son
  #   las habilidades, los ataques o qué. Estas "Acciones" son definidos en las
  #   "Acciones de lucha automáticas" (script requerido).
  #----------------------------------------------------------------------------
    # Nombre constante = [
    #     "Nombre de maniobra" (Se muestra en la ventana de lucha Batalla-Auto),
    #     [nil, Patrón de lucha de personaje 1, Patrón de lucha de pers. 2,...]
    # ]
  ATPT_PAT_0 = [
    "Posible uso de Habilidad/es",
    [nil, AT_PATTERN_1_0, AT_PATTERN_2_0,nil,nil,nil,nil, AT_PATTERN_7_0, AT_PATTERN_8_0]
  ]

  ATPT_PAT_1 = [
    "Ataques Regulares",
    [nil, AT_PATTERN_1_1, AT_PATTERN_2_1,nil,nil,nil,nil, AT_PATTERN_7_1, AT_PATTERN_8_1]
  ]

  # Utilize el comando "nil" para personajes no personalizados.
  #----------------------------------------------------------------------------
  # * Maniobras
  #   Una selección que tiene hasta 7 de los patrones de ataque predeterminados
  #   creados arriba de este script. Son puestos en una lista después de que la
  #   opción de "Batalla-Auto" es escogida en la lucha.
  #----------------------------------------------------------------------------
  ATPT_CMD = [
    ATPT_PAT_0,
    ATPT_PAT_1
  ]
#------------------------------------------------------------------------------
end


#==============================================================================
# ** Window_PartyCommand (All redefined)
#==============================================================================
class Window_PartyCommand < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 640, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.back_opacity = 160
    @commands = ["Luchar", "Batalla-Auto", "Escapar"]
    @item_max = 3
    @column_max = 2
    draw_item(0, normal_color)
    draw_item(1, normal_color)
    draw_item(2, $game_temp.battle_can_escape ? normal_color : disabled_color)
    self.active = false
    self.visible = false
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #     index : item number
  #     color : text color
  #--------------------------------------------------------------------------
  def draw_item(index, color)
    self.contents.font.color = color
    rect = Rect.new(80 + index * 160 + 4, 0, 128 - 10, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    self.contents.draw_text(rect, @commands[index], 1)
  end
  #--------------------------------------------------------------------------
  # * Cursor Rectangle Update
  #--------------------------------------------------------------------------
  def update_cursor_rect
    self.cursor_rect.set(80 + index * 160 + 4, 0, 128 - 10, 32)
  end
end


#==============================================================================
# ** Window_AutoPlayCmd
#==============================================================================
class Window_AutoPlayCmd < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(360, 64, 280, AutoPlayer::ATPT_CMD.size * 32 + 32)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item_max = AutoPlayer::ATPT_CMD.size
    refresh
    @column_max = 1
    self.active = false
    self.visible = false
    self.back_opacity = 160
    self.index = -1
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for index in 0...@item_max
      y = index * 32
      self.contents.draw_text(4, y, 204, 32, AutoPlayer::ATPT_CMD[index][0], 0)
    end
  end
end


#==============================================================================
# ** Scene_Battle
#==============================================================================
class Scene_Battle
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  alias main_auto_play main
  def main
    @party_auto_cmd_window = Window_AutoPlayCmd.new
    # Stock of automatic conduct person
    @auto_pt_stock = []
    for actor in $game_party.actors
      @auto_pt_stock.push(actor.id) if actor.auto_play
    end
    main_auto_play
    @party_auto_cmd_window.dispose
  end
  #--------------------------------------------------------------------------
  # * Start Party Command Phase
  #--------------------------------------------------------------------------
  alias start_phase2_auto_play start_phase2
  def start_phase2
    for actor in $game_party.actors
      unless @auto_pt_stock.include?(actor.id)
        actor.auto_play = false
      end
    end
    start_phase2_auto_play
  end
  #--------------------------------------------------------------------------
  # * Frame Update (party command phase)
  #--------------------------------------------------------------------------
  def update_phase2
    # if The party command window is active
    if @party_command_window.active
      update_phase2_party_cmd
    # If the auto window is active
    elsif @party_auto_cmd_window.active
      @party_auto_cmd_window.update
      update_phase2_auto_cmd
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Refresh (party command)
  #--------------------------------------------------------------------------
  def update_phase2_party_cmd
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Branch by party command window cursor position
      case @party_command_window.index
      when 0  # fight
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        @auto_party_cmd_type = nil
        # Start actor command phase
        start_phase3
      when 1  # maneuvers
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        @party_auto_cmd_window.active = true
        @party_auto_cmd_window.visible = true
        @party_auto_cmd_window.index = 0
        @party_command_window.active = false
      when 2  # escape
        # If it's not possible to escape
        if $game_temp.battle_can_escape == false
          # Play buzzer SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # escape processing
        update_phase2_escape
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Refresh (maneuvers command)
  #--------------------------------------------------------------------------
  def update_phase2_auto_cmd
    # If C button is pressed
    if Input.trigger?(Input::C)
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      @auto_party_cmd_type = @party_auto_cmd_window.index
      @party_auto_cmd_window.active = false
      @party_auto_cmd_window.visible = false
      @party_command_window.active = false
      @party_command_window.visible = false
      # The automatic conduct person does stock
      @auto_pt_stock = []
      for actor in $game_party.actors
        if actor.auto_play
          @auto_pt_stock.push(actor.id)
        end
        actor.auto_play = true
      end
      # Shift to phase 4
      start_phase4
      return
    end
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      @party_auto_cmd_window.active = false
      @party_auto_cmd_window.visible = false
      @party_command_window.active = true
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Conduct pattern extraction
  #--------------------------------------------------------------------------
  alias at_judge_auto_pattern_atpt? at_judge_auto_pattern?
  def at_judge_auto_pattern?
    if @auto_party_cmd_type.nil?
      action_motion = at_judge_auto_pattern_atpt?
    else
      action_motion = AutoPlayer::ATPT_CMD[@auto_party_cmd_type][1][@active_battler.id]
      # Conduct pattern is not set
      if action_motion.nil?
        # Set action
        @active_battler.current_action.kind = 0
        @active_battler.current_action.basic = 3
        return nil
      end
    end
    return action_motion
  end
  #--------------------------------------------------------------------------
  # * Frame Update (main phase step 6 : refresh)
  #--------------------------------------------------------------------------
  alias update_phase4_step6_autoplay update_phase4_step6
  def update_phase4_step6
    if @active_battler.is_a?(Game_Actor)
      unless @auto_party_cmd_type.nil?
        unless @auto_pt_stock.include?(@active_battler.id)
          @active_battler.auto_play = false
        end
      end
    end
    update_phase4_step6_autoplay
  end
end

Autor: Claimh (de Save-Point)
avatar
AsFzKakarotto
Soñador
Soñador

0/3

Créditos 303

Gracias : 67

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.