This is the guide that ships inside the product, word for word: the file INSTALL.md in your archive. English is the reference, so that what you read here is exactly what you receive. Read this guide in French
1. Tools
- Install Rokit (<https://github.com/rojo-rbx/rokit>), then in the package's folder:
rokit install. It fetches Rojo, Lune, StyLua, Selene, luau-lsp and uv at the versions inrokit.toml. uv synccreates the Python environment the tools use (.venv) fromuv.lock.- Check the package on your machine:
bash tools/check.sh(Git Bash on Windows). It ends withGATE GREEN (full). The tests that read art you have not made yet (the models, the uploads' ids, the audio files) and the developer's own documents are listed asskipin their suite's output and the audio checks say they were not run: they run in full once the art is made. Measured with the package unzipped into an empty folder, tools already installed (a warm cache):rokit installabout 1 s,uv syncunder 1 s, the full gate 10 min 1 s (164 steps green) for version 1.1.0, measured on 2026-10-13 at below-normal priority on a Windows 10 desktop that was in use meanwhile (version 1.0.0's 142 steps took 2 min 29 s on 2026-10-09 on a quiet machine, so a quiet machine may be faster; allow ten minutes). NOT MEASURED: a first install of the tools on a machine that has none (it downloads six tools and the Python packages: the time is your connection's).
2. Make it yours
project.json is already blank. Put your Roblox user id in creatorUserId (the number in your profile's address), or a group's id in creatorGroupId. Leave universe, place, testUniverse and testPlace at 0 until the publish step.
3. Play it now, with nothing drawn from art
The package's ids are blank, so every image of the game is drawn as nothing, every model that is missing is drawn as a plain shape and a game with no pass has no store. That is enough to build, test and change the game before you make anything.
bash tools/build_place.shwrites the place fileSmackwater.rbxl: 0.1 s and 1.5 MB (measured).- Open it in Roblox Studio and press Play (Studio's own Play, one client). The game starts a match against a bot: your fighter is a plain figure in his slot's colour (a cylinder, a ball for a head and a nose that shows the way he faces), the arena is its decks as flat slabs over the sea and a sky, the HUD shows the percentages and the clock, the touch controls are plain translucent discs, and nothing makes a sound: no picture, model or sound is asked of Roblox. The settings screen opens with every tab but no Shop (a game with no pass has no store). The developer read exactly this on 2026-10-13, from the place that version 1.1.0 of this package builds (not the live game's), in a real Studio client: a match from the line-up to the result on a desktop (1920 x 1080) and on a phone's screen (a mid-range preset, landscape), 34 of 34 checks each time, no error in the output on either side and the interface probe finding nothing on the match, the settings and the result. The one warning is the line that says the Wharf's model is not made yet. A real phone in your hand and a real pad are NOT RUN.
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"): permission Assets (read and write) with your account or group as the owner; add Universe Places (write) only if you will use tools/publish.py and Game Passes (write) and Luau Execution Sessions (write) only for the passes and tools/cloud_run.py. Give the key to the tools with the environment variable ROBLOX_OPEN_CLOUD_KEY (PowerShell: $env:ROBLOX_OPEN_CLOUD_KEY = "<the key>"; Git Bash: export ROBLOX_OPEN_CLOUD_KEY=<the key>), or keep it in a file outside the folder and pass --key-file <file> to a tool. 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)
- Install Blender 5.2 LTS (<https://www.blender.org/download/lts/>).
tools/make_art.pyfinds it on the PATH, in theBLENDERenvironment variable or with--blender <path to blender.exe>. uv run python tools/make_art.pyruns, in order, the texture download (15 CC0 sets, 770 MB at 2K:tools/fetch_textures.py), the 51 Blender runs (the five arenas' kits, vistas and skies, the nine fighters with their rigs and- Upload, in this order (each tool skips what it has already uploaded; the results are written to
blender/uploaded.jsonandassets/audio_uploaded.json):
animation clips, the props, the interface's badges, portraits, glyphs and tiles, the effects' flipbooks) and the audio synthesis (every sound and every piece of music, mastered to a loudness target). --list shows the steps, --only, --group and --from run some, and every step's seconds go to build/make_art.json. Measured once, on 2026-10-09, from the unzipped package on the developer's Windows 10 desktop (Blender 5.2, below-normal priority, the machine busy with other work, so a quiet machine may be quicker): 46 steps in 7,298 s (2 h 02 min). That was the package of seven fighters and four arenas; the pipeline has 54 steps today, and the eight added since (the Night Market's kit, vista, sky and sky vista, and the Wavewright's and the Rigger's models and clips) are timed in the next paragraph. The longest are the Wharf's vista (649 s), the Gull's and the Shellwright's animation clips (567 s and 557 s), the Stevedore's, Netmender's, Keeper's and Diver's clips (361 to 415 s each), the Wharf's kit (360 s); the seven fighters' animation clips together take 3,018 s (50 min), the texture download 160 s, the audio 92 s. The unzipped folder is 2.0 GB afterwards (blender/ 920 MB, build/ 800 MB with the fetched textures, audio/out 115 MB). On that run it made 105 FBX meshes, 1,204 PNGs under blender/ and 409 audio files; the full nine-fighter run from a clean package has NOT BEEN MEASURED (its folder is larger). A failed step stops the run and says which: run --from <step> after fixing it. The eight steps added since, timed on 2026-10-13 (the developer's working copy, not the unzipped package; Blender 5.2, below-normal priority, started when no full-screen app was in front, the machine possibly busy with other work afterwards): the Night Market's kit 772 s, its vista 313 s, its sky 50 s, its sky vista 29 s, the Wavewright's model 244 s and clips 106 s, the Rigger's model 219 s and clips 115 s: 1,847 s (30 min 47 s) together. Added to the earlier run that makes 9,145 s (2 h 32 min), but that is a sum of two runs on two days, not one measured run of the nine-fighter package. The same run was also a check that the scripts reproduce the developer's art: the two new fighters' clip tables came out identical to the committed ones once StyLua had formatted them, and the manifest came out identical but for one number (the pagoda's centre height in MarketPagoda: 121.0295 against 115.3609 committed; the cause was not found), so a model you build can differ slightly from the live game's; the preview PNGs the run writes are not byte-identical to the committed ones (they were not compared by eye).
uv run python tools/upload_assets.py --manifest blender/manifest_textures.json
uv run python tools/upload_assets.py --manifest blender/manifest_kit_textures.json
uv run python tools/upload_assets.py --manifest blender/manifest_fighter_textures.json
uv run python tools/upload_assets.py
uv run python tools/upload_assets.py --manifest blender/manifest_sky.json
uv run python tools/upload_assets.py --manifest blender/manifest_hud.json
uv run python tools/upload_assets.py --manifest blender/manifest_fx.json
uv run python tools/upload_audio.py --report
The image and model tools send them one at a time; Roblox moderates each upload ("Reviewing", then "Approved": uv run python tools/upload_assets.py --status counts them by state). The audio tool sends at most 30 sounds a run (--batch N changes it); send a batch, read uv run python tools/upload_audio.py --status, then the next, and never send a sound that assets/audio_flagged.json holds back. NOT MEASURED: the upload times.
uv run python tools/make_materials.py --variantswrites your material variants (assets/materials/) from the texture ids, replacing the package's empty ones.uv run python tools/gen_asset_meta.pywrites your ids into the data tables (src/shared/Data/AssetMeta.luau,HudImages.luau,FxImages.luau,Skies.luau,Sounds.luau,Layouts.luau). Run it after every upload batch: a name with no
id yet stays out of the table, and the game draws it as the plain shape or as nothing.
6. Build the models in Studio
The models are assembled in Studio from your uploaded meshes, with the sizes the manifests record (the FBX import scale is not trusted).
bash tools/build_place.shand openSmackwater.rbxlin Roblox Studio (File, Open from File).- In the command bar, run
require(game.ServerStorage.Tools.AssetBuilder).build()(every model), then, one by one,require(game.ServerStorage.Tools.AssetBuilder).buildLayout("Wharf"),"WharfVista","Barge","BargeVista", - Right-click the
Assetsfolder, "Save to File...", and save it overassets/Assets.rbxm. Rebuild the place (bash tools/build_place.sh): the fighters, arenas and props are drawn.
"Rock", "RockVista", "Ferry", "FerryVista", "Market" and "MarketVista" (the ten layouts of the five arenas, from the kits). The models appear in ReplicatedStorage.Assets.
NOT MEASURED: this step has only been run by the developer through the studio's own automation, never from the blank package.
7. Products and passes (optional)
The store sells cosmetics only (nine costumes, a wardrobe pack, the Harbour Patron pack and the season pass). Its passes are yours to make: uv run python tools/publish.py scopes says what your key may do, uv run python tools/publish.py offers plan lists the ten offers with their prices, and uv run python tools/publish.py offers create --target public creates the passes your experience lacks and writes their ids into src/shared/Data/OfferIds.luau. A game with no pass in its experience shows no store and works without one.
8. Publish
Create the experience in the Creator Hub, put its ids in project.json, open Smackwater.rbxl in Studio and publish it with File, Publish to Roblox (the Place Publishing API does not update a SurfaceAppearance, which the fighters and arenas use, so a publish from Studio is the way). Studio makes the texture packs when it publishes. tools/publish.py is the developer's own release tool (a pushed git branch, a test experience, a smoke test, a rollback); you do not need it. The age questionnaire and the first public release are Creator Hub steps only a person can do.
9. Tuning the balance
The numbers a fight is made of are in data files: src/shared/Data/Feel.luau (hitstop, knockback, the buffers), Juice.luau (the feedback), the fighters' Stats.luau and Moves.luau in src/shared/Fighters/<Name>/, and the items, arenas and league in src/shared/Data/. After a change, run bash tools/check.sh: the move lint, the knockback table, the bots' matrices and the mutation check hold the rules together, and lune run tools/framedata rewrites the frame data.
If a step fails
no Open Cloud API key: set ROBLOX_OPEN_CLOUD_KEY or pass --key-file PATH: the tool found no key. Step 4.make_art: Blender 5.2 LTS was not found: pass--blender <path to blender.exe>or setBLENDER.make_art: <step> failed after N s: the last lines of the step are printed; fix the cause, thenuv run python tools/make_art.py --from <step>goes on from there.lock_check: Packages/Foundation differs from foundation ...: a file of the vendored library was edited. Put the original back from the package.- A sound the tool refuses ("flagged"):
assets/audio_flagged.jsonholds back the families Roblox took down on the developer's account; leave them out. - Everything else: say which step failed and paste its output (never a key) in the conversation on the resource's page.