#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.
#The recommended-level sign is the live source of truth
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.