Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Auto-Build

Auto-Build is a feature exclusive to smart blocks, accessible from Edit Special. It allows you to build structures using templates.

There are 2^8 = 256 unique template variations using only blocks, out of which 46 (+1) are required and act as default for the others. With 1x1 slopes, there are 5*6^8 = 8 398 080 unique variations. With 2x1 slopes, there are 13*(6^8+6^6*4*8+6^4*4^2*8*5+6^2*4^3*8*12+4^4*4*3*2) = 54 981 888 unique variations.

The Auto-Build system aims at cutting down the amount of templates needed to be manually created by the player by increasing the chances of a match with additional matching steps and options.

Ideally, the player should define the templates they need and let the tool handle most of the work. Predicting the output of Auto-Build is difficult, so it is better to be reactive than proactive to template issues.

Options

Reference Only

  • Toggles smart block between normal and reference.

Allow Rotation

  • Create also matches rotated templates.

Allow Flip X

  • Create also matches horizontally flipped templates.

Allow Flip Y

  • Create also matches vertically flipped templates.

Ignore Corners

  • Create also matches templates with different corners.

Use nearby as reference

  • Only fills in the selected objects, nearby unselected smart blocks are used as reference, even if placed on a different editor layer.

Don’t Delete

  • Smart blocks are not deleted after pasting a template.

Back

  • Exit the menu.

Create

  • Paste the given template.

Template

  • Creates new templates from selected objects.

Special

  • Use predefined templates.

Browser

  • Local template browser.

Create All

  • Pastes all required variations in a row using the given template.

Paste Template

  • Pastes a premade set of shapes using the given template.

Templating

Templating supports only grid-locked smart blocks. Exceptions are treated as if they were grid-locked, but results will vary.

When templating, the maximum distance an object can be from the edges of the center tile and still be part of the template is 0.5 for other smart blocks and 1 for reference blocks.

If you define a non-required template and its default template is undefined, the default will be highlighted in green and the non-required template will substitute it.

Identical templates are merged into one single variation.

All object properties, such as groups, layers, z order, extra options are saved within templates. Due to this it can sometimes be difficult to identify near identical templates in the variations browser.

When using Create on a layer, the created objects will use the current layer instead. This does not apply for Editor L2 or on the “All” Layer.

All blocks, besides other smart blocks, can be part of a template - including triggers. It is not possible to template smart blocks, as they are ignored when using Template. Since they are ignored, the object properties of smart blocks do not matter when templating.

2x1 Slopes

For 2x1 slope templates, the center of the base of the slope (the bigger half) is used as the center of the template. A reference block can be placed in the same tile as the tip of the slope. The max distance an object can be from a 2x1 slope is longer by 1 block along the length of the slope. 2x1 slopes used as reference blocks cannot overlap with other reference blocks. For the solid / air check, both halves are checked separately.

Object links are saved within templates, but how they are handled depends on whether a smart block is included in the object link. If the object link has no smart objects, then only the objects within the template’s default range are included, still linked together. If the object link includes a smart object, then the entire linked object is going to be included in the template. If the object link includes only reference objects, then the entire object link is ignored. If multiple smart objects are linked together, the one used as the center tile is the bottom-most, then left-most smart object. The remaining smart objects are ignored and will not be used as reference objects. Additionally, the only reference objects used are the ones within the 3x3 area around the center tile.

Weights

When there are multiple variations per template, weights can be added using the Add button to randomize the choice. The final chances are calculated by dividing the variation’s weight with the sum of the weights of all templates. Add adds 10 to the weights of the selected templates. Zero resets the weights of the selected templates to 0. By default, with no weights defined, the top-most left-most variation is used. If at least one variation has a weight, all variations without a weight are excluded and marked with a “0” symbol.

Matching Steps

When searching for a matching template, the game goes through the following steps, in this order:

  • Exact matches
  • Match template with reference slopes as solid block if the slope is connected to a tile, otherwise as air.
  • Match template with all reference slopes as solid blocks.
  • Use the default template (if it exists).

Each step also does the following matches, in this order, if the corresponding option is enabled:

  • Exact
  • Flipped (X, Y, XY)
  • Rotated (-90, -180, -270)
  • Ignore Corners

Default Variations

Below you can view a visual guide of all default templates and their variations. Highlighted in white are the default templates for other templates that include any of the smart objects highlighted in red.

Least Variations

The structures below cover all 47 required variations without repetition, unlike the structures created by Paste Template which repeat some variations and create much more than needed.

Area Triggers

Virtual Effects

Unlike their non-Area versions, the effects of Area triggers are virtual - the effect is temporary and is undone when the trigger is stopped. Area effects are recalculated every game tick, 240 times per second.

Non-Area Move, Rotate and Scaling effects use the real position of the objects. However, triggers that target the position of an object will use the virtual position of the object. Triggers that use transformations (rotation or scaling) of an object as reference will use the virtual transform of the object.

Timings

Area triggers are processed once per tick after all other moves. The latest point at which you can call an Area trigger and still be processed within the same tick is from a Keyframe Spawn. Collisions happen after Area triggers are processed.

Move processing order: Keyframe 🡒 Scale 🡒 Rotate 🡒 Move 🡒 Advanced Follow Y 🡒 Advanced Follow 🡒 Follow 🡒 Area

EffectIDs

EffectIDs are unique per type of Area trigger; Spawning a new Area Move will overwrite any active Area Move with the same EffectID, but not other kinds of Area trigger like Area Scale, Rotate, etc. EffectID 0 is not unique - there is no limit to how many triggers you can spawn using this ID.

Center

Center Group ID must be a single object, or have an ID Parent. If present, the ID Parent is used as the center. Group and Area Parents have no effect on the center. If no valid center exists, the Area trigger uses the level’s origin (0,0) coordinate as the center, which is 3 block units below the editor guide axis. P1 and P2 positions, as well as camera positions (center, edges, corners) can be used as the center. Center Group ID can be identical to Target Group ID.

Order & Priority

Order

Area triggers are processed in the following order: Area Scale 🡒 Area Rotate 🡒 Area Move 🡒 Area Fade / Area Tint It is not possible to change this order with Priority.

Priority

Area triggers have cumulative effects - Priority decides the order in which they are applied, from highest first to lowest last. If there are multiple active triggers with the same Priority, then spawn order is used (oldest first to newest last).

Multiple Areas

When multiple Areas target the same objects, they are processed first by Priority, then from oldest to newest. Consecutive Area triggers use the position of center and target objects after the effect of the previous Area trigger is applied. Meaning that if you change the position of an object with an Area trigger, the next Area trigger will use the new positions as reference.

Multiple Instances

Normally, spawning the same Area trigger while an instance of it is already active updates the current active instance, it will not create new instances or override previous ones. Spawn order is unaffected by this. Edit Area effects will be stopped and undone. EffectID has no effect on this behavior. With spawn remapping, it is possible to create additional instances of the same Area trigger for unique sets of target, center and control IDs (only if control ID is not 0). The same target group can be affected by different centers and the same center can affect multiple different target groups. As a result, it is not possible to use an Area trigger multiple times on the same set of groups. Using EffectID to ensure only one instance of Area is active is unnecessary in most cases. Stopping the Area trigger before spawning is only necessary for refreshing active instances or changing order. Special centers like P1, P2, C, etc override the default Center Group ID - which can still be remapped, so it is possible to apply the same Area effect multiple times on the same group without needing to use multiple center groups if using a special center.

Spawn Remapping

Target Group ID and Center Group ID can be remapped. EffectID cannot be remapped. Color Channel (Area Tint) cannot be remapped. While EffectIDs are not remappable, ID 0 can be used to use the same Area trigger for multiple different groups. These instances can be stopped individually using a Control ID, but cannot be edited individually as only GroupIDs or EffectIDs can be used, which are not remappable.

Area Parents and Group Parents

If no Area Parents are present, the Group Parent acts as both Group Parent and Area Parent, and vice-versa. Group and Area Parents do not update dynamically, the choice is done at level start. With multiple Group Parents in the same link, the left-most, then bottom-most Group Parent is used. Likewise for Area Parents. The Group Parent is the center for the effect applied (Area Scale & Area Rotate). The Area Parent is the center used to calculate the distance from the Area trigger’s center. With DEAP selected, the Area Parent will not be affected by the Area trigger. Linked objects will still be affected. DEAP ignores Area Parents not part of linked objects or linked groups.

Object Linking

Object Linking

When linking multiple objects, they are treated as one object for the effects of Area triggers as long as an Area Parent or Group Parent is present. Linked objects do not have to be part of the target group, however Group / Area Parents not part of the target group are ignored. Ignore Linked ignores any Area Links present. The Area trigger’s effect is applied to all linked objects, even if they are not part of the target group.

ID Parent Linking

If an ID Parent is present, the entire group is treated as one object for the effects of Area triggers. If no Area Parents or Group Parents are present, the ID Parent acts as both Group Parent and Area Parent. If an Area Parent or Group Parent is present on an object that is not the ID Parent, it will act as both Area and Group Parent. If the ID Parent object is an Area/Group Parent, other Area/Group Parents in the same group are ignored.

Ignore GParent ignores the ID Parent. ID Parents override object links. Unlike object links, for group links the area effect is not applied to objects not part of the target group. If the affected object is an ID Parent for another group, then the effect is applied to the entire group. While object links need multiple objects to count as linked, you only need one ID Parent to create a linked group.

Visibility

An object counts as not visible if its center is outside of the screen’s edges by at least half a block. Objects can take up to ~0.1333 seconds to count as not visible in some cases.

Area Fade and Area Tint effects do not apply if the target is not visible. For Area Move, Scale and Rotate, if an object is not visible the effect will stop being applied in certain cases.

Link Visible can be used to force objects to be visible to fix any issues regarding visibility.

Performance and Optimization

Area triggers reapply their effect every tick, so they put a constant strain on the processor. Lag components can be split in two categories:

  • Strength calculations for each target
  • Effect application

Out of the two, applying area effects is the much more demanding one.

Enter triggers are far more optimized and should not be replaced by Area triggers.

Effect Strength

If the resulting effect strength is 0, no Area effect will be applied.

Certain proximity options will make the Area affect less (or more) targets depending on the strength calculation.

Transformations (Scale, Rotate) and color operations (Fade, Tint) are applied per object even when using object links.

Scaling and rotation on object links also applies movement on all objects linked to the target, which is done per object. This makes Area Scale and Rotate the laggiest Area triggers when using object links.

Movements are optimized for multiple objects, using object links with Area Move can make use of this optimization and significantly reduce lag.

Overall, Area Move is the only Area trigger that sees a significant improvement from using object links. Area Fade and Tint have negligible increases from reducing the amount of targets that need to be calculated while Area Scale and Rotate are negatively impacted by it.

Fade and Tint

Area Fade and Tint effects are applied only on visible targets that are not toggled off. This includes completely transparent targets done using either the Hide object option, color blending, color opacity or Alpha triggers.

If there are multiple Area Fade triggers per target, all will do the strength calculation but only the strongest (or first) effect will be applied. This is not the case for other Area effects where all are applied.

Scale, Rotate and Move

Whether Area Scale, Rotate and Move is applied on toggled off targets is inconsistent and depends on length and deadzone settings. Toggling off targets has no effect in most common cases, so toggling shouldn’t be considered a reliable way to optimize these effects.

Effect Strength Coefficient

The effect of Area triggers varies depending on the distance between the center and targets. The strength coefficient represents the proportion of the applied effect for all Area triggers.

Distance

Distance is calculated between center and affected object then multiplied by ModFront / ModBack. Offset and OffsetY offset the position of the center after mod is applied. The distance value is sensible to float and addition errors - centering an object perfectly after it is moved is not always possible.

Distance can be calculated using these formulas:

c is position of center t is position of target

Circular Proximity

$Distance=\sqrt{(OffsetY+Y_{c}-Y_{t})^{2}+(Offset+X_{c}-X_{t})^{2}}$

Horizontal Proximity

$Distance=Offset+(X_{c}-X_{t})\cdot Mod$

Vertical Proximity

$Distance=Offset+(Y_{c}-Y_{t})\cdot Mod$

Mod

For radial proximity, Mod has no effect. For horizontal and vertical proximity, ModBack is applied if $CenterPos>TargetPos$ and ModFront is applied if $CenterPos<TargetPos$. For the symmetrical options, the value of Distance is always positive when ModFront is applied, even if the value of ModFront is negative. Offsets are not affected by mod.

Ease Out

With Ease Out enabled, Easing is applied on ModBack and Easing2 is applied on ModFront. Easing2 is mistakenly applied when using radial proximity, conflicting with Easing.

Length and Deadzone

Length and Deadzone determine the strength of the effect at different distances, from a min of 0 to a max of 1.

If Length is 0 or Deadzone is 1, then the value steps directly between max and min. Otherwise, the value follows a linear equation bounded between [1,0] using the formula:

$EffectStrength_{\ |⟹}=\frac{Distance-Length\cdot Deadzone}{Length\cdot(1-Deadzone)}$

$EffectStrength_{\ |⟹}=1-EffectStrength_{\ |⟸}$

The result is fed into the Easing function and is then used to calculate the strength of the effect applied.

Notations

  • L = Length
  • Dz = Deadzone
  • Max - Distance value at max strength
  • Min - Distance value at min strength
  • Center - Strength value at distance 0
  • Sign - The sign of distance (positive or negative) where the strength is greater than min
  • Direction - The direction (relative to the center) along which the strength value decreases

Center ⟹ Edge

LengthDeadzoneMaxMinCenterSignDirection
$L \gt 0$$Dz \gt 1$$\ge Dz\cdot L$$\le L$0+|⟸
$L \gt 0$$Dz = 1$$\lt L$$\ge L$1+|⟹
$L \gt 0$$0\lt Dz\lt 1$$\le Dz\cdot L$$\ge L$1+|⟹
$L \gt 0$$Dz = 0$$\le 0$$\ge L$1+|⟹
$L \gt 0$$Dz \lt 0$$\le Dz\cdot L$$\ge L$$Dz/(Dz-1)$-/+|⟹
$L = 0$$Dz \gt 1$$\gt 0$$\le 0$0+|⟸
$L = 0$$Dz \le 1$$\lt 0$$\ge 0$0-|⟸
$L \lt 0$$Dz \gt 1$$\le Dz\cdot L$$\ge L$0-|⟸
$L \lt 0$$Dz = 1$$\gt L$$\le L$1-|⟹
$L \lt 0$$0\lt Dz\lt 1$$\ge Dz\cdot L$$\le L$1-|⟹
$L \lt 0$$Dz = 0$$\ge 0$$\le L$1-|⟹
$L \lt 0$$Dz \lt 0$$\ge Dz\cdot L$$\le L$$Dz/(Dz-1)$-/+|⟸

Center ⟸ Edge

LengthDeadzoneMaxMinCenterSignDirection
$L \gt 0$$Dz \gt 1$$\le L$$\ge Dz\cdot L$1+|⟹
$L \gt 0$$Dz = 1$$\ge L$$\lt L$0+|⟸
$L \gt 0$$0\lt Dz\lt 1$$\ge L$$\le Dz\cdot L$0+|⟸
$L \gt 0$$Dz = 0$$\ge L$$\le 0$0+|⟸
$L \gt 0$$Dz \lt 0$$\ge L$$\le Dz\cdot L$$1/(1-Dz)$-/+|⟸
$L = 0$$Dz \gt 1$$\le 0$$\gt 0$1+|⟹
$L = 0$$Dz \le 1$$\ge 0$$\lt 0$1-|⟹
$L \lt 0$$Dz \gt 1$$\ge L$$\le Dz\cdot L$1-|⟹
$L \lt 0$$Dz = 1$$\le L$$\gt L$0-|⟸
$L \lt 0$$0\lt Dz\lt 1$$\le L$$\ge Dz\cdot L$0-|⟸
$L \lt 0$$Dz = 0$$\le L$$\ge 0$1-|⟸
$L \lt 0$$Dz \lt 0$$\le L$$\ge Dz\cdot L$$1/(1-Dz)$-/+|⟹

Proximity Settings

ImageNo.AreaDirectionModBackModFrontOffset
1Circular|⟹No EffectNo EffectX axis
2Circular|⟸No EffectNo EffectX axis
3Horizontal|⟹LeftRight, AbsoluteX axis
4Horizontal|⟸LeftRight, AbsoluteX axis
5Horizontal|⟹LeftRightX axis
6Horizontal|⟸LeftRightX axis
7Vertical|⟹DownUp, AbsoluteY axis
8Vertical|⟸DownUp, AbsoluteY axis
9Vertical|⟸DownUpY axis
10Vertical|⟹DownUpY axis

Specific Settings & Behavior

Area Move

Unique Settings

  • MoveDist
  • MoveAngle
  • Relative
  • RFade
  • XY Mode
  • MoveX
  • MoveY

Behavior

Moves the object by the distance specified by MoveDist (10 units = 1 block unit) in the direction given by MoveAngle. MoveAngle is defined in degrees (360 degrees = 1 rotation going counterclockwise) and the 0 degree point is down. With Relative enabled each object moves in the opposite direction of the center (angle between object and center, offset by 180°). Relative overrides MoveAngle. Angle is not affected by object rotation. Angle is not affected by ModFront / Modback. Center of angle is affected by Offset and OffsetY. MoveDist is multiplied by the distance between target and center and then divided by RFade if Relative is enabled. XY Mode replaces the angle and move settings with the cardinal movement settings MoveX and MoveY.

Equations

XY Movement

$X = XMove \cdot EffectStrength + X_{t}$ $Y = YMove \cdot EffectStrength + Y_{t}$

Relative Movement

$Distance=\sqrt{(VerticalOffset+Y_{c}-Y_{t})^{2}+(HorizontalOffset+X_{c}-X_{t})^{2}}$

$Radius = (3\cdot MoveDist) \cdot EffectStrength\cdot \min(\frac{Distance}{RFade},1)$

$Angle = \arctan(\frac{(Y_{c}-Y_{t}}{X_{c}-X_{t}})$

$X = Radius \cdot \cos(Angle) + X_{t}$ $Y = Radius \cdot \sin(Angle) + Y_{t}$

Where: c is position of center t is position of target $VerticalOffset$ is OffsetY for radial and Offset for vertical proximity. $HorizontalOffset$ is Offset for radial and horizontal proximity.

Area Rotate

Unique Settings

  • Rotation

Rotation

Behavior

Rotates objects by a number of degrees given by Rotation (360 degrees = 1 rotation going clockwise). Move effects (except Area Move) are also rotated. The hitbox of solid objects is always in line with the coordinate system. While the visual rotates by any degree given, the hitbox can only rotate in increments of 90 degrees. If the rotation value is between 90 degree increments, then the hitbox is going to be sized up so the rotated object would fit inside.

Area Scale

Unique Settings

  • ScaleX
  • ScaleY

Behavior

If not linked, objects are scaled along their own XY axis. If linked, objects are scaled along the world XY axis. Area Scale does not support relative rotation.

The scale effect applied is calculated using this formula:

$EffectScale=1+EffectStrength \cdot (Scale-1)$

Where Scale is ScaleX or ScaleY.

If the scale value is negative, the object will be flipped around the respective axis. Due to a bug with Area Scale solid object hitboxes become thin when scaled with a negative value. Area Scale will not work if both X and Y scale are equal to 0. Objects can be scaled by 0 on one axis if the other axis is non-zero; To scale an object on both X and Y to 0 two Area Scale triggers are needed. Area Scale is considered a scaling effect by Scale trigger’s Relative Scale option.

The degree of slopes can be changed using transform effects like object warping or Area Scale. Move effects (except Area Move and Area Rotate) are also scaled.

Area Fade

Unique Settings

  • From Opacity
  • To Opacity

Behavior

From Opacity is the opacity at maximum strength, while To Opacity is the opacity at minimum. Unlike other Area triggers, Area Fade effects do not stack additively or multiplicatively with one another. When multiple Area Fade effects are applied on the same object, the one with the highest Effect Strength is applied regardless of the opacity value. If there is a tie, the first effect is used as determined by Priority and spawn order. The effect multiplies with other opacity effects (Alpha trigger and color channel Opacity). Area Fade does not have an Easing option. Due to a bug, Area Fade effects stop working for one frame after the game is unpaused.

Area Tint

Unique Settings

  • Color Channel
  • Tint
  • HSV
  • Main Only
  • Secondary Only

Behavior

Area Tint is applied after other color effects (Color, Pulse, Copy Color).

The effect applied is calculated using this formula: $Color=ObjectColor+Tint(ColorChannel-ObjectColor)$ $ObjectColor \le Color \le ColorChannel$

For $Tint \le 0$ no tint is applied. For $0 \lt Tint \lt 1$ the max tint is proportional to Tint. For $Tint = 1$ at max tint the object color is equal to Color Channel. For $Tint \gt 1$ the strength of the tint applied is increased, but still maxes out at the color given by Color Channel.

Area Tint does not have an Easing option. With Main Only or Secondary Only selected, only the Base, respectively Detail Color will be tinted. Objects keep their blending and alpha values when tinted. Area Tint ignores the Base / Detail Color setting of single-color objects.

Random Values

Some variables can be randomized with the corresponding +/- option (the offset). For example, with a value of 5 +/- 1 a random value between 4 and 6 will be picked. The formula used is: $RandomValue=BaseValue+RandomCoefficient\cdot RandomOffset$

The random coefficient (a random value between +/-1) for each setting is calculated per object at level start.

Different triggers can have different base values and offsets, but they all share the same random coefficients since they are defined per object. While you can change the base value and offset of each setting, this will not randomize the values again. It is not possible to change random coefficients without restarting the level. With linked objects, the Group Parent’s random coefficients are used. Shared parameters, like Length, have the same random coefficient for all types of Area trigger. This also applies to OffsetY and Offset.

Edit Area Triggers

Edits the parameters of an active Area Trigger.

Area Options

Common

  • Duration
  • Easing
  • GroupID
  • EffectID
  • Use EffectID
  • Offset
  • OffsetY
  • ModFront
  • ModBack (BK)
  • Deadzone

Area Move

  • MoveDist
  • MoveAngle
  • RFade
  • XY Mode
  • MoveX
  • MoveY

Area Rotate

  • Rotation

Area Scale

  • ScaleX
  • ScaleY

Area Fade

  • (To) Opacity

Area Tint

  • Tint %
  • Edit HSV
  • Use HSV

Behavior

Settings are independent of each other. The values of different settings can be changed by different triggers independently of one another with their own Duration and Easing. Settings with value NaN are not affected. Spawning an Area trigger again will stop and undo active Edit Area effects.

Multiple Instances

There can be only one Edit Area effect active for each setting of an Area trigger. New effects override previous ones. When overriding, the new Edit Area effect will start from where the previous effect stopped. When calling multiple Edit Area triggers that edit the same settings, the last one will override all previous ones. Edit Area will override other active Edit Areas only if Duration is bigger than 0. This is likely a bug.

Settings

EffectID and GroupID can both be remapped. EffectID 0 will edit all Area triggers without an EffectID. Duration is the time it takes to transition between the old and new set of values, this is affected by the Easing option. Easing does not change the Area trigger’s easings. XY Mode only changes which settings are displayed, an Edit Area Move trigger can affect both Angle and XY Mode Area triggers at the same time. Tint % and Set HSV can be edited at the same time by one Edit Area Tint trigger. There is no option to change the From Opacity setting of an Area Fade trigger.

Area Stop

Stops an active Area trigger using its EffectID. EffectID can be remapped. EffectID 0 will stop all Area triggers without an EffectID.

Other Notable Interactions

Stop

Stop works on Area triggers. Paused Area triggers do not apply their effect.

Stop does not work on Edit Area.

Stopping the Area trigger will undo and stop all active Area and Edit Area effects.

Pausing the Area trigger itself pauses all of its active Edit Area effects.

Toggle

Toggle disables Area effects on targets only in certain cases, (for example - Length is negative and using a Center ⟹ Edge proximity), otherwise has no effect.

Follow

Follow does not copy Area movements.

Gradient

Gradients are not affected by Area Tint.

Gradient Rotation is not affected by Area Rotate outside of the editor.

Enter

Area triggers are not affected by movements caused by Enter triggers.

Particle Objects

Particle effects are affected by Area triggers.

Spawn Particle

Particles created using Spawn Particle ignore Area effects on the particle object.

Advanced Follow

Advanced Follow works on objects and supports object links. Area effects happen after Advanced Follow movements. Advanced Follow targeting is affected by Area effects. Due to this, certain interactions can create loops or crash / freeze the game. Using DEAP with Advanced Follow is recommended.

Rotate

Aim and Follow modes use the object’s virtual rotation instead of the real rotation, so using Area Rotate to offset these rotations will not work as they will constantly try to override the rotation made by Area Rotate.

Scale

Relative Scale and Relative Rotation use the object’s virtual scale or rotation as reference.

FMOD

Geometry Dash uses the FMOD library as its primary audio engine, in-depth documentation for it can be found on https://www.fmod.com/docs/.

This documentation is referenced or summarized partialy in this document as a rough guideline, please reference the FMOD docs instead if you need more in-depth information.

Game Audio Settings

Specific audio settings are found in the Options section of the Settings menu, under the Audio Category.

Change Custom Songs Location

Saves custom songs in the Geometry Dash\Resources\songs folder instead of AppData\Local\GeometryDash.

Disable Song Alert

Removes the alert when playing a level with missing song files.

No Song Limit

Removes the 50 song limit from the song folder. If unselected, the oldest 50th song is replaced when downloading a new song over the limit.

Reduce Quality

Reduces the audio sample rate from 44.1 kHz to 24 kHz.

Audio Fix 01

Increases the audio buffer size. Only use this if the audio frequently cuts while playing. Makes latency worse as a side-effect.

Music Offset

Offsets all song playback by a value given in milliseconds.

Debug

Displays FMOD debug stats, such as memory usage and latency.

Pitch & Speed

FMOD uses the FFT (Fast Fourier Transform) algorithm for pitch shifting (Pitch) and time stretching (Speed). More info can be found here.

Speed modifies the audio’s playback speed, Pitch changes the audio’s pitch without affecting its speed.

Pitch is measured in semi-tones, an increase by 12 semitones is an octave which is equal to a doubling (200%) of pitch, while a decrease by 12 semitones is equal to a halving (50%) of pitch.

Pitch changes are limited between -12 (50%) and 12 (200%) by the audio engine.

The exact pitch multiplier can be calculated using the formula: $Multiplier = \sqrt[12]{2^{Pitch}}$

Speed uses the same formula and value scaling as Pitch in order to make pitch corrections easier. Pitch of speeded audio can be corrected by giving Pitch the opposite value of Speed.

The audio engine runs separately from the main game loop and is not affected by Timewarp triggers.

Volume Proximity

The volume of songs and SFX can be set to depend on the distance between a group of sound emitters referenced by Group ID 1 and a sound listener given by Group ID 2 or chosen between P1, P2 and Camera. This is also known as Volume Attenuation.

It can be set or modified by Edit Song, SFX or Edit SFX.

Behavior

Persistence

Attenuation set by Edit Song is saved per Channel, and by Edit SFX per SFX Group.

SFX triggers can set attenuation unique to the SFX. This has priority over the one set on SFX Group and cannot be edited in any way.

Clearing & Overriding

Attenuation remains permanently active on the song Channel or SFX Group until overriden.

Attenuation can be removed if either GID 1 has no objects, GID 2 is equal to 0 or does not have one object. Otherwise the current attenuation settings are overriden. If GID 1 is equal to 0 attenuation will not be cleared nor overriden.

Timing

Modifying the attenuation of a Song or SFX with Edit Song / Edit SFX is instant regardless of Duration.

Emitters

If GID 1 is made up of multiple objects, then the one closest to the listener is used to determine the volume.

Listeners

If GID 2 has more than one object, then the attenuation settings are overriden.

P1, P2 and Camera (center) override GID 2 as the listener.

Both P1 and P2 can be selected at the same time, and this is the only way to have more than one listener per attenuation at once. In this case the closest distance between a sound emitter and one of the two players is used.

Thresholds

The attenuated volume is calculated from the distance between listener and emitters, interpolated linearly based on three thresholds: Near, Medium and Far.

For the bounds, if Distance is less than Near then VolNear is used, if it’s more than Far then VolFar is used.

Each threshold adds to the previous one, as follows: $Near = MinDist$ $Medium = MinDist+Dist2$ $Far = MinDist+Dist2+Dist3$

All thresholds are in move units (10/block).

If the trigger is selected, the game renders the attenuation thresholds around each emitter.

Distance

How distance is calculated depends on the chosen direction settings, similar to the ones found in Area triggers.

ImageNo.ShapeDistance
1Circular$\sqrt{(Y_{l}-Y_{e})^{2}+(X_{l}-X_{e})^{2}}$
2Horizontal$|X_{l}-X_{e}|$
3Horizontal$X_{e}-X_{l}$
4Horizontal$X_{l}-X_{e}$
7Vertical$|Y_{l}-Y_{e}|$
10Vertical$Y_{l}-Y_{e}$
9Vertical$Y_{e}-Y_{l}$

Primary Song

The default song used when playing the level, which can be changed from the level select menu. This will be displayed as the main song in any level select screen.

It is always played on Channel 0 and is loaded on level start.

Song Selection

Normal Songs

In the Normal category you can find all of the official, main-level songs for use in your custom levels.

It is not possible to use main level songs inside Song triggers (they can only be used as primary songs), but non-cut versions of some of them can be found on Newgrounds.

[2.207] All primary songs

  1. Stereo Madness
  2. Back On Track
  3. Polargeist
  4. Dry Out
  5. Base After Base
  6. Cant Let Go
  7. Jumper
  8. Time Machine
  9. Cycles
  10. xStep
  11. Clutterfunk
  12. Theory of Everything
  13. Electroman Adventures
  14. Clubstep
  15. Electrodynamix
  16. Hexagon Force
  17. Blast Processing
  18. Theory of Everything 2
  19. Geometrical Dominator
  20. Deadlocked
  21. Fingerdash
  22. Dash
  23. Explorers (Hidden)

Custom Songs

Custom songs can be chosen from two main sources - Newgrounds and the Audio Library.

Newgrounds is a media-hosting website for user-generated content. While possible to use your own music in-game, you first need to be scouted in order to appear in the Audio Portal and then whitelisted by RobTop.

The Audio Library hosts audio licensed for use inside Geometry Dash. This can be either on a per artist or per label basis, but not all songs from an artist or label can be featured as the usage rights can be owned by a different entity or exclusive to another game.

Settings

The primary song settings menu can be accessed from the gear button in the Custom Song Selection menu.

While the options can only be accessed from the custom song menu, these settings also apply to main level songs.

Offset

Offsets the start of the song by a value given in seconds.

This is less precise than the song trigger, as you can modify the offset only up to a tenth of a second, instead of a thousandth.

Offset is ignored if using Dont Reset.

Fade In/Out

Applies one second of fade when starting from the beginning of the level (Fade In) and / or when completing the level (Fade Out).

Fades are not applied while playtesting in the editor

Dont Reset

Similar to the option found in the Song trigger, songs will continue when dying or resetting the level.

Unlike the Song trigger option, it does not stop on death and will not reset when restarting from the beginning of the level.

Song Guidelines

Song guidelines are editor-only lines used as reference for syncing triggers and gameplay to the song.

They can be toggled on or off using the Music Lines option in the editor pause screen, next to the Help button.

Guidelines are only displayed vertically, so they will not show up in vertical gameplay sections.

Guideline Creator

Song guidelines can be created for custom levels using the Guideline Creator accessed from inside the Custom Song Selection menu.

New guidelines can be added to existing ones from the Record button. Existing ones can be cleared with the Clear button.

Custom guidelines are saved per level, not per song.

Normal Songs

Main level songs all have beat guidelines which cannot be edited in-game.

Audio-scaled objects do not sync to the main level song, they use the guideline beats as reference.

BPM Guide

Displays song lines synced to a beat given in BPM (bars per minute) multiplied by BPB (beats per bar) for a Duration given in seconds, relative to a given gameplay Speed.

Behavior

Bars are colored yellow, beats are orange.

Unlike song guidelines, BPM guidelines are not affected by any gameplay changes.

It is not possible to orient BPM triggers in any direction other than left to right.

Visibility

Toggling off song guidelines does not toggle off BPM guidelines.

BPM guidelines are not toggled off if the trigger is toggled off or has its alpha set to 0.

The only ways to hide them is either with the Disable option or with the Hide object option (if Hide Invisible is ticked on).

Song Trigger

Starts a specific custom song with a given Volume and Speed in the selected Channel.

Channels

Only one song can be played in a channel at a time. Audio will not cut when a song is replaced, as the track is replaced only when the new track finishes loading.

There are in total 5 playback channels, between ID 0 and 4.

Channel ID can be remapped.

Custom Song ID

Up to 21 unique Song IDs can be used per level, levels with more IDs will fail to upload unless whitelisted by RobTop.

Surprisingly, Custom Song ID can be remapped. Custom Song ID will not remap if activated when loading the level, and it uses ID 0 if no custom song is selected.

Remapped Song IDs are not displayed in the level’s Songs & SFX list and do not count towards the level’s song ID limit.

Custom Song ID can be remapped to any integer ID. Any .mp3 file in your songs folder with said ID as its name will be played, including negative IDs which are normally unused - this makes this feature ideal for NONGS.

Prep

Songs need to be loaded into memory first before playing, this can take a variable amount of time depending on your system performance and file sizes which can result in playback being noticeably delayed. Prep and Prep Load can be used to load the song early and play it when needed without delay.

Prep loads the track into the channel’s memory without playing it, only one Prep can be active per channel, new activations replace previous ones. Playing a new track without Prep removes any active Preps for that channel. The track loaded by Prep will not stop or interrupt the channel’s current playback.

If Prep Load is activated while the Prep track is still loading, the track will play as soon as it is fully loaded. Prep Load does nothing if activated with no Prep track, or after a non-Prep song activation.

Preps are not cleared upon level restart, preps from a previous attempt can be played in the current one if the level was not restarted from a checkpoint or from the end screen, otherwise the prep only stops the current track without playing a new one.

Loop

Makes the song continue looping instead of ending.

Playing a new song or using Stop Loop are the only ways to stop the loop.

Dont Reset

With Dont Reset, the track will not be reset and continue playing from the previous attempt when respawning from a checkpoint.

The track will pause on death and resume on respawn if the Options trigger’s Audio On Death option is Off (default).

Start and End

Makes the song Start and End at a a given time in miliseconds.

If looped, playback is looped between Start and End. However, if Stop Loop is used then End is ignored and the song continues playing past the end point.

Milisecond Offsets

The Pause buttons next to Start and End can be used to get the milisecond offset of the song trigger’s position from the start of the level.

In classic mode, all gameplay changes which affect the Music Playback line are taken into account for the offset calculation.

In platformer, all gameplay changes are ignored, including the level’s default speed. The level is considered as having normal speed for the offset calculation.

Fade In and Out

Makes the song Fade In when starting and Fade out when ending.

Like Start and End, the time is given in miliseconds.

Fade In is applied only when a loop starts, not when it repeats.

Edit Song

Modifies the Speed and Volume of a song playing on the given Channel.

Misc

Channel can be remapped.

Edit Song cannot be stopped or paused by a Stop trigger.

New Edit Song calls override the previous Speed or Volume transition if Change Speed or Change Volume is selected.

Options

Stop instantly stops the song playing on the given Channel. This will not clear the channel’s Prep song.

Stop Loop makes a looping song playing on the Channel no longer loop. A looping song will not stop at the End timestamp and instead continue until the end of the song.

Duration sets the time needed to transition Speed or Volume to their new values if Change Speed or Change Volume is selected.

Volume Proximity

Volume Proximity can be set per Channel from the options found on the 2nd page.

These settings do not reset when the song ends and remain permanently active until overriden or cleared by another Edit Song trigger.

SFX

Plays the selected SFX using the given Pitch, Speed and Volume.

Misc

Unique ID, SFX Group and the SFX’s ID can be remapped.

Playback behavior for remapped SFX IDs has a few crucial differences compared to remapped Custom Song IDs:

  • The ID must be prefixed by s and of type .ogg
  • The ID must be found in the SFX data library
  • Remappping SFX can be done once per trigger - the first activation sets what SFX will be used by the trigger until the player quits the level, further activations will play the same SFX regardless of remaps

Options

Reverb

Applies a reverb effect to the played SFX. Reverbs are used primarily to simulate an acoustic space (sound reflections, decay, etc).

FMOD documentation on reverbs can be found here.

Reverb parameters cannot be modified individually in-game, instead you are allowed to pick between the 21 default presets provided by FMOD.

Reverb presets

  • Off
  • Generic
  • Padded Cell
  • Room
  • Bath room
  • Living room
  • Stone room
  • Auditorium
  • Concert Hall
  • Cave
  • Arena
  • Hangar
  • Stone Corridor
  • Alley
  • Forest
  • City
  • Mountains
  • Quarry
  • Plain
  • Parking Lot
  • Sewer Pipe
  • Under Water

Preset parameters can be found here.

There is only one reverb channel used by all sound effects, as such there can be only one reverb preset active at a time.

If Enable is selected, the SFX will replace the current reverb effect with its selected preset. If it is not selected, then the SFX uses the current active reverb preset.

FFT

FFT improves the quality of the pitch effect by increasing the FFT window size. Practically, this makes the sound effects less coarse with slightly more echo at the cost of performance.

Pre-Load

Loads the SFX in memory at the start of the level.

Loop

Makes the SFX loop until stopped.

Start and End

Makes the SFX Start and End at a a given time in miliseconds.

If looped, playback is looped between Start and End. However, if Stop Loop is used then End is ignored and the SFX continues playing to the end.

Fade In and Out

Makes the SFX Fade In when starting and Fade out when ending.

Like Start and *End, the time is given in miliseconds.

Fades are applied only when a SFX starts or ends, not when it repeats.

Unique

Makes the SFX unique if Unique ID is not 0 and Is Unique is selected. Unique SFX can be referenced by their Unique ID by Edit SFX triggers.

Only one SFX per unique ID can be played at a time. Without Override, the new SFX will not play if the previous SFX is still playing. With Override, the previous SFX gets replaced by the new one.

SFX Group

Gives the SFX a SFX Group that can be referenced by Edit SFX triggers.

MinInterval

Adds a cooldown to the SFX trigger and, if the SFX is unique, to the Unique ID. SFX will not play if activated during the cooldown.

In the case of unique SFX, the MinInterval of the current trigger is considered. If Override is selected then only the MinInterval cooldown is still applied.

MinInterval is not affected by SFX Speed, but is affected by timewarping.

Ignore Volume Test

By default, the SFX will not play if it’s starting volume 0. If Ignore Volume Test is selected, the SFX will play regardless of it’s starting volume.

Volume Proximity

Volume Proximity can be set per SFX trigger from the 4th settings page. This overrides the SFX Group’s proximity settings and cannot be edited by other triggers.

Edit SFX

Modifies or stops the SFX by either Group ID, SFX Group or Unique ID.

Misc

Group ID, SFX Group and Unique ID can be remapped.

Edit SFX cannot be stopped or paused by a Stop trigger.

New Edit SFX calls override the previous Speed or Volume transition if Change Speed or Change Volume is selected.

The SFX’s Pitch cannot be edited.

Options

Stop, Stop Loop, Change Speed and Change Volume affect all SFX with the given Group ID, SFX Group or Unique ID.

Stop instantly stops all referenced SFX .

Stop Loop makes all referenced SFX stop looping. Looping SFX will not stop at the End timestamp and instead continue until they end.

Duration sets the time needed to transition Speed or Volume to their new values if Change Speed or Change Volume is selected.

Volume Proximity can be set per SFX Group from the 2nd settings page. These settings do not reset when the SFX ends and remain permanently active until overriden or cleared by another Edit SFX trigger.

Collision Objects

Used by Collision and Instant Collision triggers to implement collisions. Can be rotated, scaled or warped, but not skewed. Block IDs are limited between 0 and 9999. The Dynamic option allows collision objects to check collisions with other collision objects.

Collision Check

The collision state is updated every tick after all scheduled moves are processed, even if the position of the player or objects has not changed.

Collision checks are done even if there is no active Collision trigger and they are always active even if the objects are off-screen.

Collision Schedule

  • Collision (enter)
  • State (on)
  • Instant (Touch Trigger)
  • State (off)
  • Collision (exit)

Dynamic Order

Collision checks are done sequentially one dynamic target at a time in the following order:

  • Player 1
  • Between players
  • Player 2
  • Dynamic collision objects
    • Collisions are checked in the order the dynamic collision objects were placed

Toggle

If an object is inactive, the collision check is skipped.

If a dynamic target is inactive, it will not check for collisions.

Chunk Check

The grid is split into 100x100 chunks, starting from (0,0).

Collisions near a dynamic target will be checked in a 3x3 chunk grid centered on the chunk that contains the dynamic target, collisions outside this area are ignored.

If the dynamic target’s X position is less than 200, it will additionally check all chunks before X 200 regardless of Y position.

Chunk Order

Chunks are checked from bottom to top (towards Y positive), then left to right (towards X positive).

Collision objects within a chunk are checked in the order they were placed.

Extended Collision

If a non-dynamic target uses Extended Collision, it will be checked by all dynamic targets regardless of chunk position.

If the dynamic target uses Extended Collision, it will check all chunks.

Load Limit

A chunk can contain at most 7998 objects when the level is loaded, the level fails to play otherwise.

UI Trigger

Collision objects on the UI layer will only check for collisions with other UI objects. Players are unable to collide with UI collisions.

UI collisions are not divided in chunks, dynamic UI collisions will check all other UI collisions regardless of position.

Collision Trigger

Toggles off a Group ID when collision blocks collide. With the Activate Group option, toggles on and spawns the given group instead. P1 and P2 options replace Block ID1 with Player 1 and Player 2 respectively. PP replaces Block ID1 with P1 and Block ID2 with P2.

Activation

Collision activates on block collision, but before the collision state is updated. Due to this, if Instant Collision is called from a Collision trigger with the same Block IDs it will spawn the opposite group from the one expected. Collision only activates when the collision state of the Block IDs changes. If placed before the level origin, Enter Collisions can activate when the level loads.

Spawn Mechanics

Collision triggers can be spawn remapped and have spawn inheritance.

The spawn order of Collision triggers depends on the order collisions are checked - which is affected by the Dynamic and Player options.

If multiple triggers share the same Block IDs, spawn order is used. The order of Block IDs does not matter, Block ID 1 and 2 are interchangeable.

Collision triggers with the PP option activate after Player 1 and before Player 2 collisions.

Spawning the same Collision trigger again from the same remap while it is already active will do nothing.

Interactions with Silent Move and Toggle

During collisions it is possible to prevent the activation another collision that is yet to be processed from inside a Collision trigger by using an instant trigger like Toggle or Move (with the Silent option). This is only possible for enter collisions, this is not possible during exit collisions.

The toggle state of a dynamic collision object is checked only prior to its collision checks. As a result, toggling off the dynamic collision while it checks will not stop the Collision trigger from activating.

Collisions spawning other collisions

Collision triggers spawned by other collision triggers can activate in the same tick as long as the collision state they are following hasn’t been changed yet.

A collision trigger spawned by another collision trigger of the same type (enter, exit) and with the same set of block IDs will spawn in the same tick.

Interactions with Stop

The spawn list of collision triggers is dynamic and can be changed during trigger activation.

When the state of a set of collision IDs changes, all Collision triggers with the same set of IDs for the respective state (enter, exit) are scheduled to activate, those triggers are then iterated through and spawned by index.

If you stop Collision triggers during that spawn, either by a Collision trigger stopping itself or another Collision trigger, the trigger list shrinks but the index is not updated.

This index mismatch can cause triggers that were not stopped and are yet to spawn to be skipped.

Paused Collision triggers are skipped. Pausing does not cause other triggers to be skipped.

Instant Collision Trigger

Checks the current collision state of the given Block IDs and spawns True ID and False ID accordingly.

Can be remapped, but resets remaps when spawning other groups.

The collision state is only updated once per tick, Instant Collision does not check collisions, it checks what the last recorded collision state was.

Using Toggle or Silent Move with Instant Collision to do multiple checks per tick is not possible.

State Blocks

Spawns State On or State Off when colliding with the Player. Can be considered a simpler, single object alternative to collision objects and triggers. Collision checks are done individually per each object, as State Blocks do not use Block IDs.

State Blocks spawn groups independently even if sharing the same group IDs. However, as State Blocks cannot be remapped, if the target group contains a spawn trigger it will only activate once due to the spawn limit.

Performance & Optimization

Generally, it doesn’t make sense to stop or disable collision triggers for performance purposes, or to use Instant Collision instead for the following reasons:

  • Collision triggers only activate on Collision ID state changes
  • The overhead of Collision trigger instances being active (stored in memory) is very small and doesn’t significantly affect performance on modern devices
  • The main performance cost of Collision and Instant Collision triggers is spawning other triggers; Collision object checks are often the main reason for lag
  • Collisions are checked every tick regardless of whether any Collision trigger is active
  • Collisions are always active even if off-screen
  • Collisions are not checked if the objects are not found in nearby chunks (unless Extended Collision is used)

Other bad attempts at optimization:

  • Spawning thousands of individual Instant Collision triggers at once instead of using Collision Triggers, this is laggier as it spawns more triggers at once
  • Trying to reinvent the wheel by disabling Collision triggers based on a player-made distance measurement, the game already limits the area collisions are checked in
  • Replacing Collision triggers with Instant Collision spawn loops

What optimizations DO make sense, if necessary:

  • Using as few dynamic objects as possible
  • Toggling off dynamic collision objects when not in use
  • Avoid placing collision objects before X 200
  • Avoid overloading the UI layer with collisions
  • Avoid using Extended Collision if the objects are not scaled up
  • Avoid using Extended Collision on dynamic objects if the level has a large amount of collision objects
  • Toggling off Extended Collision objects when not in use (if in above case)
  • Toggling off non-dynamic collision objects when not in use (but generally not necessary)

When Dynamic needs to be used:

  • Dynamic only dictates whether the collision object checks collisions with other collision objects, it has nothing to do with whether the collision object can be moved or not
  • Dynamic does not need to be used for object-player collisions, as the player is already dynamic

Follow

Copies a target’s movement on the X and Y axis for a set duration and applies it on another group.

Settings

X/Y Mod multiply the followed movement on the X/Y axis.

Move Time is how long the follow will be active.

Target Group ID is the ID of the group that follows the movement of Follow Group ID.

Mechanics

Follow Group ID must be a single object or contain a Group Parent ID. Follow will copy the target object’s movement for the duration specified.

Follow Order

Follow triggers are processed after all other movements but before Area triggers. As a result, it will copy all movements except the ones made by Area. Another exception to this is Move Silent - Follow will not copy instant movements. Follows will copy the movements of previous Follows based on spawn order.

Remapping

Target Group ID and Follow Group ID can be spawn remapped. For all Follow triggers there can only be one instance per unique combination of follow and target IDs. Calling a new instance will update the X / Y Mod values of the active one and refresh the Move Time if it’s longer than the remaining time.

Duration

For compatibility with Scale, Rotate and Move which are delayed by one tick, Follow is active by an additional tick prior to stopping. If Move Time is 0, then Follow will be active for 2 ticks.

Follow Player Y

This is a legacy trigger with most of its settings and features now found in Advanced Follow.

Advanced Follow Y works most similar to a Mode 1 Advanced Follow trigger that follows Player 1 on the Y axis.

Mechanics

Advanced Follow Y works on individual objects only - it ignores ID Parents and object links. It does not use velocities, so it will be treated like other moves by Advanced Follow triggers.

Advanced Follow Y movements are processed before Advanced Follow.

Advanced Follow Y can be instanced with spawn remapping and Target Group ID can be spawn remapped. There can be only one follow player trigger active per Target Group ID, activating a new one will update the previous one’s values.

Settings

Speed controls the easing of the movement, to get the Advanced Follow equivalent use this formula: $Easing(AdvFollow) = 4/Speed$

If Speed is equal to 4 or more then no easing is applied.

Max Speed limits the max movement speed of the target group. The value is 4 times higher compared to the Advanced Follow one, where: $MaxSpeed(AdvFollow) = MaxSpeed/4$

Delay is equivalent to its Advanced Follow version.

Move Time is the duration of the trigger, after which it will stop.

Offset adds a vertical offset to Player 1’s position.

Move Time and Offset are not found in Advanced Follow.

Advanced Follow

Makes objects part of a group move towards a center object.

Multiple Follows

Multiple Advanced Follow effects can be applied on the same objects and on different objects depending on MaxRange.

Remap Instances

Spawn remapping can create multiple instances of the same Advanced Follow trigger.

An Advanced Follow trigger’s instances are unique for sets of Target GID, Follow GID and Control ID. Only one instance can be active on the same set of groups, trying to spawn additional ones does nothing.

Priority

Priority decides the order in which Advanced Follow actions are applied, from highest first to lowest last. If there are multiple active instances with the same Priority, then spawn order is used (oldest first to newest last).

Exclusive

If Exclusive is used, the processing of Advanced Follow actions on the given target is stopped after the exclusive action. Advanced Follow effects prior to the exclusive action are still applied.

Exclusive is applied on both X and Y even if X or Y Only is used. The only way to control the exclusive area of effect is with MaxRange.

Max Speed and Friction

Settings that change the velocity of a target such as Acceleration, Max Speed and Friction are applied on each respective Advanced Follow.

Advanced follow can use object and group links. The movement of the objects or object groups is done independently of one another. Linking rules are the same as for Area triggers, more information can be found in the Area documentation.

Area Parent

The Area Parent is the object group’s center for distance calculations and the center of rotation when using Rotate Dir. While Group Parents are also considered Area Parents if no Area Parent is present already, they are not used by Advanced Follow.

Random Values

Certain parameters can be randomized with the +/- option.

Similarly to Area triggers, these random coefficients are picked per object at level start and cannot be changed. More information can be found in the Area documentation.

Follow Center

Follow GID must be a single object, or have an ID Parent. If present, the ID Parent is used as the center. Group and Area Parents have no effect on the center. P1 and P2 positions, as well as C (bottom-left camera corner) can be used as the center.

If no valid center exists, the Advanced Follow will not work. Follow GID can be identical to Target Group ID, but will only work if there is a valid follow center.

X and Y Only

X and Y Only limit the movement action of Advanced Follow to the X or Y axis. If a target has an Advanced Follow present on one axis only, then the target will only have velocity on that respective axis.

Mode 1

Easing is applied on each axis separately.

Mode 2

Friction is applied on each axis separately. The acceleration target is picked on a point that intersects the target’s X or Y axis.

Mode 3

Braking is applied on each axis separately. The steering target is picked on a point that intersects the target’s X or Y axis. Without Target Dir, acceleration will be applied on the given axis based on the target’s angle relative to it. The target is unable to steer if Mode 1 or 2 is present on the other axis.

Rotation

With Rotate Dir, the target rotates towards the follow center. Rotation is done independently by each Advanced Follow action. The rotation of the object is updated when entering the area of effect of the Advanced Follow. Rotation speed is limited to 0.5 rad/tick. This is not affected by slowing down with timewarp.

Rotation Offset offsets the rotation’s target angle by a value given in degres.

Rotate Easing eases the rotation using the formula: $nextRotation = \frac{(currentAngle-targetAngle)}{easing}$

The target’s rotation is not updated if the target’s distance from the follow center is less than Rotate Deadzone, given in small step units.

With Mode 1 and 2, the rotation follows the object’s direction of movement.

Mode 3 has the following changes to rotation:

  • Rotation always aims at the follow center
  • Rotation speed is limited by the steering speed
  • Rotate Easing and Rotate Deadzone have no effect

Having any Mode 1 or 2 Advanced Follows active on the same target will override Mode 3 rotation.

Ignore Disabled

With Ignore Disabled, targets that are toggled off are skipped by Advanced Follow.

Visibility

Advanced Follow acts on all targets, including the ones placed off-screen.

Link Visible is not needed when using Advanced Follow.

Mode

Mode selects the movement mode of Advanced Follow. Available modes are:

  • Easing (Mode 1)
  • Acceleration & Friction (Mode 2)
  • Steering & Breaking (Mode 3)

All Modes

Delay adds a delay (in seconds) to the position of the follow center and the start of the Advanced Follow effect.

MaxRange is the distance from center in (small step) units inside which the Advanced Follow effect is applied. If MaxRange is equal to 0, no distance limit is applied. If it’s less than 0, then Advanced Follow will stop working. Like StartSpeed and StartDir, MaxRange has a reference ID which currently does nothing.

MaxSpeed limits the target’s speed to the given speed value. If MaxSpeed is less than or equal to 0, no speed limit is used.

Mode 1

Mode 1 overrides the velocity based on the ratio of distance and Easing using the formula:

$Velocity=Distance/Easing$

As a side-effect, Edit Advanced Follow will not work on Mode 1.

Mode 2

Acceleration is the multiplier of the target’s acceleration. 1.00 Acceleration is equal to 0.01 increase in speed per tick.

Friction is the percentage of velocity lost every tick. Values of Friction are not limited - values below 0 and above 100 will increase the velocity exponentialy if there is no opposing force. Friction is applied prior to acceleration.

With NearDist the values of acceleration and friction change linearly, from normal values when distance is equal to or bigger than NearDist to NearAccel and NearFriction values when distance is 0.

Mode 2 & 3

StartSpeed is the value of the velocity applied, while StartDir is the direction’s angle offset.

1.00 Speed is equal to one (small step) unit per tick. StartDir is defined in degrees going clockwise.

StartSpeed and StartDir have two boxes on the right side which can be used to define a reference ID for the direction of velocity. If there are multiple objects with the same reference ID, one is picked at random for each target. If the reference ID contains an ID parent, the ID parent is used as reference.

If StartSpeed has a defined ID, the direction used is the direction of the last movement of the reference. StartSpeed is NOT a multiplier when a speed reference is used, it is a set speed value.

If StartDir has a defined ID and StartSpeed doesn’t, the direction used is aimed towards the reference.

The object’s default direction points upwards. The default is used if no reference IDs are defined, or if the reference returns no valid direction.

The behavior of StartSpeed depends on the options Init, Set and Add. If Init is used and this is the first action applied on the target, the object’s velocity is set to StartSpeed. If Set is used and StartSpeed is different from 0, the object’s velocity is replaced by StartSpeed. If Add is used, StartSpeed is added to the object’s current velocity.

Due to a bug, only one object per Target GID can be affected by StartSpeed.

Mode 3

SteerForce is the multiplier of the max rotational speed applied on the object towards the follow center. 1.00 SteerForce is equal to 0.01 radians / tick. Steering is done prior to braking and acceleration.

SteerForceLow / SteerForceHigh replaces SteerForce if the velocity of the object is strictly below / above SpeedRangeLow / SpeedRangeHigh.

The target stops accelerating and starts braking if the direction of movement and the direction towards the center are offset by more than BreakAngle. Breaking stops being applied once the target reaches 0 velocity, acceleration will continue to be disabled until the offset returns below BreakAngle.

If BreakAngle is above or equal to 180 degrees, the target will never brake. If it’s below 0, it will be stuck braking.

BreakForce is the percentage of velocity lost every tick while braking, similar to friction in Mode 2. Unlike friction, BreakForce is limited between 0 and 100.

SteerForce , SteerForceLow and SteerForceHigh are not applied while braking - BreakSteerForce is used instead if the velocity of the target is equal to or below BreakSteerSpeedLimit.

In Mode 3, acceleration is applied in the direction of movement. With Target Dir, acceleration is applied towards the follow center like in Mode 2.

SlowAccel and SlowDist currently do nothing.

Advanced Follow Update

Advanced Follow actions are processed after Follow Player Y, but before Follow and Area triggers.

Each action performs its motion calculation then executes the movement given by the result. They are done sequentially as dictated by Priority and spawn order. Positions are updated after each action and can be used by other Advanced Follow triggers right after.

If the target ends up not being under the effect of any Advanced Follow triggers, it loses all velocity on the next Advanced Follow update and can no longer be affected by Edit and Re-Target Advanced Follow.

Velocity Duplication Bug

Multiple Advanced Follow actions on the same object are bugged and do not stack properly. Because each action executes the movement without checking if said velocity has been already applied on the target in the current tick, the same velocity is applied multiple times erronously. In other words, the object moves way faster than it should if there are multiple non-exclusive Advanced Follow triggers acting on the same object. This bug is shared across all modes of movement. The actions are done separately on each axis - two Advanced Follow triggers, one X Only and another Y Only will not duplicate the other’s motion. This also applies to Rotation, which is more noticeable when using Mode 3.

Pause and Resume

Pausing disables the Advanced Follow instance temporarily. Delays are not paused and continue to tick down while the trigger is inactive. The spawn order of the instance is kept when resuming.

Edit Advanced Follow

Modifies the speed and direction of an Advanced Follow target.

Target

Target GID is the group of the target. It does not have to be a group targeted by an Advanced Follow trigger, only a target that is under an Advanced Follow effect.

The target must be a single object, the ID Parent of a group or the Area Parent of an object group.

Edit Advanced Follow will not work on a Mode 1 Advanced Follow trigger, as Mode 1 overrides the current velocity.

Axis Modifiers

Mod X and Y multiply the current acceleration of the object on the respective axis prior to applying Speed.

With X Only and Y Only, the trigger will only edit the velocity of the given axis. This is also the case if the target is affected by Advanced Follow on one axis only.

Speed and Dir

Speed and Dir settings share the same behavior with StartSpeed and StartDir.

Unlike StartSpeed, Speed is always additive and is not limited to one object per Target GID.

Redirect Dir currently does nothing.

Velocity

The velocity of the targets can be calculated using the following formulas:

$VelocityX = Speed*cos(TargetDirection+Dir)$

$VelocityY = Speed*sin(TargetDirection+Dir)$

$Velocity = (CurrentVelocityX)*ModX+(CurrentVelocityY)*ModY+VelocityX+VelocityY$

Random Values

The values of Mod X/Y, Speed and Dir can be randomized in a range using the -/+ boxes respective to each setting. Contrary to what the option says, random values are picked in the 0/+ range, not -/+. The randomization is done individually per target everytime the trigger is activated.

Target Control ID

If Target Control ID is selected, Target GID references the Control ID of one or more Advanced Follow instances. Edit Advanced Follow acts on all targets that have at least one of the Advanced Follows’ Target GIDs.

Remapping

All IDs, including the reference IDs, can be remapped.

Timings

Edit Advanced Follow is instant, the reference values are taken at the time of spawning.

The target must have been under an active Advanced Follow effect during the previous tick in order for Edit Advanced Follow to work.

If an Advanced Follow has Delay, Edit Advanced Follow will not work if the Advanced Follow has not been active for at least the amount of Delay.

Re-Target Advanced Follow

Changes the follow target of an Advanced Follow effect.

Behavior

Target GID references one or more Advanced Follow triggers by Group ID or Control ID (if Target Control ID is selected).

The activation of Re-Target Advanced Follow is instant.

The trigger has no effect if Follow GID is 0.

Both Target GID and Follow GID can be remapped.

Count

Spawns or toggles a Group ID when the Item ID value reaches or passes Target Count.

Activation

Each instance of Count stores the Item ID’s last value. When the Item ID value changes, Count updates its stored value to the new one. If the stored value is different from the new one and Target Count is between the stored and new item value or equal to the new value, Count disables the Target ID. With Activate Group selected Count enables and spawns the Target ID. This can interfere with Toggle triggers if they target the same group. Without Multi Activate, Count stops after one activation.

Spawn Mechanics

Stored Value

When spawned, Count initializes the stored value with the current value of the Item ID.

Pause & Resume

When paused, Count does not update the stored Item ID value. On Resume, the Count will have the same stored Item ID value prior to Pause, and will only update on the next Item ID value change. As a consequence it is not possible to use Pause & Resume to skip past the Target Count of a Count trigger. Count will activate on the next item update since the stored value no longer matches the value of the Item ID.

Spawn Order

Target ID spawns immediately after a Pickup or Item Edit trigger, interrupting any other active spawns. The interrupted spawn is resumed after all activated Count spawns finish. If multiple Count triggers activate at the same time, they are spawned in order, one after the other.

Target Order

Count instances are mapped by Target Count, on activation Target Count is looped through in ascending order if the new Item ID value is bigger or equal to the old one, and in descending order if the value is strictly lower. Instances with the same Target Count use spawn order (from oldest to newest).

Count Interrupt

The spawn of Count can interrupt other active Count spawns. This happens even if the old and new Item ID value are identical, for example from a Pickup trigger that adds 0.

On an item change, all Count instances with the specified Item ID get queued as outlined in Target Order. This Count update will use the new value of the Item ID at the moment of the change to update the stored values and decide what instances spawn.

If any of the Count spawns trigger an item change, a new Count update will be created, as described above, using the new item value. The instances will, again, be sorted using the Target Order in ascending or descending order.

When the initial Count update resumes, two issues arise if the Item IDs of both updates are identical:

  1. When interrupted, the first update will use the last update’s order. If the second update changes the ascending / descending order, then the queued counts will be processed in the wrong order. It will also keep its offset.
  2. The item value used in the initial update is still the same, the initial Count update will update the stored value using an outdated item value.

For example, If the first Pickup changes the item value from 0 to 1000, then the third Count instance activates another Pickup that changes the value from 1000 to 0, it will resume from the fourth last Count instance and continue in descending order. The stored value is updated to 1000 for the first 3 instances, then updated to 0 for all instances, then updated back to 1000 for all but the last 3 instances.

Spawn Remapping

Item ID and Target ID can be remapped.

Spawn Inheritance

With Multi Activate, Target ID inherits spawn remaps. Without, Target ID does not inherit spawn remaps, instead it inherits the remaps of the oldest active instance of a subsequent Count trigger with the Multi Activate option using the same Item ID. If an instance of Count is spawned then activated during a count update, the target of this activation will not inherit remaps.

Multiple Instances

Count can be instantiated multiple times regardless of remaps. If an instance of Count activates during the spawn of another instance of the same Count trigger, the new spawn will use the remaps of the first unfinished spawn.

Instant Count

Toggles off a Group ID by comparing Item ID to Target Count.

Toggles on and spawns Group ID if Activate Group is selected. The comparison options are:

  • Equals: $Item=TargetCount$
  • Larger: $Item\gt TargetCount$
  • Smaller: $Item\lt TargetCount$

Pickup

Changes the value of an item given by Item ID by adding the value of Count to it.

Items use 32 bit signed integers to store their value in a range of -2^31 to 2^31-1, operations that go above or below these limits will cause integer overflow.

Multiply & Divide

If Multiply or Divide is selected, Modifier multiplies or divides the item value.

This operation uses single precision float which is not accurate for high values.

The result is rounded to the nearest whole number.

If the resulting value is above 2^31-1, on PC the result value is -2^31 while on mobile the result is 2^31-1. For values below -2^31 the result is -2^31 on all versions.

Override

If Override is selected, the item is set to the value of Count.

Time

Creates timers which can be used to keep track of elapsed time or activate groups after a given delay.

Options

StartTime overrides the previous value of the timer.

StopTime pauses the timer and spawns Target ID when the stop value is reached. This option is ignored if the tickbox is unselected.

The timer gets set to the stop value if it goes over the stop point. The timer will not stop if it starts or is unpaused from or past the stop value.

TimeMod modifies the timer multiplier. The default multiplier is 1.00. If TimeMod is 0.00 then the timer is unable to spawn groups.

Ignore Timewarp is currently bugged and has no effect.

Start Paused pauses the timer.

With Dont Override, StartTime is ignored when updating the timer (but it is used as the start value when creating a timer).

Timers

Time triggers create global timer instances, which are shared by Item ID. Timers store all of the Time trigger’s groups, properties and remap information.

Activating a Time trigger while there is an already active timer for the given Item ID updates the timer with the trigger’s settings and groups.

Timers update every tick, 240 times a second. Only timers initialized before the first timer spawn in the tick will be updated in the same titick. If a new timer is initialized during or after timer activation, it will be processed in the next update.

TargetID for Time triggers can only spawn if the timer crosses the StopTime, using Item Edit for this purpose will not work. This does not apply to Time Event triggers. The value of timers is checked prior to Time and Time Event trigger spawns.

Unlike Count which is bi-directional, timers are one-directional and this depends on the value of TimeMod:

  • For $TimeMod \gt 0$ Target ID is spawned if $previousValue \lt StopTime \le currentValue$.
  • For $TimeMod \lt 0$ Target ID is spawned if $previousValue \gt StopTime \ge currentValue$.

Assignment

Unlike Item Edit, timers are not limited between -9999999.00 and 9999999.00.

INF and NAN can be assigned using external editing. Assigning NAN to the timer’s value breaks most functionality involving the timer.

Spawn Mechanics

Timers are processed in spawn order on PC but in reversed spawn order on mobile.

All IDs can be spawn remapped. For remap inheritance, the timer instance stores the remaps.

Remaps can only be set when creating a timer instance, updating a timer will not update the remaps. Updating the timer does not change the timer’s spawn limit.

Stop, Pause and Resume

Stop triggers stop, pause or resume a timer given by group or control ID.

Resume will not resume a timer stopped by Time Control or Start Paused, and Time Control will not resume a timer stopped by Pause.

Stopping the timer clears all settings, remaps and current value.

Time Event

Spawns TargetID when the timer given by ItemID reaches the TargetTime.

Activation

Time Event requires an active timer to work, which can be created with a Time or Item Edit trigger.

Time Event can be initialized even if the timer isn’t active, and will continue to be active when the timer is cleared by Stop.

Time Event triggers do not spawn groups on their own, they assign extra groups for timers to spawn at the specified TargetTime.

Time Events store the timer’s current value when checked. Unlike Count, pausing the Time Event does not prevent it from updating its value.

If a Time Event is initialized on an active timer, it will spawn instantly (even if the timer is paused) if:

  • $(TimerMod > 0) \land (TargetTime > 0) \land (Time >= TargetTime)$
  • $(TimerMod < 0) \land (TargetTime < 0) \land (Time <= TargetTime)$

Spawn Mechanics

ItemID can be remapped. Unlike Count triggers, Time Events are not ordered by TargetTime. If multiple Time Events with the same ItemID spawn in the same tick, spawn order will be used.

Since timers spawn the groups given by Time Event, the spawn behavior is not going to depend on the Time Event, but on the timer:

  • The spawn target inherits the timer’s remaps.
  • The timer’s spawn limit is applied to all extra groups added by Time Event.
  • Time Events spawn after the corresponding timer, even if the Time Event was created before the timer.

Time Event triggers react in the same tick to timer value changes spawned by Time or Time Event triggers previous to them.

Time Control

Pauses or resumes a timer given by ItemID.

Only works on active timers.

Can be used on timers created by Item Edit triggers.

Can be remapped.

Timers paused by Time Control or Time cannot be resumed by the Resume trigger, and timers paused by the Pause trigger cannot be resumed by Time Control.

Item Edit

Updates the value of the target variable based on the values of the given parameters using mathematical functions.

Parameters

Items and Timers can be selected by ID. Points returns the total amount of points obtained so far. Time returns the value of the level’s global timer, which is updated every tick before spawn delays are scheduled. Att returns the player’s current attempts.

Math Operations

Besides Mod, there are seven buttons which change the operators and functions used in calculation. From top left, the first three buttons change the assignment, parameter and mod operator. The next two on the same line change the sign functions applied after rounding. The two below change the rounding functions applied after the mod and assignment operators.

Assignment

First button changes the assignment operator between = (assign), += (add), -= (subtract), ⋅= (multiply) and \= (divide).

Parameters

Second button changes the operator applied on the two parameters between +, -, ⋅ and \.

Mod

Third button changes the operator applied on Mod and the result of the parameter operation between ⋅ and \.

Sign Functions

The first button changes the function applied on the result of the mod operation between between none, A (Absolute) and N (Negative). The second button changes the function applied on the result of the assignment operation. Sign functions are applied after the respective rounding functions.

Rounding Functions

The first button changes the function applied on the result of the mod operation between NA (none), RN (Round to nearest), FL (Round down) and CE (Round up). The second button changes the function applied on the result of the assignment operation.

Operation

Item Edit operations are done at double precision.

The result can be assigned to an item or timer given by ID, or to the Points variable.

Items & Points

When assigned to an Item, the result is truncated to a whole number.

Item assignments are limited between -2^31 and 2^31-1. Operations on items will not cause integer overflow since they are always done in floating point.

Due to a bug, on the steam version of the game values above 2^31-1 instead are replaced by -2^31.

Timers

Timer assignments are limited between -9999999.00 and 9999999.00.

Item Edit can initialize timers if there isn’t one active already.

Timers created using this trigger are paused, use default settings and have no remaps, groups or control IDs.

These timers can be cleared only with a Stop trigger using Control ID 0.

Item Edit will update only the value of a timer if it is already active.

INF and NAN

INF and NAN can be used inside item edits through external editing.

INF and -INF can be assigned to timers or items but they will be limited like any other high value.

NAN cannot be assigned to items and it will be replaced by an integer value - on PC it is replaced by -2^31 while on mobile it is replaced by 0.

NAN can be assigned to timers, but this will make the timer unusable - all operations including NAN have NAN as a result and all comparisons with NAN return false.

Item Compare

Spawns TrueID or FalseID based on the result of the comparison of two parameters.

Parameters

Can be items, timers, points, main timer or attempts.

Math Operators

Mod

First button changes the operator of Mod1 and the first parameter between = (assign), += (add), -= (subtract), ⋅= (multiply) and \= (divide). Second button changes the operator of Mod2 and the second parameter.

Comparison

Third button changes the comparison operator between the results of the mod functions between == (equal), >= (greater or equal), <= (lower or equal), > (greater than), < (lower than) and != (not equal).

Tolerance

Tol adds tolerance to the comparison functions which allows for slight variations within the given tolerance.

Tolerance formulas for every comparison operator:

  • Equal: $\left|Result1-Result2\right|\le Tol$
  • Not Equal: $\left|Result1-Result2\right|\gt Tol$
  • Greater: $Result1-Result2 \gt -Tol$
  • Greater or Equal: $Result1-Result2 \ge -Tol$
  • Lower: $Result1-Result2 \lt Tol$
  • Lower or Equal: $Result1-Result2 \le Tol$

Sign Functions

The two buttons change the functions applied on the results of the mod operations between between none, A (Absolute) and N (Negative). Sign functions are applied after the respective rounding functions.

Rounding Functions

The two buttons change the functions applied on the results of the mod operations between NA (none), RN (Round to nearest), FL (Round down) and CE (Round up).

Item Persist

Makes the item or timer given by Item ID persistent between attempts.

Persistent makes the target persistent if enabled and removes persistency if not. Targets continue to be persistent between attempts.

Reset resets the value of the target to 0. It does not clear timers.

TargetAll targets all persistent items or timers.

When persistent, items and timers keep all of their values and settings between attempts. In the case of timers, this includes timer stop options and remaps.

Count triggers are not persistent between attempts, the Count’s stored item value does not get updated on respawn if the Count was activated prior to the checkpoint. If the persistent item value changes after the checkpoint, the Count’s stored value and item value will differ.

While timers are persistent, Time Event triggers are not.

Special items are not affected by Item Persist - Main time and Attempts are persistent, Points are not.

Counter Labels

Displays the value of a given ItemID using a text label. Displays the value of a timer instead if Time Counter is selected.

Special items like Main Time, Points and Attempts can be displayed if the respective option is selected. As these are items, they will not be displayed if Time Counter is selected. Items -1, -2 and -3 can also be used to display the three special items Main Time, Points and Attempts. By default the text of the label is aligned to center, Left Align and Right Align aligns the text to the left and right respectively.

If by any reason the label is not updated properly and displays the wrong value, a Pickup with the same ItemID will update the label even if it doesn’t change the value of the item. Points will not be displayed by a counter label until the first point is obtained.

Item labels will only be updated by a Pickup with the same ID, even if its outside the normal ID range. ItemIDs outside the 0-9999 range refer to ID 0 or 9999 for both items and timers.

Item ID Limits

Shake

Applies a shaking effect to the screen.

Behavior

Shakes the screen by moving the view on both X and Y axes by a random offset multiplied by Strength. The view is offset every Interval until Duration runs out.

UI, Background and Middleground will not move at all. Ground will only move vertically.

Only one shake effect can be active at a time and new shakes override previous ones. This includes the on death shake as well, which can be overriden.

Options

Strength and Duration must both be bigger than 0 for the shake to trigger.

If Interval is 0, the view will offset every render frame.

The lowest value of Strength that can be used is 0.01, which is low enough to be imperceptible.

The max values of a Shake trigger are Strength 100, Interval 0.20s and Duration 10.00s.

All shaking effects can be disabled using the Disable Shake level option.

Change Background

Changes the level’s Background to a different preset. There are currently 59 BG presets.

Only one Background change can be made per render frame. The first will trigger, while any other subsequent BG trigger is ignored until the next frame.

Change Middleground

Changes the level’s Middleground to a different preset. There are currently 3 MG presets.

Only one Middleground change can be made per render frame. The first will trigger, while any other subsequent MG trigger is ignored until the next frame.

Change Ground

Changes the level’s Ground or Line to a different preset. There are currently 22 G presets and 3 Line options.

Only one Ground change can be made per render frame. The first will trigger, while any other subsequent G trigger is ignored until the next frame.

Disable / Enable Player Trail

Disables / Enables the Players’ icon after-effect.

The trail is disabled by default.

Show / Hide Player

Makes the Players visible or invisible.

The Hide P1 / P2 options from the Options trigger can be used to hide or show each player individually.

Players are visible by default.

BG Effect On / Off

Enables / Disables the background particles that appear when your current gamemode is Ship, UFO, Wave or Swing.

This trigger affects the spawning of particles not their visibility, particles will not disappear or reappear instantly.

Gradient

Shaders

Default Camera Properties

Default target is Player 1.

Camera movement based on player movement is done relative to the player, not the screen.

The default gameplay offset when moving left or right is 25 (75 units) and can be modified by Gameplay Offset.

Easing is applied when moving left or right in platformer mode, and is equal to 30 for all modes.

Non-Bordered Camera

Cube and Robot use a non-bordered camera. Camera behavior depends on mode.

In classic mode the camera has a padding of 40 units and an easing of 40.

In platformer mode the camera has a minimum padding of 28 units, which increases based on the player’s velocity up to 159 units.

Bordered Camera

Ship, Ball, UFO, Wave, Spider and Swing use a bordered camera.

Borders are parallel to the ground, and will not rotate if Rotate Gameplay is used.

Camera Mode allows modifying how the camera behaves when the player moves up or down, the default easing is 40 (noted as 10 in Camera Mode) and the max camera-player offset for a padding of 0.5 is equal to -66.

Zoom Camera

Changes the camera’s current Zoom over a Duration of time with an Easing.

Zoom values higher than 1 zoom in, while values lower zoom out. Negative Zoom flips the camera on both axes.

The default value of Zoom is 1.000 and it is limited between 0.400 (x2.5 times zoomed out) and 3.000 (x3 zoomed in). This does not affect the max zoom level that can be hit through easings like back or elastic.

Only one Zoom change can be active globally, new activations overide previous ones.

The C reference of an Advanced Follow trigger follows the bottom-left corner of the screen when zoomed or offset.

Static Camera

Offset Camera

Offsets the camera’s position by Offset X or Offset Y overtime. Offset steps are equal to 3 units, or 1/10th of a block.

Both Offset X and Offset Y are applied unless either X and Y Only are used.

The transition rate can be controlled using Duration and Easing.

Gameplay Offset

Changes the offset between player 1 and the camera’s center applied when the player moves left or right. Offset steps are equal to 3 units, or 1/10th of a block.

X and Y do not refer to the camera’s X and Y, but rather to what axis the player is currently using - Offset X is applied when the player is on the X axis and Offset Y when the player is on the Y axis (with Rotate Gameplay).

Follow behavior depends on the value of the offset - if the value is positive, the camera will be offset ahead of the player, if it’s negative it will be offset behind it. When changing direction the camera will catch up or stay still in order to catch up to the offset for the new direction.

Both Offset X and Offset Y are applied unless either X and Y Only are used.

Dont Zoom makes the offset not scale with zoom. Without Dont Zoom, gameplay offsets are divided by the camera’s current zoom value.

Rotate Camera

Rotates the

If the new rotation of Add

Camera Edge

Defines an object given by Target ID as one of the camera’s Left, Right, Up or Down limit edge.

Target ID must contain a single object or an ID parent.

Edge triggers cannot be stopped, unlocking an edge can only be done by setting the group to an unused group, such as 0, or to a group with more than one target.

The Left edge has priority over Right, and Down has priority over Up.

Camera Edge follows the movement of a target object.

Default Edges

Y = 0 is the lowest the camera’s bottom edge can go and cannot be overriden. It has priority over all other Y axis edges.

X = 30 is the furthest left the camera can go on the first attempt only. It has priority over all other X axis edges and cannot be overriden. On future attempts this edge is not applied.

The ceiling counts as a camera edge and can be overriden by a Down edge, but not by a Top edge. The ceiling is set 240 units above the topmost object. The end wall counts as a camera edge and can be overriden by another Left edge, but not by a Right edge. The end wall is set 355 units right of the rightmost object in classic mode, platformer has no end wall.

Player Camera

Locking the edge moves the camera instantly to a valid position, while unlocking makes the camera ease back towards its normal position.

Static Camera

Camera Edge also affects static cameras. When unlocking the camera, the movement will be instant if the Static Camera doesn’t follow the target, otherwise it will use the follow’s easing value.

Camera Mode

Removes borders for certain gamemodes when Free Mode is selected and changes how the camera behaves when the player moves up or down if Edit Camera Settings is used.

These settings can also be set when switching gamemode using a portal, they have the exact same behavior as the trigger version.

Gamemodes without borders like Cube and Robot are not affected by Camera Mode, not even by the camera settings.

Padding determines the Y offset, this can be calculated by the formula $OffsetY = 130-128 \cdot Padding$

Gameplay borders snapping to the Y axis grid can be disabled with Disable Gridsnap.

Camera Guide

Editor only object which displays a reference outline for the camera’s edges.

Guidelines

The yellow line shows the Player’s X position relative to the camera center.

The green outline shows the camera’s default size, which at zoom 1.000 is 480 by 320 units (or 3:2, NOT 4:3). This area is guaranteed to be visible on all devices.

The orange outline shows the camera’s coverage for the current resolution.

Options

Zoom changes the referenced zoom level for the guide.

Offset X and Offset Y offset the guide from the center object by a small step unit amount.

Preview Opacity modifies the opacity of the camera outlines.

Notes

Camera Guides cannot be rotated in any way.

The position of the yellow line is updated only while playtesting.

Camera Guide objects are often used as reference for triggers such as Static Camera and UI.

UI

Marks objects part of Group ID as UI objects.

Options

If Group ID has a Group ID Parent, all objects in the group will copy the parent’s alignment. This effect is only noticeable when using the Auto or Relative settings, as the other settings apply the same alignment to all objects.

UI Target is used as a reference for the camera’s center; it does not have to be a Camera Guide object, but there’s little reason to use anything else.

UI Target must contain one valid target for UI to activate, if multiple objects are present then you have to define one as the Group ID Parent or else UI will not work.

Alignments

UI objects can be made to keep their position relative to a reference point like the camera’s center or edges using alignments. For example, if a Left alignment is used then the object will keep the same distance from the left edge of the screen on all aspect ratios.

By default, the default screen ratio (Camera Guide’s green outline) is used as reference, NOT your aspect ratio (the orange guideline).

Alignments are split into XRef and YRef, only one alignment is applied at a time depending on your screen’s aspect ratio. If your aspect ratio is wider than default (orange guideline appears on the sides of the camera guide) XRef is used and if its taller than default (guideline appears at the top and bottom) then YRef is used.

Auto makes UI objects align to the closest edge - Left or Right for XRef, Top or Bottom for YRef.

Center applies no alignment, the objects keep their positions relative to the center which is static for all aspect ratios.

Left, Right, Top and Bottom align objects to the respective edge.

Relative makes the objects position scale with the aspect ratio - if your object is 50% of the distance between the camera’s center and the closest edge, it will be 50% of the distance on all aspect ratios. This option ignores all other alignments, it doesn’t matter whether Auto, Center or any other alignment is used.

Behavior

UI is an on-load trigger, it is activated once when the level loads and remains permanently active.

The UI layer is unaffected by ALL camera changes (ex: zoom, rotate, offset, etc).

UI effects do not stack and only one is applied per object, as a result only the first alignment on an object will be applied, and any further UI triggers will skip it. If the parent of a group ID has already been affected by an UI trigger, this group cannot be affected by another UI.

While UI objects render above every other layer, objects part of UI do perserve their layering (layer, Z-order, tileset, blending, etc). It is not possible to differentiate between these sub-layers when using shaders or gradients, as they reference the entire UI layer.

UI objects do not follow the camera’s movement, their position is set on-load and will remain static unless affected by other triggers. When marked as UI, they are moved to the default camera position (the initial camera position when loading the level in classic mode) based on their position relative to UI Target, their alignment settings and your device’s aspect ratio.

Object part of UI can only collide with other UI objects. Hitboxes will no longer collide with the player and UI collision objects will only be able to collide with other UI collision objects. The chunk optimization is skipped by UI collisions, so all UI collisions will check all other UI collisions, just like when using Extended Collision.

Misc Options

Move

Scale

Rotate

Keyframe

Animate Keyframe

Animates keyframes from Animate Group ID on objects from Target Group ID.

Options

Animate Keyframe will play all keyframe animations referenced by Animate Group ID. It does not matter which keyframe from a keyframe animation has Animate Group ID, or if multiple keyframes have the group ID - the keyframe animation will play once per Animate Keyframe activation, always from the start.

Keyframe animations apply on their own Group ID if Target Group ID is 0.

Keyframe scaling & rotation applies on the whole Target Group ID if a GID Parent is present, otherwise it applies individually to each object.

Parent ID

If a Parent ID exists, the movement applied by the keyframe will be transformed by the parent’s scale and rotation. If the target is affected by the same scale and rotation as the parent, then the animation’s movement will be relative to the parent.

For example, when the parent is scaled by 2 and rotated by 180 degrees then the movement applied by the keyframe will be doubled and go in the opposite direction. If the target and parent rotate or scale around the same center, then any animation on the target will be relative to the rotation or scaling.

Parent ID must be unique (either single object or has a GID Parent), otherwise it is ignored.

Scale is separated on X and Y and skew X/Y is ignored. Scaling is applied prior to rotation and is not relative to the parent’s rotation, different X/Y scales combined with rotation will have unexpected effects as a result.

The reference value of scaling is absolute, it will always be positive even if the parent’s scaling is negative.

The scale and rotation of the parent will update dynamically, but will not be updated by other triggers within the same tick.

Modifiers

Modifiers can be used to change the parameters of all animated keyframes.

Time Mod multiplies all keyframe durations. Negative values multiply by 0.00 instead.

Position X and Y Mod multiply the keyframe’s distances on the X and Y axes, where:

$NewPosition_i = Position_0 + (Position_i - Position_0) \cdot PositionMod$

If Position Y Mod is 0.00, it will copy the value of Position X Mod.

Rotation Mod multiplies keyframe rotations, where:

$$ NewRotation_i = (R_{i+1} - R_i) \cdot RotationMod + FullRotations + \begin{cases} -360, & \text{if } (R_{i+1} - R_i) \cdot RotationMod > CW \cdot 180 \ 360, & \text{if } (R_i - R_{i+1}) \cdot RotationMod > CCW \cdot 180 \ 0, & \text{otherwise} \end{cases} $$

The calculation applies Rotation Mod incorrectly when determining how much the rotation should be offset:

  • Rotations should not be multiplied by mod when comparing to CW or CCW.
  • The resulting CW/CCW offset is not multiplied by Rotation Mod, when it should be.
  • Rotation Mod does not multiply x360 rotations, only keyframe object rotations.

Scale X and Y Mod multiply the keyframe’s scales on the X and Y axes, relative to the first keyframe, where:

$NewScale_i = Scale_0 + (Scale_i - Scale_0) \cdot ScaleMod$

Activation

Keyframe parameters are set at the moment of activation - changes to the rotation, scaling and position of keyframes after activation are ignored.

Unlike Move, Scale and Rotate, Animate Keyframe does not have a one tick delay.

Movement Order

If multiple keyframe animations are present on the same target, there are three factors that determine the order they are applied in, from highest priority to lowest:

  • Transformation Order: If one of the keyframes of an animation is scaled, then this animation applies before animations where one of the keyframes rotates but does not scale, which in turn also apply before animations that do not scale or rotate (Scale -> Rotate -> Position).
  • Activation Order: If multiple Keyframe Animate triggers activate and they have the same transform order, the application order depends on the order the Keyframe Animate triggers were activated in.
  • Load Order: If multiple keyframe animations are activated from the same Animate ID and they have the same transform order, the application order depends on the order the keyframes with the target Animate ID are loaded in

Spawning

Keyframes can spawn even if no Group ID or Target ID is defined.

All keyframe spawns happen prior to affecting objects.

If Animate Keyframe is spawned by a keyframe, it’ll activate in the same tick. Spawns with Duration 0.00 will spawn in the same tick, after the current spawns end, in order of activation.

Spawn limits are determined per keyframe object, not Animate Keyframe triggers.

Animate Group ID, Target ID and Parent ID can be remapped.

The Group IDs and Spawn IDs of keyframe objects cannot be remapped, but keyframe spawns inherit remaps from Animate Keyframe.

Stop, Pause & Resume

Stop is not instant for Animate Keyframe - if stopped, the keyframe animation is marked as stopped and will end once the keyframe is processed again, after spawning and applying object transforms. This means the next keyframe change cannot be prevented by stopping.

Paused keyframes are skipped. Stopping while paused does not prevent the next activation, as you can Pause or Resume a keyframe animation that is marked as stopped, if it hasn’t executed its last change yet.

Object Transform Tick Phase

Triggers that transform an object’s parameters like position (including hitbox), rotation or scale are all (with one exception) scheduled - their effects are applied in a given consistent order.

Object Order

  1. Keyframe
  2. Scale
  3. Rotate
  4. Move
  5. Follow Player Y
  6. Advanced Follow
  7. Follow
  8. Area Scale
  9. Area Rotate
  10. Area Move

Object transform trigger activations prior to this tick phase are processed in the current tick, while those after are done in the next tick.

No spawns happen during this phase of the tick, keyframes spawn prior while collisions spawn after.

Color

Changes the RGBA values and blending properties of a given color channel.

For more info on how the color select menu works, check the colors editor guide.

Behavior

Timings

Color changes are registered based on the next rendered frame, not on the game’s ticks.

Only one color change per color channel can be active at once. Color changes include color fades and copy color.

Setting the color channel to a new value (not copy color) is instant.

Color Changes

For fading color changes, the color will fade between the channel’s current color and its new color.

If a color change is overriden by another color change (be it fade or copy), the current color value will be saved as the channel’s color. This color value is static even if it resulted from a copy color - as a result, a channel can copy only one other channel at a time.

Copy color fades are updated whenever the copied channel changes color. If the channel fades towards a copy color, then the color value will fade between the channel’s color and the copied channel’s current color.

Color fading behavior also applies to opacity. Color copy behavior only applies if using Copy Opacity.

Blending changes are instant and cannot be faded.

Color and HSV changes fade in linearly, Legacy HSV makes HSV changes apply instantly regardless of fade.

Spawning

Color can be spawned by other triggers, but cannot be remapped in any way.

Stop

Stopping or Pausing color fades interrupts the color change at it’s current color mix.

Copy color remains active even if the color change was stopped, the current color and the copy color will continue to be mixed at the current fade until resumed or interrupted by another color change.

Due to a bug, stopped color changes will resume when respawning from a checkpoint. Paused color changes will not resume however.

Control IDs do not work on Color triggers. Color cannot be stoped, paused or resumed by a Stop trigger using Control ID.

Pulse

Temporarily changes the RGB values of a given color channel.

Behavior

Pulse triggers cannot change a channel’s opacity or blending properties.

Pulse triggers effects are temporary and are cleared once the Pulse trigger stops being active.

Additionally, color changes done by Pulse triggers cannot be copied by other pulses, color triggers or color channels.

Rendering

Pulses are applied after color changes, object HSV is applied after all pulses and color changes.

Pulses are rendered in the following order, from top to bottom:

  • Group (Color)
  • Group (Color ID + HSV)
  • Group (HSV)
  • Channel (Color ID + HSV)
  • Channel (Color)
  • Channel (HSV)

Stacking

HSV pulses stack together, while pulses that copy or apply a color only combine while fading.

Channel (Color ID + HSV) will disable any pulse below it while active.

Options

Fades

Pulses can fade into the target color or HSV, hold that value then fade out over a period of time.

Color changes fade in linearly, while HSV changes fade in using Ease In (2.00). Static HSV makes HSV changes fade in linearly as well.

Copy Paste

Pulse triggers have the Copy and Paste color option, but do not share the Default color option of Color triggers.

Pulse Mode

The pulse behavior can be changed with the Pulse Mode options Color and HSV.

Color pulses with a solid color given by RGB values or hex code.

HSV can be used to offset the object or channel’s color by Hue, Saturation and Value (or Brightness).

Unlike Color triggers, Pulse Triggers can copy the value of the same channel ID they target.

In the case of pulses the copied value will be the channel’s primary value, so pulses will not copy their own HSV offsets.

Target Type

The pulse target can be modified using the Target Type settings Channel and Group.

Channel applies the pulse effect per channel.

Group applies the pulse effect on all objects part of the group.

Exclusive

A Pulse trigger with Exclusive will clear other pulses active on the same target.

For Channel mode, pulses on the same Channel ID are affected.

For Group mode, pulses on the same Group ID are affected.

Spawning

Pulse triggers can be spawned by other triggers.

Spawning a pulse trigger multiple times will not override previous pulses of the same trigger.

Channel ID and Group ID are remappable, while Color ID is not.

Normally, you are not able to reference channels outside IDs 1-999 (or the special channels). With remapping, you can pulse any channel between 1 and 1101, including special and unused channels that cannot be referenced otherwise.

Pulsing ID 0 or lower will do nothing.

Color Channels higher than 1101 are the same as 1101.

Stopping

Pulse triggers can be stopped, paused and resumed.

Paused pulses will be frozen at the current fade until resumed.

Pulse triggers support Control IDs.

Toggle

Toggles off objects, making them invisible and non-interactible.

Behavior

Toggled objects are invisible and count as being inactive.

The player will not interact with toggled hitboxes, such as solid blocks, spikes or collision blocks.

Collisions

Collision checks are skipped for toggled off collisions.

Dynamics will check their toggle state only once, prior to checking other collisions.

Triggers

Toggled triggers will not activate.

Toggling off a trigger will only prevent it from activating, it will not stop it if it’s already active.

Other triggers also toggle groups on or off, these are:

  • Touch
  • Count
  • Collision
  • Toggle Orb / Block
  • On Death

Alpha

Modifies the opacity of the objects of a target Group ID.

Behavior

Like the Color trigger, the opacity value can fade over a duration from the current to the new value.

Opacity is stored per Group ID. Only one alpha change can be active per group at a time, spawning another overrides the previous one.

An object can be under multiple alpha effects from different groups.

Spawning

Alpha can be spawned by other triggers.

Group ID can be remapped.

Stopping

Stopping or Pausing Alpha triggers stops the fade at its current value.

The fade will continue if Resumed, as long as it hasn’t been overriden by another Alpha trigger.

Alpha supports Control IDs.

Link Visible

Makes all objects part of a group active if at least one of them is active.

Behavior

This trigger is activated on level load no matter where its placed. It cannot be activated later or deactivated in any way.

Objects count as being active if they are on-screen.

Toggle

Toggled off objects count as inactive for Link Visible.

UI

UI objects that are visible on-screen also count as active for Link Visible.

Object Linking

Object Links and Group ID Parents are ignored by Link Visible.

Invisible Objects

Making the object invisible with Hide, Alpha, Opacity or Blending does not make them inactive.

Legacy Enter Effects

Enter Effects

Spawn Trigger

Activates a set of spawn-triggered triggers with the given Group ID instantly or after a Delay.

Spawn Delays

The activation of Spawn triggers can be delayed by a value defined in seconds, up to 0.1 miliseconds in accuracy.

As the game processed delays in ticks and not in miliseconds, the delay is rounded up to the nearest tick. In order to keep delays and loops consistent overtime, this additional delay is passed on further to other Spawn triggers.

The delay’s value can be either positive or negative, and can also be offset randomly using the -/+ option.

Timings

Delay is only applied if it is strictly bigger than 0, otherwise the Spawn trigger is instant.

Spawn delays are processed at the beginning of the tick, in the order they were spawned in.

If a Spawn delay (with positive value, not instant) is spawned by another Spawn delay, it will only be checked starting next tick.

Delay Inheritance

If a Spawn trigger with delay is spawned by another Spawn trigger with delay, the new spawn will subtract the previous one’s additional delay. This keeps chained delays and spawn loops accurate.

Negative delay values are also inherited and reduce the delay of further Spawn triggers by the same amount. Leftovers from randomized delays (-/+ option) are not inherited.

Extra delays are not inherited by any other trigger except Spawn, so this leftover can be cleared if a trigger like Random or Item Compare spawns the next delay.

Extra Spawn Limit

Triggers spawned when delays are processed will be able to spawn the same group once again in the same tick when activated again after the Spawn delay interval.

Spawn Ordered

Spawn Ordered spawns triggers over time similar to ones placed on the timeline. Each spawned trigger has a delay depending on its position, relative to the base (1x) player speed.

This delay is calculated based on the object’s X coordinate from the leftmost trigger in the group. The leftmost triggers are spawned instantly.

While triggers can be moved in order to change their delays, something not possible outside Spawn Ordered, this behavior is buggy and unreliable.

Spawn Remapping

Spawn triggers allow spawning triggers with new groups with Spawn Remapping.

Remapped triggers spawn triggers with groups remapped to other groups.

Remapping does not change the IDs of triggers, it creates independent copies of triggers (called instances) with new IDs.

IDs are not discerned by their type (Item ID, Block ID, Group ID, etc), they are all treated the same for the purposes of remapping.

The main purpose of spawn remapping is reusing triggers, but it has many more uses thanks to its versatility.

Remap Rules

An ID can be remapped to a single other ID at a time. If an ID is remapped to multiple IDs within the same trigger, the highest (last in the list) New ID is used.

If a Spawn trigger with remaps is activated by another remapped trigger, it adds its remaps to it. The new remaps overwrite previous ones if Original IDs are duplicated.

Remappable Triggers

Fully Remappable

  • Move
  • Stop
  • Alpha
  • Toggle
  • Rotate
  • Scale
  • Follow
  • Animate
  • Animate Keyframe
  • Follow Player Y
  • Advanced Follow
  • Edit Advanced Follow
  • Retarget Advanced Follow
  • Edit Area
  • Area Stop
  • Touch
  • Count
  • Instant Count
  • Pickup
  • Time
  • Time Event
  • Time Control
  • Item Edit
  • Item Compare
  • Item Persist
  • Random
  • Advanced Random
  • Sequence
  • Spawn Particle
  • Reset Pickups
  • Static Camera
  • Camera Edge
  • Song
  • Edit Song
  • SFX
  • Edit SFX
  • Collision
  • Instant Collision
  • On Death
  • End
  • Teleport
  • Shock Wave
  • Shock Line
  • Lens Circle
  • Radial Blur
  • Motion Blur
  • Bulge
  • Pinch
  • Gray Scale
  • Enter Triggers (except Enter Tint)
  • Enter Stop

Not Remappable

  • Color
  • Keyframes
  • Rotate Gameplay
  • Gradient
  • Checkpoint
  • Legacy Enter triggers (not spawnable)

Partially Remappable

Group Settings

  • Control ID
  • Group ID, Parent ID, ORD, CH, Material ID

Pulse

  • Channel ID, Group ID
  • Color ID

Spawn

  • Group ID, New Group ID
  • Original Group ID

Area Triggers

  • Target Group ID, Center Group ID
  • Effect ID, Color Channel (Area Tint)

Enter Tint Effect

  • Enter Channel, Effect ID
  • Color Channel

Notes

Pulse

You can remap what groups or color channels are affected, but not the copied channel. Pulse’s Color ID is the color channel affected by the trigger and Channel ID is the copied channel, the names of the options are swapped for the Color trigger.

Spawn

Spawn ID and New Group ID can only be remapped from another Spawn trigger. New Group IDs will not be remapped by other spawn triggers if using Reset Remap.

Edit Adv Follow

Edit Advanced Follow has no effect on type 1 Advanced Follow. Target GID is the group ID of the target object. However, with Target Control ID selected Target GID is the control ID of the Advanced Follow Trigger.

Re-Target AdvFollow

Target GID is the group ID of the Advanced Follow trigger being re-targeted, not the target object.

Sequence

Without Unique Remap, any activation of the same Sequence trigger advances the same (single) counter, regardless of remaps. With the option selected, every remap origin has its own Sequence counter, allowing for multiple concurrent instances of Sequence from the same trigger. Despite the name, if you call the same Sequence trigger with two spawn triggers with identical remaps, they will not share the same counter.

Song

Custom Song ID can also be remapped, and any downloaded song can be played.

Songs played via remapping will not show in the download list however.

Without mods or scripts you are not able to type an ID higher than 999999, which makes choosing an Audio Library song difficult.

SFX

Custom SFX ID can also be remapped, and any downloaded SFX can be played.

SFX played via remapping will not show in the download list however.

Gradient

In editor preview, remapping the ID has no effect. However, in playtesting, remapping the ID makes the gradient not spawn.

Legacy Enter Triggers

It does not seem like you can spawn these triggers as of version 2.208.

Remap Inheritance

Triggers that spawn groups also pass on their remaps to the activated triggers. In other words, the spawn target inherits the spawn trigger’s remaps.

Spawn triggers with remap inheritance

  • Instant Count
  • Item Compare
  • Collision
  • Instant Collision
  • Random
  • Advanced Random
  • Sequence
  • Event
  • On Death
  • End
  • Touch
  • Keyframe
  • Count
  • Spawn
  • Time

Notes & Exceptions

Count

Yes if Multi Activated is selected, otherwise the target inherits the remaps of the oldest subsequent multi activated Count with the same ItemID.

Spawn

Yes, unless Reset Remap is selected.

Timers

Remaps of Time triggers are stored inside timers.

Remaps can only be assigned when the timer is initialized, Time triggers update the timer’s settings and groups, but not the timer’s remaps.

The only way to clear these remaps is to use a Stop trigger on one the groups or control IDs of the last Time trigger called for that ItemID.

Pause, Resume and Time Control will not reset remaps.

Assigning a value to a timer Item ID with Item Edit creates a paused timer instance with no remaps.

Instant Collision

Resets remaps prior to version 2.208.

Time Event

Makes the timer with the given Item ID spawn a group, so the spawn uses the timer’s remaps.

Checkpoint

Cannot be remapped, resets remaps.

ID Limits

Spawn remapping allows you to remap any ID value, except identical IDs. Out of bounds IDs are limited only when a trigger is spawned.

Spawn Order

The activation order of triggers is the order they were spawned in, also known as the spawn order. By default, this is applied horizontally from left to right. If multiple triggers share the same horizontal position, they will activate in the order they were placed in.

ORD can be used to enforce an activation order for triggers without the spawn or touch trigger option which activate in the same tick.

The following triggers have additional ordering mechanisms which are applied before spawn order:

Count

First ordered by Target Count in ascending or descending order depending on whether the last item change increased or decreased the value. Count activates after every Pickup or Item Edit trigger with the Item option, even if the value remains the same. In this case ascending order is used. If Target Count is the same, spawn order will be used.

Time

Activation order is different between platforms - on Steam they have normal spawn order, on Android their spawn order is reversed.

Time Event

Activation order depends on the spawn order of Timer triggers for different Item IDs. If Item IDs are identical, spawn order is used.

Collision

Activation order depends on the order collision objects are checked. Player collisions are checked before dynamic collisions. If two collision triggers share the same collision IDs, spawn order is used. The order of the IDs does not matter.

Area Triggers

Priority is applied first, from highest first to lowest last. If Priority is the same, spawn order is used.

Advanced Follow

Priority is applied first, from highest first to lowest last. If Priority is the same, spawn order is used.

Spawn Schedule

While some spawns activate instantly, most of them are scheduled and activate in a specific order throughout the game tick.

Instant spawns

  • Spawn
  • Count
  • Instant Count
  • Instant Collision
  • Item Compare
  • Random
  • Advanced Random
  • Sequence
  • End
  • Checkpoint (Spawn)

Scheduled spawns (in order)

  1. Checkpoint (Respawn)
  2. Spawn (delay)
  3. Toggle Orb/Block
  4. Event
  5. Touch
  6. Timer & Time Event
  7. Keyframe
  8. Collision (on enter)
  9. State (on enter)
  10. Instant (touch triggered)
  11. State (on exit)
  12. On Death
  13. Instant (from timeline)
  14. Collision (on exit)

Activation Limits

All triggers can be spawned multiple times per tick, but not all can activate or create multiple instances per tick.

Spawn Limit

Without remaps, a spawn trigger can spawn the same group once per reset. There are two resets per tick, before and after Spawn triggers with delay are scheduled. As a result, you can activate the same spawn group from a single Spawn trigger twice per tick - one time from a Spawn trigger with delay, and another time from any other spawn.

While the applications of this are limited, having the option of a second activation per tick is very important for instanced spawn triggers like Count and Sequence, where otherwise each instance would only be able to activate once per tick which can interfere if the spawn is either on a timer or by player input.

With remaps, the spawn limit is applied separately for each remap origin. The remap origin is the first remapped trigger in a spawn chain.

Whether the spawned trigger has any of its IDs remapped does not matter, it can be any remap.

Remap Resets

Triggers that reset remaps can spawn the same group only once per tick. New remap origins can be assigned after a remap reset.

The remaps of a Spawn trigger with the Reset Remap option are reset before the Spawn trigger is spawned, so the Spawn trigger becomes the remap origin. If the Timer has no remaps, Time Event will spawn the group without remaps. Checkpoint and Instant Collision reset remaps.

Other Spawn Triggers

Animate Trigger

Animates monsters and other objects with the Animate on Trigger setting (animations, particles).

Behavior

Objects affected by Animate Trigger:

918, 920, 921, 923, 924, 1050, 1051, 1052, 1053, 1054, 1329, 1516, 1518, 1519, 1583, 1584, 1591, 1592, 1593, 1614, 1618, 1697, 1698, 1699, 1839, 1840, 1841, 1842, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1860, 1936, 1937, 1938, 1939, 2012, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2065, 2223, 2246, 2605, 2629, 2630, 2694, 2864, 2865, 2867, 2868, 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 3001, 3002, 3119, 3120, 3121, 3219, 3303, 3304, 3482, 3483, 3484, 3492, 3493, 4211, 4300

Monsters

Makes the targeted monsters switch to the animation given by Animation ID. Animation IDs are used only by monsters and have no effect on any other object.

The transition between animations is done smoothly over a period of 0.05 seconds. If the animation is already active, then it’ll reset to the beginning.

Invalid IDs play the default animation (ID 0).

Big (918):

  • 0: bite
  • 1: attack01
  • 2: attack01_end
  • 3: idle01

Bat (1584):

  • 0: idle01
  • 1: idle02
  • 2: idle03
  • 3: attack01
  • 4: attack02
  • 5: attack02_end
  • 6: sleep
  • 7: sleep_loop
  • 8: sleep_end
  • 9: attack02_loop

Spikeball (2012):

  • 0: idle01
  • 1: idle02
  • 2: toAttack01
  • 3: attack01
  • 4: attack02
  • 5: toAttack03
  • 6: attack03
  • 7: idle03
  • 8: fromAttack03

Particles

Animates particle objects with the Animate on Trigger property. Any remaining particles still connected to the target object are cleared when activated by Animate Trigger.

Animated particle objects start inactive until activated by Animate Trigger. If emitter duration is infinite, the particles will continue to spawn indefinitely as long as they are active. If duration is non-infinite, the particles will spawn once without looping.

Inactive particle objects are ignored if they have the Only if Active property.

Animated Objects

Animates objects with the Animate on Trigger property. The animation plays once from the start and does not loop.

Animated objects start invisible if on-screen but will be visible if reloaded, they will turn invisible once the animation ends.

Inactive objects are ignored if they have the Only if Active property.

Single Frame and Offset Anim properties are ignored when animating.

Animated Objects

Monsters and animated ground spikes do not have an animation menu and cannot have these properties applied to them through save file editing.

Checkpoint objects have their elements move overtime, but this does not count as an animation and like monsters they are not affected by animation settings.

The coin and user coin collectible objects can be edited, but the menu is overriden by the Edit Pickup Settings menu and it is only accessible if you also select an animated object.

Scale circles do not have animation frames and instead scale and fade overtime. Use Speed is force selected by the game and frame options like Single Frame and Offset Anim have no effect.

Similarly, some gameplay elements (orbs) and decorations scale in sync with the music. They do not count as animated objects and thus are not affected by animation settings.

The lava bubble objects ignore all animation settings except Animate on Trigger and Only if Active. Additionally, one of them is randomized between 3 possible animations on level load.

The laser wall object has some of its frames randomized regardless of any settings used.

Objects animated using scale, rotate, move or fade effects animate smoothly every frame. Monster animation transitions are also done smoothly. Most other animated objects are made up of multiple sequential frames with a set frame delay between each frame.

Object IDs

All objects affected by Edit Animation:

920, 921, 923, 924, 1050, 1051, 1052, 1053, 1054, 1329, 1516, 1518, 1519, 1583, 1591, 1592, 1593, 1614, 1618, 1697, 1698, 1699, 1839, 1840, 1841, 1842, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1860, 1936, 1937, 1938, 1939, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2223, 2246, 2605, 2629, 2630, 2694, 2864, 2865, 2867, 2868, 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 3001, 3002, 3119, 3120, 3121, 3219, 3303, 3304, 3482, 3483, 3484, 3492, 3493, 4211, 4300

Objects in the Animate tab not affected by Edit Animation:

918, 919, 1327, 1328, 1584, 2012

Not random or delayed:

1050, 1051, 1052, 1053, 1054, 1329, 1592, 1614, 2605, 2694, 3001, 3002, 4211

Affected by Random Start:

920, 921, 923, 924, 1516, 1518, 1519, 1583, 1618, 1697, 1698, 1699, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1860, 1936, 1937, 1938, 1939, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2223, 2246, 2629, 2630, 2864, 2865, 2867, 2869, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 3119, 3120, 3121, 3219, 3303, 3304, 3482, 3483, 3484, 3492, 3493, 4300

Affected by Delayed Loop:

921, 1519, 1618, 1851, 1852, 1854, 1855, 1856, 1860, 2020, 2021, 2022, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2033, 2035, 2036, 2037, 2038, 2039, 2040, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2867, 2868, 2869, 2870, 2871, 2872, 2875, 2876, 2877, 2878, 2880, 2882, 2883, 2885, 2886, 2887

Affected by Disable AnimShine:

2046, 2047, 2055

Collectibles affected by Edit Animation:

1329, 1614

With smooth, non-frame animations:

1839, 1840, 1841, 1842

With randomized frames:

1697

With random animations:

1591

Pixelated:

2223, 2246, 2605, 2629, 2630, 2694, 3119, 3120, 3121, 3219, 3303, 3304, 3482, 3483, 3484, 3492, 3493, 4211, 4300

Lava Bubbles:

1591, 1593

By Frame Delay

Delay 0.0250:

2892

Delay 0.0333:

2893

Delay 0.0400:

2047

Delay 0.0450:

1053, 1592

Delay 0.0500:

1050, 1051, 1052, 1516, 1518, 1618, 1860, 2020, 2021, 2022, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2890, 2891, 2894, 3001, 3002

Delay 0.0600:

1054, 1519, 1697, 1698, 1699, 1855, 1857, 2023, 2864, 2865, 2867, 2868, 2877, 2878, 2879, 2887, 2888, 2889

Delay 0.0700:

1849, 1851, 1852, 1854, 1856, 1936, 1937, 1938, 1939

Delay 0.0800:

920, 921, 923, 924, 1583, 1853, 1858, 2034, 4300

Delay 0.1000:

1850, 2223, 2246, 2605, 2629, 2630

Delay 0.1150:

1329

Delay 0.1200:

1591, 1614, 3303, 3304, 3482, 3483, 3484, 3492, 3493, 4211

Delay 0.1300:

1591, 1593

Delay 0.1600:

2694, 3119, 3120, 3121, 3219

Frame Delays of Monsters

Big (918):

  • 0: 0.0250
  • 1: 0.0250
  • 2: 0.0250
  • 3: 0.0500

Big Spiked (1327):

  • 0: 0.0600

Small Spiked (1328):

  • 0: 0.0600

Bat (1584):

  • 0: 0.0600
  • 1: 0.0600
  • 2: 0.0600
  • 3: 0.0600
  • 4: 0.0600
  • 5: 0.0600
  • 6: 0.0600
  • 7: 0.1000
  • 8: 0.0600
  • 9: 0.0500

Spikeball (2012):

  • 0: 0.0600
  • 1: 0.0600
  • 2: 0.0450
  • 3: 0.0600
  • 4: 0.0600
  • 5: 0.0400
  • 6: 0.0400
  • 7: 0.0600
  • 8: 0.0500

Edit Animation Settings

Allows editing the playback settings of animated objects, accessible from the Edit Special button.

Options

Randomize Start is assigned by default on some animated objects, but currently does nothing.

Use Speed multiplies the animation’s playback by the Speed option and removes the random start offset on selected objects if Speed is not 0. Negative Speed values can also be used.

Animate on Trigger makes the animation play from the start when activated by an Animate trigger, the animation plays once and does not loop. Animated objects start invisible if on-screen but will be visible if loaded later, they will turn invisible once the animation ends. Inactive objects (toggled off or offscreen) are ignored if Only if Active is selected.

Disable Delayed Loop removes the random delay some animations have between loops.

Disable AnimShine removes the white texture from a few animated objects. This property is removed by the game if used on objects this option has no effect on.

Single Frame makes the animation freeze on the selected frame. Offset Anim offsets the animation by the frame amount set in Single Frame instead. Objects animated by Animate on Trigger will not be offset.

Particle Object

Allows the creation of custom particle effects tied to objects.

Particle Editor

Particle properties can be edited from the Particle Editor accessible from Edit Special.

The editor is split into 4 main tabs (Motion, Visual, Extra & Texture) with an interactible preview on the bottom left side of the menu.

The Texture tab selects the particle’s texture.

Randomization

Most particle variables can be randomized in a range using a +- variable found next to the base one.

Randomized settings

  • Lifetime +-
  • Angle +-
  • Speed +-
  • AccelRad +-
  • AccelTan +-
  • StartRad +-
  • EndRad +-
  • RotSec +-
  • StartSize +-
  • EndSize +-
  • StartSpin +-
  • EndSpin +-
  • Start_R +-
  • Start_G +-
  • Start_B +-
  • **Start_A +- **
  • End_R +-
  • End_G +-
  • End_B +-
  • End_A +-
  • Fade In +-
  • Fade Out +-
  • FrictionP +-
  • FrictionS +-
  • FrictionR +-
  • Respawn +-

Copy Paste

C and P can be used to copy & paste the particle settings between different particle objects. Copied settings are lost when exiting the editor.

Interactible Preview

Previews the current particle effect. The preview is interactible and can be used to pan around or change some particle effects by touch.

Options 1, 2 and 3 change what settings are being edited by touching the preview. Only one can be active at a time, and if none are selected dragging pans the preview. Options can be deselected by clicking them once again.

Options edit different settings for Gravity and Radius modes, these are:

Gravity

  • Option 1: PosVar X & PosVar Y (rendered as green rectangle)
  • Option 2: Gravity X & Gravity Y (cyan line) -Option 3: Speed & Angle (yellow line, angle random is represented as a yellow semicircle but is not edited)

Radius

  • Option 1: StartRad (green semicircle)
  • Option 2: EndRad (orange semicircle)
  • Option 3: Angle (not represented, all options render at once, semicircle arc depends on angle random, if 0 none render)

Two more buttons, C and a color box affect the preview box. C recenters the screen back to the particle’s origin, the preview’s background color can be set from the preview box - it is black by default and is reset when closing the menu.

Motion

Particle settings that affect motion and emission behavior. Two motion modes are available - Gravity and Radius.

Common

Max Particles is the max amount of particles that can be active at once, any further particles will fail to spawn.

Duration is the amount of time the emitter spawns particles. The emitter spawns particles until Duration runs out, and once the lifetime of all remaining particles expires then the emitter despawns and is replaced by another emitter by the particle object. Duration is infinite if set to -1 so the emitter will not stop spawning particles unless the particle object is unloaded. If value is 0 particles will not spawn unless Emission is -1.

Lifetime is the lifetime of the particle.

Emission is the amount of particles that can spawn per second. Emission also delays the first particle spawn by $1/Emission$ seconds, if the delay is bigger than Duration then no particles will spawn. If Emission is -1 then emission is infinite - the emitter will try to respawn all particles every frame without delay. Max sets Emission to -1, Calc calculates Emission using the formula $MaxParticle/(Lifetime+LifetimeRand)$.

Angle is the starting angle of the particle’s motion. The value is given in degrees with 0 pointing right, positive values offset the angle clockwise and negative ones offset counter-clockwise.

Gravity

Speed is the particle’s starting velocity, given in units (small steps) per second. All acceleration settings change the particle’s velocity by $accel/100$ units per second.

PosVar X and PosVar Y give a range in units that randomize the particle’s offset on the X and Y axis from the emitter’s origin.

Gravity X and Gravity Y applies acceleration on the X and Y axes towards positive values, negative values accelerate away from positive and towards negative instead.

AccelRad applies acceleration away from the emitter’s origin for positive values and towards the origin for negative ones.

AccelTan applies acceleration tangential to the particle’s current direction, positive values accelerate clockwise while negative ones counter-clockwise.

AccelRad and AccelTan are not applied if velocity is null.

Radius

StartRad and EndRad are the radial distances in units the particle starts from and ends at respectively. This movement is unaffected by FrictionP.

RotSec is the amount of degrees per second by which particles rotate around the emitter’s center. Rotation is done in whole degree increments, so at low values the rotation is choppy.

Visual

Particle settings that affect scaling, rotation and color (RGBA) values.

Scale & Rotation

StartSize is the particle’s initial scale, while EndSize is its final scale. Scale 16 is equivalent to the scale of the object variant of the particle.

StartSpin is the initial rotation of the particle texture, while EndSpin is its final rotation. This rotation offsets texture rotations done by Start Rot is Dir and Dynamic Rotation.

Colors

Start and End RGB values for the particles can be set in two ways:

  • Using the two color pickers found on the top left of the menu
  • Individual Start and End variables for each color channel, normalized to 1.00 (Start_R, Start_B, Start_G, End_R, End_B, End_G)

The <> button next to the color selectors copies the main color to the secondary color. Changing the color from the color picker updates the RGB variables instantly, but changing the RGB variables updates the colors from the picker only when you reopen the particle editor. Particle objects store RGBA as normalized values with 1% accuracy, rounding to the nearest value when converted to 8-bit RGBA.

Alpha cannot be set from the color picker, it can only be edited using the two Start_A and End_A variables.

Extra

Miscellaneous particle settings and extra options that do not fit in other tabs.

Free, Relative & Grouped

Free, Relative and Grouped change what point of reference the particles are relative to (camera, world, object)

  • Free makes the particles copy the camera’s movement and the opposite of the object’s movement (particles appear relative to camera).
  • Relative makes the particles copy the opposite of the object’s movement. (particles appear relative to world).
  • Grouped is default and applies no extra movement (particles appear relative to emitter).

How the particle object’s scaling and rotation affects the spawned particles is different between Free / Relative and Grouped:

  • With Grouped, the particle object can be scaled and rotated like normal.
  • With Free & Relative, the game adds a special property to the particle object when you save the level which makes particles ignore the object’s scale, warp and rotate; ignore rotations done by rotate triggers; if scaled by a trigger, scale the particles by either X or Y scale, whichever is smaller (but not equal to 1).

This may appear inconsistent when testing in the editor, because the particle is updated only when re-entering the editor.

Particle objects can be warped and skewed and this will warp the emitter, but if the object was already warped before the emitter is created, then the emitter will not have the object’s warping.

Fade, Friction & Respawn

Fade In and Fade Out add fades to the start and end of particles.

Min fade duration is 0, while max duration depends on the lifetime - Fade In is limited by the particle’s lifetime, while Fade Out is limited to whatever time is left after Fade In. Both fades stack together with alpha.

There are 3 unique friction values that each affect one of the particle’s transformations:

  • FrictionP (velocity)
  • FrictionS (scale)
  • FrictionR (rotation)

All three friction settings can be approximated by an exponential decay function optimized for different frame rates:

$Gradient = Gradient \cdot exp(-Friction \cdot FrameDelay)$.

For FrictionP gradient is speed, for FrictionS gradient is $(EndScale-StartScale)/Lifetime$ and for FrictionR gradient is $(EndSpin - StartSpin) / Lifetime$. Frame delay is truncated to 4 decimals, since the friction required to match Advance Follow is ~2.44 to 1.00.

FrictionP is only applied to gravity mode, FrictionR is only applied to spin and not Dynamic Rotation.

Respawn is how long it takes for a particle object to respawn an emitter with a finite Duration after the current one expires.

Misc Settings

Additive makes particles blend. Also works for Use Obj Color and Uniform Obj Color in some cases, but changes how alpha is calculated in a non-intuitive way.

Start Size = End increases the particle’s end size by its start size. This is particularly useful if StartSize is randomized and you want the particle to change or keep its end size relative to it.

Start Spin = End does the same thing for spin (rotation) and Start Rad = End does the same for radius.

Start Rot is Dir makes the particle’s rotation match its start Angle.

Use Obj Color makes the particle use the particle object’s colors instead of the emitter’s RGB values. These colors are set at the creation of each particle and do not update if the parent object changes color. Base RGB variables are ignored, but RGB can still be randomized using the +- options.

Uniform Obj Color makes the particle copy the particle object’s colors dynamically. All particle color options besides alpha are ignored.

Dynamic Rotation makes the particle rotate dynamically in the direction of movement.

Animate On Trigger allows activating the particle object with an Animate trigger. Animated particle objects start inactive until activated by Animate Trigger, any remaining particles still connected to the target object are also cleared.

If Duration is infinite, the particles will continue to spawn indefinitely as long as they are active, otherwise they will spawn once without looping.

Inactive particle objects are ignored if they have the Only If Active property.

Order Sensitive makes newer particles from the same emitter layer above older ones, without this option the layering / render order is randomized.

StartRGB Var Sync and EndRGB Var Sync replace Start and End RGB randomization with lightness randomization (brightness and saturation only are randomized) - the R channel Start_R +- and End_R +- options are used to randomize lightness, B and G random options are ignored.

Quick Start makes the particle skip simulating the first 2 seconds when starting if Duration is infinite. A particle with Quick Start still connected to its parent object will persist to the next attempt, even if resetting all checkpoints.

Misc Behavior

Particles animate by frame, not by tick. Visuals are going to differ between devices with different framerates - particles with very high emissions will not look as smooth on lower framerates and have more clumps if not randomized.

Particles have a softcap of 100k particles active at once, if the softcap is hit any further particle objects that become active will not spawn particles until reloaded. The softcap can be passed by an emitter that goes over the limit. The total particle count is calculated based on the emitter’s max particle property, not its current particle count, so avoid oversizing the value of max particle. The particle softcap is not used in the level editor.

Particle objects do not unload correctly in normal mode, but they do in the editor. Emitters tied to particle objects are not cleared if the object is unloaded, and continue being active until they despawn on their own. These emitters are disconnected from the object that created them, so any particle setting that depends on the parent object will stop updating. When the particle object becomes active again, it will create a new emitter separate from the previous one.

Alpha & Blending Behavior

Alpha values are calculated differently depending on the options selected, below you can find a table approximating these calculations.

AdditiveObj ColorUniform ColorBlendingSolid AlphaBlending Alpha
NoNoNoEither$(start \cdot (1-t)+end*t) \cdot base$-
NoNoYesNo$(start \cdot (1-t)+end \cdot t) \cdot base$-
NoNoYesNo$(start \cdot (1-t)+end \cdot t) \cdot base$-
NoYesNoNo$(base \cdot (1-t)+end \cdot t) \cdot base$-
NoYesNoYes-$(base^2 \cdot (1-t)+end \cdot t) \cdot base^2$
EitherNoYesYes-$(start \cdot (1-t)+end \cdot t) \cdot base^2$
YesYesNoNo$(base \cdot (1-t)+end \cdot t) \cdot base$$((1-base) \cdot (1-t)+(1-end) \cdot t) \cdot base$
YesYesNoYes-$(base \cdot (1-t)+end \cdot t) \cdot base^2$
YesNoNoEither-$(start \cdot (1-t)+end \cdot t) \cdot base^2$
YesNoYesNo$(start \cdot (1-t)+end \cdot t) \cdot base$$((1-start) \cdot (1-t)+(1-end) \cdot t) \cdot base$

Notes:

  • $start$ is the initial alpha, equal to: $Start\textunderscore A+Start\textunderscore A\textunderscore Rand$
  • $end$ is the final alpha, equal to: $End\textunderscore A+End\textunderscore A\textunderscore Rand$
  • $base$ is the alpha (opacity) of the base color channel.
    • The detail color channel’s opacity is not used by particles.
    • Use Obj Color replaces $start$ with $base$ in all calculations.
    • $base$ is applied multiple times in some equations.
  • For a particle to count as blending either the base or detail color must be blending.
    • If Use Obj Color or Uniform Obj Color are used with Additive but neither color channels blend, then the particle renders as both normal and additive.
  • The resulting color for one particle is equal to: $BG\textunderscore RGB*(1-Solid\textunderscore Alpha)+Particle\textunderscore RGB*(Solid\textunderscore Alpha+Blending\textunderscore Alpha)$

Spawn Particle

Spawns particles from particle objects in Particle Group at a target’s position in Position Group.

Spawn Particle only works on particle objects, it cannot spawn the particles of other objects like pads or portals.

Options

Offset X / Y offset the particle’s spawn position by a set amount on the X / Y axis. OffVar X / Y further offset the spawn position randomly in a +/- range. All offsets are given in units (1/30 block).

Rotation offsets the rotation of spawned particles.

Scale multiplies the scale of spawned particle.

Match Rot adds the target object’s rotation to the spawned particles.

Rotation and Scale can be randomized using the respective +- option.

Group ID Parents

Group ID Parents change how Particle Group and Position Group work when they contain multiple objects.

If Particle Group has no GID Parent particles spawn individually at the target’s position, using their own center for scale and rotation. If a GID Parent is present it becomes the center of the group - particles spawn relative to it, scale and rotation apply on the whole group.

For Position Group the GID Parent enforces an object as the target, without it the target is picked at random from all objects in the group.

Group Parents, Area Parents and object links have no effect on spawned particles.

Differences from object particles

Infinite Duration is set to 0.00, if Emission is not infinite then no particles will spawn.

Spawned particle emitters do not respawn, therefore Respawn is ignored.

Particle emitters created by Spawn Particle are not tied to any object and cannot be repositioned after spawning, therefore Relative has the exact same behavior as Grouped. Additionally, Free and Relative emitters can be rotated or scaled which will also rotate and scale all movement, including Free’s camera movement.

Particle emitters created by Spawn Particle ignore most of the properties of the parent object except:

  • rotation
  • scale (X and Y, but not warp skew)
  • position (if Particle Group has an ID Parent)
  • Z order & layer
  • if either Use Obj Color or Uniform Obj Color are used - the object’s current base & detail colors (after all color changes, except Area Tint), but not alpha value (from color channel or triggers) or blending.

Particle colors do not update dynamically with Uniform Obj Color, the behavior for Spawn Particle is identical to Use Obj Color.

Alpha and blending behavior of emitters created by Spawn Particle is consistent between all combinations of Additive, Use Obj Color and Uniform Obj Color:

  • base object opacity is ignored
  • Start_A is not ignored when Use Obj Color is selected
  • Particles will not fade between solid / blending

Frame behavior

Spawn Particle uses the target’s last active position, updated every frame (not tick) - this has two detrimental effects:

  • If the target moves very fast (or instantly) and the game runs at a framerate lower than 240Hz, particles can spawn “earlier” than they should
  • If the target becomes inactive by moving off screen, the particle will spawn on screen instead of at the target’s current position

The second issue can be worked around by using a Link Visible trigger and keeping one object on screen at all times.

Stop

Stops, pauses or resumes a set of triggers given by Group or Control ID.

Valid Targets

Triggers affected by Stop

  • Color
  • Move (if not silent)
  • Pulse
  • Alpha
  • Spawn (if delayed)
  • Rotate
  • Scale
  • Follow
  • Keyframe Animation
  • Follow Player Y
  • Advanced Follow
  • Area Triggers
  • Touch
  • Count
  • Time
  • Time Event
  • Zoom Camera
  • Offset Camera
  • Rotate Camera
  • SFX
  • Event
  • Collision
  • On Death
  • Gradient

Exceptions

Triggers not affected by Stop

  • Shake
  • Edit Area Triggers
  • Spawn Particle
  • Static Camera
  • Gameplay Offset
  • Camera Edge
  • Song
  • Edit Song
  • Edit SFX
  • UI
  • Link Visible
  • Shader Triggers
  • Enter Triggers

Alternative Stops

Some of the active triggers, including ones not affected by Stop, have alternative stopping or pausing mechanisms.

Edit Area

Edit Area effects are done by the Area trigger, pausing or stopping the Edit Area requires respawning, stopping or pausing the target Area trigger.

Time

Can start paused, or be paused using a Time Control trigger.

This pause is different from the one done by Pause - it will not resume a Pause trigger and it cannot be resumed by Stop.

Static Camera

The follow cannot be stopped, but the target can be returned back to default by using the Exit Static option.

Camera Edge

Locked edges can be reset using ID 0 and with the Unlock button.

Song

Can be stopped by Channel ID with an Edit Song trigger.

SFX

Can be stopped by Unique, SFX Group or Group ID with an Edit SFX trigger.

Gradient

Can be stopped by using the Disable option.

All active gradients can be cleared with the Disable All option.

Shader Triggers

All shaders effects can be disabled using the Shader trigger’s Disable All option.

Chroma Glitch shader can be disabled using the trigger’s Disable option.

Enter Triggers

Enter effects can be cleared using their Enter Channel or Effect ID from the Enter Stop trigger.

Item Persist

While not an active trigger, the item or timer’s persistent flag can be reset using the Reset option, which also clears the value or Reset All, which affects all persistent items and timers.

Stop Effect

The effect of a Stop, Pause or Resume trigger on other triggers varies, but can be split into three main categories:

Effect is paused or stops applying

  • Color
  • Move
  • Alpha
  • Rotate
  • Scale
  • Follow
  • Keyframe Animation
  • Follow Player Y
  • Advanced Follow
  • Zoom Camera
  • Offset Camera
  • Rotate Camera

Effect gets cleared or is undone

  • Pulse
  • Area Triggers
  • Time (settings reset)
  • SFX
  • Gradient

Activation is prevented

  • Spawn
  • Touch
  • Count
  • Time
  • Time Event
  • Event
  • Collision
  • On Death

Notes

Color

The last stopped Color trigger on the channel before a checkpoint gets resumed when respawning.

Keyframe Animation

Spawning in the same tick cannot be prevented with Stop.

Spawn

Stopping a Spawn trigger with delay from inside another Spawn trigger with delay causes the last scheduled Spawn delay to be checked twice in the same tick. If this delay activates, the first activation uses the Spawn’s remaps, while the second uses no remaps.

If a Spawn Ordered trigger is stopped, it will stop spawning triggers. If its the last one, it will continue spawning without remaps from the stop point.

Paused Spawn delays are ignored and will not tick down until resuming.

Delays can be resumed (or paused) and activate (or not activate) in the same tick as long as they haven’t been checked yet.

Durations

Durations

Triggers with a set Duration calculate their effects using time values ($TimeElapsed / Duration$).

Elapsed time increases by $1/TickRate$ seconds every tick.

Triggers last for $Duration \cdot TickRate$ amount of ticks, rounded up - the last tick limits the elapsed time so it doesn’t overshoot the duration.

Example: a duration of 0.19 is proportional to 45.6 ticks, the trigger will last 46 ticks total with the last tick having a smaller change than the rest.

Easings

Limited IDs

Group IDs

Trying to assign ID values outside 0-9999 is not possible. Any value below 1 refers to ID 0. Any value above 9999 refers to ID 9999.

Color Channels

Trying to assign ID values outside 0-999 is not possible. Values below 1 do nothing. Values between 1000-1101 are reserved for special color channels.

Any value above 1101 refers to ID 1101.

Item IDs

Values below 0 are reserved for special items (-1 is Time, -2 is Points, -3 is Attempts). Pickup, Item Edit and Item Compare can reference (but not change, they get limited to 0 or 9999) IDs outside 0-9999. Item Edit cannot use ID 0 as a parameter. Time, Time Event and Time Control can reference and use IDs outside 0-9999. As Item Compare and Item Edit cannot reference out of bounds IDs, accessing the values of these timers is not possible. It is however possible to store remaps inside timers and spawn a group with those remaps using Time Event.

Song Channels

Trying to assign ID values outside 0-4 is not possible. Any value below 1 refers to ID 0. Any value above 4 refers to ID 4.

Collision IDs

Same as Group IDs.

Gradient IDs

  • Trying to assign ID values outside 0-999 is not possible without mods or scripts.
  • Builder helper can assign at most to ID 1000.

Extended Limit IDs

IDs with extended limits can be assigned beyond the usual 10000 ID limit. ID values outside 0-9999 cannot be assigned inside (most) triggers, but can be referenced via remapping.

IDs with extended limit

  • Control IDs
  • Area Effect IDs
  • Enter Effect IDs
  • Item IDs (timers only)
  • Material IDs (between −/+ 32767)
  • Enter Channels (between −/+ 32767)
  • SFX IDs
  • SFX Groups

Bugs

Criteria for bugs

The way i classify a certain behavior as a bug is entirely subjective, but there are two main criterias i follow:

  1. Does it seem intentional?
  2. Is it detrimental and would it be more useful if it was fixed?

If i don’t classify something as a bug, it is either because i find the feature useful, i consider the behavior a non-issue or it’s just how it works. Crashes are always bugs without question.

Last checked version

For record keeping, each bug will have the last verified version prefixed to the title (ex: [2.207] Crash bug). I will only update the version number if i encounter the bug again or retest it for a new version.

Misc

[2.207] [18/12/25] Start Position 60hz

Start Positions simulate the game at only 60hz, while the tick rate in 2.2 is 240hz. While this seems intentional, an option to enable 240hz start positions would be nice to have.

[2.207] [18/12/25] Camera position is updated after move

The movement of an Advanced Follow with the C option will be delayed by one tick from the position of the camera, as the camera position is updated after all moves are processed. This also affects Area triggers and Move (Lock Camera).

[2.207] [18/12/25] Object Rotation Offset

The position of objects part of a group that is being rotated will get offset overtime.

All rotation transformations are affected except Area Rotate.

[2.207] [18/12/25] Rotate Aim / Follow infinite rotation

When using Dynamic Mode with Aim or Follow options, on a Target Group ID without a Group ID Parent and a Center Group ID that is either 0 or made up of multiple objects, the target objects will spin rapidly. If Center Group ID contains multiple objects (and no Group ID Parent), it will spin even faster.

Video 1 Video 2

[2.207] [18/12/25] Relative Scale doesn’t work with Scale 0.00

This isn’t so much a bug as it is an oversight, Scale trigger will not work if scale is either 0 or 1.

Relative Scale lets you mimic additive scaling (increasing scale by an amount relative to current amount) if target and center have the same scale.

Due to the formula offseting scale by -1 ($RelativeScale=1+(Scale-1)/CenterScale$), increasing the scale by 1 needs a scale factor of 2.

In order to decrease the scale by -1, Scale would have to be 0 which doesn’t work.

[2.207] [18/12/25] Gradient doesn’t account for screen rotation when loading the level

Gradient triggers without any references (ID 0) use the screen’s edges as reference instead. These edges are initialized when the level loads, however, if the camera trigger is placed before the origin camera rotation isn’t taken into account.

Example: image

[2.207] [18/12/25] Color resumes when respawning from a checkpoint if stopped

If a Color trigger is stopped with a Stop trigger before the color change finishes, the color change will resume when you respawn from a checkpoint. Pausing the Color trigger does not do this.

[2.207] [18/12/25] Negative scaled Teleport triggers apply force in the opposite direction

Flipping a Teleport trigger by scaling it with a negative value does not change the direction force will be applied towards.

Flipping the trigger with the editor tool changes the direction, but:

  • If the teleport has target group 0, flipping will flip the direction force is applied in
  • If the teleport has a target group, the target group’s rotation is used as reference for force, flipping does nothing even if you flip the tp or the target obj

[2.207] [18/12/25] Kerning is not used properly when splitting text

Using the split feature of text objects does not take kerning into account properly, with certain letters getting more offset.

This also depends on the game’s texture quality, with High quality having more significant offset than Low.

[2.207] [18/12/25] No Audio Scale Orbs scale more than they should if affected by a scaling trigger

Orb objects with No Audio Scale that have been scaled up by an Area / Scale trigger will be much bigger visually than they should (roughly same size as when clicked), if they are not affected by any enter effect.

Editor

[2.207] [18/12/25] Using editor Preview Mode hotkey at least twice while playtest is paused resets object position permanently

Pressing the F3 Preview Mode hotkey two times or more while editor playtesting is paused moves objects permanently.

The first use resets object positions to default, the second use reverts the position back to where it was in playtesting. The second move will not be undone when playtesting is stopped.

[2.207] [18/12/25] Regrouping objects with Group Parent IDs creates phantom groups

Groups are remapped by Regroup and Build Helper, but Group Parent IDs are not. The object remains the Group Parent ID for the old group despite said group no longer being in the group list. This can cause issues by introducing phantom groups - the group is technically unused and not visible in the group list of the affected object, so it’ll be available for Regroup and Build Helper, but the object is still the Group Parent ID for said group, so if a trigger relies on Group Parent IDs like Area or Advanced Follow, then said object will be used as the center, causing issues.

[2.207] [18/12/25] IDs that are not affected by Build Helper or Regroup

This is a list of all IDs that are not affected by Build Helper or Regroup. While i do not know which ones are on purpose, i’ll highlight the ones that cause issues or look like oversights:

  • Group Parent ID
  • Enter Channel ID
  • Control ID
  • Material ID
  • Enter Channel
  • CH
  • Target Channel (Start Position)
  • Color ID (Color trigger, Pulse trigger)
  • Rotate Target ID (Rotate)
  • Animation ID (Animate)
  • Animation Group ID (Animate Keyframe)
  • Reference IDs (Advanced Follow, Edit Advanced Follow)
  • Effect ID (Area triggers)
  • Group ID (Sequence)
  • Target Channel (Rotate Gameplay)
  • Channel (Song)
  • Unique ID, SFXGroup (SFX)
  • Group ID, Unique ID, SFXGroup (SFX)
  • Extra ID, Extra ID2 (Event)
  • Item ID (Counter Label)
  • Color Channel (Area Tint, Enter Tint Effect)
  • Enter Channel (Legacy Enter Effect)
  • Enter Channel, EffectID (Enter Effect triggers, Stop Enter Effect)
  • RespawnID (Checkpoint)

[2.207] [18/12/25] Cannot create new Group Parent IDs if the trigger has 10 groups already

Group Parent IDs cannot be applied to an object with 10 existing groups, even if the object has that group already.

[2.207] [18/12/25] Hitbox does not update properly after rotating a slope object

Rotating a slope object does not update its orientation in the editor unless you move the object or quit the editor. Autobuild is affected by this.

[2.207] [18/12/25] Incorrect trigger duration line length when teleporting

The length of the duration line is double what it should be if the trigger is placed in a part of the level skipped by a teleport trigger.

image

[2.207] [18/12/25] On-load triggers have effect lines

On-load triggers like Link Visible and UI have effect lines when placed on the timeline, despite having an effect only when the level loads.

These triggers do still count as if they were placed on the timeline however even if they do nothing when reached.

image

[2.207] [18/12/25] Triggers that do not display their target ID

The following triggers, mostly added in 2.2, do not display any target IDs even though they should:

  • Re-Target Advanced Follow
  • Area (Move, Scale, Rotate, Tint, Fade)
  • Edit Area (Move, Scale, Rotate, Tint, Fade)
  • Area Stop
  • Item Compare
  • Time
  • Time Event
  • Time Control
  • Item Edit
  • Item Persist
  • Static Camera
  • Event
  • Toggle Block
  • Enter Effect (Move, Scale, Rotate, Tint, Fade)
  • Enter Stop
  • Link Visible
  • UI

The following triggers which spawn on either true or false only display one / no target ID, when they should display both true / false:

  • Item Compare
  • Instant Collision

[2.207] [18/12/25] Disable Paste State Groups prevents Paste from pasting groups

image

Disable Paste State Groups affects both Paste State and the Paste button from the Edit Groups menu, despite being noted otherwise.

[2.207] [18/12/25] Lighter on Base Color or an object with only Base or Detail Color crashes the game

Using the Lighter option on the Base Color of an object or on an object with only Base or Detail Color will either crash the game when the object becomes visible or kick you out of the level on load.

This bug does not occur inside the editor.

[2.207] [18/12/25] Paste + Color does not remap Pulse’s Channel ID

The Channel ID of a Pulse trigger cannot be remapped to a new value using Paste + Color.

Move Trigger

[2.207] [18/12/25] Move Trigger Target Dynamic ignores X and Y Only

Move (Target Mode) options X and Y Only are ignored when using dynamic movement.

[2.207] [18/12/25] Move Trigger Camera Lock X axis bugs on level replay

While the checkpoint / practice bug was fixed, restarting after completing a classic level places the camera locked group in the wrong position for that attempt. This only happens if the Move trigger is placed left or ontop of the level origin.

[2.207] [18/12/25] Pausing a Move trigger stops objects without a hitbox based on frames instead of ticks

Pausing a Move trigger stops the movement of objects, but objects without a hitbox are stopped on the next visual frame instead of the next tick.

This causes objects without a hitbox (spikes, solid blocks, collision objects) to offset from the position of objects with one (decoration, or using no touch).

Resuming undoes the offset.

Stopping does not create an offset, however stopping after pausing makes the offset permanent.

All other triggers with move functionality (rotate, scale, keyframe, etc) do not share this issue.

The reason this happens is that movements are optimized for decorative objects - they only move every frame rather than every tick. Pause fails to take this into account hence the offset.

If the deco object is targeted by adv follow / rotate / scale / other triggers that work on obj then the deco object will no longer be optimized and move every tick instead.

Collisions

[2.207] [18/12/25] Move Silent Collision crash

If you spawn a Move trigger with the Silent option from inside a Collision trigger that moves two or more collision objects (at least one being dynamic) the game will sometimes crash.

The dynamic collision object must be moved before it checks for collisions.

The crash will not trigger if Extended Collision is used on the dynamic collisions, it is likely the crash happens when the game tries to check the chunks of the collision objects that were moved.

Example ID: 114561987

[2.207] [18/12/25] Spider teleports through or into Extended Collision objects.

Spider gamemode and Spider Orb teleports through or into an object with extended collision instead of on it.

Spider Pad is not affected by this issue.

Events

[2.207] [18/12/25] Player Reversed event does not activate

Player Reversed event does not seem to activate when the player reverses direction in any circumstance.

It used to activate only on pad / orb reversal but that no longer seems to be the case.

[2.207] [18/12/25] Feather Landing event does not trigger if the player does not land with downward velocity

If the player lands with close to 0 velocity or clips / teleports into an object while traveling upwards none of the landing events will trigger.

[2.207] [18/12/25] Left/Right Release events do not trigger if interrupted by the other direction on mobile

On mobile devices, if you press Left while already pressing Right (and vice-versa), releasing Right after this will not trigger a Right Release (or Left Release) event. This affects both player events.

[2.207] [18/12/25] Input Release events do not trigger if game is paused

If you pause the game while holding a player input and release it during the pause, the input release event will not trigger.

Input release should trigger on unpausing if the player no longer holds the input.

Keyframes

[2.207] [18/12/25] Scale of Keyframe Parent ID is always positive

The scaling applied on keyframes by the Keyframe Parent ID is always positive, even if the scale is negative.

[2.207] [18/12/25] Scale of Keyframe Parent ID is not relative to rotation and is applied after it

If a Keyframe Parent ID has different X & Y Scale and Rotation at the same time, rotation is always applied first then Scale X / Y is applied along the level’s X / Y axis, not relative to the object’s rotation.

[2.207] [18/12/25] Warp Skew of keyframes is ignored when animating the keyframe.

Only the X and Y scale of the keyframe is used for warping the target objects, skewing is ignored.

## [2.207] Keyframes merge when copying to another level

Keyframes have a hidden unique ID which is used to determine what keyframe objects are connected. The ID is kept even when copying to another level which results in the copied keyframes combining with existing ones. This makes merging parts of a level that use keyframes difficult, as you cannot manually select the unique ID of the keyframe.

[2.207] [18/12/25] Keyframe lines are not visible until reloading the level if pasted in a new level.

Keyframes copied to another level will not display the connecting lines until reloading the editor.

[2.207] [18/12/25] Animate Keyframe Position Y Mod cannot be 0 if Position X Mod is different than 0

If the value of Position Y Mod is equal to 0 when exiting the editor it will automatically copy the value of Position X Mod. There are some cases where using only the X movement of a keyframe chain is required which is currently not possible to do outside of the editor.

[2.207] [18/12/25] Keyframe Preview does not match scaling

image

Keyframe scaling is relative to the Group Parent ID’s rotation, which is not reflected in the preview where it is relative to the keyframe’s rotation.

[2.207] [18/12/25] Rotation of Keyframe objects is not calculated properly

The formula by which keyframe rotation is calculated is very badly implemented and makes no sense.

The current rotation can be calculated using this formula: $rmod = (Rc-Rp)*mod$

$rmod > CW180 -> offset = -360$
$-rmod > CCW
180 -> offset = 360$
$rotation = rmod + offset$

Where: Rc is the current key’s rotation
Rp is the previous key’s rotation
mod is the keyframe animate’s rotation mod
rotation is the resulting rotation

Where is the mistake? mod is not applied correctly - it should be applied on offset but not when comparing to CW or CCW

How the formula should look to get correct behavior at any mod:
$Rc-Rp > CW180 -> offset = -360$
$(Rc-Rp)
-1 > CCW*180 -> offset = 360$
$rotation = (Rc-Rp+offset)*mod$

Minimal modifications to robtop’s equation (this is equivalent to above):
$rmod = (Rc-Rp)mod$
$rmod > CW
180mod -> offset = -360$
$-rmod > CCW
180mod -> offset = 360$
$rotation = rmod + offset
mod$

The problems with the current behavior are:

  • If the angle between the two keyframes is over 180, then CW and CCW do nothing
  • If the angle multiplied by Mod is more than a full rotation, CW and CCW do nothing
  • If rotation Mod is negative then CCW becomes CW and vice-versa
  • Mod multiplier doesn’t work as expected with angles over 180, CW or CCW
  • x360 rotations are not multiplied by Mod

Curve Keyframes with 0 duration break keyframe movement

Keyframes using Curve mode with very low duration like 0 result in very exaggerated movement that can send objects out of bounds, crashing the game.

Duration 0 should instead disable curve mode on the affected keyframe.

Particles

[2.207] [18/12/25] Toggling off or unloading a Particle Object does not clear particles in normal mode

In editor, toggling off or unloading a Particle Object disables and clears all particles created by it. In playtesting, the particles are not cleared and become separate from the particle object - any changes to the main object no longer affect the disconnected particles which continue to linger until they despawn.

[2.207] [18/12/25] Particles with Duration -1 may lose Animate on Trigger randomly

Particles with infinite (-1) Duration can lose both animate settings on when loading the editor.

[2.207] [18/12/25] Particles with long lifespans linger after a level restart if Quick Start is selected

Particles are not properly cleared when the level restarts if using the Quick Start option.

[2.207] [18/12/25] Uniform Color particles spawned by Spawn Particle are not uniform

A particle with the Uniform Color option that is spawned will use the color channel value at the time of spawning instead of syncing with the color channel continuously.

[2.207] [18/12/25] Weird transparency on particle objects

Particle objects calculate transparency inconsistently depending on what settings you select, as shown in the following table:

AdditiveObj ColorUniform ColorBlendingSolid AlphaBlending Alpha
NoNoNoEither$(start \cdot (1-t)+end*t) \cdot base$-
NoNoYesNo$(start \cdot (1-t)+end \cdot t) \cdot base$-
NoNoYesNo$(start \cdot (1-t)+end \cdot t) \cdot base$-
NoYesNoNo$(base \cdot (1-t)+end \cdot t) \cdot base$-
NoYesNoYes-$(base^2 \cdot (1-t)+end \cdot t) \cdot base^2$
EitherNoYesYes-$(start \cdot (1-t)+end \cdot t) \cdot base^2$
YesYesNoNo$(base \cdot (1-t)+end \cdot t) \cdot base$$((1-base) \cdot (1-t)+(1-end) \cdot t) \cdot base$
YesYesNoYes-$(base \cdot (1-t)+end \cdot t) \cdot base^2$
YesNoNoEither-$(start \cdot (1-t)+end \cdot t) \cdot base^2$
YesNoYesNo$(start \cdot (1-t)+end \cdot t) \cdot base$$((1-start) \cdot (1-t)+(1-end) \cdot t) \cdot base$

Notes:

  • $start$ is the initial alpha, equal to: $Start\textunderscore A+Start\textunderscore A\textunderscore Rand$
  • $end$ is the final alpha, equal to: $End\textunderscore A+End\textunderscore A\textunderscore Rand$
  • $base$ is the alpha (opacity) of the base color channel.
    • The detail color channel’s opacity is not used by particles.
    • Use Obj Color replaces $start$ with $base$ in all calculations.
    • $base$ is applied multiple times in some equations.
  • For a particle to count as blending either the base or detail color must be blending.
    • If Use Obj Color or Uniform Obj Color are used with Additive but neither color channels blend, then the particle renders as both normal and additive.
  • The resulting color for one particle is equal to: $BG\textunderscore RGB*(1-Solid\textunderscore Alpha)+Particle\textunderscore RGB*(Solid\textunderscore Alpha+Blending\textunderscore Alpha)$

[2.207] [18/12/25] Some Particle Objects can end up having erratic spin

Particle objects can get bugged and end up having very erratic movement. Level ID: 114681413

Video

[2.207] [18/12/25] Particle sometimes fail to spawn when near the particle limit

The first particle in a particle loop will fail to spawn if the particle limit has been hit already.

This usually happens if $Emission \cdot Lifetime = MaxParticles$

[2.207] [18/12/25] Spawn Particle Position Group ID is tied to game FPS

The spawn position of particles with Spawn Particle is the position of the group at the last rendered frame, instead of the current position. This can cause particles to spawn in the wrong position when dealing with high speed or instant movement when the game runs below 240 fps. The bug only happens while playtesting and not in the editor.

Video: 200, 300, 60 and 120 fps Video: 120 fps vsync, mobile

Setup attempts to spawn a particle every tick on a moving target. ID: 114953438

[2.207] [18/12/25] Spawn Particle fails to spawn on inactive targets

Spawn Particle will not spawn if the target is inactive (position is off-screen). This only happens while playtesting and not in the editor. If the object was active on screen at least once before, the particle will spawn at its previous on-screen position.

Link Visible can keep the target active as a potential workaround to this issue. While this might be intentional for performance reasons, there should be an option to allow the particle to spawn regardless of whether the target is active or not.

Video

Enter Effects

[2.207] [18/12/25] Enter trigger crash

If you try to call 2 different Enter triggers with the same Enter Channel and Effect IDs but different values for the same variables, the game will crash in playtesting.

[2.207] [18/12/25] Enter trigger portals

Using Enter trigger effects on portals and other objects composed of multiple objects only affects the foreground layer of portal objects.

[2.207] [18/12/25] Legacy Enter triggers cannot be spawned

Legacy (pre-2.2) Enter triggers cannot be spawned with the Spawn Trigger option. Touch Trigger does work however.

[2.207] [19/12/25] Enter Scale & Rotate apply real scaling and rotation on target objects

There seems to be no difference between Enter and Area Scale & Rotate.

Examples of things affected by this bug:

  • Keyframe objects get scaled / rotated which can cause keyframes to apply scaling & rotation wrongly
  • Rotate Follow will copy the rotation of an object affected by Enter Rotate

Spawn Triggers

[FIXED 2.208] [19/1/26] Internal Remap Instance IDs are remappable

Every Spawn trigger with remaps is assigned a Remap Instance ID on level load in the order they are loaded in. Spawn triggers without remaps are assigned ID 0.

This Remap Instance ID is remappable which has the following effects:

  • Spawn triggers may accidentally use the wrong set of remaps
  • The game will crash if the ID is remapped to a remap instance that does not exist

Video Explanation: https://youtu.be/ZDzuKXkeM8g?si=mSGYaf9Lda75WfYV

[FIXED 2.208] [19/1/26] Instant Collision resets remaps

Groups spawned by a remapped Instant Collision do not inherit remaps.

[2.208] [19/1/26] Checkpoint resets remaps

Groups spawned by a remapped Checkpoint do not inherit remaps.

[2.208] [19/1/26] Spamming restart (R key) skips spawn activation

Spamming R quickly can skip the activation of spawns placed before the origin line in Platformer. This can also happen but only on the very first attempt in Classic.

I assume the reason this happens is because the level restarts before the spawn limit is reset, so the triggers are spawn limited on the next restart.

[2.208] [19/1/26] Count spawn inheritance without Multi Activate

If Multi Activate is not selected, the Count’s spawn target uses the remaps of the oldest active instance of a subsequent (activated after) Count trigger with the Multi Activate option using the same Item ID. This makes one-time Count activations in remapped setups annoying to execute, since if you stop a Count trigger during a count update it will skip the next (or more, depending on how many were stopped) Count triggers.

[2.208] [19/1/26] Triggers that are not remappable or not fully remappable

The following triggers cannot be remapped, or have some IDs that are not remappable. I have highlighted the ones that cause some issues or make things more difficult in certain situations.

These triggers are not remappable:

  • Color
  • Rotate Gameplay
  • Gradient (ID can get remapped but it always disables the gradient)
  • Checkpoint
  • Legacy Enter Effect triggers (not spawnable)
  • Keyframe (trigger is remappable, groups inside keyframe objects are not)

These triggers have IDs that are not remappable:

  • Pulse (Color ID)
  • Spawn (Original Group ID)
  • Area Triggers (Effect ID)
  • Area Tint, Enter Tint (Color Channel)

[2.208] [19/1/26] Stopping a spawn trigger with delay from another Spawn trigger with delay makes the last Spawn delay spawn again without remaps

Stopping any Spawn trigger with delay while spawn delays are checked makes the game check the last Spawn delay trigger twice, which if it were to spawn in the same tick would activate twice.

It doesn’t matter if you stop a Spawn trigger that has already been activated in the current tick, one waiting to activate or you make the Spawn trigger stop itself.

Due to the spawn limit, this bug is only noticeable if the spawn trigger is remapped. The first activation will be remapped while the second spawn activation will have no remaps.

You can use a Spawn trigger with a very high delay value to counteract this bug, as even if it’s checked twice it will not spawn.

Spawn Ordered

This bug also affects Spawn Ordered, but only when spawning triggers that were moved.

The spawn delay of triggers spawned by Spawn Ordered depends partly on their current position, which can be affected by move triggers.

Not every move is affected, movements caused by Area triggers are completely ignored.

This behavior is inconsistent however, the game stops ignoring the new delays in some situations, and some spawns may be delayed until another spawns just like those placed on the timeline.

Items and Timers

[2.207] [18/12/25] Count desync

The values stored inside Count triggers can be updated improperly or not at all when paused and resumed, when spawning pickups from inside other triggers and when using a persistent item due to Count storing the last value of the item when activating.

Persistent Items

The value stored inside Count and the value of the item will no longer match when the player respawns, if the item is persistent and the value changes after the count was initialized.

Paused Counts

Count triggers do not update the stored item value if they are paused.

Count activating its own Item ID

If a Count trigger activates a Pickup or Item Edit trigger with the same Item ID as the Count’s Item ID, this will trigger a new check for all Count triggers of that Item ID.

On this new check, Count triggers will update their stored value to the new Item ID value. However, if a previous Count check was interrupted by this new check, the game will resume the previous check when the new one is done.

When the game updates the Count’s stored value, it doesn’t use the current Item ID value, it uses the value from when the check was initialized - this means the previous check will update the remaining Count triggers to an old value causing a desycn from the current Item.

[2.207] [18/12/25] Count check can reverse order if interrupted by a new check

Count trigger checks are ordered by Target Count, the order of activations depends on whether the item was added or subtracted.

If a Count trigger activates a Pickup or Item Edit trigger with the same Item ID as the Count’s Item ID, but the operation subtracts instead of adding (or vice-versa), the order of checks for both the new AND any previous remaining checks for that item ID will be reversed.

Count checks are done by looping over count instances mapped by Target Count using an index. This index will count from the start if adding and from the end if subtracting. If the order changes in a new item change, then that can cause the same Count triggers to be checked again.

[2.207] [18/12/25] Time Ignore Timewarp does nothing

Timer is still slowed down or sped up by timewarp with the option selected.

[2.207] [18/12/25] Counter labels do not update properly with items outside the 0-9999 range

Counter labels only update if a Pickup or Item Edit trigger with the same ItemID is used. IDs outside the 0-9999 range refer to ID 0 or 9999. If an ID outside this range is used, it will display the value of ID 0 (if below 0) or 9999 (if above 9999), but will not update when ID 0 / 9999 change values. Timers text labels update properly and are not affected by this bug.

[2.207] [18/12/25] Level is unlisted if it contains a Pickup with high count or negative item id

The server unlists any level that contains a Pickup, Count or Instant Count trigger with either high count (100k or more) or an item ID less than 0.

This is an intentional fix to the 2.1 ACE exploit which has remained in place as 2.1 clients are still able to download levels.

Item Edit and Time triggers are not affected by either issue.

[2.207] [18/12/25] Item Attempts value only returns 1

Attempts item is not updated on new attempts and always returns value 1 when used inside Item Edit or Item Compare.

[2.207] [18/12/25] Timers reversed spawn order

Timers spawn from the oldest timer first to newest last on mobile (reversed), and from newest first to oldest last on PC.

[2.207] [18/12/25] Float Operations return a different value on PC and mobile

When assigning a value higher than 2^31-1 to an item with Item Edit or Pickup (using Multiply / Divide), the overflow value differs between pc and mobile - on pc the overflow is -2^31 while on mobile the overflow is 2^31-1. For values lower than -2^31 the overflow is -2^31 on both versions.

[2.207] [18/12/25] Assigning NAN to items returns a different value on PC and mobile

Assigning NAN (through external editing of the trigger) to an item returns -2^31 on PC and 0 on mobile.

[2.207] [18/12/25] Pickup Multiply / Divide is innacurate

Multiply / Divide Pickup operations use single precision floats instead of double precision like in the case of Item Edit which introduces significant errors.

Area Triggers

[2.207] [18/12/25] Ease Out conflict

Ease Out is currently bugged and does not apply the effect properly to the radial proximity options. If the two easings differ they will both apply and conflict - the game will pick and apply one of them. This is most obvious with opposing easings.

[2.207] [18/12/25] ModBack / ModFront do nothing for the radial options

ModBack / ModFront are still displayed when used on the radial options despite doing nothing.

[2.207] [18/12/25] Thin solid hitboxes when scale is negative

When a solid object is scaled by a negative value, hitboxes become very thin and buggy. Spikes and other non-solid hitboxes are not affected.

[2.207] [18/12/25] Area Fade stops working for a short duration after the game is unpaused

Unpausing the game undoes the effect of Area Fade for one frame.

[2.207] [18/12/25] Start Position multiplies Area effect

Area effects are accumulated for every calculation when starting from a Start Position. Only the first tick is affected, the effect is properly applied on the second one. All Area triggers are affected. With Area Scale and Area Move, this can crash your game.

Scale / Rotate Bug

Scaling or Rotating an object by a large amount makes it impossible to undo the transformation if done inside the editor. This makes all affected objects get their scale and rotation be completely different when stopping playtesting after the bug.

[2.207] [18/12/25] DEAP has no effect when used on Area Tint or Area Fade

The center group is affected by Area Tint and Area Fade even with DEAP selected, DEAP effectively does nothing for these two triggers.

[2.207] [18/12/25] Area Tint ignores Base / Detail Color

Area Tint ignores the Base / Detail Color setting of single-color objects.

[2.207] [18/12/25] Edit Area with Duration 0 does not override an active Edit Area

Edit Area will override other active Edit Areas only if Duration > 0.

[2.207] [18/12/25] Stop has no effect on Edit Area

Stop does not work on Edit Area. I am not sure if this is unimplemented or a side effect of how Edit Area was implemented.

[2.207] [18/12/25] Area Scale / Rotate / Move visibility issues

If an object stops being visible, Area Scale / Rotate / Move will stop applying in certain situation.

Multiple Areas

Example here and level ID in the video description.

Flickering

Flickering is caused when a target goes off screen and ends up back on screen when the effect is undone every other tick. Example here.

Rendering

Objects with a hitbox that stop being visible once brought off-screen do not render properly if brough back instantly on-screen.

[2.207] [18/12/25] Toggle Inconsistencies

Toggle disables Area effects on the object only in very particular cases depending on the area settings. This should be replaced by a dedicated Ignore Disabled feature as there is no logic or indication to this behavior.

[2.207] [18/12/25] Edit Area Tint / Fade doesn’t pause in editor

Edit Area Tint and Edit Area Fade do not get paused when pausing the editor playtest.

Video

Advanced Follow

[2.207] [18/12/25] Velocity Duplication

Targets move way faster than they should if there are multiple Advanced Follows active, because the velocity movement is mistakenly applied again by every trigger.

Example Video

Rotation is also duplicated when using Mode 3.

A solution to this bug would be for only the first Advanced Follow in a tick to move by the current velocity value, and subsequent ones to move by the difference in velocity.

[2.207] [18/12/25] Rotation and Object Groups

Advanced Follow movement breaks when using Rotation on targets part of linked objects or groups.

Example Video

[2.207] [18/12/25] Timewarp and instant movement

Instant Movement reduction

Mode 1 Advanced Follow triggers with no easing follow the target using easing if timewarp is less than 1.

The motion of Advanced Follow is inversely proportional with timewarp values less than 1. Due to how Mode 1 works, this multiplies the easing value of Mode 1 triggers, even if easing is equal to 0.

This behavior makes it impossible to perfectly match an object’s movement with Advanced Follow while time is slown down. This also affects Mode 2 movement that relies on moving objects for a single tick very fast with high speed and limited MaxRange or 100 Friction.

Max Rotation Speed

The max rotation speed of the Rotate option does not scale with timewarp.

[2.207] [18/12/25] Speedup when using high Friction values

Friction values over 100 can reverse the speed of an object, and if above 200 friction this speed will increase exponentially until the game crashes.

[2.207] [18/12/25] StartSpeed and Speed are not multipliers

StartSpeed and Speed are not multipliers when using a speed reference ID. It is not clear to me whether this is intentional or a bug, as the only place where the multiplier is mentioned is on the editor guide.

[2.207] [18/12/25] Options that do nothing

The following options do nothing:

  • MaxRange Reference ID
  • Redirect Dir (Edit AdvFollow)
  • SlowDist and SlowAccel (Mode 3)

While a MaxRange reference ID has limited applications, one such example is with Mode 1 with 0 easing - this would allow you to move a singular object from a group to a target position (like a target move for objects), which is very useful.

[2.207] [18/12/25] StartSpeed works on one target

If there are multiple targets inside Target GID, StartSpeed applies on one target only.

[2.207] [18/12/25] Physics issues when outside MaxRange

Even if an Advanced Follow target loses all velocity by leaving the MaxRange of the effect, if the player clips into the target’s hitbox it will boost the player. This behavior continues until the trigger is stopped. Without DontBoostX/Y, the player’s jump will be boosted everytime the player jumps off the target. Using DontBoostX/Y is not enough to fix this issue, the player will also be forcibly teleported to the top of the object if clipped inside or hit from below.

[2.207] [18/12/25] Hitbox move delay

Sometimes, the hitbox of the target object will be stuck in a previous position if Adv Follow movement is really fast.

Stopping the Adv Follow trigger fixes the hitbox position.

[2.207] [18/12/25] Mode 3 X/Y Only cannot steer if other modes are present

When using X/Y Only on a Mode 3 trigger, the target is unable to steer if Mode 1 or 2 is present on the other axis.

[2.207] [18/12/25] Edit Advanced Follow random is between 0/+ instead of -/+

The random variables in Edit Advanced Follow are always picked in a range between 0 and the given value, unlike other random settings.

[2.207] [18/12/25] Advanced Follow will not spawn if stopped then respawned in the same tick

If an Advanced Follow instance is stopped, then it is spawned again before the next Advanced Follow movement, it will not be active.

This bug is caused by two mechanics:

  • Advanced Follow doesn’t stop instantly, it is marked as stopped until the next scheduled movement where it gets cleared
  • Advanced Follow will not spawn if an instance of it is already active for the given remap

A potential fix for this would be for Advanced Follow to replace the previous instance if its waiting to be stopped.

Video ID: 115061026

Arrow Trigger

[2.207] [18/12/25] ORD doesn’t work as intended

Triggers that use ORD are delayed until the last (either the left-most or top-most, if gameplay is rotated) trigger with a lower ORD in the same channel is activated.

[2.207] [18/12/25] Arrow trigger & channel 0 triggers

If you place an arrow trigger (without touch or spawn) that changes the trigger channel to 0 anywhere in the editor, the activation of all channel 0 triggers in the entire level will now depend on the position of the triggers relative to the arrow trigger.

If the triggers are placed after the arrow trigger, depending on the direction the arrow points towards, their activation is completely ignored.

This happens even if the arrow trigger hasn’t been reached yet or if any other arrow triggers (without channel 0) are placed before it.

[2.207] [18/12/25] Arrow trigger activation delay

The activation of arrow triggers (without spawn or touch) is delayed until all triggers on the same channel that are placed before the arrow trigger (relative to where the arrow points) are activated.

[2.207] [18/12/25] Arrow and Music Line mismatch

The music line uses the arrow trigger as the origin when gameplay rotates, but trigger activation depends mostly on the player’s position, which is inconsistent and can be affected by variations in the player’s position.

[2.207] [18/12/25] Music Line Y 0

The music line cannot go below Y 0. The behavior depends on the position and direction of the arrow trigger:

  • Position below Y 0 and pointing up: the music line will start from Y 0
  • Position below Y 0 and pointing down: the music line freezes in place before rotating
  • Position above Y 0 and pointing down: the music line freezes upon hitting Y 0

[2.207] [18/12/25] Strange Vel Mod behavior

Edit velocity behavior of arrow trigger is unintuitive:

  • Velmod X and Y do nothing if the player only reverses direction
  • When gameplay is rotated, the player’s vertical velocity is set to the player’s previous horizontal velocity multiplied by Velmod Y
  • Velmod X does nothing in classic mode, in platformer when gameplay is rotated, the player’s horizontal velocity is set to the player’s previous vertical velocity multiplied by Velmod X
  • If using Override Velocity then the vertical velocity is set to Velmod Y and the horizontal velocity is set to Velmod X (this works as intended)
  • Neither Velmod X or Y take into account whether the arrow trigger inverts gravity

Suggestions

While suggestions do not fall under documentation, i think that they still hold some relevance as to what the limitations of the current features are and what are the rough points that could be improved in future versions of the game.

I would like to keep feedback separate from documentation, but most of them don’t make sense outside of this context, so i’ve split them into their own folder. If i were to put them anywhere else they aren’t going to get looked at let alone considered, so realistically this is the only format that makes sense to me to make suggestions to the game. Bug reports and suggestions have been a pain point for both Rob and players from almost the beginning as there is no framework to handle public feedback and reports.

I have a pretty good understanding of how most trigger-related features work so generally my suggestions are going to be similar to how existing features already function or extensions of existing features. It can be a bit difficult to flesh out ideas as the game’s way to program things is quite different from what most people are used to. For me the workflow is very similar to how some low level industrial programming languages work as each trigger is it’s own encapsulated function, this is what i personally have experience with and can draw parallels to. Odd as it is, i quite like how the game implements triggers and i see no reason to change or abstract game features further.

Misc

Song trigger Spawn GID on Song Load

Song trigger should be able to spawn a group ID when the song loads, either normally or with Prep.

Reset trigger “Reset Trigger” option

With this option, the reset trigger would be able to reset triggers without the “Multi Trigger” option that have already been activated

“Trigger limit persist between attempts” trigger object option

With this object option, triggers without multi-trigger would only be able to activate once between attempts, similar to Item Persist.

Reverse trigger inverts left/right controls of player

Since it is fairly useless, the reverse trigger (or the options trigger) should be able to invert left/right controls in platformer mode. This could be used to fix input issues in “circular” levels that use all 4 player direction modes.

Options trigger “Disable 2 Player” option

Useful for having both symmetrical and assymetrical duals

Sequence trigger “Randopmize Sequence” option

Groups of sequences are taken in random order with this option. Randomization is separate per remap.

Mean / Gaussian Blur Shader

Would be much better than radial blur for out of focus objects in the foreground.

Item Edit “Power” and “Root” operations

Add Power and Root as possible operations inside the Item Edit trigger.

Integer powers can be done with repeated item edits, but roots are a bit less intuitive and require approximation (newton’s method) to obtain, which makes euclidian distance calculations more difficult than they have to be.

Scale “Set Scale” option

Sets the scale of Target GID using Center Group ID’s current scale as reference.

For example, if the center’s x scale is 10.00 and the trigger’s x scale is 2.00, the trigger will scale the target group by 0.20 on the X axis.

Sequence “Ignore Toggled” option

Sequence ignores toggled groups and skips to the next active group.

Advanced Random “Ignore Toggled” option

Toggled groups have 0 weight with this option. This would be useful for adding unique drops or actions that are removed from the loot table.

Time Control “Clear” option

Stop triggers are able to clear timers by Group ID. “Clear” on Time Control would be able to clear a timer by item id.

This isn’t new functionality but it is less awkward than spawning a timer with the given item ID then stopping it, if the group of the timer is unknown or cannot be referred to.

Clearing is useful primarily for removing timers completely and clearing their remaps.

Follow Trigger “Y Copy X” / “X Copy Y” options

These options would be useful for turning X movement into Y movement and vice-versa.

The only way this can currently be achieved in some manner is with Area Move, but it is quite limited and inconvenient to do.

Decimal Particle Emission

Allow Emission variable inside Particle Objects to have decimals, to allow finer control over the particle spawn rate.

More Player Events

More events for the Event trigger:

  • Grounded and Airborne player events
    • The current landing and jump events are not sufficient to tell whether the player is grounded or in the air accurately.
  • Enter / Exit Practice Mode event
  • Fall off platform (without jumping) event
  • Clip into platform event
    • Would trigger when you jump into a hitbox and get pushed ontop of it.
  • Directional Player Movement events
    • Player Move X Positive
    • Player Move X Negative
    • Player Move X Stop
    • Player Move Y Positive
    • Player Move Y Negative
    • Player Move Y Stop
  • Game Unpaused event

Build Helper / Regroup Copy Paste

Combined regroup + paste option to allow regrouping and pasting group ID parents.

Teleport Trigger P2 option

Add P1/P2 options to the teleport trigger. The current workaround for this is to use teleport portals which also affect P1 and not just P2.

Modifying player velocity X/Y only

An option in either the Player Control or Teleport trigger that would allow you to change the velocity of an object on the X or Y axis only.

“Dynamic Reordering” Extra Object Option for triggers

With this option, if the trigger is moved by a move trigger and spawned, the game will use the trigger’s current position instead of its load position.

ItemID persist when exiting the level

Option for Item IDs to persist between attempts. Can be cleared from the level options menu.

Spawn trigger “Random Order” option

Triggers spawned with this option will be sorted randomly.

Area Triggers

Edit Area use Control ID

The EffectID of Area triggers cannot be remapped, if you want to use the same Area trigger for different groups at the same time, you need to use EffectID 0. However, since groups of objects cannot be remapped, you cannot use Edit Area on a particular remap, all instances of the same Area trigger will be affected. A solution for this would be to allow Edit Area to use Control IDs to refer to specific instances of the Area trigger.

Edit Area Fade From Opacity

Currently, Edit Area Fade can only edit the To Opacity setting of Area Fade.

Hide ModFront / ModBack for the first two Proximity settings

ModFront / Modback have no effect for the two circular area proximity options. Adding additional behavior would be nice, but it might break existing levels. These settings should be hidden while using those proximity options.

Pause / Resume freeze / unfreeze Area triggers

Currently for Area triggers Pause has the same behavior as Stop and Resume has no effect. Pause / Resume should freeze / unfreeze recalculations of Area effects, similar to how they already work for Advanced Follow.

Advanced Follow

Advanced Follow Ignore Timewarp

Add Ignore Timewarp option to Advanced Follow. When used this would ensure high speed movement isn’t affected while slowing down time.

Edit AdvFollow Mod X and Mod Y reference ID

Add a reference ID besides Mod X and Mod Y, to allow the speed to be modified on the X or Y axis of a reference object. This would allow for accurate bounce physics off slopes or angled lines which is currently very difficult to do.

Speed Multiplier

If speed not being a multiplier is intentional, a Speed Multiplier option should be added to allow for that behavior. While it takes an extra workaround, this would allow the implementation of accurate collision motions between solid physics objects. Additionally, any kind of movement could be converted to advanced follow speed values with this feature.

Edit AdvFollow Use Dir

Add Use Dir option so the object’s current direction is used for direction calculations. With Speed this would allow adding speed in the direction of movement without using an individual reference ID for each target. If Redirect Dir worked, you could use Dir to offset the direction of movement by a set amount of degrees.

Parameter To Item

Copies the value of a selected variable into the given item ID (item, timer).

Currently, measuring these parameters can be difficult or outright impossible.

This functionality would be split into two to three categories (or menus):

  • Object Parameter
  • Level Parameter
  • Player Parameter

The options listed are examples made to give a general idea on the purpose of the trigger.

UI could be similar to the event selection inside the Event trigger, but only one parameter can be chosen at a time.

The main purpose of this trigger is to make measuring and calculating distances between objects and entities (players) easier, but it could also be used to measure a lot of other things which are currently not possible.

Object Parameter

References an object using a group ID.

If the group contains multiple objects, it picks one at random (unless using an ID parent).

Options:

  • Position (X,Y)
  • Last tick move (X,Y)
  • Rotation (rad,degrees)
  • Scale (X,Y,skew)

Level Parameter

Returns the value of a given level parameter, such as:

  • Object Count
  • Lifetime Attempts
  • Current Time Elapsed
  • Practice Mode
  • etc

Player Parameter

Returns the parameters of either P1 or P2:

  • Position (X,Y)
  • Velocity (X,Y)
  • Momentum (Force) (X,Y)
  • Gamemode
  • Scale
  • Gravity

Sequence Control

Sequence is one of the new triggers introduced in update 2.2 which makes it easier to spawn groups in a specific order from a single trigger. Previously, to get the same effect you would need to implement a switch-case using Instant Count triggers, where you check if the Item ID value is equal to any of your defined cases and spawn a group if the value matches your case.

The issue with Sequence is you do not have a trigger like Pickup or Item Edit that can modify the Sequence’s counter. You cannot reset, go back or modify the sequence’s current step easily. This limits what you can do with Sequence significantly; If you want to reset or set the counter to a specific value on demand, you need to use the old method of Pickup + Instant Count (or Item Edit / Item Compare).

As to why Sequence should have this capability, it is for ease of use and optimization. Setting up a Sequence trigger is easier and much less tedious than a switch case. It is also a single trigger and you do not need to spawn multiple Instant Count / Item Compare triggers to implement something as simple as indexing a list. No need for an Item ID either and it makes looping logic much easier to do. Taking this into consideration, i propose a Sequence Control trigger to make up for Sequence’s shortcomings.

Options & Functionality

Modifies the current step of a Sequence trigger.

Options

Counter

Modifies the current counter value.

Set / Offset

Whether Counter offsets or sets the counter value.

By Group

If selected, Counter works by group instead of by step. This always resets the counter before the first step of the group.

Group ID

The group ID of the affected Sequence trigger.

Use Control ID

Use control ID instead of group ID.

Usage Examples

Set 0 resets the counter to 0 (like Reset Full). Set -1 sets the counter to the last step.

Offset -1 decreases the counter by 1 (like Reset Step). Offset +1 increases the counter by 1 (skips step).

With Mode Loop, if the counter is larger than the sequence’s steps it will loop forwards, if it’s negative it loops backwards. The behavior i propose for negative looping is different from Reset Step, which only resets down to the first step and does not go further. With By Group, Set 2 sets the counter to the first step of the second group. Offset -1 goes back to the previous group, Offset 1 skips to the next group. This is useful for advanced looping logic.

With Unique Remap the Sequence trigger has an unique counter for each remap trigger. Use Control ID would allow you to target a specific counter.