Autor: Kyonides Arkanthes

Descripción

Este script les permite crear temporizadores para que los objetivos mueran o se les acabe el mana. Segundo a segundo los irán consumiendo hasta que se acaben o el objetivo caiga finalmente. Hay adiciones como permitir que se sumen estados a su gusto o que al perder todo el mana también fallezca el objetivo.

Me imagino que la gente preferirá que sean los monstruos los que usen esta clase de técnicas.

Script Principal

# * KReaper XP
#   Scripter : Kyonides Arkanthes
#   2019-10-26

# Este script les permite matar a sus héroes o enemigos via llamados a script.
# Crea un cronómetro que eventualmente ¡reducirá a 0 sus PV o PM!

# Revisen el módulo KReaper, allí pueden fijar muchos valores iniciales.
# Técnicas pueden detonar la "Sentencia del Segador" y "Hoyo Negro de Mana".

# KReaper.add_states = true O false
#  Agrega un estado si la víctima se convirtió en el objetivo del Segador.

# KReaper.mana_knockout = true O false
#  Seres mágicos sin Mana restante (no) caerán en batalla automáticamente.

# KReaper.mana_loss_lose_hp = true O false
#  Seres mágicos (no) perderán PV también.

# KReaper.mana_loss_hp_loss
#  Seres mágicos perderán n cantidad de PV por Segundo

# * Llamados a Script Opcionales *

# $game_party.reaper_targets
#  Retorna a todos los héroes que se han convertido en objetivos del Segador.

# $game_party.mana_loss_targets
#  Retorna a todos los héroes que verán como su Mana se desvanece.

#  Solo en caso de que deseen ajustar el objetivo del Segador manualmente...
# battler = $game_party.actors[Indice_Miembro]
#  O bien
# battler = $game_troop.enemies[Indice_Miembro]
#  Entonces
# battler.reaper_target!  #=> El Cronómetro de Vida se activa!
# battler.reaper_target?  #=> ¿Está la hoz del Segador acechando a su presa?
# battler.doom_timer      #=> Tiempo restante en cuadros alias frames
#  O sus versiones de Pérdida de Mana...
# battler.mana_loss_target!
# battler.mana_loss_target?
# battler.mana_loss_timer

module KReaper
  LIFE_SKILL_ID = 1 # Técnica que llamará la atención del Segador
  MANA_SKILL_ID = 2 # Técnica que representará al Hoyo Negro de Mana
  # Agrega estados a las víctimas del Segador
  @add_states = true
  # ¿Deben morir los Seres Mágicos si su Mana se reduce a 0?
  @mana_knockout = true
  # ¿Debe quemarse Vida junto con el Mana?
  @mana_loss_lose_hp = true
  @mana_loss_hp_loss = 1 # PV Perdido Por Segundo
  # Valor Sugerido del Cronómetro: Frame Rate * 60 ( 1 Minuto )
  @timer = Graphics.frame_rate * 60
  TIMER = {
    :actor => { 1 => @timer * 2 },
    :enemy => { 1 => @timer * 4 }
  }
  TIMER.default = @timer * 3
  STATES = {
    :actor => { 1 => [1] },
    :enemy => { 1 => [2] }
  }
  STATES.default = []
  class << self
    attr_accessor :add_state, :mana_knockout, :show_timer
    attr_accessor :mana_loss_lose_hp, :mana_loss_hp_loss
  end
end

class Game_System
  alias :kyon_reaper_gm_sys_up :update
  def update
    $game_party.check_reaper_timers
    $game_party.check_mana_loss_timers
    kyon_reaper_gm_sys_up
  end
end

class Game_Battler
  alias :kyon_reaper_gm_battler_init :initialize
  alias :kyon_reaper_gm_battler_se :skill_effect
  def initialize
    kyon_reaper_gm_battler_init
    @doom_timer = 0
    @mana_timer = 0
  end

  def skill_effect(user, skill)
    result = kyon_reaper_gm_battler_se(user, skill)
    if result
      if KReaper::LIFE_SKILL_ID == skill.id
        reaper_target!
      elsif KReaper::MANA_SKILL_ID == skill.id
        mana_loss_target!
      end
    end
    result
  end

  def check_reaper_time
    @doom_timer -= 1
    reaper_claim! if @doom_timer == 0
  end

  def reaper_claim!
    @reaper_target = nil
    @hp = 0
  end

  def reaper_target!
    reaper_states = KReaper.add_states ? KReaper::STATES[self.kind] : []
    reaper_states.each{|n| add_state(n) }
    @doom_timer = KReaper::TIMER[self.kind]
    @reaper_target = true
  end

  def check_mana_loss_time
    @mana_loss_timer -= 1
    if @mana_loss_timer % 60 == 0 and KReaper.mana_loss_lose_hp
      self.hp -= KReaper.mana_loss_hp_loss
    end
    mana_robber_claim! if @mana_loss_timer == 0
  end

  def mana_robber_claim!
    @mana_loss_target = nil
    @hp = 0 if KReaper.mana_knockout
    @sp = 0
  end

  def mana_loss_target!
    @mana_timer = KReaper::TIMER[self.kind]
    @mana_loss_target = true
  end
  def reaper_target?() @reaper_target end
  def mana_loss_target?() @mana_loss_target end
  def no_life_left?() @doom_timer == 0 end
  def no_mana_left?() @mana_loss_timer == 0 end
  def clear_doom_timer?() @doom_timer %= Graphics.frame_rate == 0 end
  def clear_mana_timer?() @mana_loss_timer %= Graphics.frame_rate == 0 end
  attr_accessor :doom_timer, :mana_loss_timer
end

class Game_Actor
  def kind() :actor end
end

class Game_Enemy
  def kind() :enemy end
end

class Game_Party
  def reaper_targets() @actors.select{|a| a.reaper_target? } end
  def non_reaper_targets() @actors.reject{|a| a.reaper_target? } end
  def check_reaper_timers() reaper_targets.each{|a| a.check_reaper_time } end
  def mana_loss_targets() @actors.select{|a| a.mana_loss_target? } end
  def non_mana_loss_targets() @actors.reject{|a| a.mana_loss_target? } end
  def check_mana_loss_timers() mana_loss_targets.each{|a| a.check_mana_loss_time } end
end

Script Complementario para el Sistema de Batallas por Defecto y otros compatibles

# * KReaper XP Default Battle System Add On
#   Scripter : Kyonides Arkanthes

module KReaper
  LIFE_TIMER_Y = 280
  MANA_TIMER_Y = 280
  @show_timer = true # Toggle Life or Mana Timers: true OR false
end

class Scene_Battle
  alias :kyon_reaper_scn_battle_main :main
  alias :kyon_reaper_scn_battle_mao :make_action_orders
  alias :kyon_reaper_scn_battle_up4s6 :update_phase4_step6
  def main
    @frames = Graphics.frame_rate
    @hp_reapers = []
    @sp_reapers = []
    4.times do |n|
      @hp_reapers << s = Sprite.new
      s.x = 30 + n * 160
      s.y = KReaper::LIFE_TIMER_Y
      s.bitmap = Bitmap.new(100, 24)
      @sp_reapers << s = Sprite.new
      s.x = 30 + n * 160
      s.y = KReaper::MANA_TIMER_Y
      s.bitmap = Bitmap.new(100, 24)
    end
    kyon_reaper_scn_battle_main
    (@hp_reapers + @sp_reapers).each{|s| s.dispose }
  end

  def make_action_orders
    kyon_reaper_scn_battle_mao
    return unless KReaper.show_timer
    $game_party.non_reaper_targets.each do |a|
      pos = $game_party.actors.index(a)
      @hp_reapers[pos].bitmap.clear
    end
    $game_party.non_mana_loss_targets.each do |a|
      pos = $game_party.actors.index(a)
      @sp_reapers[pos].bitmap.clear
    end
  end

  def update_phase4_step6
    kyon_reaper_scn_battle_up4s6
    return unless KReaper.show_timer
    $game_party.reaper_targets.each do |a|
      next unless a.clear_doom_timer? and !a.no_life_left?
      pos = $game_party.actors.index(a)
      redraw_reaper_timer(@hp_reapers[pos].bitmap, a.doom_timer)
    end
    $game_party.mana_loss_targets.each do |a|
      next unless a.clear_mana_timer? and !a.no_mana_left?
      pos = $game_party.actors.index(a)
      redraw_reaper_timer(@sp_reapers[pos].bitmap, a.mana_loss_timer)
    end
  end

  def redraw_reaper_timer(bitmap, timer)
    time = sprintf("%02d:%02d", timer / @frames, timer % @frames)
    bitmap.clear
    bitmap.draw_text(bitmap.rect, time)
  end
end

Términos de Uso

Deben incluir mi seudónimo y la URL del sitio en el que encontraron mi script.
Es gratuito para demos y juegos no comerciales.