Curitor
Gameplay Systems · Topic Guide

Generated Maps

Pick the Generated Map level and every round starts on a course nobody has seen before — carved from one shared seed, guaranteed completable, and dressed with tiles you can swap for your own without writing code.

Overview

Hand-tuned levels are the toolkit's bread and butter, but a party round lives on novelty. The Generated Map level builds its course at load time: a winding causeway of platforms through water, with jump gaps, height steps, checkpoints on lap circuits, direction arrows — and moving obstacles on the route.

The design decision everything else hangs on: a map is pure data rolled from one seed. Only three values ever travel over the network — seed, size, type — and every machine builds the identical world from them locally. No geometry is replicated, ever.

Hosting a generated round

Select the Generated Map level like any other. For this level the host panel grows three extra controls:

  • Size — Small, Medium or Big. Size also sets the session capacity: a Small map lays out 4 spawn points, a Big one 8.
  • Type — a Goal Race (start to finish, first over the line wins) or a Lap Circuit (a closed ring with ordered checkpoints and a lap counter).
  • Seed — leave blank for a fresh roll, or type a number to pin the exact course. With reseeding on, every round restart rolls a new map; with a fixed seed the course stays — sharing a seed with a friend shares the map.

From code, the same seam is one call:

DailyChallenge.cs
using Curitor.PartyCoreKit.Maps;
using UnityEngine;

// Everyone who plays today gets the SAME course, because everyone
// derives the same seed. Same seed = same map, on every machine.
public class DailyChallenge : MonoBehaviour
{
    public void ConfigureSession()
    {
        int daySeed = int.Parse(System.DateTime.UtcNow.ToString("yyyyMMdd"));
        MapSession.BeginFresh(MapSize.Medium, MapType.LapCircuit, daySeed);
    }
}

Your content, zero code

Everything visible on a generated map comes out of one asset: the Map Tile Catalog. Each entry is a prefab, a category, and a selection weight. The stock set ships pre-wired; your edits survive every reinstall, and setting a weight to 0 retires an entry without deleting it.

FieldTypeWhat it does
PlatformstructuralThe walkable floor tile. Every ground, start, finish and checkpoint cell stands on one, picked by weight.
Drop-Zone FillerstructuralThe water that fills a jump gap — and everything off the route.
Start / End ZonestructuralThe flat marker panels on the start cell and on finish/checkpoint cells.
Specialchance décorProps sprinkled by chance, each with its own placement contract: on the route, beside it, or anywhere off-path.
Direction MarkerguidanceThe run-direction arrow laid on every Nth route cell. Optional — a catalog without one simply emits no arrows. Reskin by swapping the prefab.
Path ObstaclegameplayA moving hazard placed ON the route — an exact count per map, never a chance roll. Brings its own motion component and must never fully block its cell.
  1. Open the catalog

    The MapTileCatalogasset under the toolkit's Maps folder — or your own copy wired into the generator config.
  2. Add an entry

    Assign your prefab, pick the category, set a weight. Structural tiles expect a cell-sized footprint with the pivot at the walkable top; Special and Path Obstacle prefabs are placed as-authored on the cell floor.
  3. For Specials: choose a placement

    On the route, adjacent to it, or anywhere off-path. The generator honors the contract per entry.
  4. Play

    The next generated round picks your entry by weight. No code, no registration step.
A generated course: green platform causeway through water, gold direction arrows, mushrooms on the route
The stock set: platform causeway, water fill, gold direction arrows and mushroom obstacles on the route. Every piece is a catalog entry you can replace.

Moving obstacles

Path Obstacles are the generated map's gameplay layer: an exact number of them (a generator config value, default 3) land on the route itself, always with a clean landing cell on either side and never two in a row. The stock obstacle is a mushroom cluster that sprouts out of the platform, holds, and shrinks away — cross while it is down.

FieldTypeDefaultWhat it does
Periodseconds3One cycle window. Each window carries at most one sprout.
Grow Secondsseconds0.4The grow transition; the shrink takes the same time. Variance never changes the speed of the motion — only its moment.
Hold Secondsseconds1How long the obstacle stays fully grown.
Open Secondsseconds1GUARANTEED dormant gap between two sprouts, however the dice land — the crossing window that keeps high variance fair.
Variance0 – 100: a metronome. 1: the sprout moment shifts unpredictably within each cycle and roughly a third of cycles skip entirely. Fully deterministic — every machine rolls the same.

Variance is the difficulty dial: at 0 the mushroom is a rhythm you learn; turned up, when it sprouts — and whether it sprouts at all this cycle — becomes a surprise. The transition speed never changes, and Open Seconds always guarantees a crossing window, so high variance stays mean rather than unfair.

Bots run generated maps too

Every generated map emits the same typed waypoint graph a hand-authored level carries — nodes along the route, jump edges over the gaps, ordered by the carve. To a bot, a generated course and your hand-tuned one are indistinguishable, so a solo round on a fresh map still has opponents in it.

Tuning the generator

The algorithm is code; every number it runs on is config. The MapGeneratorConfig asset carries the size table (cells per side and spawn points per size), cell dimensions, the gap and height-change chances, off-path ledge density, the special-tile chance, the obstacle count, the direction-arrow interval and the lap rules — all consumer-tunable, all surviving reinstalls.

Two values are load-bearing for the completability promise, and the config warns the moment you break them: the height step must stay within the character's step-up reach, and the jump-gap distance in the movement metrics must fit inside a cell. Retune the character and the courses follow — the metrics asset is the one contract between movement and generation.