From a00360928a224daf63faaa6a1afd94ee8d31e026 Mon Sep 17 00:00:00 2001 From: Interkarma Date: Sun, 23 Apr 2023 13:02:09 +1000 Subject: [PATCH] Add "refresh_buildingnames" console command Useful for testing localization changes or debugging stale discovery data without deleting whole DiscoveryData.txt file in save. Only operates on discovered buildings in current location. Does nothing if player not in a location or no buildings discovered. --- .../Console/Scripts/DefaultCommands.cs | 14 ++++ Assets/Scripts/Internal/PlayerGPS.cs | 71 +++++++++++++++++++ 2 files changed, 85 insertions(+) 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. ///