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