Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Tactical Skills

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Tactical Skills

Mensaje por AsFzKakarotto el 2018-04-28, 23:03

Para el sistema de Batalla por turnos del Maker traigo el siguiente sistema...
Permite Realizar Habilidades que tomen como Condición realizar una secuencia de botones correctamente.
Si el jugador realiza mal la secuencia se aplica un descuento del Porcentaje efectivo de Poder, esto quiere decir
que si se coloca un 100% todo el poder es removido y por lo usual aparecerá el mensaje FALLAR.
Usted puede disminuir el porcentaje deseado... Siempre se le descontará cuando el jugador falle o no alcance
hacer la secuencia en el tiempo estimado. Si el jugador hace la secuencia perfectamente el daño será el igual al
que se configura habitualmente. Usted puede ajustar el limite de tiempo de cada Botón.
Usted puede personalizar una animación diferente en el caso de fallar.



Aquí el Script:
Código:
#===============================================================================
# ** Habilidades Tácticas Ver.1.4.0
#===============================================================================
# Autor: Claimh
# Traducción al Castellano: AsFzKakarotto
#-------------------------------------------------------------------------------
#  Permite que las habilidades del combate se ejecuten atravez de comandos
#  combinados del control o tecla. Si la combinación de teclas no es la
#  correcta, la habilidad puede efectuar menos daño e indicar una animación
#  de lucha diferente.
#===============================================================================
module TacticalSkill
#===============================================================================
# ** COMIENZO de personalización
#===============================================================================
# Teclas
  A = Input::A            # Teclado:Z
  B = Input::B            # Teclado:X
  C = Input::C            # Teclado:C
  X = Input::X            # Teclado:A
  Y = Input::Y            # Teclado:S
  Z = Input::Z            # Teclado:D
  L = Input::L            # Teclado:Q
  R = Input::R            # Teclado:W
  UP = Input::UP
  DOWN = Input::DOWN
  LEFT = Input::LEFT
  RIGHT = Input::RIGHT
#===============================================================================
# Tiempo de entrada por cada tecla (valor en decimal)
  KEY_SEC = 1.0
#===============================================================================
# Nombre de la barra que muestra el tiempo que queda de ejecución.
# (la imagen debe de estar en la carpeta Graphics/Windowskins)
  T_BAR_NAME = "bar"
#===============================================================================
# Nombre del Efecto sonoro (SE) cuando se pulsa correctamente la secuencia.
  SE_COMPLETE = "002-System02"
#===============================================================================
# Nombre del Efecto sonoro (SE) cuando se pulsa erroneamente la secuencia.
  SE_MISS = "004-System04"
#===============================================================================
# La ID de interruptor que cambia el tipo de tecla (Puede cambiar la señal)
#     ACTIVADO : Sistema Control Pad
#  DESACTIVADO : Sistema Teclado
  KEY_TYPE_ID = 50
#===============================================================================
# Si es exitoso el alcance de la Habilidad se hace para "Todos los enemigos"
# o "Todos los Aliados"
  ALL_ATK = false #true
#===============================================================================
# Todas las ID de habilidades disponibles.
  ALL_ATK_SK = [57, 61]
#===============================================================================
# Ajuste de Habilidades.
#===============================================================================
  T_SKILL = {

# Habilidad ID => [[Tecla 1, Tecla 2,...], % , Animación ID]
#
# - En donde % se añade el porcentaje de poder en el caso de fallar.
# - Rn donde Animación ID es la Animación que aparecerá si se falla al pulsar
#   erroneamente una tecla, la animación no aparece si se falla por que se
#   termino el tiempo. Este valor no es obligación añardirlo pero si es el caso
#   de no utilizarlo se debe quitar la coma (,) previa a este número.
  
        7 => [[UP,DOWN], 50],
        8 => [[X,C,Z], 50],
        9 => [[DOWN,X,A,B], 50],
        10 => [[LEFT,UP], 50],
        11 => [[L,X,R], 50],
        12 => [[X,C,RIGHT,R], 50],
        13 => [[UP,RIGHT], 50],
        14 => [[L,Z,A], 50],
        15 => [[R,X,X,DOWN], 50],
        16 => [[DOWN, RIGHT], 50],
        17 => [[A,B,C], 50],
        18 => [[Y,X,DOWN,B], 50],
        19 => [[LEFT,DOWN], 50],
        20 => [[Z,Y,A], 50],
        21 => [[B,C,X,L], 50],
        22 => [[RIGHT,DOWN], 50],
        23 => [[A,B,R], 50],
        24 => [[X,Y,LEFT,R], 50],
        25 => [[LEFT,RIGHT], 50],
        26 => [[X,L,B], 50],
        27 => [[LEFT,X,C,Z], 50],
        28 => [[LEFT,DOWN], 50],
        29 => [[C,X,A], 50],
        30 => [[X,Z,C,UP], 50],
        31 => [[UP,DOWN,X], 0],
        32 => [[LEFT,RIGHT,L,R], 50],
        57 => [[A, C], 0],
        58 => [[C, X, UP], 50],
        59 => [[A, UP, RIGHT, A], 50],
        60 => [[Z, C, A, B], 50],
        61 => [[X, C], 50],
        62 => [[UP, X, DOWN], 50],
        63 => [[LEFT, C, Y, A], 50],
        64 => [[X, C, Y, A], 50],
        65 => [[Y, A], 50],
        66 => [[RIGHT, B, A], 50],
        67 => [[LEFT, UP, Z, A], 50],
        68 => [[Y, B, Y, A], 50],
        69 => [[LEFT, A], 50],
        70 => [[A, C, A], 50],
        71 => [[B, B, A, A], 50],
        72 => [[A, B, X, Y], 50],
        73 => [[X, A], 50],
        74 => [[Y, A, B], 50],
        75 => [[LEFT, RIGHT, Y, A], 50],
        76 => [[A, C, L, A], 50],
        77 => [[R, X], 50],
        78 => [[L, C, R], 50],
        79 => [[LEFT, L, RIGHT, R], 50],
        80 => [[C, C, Z, RIGHT], 50]
  }

# * Cuando la animación de fallar cambia, es necesario quitar algunos
#   comentarios del lugar.
#===============================================================================
# ** FIN de la personalización
#===============================================================================
end

#===============================================================================
# * Input
#==============================================================================
module Input
  module_function
  #--------------------------------------------------------------------------
  # * Key-in decision other than designated key
  #--------------------------------------------------------------------------
  def n_trigger?(num)
    if trigger?(num)
      return false
    elsif trigger?(A) or trigger?(B) or trigger?(C) or
          trigger?(X) or trigger?(Y) or trigger?(Z) or
          trigger?(L) or trigger?(R) or
          trigger?(UP) or trigger?(DOWN) or trigger?(RIGHT) or trigger?(LEFT)
        return true
    end
    return false    # In case of the key which not yet it does not input or does not use, or
  end
  #--------------------------------------------------------------------------
  # * Key transformation table (for characters on screen acquisition)
  #--------------------------------------------------------------------------
  def key_converter(key)
    # Game pad type
    if $game_switches[TacticalSkill::KEY_TYPE_ID]
      case key
      when A
        return "A"
      when B
        return "B"
      when C
        return "C"
      when X
        return "X"
      when Y
        return "Y"
      when Z
        return "Z"
      when L
        return "R"
      when R
        return "L"
      end
    # Keyboard type
    else
      case key
      when A
        return "Z"
      when B
        return "X"
      when C
        return "C"
      when X
        return "A"
      when Y
        return "S"
      when Z
        return "D"
      when L
        return "Q"
      when R
        return "W"
      end
    end
    case key
    when UP
      return "↑"
    when DOWN
      return "↓"
    when LEFT
      return "←"
    when RIGHT
      return "→"
    end
  end
end

#==============================================================================
# ** Game_Battler
#==============================================================================
class Game_Battler
  attr_accessor   :tact_flag
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  alias initialize_tactical initialize
  def initialize
    initialize_tactical     # Original
    @tact_flag = false
  end
  #--------------------------------------------------------------------------
  # * Apply Skill Effects
  #     user  : the one using skills (battler)
  #     skill : skill
  #--------------------------------------------------------------------------
  alias skill_effect_tactical skill_effect
  def skill_effect(user, skill)
    if $scene.is_a?(Scene_Battle) and user.tact_flag
      skill_copy = $data_skills[skill.id].dup
      skill.power = skill.power * TacticalSkill::T_SKILL[skill.id][1] / 100
      skill.hit = 0 if skill.power == 0   # The revision which does not hit by power 0
    end
    ret = skill_effect_tactical(user, skill)
    if $scene.is_a?(Scene_Battle) and user.tact_flag
      user.tact_flag = false
      $data_skills[skill.id] = skill_copy.dup
    end
    return ret
  end
end

#==============================================================================
# ** Scene_Battle
#==============================================================================
class Scene_Battle
  #--------------------------------------------------------------------------
  # * Frame Update (main phase step 2 : start action)
  #--------------------------------------------------------------------------
  alias update_phase4_step2_tactical update_phase4_step2
  def update_phase4_step2
    update_phase4_step2_tactical
    # Initialization
    @active_battler.tact_flag = false
    @tact_skill_ok = false
    @miss_flag = false      # Remove (#) comment if using the "Miss" animation
  end
  #--------------------------------------------------------------------------
  # * Make Skill Action Results
  #--------------------------------------------------------------------------
  alias make_skill_action_result_tactical make_skill_action_result
  def make_skill_action_result
    # First decision
    # If not a forcing action
    unless @active_battler.current_action.forcing
      # If unable to use due to SP running out
      unless @active_battler.skill_can_use?(@active_battler.current_action.skill_id)
        # Clear battler being forced into action
        $game_temp.forcing_battler = nil
        # Shift to step 1
        @phase4_step = 1
        return
      end
    end
    
    if @active_battler.is_a?(Game_Actor)
      if !TacticalSkill::T_SKILL[@active_battler.current_action.skill_id].nil?
        # Tactical motion
        make_tactical_skill_result
      end
    end
    if TacticalSkill::ALL_ATK and @tact_skill_ok
      if TacticalSkill::ALL_ATK_SK.include?(@skill.id)
        skill_copy = @skill.dup
        @skill.scope = 2
      end
    end
    
    make_skill_action_result_tactical   # Original
    
    if TacticalSkill::ALL_ATK and @tact_skill_ok
      if TacticalSkill::ALL_ATK_SK.include?(@skill.id)
        @tact_skill_ok = false
        @skill = $data_skills[skill_copy.id] = skill_copy.dup
      end
    end
    # Remove (#) comments if using the "Miss" animation
    if @miss_flag
      @miss_flag = false
      unless TacticalSkill::T_SKILL[@skill.id][2].nil?
        @animation2_id = TacticalSkill::T_SKILL[@skill.id][2]
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Tactical result compilation
  #--------------------------------------------------------------------------
  def make_tactical_skill_result
    # When flashing there is no command
    #return if @active_battler.flash_flag

    tact_skill = TacticalSkill::T_SKILL[@active_battler.current_action.skill_id][0]
    time = TacticalSkill::KEY_SEC * tact_skill.size * Graphics.frame_rate
    key_count = 0
    @active_battler.tact_flag = true
    # Key-in & count window compilation
    window_keycount = Window_KeyCount.new(tact_skill)
    window_counter = Window_KeyCounter.new
    # Remove (#) Comments at time "of battle position revision" combined use
    case $game_party.actors.size
    when 1
      actor_x = 240
    when 2
      actor_x = @active_battler.index * 240 + 120
    when 3
      actor_x = @active_battler.index * 200 + 40
    when 4
      actor_x = @active_battler.index * 160
    end
    window_keycount.x = window_counter.x = actor_x

    for i in 0...time
      # It succeeds in key-in?
      if Input.trigger?(tact_skill[key_count])
        key_count += 1
        window_keycount.key_in
      elsif Input.n_trigger?(tact_skill[key_count])   # The key which is different was pushed
        @miss_flag = true      # Remove (#) comments if using the "Miss" animation
        # Play "Miss" SE
        Audio.se_play("Audio/SE/" + TacticalSkill::SE_MISS)
        break
      end
      # Completion of all the key-in
      if key_count >= tact_skill.size
        window_keycount.text_in("Completo")
        # Play "Complete" SE
        Audio.se_play("Audio/SE/" + TacticalSkill::SE_COMPLETE)
        @active_battler.tact_flag = false
        @tact_skill_ok = true if TacticalSkill::ALL_ATK
        break
      end
      # Renewal of progress bar
      window_counter.refresh((i*100/time).truncate)
      Graphics.update
      Input.update
    end
    # It did not input at all = mistake
    if @active_battler.tact_flag
      window_keycount.text_in("Falló")
    end
    # wait for Miss、Complete display
    for i in 0...10
      Graphics.update
      @spriteset.update
    end
    window_keycount.dispose
    window_counter.dispose
  end
end

#==============================================================================
# ** Window_Base
#==============================================================================
class Window_Base < Window
  #--------------------------------------------------------------------------
  # * Draw Counter Bar
  #     x       : window x-coordinate
  #     y       : window y-coordinate
  #     current : Progress ratio (%)
  #--------------------------------------------------------------------------
  def draw_counter_bar(x, y, current)
    bitmap = RPG::Cache.windowskin(TacticalSkill::T_BAR_NAME)
    cw = bitmap.width * current / 100
    ch = bitmap.height
    src_rect = Rect.new(0, 0, cw, ch)
    self.contents.blt(x, y, bitmap, src_rect)
  end
end

#==============================================================================
# ** Window_KeyCounter
#------------------------------------------------------------------------------
#  The bar which indicates progress ratio
#==============================================================================
class Window_KeyCounter < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     key : Key arrangement
  #--------------------------------------------------------------------------
  def initialize
    super(0, 256, 150, 80)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.opacity = 0
    self.z = 1            # The battler compared to it indicates in the inner part
    refresh(0)
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #     current : Progress ratio (%)
  #--------------------------------------------------------------------------
  def refresh(current)
    self.contents.clear
    #draw_counter_bar(0, 0, 100-current)    # Progress direction : ←
    draw_counter_bar(0, 0, current)         # Progress direction : →
  end
end

#==============================================================================
# ** Window_KeyCount
#------------------------------------------------------------------------------
#  The window which indicates the key which it inputs.
#==============================================================================
class Window_KeyCount < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     key : Key arrangement
  #--------------------------------------------------------------------------
  def initialize(key)
    super(0, 220, 150, 80)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.opacity = 160    # Translucency
    self.z = 0            # The progress bar compared to it indicates in the inner part
    @key = key
    @key_count = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@key.size
      x = i * 32    # Interval between letter: 32
      if i < @key_count
        self.contents.font.color = knockout_color
      else
        self.contents.font.color = normal_color
      end
      self.contents.draw_text(x, 0, 100, 32, Input.key_converter(@key[i]))
    end
  end
  #--------------------------------------------------------------------------
  # * Key count
  #--------------------------------------------------------------------------
  def key_in
    @key_count += 1
    refresh
  end
  #--------------------------------------------------------------------------
  # * Text indication
  #       text : text
  #--------------------------------------------------------------------------
  def text_in(text)
    self.contents.clear
    self.contents.draw_text(0, 0, 100, 32, text, 1)
  end
end

También dejo un pequeño ajuste a la ventana de habilidades es Opcional.
Permite mostrar al lado de cada habilidad el comando que se debe ejecutar para realizar perfectamente la habilidad.
Las probabilidades de Acierto siguen siendo las default (en el caso de haber hecho perfectamente la secuencia, se
puede fallar de igual forma)



Aquí el script:
Código:
#===============================================================================
# ** Muestra el Comando de Habilidades Tácticas  Ver.1.0.1
#===============================================================================
# Autor: Claimh
#------------------------------------------------------------------------------
#  Esto crea una ventana para indicar las pulsaciones necesarias en la batalla
#  para hacer funcionar las habilidades seleccionadas.  
#  Requiere el Script:  Habilidades Tácticas
#==============================================================================

class Window_Skill < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     actor : actor
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(0, 128, 640, 352)
    @actor = actor
    @column_max = 1     # 1 line indication
    refresh
    self.index = 0
    # If in battle, move window to center of screen
    # and make it semi-transparent
    if $game_temp.in_battle
      self.y = 64
      self.height = 256
      self.back_opacity = 160
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #     index : item number
  #--------------------------------------------------------------------------
  def draw_item(index)
    skill = @data[index]
    if @actor.skill_can_use?(skill.id)
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 4 + index % @column_max * (288 + 32)    # @column_max correction
    y = index / @column_max * 32                # @column_max correction
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(skill.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 204, 32, skill.name, 0)
    self.contents.draw_text(x + 232, y, 48, 32, skill.sp_cost.to_s, 2)
    # If a Tactical Skill
    if !TacticalSkill::T_SKILL[skill.id].nil?
      tact_skill = TacticalSkill::T_SKILL[skill.id][0]
      command = ""
      for i in 0...tact_skill.size
        command += Input.key_converter(tact_skill[i]) + " "
      end
      self.contents.draw_text(x + 288 + 32, y, 204, 32, command)
    else
      self.contents.draw_text(x + 288 + 32, y, 204, 32, "Sin Comando")
    end
  end
end

Imagen necesaria carpeta Windowskins. Según el script se debe nombrar como "bar"



Autor: Claimh
avatar
AsFzKakarotto
Soñador
Soñador

0/3

Créditos 303

Gracias : 67

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Tactical Skills

Mensaje por Gacoro el 2018-04-30, 03:21

Muy impresionante, un script que no dudaría en usar, pero estoy usando VX ACE, y yo que buscaba lo mismo pero de manera de minijuego, de todas formas me parece un script muy bueno y que da mucha mas variedad a una pelea porque ya no solo afecta la IA que se le programo a los enemigos sino la habilidad del jugador para presionar las teclas a tiempo.
(como me serviría para el ACE)
Muy buen aporte, +1.
avatar
Gacoro
Soñador
Soñador

0/3

Créditos 348

Gracias : 20

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


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