Update plan: RandomStream, retry limit, collision fix, loop exec fixes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sandr 2026-04-12 18:27:32 +02:00
parent 1e723748b4
commit 5cbc932187

View file

@ -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)
```
---