¡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

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

orochii

avatar
Dividing (and Transforming) Monsters!
VERSIÓN: 1.0 | RPG Maker VX/RGSS2.0 (probado en rgss202e.dll


INTRODUCCIÓN
Creo que no muchos habrán visto lo molesto de los monstruos que se dividen, pero intentaré explicar. Si han jugado al Final Fantasy III de NES/DS, pues ya están ubicados en cuanto a lo que trata (e imita, además de supuestamente sobrepasarlo Ópalo Gato) éste script, además de la parte de transformación que es simplemente mi deseo de imitar al RM2k3 (además de facilitar un poco algunas cosas, en fin).

Como sea, el script hace que los monstruos, cuando son atacados con un arma, se dividan xD, y si un elemento específico está presente en las armas (digamos, una espada de fuego), entonces el monstruo no se dividirá (ejemplo: que un limo al ser golpeado se divide y crea dos limos, pero cuando es quemado no pasa lo mismo). También posibilita lo inverso: que cuando es golpeado con cierto elemento entonces se divide (ejemplo: un cienpiés que si es cortado se divide en dos cienpies). La otra parte del script es que el monstruo al ser golpeado, se transforme en otro, y también está el que los monstruos usen skills para transformarse, sea entre ellos o inclusive el héroe puede transformar a un enemigo (¡aunque ésto todavía necesita algún tipo de restricción! como cambiarlo a un estado alterado y revisar si tiene el estado, así los finalboss no podrían convertirse en ratas xD). Por el momento, debido a la incopatibilidad entre Game_Actor y Game_Enemy, no se puede transformar a los héroes, pero veré si puedo hacer algo Ópalo Tuerto. TAMPOCO SE PUEDE DIVIDIR A LOS HEROES claro, y eso no pensaré siquiera en "arreglarlo".

Nota Importante: Usa el TagNote de Queex, abajo lo adjunto, junto con el link, además en el demo-Extended viene junto al script en txts aparte.
Resumen: abajo.

CARACTERÍSTICAS

  • Hace que los monstruos se dividan si son golpeados pero no con armas específicas (o que se dividan al contacto con armas específicas).
  • Los monstruos pueden copiar el HP actual del monstruo o no.
  • Puede especificarse elemento por monstruo, o usarse un "default" (modificable).
  • Opciones de transformación, sea por skill (objetivo 100% funcional) o al ser atacado.

SCREENSHOTS
Lo siento, pero en el demo está mejor... además no es muy fácil de ilustrar. Es como 3 limos + golpe = 4 limos. Imagínense eso, pero en RPG Maker xD.

DEMO


SCRIPT
Código:
#==============================================================
#Division y Transformación enemiga al estilo FF3
#Script de Orochii Zouveleki
#
#Gracias a Queex por las Tagnotes, y a Justin009 porque gracias a sus scripts de
#BOF_EnemySkills fue que me dio ganas de trastear con los efectos de los skills
#y de los ataques :3. Sino seguro me hubiese dado pereza... jajaja.
#
#Parte de las pruebas de Orochii, no vender ni alquilar, la idea
#es inspirada en los monstruos que se duplican en Final Fantasy III,
#de NES (o el de DS, pero ese es mas feo :P).
#==============================================================
#¿Qué rayos es esto?
#==============================================================
#Consiste en simplemente hacer que mediante la inclusión de un tag dentro
#de las notas de la base de datos, un monstruo se duplique cada vez que
#sea atacado con ciertas armas, se usen determinadas magias, o viceversa,
#si NO es atacado con tales armas o se usan determinadas magias sobre él.

#*El que un monstruo se divida significa que se creará un duplicado de él, con sus
#mismos estados (junto a una propiedad en el tag divisible, que será usada para
#especificar si el duplicado tendrá el HP al máximo). Más adelante podría agregar
#funcionalidades para dividir los estados en porcentajes (por ejemplo, que el nuevo
#monstruo tenga 20% del HP, y que tenga 75% de ataque, defensa... Tengo un
#método en mente para ello ;D.
#
#Comercial aparte, pueden jugar un ratito al FF3 de NES o buscar videos de batallas
#contra los Hazael, Cronos, y no me acuerdo de los otros monstruos esos malditos
#¡que tanto odio! En fin.

#La otra funcionalidad es simplemente hacer que por medio de tags también, se puedan
#transformar monstruos sea por skill o por contacto con armas. En próxima versión haré
#lo de los elementos y eso xD. Seguro será ahorita jajaja... en fin.
#==============================================================
#MODO DE USO
#==============================================================
#El script funciona por medio de tags en las notas de los enemigos, en general está el
#<divide> (junto a sus posibles propiedades) y el <reverse_divide>, que DEPENDE del
#primero. Además de la tag transform, que varía dependiendo de si es puesta en las
#notas de un skill o de un enemigo. Entraré en detalles de inmediato ;D.

#===========                      DIVIDIN' MONSTERS                      ===========#
#--<divide>
#El script utiliza un elemento específico para determinar el efecto, y se incluye
#el "tag" <divide> dentro de las notas del monstruo para especificar que el monstruo
#se divide al entrar en contacto con el arma/magia.

#-<divide hp>
#Al escribir <divide hp>, el nuevo monstruo copiará el hp actual del monstruo.

#-<divide hp ID>
#También para especificar un elemento específico a ser usado deberás escribir <divide hp ID>
#donde ID sería la id del elemento. Puedes poner en lugar de hp cualquier otra cosa si
#no quieres que se copie el hp actual.

#-<reverse_divide>
#Como último comando está el tag <reverse_divide>, el cual cuando está presente junto
#al <divide>, lo que hará será revertir el uso. En lugar de que el monstruo se divida al ser
#atacado por un elemento distinto al especificado, se dividirá SOLO cuando es atacado
#por ese elemento.
#Por ejemplo, una babosa, que si es cortada, se dividirá y se harán dos :3.

#<ultradivide>
#Permite que el monstruo se divida AUN cuando el monstruo está por morir. No es
#compatible con "hp" porque no tiene sentido hacer monstruos con 0 de vida.
#POR AHORA EL ULTRADIVIDE no es compatible con el reverse_divide.

#===========                TRANSFORMIN' MONSTERS                ===========#
#-<transform ID>
#Cámbiese ID por el id del monstruo al que se convertirá el enemigo con ésta tag
#o el usuario de la skill (que no puede ser actor/héroe, porque no hace nada simplemente
#jaja). También puede ser usado de manera que el héroe transforme enemigos o los
#enemigos transformen a otros, no importa ;D. Osea, el objetivo funciona al 100%.
#La tag funciona tanto en el campo de skills como de enemigo. Si es colocada en el
#de skills, el objetivo será transformado en el enemigo definido (todavía está en proceso
#el que algunos monstruos no puedan ser convertidos o agregar variación)
#Si es colocada dentro de las notes del monstruo, el enemigo se convertirá al ser atacado
#con un arma. El algo como por ejemplo, si una hidra es cortada, que salga una nueva
#cabeza :3.

#La transformación está presente en el maker por default, pero he querido poner algunas
#funciones extra xD, para variar un poco el script.

#==============================================================
#Instalación:
#==============================================================
#  -Simplemente copia el script dentro del editor de scripts sobre Main,
#  -pero recuerda además incluír el TagNotes de Queex, que es el que usaré
#  para los "tags" dentro de las notas del enemigo.
#  -En la segunda versión del script encontrarás la funcionalidad respecto a magias
#  específicas (no tengo necesidad de hacerla ahora), y en la siguiente entrará en
#  materia lo que son las transformaciones, que intentaré imitar el método del RM2k/3.
#  Y un poco además una idea que se me ha ocurrido :3.

#==============================================================
#----------------------------------------------------------------------------------------------------------------------------
#Espero que les agrade ;D.
#
#                                                      FIN
#==============================================================
module OROCHII_MONSTERS
  #Elemento que se utilizará como excepción para la división (como valor default).
  DIVIDE_ELEMENT = 2
  #Porcentaje necesario para que un enemigo se divida.
  MIN_HP = 10
  #Número máximo de enemigos que pueden aparecer en una batalla. Ésto porque las
  #ventanitas de objetivo dan problemas por ahora no solucionados jeje...
  MAX_ENEMIES = 24
  #Unidad de distancia utilizada al calcular la posición del nuevo enemigo.
  DISTANCE_UNITY = 16
  #Valor máximo en X para randomizar la posición. Recuerde que es multiplicado por DISTANCE_UNITY
  RANDOM_X = 20
  #Valor máximo en Y para randomizar la posición. Recuerde que es multiplicado por DISTANCE_UNITY
  RANDOM_Y = 5
end

class Spriteset_Battle
  def enemy_sprites
    return @enemy_sprites
  end
  def viewport1
    return @viewport1
  end
end

class Scene_Battle
  def add_battler(enemy)
    @spriteset.enemy_sprites.push(Sprite_Battler.new(@spriteset.viewport1, enemy))
  end
end

class Game_Battler

  include OROCHII_MONSTERS
  if not include?(TAGNOTE)
    include TAGNOTE
  end
 
  #--------------------------------------------------------------------------
  # alias listings
  #--------------------------------------------------------------------------
  alias zorochii_make_obj_damage_value make_obj_damage_value
  alias zorochii_make_attack_damage_value make_attack_damage_value
 
  #--------------------------------------------------------------------------
  # * Calculation of Damage Caused by Skills or Items
  #--------------------------------------------------------------------------
  def make_obj_damage_value(user, obj)
    zorochii_make_obj_damage_value(user, obj)
    if self.is_a?(Game_Enemy)
      make_transformation(0,obj.id)
      item_note=$data_enemies[self.enemy_id].note
      if has_tag?(item_note,"divide")
        if obj.element_set.include?(OROCHII_MONSTERS::DIVIDE_ELEMENT)
          divide_monster
        end         
      end     
    end
  end
 
  #--------------------------------------------------------------------------
  # * Calculation of Damage From Normal Attack
  #--------------------------------------------------------------------------
  def make_attack_damage_value(attacker)
    zorochii_make_attack_damage_value(attacker)
    if self.is_a?(Game_Enemy)
      make_transformation(1)
      item_note=$data_enemies[self.enemy_id].note
      if has_tag?(item_note,"reverse_divide")
        if has_tag?(item_note,"divide")
          if get_additional_tag(item_note,"divide",2) != nil
            if attacker.element_set.include?(get_additional_tag(item_note,"divide",1))
              divide_monster if self.hp > @hp_damage or has_tag?(item_note,"ultradivide")
            end       
          else
            if attacker.element_set.include?(OROCHII_MONSTERS::DIVIDE_ELEMENT)
              divide_monster if self.hp > @hp_damage or has_tag?(item_note,"ultradivide")
            end       
          end
        end
      else       
        if has_tag?(item_note,"divide")
          if get_additional_tag(item_note,"divide",2) != nil
            if not attacker.element_set.include?(get_additional_tag(item_note,"divide",1))
              divide_monster if self.hp > @hp_damage or has_tag?(item_note,"ultradivide")
            end       
          else
            if not attacker.element_set.include?(OROCHII_MONSTERS::DIVIDE_ELEMENT)
              divide_monster if self.hp > @hp_damage or has_tag?(item_note,"ultradivide")
            end       
          end
        end
      end
    end
  end
  def make_transformation(type,id=0)
    if type == 0
      item_note=$data_skills[id].note
    elsif type == 1
      item_note=$data_enemies[self.enemy_id].note
    end
    enemy = $game_troop.members[self.index]
    if enemy != nil and has_tag?(item_note,"transform")
      enemy.transform(get_tag(item_note,"transform").to_i)
      $game_troop.make_unique_names
    end
  end
  def divide_monster
    if $game_troop.members.size < OROCHII_MONSTERS::MAX_ENEMIES
      hp_perc = 100*self.hp / self.maxhp
      if hp_perc >= OROCHII_MONSTERS::MIN_HP
        enemy = Game_Enemy.new($game_troop.members.size, self.enemy_id)
        item_note=$data_enemies[self.enemy_id].note
        if has_tag_value?(item_note,"divide","hp") and not has_tag?(item_note,"ultradivide")
          enemy.hp=self.hp - @hp_damage
        elsif has_tag_value?(item_note,"divide","hp") and has_tag?(item_note,"ultradivide")
          if self.hp > @hp_damage
            enemy.hp=self.hp - @hp_damage
          else
            enemy.hp=1
          end
        end
        enemy.hidden = self.hidden
        enemy.immortal = self.immortal
        dunit = OROCHII_MONSTERS::DISTANCE_UNITY
        ran_x = OROCHII_MONSTERS::RANDOM_X
        ran_y = OROCHII_MONSTERS::RANDOM_Y
        enemy.screen_x = self.screen_x + (rand(ran_x)*dunit) - (rand(ran_x)*dunit)
        if enemy.screen_x < 0
          enemy.screen_x +=ran_x*dunit
        elsif enemy.screen_x > 544
          enemy.screen_x -=ran_x*dunit
        end
        enemy.screen_y = self.screen_y + (rand(ran_y)*dunit) - (rand(ran_y)*dunit)
        if enemy.screen_y < 0
          enemy.screen_x +=ran_y*dunit
        elsif enemy.screen_y > 416
          enemy.screen_x -=ran_y*dunit
        end
        enemy.screen_z
        $game_troop.members.push(enemy)
        $game_troop.make_unique_names
        $scene.add_battler(enemy)
        $game_troop.update
      end
    end
  end
end
Script.txt

Spoiler:
Queex's TagNotes
Código:
###############
# TagNote    #
######################################################################
# Version 2.0                                                        #
# Author: Queex                                                      #
# Licence: Creative Commons non-commercial attributive              #
######################################################################
# Allows the easy use of tags in the note field for                  #
# objects to store data. Syntax is simple, and the system ignores    #
# any lines in the notes field that don't match the syntax.          #
#                                                                    #
# Version history:                                                  #
# 1.2 Final 1.x version                                              #
# 2.0 Changed to follow Ruby naming conventions                      #
#                                                                    #
# Usage:                                                            #
# get_tag(<notes field>,<tag name>)                                  #
# has_tag?(<notes field>,<tag name>)                                #
# has_tag_value?(<notes field>,<tag name>,<tag value>)              #
# get_additional_tag(<notes field>,<tag name>,<index>                #
# get_additional_tag_by_value(<notes field>,<tag name>,<tag value>  #
#                                                          ,<index> #
#                                                                    #
# Syntax in the note field:                                          #
# <tag_name tag_value>                                              #
# <tag_name>                                                        #
# <tag_name tag_value param1 param2 ...>                            #
######################################################################

module TAGNOTE

###########
# get_tag #
###################################################################
# Gets the stored value of the first occurrence of the named tag  #
# in the notes field.                                            #
# <tag_name tag_value tag_value2>        will return 'tag_value' #
# <tag_name tag_value>                    will return 'tag_value' #
# <tag_name>                              will return true        #
# if no tag with tag_name, returns nil                            #
###################################################################
def get_tag(note_field, tag_name)
  lines=note_field.split("\n")
  for line in lines
    #process line by line
    if line[0,1].eql?("<")
      #this line has a tag
      line2=line.split(/[<> ]/)
      if line2[1].eql?(tag_name)
        if(line2.length==2)
          #there is actually no value
          return true
        else
          return line2[2]
        end
      end
    end
  end
  return nil
end

############
# has_tag? #
##################################################################
# Indicates whether the given note field has a tag of that name. #
# <tag_name tag_value tag_value2> and                            #
# <tag_name tag_value>            and                            #
# <tag_name>                      will both return true          #
# if no tag with tag_name, returns false                        #
##################################################################
def has_tag?(note_field,tag_name)
  lines=note_field.split("\n")
  for line in lines
    if line[0,1].eql?("<")
      line2=line.split(/[<> ]/)
      if line2[1].eql?(tag_name)
        return true
      end
    end
  end
  return false
end

##################
# has_tag_value? #
#################################################################
# Indicates whether the note field has a tag of a given name    #
# with a certain value.                                        #
# <tag_name tag_value>      returns true                      #
# <tag_name wrong_tag_value> returns false                      #
# <tag_name>                returns false                      #
# if no tag with tag_name has the correct value, returns false. #
# tag_value2 is ignored                                        #
#################################################################
def has_tag_value?(note_field,tag_name,tag_value)
  lines=note_field.split("\n")
  for line in lines
    if line[0,1].eql?("<")
      line2=line.split(/[<> ]/)
      if line2[1].eql?(tag_name) and line2[2].eql?(tag_value)
        return true
      end
    end
  end
  return false
end

######################
# get_additional_tag #
######################################################################
# Gets additional parameters for a tag of a given name.              #
# Calling with an index of 1 returns                                #
# the first value after the tag name.                                #
# Returns nil if the index is higher than the last parameter.        #
# Returns false if no match for the tag name is found.              #
######################################################################
def get_additional_tag(note_field,tag_name,index)
  lines=note_field.split("\n")
  for line in lines
    if line[0,1].eql?("<")
      line2=line.split(/[<> ]/)
      if line2[1].eql?(tag_name)
        if(line2.length<index+2)
          #Actually no value to get
          return nil
        else
          return line2[index+1]
        end
      end
    end
  end
  return false
end

###############################
# get_additional_tag_by_value #
######################################################################
# Gets additional parameters for a tag of a given name              #
# with a certain value. Calling with an index of 1 returns          #
# the first value after the tag name.                                #
# Returns nil if the index is higher than the last parameter.        #
# Returns false if no match for the tag name and tag value is found. #
######################################################################
def get_additional_tag_by_value(note_field,tag_name,tag_value,index)
  lines=note_field.split("\n")
  for line in lines
    if line[0,1].eql?("<")
      line2=line.split(/[<> ]/)
      if line2[1].eql?(tag_name) and line2[2].eql?(tag_value)
        if(line2.length<index+2)
          #Actually no value to get
          return nil
        else
          return line2[index+1]
        end
      end
    end
  end
  return false
end

end
tagnotes_queex.txt
Link al post original (RPG Revolution)

INSTRUCCIONES
Pegar antes del main. Incluir antes el tagnotes de Queex (pueden ponerlo ordenado y pegarlo arriba en la parte de módulos).
Detalles en la cabecera del script.

CRÉDITOS
A Queex porque seguro de otra manera hubiera hecho una horrible configuración.

F.A.Q
No por el momento Ópalo Tuerto.

Saludos y suerte,
Orochii Zouveleki

Jon_Maker

avatar
Mmm suena interesante, Es compatible con el ATB tankentai?

orochii

avatar
A excepción de la parte de transformación, si, es compatible. El problema de la transformación es que no cambia el gráfico (ni idea porqué, supuestamente funciona igual que el comando "transformar enemigo", a excepción de que lo que hace es que el enemigo se transforme al ser golpeado).

Espero eso resuelva tus dudas, salut,
Orochii Zouveleki

caleb465

avatar
Eso se puede hacer sin scripts ni engine, simplemente con eventos de batalla

Cuervoso

avatar
Interesante, me gusta la idea, le puede dar un poco más de estrategia a las batallas, muchas gracias lo usaré en mi proyecto, si es que es compatible con los otros scripts que uso, y claro, si logro aprender a usar este.






Cuervoso! No te pases ¬_¬

Contenido patrocinado


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

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