Level Collections is a BepInEx plugin for Human: Fall Flat. It provides the ability to create custom level collections and play through them just like the built-in dreams list.
- Install BepInEx to your game and launch the game once
- Navigate to
<game_root_directory>/BepInEx/plugins/ - Put the plugin's
.dllfile inside - Restart the game, and that's it
After the first launch with the plugin, a JSON file LevelCollections.json will be created in ./BepInEx/config/ , with an example collection.
{
"RandomLevelCount": 5,
"RandomLevelPool": [
"Intro",
"Train",
"Carry",
"Climb",
"Break",
"Siege",
"Water",
"Power",
"Aztec",
"Halloween",
"Steam",
"Ice"
],
"Collections": [
{
"Name": "Example Collection",
"Levels": [
"Intro",
"Water",
"Train",
"Carry",
"Climb",
"Halloween",
"Steam",
"Ice"
]
}
]
}Each collection has a Name (displayed in the UI) and a Levels array of LevelId strings. The plugin auto-detects the level type from the LevelId — you don't need to specify whether a level is BuiltIn, EditorPick, or Workshop.
RandomLevelCount and RandomLevelPool drive the lc random console command: it draws RandomLevelCount levels at random from RandomLevelPool to form a temporary collection and starts playing it. The random collection is never written back to the config file — it only exists for the duration of that run.
- If
RandomLevelPoolis missing/empty, the 12 regular BuiltIn levels are used as the default pool; ifRandomLevelCountis missing or below 1, it defaults to 5. - Levels that are currently unavailable (e.g. unsubscribed workshop levels) are filtered out before drawing; if fewer levels are available than requested, all of them are used.
- Launch the game and navigate to the level select menu (Play → Select Level).
- A new COLLECTIONS button appears at the top-right, click it to enter the collections menu.
- The Collections menu has three panels:
- Left — your collection list. Click or use arrow keys to select a collection.
- Middle — the levels in the selected collection. Press Right Arrow to move focus here from the collection list, Left Arrow to go back.
- Right — level info panel showing the thumbnail and title of the currently selected level.
- Double-click a level or press Enter to start playing it.
- BACK button (or Escape) returns to the level select menu.
- When you complete a level, the next one in the collection starts automatically. Finishing the last level takes you back to the main menu.
- REFRESH button to reload config.
- The plugin's own UI text (the COLLECTIONS button, menu/panel titles, BACK / REFRESH / START) follows the game language: Simplified Chinese (
合辑,返回, …) and Japanese (コレクション,戻る, …) are supported, every other language falls back to English. Change the language in Options → Language and the text updates immediately.
Open the in-game developer console with BackQuote (`) or F1 and use the lc command group:
| Command | Description |
|---|---|
lc random [seconds] |
Draw a random collection from the config level pool and start playing it (works without an active run). |
lc restart [seconds] |
Restart the current collection from its first level. |
lc skip [seconds] |
Skip the current level and load the next one (completes the run on the last level). |
lc abort |
Cancel a pending delayed command. |
[seconds]is an optional positive integer — the command fires after that many seconds. During the final 5 seconds a countdown is printed to the console once per second.- A delayed command is cancelled if the collection run ends or you switch collections before the delay elapses.
- While a delayed command is pending, new
lc restart/lc skipcommands and a delayedlc randomare refused — uselc abortto cancel it first. A plainlc random(no delay) starts a new random run immediately and cancels the pending delay. lc randomdoes not require an active run (you can use it straight from the main menu);lc restart/lc skiponly work while a collection run is in progress (single player).
These are the base-game levels. Use the ID in your JSON config:
| ID | Display Name |
|---|---|
Intro |
Mansion |
Train |
Train |
Carry |
Carry |
Climb |
Mountain |
Break |
Demolition |
Siege |
Castle |
Water |
Water |
Power |
Power Plant |
Aztec |
Aztec |
Halloween |
Dark |
Steam |
Steam |
Ice |
Ice |
Intro_Reprise |
Reprise |
Credits |
Credits |
Community-made levels curated by the developers. Use the ID in your JSON config:
| ID | Display Name |
|---|---|
Thermal |
Thermal |
Factory |
Factory |
Golf |
Golf |
City |
City |
Forest |
Forest |
Lab |
Laboratory |
Lumber |
Lumber |
RedRock |
Red Rock |
Tower |
Tower |
Miniature |
Miniature |
CopperWorld |
Copper World |
Naval_Ben |
Port |
OceanAdventure |
Underwater |
Dockyard |
Dockyard |
Museum |
Museum |
Hike |
Hike |
Candyland |
Candyland |
Facility |
Test Chamber |
SteamPunk |
Steampunk Party |
Viking |
Viking |
Anniversary |
10th Anniversary |
- Subscribed Workshop levels: use the numeric Workshop file ID as a string (e.g.
"123456789"). - Local Workshop levels: use the folder name from your local workshop directory.
Note: Workshop thumbnails and titles depend on
WorkshopRepositoryhaving finished loading its metadata. If a workshop thumbnail or title shows as missing, try refreshing the Subscribed tab first.
The tables above can be regenerated automatically from the game's own localisation data (so new levels added by game updates appear without manual editing):
python3 tools/gen_level_table.py # levels used in LevelCollections.json
python3 tools/gen_level_table.py --all # every known level (in-game order)
python3 tools/gen_level_table.py --lang "Chinese Simplified" # zh-CN names
python3 tools/gen_level_table.py --all -o docs/LEVEL_TABLE.md # write to fileThe script reads the localisation CSV stored inside
<game>/Human_Data/sharedassets0.assets (the same table the game parses at
runtime), plus BepInEx/config/LevelCollections.json for the IDs in use. Rows
are ordered by the game's own levels[] / editorPickLevels[] arrays, so the
table mirrors the in-game level order. Levels not recognised as
BuiltIn/EditorPick are marked with ? — check those rows when a game update
ships new levels.
- .NET SDK (the project targets
netstandard2.0) - A copy of Human: Fall Flat installed via Steam
- BepInEx 5.x installed in the game directory
The .csproj file hardcodes two paths pointing to the game and BepInEx directories. The defaults use the Linux Steam path — Windows users must adjust them before building.
Open LevelCollections.csproj and locate the <PropertyGroup> at the bottom. Edit the two paths to match your system:
Linux (default, no changes needed):
<GAME_MANAGED>$(HOME)/.local/share/Steam/steamapps/common/Human Fall Flat/Human_Data/Managed</GAME_MANAGED>
<BEPINEX_CORE>$(HOME)/.local/share/Steam/steamapps/common/Human Fall Flat/BepInEx/core</BEPINEX_CORE>Windows (typical Steam path — adjust if your library is on a different drive):
<GAME_MANAGED>C:\Program Files (x86)\Steam\steamapps\common\Human Fall Flat\Human_Data\Managed</GAME_MANAGED>
<BEPINEX_CORE>C:\Program Files (x86)\Steam\steamapps\common\Human Fall Flat\BepInEx\core</BEPINEX_CORE>Alternatively, you can pass the paths on the command line without editing the file:
dotnet build --no-restore -c Release -p:GAME_MANAGED="C:\...\Human_Data\Managed" -p:BEPINEX_CORE="C:\...\BepInEx\core"
dotnet build --no-restore -c ReleaseThe output DLL is at bin/Release/netstandard2.0/LevelCollections.dll. Copy it to <game>/BepInEx/plugins/.
All dependencies are referenced directly from the game and BepInEx directories via <HintPath> in the .csproj — no NuGet restore is needed.