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.0 KiB
		
	
	
	
		
			GDScript
		
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			3.0 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 | ||
|  | 
 | ||
|  | 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 |