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.

GTBS v1.5.1.4 - A FFT Styled Battle System (5/19/2010)

Aaust

Member

HyDral1sk":1ftlva3u said:
hi, this may sound retarded and stupid. But help a noob like me out. How do i actually install this script and how do i add it to my current project? i would love to see how this battle system go with my game ;p thanks

Hey HyDral1sk, you can actually find all the useful information about installing this script in the ReadMe.txt file of the project demo folder.
 

gannon

Member

Nope, he had my vote.
Anyway, Gubid could you script an extra status bar for KGC Overdrive if it is being used ? If not, that's fine but it would be nice.
Here's an english translation of the script:
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
#_/    â—†              Overdrive System - KGC_OverDrive                  â—† VX â—†
#_/    â—‡                  Last update : 2008/03/13                           Ã¢â€”‡
#_/    â—†                  Translation by Touchfuzzy                          â—†
#_/    â—†             Additional polish by Mr. Anonymous                      â—†
#_/-----------------------------------------------------------------------------
#_/                      ★ 2008/04/09 UPDATE [MRA] ★
#_/   The defend command may now increase the Overdrive guage. Also added an
#_/   option to have sound effects when the guage becomes full.
#_/-----------------------------------------------------------------------------
#_/                      ★ 2008/03/13 UPDATE [KCG] ★
#_/                       Several minor bugs fixed.
#_/-----------------------------------------------------------------------------
#_/  This script allows the designer to create skills that are not usable in
#_/  battle until a character gains enough points from specified actions to use
#_/  them. To set up a skill as an "Overdrive" skill (which doesn't appear until
#_/  the Overdrive Gauge is full), go into the database, click the Skills tab,
#_/  locate the skill you desire, and then enter <overdrive> into the "Notes"
#_/  text box. Also, you may desire some skills to increase the Overdrive Gauge
#_/  more than others.
#_/  To do so, enter <OD_GAIN n%> (where n = a number) into the desired skill's
#_/  "Notes" box. Example: <OD_GAIN 200%> would increase Overdrive Points
#_/  gained from Attack Gain Rate (80 by default) by 200 percent (x2).
#_/  The formula for this is [attackgainrate * n / 100]
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_

#===============================================================================
#                          ★ Customization ★
#===============================================================================

module KGC
module OverDrive

  #                      â—† Maximum Gauge Points â—†
  #  This affects the amount of OP (Overdrive Points) required to fill the
  #   Overdrive Gauge. Default: GAUGE_MAX = 1000
  GAUGE_MAX = 1000

  #                      â—† Default OP Gain Rates â—†
  #  You may specify the amount of OP battlers will be rewarded for specific
  #   actions performed. 
  GAIN_RATE = [
     80,  # 0  Gained per attack.
    500,  # 1  Gained for taking damage.
          #    This is per 100% MHP of damage taken, so with 500 you would have
          #    to take 2 times your MHP to fill a 1000 GAUGE_MAX
    200,  # 2  Gained for defeating an enemy.
    100,  # 3  Gained each time you run away from a fight.
    160,  # 4  Gained for each round spent while fighting solo in battle, either
          #    being the only character or being the last one alive.
     40,  # 5  Gained for taking any action in a round
    160,  # 6  Gained for each round surviving with 25% or less HP remaining.
    180,  # 7  Gained for each round for guarding.
  ]
 
  #                 Ã¢â€”† Default Actor OD Increase Options â—†
  #  Default Overdrive types that affect player-characters. The numbers in the
  #   brackets [] are chosen from the GAIN_RATE above, to the right of the #.
  #  It appears these numbers "stack" when setting up an individual character's
  #   Overdrive parameters.
  DEFAULT_ACTOR_DRIVE_TYPE = [0, 1, 6, 7]
 
  #                 Ã¢â€”† Default Enemy OD Increase Options â—†
  #  Default Overdrive types that affect enemies. The numbers in the brackets []
  #    are chosen from the GAIN_RATE above, to the right of the #.
  DEFAULT_ENEMY_DRIVE_TYPE = [0, 1, 4, 5, 6]

  #                       Ã¢â€”† OD Gauge Colors â—†
  #  Allows you to change the color of the overdrive gauges.
  #  The color can also be determined by a numerical expression.
  #  Example: GAUGE_NORMAL_START_COLOR = Color.new(255, 0, 0)  <- This is red.
  #  If you've worked with HTML or image editing software, this should be
  #   fairly familiar.
  GAUGE_NORMAL_START_COLOR = 14
  GAUGE_NORMAL_END_COLOR   = 6
  GAUGE_MAX_START_COLOR    = 10
  GAUGE_MAX_END_COLOR      = 2

  #                    â—† Empty OD Gauge Upon Death â—†
  #  This toggle affects wether the OP Gauge is reset to zero once an actor
  #   dies. true = Reset to 0. false = Gauge remains persistant.
  EMPTY_ON_DEAD = true
 
  #                       Ã¢â€”† Hide Actor OD Gauge â—†
  #  Hide the gauge for individual characters. The number of the character in
  #   the Actors Database is inserted in the brackets.
  #  Example: HIDE_GAUGE_ACTOR = [2] would always hide the gauge for the second
  #   actor in the database. (Simple stuff.)
  HIDE_GAUGE_ACTOR = []

  #                       Ã¢â€”† Hide OD Gauge in Menu â—†
  #  This toggle allows you to hide the Overdrive gauge from the command menu.
  #   true = Gauge is hidden.
  #   false = Gauge remains persistant even in menu.
  HIDE_GAUGE_NOT_IN_BATTLE = false

  #                â—† Hide OD Gauge When Actor Lacks OD Skills â—†
  #  This toggle allows you to hide the gauge if a character has no Overdrive
  #   skills in his/her arsenal.
  #  true = Gauge is hidden.
  #  false = Gauge is not hidden.
  HIDE_GAUGE_NO_OD_SKILLS  = true

  #             Ã¢â€”† Prevent Actors Without OD Skills From Gaining OP â—†
  # This toggle stops OP from being gained for characters that have no Overdrive
  # skills when HIDE_GAUGE_NO_OD_SKILLS  = true.
  NOT_GAIN_GAUGE_HIDING    = true
 
  #                â—† Hide OD Skills When Actor Lacks Max OP â—†
  #  This toggle allows you to specify wether skills that do not yet meet the
  #   required OP are visible.
  #  true = Skills are hidden
  #  false = skills are not hidden.
  HIDE_SKILL_LACK_OF_GAUGE = false

  #                â—† Play sound on OD Max â—† 
  #  Play sound on gauge max.(Filename, Pitch, Volume)
  ODMAX_SOUND = RPG::SE.new("Flash2",     100,    150)
end
end

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

$imported = {} if $imported == nil
$imported["OverDrive"] = true

module KGC::OverDrive
  module Type
    ATTACK  = 0
    DAMAGE  = 1
    VICTORY = 2
    ESCAPE  = 3
    ALONE   = 4
    ACTION  = 5
    FATAL   = 6
    GUARD   = 7
  end

  module Regexp
    module Skill
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
#  Unless you know what you're doing, it's best not to alter anything beyond  #
#  this point, as this only affects the tags used for "Notes" in database.    #
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #

#  Whatever word(s) are after the separator ( | ) in the following lines are
#   what are used to determine what is searched for in the "Notes" section of a
#   skill to see if it is an Overdrive skill.
#  Default Overdrive tag is <overdrive>
#  Default OD_GAIN_RATE is <OD_GAIN>

      OVER_DRIVE = /<(?:OVER_DRIVE|overdrive)[ ]*(\d+)?>/i
      OD_GAIN_RATE = /<(?:OD_GAIN_RATE|odgain)[ ]*(\d+)[%ï¼…]?>/i
    end
  end
end

# In events if you wish to use scripting to increase the OD Gauge for a
#   character you just use this line "gain_actor_od_gauge(ID, IG)"
#   ID = Actor ID Number,
#   IG = number of points to increase gauge
#   Inserting -1 in ID makes it affect all characters.

# In events if you wish to use scripting to increase the OD Gauge for an
#   enemy you just use this line "gain_enemy_od_gauge(ID, IG)"
#   ID = Enemy ID Number in group 0-7
#   IG = number of points to increase gauge
#   Inserting -1 in ID makes it affect all enemies.

# In events if you wish to use scripting to change what increases the OD gauge
#   for a character use this line "set_actor_drive_type(ID, [ODT])"
#   ID = Actor ID Number
#   ODT = numbers of types of Overdrive adders to use
#   If the [ODT] is omitted it goes back to the defaults

# In events if you wish to use scripting to change what increases the OD gauge
#   for an us this line "set_enemy_drive_type(ID, [ODT])"
#   ID = Enemy ID Number in group 0-7
#   ODT = numbers of types of Overdrive adders to use
#   If the [ODT] is omitted it goes back to the defaults

#==============================================================================
# â–¡ KGC::Commands
#==============================================================================

module KGC::Commands
  module_function
  #--------------------------------------------------------------------------
  # â—‹ Actor Overdrive Gain Gauge
  #     actor_id : Actor ID (-1 : Entire Party)
  #     value    : Increase Amount (Subtraction works as well)
  #--------------------------------------------------------------------------
  def gain_actor_od_gauge(actor_id, value)
    if actor_id == -1
      # A all living members gauge is operated.
      $game_party.existing_members.each { |actor|
        actor.overdrive += value
      }
    else
      actor = $game_actors[actor_id]
      actor.overdrive += value if actor != nil && actor.exist?
    end
  end
  #--------------------------------------------------------------------------
  # â—‹ Enemy Overdrive Gain Gauge
  #     enemy_index : Enemy index (-1 : All Enemies)
  #     value    : Increase Amount (Subtraction works as well)
  #--------------------------------------------------------------------------
  def gain_enemy_od_gauge(enemy_index, value)
    if enemy_index == -1
      # A all living enemies gauge is operated.
      $game_troop.existing_members.each { |enemy|
        enemy.overdrive += value
      }
    else
      enemy = $game_troop.members[enemy_index]
      enemy.overdrive += value if enemy != nil && enemy.exist?
    end
  end
  #--------------------------------------------------------------------------
  # â—‹ Set Actor Drive Type
  #     actor_id : Actor ID (-1 : Entire Party)
  #     types    : Array of drive type ( When omitted: Initialization. )
  #--------------------------------------------------------------------------
  def set_actor_drive_type(actor_id, types = nil)
    if actor_id == -1
      # A drive type all members is changed.
      $game_party.members.each { |actor|
        actor.drive_type = types
      }
    else
      actor = $game_actors[actor_id]
      actor.drive_type = types if actor != nil
    end
  end
  #--------------------------------------------------------------------------
  # â—‹ Set Enemy Drive Type
  #     actor_id : Enemy ID (-1 : All Enemies)
  #     types    : Array of drive type ( When omitted: Initialization. )
  #--------------------------------------------------------------------------
  def set_enemy_drive_type(enemy_index, types = nil)
    if enemy_index == -1
      # A drive type all enemies is changed.
      $game_troop.members.each { |enemy|
        enemy.drive_type = types
      }
    else
      enemy = $game_troop.members[enemy_index]
      enemy.drive_type = types if enemy != nil
    end
  end
end

#==============================================================================
# â–  RPG::Skill
#==============================================================================

class RPG::Skill < RPG::UsableItem
  #--------------------------------------------------------------------------
  # â—‹ Overdrive cache generation
  #--------------------------------------------------------------------------
  def create_overdrive_cache
    @__is_overdrive = false
    @__od_cost = KGC::OverDrive::GAUGE_MAX
    @__od_gain_rate = 100

    self.note.split(/[\r\n]+/).each { |line|
      case line
      when KGC::OverDrive::Regexp::Skill::OVER_DRIVE
        # Overdrive
        @__is_overdrive = true
        @__od_cost = $1.to_i if $1 != nil
      when KGC::OverDrive::Regexp::Skill::OD_GAIN_RATE
        # Gauge increase rate
        @__od_gain_rate = $1.to_i
      end
    }
    # Unless OverDrive doesn't consume gauge
    unless @__is_overdrive
      @__od_cost = 0
    end
  end
  #--------------------------------------------------------------------------
  # â—‹ OverDrive is a skill?
  #--------------------------------------------------------------------------
  def overdrive?
    create_overdrive_cache if @__is_overdrive == nil
    return @__is_overdrive
  end
  #--------------------------------------------------------------------------
  # â—‹ Consumption of drive gauge
  #--------------------------------------------------------------------------
  def od_cost
    create_overdrive_cache if @__od_cost == nil
    return @__od_cost
  end
  #--------------------------------------------------------------------------
  # â—‹ The drive gauge increase rate
  #--------------------------------------------------------------------------
  def od_gain_rate
    create_overdrive_cache if @__od_gain_rate == nil
    return @__od_gain_rate
  end
end

#==============================================================================
# â–  Game_Battler
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # â—
 
Aaust,
Thats a pretty good looking isometric map.  On the left side of the map... I noticed that you wrote 10 above the pieces when they should infact be 6.  Judging from the look of the map, I wonder if your squares are really the correct size.  The reason I say this is because, the placement in an isometric map is actually kinda hard to get.. 'just right'.  I have personally found that drawing the map in paint manually then skinning it later is the only way to ensure its the exact right size.  Here is a picture included in the isometric demo to portray exactly what I mean.
LINK
And a good check to run on this to ensure you are "on the right tile" is to stay on the 2 section below it and see if you are still accurately placed when you are below the cliff.  It should be a distance just of 4, but if you are not centered on the lower tile, the likely problem is that your cliff, is not big enough.  Use that iso map template in the above link to ensure you are lined up correctly on the map and that you drew it correctly.  You might also try to draw the map in something else first.. like that default iso template in the demo.. then after drawing it and testing it to ensure its correct, re-skin it. I did that for a couple of my maps.

The animation system is based on the default update pattern method.. which simply increases the pattern after x number of runs throughs based on current stance of still or walking or speed.  Its the @anime_count inside Game_Character.. I copied the default system over to the battle system and adjust it slightly.  It would be fairly easy to update the system to follow a patter index.  So when the pattern is increased then @pattern = patern[index], where pattern is your noted array... [ 1 2 3 2 1 4 5 4 ].  Then you can remain with the 5 frames, and yet still receive your "correct" animation.  This for most people however is very complex and will likely confuse many users.  I would however be willing to show you how to implement that if you would like, it really wouldnt be that difficult.

Thanks guys for the nomination and deliverance of a prized award.  I placed it in my signature.

btw.. I have since checked out shinning force, but before really getting into this, I hadnt heard of it. I used to be really heavy in gaming, but then I got a job and didnt have much time to devote to games.  I have since faught that curve and put in some time, but I just dont spend that much time playing them anymore it seems.

DB, sorry.  I was out of town most of this week, or enjoyed BoF3 and didnt really want to be bothered with programming.  I will be taking a look at it tomorrow when I have some down time at work.

odinel, you can create an update to the damage method of RPG::Sprite to produce the sound if the "value" is text and includes those words. 
something like this..
Code:
class RPG::Sprite
  alias add_sound_to_damage damage
  def damage(value, critical)
    if critical == true
      Audio.play_se("Audio/SE/CRITICAL")
    else
      if !value.is_a?(Numeric)
        if value.include?("Miss") or value.include?("miss")
          Audio.play_se("Audio/SE/Miss")
        end
      end
    end
    add_sound_to_damage(value, critical)
  end
end
Keep in mind that I didnt test that and the syntax may be slightly off, but should be pretty close.  Give it a shot and see what you get. 

I will see what I can do gannon.
 
Hey Gubid congratulations for having the best script orgy award of the year!!!. Cant wait to see the next update of your work. :D
 
I just want to start off by saying that this script is absolutely badass. There is nothing better.

Now, onto the bad stuff..

For my game, I'm starting off with low of all stats, (agility, HP, etc) and it seems that the smaller the numbers I put into the database, the longer it takes between each actor/enemy turn. At one point it took almost 30 seconds before it went to the next person's turn. My stat starting points are, except for HP, all in the single digits for all enemies and actors. When I put all the stats back to their default numbers, or even just put anything above 9, the wait time between actor/enemy turns is almost non-existent.

Do you think this is something you could fix by changing a couple lines of the script, or does it require more than that?
 
Thanks Muffin!

psiclone... If you are using this in active time mode, then I could see a potential problem.  The system takes the actors agi and adds that to a variable.. once that has reached 1000, then that actor is placed in an array to be "processed" for their action in the order in which they hit that 1000.  I currently dont have a method to "truncate" all actors atb by x amount because each actor can have different speeds, and I just didnt want to mess around with it.  I am sure I could create a method to check each actor's agi and then determine who has the lowest atb, and advance it that amount based on others.  The only problem that comes in here is also wait skills.  I will see what I can do in the next release.
 
Just wanna second psiclone's request. I didn't have this problem before, but I recently decided to change everything to smaller values to make things more manageable. I hadn't tested until I saw psiclone's reply, and yeah, it is a pretty long wait. Eagerly anticipating next release!
 
Other scripts installed in Project CARAMELLDANSEN I've added, plus their problems stated:

> Arev's Particle Engine: It doesn't take effect in battle, thus returning you a "close the game" error (with matching NoMethodOccured error code)

> Leon's Unarmed Actors: Well it worked in v1.3 but without Guillaume777's multi-slot & multi-attack script, but in v1.4, it didn't work maybe due to the implementation of the Projectile add-on and/or on Guillaume777's script again(!?)

> Gando's Passive Skills: In battle, if one accidentally pressed the ENTER key on a skill which is declared as a passive skill, the attack command may respond but when you'll attack the enemy, it won't execute an attack! Outside battle, it's just fine though.

> Guillaume777's Multi-Slot and Multi-Attack: The multi-slot feature works, but still the multi-attack isn't executed. I have one weapon set to attack three times but it didn't attack thrice.
 
Gubid":137jn300 said:
Thanks Muffin!

psiclone... If you are using this in active time mode, then I could see a potential problem.  The system takes the actors agi and adds that to a variable.. once that has reached 1000, then that actor is placed in an array to be "processed" for their action in the order in which they hit that 1000.  I currently dont have a method to "truncate" all actors atb by x amount because each actor can have different speeds, and I just didnt want to mess around with it.  I am sure I could create a method to check each actor's agi and then determine who has the lowest atb, and advance it that amount based on others.  The only problem that comes in here is also wait skills.  I will see what I can do in the next release.

Thanks for the quick reply!

In light of this fact, yeah, what you said was the problem. I went into Scene_Battle_TBS and did a find for '1000', looked at what you named the variable, and then did a find for 'atb' in that same Scene, found the part that said "if battler.atb > 999 and @wait == false and !battler.dead?", and changed that to 99. That worked just fine.

If you need to know the script lines for that, tofurkey:
Code:
        if battler.atb > 99 and @wait == false and !battler.dead?
          if battler.sleeping? or battler.paralyzed?
            battler.atb -= battler.agi
            next
Lines 1446-1449 in Scene_Battle_TBS, and I'm pretty sure mine is unedited, so those lines should be yours as well.

EDIT: It seems that changing the 1000 to 500 works fine and in fact, works in the manner that I prefer, and even if someone has over 500 agility, it still works just fine. The enemy got to go a loooooot of times that test run...

EDIT2: I take back those nice things I said :( Seems it only works fine if everyone has 1 agility or 499, but once someone has 2, it seems to get the hang up again.
 
Guess who has his own computer now?

Just kidding!

I'm back! My computer has been on maintenance, i was making it run faster and kind of ran out of money to buy all the stuff i needed, but im good now. (Lovin' my new 22" Display) Anyway, Congrads for the award GubiD. I still think yours is the best and easiest to adjust.
 
Ok.. psiclone and tofurky, here is the code to make the tbs do what you want.  It will now run a loop of x updates if there is no other battler that will act within 2 loops, whether skill or main action.  To import this you need to make 1 change elsewhere in the code, but its only 1 line so it shouldnt be difficult.
In -Game_Battler-, you need to add a new attr_reader for skillcasting.. the would be
Code:
 attr_reader   :skillcasting
After doing that open Scene_Battle_TBS and find "def update_battlers" and replace it with this new version..
Code:
  #----------------------------------------------------------------------------
  # Updates Battler Information (ATB and current status)
  #----------------------------------------------------------------------------
  def update_battlers
    for battler in $game_system.tactics_dead
      if battler.skill_cast != nil
        battler.skill_cast = nil
        battler.up_cast(true) 
      end
      battler.update
    end
    up_amt = 1000
    for battler in $game_system.tactics_enemies + $game_system.tactics_actors + $game_system.tactics_neutral
      at = 1000 - battler.atb
      at /= battler.agi
      if battler.casting?
        if at > battler.skillcasting/battler.int
          at = battler.skillcasting/battler.int
        end
      end
      if at < up_amt
        up_amt = at
      end
      if battler.casting? and !battler.muted?
        if !battler.state?(GTBS::CASTING_ID)
          battler.add_state(GTBS::CASTING_ID, true) unless battler.state?(GTBS::CASTING_ID)
        end
      else
        if battler.state?(GTBS::CASTING_ID)
          battler.remove_state(GTBS::CASTING_ID, true) unless !battler.state?(GTBS::CASTING_ID)
        end
      end
    end
    need_update = false
    active = [nil,0]
    for battler in $game_system.tactics_enemies + $game_system.tactics_actors + $game_system.tactics_neutral
      unless $game_system.cust_battle == "TEAM" and !@active_battler == nil
        if battler.muted? or battler.paralyzed? or battler.sleeping? or battler.knocked_out?
          battler.skill_cast = nil
          battler.up_cast(true) 
          next
        end        
        
        if battler.atb > 999 and @wait == false and !battler.dead?
          if battler.sleeping? or battler.paralyzed?
            battler.atb -= battler.agi
            next
          else
            if battler.atb > active[1]
              active = [battler, battler.atb]
            elsif battler.atb == active[1]
              if battler.agi > active[0].agi
                active = [battler, battler.atb]
              end
            end
          end
        end
        if battler.cast != nil and !battler.casting?
          skill_cast = battler.cast
          @spell = skill_cast[0]
          pos = skill_cast[1]
          target = skill_cast[2]
          if target != nil
            pos = [target.x, target.y]
          end
          @cursor.x = pos[0]; @cursor.y = pos[1]
          update_cursor
          update_screen
          @use_spell.push([battler,skill_cast])
          @spell = nil
          battler.skill_cast = nil
        end
      end
    end
    if @use_spell.size == 0 and !@using_skill
      if active[0] != nil
        @wait = true
        @tbs_phase = 1
        active[0].reset_atb
        set_active_battler(active[0]) 
      else
        need_update = true if @active_battler == nil
      end
    else
      return
    end
    for battler in $game_system.tactics_enemies + $game_system.tactics_actors + $game_system.tactics_neutral
      if battler.dead?
        if $game_system.tactics_actors.include?(battler)
          $game_system.tactics_actors.delete(battler)
        elsif $game_system.tactics_enemies.include?(battler)
          $game_system.tactics_enemies.delete(battler)
        elsif $game_system.tactics_neutral.include?(battler)
          $game_system.tactics_neutral.delete(battler)
        end
        
        if battler.is_a?(Game_Actor)
          ##Execute Death Common Event
          if @death_actor[battler.id] != nil
            @common_event_q += @common_events[@death_actor[battler.id]].list
          end
          
          if GTBS::REMOVE_DEAD
            @dead_actors.push(battler)
          else
            if !GTBS::SUMMON_CLASS.include?(battler.class_id)
              $game_system.tactics_dead.push(battler)
            else
              for bat in @spriteset.battler_sprites
                if bat.bat == battler
                  bat.dispose
                  @spriteset.battler_sprites.delete(bat)
                  break
                end
              end
            end
          end
        else #enemies
          ##Execute Death Common Event
          if @death_enemy[battler.id] != nil
            @common_event_q += @common_events[@death_enemy[battler.id]].list
          end
          if GTBS::REMOVE_DEAD
            @dead_enemies.push(battler)
          else
            if !GTBS::SUMMON_ENID.include?(battler.id)
              $game_system.tactics_dead.push(battler)
            else
              for bat in @spriteset.battler_sprites
                if bat.bat == battler
                  @spriteset.battler_sprites.delete(bat)
                  break
                end
              end
            end
          end
        end
      end
      if need_update == true and !@message_window.visible
        if up_amt > 4
          for i in 1..(up_amt-2)
            battler.atb_update unless battler.dead? or battler.paralyzed? or battler.sleeping? or battler.knocked_out?
            if battler.casting? and !battler.muted?
              battler.up_cast
            end
          end
        else
          battler.atb_update unless battler.dead? or battler.paralyzed? or battler.sleeping? or battler.knocked_out?
          if battler.casting? and !battler.muted?
            battler.up_cast
          end
        end
      end
    end
  end

I forgot to mention.  If you are using VX, this code will work as well, although you might want to find what is different and only insert the little extra's that Ii did rather than straight copy, because of the new syntax stuff.

PhoenixFlame, the animations for Frog are 6 frames and 11 poses, the order of the poses within the template should be noted in the tutorials section of the script (script editor, below help). 

Welcome back digi! 

DB, I have a couple of those now working.  I will release an update once things have been updated.
 
1) Right.. I forgot to mention that I'm using VX, but I got it to work just fine.

2) Wow.. thanks so much. You didn't have to do this so quickly.. not that it's a bad thing :) That works like a perfect. A perfect.

One last quick, random question.. How is the skill wait time determined? In your example, heal waits for "33".. Does it wait for the character to get the AT time before it casts? Or is it something else? Clarification would be appreciated.

Again, thanks for responding so quickly!
 
skill wait times use something very close to the atb method, but they use the battlers int each "round" instead of agi.  So when the skillwait is 33, and your int is 3, then it will take 11 'rounds' for you to cast your skill.  Each 'round' is when there is no current active battler and there is no one currently in the middle of performing an action.  So in other words, when its no ones turn.. a round elapses to see if someone else gets to go, if not then another round processed.. etc etc.  What you were encountering before was that it had to perform about 800ish rounds between actors, and that can take a long time.  The method I gave you detected how many rounds would need to elapse before the next actors turn would occur.  I took that number of rounds.. the lowest number of them... and said.. I want you to elapse that many times, because I know nothing is going to occur between, here and there.  By doing that it cuts the "wait" time between turns but allows it to still be speed/int based instead of going to "turns."
Anyway, hope that all made sense.  later!
 
PhoenixFlame, the animations for Frog are 6 frames and 11 poses, the order of the poses within the template should be noted in the tutorials section of the script (script editor, below help).
Well I don't see any tutorials in the script editor (I downloaded the VX demo). Can you post again?

==Edited==
Found it in the XP demo =.="
But after putting an animated battler in the character folder, it still using the old sprite.
My actor name is Phoenix, then put an animated battler named Phoenix-ANIM.png in the Characters folder. But everything remain unchanged.
 
GubiD, you're awesome, the tactics scripts work really nice, but i have a question, its posible to make the version for vx in a kind of rsc (like sdk for xp)? because is a little hard to add others scripts in my head it makes a little of lag  :crazy: anyway i love the sistem, and if you could make it work with mouse... man youll be my hero
 
To get VX to give you a animated battler you must...
1. Assign the Character Graphic to be something including ANIM.
2. Create a Battler of the same name and place that in the battlers folder.  (If the name doesnt include a $, then you should make your animated sprite in the 4x2 layout that vx already follows, by which I mean that it would contain 7 other characters other than your own.)
That should do it!  Let me know if that doesnt make sense.

ChronnoPro, that would be a good idea.  The only problem with that is that if I wanted to have someone enter a small update, they wouldnt be able to do so.  They would have to modify the RSC file instead, which for some people is really hard. I am working on getting it to support mouse, infact you probably saw some of the code for it if you were poking around. Its just not "good enough" yet.
 

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