class_name LevelDef extends Resource ## Definition of one playable level — the arena, the bear's den, the lobby hub, and later ## a china shop to smash. The flow code never hard-codes a scene: a level is a LevelDef ## (plus its scene) built in run_state.gd and served through the lobby. @export var id: StringName = &"" @export var display_name: String = "Level" ## The shell scene loaded when the player enters a node with this level — the reusable ## frame (player, camera, HUD, PS1 filter). Shared by every level; the level's own ## geometry rides in `level_scene`, which the shell instances at runtime. @export_file("*.tscn") var scene_path: String = "" ## The level module instanced into the shell's LevelRoot: spawners, lighting, meshes, ## colliders and any level-specific subscripts. Swapped wholesale between levels so no ## previous level's geometry (or its colliders) can leak into the next. @export var level_scene: PackedScene = null ## Camera framing multiplier when this level loads — 1.0 is the shell camera's default ## shot; >1 dollies the camera back for a wider view (the lobby pulls out so the whole ## hub reads). Applied by game_shell; independent of the player's scroll-wheel zoom. @export var camera_zoom: float = 1.0 ## The enemy this level pits the bull against. Null → the usual matador wave (the ## spawner's default). Set → a single boss enemy of this scene is spawned instead (e.g. ## the bear), and the fight is won when it falls. The arena scene is shared either way; ## only the opponent changes. @export var enemy_scene: PackedScene = null