Botera Studio
Discord

Lantern Deep

The full guide

Everything needed to open the kit, build its art and make it yours — readable in full before you spend anything.

This is the guide that ships inside the product, word for word — the file INSTALL.md in your archive. It is kept in English so that what you read here is exactly what you receive.

1. Tools (about 5 minutes)

  1. Install Rokit (<https://github.com/rojo-rbx/rokit>), then in the folder: rokit install. It fetches Rojo, Lune,
  2. StyLua, Selene, luau-lsp and uv at the versions in rokit.toml. You should see each tool installed. 0.1 s when the tools are already there; the first run downloads six programs: NOT MEASURED.

  3. uv sync creates the Python environment the tools use (.venv) from uv.lock. 0.3 s with the packages already downloaded; a first run downloads them:
  4. NOT MEASURED.

  5. Check the package on your machine: bash tools/check.sh. It formats, lints, type-checks, runs every test suite
  6. (including the run simulator) and builds the place; it should end with GATE GREEN (full). 50 s (18 suites, among them the run simulator, and the place build).

2. Make it yours

Edit project.json: put your Roblox user id in creatorUserId (the number in your profile's address), or a group's in creatorGroupId if the experience belongs to a group. Leave universe and place at 0 until step 8.

3. Play it now, with plain shapes (about 2 minutes)

The package carries no art and no ids of the developer: src/shared/Data/Ids.luau is blank, and everything that would be drawn from an asset of yours is drawn as nothing, or as the plain shapes the game was first built with; the store is hidden. That is enough to play, test and change the game before you make anything.

  1. bash tools/build_place.sh writes LanternDeep.rbxl (1.1 MB). 0.4 s.
  2. Open it in Roblox Studio and press Play (Home tab, "Play"). You arrive at the lighthouse; the bell starts a dive.

4. An Open Cloud API key

The upload and publish tools talk to Roblox with your own API key. Create one at <https://create.roblox.com/dashboard/credentials> ("Create API Key"): permissions Assets (read and write) with your account or group as the owner; add Universe Places (write) and Luau Execution Sessions (write) only if you will use tools/publish.py and tools/cloud_run.py. Give the key to the tools with the environment variable ROBLOX_OPEN_CLOUD_KEY (in PowerShell: $env:ROBLOX_OPEN_CLOUD_KEY = "<the key>"), or keep it in a file outside the folder and pass --key-file <file>. The tools never print it, and it is never written into the project: keep it out of any repository you make of the package.

5. Make the art and upload it (the long step)

Every model, texture, icon and effect is made by a script in blender/scripts (Blender 5.2, run without a window) or in tools/, uploaded to your account by tools/upload_assets.py, and named in blender/uploaded.json. Then python tools/setup_ids.py writes the ids into src/shared/Data/Ids.luau, where the game reads them by name.

With BLENDER the path of your Blender executable (the commands are the ones the developer used; a script that takes names makes only those):

PartCommands, in order
Models (divers, guns, creatures, hub, props, decor, tiles, vista)"$BLENDER" -b --factory-startup --python blender/scripts/<script>.py for each model script of blender/scripts that starts with build_ (or divers_, creatures_, wardens_, keepers_), then uv run python tools/upload_assets.py (uploads blender/manifest.json), then uv run python tools/upload_assets.py --manifest blender/manifest_creatures.json
Baked bodies (creatures, wardens, divers)"$BLENDER" -b --factory-startup --python blender/scripts/crab_hd_m15.py (the pattern; the others are creatures_m15.py), then uv run python tools/upload_assets.py --manifest blender/manifest_crabhd.json
Materials"$BLENDER" -b --factory-startup --python blender/scripts/materials_m15.py, then uv run python tools/upload_assets.py --manifest blender/manifest_materials.json, then uv run python tools/gen_materials.py
Icons"$BLENDER" -b --factory-startup --python blender/scripts/icons.py, uv run python tools/icon_atlas.py, upload blender/manifest_icons.json (each atlas is uploaded as a decal; put the image id it gives in blender/icon_images.json), then uv run python tools/gen_icons.py
Effects (bullet disc, bubble, sky, flipbooks)uv run python tools/fx_sheet.py, "$BLENDER" -b --factory-startup --python blender/scripts/fx_sims_p4.py and fx_sims_f6.py, then uv run python tools/upload_assets.py --manifest blender/manifest_fx.json
The idsuv run python tools/setup_ids.py, then uv run python tools/gen_asset_meta.py

NOT MEASURED and NOT RUN as one session on a machine other than the developer's: the developer made this art over weeks, script by script, and did not time a rebuild of all of it. The uploads are limited by Roblox (moderation takes minutes per batch); upload_assets.py skips what is already uploaded, so you can stop and go on.

6. Build the models in Studio

Uploaded meshes become the game's models in Studio (they are restored to their exact sizes and dressed with the materials). Open LanternDeep.rbxl (rebuild it after step 5: bash tools/build_place.sh), then in Studio's command bar:

require(game.ServerStorage.LDTools.AssetBuilder).build()

It reports one line per model (ok or the reason). Right-click ReplicatedStorage.LDAssets in the Explorer, "Save to File...", and save it over assets/LDAssets.rbxm; rebuild the place. The materials come from assets/LDMaterials.model.json, which tools/gen_materials.py wrote in step 5. Then look at the lighthouse in Studio before you publish: a published game draws a material's maps only from its texture pack, and Studio makes the pack when it draws the material. NOT MEASURED, and NOT RUN on a creator's account other than the developer's.

7. Products and passes (optional)

The store is hidden until you set a product. uv run python tools/setup_ids.py --list prints the offers the game sells (name, kind, price). Create each on your experience (Creator Hub, Monetization), put its id next to its key in sale/products.json, and run uv run python tools/setup_ids.py again. An offer whose id stays 0 is not shown.

8. Publish

Create an experience in the Creator Hub, put its universe and place ids in project.json, open the place in Studio and use File, "Publish to Roblox" (or tools/publish.py if you keep the project in git and want the tested release path it documents). Set the experience's supported languages to English and French, and turn Automatic Text Capture and translated content off (the game translates itself, from src/shared/Lang; the texts of your store page are yours to write, in both languages).

If a step fails

Send the conversation on the resource's page the step's number and its output (never a key). Common causes: a tool at the wrong version (rokit install again), the key missing a permission (the tool says which request failed), an asset still in moderation (uv run python tools/upload_assets.py --status <Name> reads its state).

Support: Botera Studio, on Discord (https://discord.gg/enaYMavQbW).

Back to the product Discord