From 5cbc932187552e6639c51ee2823dc874c14fed10 Mon Sep 17 00:00:00 2001 From: sandr Date: Sun, 12 Apr 2026 18:27:32 +0200 Subject: [PATCH] Update plan: RandomStream, retry limit, collision fix, loop exec fixes Co-Authored-By: Claude Sonnet 4.6 --- Planung/plan_v1.md | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/Planung/plan_v1.md b/Planung/plan_v1.md index 53ef037..2fa7828 100644 --- a/Planung/plan_v1.md +++ b/Planung/plan_v1.md @@ -317,6 +317,7 @@ Implementierung in jedem Raum: | CurrentSocket | S_OpenSocketData | – | Temporär: aktuell verarbeiteter Socket | | OpenSocketsBuffer | Array (S_OpenSocketData) | leer | Wiederverwendbarer Puffer für Socket-Verteilung – immer clearen vor Verwendung | | RandomPickedIndex | Integer | 0 | Wiederverwendbar für zufälligen Socket-Pick | +| RandomStream | Random Stream | – | Initialisiert mit RandomSeed in GenerateDungeon – überall für Zufallszahlen verwenden | --- @@ -340,8 +341,9 @@ Implementierung in jedem Raum: ### 4.3 GenerateDungeon 1. **GenerateDungeon ▶** -2. → **Set RandomSeed** (Set Random Stream Seed oder Random Integer in Range falls Seed == 0) -3. → **Print String**: "Seed: " + RandomSeed (für Reproduzierbarkeit) +2. → **Set RandomSeed** (falls Seed == 0: vorher `Random Integer in Range` (1, 999999) → Set RandomSeed) +3. → **Make Random Stream** (RandomSeed) → **SET RandomStream** +4. → **Print String**: "Seed: " + RandomSeed (für Reproduzierbarkeit) 4. → **Lerp (Float)**: A = MinLevels, B = MaxLevels, Alpha = Difficulty → **Round to Int** → **Set TotalLevels** 5. → **Lerp (Float)**: A = MinRoomsPerLevel, B = MaxRoomsPerLevel, Alpha = Difficulty → **Round to Int** → **Set MaxRoomsOfLevel** 6. → **Set CurrentLevel** = 1 @@ -538,7 +540,7 @@ UpdateSocketState (TargetRoom, TargetSocketId, NewState) **False ▶ (kein kompatibler Raum gefunden):** 5. → **Print String** "No compatible room found for socket" (Debug) -6. → (While Loop nächste Iteration – der nächste Socket in MainPathFrontier wird versucht) +6. → Exec-Pin zurück zum **Loop-Eingang** des While-Loop-Macros (nächste Iteration) **True ▶ (Raum gefunden):** 5. → **SnapRoomToSocket** (OpenSocket: CurrentSocket, NewRoomClass: FoundRoomClass, NewSocketIndex: MatchingSocketIndex, NewSocketId: MatchingSocketId) @@ -547,7 +549,9 @@ UpdateSocketState (TargetRoom, TargetSocketId, NewState) **False ▶ (Snap fehlgeschlagen, z.B. Kollision):** 7. → **Print String** "Snap failed (collision)" (Debug) -8. → (While Loop nächste Iteration) +8. → Exec-Pin zurück zum **Loop-Eingang** des While-Loop-Macros (nächste Iteration) + +> **WICHTIG:** Beide Fehlerpfade müssen ihren Exec-Output-Pin zurück an den **Loop-Eingang** des While-Loop-Macros anschließen. Ohne diese Verbindung bricht die Schleife beim ersten Fehler ab anstatt mit dem nächsten Socket weiterzumachen. **True ▶ (Snap erfolgreich):** @@ -1051,22 +1055,29 @@ Finale Position = SocketWorldPos - RotatedOffset **Schritt 8: Kollisionsprüfung** -12. → TempRoom → **Get Overlapping Actors** (kein Class Filter) → OverlappingActors Array -13. → OverlappingActors → **Remove** (Item: TempRoom) ← **MUSS in der Exec-Kette liegen!** -14. → OverlappingActors → **Length** → **> 0** → **Branch** +> **WICHTIG:** `Get Overlapping Actors` gibt ein read-only Array zurück – du kannst nicht direkt darauf entfernen. Erst in eine lokale Variable kopieren, dann entfernen. + +**Lokale Variable anlegen:** In SnapRoomToSocket → My Blueprint → Local Variables → `OverlapBuffer` (Actor Object Ref, Array) + +12. → TempRoom → **Get Overlapping Actors** (kein Class Filter) → **SET OverlapBuffer** +13. → OverlapBuffer → **Remove** (Item: OpenSocket → Break S_OpenSocketData → OwnerRoom) ← Donor-Raum entfernen, er berührt den neuen Raum immer (false positive) +14. → OverlapBuffer → **Length** → **> 0** → **Branch** + +> **Hinweis:** TempRoom selbst ist nie in der OverlappingActors-Liste – `Get Overlapping Actors` gibt nur andere Actors zurück die mit dem Target überlappen, nicht das Target selbst. Ein Remove auf TempRoom ist daher unnötig. **True ▶ (Kollision mit anderem Raum):** -15. → **Print String** "Collision detected, destroying room" (Debug) -16. → TempRoom → **Destroy Actor** -17. → **Return** (SpawnedRoom: None, Success: **false**) +16. → **Print String** "Collision detected, destroying room" (Debug) +17. → TempRoom → **Destroy Actor** +18. → **Return** (SpawnedRoom: None, Success: **false**) **False ▶ (Keine Kollision – Erfolg):** -15. → **Return** (SpawnedRoom: TempRoom, Success: **true**) +16. → **Return** (SpawnedRoom: TempRoom, Success: **true**) **Exec-Kette (KRITISCH – alle müssen verbunden sein):** ``` SpawnActor ▶ → GetSocketWorldTransformById ▶ → SetActorLocationAndRotation ▶ -→ Get Overlapping Actors ▶ → Remove ▶ → Branch ▶ → (Destroy oder Return) +→ Get Overlapping Actors ▶ → SET OverlapBuffer ▶ → Remove (OwnerRoom) ▶ +→ Branch ▶ → (Destroy oder Return) ``` ---