|  |  |  | 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 |