class_name DiveEvent extends RefCounted const DiveAlertLevel = preload("res://game/domain/dive/dive_alert_level.gd") const DiveTerminalReason = preload("res://game/domain/dive/dive_terminal_reason.gd") enum Kind { ALERT_LEVEL_CHANGED, RESOURCE_DEPLETED, HULL_DAMAGED, DIVE_TERMINATED, } var event_id: StringName var kind: Kind var tick_sequence: int var subject: StringName var amount: float var previous_level: DiveAlertLevel.Value var current_level: DiveAlertLevel.Value var terminal_reason: DiveTerminalReason.Value func _init( p_event_id: StringName, p_kind: Kind, p_tick_sequence: int, p_subject: StringName = &"", p_amount: float = 0.0, p_previous_level: DiveAlertLevel.Value = DiveAlertLevel.Value.NORMAL, p_current_level: DiveAlertLevel.Value = DiveAlertLevel.Value.NORMAL, p_terminal_reason: DiveTerminalReason.Value = DiveTerminalReason.Value.NONE ) -> void: event_id = p_event_id kind = p_kind tick_sequence = p_tick_sequence subject = p_subject amount = p_amount previous_level = p_previous_level current_level = p_current_level terminal_reason = p_terminal_reason static func alert_changed( tick_sequence: int, subject: StringName, previous_level: DiveAlertLevel.Value, current_level: DiveAlertLevel.Value ): return new( _event_id(tick_sequence, &"alert", subject), Kind.ALERT_LEVEL_CHANGED, tick_sequence, subject, 0.0, previous_level, current_level ) static func resource_depleted(tick_sequence: int, subject: StringName): return new( _event_id(tick_sequence, &"depleted", subject), Kind.RESOURCE_DEPLETED, tick_sequence, subject ) static func hull_damaged(tick_sequence: int, amount: float): return new( _event_id(tick_sequence, &"damage", &"hull"), Kind.HULL_DAMAGED, tick_sequence, &"hull", amount ) static func dive_terminated( tick_sequence: int, reason: DiveTerminalReason.Value ): return new( _event_id(tick_sequence, &"terminal", &"dive"), Kind.DIVE_TERMINATED, tick_sequence, &"dive", 0.0, DiveAlertLevel.Value.NORMAL, DiveAlertLevel.Value.NORMAL, reason ) static func _event_id( tick_sequence: int, event_name: StringName, subject_name: StringName ) -> StringName: return StringName("%d:%s:%s" % [tick_sequence, event_name, subject_name])