Speed ASMR Keyboard EscapeDocumentation ← Portfolio

#Boss & Hazard System Internals

#Bosses (BossService + Config.Boss.Models)

A boss is a Config entry, not a code change — BossService reads Config.Boss.Models, finds the named model (checked in Workspace, the map's BOSS - Models folder, then ServerStorage, in that order), and builds a chase-and-patrol boss between two named Gates (ArenaStartGate / ArenaEndGate). See Adding a Boss for the worked example.

Every Gate<N> under Workspace["New Map"].Gates carries a child StageLabelLeft.RecommendedLevel TextLabel reading "Recommended level: N" — painted on by NewMapService. Any script that wants a stage's actual current recommended level should read that label rather than hardcoding a number in Config, because the label is what a player actually sees and stays correct if the level curve is retuned later.

BossService.readRecommendedLevel(gates, gateName) does exactly this; a Config.Boss.Models entry opts in with MatchRecommendedLevel = true, which makes that boss's chase speed track its arena's start gate automatically instead of using the shared default Speed. See Tuning Difficulty for the exact formula.

#Hazard scripts are not services

The Stage 10 closing-wall trap (Workspace["New Map"].Stage10WallCrusher) and the Stage 7 vanishing bridge (Workspace["New Map"].Stage7Bridge.VanishingBridge) are plain Workspace Scripts, not services (see Service Convention) — they're self-contained, single-purpose, and don't need Bootstrap's Init/Start lifecycle. The wall crusher reads its gate's recommended-level label the same way BossService does, for the same reason. See Adding a Hazard if you want to build another one.