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

2 years ago
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
2 years ago
func explore_cell(coords: Vector3i):
if discovered_cells.get(coords, 0) < 2:
discovered_cells[coords] = 2
MetSys.map_updated.emit()
2 years ago
func is_cell_discovered(coords: Vector3i) -> int:
return discovered_cells.get(coords, 0)
2 years ago
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
2 years ago
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
2 years ago
func is_object_stored(object: Object) -> bool:
var id: String = MetSys.get_object_id(object)
return id in stored_objects
2 years ago
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]
2 years ago
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
2 years ago
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()
2 years ago
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()
2 years ago
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
2 years ago
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