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.

Multiple Timers 3.44 (Updated 03/16/11!)

Multiple Timers Version: 3.44
By: Glitchfinder


Introduction

Glitchfinder's Multiple Timers is a script intended for those who need to juggle several different timers at the same time, but want to avoid the hassle of scripting loops or adding new events to a map or battle. This script has been tested in both events and scripts, and will work in both RPG Maker XP and RPG Maker VX.

Features

  • Control, update, and check multiple timers dynamically!
  • Timers are independent of each other!
  • Individual timers may be updated independently!
  • Timers are automatically removed once completed and checked!
  • Timers can be displayed on screen!
  • Individual timers can be saved with the game!
  • Individual timers can be set to end battle when finished

Screenshots

Since the only visual elements of this script are identical to the default in-game timer, there is no point in showing any screenshots of it.

Script

Code:
#≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

# ** Glitchfinder's Multiple Timers               [RPG Maker XP] [RPG Maker VX]

#    Version 3.44

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

#  This script helps scripters and eventers use multiple hidden in-game timers

#  that can be called and modified at any time. Refer to "Game_Timer" for the

#  instance of this class.

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

# * Version History

#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

#   Version 1.00 ------------------------------------------------- (??????????)

#     - Initial version

#     - Author: Glitchfinder

#   Version 2.00 ------------------------------------------------- (2008-06-11)

#     - Script completely rewritten to work with multiple timers

#     - Author: Glitchfinder

#    Version 2.10 ------------------------------------------------ (2002-06-18)

#      - Added the check_timing() method

#      - Fixed bug with check() method

#      - Author: Glitchfinder

#     Version 2.11 ----------------------------------------------- (2007-06-19)

#       - Reformatted and cleaned script

#       - Author: Glitchfinder

#    Version 2.21 ------------------------------------------------ (2007-06-22)

#      - Added the extended_start() method

#      - Author: Glitchfinder

#    Version 2.31 ------------------------------------------------ (2007-07-20)

#      - Added the update_single() method

#      - Added the kill_timer() method

#      - Added the adjust_time() method

#      - Author: Glitchfinder

#     Version 2.32 ----------------------------------------------- (2007-07-24)

#       - Fixed bug with VX and the start() method

#       - Fixed bug with VX and the extended_start() method

#       - Author: Glitchfinder

#   Version 3.32 ------------------------------------------------- (2009-06-28)

#     - Script completely rewritten to increase efficiency

#     - Modified most methods to include error-checking

#     - Renamed the check() method to finished?()

#     - Removed the modifications of Game_Temp

#     - Added the script to the global variable $game_timer

#     - Added new output to the check_timing() method

#     - Modified the update() method of Scene_Battle

#     - Added the ability for a timer to end battle

#     - Added the end_battle() method

#     - Added the end_battle?() method

#     - Modified the update() method of Sprite_Timer

#     - Added the ability to display a timer using Sprite_Timer

#     - Modified the "Conditional Branch..." event command

#     - Modified the "Control Variables..." event command

#     - Modified the "Control Timer..." event command

#     - Replaced the default timer with $game_timer

#     - Added the display() method

#     - Added the display?() method

#     - Modified the write_save_data() method of Scene_Save

#     - Modified the read_save_data() method of Scene_Load

#     - Added the ability to save a timer when the game is saved

#     - Added the save() method

#     - Added the save?() method

#     - Added the load_save() method

#     - Author: Glitchfinder

#     Version 3.33 ----------------------------------------------- (2009-06-28)

#       - Script optimized further

#       - Unnecessary lines removed

#       - Code efficiency improved

#       - Author: theory

#     Version 3.34 ----------------------------------------------- (2009-06-29)

#       - Script optimized

#       - Unnecessary lines removed

#       - Author: Glitchfinder

#     Version 3.44 ----------------------------------------------- (2011-03-16)

#       - Fixed Crash on F12

#       - Converted $game_timer global into the Game_Timer module.

#       - Author: Glitchfinder

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

# * Instructions

#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

#  Place this script above Main, and below the default scripts. (I realize this

#  is obvious to most, but some people don't get it.)

#

#  To start a timer, use the following call:

#    Game_Timer.start(seconds, key)

#  Where seconds is the number of seconds you want the timer to run, and

#  key is the name of that specific timer. You must use a seperate name for

#  every timer, because when one finishes, only the first script checking for

#  that name will return with the timer completed.

#

#  To check whether or not a timer has finished, use the following call:

#    Game_Timer.finished?(key)

#  Where timer_number is the number of the timer that you need to check. See

#  the rules above regarding key.

#

#  To remove a timer, use the following call:

#    Game_Timer.kill_timer(key)

#  Where key is the timer that you wish to remove.

#

#  To adjuct the time remaining on a timer, use the following call:

#    Game_Timer.adjust_time(setting, value, key)

#  Where value is the number you want to adjust by, key is the timer you want

#  to adjust, and setting in the operation you want to perform. (1 to add

#  frames, 2 to subtract frames, 3 to multiply, 4 to divide, and 5 to perform a

#  modulus operation)

#

#  To stop or start a timer, use the following call:

#    Game_Timer.active(key, bool)

#  Where key is the timer you want to start or stop, and bool is true if you

#  want to start the timer, and false if you want to stop it.

#

#  To have a timer force battles to abort when they reach zero, use the

#  following call:

#    Game_Timer.end_battle(key, bool)

#  Where key is the timer you want to modify, and bool is true if you want it

#  to abort battles while it is 0, and false if you don't.

#

#  To set a timer to display, use the following call:

#    Game_Timer.display(key, bool)

#  Where key is the timer you want to display, and bool is either true or

#  false, depending on the desired result.

#

#  To set a timer to be saved in the save file, use the following call:

#    Game_Timer.save(key, bool)

#  Where key is the timer you want to have saved, and bool is true if you want

#  the timer to be saved, and false if you want it to disappear when the game

#  is closed.

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

# * Method List

#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

#  initialize

#    Sets up the script. Intended for internal use only.

#

#  update

#    Updates all timers. Although intended for internal use, may be added to

#    other scenes to force a timer update elsewhere.

#

#  update_single(key)

#    Updates a single timer, specified by key.

#

#  start(seconds, key)

#    Set up a timer, which will be accessed in the future by using key.

#

#  extended_start(hours, minutes, seconds, key)

#    Set up and extended timer. Functions in the same way as start().

#

#  finished?(key)

#    Returns true if the timer specified by key has reached 0, false otherwise.

#    This method will delete the checked timer if it has reached 0.

#

#  check_timing(key)

#    Debugging method. Returns a variety of messages based on the current state

#    of the timer specified by key.

#

#  kill_timer(key)

#    Erases the timer specified by key.

#

#  adjust_time(setting, value, key)

#    Adjusts the remaining time in the timer specified by key. Setting

#    specifies an operation. (1 => addition, 2 => subtraction,

#    3 => multiplication, 4 = division, 5 = modulus

#

#  active(key, bool)

#    Sets the timer specified by key to active or inactive, based on whether

#    bool is true or false.

#

#  active?(key)

#    Returns true if the timer specified by key is active, and false otherwise.

#

#  end_battle(key, bool)

#    When bool is set to true, this method sets the timer specified by key to

#    abort battles when it reaches 0. Otherwise, the timer will not abort

#    battles when it reaches 0.

#

#  end_battle?

#    Checks to see if a timer that aborts battle has reached 0. Intended for

#    internal use.

#

#  display(key, bool)

#    If bool is set to true, will display the timer specified by key.

#    Otherwise, the timer is not displayed. Please note that only one timer will

#    be displayed at any given time, no matter how many are set to display.

#

#  display?

#    Checks to see if a timer is being displayed, and reuturns remaining time.

#    This method is intended for internal use only.

#

#  save(key, bool)

#    If bool is set to true, the timer specified by key will be saved along

#    with the rest of the game. If bool is false, the timer will be deleted

#    when the game closes, even if a save was made.

#

#  save?

#    Returns an array of all timers set to be saved. This method is intended

#    for internal use only.

#

#  load_save(timers)

#    Loads all timers in the timers variable. This method is intended for

#    internal use, but could be used to create new timers as well.

#

#  conditional_branch(parameters)

#    Part of the interpreter's conditional branch processing. Intended for

#    internal use only.

#

#  control_variables(parameters)

#    Part of the interpreter's control variable processing. Intended for

#    internal use only.

#

#  control_timer(parameters)

#    The interpreter's control timer processing. Intended for internal use

#    only, although it could be used to create an event timer through scripts.

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

# *Glitchfinder's Advice

#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

#  This script is meant for people with at least a basic level of scripting

#  knowledge and ability. If you are unsure of your abilities, or don't know

#  how to script, then it would be a good idea to avoid this script.

#

#  This script has been tested in both scripts and events, and will function in

#  both cases.

#

#  This script will function in both RPG Maker XP and RPG Maker VX.

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

# * Contact

#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

#  Glitchfinder, the author of this script, may be contacted through his

#  website, found at [url=http://www.glitchkey.com]http://www.glitchkey.com[/url]

#

#  You may also find Glitchfinder at [url=http://www.hbgames.org]http://www.hbgames.org[/url]

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

# * Usage

#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

#  This script may be used with the following terms and conditions:

#

#    1. This script is free to use in any noncommercial project. If you wish to

#       use this script in a commercial (paid) project, please contact

#       Glitchfinder at his website.

#    2. This script may only be hosted at the following domains:

#         [url=http://www.glitchkey.com]http://www.glitchkey.com[/url]

#         [url=http://www.hbgames.org]http://www.hbgames.org[/url]

#    3. If you wish to host this script elsewhere, please contact Glitchfinder

#       or theory.

#    4. If you wish to translate this script, please contact Glitchfinder or

#       or theory. They will need the web address that you plan to host the

#       script at, as well as the language this script is being translated to.

#    5. This header must remain intact at all times.

#    6. Glitchfinder and theory remain the sole owners of this code. They may

#       modify or revoke this license at any time, for any reason.

#    7. Any code derived from code within this script is owned by Glitchfinder

#       and theory, and you must have their permission to publish, host, or

#       distribute their code.

#    8. This license applies to all code derived from the code within this

#       script.

#    9. If you use this script within your project, you must include visible

#       credit to Glitchfinder and theory, within reason.

#≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

 

 

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

# ** Sprite_Timer

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

#  This sprite is used to display the timer.It observes the $game_system

#  class and automatically changes sprite conditions.

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

 

class Sprite_Timer < Sprite

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

  # * Frame Update

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

  def update

    super

    # Hide timer sprite and return if there is no currently displayed timer

    self.visible = Game_Timer.display? == false ? false : true

    return if self.visible == false

    # If timer needs to be redrawn

    if Game_Timer.display? / Graphics.frame_rate != @total_sec

      # Calculate total number of seconds and make a string

      @total_sec = Game_Timer.display? / Graphics.frame_rate

      text = sprintf("%02d:%02d", @total_sec / 60, @total_sec % 60)

      # Clear window contents and draw timer

      self.bitmap.clear

      self.bitmap.draw_text(self.bitmap.rect, text, 1)

    end

  end

end

 

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

# * Check for RGSS1

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

if !(defined?(Graphics.brightness))

 

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

# ** Scene_Save

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

#  This class performs save screen processing.

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

 

class Scene_Save < Scene_File

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

  # * Alias Methods

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

  # If the method has not been aliased

  unless method_defined?(:multiple_timers_write_save_data)

    # Alias the method

    alias multiple_timers_write_save_data write_save_data

  end

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

  # * Write Save Data

  #     file : write file object (opened)

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

  def write_save_data(file)

    # Call original method

    multiple_timers_write_save_data(file)

    # Write save data

    Marshal.dump(Game_Timer.save?, file)

  end

end

 

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

# ** Scene_Load

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

#  This class performs load screen processing.

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

 

class Scene_Load < Scene_File

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

  # * Alias Methods

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

  # If the method has not been aliased

  unless method_defined?(:multiple_timers_read_save_data)

    # Alias the method

    alias multiple_timers_read_save_data read_save_data

  end

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

  # * Read Save Data

  #     file : file object for reading (opened)

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

  def read_save_data(file)

    # Call original method

    multiple_timers_read_save_data(file)

    # Load saved data

    Game_Timer.load_save(Marshal.load(file)) unless file.eof?

  end

end

 

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

# ** Interpreter

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

#  This interpreter runs event commands. This class is used within the

#  Game_System class and the Game_Event class.

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

 

class Interpreter

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

  # * Alias Methods

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

  # If the method has not been aliased

  unless method_defined?(:multiple_timers_command_111)

    # Alias the method

    alias multiple_timers_command_111 command_111

  end

  # If the method has not been aliased

  unless method_defined?(:multiple_timers_command_122)

    # Alias the method

    alias multiple_timers_command_122 command_122

  end

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

  # * Conditional Branch

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

  def command_111

    # Initialize local variable: result

    result = false

    # If checking timer

    if @parameters[0] == 3

      # Call modified method

      result = Game_Timer.conditional_branch(@parameters)

      # Skip if branch is false

      return command_skip if result == false

    end

    # Store determinant results in hash

    @branch[@list[@index].indent] = result

    # If determinant results are true

    if @branch[@list[@index].indent] == true

      # Delete branch data

      @branch.delete(@list[@index].indent)

      # Continue

      return true

    end

    # Call aliased method

    multiple_timers_command_111

  end

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

  # * Control Variables

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

  def command_122

    # Initialize value

    value = 0

    # If @parameters[3] is set to other

    if @parameters[3] == 7

      # If @parameters[4] is set to timer

      if @parameters[4] == 5  # timer

        # Call modified method

        Game_Timer.control_variables(@parameters)

        # Continue

        return true

      end

    end

    # Call aliased method

    multiple_timers_command_122

  end

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

  # * Control Timer

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

  def command_124

    # Call modified method

    Game_Timer.control_timer(@parameters)

    # Continue

    return true

  end

end

 

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

# * End Check for RGSS1

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

end

 

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

# * Check for RGSS2

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

if (defined?(Graphics.brightness) == true)

 

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

# ** Scene_File

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

#  This class performs the save and load screen processing.

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

 

class Scene_File < Scene_Base

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

  # * Alias Methods

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

  # If the initialize method has not been aliased

  unless method_defined?(:multiple_timers_write_save_data)

    # Alias the enemy selection method

    alias multiple_timers_write_save_data write_save_data

  end

  # If the initialize method has not been aliased

  unless method_defined?(:multiple_timers_read_save_data)

    # Alias the enemy selection method

    alias multiple_timers_read_save_data read_save_data

  end

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

  # * Write Save Data

  #     file : write file object (opened)

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

  def write_save_data(file)

    # Call original method

    multiple_timers_write_save_data(file)

    # Write save data

    Marshal.dump(Game_Timer.save?, file)

  end

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

  # * Read Save Data

  #     file : file object for reading (opened)

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

  def read_save_data(file)

    # Call original method

    multiple_timers_read_save_data(file)

    # Load saved data

    Game_Timer.load_save(Marshal.load(file)) unless file.eof?

  end

end

 

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

# ** Game_Interpreter

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

#  An interpreter for executing event commands. This class is used within the

# Game_Map, Game_Troop, and Game_Event classes.

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

 

class Game_Interpreter

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

  # * Alias Methods

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

  # If the initialize method has not been aliased

  unless method_defined?(:multiple_timers_command_111)

    # Alias the enemy selection method

    alias multiple_timers_command_111 command_111

  end

  # If the initialize method has not been aliased

  unless method_defined?(:multiple_timers_command_122)

    # Alias the enemy selection method

    alias multiple_timers_command_122 command_122

  end

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

  # * Conditional Branch

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

  def command_111

    # Initialize local variable: result

    result = false

    # If checking timer

    if @params[0] == 3

      # Call modified method

      result = Game_Timer.conditional_branch(@params)

      # Skip if branch is false

      return command_skip if reult == false

    end

    # Store determinant results in hash

    @branch[@indent] = result

    # If determinant results are true

    if @branch[@indent] == true

      # Delete branch data

      @branch.delete(@indent)

      # Continue

      return true

    end

    # Call aliased method

    multiple_timers_command_111

  end

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

  # * Control Variables

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

  def command_122

    # Initialize value

    value = 0

    # If @params[3] is set to other

    if @params[3] == 7

      # If @params[4] is set to timer

      if @params[4] == 5  # timer

        # Call modified method

        Game_Timer.control_variables(@params)

        # Continue

        return true

      end

    end

    # Call aliased method

    multiple_timers_command_122

  end

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

  # * Control Timer

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

  def command_124

    # Call modified method

    Game_Timer.control_timer(@params)

    # Continue

    return true

  end

end

 

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

# * End Check for RGSS2

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

end

 

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

# ** Scene_Map

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

#  This class performs map screen processing.

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

 

class Scene_Map

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

  # * Alias Methods

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

  # If the initialize method has not been aliased

  unless method_defined?(:multiple_timers_update)

    # Alias the enemy selection method

    alias multiple_timers_update update

  end

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

  # * Frame Update

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

  def update

    # Call original method

    multiple_timers_update

    # Update Game_Timer

    Game_Timer.update

  end

end

 

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

# ** Scene_Battle

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

#  This class performs battle screen processing.

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

 

class Scene_Battle

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

  # * Alias Methods

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

  # If the initialize method has not been aliased

  unless method_defined?(:multiple_timers_update)

    # Alias the enemy selection method

    alias multiple_timers_update update

  end

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

  # * Frame Update

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

  def update

    # Update Game_Timer

    Game_Timer.update

    # Abort Battle if an appropriate timer has ended

    $game_temp.battle_abort = true if Game_Timer.end_battle?

    # Call original method

    multiple_timers_update

  end

end

 

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

# ** Game_Timer

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

#  This class performs processing for in-script timers.

# Refer to "$game_temp.game_timer" for the instance of this class.

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

 

module Game_Timer

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

  # * Object Initialization

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

  begin

    # Create timer hash

    Timers = {}

    # Set timer hash defaults

    Timers.default = {

      'time' => 0,

      'active' => false,

      'display' => false,

      'endbattle' => false,

      'finished' => false,

      'save' => false

    }

  end

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

  # * Frame Update

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

  def self.update

    # Iterate through all timers

    Timers.keys.each { |key|

    # Skip if the current timer is inactive, otherwise deduct timer

    Timers[key]['active'] == false ? next : Timers[key]['time'] -= 1

    # Set the timer to finished if the frame count is 0 or less

    Timers[key]['active'] = false and

    Timers[key]['finished'] = true if Timers[key]['time'] <= 0}

  end

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

  # * Frame Update (individual timer)

  #     key : key for specific timer

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

  def self.update_single(key)

    # Return if the current timer is inactive, otherwise deduct timer

    Timers[key]['active'] == false ? return : Timers[key]['time'] -= 1

    # Set the timer to finished if the frame count is 0 or less

    Timers[key]['active'] = false and

    Timers[key]['finished'] = true if Timers[key]['time'] <= 0

  end

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

  # * Start Timer

  #     seconds : time, in seconds

  #     key     : key for specific timer

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

  def self.start(seconds, key)

    # Check the validity of the second value

    unless seconds.is_a?(Integer)

      # Print an error and exit if the second value is invalid

      p "You must set a timer's remaining time to a numeric value"

      exit

    end

    # Setup new timer

    Timers[key] = {

      'time' => seconds * Graphics.frame_rate,

      'active' => true,

      'display' => false,

      'endbattle' => false,

      'finished' => false,

      'save' => false

    }

  end

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

  # * Start Timer (extended)

  #     hours   : added hours (not including minutes or seconds)

  #     minutes : added minutes (not including hours or seconds)

  #     seconds : added seconds (not including hours or minutes)

  #     key     : key for specific timer

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

  def self.extended_start(hours, minutes, seconds, key)

    # Check the validity of the time value

    unless (hours.is_a?(Integer) == true && minutes.is_a?(Integer) == true &&

           seconds.is_a?(Integer) == true)

      # Print an error and exit if the time value is invalid

      p "You must set a timer's remaining time to a numeric value"

      exit

    end

    # Calculate time

    time = ((hours * 3600 * Graphics.frame_rate) +

           (minutes * 60 * Graphics.frame_rate) +

           (seconds * Graphics.frame_rate))

    # Setup new timer

    Timers[key] = {

      'time' => time,

      'active' => true,

      'display' => false,

      'endbattle' => false,

      'finished' => false,

      'save' => false

    }

  end

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

  # * Check Timer

  #     key : key for specific timer

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

  def self.finished?(key)

    # Return false if the timer has not finished

    return false if Timers[key]['finished'] == false

    # Delete timer

    Timers.delete(key)

    return true

  end

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

  # * Check Timer (Debugging)

  #     key : key for specific timer

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

  def self.check_timing(key)

    return unless ($DEBUG == true || $TEST == true)

    # If the Timers hash includes the key

    if Timers.include?(key)

      # If the timer has time remaining

      if Timers[key]['finished'] == false

        # Set up message and print

        s = 'The timer named ' + key.to_s + ' has ' + Timers[key]['time'].to_s

        s += ' frames remaining.'

        p s

      else

        # Print message

        p 'The timer named ' + key.to_s + ' has reached zero.'

      end

      # Print message if timer is inactive

      if Timers[key]['active'] == false

        p 'The timer named ' + key.to_s + ' is currently inactive.'

      end

      # Print message if timer is set to end battle

      if Timers[key]['endbattle'] == true

        p 'The timer named ' + key.to_s + ' is currently set to end battle.'

      end

      # print message if timer is set to be saved in the file

      if Timers[key]['save'] == true

        p 'The timer named ' + key.to_s + ' is currently saved with the game.'

      end

    else

      # Print message if the timer does not exist

      p 'The timer named ' + key.to_s + ' does not exist.'

    end

  end

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

  # * Kill Timer

  #     key : key for specific timer

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

  def self.kill_timer(key)

    # Delete the timer if it exists

    Timers.delete(key) if Timers.include?(key)

  end

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

  # * Adjust Remaining Time

  #     setting : type of operation

  #     value   : value to use in the operation

  #     key     : key for specific timer

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

  def self.adjust_time(setting, value, key)

    # Print an error and exit if the value is invalid

    unless value.is_a?(Integer)

      p "You must modify a timer's remaining time with a numeric value"

      exit

    end

    # Print an error and exit if the setting is invalid

    unless (setting >= 1 && setting <= 5)

      p "You have used an invalid setting when modifying the timer."

      exit

    end

    # Perform the appropriate math function based on setting variable

    case setting     

    when 1 then Timers[key]['time'] += value

    when 2 then Timers[key]['time'] -= value

    when 3 then Timers[key]['time'] *= value

    when 4 then Timers[key]['time'] /= value

    when 5 then Timers[key]['time'] %= value

    end

  end

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

  # * Set Timer's Active Boolean

  #     key  : key for specific timer

  #     bool : true or false, where true ends battle when timer is at 0

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

  def self.active(key, bool)

    # Check bool's validity

    unless (bool == true || bool == false)

      # Print an error and exit if bool is invalid

      p "You must set a timer's active boolean to either true or false."

      exit

    end

    # Set timer boolean if it exists

    Timers[key]['active'] == bool if Timers.include?(key)

  end

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

  # * Timer Active?

  #     key : key for specific timer

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

  def self.active?(key)

    # Return active value for specified timer

    return Timers[key]['active']

  end

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

  # * Set Timer's End Battle Boolean

  #     key  : key for specific timer

  #     bool : true or false, where true ends battle when timer is at 0

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

  def self.end_battle(key, bool)

    # Check bool's validity

    unless (bool == true || bool == false)

      # Print an error and exit if bool is invalid

      p "You must set a timer's end battle boolean to either true or false."

      exit

    end

    # Set timer boolean if it exists

    Timers[key]['endbattle'] == bool if Timers.include?(key)

  end

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

  # * End Battle?

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

  def self.end_battle?

    # Iterate through all timers

    Timers.keys.each {|key| next if Timers[key]['active'] == false

    # Return true if the timer is finished and is set to end battle

    return true if Timers[key]['endbattle'] && Timers[key]['time'] <= 0}

    return false

  end

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

  # * Set Timer's Display Boolean

  #     key  : key for specific timer

  #     bool : true or false, where true means the timer is displayed

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

  def self.display(key, bool)

    # Check bool's validity

    unless (bool == true || bool == false)

      # Print an error and exit if bool is invalid

      p "You must set a timer's display boolean to either true or false."

      exit

    end

    # Set timer boolean if it exists

    Timers[key]['display'] = bool if Timers.include?(key)

  end

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

  # * Display Timer?

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

  def self.display?

    # Iterate through all timers

    Timers.keys.each {|key| next if Timers[key]['active'] == false

    # Return remaining time if the timer is set to display

    return Timers[key]['time'] if Timers[key]['display'] == true}

    return false

  end

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

  # * Set Timer's Save Boolean

  #     key  : key for specific timer

  #     bool : true or false, where true means the timer is displayed

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

  def self.save(key, bool)

    # Check bool's validity

    unless (bool == true || bool == false)

      # Print an error and exit if bool is invalid

      p "You must set a timer's save boolean to either true or false."

      exit

    end

    # Set timer boolean if it exists

    Timers[key]['save'] = bool if Timers.include?(key)

  end

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

  # * Save Timer?

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

  def self.save?

    # Setup save hash

    save = {}

    # Iterate through timers and add the timer to the hash if it is set to save

    Timers.keys.each{|x| save[x] = Timers[x] if Timers[x]['save'] == true}

    return save

  end

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

  # * Load Saved Timer

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

  def self.load_save(timers)

    # Add timers to hash if any have been loaded

    timers.keys.each {|key| Timers[key] = timers[key]} unless timers.empty?

  end

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

  # * Conditional Branch

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

  def self.conditional_branch(parameters)

    # If event timer is active

    if active?('event')

      # Set timer variable to currently displayed timer

      timer = display?

      # Skip command if no timer is currently displayed

      return false if timer == false

      # Calculate remaining timer

      sec = timer / Graphics.frame_rate

      # If checking for a value <= remaining time

      if parameters[2] == 0

        # set result to the truth value of remaining time >= checked time

        result = (sec >= parameters[1])

      else

        # set result to the truth value of remaining time <= checked time

        result = (sec <= parameters[1])

      end

    else

      # Skip command if timer is not active

      return false

    end

  end

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

  # * Control Variables

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

  def self.control_variables(parameters)

    timer = display?

    timer = 0 if timer == false

    value = timer / Graphics.frame_rate

    # Loop for group control

    for i in parameters[0] .. parameters[1]

      # Branch with control

      case parameters[2]

      when 0 then $game_variables[i] = value

      when 1 then $game_variables[i] += value

      when 2 then$game_variables[i] -= value

      when 3 then $game_variables[i] *= value

      when 4  # divide

        if value != 0

          $game_variables[i] /= value

        end

      when 5  # remainder

        if value != 0

          $game_variables[i] %= value

        end

      end

      # Max / Min limit check

      $game_variables[i] = 99999999 if $game_variables[i] > 99999999

      $game_variables[i] = -99999999 if $game_variables[i] < -99999999

    end

    # Refresh map

    $game_map.need_refresh = true

  end

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

  # * Control Timer

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

  def self.control_timer(parameters)

    # If started

    if parameters[0] == 0

      # Start timer

      Game_Timer.start(parameters[1], 'event')

      # Set timer to end battle

      Game_Timer.end_battle('event', true)

      # Display timer

      Game_Timer.display('event', true)

      # Set timer to save with game

      Game_Timer.save('event', true)

    # If stopped

    else

      # Hide timer

      Game_Timer.active('event', false)

    end

  end

end

Instructions

Place this script above Main, and below the default scripts. (I realize this is obvious to most, but some people don't get it.)

To start a timer, call Game_Timer.start(seconds, key) where seconds is the number of seconds you want the timer to run, and key is the name of that specific timer. You must use a separate name for every timer, because when one finishes, only the first script checking for that name will return with the timer completed.

To check whether or not a timer has finished, call Game_Timer.finished?(key) where timer_number is the number of the timer that you need to check. See the rules above regarding key.

To remove a timer, call Game_Timer.kill_timer(key) where key is the timer that you wish to remove.

To adjust the time remaining on a timer, call Game_Timer.adjust_time(setting, value, key) where value is the number you want to adjust by, key is the timer you want to adjust, and setting in the operation you want to perform. (1 to add frames, 2 to subtract frames, 3 to multiply, 4 to divide, and 5 to perform a modulus operation)

To stop or start a timer, call Game_Timer.active(key, bool) where key is the timer you want to start or stop, and bool is true if you want to start the timer, and false if you want to stop it.

To have a timer force battles to abort when they reach zero, call Game_Timer.end_battle(key, bool) where key is the timer you want to modify, and bool is true if you want it to abort battles while it is 0, and false if you don't.

To set a timer to display, call Game_Timer.display(key, bool) where key is the timer you want to display, and bool is either true or false, depending on the desired result.

To set a timer to be saved in the save file, call Game_Timer.save(key, bool) where key is the timer you want to have saved, and bool is true if you want the timer to be saved, and false if you want it to disappear when the game is closed.

Method List

set_power(power, duration)

Changes the intensity of the thunderstorm over the period specified by duration. (in frames) It is recommended that power be set to an integer from 0 to 9, where 0 is off and 9 is the most intense. Values below 0 function in the same way as 0, while values above 9 shorten the time between lightning strikes.

update

Updates all timers. Although intended for internal use, may be added to other scenes to force a timer update elsewhere.

update_single(key)

Updates a single timer, specified by key.

start(seconds, key)

Set up a timer, which will be accessed in the future by using key.

extended_start(hours, minutes, seconds, key)

Set up and extended timer. Functions in the same way as start().

finished?(key)

Returns true if the timer specified by key has reached 0, false otherwise. This method will delete the checked timer if it has reached 0.

check_timing(key)

Debugging method. Returns a variety of messages based on the current state of the timer specified by key.

kill_timer(key)

Erases the timer specified by key.

adjust_time(setting, value, key)

Adjusts the remaining time in the timer specified by key. Setting specifies an operation. (1 => addition, 2 => subtraction, 3 => multiplication, 4 = division, 5 = modulus)

active(key, bool)

Sets the timer specified by key to active or inactive, based on whether bool is true or false.

active?(key)

Returns true if the timer specified by key is active, and false otherwise.

end_battle(key, bool)

When bool is set to true, this method sets the timer specified by key to abort battles when it reaches 0. Otherwise, the timer will not abort battles when it reaches 0.

end_battle?

Checks to see if a timer that aborts battle has reached 0. Intended for internal use.

display(key, bool)

If bool is set to true, will display the timer specified by key. Otherwise, the timer is not displayed. Please note that only one timer will be displayed at any given time, no matter how many are set to display.

display?

Checks to see if a timer is being displayed, and reuturns remaining time. This method is intended for internal use only.

save(key, bool)

If bool is set to true, the timer specified by key will be saved along with the rest of the game. If bool is false, the timer will be deleted when the game closes, even if a save was made.

save?

Returns an array of all timers set to be saved. This method is intended for internal use only.

load_save(timers)

Loads all timers in the timers variable. This method is intended for internal use, but could be used to create new timers as well.

conditional_branch(parameters)

Part of the interpreter's conditional branch processing. Intended for internal use only.

control_variables(parameters)

Part of the interpreter's control variable processing. Intended for internal use only.

control_timer(parameters)

The interpreter's control timer processing. Intended for internal use only, although it could be used to create an event timer through scripts.

Terms and Conditions

  • This script is free to use in any noncommercial project. If you wish to use this script in a commercial (paid) project, please contact Glitchfinder at his website.
  • This script may only be hosted at the following domains:
    http://www.glitchkey.com
    http://www.hbgames.org
  • If you wish to host this script elsewhere, please contact Glitchfinder.
  • If you wish to translate this script, please contact Glitchfinder. He will need the web address that you plan to host the script at, as well as the language this script is being translated to.
  • The script header must remain intact at all times.
  • Glitchfinder remains the sole owner of this code. He may modify or revoke this license at any time, for any reason.
  • Any code derived from code within this script is owned by Glitchfinder, and you must have his permission to publish, host, or distribute his code.
  • This license applies to all code derived from the code within this script.
  • If you use this script within your project, you must include visible credit to Glitchfinder, within reason.
 
Just wondering because I am making a custom minigame for my game I'm currently making, does this actually show a timer somewhere on the screen or did I just mess up in the setup?
 
diablosbud":3qszduko said:
Just wondering because I am making a custom minigame for my game I'm currently making, does this actually show a timer somewhere on the screen or did I just mess up in the setup?

No, this script is meant only to provide background timers that the player is unaware of. (My current use is for a thunderstorm, among other things) Just try using the event timer's script, only slightly modified. (I'm not sure exactly where that is, its spread out all over the place)
 
Well actually can I have certain events happen with the default timer when it hits 0:00. If not i'll use this script for the background effects, and the actual timer to run as display, they work the same way other than effects :smile:.

EDIT: Also could you make a script line for conditional branches for me to have it check the timer has ended (I know that part exists, and you posted the line already, but what about with), and if it is ended have an event run. This will help because in my game that has an ABS I plan to send waves of enemies charging at the player, and he must fend them off until the timer ends. Please will you help me with this immportant part?
 
I'm not sure, but you might be able to use an old event self switch modifier script that someone posted a while back to pull that off. Essentially, you could have the timer run out of time, and then call the self switch code to shange the specific event's self switches, thus "activating" another page on the event. Also, I just tested this script in RMVX, and found that it works in that as well. Yayz! Must update title!
 
heh, Thanks. This will be very useful. I really do think the built in timer in xp quite useless for hidden commands seeing as it displays the time. And the VX compatibility, well, thats just a major bonus. Perfect for time related quests. Again, Thank you.
 
Yea, I may be able to use a switch, but I still need a way to trigger that switch. I'll try searching for that script you mentioned, and later today I'll post with my findings. Thanks for the suggestion :thumb:.

EDIT: I tried searching that exact text "Self Switch Modifier", and didn't find anything other than this topic, and some sort of ABS. I tried searching Self Switch but there are way to many topics, could you please make a piece of code for a conditional branch that if a certain timer is up it activates?
 
diablosbud":1cyw33ms said:
Yea, I may be able to use a switch, but I still need a way to trigger that switch. I'll try searching for that script you mentioned, and later today I'll post with my findings. Thanks for the suggestion :thumb:.

EDIT: I tried searching that exact text "Self Switch Modifier", and didn't find anything other than this topic, and some sort of ABS. I tried searching Self Switch but there are way to many topics, could you please make a piece of code for a conditional branch that if a certain timer is up it activates?

I just dug thru an old external hard drive for an old project of mine, and found the script. Here:

Code:
#==============================================================================
# ** Control Self Switches
#------------------------------------------------------------------------------
#  This class performs map screen processing.
#
#      To set a self switch:
#        sg_selfswitch(EVENT,'LETTER',OFF)
#
#
#      For example:
#        sg_selfswitch(44,'A')
#          That would turn self switch A in event #44 on.
#
#        sg_selfswitch(37,'B',1) 
#          That would turn off self switch B in event #37.
#
#
#      To check self switches, use this:
#        sg_selfcheck(44,'A')
#          That would be "true" if the switch is on. Mainly for conditional branches.
#
#==============================================================================
begin
  SDK.log('Control Self Switches', 'sandgolem', 1, '22.07.06')
  rescue
end

def sg_selfswitch(ev, a, v = 0)
  key = [$game_map.map_id, ev, a]
  $game_self_switches[key] = (v == 0)
  $game_map.need_refresh = true
end
  
def sg_selfcheck(ev, a)
  key = [$game_map.map_id, ev, a]
  return $game_self_switches[key]
end

Also, I believe it requires the SDK, although you might be able to delete that line altogether.
 
NearSerendy":ibxvpxs6 said:
heh, Thanks. This will be very useful. I really do think the built in timer in xp quite useless for hidden commands seeing as it displays the time. And the VX compatibility, well, thats just a major bonus. Perfect for time related quests. Again, Thank you.

Thanks! I really just built this because some of my scripts (mostly weather based ones) required timers. I liked my original timer, but I realized that it would be simpler if I could compress it into one script. As you said, the VX compatability is an added bonus. I just didn't use any edited methods (mostly by accident), and it works just fine.

Oops! I'm just used to forums that automerge posts, I guess. (pojo being one). I wish I could delete this post, but it appears I can't. o.0
 
Well, I don't understand how that script did anything, I still need to modify the script to work so it activates a switch when the timer finishes. That way I can activate an event in the script, this script I believe only lets you activate from the map, tried in the script. I need a script line for a conditional branch, please help me do this.
 
diablosbud":1hjl2uff said:
Well, I don't understand how that script did anything, I still need to modify the script to work so it activates a switch when the timer finishes. That way I can activate an event in the script, this script I believe only lets you activate from the map, tried in the script. I need a script line for a conditional branch, please help me do this.
If a timer has already been activated, just add the following to the conditional branch script line:

$game_temp.game_timer.check(timer_number)

If it is true, the conditional branch will activate, otherwise, it will either do nothing or use its else condition.

Also, try copying the script I have up right now, because if you copied before I made my first update to that post, the script will not return as true, no matter what you do.
 
I'm using XP, and I updated my script from the one in the first post again today, I got the event to run (I messed up with the auto-run), but it always makes it false. Could you please help me fix this bug?
 
diablosbud":1a6pwtvt said:
I'm using XP, and I updated my script from the one in the first post again today, I got the event to run (I messed up with the auto-run), but it always makes it false. Could you please help me fix this bug?

Have you set the timer to update?
 
Yes I made sure I made it update in Scene_Map, I am not sure if it is placed right though. Here is the place I placed it:
Code:
      # Update map, interpreter, and player order
      # (this update order is important for when conditions are fulfilled 
      # to run any event, and the player isn't provided the opportunity to
      # move in an instant)
      $game_map.update
      $game_system.map_interpreter.update
      $game_player.update
      $game_temp.game_timer.update

Could you please tell me if I placed the map update for the timer right? It is line 57.
 
diablosbud":18mft4rk said:
Yes I made sure I made it update in Scene_Map, I am not sure if it is placed right though. Here is the place I placed it:
Code:
      # Update map, interpreter, and player order
      # (this update order is important for when conditions are fulfilled 
      # to run any event, and the player isn't provided the opportunity to
      # move in an instant)
      $game_map.update
      $game_system.map_interpreter.update
      $game_player.update
      $game_temp.game_timer.update

Could you please tell me if I placed the map update for the timer right? It is line 57.

Here is my entire update method. (minus a few things for other custom scripts that don't need to be revealed yet)

Code:
  def update
    # Loop
    loop do
      # Update map, interpreter, and player order
      # (this update order is important for when conditions are fulfilled 
      # to run any event, and the player isn't provided the opportunity to
      # move in an instant)
      $game_map.update
      $game_system.map_interpreter.update
      $game_player.update
      # Update system (timer), screen
      $game_system.update
      $game_screen.update
      # Abort loop if player isn't place moving
      unless $game_temp.player_transferring
        break
      end
      # Run place move
      transfer_player
      # Abort loop if transition processing
      if $game_temp.transition_processing
        break
      end
    end
    # Update sprite set
    @spriteset.update
    # Update message window
    @message_window.update
    # If game over
    if $game_temp.gameover
      # Switch to game over screen
      $scene = Scene_Gameover.new
      return
    end
    # If returning to title screen
    if $game_temp.to_title
      # Change to title screen
      $scene = Scene_Title.new
      return
    end
    # If transition processing
    if $game_temp.transition_processing
      # Clear transition processing flag
      $game_temp.transition_processing = false
      # Execute transition
      if $game_temp.transition_name == ""
        Graphics.transition(20)
      else
        Graphics.transition(40, "Graphics/Transitions/" +
          $game_temp.transition_name)
      end
    end
    # If showing message window
    if $game_temp.message_window_showing
      return
    end
    # If encounter list isn't empty, and encounter count is 0
    if $game_player.encounter_count == 0 and $game_map.encounter_list != []
      # If event is running or encounter is not forbidden
      unless $game_system.map_interpreter.running? or
             $game_system.encounter_disabled
        # Confirm troop
        n = rand($game_map.encounter_list.size)
        troop_id = $game_map.encounter_list[n]
        # If troop is valid
        if $data_troops[troop_id] != nil
          # Set battle calling flag
          $game_temp.battle_calling = true
          $game_temp.battle_troop_id = troop_id
          $game_temp.battle_can_escape = true
          $game_temp.battle_can_lose = false
          $game_temp.battle_proc = nil
        end
      end
    end
    # If B button was pressed
    if Input.trigger?(Input::B)
      # If event is running, or menu is not forbidden
      unless $game_system.map_interpreter.running? or
             $game_system.menu_disabled
        # Set menu calling flag or beep flag
        $game_temp.menu_calling = true
        $game_temp.menu_beep = true
      end
    end
    # If debug mode is ON and F9 key was pressed
    if $DEBUG and Input.press?(Input::F9)
      # Set debug calling flag
      $game_temp.debug_calling = true
    end
    # If player is not moving
    unless $game_player.moving?
      # Run calling of each screen
      if $game_temp.battle_calling
        call_battle
      elsif $game_temp.shop_calling
        call_shop
      elsif $game_temp.name_calling
        call_name
      elsif $game_temp.menu_calling
        call_menu
      elsif $game_temp.save_calling
        call_save
      elsif $game_temp.debug_calling
        call_debug
      end
    end
    $game_temp.game_timer.update
  end

robot79796":18mft4rk said:
I cant figger this out cold you make a demo for me.

Would you be able to say what the problem is? Is it giving you an error message, or not doing anything, or ending too quickly? (or something else altogether?)
 
I have it updated the same place you do, exactly the same place, but it still doesn't work. I believe that it is the script snippet you posted to try to make the conditional branches, because it isn't anything from the scripting required. I have that script at the bottem the Game_Timer. Also the timer number for both is the same at 1 so it should be working, I can't see anything else wrong other than the conditional branch script.

Do I need to change anything in the Game_Timer script to make it work?
 
diablosbud":2759mro9 said:
I have it updated the same place you do, exactly the same place, but it still doesn't work. I believe that it is the script snippet you posted to try to make the conditional branches, because it isn't anything from the scripting required. I have that script at the bottem the Game_Timer. Also the timer number for both is the same at 1 so it should be working, I can't see anything else wrong other than the conditional branch script.

Do I need to change anything in the Game_Timer script to make it work?

Ok, I'm giving you something to add to the script to check if it is actually timing. Just add it at the bottom.

Code:
  def check2(timer_number)
    if Timers::Timers[timer_number] == nil
      print "time is up"
    else
      time = Timers::Timers[timer_number].to_s
      print time
    end
  end

You can call it with $game_temp.game_timer.check2(timer_number) where timer_number is the number of the timer you are using. It will either print the current time left (in frames), or it will print "time is up" if the timer is done. I would call this with an event on the map, and check it every few seconds to see if the timer is going down at all.

Now, If you're wondering why I'm posting this, it was in the beta version of my script. I used it to check whether the problem with my timer was with the update method, or some other problem. More often than not, it was updating improperly.
 
I tried adding that script snippet at the bottem of the Game_Timer even after all of the ends, and used a call script instead of a script conditional branch entering "$game_temp.game_timer.check2(1)", but it doesn't work, and instead when I try to check the time with that call script I get an error saying "Script 'Game_Timer' line 89: NameError occurred. uninitialized constant Timers". If it isn't much trouble as said before, could you please make a demo for this?
 
diablosbud":olxpfr77 said:
I tried adding that script snippet at the bottem of the Game_Timer even after all of the ends, and used a call script instead of a script conditional branch entering "$game_temp.game_timer.check2(1)", but it doesn't work, and instead when I try to check the time with that call script I get an error saying "Script 'Game_Timer' line 89: NameError occurred. uninitialized constant Timers". If it isn't much trouble as said before, could you please make a demo for this?

Here's a link to the demo, complete with a working event reference for both checks.

http://www.megaupload.com/?d=QD086DV2

Sorry about uploading to megaupload, its just what I use most often.
 

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