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
							 |