class_name VillagerInspectionResult extends RefCounted const AWAITING_REASON := "Awaiting the next decision" var npc_id: int var npc_name: String var action_id: StringName var action_name: String var task_state: StringName var target_id: StringName var target_name: String var carried_amounts: Dictionary var decision_reason: String var _has_decision_reason: bool var has_open_need := false var need_type: StringName var need_progress: String var need_response: String func _init( inspection_npc_id: int, inspection_npc_name: String, inspection_action_id: StringName, inspection_action_name: String, inspection_task_state: StringName, inspection_target_id: StringName, inspection_target_name: String, inspection_carried_amounts: Dictionary, inspection_decision_reason := "", inspection_need: Dictionary = {} ) -> void: npc_id = inspection_npc_id npc_name = inspection_npc_name action_id = inspection_action_id action_name = inspection_action_name task_state = inspection_task_state target_id = inspection_target_id target_name = inspection_target_name carried_amounts = inspection_carried_amounts.duplicate(true) _has_decision_reason = not inspection_decision_reason.strip_edges().is_empty() decision_reason = (inspection_decision_reason if _has_decision_reason else AWAITING_REASON) has_open_need = bool(inspection_need.get("has_open_need", false)) need_type = StringName(inspection_need.get("need_type", &"")) need_progress = String(inspection_need.get("progress", "")) need_response = String(inspection_need.get("response", "")) func has_decision_reason() -> bool: return _has_decision_reason func activity_text() -> String: return "%s · %s" % [action_name, _display_id(task_state)] func carrying_text() -> String: var item_ids: Array = carried_amounts.keys() item_ids.sort() var entries: Array[String] = [] for item_id in item_ids: var amount := float(carried_amounts[item_id]) if amount <= 0.0: continue var amount_text := ( "%.0f" % amount if is_equal_approx(amount, roundf(amount)) else "%.1f" % amount ) entries.append("%s %s" % [amount_text, _display_id(StringName(item_id)).to_lower()]) return "nothing" if entries.is_empty() else " · ".join(entries) func cache_key() -> String: var carried_keys: Array = carried_amounts.keys() carried_keys.sort() var carried_parts: Array[String] = [] for item_id in carried_keys: carried_parts.append("%s=%.3f" % [String(item_id), float(carried_amounts[item_id])]) return ( "|" . join( [ str(npc_id), npc_name, String(action_id), action_name, String(task_state), String(target_id), target_name, ",".join(carried_parts), decision_reason, str(has_open_need), String(need_type), need_progress, need_response, ] ) ) static func _display_id(value: StringName) -> String: return String(value).replace("_", " ").capitalize()