Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

[Review] Dividing and Transforming Monsters

Dividing and Transforming Monsters Version: 1.0
By: Orochii Zouveleki / L'ark Mitsinikos (both myself, but are my usernames on different forums)
- Using Queex Tagnotes' Module -

Introduction

Maybe a Final Fantasy fan that has played the NES/DS FF3 knows about dividing monsters. So that's it. If you don't know what is it, well, is self-explanatory :P. When the monster is attacked, it will divide. If the weapon has a determined element, that monster not divides. (And later on) If an spell has *element* on it, the monster will divide.
Everything using tags... as I prefer to edit in the database rather than scripting, at least is more comfortable for me :3.
The side-effect (feature number Two!!) is transforming, it WILL work similar to dividing, if *element* is/isn't on the weapon's element pool, blablablah. But for now, it just works as spell (mimicking the RM2k3 style) or as monster property (doing it more reliable I think).

Features

  • Inclusion of tag-based monster properties: dividing and transforming.
  • Transforming includes spell/property functionalities.
  • Dividing includes "Don't restore HP" (copies actual HP value from original) and "Element ID" properties.
  • The "Reverse Divide", meaning that instead of the element nullifying division, it will cause it on the monster.
  • "Ultradivide" property, it simply does that the monster, even if collapsing, will divide itself before. NOT compatible with "Don't restore HP", since it would make 0HP monsters (simple to repair, but maybe later, as the non-compatibility with reverse-divide haves my attention by now, and now I said it :P).

Screenshots

Since an screenshot has no purpose for this (one slime => two slimes ¬¬), I'm refraining from putting this "section". Hope'ing it doesn't make angry someone...

Demo

English releases
DEMO and script txt
DEMO only


Spanish Releases - Huh... well, as this exists, i will leave it here.
DEMO and script txt
DEMO only


AN IMPORTANT NOTE: DEMO and demo with txts include the Queex Tagnotes module script, so if you don't have it, well you can get it there. BUT remember to make a little effort to look some original post of it, if you can, as a token of appreciation for his work ;).

Script

Code:
#==============================================================

#FF3-styled Enemies' Division and Transformation

#Orochii Zouveleki, as the scripter

#

#Special thanks to Queex's Tagnotes, and TywinLannister because his 

#BOF_EnemySkills were my... well they made me wonder about this and that

#and stuff. No more commentaries haha... anyway.

#

#Part of Orochii's own testing, dont sell or rent it,

#idea inspired (or copied?) from FF3's dividing monsters,

#from NES (or DS, but it doesn't have the oldie magic :3).

#==============================================================

#¿WTHIT? (WTH's this)

#==============================================================

#Simply consists on including a tag on database notes that makes the monster duplicate itself

#when attacked or when some spells are used on it. Or vice-versa, it will not duplicate if

#not attacked with specific weapons or when used determined spells.

 

#*When the monster divides, it will *create* a duplicate of itself, same stats, same HP 

#(if hp property isn't present, it will instead use maxHP). 

#Later on, the divided monsters will have possibility to use percentages of stats (HP included)

#but for now, it is at is it.

#And also will be the summoning, so don't worry, that's in my mind :3.

#

#Out of spamming, you can play (if comprehension==null) some hours FF3 and fight against Hazazel/Chronos

#monsters, as they are the hated and goddamned dividing monsters! (and a host of others). And I HATE Them.

 

#The other functionality is transforming, later I will add the element stuff.

#==============================================================

#USING METHOD

#==============================================================

#The script works by tag inclusions in the database note fields (spell and monster).

#Mainly, the tags are: <divide>, <reverse_divide>, <ultradivide> and <transform>, that 

#will be explained shortly.

#Also there's a little default configuration (search "module OROCHII_MONSTERS", without quotes).

#The config fields are a little self explanatory, if not, there's a little description above them.

 

#===========                       DIVIDIN' MONSTERS                       ===========#

#--<divide>

#When used in the notefield, the monster will be divided. The "extra properties" are explained below.

 

#-<divide hp>

#When <divide hp>, the monster will copy the original monster's HP (not monster's original HP ;P).

 

#-<divide hp ID>

#As the tagnotes module has some... limitations (less complicated for me, not THAT complicated for you), 

#you must include hp tag (if hp tag isn't "hp", it will "ignore it" ;D, sou dun wuh-rie).

#The id "property" specifies the element ID that will use for exception (dividing nullificator).

 

#-<reverse_divide>

#When used (along with <divide> tag), it will cause a reverse-functionality on the divide property. Instead of

#ID being exception for dividing, it will be the exception for not dividing (hope it doesn't sound weird).

 

#<ultradivide>

#Used along with <divide> tag. Not compatible with <reverse_divide> (nor "hp" property) by now (some "if" nonsense, that's the error 

¬¬, I will fix it later :P, as code itself is... uhh).

#Ultradivide removes the death restriction, as the monsters normally will not divide when dying.

 

#===========                 TRANSFORMIN' MONSTERS                 ===========#

#-<transform ID>

#When included in the enemy's notefield, the monster will divide when attacked.

#When included instead in skill's notefield, it will act as transforming spell. It doesn't

#works with heroes/allies, as it's not implemented by now (MAYBE later), and also the

#hero can transform enemies, but by now there's no restriction (later it will be by element 

or state).

 

#Transformation works in maker itself (without this script), but I wanted to add some

#little and easy-to-use functionalities. Hope that doesn't make things boring... hahaha.

 

#==============================================================

#Install Notes - The real part is here >:D - Joking... of course:

#==============================================================

#   Nº1-Put script above Main (see non-printed-nor-released documentation, figure 1),

#   -BUT remember to include the Queex's Tagnotes above this script.

#   -That's it, now use tags on notefields and stuff and you're ready to be rumble'd! 

#(not really, at least if your game is well-balanced in terms of monsterVSheroes stats ;D).

 

#==============================================================

#----------------------------------------------------------------------------------------------------------------------------

#Espero que les agrade ;D. (Hope you don't dislike it, I'm more pesimistic today xD).

#

#                                                       C'EST FINIS!

#==============================================================

module OROCHII_MONSTERS

  #Element used as exception for dividing (used as default value).

  DIVIDE_ELEMENT = 2

  #Minimum HP percentage for monster to divide.

  MIN_HP = 10

  #Maximum of enemies (Use 8 if you haven't done something with the battlestatus window :P, 

  #I will not make anything with this as compatibility is my name). LATER will be the MAX_ACTIVE_ENEMIES, 

  #self explanatory right?

  MAX_ENEMIES = 24 #<-You can use any number, but...

  #Distance unity, for randomized position calculation.

  DISTANCE_UNITY = 16

  #Maximum random X value. Remember: It will be multiplied by DISTANCE_UNITY!

  RANDOM_X = 20

  #Maximum random Y value. Remember: It will be multiplied by 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

Instructions

Nº1-Put script above Main (see non-printed-nor-released documentation, figure 1),
-BUT remember to include the Queex's Tagnotes above this script.
-That's it, now use tags on notefields and stuff and you're ready to be rumble'd!
(not really, at least if your game is well-balanced in terms of monsterVSheroes stats ;D).

FAQ

If there are suggestions, post them :3. If answers are what you're searching, post your question and I will gladly :') respond them ;D.

Compatibility

Not fully compatible (sadly) with Tanketai (transformations doesn't work on it, as the enemy graphic doesn't changes). I will try try try! to fix it, as compatibility blablablah.
If not compatible with other battle system, I will commit suicide let me know it please ;).

Credits and Thanks

Thanks/credits/creditcard (that last is not to be there) to Queex for his Tagnotes, as it is the... heh, core of this system. That saved me time investigating how to do it ;), and also made me more optimistic, as is easier to code with some help :3.
Also I give my thanks to TywinLannister, as I (hopefully) said, this script, apart from my lil', comfortable and very appreciated NES FF3, was inspired by seeing his BOF3-mimicking scripts.

Author's Notes

This will be updated, so stay sync ;D... well you can get some sleep and eat, but not more than that!
And... uhhh, well, that's all.
AN IMPORTANT NOTE: DEMO and demo with txts include the Queex Tagnotes module script, so if you don't have it, well you can get it there. BUT remember to make a little effort to look some original post of it, if you can, as a token of appreciation for his work ;).
Other important note: If you see that english is not well used, excuse me, my native is spanish (I'm not Spanish, I talk it). Also, if something has stupidly sadly not been translated, sorry, I forgot. If you point me, I will translate it if it makes you happier xD (talking about MY script, don't send me spanish text for your homework xDDD, also a joke ;D).

Terms and Conditions

This script is meant to be used below Creative Commons Attribution-ShareAlike 3.0 Unported License

But anyhow, you can still use it without putting me on a great pedestal and making some sacrifices (TRANSLATION: make a little credit scene with my name and host of others), as you say me a little thanks I will be pleased :). Even if I'm dead xD... anyway.

Hope that you don't dislike it (my personal cliché, don't ask),
Orochii Zouveleki
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top