Skip to content

Repository files navigation

Level Collections

中文 · 日本語

Overview

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.

Installation

  1. Install BepInEx to your game and launch the game once
  2. Navigate to <game_root_directory>/BepInEx/plugins/
  3. Put the plugin's .dll file inside
  4. Restart the game, and that's it

Configuration

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 RandomLevelPool is missing/empty, the 12 regular BuiltIn levels are used as the default pool; if RandomLevelCount is 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.

Usage

  1. Launch the game and navigate to the level select menu (Play → Select Level).
  2. A new COLLECTIONS button appears at the top-right, click it to enter the collections menu.
  3. 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.
  4. Double-click a level or press Enter to start playing it.
  5. BACK button (or Escape) returns to the level select menu.
  6. When you complete a level, the next one in the collection starts automatically. Finishing the last level takes you back to the main menu.
  7. REFRESH button to reload config.
  8. 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.

Console Commands

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 skip commands and a delayed lc random are refused — use lc abort to cancel it first. A plain lc random (no delay) starts a new random run immediately and cancels the pending delay.
  • lc random does not require an active run (you can use it straight from the main menu); lc restart / lc skip only work while a collection run is in progress (single player).

Supported Level IDs

BuiltIn

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

EditorPick (Extra Dreams)

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

Workshop levels

  • 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 WorkshopRepository having finished loading its metadata. If a workshop thumbnail or title shows as missing, try refreshing the Subscribed tab first.

Regenerating the tables

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 file

The 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.

Building from Source

Prerequisites

  • .NET SDK (the project targets netstandard2.0)
  • A copy of Human: Fall Flat installed via Steam
  • BepInEx 5.x installed in the game directory

Configure Paths

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"

Build

dotnet build --no-restore -c Release

The 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.

License

GNU LGPL v3

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages