diff --git a/Assets/Game/Addons/UnityConsole/Console/Scripts/DefaultCommands.cs b/Assets/Game/Addons/UnityConsole/Console/Scripts/DefaultCommands.cs index ed6eddb868..3d142da9d5 100644 --- a/Assets/Game/Addons/UnityConsole/Console/Scripts/DefaultCommands.cs +++ b/Assets/Game/Addons/UnityConsole/Console/Scripts/DefaultCommands.cs @@ -113,6 +113,7 @@ void Start() ConsoleCommandsDatabase.RegisterCommand(ClearCrimeCommitted.name, ClearCrimeCommitted.description, ClearCrimeCommitted.usage, ClearCrimeCommitted.Execute); ConsoleCommandsDatabase.RegisterCommand(PrintLegalRep.name, PrintLegalRep.description, PrintLegalRep.usage, PrintLegalRep.Execute); ConsoleCommandsDatabase.RegisterCommand(ClearNegativeLegalRep.name, ClearNegativeLegalRep.description, ClearNegativeLegalRep.usage, ClearNegativeLegalRep.Execute); + ConsoleCommandsDatabase.RegisterCommand(RefreshBuildingNames.name, RefreshBuildingNames.description, RefreshBuildingNames.usage, RefreshBuildingNames.Execute); ConsoleCommandsDatabase.RegisterCommand(PrintQuests.name, PrintQuests.description, PrintQuests.usage, PrintQuests.Execute); @@ -2618,6 +2619,19 @@ public static string Execute(params string[] args) } } + private static class RefreshBuildingNames + { + public static readonly string name = "refresh_buildingnames"; + public static readonly string description = "Refresh discovered building names in current location. Used for testing localization and debugging stale discovery data."; + public static readonly string usage = "refresh_buildingnames"; + + public static string Execute(params string[] args) + { + GameManager.Instance.PlayerGPS.RefreshBuildingNamesInCurrentLocation(); + return "Finished"; + } + } + private static class PrintQuests { public static readonly string name = "print_quests"; diff --git a/Assets/Scripts/Internal/PlayerGPS.cs b/Assets/Scripts/Internal/PlayerGPS.cs index 6913b88e04..31bbbf28f8 100644 --- a/Assets/Scripts/Internal/PlayerGPS.cs +++ b/Assets/Scripts/Internal/PlayerGPS.cs @@ -121,6 +121,15 @@ public enum NearbyObjectFlags Animal = 64, } + /// + /// Data used when performing building name refresh. + /// + struct BuildingRenameOperation + { + public int buildingKey; + public string displayName; + }; + #endregion #region Properties @@ -1119,6 +1128,68 @@ public void SetLastLockpickAttempt(int buildingKey, int skillValue) UpdateDiscoveredBuilding(discoveredBuilding); } + /// + /// Refresh any changed non-residence building names in current location. + /// Allows localized or otherwise changed building names to replace previously discovered building names. + /// Will change names on buildings with a random NPC name. + /// Does not affect player custom names or other properties of discovery data other than display name. + /// + public void RefreshBuildingNamesInCurrentLocation() + { + // Must have a location loaded + if (!CurrentLocation.Loaded) + return; + + // Get building directory for location + BuildingDirectory buildingDirectory = GameManager.Instance.StreamingWorld.GetCurrentBuildingDirectory(); + if (!buildingDirectory) + return; + + // Get discovered location + int mapPixelID = MapsFile.GetMapPixelIDFromLongitudeLatitude((int)CurrentLocation.MapTableData.Longitude, CurrentLocation.MapTableData.Latitude); + DiscoveredLocation dl = discoveredLocations[mapPixelID]; + if (dl.discoveredBuildings == null || dl.discoveredBuildings.Count == 0) + return; + + // Enumerate changed building names + List ops = new List(); + foreach (DiscoveredBuilding db in dl.discoveredBuildings.Values) + { + // Get detailed building data from directory + BuildingSummary buildingSummary; + if (!buildingDirectory.GetBuildingSummary(db.buildingKey, out buildingSummary)) + continue; + + // Ignore residences + if (RMBLayout.IsResidence(buildingSummary.BuildingType)) + continue; + + // Expand building name + string displayName = BuildingNames.GetName( + buildingSummary.NameSeed, + buildingSummary.BuildingType, + buildingSummary.FactionId, + buildingDirectory.LocationData.Name, + TextManager.Instance.GetLocalizedRegionName(buildingDirectory.LocationData.RegionIndex)); + + // Schedule name change + if (!string.Equals(displayName, db.displayName)) + ops.Add(new BuildingRenameOperation() { buildingKey = buildingSummary.buildingKey, displayName = displayName }); + } + + // Update building names + foreach (BuildingRenameOperation op in ops) + { + DiscoveredBuilding discoveredBuilding; + if (!GetDiscoveredBuilding(op.buildingKey, out discoveredBuilding)) + return; + + Debug.LogFormat("Renaming '{0}' to '{1}'", discoveredBuilding.displayName, op.displayName); + discoveredBuilding.displayName = op.displayName; + UpdateDiscoveredBuilding(discoveredBuilding); + } + } + /// /// Updates discovered building data in current location. ///