feat(levels): level catalogue with stable ids (slice 7)

LevelResource gains a stable Id and swaps the string ScenePath for an
editor-tracked PackedScene. The old path field was never read and had
rotted - forest_1 pointed at level_forest_5.tscn, which doesn't exist,
and borrowed LEVEL_5_NAME so it would have displayed "VILLAGE - 5".

LevelCatalogue lists levels in campaign order and produces the domain's
Campaign; an authoring mistake fails at boot because Campaign.Of rejects
blank and duplicate ids. Not a domain port - nothing in the domain
resolves a level to a scene.

All 8 scenes now have a resource; campaign keeps the existing 6
(tutorial_1, village_1..5). village_6 and forest_1 are catalogued but
deliberately out of the campaign.

GameManager.LevelScenes stays until slice 10 rewrites GameManager.
This commit is contained in:
2026-07-28 19:28:56 +02:00
parent 330e10880c
commit f991bb99fc
14 changed files with 155 additions and 32 deletions

View File

@@ -1,10 +1,11 @@
[gd_resource type="Resource" script_class="LevelResource" load_steps=2 format=3 uid="uid://cqtalsov2bkpo"]
[gd_resource type="Resource" script_class="LevelResource" load_steps=3 format=3 uid="uid://cqtalsov2bkpo"]
[ext_resource type="Script" uid="uid://c2h0pqhxiqswe" path="res://scripts/Resources/LevelResource.cs" id="1_72j7f"]
[ext_resource type="Script" uid="uid://c2h0pqhxiqswe" path="res://scripts/Resources/LevelResource.cs" id="1_script"]
[ext_resource type="PackedScene" uid="uid://bol7g83v2accs" path="res://scenes/level_village_1.tscn" id="2_scene"]
[resource]
resource_local_to_scene = true
script = ExtResource("1_72j7f")
script = ExtResource("1_script")
Id = "village_1"
LevelName = "LEVEL_1_NAME"
ScenePath = "res://scenes/level_village_1.tscn"
Scene = ExtResource("2_scene")
metadata/_custom_type_script = "uid://cp68km8bykymb"

View File

@@ -1,9 +1,11 @@
[gd_resource type="Resource" script_class="LevelResource" load_steps=2 format=3 uid="uid://dlwkbjw1l33uq"]
[gd_resource type="Resource" script_class="LevelResource" load_steps=3 format=3 uid="uid://dlwkbjw1l33uq"]
[ext_resource type="Script" uid="uid://c2h0pqhxiqswe" path="res://scripts/Resources/LevelResource.cs" id="1_msres"]
[ext_resource type="Script" uid="uid://c2h0pqhxiqswe" path="res://scripts/Resources/LevelResource.cs" id="1_script"]
[ext_resource type="PackedScene" uid="uid://chqb11pfoqmeb" path="res://scenes/level_village_2.tscn" id="2_scene"]
[resource]
script = ExtResource("1_msres")
script = ExtResource("1_script")
Id = "village_2"
LevelName = "LEVEL_2_NAME"
ScenePath = "res://scenes/level_village_2.tscn"
Scene = ExtResource("2_scene")
metadata/_custom_type_script = "uid://cp68km8bykymb"

View File

@@ -1,9 +1,11 @@
[gd_resource type="Resource" script_class="LevelResource" load_steps=2 format=3 uid="uid://b63u5qfp8p7pv"]
[gd_resource type="Resource" script_class="LevelResource" load_steps=3 format=3 uid="uid://b63u5qfp8p7pv"]
[ext_resource type="Script" uid="uid://c2h0pqhxiqswe" path="res://scripts/Resources/LevelResource.cs" id="1_6vcr8"]
[ext_resource type="Script" uid="uid://c2h0pqhxiqswe" path="res://scripts/Resources/LevelResource.cs" id="1_script"]
[ext_resource type="PackedScene" uid="uid://h60obxmju6mo" path="res://scenes/level_village_3.tscn" id="2_scene"]
[resource]
script = ExtResource("1_6vcr8")
script = ExtResource("1_script")
Id = "village_3"
LevelName = "LEVEL_3_NAME"
ScenePath = "res://scenes/level_village_3.tscn"
Scene = ExtResource("2_scene")
metadata/_custom_type_script = "uid://cp68km8bykymb"

View File

@@ -1,9 +1,11 @@
[gd_resource type="Resource" script_class="LevelResource" load_steps=2 format=3 uid="uid://cxfei28yu3buh"]
[gd_resource type="Resource" script_class="LevelResource" load_steps=3 format=3 uid="uid://cxfei28yu3buh"]
[ext_resource type="Script" uid="uid://c2h0pqhxiqswe" path="res://scripts/Resources/LevelResource.cs" id="1_h4twv"]
[ext_resource type="Script" uid="uid://c2h0pqhxiqswe" path="res://scripts/Resources/LevelResource.cs" id="1_script"]
[ext_resource type="PackedScene" uid="uid://bhad760x3vvco" path="res://scenes/level_village_4.tscn" id="2_scene"]
[resource]
script = ExtResource("1_h4twv")
script = ExtResource("1_script")
Id = "village_4"
LevelName = "LEVEL_4_NAME"
ScenePath = "res://scenes/level_village_4.tscn"
Scene = ExtResource("2_scene")
metadata/_custom_type_script = "uid://cp68km8bykymb"

View File

@@ -1,8 +1,11 @@
[gd_resource type="Resource" script_class="LevelResource" load_steps=2 format=3 uid="uid://qld841xv5ui0"]
[gd_resource type="Resource" script_class="LevelResource" load_steps=3 format=3 uid="uid://qld841xv5ui0"]
[ext_resource type="Script" uid="uid://c2h0pqhxiqswe" path="res://scripts/Resources/LevelResource.cs" id="1_chped"]
[ext_resource type="Script" uid="uid://c2h0pqhxiqswe" path="res://scripts/Resources/LevelResource.cs" id="1_script"]
[ext_resource type="PackedScene" uid="uid://bbwef3n2gjkt8" path="res://scenes/level_village_5.tscn" id="2_scene"]
[resource]
script = ExtResource("1_chped")
script = ExtResource("1_script")
Id = "village_5"
LevelName = "LEVEL_5_NAME"
ScenePath = "res://scenes/level_village_5.tscn"
Scene = ExtResource("2_scene")
metadata/_custom_type_script = "uid://cp68km8bykymb"

View File

@@ -0,0 +1,11 @@
[gd_resource type="Resource" script_class="LevelResource" load_steps=3 format=3]
[ext_resource type="Script" uid="uid://c2h0pqhxiqswe" path="res://scripts/Resources/LevelResource.cs" id="1_script"]
[ext_resource type="PackedScene" uid="uid://dqekccjkwev4y" path="res://scenes/level_village_6.tscn" id="2_scene"]
[resource]
script = ExtResource("1_script")
Id = "village_6"
LevelName = "LEVEL_6_NAME"
Scene = ExtResource("2_scene")
metadata/_custom_type_script = "uid://cp68km8bykymb"