You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.2 KiB
GDScript
96 lines
3.2 KiB
GDScript
extends RefCounted
|
|
|
|
const SIMPLE_STORABLE_PROPERTIES: Array[StringName] = [&"discovered_cells", &"registered_objects", &"stored_objects", &"custom_markers"]
|
|
|
|
var discovered_cells: Dictionary#[Vector3i, int]
|
|
var registered_objects: Dictionary#[String, bool]
|
|
var stored_objects: Dictionary#[String, bool]
|
|
|
|
var custom_markers: Dictionary#[Vector3i, int]
|
|
var cell_overrides: Dictionary#[CellData, CellOverride]
|
|
|
|
func discover_cell(coords: Vector3i):
|
|
if discovered_cells.get(coords, 0) < 1:
|
|
discovered_cells[coords] = 1
|
|
|
|
func explore_cell(coords: Vector3i):
|
|
if discovered_cells.get(coords, 0) < 2:
|
|
discovered_cells[coords] = 2
|
|
MetSys.map_updated.emit()
|
|
|
|
func is_cell_discovered(coords: Vector3i) -> int:
|
|
return discovered_cells.get(coords, 0)
|
|
|
|
func register_storable_object(object: Object) -> bool:
|
|
var id: String = MetSys.get_object_id(object)
|
|
if not id in registered_objects:
|
|
registered_objects[id] = true
|
|
return true
|
|
return false
|
|
|
|
func store_object(object: Object):
|
|
var id: String = MetSys.get_object_id(object)
|
|
assert(id in registered_objects)
|
|
assert(not id in stored_objects)
|
|
registered_objects.erase(id)
|
|
stored_objects[id] = true
|
|
|
|
func is_object_stored(object: Object) -> bool:
|
|
var id: String = MetSys.get_object_id(object)
|
|
return id in stored_objects
|
|
|
|
func add_cell_override(room: MetroidvaniaSystem.MapData.CellData) -> MetroidvaniaSystem.MapData.CellOverride:
|
|
if not room in cell_overrides:
|
|
cell_overrides[room] = MetroidvaniaSystem.MapData.CellOverride.new(room)
|
|
return cell_overrides[room]
|
|
|
|
func remove_cell_override(room: MetroidvaniaSystem.MapData.CellData) -> bool:
|
|
var override := cell_overrides.get(room)
|
|
if override:
|
|
if override.custom_cell_coords != Vector3i.MAX:
|
|
push_error("Can't delete override of a custom cell. Use destroy() instead.")
|
|
return false
|
|
override._cleanup_assigned_scene()
|
|
|
|
cell_overrides.erase(room)
|
|
return override != null
|
|
|
|
func add_custom_marker(coords: Vector3i, symbol: int):
|
|
if not coords in custom_markers:
|
|
custom_markers[coords] = 0
|
|
|
|
custom_markers[coords] |= 1 << symbol
|
|
MetSys.map_updated.emit()
|
|
|
|
func remove_custom_marker(coords: Vector3i, symbol: int):
|
|
if not coords in custom_markers:
|
|
return
|
|
|
|
custom_markers[coords] &= ~(1 << symbol)
|
|
if custom_markers[coords] == 0:
|
|
custom_markers.erase(coords)
|
|
MetSys.map_updated.emit()
|
|
|
|
func get_data() -> Dictionary:
|
|
var data: Dictionary
|
|
|
|
for property in SIMPLE_STORABLE_PROPERTIES:
|
|
data[property] = get(property)
|
|
|
|
data[&"cell_overrides"] = cell_overrides.keys().map(func(room):
|
|
var coords: Vector3i = MetSys.map_data.cells.find_key(room)
|
|
return cell_overrides[room]._get_override_string(coords))
|
|
|
|
return data
|
|
|
|
func set_data(data: Dictionary):
|
|
if data.is_empty():
|
|
return
|
|
|
|
for property in SIMPLE_STORABLE_PROPERTIES:
|
|
set(property, data[property])
|
|
|
|
for override_string in data.cell_overrides:
|
|
var override: MetroidvaniaSystem.MapData.CellOverride = MetroidvaniaSystem.MapData.CellOverride.load_from_line(override_string)
|
|
cell_overrides[override.original_room] = override
|