update
This commit is contained in:
@@ -28,6 +28,7 @@ var _path: Array = []
|
||||
var _letzte_aktivitaet: String = ""
|
||||
var boden: Callable = Callable() # Höhe des Bodens (x, z) -> y; leer heißt eben
|
||||
var slot: int = 0
|
||||
var spur: Array = [] # letzte Positionen -- der Geist folgt ihr durch Türen
|
||||
var _bob: float = 0.0
|
||||
var _offset: Vector3
|
||||
|
||||
@@ -87,33 +88,19 @@ func setup(d: Dictionary, index: int, orte: Dictionary,
|
||||
global_position = Orte.center(places, place) + _offset + Vector3(0, Orte.hoehe(etage(place)), 0)
|
||||
|
||||
|
||||
## Punkt auf der Spur, der mindestens `abstand` hinter dem Menschen liegt.
|
||||
func spur_punkt(abstand: float) -> Vector3:
|
||||
for i in range(spur.size() - 1, -1, -1):
|
||||
if (spur[i] as Vector3).distance_to(global_position) >= abstand:
|
||||
return spur[i]
|
||||
return spur[0] if not spur.is_empty() else global_position
|
||||
|
||||
|
||||
## In welcher Etage dieser Mensch an einem Ort ist -- 0, wenn er dort nur unten ist.
|
||||
func etage(ort: String) -> int:
|
||||
return int((data.get("etage", {}) as Dictionary).get(ort, 0))
|
||||
|
||||
|
||||
## Wege führen durchs Treppenhaus: aus der Etage runter zur Tür, und am Ziel
|
||||
## von der Tür hinauf in die Etage.
|
||||
func _mit_etagen(pts: Array, von: String, nach: String, war_unterwegs: bool) -> Array:
|
||||
if pts.is_empty():
|
||||
return pts
|
||||
var e_von := etage(von)
|
||||
if e_von > 0 and not war_unterwegs:
|
||||
var runter: Array = [Orte.treppe(places, von, e_von)]
|
||||
runter.append_array(Orte.treppen_weg(places, von, e_von, 0))
|
||||
runter.append(Orte.innen_tuer(places, von))
|
||||
runter.append_array(pts)
|
||||
pts = runter
|
||||
var e_nach := etage(nach)
|
||||
if e_nach > 0:
|
||||
pts.pop_back()
|
||||
pts.append(Orte.innen_tuer(places, nach))
|
||||
pts.append(Orte.treppe(places, nach, 0))
|
||||
pts.append_array(Orte.treppen_weg(places, nach, 0, e_nach))
|
||||
pts.append(Orte.center(places, nach) + _offset + Vector3(0, Orte.hoehe(e_nach), 0))
|
||||
return pts
|
||||
|
||||
|
||||
## Kopfbedeckung nach Tagestyp des Berufs -- so unterscheiden sich die Leute
|
||||
## schon aus der Ferne.
|
||||
func _hut(kopf: Vector3, c: Color) -> void:
|
||||
@@ -180,10 +167,10 @@ func _process(roh: float) -> void:
|
||||
slot = int(soll[2])
|
||||
if soll[0] != place:
|
||||
var war_unterwegs := not _path.is_empty()
|
||||
_path = Orte.route(places, place, soll[0], _offset, netz, anker)
|
||||
_path = Orte.route_voll(places, place, soll[0], _offset,
|
||||
data.get("etage", {}), netz, anker, war_unterwegs)
|
||||
if war_unterwegs and _path.size() > 1:
|
||||
_path.remove_at(0) # steht schon draußen, alte Tür überspringen
|
||||
_path = _mit_etagen(_path, place, soll[0], war_unterwegs)
|
||||
place = soll[0]
|
||||
activity = "unterwegs"
|
||||
elif _path.is_empty() and activity != soll[1]:
|
||||
@@ -213,6 +200,10 @@ func _process(roh: float) -> void:
|
||||
_haltung(delta, not _path.is_empty())
|
||||
if boden.is_valid():
|
||||
global_position.y = float(boden.call(global_position.x, global_position.z))
|
||||
if spur.is_empty() or (spur.back() as Vector3).distance_to(global_position) > 0.4:
|
||||
spur.append(global_position)
|
||||
if spur.size() > 120:
|
||||
spur.pop_front()
|
||||
|
||||
_visual.rotation.z = lerp_angle(_visual.rotation.z, PI * 0.5 if activity == "schlaeft" else 0.0,
|
||||
1.0 - pow(0.01, delta))
|
||||
|
||||
Reference in New Issue
Block a user