extends Node ## Autoload singleton managing symptom states. ## ## Intensities are floats in the range [0, 100]. Nausea is the MVP symptom but ## the API is generic so future symptoms (fatigue, taste distortion, etc.) can ## reuse it. Register this script as an autoload named `SymptomManager`. ## Emitted whenever any symptom intensity changes. ## `symptom_id` is the changed symptom, `value` its new clamped intensity. signal symptom_intensity_changed(symptom_id: StringName, value: float) ## Convenience signal specific to nausea (MVP visual effects subscribe to this). signal nausea_intensity_changed(value: float) const MIN_INTENSITY: float = 0.0 const MAX_INTENSITY: float = 100.0 ## Well-known symptom ids. const NAUSEA: StringName = &"nausea" var _intensities: Dictionary = {} ## Set a symptom's intensity to an absolute value (clamped to [0, 100]). func trigger_symptom(symptom_id: StringName, intensity: float) -> void: _set_intensity(symptom_id, intensity) ## Add (or subtract, with a negative delta) to a symptom's current intensity. func add_intensity(symptom_id: StringName, delta: float) -> void: _set_intensity(symptom_id, get_intensity(symptom_id) + delta) ## Return a symptom's current intensity, or 0.0 if never set. func get_intensity(symptom_id: StringName) -> float: return _intensities.get(symptom_id, 0.0) ## Reset all symptoms to 0 (e.g. between treatments / new game). func reset_all() -> void: for symptom_id in _intensities.keys(): _set_intensity(symptom_id, 0.0) func _set_intensity(symptom_id: StringName, value: float) -> void: var clamped := clampf(value, MIN_INTENSITY, MAX_INTENSITY) if is_equal_approx(_intensities.get(symptom_id, 0.0), clamped): return _intensities[symptom_id] = clamped symptom_intensity_changed.emit(symptom_id, clamped) if symptom_id == NAUSEA: nausea_intensity_changed.emit(clamped)