Files
TheTree_mock/scripts/construction/placement_report.gd

117 lines
3.6 KiB
GDScript

class_name PlacementReport
extends RefCounted
const ERROR_INVALID_DEFINITION := &"INVALID_DEFINITION"
const ERROR_MISSING_DEPENDENCY := &"MISSING_DEPENDENCY"
const ERROR_OUT_OF_BOUNDS := &"OUT_OF_BOUNDS"
const ERROR_ZONE_MISMATCH := &"ZONE_MISMATCH"
const ERROR_LAYER_MISMATCH := &"LAYER_MISMATCH"
const ERROR_OVERLAP := &"OVERLAP"
const ERROR_NOT_EXCAVATED := &"NOT_EXCAVATED"
const ERROR_UNSUPPORTED := &"UNSUPPORTED"
const ERROR_INSUFFICIENT_RESOURCES := &"INSUFFICIENT_RESOURCES"
var can_build := false
var error_codes: Array[StringName] = []
var reasons: Array[Dictionary] = []
var cells: Array[Vector3i] = []
var out_of_bounds_cells: Array[Vector3i] = []
var zone_mismatch_cells: Array[Vector3i] = []
var layer_mismatch_cells: Array[Vector3i] = []
var occupied_cells: Array[Vector3i] = []
var unexcavated_cells: Array[Vector3i] = []
var unsupported_cells: Array[Vector3i] = []
var access_points: Array[Vector3i] = []
var mana_connection := false
var total_cost: Dictionary = {}
var missing_resources: Dictionary = {}
var build_time := 0
var predicted_environment_delta: Dictionary = {}
var predicted_operating_cost: Dictionary = {}
var predicted_heat := 0
func add_error(
code: StringName,
reason: String,
affected_cells: Array = [],
details: Dictionary = {}
) -> void:
if not error_codes.has(code):
error_codes.append(code)
var normalized_cells: Array[Vector3i] = []
for cell: Variant in affected_cells:
if cell is Vector3i:
normalized_cells.append(cell)
reasons.append({
&"code": code,
&"message": reason,
&"cells": normalized_cells,
&"details": details.duplicate(true),
})
can_build = false
func finalize() -> PlacementReport:
can_build = error_codes.is_empty()
return self
func has_error(code: StringName) -> bool:
return error_codes.has(code)
func reason_for(code: StringName) -> Dictionary:
for reason: Dictionary in reasons:
if StringName(reason.get(&"code", &"")) == code:
return reason.duplicate(true)
return {}
func to_dictionary() -> Dictionary:
var serialized_reasons: Array[Dictionary] = []
for reason: Dictionary in reasons:
var serialized := reason.duplicate(true)
serialized[&"code"] = String(reason.get(&"code", &""))
serialized[&"cells"] = _serialize_cells(reason.get(&"cells", []))
serialized_reasons.append(serialized)
return {
&"can_build": can_build,
&"error_codes": _string_names_to_strings(error_codes),
&"reasons": serialized_reasons,
&"cells": _serialize_cells(cells),
&"out_of_bounds_cells": _serialize_cells(out_of_bounds_cells),
&"zone_mismatch_cells": _serialize_cells(zone_mismatch_cells),
&"layer_mismatch_cells": _serialize_cells(layer_mismatch_cells),
&"occupied_cells": _serialize_cells(occupied_cells),
&"unexcavated_cells": _serialize_cells(unexcavated_cells),
&"unsupported_cells": _serialize_cells(unsupported_cells),
&"access_points": _serialize_cells(access_points),
&"mana_connection": mana_connection,
&"total_cost": total_cost.duplicate(true),
&"missing_resources": missing_resources.duplicate(true),
&"build_time": build_time,
&"predicted_environment_delta": predicted_environment_delta.duplicate(true),
&"predicted_operating_cost": predicted_operating_cost.duplicate(true),
&"predicted_heat": predicted_heat,
}
static func _serialize_cells(source: Variant) -> Array[Array]:
var serialized: Array[Array] = []
if not source is Array:
return serialized
for cell: Variant in source:
if cell is Vector3i:
serialized.append([cell.x, cell.y, cell.z])
return serialized
static func _string_names_to_strings(source: Array[StringName]) -> Array[String]:
var serialized: Array[String] = []
for value: StringName in source:
serialized.append(String(value))
return serialized