/// <summary> /// saves discovery state to object automapGeometryInteriorState /// this class is mapping the hierarchy inside the GameObject gameObjectGeometry in such way /// that the MeshRenderer enabled state for objects in the 3rd hierarchy level (which are the actual models) /// is matching value of field "discovered" in AutomapGeometryBlockState.AutomapGeometryBlockElementState.AutomapGeometryModelState /// </summary> private void saveStateAutomapInterior() { Transform interiorBlock = gameobjectGeometry.transform.GetChild(0); // building interior should only have one block - so get it automapGeometryInteriorState = new AutomapGeometryBlockState(); automapGeometryInteriorState.blockName = interiorBlock.name; List<AutomapGeometryBlockElementState> blockElements = new List<AutomapGeometryBlockElementState>(); foreach (Transform currentTransformModel in interiorBlock.transform) { AutomapGeometryBlockElementState blockElement = new AutomapGeometryBlockElementState(); List<AutomapGeometryModelState> models = new List<AutomapGeometryModelState>(); foreach (Transform currentTransformMesh in currentTransformModel.transform) { AutomapGeometryModelState model = new AutomapGeometryModelState(); MeshRenderer meshRenderer = currentTransformMesh.GetComponent<MeshRenderer>(); if ((meshRenderer) && (meshRenderer.enabled)) { model.discovered = true; model.visitedInThisRun = !meshRenderer.materials[0].IsKeywordEnabled("RENDER_IN_GRAYSCALE"); // all materials of model have the same setting - so just material[0] is tested } else { model.discovered = false; model.visitedInThisRun = false; } models.Add(model); } blockElement.models = models; blockElements.Add(blockElement); } automapGeometryInteriorState.blockElements = blockElements; }
/// <summary> /// saves discovery state to object automapGeometryDungeonState /// this class is mapping the hierarchy inside the GameObject gameObjectGeometry in such way /// that the MeshRenderer enabled state for objects in the 4th hierarchy level (which are the actual models) /// is matching value of field "discovered" in AutomapGeometryDungeonState.AutomapGeometryBlockState.AutomapGeometryBlockElementState.AutomapGeometryModelState /// dictionary of dungeon states of visited dungeons is then updated (which is used for save game mechanism) /// </summary> private void saveStateAutomapDungeon(bool forceSaveOfDungeonDiscoveryState) { if ((numberOfDungeonMemorized == 0)&&(!GameManager.Instance.IsPlayerInside)) // if discovery state of no dungeon has to be remembered, clear dictionary and skip the rest of this function { dictAutomapDungeonsDiscoveryState.Clear(); return; } if ((!GameManager.Instance.IsPlayerInside)&&(!forceSaveOfDungeonDiscoveryState)) // if player is outside just skip this function { return; } int updatedNumberOfDungeonMemorized = numberOfDungeonMemorized; if ((numberOfDungeonMemorized == 0) && (GameManager.Instance.IsPlayerInside)) { updatedNumberOfDungeonMemorized = 1; } Transform gameObjectGeometryDungeon = gameobjectGeometry.transform.GetChild(0); automapGeometryDungeonState = new AutomapGeometryDungeonState(); automapGeometryDungeonState.locationName = gameObjectGeometryDungeon.name; automapGeometryDungeonState.entranceDiscovered = ((gameobjectBeaconEntrancePosition) && (gameobjectBeaconEntrancePosition.activeSelf)); // get entrance marker discovery state automapGeometryDungeonState.timeInSecondsLastVisited = DaggerfallUnity.Instance.WorldTime.DaggerfallDateTime.ToSeconds(); automapGeometryDungeonState.blocks = new List<AutomapGeometryBlockState>(); foreach (Transform currentBlock in gameObjectGeometryDungeon.transform) { AutomapGeometryBlockState automapGeometryBlockState = new AutomapGeometryBlockState(); automapGeometryBlockState.blockName = currentBlock.name; List<AutomapGeometryBlockElementState> blockElements = new List<AutomapGeometryBlockElementState>(); foreach (Transform currentTransformModel in currentBlock.transform) { AutomapGeometryBlockElementState blockElement = new AutomapGeometryBlockElementState(); List<AutomapGeometryModelState> models = new List<AutomapGeometryModelState>(); foreach (Transform currentTransformMesh in currentTransformModel.transform) { AutomapGeometryModelState model = new AutomapGeometryModelState(); MeshRenderer meshRenderer = currentTransformMesh.GetComponent<MeshRenderer>(); if ((meshRenderer) && (meshRenderer.enabled)) { model.discovered = true; model.visitedInThisRun = !meshRenderer.materials[0].IsKeywordEnabled("RENDER_IN_GRAYSCALE"); // all materials of model have the same setting - so just material[0] is tested } else { model.discovered = false; model.visitedInThisRun = false; } models.Add(model); } blockElement.models = models; blockElements.Add(blockElement); } automapGeometryBlockState.blockElements = blockElements; automapGeometryDungeonState.blocks.Add(automapGeometryBlockState); } // replace or add discovery state for current dungeon DFLocation dfLocation = GameManager.Instance.PlayerGPS.CurrentLocation; string locationStringIdentifier = string.Format("{0}/{1}", dfLocation.RegionName, dfLocation.Name); if (dictAutomapDungeonsDiscoveryState.ContainsKey(locationStringIdentifier)) { dictAutomapDungeonsDiscoveryState[locationStringIdentifier] = automapGeometryDungeonState; } else { dictAutomapDungeonsDiscoveryState.Add(locationStringIdentifier, automapGeometryDungeonState); } // make list out of dictionary and sort by last time visited - then get rid of dungeons in dictionary that weren't visited lately List<KeyValuePair<string, AutomapGeometryDungeonState>> sortedList = new List<KeyValuePair<string, AutomapGeometryDungeonState>>(dictAutomapDungeonsDiscoveryState); sortedList.Sort( delegate (KeyValuePair<string, AutomapGeometryDungeonState> firstPair, KeyValuePair<string, AutomapGeometryDungeonState> nextPair) { return nextPair.Value.timeInSecondsLastVisited.CompareTo(firstPair.Value.timeInSecondsLastVisited); } ); //if there are more dungeons remembered than allowed - get rid of dungeons in dictionary that weren't visited lately if (sortedList.Count > updatedNumberOfDungeonMemorized) { ulong timeInSecondsLimit = sortedList[updatedNumberOfDungeonMemorized - 1].Value.timeInSecondsLastVisited; foreach (KeyValuePair<string, AutomapGeometryDungeonState> entry in sortedList) // use sorted list and iterate over it - remove elements of dictionary { if (entry.Value.timeInSecondsLastVisited < timeInSecondsLimit) { dictAutomapDungeonsDiscoveryState.Remove(entry.Key); // remove this dungeon's entry from dictionary } } } }