-----------
- Modules -
-----------
A module is essentially a folder containing any number or type of items.  They can contain any number of subdirectories and files.  Adding a module to 

Gravity Garden is very simple.
1. Navigate to your Gravity Garden folder and open the Modules folder.
2. Create a new folder and name it what you would like your module to be called.
3. Add a file called "Include.ini".  This file should contain paths to all the .ini files you want the game to load, with the root path being the module's 

path.  For an example, see the Main module.
How you organize your module is entirely up to you.  It will not affect how it is loaded.


---------
- Files -
---------
A file can contain any number of object declarations, of any type.  The Main module that comes with the game is generally organized by object type, but this 

is not necessary if you wish to organize it in another way.
Objects are declared in a simple format:

[Object type]
Name = name
Variable1 = value
Variable2 = value
...

There is an exception to this method (the Level class), so be sure to read how different object types are loaded.
The name of an object is simply what it will be referred to as.  It will have its module appended to the front of the name, so if, for example, your object was named "Object 1" and your module was called "Module 1", you would refer to your object as "Module 1/Object 1".  All objects must have a name!
Any variables that are not defined will be set to their default values.  In some cases, a variable must be given.  Boolean values are represented with 1 (true) or 0 (false).
If a variable is given that does not exist, it will simply be ignored.
A class that derives from another class inherits all of its variables.
All templates can have a XPlacementOffset and YPlacementOffset.  This is only really useful for anything descending from Entity.  This offsets the object from its actual position when being placed, starting with the actual position as the top-left corner.  For instance, in order for blocks in the game to line up with the 24x24 grid, they must be moved right by 3 pixels and down by 3 pixels.  To accomplish this, we set both the XPlacementOffset and YPlacementOffset to 3.


----------------
- Object Types -
----------------
[Sprite]
Sprites are used to store image data of any kind.

Variables:
	SpritePath - A string value.  The file path to a sprite file, with the root path being the Gravity Garden folder.  PNGs are preferable, as sprites can be loaded with an alpha channel.  Must be given.
	
	FrameCount - An integer value.  The number of frames to load for this animation.  If you have more than one frame, the program will search for your sprite's path with the frame number appended to the end, starting at 0.  For example, if you have a sprite called "Sprite.png" and you want it to have 3 frames, save the frames as "Sprite0.png", "Sprite1.png" and "Sprite2.png", then specify the path as "Sprite.png".  All frames should be the same size.  1 by default.
	
	Width - An integer value.  The width, in pixels, of one frame of the sprite.  0 by default.
	
	Height - An integer value.  The height, in pixels, of one frame of the sprite.  0 by default.
	
	FrameDelay - An integer value.  How many ticks to wait before displaying the next frame.  100 by default.
	
	LoopAnim - A boolean value.  Whether the animation should loop infinitely or not.  True by default.

	
[Sound]
Sounds are a sound effect of any kind, excluding background music.

Variables:
	SoundPath - A string value.  The file path to a sound file, with the root path being the Gravity Garden folder.  This should be able to load .WAV, .OGG, .AIFF, .RIFF and .VOC.
	
	Looping - A boolean value.  Whether the sound should play forever.  False by default.


[Entity]
An entity is a sprite that has a position on-screen, as well as a draw order.  Entities also have velocity, although it is rarely used.

Variables:
	SpriteName - A string value.  The name of a Sprite-class object that will represent this object.  Must be given.
	
	DrawDepth - An integer value.  The higher the value, the earlier this will be drawn on-screen, making it appear behind other objects.  0 by default.
	
	Pinned - A boolean value.  If this is true, the object does not move.  False by default.
	
	RotateToVelocity - A boolean value.  If this is true, the object will turn to face the direction it is falling.  False by default.


[PhysObj]
Stands for physical object.  Derives from Entity.  These cannot be created directly, but many classes are derived from this class.

Variables:
	AutoBound - A boolean value.  If this is set to true, the game will automatically create a bounding box for the object by finding its sprite's edges.  True by default, unless BoundingXOffset, BoundingYOffset, BoundingWidth or BoundingHeight are specified.
	
	Solid - A boolean value.  Whether this collides with other objects, and whether other objects can land on this.  True by default.
	
	BoundingXOffset - An integer value.  How far from the left side of the sprite the object's bounding box should start.  0 by default.
	
	BoundingYOffset - An integer value.  How far from the top side of the sprite the object's bounding box should start.  0 by default.
	
	BoundingWidth - An integer value.  The width of the object's bounding box.  0 by default.
	
	BoundingHeight - An integer value.  The height of the object's bounding box.  0 by default.
	
	MissionCritical - A boolean value.  If this is true, the level is lost when the object breaks, and the level is won when the object reaches an exit.  False by default.


[Trigger]
Used to set off Dialog events.  Its sprite only shows in the editor.  Actived when touched by a mission-critical object.  If a linked output is defined for this Trigger, it will activate when that object enters it.  Otherwise, it will be activated by any mission-critical objects.

Variables:
	StillOnly - A boolean value.  If this is true, the trigger will only be activated when the object is still.
	
	
[Exit]
Derives from PhysObj.  Cannot be solid.  Teleports mission-critical objects and ends the level.

Variables:
	ActiveSpriteName - A string value.  The name of a Sprite-class object that will represent this object when it is activated.  By default, no sprite is loaded.
	
	TeleportSoundPath - A string value.  The name of a Sound-class object that will play when this object is activated.  By default, no sound is loaded.
	
	TeleportFrame - An integer value.  The frame in this object's animation at which it will teleport the object.  0 by default.
	
	
[DirChanger]
Stands for direction changer.  Derives from PhysObj.  Cannot be solid.  Changes an object's specific gravity.

Variables:
	Relative - A boolean value.  Whether the directional change will be relative to the current gravity.  True by default.
	
	DirectionChange - An integer value.  If Relative is true, how much to increase the angle by.  If Relative is false, what to set the angle to.  Angle should be given in degrees, in increments of 90.  0 by default.
	
[ButtonPO]
Stands for button physical object.  Derives from PhysObj.  Cannot be solid.  Can be pressed down.

Variables:
	PressedSpriteName - A string value.  The name of a Sprite-class object that will represent this object when it is pressed.  By default, no sprite is loaded.
	
	PressedSoundPath - A string value.  The name of a Sound-class object that will play when this object is pressed.  By default, no sound is loaded.

	OnePress - A boolean value.  If true, the button will stay down once it is pressed.  If false, an object must be resting on the button in order for it to stay down.  False by default.
	

[BreakablePO]
Stands for breakable physical object.  Derives from PhysObj.  BreakablePOs can collide with other objects, and can, as their name suggests, break.
	
	BreakSpriteName - A string value.  The name of a Sprite-class object that will represent this object when it breaks.  By default, no sprite is loaded.
	
	BreakSoundName - A string value.  The name of a Sound-class object that will play when this object breaks.  By default, no sound is loaded.
	
	BreakFall - An integer value.  The maximum number of pixels this can fall for without touching the ground before it breaks.  If set to -1, the object cannot break by falling.  -1 by default.
	
	BreakWeight - An integer value.  The maximum weight that can land on this object without it breaking.  If set to -1, the object cannot break by being crushed.  -1 by default.
	
	Weight - An integer value.  How heavy this object is.  Used to determine if this is crushing another object.  0 by default.
	
	Cushioning - An integer value.  How many pixels to remove from an object's fall length if it lands on this, effectively cushioning it from breaking.  0 by default.


[Door]
Derives from BreakablePO.  Switches from solid to non-solid state depending on the linked output's state.  The Door class only needs one sprite, and it will go forward or backward in the sprite depending on whether it is opening or closing, respectively.

	ChangeStateFrame - An integer value.  At what frame during the animation the door should change its solidity.  For instance, if a door has an animation receding into the wall, it should probably change when it is halfway into the wall.  If set to -1, it will never change.  -1 by default.
	
	DepthOffset - An integer value.  How much the depth should increase by when the state is changed.  For instance, if a door recedes into a wall, the depth should increase so it will be drawn behind objects that pass throgh it when it is open.  0 by default.
	
	OpenSoundName - A string value.  The name of a Sound-class object that will play when this door opens.  By default, no sound is loaded.
	
	CloseSoundName - A string value.  The name of a Sound-class object that will play when this door closes.  By default, no sound is loaded.


[Level]
A playable level in the game.  This includes a list of objects to be created when the level starts.  This declaration is a bit different.  Firstly, you can define some variables the normal way:

	MusicThemePath - A string value.  The file path to a music file to loop in the background while the level is playing, with the root path being the Gravity Garden folder.  This should be able to load .WAV, .MOD, .MIDI, .OGG, .MP3 and .FLAC.
	
	PreviewPath - A string value.  The file path to a preview image of the level, with the root path being the Gravity Garden folder.  Should have dimensions of 210 x 158.  By default, no preview will be shown.
	
	TurnsPar - An integer value.  The par for turns - if the player completes the level with a turn number equal to or less than this, they will get a perfect score.
	
	Next, the level declaration.  Objects are listed in the following format, excluding the <> brackets:
	
	Add: [<Object type>] <Object name> @ <X position>, <Y position>; Rotate <Angle>; Link (<Link ID>) -> (<Output link ID>)
	
	Object type - A string value.  The type of object to add.  Must be given.
	
	Object name - A string value.  The name of the object to add.  Must be given.
	
	X position - An integer value.  The object's X position.
	
	Y position - An integer value.  The object's Y position.
	
	Angle - An integer value.  The amount, in degrees, to rotate the object by.  Must be in increments of 90.
	
	Link ID - A string value.  An ID for this particular instance of the object.
	
	Output link ID - A string value.  The ID of another object to get information from.  An example of usage of this is a button and door.  The button is given a Link ID of "Button 1".  Then, the door is given an Output link ID of "Button 1".  This makes the door open when the button is pressed.
	
	Finally, the dialog event declaration.  This works similarly to the object declaration:
	
	DialogEvent: <Dialog name>
	
	These can be stacked in whatever order you wish.  Dialogs higher in the list will take precedence.  For instance, if you have a perfect score dialog and a level complete dialog, put the perfect score dialog first and it will cancel out the normal dialog on a perfect score.


[Dialog]
This represents a cutscene with any number messages in it.  Much like the Level object, Dialogs make use of a list, and thus use a slightly different declaration than normal.  First is a standard variable:

	Trigger - A string value.  The event that triggers this dialog.  This can be LEVEL_START (when the level starts), LEVEL FAIL (when the level is failed), LEVEL_COMPLETE (when the level is completed), LEVEL_PERFECT (when the level is completed on or below par) or the identifier name of a Trigger object in the level. There are a few other preset triggers, but they are not useful outside of hardcoded functions.
	
	Next, the message declaration, in the following format, once again excluding the <> brackets:
	
	AddMessage: Icon[<Icon>] Flag[<Flag>] Text[<Message>]
	
	Icon - A string value.  The name of a Sprite to use as the icon in the message (usually displaying a person's face).  Should be 140x140, and can be animated.
	
	Flag - A string value.  The name of a Sprite to use as the flag icon in the message.  Should be 140x100, can be animated.
	
	Message - A string value.  The text to be displayed.