¡Bienvenido a Universo Maker!
¿Es esta la primera vez que visitas el foro? Si es así te recomendamos que te registres para tener completo acceso a todas las áreas y secciones del foro, así también podrás participar activamente en la comunidad. Si ya tienes una cuenta, conectate cuanto antes.
Iniciar Sesión Registrarme

No estás conectado. Conéctate o registrate

Ir a la página : 1, 2, 3, 4, 5  Siguiente

Ver el tema anterior Ver el tema siguiente Ir abajo Mensaje [Página 1 de 5.]

youkai

avatar
Hola a todos, viendo que no tenemos ningun taller dedicado al RGSS(scripts), pues pienso ofrecerme para cubrir ese hueco.


Reglas:
1- Se realizan adaptaciones y modificaciones de cualquier tipo y scripts desde cero dependiendo del pedido. En este ultimo caso solo sera para RPG Maker XP.
2- No pidan que cree sistemas de batallas ni cosas que tengan un alto nivel de complejidad ya que yo aun estoy aprendiendo.
3- En caso de que pidan algo que yo no pueda lograr, pues lo dire.
4- No presionen, yo me comprometo a hacer las cosas lo mas rapido que pueda, eso se los aseguro.
5- Cumplir las reglas del foro
6- En caso de dar error el script, por favor diganme exactamente que es lo que dice el error.
7- No pregunten primero si tengo tiempo o algo asi, pongan el pedido. Cualquier problema que exista, informare.



Tambien todo aquel que tenga interes y realmente quiera aprender las bases de la programacion puede postear aqui su pedido y yo me comprometo a enseñarle todo lo que se(a travez de MP), en caso contrario, por favor, no me hagan perder el tiempo.

¡Y con esto queda abierto el RGSS Center!


Pedidos Actuales
Spoiler:
alex.fayula: Adaptaciones de Menus de XP a VX Ace / ¡¡Preparando para empezar!!
La-espada-de-auron: Nuevo Menu de Equipo con sistema de 2 armas / ¡Completo!
rpgmanumaker: Modificaciones al Sistema de Batallas / ¡Completo!
ivanCR: Reloj / ¡Completo!
Código:
#-------------------------------------------------------------------------------
# ** Youkai_Module
# Script basado en el trabajo de ForeverZer0
#-------------------------------------------------------------------------------

module Youkai
  # Hora inicial. La sintaxis es la siguiente [Hora, Minuto, false=AM o true=PM]
  Start_hour = [11, 40, true]
  # Boton que muestra/quita la ventana de reloj de la pantalla
  Clock_button = Input::A
  # Velocidad inicial del reloj
  Initial_Speed = 10
end
# Tambien se pueden usar comandos como:
#  time.freeze(true/false)
#  - Conjela el tiempo
#  time.change_speed(SPEED)
#   - Cambia la velocidad del tiempo(1 tiempo real)
#  time.set(m, h, pm[pm debe ser true/false])
#   - Cambia la hora por la configuracion especificada
#  time.advance_minute(X)
#  - Avanza X minutos
#
#  time.advance_hour(X)
#  - Avanza X horas
#  time.memorize(INDEX)
#  - Memoriza la hora actual en INDEX para luego poderla restaurar a travez del
#    comando siguiente. Se puede sobreescribir
#
#  time.restore(INDEX)
#     - Retaura la hora guardada en INDEX. Si no hay nada, no pasa nada.
#-------------------------------------------------------------------------------
# ** Clock_System
#-------------------------------------------------------------------------------

class Clock_System
  
  attr_reader   :minute
  attr_reader   :hour
  attr_reader   :pm_flag
    
  def initialize
    @frame_count = 0
    @speed = Youkai::Initial_Speed
    @memory = []
    @minute, @hour = Youkai::Start_hour[1], Youkai::Start_hour[0]
    @frozen = false
    @pm_flag = false
    @count = count_length
  end
#-------------------------------------------------------------------------------    
  def count_length
    return ((Graphics.frame_rate.to_f / @speed) * 60.0).round
  end
#-------------------------------------------------------------------------------
  def freeze(value = false)
    @frozen = value
  end
#-------------------------------------------------------------------------------
  def change_speed(speed)
    @speed = speed
    @count = count_length
  end
#-------------------------------------------------------------------------------
  def change_pm_flag(value = false)
    @pm_flag = value
    return true
  end
#-------------------------------------------------------------------------------  
  def current_time
    return [@minute, @hour, @pm_flag]
  end
#-------------------------------------------------------------------------------  
  def clock(value = true)
    $game_system.clock = value
    return true
  end
#-------------------------------------------------------------------------------
  def show_clock
    return unless $scene.is_a?(Scene_Map) && $scene.clock == nil
    $scene.clock = Clock.new if $game_system.clock
  end
#-------------------------------------------------------------------------------
  def simple_clock(value = true)
    $game_system.simple_clock = value
    if $scene.clock != nil
      $scene.clock.dispose
      $scene.clock = Clock.new
    end
    return true
  end
#-------------------------------------------------------------------------------  
  def clock_face(x, y, opacity = nil, fontname = nil, fontsize = nil)
    $game_system.clock_face[0], $game_system.clock_face[1] = x, y
    $game_system.clock_face[2] = opacity if opacity.is_a?(Integer)
    $game_system.clock_face[3] = fontname if Font.exist?(fontname)
    $game_system.clock_face[4] = fontsize if fontsize.is_a?(Integer)
    if $scene.clock != nil
      $scene.clock.dispose
      $scene.clock = Clock.new
    end
  end
#-------------------------------------------------------------------------------  
  def advance_minute(minute)
    return unless minute >= 0
    @minute += minute
    time_fix
  end
#-------------------------------------------------------------------------------  
  def advance_hour(hour)
    return unless hour >= 0
    @hour += hour
    time_fix
  end
#-------------------------------------------------------------------------------

  def set(min = @minute, hr = @hour, pm = false)
    return unless min.between?(0, 59)
    return unless hour.between?(0, 23)
    @minute, @hour, @pm_flag = min, hr, pm
  end
#-------------------------------------------------------------------------------
  def memorize(index)
    @memory[index] = current_time
  end
#-------------------------------------------------------------------------------  
  def restore(index)
    return if @memory[index] == nil
    time = @memory[index]
    set(time[0], time[1])
  end
#-------------------------------------------------------------------------------      
  def calculate_time
    @hour += 1
    @minute = 0
    return unless @hour == 12
    @pm_flag = @pm_flag ? false : true
    return unless @hour >= 13
    @hour = 1
  end
#-------------------------------------------------------------------------------
  def time_fix
    if @minute >= 60
      @hour += (@minute / 60)
      @minute = @minute % 60
    end
    $scene.clock.refresh if $scene.clock != nil
  end
#-------------------------------------------------------------------------------
  def update
    unless @frozen
      @frame_count += 1
      if @frame_count >= @count
        @minute += 1
        calculate_time if @minute == 60
        @frame_count = 0
      end
    end
  end
end

#-------------------------------------------------------------------------------
# ** Clock < Window_Base
#-------------------------------------------------------------------------------

class Clock < Window_Base
  
  def initialize
    super(0, 0, 130, 47)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.back_opacity, self.z = 140, 9998
    self.contents.font.name = "Arial"
    self.contents.font.size = 16
    refresh
  end

  def refresh
    min, hour = $game_system.time.minute, $game_system.time.hour
    pm_flag = $game_system.time.pm_flag
    pm = pm_flag ? "PM" : "AM"
    time = sprintf('%2d:%02d %s', hour, min, pm)
    self.contents.clear
    tmw = 8 + contents.text_size('Time:').width
    self.contents.font.color = system_color
    self.contents.draw_text(0, 0, 144, 15, 'Time:')
    self.contents.font.color = normal_color
    self.contents.draw_text(tmw, 0, 144, 15, time)
    @mins = min
  end
  
  def update
    super
    refresh if @mins != $game_system.time.minute
  end
end

#-------------------------------------------------------------------------------
# ** Game_System
#-------------------------------------------------------------------------------

class Game_System

  attr_accessor :time
  attr_accessor :clock
  
  alias youkai_initialize initialize
  def initialize
    youkai_initialize
    @time = Clock_System.new
    @clock = true
  end
#-------------------------------------------------------------------------------
  alias youkai_update update
  def update
    if $scene.is_a?(Scene_Map) || $scene.is_a?(Scene_Battle)
      @time.update
    end
    youkai_update
  end
end

#-------------------------------------------------------------------------------
# ** Scene_Map
#-------------------------------------------------------------------------------

class Scene_Map
  
  attr_accessor :clock  
  
  alias zer0_clock_upd update
  def update
    zer0_clock_upd
    if Input.trigger?(Youkai::Clock_button)
      if $game_system.clock
        $game_system.se_play($data_system.decision_se)
        @clock = @clock == nil ? Clock.new : @clock.dispose
      else
        $game_system.se_play($data_system.buzzer_se)
      end
    end
    unless @clock == nil || @clock.disposed?
      @clock.update
    end
    if (!$game_system.clock || $scene != self) && @clock != nil
      @clock.dispose
      @clock = nil
    end
  end
end

#-------------------------------------------------------------------------------
# ** Interpreter
#-------------------------------------------------------------------------------

class Interpreter
  
  def time
    return $game_system.time
  end
end

Saludos,
¥oukai



Última edición por youkai el Miér Mayo 22, 2013 9:28 pm, editado 6 veces

alex.fayula

avatar
Pues a mi me vendría muy bien. Me gustaría tener un Menú formado por imagenes (estilo MogHunter) para rpg maker vx ace. Eso incluye varios scripts, ya que un menú tiene varias Scene: Principal, Items, Estatus, Equipo...

Si no sabes o necesitas de los scripts y no sabes donde encontralos o te da pereza dímelo y te paso los links.

Me da igual si los pasas del vx o de xp a vxace, como te resulte más fácil.
Ya me dirás algo!

youkai

avatar
Muy bien, pedido aceptado!
Lo que necesito que me expliques mas como quieres que quede, si solo es una imagen de fondo, si vas a agregar iconos, o si quieres hacer alguna otra modificacion.(es que no he visto el menu de MogHunter =P)

Y de todas formas pasame los scripts ya que en VX Ace no tengo casi experiencia y asi me das una base para guiarme.
Espero tu respuesta para empezar.
Saludos,
¥oukai

Tiempo maximo estimado: 4 dias

alex.fayula

avatar
Youkai te envió un privado con los detalles Ópalo Guiño

youkai

avatar
Muy bien, dame mas o menos el tiempo estimado y te envio el script.
En caso de no poder ya que nunca me he dedicado a programar para el Ace te aviso en los proximos 2 dias, pero no te preocupes, que puedes contar con que lo voy a terminar. XD
Saludos,
¥oukai

alex.fayula

avatar
Youkai te pedí que una opción del menú llamará a un evento común (concretamente que quitarás el save y añadieras esa opción xD) si es posible añadir una opción más al menú base y que también llame a otro evento común seria perfecto (entre el evento común 1 y el Salir), sé que es mucho pedir pero si no te supone gran trabajo y lo puedes hacer te lo agradecería.

Puedas o no, gracias de nuevo!

Ledai

avatar
Hola!!! (perdón por no pasarme antes...)
Mira, necesito una edición de los script de defecto del XP... necesitaría que en la escena de menú equipo, solo aparecieran las opciones de equipar, pero solo de dos armas, una principal y una secundaria, ni espacio de accesorios ni escudo ni nada más... solo arma mano derecha arma mano izq... ¿Se puede?

GRACIAS por atenderme!!!!^_^


Por cierto Podrías explicarme cómo usar esto:

Código:
################################################################################
#-------------------------- DAÑOS EN EVENTOS ---------------------------------#
# Creado por Hound, Idea de Itoaragon
#------------------------------------------------------------------------------
# Para ejecutar el daño en un evento escribe en el comando llamar script:
# $game_map.events[id evento].dmg(num, critico)
# num es el número de daño
# critico determina si el daño es critico (obviamente) escribe true o false
# En caso de que quieras poner texto como daño, por ejemplo en caso de fallo
# escribe el texto entre comillas en num, por ejemplo "Miss!"
# Este miniscript lo cree especialmente para Itoaragon y sus engines.
# Si lo has visto publicado y quieres usarlo no es del todo necesario que
# me acredites, ya que lo hice en pocos minutos, y me salió bien a la primera.
# Espero que te sirva de ayuda ;)
# Para cualquier duda, comentario o sugerencia, mándamelas al correo a:
# houndninja@gmail.com
# Saludoss..
#-------------------------------------------------------------------------------
# Notas by Tenshi98
# $game_map.events[id evento].dmg(num, critico)
# Donde dice "id evento" pongan siempre el id del evento sobre el que esten
# trabajando, ya que les dara error si es un evento con valor distinto.
#-------------------------------------------------------------------------------


class Game_Character
  attr_accessor :damage_n
  attr_accessor :damage_h
  def dmg(num, crit = false)
    @damage_n = num
    @damage_h = crit
    return
  end
end

class Sprite_Character
  alias dmg_update update
  def update
    unless @character.damage_n == nil and @character.damage_h == nil
      dmgn = @character.damage_n
      dmgh = @character.damage_h
      damage(dmgn, dmgh)
      @character.damage_n = nil
      @character.damage_h = nil
    end
    dmg_update
  end
end

En el Demo que lo tenía lo llamaban con esto:
crit = false
$game_map.events[3].dmg($game_variables[5],
crit)
Que es para que muetre el valor de una variable establecida...

Pero al usarlo en mi trabajo me da un error TONTO de sintaxis en la linea 3 del Game_Temp O.O
¿Te lo puedes creer, en la linea 3!!! @~@




Entérate de todas las novedades

youkai

avatar
Hola Leda!!
Ya vi tu peticion y te informo que ya le tengo casi completa, solo me faltan algunos ajusticos y ya(sobre todo en la parte visual ^^).
Pero espero tenerlo listo para hoy por la noche ya que tengo que hacer un trabajillo extra para programar la parte de que puedes usar dos armas simultaneas.

En cuanto al script que me pides que te ayude, pues no se porque te da ese error en Game_Temp...empezando porque en el script en ningun momento se le hace referencia a Game_Temp, lo unico que te puedo aconsejar es que en lugar de usar una variable para definir si es critico o no el daño, lo pongas directamente, o sea:
$game_map.events[3].dmg($game_variables[5],
false)
Tambien fijate en el valor de la variable...
Ya eso es todo lo que se me ocurre que tenga que ver con ese script, porque lo otro podria ser algun problema ageno al script este.

Ledai

avatar
OK esperaré ^_^!!!

Mira, aquí te dejo el demo del otro script, estoy copiando el mecanismo del enguiner para usarlo en mi prollecto pero al adaptar el script al mío me da error de sintaxis y aparece el guión en la linea o 3 o 2 del Temp....

http://www.mediafire.com/?2627cf3ykny42w9

me gustaría usarlo pero si no se deja pues nada... pero no entiendo porqué....




Entérate de todas las novedades

youkai

avatar
Hola, ya termine el menu de equipo, dime si asi te gusta o prefieres hacerle alguna que otra modificacion.
Código:
#==============================================================================
# ** Game_Actor
#------------------------------------------------------------------------------
#  This class handles the actor. It's used within the Game_Actors class
#  ($game_actors) and refers to the Game_Party class ($game_party).
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader  :weapon2_id
  #--------------------------------------------------------------------------
  # * Setup
  #    actor_id : actor ID
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_setup setup
  def setup(actor_id)
    @weapon2_id = 0
    youkai_twoweapons_setup(actor_id)
  end
  #--------------------------------------------------------------------------
  # * Get Normal Attack Element
  #--------------------------------------------------------------------------
  def element_set
    weapon1 = $data_weapons[@weapon_id]
    weapon2 = $data_weapons[@weapon2_id]
    w1 = weapon1 != nil ? weapon1.element_set : []
    w2 = weapon2 != nil ? weapon2.element_set : []
    return w1 + w2
  end
  #--------------------------------------------------------------------------
  # * Get Normal Attack State Change (+)
  #--------------------------------------------------------------------------
  def plus_state_set
    weapon1 = $data_weapons[@weapon_id]
    weapon2 = $data_weapons[@weapon2_id]
    w1 = weapon1 != nil ? weapon1.plus_state_set : []
    w2 = weapon2 != nil ? weapon2.plus_state_set : []
    return w1 + w2
  end
  #--------------------------------------------------------------------------
  # * Get Normal Attack State Change (-)
  #--------------------------------------------------------------------------
  def minus_state_set
    weapon1 = $data_weapons[@weapon_id]
    weapon2 = $data_weapons[@weapon2_id]
    w1 = weapon1 != nil ? weapon1.minus_state_set : []
    w2 = weapon2 != nil ? weapon2.minus_state_set : []
    return w1 + w2
  end
  #--------------------------------------------------------------------------
  # * Get Basic Strength
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_base_str base_str
  def base_str
    n = youkai_twoweapons_base_str
    weapon2 = $data_weapons[@weapon2_id]
    n += weapon2 != nil ? weapon2.str_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # * Get Basic Dexterity
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_base_dex base_dex
  def base_dex   
    n = youkai_twoweapons_base_dex
    weapon2 = $data_weapons[@weapon2_id]
    n += weapon2 != nil ? weapon2.dex_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # * Get Basic Agility
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_base_agi base_agi
  def base_agi
    n = youkai_twoweapons_base_agi
    weapon2 = $data_weapons[@weapon2_id]
    n += weapon2 != nil ? weapon2.agi_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # * Get Basic Intelligence
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_base_int base_int
  def base_int
    n = youkai_twoweapons_base_int
    weapon2 = $data_weapons[@weapon2_id]
    n += weapon2 != nil ? weapon2.int_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # * Get Basic Attack Power
  #--------------------------------------------------------------------------
  def base_atk
    weapon1 = $data_weapons[@weapon_id]
    weapon2 = $data_weapons[@weapon2_id]
    w1 = weapon1 != nil ? weapon1.atk : 0
    w2 = weapon2 != nil ? weapon2.atk : 0
    return w1 + w2
  end
  #--------------------------------------------------------------------------
  # * Get Basic Physical Defense
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_base_pdef base_pdef
  def base_pdef
    n = youkai_twoweapons_base_pdef
    weapon2 = $data_weapons[@weapon2_id]
    pdef6 = weapon2 != nil ? weapon2.pdef : 0
    return n + pdef6
  end
  #--------------------------------------------------------------------------
  # * Get Basic Magic Defense
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_base_mdef base_mdef
  def base_mdef
    n = youkai_twoweapons_base_mdef
    weapon2 = $data_weapons[@weapon2_id]
    mdef6 = weapon2 != nil ? weapon2.pdef : 0
    return n + mdef6
  end
  #--------------------------------------------------------------------------
  # * Determine Fixed Equipment
  #    equip_type : type of equipment
  #--------------------------------------------------------------------------
  def equip_fix?(equip_type)
    case equip_type
    when 0  # Weapon
      return $data_actors[@actor_id].weapon_fix
    when 2  # Shield
      return $data_actors[@actor_id].armor1_fix
    when 3  # Head
      return $data_actors[@actor_id].armor2_fix
    when 4  # Body
      return $data_actors[@actor_id].armor3_fix
    when 5  # Accessory
      return $data_actors[@actor_id].armor4_fix
    end
    return false
  end
  #--------------------------------------------------------------------------
  # * Change Equipment
  #    equip_type : type of equipment
  #    id    : weapon or armor ID (If 0, remove equipment)
  #--------------------------------------------------------------------------
  def equip(equip_type, id)
    case equip_type
    when 0  # Weapon 1
      if id == 0 or $game_party.weapon_number(id) > 0
        $game_party.gain_weapon(@weapon_id, 1)
        @weapon_id = id
        $game_party.lose_weapon(id, 1)
      end
    when 1  # Weapon 2
      if id == 0 or $game_party.weapon_number(id) > 0
        $game_party.gain_weapon(@weapon2_id, 1)
        @weapon2_id = id
        $game_party.lose_weapon(id, 1)
      end
    when 2  # Shield
      if id == 0 or $game_party.armor_number(id) > 0
        update_auto_state($data_armors[@armor1_id], $data_armors[id])
        $game_party.gain_armor(@armor1_id, 1)
        @armor1_id = id
        $game_party.lose_armor(id, 1)
      end
    when 3  # Head
      if id == 0 or $game_party.armor_number(id) > 0
        update_auto_state($data_armors[@armor2_id], $data_armors[id])
        $game_party.gain_armor(@armor2_id, 1)
        @armor2_id = id
        $game_party.lose_armor(id, 1)
      end
    when 4  # Body
      if id == 0 or $game_party.armor_number(id) > 0
        update_auto_state($data_armors[@armor3_id], $data_armors[id])
        $game_party.gain_armor(@armor3_id, 1)
        @armor3_id = id
        $game_party.lose_armor(id, 1)
      end
    when 5  # Accessory
      if id == 0 or $game_party.armor_number(id) > 0
        update_auto_state($data_armors[@armor4_id], $data_armors[id])
        $game_party.gain_armor(@armor4_id, 1)
        @armor4_id = id
        $game_party.lose_armor(id, 1)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Change Class ID
  #    class_id : new class ID
  #--------------------------------------------------------------------------
  def class_id=(class_id)
    if $data_classes[class_id] != nil
      @class_id = class_id
      # Remove items that are no longer equippable
      unless equippable?($data_weapons[@weapon_id])
        equip(0, 0)
      end
      unless equippable?($data_weapons[@weapon2_id])
        equip(1, 0)
      end
      unless equippable?($data_armors[@armor1_id])
        equip(2, 0)
      end
      unless equippable?($data_armors[@armor2_id])
        equip(3, 0)
      end
      unless equippable?($data_armors[@armor3_id])
        equip(4, 0)
      end
      unless equippable?($data_armors[@armor4_id])
        equip(5, 0)
      end
    end
  end
end

#==============================================================================
# ** Window_EquipLeft
#------------------------------------------------------------------------------
#  This window displays actor parameter changes on the equipment screen.
#==============================================================================

class Window_EquipLeft < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #    actor : actor
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(0, 64, 272, 288)
    self.contents = Bitmap.new(width - 32, height - 32)
    @actor = actor
    refresh
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    up = Color.new(128, 255, 100)
    down = knockout_color
    self.contents.clear
    draw_actor_name(@actor, 4, 0)
    draw_actor_level(@actor, 4, 32)
    draw_actor_parameter(@actor, 4, 64, 0)
    draw_actor_parameter(@actor, 4, 96, 1)
    draw_actor_parameter(@actor, 4, 128, 2)
    draw_actor_parameter(@actor, 4, 160, 3)
    draw_actor_parameter(@actor, 4, 192, 4)
    draw_actor_parameter(@actor, 4, 224, 5)
    draw_actor_parameter(@actor, 4, 256, 6)
    if @new_atk != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 64, 40, 32, "->", 1)
      self.contents.font.color = @actor.atk > @new_atk ? down :
      @actor.atk == @new_atk ? normal_color : up
      self.contents.draw_text(200, 64, 36, 32, @new_atk.to_s, 2)
    end
    if @new_pdef != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 96, 40, 32, "->", 1)
      self.contents.font.color = @actor.pdef > @new_pdef ? down :
      @actor.pdef == @new_pdef ? normal_color : up
      self.contents.draw_text(200, 96, 36, 32, @new_pdef.to_s, 2)
    end
    if @new_mdef != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 128, 40, 32, "->", 1)
      self.contents.font.color = @actor.mdef > @new_mdef ? down :
      @actor.mdef == @new_mdef ? normal_color : up
      self.contents.draw_text(200, 128, 36, 32, @new_mdef.to_s, 2)
    end
    if @new_str != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 160, 40, 32, "->", 1)
      self.contents.font.color = @actor.str > @new_str ? down :
      @actor.str == @new_str ? normal_color : up
      self.contents.draw_text(200, 160, 36, 32, @new_str.to_s, 2)
    end
    if @new_agi != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 192, 40, 32, "->", 1)
      self.contents.font.color = @actor.agi > @new_agi ? down :
      @actor.agi == @new_agi ? normal_color : up
      self.contents.draw_text(200, 192, 36, 32, @new_agi.to_s, 2)
    end
    if @new_dex != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 224, 40, 32, "->", 1)
      self.contents.font.color = @actor.dex > @new_dex ? down :
      @actor.dex == @new_dex ? normal_color : up
      self.contents.draw_text(200, 224, 36, 32, @new_dex.to_s, 2)
    end
    if @new_int != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 256, 40, 32, "->", 1)
      self.contents.font.color = @actor.int > @new_int ? down :
      @actor.int == @new_int ? normal_color : up
      self.contents.draw_text(200, 256, 36, 32, @new_int.to_s, 2)
    end
  end
  #--------------------------------------------------------------------------
  # * Set parameters after changing equipment
  #    new_atk  : attack power after changing equipment
  #    new_pdef : physical defense after changing equipment
  #    new_mdef : magic defense after changing equipment
  #--------------------------------------------------------------------------
  def set_new_parameters(new_str, new_agi, new_dex, new_int, new_atk,
    new_pdef, new_mdef)
    if @new_str != new_str || @new_agi != new_agi || @new_dex != new_dex ||
      @new_int != new_int || @new_atk != new_atk or @new_pdef != new_pdef or
      @new_mdef != new_mdef     
      @new_atk = new_atk
      @new_pdef = new_pdef
      @new_mdef = new_mdef
      @new_str = new_str
      @new_agi = new_agi
      @new_dex = new_dex
      @new_int = new_int
      refresh
    end
  end
end

#==============================================================================
# ** Window_EquipRight
#------------------------------------------------------------------------------
#  This window displays items the actor is currently equipped with on the
#  equipment screen.
#==============================================================================

class Window_EquipRight < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #    actor : actor
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(272, 64, 368, 96)
    self.contents = Bitmap.new(width - 32, height - 32)
    @actor = actor
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # * Item Acquisition
  #--------------------------------------------------------------------------
  def item
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @data = []
    @data.push($data_weapons[@actor.weapon_id])
    @data.push($data_weapons[@actor.weapon2_id])
    @item_max = @data.size
    self.contents.font.color = system_color
    self.contents.draw_text(4, 32 * 0, 92, 32, $data_system.words.weapon)
    self.contents.draw_text(4, 32 * 1, 92, 32, $data_system.words.weapon)
    draw_item_name(@data[0], 92, 32 * 0)
    draw_item_name(@data[1], 92, 32 * 1)
  end
  #--------------------------------------------------------------------------
  # * Help Text Update
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

#==============================================================================
# ** Window_EquipItem
#------------------------------------------------------------------------------
#  This window displays choices when opting to change equipment on the
#  equipment screen.
#==============================================================================

class Window_EquipItem < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #    actor      : actor
  #    equip_type : equip region (0-3)
  #--------------------------------------------------------------------------
  def initialize(actor, equip_type)
    super(272, 160, 368, 320)
    @actor = actor
    @equip_type = equip_type
    @column_max = 1
    refresh
    self.active = false
    self.index = -1
  end
  #--------------------------------------------------------------------------
  # * Item Acquisition
  #--------------------------------------------------------------------------
  def item
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    # Add equippable weapons
    if @equip_type == 0
      weapon_set = $data_classes[@actor.class_id].weapon_set
      for i in 1...$data_weapons.size
        if $game_party.weapon_number(i) > 0 and weapon_set.include?(i)
          @data.push($data_weapons[i])
        end
      end
    end
    # Add equippable armor
    if @equip_type != 0
      armor_set = $data_classes[@actor.class_id].armor_set
      for i in 1...$data_armors.size
        if $game_party.armor_number(i) > 0 and armor_set.include?(i)
          if $data_armors[i].kind == @equip_type-1
            @data.push($data_armors[i])
          end
        end
      end
    end
    # Add blank page
    @data.push(nil)
    # Make a bit map and draw all items
    @item_max = @data.size
    self.contents = Bitmap.new(width - 32, row_max * 32)
    for i in 0...@item_max-1
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #    index : item number
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    x = 4
    y = index * 32
    case item
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    bitmap = RPG::Cache.icon(item.icon_name)
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
    self.contents.font.color = normal_color
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
    self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  end
  #--------------------------------------------------------------------------
  # * Help Text Update
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

class Window_MHud < Window_Base
  def initialize(actor)
    super(0, 352, 272, 128)
    self.contents = Bitmap.new(width - 32, height - 32)
    @actor = actor
    refresh
  end
  def refresh
    self.contents.clear
    draw_actor_graphic(@actor, 10, 64)
    draw_actor_hp(@actor, 64, 10)
    draw_actor_sp(@actor, 64, 42)
  end
end

#==============================================================================
# ** Scene_Equip
#------------------------------------------------------------------------------
#  This class performs equipment screen processing.
#==============================================================================

class Scene_Equip
  #--------------------------------------------------------------------------
  # * Object Initialization
  #    actor_index : actor index
  #    equip_index : equipment index
  #--------------------------------------------------------------------------
  def initialize(actor_index = 0, equip_index = 0)
    @actor_index = actor_index
    @equip_index = equip_index
  end
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    # Get actor
    @actor = $game_party.actors[@actor_index]
    # Make windows
    @help_window = Window_Help.new
    @left_window = Window_EquipLeft.new(@actor)
    @right_window = Window_EquipRight.new(@actor)
    @item_window = Window_EquipItem.new(@actor, 0)
    @hud_window = Window_MHud.new(@actor)
    # Associate help window
    @right_window.help_window = @help_window
    @item_window.help_window = @help_window
    # Set cursor position
    @right_window.index = @equip_index
    refresh
    # Execute transition
    Graphics.transition
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end
    # Prepare for transition
    Graphics.freeze
    # Dispose of windows
    @help_window.dispose
    @left_window.dispose
    @right_window.dispose
    @item_window.dispose
    @hud_window.dispose
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    @hud_window.refresh
    # Get currently equipped item
    item1 = @right_window.item
    # If right window is active
    if @right_window.active
      # Erase parameters for after equipment change
      @left_window.set_new_parameters(nil, nil, nil, nil, nil, nil, nil)
    end
    # If item window is active
    if @item_window.active
      # Get currently selected item
      item2 = @item_window.item
      # Change equipment
      last_hp = @actor.hp
      last_sp = @actor.sp
      @actor.equip(@right_window.index, item2 == nil ? 0 : item2.id)
      # Get parameters for after equipment change
      new_str = @actor.str
      new_agi = @actor.agi
      new_dex = @actor.dex
      new_int = @actor.int
      new_atk = @actor.atk
      new_pdef = @actor.pdef
      new_mdef = @actor.mdef
      # Return equipment
      @actor.equip(@right_window.index, item1 == nil ? 0 : item1.id)
      @actor.hp = last_hp
      @actor.sp = last_sp
      # Draw in left window
      @left_window.set_new_parameters(new_str, new_agi, new_dex, new_int, new_atk,
      new_pdef, new_mdef)
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    # Update windows
    @left_window.update
    @right_window.update
    @item_window.update
    refresh
    # If right window is active: call update_right
    if @right_window.active
      update_right
      return
    end
    # If item window is active: call update_item
    if @item_window.active
      update_item
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when right window is active)
  #--------------------------------------------------------------------------
  def update_right
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to menu screen
      $scene = Scene_Menu.new(2)
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # If equipment is fixed
      if @actor.equip_fix?(@right_window.index)
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # Activate item window
      @right_window.active = false
      @item_window.active = true
      @item_window.index = 0
      return
    end
    # If R button was pressed
    if Input.trigger?(Input::R)
      # Play cursor SE
      $game_system.se_play($data_system.cursor_se)
      # To next actor
      @actor_index += 1
      @actor_index %= $game_party.actors.size
      # Switch to different equipment screen
      $scene = Scene_Equip.new(@actor_index, @right_window.index)
      return
    end
    # If L button was pressed
    if Input.trigger?(Input::L)
      # Play cursor SE
      $game_system.se_play($data_system.cursor_se)
      # To previous actor
      @actor_index += $game_party.actors.size - 1
      @actor_index %= $game_party.actors.size
      # Switch to different equipment screen
      $scene = Scene_Equip.new(@actor_index, @right_window.index)
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when item window is active)
  #--------------------------------------------------------------------------
  def update_item
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Activate right window
      @right_window.active = true
      @item_window.active = false
      @item_window.index = -1
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Play equip SE
      $game_system.se_play($data_system.equip_se)
      # Get currently selected data on the item window
      item = @item_window.item
      # Change equipment
      @actor.equip(@right_window.index, item == nil ? 0 : item.id)
      # Activate right window
      @right_window.active = true
      @item_window.active = false
      @item_window.index = -1
      # Remake right window and item window contents
      @right_window.refresh
      @item_window.refresh
      return
    end
  end
end
En cuanto al otro problema, aun tengo que revisarlo y luego te cuento.

EDIT: Arreglado un pequeño bug que se me escapo ^^

youkai

avatar
Entiendo lo que me dices, pero debo de informante que ni por la base de datos ni por los comandos normales del Condiciones y Efectos vas a poder determinar condiciones con la segunda arma, pero no te preocupes que ya corregi esos problemas lo unico que para usarlo en Condiciones y Efectos lo vas a tener que hacer por la opcion Script de la 4ta pagina.
Y la sintaxis es la siguiente:
$game_party.actors[posicion del actor].equipped_weapon?(id, posicion = 0)

posicion del actor: es la posicion del actor en el grupo, empieza por 0(0 es el primero, 1 el segundo...)
id: se refiere al id que tiene el arma en la base de datos, -1 para que sea cualquier arma.
posicion: la posicion del arma, o mejor dicho, la "mano" en la que esta equipada; 1 para la primer arma, 2 para la seguna y 0 para cualquiera(opcion por defecto).
Código:
#==============================================================================
# ** Game_Actor
#------------------------------------------------------------------------------
#  This class handles the actor. It's used within the Game_Actors class
#  ($game_actors) and refers to the Game_Party class ($game_party).
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader  :weapon2_id
  #--------------------------------------------------------------------------
  # * Setup
  #    actor_id : actor ID
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_setup setup
  def setup(actor_id)
    @weapon2_id = 0
    youkai_twoweapons_setup(actor_id)
  end
  #--------------------------------------------------------------------------
  # * Get Normal Attack Element
  #--------------------------------------------------------------------------
  def element_set
    weapon1 = $data_weapons[@weapon_id]
    weapon2 = $data_weapons[@weapon2_id]
    w1 = weapon1 != nil ? weapon1.element_set : []
    w2 = weapon2 != nil ? weapon2.element_set : []
    return w1 + w2
  end
  #--------------------------------------------------------------------------
  # * Get Normal Attack State Change (+)
  #--------------------------------------------------------------------------
  def plus_state_set
    weapon1 = $data_weapons[@weapon_id]
    weapon2 = $data_weapons[@weapon2_id]
    w1 = weapon1 != nil ? weapon1.plus_state_set : []
    w2 = weapon2 != nil ? weapon2.plus_state_set : []
    return w1 + w2
  end
  #--------------------------------------------------------------------------
  # * Get Normal Attack State Change (-)
  #--------------------------------------------------------------------------
  def minus_state_set
    weapon1 = $data_weapons[@weapon_id]
    weapon2 = $data_weapons[@weapon2_id]
    w1 = weapon1 != nil ? weapon1.minus_state_set : []
    w2 = weapon2 != nil ? weapon2.minus_state_set : []
    return w1 + w2
  end
  #--------------------------------------------------------------------------
  # * Get Basic Strength
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_base_str base_str
  def base_str
    n = youkai_twoweapons_base_str
    weapon2 = $data_weapons[@weapon2_id]
    n += weapon2 != nil ? weapon2.str_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # * Get Basic Dexterity
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_base_dex base_dex
  def base_dex   
    n = youkai_twoweapons_base_dex
    weapon2 = $data_weapons[@weapon2_id]
    n += weapon2 != nil ? weapon2.dex_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # * Get Basic Agility
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_base_agi base_agi
  def base_agi
    n = youkai_twoweapons_base_agi
    weapon2 = $data_weapons[@weapon2_id]
    n += weapon2 != nil ? weapon2.agi_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # * Get Basic Intelligence
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_base_int base_int
  def base_int
    n = youkai_twoweapons_base_int
    weapon2 = $data_weapons[@weapon2_id]
    n += weapon2 != nil ? weapon2.int_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # * Get Basic Attack Power
  #--------------------------------------------------------------------------
  def base_atk
    weapon1 = $data_weapons[@weapon_id]
    weapon2 = $data_weapons[@weapon2_id]
    w1 = weapon1 != nil ? weapon1.atk : 0
    w2 = weapon2 != nil ? weapon2.atk : 0
    return w1 + w2
  end
  #--------------------------------------------------------------------------
  # * Get Basic Physical Defense
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_base_pdef base_pdef
  def base_pdef
    n = youkai_twoweapons_base_pdef
    weapon2 = $data_weapons[@weapon2_id]
    pdef6 = weapon2 != nil ? weapon2.pdef : 0
    return n + pdef6
  end
  #--------------------------------------------------------------------------
  # * Get Basic Magic Defense
  #--------------------------------------------------------------------------
  alias youkai_twoweapons_base_mdef base_mdef
  def base_mdef
    n = youkai_twoweapons_base_mdef
    weapon2 = $data_weapons[@weapon2_id]
    mdef6 = weapon2 != nil ? weapon2.pdef : 0
    return n + mdef6
  end
  #--------------------------------------------------------------------------
  # * Determine Fixed Equipment
  #    equip_type : type of equipment
  #--------------------------------------------------------------------------
  def equip_fix?(equip_type)
    case equip_type
    when 0  # Weapon
      return $data_actors[@actor_id].weapon_fix
    when 2  # Shield
      return $data_actors[@actor_id].armor1_fix
    when 3  # Head
      return $data_actors[@actor_id].armor2_fix
    when 4  # Body
      return $data_actors[@actor_id].armor3_fix
    when 5  # Accessory
      return $data_actors[@actor_id].armor4_fix
    end
    return false
  end
  #--------------------------------------------------------------------------
  # * Change Equipment
  #    equip_type : type of equipment
  #    id    : weapon or armor ID (If 0, remove equipment)
  #--------------------------------------------------------------------------
  def equip(equip_type, id)
    case equip_type
    when 0  # Weapon 1
      if id == 0 or $game_party.weapon_number(id) > 0
        $game_party.gain_weapon(@weapon_id, 1)
        @weapon_id = id
        $game_party.lose_weapon(id, 1)
      end
    when 1  # Weapon 2
      if id == 0 or $game_party.weapon_number(id) > 0
        $game_party.gain_weapon(@weapon2_id, 1)
        @weapon2_id = id
        $game_party.lose_weapon(id, 1)
      end
    when 2  # Shield
      if id == 0 or $game_party.armor_number(id) > 0
        update_auto_state($data_armors[@armor1_id], $data_armors[id])
        $game_party.gain_armor(@armor1_id, 1)
        @armor1_id = id
        $game_party.lose_armor(id, 1)
      end
    when 3  # Head
      if id == 0 or $game_party.armor_number(id) > 0
        update_auto_state($data_armors[@armor2_id], $data_armors[id])
        $game_party.gain_armor(@armor2_id, 1)
        @armor2_id = id
        $game_party.lose_armor(id, 1)
      end
    when 4  # Body
      if id == 0 or $game_party.armor_number(id) > 0
        update_auto_state($data_armors[@armor3_id], $data_armors[id])
        $game_party.gain_armor(@armor3_id, 1)
        @armor3_id = id
        $game_party.lose_armor(id, 1)
      end
    when 5  # Accessory
      if id == 0 or $game_party.armor_number(id) > 0
        update_auto_state($data_armors[@armor4_id], $data_armors[id])
        $game_party.gain_armor(@armor4_id, 1)
        @armor4_id = id
        $game_party.lose_armor(id, 1)
      end
    end
  end
 
  def equipped_weapon?(id, pos = 0)
    case pos
    when 0
      if id < 0
        if @weapon_id != 0 or @weapon2_id != 0
          return true
        end
      end
      if id == @weapon_id or id == @weapon2_id
        return true
      end
    when 1
      if id < 0
        if @weapon_id != 0
          return true
        end
      end
      if id == @weapon_id
        return true
      end
    when 2
      if id < 0
        if @weapon2_id != 0
          return true
        end
      end
      if id == @weapon2_id
        return true
      end
    end
    return false
  end
  #--------------------------------------------------------------------------
  # * Change Class ID
  #    class_id : new class ID
  #--------------------------------------------------------------------------
  def class_id=(class_id)
    if $data_classes[class_id] != nil
      @class_id = class_id
      # Remove items that are no longer equippable
      unless equippable?($data_weapons[@weapon_id])
        equip(0, 0)
      end
      unless equippable?($data_weapons[@weapon2_id])
        equip(1, 0)
      end
      unless equippable?($data_armors[@armor1_id])
        equip(2, 0)
      end
      unless equippable?($data_armors[@armor2_id])
        equip(3, 0)
      end
      unless equippable?($data_armors[@armor3_id])
        equip(4, 0)
      end
      unless equippable?($data_armors[@armor4_id])
        equip(5, 0)
      end
    end
  end
end

#==============================================================================
# ** Window_EquipLeft
#------------------------------------------------------------------------------
#  This window displays actor parameter changes on the equipment screen.
#==============================================================================

class Window_EquipLeft < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #    actor : actor
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(0, 64, 272, 288)
    self.contents = Bitmap.new(width - 32, height - 32)
    @actor = actor
    refresh
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    up = Color.new(128, 255, 100)
    down = knockout_color
    self.contents.clear
    draw_actor_name(@actor, 4, 0)
    draw_actor_level(@actor, 4, 32)
    draw_actor_parameter(@actor, 4, 64, 0)
    draw_actor_parameter(@actor, 4, 96, 1)
    draw_actor_parameter(@actor, 4, 128, 2)
    draw_actor_parameter(@actor, 4, 160, 3)
    draw_actor_parameter(@actor, 4, 192, 4)
    draw_actor_parameter(@actor, 4, 224, 5)
    draw_actor_parameter(@actor, 4, 256, 6)
    if @new_atk != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 64, 40, 32, "->", 1)
      self.contents.font.color = @actor.atk > @new_atk ? down :
      @actor.atk == @new_atk ? normal_color : up
      self.contents.draw_text(200, 64, 36, 32, @new_atk.to_s, 2)
    end
    if @new_pdef != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 96, 40, 32, "->", 1)
      self.contents.font.color = @actor.pdef > @new_pdef ? down :
      @actor.pdef == @new_pdef ? normal_color : up
      self.contents.draw_text(200, 96, 36, 32, @new_pdef.to_s, 2)
    end
    if @new_mdef != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 128, 40, 32, "->", 1)
      self.contents.font.color = @actor.mdef > @new_mdef ? down :
      @actor.mdef == @new_mdef ? normal_color : up
      self.contents.draw_text(200, 128, 36, 32, @new_mdef.to_s, 2)
    end
    if @new_str != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 160, 40, 32, "->", 1)
      self.contents.font.color = @actor.str > @new_str ? down :
      @actor.str == @new_str ? normal_color : up
      self.contents.draw_text(200, 160, 36, 32, @new_str.to_s, 2)
    end
    if @new_agi != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 192, 40, 32, "->", 1)
      self.contents.font.color = @actor.agi > @new_agi ? down :
      @actor.agi == @new_agi ? normal_color : up
      self.contents.draw_text(200, 192, 36, 32, @new_agi.to_s, 2)
    end
    if @new_dex != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 224, 40, 32, "->", 1)
      self.contents.font.color = @actor.dex > @new_dex ? down :
      @actor.dex == @new_dex ? normal_color : up
      self.contents.draw_text(200, 224, 36, 32, @new_dex.to_s, 2)
    end
    if @new_int != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 256, 40, 32, "->", 1)
      self.contents.font.color = @actor.int > @new_int ? down :
      @actor.int == @new_int ? normal_color : up
      self.contents.draw_text(200, 256, 36, 32, @new_int.to_s, 2)
    end
  end
  #--------------------------------------------------------------------------
  # * Set parameters after changing equipment
  #    new_atk  : attack power after changing equipment
  #    new_pdef : physical defense after changing equipment
  #    new_mdef : magic defense after changing equipment
  #--------------------------------------------------------------------------
  def set_new_parameters(new_str, new_agi, new_dex, new_int, new_atk,
    new_pdef, new_mdef)
    if @new_str != new_str || @new_agi != new_agi || @new_dex != new_dex ||
      @new_int != new_int || @new_atk != new_atk or @new_pdef != new_pdef or
      @new_mdef != new_mdef     
      @new_atk = new_atk
      @new_pdef = new_pdef
      @new_mdef = new_mdef
      @new_str = new_str
      @new_agi = new_agi
      @new_dex = new_dex
      @new_int = new_int
      refresh
    end
  end
end

#==============================================================================
# ** Window_EquipRight
#------------------------------------------------------------------------------
#  This window displays items the actor is currently equipped with on the
#  equipment screen.
#==============================================================================

class Window_EquipRight < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #    actor : actor
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(272, 64, 368, 128)
    self.contents = Bitmap.new(width - 32, height - 32)
    @actor = actor
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # * Item Acquisition
  #--------------------------------------------------------------------------
  def item
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @data = []
    @data.push($data_weapons[@actor.weapon_id])
    @data.push($data_weapons[@actor.weapon2_id])
    @data.push($data_armors[@actor.armor3_id])
    @item_max = @data.size
    self.contents.font.color = system_color
    self.contents.draw_text(4, 32 * 0, 92, 32, $data_system.words.weapon)
    self.contents.draw_text(4, 32 * 1, 92, 32, $data_system.words.weapon)
    self.contents.draw_text(4, 32 * 2, 92, 32, $data_system.words.armor3)
    draw_item_name(@data[0], 92, 32 * 0)
    draw_item_name(@data[1], 92, 32 * 1)
    draw_item_name(@data[2], 92, 32 * 2)
  end
  #--------------------------------------------------------------------------
  # * Help Text Update
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

#==============================================================================
# ** Window_EquipItem
#------------------------------------------------------------------------------
#  This window displays choices when opting to change equipment on the
#  equipment screen.
#==============================================================================

class Window_EquipItem < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #    actor      : actor
  #    equip_type : equip region (0-3)
  #--------------------------------------------------------------------------
  def initialize(actor, equip_type)
    super(272, 192, 368, 288)
    @actor = actor
    @equip_type = equip_type
    @column_max = 1
    refresh
    self.active = false
    self.index = -1
  end
  #--------------------------------------------------------------------------
  # * Item Acquisition
  #--------------------------------------------------------------------------
  def item
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    # Add equippable weapons
    if @equip_type == 0
      weapon_set = $data_classes[@actor.class_id].weapon_set
      for i in 1...$data_weapons.size
        if $game_party.weapon_number(i) > 0 and weapon_set.include?(i)
          @data.push($data_weapons[i])
        end
      end
    end
    # Add equippable armor
    if @equip_type != 0
      armor_set = $data_classes[@actor.class_id].armor_set
      for i in 1...$data_armors.size
        if $game_party.armor_number(i) > 0 and armor_set.include?(i)
          if $data_armors[i].kind == @equip_type-1
            @data.push($data_armors[i])
          end
        end
      end
    end
    # Add blank page
    @data.push(nil)
    # Make a bit map and draw all items
    @item_max = @data.size
    self.contents = Bitmap.new(width - 32, row_max * 32)
    for i in 0...@item_max-1
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #    index : item number
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    x = 4
    y = index * 32
    case item
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    bitmap = RPG::Cache.icon(item.icon_name)
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
    self.contents.font.color = normal_color
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
    self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  end
  #--------------------------------------------------------------------------
  # * Help Text Update
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

class Window_MHud < Window_Base
  def initialize(actor)
    super(0, 352, 272, 128)
    self.contents = Bitmap.new(width - 32, height - 32)
    @actor = actor
    refresh
  end
  def refresh
    self.contents.clear
    draw_actor_graphic(@actor, 10, 64)
    draw_actor_hp(@actor, 64, 10)
    draw_actor_sp(@actor, 64, 42)
  end
end

#==============================================================================
# ** Scene_Equip
#------------------------------------------------------------------------------
#  This class performs equipment screen processing.
#==============================================================================

class Scene_Equip
  #--------------------------------------------------------------------------
  # * Object Initialization
  #    actor_index : actor index
  #    equip_index : equipment index
  #--------------------------------------------------------------------------
  def initialize(actor_index = 0, equip_index = 0)
    @actor_index = actor_index
    @equip_index = equip_index
  end
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    # Get actor
    @actor = $game_party.actors[@actor_index]
    # Make windows
    @help_window = Window_Help.new
    @left_window = Window_EquipLeft.new(@actor)
    @right_window = Window_EquipRight.new(@actor)
    @item_window1 = Window_EquipItem.new(@actor, 0)
    @item_window2 = Window_EquipItem.new(@actor, 3)
    @hud_window = Window_MHud.new(@actor)
    # Associate help window
    @right_window.help_window = @help_window
    @item_window1.help_window = @help_window
    @item_window2.help_window = @help_window
    # Set cursor position
    @right_window.index = @equip_index
    refresh
    # Execute transition
    Graphics.transition
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end
    # Prepare for transition
    Graphics.freeze
    # Dispose of windows
    @help_window.dispose
    @left_window.dispose
    @right_window.dispose
    @item_window1.dispose
    @item_window2.dispose
    @hud_window.dispose
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    @hud_window.refresh
    # Set item window to visible
    @item_window1.visible = (@right_window.index == 0 or @right_window.index == 1)
    @item_window2.visible = (@right_window.index == 2)
    # Get currently equipped item
    item1 = @right_window.item
    # Set current item window to @item_window
    case @right_window.index
    when 0
      @item_window = @item_window1
    when 1
      @item_window = @item_window1
    when 2
      @item_window = @item_window2
    end
    @equip_type = @right_window.index == 2 ? 4 : @right_window.index
    # If right window is active
    if @right_window.active
      # Erase parameters for after equipment change
      @left_window.set_new_parameters(nil, nil, nil, nil, nil, nil, nil)
    end
    # If item window is active
    if @item_window.active
      # Get currently selected item
      item2 = @item_window.item
      # Change equipment
      last_hp = @actor.hp
      last_sp = @actor.sp
      @actor.equip(@equip_type, item2 == nil ? 0 : item2.id)
      # Get parameters for after equipment change
      new_str = @actor.str
      new_agi = @actor.agi
      new_dex = @actor.dex
      new_int = @actor.int
      new_atk = @actor.atk
      new_pdef = @actor.pdef
      new_mdef = @actor.mdef
      # Return equipment
      @actor.equip(@equip_type, item1 == nil ? 0 : item1.id)
      @actor.hp = last_hp
      @actor.sp = last_sp
      # Draw in left window
      @left_window.set_new_parameters(new_str, new_agi, new_dex, new_int, new_atk,
      new_pdef, new_mdef)
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    # Update windows
    @left_window.update
    @right_window.update
    @item_window.update
    refresh
    # If right window is active: call update_right
    if @right_window.active
      update_right
      return
    end
    # If item window is active: call update_item
    if @item_window.active
      update_item
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when right window is active)
  #--------------------------------------------------------------------------
  def update_right
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to menu screen
      $scene = Scene_Menu.new(2)
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # If equipment is fixed
      if @actor.equip_fix?(@right_window.index)
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # Activate item window
      @right_window.active = false
      @item_window.active = true
      @item_window.index = 0
      return
    end
    # If R button was pressed
    if Input.trigger?(Input::R)
      # Play cursor SE
      $game_system.se_play($data_system.cursor_se)
      # To next actor
      @actor_index += 1
      @actor_index %= $game_party.actors.size
      # Switch to different equipment screen
      $scene = Scene_Equip.new(@actor_index, @right_window.index)
      return
    end
    # If L button was pressed
    if Input.trigger?(Input::L)
      # Play cursor SE
      $game_system.se_play($data_system.cursor_se)
      # To previous actor
      @actor_index += $game_party.actors.size - 1
      @actor_index %= $game_party.actors.size
      # Switch to different equipment screen
      $scene = Scene_Equip.new(@actor_index, @right_window.index)
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when item window is active)
  #--------------------------------------------------------------------------
  def update_item
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Activate right window
      @right_window.active = true
      @item_window.active = false
      @item_window.index = -1
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Play equip SE
      $game_system.se_play($data_system.equip_se)
      # Get currently selected data on the item window
      item = @item_window.item
      # Change equipment
      @actor.equip(@equip_type, item == nil ? 0 : item.id)
      # Activate right window
      @right_window.active = true
      @item_window.active = false
      @item_window.index = -1
      # Remake right window and item window contents
      @right_window.refresh
      @item_window.refresh
      return
    end
  end
end

rpgmanumaker

avatar
Hola, espero que me puedas ayudar. Abrí este tema para ver si alguien podría ayudarme a aprender RGSS2. Bueno, más bien a hacer una script, pero como mis conocimientos apenas llegan a básicos se me hace imposible hacerla sin un buen tutor XD. Espero que le eches un vistazo y que me digas si me puedes ayudar. Sea cual sea la respuesta te doy las gracias adelantadas XD

youkai

avatar
Hola manumaker, ya te termine el script que me pediste. Dentro de el vienen las explicaciones al inicio. Disculpa la tardanza y la forma en la que lo entrego, pero es que ya no tengo casi tiempo libre Crying or Very sad
Para usarlo reemplaza todo el contenido de Scene_Battler por esto:
Código:
module Youkai
   
  Morpho_state_id = 17            # ID del estado de metamorfosis en la BD
  Morpho_skill_id = 83            # ID de la habilidad que activa la metamorfosis
  Morpho_items_element = 17      # ID del atributo de los items que se usan para la metamorfosis
 
  def self.metamorfosis(item_id)
    case item_id
    when 21 then return [5,6,7,8]
    # when ID_del_Item then return [ID_de_las_habilidades]
    end
    return []
  end
end

#==============================================================================
# ■ Window_Item
#------------------------------------------------------------------------------
#  アイテム画面などで、所持アイテムの一覧を表示するウィンドウです。
#==============================================================================

class Window_MorphoItem < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #    x      : ウィンドウの X 座標
  #    y      : ウィンドウの Y 座標
  #    width  : ウィンドウの幅
  #    height : ウィンドウの高さ
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    super(x, y, width, height)
    @column_max = 2
    self.index = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● アイテムの取得
  #--------------------------------------------------------------------------
  def item
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ● アイテムをリストに含めるかどうか
  #    item : アイテム
  #--------------------------------------------------------------------------
  def include?(item)
    return false if item == nil
    if $game_temp.in_battle
      return false unless item.is_a?(RPG::Item)
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● アイテムを許可状態で表示するかどうか
  #    item : アイテム
  #--------------------------------------------------------------------------
  def enable?(item)
    return true
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    @data = []
    for item in $game_party.items
      next unless include?(item) && item.element_set != Youkai::Morpho_items_element
      @data.push(item)
      if item.is_a?(RPG::Item) and item.id == $game_party.last_item_id
        self.index = @data.size - 1
      end
    end
    @data.push(nil) if include?(nil)
    @item_max = @data.size
    create_contents
    for i in 0...@item_max
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #    index : 項目番号
  #--------------------------------------------------------------------------
  def draw_item(index)
    rect = item_rect(index)
    self.contents.clear_rect(rect)
    item = @data[index]
    if item != nil
      number = $game_party.item_number(item)
      enabled = enable?(item)
      rect.width -= 4
      draw_item_name(item, rect.x, rect.y, enabled)
      self.contents.draw_text(rect, sprintf(":%2d", number), 2)
    end
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(item == nil ? "" : item.description)
  end
end


#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
#  バトル画面の処理を行うクラスです。
#==============================================================================

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    $game_temp.in_battle = true
    @spriteset = Spriteset_Battle.new
    @message_window = Window_BattleMessage.new
    @action_battlers = []
    create_info_viewport
  end
  #--------------------------------------------------------------------------
  # ● 開始後処理
  #--------------------------------------------------------------------------
  def post_start
    super
    process_battle_start
  end
  #--------------------------------------------------------------------------
  # ● 終了処理
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_info_viewport
    @message_window.dispose
    @spriteset.dispose
    unless $scene.is_a?(Scene_Gameover)
      $scene = nil if $BTEST
    end
  end
  #--------------------------------------------------------------------------
  # ● 基本更新処理
  #    main : メインの update メソッドからの呼び出し
  #--------------------------------------------------------------------------
  def update_basic(main = false)
    Graphics.update unless main    # ゲーム画面を更新
    Input.update unless main        # 入力情報を更新
    $game_system.update            # タイマーを更新
    $game_troop.update              # 敵グループを更新
    @spriteset.update              # スプライトセットを更新
    @message_window.update          # メッセージウィンドウを更新
  end
  #--------------------------------------------------------------------------
  # ● 一定時間ウェイト
  #    duration : ウェイト時間 (フレーム数)
  #    no_fast  : 早送り無効
  #    シーンクラスの update 処理の中でウェイトをかけるためのメソッド。
  #    update は 1 フレームに 1 回呼ばれるのが原則だが、戦闘中は処理の流れを
  #    把握しにくくなるため、例外的にこのメソッドを使用する。
  #--------------------------------------------------------------------------
  def wait(duration, no_fast = false)
    for i in 0...duration
      update_basic
      break if not no_fast and i >= duration / 2 and show_fast?
    end
  end
  #--------------------------------------------------------------------------
  # ● メッセージ表示が終わるまでウェイト
  #--------------------------------------------------------------------------
  def wait_for_message
    @message_window.update
    while $game_message.visible
      update_basic
    end
  end
  #--------------------------------------------------------------------------
  # ● アニメーション表示が終わるまでウェイト
  #--------------------------------------------------------------------------
  def wait_for_animation
    while @spriteset.animation?
      update_basic
    end
  end
  #--------------------------------------------------------------------------
  # ● 早送り判定
  #--------------------------------------------------------------------------
  def show_fast?
    return (Input.press?(Input::A) or Input.press?(Input::C))
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    update_basic(true)
    update_info_viewport                  # 情報表示ビューポートを更新
    if $game_message.visible
      @info_viewport.visible = false
      @message_window.visible = true
    end
    unless $game_message.visible          # メッセージ表示中以外
      return if judge_win_loss            # 勝敗判定
      update_scene_change
      if @target_enemy_window != nil
        update_target_enemy_selection    # 対象敵キャラ選択
      elsif @target_actor_window != nil
        update_target_actor_selection    # 対象アクター選択
      elsif @skill_window != nil
        update_skill_selection            # スキル選択
      elsif @item_window != nil
        update_item_selection            # アイテム選択
      elsif @morpho_window != nil
        update_metamorphosis_item_selection
      elsif @party_command_window.active
        update_party_command_selection    # パーティコマンド選択
      elsif @actor_command_window.active
        update_actor_command_selection    # アクターコマンド選択
      else
        process_battle_event              # バトルイベントの処理
        process_action                    # 戦闘行動
        process_battle_event              # バトルイベントの処理
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 情報表示ビューポートの作成
  #--------------------------------------------------------------------------
  def create_info_viewport
    @info_viewport = Viewport.new(0, 288, 544, 128)
    @info_viewport.z = 100
    @status_window = Window_BattleStatus.new
    @party_command_window = Window_PartyCommand.new
    @actor_command_window = Window_ActorCommand.new
    @status_window.viewport = @info_viewport
    @party_command_window.viewport = @info_viewport
    @actor_command_window.viewport = @info_viewport
    @status_window.x = 128
    @actor_command_window.x = 544
    @info_viewport.visible = false
  end
  #--------------------------------------------------------------------------
  # ● 情報表示ビューポートの解放
  #--------------------------------------------------------------------------
  def dispose_info_viewport
    @status_window.dispose
    @party_command_window.dispose
    @actor_command_window.dispose
    @info_viewport.dispose
  end
  #--------------------------------------------------------------------------
  # ● 情報表示ビューポートの更新
  #--------------------------------------------------------------------------
  def update_info_viewport
    @party_command_window.update
    @actor_command_window.update
    @status_window.update
    if @party_command_window.active and @info_viewport.ox > 0
      @info_viewport.ox -= 16
    elsif @actor_command_window.active and @info_viewport.ox < 128
      @info_viewport.ox += 16
    end
  end
  #--------------------------------------------------------------------------
  # ● バトルイベントの処理
  #--------------------------------------------------------------------------
  def process_battle_event
    loop do
      return if judge_win_loss
      return if $game_temp.next_scene != nil
      $game_troop.interpreter.update
      $game_troop.setup_battle_event
      wait_for_message
      process_action if $game_troop.forcing_battler != nil
      return unless $game_troop.interpreter.running?
      update_basic
    end
  end
  #--------------------------------------------------------------------------
  # ● 勝敗判定
  #--------------------------------------------------------------------------
  def judge_win_loss
    if $game_temp.in_battle
      if $game_party.all_dead?
        process_defeat
        return true
      elsif $game_troop.all_dead?
        process_victory
        return true
      else
        return false
      end
    else
      return true
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘終了
  #    result : 結果 (0:勝利 1:逃走 2:敗北)
  #--------------------------------------------------------------------------
  def battle_end(result)
    if result == 2 and not $game_troop.can_lose
      call_gameover
    else
      $game_party.clear_actions
      $game_party.remove_states_battle
      $game_troop.clear
      for target in $game_party.members
        for i in target.skills
          target.forget_skill(i.id)
        end
        for learning in target.class.learnings
          target.learn_skill(learning.skill_id) if learning.level <= target.level
        end
      end
      if $game_temp.battle_proc != nil
        $game_temp.battle_proc.call(result)
        $game_temp.battle_proc = nil
      end
      unless $BTEST
        $game_temp.map_bgm.play
        $game_temp.map_bgs.play
      end
      $scene = Scene_Map.new
      @message_window.clear
      Graphics.fadeout(30)
    end
    $game_temp.in_battle = false
  end
  #--------------------------------------------------------------------------
  # ● 次のアクターのコマンド入力へ
  #--------------------------------------------------------------------------
  def next_actor
    loop do
      if @actor_index == $game_party.members.size-1
        start_main
        return
      end
      @status_window.index = @actor_index += 1
      @active_battler = $game_party.members[@actor_index]
      battler = @actor_index == 0 ? @actor_index : @actor_index - 1
      if $game_party.members[battler].last_skill_id == Youkai::Morpho_skill_id
        $game_party.consume_item(@mitem)
      end
      if @active_battler.auto_battle
        @active_battler.make_action
        next
      end
      break if @active_battler.inputable?
    end
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● 前のアクターのコマンド入力へ
  #--------------------------------------------------------------------------
  def prior_actor
    loop do
      if @actor_index == 0
        start_party_command_selection
        return
      end
      @status_window.index = @actor_index -= 1
      @active_battler = $game_party.members[@actor_index]
      battler = @actor_index == 0 ? @actor_index : @actor_index - 1
      if $game_party.members[battler].last_skill_id == Youkai::Morpho_skill_id
        $game_party.gain_item(@mitem, 1)
      end
      next if @active_battler.auto_battle
      break if @active_battler.inputable?
    end
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● パーティコマンド選択の開始
  #--------------------------------------------------------------------------
  def start_party_command_selection
    if $game_temp.in_battle
      @status_window.refresh
      @status_window.index = @actor_index = -1
      @active_battler = nil
      @info_viewport.visible = true
      @message_window.visible = false
      @party_command_window.active = true
      @party_command_window.index = 0
      @actor_command_window.active = false
      $game_party.clear_actions
      if $game_troop.surprise or not $game_party.inputable?
        start_main
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● パーティコマンド選択の更新
  #--------------------------------------------------------------------------
  def update_party_command_selection
    if Input.trigger?(Input::C)
      case @party_command_window.index
      when 0  # 戦う
        Sound.play_decision
        @status_window.index = @actor_index = -1
        next_actor
      when 1  # 逃げる
        if $game_troop.can_escape == false
          Sound.play_buzzer
          return
        end
        Sound.play_decision
        process_escape
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● アクターコマンド選択の開始
  #--------------------------------------------------------------------------
  def start_actor_command_selection
    @party_command_window.active = false
    @actor_command_window.setup(@active_battler)
    @actor_command_window.active = true
    @actor_command_window.index = 0
  end
  #--------------------------------------------------------------------------
  # ● アクターコマンド選択の更新
  #--------------------------------------------------------------------------
  def update_actor_command_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      prior_actor
    elsif Input.trigger?(Input::C)
      case @actor_command_window.index
      when 0  # 攻撃
        Sound.play_decision
        @active_battler.action.set_attack
        start_target_enemy_selection
      when 1  # スキル
        Sound.play_decision
        start_skill_selection
      when 2  # 防御
        Sound.play_decision
        @active_battler.action.set_guard
        next_actor
      when 3  # アイテム
        Sound.play_decision
        start_item_selection
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 対象敵キャラ選択の開始
  #--------------------------------------------------------------------------
  def start_target_enemy_selection
    @target_enemy_window = Window_TargetEnemy.new
    @target_enemy_window.y = @info_viewport.rect.y
    @info_viewport.rect.x += @target_enemy_window.width
    @info_viewport.ox += @target_enemy_window.width
    @actor_command_window.active = false
  end
  #--------------------------------------------------------------------------
  # ● 対象敵キャラ選択の終了
  #--------------------------------------------------------------------------
  def end_target_enemy_selection
    @info_viewport.rect.x -= @target_enemy_window.width
    @info_viewport.ox -= @target_enemy_window.width
    @target_enemy_window.dispose
    @target_enemy_window = nil
    if @actor_command_window.index == 0
      @actor_command_window.active = true
    end
  end
  #--------------------------------------------------------------------------
  # ● 対象敵キャラ選択の更新
  #--------------------------------------------------------------------------
  def update_target_enemy_selection
    @target_enemy_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_target_enemy_selection
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      @active_battler.action.target_index = @target_enemy_window.enemy.index
      end_target_enemy_selection
      end_skill_selection
      end_item_selection
      next_actor
    end
  end
  #--------------------------------------------------------------------------
  # ● 対象アクター対象選択の開始
  #--------------------------------------------------------------------------
  def start_target_actor_selection
    @target_actor_window = Window_BattleStatus.new
    @target_actor_window.index = 0
    @target_actor_window.active = true
    @target_actor_window.y = @info_viewport.rect.y
    @info_viewport.rect.x += @target_actor_window.width
    @info_viewport.ox += @target_actor_window.width
    @actor_command_window.active = false
  end
  #--------------------------------------------------------------------------
  # ● 対象アクター選択の終了
  #--------------------------------------------------------------------------
  def end_target_actor_selection
    @info_viewport.rect.x -= @target_actor_window.width
    @info_viewport.ox -= @target_actor_window.width
    @target_actor_window.dispose
    @target_actor_window = nil
  end
  #--------------------------------------------------------------------------
  # ● 対象アクター選択の更新
  #--------------------------------------------------------------------------
  def update_target_actor_selection
    @target_actor_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_target_actor_selection
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      @active_battler.action.target_index = @target_actor_window.index
      end_target_actor_selection
      end_skill_selection
      end_item_selection
      next_actor
    end
  end
  #--------------------------------------------------------------------------
  # ● スキル選択の開始
  #--------------------------------------------------------------------------
  def start_skill_selection
    @help_window = Window_Help.new
    @skill_window = Window_Skill.new(0, 56, 544, 232, @active_battler)
    @skill_window.help_window = @help_window
    @actor_command_window.active = false
  end
  #--------------------------------------------------------------------------
  # ● スキル選択の終了
  #--------------------------------------------------------------------------
  def end_skill_selection
    if @skill_window != nil
      @skill_window.dispose
      @skill_window = nil
      @help_window.dispose
      @help_window = nil
    end
    @actor_command_window.active = true
  end
  #--------------------------------------------------------------------------
  # ● スキル選択の更新
  #--------------------------------------------------------------------------
  def update_skill_selection
    @skill_window.active = true
    @skill_window.update
    @help_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_skill_selection
    elsif Input.trigger?(Input::C)
      @skill = @skill_window.skill
      if @skill != nil
        @active_battler.last_skill_id = @skill.id
      end
      if @active_battler.skill_can_use?(@skill)
        Sound.play_decision
        if @active_battler.last_skill_id == Youkai::Morpho_skill_id
          end_skill_selection
          start_metamorphosis_item_selection
          return
        end
        determine_skill
      else
        Sound.play_buzzer
      end
    end
  end
 
  def start_metamorphosis_item_selection
    @help_window = Window_Help.new
    @morpho_window = Window_MorphoItem.new(0, 56, 544, 232)
    @morpho_window.help_window = @help_window
    @actor_command_window.active = false
  end
 
  def end_metamorphosis_item_selection
    if @morpho_window != nil
      @morpho_window.dispose
      @morpho_window = nil
      @help_window.dispose
      @help_window = nil
    end
    if Input.trigger?(Input::B)
      start_skill_selection
    else
      @actor_command_window.active = true
    end
  end
 
  def update_metamorphosis_item_selection
    @morpho_window.active = true
    @morpho_window.update
    @help_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_metamorphosis_item_selection
    elsif Input.trigger?(Input::C)
      @mitem = @morpho_window.item
      if @mitem != nil
        @metamorphosis_item = @mitem.id
        Sound.play_decision
        determine_skill
      else
        Sound.play_buzzer
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● スキルの決定
  #--------------------------------------------------------------------------
  def determine_skill
    @active_battler.action.set_skill(@skill.id)
    @skill_window.active = false if @skill_window != nil
    @morpho_window.active = false if @morpho_window != nil
    if @skill.need_selection?
      if @skill.for_opponent?
        start_target_enemy_selection
      else
        start_target_actor_selection
      end
    else
      end_skill_selection
      end_metamorphosis_item_selection
      next_actor
    end
  end
  #--------------------------------------------------------------------------
  # ● アイテム選択の開始
  #--------------------------------------------------------------------------
  def start_item_selection
    @help_window = Window_Help.new
    @item_window = Window_Item.new(0, 56, 544, 232)
    @item_window.help_window = @help_window
    @actor_command_window.active = false
  end
  #--------------------------------------------------------------------------
  # ● アイテム選択の終了
  #--------------------------------------------------------------------------
  def end_item_selection
    if @item_window != nil
      @item_window.dispose
      @item_window = nil
      @help_window.dispose
      @help_window = nil
    end
    @actor_command_window.active = true
  end
  #--------------------------------------------------------------------------
  # ● アイテム選択の更新
  #--------------------------------------------------------------------------
  def update_item_selection
    @item_window.active = true
    @item_window.update
    @help_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_item_selection
    elsif Input.trigger?(Input::C)
      @item = @item_window.item
      if @item != nil
        $game_party.last_item_id = @item.id
      end
      if $game_party.item_can_use?(@item)
        Sound.play_decision
        determine_item
      else
        Sound.play_buzzer
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● アイテムの決定
  #--------------------------------------------------------------------------
  def determine_item
    @active_battler.action.set_item(@item.id)
    @item_window.active = false
    if @item.need_selection?
      if @item.for_opponent?
        start_target_enemy_selection
      else
        start_target_actor_selection
      end
    else
      end_item_selection
      next_actor
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘開始の処理
  #--------------------------------------------------------------------------
  def process_battle_start
    @message_window.clear
    wait(10)
    for name in $game_troop.enemy_names
      text = sprintf(Vocab::Emerge, name)
      $game_message.texts.push(text)
    end
    if $game_troop.preemptive
      if $game_party.members.size == 1
        text = sprintf(Vocab::PreemptiveSolo, $game_party.name)
      else
        text = sprintf(Vocab::Preemptive, $game_party.name)
      end
      $game_message.texts.push(text)
    elsif $game_troop.surprise
      if $game_party.members.size == 1
        text = sprintf(Vocab::SurpriseSolo, $game_party.name)
      else
        text = sprintf(Vocab::Surprise, $game_party.name)
      end
      $game_message.texts.push(text)
    end
    wait_for_message
    @message_window.clear
    make_escape_ratio
    process_battle_event
    start_party_command_selection
  end
  #--------------------------------------------------------------------------
  # ● 逃走成功率の作成
  #--------------------------------------------------------------------------
  def make_escape_ratio
    actors_agi = $game_party.average_agi
    enemies_agi = $game_troop.average_agi
    @escape_ratio = 150 - 100 * enemies_agi / actors_agi
  end
  #--------------------------------------------------------------------------
  # ● 逃走の処理
  #--------------------------------------------------------------------------
  def process_escape
    @info_viewport.visible = false
    @message_window.visible = true
    if $game_party.members.size == 1
      text = sprintf(Vocab::EscapeStartSolo, $game_party.name)
    else
      text = sprintf(Vocab::EscapeStart, $game_party.name)
    end
    $game_message.texts.push(text)
    if $game_troop.preemptive
      success = true
    else
      success = (rand(100) < @escape_ratio)
    end
    Sound.play_escape
    if success
      wait_for_message
      battle_end(1)
    else
      @escape_ratio += 10
      $game_message.texts.push('\.' + Vocab::EscapeFailure)
      wait_for_message
      $game_party.clear_actions
      start_main
    end
  end
  #--------------------------------------------------------------------------
  # ● 勝利の処理
  #--------------------------------------------------------------------------
  def process_victory
    @info_viewport.visible = false
    @message_window.visible = true
    RPG::BGM.stop
    $game_system.battle_end_me.play
    unless $BTEST
      $game_temp.map_bgm.play
      $game_temp.map_bgs.play
    end
    display_exp_and_gold
    display_drop_items
    display_level_up
    battle_end(0)
  end
  #--------------------------------------------------------------------------
  # ● 獲得した経験値とお金の表示
  #--------------------------------------------------------------------------
  def display_exp_and_gold
    exp = $game_troop.exp_total
    gold = $game_troop.gold_total
    $game_party.gain_gold(gold)
    if $game_party.members.size == 1
      text = sprintf(Vocab::VictorySolo, $game_party.name)
    else
      text = sprintf(Vocab::Victory, $game_party.name)
    end
    $game_message.texts.push('\|' + text)
    if exp > 0
      text = sprintf(Vocab::ObtainExp, exp)
      $game_message.texts.push('\.' + text)
    end
    if gold > 0
      text = sprintf(Vocab::ObtainGold, gold, Vocab::gold)
      $game_message.texts.push('\.' + text)
    end
    wait_for_message
  end
  #--------------------------------------------------------------------------
  # ● 獲得したドロップアイテムの表示
  #--------------------------------------------------------------------------
  def display_drop_items
    drop_items = $game_troop.make_drop_items
    for item in drop_items
      $game_party.gain_item(item, 1)
      text = sprintf(Vocab::ObtainItem, item.name)
      $game_message.texts.push(text)
    end
    wait_for_message
  end
  #--------------------------------------------------------------------------
  # ● レベルアップの表示
  #--------------------------------------------------------------------------
  def display_level_up
    exp = $game_troop.exp_total
    for actor in $game_party.existing_members
      last_level = actor.level
      last_skills = actor.skills
      actor.gain_exp(exp, true)
    end
    wait_for_message
  end
  #--------------------------------------------------------------------------
  # ● 敗北の処理
  #--------------------------------------------------------------------------
  def process_defeat
    @info_viewport.visible = false
    @message_window.visible = true
    if $game_party.members.size == 1
      text = sprintf(Vocab::DefeatSolo, $game_party.name)
    else
      text = sprintf(Vocab::Defeat, $game_party.name)
    end
    $game_message.texts.push(text)
    wait_for_message
    battle_end(2)
  end
  #--------------------------------------------------------------------------
  # ● 画面切り替えの実行
  #--------------------------------------------------------------------------
  def update_scene_change
    case $game_temp.next_scene
    when "map"
      call_map
    when "gameover"
      call_gameover
    when "title"
      call_title
    else
      $game_temp.next_scene = nil
    end
  end
  #--------------------------------------------------------------------------
  # ● マップ画面への切り替え
  #--------------------------------------------------------------------------
  def call_map
    $game_temp.next_scene = nil
    battle_end(1)
  end
  #--------------------------------------------------------------------------
  # ● ゲームオーバー画面への切り替え
  #--------------------------------------------------------------------------
  def call_gameover
    $game_temp.next_scene = nil
    $scene = Scene_Gameover.new
    @message_window.clear
  end
  #--------------------------------------------------------------------------
  # ● タイトル画面への切り替え
  #--------------------------------------------------------------------------
  def call_title
    $game_temp.next_scene = nil
    $scene = Scene_Title.new
    @message_window.clear
    Graphics.fadeout(60)
  end
  #--------------------------------------------------------------------------
  # ● 戦闘処理の実行開始
  #--------------------------------------------------------------------------
  def start_main
    $game_troop.increase_turn
    @info_viewport.visible = false
    @info_viewport.ox = 0
    @message_window.visible = true
    @party_command_window.active = false
    @actor_command_window.active = false
    @status_window.index = @actor_index = -1
    @active_battler = nil
    @message_window.clear
    $game_troop.make_actions
    make_action_orders
    wait(20)
  end
  #--------------------------------------------------------------------------
  # ● 行動順序作成
  #--------------------------------------------------------------------------
  def make_action_orders
    @action_battlers = []
    unless $game_troop.surprise
      @action_battlers += $game_party.members
    end
    unless $game_troop.preemptive
      @action_battlers += $game_troop.members
    end
    for battler in @action_battlers
      battler.action.make_speed
    end
    @action_battlers.sort! do |a,b|
      b.action.speed - a.action.speed
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の処理
  #--------------------------------------------------------------------------
  def process_action
    return if judge_win_loss
    return if $game_temp.next_scene != nil
    set_next_active_battler
    if @active_battler == nil
      turn_end
      return
    end
    return if @active_battler.dead?
    @message_window.clear
    wait(5)
    @active_battler.white_flash = true
    unless @active_battler.action.forcing
      @active_battler.action.prepare
    end
    if @active_battler.action.valid?
      execute_action
    end
    unless @active_battler.action.forcing
      @message_window.clear
      remove_states_auto
      display_current_state
    end
    @active_battler.white_flash = false
    @message_window.clear
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行
  #--------------------------------------------------------------------------
  def execute_action
    case @active_battler.action.kind
    when 0  # 基本
      case @active_battler.action.basic
      when 0  # 攻撃
        execute_action_attack
      when 1  # 防御
        execute_action_guard
      when 2  # 逃走
        execute_action_escape
      when 3  # 待機
        execute_action_wait
      end
    when 1  # スキル
      execute_action_skill
    when 2  # アイテム
      execute_action_item
    end
  end
  #--------------------------------------------------------------------------
  # ● ターン終了
  #--------------------------------------------------------------------------
  def turn_end
    $game_troop.turn_ending = true
    $game_party.slip_damage_effect
    $game_troop.slip_damage_effect
    $game_party.do_auto_recovery
    $game_troop.preemptive = false
    $game_troop.surprise = false
    process_battle_event
    $game_troop.turn_ending = false
    start_party_command_selection
  end
  #--------------------------------------------------------------------------
  # ● 次に行動するべきバトラーの設定
  #    イベントコマンドで [戦闘行動の強制] が行われているときはそのバトラー
  #    を設定して、リストから削除する。それ以外はリストの先頭から取得する。
  #    現在パーティにいないアクターを取得した場合 (index が nil, バトルイベ
  #    ントでの離脱直後などに発生) は、それをスキップする。
  #--------------------------------------------------------------------------
  def set_next_active_battler
    loop do
      if $game_troop.forcing_battler != nil
        @active_battler = $game_troop.forcing_battler
        @action_battlers.delete(@active_battler)
        $game_troop.forcing_battler = nil
      else
        @active_battler = @action_battlers.shift
      end
      return if @active_battler == nil
      return if @active_battler.index != nil
    end
  end
  #--------------------------------------------------------------------------
  # ● ステート自然解除
  #--------------------------------------------------------------------------
  def remove_states_auto
    last_st = @active_battler.states
    @active_battler.remove_states_auto
    if @active_battler.states != last_st
      wait(5)
      display_state_changes(@active_battler)
      wait(30)
      @message_window.clear
    end
  end
  #--------------------------------------------------------------------------
  # ● 現在のステートの表示
  #--------------------------------------------------------------------------
  def display_current_state
    state_text = @active_battler.most_important_state_text
    unless state_text.empty?
      wait(5)
      text = @active_battler.name + state_text
      @message_window.add_instant_text(text)
      wait(45)
      @message_window.clear
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : 攻撃
  #--------------------------------------------------------------------------
  def execute_action_attack
    text = sprintf(Vocab::DoAttack, @active_battler.name)
    @message_window.add_instant_text(text)
    targets = @active_battler.action.make_targets
    display_attack_animation(targets)
    wait(20)
    for target in targets
      target.attack_effect(@active_battler)
      display_action_effects(target)
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : 防御
  #--------------------------------------------------------------------------
  def execute_action_guard
    text = sprintf(Vocab::DoGuard, @active_battler.name)
    @message_window.add_instant_text(text)
    wait(45)
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : 逃走
  #--------------------------------------------------------------------------
  def execute_action_escape
    text = sprintf(Vocab::DoEscape, @active_battler.name)
    @message_window.add_instant_text(text)
    @active_battler.escape
    Sound.play_escape
    wait(45)
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : 待機
  #--------------------------------------------------------------------------
  def execute_action_wait
    text = sprintf(Vocab::DoWait, @active_battler.name)
    @message_window.add_instant_text(text)
    wait(45)
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : スキル
  #--------------------------------------------------------------------------
  def execute_action_skill
    skill = @active_battler.action.skill
    text = @active_battler.name + skill.message1
    @message_window.add_instant_text(apertura_exclamacion(text))
    unless skill.message2.empty?
      wait(10)
      @message_window.add_instant_text(skill.message2)
    end
    targets = @active_battler.action.make_targets
    display_animation(targets, skill.animation_id)
    @active_battler.mp -= @active_battler.calc_mp_cost(skill)
    $game_temp.common_event_id = skill.common_event_id
    for target in targets
      target.skill_effect(@active_battler, skill)
      display_action_effects(target, skill)
    end
  end
 
  def make_metamorphosis(target)
    for sk in target.skills
      target.forget_skill(sk.id)
    end
    for nsk in Youkai.metamorfosis(@mitem.id)
      target.learn_skill(nsk)
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : アイテム
  #--------------------------------------------------------------------------
  def execute_action_item
    item = @active_battler.action.item
    text = sprintf(Vocab::UseItem, @active_battler.name, item.name)
    @message_window.add_instant_text(text)
    targets = @active_battler.action.make_targets
    display_animation(targets, item.animation_id)
    $game_party.consume_item(item)
    $game_temp.common_event_id = item.common_event_id
    for target in targets
      target.item_effect(@active_battler, item)
      display_action_effects(target, item)
    end
  end
  #--------------------------------------------------------------------------
  # ● アニメーションの表示
  #    targets      : 対象者の配列
  #    animation_id : アニメーション ID (-1: 通常攻撃と同じ)
  #--------------------------------------------------------------------------
  def display_animation(targets, animation_id)
    if animation_id < 0
      display_attack_animation(targets)
    else
      display_normal_animation(targets, animation_id)
    end
    wait(20)
    wait_for_animation
  end
  #--------------------------------------------------------------------------
  # ● 攻撃アニメーションの表示
  #    targets : 対象者の配列
  #    敵キャラの場合は [敵の通常攻撃] 効果音を演奏して一瞬待つ。
  #    アクターの場合は二刀流を考慮 (左手武器は反転して表示) 。
  #--------------------------------------------------------------------------
  def display_attack_animation(targets)
    if @active_battler.is_a?(Game_Enemy)
      Sound.play_enemy_attack
      wait(15, true)
    else
      aid1 = @active_battler.atk_animation_id
      aid2 = @active_battler.atk_animation_id2
      display_normal_animation(targets, aid1, false)
      display_normal_animation(targets, aid2, true)
    end
    wait_for_animation
  end
  #--------------------------------------------------------------------------
  # ● 通常アニメーションの表示
  #    targets      : 対象者の配列
  #    animation_id : アニメーション ID
  #    mirror      : 左右反転
  #--------------------------------------------------------------------------
  def display_normal_animation(targets, animation_id, mirror = false)
    animation = $data_animations[animation_id]
    if animation != nil
      to_screen = (animation.position == 3)      # 位置が「画面」か?
      for target in targets.uniq
        target.animation_id = animation_id
        target.animation_mirror = mirror
        wait(20, true) unless to_screen          # 単体用ならウェイト
      end
      wait(20, true) if to_screen                # 全体用ならウェイト
    end
  end
  #--------------------------------------------------------------------------
  # ● 行動結果の表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_action_effects(target, obj = nil)
    unless target.skipped
      line_number = @message_window.line_number
      wait(5)
      skill = @active_battler.action.skill
      display_critical(target, obj)
      display_damage(target, obj)
      display_state_changes(target, obj)
      if line_number == @message_window.line_number
        display_failure(target, obj) unless target.states_active?
      end
      if line_number != @message_window.line_number
        wait(30)
      end
      @message_window.back_to(line_number)
    end
  end
  #--------------------------------------------------------------------------
  # ● クリティカルヒットの表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_critical(target, obj = nil)
    if target.critical
      if target.actor?
        text = Vocab::CriticalToActor
      else
        text = Vocab::CriticalToEnemy
      end
      @message_window.add_instant_text(text)
      wait(20)
    end
  end
  #--------------------------------------------------------------------------
  # ● ダメージの表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_damage(target, obj = nil)
    if target.missed
      display_miss(target, obj)
    elsif target.evaded
      display_evasion(target, obj)
    else
      display_hp_damage(target, obj)
      display_mp_damage(target, obj)
    end
  end
  #--------------------------------------------------------------------------
  # ● ミスの表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_miss(target, obj = nil)
    if obj == nil or obj.physical_attack
      if target.actor?
        text = sprintf(Vocab::ActorNoHit, target.name)
      else
        text = sprintf(Vocab::EnemyNoHit, target.name)
      end
      Sound.play_miss
    else
      text = sprintf(Vocab::ActionFailure, target.name)
    end
    @message_window.add_instant_text(text)
    wait(30)
  end
  #--------------------------------------------------------------------------
  # ● 回避の表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_evasion(target, obj = nil)
    if target.actor?
      text = sprintf(Vocab::ActorEvasion, target.name)
    else
      text = sprintf(Vocab::EnemyEvasion, target.name)
    end
    Sound.play_evasion
    @message_window.add_instant_text(text)
    wait(30)
  end
  #--------------------------------------------------------------------------
  # ● HP ダメージ表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_hp_damage(target, obj = nil)
    if target.hp_damage == 0                # ノーダメージ
      return if obj != nil and obj.damage_to_mp
      return if obj != nil and obj.base_damage == 0
      fmt = target.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
      text = sprintf(fmt, target.name)
    elsif target.absorbed                  # 吸収
      fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
      text = sprintf(fmt, target.name, target.hp_damage, Vocab::hp)
    elsif target.hp_damage > 0              # ダメージ
      if target.actor?
        text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage)
        Sound.play_actor_damage
        $game_troop.screen.start_shake(5, 5, 10)
      else
        text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage)
        Sound.play_enemy_damage
        target.blink = true
      end
    else                                    # 回復
      fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
      text = sprintf(fmt, target.name, -target.hp_damage, Vocab::hp)
      Sound.play_recovery
    end
    @message_window.add_instant_text(text)
    wait(30)
  end
  #--------------------------------------------------------------------------
  # ● MP ダメージ表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_mp_damage(target, obj = nil)
    return if target.dead?
    return if target.mp_damage == 0
    if target.absorbed                      # 吸収
      fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
      text = sprintf(fmt, target.name, target.mp_damage, Vocab::mp)
    elsif target.mp_damage > 0              # ダメージ
      fmt = target.actor? ? Vocab::ActorLoss : Vocab::EnemyLoss
      text = sprintf(fmt, target.name, target.mp_damage, Vocab::mp)
    else                                    # 回復
      fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
      text = sprintf(fmt, target.name, -target.mp_damage, Vocab::mp)
      Sound.play_recovery
    end
    @message_window.add_instant_text(text)
    wait(30)
  end
  #--------------------------------------------------------------------------
  # ● ステート変化の表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_state_changes(target, obj = nil)
    return if target.missed or target.evaded
    return unless target.states_active?
    if @message_window.line_number < 4
      @message_window.add_instant_text("")
    end
    display_added_states(target, obj)
    display_removed_states(target, obj)
    display_remained_states(target, obj)
    if @message_window.last_instant_text.empty?
      @message_window.back_one
    else
      wait(10)
    end
  end
  #--------------------------------------------------------------------------
  # ● 付加されたステートの表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_added_states(target, obj = nil)
    for state in target.added_states
      if target.actor?
        next if state.message1.empty?
        text = target.name + state.message1
      else
        next if state.message2.empty?
        text = target.name + state.message2
      end
      if state.id == 1                      # 戦闘不能
        target.perform_collapse
      end
      if state.id == Youkai::Morpho_state_id
        make_metamorphosis(target)
      end
      @message_window.replace_instant_text(apertura_exclamacion(text))
      wait(20)
    end
  end
  #--------------------------------------------------------------------------
  # ● 解除されたステートの表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_removed_states(target, obj = nil)
    for state in target.removed_states
      if state.id == Youkai::Morpho_state_id
        for i in target.skills
          target.forget_skill(i.id)
        end
        for learning in target.class.learnings
          target.learn_skill(learning.skill_id) if learning.level <= target.level
        end
      end
      next if state.message4.empty?
      text = target.name + state.message4
      @message_window.replace_instant_text(apertura_exclamacion(text))
      wait(20)
    end
  end
  #--------------------------------------------------------------------------
  # ● 変化しなかったステートの表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #    すでに眠っている相手をさらに眠らせようとした場合など。
  #--------------------------------------------------------------------------
  def display_remained_states(target, obj = nil)
    for state in target.remained_states
      next if state.message3.empty?
      text = target.name + state.message3
      @message_window.replace_instant_text(apertura_exclamacion(text))
      wait(20)
    end
  end
  #--------------------------------------------------------------------------
  # ● 失敗の表示
  #    target : 対象者 (アクター)
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_failure(target, obj)
    text = sprintf(Vocab::ActionFailure, target.name)
    @message_window.add_instant_text(text)
    wait(20)
  end
  #--------------------------------------------------------------------------
  # ● Añadir apertura de exclamación
  #    text    : El texto al que le añadirá la exclamación si es necesario
  #    Devuelve el texto modificado
  #--------------------------------------------------------------------------
  def apertura_exclamacion(text)
      if text =~ /!$/
        text.insert(0,"¡")
      end
      return text
  end
end

rpgmanumaker

avatar
Pues gracia por el script, pero... digamos que tengo unos problemitas.
1) por alguna razón da error en la linea 786. Cada vez que mato a un mob me salta un error del script.
2) Cuando activo la habilidad me da a elegir el objeto que designe como Morpho_items_element, pero cuando lo escojo no cambia ninguna de mis habilidades. Como hago para que cambien. Dónde debo ponerlo.
Siento las molestias y no hace falta que te apresures. Tomate tu tiempo, y cuando puedas le echas un vistazo haber que le pasa

youkai

avatar
Hola manumaker, lo primero que quiero hacer es un repaso de la configuracion:
Código:
module Youkai
   
  Morpho_state_id = 17            # ID del estado de metamorfosis en la BD
  debes de configurar bien el estado, como si fuese algun otro estado alterado, o sea, ponle nombre, prioridad, los turnos que esta activo y el porciento de curarse.

  Morpho_skill_id = 83            # ID de la habilidad que activa la metamorfosis
  Aqui no hay mucho que decir, simplemente es el id de la habilidad, la cual igual tienes que configurar como tal

  Morpho_items_element = 17      # ID del atributo de los items que se usan para la metamorfosis
  Y en este caso, debes agregarle el atributo a los items
 
  def self.metamorfosis(item_id)
    case item_id
    when 21 then return [5,6,7,8]
    # Para configurar bien esto debes de poner el ID del item que esta marcado con el atributo delante del "when" y entre corchetes las IDs de las habilidades que va a adquirir cuando use ese item, si quieres agregar otros item pues simplemente repites lo anterior, ej.
  when 22 then return [10,11,12]
  en este caso, al usar el item 22 adquiere las habilidades 10, 11 y 12
    end
    return []
  end
end
En cuanto al error, pues no te puedo decir bien cual es la razon ya que yo probe el script de manera independiente y funciona bien.
Una pregunta, reemplazaste el Scene_Battler o simplemente agregaste el script en otra pagina sobre Main.
Saludos,
¥oukai

rpgmanumaker

avatar
reemplacé el script por el de Scene_Blatter. Y bueno, ahora si entendí bien el script, pero es que la otra explicación no era muy explicativa, y la verdad, yo soy muy tonto para comprender estas cosas XD. Bueno, intentare probar la script en un proyecto vacío haber si es un problema de otra script. Luego te digo.

Pues nada, sigue sin valer... y ahora además me he dado cuenta de estos problemas. Si escapo o venzo al enemigo estando en el estado metamorfosis sale un error, el estado no desaparece cuando termina los turnos que indique. Bueno, tengo entendido que esto es un taller de RGSS, puede ser que me hayas dado una script para RPG maker XP sin darte cuenta o es que simplemente a mí no me vale el script...
Ya probé poniéndolo en un nuevo juego sin ninguna script agregada y lo reemplace por el Scene_Blatte. No sé que pasa... Haber si le puedes echar un vistazo cuando tengas algo de tiempo

ivanCR

avatar
Hola necesito como un relojito en el Pokémon Essentials algo así como una piel de rainmeter pero en el juego que este arriba a la izquierda de tamaño medio =D

youkai

avatar
Hola manumaker, no te habia respondido antes porque estaba un poco enredado con la escuela y eso, pero bueno...el script que te envie es el que me pediste para VX, asi que no hay problema por esa parte, lo que si, le encontre unos errores(que aunque no tienen nada que ver con lo que dijiste) tengo que arreglarlos. Luego pongo aqui el script con todo arreglado e instrucciones de uso nuevas ya que le agregue nuevos comandos.

ivanCR: Por favor, se un poco mas especifico ya que de lo que escribiste no entendi nada de lo que hay que hacer, al igual que tienes que especificar para que maker es.

ivanCR

avatar
Hola bien...
Para RPG maker XP en el pokémon Essentials algo así como un relojito que marque lógicamente la hora xD

rpgmanumaker

avatar
Siento molestarte tanto youkai Ópalo Triste
Bueno, como ya he dicho tomate tu tiempo, no me importa esperar. No tengo prisa, ahora mismo. El juego que estoy haciendo era para probarlo con unos amigos, pero desgraciadamente, el puto instituto, no me deja vivir. Ni a mí ni a ninguno de mis amigos Crying or Very sad

youkai

avatar
Hey, manumaker aqui te traigo ya el script completo, libre de errores(o por lo menos eso creo =P). Si le encuentras algun otro error, problema o bug me lo reportas.
En cuanto a las instrucciones, pues son las mismas, el resto de las cosas funcionan de forma automatica.
Y para que funciones es necesario que llenes los campos de "mensaje cuando un aliado entra en estado" y "mensaje cuando el estado es removido", seguro era por eso que no te funcionaba bien. Ópalo Guiño

Código:
module Youkai
 
  Morpho_state_id = 17            # ID del estado de metamorfosis en la BD
  Morpho_skill_id = 83            # ID de la habilidad que activa la metamorfosis
  Morpho_items_element = 17      # ID del atributo de los items que se usan para la metamorfosis
 
  def self.metamorfosis(item_id)
    case item_id
    when 21 then return [5,6,7,8]
    # when ID_del_Item then return [ID_de_las_habilidades]
    when 22 then return [9,12,35,21]
    end
    return []
  end
  def self.initialize
    @skills = {}
    @items = {}
  end

  def self.skills
    return @skills
  end
 
  def self.set_skills(skills)
    @skills = skills
  end
 
  #------------------------------------------------ 
  def self.set_actor_skills(actor_id, skills)
    @skills[actor_id] = [] if @skills[actor_id] == nil
    for s in skills
      if s.is_a?(RPG::Skill)
        @skills[actor_id] += [s.id] if !@skills[actor_id].include?(s.id)
      else
        @skills[actor_id] += [s] if !@skills[actor_id].include?(s)
      end
    end
    @skills[actor_id].sort!
  end
 
  def self.actor_skills(actor_id)
    return @skills[actor_id] == nil ? [] : @skills[actor_id]
  end
 
  def self.add_actor_skills(actor_id, skills)
    for i in skills     
    next if @skills[actor_id].include?(i)
    @skills[actor_id] += [i]
    end
    @skills[actor_id].sort!
  end
 
  def self.remove_actor_skills(actor_id, skills)
    @skills[actor_id] -= skills
  end 
  #-------------------------------------------------------
 
  def self.set_item(actor, item_id)
    @items[actor] = item_id
  end
  def self.item(actor)
    return $data_items[@items[actor]]
  end

end

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● レベルアップ
  #--------------------------------------------------------------------------
  def level_up
    @level += 1
    for learning in self.class.learnings
      learn_skill(learning.skill_id) if learning.level == @level
      Youkai::add_actor_skills(@actor_id, [learning.skill_id]) if learning.level == @level
    end
  end
end

class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● スキルの増減
  #--------------------------------------------------------------------------
  def command_318
    actor = $game_actors[@params[0]]
    if actor != nil
      if @params[1] == 0
        actor.learn_skill(@params[2])
        Youkai.add_actor_skills(actor.id, [@params[2]])
      else
        actor.forget_skill(@params[2])
        Youkai.remove_actor_skills(actor.id, [@params[2]])
      end
    end
    return true
  end
end

class Scene_Title < Scene_Base
  alias youkai_command_new_game command_new_game
  def command_new_game
    youkai_command_new_game
    Youkai.initialize
    for i in 1...$data_actors.size
      e = $game_actors[i]
      Youkai.set_actor_skills(e.id, e.skills)
    end 
  end
end

class Scene_File < Scene_Base 
  alias youkai_write_save_data write_save_data
  def write_save_data(file)
    youkai_write_save_data(file)
    Marshal.dump(Youkai.skills,              file)
  end
 
  def read_save_data(file)
    characters          = Marshal.load(file)
    Graphics.frame_count = Marshal.load(file)
    @last_bgm            = Marshal.load(file)
    @last_bgs            = Marshal.load(file)
    $game_system        = Marshal.load(file)
    $game_message        = Marshal.load(file)
    $game_switches      = Marshal.load(file)
    $game_variables      = Marshal.load(file)
    $game_self_switches  = Marshal.load(file)
    $game_actors        = Marshal.load(file)
    $game_party          = Marshal.load(file)
    $game_troop          = Marshal.load(file)
    $game_map            = Marshal.load(file)
    $game_player        = Marshal.load(file)
    Youkai.set_skills(Marshal.load(file))
    if $game_system.version_id != $data_system.version_id
      $game_map.setup($game_map.map_id)
      $game_player.center($game_player.x, $game_player.y)
    end
  end
end

#==============================================================================
# ■ Window_Item
#------------------------------------------------------------------------------
#  アイテム画面などで、所持アイテムの一覧を表示するウィンドウです。
#==============================================================================

class Window_MorphoItem < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #    x      : ウィンドウの X 座標
  #    y      : ウィンドウの Y 座標
  #    width  : ウィンドウの幅
  #    height : ウィンドウの高さ
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    super(x, y, width, height)
    @column_max = 2
    self.index = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● アイテムの取得
  #--------------------------------------------------------------------------
  def item
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ● アイテムをリストに含めるかどうか
  #    item : アイテム
  #--------------------------------------------------------------------------
  def include?(item)
    return false if item == nil
    if $game_temp.in_battle
      return false unless item.is_a?(RPG::Item)
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● アイテムを許可状態で表示するかどうか
  #    item : アイテム
  #--------------------------------------------------------------------------
  def enable?(item)
    return true
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    @data = []
    for item in $game_party.items
      next unless include?(item) && item.element_set != Youkai::Morpho_items_element
      @data.push(item)
      if item.is_a?(RPG::Item) and item.id == $game_party.last_item_id
        self.index = @data.size - 1
      end
    end
    @data.push(nil) if include?(nil)
    @item_max = @data.size
    create_contents
    for i in 0...@item_max
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #    index : 項目番号
  #--------------------------------------------------------------------------
  def draw_item(index)
    rect = item_rect(index)
    self.contents.clear_rect(rect)
    item = @data[index]
    if item != nil
      number = $game_party.item_number(item)
      enabled = enable?(item)
      rect.width -= 4
      draw_item_name(item, rect.x, rect.y, enabled)
      self.contents.draw_text(rect, sprintf(":%2d", number), 2)
    end
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(item == nil ? "" : item.description)
  end
end


#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
#  バトル画面の処理を行うクラスです。
#==============================================================================

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    $game_temp.in_battle = true
    @spriteset = Spriteset_Battle.new
    @message_window = Window_BattleMessage.new
    @action_battlers = []
    create_info_viewport
  end
  #--------------------------------------------------------------------------
  # ● 開始後処理
  #--------------------------------------------------------------------------
  def post_start
    super
    process_battle_start
  end
  #--------------------------------------------------------------------------
  # ● 終了処理
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_info_viewport
    @message_window.dispose
    @spriteset.dispose
    unless $scene.is_a?(Scene_Gameover)
      $scene = nil if $BTEST
    end
  end
  #--------------------------------------------------------------------------
  # ● 基本更新処理
  #    main : メインの update メソッドからの呼び出し
  #--------------------------------------------------------------------------
  def update_basic(main = false)
    Graphics.update unless main    # ゲーム画面を更新
    Input.update unless main        # 入力情報を更新
    $game_system.update            # タイマーを更新
    $game_troop.update              # 敵グループを更新
    @spriteset.update              # スプライトセットを更新
    @message_window.update          # メッセージウィンドウを更新
  end
  #--------------------------------------------------------------------------
  # ● 一定時間ウェイト
  #    duration : ウェイト時間 (フレーム数)
  #    no_fast  : 早送り無効
  #    シーンクラスの update 処理の中でウェイトをかけるためのメソッド。
  #    update は 1 フレームに 1 回呼ばれるのが原則だが、戦闘中は処理の流れを
  #    把握しにくくなるため、例外的にこのメソッドを使用する。
  #--------------------------------------------------------------------------
  def wait(duration, no_fast = false)
    for i in 0...duration
      update_basic
      break if not no_fast and i >= duration / 2 and show_fast?
    end
  end
  #--------------------------------------------------------------------------
  # ● メッセージ表示が終わるまでウェイト
  #--------------------------------------------------------------------------
  def wait_for_message
    @message_window.update
    while $game_message.visible
      update_basic
    end
  end
  #--------------------------------------------------------------------------
  # ● アニメーション表示が終わるまでウェイト
  #--------------------------------------------------------------------------
  def wait_for_animation
    while @spriteset.animation?
      update_basic
    end
  end
  #--------------------------------------------------------------------------
  # ● 早送り判定
  #--------------------------------------------------------------------------
  def show_fast?
    return (Input.press?(Input::A) or Input.press?(Input::C))
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    update_basic(true)
    update_info_viewport                  # 情報表示ビューポートを更新
    if $game_message.visible
      @info_viewport.visible = false
      @message_window.visible = true
    end
    unless $game_message.visible          # メッセージ表示中以外
      return if judge_win_loss            # 勝敗判定
      update_scene_change
      if @target_enemy_window != nil
        update_target_enemy_selection    # 対象敵キャラ選択
      elsif @target_actor_window != nil
        update_target_actor_selection    # 対象アクター選択
      elsif @skill_window != nil
        update_skill_selection            # スキル選択
      elsif @item_window != nil
        update_item_selection            # アイテム選択
      elsif @morpho_window != nil
        update_metamorphosis_item_selection
      elsif @party_command_window.active
        update_party_command_selection    # パーティコマンド選択
      elsif @actor_command_window.active
        update_actor_command_selection    # アクターコマンド選択
      else
        process_battle_event              # バトルイベントの処理
        process_action                    # 戦闘行動
        process_battle_event              # バトルイベントの処理
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 情報表示ビューポートの作成
  #--------------------------------------------------------------------------
  def create_info_viewport
    @info_viewport = Viewport.new(0, 288, 544, 128)
    @info_viewport.z = 100
    @status_window = Window_BattleStatus.new
    @party_command_window = Window_PartyCommand.new
    @actor_command_window = Window_ActorCommand.new
    @status_window.viewport = @info_viewport
    @party_command_window.viewport = @info_viewport
    @actor_command_window.viewport = @info_viewport
    @status_window.x = 128
    @actor_command_window.x = 544
    @info_viewport.visible = false
  end
  #--------------------------------------------------------------------------
  # ● 情報表示ビューポートの解放
  #--------------------------------------------------------------------------
  def dispose_info_viewport
    @status_window.dispose
    @party_command_window.dispose
    @actor_command_window.dispose
    @info_viewport.dispose
  end
  #--------------------------------------------------------------------------
  # ● 情報表示ビューポートの更新
  #--------------------------------------------------------------------------
  def update_info_viewport
    @party_command_window.update
    @actor_command_window.update
    @status_window.update
    if @party_command_window.active and @info_viewport.ox > 0
      @info_viewport.ox -= 16
    elsif @actor_command_window.active and @info_viewport.ox < 128
      @info_viewport.ox += 16
    end
  end
  #--------------------------------------------------------------------------
  # ● バトルイベントの処理
  #--------------------------------------------------------------------------
  def process_battle_event
    loop do
      return if judge_win_loss
      return if $game_temp.next_scene != nil
      $game_troop.interpreter.update
      $game_troop.setup_battle_event
      wait_for_message
      process_action if $game_troop.forcing_battler != nil
      return unless $game_troop.interpreter.running?
      update_basic
    end
  end
  #--------------------------------------------------------------------------
  # ● 勝敗判定
  #--------------------------------------------------------------------------
  def judge_win_loss
    if $game_temp.in_battle
      if $game_party.all_dead?
        process_defeat
        return true
      elsif $game_troop.all_dead?
        process_victory
        return true
      else
        return false
      end
    else
      return true
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘終了
  #    result : 結果 (0:勝利 1:逃走 2:敗北)
  #--------------------------------------------------------------------------
  def battle_end(result)
    if result == 2 and not $game_troop.can_lose
      call_gameover
    else
      $game_party.clear_actions
      $game_party.remove_states_battle
      $game_troop.clear
      for target in $game_party.members
        for i in target.skills
          target.forget_skill(i.id)
        end
        for learning in Youkai.actor_skills(target.id)
          target.learn_skill(learning)
        end
      end
      if $game_temp.battle_proc != nil
        $game_temp.battle_proc.call(result)
        $game_temp.battle_proc = nil
      end
      unless $BTEST
        $game_temp.map_bgm.play
        $game_temp.map_bgs.play
      end
      $scene = Scene_Map.new
      @message_window.clear
      Graphics.fadeout(30)
    end
    $game_temp.in_battle = false
  end
  #--------------------------------------------------------------------------
  # ● 次のアクターのコマンド入力へ
  #--------------------------------------------------------------------------
  def next_actor
    loop do
      if @actor_index == $game_party.members.size-1
        start_main
        return
      end
      @status_window.index = @actor_index += 1
      @active_battler = $game_party.members[@actor_index]
      battler = @actor_index == 0 ? @actor_index : @actor_index - 1
      if $game_party.members[battler].last_skill_id == Youkai::Morpho_skill_id
        item = Youkai.item($game_party.members[battler].id)
        $game_party.lose_item(item, 1)
      end
      if @active_battler.auto_battle
        @active_battler.make_action
        next
      end
      break if @active_battler.inputable?
    end
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● 前のアクターのコマンド入力へ
  #--------------------------------------------------------------------------
  def prior_actor
    loop do
      if @actor_index == 0
        start_party_command_selection
        return
      end
      @status_window.index = @actor_index -= 1
      @active_battler = $game_party.members[@actor_index]
      battler = @actor_index
      if $game_party.members[battler].last_skill_id == Youkai::Morpho_skill_id
        item = Youkai.item($game_party.members[battler].id)
        $game_party.gain_item(item, 1)
      end
      next if @active_battler.auto_battle
      break if @active_battler.inputable?
    end
    start_actor_command_selection
  end
  #--------------------------------------------------------------------------
  # ● パーティコマンド選択の開始
  #--------------------------------------------------------------------------
  def start_party_command_selection
    if $game_temp.in_battle
      @status_window.refresh
      @status_window.index = @actor_index = -1
      @active_battler = nil
      @info_viewport.visible = true
      @message_window.visible = false
      @party_command_window.active = true
      @party_command_window.index = 0
      @actor_command_window.active = false
      $game_party.clear_actions
      if $game_troop.surprise or not $game_party.inputable?
        start_main
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● パーティコマンド選択の更新
  #--------------------------------------------------------------------------
  def update_party_command_selection
    if Input.trigger?(Input::C)
      case @party_command_window.index
      when 0  # 戦う
        Sound.play_decision
        @status_window.index = @actor_index = -1
        next_actor
      when 1  # 逃げる
        if $game_troop.can_escape == false
          Sound.play_buzzer
          return
        end
        Sound.play_decision
        process_escape
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● アクターコマンド選択の開始
  #--------------------------------------------------------------------------
  def start_actor_command_selection
    @party_command_window.active = false
    @actor_command_window.setup(@active_battler)
    @actor_command_window.active = true
    @actor_command_window.index = 0
  end
  #--------------------------------------------------------------------------
  # ● アクターコマンド選択の更新
  #--------------------------------------------------------------------------
  def update_actor_command_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      prior_actor
    elsif Input.trigger?(Input::C)
      case @actor_command_window.index
      when 0  # 攻撃
        Sound.play_decision
        @active_battler.action.set_attack
        start_target_enemy_selection
      when 1  # スキル
        Sound.play_decision
        start_skill_selection
      when 2  # 防御
        Sound.play_decision
        @active_battler.action.set_guard
        next_actor
      when 3  # アイテム
        Sound.play_decision
        start_item_selection
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 対象敵キャラ選択の開始
  #--------------------------------------------------------------------------
  def start_target_enemy_selection
    @target_enemy_window = Window_TargetEnemy.new
    @target_enemy_window.y = @info_viewport.rect.y
    @info_viewport.rect.x += @target_enemy_window.width
    @info_viewport.ox += @target_enemy_window.width
    @actor_command_window.active = false
  end
  #--------------------------------------------------------------------------
  # ● 対象敵キャラ選択の終了
  #--------------------------------------------------------------------------
  def end_target_enemy_selection
    @info_viewport.rect.x -= @target_enemy_window.width
    @info_viewport.ox -= @target_enemy_window.width
    @target_enemy_window.dispose
    @target_enemy_window = nil
    if @actor_command_window.index == 0
      @actor_command_window.active = true
    end
  end
  #--------------------------------------------------------------------------
  # ● 対象敵キャラ選択の更新
  #--------------------------------------------------------------------------
  def update_target_enemy_selection
    @target_enemy_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_target_enemy_selection
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      @active_battler.action.target_index = @target_enemy_window.enemy.index
      end_target_enemy_selection
      end_skill_selection
      end_item_selection
      next_actor
    end
  end
  #--------------------------------------------------------------------------
  # ● 対象アクター対象選択の開始
  #--------------------------------------------------------------------------
  def start_target_actor_selection
    @target_actor_window = Window_BattleStatus.new
    @target_actor_window.index = 0
    @target_actor_window.active = true
    @target_actor_window.y = @info_viewport.rect.y
    @info_viewport.rect.x += @target_actor_window.width
    @info_viewport.ox += @target_actor_window.width
    @actor_command_window.active = false
  end
  #--------------------------------------------------------------------------
  # ● 対象アクター選択の終了
  #--------------------------------------------------------------------------
  def end_target_actor_selection
    @info_viewport.rect.x -= @target_actor_window.width
    @info_viewport.ox -= @target_actor_window.width
    @target_actor_window.dispose
    @target_actor_window = nil
  end
  #--------------------------------------------------------------------------
  # ● 対象アクター選択の更新
  #--------------------------------------------------------------------------
  def update_target_actor_selection
    @target_actor_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_target_actor_selection
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      @active_battler.action.target_index = @target_actor_window.index
      end_target_actor_selection
      end_skill_selection
      end_item_selection
      next_actor
    end
  end
  #--------------------------------------------------------------------------
  # ● スキル選択の開始
  #--------------------------------------------------------------------------
  def start_skill_selection
    @help_window = Window_Help.new
    @skill_window = Window_Skill.new(0, 56, 544, 232, @active_battler)
    @skill_window.help_window = @help_window
    @actor_command_window.active = false
  end
  #--------------------------------------------------------------------------
  # ● スキル選択の終了
  #--------------------------------------------------------------------------
  def end_skill_selection
    if @skill_window != nil
      @skill_window.dispose
      @skill_window = nil
      @help_window.dispose
      @help_window = nil
    end
    @actor_command_window.active = true
  end
  #--------------------------------------------------------------------------
  # ● スキル選択の更新
  #--------------------------------------------------------------------------
  def update_skill_selection
    @skill_window.active = true
    @skill_window.update
    @help_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_skill_selection
    elsif Input.trigger?(Input::C)
      @skill = @skill_window.skill
      if @skill != nil
        @active_battler.last_skill_id = @skill.id
      end
      if @active_battler.skill_can_use?(@skill)
        Sound.play_decision
        if @active_battler.last_skill_id == Youkai::Morpho_skill_id
          end_skill_selection
          start_metamorphosis_item_selection
          return
        end
        determine_skill
      else
        Sound.play_buzzer
      end
    end
  end
 
  def start_metamorphosis_item_selection
    @help_window = Window_Help.new
    @morpho_window = Window_MorphoItem.new(0, 56, 544, 232)
    @morpho_window.help_window = @help_window
    @actor_command_window.active = false
  end
 
  def end_metamorphosis_item_selection
    if @morpho_window != nil
      @morpho_window.dispose
      @morpho_window = nil
      @help_window.dispose
      @help_window = nil
    end
    if Input.trigger?(Input::B)
      start_skill_selection
    else
      @actor_command_window.active = true
    end
  end
 
  def update_metamorphosis_item_selection
    @morpho_window.active = true
    @morpho_window.update
    @help_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_metamorphosis_item_selection
    elsif Input.trigger?(Input::C)
      @mitem = @morpho_window.item
      if @mitem != nil
        Youkai.set_item(@active_battler.id, @mitem.id)
        Sound.play_decision
        determine_skill
      else
        Sound.play_buzzer
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● スキルの決定
  #--------------------------------------------------------------------------
  def determine_skill
    @active_battler.action.set_skill(@skill.id)
    @skill_window.active = false if @skill_window != nil
    @morpho_window.active = false if @morpho_window != nil
    if @skill.need_selection?
      if @skill.for_opponent?
        start_target_enemy_selection
      else
        start_target_actor_selection
      end
    else
      end_skill_selection
      end_metamorphosis_item_selection
      next_actor
    end
  end
  #--------------------------------------------------------------------------
  # ● アイテム選択の開始
  #--------------------------------------------------------------------------
  def start_item_selection
    @help_window = Window_Help.new
    @item_window = Window_Item.new(0, 56, 544, 232)
    @item_window.help_window = @help_window
    @actor_command_window.active = false
  end
  #--------------------------------------------------------------------------
  # ● アイテム選択の終了
  #--------------------------------------------------------------------------
  def end_item_selection
    if @item_window != nil
      @item_window.dispose
      @item_window = nil
      @help_window.dispose
      @help_window = nil
    end
    @actor_command_window.active = true
  end
  #--------------------------------------------------------------------------
  # ● アイテム選択の更新
  #--------------------------------------------------------------------------
  def update_item_selection
    @item_window.active = true
    @item_window.update
    @help_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_item_selection
    elsif Input.trigger?(Input::C)
      @item = @item_window.item
      if @item != nil
        $game_party.last_item_id = @item.id
      end
      if $game_party.item_can_use?(@item)
        Sound.play_decision
        determine_item
      else
        Sound.play_buzzer
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● アイテムの決定
  #--------------------------------------------------------------------------
  def determine_item
    @active_battler.action.set_item(@item.id)
    @item_window.active = false
    if @item.need_selection?
      if @item.for_opponent?
        start_target_enemy_selection
      else
        start_target_actor_selection
      end
    else
      end_item_selection
      next_actor
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘開始の処理
  #--------------------------------------------------------------------------
  def process_battle_start
    @message_window.clear
    wait(10)
    for name in $game_troop.enemy_names
      text = sprintf(Vocab::Emerge, name)
      $game_message.texts.push(text)
    end
    if $game_troop.preemptive
      if $game_party.members.size == 1
        text = sprintf(Vocab::PreemptiveSolo, $game_party.name)
      else
        text = sprintf(Vocab::Preemptive, $game_party.name)
      end
      $game_message.texts.push(text)
    elsif $game_troop.surprise
      if $game_party.members.size == 1
        text = sprintf(Vocab::SurpriseSolo, $game_party.name)
      else
        text = sprintf(Vocab::Surprise, $game_party.name)
      end
      $game_message.texts.push(text)
    end
    wait_for_message
    @message_window.clear
    make_escape_ratio
    process_battle_event
    start_party_command_selection
  end
  #--------------------------------------------------------------------------
  # ● 逃走成功率の作成
  #--------------------------------------------------------------------------
  def make_escape_ratio
    actors_agi = $game_party.average_agi
    enemies_agi = $game_troop.average_agi
    @escape_ratio = 150 - 100 * enemies_agi / actors_agi
  end
  #--------------------------------------------------------------------------
  # ● 逃走の処理
  #--------------------------------------------------------------------------
  def process_escape
    @info_viewport.visible = false
    @message_window.visible = true
    if $game_party.members.size == 1
      text = sprintf(Vocab::EscapeStartSolo, $game_party.name)
    else
      text = sprintf(Vocab::EscapeStart, $game_party.name)
    end
    $game_message.texts.push(text)
    if $game_troop.preemptive
      success = true
    else
      success = (rand(100) < @escape_ratio)
    end
    Sound.play_escape
    if success
      wait_for_message
      battle_end(1)
    else
      @escape_ratio += 10
      $game_message.texts.push('\.' + Vocab::EscapeFailure)
      wait_for_message
      $game_party.clear_actions
      start_main
    end
  end
  #--------------------------------------------------------------------------
  # ● 勝利の処理
  #--------------------------------------------------------------------------
  def process_victory
    @info_viewport.visible = false
    @message_window.visible = true
    RPG::BGM.stop
    $game_system.battle_end_me.play
    unless $BTEST
      $game_temp.map_bgm.play
      $game_temp.map_bgs.play
    end
    display_exp_and_gold
    display_drop_items
    display_level_up
    battle_end(0)
  end
  #--------------------------------------------------------------------------
  # ● 獲得した経験値とお金の表示
  #--------------------------------------------------------------------------
  def display_exp_and_gold
    exp = $game_troop.exp_total
    gold = $game_troop.gold_total
    $game_party.gain_gold(gold)
    if $game_party.members.size == 1
      text = sprintf(Vocab::VictorySolo, $game_party.name)
    else
      text = sprintf(Vocab::Victory, $game_party.name)
    end
    $game_message.texts.push('\|' + text)
    if exp > 0
      text = sprintf(Vocab::ObtainExp, exp)
      $game_message.texts.push('\.' + text)
    end
    if gold > 0
      text = sprintf(Vocab::ObtainGold, gold, Vocab::gold)
      $game_message.texts.push('\.' + text)
    end
    wait_for_message
  end
  #--------------------------------------------------------------------------
  # ● 獲得したドロップアイテムの表示
  #--------------------------------------------------------------------------
  def display_drop_items
    drop_items = $game_troop.make_drop_items
    for item in drop_items
      $game_party.gain_item(item, 1)
      text = sprintf(Vocab::ObtainItem, item.name)
      $game_message.texts.push(text)
    end
    wait_for_message
  end
  #--------------------------------------------------------------------------
  # ● レベルアップの表示
  #--------------------------------------------------------------------------
  def display_level_up
    exp = $game_troop.exp_total
    for actor in $game_party.existing_members
      last_level = actor.level
      last_skills = actor.skills
      actor.gain_exp(exp, true)
    end
    wait_for_message
  end
  #--------------------------------------------------------------------------
  # ● 敗北の処理
  #--------------------------------------------------------------------------
  def process_defeat
    @info_viewport.visible = false
    @message_window.visible = true
    if $game_party.members.size == 1
      text = sprintf(Vocab::DefeatSolo, $game_party.name)
    else
      text = sprintf(Vocab::Defeat, $game_party.name)
    end
    $game_message.texts.push(text)
    wait_for_message
    battle_end(2)
  end
  #--------------------------------------------------------------------------
  # ● 画面切り替えの実行
  #--------------------------------------------------------------------------
  def update_scene_change
    case $game_temp.next_scene
    when "map"
      call_map
    when "gameover"
      call_gameover
    when "title"
      call_title
    else
      $game_temp.next_scene = nil
    end
  end
  #--------------------------------------------------------------------------
  # ● マップ画面への切り替え
  #--------------------------------------------------------------------------
  def call_map
    $game_temp.next_scene = nil
    battle_end(1)
  end
  #--------------------------------------------------------------------------
  # ● ゲームオーバー画面への切り替え
  #--------------------------------------------------------------------------
  def call_gameover
    $game_temp.next_scene = nil
    $scene = Scene_Gameover.new
    @message_window.clear
  end
  #--------------------------------------------------------------------------
  # ● タイトル画面への切り替え
  #--------------------------------------------------------------------------
  def call_title
    $game_temp.next_scene = nil
    $scene = Scene_Title.new
    @message_window.clear
    Graphics.fadeout(60)
  end
  #--------------------------------------------------------------------------
  # ● 戦闘処理の実行開始
  #--------------------------------------------------------------------------
  def start_main
    $game_troop.increase_turn
    @info_viewport.visible = false
    @info_viewport.ox = 0
    @message_window.visible = true
    @party_command_window.active = false
    @actor_command_window.active = false
    @status_window.index = @actor_index = -1
    @active_battler = nil
    @message_window.clear
    $game_troop.make_actions
    make_action_orders
    wait(20)
  end
  #--------------------------------------------------------------------------
  # ● 行動順序作成
  #--------------------------------------------------------------------------
  def make_action_orders
    @action_battlers = []
    unless $game_troop.surprise
      @action_battlers += $game_party.members
    end
    unless $game_troop.preemptive
      @action_battlers += $game_troop.members
    end
    for battler in @action_battlers
      battler.action.make_speed
    end
    @action_battlers.sort! do |a,b|
      b.action.speed - a.action.speed
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の処理
  #--------------------------------------------------------------------------
  def process_action
    return if judge_win_loss
    return if $game_temp.next_scene != nil
    set_next_active_battler
    if @active_battler == nil
      turn_end
      return
    end
    return if @active_battler.dead?
    @message_window.clear
    wait(5)
    @active_battler.white_flash = true
    unless @active_battler.action.forcing
      @active_battler.action.prepare
    end
    if @active_battler.action.valid?
      execute_action
    end
    unless @active_battler.action.forcing
      @message_window.clear
      remove_states_auto
      display_current_state
    end
    @active_battler.white_flash = false
    @message_window.clear
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行
  #--------------------------------------------------------------------------
  def execute_action
    case @active_battler.action.kind
    when 0  # 基本
      case @active_battler.action.basic
      when 0  # 攻撃
        execute_action_attack
      when 1  # 防御
        execute_action_guard
      when 2  # 逃走
        execute_action_escape
      when 3  # 待機
        execute_action_wait
      end
    when 1  # スキル
      execute_action_skill
    when 2  # アイテム
      execute_action_item
    end
  end
  #--------------------------------------------------------------------------
  # ● ターン終了
  #--------------------------------------------------------------------------
  def turn_end
    $game_troop.turn_ending = true
    $game_party.slip_damage_effect
    $game_troop.slip_damage_effect
    $game_party.do_auto_recovery
    $game_troop.preemptive = false
    $game_troop.surprise = false
    process_battle_event
    $game_troop.turn_ending = false
    start_party_command_selection
  end
  #--------------------------------------------------------------------------
  # ● 次に行動するべきバトラーの設定
  #    イベントコマンドで [戦闘行動の強制] が行われているときはそのバトラー
  #    を設定して、リストから削除する。それ以外はリストの先頭から取得する。
  #    現在パーティにいないアクターを取得した場合 (index が nil, バトルイベ
  #    ントでの離脱直後などに発生) は、それをスキップする。
  #--------------------------------------------------------------------------
  def set_next_active_battler
    loop do
      if $game_troop.forcing_battler != nil
        @active_battler = $game_troop.forcing_battler
        @action_battlers.delete(@active_battler)
        $game_troop.forcing_battler = nil
      else
        @active_battler = @action_battlers.shift
      end
      return if @active_battler == nil
      return if @active_battler.index != nil
    end
  end
  #--------------------------------------------------------------------------
  # ● ステート自然解除
  #--------------------------------------------------------------------------
  def remove_states_auto
    last_st = @active_battler.states
    @active_battler.remove_states_auto
    if @active_battler.states != last_st
      wait(5)
      display_state_changes(@active_battler)
      wait(30)
      @message_window.clear
    end
  end
  #--------------------------------------------------------------------------
  # ● 現在のステートの表示
  #--------------------------------------------------------------------------
  def display_current_state
    state_text = @active_battler.most_important_state_text
    unless state_text.empty?
      wait(5)
      text = @active_battler.name + state_text
      @message_window.add_instant_text(text)
      wait(45)
      @message_window.clear
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : 攻撃
  #--------------------------------------------------------------------------
  def execute_action_attack
    text = sprintf(Vocab::DoAttack, @active_battler.name)
    @message_window.add_instant_text(text)
    targets = @active_battler.action.make_targets
    display_attack_animation(targets)
    wait(20)
    for target in targets
      target.attack_effect(@active_battler)
      display_action_effects(target)
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : 防御
  #--------------------------------------------------------------------------
  def execute_action_guard
    text = sprintf(Vocab::DoGuard, @active_battler.name)
    @message_window.add_instant_text(text)
    wait(45)
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : 逃走
  #--------------------------------------------------------------------------
  def execute_action_escape
    text = sprintf(Vocab::DoEscape, @active_battler.name)
    @message_window.add_instant_text(text)
    @active_battler.escape
    Sound.play_escape
    wait(45)
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : 待機
  #--------------------------------------------------------------------------
  def execute_action_wait
    text = sprintf(Vocab::DoWait, @active_battler.name)
    @message_window.add_instant_text(text)
    wait(45)
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : スキル
  #--------------------------------------------------------------------------
  def execute_action_skill
    skill = @active_battler.action.skill
    text = @active_battler.name + skill.message1
    @message_window.add_instant_text(apertura_exclamacion(text))
    unless skill.message2.empty?
      wait(10)
      @message_window.add_instant_text(skill.message2)
    end
    targets = @active_battler.action.make_targets
    display_animation(targets, skill.animation_id)
    @active_battler.mp -= @active_battler.calc_mp_cost(skill)
    $game_temp.common_event_id = skill.common_event_id
    for target in targets
      target.skill_effect(@active_battler, skill)
      display_action_effects(target, skill)
    end
  end
 
  def make_metamorphosis(target)
    item = Youkai.item(target.id)
    for sk in target.skills
      target.forget_skill(sk.id)
    end
    for nsk in Youkai.metamorfosis(item.id)
      target.learn_skill(nsk)
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : アイテム
  #--------------------------------------------------------------------------
  def execute_action_item
    item = @active_battler.action.item
    text = sprintf(Vocab::UseItem, @active_battler.name, item.name)
    @message_window.add_instant_text(text)
    targets = @active_battler.action.make_targets
    display_animation(targets, item.animation_id)
    $game_party.consume_item(item)
    $game_temp.common_event_id = item.common_event_id
    for target in targets
      target.item_effect(@active_battler, item)
      display_action_effects(target, item)
    end
  end
  #--------------------------------------------------------------------------
  # ● アニメーションの表示
  #    targets      : 対象者の配列
  #    animation_id : アニメーション ID (-1: 通常攻撃と同じ)
  #--------------------------------------------------------------------------
  def display_animation(targets, animation_id)
    if animation_id < 0
      display_attack_animation(targets)
    else
      display_normal_animation(targets, animation_id)
    end
    wait(20)
    wait_for_animation
  end
  #--------------------------------------------------------------------------
  # ● 攻撃アニメーションの表示
  #    targets : 対象者の配列
  #    敵キャラの場合は [敵の通常攻撃] 効果音を演奏して一瞬待つ。
  #    アクターの場合は二刀流を考慮 (左手武器は反転して表示) 。
  #--------------------------------------------------------------------------
  def display_attack_animation(targets)
    if @active_battler.is_a?(Game_Enemy)
      Sound.play_enemy_attack
      wait(15, true)
    else
      aid1 = @active_battler.atk_animation_id
      aid2 = @active_battler.atk_animation_id2
      display_normal_animation(targets, aid1, false)
      display_normal_animation(targets, aid2, true)
    end
    wait_for_animation
  end
  #--------------------------------------------------------------------------
  # ● 通常アニメーションの表示
  #    targets      : 対象者の配列
  #    animation_id : アニメーション ID
  #    mirror      : 左右反転
  #--------------------------------------------------------------------------
  def display_normal_animation(targets, animation_id, mirror = false)
    animation = $data_animations[animation_id]
    if animation != nil
      to_screen = (animation.position == 3)      # 位置が「画面」か?
      for target in targets.uniq
        target.animation_id = animation_id
        target.animation_mirror = mirror
        wait(20, true) unless to_screen          # 単体用ならウェイト
      end
      wait(20, true) if to_screen                # 全体用ならウェイト
    end
  end
  #--------------------------------------------------------------------------
  # ● 行動結果の表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_action_effects(target, obj = nil)
    unless target.skipped
      line_number = @message_window.line_number
      wait(5)
      skill = @active_battler.action.skill
      display_critical(target, obj)
      display_damage(target, obj)
      display_state_changes(target, obj)
      if line_number == @message_window.line_number
        display_failure(target, obj) unless target.states_active?
      end
      if line_number != @message_window.line_number
        wait(30)
      end
      @message_window.back_to(line_number)
    end
  end
  #--------------------------------------------------------------------------
  # ● クリティカルヒットの表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_critical(target, obj = nil)
    if target.critical
      if target.actor?
        text = Vocab::CriticalToActor
      else
        text = Vocab::CriticalToEnemy
      end
      @message_window.add_instant_text(text)
      wait(20)
    end
  end
  #--------------------------------------------------------------------------
  # ● ダメージの表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_damage(target, obj = nil)
    if target.missed
      display_miss(target, obj)
    elsif target.evaded
      display_evasion(target, obj)
    else
      display_hp_damage(target, obj)
      display_mp_damage(target, obj)
    end
  end
  #--------------------------------------------------------------------------
  # ● ミスの表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_miss(target, obj = nil)
    if obj == nil or obj.physical_attack
      if target.actor?
        text = sprintf(Vocab::ActorNoHit, target.name)
      else
        text = sprintf(Vocab::EnemyNoHit, target.name)
      end
      Sound.play_miss
    else
      text = sprintf(Vocab::ActionFailure, target.name)
    end
    @message_window.add_instant_text(text)
    wait(30)
  end
  #--------------------------------------------------------------------------
  # ● 回避の表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_evasion(target, obj = nil)
    if target.actor?
      text = sprintf(Vocab::ActorEvasion, target.name)
    else
      text = sprintf(Vocab::EnemyEvasion, target.name)
    end
    Sound.play_evasion
    @message_window.add_instant_text(text)
    wait(30)
  end
  #--------------------------------------------------------------------------
  # ● HP ダメージ表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_hp_damage(target, obj = nil)
    if target.hp_damage == 0                # ノーダメージ
      return if obj != nil and obj.damage_to_mp
      return if obj != nil and obj.base_damage == 0
      fmt = target.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
      text = sprintf(fmt, target.name)
    elsif target.absorbed                  # 吸収
      fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
      text = sprintf(fmt, target.name, target.hp_damage, Vocab::hp)
    elsif target.hp_damage > 0              # ダメージ
      if target.actor?
        text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage)
        Sound.play_actor_damage
        $game_troop.screen.start_shake(5, 5, 10)
      else
        text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage)
        Sound.play_enemy_damage
        target.blink = true
      end
    else                                    # 回復
      fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
      text = sprintf(fmt, target.name, -target.hp_damage, Vocab::hp)
      Sound.play_recovery
    end
    @message_window.add_instant_text(text)
    wait(30)
  end
  #--------------------------------------------------------------------------
  # ● MP ダメージ表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_mp_damage(target, obj = nil)
    return if target.dead?
    return if target.mp_damage == 0
    if target.absorbed                      # 吸収
      fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
      text = sprintf(fmt, target.name, target.mp_damage, Vocab::mp)
    elsif target.mp_damage > 0              # ダメージ
      fmt = target.actor? ? Vocab::ActorLoss : Vocab::EnemyLoss
      text = sprintf(fmt, target.name, target.mp_damage, Vocab::mp)
    else                                    # 回復
      fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
      text = sprintf(fmt, target.name, -target.mp_damage, Vocab::mp)
      Sound.play_recovery
    end
    @message_window.add_instant_text(text)
    wait(30)
  end
  #--------------------------------------------------------------------------
  # ● ステート変化の表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_state_changes(target, obj = nil)
    return if target.missed or target.evaded
    return unless target.states_active?
    if @message_window.line_number < 4
      @message_window.add_instant_text("")
    end
    display_added_states(target, obj)
    display_removed_states(target, obj)
    display_remained_states(target, obj)
    if @message_window.last_instant_text.empty?
      @message_window.back_one
    else
      wait(10)
    end
  end
  #--------------------------------------------------------------------------
  # ● 付加されたステートの表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_added_states(target, obj = nil)
    for state in target.added_states
      if target.actor?
        next if state.message1.empty?
        text = target.name + state.message1
      else
        next if state.message2.empty?
        text = target.name + state.message2
      end
      if state.id == 1                      # 戦闘不能
        target.perform_collapse
      end
      if state.id == Youkai::Morpho_state_id
        make_metamorphosis(target)
      end
      @message_window.replace_instant_text(apertura_exclamacion(text))
      wait(20)
    end
  end
  #--------------------------------------------------------------------------
  # ● 解除されたステートの表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_removed_states(target, obj = nil)
    for state in target.removed_states
      if state.id == Youkai::Morpho_state_id
        for i in target.skills
          target.forget_skill(i.id)
        end
        for learning in Youkai.actor_skills(target.id)
          target.learn_skill(learning)
        end
      end
      next if state.message4.empty?
      text = target.name + state.message4
      @message_window.replace_instant_text(apertura_exclamacion(text))
      wait(20)
    end
  end
  #--------------------------------------------------------------------------
  # ● 変化しなかったステートの表示
  #    target : 対象者
  #    obj    : スキルまたはアイテム
  #    すでに眠っている相手をさらに眠らせようとした場合など。
  #--------------------------------------------------------------------------
  def display_remained_states(target, obj = nil)
    for state in target.remained_states
      next if state.message3.empty?
      text = target.name + state.message3
      @message_window.replace_instant_text(apertura_exclamacion(text))
      wait(20)
    end
  end
  #--------------------------------------------------------------------------
  # ● 失敗の表示
  #    target : 対象者 (アクター)
  #    obj    : スキルまたはアイテム
  #--------------------------------------------------------------------------
  def display_failure(target, obj)
    text = sprintf(Vocab::ActionFailure, target.name)
    @message_window.add_instant_text(text)
    wait(20)
  end
  #--------------------------------------------------------------------------
  # ● Añadir apertura de exclamación
  #    text    : El texto al que le añadirá la exclamación si es necesario
  #    Devuelve el texto modificado
  #--------------------------------------------------------------------------
  def apertura_exclamacion(text)
      if text =~ /!$/
        text.insert(0,"¡")
      end
      return text
  end
end

EDIT: Pequeño serio error a la hora de salvar y cargar corregido.
EDIT2: El script de reloj que pidio ivanCR esta en la pagina inicial del taller junto al resto de los scripts



Última edición por youkai el Miér Oct 24, 2012 7:24 pm, editado 1 vez

youkai

avatar
Y rellenaste tambien las condiciones en la BD del estado?(o sea, sanar al terminar combate, cada X turnos X% de sanar)

Pero bueno, ya te cambia las habilidades, verdad?

rpgmanumaker

avatar
Sí, rellene todos los campos en la base de datos de "estados"
Pero sigue sin valer...

youkai

avatar
Hola manu, la verdad es que ya no tengo ni idea de que puede estarte pasando, asi que te voy a enviar el proyecto en el cual pruebo(y probe) el script para que lo mires y te fijes si es que estas haciendo algo mal en tu proyecto.
Proyecto

rpgmanumaker

avatar
Ópalo Triste Ópalo Triste Ópalo Triste Pero que coño pasa...
Me he fijado en tu proyecto y he puesto el mío casi igual (excepto algunas tonterías) pero aún así no funciona. Lo único que se me ocurre es dejarte el link para que descargues el proyecto y haber si puedes averiguar que pasa. http://www.mediafire.com/?v4p5p6cm9s97w76
Y otra vez, siento mucho las molestias que te estoy causando.

Contenido patrocinado


Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje [Página 1 de 5.]

Ir a la página : 1, 2, 3, 4, 5  Siguiente

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