95 lines
2.6 KiB
GDScript
95 lines
2.6 KiB
GDScript
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()
|