FG DOCUMENTATION

(Return to home)

Sections: Objects | Charts | Miscellaneous

-- Objects --

Falling Guitars runs off of an object-oriented system. Because of this, there are a lot of objects you can use to make your chart truly unique. All the objects at your disposal are listed below.

Each object has a specific format that the chart loader reads. Each object has arguments (these are listed with each object) that tell the object how to act. Here is an example object. We will explain it later:

1;0|3;1998;2998;0;1

This is a Note object. We're not worried about the specific note variables, so we will trim those down:

1;0|3;1998

Here we are! This is the base of each object. We can learn a few things from this:

- Object variables are seperated by a semi-colon (;)

- Each object has 3 variables, and 'object-specific' variables are tacked onto the end of those

Here are the three arguments you need to know:

objectKey (1)

objectGroup (0|3)

objectSpawnTimeMS (1998)

objectKey

The objectKey is basically the ID of the object. It tells the loader if the object is a Note, a Color Fader, a Lyric Manager, etc... If you didn't have this, it wouldn't know what object to spawn!!

Every object has a Key, and those are listed right under each object in the list below.

objectGroup

See: -- Objects:Groups --

This is a list of the groups that are assigned to each object. Every object, by default, is assigned the groupID 0. An object cannot spawn if it doesn't have ANY groupIDs attached to it.

You can add multiple groups by seperating them with a pipe (|). Let's say I want to have an object with groupIDs (0, 5, 8). I would write it out as: "0|5|8" (with no quotation marks)

objectSpawnTimeMS

This is a simple one. This value says when the object will cross the Hit Line, in milliseconds. If the object is a Note, this is when you would hit it. If it's something like a Color Fader, this is when it would activate, and start fading a Color Channel.

Also, keep in mind, that while object variables are seperated with a semi-colon (;), objects themselves are seperated with a colon (:) Here are three objects to show that:

1;0;3400;0;0;1:1;0;3733;0;0;1:1;0;4066;0;2;1:

Note: From now on, if an example object is given, these variables will not be there. Assume that they are, as they are there for every object!

-- Objects:ObjectList --

NOTE

objectKey: 1

Internal Object Name: obj_note

Arguments: [endHoldTimeMS, column, instrument, difficulty]

The Note is probably the most important object you can use. It's almost as if it's the whole premise of the game!!

The arguments you have are pretty simple:

endHoldTimeMS: If you have to hold down the note, this variable dictates when you should stop holding it. If this is 0, it is treated as a normal, non-holding note.

column: This is what column the note should spawn in (0-5, inclusive) If the column is 5, you don't have to strum it.

instrument: Who the instrument should be played by. (1 = guitar, 2 = bass, 3 = drums)


CAMERA ZOOM

objectKey: 2

Internal Object Name: obj_charcamzoom

Arguments: [target, size, frames, easing]

This object lets you zoom into one of the three characters.

Arguments:

target: Which rocker to target. The rockerIDs are the same as their instrumentIDs.

size: What percentage of the viewport to zoom into, divided by 100. (0.01-1, inclusive)

frames: How many frames it should take to fully zoom into.

easing: The easing type to use when zooming in. Only the 1st easing type is coded in at the moment, so this will always be 1.


COLOR FADER

objectKey: 3

Internal Object Name: obj_colorfader

Arguments: [channel, color, frames]

The Color Fader allows you to smoothly transition a color from one to another.

Arguments:

channel: Which Color Channel to fade.

0: Phillips Hue lights. Keep in mind that this channel is not always enabled. (See: -- Misc:PhillipsHueIntegration --)

1: The Guitarist spotlight

2: The Bassist spotlight

3: The Drums spotlight

4-8: Guitar note colors

9-13: Bass note colors

14-19: Drums note colors

color: The color to fade to, expressed as a decimal value.

frames: How many frames it should take to fully fade to the target color.


CHARACTER ECHO

objectKey: 4

Internal Object Name: obj_charecho

Arguments: [target, scale, alpha]

This object creates an 'echo' effect for a rocker, usually used for 'intense' moments.

Arguments:

target: Which rocker to target.

scale: How much to add to the X/Y scale of the echo each frame.

alpha: How much to subtract from the opacity of the echo each frame.


LYRIC MANAGER

objectKey: 5

Internal Object Name: obj_lyrics

Arguments: [lyricManagerVersion, lyricMS(1), lyricAttack(1), lyric(1), lyricMS(2), lyricAttack(2), lyric(2)...]

If the song that you're using has lyrics, then the Lyric Manager can help you out. This object can display lyrics (or, really, any text..) for a specified amount of time. Please keep all lyrics appropriate!!

Arguments:

lyricManagerVersion: Since the Lyric Manager can change between versions, this value ensures you won't run into any errors with charts using an older version of the Lyric Manager. The current version is: (1)

lyricMS: The millisecond timestamp when this lyric appears.

lyricMS: The millisecond timestamp when this lyric disappears.

lyric: The text of this lyric, expressed in base64.

lyric: The millisecond timestamp in which the word starts. This MUST have as many arguments as there are words. Or, set it to -1 to avoid timing.

Example:

To display two lyrics, (I'll go with "Falling" and "Guitars") you would provide 9 arguments total:

1:1000;2000;RmFsbGluZw==;3000;4000;R3VpdGFycw==

This displays the first lyric "Falling" from 1 to 2 seconds, and the second lyric "Guitars", from 3 to 4 seconds.

And the lyricManagerVersion is tacked onto the start to ensure no bugs occur.


PARTICLE SYSTEM

objectKey: 6

Internal Object Name: obj_particlesys

Arguments: [originX, originY, depth, sprite, color, duration, maxParticles, emission, lifetime, lifetimeRange, angle, angleRange, speed, speedRange, size, sizeRange, gravity, gravityRange, gravityDirection, gravityDirectionRange]

The Particle System is a powerful tool that allows you to create a near infinite set of particle effects. But, with great power, comes great responsiblity!! Be sure to manage the amount of particles that you use carefully, or else the game could slow down, or even crash!

The game has a hard limit of the max particles you can have on screen at once (unsigned 8bit integer, 255), so please try and stay BELOW this limit!

Arguments:

originX: The X value where all particles will spawn.

originY: The Y value where all particles will spawn.

depth: The depth value for each particle. (See: -- Misc:ObjectDepths --)

depth: The sprite index for each particle. Sprite Index list:

0: 1x1 pixel

color: The color for each particle, expressed as a decimal value.

duration: How long, in seconds, the particle system will last. After this, it will destroy itself, but leave all remaining particles alive.

maxParticles: How many particles can be on screen at once.

emission: How many particles can spawn each frame (max: 30)

lifetime: How long, in seconds, each particle will last.

lifetimeRange: A random value from -lifetimeRange to lifetimeRange added onto lifetime.

angle: The direction that each particle will travel in. Keep in mind that Falling Guitars (and the engine it uses, GameMaker: Studio) uses a counter-clockwise rotation system.

angleRange: A random value from -angleRange to angleRange added onto angle.

speed: The inital velocity in pixels per frame that each particle travels.

speedRange: A random value from -speedRange to speedRange added onto speed.

size: How big the particle should be. This value is the same for both X/Y scale.

sizeRange: A random value from -sizeRange to sizeRange added onto size.

gravity: How much to increase the velocity of each particle per second, in pixels per second.

gravityRange: A random value from -gravityRange to gravityRange added onto gravity.

gravityDirection: The direction in which gravity accelerates each particle. (using the same degree system as angle)

gravityDirectionRange: A random value from -gravityDirectionRange to gravityDirectionRange added onto gravityDirection.


SHAKER

objectKey: 7

Internal Object Name: obj_stage_shaker

Arguments: [strength, interval, duration]

You ever want to make something big? Maybe some confetti with the Particle System? Why not add a shake?!! The Shaker lets you shake the screen a specific amount.

Arguments:

strength: How many pixels in each direction the shake should go.

interval: The time (in frames) between each shake.

duration: How long (in seconds) that the shake should last.


SFX

objectKey: 8

Internal Object Name: obj_playstagesound

Arguments: [index, volume, pitch]

The SFX object lets you play a sound.

Arguments:

index: The sound index to play. Sound Index List:

0: silence

1: audience cheer (1)

2: audience cheer (2)

volume: The volume to play the sound.

pitch: The pitch to play the sound.


TOGGLE GROUP

objectKey: 9

Internal Object Name: obj_togglegroup

Arguments: [groupToToggle, toggle, condition(s)]

An easy way to toggle a group, given a condition.

Arguments:

groupToToggle: The groupID to toggle.

toggle: Whether you want to activate (1) or deactivate (0) the groupToToggle.

condition: The condition to check for. If the specified condition returns false, the groupToToggle will stay as it is. If more than one is listed, ALL have to be true to progress. Conditions are listed below.

0: true

1-6: Guitarist is holding note in column (n)

6-10: Bassist is holding note in column (n)

11-15: Drums is holding note in column (n)

16-20: Guitarist pressed note in column (n)

21-25: Bassist pressed note in column (n)

26-31: Drums pressed note in column (n)


RANDOM

objectKey: 10

Internal Object Name: obj_randomvtoreg

Arguments: [targetRegister, min, max, integer]

This object can generate a random value and assign it to a register.

Arguments:

targetRegister: The register to send the output value to.

min: The smallest number the random generator can output.

max: The biggest number the random generator can output.

integer: Whether or not the number should be a whole integer. If this is false, it will round to 2 decimal places.


REGISTER OPERATION

objectKey: 11

Internal Object Name: obj_registerop

Arguments: [targetRegister, operation, value]

With this object, you can perform almost any operation on a register and assign that to the register. Includes both simple operations AND bitwise! Pun intended ;)

Arguments:

targetRegister: The register to send the output value to.

operation: Which operation to use. This is a whole integer value. List is below.

Basic:

0: set (immediately sets to value)

1: +

2: -

3: *

4: /

Bitwise:

5: AND

6: OR

7: XOR

8: NOT

9: left-shift

10: right-shift

value: The value to to the equation with.


MIRROR GAMEPLAY

objectKey: 12

Internal Object Name: obj_mirrorgame

Arguments: [mirror, frames, instrument]

This object will take all the notes on the highway, and mirror them.

This means that the note in the 5th column will be in the 1st, the 4th column will be in second, etc...

Arguments:

mirror: A boolean value to say if the screen should be mirrored or not.

frames: How many frames it should take to fully mirror

instrument: The instrument to target. This currently isn't fully working yet, so this value should ALWAYS be 0!


START POSITION

objectKey: 13

Internal Object Name: obj_startpos

Arguments: [startMS]

The Start Position is an easy way to start a chart at a certain point, usually when making it.

Arguments:

startMS: The millisecond to start at.


SPOTLIGHTALPHA

objectKey: 14

Internal Object Name: obj_spotlightalpha

Arguments: [target, alpha, frames]

This object lets you change the alpha of a given spotlight.

Arguments:

target: The target spotlight to change. (0 for all)

alpha: The alpha to fade to, expressed as a decimal value.

frames: How many frames it should take to fully fade to the target alpha.



-- Objects:Groups --

Every object is assigned a group. You can activate and deactivate these groups as you please.



-- Objects:Registers --

Falling Guitars has a list of 'registers', that can hold a temporary value for use later.

The game would usually crash if you tried to set an integer argument to a string. But, in this case, it's a little special!

You can access any of the four registers, by just adding an 'x' to the start of an integer.

Let's say I want to access the value in Register #3. All I would do is enter "x3", and it will load the value of Register #3 into that argument.

These can be very useful if you want to store something like a random value for a partle system.


Let's do an example!!

Let's say I want to spawn a Note object, but I want it to be in a random column. With registers (and the Random object), this is easy!

First, I create a random object (BEFORE the Note is spawned. If an object is already spawned, it can't change its values)

10;0;100;1;0;5;1

This initalizes the Random object! What we're doing here is generating a random integer value (it can't be a decimal!) between 0 and 5. After the random number is generated, it gets stored in Register #1.

Now, let's create the Note object!

1;0;2500;0;x1;1

You see the x1 in there? That's the random value we just generated! Now, when this note spawns, it will be given a random column.

You can even do it for groups!

(RANDOM) 10;0;100;2;1;20;1

(NOTE) 1;0|x2;2500;0;3;1

Isn't that neat?!


There are also some registers that are built in with predetermined values. Some of these update every frame, others, only once. The list is below.

RegisterID Value
1000 Audio Amplitude Data


-- Charts --



-- Misc --

This is just some miscellaneous information for your reading pleasure.


-- Misc:PhillipsHueIntegration --

Falling Guitars has built-in support to be able to change Phillips Hue branded lights. You can change the color of these lights via Color Channel 0.

Keep in mind that the person playing your chart may not have Phillips Hue Integreation enabled, so don't revolve your chart around these.

As to not overload the Phillips Hue Bridge, the lights only update 1-3 times per second. Either way, the Phillips Hue API updates pretty slowly.



-- Misc:ObjectDepths --

Each object has a 'depth' assigned to it. The default is 0, but the ones listed below have special depth values.

Keep in mind that a lower depth (usually in the negatives) means it will be shown first on the screen. Higher depths will be sent behind lower depths.

If an object has (GUI) next to it, nothing can be drawn above it, as it is on the GUI layer.

IMPORTANT! The mimimum/maximum depth is -16000 to 16000. Anything with a depth outside of that range will not be drawn.

- - - - - - - - - - - - - - - - - - - - - - - - - - - -

- Background: 1000 (NOTHING can be under this!!)

- Video Background (obj_stage_videostream): 250

- Rhythm Rockers (obj_rhythmrocker): -98

- Note Highway (GUI) (obj_highway): -9999

- FGObject (obj_fgobject): -10000

- - - - - - - - - - - - - - - - - - - - - - - - - - - -



-- Misc:UploadingToTheFGWebsite --

You can optionally send the chart you made to us! We will put it on the servers for other people to download and play.

There are a few rules to assure that "quality-level" charts get uploaded:

- The chart is fully finished, and not just note spam.

- You send a video of you completing it, along with the chart file, to make sure we know it's possible.

I'm a high school student with pretty much no team. I'm not getting paid for this ;( Because of this, I can't guarentuee that a lot of charts will be uploaded to the servers.

I'll check the send email as much as possible, but I am sorry if I can't get to your chart (v.v)

You can send chart submissions to { send@fallinguitars.com }