Autor: Kyonides Arkanthes

Introducción

¡Ahora los monstruos pueden comerse a otros monstruos para reponer su vida o mana! 😆

El script puede funcionar desde el momento en que lo agregan o pueden modificar los valores dentro del módulo KMonster por los que les gusten. Admito que la configuración de los hashes podría no ser muy amigable con los usuarios novatos… 😆

Script para XP

# * KMonsterSacrifice XP
#   Scripter : Kyonides Arkanthes
#   2019-11-04

# Este script permite que configuren a monstruos que sacrifiquen a sus amigos
# para recuperar su vida o mana si usan una técnica. Además ellos pueden robar
# un poco de fuerza o inteligencia a sus colegas.

# KMonster.mana_knockout = true O bien... false
#  Seres mágicos sin mana (no) pueden morir en batalla automáticamente si otro
#  monstruo drena todo su mana.

module KMonster
  SACRIFICE_FAILED = "FALLIDO"
  LIFE_SACRIFICE_ID = 5 # Vida
  MANA_SACRIFICE_ID = 6 # Mana o SP
  STR_SACRIFICE_ID = 7 # Fuerza
  INT_SACRIFICE_ID = 8 # Inteligencia
  # ¿Deben morir si ya no tienen más mana?
  @mana_knockout = true # true O bien... false
  # Opciones: :max o :rest o un porcentaje (entre 1 y 99)
  LIFE_SACRIFICE = {
    1 => :rest, 2 => 10, 3 => :max
  }
  MANA_SACRIFICE = {
    1 => :rest, 2 => 7, 3 => :max
  }
  # Para Fuerza e Inteligencia la opción :rest es igual a :max
  STR_SACRIFICE = {}
  INT_SACRIFICE = {}
  def self.mana_knockout() @mana_knockout end
  def self.mana_knockout=(bool) @mana_knockout = bool end
end

class Game_Battler
  attr_writer :str_plus, :int_plus
  alias :kyon_monster_sacrifice_gm_battler_se :skill_effect
  def skill_effect(user, skill)
    killed = @hp == 0
    result = kyon_monster_sacrifice_gm_battler_se(user, skill)
    if result
      if KMonster::LIFE_SACRIFICE_ID == skill.id
        return life_sacrifice_calculation
      elsif KMonster::MANA_SACRIFICE_ID == skill.id
        return mana_sacrifice_calculation
      elsif KMonster::STR_SACRIFICE_ID == skill.id
        return str_sacrifice_calculation
      elsif KMonster::INT_SACRIFICE_ID == skill.id
        return int_sacrifice_calculation
      end
    end
    result
  end

  def life_sacrifice_calculation
    mobs = $game_troop.enemies - [self]
    if mobs.size > 0
      mob = mobs[rand(mobs.size)]
      stype = KMonster::LIFE_SACRIFICE[mob.id]
      case stype
      when :max
        self.hp += mhp = mob.maxhp
        @damage = -mhp
        mob.damage = mhp
        mob.hp = 0
      when :rest
        self.hp += mhp = mob.hp
        @damage = -mhp
        mob.damage = mhp
        mob.hp = 0
      when 1..99
        self.hp += total = mob.maxhp * stype / 100
        @damage = -total
        mob.damage = total
        mob.hp -= total
      end
      return true if stype
    end
    @damage = KMonster::SACRIFICE_FAILED
    false
  end

  def mana_sacrifice_calculation
    mobs = $game_troop.enemies - [self]
    if mobs.size > 0
      mob = mobs[rand(mobs.size)]
      stype = KMonster::MANA_SACRIFICE[mob.id]
      case stype
      when :max
        self.sp += msp = mob.maxsp
        @damage = -msp
        mob.damage = msp
        mob.sp = 0
      when :rest
        self.sp += msp = mob.sp
        @damage = -msp
        mob.damage = msp
        mob.sp = 0
      when 1..99
        self.sp += total = mob.maxsp * stype / 100
        @damage = -total
        mob.damage = total
        mob.sp -= total
      end
      mob.hp = 0 if KMonster.mana_knockout and mob.sp == 0
      return true if stype
    end
    @damage = KMonster::SACRIFICE_FAILED
    false
  end

  def str_sacrifice_calculation
    mobs = $game_troop.enemies - [self]
    if mobs.size > 0
      mob = mobs[rand(mobs.size)]
      stype = KMonster::STR_SACRIFICE[mob.id]
      case stype
      when :max. :rest
        @str_plus += total = mob.base_str
        @damage = -total
        mob.damage = total
        mob.str_plus = -total
      when 1..99
        @str_plus += total = (mob.base_str - mob.str_plus) * stype / 100
        @damage = -total
        mob.damage = total
        mob.str_plus -= total
      end
      return true if stype
    end
    @damage = KMonster::SACRIFICE_FAILED
    false
  end

  def int_sacrifice_calculation
    mobs = $game_troop.enemies - [self]
    if mobs.size > 0
      mob = mobs[rand(mobs.size)]
      stype = KMonster::INT_SACRIFICE[mob.id]
      case stype
      when :max. :rest
        @int_plus += total = mob.base_int
        @damage = -total
        mob.damage = total
        mob.int_plus = -total
      when 1..99
        @int_plus += total = (mob.base_int - mob.int_plus) * stype / 100
        @damage = -total
        mob.damage = total
        mob.int_plus -= total
      end
      return true if stype
    end
    @damage = KMonster::SACRIFICE_FAILED
    false
  end
end

Script para VX

# * KMonsterSacrifice VX
#   Scripter : Kyonides Arkanthes
#   2019-11-04

# Este script permite que configuren a monstruos que sacrifiquen a sus amigos
# para recuperar su vida o mana si usan una técnica. Además ellos pueden robar
# un poco de fuerza o inteligencia a sus colegas.

# KMonster.mana_knockout = true O bien... false
#  Seres mágicos sin mana (no) pueden morir en batalla automáticamente si otro
#  monstruo drena todo su mana.

module KMonster
  SACRIFICE_FAILED = "FALLIDO"
  LIFE_SACRIFICE_ID = 5 # Vida
  MANA_SACRIFICE_ID = 6 # Mana o MP
  ATK_SACRIFICE_ID = 7 # Fuerza
  SPI_SACRIFICE_ID = 8 # Inteligencia
  # ¿Deben morir si ya no tienen más mana?
  @mana_knockout = true # true O bien... false
  # Opciones: :max o :rest o un porcentaje (entre 1 y 99)
  LIFE_SACRIFICE = {
    1 => :rest, 2 => 10, 3 => :max
  }
  MANA_SACRIFICE = {
    1 => :rest, 2 => 7, 3 => :max
  }
  # Para Ataque y Espíritu la opción :rest es igual a :max
  ATK_SACRIFICE = {}
  SPI_SACRIFICE = {}
  def self.mana_knockout() @mana_knockout end
  def self.mana_knockout=(bool) @mana_knockout = bool end
end

class Game_Battler
  attr_writer :hp_damage, :mp_damage
  attr_accessor :atk_plus, :spi_plus
  alias :kyon_monster_sacrifice_gm_battler_se :skill_effect
  def skill_effect(user, skill)
    killed = @hp == 0
    result = kyon_monster_sacrifice_gm_battler_se(user, skill)
    if result
      if KMonster::LIFE_SACRIFICE_ID == skill.id
        return life_sacrifice_calculation
      elsif KMonster::MANA_SACRIFICE_ID == skill.id
        return mana_sacrifice_calculation
      elsif KMonster::ATK_SACRIFICE_ID == skill.id
        return atk_sacrifice_calculation
      elsif KMonster::SPI_SACRIFICE_ID == skill.id
        return spi_sacrifice_calculation
      end
    end
    result
  end

  def life_sacrifice_calculation
    mobs = $game_troop.members - [self]
    if mobs.size > 0
      mob = mobs[rand(mobs.size)]
      stype = KMonster::LIFE_SACRIFICE[mob.id]
      case stype
      when :max
        self.hp += total = mob.maxhp
        @hp_damage = -total
        mob.hp_damage = total
        mob.hp = 0
      when :rest
        self.hp += total = mob.hp
        @hp_damage = -total
        mob.hp_damage = total
        mob.hp = 0
      when 1..99
        self.hp += total = mob.maxhp * stype / 100
        @hp_damage = -total
        mob.hp -= total
      end
      return true if stype
    end
    @hp_damage = KMonster::SACRIFICE_FAILED
    false
  end

  def mana_sacrifice_calculation
    mobs = $game_troop.members - [self]
    if mobs.size > 0
      mob = mobs[rand(mobs.size)]
      stype = KMonster::MANA_SACRIFICE[mob.id]
      case stype
      when :max
        self.mp += total = mob.maxmp
        @mp_damage = -total
        mob.mp_damage = total
        mob.mp = 0
      when :rest
        self.mp += total = mob.mp
        @mp_damage = -total
        mob.mp_damage = total
        mob.mp = 0
      when 1..99
        self.mp += total = mob.maxmp * stype / 100
        @mp_damage = -total
        mob.damage = total
        mob.mp -= total
      end
      mob.hp = 0 if KMonster.mana_knockout and mob.mp == 0
      return true if stype
    end
    @mp_damage = KMonster::SACRIFICE_FAILED
    false
  end

  def atk_sacrifice_calculation
    mobs = $game_troop.members - [self]
    if mobs.size > 0
      mob = mobs[rand(mobs.size)]
      stype = KMonster::ATK_SACRIFICE[mob.id]
      case stype
      when :max. :rest
        @atk_plus += total = mob.base_atk
        @damage = -total
        mob.damage = total
        mob.atk_plus = -total
      when 1..99
        @atk_plus += total = (mob.base_atk - mob.atk_plus) * stype / 100
        @damage = -total
        mob.damage = total
        mob.atk_plus -= total
      end
      return true if stype
    end
    @hp_damage = KMonster::SACRIFICE_FAILED
    false
  end

  def spi_sacrifice_calculation
    mobs = $game_troop.members - [self]
    if mobs.size > 0
      mob = mobs[rand(mobs.size)]
      stype = KMonster::SPI_SACRIFICE[mob.id]
      case stype
      when :max. :rest
        @spi_plus += total = mob.base_spi
        @damage = -total
        mob.damage = total
        mob.spi_plus = -total
      when 1..99
        @spi_plus += total = (mob.base_spi - mob.spi_plus) * stype / 100
        @damage = -total
        mob.damage = total
        mob.spi_plus -= total
      end
      return true if stype
    end
    @mp_damage = KMonster::SACRIFICE_FAILED
    false
  end
end

Términos de Uso

Deben incluir mi seudónimo y el URL del sitio del que lo copiaron.
Es gratuito para demos y juegos no comerciales.

8 días más tarde
kyonides cambió el título a KMonsterSacrifice XP & VX .

Como pueden ver ya hay una versión del script para VX.
Además ya cuentan con la opción de hacer que sus monstruos se roben fuerza o inteligencia entre ellos, je, je.

3 meses más tarde

Oye, perdona mi ignorancia, yo he usado mucho el motor RPG Maker XP, pero no se nada sobre poner Scripts, no se donde exactamente debo poner este Script exactamente, abro el editor de Scripts pero… No se en cual Script sobreponer este otro, o cual es el que debo reemplazar exactamente.

    O_o? Quién te dijo que había que sobreponerlo? En todo caso ignoro qué otros scripts hayas utilizado en tu proyecto, lo que complica mucho el asunto.

      Predummy

      No recuerdo ahora el XP, pero imagino que el script tienes que ponerlo al final de la lista pero siempre por encima del “Main”. Al menos en VX se ponen debajo de una etiqueta que dice “Materials” y por encima del script “Main”.

      Lo que si, no sustituyas ningún script actual.

      Saludos

        kyonides eso no responde a mi pregunta -_-, no he usado ningún otro Script en mi proyecto… Precisamente por eso no se como usar correctamente los Scripts (tal parece que solo leíste lo que quisiste).

        Pues, créeme cuando te digo que me he topado con TODO tipo de personas que hacen sus mezclas buenas y malas y raras. Eso es lo que me hace recomendarte a ti y a todos los demás que siempre digan qué scripts han incluido, cuáles han modificado o toqueteado, etc. Ha habido veces que alguien hace un cambio mínimo, incluso de una letra o algo así y luego “se les olvida” que lo hicieron y uno termina dando mil vueltas a un asunto que habría sido muy simple de haber sabido qué cambiaron desde el inicio. En XP no hay esas etiquetas que indicó xsebas y ni falta hacen.
        Aún así no te emociones por su respuesta, la cosa no termina ahí. Si es cierto que solo incluyes un script personalizado, será fácil que corra el juego. Cuando empieces a meter más scripts, es cuando irás descubriendo qué debe ir antes o después de otros scripts personalizados. Te lo advierto porque los novatos no tienden a imaginarse esas cosas y es bueno que lo sepan.
        -1 para Predummy 😛

          kyonides

          “yo he usado mucho el motor RPG Maker XP, pero no se nada sobre poner Scripts,”

          … Amigo… qué no es obvio que si no se nada de Scripts en RPGMXP es porque jamas le he puesto uno a mis juegos?… Te digo algo… Eres arrogante y molesto, tratas a los demás como si fueran inferiores, te hice un cuestionamiento exageradamente sencillo y en lugar de responder, supusiste algo que claramente no es posible

          “En todo caso ignoro qué otros scripts hayas utilizado en tu proyecto, lo que complica mucho el asunto.”

          , lo dicho

          (tal parece que solo leíste lo que quisiste)."

          . Pero esta bien… No es algo de vida o muerte así qué… Por favor ¿me puedes explicar donde y como debo poner este Script en el RPG Maker XP? (uso la versión “en español” y no he usado ningún otro Script).

          Para usar scripts:

          1) Abre la ventana de scripts y ve hasta el final de la lista. Da clic sobre “main” para que quede seleccionado.
          2) Da clic derecho sobre main y selecciona “insertar”. Se creara un script en blanco.
          3) Selecciona el código del script que vas a añadir, asegurándote de que esté completo, y da copiar. Ahora ve al script en blanco y pega el código allí.

          Toma en cuenta que:

          -Debes leer cuidadosamente las instrucciones de cada script que añadas, en especial los que tocan cosas de otros scripts o requieren mucha edición.
          -Algunos scripts dependen de otros, por lo que debes ser especialmente cuidadoso a la hora de añadirlos, en especial porque llevan un orden de carga especifico y algunas veces requieren que configures el “script principal” (o base) para poder usarlos adecuadamente.
          -Entre más scripts añadas incrementas la posibilidad de que alguno cause conflictos por otro (en especial los que tocan el mismo sistema, por ejemplo los menús o el sistema de batalla). En estos casos hay que hacer muchas pruebas para ver que funciona y que no respecto a orden de carga; o incluso puede que tengas que decidir con cual quedarte, porque no hay forma que esos dos scripts es especifico trabajen juntos.
          -Respalda siempre, en especial si vas a probar un script nuevo.

          Mi consejo es que crees un nuevo proyecto y hagas todas las pruebas allí, y sólo cuando estés seguro que funciona, ya lo transfieres a tu proyecto.

            25 días más tarde

            alucard70 Muchisimas gracias, ahora se como ponerlos bien, algunas cosas que dijiste como respaldar o tener cuidado con las instrucciones son un tanto obvias a mi parecer pero siempre es bueno recordarlo.

            Me pregunto si a alguien se le habrá ocurrido algo que yo le pueda agregar al script.

            NOTA
            Cuando no sepan manejar scripts EN GENERAL, mejor creen un tema aparte. Me parece que es lo más justo tanto para mi script como para los demás usuarios que puedan tener el mismo inconveniente.

              kyonides si tuvieras la decencia de explicarlo no habría ninguna necesidad :-)

              No hagas un hijack de mi tema, por favor.

              Sigo esperando sugerencias que puedan darme para agregar cosas nuevas al script.