update
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user