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:
parent
1e723748b4
commit
5cbc932187
1 changed files with 23 additions and 12 deletions
|
|
@ -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)
|
||||
```
|
||||
|
||||
---
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue