#1
[RPG Maker VX] Monstruos que se transforman / dividen Mar Abr 05, 2011 7:09 pm
orochii


Insignias : ![[RPG Maker VX] Monstruos que se transforman / dividen L47xbcE](https://i.imgur.com/l47xbcE.png)
![[RPG Maker VX] Monstruos que se transforman / dividen VKx7hLy](https://i.imgur.com/vKx7hLy.png)




87
1075
![[RPG Maker VX] Monstruos que se transforman / dividen L47xbcE](https://i.imgur.com/l47xbcE.png)
![[RPG Maker VX] Monstruos que se transforman / dividen VKx7hLy](https://i.imgur.com/vKx7hLy.png)






Dividing (and Transforming) Monsters!
VERSIÓN: 1.0 | RPG Maker VX/RGSS2.0 (probado en rgss202e.dll
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

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

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
- "Light" Version (-~5kb): El demo por sí solito.
- Extended Version (+~5kb): Incluye además del demo, el script y el tagnotes de Queex en txts aparte.
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
- 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
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

Saludos y suerte,
Orochii Zouveleki