Nebula Flow

Nebula Flow

Not enough ratings
Level Editor Official Guide
By After Nap Games
This is the official guide for using Nebula Flow's level editor. It contains the full documentation found in the editor's help menu.
   
Award
Favorite
Favorited
Unfavorite
Introduction
(This is an early access version of Nebula Flow's level editor. It was solid enough to be used to map the more recent official levels, but you still might encounter some bugs. Any level you create with this editor will be compatible with the 1.0 version of the game.)

Hello!
The following documentation assumes that you're acquainted with the basics of Nebula Flow's gameplay (notes, obstacles, boost...). If not, go play a few levels. We heard it's a pretty good game.

If you already have some mapping experience with other rhythm games, a lot of what you'll read here will probably seem familiar. What makes Nebula Flow unique, however, is its procedural generation system and the way it can be used to give a map virtually endless variations while still maintaining a sense of deliberate note placement. You can learn more about this in the "Note types", "Patterns", and "Generations" help sections.

If you have any question/feedback, or would like to request a feature, swing by the game's Steam discussions and we'll get back to you as soon as we can.
We hope you'll enjoy crafting some cool maps with this editor!

After Nap Games
File management
To properly work, a custom level needs two files: a level data file (extension .nfld) and an audio track file (extension .ogg).

When a custom level file is opened, either by the game or the level editor, the program will look for an audio track in the same location with the same name as the level data file + "_track" (EG: if your level is saved as "my_level.nfld", the associated audio track will be "my_level_track.ogg"). If no audio track is found, the level will still be playable, but no audio will be used.

When saving your custom level, a level data file will be created/modified. If an audio track has been selected (see [[ Select audio track ]]), a copy of that track will be created with the correct naming convention at the same location of the level data file. IMPORTANT: The original audio file must be encoded in OGG Vorbis.

For a level to appear in the level list of Nebula Flow's "Select custom level" menu, it must be saved at ".../Documents/My Games/Nebula Flow/custom_levels".
Level setup
IMPORTANT! Make sure your audio offset in the "Settings" menu matches the one in your game.

-- LEVEL INFO --

Contains all the metadata fields relative to a level and its associated song:
[[ Artist ]] Sets the artist of the song (displayed at the start of a level).
[[ Title ]] Sets the title of the song (displayed at the start of a level).
[[ Map author ]] Sets the name of whoever mapped the level.
[[ Difficulty ]] Sets the difficulty (stars) displayed when selecting the level. This value must be comprised between 1 (half a star) and 10 (five stars).
[[ Source URL ]] Sets a URL to the song used, if you can find one.

-- NOTEMAP --

[[ Scrollspeed ]] Defines how fast the notes will move on screen, in pixels per second. Incidentally, this affects the spacing between the notes. If you have notes very close to one another, you will need to set this value high enough or the game won't have enough space to display the notes properly.
[[ Pre-notemap duration ]] Sets the duration (in seconds) between the fade-in effect at the start of a level and the start of the note map (ie. the earliest moment you might encounter a note).
[[ Notemap duration ]] Sets the duration (in seconds) between the start of the notemap and its end (ie. the moment where you cannot control your character anymore and the end level animation starts).
[[ Edit notemap ]] Opens the notemap editor.

-- DIFFICULTY --

Contains values affecting the time it takes to get to full boost and how fast obstacles will spawn.
[[ Auto-set difficulty values ]] When checked, sets automatically "Note count to full boost" and "Note count to max obstacles" based on how many notes are contained in the notemap to get a boost/obstacle difficulty close to Nebula Flow's original levels.
[[ Note count to full boost ]] Sets the amount of notes to hit to fill your boost bar entirely.
[[ Note count to max obstacles ]] Sets the amount of notes to pass (hit or miss) for the obstacle spawn rate to reach its maximum. The lower this value, the faster obstacles will appear on the road.

-- OBSTACLE RATIOS --

[[ Easy min/Easy max/Medium min/Medium max/Hard min/Hard max ]] Sets the min/max ratios (normalized from 0.0 to 1.0) used to spawn obstacles.
Obstacles have a spawn rate that increases with every note that is passed (hit or missed). It reaches its maximum after a certain amount of passed notes (see "Note count to max obstacles"). These values set the range on which the amount of spawning obstacles will progress.
Obstacles fall into three categories, depending on their dangerousness:
-Hard obstacles only spawn very close to notes. They basically punish pressing an input too soon/too late/not pressing it at all.
-Medium obstacles are the remaining obstacles that are not considered hard, but still spawn next to the path.
-Easy obstacles always spawn at least one lane away from the path. They pose virtually no threat and are mostly used to increase the visual pressure as they clutter the road.

EG: A min value of 0.1 for easy obstacles means that for every possible easy obstacle that could spawn,
only 10% will actually do when the obstacle spawn rate is at its minimum (ie. at the start of the level or right after using boost).
A max value of 0.8 for hard obstacles means that for every possible hard obstacle that could spawn,
80% will actually do when the obstacle spawn rate is at its maximum.
The default values are the one used for most of the game's official levels. You can leave them as they are if you don't feel like experimenting with this.

-- VISUALS --

Contains values affecting how the level will look.
[[ H1/S1/L1/H2/S2/L2 ]] Sets the HSL values for the level's color palette (same as in the "Set custom color palette" menu in Nebula Flow).
[[ Background ]] Defines which location the level will take place in.

-- AUDIO TRACK --

[[ Select audio track ]] Opens a file dialog to let you select which audio file to use in the level you're editing.
IMPORTANT: The audio file must be encoded in OGG Vorbis.
[[ Track head duration ]] Sets the offset (in seconds) between the start of your audio file and the start of the notemap.
EG: for a value of 2.5, the audio track will start playing 2.5 seconds before the first beat of the notemap.

-- PLAY --

[[ Use random seed ]] If checked, uses a random number as a seed to generate the notemap when testing the level. Otherwise, you can specify which seed you want to use in the dedicated typebox.
[[ Play level ]] Lets you try the level with all the current values.
Notemap editor
The notemap editor is used to create a notemap, that is, all the notes that will appear during the level.

Notes will spawn on one of the five horizontal lanes on which the player can move its character. A note is basically a position in time relative to the start of the notemap, but it also holds additional data to define its type and consequently the lane it will spawn on.

Your current position in the notemap is represented by the editor cursor (the red vertical bar). You can move along the notemap with various navigation functions (see "Navigation/Edition panels" help section) and place notes matching the rhythm of your audio track.

You can divide the note map into sections. Sections are placed like notes, and can be used to spawn at a specific time in training mode. They're also a good way to move between song parts.
Note types
Nebula Flow uses three physical inputs to hit notes, which translates to three note cues: move up, move down, and jump (round item).

A note can combine one move and a jump ("Dual note"). A dual note never combines two moves.

A note can be grouped with the note(s) preceding it.
The first note of a group ("Held note") will necessarily contain a jump that will need to be held until the last note of the group.
The last note ("End held note") marks the time position where the jump input can be released. This note is the other half of the group's first note and can only be hit if ALL the notes in the group have been hit too. To be hit, the last note does not require anything other than the initial jump input still being down when reaching it.
Notes placed inside a group ("Middle held note", between a held note and an end held note) will always be moves.

An additional note can also be placed on top of an end held note ("Joined note"). It will always be a move too.

When creating a notemap, notes are placed and grouped by hand. Deciding how the notes will make use of the game's three inputs (move up, move down, jump), and thus which lanes the notes will be placed on is left to the generation algorithm.

Because of the generative nature of the notemap, you cannot directly set a move as going up or down. Instead, moves are defined as "Return" or "Stray".
A return move goes in the opposite direction of the move preceding it (or a default value, if it is the first move of the notemap).
A stray move goes in the same direction as the move preceding it (or a default value, if it is the first move of the notemap).
The terms "Return" and "Stray" can also be applied to duals, since they contain a move.

From the notemap, the generation algorithm will output a sequence of note types that will be used to decide which inputs will be used on each note (see "Patterns" and "Generations" help sections).

The notes will then be modified to comply with additional constraints:
- Moves and duals that are on the lower/upper lanes will always move toward the center lane. Another way to picture this is that you can only move up from the lower lane and move down from the upper lane.
- Held notes (first of a group) will always contain a jump. They can be just a jump note, or a dual.
- Middle held notes (notes between the first and last of the group) will always be moves.
- Joined notes (notes placed right at the end of a group, on the end held note) will always be moves.
Patterns
While some notes might be subject to constraints regarding which physical input(s) they're going to use (see "Note types" help section), most of them have some amount of freedom as to what they will ultimately spawn as when you play a level. That amount can be controlled via patterns.

Patterns are rule templates for generating sequences of note types. These types are as follow: return move, stray move, jump, return dual, and stray dual.

Pattern notes can also have an additional attribute like Switch or Keep. These attributes alter the current note depending on the note preceding it.
A switch note will use an input that wasn't used on the preceding note. A switch note will never be a dual. Switch notes are useful for avoiding having to mash the same input on quick successions of notes.
EG: Preceding note input is a jump. Current note input will either be a move up or a move down.
EG2: Preceding note inputs were jump + move up (dual up). Current note input will be a move down.
A keep note will use the same input(s) that was used on the preceding note.
EG: Preceding note inputs were jump + move up (dual up). Current note inputs will also be jump + move up.

Patterns have a unique ID, a defined amount of pattern notes, a dual target count, and a pattern type.

The dual target count of a pattern sets the amount of dual notes that the generation algorithm will try to place when using a pattern. This amount might not always be accurately respected depending on which note types are generated and the additional constraints they might be subject to.

Each pattern type is a set of predefined values affecting the likelihood of a certain note type being generated.
"Jump" will output jumps.
"Move" will output 50% of return moves and 50% of stray moves.
"MoveReturn" will output return moves.
"MoveStray" will output stray moves.
"Any" will output 50% of jumps, 25% of return moves and 25% of stray moves.
"AnyReturn" will output 50% of jumps and 50% of return moves.
"AnyStray" will output 50% of jumps and 50% of stray moves.
"Keep" will output notes similar to the preceding one.
"SwitchJM" will output notes that will always switch from a preceding jump to a move (50% return, 50% stray) and always switch from a preceding move to a jump. Switching from a dual will always produce a move in the opposite direction (return move).
"SwitchJMReturn" is the same as "SwitchJM", but switching from a preceding jump will only output return moves.
"SwitchJMStray" is the same as "SwitchJM", but switching from a preceding jump will only output stray moves.
"SwitchAny" will output notes that will switch from a preceding jump to a move (50% return, 50% stray) and switch from a preceding move to either a jump or a return move (50% chance of either). Switching from a dual will always produce a move in the opposite direction (return move).
"Custom" will have specific outputs for each pattern note, depending on how their parameters were set up (see below).

Each pattern note has a set of values affecting the likelihood of a certain type being generated. These values are the same for each pattern note except when using a "Custom" pattern type, which allows for a finer control over the output of a pattern. These values are:

- An index (starting at 0) that defines the pattern note chronological position in the pattern.

- A "from previous" value which defines the relationship of the current note with the preceding one.
"None" is the default (and most commonly used) value. It sets no specific relationship with the preceding note. This allows the note type to be generated as return move, stray move, jump, return dual, or stray dual.
"Switch" will set the current note to use an input that wasn't used on the preceding note.
"Keep" will set the current note to use the same input(s) that was used on the preceding note.

- A "move/jump ratio" (normalized from 0 to 1). A value of 0.0 ensures that the note will be a move. A value of 1.0 ensures that the note will be jump. A value of 0.5 sets a 50% chance of the note being either a move or a jump.

- A "return/stray ratio" (normalized from 0 to 1). This will be applied if the generation has to choose between Return or Stray (for a move or a dual). A value of 0.0 ensures that the note's move will be a return one. A value of 1.0 ensures that the note's move will be a stray one. A value of 0.5 sets a 50% chance that the note's move will be a either a return one or a stray one.

- A "dual weight" value (only effective if pattern's "dual target count" is greater than 0). This is a probability weight that will be checked against the dual weights of the other notes of the pattern to decide if this note should be a dual.
Generations
The actual sequence of note types generated from a pattern is called a generation. They are identified by a unique ID. Multiple generations can be created from the same pattern. A specific generation can be re-used multiple times. This allows to have notemap parts where the notes are never the same on each try, but still feel coherent and familiar within the same try.
EG: The notes of a riff that is repeated throughout a song are good candidates for re-using the same generation. Depending on the pattern, the riff notes could be entirely regenerated on each new level try, but the riff would be played the same way (meaning using the same notes) during a try.

Note that some patterns, by their very nature, do not allow for any variation. Creating different generations from these patterns will yield the same result every time (EG: "Jump", "MoveReturn", "MoveStray", any "Custom" pattern where each note ratios are set to their minimum or maximum values...).

When generating the notemap, any note found without an associated pattern/generation will be generated using a default pattern instead.
Pattern changes
A pattern can be applied by setting a pattern change on a note. The pattern will be used from its start and affect every note chronologically until another pattern change is found.

A pattern change is composed of three parameters:

- A pattern ID that specifies which pattern will be used for the pattern change.

- A generation ID that specifies which generation will be used for the pattern change. A new sequence of note types will be created if the generation ID hasn't been used so far (i.e. never been used in a chronologically anterior pattern change for the same pattern ID). If the generation ID has been used, the sequence of note types from the generation it's referring to will be used instead.

- A "Regenerate on loop" option. This option affects what happens when the pattern is applied over more notes than it actually contains.
When inactive, the sequence of note types will be generated once and used over and over until the next pattern change.
When active, a new generation will be created each time all the note types of the previous one have been placed. Keep in mind that if the generation ID is re-used later in the notemap, it will only output the FIRST sequence of note types that was originally generated. Any other generation resulting of a loop cannot be referred to.
This option can be used to place the same regenerating pattern successively without having to manually set a pattern change every time it loops.
EG: An "Any" pattern of 1 note with "Regenerate on loop" active can be set once and will output random notes until the next pattern change.
Navigation/Edition panels
These panels contain functions you'll use frequently when mapping a level. Most of these functions have a dedicated keyboard shortcut (check out the "Settings" menu).

-- TEST LEVEL PANEL -- (not labeled, top-right of the screen)

[[ Freeze time ]] If checked, time will be frozen during test level.
[[ Keep time position on stop test level ]] If checked, time position will be kept as is when returning to notemap editor during test level. If unchecked, time position will be reset back to its value when test level was launched.
[[ Mute sound ]] Toggles whether the song will be played during test level.
[[ Use alternate time factor ]] If checked, time will go at the rate specified in the "Alt. time factor" typebox. Useful to slow down time and check note timings.
[[ Offset on level start ]] Sets the offset (in seconds) that will be added to the current time position when launching test level.
[[ Test level ]] Launches the test level at the current time position (plus offset).

-- NAVIGATION PANEL -- (not labeled, bottom-left of the screen)

[[ Time position ]] Displays/sets the current time position (in seconds) of the editor cursor.
[[ Level start/end ]] Sets the time position to the start/end of the level.
[[ Previous/next gridline/note/section ]] Sets the time position to the previous/next gridline/note/section when applicable.
[[ Add note ]] Displayed label depends on context:
- [[ Add note ]] The editor cursor is not hovering any note: adds a note at the current time position (note might be placed during a held note too).
- [[ Group with previous note ]] The editor cursor is hovering a note that can be grouped: sets that note as part of a held group. Depending on the other surrounding notes, it will be set as a middle held note or an end held note. The preceding note will become a held note, unless it was already an end held note, in which case it will become a middle held note.
- [[ Set joined note ]] The editor cursor is hovering an end held note: adds a joined note over it.
- [[ Ungroup from previous note ]] The editor cursor is hovering a joined note: deletes the joined note and ungroup the underlying end held note.
[[ Delete note ]] Deletes the note currently hovered by the editor cursor when applicable.
[[ Add section ]] Adds a section at the current time position.
[[ Remove section ]] Removes the section at the current time position.
Grid settings menu
All the parameters of this menu only apply to the editor. They are intended to help create the notemap and have NO effect on the level itself.

-- GRID LINES --

[[ BPM ]] Defines the proper spacing between the beat gridlines based on the song's tempo. This spacing is also affected by the scrollspeed. Note: this value is saved in the level data for editing convenience.
[[ Beat division ]] Sets how many sub lines will divide each beat.
[[ Offset ]] Sets the time position of the first beat.
[[ Zoom ]] Sets a zoom factor on the gridlines spacing. This value is always set to 1 during test play.
[[ Display lines during test play ]] Allows to see gridlines while test playing.
Patterns menu
All the values of this panel affect pattern data. They will not affect the notemap unless said pattern is placed on a note via a pattern change.
IMPORTANT: This panel is updated every time the editor cursor is moved, to reflect the data of the note hovered by the cursor. The panel will be empty of any value if no note is hovered.

-- PATTERN --

[[ ID ]] Displays the ID of the current pattern. Can be used to select any pattern.
[[ Note count ]] Sets how many notes the pattern will hold.
[[ Dual target count ]] Sets how many dual notes the pattern will allow to generate.
[[ Pattern Type ]] Sets the pattern type used for generation. Selecting "Custom" will give access to more options (individual pattern notes).

-- PATTERN NOTES -- (only displayed when pattern type "Custom" is selected")

[[ Index ]] Index of the pattern note that is currently being edited.
[[ From previous ]] Sets the relationship of the pattern note with the previous one.
[[ Move/jump ratio ]] Sets the proportion of moves and jumps that will be generated for this note. Value normalized from 0 to 1. 0 will always generate a move. 1 will always generate a jump.
[[ Return/stray ratio ]] Sets the proportion of return moves and stray moves that might be generated for this note if it has a move. Value normalized from 0 to 1. 0 will always generate a return move. 1 will always generate a stray move.
[[ Dual weight ]] Sets the probability weight for this note to be a dual note. This will be checked against the dual weights of the other notes of the pattern. Will have no effect if [[ Dual target count ]] isn't greater than 0.

-- PATTERN CHANGE PANEL -- (not labeled, appears when editor cursor is on a note)

[[ Set pattern change ]] If checked, will set the current cursor selected note as having a pattern change. Uncheck to remove any pattern change.
[[ Pattern ID ]] Sets which pattern should be used on this pattern change.
[[ Gen ID ]] Sets which generation should be used on this pattern change.
[[ Regenerate on loop ]] If checked, a new generation will be used every time the pattern used on this pattern change loops (i.e. all the pattern notes has been placed). IMPORTANT: Any new generation created this way past the original one will not be assigned an ID and thus cannot be referred to.
[[ Get new pattern ]] Selects a new (unused) pattern for this pattern change. If pattern ID isn't updated when clicking this button, then the current pattern is new (as in not used anywhere in the notemap).
[[ Get new generation ]] Selects a new generation for this pattern change. If generation ID isn't updated when clicking this button, then the current generation is new (as in not used anywhere in the notemap).
Snippets menu
Snippets are bits of the notemap that you can copy and paste. They are defined by a start time position and an end time position. Any note contained within this timespan will be copied, along with any pattern change they might have. The generation ID for a pattern change used in a pasted snippet will be the earliest one that can be found preceding the time position where it's pasted, same as when setting the pattern ID of a pattern change.

-- SNIPPETS --

[[ Delete snippet ]] Deletes the currently selected snippet.
[[ Place snippet ]] Places the currently selected snippet.

-- CREATE SNIPPET --

[[ Name ]] Sets the name for the snippet currently being created.
[[ Start time ]] Sets the start time position for the snippet currently being created.
[[ End time ]] Sets the end time position for the snippet currently being created.
[[ Set as current position ]] Can be pressed to use the current time position for the start/end time typeboxes.
[[ Save snippet ]] Saves a snippet using all the previous values.
3 Comments
xXHorry Dec 9, 2024 @ 11:15am 
Ah okay
Freddy Dec 7, 2024 @ 6:58am 
show
White_w01F Dec 5, 2024 @ 7:04pm 
RGERSGERW:steamthumbsup: