Skip to content

Commit

Permalink
Add "refresh_buildingnames" console command
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Interkarma committed Apr 23, 2023
1 parent 01cfffb commit a003609
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 0 deletions.
14 changes: 14 additions & 0 deletions Assets/Game/Addons/UnityConsole/Console/Scripts/DefaultCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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";
Expand Down
71 changes: 71 additions & 0 deletions Assets/Scripts/Internal/PlayerGPS.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,15 @@ public enum NearbyObjectFlags
Animal = 64,
}

/// <summary>
/// Data used when performing building name refresh.
/// </summary>
struct BuildingRenameOperation
{
public int buildingKey;
public string displayName;
};

#endregion

#region Properties
Expand Down Expand Up @@ -1119,6 +1128,68 @@ public void SetLastLockpickAttempt(int buildingKey, int skillValue)
UpdateDiscoveredBuilding(discoveredBuilding);
}

/// <summary>
/// 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.
/// </summary>
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<BuildingRenameOperation> ops = new List<BuildingRenameOperation>();
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);
}
}

/// <summary>
/// Updates discovered building data in current location.
/// </summary>
Expand Down

0 comments on commit a003609

Please sign in to comment.