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 opportunity_note: VillagerOpportunityNote 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_opportunity_note: VillagerOpportunityNote = null ) -> 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) opportunity_note = inspection_opportunity_note 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])]) var note_part := opportunity_note.cache_key() if opportunity_note != null else "-" 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, note_part, ] ) ) static func _display_id(value: StringName) -> String: return String(value).replace("_", " ").capitalize()