This commit is contained in:
Team3
2026-09-16 13:08:59 +02:00
parent 89fad5dc7a
commit e813b5f7aa
17 changed files with 483 additions and 247 deletions

View File

@@ -305,6 +305,7 @@ static func _kreuzung(a: Vector3, b: Vector3, c: Vector3, d: Vector3) -> float:
## volle Breite, die Ost- und Westreihe nur dazwischen -- sonst überlappen die
## Ecken.
static func _block(mitte: Vector3, groesse: Vector2, rng: RandomNumberGenerator) -> void:
var erste := PARZELLEN.size()
var tiefe := minf(RAND_TIEFE, minf(groesse.x, groesse.y) * 0.34)
var seiten := [
["back", Vector3(0, 0, 1), groesse.x, groesse.y],
@@ -346,6 +347,7 @@ static func _block(mitte: Vector3, groesse: Vector2, rng: RandomNumberGenerator)
var ende := mitte + richtung * ((innen.y if laengs else innen.x) * 0.5 - 2.0)
_strasse(start, ende, ROJI)
var flanke := Vector3(1, 0, 0) if laengs else Vector3(0, 0, 1)
_gasse_freischneiden(erste, start, ende, flanke)
var p_breite := (innen.x if laengs else innen.y) * 0.5 - ROJI * 0.5 - 0.8
if p_breite < PARZELLE_MIN * 0.8:
return
@@ -366,6 +368,46 @@ static func _block(mitte: Vector3, groesse: Vector2, rng: RandomNumberGenerator)
})
## Die Gasse läuft durch die Randreihe in den Block. Eine Parzelle, die auf
## ihr steht, wird in zwei Hälften links und rechts der Gasse geteilt --
## sonst stünde ein Haus quer über der Einfahrt.
static func _gasse_freischneiden(ab: int, start: Vector3, ende: Vector3, flanke: Vector3) -> void:
var quer_ist := absf(flanke.x) > 0.0 # Gasse läuft in z, Flanke ist x
var breite := ROJI * 0.5 + 0.8
var g_mitte: float = start.x if quer_ist else start.z
var g_von: float = minf(start.z, ende.z) if quer_ist else minf(start.x, ende.x)
var g_bis: float = maxf(start.z, ende.z) if quer_ist else maxf(start.x, ende.x)
var neu: Array = []
var weg: Array = []
for i in range(ab, PARZELLEN.size()):
var p: Dictionary = PARZELLEN[i]
var pos: Vector3 = p["pos"]
var s: Vector2 = p["size"]
var pf: float = pos.x if quer_ist else pos.z # Lage entlang der Flanke
var pl: float = pos.z if quer_ist else pos.x # Lage entlang der Gasse
var hf: float = (s.x if quer_ist else s.y) * 0.5
var hl: float = (s.y if quer_ist else s.x) * 0.5
if pl + hl < g_von or pl - hl > g_bis:
continue
if pf + hf < g_mitte - breite or pf - hf > g_mitte + breite:
continue
weg.append(i)
for teil in [[pf - hf, g_mitte - breite], [g_mitte + breite, pf + hf]]:
var w: float = float(teil[1]) - float(teil[0])
if w < 3.0:
continue
var m: float = (float(teil[0]) + float(teil[1])) * 0.5
neu.append({
"pos": Vector3(m, 0, pl) if quer_ist else Vector3(pl, 0, m),
"size": Vector2(w, s.y) if quer_ist else Vector2(s.x, w),
"dir": p["dir"],
})
weg.reverse()
for i in weg:
PARZELLEN.remove_at(i)
PARZELLEN.append_array(neu)
# ------------------------------------------------------------ Belegung
static func _park_eintragen() -> void:
@@ -419,10 +461,13 @@ static func _sonderbauten_verteilen() -> void:
## Die Wohnhäuser: gleichmäßig über den Bezirk verteilt, damit die Wege
## nicht alle in derselben Ecke enden.
const WOHNUNG_MIN := 7.0 # schmaler passt kein Treppenhaus mehr neben die Tür
static func _wohnhaeuser_verteilen() -> void:
var frei: Array = []
for i in range(PARZELLEN.size()):
if not PARZELLEN[i].has("belegt"):
var g: Vector2 = PARZELLEN[i]["size"]
if not PARZELLEN[i].has("belegt") and minf(g.x, g.y) >= WOHNUNG_MIN:
frei.append(i)
if frei.is_empty():
return